diff --git a/crypto/heimdal/FREEBSD-Xlist b/crypto/heimdal/FREEBSD-Xlist deleted file mode 100644 --- a/crypto/heimdal/FREEBSD-Xlist +++ /dev/null @@ -1,17 +0,0 @@ -# $FreeBSD$ -TODO* -*.info* -*.cat[0-9] -appl/dceutils -appl/kx -appl/otp -appl/popper -appl/xnlock -doc/standardisation -lib/des -lib/editline -lib/kdfs -lib/otp -lib/gssapi/mech -lib/hcrypto -ylwrap diff --git a/crypto/heimdal/LICENSE b/crypto/heimdal/LICENSE --- a/crypto/heimdal/LICENSE +++ b/crypto/heimdal/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 1995 - 2011 Kungliga Tekniska Högskolan +Copyright (c) 1995 - 2014 Kungliga Tekniska Högskolan (Royal Institute of Technology, Stockholm, Sweden). All rights reserved. diff --git a/crypto/heimdal/Makefile.am b/crypto/heimdal/Makefile.am --- a/crypto/heimdal/Makefile.am +++ b/crypto/heimdal/Makefile.am @@ -6,7 +6,7 @@ kcm_dir = kcm endif -SUBDIRS= include base lib kuser kdc admin kadmin kpasswd +SUBDIRS= include lib kuser kdc admin kadmin kpasswd SUBDIRS+= $(kcm_dir) appl tools tests packages etc po if HEIMDAL_DOCUMENTATION @@ -38,6 +38,7 @@ autogen.sh \ krb5.conf \ cf/make-proto.pl \ + cf/roken-h-process.pl \ cf/install-catman.sh \ cf/ChangeLog \ cf/c-function.m4 \ @@ -52,6 +53,13 @@ cf/krb-version.m4 \ cf/roken.m4 \ cf/valgrind-suppressions \ + cf/maybe-valgrind.sh \ + cf/symbol-version.py \ + cf/w32-check-exported-symbols.pl \ + cf/w32-def-from-dll.pl \ + cf/w32-detect-vc-version.pl \ + cf/w32-hh-toc-from-info.pl \ + cf/w32-list-externs-from-objs.pl \ cf/vararray.m4 print-distdir: diff --git a/crypto/heimdal/Makefile.in b/crypto/heimdal/Makefile.in --- a/crypto/heimdal/Makefile.in +++ b/crypto/heimdal/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,17 +93,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/configure \ - ChangeLog NEWS TODO compile config.guess config.sub depcomp \ - install-sh ltmain.sh missing ylwrap @HEIMDAL_DOCUMENTATION_TRUE@am__append_1 = doc subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -60,8 +108,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -74,6 +121,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -93,37 +141,82 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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 +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-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 dist dist-all distcheck -ETAGS = etags -CTAGS = ctags -DIST_SUBDIRS = include base lib kuser kdc admin kadmin kpasswd kcm \ - appl tools tests packages etc po doc +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir distdir-am dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = include lib kuser kdc admin kadmin kpasswd kcm appl \ + tools tests packages etc po doc +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common ChangeLog NEWS README TODO \ + compile config.guess config.sub install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ - { test ! -d "$(distdir)" \ - || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr "$(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,'; \ @@ -151,12 +244,19 @@ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best +DIST_TARGETS = dist-gzip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi 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@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -171,16 +271,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -190,17 +293,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -219,12 +324,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -233,6 +335,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -249,10 +352,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -260,6 +361,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -274,12 +376,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -296,10 +401,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -310,13 +421,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -340,6 +445,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -363,9 +470,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -375,32 +487,40 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; @KCM_TRUE@kcm_dir = kcm -SUBDIRS = include base lib kuser kdc admin kadmin kpasswd $(kcm_dir) \ - appl tools tests packages etc po $(am__append_1) +SUBDIRS = include lib kuser kdc admin kadmin kpasswd $(kcm_dir) appl \ + tools tests packages etc po $(am__append_1) ACLOCAL_AMFLAGS = -I cf EXTRA_DIST = \ NTMakefile \ @@ -422,6 +542,7 @@ autogen.sh \ krb5.conf \ cf/make-proto.pl \ + cf/roken-h-process.pl \ cf/install-catman.sh \ cf/ChangeLog \ cf/c-function.m4 \ @@ -436,13 +557,20 @@ cf/krb-version.m4 \ cf/roken.m4 \ cf/valgrind-suppressions \ + cf/maybe-valgrind.sh \ + cf/symbol-version.py \ + cf/w32-check-exported-symbols.pl \ + cf/w32-def-from-dll.pl \ + cf/w32-detect-vc-version.pl \ + cf/w32-hh-toc-from-info.pl \ + cf/w32-list-externs-from-objs.pl \ cf/vararray.m4 all: all-recursive .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c -am--refresh: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c +am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ @@ -457,16 +585,16 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck @@ -487,22 +615,25 @@ -rm -f libtool config.lt # 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): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# 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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + 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; \ @@ -517,57 +648,12 @@ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(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; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && 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 +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -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) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -583,12 +669,7 @@ 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -600,15 +681,11 @@ $$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; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -617,11 +694,35 @@ 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 +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -655,13 +756,10 @@ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || 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; \ @@ -692,37 +790,47 @@ ! -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__remove_distdir) + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) -dist-lzma: distdir - tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma - $(am__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 -c >$(distdir).tar.xz - $(am__remove_distdir) + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) + $(am__post_remove_distdir) dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) + $(am__post_remove_distdir) -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__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 @@ -730,33 +838,37 @@ distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.lzma*) \ - lzma -dc $(distdir).tar.lzma | $(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 ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(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__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ @@ -777,13 +889,21 @@ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 - $(am__remove_distdir) + $(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: - @$(am__cd) '$(distuninstallcheck_dir)' \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + @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)"; \ @@ -815,10 +935,15 @@ installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -859,9 +984,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-recursive install-html-am: @@ -903,43 +1027,56 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ - ctags-recursive install-am install-data-am install-exec-am \ - install-strip tags-recursive uninstall-am - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am all-local am--refresh check check-am check-local \ - clean clean-generic clean-libtool ctags ctags-recursive dist \ - dist-all dist-bzip2 dist-gzip dist-hook dist-lzma dist-shar \ - dist-tarZ dist-xz dist-zip distcheck distclean \ - distclean-generic 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook 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 \ - uninstall-hook +.MAKE: $(am__recursive_targets) check-am install-am install-data-am \ + install-strip uninstall-am + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + am--refresh check check-am check-local clean clean-cscope \ + clean-generic clean-libtool cscope cscopelist-am ctags \ + ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ + dist-lzip dist-shar dist-tarZ dist-xz dist-zip dist-zstd \ + distcheck distclean distclean-generic 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-data-hook 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 installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -947,7 +1084,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -992,11 +1129,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1004,6 +1150,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1046,6 +1194,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1059,13 +1220,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/NEWS b/crypto/heimdal/NEWS --- a/crypto/heimdal/NEWS +++ b/crypto/heimdal/NEWS @@ -1,3 +1,418 @@ +Release Notes - Heimdal - Version Heimdal 7.8 + + Bug fixes + + - CVE-2022-42898 PAC parse integer overflows + + - CVE-2022-3437 Overflows and non-constant time leaks in DES{,3} and arcfour + + - CVE-2021-44758 Heimdal KDC: invalid free in ASN.1 codec + + This is a 10.0 on the Common Vulnerability Scoring System (CVSS) v3. + + Heimdal's ASN.1 compiler generates code that allows specially + crafted DER encodings of CHOICEs to invoke the wrong free function + on the decoded structure upon decode error. This is known to impact + the Heimdal KDC, leading to an invalid free() of an address partly + or wholly under the control of the attacker, in turn leading to a + potential remote code execution (RCE) vulnerability. + + This error affects the DER codec for all CHOICE types used in + Heimdal, though not all cases will be exploitable. We have not + completed a thorough analysis of all the Heimdal components + affected, thus the Kerberos client, the X.509 library, and other + parts, may be affected as well. + + This bug has been in Heimdal since 2005. It was first reported by + Douglas Bagnall, though it had been found independently by the + Heimdal maintainers via fuzzing. + + While no zero-day exploit is known, such an exploit will likely be + available soon after public disclosure. + + - Bugs found by UBSAN (including the incorrect encoding of unconstrained + INTEGER value -1). + + - Errors found by the LLVM scan-build static analyzer. + + - Errors found by the valgrind memory debugger. + + - Work around GCC Bug 95189 (memcmp wrongly stripped like strcmp). + + - Fix Unicode normalization read of 1 bytes past end of array. + + - Correct ASN.1 OID typo for SHA-384 + + - Fix a deadlock in in the MEMORY ccache type. + + - TGS: strip forwardable and proxiable flags if the server is + disallowed. + + - CVE-2019-14870: Validate client attributes in protocol-transition + - CVE-2019-14870: Apply forwardable policy in protocol-transition + - CVE-2019-14870: Always lookup impersonate client in DB + + - Incremental HDB propagation improvements + + - Refactor send_diffs making it progressive + - Handle partial writes on non-blocking sockets + - Disable Nagle in iprop master and slave + - Use async I/O + - Don't send I_HAVE in response to AYT + - Do not recover log in kadm5_get_principal() + - Don't send diffs to slaves with not yet known version + - Don't stutter in send_diffs + + - Optional backwards-compatible anon-pkinit behaviour + +Release Notes - Heimdal - Version Heimdal 7.7 + + Bug fixes + + - PKCS#11 hcrypto back-end + . initialize the p11_module_load function list + . verify that not only is a mechanism present but that its mechanism + info states that it offers the required encryption, decryption or + digest services + - krb5: + . Starting with 7.6, Heimdal permitted requesting authenticated + anonymous tickets. However, it did not verify that a KDC in fact + returned an anonymous ticket when one was requested. + - Cease setting the KDCOption reaquest_anonymous flag when issuing + S4UProxy (constrained delegation) TGS requests. + . when the Win2K PKINIT compatibility option is set, do + not require krbtgt otherName to match when validating KDC + certificate. + . set PKINIT_BTMM flag per Apple implementation + . use memset_s() instead of memset() + - kdc: + . When generating KRB5SignedPath in the AS, use the reply client name + rather than the one from the request, so validation will work + correctly in the TGS. + . allow checksum of PA-FOR-USER to be HMAC_MD5. Even if tgt used + an enctype with a different checksum. Per [MS-SFU] 2.2.1 + PA-FOR-USER the checksum is always HMAC_MD5, and that's what + Windows and MIT clients send. + + In heimdal both the client and kdc use instead the + checksum of the tgt, and therefore work with each other + but Windows and MIT clients fail against heimdal KDC. + + Both Windows and MIT KDCs would allow any keyed checksum + to be used so Heimdal client interoperates with them. + + Change Heimdal KDC to allow HMAC_MD5 even for non RC4 + based tgt in order to support per-spec clients. + . use memset_s() instead of memset(). + - Detect Heimdal 1.0 through 7.6 clients that issue S4UProxy + (constrained delegation) TGS Requests with the request + anonymous flag set. These requests will be treated as + S4UProxy requests and not anonymous requests. + - HDB: + . Set SQLite3 backend default page size to 8KB. + . Add hdb_set_sync() method + - kadmind: + . disable HDB sync during database load avoiding unnecessary disk i/o. + - ipropd: + . disable HDB sync during receive_everything. Doing an fsync + per-record when receiving the complete HDB is a performance + disaster. Among other things, if the HDB is very large, then + one slave receving a full HDB can cause other slaves to timeout + and, if HDB write activity is high enough to cause iprop log + truncation, then also need full syncs, which leads to a cycle of + full syncs for all slaves until HDB write activity drops. + Allowing the iprop log to be larger helps, but improving + receive_everything() performance helps even more. + - kinit: + . Anonymous PKINIT tickets discard the realm information used + to locate the issuing AS. Store the issuing realm in the + credentials cache in order to locate a KDC which can renew them. + . Do not leak the result of krb5_cc_get_config() when determining + anonymous PKINIT start realm. + - klist: + . Show transited-policy-checked, ok-as-delegate and anonymous + flags when listing credentials. + - tests: + . Regenerate certs so that they expire before the 2038 armageddon + so the test suite will pass on 32-bit operating systems until the + underlying issues can be resolved. + - Solaris: + . Define _STDC_C11_BCI for memset_s prototype + - build tooling: + . Convert from python 2 to python 3 + - documentation + . rename verify-password to verify-password-quality + . hprop default mode is encrypt + . kadmind "all" permission does not include "get-keys" + . verify-password-quality might not be stateless + +Release Notes - Heimdal - Version Heimdal 7.6 + + Security + + - CVE-2018-16860 Heimdal KDC: Reject PA-S4U2Self with unkeyed checksum + + When the Heimdal KDC checks the checksum that is placed on the + S4U2Self packet by the server to protect the requested principal + against modification, it does not confirm that the checksum + algorithm that protects the user name (principal) in the request + is keyed. This allows a man-in-the-middle attacker who can + intercept the request to the KDC to modify the packet by replacing + the user name (principal) in the request with any desired user + name (principal) that exists in the KDC and replace the checksum + protecting that name with a CRC32 checksum (which requires no + prior knowledge to compute). + + This would allow a S4U2Self ticket requested on behalf of user + name (principal) user@EXAMPLE.COM to any service to be changed + to a S4U2Self ticket with a user name (principal) of + Administrator@EXAMPLE.COM. This ticket would then contain the + PAC of the modified user name (principal). + + - CVE-2019-12098, client-only: + + RFC8062 Section 7 requires verification of the PA-PKINIT-KX key excahnge + when anonymous PKINIT is used. Failure to do so can permit an active + attacker to become a man-in-the-middle. + + Bug fixes + + - Happy eyeballs: Don't wait for responses from known-unreachable KDCs. + - kdc: check return copy_Realm, copy_PrincipalName, copy_EncryptionKey + - kinit: + . cleanup temporary ccaches + . see man page for "kinit --anonymous" command line syntax change + - kdc: Make anonymous AS-requests more RFC8062-compliant. + - Updated expired test certificates + - Solaris: + . PKCS#11 hcrypto backend broken since 7.0.1 + . Building with Sun Pro C + + Features + + - kuser: support authenticated anonymous AS-REQs in kinit + - kdc: support for anonymous TGS-REQs + - kgetcred support for anonymous service tickets + - Support builds with OpenSSL 1.1.1 + +Release Notes - Heimdal - Version Heimdal 7.5 + + Security + + - Fix CVE-2017-17439, which is a remote denial of service + vulnerability: + + In Heimdal 7.1 through 7.4, remote unauthenticated attackers + are able to crash the KDC by sending a crafted UDP packet + containing empty data fields for client name or realm. + + Bug fixes + + - Handle long input lines when reloading database dumps. + + - In pre-forked mode (default on Unix), correctly clear + the process ids of exited children, allowing new child processes + to replace the old. + + - Fixed incorrect KDC response when no-cross realm TGT exists, + allowing client requests to fail quickly rather than time + out after trying to get a correct answer from each KDC. + +Release Notes - Heimdal - Version Heimdal 7.4 + + Security + + - Fix CVE-2017-11103: Orpheus' Lyre KDC-REP service name validation + + This is a critical vulnerability. + + In _krb5_extract_ticket() the KDC-REP service name must be obtained from + encrypted version stored in 'enc_part' instead of the unencrypted version + stored in 'ticket'. Use of the unecrypted version provides an + opportunity for successful server impersonation and other attacks. + + Identified by Jeffrey Altman, Viktor Duchovni and Nico Williams. + + See https://www.orpheus-lyre.info/ for more details. + +Release Notes - Heimdal - Version Heimdal 7.3 + + Security + + - Fix transit path validation. Commit f469fc6 (2010-10-02) inadvertently + caused the previous hop realm to not be added to the transit path + of issued tickets. This may, in some cases, enable bypass of capath + policy in Heimdal versions 1.5 through 7.2. + + Note, this may break sites that rely on the bug. With the bug some + incomplete [capaths] worked, that should not have. These may now break + authentication in some cross-realm configurations. + (CVE-2017-6594) + +Release Notes - Heimdal - Version Heimdal 7.2 + + Bug fixes + - Portability improvements + - More strict parsing of encoded URI components in HTTP KDC + - Fixed memory leak in malloc error recovery in NTLM GSSAPI mechanism + - Avoid overly specific CPU info in krb5-config in aid of reproducible builds + - Don't do AFS string-to-key tests when feature is disabled + - Skip mdb_stat test when the command is not available + - Windows: update SHA2 timestamp server + - hdb: add missing export hdb_generate_key_set_password_with_ks_tuple + - Fix signature of hdb_generate_key_set_password() + - Windows: enable KX509 support in the KDC + - kdc: fix kx509 service principal match + - iprop: handle case where master sends nothing new + - ipropd-slave: fix incorrect error codes + - Allow choice of sqlite for HDB pref + - check-iprop: don't fail to kill daemons + - roken: pidfile -> rk_pidfile + - kdc: _kdc_do_kx509 fix use after free error + - Do not detect x32 as 64-bit platform. + - No sys/ttydefaults.h on CYGWIN + - Fix check-iprop races + - roken_detach_prep() close pipe + +Release Notes - Heimdal - Version Heimdal 7.1 + + Security + + - kx509 realm-chopping security bug + - non-authorization of alias additions/removals in kadmind + (CVE-2016-2400) + + Feature + + - iprop has been revamped to fix a number of race conditions that could + lead to inconsistent replication + - Hierarchical capath support + - AES Encryption with HMAC-SHA2 for Kerberos 5 + draft-ietf-kitten-aes-cts-hmac-sha2-11 + - hcrypto is now thread safe on all platforms + - libhcrypto has new backends: CNG (Windows), PKCS#11 (mainly for + Solaris), and OpenSSL. OpenSSL is now a first-class libhcrypto backend. + OpenSSL 1.0.x and 1.1 are both supported. AES-NI used when supported by + backend + - HDB now supports LMDB + - Thread support on Windows + - RFC 6113 Generalized Framework for Kerberos Pre-Authentication (FAST) + - New GSS APIs: + . gss_localname + - Allow setting what encryption types a principal should have with + [kadmin] default_key_rules, see krb5.conf manpage for more info + - Unify libhcrypto with LTC (libtomcrypto) + - asn1_compile 64-bit INTEGER functionality + - HDB key history support including --keepold kadmin password option + - Improved cross-realm key rollover safety + - New krb5_kuserok() and krb5_aname_to_localname() plug-in interfaces + - Improved MIT compatibility + . kadm5 API + . Migration from MIT KDB via "mitdb" HDB backend + . Capable of writing the HDB in MIT dump format + - Improved Active Directory interoperability + . Enctype selection issues for PAC and other authz-data signatures + . Cross realm key rollover (kvno 0) + - New [kdc] enctype negotiation configuration: + . tgt-use-strongest-session-key + . svc-use-strongest-session-key + . preauth-use-strongest-session-key + . use-strongest-server-key + - The KDC process now uses a multi-process model improving + resiliency and performance + - Allow batch-mode kinit with password file + - SIGINFO support added to kinit cmd + - New kx509 configuration options: + . kx509_ca + . kca_service + . kx509_include_pkinit_san + . kx509_template + - Improved Heimdal library/plugin version safety + - Name canonicalization + . DNS resolver searchlist + . Improved referral support + . Support host:port host-based services + - Pluggable libheimbase interface for DBs + - Improve IPv6 Support + - LDAP + . Bind DN and password + . Start TLS + - klist --json + - DIR credential cache type + - Updated upstream SQLite and libedit + - Removed legacy applications: ftp, kx, login, popper, push, rcp, rsh, + telnet, xnlock + - Completely remove RAND_egd support + - Moved kadmin and ktutil to /usr/bin + - Stricter fcache checks (see fcache_strict_checking krb5.conf setting) + . use O_NOFOLLOW + . don't follow symlinks + . require cache files to be owned by the user + . require sensible permissions (not group/other readable) + - Implemented gss_store_cred() + - Many more + + Bug fixes + - iprop has been revamped to fix a number of race conditions that could + lead to data loss + - Include non-loopback addresses assigned to loopback interfaces + when requesting tickets with addresses + - KDC 1DES session key selection (for AFS rxkad-k5 compatibility) + - Keytab file descriptor and lock leak + - Credential cache corruption bugs + (NOTE: The FILE ccache is still not entirely safe due to the + fundamentally unsafe design of POSIX file locking) + - gss_pseudo_random() interop bug + - Plugins are now preferentially loaded from the run-time install tree + - Reauthentication after password change in init_creds_password + - Memory leak in the client kadmin library + - TGS client requests renewable/forwardable/proxiable when possible + - Locking issues in DB1 and DB3 HDB backends + - Master HDB can remain locked while waiting for network I/O + - Renewal/refresh logic when kinit is provided with a command + - KDC handling of enterprise principals + - Use correct bit for anon-pkinit + - Many more + + Acknowledgements + + This release of Heimdal includes contributions from: + + Abhinav Upadhyay Heath Kehoe Nico Williams + Andreas Schneider Henry Jacques Patrik Lundin + Andrew Bartlett Howard Chu Philip Boulain + Andrew Tridgell Igor Sobrado Ragnar Sundblad + Antoine Jacoutot Ingo Schwarze Remi Ferrand + Arran Cudbard-Bell Jakub Čajka Rod Widdowson + Arvid Requate James Le Cuirot Rok Papež + Asanka Herath James Lee Roland C. Dowdeswell + Ben Kaduk Jeffrey Altman Ross L Richardson + Benjamin Kaduk Jeffrey Clark Russ Allbery + Bernard Spil Jeffrey Hutzelman Samuel Cabrero + Brian May Jelmer Vernooij Samuel Thibault + Chas Williams Ken Dreyer Santosh Kumar Pradhan + Chaskiel Grundman Kiran S J Sean Davis + Dana Koch Kumar Thangavelu Sergio Gelato + Daniel Schepler Landon Fuller Simon Wilkinson + David Mulder Linus Nordberg Stef Walter + Douglas Bagnall Love Hörnquist Åstrand Stefan Metzmacher + Ed Maste Luke Howard Steffen Jaeckel + Eray Aslan Magnus Ahltorp Timothy Pearson + Florian Best Marc Balmer Tollef Fog Heen + Fredrik Pettai Marcin Cieślak Tony Acero + Greg Hudson Marco Molteni Uri Simchoni + Gustavo Zacarias Matthieu Hautreux Viktor Dukhovni + Günther Deschner Michael Meffie Volker Lendecke + Harald Barth Moritz Lenz + +Release Notes - Heimdal - Version Heimdal 1.5.3 + + Bug fixes + - Fix leaking file descriptors in KDC + - Better socket/timeout handling in libkrb5 + - General bug fixes + - Build fixes + Release Notes - Heimdal - Version Heimdal 1.5.2 Security fixes @@ -94,7 +509,7 @@ - Support for settin friendly name on credential caches - Move to using doxygen to generate documentation. - - Sprinkling __attribute__((depricated)) for old function to be removed + - Sprinkling __attribute__((__deprecated__)) for old function to be removed - Support to export LAST-REQUST information in AS-REQ - Support for client deferrals in in AS-REQ - Add seek support for krb5_storage. diff --git a/crypto/heimdal/NTMakefile b/crypto/heimdal/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/NTMakefile @@ -0,0 +1,47 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +!if exist("thirdparty\NTMakefile") +thirdparty=thirdparty +!endif + +!ifdef APPVEYOR +SUBDIRS = include lib kuser kdc admin kadmin kpasswd appl doc \ + tools tests packages etc +!else +SUBDIRS = include lib kuser kdc admin kadmin kpasswd appl doc \ + tools tests packages etc $(thirdparty) packages\windows\installer +!endif + +!include windows/NTMakefile.w32 + +all:: + @echo Build finished succesfully diff --git a/crypto/heimdal/TODO b/crypto/heimdal/TODO new file mode 100644 --- /dev/null +++ b/crypto/heimdal/TODO @@ -0,0 +1,30 @@ +-*- indented-text -*- + +** lib/gssapi + +cache delegation credentials to avoid hitting the kdc ? require time +stampless tickets, and was supported in the recv'ing end with 0.6.1. + +make iov work for arcfour + +make iov work for ntlm + +interop test + +make TYPE_STREAM work + +** lib/kadm5 + +add policies? + +** lib/krb5 + +verify_user: handle non-secure verification failing because of +host->realm mapping + +* windows stuff + +-- drop all double negation #ifndef NO_ +-- got though windows specific ifdefs to minimized them +-- switch to use heim-ipc for services, like the kadmin change notification socket +-- Unify lib/krb5/expand_path_w32.c diff --git a/crypto/heimdal/aclocal.m4 b/crypto/heimdal/aclocal.m4 --- a/crypto/heimdal/aclocal.m4 +++ b/crypto/heimdal/aclocal.m4 @@ -1,7 +1,7 @@ -# generated automatically by aclocal 1.11.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009 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. @@ -11,15 +11,16 @@ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, -[m4_warning([this file was generated for autoconf 2.65. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. 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'.])]) +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) -# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -31,10 +32,10 @@ # 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.11' +[am__api_version='1.16' 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.11.1], [], +m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -50,22 +51,22 @@ # 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.11.1])dnl +[AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 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/../..'. +# $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 @@ -84,7 +85,7 @@ # # 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 +# 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, @@ -102,30 +103,26 @@ # 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` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2021 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. -# serial 9 - # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +[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 @@ -144,16 +141,14 @@ Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2021 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. -# serial 10 -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# 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 @@ -163,7 +158,7 @@ # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". +# 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 @@ -176,12 +171,13 @@ AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" 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=]) +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], @@ -189,8 +185,9 @@ # 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'. + # 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. @@ -229,16 +226,16 @@ : > 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 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # 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" + # 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 + # 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 @@ -247,16 +244,16 @@ test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # 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 ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + 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} @@ -304,7 +301,7 @@ # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES +# 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 @@ -314,81 +311,77 @@ # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) +[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, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1999-2021 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. -#serial 5 - # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ - # Autoconf 2.62 quotes --file arguments for eval, but not when files + # Older Autoconf 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 + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) shift - for mf + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_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 + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: 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"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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 + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -397,29 +390,31 @@ # ----------------------------- # 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. +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll 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"]) -]) + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 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. -# serial 16 - # 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. +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- @@ -432,7 +427,11 @@ # 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 +[AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])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 @@ -461,33 +460,42 @@ # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +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], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, +m4_if( + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([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 +[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) +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([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +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 (and possibly the TAP driver). 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 @@ -496,34 +504,96 @@ [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl + [_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)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl + [_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)], - [define([AC_PROG_OBJC], - defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +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. +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro 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 + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) -dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +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. @@ -545,7 +615,7 @@ done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -556,7 +626,7 @@ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -564,16 +634,14 @@ install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi -AC_SUBST(install_sh)]) +AC_SUBST([install_sh])]) -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2003-2021 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. -# serial 2 - # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], @@ -587,21 +655,18 @@ rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) -# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2005 -# Free Software Foundation, Inc. +# Copyright (C) 1998-2021 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. -# serial 5 - # AM_PROG_LEX # ----------- # Autoconf leaves LEX=: if lex or flex can't be found. Change that to a # "missing" invocation, for better error output. AC_DEFUN([AM_PROG_LEX], -[AC_PREREQ(2.50)dnl +[AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then @@ -611,20 +676,17 @@ # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1996-2021 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. -# serial 5 - # 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 +# 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]), @@ -632,13 +694,14 @@ [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 am_maintainer_other maintainer-specific portions of Makefiles]) +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], -[ --][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])) + [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 @@ -646,106 +709,57 @@ ] ) -AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) - # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 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. -# serial 4 - # AM_MAKE_INCLUDE() # ----------------- -# Check to see how make treats includes. +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' am__doit: - @echo this is the am__doit target + @echo this is the am__doit target >confinc.out .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 -]) - -# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# 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. - -# serial 6 - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -AC_REQUIRE_AUX_FILE([compile])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # 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__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -dnl Make sure AC_PROG_CC is never called again, or it will override our -dnl setting of CC. -m4_define([AC_PROG_CC], - [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) -]) +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 -# Free Software Foundation, Inc. +# Copyright (C) 1997-2021 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. -# serial 6 - # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], @@ -753,80 +767,46 @@ $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. +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, 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 + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " else am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) + AC_MSG_WARN(['missing' script is too old or missing]) fi ]) -# Copyright (C) 2003, 2004, 2005, 2006 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_MKDIR_P -# --------------- -# Check for `mkdir -p'. -AC_DEFUN([AM_PROG_MKDIR_P], -[AC_PREREQ([2.60])dnl -AC_REQUIRE([AC_PROG_MKDIR_P])dnl -dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, -dnl while keeping a definition of mkdir_p for backward compatibility. -dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. -dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of -dnl Makefile.ins that do not define MKDIR_P, so we do our own -dnl adjustment using top_builddir (which is defined more often than -dnl MKDIR_P). -AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl -case $mkdir_p in - [[\\/$]]* | ?:[[\\/]]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac -]) - # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 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. -# serial 4 - # _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)]) +[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)])]) @@ -837,24 +817,426 @@ 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) 1999-2021 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. -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 -# Free Software Foundation, Inc. +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 1999-2021 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. -# serial 5 + +# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# --------------------------------------------------------------------------- +# Adds support for distributing Python modules and packages. To +# install modules, copy them to $(pythondir), using the python_PYTHON +# automake variable. To install a package with the same name as the +# automake package, install to $(pkgpythondir), or use the +# pkgpython_PYTHON automake variable. +# +# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as +# locations to install python extension modules (shared libraries). +# Another macro is required to find the appropriate flags to compile +# extension modules. +# +# If your package is configured with a different prefix to python, +# users will have to add the install directory to the PYTHONPATH +# environment variable, or create a .pth file (see the python +# documentation for details). +# +# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will +# cause an error if the version of python installed on the system +# doesn't meet the requirement. MINIMUM-VERSION should consist of +# numbers and dots only. +AC_DEFUN([AM_PATH_PYTHON], + [ + dnl Find a Python interpreter. Python versions prior to 2.0 are not + dnl supported. (2.0 was released on October 16, 2000). + m4_define_default([_AM_PYTHON_INTERPRETER_LIST], +[python python2 python3 dnl + python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 dnl + python3.2 python3.1 python3.0 dnl + python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 dnl + python2.0]) + + AC_ARG_VAR([PYTHON], [the Python interpreter]) + + m4_if([$1],[],[ + dnl No version check is needed. + # Find any Python interpreter. + if test -z "$PYTHON"; then + AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :) + fi + am_display_PYTHON=python + ], [ + dnl A version check is needed. + if test -n "$PYTHON"; then + # If the user set $PYTHON, use it and don't search something else. + AC_MSG_CHECKING([whether $PYTHON version is >= $1]) + AM_PYTHON_CHECK_VERSION([$PYTHON], [$1], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([Python interpreter is too old])]) + am_display_PYTHON=$PYTHON + else + # Otherwise, try each interpreter until we find one that satisfies + # VERSION. + AC_CACHE_CHECK([for a Python interpreter with version >= $1], + [am_cv_pathless_PYTHON],[ + for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do + test "$am_cv_pathless_PYTHON" = none && break + AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break]) + done]) + # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON. + if test "$am_cv_pathless_PYTHON" = none; then + PYTHON=: + else + AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON]) + fi + am_display_PYTHON=$am_cv_pathless_PYTHON + fi + ]) + + if test "$PYTHON" = :; then + dnl Run any user-specified action, or abort. + m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])]) + else + + dnl Query Python for its version number. Although site.py simply uses + dnl sys.version[:3], printing that failed with Python 3.10, since the + dnl trailing zero was eliminated. So now we output just the major + dnl and minor version numbers, as numbers. Apparently the tertiary + dnl version is not of interest. + dnl + AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version], + [am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[[:2]])"`]) + AC_SUBST([PYTHON_VERSION], [$am_cv_python_version]) + + dnl At times, e.g., when building shared libraries, you may want + dnl to know which OS platform Python thinks this is. + dnl + AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform], + [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`]) + AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform]) + + dnl emacs-page + dnl If --with-python-sys-prefix is given, use the values of sys.prefix + dnl and sys.exec_prefix for the corresponding values of PYTHON_PREFIX + dnl and PYTHON_EXEC_PREFIX. Otherwise, use the GNU ${prefix} and + dnl ${exec_prefix} variables. + dnl + dnl The two are made distinct variables so they can be overridden if + dnl need be, although general consensus is that you shouldn't need + dnl this separation. + dnl + dnl Also allow directly setting the prefixes via configure options, + dnl overriding any default. + dnl + if test "x$prefix" = xNONE; then + am__usable_prefix=$ac_default_prefix + else + am__usable_prefix=$prefix + fi + + # Allow user to request using sys.* values from Python, + # instead of the GNU $prefix values. + AC_ARG_WITH([python-sys-prefix], + [AS_HELP_STRING([--with-python-sys-prefix], + [use Python's sys.prefix and sys.exec_prefix values])], + [am_use_python_sys=:], + [am_use_python_sys=false]) + + # Allow user to override whatever the default Python prefix is. + AC_ARG_WITH([python_prefix], + [AS_HELP_STRING([--with-python_prefix], + [override the default PYTHON_PREFIX])], + [am_python_prefix_subst=$withval + am_cv_python_prefix=$withval + AC_MSG_CHECKING([for explicit $am_display_PYTHON prefix]) + AC_MSG_RESULT([$am_cv_python_prefix])], + [ + if $am_use_python_sys; then + # using python sys.prefix value, not GNU + AC_CACHE_CHECK([for python default $am_display_PYTHON prefix], + [am_cv_python_prefix], + [am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"`]) + + dnl If sys.prefix is a subdir of $prefix, replace the literal value of + dnl $prefix with a variable reference so it can be overridden. + case $am_cv_python_prefix in + $am__usable_prefix*) + am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` + am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` + ;; + *) + am_python_prefix_subst=$am_cv_python_prefix + ;; + esac + else # using GNU prefix value, not python sys.prefix + am_python_prefix_subst='${prefix}' + am_python_prefix=$am_python_prefix_subst + AC_MSG_CHECKING([for GNU default $am_display_PYTHON prefix]) + AC_MSG_RESULT([$am_python_prefix]) + fi]) + # Substituting python_prefix_subst value. + AC_SUBST([PYTHON_PREFIX], [$am_python_prefix_subst]) + + # emacs-page Now do it all over again for Python exec_prefix, but with yet + # another conditional: fall back to regular prefix if that was specified. + AC_ARG_WITH([python_exec_prefix], + [AS_HELP_STRING([--with-python_exec_prefix], + [override the default PYTHON_EXEC_PREFIX])], + [am_python_exec_prefix_subst=$withval + am_cv_python_exec_prefix=$withval + AC_MSG_CHECKING([for explicit $am_display_PYTHON exec_prefix]) + AC_MSG_RESULT([$am_cv_python_exec_prefix])], + [ + # no explicit --with-python_exec_prefix, but if + # --with-python_prefix was given, use its value for python_exec_prefix too. + AS_IF([test -n "$with_python_prefix"], + [am_python_exec_prefix_subst=$with_python_prefix + am_cv_python_exec_prefix=$with_python_prefix + AC_MSG_CHECKING([for python_prefix-given $am_display_PYTHON exec_prefix]) + AC_MSG_RESULT([$am_cv_python_exec_prefix])], + [ + # Set am__usable_exec_prefix whether using GNU or Python values, + # since we use that variable for pyexecdir. + if test "x$exec_prefix" = xNONE; then + am__usable_exec_prefix=$am__usable_prefix + else + am__usable_exec_prefix=$exec_prefix + fi + # + if $am_use_python_sys; then # using python sys.exec_prefix, not GNU + AC_CACHE_CHECK([for python default $am_display_PYTHON exec_prefix], + [am_cv_python_exec_prefix], + [am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"`]) + dnl If sys.exec_prefix is a subdir of $exec_prefix, replace the + dnl literal value of $exec_prefix with a variable reference so it can + dnl be overridden. + case $am_cv_python_exec_prefix in + $am__usable_exec_prefix*) + am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` + am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` + ;; + *) + am_python_exec_prefix_subst=$am_cv_python_exec_prefix + ;; + esac + else # using GNU $exec_prefix, not python sys.exec_prefix + am_python_exec_prefix_subst='${exec_prefix}' + am_python_exec_prefix=$am_python_exec_prefix_subst + AC_MSG_CHECKING([for GNU default $am_display_PYTHON exec_prefix]) + AC_MSG_RESULT([$am_python_exec_prefix]) + fi])]) + # Substituting python_exec_prefix_subst. + AC_SUBST([PYTHON_EXEC_PREFIX], [$am_python_exec_prefix_subst]) + + # Factor out some code duplication into this shell variable. + am_python_setup_sysconfig="\ +import sys +# Prefer sysconfig over distutils.sysconfig, for better compatibility +# with python 3.x. See automake bug#10227. +try: + import sysconfig +except ImportError: + can_use_sysconfig = 0 +else: + can_use_sysconfig = 1 +# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: +# +try: + from platform import python_implementation + if python_implementation() == 'CPython' and sys.version[[:3]] == '2.7': + can_use_sysconfig = 0 +except ImportError: + pass" + + dnl emacs-page Set up 4 directories: + + dnl 1. pythondir: where to install python scripts. This is the + dnl site-packages directory, not the python standard library + dnl directory like in previous automake betas. This behavior + dnl is more consistent with lispdir.m4 for example. + dnl Query distutils for this directory. + dnl + AC_CACHE_CHECK([for $am_display_PYTHON script directory (pythondir)], + [am_cv_python_pythondir], + [if test "x$am_cv_python_prefix" = x; then + am_py_prefix=$am__usable_prefix + else + am_py_prefix=$am_cv_python_prefix + fi + am_cv_python_pythondir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + # + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" + ;; + esac + ;; + esac + ]) + AC_SUBST([pythondir], [$am_cv_python_pythondir]) + + dnl 2. pkgpythondir: $PACKAGE directory under pythondir. Was + dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is + dnl more consistent with the rest of automake. + dnl + AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE]) + + dnl 3. pyexecdir: directory for installing python extension modules + dnl (shared libraries). + dnl Query distutils for this directory. + dnl + AC_CACHE_CHECK([for $am_display_PYTHON extension module directory (pyexecdir)], + [am_cv_python_pyexecdir], + [if test "x$am_cv_python_exec_prefix" = x; then + am_py_exec_prefix=$am__usable_exec_prefix + else + am_py_exec_prefix=$am_cv_python_exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_exec_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') +sys.stdout.write(sitedir)"` + # + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" + ;; + esac + ;; + esac + ]) + AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir]) + + dnl 4. pkgpyexecdir: $(pyexecdir)/$(PACKAGE) + dnl + AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE]) + + dnl Run any user-specified action. + $2 + fi +]) + + +# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +# --------------------------------------------------------------------------- +# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION. +# Run ACTION-IF-FALSE otherwise. +# This test uses sys.hexversion instead of the string equivalent (first +# word of sys.version), in order to cope with versions such as 2.2c1. +# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000). +AC_DEFUN([AM_PYTHON_CHECK_VERSION], + [prog="import sys +# split strings by '.' and convert to numeric. Append some zeros +# because we need at least 4 digits for the hex conversion. +# map returns an iterator in Python 3.0 and a list in 2.x +minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]] +minverhex = 0 +# xrange is not present in Python 3.0 and range returns an iterator +for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]] +sys.exit(sys.hexversion < minverhex)" + AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])]) + +# Copyright (C) 2001-2021 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_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2021 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]) -# Just in case -sleep 1 -echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' @@ -865,32 +1247,40 @@ esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) - AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac -# Do `set' in a subshell so we don't clobber the current shell's +# 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 ( - 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 - rm -f conftest.file - 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 - + 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 @@ -900,9 +1290,85 @@ AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi -AC_MSG_RESULT(yes)]) +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) 2009-2021 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_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -910,34 +1376,32 @@ # AM_PROG_INSTALL_STRIP # --------------------- -# One issue with vendor `install' (even GNU) is that you can't +# 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 +# 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 +# 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'. +# 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, 2008 Free Software Foundation, Inc. +# Copyright (C) 2006-2021 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. -# serial 2 - # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. @@ -945,24 +1409,22 @@ 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, 2005 Free Software Foundation, Inc. +# Copyright (C) 2004-2021 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. -# serial 2 - # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. +# 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 @@ -972,82 +1434,120 @@ # 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. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} 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. +[# 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}']) + +# We'll 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 +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + 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 - # 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]) + # 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 - 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_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([cf/aix.m4]) m4_include([cf/auth-modules.m4]) -m4_include([cf/broken-getaddrinfo.m4]) m4_include([cf/broken-glob.m4]) m4_include([cf/broken-realloc.m4]) m4_include([cf/broken-snprintf.m4]) @@ -1061,8 +1561,6 @@ m4_include([cf/check-netinet-ip-and-tcp.m4]) m4_include([cf/check-type-extra.m4]) m4_include([cf/check-var.m4]) -m4_include([cf/check-x.m4]) -m4_include([cf/check-xau.m4]) m4_include([cf/crypto.m4]) m4_include([cf/db.m4]) m4_include([cf/destdirs.m4]) @@ -1080,6 +1578,7 @@ m4_include([cf/krb-func-getlogin.m4]) m4_include([cf/krb-ipv6.m4]) m4_include([cf/krb-prog-ln-s.m4]) +m4_include([cf/krb-prog-perl.m4]) m4_include([cf/krb-readline.m4]) m4_include([cf/krb-struct-spwd.m4]) m4_include([cf/krb-struct-winsize.m4]) diff --git a/crypto/heimdal/admin/Makefile.am b/crypto/heimdal/admin/Makefile.am --- a/crypto/heimdal/admin/Makefile.am +++ b/crypto/heimdal/admin/Makefile.am @@ -2,11 +2,11 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_readline) $(INCLUDE_hcrypto) +AM_CPPFLAGS += $(INCLUDE_readline) -man_MANS = ktutil.8 +man_MANS = ktutil.1 -sbin_PROGRAMS = ktutil +bin_PROGRAMS = ktutil dist_ktutil_SOURCES = \ add.c \ diff --git a/crypto/heimdal/admin/Makefile.in b/crypto/heimdal/admin/Makefile.in --- a/crypto/heimdal/admin/Makefile.in +++ b/crypto/heimdal/admin/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,15 +94,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -sbin_PROGRAMS = ktutil$(EXEEXT) +bin_PROGRAMS = ktutil$(EXEEXT) subdir = admin ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -59,8 +109,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -73,6 +122,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -92,12 +142,13 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" -PROGRAMS = $(sbin_PROGRAMS) +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) dist_ktutil_OBJECTS = add.$(OBJEXT) change.$(OBJEXT) copy.$(OBJEXT) \ destroy.$(OBJEXT) get.$(OBJEXT) ktutil.$(OBJEXT) \ list.$(OBJEXT) purge.$(OBJEXT) remove.$(OBJEXT) \ @@ -111,20 +162,55 @@ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/sl/libsl.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/add.Po ./$(DEPDIR)/change.Po \ + ./$(DEPDIR)/copy.Po ./$(DEPDIR)/destroy.Po ./$(DEPDIR)/get.Po \ + ./$(DEPDIR)/ktutil-commands.Po ./$(DEPDIR)/ktutil.Po \ + ./$(DEPDIR)/list.Po ./$(DEPDIR)/purge.Po ./$(DEPDIR)/remove.Po \ + ./$(DEPDIR)/rename.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(dist_ktutil_SOURCES) $(nodist_ktutil_SOURCES) DIST_SOURCES = $(dist_ktutil_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/||"`;; \ @@ -146,15 +232,42 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -man8dir = $(mandir)/man8 +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 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -169,16 +282,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -188,17 +304,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -217,12 +335,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -231,6 +346,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -247,10 +363,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -258,6 +372,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -272,12 +387,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -294,10 +412,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -308,13 +432,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -338,6 +456,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -361,9 +481,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -373,30 +498,38 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_readline) $(INCLUDE_hcrypto) +AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_readline) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -man_MANS = ktutil.8 + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +man_MANS = ktutil.1 dist_ktutil_SOURCES = \ add.c \ change.c \ @@ -427,7 +560,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -440,15 +573,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign admin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign admin/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -458,16 +591,21 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-sbinPROGRAMS: $(sbin_PROGRAMS) +install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + @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; \ + 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|.*|.|' \ + 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 } \ @@ -478,32 +616,34 @@ 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)$(sbindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ + 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-sbinPROGRAMS: +uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sbindir)" && rm -f $$files + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files -clean-sbinPROGRAMS: - @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ +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 -ktutil$(EXEEXT): $(ktutil_OBJECTS) $(ktutil_DEPENDENCIES) + +ktutil$(EXEEXT): $(ktutil_OBJECTS) $(ktutil_DEPENDENCIES) $(EXTRA_ktutil_DEPENDENCIES) @rm -f ktutil$(EXEEXT) - $(LINK) $(ktutil_OBJECTS) $(ktutil_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(ktutil_OBJECTS) $(ktutil_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -511,103 +651,103 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/change.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/destroy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ktutil-commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ktutil.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/purge.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remove.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/change.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/destroy.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ktutil-commands.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ktutil.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/list.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/purge.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remove.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -install-man8: $(man_MANS) +install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + @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,^[^8][0-9a-z]*$$,8,;x' \ + 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)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ + 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)$(man8dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } -uninstall-man8: +uninstall-man1: @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man8dir)" || exit 0; \ + @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 '/\.8[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ + 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -619,15 +759,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -636,24 +772,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -691,7 +831,7 @@ check: check-am all-am: Makefile $(PROGRAMS) $(MANS) all-local installdirs: - for dir in "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -704,10 +844,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -722,11 +867,20 @@ @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-generic clean-libtool clean-sbinPROGRAMS \ - mostlyclean-am +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/add.Po + -rm -f ./$(DEPDIR)/change.Po + -rm -f ./$(DEPDIR)/copy.Po + -rm -f ./$(DEPDIR)/destroy.Po + -rm -f ./$(DEPDIR)/get.Po + -rm -f ./$(DEPDIR)/ktutil-commands.Po + -rm -f ./$(DEPDIR)/ktutil.Po + -rm -f ./$(DEPDIR)/list.Po + -rm -f ./$(DEPDIR)/purge.Po + -rm -f ./$(DEPDIR)/remove.Po + -rm -f ./$(DEPDIR)/rename.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -750,9 +904,8 @@ install-dvi-am: -install-exec-am: install-sbinPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local + install-html: install-html-am install-html-am: @@ -761,7 +914,7 @@ install-info-am: -install-man: install-man8 +install-man: install-man1 install-pdf: install-pdf-am @@ -774,7 +927,17 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/add.Po + -rm -f ./$(DEPDIR)/change.Po + -rm -f ./$(DEPDIR)/copy.Po + -rm -f ./$(DEPDIR)/destroy.Po + -rm -f ./$(DEPDIR)/get.Po + -rm -f ./$(DEPDIR)/ktutil-commands.Po + -rm -f ./$(DEPDIR)/ktutil.Po + -rm -f ./$(DEPDIR)/list.Po + -rm -f ./$(DEPDIR)/purge.Po + -rm -f ./$(DEPDIR)/remove.Po + -rm -f ./$(DEPDIR)/rename.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -791,45 +954,59 @@ ps-am: -uninstall-am: uninstall-man uninstall-sbinPROGRAMS +uninstall-am: uninstall-binPROGRAMS uninstall-man @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man8 +uninstall-man: uninstall-man1 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libtool clean-sbinPROGRAMS ctags \ - dist-hook distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am install-man \ - install-man8 install-pdf install-pdf-am install-ps \ - install-ps-am install-sbinPROGRAMS 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-hook uninstall-man \ - uninstall-man8 uninstall-sbinPROGRAMS + 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-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-hook \ + uninstall-man uninstall-man1 + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -837,7 +1014,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -882,11 +1059,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -894,6 +1080,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -936,6 +1124,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -949,13 +1150,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/admin/NTMakefile b/crypto/heimdal/admin/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/admin/NTMakefile @@ -0,0 +1,74 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=admin +cincdirs=$(cincdirs) -I$(OBJ) +!include ../windows/NTMakefile.w32 + +SBINPROGRAMS=$(SBINDIR)\ktutil.exe + +KTUTIL_OBJS= \ + $(OBJ)\add.obj \ + $(OBJ)\change.obj \ + $(OBJ)\copy.obj \ + $(OBJ)\destroy.obj \ + $(OBJ)\get.obj \ + $(OBJ)\ktutil.obj \ + $(OBJ)\ktutil-commands.obj \ + $(OBJ)\list.obj \ + $(OBJ)\purge.obj \ + $(OBJ)\remove.obj \ + $(OBJ)\rename.obj + +KTUTIL_LIBS= \ + $(LIBHEIMDAL) \ + $(LIBKADM5SRV) \ + $(LIBSL) \ + $(LIBROKEN) \ + $(LIBVERS) + +$(SBINDIR)\ktutil.exe: $(KTUTIL_OBJS) $(KTUTIL_LIBS) $(OBJ)\ktutil-version.res + $(EXECONLINK) + $(EXEPREP) + +$(OBJ)\ktutil-commands.c $(OBJ)\ktutil-commands.h: ktutil-commands.in + cd $(OBJ) + $(CP) $(SRCDIR)\ktutil-commands.in $(OBJ) + $(BINDIR)\slc.exe ktutil-commands.in + cd $(SRCDIR) + +INCFILES=\ + $(OBJ)\ktutil-commands.h + +all:: $(INCFILES) $(SBINPROGRAMS) + +clean:: + -$(RM) $(SBINPROGRAMS:.exe=.*) diff --git a/crypto/heimdal/admin/add.c b/crypto/heimdal/admin/add.c --- a/crypto/heimdal/admin/add.c +++ b/crypto/heimdal/admin/add.c @@ -94,7 +94,8 @@ goto out; } if(opt->password_string == NULL && opt->random_flag == 0) { - if(UI_UTIL_read_pw_string(buf, sizeof(buf), "Password: ", 1)) { + if(UI_UTIL_read_pw_string(buf, sizeof(buf), "Password: ", + UI_UTIL_FLAG_VERIFY)) { ret = 1; goto out; } diff --git a/crypto/heimdal/admin/ktutil-commands.in b/crypto/heimdal/admin/ktutil-commands.in --- a/crypto/heimdal/admin/ktutil-commands.in +++ b/crypto/heimdal/admin/ktutil-commands.in @@ -206,7 +206,7 @@ short = "V" type = "integer" help = "key version to remove" - argument = "enctype" + argument = "kvno" default = "0" } option = { diff --git a/crypto/heimdal/admin/ktutil-version.rc b/crypto/heimdal/admin/ktutil-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/admin/ktutil-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Kerberos Keytab Tool" +#define RC_FILE_ORIG_0409 "ktutil.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/admin/ktutil.1 b/crypto/heimdal/admin/ktutil.1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/admin/ktutil.1 @@ -0,0 +1,124 @@ +.\" Copyright (c) 1997-2004 Kungliga Tekniska Högskolan +.\" (Royal Institute of Technology, Stockholm, Sweden). +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" 3. Neither the name of the Institute nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd April 14, 2005 +.Dt KTUTIL 1 +.Os HEIMDAL +.Sh NAME +.Nm ktutil +.Nd manage Kerberos keytabs +.Sh SYNOPSIS +.Nm +.Oo Fl k Ar keytab \*(Ba Xo +.Fl Fl keytab= Ns Ar keytab +.Xc +.Oc +.Op Fl v | Fl Fl verbose +.Op Fl Fl version +.Op Fl h | Fl Fl help +.Ar command +.Op Ar args +.Sh DESCRIPTION +.Nm +is a program for managing keytabs. +Supported options: +.Bl -tag -width Ds +.It Fl v , Fl Fl verbose +Verbose output. +.El +.Pp +.Ar command +can be one of the following: +.Bl -tag -width srvconvert +.It add Oo Fl p Ar principal Oc Oo Fl Fl principal= Ns Ar principal Oc \ +Oo Fl V Ar kvno Oc Oo Fl Fl kvno= Ns Ar kvno Oc Oo Fl e Ar enctype Oc \ +Oo Fl Fl enctype= Ns Ar enctype Oc Oo Fl w Ar password Oc \ +Oo Fl Fl password= Ns Ar password Oc Oo Fl r Oc Oo Fl Fl random Oc \ +Oo Fl s Oc Oo Fl Fl no-salt Oc Oo Fl H Oc Op Fl Fl hex +Adds a key to the keytab. Options that are not specified will be +prompted for. This requires that you know the password or the hex key of the +principal to add; if what you really want is to add a new principal to +the keytab, you should consider the +.Ar get +command, which talks to the kadmin server. +.It change Oo Fl r Ar realm Oc Oo Fl Fl realm= Ns Ar realm Oc \ +Oo Fl Fl a Ar host Oc Oo Fl Fl admin-server= Ns Ar host Oc \ +Oo Fl Fl s Ar port Oc Op Fl Fl server-port= Ns Ar port +Update one or several keys to new versions. By default, use the admin +server for the realm of a keytab entry. Otherwise it will use the +values specified by the options. +.Pp +If no principals are given, all the ones in the keytab are updated. +.It copy Ar keytab-src Ar keytab-dest +Copies all the entries from +.Ar keytab-src +to +.Ar keytab-dest . +.It get Oo Fl p Ar admin principal Oc \ +Oo Fl Fl principal= Ns Ar admin principal Oc Oo Fl e Ar enctype Oc \ +Oo Fl Fl enctypes= Ns Ar enctype Oc Oo Fl r Ar realm Oc \ +Oo Fl Fl realm= Ns Ar realm Oc Oo Fl a Ar admin server Oc \ +Oo Fl Fl admin-server= Ns Ar admin server Oc Oo Fl s Ar server port Oc \ +Oo Fl Fl server-port= Ns Ar server port Oc Ar principal ... +For each +.Ar principal , +generate a new key for it (creating it if it doesn't already exist), +and put that key in the keytab. +.Pp +If no +.Ar realm +is specified, the realm to operate on is taken from the first +principal. +.It list Oo Fl Fl keys Oc Op Fl Fl timestamp +List the keys stored in the keytab. +.It remove Oo Fl p Ar principal Oc Oo Fl Fl principal= Ns Ar principal Oc \ +Oo Fl V kvno Oc Oo Fl Fl kvno= Ns Ar kvno Oc Oo Fl e enctype Oc \ +Oo Fl Fl enctype= Ns Ar enctype Oc +Removes the specified key or keys. Not specifying a +.Ar kvno +removes keys with any version number. Not specifying an +.Ar enctype +removes keys of any type. +.It rename Ar from-principal Ar to-principal +Renames all entries in the keytab that match the +.Ar from-principal +to +.Ar to-principal . +.It purge Op Fl Fl age= Ns Ar age +Removes all old versions of a key for which there is a newer version +that is at least +.Ar age +(default one week) old. +.El +.Sh SEE ALSO +.Xr kadmin 1 diff --git a/crypto/heimdal/admin/ktutil.8 b/crypto/heimdal/admin/ktutil.8 deleted file mode 100644 --- a/crypto/heimdal/admin/ktutil.8 +++ /dev/null @@ -1,124 +0,0 @@ -.\" Copyright (c) 1997-2004 Kungliga Tekniska Högskolan -.\" (Royal Institute of Technology, Stockholm, Sweden). -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" 3. Neither the name of the Institute nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $Id$ -.\" -.Dd April 14, 2005 -.Dt KTUTIL 8 -.Os HEIMDAL -.Sh NAME -.Nm ktutil -.Nd manage Kerberos keytabs -.Sh SYNOPSIS -.Nm -.Oo Fl k Ar keytab \*(Ba Xo -.Fl Fl keytab= Ns Ar keytab -.Xc -.Oc -.Op Fl v | Fl Fl verbose -.Op Fl Fl version -.Op Fl h | Fl Fl help -.Ar command -.Op Ar args -.Sh DESCRIPTION -.Nm -is a program for managing keytabs. -Supported options: -.Bl -tag -width Ds -.It Fl v , Fl Fl verbose -Verbose output. -.El -.Pp -.Ar command -can be one of the following: -.Bl -tag -width srvconvert -.It add Oo Fl p Ar principal Oc Oo Fl Fl principal= Ns Ar principal Oc \ -Oo Fl V Ar kvno Oc Oo Fl Fl kvno= Ns Ar kvno Oc Oo Fl e Ar enctype Oc \ -Oo Fl Fl enctype= Ns Ar enctype Oc Oo Fl w Ar password Oc \ -Oo Fl Fl password= Ns Ar password Oc Oo Fl r Oc Oo Fl Fl random Oc \ -Oo Fl s Oc Oo Fl Fl no-salt Oc Oo Fl H Oc Op Fl Fl hex -Adds a key to the keytab. Options that are not specified will be -prompted for. This requires that you know the password or the hex key of the -principal to add; if what you really want is to add a new principal to -the keytab, you should consider the -.Ar get -command, which talks to the kadmin server. -.It change Oo Fl r Ar realm Oc Oo Fl Fl realm= Ns Ar realm Oc \ -Oo Fl Fl a Ar host Oc Oo Fl Fl admin-server= Ns Ar host Oc \ -Oo Fl Fl s Ar port Oc Op Fl Fl server-port= Ns Ar port -Update one or several keys to new versions. By default, use the admin -server for the realm of a keytab entry. Otherwise it will use the -values specified by the options. -.Pp -If no principals are given, all the ones in the keytab are updated. -.It copy Ar keytab-src Ar keytab-dest -Copies all the entries from -.Ar keytab-src -to -.Ar keytab-dest . -.It get Oo Fl p Ar admin principal Oc \ -Oo Fl Fl principal= Ns Ar admin principal Oc Oo Fl e Ar enctype Oc \ -Oo Fl Fl enctypes= Ns Ar enctype Oc Oo Fl r Ar realm Oc \ -Oo Fl Fl realm= Ns Ar realm Oc Oo Fl a Ar admin server Oc \ -Oo Fl Fl admin-server= Ns Ar admin server Oc Oo Fl s Ar server port Oc \ -Oo Fl Fl server-port= Ns Ar server port Oc Ar principal ... -For each -.Ar principal , -generate a new key for it (creating it if it doesn't already exist), -and put that key in the keytab. -.Pp -If no -.Ar realm -is specified, the realm to operate on is taken from the first -principal. -.It list Oo Fl Fl keys Oc Op Fl Fl timestamp -List the keys stored in the keytab. -.It remove Oo Fl p Ar principal Oc Oo Fl Fl principal= Ns Ar principal Oc \ -Oo Fl V kvno Oc Oo Fl Fl kvno= Ns Ar kvno Oc Oo Fl e enctype Oc \ -Oo Fl Fl enctype= Ns Ar enctype Oc -Removes the specified key or keys. Not specifying a -.Ar kvno -removes keys with any version number. Not specifying an -.Ar enctype -removes keys of any type. -.It rename Ar from-principal Ar to-principal -Renames all entries in the keytab that match the -.Ar from-principal -to -.Ar to-principal . -.It purge Op Fl Fl age= Ns Ar age -Removes all old versions of a key for which there is a newer version -that is at least -.Ar age -(default one week) old. -.El -.Sh SEE ALSO -.Xr kadmin 8 diff --git a/crypto/heimdal/admin/ktutil.cat1 b/crypto/heimdal/admin/ktutil.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/admin/ktutil.cat1 @@ -0,0 +1,70 @@ +KTUTIL(1) BSD General Commands Manual KTUTIL(1) + +NAME + ktutil -- manage Kerberos keytabs + +SYNOPSIS + ktutil [-k keytab | --keytab=keytab] [-v | --verbose] [--version] + [-h | --help] command [args] + +DESCRIPTION + ktutil is a program for managing keytabs. Supported options: + + -v, --verbose + Verbose output. + + command can be one of the following: + + add [-p principal] [--principal=principal] [-V kvno] [--kvno=kvno] [-e + enctype] [--enctype=enctype] [-w password] + [--password=password] [-r] [--random] [-s] [--no-salt] [-H] + [--hex] + Adds a key to the keytab. Options that are not specified will + be prompted for. This requires that you know the password or + the hex key of the principal to add; if what you really want + is to add a new principal to the keytab, you should consider + the get command, which talks to the kadmin server. + + change [-r realm] [--realm=realm] [--a host] [--admin-server=host] [--s + port] [--server-port=port] + Update one or several keys to new versions. By default, use + the admin server for the realm of a keytab entry. Otherwise + it will use the values specified by the options. + + If no principals are given, all the ones in the keytab are + updated. + + copy keytab-src keytab-dest + Copies all the entries from keytab-src to keytab-dest. + + get [-p admin principal] [--principal=admin principal] [-e enctype] + [--enctypes=enctype] [-r realm] [--realm=realm] [-a admin + server] [--admin-server=admin server] [-s server port] + [--server-port=server port] principal ... + For each principal, generate a new key for it (creating it if + it doesn't already exist), and put that key in the keytab. + + If no realm is specified, the realm to operate on is taken + from the first principal. + + list [--keys] [--timestamp] + List the keys stored in the keytab. + + remove [-p principal] [--principal=principal] [-V -kvno] [--kvno=kvno] + [-e -enctype] [--enctype=enctype] + Removes the specified key or keys. Not specifying a kvno re- + moves keys with any version number. Not specifying an enctype + removes keys of any type. + + rename from-principal to-principal + Renames all entries in the keytab that match the + from-principal to to-principal. + + purge [--age=age] + Removes all old versions of a key for which there is a newer + version that is at least age (default one week) old. + +SEE ALSO + kadmin(1) + +HEIMDAL April 14, 2005 HEIMDAL diff --git a/crypto/heimdal/admin/list.c b/crypto/heimdal/admin/list.c --- a/crypto/heimdal/admin/list.c +++ b/crypto/heimdal/admin/list.c @@ -132,11 +132,12 @@ for (i = 0; i< entry.aliases->len; i++) { krb5_unparse_name_fixed(context, entry.principal, buf, sizeof(buf)); - rk_strpoolprintf(p, "%s%s", buf, - i + 1 < entry.aliases->len ? ", " : ""); + p = rk_strpoolprintf(p, "%s%s", buf, + i + 1 < entry.aliases->len ? ", " : ""); } - rtbl_add_column_entry_by_id(table, 5, rk_strpoolcollect(p)); + rtbl_add_column_entry_by_id(table, 5, (s = rk_strpoolcollect(p))); + free(s); } krb5_kt_free_entry(context, &entry); diff --git a/crypto/heimdal/appl/Makefile.am b/crypto/heimdal/appl/Makefile.am --- a/crypto/heimdal/appl/Makefile.am +++ b/crypto/heimdal/appl/Makefile.am @@ -8,21 +8,16 @@ if DCE dir_dce = dceutils endif +if !NO_AFS +dir_afsutil = afsutil +endif SUBDIRS = \ - afsutil \ - ftp \ - login \ + $(dir_afsutil) \ + dbutils \ $(dir_otp) \ gssmask \ - popper \ - push \ - rsh \ - rcp \ su \ - xnlock \ - telnet \ test \ - kx \ kf \ $(dir_dce) diff --git a/crypto/heimdal/appl/Makefile.in b/crypto/heimdal/appl/Makefile.in --- a/crypto/heimdal/appl/Makefile.in +++ b/crypto/heimdal/appl/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,14 +93,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common subdir = appl ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -57,8 +107,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -71,6 +120,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -90,28 +140,67 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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 +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-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 = afsutil ftp login otp gssmask popper push rsh rcp su \ - xnlock telnet test kx kf dceutils +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = afsutil dbutils otp gssmask su test kf dceutils +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ @@ -141,7 +230,9 @@ ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -156,16 +247,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -175,17 +269,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -204,12 +300,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -218,6 +311,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -234,10 +328,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -245,6 +337,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -259,12 +352,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -281,10 +377,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -295,13 +397,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -325,6 +421,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -348,9 +446,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -360,46 +463,47 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; @OTP_TRUE@dir_otp = otp @DCE_TRUE@dir_dce = dceutils +@NO_AFS_FALSE@dir_afsutil = afsutil SUBDIRS = \ - afsutil \ - ftp \ - login \ + $(dir_afsutil) \ + dbutils \ $(dir_otp) \ gssmask \ - popper \ - push \ - rsh \ - rcp \ su \ - xnlock \ - telnet \ test \ - kx \ kf \ $(dir_dce) @@ -407,7 +511,7 @@ all: all-recursive .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -420,15 +524,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign appl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign appl/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -446,22 +550,25 @@ -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): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# 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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + 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; \ @@ -476,57 +583,12 @@ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(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; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && 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 +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -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) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -542,12 +604,7 @@ 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -559,15 +616,11 @@ $$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; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -576,11 +629,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -612,13 +682,10 @@ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || 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; \ @@ -657,10 +724,15 @@ installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -699,9 +771,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-recursive install-html-am: @@ -741,40 +812,53 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ - ctags-recursive install-am install-data-am install-exec-am \ - install-strip tags-recursive uninstall-am - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool ctags ctags-recursive dist-hook \ - 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-data-hook \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook 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 \ +.MAKE: $(am__recursive_targets) check-am install-am install-data-am \ + install-strip uninstall-am + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + check check-am check-local clean clean-generic clean-libtool \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook 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 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-hook + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -782,7 +866,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -827,11 +911,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -839,6 +932,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -881,6 +976,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -894,13 +1002,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/appl/NTMakefile b/crypto/heimdal/appl/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl + +!include ../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/afsutil/Makefile.am b/crypto/heimdal/appl/afsutil/Makefile.am --- a/crypto/heimdal/appl/afsutil/Makefile.am +++ b/crypto/heimdal/appl/afsutil/Makefile.am @@ -2,8 +2,6 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_krb4) - bin_PROGRAMS = afslog pagsh afslog_SOURCES = afslog.c @@ -13,7 +11,6 @@ man_MANS = afslog.1 pagsh.1 LDADD = $(LIB_kafs) \ - $(LIB_krb4) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_hcrypto) \ diff --git a/crypto/heimdal/appl/afsutil/Makefile.in b/crypto/heimdal/appl/afsutil/Makefile.in --- a/crypto/heimdal/appl/afsutil/Makefile.in +++ b/crypto/heimdal/appl/afsutil/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,15 +94,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog bin_PROGRAMS = afslog$(EXEEXT) pagsh$(EXEEXT) subdir = appl/afsutil ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -59,8 +109,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -73,6 +122,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -92,6 +142,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -102,33 +153,65 @@ afslog_OBJECTS = $(am_afslog_OBJECTS) afslog_LDADD = $(LDADD) am__DEPENDENCIES_1 = -am__DEPENDENCIES_2 = $(top_builddir)/lib/kafs/libkafs.la \ - $(am__DEPENDENCIES_1) -afslog_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ +@NO_AFS_FALSE@am__DEPENDENCIES_2 = \ +@NO_AFS_FALSE@ $(top_builddir)/lib/kafs/libkafs.la \ +@NO_AFS_FALSE@ $(am__DEPENDENCIES_1) +afslog_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = am_pagsh_OBJECTS = pagsh.$(OBJEXT) pagsh_OBJECTS = $(am_pagsh_OBJECTS) pagsh_LDADD = $(LDADD) -pagsh_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \ +pagsh_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/afslog.Po ./$(DEPDIR)/pagsh.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(afslog_SOURCES) $(pagsh_SOURCES) DIST_SOURCES = $(afslog_SOURCES) $(pagsh_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/||"`;; \ @@ -150,15 +233,42 @@ 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 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -173,16 +283,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -192,17 +305,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -221,12 +336,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -235,6 +347,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -251,10 +364,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -262,6 +373,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -276,12 +388,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -298,10 +413,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -312,13 +433,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -342,6 +457,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -365,9 +482,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -377,34 +499,41 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_krb4) +AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; afslog_SOURCES = afslog.c pagsh_SOURCES = pagsh.c man_MANS = afslog.1 pagsh.1 LDADD = $(LIB_kafs) \ - $(LIB_krb4) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_hcrypto) \ @@ -414,7 +543,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -427,15 +556,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign appl/afsutil/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign appl/afsutil/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -447,14 +576,19 @@ $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -475,7 +609,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -488,12 +623,14 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -afslog$(EXEEXT): $(afslog_OBJECTS) $(afslog_DEPENDENCIES) + +afslog$(EXEEXT): $(afslog_OBJECTS) $(afslog_DEPENDENCIES) $(EXTRA_afslog_DEPENDENCIES) @rm -f afslog$(EXEEXT) - $(LINK) $(afslog_OBJECTS) $(afslog_LDADD) $(LIBS) -pagsh$(EXEEXT): $(pagsh_OBJECTS) $(pagsh_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(afslog_OBJECTS) $(afslog_LDADD) $(LIBS) + +pagsh$(EXEEXT): $(pagsh_OBJECTS) $(pagsh_DEPENDENCIES) $(EXTRA_pagsh_DEPENDENCIES) @rm -f pagsh$(EXEEXT) - $(LINK) $(pagsh_OBJECTS) $(pagsh_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(pagsh_OBJECTS) $(pagsh_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -501,29 +638,35 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afslog.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pagsh.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afslog.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pagsh.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -532,11 +675,18 @@ -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -565,30 +715,17 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -600,15 +737,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -617,24 +750,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -685,10 +822,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -705,7 +847,8 @@ clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/afslog.Po + -rm -f ./$(DEPDIR)/pagsh.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -729,9 +872,8 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local + install-html: install-html-am install-html-am: @@ -753,7 +895,8 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/afslog.Po + -rm -f ./$(DEPDIR)/pagsh.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -775,40 +918,54 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libtool ctags \ - dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ - install-man install-man1 install-pdf install-pdf-am install-ps \ +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook 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-man1 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 \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-hook \ uninstall-man uninstall-man1 +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -816,7 +973,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -861,11 +1018,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -873,6 +1039,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -915,6 +1083,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -928,13 +1109,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/appl/afsutil/NTMakefile b/crypto/heimdal/appl/afsutil/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/afsutil/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\afsutil + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/afsutil/afslog.1 b/crypto/heimdal/appl/afsutil/afslog.1 --- a/crypto/heimdal/appl/afsutil/afslog.1 +++ b/crypto/heimdal/appl/afsutil/afslog.1 @@ -40,7 +40,6 @@ .Sh SYNOPSIS .Nm .Op Fl h | Fl Fl help -.Op Fl Fl no-v4 .Op Fl Fl no-v5 .Op Fl u | Fl Fl unlog .Op Fl v | Fl Fl verbose @@ -76,10 +75,6 @@ .Pp Supported options: .Bl -tag -width Ds -.It Fl Fl no-v4 -This makes -.Nm -not try using Kerberos 4. .It Fl Fl no-v5 This makes .Nm diff --git a/crypto/heimdal/appl/afsutil/afslog.c b/crypto/heimdal/appl/afsutil/afslog.c --- a/crypto/heimdal/appl/afsutil/afslog.c +++ b/crypto/heimdal/appl/afsutil/afslog.c @@ -61,15 +61,16 @@ { "cell", 'c', arg_strings, &cells, "cells to get tokens for", "cell" }, { "file", 'p', arg_strings, &files, "files to get tokens for", "path" }, { "realm", 'k', arg_string, &realm, "realm for afs cell", "realm" }, - { "unlog", 'u', arg_flag, &unlog_flag, "remove tokens" }, + { "unlog", 'u', arg_flag, &unlog_flag, "remove tokens", NULL }, #ifdef KRB5 { "principal",'P',arg_string,&client_string,"principal to use","principal"}, { "cache", 0, arg_string, &cache_string, "ccache to use", "cache"}, - { "v5", 0, arg_negative_flag, &use_krb5, "don't use Kerberos 5" }, + { "v5", 0, arg_negative_flag, &use_krb5, "don't use Kerberos 5", + NULL }, #endif - { "verbose",'v', arg_flag, &verbose }, - { "version", 0, arg_flag, &version_flag }, - { "help", 'h', arg_flag, &help_flag }, + { "verbose",'v', arg_flag, &verbose, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, }; static int num_args = sizeof(args) / sizeof(args[0]); @@ -103,12 +104,12 @@ { FILE *f; const char *c; - const char **fn, *files[] = { _PATH_CELLSERVDB, - _PATH_ARLA_CELLSERVDB, - _PATH_OPENAFS_DEBIAN_CELLSERVDB, - _PATH_ARLA_DEBIAN_CELLSERVDB, - NULL }; - for(fn = files; *fn; fn++) { + const char **fn, *fns[] = { _PATH_CELLSERVDB, + _PATH_ARLA_CELLSERVDB, + _PATH_OPENAFS_DEBIAN_CELLSERVDB, + _PATH_ARLA_DEBIAN_CELLSERVDB, + NULL }; + for(fn = fns; *fn; fn++) { f = fopen(*fn, "r"); if(f == NULL) continue; @@ -211,7 +212,7 @@ int main(int argc, char **argv) { - int optind = 0; + int optidx = 0; int i; int num; int ret = 0; @@ -220,7 +221,7 @@ setprogname(argv[0]); - if(getarg(args, num_args, argc, argv, &optind)) + if(getarg(args, num_args, argc, argv, &optidx)) usage(1); if(help_flag) usage(0); @@ -277,7 +278,7 @@ num++; } free_getarg_strings (&cells); - for(i = optind; i < argc; i++){ + for(i = optidx; i < argc; i++){ num++; if(strcmp(argv[i], ".") == 0 || strcmp(argv[i], "..") == 0 || diff --git a/crypto/heimdal/appl/afsutil/afslog.cat1 b/crypto/heimdal/appl/afsutil/afslog.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/afsutil/afslog.cat1 @@ -0,0 +1,65 @@ +AFSLOG(1) BSD General Commands Manual AFSLOG(1) + +NAME + afslog -- obtain AFS tokens + +SYNOPSIS + afslog [-h | --help] [--no-v5] [-u | --unlog] [-v | --verbose] + [--version] [-c cell | --cell=cell] [-k realm | --realm=realm] [-P + principal | --principal=principal] [-p path | --file=path] + [cell | path ...] + +DESCRIPTION + afslog obtains AFS tokens for a number of cells. What cells to get tokens + for can either be specified as an explicit list, as file paths to get to- + kens for, or be left unspecified, in which case afslog will use whatever + magic krb_afslog(3) decides upon. + + Supported options: + + --no-v5 + This makes afslog not try using Kerberos 5. + + -P principal, --principal principal + select what Kerberos 5 principal to use. + + --cache cache + select what Kerberos 5 credential cache to use. --principal + overrides this option. + + -u, --unlog + Destroy tokens instead of obtaining new. If this is specified, + all other options are ignored (except for --help and --version). + + -v, --verbose + Adds more verbosity for what is actually going on. + + -c cell, --cell=cell + This specified one or more cell names to get tokens for. + + -k realm, --realm=realm + This is the Kerberos realm the AFS servers live in, this should + normally not be specified. + + -p path, --file=path + This specified one or more file paths for which tokens should be + obtained. + + Instead of using -c and -p, you may also pass a list of cells and file + paths after any other options. These arguments are considered files if + they are either the strings "." or ".." or they contain a slash, or if + there exists a file by that name. + +EXAMPLES + Assuming that there is no file called "openafs.org" in the current direc- + tory, and that /afs/openafs.org points to that cell, the follwing should + be identical: + + $ afslog -c openafs.org + $ afslog openafs.org + $ afslog /afs/openafs.org/some/file + +SEE ALSO + krb_afslog(3) + +HEIMDAL November 26, 2002 HEIMDAL diff --git a/crypto/heimdal/appl/afsutil/pagsh.1 b/crypto/heimdal/appl/afsutil/pagsh.1 --- a/crypto/heimdal/appl/afsutil/pagsh.1 +++ b/crypto/heimdal/appl/afsutil/pagsh.1 @@ -33,7 +33,7 @@ .\" .Dd February 12, 2005 .Dt PAGSH 1 -.Os Heimdal +.Os .Sh NAME .Nm pagsh .Nd creates a new credential cache sandbox diff --git a/crypto/heimdal/appl/afsutil/pagsh.c b/crypto/heimdal/appl/afsutil/pagsh.c --- a/crypto/heimdal/appl/afsutil/pagsh.c +++ b/crypto/heimdal/appl/afsutil/pagsh.c @@ -73,12 +73,12 @@ #endif struct getargs getargs[] = { - { NULL, 'c', arg_flag, &c_flag }, + { NULL, 'c', arg_flag, &c_flag, NULL, NULL }, #ifdef KRB5 - { "cache-type", 0, arg_string, &typename_arg }, + { "cache-type", 0, arg_string, &typename_arg, NULL, NULL }, #endif - { "version", 0, arg_flag, &version_flag }, - { "help", 'h', arg_flag, &help_flag }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, }; static int num_args = sizeof(getargs) / sizeof(getargs[0]); @@ -104,10 +104,10 @@ char *path; char **args; unsigned int i; - int optind = 0; + int optidx = 0; setprogname(argv[0]); - if(getarg(getargs, num_args, argc, argv, &optind)) + if(getarg(getargs, num_args, argc, argv, &optidx)) usage(1); if(help_flag) usage(0); @@ -116,8 +116,8 @@ exit(0); } - argc -= optind; - argv += optind; + argc -= optidx; + argv += optidx; #ifdef KRB5 { diff --git a/crypto/heimdal/appl/afsutil/pagsh.cat1 b/crypto/heimdal/appl/afsutil/pagsh.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/afsutil/pagsh.cat1 @@ -0,0 +1,46 @@ +PAGSH(1) BSD General Commands Manual PAGSH(1) + +NAME + pagsh -- creates a new credential cache sandbox + +SYNOPSIS + pagsh [-c command-string] [-h | --help] [--version] [--cache-type=string] + command [args...] + +DESCRIPTION + Supported options: + + -c command-string Executes command(s) contained in command-string. + + --cache-type=string + + -h, --help + + --version + + pagsh creates a new credential cache sandbox for the user to live in. If + AFS is installed on the computer, the user is put in a newly created + Process Authentication Group (PAG). + + For Kerberos 5, the credential cache type that is used is the same as the + credential cache type that was used at the time of pagsh invocation. The + credential cache type can be controlled by the option --cache-type. + +EXAMPLES + Create a new sandbox where new credentials can be used, while the old + credentials can be used by other processes. + + $ klist + Credentials cache: FILE:/tmp/krb5cc_913 + Principal: lha@E.KTH.SE + + Issued Expires Principal + Feb 12 10:08:31 Feb 12 20:06:36 krbtgt/E.KTH.SE@E.KTH.SE + $ pagsh + $ klist + klist: No ticket file: /tmp/krb5cc_03014a + +SEE ALSO + afslog(1), kinit(1) + +BSD February 12, 2005 BSD diff --git a/crypto/heimdal/appl/dbutils/Makefile.am b/crypto/heimdal/appl/dbutils/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dbutils/Makefile.am @@ -0,0 +1,13 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +bin_PROGRAMS = bsearch + +bsearch_SOURCES = bsearch.c + +man_MANS = bsearch.1 + +EXTRA_DIST = NTMakefile $(man_MANS) + +LDADD = $(LIB_roken) $(LIB_vers) $(LIB_heimbase) diff --git a/crypto/heimdal/appl/dbutils/Makefile.in b/crypto/heimdal/appl/dbutils/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dbutils/Makefile.in @@ -0,0 +1,1124 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +bin_PROGRAMS = bsearch$(EXEEXT) +subdir = appl/dbutils +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_bsearch_OBJECTS = bsearch.$(OBJEXT) +bsearch_OBJECTS = $(am_bsearch_OBJECTS) +bsearch_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +bsearch_DEPENDENCIES = $(am__DEPENDENCIES_1) $(LIB_heimbase) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/bsearch.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(bsearch_SOURCES) +DIST_SOURCES = $(bsearch_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 +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +bsearch_SOURCES = bsearch.c +man_MANS = bsearch.1 +EXTRA_DIST = NTMakefile $(man_MANS) +LDADD = $(LIB_roken) $(LIB_vers) $(LIB_heimbase) +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/dbutils/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign appl/dbutils/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 + +bsearch$(EXEEXT): $(bsearch_OBJECTS) $(bsearch_DEPENDENCIES) $(EXTRA_bsearch_DEPENDENCIES) + @rm -f bsearch$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(bsearch_OBJECTS) $(bsearch_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsearch.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +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) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) all-local +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(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." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/bsearch.Po + -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-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +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-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 ./$(DEPDIR)/bsearch.Po + -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-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +uninstall-man: uninstall-man1 + +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook 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-man1 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 tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-hook \ + uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +# 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: diff --git a/crypto/heimdal/appl/dbutils/NTMakefile b/crypto/heimdal/appl/dbutils/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dbutils/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\dbutils + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/dbutils/bsearch.1 b/crypto/heimdal/appl/dbutils/bsearch.1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dbutils/bsearch.1 @@ -0,0 +1,115 @@ +.\" +.\" Copyright (c) 2011, Secure Endpoints Inc. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" - Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" - Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in +.\" the documentation and/or other materials provided with the +.\" distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +.\" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +.\" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +.\" FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +.\" COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +.\" INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +.\" OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd November 30, 2011 +.Dt BSEARCH 1 +.Os KTH-KRB +.Sh NAME +.Nm bsearch +.Nd manages one-time passwords +.Sh SYNOPSIS +.Nm bsearch +.Op Fl KVvh +.Op Fl b Ar block-size +.Op Fl m Ar max-cache-size +.Ar file +.Ar [key ...] +.Sh DESCRIPTION +The +.Nm +program performs binary searches of +.Ar file +which must be a sorted flat text file. +.Pp +Each line is a record. Each record starts with a key +that is optionally followed by whitespace and a value. +Whitespace may be quoted with a backslash, but newline +and carriage-return characters must be quoted in some +other manner (e.g., as backslash-n and backslash-r). +Escapes are not interpreted nor removed. +.Pp +If no key arguments are given on the comman-line, then +keys will be read from standard input. +.Pp +By default only values are printed to standard output. +Use the -K option to also print keys. The exit status +will be non-zero if any key lookups fail. +.Pp +Options are: +.Bl -tag -width Ds +.It Fl K +Print keys. +.It Fl V +Don't print values. +.It Fl h +Print usage and exit. +.It Fl v +Print statistic and debug information to standard +error. +.Ar file +A sorted flat text file. NOTE: use the "C" locale for +sorting this file, as in "LC_ALL=C sort -u -o file +file". +.It Fl h +For getting a help message. +.It Fl m +Set +.Ar max-cache-size +as the maximum cache size. If the +.Ar file +is smaller than this size then the whole file will be +read into memory, else the program will read blocks. +Defaults to 1MB. +.It Fl b +Set +.Ar block-size +as the block size for block-wise I/O. This must be a +power of 2, must be no smaller than 512 and no larger +than 1MB. Defaults to the +.Ar file's +filesystem's preferred blocksize. +.El +.Sh EXAMPLES +.Bd -literal -offset indent +$ env LC_ALL=C sort -o /tmp/words /usr/share/dict/words +$ bsearch -Kv /tmp/words day +Using whole-file method +Key day found at offset 327695 in 12 loops and 0 reads +day +$ +.Ed +.Sh NOTES +.Pp +Records must not be longer than one block's size. +.Pp +Flat text files must be sorted in the "C" locale. In +some systems the default locale may result in +case-insensitive sorting by the sort command. +.Sh SEE ALSO +.Xr sort 1 diff --git a/crypto/heimdal/appl/dbutils/bsearch.c b/crypto/heimdal/appl/dbutils/bsearch.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dbutils/bsearch.c @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2011, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int help_flag; +int version_flag; +int verbose_flag; +int print_keys_flag; +int no_values_flag; +int block_size_int; +int max_size_int; + +struct getargs args[] = { + { "print-keys", 'K', arg_flag, &print_keys_flag, + "print keys", NULL }, + { "no-values", 'V', arg_flag, &no_values_flag, + "don't print values", NULL }, + { "verbose", 'v', arg_flag, &verbose_flag, + "print statistics and informative messages", NULL }, + { "help", 'h', arg_flag, &help_flag, + "print usage message", NULL }, + { "block-size", 'b', arg_integer, &block_size_int, + "block size", "integer" }, + { "max-cache-size", 'm', arg_integer, &max_size_int, + "maximum cache size", "integer" }, + { "version", '\0', arg_flag, &version_flag, NULL, NULL } +}; + +static int num_args = sizeof(args) / sizeof(args[0]); + +static void +usage(int status) +{ + arg_printusage(args, num_args, NULL, "file [key ...]"); + exit(status); +} + +#define MAX_BLOCK_SIZE (1024 * 1024) +#define DEFAULT_MAX_FILE_SIZE (1024 * 1024) + +int +main(int argc, char **argv) +{ + char keybuf[1024]; + char *fname; + char *key = keybuf; + char *value; + char *p; + bsearch_file_handle bfh = NULL; + size_t num; + size_t loc; /* index where record is located or to be inserted */ + size_t loops; /* number of loops/comparisons needed for lookup */ + size_t reads = 0; /* number of reads needed for a lookup */ + size_t failures = 0; /* number of lookup failures -- for exit status */ + size_t block_size = 0; + size_t max_size = 0; + int optidx = 0; + int blockwise; + int ret = 0; + + setprogname(argv[0]); + if (getarg(args, num_args, argc, argv, &optidx)) + usage(1); + + if (version_flag) { + print_version(NULL); + return 0; + } + + if (help_flag) + usage(0); + + if (block_size_int != 0 && block_size_int < 512) { + fprintf(stderr, "Invalid block size: too small\n"); + return 1; + } + if (block_size_int > 0) { + /* Check that block_size is a power of 2 */ + num = block_size_int; + while (num) { + if ((num % 2) && (num >> 1)) { + fprintf(stderr, "Invalid block size: must be power " + "of two\n"); + return 1; + } + num >>= 1; + } + if (block_size_int > MAX_BLOCK_SIZE) + fprintf(stderr, "Invalid block size: too large\n"); + block_size = block_size_int; + } + if (max_size_int < 0) + usage(1); + max_size = max_size_int; + + argc -= optind; + argv += optind; + + if (argc == 0) + usage(1); + + fname = argv[0]; + argc--; + argv++; + + ret = _bsearch_file_open(fname, max_size, block_size, &bfh, &reads); + if (ret != 0) { + perror("bsearch_file_open"); + return 1; + } + + _bsearch_file_info(bfh, &block_size, &max_size, &blockwise); + if (verbose_flag && blockwise) { + fprintf(stderr, "Using block-wise method with block size %lu and " + "cache size %lu\n", + (long unsigned)block_size, (long unsigned)max_size); + } else if (verbose_flag) { + fprintf(stderr, "Using whole-file method\n"); + } + + for (;;) { + loops = 0; /* reset stats */ + /* Eww */ + if (argc) { + key = *(argv++); + if (!key) + break; + } else { + if (!fgets(keybuf, sizeof (keybuf), stdin)) + break; + p = strchr(key, '\n'); + if (!p) + break; + *p = '\0'; + if (!*key) + continue; + } + ret = _bsearch_file(bfh, key, &value, &loc, &loops, &reads); + if (ret != 0) { + if (ret > 0) { + fprintf(stderr, "Error: %s\n", strerror(ret)); + _bsearch_file_close(&bfh); + return 1; + } + if (verbose_flag) + fprintf(stderr, "Key %s not found in %lu loops and %lu reads; " + "insert at %lu\n", key, (long unsigned)loops, + (long unsigned)reads, (long unsigned)loc); + failures++; + continue; + } + if (verbose_flag) + fprintf(stderr, "Key %s found at offset %lu in %lu loops and " + "%lu reads\n", key, (long unsigned)loc, + (long unsigned)loops, (long unsigned)reads); + if (print_keys_flag && !no_values_flag && value) + printf("%s %s\n", key, value); + else if (print_keys_flag) + printf("%s\n", key); + else if (no_values_flag && value) + printf("%s\n", value); + free(value); + } + if (failures) + return 2; + _bsearch_file_close(&bfh); + return 0; +} diff --git a/crypto/heimdal/appl/dbutils/bsearch.cat1 b/crypto/heimdal/appl/dbutils/bsearch.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dbutils/bsearch.cat1 @@ -0,0 +1,66 @@ +BSEARCH(1) BSD General Commands Manual BSEARCH(1) + +NAME + bsearch -- manages one-time passwords + +SYNOPSIS + bsearch [-KVvh] [-b block-size] [-m max-cache-size] file [key ...] + +DESCRIPTION + The bsearch program performs binary searches of file which must be a + sorted flat text file. + + Each line is a record. Each record starts with a key that is optionally + followed by whitespace and a value. Whitespace may be quoted with a + backslash, but newline and carriage-return characters must be quoted in + some other manner (e.g., as backslash-n and backslash-r). Escapes are + not interpreted nor removed. + + If no key arguments are given on the comman-line, then keys will be read + from standard input. + + By default only values are printed to standard output. Use the -K option + to also print keys. The exit status will be non-zero if any key lookups + fail. + + Options are: + + -K Print keys. + + -V Don't print values. + + -h Print usage and exit. + + -v Print statistic and debug information to standard error. file A + sorted flat text file. NOTE: use the "C" locale for sorting this + file, as in "LC_ALL=C sort -u -o file file". + + -h For getting a help message. + + -m Set max-cache-size as the maximum cache size. If the file is + smaller than this size then the whole file will be read into mem- + ory, else the program will read blocks. Defaults to 1MB. + + -b Set block-size as the block size for block-wise I/O. This must + be a power of 2, must be no smaller than 512 and no larger than + 1MB. Defaults to the file's filesystem's preferred blocksize. + +EXAMPLES + $ env LC_ALL=C sort -o /tmp/words /usr/share/dict/words + $ bsearch -Kv /tmp/words day + Using whole-file method + Key day found at offset 327695 in 12 loops and 0 reads + day + $ + +NOTES + Records must not be longer than one block's size. + + Flat text files must be sorted in the "C" locale. In some systems the + default locale may result in case-insensitive sorting by the sort com- + mand. + +SEE ALSO + sort(1) + +KTH-KRB November 30, 2011 KTH-KRB diff --git a/crypto/heimdal/appl/dceutils/ChangeLog b/crypto/heimdal/appl/dceutils/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/ChangeLog @@ -0,0 +1,39 @@ +2007-12-13 Love Hörnquist Åstrand + + * Makefile.am: Add missing files, from Buchan Milne. + +2006-08-08 Love Hörnquist Åstrand + + * k5dcecon.c: Check for seteuid failure, prompted by MIT advisory. + +2005-04-06 Love Hörnquist Åstrand + + * testpag.c: use NULL as last argument to execl, not 0 + +2002-08-12 Johan Danielsson + + * Makefile.am: rename dpagaix_LDFLAGS etc to appease automake + +2001-08-24 Assar Westerlund + + * Makefile.am (dpagaix): make sure of using $(EXEEXT) just to + please automake (this is aix-only code) + +2001-02-07 Assar Westerlund + + * Makefile.am (dpagaix): needs to be linked with ld, add an + explicit command for it. from Ake Sandgren + +2000-10-02 Assar Westerlund + + * Makefile.am: link with roken on everything except irix, where + apperently it fails. reported by Ake Sandgren + +2000-07-17 Johan Danielsson + + * Makefile.am: set compiler flags + +2000-07-01 Assar Westerlund + + * imported stuff from Ake Sandgren + diff --git a/crypto/heimdal/appl/dceutils/Makefile.am b/crypto/heimdal/appl/dceutils/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/Makefile.am @@ -0,0 +1,37 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + + +DFSPROGS = k5dcecon +if AIX +AIX_DFSPROGS = dpagaix +endif + +libexec_PROGRAMS = $(DFSPROGS) $(AIX_DFSPROGS) + +dpagaix_CFLAGS = $(dpagaix_cflags) +dpagaix_LDFLAGS = $(dpagaix_ldflags) +dpagaix_LDADD = $(dpagaix_ldadd) + +dpagaix$(EXEEXT): $(dpagaix_OBJECTS) + ld -edpagaix -o dpagaix$(EXEEXT) $(dpagaix_OBJECTS) $(srcdir)/dfspag.exp + +LIB_dce = -ldce + +k5dcecon_SOURCES = k5dcecon.c k5dce.h + +dpagaix_SOURCES = dpagaix.c + +EXTRA_DIST = \ + NTMakefile \ + dfspag.exp \ + README.dcedfs \ + README.original \ + testpag.c + +if IRIX +LDADD = $(LIB_dce) +else +LDADD = $(LIB_roken) $(LIB_dce) +endif diff --git a/crypto/heimdal/appl/dceutils/Makefile.in b/crypto/heimdal/appl/dceutils/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/Makefile.in @@ -0,0 +1,1096 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +libexec_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) +subdir = appl/dceutils +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = k5dcecon$(EXEEXT) +@AIX_TRUE@am__EXEEXT_2 = dpagaix$(EXEEXT) +am__installdirs = "$(DESTDIR)$(libexecdir)" +PROGRAMS = $(libexec_PROGRAMS) +am_dpagaix_OBJECTS = dpagaix-dpagaix.$(OBJEXT) +dpagaix_OBJECTS = $(am_dpagaix_OBJECTS) +am__DEPENDENCIES_1 = +dpagaix_DEPENDENCIES = $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +dpagaix_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(dpagaix_CFLAGS) \ + $(CFLAGS) $(dpagaix_LDFLAGS) $(LDFLAGS) -o $@ +am_k5dcecon_OBJECTS = k5dcecon.$(OBJEXT) +k5dcecon_OBJECTS = $(am_k5dcecon_OBJECTS) +k5dcecon_LDADD = $(LDADD) +@IRIX_FALSE@k5dcecon_DEPENDENCIES = $(am__DEPENDENCIES_1) \ +@IRIX_FALSE@ $(am__DEPENDENCIES_1) +@IRIX_TRUE@k5dcecon_DEPENDENCIES = $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/dpagaix-dpagaix.Po \ + ./$(DEPDIR)/k5dcecon.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(dpagaix_SOURCES) $(k5dcecon_SOURCES) +DIST_SOURCES = $(dpagaix_SOURCES) $(k5dcecon_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +DFSPROGS = k5dcecon +@AIX_TRUE@AIX_DFSPROGS = dpagaix +dpagaix_CFLAGS = $(dpagaix_cflags) +dpagaix_LDFLAGS = $(dpagaix_ldflags) +dpagaix_LDADD = $(dpagaix_ldadd) +LIB_dce = -ldce +k5dcecon_SOURCES = k5dcecon.c k5dce.h +dpagaix_SOURCES = dpagaix.c +EXTRA_DIST = \ + NTMakefile \ + dfspag.exp \ + README.dcedfs \ + README.original \ + testpag.c + +@IRIX_FALSE@LDADD = $(LIB_roken) $(LIB_dce) +@IRIX_TRUE@LDADD = $(LIB_dce) +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/dceutils/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign appl/dceutils/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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-libexecPROGRAMS: $(libexec_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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)$(libexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-libexecPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || 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)$(libexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libexecdir)" && rm -f $$files + +clean-libexecPROGRAMS: + @list='$(libexec_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 + +k5dcecon$(EXEEXT): $(k5dcecon_OBJECTS) $(k5dcecon_DEPENDENCIES) $(EXTRA_k5dcecon_DEPENDENCIES) + @rm -f k5dcecon$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(k5dcecon_OBJECTS) $(k5dcecon_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dpagaix-dpagaix.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/k5dcecon.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +dpagaix-dpagaix.o: dpagaix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpagaix_CFLAGS) $(CFLAGS) -MT dpagaix-dpagaix.o -MD -MP -MF $(DEPDIR)/dpagaix-dpagaix.Tpo -c -o dpagaix-dpagaix.o `test -f 'dpagaix.c' || echo '$(srcdir)/'`dpagaix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dpagaix-dpagaix.Tpo $(DEPDIR)/dpagaix-dpagaix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dpagaix.c' object='dpagaix-dpagaix.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpagaix_CFLAGS) $(CFLAGS) -c -o dpagaix-dpagaix.o `test -f 'dpagaix.c' || echo '$(srcdir)/'`dpagaix.c + +dpagaix-dpagaix.obj: dpagaix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpagaix_CFLAGS) $(CFLAGS) -MT dpagaix-dpagaix.obj -MD -MP -MF $(DEPDIR)/dpagaix-dpagaix.Tpo -c -o dpagaix-dpagaix.obj `if test -f 'dpagaix.c'; then $(CYGPATH_W) 'dpagaix.c'; else $(CYGPATH_W) '$(srcdir)/dpagaix.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/dpagaix-dpagaix.Tpo $(DEPDIR)/dpagaix-dpagaix.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dpagaix.c' object='dpagaix-dpagaix.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(dpagaix_CFLAGS) $(CFLAGS) -c -o dpagaix-dpagaix.obj `if test -f 'dpagaix.c'; then $(CYGPATH_W) 'dpagaix.c'; else $(CYGPATH_W) '$(srcdir)/dpagaix.c'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) all-local +installdirs: + for dir in "$(DESTDIR)$(libexecdir)"; 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-libexecPROGRAMS clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/dpagaix-dpagaix.Po + -rm -f ./$(DEPDIR)/k5dcecon.Po + -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local install-libexecPROGRAMS + +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 -f ./$(DEPDIR)/dpagaix-dpagaix.Po + -rm -f ./$(DEPDIR)/k5dcecon.Po + -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-libexecPROGRAMS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libexecPROGRAMS \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ + install-html-am install-info install-info-am \ + install-libexecPROGRAMS 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 tags-am uninstall uninstall-am uninstall-hook \ + uninstall-libexecPROGRAMS + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +dpagaix$(EXEEXT): $(dpagaix_OBJECTS) + ld -edpagaix -o dpagaix$(EXEEXT) $(dpagaix_OBJECTS) $(srcdir)/dfspag.exp + +# 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: diff --git a/crypto/heimdal/appl/dceutils/NTMakefile b/crypto/heimdal/appl/dceutils/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\dceutils + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/dceutils/README.dcedfs b/crypto/heimdal/appl/dceutils/README.dcedfs new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/README.dcedfs @@ -0,0 +1,59 @@ +This is a set of patches and files to get a DFS ticket from a k5 ticket. +This code comes from Doug Engert, Argonne Nat. Lab (See dce/README.original +for more info) + +The files in dce are; +testpag: for testing if this is at all possible. +k5dfspag: included in libkrb5 +k5dcecon: Creates (or searches for) the actual DFSPAG ticketfile. +dpagaix: An AIX syscall stub. +README.original: Original README file from Doug Engert + + +Certain applications (rshd/telnetd) have been patched to call the +functions in k5dfspag when the situation is right. They are ifdef +with DCE. The patches are also originally from Doug but they +where against MIT krb5 code and have been merged into heimdal by me. +I will try to fix ftpd soon... + +There is also an ifdefs for DCE && AIX that can be used to make AIX +use DCE for getting group/passwd entries. This is needed if one is running +with a bare bones passwd/group file and AUTHSTATE set to DCE (This will be +more or less clear to people doing this...) I have forced this on for now. + +k5dfspag.c is in lib/krb5 +k5dfspag.c is dependent on DCE only. +It is also POSIX systems only. There are defines for the location of +k5dcecon and dpagaix that needs a correct configure setting. + +k5dcecon needs no special things for the compile except whatever is needed +on the target system to compile dce programs. +(On aix the dce compile flags are: -D_THREAD_SAFE -D_AIX32_THREADS=1 -D_AIX41 -D_AES_SOURCE or one can use xlc_r4 if it is version 3.6.4 or later) + +k5dcecon wants the following libs (on aix 4.3): +-ldce (and setenv from somewhere) + +dpagaix is only needed on AIX (see k5dfspag.c). +dpagaix needs dfspag.exp and is linked with +ld -edpagaix -o dpagaix dpagaix.o dfspag.exp + + +Hope to get this into heimdal soon :-) although I know that you will have to +change some things to get it cleanly into configure. Since I don't know the +structure of the code (heimdal), nor enough of configure, good enough I +just won't try it myself. + +One more thing, to get this to work one has to put fcache_version = x in +krb5.conf where x = whatever the DCE implementation understands, (usually +1 or 2). +Thanks for adding that... + + +Åke Sandgren (ake@hpc2n.umu.se) +HPC2N +Umeå University +Sweden + +PS +I have now added patches for configure.in and some Makefile.am's to get this +all cleanly (I hope) into heimdal. diff --git a/crypto/heimdal/appl/dceutils/README.original b/crypto/heimdal/appl/dceutils/README.original new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/README.original @@ -0,0 +1,335 @@ +KERBEROS and DCE INTEROPERABILITY ROUTINES + +WHAT'S NEW + +When k5dcecon was examining the ticket caches looking to +update one with a newer TGT, it might update the wrong +one for the correct user. This problem was reported by PNNL, +and is now fixed. + +Any Kerberized application can now use a forwarded TGT to establish a +DCE context, or can use a previously established DCE context. This is +both a functional improvement and a performance improvement. + +BACKGROUND + +The MIT Kerberos 5 Release 1.x and DCE 1.1 can interoperate in a +number of ways. This is possible because: + + o DCE used Kerberos 5 internally. Based on the MIT code as of beta 4 + or so, with additional changes. + + o The DCE security server can act as a K5 KDC, as defined in RFC 1510 + and responds on port 88. + + o On the clients, DCE and Kerberos use the same format for the ticket + cache, and then can share it. The KRB5CCNAME environment variable points + at the cache. + + o On the clients, DCE and Kerberos use the same format for the srvtab + file. DCE refers to is a /krb5/v5srvtab and Kerberos as + /etc/krb5.keytab. They can be symlinked. + + o MIT has added many options to the krb5.conf configuration file + which allows newer features of Release 1.0 to be turned off to match + the earlier version of Kerberos upon which DCE is based. + + o DCE will accept a externally obtained Kerberos TGT in place of a + password when establishing a DCE context. + +There are some areas where they differ, including the following: + + o Administration of the database and the keytab files is done by the + DCE routines, rather the the Kerberos kadmin. + + o User password changes must be done using the DCE commands. Kpasswd + does not work. (But there are mods to Kerberos to use the v5passwd + with DCE. + + o DCE goes beyond authentication only, and provides authorization via + the PAC, and the dce-ptgt tickets stored in the cache. Thus a + Kerberos KDC can not act as a DCE security server. + + o A DCE cell and Kerberos realm can cross-realm authenticate, but + there can be no intermediate realms. (There are other problems + in this area as well. But directly connected realms/cells do work.) + + o You can't link a module with the DCE library and the Kerberos + library. They have conflicting routines, static data and structures. + +One of the main features of DCE is the Distributed File System +DFS. Access to DFS requires authentication and authorization, and when +one uses a Kerberized network utility such as telnet, a forwarded +Kerberos ticket can be used to establish the DCE context to allow +access to DFS. + + +NEW TO THIS RELEASE + +This release introduces sharing of a DCE context, and PAG, and allows +any Kerberized application to establish or share the context. This is +made possible by using an undocumented feature of DCE which is on at +least the Transarc and IBM releases of DCE 1.1. + +I am in the process of trying to get this contributed to the general +DCE 1.2.2 release as a patch, so it could be included in other vendors +products. HP has expressed interest in doing this, as well as the +OpenGroup if the modification is contributed. You can help by +requesting Transarc and/or IBM to submit this modification to the +OpenGroup and ask your vendor to adopt this modification. + +The feature is a modification to the setpag() system call which will +allow an authorized process to set the PAG to a specific value, and +thus allow unrelated processes to share the same PAG. + +This then allows the Kerberized daemons such as kshd, to exec a DCE +module which established the DCE context. Kshd then sets the +KRB5CCNAME environment variable and then issues the setpag() to use +this context. This solves the linking problem. This is done via the +k5dfspag.c routine. + +The k5dfspag.c code is compiled with the lib/krb5/os routines and +included in the libkrb5. A daemon calls krb5_dfs_pag after the +krb5_kuserok has determined that the Kerberos principal and local +userid pair are acceptable. This should be done early so as to give +the daemon access to the home directory which may be located on DFS. +If the .k5login file is used by krb5_kuserok it will need to be +accessed by the daemon and will need special ACL handling. + +The krb5_dfs_pag routine will exec the k5dcecon module to do all the +real work. Upon return, if a PAG is obtained, krb5_dfs_pag with set +the PAG for the current process to the returned PAG value. It will +also set the KRB5CCNAME environment as well. Under DCE the PAG value +is the nnnnnnn part of the name of the cache: +FILE:/opt/dcelocal/var/security/creds/dcecred_nnnnnnnn. + +The k5dcecon routine will attempt to use TGT which may have been +forwarded, to convert it to a DCE context. If there is no TGT, an +attempt will be made to join an existing PAG for the local userid, and +Kerberos principal. If there are existing PAGs, and a forwarded TGT, +k5dcecon will check the lifetime of the forwarded TGT, and if it is +less than the lifetime of the PAG, it will just join the PAG. If it +is greater, it will refresh the PAG using the forwarded TGT. +This approach has the advantage of not requiring many new tickets from +having to be obtained, and allows one to refresh a DCE context, or use +an already established context. + +If the system also has AFS, the AFS krb5_afs_pag should be called +after the krb5_dfs_pag, since cache pointed at via the KRB5CCNAME may +have changed, such as if a DFS PAG has been joined. The AFS code does +not have the capability to join an existing AFS PAG, but can use the +same cache which might already had a +afsx/@ service ticket. + + +WHAT'S IN THIS RELEASE + +The k5prelogin, k5dcelogin, k5afslogin (with ak5log) were designed to +be slipped in between telnetd or klogind and login.krb5. They would +use a forwarded Kerberos ticket to establish a DCE context. They are +the older programs which are included here. They work on all DCE +platforms, and don't take advantage of the undocumented setpag +feature. (A version of k5dcelogin is being included with DCE 1.2.2) + +K5dcecon is the new program which can be used to create, update or +join a DCE context. k5dcecon returns KRB5CCNAME string which contains +the PAG. + +k5dfspag.c is to be built in the MIT Kerberos 5 release 1.0 patchlevel +1 and added to the libkrb5. It will exec k5dcecon and upon return set +the KRB5CCNAME and PAG. Mods to Kerberized klogind, rshd, telnetd, +ftpd are available to use the k5dfspag. + +Testpag.c is a test programs to see if the PAG can be set. + +The cpwkey.c routine can be used to change a key in the DCE registry, +by adding the key directly, or by setting the salt/pepper and password +or by providing the key and the pepper. This could be useful when +coping keys from a K4 or AFS database to DCE. It can also be used when +setting a DCE to K5 cross-cell key. This program is a test program +For mass inserts, it should be rewritten to read from stdin. + +K5dcelogin can also be called directly, much like dce_login. +I use the following commands in effect do the same thing as dce_login +and get a forwardable ticket, DCE context and an AFS token: + + #!/bin/csh + # simulate a dce_login using krb5 kinit and k5dcelogin + # + setenv KRB5CCNAME FILE:/tmp/krb5cc_p$$ + /krb5/bin/kinit -f + exec /krb5/sbin/k5dcelogin /krb5/sbin/k5afslogin /bin/csh + #exec /krb5/sbin/k5dcelogin /bin/csh + +This could be useful in a mixed cell where "AS_REQ" messages are +handled by a K5 KDC, but DCE RPCs are handled by the DCE security +server. + +TESTING THE SETPAG + +The krb5_dfs_pag routine relies on an undocumented feature which is +in the AIX and Transarc Solaris ports of DCE and has been recently +added to the SGI version. To test if this feature is present +on some other DFS implementation use the testpag routine. + +The testpag routine attempts to set a PAG value to one you supply. It +uses the afs_syscall with the afs_setpag, and passes the supplied +PAG value as the next parameter. On an unmodifed system, this +will be ignored, and a new will be set. You should also check that +if run as a user, you cannot join a PAG owned by another user. +When run as root, any PAG should be usable. + +On a machine with DFS running, do a dce_login to get a DCE context and +PAG. ECHO the KRB5CCNAME and look at the nnnnnnnn at the end. It +should look like an 8 char hex value, which may be 41ffxxxx on some +systems. + +Su to root and unsetenv KRB5CCNAME. Do a testpag -n nnnnnnnn where +nnnnnnnn is the PAG obtained for the above name. + +It should look like this example on an AIX 4.1.4 system: + + pembroke# ./testpag -n 63dc9997 + calling k5dcepag newpag=63dc9997 + PAG returned = 63dc9997 + +You will be running under a new shell with the PAG and KRB5CCNAME set. +If the PAG returned is the same as the newpag, then it worked. You can +further verify this by doing a DCE klist, cd to DFS and a DCE klist +again. The klist should show some tickets for DFS servers. + +If the PAG returned is not the same, and repeated attempts show a +returned PAG decremented by 1 from the previous returned PAG, then +this system does not have the modification For example: + + # ./testpag -n 41fffff9 + calling k5dcepag newpag=41fffff9 + PAG returned = 41fffff8 + # ./testpag -n 41fffff9 + calling k5dcepag newpag=41fffff9 + PAG returned = 41fffff7 + +In this case the syscall is ignoring the newpag parameter. + +Running it with -n 0 should get the next PAG value with or without +this modification. + +If the DFS kernel extensions are not installed, you would get +something like this: + + caliban.ctd.anl.gov% ./testpag -n 012345678 + calling k5dcepag newpag=012345678 + Setpag failed with a system error + PAG returned = ffffffff + Not a good pag value + +If you DFS implementation does not have this modification, you could +attempt to install it yourself. But this requires source and requires +modifications to the kernel extensions. At the end of this note is an +untested sample using the DCE 1.2.2 source code. You can also contact +your system vendor and ask for this modification. + +UNICOS has a similar function setppag(newpag) which can be used to set +the PAG of the parent. Contact me if you are interested. + +HOW TO INSTALL + +Examine the k5dfspag.c file to make sure the DFS syscalls are correct +for your platform. See the /opt/dcelocal/share/include/dcedfs/syscall.h +on Solaris for example. + +You should build the testpag routine and make sure it works before +adding all the other mods. If it fails you can still use the klogind +and telnetd with the k5prelogin and k5dcelogin code. + +If you intend to install with a prefix other than /krb5, change: +DPAGAIX and K5DCECON in k5dfspag.c; the three references in +k5prelogin.c; and the DESTDIR in the Makefile. + +Get k5101.cdiff.xxxxxx.tar file and install the mods for ANL_DFS_PAG +and ANL_DCE to the MIT Kerberos 5 source. These mods turn on some DCE +related changes and the calls to krb5_dfs_pag. + +Symlink or copy the k5dfspag.c to the src/lib/krb5/os directory. + +Add the -DANL_DFS_PAG and -DANL_DCE flags to the configuration. + +Configure and Build the Kerberos v5. + +Modify the k5dce Makefile for your system. + +Build the k5dcecon and related programs. + +Install both the MIT Kerberos v5 and the k5dcecon and dpagaix if AIX. + +The makefile can also build k5dcelogin and k5prelogin. The install +can install k5dcelogin, k5prelogin and update the links for login.krb5 +-> k5prelogin and moving login.krb5 to login.k5. If you will be using +the k5dcecon/k5dfspag with the Kerberos mods, you don't need +k5prelogin, or the links changed, and may not need k5dcelogin. + +Note that Transarc has obfuscated the entries to the lib, and +the 1.0.3a is different from the 1.1. You may need to build two +versions of the k5dcelogin and/or k5dcecon one for each. + +AIX ONLY + +The dpagaix routine is needed for AIX because of the way they do the +syscalls. + +The following fix.aix.libdce.mk is not needed if dce 2.1.0.21 +has been installed. This PTF exposed the needed entrypoints. + +The fix.aix.libdce.mk is a Makefile for AIX 4.x to add the required +external entry points to the libdce.a. These are needed by k5dcecon +and k5dcelogin. A bug report was submitted to IBM on this, and it was +rejected. But since DCE 1.2.2 will have a k5dcelogin, this should not +be needed with 1.2.2 + +Copy /usr/lib/libdce.a to /usr/libdce.a.orig before starting. Copy the +makefile to its own directory. It will create a new libdce.a which you +need to copy back to /usr/lib/libdce.a You will need to reboot the +machine. See the /usr/lpp/dce/examples/inst/README.AIX for a similar +procedure. IBM was not responsive in a request to have these added. + +UNTESTED KERNEL EXTENSION FOR SETPAG + +*** src/file/osi/,osi_pag.c Wed Oct 2 13:03:05 1996 +--- src/file/osi/osi_pag.c Mon Jul 28 13:53:13 1997 +*************** +*** 293,298 **** +--- 293,302 ---- + int code; + + osi_MakePreemptionRight(); ++ /* allow sharing of a PAG by non child processes DEE- 6/6/97 */ ++ if (unused && osi_GetUID(osi_getucred()) == 0) { ++ newpag = unused; ++ } else { + osi_mutex_enter(&osi_pagLock); + now = osi_Time(); + soonest = osi_firstPagTime + +*************** +*** 309,314 **** +--- 313,319 ---- + } + osi_mutex_exit(&osi_pagLock); + newpag = osi_genpag(); ++ } + osi_pcred_lock(p); + credp = crcopy(osi_getucred()); + code = osi_SetPagInCred(credp, newpag); + +Created 07/08/96 +Modified 09/30/96 +Modified 11/19/96 +Modified 12/19/96 +Modified 06/20/97 +Modified 07/28/97 +Modified 02/18/98 + + Douglas E. Engert + Argonne National Laboratory + 9700 South Cass Avenue + Argonne, Illinois 60439 + (630) 252-5444 diff --git a/crypto/heimdal/appl/dceutils/dfspag.exp b/crypto/heimdal/appl/dceutils/dfspag.exp new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/dfspag.exp @@ -0,0 +1,3 @@ +#!/unix +* kernel extentions used to get the pag +kafs_syscall syscall diff --git a/crypto/heimdal/appl/dceutils/dpagaix.c b/crypto/heimdal/appl/dceutils/dpagaix.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/dpagaix.c @@ -0,0 +1,23 @@ +/* + * dpagaix.c + * On AIX we need to get the kernel extentions + * with the DFS kafs_syscall in it. + * We might be running on a system + * where DFS is not active. + * So we use this dummy routine which + * might not load to do the dirty work + * + * DCE does this with the /usr/lib/drivers/dfsloadobj + * + */ + + int dpagaix(parm1, parm2, parm3, parm4, parm5, parm6) + int parm1; + int parm2; + int parm3; + int parm4; + int parm5; + int parm6; + { + return(kafs_syscall(parm1, parm2, parm3, parm4, parm5, parm6)); + } diff --git a/crypto/heimdal/appl/dceutils/k5dce.h b/crypto/heimdal/appl/dceutils/k5dce.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/k5dce.h @@ -0,0 +1,165 @@ +/* dummy K5 routines which are needed to get this to + * compile without having access ti the DCE versions + * of the header files. + * Thiis is very crude, and OSF needs to expose the K5 + * API. + */ + +#ifdef sun +/* Transarc obfuscates these routines */ +#ifdef DCE_1_1 + +#define krb5_init_ets _dce_PkjKqOaklP +#define krb5_copy_creds _dce_LuFxPiITzD +#define krb5_unparse_name _dce_LWHtAuNgRV +#define krb5_get_default_realm _dce_vDruhprWGh +#define krb5_build_principal _dce_qwAalSzTtF +#define krb5_build_principal_ext _dce_vhafIQlejW +#define krb5_build_principal_va _dce_alsqToMmuJ +#define krb5_cc_default _dce_KZRshhTXhE +#define krb5_cc_default_name _dce_bzJVAjHXVQ +#define sec_login_krb5_add_cred _dce_ePDtOJTZvU + +#else /* DCE 1.0.3a */ + +#define krb5_init_ets _dce_BmLRpOVsBo +#define krb5_copy_creds _dce_VGwSEBNwaf +#define krb5_unparse_name _dce_PgAOkJoMXA +#define krb5_get_default_realm _dce_plVOzStKyK +#define krb5_build_principal _dce_uAKSsluIFy +#define krb5_build_principal_ext _dce_tRMpPiRada +#define krb5_build_principal_va _dce_SxnLejZemH +#define krb5_cc_default _dce_SeKosWFnsv +#define krb5_cc_default_name _dce_qJeaphJWVc +#define sec_login_krb5_add_cred _dce_uHwRasumsN + +#endif +#endif + +/* Define the bare minimum k5 structures which are needed + * by this program. Since the krb5 includes are not supplied + * with DCE, these were based on the MIT Kerberos 5 beta 3 + * which should match the DCE as of 1.0.3 at least. + * The tricky one is the krb5_creds, since one is allocated + * by this program, and it needs access to the client principal + * in it. + * Note that there are no function prototypes, so there is no + * compile time checking. + * DEE 07/11/95 + */ +#define NPROTOTYPE(x) () +typedef int krb5_int32; /* assuming all DCE systems are 32 bit */ +typedef short krb5short; /* assuming short is 16 bit */ +typedef krb5_int32 krb5_error_code; +typedef unsigned char krb5_octet; +typedef krb5_octet krb5_boolean; +typedef krb5short krb5_keytype; /* in k5.2 it's a short */ +typedef krb5_int32 krb5_flags; +typedef krb5_int32 krb5_timestamp; /* is a time_t in krb5.h */ + +typedef char * krb5_pointer; /* pointer to unexposed data */ + +typedef struct _krb5_ccache { + struct _krb5_cc_ops *ops; + krb5_pointer data; +} *krb5_ccache; + +typedef struct _krb5_cc_ops { + char *prefix; + char *(*get_name) NPROTOTYPE((krb5_ccache)); + krb5_error_code (*resolve) NPROTOTYPE((krb5_ccache *, char *)); + krb5_error_code (*gen_new) NPROTOTYPE((krb5_ccache *)); + krb5_error_code (*init) NPROTOTYPE((krb5_ccache, krb5_principal)); + krb5_error_code (*destroy) NPROTOTYPE((krb5_ccache)); + krb5_error_code (*close) NPROTOTYPE((krb5_ccache)); + krb5_error_code (*store) NPROTOTYPE((krb5_ccache, krb5_creds *)); + krb5_error_code (*retrieve) NPROTOTYPE((krb5_ccache, krb5_flags, + krb5_creds *, krb5_creds *)); + krb5_error_code (*get_princ) NPROTOTYPE((krb5_ccache, + krb5_principal *)); + krb5_error_code (*get_first) NPROTOTYPE((krb5_ccache, + krb5_cc_cursor *)); + krb5_error_code (*get_next) NPROTOTYPE((krb5_ccache, krb5_cc_cursor *, + krb5_creds *)); + krb5_error_code (*end_get) NPROTOTYPE((krb5_ccache, krb5_cc_cursor *)); + krb5_error_code (*remove_cred) NPROTOTYPE((krb5_ccache, krb5_flags, + krb5_creds *)); + krb5_error_code (*set_flags) NPROTOTYPE((krb5_ccache, krb5_flags)); +} krb5_cc_ops; + +typedef struct _krb5_keyblock { + krb5_keytype keytype; + int length; + krb5_octet *contents; +} krb5_keyblock; + +typedef struct _krb5_ticket_times { + krb5_timestamp authtime; + krb5_timestamp starttime; + krb5_timestamp endtime; + krb5_timestamp renew_till; +} krb5_ticket_times; + +typedef krb5_pointer krb5_cc_cursor; + +typedef struct _krb5_data { + int length; + char *data; +} krb5_data; + +typedef struct _krb5_authdata { + int ad_type; + int length; + krb5_octet *contents; +} krb5_authdata; + +typedef struct _krb5_creds { + krb5_pointer client; + krb5_pointer server; + krb5_keyblock keyblock; + krb5_ticket_times times; + krb5_boolean is_skey; + krb5_flags ticket_flags; + krb5_pointer **addresses; + krb5_data ticket; + krb5_data second_ticket; + krb5_pointer **authdata; +} krb5_creds; + +typedef krb5_pointer krb5_principal; + +#define KRB5_CC_END 336760974 +#define KRB5_TC_OPENCLOSE 0x00000001 + +/* Ticket flags */ +/* flags are 32 bits; each host is responsible to put the 4 bytes + representing these bits into net order before transmission */ +/* #define TKT_FLG_RESERVED 0x80000000 */ +#define TKT_FLG_FORWARDABLE 0x40000000 +#define TKT_FLG_FORWARDED 0x20000000 +#define TKT_FLG_PROXIABLE 0x10000000 +#define TKT_FLG_PROXY 0x08000000 +#define TKT_FLG_MAY_POSTDATE 0x04000000 +#define TKT_FLG_POSTDATED 0x02000000 +#define TKT_FLG_INVALID 0x01000000 +#define TKT_FLG_RENEWABLE 0x00800000 +#define TKT_FLG_INITIAL 0x00400000 +#define TKT_FLG_PRE_AUTH 0x00200000 +#define TKT_FLG_HW_AUTH 0x00100000 +#ifdef PK_INIT +#define TKT_FLG_PUBKEY_PREAUTH 0x00080000 +#define TKT_FLG_DIGSIGN_PREAUTH 0x00040000 +#define TKT_FLG_PRIVKEY_PREAUTH 0x00020000 +#endif + + +#define krb5_cc_get_principal(cache, principal) (*(cache)->ops->get_princ)(cache, principal) +#define krb5_cc_set_flags(cache, flags) (*(cache)->ops->set_flags)(cache, flags) +#define krb5_cc_get_name(cache) (*(cache)->ops->get_name)(cache) +#define krb5_cc_start_seq_get(cache, cursor) (*(cache)->ops->get_first)(cache, cursor) +#define krb5_cc_next_cred(cache, cursor, creds) (*(cache)->ops->get_next)(cache, cursor, creds) +#define krb5_cc_destroy(cache) (*(cache)->ops->destroy)(cache) +#define krb5_cc_end_seq_get(cache, cursor) (*(cache)->ops->end_get)(cache, cursor) + +/* end of k5 dummy typedefs */ + diff --git a/crypto/heimdal/appl/dceutils/k5dcecon.c b/crypto/heimdal/appl/dceutils/k5dcecon.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/k5dcecon.c @@ -0,0 +1,792 @@ +/* + * (c) Copyright 1995 HEWLETT-PACKARD COMPANY + * + * To anyone who acknowledges that this file is provided + * "AS IS" without any express or implied warranty: + * permission to use, copy, modify, and distribute this + * file for any purpose is hereby granted without fee, + * provided that the above copyright notice and this + * notice appears in all copies, and that the name of + * Hewlett-Packard Company not be used in advertising or + * publicity pertaining to distribution of the software + * without specific, written prior permission. Hewlett- + * Packard Company makes no representations about the + * suitability of this software for any purpose. + * + */ +/* + * k5dcecon - Program to convert a K5 TGT to a DCE context, + * for use with DFS and its PAG. + * + * The program is designed to be called as a sub process, + * and return via stdout the name of the cache which implies + * the PAG which should be used. This program itself does not + * use the cache or PAG itself, so the PAG in the kernel for + * this program may not be set. + * + * The calling program can then use the name of the cache + * to set the KRB5CCNAME and PAG for itself and its children. + * + * If no ticket was passed, an attemplt to join an existing + * PAG will be made. + * + * If a forwarded K5 TGT is passed in, either a new DCE + * context will be created, or an existing one will be updated. + * If the same ticket was already used to create an existing + * context, it will be joined instead. + * + * Parts of this program are based on k5dceauth,c which was + * given to me by HP and by the k5dcelogin.c which I developed. + * A slightly different version of k5dcelogin.c, was added to + * DCE 1.2.2 + * + * D. E. Engert 6/17/97 ANL + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "k5dce.h" + +#include +#include +#include + +/* #define DEBUG */ +#if defined(DEBUG) +#define DEEDEBUG(A) fprintf(stderr,A); fflush(stderr) +#define DEEDEBUG2(A,B) fprintf(stderr,A,B); fflush(stderr) +#else +#define DEEDEBUG(A) +#define DEEDEBUG2(A,B) +#endif + +#ifdef __hpux +#define seteuid(A) setresuid(-1,A,-1) +#endif + + +int k5dcecreate (uid_t, char *, char*, krb5_creds **); +int k5dcecon (uid_t, char *, char *); +int k5dcegettgt (krb5_ccache *, char *, char *, krb5_creds **); +int k5dcematch (uid_t, char *, char *, off_t *, krb5_creds **); +int k5dcesession (uid_t, char *, krb5_creds **, int *,krb5_flags); + + +char *progname = "k5dcecon"; +static time_t now; + +#ifdef notdef +#ifdef _AIX +/*---------------------------------------------*/ + /* AIX with DCE 1.1 does not have the com_err in the libdce.a + * do a half hearted job of substituting for it. + */ +void com_err(char *p1, int code, ...) +{ + int lst; + dce_error_string_t err_string; + dce_error_inq_text(code, err_string, &lst); + fprintf(stderr,"Error %d in %s: %s\n", code, p1, err_string ); +} + +/*---------------------------------------------*/ +void krb5_init_ets() +{ + +} +#endif +#endif + + +/*------------------------------------------------*/ +/* find a cache to use for our new pag */ +/* Since there is no simple way to determine which + * caches are associated with a pag, we will have + * do look around and see what makes most sense on + * different systems. + * on a Solaris system, and in the DCE source, + * the pags always start with a 41. + * this is not true on the IBM, where there does not + * appear to be any pattern. + * + * But since we are always certifing our creds when + * they are received, we can us that fact, and look + * at the first word of the associated data file + * to see that it has a "5". If not don't use. + */ + +int k5dcesession(luid, pname, tgt, ppag, tflags) + uid_t luid; + char *pname; + krb5_creds **tgt; + int *ppag; + krb5_flags tflags; +{ + DIR *dirp; + struct dirent *direntp; + off_t size; + krb5_timestamp endtime; + int better = 0; + krb5_creds *xtgt; + + char prev_name[17] = ""; + krb5_timestamp prev_endtime; + off_t prev_size; + u_long prev_pag = 0; + + char ccname[64] = "FILE:/opt/dcelocal/var/security/creds/"; + + error_status_t st; + sec_login_handle_t lcontext = 0; + dce_error_string_t err_string; + int lst; + + DEEDEBUG2("k5dcesession looking for flags %8.8x\n",tflags); + + dirp = opendir("/opt/dcelocal/var/security/creds/"); + if (dirp == NULL) { + return 1; + } + + while ( (direntp = readdir( dirp )) != NULL ) { + +/* + * (but root has the ffffffff which we are not interested in) + */ + if (!strncmp(direntp->d_name,"dcecred_",8) + && (strlen(direntp->d_name) == 16)) { + + /* looks like a cache name, lets do the stat, etc */ + + strcpy(ccname+38,direntp->d_name); + if (!k5dcematch(luid, pname, ccname, &size, &xtgt)) { + + /* it's one of our caches, see if it is better + * i.e. the endtime is farther, and if the endtimes + * are the same, take the larger, as he who has the + * most tickets wins. + * it must also had the same set of flags at least + * i.e. if the forwarded TGT is forwardable, this one must + * be as well. + */ + + DEEDEBUG2("Cache:%s",direntp->d_name); + DEEDEBUG2(" size:%d",size); + DEEDEBUG2(" flags:%8.8x",xtgt->ticket_flags); + DEEDEBUG2(" %s",ctime((time_t *)&xtgt->times.endtime)); + + if ((xtgt->ticket_flags & tflags) == tflags ) { + if (prev_name[0]) { + if (xtgt->times.endtime > prev_endtime) { + better = 1; + } else if ((xtgt->times.endtime = prev_endtime) + && (size > prev_size)){ + better = 1; + } + } else { /* the first */ + if (xtgt->times.endtime >= now) { + better = 1; + } + } + if (better) { + strcpy(prev_name, direntp->d_name); + prev_endtime = xtgt->times.endtime; + prev_size = size; + sscanf(prev_name+8,"%8X",&prev_pag); + *tgt = xtgt; + better = 0; + } + } + } + } + } + (void)closedir( dirp ); + + if (!prev_name[0]) + return 1; /* failed to find one */ + + DEEDEBUG2("Best: %s\n",prev_name); + + if (ppag) + *ppag = prev_pag; + + strcpy(ccname+38,prev_name); + setenv("KRB5CCNAME",ccname,1); + + return(0); +} + + +/*----------------------------------------------*/ +/* see if this cache is for this this principal */ + +int k5dcematch(luid, pname, ccname, sizep, tgt) + uid_t luid; + char *pname; + char *ccname; + off_t *sizep; /* size of the file */ + krb5_creds **tgt; +{ + + krb5_ccache cache; + struct stat stbuf; + char ccdata[256]; + int fd; + int status; + + /* DEEDEBUG2("k5dcematch called: cache=%s\n",ccname+38); */ + + if (!strncmp(ccname,"FILE:",5)) { + + strcpy(ccdata,ccname+5); + strcat(ccdata,".data"); + + /* DEEDEBUG2("Checking the .data file for %s\n",ccdata); */ + + if (stat(ccdata, &stbuf)) + return(1); + + if (stbuf.st_uid != luid) + return(1); + + if ((fd = open(ccdata,O_RDONLY)) == -1) + return(1); + + if ((read(fd,&status,4)) != 4) { + close(fd); + return(1); + } + + /* DEEDEBUG2(".data file status = %d\n", status); */ + + if (status != 5) + return(1); + + if (stat(ccname+5, &stbuf)) + return(1); + + if (stbuf.st_uid != luid) + return(1); + + *sizep = stbuf.st_size; + } + + return(k5dcegettgt(&cache, ccname, pname, tgt)); +} + + +/*----------------------------------------*/ +/* k5dcegettgt - get the tgt from a cache */ + +int k5dcegettgt(pcache, ccname, pname, tgt) + krb5_ccache *pcache; + char *ccname; + char *pname; + krb5_creds **tgt; + +{ + krb5_ccache cache; + krb5_cc_cursor cur; + krb5_creds creds; + int code; + int found = 1; + krb5_principal princ; + char *kusername; + krb5_flags flags; + char *sname, *realm, *tgtname = NULL; + + /* Since DCE does not expose much of the Kerberos interface, + * we will have to use what we can. This means setting the + * KRB5CCNAME for each file we want to test + * We will also not worry about freeing extra cache structures + * as this this routine is also not exposed, and this should not + * effect this module. + * We should also free the creds contents, but that is not exposed + * either. + */ + + setenv("KRB5CCNAME",ccname,1); + cache = NULL; + *tgt = NULL; + + if (code = krb5_cc_default(pcache)) { + com_err(progname, code, "while getting ccache"); + goto return2; + } + + DEEDEBUG("Got cache\n"); + flags = 0; + if (code = krb5_cc_set_flags(*pcache, flags)) { + com_err(progname, code,"While setting flags"); + goto return2; + } + DEEDEBUG("Set flags\n"); + if (code = krb5_cc_get_principal(*pcache, &princ)) { + com_err(progname, code, "While getting princ"); + goto return1; + } + DEEDEBUG("Got principal\n"); + if (code = krb5_unparse_name(princ, &kusername)) { + com_err(progname, code, "While unparsing principal"); + goto return1; + } + + DEEDEBUG2("Unparsed to \"%s\"\n", kusername); + DEEDEBUG2("pname is \"%s\"\n", pname); + if (strcmp(kusername, pname)) { + DEEDEBUG("Principals not equal\n"); + goto return1; + } + DEEDEBUG("Principals equal\n"); + + realm = strchr(pname,'@'); + realm++; + + if ((tgtname = malloc(9 + 2 * strlen(realm))) == 0) { + fprintf(stderr,"Malloc failed for tgtname\n"); + goto return1; + } + + strcpy(tgtname,"krbtgt/"); + strcat(tgtname,realm); + strcat(tgtname,"@"); + strcat(tgtname,realm); + + DEEDEBUG2("Getting tgt %s\n", tgtname); + if (code = krb5_cc_start_seq_get(*pcache, &cur)) { + com_err(progname, code, "while starting to retrieve tickets"); + goto return1; + } + + while (!(code = krb5_cc_next_cred(*pcache, &cur, &creds))) { + krb5_creds *cred = &creds; + + if (code = krb5_unparse_name(cred->server, &sname)) { + com_err(progname, code, "while unparsing server name"); + continue; + } + + if (strncmp(sname, tgtname, strlen(tgtname)) == 0) { + DEEDEBUG("FOUND\n"); + if (code = krb5_copy_creds(&creds, tgt)) { + com_err(progname, code, "while copying TGT"); + goto return1; + } + found = 0; + break; + } + /* we should do a krb5_free_cred_contents(creds); */ + } + + if (code = krb5_cc_end_seq_get(*pcache, &cur)) { + com_err(progname, code, "while finishing retrieval"); + goto return2; + } + +return1: + flags = KRB5_TC_OPENCLOSE; + krb5_cc_set_flags(*pcache, flags); /* force a close */ + +return2: + if (tgtname) + free(tgtname); + + return(found); +} + + +/*------------------------------------------*/ +/* Convert a forwarded TGT to a DCE context */ +int k5dcecon(luid, luser, pname) + uid_t luid; + char *luser; + char *pname; +{ + + krb5_creds *ftgt = NULL; + krb5_creds *tgt = NULL; + unsigned32 dfspag; + boolean32 reset_passwd = 0; + int lst; + dce_error_string_t err_string; + char *shell_prog; + krb5_ccache fcache; + char *ccname; + char *kusername; + char *urealm; + char *cp; + int pag; + int code; + krb5_timestamp endtime; + + + /* If there is no cache to be converted, we should not be here */ + + if ((ccname = getenv("KRB5CCNAME")) == NULL) { + DEEDEBUG("No KRB5CCNAME\n"); + return(1); + } + + if (k5dcegettgt(&fcache, ccname, pname, &ftgt)) { + fprintf(stderr, "%s: Did not find TGT\n", progname); + return(1); + } + + + DEEDEBUG2("flags=%x\n",ftgt->ticket_flags); + if (!(ftgt->ticket_flags & TKT_FLG_FORWARDABLE)){ + fprintf(stderr,"Ticket not forwardable\n"); + return(0); /* but OK to continue */ + } + + setenv("KRB5CCNAME","",1); + +#define TKT_ACCEPTABLE (TKT_FLG_FORWARDABLE | TKT_FLG_PROXIABLE \ + | TKT_FLG_MAY_POSTDATE | TKT_FLG_RENEWABLE | TKT_FLG_HW_AUTH \ + | TKT_FLG_PRE_AUTH) + + if (!k5dcesession(luid, pname, &tgt, &pag, + (ftgt->ticket_flags & TKT_ACCEPTABLE))) { + if (ftgt->times.endtime > tgt->times.endtime) { + DEEDEBUG("Updating existing cache\n"); + return(k5dceupdate(&ftgt, pag)); + } else { + DEEDEBUG("Using existing cache\n"); + return(0); /* use the original one */ + } + } + /* see if the tgts match up */ + + if ((code = k5dcecreate(luid, luser, pname, &ftgt))) { + return (code); + } + + /* + * Destroy the Kerberos5 cred cache file. + * but don't care about the return code. + */ + + DEEDEBUG("Destroying the old cache\n"); + if ((code = krb5_cc_destroy(fcache))) { + com_err(progname, code, "while destroying Kerberos5 ccache"); + } + return (0); +} + + +/*--------------------------------------------------*/ +/* k5dceupdate - update the cache with a new TGT */ +/* Assumed that the KRB5CCNAME has been set */ + +int k5dceupdate(krbtgt, pag) + krb5_creds **krbtgt; + int pag; +{ + + krb5_ccache ccache; + int code; + + if (code = krb5_cc_default(&ccache)) { + com_err(progname, code, "while opening cache for update"); + return(2); + } + + if (code = ccache->ops->init(ccache,(*krbtgt)->client)) { + com_err(progname, code, "while reinitilizing cache"); + return(3); + } + + /* krb5_cc_store_cred */ + if (code = ccache->ops->store(ccache, *krbtgt)) { + com_err(progname, code, "while updating cache"); + return(2); + } + + sec_login_pag_new_tgt(pag, (*krbtgt)->times.endtime); + return(0); +} +/*--------------------------------------------------*/ +/* k5dcecreate - create a new DCE context */ + +int k5dcecreate(luid, luser, pname, krbtgt) + uid_t luid; + char *luser; + char *pname; + krb5_creds **krbtgt; +{ + + char *cp; + char *urealm; + char *username; + char *defrealm; + uid_t uid; + + error_status_t st; + sec_login_handle_t lcontext = 0; + sec_login_auth_src_t auth_src = 0; + boolean32 reset_passwd = 0; + int lst; + dce_error_string_t err_string; + + setenv("KRB5CCNAME","",1); /* make sure it not misused */ + + uid = getuid(); + DEEDEBUG2("uid=%d\n",uid); + + /* if run as root, change to user, so as to have the + * cache created for the local user even if cross-cell + * If run as a user, let standard file protection work. + */ + + if (uid == 0) { + if (seteuid(luid) < 0) + goto abort; + } + + cp = strchr(pname,'@'); + *cp = '\0'; + urealm = ++cp; + + DEEDEBUG2("basename=%s\n",cp); + DEEDEBUG2("realm=%s\n",urealm); + + /* now build the username as a single string or a /.../cell/user + * if this is a cross cell + */ + + if ((username = malloc(7+strlen(pname)+strlen(urealm))) == 0) { + fprintf(stderr,"Malloc failed for username\n"); + goto abort; + } + if (krb5_get_default_realm(&defrealm)) { + DEEDEBUG("krb5_get_default_realm failed\n"); + goto abort; + } + + + if (!strcmp(urealm,defrealm)) { + strcpy(username,pname); + } else { + strcpy(username,"/.../"); + strcat(username,urealm); + strcat(username,"/"); + strcat(username,pname); + } + + /* + * Setup a DCE login context + */ + + if (sec_login_setup_identity((unsigned_char_p_t)username, + (sec_login_external_tgt|sec_login_proxy_cred), + &lcontext, &st)) { + /* + * Add our TGT. + */ + DEEDEBUG("Adding our new TGT\n"); + sec_login_krb5_add_cred(lcontext, *krbtgt, &st); + if (st) { + dce_error_inq_text(st, err_string, &lst); + fprintf(stderr, + "Error while adding credentials for %s because %s\n", + username, err_string); + goto abort; + } + DEEDEBUG("validating and certifying\n"); + /* + * Now "validate" and certify the identity, + * usually we would pass a password here, but... + * sec_login_valid_and_cert_ident + * sec_login_validate_identity + */ + + if (sec_login_validate_identity(lcontext, 0, &reset_passwd, + &auth_src, &st)) { + DEEDEBUG2("validate_identity st=%d\n",st); + if (st) { + dce_error_inq_text(st, err_string, &lst); + fprintf(stderr, "Validation error for %s because %s\n", + username, err_string); + goto abort; + } + if (!sec_login_certify_identity(lcontext,&st)) { + dce_error_inq_text(st, err_string, &lst); + fprintf(stderr, + "Credentials not certified because %s\n",err_string); + } + if (reset_passwd) { + fprintf(stderr, + "Password must be changed for %s\n", username); + } + if (auth_src == sec_login_auth_src_local) { + fprintf(stderr, + "Credentials obtained from local registry for %s\n", + username); + } + if (auth_src == sec_login_auth_src_overridden) { + fprintf(stderr, "Validated %s from local override entry, no network credentials obtained\n", username); + goto abort; + + } + /* + * Actually create the cred files. + */ + DEEDEBUG("Ceating new cred files.\n"); + sec_login_set_context(lcontext, &st); + if (st) { + dce_error_inq_text(st, err_string, &lst); + fprintf(stderr, + "Unable to set context for %s because %s\n", + username, err_string); + goto abort; + } + + /* + * Now free up the local context and leave the + * network context with its pag + */ +#if 0 + sec_login_release_context(&lcontext, &st); + if (st) { + dce_error_inq_text(st, err_string, &lst); + fprintf(stderr, + "Unable to release context for %s because %s\n", + username, err_string); + goto abort; + } +#endif + } + else { + DEEDEBUG2("validate failed %d\n",st); + dce_error_inq_text(st, err_string, &lst); + fprintf(stderr, + "Unable to validate %s because %s\n", username, + err_string); + goto abort; + } + } + else { + dce_error_inq_text(st, err_string, &lst); + fprintf(stderr, + "Unable to setup login entry for %s because %s\n", + username, err_string); + goto abort; + } + + done: + /* if we were root, get back to root */ + + DEEDEBUG2("sec_login_inq_pag %8.8x\n", + sec_login_inq_pag(lcontext, &st)); + + if (uid == 0) { + seteuid(0); + } + + DEEDEBUG("completed\n"); + return(0); + + abort: + if (uid == 0) { + seteuid(0); + } + + DEEDEBUG("Aborting\n"); + return(2); +} + + + +/*-------------------------------------------------*/ +main(argc, argv) + int argc; + char *argv[]; +{ + int status; + extern int optind; + extern char *optarg; + int rv; + + char *lusername = NULL; + char *pname = NULL; + int fflag = 0; + struct passwd *pw; + uid_t luid; + uid_t myuid; + char *ccname; + krb5_creds *tgt = NULL; + +#ifdef DEBUG + close(2); + open("/tmp/k5dce.debug",O_WRONLY|O_CREAT|O_APPEND, 0600); +#endif + + if (myuid = getuid()) { + DEEDEBUG2("UID = %d\n",myuid); + exit(33); /* must be root to run this, get out now */ + } + + while ((rv = getopt(argc,argv,"l:p:fs")) != -1) { + DEEDEBUG2("Arg = %c\n", rv); + switch(rv) { + case 'l': /* user name */ + lusername = optarg; + DEEDEBUG2("Optarg = %s\n", optarg); + break; + case 'p': /* principal name */ + pname = optarg; + DEEDEBUG2("Optarg = %s\n", optarg); + break; + case 'f': /* convert a forwarded TGT to a context */ + fflag++; + break; + case 's': /* old test parameter, ignore it */ + break; + } + } + + setlocale(LC_ALL, ""); + krb5_init_ets(); + time(&now); /* set time to check expired tickets */ + + /* if lusername == NULL, Then user is passed as the USER= variable */ + + if (!lusername) { + lusername = getenv("USER"); + if (!lusername) { + fprintf(stderr, "USER not in environment\n"); + return(3); + } + } + + if ((pw = getpwnam(lusername)) == NULL) { + fprintf(stderr, "Who are you?\n"); + return(44); + } + + luid = pw->pw_uid; + + if (fflag) { + status = k5dcecon(luid, lusername, pname); + } else { + status = k5dcesession(luid, pname, &tgt, NULL, 0); + } + + if (!status) { + printf("%s",getenv("KRB5CCNAME")); /* return via stdout to caller */ + DEEDEBUG2("KRB5CCNAME=%s\n",getenv("KRB5CCNAME")); + } + + DEEDEBUG2("Returning status %d\n",status); + return (status); +} diff --git a/crypto/heimdal/appl/dceutils/testpag.c b/crypto/heimdal/appl/dceutils/testpag.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/dceutils/testpag.c @@ -0,0 +1,150 @@ +/* Test the k5dcepag routine by setting a pag, and + * and execing a shell under this pag. + * + * This allows you to join a PAG which was created + * earlier by some other means. + * for example k5dcecon + * + * Must be run as root for testing only. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define POSIX_SETJMP +#define POSIX_SIGNALS + +#ifdef POSIX_SIGNALS +typedef struct sigaction handler; +#define handler_init(H,F) (sigemptyset(&(H).sa_mask), \ + (H).sa_flags=0, \ + (H).sa_handler=(F)) +#define handler_swap(S,NEW,OLD) sigaction(S, &NEW, &OLD) +#define handler_set(S,OLD) sigaction(S, &OLD, NULL) +#else +typedef sigtype (*handler)(); +#define handler_init(H,F) ((H) = (F)) +#define handler_swap(S,NEW,OLD) ((OLD) = signal ((S), (NEW))) + +#define handler_set(S,OLD) (signal ((S), (OLD))) +#endif + +typedef void sigtype; + +/* + * We could include the dcedfs/syscall.h which should have these + * numbers, but it has extra baggage. So for + * simplicity sake now, we define these here. + */ + + +#define AFSCALL_SETPAG 2 +#define AFSCALL_GETPAG 11 + +#if defined(sun) +#define AFS_SYSCALL 72 + +#elif defined(hpux) +/* assume HPUX 10 + or is it 50 */ +#define AFS_SYSCALL 326 + +#elif defined(_AIX) +#define DPAGAIX "dpagaix" +/* #define DPAGAIX "/krb5/sbin/dpagaix" */ + +#elif defined(sgi) || defined(_sgi) +#define AFS_SYSCALL 206+1000 + +#else +#define AFS_SYSCALL (Unknown_DFS_AFS_SYSCALL) +#endif + +static sigjmp_buf setpag_buf; + +static sigtype mysig() +{ + siglongjmp(setpag_buf, 1); +} + + +int krb5_dfs_newpag(new_pag) + int new_pag; +{ + handler sa1, osa1; + handler sa2, osa2; + int pag = -1; + + handler_init (sa1, mysig); + handler_init (sa2, mysig); + handler_swap (SIGSYS, sa1, osa1); + handler_swap (SIGSEGV, sa2, osa2); + + if (sigsetjmp(setpag_buf, 1) == 0) { +#if defined(_AIX) + int (*dpagaix)(int, int, int, int, int, int); + + if (dpagaix = load(DPAGAIX, 0, 0)) + pag = (*dpagaix)(AFSCALL_SETPAG, new_pag, 0, 0, 0, 0); +#else + pag = syscall(AFS_SYSCALL,AFSCALL_SETPAG, new_pag, 0, 0, 0, 0); +#endif + handler_set (SIGSYS, osa1); + handler_set (SIGSEGV, osa2); + return(pag); + } + + fprintf(stderr,"Setpag failed with a system error\n"); + /* syscall failed! return 0 */ + handler_set (SIGSYS, osa1); + handler_set (SIGSEGV, osa2); + return(-1); +} + +main(argc, argv) + int argc; + char *argv[]; +{ + extern int optind; + extern char *optarg; + int rv; + int rc; + unsigned int pag; + unsigned int newpag = 0; + char ccname[256]; + int nflag = 0; + + while((rv = getopt(argc,argv,"n:")) != -1) { + switch(rv) { + case 'n': + nflag++; + sscanf(optarg,"%8x",&newpag); + break; + default: + printf("Usage: k5dcepagt -n pag \n"); + exit(1); + } + } + + if (nflag) { + fprintf (stderr,"calling k5dcepag newpag=%8.8x\n",newpag); + pag = krb5_dfs_newpag(newpag); + + fprintf (stderr,"PAG returned = %8.8x\n",pag); + if ((pag != 0) && (pag != -1)) { + sprintf (ccname, + "FILE:/opt/dcelocal/var/security/creds/dcecred_%8.8x", + pag); + esetenv("KRB5CCNAME",ccname,1); + execl("/bin/csh", "csh", NULL); + } + else { + fprintf(stderr," Not a good pag value\n"); + } + } +} diff --git a/crypto/heimdal/appl/ftp/ChangeLog b/crypto/heimdal/appl/ftp/ChangeLog deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ChangeLog +++ /dev/null @@ -1,1038 +0,0 @@ -2008-05-29 Love Hörnquist Åstrand - - * ftp/ftp.c: use the correct length to munmap and use msync. - -2008-05-28 Love Hörnquist Åstrand - - * ftp/ftp.c: Rewrite sliding window code so it doesn't have a - integer overrun. - - * ftp/ftp.c: Try sliding mmap window over memory file (10MB - window), works better with larger files (ie doesn't fail). - -2008-04-10 Love Hörnquist Åstrand - - * ftpd/logwtmp.c: Use asl for logging ftpd wtmp messages. - -2007-07-12 Love Hörnquist Åstrand - - * ftp/gssapi.c: Fix pointer vs strict alias rules. - -2007-06-20 Love Hörnquist Åstrand - - * ftp/security.c: if no mech have no session, its ok, just don't - call it. - - * ftp/security.h: provide prototype for sec_userok(). - - * move ksetpag after initgroups to make it work on Linux when its - without syscall hooks to change sys_setgroups preserve the - pag. From Alexsander Boström. - -2007-06-09 Love Hörnquist Åstrand - - * ftpd/Makefile.am: don't clean yacc/lex files in CLEANFILES, - maintainers clean will do that for us. - -2006-10-07 Love Hörnquist Åstrand - - * ftpd/Makefile.am: Add man_MANS to EXTRA_DIST - - * ftp/Makefile.am: Add man_MANS to EXTRA_DIST - -2006-08-08 Love Hörnquist Åstrand - - * ftpd/ftpd.c: Add comment by seteuid call isn't not needed. - - * ftpd/ftpd.c: Check return values from seteuid, prompted by MIT - advisory. Thanks to Tom Yu at MIT, and Michael Calmer and Marcus - Meissner at SUSE. Either of CVE-2006-3083 or CVE-2006-3084. - -2006-06-27 Love Hörnquist Åstrand - - * ftpd/gss_userok.c (gss_userok): create a local krb5_context and - use that instead of the libgssapi context (that might not exist). - -2006-05-05 Love Hörnquist Åstrand - - * Rename u_intXX_t to uintXX_t - -2006-03-23 Love Hörnquist Åstrand - - * ftp/ftp.1: Add undocument flags and spelling, from Ted Percival - - -2006-02-27 Johan Danielsson - - * ftpd/ftpd.8: fix grammar in --no-insecure-oob option (partly - from Thomas Klausner) - -2006-01-24 Love Hörnquist Åstrand - - * ftp/ftp.c: Indent. - -2006-01-12 Johan Danielsson - - * ftpd/ftpd.c (pass): remove unused variable in the !OTP case - -2005-10-22 Love Hörnquist Åstrand - - * ftpd/ls.c: Check return value from asprintf instead of string != - NULL since it undefined behavior on Linux. From Björn Sandell - - * ftpd/gss_userok.c: Check return value from asprintf instead of - string != NULL since it undefined behavior on Linux. From Björn - Sandell - - * ftpd/ftpd.c: Check return value from asprintf instead of string - != NULL since it undefined behavior on Linux. From Björn Sandell - - * ftp/gssapi.c: Check return value from asprintf instead of string - != NULL since it undefined behavior on Linux. From Björn Sandell - -2005-10-12 Johan Danielsson - - * ftp/ftp.1: document -x - - * ftp/security.h: implement cprotect (from MIT) - - * ftp/security.c: add -x (encrypt) option; implement cprotect - (from MIT); make sure we CCC if switching to clear-text command - channel - - * ftp/cmdtab.c: implement cprotect (from MIT) - - * ftp/ruserpass.c: if doing command line encryption (-x), ignore - prot commands in .netrc - - * ftp/ftp_var.h: add -x (encrypt) option - - * ftp/globals.c: add -x (encrypt) option - - * ftp/main.c: add -x (encrypt) option - -2005-07-19 Love Hörnquist Åstrand - - * ftpd/ftpcmd.y: Fix shadow warning. - - * ftp/security.c: Fix shadow warning. - * ftp/security.c: Fix shadow warnings. - - * ftp/ruserpass.c: Fix shadow warnings. - - * ftp/ftp.c: Fix shadow warnings. - - * ftp/cmds.c: fix shadow warnings - - * Add Kerberos 5 klist, old patch from Tomas Nyström (remove krb4 - support). Support klist in client for kerberos 5 clase. - Clean up delegation of gss tokens and do afslog. - -2005-07-13 Love Hörnquist Åstrand - - * ftp/gssapi.c (gss_adat): avoid leaking memory - (gss_auth): always try next kname if there is one, independant of - min_stat - - * ftp/gssapi.c: avoid const warning, use sin4 instead of sin to - avoid shadow warning, free target_name - -2005-07-09 Love Hörnquist Åstrand - - * ftp/security.c: keep track of if CCC was passed - - * ftpd/extern.h: variable to keep track of if CCC was passed - - * ftpd/ftpcmd.y: sprinkel check_secure, check if CCC was passed in - check_secure - -2005-06-02 Love Hörnquist Åstrand - - * ftpd/ftpd.c (filename_check): change signednes of p to avoid - warning, move typecasts - -2005-05-29 Love Hörnquist Åstrand - - * ftpd/ftpd.c: avoid 'unused variable' warnings - -2005-05-10 David Love - - * ftpd/pathnames.h: #ifdef protect _PATH_ISSUE - -2005-04-25 Love Hörnquist Åstrand - - * ftp/domacro.c: handle string trunctions - -2005-04-24 Love Hörnquist Åstrand - - * ftp/security.c: use strlcat - - * ftp/domacro.c: use strlcpy - -2005-04-20 Love Hörnquist Åstrand - - * ftp/security.c: cast size_t to unsigned long - -2005-04-18 Love Hörnquist Åstrand - - * ftpd/ftpd.c (statcmd): cast argument to isdigit to unsigned char - - * ftp/cmds.c (mget): cast char to unsigned char to make sure its - not negative when passing it to tolower - -2005-04-07 Love Hörnquist Åstrand - - * ftp/ftp.c: fix 3 'var' might be used uninitialized warnings - -2005-04-04 Love Hörnquist Åstrand - - * ftp/cmds.c: MacOS is also a unix that doesn't define - __unix__/unix While here, rewrite this part of the function to not - modify that string, but rather take a copy of it and them modify - is, all this just to pacify gcc - -2005-01-09 Love Hörnquist Åstrand - - * ftp/domacro.c: cast argument to is* to unsigned char - - * ftp/ftp.c: cast argument to tolower to unsigned char - -2004-08-20 Love Hörnquist Åstrand - - * ftp/ftp.c: send ABOR protect with security layer if its there - - * ftpd/{ftpd_locl.h, extern.h, ftpcmd.y, ftpd.8, ftpd.c}: - Remove all traces of setjmp/longjmp. - Handle those command that is needed in oobhandler, - those are ABOR, STAT, ENC, CONF, MIC. - add options to turn off insecure OOB handling and document the option - - Changes inspired by openbsd and netbsd changes but quite diffrent is - most places since the code no longer look and is structured the same - way. - -2004-08-16 Johan Danielsson - - * ftp/main.c: reverse help strings for --no-gss-bindings and - --no-gss-delegate - -2004-06-20 Love Hörnquist Åstrand - - * ftpd/ftpcmd.y: make cbuf 64k to handle lager tickets From: - MAAAAA MOOOR - -2004-03-14 Love Hörnquist Åstrand - - * ftpd/ftpd.c (main): setpag if there is krb4 OR krb5 support - -2003-12-19 Love Hörnquist Åstrand - - * ftp/security.h: add ftp_do_gss_delegate - - * ftp/main.c (getargs): negative flag for delegating gss creds - - * ftp/gssapi.c (ftp_do_gss_delegate): delegate creds (default on) - -2003-09-03 Love Hörnquist Åstrand - - * ftp/ftp.c: s/des_read_pw_string/UI_UTIL_read_pw_string/ - - * ftp/cmds.c: s/des_read_pw_string/UI_UTIL_read_pw_string/ - -2003-07-19 Love Hörnquist Åstrand - - * ftp/security.h: add ftp_do_gss_bindings - - * ftp/ftp.1: fix mdoc bug - - * ftp/ftp.1: document --no-gss-bindings - - * ftp/gssapi.c: Optionally support gss bindings, client does it by - default, server not. This is to make it work for clients behind - NAT. - - * ftp/main.c (args): add gss-bindings - (main): set ftp_do_gss_bindings to 1 to make client use them - - * ftpd/ftpd.c (args): add gss-bindings - - * ftpd/ftpd.8: document --gss-bindings - -2003-06-13 Johan Danielsson - - * ftp/gssapi.c (gss_adat): fix name allocation bug - -2003-05-21 Love Hörnquist Åstrand - - * ftpd/gss_userok.c (gss_userok): release delegated cred handle - - * ftp/gssapi.c (gss_adat): remove poking inside the delegated - handle, also fixes problem where to much memory was allocated - - * ftpd/gss_userok.c (gss_userok): remove poking inside the - delegated handle - -2003-05-14 Love Hörnquist Åstrand - - * ftpd/ftpcmd.y: support afslog and afslog when compiled - with krb5 - -2003-05-07 Love Hörnquist Åstrand - - * ftp/cmdtab.c: include afslog in both the krb4 and krb5 case - - * ftp/kauth.c: include afslog in both the krb4 and krb5 case - - * ftp/Makefile.am: always include auth.c - -2003-05-07 Love Hörnquist Åstrand - - * ftpd/Makefile.am: always include auth.c - - * ftpd/kauth.c: do afslog in the krb5 case too - -2003-04-22 Love Hörnquist Åstrand - - * ftp/ftp.1: replace > with \*[Gt] - -2003-04-16 Love Hörnquist Åstrand - - * ftpd/ftpd.c: make sure argument to is* functions are unsigned - -2003-04-06 Love Hörnquist Åstrand - - * ftpd/ftpd.8: s/kerberos/Kerberos/ - -2003-03-23 Assar Westerlund - - * ftpd/pathnames.h (_PATH_FTPUSERS): conditionalize - -2003-03-18 Love Hörnquist Åstrand - - * ftpd/ftpd.c (krb5_verify): always do krb5_afslog, remove setpag - (its done in main) - - * ftpd/gss_userok.c: drop setpag - - * ftpd/ftpd.c (main): set afs PAG - - * ftpd/gss_userok.c: always try krb5_afslog, and while here do a - setpag too - - * ftpd/ftpd_locl.h: always include kafs - -2003-03-16 Love Hörnquist Åstrand - - * ftp/gssapi.c (gss_adat): now that gss_export_name exports a - principal, bandaid with gss_display_name, and check that oid is - GSS_KRB5_NT_PRINCIPAL_NAME, also free memory - -2003-02-25 Love Hörnquist Åstrand - - * ftp/gssapi.c (gss_auth): print out the name we authenticated too - -2003-02-25 Love Hörnquist Åstrand - - * ftpd/ls.c: use readlink with bufsize - 1, From NetBSD - - * ftp/ftp.1: s/utilizes/uses/ from NetBSD - - * ftpd/ftpd.8: s/utilize/use/ from NetBSD - -2003-02-10 Assar Westerlund - - * ftpd/ftpd.c (accept_with_timeout): use socklen_t - -2002-10-29 Johan Danielsson - - * ftp/main.c: reinstate -n flag (from Torbjörn Granlund) - -2002-10-16 Johan Danielsson - - * ftp/ftp.c: fix parsing of epsv ports (from Love) - -2002-09-05 Johan Danielsson - - * ftp/security.c (sec_vfprintf): free encoded data - - * ftp/gssapi.c (gss_decode): release buffer - - * ftp/ftp.c (active_mode): no need to allocate buffer for EPRT - -2002-08-28 Johan Danielsson - - * ftp/ftp.c (command): clean up va_{start,end}ing (from NetBSD) - -2002-08-23 Assar Westerlund - - * ftp/main.c: start using getarg - -2002-08-22 Johan Danielsson - - * ftpd/ls.c: uxp/v lacks _S_IFMT, but has S_IFMT - -2002-08-20 Johan Danielsson - - * ftp/gssapi.c: remove unused variable - -2002-04-24 Johan Danielsson - - * ftp/ftp.c: fix buffer overrun when receiving long replies - -2002-04-02 Johan Danielsson - - * ftpd/popen.c: make sure gl_pathc != 0 before referencing - gl_pathv - -2002-03-15 Johan Danielsson - - * ftp/gssapi.c (gss_adat): if accept_sec_context fails, syslog a - reason and give a temporary error message - -2002-02-28 Johan Danielsson - - * ftpd/ftpd.c: if builtin_ls failes, return error - - * ftpd/ls.c (builtin_ls): return status; also don't print fatal - error messages to the output stream, instead use syslog - -2001-09-14 Johan Danielsson - - * ftpd/ls.c: make sure we don't include . in recursive listings - -2001-09-13 Johan Danielsson - - * ftpd/ftpd.c (dataconn): don't wait forever on accept - -2001-09-04 Assar Westerlund - - * ftp/gssapi.c (gss_adat): leak less memory and check return value - from asprintf - -2001-08-28 Jacques Vidrine - - * ftpd/ftpd.c, ftpd/ftpd.8: On systems with IP_PORTRANGE, have - ftpd use `high-numbered' ports by default. Add a -U option - to get the old behavior. - -2001-08-28 Johan Danielsson - - * ftp/gssapi.c: try using "host" if there's no "ftp" principal - -2001-08-26 Johan Danielsson - - * ftpd/ls.c: implement -R - -2001-08-08 Assar Westerlund - - * ftpd/ls.c: make -a and -A do the same as in ls(1) - -2001-08-05 Assar Westerlund - - * ftpd/ftpcmd.y: add some (unsigned char) casts to is* - * ftp/cmds.c: add some (unsigned char) casts to is* - * ftpd/gss_userok.c (gss_userok): make argument to printf type - correct - -2001-08-05 Assar Westerlund - - * ftp/cmds.c (setpeer): __NetBSD__ is also a unix-like OS - -2001-06-19 Assar Westerlund - - * ftpd/popen.c, ftpd/ftpd.c: try to handle GLOB_MAXPATH (FreeBSD) - -2001-04-19 Johan Danielsson - - * ftpd/ftpd.c (do_store): call closefunc before claiming that - everything went ok, if the close fails the file might not have - been stored properly - -2001-03-26 Assar Westerlund - - * ftpd/ftpd.c, ftpd/popen.c: always use GLOB_LIMIT - * ftpd/popen.c (ftpd_popen): use GLOB_LIMIT if defined - * ftpd/ftpd.c (send_file_list): use GLOB_LIMIT if defined - -2001-02-15 Assar Westerlund - - * ftp/cmds.c (setpeer): handle both service names and port numbers - for the second optional argument. also make parsing more robust - -2001-02-07 Assar Westerlund - - * ftp/security.c (sec_end): only clean app_data if there is any - (*): do realloc consistently - -2001-02-05 Assar Westerlund - - * ftpd/popen.c (ftpd_popen): avoid overwriting the bounds of argv - and gargv - -2001-01-30 Assar Westerlund - - * ftpd/gss_userok.c: use gss_krb5_copy_ccache - -2001-01-29 Assar Westerlund - - * ftpd/Makefile.am: move up LIB_otp so we do not end up picking - one from /usr/athena - -2001-01-25 Johan Danielsson - - * ftpd/ls.c: fix bug in previous; make it easier to build test - version - -2001-01-19 Johan Danielsson - - * ftpd/ls.c (lstat_file): handle case where file lives in `/' - -2001-01-18 Johan Danielsson - - * ftpd/ftpd.c (pasv): close already open passive port - -2000-12-14 Johan Danielsson - - * ftpd/ls.c: reverse time and size sort order (pointed out by - tege) - -2000-12-11 Johan Danielsson - - * ftpd/ftpd.c: make it possible to set list of good filename - characters from command line - -2000-12-10 Johan Danielsson - - * ftpd/ftpd.c: some spec-violating mirror software assumes that - you can do things like `LIST -CF'; don't pass `--' to ls so this - actually works - - * ftpd/ls.c: implement -1CFx flags - -2000-12-08 Assar Westerlund - - * ftpd/gss_userok.c (gss_userok): handle getpwnam failing - * ftp/gssapi.c (gss_auth): be more explicit in error message - -2000-11-29 Johan Danielsson - - * ftpd/ftpd.8: close list - -2000-11-15 Assar Westerlund - - * ftp/main.c: add `-l' for no line-editing - * ftp/globals.c (readline): add - * ftp/ftp_var.h (lineedit): add variable indicated if we should - use readline - -2000-11-09 Johan Danielsson - - * ftp/security.c (sec_read): fix bug in previous (from Jacques A. - Vidrine ) - -2000-11-05 Johan Danielsson - - * ftpd/ftpcmd.y: only allow pasv if logged in - -2000-10-23 Johan Danielsson - - * ftpd/ftpd.c: change bad filename message slightly - - * common/buffer.c: HAVE_ST_BLKSIZE -> HAVE_STRUCT_STAT_ST_BLKSIZE - -2000-10-08 Assar Westerlund - - * ftp/ftp.c (*): check that fds are not too large to select on - * ftp/main.c (cmdscanner): print a newline upon EOF - -2000-09-19 Assar Westerlund - - * ftp/security.h: add some attributes to prototypes of sec* - * ftp/extern.h (command): add attributes - -2000-08-31 Johan Danielsson - - * ftpd/ftpd.c: change redundant password message to something - people can understand - -2000-07-27 Assar Westerlund - - * ftpd/gss_userok.c (gss_userok): only do AFS iff KRB4 - * ftpd/ftpd.c (krb5_verify): only do AFS stuff if KRB4 - -2000-07-07 Assar Westerlund - - * ftpd/ftpd.c: do not call setproctitle with a variable as the - format string - -2000-07-01 Assar Westerlund - - * ftpd/ftpd_locl.h: krb5.h before kafs.h - * ftpd/ftpd.c (krb5_verify): static-ize - * ftpd/ftpd.c (krb5_verify): conditionalize on KRB5 - -2000-06-21 Assar Westerlund - - * ftpd: support for authenticating passwords with krb5, by Daniel - Kouril - -2000-06-06 Johan Danielsson - - * ftpd/ftpcmd.y: change unix test to be negative - -2000-05-18 Assar Westerlund - - * ftpd/ftpd.c (args): should use `debug'. From Onno van der - Linden . - -2000-04-25 Assar Westerlund - - * ftp/ftp.c (login): re-structure code so that we prompt for - password for ftp/anonymous - -2000-04-11 Assar Westerlund - - * ftp/ftp.c (login): initialize tmp before calling fgets - -2000-04-02 Assar Westerlund - - * ftpd/ls.c: rename all st_mtime variables to avoid conflict with - #define. - * ftpd/ftpcmd.y: rename all st_mtime variables to avoid conflict - with #define. - * ftp/cmds.c: rename all st_mtime variables to avoid conflict with - #define. - -2000-03-26 Assar Westerlund - - * ftpd/ls.c, ftpd/ftpcmd.y, ftp/cmds.c: make sure to always call - time, ctime, and gmtime with `time_t's. there were some types - (like in lastlog) that we believed to always be time_t. this has - proven wrong on Solaris 8 in 64-bit mode, where they are stored as - 32-bit quantities but time_t has gone up to 64 bits - -2000-03-09 Johan Danielsson - - * call list_file for broken usages of nlst too - - * ftpd/ftpd.c: call list_file for broken usages of nlst too - -2000-02-07 Assar Westerlund - - * ftp/security.c (sec_read): more paranoia with return value from - sec_get_data - -2000-01-08 Assar Westerlund - - * ftp/ftp.c (hookup): handle ai_canonname being set in any of the - addresses returnedby getaddrinfo. glibc apparently returns the - reverse lookup of every address in ai_canonname. - * ftp/ruserpass.c (guess_domain): dito - -1999-12-21 Assar Westerlund - - * ftpd/ftpd.c: don't use sa_len as a parameter, it's defined on - Irix - -1999-12-21 Johan Danielsson - - * ftpd/ftpd.c (dataconn): make sure from points to actual data - -1999-12-16 Assar Westerlund - - * ftp/ruserpass.c (guess_domain): handle ai_canonname not being - set - * ftp/ftp.c (hookup): handle ai_canonname not being set - -1999-12-06 Assar Westerlund - - * ftp/krb4.c (krb4_auth): the nat-IP address might not be realm - bounded. - -1999-12-05 Assar Westerlund - - * ftpd/ftpd.c (dolog): update prototype - * ftpd/ftpd.c (dolog): use getnameinfo_verified - * ftpd/ftpd.c: replace inaddr2str by getnameinfo - -1999-12-04 Assar Westerlund - - * ftp/ruserpass.c (guess_domain): re-write to use getaddrinfo - * ftp/ftp.c (hookup): re-write to use getaddrinfo - -1999-11-30 Assar Westerlund - - * ftpd/ftpd.c (getdatasock): make sure to keep the port-number of - the outgoing connections. It has to be `ftp-data' or some people - might get upset. - - * ftpd/ftpd.c (args): set correct variable when `-l' so that - logging actually works - -1999-11-29 Assar Westerlund - - * ftp/security.c (sec_login): check return value from realloc - (sec_end): set app_data to NULL - -1999-11-25 Assar Westerlund - - * ftp/krb4.c (krb4_auth): obtain the `local' address when doing - NAT. also turn on passive mode. From - -1999-11-20 Assar Westerlund - - * ftpd/ls.c (make_fileinfo): cast to allow for non-const - prototypes of readlink - -1999-11-12 Assar Westerlund - - * ftpd/ftpd.c (args): use arg_counter for `l' - -1999-11-04 Assar Westerlund - - * ftpd/ls.c (S_ISSOCK, S_ISLNK): fallback definitions for systems - that don't have them (such as ultrix) - -1999-10-29 Assar Westerlund - - * ftpd/ls.c (make_fileinfo): cast uid's and gid's to unsigned in - printf, we don't know what types they might be. - (lstat_file): conditionalize the kafs part on KRB4 - - * ftpd/ftpd_locl.h: is needed for kafs.h - -1999-10-28 Assar Westerlund - - * ftpd/ls.c (lstat_file): don't set st_mode, it should already be - correct - - * ftpd/ls.c: don't use warnx to print errors - - * ftpd/ls.c (builtin_ls): fix typo, 'd' shouldn't imply 'f' - - * ftpd/ls.c (lstat_file): new function for avoiding stating AFS - mount points. From Love - (list_files): use `lstat_file' - - * ftpd/ftpd.c: some const-poisoning - - * ftpd/ftpd.c (args): add `-B' as an alias for `--builtin-ls' to - allow for stupid inetds that only support two arguments. From - Love - -1999-10-26 Assar Westerlund - - * ftpd/ftpcmd.y (help): it's unnecessary to interpret help strings - as printf commands - - * ftpd/ftpd.c (show_issue): don't interpret contents of - /etc/issue* as printf commands. From Brian A May - - -1999-10-21 Johan Danielsson - - * ftpd/kauth.c (kauth): complain if protection level isn't - `private' - - * ftp/krb4.c (krb4_decode): syslog failure reason - - * ftp/kauth.c (kauth): set private level earlier - - * ftp/security.c: get_command_prot; (sec_prot): partially match - `command' and `data' - -1999-10-18 Johan Danielsson - - * ftpd/ftpd.c: change `-l' flag to use arg_collect (this makes - `-ll' work again) - - * ftpd/ftpd.c (list_file): pass filename to ls - -1999-10-04 Johan Danielsson - - * ftpd/ftpcmd.y: FEAT - -1999-10-03 Assar Westerlund - - * ftpd/ls.c: fall-back definitions for constans and casts for - printfs - -1999-10-03 Johan Danielsson - - * ftpd/ftpd.c (main): make this use getarg; add `list_file' - - * ftpd/ftpcmd.y (LIST): call list_file - - * ftpd/ls.c: add simple built-in ls - - * ftp/security.c: add `sec_vfprintf2' and `sec_fprintf2' that - prints to the data stream - - * ftp/kauth.c (kauth): make sure we're using private protection - level - - * ftp/security.c (set_command_prot): set command protection level - - * ftp/security.c: make it possible to set the command protection - level with `prot' - -1999-09-30 Assar Westerlund - - * ftpd/ftpd_locl.h: add prototype for fclose to make sunos happy - -1999-08-19 Johan Danielsson - - * ftpd/ftpd.c (do_login): show issue-file - (send_data): change handling of zero-byte files - -1999-08-18 Assar Westerlund - - * ftp/cmds.c (getit): be more suspicious when parsing the result - of MDTM. Do the comparison of timestamps correctly. - -1999-08-13 Assar Westerlund - - * ftpd/ftpd.c (send_data): avoid calling mmap with `len == 0'. - Some mmap:s rather dislike that (Solaris) and some munmap (Linux) - get grumpy later. - - * ftp/ftp.c (copy_stream): avoid calling mmap with `len == 0'. - Some mmap:s rather dislike that (Solaris) and some munmap (Linux) - get grumpy later. - -1999-08-03 Assar Westerlund - - * ftp/ftp.c (active_mode): hide failure of EPRT by setting verbose - - * ftp/gssapi.c (gss_auth): initialize application_data in bindings - -1999-08-02 Assar Westerlund - - * ftpd/ftpcmd.y: save file names when doing commands that might - get aborted (and longjmp:ed out of) to avoid overwriting them also - remove extra closing brace - -1999-08-01 Johan Danielsson - - * ftpd/ftpcmd.y: change `site find' to `site locate' (to match - what it does, and other implementations) keep find as an alias - -1999-07-28 Assar Westerlund - - * common/socket.c: moved to roken - - * common/socket.c: new file with generic socket functions - - * ftpd/ftpd.c: make it more AF-neutral and v6-capable - - * ftpd/ftpcmd.y: add EPRT and EPSV - - * ftpd/extern.h: update prototypes and variables - - * ftp/krb4.c: update to new types of addresses - - * ftp/gssapi.c: add support for both AF_INET and AF_INET6 - addresses - - * ftp/ftp.c: make it more AF-neutral and v6-capable - - * ftp/extern.h (hookup): change prototype - - * common/common.h: add prototypes for functions in socket.c - - * common/Makefile.am (libcommon_a_SOURCES): add socket.c - - * ftp/gssapi.c (gss_auth): check return value from - `gss_import_name' and print error messages if it fails - -1999-06-15 Assar Westerlund - - * ftp/krb4.c (krb4_auth): type correctness - -1999-06-02 Johan Danielsson - - * ftp/ftp.c (sendrequest): lmode != rmode - -1999-05-21 Assar Westerlund - - * ftp/extern.h (sendrequest): update prototype - - * ftp/cmds.c: update calls to sendrequest and recvrequest to send - "b" when appropriate - - * ftp/ftp.c (sendrequest): add argument for mode to open file in. - -1999-05-08 Assar Westerlund - - * ftpd/ftpcmd.y: rename getline -> ftpd_getline - - * ftp/main.c (makeargv): fill in unused slots with NULL - -Thu Apr 8 15:06:40 1999 Johan Danielsson - - * ftpd/ftpd.c: remove definition of KRB_VERIFY_USER (moved to - config.h) - -Wed Apr 7 16:15:21 1999 Johan Danielsson - - * ftp/gssapi.c (gss_auth): call gss_display_status to get a sane - error message; return AUTH_{CONTINUE,ERROR}, where appropriate - - * ftp/krb4.c: return AUTH_{CONTINUE,ERROR}, where appropriate - - * ftp/security.c (sec_login): if mechanism returns AUTH_CONTINUE, - just continue with the next mechanism, this fixes the case of - having GSSAPI fail because of non-existant of expired tickets - - * ftp/security.h: add AUTH_{OK,CONTINUE,ERROR} - -Thu Apr 1 16:59:04 1999 Johan Danielsson - - * ftpd/Makefile.am: don't run check-local - - * ftp/Makefile.am: don't run check-local - -Mon Mar 22 22:15:18 1999 Assar Westerlund - - * ftpd/ftpd.c (pass): fall-back for KRB_VERIFY_SECURE - - * ftpd/ftpd.c (pass): 1 -> KRB_VERIFY_SECURE - -Thu Mar 18 12:07:09 1999 Johan Danielsson - - * ftpd/Makefile.am: clean ftpcmd.c - - * ftpd/ftpd_locl.h: remove krb5.h (breaks in ftpcmd.y) - - * ftpd/ftpd.c: move include of krb5.h here - - * ftpd/Makefile.am: include Makefile.am.common - - * Makefile.am: include Makefile.am.common - - * ftp/Makefile.am: include Makefile.am.common - - * common/Makefile.am: include Makefile.am.common - -Tue Mar 16 22:28:37 1999 Assar Westerlund - - * ftpd/ftpd_locl.h: add krb5.h to get heimdal_version - - * ftpd/ftpd.c: krb_verify_user_multiple -> krb_verify_user - -Thu Mar 11 14:54:59 1999 Johan Danielsson - - * ftp/Makefile.in: WFLAGS - - * ftp/ruserpass.c: add some if-braces - -Wed Mar 10 20:02:55 1999 Johan Danielsson - - * ftpd/ftpd_locl.h: remove ifdef HAVE_FNMATCH - -Mon Mar 8 21:29:24 1999 Johan Danielsson - - * ftpd/ftpd.c: re-add version in greeting message - -Mon Mar 1 10:49:38 1999 Johan Danielsson - - * ftpd/logwtmp.c: HAVE_UT_* -> HAVE_STRUCT_UTMP*_UT_* - -Mon Feb 22 19:20:51 1999 Johan Danielsson - - * common/Makefile.in: remove glob - -Sat Feb 13 17:19:35 1999 Assar Westerlund - - * ftpd/ftpd.c (match): remove #ifdef HAVE_FNMATCH. We have a - fnmatch implementation in roken and therefore always have it. - - * ftp/ftp.c (copy_stream): initialize `werr' - -Wed Jan 13 23:52:57 1999 Assar Westerlund - - * ftpd/ftpcmd.y: moved all check_login and check_login_no_guest to - the end of the rules to ensure we don't generate several - (independent) error messages. once again, having a yacc-grammar - for FTP with embedded actions doesn't strike me as the most - optimal way of doing it. - -Tue Dec 1 14:44:29 1998 Johan Danielsson - - * ftpd/Makefile.am: link with extra libs for aix - -Sun Nov 22 10:28:20 1998 Assar Westerlund - - * ftpd/ftpd.c (retrying): support on-the-fly decompression - - * ftpd/Makefile.in (WFLAGS): set - - * ftp/ruserpass.c (guess_domain): new function - (ruserpass): use it - - * common/Makefile.in (WFLAGS): set - - * Makefile.in (WFLAGS): set - -Sat Nov 21 23:13:03 1998 Assar Westerlund - - * ftp/security.c: some more type correctness. - - * ftp/gssapi.c (gss_adat): more braces to shut up warnings - -Wed Nov 18 21:47:55 1998 Assar Westerlund - - * ftp/main.c (main): new option `-p' for enable passive mode. - -Mon Nov 2 01:57:49 1998 Assar Westerlund - - * ftp/ftp.c (getreply): remove extra `break' - - * ftp/gssapi.c (gss_auth): fixo typo(copyo?) - - * ftp/security.c (sec_login): fix loop and return value - -Tue Sep 1 16:56:42 1998 Johan Danielsson - - * ftp/cmds.c (quote1): fix % quoting bug - -Fri Aug 14 17:10:06 1998 Johan Danielsson - - * ftp/krb4.c: krb_put_int -> KRB_PUT_INT - -Tue Jun 30 18:07:15 1998 Assar Westerlund - - * ftp/security.c (auth): free `app_data' - (sec_end): only destroy if it was initialized - -Tue Jun 9 21:01:59 1998 Johan Danielsson - - * ftp/krb4.c: pass client address to krb_rd_req - -Sat May 16 00:02:07 1998 Assar Westerlund - - * ftpd/Makefile.am: link with DBLIB - -Tue May 12 14:15:32 1998 Johan Danielsson - - * ftp/gssapi.c: Save client name for userok(). - - * ftpd/gss_userok.c: Userok for gssapi. - -Fri May 1 07:15:01 1998 Assar Westerlund - - * ftp/ftp.c: unifdef -DHAVE_H_ERRNO - -Fri Mar 27 00:46:07 1998 Johan Danielsson - - * Make compile w/o krb4. - -Thu Mar 26 03:49:12 1998 Johan Danielsson - - * ftp/*, ftpd/*: Changes for new framework. - - * ftp/gssapi.c: GSS-API backend for the new security framework. - - * ftp/krb4.c: Updated for new framework. - - * ftp/security.{c,h}: New unified security framework. diff --git a/crypto/heimdal/appl/ftp/Makefile.am b/crypto/heimdal/appl/ftp/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -SUBDIRS = common ftp ftpd - -EXTRA_DIST = NTMakefile diff --git a/crypto/heimdal/appl/ftp/Makefile.in b/crypto/heimdal/appl/ftp/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/Makefile.in +++ /dev/null @@ -1,916 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -subdir = appl/ftp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/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 -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@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -SUBDIRS = common ftp ftpd -EXTRA_DIST = NTMakefile -all: all-recursive - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/ftp/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/ftp/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): - @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//`; \ - list='$(SUBDIRS)'; 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" - -$(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; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && 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 - -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" - -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 \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - 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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-recursive -all-am: Makefile all-local -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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ - ctags-recursive install-am install-data-am install-exec-am \ - install-strip tags-recursive uninstall-am - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool ctags ctags-recursive dist-hook \ - 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-data-hook \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook 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 uninstall-hook - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/appl/ftp/common/Makefile.am b/crypto/heimdal/appl/ftp/common/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/common/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += $(INCLUDE_krb4) - -noinst_LIBRARIES = libcommon.a - -libcommon_a_SOURCES = \ - sockbuf.c \ - buffer.c \ - common.h - -EXTRA_DIST = NTMakefile diff --git a/crypto/heimdal/appl/ftp/common/Makefile.in b/crypto/heimdal/appl/ftp/common/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/common/Makefile.in +++ /dev/null @@ -1,830 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common -subdir = appl/ftp/common -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS ?= cru -libcommon_a_AR = $(AR) $(ARFLAGS) -libcommon_a_LIBADD = -am_libcommon_a_OBJECTS = sockbuf.$(OBJEXT) buffer.$(OBJEXT) -libcommon_a_OBJECTS = $(am_libcommon_a_OBJECTS) -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 = $(libcommon_a_SOURCES) -DIST_SOURCES = $(libcommon_a_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_krb4) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -noinst_LIBRARIES = libcommon.a -libcommon_a_SOURCES = \ - sockbuf.c \ - buffer.c \ - common.h - -EXTRA_DIST = NTMakefile -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/ftp/common/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/ftp/common/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) -libcommon.a: $(libcommon_a_OBJECTS) $(libcommon_a_DEPENDENCIES) - -rm -f libcommon.a - $(libcommon_a_AR) libcommon.a $(libcommon_a_OBJECTS) $(libcommon_a_LIBADD) - $(RANLIB) libcommon.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/buffer.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sockbuf.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" - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(LIBRARIES) all-local -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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libtool clean-noinstLIBRARIES ctags \ - dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook 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-hook - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/appl/ftp/common/buffer.c b/crypto/heimdal/appl/ftp/common/buffer.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/common/buffer.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 1995-2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "common.h" -#include -#include -#include "roken.h" - -RCSID("$Id$"); - -/* - * Allocate a buffer enough to handle st->st_blksize, if - * there is such a field, otherwise BUFSIZ. - */ - -void * -alloc_buffer (void *oldbuf, size_t *sz, struct stat *st) -{ - size_t new_sz; - - new_sz = BUFSIZ; -#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE - if (st) - new_sz = max(BUFSIZ, st->st_blksize); -#endif - if(new_sz > *sz) { - if (oldbuf) - free (oldbuf); - oldbuf = malloc (new_sz); - if (oldbuf == NULL) { - warn ("malloc"); - *sz = 0; - return NULL; - } - *sz = new_sz; - } - return oldbuf; -} - diff --git a/crypto/heimdal/appl/ftp/common/common.h b/crypto/heimdal/appl/ftp/common/common.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/common/common.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 1995, 1996, 1997, 1998, 1999 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifndef __COMMON_H__ -#define __COMMON_H__ - -#include "base64.h" - -void set_buffer_size(int, int); - -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - -void *alloc_buffer (void *oldbuf, size_t *sz, struct stat *st); - -#endif /* __COMMON_H__ */ diff --git a/crypto/heimdal/appl/ftp/common/sockbuf.c b/crypto/heimdal/appl/ftp/common/sockbuf.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/common/sockbuf.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "common.h" -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - -RCSID("$Id$"); - -void -set_buffer_size(int fd, int read) -{ -#if defined(SO_RCVBUF) && defined(SO_SNDBUF) && defined(HAVE_SETSOCKOPT) - int size = 4194304; - int optname = read ? SO_RCVBUF : SO_SNDBUF; - -#ifdef HAVE_GETSOCKOPT - int curr=0; - socklen_t optlen; - - optlen = sizeof(curr); - if(getsockopt(fd, SOL_SOCKET, optname, (void *)&curr, &optlen) == 0) { - if(curr >= size) { - /* Already large enough */ - return; - } - } -#endif /* HAVE_GETSOCKOPT */ - - while(size >= 131072 && - setsockopt(fd, SOL_SOCKET, optname, (void *)&size, sizeof(size)) < 0) - size /= 2; -#endif -} - - diff --git a/crypto/heimdal/appl/ftp/ftp/Makefile.am b/crypto/heimdal/appl/ftp/ftp/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/Makefile.am +++ /dev/null @@ -1,44 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += -I$(srcdir)/../common $(INCLUDE_readline) $(INCLUDE_hcrypto) - -bin_PROGRAMS = ftp - -CHECK_LOCAL = - -if KRB5 -krb5_sources = gssapi.c -endif - -ftp_SOURCES = \ - cmds.c \ - cmdtab.c \ - extern.h \ - ftp.c \ - ftp_locl.h \ - ftp_var.h \ - main.c \ - pathnames.h \ - ruserpass.c \ - domacro.c \ - globals.c \ - security.c \ - security.h \ - kauth.c \ - $(krb5_sources) - -EXTRA_ftp_SOURCES = gssapi.c - -man_MANS = ftp.1 - -LDADD = \ - ../common/libcommon.a \ - $(LIB_gssapi) \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_roken) \ - $(LIB_readline) - -EXTRA_DIST = NTMakefile $(man_MANS) diff --git a/crypto/heimdal/appl/ftp/ftp/Makefile.in b/crypto/heimdal/appl/ftp/ftp/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/Makefile.in +++ /dev/null @@ -1,992 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common -bin_PROGRAMS = ftp$(EXEEXT) -subdir = appl/ftp/ftp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -PROGRAMS = $(bin_PROGRAMS) -am__ftp_SOURCES_DIST = cmds.c cmdtab.c extern.h ftp.c ftp_locl.h \ - ftp_var.h main.c pathnames.h ruserpass.c domacro.c globals.c \ - security.c security.h kauth.c gssapi.c -@KRB5_TRUE@am__objects_1 = gssapi.$(OBJEXT) -am_ftp_OBJECTS = cmds.$(OBJEXT) cmdtab.$(OBJEXT) ftp.$(OBJEXT) \ - main.$(OBJEXT) ruserpass.$(OBJEXT) domacro.$(OBJEXT) \ - globals.$(OBJEXT) security.$(OBJEXT) kauth.$(OBJEXT) \ - $(am__objects_1) -ftp_OBJECTS = $(am_ftp_OBJECTS) -ftp_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -ftp_DEPENDENCIES = ../common/libcommon.a $(LIB_gssapi) $(LIB_krb5) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) -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 = $(ftp_SOURCES) $(EXTRA_ftp_SOURCES) -DIST_SOURCES = $(am__ftp_SOURCES_DIST) $(EXTRA_ftp_SOURCES) -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' -man1dir = $(mandir)/man1 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/../common \ - $(INCLUDE_readline) $(INCLUDE_hcrypto) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -CHECK_LOCAL = -@KRB5_TRUE@krb5_sources = gssapi.c -ftp_SOURCES = \ - cmds.c \ - cmdtab.c \ - extern.h \ - ftp.c \ - ftp_locl.h \ - ftp_var.h \ - main.c \ - pathnames.h \ - ruserpass.c \ - domacro.c \ - globals.c \ - security.c \ - security.h \ - kauth.c \ - $(krb5_sources) - -EXTRA_ftp_SOURCES = gssapi.c -man_MANS = ftp.1 -LDADD = \ - ../common/libcommon.a \ - $(LIB_gssapi) \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_roken) \ - $(LIB_readline) - -EXTRA_DIST = NTMakefile $(man_MANS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/ftp/ftp/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/ftp/ftp/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) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - 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 -ftp$(EXEEXT): $(ftp_OBJECTS) $(ftp_DEPENDENCIES) - @rm -f ftp$(EXEEXT) - $(LINK) $(ftp_OBJECTS) $(ftp_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmds.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmdtab.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/domacro.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssapi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kauth.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ruserpass.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/security.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 -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ - } | 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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 -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man1 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libtool ctags \ - dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - 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-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-hook \ - uninstall-man uninstall-man1 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/appl/ftp/ftp/cmds.c b/crypto/heimdal/appl/ftp/ftp/cmds.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/cmds.c +++ /dev/null @@ -1,2148 +0,0 @@ -/* - * Copyright (c) 1985, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * FTP User Program -- Command Routines. - */ - -#include "ftp_locl.h" -RCSID("$Id$"); - -typedef void (*sighand)(int); - -jmp_buf jabort; -char *mname; -char *home = "/"; - -/* - * `Another' gets another argument, and stores the new argc and argv. - * It reverts to the top level (via main.c's intr()) on EOF/error. - * - * Returns false if no new arguments have been added. - */ -int -another(int *pargc, char ***pargv, char *prompt) -{ - int len = strlen(line), ret; - - if (len >= sizeof(line) - 3) { - printf("sorry, arguments too long\n"); - intr(0); - } - printf("(%s) ", prompt); - line[len++] = ' '; - if (fgets(&line[len], sizeof(line) - len, stdin) == NULL) - intr(0); - len += strlen(&line[len]); - if (len > 0 && line[len - 1] == '\n') - line[len - 1] = '\0'; - makeargv(); - ret = margc > *pargc; - *pargc = margc; - *pargv = margv; - return (ret); -} - -/* - * Connect to peer server and - * auto-login, if possible. - */ -void -setpeer(int argc, char **argv) -{ - char *host; - u_short port; - struct servent *sp; - - if (connected) { - printf("Already connected to %s, use close first.\n", - hostname); - code = -1; - return; - } - if (argc < 2) - another(&argc, &argv, "to"); - if (argc < 2 || argc > 3) { - printf("usage: %s host-name [port]\n", argv[0]); - code = -1; - return; - } - sp = getservbyname("ftp", "tcp"); - if (sp == NULL) - errx(1, "You bastard. You removed ftp/tcp from services"); - port = sp->s_port; - if (argc > 2) { - sp = getservbyname(argv[2], "tcp"); - if (sp != NULL) { - port = sp->s_port; - } else { - char *ep; - - port = strtol(argv[2], &ep, 0); - if (argv[2] == ep) { - printf("%s: bad port number-- %s\n", - argv[1], argv[2]); - printf ("usage: %s host-name [port]\n", - argv[0]); - code = -1; - return; - } - port = htons(port); - } - } - host = hookup(argv[1], port); - if (host) { - int overbose; - - connected = 1; - /* - * Set up defaults for FTP. - */ - strlcpy(typename, "ascii", sizeof(typename)); - type = TYPE_A; - curtype = TYPE_A; - strlcpy(formname, "non-print", sizeof(formname)); - form = FORM_N; - strlcpy(modename, "stream", sizeof(modename)); - mode = MODE_S; - strlcpy(structname, "file", sizeof(structname)); - stru = STRU_F; - strlcpy(bytename, "8", sizeof(bytename)); - bytesize = 8; - if (autologin) - login(argv[1]); - -#if (defined(unix) || defined(__unix__) || defined(__unix) || defined(_AIX) || defined(_CRAY) || defined(__NetBSD__) || defined(__APPLE__)) && NBBY == 8 -/* - * this ifdef is to keep someone form "porting" this to an incompatible - * system and not checking this out. This way they have to think about it. - */ - overbose = verbose; - if (debug == 0) - verbose = -1; - if (command("SYST") == COMPLETE && overbose && strlen(reply_string) > 4) { - char *cp, *p; - - cp = strdup(reply_string + 4); - if (cp == NULL) - errx(1, "strdup: out of memory"); - p = strchr(cp, ' '); - if (p == NULL) - p = strchr(cp, '\r'); - if (p) { - if (p[-1] == '.') - p--; - *p = '\0'; - } - - printf("Remote system type is %s.\n", cp); - free(cp); - } - if (!strncmp(reply_string, "215 UNIX Type: L8", 17)) { - if (proxy) - unix_proxy = 1; - else - unix_server = 1; - /* - * Set type to 0 (not specified by user), - * meaning binary by default, but don't bother - * telling server. We can use binary - * for text files unless changed by the user. - */ - type = 0; - strlcpy(typename, "binary", sizeof(typename)); - if (overbose) - printf("Using %s mode to transfer files.\n", - typename); - } else { - if (proxy) - unix_proxy = 0; - else - unix_server = 0; - if (overbose && - !strncmp(reply_string, "215 TOPS20", 10)) - printf( -"Remember to set tenex mode when transfering binary files from this machine.\n"); - } - verbose = overbose; -#endif /* unix */ - } -} - -struct types { - char *t_name; - char *t_mode; - int t_type; - char *t_arg; -} types[] = { - { "ascii", "A", TYPE_A, 0 }, - { "binary", "I", TYPE_I, 0 }, - { "image", "I", TYPE_I, 0 }, - { "ebcdic", "E", TYPE_E, 0 }, - { "tenex", "L", TYPE_L, bytename }, - { NULL } -}; - -/* - * Set transfer type. - */ -void -settype(int argc, char **argv) -{ - struct types *p; - int comret; - - if (argc > 2) { - char *sep; - - printf("usage: %s [", argv[0]); - sep = " "; - for (p = types; p->t_name; p++) { - printf("%s%s", sep, p->t_name); - sep = " | "; - } - printf(" ]\n"); - code = -1; - return; - } - if (argc < 2) { - printf("Using %s mode to transfer files.\n", typename); - code = 0; - return; - } - for (p = types; p->t_name; p++) - if (strcmp(argv[1], p->t_name) == 0) - break; - if (p->t_name == 0) { - printf("%s: unknown mode\n", argv[1]); - code = -1; - return; - } - if ((p->t_arg != NULL) && (*(p->t_arg) != '\0')) - comret = command ("TYPE %s %s", p->t_mode, p->t_arg); - else - comret = command("TYPE %s", p->t_mode); - if (comret == COMPLETE) { - strlcpy(typename, p->t_name, sizeof(typename)); - curtype = type = p->t_type; - } -} - -/* - * Internal form of settype; changes current type in use with server - * without changing our notion of the type for data transfers. - * Used to change to and from ascii for listings. - */ -void -changetype(int newtype, int show) -{ - struct types *p; - int comret, oldverbose = verbose; - - if (newtype == 0) - newtype = TYPE_I; - if (newtype == curtype) - return; - if (debug == 0 && show == 0) - verbose = 0; - for (p = types; p->t_name; p++) - if (newtype == p->t_type) - break; - if (p->t_name == 0) { - printf("ftp: internal error: unknown type %d\n", newtype); - return; - } - if (newtype == TYPE_L && bytename[0] != '\0') - comret = command("TYPE %s %s", p->t_mode, bytename); - else - comret = command("TYPE %s", p->t_mode); - if (comret == COMPLETE) - curtype = newtype; - verbose = oldverbose; -} - -char *stype[] = { - "type", - "", - 0 -}; - -/* - * Set binary transfer type. - */ -/*VARARGS*/ -void -setbinary(int argc, char **argv) -{ - - stype[1] = "binary"; - settype(2, stype); -} - -/* - * Set ascii transfer type. - */ -/*VARARGS*/ -void -setascii(int argc, char **argv) -{ - - stype[1] = "ascii"; - settype(2, stype); -} - -/* - * Set tenex transfer type. - */ -/*VARARGS*/ -void -settenex(int argc, char **argv) -{ - - stype[1] = "tenex"; - settype(2, stype); -} - -/* - * Set file transfer mode. - */ -/*ARGSUSED*/ -void -setftmode(int argc, char **argv) -{ - - printf("We only support %s mode, sorry.\n", modename); - code = -1; -} - -/* - * Set file transfer format. - */ -/*ARGSUSED*/ -void -setform(int argc, char **argv) -{ - - printf("We only support %s format, sorry.\n", formname); - code = -1; -} - -/* - * Set file transfer structure. - */ -/*ARGSUSED*/ -void -setstruct(int argc, char **argv) -{ - - printf("We only support %s structure, sorry.\n", structname); - code = -1; -} - -/* - * Send a single file. - */ -void -put(int argc, char **argv) -{ - char *cmd; - int loc = 0; - char *oldargv1, *oldargv2; - - if (argc == 2) { - argc++; - argv[2] = argv[1]; - loc++; - } - if (argc < 2 && !another(&argc, &argv, "local-file")) - goto usage; - if (argc < 3 && !another(&argc, &argv, "remote-file")) { -usage: - printf("usage: %s local-file remote-file\n", argv[0]); - code = -1; - return; - } - oldargv1 = argv[1]; - oldargv2 = argv[2]; - if (!globulize(&argv[1])) { - code = -1; - return; - } - /* - * If "globulize" modifies argv[1], and argv[2] is a copy of - * the old argv[1], make it a copy of the new argv[1]. - */ - if (argv[1] != oldargv1 && argv[2] == oldargv1) { - argv[2] = argv[1]; - } - cmd = (argv[0][0] == 'a') ? "APPE" : ((sunique) ? "STOU" : "STOR"); - if (loc && ntflag) { - argv[2] = dotrans(argv[2]); - } - if (loc && mapflag) { - argv[2] = domap(argv[2]); - } - sendrequest(cmd, argv[1], argv[2], - curtype == TYPE_I ? "rb" : "r", - argv[1] != oldargv1 || argv[2] != oldargv2); -} - -/* ARGSUSED */ -static RETSIGTYPE -mabort(int signo) -{ - int ointer; - - printf("\n"); - fflush(stdout); - if (mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with", mname)) { - interactive = ointer; - longjmp(jabort,0); - } - interactive = ointer; - } - mflag = 0; - longjmp(jabort,0); -} - -/* - * Send multiple files. - */ -void -mput(int argc, char **argv) -{ - int i; - RETSIGTYPE (*oldintr)(int); - int ointer; - char *tp; - - if (argc < 2 && !another(&argc, &argv, "local-files")) { - printf("usage: %s local-files\n", argv[0]); - code = -1; - return; - } - mname = argv[0]; - mflag = 1; - oldintr = signal(SIGINT, mabort); - setjmp(jabort); - if (proxy) { - char *cp, *tp2, tmpbuf[MaxPathLen]; - - while ((cp = remglob(argv,0)) != NULL) { - if (*cp == 0) { - mflag = 0; - continue; - } - if (mflag && confirm(argv[0], cp)) { - tp = cp; - if (mcase) { - while (*tp && !islower((unsigned char)*tp)) { - tp++; - } - if (!*tp) { - tp = cp; - tp2 = tmpbuf; - while ((*tp2 = *tp) != '\0') { - if (isupper((unsigned char)*tp2)) { - *tp2 = 'a' + *tp2 - 'A'; - } - tp++; - tp2++; - } - } - tp = tmpbuf; - } - if (ntflag) { - tp = dotrans(tp); - } - if (mapflag) { - tp = domap(tp); - } - sendrequest((sunique) ? "STOU" : "STOR", - cp, tp, - curtype == TYPE_I ? "rb" : "r", - cp != tp || !interactive); - if (!mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with","mput")) { - mflag++; - } - interactive = ointer; - } - } - } - signal(SIGINT, oldintr); - mflag = 0; - return; - } - for (i = 1; i < argc; i++) { - char **cpp; - glob_t gl; - int flags; - - if (!doglob) { - if (mflag && confirm(argv[0], argv[i])) { - tp = (ntflag) ? dotrans(argv[i]) : argv[i]; - tp = (mapflag) ? domap(tp) : tp; - sendrequest((sunique) ? "STOU" : "STOR", - argv[i], - curtype == TYPE_I ? "rb" : "r", - tp, tp != argv[i] || !interactive); - if (!mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with","mput")) { - mflag++; - } - interactive = ointer; - } - } - continue; - } - - memset(&gl, 0, sizeof(gl)); - flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; - if (glob(argv[i], flags, NULL, &gl) || gl.gl_pathc == 0) { - warnx("%s: not found", argv[i]); - globfree(&gl); - continue; - } - for (cpp = gl.gl_pathv; cpp && *cpp != NULL; cpp++) { - if (mflag && confirm(argv[0], *cpp)) { - tp = (ntflag) ? dotrans(*cpp) : *cpp; - tp = (mapflag) ? domap(tp) : tp; - sendrequest((sunique) ? "STOU" : "STOR", - *cpp, tp, - curtype == TYPE_I ? "rb" : "r", - *cpp != tp || !interactive); - if (!mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with","mput")) { - mflag++; - } - interactive = ointer; - } - } - } - globfree(&gl); - } - signal(SIGINT, oldintr); - mflag = 0; -} - -void -reget(int argc, char **argv) -{ - getit(argc, argv, 1, curtype == TYPE_I ? "r+wb" : "r+w"); -} - -void -get(int argc, char **argv) -{ - char *filemode; - - if (restart_point) { - if (curtype == TYPE_I) - filemode = "r+wb"; - else - filemode = "r+w"; - } else { - if (curtype == TYPE_I) - filemode = "wb"; - else - filemode = "w"; - } - - getit(argc, argv, 0, filemode); -} - -/* - * Receive one file. - */ -int -getit(int argc, char **argv, int restartit, char *filemode) -{ - int loc = 0; - int local_given = 1; - char *oldargv1, *oldargv2; - - if (argc == 2) { - argc++; - local_given = 0; - argv[2] = argv[1]; - loc++; - } - if ((argc < 2 && !another(&argc, &argv, "remote-file")) || - (argc < 3 && !another(&argc, &argv, "local-file"))) { - printf("usage: %s remote-file [ local-file ]\n", argv[0]); - code = -1; - return (0); - } - oldargv1 = argv[1]; - oldargv2 = argv[2]; - if (!globulize(&argv[2])) { - code = -1; - return (0); - } - if (loc && mcase) { - char *tp = argv[1], *tp2, tmpbuf[MaxPathLen]; - - while (*tp && !islower((unsigned char)*tp)) { - tp++; - } - if (!*tp) { - tp = argv[2]; - tp2 = tmpbuf; - while ((*tp2 = *tp) != '\0') { - if (isupper((unsigned char)*tp2)) { - *tp2 = 'a' + *tp2 - 'A'; - } - tp++; - tp2++; - } - argv[2] = tmpbuf; - } - } - if (loc && ntflag) - argv[2] = dotrans(argv[2]); - if (loc && mapflag) - argv[2] = domap(argv[2]); - if (restartit) { - struct stat stbuf; - int ret; - - ret = stat(argv[2], &stbuf); - if (restartit == 1) { - if (ret < 0) { - warn("local: %s", argv[2]); - return (0); - } - restart_point = stbuf.st_size; - } else if (ret == 0) { - int overbose; - int cmdret; - int yy, mo, day, hour, min, sec; - struct tm *tm; - time_t mtime = stbuf.st_mtime; - - overbose = verbose; - if (debug == 0) - verbose = -1; - cmdret = command("MDTM %s", argv[1]); - verbose = overbose; - if (cmdret != COMPLETE) { - printf("%s\n", reply_string); - return (0); - } - if (sscanf(reply_string, - "%*s %04d%02d%02d%02d%02d%02d", - &yy, &mo, &day, &hour, &min, &sec) - != 6) { - printf ("bad MDTM result\n"); - return (0); - } - - tm = gmtime(&mtime); - tm->tm_mon++; - tm->tm_year += 1900; - - if ((tm->tm_year > yy) || - (tm->tm_year == yy && - tm->tm_mon > mo) || - (tm->tm_mon == mo && - tm->tm_mday > day) || - (tm->tm_mday == day && - tm->tm_hour > hour) || - (tm->tm_hour == hour && - tm->tm_min > min) || - (tm->tm_min == min && - tm->tm_sec > sec)) - return (1); - } - } - - recvrequest("RETR", argv[2], argv[1], filemode, - argv[1] != oldargv1 || argv[2] != oldargv2, local_given); - restart_point = 0; - return (0); -} - -static int -suspicious_filename(const char *fn) -{ - return strstr(fn, "../") != NULL || *fn == '/'; -} - -/* - * Get multiple files. - */ -void -mget(int argc, char **argv) -{ - sighand oldintr; - int ch, ointer; - char *cp, *tp, *tp2, tmpbuf[MaxPathLen]; - - if (argc < 2 && !another(&argc, &argv, "remote-files")) { - printf("usage: %s remote-files\n", argv[0]); - code = -1; - return; - } - mname = argv[0]; - mflag = 1; - oldintr = signal(SIGINT, mabort); - setjmp(jabort); - while ((cp = remglob(argv,proxy)) != NULL) { - if (*cp == '\0') { - mflag = 0; - continue; - } - if (mflag && suspicious_filename(cp)) - printf("*** Suspicious filename: %s\n", cp); - if (mflag && confirm(argv[0], cp)) { - tp = cp; - if (mcase) { - for (tp2 = tmpbuf;(ch = (unsigned char)*tp++);) - *tp2++ = tolower(ch); - *tp2 = '\0'; - tp = tmpbuf; - } - if (ntflag) { - tp = dotrans(tp); - } - if (mapflag) { - tp = domap(tp); - } - recvrequest("RETR", tp, cp, - curtype == TYPE_I ? "wb" : "w", - tp != cp || !interactive, 0); - if (!mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with","mget")) { - mflag++; - } - interactive = ointer; - } - } - } - signal(SIGINT,oldintr); - mflag = 0; -} - -char * -remglob(char **argv, int doswitch) -{ - char temp[16]; - static char buf[MaxPathLen]; - static FILE *ftemp = NULL; - static char **args; - int oldverbose, oldhash; - char *cp, *filemode; - - if (!mflag) { - if (!doglob) { - args = NULL; - } - else { - if (ftemp) { - fclose(ftemp); - ftemp = NULL; - } - } - return (NULL); - } - if (!doglob) { - if (args == NULL) - args = argv; - if ((cp = *++args) == NULL) - args = NULL; - return (cp); - } - if (ftemp == NULL) { - int fd; - strlcpy(temp, _PATH_TMP_XXX, sizeof(temp)); - fd = mkstemp(temp); - if(fd < 0){ - warn("unable to create temporary file %s", temp); - return NULL; - } - close(fd); - oldverbose = verbose, verbose = 0; - oldhash = hash, hash = 0; - if (doswitch) { - pswitch(!proxy); - } - for (filemode = "w"; *++argv != NULL; filemode = "a") - recvrequest ("NLST", temp, *argv, filemode, 0, 0); - if (doswitch) { - pswitch(!proxy); - } - verbose = oldverbose; hash = oldhash; - ftemp = fopen(temp, "r"); - unlink(temp); - if (ftemp == NULL) { - printf("can't find list of remote files, oops\n"); - return (NULL); - } - } - while(fgets(buf, sizeof (buf), ftemp)) { - if ((cp = strchr(buf, '\n')) != NULL) - *cp = '\0'; - if(!interactive && suspicious_filename(buf)){ - printf("Ignoring remote globbed file `%s'\n", buf); - continue; - } - return buf; - } - fclose(ftemp); - ftemp = NULL; - return (NULL); -} - -char * -onoff(int bool) -{ - - return (bool ? "on" : "off"); -} - -/* - * Show status. - */ -/*ARGSUSED*/ -void -status(int argc, char **argv) -{ - int i; - - if (connected) - printf("Connected to %s.\n", hostname); - else - printf("Not connected.\n"); - if (!proxy) { - pswitch(1); - if (connected) { - printf("Connected for proxy commands to %s.\n", hostname); - } - else { - printf("No proxy connection.\n"); - } - pswitch(0); - } - sec_status(); - printf("Mode: %s; Type: %s; Form: %s; Structure: %s\n", - modename, typename, formname, structname); - printf("Verbose: %s; Bell: %s; Prompting: %s; Globbing: %s\n", - onoff(verbose), onoff(bell), onoff(interactive), - onoff(doglob)); - printf("Store unique: %s; Receive unique: %s\n", onoff(sunique), - onoff(runique)); - printf("Case: %s; CR stripping: %s\n",onoff(mcase),onoff(crflag)); - if (ntflag) { - printf("Ntrans: (in) %s (out) %s\n", ntin,ntout); - } - else { - printf("Ntrans: off\n"); - } - if (mapflag) { - printf("Nmap: (in) %s (out) %s\n", mapin, mapout); - } - else { - printf("Nmap: off\n"); - } - printf("Hash mark printing: %s; Use of PORT cmds: %s\n", - onoff(hash), onoff(sendport)); - if (macnum > 0) { - printf("Macros:\n"); - for (i=0; i 1) { - val = atoi(argv[1]); - if (val < 0) { - printf("%s: bad debugging value.\n", argv[1]); - code = -1; - return; - } - } else - val = !debug; - debug = val; - if (debug) - options |= SO_DEBUG; - else - options &= ~SO_DEBUG; - printf("Debugging %s (debug=%d).\n", onoff(debug), debug); - code = debug > 0; -} - -/* - * Set current working directory - * on remote machine. - */ -void -cd(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "remote-directory")) { - printf("usage: %s remote-directory\n", argv[0]); - code = -1; - return; - } - if (command("CWD %s", argv[1]) == ERROR && code == 500) { - if (verbose) - printf("CWD command not recognized, trying XCWD\n"); - command("XCWD %s", argv[1]); - } -} - -/* - * Set current working directory - * on local machine. - */ -void -lcd(int argc, char **argv) -{ - char buf[MaxPathLen]; - - if (argc < 2) - argc++, argv[1] = home; - if (argc != 2) { - printf("usage: %s local-directory\n", argv[0]); - code = -1; - return; - } - if (!globulize(&argv[1])) { - code = -1; - return; - } - if (chdir(argv[1]) < 0) { - warn("local: %s", argv[1]); - code = -1; - return; - } - if (getcwd(buf, sizeof(buf)) != NULL) - printf("Local directory now %s\n", buf); - else - warnx("getwd: %s", buf); - code = 0; -} - -/* - * Delete a single file. - */ -void -delete(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "remote-file")) { - printf("usage: %s remote-file\n", argv[0]); - code = -1; - return; - } - command("DELE %s", argv[1]); -} - -/* - * Delete multiple files. - */ -void -mdelete(int argc, char **argv) -{ - sighand oldintr; - int ointer; - char *cp; - - if (argc < 2 && !another(&argc, &argv, "remote-files")) { - printf("usage: %s remote-files\n", argv[0]); - code = -1; - return; - } - mname = argv[0]; - mflag = 1; - oldintr = signal(SIGINT, mabort); - setjmp(jabort); - while ((cp = remglob(argv,0)) != NULL) { - if (*cp == '\0') { - mflag = 0; - continue; - } - if (mflag && confirm(argv[0], cp)) { - command("DELE %s", cp); - if (!mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with", "mdelete")) { - mflag++; - } - interactive = ointer; - } - } - } - signal(SIGINT, oldintr); - mflag = 0; -} - -/* - * Rename a remote file. - */ -void -renamefile(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "from-name")) - goto usage; - if (argc < 3 && !another(&argc, &argv, "to-name")) { -usage: - printf("%s from-name to-name\n", argv[0]); - code = -1; - return; - } - if (command("RNFR %s", argv[1]) == CONTINUE) - command("RNTO %s", argv[2]); -} - -/* - * Get a directory listing - * of remote files. - */ -void -ls(int argc, char **argv) -{ - char *cmd; - - if (argc < 2) - argc++, argv[1] = NULL; - if (argc < 3) - argc++, argv[2] = "-"; - if (argc > 3) { - printf("usage: %s remote-directory local-file\n", argv[0]); - code = -1; - return; - } - cmd = argv[0][0] == 'n' ? "NLST" : "LIST"; - if (strcmp(argv[2], "-") && !globulize(&argv[2])) { - code = -1; - return; - } - if (strcmp(argv[2], "-") && *argv[2] != '|') - if (!globulize(&argv[2]) || !confirm("output to local-file:", - argv[2])) { - code = -1; - return; - } - recvrequest(cmd, argv[2], argv[1], "w", 0, 1); -} - -/* - * Get a directory listing - * of multiple remote files. - */ -void -mls(int argc, char **argv) -{ - sighand oldintr; - int ointer, i; - char *cmd, filemode[2], *dest; - - if (argc < 2 && !another(&argc, &argv, "remote-files")) - goto usage; - if (argc < 3 && !another(&argc, &argv, "local-file")) { -usage: - printf("usage: %s remote-files local-file\n", argv[0]); - code = -1; - return; - } - dest = argv[argc - 1]; - argv[argc - 1] = NULL; - if (strcmp(dest, "-") && *dest != '|') - if (!globulize(&dest) || - !confirm("output to local-file:", dest)) { - code = -1; - return; - } - cmd = argv[0][1] == 'l' ? "NLST" : "LIST"; - mname = argv[0]; - mflag = 1; - oldintr = signal(SIGINT, mabort); - setjmp(jabort); - filemode[1] = '\0'; - for (i = 1; mflag && i < argc-1; ++i) { - *filemode = (i == 1) ? 'w' : 'a'; - recvrequest(cmd, dest, argv[i], filemode, 0, 1); - if (!mflag && fromatty) { - ointer = interactive; - interactive = 1; - if (confirm("Continue with", argv[0])) { - mflag ++; - } - interactive = ointer; - } - } - signal(SIGINT, oldintr); - mflag = 0; -} - -/* - * Do a shell escape - */ -/*ARGSUSED*/ -void -shell(int argc, char **argv) -{ - pid_t pid; - RETSIGTYPE (*old1)(int), (*old2)(int); - char shellnam[40], *shellpath, *namep; - int waitstatus; - - old1 = signal (SIGINT, SIG_IGN); - old2 = signal (SIGQUIT, SIG_IGN); - if ((pid = fork()) == 0) { - for (pid = 3; pid < 20; pid++) - close(pid); - signal(SIGINT, SIG_DFL); - signal(SIGQUIT, SIG_DFL); - shellpath = getenv("SHELL"); - if (shellpath == NULL) - shellpath = _PATH_BSHELL; - namep = strrchr(shellpath, '/'); - if (namep == NULL) - namep = shellpath; - snprintf (shellnam, sizeof(shellnam), - "-%s", ++namep); - if (strcmp(namep, "sh") != 0) - shellnam[0] = '+'; - if (debug) { - printf ("%s\n", shellpath); - fflush (stdout); - } - if (argc > 1) { - execl(shellpath,shellnam,"-c",altarg,(char *)0); - } - else { - execl(shellpath,shellnam,(char *)0); - } - warn("%s", shellpath); - code = -1; - exit(1); - } - if (pid > 0) - while (waitpid(-1, &waitstatus, 0) != pid) - ; - signal(SIGINT, old1); - signal(SIGQUIT, old2); - if (pid == -1) { - warn("%s", "Try again later"); - code = -1; - } - else { - code = 0; - } -} - -/* - * Send new user information (re-login) - */ -void -user(int argc, char **argv) -{ - char acctstr[80]; - int n, aflag = 0; - char tmp[256]; - - if (argc < 2) - another(&argc, &argv, "username"); - if (argc < 2 || argc > 4) { - printf("usage: %s username [password] [account]\n", argv[0]); - code = -1; - return; - } - n = command("USER %s", argv[1]); - if (n == CONTINUE) { - if (argc < 3 ) { - UI_UTIL_read_pw_string (tmp, - sizeof(tmp), - "Password: ", 0); - argv[2] = tmp; - argc++; - } - n = command("PASS %s", argv[2]); - } - if (n == CONTINUE) { - if (argc < 4) { - printf("Account: "); fflush(stdout); - fgets(acctstr, sizeof(acctstr) - 1, stdin); - acctstr[strcspn(acctstr, "\r\n")] = '\0'; - argv[3] = acctstr; argc++; - } - n = command("ACCT %s", argv[3]); - aflag++; - } - if (n != COMPLETE) { - fprintf(stdout, "Login failed.\n"); - return; - } - if (!aflag && argc == 4) { - command("ACCT %s", argv[3]); - } -} - -/* - * Print working directory. - */ -/*VARARGS*/ -void -pwd(int argc, char **argv) -{ - int oldverbose = verbose; - - /* - * If we aren't verbose, this doesn't do anything! - */ - verbose = 1; - if (command("PWD") == ERROR && code == 500) { - printf("PWD command not recognized, trying XPWD\n"); - command("XPWD"); - } - verbose = oldverbose; -} - -/* - * Make a directory. - */ -void -makedir(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "directory-name")) { - printf("usage: %s directory-name\n", argv[0]); - code = -1; - return; - } - if (command("MKD %s", argv[1]) == ERROR && code == 500) { - if (verbose) - printf("MKD command not recognized, trying XMKD\n"); - command("XMKD %s", argv[1]); - } -} - -/* - * Remove a directory. - */ -void -removedir(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "directory-name")) { - printf("usage: %s directory-name\n", argv[0]); - code = -1; - return; - } - if (command("RMD %s", argv[1]) == ERROR && code == 500) { - if (verbose) - printf("RMD command not recognized, trying XRMD\n"); - command("XRMD %s", argv[1]); - } -} - -/* - * Send a line, verbatim, to the remote machine. - */ -void -quote(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "command line to send")) { - printf("usage: %s line-to-send\n", argv[0]); - code = -1; - return; - } - quote1("", argc, argv); -} - -/* - * Send a SITE command to the remote machine. The line - * is sent verbatim to the remote machine, except that the - * word "SITE" is added at the front. - */ -void -site(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "arguments to SITE command")) { - printf("usage: %s line-to-send\n", argv[0]); - code = -1; - return; - } - quote1("SITE ", argc, argv); -} - -/* - * Turn argv[1..argc) into a space-separated string, then prepend initial text. - * Send the result as a one-line command and get response. - */ -void -quote1(char *initial, int argc, char **argv) -{ - int i; - char buf[BUFSIZ]; /* must be >= sizeof(line) */ - - strlcpy(buf, initial, sizeof(buf)); - for(i = 1; i < argc; i++) { - if(i > 1) - strlcat(buf, " ", sizeof(buf)); - strlcat(buf, argv[i], sizeof(buf)); - } - if (command("%s", buf) == PRELIM) { - while (getreply(0) == PRELIM) - continue; - } -} - -void -do_chmod(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "mode")) - goto usage; - if (argc < 3 && !another(&argc, &argv, "file-name")) { -usage: - printf("usage: %s mode file-name\n", argv[0]); - code = -1; - return; - } - command("SITE CHMOD %s %s", argv[1], argv[2]); -} - -void -do_umask(int argc, char **argv) -{ - int oldverbose = verbose; - - verbose = 1; - command(argc == 1 ? "SITE UMASK" : "SITE UMASK %s", argv[1]); - verbose = oldverbose; -} - -void -ftp_idle(int argc, char **argv) -{ - int oldverbose = verbose; - - verbose = 1; - command(argc == 1 ? "SITE IDLE" : "SITE IDLE %s", argv[1]); - verbose = oldverbose; -} - -/* - * Ask the other side for help. - */ -void -rmthelp(int argc, char **argv) -{ - int oldverbose = verbose; - - verbose = 1; - command(argc == 1 ? "HELP" : "HELP %s", argv[1]); - verbose = oldverbose; -} - -/* - * Terminate session and exit. - */ -/*VARARGS*/ -void -quit(int argc, char **argv) -{ - - if (connected) - disconnect(0, 0); - pswitch(1); - if (connected) { - disconnect(0, 0); - } - exit(0); -} - -/* - * Terminate session, but don't exit. - */ -void -disconnect(int argc, char **argv) -{ - - if (!connected) - return; - command("QUIT"); - if (cout) { - fclose(cout); - } - cout = NULL; - connected = 0; - sec_end(); - data = -1; - if (!proxy) { - macnum = 0; - } -} - -int -confirm(char *cmd, char *file) -{ - char buf[BUFSIZ]; - - if (!interactive) - return (1); - printf("%s %s? ", cmd, file); - fflush(stdout); - if (fgets(buf, sizeof buf, stdin) == NULL) - return (0); - return (*buf == 'y' || *buf == 'Y'); -} - -void -fatal(char *msg) -{ - - errx(1, "%s", msg); -} - -/* - * Glob a local file name specification with - * the expectation of a single return value. - * Can't control multiple values being expanded - * from the expression, we return only the first. - */ -int -globulize(char **cpp) -{ - glob_t gl; - int flags; - - if (!doglob) - return (1); - - flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; - memset(&gl, 0, sizeof(gl)); - if (glob(*cpp, flags, NULL, &gl) || - gl.gl_pathc == 0) { - warnx("%s: not found", *cpp); - globfree(&gl); - return (0); - } - *cpp = strdup(gl.gl_pathv[0]); /* XXX - wasted memory */ - globfree(&gl); - return (1); -} - -void -account(int argc, char **argv) -{ - char acctstr[50]; - - if (argc > 1) { - ++argv; - --argc; - strlcpy (acctstr, *argv, sizeof(acctstr)); - while (argc > 1) { - --argc; - ++argv; - strlcat(acctstr, *argv, sizeof(acctstr)); - } - } - else { - UI_UTIL_read_pw_string(acctstr, sizeof(acctstr), "Account:", 0); - } - command("ACCT %s", acctstr); -} - -jmp_buf abortprox; - -static RETSIGTYPE -proxabort(int sig) -{ - - if (!proxy) { - pswitch(1); - } - if (connected) { - proxflag = 1; - } - else { - proxflag = 0; - } - pswitch(0); - longjmp(abortprox,1); -} - -void -doproxy(int argc, char **argv) -{ - struct cmd *c; - RETSIGTYPE (*oldintr)(int); - - if (argc < 2 && !another(&argc, &argv, "command")) { - printf("usage: %s command\n", argv[0]); - code = -1; - return; - } - c = getcmd(argv[1]); - if (c == (struct cmd *) -1) { - printf("?Ambiguous command\n"); - fflush(stdout); - code = -1; - return; - } - if (c == 0) { - printf("?Invalid command\n"); - fflush(stdout); - code = -1; - return; - } - if (!c->c_proxy) { - printf("?Invalid proxy command\n"); - fflush(stdout); - code = -1; - return; - } - if (setjmp(abortprox)) { - code = -1; - return; - } - oldintr = signal(SIGINT, proxabort); - pswitch(1); - if (c->c_conn && !connected) { - printf("Not connected\n"); - fflush(stdout); - pswitch(0); - signal(SIGINT, oldintr); - code = -1; - return; - } - (*c->c_handler)(argc-1, argv+1); - if (connected) { - proxflag = 1; - } - else { - proxflag = 0; - } - pswitch(0); - signal(SIGINT, oldintr); -} - -void -setcase(int argc, char **argv) -{ - - mcase = !mcase; - printf("Case mapping %s.\n", onoff(mcase)); - code = mcase; -} - -void -setcr(int argc, char **argv) -{ - - crflag = !crflag; - printf("Carriage Return stripping %s.\n", onoff(crflag)); - code = crflag; -} - -void -setntrans(int argc, char **argv) -{ - if (argc == 1) { - ntflag = 0; - printf("Ntrans off.\n"); - code = ntflag; - return; - } - ntflag++; - code = ntflag; - strlcpy (ntin, argv[1], 17); - if (argc == 2) { - ntout[0] = '\0'; - return; - } - strlcpy (ntout, argv[2], 17); -} - -char * -dotrans(char *name) -{ - static char new[MaxPathLen]; - char *cp1, *cp2 = new; - int i, ostop, found; - - for (ostop = 0; *(ntout + ostop) && ostop < 16; ostop++) - continue; - for (cp1 = name; *cp1; cp1++) { - found = 0; - for (i = 0; *(ntin + i) && i < 16; i++) { - if (*cp1 == *(ntin + i)) { - found++; - if (i < ostop) { - *cp2++ = *(ntout + i); - } - break; - } - } - if (!found) { - *cp2++ = *cp1; - } - } - *cp2 = '\0'; - return (new); -} - -void -setnmap(int argc, char **argv) -{ - char *cp; - - if (argc == 1) { - mapflag = 0; - printf("Nmap off.\n"); - code = mapflag; - return; - } - if (argc < 3 && !another(&argc, &argv, "mapout")) { - printf("Usage: %s [mapin mapout]\n",argv[0]); - code = -1; - return; - } - mapflag = 1; - code = 1; - cp = strchr(altarg, ' '); - if (cp == NULL) { - printf("Usage: %s missing space\n",argv[0]); - code = -1; - return; - } - if (proxy) { - while(*++cp == ' ') - continue; - altarg = cp; - cp = strchr(altarg, ' '); - } - *cp = '\0'; - strlcpy(mapin, altarg, MaxPathLen); - while (*++cp == ' ') - continue; - strlcpy(mapout, cp, MaxPathLen); -} - -char * -domap(char *name) -{ - static char new[MaxPathLen]; - char *cp1 = name, *cp2 = mapin; - char *tp[9], *te[9]; - int i, toks[9], toknum = 0, match = 1; - - for (i=0; i < 9; ++i) { - toks[i] = 0; - } - while (match && *cp1 && *cp2) { - switch (*cp2) { - case '\\': - if (*++cp2 != *cp1) { - match = 0; - } - break; - case '$': - if (*(cp2+1) >= '1' && (*cp2+1) <= '9') { - if (*cp1 != *(++cp2+1)) { - toks[toknum = *cp2 - '1']++; - tp[toknum] = cp1; - while (*++cp1 && *(cp2+1) - != *cp1); - te[toknum] = cp1; - } - cp2++; - break; - } - /* FALLTHROUGH */ - default: - if (*cp2 != *cp1) { - match = 0; - } - break; - } - if (match && *cp1) { - cp1++; - } - if (match && *cp2) { - cp2++; - } - } - if (!match && *cp1) /* last token mismatch */ - { - toks[toknum] = 0; - } - cp1 = new; - *cp1 = '\0'; - cp2 = mapout; - while (*cp2) { - match = 0; - switch (*cp2) { - case '\\': - if (*(cp2 + 1)) { - *cp1++ = *++cp2; - } - break; - case '[': -LOOP: - if (*++cp2 == '$' && isdigit((unsigned char)*(cp2+1))) { - if (*++cp2 == '0') { - char *cp3 = name; - - while (*cp3) { - *cp1++ = *cp3++; - } - match = 1; - } - else if (toks[toknum = *cp2 - '1']) { - char *cp3 = tp[toknum]; - - while (cp3 != te[toknum]) { - *cp1++ = *cp3++; - } - match = 1; - } - } - else { - while (*cp2 && *cp2 != ',' && - *cp2 != ']') { - if (*cp2 == '\\') { - cp2++; - } - else if (*cp2 == '$' && - isdigit((unsigned char)*(cp2+1))) { - if (*++cp2 == '0') { - char *cp3 = name; - - while (*cp3) { - *cp1++ = *cp3++; - } - } - else if (toks[toknum = - *cp2 - '1']) { - char *cp3=tp[toknum]; - - while (cp3 != - te[toknum]) { - *cp1++ = *cp3++; - } - } - } - else if (*cp2) { - *cp1++ = *cp2++; - } - } - if (!*cp2) { - printf("nmap: unbalanced brackets\n"); - return (name); - } - match = 1; - cp2--; - } - if (match) { - while (*++cp2 && *cp2 != ']') { - if (*cp2 == '\\' && *(cp2 + 1)) { - cp2++; - } - } - if (!*cp2) { - printf("nmap: unbalanced brackets\n"); - return (name); - } - break; - } - switch (*++cp2) { - case ',': - goto LOOP; - case ']': - break; - default: - cp2--; - goto LOOP; - } - break; - case '$': - if (isdigit((unsigned char)*(cp2 + 1))) { - if (*++cp2 == '0') { - char *cp3 = name; - - while (*cp3) { - *cp1++ = *cp3++; - } - } - else if (toks[toknum = *cp2 - '1']) { - char *cp3 = tp[toknum]; - - while (cp3 != te[toknum]) { - *cp1++ = *cp3++; - } - } - break; - } - /* intentional drop through */ - default: - *cp1++ = *cp2; - break; - } - cp2++; - } - *cp1 = '\0'; - if (!*new) { - return (name); - } - return (new); -} - -void -setpassive(int argc, char **argv) -{ - - passivemode = !passivemode; - printf("Passive mode %s.\n", onoff(passivemode)); - code = passivemode; -} - -void -setsunique(int argc, char **argv) -{ - - sunique = !sunique; - printf("Store unique %s.\n", onoff(sunique)); - code = sunique; -} - -void -setrunique(int argc, char **argv) -{ - - runique = !runique; - printf("Receive unique %s.\n", onoff(runique)); - code = runique; -} - -/* change directory to perent directory */ -void -cdup(int argc, char **argv) -{ - - if (command("CDUP") == ERROR && code == 500) { - if (verbose) - printf("CDUP command not recognized, trying XCUP\n"); - command("XCUP"); - } -} - -/* restart transfer at specific point */ -void -restart(int argc, char **argv) -{ - - if (argc != 2) - printf("restart: offset not specified\n"); - else { - restart_point = atol(argv[1]); - printf("restarting at %ld. %s\n", (long)restart_point, - "execute get, put or append to initiate transfer"); - } -} - -/* show remote system type */ -void -syst(int argc, char **argv) -{ - - command("SYST"); -} - -void -macdef(int argc, char **argv) -{ - char *tmp; - int c; - - if (macnum == 16) { - printf("Limit of 16 macros have already been defined\n"); - code = -1; - return; - } - if (argc < 2 && !another(&argc, &argv, "macro name")) { - printf("Usage: %s macro_name\n",argv[0]); - code = -1; - return; - } - if (interactive) { - printf("Enter macro line by line, terminating it with a null line\n"); - } - strlcpy(macros[macnum].mac_name, - argv[1], - sizeof(macros[macnum].mac_name)); - if (macnum == 0) { - macros[macnum].mac_start = macbuf; - } - else { - macros[macnum].mac_start = macros[macnum - 1].mac_end + 1; - } - tmp = macros[macnum].mac_start; - while (tmp != macbuf+4096) { - if ((c = getchar()) == EOF) { - printf("macdef:end of file encountered\n"); - code = -1; - return; - } - if ((*tmp = c) == '\n') { - if (tmp == macros[macnum].mac_start) { - macros[macnum++].mac_end = tmp; - code = 0; - return; - } - if (*(tmp-1) == '\0') { - macros[macnum++].mac_end = tmp - 1; - code = 0; - return; - } - *tmp = '\0'; - } - tmp++; - } - while (1) { - while ((c = getchar()) != '\n' && c != EOF) - /* LOOP */; - if (c == EOF || getchar() == '\n') { - printf("Macro not defined - 4k buffer exceeded\n"); - code = -1; - return; - } - } -} - -/* - * get size of file on remote machine - */ -void -sizecmd(int argc, char **argv) -{ - - if (argc < 2 && !another(&argc, &argv, "filename")) { - printf("usage: %s filename\n", argv[0]); - code = -1; - return; - } - command("SIZE %s", argv[1]); -} - -/* - * get last modification time of file on remote machine - */ -void -modtime(int argc, char **argv) -{ - int overbose; - - if (argc < 2 && !another(&argc, &argv, "filename")) { - printf("usage: %s filename\n", argv[0]); - code = -1; - return; - } - overbose = verbose; - if (debug == 0) - verbose = -1; - if (command("MDTM %s", argv[1]) == COMPLETE) { - int yy, mo, day, hour, min, sec; - sscanf(reply_string, "%*s %04d%02d%02d%02d%02d%02d", &yy, &mo, - &day, &hour, &min, &sec); - /* might want to print this in local time */ - printf("%s\t%02d/%02d/%04d %02d:%02d:%02d GMT\n", argv[1], - mo, day, yy, hour, min, sec); - } else - printf("%s\n", reply_string); - verbose = overbose; -} - -/* - * show status on reomte machine - */ -void -rmtstatus(int argc, char **argv) -{ - - command(argc > 1 ? "STAT %s" : "STAT" , argv[1]); -} - -/* - * get file if modtime is more recent than current file - */ -void -newer(int argc, char **argv) -{ - - if (getit(argc, argv, -1, curtype == TYPE_I ? "wb" : "w")) - printf("Local file \"%s\" is newer than remote file \"%s\"\n", - argv[2], argv[1]); -} - -void -klist(int argc, char **argv) -{ - int ret; - if(argc != 1){ - printf("usage: %s\n", argv[0]); - code = -1; - return; - } - - ret = command("SITE KLIST"); - code = (ret == COMPLETE); -} diff --git a/crypto/heimdal/appl/ftp/ftp/cmdtab.c b/crypto/heimdal/appl/ftp/ftp/cmdtab.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/cmdtab.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (c) 1985, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftp_locl.h" - -/* - * User FTP -- Command Tables. - */ - -char accounthelp[] = "send account command to remote server"; -char appendhelp[] = "append to a file"; -char asciihelp[] = "set ascii transfer type"; -char beephelp[] = "beep when command completed"; -char binaryhelp[] = "set binary transfer type"; -char casehelp[] = "toggle mget upper/lower case id mapping"; -char cdhelp[] = "change remote working directory"; -char cduphelp[] = "change remote working directory to parent directory"; -char chmodhelp[] = "change file permissions of remote file"; -char connecthelp[] = "connect to remote tftp"; -char crhelp[] = "toggle carriage return stripping on ascii gets"; -char deletehelp[] = "delete remote file"; -char debughelp[] = "toggle/set debugging mode"; -char dirhelp[] = "list contents of remote directory"; -char disconhelp[] = "terminate ftp session"; -char domachelp[] = "execute macro"; -char formhelp[] = "set file transfer format"; -char globhelp[] = "toggle metacharacter expansion of local file names"; -char hashhelp[] = "toggle printing `#' for each buffer transferred"; -char helphelp[] = "print local help information"; -char idlehelp[] = "get (set) idle timer on remote side"; -char lcdhelp[] = "change local working directory"; -char lshelp[] = "list contents of remote directory"; -char macdefhelp[] = "define a macro"; -char mdeletehelp[] = "delete multiple files"; -char mdirhelp[] = "list contents of multiple remote directories"; -char mgethelp[] = "get multiple files"; -char mkdirhelp[] = "make directory on the remote machine"; -char mlshelp[] = "list contents of multiple remote directories"; -char modtimehelp[] = "show last modification time of remote file"; -char modehelp[] = "set file transfer mode"; -char mputhelp[] = "send multiple files"; -char newerhelp[] = "get file if remote file is newer than local file "; -char nlisthelp[] = "nlist contents of remote directory"; -char nmaphelp[] = "set templates for default file name mapping"; -char ntranshelp[] = "set translation table for default file name mapping"; -char porthelp[] = "toggle use of PORT cmd for each data connection"; -char prompthelp[] = "force interactive prompting on multiple commands"; -char proxyhelp[] = "issue command on alternate connection"; -char pwdhelp[] = "print working directory on remote machine"; -char quithelp[] = "terminate ftp session and exit"; -char quotehelp[] = "send arbitrary ftp command"; -char receivehelp[] = "receive file"; -char regethelp[] = "get file restarting at end of local file"; -char remotehelp[] = "get help from remote server"; -char renamehelp[] = "rename file"; -char restarthelp[]= "restart file transfer at bytecount"; -char rmdirhelp[] = "remove directory on the remote machine"; -char rmtstatushelp[]="show status of remote machine"; -char runiquehelp[] = "toggle store unique for local files"; -char resethelp[] = "clear queued command replies"; -char sendhelp[] = "send one file"; -char passivehelp[] = "enter passive transfer mode"; -char sitehelp[] = "send site specific command to remote server\n\t\tTry \"rhelp site\" or \"site help\" for more information"; -char shellhelp[] = "escape to the shell"; -char sizecmdhelp[] = "show size of remote file"; -char statushelp[] = "show current status"; -char structhelp[] = "set file transfer structure"; -char suniquehelp[] = "toggle store unique on remote machine"; -char systemhelp[] = "show remote system type"; -char tenexhelp[] = "set tenex file transfer type"; -char tracehelp[] = "toggle packet tracing"; -char typehelp[] = "set file transfer type"; -char umaskhelp[] = "get (set) umask on remote side"; -char userhelp[] = "send new user information"; -char verbosehelp[] = "toggle verbose mode"; - -char prothelp[] = "set protection level"; -char prothelp_c[] = "set command protection level"; -#if defined(KRB5) -char klisthelp[] = "show remote tickets"; -#endif -#if defined(KRB5) -char afsloghelp[] = "obtain remote AFS tokens"; -#endif - -struct cmd cmdtab[] = { - { "!", shellhelp, 0, 0, 0, shell }, - { "$", domachelp, 1, 0, 0, domacro }, - { "account", accounthelp, 0, 1, 1, account}, - { "append", appendhelp, 1, 1, 1, put }, - { "ascii", asciihelp, 0, 1, 1, setascii }, - { "bell", beephelp, 0, 0, 0, setbell }, - { "binary", binaryhelp, 0, 1, 1, setbinary }, - { "bye", quithelp, 0, 0, 0, quit }, - { "case", casehelp, 0, 0, 1, setcase }, - { "cd", cdhelp, 0, 1, 1, cd }, - { "cdup", cduphelp, 0, 1, 1, cdup }, - { "chmod", chmodhelp, 0, 1, 1, do_chmod }, - { "close", disconhelp, 0, 1, 1, disconnect }, - { "cr", crhelp, 0, 0, 0, setcr }, - { "delete", deletehelp, 0, 1, 1, delete }, - { "debug", debughelp, 0, 0, 0, setdebug }, - { "dir", dirhelp, 1, 1, 1, ls }, - { "disconnect", disconhelp, 0, 1, 1, disconnect }, - { "form", formhelp, 0, 1, 1, setform }, - { "get", receivehelp, 1, 1, 1, get }, - { "glob", globhelp, 0, 0, 0, setglob }, - { "hash", hashhelp, 0, 0, 0, sethash }, - { "help", helphelp, 0, 0, 1, help }, - { "idle", idlehelp, 0, 1, 1, ftp_idle }, - { "image", binaryhelp, 0, 1, 1, setbinary }, - { "lcd", lcdhelp, 0, 0, 0, lcd }, - { "ls", lshelp, 1, 1, 1, ls }, - { "macdef", macdefhelp, 0, 0, 0, macdef }, - { "mdelete", mdeletehelp, 1, 1, 1, mdelete }, - { "mdir", mdirhelp, 1, 1, 1, mls }, - { "mget", mgethelp, 1, 1, 1, mget }, - { "mkdir", mkdirhelp, 0, 1, 1, makedir }, - { "mls", mlshelp, 1, 1, 1, mls }, - { "mode", modehelp, 0, 1, 1, setftmode }, - { "modtime", modtimehelp, 0, 1, 1, modtime }, - { "mput", mputhelp, 1, 1, 1, mput }, - { "newer", newerhelp, 1, 1, 1, newer }, - { "nmap", nmaphelp, 0, 0, 1, setnmap }, - { "nlist", nlisthelp, 1, 1, 1, ls }, - { "ntrans", ntranshelp, 0, 0, 1, setntrans }, - { "open", connecthelp, 0, 0, 1, setpeer }, - { "passive", passivehelp, 0, 0, 0, setpassive }, - { "prompt", prompthelp, 0, 0, 0, setprompt }, - { "proxy", proxyhelp, 0, 0, 1, doproxy }, - { "sendport", porthelp, 0, 0, 0, setport }, - { "put", sendhelp, 1, 1, 1, put }, - { "pwd", pwdhelp, 0, 1, 1, pwd }, - { "quit", quithelp, 0, 0, 0, quit }, - { "quote", quotehelp, 1, 1, 1, quote }, - { "recv", receivehelp, 1, 1, 1, get }, - { "reget", regethelp, 1, 1, 1, reget }, - { "rstatus", rmtstatushelp, 0, 1, 1, rmtstatus }, - { "rhelp", remotehelp, 0, 1, 1, rmthelp }, - { "rename", renamehelp, 0, 1, 1, renamefile }, - { "reset", resethelp, 0, 1, 1, reset }, - { "restart", restarthelp, 1, 1, 1, restart }, - { "rmdir", rmdirhelp, 0, 1, 1, removedir }, - { "runique", runiquehelp, 0, 0, 1, setrunique }, - { "send", sendhelp, 1, 1, 1, put }, - { "site", sitehelp, 0, 1, 1, site }, - { "size", sizecmdhelp, 1, 1, 1, sizecmd }, - { "status", statushelp, 0, 0, 1, status }, - { "struct", structhelp, 0, 1, 1, setstruct }, - { "system", systemhelp, 0, 1, 1, syst }, - { "sunique", suniquehelp, 0, 0, 1, setsunique }, - { "tenex", tenexhelp, 0, 1, 1, settenex }, - { "trace", tracehelp, 0, 0, 0, settrace }, - { "type", typehelp, 0, 1, 1, settype }, - { "user", userhelp, 0, 1, 1, user }, - { "umask", umaskhelp, 0, 1, 1, do_umask }, - { "verbose", verbosehelp, 0, 0, 0, setverbose }, - { "?", helphelp, 0, 0, 1, help }, - - { "protect", prothelp, 0, 1, 0, sec_prot }, - /* what MIT uses */ - { "cprotect", prothelp_c, 0, 1, 1, sec_prot_command }, -#if defined(KRB5) - { "klist", klisthelp, 0, 1, 0, klist }, -#endif -#if defined(KRB5) - { "afslog", afsloghelp, 0, 1, 0, afslog }, -#endif - - { 0 }, -}; - -int NCMDS = (sizeof (cmdtab) / sizeof (cmdtab[0])) - 1; diff --git a/crypto/heimdal/appl/ftp/ftp/domacro.c b/crypto/heimdal/appl/ftp/ftp/domacro.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/domacro.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 1985, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftp_locl.h" -RCSID("$Id$"); - -void -domacro(int argc, char **argv) -{ - int i, j, count = 2, loopflg = 0; - char *cp1, *cp2, line2[200]; - struct cmd *c; - - if (argc < 2 && !another(&argc, &argv, "macro name")) { - printf("Usage: %s macro_name.\n", argv[0]); - code = -1; - return; - } - for (i = 0; i < macnum; ++i) { - if (!strncmp(argv[1], macros[i].mac_name, 9)) { - break; - } - } - if (i == macnum) { - printf("'%s' macro not found.\n", argv[1]); - code = -1; - return; - } - strlcpy(line2, line, sizeof(line2)); -TOP: - cp1 = macros[i].mac_start; - while (cp1 != macros[i].mac_end) { - while (isspace((unsigned char)*cp1)) { - cp1++; - } - cp2 = line; - while (*cp1 != '\0') { - size_t len; - switch(*cp1) { - case '\\': - if (line + sizeof(line) - 2 < cp2) - goto out; - *cp2++ = *++cp1; - break; - case '$': - if (isdigit((unsigned char)*(cp1+1))) { - j = 0; - while (isdigit((unsigned char)*++cp1)) { - j = 10*j + *cp1 - '0'; - } - cp1--; - if (argc - 2 >= j) { - len = sizeof(line) - (cp2 - line) - 1; - if (strlcpy(cp2, argv[j+1], len) >= len) - goto out; - cp2 += strlen(argv[j+1]); - } - break; - } - if (*(cp1+1) == 'i') { - loopflg = 1; - cp1++; - if (count < argc) { - len = sizeof(line) - (cp2 - line) - 1; - if (strlcpy(cp2, argv[count], len) >= len) - goto out; - cp2 += strlen(argv[count]); - } - break; - } - /* intentional drop through */ - default: - if (line + sizeof(line) - 2 < cp2) - goto out; - *cp2++ = *cp1; - break; - } - if (*cp1 != '\0') { - cp1++; - } - } - out: - *cp2 = '\0'; - makeargv(); - c = getcmd(margv[0]); - if (c == (struct cmd *)-1) { - printf("?Ambiguous command\n"); - code = -1; - } - else if (c == 0) { - printf("?Invalid command\n"); - code = -1; - } - else if (c->c_conn && !connected) { - printf("Not connected.\n"); - code = -1; - } - else { - if (verbose) { - printf("%s\n",line); - } - (*c->c_handler)(margc, margv); - if (bell && c->c_bell) { - putchar('\007'); - } - strlcpy(line, line2, sizeof(line)); - makeargv(); - argc = margc; - argv = margv; - } - if (cp1 != macros[i].mac_end) { - cp1++; - } - } - if (loopflg && ++count < argc) { - goto TOP; - } -} diff --git a/crypto/heimdal/appl/ftp/ftp/extern.h b/crypto/heimdal/appl/ftp/ftp/extern.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/extern.h +++ /dev/null @@ -1,174 +0,0 @@ -/*- - * Copyright (c) 1994 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)extern.h 8.3 (Berkeley) 10/9/94 - */ - -/* $Id$ */ - -#include -#include -#ifdef TIME_WITH_SYS_TIME -#include -#include -#elif defined(HAVE_SYS_TIME_H) -#include -#else -#include -#endif -#ifdef HAVE_SYS_SELECT_H -#include -#endif - -void abort_remote (FILE *); -void abortpt (int); -void abortrecv (int); -void account (int, char **); -int another (int *, char ***, char *); -void blkfree (char **); -void cd (int, char **); -void cdup (int, char **); -void changetype (int, int); -void cmdabort (int); -void cmdscanner (int); -int command (char *fmt, ...) - __attribute__ ((format (printf, 1,2))); -int confirm (char *, char *); -FILE *dataconn (const char *); -void delete (int, char **); -void disconnect (int, char **); -void do_chmod (int, char **); -void do_umask (int, char **); -void domacro (int, char **); -char *domap (char *); -void doproxy (int, char **); -char *dotrans (char *); -int empty (fd_set *, int); -void fatal (char *); -void get (int, char **); -struct cmd *getcmd (char *); -int getit (int, char **, int, char *); -int getreply (int); -int globulize (char **); -char *gunique (char *); -void help (int, char **); -char *hookup (const char *, int); -void ftp_idle (int, char **); -int initconn (void); -void intr (int); -void lcd (int, char **); -int login (char *); -RETSIGTYPE lostpeer (int); -void ls (int, char **); -void macdef (int, char **); -void makeargv (void); -void makedir (int, char **); -void mdelete (int, char **); -void mget (int, char **); -void mls (int, char **); -void modtime (int, char **); -void mput (int, char **); -char *onoff (int); -void newer (int, char **); -void proxtrans (char *, char *, char *); -void psabort (int); -void pswitch (int); -void ptransfer (char *, long, struct timeval *, struct timeval *); -void put (int, char **); -void pwd (int, char **); -void quit (int, char **); -void quote (int, char **); -void quote1 (char *, int, char **); -void recvrequest (char *, char *, char *, char *, int, int); -void reget (int, char **); -char *remglob (char **, int); -void removedir (int, char **); -void renamefile (int, char **); -void reset (int, char **); -void restart (int, char **); -void rmthelp (int, char **); -void rmtstatus (int, char **); -int ruserpassword (char *, char **, char **, char **); -void sendrequest (char *, char *, char *, char *, int); -void setascii (int, char **); -void setbell (int, char **); -void setbinary (int, char **); -void setcase (int, char **); -void setcr (int, char **); -void setdebug (int, char **); -void setform (int, char **); -void setftmode (int, char **); -void setglob (int, char **); -void sethash (int, char **); -void setnmap (int, char **); -void setntrans (int, char **); -void setpassive (int, char **); -void setpeer (int, char **); -void setport (int, char **); -void setprompt (int, char **); -void setrunique (int, char **); -void setstruct (int, char **); -void setsunique (int, char **); -void settenex (int, char **); -void settrace (int, char **); -void settype (int, char **); -void setverbose (int, char **); -void shell (int, char **); -void site (int, char **); -void sizecmd (int, char **); -char *slurpstring (void); -void status (int, char **); -void syst (int, char **); -void tvsub (struct timeval *, struct timeval *, struct timeval *); -void user (int, char **); - -extern jmp_buf abortprox; -extern int abrtflag; -extern struct cmd cmdtab[]; -extern FILE *cout; -extern int data; -extern char *home; -extern jmp_buf jabort; -extern int proxy; -extern char reply_string[]; -extern off_t restart_point; -extern int NCMDS; - -extern char username[32]; -extern char myhostname[]; -extern char *mydomain; - -void afslog (int, char **); -void kauth (int, char **); -void kdestroy (int, char **); -void klist (int, char **); -void krbtkfile (int, char **); diff --git a/crypto/heimdal/appl/ftp/ftp/ftp.1 b/crypto/heimdal/appl/ftp/ftp/ftp.1 deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/ftp.1 +++ /dev/null @@ -1,1211 +0,0 @@ -.\" $NetBSD: ftp.1,v 1.11 1995/09/08 01:06:24 tls Exp $ -.\" -.\" Copyright (c) 1985, 1989, 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)ftp.1 8.3 (Berkeley) 10/9/94 -.\" -.Dd March 23, 2006 -.Dt FTP 1 -.Os BSD 4.2 -.Sh NAME -.Nm ftp -.Nd -.Tn ARPANET -file transfer program -.Sh SYNOPSIS -.Nm ftp -.Op Fl K -.Op Fl d -.Op Fl g -.Op Fl i -.Op Fl l -.Op Fl n -.Op Fl p -.Op Fl t -.Op Fl v -.Op Fl x -.Op Fl Fl no-gss-bindings -.Op Fl Fl no-gss-delegate -.Op Ar host -.Sh DESCRIPTION -.Nm -is the user interface to the -.Tn ARPANET -standard File Transfer Protocol. -The program allows a user to transfer files to and from a -remote network site. -.Pp -Modifications have been made so that it almost follows the FTP -Security Extensions, RFC 2228. -.Pp -Options may be specified at the command line, or to the -command interpreter. -.Bl -tag -width flag -.It Fl K -Disable Kerberos authentication. -.It Fl t -Enables packet tracing. -.It Fl v -Verbose option forces -.Nm ftp -to show all responses from the remote server, as well -as report on data transfer statistics. -.It Fl n -Restrains -.Nm ftp -from attempting \*(Lqauto-login\*(Rq upon initial connection. -If auto-login is enabled, -.Nm ftp -will check the -.Pa .netrc -(see below) file in the user's home directory for an entry describing -an account on the remote machine. -If no entry exists, -.Nm ftp -will prompt for the remote machine login name (default is the user -identity on the local machine), and, if necessary, prompt for a password -and an account with which to login. -.It Fl i -Turns off interactive prompting during -multiple file transfers. -.It Fl p -Turn on passive mode. -.It Fl d -Enables debugging. -.It Fl g -Disables file name globbing. - .It Fl Fl no-gss-bindings -Don't use GSS-API bindings when talking to peer. IP addresses will not -be checked to ensure they match. -.It Fl Fl no-gss-delegate -Disable delegation of GSSAPI credentials. -.It Fl l -Disables command line editing. -.It Fl x -Encrypt command and data channel. -.El -.Pp -The client host with which -.Nm ftp -is to communicate may be specified on the command line. -If this is done, -.Nm ftp -will immediately attempt to establish a connection to an -.Tn FTP -server on that host; otherwise, -.Nm ftp -will enter its command interpreter and await instructions -from the user. -When -.Nm ftp -is awaiting commands from the user the prompt -.Ql ftp\*[Gt] -is provided to the user. -The following commands are recognized -by -.Nm ftp : -.Bl -tag -width Fl -.It Ic \&! Op Ar command Op Ar args -Invoke an interactive shell on the local machine. -If there are arguments, the first is taken to be a command to execute -directly, with the rest of the arguments as its arguments. -.It Ic \&$ Ar macro-name Op Ar args -Execute the macro -.Ar macro-name -that was defined with the -.Ic macdef -command. -Arguments are passed to the macro unglobbed. -.It Ic account Op Ar passwd -Supply a supplemental password required by a remote system for access -to resources once a login has been successfully completed. -If no argument is included, the user will be prompted for an account -password in a non-echoing input mode. -.It Ic append Ar local-file Op Ar remote-file -Append a local file to a file on the remote machine. -If -.Ar remote-file -is left unspecified, the local file name is used in naming the -remote file after being altered by any -.Ic ntrans -or -.Ic nmap -setting. -File transfer uses the current settings for -.Ic type , -.Ic format , -.Ic mode , -and -.Ic structure . -.It Ic ascii -Set the file transfer -.Ic type -to network -.Tn ASCII . -This is the default type. -.It Ic bell -Arrange that a bell be sounded after each file transfer -command is completed. -.It Ic binary -Set the file transfer -.Ic type -to support binary image transfer. -.It Ic bye -Terminate the -.Tn FTP -session with the remote server -and exit -.Nm ftp . -An end of file will also terminate the session and exit. -.It Ic case -Toggle remote computer file name case mapping during -.Ic mget -commands. -When -.Ic case -is on (default is off), remote computer file names with all letters in -upper case are written in the local directory with the letters mapped -to lower case. -.It Ic \&cd Ar remote-directory -Change the working directory on the remote machine -to -.Ar remote-directory . -.It Ic cdup -Change the remote machine working directory to the parent of the -current remote machine working directory. -.It Ic chmod Ar mode file-name -Change the permission modes of the file -.Ar file-name -on the remote -system to -.Ar mode . -.It Ic close -Terminate the -.Tn FTP -session with the remote server, and -return to the command interpreter. -Any defined macros are erased. -.It Ic \&cr -Toggle carriage return stripping during -ascii type file retrieval. -Records are denoted by a carriage return/linefeed sequence -during ascii type file transfer. -When -.Ic \&cr -is on (the default), carriage returns are stripped from this -sequence to conform with the -.Ux -single linefeed record -delimiter. -Records on -.Pf non\- Ns Ux -remote systems may contain single linefeeds; -when an ascii type transfer is made, these linefeeds may be -distinguished from a record delimiter only when -.Ic \&cr -is off. -.It Ic delete Ar remote-file -Delete the file -.Ar remote-file -on the remote machine. -.It Ic debug Op Ar debug-value -Toggle debugging mode. -If an optional -.Ar debug-value -is specified it is used to set the debugging level. -When debugging is on, -.Nm ftp -prints each command sent to the remote machine, preceded -by the string -.Ql \-\-\*[Gt] -.It Xo -.Ic dir -.Op Ar remote-directory -.Op Ar local-file -.Xc -Print a listing of the directory contents in the -directory, -.Ar remote-directory , -and, optionally, placing the output in -.Ar local-file . -If interactive prompting is on, -.Nm ftp -will prompt the user to verify that the last argument is indeed the -target local file for receiving -.Ic dir -output. -If no directory is specified, the current working -directory on the remote machine is used. -If no local -file is specified, or -.Ar local-file -is -.Fl , -output comes to the terminal. -.It Ic disconnect -A synonym for -.Ar close . -.It Ic form Ar format -Set the file transfer -.Ic form -to -.Ar format . -The default format is \*(Lqfile\*(Rq. -.It Ic get Ar remote-file Op Ar local-file -Retrieve the -.Ar remote-file -and store it on the local machine. -If the local -file name is not specified, it is given the same -name it has on the remote machine, subject to -alteration by the current -.Ic case , -.Ic ntrans , -and -.Ic nmap -settings. -The current settings for -.Ic type , -.Ic form , -.Ic mode , -and -.Ic structure -are used while transferring the file. -.It Ic glob -Toggle filename expansion for -.Ic mdelete , -.Ic mget -and -.Ic mput . -If globbing is turned off with -.Ic glob , -the file name arguments -are taken literally and not expanded. -Globbing for -.Ic mput -is done as in -.Xr csh 1 . -For -.Ic mdelete -and -.Ic mget , -each remote file name is expanded -separately on the remote machine and the lists are not merged. -Expansion of a directory name is likely to be -different from expansion of the name of an ordinary file: -the exact result depends on the foreign operating system and ftp server, -and can be previewed by doing -.Ql mls remote-files \- . -As a security measure, remotely globbed files that starts with -.Sq / -or contains -.Sq ../ , -will not be automatically received. If you have interactive prompting -turned off, these filenames will be ignored. Note: -.Ic mget -and -.Ic mput -are not meant to transfer -entire directory subtrees of files. -That can be done by -transferring a -.Xr tar 1 -archive of the subtree (in binary mode). -.It Ic hash -Toggle hash-sign (``#'') printing for each data block -transferred. -The size of a data block is 1024 bytes. -.It Ic help Op Ar command -Print an informative message about the meaning of -.Ar command . -If no argument is given, -.Nm ftp -prints a list of the known commands. -.It Ic idle Op Ar seconds -Set the inactivity timer on the remote server to -.Ar seconds -seconds. -If -.Ar seconds -is omitted, the current inactivity timer is printed. -.It Ic lcd Op Ar directory -Change the working directory on the local machine. -If -no -.Ar directory -is specified, the user's home directory is used. -.It Xo -.Ic \&ls -.Op Ar remote-directory -.Op Ar local-file -.Xc -Print a listing of the contents of a -directory on the remote machine. -The listing includes any system-dependent information that the server -chooses to include; for example, most -.Ux -systems will produce -output from the command -.Ql ls \-l . -(See also -.Ic nlist . ) -If -.Ar remote-directory -is left unspecified, the current working directory is used. -If interactive prompting is on, -.Nm ftp -will prompt the user to verify that the last argument is indeed the -target local file for receiving -.Ic \&ls -output. -If no local file is specified, or if -.Ar local-file -is -.Sq Fl , -the output is sent to the terminal. -.It Ic macdef Ar macro-name -Define a macro. -Subsequent lines are stored as the macro -.Ar macro-name ; -a null line (consecutive newline characters -in a file or -carriage returns from the terminal) terminates macro input mode. -There is a limit of 16 macros and 4096 total characters in all -defined macros. -Macros remain defined until a -.Ic close -command is executed. -The macro processor interprets `$' and `\e' as special characters. -A `$' followed by a number (or numbers) is replaced by the -corresponding argument on the macro invocation command line. -A `$' followed by an `i' signals that macro processor that the -executing macro is to be looped. -On the first pass `$i' is -replaced by the first argument on the macro invocation command line, -on the second pass it is replaced by the second argument, and so on. -A `\e' followed by any character is replaced by that character. -Use the `\e' to prevent special treatment of the `$'. -.It Ic mdelete Op Ar remote-files -Delete the -.Ar remote-files -on the remote machine. -.It Ic mdir Ar remote-files local-file -Like -.Ic dir , -except multiple remote files may be specified. -If interactive prompting is on, -.Nm ftp -will prompt the user to verify that the last argument is indeed the -target local file for receiving -.Ic mdir -output. -.It Ic mget Ar remote-files -Expand the -.Ar remote-files -on the remote machine -and do a -.Ic get -for each file name thus produced. -See -.Ic glob -for details on the filename expansion. -Resulting file names will then be processed according to -.Ic case , -.Ic ntrans , -and -.Ic nmap -settings. -Files are transferred into the local working directory, -which can be changed with -.Ql lcd directory ; -new local directories can be created with -.Ql "\&! mkdir directory" . -.It Ic mkdir Ar directory-name -Make a directory on the remote machine. -.It Ic mls Ar remote-files local-file -Like -.Ic nlist , -except multiple remote files may be specified, -and the -.Ar local-file -must be specified. -If interactive prompting is on, -.Nm ftp -will prompt the user to verify that the last argument is indeed the -target local file for receiving -.Ic mls -output. -.It Ic mode Op Ar mode-name -Set the file transfer -.Ic mode -to -.Ar mode-name . -The default mode is \*(Lqstream\*(Rq mode. -.It Ic modtime Ar file-name -Show the last modification time of the file on the remote machine. -.It Ic mput Ar local-files -Expand wild cards in the list of local files given as arguments -and do a -.Ic put -for each file in the resulting list. -See -.Ic glob -for details of filename expansion. -Resulting file names will then be processed according to -.Ic ntrans -and -.Ic nmap -settings. -.It Ic newer Ar file-name -Get the file only if the modification time of the remote file is more -recent that the file on the current system. -If the file does not -exist on the current system, the remote file is considered -.Ic newer . -Otherwise, this command is identical to -.Ar get . -.It Xo -.Ic nlist -.Op Ar remote-directory -.Op Ar local-file -.Xc -Print a list of the files in a -directory on the remote machine. -If -.Ar remote-directory -is left unspecified, the current working directory is used. -If interactive prompting is on, -.Nm ftp -will prompt the user to verify that the last argument is indeed the -target local file for receiving -.Ic nlist -output. -If no local file is specified, or if -.Ar local-file -is -.Fl , -the output is sent to the terminal. -.It Ic nmap Op Ar inpattern outpattern -Set or unset the filename mapping mechanism. -If no arguments are specified, the filename mapping mechanism is unset. -If arguments are specified, remote filenames are mapped during -.Ic mput -commands and -.Ic put -commands issued without a specified remote target filename. -If arguments are specified, local filenames are mapped during -.Ic mget -commands and -.Ic get -commands issued without a specified local target filename. -This command is useful when connecting to a -.No non\- Ns Ux -remote computer -with different file naming conventions or practices. -The mapping follows the pattern set by -.Ar inpattern -and -.Ar outpattern . -.Op Ar Inpattern -is a template for incoming filenames (which may have already been -processed according to the -.Ic ntrans -and -.Ic case -settings). -Variable templating is accomplished by including the -sequences `$1', `$2', ..., `$9' in -.Ar inpattern . -Use `\\' to prevent this special treatment of the `$' character. -All other characters are treated literally, and are used to determine the -.Ic nmap -.Op Ar inpattern -variable values. -For example, given -.Ar inpattern -$1.$2 and the remote file name "mydata.data", $1 would have the value -"mydata", and $2 would have the value "data". -The -.Ar outpattern -determines the resulting mapped filename. -The sequences `$1', `$2', ...., `$9' are replaced by any value resulting -from the -.Ar inpattern -template. -The sequence `$0' is replace by the original filename. -Additionally, the sequence -.Ql Op Ar seq1 , Ar seq2 -is replaced by -.Op Ar seq1 -if -.Ar seq1 -is not a null string; otherwise it is replaced by -.Ar seq2 . -For example, the command -.Pp -.Bd -literal -offset indent -compact -nmap $1.$2.$3 [$1,$2].[$2,file] -.Ed -.Pp -would yield -the output filename "myfile.data" for input filenames "myfile.data" and -"myfile.data.old", "myfile.file" for the input filename "myfile", and -"myfile.myfile" for the input filename ".myfile". -Spaces may be included in -.Ar outpattern , -as in the example: `nmap $1 sed "s/ *$//" \*[Gt] $1' . -Use the `\e' character to prevent special treatment -of the `$','[','[', and `,' characters. -.It Ic ntrans Op Ar inchars Op Ar outchars -Set or unset the filename character translation mechanism. -If no arguments are specified, the filename character -translation mechanism is unset. -If arguments are specified, characters in -remote filenames are translated during -.Ic mput -commands and -.Ic put -commands issued without a specified remote target filename. -If arguments are specified, characters in -local filenames are translated during -.Ic mget -commands and -.Ic get -commands issued without a specified local target filename. -This command is useful when connecting to a -.No non\- Ns Ux -remote computer -with different file naming conventions or practices. -Characters in a filename matching a character in -.Ar inchars -are replaced with the corresponding character in -.Ar outchars . -If the character's position in -.Ar inchars -is longer than the length of -.Ar outchars , -the character is deleted from the file name. -.It Ic open Ar host Op Ar port -Establish a connection to the specified -.Ar host -.Tn FTP -server. -An optional port number may be supplied, -in which case, -.Nm ftp -will attempt to contact an -.Tn FTP -server at that port. -If the -.Ic auto-login -option is on (default), -.Nm ftp -will also attempt to automatically log the user in to -the -.Tn FTP -server (see below). -.It Ic passive -Toggle passive mode. If passive mode is turned on -(default is off), the ftp client will -send a -.Dv PASV -command for all data connections instead of the usual -.Dv PORT -command. The -.Dv PASV -command requests that the remote server open a port for the data connection -and return the address of that port. The remote server listens on that -port and the client connects to it. When using the more traditional -.Dv PORT -command, the client listens on a port and sends that address to the remote -server, who connects back to it. Passive mode is useful when using -.Nm ftp -through a gateway router or host that controls the directionality of -traffic. -(Note that though ftp servers are required to support the -.Dv PASV -command by RFC 1123, some do not.) -.It Ic prompt -Toggle interactive prompting. -Interactive prompting -occurs during multiple file transfers to allow the -user to selectively retrieve or store files. -If prompting is turned off (default is on), any -.Ic mget -or -.Ic mput -will transfer all files, and any -.Ic mdelete -will delete all files. -.It Ic proxy Ar ftp-command -Execute an ftp command on a secondary control connection. -This command allows simultaneous connection to two remote ftp -servers for transferring files between the two servers. -The first -.Ic proxy -command should be an -.Ic open , -to establish the secondary control connection. -Enter the command "proxy ?" to see other ftp commands executable on the -secondary connection. -The following commands behave differently when prefaced by -.Ic proxy : -.Ic open -will not define new macros during the auto-login process, -.Ic close -will not erase existing macro definitions, -.Ic get -and -.Ic mget -transfer files from the host on the primary control connection -to the host on the secondary control connection, and -.Ic put , -.Ic mput , -and -.Ic append -transfer files from the host on the secondary control connection -to the host on the primary control connection. -Third party file transfers depend upon support of the ftp protocol -.Dv PASV -command by the server on the secondary control connection. -.It Ic put Ar local-file Op Ar remote-file -Store a local file on the remote machine. -If -.Ar remote-file -is left unspecified, the local file name is used -after processing according to any -.Ic ntrans -or -.Ic nmap -settings -in naming the remote file. -File transfer uses the -current settings for -.Ic type , -.Ic format , -.Ic mode , -and -.Ic structure . -.It Ic pwd -Print the name of the current working directory on the remote -machine. -.It Ic quit -A synonym for -.Ic bye . -.It Ic quote Ar arg1 arg2 ... -The arguments specified are sent, verbatim, to the remote -.Tn FTP -server. -.It Ic recv Ar remote-file Op Ar local-file -A synonym for get. -.It Ic reget Ar remote-file Op Ar local-file -Reget acts like get, except that if -.Ar local-file -exists and is -smaller than -.Ar remote-file , -.Ar local-file -is presumed to be -a partially transferred copy of -.Ar remote-file -and the transfer -is continued from the apparent point of failure. -This command -is useful when transferring very large files over networks that -are prone to dropping connections. -.It Ic remotehelp Op Ar command-name -Request help from the remote -.Tn FTP -server. -If a -.Ar command-name -is specified it is supplied to the server as well. -.It Ic remotestatus Op Ar file-name -With no arguments, show status of remote machine. -If -.Ar file-name -is specified, show status of -.Ar file-name -on remote machine. -.It Xo -.Ic rename -.Op Ar from -.Op Ar to -.Xc -Rename the file -.Ar from -on the remote machine, to the file -.Ar to . -.It Ic reset -Clear reply queue. -This command re-synchronizes command/reply sequencing with the remote -ftp server. -Resynchronization may be necessary following a violation of the ftp protocol -by the remote server. -.It Ic restart Ar marker -Restart the immediately following -.Ic get -or -.Ic put -at the -indicated -.Ar marker . -On -.Ux -systems, marker is usually a byte -offset into the file. -.It Ic rmdir Ar directory-name -Delete a directory on the remote machine. -.It Ic runique -Toggle storing of files on the local system with unique filenames. -If a file already exists with a name equal to the target -local filename for a -.Ic get -or -.Ic mget -command, a ".1" is appended to the name. -If the resulting name matches another existing file, -a ".2" is appended to the original name. -If this process continues up to ".99", an error -message is printed, and the transfer does not take place. -The generated unique filename will be reported. -Note that -.Ic runique -will not affect local files generated from a shell command -(see below). -The default value is off. -.It Ic send Ar local-file Op Ar remote-file -A synonym for put. -.It Ic sendport -Toggle the use of -.Dv PORT -commands. -By default, -.Nm ftp -will attempt to use a -.Dv PORT -command when establishing -a connection for each data transfer. -The use of -.Dv PORT -commands can prevent delays -when performing multiple file transfers. -If the -.Dv PORT -command fails, -.Nm ftp -will use the default data port. -When the use of -.Dv PORT -commands is disabled, no attempt will be made to use -.Dv PORT -commands for each data transfer. -This is useful -for certain -.Tn FTP -implementations which do ignore -.Dv PORT -commands but, incorrectly, indicate they've been accepted. -.It Ic site Ar arg1 arg2 ... -The arguments specified are sent, verbatim, to the remote -.Tn FTP -server as a -.Dv SITE -command. -.It Ic size Ar file-name -Return size of -.Ar file-name -on remote machine. -.It Ic status -Show the current status of -.Nm ftp . -.It Ic struct Op Ar struct-name -Set the file transfer -.Ar structure -to -.Ar struct-name . -By default \*(Lqstream\*(Rq structure is used. -.It Ic sunique -Toggle storing of files on remote machine under unique file names. -Remote ftp server must support ftp protocol -.Dv STOU -command for -successful completion. -The remote server will report unique name. -Default value is off. -.It Ic system -Show the type of operating system running on the remote machine. -.It Ic tenex -Set the file transfer type to that needed to -talk to -.Tn TENEX -machines. -.It Ic trace -Toggle packet tracing. -.It Ic type Op Ar type-name -Set the file transfer -.Ic type -to -.Ar type-name . -If no type is specified, the current type -is printed. -The default type is network -.Tn ASCII . -.It Ic umask Op Ar newmask -Set the default umask on the remote server to -.Ar newmask . -If -.Ar newmask -is omitted, the current umask is printed. -.It Xo -.Ic user Ar user-name -.Op Ar password -.Op Ar account -.Xc -Identify yourself to the remote -.Tn FTP -server. -If the -.Ar password -is not specified and the server requires it, -.Nm ftp -will prompt the user for it (after disabling local echo). -If an -.Ar account -field is not specified, and the -.Tn FTP -server -requires it, the user will be prompted for it. -If an -.Ar account -field is specified, an account command will -be relayed to the remote server after the login sequence -is completed if the remote server did not require it -for logging in. -Unless -.Nm ftp -is invoked with \*(Lqauto-login\*(Rq disabled, this -process is done automatically on initial connection to -the -.Tn FTP -server. -.It Ic verbose -Toggle verbose mode. -In verbose mode, all responses from -the -.Tn FTP -server are displayed to the user. -In addition, -if verbose is on, when a file transfer completes, statistics -regarding the efficiency of the transfer are reported. -By default, -verbose is on. -.It Ic \&? Op Ar command -A synonym for help. -.El -.Pp -The following command can be used with ftpsec-aware servers. -.Bl -tag -width Fl -.It Xo -.Ic prot -.Ar clear | -.Ar safe | -.Ar confidential | -.Ar private -.Xc -Set the data protection level to the requested level. -.El -.Pp -The following command can be used with ftp servers that has -implemented the KAUTH site command. -.Bl -tag -width Fl -.It Ic kauth Op Ar principal -Obtain remote tickets. -.El -.Pp -Command arguments which have embedded spaces may be quoted with -quote `"' marks. -.Sh ABORTING A FILE TRANSFER -To abort a file transfer, use the terminal interrupt key -(usually Ctrl-C). -Sending transfers will be immediately halted. -Receiving transfers will be halted by sending a ftp protocol -.Dv ABOR -command to the remote server, and discarding any further data received. -The speed at which this is accomplished depends upon the remote -server's support for -.Dv ABOR -processing. -If the remote server does not support the -.Dv ABOR -command, an -.Ql ftp\*[Gt] -prompt will not appear until the remote server has completed -sending the requested file. -.Pp -The terminal interrupt key sequence will be ignored when -.Nm ftp -has completed any local processing and is awaiting a reply -from the remote server. -A long delay in this mode may result from the ABOR processing described -above, or from unexpected behavior by the remote server, including -violations of the ftp protocol. -If the delay results from unexpected remote server behavior, the local -.Nm ftp -program must be killed by hand. -.Sh FILE NAMING CONVENTIONS -Files specified as arguments to -.Nm ftp -commands are processed according to the following rules. -.Bl -enum -.It -If the file name -.Sq Fl -is specified, the -.Ar stdin -(for reading) or -.Ar stdout -(for writing) is used. -.It -If the first character of the file name is -.Sq \&| , -the -remainder of the argument is interpreted as a shell command. -.Nm Ftp -then forks a shell, using -.Xr popen 3 -with the argument supplied, and reads (writes) from the stdout -(stdin). -If the shell command includes spaces, the argument -must be quoted; e.g. -\*(Lq" ls -lt"\*(Rq. -A particularly -useful example of this mechanism is: \*(Lqdir more\*(Rq. -.It -Failing the above checks, if ``globbing'' is enabled, -local file names are expanded -according to the rules used in the -.Xr csh 1 ; -c.f. the -.Ic glob -command. -If the -.Nm ftp -command expects a single local file (.e.g. -.Ic put ) , -only the first filename generated by the "globbing" operation is used. -.It -For -.Ic mget -commands and -.Ic get -commands with unspecified local file names, the local filename is -the remote filename, which may be altered by a -.Ic case , -.Ic ntrans , -or -.Ic nmap -setting. -The resulting filename may then be altered if -.Ic runique -is on. -.It -For -.Ic mput -commands and -.Ic put -commands with unspecified remote file names, the remote filename is -the local filename, which may be altered by a -.Ic ntrans -or -.Ic nmap -setting. -The resulting filename may then be altered by the remote server if -.Ic sunique -is on. -.El -.Sh FILE TRANSFER PARAMETERS -The FTP specification specifies many parameters which may -affect a file transfer. -The -.Ic type -may be one of \*(Lqascii\*(Rq, \*(Lqimage\*(Rq (binary), -\*(Lqebcdic\*(Rq, and \*(Lqlocal byte size\*(Rq (for -.Tn PDP Ns -10's -and -.Tn PDP Ns -20's -mostly). -.Nm Ftp -supports the ascii and image types of file transfer, -plus local byte size 8 for -.Ic tenex -mode transfers. -.Pp -.Nm Ftp -supports only the default values for the remaining -file transfer parameters: -.Ic mode , -.Ic form , -and -.Ic struct . -.Sh THE .netrc FILE -The -.Pa .netrc -file contains login and initialization information -used by the auto-login process. -It resides in the user's home directory. -The following tokens are recognized; they may be separated by spaces, -tabs, or new-lines: -.Bl -tag -width password -.It Ic machine Ar name -Identify a remote machine -.Ar name . -The auto-login process searches the -.Pa .netrc -file for a -.Ic machine -token that matches the remote machine specified on the -.Nm ftp -command line or as an -.Ic open -command argument. -Once a match is made, the subsequent -.Pa .netrc -tokens are processed, -stopping when the end of file is reached or another -.Ic machine -or a -.Ic default -token is encountered. -.It Ic default -This is the same as -.Ic machine -.Ar name -except that -.Ic default -matches any name. -There can be only one -.Ic default -token, and it must be after all -.Ic machine -tokens. -This is normally used as: -.Pp -.Dl default login anonymous password user@site -.Pp -thereby giving the user -.Ar automatic -anonymous ftp login to -machines not specified in -.Pa .netrc . -This can be overridden -by using the -.Fl n -flag to disable auto-login. -.It Ic login Ar name -Identify a user on the remote machine. -If this token is present, the auto-login process will initiate -a login using the specified -.Ar name . -.It Ic password Ar string -Supply a password. -If this token is present, the auto-login process will supply the -specified string if the remote server requires a password as part -of the login process. -Note that if this token is present in the -.Pa .netrc -file for any user other -than -.Ar anonymous , -.Nm ftp -will abort the auto-login process if the -.Pa .netrc -is readable by -anyone besides the user. -.It Ic account Ar string -Supply an additional account password. -If this token is present, the auto-login process will supply the -specified string if the remote server requires an additional -account password, or the auto-login process will initiate an -.Dv ACCT -command if it does not. -.It Ic macdef Ar name -Define a macro. -This token functions like the -.Nm ftp -.Ic macdef -command functions. -A macro is defined with the specified name; its contents begin with the -next -.Pa .netrc -line and continue until a null line (consecutive new-line -characters) is encountered. -If a macro named -.Ic init -is defined, it is automatically executed as the last step in the -auto-login process. -.El -.Sh ENVIRONMENT -.Nm Ftp -uses the following environment variables. -.Bl -tag -width Fl -.It Ev HOME -For default location of a -.Pa .netrc -file, if one exists. -.It Ev SHELL -For default shell. -.El -.Sh SEE ALSO -.Xr ftpd 8 -.Rs -.%T RFC2228 -.Re -.Sh HISTORY -The -.Nm ftp -command appeared in -.Bx 4.2 . -.Sh BUGS -Correct execution of many commands depends upon proper behavior -by the remote server. -.Pp -An error in the treatment of carriage returns -in the -.Bx 4.2 -ascii-mode transfer code -has been corrected. -This correction may result in incorrect transfers of binary files -to and from -.Bx 4.2 -servers using the ascii type. -Avoid this problem by using the binary image type. diff --git a/crypto/heimdal/appl/ftp/ftp/ftp.c b/crypto/heimdal/appl/ftp/ftp/ftp.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/ftp.c +++ /dev/null @@ -1,1814 +0,0 @@ -/* - * Copyright (c) 1985, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftp_locl.h" -RCSID ("$Id$"); - -struct sockaddr_storage hisctladdr_ss; -struct sockaddr *hisctladdr = (struct sockaddr *)&hisctladdr_ss; -struct sockaddr_storage data_addr_ss; -struct sockaddr *data_addr = (struct sockaddr *)&data_addr_ss; -struct sockaddr_storage myctladdr_ss; -struct sockaddr *myctladdr = (struct sockaddr *)&myctladdr_ss; -int data = -1; -int abrtflag = 0; -jmp_buf ptabort; -int ptabflg; -int ptflag = 0; -off_t restart_point = 0; - - -FILE *cin, *cout; - -typedef void (*sighand) (int); - -char * -hookup (const char *host, int port) -{ - static char hostnamebuf[MaxHostNameLen]; - struct addrinfo *ai, *a; - struct addrinfo hints; - int error; - char portstr[NI_MAXSERV]; - socklen_t len; - int s; - - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - hints.ai_flags = AI_CANONNAME; - - snprintf (portstr, sizeof(portstr), "%u", ntohs(port)); - - error = getaddrinfo (host, portstr, &hints, &ai); - if (error) { - warnx ("%s: %s", host, gai_strerror(error)); - code = -1; - return NULL; - } - strlcpy (hostnamebuf, host, sizeof(hostnamebuf)); - hostname = hostnamebuf; - - s = -1; - for (a = ai; a != NULL; a = a->ai_next) { - s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); - if (s < 0) - continue; - - if (a->ai_canonname != NULL) - strlcpy (hostnamebuf, a->ai_canonname, sizeof(hostnamebuf)); - - memcpy (hisctladdr, a->ai_addr, a->ai_addrlen); - - error = connect (s, a->ai_addr, a->ai_addrlen); - if (error < 0) { - char addrstr[256]; - - if (getnameinfo (a->ai_addr, a->ai_addrlen, - addrstr, sizeof(addrstr), - NULL, 0, NI_NUMERICHOST) != 0) - strlcpy (addrstr, "unknown address", sizeof(addrstr)); - - warn ("connect %s", addrstr); - close (s); - s = -1; - continue; - } - break; - } - freeaddrinfo (ai); - if (s < 0) { - warnx ("failed to contact %s", host); - code = -1; - return NULL; - } - - len = sizeof(myctladdr_ss); - if (getsockname (s, myctladdr, &len) < 0) { - warn ("getsockname"); - code = -1; - close (s); - return NULL; - } -#ifdef IPTOS_LOWDELAY - socket_set_tos (s, IPTOS_LOWDELAY); -#endif - cin = fdopen (s, "r"); - cout = fdopen (s, "w"); - if (cin == NULL || cout == NULL) { - warnx ("fdopen failed."); - if (cin) - fclose (cin); - if (cout) - fclose (cout); - code = -1; - goto bad; - } - if (verbose) - printf ("Connected to %s.\n", hostname); - if (getreply (0) > 2) { /* read startup message from server */ - if (cin) - fclose (cin); - if (cout) - fclose (cout); - code = -1; - goto bad; - } -#if defined(SO_OOBINLINE) && defined(HAVE_SETSOCKOPT) - { - int on = 1; - - if (setsockopt (s, SOL_SOCKET, SO_OOBINLINE, (char *) &on, sizeof (on)) - < 0 && debug) { - warn ("setsockopt"); - } - } -#endif /* SO_OOBINLINE */ - - return (hostname); -bad: - close (s); - return NULL; -} - -int -login (char *host) -{ - char tmp[80]; - char defaultpass[128]; - char *userstr, *pass, *acctstr; - char *ruserstr, *rpass, *racctstr; - int n, aflag = 0; - - char *myname = NULL; - struct passwd *pw = k_getpwuid(getuid()); - - if (pw != NULL) - myname = pw->pw_name; - - ruserstr = rpass = racctstr = NULL; - - if(sec_login(host)) - printf("\n*** Using plaintext user and password ***\n\n"); - else{ - printf("Authentication successful.\n\n"); - } - - if (ruserpassword (host, &ruserstr, &rpass, &racctstr) < 0) { - code = -1; - return (0); - } - userstr = ruserstr; - pass = rpass; - acctstr = racctstr; - - while (userstr == NULL) { - if (myname) - printf ("Name (%s:%s): ", host, myname); - else - printf ("Name (%s): ", host); - *tmp = '\0'; - if (fgets (tmp, sizeof (tmp) - 1, stdin) != NULL) - tmp[strlen (tmp) - 1] = '\0'; - if (*tmp == '\0') - userstr = myname; - else - userstr = tmp; - } - strlcpy(username, userstr, sizeof(username)); - if (ruserstr) - free(ruserstr); - - n = command("USER %s", userstr); - if (n == COMPLETE) - n = command("PASS dummy"); /* DK: Compatibility with gssftp daemon */ - else if(n == CONTINUE) { - if (pass == NULL) { - char prompt[128]; - if(myname && - (!strcmp(userstr, "ftp") || !strcmp(userstr, "anonymous"))) { - snprintf(defaultpass, sizeof(defaultpass), - "%s@%s", myname, mydomain); - snprintf(prompt, sizeof(prompt), - "Password (%s): ", defaultpass); - } else if (sec_complete) { - pass = myname; - } else { - *defaultpass = '\0'; - snprintf(prompt, sizeof(prompt), "Password: "); - } - if (pass == NULL) { - pass = defaultpass; - UI_UTIL_read_pw_string (tmp, sizeof (tmp), prompt, 0); - if (tmp[0]) - pass = tmp; - } - } - n = command ("PASS %s", pass); - if (rpass) - free(rpass); - } - if (n == CONTINUE) { - aflag++; - UI_UTIL_read_pw_string (tmp, sizeof(tmp), "Account:", 0); - acctstr = tmp; - n = command ("ACCT %s", acctstr); - } - if (n != COMPLETE) { - if (racctstr) - free(racctstr); - warnx ("Login failed."); - return (0); - } - if (!aflag && acctstr != NULL) - command ("ACCT %s", acctstr); - if (racctstr) - free(racctstr); - if (proxy) - return (1); - for (n = 0; n < macnum; ++n) { - if (!strcmp("init", macros[n].mac_name)) { - strlcpy (line, "$init", sizeof (line)); - makeargv(); - domacro(margc, margv); - break; - } - } - sec_set_protection_level (); - return (1); -} - -void -cmdabort (int sig) -{ - - printf ("\n"); - fflush (stdout); - abrtflag++; - if (ptflag) - longjmp (ptabort, 1); -} - -int -command (char *fmt,...) -{ - va_list ap; - int r; - sighand oldintr; - - abrtflag = 0; - if (cout == NULL) { - warn ("No control connection for command"); - code = -1; - return (0); - } - oldintr = signal(SIGINT, cmdabort); - if(debug){ - printf("---> "); - if (strncmp("PASS ", fmt, 5) == 0) - printf("PASS XXXX"); - else { - va_start(ap, fmt); - vfprintf(stdout, fmt, ap); - va_end(ap); - } - } - va_start(ap, fmt); - sec_vfprintf(cout, fmt, ap); - va_end(ap); - if(debug){ - printf("\n"); - fflush(stdout); - } - fprintf (cout, "\r\n"); - fflush (cout); - cpend = 1; - r = getreply (!strcmp (fmt, "QUIT")); - if (abrtflag && oldintr != SIG_IGN) - (*oldintr) (SIGINT); - signal (SIGINT, oldintr); - return (r); -} - -char reply_string[BUFSIZ]; /* last line of previous reply */ - -int -getreply (int expecteof) -{ - char *p; - char *lead_string; - int c; - struct sigaction sa, osa; - char buf[8192]; - int reply_code; - int long_warn = 0; - - sigemptyset (&sa.sa_mask); - sa.sa_flags = 0; - sa.sa_handler = cmdabort; - sigaction (SIGINT, &sa, &osa); - - p = buf; - - reply_code = 0; - while (1) { - c = getc (cin); - switch (c) { - case EOF: - if (expecteof) { - sigaction (SIGINT, &osa, NULL); - code = 221; - return 0; - } - lostpeer (0); - if (verbose) { - printf ("421 Service not available, " - "remote server has closed connection\n"); - fflush (stdout); - } - code = 421; - return (4); - case IAC: - c = getc (cin); - if (c == WILL || c == WONT) - fprintf (cout, "%c%c%c", IAC, DONT, getc (cin)); - if (c == DO || c == DONT) - fprintf (cout, "%c%c%c", IAC, WONT, getc (cin)); - continue; - case '\n': - *p++ = '\0'; - if(isdigit((unsigned char)buf[0])){ - sscanf(buf, "%d", &code); - if(code == 631){ - code = 0; - sec_read_msg(buf, prot_safe); - sscanf(buf, "%d", &code); - lead_string = "S:"; - } else if(code == 632){ - code = 0; - sec_read_msg(buf, prot_private); - sscanf(buf, "%d", &code); - lead_string = "P:"; - }else if(code == 633){ - code = 0; - sec_read_msg(buf, prot_confidential); - sscanf(buf, "%d", &code); - lead_string = "C:"; - }else if(sec_complete) - lead_string = "!!"; - else - lead_string = ""; - if(code != 0 && reply_code == 0) - reply_code = code; - if (verbose > 0 || (verbose > -1 && code > 499)) - fprintf (stdout, "%s%s\n", lead_string, buf); - if (code == reply_code && buf[3] == ' ') { - strlcpy (reply_string, buf, sizeof(reply_string)); - if (code >= 200) - cpend = 0; - sigaction (SIGINT, &osa, NULL); - if (code == 421) - lostpeer (0); -#if 1 - if (abrtflag && - osa.sa_handler != cmdabort && - osa.sa_handler != SIG_IGN) - osa.sa_handler (SIGINT); -#endif - if (code == 227 || code == 229) { - char *q; - - q = strchr (reply_string, '('); - if (q) { - q++; - strlcpy(pasv, q, sizeof(pasv)); - q = strrchr(pasv, ')'); - if (q) - *q = '\0'; - } - } - return code / 100; - } - }else{ - if(verbose > 0 || (verbose > -1 && code > 499)){ - if(sec_complete) - fprintf(stdout, "!!"); - fprintf(stdout, "%s\n", buf); - } - } - p = buf; - long_warn = 0; - continue; - default: - if(p < buf + sizeof(buf) - 1) - *p++ = c; - else if(long_warn == 0) { - fprintf(stderr, "WARNING: incredibly long line received\n"); - long_warn = 1; - } - } - } - -} - - -#if 0 -int -getreply (int expecteof) -{ - int c, n; - int dig; - int originalcode = 0, continuation = 0; - sighand oldintr; - int pflag = 0; - char *cp, *pt = pasv; - - oldintr = signal (SIGINT, cmdabort); - for (;;) { - dig = n = code = 0; - cp = reply_string; - while ((c = getc (cin)) != '\n') { - if (c == IAC) { /* handle telnet commands */ - switch (c = getc (cin)) { - case WILL: - case WONT: - c = getc (cin); - fprintf (cout, "%c%c%c", IAC, DONT, c); - fflush (cout); - break; - case DO: - case DONT: - c = getc (cin); - fprintf (cout, "%c%c%c", IAC, WONT, c); - fflush (cout); - break; - default: - break; - } - continue; - } - dig++; - if (c == EOF) { - if (expecteof) { - signal (SIGINT, oldintr); - code = 221; - return (0); - } - lostpeer (0); - if (verbose) { - printf ("421 Service not available, remote server has closed connection\n"); - fflush (stdout); - } - code = 421; - return (4); - } - if (c != '\r' && (verbose > 0 || - (verbose > -1 && n == '5' && dig > 4))) { - if (proxflag && - (dig == 1 || dig == 5 && verbose == 0)) - printf ("%s:", hostname); - putchar (c); - } - if (dig < 4 && isdigit (c)) - code = code * 10 + (c - '0'); - if (!pflag && code == 227) - pflag = 1; - if (dig > 4 && pflag == 1 && isdigit (c)) - pflag = 2; - if (pflag == 2) { - if (c != '\r' && c != ')') - *pt++ = c; - else { - *pt = '\0'; - pflag = 3; - } - } - if (dig == 4 && c == '-') { - if (continuation) - code = 0; - continuation++; - } - if (n == 0) - n = c; - if (cp < &reply_string[sizeof (reply_string) - 1]) - *cp++ = c; - } - if (verbose > 0 || verbose > -1 && n == '5') { - putchar (c); - fflush (stdout); - } - if (continuation && code != originalcode) { - if (originalcode == 0) - originalcode = code; - continue; - } - *cp = '\0'; - if(sec_complete){ - if(code == 631) - sec_read_msg(reply_string, prot_safe); - else if(code == 632) - sec_read_msg(reply_string, prot_private); - else if(code == 633) - sec_read_msg(reply_string, prot_confidential); - n = code / 100 + '0'; - } - if (n != '1') - cpend = 0; - signal (SIGINT, oldintr); - if (code == 421 || originalcode == 421) - lostpeer (0); - if (abrtflag && oldintr != cmdabort && oldintr != SIG_IGN) - (*oldintr) (SIGINT); - return (n - '0'); - } -} - -#endif - -int -empty (fd_set * mask, int sec) -{ - struct timeval t; - - t.tv_sec = sec; - t.tv_usec = 0; - return (select (FD_SETSIZE, mask, NULL, NULL, &t)); -} - -jmp_buf sendabort; - -static RETSIGTYPE -abortsend (int sig) -{ - - mflag = 0; - abrtflag = 0; - printf ("\nsend aborted\nwaiting for remote to finish abort\n"); - fflush (stdout); - longjmp (sendabort, 1); -} - -#define HASHBYTES 1024 - -static int -copy_stream (FILE * from, FILE * to) -{ - static size_t bufsize; - static char *buf; - int n; - int bytes = 0; - int werr = 0; - int hashbytes = HASHBYTES; - struct stat st; - -#if defined(HAVE_MMAP) && !defined(NO_MMAP) - void *chunk; - size_t off; - -#define BLOCKSIZE (1024 * 1024 * 10) - -#ifndef MAP_FAILED -#define MAP_FAILED (-1) -#endif - - if (fstat (fileno (from), &st) == 0 && S_ISREG (st.st_mode)) { - /* - * mmap zero bytes has potential of loosing, don't do it. - */ - if (st.st_size == 0) - return 0; - off = 0; - while (off != st.st_size) { - size_t len; - ssize_t res; - - len = st.st_size - off; - if (len > BLOCKSIZE) - len = BLOCKSIZE; - - chunk = mmap (0, len, PROT_READ, MAP_SHARED, fileno (from), off); - if (chunk == (void *) MAP_FAILED) { - if (off == 0) /* try read if mmap doesn't work */ - goto try_read; - break; - } - - res = sec_write (fileno (to), chunk, len); - if (msync (chunk, len, MS_ASYNC)) - warn ("msync"); - if (munmap (chunk, len) < 0) - warn ("munmap"); - sec_fflush (to); - if (res != len) - return off; - off += len; - } - return off; - } -try_read: -#endif - - buf = alloc_buffer (buf, &bufsize, - fstat (fileno (from), &st) >= 0 ? &st : NULL); - if (buf == NULL) - return -1; - - while ((n = read (fileno (from), buf, bufsize)) > 0) { - werr = sec_write (fileno (to), buf, n); - if (werr < 0) - break; - bytes += werr; - while (hash && bytes > hashbytes) { - putchar ('#'); - hashbytes += HASHBYTES; - } - } - sec_fflush (to); - if (n < 0) - warn ("local"); - - if (werr < 0) { - if (errno != EPIPE) - warn ("netout"); - bytes = -1; - } - return bytes; -} - -void -sendrequest (char *cmd, char *local, char *remote, char *lmode, int printnames) -{ - struct stat st; - struct timeval start, stop; - int c, d; - FILE *fin, *dout = 0; - int (*closefunc) (FILE *); - RETSIGTYPE (*oldintr)(int), (*oldintp)(int); - long bytes = 0, hashbytes = HASHBYTES; - char *rmode = "w"; - - if (verbose && printnames) { - if (strcmp (local, "-") != 0) - printf ("local: %s ", local); - if (remote) - printf ("remote: %s\n", remote); - } - if (proxy) { - proxtrans (cmd, local, remote); - return; - } - if (curtype != type) - changetype (type, 0); - closefunc = NULL; - oldintr = NULL; - oldintp = NULL; - - if (setjmp (sendabort)) { - while (cpend) { - getreply (0); - } - if (data >= 0) { - close (data); - data = -1; - } - if (oldintr) - signal (SIGINT, oldintr); - if (oldintp) - signal (SIGPIPE, oldintp); - code = -1; - return; - } - oldintr = signal (SIGINT, abortsend); - if (strcmp (local, "-") == 0) - fin = stdin; - else if (*local == '|') { - oldintp = signal (SIGPIPE, SIG_IGN); - fin = popen (local + 1, lmode); - if (fin == NULL) { - warn ("%s", local + 1); - signal (SIGINT, oldintr); - signal (SIGPIPE, oldintp); - code = -1; - return; - } - closefunc = pclose; - } else { - fin = fopen (local, lmode); - if (fin == NULL) { - warn ("local: %s", local); - signal (SIGINT, oldintr); - code = -1; - return; - } - closefunc = fclose; - if (fstat (fileno (fin), &st) < 0 || !S_ISREG(st.st_mode)) { - fprintf (stdout, "%s: not a plain file.\n", local); - signal (SIGINT, oldintr); - fclose (fin); - code = -1; - return; - } - } - if (initconn ()) { - signal (SIGINT, oldintr); - if (oldintp) - signal (SIGPIPE, oldintp); - code = -1; - if (closefunc != NULL) - (*closefunc) (fin); - return; - } - if (setjmp (sendabort)) - goto abort; - - if (restart_point && - (strcmp (cmd, "STOR") == 0 || strcmp (cmd, "APPE") == 0)) { - int rc; - - switch (curtype) { - case TYPE_A: - rc = fseek (fin, (long) restart_point, SEEK_SET); - break; - case TYPE_I: - case TYPE_L: - rc = lseek (fileno (fin), restart_point, SEEK_SET); - break; - default: - abort(); - } - if (rc < 0) { - warn ("local: %s", local); - restart_point = 0; - if (closefunc != NULL) - (*closefunc) (fin); - return; - } - if (command ("REST %ld", (long) restart_point) - != CONTINUE) { - restart_point = 0; - if (closefunc != NULL) - (*closefunc) (fin); - return; - } - restart_point = 0; - rmode = "r+w"; - } - if (remote) { - if (command ("%s %s", cmd, remote) != PRELIM) { - signal (SIGINT, oldintr); - if (oldintp) - signal (SIGPIPE, oldintp); - if (closefunc != NULL) - (*closefunc) (fin); - return; - } - } else if (command ("%s", cmd) != PRELIM) { - signal(SIGINT, oldintr); - if (oldintp) - signal(SIGPIPE, oldintp); - if (closefunc != NULL) - (*closefunc)(fin); - return; - } - dout = dataconn(rmode); - if (dout == NULL) - goto abort; - set_buffer_size (fileno (dout), 0); - gettimeofday (&start, (struct timezone *) 0); - oldintp = signal (SIGPIPE, SIG_IGN); - switch (curtype) { - - case TYPE_I: - case TYPE_L: - errno = d = c = 0; - bytes = copy_stream (fin, dout); - break; - - case TYPE_A: - while ((c = getc (fin)) != EOF) { - if (c == '\n') { - while (hash && (bytes >= hashbytes)) { - putchar ('#'); - fflush (stdout); - hashbytes += HASHBYTES; - } - if (ferror (dout)) - break; - sec_putc ('\r', dout); - bytes++; - } - sec_putc (c, dout); - bytes++; - } - sec_fflush (dout); - if (hash) { - if (bytes < hashbytes) - putchar ('#'); - putchar ('\n'); - fflush (stdout); - } - if (ferror (fin)) - warn ("local: %s", local); - if (ferror (dout)) { - if (errno != EPIPE) - warn ("netout"); - bytes = -1; - } - break; - } - if (closefunc != NULL) - (*closefunc) (fin); - fclose (dout); - gettimeofday (&stop, (struct timezone *) 0); - getreply (0); - signal (SIGINT, oldintr); - if (oldintp) - signal (SIGPIPE, oldintp); - if (bytes > 0) - ptransfer ("sent", bytes, &start, &stop); - return; -abort: - signal (SIGINT, oldintr); - if (oldintp) - signal (SIGPIPE, oldintp); - if (!cpend) { - code = -1; - return; - } - if (data >= 0) { - close (data); - data = -1; - } - if (dout) - fclose (dout); - getreply (0); - code = -1; - if (closefunc != NULL && fin != NULL) - (*closefunc) (fin); - gettimeofday (&stop, (struct timezone *) 0); - if (bytes > 0) - ptransfer ("sent", bytes, &start, &stop); -} - -jmp_buf recvabort; - -void -abortrecv (int sig) -{ - - mflag = 0; - abrtflag = 0; - printf ("\nreceive aborted\nwaiting for remote to finish abort\n"); - fflush (stdout); - longjmp (recvabort, 1); -} - -void -recvrequest (char *cmd, char *local, char *remote, - char *lmode, int printnames, int local_given) -{ - FILE *fout = NULL, *din = NULL; - int (*closefunc) (FILE *); - sighand oldintr, oldintp; - int c, d, is_retr, tcrflag, bare_lfs = 0; - static size_t bufsize; - static char *buf; - long bytes = 0, hashbytes = HASHBYTES; - struct timeval start, stop; - struct stat st; - - is_retr = strcmp (cmd, "RETR") == 0; - if (is_retr && verbose && printnames) { - if (strcmp (local, "-") != 0) - printf ("local: %s ", local); - if (remote) - printf ("remote: %s\n", remote); - } - if (proxy && is_retr) { - proxtrans (cmd, local, remote); - return; - } - closefunc = NULL; - oldintr = NULL; - oldintp = NULL; - tcrflag = !crflag && is_retr; - if (setjmp (recvabort)) { - while (cpend) { - getreply (0); - } - if (data >= 0) { - close (data); - data = -1; - } - if (oldintr) - signal (SIGINT, oldintr); - code = -1; - return; - } - oldintr = signal (SIGINT, abortrecv); - if (!local_given || (strcmp(local, "-") && *local != '|')) { - if (access (local, 2) < 0) { - char *dir = strrchr (local, '/'); - - if (errno != ENOENT && errno != EACCES) { - warn ("local: %s", local); - signal (SIGINT, oldintr); - code = -1; - return; - } - if (dir != NULL) - *dir = 0; - d = access (dir ? local : ".", 2); - if (dir != NULL) - *dir = '/'; - if (d < 0) { - warn ("local: %s", local); - signal (SIGINT, oldintr); - code = -1; - return; - } - if (!runique && errno == EACCES && - chmod (local, 0600) < 0) { - warn ("local: %s", local); - signal (SIGINT, oldintr); - signal (SIGINT, oldintr); - code = -1; - return; - } - if (runique && errno == EACCES && - (local = gunique (local)) == NULL) { - signal (SIGINT, oldintr); - code = -1; - return; - } - } else if (runique && (local = gunique (local)) == NULL) { - signal(SIGINT, oldintr); - code = -1; - return; - } - } - if (!is_retr) { - if (curtype != TYPE_A) - changetype (TYPE_A, 0); - } else if (curtype != type) - changetype (type, 0); - if (initconn ()) { - signal (SIGINT, oldintr); - code = -1; - return; - } - if (setjmp (recvabort)) - goto abort; - if (is_retr && restart_point && - command ("REST %ld", (long) restart_point) != CONTINUE) - return; - if (remote) { - if (command ("%s %s", cmd, remote) != PRELIM) { - signal (SIGINT, oldintr); - return; - } - } else { - if (command ("%s", cmd) != PRELIM) { - signal (SIGINT, oldintr); - return; - } - } - din = dataconn ("r"); - if (din == NULL) - goto abort; - set_buffer_size (fileno (din), 1); - if (local_given && strcmp (local, "-") == 0) - fout = stdout; - else if (local_given && *local == '|') { - oldintp = signal (SIGPIPE, SIG_IGN); - fout = popen (local + 1, "w"); - if (fout == NULL) { - warn ("%s", local + 1); - goto abort; - } - closefunc = pclose; - } else { - fout = fopen (local, lmode); - if (fout == NULL) { - warn ("local: %s", local); - goto abort; - } - closefunc = fclose; - } - buf = alloc_buffer (buf, &bufsize, - fstat (fileno (fout), &st) >= 0 ? &st : NULL); - if (buf == NULL) - goto abort; - - gettimeofday (&start, (struct timezone *) 0); - switch (curtype) { - - case TYPE_I: - case TYPE_L: - if (restart_point && - lseek (fileno (fout), restart_point, SEEK_SET) < 0) { - warn ("local: %s", local); - if (closefunc != NULL) - (*closefunc) (fout); - return; - } - errno = d = 0; - while ((c = sec_read (fileno (din), buf, bufsize)) > 0) { - if ((d = write (fileno (fout), buf, c)) != c) - break; - bytes += c; - if (hash) { - while (bytes >= hashbytes) { - putchar ('#'); - hashbytes += HASHBYTES; - } - fflush (stdout); - } - } - if (hash && bytes > 0) { - if (bytes < HASHBYTES) - putchar ('#'); - putchar ('\n'); - fflush (stdout); - } - if (c < 0) { - if (errno != EPIPE) - warn ("netin"); - bytes = -1; - } - if (d < c) { - if (d < 0) - warn ("local: %s", local); - else - warnx ("%s: short write", local); - } - break; - - case TYPE_A: - if (restart_point) { - int i, n, ch; - - if (fseek (fout, 0L, SEEK_SET) < 0) - goto done; - n = restart_point; - for (i = 0; i++ < n;) { - if ((ch = sec_getc (fout)) == EOF) - goto done; - if (ch == '\n') - i++; - } - if (fseek (fout, 0L, SEEK_CUR) < 0) { - done: - warn ("local: %s", local); - if (closefunc != NULL) - (*closefunc) (fout); - return; - } - } - while ((c = sec_getc(din)) != EOF) { - if (c == '\n') - bare_lfs++; - while (c == '\r') { - while (hash && (bytes >= hashbytes)) { - putchar ('#'); - fflush (stdout); - hashbytes += HASHBYTES; - } - bytes++; - if ((c = sec_getc (din)) != '\n' || tcrflag) { - if (ferror (fout)) - goto break2; - putc ('\r', fout); - if (c == '\0') { - bytes++; - goto contin2; - } - if (c == EOF) - goto contin2; - } - } - putc (c, fout); - bytes++; - contin2:; - } -break2: - if (bare_lfs) { - printf ("WARNING! %d bare linefeeds received in ASCII mode\n", - bare_lfs); - printf ("File may not have transferred correctly.\n"); - } - if (hash) { - if (bytes < hashbytes) - putchar ('#'); - putchar ('\n'); - fflush (stdout); - } - if (ferror (din)) { - if (errno != EPIPE) - warn ("netin"); - bytes = -1; - } - if (ferror (fout)) - warn ("local: %s", local); - break; - } - if (closefunc != NULL) - (*closefunc) (fout); - signal (SIGINT, oldintr); - if (oldintp) - signal (SIGPIPE, oldintp); - fclose (din); - gettimeofday (&stop, (struct timezone *) 0); - getreply (0); - if (bytes > 0 && is_retr) - ptransfer ("received", bytes, &start, &stop); - return; -abort: - - /* abort using RFC959 recommended IP,SYNC sequence */ - - if (oldintp) - signal (SIGPIPE, oldintr); - signal (SIGINT, SIG_IGN); - if (!cpend) { - code = -1; - signal (SIGINT, oldintr); - return; - } - abort_remote(din); - code = -1; - if (data >= 0) { - close (data); - data = -1; - } - if (closefunc != NULL && fout != NULL) - (*closefunc) (fout); - if (din) - fclose (din); - gettimeofday (&stop, (struct timezone *) 0); - if (bytes > 0) - ptransfer ("received", bytes, &start, &stop); - signal (SIGINT, oldintr); -} - -static int -parse_epsv (const char *str) -{ - char sep; - char *end; - int port; - - if (*str == '\0') - return -1; - sep = *str++; - if (sep != *str++) - return -1; - if (sep != *str++) - return -1; - port = strtol (str, &end, 0); - if (str == end) - return -1; - if (end[0] != sep || end[1] != '\0') - return -1; - return htons(port); -} - -static int -parse_pasv (struct sockaddr_in *sin4, const char *str) -{ - int a0, a1, a2, a3, p0, p1; - - /* - * What we've got at this point is a string of comma separated - * one-byte unsigned integer values. The first four are the an IP - * address. The fifth is the MSB of the port number, the sixth is the - * LSB. From that we'll prepare a sockaddr_in. - */ - - if (sscanf (str, "%d,%d,%d,%d,%d,%d", - &a0, &a1, &a2, &a3, &p0, &p1) != 6) { - printf ("Passive mode address scan failure. " - "Shouldn't happen!\n"); - return -1; - } - if (a0 < 0 || a0 > 255 || - a1 < 0 || a1 > 255 || - a2 < 0 || a2 > 255 || - a3 < 0 || a3 > 255 || - p0 < 0 || p0 > 255 || - p1 < 0 || p1 > 255) { - printf ("Can't parse passive mode string.\n"); - return -1; - } - memset (sin4, 0, sizeof(*sin4)); - sin4->sin_family = AF_INET; - sin4->sin_addr.s_addr = htonl ((a0 << 24) | (a1 << 16) | - (a2 << 8) | a3); - sin4->sin_port = htons ((p0 << 8) | p1); - return 0; -} - -static int -passive_mode (void) -{ - int port; - - data = socket (myctladdr->sa_family, SOCK_STREAM, 0); - if (data < 0) { - warn ("socket"); - return (1); - } - if (options & SO_DEBUG) - socket_set_debug (data); - if (command ("EPSV") != COMPLETE) { - if (command ("PASV") != COMPLETE) { - printf ("Passive mode refused.\n"); - goto bad; - } - } - - /* - * Parse the reply to EPSV or PASV - */ - - port = parse_epsv (pasv); - if (port > 0) { - data_addr->sa_family = myctladdr->sa_family; - socket_set_address_and_port (data_addr, - socket_get_address (hisctladdr), - port); - } else { - if (parse_pasv ((struct sockaddr_in *)data_addr, pasv) < 0) - goto bad; - } - - if (connect (data, data_addr, socket_sockaddr_size (data_addr)) < 0) { - warn ("connect"); - goto bad; - } -#ifdef IPTOS_THROUGHPUT - socket_set_tos (data, IPTOS_THROUGHPUT); -#endif - return (0); -bad: - close (data); - data = -1; - sendport = 1; - return (1); -} - - -static int -active_mode (void) -{ - int tmpno = 0; - socklen_t len; - int result; - -noport: - data_addr->sa_family = myctladdr->sa_family; - socket_set_address_and_port (data_addr, socket_get_address (myctladdr), - sendport ? 0 : socket_get_port (myctladdr)); - - if (data != -1) - close (data); - data = socket (data_addr->sa_family, SOCK_STREAM, 0); - if (data < 0) { - warn ("socket"); - if (tmpno) - sendport = 1; - return (1); - } - if (!sendport) - socket_set_reuseaddr (data, 1); - if (bind (data, data_addr, socket_sockaddr_size (data_addr)) < 0) { - warn ("bind"); - goto bad; - } - if (options & SO_DEBUG) - socket_set_debug (data); - len = sizeof (data_addr_ss); - if (getsockname (data, data_addr, &len) < 0) { - warn ("getsockname"); - goto bad; - } - if (listen (data, 1) < 0) - warn ("listen"); - if (sendport) { - char addr_str[256]; - int inet_af; - int overbose; - - if (inet_ntop (data_addr->sa_family, socket_get_address (data_addr), - addr_str, sizeof(addr_str)) == NULL) - errx (1, "inet_ntop failed"); - switch (data_addr->sa_family) { - case AF_INET : - inet_af = 1; - break; -#ifdef HAVE_IPV6 - case AF_INET6 : - inet_af = 2; - break; -#endif - default : - errx (1, "bad address family %d", data_addr->sa_family); - } - - - overbose = verbose; - if (debug == 0) - verbose = -1; - - result = command ("EPRT |%d|%s|%d|", - inet_af, addr_str, - ntohs(socket_get_port (data_addr))); - verbose = overbose; - - if (result == ERROR) { - struct sockaddr_in *sin4 = (struct sockaddr_in *)data_addr; - - unsigned int a = ntohl(sin4->sin_addr.s_addr); - unsigned int p = ntohs(sin4->sin_port); - - if (data_addr->sa_family != AF_INET) { - warnx ("remote server doesn't support EPRT"); - goto bad; - } - - result = command("PORT %d,%d,%d,%d,%d,%d", - (a >> 24) & 0xff, - (a >> 16) & 0xff, - (a >> 8) & 0xff, - a & 0xff, - (p >> 8) & 0xff, - p & 0xff); - if (result == ERROR && sendport == -1) { - sendport = 0; - tmpno = 1; - goto noport; - } - return (result != COMPLETE); - } - return result != COMPLETE; - } - if (tmpno) - sendport = 1; - - -#ifdef IPTOS_THROUGHPUT - socket_set_tos (data, IPTOS_THROUGHPUT); -#endif - return (0); -bad: - close (data); - data = -1; - if (tmpno) - sendport = 1; - return (1); -} - -/* - * Need to start a listen on the data channel before we send the command, - * otherwise the server's connect may fail. - */ -int -initconn (void) -{ - if (passivemode) - return passive_mode (); - else - return active_mode (); -} - -FILE * -dataconn (const char *lmode) -{ - struct sockaddr_storage from_ss; - struct sockaddr *from = (struct sockaddr *)&from_ss; - socklen_t fromlen = sizeof(from_ss); - int s; - - if (passivemode) - return (fdopen (data, lmode)); - - s = accept (data, from, &fromlen); - if (s < 0) { - warn ("accept"); - close (data), data = -1; - return (NULL); - } - close (data); - data = s; -#ifdef IPTOS_THROUGHPUT - socket_set_tos (s, IPTOS_THROUGHPUT); -#endif - return (fdopen (data, lmode)); -} - -void -ptransfer (char *direction, long int bytes, - struct timeval * t0, struct timeval * t1) -{ - struct timeval td; - float s; - float bs; - int prec; - char *unit; - - if (verbose) { - td.tv_sec = t1->tv_sec - t0->tv_sec; - td.tv_usec = t1->tv_usec - t0->tv_usec; - if (td.tv_usec < 0) { - td.tv_sec--; - td.tv_usec += 1000000; - } - s = td.tv_sec + (td.tv_usec / 1000000.); - bs = bytes / (s ? s : 1); - if (bs >= 1048576) { - bs /= 1048576; - unit = "M"; - prec = 2; - } else if (bs >= 1024) { - bs /= 1024; - unit = "k"; - prec = 1; - } else { - unit = ""; - prec = 0; - } - - printf ("%ld bytes %s in %.3g seconds (%.*f %sbyte/s)\n", - bytes, direction, s, prec, bs, unit); - } -} - -void -psabort (int sig) -{ - - abrtflag++; -} - -void -pswitch (int flag) -{ - sighand oldintr; - static struct comvars { - int connect; - char name[MaxHostNameLen]; - struct sockaddr_storage mctl; - struct sockaddr_storage hctl; - FILE *in; - FILE *out; - int tpe; - int curtpe; - int cpnd; - int sunqe; - int runqe; - int mcse; - int ntflg; - char nti[17]; - char nto[17]; - int mapflg; - char mi[MaxPathLen]; - char mo[MaxPathLen]; - } proxstruct, tmpstruct; - struct comvars *ip, *op; - - abrtflag = 0; - oldintr = signal (SIGINT, psabort); - if (flag) { - if (proxy) - return; - ip = &tmpstruct; - op = &proxstruct; - proxy++; - } else { - if (!proxy) - return; - ip = &proxstruct; - op = &tmpstruct; - proxy = 0; - } - ip->connect = connected; - connected = op->connect; - if (hostname) { - strlcpy (ip->name, hostname, sizeof (ip->name)); - } else - ip->name[0] = 0; - hostname = op->name; - ip->hctl = hisctladdr_ss; - hisctladdr_ss = op->hctl; - ip->mctl = myctladdr_ss; - myctladdr_ss = op->mctl; - ip->in = cin; - cin = op->in; - ip->out = cout; - cout = op->out; - ip->tpe = type; - type = op->tpe; - ip->curtpe = curtype; - curtype = op->curtpe; - ip->cpnd = cpend; - cpend = op->cpnd; - ip->sunqe = sunique; - sunique = op->sunqe; - ip->runqe = runique; - runique = op->runqe; - ip->mcse = mcase; - mcase = op->mcse; - ip->ntflg = ntflag; - ntflag = op->ntflg; - strlcpy (ip->nti, ntin, sizeof (ip->nti)); - strlcpy (ntin, op->nti, 17); - strlcpy (ip->nto, ntout, sizeof (ip->nto)); - strlcpy (ntout, op->nto, 17); - ip->mapflg = mapflag; - mapflag = op->mapflg; - strlcpy (ip->mi, mapin, MaxPathLen); - strlcpy (mapin, op->mi, MaxPathLen); - strlcpy (ip->mo, mapout, MaxPathLen); - strlcpy (mapout, op->mo, MaxPathLen); - signal(SIGINT, oldintr); - if (abrtflag) { - abrtflag = 0; - (*oldintr) (SIGINT); - } -} - -void -abortpt (int sig) -{ - - printf ("\n"); - fflush (stdout); - ptabflg++; - mflag = 0; - abrtflag = 0; - longjmp (ptabort, 1); -} - -void -proxtrans (char *cmd, char *local, char *remote) -{ - sighand oldintr = NULL; - int secndflag = 0, prox_type, nfnd; - char *cmd2; - fd_set mask; - - if (strcmp (cmd, "RETR")) - cmd2 = "RETR"; - else - cmd2 = runique ? "STOU" : "STOR"; - if ((prox_type = type) == 0) { - if (unix_server && unix_proxy) - prox_type = TYPE_I; - else - prox_type = TYPE_A; - } - if (curtype != prox_type) - changetype (prox_type, 1); - if (command ("PASV") != COMPLETE) { - printf ("proxy server does not support third party transfers.\n"); - return; - } - pswitch (0); - if (!connected) { - printf ("No primary connection\n"); - pswitch (1); - code = -1; - return; - } - if (curtype != prox_type) - changetype (prox_type, 1); - if (command ("PORT %s", pasv) != COMPLETE) { - pswitch (1); - return; - } - if (setjmp (ptabort)) - goto abort; - oldintr = signal (SIGINT, abortpt); - if (command ("%s %s", cmd, remote) != PRELIM) { - signal (SIGINT, oldintr); - pswitch (1); - return; - } - sleep (2); - pswitch (1); - secndflag++; - if (command ("%s %s", cmd2, local) != PRELIM) - goto abort; - ptflag++; - getreply (0); - pswitch (0); - getreply (0); - signal (SIGINT, oldintr); - pswitch (1); - ptflag = 0; - printf ("local: %s remote: %s\n", local, remote); - return; -abort: - signal (SIGINT, SIG_IGN); - ptflag = 0; - if (strcmp (cmd, "RETR") && !proxy) - pswitch (1); - else if (!strcmp (cmd, "RETR") && proxy) - pswitch (0); - if (!cpend && !secndflag) { /* only here if cmd = "STOR" (proxy=1) */ - if (command ("%s %s", cmd2, local) != PRELIM) { - pswitch (0); - if (cpend) - abort_remote ((FILE *) NULL); - } - pswitch (1); - if (ptabflg) - code = -1; - if (oldintr) - signal (SIGINT, oldintr); - return; - } - if (cpend) - abort_remote ((FILE *) NULL); - pswitch (!proxy); - if (!cpend && !secndflag) { /* only if cmd = "RETR" (proxy=1) */ - if (command ("%s %s", cmd2, local) != PRELIM) { - pswitch (0); - if (cpend) - abort_remote ((FILE *) NULL); - pswitch (1); - if (ptabflg) - code = -1; - signal (SIGINT, oldintr); - return; - } - } - if (cpend) - abort_remote ((FILE *) NULL); - pswitch (!proxy); - if (cpend) { - FD_ZERO (&mask); - if (fileno(cin) >= FD_SETSIZE) - errx (1, "fd too large"); - FD_SET (fileno (cin), &mask); - if ((nfnd = empty (&mask, 10)) <= 0) { - if (nfnd < 0) { - warn ("abort"); - } - if (ptabflg) - code = -1; - lostpeer (0); - } - getreply (0); - getreply (0); - } - if (proxy) - pswitch (0); - pswitch (1); - if (ptabflg) - code = -1; - signal (SIGINT, oldintr); -} - -void -reset (int argc, char **argv) -{ - fd_set mask; - int nfnd = 1; - - FD_ZERO (&mask); - while (nfnd > 0) { - if (fileno (cin) >= FD_SETSIZE) - errx (1, "fd too large"); - FD_SET (fileno (cin), &mask); - if ((nfnd = empty (&mask, 0)) < 0) { - warn ("reset"); - code = -1; - lostpeer(0); - } else if (nfnd) { - getreply(0); - } - } -} - -char * -gunique (char *local) -{ - static char new[MaxPathLen]; - char *cp = strrchr (local, '/'); - int d, count = 0; - char ext = '1'; - - if (cp) - *cp = '\0'; - d = access (cp ? local : ".", 2); - if (cp) - *cp = '/'; - if (d < 0) { - warn ("local: %s", local); - return NULL; - } - strlcpy (new, local, sizeof(new)); - cp = new + strlen(new); - *cp++ = '.'; - while (!d) { - if (++count == 100) { - printf ("runique: can't find unique file name.\n"); - return NULL; - } - *cp++ = ext; - *cp = '\0'; - if (ext == '9') - ext = '0'; - else - ext++; - if ((d = access (new, 0)) < 0) - break; - if (ext != '0') - cp--; - else if (*(cp - 2) == '.') - *(cp - 1) = '1'; - else { - *(cp - 2) = *(cp - 2) + 1; - cp--; - } - } - return (new); -} - -void -abort_remote (FILE * din) -{ - char buf[BUFSIZ]; - int nfnd; - fd_set mask; - - /* - * send IAC in urgent mode instead of DM because 4.3BSD places oob mark - * after urgent byte rather than before as is protocol now - */ - snprintf (buf, sizeof (buf), "%c%c%c", IAC, IP, IAC); - if (send (fileno (cout), buf, 3, MSG_OOB) != 3) - warn ("abort"); - fprintf (cout, "%c", DM); - sec_fprintf(cout, "ABOR"); - sec_fflush (cout); - fprintf (cout, "\r\n"); - fflush(cout); - FD_ZERO (&mask); - if (fileno (cin) >= FD_SETSIZE) - errx (1, "fd too large"); - FD_SET (fileno (cin), &mask); - if (din) { - if (fileno (din) >= FD_SETSIZE) - errx (1, "fd too large"); - FD_SET (fileno (din), &mask); - } - if ((nfnd = empty (&mask, 10)) <= 0) { - if (nfnd < 0) { - warn ("abort"); - } - if (ptabflg) - code = -1; - lostpeer (0); - } - if (din && FD_ISSET (fileno (din), &mask)) { - while (read (fileno (din), buf, BUFSIZ) > 0) - /* LOOP */ ; - } - if (getreply (0) == ERROR && code == 552) { - /* 552 needed for nic style abort */ - getreply (0); - } - getreply (0); -} diff --git a/crypto/heimdal/appl/ftp/ftp/ftp_locl.h b/crypto/heimdal/appl/ftp/ftp/ftp_locl.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/ftp_locl.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifndef __FTP_LOCL_H__ -#define __FTP_LOCL_H__ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#ifdef HAVE_PWD_H -#include -#endif -#include -#include -#include -#include -#include -#ifdef TIME_WITH_SYS_TIME -#include -#include -#elif defined(HAVE_SYS_TIME_H) -#include -#else -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif -#ifdef HAVE_SYS_WAIT_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif - -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN_SYSTM_H -#include -#endif -#ifdef HAVE_NETINET_IP_H -#include -#endif - -#ifdef HAVE_ARPA_FTP_H -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_ARPA_TELNET_H -#include -#endif - -#include -#include -#include -#ifdef HAVE_NETDB_H -#include -#endif - -#ifdef HAVE_SYS_MMAN_H -#include -#endif - -#include - -#ifdef SOCKS -#include -extern int LIBPREFIX(fclose) (FILE *); - -/* This doesn't belong here. */ -struct tm *localtime(const time_t *); -struct hostent *gethostbyname(const char *); - -#endif - -#include "ftp_var.h" -#include "extern.h" -#include "common.h" -#include "pathnames.h" - -#include "roken.h" -#include "security.h" - -/* des_read_pw_string */ -#include "crypto-headers.h" - -#if defined(__sun__) && !defined(__svr4) -int fclose(FILE*); -int pclose(FILE*); -#endif - -#endif /* __FTP_LOCL_H__ */ diff --git a/crypto/heimdal/appl/ftp/ftp/ftp_var.h b/crypto/heimdal/appl/ftp/ftp/ftp_var.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/ftp_var.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 1985, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ftp_var.h 8.4 (Berkeley) 10/9/94 - */ - -/* - * FTP global variables. - */ - -#ifdef HAVE_SYS_PARAM_H -#include -#endif -#include - -/* - * Options and other state info. - */ -extern int trace; /* trace packets exchanged */ -extern int hash; /* print # for each buffer transferred */ -extern int sendport; /* use PORT cmd for each data connection */ -extern int verbose; /* print messages coming back from server */ -extern int connected; /* connected to server */ -extern int fromatty; /* input is from a terminal */ -extern int interactive; /* interactively prompt on m* cmds */ -extern int lineedit; /* use line-editing */ -extern int debug; /* debugging level */ -extern int bell; /* ring bell on cmd completion */ -extern int doglob; /* glob local file names */ -extern int autologin; /* establish user account on connection */ -extern int doencrypt; -extern int proxy; /* proxy server connection active */ -extern int proxflag; /* proxy connection exists */ -extern int sunique; /* store files on server with unique name */ -extern int runique; /* store local files with unique name */ -extern int mcase; /* map upper to lower case for mget names */ -extern int ntflag; /* use ntin ntout tables for name translation */ -extern int mapflag; /* use mapin mapout templates on file names */ -extern int code; /* return/reply code for ftp command */ -extern int crflag; /* if 1, strip car. rets. on ascii gets */ -extern char pasv[64]; /* passive port for proxy data connection */ -extern int passivemode; /* passive mode enabled */ -extern char *altarg; /* argv[1] with no shell-like preprocessing */ -extern char ntin[17]; /* input translation table */ -extern char ntout[17]; /* output translation table */ -extern char mapin[MaxPathLen]; /* input map template */ -extern char mapout[MaxPathLen]; /* output map template */ -extern char typename[32]; /* name of file transfer type */ -extern int type; /* requested file transfer type */ -extern int curtype; /* current file transfer type */ -extern char structname[32]; /* name of file transfer structure */ -extern int stru; /* file transfer structure */ -extern char formname[32]; /* name of file transfer format */ -extern int form; /* file transfer format */ -extern char modename[32]; /* name of file transfer mode */ -extern int mode; /* file transfer mode */ -extern char bytename[32]; /* local byte size in ascii */ -extern int bytesize; /* local byte size in binary */ - -extern char *hostname; /* name of host connected to */ -extern int unix_server; /* server is unix, can use binary for ascii */ -extern int unix_proxy; /* proxy is unix, can use binary for ascii */ - -extern jmp_buf toplevel; /* non-local goto stuff for cmd scanner */ - -extern char line[200]; /* input line buffer */ -extern char *stringbase; /* current scan point in line buffer */ -extern char argbuf[200]; /* argument storage buffer */ -extern char *argbase; /* current storage point in arg buffer */ -extern int margc; /* count of arguments on input line */ -extern char **margv; /* args parsed from input line */ -extern int margvlen; /* how large margv is currently */ -extern int cpend; /* flag: if != 0, then pending server reply */ -extern int mflag; /* flag: if != 0, then active multi command */ - -extern int options; /* used during socket creation */ -extern int use_kerberos; /* use Kerberos authentication */ - -/* - * Format of command table. - */ -struct cmd { - char *c_name; /* name of command */ - char *c_help; /* help string */ - char c_bell; /* give bell when command completes */ - char c_conn; /* must be connected to use command */ - char c_proxy; /* proxy server may execute */ - void (*c_handler) (int, char **); /* function to call */ -}; - -struct macel { - char mac_name[9]; /* macro name */ - char *mac_start; /* start of macro in macbuf */ - char *mac_end; /* end of macro in macbuf */ -}; - -extern int macnum; /* number of defined macros */ -extern struct macel macros[16]; -extern char macbuf[4096]; - - diff --git a/crypto/heimdal/appl/ftp/ftp/globals.c b/crypto/heimdal/appl/ftp/ftp/globals.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/globals.c +++ /dev/null @@ -1,79 +0,0 @@ -#include "ftp_locl.h" -RCSID("$Id$"); - -/* - * Options and other state info. - */ -int trace; /* trace packets exchanged */ -int hash; /* print # for each buffer transferred */ -int sendport; /* use PORT cmd for each data connection */ -int verbose; /* print messages coming back from server */ -int connected; /* connected to server */ -int fromatty; /* input is from a terminal */ -int interactive; /* interactively prompt on m* cmds */ -int lineedit; /* use line-editing */ -int debug; /* debugging level */ -int bell; /* ring bell on cmd completion */ -int doglob; /* glob local file names */ -int doencrypt; /* try to use encryption */ -int autologin; /* establish user account on connection */ -int proxy; /* proxy server connection active */ -int proxflag; /* proxy connection exists */ -int sunique; /* store files on server with unique name */ -int runique; /* store local files with unique name */ -int mcase; /* map upper to lower case for mget names */ -int ntflag; /* use ntin ntout tables for name translation */ -int mapflag; /* use mapin mapout templates on file names */ -int code; /* return/reply code for ftp command */ -int crflag; /* if 1, strip car. rets. on ascii gets */ -char pasv[64]; /* passive port for proxy data connection */ -int passivemode; /* passive mode enabled */ -char *altarg; /* argv[1] with no shell-like preprocessing */ -char ntin[17]; /* input translation table */ -char ntout[17]; /* output translation table */ -char mapin[MaxPathLen]; /* input map template */ -char mapout[MaxPathLen]; /* output map template */ -char typename[32]; /* name of file transfer type */ -int type; /* requested file transfer type */ -int curtype; /* current file transfer type */ -char structname[32]; /* name of file transfer structure */ -int stru; /* file transfer structure */ -char formname[32]; /* name of file transfer format */ -int form; /* file transfer format */ -char modename[32]; /* name of file transfer mode */ -int mode; /* file transfer mode */ -char bytename[32]; /* local byte size in ascii */ -int bytesize; /* local byte size in binary */ - -char *hostname; /* name of host connected to */ -int unix_server; /* server is unix, can use binary for ascii */ -int unix_proxy; /* proxy is unix, can use binary for ascii */ - -jmp_buf toplevel; /* non-local goto stuff for cmd scanner */ - -char line[200]; /* input line buffer */ -char *stringbase; /* current scan point in line buffer */ -char argbuf[200]; /* argument storage buffer */ -char *argbase; /* current storage point in arg buffer */ -int margc; /* count of arguments on input line */ -char **margv; /* args parsed from input line */ -int margvlen; /* how large margv is currently */ -int cpend; /* flag: if != 0, then pending server reply */ -int mflag; /* flag: if != 0, then active multi command */ - -int options; /* used during socket creation */ -int use_kerberos; /* use Kerberos authentication */ - -/* - * Format of command table. - */ - -int macnum; /* number of defined macros */ -struct macel macros[16]; -char macbuf[4096]; - -char username[32]; - -/* these are set in ruserpassword */ -char myhostname[MaxHostNameLen]; -char *mydomain; diff --git a/crypto/heimdal/appl/ftp/ftp/gssapi.c b/crypto/heimdal/appl/ftp/ftp/gssapi.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/gssapi.c +++ /dev/null @@ -1,511 +0,0 @@ -/* - * Copyright (c) 1998 - 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef FTP_SERVER -#include "ftpd_locl.h" -#else -#include "ftp_locl.h" -#endif -#include -#include -#include - -RCSID("$Id$"); - -int ftp_do_gss_bindings = 0; -int ftp_do_gss_delegate = 1; - -struct gssapi_data { - gss_ctx_id_t context_hdl; - gss_name_t client_name; - gss_cred_id_t delegated_cred_handle; - void *mech_data; -}; - -static int -gss_init(void *app_data) -{ - struct gssapi_data *d = app_data; - d->context_hdl = GSS_C_NO_CONTEXT; - d->delegated_cred_handle = GSS_C_NO_CREDENTIAL; -#if defined(FTP_SERVER) - return 0; -#else - /* XXX Check the gss mechanism; with gss_indicate_mechs() ? */ -#ifdef KRB5 - return !use_kerberos; -#else - return 0; -#endif /* KRB5 */ -#endif /* FTP_SERVER */ -} - -static int -gss_check_prot(void *app_data, int level) -{ - if(level == prot_confidential) - return -1; - return 0; -} - -static int -gss_decode(void *app_data, void *buf, int len, int level) -{ - OM_uint32 maj_stat, min_stat; - gss_buffer_desc input, output; - gss_qop_t qop_state; - int conf_state; - struct gssapi_data *d = app_data; - size_t ret_len; - - input.length = len; - input.value = buf; - maj_stat = gss_unwrap (&min_stat, - d->context_hdl, - &input, - &output, - &conf_state, - &qop_state); - if(GSS_ERROR(maj_stat)) - return -1; - memmove(buf, output.value, output.length); - ret_len = output.length; - gss_release_buffer(&min_stat, &output); - return ret_len; -} - -static int -gss_overhead(void *app_data, int level, int len) -{ - return 100; /* dunno? */ -} - - -static int -gss_encode(void *app_data, void *from, int length, int level, void **to) -{ - OM_uint32 maj_stat, min_stat; - gss_buffer_desc input, output; - int conf_state; - struct gssapi_data *d = app_data; - - input.length = length; - input.value = from; - maj_stat = gss_wrap (&min_stat, - d->context_hdl, - level == prot_private, - GSS_C_QOP_DEFAULT, - &input, - &conf_state, - &output); - *to = output.value; - return output.length; -} - -static void -sockaddr_to_gss_address (struct sockaddr *sa, - OM_uint32 *addr_type, - gss_buffer_desc *gss_addr) -{ - switch (sa->sa_family) { -#ifdef HAVE_IPV6 - case AF_INET6 : { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; - - gss_addr->length = 16; - gss_addr->value = &sin6->sin6_addr; - *addr_type = GSS_C_AF_INET6; - break; - } -#endif - case AF_INET : { - struct sockaddr_in *sin4 = (struct sockaddr_in *)sa; - - gss_addr->length = 4; - gss_addr->value = &sin4->sin_addr; - *addr_type = GSS_C_AF_INET; - break; - } - default : - errx (1, "unknown address family %d", sa->sa_family); - - } -} - -/* end common stuff */ - -#ifdef FTP_SERVER - -static int -gss_adat(void *app_data, void *buf, size_t len) -{ - char *p = NULL; - gss_buffer_desc input_token, output_token; - OM_uint32 maj_stat, min_stat; - gss_name_t client_name; - struct gssapi_data *d = app_data; - gss_channel_bindings_t bindings; - - if (ftp_do_gss_bindings) { - bindings = malloc(sizeof(*bindings)); - if (bindings == NULL) - errx(1, "out of memory"); - - sockaddr_to_gss_address (his_addr, - &bindings->initiator_addrtype, - &bindings->initiator_address); - sockaddr_to_gss_address (ctrl_addr, - &bindings->acceptor_addrtype, - &bindings->acceptor_address); - - bindings->application_data.length = 0; - bindings->application_data.value = NULL; - } else - bindings = GSS_C_NO_CHANNEL_BINDINGS; - - input_token.value = buf; - input_token.length = len; - - maj_stat = gss_accept_sec_context (&min_stat, - &d->context_hdl, - GSS_C_NO_CREDENTIAL, - &input_token, - bindings, - &client_name, - NULL, - &output_token, - NULL, - NULL, - &d->delegated_cred_handle); - - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - - if(output_token.length) { - if(base64_encode(output_token.value, output_token.length, &p) < 0) { - reply(535, "Out of memory base64-encoding."); - return -1; - } - gss_release_buffer(&min_stat, &output_token); - } - if(maj_stat == GSS_S_COMPLETE){ - d->client_name = client_name; - client_name = GSS_C_NO_NAME; - if(p) - reply(235, "ADAT=%s", p); - else - reply(235, "ADAT Complete"); - sec_complete = 1; - - } else if(maj_stat == GSS_S_CONTINUE_NEEDED) { - if(p) - reply(335, "ADAT=%s", p); - else - reply(335, "OK, need more data"); - } else { - OM_uint32 new_stat; - OM_uint32 msg_ctx = 0; - gss_buffer_desc status_string; - gss_display_status(&new_stat, - min_stat, - GSS_C_MECH_CODE, - GSS_C_NO_OID, - &msg_ctx, - &status_string); - syslog(LOG_ERR, "gss_accept_sec_context: %.*s", - (int)status_string.length, - (char*)status_string.value); - gss_release_buffer(&new_stat, &status_string); - reply(431, "Security resource unavailable"); - } - - if (client_name) - gss_release_name(&min_stat, &client_name); - free(p); - return 0; -} - -int gssapi_userok(void*, char*); -int gssapi_session(void*, char*); - -struct sec_server_mech gss_server_mech = { - "GSSAPI", - sizeof(struct gssapi_data), - gss_init, /* init */ - NULL, /* end */ - gss_check_prot, - gss_overhead, - gss_encode, - gss_decode, - /* */ - NULL, - gss_adat, - NULL, /* pbsz */ - NULL, /* ccc */ - gssapi_userok, - gssapi_session -}; - -#else /* FTP_SERVER */ - -extern struct sockaddr *hisctladdr, *myctladdr; - -static int -import_name(const char *kname, const char *host, gss_name_t *target_name) -{ - OM_uint32 maj_stat, min_stat; - gss_buffer_desc name; - char *str; - - name.length = asprintf(&str, "%s@%s", kname, host); - if (str == NULL) { - printf("Out of memory\n"); - return AUTH_ERROR; - } - name.value = str; - - maj_stat = gss_import_name(&min_stat, - &name, - GSS_C_NT_HOSTBASED_SERVICE, - target_name); - if (GSS_ERROR(maj_stat)) { - OM_uint32 new_stat; - OM_uint32 msg_ctx = 0; - gss_buffer_desc status_string; - - gss_display_status(&new_stat, - min_stat, - GSS_C_MECH_CODE, - GSS_C_NO_OID, - &msg_ctx, - &status_string); - printf("Error importing name %.*s: %.*s\n", - (int)name.length, - (char *)name.value, - (int)status_string.length, - (char *)status_string.value); - free(name.value); - gss_release_buffer(&new_stat, &status_string); - return AUTH_ERROR; - } - free(name.value); - return 0; -} - -static int -gss_auth(void *app_data, char *host) -{ - - OM_uint32 maj_stat, min_stat; - gss_name_t target_name; - gss_buffer_desc input, output_token; - int context_established = 0; - char *p; - int n; - gss_channel_bindings_t bindings; - struct gssapi_data *d = app_data; - OM_uint32 mech_flags = GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG; - - const char *knames[] = { "ftp", "host", NULL }, **kname = knames; - - - if(import_name(*kname++, host, &target_name)) - return AUTH_ERROR; - - input.length = 0; - input.value = NULL; - - if (ftp_do_gss_bindings) { - bindings = malloc(sizeof(*bindings)); - if (bindings == NULL) - errx(1, "out of memory"); - - sockaddr_to_gss_address (myctladdr, - &bindings->initiator_addrtype, - &bindings->initiator_address); - sockaddr_to_gss_address (hisctladdr, - &bindings->acceptor_addrtype, - &bindings->acceptor_address); - - bindings->application_data.length = 0; - bindings->application_data.value = NULL; - } else - bindings = GSS_C_NO_CHANNEL_BINDINGS; - - if (ftp_do_gss_delegate) - mech_flags |= GSS_C_DELEG_FLAG; - - while(!context_established) { - maj_stat = gss_init_sec_context(&min_stat, - GSS_C_NO_CREDENTIAL, - &d->context_hdl, - target_name, - GSS_C_NO_OID, - mech_flags, - 0, - bindings, - &input, - NULL, - &output_token, - NULL, - NULL); - if (GSS_ERROR(maj_stat)) { - OM_uint32 new_stat; - OM_uint32 msg_ctx = 0; - gss_buffer_desc status_string; - - d->context_hdl = GSS_C_NO_CONTEXT; - - gss_release_name(&min_stat, &target_name); - - if(*kname != NULL) { - - if(import_name(*kname++, host, &target_name)) { - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - return AUTH_ERROR; - } - continue; - } - - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - - gss_display_status(&new_stat, - min_stat, - GSS_C_MECH_CODE, - GSS_C_NO_OID, - &msg_ctx, - &status_string); - printf("Error initializing security context: %.*s\n", - (int)status_string.length, - (char*)status_string.value); - gss_release_buffer(&new_stat, &status_string); - return AUTH_CONTINUE; - } - - if (input.value) { - free(input.value); - input.value = NULL; - input.length = 0; - } - if (output_token.length != 0) { - base64_encode(output_token.value, output_token.length, &p); - gss_release_buffer(&min_stat, &output_token); - n = command("ADAT %s", p); - free(p); - } - if (GSS_ERROR(maj_stat)) { - if (d->context_hdl != GSS_C_NO_CONTEXT) - gss_delete_sec_context (&min_stat, - &d->context_hdl, - GSS_C_NO_BUFFER); - break; - } - if (maj_stat & GSS_S_CONTINUE_NEEDED) { - p = strstr(reply_string, "ADAT="); - if(p == NULL){ - printf("Error: expected ADAT in reply. got: %s\n", - reply_string); - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - return AUTH_ERROR; - } else { - p+=5; - input.value = malloc(strlen(p)); - input.length = base64_decode(p, input.value); - } - } else { - if(code != 235) { - printf("Unrecognized response code: %d\n", code); - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - return AUTH_ERROR; - } - context_established = 1; - } - } - - gss_release_name(&min_stat, &target_name); - - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - if (input.value) - free(input.value); - - { - gss_name_t targ_name; - - maj_stat = gss_inquire_context(&min_stat, - d->context_hdl, - NULL, - &targ_name, - NULL, - NULL, - NULL, - NULL, - NULL); - if (GSS_ERROR(maj_stat) == 0) { - gss_buffer_desc name; - maj_stat = gss_display_name (&min_stat, - targ_name, - &name, - NULL); - if (GSS_ERROR(maj_stat) == 0) { - printf("Authenticated to <%.*s>\n", - (int)name.length, - (char *)name.value); - gss_release_buffer(&min_stat, &name); - } - gss_release_name(&min_stat, &targ_name); - } else - printf("Failed to get gss name of peer.\n"); - } - - - return AUTH_OK; -} - -struct sec_client_mech gss_client_mech = { - "GSSAPI", - sizeof(struct gssapi_data), - gss_init, - gss_auth, - NULL, /* end */ - gss_check_prot, - gss_overhead, - gss_encode, - gss_decode, -}; - -#endif /* FTP_SERVER */ diff --git a/crypto/heimdal/appl/ftp/ftp/kauth.c b/crypto/heimdal/appl/ftp/ftp/kauth.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/kauth.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 1995-1999 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftp_locl.h" -RCSID("$Id$"); - -#if defined(KRB5) - -void -afslog(int argc, char **argv) -{ - int ret; - if(argc > 2) { - printf("usage: %s [cell]\n", argv[0]); - code = -1; - return; - } - if(argc == 2) - ret = command("SITE AFSLOG %s", argv[1]); - else - ret = command("SITE AFSLOG"); - code = (ret == COMPLETE); -} - -#else -int ftp_afslog_placeholder; -#endif diff --git a/crypto/heimdal/appl/ftp/ftp/main.c b/crypto/heimdal/appl/ftp/ftp/main.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/main.c +++ /dev/null @@ -1,590 +0,0 @@ -/* - * Copyright (c) 1985, 1989, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * FTP User Program -- Command Interface. - */ - -#include "ftp_locl.h" -#include - -RCSID("$Id$"); - -static int help_flag; -static int version_flag; -static int debug_flag; - -struct getargs getargs[] = { - { NULL, 'd', arg_flag, &debug_flag, - "debug", NULL }, - { NULL, 'g', arg_negative_flag, &doglob, - "disables globbing", NULL}, - { NULL, 'i', arg_negative_flag, &interactive, - "Turn off interactive prompting", NULL}, - { NULL, 'l', arg_negative_flag, &lineedit, - "Turn off line editing", NULL}, - { NULL, 'n', arg_negative_flag, &autologin, - "Turn off auto-login", NULL}, - { NULL, 'p', arg_flag, &passivemode, - "passive mode", NULL}, - { NULL, 't', arg_counter, &trace, - "Packet tracing", NULL}, -#ifdef KRB5 - { "gss-bindings", 0, arg_negative_flag, &ftp_do_gss_bindings, - "Don't use GSS-API bindings", NULL}, - { "gss-delegate", 0, arg_negative_flag, &ftp_do_gss_delegate, - "Disable delegation of GSS-API credentials", NULL}, -#endif - { NULL, 'v', arg_counter, &verbose, - "verbosity", NULL}, - { NULL, 'K', arg_negative_flag, &use_kerberos, - "Disable kerberos authentication", NULL}, - { "encrypt", 'x', arg_flag, &doencrypt, - "Encrypt command and data channel if possible" }, - { "version", 0, arg_flag, &version_flag }, - { "help", 'h', arg_flag, &help_flag }, -}; - -static int num_args = sizeof(getargs) / sizeof(getargs[0]); - -static void -usage(int ecode) -{ - arg_printusage(getargs, num_args, NULL, "[host [port]]"); - exit(ecode); -} - -int -main(int argc, char **argv) -{ - int top; - struct passwd *pw = NULL; - char homedir[MaxPathLen]; - struct servent *sp; - int optind = 0; - - setprogname(argv[0]); - - sp = getservbyname("ftp", "tcp"); - if (sp == 0) - errx(1, "ftp/tcp: unknown service"); - doglob = 1; - interactive = 1; - autologin = 1; - lineedit = 1; - passivemode = 0; /* passive mode not active */ - use_kerberos = 1; -#ifdef KRB5 - ftp_do_gss_bindings = 1; -#endif - - if(getarg(getargs, num_args, argc, argv, &optind)) - usage(1); - if(help_flag) - usage(0); - if(version_flag) { - print_version(NULL); - exit(0); - } - - if (debug_flag) { - options |= SO_DEBUG; - debug++; - } - - argc -= optind; - argv += optind; - - fromatty = isatty(fileno(stdin)); - if (fromatty) - verbose++; - cpend = 0; /* no pending replies */ - proxy = 0; /* proxy not active */ - crflag = 1; /* strip c.r. on ascii gets */ - sendport = -1; /* not using ports */ - /* - * Set up the home directory in case we're globbing. - */ - pw = k_getpwuid(getuid()); - if (pw != NULL) { - strlcpy(homedir, pw->pw_dir, sizeof(homedir)); - home = homedir; - } - if (argc > 0) { - char *xargv[5]; - - if (setjmp(toplevel)) - exit(0); - signal(SIGINT, intr); - signal(SIGPIPE, lostpeer); - xargv[0] = (char*)getprogname(); - xargv[1] = argv[0]; - xargv[2] = argv[1]; - xargv[3] = argv[2]; - xargv[4] = NULL; - setpeer(argc+1, xargv); - } - if(setjmp(toplevel) == 0) - top = 1; - else - top = 0; - if (top) { - signal(SIGINT, intr); - signal(SIGPIPE, lostpeer); - } - for (;;) { - cmdscanner(top); - top = 1; - } -} - -void -intr(int sig) -{ - - longjmp(toplevel, 1); -} - -#ifndef SHUT_RDWR -#define SHUT_RDWR 2 -#endif - -RETSIGTYPE -lostpeer(int sig) -{ - - if (connected) { - if (cout != NULL) { - shutdown(fileno(cout), SHUT_RDWR); - fclose(cout); - cout = NULL; - } - if (data >= 0) { - shutdown(data, SHUT_RDWR); - close(data); - data = -1; - } - connected = 0; - } - pswitch(1); - if (connected) { - if (cout != NULL) { - shutdown(fileno(cout), SHUT_RDWR); - fclose(cout); - cout = NULL; - } - connected = 0; - } - proxflag = 0; - pswitch(0); - sec_end(); - SIGRETURN(0); -} - -/* -char * -tail(filename) - char *filename; -{ - char *s; - - while (*filename) { - s = strrchr(filename, '/'); - if (s == NULL) - break; - if (s[1]) - return (s + 1); - *s = '\0'; - } - return (filename); -} -*/ - -static char * -simple_readline(char *prompt) -{ - char buf[BUFSIZ]; - printf ("%s", prompt); - fflush (stdout); - if(fgets(buf, sizeof(buf), stdin) == NULL) - return NULL; - if (buf[strlen(buf) - 1] == '\n') - buf[strlen(buf) - 1] = '\0'; - return strdup(buf); -} - -#ifndef HAVE_READLINE - -static char * -readline(char *prompt) -{ - return simple_readline (prompt); -} - -static void -add_history(char *p) -{ -} - -#else - -/* These should not really be here */ - -char *readline(char *); -void add_history(char *); - -#endif - -/* - * Command parser. - */ -void -cmdscanner(int top) -{ - struct cmd *c; - int l; - - if (!top) - putchar('\n'); - for (;;) { - if (fromatty) { - char *p; - if (lineedit) - p = readline("ftp> "); - else - p = simple_readline("ftp> "); - if(p == NULL) { - printf("\n"); - quit(0, 0); - } - strlcpy(line, p, sizeof(line)); - if (lineedit) - add_history(p); - free(p); - } else{ - if (fgets(line, sizeof line, stdin) == NULL) - quit(0, 0); - } - /* XXX will break on long lines */ - l = strlen(line); - if (l == 0) - break; - if (line[--l] == '\n') { - if (l == 0) - break; - line[l] = '\0'; - } else if (l == sizeof(line) - 2) { - printf("sorry, input line too long\n"); - while ((l = getchar()) != '\n' && l != EOF) - /* void */; - break; - } /* else it was a line without a newline */ - makeargv(); - if (margc == 0) { - continue; - } - c = getcmd(margv[0]); - if (c == (struct cmd *)-1) { - printf("?Ambiguous command\n"); - continue; - } - if (c == 0) { - printf("?Invalid command\n"); - continue; - } - if (c->c_conn && !connected) { - printf("Not connected.\n"); - continue; - } - (*c->c_handler)(margc, margv); - if (bell && c->c_bell) - putchar('\007'); - if (c->c_handler != help) - break; - } - signal(SIGINT, intr); - signal(SIGPIPE, lostpeer); -} - -struct cmd * -getcmd(char *name) -{ - char *p, *q; - struct cmd *c, *found; - int nmatches, longest; - - longest = 0; - nmatches = 0; - found = 0; - for (c = cmdtab; (p = c->c_name); c++) { - for (q = name; *q == *p++; q++) - if (*q == 0) /* exact match? */ - return (c); - if (!*q) { /* the name was a prefix */ - if (q - name > longest) { - longest = q - name; - nmatches = 1; - found = c; - } else if (q - name == longest) - nmatches++; - } - } - if (nmatches > 1) - return ((struct cmd *)-1); - return (found); -} - -/* - * Slice a string up into argc/argv. - */ - -int slrflag; - -void -makeargv(void) -{ - char **argp; - - argp = margv; - stringbase = line; /* scan from first of buffer */ - argbase = argbuf; /* store from first of buffer */ - slrflag = 0; - for (margc = 0; ; margc++) { - /* Expand array if necessary */ - if (margc == margvlen) { - int i; - - margv = (margvlen == 0) - ? (char **)malloc(20 * sizeof(char *)) - : (char **)realloc(margv, - (margvlen + 20)*sizeof(char *)); - if (margv == NULL) - errx(1, "cannot realloc argv array"); - for(i = margvlen; i < margvlen + 20; ++i) - margv[i] = NULL; - margvlen += 20; - argp = margv + margc; - } - - if ((*argp++ = slurpstring()) == NULL) - break; - } - -} - -/* - * Parse string into argbuf; - * implemented with FSM to - * handle quoting and strings - */ -char * -slurpstring(void) -{ - int got_one = 0; - char *sb = stringbase; - char *ap = argbase; - char *tmp = argbase; /* will return this if token found */ - - if (*sb == '!' || *sb == '$') { /* recognize ! as a token for shell */ - switch (slrflag) { /* and $ as token for macro invoke */ - case 0: - slrflag++; - stringbase++; - return ((*sb == '!') ? "!" : "$"); - /* NOTREACHED */ - case 1: - slrflag++; - altarg = stringbase; - break; - default: - break; - } - } - -S0: - switch (*sb) { - - case '\0': - goto OUT; - - case ' ': - case '\t': - sb++; goto S0; - - default: - switch (slrflag) { - case 0: - slrflag++; - break; - case 1: - slrflag++; - altarg = sb; - break; - default: - break; - } - goto S1; - } - -S1: - switch (*sb) { - - case ' ': - case '\t': - case '\0': - goto OUT; /* end of token */ - - case '\\': - sb++; goto S2; /* slurp next character */ - - case '"': - sb++; goto S3; /* slurp quoted string */ - - default: - *ap++ = *sb++; /* add character to token */ - got_one = 1; - goto S1; - } - -S2: - switch (*sb) { - - case '\0': - goto OUT; - - default: - *ap++ = *sb++; - got_one = 1; - goto S1; - } - -S3: - switch (*sb) { - - case '\0': - goto OUT; - - case '"': - sb++; goto S1; - - default: - *ap++ = *sb++; - got_one = 1; - goto S3; - } - -OUT: - if (got_one) - *ap++ = '\0'; - argbase = ap; /* update storage pointer */ - stringbase = sb; /* update scan pointer */ - if (got_one) { - return (tmp); - } - switch (slrflag) { - case 0: - slrflag++; - break; - case 1: - slrflag++; - altarg = (char *) 0; - break; - default: - break; - } - return NULL; -} - -#define HELPINDENT ((int) sizeof ("directory")) - -/* - * Help command. - * Call each command handler with argc == 0 and argv[0] == name. - */ -void -help(int argc, char **argv) -{ - struct cmd *c; - - if (argc == 1) { - int i, j, w, k; - int columns, width = 0, lines; - - printf("Commands may be abbreviated. Commands are:\n\n"); - for (c = cmdtab; c < &cmdtab[NCMDS]; c++) { - int len = strlen(c->c_name); - - if (len > width) - width = len; - } - width = (width + 8) &~ 7; - columns = 80 / width; - if (columns == 0) - columns = 1; - lines = (NCMDS + columns - 1) / columns; - for (i = 0; i < lines; i++) { - for (j = 0; j < columns; j++) { - c = cmdtab + j * lines + i; - if ((!proxy || c->c_proxy)) { - printf("%s", c->c_name); - } else { - for (k=0; k < strlen(c->c_name); k++) { - putchar(' '); - } - } - if (c + lines >= &cmdtab[NCMDS]) { - printf("\n"); - break; - } - w = strlen(c->c_name); - while (w < width) { - w = (w + 8) &~ 7; - putchar('\t'); - } - } - } - return; - } - while (--argc > 0) { - char *arg; - arg = *++argv; - c = getcmd(arg); - if (c == (struct cmd *)-1) - printf("?Ambiguous help command %s\n", arg); - else if (c == (struct cmd *)0) - printf("?Invalid help command %s\n", arg); - else - printf("%-*s\t%s\n", HELPINDENT, - c->c_name, c->c_help); - } -} diff --git a/crypto/heimdal/appl/ftp/ftp/pathnames.h b/crypto/heimdal/appl/ftp/ftp/pathnames.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/pathnames.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)pathnames.h 8.1 (Berkeley) 6/6/93 - */ - -#ifdef HAVE_PATHS_H -#include -#endif - -#define _PATH_TMP_XXX "/tmp/ftpXXXXXX" - -#ifndef _PATH_BSHELL -#define _PATH_BSHELL "/bin/sh" -#endif diff --git a/crypto/heimdal/appl/ftp/ftp/ruserpass.c b/crypto/heimdal/appl/ftp/ftp/ruserpass.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/ruserpass.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright (c) 1985, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftp_locl.h" -RCSID("$Id$"); - -static int token (void); -static FILE *cfile; - -#define DEFAULT 1 -#define LOGIN 2 -#define PASSWD 3 -#define ACCOUNT 4 -#define MACDEF 5 -#define PROT 6 -#define ID 10 -#define MACH 11 - -static char tokval[100]; - -static struct toktab { - char *tokstr; - int tval; -} toktab[]= { - { "default", DEFAULT }, - { "login", LOGIN }, - { "password", PASSWD }, - { "passwd", PASSWD }, - { "account", ACCOUNT }, - { "machine", MACH }, - { "macdef", MACDEF }, - { "prot", PROT }, - { NULL, 0 } -}; - -/* - * Write a copy of the hostname into `hostname, sz' and return a guess - * as to the `domain' of that hostname. - */ - -static char * -guess_domain (char *hostname_str, size_t sz) -{ - struct addrinfo *ai, *a; - struct addrinfo hints; - int error; - char *dot; - - if (gethostname (hostname_str, sz) < 0) { - strlcpy (hostname_str, "", sz); - return ""; - } - dot = strchr (hostname_str, '.'); - if (dot != NULL) - return dot + 1; - - memset (&hints, 0, sizeof(hints)); - hints.ai_flags = AI_CANONNAME; - - error = getaddrinfo (hostname_str, NULL, &hints, &ai); - if (error) - return hostname_str; - - for (a = ai; a != NULL; a = a->ai_next) - if (a->ai_canonname != NULL) { - strlcpy (hostname_str, ai->ai_canonname, sz); - break; - } - freeaddrinfo (ai); - dot = strchr (hostname_str, '.'); - if (dot != NULL) - return dot + 1; - else - return hostname_str; -} - -int -ruserpassword(char *host, char **aname, char **apass, char **aacct) -{ - char *hdir, buf[BUFSIZ], *tmp; - int t, i, c, usedefault = 0; - struct stat stb; - - mydomain = guess_domain (myhostname, MaxHostNameLen); - - hdir = getenv("HOME"); - if (hdir == NULL) - hdir = "."; - snprintf(buf, sizeof(buf), "%s/.netrc", hdir); - cfile = fopen(buf, "r"); - if (cfile == NULL) { - if (errno != ENOENT) - warn("%s", buf); - return (0); - } - -next: - while ((t = token())) switch(t) { - - case DEFAULT: - usedefault = 1; - /* FALL THROUGH */ - - case MACH: - if (!usedefault) { - if (token() != ID) - continue; - /* - * Allow match either for user's input host name - * or official hostname. Also allow match of - * incompletely-specified host in local domain. - */ - if (strcasecmp(host, tokval) == 0) - goto match; - if (strcasecmp(hostname, tokval) == 0) - goto match; - if ((tmp = strchr(hostname, '.')) != NULL && - tmp++ && - strcasecmp(tmp, mydomain) == 0 && - strncasecmp(hostname, tokval, tmp-hostname) == 0 && - tokval[tmp - hostname] == '\0') - goto match; - if ((tmp = strchr(host, '.')) != NULL && - tmp++ && - strcasecmp(tmp, mydomain) == 0 && - strncasecmp(host, tokval, tmp - host) == 0 && - tokval[tmp - host] == '\0') - goto match; - continue; - } - match: - while ((t = token()) && t != MACH && t != DEFAULT) switch(t) { - - case LOGIN: - if (token()) { - if (*aname == 0) { - *aname = strdup(tokval); - } else { - if (strcmp(*aname, tokval)) - goto next; - } - } - break; - case PASSWD: - if ((*aname == NULL || strcmp(*aname, "anonymous")) && - fstat(fileno(cfile), &stb) >= 0 && - (stb.st_mode & 077) != 0) { - warnx("Error: .netrc file is readable by others."); - warnx("Remove password or make file unreadable by others."); - goto bad; - } - if (token() && *apass == 0) { - *apass = strdup(tokval); - } - break; - case ACCOUNT: - if (fstat(fileno(cfile), &stb) >= 0 - && (stb.st_mode & 077) != 0) { - warnx("Error: .netrc file is readable by others."); - warnx("Remove account or make file unreadable by others."); - goto bad; - } - if (token() && *aacct == 0) { - *aacct = strdup(tokval); - } - break; - case MACDEF: - if (proxy) { - fclose(cfile); - return (0); - } - while ((c=getc(cfile)) != EOF && - (c == ' ' || c == '\t')); - if (c == EOF || c == '\n') { - printf("Missing macdef name argument.\n"); - goto bad; - } - if (macnum == 16) { - printf("Limit of 16 macros have already been defined\n"); - goto bad; - } - tmp = macros[macnum].mac_name; - *tmp++ = c; - for (i=0; i < 8 && (c=getc(cfile)) != EOF && - !isspace(c); ++i) { - *tmp++ = c; - } - if (c == EOF) { - printf("Macro definition missing null line terminator.\n"); - goto bad; - } - *tmp = '\0'; - if (c != '\n') { - while ((c=getc(cfile)) != EOF && c != '\n'); - } - if (c == EOF) { - printf("Macro definition missing null line terminator.\n"); - goto bad; - } - if (macnum == 0) { - macros[macnum].mac_start = macbuf; - } - else { - macros[macnum].mac_start = macros[macnum-1].mac_end + 1; - } - tmp = macros[macnum].mac_start; - while (tmp != macbuf + 4096) { - if ((c=getc(cfile)) == EOF) { - printf("Macro definition missing null line terminator.\n"); - goto bad; - } - *tmp = c; - if (*tmp == '\n') { - if (*(tmp-1) == '\0') { - macros[macnum++].mac_end = tmp - 1; - break; - } - *tmp = '\0'; - } - tmp++; - } - if (tmp == macbuf + 4096) { - printf("4K macro buffer exceeded\n"); - goto bad; - } - break; - case PROT: - token(); - if(doencrypt == 0 && sec_request_prot(tokval) < 0) - warnx("Unknown protection level \"%s\"", tokval); - break; - default: - warnx("Unknown .netrc keyword %s", tokval); - break; - } - goto done; - } -done: - fclose(cfile); - return (0); -bad: - fclose(cfile); - return (-1); -} - -static int -token(void) -{ - char *cp; - int c; - struct toktab *t; - - if (feof(cfile) || ferror(cfile)) - return (0); - while ((c = getc(cfile)) != EOF && - (c == '\n' || c == '\t' || c == ' ' || c == ',')) - continue; - if (c == EOF) - return (0); - cp = tokval; - if (c == '"') { - while ((c = getc(cfile)) != EOF && c != '"') { - if (c == '\\') - c = getc(cfile); - *cp++ = c; - } - } else { - *cp++ = c; - while ((c = getc(cfile)) != EOF - && c != '\n' && c != '\t' && c != ' ' && c != ',') { - if (c == '\\') - c = getc(cfile); - *cp++ = c; - } - } - *cp = 0; - if (tokval[0] == 0) - return (0); - for (t = toktab; t->tokstr; t++) - if (!strcmp(t->tokstr, tokval)) - return (t->tval); - return (ID); -} diff --git a/crypto/heimdal/appl/ftp/ftp/security.h b/crypto/heimdal/appl/ftp/ftp/security.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/security.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 1998 - 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifndef __security_h__ -#define __security_h__ - -enum protection_level { - prot_invalid = -1, - prot_clear = 0, - prot_safe = 1, - prot_confidential = 2, - prot_private = 3 -}; - -struct sec_client_mech { - char *name; - size_t size; - int (*init)(void *); - int (*auth)(void *, char*); - void (*end)(void *); - int (*check_prot)(void *, int); - int (*overhead)(void *, int, int); - int (*encode)(void *, void*, int, int, void**); - int (*decode)(void *, void*, int, int); -}; - -struct sec_server_mech { - char *name; - size_t size; - int (*init)(void *); - void (*end)(void *); - int (*check_prot)(void *, int); - int (*overhead)(void *, int, int); - int (*encode)(void *, void*, int, int, void**); - int (*decode)(void *, void*, int, int); - - int (*auth)(void *); - int (*adat)(void *, void*, size_t); - size_t (*pbsz)(void *, size_t); - int (*ccc)(void*); - int (*userok)(void*, char*); - int (*session)(void*, char*); -}; - -#define AUTH_OK 0 -#define AUTH_CONTINUE 1 -#define AUTH_ERROR 2 - -extern int ftp_do_gss_bindings; -extern int ftp_do_gss_delegate; -#ifdef FTP_SERVER -extern struct sec_server_mech krb4_server_mech, gss_server_mech; -#else -extern struct sec_client_mech krb4_client_mech, gss_client_mech; -#endif - -extern int sec_complete; - -#ifdef FTP_SERVER -extern char *ftp_command; -void new_ftp_command(char*); -void delete_ftp_command(void); -#endif - -/* ---- */ - - -int sec_fflush (FILE *); -int sec_fprintf (FILE *, const char *, ...) - __attribute__ ((format (printf, 2,3))); -int sec_getc (FILE *); -int sec_putc (int, FILE *); -int sec_read (int, void *, int); -int sec_read_msg (char *, int); -int sec_vfprintf (FILE *, const char *, va_list) - __attribute__ ((format (printf, 2,0))); -int sec_fprintf2(FILE *f, const char *fmt, ...) - __attribute__ ((format (printf, 2,3))); -int sec_vfprintf2(FILE *, const char *, va_list) - __attribute__ ((format (printf, 2,0))); -int sec_write (int, char *, int); - -#ifdef FTP_SERVER -void adat (char *); -void auth (char *); -void ccc (void); -void mec (char *, enum protection_level); -void pbsz (int); -void prot (char *); -void delete_ftp_command (void); -void new_ftp_command (char *); -int sec_userok (char *); -int sec_session(char *); -int secure_command (void); -enum protection_level get_command_prot(void); -#else -void sec_end (void); -int sec_login (char *); -void sec_prot (int, char **); -void sec_prot_command (int, char **); -int sec_request_prot (char *); -void sec_set_protection_level (void); -void sec_status (void); - -enum protection_level set_command_prot(enum protection_level); - -#endif - -#endif /* __security_h__ */ diff --git a/crypto/heimdal/appl/ftp/ftp/security.c b/crypto/heimdal/appl/ftp/ftp/security.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftp/security.c +++ /dev/null @@ -1,883 +0,0 @@ -/* - * Copyright (c) 1998-2002, 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef FTP_SERVER -#include "ftpd_locl.h" -#else -#include "ftp_locl.h" -#endif - -RCSID("$Id$"); - -static enum protection_level command_prot; -static enum protection_level data_prot; -static size_t buffer_size; - -struct buffer { - void *data; - size_t size; - size_t index; - int eof_flag; -}; - -static struct buffer in_buffer, out_buffer; -int sec_complete; - -static struct { - enum protection_level level; - const char *name; -} level_names[] = { - { prot_clear, "clear" }, - { prot_safe, "safe" }, - { prot_confidential, "confidential" }, - { prot_private, "private" } -}; - -static const char * -level_to_name(enum protection_level level) -{ - int i; - for(i = 0; i < sizeof(level_names) / sizeof(level_names[0]); i++) - if(level_names[i].level == level) - return level_names[i].name; - return "unknown"; -} - -#ifndef FTP_SERVER /* not used in server */ -static enum protection_level -name_to_level(const char *name) -{ - int i; - for(i = 0; i < sizeof(level_names) / sizeof(level_names[0]); i++) - if(!strncasecmp(level_names[i].name, name, strlen(name))) - return level_names[i].level; - return prot_invalid; -} -#endif - -#ifdef FTP_SERVER - -static struct sec_server_mech *mechs[] = { -#ifdef KRB5 - &gss_server_mech, -#endif - NULL -}; - -static struct sec_server_mech *mech; - -#else - -static struct sec_client_mech *mechs[] = { -#ifdef KRB5 - &gss_client_mech, -#endif - NULL -}; - -static struct sec_client_mech *mech; - -#endif - -static void *app_data; - -int -sec_getc(FILE *F) -{ - if(sec_complete && data_prot) { - char c; - if(sec_read(fileno(F), &c, 1) <= 0) - return EOF; - return c; - } else - return getc(F); -} - -static int -block_read(int fd, void *buf, size_t len) -{ - unsigned char *p = buf; - int b; - while(len) { - b = read(fd, p, len); - if (b == 0) - return 0; - else if (b < 0) - return -1; - len -= b; - p += b; - } - return p - (unsigned char*)buf; -} - -static int -block_write(int fd, void *buf, size_t len) -{ - unsigned char *p = buf; - int b; - while(len) { - b = write(fd, p, len); - if(b < 0) - return -1; - len -= b; - p += b; - } - return p - (unsigned char*)buf; -} - -static int -sec_get_data(int fd, struct buffer *buf, int level) -{ - int len; - int b; - void *tmp; - - b = block_read(fd, &len, sizeof(len)); - if (b == 0) - return 0; - else if (b < 0) - return -1; - len = ntohl(len); - tmp = realloc(buf->data, len); - if (tmp == NULL) - return -1; - buf->data = tmp; - b = block_read(fd, buf->data, len); - if (b == 0) - return 0; - else if (b < 0) - return -1; - buf->size = (*mech->decode)(app_data, buf->data, len, data_prot); - buf->index = 0; - return 0; -} - -static size_t -buffer_read(struct buffer *buf, void *dataptr, size_t len) -{ - len = min(len, buf->size - buf->index); - memcpy(dataptr, (char*)buf->data + buf->index, len); - buf->index += len; - return len; -} - -static size_t -buffer_write(struct buffer *buf, void *dataptr, size_t len) -{ - if(buf->index + len > buf->size) { - void *tmp; - if(buf->data == NULL) - tmp = malloc(1024); - else - tmp = realloc(buf->data, buf->index + len); - if(tmp == NULL) - return -1; - buf->data = tmp; - buf->size = buf->index + len; - } - memcpy((char*)buf->data + buf->index, dataptr, len); - buf->index += len; - return len; -} - -int -sec_read(int fd, void *dataptr, int length) -{ - size_t len; - int rx = 0; - - if(sec_complete == 0 || data_prot == 0) - return read(fd, dataptr, length); - - if(in_buffer.eof_flag){ - in_buffer.eof_flag = 0; - return 0; - } - - len = buffer_read(&in_buffer, dataptr, length); - length -= len; - rx += len; - dataptr = (char*)dataptr + len; - - while(length){ - int ret; - - ret = sec_get_data(fd, &in_buffer, data_prot); - if (ret < 0) - return -1; - if(ret == 0 && in_buffer.size == 0) { - if(rx) - in_buffer.eof_flag = 1; - return rx; - } - len = buffer_read(&in_buffer, dataptr, length); - length -= len; - rx += len; - dataptr = (char*)dataptr + len; - } - return rx; -} - -static int -sec_send(int fd, char *from, int length) -{ - int bytes; - void *buf; - bytes = (*mech->encode)(app_data, from, length, data_prot, &buf); - bytes = htonl(bytes); - block_write(fd, &bytes, sizeof(bytes)); - block_write(fd, buf, ntohl(bytes)); - free(buf); - return length; -} - -int -sec_fflush(FILE *F) -{ - if(data_prot != prot_clear) { - if(out_buffer.index > 0){ - sec_write(fileno(F), out_buffer.data, out_buffer.index); - out_buffer.index = 0; - } - sec_send(fileno(F), NULL, 0); - } - fflush(F); - return 0; -} - -int -sec_write(int fd, char *dataptr, int length) -{ - int len = buffer_size; - int tx = 0; - - if(data_prot == prot_clear) - return write(fd, dataptr, length); - - len -= (*mech->overhead)(app_data, data_prot, len); - while(length){ - if(length < len) - len = length; - sec_send(fd, dataptr, len); - length -= len; - dataptr += len; - tx += len; - } - return tx; -} - -int -sec_vfprintf2(FILE *f, const char *fmt, va_list ap) -{ - char *buf; - int ret; - if(data_prot == prot_clear) - return vfprintf(f, fmt, ap); - else { - int len; - len = vasprintf(&buf, fmt, ap); - if (len == -1) - return len; - ret = buffer_write(&out_buffer, buf, len); - free(buf); - return ret; - } -} - -int -sec_fprintf2(FILE *f, const char *fmt, ...) -{ - int ret; - va_list ap; - va_start(ap, fmt); - ret = sec_vfprintf2(f, fmt, ap); - va_end(ap); - return ret; -} - -int -sec_putc(int c, FILE *F) -{ - char ch = c; - if(data_prot == prot_clear) - return putc(c, F); - - buffer_write(&out_buffer, &ch, 1); - if(c == '\n' || out_buffer.index >= 1024 /* XXX */) { - sec_write(fileno(F), out_buffer.data, out_buffer.index); - out_buffer.index = 0; - } - return c; -} - -int -sec_read_msg(char *s, int level) -{ - int len; - char *buf; - int return_code; - - buf = malloc(strlen(s)); - len = base64_decode(s + 4, buf); /* XXX */ - - len = (*mech->decode)(app_data, buf, len, level); - if(len < 0) - return -1; - - buf[len] = '\0'; - - if(buf[3] == '-') - return_code = 0; - else - sscanf(buf, "%d", &return_code); - if(buf[len-1] == '\n') - buf[len-1] = '\0'; - strcpy(s, buf); - free(buf); - return return_code; -} - -int -sec_vfprintf(FILE *f, const char *fmt, va_list ap) -{ - char *buf; - void *enc; - int len; - if(!sec_complete) - return vfprintf(f, fmt, ap); - - if (vasprintf(&buf, fmt, ap) == -1) { - printf("Failed to allocate command.\n"); - return -1; - } - len = (*mech->encode)(app_data, buf, strlen(buf), command_prot, &enc); - free(buf); - if(len < 0) { - printf("Failed to encode command.\n"); - return -1; - } - if(base64_encode(enc, len, &buf) < 0){ - free(enc); - printf("Out of memory base64-encoding.\n"); - return -1; - } - free(enc); -#ifdef FTP_SERVER - if(command_prot == prot_safe) - fprintf(f, "631 %s\r\n", buf); - else if(command_prot == prot_private) - fprintf(f, "632 %s\r\n", buf); - else if(command_prot == prot_confidential) - fprintf(f, "633 %s\r\n", buf); -#else - if(command_prot == prot_safe) - fprintf(f, "MIC %s", buf); - else if(command_prot == prot_private) - fprintf(f, "ENC %s", buf); - else if(command_prot == prot_confidential) - fprintf(f, "CONF %s", buf); -#endif - free(buf); - return 0; -} - -int -sec_fprintf(FILE *f, const char *fmt, ...) -{ - va_list ap; - int ret; - va_start(ap, fmt); - ret = sec_vfprintf(f, fmt, ap); - va_end(ap); - return ret; -} - -/* end common stuff */ - -#ifdef FTP_SERVER - -int ccc_passed; - -void -auth(char *auth_name) -{ - int i; - void *tmp; - - for(i = 0; (mech = mechs[i]) != NULL; i++){ - if(!strcasecmp(auth_name, mech->name)){ - tmp = realloc(app_data, mech->size); - if (tmp == NULL) { - reply(431, "Unable to accept %s at this time", mech->name); - return; - } - app_data = tmp; - - if(mech->init && (*mech->init)(app_data) != 0) { - reply(431, "Unable to accept %s at this time", mech->name); - return; - } - if(mech->auth) { - (*mech->auth)(app_data); - return; - } - if(mech->adat) - reply(334, "Send authorization data."); - else - reply(234, "Authorization complete."); - return; - } - } - free (app_data); - app_data = NULL; - reply(504, "%s is unknown to me", auth_name); -} - -void -adat(char *auth_data) -{ - if(mech && !sec_complete) { - void *buf = malloc(strlen(auth_data)); - size_t len; - len = base64_decode(auth_data, buf); - (*mech->adat)(app_data, buf, len); - free(buf); - } else - reply(503, "You must %sissue an AUTH first.", mech ? "re-" : ""); -} - -void pbsz(int size) -{ - size_t new = size; - if(!sec_complete) - reply(503, "Incomplete security data exchange."); - if(mech->pbsz) - new = (*mech->pbsz)(app_data, size); - if(buffer_size != new){ - buffer_size = size; - } - if(new != size) - reply(200, "PBSZ=%lu", (unsigned long)new); - else - reply(200, "OK"); -} - -void -prot(char *pl) -{ - int p = -1; - - if(buffer_size == 0){ - reply(503, "No protection buffer size negotiated."); - return; - } - - if(!strcasecmp(pl, "C")) - p = prot_clear; - else if(!strcasecmp(pl, "S")) - p = prot_safe; - else if(!strcasecmp(pl, "E")) - p = prot_confidential; - else if(!strcasecmp(pl, "P")) - p = prot_private; - else { - reply(504, "Unrecognized protection level."); - return; - } - - if(sec_complete){ - if((*mech->check_prot)(app_data, p)){ - reply(536, "%s does not support %s protection.", - mech->name, level_to_name(p)); - }else{ - data_prot = (enum protection_level)p; - reply(200, "Data protection is %s.", level_to_name(p)); - } - }else{ - reply(503, "Incomplete security data exchange."); - } -} - -void ccc(void) -{ - if(sec_complete){ - if(mech->ccc && (*mech->ccc)(app_data) == 0) { - command_prot = data_prot = prot_clear; - ccc_passed = 1; - } else - reply(534, "You must be joking."); - }else - reply(503, "Incomplete security data exchange."); -} - -void mec(char *msg, enum protection_level level) -{ - void *buf; - size_t len, buf_size; - if(!sec_complete) { - reply(503, "Incomplete security data exchange."); - return; - } - buf_size = strlen(msg) + 2; - buf = malloc(buf_size); - if (buf == NULL) { - reply(501, "Failed to allocate %lu", (unsigned long)buf_size); - return; - } - len = base64_decode(msg, buf); - command_prot = level; - if(len == (size_t)-1) { - free(buf); - reply(501, "Failed to base64-decode command"); - return; - } - len = (*mech->decode)(app_data, buf, len, level); - if(len == (size_t)-1) { - free(buf); - reply(535, "Failed to decode command"); - return; - } - ((char*)buf)[len] = '\0'; - if(strstr((char*)buf, "\r\n") == NULL) - strlcat((char*)buf, "\r\n", buf_size); - new_ftp_command(buf); -} - -/* ------------------------------------------------------------ */ - -int -sec_userok(char *userstr) -{ - if(sec_complete) - return (*mech->userok)(app_data, userstr); - return 0; -} - -int -sec_session(char *user) -{ - if(sec_complete && mech->session) - return (*mech->session)(app_data, user); - return 0; -} - -char *ftp_command; - -void -new_ftp_command(char *command) -{ - ftp_command = command; -} - -void -delete_ftp_command(void) -{ - free(ftp_command); - ftp_command = NULL; -} - -int -secure_command(void) -{ - return ftp_command != NULL; -} - -enum protection_level -get_command_prot(void) -{ - return command_prot; -} - -#else /* FTP_SERVER */ - -void -sec_status(void) -{ - if(sec_complete){ - printf("Using %s for authentication.\n", mech->name); - printf("Using %s command channel.\n", level_to_name(command_prot)); - printf("Using %s data channel.\n", level_to_name(data_prot)); - if(buffer_size > 0) - printf("Protection buffer size: %lu.\n", - (unsigned long)buffer_size); - }else{ - printf("Not using any security mechanism.\n"); - } -} - -static int -sec_prot_internal(int level) -{ - int ret; - char *p; - unsigned int s = 1048576; - - int old_verbose = verbose; - verbose = 0; - - if(!sec_complete){ - printf("No security data exchange has taken place.\n"); - return -1; - } - - if(level){ - ret = command("PBSZ %u", s); - if(ret != COMPLETE){ - printf("Failed to set protection buffer size.\n"); - return -1; - } - buffer_size = s; - p = strstr(reply_string, "PBSZ="); - if(p) - sscanf(p, "PBSZ=%u", &s); - if(s < buffer_size) - buffer_size = s; - } - verbose = old_verbose; - ret = command("PROT %c", level["CSEP"]); /* XXX :-) */ - if(ret != COMPLETE){ - printf("Failed to set protection level.\n"); - return -1; - } - - data_prot = (enum protection_level)level; - return 0; -} - -enum protection_level -set_command_prot(enum protection_level level) -{ - int ret; - enum protection_level old = command_prot; - if(level != command_prot && level == prot_clear) { - ret = command("CCC"); - if(ret != COMPLETE) { - printf("Failed to clear command channel.\n"); - return prot_invalid; - } - } - command_prot = level; - return old; -} - -void -sec_prot(int argc, char **argv) -{ - int level = -1; - - if(argc > 3) - goto usage; - - if(argc == 1) { - sec_status(); - return; - } - if(!sec_complete) { - printf("No security data exchange has taken place.\n"); - code = -1; - return; - } - level = name_to_level(argv[argc - 1]); - - if(level == -1) - goto usage; - - if((*mech->check_prot)(app_data, level)) { - printf("%s does not implement %s protection.\n", - mech->name, level_to_name(level)); - code = -1; - return; - } - - if(argc == 2 || strncasecmp(argv[1], "data", strlen(argv[1])) == 0) { - if(sec_prot_internal(level) < 0){ - code = -1; - return; - } - } else if(strncasecmp(argv[1], "command", strlen(argv[1])) == 0) { - if(set_command_prot(level) < 0) { - code = -1; - return; - } - } else - goto usage; - code = 0; - return; - usage: - printf("usage: %s [command|data] [clear|safe|confidential|private]\n", - argv[0]); - code = -1; -} - -void -sec_prot_command(int argc, char **argv) -{ - int level; - - if(argc > 2) - goto usage; - - if(!sec_complete) { - printf("No security data exchange has taken place.\n"); - code = -1; - return; - } - - if(argc == 1) { - sec_status(); - } else { - level = name_to_level(argv[1]); - if(level == -1) - goto usage; - - if((*mech->check_prot)(app_data, level)) { - printf("%s does not implement %s protection.\n", - mech->name, level_to_name(level)); - code = -1; - return; - } - if(set_command_prot(level) < 0) { - code = -1; - return; - } - } - code = 0; - return; - usage: - printf("usage: %s [clear|safe|confidential|private]\n", - argv[0]); - code = -1; -} - -static enum protection_level request_data_prot; - -void -sec_set_protection_level(void) -{ - if(sec_complete && data_prot != request_data_prot) - sec_prot_internal(request_data_prot); -} - - -int -sec_request_prot(char *level) -{ - int l = name_to_level(level); - if(l == -1) - return -1; - request_data_prot = (enum protection_level)l; - return 0; -} - -int -sec_login(char *host) -{ - int ret; - struct sec_client_mech **m; - int old_verbose = verbose; - - verbose = -1; /* shut up all messages this will produce (they - are usually not very user friendly) */ - - for(m = mechs; *m && (*m)->name; m++) { - void *tmp; - - tmp = realloc(app_data, (*m)->size); - if (tmp == NULL) { - warnx ("realloc %lu failed", (unsigned long)(*m)->size); - return -1; - } - app_data = tmp; - - if((*m)->init && (*(*m)->init)(app_data) != 0) { - printf("Skipping %s...\n", (*m)->name); - continue; - } - printf("Trying %s...\n", (*m)->name); - ret = command("AUTH %s", (*m)->name); - if(ret != CONTINUE){ - if(code == 504){ - printf("%s is not supported by the server.\n", (*m)->name); - }else if(code == 534){ - printf("%s rejected as security mechanism.\n", (*m)->name); - }else if(ret == ERROR) { - printf("The server doesn't support the FTP " - "security extensions.\n"); - verbose = old_verbose; - return -1; - } - continue; - } - - ret = (*(*m)->auth)(app_data, host); - - if(ret == AUTH_CONTINUE) - continue; - else if(ret != AUTH_OK){ - /* mechanism is supposed to output error string */ - verbose = old_verbose; - return -1; - } - mech = *m; - sec_complete = 1; - if(doencrypt) { - command_prot = prot_private; - request_data_prot = prot_private; - } else { - command_prot = prot_safe; - } - break; - } - - verbose = old_verbose; - return *m == NULL; -} - -void -sec_end(void) -{ - if (mech != NULL) { - if(mech->end) - (*mech->end)(app_data); - if (app_data != NULL) { - memset(app_data, 0, mech->size); - free(app_data); - app_data = NULL; - } - } - sec_complete = 0; - data_prot = (enum protection_level)0; -} - -#endif /* FTP_SERVER */ - diff --git a/crypto/heimdal/appl/ftp/ftpd/Makefile.am b/crypto/heimdal/appl/ftp/ftpd/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/Makefile.am +++ /dev/null @@ -1,54 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += -I$(srcdir)/../common $(INCLUDE_krb4) -DFTP_SERVER - -libexec_PROGRAMS = ftpd - -CHECK_LOCAL = - -if KRB5 -krb5_sources = gssapi.c gss_userok.c -endif - -ftpd_SOURCES = \ - extern.h \ - ftpcmd.y \ - ftpd.c \ - ftpd_locl.h \ - logwtmp.c \ - ls.c \ - pathnames.h \ - popen.c \ - security.c \ - kauth.c \ - klist.c \ - $(krb4_sources) \ - $(krb5_sources) - -EXTRA_ftpd_SOURCES = kauth.c gssapi.c gss_userok.c - -$(ftpd_OBJECTS): security.h - -security.c: - @test -f security.c || $(LN_S) $(srcdir)/../ftp/security.c . -security.h: - @test -f security.h || $(LN_S) $(srcdir)/../ftp/security.h . -gssapi.c: - @test -f gssapi.c || $(LN_S) $(srcdir)/../ftp/gssapi.c . - -CLEANFILES = security.c security.h gssapi.c - -man_MANS = ftpd.8 ftpusers.5 - -LDADD = ../common/libcommon.a \ - $(LIB_otp) \ - $(LIB_gssapi) \ - $(LIB_krb5) \ - $(LIB_kafs) \ - $(LIB_krb4) \ - $(LIB_hcrypto) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) diff --git a/crypto/heimdal/appl/ftp/ftpd/Makefile.in b/crypto/heimdal/appl/ftp/ftpd/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/Makefile.in +++ /dev/null @@ -1,1055 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ftpcmd.c -libexec_PROGRAMS = ftpd$(EXEEXT) -subdir = appl/ftp/ftpd -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(man5dir)" \ - "$(DESTDIR)$(man8dir)" -PROGRAMS = $(libexec_PROGRAMS) -am__ftpd_SOURCES_DIST = extern.h ftpcmd.y ftpd.c ftpd_locl.h logwtmp.c \ - ls.c pathnames.h popen.c security.c kauth.c klist.c gssapi.c \ - gss_userok.c -@KRB5_TRUE@am__objects_1 = gssapi.$(OBJEXT) gss_userok.$(OBJEXT) -am_ftpd_OBJECTS = ftpcmd.$(OBJEXT) ftpd.$(OBJEXT) logwtmp.$(OBJEXT) \ - ls.$(OBJEXT) popen.$(OBJEXT) security.$(OBJEXT) \ - kauth.$(OBJEXT) klist.$(OBJEXT) $(am__objects_1) -ftpd_OBJECTS = $(am_ftpd_OBJECTS) -ftpd_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -am__DEPENDENCIES_2 = $(top_builddir)/lib/kafs/libkafs.la \ - $(am__DEPENDENCIES_1) -ftpd_DEPENDENCIES = ../common/libcommon.a $(am__DEPENDENCIES_1) \ - $(LIB_gssapi) $(LIB_krb5) $(am__DEPENDENCIES_2) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) -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 $@ -@MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) -YLWRAP = $(top_srcdir)/ylwrap -SOURCES = $(ftpd_SOURCES) $(EXTRA_ftpd_SOURCES) -DIST_SOURCES = $(am__ftpd_SOURCES_DIST) $(EXTRA_ftpd_SOURCES) -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' -man5dir = $(mandir)/man5 -man8dir = $(mandir)/man8 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/../common $(INCLUDE_krb4) \ - -DFTP_SERVER -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -CHECK_LOCAL = -@KRB5_TRUE@krb5_sources = gssapi.c gss_userok.c -ftpd_SOURCES = \ - extern.h \ - ftpcmd.y \ - ftpd.c \ - ftpd_locl.h \ - logwtmp.c \ - ls.c \ - pathnames.h \ - popen.c \ - security.c \ - kauth.c \ - klist.c \ - $(krb4_sources) \ - $(krb5_sources) - -EXTRA_ftpd_SOURCES = kauth.c gssapi.c gss_userok.c -CLEANFILES = security.c security.h gssapi.c -man_MANS = ftpd.8 ftpusers.5 -LDADD = ../common/libcommon.a \ - $(LIB_otp) \ - $(LIB_gssapi) \ - $(LIB_krb5) \ - $(LIB_kafs) \ - $(LIB_krb4) \ - $(LIB_hcrypto) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj .y -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/ftp/ftpd/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/ftp/ftpd/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-libexecPROGRAMS: $(libexec_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ - 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)$(libexecdir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-libexecPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || 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)$(libexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libexecdir)" && rm -f $$files - -clean-libexecPROGRAMS: - @list='$(libexec_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 -ftpd$(EXEEXT): $(ftpd_OBJECTS) $(ftpd_DEPENDENCIES) - @rm -f ftpd$(EXEEXT) - $(LINK) $(ftpd_OBJECTS) $(ftpd_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftpcmd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ftpd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gss_userok.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssapi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kauth.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/klist.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logwtmp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ls.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/popen.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/security.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 $@ $< - -.y.c: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-man5: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" - @list=''; test -n "$(man5dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ - } | 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,^[^5][0-9a-z]*$$,5,;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)$(man5dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$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)$(man5dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ - done; } - -uninstall-man5: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man5dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man5dir)" && rm -f $$files; } -install-man8: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | 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,^[^8][0-9a-z]*$$,8,;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)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$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)$(man8dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ - done; } - -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man8dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)"; 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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -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." - -rm -f ftpcmd.c -clean: clean-am - -clean-am: clean-generic clean-libexecPROGRAMS 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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-libexecPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man5 install-man8 - -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-libexecPROGRAMS uninstall-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man5 uninstall-man8 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libexecPROGRAMS clean-libtool ctags \ - dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ - install-html-am install-info install-info-am \ - install-libexecPROGRAMS install-man install-man5 install-man8 \ - 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-hook \ - uninstall-libexecPROGRAMS uninstall-man uninstall-man5 \ - uninstall-man8 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -$(ftpd_OBJECTS): security.h - -security.c: - @test -f security.c || $(LN_S) $(srcdir)/../ftp/security.c . -security.h: - @test -f security.h || $(LN_S) $(srcdir)/../ftp/security.h . -gssapi.c: - @test -f gssapi.c || $(LN_S) $(srcdir)/../ftp/gssapi.c . - -# 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: diff --git a/crypto/heimdal/appl/ftp/ftpd/extern.h b/crypto/heimdal/appl/ftp/ftpd/extern.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/extern.h +++ /dev/null @@ -1,150 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)extern.h 8.2 (Berkeley) 4/4/94 - */ - -#ifndef _EXTERN_H_ -#define _EXTERN_H_ - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif - -#include -#include -#ifdef HAVE_PWD_H -#include -#endif - -#ifdef HAVE_LIMITS_H -#include -#endif - -#ifndef NBBY -#define NBBY CHAR_BIT -#endif - -void abor(void); -void blkfree(char **); -char **copyblk(char **); -void cwd(const char *); -void do_delete(char *); -void dologout(int); -void eprt(char *); -void epsv(char *); -void fatal(char *); -int filename_check(char *); -int ftpd_pclose(FILE *); -FILE *ftpd_popen(char *, char *, int, int); -char *ftpd_getline(char *, int); -void ftpd_logwtmp(char *, char *, char *); -void lreply(int, const char *, ...) - __attribute__ ((format (printf, 2, 3))); -void makedir(char *); -void nack(char *); -void nreply(const char *, ...) - __attribute__ ((format (printf, 1, 2))); -void pass(char *); -void pasv(void); -void perror_reply(int, const char *); -void pwd(void); -void removedir(char *); -void renamecmd(char *, char *); -char *renamefrom(char *); -void reply(int, const char *, ...) - __attribute__ ((format (printf, 2, 3))); -void retrieve(const char *, char *); -void send_file_list(char *); -void setproctitle(const char *, ...) - __attribute__ ((format (printf, 1, 2))); -void statcmd(void); -void statfilecmd(char *); -void do_store(char *, char *, int); -void upper(char *); -void user(char *); -void yyerror(char *); - -void list_file(char*); - -void kauth(char *, char*); -void klist(void); -void cond_kdestroy(void); -void kdestroy(void); -void krbtkfile(const char *tkfile); -void afslog(const char *, int); -void afsunlog(void); - -extern int do_destroy_tickets; -extern char *k5ccname; - -int find(char *); - -int builtin_ls(FILE*, const char*); - -int do_login(int code, char *passwd); -int klogin(char *name, char *password); - -const char *ftp_rooted(const char *path); - -extern struct sockaddr *ctrl_addr, *his_addr; -extern char hostname[]; - -extern struct sockaddr *data_dest; -extern int logged_in; -extern struct passwd *pw; -extern int guest; -extern int dochroot; -extern int logging; -extern int type; -extern off_t file_size; -extern off_t byte_count; -extern int ccc_passed; - -extern int form; -extern int debug; -extern int ftpd_timeout; -extern int maxtimeout; -extern int pdata; -extern char hostname[], remotehost[]; -extern char proctitle[]; -extern int usedefault; -extern char tmpline[]; -extern int paranoid; - -#endif /* _EXTERN_H_ */ diff --git a/crypto/heimdal/appl/ftp/ftpd/ftpcmd.c b/crypto/heimdal/appl/ftp/ftpd/ftpcmd.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/ftpcmd.c +++ /dev/null @@ -1,3532 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.3. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - 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, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.3" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - A = 258, - B = 259, - C = 260, - E = 261, - F = 262, - I = 263, - L = 264, - N = 265, - P = 266, - R = 267, - S = 268, - T = 269, - SP = 270, - CRLF = 271, - COMMA = 272, - USER = 273, - PASS = 274, - ACCT = 275, - REIN = 276, - QUIT = 277, - PORT = 278, - PASV = 279, - TYPE = 280, - STRU = 281, - MODE = 282, - RETR = 283, - STOR = 284, - APPE = 285, - MLFL = 286, - MAIL = 287, - MSND = 288, - MSOM = 289, - MSAM = 290, - MRSQ = 291, - MRCP = 292, - ALLO = 293, - REST = 294, - RNFR = 295, - RNTO = 296, - ABOR = 297, - DELE = 298, - CWD = 299, - LIST = 300, - NLST = 301, - SITE = 302, - sTAT = 303, - HELP = 304, - NOOP = 305, - MKD = 306, - RMD = 307, - PWD = 308, - CDUP = 309, - STOU = 310, - SMNT = 311, - SYST = 312, - SIZE = 313, - MDTM = 314, - EPRT = 315, - EPSV = 316, - UMASK = 317, - IDLE = 318, - CHMOD = 319, - AUTH = 320, - ADAT = 321, - PROT = 322, - PBSZ = 323, - CCC = 324, - MIC = 325, - CONF = 326, - ENC = 327, - KAUTH = 328, - KLIST = 329, - KDESTROY = 330, - KRBTKFILE = 331, - AFSLOG = 332, - LOCATE = 333, - URL = 334, - FEAT = 335, - OPTS = 336, - LEXERR = 337, - STRING = 338, - NUMBER = 339 - }; -#endif -/* Tokens. */ -#define A 258 -#define B 259 -#define C 260 -#define E 261 -#define F 262 -#define I 263 -#define L 264 -#define N 265 -#define P 266 -#define R 267 -#define S 268 -#define T 269 -#define SP 270 -#define CRLF 271 -#define COMMA 272 -#define USER 273 -#define PASS 274 -#define ACCT 275 -#define REIN 276 -#define QUIT 277 -#define PORT 278 -#define PASV 279 -#define TYPE 280 -#define STRU 281 -#define MODE 282 -#define RETR 283 -#define STOR 284 -#define APPE 285 -#define MLFL 286 -#define MAIL 287 -#define MSND 288 -#define MSOM 289 -#define MSAM 290 -#define MRSQ 291 -#define MRCP 292 -#define ALLO 293 -#define REST 294 -#define RNFR 295 -#define RNTO 296 -#define ABOR 297 -#define DELE 298 -#define CWD 299 -#define LIST 300 -#define NLST 301 -#define SITE 302 -#define sTAT 303 -#define HELP 304 -#define NOOP 305 -#define MKD 306 -#define RMD 307 -#define PWD 308 -#define CDUP 309 -#define STOU 310 -#define SMNT 311 -#define SYST 312 -#define SIZE 313 -#define MDTM 314 -#define EPRT 315 -#define EPSV 316 -#define UMASK 317 -#define IDLE 318 -#define CHMOD 319 -#define AUTH 320 -#define ADAT 321 -#define PROT 322 -#define PBSZ 323 -#define CCC 324 -#define MIC 325 -#define CONF 326 -#define ENC 327 -#define KAUTH 328 -#define KLIST 329 -#define KDESTROY 330 -#define KRBTKFILE 331 -#define AFSLOG 332 -#define LOCATE 333 -#define URL 334 -#define FEAT 335 -#define OPTS 336 -#define LEXERR 337 -#define STRING 338 -#define NUMBER 339 - - - - -/* Copy the first part of user declarations. */ -#line 43 "ftpcmd.y" - - -#include "ftpd_locl.h" -RCSID("$Id$"); - -off_t restart_point; - -static int hasyyerrored; - - -static int cmd_type; -static int cmd_form; -static int cmd_bytesz; -char cbuf[64*1024]; -char *fromname; - -struct tab { - char *name; - short token; - short state; - short implemented; /* 1 if command is implemented */ - char *help; -}; - -extern struct tab cmdtab[]; -extern struct tab sitetab[]; - -static char *copy (char *); -static void help (struct tab *, char *); -static struct tab * - lookup (struct tab *, char *); -static void sizecmd (char *); -static RETSIGTYPE toolong (int); -static int yylex (void); - -/* This is for bison */ - -#if !defined(alloca) && !defined(HAVE_ALLOCA) -#define alloca(x) malloc(x) -#endif - - - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 86 "ftpcmd.y" -{ - int i; - char *s; -} -/* Line 193 of yacc.c. */ -#line 312 "ftpcmd.c" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -# define YYSTYPE_IS_TRIVIAL 1 -#endif - - - -/* Copy the second part of user declarations. */ - - -/* Line 216 of yacc.c. */ -#line 325 "ftpcmd.c" - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) -#else -static int -YYID (i) - int i; -#endif -{ - return i; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss; - YYSTYPE yyvs; - }; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 2 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 327 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 85 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 18 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 98 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 317 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 339 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, - 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, - 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 4, 7, 10, 16, 22, 28, 34, - 38, 42, 48, 54, 60, 66, 72, 82, 88, 94, - 100, 104, 110, 114, 120, 126, 130, 136, 142, 146, - 150, 156, 160, 166, 170, 176, 182, 186, 190, 194, - 200, 206, 214, 220, 228, 238, 244, 252, 260, 266, - 272, 280, 286, 294, 302, 308, 314, 318, 324, 330, - 334, 337, 343, 349, 354, 359, 365, 371, 375, 380, - 385, 390, 392, 393, 395, 397, 409, 411, 413, 415, - 417, 421, 423, 427, 429, 431, 435, 438, 440, 442, - 444, 446, 448, 450, 452, 454, 456, 458, 460 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 86, 0, -1, -1, 86, 87, -1, 86, 88, -1, - 18, 15, 89, 16, 102, -1, 19, 15, 90, 16, - 102, -1, 23, 15, 92, 16, 102, -1, 60, 15, - 83, 16, 102, -1, 24, 16, 101, -1, 61, 16, - 101, -1, 61, 15, 83, 16, 101, -1, 25, 15, - 94, 16, 102, -1, 26, 15, 95, 16, 102, -1, - 27, 15, 96, 16, 102, -1, 38, 15, 84, 16, - 102, -1, 38, 15, 84, 15, 12, 15, 84, 16, - 102, -1, 28, 15, 97, 16, 101, -1, 29, 15, - 97, 16, 101, -1, 30, 15, 97, 16, 101, -1, - 46, 16, 101, -1, 46, 15, 83, 16, 101, -1, - 45, 16, 101, -1, 45, 15, 97, 16, 101, -1, - 48, 15, 97, 16, 101, -1, 48, 16, 102, -1, - 43, 15, 97, 16, 100, -1, 41, 15, 97, 16, - 100, -1, 42, 16, 102, -1, 44, 16, 101, -1, - 44, 15, 97, 16, 101, -1, 49, 16, 102, -1, - 49, 15, 83, 16, 102, -1, 50, 16, 102, -1, - 51, 15, 97, 16, 101, -1, 52, 15, 97, 16, - 100, -1, 53, 16, 101, -1, 54, 16, 101, -1, - 80, 16, 102, -1, 81, 15, 83, 16, 102, -1, - 47, 15, 49, 16, 102, -1, 47, 15, 49, 15, - 83, 16, 102, -1, 47, 15, 62, 16, 101, -1, - 47, 15, 62, 15, 99, 16, 100, -1, 47, 15, - 64, 15, 99, 15, 97, 16, 100, -1, 47, 15, - 63, 16, 102, -1, 47, 15, 63, 15, 84, 16, - 102, -1, 47, 15, 73, 15, 83, 16, 101, -1, - 47, 15, 74, 16, 101, -1, 47, 15, 75, 16, - 101, -1, 47, 15, 76, 15, 83, 16, 101, -1, - 47, 15, 77, 16, 101, -1, 47, 15, 77, 15, - 83, 16, 101, -1, 47, 15, 78, 15, 83, 16, - 101, -1, 47, 15, 79, 16, 102, -1, 55, 15, - 97, 16, 101, -1, 57, 16, 102, -1, 58, 15, - 97, 16, 101, -1, 59, 15, 97, 16, 101, -1, - 22, 16, 102, -1, 1, 16, -1, 40, 15, 97, - 16, 100, -1, 39, 15, 91, 16, 102, -1, 65, - 15, 83, 16, -1, 66, 15, 83, 16, -1, 68, - 15, 84, 16, 102, -1, 67, 15, 83, 16, 102, - -1, 69, 16, 102, -1, 70, 15, 83, 16, -1, - 71, 15, 83, 16, -1, 72, 15, 83, 16, -1, - 83, -1, -1, 83, -1, 84, -1, 84, 17, 84, - 17, 84, 17, 84, 17, 84, 17, 84, -1, 10, - -1, 14, -1, 5, -1, 3, -1, 3, 15, 93, - -1, 6, -1, 6, 15, 93, -1, 8, -1, 9, - -1, 9, 15, 91, -1, 9, 91, -1, 7, -1, - 12, -1, 11, -1, 13, -1, 4, -1, 5, -1, - 98, -1, 83, -1, 84, -1, 101, -1, 102, -1, - -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 129, 129, 131, 136, 140, 146, 154, 175, 181, - 186, 191, 197, 234, 248, 262, 268, 274, 283, 292, - 301, 306, 315, 320, 326, 333, 338, 345, 359, 364, - 373, 380, 385, 402, 407, 414, 421, 426, 431, 441, - 448, 453, 458, 466, 479, 493, 500, 517, 521, 526, - 530, 534, 545, 558, 565, 570, 577, 595, 612, 640, - 647, 653, 663, 673, 678, 683, 688, 693, 698, 703, - 708, 716, 721, 724, 728, 732, 745, 749, 753, 760, - 765, 770, 775, 780, 784, 789, 795, 803, 807, 811, - 818, 822, 826, 833, 861, 865, 891, 899, 910 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "A", "B", "C", "E", "F", "I", "L", "N", - "P", "R", "S", "T", "SP", "CRLF", "COMMA", "USER", "PASS", "ACCT", - "REIN", "QUIT", "PORT", "PASV", "TYPE", "STRU", "MODE", "RETR", "STOR", - "APPE", "MLFL", "MAIL", "MSND", "MSOM", "MSAM", "MRSQ", "MRCP", "ALLO", - "REST", "RNFR", "RNTO", "ABOR", "DELE", "CWD", "LIST", "NLST", "SITE", - "sTAT", "HELP", "NOOP", "MKD", "RMD", "PWD", "CDUP", "STOU", "SMNT", - "SYST", "SIZE", "MDTM", "EPRT", "EPSV", "UMASK", "IDLE", "CHMOD", "AUTH", - "ADAT", "PROT", "PBSZ", "CCC", "MIC", "CONF", "ENC", "KAUTH", "KLIST", - "KDESTROY", "KRBTKFILE", "AFSLOG", "LOCATE", "URL", "FEAT", "OPTS", - "LEXERR", "STRING", "NUMBER", "$accept", "cmd_list", "cmd", "rcmd", - "username", "password", "byte_size", "host_port", "form_code", - "type_code", "struct_code", "mode_code", "pathname", "pathstring", - "octal_number", "check_login_no_guest", "check_login", "check_secure", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 85, 86, 86, 86, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 89, 90, 90, 91, 92, 93, 93, 93, 94, - 94, 94, 94, 94, 94, 94, 94, 95, 95, 95, - 96, 96, 96, 97, 98, 99, 100, 101, 102 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 0, 2, 2, 5, 5, 5, 5, 3, - 3, 5, 5, 5, 5, 5, 9, 5, 5, 5, - 3, 5, 3, 5, 5, 3, 5, 5, 3, 3, - 5, 3, 5, 3, 5, 5, 3, 3, 3, 5, - 5, 7, 5, 7, 9, 5, 7, 7, 5, 5, - 7, 5, 7, 7, 5, 5, 3, 5, 5, 3, - 2, 5, 5, 4, 4, 5, 5, 3, 4, 4, - 4, 1, 0, 1, 1, 11, 1, 1, 1, 1, - 3, 1, 3, 1, 1, 3, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, - 60, 0, 72, 98, 0, 98, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 98, 0, 0, 98, - 0, 98, 0, 98, 0, 0, 98, 0, 98, 98, - 0, 0, 98, 98, 0, 98, 0, 0, 0, 0, - 98, 0, 0, 0, 0, 98, 0, 0, 0, 98, - 0, 71, 0, 73, 0, 59, 0, 0, 9, 97, - 79, 81, 83, 84, 0, 87, 89, 88, 0, 91, - 92, 90, 0, 94, 0, 93, 0, 0, 0, 74, - 0, 0, 0, 28, 0, 0, 29, 0, 22, 0, - 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 25, 0, 31, 33, 0, 0, 36, - 37, 0, 56, 0, 0, 0, 0, 10, 0, 0, - 0, 0, 67, 0, 0, 0, 38, 0, 98, 98, - 0, 98, 0, 0, 0, 86, 98, 98, 98, 98, - 98, 98, 0, 98, 98, 98, 98, 98, 98, 98, - 98, 0, 98, 0, 98, 0, 98, 0, 0, 98, - 98, 0, 0, 98, 0, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 63, 64, 98, 98, 68, - 69, 70, 98, 5, 6, 0, 7, 78, 76, 77, - 80, 82, 85, 12, 13, 14, 17, 18, 19, 0, - 15, 62, 61, 96, 27, 26, 30, 23, 21, 0, - 40, 95, 0, 42, 0, 45, 0, 0, 48, 49, - 0, 0, 51, 0, 54, 24, 32, 34, 35, 55, - 57, 58, 8, 11, 66, 65, 39, 0, 0, 98, - 98, 98, 0, 98, 98, 98, 98, 0, 0, 41, - 43, 46, 0, 47, 50, 52, 53, 0, 98, 98, - 0, 16, 44, 0, 0, 0, 75 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 1, 48, 49, 102, 104, 130, 107, 240, 114, - 118, 122, 124, 125, 262, 252, 253, 109 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -196 -static const yytype_int16 yypact[] = -{ - -196, 246, -196, 3, 13, 20, 11, 24, 21, 26, - 30, 45, 66, 67, 68, 69, 70, 71, 72, 76, - 73, -7, -5, 15, 78, 28, 32, 80, 79, 82, - 83, 91, 93, 94, 96, 97, 98, 38, 100, 101, - 102, 103, 104, 106, 107, 108, 111, 109, -196, -196, - -196, -66, 36, -196, 14, -196, 12, 22, 1, 46, - 46, 46, 25, 48, 46, 46, -196, 46, 46, -196, - 46, -196, 53, -196, 27, 46, -196, 55, -196, -196, - 46, 46, -196, -196, 46, -196, 46, 46, 56, 59, - -196, 60, 61, 62, 63, -196, 65, 77, 85, -196, - 86, -196, 114, -196, 115, -196, 120, 130, -196, -196, - 135, 136, -196, -11, 138, -196, -196, -196, 139, -196, - -196, -196, 143, -196, 145, -196, 147, 156, 47, -196, - 157, 162, 165, -196, 166, 168, -196, 170, -196, 174, - -196, 49, 52, 54, 137, 177, 178, 179, 181, 64, - 182, 183, 184, -196, 185, -196, -196, 186, 187, -196, - -196, 188, -196, 189, 190, 191, 192, -196, 193, 194, - 195, 196, -196, 197, 198, 199, -196, 200, -196, -196, - 133, -196, 2, 2, 48, -196, -196, -196, -196, -196, - -196, -196, 206, -196, -196, -196, -196, -196, -196, -196, - -196, 110, -196, 140, -196, 141, -196, 140, 144, -196, - -196, 146, 148, -196, 149, -196, -196, -196, -196, -196, - -196, -196, -196, -196, -196, -196, -196, -196, -196, -196, - -196, -196, -196, -196, -196, 202, -196, -196, -196, -196, - -196, -196, -196, -196, -196, -196, -196, -196, -196, 205, - -196, -196, -196, -196, -196, -196, -196, -196, -196, 207, - -196, -196, 210, -196, 212, -196, 215, 217, -196, -196, - 218, 219, -196, 221, -196, -196, -196, -196, -196, -196, - -196, -196, -196, -196, -196, -196, -196, 155, 158, -196, - -196, -196, 46, -196, -196, -196, -196, 204, 224, -196, - -196, -196, 225, -196, -196, -196, -196, 159, -196, -196, - 227, -196, -196, 161, 231, 167, -196 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -196, -196, -196, -196, -196, -196, -110, -196, 39, -196, - -196, -196, -9, -196, 42, -195, -33, -53 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 -static const yytype_uint16 yytable[] = -{ - 105, 254, 255, 185, 184, 119, 120, 237, 68, 69, - 70, 71, 238, 133, 121, 110, 239, 101, 111, 50, - 112, 113, 108, 153, 278, 155, 156, 53, 51, 115, - 72, 73, 162, 116, 117, 52, 136, 55, 138, 54, - 140, 56, 172, 75, 76, 57, 176, 77, 78, 159, - 160, 126, 127, 89, 90, 131, 132, 167, 134, 135, - 58, 137, 192, 193, 201, 202, 152, 203, 204, 205, - 206, 157, 158, 129, 242, 161, 141, 163, 164, 212, - 213, 59, 60, 61, 62, 63, 64, 65, 67, 142, - 143, 144, 66, 74, 80, 300, 79, 81, 106, 82, - 145, 146, 147, 148, 149, 150, 151, 83, 84, 128, - 85, 86, 87, 88, 312, 91, 92, 93, 94, 103, - 95, 96, 97, 98, 100, 233, 234, 99, 236, 123, - 178, 179, 129, 243, 244, 245, 139, 180, 154, 165, - 250, 251, 166, 168, 169, 170, 181, 171, 173, 260, - 182, 183, 207, 265, 186, 187, 246, 247, 248, 188, - 174, 189, 274, 190, 276, 256, 257, 258, 175, 177, - 282, 263, 191, 194, 284, 285, 268, 269, 195, 286, - 272, 196, 197, 275, 198, 277, 199, 279, 280, 281, - 200, 283, 208, 259, 209, 210, 211, 214, 0, 215, - 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, - 226, 227, 228, 229, 230, 231, 232, 235, 249, 287, - 288, 307, 241, 289, 261, 264, 290, 267, 291, 270, - 292, 271, 273, 293, 294, 295, 299, 296, 301, 297, - 308, 309, 298, 310, 313, 314, 2, 3, 315, 266, - 0, 316, 0, 0, 0, 311, 0, 0, 0, 0, - 303, 304, 305, 306, 4, 5, 0, 0, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 0, 0, 0, - 0, 0, 0, 302, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 0, 33, 34, 35, 36, 37, 0, 0, - 0, 38, 39, 40, 41, 42, 43, 44, 45, 0, - 0, 0, 0, 0, 0, 0, 46, 47 -}; - -static const yytype_int16 yycheck[] = -{ - 53, 196, 197, 113, 15, 4, 5, 5, 15, 16, - 15, 16, 10, 66, 13, 3, 14, 83, 6, 16, - 8, 9, 55, 76, 219, 78, 79, 16, 15, 7, - 15, 16, 85, 11, 12, 15, 69, 16, 71, 15, - 73, 15, 95, 15, 16, 15, 99, 15, 16, 82, - 83, 60, 61, 15, 16, 64, 65, 90, 67, 68, - 15, 70, 15, 16, 15, 16, 75, 15, 16, 15, - 16, 80, 81, 84, 184, 84, 49, 86, 87, 15, - 16, 15, 15, 15, 15, 15, 15, 15, 15, 62, - 63, 64, 16, 15, 15, 290, 16, 15, 84, 16, - 73, 74, 75, 76, 77, 78, 79, 16, 15, 84, - 16, 15, 15, 15, 309, 15, 15, 15, 15, 83, - 16, 15, 15, 15, 15, 178, 179, 16, 181, 83, - 16, 16, 84, 186, 187, 188, 83, 17, 83, 83, - 193, 194, 83, 83, 83, 83, 16, 84, 83, 202, - 15, 15, 15, 206, 16, 16, 189, 190, 191, 16, - 83, 16, 215, 16, 217, 198, 199, 200, 83, 83, - 223, 204, 16, 16, 227, 228, 209, 210, 16, 232, - 213, 16, 16, 216, 16, 218, 16, 220, 221, 222, - 16, 224, 15, 83, 16, 16, 15, 15, -1, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 84, 12, 17, - 15, 17, 183, 16, 84, 84, 16, 83, 16, 83, - 15, 83, 83, 16, 16, 16, 289, 16, 291, 84, - 16, 16, 84, 84, 17, 84, 0, 1, 17, 207, - -1, 84, -1, -1, -1, 308, -1, -1, -1, -1, - 293, 294, 295, 296, 18, 19, -1, -1, 22, 23, - 24, 25, 26, 27, 28, 29, 30, -1, -1, -1, - -1, -1, -1, 292, 38, 39, 40, 41, 42, 43, - 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - 54, 55, -1, 57, 58, 59, 60, 61, -1, -1, - -1, 65, 66, 67, 68, 69, 70, 71, 72, -1, - -1, -1, -1, -1, -1, -1, 80, 81 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 86, 0, 1, 18, 19, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 57, 58, 59, 60, 61, 65, 66, - 67, 68, 69, 70, 71, 72, 80, 81, 87, 88, - 16, 15, 15, 16, 15, 16, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 16, 15, 15, 16, - 15, 16, 15, 16, 15, 15, 16, 15, 16, 16, - 15, 15, 16, 16, 15, 16, 15, 15, 15, 15, - 16, 15, 15, 15, 15, 16, 15, 15, 15, 16, - 15, 83, 89, 83, 90, 102, 84, 92, 101, 102, - 3, 6, 8, 9, 94, 7, 11, 12, 95, 4, - 5, 13, 96, 83, 97, 98, 97, 97, 84, 84, - 91, 97, 97, 102, 97, 97, 101, 97, 101, 83, - 101, 49, 62, 63, 64, 73, 74, 75, 76, 77, - 78, 79, 97, 102, 83, 102, 102, 97, 97, 101, - 101, 97, 102, 97, 97, 83, 83, 101, 83, 83, - 83, 84, 102, 83, 83, 83, 102, 83, 16, 16, - 17, 16, 15, 15, 15, 91, 16, 16, 16, 16, - 16, 16, 15, 16, 16, 16, 16, 16, 16, 16, - 16, 15, 16, 15, 16, 15, 16, 15, 15, 16, - 16, 15, 15, 16, 15, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 102, 102, 84, 102, 5, 10, 14, - 93, 93, 91, 102, 102, 102, 101, 101, 101, 12, - 102, 102, 100, 101, 100, 100, 101, 101, 101, 83, - 102, 84, 99, 101, 84, 102, 99, 83, 101, 101, - 83, 83, 101, 83, 102, 101, 102, 101, 100, 101, - 101, 101, 102, 101, 102, 102, 102, 17, 15, 16, - 16, 16, 15, 16, 16, 16, 16, 84, 84, 102, - 100, 102, 97, 101, 101, 101, 101, 17, 16, 16, - 84, 102, 100, 17, 84, 17, 84 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else -static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - - -/* Prevent warnings from -Wmissing-prototypes. */ - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - - -/* The look-ahead symbol. */ -int yychar; - -/* The semantic value of the look-ahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*----------. -| yyparse. | -`----------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; - - - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - YYSIZE_T yystacksize = YYINITDEPTH; - - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to look-ahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a look-ahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - if (yyn == YYFINAL) - YYACCEPT; - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 3: -#line 132 "ftpcmd.y" - { - fromname = (char *) 0; - restart_point = (off_t) 0; - } - break; - - case 5: -#line 141 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - user((yyvsp[(3) - (5)].s)); - free((yyvsp[(3) - (5)].s)); - } - break; - - case 6: -#line 147 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - pass((yyvsp[(3) - (5)].s)); - memset ((yyvsp[(3) - (5)].s), 0, strlen((yyvsp[(3) - (5)].s))); - free((yyvsp[(3) - (5)].s)); - } - break; - - case 7: -#line 155 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - if (paranoid && - (data_dest->sa_family != his_addr->sa_family || - (socket_get_port(data_dest) < IPPORT_RESERVED) || - memcmp(socket_get_address(data_dest), - socket_get_address(his_addr), - socket_addr_size(his_addr)) != 0)) { - usedefault = 1; - reply(500, "Illegal PORT range rejected."); - } else { - usedefault = 0; - if (pdata >= 0) { - close(pdata); - pdata = -1; - } - reply(200, "PORT command successful."); - } - } - } - break; - - case 8: -#line 176 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - eprt ((yyvsp[(3) - (5)].s)); - free ((yyvsp[(3) - (5)].s)); - } - break; - - case 9: -#line 182 "ftpcmd.y" - { - if((yyvsp[(3) - (3)].i)) - pasv (); - } - break; - - case 10: -#line 187 "ftpcmd.y" - { - if((yyvsp[(3) - (3)].i)) - epsv (NULL); - } - break; - - case 11: -#line 192 "ftpcmd.y" - { - if((yyvsp[(5) - (5)].i)) - epsv ((yyvsp[(3) - (5)].s)); - free ((yyvsp[(3) - (5)].s)); - } - break; - - case 12: -#line 198 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - switch (cmd_type) { - - case TYPE_A: - if (cmd_form == FORM_N) { - reply(200, "Type set to A."); - type = cmd_type; - form = cmd_form; - } else - reply(504, "Form must be N."); - break; - - case TYPE_E: - reply(504, "Type E not implemented."); - break; - - case TYPE_I: - reply(200, "Type set to I."); - type = cmd_type; - break; - - case TYPE_L: -#if NBBY == 8 - if (cmd_bytesz == 8) { - reply(200, - "Type set to L (byte size 8)."); - type = cmd_type; - } else - reply(504, "Byte size must be 8."); -#else /* NBBY == 8 */ - UNIMPLEMENTED for NBBY != 8 -#endif /* NBBY == 8 */ - } - } - } - break; - - case 13: -#line 235 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - switch ((yyvsp[(3) - (5)].i)) { - - case STRU_F: - reply(200, "STRU F ok."); - break; - - default: - reply(504, "Unimplemented STRU type."); - } - } - } - break; - - case 14: -#line 249 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - switch ((yyvsp[(3) - (5)].i)) { - - case MODE_S: - reply(200, "MODE S ok."); - break; - - default: - reply(502, "Unimplemented MODE type."); - } - } - } - break; - - case 15: -#line 263 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - reply(202, "ALLO command ignored."); - } - } - break; - - case 16: -#line 269 "ftpcmd.y" - { - if ((yyvsp[(9) - (9)].i)) { - reply(202, "ALLO command ignored."); - } - } - break; - - case 17: -#line 275 "ftpcmd.y" - { - char *name = (yyvsp[(3) - (5)].s); - - if ((yyvsp[(5) - (5)].i) && name != NULL) - retrieve(0, name); - if (name != NULL) - free(name); - } - break; - - case 18: -#line 284 "ftpcmd.y" - { - char *name = (yyvsp[(3) - (5)].s); - - if ((yyvsp[(5) - (5)].i) && name != NULL) - do_store(name, "w", 0); - if (name != NULL) - free(name); - } - break; - - case 19: -#line 293 "ftpcmd.y" - { - char *name = (yyvsp[(3) - (5)].s); - - if ((yyvsp[(5) - (5)].i) && name != NULL) - do_store(name, "a", 0); - if (name != NULL) - free(name); - } - break; - - case 20: -#line 302 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - send_file_list("."); - } - break; - - case 21: -#line 307 "ftpcmd.y" - { - char *name = (yyvsp[(3) - (5)].s); - - if ((yyvsp[(5) - (5)].i) && name != NULL) - send_file_list(name); - if (name != NULL) - free(name); - } - break; - - case 22: -#line 316 "ftpcmd.y" - { - if((yyvsp[(3) - (3)].i)) - list_file("."); - } - break; - - case 23: -#line 321 "ftpcmd.y" - { - if((yyvsp[(5) - (5)].i)) - list_file((yyvsp[(3) - (5)].s)); - free((yyvsp[(3) - (5)].s)); - } - break; - - case 24: -#line 327 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) - statfilecmd((yyvsp[(3) - (5)].s)); - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 25: -#line 334 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - statcmd(); - } - break; - - case 26: -#line 339 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) - do_delete((yyvsp[(3) - (5)].s)); - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 27: -#line 346 "ftpcmd.y" - { - if((yyvsp[(5) - (5)].i)){ - if (fromname) { - renamecmd(fromname, (yyvsp[(3) - (5)].s)); - free(fromname); - fromname = (char *) 0; - } else { - reply(503, "Bad sequence of commands."); - } - } - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 28: -#line 360 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - reply(225, "ABOR command successful."); - } - break; - - case 29: -#line 365 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) { - const char *path = pw->pw_dir; - if (dochroot || guest) - path = "/"; - cwd(path); - } - } - break; - - case 30: -#line 374 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) - cwd((yyvsp[(3) - (5)].s)); - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 31: -#line 381 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - help(cmdtab, (char *) 0); - } - break; - - case 32: -#line 386 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - char *cp = (yyvsp[(3) - (5)].s); - - if (strncasecmp(cp, "SITE", 4) == 0) { - cp = (yyvsp[(3) - (5)].s) + 4; - if (*cp == ' ') - cp++; - if (*cp) - help(sitetab, cp); - else - help(sitetab, (char *) 0); - } else - help(cmdtab, (yyvsp[(3) - (5)].s)); - } - } - break; - - case 33: -#line 403 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - reply(200, "NOOP command successful."); - } - break; - - case 34: -#line 408 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) - makedir((yyvsp[(3) - (5)].s)); - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 35: -#line 415 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) - removedir((yyvsp[(3) - (5)].s)); - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 36: -#line 422 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - pwd(); - } - break; - - case 37: -#line 427 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - cwd(".."); - } - break; - - case 38: -#line 432 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) { - lreply(211, "Supported features:"); - lreply(0, " MDTM"); - lreply(0, " REST STREAM"); - lreply(0, " SIZE"); - reply(211, "End"); - } - } - break; - - case 39: -#line 442 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - reply(501, "Bad options"); - free ((yyvsp[(3) - (5)].s)); - } - break; - - case 40: -#line 449 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - help(sitetab, (char *) 0); - } - break; - - case 41: -#line 454 "ftpcmd.y" - { - if ((yyvsp[(7) - (7)].i)) - help(sitetab, (yyvsp[(5) - (7)].s)); - } - break; - - case 42: -#line 459 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - int oldmask = umask(0); - umask(oldmask); - reply(200, "Current UMASK is %03o", oldmask); - } - } - break; - - case 43: -#line 467 "ftpcmd.y" - { - if ((yyvsp[(7) - (7)].i)) { - if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) { - reply(501, "Bad UMASK value"); - } else { - int oldmask = umask((yyvsp[(5) - (7)].i)); - reply(200, - "UMASK set to %03o (was %03o)", - (yyvsp[(5) - (7)].i), oldmask); - } - } - } - break; - - case 44: -#line 480 "ftpcmd.y" - { - if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) { - if ((yyvsp[(5) - (9)].i) > 0777) - reply(501, - "CHMOD: Mode value must be between 0 and 0777"); - else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0) - perror_reply(550, (yyvsp[(7) - (9)].s)); - else - reply(200, "CHMOD command successful."); - } - if ((yyvsp[(7) - (9)].s) != NULL) - free((yyvsp[(7) - (9)].s)); - } - break; - - case 45: -#line 494 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - reply(200, - "Current IDLE time limit is %d seconds; max %d", - ftpd_timeout, maxtimeout); - } - break; - - case 46: -#line 501 "ftpcmd.y" - { - if ((yyvsp[(7) - (7)].i)) { - if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) { - reply(501, - "Maximum IDLE time must be between 30 and %d seconds", - maxtimeout); - } else { - ftpd_timeout = (yyvsp[(5) - (7)].i); - alarm((unsigned) ftpd_timeout); - reply(200, - "Maximum IDLE time set to %d seconds", - ftpd_timeout); - } - } - } - break; - - case 47: -#line 518 "ftpcmd.y" - { - reply(500, "Command not implemented."); - } - break; - - case 48: -#line 522 "ftpcmd.y" - { - if((yyvsp[(5) - (5)].i)) - klist(); - } - break; - - case 49: -#line 527 "ftpcmd.y" - { - reply(500, "Command not implemented."); - } - break; - - case 50: -#line 531 "ftpcmd.y" - { - reply(500, "Command not implemented."); - } - break; - - case 51: -#line 535 "ftpcmd.y" - { -#if defined(KRB5) - if(guest) - reply(500, "Can't be done as guest."); - else if((yyvsp[(5) - (5)].i)) - afslog(NULL, 0); -#else - reply(500, "Command not implemented."); -#endif - } - break; - - case 52: -#line 546 "ftpcmd.y" - { -#if defined(KRB5) - if(guest) - reply(500, "Can't be done as guest."); - else if((yyvsp[(7) - (7)].i)) - afslog((yyvsp[(5) - (7)].s), 0); - if((yyvsp[(5) - (7)].s)) - free((yyvsp[(5) - (7)].s)); -#else - reply(500, "Command not implemented."); -#endif - } - break; - - case 53: -#line 559 "ftpcmd.y" - { - if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL) - find((yyvsp[(5) - (7)].s)); - if((yyvsp[(5) - (7)].s) != NULL) - free((yyvsp[(5) - (7)].s)); - } - break; - - case 54: -#line 566 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - reply(200, "http://www.pdc.kth.se/heimdal/"); - } - break; - - case 55: -#line 571 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) - do_store((yyvsp[(3) - (5)].s), "w", 1); - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 56: -#line 578 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) { -#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) - reply(215, "UNIX Type: L%d", NBBY); -#else - reply(215, "UNKNOWN Type: L%d", NBBY); -#endif - } - } - break; - - case 57: -#line 596 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) - sizecmd((yyvsp[(3) - (5)].s)); - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 58: -#line 613 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) { - struct stat stbuf; - if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0) - reply(550, "%s: %s", - (yyvsp[(3) - (5)].s), strerror(errno)); - else if (!S_ISREG(stbuf.st_mode)) { - reply(550, - "%s: not a plain file.", (yyvsp[(3) - (5)].s)); - } else { - struct tm *t; - time_t mtime = stbuf.st_mtime; - - t = gmtime(&mtime); - reply(213, - "%04d%02d%02d%02d%02d%02d", - t->tm_year + 1900, - t->tm_mon + 1, - t->tm_mday, - t->tm_hour, - t->tm_min, - t->tm_sec); - } - } - if ((yyvsp[(3) - (5)].s) != NULL) - free((yyvsp[(3) - (5)].s)); - } - break; - - case 59: -#line 641 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) { - reply(221, "Goodbye."); - dologout(0); - } - } - break; - - case 60: -#line 648 "ftpcmd.y" - { - yyerrok; - } - break; - - case 61: -#line 654 "ftpcmd.y" - { - restart_point = (off_t) 0; - if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) { - fromname = renamefrom((yyvsp[(3) - (5)].s)); - if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) { - free((yyvsp[(3) - (5)].s)); - } - } - } - break; - - case 62: -#line 664 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) { - fromname = (char *) 0; - restart_point = (yyvsp[(3) - (5)].i); /* XXX $3 is only "int" */ - reply(350, "Restarting at %ld. %s", - (long)restart_point, - "Send STORE or RETRIEVE to initiate transfer."); - } - } - break; - - case 63: -#line 674 "ftpcmd.y" - { - auth((yyvsp[(3) - (4)].s)); - free((yyvsp[(3) - (4)].s)); - } - break; - - case 64: -#line 679 "ftpcmd.y" - { - adat((yyvsp[(3) - (4)].s)); - free((yyvsp[(3) - (4)].s)); - } - break; - - case 65: -#line 684 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - pbsz((yyvsp[(3) - (5)].i)); - } - break; - - case 66: -#line 689 "ftpcmd.y" - { - if ((yyvsp[(5) - (5)].i)) - prot((yyvsp[(3) - (5)].s)); - } - break; - - case 67: -#line 694 "ftpcmd.y" - { - if ((yyvsp[(3) - (3)].i)) - ccc(); - } - break; - - case 68: -#line 699 "ftpcmd.y" - { - mec((yyvsp[(3) - (4)].s), prot_safe); - free((yyvsp[(3) - (4)].s)); - } - break; - - case 69: -#line 704 "ftpcmd.y" - { - mec((yyvsp[(3) - (4)].s), prot_confidential); - free((yyvsp[(3) - (4)].s)); - } - break; - - case 70: -#line 709 "ftpcmd.y" - { - mec((yyvsp[(3) - (4)].s), prot_private); - free((yyvsp[(3) - (4)].s)); - } - break; - - case 72: -#line 721 "ftpcmd.y" - { - (yyval.s) = (char *)calloc(1, sizeof(char)); - } - break; - - case 75: -#line 734 "ftpcmd.y" - { - struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest; - - sin4->sin_family = AF_INET; - sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i)); - sin4->sin_addr.s_addr = - htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i)); - } - break; - - case 76: -#line 746 "ftpcmd.y" - { - (yyval.i) = FORM_N; - } - break; - - case 77: -#line 750 "ftpcmd.y" - { - (yyval.i) = FORM_T; - } - break; - - case 78: -#line 754 "ftpcmd.y" - { - (yyval.i) = FORM_C; - } - break; - - case 79: -#line 761 "ftpcmd.y" - { - cmd_type = TYPE_A; - cmd_form = FORM_N; - } - break; - - case 80: -#line 766 "ftpcmd.y" - { - cmd_type = TYPE_A; - cmd_form = (yyvsp[(3) - (3)].i); - } - break; - - case 81: -#line 771 "ftpcmd.y" - { - cmd_type = TYPE_E; - cmd_form = FORM_N; - } - break; - - case 82: -#line 776 "ftpcmd.y" - { - cmd_type = TYPE_E; - cmd_form = (yyvsp[(3) - (3)].i); - } - break; - - case 83: -#line 781 "ftpcmd.y" - { - cmd_type = TYPE_I; - } - break; - - case 84: -#line 785 "ftpcmd.y" - { - cmd_type = TYPE_L; - cmd_bytesz = NBBY; - } - break; - - case 85: -#line 790 "ftpcmd.y" - { - cmd_type = TYPE_L; - cmd_bytesz = (yyvsp[(3) - (3)].i); - } - break; - - case 86: -#line 796 "ftpcmd.y" - { - cmd_type = TYPE_L; - cmd_bytesz = (yyvsp[(2) - (2)].i); - } - break; - - case 87: -#line 804 "ftpcmd.y" - { - (yyval.i) = STRU_F; - } - break; - - case 88: -#line 808 "ftpcmd.y" - { - (yyval.i) = STRU_R; - } - break; - - case 89: -#line 812 "ftpcmd.y" - { - (yyval.i) = STRU_P; - } - break; - - case 90: -#line 819 "ftpcmd.y" - { - (yyval.i) = MODE_S; - } - break; - - case 91: -#line 823 "ftpcmd.y" - { - (yyval.i) = MODE_B; - } - break; - - case 92: -#line 827 "ftpcmd.y" - { - (yyval.i) = MODE_C; - } - break; - - case 93: -#line 834 "ftpcmd.y" - { - /* - * Problem: this production is used for all pathname - * processing, but only gives a 550 error reply. - * This is a valid reply in some cases but not in others. - */ - if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') { - glob_t gl; - int flags = - GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; - - memset(&gl, 0, sizeof(gl)); - if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) || - gl.gl_pathc == 0) { - reply(550, "not found"); - (yyval.s) = NULL; - } else { - (yyval.s) = strdup(gl.gl_pathv[0]); - } - globfree(&gl); - free((yyvsp[(1) - (1)].s)); - } else - (yyval.s) = (yyvsp[(1) - (1)].s); - } - break; - - case 95: -#line 866 "ftpcmd.y" - { - int ret, dec, multby, digit; - - /* - * Convert a number that was read as decimal number - * to what it would be if it had been read as octal. - */ - dec = (yyvsp[(1) - (1)].i); - multby = 1; - ret = 0; - while (dec) { - digit = dec%10; - if (digit > 7) { - ret = -1; - break; - } - ret += digit * multby; - multby *= 8; - dec /= 10; - } - (yyval.i) = ret; - } - break; - - case 96: -#line 892 "ftpcmd.y" - { - (yyval.i) = (yyvsp[(1) - (1)].i) && !guest; - if((yyvsp[(1) - (1)].i) && !(yyval.i)) - reply(550, "Permission denied"); - } - break; - - case 97: -#line 900 "ftpcmd.y" - { - if((yyvsp[(1) - (1)].i)) { - if(((yyval.i) = logged_in) == 0) - reply(530, "Please login with USER and PASS."); - } else - (yyval.i) = 0; - } - break; - - case 98: -#line 910 "ftpcmd.y" - { - (yyval.i) = 1; - if(sec_complete && !ccc_passed && !secure_command()) { - (yyval.i) = 0; - reply(533, "Command protection level denied " - "for paranoid reasons."); - } - } - break; - - -/* Line 1267 of yacc.c. */ -#line 2759 "ftpcmd.c" - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse look-ahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - if (yyn == YYFINAL) - YYACCEPT; - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - -#line 920 "ftpcmd.y" - - -#define CMD 0 /* beginning of command */ -#define ARGS 1 /* expect miscellaneous arguments */ -#define STR1 2 /* expect SP followed by STRING */ -#define STR2 3 /* expect STRING */ -#define OSTR 4 /* optional SP then STRING */ -#define ZSTR1 5 /* SP then optional STRING */ -#define ZSTR2 6 /* optional STRING after SP */ -#define SITECMD 7 /* SITE command */ -#define NSTR 8 /* Number followed by a string */ - -struct tab cmdtab[] = { /* In order defined in RFC 765 */ - { "USER", USER, STR1, 1, " username" }, - { "PASS", PASS, ZSTR1, 1, " password" }, - { "ACCT", ACCT, STR1, 0, "(specify account)" }, - { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, - { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, - { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, - { "PORT", PORT, ARGS, 1, " b0, b1, b2, b3, b4" }, - { "EPRT", EPRT, STR1, 1, " string" }, - { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, - { "EPSV", EPSV, OSTR, 1, "[ foo]" }, - { "TYPE", TYPE, ARGS, 1, " [ A | E | I | L ]" }, - { "STRU", STRU, ARGS, 1, "(specify file structure)" }, - { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, - { "RETR", RETR, STR1, 1, " file-name" }, - { "STOR", STOR, STR1, 1, " file-name" }, - { "APPE", APPE, STR1, 1, " file-name" }, - { "MLFL", MLFL, OSTR, 0, "(mail file)" }, - { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, - { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, - { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, - { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, - { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, - { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, - { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, - { "REST", REST, ARGS, 1, " offset (restart command)" }, - { "RNFR", RNFR, STR1, 1, " file-name" }, - { "RNTO", RNTO, STR1, 1, " file-name" }, - { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, - { "DELE", DELE, STR1, 1, " file-name" }, - { "CWD", CWD, OSTR, 1, "[ directory-name ]" }, - { "XCWD", CWD, OSTR, 1, "[ directory-name ]" }, - { "LIST", LIST, OSTR, 1, "[ path-name ]" }, - { "NLST", NLST, OSTR, 1, "[ path-name ]" }, - { "SITE", SITE, SITECMD, 1, "site-cmd [ arguments ]" }, - { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, - { "STAT", sTAT, OSTR, 1, "[ path-name ]" }, - { "HELP", HELP, OSTR, 1, "[ ]" }, - { "NOOP", NOOP, ARGS, 1, "" }, - { "MKD", MKD, STR1, 1, " path-name" }, - { "XMKD", MKD, STR1, 1, " path-name" }, - { "RMD", RMD, STR1, 1, " path-name" }, - { "XRMD", RMD, STR1, 1, " path-name" }, - { "PWD", PWD, ARGS, 1, "(return current directory)" }, - { "XPWD", PWD, ARGS, 1, "(return current directory)" }, - { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, - { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, - { "STOU", STOU, STR1, 1, " file-name" }, - { "SIZE", SIZE, OSTR, 1, " path-name" }, - { "MDTM", MDTM, OSTR, 1, " path-name" }, - - /* extensions from RFC2228 */ - { "AUTH", AUTH, STR1, 1, " auth-type" }, - { "ADAT", ADAT, STR1, 1, " auth-data" }, - { "PBSZ", PBSZ, ARGS, 1, " buffer-size" }, - { "PROT", PROT, STR1, 1, " prot-level" }, - { "CCC", CCC, ARGS, 1, "" }, - { "MIC", MIC, STR1, 1, " integrity command" }, - { "CONF", CONF, STR1, 1, " confidentiality command" }, - { "ENC", ENC, STR1, 1, " privacy command" }, - - /* RFC2389 */ - { "FEAT", FEAT, ARGS, 1, "" }, - { "OPTS", OPTS, ARGS, 1, " command [ options]" }, - - { NULL, 0, 0, 0, 0 } -}; - -struct tab sitetab[] = { - { "UMASK", UMASK, ARGS, 1, "[ umask ]" }, - { "IDLE", IDLE, ARGS, 1, "[ maximum-idle-time ]" }, - { "CHMOD", CHMOD, NSTR, 1, " mode file-name" }, - { "HELP", HELP, OSTR, 1, "[ ]" }, - - { "KAUTH", KAUTH, STR1, 1, " principal [ ticket ]" }, - { "KLIST", KLIST, ARGS, 1, "(show ticket file)" }, - { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" }, - { "KRBTKFILE", KRBTKFILE, STR1, 1, " ticket-file" }, - { "AFSLOG", AFSLOG, OSTR, 1, "[ cell]" }, - - { "LOCATE", LOCATE, STR1, 1, " globexpr" }, - { "FIND", LOCATE, STR1, 1, " globexpr" }, - - { "URL", URL, ARGS, 1, "?" }, - - { NULL, 0, 0, 0, 0 } -}; - -static struct tab * -lookup(struct tab *p, char *cmd) -{ - - for (; p->name != NULL; p++) - if (strcmp(cmd, p->name) == 0) - return (p); - return (0); -} - -/* - * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes. - */ -char * -ftpd_getline(char *s, int n) -{ - int c; - char *cs; - - cs = s; - - /* might still be data within the security MIC/CONF/ENC */ - if(ftp_command){ - strlcpy(s, ftp_command, n); - if (debug) - syslog(LOG_DEBUG, "command: %s", s); - return s; - } - while ((c = getc(stdin)) != EOF) { - c &= 0377; - if (c == IAC) { - if ((c = getc(stdin)) != EOF) { - c &= 0377; - switch (c) { - case WILL: - case WONT: - c = getc(stdin); - printf("%c%c%c", IAC, DONT, 0377&c); - fflush(stdout); - continue; - case DO: - case DONT: - c = getc(stdin); - printf("%c%c%c", IAC, WONT, 0377&c); - fflush(stdout); - continue; - case IAC: - break; - default: - continue; /* ignore command */ - } - } - } - *cs++ = c; - if (--n <= 0 || c == '\n') - break; - } - if (c == EOF && cs == s) - return (NULL); - *cs++ = '\0'; - if (debug) { - if (!guest && strncasecmp("pass ", s, 5) == 0) { - /* Don't syslog passwords */ - syslog(LOG_DEBUG, "command: %.5s ???", s); - } else { - char *cp; - int len; - - /* Don't syslog trailing CR-LF */ - len = strlen(s); - cp = s + len - 1; - while (cp >= s && (*cp == '\n' || *cp == '\r')) { - --cp; - --len; - } - syslog(LOG_DEBUG, "command: %.*s", len, s); - } - } -#ifdef XXX - fprintf(stderr, "%s\n", s); -#endif - return (s); -} - -static RETSIGTYPE -toolong(int signo) -{ - - reply(421, - "Timeout (%d seconds): closing control connection.", - ftpd_timeout); - if (logging) - syslog(LOG_INFO, "User %s timed out after %d seconds", - (pw ? pw -> pw_name : "unknown"), ftpd_timeout); - dologout(1); - SIGRETURN(0); -} - -static int -yylex(void) -{ - static int cpos, state; - char *cp, *cp2; - struct tab *p; - int n; - char c; - - for (;;) { - switch (state) { - - case CMD: - hasyyerrored = 0; - - signal(SIGALRM, toolong); - alarm((unsigned) ftpd_timeout); - if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) { - reply(221, "You could at least say goodbye."); - dologout(0); - } - alarm(0); -#ifdef HAVE_SETPROCTITLE - if (strncasecmp(cbuf, "PASS", 4) != 0) - setproctitle("%s: %s", proctitle, cbuf); -#endif /* HAVE_SETPROCTITLE */ - if ((cp = strchr(cbuf, '\r'))) { - *cp++ = '\n'; - *cp = '\0'; - } - if ((cp = strpbrk(cbuf, " \n"))) - cpos = cp - cbuf; - if (cpos == 0) - cpos = 4; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - strupr(cbuf); - p = lookup(cmdtab, cbuf); - cbuf[cpos] = c; - if (p != 0) { - if (p->implemented == 0) { - nack(p->name); - hasyyerrored = 1; - break; - } - state = p->state; - yylval.s = p->name; - return (p->token); - } - break; - - case SITECMD: - if (cbuf[cpos] == ' ') { - cpos++; - return (SP); - } - cp = &cbuf[cpos]; - if ((cp2 = strpbrk(cp, " \n"))) - cpos = cp2 - cbuf; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - strupr(cp); - p = lookup(sitetab, cp); - cbuf[cpos] = c; - if (p != 0) { - if (p->implemented == 0) { - state = CMD; - nack(p->name); - hasyyerrored = 1; - break; - } - state = p->state; - yylval.s = p->name; - return (p->token); - } - state = CMD; - break; - - case OSTR: - if (cbuf[cpos] == '\n') { - state = CMD; - return (CRLF); - } - /* FALLTHROUGH */ - - case STR1: - case ZSTR1: - dostr1: - if (cbuf[cpos] == ' ') { - cpos++; - if(state == OSTR) - state = STR2; - else - state++; - return (SP); - } - break; - - case ZSTR2: - if (cbuf[cpos] == '\n') { - state = CMD; - return (CRLF); - } - /* FALLTHROUGH */ - - case STR2: - cp = &cbuf[cpos]; - n = strlen(cp); - cpos += n - 1; - /* - * Make sure the string is nonempty and \n terminated. - */ - if (n > 1 && cbuf[cpos] == '\n') { - cbuf[cpos] = '\0'; - yylval.s = copy(cp); - cbuf[cpos] = '\n'; - state = ARGS; - return (STRING); - } - break; - - case NSTR: - if (cbuf[cpos] == ' ') { - cpos++; - return (SP); - } - if (isdigit((unsigned char)cbuf[cpos])) { - cp = &cbuf[cpos]; - while (isdigit((unsigned char)cbuf[++cpos])) - ; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - yylval.i = atoi(cp); - cbuf[cpos] = c; - state = STR1; - return (NUMBER); - } - state = STR1; - goto dostr1; - - case ARGS: - if (isdigit((unsigned char)cbuf[cpos])) { - cp = &cbuf[cpos]; - while (isdigit((unsigned char)cbuf[++cpos])) - ; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - yylval.i = atoi(cp); - cbuf[cpos] = c; - return (NUMBER); - } - switch (cbuf[cpos++]) { - - case '\n': - state = CMD; - return (CRLF); - - case ' ': - return (SP); - - case ',': - return (COMMA); - - case 'A': - case 'a': - return (A); - - case 'B': - case 'b': - return (B); - - case 'C': - case 'c': - return (C); - - case 'E': - case 'e': - return (E); - - case 'F': - case 'f': - return (F); - - case 'I': - case 'i': - return (I); - - case 'L': - case 'l': - return (L); - - case 'N': - case 'n': - return (N); - - case 'P': - case 'p': - return (P); - - case 'R': - case 'r': - return (R); - - case 'S': - case 's': - return (S); - - case 'T': - case 't': - return (T); - - } - break; - - default: - fatal("Unknown state in scanner."); - } - yyerror(NULL); - state = CMD; - return (0); - } -} - -/* ARGSUSED */ -void -yyerror(char *s) -{ - char *cp; - - if (hasyyerrored) - return; - - if ((cp = strchr(cbuf,'\n'))) - *cp = '\0'; - reply(500, "'%s': command not understood.", cbuf); - hasyyerrored = 1; -} - -static char * -copy(char *s) -{ - char *p; - - p = strdup(s); - if (p == NULL) - fatal("Ran out of memory."); - return p; -} - -static void -help(struct tab *ctab, char *s) -{ - struct tab *c; - int width, NCMDS; - char *t; - char buf[1024]; - - if (ctab == sitetab) - t = "SITE "; - else - t = ""; - width = 0, NCMDS = 0; - for (c = ctab; c->name != NULL; c++) { - int len = strlen(c->name); - - if (len > width) - width = len; - NCMDS++; - } - width = (width + 8) &~ 7; - if (s == 0) { - int i, j, w; - int columns, lines; - - lreply(214, "The following %scommands are recognized %s.", - t, "(* =>'s unimplemented)"); - columns = 76 / width; - if (columns == 0) - columns = 1; - lines = (NCMDS + columns - 1) / columns; - for (i = 0; i < lines; i++) { - strlcpy (buf, " ", sizeof(buf)); - for (j = 0; j < columns; j++) { - c = ctab + j * lines + i; - snprintf (buf + strlen(buf), - sizeof(buf) - strlen(buf), - "%s%c", - c->name, - c->implemented ? ' ' : '*'); - if (c + lines >= &ctab[NCMDS]) - break; - w = strlen(c->name) + 1; - while (w < width) { - strlcat (buf, - " ", - sizeof(buf)); - w++; - } - } - lreply(214, "%s", buf); - } - reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se"); - return; - } - strupr(s); - c = lookup(ctab, s); - if (c == (struct tab *)0) { - reply(502, "Unknown command %s.", s); - return; - } - if (c->implemented) - reply(214, "Syntax: %s%s %s", t, c->name, c->help); - else - reply(214, "%s%-*s\t%s; unimplemented.", t, width, - c->name, c->help); -} - -static void -sizecmd(char *filename) -{ - switch (type) { - case TYPE_L: - case TYPE_I: { - struct stat stbuf; - if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) - reply(550, "%s: not a plain file.", filename); - else - reply(213, "%lu", (unsigned long)stbuf.st_size); - break; - } - case TYPE_A: { - FILE *fin; - int c; - size_t count; - struct stat stbuf; - fin = fopen(filename, "r"); - if (fin == NULL) { - perror_reply(550, filename); - return; - } - if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) { - reply(550, "%s: not a plain file.", filename); - fclose(fin); - return; - } - - count = 0; - while((c=getc(fin)) != EOF) { - if (c == '\n') /* will get expanded to \r\n */ - count++; - count++; - } - fclose(fin); - - reply(213, "%lu", (unsigned long)count); - break; - } - default: - reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); - } -} - diff --git a/crypto/heimdal/appl/ftp/ftpd/ftpcmd.y b/crypto/heimdal/appl/ftp/ftpd/ftpcmd.y deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/ftpcmd.y +++ /dev/null @@ -1,1478 +0,0 @@ -/* $NetBSD: ftpcmd.y,v 1.6 1995/06/03 22:46:45 mycroft Exp $ */ - -/* - * Copyright (c) 1985, 1988, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ftpcmd.y 8.3 (Berkeley) 4/6/94 - */ - -/* - * Grammar for FTP commands. - * See RFC 959. - */ - -%{ - -#include "ftpd_locl.h" -RCSID("$Id$"); - -off_t restart_point; - -static int hasyyerrored; - - -static int cmd_type; -static int cmd_form; -static int cmd_bytesz; -char cbuf[64*1024]; -char *fromname; - -struct tab { - char *name; - short token; - short state; - short implemented; /* 1 if command is implemented */ - char *help; -}; - -extern struct tab cmdtab[]; -extern struct tab sitetab[]; - -static char *copy (char *); -static void help (struct tab *, char *); -static struct tab * - lookup (struct tab *, char *); -static void sizecmd (char *); -static RETSIGTYPE toolong (int); -static int yylex (void); - -/* This is for bison */ - -#if !defined(alloca) && !defined(HAVE_ALLOCA) -#define alloca(x) malloc(x) -#endif - -%} - -%union { - int i; - char *s; -} - -%token - A B C E F I - L N P R S T - - SP CRLF COMMA - - USER PASS ACCT REIN QUIT PORT - PASV TYPE STRU MODE RETR STOR - APPE MLFL MAIL MSND MSOM MSAM - MRSQ MRCP ALLO REST RNFR RNTO - ABOR DELE CWD LIST NLST SITE - sTAT HELP NOOP MKD RMD PWD - CDUP STOU SMNT SYST SIZE MDTM - EPRT EPSV - - UMASK IDLE CHMOD - - AUTH ADAT PROT PBSZ CCC MIC - CONF ENC - - KAUTH KLIST KDESTROY KRBTKFILE AFSLOG - LOCATE URL - - FEAT OPTS - - LEXERR - -%token STRING -%token NUMBER - -%type check_login check_login_no_guest check_secure octal_number byte_size -%type struct_code mode_code type_code form_code -%type pathstring pathname password username - -%start cmd_list - -%% - -cmd_list - : /* empty */ - | cmd_list cmd - { - fromname = (char *) 0; - restart_point = (off_t) 0; - } - | cmd_list rcmd - ; - -cmd - : USER SP username CRLF check_secure - { - if ($5) - user($3); - free($3); - } - | PASS SP password CRLF check_secure - { - if ($5) - pass($3); - memset ($3, 0, strlen($3)); - free($3); - } - - | PORT SP host_port CRLF check_secure - { - if ($5) { - if (paranoid && - (data_dest->sa_family != his_addr->sa_family || - (socket_get_port(data_dest) < IPPORT_RESERVED) || - memcmp(socket_get_address(data_dest), - socket_get_address(his_addr), - socket_addr_size(his_addr)) != 0)) { - usedefault = 1; - reply(500, "Illegal PORT range rejected."); - } else { - usedefault = 0; - if (pdata >= 0) { - close(pdata); - pdata = -1; - } - reply(200, "PORT command successful."); - } - } - } - | EPRT SP STRING CRLF check_secure - { - if ($5) - eprt ($3); - free ($3); - } - | PASV CRLF check_login - { - if($3) - pasv (); - } - | EPSV CRLF check_login - { - if($3) - epsv (NULL); - } - | EPSV SP STRING CRLF check_login - { - if($5) - epsv ($3); - free ($3); - } - | TYPE SP type_code CRLF check_secure - { - if ($5) { - switch (cmd_type) { - - case TYPE_A: - if (cmd_form == FORM_N) { - reply(200, "Type set to A."); - type = cmd_type; - form = cmd_form; - } else - reply(504, "Form must be N."); - break; - - case TYPE_E: - reply(504, "Type E not implemented."); - break; - - case TYPE_I: - reply(200, "Type set to I."); - type = cmd_type; - break; - - case TYPE_L: -#if NBBY == 8 - if (cmd_bytesz == 8) { - reply(200, - "Type set to L (byte size 8)."); - type = cmd_type; - } else - reply(504, "Byte size must be 8."); -#else /* NBBY == 8 */ - UNIMPLEMENTED for NBBY != 8 -#endif /* NBBY == 8 */ - } - } - } - | STRU SP struct_code CRLF check_secure - { - if ($5) { - switch ($3) { - - case STRU_F: - reply(200, "STRU F ok."); - break; - - default: - reply(504, "Unimplemented STRU type."); - } - } - } - | MODE SP mode_code CRLF check_secure - { - if ($5) { - switch ($3) { - - case MODE_S: - reply(200, "MODE S ok."); - break; - - default: - reply(502, "Unimplemented MODE type."); - } - } - } - | ALLO SP NUMBER CRLF check_secure - { - if ($5) { - reply(202, "ALLO command ignored."); - } - } - | ALLO SP NUMBER SP R SP NUMBER CRLF check_secure - { - if ($9) { - reply(202, "ALLO command ignored."); - } - } - | RETR SP pathname CRLF check_login - { - char *name = $3; - - if ($5 && name != NULL) - retrieve(0, name); - if (name != NULL) - free(name); - } - | STOR SP pathname CRLF check_login - { - char *name = $3; - - if ($5 && name != NULL) - do_store(name, "w", 0); - if (name != NULL) - free(name); - } - | APPE SP pathname CRLF check_login - { - char *name = $3; - - if ($5 && name != NULL) - do_store(name, "a", 0); - if (name != NULL) - free(name); - } - | NLST CRLF check_login - { - if ($3) - send_file_list("."); - } - | NLST SP STRING CRLF check_login - { - char *name = $3; - - if ($5 && name != NULL) - send_file_list(name); - if (name != NULL) - free(name); - } - | LIST CRLF check_login - { - if($3) - list_file("."); - } - | LIST SP pathname CRLF check_login - { - if($5) - list_file($3); - free($3); - } - | sTAT SP pathname CRLF check_login - { - if ($5 && $3 != NULL) - statfilecmd($3); - if ($3 != NULL) - free($3); - } - | sTAT CRLF check_secure - { - if ($3) - statcmd(); - } - | DELE SP pathname CRLF check_login_no_guest - { - if ($5 && $3 != NULL) - do_delete($3); - if ($3 != NULL) - free($3); - } - | RNTO SP pathname CRLF check_login_no_guest - { - if($5){ - if (fromname) { - renamecmd(fromname, $3); - free(fromname); - fromname = (char *) 0; - } else { - reply(503, "Bad sequence of commands."); - } - } - if ($3 != NULL) - free($3); - } - | ABOR CRLF check_secure - { - if ($3) - reply(225, "ABOR command successful."); - } - | CWD CRLF check_login - { - if ($3) { - const char *path = pw->pw_dir; - if (dochroot || guest) - path = "/"; - cwd(path); - } - } - | CWD SP pathname CRLF check_login - { - if ($5 && $3 != NULL) - cwd($3); - if ($3 != NULL) - free($3); - } - | HELP CRLF check_secure - { - if ($3) - help(cmdtab, (char *) 0); - } - | HELP SP STRING CRLF check_secure - { - if ($5) { - char *cp = $3; - - if (strncasecmp(cp, "SITE", 4) == 0) { - cp = $3 + 4; - if (*cp == ' ') - cp++; - if (*cp) - help(sitetab, cp); - else - help(sitetab, (char *) 0); - } else - help(cmdtab, $3); - } - } - | NOOP CRLF check_secure - { - if ($3) - reply(200, "NOOP command successful."); - } - | MKD SP pathname CRLF check_login - { - if ($5 && $3 != NULL) - makedir($3); - if ($3 != NULL) - free($3); - } - | RMD SP pathname CRLF check_login_no_guest - { - if ($5 && $3 != NULL) - removedir($3); - if ($3 != NULL) - free($3); - } - | PWD CRLF check_login - { - if ($3) - pwd(); - } - | CDUP CRLF check_login - { - if ($3) - cwd(".."); - } - | FEAT CRLF check_secure - { - if ($3) { - lreply(211, "Supported features:"); - lreply(0, " MDTM"); - lreply(0, " REST STREAM"); - lreply(0, " SIZE"); - reply(211, "End"); - } - } - | OPTS SP STRING CRLF check_secure - { - if ($5) - reply(501, "Bad options"); - free ($3); - } - - | SITE SP HELP CRLF check_secure - { - if ($5) - help(sitetab, (char *) 0); - } - | SITE SP HELP SP STRING CRLF check_secure - { - if ($7) - help(sitetab, $5); - } - | SITE SP UMASK CRLF check_login - { - if ($5) { - int oldmask = umask(0); - umask(oldmask); - reply(200, "Current UMASK is %03o", oldmask); - } - } - | SITE SP UMASK SP octal_number CRLF check_login_no_guest - { - if ($7) { - if (($5 == -1) || ($5 > 0777)) { - reply(501, "Bad UMASK value"); - } else { - int oldmask = umask($5); - reply(200, - "UMASK set to %03o (was %03o)", - $5, oldmask); - } - } - } - | SITE SP CHMOD SP octal_number SP pathname CRLF check_login_no_guest - { - if ($9 && $7 != NULL) { - if ($5 > 0777) - reply(501, - "CHMOD: Mode value must be between 0 and 0777"); - else if (chmod($7, $5) < 0) - perror_reply(550, $7); - else - reply(200, "CHMOD command successful."); - } - if ($7 != NULL) - free($7); - } - | SITE SP IDLE CRLF check_secure - { - if ($5) - reply(200, - "Current IDLE time limit is %d seconds; max %d", - ftpd_timeout, maxtimeout); - } - | SITE SP IDLE SP NUMBER CRLF check_secure - { - if ($7) { - if ($5 < 30 || $5 > maxtimeout) { - reply(501, - "Maximum IDLE time must be between 30 and %d seconds", - maxtimeout); - } else { - ftpd_timeout = $5; - alarm((unsigned) ftpd_timeout); - reply(200, - "Maximum IDLE time set to %d seconds", - ftpd_timeout); - } - } - } - - | SITE SP KAUTH SP STRING CRLF check_login - { - reply(500, "Command not implemented."); - } - | SITE SP KLIST CRLF check_login - { - if($5) - klist(); - } - | SITE SP KDESTROY CRLF check_login - { - reply(500, "Command not implemented."); - } - | SITE SP KRBTKFILE SP STRING CRLF check_login - { - reply(500, "Command not implemented."); - } - | SITE SP AFSLOG CRLF check_login - { -#if defined(KRB5) - if(guest) - reply(500, "Can't be done as guest."); - else if($5) - afslog(NULL, 0); -#else - reply(500, "Command not implemented."); -#endif - } - | SITE SP AFSLOG SP STRING CRLF check_login - { -#if defined(KRB5) - if(guest) - reply(500, "Can't be done as guest."); - else if($7) - afslog($5, 0); - if($5) - free($5); -#else - reply(500, "Command not implemented."); -#endif - } - | SITE SP LOCATE SP STRING CRLF check_login - { - if($7 && $5 != NULL) - find($5); - if($5 != NULL) - free($5); - } - | SITE SP URL CRLF check_secure - { - if ($5) - reply(200, "http://www.pdc.kth.se/heimdal/"); - } - | STOU SP pathname CRLF check_login - { - if ($5 && $3 != NULL) - do_store($3, "w", 1); - if ($3 != NULL) - free($3); - } - | SYST CRLF check_secure - { - if ($3) { -#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__) - reply(215, "UNIX Type: L%d", NBBY); -#else - reply(215, "UNKNOWN Type: L%d", NBBY); -#endif - } - } - - /* - * SIZE is not in RFC959, but Postel has blessed it and - * it will be in the updated RFC. - * - * Return size of file in a format suitable for - * using with RESTART (we just count bytes). - */ - | SIZE SP pathname CRLF check_login - { - if ($5 && $3 != NULL) - sizecmd($3); - if ($3 != NULL) - free($3); - } - - /* - * MDTM is not in RFC959, but Postel has blessed it and - * it will be in the updated RFC. - * - * Return modification time of file as an ISO 3307 - * style time. E.g. YYYYMMDDHHMMSS or YYYYMMDDHHMMSS.xxx - * where xxx is the fractional second (of any precision, - * not necessarily 3 digits) - */ - | MDTM SP pathname CRLF check_login - { - if ($5 && $3 != NULL) { - struct stat stbuf; - if (stat($3, &stbuf) < 0) - reply(550, "%s: %s", - $3, strerror(errno)); - else if (!S_ISREG(stbuf.st_mode)) { - reply(550, - "%s: not a plain file.", $3); - } else { - struct tm *t; - time_t mtime = stbuf.st_mtime; - - t = gmtime(&mtime); - reply(213, - "%04d%02d%02d%02d%02d%02d", - t->tm_year + 1900, - t->tm_mon + 1, - t->tm_mday, - t->tm_hour, - t->tm_min, - t->tm_sec); - } - } - if ($3 != NULL) - free($3); - } - | QUIT CRLF check_secure - { - if ($3) { - reply(221, "Goodbye."); - dologout(0); - } - } - | error CRLF - { - yyerrok; - } - ; -rcmd - : RNFR SP pathname CRLF check_login_no_guest - { - restart_point = (off_t) 0; - if ($5 && $3) { - fromname = renamefrom($3); - if (fromname == (char *) 0 && $3) { - free($3); - } - } - } - | REST SP byte_size CRLF check_secure - { - if ($5) { - fromname = (char *) 0; - restart_point = $3; /* XXX $3 is only "int" */ - reply(350, "Restarting at %ld. %s", - (long)restart_point, - "Send STORE or RETRIEVE to initiate transfer."); - } - } - | AUTH SP STRING CRLF - { - auth($3); - free($3); - } - | ADAT SP STRING CRLF - { - adat($3); - free($3); - } - | PBSZ SP NUMBER CRLF check_secure - { - if ($5) - pbsz($3); - } - | PROT SP STRING CRLF check_secure - { - if ($5) - prot($3); - } - | CCC CRLF check_secure - { - if ($3) - ccc(); - } - | MIC SP STRING CRLF - { - mec($3, prot_safe); - free($3); - } - | CONF SP STRING CRLF - { - mec($3, prot_confidential); - free($3); - } - | ENC SP STRING CRLF - { - mec($3, prot_private); - free($3); - } - ; - -username - : STRING - ; - -password - : /* empty */ - { - $$ = (char *)calloc(1, sizeof(char)); - } - | STRING - ; - -byte_size - : NUMBER - ; - -host_port - : NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA - NUMBER COMMA NUMBER - { - struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest; - - sin4->sin_family = AF_INET; - sin4->sin_port = htons($9 * 256 + $11); - sin4->sin_addr.s_addr = - htonl(($1 << 24) | ($3 << 16) | ($5 << 8) | $7); - } - ; - -form_code - : N - { - $$ = FORM_N; - } - | T - { - $$ = FORM_T; - } - | C - { - $$ = FORM_C; - } - ; - -type_code - : A - { - cmd_type = TYPE_A; - cmd_form = FORM_N; - } - | A SP form_code - { - cmd_type = TYPE_A; - cmd_form = $3; - } - | E - { - cmd_type = TYPE_E; - cmd_form = FORM_N; - } - | E SP form_code - { - cmd_type = TYPE_E; - cmd_form = $3; - } - | I - { - cmd_type = TYPE_I; - } - | L - { - cmd_type = TYPE_L; - cmd_bytesz = NBBY; - } - | L SP byte_size - { - cmd_type = TYPE_L; - cmd_bytesz = $3; - } - /* this is for a bug in the BBN ftp */ - | L byte_size - { - cmd_type = TYPE_L; - cmd_bytesz = $2; - } - ; - -struct_code - : F - { - $$ = STRU_F; - } - | R - { - $$ = STRU_R; - } - | P - { - $$ = STRU_P; - } - ; - -mode_code - : S - { - $$ = MODE_S; - } - | B - { - $$ = MODE_B; - } - | C - { - $$ = MODE_C; - } - ; - -pathname - : pathstring - { - /* - * Problem: this production is used for all pathname - * processing, but only gives a 550 error reply. - * This is a valid reply in some cases but not in others. - */ - if (logged_in && $1 && *$1 == '~') { - glob_t gl; - int flags = - GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE; - - memset(&gl, 0, sizeof(gl)); - if (glob($1, flags, NULL, &gl) || - gl.gl_pathc == 0) { - reply(550, "not found"); - $$ = NULL; - } else { - $$ = strdup(gl.gl_pathv[0]); - } - globfree(&gl); - free($1); - } else - $$ = $1; - } - ; - -pathstring - : STRING - ; - -octal_number - : NUMBER - { - int ret, dec, multby, digit; - - /* - * Convert a number that was read as decimal number - * to what it would be if it had been read as octal. - */ - dec = $1; - multby = 1; - ret = 0; - while (dec) { - digit = dec%10; - if (digit > 7) { - ret = -1; - break; - } - ret += digit * multby; - multby *= 8; - dec /= 10; - } - $$ = ret; - } - ; - - -check_login_no_guest : check_login - { - $$ = $1 && !guest; - if($1 && !$$) - reply(550, "Permission denied"); - } - ; - -check_login : check_secure - { - if($1) { - if(($$ = logged_in) == 0) - reply(530, "Please login with USER and PASS."); - } else - $$ = 0; - } - ; - -check_secure : /* empty */ - { - $$ = 1; - if(sec_complete && !ccc_passed && !secure_command()) { - $$ = 0; - reply(533, "Command protection level denied " - "for paranoid reasons."); - } - } - ; - -%% - -#define CMD 0 /* beginning of command */ -#define ARGS 1 /* expect miscellaneous arguments */ -#define STR1 2 /* expect SP followed by STRING */ -#define STR2 3 /* expect STRING */ -#define OSTR 4 /* optional SP then STRING */ -#define ZSTR1 5 /* SP then optional STRING */ -#define ZSTR2 6 /* optional STRING after SP */ -#define SITECMD 7 /* SITE command */ -#define NSTR 8 /* Number followed by a string */ - -struct tab cmdtab[] = { /* In order defined in RFC 765 */ - { "USER", USER, STR1, 1, " username" }, - { "PASS", PASS, ZSTR1, 1, " password" }, - { "ACCT", ACCT, STR1, 0, "(specify account)" }, - { "SMNT", SMNT, ARGS, 0, "(structure mount)" }, - { "REIN", REIN, ARGS, 0, "(reinitialize server state)" }, - { "QUIT", QUIT, ARGS, 1, "(terminate service)", }, - { "PORT", PORT, ARGS, 1, " b0, b1, b2, b3, b4" }, - { "EPRT", EPRT, STR1, 1, " string" }, - { "PASV", PASV, ARGS, 1, "(set server in passive mode)" }, - { "EPSV", EPSV, OSTR, 1, "[ foo]" }, - { "TYPE", TYPE, ARGS, 1, " [ A | E | I | L ]" }, - { "STRU", STRU, ARGS, 1, "(specify file structure)" }, - { "MODE", MODE, ARGS, 1, "(specify transfer mode)" }, - { "RETR", RETR, STR1, 1, " file-name" }, - { "STOR", STOR, STR1, 1, " file-name" }, - { "APPE", APPE, STR1, 1, " file-name" }, - { "MLFL", MLFL, OSTR, 0, "(mail file)" }, - { "MAIL", MAIL, OSTR, 0, "(mail to user)" }, - { "MSND", MSND, OSTR, 0, "(mail send to terminal)" }, - { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" }, - { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" }, - { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" }, - { "MRCP", MRCP, STR1, 0, "(mail recipient)" }, - { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" }, - { "REST", REST, ARGS, 1, " offset (restart command)" }, - { "RNFR", RNFR, STR1, 1, " file-name" }, - { "RNTO", RNTO, STR1, 1, " file-name" }, - { "ABOR", ABOR, ARGS, 1, "(abort operation)" }, - { "DELE", DELE, STR1, 1, " file-name" }, - { "CWD", CWD, OSTR, 1, "[ directory-name ]" }, - { "XCWD", CWD, OSTR, 1, "[ directory-name ]" }, - { "LIST", LIST, OSTR, 1, "[ path-name ]" }, - { "NLST", NLST, OSTR, 1, "[ path-name ]" }, - { "SITE", SITE, SITECMD, 1, "site-cmd [ arguments ]" }, - { "SYST", SYST, ARGS, 1, "(get type of operating system)" }, - { "STAT", sTAT, OSTR, 1, "[ path-name ]" }, - { "HELP", HELP, OSTR, 1, "[ ]" }, - { "NOOP", NOOP, ARGS, 1, "" }, - { "MKD", MKD, STR1, 1, " path-name" }, - { "XMKD", MKD, STR1, 1, " path-name" }, - { "RMD", RMD, STR1, 1, " path-name" }, - { "XRMD", RMD, STR1, 1, " path-name" }, - { "PWD", PWD, ARGS, 1, "(return current directory)" }, - { "XPWD", PWD, ARGS, 1, "(return current directory)" }, - { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" }, - { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" }, - { "STOU", STOU, STR1, 1, " file-name" }, - { "SIZE", SIZE, OSTR, 1, " path-name" }, - { "MDTM", MDTM, OSTR, 1, " path-name" }, - - /* extensions from RFC2228 */ - { "AUTH", AUTH, STR1, 1, " auth-type" }, - { "ADAT", ADAT, STR1, 1, " auth-data" }, - { "PBSZ", PBSZ, ARGS, 1, " buffer-size" }, - { "PROT", PROT, STR1, 1, " prot-level" }, - { "CCC", CCC, ARGS, 1, "" }, - { "MIC", MIC, STR1, 1, " integrity command" }, - { "CONF", CONF, STR1, 1, " confidentiality command" }, - { "ENC", ENC, STR1, 1, " privacy command" }, - - /* RFC2389 */ - { "FEAT", FEAT, ARGS, 1, "" }, - { "OPTS", OPTS, ARGS, 1, " command [ options]" }, - - { NULL, 0, 0, 0, 0 } -}; - -struct tab sitetab[] = { - { "UMASK", UMASK, ARGS, 1, "[ umask ]" }, - { "IDLE", IDLE, ARGS, 1, "[ maximum-idle-time ]" }, - { "CHMOD", CHMOD, NSTR, 1, " mode file-name" }, - { "HELP", HELP, OSTR, 1, "[ ]" }, - - { "KAUTH", KAUTH, STR1, 1, " principal [ ticket ]" }, - { "KLIST", KLIST, ARGS, 1, "(show ticket file)" }, - { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" }, - { "KRBTKFILE", KRBTKFILE, STR1, 1, " ticket-file" }, - { "AFSLOG", AFSLOG, OSTR, 1, "[ cell]" }, - - { "LOCATE", LOCATE, STR1, 1, " globexpr" }, - { "FIND", LOCATE, STR1, 1, " globexpr" }, - - { "URL", URL, ARGS, 1, "?" }, - - { NULL, 0, 0, 0, 0 } -}; - -static struct tab * -lookup(struct tab *p, char *cmd) -{ - - for (; p->name != NULL; p++) - if (strcmp(cmd, p->name) == 0) - return (p); - return (0); -} - -/* - * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes. - */ -char * -ftpd_getline(char *s, int n) -{ - int c; - char *cs; - - cs = s; - - /* might still be data within the security MIC/CONF/ENC */ - if(ftp_command){ - strlcpy(s, ftp_command, n); - if (debug) - syslog(LOG_DEBUG, "command: %s", s); - return s; - } - while ((c = getc(stdin)) != EOF) { - c &= 0377; - if (c == IAC) { - if ((c = getc(stdin)) != EOF) { - c &= 0377; - switch (c) { - case WILL: - case WONT: - c = getc(stdin); - printf("%c%c%c", IAC, DONT, 0377&c); - fflush(stdout); - continue; - case DO: - case DONT: - c = getc(stdin); - printf("%c%c%c", IAC, WONT, 0377&c); - fflush(stdout); - continue; - case IAC: - break; - default: - continue; /* ignore command */ - } - } - } - *cs++ = c; - if (--n <= 0 || c == '\n') - break; - } - if (c == EOF && cs == s) - return (NULL); - *cs++ = '\0'; - if (debug) { - if (!guest && strncasecmp("pass ", s, 5) == 0) { - /* Don't syslog passwords */ - syslog(LOG_DEBUG, "command: %.5s ???", s); - } else { - char *cp; - int len; - - /* Don't syslog trailing CR-LF */ - len = strlen(s); - cp = s + len - 1; - while (cp >= s && (*cp == '\n' || *cp == '\r')) { - --cp; - --len; - } - syslog(LOG_DEBUG, "command: %.*s", len, s); - } - } -#ifdef XXX - fprintf(stderr, "%s\n", s); -#endif - return (s); -} - -static RETSIGTYPE -toolong(int signo) -{ - - reply(421, - "Timeout (%d seconds): closing control connection.", - ftpd_timeout); - if (logging) - syslog(LOG_INFO, "User %s timed out after %d seconds", - (pw ? pw -> pw_name : "unknown"), ftpd_timeout); - dologout(1); - SIGRETURN(0); -} - -static int -yylex(void) -{ - static int cpos, state; - char *cp, *cp2; - struct tab *p; - int n; - char c; - - for (;;) { - switch (state) { - - case CMD: - hasyyerrored = 0; - - signal(SIGALRM, toolong); - alarm((unsigned) ftpd_timeout); - if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) { - reply(221, "You could at least say goodbye."); - dologout(0); - } - alarm(0); -#ifdef HAVE_SETPROCTITLE - if (strncasecmp(cbuf, "PASS", 4) != 0) - setproctitle("%s: %s", proctitle, cbuf); -#endif /* HAVE_SETPROCTITLE */ - if ((cp = strchr(cbuf, '\r'))) { - *cp++ = '\n'; - *cp = '\0'; - } - if ((cp = strpbrk(cbuf, " \n"))) - cpos = cp - cbuf; - if (cpos == 0) - cpos = 4; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - strupr(cbuf); - p = lookup(cmdtab, cbuf); - cbuf[cpos] = c; - if (p != 0) { - if (p->implemented == 0) { - nack(p->name); - hasyyerrored = 1; - break; - } - state = p->state; - yylval.s = p->name; - return (p->token); - } - break; - - case SITECMD: - if (cbuf[cpos] == ' ') { - cpos++; - return (SP); - } - cp = &cbuf[cpos]; - if ((cp2 = strpbrk(cp, " \n"))) - cpos = cp2 - cbuf; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - strupr(cp); - p = lookup(sitetab, cp); - cbuf[cpos] = c; - if (p != 0) { - if (p->implemented == 0) { - state = CMD; - nack(p->name); - hasyyerrored = 1; - break; - } - state = p->state; - yylval.s = p->name; - return (p->token); - } - state = CMD; - break; - - case OSTR: - if (cbuf[cpos] == '\n') { - state = CMD; - return (CRLF); - } - /* FALLTHROUGH */ - - case STR1: - case ZSTR1: - dostr1: - if (cbuf[cpos] == ' ') { - cpos++; - if(state == OSTR) - state = STR2; - else - state++; - return (SP); - } - break; - - case ZSTR2: - if (cbuf[cpos] == '\n') { - state = CMD; - return (CRLF); - } - /* FALLTHROUGH */ - - case STR2: - cp = &cbuf[cpos]; - n = strlen(cp); - cpos += n - 1; - /* - * Make sure the string is nonempty and \n terminated. - */ - if (n > 1 && cbuf[cpos] == '\n') { - cbuf[cpos] = '\0'; - yylval.s = copy(cp); - cbuf[cpos] = '\n'; - state = ARGS; - return (STRING); - } - break; - - case NSTR: - if (cbuf[cpos] == ' ') { - cpos++; - return (SP); - } - if (isdigit((unsigned char)cbuf[cpos])) { - cp = &cbuf[cpos]; - while (isdigit((unsigned char)cbuf[++cpos])) - ; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - yylval.i = atoi(cp); - cbuf[cpos] = c; - state = STR1; - return (NUMBER); - } - state = STR1; - goto dostr1; - - case ARGS: - if (isdigit((unsigned char)cbuf[cpos])) { - cp = &cbuf[cpos]; - while (isdigit((unsigned char)cbuf[++cpos])) - ; - c = cbuf[cpos]; - cbuf[cpos] = '\0'; - yylval.i = atoi(cp); - cbuf[cpos] = c; - return (NUMBER); - } - switch (cbuf[cpos++]) { - - case '\n': - state = CMD; - return (CRLF); - - case ' ': - return (SP); - - case ',': - return (COMMA); - - case 'A': - case 'a': - return (A); - - case 'B': - case 'b': - return (B); - - case 'C': - case 'c': - return (C); - - case 'E': - case 'e': - return (E); - - case 'F': - case 'f': - return (F); - - case 'I': - case 'i': - return (I); - - case 'L': - case 'l': - return (L); - - case 'N': - case 'n': - return (N); - - case 'P': - case 'p': - return (P); - - case 'R': - case 'r': - return (R); - - case 'S': - case 's': - return (S); - - case 'T': - case 't': - return (T); - - } - break; - - default: - fatal("Unknown state in scanner."); - } - yyerror(NULL); - state = CMD; - return (0); - } -} - -/* ARGSUSED */ -void -yyerror(char *s) -{ - char *cp; - - if (hasyyerrored) - return; - - if ((cp = strchr(cbuf,'\n'))) - *cp = '\0'; - reply(500, "'%s': command not understood.", cbuf); - hasyyerrored = 1; -} - -static char * -copy(char *s) -{ - char *p; - - p = strdup(s); - if (p == NULL) - fatal("Ran out of memory."); - return p; -} - -static void -help(struct tab *ctab, char *s) -{ - struct tab *c; - int width, NCMDS; - char *t; - char buf[1024]; - - if (ctab == sitetab) - t = "SITE "; - else - t = ""; - width = 0, NCMDS = 0; - for (c = ctab; c->name != NULL; c++) { - int len = strlen(c->name); - - if (len > width) - width = len; - NCMDS++; - } - width = (width + 8) &~ 7; - if (s == 0) { - int i, j, w; - int columns, lines; - - lreply(214, "The following %scommands are recognized %s.", - t, "(* =>'s unimplemented)"); - columns = 76 / width; - if (columns == 0) - columns = 1; - lines = (NCMDS + columns - 1) / columns; - for (i = 0; i < lines; i++) { - strlcpy (buf, " ", sizeof(buf)); - for (j = 0; j < columns; j++) { - c = ctab + j * lines + i; - snprintf (buf + strlen(buf), - sizeof(buf) - strlen(buf), - "%s%c", - c->name, - c->implemented ? ' ' : '*'); - if (c + lines >= &ctab[NCMDS]) - break; - w = strlen(c->name) + 1; - while (w < width) { - strlcat (buf, - " ", - sizeof(buf)); - w++; - } - } - lreply(214, "%s", buf); - } - reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se"); - return; - } - strupr(s); - c = lookup(ctab, s); - if (c == (struct tab *)0) { - reply(502, "Unknown command %s.", s); - return; - } - if (c->implemented) - reply(214, "Syntax: %s%s %s", t, c->name, c->help); - else - reply(214, "%s%-*s\t%s; unimplemented.", t, width, - c->name, c->help); -} - -static void -sizecmd(char *filename) -{ - switch (type) { - case TYPE_L: - case TYPE_I: { - struct stat stbuf; - if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) - reply(550, "%s: not a plain file.", filename); - else - reply(213, "%lu", (unsigned long)stbuf.st_size); - break; - } - case TYPE_A: { - FILE *fin; - int c; - size_t count; - struct stat stbuf; - fin = fopen(filename, "r"); - if (fin == NULL) { - perror_reply(550, filename); - return; - } - if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) { - reply(550, "%s: not a plain file.", filename); - fclose(fin); - return; - } - - count = 0; - while((c=getc(fin)) != EOF) { - if (c == '\n') /* will get expanded to \r\n */ - count++; - count++; - } - fclose(fin); - - reply(213, "%lu", (unsigned long)count); - break; - } - default: - reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]); - } -} diff --git a/crypto/heimdal/appl/ftp/ftpd/ftpd.8 b/crypto/heimdal/appl/ftp/ftpd/ftpd.8 deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/ftpd.8 +++ /dev/null @@ -1,503 +0,0 @@ -.\" $NetBSD: ftpd.8,v 1.7 1995/04/11 02:44:53 cgd Exp $ -.\" -.\" Copyright (c) 1985, 1988, 1991, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)ftpd.8 8.2 (Berkeley) 4/19/94 -.\" -.Dd July 19, 2003 -.Dt FTPD 8 -.Os BSD 4.2 -.Sh NAME -.Nm ftpd -.Nd Internet File Transfer Protocol server -.Sh SYNOPSIS -.Nm -.Op Fl a Ar authmode -.Op Fl dilvU -.Op Fl g Ar umask -.Op Fl p Ar port -.Op Fl T Ar maxtimeout -.Op Fl t Ar timeout -.Op Fl Fl gss-bindings -.Op Fl I | Fl Fl no-insecure-oob -.Op Fl u Ar default umask -.Op Fl B | Fl Fl builtin-ls -.Op Fl Fl good-chars= Ns Ar string -.Sh DESCRIPTION -.Nm Ftpd -is the -Internet File Transfer Protocol -server process. The server uses the -.Tn TCP -protocol -and listens at the port specified in the -.Dq ftp -service specification; see -.Xr services 5 . -.Pp -Available options: -.Bl -tag -width Ds -.It Fl a -Select the level of authentication required. Kerberised login can not -be turned off. The default is to only allow kerberised login. Other -possibilities can be turned on by giving a string of comma separated -flags as argument to -.Fl a . -Recognised flags are: -.Bl -tag -width plain -.It Ar plain -Allow logging in with plaintext password. The password can be a(n) OTP -or an ordinary password. -.It Ar otp -Same as -.Ar plain , -but only OTP is allowed. -.It Ar ftp -Allow anonymous login. -.El -.Pp -The following combination modes exists for backwards compatibility: -.Bl -tag -width plain -.It Ar none -Same as -.Ar plain,ftp . -.It Ar safe -Same as -.Ar ftp . -.It Ar user -Ignored. -.El -.It Fl d -Debugging information is written to the syslog using LOG_FTP. -.It Fl g -Anonymous users will get a umask of -.Ar umask . -.It Fl Fl gss-bindings -require the peer to use GSS-API bindings (ie make sure IP addresses match). -.It Fl i -Open a socket and wait for a connection. This is mainly used for -debugging when ftpd isn't started by inetd. -.It Fl l -Each successful and failed -.Xr ftp 1 -session is logged using syslog with a facility of LOG_FTP. -If this option is specified twice, the retrieve (get), store (put), append, -delete, make directory, remove directory and rename operations and -their filename arguments are also logged. -.It Fl p -Use -.Ar port -(a service name or number) instead of the default -.Ar ftp/tcp . -.It Fl T -A client may also request a different timeout period; -the maximum period allowed may be set to -.Ar timeout -seconds with the -.Fl T -option. -The default limit is 2 hours. -.It Fl t -The inactivity timeout period is set to -.Ar timeout -seconds (the default is 15 minutes). -.It Fl u -Set the initial umask to something else than the default 027. -.It Fl U -In previous versions of -.Nm ftpd , -when a passive mode client requested a data connection to the server, the -server would use data ports in the range 1024..4999. Now, by default, -if the system supports the IP_PORTRANGE socket option, the server will -use data ports in the range 49152..65535. Specifying this option will -revert to the old behavior. -.It Fl v -Verbose mode. -.It Xo -.Fl B , -.Fl Fl builtin-ls -.Xc -use built-in ls to list files -.It Xo -.Fl Fl good-chars= Ns Ar string -.Xc -allowed anonymous upload filename chars -.It Xo -.Fl I -.Fl Fl no-insecure-oob -.Xc -don't allow insecure out of band. -Heimdal ftp clients before 0.6.3 doesn't support secure oob, so turning -on this option makes them no longer work. -.El -.Pp -The file -.Pa /etc/nologin -can be used to disable ftp access. -If the file exists, -.Nm -displays it and exits. -If the file -.Pa /etc/ftpwelcome -exists, -.Nm -prints it before issuing the -.Dq ready -message. -If the file -.Pa /etc/motd -exists, -.Nm -prints it after a successful login. -.Pp -The ftp server currently supports the following ftp requests. -The case of the requests is ignored. -.Bl -column "Request" -offset indent -.It Request Ta "Description" -.It ABOR Ta "abort previous command" -.It ACCT Ta "specify account (ignored)" -.It ALLO Ta "allocate storage (vacuously)" -.It APPE Ta "append to a file" -.It CDUP Ta "change to parent of current working directory" -.It CWD Ta "change working directory" -.It DELE Ta "delete a file" -.It HELP Ta "give help information" -.It LIST Ta "give list files in a directory" Pq Dq Li "ls -lgA" -.It MKD Ta "make a directory" -.It MDTM Ta "show last modification time of file" -.It MODE Ta "specify data transfer" Em mode -.It NLST Ta "give name list of files in directory" -.It NOOP Ta "do nothing" -.It PASS Ta "specify password" -.It PASV Ta "prepare for server-to-server transfer" -.It PORT Ta "specify data connection port" -.It PWD Ta "print the current working directory" -.It QUIT Ta "terminate session" -.It REST Ta "restart incomplete transfer" -.It RETR Ta "retrieve a file" -.It RMD Ta "remove a directory" -.It RNFR Ta "specify rename-from file name" -.It RNTO Ta "specify rename-to file name" -.It SITE Ta "non-standard commands (see next section)" -.It SIZE Ta "return size of file" -.It STAT Ta "return status of server" -.It STOR Ta "store a file" -.It STOU Ta "store a file with a unique name" -.It STRU Ta "specify data transfer" Em structure -.It SYST Ta "show operating system type of server system" -.It TYPE Ta "specify data transfer" Em type -.It USER Ta "specify user name" -.It XCUP Ta "change to parent of current working directory (deprecated)" -.It XCWD Ta "change working directory (deprecated)" -.It XMKD Ta "make a directory (deprecated)" -.It XPWD Ta "print the current working directory (deprecated)" -.It XRMD Ta "remove a directory (deprecated)" -.El -.Pp -The following commands are specified by RFC2228. -.Bl -column Request -offset indent -.It AUTH Ta "authentication/security mechanism" -.It ADAT Ta "authentication/security data" -.It PROT Ta "data channel protection level" -.It PBSZ Ta "protection buffer size" -.It MIC Ta "integrity protected command" -.It CONF Ta "confidentiality protected command" -.It ENC Ta "privacy protected command" -.It CCC Ta "clear command channel" -.El -.Pp -The following non-standard or -.Tn UNIX -specific commands are supported -by the -SITE request. -.Pp -.Bl -column Request -offset indent -.It UMASK Ta change umask, (e.g. -.Ic "SITE UMASK 002" ) -.It IDLE Ta set idle-timer, (e.g. -.Ic "SITE IDLE 60" ) -.It CHMOD Ta change mode of a file (e.g. -.Ic "SITE CHMOD 755 filename" ) -.It FIND Ta quickly find a specific file with GNU -.Xr locate 1 . -.It HELP Ta give help information. -.El -.Pp -The following Kerberos related site commands are understood. -.Bl -column Request -offset indent -.It KAUTH Ta obtain remote tickets. -.It KLIST Ta show remote tickets -.El -.Pp -The remaining ftp requests specified in Internet RFC 959 -are -recognized, but not implemented. -MDTM and SIZE are not specified in RFC 959, but will appear in the -next updated FTP RFC. -.Pp -The ftp server will abort an active file transfer only when the -ABOR -command is preceded by a Telnet "Interrupt Process" (IP) -signal and a Telnet "Synch" signal in the command Telnet stream, -as described in Internet RFC 959. -If a -STAT -command is received during a data transfer, preceded by a Telnet IP -and Synch, transfer status will be returned. -.Pp -.Nm Ftpd -interprets file names according to the -.Dq globbing -conventions used by -.Xr csh 1 . -This allows users to use the metacharacters -.Dq Li \&*?[]{}~ . -.Pp -.Nm Ftpd -authenticates users according to these rules. -.Pp -.Bl -enum -offset indent -.It -If Kerberos authentication is used, the user must pass valid tickets -and the principal must be allowed to login as the remote user. -.It -The login name must be in the password data base, and not have a null -password (if Kerberos is used the password field is not checked). In -this case a password must be provided by the client before any file -operations may be performed. If the user has an OTP key, the response -from a successful USER command will include an OTP challenge. The -client may choose to respond with a PASS command giving either a -standard password or an OTP one-time password. The server will -automatically determine which type of password it has been given and -attempt to authenticate accordingly. See -.Xr otp 1 -for more information on OTP authentication. -.It -The login name must not appear in the file -.Pa /etc/ftpusers . -.It -The user must have a standard shell returned by -.Xr getusershell 3 . -.It -If the user name appears in the file -.Pa /etc/ftpchroot -the session's root will be changed to the user's login directory by -.Xr chroot 2 -as for an -.Dq anonymous -or -.Dq ftp -account (see next item). However, the user must still supply a password. -This feature is intended as a compromise between a fully anonymous account -and a fully privileged account. The account should also be set up as for an -anonymous account. -.It -If the user name is -.Dq anonymous -or -.Dq ftp , -an -anonymous ftp account must be present in the password -file (user -.Dq ftp ) . -In this case the user is allowed -to log in by specifying any password (by convention an email address for -the user should be used as the password). -.El -.Pp -In the last case, -.Nm ftpd -takes special measures to restrict the client's access privileges. -The server performs a -.Xr chroot 2 -to the home directory of the -.Dq ftp -user. -In order that system security is not breached, it is recommended -that the -.Dq ftp -subtree be constructed with care, consider following these guidelines -for anonymous ftp. -.Pp -In general all files should be owned by -.Dq root , -and have non-write permissions (644 or 755 depending on the kind of -file). No files should be owned or writable by -.Dq ftp -(possibly with exception for the -.Pa ~ftp/incoming , -as specified below). -.Bl -tag -width "~ftp/pub" -offset indent -.It Pa ~ftp -The -.Dq ftp -homedirectory should be owned by root. -.It Pa ~ftp/bin -The directory for external programs (such as -.Xr ls 1 ) . -These programs must either be statically linked, or you must setup an -environment for dynamic linking when running chrooted. -These programs will be used if present: -.Bl -tag -width "locate" -offset indent -.It ls -Used when listing files. -.It compress -When retrieving a filename that ends in -.Pa .Z , -and that file isn't present, -.Nm -will try to find the filename without -.Pa .Z -and compress it on the fly. -.It gzip -Same as compress, just with files ending in -.Pa .gz . -.It gtar -Enables retrieval of whole directories as files ending in -.Pa .tar . -Can also be combined with compression. You must use GNU Tar (or some -other that supports the -.Fl z -and -.Fl Z -flags). -.It locate -Will enable ``fast find'' with the -.Ic SITE FIND -command. You must also create a -.Pa locatedb -file in -.Pa ~ftp/etc . -.El -.It Pa ~ftp/etc -If you put copies of the -.Xr passwd 5 -and -.Xr group 5 -files here, ls will be able to produce owner names rather than -numbers. Remember to remove any passwords from these files. -.Pp -The file -.Pa motd , -if present, will be printed after a successful login. -.It Pa ~ftp/dev -Put a copy of -.Xr /dev/null 7 -here. -.It Pa ~ftp/pub -Traditional place to put whatever you want to make public. -.El -.Pp -If you want guests to be able to upload files, create a -.Pa ~ftp/incoming -directory owned by -.Dq root , -and group -.Dq ftp -with mode 730 (make sure -.Dq ftp -is member of group -.Dq ftp ) . -The following restrictions apply to anonymous users: -.Bl -bullet -.It -Directories created will have mode 700. -.It -Uploaded files will be created with an umask of 777, if not changed -with the -.Fl g -option. -.It -These command are not accessible: -.Ic DELE , RMD , RNTO , RNFR , -.Ic SITE UMASK , -and -.Ic SITE CHMOD . -.It -Filenames must start with an alpha-numeric character, and consist of -alpha-numeric characters or any of the following: -.Li \&+ -(plus), -.Li \&- -(minus), -.Li \&= -(equal), -.Li \&_ -(underscore), -.Li \&. -(period), and -.Li \&, -(comma). -.El -.Sh FILES -.Bl -tag -width /etc/ftpwelcome -compact -.It Pa /etc/ftpusers -Access list for users. -.It Pa /etc/ftpchroot -List of normal users who should be chroot'd. -.It Pa /etc/ftpwelcome -Welcome notice. -.It Pa /etc/motd -Welcome notice after login. -.It Pa /etc/nologin -Displayed and access refused. -.It Pa ~/.klogin -Login access for Kerberos. -.El -.Sh SEE ALSO -.Xr ftp 1 , -.Xr otp 1 , -.Xr getusershell 3 , -.Xr ftpusers 5 , -.Xr syslogd 8 -.Sh STANDARDS -.Bl -tag -compact -width "RFC 1938" -.It Cm RFC 959 -FTP PROTOCOL SPECIFICATION -.It Cm RFC 1938 -OTP Specification -.It Cm RFC 2228 -FTP Security Extensions. -.El -.Sh BUGS -The server must run as the super-user -to create sockets with privileged port numbers. It maintains -an effective user id of the logged in user, reverting to -the super-user only when binding addresses to sockets. The -possible security holes have been extensively -scrutinized, but are possibly incomplete. -.Sh HISTORY -The -.Nm -command appeared in -.Bx 4.2 . diff --git a/crypto/heimdal/appl/ftp/ftpd/ftpd.c b/crypto/heimdal/appl/ftp/ftpd/ftpd.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/ftpd.c +++ /dev/null @@ -1,2367 +0,0 @@ -/* - * Copyright (c) 1985, 1988, 1990, 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#define FTP_NAMES -#include "ftpd_locl.h" -#ifdef KRB5 -#include -#endif -#include "getarg.h" - -RCSID("$Id$"); - -static char version[] = "Version 6.00"; - -extern off_t restart_point; -extern char cbuf[]; - -struct sockaddr_storage ctrl_addr_ss; -struct sockaddr *ctrl_addr = (struct sockaddr *)&ctrl_addr_ss; - -struct sockaddr_storage data_source_ss; -struct sockaddr *data_source = (struct sockaddr *)&data_source_ss; - -struct sockaddr_storage data_dest_ss; -struct sockaddr *data_dest = (struct sockaddr *)&data_dest_ss; - -struct sockaddr_storage his_addr_ss; -struct sockaddr *his_addr = (struct sockaddr *)&his_addr_ss; - -struct sockaddr_storage pasv_addr_ss; -struct sockaddr *pasv_addr = (struct sockaddr *)&pasv_addr_ss; - -int data; -int logged_in; -struct passwd *pw; -int debug = 0; -int ftpd_timeout = 900; /* timeout after 15 minutes of inactivity */ -int maxtimeout = 7200;/* don't allow idle time to be set beyond 2 hours */ -int restricted_data_ports = 1; -int logging; -int guest; -int dochroot; -int type; -int form; -int stru; /* avoid C keyword */ -int mode; -int usedefault = 1; /* for data transfers */ -int pdata = -1; /* for passive mode */ -int allow_insecure_oob = 1; -static int transflag; -static int urgflag; -off_t file_size; -off_t byte_count; -#if !defined(CMASK) || CMASK == 0 -#undef CMASK -#define CMASK 027 -#endif -int defumask = CMASK; /* default umask value */ -int guest_umask = 0777; /* Paranoia for anonymous users */ -char tmpline[10240]; -char hostname[MaxHostNameLen]; -char remotehost[MaxHostNameLen]; -static char ttyline[20]; -int paranoid = 1; - -#define AUTH_PLAIN (1 << 0) /* allow sending passwords */ -#define AUTH_OTP (1 << 1) /* passwords are one-time */ -#define AUTH_FTP (1 << 2) /* allow anonymous login */ - -static int auth_level = 0; /* Only allow kerberos login by default */ - -/* - * Timeout intervals for retrying connections - * to hosts that don't accept PORT cmds. This - * is a kludge, but given the problems with TCP... - */ -#define SWAITMAX 90 /* wait at most 90 seconds */ -#define SWAITINT 5 /* interval between retries */ - -int swaitmax = SWAITMAX; -int swaitint = SWAITINT; - -#ifdef HAVE_SETPROCTITLE -char proctitle[BUFSIZ]; /* initial part of title */ -#endif /* HAVE_SETPROCTITLE */ - -#define LOGCMD(cmd, file) \ - if (logging > 1) \ - syslog(LOG_INFO,"%s %s%s", cmd, \ - *(file) == '/' ? "" : curdir(), file); -#define LOGCMD2(cmd, file1, file2) \ - if (logging > 1) \ - syslog(LOG_INFO,"%s %s%s %s%s", cmd, \ - *(file1) == '/' ? "" : curdir(), file1, \ - *(file2) == '/' ? "" : curdir(), file2); -#define LOGBYTES(cmd, file, cnt) \ - if (logging > 1) { \ - if (cnt == (off_t)-1) \ - syslog(LOG_INFO,"%s %s%s", cmd, \ - *(file) == '/' ? "" : curdir(), file); \ - else \ - syslog(LOG_INFO, "%s %s%s = %ld bytes", \ - cmd, (*(file) == '/') ? "" : curdir(), file, (long)cnt); \ - } - -static void ack (char *); -static void myoob (int); -static int handleoobcmd(void); -static int checkuser (char *, char *); -static int checkaccess (char *); -static FILE *dataconn (const char *, off_t, const char *); -static void dolog (struct sockaddr *, int); -static void end_login (void); -static FILE *getdatasock (const char *, int); -static char *gunique (char *); -static RETSIGTYPE lostconn (int); -static int receive_data (FILE *, FILE *); -static void send_data (FILE *, FILE *); -static struct passwd * sgetpwnam (char *); - -static char * -curdir(void) -{ - static char path[MaxPathLen+1]; /* path + '/' + '\0' */ - - if (getcwd(path, sizeof(path)-1) == NULL) - return (""); - if (path[1] != '\0') /* special case for root dir. */ - strlcat(path, "/", sizeof(path)); - /* For guest account, skip / since it's chrooted */ - return (guest ? path+1 : path); -} - -#ifndef LINE_MAX -#define LINE_MAX 1024 -#endif - -static int -parse_auth_level(char *str) -{ - char *p; - int ret = 0; - char *foo = NULL; - - for(p = strtok_r(str, ",", &foo); - p; - p = strtok_r(NULL, ",", &foo)) { - if(strcmp(p, "user") == 0) - ; -#ifdef OTP - else if(strcmp(p, "otp") == 0) - ret |= AUTH_PLAIN|AUTH_OTP; -#endif - else if(strcmp(p, "ftp") == 0 || - strcmp(p, "safe") == 0) - ret |= AUTH_FTP; - else if(strcmp(p, "plain") == 0) - ret |= AUTH_PLAIN; - else if(strcmp(p, "none") == 0) - ret |= AUTH_PLAIN|AUTH_FTP; - else - warnx("bad value for -a: `%s'", p); - } - return ret; -} - -/* - * Print usage and die. - */ - -static int interactive_flag; -static char *guest_umask_string; -static char *port_string; -static char *umask_string; -static char *auth_string; - -int use_builtin_ls = -1; - -static int help_flag; -static int version_flag; - -static const char *good_chars = "+-=_,."; - -struct getargs args[] = { - { NULL, 'a', arg_string, &auth_string, "required authentication" }, - { NULL, 'i', arg_flag, &interactive_flag, "don't assume stdin is a socket" }, - { NULL, 'p', arg_string, &port_string, "what port to listen to" }, - { NULL, 'g', arg_string, &guest_umask_string, "umask for guest logins" }, - { NULL, 'l', arg_counter, &logging, "log more stuff", "" }, - { NULL, 't', arg_integer, &ftpd_timeout, "initial timeout" }, - { NULL, 'T', arg_integer, &maxtimeout, "max timeout" }, - { NULL, 'u', arg_string, &umask_string, "umask for user logins" }, - { NULL, 'U', arg_negative_flag, &restricted_data_ports, "don't use high data ports" }, - { NULL, 'd', arg_flag, &debug, "enable debugging" }, - { NULL, 'v', arg_flag, &debug, "enable debugging" }, - { "builtin-ls", 'B', arg_flag, &use_builtin_ls, "use built-in ls to list files" }, - { "good-chars", 0, arg_string, &good_chars, "allowed anonymous upload filename chars" }, - { "insecure-oob", 'I', arg_negative_flag, &allow_insecure_oob, "don't allow insecure OOB ABOR/STAT" }, -#ifdef KRB5 - { "gss-bindings", 0, arg_flag, &ftp_do_gss_bindings, "Require GSS-API bindings", NULL}, -#endif - { "version", 0, arg_flag, &version_flag }, - { "help", 'h', arg_flag, &help_flag } -}; - -static int num_args = sizeof(args) / sizeof(args[0]); - -static void -usage (int code) -{ - arg_printusage(args, num_args, NULL, ""); - exit (code); -} - -/* output contents of a file */ -static int -show_file(const char *file, int code) -{ - FILE *f; - char buf[128]; - - f = fopen(file, "r"); - if(f == NULL) - return -1; - while(fgets(buf, sizeof(buf), f)){ - buf[strcspn(buf, "\r\n")] = '\0'; - lreply(code, "%s", buf); - } - fclose(f); - return 0; -} - -int -main(int argc, char **argv) -{ - socklen_t his_addr_len, ctrl_addr_len; - int on = 1; - int port; - struct servent *sp; - - int optind = 0; - - setprogname (argv[0]); - - if(getarg(args, num_args, argc, argv, &optind)) - usage(1); - - if(help_flag) - usage(0); - - if(version_flag) { - print_version(NULL); - exit(0); - } - - if(auth_string) - auth_level = parse_auth_level(auth_string); - { - char *p; - long val = 0; - - if(guest_umask_string) { - val = strtol(guest_umask_string, &p, 8); - if (*p != '\0' || val < 0) - warnx("bad value for -g"); - else - guest_umask = val; - } - if(umask_string) { - val = strtol(umask_string, &p, 8); - if (*p != '\0' || val < 0) - warnx("bad value for -u"); - else - defumask = val; - } - } - sp = getservbyname("ftp", "tcp"); - if(sp) - port = sp->s_port; - else - port = htons(21); - if(port_string) { - sp = getservbyname(port_string, "tcp"); - if(sp) - port = sp->s_port; - else - if(isdigit((unsigned char)port_string[0])) - port = htons(atoi(port_string)); - else - warnx("bad value for -p"); - } - - if (maxtimeout < ftpd_timeout) - maxtimeout = ftpd_timeout; - -#if 0 - if (ftpd_timeout > maxtimeout) - ftpd_timeout = maxtimeout; -#endif - - if(interactive_flag) - mini_inetd(port, NULL); - - /* - * LOG_NDELAY sets up the logging connection immediately, - * necessary for anonymous ftp's that chroot and can't do it later. - */ - openlog("ftpd", LOG_PID | LOG_NDELAY, LOG_FTP); - his_addr_len = sizeof(his_addr_ss); - if (getpeername(STDIN_FILENO, his_addr, &his_addr_len) < 0) { - syslog(LOG_ERR, "getpeername (%s): %m",argv[0]); - exit(1); - } - ctrl_addr_len = sizeof(ctrl_addr_ss); - if (getsockname(STDIN_FILENO, ctrl_addr, &ctrl_addr_len) < 0) { - syslog(LOG_ERR, "getsockname (%s): %m",argv[0]); - exit(1); - } -#if defined(IP_TOS) - if (ctrl_addr->sa_family == AF_INET) - socket_set_tos(STDIN_FILENO, IP_TOS); -#endif - data_source->sa_family = ctrl_addr->sa_family; - socket_set_port (data_source, - htons(ntohs(socket_get_port(ctrl_addr)) - 1)); - - /* set this here so it can be put in wtmp */ - snprintf(ttyline, sizeof(ttyline), "ftp%u", (unsigned)getpid()); - - - /* freopen(_PATH_DEVNULL, "w", stderr); */ - signal(SIGPIPE, lostconn); - signal(SIGCHLD, SIG_IGN); -#ifdef SIGURG - if (signal(SIGURG, myoob) == SIG_ERR) - syslog(LOG_ERR, "signal: %m"); -#endif - - /* Try to handle urgent data inline */ -#if defined(SO_OOBINLINE) && defined(HAVE_SETSOCKOPT) - if (setsockopt(0, SOL_SOCKET, SO_OOBINLINE, (void *)&on, - sizeof(on)) < 0) - syslog(LOG_ERR, "setsockopt: %m"); -#endif - -#ifdef F_SETOWN - if (fcntl(fileno(stdin), F_SETOWN, getpid()) == -1) - syslog(LOG_ERR, "fcntl F_SETOWN: %m"); -#endif - dolog(his_addr, his_addr_len); - /* - * Set up default state - */ - data = -1; - type = TYPE_A; - form = FORM_N; - stru = STRU_F; - mode = MODE_S; - tmpline[0] = '\0'; - - /* If logins are disabled, print out the message. */ - if(show_file(_PATH_NOLOGIN, 530) == 0) { - reply(530, "System not available."); - exit(0); - } - show_file(_PATH_FTPWELCOME, 220); - /* reply(220,) must follow */ - gethostname(hostname, sizeof(hostname)); - - reply(220, "%s FTP server (%s" -#ifdef KRB5 - "+%s" -#endif - ") ready.", hostname, version -#ifdef KRB5 - ,heimdal_version -#endif - ); - - for (;;) - yyparse(); - /* NOTREACHED */ -} - -static RETSIGTYPE -lostconn(int signo) -{ - - if (debug) - syslog(LOG_DEBUG, "lost connection"); - dologout(-1); -} - -/* - * Helper function for sgetpwnam(). - */ -static char * -sgetsave(char *s) -{ - char *new = strdup(s); - - if (new == NULL) { - perror_reply(421, "Local resource failure: malloc"); - dologout(1); - /* NOTREACHED */ - } - return new; -} - -/* - * Save the result of a getpwnam. Used for USER command, since - * the data returned must not be clobbered by any other command - * (e.g., globbing). - */ -static struct passwd * -sgetpwnam(char *name) -{ - static struct passwd save; - struct passwd *p; - - if ((p = k_getpwnam(name)) == NULL) - return (p); - if (save.pw_name) { - free(save.pw_name); - free(save.pw_passwd); - free(save.pw_gecos); - free(save.pw_dir); - free(save.pw_shell); - } - save = *p; - save.pw_name = sgetsave(p->pw_name); - save.pw_passwd = sgetsave(p->pw_passwd); - save.pw_gecos = sgetsave(p->pw_gecos); - save.pw_dir = sgetsave(p->pw_dir); - save.pw_shell = sgetsave(p->pw_shell); - return (&save); -} - -static int login_attempts; /* number of failed login attempts */ -static int askpasswd; /* had user command, ask for passwd */ -static char curname[10]; /* current USER name */ -#ifdef OTP -OtpContext otp_ctx; -#endif - -/* - * USER command. - * Sets global passwd pointer pw if named account exists and is acceptable; - * sets askpasswd if a PASS command is expected. If logged in previously, - * need to reset state. If name is "ftp" or "anonymous", the name is not in - * _PATH_FTPUSERS, and ftp account exists, set guest and pw, then just return. - * If account doesn't exist, ask for passwd anyway. Otherwise, check user - * requesting login privileges. Disallow anyone who does not have a standard - * shell as returned by getusershell(). Disallow anyone mentioned in the file - * _PATH_FTPUSERS to allow people such as root and uucp to be avoided. - */ -void -user(char *name) -{ - char *cp, *shell; - - if(auth_level == 0 && !sec_complete){ - reply(530, "No login allowed without authorization."); - return; - } - - if (logged_in) { - if (guest) { - reply(530, "Can't change user from guest login."); - return; - } else if (dochroot) { - reply(530, "Can't change user from chroot user."); - return; - } - end_login(); - } - - guest = 0; - if (strcmp(name, "ftp") == 0 || strcmp(name, "anonymous") == 0) { - if ((auth_level & AUTH_FTP) == 0 || - checkaccess("ftp") || - checkaccess("anonymous")) - reply(530, "User %s access denied.", name); - else if ((pw = sgetpwnam("ftp")) != NULL) { - guest = 1; - defumask = guest_umask; /* paranoia for incoming */ - askpasswd = 1; - reply(331, "Guest login ok, type your name as password."); - } else - reply(530, "User %s unknown.", name); - if (!askpasswd && logging) { - char data_addr[256]; - - if (inet_ntop (his_addr->sa_family, - socket_get_address(his_addr), - data_addr, sizeof(data_addr)) == NULL) - strlcpy (data_addr, "unknown address", - sizeof(data_addr)); - - syslog(LOG_NOTICE, - "ANONYMOUS FTP LOGIN REFUSED FROM %s(%s)", - remotehost, data_addr); - } - return; - } - if((auth_level & AUTH_PLAIN) == 0 && !sec_complete){ - reply(530, "Only authorized and anonymous login allowed."); - return; - } - if ((pw = sgetpwnam(name))) { - if ((shell = pw->pw_shell) == NULL || *shell == 0) - shell = _PATH_BSHELL; - while ((cp = getusershell()) != NULL) - if (strcmp(cp, shell) == 0) - break; - endusershell(); - - if (cp == NULL || checkaccess(name)) { - reply(530, "User %s access denied.", name); - if (logging) { - char data_addr[256]; - - if (inet_ntop (his_addr->sa_family, - socket_get_address(his_addr), - data_addr, - sizeof(data_addr)) == NULL) - strlcpy (data_addr, - "unknown address", - sizeof(data_addr)); - - syslog(LOG_NOTICE, - "FTP LOGIN REFUSED FROM %s(%s), %s", - remotehost, - data_addr, - name); - } - pw = (struct passwd *) NULL; - return; - } - } - if (logging) - strlcpy(curname, name, sizeof(curname)); - if(sec_complete) { - if(sec_userok(name) == 0) { - do_login(232, name); - sec_session(name); - } else - reply(530, "User %s access denied.", name); - } else { -#ifdef OTP - char ss[256]; - - if (otp_challenge(&otp_ctx, name, ss, sizeof(ss)) == 0) { - reply(331, "Password %s for %s required.", - ss, name); - askpasswd = 1; - } else -#endif - if ((auth_level & AUTH_OTP) == 0) { - reply(331, "Password required for %s.", name); - askpasswd = 1; - } else { -#ifdef OTP - char *s; - - if ((s = otp_error (&otp_ctx)) != NULL) - lreply(530, "OTP: %s", s); -#endif - reply(530, - "Only authorized, anonymous" -#ifdef OTP - " and OTP " -#endif - "login allowed."); - } - - } - /* - * Delay before reading passwd after first failed - * attempt to slow down passwd-guessing programs. - */ - if (login_attempts) - sleep(login_attempts); -} - -/* - * Check if a user is in the file "fname" - */ -static int -checkuser(char *fname, char *name) -{ - FILE *fd; - int found = 0; - char *p, line[BUFSIZ]; - - if ((fd = fopen(fname, "r")) != NULL) { - while (fgets(line, sizeof(line), fd) != NULL) - if ((p = strchr(line, '\n')) != NULL) { - *p = '\0'; - if (line[0] == '#') - continue; - if (strcmp(line, name) == 0) { - found = 1; - break; - } - } - fclose(fd); - } - return (found); -} - - -/* - * Determine whether a user has access, based on information in - * _PATH_FTPUSERS. The users are listed one per line, with `allow' - * or `deny' after the username. If anything other than `allow', or - * just nothing, is given after the username, `deny' is assumed. - * - * If the user is not found in the file, but the pseudo-user `*' is, - * the permission is taken from that line. - * - * This preserves the old semantics where if a user was listed in the - * file he was denied, otherwise he was allowed. - * - * Return 1 if the user is denied, or 0 if he is allowed. */ - -static int -match(const char *pattern, const char *string) -{ - return fnmatch(pattern, string, FNM_NOESCAPE); -} - -static int -checkaccess(char *name) -{ -#define ALLOWED 0 -#define NOT_ALLOWED 1 - FILE *fd; - int allowed = ALLOWED; - char *user, *perm, line[BUFSIZ]; - char *foo; - - fd = fopen(_PATH_FTPUSERS, "r"); - - if(fd == NULL) - return allowed; - - while (fgets(line, sizeof(line), fd) != NULL) { - foo = NULL; - user = strtok_r(line, " \t\n", &foo); - if (user == NULL || user[0] == '#') - continue; - perm = strtok_r(NULL, " \t\n", &foo); - if (match(user, name) == 0){ - if(perm && strcmp(perm, "allow") == 0) - allowed = ALLOWED; - else - allowed = NOT_ALLOWED; - break; - } - } - fclose(fd); - return allowed; -} -#undef ALLOWED -#undef NOT_ALLOWED - - -int do_login(int code, char *passwd) -{ - login_attempts = 0; /* this time successful */ - if (setegid((gid_t)pw->pw_gid) < 0) { - reply(550, "Can't set gid."); - return -1; - } - initgroups(pw->pw_name, pw->pw_gid); -#if defined(KRB5) - if(k_hasafs()) - k_setpag(); -#endif - - /* open wtmp before chroot */ - ftpd_logwtmp(ttyline, pw->pw_name, remotehost); - logged_in = 1; - - dochroot = checkuser(_PATH_FTPCHROOT, pw->pw_name); - if (guest) { - /* - * We MUST do a chdir() after the chroot. Otherwise - * the old current directory will be accessible as "." - * outside the new root! - */ - if (chroot(pw->pw_dir) < 0 || chdir("/") < 0) { - reply(550, "Can't set guest privileges."); - return -1; - } - } else if (dochroot) { - if (chroot(pw->pw_dir) < 0 || chdir("/") < 0) { - reply(550, "Can't change root."); - return -1; - } - } else if (chdir(pw->pw_dir) < 0) { - if (chdir("/") < 0) { - reply(530, "User %s: can't change directory to %s.", - pw->pw_name, pw->pw_dir); - return -1; - } else - lreply(code, "No directory! Logging in with home=/"); - } - if (seteuid((uid_t)pw->pw_uid) < 0) { - reply(550, "Can't set uid."); - return -1; - } - - if(use_builtin_ls == -1) { - struct stat st; - /* if /bin/ls exist and is a regular file, use it, otherwise - use built-in ls */ - if(stat("/bin/ls", &st) == 0 && - S_ISREG(st.st_mode)) - use_builtin_ls = 0; - else - use_builtin_ls = 1; - } - - /* - * Display a login message, if it exists. - * N.B. reply(code,) must follow the message. - */ - show_file(_PATH_FTPLOGINMESG, code); - if(show_file(_PATH_ISSUE_NET, code) != 0) - show_file(_PATH_ISSUE, code); - if (guest) { - reply(code, "Guest login ok, access restrictions apply."); -#ifdef HAVE_SETPROCTITLE - snprintf (proctitle, sizeof(proctitle), - "%s: anonymous/%s", - remotehost, - passwd); - setproctitle("%s", proctitle); -#endif /* HAVE_SETPROCTITLE */ - if (logging) { - char data_addr[256]; - - if (inet_ntop (his_addr->sa_family, - socket_get_address(his_addr), - data_addr, sizeof(data_addr)) == NULL) - strlcpy (data_addr, "unknown address", - sizeof(data_addr)); - - syslog(LOG_INFO, "ANONYMOUS FTP LOGIN FROM %s(%s), %s", - remotehost, - data_addr, - passwd); - } - } else { - reply(code, "User %s logged in.", pw->pw_name); -#ifdef HAVE_SETPROCTITLE - snprintf(proctitle, sizeof(proctitle), "%s: %s", remotehost, pw->pw_name); - setproctitle("%s", proctitle); -#endif /* HAVE_SETPROCTITLE */ - if (logging) { - char data_addr[256]; - - if (inet_ntop (his_addr->sa_family, - socket_get_address(his_addr), - data_addr, sizeof(data_addr)) == NULL) - strlcpy (data_addr, "unknown address", - sizeof(data_addr)); - - syslog(LOG_INFO, "FTP LOGIN FROM %s(%s) as %s", - remotehost, - data_addr, - pw->pw_name); - } - } - umask(defumask); - return 0; -} - -/* - * Terminate login as previous user, if any, resetting state; - * used when USER command is given or login fails. - */ -static void -end_login(void) -{ - - if (seteuid((uid_t)0) < 0) - fatal("Failed to seteuid"); - if (logged_in) - ftpd_logwtmp(ttyline, "", ""); - pw = NULL; - logged_in = 0; - guest = 0; - dochroot = 0; -} - -#ifdef KRB5 -static int -krb5_verify(struct passwd *pwd, char *passwd) -{ - krb5_context context; - krb5_ccache id; - krb5_principal princ; - krb5_error_code ret; - - ret = krb5_init_context(&context); - if(ret) - return ret; - - ret = krb5_parse_name(context, pwd->pw_name, &princ); - if(ret){ - krb5_free_context(context); - return ret; - } - ret = krb5_cc_new_unique(context, "MEMORY", NULL, &id); - if(ret){ - krb5_free_principal(context, princ); - krb5_free_context(context); - return ret; - } - ret = krb5_verify_user(context, - princ, - id, - passwd, - 1, - NULL); - krb5_free_principal(context, princ); - if (k_hasafs()) { - krb5_afslog_uid_home(context, id,NULL, NULL,pwd->pw_uid, pwd->pw_dir); - } - krb5_cc_destroy(context, id); - krb5_free_context (context); - if(ret) - return ret; - return 0; -} -#endif /* KRB5 */ - -void -pass(char *passwd) -{ - int rval; - - /* some clients insists on sending a password */ - if (logged_in && askpasswd == 0){ - reply(230, "Password not necessary"); - return; - } - - if (logged_in || askpasswd == 0) { - reply(503, "Login with USER first."); - return; - } - askpasswd = 0; - rval = 1; - if (!guest) { /* "ftp" is only account allowed no password */ - if (pw == NULL) - rval = 1; /* failure below */ -#ifdef OTP - else if (otp_verify_user (&otp_ctx, passwd) == 0) { - rval = 0; - } -#endif - else if((auth_level & AUTH_OTP) == 0) { -#ifdef KRB5 - rval = krb5_verify(pw, passwd); -#endif - if (rval) - rval = unix_verify_user(pw->pw_name, passwd); - } else { -#ifdef OTP - char *s; - if ((s = otp_error(&otp_ctx)) != NULL) - lreply(530, "OTP: %s", s); -#endif - } - memset (passwd, 0, strlen(passwd)); - - /* - * If rval == 1, the user failed the authentication - * check above. If rval == 0, either Kerberos or - * local authentication succeeded. - */ - if (rval) { - char data_addr[256]; - - if (inet_ntop (his_addr->sa_family, - socket_get_address(his_addr), - data_addr, sizeof(data_addr)) == NULL) - strlcpy (data_addr, "unknown address", - sizeof(data_addr)); - - reply(530, "Login incorrect."); - if (logging) - syslog(LOG_NOTICE, - "FTP LOGIN FAILED FROM %s(%s), %s", - remotehost, - data_addr, - curname); - pw = NULL; - if (login_attempts++ >= 5) { - syslog(LOG_NOTICE, - "repeated login failures from %s(%s)", - remotehost, - data_addr); - exit(0); - } - return; - } - } - if(!do_login(230, passwd)) - return; - - /* Forget all about it... */ - end_login(); -} - -void -retrieve(const char *cmd, char *name) -{ - FILE *fin = NULL, *dout; - struct stat st; - int (*closefunc) (FILE *); - char line[BUFSIZ]; - - - if (cmd == 0) { - fin = fopen(name, "r"); - closefunc = fclose; - st.st_size = 0; - if(fin == NULL){ - int save_errno = errno; - struct cmds { - const char *ext; - const char *cmd; - const char *rev_cmd; - } cmds[] = { - {".tar", "/bin/gtar cPf - %s", NULL}, - {".tar.gz", "/bin/gtar zcPf - %s", NULL}, - {".tar.Z", "/bin/gtar ZcPf - %s", NULL}, - {".gz", "/bin/gzip -c -- %s", "/bin/gzip -c -d -- %s"}, - {".Z", "/bin/compress -c -- %s", "/bin/uncompress -c -- %s"}, - {NULL, NULL} - }; - struct cmds *p; - for(p = cmds; p->ext; p++){ - char *tail = name + strlen(name) - strlen(p->ext); - char c = *tail; - - if(strcmp(tail, p->ext) == 0 && - (*tail = 0) == 0 && - access(name, R_OK) == 0){ - snprintf (line, sizeof(line), p->cmd, name); - *tail = c; - break; - } - *tail = c; - if (p->rev_cmd != NULL) { - char *ext; - int ret; - - ret = asprintf(&ext, "%s%s", name, p->ext); - if (ret != -1) { - if (access(ext, R_OK) == 0) { - snprintf (line, sizeof(line), - p->rev_cmd, ext); - free(ext); - break; - } - free(ext); - } - } - - } - if(p->ext){ - fin = ftpd_popen(line, "r", 0, 0); - closefunc = ftpd_pclose; - st.st_size = -1; - cmd = line; - } else - errno = save_errno; - } - } else { - snprintf(line, sizeof(line), cmd, name); - name = line; - fin = ftpd_popen(line, "r", 1, 0); - closefunc = ftpd_pclose; - st.st_size = -1; - } - if (fin == NULL) { - if (errno != 0) { - perror_reply(550, name); - if (cmd == 0) { - LOGCMD("get", name); - } - } - return; - } - byte_count = -1; - if (cmd == 0){ - if(fstat(fileno(fin), &st) < 0 || !S_ISREG(st.st_mode)) { - reply(550, "%s: not a plain file.", name); - goto done; - } - } - if (restart_point) { - if (type == TYPE_A) { - off_t i, n; - int c; - - n = restart_point; - i = 0; - while (i++ < n) { - if ((c=getc(fin)) == EOF) { - perror_reply(550, name); - goto done; - } - if (c == '\n') - i++; - } - } else if (lseek(fileno(fin), restart_point, SEEK_SET) < 0) { - perror_reply(550, name); - goto done; - } - } - dout = dataconn(name, st.st_size, "w"); - if (dout == NULL) - goto done; - set_buffer_size(fileno(dout), 0); - send_data(fin, dout); - fclose(dout); - data = -1; - pdata = -1; -done: - if (cmd == 0) - LOGBYTES("get", name, byte_count); - (*closefunc)(fin); -} - -/* filename sanity check */ - -int -filename_check(char *filename) -{ - char *p; - - p = strrchr(filename, '/'); - if(p) - filename = p + 1; - - p = filename; - - if(isalnum((unsigned char)*p)){ - p++; - while(*p && (isalnum((unsigned char)*p) || strchr(good_chars, (unsigned char)*p))) - p++; - if(*p == '\0') - return 0; - } - lreply(553, "\"%s\" is not an acceptable filename.", filename); - lreply(553, "The filename must start with an alphanumeric " - "character and must only"); - reply(553, "consist of alphanumeric characters or any of the following: %s", - good_chars); - return 1; -} - -void -do_store(char *name, char *mode, int unique) -{ - FILE *fout, *din; - struct stat st; - int (*closefunc) (FILE *); - - if(guest && filename_check(name)) - return; - if (unique) { - char *uname; - if (stat(name, &st) == 0) { - if ((uname = gunique(name)) == NULL) - return; - name = uname; - } - LOGCMD(*mode == 'w' ? "put" : "append", name); - } - - if (restart_point) - mode = "r+"; - fout = fopen(name, mode); - closefunc = fclose; - if (fout == NULL) { - perror_reply(553, name); - LOGCMD(*mode == 'w' ? "put" : "append", name); - return; - } - byte_count = -1; - if (restart_point) { - if (type == TYPE_A) { - off_t i, n; - int c; - - n = restart_point; - i = 0; - while (i++ < n) { - if ((c=getc(fout)) == EOF) { - perror_reply(550, name); - goto done; - } - if (c == '\n') - i++; - } - /* - * We must do this seek to "current" position - * because we are changing from reading to - * writing. - */ - if (fseek(fout, 0L, SEEK_CUR) < 0) { - perror_reply(550, name); - goto done; - } - } else if (lseek(fileno(fout), restart_point, SEEK_SET) < 0) { - perror_reply(550, name); - goto done; - } - } - din = dataconn(name, (off_t)-1, "r"); - if (din == NULL) - goto done; - set_buffer_size(fileno(din), 1); - if (receive_data(din, fout) == 0) { - if((*closefunc)(fout) < 0) - perror_reply(552, name); - else { - if (unique) - reply(226, "Transfer complete (unique file name:%s).", - name); - else - reply(226, "Transfer complete."); - } - } else - (*closefunc)(fout); - fclose(din); - data = -1; - pdata = -1; -done: - LOGBYTES(*mode == 'w' ? "put" : "append", name, byte_count); -} - -static FILE * -getdatasock(const char *mode, int domain) -{ - int s, t, tries; - - if (data >= 0) - return (fdopen(data, mode)); - if (seteuid(0) < 0) - fatal("Failed to seteuid"); - s = socket(domain, SOCK_STREAM, 0); - if (s < 0) - goto bad; - socket_set_reuseaddr (s, 1); - /* anchor socket to avoid multi-homing problems */ - socket_set_address_and_port (data_source, - socket_get_address (ctrl_addr), - socket_get_port (data_source)); - - for (tries = 1; ; tries++) { - if (bind(s, data_source, - socket_sockaddr_size (data_source)) >= 0) - break; - if (errno != EADDRINUSE || tries > 10) - goto bad; - sleep(tries); - } - if (seteuid(pw->pw_uid) < 0) - fatal("Failed to seteuid"); -#ifdef IPTOS_THROUGHPUT - socket_set_tos (s, IPTOS_THROUGHPUT); -#endif - return (fdopen(s, mode)); -bad: - /* Return the real value of errno (close may change it) */ - t = errno; - if (seteuid((uid_t)pw->pw_uid) < 0) - fatal("Failed to seteuid"); - close(s); - errno = t; - return (NULL); -} - -static int -accept_with_timeout(int socket, - struct sockaddr *address, - socklen_t *address_len, - struct timeval *timeout) -{ - int ret; - fd_set rfd; - FD_ZERO(&rfd); - FD_SET(socket, &rfd); - ret = select(socket + 1, &rfd, NULL, NULL, timeout); - if(ret < 0) - return ret; - if(ret == 0) { - errno = ETIMEDOUT; - return -1; - } - return accept(socket, address, address_len); -} - -static FILE * -dataconn(const char *name, off_t size, const char *mode) -{ - char sizebuf[32]; - FILE *file; - int domain, retry = 0; - - file_size = size; - byte_count = 0; - if (size >= 0) - snprintf(sizebuf, sizeof(sizebuf), " (%ld bytes)", (long)size); - else - *sizebuf = '\0'; - if (pdata >= 0) { - struct sockaddr_storage from_ss; - struct sockaddr *from = (struct sockaddr *)&from_ss; - struct timeval timeout; - int s; - socklen_t fromlen = sizeof(from_ss); - - timeout.tv_sec = 15; - timeout.tv_usec = 0; - s = accept_with_timeout(pdata, from, &fromlen, &timeout); - if (s < 0) { - reply(425, "Can't open data connection."); - close(pdata); - pdata = -1; - return (NULL); - } - close(pdata); - pdata = s; -#if defined(IPTOS_THROUGHPUT) - if (from->sa_family == AF_INET) - socket_set_tos(s, IPTOS_THROUGHPUT); -#endif - reply(150, "Opening %s mode data connection for '%s'%s.", - type == TYPE_A ? "ASCII" : "BINARY", name, sizebuf); - return (fdopen(pdata, mode)); - } - if (data >= 0) { - reply(125, "Using existing data connection for '%s'%s.", - name, sizebuf); - usedefault = 1; - return (fdopen(data, mode)); - } - if (usedefault) - data_dest = his_addr; - usedefault = 1; - /* - * Default to using the same socket type as the ctrl address, - * unless we know the type of the data address. - */ - domain = data_dest->sa_family; - if (domain == PF_UNSPEC) - domain = ctrl_addr->sa_family; - - file = getdatasock(mode, domain); - if (file == NULL) { - char data_addr[256]; - - if (inet_ntop (data_source->sa_family, - socket_get_address(data_source), - data_addr, sizeof(data_addr)) == NULL) - strlcpy (data_addr, "unknown address", - sizeof(data_addr)); - - reply(425, "Can't create data socket (%s,%d): %s.", - data_addr, - socket_get_port (data_source), - strerror(errno)); - return (NULL); - } - data = fileno(file); - while (connect(data, data_dest, - socket_sockaddr_size(data_dest)) < 0) { - if (errno == EADDRINUSE && retry < swaitmax) { - sleep(swaitint); - retry += swaitint; - continue; - } - perror_reply(425, "Can't build data connection"); - fclose(file); - data = -1; - return (NULL); - } - reply(150, "Opening %s mode data connection for '%s'%s.", - type == TYPE_A ? "ASCII" : "BINARY", name, sizebuf); - return (file); -} - -/* - * Tranfer the contents of "instr" to "outstr" peer using the appropriate - * encapsulation of the data subject * to Mode, Structure, and Type. - * - * NB: Form isn't handled. - */ -static void -send_data(FILE *instr, FILE *outstr) -{ - int c, cnt, filefd, netfd; - static char *buf; - static size_t bufsize; - - transflag = 1; - switch (type) { - - case TYPE_A: - while ((c = getc(instr)) != EOF) { - if (urgflag && handleoobcmd()) - return; - byte_count++; - if(c == '\n') - sec_putc('\r', outstr); - sec_putc(c, outstr); - } - sec_fflush(outstr); - transflag = 0; - urgflag = 0; - if (ferror(instr)) - goto file_err; - if (ferror(outstr)) - goto data_err; - reply(226, "Transfer complete."); - return; - - case TYPE_I: - case TYPE_L: -#if 0 /* XXX handle urg flag */ -#if defined(HAVE_MMAP) && !defined(NO_MMAP) -#ifndef MAP_FAILED -#define MAP_FAILED (-1) -#endif - { - struct stat st; - char *chunk; - int in = fileno(instr); - if(fstat(in, &st) == 0 && S_ISREG(st.st_mode) - && st.st_size > 0) { - /* - * mmap zero bytes has potential of loosing, don't do it. - */ - chunk = mmap(0, st.st_size, PROT_READ, - MAP_SHARED, in, 0); - if((void *)chunk != (void *)MAP_FAILED) { - cnt = st.st_size - restart_point; - sec_write(fileno(outstr), chunk + restart_point, cnt); - if (munmap(chunk, st.st_size) < 0) - warn ("munmap"); - sec_fflush(outstr); - byte_count = cnt; - transflag = 0; - urgflag = 0; - } - } - } -#endif -#endif - if(transflag) { - struct stat st; - - netfd = fileno(outstr); - filefd = fileno(instr); - buf = alloc_buffer (buf, &bufsize, - fstat(filefd, &st) >= 0 ? &st : NULL); - if (buf == NULL) { - transflag = 0; - urgflag = 0; - perror_reply(451, "Local resource failure: malloc"); - return; - } - while ((cnt = read(filefd, buf, bufsize)) > 0 && - sec_write(netfd, buf, cnt) == cnt) { - byte_count += cnt; - if (urgflag && handleoobcmd()) - return; - } - sec_fflush(outstr); /* to end an encrypted stream */ - transflag = 0; - urgflag = 0; - if (cnt != 0) { - if (cnt < 0) - goto file_err; - goto data_err; - } - } - reply(226, "Transfer complete."); - return; - default: - transflag = 0; - urgflag = 0; - reply(550, "Unimplemented TYPE %d in send_data", type); - return; - } - -data_err: - transflag = 0; - urgflag = 0; - perror_reply(426, "Data connection"); - return; - -file_err: - transflag = 0; - urgflag = 0; - perror_reply(551, "Error on input file"); -} - -/* - * Transfer data from peer to "outstr" using the appropriate encapulation of - * the data subject to Mode, Structure, and Type. - * - * N.B.: Form isn't handled. - */ -static int -receive_data(FILE *instr, FILE *outstr) -{ - int cnt, bare_lfs = 0; - static char *buf; - static size_t bufsize; - struct stat st; - - transflag = 1; - - buf = alloc_buffer (buf, &bufsize, - fstat(fileno(outstr), &st) >= 0 ? &st : NULL); - if (buf == NULL) { - transflag = 0; - urgflag = 0; - perror_reply(451, "Local resource failure: malloc"); - return -1; - } - - switch (type) { - - case TYPE_I: - case TYPE_L: - while ((cnt = sec_read(fileno(instr), buf, bufsize)) > 0) { - if (write(fileno(outstr), buf, cnt) != cnt) - goto file_err; - byte_count += cnt; - if (urgflag && handleoobcmd()) - return (-1); - } - if (cnt < 0) - goto data_err; - transflag = 0; - urgflag = 0; - return (0); - - case TYPE_E: - reply(553, "TYPE E not implemented."); - transflag = 0; - urgflag = 0; - return (-1); - - case TYPE_A: - { - char *p, *q; - int cr_flag = 0; - while ((cnt = sec_read(fileno(instr), - buf + cr_flag, - bufsize - cr_flag)) > 0){ - if (urgflag && handleoobcmd()) - return (-1); - byte_count += cnt; - cnt += cr_flag; - cr_flag = 0; - for(p = buf, q = buf; p < buf + cnt;) { - if(*p == '\n') - bare_lfs++; - if(*p == '\r') { - if(p == buf + cnt - 1){ - cr_flag = 1; - p++; - continue; - }else if(p[1] == '\n'){ - *q++ = '\n'; - p += 2; - continue; - } - } - *q++ = *p++; - } - fwrite(buf, q - buf, 1, outstr); - if(cr_flag) - buf[0] = '\r'; - } - if(cr_flag) - putc('\r', outstr); - fflush(outstr); - if (ferror(instr)) - goto data_err; - if (ferror(outstr)) - goto file_err; - transflag = 0; - urgflag = 0; - if (bare_lfs) { - lreply(226, "WARNING! %d bare linefeeds received in ASCII mode\r\n" - " File may not have transferred correctly.\r\n", - bare_lfs); - } - return (0); - } - default: - reply(550, "Unimplemented TYPE %d in receive_data", type); - transflag = 0; - urgflag = 0; - return (-1); - } - -data_err: - transflag = 0; - urgflag = 0; - perror_reply(426, "Data Connection"); - return (-1); - -file_err: - transflag = 0; - urgflag = 0; - perror_reply(452, "Error writing file"); - return (-1); -} - -void -statfilecmd(char *filename) -{ - FILE *fin; - int c; - char line[LINE_MAX]; - - snprintf(line, sizeof(line), "/bin/ls -la -- %s", filename); - fin = ftpd_popen(line, "r", 1, 0); - lreply(211, "status of %s:", filename); - while ((c = getc(fin)) != EOF) { - if (c == '\n') { - if (ferror(stdout)){ - perror_reply(421, "control connection"); - ftpd_pclose(fin); - dologout(1); - /* NOTREACHED */ - } - if (ferror(fin)) { - perror_reply(551, filename); - ftpd_pclose(fin); - return; - } - putc('\r', stdout); - } - putc(c, stdout); - } - ftpd_pclose(fin); - reply(211, "End of Status"); -} - -void -statcmd(void) -{ -#if 0 - struct sockaddr_in *sin; - u_char *a, *p; - - lreply(211, "%s FTP server (%s) status:", hostname, version); - printf(" %s\r\n", version); - printf(" Connected to %s", remotehost); - if (!isdigit((unsigned char)remotehost[0])) - printf(" (%s)", inet_ntoa(his_addr.sin_addr)); - printf("\r\n"); - if (logged_in) { - if (guest) - printf(" Logged in anonymously\r\n"); - else - printf(" Logged in as %s\r\n", pw->pw_name); - } else if (askpasswd) - printf(" Waiting for password\r\n"); - else - printf(" Waiting for user name\r\n"); - printf(" TYPE: %s", typenames[type]); - if (type == TYPE_A || type == TYPE_E) - printf(", FORM: %s", formnames[form]); - if (type == TYPE_L) -#if NBBY == 8 - printf(" %d", NBBY); -#else - printf(" %d", bytesize); /* need definition! */ -#endif - printf("; STRUcture: %s; transfer MODE: %s\r\n", - strunames[stru], modenames[mode]); - if (data != -1) - printf(" Data connection open\r\n"); - else if (pdata != -1) { - printf(" in Passive mode"); - sin = &pasv_addr; - goto printaddr; - } else if (usedefault == 0) { - printf(" PORT"); - sin = &data_dest; -printaddr: - a = (u_char *) &sin->sin_addr; - p = (u_char *) &sin->sin_port; -#define UC(b) (((int) b) & 0xff) - printf(" (%d,%d,%d,%d,%d,%d)\r\n", UC(a[0]), - UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1])); -#undef UC - } else - printf(" No data connection\r\n"); -#endif - reply(211, "End of status"); -} - -void -fatal(char *s) -{ - - reply(451, "Error in server: %s\n", s); - reply(221, "Closing connection due to server error."); - dologout(0); - /* NOTREACHED */ -} - -static void -int_reply(int, char *, const char *, va_list) -#ifdef __GNUC__ -__attribute__ ((format (printf, 3, 0))) -#endif -; - -static void -int_reply(int n, char *c, const char *fmt, va_list ap) -{ - char buf[10240]; - char *p; - p=buf; - if(n){ - snprintf(p, sizeof(buf), "%d%s", n, c); - p+=strlen(p); - } - vsnprintf(p, sizeof(buf) - strlen(p), fmt, ap); - p+=strlen(p); - snprintf(p, sizeof(buf) - strlen(p), "\r\n"); - p+=strlen(p); - sec_fprintf(stdout, "%s", buf); - fflush(stdout); - if (debug) - syslog(LOG_DEBUG, "<--- %s- ", buf); -} - -void -reply(int n, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - int_reply(n, " ", fmt, ap); - delete_ftp_command(); - va_end(ap); -} - -void -lreply(int n, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - int_reply(n, "-", fmt, ap); - va_end(ap); -} - -void -nreply(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - int_reply(0, NULL, fmt, ap); - va_end(ap); -} - -static void -ack(char *s) -{ - - reply(250, "%s command successful.", s); -} - -void -nack(char *s) -{ - - reply(502, "%s command not implemented.", s); -} - -void -do_delete(char *name) -{ - struct stat st; - - LOGCMD("delete", name); - if (stat(name, &st) < 0) { - perror_reply(550, name); - return; - } - if (S_ISDIR(st.st_mode)) { - if (rmdir(name) < 0) { - perror_reply(550, name); - return; - } - goto done; - } - if (unlink(name) < 0) { - perror_reply(550, name); - return; - } -done: - ack("DELE"); -} - -void -cwd(const char *path) -{ - - if (chdir(path) < 0) - perror_reply(550, path); - else - ack("CWD"); -} - -void -makedir(char *name) -{ - - LOGCMD("mkdir", name); - if(guest && filename_check(name)) - return; - if (mkdir(name, 0777) < 0) - perror_reply(550, name); - else{ - if(guest) - chmod(name, 0700); /* guest has umask 777 */ - reply(257, "MKD command successful."); - } -} - -void -removedir(char *name) -{ - - LOGCMD("rmdir", name); - if (rmdir(name) < 0) - perror_reply(550, name); - else - ack("RMD"); -} - -void -pwd(void) -{ - char path[MaxPathLen]; - char *ret; - - /* SunOS has a broken getcwd that does popen(pwd) (!!!), this - * failes miserably when running chroot - */ - ret = getcwd(path, sizeof(path)); - if (ret == NULL) - reply(550, "%s.", strerror(errno)); - else - reply(257, "\"%s\" is current directory.", path); -} - -char * -renamefrom(char *name) -{ - struct stat st; - - if (stat(name, &st) < 0) { - perror_reply(550, name); - return NULL; - } - reply(350, "File exists, ready for destination name"); - return (name); -} - -void -renamecmd(char *from, char *to) -{ - - LOGCMD2("rename", from, to); - if(guest && filename_check(to)) - return; - if (rename(from, to) < 0) - perror_reply(550, "rename"); - else - ack("RNTO"); -} - -static void -dolog(struct sockaddr *sa, int len) -{ - getnameinfo_verified (sa, len, remotehost, sizeof(remotehost), - NULL, 0, 0); -#ifdef HAVE_SETPROCTITLE - snprintf(proctitle, sizeof(proctitle), "%s: connected", remotehost); - setproctitle("%s", proctitle); -#endif /* HAVE_SETPROCTITLE */ - - if (logging) { - char data_addr[256]; - - if (inet_ntop (his_addr->sa_family, - socket_get_address(his_addr), - data_addr, sizeof(data_addr)) == NULL) - strlcpy (data_addr, "unknown address", - sizeof(data_addr)); - - - syslog(LOG_INFO, "connection from %s(%s)", - remotehost, - data_addr); - } -} - -/* - * Record logout in wtmp file - * and exit with supplied status. - */ -void -dologout(int status) -{ - transflag = 0; - urgflag = 0; - if (logged_in) { -#if KRB5 - cond_kdestroy(); -#endif - seteuid((uid_t)0); /* No need to check, we call exit() below */ - ftpd_logwtmp(ttyline, "", ""); - } - /* beware of flushing buffers after a SIGPIPE */ -#ifdef XXX - exit(status); -#else - _exit(status); -#endif -} - -void abor(void) -{ - if (!transflag) - return; - reply(426, "Transfer aborted. Data connection closed."); - reply(226, "Abort successful"); - transflag = 0; -} - -static void -myoob(int signo) -{ - urgflag = 1; -} - -static char * -mec_space(char *p) -{ - while(isspace(*(unsigned char *)p)) - p++; - return p; -} - -static int -handleoobcmd(void) -{ - char *cp; - - /* only process if transfer occurring */ - if (!transflag) - return 0; - - urgflag = 0; - - cp = tmpline; - if (ftpd_getline(cp, sizeof(tmpline)) == NULL) { - reply(221, "You could at least say goodbye."); - dologout(0); - } - - if (strncasecmp("MIC", cp, 3) == 0) { - mec(mec_space(cp + 3), prot_safe); - } else if (strncasecmp("CONF", cp, 4) == 0) { - mec(mec_space(cp + 4), prot_confidential); - } else if (strncasecmp("ENC", cp, 3) == 0) { - mec(mec_space(cp + 3), prot_private); - } else if (!allow_insecure_oob) { - reply(533, "Command protection level denied " - "for paranoid reasons."); - goto out; - } - - if (secure_command()) - cp = ftp_command; - - if (strcasecmp(cp, "ABOR\r\n") == 0) { - abor(); - } else if (strcasecmp(cp, "STAT\r\n") == 0) { - if (file_size != (off_t) -1) - reply(213, "Status: %ld of %ld bytes transferred", - (long)byte_count, - (long)file_size); - else - reply(213, "Status: %ld bytes transferred", - (long)byte_count); - } -out: - return (transflag == 0); -} - -/* - * Note: a response of 425 is not mentioned as a possible response to - * the PASV command in RFC959. However, it has been blessed as - * a legitimate response by Jon Postel in a telephone conversation - * with Rick Adams on 25 Jan 89. - */ -void -pasv(void) -{ - socklen_t len; - char *p, *a; - struct sockaddr_in *sin; - - if (ctrl_addr->sa_family != AF_INET) { - reply(425, - "You cannot do PASV with something that's not IPv4"); - return; - } - - if(pdata != -1) - close(pdata); - - pdata = socket(ctrl_addr->sa_family, SOCK_STREAM, 0); - if (pdata < 0) { - perror_reply(425, "Can't open passive connection"); - return; - } - pasv_addr->sa_family = ctrl_addr->sa_family; - socket_set_address_and_port (pasv_addr, - socket_get_address (ctrl_addr), - 0); - socket_set_portrange(pdata, restricted_data_ports, - pasv_addr->sa_family); - if (seteuid(0) < 0) - fatal("Failed to seteuid"); - if (bind(pdata, pasv_addr, socket_sockaddr_size (pasv_addr)) < 0) { - if (seteuid(pw->pw_uid) < 0) - fatal("Failed to seteuid"); - goto pasv_error; - } - if (seteuid(pw->pw_uid) < 0) - fatal("Failed to seteuid"); - len = sizeof(pasv_addr_ss); - if (getsockname(pdata, pasv_addr, &len) < 0) - goto pasv_error; - if (listen(pdata, 1) < 0) - goto pasv_error; - sin = (struct sockaddr_in *)pasv_addr; - a = (char *) &sin->sin_addr; - p = (char *) &sin->sin_port; - -#define UC(b) (((int) b) & 0xff) - - reply(227, "Entering Passive Mode (%d,%d,%d,%d,%d,%d)", UC(a[0]), - UC(a[1]), UC(a[2]), UC(a[3]), UC(p[0]), UC(p[1])); - return; - -pasv_error: - close(pdata); - pdata = -1; - perror_reply(425, "Can't open passive connection"); - return; -} - -void -epsv(char *proto) -{ - socklen_t len; - - pdata = socket(ctrl_addr->sa_family, SOCK_STREAM, 0); - if (pdata < 0) { - perror_reply(425, "Can't open passive connection"); - return; - } - pasv_addr->sa_family = ctrl_addr->sa_family; - socket_set_address_and_port (pasv_addr, - socket_get_address (ctrl_addr), - 0); - socket_set_portrange(pdata, restricted_data_ports, - pasv_addr->sa_family); - if (seteuid(0) < 0) - fatal("Failed to seteuid"); - if (bind(pdata, pasv_addr, socket_sockaddr_size (pasv_addr)) < 0) { - if (seteuid(pw->pw_uid)) - fatal("Failed to seteuid"); - goto pasv_error; - } - if (seteuid(pw->pw_uid) < 0) - fatal("Failed to seteuid"); - len = sizeof(pasv_addr_ss); - if (getsockname(pdata, pasv_addr, &len) < 0) - goto pasv_error; - if (listen(pdata, 1) < 0) - goto pasv_error; - - reply(229, "Entering Extended Passive Mode (|||%d|)", - ntohs(socket_get_port (pasv_addr))); - return; - -pasv_error: - close(pdata); - pdata = -1; - perror_reply(425, "Can't open passive connection"); - return; -} - -void -eprt(char *str) -{ - char *end; - char sep; - int af; - int ret; - int port; - - usedefault = 0; - if (pdata >= 0) { - close(pdata); - pdata = -1; - } - - sep = *str++; - if (sep == '\0') { - reply(500, "Bad syntax in EPRT"); - return; - } - af = strtol (str, &end, 0); - if (af == 0 || *end != sep) { - reply(500, "Bad syntax in EPRT"); - return; - } - str = end + 1; - switch (af) { -#ifdef HAVE_IPV6 - case 2 : - data_dest->sa_family = AF_INET6; - break; -#endif - case 1 : - data_dest->sa_family = AF_INET; - break; - default : - reply(522, "Network protocol %d not supported, use (1" -#ifdef HAVE_IPV6 - ",2" -#endif - ")", af); - return; - } - end = strchr (str, sep); - if (end == NULL) { - reply(500, "Bad syntax in EPRT"); - return; - } - *end = '\0'; - ret = inet_pton (data_dest->sa_family, str, - socket_get_address (data_dest)); - - if (ret != 1) { - reply(500, "Bad address syntax in EPRT"); - return; - } - str = end + 1; - port = strtol (str, &end, 0); - if (port == 0 || *end != sep) { - reply(500, "Bad port syntax in EPRT"); - return; - } - if (port < IPPORT_RESERVED) { - reply(500, "Bad port in invalid range in EPRT"); - return; - } - socket_set_port (data_dest, htons(port)); - - if (paranoid && - (data_dest->sa_family != his_addr->sa_family || - memcmp(socket_get_address(data_dest), socket_get_address(his_addr), socket_sockaddr_size(data_dest)) != 0)) - { - reply(500, "Bad address in EPRT"); - } - reply(200, "EPRT command successful."); -} - -/* - * Generate unique name for file with basename "local". - * The file named "local" is already known to exist. - * Generates failure reply on error. - */ -static char * -gunique(char *local) -{ - static char new[MaxPathLen]; - struct stat st; - int count; - char *cp; - - cp = strrchr(local, '/'); - if (cp) - *cp = '\0'; - if (stat(cp ? local : ".", &st) < 0) { - perror_reply(553, cp ? local : "."); - return NULL; - } - if (cp) - *cp = '/'; - for (count = 1; count < 100; count++) { - snprintf (new, sizeof(new), "%s.%d", local, count); - if (stat(new, &st) < 0) - return (new); - } - reply(452, "Unique file name cannot be created."); - return (NULL); -} - -/* - * Format and send reply containing system error number. - */ -void -perror_reply(int code, const char *string) -{ - reply(code, "%s: %s.", string, strerror(errno)); -} - -static char *onefile[] = { - "", - 0 -}; - -void -list_file(char *file) -{ - if(use_builtin_ls) { - FILE *dout; - dout = dataconn(file, -1, "w"); - if (dout == NULL) - return; - set_buffer_size(fileno(dout), 0); - if(builtin_ls(dout, file) == 0) - reply(226, "Transfer complete."); - else - reply(451, "Requested action aborted. Local error in processing."); - fclose(dout); - data = -1; - pdata = -1; - } else { -#ifdef HAVE_LS_A - const char *cmd = "/bin/ls -lA %s"; -#else - const char *cmd = "/bin/ls -la %s"; -#endif - retrieve(cmd, file); - } -} - -void -send_file_list(char *whichf) -{ - struct stat st; - DIR *dirp = NULL; - struct dirent *dir; - FILE *dout = NULL; - char **dirlist, *dirname; - int simple = 0; - int freeglob = 0; - glob_t gl; - char buf[MaxPathLen]; - - if (strpbrk(whichf, "~{[*?") != NULL) { - int flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE| -#ifdef GLOB_MAXPATH - GLOB_MAXPATH -#else - GLOB_LIMIT -#endif - ; - - memset(&gl, 0, sizeof(gl)); - freeglob = 1; - if (glob(whichf, flags, 0, &gl)) { - reply(550, "not found"); - goto out; - } else if (gl.gl_pathc == 0) { - errno = ENOENT; - perror_reply(550, whichf); - goto out; - } - dirlist = gl.gl_pathv; - } else { - onefile[0] = whichf; - dirlist = onefile; - simple = 1; - } - - while ((dirname = *dirlist++)) { - - if (urgflag && handleoobcmd()) - goto out; - - if (stat(dirname, &st) < 0) { - /* - * If user typed "ls -l", etc, and the client - * used NLST, do what the user meant. - */ - if (dirname[0] == '-' && *dirlist == NULL && - transflag == 0) { - list_file(dirname); - goto out; - } - perror_reply(550, whichf); - goto out; - } - - if (S_ISREG(st.st_mode)) { - if (dout == NULL) { - dout = dataconn("file list", (off_t)-1, "w"); - if (dout == NULL) - goto out; - transflag = 1; - } - snprintf(buf, sizeof(buf), "%s%s\n", dirname, - type == TYPE_A ? "\r" : ""); - sec_write(fileno(dout), buf, strlen(buf)); - byte_count += strlen(dirname) + 1; - continue; - } else if (!S_ISDIR(st.st_mode)) - continue; - - if ((dirp = opendir(dirname)) == NULL) - continue; - - while ((dir = readdir(dirp)) != NULL) { - char nbuf[MaxPathLen]; - - if (urgflag && handleoobcmd()) - goto out; - - if (!strcmp(dir->d_name, ".")) - continue; - if (!strcmp(dir->d_name, "..")) - continue; - - snprintf(nbuf, sizeof(nbuf), "%s/%s", dirname, dir->d_name); - - /* - * We have to do a stat to insure it's - * not a directory or special file. - */ - if (simple || (stat(nbuf, &st) == 0 && - S_ISREG(st.st_mode))) { - if (dout == NULL) { - dout = dataconn("file list", (off_t)-1, "w"); - if (dout == NULL) - goto out; - transflag = 1; - } - if(strncmp(nbuf, "./", 2) == 0) - snprintf(buf, sizeof(buf), "%s%s\n", nbuf +2, - type == TYPE_A ? "\r" : ""); - else - snprintf(buf, sizeof(buf), "%s%s\n", nbuf, - type == TYPE_A ? "\r" : ""); - sec_write(fileno(dout), buf, strlen(buf)); - byte_count += strlen(nbuf) + 1; - } - } - closedir(dirp); - } - if (dout == NULL) - reply(550, "No files found."); - else if (ferror(dout) != 0) - perror_reply(550, "Data connection"); - else - reply(226, "Transfer complete."); - -out: - transflag = 0; - if (dout != NULL){ - sec_write(fileno(dout), buf, 0); /* XXX flush */ - - fclose(dout); - } - data = -1; - pdata = -1; - if (freeglob) - globfree(&gl); -} - - -int -find(char *pattern) -{ - char line[1024]; - FILE *f; - - snprintf(line, sizeof(line), - "/bin/locate -d %s -- %s", - ftp_rooted("/etc/locatedb"), - pattern); - f = ftpd_popen(line, "r", 1, 1); - if(f == NULL){ - perror_reply(550, "/bin/locate"); - return 1; - } - lreply(200, "Output from find."); - while(fgets(line, sizeof(line), f)){ - if(line[strlen(line)-1] == '\n') - line[strlen(line)-1] = 0; - nreply("%s", line); - } - reply(200, "Done"); - ftpd_pclose(f); - return 0; -} - diff --git a/crypto/heimdal/appl/ftp/ftpd/ftpd_locl.h b/crypto/heimdal/appl/ftp/ftpd/ftpd_locl.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/ftpd_locl.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifndef __ftpd_locl_h__ -#define __ftpd_locl_h__ - -#ifdef HAVE_CONFIG_H -#include -#endif - -/* - * FTP server. - */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#if defined(HAVE_SYS_IOCTL_H) && SunOS != 40 -#include -#endif -#ifdef HAVE_SYS_IOCCOM_H -#include -#endif -#ifdef TIME_WITH_SYS_TIME -#include -#include -#elif defined(HAVE_SYS_TIME_H) -#include -#else -#include -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif -#ifdef HAVE_SYS_WAIT_H -#include -#endif - -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN_SYSTM_H -#include -#endif -#ifdef HAVE_NETINET_IP_H -#include -#endif - -#ifdef HAVE_SYS_MMAN_H -#include -#endif - -#include -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_ARPA_TELNET_H -#include -#endif - -#include -#ifdef HAVE_DIRENT_H -#include -#endif -#include -#ifdef HAVE_FCNTL_H -#include -#endif -#include -#include -#ifdef HAVE_PWD_H -#include -#endif -#include -#include -#include -#include -#include -#ifdef HAVE_SYSLOG_H -#include -#endif -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_GRP_H -#include -#endif -#include - -#ifdef HAVE_BSD_BSD_H -#include -#endif - -#include -#include "roken.h" - -#include "pathnames.h" -#include "extern.h" -#include "common.h" - -#include "security.h" - -#ifdef KRB5 -#include -#endif /* KRB5 */ - -#if defined(KRB5) -#include -#endif - -#ifdef OTP -#include -#endif - -#ifdef SOCKS -#include -extern int LIBPREFIX(fclose) (FILE *); -#endif - -/* SunOS doesn't have any declaration of fclose */ - -int fclose(FILE *stream); - -int yyparse(void); - -#ifndef LOG_FTP -#define LOG_FTP LOG_DAEMON -#endif - -#endif /* __ftpd_locl_h__ */ diff --git a/crypto/heimdal/appl/ftp/ftpd/ftpusers.5 b/crypto/heimdal/appl/ftp/ftpd/ftpusers.5 deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/ftpusers.5 +++ /dev/null @@ -1,37 +0,0 @@ -.\" $Id$ -.\" -.Dd May 7, 1997 -.Dt FTPUSERS 5 -.Os KTH-KRB -.Sh NAME -.Pa /etc/ftpusers -.Nd FTP access list file -.Sh DESCRIPTION -.Pa /etc/ftpusers -contains a list of users that should be allowed or denied FTP -access. Each line contains a user, optionally followed by -.Dq allow -(anything but -.Dq allow -is ignored). The semi-user -.Dq * -matches any user. Users that has an explicit -.Dq allow , -or that does not match any line, are allowed access. Anyone else is -denied access. -.Pp -Note that this is compatible with the old format, where this file -contained a list of users that should be denied access. -.Sh EXAMPLES -This will deny anyone but -.Dq foo -and -.Dq bar -to use FTP: -.Bd -literal -foo allow -bar allow -* -.Ed -.Sh SEE ALSO -.Xr ftpd 8 diff --git a/crypto/heimdal/appl/ftp/ftpd/gss_userok.c b/crypto/heimdal/appl/ftp/ftpd/gss_userok.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/gss_userok.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 1998 - 2001 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftpd_locl.h" -#include - -/* XXX sync with gssapi.c */ -struct gssapi_data { - gss_ctx_id_t context_hdl; - gss_name_t client_name; - gss_cred_id_t delegated_cred_handle; - void *mech_data; -}; - -int gssapi_userok(void*, char*); /* to keep gcc happy */ -int gssapi_session(void*, char*); /* to keep gcc happy */ - -int -gssapi_userok(void *app_data, char *username) -{ - struct gssapi_data *data = app_data; - - /* Yes, this logic really is inverted. */ - return !gss_userok(data->client_name, username); -} - -int -gssapi_session(void *app_data, char *username) -{ - struct gssapi_data *data = app_data; - OM_uint32 major, minor; - int ret = 0; - - if (data->delegated_cred_handle != GSS_C_NO_CREDENTIAL) { - major = gss_store_cred(&minor, data->delegated_cred_handle, - GSS_C_INITIATE, GSS_C_NO_OID, - 1, 1, NULL, NULL); - if (GSS_ERROR(major)) - ret = 1; - afslog(NULL, 1); - } - - gss_release_cred(&minor, &data->delegated_cred_handle); - return ret; -} diff --git a/crypto/heimdal/appl/ftp/ftpd/gssapi.c b/crypto/heimdal/appl/ftp/ftpd/gssapi.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/gssapi.c +++ /dev/null @@ -1,511 +0,0 @@ -/* - * Copyright (c) 1998 - 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef FTP_SERVER -#include "ftpd_locl.h" -#else -#include "ftp_locl.h" -#endif -#include -#include -#include - -RCSID("$Id$"); - -int ftp_do_gss_bindings = 0; -int ftp_do_gss_delegate = 1; - -struct gssapi_data { - gss_ctx_id_t context_hdl; - gss_name_t client_name; - gss_cred_id_t delegated_cred_handle; - void *mech_data; -}; - -static int -gss_init(void *app_data) -{ - struct gssapi_data *d = app_data; - d->context_hdl = GSS_C_NO_CONTEXT; - d->delegated_cred_handle = GSS_C_NO_CREDENTIAL; -#if defined(FTP_SERVER) - return 0; -#else - /* XXX Check the gss mechanism; with gss_indicate_mechs() ? */ -#ifdef KRB5 - return !use_kerberos; -#else - return 0; -#endif /* KRB5 */ -#endif /* FTP_SERVER */ -} - -static int -gss_check_prot(void *app_data, int level) -{ - if(level == prot_confidential) - return -1; - return 0; -} - -static int -gss_decode(void *app_data, void *buf, int len, int level) -{ - OM_uint32 maj_stat, min_stat; - gss_buffer_desc input, output; - gss_qop_t qop_state; - int conf_state; - struct gssapi_data *d = app_data; - size_t ret_len; - - input.length = len; - input.value = buf; - maj_stat = gss_unwrap (&min_stat, - d->context_hdl, - &input, - &output, - &conf_state, - &qop_state); - if(GSS_ERROR(maj_stat)) - return -1; - memmove(buf, output.value, output.length); - ret_len = output.length; - gss_release_buffer(&min_stat, &output); - return ret_len; -} - -static int -gss_overhead(void *app_data, int level, int len) -{ - return 100; /* dunno? */ -} - - -static int -gss_encode(void *app_data, void *from, int length, int level, void **to) -{ - OM_uint32 maj_stat, min_stat; - gss_buffer_desc input, output; - int conf_state; - struct gssapi_data *d = app_data; - - input.length = length; - input.value = from; - maj_stat = gss_wrap (&min_stat, - d->context_hdl, - level == prot_private, - GSS_C_QOP_DEFAULT, - &input, - &conf_state, - &output); - *to = output.value; - return output.length; -} - -static void -sockaddr_to_gss_address (struct sockaddr *sa, - OM_uint32 *addr_type, - gss_buffer_desc *gss_addr) -{ - switch (sa->sa_family) { -#ifdef HAVE_IPV6 - case AF_INET6 : { - struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; - - gss_addr->length = 16; - gss_addr->value = &sin6->sin6_addr; - *addr_type = GSS_C_AF_INET6; - break; - } -#endif - case AF_INET : { - struct sockaddr_in *sin4 = (struct sockaddr_in *)sa; - - gss_addr->length = 4; - gss_addr->value = &sin4->sin_addr; - *addr_type = GSS_C_AF_INET; - break; - } - default : - errx (1, "unknown address family %d", sa->sa_family); - - } -} - -/* end common stuff */ - -#ifdef FTP_SERVER - -static int -gss_adat(void *app_data, void *buf, size_t len) -{ - char *p = NULL; - gss_buffer_desc input_token, output_token; - OM_uint32 maj_stat, min_stat; - gss_name_t client_name; - struct gssapi_data *d = app_data; - gss_channel_bindings_t bindings; - - if (ftp_do_gss_bindings) { - bindings = malloc(sizeof(*bindings)); - if (bindings == NULL) - errx(1, "out of memory"); - - sockaddr_to_gss_address (his_addr, - &bindings->initiator_addrtype, - &bindings->initiator_address); - sockaddr_to_gss_address (ctrl_addr, - &bindings->acceptor_addrtype, - &bindings->acceptor_address); - - bindings->application_data.length = 0; - bindings->application_data.value = NULL; - } else - bindings = GSS_C_NO_CHANNEL_BINDINGS; - - input_token.value = buf; - input_token.length = len; - - maj_stat = gss_accept_sec_context (&min_stat, - &d->context_hdl, - GSS_C_NO_CREDENTIAL, - &input_token, - bindings, - &client_name, - NULL, - &output_token, - NULL, - NULL, - &d->delegated_cred_handle); - - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - - if(output_token.length) { - if(base64_encode(output_token.value, output_token.length, &p) < 0) { - reply(535, "Out of memory base64-encoding."); - return -1; - } - gss_release_buffer(&min_stat, &output_token); - } - if(maj_stat == GSS_S_COMPLETE){ - d->client_name = client_name; - client_name = GSS_C_NO_NAME; - if(p) - reply(235, "ADAT=%s", p); - else - reply(235, "ADAT Complete"); - sec_complete = 1; - - } else if(maj_stat == GSS_S_CONTINUE_NEEDED) { - if(p) - reply(335, "ADAT=%s", p); - else - reply(335, "OK, need more data"); - } else { - OM_uint32 new_stat; - OM_uint32 msg_ctx = 0; - gss_buffer_desc status_string; - gss_display_status(&new_stat, - min_stat, - GSS_C_MECH_CODE, - GSS_C_NO_OID, - &msg_ctx, - &status_string); - syslog(LOG_ERR, "gss_accept_sec_context: %.*s", - (int)status_string.length, - (char*)status_string.value); - gss_release_buffer(&new_stat, &status_string); - reply(431, "Security resource unavailable"); - } - - if (client_name) - gss_release_name(&min_stat, &client_name); - free(p); - return 0; -} - -int gssapi_userok(void*, char*); -int gssapi_session(void*, char*); - -struct sec_server_mech gss_server_mech = { - "GSSAPI", - sizeof(struct gssapi_data), - gss_init, /* init */ - NULL, /* end */ - gss_check_prot, - gss_overhead, - gss_encode, - gss_decode, - /* */ - NULL, - gss_adat, - NULL, /* pbsz */ - NULL, /* ccc */ - gssapi_userok, - gssapi_session -}; - -#else /* FTP_SERVER */ - -extern struct sockaddr *hisctladdr, *myctladdr; - -static int -import_name(const char *kname, const char *host, gss_name_t *target_name) -{ - OM_uint32 maj_stat, min_stat; - gss_buffer_desc name; - char *str; - - name.length = asprintf(&str, "%s@%s", kname, host); - if (str == NULL) { - printf("Out of memory\n"); - return AUTH_ERROR; - } - name.value = str; - - maj_stat = gss_import_name(&min_stat, - &name, - GSS_C_NT_HOSTBASED_SERVICE, - target_name); - if (GSS_ERROR(maj_stat)) { - OM_uint32 new_stat; - OM_uint32 msg_ctx = 0; - gss_buffer_desc status_string; - - gss_display_status(&new_stat, - min_stat, - GSS_C_MECH_CODE, - GSS_C_NO_OID, - &msg_ctx, - &status_string); - printf("Error importing name %.*s: %.*s\n", - (int)name.length, - (char *)name.value, - (int)status_string.length, - (char *)status_string.value); - free(name.value); - gss_release_buffer(&new_stat, &status_string); - return AUTH_ERROR; - } - free(name.value); - return 0; -} - -static int -gss_auth(void *app_data, char *host) -{ - - OM_uint32 maj_stat, min_stat; - gss_name_t target_name; - gss_buffer_desc input, output_token; - int context_established = 0; - char *p; - int n; - gss_channel_bindings_t bindings; - struct gssapi_data *d = app_data; - OM_uint32 mech_flags = GSS_C_MUTUAL_FLAG | GSS_C_SEQUENCE_FLAG; - - const char *knames[] = { "ftp", "host", NULL }, **kname = knames; - - - if(import_name(*kname++, host, &target_name)) - return AUTH_ERROR; - - input.length = 0; - input.value = NULL; - - if (ftp_do_gss_bindings) { - bindings = malloc(sizeof(*bindings)); - if (bindings == NULL) - errx(1, "out of memory"); - - sockaddr_to_gss_address (myctladdr, - &bindings->initiator_addrtype, - &bindings->initiator_address); - sockaddr_to_gss_address (hisctladdr, - &bindings->acceptor_addrtype, - &bindings->acceptor_address); - - bindings->application_data.length = 0; - bindings->application_data.value = NULL; - } else - bindings = GSS_C_NO_CHANNEL_BINDINGS; - - if (ftp_do_gss_delegate) - mech_flags |= GSS_C_DELEG_FLAG; - - while(!context_established) { - maj_stat = gss_init_sec_context(&min_stat, - GSS_C_NO_CREDENTIAL, - &d->context_hdl, - target_name, - GSS_C_NO_OID, - mech_flags, - 0, - bindings, - &input, - NULL, - &output_token, - NULL, - NULL); - if (GSS_ERROR(maj_stat)) { - OM_uint32 new_stat; - OM_uint32 msg_ctx = 0; - gss_buffer_desc status_string; - - d->context_hdl = GSS_C_NO_CONTEXT; - - gss_release_name(&min_stat, &target_name); - - if(*kname != NULL) { - - if(import_name(*kname++, host, &target_name)) { - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - return AUTH_ERROR; - } - continue; - } - - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - - gss_display_status(&new_stat, - min_stat, - GSS_C_MECH_CODE, - GSS_C_NO_OID, - &msg_ctx, - &status_string); - printf("Error initializing security context: %.*s\n", - (int)status_string.length, - (char*)status_string.value); - gss_release_buffer(&new_stat, &status_string); - return AUTH_CONTINUE; - } - - if (input.value) { - free(input.value); - input.value = NULL; - input.length = 0; - } - if (output_token.length != 0) { - base64_encode(output_token.value, output_token.length, &p); - gss_release_buffer(&min_stat, &output_token); - n = command("ADAT %s", p); - free(p); - } - if (GSS_ERROR(maj_stat)) { - if (d->context_hdl != GSS_C_NO_CONTEXT) - gss_delete_sec_context (&min_stat, - &d->context_hdl, - GSS_C_NO_BUFFER); - break; - } - if (maj_stat & GSS_S_CONTINUE_NEEDED) { - p = strstr(reply_string, "ADAT="); - if(p == NULL){ - printf("Error: expected ADAT in reply. got: %s\n", - reply_string); - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - return AUTH_ERROR; - } else { - p+=5; - input.value = malloc(strlen(p)); - input.length = base64_decode(p, input.value); - } - } else { - if(code != 235) { - printf("Unrecognized response code: %d\n", code); - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - return AUTH_ERROR; - } - context_established = 1; - } - } - - gss_release_name(&min_stat, &target_name); - - if (bindings != GSS_C_NO_CHANNEL_BINDINGS) - free(bindings); - if (input.value) - free(input.value); - - { - gss_name_t targ_name; - - maj_stat = gss_inquire_context(&min_stat, - d->context_hdl, - NULL, - &targ_name, - NULL, - NULL, - NULL, - NULL, - NULL); - if (GSS_ERROR(maj_stat) == 0) { - gss_buffer_desc name; - maj_stat = gss_display_name (&min_stat, - targ_name, - &name, - NULL); - if (GSS_ERROR(maj_stat) == 0) { - printf("Authenticated to <%.*s>\n", - (int)name.length, - (char *)name.value); - gss_release_buffer(&min_stat, &name); - } - gss_release_name(&min_stat, &targ_name); - } else - printf("Failed to get gss name of peer.\n"); - } - - - return AUTH_OK; -} - -struct sec_client_mech gss_client_mech = { - "GSSAPI", - sizeof(struct gssapi_data), - gss_init, - gss_auth, - NULL, /* end */ - gss_check_prot, - gss_overhead, - gss_encode, - gss_decode, -}; - -#endif /* FTP_SERVER */ diff --git a/crypto/heimdal/appl/ftp/ftpd/kauth.c b/crypto/heimdal/appl/ftp/ftpd/kauth.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/kauth.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 1995 - 1999, 2003 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftpd_locl.h" - -RCSID("$Id$"); - -#if defined(KRB5) - -int do_destroy_tickets = 1; -char *k5ccname; - -#endif - -#ifdef KRB5 - -static void -dest_cc(void) -{ - krb5_context context; - krb5_error_code ret; - krb5_ccache id; - - ret = krb5_init_context(&context); - if (ret == 0) { - if (k5ccname) - ret = krb5_cc_resolve(context, k5ccname, &id); - else - ret = krb5_cc_default (context, &id); - if (ret) - krb5_free_context(context); - } - if (ret == 0) { - krb5_cc_destroy(context, id); - krb5_free_context (context); - } -} -#endif - -#if defined(KRB5) - -/* - * Only destroy if we created the tickets - */ - -void -cond_kdestroy(void) -{ - if (do_destroy_tickets) { -#if KRB5 - dest_cc(); -#endif - do_destroy_tickets = 0; - } - afsunlog(); -} - -void -kdestroy(void) -{ -#if KRB5 - dest_cc(); -#endif - afsunlog(); - reply(200, "Tickets destroyed"); -} - - -void -afslog(const char *cell, int quiet) -{ - if(k_hasafs()) { -#ifdef KRB5 - krb5_context context; - krb5_error_code ret; - krb5_ccache id; - - ret = krb5_init_context(&context); - if (ret == 0) { - if (k5ccname) - ret = krb5_cc_resolve(context, k5ccname, &id); - else - ret = krb5_cc_default(context, &id); - if (ret) - krb5_free_context(context); - } - if (ret == 0) { - krb5_afslog(context, id, cell, 0); - krb5_cc_close (context, id); - krb5_free_context (context); - } -#endif - if (!quiet) - reply(200, "afslog done"); - } else { - if (!quiet) - reply(200, "no AFS present"); - } -} - -void -afsunlog(void) -{ - if(k_hasafs()) - k_unlog(); -} - -#else -int ftpd_afslog_placeholder; -#endif /* KRB5 */ diff --git a/crypto/heimdal/appl/ftp/ftpd/klist.c b/crypto/heimdal/appl/ftp/ftpd/klist.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/klist.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) 1995 - 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ftpd_locl.h" - -#ifdef KRB5 - -static int -print_cred(krb5_context context, krb5_creds *cred) -{ - char t1[128], t2[128], *str; - krb5_error_code ret; - krb5_timestamp sec; - - krb5_timeofday (context, &sec); - - if(cred->times.starttime) - krb5_format_time(context, cred->times.starttime, t1, sizeof(t1), 1); - else - krb5_format_time(context, cred->times.authtime, t1, sizeof(t1), 1); - - if(cred->times.endtime > sec) - krb5_format_time(context, cred->times.endtime, t2, sizeof(t2), 1); - else - strlcpy(t2, ">>>Expired<<<", sizeof(t2)); - - ret = krb5_unparse_name (context, cred->server, &str); - if (ret) { - lreply(500, "krb5_unparse_name: %d", ret); - return 1; - } - - lreply(200, "%-20s %-20s %s", t1, t2, str); - free(str); - return 0; -} - -static int -print_tickets (krb5_context context, - krb5_ccache ccache, - krb5_principal principal) -{ - krb5_error_code ret; - krb5_cc_cursor cursor; - krb5_creds cred; - char *str; - - ret = krb5_unparse_name (context, principal, &str); - if (ret) { - lreply(500, "krb5_unparse_name: %d", ret); - return 500; - } - - lreply(200, "%17s: %s:%s", - "Credentials cache", - krb5_cc_get_type(context, ccache), - krb5_cc_get_name(context, ccache)); - lreply(200, "%17s: %s", "Principal", str); - free (str); - - ret = krb5_cc_start_seq_get (context, ccache, &cursor); - if (ret) { - lreply(500, "krb5_cc_start_seq_get: %d", ret); - return 500; - } - - lreply(200, " Issued Expires Principal"); - - while ((ret = krb5_cc_next_cred (context, - ccache, - &cursor, - &cred)) == 0) { - if (print_cred(context, &cred)) - return 500; - krb5_free_cred_contents (context, &cred); - } - if (ret != KRB5_CC_END) { - lreply(500, "krb5_cc_get_next: %d", ret); - return 500; - } - ret = krb5_cc_end_seq_get (context, ccache, &cursor); - if (ret) { - lreply(500, "krb5_cc_end_seq_get: %d", ret); - return 500; - } - - return 200; -} - -static int -klist5(void) -{ - krb5_error_code ret; - krb5_context context; - krb5_ccache ccache; - krb5_principal principal; - int exit_status = 200; - - ret = krb5_init_context (&context); - if (ret) { - lreply(500, "krb5_init_context failed: %d", ret); - return 500; - } - - if (k5ccname) - ret = krb5_cc_resolve(context, k5ccname, &ccache); - else - ret = krb5_cc_default (context, &ccache); - if (ret) { - lreply(500, "krb5_cc_default: %d", ret); - return 500; - } - - ret = krb5_cc_get_principal (context, ccache, &principal); - if (ret) { - if(ret == ENOENT) - lreply(500, "No ticket file: %s", - krb5_cc_get_name(context, ccache)); - else - lreply(500, "krb5_cc_get_principal: %d", ret); - - return 500; - } - exit_status = print_tickets (context, ccache, principal); - - ret = krb5_cc_close (context, ccache); - if (ret) { - lreply(500, "krb5_cc_close: %d", ret); - exit_status = 500; - } - - krb5_free_principal (context, principal); - krb5_free_context (context); - return exit_status; -} -#endif - -void -klist(void) -{ -#if KRB5 - int res = klist5(); - reply(res, " "); -#else - reply(500, "Command not implemented."); -#endif -} - diff --git a/crypto/heimdal/appl/ftp/ftpd/logwtmp.c b/crypto/heimdal/appl/ftp/ftpd/logwtmp.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/logwtmp.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -#include -RCSID("$Id$"); -#endif - -#include -#include -#ifdef TIME_WITH_SYS_TIME -#include -#include -#elif defined(HAVE_SYS_TIME_H) -#include -#else -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_UTMP_H -#include -#endif -#ifdef HAVE_UTMPX_H -#include -#endif -#ifdef HAVE_ASL_H -#include -#endif -#include -#include "extern.h" - -#ifndef HAVE_UTMPX_H -#ifndef WTMP_FILE -#ifdef _PATH_WTMP -#define WTMP_FILE _PATH_WTMP -#else -#define WTMP_FILE "/var/adm/wtmp" -#endif -#endif -#endif - -#ifdef HAVE_ASL_H - -#ifndef ASL_KEY_FACILITY -#define ASL_KEY_FACILITY "Facility" -#endif - -static void -ftpd_logwtmp_asl(char *line, char *name, char *host) -{ - static aslmsg m = NULL; - static int init = 0; - - if (!init) { - init = 1; - m = asl_new(ASL_TYPE_MSG); - if (m == NULL) - return; - asl_set(m, ASL_KEY_FACILITY, "org.h5l.ftpd"); - } - if (m) - asl_log(NULL, m, ASL_LEVEL_NOTICE, - "host %s/%s user %s%sconnected pid %d", - host, line, name, name[0] ? " " : "dis", (int)getpid()); -} - -#endif - -#ifndef HAVE_ASL_H - -static void -ftpd_logwtmp_wtmp(char *line, char *name, char *host) -{ - static int init = 0; - static int fd; -#ifdef WTMPX_FILE - static int fdx; -#endif -#ifdef HAVE_UTMP_H - struct utmp ut; -#endif -#if defined(WTMPX_FILE) || defined(HAVE_UTMPX_H) - struct utmpx utx; -#endif - -#ifdef HAVE_UTMPX_H - memset(&utx, 0, sizeof(struct utmpx)); -#endif -#ifdef HAVE_UTMP_H - memset(&ut, 0, sizeof(struct utmp)); -#ifdef HAVE_STRUCT_UTMP_UT_TYPE - if(name[0]) - ut.ut_type = USER_PROCESS; - else - ut.ut_type = DEAD_PROCESS; -#endif - strncpy(ut.ut_line, line, sizeof(ut.ut_line)); - strncpy(ut.ut_name, name, sizeof(ut.ut_name)); -#ifdef HAVE_STRUCT_UTMP_UT_PID - ut.ut_pid = getpid(); -#endif -#ifdef HAVE_STRUCT_UTMP_UT_HOST - strncpy(ut.ut_host, host, sizeof(ut.ut_host)); -#endif - ut.ut_time = time(NULL); -#endif - -#if defined(WTMPX_FILE) || defined(HAVE_UTMPX_H) - strncpy(utx.ut_line, line, sizeof(utx.ut_line)); - strncpy(utx.ut_user, name, sizeof(utx.ut_user)); - strncpy(utx.ut_host, host, sizeof(utx.ut_host)); -#ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN - utx.ut_syslen = strlen(host) + 1; - if (utx.ut_syslen > sizeof(utx.ut_host)) - utx.ut_syslen = sizeof(utx.ut_host); -#endif - { - struct timeval tv; - - gettimeofday (&tv, 0); - utx.ut_tv.tv_sec = tv.tv_sec; - utx.ut_tv.tv_usec = tv.tv_usec; - } - - if(name[0]) - utx.ut_type = USER_PROCESS; - else - utx.ut_type = DEAD_PROCESS; -#endif - -#ifdef HAVE_UTMPX_H - pututxline(&utx); -#endif - - if(!init){ -#ifdef WTMP_FILE - fd = open(WTMP_FILE, O_WRONLY|O_APPEND, 0); -#endif -#ifdef WTMPX_FILE - fdx = open(WTMPX_FILE, O_WRONLY|O_APPEND, 0); -#endif - init = 1; - } - if(fd >= 0) { -#ifdef WTMP_FILE - write(fd, &ut, sizeof(struct utmp)); /* XXX */ -#endif -#ifdef WTMPX_FILE - write(fdx, &utx, sizeof(struct utmpx)); -#endif - } -} - -#endif /* !HAVE_ASL_H */ - -void -ftpd_logwtmp(char *line, char *name, char *host) -{ -#ifdef HAVE_ASL_H - ftpd_logwtmp_asl(line, name, host); -#else - ftpd_logwtmp_wtmp(line, name, host); -#endif -} diff --git a/crypto/heimdal/appl/ftp/ftpd/ls.c b/crypto/heimdal/appl/ftp/ftpd/ls.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/ls.c +++ /dev/null @@ -1,891 +0,0 @@ -/* - * Copyright (c) 1999 - 2002 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of KTH nor the names of its contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#ifndef TEST -#include "ftpd_locl.h" - -RCSID("$Id$"); - -#else -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define sec_fprintf2 fprintf -#define sec_fflush fflush -static void list_files(FILE *out, const char **files, int n_files, int flags); -static int parse_flags(const char *options); - -int -main(int argc, char **argv) -{ - int i = 1; - int flags; - if(argc > 1 && argv[1][0] == '-') { - flags = parse_flags(argv[1]); - i = 2; - } else - flags = parse_flags(NULL); - - list_files(stdout, (const char **)argv + i, argc - i, flags); - return 0; -} -#endif - -struct fileinfo { - struct stat st; - int inode; - int bsize; - char mode[11]; - int n_link; - char *user; - char *group; - char *size; - char *major; - char *minor; - char *date; - char *filename; - char *link; -}; - -static void -free_fileinfo(struct fileinfo *f) -{ - free(f->user); - free(f->group); - free(f->size); - free(f->major); - free(f->minor); - free(f->date); - free(f->filename); - free(f->link); -} - -#define LS_DIRS (1 << 0) -#define LS_IGNORE_DOT (1 << 1) -#define LS_SORT_MODE (3 << 2) -#define SORT_MODE(f) ((f) & LS_SORT_MODE) -#define LS_SORT_NAME (1 << 2) -#define LS_SORT_MTIME (2 << 2) -#define LS_SORT_SIZE (3 << 2) -#define LS_SORT_REVERSE (1 << 4) - -#define LS_SIZE (1 << 5) -#define LS_INODE (1 << 6) -#define LS_TYPE (1 << 7) -#define LS_DISP_MODE (3 << 8) -#define DISP_MODE(f) ((f) & LS_DISP_MODE) -#define LS_DISP_LONG (1 << 8) -#define LS_DISP_COLUMN (2 << 8) -#define LS_DISP_CROSS (3 << 8) -#define LS_SHOW_ALL (1 << 10) -#define LS_RECURSIVE (1 << 11) -#define LS_EXTRA_BLANK (1 << 12) -#define LS_SHOW_DIRNAME (1 << 13) -#define LS_DIR_FLAG (1 << 14) /* these files come via list_dir */ - -#ifndef S_ISTXT -#define S_ISTXT S_ISVTX -#endif - -#if !defined(_S_IFMT) && defined(S_IFMT) -#define _S_IFMT S_IFMT -#endif - -#ifndef S_ISSOCK -#define S_ISSOCK(mode) (((mode) & _S_IFMT) == S_IFSOCK) -#endif - -#ifndef S_ISLNK -#define S_ISLNK(mode) (((mode) & _S_IFMT) == S_IFLNK) -#endif - -static size_t -block_convert(size_t blocks) -{ -#ifdef S_BLKSIZE - return blocks * S_BLKSIZE / 1024; -#else - return blocks * 512 / 1024; -#endif -} - -static int -make_fileinfo(FILE *out, const char *filename, struct fileinfo *file, int flags) -{ - char buf[128]; - int file_type = 0; - struct stat *st = &file->st; - - file->inode = st->st_ino; - file->bsize = block_convert(st->st_blocks); - - if(S_ISDIR(st->st_mode)) { - file->mode[0] = 'd'; - file_type = '/'; - } - else if(S_ISCHR(st->st_mode)) - file->mode[0] = 'c'; - else if(S_ISBLK(st->st_mode)) - file->mode[0] = 'b'; - else if(S_ISREG(st->st_mode)) { - file->mode[0] = '-'; - if(st->st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) - file_type = '*'; - } - else if(S_ISFIFO(st->st_mode)) { - file->mode[0] = 'p'; - file_type = '|'; - } - else if(S_ISLNK(st->st_mode)) { - file->mode[0] = 'l'; - file_type = '@'; - } - else if(S_ISSOCK(st->st_mode)) { - file->mode[0] = 's'; - file_type = '='; - } -#ifdef S_ISWHT - else if(S_ISWHT(st->st_mode)) { - file->mode[0] = 'w'; - file_type = '%'; - } -#endif - else - file->mode[0] = '?'; - { - char *x[] = { "---", "--x", "-w-", "-wx", - "r--", "r-x", "rw-", "rwx" }; - strcpy(file->mode + 1, x[(st->st_mode & S_IRWXU) >> 6]); - strcpy(file->mode + 4, x[(st->st_mode & S_IRWXG) >> 3]); - strcpy(file->mode + 7, x[(st->st_mode & S_IRWXO) >> 0]); - if((st->st_mode & S_ISUID)) { - if((st->st_mode & S_IXUSR)) - file->mode[3] = 's'; - else - file->mode[3] = 'S'; - } - if((st->st_mode & S_ISGID)) { - if((st->st_mode & S_IXGRP)) - file->mode[6] = 's'; - else - file->mode[6] = 'S'; - } - if((st->st_mode & S_ISTXT)) { - if((st->st_mode & S_IXOTH)) - file->mode[9] = 't'; - else - file->mode[9] = 'T'; - } - } - file->n_link = st->st_nlink; - { - struct passwd *pwd; - pwd = getpwuid(st->st_uid); - if(pwd == NULL) { - if (asprintf(&file->user, "%u", (unsigned)st->st_uid) == -1) - file->user = NULL; - } else - file->user = strdup(pwd->pw_name); - if (file->user == NULL) { - syslog(LOG_ERR, "out of memory"); - return -1; - } - } - { - struct group *grp; - grp = getgrgid(st->st_gid); - if(grp == NULL) { - if (asprintf(&file->group, "%u", (unsigned)st->st_gid) == -1) - file->group = NULL; - } else - file->group = strdup(grp->gr_name); - if (file->group == NULL) { - syslog(LOG_ERR, "out of memory"); - return -1; - } - } - - if(S_ISCHR(st->st_mode) || S_ISBLK(st->st_mode)) { -#if defined(major) && defined(minor) - if (asprintf(&file->major, "%u", (unsigned)major(st->st_rdev)) == -1) - file->major = NULL; - if (asprintf(&file->minor, "%u", (unsigned)minor(st->st_rdev)) == -1) - file->minor = NULL; -#else - /* Don't want to use the DDI/DKI crap. */ - if (asprintf(&file->major, "%u", (unsigned)st->st_rdev) == -1) - file->major = NULL; - if (asprintf(&file->minor, "%u", 0) == -1) - file->minor = NULL; -#endif - if (file->major == NULL || file->minor == NULL) { - syslog(LOG_ERR, "out of memory"); - return -1; - } - } else { - if (asprintf(&file->size, "%lu", (unsigned long)st->st_size) == -1) - file->size = NULL; - } - - { - time_t t = time(NULL); - time_t mtime = st->st_mtime; - struct tm *tm = localtime(&mtime); - if((t - mtime > 6*30*24*60*60) || - (mtime - t > 6*30*24*60*60)) - strftime(buf, sizeof(buf), "%b %e %Y", tm); - else - strftime(buf, sizeof(buf), "%b %e %H:%M", tm); - file->date = strdup(buf); - if (file->date == NULL) { - syslog(LOG_ERR, "out of memory"); - return -1; - } - } - { - const char *p = strrchr(filename, '/'); - if(p) - p++; - else - p = filename; - if((flags & LS_TYPE) && file_type != 0) { - if (asprintf(&file->filename, "%s%c", p, file_type) == -1) - file->filename = NULL; - } else - file->filename = strdup(p); - if (file->filename == NULL) { - syslog(LOG_ERR, "out of memory"); - return -1; - } - } - if(S_ISLNK(st->st_mode)) { - int n; - n = readlink((char *)filename, buf, sizeof(buf) - 1); - if(n >= 0) { - buf[n] = '\0'; - file->link = strdup(buf); - if (file->link == NULL) { - syslog(LOG_ERR, "out of memory"); - return -1; - } - } else - sec_fprintf2(out, "readlink(%s): %s", filename, strerror(errno)); - } - return 0; -} - -static void -print_file(FILE *out, - int flags, - struct fileinfo *f, - int max_inode, - int max_bsize, - int max_n_link, - int max_user, - int max_group, - int max_size, - int max_major, - int max_minor, - int max_date) -{ - if(f->filename == NULL) - return; - - if(flags & LS_INODE) { - sec_fprintf2(out, "%*d", max_inode, f->inode); - sec_fprintf2(out, " "); - } - if(flags & LS_SIZE) { - sec_fprintf2(out, "%*d", max_bsize, f->bsize); - sec_fprintf2(out, " "); - } - sec_fprintf2(out, "%s", f->mode); - sec_fprintf2(out, " "); - sec_fprintf2(out, "%*d", max_n_link, f->n_link); - sec_fprintf2(out, " "); - sec_fprintf2(out, "%-*s", max_user, f->user); - sec_fprintf2(out, " "); - sec_fprintf2(out, "%-*s", max_group, f->group); - sec_fprintf2(out, " "); - if(f->major != NULL && f->minor != NULL) - sec_fprintf2(out, "%*s, %*s", max_major, f->major, max_minor, f->minor); - else - sec_fprintf2(out, "%*s", max_size, f->size); - sec_fprintf2(out, " "); - sec_fprintf2(out, "%*s", max_date, f->date); - sec_fprintf2(out, " "); - sec_fprintf2(out, "%s", f->filename); - if(f->link) - sec_fprintf2(out, " -> %s", f->link); - sec_fprintf2(out, "\r\n"); -} - -static int -compare_filename(struct fileinfo *a, struct fileinfo *b) -{ - if(a->filename == NULL) - return 1; - if(b->filename == NULL) - return -1; - return strcmp(a->filename, b->filename); -} - -static int -compare_mtime(struct fileinfo *a, struct fileinfo *b) -{ - if(a->filename == NULL) - return 1; - if(b->filename == NULL) - return -1; - return b->st.st_mtime - a->st.st_mtime; -} - -static int -compare_size(struct fileinfo *a, struct fileinfo *b) -{ - if(a->filename == NULL) - return 1; - if(b->filename == NULL) - return -1; - return b->st.st_size - a->st.st_size; -} - -static int list_dir(FILE*, const char*, int); - -static int -find_log10(int num) -{ - int i = 1; - while(num > 10) { - i++; - num /= 10; - } - return i; -} - -/* - * Operate as lstat but fake up entries for AFS mount points so we don't - * have to fetch them. - */ - -#ifdef KRB5 -static int do_the_afs_dance = 1; -#endif - -static int -lstat_file (const char *file, struct stat *sb) -{ -#ifdef KRB5 - if (do_the_afs_dance && - k_hasafs() - && strcmp(file, ".") - && strcmp(file, "..") - && strcmp(file, "/")) - { - struct ViceIoctl a_params; - char *dir, *last; - char *path_bkp; - static ino_t ino_counter = 0, ino_last = 0; - int ret; - const int maxsize = 2048; - - path_bkp = strdup (file); - if (path_bkp == NULL) - return -1; - - a_params.out = malloc (maxsize); - if (a_params.out == NULL) { - free (path_bkp); - return -1; - } - - /* If path contains more than the filename alone - split it */ - - last = strrchr (path_bkp, '/'); - if (last != NULL) { - if(last[1] == '\0') - /* if path ended in /, replace with `.' */ - a_params.in = "."; - else - a_params.in = last + 1; - while(last > path_bkp && *--last == '/'); - if(*last != '/' || last != path_bkp) { - *++last = '\0'; - dir = path_bkp; - } else - /* we got to the start, so this must be the root dir */ - dir = "/"; - } else { - /* file is relative to cdir */ - dir = "."; - a_params.in = path_bkp; - } - - a_params.in_size = strlen (a_params.in) + 1; - a_params.out_size = maxsize; - - ret = k_pioctl (dir, VIOC_AFS_STAT_MT_PT, &a_params, 0); - free (a_params.out); - if (ret < 0) { - free (path_bkp); - - if (errno != EINVAL) - return ret; - else - /* if we get EINVAL this is probably not a mountpoint */ - return lstat (file, sb); - } - - /* - * wow this was a mountpoint, lets cook the struct stat - * use . as a prototype - */ - - ret = lstat (dir, sb); - free (path_bkp); - if (ret < 0) - return ret; - - if (ino_last == sb->st_ino) - ino_counter++; - else { - ino_last = sb->st_ino; - ino_counter = 0; - } - sb->st_ino += ino_counter; - sb->st_nlink = 3; - - return 0; - } -#endif /* KRB5 */ - return lstat (file, sb); -} - -#define IS_DOT_DOTDOT(X) ((X)[0] == '.' && ((X)[1] == '\0' || \ - ((X)[1] == '.' && (X)[2] == '\0'))) - -static int -list_files(FILE *out, const char **files, int n_files, int flags) -{ - struct fileinfo *fi; - int i; - int *dirs = NULL; - size_t total_blocks = 0; - int n_print = 0; - int ret = 0; - - if(n_files == 0) - return 0; - - if(n_files > 1) - flags |= LS_SHOW_DIRNAME; - - fi = calloc(n_files, sizeof(*fi)); - if (fi == NULL) { - syslog(LOG_ERR, "out of memory"); - return -1; - } - for(i = 0; i < n_files; i++) { - if(lstat_file(files[i], &fi[i].st) < 0) { - sec_fprintf2(out, "%s: %s\r\n", files[i], strerror(errno)); - fi[i].filename = NULL; - } else { - int include_in_list = 1; - total_blocks += block_convert(fi[i].st.st_blocks); - if(S_ISDIR(fi[i].st.st_mode)) { - if(dirs == NULL) - dirs = calloc(n_files, sizeof(*dirs)); - if(dirs == NULL) { - syslog(LOG_ERR, "%s: %m", files[i]); - ret = -1; - goto out; - } - dirs[i] = 1; - if((flags & LS_DIRS) == 0) - include_in_list = 0; - } - if(include_in_list) { - ret = make_fileinfo(out, files[i], &fi[i], flags); - if (ret) - goto out; - n_print++; - } - } - } - switch(SORT_MODE(flags)) { - case LS_SORT_NAME: - qsort(fi, n_files, sizeof(*fi), - (int (*)(const void*, const void*))compare_filename); - break; - case LS_SORT_MTIME: - qsort(fi, n_files, sizeof(*fi), - (int (*)(const void*, const void*))compare_mtime); - break; - case LS_SORT_SIZE: - qsort(fi, n_files, sizeof(*fi), - (int (*)(const void*, const void*))compare_size); - break; - } - if(DISP_MODE(flags) == LS_DISP_LONG) { - int max_inode = 0; - int max_bsize = 0; - int max_n_link = 0; - int max_user = 0; - int max_group = 0; - int max_size = 0; - int max_major = 0; - int max_minor = 0; - int max_date = 0; - for(i = 0; i < n_files; i++) { - if(fi[i].filename == NULL) - continue; - if(fi[i].inode > max_inode) - max_inode = fi[i].inode; - if(fi[i].bsize > max_bsize) - max_bsize = fi[i].bsize; - if(fi[i].n_link > max_n_link) - max_n_link = fi[i].n_link; - if(strlen(fi[i].user) > max_user) - max_user = strlen(fi[i].user); - if(strlen(fi[i].group) > max_group) - max_group = strlen(fi[i].group); - if(fi[i].major != NULL && strlen(fi[i].major) > max_major) - max_major = strlen(fi[i].major); - if(fi[i].minor != NULL && strlen(fi[i].minor) > max_minor) - max_minor = strlen(fi[i].minor); - if(fi[i].size != NULL && strlen(fi[i].size) > max_size) - max_size = strlen(fi[i].size); - if(strlen(fi[i].date) > max_date) - max_date = strlen(fi[i].date); - } - if(max_size < max_major + max_minor + 2) - max_size = max_major + max_minor + 2; - else if(max_size - max_minor - 2 > max_major) - max_major = max_size - max_minor - 2; - max_inode = find_log10(max_inode); - max_bsize = find_log10(max_bsize); - max_n_link = find_log10(max_n_link); - - if(n_print > 0) - sec_fprintf2(out, "total %lu\r\n", (unsigned long)total_blocks); - if(flags & LS_SORT_REVERSE) - for(i = n_files - 1; i >= 0; i--) - print_file(out, - flags, - &fi[i], - max_inode, - max_bsize, - max_n_link, - max_user, - max_group, - max_size, - max_major, - max_minor, - max_date); - else - for(i = 0; i < n_files; i++) - print_file(out, - flags, - &fi[i], - max_inode, - max_bsize, - max_n_link, - max_user, - max_group, - max_size, - max_major, - max_minor, - max_date); - } else if(DISP_MODE(flags) == LS_DISP_COLUMN || - DISP_MODE(flags) == LS_DISP_CROSS) { - int max_len = 0; - int size_len = 0; - int num_files = n_files; - int columns; - int j; - for(i = 0; i < n_files; i++) { - if(fi[i].filename == NULL) { - num_files--; - continue; - } - if(strlen(fi[i].filename) > max_len) - max_len = strlen(fi[i].filename); - if(find_log10(fi[i].bsize) > size_len) - size_len = find_log10(fi[i].bsize); - } - if(num_files == 0) - goto next; - if(flags & LS_SIZE) { - columns = 80 / (size_len + 1 + max_len + 1); - max_len = 80 / columns - size_len - 1; - } else { - columns = 80 / (max_len + 1); /* get space between columns */ - max_len = 80 / columns; - } - if(flags & LS_SIZE) - sec_fprintf2(out, "total %lu\r\n", - (unsigned long)total_blocks); - if(DISP_MODE(flags) == LS_DISP_CROSS) { - for(i = 0, j = 0; i < n_files; i++) { - if(fi[i].filename == NULL) - continue; - if(flags & LS_SIZE) - sec_fprintf2(out, "%*u %-*s", size_len, fi[i].bsize, - max_len, fi[i].filename); - else - sec_fprintf2(out, "%-*s", max_len, fi[i].filename); - j++; - if(j == columns) { - sec_fprintf2(out, "\r\n"); - j = 0; - } - } - if(j > 0) - sec_fprintf2(out, "\r\n"); - } else { - int skip = (num_files + columns - 1) / columns; - - for(i = 0; i < skip; i++) { - for(j = i; j < n_files;) { - while(j < n_files && fi[j].filename == NULL) - j++; - if(flags & LS_SIZE) - sec_fprintf2(out, "%*u %-*s", size_len, fi[j].bsize, - max_len, fi[j].filename); - else - sec_fprintf2(out, "%-*s", max_len, fi[j].filename); - j += skip; - } - sec_fprintf2(out, "\r\n"); - } - } - } else { - for(i = 0; i < n_files; i++) { - if(fi[i].filename == NULL) - continue; - sec_fprintf2(out, "%s\r\n", fi[i].filename); - } - } - next: - if(((flags & LS_DIRS) == 0 || (flags & LS_RECURSIVE)) && dirs != NULL) { - for(i = 0; i < n_files; i++) { - if(dirs[i]) { - const char *p = strrchr(files[i], '/'); - if(p == NULL) - p = files[i]; - else - p++; - if(!(flags & LS_DIR_FLAG) || !IS_DOT_DOTDOT(p)) { - if((flags & LS_SHOW_DIRNAME)) { - if ((flags & LS_EXTRA_BLANK)) - sec_fprintf2(out, "\r\n"); - sec_fprintf2(out, "%s:\r\n", files[i]); - } - list_dir(out, files[i], flags | LS_DIRS | LS_EXTRA_BLANK); - } - } - } - } - out: - for(i = 0; i < n_files; i++) - free_fileinfo(&fi[i]); - free(fi); - if(dirs != NULL) - free(dirs); - return ret; -} - -static void -free_files (char **files, int n) -{ - int i; - - for (i = 0; i < n; ++i) - free (files[i]); - free (files); -} - -static int -hide_file(const char *filename, int flags) -{ - if(filename[0] != '.') - return 0; - if((flags & LS_IGNORE_DOT)) - return 1; - if(filename[1] == '\0' || (filename[1] == '.' && filename[2] == '\0')) { - if((flags & LS_SHOW_ALL)) - return 0; - else - return 1; - } - return 0; -} - -static int -list_dir(FILE *out, const char *directory, int flags) -{ - DIR *d = opendir(directory); - struct dirent *ent; - char **files = NULL; - int n_files = 0; - int ret; - - if(d == NULL) { - syslog(LOG_ERR, "%s: %m", directory); - return -1; - } - while((ent = readdir(d)) != NULL) { - void *tmp; - - if(hide_file(ent->d_name, flags)) - continue; - tmp = realloc(files, (n_files + 1) * sizeof(*files)); - if (tmp == NULL) { - syslog(LOG_ERR, "%s: out of memory", directory); - free_files (files, n_files); - closedir (d); - return -1; - } - files = tmp; - ret = asprintf(&files[n_files], "%s/%s", directory, ent->d_name); - if (ret == -1) { - syslog(LOG_ERR, "%s: out of memory", directory); - free_files (files, n_files); - closedir (d); - return -1; - } - ++n_files; - } - closedir(d); - return list_files(out, (const char**)files, n_files, flags | LS_DIR_FLAG); -} - -static int -parse_flags(const char *options) -{ -#ifdef TEST - int flags = LS_SORT_NAME | LS_IGNORE_DOT | LS_DISP_COLUMN; -#else - int flags = LS_SORT_NAME | LS_IGNORE_DOT | LS_DISP_LONG; -#endif - - const char *p; - if(options == NULL || *options != '-') - return flags; - for(p = options + 1; *p; p++) { - switch(*p) { - case '1': - flags = (flags & ~LS_DISP_MODE); - break; - case 'a': - flags |= LS_SHOW_ALL; - /*FALLTHROUGH*/ - case 'A': - flags &= ~LS_IGNORE_DOT; - break; - case 'C': - flags = (flags & ~LS_DISP_MODE) | LS_DISP_COLUMN; - break; - case 'd': - flags |= LS_DIRS; - break; - case 'f': - flags = (flags & ~LS_SORT_MODE); - break; - case 'F': - flags |= LS_TYPE; - break; - case 'i': - flags |= LS_INODE; - break; - case 'l': - flags = (flags & ~LS_DISP_MODE) | LS_DISP_LONG; - break; - case 'r': - flags |= LS_SORT_REVERSE; - break; - case 'R': - flags |= LS_RECURSIVE; - break; - case 's': - flags |= LS_SIZE; - break; - case 'S': - flags = (flags & ~LS_SORT_MODE) | LS_SORT_SIZE; - break; - case 't': - flags = (flags & ~LS_SORT_MODE) | LS_SORT_MTIME; - break; - case 'x': - flags = (flags & ~LS_DISP_MODE) | LS_DISP_CROSS; - break; - /* these are a bunch of unimplemented flags from BSD ls */ - case 'k': /* display sizes in kB */ - case 'c': /* last change time */ - case 'L': /* list symlink target */ - case 'm': /* stream output */ - case 'o': /* BSD file flags */ - case 'p': /* display / after directories */ - case 'q': /* print non-graphic characters */ - case 'u': /* use last access time */ - case 'T': /* display complete time */ - case 'W': /* include whiteouts */ - break; - } - } - return flags; -} - -int -builtin_ls(FILE *out, const char *file) -{ - int flags; - int ret; - - if(*file == '-') { - flags = parse_flags(file); - file = "."; - } else - flags = parse_flags(""); - - ret = list_files(out, &file, 1, flags); - sec_fflush(out); - return ret; -} diff --git a/crypto/heimdal/appl/ftp/ftpd/pathnames.h b/crypto/heimdal/appl/ftp/ftpd/pathnames.h deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/pathnames.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)pathnames.h 8.1 (Berkeley) 6/4/93 - */ - -#ifdef HAVE_PATHS_H -#include -#endif - -#ifndef _PATH_DEVNULL -#define _PATH_DEVNULL "/dev/null" -#endif - -#ifndef _PATH_NOLOGIN -#define _PATH_NOLOGIN "/etc/nologin" -#endif - -#ifndef _PATH_BSHELL -#define _PATH_BSHELL "/bin/sh" -#endif - -#ifndef _PATH_FTPUSERS -#define _PATH_FTPUSERS SYSCONFDIR "/ftpusers" -#endif - -#define _PATH_FTPCHROOT SYSCONFDIR "/ftpchroot" -#define _PATH_FTPWELCOME SYSCONFDIR "/ftpwelcome" -#define _PATH_FTPLOGINMESG SYSCONFDIR "/motd" - -#ifndef _PATH_ISSUE -#define _PATH_ISSUE SYSCONFDIR "/issue" -#endif -#define _PATH_ISSUE_NET SYSCONFDIR "/issue.net" diff --git a/crypto/heimdal/appl/ftp/ftpd/popen.c b/crypto/heimdal/appl/ftp/ftpd/popen.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/popen.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (c) 1988, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software written by Ken Arnold and - * published in UNIX Review, Vol. 6, No. 8. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#ifdef HAVE_CONFIG_H -#include -RCSID("$Id$"); -#endif - -#include -#ifdef TIME_WITH_SYS_TIME -#include -#include -#elif defined(HAVE_SYS_TIME_H) -#include -#else -#include -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include "extern.h" - - -/* - * Special version of popen which avoids call to shell. This ensures - * no one may create a pipe to a hidden program as a side effect of a - * list or dir command. - */ -static int *pids; -static int fds; - -/* return path prepended with ~ftp if that file exists, otherwise - * return path unchanged - */ - -const char * -ftp_rooted(const char *path) -{ - static char home[MaxPathLen] = ""; - static char newpath[MaxPathLen]; - struct passwd *pwd; - - if(!home[0]) - if((pwd = k_getpwnam("ftp"))) - strlcpy(home, pwd->pw_dir, sizeof(home)); - snprintf(newpath, sizeof(newpath), "%s/%s", home, path); - if(access(newpath, X_OK)) - strlcpy(newpath, path, sizeof(newpath)); - return newpath; -} - - -#define MAXARGS 100 -#define MAXGLOBS 1000 - -FILE * -ftpd_popen(char *program, char *type, int do_stderr, int no_glob) -{ - char *cp; - FILE *iop; - int argc, gargc, pdes[2], pid; - char **pop, *argv[MAXARGS], *gargv[MAXGLOBS]; - char *foo; - - if (strcmp(type, "r") && strcmp(type, "w")) - return (NULL); - - if (!pids) { - - /* This function is ugly and should be rewritten, in - * modern unices there is no such thing as a maximum - * filedescriptor. - */ - - fds = getdtablesize(); - pids = (int*)calloc(fds, sizeof(int)); - if(!pids) - return NULL; - } - if (pipe(pdes) < 0) - return (NULL); - - /* break up string into pieces */ - foo = NULL; - for (argc = 0, cp = program; argc < MAXARGS - 1; cp = NULL) { - if (!(argv[argc++] = strtok_r(cp, " \t\n", &foo))) - break; - } - argv[MAXARGS - 1] = NULL; - - gargv[0] = (char*)ftp_rooted(argv[0]); - /* glob each piece */ - for (gargc = argc = 1; argv[argc] && gargc < MAXGLOBS - 1; argc++) { - glob_t gl; - int flags = GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE - | -#ifdef GLOB_MAXPATH - GLOB_MAXPATH -#else - GLOB_LIMIT -#endif - ; - - memset(&gl, 0, sizeof(gl)); - if (no_glob || - glob(argv[argc], flags, NULL, &gl) || - gl.gl_pathc == 0) - gargv[gargc++] = strdup(argv[argc]); - else - for (pop = gl.gl_pathv; - *pop && gargc < MAXGLOBS - 1; - pop++) - gargv[gargc++] = strdup(*pop); - globfree(&gl); - } - gargv[gargc] = NULL; - - iop = NULL; - switch(pid = fork()) { - case -1: /* error */ - close(pdes[0]); - close(pdes[1]); - goto pfree; - /* NOTREACHED */ - case 0: /* child */ - if (*type == 'r') { - if (pdes[1] != STDOUT_FILENO) { - dup2(pdes[1], STDOUT_FILENO); - close(pdes[1]); - } - if(do_stderr) - dup2(STDOUT_FILENO, STDERR_FILENO); - close(pdes[0]); - } else { - if (pdes[0] != STDIN_FILENO) { - dup2(pdes[0], STDIN_FILENO); - close(pdes[0]); - } - close(pdes[1]); - } - execv(gargv[0], gargv); - gargv[0] = argv[0]; - execv(gargv[0], gargv); - _exit(1); - } - /* parent; assume fdopen can't fail... */ - if (*type == 'r') { - iop = fdopen(pdes[0], type); - close(pdes[1]); - } else { - iop = fdopen(pdes[1], type); - close(pdes[0]); - } - pids[fileno(iop)] = pid; - -pfree: - for (argc = 1; gargv[argc] != NULL; argc++) - free(gargv[argc]); - - - return (iop); -} - -int -ftpd_pclose(FILE *iop) -{ - int fdes, status; - pid_t pid; - sigset_t sigset, osigset; - - /* - * pclose returns -1 if stream is not associated with a - * `popened' command, or, if already `pclosed'. - */ - if (pids == 0 || pids[fdes = fileno(iop)] == 0) - return (-1); - fclose(iop); - sigemptyset(&sigset); - sigaddset(&sigset, SIGINT); - sigaddset(&sigset, SIGQUIT); - sigaddset(&sigset, SIGHUP); - sigprocmask(SIG_BLOCK, &sigset, &osigset); - while ((pid = waitpid(pids[fdes], &status, 0)) < 0 && errno == EINTR) - continue; - sigprocmask(SIG_SETMASK, &osigset, NULL); - pids[fdes] = 0; - if (pid < 0) - return (pid); - if (WIFEXITED(status)) - return (WEXITSTATUS(status)); - return (1); -} diff --git a/crypto/heimdal/appl/ftp/ftpd/security.c b/crypto/heimdal/appl/ftp/ftpd/security.c deleted file mode 100644 --- a/crypto/heimdal/appl/ftp/ftpd/security.c +++ /dev/null @@ -1,883 +0,0 @@ -/* - * Copyright (c) 1998-2002, 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifdef FTP_SERVER -#include "ftpd_locl.h" -#else -#include "ftp_locl.h" -#endif - -RCSID("$Id$"); - -static enum protection_level command_prot; -static enum protection_level data_prot; -static size_t buffer_size; - -struct buffer { - void *data; - size_t size; - size_t index; - int eof_flag; -}; - -static struct buffer in_buffer, out_buffer; -int sec_complete; - -static struct { - enum protection_level level; - const char *name; -} level_names[] = { - { prot_clear, "clear" }, - { prot_safe, "safe" }, - { prot_confidential, "confidential" }, - { prot_private, "private" } -}; - -static const char * -level_to_name(enum protection_level level) -{ - int i; - for(i = 0; i < sizeof(level_names) / sizeof(level_names[0]); i++) - if(level_names[i].level == level) - return level_names[i].name; - return "unknown"; -} - -#ifndef FTP_SERVER /* not used in server */ -static enum protection_level -name_to_level(const char *name) -{ - int i; - for(i = 0; i < sizeof(level_names) / sizeof(level_names[0]); i++) - if(!strncasecmp(level_names[i].name, name, strlen(name))) - return level_names[i].level; - return prot_invalid; -} -#endif - -#ifdef FTP_SERVER - -static struct sec_server_mech *mechs[] = { -#ifdef KRB5 - &gss_server_mech, -#endif - NULL -}; - -static struct sec_server_mech *mech; - -#else - -static struct sec_client_mech *mechs[] = { -#ifdef KRB5 - &gss_client_mech, -#endif - NULL -}; - -static struct sec_client_mech *mech; - -#endif - -static void *app_data; - -int -sec_getc(FILE *F) -{ - if(sec_complete && data_prot) { - char c; - if(sec_read(fileno(F), &c, 1) <= 0) - return EOF; - return c; - } else - return getc(F); -} - -static int -block_read(int fd, void *buf, size_t len) -{ - unsigned char *p = buf; - int b; - while(len) { - b = read(fd, p, len); - if (b == 0) - return 0; - else if (b < 0) - return -1; - len -= b; - p += b; - } - return p - (unsigned char*)buf; -} - -static int -block_write(int fd, void *buf, size_t len) -{ - unsigned char *p = buf; - int b; - while(len) { - b = write(fd, p, len); - if(b < 0) - return -1; - len -= b; - p += b; - } - return p - (unsigned char*)buf; -} - -static int -sec_get_data(int fd, struct buffer *buf, int level) -{ - int len; - int b; - void *tmp; - - b = block_read(fd, &len, sizeof(len)); - if (b == 0) - return 0; - else if (b < 0) - return -1; - len = ntohl(len); - tmp = realloc(buf->data, len); - if (tmp == NULL) - return -1; - buf->data = tmp; - b = block_read(fd, buf->data, len); - if (b == 0) - return 0; - else if (b < 0) - return -1; - buf->size = (*mech->decode)(app_data, buf->data, len, data_prot); - buf->index = 0; - return 0; -} - -static size_t -buffer_read(struct buffer *buf, void *dataptr, size_t len) -{ - len = min(len, buf->size - buf->index); - memcpy(dataptr, (char*)buf->data + buf->index, len); - buf->index += len; - return len; -} - -static size_t -buffer_write(struct buffer *buf, void *dataptr, size_t len) -{ - if(buf->index + len > buf->size) { - void *tmp; - if(buf->data == NULL) - tmp = malloc(1024); - else - tmp = realloc(buf->data, buf->index + len); - if(tmp == NULL) - return -1; - buf->data = tmp; - buf->size = buf->index + len; - } - memcpy((char*)buf->data + buf->index, dataptr, len); - buf->index += len; - return len; -} - -int -sec_read(int fd, void *dataptr, int length) -{ - size_t len; - int rx = 0; - - if(sec_complete == 0 || data_prot == 0) - return read(fd, dataptr, length); - - if(in_buffer.eof_flag){ - in_buffer.eof_flag = 0; - return 0; - } - - len = buffer_read(&in_buffer, dataptr, length); - length -= len; - rx += len; - dataptr = (char*)dataptr + len; - - while(length){ - int ret; - - ret = sec_get_data(fd, &in_buffer, data_prot); - if (ret < 0) - return -1; - if(ret == 0 && in_buffer.size == 0) { - if(rx) - in_buffer.eof_flag = 1; - return rx; - } - len = buffer_read(&in_buffer, dataptr, length); - length -= len; - rx += len; - dataptr = (char*)dataptr + len; - } - return rx; -} - -static int -sec_send(int fd, char *from, int length) -{ - int bytes; - void *buf; - bytes = (*mech->encode)(app_data, from, length, data_prot, &buf); - bytes = htonl(bytes); - block_write(fd, &bytes, sizeof(bytes)); - block_write(fd, buf, ntohl(bytes)); - free(buf); - return length; -} - -int -sec_fflush(FILE *F) -{ - if(data_prot != prot_clear) { - if(out_buffer.index > 0){ - sec_write(fileno(F), out_buffer.data, out_buffer.index); - out_buffer.index = 0; - } - sec_send(fileno(F), NULL, 0); - } - fflush(F); - return 0; -} - -int -sec_write(int fd, char *dataptr, int length) -{ - int len = buffer_size; - int tx = 0; - - if(data_prot == prot_clear) - return write(fd, dataptr, length); - - len -= (*mech->overhead)(app_data, data_prot, len); - while(length){ - if(length < len) - len = length; - sec_send(fd, dataptr, len); - length -= len; - dataptr += len; - tx += len; - } - return tx; -} - -int -sec_vfprintf2(FILE *f, const char *fmt, va_list ap) -{ - char *buf; - int ret; - if(data_prot == prot_clear) - return vfprintf(f, fmt, ap); - else { - int len; - len = vasprintf(&buf, fmt, ap); - if (len == -1) - return len; - ret = buffer_write(&out_buffer, buf, len); - free(buf); - return ret; - } -} - -int -sec_fprintf2(FILE *f, const char *fmt, ...) -{ - int ret; - va_list ap; - va_start(ap, fmt); - ret = sec_vfprintf2(f, fmt, ap); - va_end(ap); - return ret; -} - -int -sec_putc(int c, FILE *F) -{ - char ch = c; - if(data_prot == prot_clear) - return putc(c, F); - - buffer_write(&out_buffer, &ch, 1); - if(c == '\n' || out_buffer.index >= 1024 /* XXX */) { - sec_write(fileno(F), out_buffer.data, out_buffer.index); - out_buffer.index = 0; - } - return c; -} - -int -sec_read_msg(char *s, int level) -{ - int len; - char *buf; - int return_code; - - buf = malloc(strlen(s)); - len = base64_decode(s + 4, buf); /* XXX */ - - len = (*mech->decode)(app_data, buf, len, level); - if(len < 0) - return -1; - - buf[len] = '\0'; - - if(buf[3] == '-') - return_code = 0; - else - sscanf(buf, "%d", &return_code); - if(buf[len-1] == '\n') - buf[len-1] = '\0'; - strcpy(s, buf); - free(buf); - return return_code; -} - -int -sec_vfprintf(FILE *f, const char *fmt, va_list ap) -{ - char *buf; - void *enc; - int len; - if(!sec_complete) - return vfprintf(f, fmt, ap); - - if (vasprintf(&buf, fmt, ap) == -1) { - printf("Failed to allocate command.\n"); - return -1; - } - len = (*mech->encode)(app_data, buf, strlen(buf), command_prot, &enc); - free(buf); - if(len < 0) { - printf("Failed to encode command.\n"); - return -1; - } - if(base64_encode(enc, len, &buf) < 0){ - free(enc); - printf("Out of memory base64-encoding.\n"); - return -1; - } - free(enc); -#ifdef FTP_SERVER - if(command_prot == prot_safe) - fprintf(f, "631 %s\r\n", buf); - else if(command_prot == prot_private) - fprintf(f, "632 %s\r\n", buf); - else if(command_prot == prot_confidential) - fprintf(f, "633 %s\r\n", buf); -#else - if(command_prot == prot_safe) - fprintf(f, "MIC %s", buf); - else if(command_prot == prot_private) - fprintf(f, "ENC %s", buf); - else if(command_prot == prot_confidential) - fprintf(f, "CONF %s", buf); -#endif - free(buf); - return 0; -} - -int -sec_fprintf(FILE *f, const char *fmt, ...) -{ - va_list ap; - int ret; - va_start(ap, fmt); - ret = sec_vfprintf(f, fmt, ap); - va_end(ap); - return ret; -} - -/* end common stuff */ - -#ifdef FTP_SERVER - -int ccc_passed; - -void -auth(char *auth_name) -{ - int i; - void *tmp; - - for(i = 0; (mech = mechs[i]) != NULL; i++){ - if(!strcasecmp(auth_name, mech->name)){ - tmp = realloc(app_data, mech->size); - if (tmp == NULL) { - reply(431, "Unable to accept %s at this time", mech->name); - return; - } - app_data = tmp; - - if(mech->init && (*mech->init)(app_data) != 0) { - reply(431, "Unable to accept %s at this time", mech->name); - return; - } - if(mech->auth) { - (*mech->auth)(app_data); - return; - } - if(mech->adat) - reply(334, "Send authorization data."); - else - reply(234, "Authorization complete."); - return; - } - } - free (app_data); - app_data = NULL; - reply(504, "%s is unknown to me", auth_name); -} - -void -adat(char *auth_data) -{ - if(mech && !sec_complete) { - void *buf = malloc(strlen(auth_data)); - size_t len; - len = base64_decode(auth_data, buf); - (*mech->adat)(app_data, buf, len); - free(buf); - } else - reply(503, "You must %sissue an AUTH first.", mech ? "re-" : ""); -} - -void pbsz(int size) -{ - size_t new = size; - if(!sec_complete) - reply(503, "Incomplete security data exchange."); - if(mech->pbsz) - new = (*mech->pbsz)(app_data, size); - if(buffer_size != new){ - buffer_size = size; - } - if(new != size) - reply(200, "PBSZ=%lu", (unsigned long)new); - else - reply(200, "OK"); -} - -void -prot(char *pl) -{ - int p = -1; - - if(buffer_size == 0){ - reply(503, "No protection buffer size negotiated."); - return; - } - - if(!strcasecmp(pl, "C")) - p = prot_clear; - else if(!strcasecmp(pl, "S")) - p = prot_safe; - else if(!strcasecmp(pl, "E")) - p = prot_confidential; - else if(!strcasecmp(pl, "P")) - p = prot_private; - else { - reply(504, "Unrecognized protection level."); - return; - } - - if(sec_complete){ - if((*mech->check_prot)(app_data, p)){ - reply(536, "%s does not support %s protection.", - mech->name, level_to_name(p)); - }else{ - data_prot = (enum protection_level)p; - reply(200, "Data protection is %s.", level_to_name(p)); - } - }else{ - reply(503, "Incomplete security data exchange."); - } -} - -void ccc(void) -{ - if(sec_complete){ - if(mech->ccc && (*mech->ccc)(app_data) == 0) { - command_prot = data_prot = prot_clear; - ccc_passed = 1; - } else - reply(534, "You must be joking."); - }else - reply(503, "Incomplete security data exchange."); -} - -void mec(char *msg, enum protection_level level) -{ - void *buf; - size_t len, buf_size; - if(!sec_complete) { - reply(503, "Incomplete security data exchange."); - return; - } - buf_size = strlen(msg) + 2; - buf = malloc(buf_size); - if (buf == NULL) { - reply(501, "Failed to allocate %lu", (unsigned long)buf_size); - return; - } - len = base64_decode(msg, buf); - command_prot = level; - if(len == (size_t)-1) { - free(buf); - reply(501, "Failed to base64-decode command"); - return; - } - len = (*mech->decode)(app_data, buf, len, level); - if(len == (size_t)-1) { - free(buf); - reply(535, "Failed to decode command"); - return; - } - ((char*)buf)[len] = '\0'; - if(strstr((char*)buf, "\r\n") == NULL) - strlcat((char*)buf, "\r\n", buf_size); - new_ftp_command(buf); -} - -/* ------------------------------------------------------------ */ - -int -sec_userok(char *userstr) -{ - if(sec_complete) - return (*mech->userok)(app_data, userstr); - return 0; -} - -int -sec_session(char *user) -{ - if(sec_complete && mech->session) - return (*mech->session)(app_data, user); - return 0; -} - -char *ftp_command; - -void -new_ftp_command(char *command) -{ - ftp_command = command; -} - -void -delete_ftp_command(void) -{ - free(ftp_command); - ftp_command = NULL; -} - -int -secure_command(void) -{ - return ftp_command != NULL; -} - -enum protection_level -get_command_prot(void) -{ - return command_prot; -} - -#else /* FTP_SERVER */ - -void -sec_status(void) -{ - if(sec_complete){ - printf("Using %s for authentication.\n", mech->name); - printf("Using %s command channel.\n", level_to_name(command_prot)); - printf("Using %s data channel.\n", level_to_name(data_prot)); - if(buffer_size > 0) - printf("Protection buffer size: %lu.\n", - (unsigned long)buffer_size); - }else{ - printf("Not using any security mechanism.\n"); - } -} - -static int -sec_prot_internal(int level) -{ - int ret; - char *p; - unsigned int s = 1048576; - - int old_verbose = verbose; - verbose = 0; - - if(!sec_complete){ - printf("No security data exchange has taken place.\n"); - return -1; - } - - if(level){ - ret = command("PBSZ %u", s); - if(ret != COMPLETE){ - printf("Failed to set protection buffer size.\n"); - return -1; - } - buffer_size = s; - p = strstr(reply_string, "PBSZ="); - if(p) - sscanf(p, "PBSZ=%u", &s); - if(s < buffer_size) - buffer_size = s; - } - verbose = old_verbose; - ret = command("PROT %c", level["CSEP"]); /* XXX :-) */ - if(ret != COMPLETE){ - printf("Failed to set protection level.\n"); - return -1; - } - - data_prot = (enum protection_level)level; - return 0; -} - -enum protection_level -set_command_prot(enum protection_level level) -{ - int ret; - enum protection_level old = command_prot; - if(level != command_prot && level == prot_clear) { - ret = command("CCC"); - if(ret != COMPLETE) { - printf("Failed to clear command channel.\n"); - return prot_invalid; - } - } - command_prot = level; - return old; -} - -void -sec_prot(int argc, char **argv) -{ - int level = -1; - - if(argc > 3) - goto usage; - - if(argc == 1) { - sec_status(); - return; - } - if(!sec_complete) { - printf("No security data exchange has taken place.\n"); - code = -1; - return; - } - level = name_to_level(argv[argc - 1]); - - if(level == -1) - goto usage; - - if((*mech->check_prot)(app_data, level)) { - printf("%s does not implement %s protection.\n", - mech->name, level_to_name(level)); - code = -1; - return; - } - - if(argc == 2 || strncasecmp(argv[1], "data", strlen(argv[1])) == 0) { - if(sec_prot_internal(level) < 0){ - code = -1; - return; - } - } else if(strncasecmp(argv[1], "command", strlen(argv[1])) == 0) { - if(set_command_prot(level) < 0) { - code = -1; - return; - } - } else - goto usage; - code = 0; - return; - usage: - printf("usage: %s [command|data] [clear|safe|confidential|private]\n", - argv[0]); - code = -1; -} - -void -sec_prot_command(int argc, char **argv) -{ - int level; - - if(argc > 2) - goto usage; - - if(!sec_complete) { - printf("No security data exchange has taken place.\n"); - code = -1; - return; - } - - if(argc == 1) { - sec_status(); - } else { - level = name_to_level(argv[1]); - if(level == -1) - goto usage; - - if((*mech->check_prot)(app_data, level)) { - printf("%s does not implement %s protection.\n", - mech->name, level_to_name(level)); - code = -1; - return; - } - if(set_command_prot(level) < 0) { - code = -1; - return; - } - } - code = 0; - return; - usage: - printf("usage: %s [clear|safe|confidential|private]\n", - argv[0]); - code = -1; -} - -static enum protection_level request_data_prot; - -void -sec_set_protection_level(void) -{ - if(sec_complete && data_prot != request_data_prot) - sec_prot_internal(request_data_prot); -} - - -int -sec_request_prot(char *level) -{ - int l = name_to_level(level); - if(l == -1) - return -1; - request_data_prot = (enum protection_level)l; - return 0; -} - -int -sec_login(char *host) -{ - int ret; - struct sec_client_mech **m; - int old_verbose = verbose; - - verbose = -1; /* shut up all messages this will produce (they - are usually not very user friendly) */ - - for(m = mechs; *m && (*m)->name; m++) { - void *tmp; - - tmp = realloc(app_data, (*m)->size); - if (tmp == NULL) { - warnx ("realloc %lu failed", (unsigned long)(*m)->size); - return -1; - } - app_data = tmp; - - if((*m)->init && (*(*m)->init)(app_data) != 0) { - printf("Skipping %s...\n", (*m)->name); - continue; - } - printf("Trying %s...\n", (*m)->name); - ret = command("AUTH %s", (*m)->name); - if(ret != CONTINUE){ - if(code == 504){ - printf("%s is not supported by the server.\n", (*m)->name); - }else if(code == 534){ - printf("%s rejected as security mechanism.\n", (*m)->name); - }else if(ret == ERROR) { - printf("The server doesn't support the FTP " - "security extensions.\n"); - verbose = old_verbose; - return -1; - } - continue; - } - - ret = (*(*m)->auth)(app_data, host); - - if(ret == AUTH_CONTINUE) - continue; - else if(ret != AUTH_OK){ - /* mechanism is supposed to output error string */ - verbose = old_verbose; - return -1; - } - mech = *m; - sec_complete = 1; - if(doencrypt) { - command_prot = prot_private; - request_data_prot = prot_private; - } else { - command_prot = prot_safe; - } - break; - } - - verbose = old_verbose; - return *m == NULL; -} - -void -sec_end(void) -{ - if (mech != NULL) { - if(mech->end) - (*mech->end)(app_data); - if (app_data != NULL) { - memset(app_data, 0, mech->size); - free(app_data); - app_data = NULL; - } - } - sec_complete = 0; - data_prot = (enum protection_level)0; -} - -#endif /* FTP_SERVER */ - diff --git a/crypto/heimdal/appl/gssmask/Makefile.in b/crypto/heimdal/appl/gssmask/Makefile.in --- a/crypto/heimdal/appl/gssmask/Makefile.in +++ b/crypto/heimdal/appl/gssmask/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,15 +94,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common noinst_PROGRAMS = gssmask$(EXEEXT) gssmaestro$(EXEEXT) subdir = appl/gssmask ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -59,8 +109,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -73,6 +122,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -92,6 +142,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -103,32 +154,84 @@ am__DEPENDENCIES_1 = gssmaestro_DEPENDENCIES = $(top_builddir)/lib/gssapi/libgssapi.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/krb5/libkrb5.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = am_gssmask_OBJECTS = gssmask.$(OBJEXT) common.$(OBJEXT) gssmask_OBJECTS = $(am_gssmask_OBJECTS) gssmask_LDADD = $(LDADD) gssmask_DEPENDENCIES = $(top_builddir)/lib/gssapi/libgssapi.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/krb5/libkrb5.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/common.Po ./$(DEPDIR)/gssmaestro.Po \ + ./$(DEPDIR)/gssmask.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(gssmaestro_SOURCES) $(gssmask_SOURCES) DIST_SOURCES = $(gssmaestro_SOURCES) $(gssmask_SOURCES) -ETAGS = etags -CTAGS = ctags +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -143,16 +246,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -162,17 +268,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -191,12 +299,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -205,6 +310,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -221,10 +327,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -232,6 +336,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -246,12 +351,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -268,10 +376,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -282,13 +396,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -312,6 +420,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -335,9 +445,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -347,29 +462,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; gssmask_SOURCES = gssmask.c common.c common.h protocol.h gssmaestro_SOURCES = gssmaestro.c common.c common.h protocol.h LDADD = $(top_builddir)/lib/gssapi/libgssapi.la $(LIB_roken) $(top_builddir)/lib/krb5/libkrb5.la @@ -377,7 +500,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -390,15 +513,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign appl/gssmask/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign appl/gssmask/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -417,12 +540,14 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -gssmaestro$(EXEEXT): $(gssmaestro_OBJECTS) $(gssmaestro_DEPENDENCIES) + +gssmaestro$(EXEEXT): $(gssmaestro_OBJECTS) $(gssmaestro_DEPENDENCIES) $(EXTRA_gssmaestro_DEPENDENCIES) @rm -f gssmaestro$(EXEEXT) - $(LINK) $(gssmaestro_OBJECTS) $(gssmaestro_LDADD) $(LIBS) -gssmask$(EXEEXT): $(gssmask_OBJECTS) $(gssmask_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(gssmaestro_OBJECTS) $(gssmaestro_LDADD) $(LIBS) + +gssmask$(EXEEXT): $(gssmask_OBJECTS) $(gssmask_DEPENDENCIES) $(EXTRA_gssmask_DEPENDENCIES) @rm -f gssmask$(EXEEXT) - $(LINK) $(gssmask_OBJECTS) $(gssmask_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(gssmask_OBJECTS) $(gssmask_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -430,30 +555,36 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssmaestro.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssmask.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssmaestro.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssmask.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -461,26 +592,15 @@ 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) +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -492,15 +612,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -509,11 +625,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -561,10 +694,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -582,7 +720,9 @@ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/common.Po + -rm -f ./$(DEPDIR)/gssmaestro.Po + -rm -f ./$(DEPDIR)/gssmask.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -606,9 +746,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -630,7 +769,9 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/common.Po + -rm -f ./$(DEPDIR)/gssmaestro.Po + -rm -f ./$(DEPDIR)/gssmask.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -650,38 +791,53 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libtool clean-noinstPROGRAMS ctags \ - dist-hook distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libtool \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am dist-hook \ + 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + 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-hook + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -689,7 +845,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -734,11 +890,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -746,6 +911,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -788,6 +955,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -801,13 +981,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/appl/gssmask/NTMakefile b/crypto/heimdal/appl/gssmask/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/gssmask/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\gssmask + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/gssmask/common.h b/crypto/heimdal/appl/gssmask/common.h --- a/crypto/heimdal/appl/gssmask/common.h +++ b/crypto/heimdal/appl/gssmask/common.h @@ -37,13 +37,6 @@ #include #endif -/* - * pthread support is disable because the pthread - * test have no "application pthread libflags" variable, - * when this is fixed pthread support can be enabled again. - */ -#undef ENABLE_PTHREAD_SUPPORT - #include #ifdef HAVE_SYS_UTSNAME_H #include @@ -65,6 +58,13 @@ #include "protocol.h" +/* + * pthread support is disable because the pthread + * test have no "application pthread libflags" variable, + * when this is fixed pthread support can be enabled again. + */ +#undef ENABLE_PTHREAD_SUPPORT + krb5_error_code store_string(krb5_storage *, const char *); diff --git a/crypto/heimdal/appl/gssmask/gssmaestro.c b/crypto/heimdal/appl/gssmask/gssmaestro.c --- a/crypto/heimdal/appl/gssmask/gssmaestro.c +++ b/crypto/heimdal/appl/gssmask/gssmaestro.c @@ -270,26 +270,27 @@ int32_t port; struct sockaddr_storage sast; socklen_t salen = sizeof(sast); - int fd, fd2, ret; + krb5_socket_t sock, sock2; + int ret; memset(&sast, 0, sizeof(sast)); assert(sizeof(sast) >= c->salen); - fd = socket(c->sa->sa_family, SOCK_STREAM, 0); - if (fd < 0) + sock = socket(c->sa->sa_family, SOCK_STREAM, 0); + if (sock == rk_INVALID_SOCKET) err(1, "failed to build socket for %s's logging port", c->moniker); - ((struct sockaddr *)&sast)->sa_family = c->sa->sa_family; - ret = bind(fd, (struct sockaddr *)&sast, c->salen); + sast.ss_family = c->sa->sa_family; + ret = bind(sock, (struct sockaddr *)&sast, c->salen); if (ret < 0) err(1, "failed to bind %s's logging port", c->moniker); - if (listen(fd, SOMAXCONN) < 0) + if (listen(sock, SOMAXCONN) < 0) err(1, "failed to listen %s's logging port", c->moniker); salen = sizeof(sast); - ret = getsockname(fd, (struct sockaddr *)&sast, &salen); + ret = getsockname(sock, (struct sockaddr *)&sast, &salen); if (ret < 0) err(1, "failed to get address of local socket for %s", c->moniker); @@ -299,12 +300,12 @@ put32(c, ntohs(port)); salen = sizeof(sast); - fd2 = accept(fd, (struct sockaddr *)&sast, &salen); - if (fd2 < 0) + sock2 = accept(sock, (struct sockaddr *)&sast, &salen); + if (sock2 == rk_INVALID_SOCKET) err(1, "failed to accept local socket for %s", c->moniker); - close(fd); + rk_closesocket(sock); - return fd2; + return sock2; } @@ -474,10 +475,10 @@ int32_t val; header.data = "header"; - header.length = 6; + header.length = sizeof("header") - 1; msg.data = "0123456789abcdef"; /* padded for most enctypes */ - msg.length = 32; + msg.length = sizeof("0123456789abcdef") - 1; trailer.data = "trailer"; trailer.length = 7; @@ -565,7 +566,7 @@ { struct client *c = ptr; int32_t cmd, line; - char *file, *string; + char *file = NULL, *string = NULL; while (1) { if (krb5_ret_int32(c->logsock, &cmd)) @@ -575,7 +576,6 @@ case eLogSetMoniker: if (krb5_ret_string(c->logsock, &file)) goto out; - free(file); break; case eLogInfo: case eLogFailure: @@ -590,8 +590,6 @@ fprintf(logfile, "%s:%lu: %s\n", file, (unsigned long)line, string); fflush(logfile); - free(file); - free(string); if (krb5_store_int32(c->logsock, 0)) goto out; break; @@ -600,6 +598,8 @@ } } out: + free(file); + free(string); return 0; } @@ -610,7 +610,8 @@ char *name, *port; struct client *c = ecalloc(1, sizeof(*c)); struct addrinfo hints, *res0, *res; - int ret, fd; + int ret; + krb5_socket_t sock; name = estrdup(slave); port = strchr(name, ':'); @@ -628,13 +629,13 @@ if (ret) errx(1, "error resolving %s", name); - for (res = res0, fd = -1; res; res = res->ai_next) { - fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol); - if (fd < 0) + for (res = res0, sock = rk_INVALID_SOCKET; res; res = res->ai_next) { + sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); + if (sock == rk_INVALID_SOCKET) continue; - if (connect(fd, res->ai_addr, res->ai_addrlen) < 0) { - close(fd); - fd = -1; + if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) { + rk_closesocket(sock); + sock = rk_INVALID_SOCKET; continue; } c->sa = ecalloc(1, res->ai_addrlen); @@ -642,12 +643,12 @@ c->salen = res->ai_addrlen; break; /* okay we got one */ } - if (fd < 0) + if (sock == rk_INVALID_SOCKET) err(1, "connect to host: %s", name); - freeaddrinfo(res); + freeaddrinfo(res0); - c->sock = krb5_storage_from_fd(fd); - close(fd); + c->sock = krb5_storage_from_socket(sock); + rk_closesocket(sock); if (c->sock == NULL) errx(1, "krb5_storage_from_fd"); @@ -667,14 +668,12 @@ } if (logfile) { - int fd; - printf("starting log socket to client %s\n", c->moniker); - fd = wait_log(c); + sock = wait_log(c); - c->logsock = krb5_storage_from_fd(fd); - close(fd); + c->logsock = krb5_storage_from_socket(sock); + rk_closesocket(sock); if (c->logsock == NULL) errx(1, "failed to create log krb5_storage"); #ifdef ENABLE_PTHREAD_SUPPORT diff --git a/crypto/heimdal/appl/gssmask/gssmask.c b/crypto/heimdal/appl/gssmask/gssmask.c --- a/crypto/heimdal/appl/gssmask/gssmask.c +++ b/crypto/heimdal/appl/gssmask/gssmask.c @@ -73,10 +73,13 @@ char *message; va_list ap; int32_t ackid; + int ret; va_start(ap, fmt); - vasprintf(&message, fmt, ap); + ret = vasprintf(&message, fmt, ap); va_end(ap); + if (ret == -1) + errx(1, "out of memory"); if (logfile) fprintf(logfile, "%s:%u: %d %s\n", file, lineno, level, message); @@ -309,7 +312,8 @@ gss_ctx_id_t ctx; gss_cred_id_t creds; gss_name_t gss_target_name; - gss_buffer_desc input_token, output_token; + gss_buffer_desc input_token; + gss_buffer_desc output_token = {0, 0}; gss_OID oid = GSS_C_NO_OID; gss_buffer_t input_token_ptr = GSS_C_NO_BUFFER; @@ -427,7 +431,6 @@ gss_ctx_id_t ctx; gss_cred_id_t deleg_cred = GSS_C_NO_CREDENTIAL; gss_buffer_desc input_token, output_token; - gss_buffer_t input_token_ptr = GSS_C_NO_BUFFER; ret32(c, hContext); ret32(c, flags); @@ -440,7 +443,6 @@ if (in_token.length) { input_token.length = in_token.length; input_token.value = in_token.data; - input_token_ptr = &input_token; } else { input_token.length = 0; input_token.value = NULL; @@ -645,6 +647,7 @@ { int32_t cap = HAS_MONIKER; char name[256] = "unknown", *str; + int ret; if (targetname) cap |= ISSERVER; /* is server */ @@ -659,7 +662,9 @@ } #endif - asprintf(&str, "gssmask %s %s", PACKAGE_STRING, name); + ret = asprintf(&str, "gssmask %s %s", PACKAGE_STRING, name); + if (ret == -1) + errx(1, "out of memory"); put32(c, GSSMAGGOTPROTOCOL); put32(c, cap); @@ -683,7 +688,8 @@ HandleOP(SetLoggingSocket) { int32_t portnum; - int fd, ret; + krb5_socket_t sock; + int ret; ret32(c, portnum); @@ -692,22 +698,22 @@ socket_set_port((struct sockaddr *)(&c->sa), htons(portnum)); - fd = socket(((struct sockaddr *)&c->sa)->sa_family, SOCK_STREAM, 0); - if (fd < 0) + sock = socket(((struct sockaddr *)&c->sa)->sa_family, SOCK_STREAM, 0); + if (sock == rk_INVALID_SOCKET) return 0; - ret = connect(fd, (struct sockaddr *)&c->sa, c->salen); + ret = connect(sock, (struct sockaddr *)&c->sa, c->salen); if (ret < 0) { logmessage(c, __FILE__, __LINE__, 0, "failed connect to log port: %s", strerror(errno)); - close(fd); + rk_closesocket(sock); return 0; } if (c->logging) krb5_storage_free(c->logging); - c->logging = krb5_storage_from_fd(fd); - close(fd); + c->logging = krb5_storage_from_socket(sock); + rk_closesocket(sock); krb5_store_int32(c->logging, eLogSetMoniker); store_string(c->logging, c->moniker); @@ -854,7 +860,6 @@ int32_t flags; krb5_data pfxdata; char fn[] = "FILE:/tmp/pkcs12-creds-XXXXXXX"; - krb5_principal principal = NULL; int fd; ret32(c, flags); @@ -868,9 +873,6 @@ krb5_data_free(&pfxdata); close(fd); - if (principal) - krb5_free_principal(context, principal); - put32(c, -1); /* hResource */ put32(c, GSMERR_NOT_SUPPORTED); return 0; @@ -1085,9 +1087,10 @@ } static struct client * -create_client(int fd, int port, const char *moniker) +create_client(krb5_socket_t sock, int port, const char *moniker) { struct client *c; + int ret; c = ecalloc(1, sizeof(*c)); @@ -1096,23 +1099,28 @@ } else { char hostname[MAXHOSTNAMELEN]; gethostname(hostname, sizeof(hostname)); - asprintf(&c->moniker, "gssmask: %s:%d", hostname, port); + ret = asprintf(&c->moniker, "gssmask: %s:%d", hostname, port); + if (ret == -1) + c->moniker = NULL; } + if (!c->moniker) + errx(1, "out of memory"); + { c->salen = sizeof(c->sa); - getpeername(fd, (struct sockaddr *)&c->sa, &c->salen); + getpeername(sock, (struct sockaddr *)&c->sa, &c->salen); getnameinfo((struct sockaddr *)&c->sa, c->salen, c->servername, sizeof(c->servername), NULL, 0, NI_NUMERICHOST); } - c->sock = krb5_storage_from_fd(fd); + c->sock = krb5_storage_from_socket(sock); if (c->sock == NULL) - errx(1, "krb5_storage_from_fd"); + errx(1, "krb5_storage_from_socket"); - close(fd); + rk_closesocket(sock); return c; } @@ -1200,6 +1208,7 @@ main(int argc, char **argv) { int optidx = 0; + krb5_error_code ret; setprogname (argv[0]); @@ -1225,7 +1234,9 @@ errx (1, "Bad port `%s'", port_str); } - krb5_init_context(&context); + ret = krb5_init_context(&context); + if (ret) + errx(1, "Error initializing kerberos: %d", ret); { const char *lf = logfile_str; diff --git a/crypto/heimdal/appl/kf/Makefile.in b/crypto/heimdal/appl/kf/Makefile.in --- a/crypto/heimdal/appl/kf/Makefile.in +++ b/crypto/heimdal/appl/kf/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,16 +94,12 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common bin_PROGRAMS = kf$(EXEEXT) libexec_PROGRAMS = kfd$(EXEEXT) subdir = appl/kf ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -60,8 +110,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -74,6 +123,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -93,6 +143,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -107,26 +158,57 @@ kf_DEPENDENCIES = $(top_builddir)/lib/krb5/libkrb5.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = am_kfd_OBJECTS = kfd.$(OBJEXT) kfd_OBJECTS = $(am_kfd_OBJECTS) kfd_LDADD = $(LDADD) kfd_DEPENDENCIES = $(top_builddir)/lib/krb5/libkrb5.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/kf.Po ./$(DEPDIR)/kfd.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(kf_SOURCES) $(kfd_SOURCES) DIST_SOURCES = $(kf_SOURCES) $(kfd_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/||"`;; \ @@ -148,16 +230,42 @@ 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 man8dir = $(mandir)/man8 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -172,16 +280,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -191,17 +302,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -220,12 +333,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -234,6 +344,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -250,10 +361,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -261,6 +370,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -275,12 +385,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -297,10 +410,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -311,13 +430,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -341,6 +454,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -364,9 +479,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -376,29 +496,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; man_MANS = kf.1 kfd.8 kf_SOURCES = kf.c kf_locl.h kfd_SOURCES = kfd.c kf_locl.h @@ -411,7 +539,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -424,15 +552,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign appl/kf/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign appl/kf/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -444,14 +572,19 @@ $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -472,7 +605,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -487,14 +621,19 @@ rm -f $$list install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -515,7 +654,8 @@ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files @@ -528,12 +668,14 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -kf$(EXEEXT): $(kf_OBJECTS) $(kf_DEPENDENCIES) + +kf$(EXEEXT): $(kf_OBJECTS) $(kf_DEPENDENCIES) $(EXTRA_kf_DEPENDENCIES) @rm -f kf$(EXEEXT) - $(LINK) $(kf_OBJECTS) $(kf_LDADD) $(LIBS) -kfd$(EXEEXT): $(kfd_OBJECTS) $(kfd_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kf_OBJECTS) $(kf_LDADD) $(LIBS) + +kfd$(EXEEXT): $(kfd_OBJECTS) $(kfd_DEPENDENCIES) $(EXTRA_kfd_DEPENDENCIES) @rm -f kfd$(EXEEXT) - $(LINK) $(kfd_OBJECTS) $(kfd_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(kfd_OBJECTS) $(kfd_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -541,29 +683,35 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kfd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kfd.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -572,11 +720,18 @@ -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -605,16 +760,21 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -643,30 +803,17 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -678,15 +825,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -695,24 +838,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -763,10 +910,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -784,7 +936,8 @@ clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/kf.Po + -rm -f ./$(DEPDIR)/kfd.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -808,9 +961,9 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libexecPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libexecPROGRAMS + install-html: install-html-am install-html-am: @@ -832,7 +985,8 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/kf.Po + -rm -f ./$(DEPDIR)/kfd.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -855,42 +1009,56 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 uninstall-man8 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libexecPROGRAMS \ - clean-libtool ctags dist-hook distclean distclean-compile \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libexecPROGRAMS clean-libtool cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-info install-info-am install-libexecPROGRAMS \ - install-man install-man1 install-man8 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-hook uninstall-libexecPROGRAMS uninstall-man \ - uninstall-man1 uninstall-man8 + install-exec-am install-exec-local install-html \ + install-html-am install-info install-info-am \ + install-libexecPROGRAMS install-man install-man1 install-man8 \ + 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 tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-hook uninstall-libexecPROGRAMS \ + uninstall-man uninstall-man1 uninstall-man8 + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -898,7 +1066,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -943,11 +1111,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -955,6 +1132,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -997,6 +1176,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1010,13 +1202,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/appl/kf/NTMakefile b/crypto/heimdal/appl/kf/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/kf/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\kf + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/kf/kf.1 b/crypto/heimdal/appl/kf/kf.1 --- a/crypto/heimdal/appl/kf/kf.1 +++ b/crypto/heimdal/appl/kf/kf.1 @@ -33,7 +33,7 @@ .\" .Dd July 2, 2000 .Dt KF 1 -.Os Heimdal +.Os .Sh NAME .Nm kf .Nd securely forward tickets diff --git a/crypto/heimdal/appl/kf/kf.c b/crypto/heimdal/appl/kf/kf.c --- a/crypto/heimdal/appl/kf/kf.c +++ b/crypto/heimdal/appl/kf/kf.c @@ -51,38 +51,38 @@ "Forward forwardable credentials", NULL }, { "forwardable",'G',arg_negative_flag,&forwardable, "Don't forward forwardable credentials", NULL }, - { "help", 'h', arg_flag, &help_flag }, - { "version", 0, arg_flag, &version_flag } + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } }; static int num_args = sizeof(args) / sizeof(args[0]); static void -usage(int code, struct getargs *args, int num_args) +usage(int code, struct getargs *inargs, int num_inargs) { - arg_printusage(args, num_args, NULL, "hosts"); + arg_printusage(inargs, num_inargs, NULL, "hosts"); exit(code); } static int -client_setup(krb5_context *context, int *argc, char **argv) +client_setup(krb5_context *ctx, int *argc, char **argv) { - int optind = 0; + int optidx = 0; int port = 0; int status; setprogname (argv[0]); - status = krb5_init_context (context); + status = krb5_init_context (ctx); if (status) errx(1, "krb5_init_context failed: %d", status); - forwardable = krb5_config_get_bool (*context, NULL, + forwardable = krb5_config_get_bool (*ctx, NULL, "libdefaults", "forwardable", NULL); - if (getarg (args, num_args, *argc, argv, &optind)) + if (getarg (args, num_args, *argc, argv, &optidx)) usage(1, args, num_args); if(help_flag) @@ -107,11 +107,11 @@ } if (port == 0) - port = krb5_getportbyname (*context, KF_PORT_NAME, "tcp", KF_PORT_NUM); + port = krb5_getportbyname (*ctx, KF_PORT_NAME, "tcp", KF_PORT_NUM); - if(*argc - optind < 1) + if(*argc - optidx < 1) usage(1, args, num_args); - *argc = optind; + *argc = optidx; return port; } @@ -122,7 +122,7 @@ */ static int -proto (int sock, const char *hostname, const char *service, +proto (int sock, const char *hostname, const char *svc, char *message, size_t len) { krb5_auth_context auth_context; @@ -153,7 +153,7 @@ status = krb5_sname_to_principal (context, hostname, - service, + svc, KRB5_NT_SRV_HST, &server); if (status) { @@ -281,7 +281,7 @@ } static int -doit (const char *hostname, int port, const char *service, +doit (const char *hostname, int port, const char *svc, char *message, size_t len) { struct addrinfo *ai, *a; @@ -312,7 +312,7 @@ continue; } freeaddrinfo (ai); - return proto (s, hostname, service, message, len); + return proto (s, hostname, svc, message, len); } warnx ("failed to contact %s", hostname); freeaddrinfo (ai); diff --git a/crypto/heimdal/appl/kf/kf.cat1 b/crypto/heimdal/appl/kf/kf.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/kf/kf.cat1 @@ -0,0 +1,45 @@ +KF(1) BSD General Commands Manual KF(1) + +NAME + kf -- securely forward tickets + +SYNOPSIS + kf [-p port | --port=port] [-l login | --login=login] [-c ccache | + --ccache=ccache] [-F | --forwardable] [-G | --no-forwardable] + [-h | --help] [--version] host ... + +DESCRIPTION + The kf program forwards tickets to a remote host through an authenticated + and encrypted stream. Options supported are: + + -p port, --port=port + port to connect to + + -l login, --login=login + remote login name + + -c ccache, --ccache=ccache + remote cred cache + + -F, --forwardable + forward forwardable credentials + + -G, --no-forwardable + do not forward forwardable credentials + + -h, --help + + --version + + kf is useful when you do not want to enter your password on a remote host + but want to have your tickets one for example AFS. + + In order for kf to work you will need to acquire your initial ticket with + forwardable flag, i.e. kinit --forwardable. + + telnet is able to forward tickets by itself. + +SEE ALSO + kinit(1), telnet(1), kfd(8) + +BSD July 2, 2000 BSD diff --git a/crypto/heimdal/appl/kf/kfd.8 b/crypto/heimdal/appl/kf/kfd.8 --- a/crypto/heimdal/appl/kf/kfd.8 +++ b/crypto/heimdal/appl/kf/kfd.8 @@ -33,7 +33,7 @@ .\" .Dd July 2, 2000 .Dt KFD 8 -.Os Heimdal +.Os .Sh NAME .Nm kfd .Nd receive forwarded tickets diff --git a/crypto/heimdal/appl/kf/kfd.c b/crypto/heimdal/appl/kf/kfd.c --- a/crypto/heimdal/appl/kf/kfd.c +++ b/crypto/heimdal/appl/kf/kfd.c @@ -49,26 +49,26 @@ { "inetd",'i',arg_flag, &do_inetd, "Not started from inetd", NULL }, { "regpag",'R',arg_string,®pag_str,"path to regpag binary","regpag"}, - { "help", 'h', arg_flag, &help_flag }, - { "version", 0, arg_flag, &version_flag } + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } }; static int num_args = sizeof(args) / sizeof(args[0]); static void -usage(int code, struct getargs *args, int num_args) +usage(int code, struct getargs *inargs, int num_inargs) { - arg_printusage(args, num_args, NULL, ""); + arg_printusage(inargs, num_inargs, NULL, ""); exit(code); } static int -server_setup(krb5_context *context, int argc, char **argv) +server_setup(krb5_context *ctx, int argc, char **argv) { int port = 0; int local_argc; - local_argc = krb5_program_setup(context, argc, argv, args, num_args, usage); + local_argc = krb5_program_setup(ctx, argc, argv, args, num_args, usage); if(help_flag) (*usage)(0, args, num_args); @@ -92,7 +92,7 @@ } if (port == 0) - port = krb5_getportbyname (*context, KF_PORT_NAME, "tcp", KF_PORT_NUM); + port = krb5_getportbyname (*ctx, KF_PORT_NAME, "tcp", KF_PORT_NUM); if(argv[local_argc] != NULL) usage(1, args, num_args); @@ -120,7 +120,7 @@ } static int -proto (int sock, const char *service) +proto (int sock, const char *svc) { krb5_auth_context auth_context; krb5_error_code status; @@ -151,7 +151,7 @@ status = krb5_sname_to_principal (context, hostname, - service, + svc, KRB5_NT_SRV_HST, &server); if (status) @@ -281,11 +281,11 @@ } static int -doit (int port, const char *service) +doit (int port, const char *svc) { if (do_inetd) mini_inetd(port, NULL); - return proto (STDIN_FILENO, service); + return proto (STDIN_FILENO, svc); } int diff --git a/crypto/heimdal/appl/kf/kfd.cat8 b/crypto/heimdal/appl/kf/kfd.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/kf/kfd.cat8 @@ -0,0 +1,30 @@ +KFD(8) BSD System Manager's Manual KFD(8) + +NAME + kfd -- receive forwarded tickets + +SYNOPSIS + kfd [-p port | --port=port] [-i | --inetd] [-R regpag | --regpag=regpag] + [-h | --help] [--version] + +DESCRIPTION + This is the daemon for kf(1). Supported options: + + -p port, --port=port + port to listen to + + -i, --inetd + not started from inetd + + -R regpag, --regpag=regpag + path to regpag binary + +EXAMPLES + Put the following in /etc/inetd.conf: + + kf stream tcp nowait root /usr/heimdal/libexec/kfd kfd + +SEE ALSO + kf(1) + +BSD July 2, 2000 BSD diff --git a/crypto/heimdal/appl/login/ChangeLog b/crypto/heimdal/appl/login/ChangeLog deleted file mode 100644 --- a/crypto/heimdal/appl/login/ChangeLog +++ /dev/null @@ -1,366 +0,0 @@ -2008-04-15 Love Hörnquist Åstrand - - * utmp_login.c: Reorder to avoid prototype. - - * login_locl.h: If cygwin doesnt have WTMPX_FILE, it uses wtmp for - wtmpx http://www.cygwin.com/ml/cygwin/2006-12/msg00630.html - -2008-04-10 Love Hörnquist Åstrand - - * utmp_login.c: Remove utmp warning on mac os x - -2006-12-05 Love Hörnquist Åstrand - - * limits_conf.c: Clear errno before calling the strtol - functions. From Paul Stoeber to OpenBSD by Ray Lai and Björn - Sandell. - - * limits_conf.c: Report to syslog strings that start with NUL; - prevents negative index array access. Ray Lai of OpenBSD via Björn - Sandell. - -2006-10-07 Love Hörnquist Åstrand - - * Makefile.am: Add man_MANS to EXTRA_DIST - -2006-09-22 Love Hörnquist Åstrand - - * read_string.c: try to not call signaction for signal 0 and use - NSIG if it exists to determin how many signals there exists, also, - only restore those signalhandlers that we got out. - -2006-04-27 Love Hörnquist Åstrand - - * login_locl.h: Include "loginpaths.h" - - * loginpaths.h: Shared paths between login and rshd. - -2006-01-09 Johan Danielsson - - * login.c: log successful logins - -2005-08-08 Love Hörnquist Åstrand - - * login.c (do_login): only do krb4_get_afs_tokens if we have done - v4 authentication or done a 5to4 conversion of tickets. This is to - avoid delays on a realm that only support Kerberos 5 and drop - Kerberos 4 requests. - -2005-05-10 Dave Love - - * login.c: Include . - -2005-05-02 Dave Love - - * limits_conf.c: Check RLIMIT_MEMLOCK, not RLIMIT_LOCK. - -2005-04-28 Dave Love - - * limits_conf.c: Maybe include sys/resource.h. Use various - RLIMIT_ macros conditionally. For Solaris, Irix and Tru64. - -2005-04-22 Johan Danielsson - - * login.1: document limits.conf - - * Makefile.am: limits_conf.c - - * login_locl.h: template for limits.conf - - * login.c: read limits.conf (from /etc/security by default, - overridable in login.conf) - - * limits_conf.c: implement a parser for limits.conf - -2004-09-08 Johan Danielsson - - * login.c: use krb5_appdefault_boolean instead of - krb5_config_get_bool - -2003-09-03 Love Hörnquist Åstrand - - * login.c (krb5_to4): set client princ of the mcred - -2003-07-07 Love Hörnquist Åstrand - - * login.c (krb5_to4): use krb5_cc_clear_mcred - -2003-03-24 Johan Danielsson - - * Makefile.am: install man pages - - * login.1: manpage for login - - * login.c: allow "welcome" as well as "motd" in login.conf - - * login.access.5: login.access manual page - -2003-03-18 Love Hörnquist Åstrand - - * login.c: also need pag_set - * login.c: if there is kerberos 5, call krb5_afslog\* - -2002-08-23 Johan Danielsson - - * login.c: if motd is set in login.conf, output its contents - before starting the shell - -2002-02-27 Johan Danielsson - - * login.c: reset signals to default, needed on solaris 8 - -2002-02-19 Johan Danielsson - - * login_locl.h: include netgroup.h and rpcsvc/ypclnt.h - - * login.c: make this build without krb5 - -2001-09-22 Assar Westerlund - - * login_locl.h: kludge: use absolute path to find prot.h so we do - not get confused by athena's prot.h - -2001-09-17 Assar Westerlund - - * login.c (do_login): add setpcred - -2001-07-06 Assar Westerlund - - * login.c: move osf2c magic earlier. from Mark Davies - - -2001-06-19 Assar Westerlund - - * login.c (krb5_to4): dereference result from krb5_princ_realm. - noted by Thomas Nystrom - -2001-06-04 Assar Westerlund - - * update copyright messages on Wietse Venema's code. - -2001-05-31 Assar Westerlund - - * login.c (krb5_to4): look for [realms]krb4_get_tickets to - decide whether to get kerberos 4 tickets - -2001-02-08 Assar Westerlund - - * utmp_login.c, utmpx_login.c: try to write a useful string as - host in utmp, using the same algoritm as telnetd - -2001-01-29 Assar Westerlund - - * login.c: remove some krb5_free_context that might happen at - unappropriate times - -2000-12-31 Assar Westerlund - - * login.c (main): handle krb5_init_context failure consistently - -2000-12-11 Assar Westerlund - - * login.c (do_login): set the group on the tty. - (r_flag): comment out - * login.c (krb5_to4): always return a value - -2000-10-15 Assar Westerlund - - * login.c (krb5_to4): check another return code - -2000-08-22 Johan Danielsson - - * login.c (do_login): set PATH to something sane; - (start_logout_process): avoid getting signals sent to the parent - - * login_locl.h: _PATH_DEFPATH - -2000-07-01 Assar Westerlund - - * login.c (login_timeout): add back - -2000-06-28 Johan Danielsson - - * env.c: new file for environment related functions - - * login.c: move environment stuff to separate file, allow - specifying list of environment files via login.conf - -2000-06-21 Assar Westerlund - - * Makefile.am (LDADD): add otp - * login.c: add reading of /etc/environment. From Ake Sandgren - - add otp support. From Daniel Kouril - -2000-06-09 Assar Westerlund - - * login.c (do_login): work-around for setuid and capabilities bug - fixed in Linux 2.2.16 - -2000-04-09 Assar Westerlund - - * login.c: allow conversion of v5 -> v4 tickets when logging in - with forwarded tickets - -1999-11-09 Johan Danielsson - - * conf.c: remove case for not having cgetent, since it's in roken - -1999-11-05 Assar Westerlund - - * login.c (do_login): conditionalize shadow stuff on getspnam - -1999-10-30 Assar Westerlund - - * Makefile.am (login_DEPENDENCIES): remove, it's not entirely - correct and was causing problems with non-GNU make - -1999-10-28 Assar Westerlund - - * login.c (start_logout_proceess): don't examine `prog' before - setting it. - -1999-10-27 Assar Westerlund - - * login.c (do_login): chown and chmod the tty. some clean-up. - -1999-10-03 Assar Westerlund - - * login.c (krb5_start_session): correct the ccache to - krb524_convert_creds_kdc - -1999-09-28 Assar Westerlund - - * login.c (krb5_verify): use krb5_verify_user_lrealm - -1999-09-01 Johan Danielsson - - * login.c: SGI capability mumbo-jumbo - -1999-08-09 Johan Danielsson - - * login.c (start_logout_process): call setproctitle - - * login_locl.h: declare struct spwd - - * login.c: add support for starting extra processes at login and - logout; always preserve TERM and TZ - - * conf.c: add configuration file support - -1999-08-07 Assar Westerlund - - * shadow.c (check_shadow): check for a NULL sp - -1999-08-05 Assar Westerlund - - * login.c (main): move down login incorrect to disallow account - guessing - -1999-08-04 Assar Westerlund - - * utmpx_login.c (utmpx_login): fix for Solaris. From Miroslav - Ruda - - * login_locl.h: add and some prototypes - - * login.c: fixes with v4 and shadow support. From Miroslav Ruda - - - * shadow.c: new file with functions for handling shadow passwords - - * Makefile.am: add shadow - -1999-07-22 Assar Westerlund - - * login.c (main): generate a better tty name - -1999-05-25 Johan Danielsson - - * login.c (do_login): set $SHELL - -1999-05-18 Assar Westerlund - - * add login-access - -1999-05-11 Assar Westerlund - - * login.c: copy the v5 ccache to a file after having done setuid - -1999-05-09 Assar Westerlund - - * login.c (krb5_verify): check seteuid for errors - -Mon Apr 19 22:30:55 1999 Assar Westerlund - - * login.c: conditionalize the kafs calls on KRB4 - - * Makefile.am (LDADD): add kafs - - * login.c: add support for getting afs tokens with v4 and v5 - -Sun Apr 18 14:12:28 1999 Johan Danielsson - - * login.c: check _PATH_NOLOGIN - - * login_locl.h: _PATH_NOLOGIN - -1999-04-11 Assar Westerlund - - * login.c (main): use print_version - -Thu Apr 8 15:03:55 1999 Johan Danielsson - - * login.c: remove definition of KRB_VERIFY_USER et.al. (moved to - config.h) - - * login_locl.h: include udb.h, sys/resource.h, and sys/category.h - -Sat Mar 27 17:58:37 1999 Johan Danielsson - - * Makefile.am: osfc2.c - - * login.c: magic for OSF C2, and Crays - - * login_locl.h: do_osfc2_magic proto - - * osfc2.c: bsd_locl -> login_locl - - * osfc2.c: OSF C2 magic - -Tue Mar 23 14:17:40 1999 Johan Danielsson - - * login_locl.h: _PATH_UTMP - -Sun Mar 21 15:02:31 1999 Johan Danielsson - - * login.c: `-h' is host, not help - -Sat Mar 20 00:11:13 1999 Assar Westerlund - - * login_locl.h: krb.h: add - - * login.c: static-size - (krb4_verify): add - -Thu Mar 18 11:36:10 1999 Johan Danielsson - - * Makefile.am: include Makefile.am.common - -Thu Mar 11 17:53:36 1999 Johan Danielsson - - * utmpx_login.c: add some consts - - * utmp_login.c: add some consts - - * login.c: staticize - - * login_locl.h: add prototypes, and defaults for - _PATH_* - -Mon Mar 1 10:49:14 1999 Johan Danielsson - - * utmpx_login.c: HAVE_UT_* -> HAVE_STRUCT_UTMP*_UT_* - - * utmp_login.c: HAVE_UT_* -> HAVE_STRUCT_UTMP*_UT_* - diff --git a/crypto/heimdal/appl/login/Makefile.am b/crypto/heimdal/appl/login/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/login/Makefile.am +++ /dev/null @@ -1,40 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -man_MANS = login.1 login.access.5 - -bin_PROGRAMS = login - -login_SOURCES = \ - conf.c \ - env.c \ - login.c \ - login_access.c \ - login_locl.h \ - login-protos.h \ - loginpaths.h \ - limits_conf.c \ - osfc2.c \ - read_string.c \ - shadow.c \ - stty_default.c \ - tty.c \ - utmp_login.c \ - utmpx_login.c - -LDADD = $(LIB_otp) \ - $(LIB_kafs) \ - $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_hcrypto) \ - $(top_builddir)/lib/asn1/libasn1.la \ - $(LIB_roken) \ - $(LIB_security) \ - $(DBLIB) - -$(srcdir)/login-protos.h: - cd $(srcdir); perl ../../cf/make-proto.pl -o login-protos.h -q -P comment $(login_SOURCES) || rm -f login-protos.h - -$(login_OBJECTS): $(srcdir)/login-protos.h - -EXTRA_DIST = NTMakefile $(man_MANS) diff --git a/crypto/heimdal/appl/login/Makefile.in b/crypto/heimdal/appl/login/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/login/Makefile.in +++ /dev/null @@ -1,1035 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -bin_PROGRAMS = login$(EXEEXT) -subdir = appl/login -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" \ - "$(DESTDIR)$(man5dir)" -PROGRAMS = $(bin_PROGRAMS) -am_login_OBJECTS = conf.$(OBJEXT) env.$(OBJEXT) login.$(OBJEXT) \ - login_access.$(OBJEXT) limits_conf.$(OBJEXT) osfc2.$(OBJEXT) \ - read_string.$(OBJEXT) shadow.$(OBJEXT) stty_default.$(OBJEXT) \ - tty.$(OBJEXT) utmp_login.$(OBJEXT) utmpx_login.$(OBJEXT) -login_OBJECTS = $(am_login_OBJECTS) -login_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -am__DEPENDENCIES_2 = $(top_builddir)/lib/kafs/libkafs.la \ - $(am__DEPENDENCIES_1) -login_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) \ - $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ - $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -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 = $(login_SOURCES) -DIST_SOURCES = $(login_SOURCES) -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' -man1dir = $(mandir)/man1 -man5dir = $(mandir)/man5 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -man_MANS = login.1 login.access.5 -login_SOURCES = \ - conf.c \ - env.c \ - login.c \ - login_access.c \ - login_locl.h \ - login-protos.h \ - loginpaths.h \ - limits_conf.c \ - osfc2.c \ - read_string.c \ - shadow.c \ - stty_default.c \ - tty.c \ - utmp_login.c \ - utmpx_login.c - -LDADD = $(LIB_otp) \ - $(LIB_kafs) \ - $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_hcrypto) \ - $(top_builddir)/lib/asn1/libasn1.la \ - $(LIB_roken) \ - $(LIB_security) \ - $(DBLIB) - -EXTRA_DIST = NTMakefile $(man_MANS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/login/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/login/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) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - 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 -login$(EXEEXT): $(login_OBJECTS) $(login_DEPENDENCIES) - @rm -f login$(EXEEXT) - $(LINK) $(login_OBJECTS) $(login_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limits_conf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/login.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/login_access.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/osfc2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read_string.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadow.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stty_default.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tty.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utmp_login.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utmpx_login.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 -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ - } | 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } -install-man5: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" - @list=''; test -n "$(man5dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ - } | 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,^[^5][0-9a-z]*$$,5,;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)$(man5dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man5dir)/$$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)$(man5dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man5dir)" || exit $$?; }; \ - done; } - -uninstall-man5: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man5dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man5dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man5dir)"; 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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man1 install-man5 - -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man1 uninstall-man5 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libtool ctags \ - dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ - install-man install-man1 install-man5 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-hook uninstall-man uninstall-man1 uninstall-man5 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -$(srcdir)/login-protos.h: - cd $(srcdir); perl ../../cf/make-proto.pl -o login-protos.h -q -P comment $(login_SOURCES) || rm -f login-protos.h - -$(login_OBJECTS): $(srcdir)/login-protos.h - -# 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: diff --git a/crypto/heimdal/appl/login/conf.c b/crypto/heimdal/appl/login/conf.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/conf.c +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 1999 - 2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of KTH nor the names of its contributors may be - * used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - -#include "login_locl.h" - -RCSID("$Id$"); - -static char *confbuf; - -static int -login_conf_init(void) -{ - char *files[] = { _PATH_LOGIN_CONF, NULL }; - return cgetent(&confbuf, files, "default"); -} - -char * -login_conf_get_string(const char *str) -{ - char *value; - if(login_conf_init() != 0) - return NULL; - if(cgetstr(confbuf, (char *)str, &value) < 0) - return NULL; - return value; -} diff --git a/crypto/heimdal/appl/login/env.c b/crypto/heimdal/appl/login/env.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/env.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" -RCSID("$Id$"); - -/* - * the environment we will send to execle and the shell. - */ - -char **env; -int num_env; - -void -extend_env(char *str) -{ - env = realloc(env, (num_env + 1) * sizeof(*env)); - if(env == NULL) - errx(1, "Out of memory!"); - env[num_env++] = str; -} - -void -add_env(const char *var, const char *value) -{ - int i; - char *str; - asprintf(&str, "%s=%s", var, value); - if(str == NULL) - errx(1, "Out of memory!"); - for(i = 0; i < num_env; i++) - if(strncmp(env[i], var, strlen(var)) == 0 && - env[i][strlen(var)] == '='){ - free(env[i]); - env[i] = str; - return; - } - - extend_env(str); -} - -#if !HAVE_DECL_ENVIRON -extern char **environ; -#endif - - -void -copy_env(void) -{ - char **p; - for(p = environ; *p; p++) - extend_env(*p); -} - -void -login_read_env(const char *file) -{ - char **newenv; - char *p; - int i, j; - - newenv = NULL; - i = read_environment(file, &newenv); - for (j = 0; j < i; j++) { - p = strchr(newenv[j], '='); - if (p == NULL) - errx(1, "%s: missing = in string %s", - file, newenv[j]); - *p++ = 0; - add_env(newenv[j], p); - *--p = '='; - free(newenv[j]); - } - free(newenv); -} diff --git a/crypto/heimdal/appl/login/limits_conf.c b/crypto/heimdal/appl/login/limits_conf.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/limits_conf.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - -#include -#include -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif - -struct limit { - const char *name; - int resource; - int scale; - int has_limit; - struct rlimit limit; -} limits[] = { -#define LIM(X, S) { #X, RLIMIT_##X, S, 0 } - LIM(CORE, 1024), - LIM(CPU, 60), - LIM(DATA, 1024), - LIM(FSIZE, 1024), -#ifdef RLIMIT_MEMLOCK - LIM(MEMLOCK, 1024), -#endif - LIM(NOFILE, 1), -#ifdef RLIMIT_NPROC - LIM(NPROC, 1), -#endif -#ifdef RLIMIT_RSS - LIM(RSS, 1024), -#endif - LIM(STACK, 1024), - -#ifdef RLIMIT_AS - LIM(AS, 1024), -#endif -#ifdef RLIMIT_LOCKS - LIM(LOCKS, 1), -#endif - /* - maxlogins - priority - */ - { NULL, 0 } -}; - -static struct limit * -find_limit(const char *name) -{ - struct limit *l; - for(l = limits; l->name != NULL; l++) - if(strcasecmp(name, l->name) == 0) - return l; - return NULL; -} - -/* this function reads limits.conf files similar to pam_limits - unimplemented features include: - % maxlogins - "-" no limits, - priorities etc that are not set via setrlimit - XXX uses static storage, and clobbers getgr* -*/ - -int -read_limits_conf(const char *file, const struct passwd *pwd) -{ - FILE *f; - char *args[4]; - int lineno = 0; - char buf[1024]; - struct limit *l; - rlim_t value; - - f = fopen(file, "r"); - if(f == NULL) { - if(errno != ENOENT && errno != ENOTDIR) - syslog(LOG_ERR, "%s: %m", file); - return -1; - } - - while(fgets(buf, sizeof(buf), f) != NULL) { - char *last = NULL; - char *end = NULL; - int level; - - lineno++; - - if(buf[0] == '\0') { - syslog(LOG_ERR, "%s: line %d: NUL character", file, lineno); - continue; - } - if(buf[strlen(buf) - 1] != '\n') { - /* file did not end with a newline, figure out if we're at - the EOF, or if our buffer was too small */ - int eof = 1; - int c; - while((c = fgetc(f)) != EOF) { - eof = 0; - if(c == '\n') - break; - } - if(!eof) { - syslog(LOG_ERR, "%s: line %d: line too long", file, lineno); - continue; - } - } - buf[strcspn(buf, "#\r\n")] = '\0'; - if((args[0] = strtok_r(buf, " \t", &last)) == NULL || - (args[1] = strtok_r(NULL, " \t", &last)) == NULL || - (args[2] = strtok_r(NULL, " \t", &last)) == NULL || - (args[3] = strtok_r(NULL, " \t", &last)) == NULL) { - if(args[0] != NULL) /* this would include comment lines */ - syslog(LOG_ERR, "%s: line %d: malformed line", file, lineno); - continue; - } - - l = find_limit(args[2]); - if(l == NULL) { - syslog(LOG_ERR, "%s: line %d: unknown limit %s", file, lineno, args[2]); - continue; - } - if(strcmp(args[3], "-") == 0) { - value = RLIM_INFINITY; - } else { - errno = 0; - value = strtol(args[3], &end, 10); - if(*end != '\0') { - syslog(LOG_ERR, "%s: line %d: bad value %s", file, lineno, args[3]); - continue; - } - if((value == LONG_MIN || value == LONG_MAX) && errno == ERANGE) { - syslog(LOG_ERR, "%s: line %d: bad value %s", file, lineno, args[3]); - continue; - } - if(value * l->scale < value) - value = RLIM_INFINITY; - else - value *= l->scale; - } - level = 0; - /* XXX unclear: if you set group hard and user soft limit, - should the hard limit still apply? this code doesn't. */ - if(strcmp(args[0], pwd->pw_name) == 0) - level = 3; - if(*args[0] == '@') { - struct group *gr; - gr = getgrnam(args[0] + 1); - if(gr != NULL && gr->gr_gid == pwd->pw_gid) - level = 2; - } - if(strcmp(args[0], "*") == 0) - level = 1; - if(level == 0 || level < l->has_limit) /* not for us */ - continue; - if(l->has_limit < level) { - if(getrlimit(l->resource, &l->limit) < 0) - continue; - l->has_limit = level; - } - - /* XXX unclear: if you soft to more than default hard, should - we set hard to soft? this code doesn't. */ - if(strcasecmp(args[1], "soft") == 0 || strcmp(args[1], "-") == 0) - l->limit.rlim_cur = value; - if(strcasecmp(args[1], "hard") == 0 || strcmp(args[1], "-") == 0) - l->limit.rlim_max = value; - } - fclose(f); - for(l = limits; l->name != NULL; l++) { - if(l->has_limit) { - if(l->limit.rlim_cur > l->limit.rlim_max) - l->limit.rlim_cur = l->limit.rlim_max; - if(setrlimit(l->resource, &l->limit) != 0) - syslog(LOG_ERR, "setrlimit RLIM_%s failed: %m", l->name); - } - l->has_limit = 0; - } - return 0; -} diff --git a/crypto/heimdal/appl/login/login-protos.h b/crypto/heimdal/appl/login/login-protos.h deleted file mode 100644 --- a/crypto/heimdal/appl/login/login-protos.h +++ /dev/null @@ -1,91 +0,0 @@ -/* This is a generated file */ -#ifndef __login_protos_h__ -#define __login_protos_h__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -void -add_env ( - const char */*var*/, - const char */*value*/); - -void -check_shadow ( - const struct passwd */*pw*/, - const struct spwd */*sp*/); - -char * -clean_ttyname (char */*tty*/); - -void -copy_env (void); - -int -do_osfc2_magic (uid_t /*uid*/); - -void -extend_env (char */*str*/); - -int -login_access ( - struct passwd */*user*/, - char */*from*/); - -char * -login_conf_get_string (const char */*str*/); - -void -login_read_env (const char */*file*/); - -char * -make_id (char */*tty*/); - -void -prepare_utmp ( - struct utmp */*utmp*/, - char */*tty*/, - const char */*username*/, - const char */*hostname*/); - -int -read_limits_conf ( - const char */*file*/, - const struct passwd */*pwd*/); - -int -read_string ( - const char */*prompt*/, - char */*buf*/, - size_t /*len*/, - int /*echo*/); - -void -shrink_hostname ( - const char */*hostname*/, - char */*dst*/, - size_t /*dst_sz*/); - -void -stty_default (void); - -void -utmp_login ( - char */*tty*/, - const char */*username*/, - const char */*hostname*/); - -int -utmpx_login ( - char */*line*/, - const char */*user*/, - const char */*host*/); - -#ifdef __cplusplus -} -#endif - -#endif /* __login_protos_h__ */ diff --git a/crypto/heimdal/appl/login/login.1 b/crypto/heimdal/appl/login/login.1 deleted file mode 100644 --- a/crypto/heimdal/appl/login/login.1 +++ /dev/null @@ -1,252 +0,0 @@ -.\" $Id$ -.\" -.Dd April 22, 2005 -.Dt LOGIN 1 -.Os HEIMDAL -.Sh NAME -.Nm login -.Nd authenticate a user and start new session -.Sh SYNOPSIS -.Nm -.Op Fl fp -.Op Fl a Ar level -.Op Fl h Ar hostname -.Ar [username] -.Sh DESCRIPTION -This manual page documents the -.Nm login -program distributed with the Heimdal Kerberos 5 implementation, it may -differ in important ways from your system version. -.Pp -The -.Nm login -programs logs users into the system. It is intended to be run by -system daemons like -.Xr getty 8 -or -.Xr telnetd 8 . -If you are already logged in, but want to change to another user, you -should use -.Xr su 1 . -.Pp -A username can be given on the command line, else one will be prompted -for. -.Pp -A password is required to login, unless the -.Fl f -option is given (indicating that the calling program has already done -proper authentication). With -.Fl f -the user will be logged in without further questions. -.Pp -For password authentication Kerberos 5, Kerberos 4 (if compiled in), -OTP (if compiled in) and local -.No ( Pa /etc/passwd ) -passwords are supported. OTP will be used if the the user is -registered to use it, and -.Nm login -is given the option -.Fl a Li otp . -When using OTP, a challenge is shown to the user. -.Pp -Further options are: -.Bl -tag -width Ds -.It Fl a Ar string -Which authentication mode to use, the only supported value is -currently -.Dq otp . -.It Fl f -Indicates that the user is already authenticated. This happens, for -instance, when login is started by telnetd, and the user has proved -authentic via Kerberos. -.It Fl h Ar hostname -Indicates which host the user is logging in from. This is passed from -telnetd, and is entered into the login database. -.It Fl p -This tells -.Nm login -to preserve all environment variables. If not given, only the -.Dv TERM -and -.Dv TZ -variables are preserved. It could be a security risk to pass random -variables to -.Nm login -or the user shell, so the calling daemon should make sure it only -passes -.Dq safe -variables. -.El -.Pp -The process of logging user in proceeds as follows. -.Pp -First a check is made that logins are allowed at all. This usually -means checking -.Pa /etc/nologin . -If it exists, and the user trying to login is not root, the contents -is printed, and then login exits. -.Pp -Then various system parameters are set up, like changing the owner of -the tty to the user, setting up signals, setting the group list, and -user and group id. Also various machine specific tasks are performed. -.Pp -Next -.Nm login -changes to the users home directory, or if that fails, to -.Pa / . -The environment is setup, by adding some required variables (such as -.Dv PATH ) , -and also authentication related ones (such as -.Dv KRB5CCNAME ) . -If an environment file exists -.No ( Pa /etc/environment ) , -variables are set according to -it. -.Pp -If one or more login message files are configured, their contents is -printed to the terminal. -.Pp -If a login time command is configured, it is executed. A logout time -command can also be configured, which makes -.Nm login -fork, and wait for the user shell to exit, and then run the command. -This can be used to clean up user credentials. -.Pp -Finally, the user's shell is executed. If the user logging in is root, -and root's login shell does not exist, a default shell (usually -.Pa /bin/sh ) -is also tried before giving up. -.Sh ENVIRONMENT -These environment variables are set by login (not including ones set by -.Pa /etc/environment ) : -.Pp -.Bl -tag -compact -width USERXXLOGNAME -.It Dv PATH -the default system path -.It Dv HOME -the user's home directory (or possibly -.Pa / ) -.It Dv USER , Dv LOGNAME -both set to the username -.It Dv SHELL -the user's shell -.It Dv TERM , Dv TZ -set to whatever is passed to -.Nm login -.It Dv KRB5CCNAME -if the password is verified via Kerberos 5, this will point to the -credentials cache file -.It Dv KRBTKFILE -if the password is verified via Kerberos 4, this will point to the -ticket file -.El -.Sh FILES -.Bl -tag -compact -width Ds -.It Pa /etc/environment -Contains a set of environment variables that should be set in addition -to the ones above. It should contain sh-style assignments like -.Dq VARIABLE=value . -Note that they are not parsed the way a shell would. No variable -expansion is performed, and all strings are literal, and quotation -marks should not be used. Everything after a hash mark is considered a -comment. The following are all different (the last will set the -variable -.Dv BAR , -not -.Dv FOO ) . -.Bd -literal -offset indent -FOO=this is a string -FOO="this is a string" -BAR= FOO='this is a string' -.Ed -.It Pa /etc/login.access -See -.Xr login.access 5 . -.It Pa /etc/login.conf -This is a termcap style configuration file, that contains various -settings used by -.Nm login . -Currently only the -.Dq default -capability record is used. The possible capability strings include: -.Pp -.Bl -tag -compact -width Ds -.It Li environment -This is a comma separated list of environment files that are read in -the order specified. If this is missing the default -.Pa /etc/environment -is used. -.It Li login_program -This program will be executed just before the user's shell is started. -It will be called without arguments. -.It Li logout_program -This program will be executed just after the user's shell has -terminated. It will be called without arguments. This program will be -the parent process of the spawned shell. -.It Li motd -A comma separated list of text files that will be printed to the -user's terminal before starting the shell. The string -.Li welcome -works similarly, but points to a single file. -.It Li limits -Points to a file containing ulimit settings for various users. Syntax -is inspired by what pam_limits uses, and the default is -.Pa /etc/security/limits.conf . -.El -.It Pa /etc/nologin -If it exists, login is denied to all but root. The contents of this -file is printed before login exits. -.El -.Pp -Other -.Nm login -programs typically print all sorts of information by default, such as -last time you logged in, if you have mail, and system message files. -This version of -.Nm login -does not, so there is no reason for -.Pa .hushlogin -files or similar. We feel that these tasks are best left to the user's -shell, but the -.Li login_program -facility allows for a shell independent solution, if that is desired. -.Sh EXAMPLES -A -.Pa login.conf -file could look like: -.Bd -literal -offset indent -default:\\ - :motd=/etc/motd,/etc/motd.local:\\ - :limits=/etc/limits.conf: -.Ed -.Pp -The -.Pa limits.conf -file consists of a table with four whitespace separated fields. First -field is a username or a groupname (prefixed with -.Sq @ ) , -or -.Sq * . -Second field is -.Sq soft , -.Sq hard , -or -.Sq - -(the last meaning both soft and hard). -Third field is a limit name (such as -.Sq cpu -or -.Sq core ) . -Last field is the limit value (a number or -.Sq - -for unlimited). In the case of data sizes, the value is in kilobytes, -and cputime is in minutes. -.Sh SEE ALSO -.Xr su 1 , -.Xr login.access 5 , -.Xr getty 8 , -.Xr telnetd 8 -.Sh AUTHORS -This login program was written for the Heimdal Kerberos 5 -implementation. The login.access code was written by Wietse Venema. -.\".Sh BUGS diff --git a/crypto/heimdal/appl/login/login.access.5 b/crypto/heimdal/appl/login/login.access.5 deleted file mode 100644 --- a/crypto/heimdal/appl/login/login.access.5 +++ /dev/null @@ -1,55 +0,0 @@ -.\" $Id$ -.\" -.Dd March 21, 2003 -.Dt LOGIN.ACCESS 5 -.Os HEIMDAL -.Sh NAME -.Nm login.access -.Nd login access control table -.Sh DESCRIPTION -The -.Nm login.access -file specifies on which ttys or from which hosts certain users are -allowed to login. -.Pp -At login, the -.Pa /etc/login.access -file is checked for the first entry that matches a specific user/host -or user/tty combination. That entry can either allow or deny login -access to that user. -.Pp -Each entry have three fields separated by colon: -.Bl -bullet -.It -The first field indicates the permission given if the entry matches. -It can be either -.Dq + -(allow access) -or -.Dq - -(deny access) . -.It -The second field is a comma separated list of users or groups for -which the current entry applies. NIS netgroups can used (if -configured) if preceded by @. The magic string ALL matches all users. -A group will match if the user is a member of that group, or it is the -user's primary group. -.It -The third field is a list of ttys, or network names. A network name -can be either a hostname, a domain (indicated by a starting period), -or a netgroup. As with the user list, ALL matches anything. LOCAL -matches a string not containing a period. -.El -.Pp -If the string EXCEPT is found in either the user or from list, the -rest of the list are exceptions to the list before EXCEPT. -.Sh BUGS -If there's a user and a group with the same name, there is no way to -make the group match if the user also matches. -.Sh SEE ALSO -.Xr login 1 -.Sh AUTHORS -The -.Fn login_access -function was written by -Wietse Venema. This manual page was written for Heimdal. diff --git a/crypto/heimdal/appl/login/login.c b/crypto/heimdal/appl/login/login.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/login.c +++ /dev/null @@ -1,733 +0,0 @@ -/* - * Copyright (c) 1997 - 2006 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" -#ifdef HAVE_CAPABILITY_H -#include -#endif -#ifdef HAVE_SYS_CAPABILITY_H -#include -#endif -#ifdef HAVE_CRYPT_H -#include -#endif - -RCSID("$Id$"); - -static int login_timeout = 60; - -static int -start_login_process(void) -{ - char *prog, *argv0; - prog = login_conf_get_string("login_program"); - if(prog == NULL) - return 0; - argv0 = strrchr(prog, '/'); - - if(argv0) - argv0++; - else - argv0 = prog; - - return simple_execle(prog, argv0, NULL, env); -} - -static int -start_logout_process(void) -{ - char *prog, *argv0; - pid_t pid; - - prog = login_conf_get_string("logout_program"); - if(prog == NULL) - return 0; - argv0 = strrchr(prog, '/'); - - if(argv0) - argv0++; - else - argv0 = prog; - - pid = fork(); - if(pid == 0) { - /* avoid getting signals sent to the shell */ - setpgid(0, getpid()); - return 0; - } - if(pid == -1) - err(1, "fork"); - /* wait for the real login process to exit */ -#ifdef HAVE_SETPROCTITLE - setproctitle("waitpid %d", pid); -#endif - while(1) { - int status; - int ret; - ret = waitpid(pid, &status, 0); - if(ret > 0) { - if(WIFEXITED(status) || WIFSIGNALED(status)) { - execle(prog, argv0, NULL, env); - err(1, "exec %s", prog); - } - } else if(ret < 0) - err(1, "waitpid"); - } -} - -static void -exec_shell(const char *shell, int fallback) -{ - char *sh; - const char *p; - - extend_env(NULL); - if(start_login_process() < 0) - warn("login process"); - start_logout_process(); - - p = strrchr(shell, '/'); - if(p) - p++; - else - p = shell; - if (asprintf(&sh, "-%s", p) == -1) - errx(1, "Out of memory"); - execle(shell, sh, NULL, env); - if(fallback){ - warnx("Can't exec %s, trying %s", - shell, _PATH_BSHELL); - execle(_PATH_BSHELL, "-sh", NULL, env); - err(1, "%s", _PATH_BSHELL); - } - err(1, "%s", shell); -} - -static enum { NONE = 0, AUTH_KRB5 = 2, AUTH_OTP = 3 } auth; - -#ifdef OTP -static OtpContext otp_ctx; - -static int -otp_verify(struct passwd *pwd, const char *password) -{ - return (otp_verify_user (&otp_ctx, password)); -} -#endif /* OTP */ - - -static int pag_set = 0; - -#ifdef KRB5 -static krb5_context context; -static krb5_ccache id, id2; - -static int -krb5_verify(struct passwd *pwd, const char *password) -{ - krb5_error_code ret; - krb5_principal princ; - - ret = krb5_parse_name(context, pwd->pw_name, &princ); - if(ret) - return 1; - ret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, &id); - if(ret) { - krb5_free_principal(context, princ); - return 1; - } - ret = krb5_verify_user_lrealm(context, - princ, - id, - password, - 1, - NULL); - krb5_free_principal(context, princ); - return ret; -} - -static int -krb5_start_session (const struct passwd *pwd) -{ - krb5_error_code ret; - char residual[64]; - - /* copy credentials to file cache */ - snprintf(residual, sizeof(residual), "FILE:/tmp/krb5cc_%u", - (unsigned)pwd->pw_uid); - krb5_cc_resolve(context, residual, &id2); - ret = krb5_cc_copy_cache(context, id, id2); - if (ret == 0) - add_env("KRB5CCNAME", residual); - else { - krb5_cc_destroy (context, id2); - return ret; - } - krb5_cc_close(context, id2); - krb5_cc_destroy(context, id); - return 0; -} - -static void -krb5_finish (void) -{ - krb5_free_context(context); -} - -static void -krb5_get_afs_tokens (const struct passwd *pwd) -{ - char cell[64]; - char *pw_dir; - krb5_error_code ret; - - if (!k_hasafs ()) - return; - - ret = krb5_cc_default(context, &id2); - - if (ret == 0) { - pw_dir = pwd->pw_dir; - - if (!pag_set) { - k_setpag(); - pag_set = 1; - } - - if(k_afs_cell_of_file(pw_dir, cell, sizeof(cell)) == 0) - krb5_afslog_uid_home (context, id2, - cell, NULL, pwd->pw_uid, pwd->pw_dir); - krb5_afslog_uid_home (context, id2, NULL, NULL, - pwd->pw_uid, pwd->pw_dir); - krb5_cc_close (context, id2); - } -} - -#endif /* KRB5 */ - -static int f_flag; -static int p_flag; -#if 0 -static int r_flag; -#endif -static int version_flag; -static int help_flag; -static char *remote_host; -static char *auth_level = NULL; - -struct getargs args[] = { - { NULL, 'a', arg_string, &auth_level, "authentication mode" }, -#if 0 - { NULL, 'd' }, -#endif - { NULL, 'f', arg_flag, &f_flag, "pre-authenticated" }, - { NULL, 'h', arg_string, &remote_host, "remote host", "hostname" }, - { NULL, 'p', arg_flag, &p_flag, "don't purge environment" }, -#if 0 - { NULL, 'r', arg_flag, &r_flag, "rlogin protocol" }, -#endif - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag,&help_flag, } -}; - -int nargs = sizeof(args) / sizeof(args[0]); - -static void -update_utmp(const char *username, const char *hostname, - char *tty, char *ttyn) -{ - /* - * Update the utmp files, both BSD and SYSV style. - */ - if (utmpx_login(tty, username, hostname) != 0 && !f_flag) { - printf("No utmpx entry. You must exec \"login\" from the " - "lowest level shell.\n"); - exit(1); - } - utmp_login(ttyn, username, hostname); -} - -static void -checknologin(void) -{ - FILE *f; - char buf[1024]; - - f = fopen(_PATH_NOLOGIN, "r"); - if(f == NULL) - return; - while(fgets(buf, sizeof(buf), f)) - fputs(buf, stdout); - fclose(f); - exit(0); -} - -/* print contents of a file */ -static void -show_file(const char *file) -{ - FILE *f; - char buf[BUFSIZ]; - if((f = fopen(file, "r")) == NULL) - return; - while (fgets(buf, sizeof(buf), f)) - fputs(buf, stdout); - fclose(f); -} - -/* - * Actually log in the user. `pwd' contains all the relevant - * information about the user. `ttyn' is the complete name of the tty - * and `tty' the short name. - */ - -static void -do_login(const struct passwd *pwd, char *tty, char *ttyn) -{ -#ifdef HAVE_GETSPNAM - struct spwd *sp; -#endif - int rootlogin = (pwd->pw_uid == 0); - gid_t tty_gid; - struct group *gr; - const char *home_dir; - int i; - - if(!rootlogin) - checknologin(); - -#ifdef HAVE_GETSPNAM - sp = getspnam(pwd->pw_name); -#endif - - update_utmp(pwd->pw_name, remote_host ? remote_host : "", - tty, ttyn); - - gr = getgrnam ("tty"); - if (gr != NULL) - tty_gid = gr->gr_gid; - else - tty_gid = pwd->pw_gid; - - if (chown (ttyn, pwd->pw_uid, tty_gid) < 0) { - warn("chown %s", ttyn); - if (rootlogin == 0) - exit (1); - } - - if (chmod (ttyn, S_IRUSR | S_IWUSR | S_IWGRP) < 0) { - warn("chmod %s", ttyn); - if (rootlogin == 0) - exit (1); - } - -#ifdef HAVE_SETLOGIN - if(setlogin(pwd->pw_name)){ - warn("setlogin(%s)", pwd->pw_name); - if(rootlogin == 0) - exit(1); - } -#endif - if(rootlogin == 0) { - const char *file = login_conf_get_string("limits"); - if(file == NULL) - file = _PATH_LIMITS_CONF; - - read_limits_conf(file, pwd); - } - -#ifdef HAVE_SETPCRED - if (setpcred (pwd->pw_name, NULL) == -1) - warn("setpcred(%s)", pwd->pw_name); -#endif /* HAVE_SETPCRED */ -#ifdef HAVE_INITGROUPS - if(initgroups(pwd->pw_name, pwd->pw_gid)){ - warn("initgroups(%s, %u)", pwd->pw_name, (unsigned)pwd->pw_gid); - if(rootlogin == 0) - exit(1); - } -#endif - if(do_osfc2_magic(pwd->pw_uid)) - exit(1); - if(setgid(pwd->pw_gid)){ - warn("setgid(%u)", (unsigned)pwd->pw_gid); - if(rootlogin == 0) - exit(1); - } - if(setuid(pwd->pw_uid) || (pwd->pw_uid != 0 && setuid(0) == 0)) { - warn("setuid(%u)", (unsigned)pwd->pw_uid); - if(rootlogin == 0) - exit(1); - } - - /* make sure signals are set to default actions, apparently some - OS:es like to ignore SIGINT, which is not very convenient */ - - for (i = 1; i < NSIG; ++i) - signal(i, SIG_DFL); - - /* all kinds of different magic */ - -#ifdef HAVE_GETSPNAM - check_shadow(pwd, sp); -#endif - -#if defined(HAVE_GETUDBNAM) && defined(HAVE_SETLIM) - { - struct udb *udb; - long t; - const long maxcpu = 46116860184; /* some random constant */ - udb = getudbnam(pwd->pw_name); - if(udb == UDB_NULL) - errx(1, "Failed to get UDB entry."); - t = udb->ue_pcpulim[UDBRC_INTER]; - if(t == 0 || t > maxcpu) - t = CPUUNLIM; - else - t *= 100 * CLOCKS_PER_SEC; - - if(limit(C_PROC, 0, L_CPU, t) < 0) - warn("limit C_PROC"); - - t = udb->ue_jcpulim[UDBRC_INTER]; - if(t == 0 || t > maxcpu) - t = CPUUNLIM; - else - t *= 100 * CLOCKS_PER_SEC; - - if(limit(C_JOBPROCS, 0, L_CPU, t) < 0) - warn("limit C_JOBPROCS"); - - nice(udb->ue_nice[UDBRC_INTER]); - } -#endif -#if defined(HAVE_SGI_GETCAPABILITYBYNAME) && defined(HAVE_CAP_SET_PROC) - /* XXX SGI capability hack IRIX 6.x (x >= 0?) has something - called capabilities, that allow you to give away - permissions (such as chown) to specific processes. From 6.5 - this is default on, and the default capability set seems to - not always be the empty set. The problem is that the - runtime linker refuses to do just about anything if the - process has *any* capabilities set, so we have to remove - them here (unless otherwise instructed by /etc/capability). - In IRIX < 6.5, these functions was called sgi_cap_setproc, - etc, but we ignore this fact (it works anyway). */ - { - struct user_cap *ucap = sgi_getcapabilitybyname(pwd->pw_name); - cap_t cap; - if(ucap == NULL) - cap = cap_from_text("all="); - else - cap = cap_from_text(ucap->ca_default); - if(cap == NULL) - err(1, "cap_from_text"); - if(cap_set_proc(cap) < 0) - err(1, "cap_set_proc"); - cap_free(cap); - free(ucap); - } -#endif - home_dir = pwd->pw_dir; - if (chdir(home_dir) < 0) { - fprintf(stderr, "No home directory \"%s\"!\n", pwd->pw_dir); - if (chdir("/")) - exit(0); - home_dir = "/"; - fprintf(stderr, "Logging in with home = \"/\".\n"); - } -#ifdef KRB5 - if (auth == AUTH_KRB5) { - krb5_start_session (pwd); - } - - krb5_get_afs_tokens (pwd); - - krb5_finish (); -#endif /* KRB5 */ - - add_env("PATH", _PATH_DEFPATH); - - { - const char *str = login_conf_get_string("environment"); - char buf[MAXPATHLEN]; - - if(str == NULL) { - login_read_env(_PATH_ETC_ENVIRONMENT); - } else { - while(strsep_copy(&str, ",", buf, sizeof(buf)) != -1) { - if(buf[0] == '\0') - continue; - login_read_env(buf); - } - } - } - { - const char *str = login_conf_get_string("motd"); - char buf[MAXPATHLEN]; - - if(str != NULL) { - while(strsep_copy(&str, ",", buf, sizeof(buf)) != -1) { - if(buf[0] == '\0') - continue; - show_file(buf); - } - } else { - str = login_conf_get_string("welcome"); - if(str != NULL) - show_file(str); - } - } - add_env("HOME", home_dir); - add_env("USER", pwd->pw_name); - add_env("LOGNAME", pwd->pw_name); - add_env("SHELL", pwd->pw_shell); - exec_shell(pwd->pw_shell, rootlogin); -} - -static int -check_password(struct passwd *pwd, const char *password) -{ - if(pwd->pw_passwd == NULL) - return 1; - if(pwd->pw_passwd[0] == '\0'){ -#ifdef ALLOW_NULL_PASSWORD - return password[0] != '\0'; -#else - return 1; -#endif - } - if(strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd)) == 0) - return 0; -#ifdef KRB5 - if(krb5_verify(pwd, password) == 0) { - auth = AUTH_KRB5; - return 0; - } -#endif -#ifdef OTP - if (otp_verify (pwd, password) == 0) { - auth = AUTH_OTP; - return 0; - } -#endif - return 1; -} - -static void -usage(int status) -{ - arg_printusage(args, nargs, NULL, "[username]"); - exit(status); -} - -static RETSIGTYPE -sig_handler(int sig) -{ - if (sig == SIGALRM) - fprintf(stderr, "Login timed out after %d seconds\n", - login_timeout); - else - fprintf(stderr, "Login received signal, exiting\n"); - exit(0); -} - -int -main(int argc, char **argv) -{ - int max_tries = 5; - int try; - - char username[32]; - int optidx = 0; - - int ask = 1; - struct sigaction sa; - - setprogname(argv[0]); - -#ifdef KRB5 - { - krb5_error_code ret; - - ret = krb5_init_context(&context); - if (ret) - errx (1, "krb5_init_context failed: %d", ret); - } -#endif - - openlog("login", LOG_ODELAY | LOG_PID, LOG_AUTH); - - if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, - &optidx)) - usage (1); - argc -= optidx; - argv += optidx; - - if(help_flag) - usage(0); - if (version_flag) { - print_version (NULL); - return 0; - } - - if (geteuid() != 0) - errx(1, "only root may use login, use su"); - - /* Default tty settings. */ - stty_default(); - - if(p_flag) - copy_env(); - else { - /* this set of variables is always preserved by BSD login */ - if(getenv("TERM")) - add_env("TERM", getenv("TERM")); - if(getenv("TZ")) - add_env("TZ", getenv("TZ")); - } - - if(*argv){ - if(strchr(*argv, '=') == NULL && strcmp(*argv, "-") != 0){ - strlcpy (username, *argv, sizeof(username)); - ask = 0; - } - } - -#if defined(DCE) && defined(AIX) - esetenv("AUTHSTATE", "DCE", 1); -#endif - - /* XXX should we care about environment on the command line? */ - - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = sig_handler; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sigaction(SIGALRM, &sa, NULL); - alarm(login_timeout); - - for(try = 0; try < max_tries; try++){ - struct passwd *pwd; - char password[128]; - int ret; - char ttname[32]; - char *tty, *ttyn; - char prompt[128]; -#ifdef OTP - char otp_str[256]; -#endif - - if(ask){ - f_flag = 0; -#if 0 - r_flag = 0; -#endif - ret = read_string("login: ", username, sizeof(username), 1); - if(ret == -3) - exit(0); - if(ret == -2) - sig_handler(0); /* exit */ - } - pwd = k_getpwnam(username); -#ifdef ALLOW_NULL_PASSWORD - if (pwd != NULL && (pwd->pw_passwd[0] == '\0')) { - strcpy(password,""); - } - else -#endif - - { -#ifdef OTP - if(auth_level && strcmp(auth_level, "otp") == 0 && - otp_challenge(&otp_ctx, username, - otp_str, sizeof(otp_str)) == 0) - snprintf (prompt, sizeof(prompt), "%s's %s Password: ", - username, otp_str); - else -#endif - strncpy(prompt, "Password: ", sizeof(prompt)); - - if (f_flag == 0) { - ret = read_string(prompt, password, sizeof(password), 0); - if (ret == -3) { - ask = 1; - continue; - } - if (ret == -2) - sig_handler(0); - } - } - - if(pwd == NULL){ - fprintf(stderr, "Login incorrect.\n"); - ask = 1; - continue; - } - - if(f_flag == 0 && check_password(pwd, password)){ - fprintf(stderr, "Login incorrect.\n"); - ask = 1; - continue; - } - ttyn = ttyname(STDIN_FILENO); - if(ttyn == NULL){ - snprintf(ttname, sizeof(ttname), "%s??", _PATH_TTY); - ttyn = ttname; - } - if (strncmp (ttyn, _PATH_DEV, strlen(_PATH_DEV)) == 0) - tty = ttyn + strlen(_PATH_DEV); - else - tty = ttyn; - - if (login_access (pwd, remote_host ? remote_host : tty) == 0) { - fprintf(stderr, "Permission denied\n"); - if (remote_host) - syslog(LOG_NOTICE, "%s LOGIN REFUSED FROM %s", - pwd->pw_name, remote_host); - else - syslog(LOG_NOTICE, "%s LOGIN REFUSED ON %s", - pwd->pw_name, tty); - exit (1); - } else { - if (remote_host) - syslog(LOG_NOTICE, "%s LOGIN ACCEPTED FROM %s ppid=%d", - pwd->pw_name, remote_host, (int) getppid()); - else - syslog(LOG_NOTICE, "%s LOGIN ACCEPTED ON %s ppid=%d", - pwd->pw_name, tty, (int) getppid()); - } - alarm(0); - do_login(pwd, tty, ttyn); - } - exit(1); -} diff --git a/crypto/heimdal/appl/login/login_access.c b/crypto/heimdal/appl/login/login_access.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/login_access.c +++ /dev/null @@ -1,277 +0,0 @@ -/************************************************************************ -* Copyright 1995 by Wietse Venema. All rights reserved. Some individual -* files may be covered by other copyrights. -* -* This material was originally written and compiled by Wietse Venema at -* Eindhoven University of Technology, The Netherlands, in 1990, 1991, -* 1992, 1993, 1994 and 1995. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that this entire copyright notice -* is duplicated in all such copies. -* -* This software is provided "as is" and without any expressed or implied -* warranties, including, without limitation, the implied warranties of -* merchantibility and fitness for any particular purpose. -************************************************************************/ - /* - * This module implements a simple but effective form of login access - * control based on login names and on host (or domain) names, internet - * addresses (or network numbers), or on terminal line names in case of - * non-networked logins. Diagnostics are reported through syslog(3). - * - * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - - /* Delimiters for fields and for lists of users, ttys or hosts. */ - -static char fs[] = ":"; /* field separator */ -static char sep[] = ", \t"; /* list-element separator */ - - /* Constants to be used in assignments only, not in comparisons... */ - -#define YES 1 -#define NO 0 - - /* - * A structure to bundle up all login-related information to keep the - * functional interfaces as generic as possible. - */ -struct login_info { - struct passwd *user; - char *from; -}; - -static int list_match(char *list, struct login_info *item, - int (*match_fn)(char *, struct login_info *)); -static int user_match(char *tok, struct login_info *item); -static int from_match(char *tok, struct login_info *item); -static int string_match(char *tok, char *string); - -/* login_access - match username/group and host/tty with access control file */ - -int login_access(struct passwd *user, char *from) -{ - struct login_info item; - FILE *fp; - char line[BUFSIZ]; - char *perm; /* becomes permission field */ - char *users; /* becomes list of login names */ - char *froms; /* becomes list of terminals or hosts */ - int match = NO; - int end; - int lineno = 0; /* for diagnostics */ - char *foo; - - /* - * Bundle up the arguments to avoid unnecessary clumsiness lateron. - */ - item.user = user; - item.from = from; - - /* - * Process the table one line at a time and stop at the first match. - * Blank lines and lines that begin with a '#' character are ignored. - * Non-comment lines are broken at the ':' character. All fields are - * mandatory. The first field should be a "+" or "-" character. A - * non-existing table means no access control. - */ - - if ((fp = fopen(_PATH_LOGACCESS, "r")) != 0) { - while (!match && fgets(line, sizeof(line), fp)) { - lineno++; - if (line[end = strlen(line) - 1] != '\n') { - syslog(LOG_ERR, "%s: line %d: missing newline or line too long", - _PATH_LOGACCESS, lineno); - continue; - } - if (line[0] == '#') - continue; /* comment line */ - while (end > 0 && isspace((unsigned char)line[end - 1])) - end--; - line[end] = 0; /* strip trailing whitespace */ - if (line[0] == 0) /* skip blank lines */ - continue; - foo = NULL; - if (!(perm = strtok_r(line, fs, &foo)) - || !(users = strtok_r(NULL, fs, &foo)) - || !(froms = strtok_r(NULL, fs, &foo)) - || strtok_r(NULL, fs, &foo)) { - syslog(LOG_ERR, "%s: line %d: bad field count", - _PATH_LOGACCESS, - lineno); - continue; - } - if (perm[0] != '+' && perm[0] != '-') { - syslog(LOG_ERR, "%s: line %d: bad first field", - _PATH_LOGACCESS, - lineno); - continue; - } - match = (list_match(froms, &item, from_match) - && list_match(users, &item, user_match)); - } - fclose(fp); - } else if (errno != ENOENT) { - syslog(LOG_ERR, "cannot open %s: %m", _PATH_LOGACCESS); - } - return (match == 0 || (line[0] == '+')); -} - -/* list_match - match an item against a list of tokens with exceptions */ - -static int -list_match(char *list, - struct login_info *item, - int (*match_fn)(char *, struct login_info *)) -{ - char *tok; - int match = NO; - char *foo = NULL; - - /* - * Process tokens one at a time. We have exhausted all possible matches - * when we reach an "EXCEPT" token or the end of the list. If we do find - * a match, look for an "EXCEPT" list and recurse to determine whether - * the match is affected by any exceptions. - */ - - for (tok = strtok_r(list, sep, &foo); - tok != NULL; - tok = strtok_r(NULL, sep, &foo)) { - if (strcasecmp(tok, "EXCEPT") == 0) /* EXCEPT: give up */ - break; - if ((match = (*match_fn) (tok, item)) != 0) /* YES */ - break; - } - /* Process exceptions to matches. */ - - if (match != NO) { - while ((tok = strtok_r(NULL, sep, &foo)) && strcasecmp(tok, "EXCEPT")) - /* VOID */ ; - if (tok == 0 || list_match(NULL, item, match_fn) == NO) - return (match); - } - return (NO); -} - -/* myhostname - figure out local machine name */ - -static char *myhostname(void) -{ - static char name[MAXHOSTNAMELEN + 1] = ""; - - if (name[0] == 0) { - gethostname(name, sizeof(name)); - name[MAXHOSTNAMELEN] = 0; - } - return (name); -} - -/* netgroup_match - match group against machine or user */ - -static int netgroup_match(char *group, char *machine, char *user) -{ -#ifdef HAVE_YP_GET_DEFAULT_DOMAIN - static char *mydomain = 0; - - if (mydomain == 0) - yp_get_default_domain(&mydomain); - return (innetgr(group, machine, user, mydomain)); -#else - syslog(LOG_ERR, "NIS netgroup support not configured"); - return 0; -#endif -} - -/* user_match - match a username against one token */ - -static int user_match(char *tok, struct login_info *item) -{ - char *string = item->user->pw_name; - struct login_info fake_item; - struct group *group; - int i; - char *at; - - /* - * If a token has the magic value "ALL" the match always succeeds. - * Otherwise, return YES if the token fully matches the username, if the - * token is a group that contains the username, or if the token is the - * name of the user's primary group. - */ - - if ((at = strchr(tok + 1, '@')) != 0) { /* split user@host pattern */ - *at = 0; - fake_item.from = myhostname(); - return (user_match(tok, item) && from_match(at + 1, &fake_item)); - } else if (tok[0] == '@') { /* netgroup */ - return (netgroup_match(tok + 1, (char *) 0, string)); - } else if (string_match(tok, string)) { /* ALL or exact match */ - return (YES); - } else if ((group = getgrnam(tok)) != 0) { /* try group membership */ - if (item->user->pw_gid == group->gr_gid) - return (YES); - for (i = 0; group->gr_mem[i]; i++) - if (strcasecmp(string, group->gr_mem[i]) == 0) - return (YES); - } - return (NO); -} - -/* from_match - match a host or tty against a list of tokens */ - -static int from_match(char *tok, struct login_info *item) -{ - char *string = item->from; - int tok_len; - int str_len; - - /* - * If a token has the magic value "ALL" the match always succeeds. Return - * YES if the token fully matches the string. If the token is a domain - * name, return YES if it matches the last fields of the string. If the - * token has the magic value "LOCAL", return YES if the string does not - * contain a "." character. If the token is a network number, return YES - * if it matches the head of the string. - */ - - if (tok[0] == '@') { /* netgroup */ - return (netgroup_match(tok + 1, string, (char *) 0)); - } else if (string_match(tok, string)) { /* ALL or exact match */ - return (YES); - } else if (tok[0] == '.') { /* domain: match last fields */ - if ((str_len = strlen(string)) > (tok_len = strlen(tok)) - && strcasecmp(tok, string + str_len - tok_len) == 0) - return (YES); - } else if (strcasecmp(tok, "LOCAL") == 0) { /* local: no dots */ - if (strchr(string, '.') == 0) - return (YES); - } else if (tok[(tok_len = strlen(tok)) - 1] == '.' /* network */ - && strncmp(tok, string, tok_len) == 0) { - return (YES); - } - return (NO); -} - -/* string_match - match a string against one token */ - -static int string_match(char *tok, char *string) -{ - - /* - * If the token has the magic value "ALL" the match always succeeds. - * Otherwise, return YES if the token fully matches the string. - */ - - if (strcasecmp(tok, "ALL") == 0) { /* all: always matches */ - return (YES); - } else if (strcasecmp(tok, string) == 0) { /* try exact match */ - return (YES); - } - return (NO); -} diff --git a/crypto/heimdal/appl/login/login_locl.h b/crypto/heimdal/appl/login/login_locl.h deleted file mode 100644 --- a/crypto/heimdal/appl/login/login_locl.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifndef __LOGIN_LOCL_H__ -#define __LOGIN_LOCL_H__ - -#ifdef HAVE_CONFIG_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_PATHS_H -#include -#endif -#ifdef HAVE_UTMP_H -#include -#endif -#ifdef HAVE_UTMPX_H -#include -#endif -#ifdef HAVE_UDB_H -#include -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif -#ifdef HAVE_SYS_CATEGORY_H -#include -#endif -#ifdef HAVE_SYS_WAIT_H -#include -#endif -#ifdef HAVE_SHADOW_H -#include -#endif -#ifdef HAVE_NETGROUP_H -#include -#endif -#ifdef HAVE_RPCSVC_YPCLNT_H -#include -#endif -#ifdef KRB5 -#include -#endif -#include - -#ifdef OTP -#include -#endif - -#ifdef HAVE_OSFC2 -#define getargs OSFgetargs -#include "/usr/include/prot.h" -#undef getargs -#endif - -#ifndef _PATH_BSHELL -#define _PATH_BSHELL "/bin/sh" -#endif -#ifndef _PATH_TTY -#define _PATH_TTY "/dev/tty" -#endif -#ifndef _PATH_DEV -#define _PATH_DEV "/dev/" -#endif -#ifndef _PATH_WTMP -#ifdef WTMP_FILE -#define _PATH_WTMP WTMP_FILE -#else -#define _PATH_WTMP "/var/adm/wtmp" -#endif -#endif -#ifndef _PATH_UTMP -#ifdef UTMP_FILE -#define _PATH_UTMP UTMP_FILE -#else -#define _PATH_UTMP "/var/adm/utmp" -#endif -#endif - -/* if cygwin doesnt have WTMPX_FILE, it uses wtmp for wtmpx - * http://www.cygwin.com/ml/cygwin/2006-12/msg00630.html */ -#ifdef __CYGWIN__ -#ifndef WTMPX_FILE -#define WTMPX_FILE WTMP_FILE -#endif -#endif - -#ifndef _PATH_LOGACCESS -#define _PATH_LOGACCESS SYSCONFDIR "/login.access" -#endif /* _PATH_LOGACCESS */ - -#ifndef _PATH_LOGIN_CONF -#define _PATH_LOGIN_CONF SYSCONFDIR "/login.conf" -#endif /* _PATH_LOGIN_CONF */ - -#ifndef _PATH_DEFPATH -#define _PATH_DEFPATH "/usr/bin:/bin" -#endif - -#include "loginpaths.h" - -struct spwd; - -extern char **env; -extern int num_env; - -#include "login-protos.h" - -#endif /* __LOGIN_LOCL_H__ */ diff --git a/crypto/heimdal/appl/login/loginpaths.h b/crypto/heimdal/appl/login/loginpaths.h deleted file mode 100644 --- a/crypto/heimdal/appl/login/loginpaths.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifndef __LOGIN_PATH_H -#define __LOGIN_PATH_H - -#ifndef _PATH_NOLOGIN -#define _PATH_NOLOGIN "/etc/nologin" -#endif - -#ifndef _PATH_ETC_ENVIRONMENT -#define _PATH_ETC_ENVIRONMENT SYSCONFDIR "/environment" -#endif - -#ifndef _PATH_LIMITS_CONF -#define _PATH_LIMITS_CONF "/etc/security/limits.conf" -#endif - - -#endif /* __LOGIN_PATH_H */ diff --git a/crypto/heimdal/appl/login/osfc2.c b/crypto/heimdal/appl/login/osfc2.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/osfc2.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 1998 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" -RCSID("$Id$"); - -int -do_osfc2_magic(uid_t uid) -{ -#ifdef HAVE_OSFC2 - struct es_passwd *epw; - char *argv[2]; - - /* fake */ - argv[0] = (char*)getprogname(); - argv[1] = NULL; - set_auth_parameters(1, argv); - - epw = getespwuid(uid); - if(epw == NULL) { - syslog(LOG_AUTHPRIV|LOG_NOTICE, - "getespwuid failed for %d", uid); - printf("Sorry.\n"); - return 1; - } - /* We don't check for auto-retired, foo-retired, - bar-retired, or any other kind of retired accounts - here; neither do we check for time-locked accounts, or - any other kind of serious C2 mumbo-jumbo. We do, - however, call setluid, since failing to do so is not - very good (take my word for it). */ - - if(!epw->uflg->fg_uid) { - syslog(LOG_AUTHPRIV|LOG_NOTICE, - "attempted login by %s (has no uid)", epw->ufld->fd_name); - printf("Sorry.\n"); - return 1; - } - setluid(epw->ufld->fd_uid); - if(getluid() != epw->ufld->fd_uid) { - syslog(LOG_AUTHPRIV|LOG_NOTICE, - "failed to set LUID for %s (%d)", - epw->ufld->fd_name, epw->ufld->fd_uid); - printf("Sorry.\n"); - return 1; - } -#endif /* HAVE_OSFC2 */ - return 0; -} diff --git a/crypto/heimdal/appl/login/read_string.c b/crypto/heimdal/appl/login/read_string.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/read_string.c +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 1997 - 2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - -static sig_atomic_t intr_flag; - -static void -intr(int sig) -{ - intr_flag++; -} - -#ifndef NSIG -#define NSIG 47 -#endif - -int -read_string(const char *prompt, char *buf, size_t len, int echo) -{ - struct sigaction sigs[NSIG]; - int oksigs[NSIG]; - struct sigaction sa; - FILE *tty; - int ret = 0; - int of = 0; - int i; - int c; - char *p; - - struct termios t_new, t_old; - - memset(&oksigs, 0, sizeof(oksigs)); - - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = intr; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++) - if (i != SIGALRM) - if (sigaction(i, &sa, &sigs[i]) == 0) - oksigs[i] = 1; - - if((tty = fopen("/dev/tty", "r")) == NULL) - tty = stdin; - - fprintf(stderr, "%s", prompt); - fflush(stderr); - - if(echo == 0){ - tcgetattr(fileno(tty), &t_old); - memcpy(&t_new, &t_old, sizeof(t_new)); - t_new.c_lflag &= ~ECHO; - tcsetattr(fileno(tty), TCSANOW, &t_new); - } - intr_flag = 0; - p = buf; - while(intr_flag == 0){ - c = getc(tty); - if(c == EOF){ - if(!ferror(tty)) - ret = 1; - break; - } - if(c == '\n') - break; - if(of == 0) - *p++ = c; - of = (p == buf + len); - } - if(of) - p--; - *p = 0; - - if(echo == 0){ - printf("\n"); - tcsetattr(fileno(tty), TCSANOW, &t_old); - } - - if(tty != stdin) - fclose(tty); - - for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++) - if (oksigs[i]) - sigaction(i, &sigs[i], NULL); - - if(ret) - return -3; - if(intr_flag) - return -2; - if(of) - return -1; - return 0; -} - - -#if 0 -int main() -{ - char s[128]; - int ret; - ret = read_string("foo: ", s, sizeof(s), 0); - printf("%d ->%s<-\n", ret, s); -} -#endif diff --git a/crypto/heimdal/appl/login/shadow.c b/crypto/heimdal/appl/login/shadow.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/shadow.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - -#ifdef HAVE_SHADOW_H - -#ifndef _PATH_CHPASS -#define _PATH_CHPASS "/usr/bin/passwd" -#endif - -static int -change_passwd(const struct passwd *who) -{ - int status; - pid_t pid; - - switch (pid = fork()) { - case -1: - printf("fork /bin/passwd"); - exit(1); - case 0: - execlp(_PATH_CHPASS, "passwd", who->pw_name, (char *) 0); - exit(1); - default: - waitpid(pid, &status, 0); - return (status); - } -} - -void -check_shadow(const struct passwd *pw, const struct spwd *sp) -{ - long today; - - today = time(0)/(24L * 60 * 60); - - if (sp == NULL) - return; - - if (sp->sp_expire > 0) { - if (today >= sp->sp_expire) { - printf("Your account has expired.\n"); - sleep(1); - exit(0); - } else if (sp->sp_expire - today < 14) { - printf("Your account will expire in %d days.\n", - (int)(sp->sp_expire - today)); - } - } - - if (sp->sp_max > 0) { - if (today >= (sp->sp_lstchg + sp->sp_max)) { - printf("Your password has expired. Choose a new one.\n"); - change_passwd(pw); - } else if (sp->sp_warn > 0 - && (today > (sp->sp_lstchg + sp->sp_max - sp->sp_warn))) { - printf("Your password will expire in %d days.\n", - (int)(sp->sp_lstchg + sp->sp_max - today)); - } - } -} -#endif /* HAVE_SHADOW_H */ diff --git a/crypto/heimdal/appl/login/stty_default.c b/crypto/heimdal/appl/login/stty_default.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/stty_default.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - -#include - -/* HP-UX 9.0 termios doesn't define these */ -#ifndef FLUSHO -#define FLUSHO 0 -#endif - -#ifndef XTABS -#define XTABS 0 -#endif - -#ifndef OXTABS -#define OXTABS XTABS -#endif - -/* Ultrix... */ -#ifndef ECHOPRT -#define ECHOPRT 0 -#endif - -#ifndef ECHOCTL -#define ECHOCTL 0 -#endif - -#ifndef ECHOKE -#define ECHOKE 0 -#endif - -#ifndef IMAXBEL -#define IMAXBEL 0 -#endif - -#define Ctl(x) ((x) ^ 0100) - -void -stty_default(void) -{ - struct termios termios; - - /* - * Finalize the terminal settings. Some systems default to 8 bits, - * others to 7, so we should leave that alone. - */ - tcgetattr(0, &termios); - - termios.c_iflag |= (BRKINT|IGNPAR|ICRNL|IXON|IMAXBEL); - termios.c_iflag &= ~IXANY; - - termios.c_lflag |= (ISIG|IEXTEN|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOKE); - termios.c_lflag &= ~(ECHOPRT|TOSTOP|FLUSHO); - - termios.c_oflag |= (OPOST|ONLCR); - termios.c_oflag &= ~OXTABS; - - termios.c_cc[VINTR] = Ctl('C'); - termios.c_cc[VERASE] = Ctl('H'); - termios.c_cc[VKILL] = Ctl('U'); - termios.c_cc[VEOF] = Ctl('D'); - - termios.c_cc[VSUSP] = Ctl('Z'); - - tcsetattr(0, TCSANOW, &termios); -} diff --git a/crypto/heimdal/appl/login/tty.c b/crypto/heimdal/appl/login/tty.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/tty.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - -/* - * Clean the tty name. Return a pointer to the cleaned version. - */ - -char * -clean_ttyname (char *tty) -{ - char *res = tty; - - if (strncmp (res, _PATH_DEV, strlen(_PATH_DEV)) == 0) - res += strlen(_PATH_DEV); - if (strncmp (res, "pty/", 4) == 0) - res += 4; - if (strncmp (res, "ptym/", 5) == 0) - res += 5; - return res; -} - -/* - * Generate a name usable as an `ut_id', typically without `tty'. - */ - -char * -make_id (char *tty) -{ - char *res = tty; - - if (strncmp (res, "pts/", 4) == 0) - res += 4; - if (strncmp (res, "tty", 3) == 0) - res += 3; - return res; -} diff --git a/crypto/heimdal/appl/login/utmp_login.c b/crypto/heimdal/appl/login/utmp_login.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/utmp_login.c +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - -/* try to put something useful from hostname into dst, dst_sz: - * full name, first component or address */ - -void -shrink_hostname (const char *hostname, - char *dst, size_t dst_sz) -{ - char local_hostname[MaxHostNameLen]; - char *ld, *hd; - int ret; - struct addrinfo *ai; - - if (strlen(hostname) < dst_sz) { - strlcpy (dst, hostname, dst_sz); - return; - } - gethostname (local_hostname, sizeof(local_hostname)); - hd = strchr (hostname, '.'); - ld = strchr (local_hostname, '.'); - if (hd != NULL && ld != NULL && strcmp(hd, ld) == 0 - && hd - hostname < dst_sz) { - strlcpy (dst, hostname, dst_sz); - dst[hd - hostname] = '\0'; - return; - } - - ret = getaddrinfo (hostname, NULL, NULL, &ai); - if (ret) { - strncpy (dst, hostname, dst_sz); - return; - } - ret = getnameinfo (ai->ai_addr, ai->ai_addrlen, - dst, dst_sz, - NULL, 0, - NI_NUMERICHOST); - freeaddrinfo (ai); - if (ret) { - strncpy (dst, hostname, dst_sz); - return; - } -} - -/* update utmp and wtmp - the BSD way */ - -#if !defined(HAVE_UTMPX_H) || (defined(WTMP_FILE) && !defined(WTMPX_FILE)) - -void -prepare_utmp (struct utmp *utmp, char *tty, - const char *username, const char *hostname) -{ - char *ttyx = clean_ttyname (tty); - - memset(utmp, 0, sizeof(*utmp)); - utmp->ut_time = time(NULL); - strncpy(utmp->ut_line, ttyx, sizeof(utmp->ut_line)); - strncpy(utmp->ut_name, username, sizeof(utmp->ut_name)); - -# ifdef HAVE_STRUCT_UTMP_UT_USER - strncpy(utmp->ut_user, username, sizeof(utmp->ut_user)); -# endif - -# ifdef HAVE_STRUCT_UTMP_UT_ADDR - if (hostname[0]) { - struct hostent *he; - if ((he = gethostbyname(hostname))) - memcpy(&utmp->ut_addr, he->h_addr_list[0], - sizeof(utmp->ut_addr)); - } -# endif - -# ifdef HAVE_STRUCT_UTMP_UT_HOST - shrink_hostname (hostname, utmp->ut_host, sizeof(utmp->ut_host)); -# endif - -# ifdef HAVE_STRUCT_UTMP_UT_TYPE - utmp->ut_type = USER_PROCESS; -# endif - -# ifdef HAVE_STRUCT_UTMP_UT_PID - utmp->ut_pid = getpid(); -# endif - -# ifdef HAVE_STRUCT_UTMP_UT_ID - strncpy(utmp->ut_id, make_id(ttyx), sizeof(utmp->ut_id)); -# endif -} -#endif - -#ifdef HAVE_UTMPX_H -void utmp_login(char *tty, const char *username, const char *hostname) -{ - return; -} -#else - -void utmp_login(char *tty, const char *username, const char *hostname) -{ - struct utmp utmp; - int fd; - - prepare_utmp (&utmp, tty, username, hostname); - -#ifdef HAVE_SETUTENT - utmpname(_PATH_UTMP); - setutent(); - pututline(&utmp); - endutent(); -#else - -#ifdef HAVE_TTYSLOT - { - int ttyno; - ttyno = ttyslot(); - if (ttyno > 0 && (fd = open(_PATH_UTMP, O_WRONLY, 0)) >= 0) { - lseek(fd, (long)(ttyno * sizeof(struct utmp)), SEEK_SET); - write(fd, &utmp, sizeof(struct utmp)); - close(fd); - } - } -#endif /* HAVE_TTYSLOT */ -#endif /* HAVE_SETUTENT */ - - if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) { - write(fd, &utmp, sizeof(struct utmp)); - close(fd); - } -} - -#endif /* !HAVE_UTMPX_H */ diff --git a/crypto/heimdal/appl/login/utmpx_login.c b/crypto/heimdal/appl/login/utmpx_login.c deleted file mode 100644 --- a/crypto/heimdal/appl/login/utmpx_login.c +++ /dev/null @@ -1,105 +0,0 @@ -/************************************************************************ -* Copyright 1995 by Wietse Venema. All rights reserved. Some individual -* files may be covered by other copyrights. -* -* This material was originally written and compiled by Wietse Venema at -* Eindhoven University of Technology, The Netherlands, in 1990, 1991, -* 1992, 1993, 1994 and 1995. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that this entire copyright notice -* is duplicated in all such copies. -* -* This software is provided "as is" and without any expressed or implied -* warranties, including, without limitation, the implied warranties of -* merchantibility and fitness for any particular purpose. -************************************************************************/ -/* Author: Wietse Venema */ - -#include "login_locl.h" - -RCSID("$Id$"); - -/* utmpx_login - update utmp and wtmp after login */ - -#ifndef HAVE_UTMPX_H -int utmpx_login(char *line, const char *user, const char *host) { return 0; } -#else - -static void -utmpx_update(struct utmpx *ut, char *line, const char *user, const char *host) -{ - struct timeval tmp; - char *clean_tty = clean_ttyname(line); - - strncpy(ut->ut_line, clean_tty, sizeof(ut->ut_line)); -#ifdef HAVE_STRUCT_UTMPX_UT_ID - strncpy(ut->ut_id, make_id(clean_tty), sizeof(ut->ut_id)); -#endif - strncpy(ut->ut_user, user, sizeof(ut->ut_user)); - shrink_hostname (host, ut->ut_host, sizeof(ut->ut_host)); -#ifdef HAVE_STRUCT_UTMPX_UT_SYSLEN - ut->ut_syslen = strlen(host) + 1; - if (ut->ut_syslen > sizeof(ut->ut_host)) - ut->ut_syslen = sizeof(ut->ut_host); -#endif - ut->ut_type = USER_PROCESS; - gettimeofday (&tmp, 0); - ut->ut_tv.tv_sec = tmp.tv_sec; - ut->ut_tv.tv_usec = tmp.tv_usec; - pututxline(ut); -#ifdef WTMPX_FILE - updwtmpx(WTMPX_FILE, ut); -#elif defined(WTMP_FILE) - { /* XXX should be removed, just drop wtmp support */ - struct utmp utmp; - int fd; - - prepare_utmp (&utmp, line, user, host); - if ((fd = open(_PATH_WTMP, O_WRONLY|O_APPEND, 0)) >= 0) { - write(fd, &utmp, sizeof(struct utmp)); - close(fd); - } - } -#endif -} - -int -utmpx_login(char *line, const char *user, const char *host) -{ - struct utmpx *ut, save_ut; - pid_t mypid = getpid(); - int ret = (-1); - - /* - * SYSV4 ttymon and login use tty port names with the "/dev/" prefix - * stripped off. Rlogind and telnetd, on the other hand, make utmpx - * entries with device names like /dev/pts/nnn. We therefore cannot use - * getutxline(). Return nonzero if no utmp entry was found with our own - * process ID for a login or user process. - */ - - while ((ut = getutxent())) { - /* Try to find a reusable entry */ - if (ut->ut_pid == mypid - && ( ut->ut_type == INIT_PROCESS - || ut->ut_type == LOGIN_PROCESS - || ut->ut_type == USER_PROCESS)) { - save_ut = *ut; - utmpx_update(&save_ut, line, user, host); - ret = 0; - break; - } - } - if (ret == -1) { - /* Grow utmpx file by one record. */ - struct utmpx newut; - memset(&newut, 0, sizeof(newut)); - newut.ut_pid = mypid; - utmpx_update(&newut, line, user, host); - ret = 0; - } - endutxent(); - return (ret); -} -#endif /* HAVE_UTMPX_H */ diff --git a/crypto/heimdal/appl/otp/ChangeLog b/crypto/heimdal/appl/otp/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/ChangeLog @@ -0,0 +1,58 @@ +2006-10-07 Love Hörnquist Åstrand + + * Makefile.am: Add man_MANS to EXTRA_DIST + +2005-05-29 Love Hörquist Åstrand + + * Makefile.am: add LIB_roken as a explit dependency + +2003-09-03 Love Hörquist Åstrand + + * otpprint.c: s/des_read_pw_string/UI_UTIL_read_pw_string/ + + * otp.c: s/des_read_pw_string/UI_UTIL_read_pw_string/ + +2003-02-25 Love Hörquist Åstrand + + * otp.c: remove \n from errx, from NetBSD + +2000-11-29 Johan Danielsson + + * otpprint.1: sort parameters and close a list + + * otp.1: sort parameters and close a list + +1999-09-14 Assar Westerlund + + * otp.c (verify_user_otp): check return value from + des_read_pw_string + +Thu Apr 1 16:51:07 1999 Johan Danielsson + + * otpprint.c: use getarg + + * otp.c: use getarg + +Thu Mar 18 12:08:58 1999 Johan Danielsson + + * Makefile.am: include Makefile.am.common + +Thu Mar 4 19:45:40 1999 Johan Danielsson + + * Makefile.am: DESTDIR + +Sat Feb 27 19:44:25 1999 Johan Danielsson + + * Makefile.am: add + +Sun Nov 22 10:32:50 1998 Assar Westerlund + + * otpprint.c: more braces + + * Makefile.in (WFLAGS): set + +Sun Dec 21 09:31:30 1997 Assar Westerlund + + * otp.c (renew): don't set the OTP if the reading of the string + fails. + diff --git a/crypto/heimdal/appl/otp/Makefile.am b/crypto/heimdal/appl/otp/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/Makefile.am @@ -0,0 +1,15 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +bin_PROGRAMS = otp otpprint +bin_SUIDS = otp +otp_SOURCES = otp.c otp_locl.h +otp_LDADD = $(LIB_hcrypto) $(LIB_roken) $(top_builddir)/lib/otp/libotp.la +otpprint_SOURCES = otpprint.c otp_locl.h + +otpprint_LDADD = $(LIB_hcrypto) $(LIB_roken) $(top_builddir)/lib/otp/libotp.la + +man_MANS = otp.1 otpprint.1 + +EXTRA_DIST = NTMakefile $(man_MANS) diff --git a/crypto/heimdal/appl/otp/Makefile.in b/crypto/heimdal/appl/otp/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/Makefile.in @@ -0,0 +1,1139 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +bin_PROGRAMS = otp$(EXEEXT) otpprint$(EXEEXT) +subdir = appl/otp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +PROGRAMS = $(bin_PROGRAMS) +am_otp_OBJECTS = otp.$(OBJEXT) +otp_OBJECTS = $(am_otp_OBJECTS) +am__DEPENDENCIES_1 = +otp_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/otp/libotp.la +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +am_otpprint_OBJECTS = otpprint.$(OBJEXT) +otpprint_OBJECTS = $(am_otpprint_OBJECTS) +otpprint_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/otp/libotp.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/otp.Po ./$(DEPDIR)/otpprint.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(otp_SOURCES) $(otpprint_SOURCES) +DIST_SOURCES = $(otp_SOURCES) $(otpprint_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 +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +bin_SUIDS = otp +otp_SOURCES = otp.c otp_locl.h +otp_LDADD = $(LIB_hcrypto) $(LIB_roken) $(top_builddir)/lib/otp/libotp.la +otpprint_SOURCES = otpprint.c otp_locl.h +otpprint_LDADD = $(LIB_hcrypto) $(LIB_roken) $(top_builddir)/lib/otp/libotp.la +man_MANS = otp.1 otpprint.1 +EXTRA_DIST = NTMakefile $(man_MANS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/otp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign appl/otp/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 + +otp$(EXEEXT): $(otp_OBJECTS) $(otp_DEPENDENCIES) $(EXTRA_otp_DEPENDENCIES) + @rm -f otp$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(otp_OBJECTS) $(otp_LDADD) $(LIBS) + +otpprint$(EXEEXT): $(otpprint_OBJECTS) $(otpprint_DEPENDENCIES) $(EXTRA_otpprint_DEPENDENCIES) + @rm -f otpprint$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(otpprint_OBJECTS) $(otpprint_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otpprint.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +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) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) all-local +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(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." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/otp.Po + -rm -f ./$(DEPDIR)/otpprint.Po + -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-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +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-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 ./$(DEPDIR)/otp.Po + -rm -f ./$(DEPDIR)/otpprint.Po + -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-man + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +uninstall-man: uninstall-man1 + +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook 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-man1 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 tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-hook \ + uninstall-man uninstall-man1 + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +# 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: diff --git a/crypto/heimdal/appl/otp/NTMakefile b/crypto/heimdal/appl/otp/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\otp + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/otp/otp.1 b/crypto/heimdal/appl/otp/otp.1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/otp.1 @@ -0,0 +1,90 @@ +.\" Copyright (c) 1996, 2000 Kungliga Tekniska Högskolan +.\" (Royal Institute of Technology, Stockholm, Sweden). +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" 3. Neither the name of the Institute nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd November 17, 1996 +.Dt OTP 1 +.Os KTH-KRB +.Sh NAME +.Nm otp +.Nd manages one-time passwords +.Sh SYNOPSIS +.Nm otp +.Op Fl dhlor +.Op Fl f Ar algorithm +.Op Fl u Ar user +.Ar sequence-number +.Ar seed +.Sh DESCRIPTION +The +.Nm +program initializes and updates your current series of one-time +passwords (OTPs). +.Pp +Use this to set a new series of one-time passwords. Only perform this +on the console or over an encrypted link as you will have to supply +your pass-phrase. The other two parameters are +.Ar sequence-number +and +.Ar seed . +.Pp +Options are: +.Bl -tag -width Ds +.It Fl d +To delete a one-time password. +.It Fl f +Choose a different +.Ar algorithm +from the default md5. Pick any of: md4, md5, and sha. +.It Fl h +For getting a help message. +.It Fl l +List the current table of one-time passwords. +.It Fl o +To open (unlock) the otp-entry for a user. +.It Fl r +To renew a one-time password series. This operation can be performed +over an potentially eavesdropped link because you do not supply the +pass-phrase. First you need to supply the current one-time password +and then the new one corresponding to the supplied +.Ar sequence-number +and +.Ar seed . +.It Fl u +To choose a different +.Ar user +to set one-time passwords for. This only works when running +.Nm +as root. +.El +.Sh SEE ALSO +.Xr otpprint 1 diff --git a/crypto/heimdal/appl/otp/otp.c b/crypto/heimdal/appl/otp/otp.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/otp.c @@ -0,0 +1,373 @@ +/* + * Copyright (c) 1995-1997, 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "otp_locl.h" +#include + +RCSID("$Id$"); + +static int listp; +static int deletep; +static int openp; +static int renewp; +static char* alg_string; +static char *user; +static int version_flag; +static int help_flag; + +struct getargs args[] = { + { "list", 'l', arg_flag, &listp, "list OTP status", NULL }, + { "delete", 'd', arg_flag, &deletep, "delete OTP", NULL }, + { "open", 'o', arg_flag, &openp, "open a locked OTP", NULL }, + { "renew", 'r', arg_flag, &renewp, "securely renew OTP", NULL }, + { "hash", 'f', arg_string, &alg_string, + "hash algorithm (md4, md5, or sha)", "algorithm"}, + { "user", 'u', arg_string, &user, + "user other than current user (root only)", "user" }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL } +}; + +int num_args = sizeof(args) / sizeof(args[0]); + +static void +usage(int code) +{ + arg_printusage(args, num_args, NULL, "[num seed]"); + exit(code); +} + +/* + * Renew the OTP for a user. + * The pass-phrase is not required (RFC 1938/8.0) + */ + +static int +renew (int argc, char **argv, OtpAlgorithm *alg, char *inuser) +{ + OtpContext newctx, *ctx; + char prompt[128]; + char pw[64]; + void *dbm; + int ret; + + newctx.alg = alg; + newctx.user = inuser; + newctx.n = atoi (argv[0]); + strlcpy (newctx.seed, argv[1], sizeof(newctx.seed)); + strlwr(newctx.seed); + snprintf (prompt, sizeof(prompt), + "[ otp-%s %u %s ]", + newctx.alg->name, + newctx.n, + newctx.seed); + if (UI_UTIL_read_pw_string (pw, sizeof(pw), prompt, 0) == 0 && + otp_parse (newctx.key, pw, alg) == 0) { + ctx = &newctx; + ret = 0; + } else + return 1; + + dbm = otp_db_open (); + if (dbm == NULL) { + warnx ("otp_db_open failed"); + return 1; + } + otp_put (dbm, ctx); + otp_db_close (dbm); + return ret; +} + +/* + * Return 0 if the user could enter the next OTP. + * I would rather have returned !=0 but it's shell-like here around. + */ + +static int +verify_user_otp(char *username) +{ + OtpContext ctx; + char passwd[OTP_MAX_PASSPHRASE + 1]; + char ss[256]; + char *prompt = NULL; + + if (otp_challenge (&ctx, username, ss, sizeof(ss)) != 0) { + warnx("no otp challenge found for %s", username); + return 1; + } + + if (asprintf(&prompt, "%s's %s Password: ", username, ss) == -1 || + prompt == NULL) + return 1; + if(UI_UTIL_read_pw_string(passwd, sizeof(passwd)-1, prompt, 0)) { + free(prompt); + return 1; + } + free(prompt); + return otp_verify_user (&ctx, passwd); +} + +/* + * Set the OTP for a user + */ + +static int +set (int argc, char **argv, OtpAlgorithm *alg, char *inuser) +{ + void *db; + OtpContext ctx; + char pw[OTP_MAX_PASSPHRASE + 1]; + int ret; + int i; + + ctx.alg = alg; + ctx.user = strdup (inuser); + if (ctx.user == NULL) + err (1, "out of memory"); + + ctx.n = atoi (argv[0]); + strlcpy (ctx.seed, argv[1], sizeof(ctx.seed)); + strlwr(ctx.seed); + do { + if (UI_UTIL_read_pw_string (pw, sizeof(pw), "Pass-phrase: ", + UI_UTIL_FLAG_VERIFY)) + return 1; + if (strlen (pw) < OTP_MIN_PASSPHRASE) + printf ("Too short pass-phrase. Use at least %d characters\n", + OTP_MIN_PASSPHRASE); + } while(strlen(pw) < OTP_MIN_PASSPHRASE); + ctx.alg->init (ctx.key, pw, ctx.seed); + for (i = 0; i < ctx.n; ++i) + ctx.alg->next (ctx.key); + db = otp_db_open (); + if(db == NULL) { + free (ctx.user); + err (1, "otp_db_open failed"); + } + ret = otp_put (db, &ctx); + otp_db_close (db); + free (ctx.user); + return ret; +} + +/* + * Delete otp of user from the database + */ + +static int +delete_otp (int argc, char **argv, char *inuser) +{ + void *db; + OtpContext ctx; + int ret; + + db = otp_db_open (); + if(db == NULL) + errx (1, "otp_db_open failed"); + + ctx.user = inuser; + ret = otp_delete(db, &ctx); + otp_db_close (db); + return ret; +} + +/* + * Tell whether the user has an otp + */ + +static int +has_an_otp(char *inuser) +{ + void *db; + OtpContext ctx; + int ret; + + db = otp_db_open (); + if(db == NULL) { + warnx ("otp_db_open failed"); + return 0; /* if no db no otp! */ + } + + ctx.user = inuser; + ret = otp_simple_get(db, &ctx); + + otp_db_close (db); + return !ret; +} + +/* + * Get and print out the otp entry for some user + */ + +static void +print_otp_entry_for_name (void *db, char *inuser) +{ + OtpContext ctx; + + ctx.user = inuser; + if (!otp_simple_get(db, &ctx)) { + fprintf(stdout, + "%s\totp-%s %d %s", + ctx.user, ctx.alg->name, ctx.n, ctx.seed); + if (ctx.lock_time) + fprintf(stdout, + "\tlocked since %s", + ctime(&ctx.lock_time)); + else + fprintf(stdout, "\n"); + } +} + +static int +open_otp (int argc, char **argv, char *inuser) +{ + void *db; + OtpContext ctx; + int ret; + + db = otp_db_open (); + if (db == NULL) + errx (1, "otp_db_open failed"); + + ctx.user = inuser; + ret = otp_simple_get (db, &ctx); + if (ret == 0) + ret = otp_put (db, &ctx); + otp_db_close (db); + return ret; +} + +/* + * Print otp entries for one or all users + */ + +static int +list_otps (int argc, char **argv, char *inuser) +{ + void *db; + struct passwd *pw; + + db = otp_db_open (); + if(db == NULL) + errx (1, "otp_db_open failed"); + + if (inuser) + print_otp_entry_for_name(db, inuser); + else + /* scans all users... so as to get a deterministic order */ + while ((pw = getpwent())) + print_otp_entry_for_name(db, pw->pw_name); + + otp_db_close (db); + return 0; +} + +int +main (int argc, char **argv) +{ + int defaultp = 0; + int uid = getuid(); + OtpAlgorithm *alg = otp_find_alg (OTP_ALG_DEFAULT); + int optidx = 0; + + setprogname (argv[0]); + if(getarg(args, num_args, argc, argv, &optidx)) + usage(1); + if(help_flag) + usage(0); + if(version_flag) { + print_version(NULL); + exit(0); + } + + if(deletep && uid != 0) + errx (1, "Only root can delete OTPs"); + if(alg_string) { + alg = otp_find_alg (alg_string); + if (alg == NULL) + errx (1, "Unknown algorithm: %s", alg_string); + } + if (user && uid != 0) + errx (1, "Only root can use `-u'"); + argc -= optidx; + argv += optidx; + + if (!(listp || deletep || renewp || openp)) + defaultp = 1; + + if ( listp + deletep + renewp + defaultp + openp != 1) + usage(1); /* one of -d or -l or -r or none */ + + if(deletep || openp || listp) { + if(argc != 0) + errx(1, "delete, open, and list requires no arguments"); + } else { + if(argc != 2) + errx(1, "setup, and renew requires `num', and `seed'"); + } + if (listp) + return list_otps (argc, argv, user); + + if (user == NULL) { + struct passwd *pwd; + + pwd = k_getpwuid(uid); + if (pwd == NULL) + err (1, "You don't exist"); + user = pwd->pw_name; + } + + /* + * users other that root must provide the next OTP to update the sequence. + * it avoids someone to use a pending session to change an OTP sequence. + * see RFC 1938/8.0. + */ + if (uid != 0 && (defaultp || renewp)) { + if (!has_an_otp(user)) { + errx (1, "Only root can set an initial OTP"); + } else { /* Check the next OTP (RFC 1938/8.0: SHOULD) */ + if (verify_user_otp(user) != 0) { + errx (1, "User authentication failed"); + } + } + } + + if (deletep) + return delete_otp (argc, argv, user); + else if (renewp) + return renew (argc, argv, alg, user); + else if (openp) + return open_otp (argc, argv, user); + else + return set (argc, argv, alg, user); +} diff --git a/crypto/heimdal/appl/otp/otp.cat1 b/crypto/heimdal/appl/otp/otp.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/otp.cat1 @@ -0,0 +1,42 @@ +OTP(1) BSD General Commands Manual OTP(1) + +NAME + otp -- manages one-time passwords + +SYNOPSIS + otp [-dhlor] [-f algorithm] [-u user] sequence-number seed + +DESCRIPTION + The otp program initializes and updates your current series of one-time + passwords (OTPs). + + Use this to set a new series of one-time passwords. Only perform this on + the console or over an encrypted link as you will have to supply your + pass-phrase. The other two parameters are sequence-number and seed. + + Options are: + + -d To delete a one-time password. + + -f Choose a different algorithm from the default md5. Pick any of: + md4, md5, and sha. + + -h For getting a help message. + + -l List the current table of one-time passwords. + + -o To open (unlock) the otp-entry for a user. + + -r To renew a one-time password series. This operation can be per- + formed over an potentially eavesdropped link because you do not + supply the pass-phrase. First you need to supply the current + one-time password and then the new one corresponding to the sup- + plied sequence-number and seed. + + -u To choose a different user to set one-time passwords for. This + only works when running otp as root. + +SEE ALSO + otpprint(1) + +KTH-KRB November 17, 1996 KTH-KRB diff --git a/crypto/heimdal/appl/otp/otp_locl.h b/crypto/heimdal/appl/otp/otp_locl.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/otp_locl.h @@ -0,0 +1,56 @@ +/* + * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#include +#include +#include "crypto-headers.h" /* for des_read_pw_string */ +#include diff --git a/crypto/heimdal/appl/otp/otpprint.1 b/crypto/heimdal/appl/otp/otpprint.1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/otpprint.1 @@ -0,0 +1,82 @@ +.\" Copyright (c) 1996, 2000 - 2001 Kungliga Tekniska Högskolan +.\" (Royal Institute of Technology, Stockholm, Sweden). +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" 3. Neither the name of the Institute nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd November 17, 1996 +.Dt OTP 1 +.Os KTH-KRB +.Sh NAME +.Nm otpprint +.Nd print lists of one-time passwords +.Sh SYNOPSIS +.Nm otp +.Op Fl n Ar count +.Op Fl e +.Op Fl h +.Op Fl f Ar algorithm +.Ar sequence-number +.Ar seed +.Sh DESCRIPTION +The +.Nm +program prints lists of OTPs. +.Pp +Use this to print out a series of one-time passwords. You will have +to supply the +.Ar sequence number +and the +.Ar seed +as arguments and then the program will prompt you for your pass-phrase. +.Pp +There are several different print formats. The default is to print +each password with six short english words. +.Pp +Options are: +.Bl -tag -width Ds +.It Fl e +Print the passwords in ``extended'' format. In this format a prefix +that says ``hex:'' or ``word:'' is included. +.It Fl f +To choose a different +.Ar algorithm +from the default md5. Pick any of: md4, md5, and sha. +.It Fl h +Print the passwords in hex. +.It Fl n +Print +.Ar count +one-time passwords, starting at +.Ar sequence-number +and going backwards. The default is 10. +.El +.Sh SEE ALSO +.Xr otp 1 diff --git a/crypto/heimdal/appl/otp/otpprint.c b/crypto/heimdal/appl/otp/otpprint.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/otpprint.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 1995-1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "otp_locl.h" +#include + +RCSID("$Id$"); + +static int extendedp; +static int count = 10; +static int hexp; +static char* alg_string; +static int version_flag; +static int help_flag; + +struct getargs args[] = { + { "extended", 'e', arg_flag, &extendedp, "print keys in extended format", + NULL }, + { "count", 'n', arg_integer, &count, "number of keys to print", NULL }, + { "hexadecimal", 'h', arg_flag, &hexp, "output in hexadecimal", NULL }, + { "hash", 'f', arg_string, &alg_string, + "hash algorithm (md4, md5, or sha)", "algorithm"}, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } +}; + +int num_args = sizeof(args) / sizeof(args[0]); + +static void +usage(int code) +{ + arg_printusage(args, num_args, NULL, "num seed"); + exit(code); +} + +static int +print (int argc, + char **argv, + int incount, + OtpAlgorithm *alg, + void (*print_fn)(OtpKey, char *, size_t)) +{ + char pw[64]; + OtpKey key; + int n; + int i; + char *seed; + + if (argc != 2) + usage (1); + n = atoi(argv[0]); + seed = argv[1]; + if (UI_UTIL_read_pw_string (pw, sizeof(pw), "Pass-phrase: ", 0)) + return 1; + alg->init (key, pw, seed); + for (i = 0; i < n; ++i) { + char s[64]; + + alg->next (key); + if (i >= n - incount) { + (*print_fn)(key, s, sizeof(s)); + printf ("%d: %s\n", i + 1, s); + } + } + return 0; +} + +int +main (int argc, char **argv) +{ + int optidx = 0; + void (*fn)(OtpKey, char *, size_t); + OtpAlgorithm *alg = otp_find_alg (OTP_ALG_DEFAULT); + + setprogname (argv[0]); + if(getarg(args, num_args, argc, argv, &optidx)) + usage(1); + if(help_flag) + usage(0); + if(version_flag) { + print_version(NULL); + exit(0); + } + + if(alg_string) { + alg = otp_find_alg (alg_string); + if (alg == NULL) + errx(1, "Unknown algorithm: %s", alg_string); + } + argc -= optidx; + argv += optidx; + + if (hexp) { + if (extendedp) + fn = otp_print_hex_extended; + else + fn = otp_print_hex; + } else { + if (extendedp) + fn = otp_print_stddict_extended; + else + fn = otp_print_stddict; + } + + return print (argc, argv, count, alg, fn); +} diff --git a/crypto/heimdal/appl/otp/otpprint.cat1 b/crypto/heimdal/appl/otp/otpprint.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/otp/otpprint.cat1 @@ -0,0 +1,35 @@ +OTP(1) BSD General Commands Manual OTP(1) + +NAME + otpprint -- print lists of one-time passwords + +SYNOPSIS + otp [-n count] [-e] [-h] [-f algorithm] sequence-number seed + +DESCRIPTION + The otpprint program prints lists of OTPs. + + Use this to print out a series of one-time passwords. You will have to + supply the sequence number and the seed as arguments and then the program + will prompt you for your pass-phrase. + + There are several different print formats. The default is to print each + password with six short english words. + + Options are: + + -e Print the passwords in ``extended'' format. In this format a + prefix that says ``hex:'' or ``word:'' is included. + + -f To choose a different algorithm from the default md5. Pick any + of: md4, md5, and sha. + + -h Print the passwords in hex. + + -n Print count one-time passwords, starting at sequence-number and + going backwards. The default is 10. + +SEE ALSO + otp(1) + +KTH-KRB November 17, 1996 KTH-KRB diff --git a/crypto/heimdal/appl/push/ChangeLog b/crypto/heimdal/appl/push/ChangeLog deleted file mode 100644 --- a/crypto/heimdal/appl/push/ChangeLog +++ /dev/null @@ -1,200 +0,0 @@ -2005-04-19 Love Hörnquist Åstrand - - * push.c: catch when snprint needs a larger buffer - -2004-06-17 Johan Danielsson - - * push.c: alloc memory to handle very long lines - -2003-04-03 Assar Westerlund - - * push.c: fixed one incorrect fprintf to stderr - -2003-03-18 Love Hörnquist Åstrand - - * push.c: add names of pop states, add some more debugging and use - fprintf(stderr) for all dbg stmts. - -2001-09-04 Assar Westerlund - - * push.c (doit): check return values from snprintf being negative - -2000-12-31 Assar Westerlund - - * push.c (main): handle krb5_init_context failure consistently - -2000-12-26 Assar Westerlund - - * push.c: support several headers, from use - estrdup, emalloc, erealloc - -2000-11-29 Johan Danielsson - - * pfrom.1: work around bug in grog that makes it think it needs - mdoc.old - - * push.8: work around bug in grog that makes it think it needs - mdoc.old - -2000-11-27 Johan Danielsson - - * push.c: add space to usage - -2000-10-08 Assar Westerlund - - * push.c (doit): check that fds are not too large to select on - -2000-03-04 Assar Westerlund - - * add man-page for pfrom - -1999-12-28 Assar Westerlund - - * push.c (main): call k_getportbyname with port number in - network-byte-order - -1999-12-14 Assar Westerlund - - * push.c (do_connect): remove bogus local block variable - -1999-12-05 Assar Westerlund - - * push.c (do_connect): use `getaddrinfo' - * push.c: add --count (print number of messages and bytes at - beginning) - -1999-11-13 Assar Westerlund - - * push.c: make `-v' a arg_counter - -1999-11-02 Assar Westerlund - - * push.c (main): redo the v4/v5 selection for consistency. -4 -> - try only v4 -5 -> try only v5 none, -45 -> try v5, v4 - -1999-08-19 Assar Westerlund - - * push.c (doit): remember to step over the error message when we - discover that XDELE is not supported - -1999-08-12 Johan Danielsson - - * push.c: use XDELE - -1999-08-05 Assar Westerlund - - * push.c (do_connect): v6-ify - -1999-06-15 Assar Westerlund - - * push.c: get_default_username and the resulting const propagation - -1999-05-21 Assar Westerlund - - * push.c (parse_pobox): try $USERNAME - -1999-05-11 Assar Westerlund - - * push.c (do_v5): remove unused and non-working code - -1999-05-10 Assar Westerlund - - * push.c (do_v5): call krb5_sendauth with ccache == NULL - -Wed Apr 7 23:40:00 1999 Assar Westerlund - - * Makefile.in: fix names of hesiod variables - -Wed Mar 24 04:37:04 1999 Assar Westerlund - - * Makefile.am (pfrom): fix typo - - * push.c (get_pobox): try to handle old and new hesiod APIs - -Mon Mar 22 22:19:40 1999 Assar Westerlund - - * Makefile.am: hesoid -> hesiod - -Sun Mar 21 18:02:10 1999 Johan Danielsson - - * Makefile.am: bindir -> libexecdir - -Sat Mar 20 00:12:26 1999 Assar Westerlund - - * Makefile.am: LDADD: add missing backslash - -Thu Mar 18 15:28:35 1999 Johan Danielsson - - * Makefile.am: clean pfrom - - * Makefile.am: include Makefile.am.common - -Mon Mar 15 18:26:16 1999 Johan Danielsson - - * push.c: strncasecmp headers - -Mon Feb 15 22:22:09 1999 Assar Westerlund - - * Makefile.in (pfrom): use libexecdir - - * Makefile.am: build and install pfrom - - * push.c (do_connect): init `s' - (pop_state): spell-check enums - -Tue Nov 24 23:20:54 1998 Assar Westerlund - - * Makefile.in: build and install pfrom - - * pfrom.in: bindir -> libexecdir - -Sun Nov 22 15:33:52 1998 Johan Danielsson - - * push.c: eliminate some warnings - -Sun Nov 22 10:34:54 1998 Assar Westerlund - - * Makefile.in (WFLAGS): set - -Thu Nov 19 01:17:33 1998 Assar Westerlund - - * push_locl.h: add - - * Makefile.am, Makefile.in: link and include hesiod - - * push.c (get_pobox): new function. add hesiod support. - -1998-11-07 Assar Westerlund - - * push.8: updated - - * push.c: --from implementation from - -Fri Jul 10 01:14:45 1998 Assar Westerlund - - * push.c (net_{read,write}): remove - -Wed Jun 24 14:41:41 1998 Johan Danielsson - - * push.c: allow `po:user@host' mailbox syntax - -Tue Jun 2 17:35:06 1998 Johan Danielsson - - * push.c: quote '^From ' properly - -Mon May 25 05:22:47 1998 Assar Westerlund - - * Makefile.in (clean): PROGS -> PROGRAMS - -Sun Apr 26 11:42:13 1998 Assar Westerlund - - * push.c (main): better default for v4 and v5 - - * push.c (main): init context correctly - - * push.c: should work with krb4 - - * push_locl.h: krb4 compat - - * Makefile.in: new file - diff --git a/crypto/heimdal/appl/push/Makefile.am b/crypto/heimdal/appl/push/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/push/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += $(INCLUDE_hesiod) - -bin_SCRIPTS = pfrom - -libexec_PROGRAMS = push - -push_SOURCES = push.c push_locl.h - -pfrom: pfrom.in - sed -e "s!%libexecdir%!$(libexecdir)!" $(srcdir)/pfrom.in > $@ - chmod +x $@ - -man_MANS = push.8 pfrom.1 - -CLEANFILES = pfrom - -EXTRA_DIST = NTMakefile pfrom.in $(man_MANS) - -LDADD = $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_roken) \ - $(LIB_hesiod) diff --git a/crypto/heimdal/appl/push/Makefile.in b/crypto/heimdal/appl/push/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/push/Makefile.in +++ /dev/null @@ -1,1038 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -libexec_PROGRAMS = push$(EXEEXT) -subdir = appl/push -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" -PROGRAMS = $(libexec_PROGRAMS) -am_push_OBJECTS = push.$(OBJEXT) -push_OBJECTS = $(am_push_OBJECTS) -push_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -push_DEPENDENCIES = $(LIB_krb5) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -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' -SCRIPTS = $(bin_SCRIPTS) -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 = $(push_SOURCES) -DIST_SOURCES = $(push_SOURCES) -man1dir = $(mandir)/man1 -man8dir = $(mandir)/man8 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_hesiod) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -bin_SCRIPTS = pfrom -push_SOURCES = push.c push_locl.h -man_MANS = push.8 pfrom.1 -CLEANFILES = pfrom -EXTRA_DIST = NTMakefile pfrom.in $(man_MANS) -LDADD = $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_roken) \ - $(LIB_hesiod) - -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/push/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/push/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-libexecPROGRAMS: $(libexec_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ - 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)$(libexecdir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-libexecPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || 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)$(libexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libexecdir)" && rm -f $$files - -clean-libexecPROGRAMS: - @list='$(libexec_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 -push$(EXEEXT): $(push_OBJECTS) $(push_DEPENDENCIES) - @rm -f push$(EXEEXT) - $(LINK) $(push_OBJECTS) $(push_LDADD) $(LIBS) -install-binSCRIPTS: $(bin_SCRIPTS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || 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"; 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)'`; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/push.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 -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ - } | 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } -install-man8: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | 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,^[^8][0-9a-z]*$$,8,;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)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$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)$(man8dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ - done; } - -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man8dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(SCRIPTS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)"; 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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -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-libexecPROGRAMS 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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binSCRIPTS install-libexecPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man1 install-man8 - -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-binSCRIPTS uninstall-libexecPROGRAMS \ - uninstall-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man1 uninstall-man8 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libexecPROGRAMS clean-libtool ctags \ - dist-hook distclean distclean-compile distclean-generic \ - distclean-libtool distclean-tags distdir dvi dvi-am html \ - html-am info info-am install install-am install-binSCRIPTS \ - install-data install-data-am install-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ - install-libexecPROGRAMS install-man install-man1 install-man8 \ - 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-binSCRIPTS uninstall-hook uninstall-libexecPROGRAMS \ - uninstall-man uninstall-man1 uninstall-man8 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -pfrom: pfrom.in - sed -e "s!%libexecdir%!$(libexecdir)!" $(srcdir)/pfrom.in > $@ - chmod +x $@ - -# 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: diff --git a/crypto/heimdal/appl/push/pfrom.1 b/crypto/heimdal/appl/push/pfrom.1 deleted file mode 100644 --- a/crypto/heimdal/appl/push/pfrom.1 +++ /dev/null @@ -1,55 +0,0 @@ -.\" Copyright (c) 2000 - 2002 Kungliga Tekniska Högskolan -.\" (Royal Institute of Technology, Stockholm, Sweden). -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" 3. Neither the name of the Institute nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $Id$ -.\" -.Dd March 4, 2000 -.Dt PFROM 1 -.Os HEIMDAL -.Sh NAME -.Nm pfrom -.Nd "fetch a list of the current mail via POP" -.Sh SYNOPSIS -.Nm -.Op Fl 4 | Fl Fl krb4 -.Op Fl 5 | Fl Fl krb5 -.Op Fl v | Fl Fl verbose -.Op Fl c | -count -.Op Fl Fl header -.Oo Fl p Ar port-spec \*(Ba Xo -.Fl Fl port= Ns Ar port-spec -.Xc -.Oc -.Sh DESCRIPTION -.Nm -is a script that does push --from. -.Sh SEE ALSO -.Xr push 8 diff --git a/crypto/heimdal/appl/push/pfrom.in b/crypto/heimdal/appl/push/pfrom.in deleted file mode 100644 --- a/crypto/heimdal/appl/push/pfrom.in +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh -# $Id$ -libexecdir=%libexecdir% -PATH=$libexecdir:$PATH -export PATH -push --from $* diff --git a/crypto/heimdal/appl/push/push.8 b/crypto/heimdal/appl/push/push.8 deleted file mode 100644 --- a/crypto/heimdal/appl/push/push.8 +++ /dev/null @@ -1,132 +0,0 @@ -.\" $Id$ -.\" -.Dd May 31, 1998 -.Dt PUSH 8 -.Os HEIMDAL -.Sh NAME -.Nm push -.Nd fetch mail via POP -.Sh SYNOPSIS -.Nm -.Op Fl 5 | Fl Fl krb5 -.Op Fl v | Fl Fl verbose -.Op Fl f | Fl Fl fork -.Op Fl l | -leave -.Op Fl Fl from -.Op Fl c | -count -.Op Fl Fl headers Ns = Ns Ar headers -.Oo Fl p Ar port-spec \*(Ba Xo -.Fl Fl port Ns = Ns Ar port-spec -.Xc -.Oc -.Ar po-box -.Pa filename -.Sh DESCRIPTION -.Nm -retrieves mail from the post office box -.Ar po-box , -and stores the mail in mbox format in -.Pa filename . -The -.Ar po-box -can have any of the following formats: -.Bl -hang -compact -offset indent -.It Ql hostname:username -.It Ql po:hostname:username -.It Ql username@hostname -.It Ql po:username@hostname -.It Ql hostname -.It Ql po:username -.El -.Pp -If no username is specified, -.Nm -assumes that it's the same as on the local machine; -.Ar hostname -defaults to the value of the -.Ev MAILHOST -environment variable. -.Pp -Supported options: -.Bl -tag -width Ds -.It Xo -.Fl 5 , -.Fl Fl krb5 -.Xc -use Kerberos 5 (if compiled with support for Kerberos 5) -.It Xo -.Fl f , -.Fl Fl fork -.Xc -fork before starting to delete messages -.It Xo -.Fl l , -.Fl Fl leave -.Xc -don't delete fetched mail -.It Xo -.Fl Fl from -.Xc -behave like from. -.It Xo -.Fl c , -.Fl Fl count -.Xc -first print how many messages and bytes there are. -.It Xo -.Fl Fl headers Ns = Ns Ar headers -.Xc -a list of comma-separated headers that should get printed. -.It Xo -.Fl p Ar port-spec , -.Fl Fl port Ns = Ns Ar port-spec -.Xc -use this port instead of the default -.Ql kpop -or -.Ql 1109 . -.El -.Pp -The default is to first try Kerberos 5 authentication and then, if -that fails, Kerberos 4. -.Sh ENVIRONMENT -.Bl -tag -width Ds -.It Ev MAILHOST -points to the post office, if no other hostname is specified. -.El -.\".Sh FILES -.Sh EXAMPLES -.Bd -literal -offset indent -$ push cornfield:roosta ~/.emacs-mail-crash-box -.Ed -.Pp -tries to fetch mail for the user -.Ar roosta -from the post office at -.Dq cornfield , -and stores the mail in -.Pa ~/.emacs-mail-crash-box -(you are using Gnus, aren't you?) -.Bd -literal -offset indent -$ push --from -5 havregryn -.Ed -.Pp -tries to fetch -.Sy From: -lines for current user at post office -.Dq havregryn -using Kerberos 5. -.\".Sh DIAGNOSTICS -.Sh SEE ALSO -.Xr from 1 , -.Xr pfrom 1 , -.Xr movemail 8 , -.Xr popper 8 -.\".Sh STANDARDS -.Sh HISTORY -.Nm -was written while waiting for -.Nm movemail -to finish getting the mail. -.\".Sh AUTHORS -.\".Sh BUGS diff --git a/crypto/heimdal/appl/push/push.c b/crypto/heimdal/appl/push/push.c deleted file mode 100644 --- a/crypto/heimdal/appl/push/push.c +++ /dev/null @@ -1,785 +0,0 @@ -/* - * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "push_locl.h" -RCSID("$Id$"); - -#if defined(_AIX) && defined(STAT) -/* - * AIX defines STAT to 1 in sys/dir.h - */ -# undef STAT -#endif - -#ifdef KRB5 -static int use_v5 = -1; -static krb5_context context; -#endif - -static char *port_str; -static int verbose_level; -static int do_fork; -static int do_leave; -static int do_version; -static int do_help; -static int do_from; -static int do_count; -static char *header_str; - -struct getargs args[] = { -#ifdef KRB5 - { "krb5", '5', arg_flag, &use_v5, "Use Kerberos V5", - NULL }, -#endif - { "verbose",'v', arg_counter, &verbose_level, "Verbose", - NULL }, - { "fork", 'f', arg_flag, &do_fork, "Fork deleting proc", - NULL }, - { "leave", 'l', arg_flag, &do_leave, "Leave mail on server", - NULL }, - { "port", 'p', arg_string, &port_str, "Use this port", - "number-or-service" }, - { "from", 0, arg_flag, &do_from, "Behave like from", - NULL }, - { "headers", 0, arg_string, &header_str, "Headers to print", NULL }, - { "count", 'c', arg_flag, &do_count, "Print number of messages", NULL}, - { "version", 0, arg_flag, &do_version, "Print version", - NULL }, - { "help", 0, arg_flag, &do_help, NULL, - NULL } - -}; - -static void -usage (int ret) -{ - arg_printusage (args, - sizeof(args) / sizeof(args[0]), - NULL, - "[[{po:username[@hostname] | hostname[:username]}] ...] " - "filename"); - exit (ret); -} - -static int -do_connect (const char *hostname, int port, int nodelay) -{ - struct addrinfo *ai, *a; - struct addrinfo hints; - int error; - int s = -1; - char portstr[NI_MAXSERV]; - - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - - snprintf (portstr, sizeof(portstr), "%u", ntohs(port)); - - error = getaddrinfo (hostname, portstr, &hints, &ai); - if (error) - errx (1, "getaddrinfo(%s): %s", hostname, gai_strerror(error)); - - for (a = ai; a != NULL; a = a->ai_next) { - s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); - if (s < 0) - continue; - if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { - warn ("connect(%s)", hostname); - close (s); - continue; - } - break; - } - freeaddrinfo (ai); - if (a == NULL) { - warnx ("failed to contact %s", hostname); - return -1; - } - - if(setsockopt(s, IPPROTO_TCP, TCP_NODELAY, - (void *)&nodelay, sizeof(nodelay)) < 0) - err (1, "setsockopt TCP_NODELAY"); - return s; -} - -typedef enum { INIT = 0, GREET, USER, PASS, STAT, RETR, TOP, - DELE, XDELE, QUIT} pop_state; - -static char *pop_state_string[] = { - "INIT", "GREET", "USER", "PASS", "STAT", "RETR", "TOP", - "DELE", "XDELE", "QUIT" -}; - -#define PUSH_BUFSIZ 65536 - -#define STEP 16 - -struct write_state { - struct iovec *iovecs; - size_t niovecs, maxiovecs, allociovecs; - int fd; -}; - -static void -write_state_init (struct write_state *w, int fd) -{ -#ifdef UIO_MAXIOV - w->maxiovecs = UIO_MAXIOV; -#else - w->maxiovecs = 16; -#endif - w->allociovecs = min(STEP, w->maxiovecs); - w->niovecs = 0; - w->iovecs = emalloc(w->allociovecs * sizeof(*w->iovecs)); - w->fd = fd; -} - -static void -write_state_add (struct write_state *w, void *v, size_t len) -{ - if(w->niovecs == w->allociovecs) { - if(w->niovecs == w->maxiovecs) { - if(writev (w->fd, w->iovecs, w->niovecs) < 0) - err(1, "writev"); - w->niovecs = 0; - } else { - w->allociovecs = min(w->allociovecs + STEP, w->maxiovecs); - w->iovecs = erealloc (w->iovecs, - w->allociovecs * sizeof(*w->iovecs)); - } - } - w->iovecs[w->niovecs].iov_base = v; - w->iovecs[w->niovecs].iov_len = len; - ++w->niovecs; -} - -static void -write_state_flush (struct write_state *w) -{ - if (w->niovecs) { - if (writev (w->fd, w->iovecs, w->niovecs) < 0) - err (1, "writev"); - w->niovecs = 0; - } -} - -static void -write_state_destroy (struct write_state *w) -{ - free (w->iovecs); -} - -static int -doit(int s, - const char *host, - const char *user, - const char *outfilename, - const char *header_str, - int leavep, - int verbose, - int forkp) -{ - int ret; - char out_buf[PUSH_BUFSIZ]; - int out_len = 0; - char *in_buf; - size_t in_buf_size; - size_t in_len = 0; - char *in_ptr; - pop_state state = INIT; - unsigned count = 0, bytes; - unsigned asked_for = 0, retrieved = 0, asked_deleted = 0, deleted = 0; - unsigned sent_xdele = 0; - int out_fd; - char from_line[128]; - size_t from_line_length; - time_t now; - struct write_state write_state; - unsigned int numheaders = 1; - char **headers = NULL; - int i; - char *tmp = NULL; - - in_buf = emalloc(PUSH_BUFSIZ + 1); - in_ptr = in_buf; - in_buf_size = PUSH_BUFSIZ; - - if (do_from) { - char *tmp2; - - tmp2 = tmp = estrdup(header_str); - - out_fd = -1; - if (verbose) - fprintf (stderr, "%s@%s\n", user, host); - while (*tmp != '\0') { - tmp = strchr(tmp, ','); - if (tmp == NULL) - break; - tmp++; - numheaders++; - } - - headers = emalloc(sizeof(char *) * (numheaders + 1)); - for (i = 0; i < numheaders; i++) { - headers[i] = strtok_r(tmp2, ",", &tmp2); - } - headers[numheaders] = NULL; - } else { - out_fd = open(outfilename, O_WRONLY | O_APPEND | O_CREAT, 0666); - if (out_fd < 0) - err (1, "open %s", outfilename); - if (verbose) - fprintf (stderr, "%s@%s -> %s\n", user, host, outfilename); - } - - now = time(NULL); - from_line_length = snprintf (from_line, sizeof(from_line), - "From %s %s", "push", ctime(&now)); - if (from_line_length < 0 || from_line_length > sizeof(from_line)) - errx (1, "snprintf failed"); - - out_len = snprintf (out_buf, sizeof(out_buf), - "USER %s\r\nPASS hej\r\nSTAT\r\n", - user); - if (out_len < 0 || out_len > sizeof(out_buf)) - errx (1, "snprintf failed"); - if (net_write (s, out_buf, out_len) != out_len) - err (1, "write"); - if (verbose > 1) - fprintf (stderr, "%s", out_buf); - - if (!do_from) - write_state_init (&write_state, out_fd); - - while(state != QUIT) { - fd_set readset, writeset; - - FD_ZERO(&readset); - FD_ZERO(&writeset); - if (s >= FD_SETSIZE) - errx (1, "fd too large"); - FD_SET(s,&readset); - - if (verbose > 1) - fprintf (stderr, "state: %s count: %d asked_for: %d " - "retrieved: %d asked_deleted: %d\n", - pop_state_string[state], - count, asked_for, retrieved, asked_deleted); - - if (((state == STAT || state == RETR || state == TOP) - && asked_for < count) - || (state == XDELE && !sent_xdele) - || (state == DELE && asked_deleted < count)) - FD_SET(s,&writeset); - ret = select (s + 1, &readset, &writeset, NULL, NULL); - if (ret < 0) { - if (errno == EAGAIN) - continue; - else - err (1, "select"); - } - - if (FD_ISSET(s, &readset)) { - char *beg, *p; - size_t rem; - int blank_line = 0; - - if(in_len >= in_buf_size) { - char *tmp = erealloc(in_buf, in_buf_size + PUSH_BUFSIZ + 1); - in_ptr = tmp + (in_ptr - in_buf); - in_buf = tmp; - in_buf_size += PUSH_BUFSIZ; - } - - ret = read (s, in_ptr, in_buf_size - in_len); - if (ret < 0) - err (1, "read"); - else if (ret == 0) - errx (1, "EOF during read"); - - in_len += ret; - in_ptr += ret; - *in_ptr = '\0'; - - beg = in_buf; - rem = in_len; - while(rem > 1 - && (p = strstr(beg, "\r\n")) != NULL) { - if (state == TOP) { - char *copy = beg; - - for (i = 0; i < numheaders; i++) { - size_t len; - - len = min(p - copy + 1, strlen(headers[i])); - if (strncasecmp(copy, headers[i], len) == 0) { - fprintf (stdout, "%.*s\n", (int)(p - copy), copy); - } - } - if (beg[0] == '.' && beg[1] == '\r' && beg[2] == '\n') { - if (numheaders > 1) - fprintf (stdout, "\n"); - state = STAT; - if (++retrieved == count) { - state = QUIT; - net_write (s, "QUIT\r\n", 6); - if (verbose > 1) - fprintf (stderr, "QUIT\r\n"); - } - } - rem -= p - beg + 2; - beg = p + 2; - } else if (state == RETR) { - char *copy = beg; - if (beg[0] == '.') { - if (beg[1] == '\r' && beg[2] == '\n') { - if(!blank_line) - write_state_add(&write_state, "\n", 1); - state = STAT; - rem -= p - beg + 2; - beg = p + 2; - if (++retrieved == count) { - write_state_flush (&write_state); - if (fsync (out_fd) < 0) - err (1, "fsync"); - close(out_fd); - if (leavep) { - state = QUIT; - net_write (s, "QUIT\r\n", 6); - if (verbose > 1) - fprintf (stderr, "QUIT\r\n"); - } else { - if (forkp) { - pid_t pid; - - pid = fork(); - if (pid < 0) - warn ("fork"); - else if(pid != 0) { - if(verbose) - fprintf (stderr, - "(exiting)"); - return 0; - } - } - - state = XDELE; - if (verbose) - fprintf (stderr, "deleting... "); - } - } - continue; - } else - ++copy; - } - *p = '\n'; - if(blank_line && - strncmp(copy, "From ", min(p - copy + 1, 5)) == 0) - write_state_add(&write_state, ">", 1); - write_state_add(&write_state, copy, p - copy + 1); - blank_line = (*copy == '\n'); - rem -= p - beg + 2; - beg = p + 2; - } else if (rem >= 3 && strncmp (beg, "+OK", 3) == 0) { - if (state == STAT) { - if (!do_from) - write_state_add(&write_state, - from_line, from_line_length); - blank_line = 0; - if (do_from) - state = TOP; - else - state = RETR; - } else if (state == XDELE) { - state = QUIT; - net_write (s, "QUIT\r\n", 6); - if (verbose > 1) - fprintf (stderr, "QUIT\r\n"); - break; - } else if (state == DELE) { - if (++deleted == count) { - state = QUIT; - net_write (s, "QUIT\r\n", 6); - if (verbose > 1) - fprintf (stderr, "QUIT\r\n"); - break; - } - } else if (++state == STAT) { - if(sscanf (beg + 4, "%u %u", &count, &bytes) != 2) - errx(1, "Bad STAT-line: %.*s", (int)(p - beg), beg); - if (verbose) { - fprintf (stderr, "%u message(s) (%u bytes). " - "fetching... ", - count, bytes); - if (do_from) - fprintf (stderr, "\n"); - } else if (do_count) { - fprintf (stderr, "%u message(s) (%u bytes).\n", - count, bytes); - } - if (count == 0) { - state = QUIT; - net_write (s, "QUIT\r\n", 6); - if (verbose > 1) - fprintf (stderr, "QUIT\r\n"); - break; - } - } - - rem -= p - beg + 2; - beg = p + 2; - } else { - if(state == XDELE) { - state = DELE; - rem -= p - beg + 2; - beg = p + 2; - } else - errx (1, "Bad response: %.*s", (int)(p - beg), beg); - } - } - if (!do_from) - write_state_flush (&write_state); - - memmove (in_buf, beg, rem); - in_len = rem; - in_ptr = in_buf + rem; - } - if (FD_ISSET(s, &writeset)) { - if ((state == STAT && !do_from) || state == RETR) - out_len = snprintf (out_buf, sizeof(out_buf), - "RETR %u\r\n", ++asked_for); - else if ((state == STAT && do_from) || state == TOP) - out_len = snprintf (out_buf, sizeof(out_buf), - "TOP %u 0\r\n", ++asked_for); - else if(state == XDELE) { - out_len = snprintf(out_buf, sizeof(out_buf), - "XDELE %u %u\r\n", 1, count); - sent_xdele++; - } - else if(state == DELE) - out_len = snprintf (out_buf, sizeof(out_buf), - "DELE %u\r\n", ++asked_deleted); - if (out_len < 0 || out_len > sizeof(out_buf)) - errx (1, "snprintf failed"); - if (net_write (s, out_buf, out_len) != out_len) - err (1, "write"); - if (verbose > 1) - fprintf (stderr, "%s", out_buf); - } - } - if (verbose) - fprintf (stderr, "Done\n"); - if (do_from) { - free (tmp); - free (headers); - } else { - write_state_destroy (&write_state); - } - return 0; -} - -#ifdef KRB5 -static int -do_v5 (const char *host, - int port, - const char *user, - const char *filename, - const char *header_str, - int leavep, - int verbose, - int forkp) -{ - krb5_error_code ret; - krb5_auth_context auth_context = NULL; - krb5_principal server; - int s; - - s = do_connect (host, port, 1); - if (s < 0) - return 1; - - ret = krb5_sname_to_principal (context, - host, - "pop", - KRB5_NT_SRV_HST, - &server); - if (ret) { - warnx ("krb5_sname_to_principal: %s", - krb5_get_err_text (context, ret)); - return 1; - } - - ret = krb5_sendauth (context, - &auth_context, - &s, - "KPOPV1.0", - NULL, - server, - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); - krb5_free_principal (context, server); - if (ret) { - warnx ("krb5_sendauth: %s", - krb5_get_err_text (context, ret)); - return 1; - } - return doit (s, host, user, filename, header_str, leavep, verbose, forkp); -} -#endif - -#ifdef HESIOD - -#ifdef HESIOD_INTERFACES - -static char * -hesiod_get_pobox (const char **user) -{ - void *context; - struct hesiod_postoffice *hpo; - char *ret = NULL; - - if(hesiod_init (&context) != 0) - err (1, "hesiod_init"); - - hpo = hesiod_getmailhost (context, *user); - if (hpo == NULL) { - warn ("hesiod_getmailhost %s", *user); - } else { - if (strcasecmp(hpo->hesiod_po_type, "pop") != 0) - errx (1, "Unsupported po type %s", hpo->hesiod_po_type); - - ret = estrdup(hpo->hesiod_po_host); - *user = estrdup(hpo->hesiod_po_name); - hesiod_free_postoffice (context, hpo); - } - hesiod_end (context); - return ret; -} - -#else /* !HESIOD_INTERFACES */ - -static char * -hesiod_get_pobox (const char **user) -{ - char *ret = NULL; - struct hes_postoffice *hpo; - - hpo = hes_getmailhost (*user); - if (hpo == NULL) { - warn ("hes_getmailhost %s", *user); - } else { - if (strcasecmp(hpo->po_type, "pop") != 0) - errx (1, "Unsupported po type %s", hpo->po_type); - - ret = estrdup(hpo->po_host); - *user = estrdup(hpo->po_name); - } - return ret; -} - -#endif /* HESIOD_INTERFACES */ - -#endif /* HESIOD */ - -static char * -get_pobox (const char **user) -{ - char *ret = NULL; - -#ifdef HESIOD - ret = hesiod_get_pobox (user); -#endif - - if (ret == NULL) - ret = getenv("MAILHOST"); - if (ret == NULL) - errx (1, "MAILHOST not set"); - return ret; -} - -static void -parse_pobox (char *a0, const char **host, const char **user) -{ - const char *h, *u; - char *p; - int po = 0; - - if (a0 == NULL) { - - *user = getenv ("USERNAME"); - if (*user == NULL) { - struct passwd *pwd = getpwuid (getuid ()); - - if (pwd == NULL) - errx (1, "Who are you?"); - *user = estrdup (pwd->pw_name); - } - *host = get_pobox (user); - return; - } - - /* if the specification starts with po:, remember this information */ - if(strncmp(a0, "po:", 3) == 0) { - a0 += 3; - po++; - } - /* if there is an `@', the hostname is after it, otherwise at the - beginning of the string */ - p = strchr(a0, '@'); - if(p != NULL) { - *p++ = '\0'; - h = p; - } else { - h = a0; - } - /* if there is a `:', the username comes before it, otherwise at - the beginning of the string */ - p = strchr(a0, ':'); - if(p != NULL) { - *p++ = '\0'; - u = p; - } else { - u = a0; - } - if(h == u) { - /* some inconsistent compatibility with various mailers */ - if(po) { - h = get_pobox (&u); - } else { - u = get_default_username (); - if (u == NULL) - errx (1, "Who are you?"); - } - } - *host = h; - *user = u; -} - -int -main(int argc, char **argv) -{ - int port = 0; - int optind = 0; - int ret = 1; - const char *host, *user, *filename = NULL; - char *pobox = NULL; - - setprogname (argv[0]); - -#ifdef KRB5 - { - krb5_error_code ret; - - ret = krb5_init_context (&context); - if (ret) - errx (1, "krb5_init_context failed: %d", ret); - } -#endif - - if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, - &optind)) - usage (1); - - argc -= optind; - argv += optind; - - if (do_help) - usage (0); - - if (do_version) { - print_version(NULL); - return 0; - } - - if (do_from && header_str == NULL) - header_str = "From:"; - else if (header_str != NULL) - do_from = 1; - - if (do_from) { - if (argc == 0) - pobox = NULL; - else if (argc == 1) - pobox = argv[0]; - else - usage (1); - } else { - if (argc == 1) { - filename = argv[0]; - pobox = NULL; - } else if (argc == 2) { - filename = argv[1]; - pobox = argv[0]; - } else - usage (1); - } - - if (port_str) { - struct servent *s = roken_getservbyname (port_str, "tcp"); - - if (s) - port = s->s_port; - else { - char *ptr; - - port = strtol (port_str, &ptr, 10); - if (port == 0 && ptr == port_str) - errx (1, "Bad port `%s'", port_str); - port = htons(port); - } - } - if (port == 0) { -#ifdef KRB5 - port = krb5_getportbyname (context, "kpop", "tcp", 1109); -#else -#error must define KRB5 -#endif - } - - parse_pobox (pobox, &host, &user); - -#ifdef KRB5 - if (ret && use_v5) { - ret = do_v5 (host, port, user, filename, header_str, - do_leave, verbose_level, do_fork); - } -#endif - return ret; -} diff --git a/crypto/heimdal/appl/push/push_locl.h b/crypto/heimdal/appl/push/push_locl.h deleted file mode 100644 --- a/crypto/heimdal/appl/push/push_locl.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 1997, 1998 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_ERRNO_H -#include -#endif -#include -#include -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SELECT_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SYS_UIO_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_NETINET6_IN6_H -#include -#endif -#ifdef HAVE_NETINET_TCP_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_PWD_H -#include -#endif -#ifdef HESIOD -#include -#endif - -#include -#include -#include -#ifdef KRB5 -#include -#endif diff --git a/crypto/heimdal/appl/rcp/ChangeLog b/crypto/heimdal/appl/rcp/ChangeLog deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/ChangeLog +++ /dev/null @@ -1,130 +0,0 @@ -2008-04-17 Love Hörnquist Åstrand - - * Sync with NetBSD rcp, add v6 parsing support and no setuid code - at all. - -2007-12-13 Love Hörnquist Åstrand - - * Makefile.am: Add missing files, from Buchan Milne. - -2006-10-20 Love Hörnquist Åstrand - - * Makefile.am: more files - -2006-08-08 Love Hörnquist Åstrand - - * util.c: Check return values from setuid, prompted by MIT - advisory. Thanks to Tom Yu at MIT, and Michael Calmer and Marcus - Meissner at SUSE. Either of CVE-2006-3083 or CVE-2006-3084. - - * rcp.c: Check return values from setuid, prompted by MIT - advisory. Thanks to Tom Yu at MIT, and Michael Calmer and Marcus - Meissner at SUSE. Either of CVE-2006-3083 or CVE-2006-3084. - - * rcp.c: Check return values from seteuid, prompted by MIT - advisory. Thanks to Tom Yu at MIT, and Michael Calmer and Marcus - Meissner at SUSE. Either of CVE-2006-3083 or CVE-2006-3084. - -2005-10-22 Love Hörnquist Åstrand - - * rcp.c: Check return value from asprintf instead of string != - NULL since it undefined behavior on Linux. From Björn Sandell - -2005-08-30 Love Hörnquist Åstrand - - * util.c: Explicit typecast to avoid signess warning. - -2005-05-29 Love Hörnquist Åstrand - - * rcp_locl.h: undef _PATH_RSH to make sure our version is used - -2005-05-11 David Love - - * rcp.c: MODEMASK is defined in sys/vnode.h on Solaris, so undef - it before we define our own. - -2005-04-27 Love Hörnquist Åstrand - - * rcp_locl.h: use BINDIR instead of "/usr/bin/ with _PATH_RSH - -2005-04-18 Love Hörnquist Åstrand - - * util.c: use unsigned char * to make sure its not negative when - passing it to is* functions - -2004-05-14 Johan Danielsson - - * rcp.c: add -e (passed to rsh) - -2003-04-16 Johan Danielsson - - * rcp.1: add a HISTORY section - - * rcp.1: brief manpage - - * rcp.c: add a -4 option - -2001-09-24 Johan Danielsson - - * rcp.c: more va_* fixing; from Thomas Klausner - -2001-09-08 Assar Westerlund - - * rcp.c (run_err): always match va_start and va_end - -2001-09-04 Assar Westerlund - - * util.c (allocbuf): do not leak memory on failure and zero - re-used memory, from Markus Friedl - -2001-07-19 Assar Westerlund - - * rcp.c (main): add missing setprogname - -2001-06-14 Assar Westerlund - - * rcp.c: add some const replace a few malloc/snprintf with - asprintf - * rcp.c (sizestr): remove and use snprintf to do this correctly - instead - -2001-04-21 Johan Danielsson - - * rcp.c: convert to use getarg - - * rcp.c: do a better job of supporting files larger than 2GB - -2001-02-07 Assar Westerlund - - * rcp.c: add -F for forwarding ticket, from Ake Sandgren - - -2001-01-29 Assar Westerlund - - * util.c (roundup): add fallback definition - - * rcp.c: remove non-STDC code - * rcp_locl.h: add sys/types.h and sys/wait.h - - * rcp.c: no calls to err with NULL - -2001-01-28 Assar Westerlund - - * rcp_locl.h: add - - * Makefile.am (LDADD): remove unused libraries - -2001-01-27 Assar Westerlund - - * util.c: replace vfork by fork - - * rcp.c: add RCSID S_ISTXT -> S_ISVTX printf sizes of files with - %lu instead of %q (which is not portable) - - * util.c: add RCSID do not use sig_t - * rcp.c: remove __P, use st_mtime et al from struct stat - * extern.h: remove __P - - * initial import of port of bsd rcp changed to use existing rsh, - contributed by Richard Nyberg - diff --git a/crypto/heimdal/appl/rcp/Makefile.am b/crypto/heimdal/appl/rcp/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += $(INCLUDE_krb4) - -bin_PROGRAMS = rcp - -rcp_SOURCES = rcp.c util.c rcp_locl.h extern.h - -man_MANS = rcp.1 - -EXTRA_DIST = NTMakefile $(man_MANS) - -LDADD = $(LIB_roken) diff --git a/crypto/heimdal/appl/rcp/Makefile.in b/crypto/heimdal/appl/rcp/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/Makefile.in +++ /dev/null @@ -1,948 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -bin_PROGRAMS = rcp$(EXEEXT) -subdir = appl/rcp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -PROGRAMS = $(bin_PROGRAMS) -am_rcp_OBJECTS = rcp.$(OBJEXT) util.$(OBJEXT) -rcp_OBJECTS = $(am_rcp_OBJECTS) -rcp_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -rcp_DEPENDENCIES = $(am__DEPENDENCIES_1) -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 = $(rcp_SOURCES) -DIST_SOURCES = $(rcp_SOURCES) -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' -man1dir = $(mandir)/man1 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_krb4) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -rcp_SOURCES = rcp.c util.c rcp_locl.h extern.h -man_MANS = rcp.1 -EXTRA_DIST = NTMakefile $(man_MANS) -LDADD = $(LIB_roken) -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/rcp/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/rcp/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) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - 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 -rcp$(EXEEXT): $(rcp_OBJECTS) $(rcp_DEPENDENCIES) - @rm -f rcp$(EXEEXT) - $(LINK) $(rcp_OBJECTS) $(rcp_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rcp.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.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 -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ - } | 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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 -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man1 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libtool ctags \ - dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - 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-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-hook \ - uninstall-man uninstall-man1 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/appl/rcp/extern.h b/crypto/heimdal/appl/rcp/extern.h deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/extern.h +++ /dev/null @@ -1,52 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)extern.h 8.1 (Berkeley) 5/31/93 - * $FreeBSD$ - */ - -typedef struct { - int cnt; - char *buf; -} BUF; - -extern int iamremote; - -BUF *allocbuf (BUF *, int, int); -char *colon (char *); -char *unbracket(char *); -void lostconn (int); -void nospace (void); -int okname (char *); -void run_err (const char *, ...); -int susystem (char *); -void verifydir (char *); diff --git a/crypto/heimdal/appl/rcp/rcp.1 b/crypto/heimdal/appl/rcp/rcp.1 deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/rcp.1 +++ /dev/null @@ -1,66 +0,0 @@ -.\" $Id$ -.\" -.Dd April 16, 2003 -.Dt RCP 1 -.Os HEIMDAL -.Sh NAME -.Nm rcp -.Nd copy file to and from remote machines -.Sh SYNOPSIS -.Nm rcp -.Op Fl 45FKpxz -.Op Fl P Ar port -.Ar file1 file2 -.Nm rcp -.Op Fl 45FKprxz -.Op Fl P Ar port -.Ar file... directory -.Sh DESCRIPTION -.Nm rcp -copies files between machines. Each file argument is either a remote file name of the form -.Dq rname@rhost:path -or a local file (containing no colon or with a slash before the first -colon). -.Pp -Supported options: -.Bl -tag -width Ds -.It Xo -.Fl 4 , -.Fl 5 , -.Fl K , -.Fl F , -.Fl x , -.Fl z -.Xc -These options are passed on to -.Xr rsh 1 . -.It Fl P Ar port -This will pass the option -.Fl p Ar port -to -.Xr rsh 1 . -.It Fl p -Preserve file permissions. -.It Fl r -Copy source directories recursively. -.El -.\".Sh ENVIRONMENT -.\".Sh FILES -.\".Sh EXAMPLES -.Sh DIAGNOSTICS -.Nm rcp -is implemented as a protocol on top of -.Xr rsh 1 , -and thus requires a working rsh. If you intend to use Kerberos -authentication, rsh needs to be Kerberos aware, else you may see more -or less strange errors, such as "login incorrect", or "lost -connection". -.\".Sh SEE ALSO -.\".Sh STANDARDS -.Sh HISTORY -The -.Nm rcp -utility first appeared in 4.2BSD. This version is derived from -4.3BSD-Reno. -.\".Sh AUTHORS -.\".Sh BUGS diff --git a/crypto/heimdal/appl/rcp/rcp.c b/crypto/heimdal/appl/rcp/rcp.c deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/rcp.c +++ /dev/null @@ -1,789 +0,0 @@ -/* - * Copyright (c) 1983, 1990, 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "rcp_locl.h" -#include - -#define RSH_PROGRAM "rsh" - -struct passwd *pwd; -uid_t userid; -int errs, remin, remout; -int pflag, iamremote, iamrecursive, targetshouldbedirectory; -int doencrypt, noencrypt; -int usebroken, usekrb4, usekrb5, forwardtkt; -char *port; -int eflag = 0; - -#define CMDNEEDS 64 -char cmd[CMDNEEDS]; /* must hold "rcp -r -p -d\0" */ - -int response (void); -void rsource (char *, struct stat *); -void sink (int, char *[]); -void source (int, char *[]); -void tolocal (int, char *[]); -void toremote (char *, int, char *[]); - -int do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout); - -static int fflag, tflag; - -static int version_flag, help_flag; - -struct getargs args[] = { - { NULL, '4', arg_flag, &usekrb4, "use Kerberos 4 authentication" }, - { NULL, '5', arg_flag, &usekrb5, "use Kerberos 5 authentication" }, - { NULL, 'F', arg_flag, &forwardtkt, "forward credentials" }, - { NULL, 'K', arg_flag, &usebroken, "use BSD authentication" }, - { NULL, 'P', arg_string, &port, "non-default port", "port" }, - { NULL, 'p', arg_flag, &pflag, "preserve file permissions" }, - { NULL, 'r', arg_flag, &iamrecursive, "recursive mode" }, - { NULL, 'x', arg_flag, &doencrypt, "use encryption" }, - { NULL, 'z', arg_flag, &noencrypt, "don't encrypt" }, - { NULL, 'd', arg_flag, &targetshouldbedirectory }, - { NULL, 'e', arg_flag, &eflag, "passed to rsh" }, - { NULL, 'f', arg_flag, &fflag }, - { NULL, 't', arg_flag, &tflag }, - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } -}; - -static void -usage (int ret) -{ - arg_printusage (args, - sizeof(args) / sizeof(args[0]), - NULL, - "file1 file2|file... directory"); - exit (ret); -} - -int -main(int argc, char **argv) -{ - char *targ; - int optind = 0; - - setprogname(argv[0]); - if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, - &optind)) - usage (1); - if(help_flag) - usage(0); - if (version_flag) { - print_version (NULL); - return 0; - } - - iamremote = (fflag || tflag); - - argc -= optind; - argv += optind; - - if ((pwd = getpwuid(userid = getuid())) == NULL) - errx(1, "unknown user %d", (int)userid); - - remin = STDIN_FILENO; /* XXX */ - remout = STDOUT_FILENO; - - if (fflag) { /* Follow "protocol", send data. */ - (void)response(); - source(argc, argv); - exit(errs); - } - - if (tflag) { /* Receive data. */ - sink(argc, argv); - exit(errs); - } - - if (argc < 2) - usage(1); - if (argc > 2) - targetshouldbedirectory = 1; - - remin = remout = -1; - /* Command to be executed on remote system using "rsh". */ - snprintf(cmd, sizeof(cmd), - "rcp%s%s%s", iamrecursive ? " -r" : "", - pflag ? " -p" : "", targetshouldbedirectory ? " -d" : ""); - - signal(SIGPIPE, lostconn); - - if ((targ = colon(argv[argc - 1]))) /* Dest is remote host. */ - toremote(targ, argc, argv); - else { - tolocal(argc, argv); /* Dest is local host. */ - if (targetshouldbedirectory) - verifydir(argv[argc - 1]); - } - exit(errs); -} - -void -toremote(char *targ, int argc, char **argv) -{ - int i; - char *bp, *host, *src, *suser, *thost, *tuser; - - *targ++ = 0; - if (*targ == 0) - targ = "."; - - if ((thost = strchr(argv[argc - 1], '@')) != NULL) { - /* user@host */ - *thost++ = 0; - tuser = argv[argc - 1]; - if (*tuser == '\0') - tuser = NULL; - else if (!okname(tuser)) - exit(1); - } else { - thost = argv[argc - 1]; - tuser = NULL; - } - thost = unbracket(thost); - - for (i = 0; i < argc - 1; i++) { - src = colon(argv[i]); - if (src) { /* remote to remote */ - int ret; - *src++ = 0; - if (*src == 0) - src = "."; - host = strchr(argv[i], '@'); - if (host) { - *host++ = '\0'; - host = unbracket(host); - suser = argv[i]; - if (*suser == '\0') - suser = pwd->pw_name; - else if (!okname(suser)) - continue; - ret = asprintf(&bp, - "%s%s %s -l %s -n %s %s '%s%s%s:%s'", - _PATH_RSH, eflag ? " -e" : "", - host, suser, cmd, src, - tuser ? tuser : "", tuser ? "@" : "", - thost, targ); - } else { - host = unbracket(argv[i]); - ret = asprintf(&bp, - "exec %s%s %s -n %s %s '%s%s%s:%s'", - _PATH_RSH, eflag ? " -e" : "", - host, cmd, src, - tuser ? tuser : "", tuser ? "@" : "", - thost, targ); - } - if (ret == -1) - err (1, "malloc"); - susystem(bp); - free(bp); - } else { /* local to remote */ - if (remin == -1) { - if (asprintf(&bp, "%s -t %s", cmd, targ) == -1) - err (1, "malloc"); - host = thost; - - if (do_cmd(host, tuser, bp, &remin, &remout) < 0) - exit(1); - - if (response() < 0) - exit(1); - free(bp); - } - source(1, argv+i); - } - } -} - -void -tolocal(int argc, char **argv) -{ - int i; - char *bp, *host, *src, *suser; - - for (i = 0; i < argc - 1; i++) { - int ret; - - if (!(src = colon(argv[i]))) { /* Local to local. */ - ret = asprintf(&bp, "exec %s%s%s %s %s", _PATH_CP, - iamrecursive ? " -PR" : "", pflag ? " -p" : "", - argv[i], argv[argc - 1]); - if (ret == -1) - err (1, "malloc"); - if (susystem(bp)) - ++errs; - free(bp); - continue; - } - *src++ = 0; - if (*src == 0) - src = "."; - if ((host = strchr(argv[i], '@')) == NULL) { - host = argv[i]; - suser = pwd->pw_name; - } else { - *host++ = 0; - suser = argv[i]; - if (*suser == '\0') - suser = pwd->pw_name; - else if (!okname(suser)) - continue; - } - ret = asprintf(&bp, "%s -f %s", cmd, src); - if (ret == -1) - err (1, "malloc"); - if (do_cmd(host, suser, bp, &remin, &remout) < 0) { - free(bp); - ++errs; - continue; - } - free(bp); - sink(1, argv + argc - 1); - close(remin); - remin = remout = -1; - } -} - -void -source(int argc, char **argv) -{ - struct stat stb; - static BUF buffer; - BUF *bp; - off_t i; - off_t amt; - int fd, haderr, indx, result; - char *last, *name, buf[BUFSIZ]; - - for (indx = 0; indx < argc; ++indx) { - name = argv[indx]; - if ((fd = open(name, O_RDONLY, 0)) < 0) - goto syserr; - if (fstat(fd, &stb)) { -syserr: run_err("%s: %s", name, strerror(errno)); - goto next; - } - if (S_ISDIR(stb.st_mode) && iamrecursive) { - rsource(name, &stb); - goto next; - } else if (!S_ISREG(stb.st_mode)) { - run_err("%s: not a regular file", name); - goto next; - } - if ((last = strrchr(name, '/')) == NULL) - last = name; - else - ++last; - if (pflag) { - /* - * Make it compatible with possible future - * versions expecting microseconds. - */ - snprintf(buf, sizeof(buf), "T%ld 0 %ld 0\n", - (long)stb.st_mtime, - (long)stb.st_atime); - write(remout, buf, strlen(buf)); - if (response() < 0) - goto next; - } -#undef MODEMASK -#define MODEMASK (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) - snprintf(buf, sizeof(buf), "C%04o %lu %s\n", - (unsigned int)(stb.st_mode & MODEMASK), - (unsigned long)stb.st_size, - last); - write(remout, buf, strlen(buf)); - if (response() < 0) - goto next; - if ((bp = allocbuf(&buffer, fd, BUFSIZ)) == NULL) { -next: close(fd); - continue; - } - - /* Keep writing after an error so that we stay sync'd up. */ - for (haderr = i = 0; i < stb.st_size; i += bp->cnt) { - amt = bp->cnt; - if (i + amt > stb.st_size) - amt = stb.st_size - i; - if (!haderr) { - result = read(fd, bp->buf, (size_t)amt); - if (result != amt) - haderr = result >= 0 ? EIO : errno; - } - if (haderr) - write(remout, bp->buf, amt); - else { - result = write(remout, bp->buf, (size_t)amt); - if (result != amt) - haderr = result >= 0 ? EIO : errno; - } - } - if (close(fd) && !haderr) - haderr = errno; - if (!haderr) - write(remout, "", 1); - else - run_err("%s: %s", name, strerror(haderr)); - response(); - } -} - -void -rsource(char *name, struct stat *statp) -{ - DIR *dirp; - struct dirent *dp; - char *last, *vect[1], path[MAXPATHLEN]; - - if (!(dirp = opendir(name))) { - run_err("%s: %s", name, strerror(errno)); - return; - } - last = strrchr(name, '/'); - if (last == 0) - last = name; - else - last++; - if (pflag) { - snprintf(path, sizeof(path), "T%ld 0 %ld 0\n", - (long)statp->st_mtime, - (long)statp->st_atime); - write(remout, path, strlen(path)); - if (response() < 0) { - closedir(dirp); - return; - } - } - snprintf(path, sizeof(path), - "D%04o %d %s\n", - (unsigned int)(statp->st_mode & MODEMASK), 0, last); - write(remout, path, strlen(path)); - if (response() < 0) { - closedir(dirp); - return; - } - while ((dp = readdir(dirp)) != NULL) { - if (dp->d_ino == 0) - continue; - if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) - continue; - if (strlen(name) + 1 + strlen(dp->d_name) >= MAXPATHLEN - 1) { - run_err("%s/%s: name too long", name, dp->d_name); - continue; - } - snprintf(path, sizeof(path), "%s/%s", name, dp->d_name); - vect[0] = path; - source(1, vect); - } - closedir(dirp); - write(remout, "E\n", 2); - response(); -} - -void -sink(int argc, char **argv) -{ - static BUF buffer; - struct stat stb; - struct timeval tv[2]; - enum { YES, NO, DISPLAYED } wrerr; - BUF *bp; - off_t i, j, size; - int amt, count, exists, first, mask, mode, ofd, omode; - int setimes, targisdir, wrerrno = 0; - char ch, *cp, *np, *targ, *why, *vect[1], buf[BUFSIZ]; - -#define atime tv[0] -#define mtime tv[1] -#define SCREWUP(str) { why = str; goto screwup; } - - setimes = targisdir = 0; - mask = umask(0); - if (!pflag) - umask(mask); - if (argc != 1) { - run_err("ambiguous target"); - exit(1); - } - targ = *argv; - if (targetshouldbedirectory) - verifydir(targ); - write(remout, "", 1); - if (stat(targ, &stb) == 0 && S_ISDIR(stb.st_mode)) - targisdir = 1; - for (first = 1;; first = 0) { - cp = buf; - if (read(remin, cp, 1) <= 0) - return; - if (*cp++ == '\n') - SCREWUP("unexpected "); - do { - if (read(remin, &ch, sizeof(ch)) != sizeof(ch)) - SCREWUP("lost connection"); - *cp++ = ch; - } while (cp < &buf[BUFSIZ - 1] && ch != '\n'); - *cp = 0; - - if (buf[0] == '\01' || buf[0] == '\02') { - if (iamremote == 0) - write(STDERR_FILENO, - buf + 1, strlen(buf + 1)); - if (buf[0] == '\02') - exit(1); - ++errs; - continue; - } - if (buf[0] == 'E') { - write(remout, "", 1); - return; - } - - if (ch == '\n') - *--cp = 0; - - cp = buf; - if (*cp == 'T') { - setimes++; - cp++; - mtime.tv_sec = strtol(cp, &cp, 10); - if (!cp || *cp++ != ' ') - SCREWUP("mtime.sec not delimited"); - mtime.tv_usec = strtol(cp, &cp, 10); - if (!cp || *cp++ != ' ') - SCREWUP("mtime.usec not delimited"); - atime.tv_sec = strtol(cp, &cp, 10); - if (!cp || *cp++ != ' ') - SCREWUP("atime.sec not delimited"); - atime.tv_usec = strtol(cp, &cp, 10); - if (!cp || *cp++ != '\0') - SCREWUP("atime.usec not delimited"); - write(remout, "", 1); - continue; - } - if (*cp != 'C' && *cp != 'D') { - /* - * Check for the case "rcp remote:foo\* local:bar". - * In this case, the line "No match." can be returned - * by the shell before the rcp command on the remote is - * executed so the ^Aerror_message convention isn't - * followed. - */ - if (first) { - run_err("%s", cp); - exit(1); - } - SCREWUP("expected control record"); - } - mode = 0; - for (++cp; cp < buf + 5; cp++) { - if (*cp < '0' || *cp > '7') - SCREWUP("bad mode"); - mode = (mode << 3) | (*cp - '0'); - } - if (*cp++ != ' ') - SCREWUP("mode not delimited"); - - for (size = 0; isdigit((unsigned char)*cp);) - size = size * 10 + (*cp++ - '0'); - if (*cp++ != ' ') - SCREWUP("size not delimited"); - if (targisdir) { - static char *namebuf; - static int cursize; - size_t need; - - need = strlen(targ) + strlen(cp) + 250; - if (need > cursize) { - if (!(namebuf = malloc(need))) - run_err("%s", strerror(errno)); - } - snprintf(namebuf, need, "%s%s%s", targ, - *targ ? "/" : "", cp); - np = namebuf; - } else - np = targ; - exists = stat(np, &stb) == 0; - if (buf[0] == 'D') { - int mod_flag = pflag; - if (exists) { - if (!S_ISDIR(stb.st_mode)) { - errno = ENOTDIR; - goto bad; - } - if (pflag) - chmod(np, mode); - } else { - /* Handle copying from a read-only directory */ - mod_flag = 1; - if (mkdir(np, mode | S_IRWXU) < 0) - goto bad; - } - vect[0] = np; - sink(1, vect); - if (setimes) { - setimes = 0; - if (utimes(np, tv) < 0) - run_err("%s: set times: %s", - np, strerror(errno)); - } - if (mod_flag) - chmod(np, mode); - continue; - } - omode = mode; - mode |= S_IWRITE; - if ((ofd = open(np, O_WRONLY|O_CREAT, mode)) < 0) { -bad: run_err("%s: %s", np, strerror(errno)); - continue; - } - write(remout, "", 1); - if ((bp = allocbuf(&buffer, ofd, BUFSIZ)) == NULL) { - close(ofd); - continue; - } - cp = bp->buf; - wrerr = NO; - for (count = i = 0; i < size; i += BUFSIZ) { - amt = BUFSIZ; - if (i + amt > size) - amt = size - i; - count += amt; - if((j = net_read(remin, cp, amt)) != amt) { - run_err("%s", j ? strerror(errno) : - "dropped connection"); - exit(1); - } - amt -= j; - cp += j; - if (count == bp->cnt) { - /* Keep reading so we stay sync'd up. */ - if (wrerr == NO) { - j = write(ofd, bp->buf, (size_t)count); - if (j != count) { - wrerr = YES; - wrerrno = j >= 0 ? EIO : errno; - } - } - count = 0; - cp = bp->buf; - } - } - if (count != 0 && wrerr == NO && - (j = write(ofd, bp->buf, (size_t)count)) != count) { - wrerr = YES; - wrerrno = j >= 0 ? EIO : errno; - } - if (ftruncate(ofd, size)) { - run_err("%s: truncate: %s", np, strerror(errno)); - wrerr = DISPLAYED; - } - if (pflag) { - if (exists || omode != mode) - if (fchmod(ofd, omode)) - run_err("%s: set mode: %s", - np, strerror(errno)); - } else { - if (!exists && omode != mode) - if (fchmod(ofd, omode & ~mask)) - run_err("%s: set mode: %s", - np, strerror(errno)); - } - close(ofd); - response(); - if (setimes && wrerr == NO) { - setimes = 0; - if (utimes(np, tv) < 0) { - run_err("%s: set times: %s", - np, strerror(errno)); - wrerr = DISPLAYED; - } - } - switch(wrerr) { - case YES: - run_err("%s: %s", np, strerror(wrerrno)); - break; - case NO: - write(remout, "", 1); - break; - case DISPLAYED: - break; - } - } -screwup: - run_err("protocol error: %s", why); - exit(1); -} - -int -response(void) -{ - char ch, *cp, resp, rbuf[BUFSIZ]; - - if (read(remin, &resp, sizeof(resp)) != sizeof(resp)) - lostconn(0); - - cp = rbuf; - switch(resp) { - case 0: /* ok */ - return (0); - default: - *cp++ = resp; - /* FALLTHROUGH */ - case 1: /* error, followed by error msg */ - case 2: /* fatal error, "" */ - do { - if (read(remin, &ch, sizeof(ch)) != sizeof(ch)) - lostconn(0); - *cp++ = ch; - } while (cp < &rbuf[BUFSIZ] && ch != '\n'); - - if (!iamremote) - write(STDERR_FILENO, rbuf, cp - rbuf); - ++errs; - if (resp == 1) - return (-1); - exit(1); - } - /* NOTREACHED */ -} - -#include - -void -run_err(const char *fmt, ...) -{ - static FILE *fp; - va_list ap; - - ++errs; - if (fp == NULL && !(fp = fdopen(remout, "w"))) - return; - va_start(ap, fmt); - fprintf(fp, "%c", 0x01); - fprintf(fp, "rcp: "); - vfprintf(fp, fmt, ap); - fprintf(fp, "\n"); - fflush(fp); - va_end(ap); - - if (!iamremote) { - va_start(ap, fmt); - vwarnx(fmt, ap); - va_end(ap); - } -} - -/* - * This function executes the given command as the specified user on the - * given host. This returns < 0 if execution fails, and >= 0 otherwise. This - * assigns the input and output file descriptors on success. - * - * If it cannot create necessary pipes it exits with error message. - */ - -int -do_cmd(char *host, char *remuser, char *cmd, int *fdin, int *fdout) -{ - int pin[2], pout[2], reserved[2]; - - /* - * Reserve two descriptors so that the real pipes won't get - * descriptors 0 and 1 because that will screw up dup2 below. - */ - pipe(reserved); - - /* Create a socket pair for communicating with rsh. */ - if (pipe(pin) < 0) { - perror("pipe"); - exit(255); - } - if (pipe(pout) < 0) { - perror("pipe"); - exit(255); - } - - /* Free the reserved descriptors. */ - close(reserved[0]); - close(reserved[1]); - - /* For a child to execute the command on the remote host using rsh. */ - if (fork() == 0) { - char *args[100]; - unsigned int i; - - /* Child. */ - close(pin[1]); - close(pout[0]); - dup2(pin[0], 0); - dup2(pout[1], 1); - close(pin[0]); - close(pout[1]); - - i = 0; - args[i++] = RSH_PROGRAM; - if (usekrb4) - args[i++] = "-4"; - if (usekrb5) - args[i++] = "-5"; - if (usebroken) - args[i++] = "-K"; - if (doencrypt) - args[i++] = "-x"; - if (forwardtkt) - args[i++] = "-F"; - if (noencrypt) - args[i++] = "-z"; - if (port != NULL) { - args[i++] = "-p"; - args[i++] = port; - } - if (eflag) - args[i++] = "-e"; - if (remuser != NULL) { - args[i++] = "-l"; - args[i++] = remuser; - } - args[i++] = host; - args[i++] = cmd; - args[i++] = NULL; - - execvp(RSH_PROGRAM, args); - perror(RSH_PROGRAM); - exit(1); - } - /* Parent. Close the other side, and return the local side. */ - close(pin[0]); - *fdout = pin[1]; - close(pout[1]); - *fdin = pout[0]; - return 0; -} diff --git a/crypto/heimdal/appl/rcp/rcp_locl.h b/crypto/heimdal/appl/rcp/rcp_locl.h deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/rcp_locl.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2001 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "extern.h" - -#ifndef _PATH_CP -#define _PATH_CP "/bin/cp" -#endif -#undef _PATH_RSH -#define _PATH_RSH BINDIR "/rsh" diff --git a/crypto/heimdal/appl/rcp/util.c b/crypto/heimdal/appl/rcp/util.c deleted file mode 100644 --- a/crypto/heimdal/appl/rcp/util.c +++ /dev/null @@ -1,184 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#if 0 -#ifndef lint -#if 0 -static char sccsid[] = "@(#)util.c 8.2 (Berkeley) 4/2/94"; -#endif -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ -#endif - -#include "rcp_locl.h" - -RCSID("$Id$"); - -char * -colon(cp) - char *cp; -{ - if (*cp == ':') /* Leading colon is part of file name. */ - return (0); - - for (; *cp; ++cp) { - if (*cp == ':') - return (cp); - if (*cp == '/') - return (0); - } - return (0); -} - -char * -unbracket(char *cp) -{ - char *ep; - - if (*cp == '[') { - ep = cp + (strlen(cp) - 1); - if (*ep == ']') { - *ep = '\0'; - ++cp; - } - } - return (cp); -} - -void -verifydir(cp) - char *cp; -{ - struct stat stb; - - if (!stat(cp, &stb)) { - if (S_ISDIR(stb.st_mode)) - return; - errno = ENOTDIR; - } - run_err("%s: %s", cp, strerror(errno)); - exit(1); -} - -int -okname(cp0) - char *cp0; -{ - int c; - unsigned char *cp; - - cp = (unsigned char *)cp0; - do { - c = *cp; - if (c & 0200) - goto bad; - if (!isalpha(c) && !isdigit(c) && c != '_' && c != '-') - goto bad; - } while (*++cp); - return (1); - -bad: warnx("%s: invalid user name", cp0); - return (0); -} - -int -susystem(s) - char *s; -{ - void (*istat)(int), (*qstat)(int); - int status; - pid_t pid; - - pid = fork(); - switch (pid) { - case -1: - return (127); - - case 0: - execl(_PATH_BSHELL, "sh", "-c", s, NULL); - _exit(127); - } - istat = signal(SIGINT, SIG_IGN); - qstat = signal(SIGQUIT, SIG_IGN); - if (waitpid(pid, &status, 0) < 0) - status = -1; - (void)signal(SIGINT, istat); - (void)signal(SIGQUIT, qstat); - return (status); -} - -#ifndef roundup -#define roundup(x, y) ((((x)+((y)-1))/(y))*(y)) -#endif - -BUF * -allocbuf(bp, fd, blksize) - BUF *bp; - int fd, blksize; -{ - struct stat stb; - size_t size; - char *p; - - if (fstat(fd, &stb) < 0) { - run_err("fstat: %s", strerror(errno)); - return (0); - } - size = roundup(stb.st_blksize, blksize); - if (size == 0) - size = blksize; - if (bp->cnt >= size) - return (bp); - if ((p = realloc(bp->buf, size)) == NULL) { - if (bp->buf) - free(bp->buf); - bp->buf = NULL; - bp->cnt = 0; - run_err("%s", strerror(errno)); - return (0); - } - memset(p, 0, size); - bp->buf = p; - bp->cnt = size; - return (bp); -} - -void -lostconn(signo) - int signo; -{ - if (!iamremote) - warnx("lost connection"); - exit(1); -} diff --git a/crypto/heimdal/appl/rsh/ChangeLog b/crypto/heimdal/appl/rsh/ChangeLog deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/ChangeLog +++ /dev/null @@ -1,549 +0,0 @@ -2007-07-12 Love Hörnquist Åstrand - - * rsh.c: Fix pointer vs strict alias rules. - - * rshd.c: Fix pointer vs strict alias rules. - -2007-01-04 Love Hörnquist Åstrand - - * rshd.c: Declare iruserok if needed, based on bug report from - David Love. - -2006-11-14 Love Hörnquist Åstrand - - * rsh_locl.h: Forward decl. - -2006-10-14 Love Hörnquist Åstrand - - * rsh_locl.h: Include "crypto-headers.h". - -2006-10-07 Love Hörnquist Åstrand - - * Makefile.am: Add man_MANS to EXTRA_DIST - -2006-04-27 Love Hörnquist Åstrand - - * Makefile.am: rshd_SOURCES += add limits_conf.c - - * rsh_locl.h: Include "loginpaths.h" - - * rshd.c: Read limits from limits.confon non-root login, patch - from Daniel Ahlin - -2006-02-27 Johan Danielsson - - * rshd.8: grammar (from Thomas Klausner) - -2006-01-31 Johan Danielsson - - * rshd.c (krb5_start_session): syslog failures to store cred cache - -2005-12-21 Love Hörnquist Åstrand - - * rshd.c (doit): move creation of users ticket file to later to - avoid seteuid/setuid dance. this breaks DCE, so remove support for - it completely. - -2005-10-22 Love Hörnquist Åstrand - - * rshd.c: Check return value from asprintf instead of string != - NULL since it undefined behavior on Linux. From Björn Sandell - - * rsh.c: Check return value from asprintf instead of string != - NULL since it undefined behavior on Linux. From Björn Sandell - -2005-06-08 Love Hörnquist Åstrand - - * rshd.c: init some important variables and check that they are - set checking authentication, all to please gcc - -2005-05-27 Love Hörnquist Åstrand - - * rshd.c: case uid_t to unsigned long in printf format - -2005-04-27 Love Hörnquist Åstrand - - * rsh_locl.h: Use larger buffer for recving data to be compatible - with older versions of heimdal (0.4 branch specificly) - - * rshd.c: Use larger buffer for recving data to be compatible with - older versions of heimdal (0.4 branch specificly) - -2005-04-25 Love Hörnquist Åstrand - - * rshd.c: use snprintf to format tkfile - -2005-04-24 Love Hörnquist Åstrand - - * rsh.c: use strlcat - - * rsh.c: use strlcpy - - * rsh_locl.h: forward declaration for private structures - -2005-04-20 Love Hörnquist Åstrand - - * rsh.c: cast size_t to unsigned long - -2004-09-21 Johan Danielsson - - * rshd.c: rename loop to rshd_loop - - * rshd.c: pass errsock status to init_ivecs - - * rsh.c: rename loop() to rsh_loop() - - * rsh.c (loop): pass errsock status to init_ivecs - - * common.c (init_ivecs): if we don't have an errsock the ivecs - should point to the same data - - * rshd.c: if we don't have an errsock, dup stdout to stderr (this - would normally be done by inetd, but not by mini_inetd). - - * rshd.c: move keepalive setting to after setting up sockets - -2004-02-20 Johan Danielsson - - * rsh.1: reorder and document some options - - * rsh_locl.h: include kafs.h if krb4 || krb5 - - * rsh.c: reorder some options - -2003-09-04 Johan Danielsson - - * rsh.1: document -d - -2003-08-19 Johan Danielsson - - * rshd.c: -P also with KRB5 - -2003-04-22 Love Hörnquist Åstrand - - * rsh.1: replace > with \*[Gt] - -2003-04-16 Johan Danielsson - - * rsh.c: use krb5_appdefault to get defaults for forward and - encrypt - - * rshd.c: use ARG_MAX + 1 - - * rshd.c (read_str): return allocated string - - * rsh_locl.h: set NCARGS to 8k if undefined - -2003-03-23 Assar Westerlund - - * rsh.c (loop): only check errsock if it's valid - -2003-03-18 Love Love Hörnquist Åstrand - - * rshd.c: do krb5_afslog when compling with afs support - - * rsh_locl.h: always include kafs.h - -2002-11-22 Johan Danielsson - - * rshd.8: clarify -x and kerberos 5 - -2002-11-01 Johan Danielsson - - * rsh_locl.h: bump COMMAND_SZ to NCARGS+1 - -2002-09-04 Johan Danielsson - - * rsh.c: free some memory - -2002-09-04 Assar Westerlund - - * common.c: krb5_crypto_block_size -> krb5_crypto_getblocksize - -2002-09-04 Johan Danielsson - - * rsh.1: document -P - -2002-09-03 Johan Danielsson - - * rsh.c: revert to protocol v1 if not asked for specific protocol - - * rshd.c: handle protocol version 2 - - * rsh.c: handle protocol version 2 - - * common.c: handle protocol version 2 - - * rsh_locl.h: handle protocol version 2 - -2002-02-18 Johan Danielsson - - * rshd.c: don't show options that doesn't apply - - * rsh.c: don't show options that doesn't apply - - * rsh_locl.h: if we're not building with any kerberos support, - just call read/write directly - - * common.c: if we're not building with any kerberos support, just - call read/write directly - - * rshd.c: make this build without krb5; also use the addrinfo - interface to mini_inetd, and set the keepalive option if requested - - * rsh.c: make this build without krb5 - - * rsh_locl.h: make this build without krb5 - - * common.c: make this build without krb5 - -2001-11-30 Johan Danielsson - - * rshd.c: make the syslog messages somewhat more informative - -2001-08-15 Johan Danielsson - - * rsh.c: only complain about encryption flag when old - authentication is requested - -2001-08-07 Johan Danielsson - - * rsh.c: don't try broken auth if rresvport failed; try to give - some more informative error messages - -2001-07-31 Johan Danielsson - - * rshd.8: add an EXAMPLE - * rshd.8: manual page - * rshd.c: add some compat flags - * rsh.1: manual page - * rsh.c: iff -d, set the SO_DEBUG flags of the stdout and stderr - socket; implement parsing user@host - -2001-07-19 Assar Westerlund - - * rshd.c (fatal): use vsnprintf correctly - -2001-02-07 Assar Westerlund - - * Makefile.am: add login_access - * rshd.c (login_access): add prototype - (syslog_and_die, fatal): add printf attributes - (*): AIX -> _AIX - (doit): use login_access - based on patches from Ake Sandgren - -2001-01-09 Assar Westerlund - - * rshd.c (save_krb5_creds): use krb5_rd_cred2 instead of - krb5_rd_cred - -2000-12-31 Assar Westerlund - - * rshd.c (main): handle krb5_init_context failure consistently - * rsh.c (main): handle krb5_init_context failure consistently - -2000-12-05 Johan Danielsson - - * rshd.c: require encryption if passed -x - -2000-11-15 Assar Westerlund - - * rshd.c (loop): check that the fd's aren't too large to select on - * rsh.c (loop, proto): check that the fd's aren't too large to - select on - -2000-08-10 Assar Westerlund - - * rsh.c: move code to do config/command parsing correctly. - -2000-08-09 Assar Westerlund - - * rsh.c (main): only fetch stuff from krb5.conf when no option has - been given - -2000-08-01 Assar Westerlund - - * rsh.c (doit): loop until we create an error socket of an - supported socket family - -2000-07-02 Assar Westerlund - - * rshd.c: DCE stuff from Ake Sandgren - do not call syslog with a variable as format string - - * rsh_locl.h (_PATH_ETC_ENVIRONMENT): add - -2000-06-09 Assar Westerlund - - * rsh.c (main): work-around for setuid and capabilities bug fixed - in Linux 2.2.16 - -2000-06-06 Johan Danielsson - - * rsh.c: nuke long option from -z - - * rsh.c: don't try to encrypt if auth is broken (Daniel Kouril) - -2000-06-03 Assar Westerlund - - * rshd.c (doit): check return value of getspnam. From - - -2000-05-23 Assar Westerlund - - * rsh.c (proto): select on the normal socket when waiting for the - daemon to connect back to the stderr port, so that we discover - when data arrives there before. when that happens, we assume that - the daemon did not manage to connect (because of NAT/whatever) and - continue as if `-e' was given - * rshd.c (doit): if we fail to connect back to the stderr port, - act as if `-e' was given on the client side, i.e. without the - special TCP-connection. This tries to make things better when - running the head against a NAT wall, for example. - -2000-02-07 Assar Westerlund - - * Makefile.am (LDADD): make sure we use the heimdal libdes - -2000-02-06 Assar Westerlund - - * *: conditionalize des stuff on KRB4 - -1999-12-16 Assar Westerlund - - * rsh.c (doit): addrinfo returned from getaddrinfo() is not usable - directly as hints. copy it and set AI_PASSIVE. - -1999-11-20 Assar Westerlund - - * rsh.c (main): remember to close the priviledged sockets before - calling rlogin - -1999-11-02 Assar Westerlund - - * rsh.c (main): redo the v4/v5 selection for consistency. -4 -> - try only v4 -5 -> try only v5 none, -45 -> try v5, v4 - -1999-10-26 Assar Westerlund - - * rshd.c (main): ignore SIGPIPE - - * common.c (do_read): the encoded length can be longer than the - buffer being used, allocate memory for it dynamically. From Brian - A May - -1999-10-14 Assar Westerlund - - * rsh.c (proto): be more careful and don't print errno when read() - returns 0 - -1999-09-20 Assar Westerlund - - * rshd.c (recv_krb4_auth): set `iv' - -1999-08-16 Assar Westerlund - - * common.c (do_read): be careful with the return value from - krb5_net_read - -1999-08-05 Assar Westerlund - - * rsh.c: call freehostent - - * rsh.c: remove some dead code - -1999-08-04 Assar Westerlund - - * rshd.c: re-write the handling of forwarded credentials and - stuff. From Miroslav Ruda - - * rsh_locl.h: always include kafs.h - - * rsh.c: add `-z' and `-G' options - - * rsh.c (loop): shutdown one side of the TCP connection on EOF. - From Brian A May - - * common.c (do_read): handle EOF. From Brian A May - - -1999-08-01 Assar Westerlund - - * rsh.c: const fixes - -1999-07-29 Assar Westerlund - - * rshd.c: v6-ify - - * rsh.c: v6-ify - -1999-07-28 Assar Westerlund - - * rsh_locl.h: move around kafs.h - -1999-07-24 Assar Westerlund - - * rsh_locl.h: - - * rsh.c, rshd.c: improve forwarding and implement unique ccache on - server. From Miroslav Ruda - -1999-07-03 Assar Westerlund - - * rsh.c (construct_command): handle argc == 0 for generality - -1999-06-23 Assar Westerlund - - * rsh.c: new option `-e' for not trying to open an stderr socket - -1999-06-17 Assar Westerlund - - * rsh_locl.h (RSH_BUFSIZ): bump to 16 * 1024 to be sure that we - don't leave any data inside des_enc_read. (that constant should - really be exported in some way...) - -1999-06-15 Assar Westerlund - - * rsh.c: use get_default_username and resulting const pollution - -1999-05-21 Assar Westerlund - - * rsh.c (main): try $USERNAME - -1999-05-14 Assar Westerlund - - * rshd.c (doit): afslog correctly - -1999-05-11 Assar Westerlund - - * rsh.c (main): add fallback to rlogin - -1999-05-10 Assar Westerlund - - * rsh.c (send_krb5_auth): call krb5_sendauth with ccache == NULL. - check return value from krb5_crypto_init - - * common.c (do_write, do_read): always return -1 for failure - (net_write, net_read): remove. they already exist in libroken - -1999-05-09 Assar Westerlund - - * rsh.c: make sure it tries with all other authentication methods - after one has failed - * rsh.c (main): detect the case of no command given. - -1999-04-11 Assar Westerlund - - * rsh.c: new option --forwardable. use print_version - -Sat Apr 10 17:10:55 1999 Assar Westerlund - - * rshd.c (setup_copier): use `socketpair' instead of `pipe'. Some - shells don't think it's a rsh session if they find a pipe at the - other end. - (setup_environment): add SSH_CLIENT just to make bash happy - - * common.c (do_read): use krb5_get_wrapped_length - -Wed Mar 24 03:59:42 1999 Assar Westerlund - - * rsh.c (loop): more braces to make gcc happy - -Tue Mar 23 17:08:32 1999 Johan Danielsson - - * rsh_locl.h: kafs.h - - * rshd.c: add `-P', `-v', and `-L' flags - -Thu Mar 18 11:37:24 1999 Johan Danielsson - - * Makefile.am: include Makefile.am.common - -Tue Dec 1 14:44:44 1998 Johan Danielsson - - * appl/rsh/rshd.c: update to new crypto framework - - * appl/rsh/rsh_locl.h: update to new crypto framework - - * appl/rsh/rsh.c: update to new crypto framework - - * appl/rsh/common.c: update to new crypto framework - -Mon Nov 2 01:15:06 1998 Assar Westerlund - - * appl/rsh/rsh.c (main): initialize host - - * appl/rsh/rshd.c (recv_krb5_auth): disable `do_encrypt' if not - encrypting. - -Thu Jul 30 23:12:17 1998 Assar Westerlund - - * appl/rsh/rsh.c: kludges for parsing `rsh hostname -l user' - -Thu Jul 23 19:49:03 1998 Johan Danielsson - - * appl/rsh/rshd.c: use krb5_verify_authenticator_checksum - -Sat Apr 18 21:13:06 1998 Johan Danielsson - - * appl/rsh/rsh.c: Don't try v5 if (only) `-4' is specified. - -Sun Dec 21 09:44:05 1997 Assar Westerlund - - * appl/rsh/rshd.c (recv_krb5_auth): swap the order of the - `local_user' and the `remote_user' - - * appl/rsh/rsh.c (send_krb5_auth): swap the order of the - `local_user' and the `remote_user' - -Sat Nov 29 07:10:11 1997 Assar Westerlund - - * appl/rsh/rshd.c: updated to use getarg. - changed `struct fd_set' to `fd_set'. - implemented broken/BSD authentication (requires iruserok) - -Wed Nov 12 02:35:57 1997 Assar Westerlund - - * appl/rsh/rsh_locl.h: add AUTH_BROKEN and PATH_RSH - - * appl/rsh/Makefile.am: set BINDIR - - * appl/rsh/rsh.c: implemented BSD-style reserved port - `authentication' - -Sun Aug 24 08:06:54 1997 Assar Westerlund - - * appl/rsh/rshd.c: syslog remote shells - -Tue Aug 12 01:29:46 1997 Assar Westerlund - - * appl/rshd/rshd.c: Use `krb5_sock_to_principal'. Send server - parameter to krb5_rd_req/krb5_recvauth. Set addresses in - auth_context. - -Fri Jul 25 17:32:12 1997 Assar Westerlund - - * appl/rsh/rshd.c: implement forwarding - - * appl/rsh/rsh.c: Use getarg. Implement forwarding. - -Sun Jul 13 00:32:16 1997 Assar Westerlund - - * appl/rsh: Conditionalize the krb4-support. - -Wed Jul 9 06:58:00 1997 Assar Westerlund - - * appl/rsh/rsh.c: use the correct user for the checksum - -Mon Jul 7 11:15:51 1997 Assar Westerlund - - * appl/rsh/rshd.c: Now works. Also implementd encryption and - `-p'. - - * appl/rsh/common.c: new file - -Mon Jun 30 06:08:14 1997 Assar Westerlund - - * appl/rsh: New program. - diff --git a/crypto/heimdal/appl/rsh/Makefile.am b/crypto/heimdal/appl/rsh/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += -I$(srcdir)/../login $(INCLUDE_hcrypto) - -bin_PROGRAMS = rsh - -man_MANS = rsh.1 rshd.8 - -libexec_PROGRAMS = rshd - -rsh_SOURCES = rsh.c common.c rsh_locl.h - -rshd_SOURCES = rshd.c common.c login_access.c limits_conf.c rsh_locl.h - -login_access.c: - $(LN_S) $(srcdir)/../login/login_access.c . - -limits_conf.c: - $(LN_S) $(srcdir)/../login/limits_conf.c . - -LDADD = $(LIB_kafs) \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) diff --git a/crypto/heimdal/appl/rsh/Makefile.in b/crypto/heimdal/appl/rsh/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/Makefile.in +++ /dev/null @@ -1,1063 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -bin_PROGRAMS = rsh$(EXEEXT) -libexec_PROGRAMS = rshd$(EXEEXT) -subdir = appl/rsh -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ - "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" -PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) -am_rsh_OBJECTS = rsh.$(OBJEXT) common.$(OBJEXT) -rsh_OBJECTS = $(am_rsh_OBJECTS) -rsh_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -am__DEPENDENCIES_2 = $(top_builddir)/lib/kafs/libkafs.la \ - $(am__DEPENDENCIES_1) -rsh_DEPENDENCIES = $(am__DEPENDENCIES_2) $(LIB_krb5) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am_rshd_OBJECTS = rshd.$(OBJEXT) common.$(OBJEXT) \ - login_access.$(OBJEXT) limits_conf.$(OBJEXT) -rshd_OBJECTS = $(am_rshd_OBJECTS) -rshd_LDADD = $(LDADD) -rshd_DEPENDENCIES = $(am__DEPENDENCIES_2) $(LIB_krb5) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -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 = $(rsh_SOURCES) $(rshd_SOURCES) -DIST_SOURCES = $(rsh_SOURCES) $(rshd_SOURCES) -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' -man1dir = $(mandir)/man1 -man8dir = $(mandir)/man8 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/../login \ - $(INCLUDE_hcrypto) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -man_MANS = rsh.1 rshd.8 -rsh_SOURCES = rsh.c common.c rsh_locl.h -rshd_SOURCES = rshd.c common.c login_access.c limits_conf.c rsh_locl.h -LDADD = $(LIB_kafs) \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/rsh/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/rsh/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) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - 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 -install-libexecPROGRAMS: $(libexec_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ - 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)$(libexecdir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-libexecPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || 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)$(libexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libexecdir)" && rm -f $$files - -clean-libexecPROGRAMS: - @list='$(libexec_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 -rsh$(EXEEXT): $(rsh_OBJECTS) $(rsh_DEPENDENCIES) - @rm -f rsh$(EXEEXT) - $(LINK) $(rsh_OBJECTS) $(rsh_LDADD) $(LIBS) -rshd$(EXEEXT): $(rshd_OBJECTS) $(rshd_DEPENDENCIES) - @rm -f rshd$(EXEEXT) - $(LINK) $(rshd_OBJECTS) $(rshd_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limits_conf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/login_access.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsh.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rshd.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 -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ - } | 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } -install-man8: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | 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,^[^8][0-9a-z]*$$,8,;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)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$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)$(man8dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ - done; } - -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man8dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)"; 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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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-libexecPROGRAMS \ - 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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS install-libexecPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man1 install-man8 - -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-libexecPROGRAMS \ - uninstall-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man1 uninstall-man8 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libexecPROGRAMS \ - clean-libtool ctags dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-info install-info-am install-libexecPROGRAMS \ - install-man install-man1 install-man8 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-hook uninstall-libexecPROGRAMS uninstall-man \ - uninstall-man1 uninstall-man8 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -login_access.c: - $(LN_S) $(srcdir)/../login/login_access.c . - -limits_conf.c: - $(LN_S) $(srcdir)/../login/limits_conf.c . - -# 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: diff --git a/crypto/heimdal/appl/rsh/common.c b/crypto/heimdal/appl/rsh/common.c deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/common.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 1997-2004 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "rsh_locl.h" -RCSID("$Id$"); - -#if defined(KRB5) - -#ifdef KRB5 -int key_usage = 1026; - -void *ivec_in[2]; -void *ivec_out[2]; - -void -init_ivecs(int client, int have_errsock) -{ - size_t blocksize; - - krb5_crypto_getblocksize(context, crypto, &blocksize); - - ivec_in[0] = malloc(blocksize); - memset(ivec_in[0], client, blocksize); - - if(have_errsock) { - ivec_in[1] = malloc(blocksize); - memset(ivec_in[1], 2 | client, blocksize); - } else - ivec_in[1] = ivec_in[0]; - - ivec_out[0] = malloc(blocksize); - memset(ivec_out[0], !client, blocksize); - - if(have_errsock) { - ivec_out[1] = malloc(blocksize); - memset(ivec_out[1], 2 | !client, blocksize); - } else - ivec_out[1] = ivec_out[0]; -} -#endif - - -ssize_t -do_read (int fd, void *buf, size_t sz, void *ivec) -{ - if (do_encrypt) { -#ifdef KRB5 - if(auth_method == AUTH_KRB5) { - krb5_error_code ret; - uint32_t len, outer_len; - int status; - krb5_data data; - void *edata; - - ret = krb5_net_read (context, &fd, &len, 4); - if (ret <= 0) - return ret; - len = ntohl(len); - if (len > sz) - abort (); - /* ivec will be non null for protocol version 2 */ - if(ivec != NULL) - outer_len = krb5_get_wrapped_length (context, crypto, len + 4); - else - outer_len = krb5_get_wrapped_length (context, crypto, len); - edata = malloc (outer_len); - if (edata == NULL) - errx (1, "malloc: cannot allocate %u bytes", outer_len); - ret = krb5_net_read (context, &fd, edata, outer_len); - if (ret <= 0) { - free(edata); - return ret; - } - - status = krb5_decrypt_ivec(context, crypto, key_usage, - edata, outer_len, &data, ivec); - free (edata); - - if (status) - krb5_err (context, 1, status, "decrypting data"); - if(ivec != NULL) { - unsigned long l; - if(data.length < len + 4) - errx (1, "data received is too short"); - _krb5_get_int(data.data, &l, 4); - if(l != len) - errx (1, "inconsistency in received data"); - memcpy (buf, (unsigned char *)data.data+4, len); - } else - memcpy (buf, data.data, len); - krb5_data_free (&data); - return len; - } else -#endif /* KRB5 */ - abort (); - } else - return read (fd, buf, sz); -} - -ssize_t -do_write (int fd, void *buf, size_t sz, void *ivec) -{ - if (do_encrypt) { -#ifdef KRB5 - if(auth_method == AUTH_KRB5) { - krb5_error_code status; - krb5_data data; - unsigned char len[4]; - int ret; - - _krb5_put_int(len, sz, 4); - if(ivec != NULL) { - unsigned char *tmp = malloc(sz + 4); - if(tmp == NULL) - err(1, "malloc"); - _krb5_put_int(tmp, sz, 4); - memcpy(tmp + 4, buf, sz); - status = krb5_encrypt_ivec(context, crypto, key_usage, - tmp, sz + 4, &data, ivec); - free(tmp); - } else - status = krb5_encrypt_ivec(context, crypto, key_usage, - buf, sz, &data, ivec); - - if (status) - krb5_err(context, 1, status, "encrypting data"); - - ret = krb5_net_write (context, &fd, len, 4); - if (ret != 4) - return ret; - ret = krb5_net_write (context, &fd, data.data, data.length); - if (ret != data.length) - return ret; - free (data.data); - return sz; - } else -#endif /* KRB5 */ - abort(); - } else - return write (fd, buf, sz); -} -#endif /* KRB5 */ diff --git a/crypto/heimdal/appl/rsh/limits_conf.c b/crypto/heimdal/appl/rsh/limits_conf.c deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/limits_conf.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2005 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - -#include -#include -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif - -struct limit { - const char *name; - int resource; - int scale; - int has_limit; - struct rlimit limit; -} limits[] = { -#define LIM(X, S) { #X, RLIMIT_##X, S, 0 } - LIM(CORE, 1024), - LIM(CPU, 60), - LIM(DATA, 1024), - LIM(FSIZE, 1024), -#ifdef RLIMIT_MEMLOCK - LIM(MEMLOCK, 1024), -#endif - LIM(NOFILE, 1), -#ifdef RLIMIT_NPROC - LIM(NPROC, 1), -#endif -#ifdef RLIMIT_RSS - LIM(RSS, 1024), -#endif - LIM(STACK, 1024), - -#ifdef RLIMIT_AS - LIM(AS, 1024), -#endif -#ifdef RLIMIT_LOCKS - LIM(LOCKS, 1), -#endif - /* - maxlogins - priority - */ - { NULL, 0 } -}; - -static struct limit * -find_limit(const char *name) -{ - struct limit *l; - for(l = limits; l->name != NULL; l++) - if(strcasecmp(name, l->name) == 0) - return l; - return NULL; -} - -/* this function reads limits.conf files similar to pam_limits - unimplemented features include: - % maxlogins - "-" no limits, - priorities etc that are not set via setrlimit - XXX uses static storage, and clobbers getgr* -*/ - -int -read_limits_conf(const char *file, const struct passwd *pwd) -{ - FILE *f; - char *args[4]; - int lineno = 0; - char buf[1024]; - struct limit *l; - rlim_t value; - - f = fopen(file, "r"); - if(f == NULL) { - if(errno != ENOENT && errno != ENOTDIR) - syslog(LOG_ERR, "%s: %m", file); - return -1; - } - - while(fgets(buf, sizeof(buf), f) != NULL) { - char *last = NULL; - char *end = NULL; - int level; - - lineno++; - - if(buf[0] == '\0') { - syslog(LOG_ERR, "%s: line %d: NUL character", file, lineno); - continue; - } - if(buf[strlen(buf) - 1] != '\n') { - /* file did not end with a newline, figure out if we're at - the EOF, or if our buffer was too small */ - int eof = 1; - int c; - while((c = fgetc(f)) != EOF) { - eof = 0; - if(c == '\n') - break; - } - if(!eof) { - syslog(LOG_ERR, "%s: line %d: line too long", file, lineno); - continue; - } - } - buf[strcspn(buf, "#\r\n")] = '\0'; - if((args[0] = strtok_r(buf, " \t", &last)) == NULL || - (args[1] = strtok_r(NULL, " \t", &last)) == NULL || - (args[2] = strtok_r(NULL, " \t", &last)) == NULL || - (args[3] = strtok_r(NULL, " \t", &last)) == NULL) { - if(args[0] != NULL) /* this would include comment lines */ - syslog(LOG_ERR, "%s: line %d: malformed line", file, lineno); - continue; - } - - l = find_limit(args[2]); - if(l == NULL) { - syslog(LOG_ERR, "%s: line %d: unknown limit %s", file, lineno, args[2]); - continue; - } - if(strcmp(args[3], "-") == 0) { - value = RLIM_INFINITY; - } else { - errno = 0; - value = strtol(args[3], &end, 10); - if(*end != '\0') { - syslog(LOG_ERR, "%s: line %d: bad value %s", file, lineno, args[3]); - continue; - } - if((value == LONG_MIN || value == LONG_MAX) && errno == ERANGE) { - syslog(LOG_ERR, "%s: line %d: bad value %s", file, lineno, args[3]); - continue; - } - if(value * l->scale < value) - value = RLIM_INFINITY; - else - value *= l->scale; - } - level = 0; - /* XXX unclear: if you set group hard and user soft limit, - should the hard limit still apply? this code doesn't. */ - if(strcmp(args[0], pwd->pw_name) == 0) - level = 3; - if(*args[0] == '@') { - struct group *gr; - gr = getgrnam(args[0] + 1); - if(gr != NULL && gr->gr_gid == pwd->pw_gid) - level = 2; - } - if(strcmp(args[0], "*") == 0) - level = 1; - if(level == 0 || level < l->has_limit) /* not for us */ - continue; - if(l->has_limit < level) { - if(getrlimit(l->resource, &l->limit) < 0) - continue; - l->has_limit = level; - } - - /* XXX unclear: if you soft to more than default hard, should - we set hard to soft? this code doesn't. */ - if(strcasecmp(args[1], "soft") == 0 || strcmp(args[1], "-") == 0) - l->limit.rlim_cur = value; - if(strcasecmp(args[1], "hard") == 0 || strcmp(args[1], "-") == 0) - l->limit.rlim_max = value; - } - fclose(f); - for(l = limits; l->name != NULL; l++) { - if(l->has_limit) { - if(l->limit.rlim_cur > l->limit.rlim_max) - l->limit.rlim_cur = l->limit.rlim_max; - if(setrlimit(l->resource, &l->limit) != 0) - syslog(LOG_ERR, "setrlimit RLIM_%s failed: %m", l->name); - } - l->has_limit = 0; - } - return 0; -} diff --git a/crypto/heimdal/appl/rsh/login_access.c b/crypto/heimdal/appl/rsh/login_access.c deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/login_access.c +++ /dev/null @@ -1,277 +0,0 @@ -/************************************************************************ -* Copyright 1995 by Wietse Venema. All rights reserved. Some individual -* files may be covered by other copyrights. -* -* This material was originally written and compiled by Wietse Venema at -* Eindhoven University of Technology, The Netherlands, in 1990, 1991, -* 1992, 1993, 1994 and 1995. -* -* Redistribution and use in source and binary forms, with or without -* modification, are permitted provided that this entire copyright notice -* is duplicated in all such copies. -* -* This software is provided "as is" and without any expressed or implied -* warranties, including, without limitation, the implied warranties of -* merchantibility and fitness for any particular purpose. -************************************************************************/ - /* - * This module implements a simple but effective form of login access - * control based on login names and on host (or domain) names, internet - * addresses (or network numbers), or on terminal line names in case of - * non-networked logins. Diagnostics are reported through syslog(3). - * - * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. - */ - -#include "login_locl.h" - -RCSID("$Id$"); - - /* Delimiters for fields and for lists of users, ttys or hosts. */ - -static char fs[] = ":"; /* field separator */ -static char sep[] = ", \t"; /* list-element separator */ - - /* Constants to be used in assignments only, not in comparisons... */ - -#define YES 1 -#define NO 0 - - /* - * A structure to bundle up all login-related information to keep the - * functional interfaces as generic as possible. - */ -struct login_info { - struct passwd *user; - char *from; -}; - -static int list_match(char *list, struct login_info *item, - int (*match_fn)(char *, struct login_info *)); -static int user_match(char *tok, struct login_info *item); -static int from_match(char *tok, struct login_info *item); -static int string_match(char *tok, char *string); - -/* login_access - match username/group and host/tty with access control file */ - -int login_access(struct passwd *user, char *from) -{ - struct login_info item; - FILE *fp; - char line[BUFSIZ]; - char *perm; /* becomes permission field */ - char *users; /* becomes list of login names */ - char *froms; /* becomes list of terminals or hosts */ - int match = NO; - int end; - int lineno = 0; /* for diagnostics */ - char *foo; - - /* - * Bundle up the arguments to avoid unnecessary clumsiness lateron. - */ - item.user = user; - item.from = from; - - /* - * Process the table one line at a time and stop at the first match. - * Blank lines and lines that begin with a '#' character are ignored. - * Non-comment lines are broken at the ':' character. All fields are - * mandatory. The first field should be a "+" or "-" character. A - * non-existing table means no access control. - */ - - if ((fp = fopen(_PATH_LOGACCESS, "r")) != 0) { - while (!match && fgets(line, sizeof(line), fp)) { - lineno++; - if (line[end = strlen(line) - 1] != '\n') { - syslog(LOG_ERR, "%s: line %d: missing newline or line too long", - _PATH_LOGACCESS, lineno); - continue; - } - if (line[0] == '#') - continue; /* comment line */ - while (end > 0 && isspace((unsigned char)line[end - 1])) - end--; - line[end] = 0; /* strip trailing whitespace */ - if (line[0] == 0) /* skip blank lines */ - continue; - foo = NULL; - if (!(perm = strtok_r(line, fs, &foo)) - || !(users = strtok_r(NULL, fs, &foo)) - || !(froms = strtok_r(NULL, fs, &foo)) - || strtok_r(NULL, fs, &foo)) { - syslog(LOG_ERR, "%s: line %d: bad field count", - _PATH_LOGACCESS, - lineno); - continue; - } - if (perm[0] != '+' && perm[0] != '-') { - syslog(LOG_ERR, "%s: line %d: bad first field", - _PATH_LOGACCESS, - lineno); - continue; - } - match = (list_match(froms, &item, from_match) - && list_match(users, &item, user_match)); - } - fclose(fp); - } else if (errno != ENOENT) { - syslog(LOG_ERR, "cannot open %s: %m", _PATH_LOGACCESS); - } - return (match == 0 || (line[0] == '+')); -} - -/* list_match - match an item against a list of tokens with exceptions */ - -static int -list_match(char *list, - struct login_info *item, - int (*match_fn)(char *, struct login_info *)) -{ - char *tok; - int match = NO; - char *foo = NULL; - - /* - * Process tokens one at a time. We have exhausted all possible matches - * when we reach an "EXCEPT" token or the end of the list. If we do find - * a match, look for an "EXCEPT" list and recurse to determine whether - * the match is affected by any exceptions. - */ - - for (tok = strtok_r(list, sep, &foo); - tok != NULL; - tok = strtok_r(NULL, sep, &foo)) { - if (strcasecmp(tok, "EXCEPT") == 0) /* EXCEPT: give up */ - break; - if ((match = (*match_fn) (tok, item)) != 0) /* YES */ - break; - } - /* Process exceptions to matches. */ - - if (match != NO) { - while ((tok = strtok_r(NULL, sep, &foo)) && strcasecmp(tok, "EXCEPT")) - /* VOID */ ; - if (tok == 0 || list_match(NULL, item, match_fn) == NO) - return (match); - } - return (NO); -} - -/* myhostname - figure out local machine name */ - -static char *myhostname(void) -{ - static char name[MAXHOSTNAMELEN + 1] = ""; - - if (name[0] == 0) { - gethostname(name, sizeof(name)); - name[MAXHOSTNAMELEN] = 0; - } - return (name); -} - -/* netgroup_match - match group against machine or user */ - -static int netgroup_match(char *group, char *machine, char *user) -{ -#ifdef HAVE_YP_GET_DEFAULT_DOMAIN - static char *mydomain = 0; - - if (mydomain == 0) - yp_get_default_domain(&mydomain); - return (innetgr(group, machine, user, mydomain)); -#else - syslog(LOG_ERR, "NIS netgroup support not configured"); - return 0; -#endif -} - -/* user_match - match a username against one token */ - -static int user_match(char *tok, struct login_info *item) -{ - char *string = item->user->pw_name; - struct login_info fake_item; - struct group *group; - int i; - char *at; - - /* - * If a token has the magic value "ALL" the match always succeeds. - * Otherwise, return YES if the token fully matches the username, if the - * token is a group that contains the username, or if the token is the - * name of the user's primary group. - */ - - if ((at = strchr(tok + 1, '@')) != 0) { /* split user@host pattern */ - *at = 0; - fake_item.from = myhostname(); - return (user_match(tok, item) && from_match(at + 1, &fake_item)); - } else if (tok[0] == '@') { /* netgroup */ - return (netgroup_match(tok + 1, (char *) 0, string)); - } else if (string_match(tok, string)) { /* ALL or exact match */ - return (YES); - } else if ((group = getgrnam(tok)) != 0) { /* try group membership */ - if (item->user->pw_gid == group->gr_gid) - return (YES); - for (i = 0; group->gr_mem[i]; i++) - if (strcasecmp(string, group->gr_mem[i]) == 0) - return (YES); - } - return (NO); -} - -/* from_match - match a host or tty against a list of tokens */ - -static int from_match(char *tok, struct login_info *item) -{ - char *string = item->from; - int tok_len; - int str_len; - - /* - * If a token has the magic value "ALL" the match always succeeds. Return - * YES if the token fully matches the string. If the token is a domain - * name, return YES if it matches the last fields of the string. If the - * token has the magic value "LOCAL", return YES if the string does not - * contain a "." character. If the token is a network number, return YES - * if it matches the head of the string. - */ - - if (tok[0] == '@') { /* netgroup */ - return (netgroup_match(tok + 1, string, (char *) 0)); - } else if (string_match(tok, string)) { /* ALL or exact match */ - return (YES); - } else if (tok[0] == '.') { /* domain: match last fields */ - if ((str_len = strlen(string)) > (tok_len = strlen(tok)) - && strcasecmp(tok, string + str_len - tok_len) == 0) - return (YES); - } else if (strcasecmp(tok, "LOCAL") == 0) { /* local: no dots */ - if (strchr(string, '.') == 0) - return (YES); - } else if (tok[(tok_len = strlen(tok)) - 1] == '.' /* network */ - && strncmp(tok, string, tok_len) == 0) { - return (YES); - } - return (NO); -} - -/* string_match - match a string against one token */ - -static int string_match(char *tok, char *string) -{ - - /* - * If the token has the magic value "ALL" the match always succeeds. - * Otherwise, return YES if the token fully matches the string. - */ - - if (strcasecmp(tok, "ALL") == 0) { /* all: always matches */ - return (YES); - } else if (strcasecmp(tok, string) == 0) { /* try exact match */ - return (YES); - } - return (NO); -} diff --git a/crypto/heimdal/appl/rsh/rsh.1 b/crypto/heimdal/appl/rsh/rsh.1 deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/rsh.1 +++ /dev/null @@ -1,294 +0,0 @@ -.\" Copyright (c) 2002 - 2003 Kungliga Tekniska Högskolan -.\" (Royal Institute of Technology, Stockholm, Sweden). -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" 3. Neither the name of the Institute nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $Id$ -.\" -.Dd February 20, 2004 -.Dt RSH 1 -.Os HEIMDAL -.Sh NAME -.Nm rsh -.Nd remote shell -.Sh SYNOPSIS -.Nm -.Op Fl 45FGKdefnuxz -.Op Fl U Pa string -.Op Fl p Ar port -.Op Fl l Ar username -.Op Fl P Ar N|O -.Ar host [command] -.Sh DESCRIPTION -.Nm -authenticates to the -.Xr rshd 8 -daemon on the remote -.Ar host , -and then executes the specified -.Ar command . -.Pp -.Nm -copies its standard input to the remote command, and the standard -output and error of the remote command to its own. -.Pp -Valid options are: -.Bl -tag -width Ds -.It Xo -.Fl 4 , -.Fl Fl krb4 -.Xc -The -.Fl 4 -option requests Kerberos 4 authentication. Normally all supported -authentication mechanisms will be tried, but in some cases more -explicit control is desired. -.It Xo -.Fl 5 , -.Fl Fl krb5 -.Xc -The -.Fl 5 -option requests Kerberos 5 authentication. This is analogous to the -.Fl 4 -option. -.It Xo -.Fl K , -.Fl Fl broken -.Xc -The -.Fl K -option turns off all Kerberos authentication. The security in this -mode relies on reserved ports. The long name is an indication of how -good this is. -.It Xo -.Fl n , -.Fl Fl no-input -.Xc -The -.Fl n -option directs the input from the -.Pa /dev/null -device (see the -.Sx BUGS -section of this manual page). -.It Fl d -Enable -.Xr setsockopt 2 -socket debugging. -.It Xo -.Fl e , -.Fl Fl no-stderr -.Xc -Don't use a separate socket for the stderr stream. This can be -necessary if rsh-ing through a NAT bridge. -.It Xo -.Fl x , -.Fl Fl encrypt -.Xc -The -.Fl x -option enables encryption for all data exchange. This is only valid -for Kerberos authenticated connections (see the -.Sx BUGS -section for limitations). -.It Xo -.Fl z -.Xc -The opposite of -.Fl x . -This is the default, and is mainly useful if encryption has been -enabled by default, for instance in the -.Li appdefaults -section of -.Pa /etc/krb5.conf -when using Kerberos 5. -.It Xo -.Fl f , -.Fl Fl forward -.Xc -Forward Kerberos 5 credentials to the remote host. -Also settable via -.Li appdefaults -(see -.Xr krb5.conf ) . -.It Xo -.Fl F , -.Fl Fl forwardable -.Xc -Make the forwarded credentials re-forwardable. -Also settable via -.Li appdefaults -(see -.Xr krb5.conf ) . -.It Xo -.Fl l Ar string , -.Fl Fl user= Ns Ar string -.Xc -By default the remote username is the same as the local. The -.Fl l -option or the -.Pa username@host -format allow the remote name to be specified. -.It Xo -.Fl n , -.Fl Fl no-input -.Xc -Direct input from -.Pa /dev/null -(see the -.Sx BUGS -section). -.It Xo -.Fl p Ar number-or-service , -.Fl Fl port= Ns Ar number-or-service -.Xc -Connect to this port instead of the default (which is 514 when using -old port based authentication, 544 for Kerberos 5 and non-encrypted -Kerberos 4, and 545 for encrypted Kerberos 4; subject of course to -the contents of -.Pa /etc/services ) . -.It Xo -.Fl P Ar N|O|1|2 , -.Fl Fl protocol= Ns Ar N|O|1|2 -.Xc -Specifies the protocol version to use with Kerberos 5. -.Ar N -and -.Ar 2 -select protocol version 2, while -.Ar O -and -.Ar 1 -select version 1. Version 2 is believed to be more secure, and is the -default. Unless asked for a specific version, -.Nm -will try both. This behaviour may change in the future. -.It Xo -.Fl u , -.Fl Fl unique -.Xc -Make sure the remote credentials cache is unique, that is, don't reuse -any existing cache. Mutually exclusive to -.Fl U . -.It Xo -.Fl U Pa string , -.Fl Fl tkfile= Ns Pa string -.Xc -Name of the remote credentials cache. Mutually exclusive to -.Fl u . -.It Xo -.Fl x , -.Fl Fl encrypt -.Xc -The -.Fl x -option enables encryption for all data exchange. This is only valid -for Kerberos authenticated connections (see the -.Sx BUGS -section for limitations). -.It Fl z -The opposite of -.Fl x . -This is the default, but encryption can be enabled when using -Kerberos 5, by setting the -.Li libdefaults/encrypt -option in -.Xr krb5.conf 5 . -.El -.\".Pp -.\"Without a -.\".Ar command -.\".Nm -.\"will just exec -.\".Xr rlogin 1 -.\"with the same arguments. -.Sh EXAMPLES -Care should be taken when issuing commands containing shell meta -characters. Without quoting, these will be expanded on the local -machine. -.Pp -The following command: -.Pp -.Dl rsh otherhost cat remotefile \*[Gt] localfile -.Pp -will write the contents of the remote -.Pa remotefile -to the local -.Pa localfile , -but: -.Pp -.Dl rsh otherhost 'cat remotefile \*[Gt] remotefile2' -.Pp -will write it to the remote -.Pa remotefile2 . -.\".Sh ENVIRONMENT -.Sh FILES -.Bl -tag -width /etc/hosts -compact -.It Pa /etc/hosts -.El -.\".Sh DIAGNOSTICS -.Sh SEE ALSO -.Xr rlogin 1 , -.Xr krb_realmofhost 3 , -.Xr krb_sendauth 3 , -.Xr hosts.equiv 5 , -.Xr krb5.conf 5 , -.Xr rhosts 5 , -.Xr kerberos 8 -.Xr rshd 8 -.\".Sh STANDARDS -.Sh HISTORY -The -.Nm -command appeared in -.Bx 4.2 . -.Sh AUTHORS -This implementation of -.Nm -was written as part of the Heimdal Kerberos 5 implementation. -.Sh BUGS -Some shells (notably -.Xr csh 1 ) -will cause -.Nm -to block if run in the background, unless the standard input is directed away from the terminal. This is what the -.Fl n -option is for. -.Pp -The -.Fl x -options enables encryption for the session, but for both Kerberos 4 -and 5 the actual command is sent unencrypted, so you should not send -any secret information in the command line (which is probably a bad -idea anyway, since the command line can usually be read with tools -like -.Xr ps 1 ) . -Furthermore in Kerberos 4 the command is not even integrity -protected, so anyone with the right tools can modify the command. diff --git a/crypto/heimdal/appl/rsh/rsh.c b/crypto/heimdal/appl/rsh/rsh.c deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/rsh.c +++ /dev/null @@ -1,1032 +0,0 @@ -/* - * Copyright (c) 1997 - 2004 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "rsh_locl.h" -RCSID("$Id$"); - -enum auth_method auth_method; -#if defined(KRB5) -int do_encrypt = -1; -#endif -#ifdef KRB5 -int do_unique_tkfile = 0; -char *unique_tkfile = NULL; -char tkfile[MAXPATHLEN]; -int do_forward = -1; -int do_forwardable = -1; -krb5_context context; -krb5_keyblock *keyblock; -krb5_crypto crypto; -#endif -int sock_debug = 0; - -#ifdef KRB5 -static int use_v5 = -1; -#endif -#if defined(KRB5) -static int use_only_broken = 0; -#else -static int use_only_broken = 1; -#endif -static int use_broken = 1; -static char *port_str; -static const char *user; -static int do_version; -static int do_help; -static int do_errsock = 1; -#ifdef KRB5 -static char *protocol_version_str; -static int protocol_version = 2; -#endif - -/* - * - */ - -static int input = 1; /* Read from stdin */ - -static int -rsh_loop (int s, int errsock) -{ - fd_set real_readset; - int count = 1; - -#ifdef KRB5 - if(auth_method == AUTH_KRB5 && protocol_version == 2) - init_ivecs(1, errsock != -1); -#endif - - if (s >= FD_SETSIZE || (errsock != -1 && errsock >= FD_SETSIZE)) - errx (1, "fd too large"); - - FD_ZERO(&real_readset); - FD_SET(s, &real_readset); - if (errsock != -1) { - FD_SET(errsock, &real_readset); - ++count; - } - if(input) - FD_SET(STDIN_FILENO, &real_readset); - - for (;;) { - int ret; - fd_set readset; - char buf[RSH_BUFSIZ]; - - readset = real_readset; - ret = select (max(s, errsock) + 1, &readset, NULL, NULL, NULL); - if (ret < 0) { - if (errno == EINTR) - continue; - else - err (1, "select"); - } - if (FD_ISSET(s, &readset)) { - ret = do_read (s, buf, sizeof(buf), ivec_in[0]); - if (ret < 0) - err (1, "read"); - else if (ret == 0) { - close (s); - FD_CLR(s, &real_readset); - if (--count == 0) - return 0; - } else - net_write (STDOUT_FILENO, buf, ret); - } - if (errsock != -1 && FD_ISSET(errsock, &readset)) { - ret = do_read (errsock, buf, sizeof(buf), ivec_in[1]); - if (ret < 0) - err (1, "read"); - else if (ret == 0) { - close (errsock); - FD_CLR(errsock, &real_readset); - if (--count == 0) - return 0; - } else - net_write (STDERR_FILENO, buf, ret); - } - if (FD_ISSET(STDIN_FILENO, &readset)) { - ret = read (STDIN_FILENO, buf, sizeof(buf)); - if (ret < 0) - err (1, "read"); - else if (ret == 0) { - close (STDIN_FILENO); - FD_CLR(STDIN_FILENO, &real_readset); - shutdown (s, SHUT_WR); - } else - do_write (s, buf, ret, ivec_out[0]); - } - } -} - -#ifdef KRB5 -/* - * Send forward information on `s' for host `hostname', them being - * forwardable themselves if `forwardable' - */ - -static int -krb5_forward_cred (krb5_auth_context auth_context, - int s, - const char *hostname, - int forwardable) -{ - krb5_error_code ret; - krb5_ccache ccache; - krb5_creds creds; - krb5_kdc_flags flags; - krb5_data out_data; - krb5_principal principal; - - memset (&creds, 0, sizeof(creds)); - - ret = krb5_cc_default (context, &ccache); - if (ret) { - warnx ("could not forward creds: krb5_cc_default: %s", - krb5_get_err_text (context, ret)); - return 1; - } - - ret = krb5_cc_get_principal (context, ccache, &principal); - if (ret) { - warnx ("could not forward creds: krb5_cc_get_principal: %s", - krb5_get_err_text (context, ret)); - return 1; - } - - creds.client = principal; - - ret = krb5_make_principal(context, - &creds.server, - principal->realm, - "krbtgt", - principal->realm, - NULL); - - if (ret) { - warnx ("could not forward creds: krb5_make_principal: %s", - krb5_get_err_text (context, ret)); - return 1; - } - - creds.times.endtime = 0; - - flags.i = 0; - flags.b.forwarded = 1; - flags.b.forwardable = forwardable; - - ret = krb5_get_forwarded_creds (context, - auth_context, - ccache, - flags.i, - hostname, - &creds, - &out_data); - if (ret) { - warnx ("could not forward creds: krb5_get_forwarded_creds: %s", - krb5_get_err_text (context, ret)); - return 1; - } - - ret = krb5_write_message (context, - (void *)&s, - &out_data); - krb5_data_free (&out_data); - - if (ret) - warnx ("could not forward creds: krb5_write_message: %s", - krb5_get_err_text (context, ret)); - return 0; -} - -static int sendauth_version_error; - -static int -send_krb5_auth(int s, - struct sockaddr *thisaddr, - struct sockaddr *thataddr, - const char *hostname, - const char *remote_user, - const char *local_user, - size_t cmd_len, - const char *cmd) -{ - krb5_principal server; - krb5_data cksum_data; - int status; - size_t len; - krb5_auth_context auth_context = NULL; - const char *protocol_string = NULL; - krb5_flags ap_opts; - char *str; - - status = krb5_sname_to_principal(context, - hostname, - "host", - KRB5_NT_SRV_HST, - &server); - if (status) { - warnx ("%s: %s", hostname, krb5_get_err_text(context, status)); - return 1; - } - - if(do_encrypt == -1) { - krb5_appdefault_boolean(context, NULL, - krb5_principal_get_realm(context, server), - "encrypt", - FALSE, - &do_encrypt); - } - - cksum_data.length = asprintf (&str, - "%u:%s%s%s", - ntohs(socket_get_port(thataddr)), - do_encrypt ? "-x " : "", - cmd, - remote_user); - if (str == NULL) { - warnx ("%s: failed to allocate command", hostname); - return 1; - } - cksum_data.data = str; - - ap_opts = 0; - - if(do_encrypt) - ap_opts |= AP_OPTS_MUTUAL_REQUIRED; - - switch(protocol_version) { - case 2: - ap_opts |= AP_OPTS_USE_SUBKEY; - protocol_string = KCMD_NEW_VERSION; - break; - case 1: - protocol_string = KCMD_OLD_VERSION; - key_usage = KRB5_KU_OTHER_ENCRYPTED; - break; - default: - abort(); - } - - status = krb5_sendauth (context, - &auth_context, - &s, - protocol_string, - NULL, - server, - ap_opts, - &cksum_data, - NULL, - NULL, - NULL, - NULL, - NULL); - - /* do this while we have a principal */ - if(do_forward == -1 || do_forwardable == -1) { - krb5_const_realm realm = krb5_principal_get_realm(context, server); - if (do_forwardable == -1) - krb5_appdefault_boolean(context, NULL, realm, - "forwardable", FALSE, - &do_forwardable); - if (do_forward == -1) - krb5_appdefault_boolean(context, NULL, realm, - "forward", FALSE, - &do_forward); - } - - krb5_free_principal(context, server); - krb5_data_free(&cksum_data); - - if (status) { - if(status == KRB5_SENDAUTH_REJECTED && - protocol_version == 2 && protocol_version_str == NULL) - sendauth_version_error = 1; - else - krb5_warn(context, status, "%s", hostname); - return 1; - } - - status = krb5_auth_con_getlocalsubkey (context, auth_context, &keyblock); - if(keyblock == NULL) - status = krb5_auth_con_getkey (context, auth_context, &keyblock); - if (status) { - warnx ("krb5_auth_con_getkey: %s", krb5_get_err_text(context, status)); - return 1; - } - - status = krb5_auth_con_setaddrs_from_fd (context, - auth_context, - &s); - if (status) { - warnx("krb5_auth_con_setaddrs_from_fd: %s", - krb5_get_err_text(context, status)); - return(1); - } - - status = krb5_crypto_init(context, keyblock, 0, &crypto); - if(status) { - warnx ("krb5_crypto_init: %s", krb5_get_err_text(context, status)); - return 1; - } - - len = strlen(remote_user) + 1; - if (net_write (s, remote_user, len) != len) { - warn ("write"); - return 1; - } - if (do_encrypt && net_write (s, "-x ", 3) != 3) { - warn ("write"); - return 1; - } - if (net_write (s, cmd, cmd_len) != cmd_len) { - warn ("write"); - return 1; - } - - if (do_unique_tkfile) { - if (net_write (s, tkfile, strlen(tkfile)) != strlen(tkfile)) { - warn ("write"); - return 1; - } - } - len = strlen(local_user) + 1; - if (net_write (s, local_user, len) != len) { - warn ("write"); - return 1; - } - - if (!do_forward - || krb5_forward_cred (auth_context, s, hostname, do_forwardable)) { - /* Empty forwarding info */ - - u_char zero[4] = {0, 0, 0, 0}; - write (s, &zero, 4); - } - krb5_auth_con_free (context, auth_context); - return 0; -} - -#endif /* KRB5 */ - -static int -send_broken_auth(int s, - struct sockaddr *thisaddr, - struct sockaddr *thataddr, - const char *hostname, - const char *remote_user, - const char *local_user, - size_t cmd_len, - const char *cmd) -{ - size_t len; - - len = strlen(local_user) + 1; - if (net_write (s, local_user, len) != len) { - warn ("write"); - return 1; - } - len = strlen(remote_user) + 1; - if (net_write (s, remote_user, len) != len) { - warn ("write"); - return 1; - } - if (net_write (s, cmd, cmd_len) != cmd_len) { - warn ("write"); - return 1; - } - return 0; -} - -static int -proto (int s, int errsock, - const char *hostname, const char *local_user, const char *remote_user, - const char *cmd, size_t cmd_len, - int (*auth_func)(int s, - struct sockaddr *this, struct sockaddr *that, - const char *hostname, const char *remote_user, - const char *local_user, size_t cmd_len, - const char *cmd)) -{ - int errsock2; - char buf[BUFSIZ]; - char *p; - size_t len; - char reply; - struct sockaddr_storage thisaddr_ss; - struct sockaddr *thisaddr = (struct sockaddr *)&thisaddr_ss; - struct sockaddr_storage thataddr_ss; - struct sockaddr *thataddr = (struct sockaddr *)&thataddr_ss; - struct sockaddr_storage erraddr_ss; - struct sockaddr *erraddr = (struct sockaddr *)&erraddr_ss; - socklen_t addrlen; - int ret; - - addrlen = sizeof(thisaddr_ss); - if (getsockname (s, thisaddr, &addrlen) < 0) { - warn ("getsockname(%s)", hostname); - return 1; - } - addrlen = sizeof(thataddr_ss); - if (getpeername (s, thataddr, &addrlen) < 0) { - warn ("getpeername(%s)", hostname); - return 1; - } - - if (errsock != -1) { - - addrlen = sizeof(erraddr_ss); - if (getsockname (errsock, erraddr, &addrlen) < 0) { - warn ("getsockname"); - return 1; - } - - if (listen (errsock, 1) < 0) { - warn ("listen"); - return 1; - } - - p = buf; - snprintf (p, sizeof(buf), "%u", - ntohs(socket_get_port(erraddr))); - len = strlen(buf) + 1; - if(net_write (s, buf, len) != len) { - warn ("write"); - close (errsock); - return 1; - } - - - for (;;) { - fd_set fdset; - - if (errsock >= FD_SETSIZE || s >= FD_SETSIZE) - errx (1, "fd too large"); - - FD_ZERO(&fdset); - FD_SET(errsock, &fdset); - FD_SET(s, &fdset); - - ret = select (max(errsock, s) + 1, &fdset, NULL, NULL, NULL); - if (ret < 0) { - if (errno == EINTR) - continue; - warn ("select"); - close (errsock); - return 1; - } - if (FD_ISSET(errsock, &fdset)) { - errsock2 = accept (errsock, NULL, NULL); - close (errsock); - if (errsock2 < 0) { - warn ("accept"); - return 1; - } - break; - } - - /* - * there should not arrive any data on this fd so if it's - * readable it probably indicates that the other side when - * away. - */ - - if (FD_ISSET(s, &fdset)) { - warnx ("socket closed"); - close (errsock); - errsock2 = -1; - break; - } - } - } else { - if (net_write (s, "0", 2) != 2) { - warn ("write"); - return 1; - } - errsock2 = -1; - } - - if ((*auth_func)(s, thisaddr, thataddr, hostname, - remote_user, local_user, - cmd_len, cmd)) { - close (errsock2); - return 1; - } - - ret = net_read (s, &reply, 1); - if (ret < 0) { - warn ("read"); - close (errsock2); - return 1; - } else if (ret == 0) { - warnx ("unexpected EOF from %s", hostname); - close (errsock2); - return 1; - } - if (reply != 0) { - - warnx ("Error from rshd at %s:", hostname); - - while ((ret = read (s, buf, sizeof(buf))) > 0) - write (STDOUT_FILENO, buf, ret); - write (STDOUT_FILENO,"\n",1); - close (errsock2); - return 1; - } - - if (sock_debug) { - int one = 1; - if (setsockopt(s, SOL_SOCKET, SO_DEBUG, (void *)&one, sizeof(one)) < 0) - warn("setsockopt remote"); - if (errsock2 != -1 && - setsockopt(errsock2, SOL_SOCKET, SO_DEBUG, - (void *)&one, sizeof(one)) < 0) - warn("setsockopt stderr"); - } - - return rsh_loop (s, errsock2); -} - -/* - * Return in `res' a copy of the concatenation of `argc, argv' into - * malloced space. */ - -static size_t -construct_command (char **res, int argc, char **argv) -{ - int i; - size_t len = 0; - char *tmp; - - for (i = 0; i < argc; ++i) - len += strlen(argv[i]) + 1; - len = max (1, len); - tmp = malloc (len); - if (tmp == NULL) - errx (1, "malloc %lu failed", (unsigned long)len); - - *tmp = '\0'; - for (i = 0; i < argc - 1; ++i) { - strlcat (tmp, argv[i], len); - strlcat (tmp, " ", len); - } - if (argc > 0) - strlcat (tmp, argv[argc-1], len); - *res = tmp; - return len; -} - -static char * -print_addr (const struct sockaddr *sa) -{ - char addr_str[256]; - char *res; - const char *as = NULL; - - if(sa->sa_family == AF_INET) - as = inet_ntop (sa->sa_family, &((struct sockaddr_in*)sa)->sin_addr, - addr_str, sizeof(addr_str)); -#ifdef HAVE_INET6 - else if(sa->sa_family == AF_INET6) - as = inet_ntop (sa->sa_family, &((struct sockaddr_in6*)sa)->sin6_addr, - addr_str, sizeof(addr_str)); -#endif - if(as == NULL) - return NULL; - res = strdup(as); - if (res == NULL) - errx (1, "malloc: out of memory"); - return res; -} - -static int -doit_broken (int argc, - char **argv, - int hostindex, - struct addrinfo *ai, - const char *remote_user, - const char *local_user, - int priv_socket1, - int priv_socket2, - const char *cmd, - size_t cmd_len) -{ - struct addrinfo *a; - - if (connect (priv_socket1, ai->ai_addr, ai->ai_addrlen) < 0) { - int save_errno = errno; - - close(priv_socket1); - close(priv_socket2); - - for (a = ai->ai_next; a != NULL; a = a->ai_next) { - pid_t pid; - char *adr = print_addr(a->ai_addr); - if(adr == NULL) - continue; - - pid = fork(); - if (pid < 0) - err (1, "fork"); - else if(pid == 0) { - char **new_argv; - int i = 0; - - new_argv = malloc((argc + 2) * sizeof(*new_argv)); - if (new_argv == NULL) - errx (1, "malloc: out of memory"); - new_argv[i] = argv[i]; - ++i; - if (hostindex == i) - new_argv[i++] = adr; - new_argv[i++] = "-K"; - for(; i <= argc; ++i) - new_argv[i] = argv[i - 1]; - if (hostindex > 1) - new_argv[hostindex + 1] = adr; - new_argv[argc + 1] = NULL; - execv(PATH_RSH, new_argv); - err(1, "execv(%s)", PATH_RSH); - } else { - int status; - free(adr); - - while(waitpid(pid, &status, 0) < 0) - ; - if(WIFEXITED(status) && WEXITSTATUS(status) == 0) - return 0; - } - } - errno = save_errno; - warn("%s", argv[hostindex]); - return 1; - } else { - int ret; - - ret = proto (priv_socket1, priv_socket2, - argv[hostindex], - local_user, remote_user, - cmd, cmd_len, - send_broken_auth); - return ret; - } -} - -#if defined(KRB5) -static int -doit (const char *hostname, - struct addrinfo *ai, - const char *remote_user, - const char *local_user, - const char *cmd, - size_t cmd_len, - int (*auth_func)(int s, - struct sockaddr *this, struct sockaddr *that, - const char *hostname, const char *remote_user, - const char *local_user, size_t cmd_len, - const char *cmd)) -{ - int error; - struct addrinfo *a; - int socketfailed = 1; - int ret; - - for (a = ai; a != NULL; a = a->ai_next) { - int s; - int errsock; - - s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); - if (s < 0) - continue; - socketfailed = 0; - if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { - char addr[128]; - if(getnameinfo(a->ai_addr, a->ai_addrlen, - addr, sizeof(addr), NULL, 0, NI_NUMERICHOST) == 0) - warn ("connect(%s [%s])", hostname, addr); - else - warn ("connect(%s)", hostname); - close (s); - continue; - } - if (do_errsock) { - struct addrinfo *ea, *eai; - struct addrinfo hints; - - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = a->ai_socktype; - hints.ai_protocol = a->ai_protocol; - hints.ai_family = a->ai_family; - hints.ai_flags = AI_PASSIVE; - - errsock = -1; - - error = getaddrinfo (NULL, "0", &hints, &eai); - if (error) - errx (1, "getaddrinfo: %s", gai_strerror(error)); - for (ea = eai; ea != NULL; ea = ea->ai_next) { - errsock = socket (ea->ai_family, ea->ai_socktype, - ea->ai_protocol); - if (errsock < 0) - continue; - if (bind (errsock, ea->ai_addr, ea->ai_addrlen) < 0) - err (1, "bind"); - break; - } - if (errsock < 0) - err (1, "socket"); - freeaddrinfo (eai); - } else - errsock = -1; - - ret = proto (s, errsock, - hostname, - local_user, remote_user, - cmd, cmd_len, auth_func); - close (s); - return ret; - } - if(socketfailed) - warnx ("failed to contact %s", hostname); - return -1; -} -#endif /* KRB5 */ - -struct getargs args[] = { -#ifdef KRB5 - { "krb5", '5', arg_flag, &use_v5, "Use Kerberos V5" }, - { "forward", 'f', arg_flag, &do_forward, "Forward credentials [krb5]"}, - { "forwardable", 'F', arg_flag, &do_forwardable, - "Forward forwardable credentials [krb5]" }, - { NULL, 'G', arg_negative_flag,&do_forward, "Don't forward credentials" }, - { "unique", 'u', arg_flag, &do_unique_tkfile, - "Use unique remote credentials cache [krb5]" }, - { "tkfile", 'U', arg_string, &unique_tkfile, - "Specifies remote credentials cache [krb5]" }, - { "protocol", 'P', arg_string, &protocol_version_str, - "Protocol version [krb5]", "protocol" }, -#endif - { "broken", 'K', arg_flag, &use_only_broken, "Use only priv port" }, -#if defined(KRB5) - { "encrypt", 'x', arg_flag, &do_encrypt, "Encrypt connection" }, - { NULL, 'z', arg_negative_flag, &do_encrypt, - "Don't encrypt connection", NULL }, -#endif - { NULL, 'd', arg_flag, &sock_debug, "Enable socket debugging" }, - { "input", 'n', arg_negative_flag, &input, "Close stdin" }, - { "port", 'p', arg_string, &port_str, "Use this port", - "port" }, - { "user", 'l', arg_string, &user, "Run as this user", "login" }, - { "stderr", 'e', arg_negative_flag, &do_errsock, "Don't open stderr"}, -#ifdef KRB5 -#endif - { "version", 0, arg_flag, &do_version, NULL }, - { "help", 0, arg_flag, &do_help, NULL } -}; - -static void -usage (int ret) -{ - arg_printusage (args, - sizeof(args) / sizeof(args[0]), - NULL, - "[login@]host [command]"); - exit (ret); -} - -/* - * - */ - -int -main(int argc, char **argv) -{ - int priv_port1, priv_port2; - int priv_socket1, priv_socket2; - int argindex = 0; - int error; - struct addrinfo hints, *ai; - int ret = 1; - char *cmd; - char *tmp; - size_t cmd_len; - const char *local_user; - char *host = NULL; - int host_index = -1; -#ifdef KRB5 - int status; -#endif - uid_t uid; - - priv_port1 = priv_port2 = IPPORT_RESERVED-1; - priv_socket1 = rresvport(&priv_port1); - priv_socket2 = rresvport(&priv_port2); - uid = getuid (); - if (setuid (uid) || (uid != 0 && setuid(0) == 0)) - err (1, "setuid"); - - setprogname (argv[0]); - - if (argc >= 2 && argv[1][0] != '-') { - host = argv[host_index = 1]; - argindex = 1; - } - - if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, - &argindex)) - usage (1); - - if (do_help) - usage (0); - - if (do_version) { - print_version (NULL); - return 0; - } - -#ifdef KRB5 - if(protocol_version_str != NULL) { - if(strcasecmp(protocol_version_str, "N") == 0) - protocol_version = 2; - else if(strcasecmp(protocol_version_str, "O") == 0) - protocol_version = 1; - else { - char *end; - int v; - v = strtol(protocol_version_str, &end, 0); - if(*end != '\0' || (v != 1 && v != 2)) { - errx(1, "unknown protocol version \"%s\"", - protocol_version_str); - } - protocol_version = v; - } - } - - status = krb5_init_context (&context); - if (status) { - if(use_v5 == 1) - errx(1, "krb5_init_context failed: %d", status); - else - use_v5 = 0; - } - - /* request for forwardable on the command line means we should - also forward */ - if (do_forwardable == 1) - do_forward = 1; - -#endif - - if (use_only_broken) { -#ifdef KRB5 - use_v5 = 0; -#endif - } - - if(priv_socket1 < 0) { - if (use_only_broken) - errx (1, "unable to bind reserved port: is rsh setuid root?"); - use_broken = 0; - } - -#if defined(KRB5) - if (do_encrypt == 1 && use_only_broken) - errx (1, "encryption not supported with old style authentication"); -#endif - - - -#ifdef KRB5 - if (do_unique_tkfile && unique_tkfile != NULL) - errx (1, "Only one of -u and -U allowed."); - - if (do_unique_tkfile) - strlcpy(tkfile,"-u ", sizeof(tkfile)); - else if (unique_tkfile != NULL) { - if (strchr(unique_tkfile,' ') != NULL) { - warnx("Space is not allowed in tkfilename"); - usage(1); - } - do_unique_tkfile = 1; - snprintf (tkfile, sizeof(tkfile), "-U %s ", unique_tkfile); - } -#endif - - if (host == NULL) { - if (argc - argindex < 1) - usage (1); - else - host = argv[host_index = argindex++]; - } - - if((tmp = strchr(host, '@')) != NULL) { - *tmp++ = '\0'; - user = host; - host = tmp; - } - - if (argindex == argc) { - close (priv_socket1); - close (priv_socket2); - argv[0] = "rlogin"; - execvp ("rlogin", argv); - err (1, "execvp rlogin"); - } - - local_user = get_default_username (); - if (local_user == NULL) - errx (1, "who are you?"); - - if (user == NULL) - user = local_user; - - cmd_len = construct_command(&cmd, argc - argindex, argv + argindex); - - /* - * Try all different authentication methods - */ - -#ifdef KRB5 - if (ret && use_v5) { - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - - if(port_str == NULL) { - error = getaddrinfo(host, "kshell", &hints, &ai); - if(error == EAI_NONAME) - error = getaddrinfo(host, "544", &hints, &ai); - } else - error = getaddrinfo(host, port_str, &hints, &ai); - - if(error) - errx (1, "getaddrinfo: %s", gai_strerror(error)); - - auth_method = AUTH_KRB5; - again: - ret = doit (host, ai, user, local_user, cmd, cmd_len, - send_krb5_auth); - if(ret != 0 && sendauth_version_error && - protocol_version == 2) { - protocol_version = 1; - goto again; - } - freeaddrinfo(ai); - } -#endif - if (ret && use_broken) { - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - - if(port_str == NULL) { - error = getaddrinfo(host, "shell", &hints, &ai); - if(error == EAI_NONAME) - error = getaddrinfo(host, "514", &hints, &ai); - } else - error = getaddrinfo(host, port_str, &hints, &ai); - - if(error) - errx (1, "getaddrinfo: %s", gai_strerror(error)); - - auth_method = AUTH_BROKEN; - ret = doit_broken (argc, argv, host_index, ai, - user, local_user, - priv_socket1, - do_errsock ? priv_socket2 : -1, - cmd, cmd_len); - freeaddrinfo(ai); - } - free(cmd); - return ret; -} diff --git a/crypto/heimdal/appl/rsh/rsh_locl.h b/crypto/heimdal/appl/rsh/rsh_locl.h deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/rsh_locl.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (c) 1997 - 2004 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_SYS_WAIT_H -#include -#endif -#ifdef HAVE_SYS_SELECT_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_NETINET6_IN6_H -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#endif - -#ifdef HAVE_PWD_H -#include -#endif -#ifdef HAVE_SHADOW_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_LIMITS_H -#include -#endif -#include - -#ifdef HAVE_SYS_PARAM_H -#include -#endif - -#ifdef HAVE_SYSLOG_H -#include -#endif -#ifdef HAVE_PATHS_H -#include -#endif -#include -#include -#include -#ifdef KRB5 -#include -/* XXX */ -struct hx509_certs_data; -struct krb5_pk_identity; -struct krb5_pk_cert; -struct ContentInfo; -struct AlgorithmIdentifier; -struct _krb5_krb_auth_data; -struct krb5_dh_moduli; -struct _krb5_key_data; -struct _krb5_encryption_type; -struct _krb5_key_type; -#include "crypto-headers.h" -#include /* for _krb5_{get,put}_int */ -#endif -#if defined(KRB5) -#include -#endif - -#ifndef _PATH_BSHELL -#define _PATH_BSHELL "/bin/sh" -#endif - -#ifndef _PATH_DEFPATH -#define _PATH_DEFPATH "/usr/bin:/bin" -#endif - -#include "loginpaths.h" - -/* - * - */ - -enum auth_method { AUTH_KRB5, AUTH_BROKEN }; - -extern enum auth_method auth_method; -extern int do_encrypt; -#ifdef KRB5 -extern krb5_context context; -extern krb5_keyblock *keyblock; -extern krb5_crypto crypto; -extern int key_usage; -extern void *ivec_in[2]; -extern void *ivec_out[2]; -void init_ivecs(int, int); -#endif - -#define KCMD_OLD_VERSION "KCMDV0.1" -#define KCMD_NEW_VERSION "KCMDV0.2" - -#define USERNAME_SZ 16 -#ifndef ARG_MAX -#define ARG_MAX 8192 -#endif - -#define RSH_BUFSIZ (5 * 1024) /* MIT kcmd can't handle larger buffers */ -#define RSHD_BUFSIZ (16 * 1024) /* Old maxize for Heimdal 0.4 rsh */ - -#define PATH_RSH BINDIR "/rsh" - -#if defined(KRB5) -ssize_t do_read (int, void*, size_t, void*); -ssize_t do_write (int, void*, size_t, void*); -#else -#define do_write(F, B, L, I) write((F), (B), (L)) -#define do_read(F, B, L, I) read((F), (B), (L)) -#endif diff --git a/crypto/heimdal/appl/rsh/rshd.8 b/crypto/heimdal/appl/rsh/rshd.8 deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/rshd.8 +++ /dev/null @@ -1,161 +0,0 @@ -.\" Copyright (c) 2001 - 2006 Kungliga Tekniska Högskolan -.\" (Royal Institute of Technology, Stockholm, Sweden). -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" 3. Neither the name of the Institute nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $Id$ -.\" -.Dd November 22, 2002 -.Dt RSHD 8 -.Os HEIMDAL -.Sh NAME -.Nm rshd -.Nd remote shell server -.Sh SYNOPSIS -.Nm -.Op Fl aiklnvxPL -.Op Fl p Ar port -.Sh DESCRIPTION -.Nm -is the server for -the -.Xr rsh 1 -program. It provides an authenticated remote command execution -service. Supported options are: -.Bl -tag -width Ds -.It Xo -.Fl n , -.Fl Fl no-keepalive -.Xc -Disables keep-alive messages. -Keep-alives are packets sent at certain intervals to make sure that the -client is still there, even when it doesn't send any data. -.It Xo -.Fl k , -.Fl Fl kerberos -.Xc -Assume that clients connecting to this server will use some form of -Kerberos authentication. See the -.Sx EXAMPLES -section for a sample -.Xr inetd.conf 5 -configuration. -.It Xo -.Fl x , -.Fl Fl encrypt -.Xc -For Kerberos 4 this means that the connections are encrypted. Kerberos -5 can negotiate encryption even without this option, but if it's -present -.Nm -will deny unencrypted connections. This option implies -.Fl k . -.\".It Xo -.\".Fl l , -.\".Fl Fl no-rhosts -.\".Xc -.\"When using old port-based authentication, the user's -.\".Pa .rhosts -.\"files are normally checked. This option disables this. -.It Xo -.Fl v , -.Fl Fl vacuous -.Xc -If the connecting client does not use any Kerberised authentication, -print a message that complains about this fact, and exit. This is -helpful if you want to move away from old port-based authentication. -.It Xo -.Fl P -.Xc -When using the AFS filesystem, users' authentication tokens are put in -something called a PAG (Process Authentication Group). Multiple -processes can share a PAG, but normally each login session has its own -PAG. This option disables the -.Fn setpag -call, so all tokens will be put in the default (uid-based) PAG, making -it possible to share tokens between sessions. This is only useful in -peculiar environments, such as some batch systems. -.It Xo -.Fl i , -.Fl Fl no-inetd -.Xc -The -.Fl i -option will cause -.Nm -to create a socket, instead of assuming that its stdin came from -.Xr inetd 8 . -This is mostly useful for debugging. -.It Xo -.Fl p Ar port , -.Fl Fl port= Ns Ar port -.Xc -Port to use with -.Fl i . -.It Xo -.Fl a -.Xc -This flag is for backwards compatibility only. -.It Xo -.Fl L -.Xc -This flag enables logging of connections to -.Xr syslogd 8 . -This option is always on in this implementation. -.El -.\".Sh ENVIRONMENT -.Sh FILES -.Bl -tag -width /etc/hosts.equiv -compact -.It Pa /etc/hosts.equiv -.It Pa ~/.rhosts -.El -.Sh EXAMPLES -The following can be used to enable Kerberised rsh in -.Xr inetd.cond 5 , -while disabling non-Kerberised connections: -.Bd -literal -shell stream tcp nowait root /usr/libexec/rshd rshd -v -kshell stream tcp nowait root /usr/libexec/rshd rshd -k -ekshell stream tcp nowait root /usr/libexec/rshd rshd -kx -.Ed -.\".Sh DIAGNOSTICS -.Sh SEE ALSO -.Xr rsh 1 , -.Xr iruserok 3 -.\".Sh STANDARDS -.Sh HISTORY -The -.Nm -command appeared in -.Bx 4.2 . -.Sh AUTHORS -This implementation of -.Nm -was written as part of the Heimdal Kerberos 5 implementation. -.\".Sh BUGS diff --git a/crypto/heimdal/appl/rsh/rshd.c b/crypto/heimdal/appl/rsh/rshd.c deleted file mode 100644 --- a/crypto/heimdal/appl/rsh/rshd.c +++ /dev/null @@ -1,979 +0,0 @@ -/* - * Copyright (c) 1997-2007 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "rsh_locl.h" -#include "login_locl.h" -RCSID("$Id$"); - -int -login_access( struct passwd *user, char *from); -int -read_limits_conf(const char *file, const struct passwd *pwd); - -#ifdef NEED_IRUSEROK_PROTO -int iruserok(uint32_t, int, const char *, const char *); -#endif - -enum auth_method auth_method; - -#ifdef KRB5 -krb5_context context; -krb5_keyblock *keyblock; -krb5_crypto crypto; -#endif - -#ifdef KRB5 -krb5_ccache ccache, ccache2; -int kerberos_status = 0; -#endif - -int do_encrypt = 0; - -static int do_unique_tkfile = 0; -static char tkfile[MAXPATHLEN] = ""; - -static int do_inetd = 1; -static char *port_str; -static int do_rhosts = 1; -static int do_kerberos = 0; -#define DO_KRB5 4 -static int do_vacuous = 0; -static int do_log = 1; -static int do_newpag = 1; -static int do_addr_verify = 0; -static int do_keepalive = 1; -static int do_version; -static int do_help = 0; - -static void -syslog_and_die (const char *m, ...) - __attribute__ ((format (printf, 1, 2))); - -static void -syslog_and_die (const char *m, ...) -{ - va_list args; - - va_start(args, m); - vsyslog (LOG_ERR, m, args); - va_end(args); - exit (1); -} - -static void -fatal (int, const char*, const char *, ...) - __attribute__ ((noreturn, format (printf, 3, 4))); - -static void -fatal (int sock, const char *what, const char *m, ...) -{ - va_list args; - char buf[BUFSIZ]; - size_t len; - - *buf = 1; - va_start(args, m); - len = vsnprintf (buf + 1, sizeof(buf) - 1, m, args); - len = min(len, sizeof(buf) - 1); - va_end(args); - if(what != NULL) - syslog (LOG_ERR, "%s: %s: %s", what, strerror(errno), buf + 1); - else - syslog (LOG_ERR, "%s", buf + 1); - net_write (sock, buf, len + 1); - exit (1); -} - -static char * -read_str (int s, size_t sz, char *expl) -{ - char *str = malloc(sz); - char *p = str; - if(str == NULL) - fatal(s, NULL, "%s too long", expl); - while(p < str + sz) { - if(net_read(s, p, 1) != 1) - syslog_and_die("read: %s", strerror(errno)); - if(*p == '\0') - return str; - p++; - } - fatal(s, NULL, "%s too long", expl); -} - -static int -recv_bsd_auth (int s, u_char *buf, - struct sockaddr_in *thisaddr, - struct sockaddr_in *thataddr, - char **client_username, - char **server_username, - char **cmd) -{ - struct passwd *pwd; - - *client_username = read_str (s, USERNAME_SZ, "local username"); - *server_username = read_str (s, USERNAME_SZ, "remote username"); - *cmd = read_str (s, ARG_MAX + 1, "command"); - pwd = getpwnam(*server_username); - if (pwd == NULL) - fatal(s, NULL, "Login incorrect."); - if (iruserok(thataddr->sin_addr.s_addr, pwd->pw_uid == 0, - *client_username, *server_username)) - fatal(s, NULL, "Login incorrect."); - return 0; -} - -#ifdef KRB5 -static int -save_krb5_creds (int s, - krb5_auth_context auth_context, - krb5_principal client) - -{ - int ret; - krb5_data remote_cred; - - krb5_data_zero (&remote_cred); - ret= krb5_read_message (context, (void *)&s, &remote_cred); - if (ret) { - krb5_data_free(&remote_cred); - return 0; - } - if (remote_cred.length == 0) - return 0; - - ret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, &ccache); - if (ret) { - krb5_data_free(&remote_cred); - return 0; - } - - krb5_cc_initialize(context,ccache,client); - ret = krb5_rd_cred2(context, auth_context, ccache, &remote_cred); - if(ret != 0) - syslog(LOG_INFO|LOG_AUTH, - "reading creds: %s", krb5_get_err_text(context, ret)); - krb5_data_free (&remote_cred); - if (ret) - return 0; - return 1; -} - -static void -krb5_start_session (void) -{ - krb5_error_code ret; - char *estr; - - ret = krb5_cc_resolve (context, tkfile, &ccache2); - if (ret) { - estr = krb5_get_error_string(context); - syslog(LOG_WARNING, "resolve cred cache %s: %s", - tkfile, - estr ? estr : krb5_get_err_text(context, ret)); - free(estr); - krb5_cc_destroy(context, ccache); - return; - } - - ret = krb5_cc_copy_cache (context, ccache, ccache2); - if (ret) { - estr = krb5_get_error_string(context); - syslog(LOG_WARNING, "storing credentials: %s", - estr ? estr : krb5_get_err_text(context, ret)); - free(estr); - krb5_cc_destroy(context, ccache); - return ; - } - - krb5_cc_close(context, ccache2); - krb5_cc_destroy(context, ccache); - return; -} - -static int protocol_version; - -static krb5_boolean -match_kcmd_version(const void *data, const char *version) -{ - if(strcmp(version, KCMD_NEW_VERSION) == 0) { - protocol_version = 2; - return TRUE; - } - if(strcmp(version, KCMD_OLD_VERSION) == 0) { - protocol_version = 1; - key_usage = KRB5_KU_OTHER_ENCRYPTED; - return TRUE; - } - return FALSE; -} - - -static int -recv_krb5_auth (int s, u_char *buf, - struct sockaddr *thisaddr, - struct sockaddr *thataddr, - char **client_username, - char **server_username, - char **cmd) -{ - uint32_t len; - krb5_auth_context auth_context = NULL; - krb5_ticket *ticket; - krb5_error_code status; - krb5_data cksum_data; - krb5_principal server; - char *str; - - if (memcmp (buf, "\x00\x00\x00\x13", 4) != 0) - return -1; - len = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | (buf[3]); - - if (net_read(s, buf, len) != len) - syslog_and_die ("reading auth info: %s", strerror(errno)); - if (len != sizeof(KRB5_SENDAUTH_VERSION) - || memcmp (buf, KRB5_SENDAUTH_VERSION, len) != 0) - syslog_and_die ("bad sendauth version: %.8s", buf); - - status = krb5_sock_to_principal (context, - s, - "host", - KRB5_NT_SRV_HST, - &server); - if (status) - syslog_and_die ("krb5_sock_to_principal: %s", - krb5_get_err_text(context, status)); - - status = krb5_recvauth_match_version(context, - &auth_context, - &s, - match_kcmd_version, - NULL, - server, - KRB5_RECVAUTH_IGNORE_VERSION, - NULL, - &ticket); - krb5_free_principal (context, server); - if (status) - syslog_and_die ("krb5_recvauth: %s", - krb5_get_err_text(context, status)); - - *server_username = read_str (s, USERNAME_SZ, "remote username"); - *cmd = read_str (s, ARG_MAX + 1, "command"); - *client_username = read_str (s, ARG_MAX + 1, "local username"); - - if(protocol_version == 2) { - status = krb5_auth_con_getremotesubkey(context, auth_context, - &keyblock); - if(status != 0 || keyblock == NULL) - syslog_and_die("failed to get remote subkey"); - } else if(protocol_version == 1) { - status = krb5_auth_con_getkey (context, auth_context, &keyblock); - if(status != 0 || keyblock == NULL) - syslog_and_die("failed to get key"); - } - if (status != 0 || keyblock == NULL) - syslog_and_die ("krb5_auth_con_getkey: %s", - krb5_get_err_text(context, status)); - - status = krb5_crypto_init(context, keyblock, 0, &crypto); - if(status) - syslog_and_die("krb5_crypto_init: %s", - krb5_get_err_text(context, status)); - - - cksum_data.length = asprintf (&str, - "%u:%s%s", - ntohs(socket_get_port (thisaddr)), - *cmd, - *server_username); - if (str == NULL) - syslog_and_die ("asprintf: out of memory"); - cksum_data.data = str; - - status = krb5_verify_authenticator_checksum(context, - auth_context, - cksum_data.data, - cksum_data.length); - - if (status) - syslog_and_die ("krb5_verify_authenticator_checksum: %s", - krb5_get_err_text(context, status)); - - free (cksum_data.data); - - if (strncmp (*client_username, "-u ", 3) == 0) { - do_unique_tkfile = 1; - memmove (*client_username, *client_username + 3, - strlen(*client_username) - 2); - } - - if (strncmp (*client_username, "-U ", 3) == 0) { - char *end, *temp_tkfile; - - do_unique_tkfile = 1; - if (strncmp (*client_username + 3, "FILE:", 5) == 0) { - temp_tkfile = tkfile; - } else { - strlcpy (tkfile, "FILE:", sizeof(tkfile)); - temp_tkfile = tkfile + 5; - } - end = strchr(*client_username + 3,' '); - if (end == NULL) - syslog_and_die("missing argument after -U"); - snprintf(temp_tkfile, sizeof(tkfile) - (temp_tkfile - tkfile), - "%.*s", - (int)(end - *client_username - 3), - *client_username + 3); - memmove (*client_username, end + 1, strlen(end+1)+1); - } - - kerberos_status = save_krb5_creds (s, auth_context, ticket->client); - - if(!krb5_kuserok (context, - ticket->client, - *server_username)) - fatal (s, NULL, "Permission denied."); - - if (strncmp (*cmd, "-x ", 3) == 0) { - do_encrypt = 1; - memmove (*cmd, *cmd + 3, strlen(*cmd) - 2); - } else { - if(do_encrypt) - fatal (s, NULL, "Encryption is required."); - do_encrypt = 0; - } - - { - char *name; - - if (krb5_unparse_name (context, ticket->client, &name) == 0) { - char addr_str[256]; - - if (inet_ntop (thataddr->sa_family, - socket_get_address (thataddr), - addr_str, sizeof(addr_str)) == NULL) - strlcpy (addr_str, "unknown address", - sizeof(addr_str)); - - syslog(LOG_INFO|LOG_AUTH, - "kerberos v5 shell from %s on %s as %s, cmd '%.80s'", - name, - addr_str, - *server_username, - *cmd); - free (name); - } - } - - krb5_auth_con_free(context, auth_context); - - return 0; -} -#endif /* KRB5 */ - -static void -rshd_loop (int from0, int to0, - int to1, int from1, - int to2, int from2, - int have_errsock) -{ - fd_set real_readset; - int max_fd; - int count = 2; - char *buf; - - if(from0 >= FD_SETSIZE || from1 >= FD_SETSIZE || from2 >= FD_SETSIZE) - errx (1, "fd too large"); - -#ifdef KRB5 - if(auth_method == AUTH_KRB5 && protocol_version == 2) - init_ivecs(0, have_errsock); -#endif - - FD_ZERO(&real_readset); - FD_SET(from0, &real_readset); - FD_SET(from1, &real_readset); - FD_SET(from2, &real_readset); - max_fd = max(from0, max(from1, from2)) + 1; - - buf = malloc(max(RSHD_BUFSIZ, RSH_BUFSIZ)); - if (buf == NULL) - syslog_and_die("out of memory"); - - for (;;) { - int ret; - fd_set readset = real_readset; - - ret = select (max_fd, &readset, NULL, NULL, NULL); - if (ret < 0) { - if (errno == EINTR) - continue; - else - syslog_and_die ("select: %s", strerror(errno)); - } - if (FD_ISSET(from0, &readset)) { - ret = do_read (from0, buf, RSHD_BUFSIZ, ivec_in[0]); - if (ret < 0) - syslog_and_die ("read: %s", strerror(errno)); - else if (ret == 0) { - close (from0); - close (to0); - FD_CLR(from0, &real_readset); - } else - net_write (to0, buf, ret); - } - if (FD_ISSET(from1, &readset)) { - ret = read (from1, buf, RSH_BUFSIZ); - if (ret < 0) - syslog_and_die ("read: %s", strerror(errno)); - else if (ret == 0) { - close (from1); - close (to1); - FD_CLR(from1, &real_readset); - if (--count == 0) - exit (0); - } else - do_write (to1, buf, ret, ivec_out[0]); - } - if (FD_ISSET(from2, &readset)) { - ret = read (from2, buf, RSH_BUFSIZ); - if (ret < 0) - syslog_and_die ("read: %s", strerror(errno)); - else if (ret == 0) { - close (from2); - close (to2); - FD_CLR(from2, &real_readset); - if (--count == 0) - exit (0); - } else - do_write (to2, buf, ret, ivec_out[1]); - } - } -} - -/* - * Used by `setup_copier' to create some pipe-like means of - * communcation. Real pipes would probably be the best thing, but - * then the shell doesn't understand it's talking to rshd. If - * socketpair doesn't work everywhere, some autoconf magic would have - * to be added here. - * - * If it fails creating the `pipe', it aborts by calling fatal. - */ - -static void -pipe_a_like (int fd[2]) -{ - if (socketpair (AF_UNIX, SOCK_STREAM, 0, fd) < 0) - fatal (STDOUT_FILENO, "socketpair", "Pipe creation failed."); -} - -/* - * Start a child process and leave the parent copying data to and from it. */ - -static void -setup_copier (int have_errsock) -{ - int p0[2], p1[2], p2[2]; - pid_t pid; - - pipe_a_like(p0); - pipe_a_like(p1); - pipe_a_like(p2); - pid = fork (); - if (pid < 0) - fatal (STDOUT_FILENO, "fork", "Could not create child process."); - if (pid == 0) { /* child */ - close (p0[1]); - close (p1[0]); - close (p2[0]); - dup2 (p0[0], STDIN_FILENO); - dup2 (p1[1], STDOUT_FILENO); - dup2 (p2[1], STDERR_FILENO); - close (p0[0]); - close (p1[1]); - close (p2[1]); - } else { /* parent */ - close (p0[0]); - close (p1[1]); - close (p2[1]); - - if (net_write (STDOUT_FILENO, "", 1) != 1) - fatal (STDOUT_FILENO, "net_write", "Write failure."); - - rshd_loop (STDIN_FILENO, p0[1], - STDOUT_FILENO, p1[0], - STDERR_FILENO, p2[0], - have_errsock); - } -} - -/* - * Is `port' a ``reserverd'' port? - */ - -static int -is_reserved(u_short port) -{ - return ntohs(port) < IPPORT_RESERVED; -} - -/* - * Set the necessary part of the environment in `env'. - */ - -static void -setup_environment (char ***env, const struct passwd *pwd) -{ - int i, j, path; - char **e; - - i = 0; - path = 0; - *env = NULL; - - i = read_environment(_PATH_ETC_ENVIRONMENT, env); - e = *env; - for (j = 0; j < i; j++) { - if (!strncmp(e[j], "PATH=", 5)) { - path = 1; - } - } - - e = *env; - e = realloc(e, (i + 7) * sizeof(char *)); - - if (asprintf (&e[i++], "USER=%s", pwd->pw_name) == -1) - syslog_and_die ("asprintf: out of memory"); - if (asprintf (&e[i++], "HOME=%s", pwd->pw_dir) == -1) - syslog_and_die ("asprintf: out of memory"); - if (asprintf (&e[i++], "SHELL=%s", pwd->pw_shell) == -1) - syslog_and_die ("asprintf: out of memory"); - if (! path) { - if (asprintf (&e[i++], "PATH=%s", _PATH_DEFPATH) == -1) - syslog_and_die ("asprintf: out of memory"); - } - asprintf (&e[i++], "SSH_CLIENT=only_to_make_bash_happy"); - if (do_unique_tkfile) - if (asprintf (&e[i++], "KRB5CCNAME=%s", tkfile) == -1) - syslog_and_die ("asprintf: out of memory"); - e[i++] = NULL; - *env = e; -} - -static void -doit (void) -{ - u_char buf[BUFSIZ]; - u_char *p; - struct sockaddr_storage thisaddr_ss; - struct sockaddr *thisaddr = (struct sockaddr *)&thisaddr_ss; - struct sockaddr_storage thataddr_ss; - struct sockaddr *thataddr = (struct sockaddr *)&thataddr_ss; - struct sockaddr_storage erraddr_ss; - struct sockaddr *erraddr = (struct sockaddr *)&erraddr_ss; - socklen_t thisaddr_len, thataddr_len; - int port; - int errsock = -1; - char *client_user = NULL, *server_user = NULL, *cmd = NULL; - struct passwd *pwd; - int s = STDIN_FILENO; - char **env; - int ret; - char that_host[NI_MAXHOST]; - - thisaddr_len = sizeof(thisaddr_ss); - if (getsockname (s, thisaddr, &thisaddr_len) < 0) - syslog_and_die("getsockname: %s", strerror(errno)); - thataddr_len = sizeof(thataddr_ss); - if (getpeername (s, thataddr, &thataddr_len) < 0) - syslog_and_die ("getpeername: %s", strerror(errno)); - - /* check for V4MAPPED addresses? */ - - if (do_kerberos == 0 && !is_reserved(socket_get_port(thataddr))) - fatal(s, NULL, "Permission denied."); - - p = buf; - port = 0; - for(;;) { - if (net_read (s, p, 1) != 1) - syslog_and_die ("reading port number: %s", strerror(errno)); - if (*p == '\0') - break; - else if (isdigit(*p)) - port = port * 10 + *p - '0'; - else - syslog_and_die ("non-digit in port number: %c", *p); - } - - if (do_kerberos == 0 && !is_reserved(htons(port))) - fatal(s, NULL, "Permission denied."); - - if (port) { - int priv_port = IPPORT_RESERVED - 1; - - /* - * There's no reason to require a ``privileged'' port number - * here, but for some reason the brain dead rsh clients - * do... :-( - */ - - erraddr->sa_family = thataddr->sa_family; - socket_set_address_and_port (erraddr, - socket_get_address (thataddr), - htons(port)); - - /* - * we only do reserved port for IPv4 - */ - - if (erraddr->sa_family == AF_INET) - errsock = rresvport (&priv_port); - else - errsock = socket (erraddr->sa_family, SOCK_STREAM, 0); - if (errsock < 0) - syslog_and_die ("socket: %s", strerror(errno)); - if (connect (errsock, - erraddr, - socket_sockaddr_size (erraddr)) < 0) { - syslog (LOG_WARNING, "connect: %s", strerror(errno)); - close (errsock); - } - } - - if(do_kerberos) { - if (net_read (s, buf, 4) != 4) - syslog_and_die ("reading auth info: %s", strerror(errno)); - -#ifdef KRB5 - if((do_kerberos & DO_KRB5) && - recv_krb5_auth (s, buf, thisaddr, thataddr, - &client_user, - &server_user, - &cmd) == 0) - auth_method = AUTH_KRB5; - else -#endif /* KRB5 */ - syslog_and_die ("unrecognized auth protocol: %x %x %x %x", - buf[0], buf[1], buf[2], buf[3]); - } else { - if(recv_bsd_auth (s, buf, - (struct sockaddr_in *)thisaddr, - (struct sockaddr_in *)thataddr, - &client_user, - &server_user, - &cmd) == 0) { - auth_method = AUTH_BROKEN; - if(do_vacuous) { - printf("Remote host requires Kerberos authentication\n"); - exit(0); - } - } else - syslog_and_die("recv_bsd_auth failed"); - } - - if (client_user == NULL || server_user == NULL || cmd == NULL) - syslog_and_die("mising client/server/cmd"); - - pwd = getpwnam (server_user); - if (pwd == NULL) - fatal (s, NULL, "Login incorrect."); - - if (*pwd->pw_shell == '\0') - pwd->pw_shell = _PATH_BSHELL; - - if (pwd->pw_uid != 0 && access (_PATH_NOLOGIN, F_OK) == 0) - fatal (s, NULL, "Login disabled."); - - - ret = getnameinfo_verified (thataddr, thataddr_len, - that_host, sizeof(that_host), - NULL, 0, 0); - if (ret) - fatal (s, NULL, "getnameinfo: %s", gai_strerror(ret)); - - if (login_access(pwd, that_host) == 0) { - syslog(LOG_NOTICE, "Kerberos rsh denied to %s from %s", - server_user, that_host); - fatal(s, NULL, "Permission denied."); - } - -#ifdef HAVE_GETSPNAM - { - struct spwd *sp; - long today; - - sp = getspnam(server_user); - if (sp != NULL) { - today = time(0)/(24L * 60 * 60); - if (sp->sp_expire > 0) - if (today > sp->sp_expire) - fatal(s, NULL, "Account has expired."); - } - } -#endif - - -#ifdef HAVE_SETLOGIN - if (setlogin(pwd->pw_name) < 0) - syslog(LOG_ERR, "setlogin() failed: %s", strerror(errno)); -#endif - -#ifdef HAVE_SETPCRED - if (setpcred (pwd->pw_name, NULL) == -1) - syslog(LOG_ERR, "setpcred() failure: %s", strerror(errno)); -#endif /* HAVE_SETPCRED */ - - /* Apply limits if not root */ - if(pwd->pw_uid != 0) { - const char *file = _PATH_LIMITS_CONF; - read_limits_conf(file, pwd); - } - - if (initgroups (pwd->pw_name, pwd->pw_gid) < 0) - fatal (s, "initgroups", "Login incorrect."); - - if (setgid(pwd->pw_gid) < 0) - fatal (s, "setgid", "Login incorrect."); - - if (setuid (pwd->pw_uid) < 0) - fatal (s, "setuid", "Login incorrect."); - - if (chdir (pwd->pw_dir) < 0) - fatal (s, "chdir", "Remote directory."); - - if (errsock >= 0) { - if (dup2 (errsock, STDERR_FILENO) < 0) - fatal (s, "dup2", "Cannot dup stderr."); - close (errsock); - } else { - if (dup2 (STDOUT_FILENO, STDERR_FILENO) < 0) - fatal (s, "dup2", "Cannot dup stderr."); - } - -#ifdef KRB5 - { - int fd; - - if (!do_unique_tkfile) - snprintf(tkfile,sizeof(tkfile),"FILE:/tmp/krb5cc_%lu", - (unsigned long)pwd->pw_uid); - else if (*tkfile=='\0') { - snprintf(tkfile,sizeof(tkfile),"FILE:/tmp/krb5cc_XXXXXX"); - fd = mkstemp(tkfile+5); - close(fd); - unlink(tkfile+5); - } - - if (kerberos_status) - krb5_start_session(); - } -#endif - - setup_environment (&env, pwd); - - if (do_encrypt) { - setup_copier (errsock >= 0); - } else { - if (net_write (s, "", 1) != 1) - fatal (s, "net_write", "write failed"); - } - -#if defined(KRB5) - if(k_hasafs()) { - char cell[64]; - - if(do_newpag) - k_setpag(); - - /* XXX */ - if (kerberos_status) { - krb5_ccache ccache; - krb5_error_code status; - - status = krb5_cc_resolve (context, tkfile, &ccache); - if (!status) { - if (k_afs_cell_of_file (pwd->pw_dir, cell, sizeof(cell)) == 0) - krb5_afslog_uid_home(context, ccache, cell, NULL, - pwd->pw_uid, pwd->pw_dir); - krb5_afslog_uid_home(context, ccache, NULL, NULL, - pwd->pw_uid, pwd->pw_dir); - krb5_cc_close (context, ccache); - } - } - } -#endif /* KRB5 */ - execle (pwd->pw_shell, pwd->pw_shell, "-c", cmd, NULL, env); - err(1, "exec %s", pwd->pw_shell); -} - -struct getargs args[] = { - { NULL, 'a', arg_flag, &do_addr_verify }, - { "keepalive", 'n', arg_negative_flag, &do_keepalive }, - { "inetd", 'i', arg_negative_flag, &do_inetd, - "Not started from inetd" }, -#if defined(KRB5) - { "kerberos", 'k', arg_flag, &do_kerberos, - "Implement kerberised services" }, - { "encrypt", 'x', arg_flag, &do_encrypt, - "Implement encrypted service" }, -#endif - { "rhosts", 'l', arg_negative_flag, &do_rhosts, - "Don't check users .rhosts" }, - { "port", 'p', arg_string, &port_str, "Use this port", - "port" }, - { "vacuous", 'v', arg_flag, &do_vacuous, - "Don't accept non-kerberised connections" }, -#if defined(KRB5) - { NULL, 'P', arg_negative_flag, &do_newpag, - "Don't put process in new PAG" }, -#endif - /* compatibility flag: */ - { NULL, 'L', arg_flag, &do_log }, - { "version", 0, arg_flag, &do_version }, - { "help", 0, arg_flag, &do_help } -}; - -static void -usage (int ret) -{ - if(isatty(STDIN_FILENO)) - arg_printusage (args, - sizeof(args) / sizeof(args[0]), - NULL, - ""); - else - syslog (LOG_ERR, "Usage: %s [-ikxlvPL] [-p port]", getprogname()); - exit (ret); -} - - -int -main(int argc, char **argv) -{ - int optind = 0; - int on = 1; - - setprogname (argv[0]); - roken_openlog ("rshd", LOG_ODELAY | LOG_PID, LOG_AUTH); - - if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, - &optind)) - usage(1); - - if(do_help) - usage (0); - - if (do_version) { - print_version(NULL); - exit(0); - } - -#if defined(KRB5) - if (do_encrypt) - do_kerberos = 1; - - if(do_kerberos) - do_kerberos = DO_KRB5; -#endif - -#ifdef KRB5 - if((do_kerberos & DO_KRB5) && krb5_init_context (&context) != 0) - do_kerberos &= ~DO_KRB5; -#endif - - if (!do_inetd) { - int error; - struct addrinfo *ai = NULL, hints; - char portstr[NI_MAXSERV]; - - memset (&hints, 0, sizeof(hints)); - hints.ai_flags = AI_PASSIVE; - hints.ai_socktype = SOCK_STREAM; - hints.ai_family = PF_UNSPEC; - - if(port_str != NULL) { - error = getaddrinfo (NULL, port_str, &hints, &ai); - if (error) - errx (1, "getaddrinfo: %s", gai_strerror (error)); - } - if (ai == NULL) { -#if defined(KRB5) - if (do_kerberos) { - if (do_encrypt) { - error = getaddrinfo(NULL, "ekshell", &hints, &ai); - if(error == EAI_NONAME) { - snprintf(portstr, sizeof(portstr), "%d", 545); - error = getaddrinfo(NULL, portstr, &hints, &ai); - } - if(error) - errx (1, "getaddrinfo: %s", gai_strerror (error)); - } else { - error = getaddrinfo(NULL, "kshell", &hints, &ai); - if(error == EAI_NONAME) { - snprintf(portstr, sizeof(portstr), "%d", 544); - error = getaddrinfo(NULL, portstr, &hints, &ai); - } - if(error) - errx (1, "getaddrinfo: %s", gai_strerror (error)); - } - } else -#endif - { - error = getaddrinfo(NULL, "shell", &hints, &ai); - if(error == EAI_NONAME) { - snprintf(portstr, sizeof(portstr), "%d", 514); - error = getaddrinfo(NULL, portstr, &hints, &ai); - } - if(error) - errx (1, "getaddrinfo: %s", gai_strerror (error)); - } - } - mini_inetd_addrinfo (ai, NULL); - freeaddrinfo(ai); - } - - if (do_keepalive && - setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, - sizeof(on)) < 0) - syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %s", strerror(errno)); - - /* set SO_LINGER? */ - - signal (SIGPIPE, SIG_IGN); - - doit (); - return 0; -} diff --git a/crypto/heimdal/appl/su/Makefile.am b/crypto/heimdal/appl/su/Makefile.am --- a/crypto/heimdal/appl/su/Makefile.am +++ b/crypto/heimdal/appl/su/Makefile.am @@ -2,8 +2,6 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_krb4) $(INCLUDE_hcrypto) - bin_PROGRAMS = su bin_SUIDS = su su_SOURCES = su.c supaths.h diff --git a/crypto/heimdal/appl/su/Makefile.in b/crypto/heimdal/appl/su/Makefile.in --- a/crypto/heimdal/appl/su/Makefile.in +++ b/crypto/heimdal/appl/su/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,15 +94,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog bin_PROGRAMS = su$(EXEEXT) subdir = appl/su ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -59,8 +109,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -73,6 +122,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -92,6 +142,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -102,25 +153,57 @@ su_OBJECTS = $(am_su_OBJECTS) su_LDADD = $(LDADD) am__DEPENDENCIES_1 = -am__DEPENDENCIES_2 = $(top_builddir)/lib/kafs/libkafs.la \ - $(am__DEPENDENCIES_1) +@NO_AFS_FALSE@am__DEPENDENCIES_2 = \ +@NO_AFS_FALSE@ $(top_builddir)/lib/kafs/libkafs.la \ +@NO_AFS_FALSE@ $(am__DEPENDENCIES_1) su_DEPENDENCIES = $(am__DEPENDENCIES_2) \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/su.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(su_SOURCES) DIST_SOURCES = $(su_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/||"`;; \ @@ -142,15 +225,42 @@ 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 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -165,16 +275,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -184,17 +297,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -213,12 +328,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -227,6 +339,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -243,10 +356,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -254,6 +365,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -268,12 +380,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -290,10 +405,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -304,13 +425,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -334,6 +449,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -357,9 +474,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -369,29 +491,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_krb4) $(INCLUDE_hcrypto) +AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; bin_SUIDS = su su_SOURCES = su.c supaths.h man_MANS = su.1 @@ -405,7 +535,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -418,15 +548,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign appl/su/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign appl/su/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -438,14 +568,19 @@ $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -466,7 +601,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -479,9 +615,10 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -su$(EXEEXT): $(su_OBJECTS) $(su_DEPENDENCIES) + +su$(EXEEXT): $(su_OBJECTS) $(su_DEPENDENCIES) $(EXTRA_su_DEPENDENCIES) @rm -f su$(EXEEXT) - $(LINK) $(su_OBJECTS) $(su_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(su_OBJECTS) $(su_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -489,28 +626,34 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/su.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/su.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -519,11 +662,18 @@ -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -552,30 +702,17 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -587,15 +724,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -604,24 +737,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -672,10 +809,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -692,7 +834,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/su.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -716,9 +858,8 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local + install-html: install-html-am install-html-am: @@ -740,7 +881,7 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/su.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -762,40 +903,54 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libtool ctags \ - dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ - install-man install-man1 install-pdf install-pdf-am install-ps \ +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook 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-man1 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 \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-hook \ uninstall-man uninstall-man1 +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -803,7 +958,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -848,11 +1003,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -860,6 +1024,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -902,6 +1068,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -915,13 +1094,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/appl/su/NTMakefile b/crypto/heimdal/appl/su/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/su/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\su + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/su/su.c b/crypto/heimdal/appl/su/su.c --- a/crypto/heimdal/appl/su/su.c +++ b/crypto/heimdal/appl/su/su.c @@ -57,7 +57,9 @@ #ifdef KRB5 #include #endif +#ifndef NO_AFS #include +#endif #include #include #include @@ -80,19 +82,19 @@ struct getargs args[] = { { "kerberos", 'K', arg_negative_flag, &kerberos_flag, - "don't use kerberos" }, + "don't use kerberos", NULL }, { NULL, 'f', arg_flag, &csh_f_flag, - "don't read .cshrc" }, + "don't read .cshrc", NULL }, { "full", 'l', arg_flag, &full_login, - "simulate full login" }, + "simulate full login", NULL }, { NULL, 'm', arg_flag, &env_flag, - "leave environment unmodified" }, + "leave environment unmodified", NULL }, { "instance", 'i', arg_string, &kerberos_instance, - "root instance to use" }, + "root instance to use", NULL }, { "command", 'c', arg_string, &cmd, - "command to execute" }, - { "help", 'h', arg_flag, &help_flag }, - { "version", 0, arg_flag, &version_flag }, + "command to execute", NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, }; @@ -145,7 +147,7 @@ static int krb5_verify(const struct passwd *login_info, const struct passwd *su_info, - const char *kerberos_instance) + const char *instance) { krb5_error_code ret; krb5_principal p; @@ -176,7 +178,7 @@ if (strcmp (su_info->pw_name, "root") == 0) ret = krb5_make_principal(context, &p, *r, login_name, - kerberos_instance, + instance, NULL); else ret = krb5_make_principal(context, &p, *r, @@ -252,11 +254,13 @@ } esetenv("KRB5CCNAME", cc_name, 1); +#ifndef NO_AFS /* convert creds? */ if(k_hasafs()) { if (k_setpag() == 0) krb5_afslog(context, ccache2, NULL, NULL); } +#endif krb5_cc_close(context, ccache2); krb5_cc_destroy(context, ccache); @@ -299,7 +303,7 @@ if(r != 0) exit(0); pw = crypt(pw_buf, su->pw_passwd); - memset(pw_buf, 0, sizeof(pw_buf)); + memset_s(pw_buf, sizeof(pw_buf), 0, sizeof(pw_buf)); if(strcmp(pw, su->pw_passwd) != 0) { syslog (LOG_ERR | LOG_AUTH, "%s to %s: incorrect password", login->pw_name, su->pw_name); @@ -327,7 +331,7 @@ int main(int argc, char **argv) { - int i, optind = 0; + int i, optidx = 0; char *su_user; struct passwd *su_info; struct passwd *login_info; @@ -340,10 +344,10 @@ setprogname (argv[0]); - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); - for (i=0; i < optind; i++) + for (i=0; i < optidx; i++) if (strcmp(argv[i], "-") == 0) { full_login = 1; break; @@ -355,10 +359,10 @@ print_version(NULL); exit(0); } - if(optind >= argc) + if(optidx >= argc) su_user = "root"; else - su_user = argv[optind++]; + su_user = argv[optidx++]; if (!issuid() && getuid() != 0) warnx("Not setuid and you are not root, expect this to fail"); @@ -374,7 +378,7 @@ if (su_info == NULL) errx (1, "malloc: out of memory"); - pwd = getpwuid(getuid()); + pwd = getpwuid(getuid()); if(pwd == NULL) errx(1, "who are you?"); login_info = dup_info(pwd); @@ -433,8 +437,12 @@ #endif { char *tty = ttyname (STDERR_FILENO); - syslog (LOG_NOTICE | LOG_AUTH, tty ? "%s to %s on %s" : "%s to %s", - login_info->pw_name, su_info->pw_name, tty); + if (tty) + syslog (LOG_NOTICE | LOG_AUTH, "%s to %s on %s", + login_info->pw_name, su_info->pw_name, tty); + else + syslog (LOG_NOTICE | LOG_AUTH, "%s to %s", + login_info->pw_name, su_info->pw_name); } @@ -442,7 +450,7 @@ if(full_login) { char *t = getenv ("TERM"); char **newenv = NULL; - int i, j; + int j; i = read_environment(_PATH_ETC_ENVIRONMENT, &newenv); @@ -473,8 +481,7 @@ } { - int i; - char **args; + char **new_argv; char *p; p = strrchr(shell, '/'); @@ -486,26 +493,27 @@ if (strcmp(p, "csh") != 0) csh_f_flag = 0; - args = malloc(((cmd ? 2 : 0) + 1 + argc - optind + 1 + csh_f_flag) * sizeof(*args)); - if (args == NULL) + new_argv = malloc(((cmd ? 2 : 0) + 1 + argc - optidx + 1 + csh_f_flag) + * sizeof(*new_argv)); + if (new_argv == NULL) err (1, "malloc"); i = 0; if(full_login) { - if (asprintf(&args[i++], "-%s", p) == -1) + if (asprintf(&new_argv[i++], "-%s", p) == -1) errx (1, "malloc"); } else - args[i++] = p; + new_argv[i++] = p; if (cmd) { - args[i++] = "-c"; - args[i++] = cmd; + new_argv[i++] = "-c"; + new_argv[i++] = cmd; } if (csh_f_flag) - args[i++] = "-f"; + new_argv[i++] = "-f"; - for (argv += optind; *argv; ++argv) - args[i++] = *argv; - args[i] = NULL; + for (argv += optidx; *argv; ++argv) + new_argv[i++] = *argv; + new_argv[i] = NULL; if(setgid(su_info->pw_gid) < 0) err(1, "setgid"); @@ -519,7 +527,7 @@ if (ok == 5) krb5_start_session(); #endif - execve(shell, args, environ); + execve(shell, new_argv, environ); } exit(1); diff --git a/crypto/heimdal/appl/su/su.cat1 b/crypto/heimdal/appl/su/su.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/su/su.cat1 @@ -0,0 +1,43 @@ +SU(1) BSD General Commands Manual SU(1) + +NAME + su -- substitute user identity + +SYNOPSIS + su [-K | --no-kerberos] [-f] [-l | --full] [-m] [-i instance | + --instance=instance] [-c command | --command=command] [login [shell + arguments]] + +DESCRIPTION + su will use Kerberos authentication provided that an instance for the + user wanting to change effective UID is present in a file named .k5login + in the target user id's home directory + + A special case exists where `root's' ~/.k5login needs to contain an entry + for: `user/@REALM' for su to succed (where is `root' + unless changed with -i). + + In the absence of either an entry for current user in said file or other + problems like missing `host/hostname@REALM' keys in the system's keytab, + or user typing the wrong password, su will fall back to traditional + /etc/passwd authentication. + + When using /etc/passwd authentication, su allows `root' access only to + members of the group `wheel', or to any user (with knowledge of the + `root' password) if that group does not exist, or has no members. + + The options are as follows: + + -K, --no-kerberos don't use Kerberos. + + -f don't read .cshrc. + + -l, --full simulate full login. + + -m leave environment unmodified. + + -i instance, --instance=instance root instance to use. + + -c command, --command=command command to execute. + +HEIMDAL January 12, 2006 HEIMDAL diff --git a/crypto/heimdal/appl/telnet/ChangeLog b/crypto/heimdal/appl/telnet/ChangeLog deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/ChangeLog +++ /dev/null @@ -1,831 +0,0 @@ -2008-04-27 Love Hörnquist Åstrand - - * libtelnet/enc_des.c: Use RAND_bytes() + DES_is_weak_key() to - generate random DES key. Introdunce random by feeding the des - session key into the random pool when the keys is recived instead - of encrypt the random key with the kerberos key. - - This avoid depenency on DES_new_random_key() that doesn't exists - in OpenSSL. - -2008-04-18 Love Hörnquist Åstrand - - * libtelnet/enc_des.c: No need to call - DES_init_random_number_generator, hcrypto is sane now. - - * libtelnet/enc_des.c: Use DES_new_random_key(). - -2008-04-10 Love Hörnquist Åstrand - - * telnetd/sys_term.c: Really, mac os uses wtmpx (or asl). - -2008-03-09 Love Hörnquist Åstrand - - * telnetd/sys_term.c: Dont need to set this as the controlling PTY - on steams sockets, don't abort on failure. From Harald Barth and - Ian Delahorne. - -2007-12-31 Love Hörnquist Åstrand - - * telnetd/sys_term.c: Use strlcpy instead of strncpy, thanks to - Antoine Brodin. - -2007-07-31 Love Hörnquist Åstrand - - * telnetd/telnetd.c (usage): use exit_code, add --version and - --help. - - * telnetd/telnetd.c: Add --help, reported by David Love. - -2007-07-30 Love Hörnquist Åstrand - - * telnet/main.c: Catch --help, reported by David Love. - -2007-07-12 Love Hörnquist Åstrand - - * telnetd/sys_term.c: GLIBC made the choice that ut_tv should be - shared between 32 and 64 bit platforms so now we can no longer use - struct timeval functions to compare or set/get data that uses - pointer (gettimeofday for example) since ut_tv is now not a struct - timeval but rather a struct { int32_t tv_sec; int32_t tv_usec; }; - -2006-10-21 Love Hörnquist Åstrand - - * telnet/telnet_locl.h: Include roken.h before the local - headerfiles. - - * telnetd/telnetd.h: HP/UX defines SE in sys/uio.h, #undef it. - - * telnetd/sys_term.c: Dont't include some streamspty headers here. - - * telnetd/telnetd.c: Dont't include some streamspty headers here. - - * telnetd/telnetd.h: includes some STREAMSPTY header here to avoid - ioctl vs socket_wrapper horror. - -2006-10-20 Love Hörnquist Åstrand - - * telnet/Makefile.am: more files - - * telnetd/Makefile.am: more files - -2006-09-19 Love Hörnquist Åstrand - - * telnetd/telnetd.8: Add documentation for -e, require encryption. - - * telnetd/telnetd.h: Add require_encryption. - - * telnetd/telnetd.c: Allow encryption to be required, wait to the - client to turn it on, if failes, refuse the connection. - - * telnetd/state.c: If encryption is required, don't allow it to be - turned off. - -2006-09-04 Love Hörnquist Åstrand - - * libtelnet/kerberos5.c (kerberos5_forward): use KDCOptions2int on - flags before passing them to krb5_get_forwarded_creds. - -2006-05-05 Love Hörnquist Åstrand - - * Rename u_intXX_t to uintXX_t - -2006-03-23 Love Hörnquist Åstrand - - * libtelnet/encrypt.c: Spelling. - -2005-12-01 Love Hörnquist Åstrand - - * telnetd/telnetd.c: Initialize the slc mapping table before its - used. Based on bug report from Russell Sanford - - -2005-11-03 Love Hörnquist Åstrand - - * telnet/telnet.c: Spelling in comments, from Dave Love - - -2005-10-31 Love Hörnquist Åstrand - - * libtelnet/kerberos5.c (Data): Use right variable. From Tomas - Olsson - -2005-10-22 Love Hörnquist Åstrand - - * telnet/commands.c: Check return value from asprintf instead of - string != NULL since it undefined behavior on Linux. From Björn - Sandell - - * libtelnet/kerberos5.c: Check return value from asprintf instead - of string != NULL since it undefined behavior on Linux. From Björn - Sandell - - * libtelnet/kerberos.c: Check return value from asprintf instead - of string != NULL since it undefined behavior on Linux. From Björn - Sandell - -2005-08-08 Love Hörnquist Åstrand - - * telnetd/telnetd.c: Fix printing of /etc/issue{,.net}. - - * telnetd/utility.c: make writenet take const void * and size_t, - abort if size it too large - - * telnetd/state.c: Fix ansi c warning. - - * telnetd/sys_term.c: no need to typecast argument to writenet - - * telnetd/ext.h: make writenet take const void * and size_t - -2005-07-07 Assar Westerlund - - * libtelnet/kerberos.c: Do not assume that des_key_schedule is an - array. - -2005-05-27 Love Hörnquist Åstrand - - * libtelnet/kerberos5.c: case uid_t to unsigned long in printf - format - - * telnetd/sys_term.c (set_termbuf): use {} around if to make else - unambiguous - -2005-05-20 Love Hörnquist Åstrand - - * telnetd/sys_term.c (start_login): put utmpx code into a new - scope to avoid pre c99 problems. - -2005-05-19 Dave Love - - * telnet/telnet.c,telnet_locl.h: Make solaris find tgetent - -2005-05-13 Johan Danielsson - - * telnetd/sys_term.c (start_login): set encryption pointers to - NULL, so we don't try to do either - -2005-05-11 Dave Love - - * telnet/telnet.c: undef ISASCII before we define our own (problem - on Irix) - -2005-04-28 Johan Danielsson - - * telnetd/utility.c (putf): %t: the regular and streamspty case - are functionally equivalent, so merge them, this also makes it - work better on machines that puts their devices in a subdirectory - to /dev - -2005-04-27 Dave Love - - * telnetd/sys_term.c (getpty): Declare p. - -2005-04-25 Love Hörnquist Åstrand - - * telnetd/telnetd.c: use strlcpy - -2005-04-24 Love Hörnquist Åstrand - - * telnetd/global.c, telnetd/state.c, telnetd/telnetd.c, - telentd/ext.h: remove another strcpy - -2005-04-19 Love Hörnquist Åstrand - - * telnetd/sys_term.c: rewrite getpty to make use openpty when its - found, save the slave fd so that cleanopen can use it if its - available - -2005-04-07 Love Hörnquist Åstrand - - * telnetd/sys_term.c: clean_ttyname might be unused, mark it so - with __attribute__ - -2005-04-06 Love Hörnquist Åstrand - - * telnetd/sys_term.c: use NULL as last argument to execl, not 0 - - * telnet/commands.c: use NULL as last argument to execl, not 0 - -2005-03-29 Love Hörnquist Åstrand - - * telnet/telnet.c: From FreeBSD: - - Correct a pair of buffer overflows in the telnet(1) command: - - (CAN-2005-0468) A heap buffer overflow in env_opt_add() and related - functions. - - (CAN-2005-0469) A global uninitialized data section buffer overflow in - slc_add_reply() and related functions. - - As a result of these vulnerabilities, it may be possible for a - malicious telnet server or active network attacker to cause - telnet(1) to execute arbitrary code with the privileges of the - user running it. - - Security: CAN-2005-0468, CAN-2005-0469 Security: - FreeBSD-SA-05:01.telnet Security: - http://www.idefense.com/application/poi/display?id=220&type=vulnerabilities - Security: - http://www.idefense.com/application/poi/display?id=221&type=vulnerabilities - - These fixes are based in part on patches Submitted by: Solar - Designer - -2005-03-23 Love Hörnquist Åstrand - - * telnetd/telnetd.c: remove setting of DES_check_key, all code - uses DES_set_key_checked - - * libtelnet/enc_des.c: use DES_set_key_checked - -2005-01-09 Love Hörnquist Åstrand - - * telnet/telnet.c: cast argument to toupper to unsigned char - - * telnet/commands.c: cast argument to is* to unsigned char - -2004-06-20 Love Hörnquist Åstrand - - * telnet/network.c: make network rings larger From: MAAAAA MOOOR - - - * telnetd/state.c: make subbuffer larger XXX resize dynamicly - From: MAAAAA MOOOR - - * libtelnet/kerberos5.c (Data): allocate the data needed to be - send From: MAAAAA MOOOR - -2004-04-02 Love Hörnquist Åstrand - - * telnet/main.c: make encrypt, forwardable, forward use appdefault - (that also searches libdefaults), prompted by Thomas Nystrom - - -2004-03-22 Love Hörnquist Åstrand - - * telnetd/telnetd.c: call setprogname to make libvers happy - - * telnet/main.c: call setprogname to make libvers happy - -2003-09-25 Love Hörnquist Åstrand - - * telnet/externs.h: export Scheduler and scheduler_lockout_tty - - * telnet/telnet.c (my_telnet): if telnet_spin returns failure, - complain that the server disconnected and exit - - * telnet/authenc.c (telnet_spin): if Scheduler() returns failure - (-1) propagate to higher level - -2003-09-03 Love Hörnquist Åstrand - - * telnetd/telnetd.c: use new DES_ api - - * libtelnet/enc_des.c: use new DES_ api - -2003-04-22 Love Hörnquist Åstrand - - * telnet/telnet.1: replace <,> with \*[Lt],\*[Gt] - -2002-09-02 Johan Danielsson - - * libtelnet/kerberos5.c: set AP_OPTS_USE_SUBKEY - -2002-08-28 Johan Danielsson - - * telnet/commands.c: remove extra "Toggle"'s - - * telnet/commands.c: IRIX == 4 -> IRIX4 - - * telnet/main.c: rename functions to what they're really called - - * telnet/commands.c: kill some might be uninitialized warnings - - * telnet/commands.c: add forward and forwardable toggle options, - and call set_forward_options() after parsing .telnetrc - - * telnet/externs.h: proto for set_forward_options - - * telnet/main.c: only register what forwarding options are asked - for when parsing command line, we have to set the actual flags - later after we have read .telnetrc - - * libtelnet/auth-proto.h: kerberos5_set_forward{,able} protos - - * libtelnet/kerberos5.c: add kerberos5_set_forward{,able} - functions suitable for the command parser - -2002-08-23 Assar Westerlund - - * telnetd/telnetd.c: add --version as a special case - * telnet/main.c: add --version as a special case - -2002-05-03 Johan Danielsson - - * telnet/telnet.c: only try to negotiate encryption if we're - talking to a real telnet - -2002-03-31 Johan Danielsson - - * telnet/commands.c: fix an old cut-n-paste typo (via debian) - -2002-02-07 Johan Danielsson - - * telnet/telnet.c: print a more informative message than "done" - after negotiating encryption - -2001-09-17 Assar Westerlund - - * telnetd/telnetd.c: add a kludge to make it build on aix (that - defines NOERROR in both sys/stream.h and arpa/nameser.h and - considers that a fatal error) - - * telnet/telnet.c: undef PUTSHORT to avoid conflict - -2001-08-26 Assar Westerlund - - * telnetd/Makefile.am: also link with the library for logout - -2001-08-22 Assar Westerlund - - * telnetd/sys_term.c: include libutil.h if it exists - -2001-08-10 Assar Westerlund - - * telnetd/sys_term.c (getpty): call openpty if it exists - -2001-07-19 Assar Westerlund - - * telnetd/global.c (output_data): make sure of not forwarding - `nfrontp' too far, thereby allowing writes after the end of - `netobuf' - -2001-06-18 Assar Westerlund - - * libtelnet/kerberos5.c: update to new krb5_auth_con* names - -2001-04-25 Assar Westerlund - - * telnetd/sys_term.c (start_login): give the correct error if exec - fails - * telnetd/utility.c (fatalperror_errno): add a new function with - explicit errno parameter - -2001-03-07 Assar Westerlund - - * telnetd/sys_term.c: some minimal more amount of - const-correctness - -2001-02-24 Assar Westerlund - - * libtelnet/enc_des.c: learn to live with libcrypto (from openssl) - -2001-02-20 Assar Westerlund - - * telnet/commands.c (tn): copy the hostname so it doesn't get - overwritten while reading ~/.telnetrc - (*): removed some unneeded externs - -2001-02-08 Assar Westerlund - - * telnetd/sys_term.c (startslave, start_login): re-write code to - keep track both of remote hostname and utmp string to be used - * telnetd/telnetd.c (doit, my_telnet): re-write code to keep track - both of remote hostname and utmp string to be used - -2001-02-07 Assar Westerlund - - * telnet/Makefile.am, telnetd/Makefile.am: add LIB_kdfs - -2001-01-09 Assar Westerlund - - * libtelnet/kerberos5.c (kerberos5_is): use krb5_rd_cred2 instead - of krb5_rd_cred - -2000-12-31 Assar Westerlund - - * telnet/main.c (krb5_init): check krb5_init_context for success - * libtelnet/kerberos5.c (kerberos5_init): check krb5_init_context - for success - -2000-12-11 Assar Westerlund - - * telnet/commands.c (sourceroute): make it not break if the - rfc2292 api does not exist - -2000-12-09 Assar Westerlund - - * telnetd/sys_term.c (scrub_env): add supporting non-file TERMCAP - variables - -2000-12-07 Assar Westerlund - - * telnetd/telnetd.h: move include files around to avoid getting SE - from sys/*.h on HP to override SE from telnet.h - - * telnetd/sys_term.c (scrub_env): remove some const-ness - * telnetd/sys_term.c (scrub_env): add LOGNAME and POSIXLY_CORRECT - to the list of authorized environment variables to be compatible - with linux-telnetd - - * telnetd/sys_term.c (scrub_env): change filtering algoritm from - allowing everything except a few bad cases to not allowing - anything except a few non-dangerous cases - -2000-12-06 Johan Danielsson - - * libtelnet/kerberos5.c: de-pointerise auth_context parameter to - krb5_mk_rep - -2000-11-23 Johan Danielsson - - * libtelnet/kerberos5.c: print the principal we're trying to use - - * libtelnet/kerberos.c: print the principal we're trying to use - -2000-11-16 Assar Westerlund - - * libtelnet/misc-proto.h (telnet_getenv): const-ize some - -2000-11-08 Johan Danielsson - - * telnet/telnet.c: fake entry if no tgetent - -2000-10-08 Assar Westerlund - - * telnetd/utility.c (stilloob): check that fds are not too large - to select on - (ttloop): remove confusing output of errno - * telnetd/telnetd.c (my_telnet): check that fds are not too large - to select on - * telnet/utilities.c (EmptyTerminal): check that fds are not too - large to select on - * telnet/sys_bsd.c (process_rings): check that fds are not too - large to select on - * telnet/network.c (stilloob): check that fds are not too large to - select on - -2000-06-09 Assar Westerlund - - * telnet/commands.c: remove all setuid(getuid()). we do not - support telnet being setuid root - -2000-05-05 Assar Westerlund - - * telnet/externs.h (sourceroute): update prototype - * telnet/commands.c (tn): re-enable source routing - (sourceroute): make it work again based on the code from - itojun@kame.net - -2000-03-28 Assar Westerlund - - * telnet/commands.c (tn): clean-up a tiny little bit. give-up if - we do not manage to connect to any address - -2000-03-26 Assar Westerlund - - * telnetd/sys_term.c (*): make sure to always call time, ctime, - and gmtime with `time_t's. there were some types (like in - lastlog) that we believed to always be time_t. this has proven - wrong on Solaris 8 in 64-bit mode, where they are stored as 32-bit - quantities but time_t has gone up to 64 bits - -2000-03-03 Assar Westerlund - - * libtelnet/kerberos5.c (kerberos5_init): check that we do have a - keytab before saying that we will support KERBEROS5 - -2000-02-12 Assar Westerlund - - * telnet/commands.c (tn): only set tos for AF_INET. From - itojun@iijlab.net - -2000-02-07 Assar Westerlund - - * libtelnet/kerberos.c (kerberos4_is): send a reject back to the - client when we're not authorized - -2000-02-06 Assar Westerlund - - * telnet/ring.h (ring_encrypt): better proto - * telnet/ring.c (ring_encrypt): better proto - -2000-02-04 Assar Westerlund - - * telnet/telnet_locl.h: klduge-around KLUDGELINEMODE - -2000-01-18 Assar Westerlund - - * libtelnet/misc.c (auth_encrypt_user): const-ify - * libtelnet/misc.h (RemoteHostName, LocalHostName): const-ify - * libtelnet/misc.c (auth_encrypt_init, RemoteHostName, - LocalHostName): const-ify - * libtelnet/misc-proto.h (auth_encrypt_init, auth_encrypt_user): - const-ify - * libtelnet/encrypt.c (encrypt_init, Name): const-ify - * libtelnet/enc-proto.h (encrypt_init): const-ify - * libtelnet/auth.c (auth_init, Name): const-ify - * libtelnet/auth-proto.h (auth_init): const-ify - -2000-01-08 Assar Westerlund - - * telnet/commands.c (tn): handle ai_canonname being set in any of - the addresses returnedby getaddrinfo. glibc apparently returns - the reverse lookup of every address in ai_canonname. remove some - unused variables. - -2000-01-01 Assar Westerlund - - * telnetd/sys_term.c (addarg): make void (return value isn't check - anyway). fatal error when malloc fails - -1999-12-16 Assar Westerlund - - * telnet/commands.c (*): handle ai_canonname not being set - -1999-12-04 Assar Westerlund - - * telnetd/telnetd.c (doit): use getnameinfo_verified - * telnetd/telnetd.c: use getnameinfo - * telnet/commands.c: re-write to using getaddrinfo. disable - source-routing for the moment, it doesn't seem to be used anyways. - -1999-09-16 Assar Westerlund - - * telnet/commands.c: revert 1.54, get_default_username should DTRT - now - -1999-09-05 Assar Westerlund - - * telnetd/utility.c (ttloop): make it return 1 if interrupted by a - signal, which must have been what was meant from the beginning - - * telnetd/ext.h (ttloop): update prototype - - * telnetd/authenc.c (telnet_spin): actually return the value from - ttloop (otherwise it's kind of bogus) - -1999-08-05 Assar Westerlund - - * telnetd/sys_term.c (rmut): free utxp - -1999-08-04 Assar Westerlund - - * telnet/main.c: add -G and config file support. From Miroslav - Ruda - - * telnetd/sys_term.c (rmut): work around utmpx strangness. From - Miroslav Ruda - -1999-08-02 Assar Westerlund - - * telnetd/telnetd.c (doit): only free hp if != NULL. From: Jonas - Oberg - -1999-07-29 Assar Westerlund - - * telnetd/telnetd.c (doit): remove unused variable mapped_sin - -1999-07-26 Assar Westerlund - - * telnetd/ext.h: update prototypes - - * telnetd/telnetd.c: make it handle v4 and v6 sockets. (it - doesn't handle being given a v6 socket that's really talking to an - v4 adress (mapped) because the rest of the code in telnetd is not - able to handle it anyway). please run two telnetd from your - inetd, one for v4 and one for v6. - -1999-07-07 Assar Westerlund - - * telnet/commands.c (tn): extra bogus const-cast - -1999-07-06 Assar Westerlund - - * telnetd/sys_term.c (start_login): print a different warning with - `-a otp' - -1999-06-24 Assar Westerlund - - * libtelnet/kerberos5.c (kerberos5_send): set the addresses in the - auth_context - -1999-06-23 Assar Westerlund - - * telnet/Makefile.am (INCLUDES): add $(INCLUDE_krb4) - - * telnet/commands.c (togkrbdebug): conditionalize on - krb_disable_debug - -1999-06-16 Johan Danielsson - - * telnet/commands.c: add kerberos debugging option - -1999-06-15 Assar Westerlund - - * telnet/commands.c (tn): use get_default_username - -1999-05-14 Assar Westerlund - - * telnetd/state.c (telrcv): magic patch to make it work against - DOS Clarkson Telnet. From Miroslav Ruda - -1999-04-25 Assar Westerlund - - * libtelnet/kerberos5.c (kerberos5_send): use - `krb5_auth_setkeytype' instead of `krb5_auth_setenctype' to make - sure we get a DES session key. - -Thu Apr 1 16:59:27 1999 Johan Danielsson - - * telnetd/Makefile.am: don't run check-local - - * telnet/Makefile.am: don't run check-local - -Mon Mar 29 16:11:33 1999 Johan Danielsson - - * telnetd/sys_term.c: _CRAY -> HAVE_STRUCT_UTMP_UT_ID - -Sat Mar 20 00:12:54 1999 Assar Westerlund - - * telnet/authenc.c (telnet_gets): remove old extern declarations - -Thu Mar 18 11:20:16 1999 Johan Danielsson - - * telnetd/Makefile.am: include Makefile.am.common - - * telnet/Makefile.am: include Makefile.am.common - - * libtelnet/Makefile.am: include Makefile.am.common - - * Makefile.am: include Makefile.am.common - -Mon Mar 15 17:40:53 1999 Johan Danielsson - - * telnetd/telnetd.c: replace perror/exit with fatalperror - -Sat Mar 13 22:18:57 1999 Assar Westerlund - - * telnetd/telnetd.c (main): 0 -> STDIN_FILENO. remove abs - - * libtelnet/kerberos.c (kerberos4_is): syslog root logins - -Thu Mar 11 14:48:54 1999 Johan Danielsson - - * telnetd/Makefile.in: add WFLAGS - - * telnet/Makefile.in: add WFLAGS - - * libtelnet/Makefile.in: add WFLAGS - - * telnetd/sys_term.c: remove unused variables - - * telnet/telnet.c: fix some warnings - - * telnet/main.c: fix some warnings - - * telnet/commands.c: fix types in format string - - * libtelnet/auth.c: fix types in format string - -Mon Mar 1 10:50:30 1999 Johan Danielsson - - * telnetd/sys_term.c: HAVE_UT_* -> HAVE_STRUCT_UTMP*_UT_* - -Mon Feb 1 04:08:36 1999 Assar Westerlund - - * telnet/commands.c (tn): only call gethostbyname2 with AF_INET6 - if we actually have IPv6. From "Brandon S. Allbery KF8NH" - - -Sat Nov 21 16:51:00 1998 Johan Danielsson - - * telnetd/sys_term.c (cleanup): don't call vhangup() on sgi:s - -Fri Aug 14 16:29:18 1998 Johan Danielsson - - * libtelnet/kerberos.c: krb_put_int -> KRB_PUT_INT - -Thu Jul 23 20:29:05 1998 Johan Danielsson - - * libtelnet/kerberos5.c: use krb5_verify_authenticator_checksum - -Mon Jul 13 22:00:09 1998 Assar Westerlund - - * telnet/commands.c (tn): don't advance hostent->h_addr_list, use - a copy instead - -Wed May 27 04:19:17 1998 Assar Westerlund - - * telnet/sys_bsd.c (process_rings): correct call to `stilloob' - -Fri May 15 19:38:19 1998 Johan Danielsson - - * libtelnet/kerberos5.c: Always print errors from mk_req. - -Fri May 1 07:16:59 1998 Assar Westerlund - - * telnet/commands.c: unifdef -DHAVE_H_ERRNO - -Sat Apr 4 15:00:29 1998 Assar Westerlund - - * telnet/commands.c (tn): moved the printing of `trying...' to the - loop - -Thu Mar 12 02:33:48 1998 Assar Westerlund - - * telnet/telnet_locl.h: include . From Gregory S. Stark - - -Sat Feb 21 15:12:38 1998 Assar Westerlund - - * telnetd/ext.h: add prototype for login_tty - - * telnet/utilities.c (printsub): `direction' is now an int. - - * libtelnet/misc-proto.h: add prototype for `printsub' - -Tue Feb 17 02:45:01 1998 Assar Westerlund - - * libtelnet/kerberos.c (kerberos4_is): cred.pname should be - cred.pinst. From - -Sun Feb 15 02:46:39 1998 Assar Westerlund - - * telnet/*/*.c: renamed `telnet' to `my_telnet' to avoid - conflicts with system header files on mklinux. - -Tue Feb 10 02:09:03 1998 Assar Westerlund - - * telnetd/telnetd.c: new signature for `getterminaltype' and - `auth_wait' - - * libtelnet: changed the signature of the authentication method - `status' - -Sat Feb 7 07:21:29 1998 Assar Westerlund - - * */*.c: replace HAS_GETTOS by HAVE_PARSETOS and HAVE_GETTOSBYNAME - -Fri Dec 26 16:17:10 1997 Assar Westerlund - - * telnet/commands.c (tn): repair support for numeric addresses - -Sun Dec 21 09:40:31 1997 Assar Westerlund - - * libtelnet/kerberos.c: fix up lots of stuff related to the - forwarding of v4 tickets. - - * libtelnet/kerberos5.c (kerberos5_forward): zero out `creds'. - -Mon Dec 15 20:53:13 1997 Johan Danielsson - - * telnet/sys_bsd.c: Don't turn off OPOST in 8bit-mode. - -Tue Dec 9 19:26:50 1997 Assar Westerlund - - * telnet/main.c (main): add 'b' to getopt - -Sat Nov 29 03:28:54 1997 Johan Danielsson - - * telnet/telnet.c: Change binary mode to do just that, and add a - eight-bit mode for just passing all characters. - -Sun Nov 16 04:37:02 1997 Assar Westerlund - - * libtelnet/kerberos5.c (kerberos5_send): always ask for a session - key of type DES - - * libtelnet/kerberos5.c: remove old garbage and fix call to - krb5_auth_con_setaddrs_from_fd - -Fri Nov 14 20:35:18 1997 Johan Danielsson - - * telnetd/telnetd.c: Output contents of /etc/issue. - -Mon Nov 3 07:09:16 1997 Assar Westerlund - - * telnet/telnet_locl.h: only include iff - !defined(HAVE_TERMIOS_H) - - * libtelnet/kerberos.c (kerberos4_is): send the peer address to - krb_rd_req - - * telnetd/telnetd.c (terminaltypeok): always return OK. It used - to call `tgetent' to figure if it was a defined terminal type. - It's possible to overflow tgetent so that's a bad idea. The worst - that could happen by saying yes to all terminals is that the user - ends up with a terminal that has no definition on the local - system. And besides, most telnet client has no support for - falling back to a different terminal type. - -Mon Oct 20 05:47:19 1997 Assar Westerlund - - * libtelnet/kerberos5.c: remove lots of old junk. clean-up. - better error checking and reporting. tell the user permission - denied much earlier. - - * libtelnet/kerberos.c (kerberos4_is): only print - UserNameRequested if != NULL - diff --git a/crypto/heimdal/appl/telnet/Makefile.am b/crypto/heimdal/appl/telnet/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -SUBDIRS = libtelnet telnet telnetd - -dist-hook: - $(mkinstalldirs) $(distdir)/arpa - $(INSTALL_DATA) $(srcdir)/arpa/telnet.h $(distdir)/arpa - -EXTRA_DIST = NTMakefile README.ORIG telnet.state diff --git a/crypto/heimdal/appl/telnet/Makefile.in b/crypto/heimdal/appl/telnet/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/Makefile.in +++ /dev/null @@ -1,920 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -subdir = appl/telnet -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/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 -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@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -SUBDIRS = libtelnet telnet telnetd -EXTRA_DIST = NTMakefile README.ORIG telnet.state -all: all-recursive - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/telnet/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/telnet/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): - @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//`; \ - list='$(SUBDIRS)'; 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" - -$(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; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && 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 - -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" - -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 \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - fi; \ - done - @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - 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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-recursive -all-am: Makefile all-local -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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ - ctags-recursive install-am install-data-am install-exec-am \ - install-strip tags-recursive uninstall-am - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool ctags ctags-recursive dist-hook \ - 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-data-hook \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook 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 uninstall-hook - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -dist-hook: - $(mkinstalldirs) $(distdir)/arpa - $(INSTALL_DATA) $(srcdir)/arpa/telnet.h $(distdir)/arpa - -# 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: diff --git a/crypto/heimdal/appl/telnet/README.ORIG b/crypto/heimdal/appl/telnet/README.ORIG deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/README.ORIG +++ /dev/null @@ -1,743 +0,0 @@ - -This is a distribution of both client and server telnet. These programs -have been compiled on: - telnet telnetd - 4.4 BSD-Lite x x - 4.3 BSD Reno X X - UNICOS 9.1 X X - UNICOS 9.0 X X - UNICOS 8.0 X X - BSDI 2.0 X X - Solaris 2.4 x x (no linemode in server) - SunOs 4.1.4 X X (no linemode in server) - Ultrix 4.3 X X (no linemode in server) - Ultrix 4.1 X X (no linemode in server) - -In addition, previous versions have been compiled on the following -machines, but were not available for testing this version. - telnet telnetd - Next1.0 X X - UNICOS 8.3 X X - UNICOS 7.C X X - UNICOS 7.0 X X - SunOs 4.0.3c X X (no linemode in server) - 4.3 BSD X X (no linemode in server) - DYNIX V3.0.12 X X (no linemode in server) - Ultrix 3.1 X X (no linemode in server) - Ultrix 4.0 X X (no linemode in server) - SunOs 3.5 X X (no linemode in server) - SunOs 4.1.3 X X (no linemode in server) - Solaris 2.2 x x (no linemode in server) - Solaris 2.3 x x (no linemode in server) - BSDI 1.0 X X - BSDI 1.1 X X - DYNIX V3.0.17.9 X X (no linemode in server) - HP-UX 8.0 x x (no linemode in server) - -This code should work, but there are no guarantees. - -May 30, 1995 - -This release represents what is on the 4.4BSD-Lite2 release, which -should be the final BSD release. I will continue to support of -telnet, The code (without encryption) is available via anonymous ftp -from ftp.cray.com, in src/telnet/telnet.YY.MM.DD.NE.tar.Z, where -YY.MM.DD is replaced with the year, month and day of the release. -If you can't find it at one of these places, at some point in the -near future information about the latest releases should be available -from ftp.borman.com. - -In addition, the version with the encryption code is available via -ftp from net-dist.mit.edu, in the directory /pub/telnet. There -is a README file there that gives further information on how -to get the distribution. - -Questions, comments, bug reports and bug fixes can be sent to -one of these addresses: - dab@borman.com - dab@cray.com - dab@bsdi.com - -This release is mainly bug fixes and code cleanup. - - Replace all calls to bcopy()/bzero() with calls to - memmove()/memset() and all calls to index()/rindex() - with calls to strchr()/strrchr(). - - Add some missing diagnostics for option tracing - to telnetd. - - Add support for BSDI 2.0 and Solaris 2.4. - - Add support for UNICOS 8.0 - - Get rid of expanded tabs and trailing white spaces. - - From Paul Vixie: - Fix for telnet going into an endless spin - when the session dies abnormally. - - From Jef Poskanzer: - Changes to allow telnet to compile - under SunOS 3.5. - - From Philip Guenther: - makeutx() doesn't expand utmpx, - use pututxline() instead. - - From Chris Torek: - Add a sleep(1) before execing login - to avoid race condition that can eat - up the login prompt. - Use terminal speed directly if it is - not an encoded value. - - From Steve Parker: - Fix to realloc() call. Fix for execing - login on solaris with no user name. - -January 19, 1994 - -This is a list of some of the changes since the last tar release -of telnet/telnetd. There are probably other changes that aren't -listed here, but this should hit a lot of the main ones. - - General: - Changed #define for AUTHENTICATE to AUTHENTICATION - Changed #define for ENCRYPT to ENCRYPTION - Changed #define for DES_ENCRYPT to DES_ENCRYPTION - - Added support for SPX authentication: -DSPX - - Added support for Kerberos Version 5 authentication: -DKRB5 - - Added support for ANSI C function prototypes - - Added support for the NEW-ENVIRON option (RFC-1572) - including support for USERVAR. - - Made support for the old Environment Option (RFC-1408) - conditional on -DOLD_ENVIRON - - Added #define ENV_HACK - support for RFC 1571 - - The encryption code is removed from the public distributions. - Domestic 4.4 BSD distributions contain the encryption code. - - ENV_HACK: Code to deal with systems that only implement - the old ENVIRON option, and have reversed definitions - of ENV_VAR and ENV_VAL. Also fixes ENV processing in - client to handle things besides just the default set... - - NO_BSD_SETJMP: UNICOS configuration for - UNICOS 6.1/6.0/5.1/5.0 systems. - - STREAMSPTY: Use /dev/ptmx to get a clean pty. This - is for SVr4 derivatives (Like Solaris) - - UTMPX: For systems that have /etc/utmpx. This is for - SVr4 derivatives (Like Solaris) - - Definitions for BSDI 1.0 - - Definitions for 4.3 Reno and 4.4 BSD. - - Definitions for UNICOS 8.0 and UNICOS 7.C - - Definitions for Solaris 2.0 - - Definitions for HP-UX 8.0 - - Latest Copyright notices from Berkeley. - - FLOW-CONTROL: support for RFC-XXXx - - - Client Specific: - - Fix the "send" command to not send garbage... - - Fix status message for "skiprc" - - Make sure to send NAWS after telnet has been suspended - or an external command has been run, if the window size - has changed. - - sysV88 support. - - Server Specific: - - Support flowcontrol option in non-linemode servers. - - -k Server supports Kludge Linemode, but will default to - either single character mode or real Linemode support. - The user will have to explicitly ask to switch into - kludge linemode. ("stty extproc", or escape back to - to telnet and say "mode line".) - - -u Specify the length of the hostname field in the utmp - file. Hostname longer than this length will be put - into the utmp file in dotted decimal notation, rather - than putting in a truncated hostname. - - -U Registered hosts only. If a reverse hostname lookup - fails, the connection will be refused. - - -f/-F - Allows forwarding of credentials for KRB5. - -Februrary 22, 1991: - - Features: - - This version of telnet/telnetd has support for both - the AUTHENTICATION and ENCRYPTION options. The - AUTHENTICATION option is fairly well defined, and - an option number has been assigned to it. The - ENCRYPTION option is still in a state of flux; an - option number has been assigned to, but it is still - subject to change. The code is provided in this release - for experimental and testing purposes. - - The telnet "send" command can now be used to send - do/dont/will/wont commands, with any telnet option - name. The rules for when do/dont/will/wont are sent - are still followed, so just because the user requests - that one of these be sent doesn't mean that it will - be sent... - - The telnet "getstatus" command no longer requires - that option printing be enabled to see the response - to the "DO STATUS" command. - - A -n flag has been added to telnetd to disable - keepalives. - - A new telnet command, "auth" has been added (if - AUTHENTICATE is defined). It has four sub-commands, - "status", "disable", "enable" and "help". - - A new telnet command, "encrypt" has been added (if - ENCRYPT is defined). It has many sub-commands: - "enable", "type", "start", "stop", "input", - "-input", "output", "-output", "status", and "help". - - The LOGOUT option is now supported by both telnet - and telnetd, a new command, "logout", was added - to support this. - - Several new toggle options were added: - "autoencrypt", "autodecrypt", "autologin", "authdebug", - "encdebug", "skiprc", "verbose_encrypt" - - An "rlogin" interface has been added. If the program - is named "rlogin", or the "-r" flag is given, then - an rlogin type of interface will be used. - ~. Terminates the session - ~ Suspend the session - ~^] Escape to telnet command mode - ~~ Pass through the ~. - BUG: If you type the rlogin escape character - in the middle of a line while in rlogin - mode, you cannot erase it or any characters - before it. Hopefully this can be fixed - in a future release... - - General changes: - - A "libtelnet.a" has now been created. This libraray - contains code that is common to both telnet and - telnetd. This is also where library routines that - are needed, but are not in the standard C library, - are placed. - - The makefiles have been re-done. All of the site - specific configuration information has now been put - into a single "Config.generic" file, in the top level - directory. Changing this one file will take care of - all three subdirectories. Also, to add a new/local - definition, a "Config.local" file may be created - at the top level; if that file exists, the subdirectories - will use that file instead of "Config.generic". - - Many 1-2 line functions in commands.c have been - removed, and just inserted in-line, or replaced - with a macro. - - Bug Fixes: - - The non-termio code in both telnet and telnetd was - setting/clearing CTLECH in the sg_flags word. This - was incorrect, and has been changed to set/clear the - LCTLECH bit in the local mode word. - - The SRCRT #define has been removed. If IP_OPTIONS - and IPPROTO_IP are defined on the system, then the - source route code is automatically enabled. - - The NO_GETTYTAB #define has been removed; there - is a compatability routine that can be built into - libtelnet to achive the same results. - - The server, telnetd, has been switched to use getopt() - for parsing the argument list. - - The code for getting the input/output speeds via - cfgetispeed()/cfgetospeed() was still not quite - right in telnet. Posix says if the ispeed is 0, - then it is really equal to the ospeed. - - The suboption processing code in telnet now has - explicit checks to make sure that we received - the entire suboption (telnetd was already doing this). - - The telnet code for processing the terminal type - could cause a core dump if an existing connection - was closed, and a new connection opened without - exiting telnet. - - Telnetd was doing a TCSADRAIN when setting the new - terminal settings; This is not good, because it means - that the tcsetattr() will hang waiting for output to - drain, and telnetd is the only one that will drain - the output... The fix is to use TCSANOW which does - not wait. - - Telnetd was improperly setting/clearing the ISTRIP - flag in the c_lflag field, it should be using the - c_iflag field. - - When the child process of telnetd was opening the - slave side of the pty, it was re-setting the EXTPROC - bit too early, and some of the other initialization - code was wiping it out. This would cause telnetd - to go out of linemode and into single character mode. - - One instance of leaving linemode in telnetd forgot - to send a WILL ECHO to the client, the net result - would be that the user would see double character - echo. - - If the MODE was being changed several times very - quickly, telnetd could get out of sync with the - state changes and the returning acks; and wind up - being left in the wrong state. - -September 14, 1990: - - Switch the client to use getopt() for parsing the - argument list. The 4.3Reno getopt.c is included for - systems that don't have getopt(). - - Use the posix _POSIX_VDISABLE value for what value - to use when disabling special characters. If this - is undefined, it defaults to 0x3ff. - - For non-termio systems, TIOCSETP was being used to - change the state of the terminal. This causes the - input queue to be flushed, which we don't want. This - is now changed to TIOCSETN. - - Take out the "#ifdef notdef" around the code in the - server that generates a "sync" when the pty oputput - is flushed. The potential problem is that some older - telnet clients may go into an infinate loop when they - receive a "sync", if so, the server can be compiled - with "NO_URGENT" defined. - - Fix the client where it was setting/clearing the OPOST - bit in the c_lflag field, not the c_oflag field. - - Fix the client where it was setting/clearing the ISTRIP - bit in the c_lflag field, not the c_iflag field. (On - 4.3Reno, this is the ECHOPRT bit in the c_lflag field.) - The client also had its interpretation of WILL BINARY - and DO BINARY reversed. - - Fix a bug in client that would cause a core dump when - attempting to remove the last environment variable. - - In the client, there were a few places were switch() - was being passed a character, and if it was a negative - value, it could get sign extended, and not match - the 8 bit case statements. The fix is to and the - switch value with 0xff. - - Add a couple more printoption() calls in the client, I - don't think there are any more places were a telnet - command can be received and not printed out when - "options" is on. - - A new flag has been added to the client, "-a". Currently, - this just causes the USER name to be sent across, in - the future this may be used to signify that automatic - authentication is requested. - - The USER variable is now only sent by the client if - the "-a" or "-l user" options are explicity used, or - if the user explicitly asks for the "USER" environment - variable to be exported. In the server, if it receives - the "USER" environment variable, it won't print out the - banner message, so that only "Password:" will be printed. - This makes the symantics more like rlogin, and should be - more familiar to the user. (People are not used to - getting a banner message, and then getting just a - "Password:" prompt.) - - Re-vamp the code for starting up the child login - process. The code was getting ugly, and it was - hard to tell what was really going on. What we - do now is after the fork(), in the child: - 1) make sure we have no controlling tty - 2) open and initialize the tty - 3) do a setsid()/setpgrp() - 4) makes the tty our controlling tty. - On some systems, #2 makes the tty our controlling - tty, and #4 is a no-op. The parent process does - a gets rid of any controlling tty after the child - is fork()ed. - - Use the strdup() library routine in telnet, instead - of the local savestr() routine. If you don't have - strdup(), you need to define NO_STRDUP. - - Add support for ^T (SIGINFO/VSTATUS), found in the - 4.3Reno distribution. This maps to the AYT character. - You need a 4-line bugfix in the kernel to get this - to work properly: - - > *** tty_pty.c.ORG Tue Sep 11 09:41:53 1990 - > --- tty_pty.c Tue Sep 11 17:48:03 1990 - > *************** - > *** 609,613 **** - > if ((tp->t_lflag&NOFLSH) == 0) - > ttyflush(tp, FREAD|FWRITE); - > ! pgsignal(tp->t_pgrp, *(unsigned int *)data); - > return(0); - > } - > --- 609,616 ---- - > if ((tp->t_lflag&NOFLSH) == 0) - > ttyflush(tp, FREAD|FWRITE); - > ! pgsignal(tp->t_pgrp, *(unsigned int *)data, 1); - > ! if ((*(unsigned int *)data == SIGINFO) && - > ! ((tp->t_lflag&NOKERNINFO) == 0)) - > ! ttyinfo(tp); - > return(0); - > } - - The client is now smarter when setting the telnet escape - character; it only sets it to one of VEOL and VEOL2 if - one of them is undefined, and the other one is not already - defined to the telnet escape character. - - Handle TERMIOS systems that have seperate input and output - line speed settings imbedded in the flags. - - Many other minor bug fixes. - -June 20, 1990: - Re-organize makefiles and source tree. The telnet/Source - directory is now gone, and all the source that was in - telnet/Source is now just in the telnet directory. - - Seperate makefile for each system are now gone. There - are two makefiles, Makefile and Makefile.generic. - The "Makefile" has the definitions for the various - system, and "Makefile.generic" does all the work. - There is a variable called "WHAT" that is used to - specify what to make. For example, in the telnet - directory, you might say: - make 4.4bsd WHAT=clean - to clean out the directory. - - Add support for the ENVIRON and XDISPLOC options. - In order for the server to work, login has to have - the "-p" option to preserve environment variables. - - Add the SOFT_TAB and LIT_ECHO modes in the LINEMODE support. - - Add the "-l user" option to command line and open command - (This is passed through the ENVIRON option). - - Add the "-e" command line option, for setting the escape - character. - - Add the "-D", diagnostic, option to the server. This allows - the server to print out debug information, which is very - useful when trying to debug a telnet that doesn't have any - debugging ability. - - Turn off the literal next character when not in LINEMODE. - - Don't recognize ^Y locally, just pass it through. - - Make minor modifications for Sun4.0 and Sun4.1 - - Add support for both FORW1 and FORW2 characters. The - telnet escpape character is set to whichever of the - two is not being used. If both are in use, the escape - character is not set, so when in linemode the user will - have to follow the escape character with a or - -libtelnet/Makefile.4.4: -telnet/Makefile.4.4: -telnetd/Makefile.4.4: - These are the makefiles that can be used on a 4.3Reno - system when this software is installed in /usr/src/lib/libtelnet, - /usr/src/libexec/telnetd, and /usr/src/usr.bin/telnet. - - -The following TELNET options are supported: - - LINEMODE: - The LINEMODE option is supported as per RFC1116. The - FORWARDMASK option is not currently supported. - - BINARY: The client has the ability to turn on/off the BINARY - option in each direction. Turning on BINARY from - server to client causes the LITOUT bit to get set in - the terminal driver on both ends, turning on BINARY - from the client to the server causes the PASS8 bit - to get set in the terminal driver on both ends. - - TERMINAL-TYPE: - This is supported as per RFC1091. On the server side, - when a terminal type is received, termcap/terminfo - is consulted to determine if it is a known terminal - type. It keeps requesting terminal types until it - gets one that it recongnizes, or hits the end of the - list. The server side looks up the entry in the - termcap/terminfo data base, and generates a list of - names which it then passes one at a time to each - request for a terminal type, duplicating the last - entry in the list before cycling back to the beginning. - - NAWS: The Negotiate about Window Size, as per RFC 1073. - - TERMINAL-SPEED: - Implemented as per RFC 1079 - - TOGGLE-FLOW-CONTROL: - Implemented as per RFC 1080 - - TIMING-MARK: - As per RFC 860 - - SGA: As per RFC 858 - - ECHO: As per RFC 857 - - LOGOUT: As per RFC 727 - - STATUS: - The server will send its current status upon - request. It does not ask for the clients status. - The client will request the servers current status - from the "send getstatus" command. - - ENVIRON: - This option is currently being defined by the IETF - Telnet Working Group, and an RFC has not yet been - issued, but should be in the near future... - - X-DISPLAY-LOCATION: - This functionality can be done through the ENVIRON - option, it is added here for completeness. - - AUTHENTICATION: - This option is currently being defined by the IETF - Telnet Working Group, and an RFC has not yet been - issued. The basic framework is pretty much decided, - but the definitions for the specific authentication - schemes is still in a state of flux. - - ENCRYPTION: - This option is currently being defined by the IETF - Telnet Working Group, and an RFC has not yet been - issued. The draft RFC is still in a state of flux, - so this code may change in the future. diff --git a/crypto/heimdal/appl/telnet/arpa/telnet.h b/crypto/heimdal/appl/telnet/arpa/telnet.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/arpa/telnet.h +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright (c) 1983, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)telnet.h 8.2 (Berkeley) 12/15/93 - */ - -#ifndef _TELNET_H_ -#define _TELNET_H_ - -/* - * Definitions for the TELNET protocol. - */ -#define IAC 255 /* interpret as command: */ -#define DONT 254 /* you are not to use option */ -#define DO 253 /* please, you use option */ -#define WONT 252 /* I won't use option */ -#define WILL 251 /* I will use option */ -#define SB 250 /* interpret as subnegotiation */ -#define GA 249 /* you may reverse the line */ -#define EL 248 /* erase the current line */ -#define EC 247 /* erase the current character */ -#define AYT 246 /* are you there */ -#define AO 245 /* abort output--but let prog finish */ -#define IP 244 /* interrupt process--permanently */ -#define BREAK 243 /* break */ -#define DM 242 /* data mark--for connect. cleaning */ -#define NOP 241 /* nop */ -#define SE 240 /* end sub negotiation */ -#define EOR 239 /* end of record (transparent mode) */ -#define ABORT 238 /* Abort process */ -#define SUSP 237 /* Suspend process */ -#define xEOF 236 /* End of file: EOF is already used... */ - -#define SYNCH 242 /* for telfunc calls */ - -#ifdef TELCMDS -char *telcmds[] = { - "EOF", "SUSP", "ABORT", "EOR", - "SE", "NOP", "DMARK", "BRK", "IP", "AO", "AYT", "EC", - "EL", "GA", "SB", "WILL", "WONT", "DO", "DONT", "IAC", 0, -}; -#else -extern char *telcmds[]; -#endif - -#define TELCMD_FIRST xEOF -#define TELCMD_LAST IAC -#define TELCMD_OK(x) ((unsigned int)(x) <= TELCMD_LAST && \ - (unsigned int)(x) >= TELCMD_FIRST) -#define TELCMD(x) telcmds[(x)-TELCMD_FIRST] - -/* telnet options */ -#define TELOPT_BINARY 0 /* 8-bit data path */ -#define TELOPT_ECHO 1 /* echo */ -#define TELOPT_RCP 2 /* prepare to reconnect */ -#define TELOPT_SGA 3 /* suppress go ahead */ -#define TELOPT_NAMS 4 /* approximate message size */ -#define TELOPT_STATUS 5 /* give status */ -#define TELOPT_TM 6 /* timing mark */ -#define TELOPT_RCTE 7 /* remote controlled transmission and echo */ -#define TELOPT_NAOL 8 /* negotiate about output line width */ -#define TELOPT_NAOP 9 /* negotiate about output page size */ -#define TELOPT_NAOCRD 10 /* negotiate about CR disposition */ -#define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */ -#define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */ -#define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */ -#define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */ -#define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */ -#define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */ -#define TELOPT_XASCII 17 /* extended ascic character set */ -#define TELOPT_LOGOUT 18 /* force logout */ -#define TELOPT_BM 19 /* byte macro */ -#define TELOPT_DET 20 /* data entry terminal */ -#define TELOPT_SUPDUP 21 /* supdup protocol */ -#define TELOPT_SUPDUPOUTPUT 22 /* supdup output */ -#define TELOPT_SNDLOC 23 /* send location */ -#define TELOPT_TTYPE 24 /* terminal type */ -#define TELOPT_EOR 25 /* end or record */ -#define TELOPT_TUID 26 /* TACACS user identification */ -#define TELOPT_OUTMRK 27 /* output marking */ -#define TELOPT_TTYLOC 28 /* terminal location number */ -#define TELOPT_3270REGIME 29 /* 3270 regime */ -#define TELOPT_X3PAD 30 /* X.3 PAD */ -#define TELOPT_NAWS 31 /* window size */ -#define TELOPT_TSPEED 32 /* terminal speed */ -#define TELOPT_LFLOW 33 /* remote flow control */ -#define TELOPT_LINEMODE 34 /* Linemode option */ -#define TELOPT_XDISPLOC 35 /* X Display Location */ -#define TELOPT_OLD_ENVIRON 36 /* Old - Environment variables */ -#define TELOPT_AUTHENTICATION 37/* Authenticate */ -#define TELOPT_ENCRYPT 38 /* Encryption option */ -#define TELOPT_NEW_ENVIRON 39 /* New - Environment variables */ -#define TELOPT_EXOPL 255 /* extended-options-list */ - - -#define NTELOPTS (1+TELOPT_NEW_ENVIRON) -#ifdef TELOPTS -char *telopts[NTELOPTS+1] = { - "BINARY", "ECHO", "RCP", "SUPPRESS GO AHEAD", "NAME", - "STATUS", "TIMING MARK", "RCTE", "NAOL", "NAOP", - "NAOCRD", "NAOHTS", "NAOHTD", "NAOFFD", "NAOVTS", - "NAOVTD", "NAOLFD", "EXTEND ASCII", "LOGOUT", "BYTE MACRO", - "DATA ENTRY TERMINAL", "SUPDUP", "SUPDUP OUTPUT", - "SEND LOCATION", "TERMINAL TYPE", "END OF RECORD", - "TACACS UID", "OUTPUT MARKING", "TTYLOC", - "3270 REGIME", "X.3 PAD", "NAWS", "TSPEED", "LFLOW", - "LINEMODE", "XDISPLOC", "OLD-ENVIRON", "AUTHENTICATION", - "ENCRYPT", "NEW-ENVIRON", - 0, -}; -#define TELOPT_FIRST TELOPT_BINARY -#define TELOPT_LAST TELOPT_NEW_ENVIRON -#define TELOPT_OK(x) ((unsigned int)(x) <= TELOPT_LAST) -#define TELOPT(x) telopts[(x)-TELOPT_FIRST] -#endif - -/* sub-option qualifiers */ -#define TELQUAL_IS 0 /* option is... */ -#define TELQUAL_SEND 1 /* send option */ -#define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */ -#define TELQUAL_REPLY 2 /* AUTHENTICATION: client version of IS */ -#define TELQUAL_NAME 3 /* AUTHENTICATION: client version of IS */ - -#define LFLOW_OFF 0 /* Disable remote flow control */ -#define LFLOW_ON 1 /* Enable remote flow control */ -#define LFLOW_RESTART_ANY 2 /* Restart output on any char */ -#define LFLOW_RESTART_XON 3 /* Restart output only on XON */ - -/* - * LINEMODE suboptions - */ - -#define LM_MODE 1 -#define LM_FORWARDMASK 2 -#define LM_SLC 3 - -#define MODE_EDIT 0x01 -#define MODE_TRAPSIG 0x02 -#define MODE_ACK 0x04 -#define MODE_SOFT_TAB 0x08 -#define MODE_LIT_ECHO 0x10 - -#define MODE_MASK 0x1f - -/* Not part of protocol, but needed to simplify things... */ -#define MODE_FLOW 0x0100 -#define MODE_ECHO 0x0200 -#define MODE_INBIN 0x0400 -#define MODE_OUTBIN 0x0800 -#define MODE_FORCE 0x1000 - -#define SLC_SYNCH 1 -#define SLC_BRK 2 -#define SLC_IP 3 -#define SLC_AO 4 -#define SLC_AYT 5 -#define SLC_EOR 6 -#define SLC_ABORT 7 -#define SLC_EOF 8 -#define SLC_SUSP 9 -#define SLC_EC 10 -#define SLC_EL 11 -#define SLC_EW 12 -#define SLC_RP 13 -#define SLC_LNEXT 14 -#define SLC_XON 15 -#define SLC_XOFF 16 -#define SLC_FORW1 17 -#define SLC_FORW2 18 - -#define NSLC 18 - -/* - * For backwards compatability, we define SLC_NAMES to be the - * list of names if SLC_NAMES is not defined. - */ -#define SLC_NAMELIST "0", "SYNCH", "BRK", "IP", "AO", "AYT", "EOR", \ - "ABORT", "EOF", "SUSP", "EC", "EL", "EW", "RP", \ - "LNEXT", "XON", "XOFF", "FORW1", "FORW2", 0, -#ifdef SLC_NAMES -char *slc_names[] = { - SLC_NAMELIST -}; -#else -extern char *slc_names[]; -#define SLC_NAMES SLC_NAMELIST -#endif - -#define SLC_NAME_OK(x) ((unsigned int)(x) <= NSLC) -#define SLC_NAME(x) slc_names[x] - -#define SLC_NOSUPPORT 0 -#define SLC_CANTCHANGE 1 -#define SLC_VARIABLE 2 -#define SLC_DEFAULT 3 -#define SLC_LEVELBITS 0x03 - -#define SLC_FUNC 0 -#define SLC_FLAGS 1 -#define SLC_VALUE 2 - -#define SLC_ACK 0x80 -#define SLC_FLUSHIN 0x40 -#define SLC_FLUSHOUT 0x20 - -#define OLD_ENV_VAR 1 -#define OLD_ENV_VALUE 0 -#define NEW_ENV_VAR 0 -#define NEW_ENV_VALUE 1 -#define ENV_ESC 2 -#define ENV_USERVAR 3 - -/* - * AUTHENTICATION suboptions - */ - -/* - * Who is authenticating who ... - */ -#define AUTH_WHO_CLIENT 0 /* Client authenticating server */ -#define AUTH_WHO_SERVER 1 /* Server authenticating client */ -#define AUTH_WHO_MASK 1 - -/* - * amount of authentication done - */ -#define AUTH_HOW_ONE_WAY 0 -#define AUTH_HOW_MUTUAL 2 -#define AUTH_HOW_MASK 2 - -#define AUTHTYPE_NULL 0 -#define AUTHTYPE_KERBEROS_V4 1 -#define AUTHTYPE_KERBEROS_V5 2 -#define AUTHTYPE_SPX 3 -#define AUTHTYPE_MINK 4 -#define AUTHTYPE_SRA 5 -#define AUTHTYPE_CNT 6 -/* #define AUTHTYPE_UNSECURE 6 */ - -#define AUTHTYPE_TEST 99 - -#ifdef AUTH_NAMES -char *authtype_names[] = { - "NULL", "KERBEROS_V4", "KERBEROS_V5", "SPX", "MINK", - "SRA", 0, -}; -#else -extern char *authtype_names[]; -#endif - -#define AUTHTYPE_NAME_OK(x) ((unsigned int)(x) < AUTHTYPE_CNT) -#define AUTHTYPE_NAME(x) authtype_names[x] - -/* - * ENCRYPTion suboptions - */ -#define ENCRYPT_IS 0 /* I pick encryption type ... */ -#define ENCRYPT_SUPPORT 1 /* I support encryption types ... */ -#define ENCRYPT_REPLY 2 /* Initial setup response */ -#define ENCRYPT_START 3 /* Am starting to send encrypted */ -#define ENCRYPT_END 4 /* Am ending encrypted */ -#define ENCRYPT_REQSTART 5 /* Request you start encrypting */ -#define ENCRYPT_REQEND 6 /* Request you send encrypting */ -#define ENCRYPT_ENC_KEYID 7 -#define ENCRYPT_DEC_KEYID 8 -#define ENCRYPT_CNT 9 - -#define ENCTYPE_ANY 0 -#define ENCTYPE_DES_CFB64 1 -#define ENCTYPE_DES_OFB64 2 -#define ENCTYPE_CNT 3 - -#ifdef ENCRYPT_NAMES -char *encrypt_names[] = { - "IS", "SUPPORT", "REPLY", "START", "END", - "REQUEST-START", "REQUEST-END", "ENC-KEYID", "DEC-KEYID", - 0, -}; -char *enctype_names[] = { - "ANY", "DES_CFB64", "DES_OFB64", 0, -}; -#else -extern char *encrypt_names[]; -extern char *enctype_names[]; -#endif - - -#define ENCRYPT_NAME_OK(x) ((unsigned int)(x) < ENCRYPT_CNT) -#define ENCRYPT_NAME(x) encrypt_names[x] - -#define ENCTYPE_NAME_OK(x) ((unsigned int)(x) < ENCTYPE_CNT) -#define ENCTYPE_NAME(x) enctype_names[x] - -#endif /* !_TELNET_H_ */ diff --git a/crypto/heimdal/appl/telnet/libtelnet/Makefile.am b/crypto/heimdal/appl/telnet/libtelnet/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += -I$(srcdir)/.. $(INCLUDE_hcrypto) - -noinst_LIBRARIES = libtelnet.a - -libtelnet_a_SOURCES = \ - auth-proto.h \ - auth.c \ - auth.h \ - enc-proto.h \ - enc_des.c \ - encrypt.c \ - encrypt.h \ - genget.c \ - kerberos5.c \ - misc-proto.h \ - misc.c \ - misc.h - -EXTRA_DIST = NTMakefile rsaencpwd.c spx.c diff --git a/crypto/heimdal/appl/telnet/libtelnet/Makefile.in b/crypto/heimdal/appl/telnet/libtelnet/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/Makefile.in +++ /dev/null @@ -1,845 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common -subdir = appl/telnet/libtelnet -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS ?= cru -libtelnet_a_AR = $(AR) $(ARFLAGS) -libtelnet_a_LIBADD = -am_libtelnet_a_OBJECTS = auth.$(OBJEXT) enc_des.$(OBJEXT) \ - encrypt.$(OBJEXT) genget.$(OBJEXT) kerberos5.$(OBJEXT) \ - misc.$(OBJEXT) -libtelnet_a_OBJECTS = $(am_libtelnet_a_OBJECTS) -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 = $(libtelnet_a_SOURCES) -DIST_SOURCES = $(libtelnet_a_SOURCES) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/.. $(INCLUDE_hcrypto) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -noinst_LIBRARIES = libtelnet.a -libtelnet_a_SOURCES = \ - auth-proto.h \ - auth.c \ - auth.h \ - enc-proto.h \ - enc_des.c \ - encrypt.c \ - encrypt.h \ - genget.c \ - kerberos5.c \ - misc-proto.h \ - misc.c \ - misc.h - -EXTRA_DIST = NTMakefile rsaencpwd.c spx.c -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/telnet/libtelnet/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/telnet/libtelnet/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) -libtelnet.a: $(libtelnet_a_OBJECTS) $(libtelnet_a_DEPENDENCIES) - -rm -f libtelnet.a - $(libtelnet_a_AR) libtelnet.a $(libtelnet_a_OBJECTS) $(libtelnet_a_LIBADD) - $(RANLIB) libtelnet.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/auth.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/enc_des.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genget.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kerberos5.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.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" - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(LIBRARIES) all-local -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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libtool clean-noinstLIBRARIES ctags \ - dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook 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-hook - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/appl/telnet/libtelnet/auth-proto.h b/crypto/heimdal/appl/telnet/libtelnet/auth-proto.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/auth-proto.h +++ /dev/null @@ -1,111 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)auth-proto.h 8.1 (Berkeley) 6/4/93 - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America is assumed - * to require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -/* $Id$ */ - -#ifdef AUTHENTICATION -Authenticator *findauthenticator (int, int); - -int auth_wait (char *, size_t); -void auth_disable_name (char *); -void auth_finished (Authenticator *, int); -void auth_gen_printsub (unsigned char *, size_t, unsigned char *, size_t); -void auth_init (const char *, int); -void auth_is (unsigned char *, int); -void auth_name(unsigned char*, int); -void auth_reply (unsigned char *, int); -void auth_request (void); -void auth_send (unsigned char *, int); -void auth_send_retry (void); -void auth_printsub(unsigned char*, size_t, unsigned char*, size_t); -int getauthmask(char *type, int *maskp); -int auth_enable(char *type); -int auth_disable(char *type); -int auth_onoff(char *type, int on); -int auth_togdebug(int on); -int auth_status(void); -int auth_sendname(unsigned char *cp, int len); -void auth_debug(int mode); - -#ifdef UNSAFE -int unsafe_init (Authenticator *, int); -int unsafe_send (Authenticator *); -void unsafe_is (Authenticator *, unsigned char *, int); -void unsafe_reply (Authenticator *, unsigned char *, int); -int unsafe_status (Authenticator *, char *, int); -void unsafe_printsub (unsigned char *, size_t, unsigned char *, size_t); -#endif - -#ifdef SRA -int sra_init (Authenticator *, int); -int sra_send (Authenticator *); -void sra_is (Authenticator *, unsigned char *, int); -void sra_reply (Authenticator *, unsigned char *, int); -int sra_status (Authenticator *, char *, int); -void sra_printsub (unsigned char *, size_t, unsigned char *, size_t); -#endif - -#ifdef KRB5 -int kerberos5_init (Authenticator *, int); -int kerberos5_send_mutual (Authenticator *); -int kerberos5_send_oneway (Authenticator *); -void kerberos5_is (Authenticator *, unsigned char *, int); -void kerberos5_reply (Authenticator *, unsigned char *, int); -int kerberos5_status (Authenticator *, char *, size_t, int); -void kerberos5_printsub (unsigned char *, size_t, unsigned char *, size_t); -int kerberos5_set_forward(int); -int kerberos5_set_forwardable(int); -#endif -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/auth.h b/crypto/heimdal/appl/telnet/libtelnet/auth.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/auth.h +++ /dev/null @@ -1,81 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)auth.h 8.1 (Berkeley) 6/4/93 - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America is assumed - * to require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -/* $Id$ */ - -#ifndef __AUTH__ -#define __AUTH__ - -#define AUTH_REJECT 0 /* Rejected */ -#define AUTH_UNKNOWN 1 /* We don't know who he is, but he's okay */ -#define AUTH_OTHER 2 /* We know him, but not his name */ -#define AUTH_USER 3 /* We know he name */ -#define AUTH_VALID 4 /* We know him, and he needs no password */ - -typedef struct XauthP { - int type; - int way; - int (*init) (struct XauthP *, int); - int (*send) (struct XauthP *); - void (*is) (struct XauthP *, unsigned char *, int); - void (*reply) (struct XauthP *, unsigned char *, int); - int (*status) (struct XauthP *, char *, size_t, int); - void (*printsub) (unsigned char *, size_t, unsigned char *, size_t); -} Authenticator; - -#include "auth-proto.h" - -extern int auth_debug_mode; -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/auth.c b/crypto/heimdal/appl/telnet/libtelnet/auth.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/auth.c +++ /dev/null @@ -1,628 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America is assumed - * to require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -#include - -RCSID("$Id$"); - -#if defined(AUTHENTICATION) -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#include -#define AUTH_NAMES -#ifdef HAVE_ARPA_TELNET_H -#include -#endif -#include -#include - -#include - -#ifdef SOCKS -#include -#endif - -#include "encrypt.h" -#include "auth.h" -#include "misc-proto.h" -#include "auth-proto.h" - -#define typemask(x) (1<<((x)-1)) - -#ifdef RSA_ENCPWD -extern rsaencpwd_init(); -extern rsaencpwd_send(); -extern rsaencpwd_is(); -extern rsaencpwd_reply(); -extern rsaencpwd_status(); -extern rsaencpwd_printsub(); -#endif - -int auth_debug_mode = 0; -int auth_has_failed = 0; -int auth_enable_encrypt = 0; -static const char *Name = "Noname"; -static int Server = 0; -static Authenticator *authenticated = 0; -static int authenticating = 0; -static int validuser = 0; -static unsigned char _auth_send_data[256]; -static unsigned char *auth_send_data; -static int auth_send_cnt = 0; - -/* - * Authentication types supported. Plese note that these are stored - * in priority order, i.e. try the first one first. - */ -Authenticator authenticators[] = { -#ifdef UNSAFE - { AUTHTYPE_UNSAFE, AUTH_WHO_CLIENT|AUTH_HOW_ONE_WAY, - unsafe_init, - unsafe_send, - unsafe_is, - unsafe_reply, - unsafe_status, - unsafe_printsub }, -#endif -#ifdef SRA - { AUTHTYPE_SRA, AUTH_WHO_CLIENT|AUTH_HOW_ONE_WAY, - sra_init, - sra_send, - sra_is, - sra_reply, - sra_status, - sra_printsub }, -#endif -#ifdef SPX - { AUTHTYPE_SPX, AUTH_WHO_CLIENT|AUTH_HOW_MUTUAL, - spx_init, - spx_send, - spx_is, - spx_reply, - spx_status, - spx_printsub }, - { AUTHTYPE_SPX, AUTH_WHO_CLIENT|AUTH_HOW_ONE_WAY, - spx_init, - spx_send, - spx_is, - spx_reply, - spx_status, - spx_printsub }, -#endif -#ifdef KRB5 - { AUTHTYPE_KERBEROS_V5, AUTH_WHO_CLIENT|AUTH_HOW_MUTUAL, - kerberos5_init, - kerberos5_send_mutual, - kerberos5_is, - kerberos5_reply, - kerberos5_status, - kerberos5_printsub }, - { AUTHTYPE_KERBEROS_V5, AUTH_WHO_CLIENT|AUTH_HOW_ONE_WAY, - kerberos5_init, - kerberos5_send_oneway, - kerberos5_is, - kerberos5_reply, - kerberos5_status, - kerberos5_printsub }, -#endif -#ifdef RSA_ENCPWD - { AUTHTYPE_RSA_ENCPWD, AUTH_WHO_CLIENT|AUTH_HOW_ONE_WAY, - rsaencpwd_init, - rsaencpwd_send, - rsaencpwd_is, - rsaencpwd_reply, - rsaencpwd_status, - rsaencpwd_printsub }, -#endif - { 0, }, -}; - -static Authenticator NoAuth = { 0 }; - -static int i_support = 0; -static int i_wont_support = 0; - -Authenticator * -findauthenticator(int type, int way) -{ - Authenticator *ap = authenticators; - - while (ap->type && (ap->type != type || ap->way != way)) - ++ap; - return(ap->type ? ap : 0); -} - -void -auth_init(const char *name, int server) -{ - Authenticator *ap = authenticators; - - Server = server; - Name = name; - - i_support = 0; - authenticated = 0; - authenticating = 0; - while (ap->type) { - if (!ap->init || (*ap->init)(ap, server)) { - i_support |= typemask(ap->type); - if (auth_debug_mode) - printf(">>>%s: I support auth type %d %d\r\n", - Name, - ap->type, ap->way); - } - else if (auth_debug_mode) - printf(">>>%s: Init failed: auth type %d %d\r\n", - Name, ap->type, ap->way); - ++ap; - } -} - -void -auth_disable_name(char *name) -{ - int x; - for (x = 0; x < AUTHTYPE_CNT; ++x) { - if (!strcasecmp(name, AUTHTYPE_NAME(x))) { - i_wont_support |= typemask(x); - break; - } - } -} - -int -getauthmask(char *type, int *maskp) -{ - int x; - - if (!strcasecmp(type, AUTHTYPE_NAME(0))) { - *maskp = -1; - return(1); - } - - for (x = 1; x < AUTHTYPE_CNT; ++x) { - if (!strcasecmp(type, AUTHTYPE_NAME(x))) { - *maskp = typemask(x); - return(1); - } - } - return(0); -} - -int -auth_enable(char *type) -{ - return(auth_onoff(type, 1)); -} - -int -auth_disable(char *type) -{ - return(auth_onoff(type, 0)); -} - -int -auth_onoff(char *type, int on) -{ - int i, mask = -1; - Authenticator *ap; - - if (!strcasecmp(type, "?") || !strcasecmp(type, "help")) { - printf("auth %s 'type'\n", on ? "enable" : "disable"); - printf("Where 'type' is one of:\n"); - printf("\t%s\n", AUTHTYPE_NAME(0)); - mask = 0; - for (ap = authenticators; ap->type; ap++) { - if ((mask & (i = typemask(ap->type))) != 0) - continue; - mask |= i; - printf("\t%s\n", AUTHTYPE_NAME(ap->type)); - } - return(0); - } - - if (!getauthmask(type, &mask)) { - printf("%s: invalid authentication type\n", type); - return(0); - } - if (on) - i_wont_support &= ~mask; - else - i_wont_support |= mask; - return(1); -} - -int -auth_togdebug(int on) -{ - if (on < 0) - auth_debug_mode ^= 1; - else - auth_debug_mode = on; - printf("auth debugging %s\n", auth_debug_mode ? "enabled" : "disabled"); - return(1); -} - -int -auth_status(void) -{ - Authenticator *ap; - int i, mask; - - if (i_wont_support == -1) - printf("Authentication disabled\n"); - else - printf("Authentication enabled\n"); - - mask = 0; - for (ap = authenticators; ap->type; ap++) { - if ((mask & (i = typemask(ap->type))) != 0) - continue; - mask |= i; - printf("%s: %s\n", AUTHTYPE_NAME(ap->type), - (i_wont_support & typemask(ap->type)) ? - "disabled" : "enabled"); - } - return(1); -} - -/* - * This routine is called by the server to start authentication - * negotiation. - */ -void -auth_request(void) -{ - static unsigned char str_request[64] = { IAC, SB, - TELOPT_AUTHENTICATION, - TELQUAL_SEND, }; - Authenticator *ap = authenticators; - unsigned char *e = str_request + 4; - - if (!authenticating) { - authenticating = 1; - while (ap->type) { - if (i_support & ~i_wont_support & typemask(ap->type)) { - if (auth_debug_mode) { - printf(">>>%s: Sending type %d %d\r\n", - Name, ap->type, ap->way); - } - *e++ = ap->type; - *e++ = ap->way; - } - ++ap; - } - *e++ = IAC; - *e++ = SE; - telnet_net_write(str_request, e - str_request); - printsub('>', &str_request[2], e - str_request - 2); - } -} - -/* - * This is called when an AUTH SEND is received. - * It should never arrive on the server side (as only the server can - * send an AUTH SEND). - * You should probably respond to it if you can... - * - * If you want to respond to the types out of order (i.e. even - * if he sends LOGIN KERBEROS and you support both, you respond - * with KERBEROS instead of LOGIN (which is against what the - * protocol says)) you will have to hack this code... - */ -void -auth_send(unsigned char *data, int cnt) -{ - Authenticator *ap; - static unsigned char str_none[] = { IAC, SB, TELOPT_AUTHENTICATION, - TELQUAL_IS, AUTHTYPE_NULL, 0, - IAC, SE }; - if (Server) { - if (auth_debug_mode) { - printf(">>>%s: auth_send called!\r\n", Name); - } - return; - } - - if (auth_debug_mode) { - printf(">>>%s: auth_send got:", Name); - printd(data, cnt); printf("\r\n"); - } - - /* - * Save the data, if it is new, so that we can continue looking - * at it if the authorization we try doesn't work - */ - if (data < _auth_send_data || - data > _auth_send_data + sizeof(_auth_send_data)) { - auth_send_cnt = cnt > sizeof(_auth_send_data) - ? sizeof(_auth_send_data) - : cnt; - memmove(_auth_send_data, data, auth_send_cnt); - auth_send_data = _auth_send_data; - } else { - /* - * This is probably a no-op, but we just make sure - */ - auth_send_data = data; - auth_send_cnt = cnt; - } - while ((auth_send_cnt -= 2) >= 0) { - if (auth_debug_mode) - printf(">>>%s: He supports %d\r\n", - Name, *auth_send_data); - if ((i_support & ~i_wont_support) & typemask(*auth_send_data)) { - ap = findauthenticator(auth_send_data[0], - auth_send_data[1]); - if (ap && ap->send) { - if (auth_debug_mode) - printf(">>>%s: Trying %d %d\r\n", - Name, auth_send_data[0], - auth_send_data[1]); - if ((*ap->send)(ap)) { - /* - * Okay, we found one we like - * and did it. - * we can go home now. - */ - if (auth_debug_mode) - printf(">>>%s: Using type %d\r\n", - Name, *auth_send_data); - auth_send_data += 2; - return; - } - } - /* else - * just continue on and look for the - * next one if we didn't do anything. - */ - } - auth_send_data += 2; - } - telnet_net_write(str_none, sizeof(str_none)); - printsub('>', &str_none[2], sizeof(str_none) - 2); - if (auth_debug_mode) - printf(">>>%s: Sent failure message\r\n", Name); - auth_finished(0, AUTH_REJECT); - auth_has_failed = 1; -#ifdef KANNAN - /* - * We requested strong authentication, however no mechanisms worked. - * Therefore, exit on client end. - */ - printf("Unable to securely authenticate user ... exit\n"); - exit(0); -#endif /* KANNAN */ -} - -void -auth_send_retry(void) -{ - /* - * if auth_send_cnt <= 0 then auth_send will end up rejecting - * the authentication and informing the other side of this. - */ - auth_send(auth_send_data, auth_send_cnt); -} - -void -auth_is(unsigned char *data, int cnt) -{ - Authenticator *ap; - - if (cnt < 2) - return; - - if (data[0] == AUTHTYPE_NULL) { - auth_finished(0, AUTH_REJECT); - return; - } - - if ((ap = findauthenticator(data[0], data[1]))) { - if (ap->is) - (*ap->is)(ap, data+2, cnt-2); - } else if (auth_debug_mode) - printf(">>>%s: Invalid authentication in IS: %d\r\n", - Name, *data); -} - -void -auth_reply(unsigned char *data, int cnt) -{ - Authenticator *ap; - - if (cnt < 2) - return; - - if ((ap = findauthenticator(data[0], data[1]))) { - if (ap->reply) - (*ap->reply)(ap, data+2, cnt-2); - } else if (auth_debug_mode) - printf(">>>%s: Invalid authentication in SEND: %d\r\n", - Name, *data); -} - -void -auth_name(unsigned char *data, int cnt) -{ - char savename[256]; - - if (cnt < 1) { - if (auth_debug_mode) - printf(">>>%s: Empty name in NAME\r\n", Name); - return; - } - if (cnt > sizeof(savename) - 1) { - if (auth_debug_mode) - printf(">>>%s: Name in NAME (%d) exceeds %lu length\r\n", - Name, cnt, (unsigned long)(sizeof(savename)-1)); - return; - } - memmove(savename, data, cnt); - savename[cnt] = '\0'; /* Null terminate */ - if (auth_debug_mode) - printf(">>>%s: Got NAME [%s]\r\n", Name, savename); - auth_encrypt_user(savename); -} - -int -auth_sendname(unsigned char *cp, int len) -{ - static unsigned char str_request[256+6] - = { IAC, SB, TELOPT_AUTHENTICATION, TELQUAL_NAME, }; - unsigned char *e = str_request + 4; - unsigned char *ee = &str_request[sizeof(str_request)-2]; - - while (--len >= 0) { - if ((*e++ = *cp++) == IAC) - *e++ = IAC; - if (e >= ee) - return(0); - } - *e++ = IAC; - *e++ = SE; - telnet_net_write(str_request, e - str_request); - printsub('>', &str_request[2], e - &str_request[2]); - return(1); -} - -void -auth_finished(Authenticator *ap, int result) -{ - if (!(authenticated = ap)) - authenticated = &NoAuth; - validuser = result; -} - -/* ARGSUSED */ -static void -auth_intr(int sig) -{ - auth_finished(0, AUTH_REJECT); -} - -int -auth_wait(char *name, size_t name_sz) -{ - if (auth_debug_mode) - printf(">>>%s: in auth_wait.\r\n", Name); - - if (Server && !authenticating) - return(0); - - signal(SIGALRM, auth_intr); - alarm(30); - while (!authenticated) - if (telnet_spin()) - break; - alarm(0); - signal(SIGALRM, SIG_DFL); - - /* - * Now check to see if the user is valid or not - */ - if (!authenticated || authenticated == &NoAuth) - return(AUTH_REJECT); - - if (validuser == AUTH_VALID) - validuser = AUTH_USER; - - if (authenticated->status) - validuser = (*authenticated->status)(authenticated, - name, name_sz, - validuser); - return(validuser); -} - -void -auth_debug(int mode) -{ - auth_debug_mode = mode; -} - -void -auth_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - Authenticator *ap; - - if ((ap = findauthenticator(data[1], data[2])) && ap->printsub) - (*ap->printsub)(data, cnt, buf, buflen); - else - auth_gen_printsub(data, cnt, buf, buflen); -} - -void -auth_gen_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - unsigned char *cp; - unsigned char tbuf[16]; - - cnt -= 3; - data += 3; - buf[buflen-1] = '\0'; - buf[buflen-2] = '*'; - buflen -= 2; - for (; cnt > 0; cnt--, data++) { - snprintf((char*)tbuf, sizeof(tbuf), " %d", *data); - for (cp = tbuf; *cp && buflen > 0; --buflen) - *buf++ = *cp++; - if (buflen <= 0) - return; - } - *buf = '\0'; -} -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/enc-proto.h b/crypto/heimdal/appl/telnet/libtelnet/enc-proto.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/enc-proto.h +++ /dev/null @@ -1,133 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)enc-proto.h 8.1 (Berkeley) 6/4/93 - * - * @(#)enc-proto.h 5.2 (Berkeley) 3/22/91 - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America is assumed - * to require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -/* $Id$ */ - -#if defined(ENCRYPTION) -Encryptions *findencryption (int); -Encryptions *finddecryption(int); -int EncryptAutoDec(int); -int EncryptAutoEnc(int); -int EncryptDebug(int); -int EncryptDisable(char*, char*); -int EncryptEnable(char*, char*); -int EncryptStart(char*); -int EncryptStartInput(void); -int EncryptStartOutput(void); -int EncryptStatus(void); -int EncryptStop(char*); -int EncryptStopInput(void); -int EncryptStopOutput(void); -int EncryptType(char*, char*); -int EncryptVerbose(int); -void decrypt_auto(int); -void encrypt_auto(int); -void encrypt_debug(int); -void encrypt_dec_keyid(unsigned char*, int); -void encrypt_display(void); -void encrypt_enc_keyid(unsigned char*, int); -void encrypt_end(void); -void encrypt_gen_printsub(unsigned char*, size_t, unsigned char*, size_t); -void encrypt_init(const char*, int); -void encrypt_is(unsigned char*, int); -void encrypt_list_types(void); -void encrypt_not(void); -void encrypt_printsub(unsigned char*, size_t, unsigned char*, size_t); -void encrypt_reply(unsigned char*, int); -void encrypt_request_end(void); -void encrypt_request_start(unsigned char*, int); -void encrypt_send_end(void); -void encrypt_send_keyid(int, unsigned char*, int, int); -void encrypt_send_request_end(void); -int encrypt_is_encrypting(void); -void encrypt_send_request_start(void); -void encrypt_send_support(void); -void encrypt_session_key(Session_Key*, int); -void encrypt_start(unsigned char*, int); -void encrypt_start_output(int); -void encrypt_support(unsigned char*, int); -void encrypt_verbose_quiet(int); -void encrypt_wait(void); -int encrypt_delay(void); - -#ifdef TELENTD -void encrypt_wait (void); -#else -void encrypt_display (void); -#endif - -void cfb64_encrypt (unsigned char *, int); -int cfb64_decrypt (int); -void cfb64_init (int); -int cfb64_start (int, int); -int cfb64_is (unsigned char *, int); -int cfb64_reply (unsigned char *, int); -void cfb64_session (Session_Key *, int); -int cfb64_keyid (int, unsigned char *, int *); -void cfb64_printsub (unsigned char *, size_t, unsigned char *, size_t); - -void ofb64_encrypt (unsigned char *, int); -int ofb64_decrypt (int); -void ofb64_init (int); -int ofb64_start (int, int); -int ofb64_is (unsigned char *, int); -int ofb64_reply (unsigned char *, int); -void ofb64_session (Session_Key *, int); -int ofb64_keyid (int, unsigned char *, int *); -void ofb64_printsub (unsigned char *, size_t, unsigned char *, size_t); - -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/enc_des.c b/crypto/heimdal/appl/telnet/libtelnet/enc_des.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/enc_des.c +++ /dev/null @@ -1,659 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include - -RCSID("$Id$"); - -#if defined(AUTHENTICATION) && defined(ENCRYPTION) && defined(DES_ENCRYPTION) -#include -#include -#ifdef __STDC__ -#include -#include -#endif -#include -#ifdef SOCKS -#include -#endif - -#include "encrypt.h" -#include "misc-proto.h" - -#include "crypto-headers.h" - -extern int encrypt_debug_mode; - -#define CFB 0 -#define OFB 1 - -#define NO_SEND_IV 1 -#define NO_RECV_IV 2 -#define NO_KEYID 4 -#define IN_PROGRESS (NO_SEND_IV|NO_RECV_IV|NO_KEYID) -#define SUCCESS 0 -#define FAILED -1 - - -struct stinfo { - DES_cblock str_output; - DES_cblock str_feed; - DES_cblock str_iv; - DES_cblock str_ikey; - DES_key_schedule str_sched; - int str_index; - int str_flagshift; -}; - -struct fb { - DES_cblock krbdes_key; - DES_key_schedule krbdes_sched; - DES_cblock temp_feed; - unsigned char fb_feed[64]; - int need_start; - int state[2]; - int keyid[2]; - struct stinfo streams[2]; -}; - -static struct fb fb[2]; - -struct keyidlist { - char *keyid; - int keyidlen; - char *key; - int keylen; - int flags; -} keyidlist [] = { - { "\0", 1, 0, 0, 0 }, /* default key of zero */ - { 0, 0, 0, 0, 0 } -}; - -#define KEYFLAG_MASK 03 - -#define KEYFLAG_NOINIT 00 -#define KEYFLAG_INIT 01 -#define KEYFLAG_OK 02 -#define KEYFLAG_BAD 03 - -#define KEYFLAG_SHIFT 2 - -#define SHIFT_VAL(a,b) (KEYFLAG_SHIFT*((a)+((b)*2))) - -#define FB64_IV 1 -#define FB64_IV_OK 2 -#define FB64_IV_BAD 3 - - -void fb64_stream_iv (DES_cblock, struct stinfo *); -void fb64_init (struct fb *); -static int fb64_start (struct fb *, int, int); -int fb64_is (unsigned char *, int, struct fb *); -int fb64_reply (unsigned char *, int, struct fb *); -static void fb64_session (Session_Key *, int, struct fb *); -void fb64_stream_key (DES_cblock, struct stinfo *); -int fb64_keyid (int, unsigned char *, int *, struct fb *); -void fb64_printsub(unsigned char *, size_t , - unsigned char *, size_t , char *); - -void cfb64_init(int server) -{ - fb64_init(&fb[CFB]); - fb[CFB].fb_feed[4] = ENCTYPE_DES_CFB64; - fb[CFB].streams[0].str_flagshift = SHIFT_VAL(0, CFB); - fb[CFB].streams[1].str_flagshift = SHIFT_VAL(1, CFB); -} - - -void ofb64_init(int server) -{ - fb64_init(&fb[OFB]); - fb[OFB].fb_feed[4] = ENCTYPE_DES_OFB64; - fb[CFB].streams[0].str_flagshift = SHIFT_VAL(0, OFB); - fb[CFB].streams[1].str_flagshift = SHIFT_VAL(1, OFB); -} - -void fb64_init(struct fb *fbp) -{ - memset(fbp,0, sizeof(*fbp)); - fbp->state[0] = fbp->state[1] = FAILED; - fbp->fb_feed[0] = IAC; - fbp->fb_feed[1] = SB; - fbp->fb_feed[2] = TELOPT_ENCRYPT; - fbp->fb_feed[3] = ENCRYPT_IS; -} - -/* - * Returns: - * -1: some error. Negotiation is done, encryption not ready. - * 0: Successful, initial negotiation all done. - * 1: successful, negotiation not done yet. - * 2: Not yet. Other things (like getting the key from - * Kerberos) have to happen before we can continue. - */ -int cfb64_start(int dir, int server) -{ - return(fb64_start(&fb[CFB], dir, server)); -} - -int ofb64_start(int dir, int server) -{ - return(fb64_start(&fb[OFB], dir, server)); -} - -static int fb64_start(struct fb *fbp, int dir, int server) -{ - int x; - unsigned char *p; - int state; - - switch (dir) { - case DIR_DECRYPT: - /* - * This is simply a request to have the other side - * start output (our input). He will negotiate an - * IV so we need not look for it. - */ - state = fbp->state[dir-1]; - if (state == FAILED) - state = IN_PROGRESS; - break; - - case DIR_ENCRYPT: - state = fbp->state[dir-1]; - if (state == FAILED) - state = IN_PROGRESS; - else if ((state & NO_SEND_IV) == 0) { - break; - } - - if (!VALIDKEY(fbp->krbdes_key)) { - fbp->need_start = 1; - break; - } - - state &= ~NO_SEND_IV; - state |= NO_RECV_IV; - if (encrypt_debug_mode) - printf("Creating new feed\r\n"); - /* - * Create a random feed and send it over. - */ - do { - if (RAND_bytes(fbp->temp_feed, - sizeof(*fbp->temp_feed)) != 1) - abort(); - DES_set_odd_parity(&fbp->temp_feed); - } while(DES_is_weak_key(&fbp->temp_feed)); - - p = fbp->fb_feed + 3; - *p++ = ENCRYPT_IS; - p++; - *p++ = FB64_IV; - for (x = 0; x < sizeof(DES_cblock); ++x) { - if ((*p++ = fbp->temp_feed[x]) == IAC) - *p++ = IAC; - } - *p++ = IAC; - *p++ = SE; - printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]); - telnet_net_write(fbp->fb_feed, p - fbp->fb_feed); - break; - default: - return(FAILED); - } - return(fbp->state[dir-1] = state); -} - -/* - * Returns: - * -1: some error. Negotiation is done, encryption not ready. - * 0: Successful, initial negotiation all done. - * 1: successful, negotiation not done yet. - */ - -int cfb64_is(unsigned char *data, int cnt) -{ - return(fb64_is(data, cnt, &fb[CFB])); -} - -int ofb64_is(unsigned char *data, int cnt) -{ - return(fb64_is(data, cnt, &fb[OFB])); -} - - -int fb64_is(unsigned char *data, int cnt, struct fb *fbp) -{ - unsigned char *p; - int state = fbp->state[DIR_DECRYPT-1]; - - if (cnt-- < 1) - goto failure; - - switch (*data++) { - case FB64_IV: - if (cnt != sizeof(DES_cblock)) { - if (encrypt_debug_mode) - printf("CFB64: initial vector failed on size\r\n"); - state = FAILED; - goto failure; - } - - if (encrypt_debug_mode) - printf("CFB64: initial vector received\r\n"); - - if (encrypt_debug_mode) - printf("Initializing Decrypt stream\r\n"); - - fb64_stream_iv(data, &fbp->streams[DIR_DECRYPT-1]); - - p = fbp->fb_feed + 3; - *p++ = ENCRYPT_REPLY; - p++; - *p++ = FB64_IV_OK; - *p++ = IAC; - *p++ = SE; - printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]); - telnet_net_write(fbp->fb_feed, p - fbp->fb_feed); - - state = fbp->state[DIR_DECRYPT-1] = IN_PROGRESS; - break; - - default: - if (encrypt_debug_mode) { - printf("Unknown option type: %d\r\n", *(data-1)); - printd(data, cnt); - printf("\r\n"); - } - /* FALL THROUGH */ - failure: - /* - * We failed. Send an FB64_IV_BAD option - * to the other side so it will know that - * things failed. - */ - p = fbp->fb_feed + 3; - *p++ = ENCRYPT_REPLY; - p++; - *p++ = FB64_IV_BAD; - *p++ = IAC; - *p++ = SE; - printsub('>', &fbp->fb_feed[2], p - &fbp->fb_feed[2]); - telnet_net_write(fbp->fb_feed, p - fbp->fb_feed); - - break; - } - return(fbp->state[DIR_DECRYPT-1] = state); -} - -/* - * Returns: - * -1: some error. Negotiation is done, encryption not ready. - * 0: Successful, initial negotiation all done. - * 1: successful, negotiation not done yet. - */ - -int cfb64_reply(unsigned char *data, int cnt) -{ - return(fb64_reply(data, cnt, &fb[CFB])); -} - -int ofb64_reply(unsigned char *data, int cnt) -{ - return(fb64_reply(data, cnt, &fb[OFB])); -} - - -int fb64_reply(unsigned char *data, int cnt, struct fb *fbp) -{ - int state = fbp->state[DIR_ENCRYPT-1]; - - if (cnt-- < 1) - goto failure; - - switch (*data++) { - case FB64_IV_OK: - fb64_stream_iv(fbp->temp_feed, &fbp->streams[DIR_ENCRYPT-1]); - if (state == FAILED) - state = IN_PROGRESS; - state &= ~NO_RECV_IV; - encrypt_send_keyid(DIR_ENCRYPT, (unsigned char *)"\0", 1, 1); - break; - - case FB64_IV_BAD: - memset(fbp->temp_feed, 0, sizeof(DES_cblock)); - fb64_stream_iv(fbp->temp_feed, &fbp->streams[DIR_ENCRYPT-1]); - state = FAILED; - break; - - default: - if (encrypt_debug_mode) { - printf("Unknown option type: %d\r\n", data[-1]); - printd(data, cnt); - printf("\r\n"); - } - /* FALL THROUGH */ - failure: - state = FAILED; - break; - } - return(fbp->state[DIR_ENCRYPT-1] = state); -} - -void cfb64_session(Session_Key *key, int server) -{ - fb64_session(key, server, &fb[CFB]); -} - -void ofb64_session(Session_Key *key, int server) -{ - fb64_session(key, server, &fb[OFB]); -} - -static void fb64_session(Session_Key *key, int server, struct fb *fbp) -{ - - if (!key || key->type != SK_DES) { - if (encrypt_debug_mode) - printf("Can't set krbdes's session key (%d != %d)\r\n", - key ? key->type : -1, SK_DES); - return; - } - memcpy(fbp->krbdes_key, key->data, sizeof(DES_cblock)); - - fb64_stream_key(fbp->krbdes_key, &fbp->streams[DIR_ENCRYPT-1]); - fb64_stream_key(fbp->krbdes_key, &fbp->streams[DIR_DECRYPT-1]); - - RAND_seed(key->data, key->length); - - DES_set_key_checked((DES_cblock *)&fbp->krbdes_key, - &fbp->krbdes_sched); - /* - * Now look to see if krbdes_start() was waiting for the key to - * show up. If so, go ahead an call it now that we have the key. - */ - if (fbp->need_start) { - fbp->need_start = 0; - fb64_start(fbp, DIR_ENCRYPT, server); - } -} - -/* - * We only accept a keyid of 0. If we get a keyid of - * 0, then mark the state as SUCCESS. - */ - -int cfb64_keyid(int dir, unsigned char *kp, int *lenp) -{ - return(fb64_keyid(dir, kp, lenp, &fb[CFB])); -} - -int ofb64_keyid(int dir, unsigned char *kp, int *lenp) -{ - return(fb64_keyid(dir, kp, lenp, &fb[OFB])); -} - -int fb64_keyid(int dir, unsigned char *kp, int *lenp, struct fb *fbp) -{ - int state = fbp->state[dir-1]; - - if (*lenp != 1 || (*kp != '\0')) { - *lenp = 0; - return(state); - } - - if (state == FAILED) - state = IN_PROGRESS; - - state &= ~NO_KEYID; - - return(fbp->state[dir-1] = state); -} - -void fb64_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen, char *type) -{ - char lbuf[32]; - int i; - char *cp; - - buf[buflen-1] = '\0'; /* make sure it's NULL terminated */ - buflen -= 1; - - switch(data[2]) { - case FB64_IV: - snprintf(lbuf, sizeof(lbuf), "%s_IV", type); - cp = lbuf; - goto common; - - case FB64_IV_OK: - snprintf(lbuf, sizeof(lbuf), "%s_IV_OK", type); - cp = lbuf; - goto common; - - case FB64_IV_BAD: - snprintf(lbuf, sizeof(lbuf), "%s_IV_BAD", type); - cp = lbuf; - goto common; - - default: - snprintf(lbuf, sizeof(lbuf), " %d (unknown)", data[2]); - cp = lbuf; - common: - for (; (buflen > 0) && (*buf = *cp++); buf++) - buflen--; - for (i = 3; i < cnt; i++) { - snprintf(lbuf, sizeof(lbuf), " %d", data[i]); - for (cp = lbuf; (buflen > 0) && (*buf = *cp++); buf++) - buflen--; - } - break; - } -} - -void cfb64_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - fb64_printsub(data, cnt, buf, buflen, "CFB64"); -} - -void ofb64_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - fb64_printsub(data, cnt, buf, buflen, "OFB64"); -} - -void fb64_stream_iv(DES_cblock seed, struct stinfo *stp) -{ - - memcpy(stp->str_iv, seed,sizeof(DES_cblock)); - memcpy(stp->str_output, seed, sizeof(DES_cblock)); - - DES_set_key_checked(&stp->str_ikey, &stp->str_sched); - - stp->str_index = sizeof(DES_cblock); -} - -void fb64_stream_key(DES_cblock key, struct stinfo *stp) -{ - memcpy(stp->str_ikey, key, sizeof(DES_cblock)); - DES_set_key_checked((DES_cblock*)key, &stp->str_sched); - - memcpy(stp->str_output, stp->str_iv, sizeof(DES_cblock)); - - stp->str_index = sizeof(DES_cblock); -} - -/* - * DES 64 bit Cipher Feedback - * - * key --->+-----+ - * +->| DES |--+ - * | +-----+ | - * | v - * INPUT --(--------->(+)+---> DATA - * | | - * +-------------+ - * - * - * Given: - * iV: Initial vector, 64 bits (8 bytes) long. - * Dn: the nth chunk of 64 bits (8 bytes) of data to encrypt (decrypt). - * On: the nth chunk of 64 bits (8 bytes) of encrypted (decrypted) output. - * - * V0 = DES(iV, key) - * On = Dn ^ Vn - * V(n+1) = DES(On, key) - */ - -void cfb64_encrypt(unsigned char *s, int c) -{ - struct stinfo *stp = &fb[CFB].streams[DIR_ENCRYPT-1]; - int index; - - index = stp->str_index; - while (c-- > 0) { - if (index == sizeof(DES_cblock)) { - DES_cblock b; - DES_ecb_encrypt(&stp->str_output, &b,&stp->str_sched, 1); - memcpy(stp->str_feed, b, sizeof(DES_cblock)); - index = 0; - } - - /* On encryption, we store (feed ^ data) which is cypher */ - *s = stp->str_output[index] = (stp->str_feed[index] ^ *s); - s++; - index++; - } - stp->str_index = index; -} - -int cfb64_decrypt(int data) -{ - struct stinfo *stp = &fb[CFB].streams[DIR_DECRYPT-1]; - int index; - - if (data == -1) { - /* - * Back up one byte. It is assumed that we will - * never back up more than one byte. If we do, this - * may or may not work. - */ - if (stp->str_index) - --stp->str_index; - return(0); - } - - index = stp->str_index++; - if (index == sizeof(DES_cblock)) { - DES_cblock b; - DES_ecb_encrypt(&stp->str_output,&b, &stp->str_sched, 1); - memcpy(stp->str_feed, b, sizeof(DES_cblock)); - stp->str_index = 1; /* Next time will be 1 */ - index = 0; /* But now use 0 */ - } - - /* On decryption we store (data) which is cypher. */ - stp->str_output[index] = data; - return(data ^ stp->str_feed[index]); -} - -/* - * DES 64 bit Output Feedback - * - * key --->+-----+ - * +->| DES |--+ - * | +-----+ | - * +-----------+ - * v - * INPUT -------->(+) ----> DATA - * - * Given: - * iV: Initial vector, 64 bits (8 bytes) long. - * Dn: the nth chunk of 64 bits (8 bytes) of data to encrypt (decrypt). - * On: the nth chunk of 64 bits (8 bytes) of encrypted (decrypted) output. - * - * V0 = DES(iV, key) - * V(n+1) = DES(Vn, key) - * On = Dn ^ Vn - */ - -void ofb64_encrypt(unsigned char *s, int c) -{ - struct stinfo *stp = &fb[OFB].streams[DIR_ENCRYPT-1]; - int index; - - index = stp->str_index; - while (c-- > 0) { - if (index == sizeof(DES_cblock)) { - DES_cblock b; - DES_ecb_encrypt(&stp->str_feed,&b, &stp->str_sched, 1); - memcpy(stp->str_feed, b, sizeof(DES_cblock)); - index = 0; - } - *s++ ^= stp->str_feed[index]; - index++; - } - stp->str_index = index; -} - -int ofb64_decrypt(int data) -{ - struct stinfo *stp = &fb[OFB].streams[DIR_DECRYPT-1]; - int index; - - if (data == -1) { - /* - * Back up one byte. It is assumed that we will - * never back up more than one byte. If we do, this - * may or may not work. - */ - if (stp->str_index) - --stp->str_index; - return(0); - } - - index = stp->str_index++; - if (index == sizeof(DES_cblock)) { - DES_cblock b; - DES_ecb_encrypt(&stp->str_feed,&b,&stp->str_sched, 1); - memcpy(stp->str_feed, b, sizeof(DES_cblock)); - stp->str_index = 1; /* Next time will be 1 */ - index = 0; /* But now use 0 */ - } - - return(data ^ stp->str_feed[index]); -} -#endif - diff --git a/crypto/heimdal/appl/telnet/libtelnet/encrypt.h b/crypto/heimdal/appl/telnet/libtelnet/encrypt.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/encrypt.h +++ /dev/null @@ -1,103 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)encrypt.h 8.1 (Berkeley) 6/4/93 - * - * @(#)encrypt.h 5.2 (Berkeley) 3/22/91 - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America is assumed - * to require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -/* $Id$ */ - -#ifndef __ENCRYPT__ -#define __ENCRYPT__ - -#define DIR_DECRYPT 1 -#define DIR_ENCRYPT 2 - -#define VALIDKEY(key) ( key[0] | key[1] | key[2] | key[3] | \ - key[4] | key[5] | key[6] | key[7]) - -#define SAMEKEY(k1, k2) (!memcmp(k1, k2, sizeof(des_cblock))) - -typedef struct { - short type; - int length; - unsigned char *data; -} Session_Key; - -typedef struct { - char *name; - int type; - void (*output) (unsigned char *, int); - int (*input) (int); - void (*init) (int); - int (*start) (int, int); - int (*is) (unsigned char *, int); - int (*reply) (unsigned char *, int); - void (*session) (Session_Key *, int); - int (*keyid) (int, unsigned char *, int *); - void (*printsub) (unsigned char *, size_t, unsigned char *, size_t); -} Encryptions; - -#define SK_DES 1 /* Matched Kerberos v5 KEYTYPE_DES */ - -#include "crypto-headers.h" -#ifdef HAVE_OPENSSL -#define des_new_random_key des_random_key -#endif - -#include "enc-proto.h" - -extern int encrypt_debug_mode; -extern int (*decrypt_input) (int); -extern void (*encrypt_output) (unsigned char *, int); -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/encrypt.c b/crypto/heimdal/appl/telnet/libtelnet/encrypt.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/encrypt.c +++ /dev/null @@ -1,1006 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America is assumed - * to require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - - -#include - -RCSID("$Id$"); - -#if defined(ENCRYPTION) - -#define ENCRYPT_NAMES -#include - -#include -#include -#include -#include -#ifdef SOCKS -#include -#endif - -#include "encrypt.h" -#include "misc.h" - - -/* - * These functions pointers point to the current routines - * for encrypting and decrypting data. - */ -void (*encrypt_output) (unsigned char *, int); -int (*decrypt_input) (int); -char *nclearto; - -int encrypt_debug_mode = 0; -static int decrypt_mode = 0; -static int encrypt_mode = 0; -static int encrypt_verbose = 0; -static int autoencrypt = 0; -static int autodecrypt = 0; -static int havesessionkey = 0; -static int Server = 0; -static const char *Name = "Noname"; - -#define typemask(x) ((x) > 0 ? 1 << ((x)-1) : 0) - -static long i_support_encrypt = typemask(ENCTYPE_DES_CFB64) - | typemask(ENCTYPE_DES_OFB64); - static long i_support_decrypt = typemask(ENCTYPE_DES_CFB64) - | typemask(ENCTYPE_DES_OFB64); - static long i_wont_support_encrypt = 0; - static long i_wont_support_decrypt = 0; -#define I_SUPPORT_ENCRYPT (i_support_encrypt & ~i_wont_support_encrypt) -#define I_SUPPORT_DECRYPT (i_support_decrypt & ~i_wont_support_decrypt) - - static long remote_supports_encrypt = 0; - static long remote_supports_decrypt = 0; - - static Encryptions encryptions[] = { -#if defined(DES_ENCRYPTION) - { "DES_CFB64", ENCTYPE_DES_CFB64, - cfb64_encrypt, - cfb64_decrypt, - cfb64_init, - cfb64_start, - cfb64_is, - cfb64_reply, - cfb64_session, - cfb64_keyid, - cfb64_printsub }, - { "DES_OFB64", ENCTYPE_DES_OFB64, - ofb64_encrypt, - ofb64_decrypt, - ofb64_init, - ofb64_start, - ofb64_is, - ofb64_reply, - ofb64_session, - ofb64_keyid, - ofb64_printsub }, -#endif - { 0, }, - }; - -static unsigned char str_send[64] = { IAC, SB, TELOPT_ENCRYPT, - ENCRYPT_SUPPORT }; -static unsigned char str_suplen = 0; -static unsigned char str_start[72] = { IAC, SB, TELOPT_ENCRYPT }; -static unsigned char str_end[] = { IAC, SB, TELOPT_ENCRYPT, 0, IAC, SE }; - -Encryptions * -findencryption(int type) -{ - Encryptions *ep = encryptions; - - if (!(I_SUPPORT_ENCRYPT & remote_supports_decrypt & typemask(type))) - return(0); - while (ep->type && ep->type != type) - ++ep; - return(ep->type ? ep : 0); -} - -Encryptions * -finddecryption(int type) -{ - Encryptions *ep = encryptions; - - if (!(I_SUPPORT_DECRYPT & remote_supports_encrypt & typemask(type))) - return(0); - while (ep->type && ep->type != type) - ++ep; - return(ep->type ? ep : 0); -} - -#define MAXKEYLEN 64 - -static struct key_info { - unsigned char keyid[MAXKEYLEN]; - int keylen; - int dir; - int *modep; - Encryptions *(*getcrypt)(); -} ki[2] = { - { { 0 }, 0, DIR_ENCRYPT, &encrypt_mode, findencryption }, - { { 0 }, 0, DIR_DECRYPT, &decrypt_mode, finddecryption }, -}; - -void -encrypt_init(const char *name, int server) -{ - Encryptions *ep = encryptions; - - Name = name; - Server = server; - i_support_encrypt = i_support_decrypt = 0; - remote_supports_encrypt = remote_supports_decrypt = 0; - encrypt_mode = 0; - decrypt_mode = 0; - encrypt_output = 0; - decrypt_input = 0; -#ifdef notdef - encrypt_verbose = !server; -#endif - - str_suplen = 4; - - while (ep->type) { - if (encrypt_debug_mode) - printf(">>>%s: I will support %s\r\n", - Name, ENCTYPE_NAME(ep->type)); - i_support_encrypt |= typemask(ep->type); - i_support_decrypt |= typemask(ep->type); - if ((i_wont_support_decrypt & typemask(ep->type)) == 0) - if ((str_send[str_suplen++] = ep->type) == IAC) - str_send[str_suplen++] = IAC; - if (ep->init) - (*ep->init)(Server); - ++ep; - } - str_send[str_suplen++] = IAC; - str_send[str_suplen++] = SE; -} - -void -encrypt_list_types(void) -{ - Encryptions *ep = encryptions; - - printf("Valid encryption types:\n"); - while (ep->type) { - printf("\t%s (%d)\r\n", ENCTYPE_NAME(ep->type), ep->type); - ++ep; - } -} - -int -EncryptEnable(char *type, char *mode) -{ - if (isprefix(type, "help") || isprefix(type, "?")) { - printf("Usage: encrypt enable [input|output]\n"); - encrypt_list_types(); - return(0); - } - if (EncryptType(type, mode)) - return(EncryptStart(mode)); - return(0); -} - -int -EncryptDisable(char *type, char *mode) -{ - Encryptions *ep; - int ret = 0; - - if (isprefix(type, "help") || isprefix(type, "?")) { - printf("Usage: encrypt disable [input|output]\n"); - encrypt_list_types(); - } else if ((ep = (Encryptions *)genget(type, (char**)encryptions, - sizeof(Encryptions))) == 0) { - printf("%s: invalid encryption type\n", type); - } else if (Ambiguous(ep)) { - printf("Ambiguous type '%s'\n", type); - } else { - if ((mode == 0) || (isprefix(mode, "input") ? 1 : 0)) { - if (decrypt_mode == ep->type) - EncryptStopInput(); - i_wont_support_decrypt |= typemask(ep->type); - ret = 1; - } - if ((mode == 0) || (isprefix(mode, "output"))) { - if (encrypt_mode == ep->type) - EncryptStopOutput(); - i_wont_support_encrypt |= typemask(ep->type); - ret = 1; - } - if (ret == 0) - printf("%s: invalid encryption mode\n", mode); - } - return(ret); -} - -int -EncryptType(char *type, char *mode) -{ - Encryptions *ep; - int ret = 0; - - if (isprefix(type, "help") || isprefix(type, "?")) { - printf("Usage: encrypt type [input|output]\n"); - encrypt_list_types(); - } else if ((ep = (Encryptions *)genget(type, (char**)encryptions, - sizeof(Encryptions))) == 0) { - printf("%s: invalid encryption type\n", type); - } else if (Ambiguous(ep)) { - printf("Ambiguous type '%s'\n", type); - } else { - if ((mode == 0) || isprefix(mode, "input")) { - decrypt_mode = ep->type; - i_wont_support_decrypt &= ~typemask(ep->type); - ret = 1; - } - if ((mode == 0) || isprefix(mode, "output")) { - encrypt_mode = ep->type; - i_wont_support_encrypt &= ~typemask(ep->type); - ret = 1; - } - if (ret == 0) - printf("%s: invalid encryption mode\n", mode); - } - return(ret); -} - -int -EncryptStart(char *mode) -{ - int ret = 0; - if (mode) { - if (isprefix(mode, "input")) - return(EncryptStartInput()); - if (isprefix(mode, "output")) - return(EncryptStartOutput()); - if (isprefix(mode, "help") || isprefix(mode, "?")) { - printf("Usage: encrypt start [input|output]\n"); - return(0); - } - printf("%s: invalid encryption mode 'encrypt start ?' for help\n", mode); - return(0); - } - ret += EncryptStartInput(); - ret += EncryptStartOutput(); - return(ret); -} - -int -EncryptStartInput(void) -{ - if (decrypt_mode) { - encrypt_send_request_start(); - return(1); - } - printf("No previous decryption mode, decryption not enabled\r\n"); - return(0); -} - -int -EncryptStartOutput(void) -{ - if (encrypt_mode) { - encrypt_start_output(encrypt_mode); - return(1); - } - printf("No previous encryption mode, encryption not enabled\r\n"); - return(0); -} - -int -EncryptStop(char *mode) -{ - int ret = 0; - if (mode) { - if (isprefix(mode, "input")) - return(EncryptStopInput()); - if (isprefix(mode, "output")) - return(EncryptStopOutput()); - if (isprefix(mode, "help") || isprefix(mode, "?")) { - printf("Usage: encrypt stop [input|output]\n"); - return(0); - } - printf("%s: invalid encryption mode 'encrypt stop ?' for help\n", mode); - return(0); - } - ret += EncryptStopInput(); - ret += EncryptStopOutput(); - return(ret); -} - -int -EncryptStopInput(void) -{ - encrypt_send_request_end(); - return(1); -} - -int -EncryptStopOutput(void) -{ - encrypt_send_end(); - return(1); -} - -void -encrypt_display(void) -{ - printf("Autoencrypt for output is %s. Autodecrypt for input is %s.\r\n", - autoencrypt?"on":"off", autodecrypt?"on":"off"); - - if (encrypt_output) - printf("Currently encrypting output with %s\r\n", - ENCTYPE_NAME(encrypt_mode)); - else - printf("Currently not encrypting output\r\n"); - - if (decrypt_input) - printf("Currently decrypting input with %s\r\n", - ENCTYPE_NAME(decrypt_mode)); - else - printf("Currently not decrypting input\r\n"); -} - -int -EncryptStatus(void) -{ - printf("Autoencrypt for output is %s. Autodecrypt for input is %s.\r\n", - autoencrypt?"on":"off", autodecrypt?"on":"off"); - - if (encrypt_output) - printf("Currently encrypting output with %s\r\n", - ENCTYPE_NAME(encrypt_mode)); - else if (encrypt_mode) { - printf("Currently output is clear text.\r\n"); - printf("Last encryption mode was %s\r\n", - ENCTYPE_NAME(encrypt_mode)); - } else - printf("Currently not encrypting output\r\n"); - - if (decrypt_input) { - printf("Currently decrypting input with %s\r\n", - ENCTYPE_NAME(decrypt_mode)); - } else if (decrypt_mode) { - printf("Currently input is clear text.\r\n"); - printf("Last decryption mode was %s\r\n", - ENCTYPE_NAME(decrypt_mode)); - } else - printf("Currently not decrypting input\r\n"); - - return 1; -} - -void -encrypt_send_support(void) -{ - if (str_suplen) { - /* - * If the user has requested that decryption start - * immediatly, then send a "REQUEST START" before - * we negotiate the type. - */ - if (!Server && autodecrypt) - encrypt_send_request_start(); - telnet_net_write(str_send, str_suplen); - printsub('>', &str_send[2], str_suplen - 2); - str_suplen = 0; - } -} - -int -EncryptDebug(int on) -{ - if (on < 0) - encrypt_debug_mode ^= 1; - else - encrypt_debug_mode = on; - printf("Encryption debugging %s\r\n", - encrypt_debug_mode ? "enabled" : "disabled"); - return(1); -} - -/* turn on verbose encryption, but dont keep telling the whole world - */ -void encrypt_verbose_quiet(int on) -{ - if(on < 0) - encrypt_verbose ^= 1; - else - encrypt_verbose = on ? 1 : 0; -} - -int -EncryptVerbose(int on) -{ - encrypt_verbose_quiet(on); - printf("Encryption %s verbose\r\n", - encrypt_verbose ? "is" : "is not"); - return(1); -} - -int -EncryptAutoEnc(int on) -{ - encrypt_auto(on); - printf("Automatic encryption of output is %s\r\n", - autoencrypt ? "enabled" : "disabled"); - return(1); -} - -int -EncryptAutoDec(int on) -{ - decrypt_auto(on); - printf("Automatic decryption of input is %s\r\n", - autodecrypt ? "enabled" : "disabled"); - return(1); -} - -/* Called when we receive a WONT or a DONT ENCRYPT after we sent a DO - encrypt */ -void -encrypt_not(void) -{ - if (encrypt_verbose) - printf("[ Connection is NOT encrypted ]\r\n"); - else - printf("\r\n*** Connection not encrypted! " - "Communication may be eavesdropped. ***\r\n"); -} - -/* - * Called when ENCRYPT SUPPORT is received. - */ -void -encrypt_support(unsigned char *typelist, int cnt) -{ - int type, use_type = 0; - Encryptions *ep; - - /* - * Forget anything the other side has previously told us. - */ - remote_supports_decrypt = 0; - - while (cnt-- > 0) { - type = *typelist++; - if (encrypt_debug_mode) - printf(">>>%s: He is supporting %s (%d)\r\n", - Name, - ENCTYPE_NAME(type), type); - if ((type < ENCTYPE_CNT) && - (I_SUPPORT_ENCRYPT & typemask(type))) { - remote_supports_decrypt |= typemask(type); - if (use_type == 0) - use_type = type; - } - } - if (use_type) { - ep = findencryption(use_type); - if (!ep) - return; - type = ep->start ? (*ep->start)(DIR_ENCRYPT, Server) : 0; - if (encrypt_debug_mode) - printf(">>>%s: (*ep->start)() returned %d\r\n", - Name, type); - if (type < 0) - return; - encrypt_mode = use_type; - if (type == 0) - encrypt_start_output(use_type); - } -} - -void -encrypt_is(unsigned char *data, int cnt) -{ - Encryptions *ep; - int type, ret; - - if (--cnt < 0) - return; - type = *data++; - if (type < ENCTYPE_CNT) - remote_supports_encrypt |= typemask(type); - if (!(ep = finddecryption(type))) { - if (encrypt_debug_mode) - printf(">>>%s: Can't find type %s (%d) for initial negotiation\r\n", - Name, - ENCTYPE_NAME_OK(type) - ? ENCTYPE_NAME(type) : "(unknown)", - type); - return; - } - if (!ep->is) { - if (encrypt_debug_mode) - printf(">>>%s: No initial negotiation needed for type %s (%d)\r\n", - Name, - ENCTYPE_NAME_OK(type) - ? ENCTYPE_NAME(type) : "(unknown)", - type); - ret = 0; - } else { - ret = (*ep->is)(data, cnt); - if (encrypt_debug_mode) - printf("(*ep->is)(%p, %d) returned %s(%d)\n", data, cnt, - (ret < 0) ? "FAIL " : - (ret == 0) ? "SUCCESS " : "MORE_TO_DO ", ret); - } - if (ret < 0) { - autodecrypt = 0; - } else { - decrypt_mode = type; - if (ret == 0 && autodecrypt) - encrypt_send_request_start(); - } -} - -void -encrypt_reply(unsigned char *data, int cnt) -{ - Encryptions *ep; - int ret, type; - - if (--cnt < 0) - return; - type = *data++; - if (!(ep = findencryption(type))) { - if (encrypt_debug_mode) - printf(">>>%s: Can't find type %s (%d) for initial negotiation\r\n", - Name, - ENCTYPE_NAME_OK(type) - ? ENCTYPE_NAME(type) : "(unknown)", - type); - return; - } - if (!ep->reply) { - if (encrypt_debug_mode) - printf(">>>%s: No initial negotiation needed for type %s (%d)\r\n", - Name, - ENCTYPE_NAME_OK(type) - ? ENCTYPE_NAME(type) : "(unknown)", - type); - ret = 0; - } else { - ret = (*ep->reply)(data, cnt); - if (encrypt_debug_mode) - printf("(*ep->reply)(%p, %d) returned %s(%d)\n", - data, cnt, - (ret < 0) ? "FAIL " : - (ret == 0) ? "SUCCESS " : "MORE_TO_DO ", ret); - } - if (encrypt_debug_mode) - printf(">>>%s: encrypt_reply returned %d\n", Name, ret); - if (ret < 0) { - autoencrypt = 0; - } else { - encrypt_mode = type; - if (ret == 0 && autoencrypt) - encrypt_start_output(type); - } -} - -/* - * Called when ENCRYPT START is received. - */ -void -encrypt_start(unsigned char *data, int cnt) -{ - Encryptions *ep; - - if (!decrypt_mode) { - /* - * Something is wrong. We should not get a START - * command without having already picked our - * decryption scheme. Send a REQUEST-END to - * attempt to clear the channel... - */ - printf("%s: Warning, Cannot decrypt input stream!!!\r\n", Name); - encrypt_send_request_end(); - return; - } - - if ((ep = finddecryption(decrypt_mode))) { - decrypt_input = ep->input; - if (encrypt_verbose) - printf("[ Input is now decrypted with type %s ]\r\n", - ENCTYPE_NAME(decrypt_mode)); - if (encrypt_debug_mode) - printf(">>>%s: Start to decrypt input with type %s\r\n", - Name, ENCTYPE_NAME(decrypt_mode)); - } else { - printf("%s: Warning, Cannot decrypt type %s (%d)!!!\r\n", - Name, - ENCTYPE_NAME_OK(decrypt_mode) - ? ENCTYPE_NAME(decrypt_mode) - : "(unknown)", - decrypt_mode); - encrypt_send_request_end(); - } -} - -void -encrypt_session_key(Session_Key *key, int server) -{ - Encryptions *ep = encryptions; - - havesessionkey = 1; - - while (ep->type) { - if (ep->session) - (*ep->session)(key, server); - ++ep; - } -} - -/* - * Called when ENCRYPT END is received. - */ -void -encrypt_end(void) -{ - decrypt_input = 0; - if (encrypt_debug_mode) - printf(">>>%s: Input is back to clear text\r\n", Name); - if (encrypt_verbose) - printf("[ Input is now clear text ]\r\n"); -} - -/* - * Called when ENCRYPT REQUEST-END is received. - */ -void -encrypt_request_end(void) -{ - encrypt_send_end(); -} - -/* - * Called when ENCRYPT REQUEST-START is received. If we receive - * this before a type is picked, then that indicates that the - * other side wants us to start encrypting data as soon as we - * can. - */ -void -encrypt_request_start(unsigned char *data, int cnt) -{ - if (encrypt_mode == 0) { - if (Server) - autoencrypt = 1; - return; - } - encrypt_start_output(encrypt_mode); -} - -static unsigned char str_keyid[(MAXKEYLEN*2)+5] = { IAC, SB, TELOPT_ENCRYPT }; - -static void -encrypt_keyid(struct key_info *kp, unsigned char *keyid, int len) -{ - Encryptions *ep; - int dir = kp->dir; - int ret = 0; - - if (len > MAXKEYLEN) - len = MAXKEYLEN; - - if (!(ep = (*kp->getcrypt)(*kp->modep))) { - if (len == 0) - return; - kp->keylen = 0; - } else if (len == 0) { - /* - * Empty option, indicates a failure. - */ - if (kp->keylen == 0) - return; - kp->keylen = 0; - if (ep->keyid) - (void)(*ep->keyid)(dir, kp->keyid, &kp->keylen); - - } else if ((len != kp->keylen) || (memcmp(keyid,kp->keyid,len) != 0)) { - /* - * Length or contents are different - */ - kp->keylen = len; - memcpy(kp->keyid,keyid, len); - if (ep->keyid) - (void)(*ep->keyid)(dir, kp->keyid, &kp->keylen); - } else { - if (ep->keyid) - ret = (*ep->keyid)(dir, kp->keyid, &kp->keylen); - if ((ret == 0) && (dir == DIR_ENCRYPT) && autoencrypt) - encrypt_start_output(*kp->modep); - return; - } - - encrypt_send_keyid(dir, kp->keyid, kp->keylen, 0); -} - -void encrypt_enc_keyid(unsigned char *keyid, int len) -{ - encrypt_keyid(&ki[1], keyid, len); -} - -void encrypt_dec_keyid(unsigned char *keyid, int len) -{ - encrypt_keyid(&ki[0], keyid, len); -} - - -void encrypt_send_keyid(int dir, unsigned char *keyid, int keylen, int saveit) -{ - unsigned char *strp; - - str_keyid[3] = (dir == DIR_ENCRYPT) - ? ENCRYPT_ENC_KEYID : ENCRYPT_DEC_KEYID; - if (saveit) { - struct key_info *kp = &ki[(dir == DIR_ENCRYPT) ? 0 : 1]; - memcpy(kp->keyid,keyid, keylen); - kp->keylen = keylen; - } - - for (strp = &str_keyid[4]; keylen > 0; --keylen) { - if ((*strp++ = *keyid++) == IAC) - *strp++ = IAC; - } - *strp++ = IAC; - *strp++ = SE; - telnet_net_write(str_keyid, strp - str_keyid); - printsub('>', &str_keyid[2], strp - str_keyid - 2); -} - -void -encrypt_auto(int on) -{ - if (on < 0) - autoencrypt ^= 1; - else - autoencrypt = on ? 1 : 0; -} - -void -decrypt_auto(int on) -{ - if (on < 0) - autodecrypt ^= 1; - else - autodecrypt = on ? 1 : 0; -} - -void -encrypt_start_output(int type) -{ - Encryptions *ep; - unsigned char *p; - int i; - - if (!(ep = findencryption(type))) { - if (encrypt_debug_mode) { - printf(">>>%s: Can't encrypt with type %s (%d)\r\n", - Name, - ENCTYPE_NAME_OK(type) - ? ENCTYPE_NAME(type) : "(unknown)", - type); - } - return; - } - if (ep->start) { - i = (*ep->start)(DIR_ENCRYPT, Server); - if (encrypt_debug_mode) { - printf(">>>%s: Encrypt start: %s (%d) %s\r\n", - Name, - (i < 0) ? "failed" : - "initial negotiation in progress", - i, ENCTYPE_NAME(type)); - } - if (i) - return; - } - p = str_start + 3; - *p++ = ENCRYPT_START; - for (i = 0; i < ki[0].keylen; ++i) { - if ((*p++ = ki[0].keyid[i]) == IAC) - *p++ = IAC; - } - *p++ = IAC; - *p++ = SE; - telnet_net_write(str_start, p - str_start); - net_encrypt(); - printsub('>', &str_start[2], p - &str_start[2]); - /* - * If we are already encrypting in some mode, then - * encrypt the ring (which includes our request) in - * the old mode, mark it all as "clear text" and then - * switch to the new mode. - */ - encrypt_output = ep->output; - encrypt_mode = type; - if (encrypt_debug_mode) - printf(">>>%s: Started to encrypt output with type %s\r\n", - Name, ENCTYPE_NAME(type)); - if (encrypt_verbose) - printf("[ Output is now encrypted with type %s ]\r\n", - ENCTYPE_NAME(type)); -} - -void -encrypt_send_end(void) -{ - if (!encrypt_output) - return; - - str_end[3] = ENCRYPT_END; - telnet_net_write(str_end, sizeof(str_end)); - net_encrypt(); - printsub('>', &str_end[2], sizeof(str_end) - 2); - /* - * Encrypt the output buffer now because it will not be done by - * netflush... - */ - encrypt_output = 0; - if (encrypt_debug_mode) - printf(">>>%s: Output is back to clear text\r\n", Name); - if (encrypt_verbose) - printf("[ Output is now clear text ]\r\n"); -} - -void -encrypt_send_request_start(void) -{ - unsigned char *p; - int i; - - p = &str_start[3]; - *p++ = ENCRYPT_REQSTART; - for (i = 0; i < ki[1].keylen; ++i) { - if ((*p++ = ki[1].keyid[i]) == IAC) - *p++ = IAC; - } - *p++ = IAC; - *p++ = SE; - telnet_net_write(str_start, p - str_start); - printsub('>', &str_start[2], p - &str_start[2]); - if (encrypt_debug_mode) - printf(">>>%s: Request input to be encrypted\r\n", Name); -} - -void -encrypt_send_request_end(void) -{ - str_end[3] = ENCRYPT_REQEND; - telnet_net_write(str_end, sizeof(str_end)); - printsub('>', &str_end[2], sizeof(str_end) - 2); - - if (encrypt_debug_mode) - printf(">>>%s: Request input to be clear text\r\n", Name); -} - - -void encrypt_wait(void) -{ - if (encrypt_debug_mode) - printf(">>>%s: in encrypt_wait\r\n", Name); - if (!havesessionkey || !(I_SUPPORT_ENCRYPT & remote_supports_decrypt)) - return; - while (autoencrypt && !encrypt_output) - if (telnet_spin()) - return; -} - -int -encrypt_delay(void) -{ - if(!havesessionkey || - (I_SUPPORT_ENCRYPT & remote_supports_decrypt) == 0 || - (I_SUPPORT_DECRYPT & remote_supports_encrypt) == 0) - return 0; - if(!(encrypt_output && decrypt_input)) - return 1; - return 0; -} - -int encrypt_is_encrypting() -{ - if (encrypt_output && decrypt_input) - return 1; - return 0; -} - -void -encrypt_debug(int mode) -{ - encrypt_debug_mode = mode; -} - -void encrypt_gen_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - char tbuf[16], *cp; - - cnt -= 2; - data += 2; - buf[buflen-1] = '\0'; - buf[buflen-2] = '*'; - buflen -= 2;; - for (; cnt > 0; cnt--, data++) { - snprintf(tbuf, sizeof(tbuf), " %d", *data); - for (cp = tbuf; *cp && buflen > 0; --buflen) - *buf++ = *cp++; - if (buflen <= 0) - return; - } - *buf = '\0'; -} - -void -encrypt_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - Encryptions *ep; - int type = data[1]; - - for (ep = encryptions; ep->type && ep->type != type; ep++) - ; - - if (ep->printsub) - (*ep->printsub)(data, cnt, buf, buflen); - else - encrypt_gen_printsub(data, cnt, buf, buflen); -} -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/genget.c b/crypto/heimdal/appl/telnet/libtelnet/genget.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/genget.c +++ /dev/null @@ -1,106 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#include -#include "misc-proto.h" - -RCSID("$Id$"); - - -#define LOWER(x) (isupper(x) ? tolower(x) : (x)) -/* - * The prefix function returns 0 if *s1 is not a prefix - * of *s2. If *s1 exactly matches *s2, the negative of - * the length is returned. If *s1 is a prefix of *s2, - * the length of *s1 is returned. - */ - -int -isprefix(char *s1, char *s2) -{ - char *os1; - char c1, c2; - - if (*s1 == '\0') - return(-1); - os1 = s1; - c1 = *s1; - c2 = *s2; - while (tolower((unsigned char)c1) == tolower((unsigned char)c2)) { - if (c1 == '\0') - break; - c1 = *++s1; - c2 = *++s2; - } - return(*s1 ? 0 : (*s2 ? (s1 - os1) : (os1 - s1))); -} - -static char *ambiguous; /* special return value for command routines */ - -char ** -genget(char *name, char **table, int stlen) - /* name to match */ - /* name entry in table */ - -{ - char **c, **found; - int n; - - if (name == 0) - return 0; - - found = 0; - for (c = table; *c != 0; c = (char **)((char *)c + stlen)) { - if ((n = isprefix(name, *c)) == 0) - continue; - if (n < 0) /* exact match */ - return(c); - if (found) - return(&ambiguous); - found = c; - } - return(found); -} - -/* - * Function call version of Ambiguous() - */ -int -Ambiguous(void *s) -{ - return((char **)s == &ambiguous); -} diff --git a/crypto/heimdal/appl/telnet/libtelnet/kerberos5.c b/crypto/heimdal/appl/telnet/libtelnet/kerberos5.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/kerberos5.c +++ /dev/null @@ -1,896 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America may - * require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -#include - -RCSID("$Id$"); - -#ifdef KRB5 - -#include -#include -#include -#include -#include -#include -#include -#include -#define Authenticator k5_Authenticator -#include -#undef Authenticator -#include -#ifdef SOCKS -#include -#endif - - -#include "encrypt.h" -#include "auth.h" -#include "misc.h" - -#if defined(DCE) -int dfsk5ok = 0; -int dfspag = 0; -int dfsfwd = 0; -#endif - -int forward_flags = 0; /* Flags get set in telnet/main.c on -f and -F */ - -int forward(int); -int forwardable(int); - -/* These values need to be the same as those defined in telnet/main.c. */ -/* Either define them in both places, or put in some common header file. */ -#define OPTS_FORWARD_CREDS 0x00000002 -#define OPTS_FORWARDABLE_CREDS 0x00000001 - - -void kerberos5_forward (Authenticator *); - -static unsigned char str_data[4] = { IAC, SB, TELOPT_AUTHENTICATION, 0 }; - -#define KRB_AUTH 0 /* Authentication data follows */ -#define KRB_REJECT 1 /* Rejected (reason might follow) */ -#define KRB_ACCEPT 2 /* Accepted */ -#define KRB_RESPONSE 3 /* Response for mutual auth. */ - -#define KRB_FORWARD 4 /* Forwarded credentials follow */ -#define KRB_FORWARD_ACCEPT 5 /* Forwarded credentials accepted */ -#define KRB_FORWARD_REJECT 6 /* Forwarded credentials rejected */ - -static krb5_data auth; -static krb5_ticket *ticket; - -static krb5_context context; -static krb5_auth_context auth_context; - -static int -Data(Authenticator *ap, int type, const void *d, int c) -{ - const unsigned char *cp, *cd = d; - unsigned char *p0, *p; - size_t len = sizeof(str_data) + 3 + 2; - int ret; - - if (c == -1) - c = strlen((const char*)cd); - - for (cp = cd; cp - cd < c; cp++, len++) - if (*cp == IAC) - len++; - - p0 = malloc(len); - if (p0 == NULL) - return 0; - - memcpy(p0, str_data, sizeof(str_data)); - p = p0 + sizeof(str_data); - - if (auth_debug_mode) { - printf("%s:%d: [%d] (%d)", - str_data[3] == TELQUAL_IS ? ">>>IS" : ">>>REPLY", - str_data[3], - type, c); - printd(d, c); - printf("\r\n"); - } - *p++ = ap->type; - *p++ = ap->way; - *p++ = type; - while (c-- > 0) { - if ((*p++ = *cd++) == IAC) - *p++ = IAC; - } - *p++ = IAC; - *p++ = SE; - if (str_data[3] == TELQUAL_IS) - printsub('>', &p0[2], len - 2); - ret = telnet_net_write(p0, len); - free(p0); - return ret; -} - -int -kerberos5_init(Authenticator *ap, int server) -{ - krb5_error_code ret; - - ret = krb5_init_context(&context); - if (ret) - return 0; - if (server) { - krb5_keytab kt; - krb5_kt_cursor cursor; - - ret = krb5_kt_default(context, &kt); - if (ret) - return 0; - - ret = krb5_kt_start_seq_get (context, kt, &cursor); - if (ret) { - krb5_kt_close (context, kt); - return 0; - } - krb5_kt_end_seq_get (context, kt, &cursor); - krb5_kt_close (context, kt); - - str_data[3] = TELQUAL_REPLY; - } else - str_data[3] = TELQUAL_IS; - return(1); -} - -extern int net; -static int -kerberos5_send(char *name, Authenticator *ap) -{ - krb5_error_code ret; - krb5_ccache ccache; - int ap_opts; - krb5_data cksum_data; - char ap_msg[2]; - - if (!UserNameRequested) { - if (auth_debug_mode) { - printf("Kerberos V5: no user name supplied\r\n"); - } - return(0); - } - - ret = krb5_cc_default(context, &ccache); - if (ret) { - if (auth_debug_mode) { - printf("Kerberos V5: could not get default ccache: %s\r\n", - krb5_get_err_text (context, ret)); - } - return 0; - } - - if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) - ap_opts = AP_OPTS_MUTUAL_REQUIRED; - else - ap_opts = 0; - - ap_opts |= AP_OPTS_USE_SUBKEY; - - ret = krb5_auth_con_init (context, &auth_context); - if (ret) { - if (auth_debug_mode) { - printf("Kerberos V5: krb5_auth_con_init failed (%s)\r\n", - krb5_get_err_text(context, ret)); - } - return(0); - } - - ret = krb5_auth_con_setaddrs_from_fd (context, - auth_context, - &net); - if (ret) { - if (auth_debug_mode) { - printf ("Kerberos V5:" - " krb5_auth_con_setaddrs_from_fd failed (%s)\r\n", - krb5_get_err_text(context, ret)); - } - return(0); - } - - krb5_auth_con_setkeytype (context, auth_context, KRB5_ENCTYPE_DES_CBC_CRC); - - ap_msg[0] = ap->type; - ap_msg[1] = ap->way; - - cksum_data.length = sizeof(ap_msg); - cksum_data.data = ap_msg; - - - { - krb5_principal service; - char sname[128]; - - - ret = krb5_sname_to_principal (context, - RemoteHostName, - NULL, - KRB5_NT_SRV_HST, - &service); - if(ret) { - if (auth_debug_mode) { - printf ("Kerberos V5:" - " krb5_sname_to_principal(%s) failed (%s)\r\n", - RemoteHostName, krb5_get_err_text(context, ret)); - } - return 0; - } - ret = krb5_unparse_name_fixed(context, service, sname, sizeof(sname)); - if(ret) { - if (auth_debug_mode) { - printf ("Kerberos V5:" - " krb5_unparse_name_fixed failed (%s)\r\n", - krb5_get_err_text(context, ret)); - } - return 0; - } - printf("[ Trying %s (%s)... ]\r\n", name, sname); - ret = krb5_mk_req_exact(context, &auth_context, ap_opts, - service, - &cksum_data, ccache, &auth); - krb5_free_principal (context, service); - - } - if (ret) { - if (1 || auth_debug_mode) { - printf("Kerberos V5: mk_req failed (%s)\r\n", - krb5_get_err_text(context, ret)); - } - return(0); - } - - if (!auth_sendname((unsigned char *)UserNameRequested, - strlen(UserNameRequested))) { - if (auth_debug_mode) - printf("Not enough room for user name\r\n"); - return(0); - } - if (!Data(ap, KRB_AUTH, auth.data, auth.length)) { - if (auth_debug_mode) - printf("Not enough room for authentication data\r\n"); - return(0); - } - if (auth_debug_mode) { - printf("Sent Kerberos V5 credentials to server\r\n"); - } - return(1); -} - -int -kerberos5_send_mutual(Authenticator *ap) -{ - return kerberos5_send("mutual KERBEROS5", ap); -} - -int -kerberos5_send_oneway(Authenticator *ap) -{ - return kerberos5_send("KERBEROS5", ap); -} - -static void log_message(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - if (auth_debug_mode) { - va_start(ap, fmt); - vfprintf(stdout, fmt, ap); - va_end(ap); - fprintf(stdout, "\r\n"); - } - va_start(ap, fmt); - vsyslog(LOG_NOTICE, fmt, ap); - va_end(ap); -} - -void -kerberos5_is(Authenticator *ap, unsigned char *data, int cnt) -{ - krb5_error_code ret; - krb5_data outbuf; - krb5_keyblock *key_block; - char *name; - krb5_principal server; - int zero = 0; - - if (cnt-- < 1) - return; - switch (*data++) { - case KRB_AUTH: - auth.data = (char *)data; - auth.length = cnt; - - auth_context = NULL; - - ret = krb5_auth_con_init (context, &auth_context); - if (ret) { - Data(ap, KRB_REJECT, "krb5_auth_con_init failed", -1); - auth_finished(ap, AUTH_REJECT); - log_message("Kerberos V5: krb5_auth_con_init failed (%s)", - krb5_get_err_text(context, ret)); - return; - } - - ret = krb5_auth_con_setaddrs_from_fd (context, - auth_context, - &zero); - if (ret) { - Data(ap, KRB_REJECT, "krb5_auth_con_setaddrs_from_fd failed", -1); - auth_finished(ap, AUTH_REJECT); - log_message("Kerberos V5: " - "krb5_auth_con_setaddrs_from_fd failed (%s)", - krb5_get_err_text(context, ret)); - return; - } - - ret = krb5_sock_to_principal (context, - 0, - "host", - KRB5_NT_SRV_HST, - &server); - if (ret) { - Data(ap, KRB_REJECT, "krb5_sock_to_principal failed", -1); - auth_finished(ap, AUTH_REJECT); - log_message("Kerberos V5: " - "krb5_sock_to_principal failed (%s)", - krb5_get_err_text(context, ret)); - return; - } - - ret = krb5_rd_req(context, - &auth_context, - &auth, - server, - NULL, - NULL, - &ticket); - - krb5_free_principal (context, server); - if (ret) { - const char *errbuf2 = "Read req failed"; - char *errbuf; - int ret2; - - ret2 = asprintf(&errbuf, - "Read req failed: %s", - krb5_get_err_text(context, ret)); - if (ret2 != -1) - errbuf2 = errbuf; - Data(ap, KRB_REJECT, errbuf2, -1); - log_message("%s", errbuf2); - if (ret2 != -1) - free (errbuf); - return; - } - - { - char ap_msg[2]; - - ap_msg[0] = ap->type; - ap_msg[1] = ap->way; - - ret = krb5_verify_authenticator_checksum(context, - auth_context, - ap_msg, - sizeof(ap_msg)); - - if (ret) { - const char *errbuf2 = "Bad checksum"; - char *errbuf; - int ret2; - - ret2 = asprintf(&errbuf, "Bad checksum: %s", - krb5_get_err_text(context, ret)); - if (ret2 != -1) - errbuf2 = errbuf; - Data(ap, KRB_REJECT, errbuf2, -1); - log_message("%s", errbuf2); - if (ret2 != -1) - free(errbuf); - return; - } - } - ret = krb5_auth_con_getremotesubkey (context, - auth_context, - &key_block); - - if (ret) { - Data(ap, KRB_REJECT, "krb5_auth_con_getremotesubkey failed", -1); - auth_finished(ap, AUTH_REJECT); - log_message("Kerberos V5: " - "krb5_auth_con_getremotesubkey failed (%s)", - krb5_get_err_text(context, ret)); - return; - } - - if (key_block == NULL) { - ret = krb5_auth_con_getkey(context, - auth_context, - &key_block); - } - if (ret) { - Data(ap, KRB_REJECT, "krb5_auth_con_getkey failed", -1); - auth_finished(ap, AUTH_REJECT); - log_message("Kerberos V5: " - "krb5_auth_con_getkey failed (%s)", - krb5_get_err_text(context, ret)); - return; - } - if (key_block == NULL) { - Data(ap, KRB_REJECT, "no subkey received", -1); - auth_finished(ap, AUTH_REJECT); - log_message("Kerberos V5: " - "krb5_auth_con_getremotesubkey returned NULL key"); - return; - } - - if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) { - ret = krb5_mk_rep(context, auth_context, &outbuf); - if (ret) { - Data(ap, KRB_REJECT, - "krb5_mk_rep failed", -1); - auth_finished(ap, AUTH_REJECT); - log_message("Kerberos V5: " - "krb5_mk_rep failed (%s)", - krb5_get_err_text(context, ret)); - krb5_free_keyblock(context, key_block); - return; - } - Data(ap, KRB_RESPONSE, outbuf.data, outbuf.length); - } - if (krb5_unparse_name(context, ticket->client, &name)) - name = 0; - - if(UserNameRequested && krb5_kuserok(context, - ticket->client, - UserNameRequested)) { - Data(ap, KRB_ACCEPT, name, name ? -1 : 0); - log_message("%s accepted as user %s from %s", - name ? name : "", - UserNameRequested ? UserNameRequested : "", - RemoteHostName ? RemoteHostName : ""); - - if(key_block->keytype == ETYPE_DES_CBC_MD5 || - key_block->keytype == ETYPE_DES_CBC_MD4 || - key_block->keytype == ETYPE_DES_CBC_CRC) { - Session_Key skey; - - skey.type = SK_DES; - skey.length = 8; - skey.data = key_block->keyvalue.data; - encrypt_session_key(&skey, 0); - } - - } else { - const char *msg2 = "user is not authorized to login"; - char *msg; - - ret = asprintf (&msg, "user `%s' is not authorized to " - "login as `%s'", - name ? name : "", - UserNameRequested ? UserNameRequested : ""); - if (ret != -1) - msg2 = msg; - Data(ap, KRB_REJECT, (void *)msg2, -1); - if (ret != -1) - free(msg); - auth_finished (ap, AUTH_REJECT); - krb5_free_keyblock(context, key_block); - break; - } - auth_finished(ap, AUTH_USER); - krb5_free_keyblock(context, key_block); - - break; - case KRB_FORWARD: { - struct passwd *pwd; - char ccname[1024]; /* XXX */ - krb5_data inbuf; - krb5_ccache ccache; - inbuf.data = (char *)data; - inbuf.length = cnt; - - pwd = getpwnam (UserNameRequested); - if (pwd == NULL) - break; - - snprintf (ccname, sizeof(ccname), - "FILE:/tmp/krb5cc_%lu", (unsigned long)pwd->pw_uid); - - ret = krb5_cc_resolve (context, ccname, &ccache); - if (ret) { - log_message("Kerberos V5: could not get ccache: %s", - krb5_get_err_text(context, ret)); - break; - } - - ret = krb5_cc_initialize (context, - ccache, - ticket->client); - if (ret) { - log_message("Kerberos V5: could not init ccache: %s", - krb5_get_err_text(context, ret)); - break; - } - -#if defined(DCE) - esetenv("KRB5CCNAME", ccname, 1); -#endif - ret = krb5_rd_cred2 (context, - auth_context, - ccache, - &inbuf); - if(ret) { - const char *errbuf2 = "Read forwarded creds failed"; - char *errbuf; - int ret2; - - ret2 = asprintf (&errbuf, - "Read forwarded creds failed: %s", - krb5_get_err_text (context, ret)); - if (ret2 != -1) - errbuf2 = errbuf; - Data(ap, KRB_FORWARD_REJECT, errbuf, -1); - log_message("Could not read forwarded credentials: %s", errbuf); - - if (ret2 != -1) - free (errbuf); - } else { - Data(ap, KRB_FORWARD_ACCEPT, 0, 0); -#if defined(DCE) - dfsfwd = 1; -#endif - } - chown (ccname + 5, pwd->pw_uid, -1); - log_message("Forwarded credentials obtained"); - break; - } - default: - log_message("Unknown Kerberos option %d", data[-1]); - Data(ap, KRB_REJECT, 0, 0); - break; - } -} - -void -kerberos5_reply(Authenticator *ap, unsigned char *data, int cnt) -{ - static int mutual_complete = 0; - - if (cnt-- < 1) - return; - switch (*data++) { - case KRB_REJECT: - if (cnt > 0) { - printf("[ Kerberos V5 refuses authentication because %.*s ]\r\n", - cnt, data); - } else - printf("[ Kerberos V5 refuses authentication ]\r\n"); - auth_send_retry(); - return; - case KRB_ACCEPT: { - krb5_error_code ret; - Session_Key skey; - krb5_keyblock *keyblock; - - if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL && - !mutual_complete) { - printf("[ Kerberos V5 accepted you, but didn't provide mutual authentication! ]\r\n"); - auth_send_retry(); - return; - } - if (cnt) - printf("[ Kerberos V5 accepts you as ``%.*s'' ]\r\n", cnt, data); - else - printf("[ Kerberos V5 accepts you ]\r\n"); - - ret = krb5_auth_con_getlocalsubkey (context, - auth_context, - &keyblock); - if (ret) - ret = krb5_auth_con_getkey (context, - auth_context, - &keyblock); - if(ret) { - printf("[ krb5_auth_con_getkey: %s ]\r\n", - krb5_get_err_text(context, ret)); - auth_send_retry(); - return; - } - - skey.type = SK_DES; - skey.length = 8; - skey.data = keyblock->keyvalue.data; - encrypt_session_key(&skey, 0); - krb5_free_keyblock (context, keyblock); - auth_finished(ap, AUTH_USER); - if (forward_flags & OPTS_FORWARD_CREDS) - kerberos5_forward(ap); - break; - } - case KRB_RESPONSE: - if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) { - /* the rest of the reply should contain a krb_ap_rep */ - krb5_ap_rep_enc_part *reply; - krb5_data inbuf; - krb5_error_code ret; - - inbuf.length = cnt; - inbuf.data = (char *)data; - - ret = krb5_rd_rep(context, auth_context, &inbuf, &reply); - if (ret) { - printf("[ Mutual authentication failed: %s ]\r\n", - krb5_get_err_text (context, ret)); - auth_send_retry(); - return; - } - krb5_free_ap_rep_enc_part(context, reply); - mutual_complete = 1; - } - return; - case KRB_FORWARD_ACCEPT: - printf("[ Kerberos V5 accepted forwarded credentials ]\r\n"); - return; - case KRB_FORWARD_REJECT: - printf("[ Kerberos V5 refuses forwarded credentials because %.*s ]\r\n", - cnt, data); - return; - default: - if (auth_debug_mode) - printf("Unknown Kerberos option %d\r\n", data[-1]); - return; - } -} - -int -kerberos5_status(Authenticator *ap, char *name, size_t name_sz, int level) -{ - if (level < AUTH_USER) - return(level); - - if (UserNameRequested && - krb5_kuserok(context, - ticket->client, - UserNameRequested)) - { - strlcpy(name, UserNameRequested, name_sz); -#if defined(DCE) - dfsk5ok = 1; -#endif - return(AUTH_VALID); - } else - return(AUTH_USER); -} - -#define BUMP(buf, len) while (*(buf)) {++(buf), --(len);} -#define ADDC(buf, len, c) if ((len) > 0) {*(buf)++ = (c); --(len);} - -void -kerberos5_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - int i; - - buf[buflen-1] = '\0'; /* make sure it's NULL terminated */ - buflen -= 1; - - switch(data[3]) { - case KRB_REJECT: /* Rejected (reason might follow) */ - strlcpy((char *)buf, " REJECT ", buflen); - goto common; - - case KRB_ACCEPT: /* Accepted (name might follow) */ - strlcpy((char *)buf, " ACCEPT ", buflen); - common: - BUMP(buf, buflen); - if (cnt <= 4) - break; - ADDC(buf, buflen, '"'); - for (i = 4; i < cnt; i++) - ADDC(buf, buflen, data[i]); - ADDC(buf, buflen, '"'); - ADDC(buf, buflen, '\0'); - break; - - - case KRB_AUTH: /* Authentication data follows */ - strlcpy((char *)buf, " AUTH", buflen); - goto common2; - - case KRB_RESPONSE: - strlcpy((char *)buf, " RESPONSE", buflen); - goto common2; - - case KRB_FORWARD: /* Forwarded credentials follow */ - strlcpy((char *)buf, " FORWARD", buflen); - goto common2; - - case KRB_FORWARD_ACCEPT: /* Forwarded credentials accepted */ - strlcpy((char *)buf, " FORWARD_ACCEPT", buflen); - goto common2; - - case KRB_FORWARD_REJECT: /* Forwarded credentials rejected */ - /* (reason might follow) */ - strlcpy((char *)buf, " FORWARD_REJECT", buflen); - goto common2; - - default: - snprintf((char*)buf, buflen, " %d (unknown)", data[3]); - common2: - BUMP(buf, buflen); - for (i = 4; i < cnt; i++) { - snprintf((char*)buf, buflen, " %d", data[i]); - BUMP(buf, buflen); - } - break; - } -} - -void -kerberos5_forward(Authenticator *ap) -{ - krb5_error_code ret; - krb5_ccache ccache; - krb5_creds creds; - KDCOptions flags; - krb5_data out_data; - krb5_principal principal; - - ret = krb5_cc_default (context, &ccache); - if (ret) { - if (auth_debug_mode) - printf ("KerberosV5: could not get default ccache: %s\r\n", - krb5_get_err_text (context, ret)); - return; - } - - ret = krb5_cc_get_principal (context, ccache, &principal); - if (ret) { - if (auth_debug_mode) - printf ("KerberosV5: could not get principal: %s\r\n", - krb5_get_err_text (context, ret)); - return; - } - - memset (&creds, 0, sizeof(creds)); - - creds.client = principal; - - ret = krb5_make_principal(context, - &creds.server, - principal->realm, - "krbtgt", - principal->realm, - NULL); - - if (ret) { - if (auth_debug_mode) - printf ("KerberosV5: could not get principal: %s\r\n", - krb5_get_err_text (context, ret)); - return; - } - - creds.times.endtime = 0; - - memset(&flags, 0, sizeof(flags)); - flags.forwarded = 1; - if (forward_flags & OPTS_FORWARDABLE_CREDS) - flags.forwardable = 1; - - ret = krb5_get_forwarded_creds (context, - auth_context, - ccache, - KDCOptions2int(flags), - RemoteHostName, - &creds, - &out_data); - if (ret) { - if (auth_debug_mode) - printf ("Kerberos V5: error getting forwarded creds: %s\r\n", - krb5_get_err_text (context, ret)); - return; - } - - if(!Data(ap, KRB_FORWARD, out_data.data, out_data.length)) { - if (auth_debug_mode) - printf("Not enough room for authentication data\r\n"); - } else { - if (auth_debug_mode) - printf("Forwarded local Kerberos V5 credentials to server\r\n"); - } -} - -#if defined(DCE) -/* if this was a K5 authentication try and join a PAG for the user. */ -void -kerberos5_dfspag(void) -{ - if (dfsk5ok) { - dfspag = krb5_dfs_pag(context, dfsfwd, ticket->client, - UserNameRequested); - } -} -#endif - -int -kerberos5_set_forward(int on) -{ - if(on == 0) - forward_flags &= ~OPTS_FORWARD_CREDS; - if(on == 1) - forward_flags |= OPTS_FORWARD_CREDS; - if(on == -1) - forward_flags ^= OPTS_FORWARD_CREDS; - return 0; -} - -int -kerberos5_set_forwardable(int on) -{ - if(on == 0) - forward_flags &= ~OPTS_FORWARDABLE_CREDS; - if(on == 1) - forward_flags |= OPTS_FORWARDABLE_CREDS; - if(on == -1) - forward_flags ^= OPTS_FORWARDABLE_CREDS; - return 0; -} - -#endif /* KRB5 */ diff --git a/crypto/heimdal/appl/telnet/libtelnet/misc-proto.h b/crypto/heimdal/appl/telnet/libtelnet/misc-proto.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/misc-proto.h +++ /dev/null @@ -1,79 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)misc-proto.h 8.1 (Berkeley) 6/4/93 - */ - -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Export of this software from the United States of America is assumed - * to require a specific license from the United States Government. - * It is the responsibility of any person or organization contemplating - * export to obtain such a license before exporting. - * - * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and - * distribute this software and its documentation for any purpose and - * without fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, and that - * the name of M.I.T. not be used in advertising or publicity pertaining - * to distribution of the software without specific, written prior - * permission. M.I.T. makes no representations about the suitability of - * this software for any purpose. It is provided "as is" without express - * or implied warranty. - */ - -/* $Id$ */ - -#ifndef __MISC_PROTO__ -#define __MISC_PROTO__ - -void auth_encrypt_init (const char *, const char *, const char *, int); -void auth_encrypt_user(const char *name); -void auth_encrypt_connect (int); -void printd (const unsigned char *, int); - -char** genget (char *name, char **table, int stlen); -int isprefix(char *s1, char *s2); -int Ambiguous(void *s); - -/* - * These functions are imported from the application - */ -int telnet_net_write (unsigned char *, int); -void net_encrypt (void); -int telnet_spin (void); -char *telnet_getenv (const char *); -char *telnet_gets (char *, char *, int, int); -void printsub(int direction, unsigned char *pointer, size_t); -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/misc.h b/crypto/heimdal/appl/telnet/libtelnet/misc.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/misc.h +++ /dev/null @@ -1,42 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)misc.h 8.1 (Berkeley) 6/4/93 - */ - -extern char *UserNameRequested; -extern const char *LocalHostName; -extern const char *RemoteHostName; -extern int ConnectedCount; -extern int ReservedPort; - -#include "misc-proto.h" diff --git a/crypto/heimdal/appl/telnet/libtelnet/misc.c b/crypto/heimdal/appl/telnet/libtelnet/misc.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/misc.c +++ /dev/null @@ -1,95 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include - -RCSID("$Id$"); - -#include -#include -#include -#include -#ifdef SOCKS -#include -#endif -#include "misc.h" -#include "auth.h" -#include "encrypt.h" - - -const char *RemoteHostName; -const char *LocalHostName; -char *UserNameRequested = 0; -int ConnectedCount = 0; - -void -auth_encrypt_init(const char *local, const char *remote, const char *name, - int server) -{ - RemoteHostName = remote; - LocalHostName = local; -#ifdef AUTHENTICATION - auth_init(name, server); -#endif -#ifdef ENCRYPTION - encrypt_init(name, server); -#endif - if (UserNameRequested) { - free(UserNameRequested); - UserNameRequested = 0; - } -} - -void -auth_encrypt_user(const char *name) -{ - if (UserNameRequested) - free(UserNameRequested); - UserNameRequested = name ? strdup(name) : 0; -} - -void -auth_encrypt_connect(int cnt) -{ -} - -void -printd(const unsigned char *data, int cnt) -{ - if (cnt > 16) - cnt = 16; - while (cnt-- > 0) { - printf(" %02x", *data); - ++data; - } -} diff --git a/crypto/heimdal/appl/telnet/libtelnet/rsaencpwd.c b/crypto/heimdal/appl/telnet/libtelnet/rsaencpwd.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/rsaencpwd.c +++ /dev/null @@ -1,486 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include - -RCSID("$Id$"); - -#ifdef RSA_ENCPWD -/* - * COPYRIGHT (C) 1990 DIGITAL EQUIPMENT CORPORATION - * ALL RIGHTS RESERVED - * - * "Digital Equipment Corporation authorizes the reproduction, - * distribution and modification of this software subject to the following - * restrictions: - * - * 1. Any partial or whole copy of this software, or any modification - * thereof, must include this copyright notice in its entirety. - * - * 2. This software is supplied "as is" with no warranty of any kind, - * expressed or implied, for any purpose, including any warranty of fitness - * or merchantibility. DIGITAL assumes no responsibility for the use or - * reliability of this software, nor promises to provide any form of - * support for it on any basis. - * - * 3. Distribution of this software is authorized only if no profit or - * remuneration of any kind is received in exchange for such distribution. - * - * 4. This software produces public key authentication certificates - * bearing an expiration date established by DIGITAL and RSA Data - * Security, Inc. It may cease to generate certificates after the expiration - * date. Any modification of this software that changes or defeats - * the expiration date or its effect is unauthorized. - * - * 5. Software that will renew or extend the expiration date of - * authentication certificates produced by this software may be obtained - * from RSA Data Security, Inc., 10 Twin Dolphin Drive, Redwood City, CA - * 94065, (415)595-8782, or from DIGITAL" - * - */ - -#include -#ifdef HAVE_ARPA_TELNET_H -#include -#endif -#include -#include - -#include -#include -#ifdef SOCKS -#include -#endif - -#include "encrypt.h" -#include "auth.h" -#include "misc.h" -#include "cdc.h" - -extern auth_debug_mode; - -static unsigned char str_data[1024] = { IAC, SB, TELOPT_AUTHENTICATION, 0, - AUTHTYPE_RSA_ENCPWD, }; -static unsigned char str_name[1024] = { IAC, SB, TELOPT_AUTHENTICATION, - TELQUAL_NAME, }; - -#define RSA_ENCPWD_AUTH 0 /* Authentication data follows */ -#define RSA_ENCPWD_REJECT 1 /* Rejected (reason might follow) */ -#define RSA_ENCPWD_ACCEPT 2 /* Accepted */ -#define RSA_ENCPWD_CHALLENGEKEY 3 /* Challenge and public key */ - -#define NAME_SZ 40 -#define CHAL_SZ 20 -#define PWD_SZ 40 - -static KTEXT_ST auth; -static char name[NAME_SZ]; -static char user_passwd[PWD_SZ]; -static char key_file[2*NAME_SZ]; -static char lhostname[NAME_SZ]; -static char challenge[CHAL_SZ]; -static int challenge_len; - - static int -Data(ap, type, d, c) - Authenticator *ap; - int type; - void *d; - int c; -{ - unsigned char *p = str_data + 4; - unsigned char *cd = (unsigned char *)d; - - if (c == -1) - c = strlen((char *)cd); - - if (0) { - printf("%s:%d: [%d] (%d)", - str_data[3] == TELQUAL_IS ? ">>>IS" : ">>>REPLY", - str_data[3], - type, c); - printd(d, c); - printf("\r\n"); - } - *p++ = ap->type; - *p++ = ap->way; - if (type != NULL) *p++ = type; - while (c-- > 0) { - if ((*p++ = *cd++) == IAC) - *p++ = IAC; - } - *p++ = IAC; - *p++ = SE; - if (str_data[3] == TELQUAL_IS) - printsub('>', &str_data[2], p - (&str_data[2])); - return(telnet_net_write(str_data, p - str_data)); -} - - int -rsaencpwd_init(ap, server) - Authenticator *ap; - int server; -{ - char *cp; - FILE *fp; - - if (server) { - str_data[3] = TELQUAL_REPLY; - memset(key_file, 0, sizeof(key_file)); - gethostname(lhostname, sizeof(lhostname)); - if ((cp = strchr(lhostname, '.')) != 0) *cp = '\0'; - snprintf(key_file, sizeof(key_file), - SYSCONFDIR "/.%s_privkey", lhostname); - if ((fp=fopen(key_file, "r"))==NULL) return(0); - fclose(fp); - } else { - str_data[3] = TELQUAL_IS; - } - return(1); -} - - int -rsaencpwd_send(ap) - Authenticator *ap; -{ - - printf("[ Trying RSAENCPWD ... ]\r\n"); - if (!UserNameRequested) { - return(0); - } - if (!auth_sendname(UserNameRequested, strlen(UserNameRequested))) { - return(0); - } - if (!Data(ap, NULL, NULL, 0)) { - return(0); - } - - - return(1); -} - - void -rsaencpwd_is(ap, data, cnt) - Authenticator *ap; - unsigned char *data; - int cnt; -{ - Session_Key skey; - des_cblock datablock; - char r_passwd[PWD_SZ], r_user[NAME_SZ]; - char *cp, key[160]; - char chalkey[160], *ptr; - FILE *fp; - int r, i, j, chalkey_len, len; - time_t now; - - cnt--; - switch (*data++) { - case RSA_ENCPWD_AUTH: - memmove(auth.dat, data, auth.length = cnt); - - if ((fp=fopen(key_file, "r"))==NULL) { - Data(ap, RSA_ENCPWD_REJECT, "Auth failed", -1); - auth_finished(ap, AUTH_REJECT); - return; - } - /* - * get privkey - */ - fscanf(fp, "%x;", &len); - for (i=0;iway & AUTH_HOW_MASK) == AUTH_HOW_ONE_WAY) { - int i; - - - time(&now); - if ((now % 2) == 0) { - snprintf(challenge, sizeof(challenge), "%x", now); - challenge_len = strlen(challenge); - } else { - strlcpy(challenge, "randchal", sizeof(challenge)); - challenge_len = 8; - } - - if ((fp=fopen(key_file, "r"))==NULL) { - Data(ap, RSA_ENCPWD_REJECT, "Auth failed", -1); - auth_finished(ap, AUTH_REJECT); - return; - } - /* - * skip privkey - */ - fscanf(fp, "%x;", &len); - for (i=0;i 0) { - printf("[ RSA_ENCPWD refuses authentication because %.*s ]\r\n", - cnt, data); - } else - printf("[ RSA_ENCPWD refuses authentication ]\r\n"); - auth_send_retry(); - return; - case RSA_ENCPWD_ACCEPT: - printf("[ RSA_ENCPWD accepts you ]\r\n"); - auth_finished(ap, AUTH_USER); - return; - case RSA_ENCPWD_CHALLENGEKEY: - /* - * Verify that the response to the challenge is correct. - */ - - memmove(chalkey, data, cnt); - ptr = (char *) &chalkey[0]; - ptr += DecodeHeaderLength(chalkey); - if (*ptr != 0x04) { - return; - } - *ptr++; - challenge_len = DecodeValueLength(ptr); - ptr += NumEncodeLengthOctets(challenge_len); - memmove(challenge, ptr, challenge_len); - ptr += challenge_len; - if (*ptr != 0x04) { - return; - } - *ptr++; - pubkey_len = DecodeValueLength(ptr); - ptr += NumEncodeLengthOctets(pubkey_len); - memmove(pubkey, ptr, pubkey_len); - memset(user_passwd, 0, sizeof(user_passwd)); - des_read_pw_string(user_passwd, sizeof(user_passwd)-1, "Password: ", 0); - UserPassword = user_passwd; - Challenge = challenge; - r = init_rsa_encpwd(&token, user_passwd, challenge, challenge_len, pubkey); - if (r < 0) { - token.length = 1; - } - - if (!Data(ap, RSA_ENCPWD_AUTH, token.dat, token.length)) { - return; - } - - break; - - default: - return; - } -} - - int -rsaencpwd_status(ap, name, name_sz, level) - Authenticator *ap; - char *name; - size_t name_sz; - int level; -{ - - if (level < AUTH_USER) - return(level); - - if (UserNameRequested && rsaencpwd_passwdok(UserNameRequested, UserPassword)) { - strlcpy(name, UserNameRequested, name_sz); - return(AUTH_VALID); - } else { - return(AUTH_USER); - } -} - -#define BUMP(buf, len) while (*(buf)) {++(buf), --(len);} -#define ADDC(buf, len, c) if ((len) > 0) {*(buf)++ = (c); --(len);} - - void -rsaencpwd_printsub(unsigned char *data, size_t cnt, - unsigned char * buf, size_t buflen) -{ - size_t i; - - buf[buflen-1] = '\0'; /* make sure it's NULL terminated */ - buflen -= 1; - - switch(data[3]) { - case RSA_ENCPWD_REJECT: /* Rejected (reason might follow) */ - strlcpy((char *)buf, " REJECT ", buflen); - goto common; - - case RSA_ENCPWD_ACCEPT: /* Accepted (name might follow) */ - strlcpy((char *)buf, " ACCEPT ", buflen); - common: - BUMP(buf, buflen); - if (cnt <= 4) - break; - ADDC(buf, buflen, '"'); - for (i = 4; i < cnt; i++) - ADDC(buf, buflen, data[i]); - ADDC(buf, buflen, '"'); - ADDC(buf, buflen, '\0'); - break; - - case RSA_ENCPWD_AUTH: /* Authentication data follows */ - strlcpy((char *)buf, " AUTH", buflen); - goto common2; - - case RSA_ENCPWD_CHALLENGEKEY: - strlcpy((char *)buf, " CHALLENGEKEY", buflen); - goto common2; - - default: - snprintf(buf, buflen, " %d (unknown)", data[3]); - common2: - BUMP(buf, buflen); - for (i = 4; i < cnt; i++) { - snprintf(buf, buflen, " %d", data[i]); - BUMP(buf, buflen); - } - break; - } -} - -int rsaencpwd_passwdok(name, passwd) -char *name, *passwd; -{ - char *crypt(); - char *salt, *p; - struct passwd *pwd; - int passwdok_status = 0; - - if (pwd = k_getpwnam(name)) - salt = pwd->pw_passwd; - else salt = "xx"; - - p = crypt(passwd, salt); - - if (pwd && !strcmp(p, pwd->pw_passwd)) { - passwdok_status = 1; - } else passwdok_status = 0; - return(passwdok_status); -} - -#endif - -#ifdef notdef - -prkey(msg, key) - char *msg; - unsigned char *key; -{ - int i; - printf("%s:", msg); - for (i = 0; i < 8; i++) - printf(" %3d", key[i]); - printf("\r\n"); -} -#endif diff --git a/crypto/heimdal/appl/telnet/libtelnet/spx.c b/crypto/heimdal/appl/telnet/libtelnet/spx.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/libtelnet/spx.c +++ /dev/null @@ -1,589 +0,0 @@ -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include - -RCSID("$Id$"); - -#ifdef SPX -/* - * COPYRIGHT (C) 1990 DIGITAL EQUIPMENT CORPORATION - * ALL RIGHTS RESERVED - * - * "Digital Equipment Corporation authorizes the reproduction, - * distribution and modification of this software subject to the following - * restrictions: - * - * 1. Any partial or whole copy of this software, or any modification - * thereof, must include this copyright notice in its entirety. - * - * 2. This software is supplied "as is" with no warranty of any kind, - * expressed or implied, for any purpose, including any warranty of fitness - * or merchantibility. DIGITAL assumes no responsibility for the use or - * reliability of this software, nor promises to provide any form of - * support for it on any basis. - * - * 3. Distribution of this software is authorized only if no profit or - * remuneration of any kind is received in exchange for such distribution. - * - * 4. This software produces public key authentication certificates - * bearing an expiration date established by DIGITAL and RSA Data - * Security, Inc. It may cease to generate certificates after the expiration - * date. Any modification of this software that changes or defeats - * the expiration date or its effect is unauthorized. - * - * 5. Software that will renew or extend the expiration date of - * authentication certificates produced by this software may be obtained - * from RSA Data Security, Inc., 10 Twin Dolphin Drive, Redwood City, CA - * 94065, (415)595-8782, or from DIGITAL" - * - */ - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_ARPA_TELNET_H -#include -#endif -#include -#include "gssapi_defs.h" -#include -#include - -#include -#ifdef SOCKS -#include -#endif - -#include "encrypt.h" -#include "auth.h" -#include "misc.h" - -extern auth_debug_mode; - -static unsigned char str_data[1024] = { IAC, SB, TELOPT_AUTHENTICATION, 0, - AUTHTYPE_SPX, }; -static unsigned char str_name[1024] = { IAC, SB, TELOPT_AUTHENTICATION, - TELQUAL_NAME, }; - -#define SPX_AUTH 0 /* Authentication data follows */ -#define SPX_REJECT 1 /* Rejected (reason might follow) */ -#define SPX_ACCEPT 2 /* Accepted */ - -static des_key_schedule sched; -static des_cblock challenge = { 0 }; - - -/*******************************************************************/ - -gss_OID_set actual_mechs; -gss_OID actual_mech_type, output_name_type; -int major_status, status, msg_ctx = 0, new_status; -int req_flags = 0, ret_flags, lifetime_rec; -gss_cred_id_t gss_cred_handle; -gss_ctx_id_t actual_ctxhandle, context_handle; -gss_buffer_desc output_token, input_token, input_name_buffer; -gss_buffer_desc status_string; -gss_name_t desired_targname, src_name; -gss_channel_bindings input_chan_bindings; -char lhostname[GSS_C_MAX_PRINTABLE_NAME]; -char targ_printable[GSS_C_MAX_PRINTABLE_NAME]; -int to_addr=0, from_addr=0; -char *address; -gss_buffer_desc fullname_buffer; -gss_OID fullname_type; -gss_cred_id_t gss_delegated_cred_handle; - -/*******************************************************************/ - - - - static int -Data(ap, type, d, c) - Authenticator *ap; - int type; - void *d; - int c; -{ - unsigned char *p = str_data + 4; - unsigned char *cd = (unsigned char *)d; - - if (c == -1) - c = strlen((char *)cd); - - if (0) { - printf("%s:%d: [%d] (%d)", - str_data[3] == TELQUAL_IS ? ">>>IS" : ">>>REPLY", - str_data[3], - type, c); - printd(d, c); - printf("\r\n"); - } - *p++ = ap->type; - *p++ = ap->way; - *p++ = type; - while (c-- > 0) { - if ((*p++ = *cd++) == IAC) - *p++ = IAC; - } - *p++ = IAC; - *p++ = SE; - if (str_data[3] == TELQUAL_IS) - printsub('>', &str_data[2], p - (&str_data[2])); - return(telnet_net_write(str_data, p - str_data)); -} - - int -spx_init(ap, server) - Authenticator *ap; - int server; -{ - gss_cred_id_t tmp_cred_handle; - - if (server) { - str_data[3] = TELQUAL_REPLY; - gethostname(lhostname, sizeof(lhostname)); - snprintf (targ_printable, sizeof(targ_printable), - "SERVICE:rcmd@%s", lhostname); - input_name_buffer.length = strlen(targ_printable); - input_name_buffer.value = targ_printable; - major_status = gss_import_name(&status, - &input_name_buffer, - GSS_C_NULL_OID, - &desired_targname); - major_status = gss_acquire_cred(&status, - desired_targname, - 0, - GSS_C_NULL_OID_SET, - GSS_C_ACCEPT, - &tmp_cred_handle, - &actual_mechs, - &lifetime_rec); - if (major_status != GSS_S_COMPLETE) return(0); - } else { - str_data[3] = TELQUAL_IS; - } - return(1); -} - - int -spx_send(ap) - Authenticator *ap; -{ - des_cblock enckey; - int r; - - gss_OID actual_mech_type, output_name_type; - int msg_ctx = 0, new_status, status; - int req_flags = 0, ret_flags, lifetime_rec, major_status; - gss_buffer_desc output_token, input_token, input_name_buffer; - gss_buffer_desc output_name_buffer, status_string; - gss_name_t desired_targname; - gss_channel_bindings input_chan_bindings; - char targ_printable[GSS_C_MAX_PRINTABLE_NAME]; - int from_addr=0, to_addr=0, myhostlen, j; - int deleg_flag=1, mutual_flag=0, replay_flag=0, seq_flag=0; - char *address; - - printf("[ Trying SPX ... ]\r\n"); - snprintf (targ_printable, sizeof(targ_printable), - "SERVICE:rcmd@%s", RemoteHostName); - - input_name_buffer.length = strlen(targ_printable); - input_name_buffer.value = targ_printable; - - if (!UserNameRequested) { - return(0); - } - - major_status = gss_import_name(&status, - &input_name_buffer, - GSS_C_NULL_OID, - &desired_targname); - - - major_status = gss_display_name(&status, - desired_targname, - &output_name_buffer, - &output_name_type); - - printf("target is '%.*s'\n", (int)output_name_buffer.length, - (char*)output_name_buffer.value); - fflush(stdout); - - major_status = gss_release_buffer(&status, &output_name_buffer); - - input_chan_bindings = (gss_channel_bindings) - malloc(sizeof(gss_channel_bindings_desc)); - - input_chan_bindings->initiator_addrtype = GSS_C_AF_INET; - input_chan_bindings->initiator_address.length = 4; - address = (char *) malloc(4); - input_chan_bindings->initiator_address.value = (char *) address; - address[0] = ((from_addr & 0xff000000) >> 24); - address[1] = ((from_addr & 0xff0000) >> 16); - address[2] = ((from_addr & 0xff00) >> 8); - address[3] = (from_addr & 0xff); - input_chan_bindings->acceptor_addrtype = GSS_C_AF_INET; - input_chan_bindings->acceptor_address.length = 4; - address = (char *) malloc(4); - input_chan_bindings->acceptor_address.value = (char *) address; - address[0] = ((to_addr & 0xff000000) >> 24); - address[1] = ((to_addr & 0xff0000) >> 16); - address[2] = ((to_addr & 0xff00) >> 8); - address[3] = (to_addr & 0xff); - input_chan_bindings->application_data.length = 0; - - req_flags = 0; - if (deleg_flag) req_flags = req_flags | 1; - if (mutual_flag) req_flags = req_flags | 2; - if (replay_flag) req_flags = req_flags | 4; - if (seq_flag) req_flags = req_flags | 8; - - major_status = gss_init_sec_context(&status, /* minor status */ - GSS_C_NO_CREDENTIAL, /* cred handle */ - &actual_ctxhandle, /* ctx handle */ - desired_targname, /* target name */ - GSS_C_NULL_OID, /* mech type */ - req_flags, /* req flags */ - 0, /* time req */ - input_chan_bindings, /* chan binding */ - GSS_C_NO_BUFFER, /* input token */ - &actual_mech_type, /* actual mech */ - &output_token, /* output token */ - &ret_flags, /* ret flags */ - &lifetime_rec); /* time rec */ - - if ((major_status != GSS_S_COMPLETE) && - (major_status != GSS_S_CONTINUE_NEEDED)) { - gss_display_status(&new_status, - status, - GSS_C_MECH_CODE, - GSS_C_NULL_OID, - &msg_ctx, - &status_string); - printf("%.*s\n", (int)status_string.length, - (char*)status_string.value); - return(0); - } - - if (!auth_sendname(UserNameRequested, strlen(UserNameRequested))) { - return(0); - } - - if (!Data(ap, SPX_AUTH, output_token.value, output_token.length)) { - return(0); - } - - return(1); -} - - void -spx_is(ap, data, cnt) - Authenticator *ap; - unsigned char *data; - int cnt; -{ - Session_Key skey; - des_cblock datablock; - int r; - - if (cnt-- < 1) - return; - switch (*data++) { - case SPX_AUTH: - input_token.length = cnt; - input_token.value = (char *) data; - - gethostname(lhostname, sizeof(lhostname)); - - snprintf(targ_printable, sizeof(targ_printable), - "SERVICE:rcmd@%s", lhostname); - - input_name_buffer.length = strlen(targ_printable); - input_name_buffer.value = targ_printable; - - major_status = gss_import_name(&status, - &input_name_buffer, - GSS_C_NULL_OID, - &desired_targname); - - major_status = gss_acquire_cred(&status, - desired_targname, - 0, - GSS_C_NULL_OID_SET, - GSS_C_ACCEPT, - &gss_cred_handle, - &actual_mechs, - &lifetime_rec); - - major_status = gss_release_name(&status, desired_targname); - - input_chan_bindings = (gss_channel_bindings) - malloc(sizeof(gss_channel_bindings_desc)); - - input_chan_bindings->initiator_addrtype = GSS_C_AF_INET; - input_chan_bindings->initiator_address.length = 4; - address = (char *) malloc(4); - input_chan_bindings->initiator_address.value = (char *) address; - address[0] = ((from_addr & 0xff000000) >> 24); - address[1] = ((from_addr & 0xff0000) >> 16); - address[2] = ((from_addr & 0xff00) >> 8); - address[3] = (from_addr & 0xff); - input_chan_bindings->acceptor_addrtype = GSS_C_AF_INET; - input_chan_bindings->acceptor_address.length = 4; - address = (char *) malloc(4); - input_chan_bindings->acceptor_address.value = (char *) address; - address[0] = ((to_addr & 0xff000000) >> 24); - address[1] = ((to_addr & 0xff0000) >> 16); - address[2] = ((to_addr & 0xff00) >> 8); - address[3] = (to_addr & 0xff); - input_chan_bindings->application_data.length = 0; - - major_status = gss_accept_sec_context(&status, - &context_handle, - gss_cred_handle, - &input_token, - input_chan_bindings, - &src_name, - &actual_mech_type, - &output_token, - &ret_flags, - &lifetime_rec, - &gss_delegated_cred_handle); - - - if (major_status != GSS_S_COMPLETE) { - - major_status = gss_display_name(&status, - src_name, - &fullname_buffer, - &fullname_type); - Data(ap, SPX_REJECT, "auth failed", -1); - auth_finished(ap, AUTH_REJECT); - return; - } - - major_status = gss_display_name(&status, - src_name, - &fullname_buffer, - &fullname_type); - - - Data(ap, SPX_ACCEPT, output_token.value, output_token.length); - auth_finished(ap, AUTH_USER); - break; - - default: - Data(ap, SPX_REJECT, 0, 0); - break; - } -} - - - void -spx_reply(ap, data, cnt) - Authenticator *ap; - unsigned char *data; - int cnt; -{ - Session_Key skey; - - if (cnt-- < 1) - return; - switch (*data++) { - case SPX_REJECT: - if (cnt > 0) { - printf("[ SPX refuses authentication because %.*s ]\r\n", - cnt, data); - } else - printf("[ SPX refuses authentication ]\r\n"); - auth_send_retry(); - return; - case SPX_ACCEPT: - printf("[ SPX accepts you ]\r\n"); - if ((ap->way & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) { - /* - * Send over the encrypted challenge. - */ - input_token.value = (char *) data; - input_token.length = cnt; - - major_status = gss_init_sec_context(&status, /* minor stat */ - GSS_C_NO_CREDENTIAL, /* cred handle */ - &actual_ctxhandle, /* ctx handle */ - desired_targname, /* target name */ - GSS_C_NULL_OID, /* mech type */ - req_flags, /* req flags */ - 0, /* time req */ - input_chan_bindings, /* chan binding */ - &input_token, /* input token */ - &actual_mech_type, /* actual mech */ - &output_token, /* output token */ - &ret_flags, /* ret flags */ - &lifetime_rec); /* time rec */ - - if (major_status != GSS_S_COMPLETE) { - gss_display_status(&new_status, - status, - GSS_C_MECH_CODE, - GSS_C_NULL_OID, - &msg_ctx, - &status_string); - printf("[ SPX mutual response fails ... '%.*s' ]\r\n", - (int)status_string.length, - (char*)status_string.value); - auth_send_retry(); - return; - } - } - auth_finished(ap, AUTH_USER); - return; - - default: - return; - } -} - - int -spx_status(ap, name, name_sz, level) - Authenticator *ap; - char *name; - size_t name_sz; - int level; -{ - - gss_buffer_desc fullname_buffer, acl_file_buffer; - gss_OID fullname_type; - char acl_file[160], fullname[160]; - int major_status, status = 0; - struct passwd *pwd; - - /* - * hard code fullname to - * "SPX:/C=US/O=Digital/OU=LKG/OU=Sphinx/OU=Users/CN=Kannan Alagappan" - * and acl_file to "~kannan/.sphinx" - */ - - pwd = k_getpwnam(UserNameRequested); - if (pwd == NULL) { - return(AUTH_USER); /* not authenticated */ - } - - snprintf (acl_file, sizeof(acl_file), - "%s/.sphinx", pwd->pw_dir); - - acl_file_buffer.value = acl_file; - acl_file_buffer.length = strlen(acl_file); - - major_status = gss_display_name(&status, - src_name, - &fullname_buffer, - &fullname_type); - - if (level < AUTH_USER) - return(level); - - major_status = gss__check_acl(&status, &fullname_buffer, - &acl_file_buffer); - - if (major_status == GSS_S_COMPLETE) { - strlcpy(name, UserNameRequested, name_sz); - return(AUTH_VALID); - } else { - return(AUTH_USER); - } - -} - -#define BUMP(buf, len) while (*(buf)) {++(buf), --(len);} -#define ADDC(buf, len, c) if ((len) > 0) {*(buf)++ = (c); --(len);} - - void -spx_printsub(unsigned char *data, size_t cnt, - unsigned char *buf, size_t buflen) -{ - size_t i; - - buf[buflen-1] = '\0'; /* make sure it's NULL terminated */ - buflen -= 1; - - switch(data[3]) { - case SPX_REJECT: /* Rejected (reason might follow) */ - strlcpy((char *)buf, " REJECT ", buflen); - goto common; - - case SPX_ACCEPT: /* Accepted (name might follow) */ - strlcpy((char *)buf, " ACCEPT ", buflen); - common: - BUMP(buf, buflen); - if (cnt <= 4) - break; - ADDC(buf, buflen, '"'); - for (i = 4; i < cnt; i++) - ADDC(buf, buflen, data[i]); - ADDC(buf, buflen, '"'); - ADDC(buf, buflen, '\0'); - break; - - case SPX_AUTH: /* Authentication data follows */ - strlcpy((char *)buf, " AUTH", buflen); - goto common2; - - default: - snprintf(buf, buflen, " %d (unknown)", data[3]); - common2: - BUMP(buf, buflen); - for (i = 4; i < cnt; i++) { - snprintf(buf, buflen, " %d", data[i]); - BUMP(buf, buflen); - } - break; - } -} - -#endif - -#ifdef notdef - -prkey(msg, key) - char *msg; - unsigned char *key; -{ - int i; - printf("%s:", msg); - for (i = 0; i < 8; i++) - printf(" %3d", key[i]); - printf("\r\n"); -} -#endif diff --git a/crypto/heimdal/appl/telnet/telnet.state b/crypto/heimdal/appl/telnet/telnet.state deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet.state +++ /dev/null @@ -1,80 +0,0 @@ - - Three pieces of state need to be kept for each side of each option. - (You need the localside, sending WILL/WONT & receiving DO/DONT, and - the remoteside, sending DO/DONT and receiving WILL/WONT) - - MY_STATE: What state am I in? - WANT_STATE: What state do I want? - WANT_RESP: How many requests have I initiated? - - Default values: - MY_STATE = WANT_STATE = DONT - WANT_RESP = 0 - - The local setup will change based on the state of the Telnet - variables. When we are the originator, we can either make the - local setup changes at option request time (in which case if - the option is denied we need to change things back) or when - the option is acknowledged. - - To initiate a switch to NEW_STATE: - - if ((WANT_RESP == 0 && NEW_STATE == MY_STATE) || - WANT_STATE == NEW_STATE) { - do nothing; - } else { - /* - * This is where the logic goes to change the local setup - * if we are doing so at request initiation - */ - WANT_STATE = NEW_STATE; - send NEW_STATE; - WANT_RESP += 1; - } - - When receiving NEW_STATE: - - if (WANT_RESP) { - --WANT_RESP; - if (WANT_RESP && (NEW_STATE == MY_STATE)) - --WANT_RESP; - } - if (WANT_RESP == 0) { - if (NEW_STATE != WANT_STATE) { - /* - * This is where the logic goes to decide if it is ok - * to switch to NEW_STATE, and if so, do any necessary - * local setup changes. - */ - if (ok_to_switch_to NEW_STATE) - WANT_STATE = NEW_STATE; - else - WANT_RESP++; -* if (MY_STATE != WANT_STATE) - reply with WANT_STATE; - } else { - /* - * This is where the logic goes to change the local setup - * if we are doing so at request acknowledgment - */ - } - } - MY_STATE = NEW_STATE; - -* This if() line is not needed, it should be ok to always do the - "reply with WANT_STATE". With the if() line, asking to turn on - an option that the other side doesn't understand is: - Send DO option - Recv WONT option - Without the if() line, it is: - Send DO option - Recv WONT option - Send DONT option - If the other side does not expect to receive the latter case, - but generates the latter case, then there is a potential for - option negotiation loops. An implementation that does not expect - to get the second case should not generate it, an implementation - that does expect to get it may or may not generate it, and things - will still work. Being conservative in what we send, we have the - if() statement in, but we expect the other side to generate the - last response. diff --git a/crypto/heimdal/appl/telnet/telnet/Makefile.am b/crypto/heimdal/appl/telnet/telnet/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += -I$(srcdir)/.. $(INCLUDE_hcrypto) - -bin_PROGRAMS = telnet - -CHECK_LOCAL = - -telnet_SOURCES = authenc.c commands.c main.c network.c ring.c \ - sys_bsd.c telnet.c terminal.c \ - utilities.c defines.h externs.h ring.h telnet_locl.h types.h - -man_MANS = telnet.1 - -LDADD = ../libtelnet/libtelnet.a \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_tgetent) \ - $(LIB_kdfs) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) diff --git a/crypto/heimdal/appl/telnet/telnet/Makefile.in b/crypto/heimdal/appl/telnet/telnet/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/Makefile.in +++ /dev/null @@ -1,970 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common -bin_PROGRAMS = telnet$(EXEEXT) -subdir = appl/telnet/telnet -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" -PROGRAMS = $(bin_PROGRAMS) -am_telnet_OBJECTS = authenc.$(OBJEXT) commands.$(OBJEXT) \ - main.$(OBJEXT) network.$(OBJEXT) ring.$(OBJEXT) \ - sys_bsd.$(OBJEXT) telnet.$(OBJEXT) terminal.$(OBJEXT) \ - utilities.$(OBJEXT) -telnet_OBJECTS = $(am_telnet_OBJECTS) -telnet_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -telnet_DEPENDENCIES = ../libtelnet/libtelnet.a $(LIB_krb5) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(LIB_kdfs) \ - $(am__DEPENDENCIES_1) -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 = $(telnet_SOURCES) -DIST_SOURCES = $(telnet_SOURCES) -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' -man1dir = $(mandir)/man1 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/.. $(INCLUDE_hcrypto) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -CHECK_LOCAL = -telnet_SOURCES = authenc.c commands.c main.c network.c ring.c \ - sys_bsd.c telnet.c terminal.c \ - utilities.c defines.h externs.h ring.h telnet_locl.h types.h - -man_MANS = telnet.1 -LDADD = ../libtelnet/libtelnet.a \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_tgetent) \ - $(LIB_kdfs) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/telnet/telnet/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/telnet/telnet/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) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - 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 -telnet$(EXEEXT): $(telnet_OBJECTS) $(telnet_DEPENDENCIES) - @rm -f telnet$(EXEEXT) - $(LINK) $(telnet_OBJECTS) $(telnet_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authenc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/network.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ring.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sys_bsd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/telnet.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/terminal.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utilities.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 -install-man1: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ - } | 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(bindir)" "$(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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-binPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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 -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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man1 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libtool ctags \ - dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - 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-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-binPROGRAMS uninstall-hook \ - uninstall-man uninstall-man1 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/appl/telnet/telnet/authenc.c b/crypto/heimdal/appl/telnet/telnet/authenc.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/authenc.c +++ /dev/null @@ -1,99 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnet_locl.h" - -RCSID("$Id$"); - -#if defined(AUTHENTICATION) || defined(ENCRYPTION) -int -telnet_net_write(unsigned char *str, int len) -{ - if (NETROOM() > len) { - ring_supply_data(&netoring, str, len); - if (str[0] == IAC && str[1] == SE) - printsub('>', &str[2], len-2); - return(len); - } - return(0); -} - -void -net_encrypt(void) -{ -#if defined(ENCRYPTION) - if (encrypt_output) - ring_encrypt(&netoring, encrypt_output); - else - ring_clearto(&netoring); -#endif -} - -int -telnet_spin(void) -{ - int ret = 0; - - scheduler_lockout_tty = 1; - if (Scheduler(0) == -1) - ret = 1; - scheduler_lockout_tty = 0; - - return ret; - -} - -char * -telnet_getenv(const char *val) -{ - return((char *)env_getvalue((unsigned char *)val)); -} - -char * -telnet_gets(char *prompt, char *result, int length, int echo) -{ - int om = globalmode; - char *res; - - TerminalNewMode(-1); - if (echo) { - printf("%s", prompt); - res = fgets(result, length, stdin); - } else if ((res = getpass(prompt))) { - strlcpy(result, res, length); - res = result; - } - TerminalNewMode(om); - return(res); -} -#endif diff --git a/crypto/heimdal/appl/telnet/telnet/commands.c b/crypto/heimdal/appl/telnet/telnet/commands.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/commands.c +++ /dev/null @@ -1,2675 +0,0 @@ -/* - * Copyright (c) 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnet_locl.h" - -RCSID("$Id$"); - -#if defined(IPPROTO_IP) && defined(IP_TOS) -int tos = -1; -#endif /* defined(IPPROTO_IP) && defined(IP_TOS) */ - -char *hostname; -static char _hostname[MaxHostNameLen]; - -typedef int (*intrtn_t)(int, char**); -static int call(intrtn_t, ...); - -typedef struct { - char *name; /* command name */ - char *help; /* help string (NULL for no help) */ - int (*handler)(); /* routine which executes command */ - int needconnect; /* Do we need to be connected to execute? */ -} Command; - -static char line[256]; -static char saveline[256]; -static int margc; -static char *margv[20]; - -static void -makeargv() -{ - char *cp, *cp2, c; - char **argp = margv; - - margc = 0; - cp = line; - if (*cp == '!') { /* Special case shell escape */ - /* save for shell command */ - strlcpy(saveline, line, sizeof(saveline)); - *argp++ = "!"; /* No room in string to get this */ - margc++; - cp++; - } - while ((c = *cp)) { - int inquote = 0; - while (isspace((unsigned char)c)) - c = *++cp; - if (c == '\0') - break; - *argp++ = cp; - margc += 1; - for (cp2 = cp; c != '\0'; c = *++cp) { - if (inquote) { - if (c == inquote) { - inquote = 0; - continue; - } - } else { - if (c == '\\') { - if ((c = *++cp) == '\0') - break; - } else if (c == '"') { - inquote = '"'; - continue; - } else if (c == '\'') { - inquote = '\''; - continue; - } else if (isspace((unsigned char)c)) - break; - } - *cp2++ = c; - } - *cp2 = '\0'; - if (c == '\0') - break; - cp++; - } - *argp++ = 0; -} - -/* - * Make a character string into a number. - * - * Todo: 1. Could take random integers (12, 0x12, 012, 0b1). - */ - -static char -special(char *s) -{ - char c; - char b; - - switch (*s) { - case '^': - b = *++s; - if (b == '?') { - c = b | 0x40; /* DEL */ - } else { - c = b & 0x1f; - } - break; - default: - c = *s; - break; - } - return c; -} - -/* - * Construct a control character sequence - * for a special character. - */ -static char * -control(cc_t c) -{ - static char buf[5]; - /* - * The only way I could get the Sun 3.5 compiler - * to shut up about - * if ((unsigned int)c >= 0x80) - * was to assign "c" to an unsigned int variable... - * Arggg.... - */ - unsigned int uic = (unsigned int)c; - - if (uic == 0x7f) - return ("^?"); - if (c == (cc_t)_POSIX_VDISABLE) { - return "off"; - } - if (uic >= 0x80) { - buf[0] = '\\'; - buf[1] = ((c>>6)&07) + '0'; - buf[2] = ((c>>3)&07) + '0'; - buf[3] = (c&07) + '0'; - buf[4] = 0; - } else if (uic >= 0x20) { - buf[0] = c; - buf[1] = 0; - } else { - buf[0] = '^'; - buf[1] = '@'+c; - buf[2] = 0; - } - return (buf); -} - - - -/* - * The following are data structures and routines for - * the "send" command. - * - */ - -struct sendlist { - char *name; /* How user refers to it (case independent) */ - char *help; /* Help information (0 ==> no help) */ - int needconnect; /* Need to be connected */ - int narg; /* Number of arguments */ - int (*handler)(); /* Routine to perform (for special ops) */ - int nbyte; /* Number of bytes to send this command */ - int what; /* Character to be sent (<0 ==> special) */ -}; - - -static int - send_esc (void), - send_help (void), - send_docmd (char *), - send_dontcmd (char *), - send_willcmd (char *), - send_wontcmd (char *); - -static struct sendlist Sendlist[] = { - { "ao", "Send Telnet Abort output", 1, 0, 0, 2, AO }, - { "ayt", "Send Telnet 'Are You There'", 1, 0, 0, 2, AYT }, - { "brk", "Send Telnet Break", 1, 0, 0, 2, BREAK }, - { "break", 0, 1, 0, 0, 2, BREAK }, - { "ec", "Send Telnet Erase Character", 1, 0, 0, 2, EC }, - { "el", "Send Telnet Erase Line", 1, 0, 0, 2, EL }, - { "escape", "Send current escape character", 1, 0, send_esc, 1, 0 }, - { "ga", "Send Telnet 'Go Ahead' sequence", 1, 0, 0, 2, GA }, - { "ip", "Send Telnet Interrupt Process", 1, 0, 0, 2, IP }, - { "intp", 0, 1, 0, 0, 2, IP }, - { "interrupt", 0, 1, 0, 0, 2, IP }, - { "intr", 0, 1, 0, 0, 2, IP }, - { "nop", "Send Telnet 'No operation'", 1, 0, 0, 2, NOP }, - { "eor", "Send Telnet 'End of Record'", 1, 0, 0, 2, EOR }, - { "abort", "Send Telnet 'Abort Process'", 1, 0, 0, 2, ABORT }, - { "susp", "Send Telnet 'Suspend Process'", 1, 0, 0, 2, SUSP }, - { "eof", "Send Telnet End of File Character", 1, 0, 0, 2, xEOF }, - { "synch", "Perform Telnet 'Synch operation'", 1, 0, dosynch, 2, 0 }, - { "getstatus", "Send request for STATUS", 1, 0, get_status, 6, 0 }, - { "?", "Display send options", 0, 0, send_help, 0, 0 }, - { "help", 0, 0, 0, send_help, 0, 0 }, - { "do", 0, 0, 1, send_docmd, 3, 0 }, - { "dont", 0, 0, 1, send_dontcmd, 3, 0 }, - { "will", 0, 0, 1, send_willcmd, 3, 0 }, - { "wont", 0, 0, 1, send_wontcmd, 3, 0 }, - { 0 } -}; - -#define GETSEND(name) ((struct sendlist *) genget(name, (char **) Sendlist, \ - sizeof(struct sendlist))) - -static int -sendcmd(int argc, char **argv) -{ - int count; /* how many bytes we are going to need to send */ - int i; - struct sendlist *s; /* pointer to current command */ - int success = 0; - int needconnect = 0; - - if (argc < 2) { - printf("need at least one argument for 'send' command\r\n"); - printf("'send ?' for help\r\n"); - return 0; - } - /* - * First, validate all the send arguments. - * In addition, we see how much space we are going to need, and - * whether or not we will be doing a "SYNCH" operation (which - * flushes the network queue). - */ - count = 0; - for (i = 1; i < argc; i++) { - s = GETSEND(argv[i]); - if (s == 0) { - printf("Unknown send argument '%s'\r\n'send ?' for help.\r\n", - argv[i]); - return 0; - } else if (Ambiguous(s)) { - printf("Ambiguous send argument '%s'\r\n'send ?' for help.\r\n", - argv[i]); - return 0; - } - if (i + s->narg >= argc) { - fprintf(stderr, - "Need %d argument%s to 'send %s' command. 'send %s ?' for help.\r\n", - s->narg, s->narg == 1 ? "" : "s", s->name, s->name); - return 0; - } - count += s->nbyte; - if (s->handler == send_help) { - send_help(); - return 0; - } - - i += s->narg; - needconnect += s->needconnect; - } - if (!connected && needconnect) { - printf("?Need to be connected first.\r\n"); - printf("'send ?' for help\r\n"); - return 0; - } - /* Now, do we have enough room? */ - if (NETROOM() < count) { - printf("There is not enough room in the buffer TO the network\r\n"); - printf("to process your request. Nothing will be done.\r\n"); - printf("('send synch' will throw away most data in the network\r\n"); - printf("buffer, if this might help.)\r\n"); - return 0; - } - /* OK, they are all OK, now go through again and actually send */ - count = 0; - for (i = 1; i < argc; i++) { - if ((s = GETSEND(argv[i])) == 0) { - fprintf(stderr, "Telnet 'send' error - argument disappeared!\r\n"); - quit(); - /*NOTREACHED*/ - } - if (s->handler) { - count++; - success += (*s->handler)((s->narg > 0) ? argv[i+1] : 0, - (s->narg > 1) ? argv[i+2] : 0); - i += s->narg; - } else { - NET2ADD(IAC, s->what); - printoption("SENT", IAC, s->what); - } - } - return (count == success); -} - -static int -send_tncmd(void (*func)(), char *cmd, char *name); - -static int -send_esc() -{ - NETADD(escape); - return 1; -} - -static int -send_docmd(char *name) -{ - return(send_tncmd(send_do, "do", name)); -} - -static int -send_dontcmd(char *name) -{ - return(send_tncmd(send_dont, "dont", name)); -} - -static int -send_willcmd(char *name) -{ - return(send_tncmd(send_will, "will", name)); -} - -static int -send_wontcmd(char *name) -{ - return(send_tncmd(send_wont, "wont", name)); -} - -extern char *telopts[]; /* XXX */ - -static int -send_tncmd(void (*func)(), char *cmd, char *name) -{ - char **cpp; - int val = 0; - - if (isprefix(name, "help") || isprefix(name, "?")) { - int col, len; - - printf("Usage: send %s \r\n", cmd); - printf("\"value\" must be from 0 to 255\r\n"); - printf("Valid options are:\r\n\t"); - - col = 8; - for (cpp = telopts; *cpp; cpp++) { - len = strlen(*cpp) + 3; - if (col + len > 65) { - printf("\r\n\t"); - col = 8; - } - printf(" \"%s\"", *cpp); - col += len; - } - printf("\r\n"); - return 0; - } - cpp = genget(name, telopts, sizeof(char *)); - if (Ambiguous(cpp)) { - fprintf(stderr,"'%s': ambiguous argument ('send %s ?' for help).\r\n", - name, cmd); - return 0; - } - if (cpp) { - val = cpp - telopts; - } else { - char *cp = name; - - while (*cp >= '0' && *cp <= '9') { - val *= 10; - val += *cp - '0'; - cp++; - } - if (*cp != 0) { - fprintf(stderr, "'%s': unknown argument ('send %s ?' for help).\r\n", - name, cmd); - return 0; - } else if (val < 0 || val > 255) { - fprintf(stderr, "'%s': bad value ('send %s ?' for help).\r\n", - name, cmd); - return 0; - } - } - if (!connected) { - printf("?Need to be connected first.\r\n"); - return 0; - } - (*func)(val, 1); - return 1; -} - -static int -send_help() -{ - struct sendlist *s; /* pointer to current command */ - for (s = Sendlist; s->name; s++) { - if (s->help) - printf("%-15s %s\r\n", s->name, s->help); - } - return(0); -} - -/* - * The following are the routines and data structures referred - * to by the arguments to the "toggle" command. - */ - -static int -lclchars() -{ - donelclchars = 1; - return 1; -} - -static int -togdebug() -{ -#ifndef NOT43 - if (net > 0 && - (SetSockOpt(net, SOL_SOCKET, SO_DEBUG, debug)) < 0) { - perror("setsockopt (SO_DEBUG)"); - } -#else /* NOT43 */ - if (debug) { - if (net > 0 && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 0, 0) < 0) - perror("setsockopt (SO_DEBUG)"); - } else - printf("Cannot turn off socket debugging\r\n"); -#endif /* NOT43 */ - return 1; -} - -static int -togcrlf() -{ - if (crlf) { - printf("Will send carriage returns as telnet .\r\n"); - } else { - printf("Will send carriage returns as telnet .\r\n"); - } - return 1; -} - -int binmode; - -static int -togbinary(int val) -{ - donebinarytoggle = 1; - - if (val >= 0) { - binmode = val; - } else { - if (my_want_state_is_will(TELOPT_BINARY) && - my_want_state_is_do(TELOPT_BINARY)) { - binmode = 1; - } else if (my_want_state_is_wont(TELOPT_BINARY) && - my_want_state_is_dont(TELOPT_BINARY)) { - binmode = 0; - } - val = binmode ? 0 : 1; - } - - if (val == 1) { - if (my_want_state_is_will(TELOPT_BINARY) && - my_want_state_is_do(TELOPT_BINARY)) { - printf("Already operating in binary mode with remote host.\r\n"); - } else { - printf("Negotiating binary mode with remote host.\r\n"); - tel_enter_binary(3); - } - } else { - if (my_want_state_is_wont(TELOPT_BINARY) && - my_want_state_is_dont(TELOPT_BINARY)) { - printf("Already in network ascii mode with remote host.\r\n"); - } else { - printf("Negotiating network ascii mode with remote host.\r\n"); - tel_leave_binary(3); - } - } - return 1; -} - -static int -togrbinary(int val) -{ - donebinarytoggle = 1; - - if (val == -1) - val = my_want_state_is_do(TELOPT_BINARY) ? 0 : 1; - - if (val == 1) { - if (my_want_state_is_do(TELOPT_BINARY)) { - printf("Already receiving in binary mode.\r\n"); - } else { - printf("Negotiating binary mode on input.\r\n"); - tel_enter_binary(1); - } - } else { - if (my_want_state_is_dont(TELOPT_BINARY)) { - printf("Already receiving in network ascii mode.\r\n"); - } else { - printf("Negotiating network ascii mode on input.\r\n"); - tel_leave_binary(1); - } - } - return 1; -} - -static int -togxbinary(int val) -{ - donebinarytoggle = 1; - - if (val == -1) - val = my_want_state_is_will(TELOPT_BINARY) ? 0 : 1; - - if (val == 1) { - if (my_want_state_is_will(TELOPT_BINARY)) { - printf("Already transmitting in binary mode.\r\n"); - } else { - printf("Negotiating binary mode on output.\r\n"); - tel_enter_binary(2); - } - } else { - if (my_want_state_is_wont(TELOPT_BINARY)) { - printf("Already transmitting in network ascii mode.\r\n"); - } else { - printf("Negotiating network ascii mode on output.\r\n"); - tel_leave_binary(2); - } - } - return 1; -} - - -static int togglehelp (void); -#if defined(AUTHENTICATION) -extern int auth_togdebug (int); -#endif -#if defined(ENCRYPTION) -extern int EncryptAutoEnc (int); -extern int EncryptAutoDec (int); -extern int EncryptDebug (int); -extern int EncryptVerbose (int); -#endif - -struct togglelist { - char *name; /* name of toggle */ - char *help; /* help message */ - int (*handler)(); /* routine to do actual setting */ - int *variable; - char *actionexplanation; -}; - -static struct togglelist Togglelist[] = { - { "autoflush", - "flushing of output when sending interrupt characters", - 0, - &autoflush, - "flush output when sending interrupt characters" }, - { "autosynch", - "automatic sending of interrupt characters in urgent mode", - 0, - &autosynch, - "send interrupt characters in urgent mode" }, -#if defined(AUTHENTICATION) - { "autologin", - "automatic sending of login and/or authentication info", - 0, - &autologin, - "send login name and/or authentication information" }, - { "authdebug", - "authentication debugging", - auth_togdebug, - 0, - "print authentication debugging information" }, -#endif -#if defined(ENCRYPTION) - { "autoencrypt", - "automatic encryption of data stream", - EncryptAutoEnc, - 0, - "automatically encrypt output" }, - { "autodecrypt", - "automatic decryption of data stream", - EncryptAutoDec, - 0, - "automatically decrypt input" }, - { "verbose_encrypt", - "verbose encryption output", - EncryptVerbose, - 0, - "print verbose encryption output" }, - { "encdebug", - "encryption debugging", - EncryptDebug, - 0, - "print encryption debugging information" }, -#endif -#if defined(KRB5) - { "forward", - "credentials forwarding", - kerberos5_set_forward, - 0, - "forward credentials" }, - { "forwardable", - "forwardable flag of forwarded credentials", - kerberos5_set_forwardable, - 0, - "forward forwardable credentials" }, -#endif - { "skiprc", - "don't read ~/.telnetrc file", - 0, - &skiprc, - "skip reading of ~/.telnetrc file" }, - { "binary", - "sending and receiving of binary data", - togbinary, - 0, - 0 }, - { "inbinary", - "receiving of binary data", - togrbinary, - 0, - 0 }, - { "outbinary", - "sending of binary data", - togxbinary, - 0, - 0 }, - { "crlf", - "sending carriage returns as telnet ", - togcrlf, - &crlf, - 0 }, - { "crmod", - "mapping of received carriage returns", - 0, - &crmod, - "map carriage return on output" }, - { "localchars", - "local recognition of certain control characters", - lclchars, - &localchars, - "recognize certain control characters" }, - { " ", "", 0 }, /* empty line */ - { "debug", - "debugging", - togdebug, - &debug, - "turn on socket level debugging" }, - { "netdata", - "printing of hexadecimal network data (debugging)", - 0, - &netdata, - "print hexadecimal representation of network traffic" }, - { "prettydump", - "output of \"netdata\" to user readable format (debugging)", - 0, - &prettydump, - "print user readable output for \"netdata\"" }, - { "options", - "viewing of options processing (debugging)", - 0, - &showoptions, - "show option processing" }, - { "termdata", - "printing of hexadecimal terminal data (debugging)", - 0, - &termdata, - "print hexadecimal representation of terminal traffic" }, - { "?", - 0, - togglehelp }, - { "help", - 0, - togglehelp }, - { 0 } -}; - -static int -togglehelp() -{ - struct togglelist *c; - - for (c = Togglelist; c->name; c++) { - if (c->help) { - if (*c->help) - printf("%-15s toggle %s\r\n", c->name, c->help); - else - printf("\r\n"); - } - } - printf("\r\n"); - printf("%-15s %s\r\n", "?", "display help information"); - return 0; -} - -static void -settogglehelp(int set) -{ - struct togglelist *c; - - for (c = Togglelist; c->name; c++) { - if (c->help) { - if (*c->help) - printf("%-15s %s %s\r\n", c->name, set ? "enable" : "disable", - c->help); - else - printf("\r\n"); - } - } -} - -#define GETTOGGLE(name) (struct togglelist *) \ - genget(name, (char **) Togglelist, sizeof(struct togglelist)) - -static int -toggle(int argc, char *argv[]) -{ - int retval = 1; - char *name; - struct togglelist *c; - - if (argc < 2) { - fprintf(stderr, - "Need an argument to 'toggle' command. 'toggle ?' for help.\r\n"); - return 0; - } - argc--; - argv++; - while (argc--) { - name = *argv++; - c = GETTOGGLE(name); - if (Ambiguous(c)) { - fprintf(stderr, "'%s': ambiguous argument ('toggle ?' for help).\r\n", - name); - return 0; - } else if (c == 0) { - fprintf(stderr, "'%s': unknown argument ('toggle ?' for help).\r\n", - name); - return 0; - } else { - if (c->variable) { - *c->variable = !*c->variable; /* invert it */ - if (c->actionexplanation) { - printf("%s %s.\r\n", *c->variable? "Will" : "Won't", - c->actionexplanation); - } - } - if (c->handler) { - retval &= (*c->handler)(-1); - } - } - } - return retval; -} - -/* - * The following perform the "set" command. - */ - -struct termios new_tc = { 0 }; - -struct setlist { - char *name; /* name */ - char *help; /* help information */ - void (*handler)(); - cc_t *charp; /* where it is located at */ -}; - -static struct setlist Setlist[] = { -#ifdef KLUDGELINEMODE - { "echo", "character to toggle local echoing on/off", 0, &echoc }, -#endif - { "escape", "character to escape back to telnet command mode", 0, &escape }, - { "rlogin", "rlogin escape character", 0, &rlogin }, - { "tracefile", "file to write trace information to", SetNetTrace, (cc_t *)NetTraceFile}, - { " ", "" }, - { " ", "The following need 'localchars' to be toggled true", 0, 0 }, - { "flushoutput", "character to cause an Abort Output", 0, &termFlushChar }, - { "interrupt", "character to cause an Interrupt Process", 0, &termIntChar }, - { "quit", "character to cause an Abort process", 0, &termQuitChar }, - { "eof", "character to cause an EOF ", 0, &termEofChar }, - { " ", "" }, - { " ", "The following are for local editing in linemode", 0, 0 }, - { "erase", "character to use to erase a character", 0, &termEraseChar }, - { "kill", "character to use to erase a line", 0, &termKillChar }, - { "lnext", "character to use for literal next", 0, &termLiteralNextChar }, - { "susp", "character to cause a Suspend Process", 0, &termSuspChar }, - { "reprint", "character to use for line reprint", 0, &termRprntChar }, - { "worderase", "character to use to erase a word", 0, &termWerasChar }, - { "start", "character to use for XON", 0, &termStartChar }, - { "stop", "character to use for XOFF", 0, &termStopChar }, - { "forw1", "alternate end of line character", 0, &termForw1Char }, - { "forw2", "alternate end of line character", 0, &termForw2Char }, - { "ayt", "alternate AYT character", 0, &termAytChar }, - { 0 } -}; - -static struct setlist * -getset(char *name) -{ - return (struct setlist *) - genget(name, (char **) Setlist, sizeof(struct setlist)); -} - -void -set_escape_char(char *s) -{ - if (rlogin != _POSIX_VDISABLE) { - rlogin = (s && *s) ? special(s) : _POSIX_VDISABLE; - printf("Telnet rlogin escape character is '%s'.\r\n", - control(rlogin)); - } else { - escape = (s && *s) ? special(s) : _POSIX_VDISABLE; - printf("Telnet escape character is '%s'.\r\n", control(escape)); - } -} - -static int -setcmd(int argc, char *argv[]) -{ - int value; - struct setlist *ct; - struct togglelist *c; - - if (argc < 2 || argc > 3) { - printf("Format is 'set Name Value'\r\n'set ?' for help.\r\n"); - return 0; - } - if ((argc == 2) && (isprefix(argv[1], "?") || isprefix(argv[1], "help"))) { - for (ct = Setlist; ct->name; ct++) - printf("%-15s %s\r\n", ct->name, ct->help); - printf("\r\n"); - settogglehelp(1); - printf("%-15s %s\r\n", "?", "display help information"); - return 0; - } - - ct = getset(argv[1]); - if (ct == 0) { - c = GETTOGGLE(argv[1]); - if (c == 0) { - fprintf(stderr, "'%s': unknown argument ('set ?' for help).\r\n", - argv[1]); - return 0; - } else if (Ambiguous(c)) { - fprintf(stderr, "'%s': ambiguous argument ('set ?' for help).\r\n", - argv[1]); - return 0; - } - if (c->variable) { - if ((argc == 2) || (strcmp("on", argv[2]) == 0)) - *c->variable = 1; - else if (strcmp("off", argv[2]) == 0) - *c->variable = 0; - else { - printf("Format is 'set togglename [on|off]'\r\n'set ?' for help.\r\n"); - return 0; - } - if (c->actionexplanation) { - printf("%s %s.\r\n", *c->variable? "Will" : "Won't", - c->actionexplanation); - } - } - if (c->handler) - (*c->handler)(1); - } else if (argc != 3) { - printf("Format is 'set Name Value'\r\n'set ?' for help.\r\n"); - return 0; - } else if (Ambiguous(ct)) { - fprintf(stderr, "'%s': ambiguous argument ('set ?' for help).\r\n", - argv[1]); - return 0; - } else if (ct->handler) { - (*ct->handler)(argv[2]); - printf("%s set to \"%s\".\r\n", ct->name, (char *)ct->charp); - } else { - if (strcmp("off", argv[2])) { - value = special(argv[2]); - } else { - value = _POSIX_VDISABLE; - } - *(ct->charp) = (cc_t)value; - printf("%s character is '%s'.\r\n", ct->name, control(*(ct->charp))); - } - slc_check(); - return 1; -} - -static int -unsetcmd(int argc, char *argv[]) -{ - struct setlist *ct; - struct togglelist *c; - char *name; - - if (argc < 2) { - fprintf(stderr, - "Need an argument to 'unset' command. 'unset ?' for help.\r\n"); - return 0; - } - if (isprefix(argv[1], "?") || isprefix(argv[1], "help")) { - for (ct = Setlist; ct->name; ct++) - printf("%-15s %s\r\n", ct->name, ct->help); - printf("\r\n"); - settogglehelp(0); - printf("%-15s %s\r\n", "?", "display help information"); - return 0; - } - - argc--; - argv++; - while (argc--) { - name = *argv++; - ct = getset(name); - if (ct == 0) { - c = GETTOGGLE(name); - if (c == 0) { - fprintf(stderr, "'%s': unknown argument ('unset ?' for help).\r\n", - name); - return 0; - } else if (Ambiguous(c)) { - fprintf(stderr, "'%s': ambiguous argument ('unset ?' for help).\r\n", - name); - return 0; - } - if (c->variable) { - *c->variable = 0; - if (c->actionexplanation) { - printf("%s %s.\r\n", *c->variable? "Will" : "Won't", - c->actionexplanation); - } - } - if (c->handler) - (*c->handler)(0); - } else if (Ambiguous(ct)) { - fprintf(stderr, "'%s': ambiguous argument ('unset ?' for help).\r\n", - name); - return 0; - } else if (ct->handler) { - (*ct->handler)(0); - printf("%s reset to \"%s\".\r\n", ct->name, (char *)ct->charp); - } else { - *(ct->charp) = _POSIX_VDISABLE; - printf("%s character is '%s'.\r\n", ct->name, control(*(ct->charp))); - } - } - return 1; -} - -/* - * The following are the data structures and routines for the - * 'mode' command. - */ -#ifdef KLUDGELINEMODE - -static int -dokludgemode(void) -{ - kludgelinemode = 1; - send_wont(TELOPT_LINEMODE, 1); - send_dont(TELOPT_SGA, 1); - send_dont(TELOPT_ECHO, 1); - return 1; -} -#endif - -static int -dolinemode() -{ -#ifdef KLUDGELINEMODE - if (kludgelinemode) - send_dont(TELOPT_SGA, 1); -#endif - send_will(TELOPT_LINEMODE, 1); - send_dont(TELOPT_ECHO, 1); - return 1; -} - -static int -docharmode() -{ -#ifdef KLUDGELINEMODE - if (kludgelinemode) - send_do(TELOPT_SGA, 1); - else -#endif - send_wont(TELOPT_LINEMODE, 1); - send_do(TELOPT_ECHO, 1); - return 1; -} - -static int -dolmmode(int bit, int on) -{ - unsigned char c; - - if (my_want_state_is_wont(TELOPT_LINEMODE)) { - printf("?Need to have LINEMODE option enabled first.\r\n"); - printf("'mode ?' for help.\r\n"); - return 0; - } - - if (on) - c = (linemode | bit); - else - c = (linemode & ~bit); - lm_mode(&c, 1, 1); - return 1; -} - -static int -tn_setmode(int bit) -{ - return dolmmode(bit, 1); -} - -static int -tn_clearmode(int bit) -{ - return dolmmode(bit, 0); -} - -struct modelist { - char *name; /* command name */ - char *help; /* help string */ - int (*handler)(); /* routine which executes command */ - int needconnect; /* Do we need to be connected to execute? */ - int arg1; -}; - -static int modehelp(void); - -static struct modelist ModeList[] = { - { "character", "Disable LINEMODE option", docharmode, 1 }, -#ifdef KLUDGELINEMODE - { "", "(or disable obsolete line-by-line mode)", 0 }, -#endif - { "line", "Enable LINEMODE option", dolinemode, 1 }, -#ifdef KLUDGELINEMODE - { "", "(or enable obsolete line-by-line mode)", 0 }, -#endif - { "", "", 0 }, - { "", "These require the LINEMODE option to be enabled", 0 }, - { "isig", "Enable signal trapping", tn_setmode, 1, MODE_TRAPSIG }, - { "+isig", 0, tn_setmode, 1, MODE_TRAPSIG }, - { "-isig", "Disable signal trapping", tn_clearmode, 1, MODE_TRAPSIG }, - { "edit", "Enable character editing", tn_setmode, 1, MODE_EDIT }, - { "+edit", 0, tn_setmode, 1, MODE_EDIT }, - { "-edit", "Disable character editing", tn_clearmode, 1, MODE_EDIT }, - { "softtabs", "Enable tab expansion", tn_setmode, 1, MODE_SOFT_TAB }, - { "+softtabs", 0, tn_setmode, 1, MODE_SOFT_TAB }, - { "-softtabs", "Disable tab expansion", tn_clearmode, 1, MODE_SOFT_TAB }, - { "litecho", "Enable literal character echo", tn_setmode, 1, MODE_LIT_ECHO }, - { "+litecho", 0, tn_setmode, 1, MODE_LIT_ECHO }, - { "-litecho", "Disable literal character echo", tn_clearmode, 1, MODE_LIT_ECHO }, - { "help", 0, modehelp, 0 }, -#ifdef KLUDGELINEMODE - { "kludgeline", 0, dokludgemode, 1 }, -#endif - { "", "", 0 }, - { "?", "Print help information", modehelp, 0 }, - { 0 }, -}; - - -static int -modehelp(void) -{ - struct modelist *mt; - - printf("format is: 'mode Mode', where 'Mode' is one of:\r\n\r\n"); - for (mt = ModeList; mt->name; mt++) { - if (mt->help) { - if (*mt->help) - printf("%-15s %s\r\n", mt->name, mt->help); - else - printf("\r\n"); - } - } - return 0; -} - -#define GETMODECMD(name) (struct modelist *) \ - genget(name, (char **) ModeList, sizeof(struct modelist)) - -static int -modecmd(int argc, char **argv) -{ - struct modelist *mt; - - if (argc != 2) { - printf("'mode' command requires an argument\r\n"); - printf("'mode ?' for help.\r\n"); - } else if ((mt = GETMODECMD(argv[1])) == 0) { - fprintf(stderr, "Unknown mode '%s' ('mode ?' for help).\r\n", argv[1]); - } else if (Ambiguous(mt)) { - fprintf(stderr, "Ambiguous mode '%s' ('mode ?' for help).\r\n", argv[1]); - } else if (mt->needconnect && !connected) { - printf("?Need to be connected first.\r\n"); - printf("'mode ?' for help.\r\n"); - } else if (mt->handler) { - return (*mt->handler)(mt->arg1); - } - return 0; -} - -/* - * The following data structures and routines implement the - * "display" command. - */ - -static int -display(int argc, char *argv[]) -{ - struct togglelist *tl; - struct setlist *sl; - -#define dotog(tl) if (tl->variable && tl->actionexplanation) { \ - if (*tl->variable) { \ - printf("will"); \ - } else { \ - printf("won't"); \ - } \ - printf(" %s.\r\n", tl->actionexplanation); \ - } - -#define doset(sl) if (sl->name && *sl->name != ' ') { \ - if (sl->handler == 0) \ - printf("%-15s [%s]\r\n", sl->name, control(*sl->charp)); \ - else \ - printf("%-15s \"%s\"\r\n", sl->name, (char *)sl->charp); \ - } - - if (argc == 1) { - for (tl = Togglelist; tl->name; tl++) { - dotog(tl); - } - printf("\r\n"); - for (sl = Setlist; sl->name; sl++) { - doset(sl); - } - } else { - int i; - - for (i = 1; i < argc; i++) { - sl = getset(argv[i]); - tl = GETTOGGLE(argv[i]); - if (Ambiguous(sl) || Ambiguous(tl)) { - printf("?Ambiguous argument '%s'.\r\n", argv[i]); - return 0; - } else if (!sl && !tl) { - printf("?Unknown argument '%s'.\r\n", argv[i]); - return 0; - } else { - if (tl) { - dotog(tl); - } - if (sl) { - doset(sl); - } - } - } - } -/*@*/optionstatus(); -#if defined(ENCRYPTION) - EncryptStatus(); -#endif - return 1; -#undef doset -#undef dotog -} - -/* - * The following are the data structures, and many of the routines, - * relating to command processing. - */ - -/* - * Set the escape character. - */ -static int -setescape(int argc, char *argv[]) -{ - char *arg; - char buf[50]; - - printf( - "Deprecated usage - please use 'set escape%s%s' in the future.\r\n", - (argc > 2)? " ":"", (argc > 2)? argv[1]: ""); - if (argc > 2) - arg = argv[1]; - else { - printf("new escape character: "); - fgets(buf, sizeof(buf), stdin); - arg = buf; - } - if (arg[0] != '\0') - escape = arg[0]; - printf("Escape character is '%s'.\r\n", control(escape)); - - fflush(stdout); - return 1; -} - -static int -togcrmod() -{ - crmod = !crmod; - printf("Deprecated usage - please use 'toggle crmod' in the future.\r\n"); - printf("%s map carriage return on output.\r\n", crmod ? "Will" : "Won't"); - fflush(stdout); - return 1; -} - -static int -telnetsuspend() -{ -#ifdef SIGTSTP - setcommandmode(); - { - long oldrows, oldcols, newrows, newcols, err; - - err = (TerminalWindowSize(&oldrows, &oldcols) == 0) ? 1 : 0; - kill(0, SIGTSTP); - /* - * If we didn't get the window size before the SUSPEND, but we - * can get them now (?), then send the NAWS to make sure that - * we are set up for the right window size. - */ - if (TerminalWindowSize(&newrows, &newcols) && connected && - (err || ((oldrows != newrows) || (oldcols != newcols)))) { - sendnaws(); - } - } - /* reget parameters in case they were changed */ - TerminalSaveState(); - setconnmode(0); -#else - printf("Suspend is not supported. Try the '!' command instead\r\n"); -#endif - return 1; -} - -static int -shell(int argc, char **argv) -{ - long oldrows, oldcols, newrows, newcols, err; - - setcommandmode(); - - err = (TerminalWindowSize(&oldrows, &oldcols) == 0) ? 1 : 0; - switch(fork()) { - case -1: - perror("Fork failed\r\n"); - break; - - case 0: - { - /* - * Fire up the shell in the child. - */ - char *shellp, *shellname; - - shellp = getenv("SHELL"); - if (shellp == NULL) - shellp = "/bin/sh"; - if ((shellname = strrchr(shellp, '/')) == 0) - shellname = shellp; - else - shellname++; - if (argc > 1) - execl(shellp, shellname, "-c", &saveline[1], NULL); - else - execl(shellp, shellname, NULL); - perror("Execl"); - _exit(1); - } - default: - wait((int *)0); /* Wait for the shell to complete */ - - if (TerminalWindowSize(&newrows, &newcols) && connected && - (err || ((oldrows != newrows) || (oldcols != newcols)))) { - sendnaws(); - } - break; - } - return 1; -} - -static int -bye(int argc, char **argv) -{ - if (connected) { - shutdown(net, 2); - printf("Connection closed.\r\n"); - NetClose(net); - connected = 0; - resettermname = 1; -#if defined(AUTHENTICATION) || defined(ENCRYPTION) - auth_encrypt_connect(connected); -#endif - /* reset options */ - tninit(); - } - if ((argc != 2) || (strcmp(argv[1], "fromquit") != 0)) - longjmp(toplevel, 1); - return 0; /* NOTREACHED */ -} - -int -quit(void) -{ - call(bye, "bye", "fromquit", 0); - Exit(0); - return 0; /*NOTREACHED*/ -} - -static int -logout() -{ - send_do(TELOPT_LOGOUT, 1); - netflush(); - return 1; -} - - -/* - * The SLC command. - */ - -struct slclist { - char *name; - char *help; - void (*handler)(); - int arg; -}; - -static void slc_help(void); - -struct slclist SlcList[] = { - { "export", "Use local special character definitions", - slc_mode_export, 0 }, - { "import", "Use remote special character definitions", - slc_mode_import, 1 }, - { "check", "Verify remote special character definitions", - slc_mode_import, 0 }, - { "help", 0, slc_help, 0 }, - { "?", "Print help information", slc_help, 0 }, - { 0 }, -}; - -static void -slc_help(void) -{ - struct slclist *c; - - for (c = SlcList; c->name; c++) { - if (c->help) { - if (*c->help) - printf("%-15s %s\r\n", c->name, c->help); - else - printf("\r\n"); - } - } -} - -static struct slclist * -getslc(char *name) -{ - return (struct slclist *) - genget(name, (char **) SlcList, sizeof(struct slclist)); -} - -static int -slccmd(int argc, char **argv) -{ - struct slclist *c; - - if (argc != 2) { - fprintf(stderr, - "Need an argument to 'slc' command. 'slc ?' for help.\r\n"); - return 0; - } - c = getslc(argv[1]); - if (c == 0) { - fprintf(stderr, "'%s': unknown argument ('slc ?' for help).\r\n", - argv[1]); - return 0; - } - if (Ambiguous(c)) { - fprintf(stderr, "'%s': ambiguous argument ('slc ?' for help).\r\n", - argv[1]); - return 0; - } - (*c->handler)(c->arg); - slcstate(); - return 1; -} - -/* - * The ENVIRON command. - */ - -struct envlist { - char *name; - char *help; - void (*handler)(); - int narg; -}; - -static void env_help (void); - -struct envlist EnvList[] = { - { "define", "Define an environment variable", - (void (*)())env_define, 2 }, - { "undefine", "Undefine an environment variable", - env_undefine, 1 }, - { "export", "Mark an environment variable for automatic export", - env_export, 1 }, - { "unexport", "Don't mark an environment variable for automatic export", - env_unexport, 1 }, - { "send", "Send an environment variable", env_send, 1 }, - { "list", "List the current environment variables", - env_list, 0 }, - { "help", 0, env_help, 0 }, - { "?", "Print help information", env_help, 0 }, - { 0 }, -}; - -static void -env_help() -{ - struct envlist *c; - - for (c = EnvList; c->name; c++) { - if (c->help) { - if (*c->help) - printf("%-15s %s\r\n", c->name, c->help); - else - printf("\r\n"); - } - } -} - -static struct envlist * -getenvcmd(char *name) -{ - return (struct envlist *) - genget(name, (char **) EnvList, sizeof(struct envlist)); -} - -static int -env_cmd(int argc, char **argv) -{ - struct envlist *c; - - if (argc < 2) { - fprintf(stderr, - "Need an argument to 'environ' command. 'environ ?' for help.\r\n"); - return 0; - } - c = getenvcmd(argv[1]); - if (c == 0) { - fprintf(stderr, "'%s': unknown argument ('environ ?' for help).\r\n", - argv[1]); - return 0; - } - if (Ambiguous(c)) { - fprintf(stderr, "'%s': ambiguous argument ('environ ?' for help).\r\n", - argv[1]); - return 0; - } - if (c->narg + 2 != argc) { - fprintf(stderr, - "Need %s%d argument%s to 'environ %s' command. 'environ ?' for help.\r\n", - c->narg < argc + 2 ? "only " : "", - c->narg, c->narg == 1 ? "" : "s", c->name); - return 0; - } - (*c->handler)(argv[2], argv[3]); - return 1; -} - -struct env_lst { - struct env_lst *next; /* pointer to next structure */ - struct env_lst *prev; /* pointer to previous structure */ - unsigned char *var; /* pointer to variable name */ - unsigned char *value; /* pointer to variable value */ - int export; /* 1 -> export with default list of variables */ - int welldefined; /* A well defined variable */ -}; - -struct env_lst envlisthead; - -struct env_lst * -env_find(unsigned char *var) -{ - struct env_lst *ep; - - for (ep = envlisthead.next; ep; ep = ep->next) { - if (strcmp((char *)ep->var, (char *)var) == 0) - return(ep); - } - return(NULL); -} - -#if !HAVE_DECL_ENVIRON -extern char **environ; -#endif - -void -env_init(void) -{ - char **epp, *cp; - struct env_lst *ep; - - for (epp = environ; *epp; epp++) { - if ((cp = strchr(*epp, '='))) { - *cp = '\0'; - ep = env_define((unsigned char *)*epp, - (unsigned char *)cp+1); - ep->export = 0; - *cp = '='; - } - } - /* - * Special case for DISPLAY variable. If it is ":0.0" or - * "unix:0.0", we have to get rid of "unix" and insert our - * hostname. - */ - if ((ep = env_find((unsigned char*)"DISPLAY")) - && (*ep->value == ':' - || strncmp((char *)ep->value, "unix:", 5) == 0)) { - char hbuf[256+1]; - char *cp2 = strchr((char *)ep->value, ':'); - int error; - - /* XXX - should be k_gethostname? */ - gethostname(hbuf, 256); - hbuf[256] = '\0'; - - /* If this is not the full name, try to get it via DNS */ - if (strchr(hbuf, '.') == 0) { - struct addrinfo hints, *ai, *a; - - memset (&hints, 0, sizeof(hints)); - hints.ai_flags = AI_CANONNAME; - - error = getaddrinfo (hbuf, NULL, &hints, &ai); - if (error == 0) { - for (a = ai; a != NULL; a = a->ai_next) - if (a->ai_canonname != NULL) { - strlcpy (hbuf, - ai->ai_canonname, - 256); - break; - } - freeaddrinfo (ai); - } - } - - error = asprintf (&cp, "%s%s", hbuf, cp2); - if (error != -1) { - free (ep->value); - ep->value = (unsigned char *)cp; - } - } - /* - * If USER is not defined, but LOGNAME is, then add - * USER with the value from LOGNAME. By default, we - * don't export the USER variable. - */ - if ((env_find((unsigned char*)"USER") == NULL) && - (ep = env_find((unsigned char*)"LOGNAME"))) { - env_define((unsigned char *)"USER", ep->value); - env_unexport((unsigned char *)"USER"); - } - env_export((unsigned char *)"DISPLAY"); - env_export((unsigned char *)"PRINTER"); - env_export((unsigned char *)"XAUTHORITY"); -} - -struct env_lst * -env_define(unsigned char *var, unsigned char *value) -{ - struct env_lst *ep; - - if ((ep = env_find(var))) { - if (ep->var) - free(ep->var); - if (ep->value) - free(ep->value); - } else { - ep = (struct env_lst *)malloc(sizeof(struct env_lst)); - ep->next = envlisthead.next; - envlisthead.next = ep; - ep->prev = &envlisthead; - if (ep->next) - ep->next->prev = ep; - } - ep->welldefined = opt_welldefined((char *)var); - ep->export = 1; - ep->var = (unsigned char *)strdup((char *)var); - ep->value = (unsigned char *)strdup((char *)value); - return(ep); -} - -void -env_undefine(unsigned char *var) -{ - struct env_lst *ep; - - if ((ep = env_find(var))) { - ep->prev->next = ep->next; - if (ep->next) - ep->next->prev = ep->prev; - if (ep->var) - free(ep->var); - if (ep->value) - free(ep->value); - free(ep); - } -} - -void -env_export(unsigned char *var) -{ - struct env_lst *ep; - - if ((ep = env_find(var))) - ep->export = 1; -} - -void -env_unexport(unsigned char *var) -{ - struct env_lst *ep; - - if ((ep = env_find(var))) - ep->export = 0; -} - -void -env_send(unsigned char *var) -{ - struct env_lst *ep; - - if (my_state_is_wont(TELOPT_NEW_ENVIRON) -#ifdef OLD_ENVIRON - && my_state_is_wont(TELOPT_OLD_ENVIRON) -#endif - ) { - fprintf(stderr, - "Cannot send '%s': Telnet ENVIRON option not enabled\r\n", - var); - return; - } - ep = env_find(var); - if (ep == 0) { - fprintf(stderr, "Cannot send '%s': variable not defined\r\n", - var); - return; - } - env_opt_start_info(); - env_opt_add(ep->var); - env_opt_end(0); -} - -void -env_list(void) -{ - struct env_lst *ep; - - for (ep = envlisthead.next; ep; ep = ep->next) { - printf("%c %-20s %s\r\n", ep->export ? '*' : ' ', - ep->var, ep->value); - } -} - -unsigned char * -env_default(int init, int welldefined) -{ - static struct env_lst *nep = NULL; - - if (init) { - nep = &envlisthead; - return NULL; - } - if (nep) { - while ((nep = nep->next)) { - if (nep->export && (nep->welldefined == welldefined)) - return(nep->var); - } - } - return(NULL); -} - -unsigned char * -env_getvalue(unsigned char *var) -{ - struct env_lst *ep; - - if ((ep = env_find(var))) - return(ep->value); - return(NULL); -} - - -#if defined(AUTHENTICATION) -/* - * The AUTHENTICATE command. - */ - -struct authlist { - char *name; - char *help; - int (*handler)(); - int narg; -}; - -static int - auth_help (void); - -struct authlist AuthList[] = { - { "status", "Display current status of authentication information", - auth_status, 0 }, - { "disable", "Disable an authentication type ('auth disable ?' for more)", - auth_disable, 1 }, - { "enable", "Enable an authentication type ('auth enable ?' for more)", - auth_enable, 1 }, - { "help", 0, auth_help, 0 }, - { "?", "Print help information", auth_help, 0 }, - { 0 }, -}; - -static int -auth_help() -{ - struct authlist *c; - - for (c = AuthList; c->name; c++) { - if (c->help) { - if (*c->help) - printf("%-15s %s\r\n", c->name, c->help); - else - printf("\r\n"); - } - } - return 0; -} - -static int -auth_cmd(int argc, char **argv) -{ - struct authlist *c; - - if (argc < 2) { - fprintf(stderr, - "Need an argument to 'auth' command. 'auth ?' for help.\r\n"); - return 0; - } - - c = (struct authlist *) - genget(argv[1], (char **) AuthList, sizeof(struct authlist)); - if (c == 0) { - fprintf(stderr, "'%s': unknown argument ('auth ?' for help).\r\n", - argv[1]); - return 0; - } - if (Ambiguous(c)) { - fprintf(stderr, "'%s': ambiguous argument ('auth ?' for help).\r\n", - argv[1]); - return 0; - } - if (c->narg + 2 != argc) { - fprintf(stderr, - "Need %s%d argument%s to 'auth %s' command. 'auth ?' for help.\r\n", - c->narg < argc + 2 ? "only " : "", - c->narg, c->narg == 1 ? "" : "s", c->name); - return 0; - } - return((*c->handler)(argv[2], argv[3])); -} -#endif - - -#if defined(ENCRYPTION) -/* - * The ENCRYPT command. - */ - -struct encryptlist { - char *name; - char *help; - int (*handler)(); - int needconnect; - int minarg; - int maxarg; -}; - -static int - EncryptHelp (void); - -struct encryptlist EncryptList[] = { - { "enable", "Enable encryption. ('encrypt enable ?' for more)", - EncryptEnable, 1, 1, 2 }, - { "disable", "Disable encryption. ('encrypt enable ?' for more)", - EncryptDisable, 0, 1, 2 }, - { "type", "Set encryptiong type. ('encrypt type ?' for more)", - EncryptType, 0, 1, 1 }, - { "start", "Start encryption. ('encrypt start ?' for more)", - EncryptStart, 1, 0, 1 }, - { "stop", "Stop encryption. ('encrypt stop ?' for more)", - EncryptStop, 1, 0, 1 }, - { "input", "Start encrypting the input stream", - EncryptStartInput, 1, 0, 0 }, - { "-input", "Stop encrypting the input stream", - EncryptStopInput, 1, 0, 0 }, - { "output", "Start encrypting the output stream", - EncryptStartOutput, 1, 0, 0 }, - { "-output", "Stop encrypting the output stream", - EncryptStopOutput, 1, 0, 0 }, - - { "status", "Display current status of authentication information", - EncryptStatus, 0, 0, 0 }, - { "help", 0, EncryptHelp, 0, 0, 0 }, - { "?", "Print help information", EncryptHelp, 0, 0, 0 }, - { 0 }, -}; - -static int -EncryptHelp() -{ - struct encryptlist *c; - - for (c = EncryptList; c->name; c++) { - if (c->help) { - if (*c->help) - printf("%-15s %s\r\n", c->name, c->help); - else - printf("\r\n"); - } - } - return 0; -} - -static int -encrypt_cmd(int argc, char **argv) -{ - struct encryptlist *c; - - c = (struct encryptlist *) - genget(argv[1], (char **) EncryptList, sizeof(struct encryptlist)); - if (c == 0) { - fprintf(stderr, "'%s': unknown argument ('encrypt ?' for help).\r\n", - argv[1]); - return 0; - } - if (Ambiguous(c)) { - fprintf(stderr, "'%s': ambiguous argument ('encrypt ?' for help).\r\n", - argv[1]); - return 0; - } - argc -= 2; - if (argc < c->minarg || argc > c->maxarg) { - if (c->minarg == c->maxarg) { - fprintf(stderr, "Need %s%d argument%s ", - c->minarg < argc ? "only " : "", c->minarg, - c->minarg == 1 ? "" : "s"); - } else { - fprintf(stderr, "Need %s%d-%d arguments ", - c->maxarg < argc ? "only " : "", c->minarg, c->maxarg); - } - fprintf(stderr, "to 'encrypt %s' command. 'encrypt ?' for help.\r\n", - c->name); - return 0; - } - if (c->needconnect && !connected) { - if (!(argc && (isprefix(argv[2], "help") || isprefix(argv[2], "?")))) { - printf("?Need to be connected first.\r\n"); - return 0; - } - } - return ((*c->handler)(argc > 0 ? argv[2] : 0, - argc > 1 ? argv[3] : 0, - argc > 2 ? argv[4] : 0)); -} -#endif - - -/* - * Print status about the connection. - */ - -static int -status(int argc, char **argv) -{ - if (connected) { - printf("Connected to %s.\r\n", hostname); - if ((argc < 2) || strcmp(argv[1], "notmuch")) { - int mode = getconnmode(); - - if (my_want_state_is_will(TELOPT_LINEMODE)) { - printf("Operating with LINEMODE option\r\n"); - printf("%s line editing\r\n", (mode&MODE_EDIT) ? "Local" : "No"); - printf("%s catching of signals\r\n", - (mode&MODE_TRAPSIG) ? "Local" : "No"); - slcstate(); -#ifdef KLUDGELINEMODE - } else if (kludgelinemode && my_want_state_is_dont(TELOPT_SGA)) { - printf("Operating in obsolete linemode\r\n"); -#endif - } else { - printf("Operating in single character mode\r\n"); - if (localchars) - printf("Catching signals locally\r\n"); - } - printf("%s character echo\r\n", (mode&MODE_ECHO) ? "Local" : "Remote"); - if (my_want_state_is_will(TELOPT_LFLOW)) - printf("%s flow control\r\n", (mode&MODE_FLOW) ? "Local" : "No"); -#if defined(ENCRYPTION) - encrypt_display(); -#endif - } - } else { - printf("No connection.\r\n"); - } - printf("Escape character is '%s'.\r\n", control(escape)); - fflush(stdout); - return 1; -} - -#ifdef SIGINFO -/* - * Function that gets called when SIGINFO is received. - */ -RETSIGTYPE -ayt_status(int ignore) -{ - call(status, "status", "notmuch", 0); -} -#endif - -static Command *getcmd(char *name); - -static void -cmdrc(char *m1, char *m2) -{ - static char rcname[128]; - Command *c; - FILE *rcfile; - int gotmachine = 0; - int l1 = strlen(m1); - int l2 = strlen(m2); - char m1save[64]; - - if (skiprc) - return; - - strlcpy(m1save, m1, sizeof(m1save)); - m1 = m1save; - - if (rcname[0] == 0) { - char *home = getenv("HOME"); - - snprintf (rcname, sizeof(rcname), "%s/.telnetrc", - home ? home : ""); - } - - if ((rcfile = fopen(rcname, "r")) == 0) { - return; - } - - for (;;) { - if (fgets(line, sizeof(line), rcfile) == NULL) - break; - if (line[0] == 0) - break; - if (line[0] == '#') - continue; - if (gotmachine) { - if (!isspace((unsigned char)line[0])) - gotmachine = 0; - } - if (gotmachine == 0) { - if (isspace((unsigned char)line[0])) - continue; - if (strncasecmp(line, m1, l1) == 0) - strncpy(line, &line[l1], sizeof(line) - l1); - else if (strncasecmp(line, m2, l2) == 0) - strncpy(line, &line[l2], sizeof(line) - l2); - else if (strncasecmp(line, "DEFAULT", 7) == 0) - strncpy(line, &line[7], sizeof(line) - 7); - else - continue; - if (line[0] != ' ' && line[0] != '\t' && line[0] != '\n') - continue; - gotmachine = 1; - } - makeargv(); - if (margv[0] == 0) - continue; - c = getcmd(margv[0]); - if (Ambiguous(c)) { - printf("?Ambiguous command: %s\r\n", margv[0]); - continue; - } - if (c == 0) { - printf("?Invalid command: %s\r\n", margv[0]); - continue; - } - /* - * This should never happen... - */ - if (c->needconnect && !connected) { - printf("?Need to be connected first for %s.\r\n", margv[0]); - continue; - } - (*c->handler)(margc, margv); - } - fclose(rcfile); -} - -int -tn(int argc, char **argv) -{ - struct servent *sp = 0; - char *cmd, *hostp = 0, *portp = 0; - char *user = 0; - int port = 0; - - /* clear the socket address prior to use */ - - if (connected) { - printf("?Already connected to %s\r\n", hostname); - return 0; - } - if (argc < 2) { - strlcpy(line, "open ", sizeof(line)); - printf("(to) "); - fgets(&line[strlen(line)], sizeof(line) - strlen(line), stdin); - makeargv(); - argc = margc; - argv = margv; - } - cmd = *argv; - --argc; ++argv; - while (argc) { - if (strcmp(*argv, "help") == 0 || isprefix(*argv, "?")) - goto usage; - if (strcmp(*argv, "-l") == 0) { - --argc; ++argv; - if (argc == 0) - goto usage; - user = strdup(*argv++); - --argc; - continue; - } - if (strcmp(*argv, "-a") == 0) { - --argc; ++argv; - autologin = 1; - continue; - } - if (hostp == 0) { - hostp = *argv++; - --argc; - continue; - } - if (portp == 0) { - portp = *argv++; - --argc; - continue; - } - usage: - printf("usage: %s [-l user] [-a] host-name [port]\r\n", cmd); - return 0; - } - if (hostp == 0) - goto usage; - - strlcpy (_hostname, hostp, sizeof(_hostname)); - hostp = _hostname; - if (hostp[0] == '@' || hostp[0] == '!') { - char *p; - hostname = NULL; - for (p = hostp + 1; *p; p++) { - if (*p == ',' || *p == '@') - hostname = p; - } - if (hostname == NULL) { - fprintf(stderr, "%s: bad source route specification\n", hostp); - return 0; - } - *hostname++ = '\0'; - } else - hostname = hostp; - - if (portp) { - if (*portp == '-') { - portp++; - telnetport = 1; - } else - telnetport = 0; - port = atoi(portp); - if (port == 0) { - sp = roken_getservbyname(portp, "tcp"); - if (sp) - port = sp->s_port; - else { - printf("%s: bad port number\r\n", portp); - return 0; - } - } else { - port = htons(port); - } - } else { - if (sp == 0) { - sp = roken_getservbyname("telnet", "tcp"); - if (sp == 0) { - fprintf(stderr, "telnet: tcp/telnet: unknown service\r\n"); - return 0; - } - port = sp->s_port; - } - telnetport = 1; - } - - { - struct addrinfo *ai, *a, hints; - int error; - char portstr[NI_MAXSERV]; - - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - hints.ai_flags = AI_CANONNAME; - - snprintf (portstr, sizeof(portstr), "%u", ntohs(port)); - - error = getaddrinfo (hostname, portstr, &hints, &ai); - if (error) { - fprintf (stderr, "%s: %s\r\n", hostname, gai_strerror (error)); - return 0; - } - - for (a = ai; a != NULL && connected == 0; a = a->ai_next) { - char addrstr[256]; - - if (a->ai_canonname != NULL) - strlcpy (_hostname, a->ai_canonname, sizeof(_hostname)); - - if (getnameinfo (a->ai_addr, a->ai_addrlen, - addrstr, sizeof(addrstr), - NULL, 0, NI_NUMERICHOST) != 0) - strlcpy (addrstr, "unknown address", sizeof(addrstr)); - - printf("Trying %s...\r\n", addrstr); - - net = socket (a->ai_family, a->ai_socktype, a->ai_protocol); - if (net < 0) { - warn ("socket"); - continue; - } - -#if defined(IP_OPTIONS) && defined(IPPROTO_IP) && defined(HAVE_SETSOCKOPT) - if (hostp[0] == '@' || hostp[0] == '!') { - char *srp = 0; - int srlen; - int proto, opt; - - if ((srlen = sourceroute(a, hostp, &srp, &proto, &opt)) < 0) { - (void) NetClose(net); - net = -1; - continue; - } - if (srp && setsockopt(net, proto, opt, srp, srlen) < 0) - perror("setsockopt (source route)"); - } -#endif - -#if defined(IPPROTO_IP) && defined(IP_TOS) - if (a->ai_family == AF_INET) { -# if defined(HAVE_GETTOSBYNAME) - struct tosent *tp; - if (tos < 0 && (tp = gettosbyname("telnet", "tcp"))) - tos = tp->t_tos; -# endif - if (tos < 0) - tos = 020; /* Low Delay bit */ - if (tos - && (setsockopt(net, IPPROTO_IP, IP_TOS, - (void *)&tos, sizeof(int)) < 0) - && (errno != ENOPROTOOPT)) - perror("telnet: setsockopt (IP_TOS) (ignored)"); - } -#endif /* defined(IPPROTO_IP) && defined(IP_TOS) */ - if (debug && SetSockOpt(net, SOL_SOCKET, SO_DEBUG, 1) < 0) { - perror("setsockopt (SO_DEBUG)"); - } - - if (connect (net, a->ai_addr, a->ai_addrlen) < 0) { - fprintf (stderr, "telnet: connect to address %s: %s\n", - addrstr, strerror(errno)); - NetClose(net); - if (a->ai_next != NULL) { - continue; - } else { - freeaddrinfo (ai); - return 0; - } - } - ++connected; -#if defined(AUTHENTICATION) || defined(ENCRYPTION) - auth_encrypt_connect(connected); -#endif - } - freeaddrinfo (ai); - if (connected == 0) - return 0; - } - cmdrc(hostp, hostname); - set_forward_options(); - if (autologin && user == NULL) - user = (char *)get_default_username (); - if (user) { - env_define((unsigned char *)"USER", (unsigned char *)user); - env_export((unsigned char *)"USER"); - } - call(status, "status", "notmuch", 0); - if (setjmp(peerdied) == 0) - my_telnet((char *)user); - NetClose(net); - ExitString("Connection closed by foreign host.\r\n",1); - /*NOTREACHED*/ - return 0; -} - -#define HELPINDENT ((int)sizeof ("connect")) - -static char - openhelp[] = "connect to a site", - closehelp[] = "close current connection", - logouthelp[] = "forcibly logout remote user and close the connection", - quithelp[] = "exit telnet", - statushelp[] = "print status information", - helphelp[] = "print help information", - sendhelp[] = "transmit special characters ('send ?' for more)", - sethelp[] = "set operating parameters ('set ?' for more)", - unsethelp[] = "unset operating parameters ('unset ?' for more)", - togglestring[] ="toggle operating parameters ('toggle ?' for more)", - slchelp[] = "change state of special charaters ('slc ?' for more)", - displayhelp[] = "display operating parameters", -#if defined(AUTHENTICATION) - authhelp[] = "turn on (off) authentication ('auth ?' for more)", -#endif -#if defined(ENCRYPTION) - encrypthelp[] = "turn on (off) encryption ('encrypt ?' for more)", -#endif - zhelp[] = "suspend telnet", - shellhelp[] = "invoke a subshell", - envhelp[] = "change environment variables ('environ ?' for more)", - modestring[] = "try to enter line or character mode ('mode ?' for more)"; - -static int help(int argc, char **argv); - -static Command cmdtab[] = { - { "close", closehelp, bye, 1 }, - { "logout", logouthelp, logout, 1 }, - { "display", displayhelp, display, 0 }, - { "mode", modestring, modecmd, 0 }, - { "open", openhelp, tn, 0 }, - { "quit", quithelp, quit, 0 }, - { "send", sendhelp, sendcmd, 0 }, - { "set", sethelp, setcmd, 0 }, - { "unset", unsethelp, unsetcmd, 0 }, - { "status", statushelp, status, 0 }, - { "toggle", togglestring, toggle, 0 }, - { "slc", slchelp, slccmd, 0 }, -#if defined(AUTHENTICATION) - { "auth", authhelp, auth_cmd, 0 }, -#endif -#if defined(ENCRYPTION) - { "encrypt", encrypthelp, encrypt_cmd, 0 }, -#endif - { "z", zhelp, telnetsuspend, 0 }, - { "!", shellhelp, shell, 0 }, - { "environ", envhelp, env_cmd, 0 }, - { "?", helphelp, help, 0 }, - { 0, 0, 0, 0 } -}; - -static char crmodhelp[] = "deprecated command -- use 'toggle crmod' instead"; -static char escapehelp[] = "deprecated command -- use 'set escape' instead"; - -static Command cmdtab2[] = { - { "help", 0, help, 0 }, - { "escape", escapehelp, setescape, 0 }, - { "crmod", crmodhelp, togcrmod, 0 }, - { 0, 0, 0, 0 } -}; - - -/* - * Call routine with argc, argv set from args (terminated by 0). - */ - -static int -call(intrtn_t routine, ...) -{ - va_list ap; - char *args[100]; - int argno = 0; - - va_start(ap, routine); - while ((args[argno++] = va_arg(ap, char *)) != 0); - va_end(ap); - return (*routine)(argno-1, args); -} - - -static Command -*getcmd(char *name) -{ - Command *cm; - - if ((cm = (Command *) genget(name, (char **) cmdtab, sizeof(Command)))) - return cm; - return (Command *) genget(name, (char **) cmdtab2, sizeof(Command)); -} - -void -command(int top, char *tbuf, int cnt) -{ - Command *c; - - setcommandmode(); - if (!top) { - putchar('\n'); - } else { - signal(SIGINT, SIG_DFL); - signal(SIGQUIT, SIG_DFL); - } - for (;;) { - if (rlogin == _POSIX_VDISABLE) - printf("%s> ", prompt); - if (tbuf) { - char *cp; - cp = line; - while (cnt > 0 && (*cp++ = *tbuf++) != '\n') - cnt--; - tbuf = 0; - if (cp == line || *--cp != '\n' || cp == line) - goto getline; - *cp = '\0'; - if (rlogin == _POSIX_VDISABLE) - printf("%s\r\n", line); - } else { - getline: - if (rlogin != _POSIX_VDISABLE) - printf("%s> ", prompt); - if (fgets(line, sizeof(line), stdin) == NULL) { - if (feof(stdin) || ferror(stdin)) { - quit(); - /*NOTREACHED*/ - } - break; - } - } - if (line[0] == 0) - break; - makeargv(); - if (margv[0] == 0) { - break; - } - c = getcmd(margv[0]); - if (Ambiguous(c)) { - printf("?Ambiguous command\r\n"); - continue; - } - if (c == 0) { - printf("?Invalid command\r\n"); - continue; - } - if (c->needconnect && !connected) { - printf("?Need to be connected first.\r\n"); - continue; - } - if ((*c->handler)(margc, margv)) { - break; - } - } - if (!top) { - if (!connected) { - longjmp(toplevel, 1); - /*NOTREACHED*/ - } - setconnmode(0); - } -} - -/* - * Help command. - */ -static int -help(int argc, char **argv) -{ - Command *c; - - if (argc == 1) { - printf("Commands may be abbreviated. Commands are:\r\n\r\n"); - for (c = cmdtab; c->name; c++) - if (c->help) { - printf("%-*s\t%s\r\n", HELPINDENT, c->name, - c->help); - } - return 0; - } - while (--argc > 0) { - char *arg; - arg = *++argv; - c = getcmd(arg); - if (Ambiguous(c)) - printf("?Ambiguous help command %s\r\n", arg); - else if (c == (Command *)0) - printf("?Invalid help command %s\r\n", arg); - else - printf("%s\r\n", c->help); - } - return 0; -} - - -#if defined(IP_OPTIONS) && defined(IPPROTO_IP) - -/* - * Source route is handed in as - * [!]@hop1@hop2...@dst - * - * If the leading ! is present, it is a strict source route, otherwise it is - * assmed to be a loose source route. Note that leading ! is effective - * only for IPv4 case. - * - * We fill in the source route option as - * hop1,hop2,hop3...dest - * and return a pointer to hop1, which will - * be the address to connect() to. - * - * Arguments: - * ai: The address (by struct addrinfo) for the final destination. - * - * arg: Pointer to route list to decipher - * - * cpp: Pointer to a pointer, so that sourceroute() can return - * the address of result buffer (statically alloc'ed). - * - * protop/optp: - * Pointer to an integer. The pointed variable - * lenp: pointer to an integer that contains the - * length of *cpp if *cpp != NULL. - * - * Return values: - * - * Returns the length of the option pointed to by *cpp. If the - * return value is -1, there was a syntax error in the - * option, either arg contained unknown characters or too many hosts, - * or hostname cannot be resolved. - * - * The caller needs to pass return value (len), *cpp, *protop and *optp - * to setsockopt(2). - * - * *cpp: Points to the result buffer. The region is statically - * allocated by the function. - * - * *protop: - * protocol # to be passed to setsockopt(2). - * - * *optp: option # to be passed to setsockopt(2). - * - */ -int -sourceroute(struct addrinfo *ai, - char *arg, - char **cpp, - int *protop, - int *optp) -{ - char *cp, *cp2, *lsrp = NULL, *lsrep = NULL; - struct addrinfo hints, *res; - int len, error; - struct sockaddr_in *sin; - register char c; - static char lsr[44]; -#ifdef INET6 - struct cmsghdr *cmsg = NULL; - struct sockaddr_in6 *sin6; - static char rhbuf[1024]; -#endif - - /* - * Verify the arguments. - */ - if (cpp == NULL) - return -1; - - cp = arg; - - *cpp = NULL; - switch (ai->ai_family) { - case AF_INET: - lsrp = lsr; - lsrep = lsrp + sizeof(lsr); - - /* - * Next, decide whether we have a loose source - * route or a strict source route, and fill in - * the begining of the option. - */ - if (*cp == '!') { - cp++; - *lsrp++ = IPOPT_SSRR; - } else - *lsrp++ = IPOPT_LSRR; - if (*cp != '@') - return -1; - lsrp++; /* skip over length, we'll fill it in later */ - *lsrp++ = 4; - cp++; - *protop = IPPROTO_IP; - *optp = IP_OPTIONS; - break; -#ifdef INET6 - case AF_INET6: -/* this needs to be updated for rfc2292bis */ -#ifdef IPV6_PKTOPTIONS - cmsg = inet6_rthdr_init(rhbuf, IPV6_RTHDR_TYPE_0); - if (*cp != '@') - return -1; - cp++; - *protop = IPPROTO_IPV6; - *optp = IPV6_PKTOPTIONS; - break; -#else - return -1; -#endif -#endif - default: - return -1; - } - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = ai->ai_family; - hints.ai_socktype = SOCK_STREAM; - - for (c = 0;;) { - if (c == ':') - cp2 = 0; - else for (cp2 = cp; (c = *cp2) != '\0'; cp2++) { - if (c == ',') { - *cp2++ = '\0'; - if (*cp2 == '@') - cp2++; - } else if (c == '@') { - *cp2++ = '\0'; - } -#if 0 /*colon conflicts with IPv6 address*/ - else if (c == ':') { - *cp2++ = '\0'; - } -#endif - else - continue; - break; - } - if (!c) - cp2 = 0; - - error = getaddrinfo(cp, NULL, &hints, &res); - if (error) { - fprintf(stderr, "%s: %s\n", cp, gai_strerror(error)); - return -1; - } - if (ai->ai_family != res->ai_family) { - freeaddrinfo(res); - return -1; - } - if (ai->ai_family == AF_INET) { - /* - * Check to make sure there is space for address - */ - if (lsrp + 4 > lsrep) { - freeaddrinfo(res); - return -1; - } - sin = (struct sockaddr_in *)res->ai_addr; - memcpy(lsrp, &sin->sin_addr, sizeof(struct in_addr)); - lsrp += sizeof(struct in_addr); - } -#ifdef INET6 - else if (ai->ai_family == AF_INET6) { - sin6 = (struct sockaddr_in6 *)res->ai_addr; - inet6_rthdr_add(cmsg, &sin6->sin6_addr, - IPV6_RTHDR_LOOSE); - } -#endif - else { - freeaddrinfo(res); - return -1; - } - freeaddrinfo(res); - if (cp2) - cp = cp2; - else - break; - } - if (ai->ai_family == AF_INET) { - /* record the last hop */ - if (lsrp + 4 > lsrep) - return -1; - sin = (struct sockaddr_in *)ai->ai_addr; - memcpy(lsrp, &sin->sin_addr, sizeof(struct in_addr)); - lsrp += sizeof(struct in_addr); -#ifndef sysV88 - lsr[IPOPT_OLEN] = lsrp - lsr; - if (lsr[IPOPT_OLEN] <= 7 || lsr[IPOPT_OLEN] > 40) - return -1; - *lsrp++ = IPOPT_NOP; /*32bit word align*/ - len = lsrp - lsr; - *cpp = lsr; -#else - ipopt.io_len = lsrp - lsr; - if (ipopt.io_len <= 5) /*is 3 better?*/ - return -1; - *cpp = (char 8)&ipopt; -#endif - } -#ifdef INET6 - else if (ai->ai_family == AF_INET6) { - inet6_rthdr_lasthop(cmsg, IPV6_RTHDR_LOOSE); - len = cmsg->cmsg_len; - *cpp = rhbuf; - } -#endif - else - return -1; - return len; -} -#endif diff --git a/crypto/heimdal/appl/telnet/telnet/defines.h b/crypto/heimdal/appl/telnet/telnet/defines.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/defines.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)defines.h 8.1 (Berkeley) 6/6/93 - */ - -#define settimer(x) clocks.x = clocks.system++ - -#define NETADD(c) { *netoring.supply = c; ring_supplied(&netoring, 1); } -#define NET2ADD(c1,c2) { NETADD(c1); NETADD(c2); } -#define NETBYTES() (ring_full_count(&netoring)) -#define NETROOM() (ring_empty_count(&netoring)) - -#define TTYADD(c) if (!(SYNCHing||flushout)) { \ - *ttyoring.supply = c; \ - ring_supplied(&ttyoring, 1); \ - } -#define TTYBYTES() (ring_full_count(&ttyoring)) -#define TTYROOM() (ring_empty_count(&ttyoring)) - -/* Various modes */ -#define MODE_LOCAL_CHARS(m) ((m)&(MODE_EDIT|MODE_TRAPSIG)) -#define MODE_LOCAL_ECHO(m) ((m)&MODE_ECHO) -#define MODE_COMMAND_LINE(m) ((m)==-1) - -#define CONTROL(x) ((x)&0x1f) /* CTRL(x) is not portable */ - - -/* XXX extra mode bits, these should be synced with */ - -#define MODE_OUT8 0x8000 /* binary mode sans -opost */ diff --git a/crypto/heimdal/appl/telnet/telnet/externs.h b/crypto/heimdal/appl/telnet/telnet/externs.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/externs.h +++ /dev/null @@ -1,443 +0,0 @@ -/* - * Copyright (c) 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)externs.h 8.3 (Berkeley) 5/30/95 - */ - -/* $Id$ */ - -#ifndef BSD -# define BSD 43 -#endif - -#ifndef _POSIX_VDISABLE -# ifdef sun -# include /* pick up VDISABLE definition, mayby */ -# endif -# ifdef VDISABLE -# define _POSIX_VDISABLE VDISABLE -# else -# define _POSIX_VDISABLE ((cc_t)'\377') -# endif -#endif - -#define SUBBUFSIZE 256 - -extern int - autologin, /* Autologin enabled */ - skiprc, /* Don't process the ~/.telnetrc file */ - eight, /* use eight bit mode (binary in and/or out */ - binary, - flushout, /* flush output */ - connected, /* Are we connected to the other side? */ - globalmode, /* Mode tty should be in */ - telnetport, /* Are we connected to the telnet port? */ - localflow, /* Flow control handled locally */ - restartany, /* If flow control, restart output on any character */ - localchars, /* we recognize interrupt/quit */ - donelclchars, /* the user has set "localchars" */ - showoptions, - wantencryption, /* User has requested encryption */ - net, /* Network file descriptor */ - tin, /* Terminal input file descriptor */ - tout, /* Terminal output file descriptor */ - crlf, /* Should '\r' be mapped to (or )? */ - autoflush, /* flush output when interrupting? */ - autosynch, /* send interrupt characters with SYNCH? */ - SYNCHing, /* Is the stream in telnet SYNCH mode? */ - donebinarytoggle, /* the user has put us in binary */ - dontlecho, /* do we suppress local echoing right now? */ - crmod, - netdata, /* Print out network data flow */ - prettydump, /* Print "netdata" output in user readable format */ - termdata, /* Print out terminal data flow */ - debug; /* Debug level */ - -extern int intr_happened, intr_waiting; /* for interrupt handling */ - -extern cc_t escape; /* Escape to command mode */ -extern cc_t rlogin; /* Rlogin mode escape character */ -#ifdef KLUDGELINEMODE -extern cc_t echoc; /* Toggle local echoing */ -#endif - -extern char - *prompt; /* Prompt for command. */ - -extern char - doopt[], - dont[], - will[], - wont[], - do_dont_resp[], - will_wont_resp[], - options[], /* All the little options */ - *hostname; /* Who are we connected to? */ -#if defined(ENCRYPTION) -extern void (*encrypt_output) (unsigned char *, int); -extern int (*decrypt_input) (int); -#endif - -/* - * We keep track of each side of the option negotiation. - */ - -#define MY_STATE_WILL 0x01 -#define MY_WANT_STATE_WILL 0x02 -#define MY_STATE_DO 0x04 -#define MY_WANT_STATE_DO 0x08 - -/* - * Macros to check the current state of things - */ - -#define my_state_is_do(opt) (options[opt]&MY_STATE_DO) -#define my_state_is_will(opt) (options[opt]&MY_STATE_WILL) -#define my_want_state_is_do(opt) (options[opt]&MY_WANT_STATE_DO) -#define my_want_state_is_will(opt) (options[opt]&MY_WANT_STATE_WILL) - -#define my_state_is_dont(opt) (!my_state_is_do(opt)) -#define my_state_is_wont(opt) (!my_state_is_will(opt)) -#define my_want_state_is_dont(opt) (!my_want_state_is_do(opt)) -#define my_want_state_is_wont(opt) (!my_want_state_is_will(opt)) - -#define set_my_state_do(opt) {options[opt] |= MY_STATE_DO;} -#define set_my_state_will(opt) {options[opt] |= MY_STATE_WILL;} -#define set_my_want_state_do(opt) {options[opt] |= MY_WANT_STATE_DO;} -#define set_my_want_state_will(opt) {options[opt] |= MY_WANT_STATE_WILL;} - -#define set_my_state_dont(opt) {options[opt] &= ~MY_STATE_DO;} -#define set_my_state_wont(opt) {options[opt] &= ~MY_STATE_WILL;} -#define set_my_want_state_dont(opt) {options[opt] &= ~MY_WANT_STATE_DO;} -#define set_my_want_state_wont(opt) {options[opt] &= ~MY_WANT_STATE_WILL;} - -/* - * Make everything symmetrical - */ - -#define HIS_STATE_WILL MY_STATE_DO -#define HIS_WANT_STATE_WILL MY_WANT_STATE_DO -#define HIS_STATE_DO MY_STATE_WILL -#define HIS_WANT_STATE_DO MY_WANT_STATE_WILL - -#define his_state_is_do my_state_is_will -#define his_state_is_will my_state_is_do -#define his_want_state_is_do my_want_state_is_will -#define his_want_state_is_will my_want_state_is_do - -#define his_state_is_dont my_state_is_wont -#define his_state_is_wont my_state_is_dont -#define his_want_state_is_dont my_want_state_is_wont -#define his_want_state_is_wont my_want_state_is_dont - -#define set_his_state_do set_my_state_will -#define set_his_state_will set_my_state_do -#define set_his_want_state_do set_my_want_state_will -#define set_his_want_state_will set_my_want_state_do - -#define set_his_state_dont set_my_state_wont -#define set_his_state_wont set_my_state_dont -#define set_his_want_state_dont set_my_want_state_wont -#define set_his_want_state_wont set_my_want_state_dont - - -extern FILE - *NetTrace; /* Where debugging output goes */ -extern char - NetTraceFile[]; /* Name of file where debugging output goes */ -extern void - SetNetTrace (char *); /* Function to change where debugging goes */ - -extern jmp_buf - peerdied, - toplevel; /* For error conditions. */ - -int Scheduler(int); -extern int scheduler_lockout_tty; - - -/* authenc.c */ - -#if defined(AUTHENTICATION) || defined(ENCRYPTION) -int telnet_net_write(unsigned char *str, int len); -void net_encrypt(void); -int telnet_spin(void); -char *telnet_getenv(const char *val); -char *telnet_gets(char *prompt, char *result, int length, int echo); -#endif - -/* commands.c */ - -struct env_lst *env_define (unsigned char *, unsigned char *); -struct env_lst *env_find(unsigned char *var); -void env_init (void); -void env_undefine (unsigned char *); -void env_export (unsigned char *); -void env_unexport (unsigned char *); -void env_send (unsigned char *); -void env_list (void); -unsigned char * env_default(int init, int welldefined); -unsigned char * env_getvalue(unsigned char *var); - -void set_escape_char(char *s); -int sourceroute(struct addrinfo *ai, char *arg, char **cpp, - int *prototp, int *optp); - -#if defined(AUTHENTICATION) -int auth_enable (char *); -int auth_disable (char *); -int auth_status (void); -#endif - -#if defined(ENCRYPTION) -int EncryptEnable (char *, char *); -int EncryptDisable (char *, char *); -int EncryptType (char *, char *); -int EncryptStart (char *); -int EncryptStartInput (void); -int EncryptStartOutput (void); -int EncryptStop (char *); -int EncryptStopInput (void); -int EncryptStopOutput (void); -int EncryptStatus (void); -#endif - -#ifdef SIGINFO -RETSIGTYPE ayt_status(int); -#endif -int tn(int argc, char **argv); -void command(int top, char *tbuf, int cnt); - -/* main.c */ - -void tninit(void); -void set_forward_options(void); - -/* network.c */ - -void init_network(void); -int stilloob(void); -void setneturg(void); -int netflush(void); - -/* sys_bsd.c */ - -void init_sys(void); -int TerminalWrite(char *buf, int n); -int TerminalRead(unsigned char *buf, int n); -int TerminalAutoFlush(void); -int TerminalSpecialChars(int c); -void TerminalFlushOutput(void); -void TerminalSaveState(void); -void TerminalDefaultChars(void); -void TerminalNewMode(int f); -cc_t *tcval(int func); -void TerminalSpeeds(long *input_speed, long *output_speed); -int TerminalWindowSize(long *rows, long *cols); -int NetClose(int fd); -void NetNonblockingIO(int fd, int onoff); -int process_rings(int netin, int netout, int netex, int ttyin, int ttyout, - int poll); - -/* telnet.c */ - -void init_telnet(void); - -void tel_leave_binary(int rw); -void tel_enter_binary(int rw); -int opt_welldefined(char *ep); -int telrcv(void); -int rlogin_susp(void); -void intp(void); -void sendbrk(void); -void sendabort(void); -void sendsusp(void); -void sendeof(void); -void sendayt(void); - -void xmitAO(void); -void xmitEL(void); -void xmitEC(void); - - -void Dump (char, unsigned char *, int); -void printoption (char *, int, int); -void sendnaws (void); -void setconnmode (int); -void setcommandmode (void); -void setneturg (void); -void sys_telnet_init (void); -void my_telnet (char *); -void tel_enter_binary (int); -void TerminalFlushOutput (void); -void TerminalNewMode (int); -void TerminalRestoreState (void); -void TerminalSaveState (void); -void willoption (int); -void wontoption (int); - - -void send_do (int, int); -void send_dont (int, int); -void send_will (int, int); -void send_wont (int, int); - -void lm_will (unsigned char *, int); -void lm_wont (unsigned char *, int); -void lm_do (unsigned char *, int); -void lm_dont (unsigned char *, int); -void lm_mode (unsigned char *, int, int); - -void slc_init (void); -void slcstate (void); -void slc_mode_export (void); -void slc_mode_import (int); -void slc_import (int); -void slc_export (void); -void slc (unsigned char *, int); -void slc_check (void); -void slc_start_reply (void); -void slc_add_reply (unsigned char, unsigned char, cc_t); -void slc_end_reply (void); -int slc_update (void); - -void env_opt (unsigned char *, int); -void env_opt_start (void); -void env_opt_start_info (void); -void env_opt_add (unsigned char *); -void env_opt_end (int); - -unsigned char *env_default (int, int); -unsigned char *env_getvalue (unsigned char *); - -int get_status (void); -int dosynch (void); - -cc_t *tcval (int); - -int quit (void); - -/* terminal.c */ - -void init_terminal(void); -int ttyflush(int drop); -int getconnmode(void); - -/* utilities.c */ - -int SetSockOpt(int fd, int level, int option, int yesno); -void SetNetTrace(char *file); -void Dump(char direction, unsigned char *buffer, int length); -void printoption(char *direction, int cmd, int option); -void optionstatus(void); -void printsub(int direction, unsigned char *pointer, size_t length); -void EmptyTerminal(void); -void SetForExit(void); -void Exit(int returnCode); -void ExitString(char *string, int returnCode); - -extern struct termios new_tc; - -# define termEofChar new_tc.c_cc[VEOF] -# define termEraseChar new_tc.c_cc[VERASE] -# define termIntChar new_tc.c_cc[VINTR] -# define termKillChar new_tc.c_cc[VKILL] -# define termQuitChar new_tc.c_cc[VQUIT] - -# ifndef VSUSP -extern cc_t termSuspChar; -# else -# define termSuspChar new_tc.c_cc[VSUSP] -# endif -# if defined(VFLUSHO) && !defined(VDISCARD) -# define VDISCARD VFLUSHO -# endif -# ifndef VDISCARD -extern cc_t termFlushChar; -# else -# define termFlushChar new_tc.c_cc[VDISCARD] -# endif -# ifndef VWERASE -extern cc_t termWerasChar; -# else -# define termWerasChar new_tc.c_cc[VWERASE] -# endif -# ifndef VREPRINT -extern cc_t termRprntChar; -# else -# define termRprntChar new_tc.c_cc[VREPRINT] -# endif -# ifndef VLNEXT -extern cc_t termLiteralNextChar; -# else -# define termLiteralNextChar new_tc.c_cc[VLNEXT] -# endif -# ifndef VSTART -extern cc_t termStartChar; -# else -# define termStartChar new_tc.c_cc[VSTART] -# endif -# ifndef VSTOP -extern cc_t termStopChar; -# else -# define termStopChar new_tc.c_cc[VSTOP] -# endif -# ifndef VEOL -extern cc_t termForw1Char; -# else -# define termForw1Char new_tc.c_cc[VEOL] -# endif -# ifndef VEOL2 -extern cc_t termForw2Char; -# else -# define termForw2Char new_tc.c_cc[VEOL] -# endif -# ifndef VSTATUS -extern cc_t termAytChar; -#else -# define termAytChar new_tc.c_cc[VSTATUS] -#endif - -/* Ring buffer structures which are shared */ - -extern Ring - netoring, - netiring, - ttyoring, - ttyiring; - -extern int resettermname; -extern int linemode; -#ifdef KLUDGELINEMODE -extern int kludgelinemode; -#endif -extern int want_status_response; diff --git a/crypto/heimdal/appl/telnet/telnet/main.c b/crypto/heimdal/appl/telnet/telnet/main.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/main.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (c) 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -static char *copyright[] = { - "@(#) Copyright (c) 1988, 1990, 1993\n" - "\tThe Regents of the University of California. All rights reserved.\n", - (char*)copyright -}; - -#include "telnet_locl.h" -RCSID("$Id$"); - -#if KRB5 -#define FORWARD -#endif - -/* - * Initialize variables. - */ -void -tninit(void) -{ - init_terminal(); - - init_network(); - - init_telnet(); - - init_sys(); -} - -static void -usage(int exit_code) -{ - fprintf(stderr, "Usage: %s %s%s%s%s\n", prompt, -#ifdef AUTHENTICATION - "[-8] [-E] [-K] [-L] [-G] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]", - "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] ", -#else - "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", - "\n\t[-n tracefile]", -#endif - "[-r] ", -#ifdef ENCRYPTION - "[-x] [host-name [port]]" -#else - "[host-name [port]]" -#endif - ); - exit(exit_code); -} - -/* - * main. Parse arguments, invoke the protocol or command parser. - */ - - -#ifdef FORWARD -int forward_option = 0; /* forward flags set from command line */ -#endif /* FORWARD */ -void -set_forward_options(void) -{ -#ifdef FORWARD - switch(forward_option) { - case 'f': - kerberos5_set_forward(1); - kerberos5_set_forwardable(0); - break; - case 'F': - kerberos5_set_forward(1); - kerberos5_set_forwardable(1); - break; - case 'G': - kerberos5_set_forward(0); - kerberos5_set_forwardable(0); - break; - default: - break; - } -#endif -} - -#ifdef KRB5 -#define Authenticator asn1_Authenticator -#include -static void -krb5_init(void) -{ - krb5_context context; - krb5_error_code ret; - krb5_boolean ret_val; - - ret = krb5_init_context(&context); - if (ret) - return; - -#if defined(AUTHENTICATION) && defined(FORWARD) - krb5_appdefault_boolean(context, NULL, - NULL, "forward", - 0, &ret_val); - if (ret_val) - kerberos5_set_forward(1); - krb5_appdefault_boolean(context, NULL, - NULL, "forwardable", - 0, &ret_val); - if (ret_val) - kerberos5_set_forwardable(1); -#endif -#ifdef ENCRYPTION - krb5_appdefault_boolean(context, NULL, - NULL, "encrypt", - 0, &ret_val); - if (ret_val) { - encrypt_auto(1); - decrypt_auto(1); - wantencryption = 1; - EncryptVerbose(1); - } -#endif - - krb5_free_context(context); -} -#endif - -int -main(int argc, char **argv) -{ - int ch; - char *user; - - setprogname(argv[0]); - -#ifdef KRB5 - krb5_init(); -#endif - - tninit(); /* Clear out things */ - - TerminalSaveState(); - - if ((prompt = strrchr(argv[0], '/'))) - ++prompt; - else - prompt = argv[0]; - - user = NULL; - - rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; - - /* - * if AUTHENTICATION and ENCRYPTION is set autologin will be - * se to true after the getopt switch; unless the -K option is - * passed - */ - autologin = -1; - - if (argc == 2 && strcmp(argv[1], "--version") == 0) { - print_version(NULL); - exit(0); - } - if (argc == 2 && strcmp(argv[1], "--help") == 0) - usage(0); - - - while((ch = getopt(argc, argv, - "78DEKLS:X:abcde:fFk:l:n:rxG")) != -1) { - switch(ch) { - case '8': - eight = 3; /* binary output and input */ - break; - case '7': - eight = 0; - break; - case 'b': - binary = 3; - break; - case 'D': { - /* sometimes we don't want a mangled display */ - char *p; - if((p = getenv("DISPLAY"))) - env_define((unsigned char*)"DISPLAY", (unsigned char*)p); - break; - } - case 'E': - rlogin = escape = _POSIX_VDISABLE; - break; - case 'K': -#ifdef AUTHENTICATION - autologin = 0; -#endif - break; - case 'L': - eight |= 2; /* binary output only */ - break; - case 'S': - { -#ifdef HAVE_PARSETOS - extern int tos; - - if ((tos = parsetos(optarg, "tcp")) < 0) - fprintf(stderr, "%s%s%s%s\n", - prompt, ": Bad TOS argument '", - optarg, - "; will try to use default TOS"); -#else - fprintf(stderr, - "%s: Warning: -S ignored, no parsetos() support.\n", - prompt); -#endif - } - break; - case 'X': -#ifdef AUTHENTICATION - auth_disable_name(optarg); -#endif - break; - case 'a': - autologin = 1; - break; - case 'c': - skiprc = 1; - break; - case 'd': - debug = 1; - break; - case 'e': - set_escape_char(optarg); - break; - case 'f': - case 'F': - case 'G': -#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) - if (forward_option) { - fprintf(stderr, - "%s: Only one of -f, -F and -G allowed.\n", - prompt); - usage(1); - } - forward_option = ch; -#else - fprintf(stderr, - "%s: Warning: -%c ignored, no Kerberos V5 support.\n", - prompt, ch); -#endif - break; - case 'k': - fprintf(stderr, - "%s: Warning: -k ignored, no Kerberos V4 support.\n", - prompt); - break; - case 'l': - if(autologin == 0){ - fprintf(stderr, "%s: Warning: -K ignored\n", prompt); - autologin = -1; - } - user = optarg; - break; - case 'n': - SetNetTrace(optarg); - break; - case 'r': - rlogin = '~'; - break; - case 'x': -#ifdef ENCRYPTION - encrypt_auto(1); - decrypt_auto(1); - wantencryption = 1; - EncryptVerbose(1); -#else - fprintf(stderr, - "%s: Warning: -x ignored, no ENCRYPT support.\n", - prompt); -#endif - break; - - case '?': - default: - usage(1); - /* NOTREACHED */ - } - } - - if (autologin == -1) { /* esc@magic.fi; force */ -#if defined(AUTHENTICATION) - autologin = 1; -#endif -#if defined(ENCRYPTION) - encrypt_auto(1); - decrypt_auto(1); - wantencryption = -1; -#endif - } - - if (autologin == -1) - autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; - - argc -= optind; - argv += optind; - - if (argc) { - char *args[7], **argp = args; - - if (argc > 2) - usage(1); - *argp++ = prompt; - if (user) { - *argp++ = "-l"; - *argp++ = user; - } - *argp++ = argv[0]; /* host */ - if (argc > 1) - *argp++ = argv[1]; /* port */ - *argp = 0; - - if (setjmp(toplevel) != 0) - Exit(0); - if (tn(argp - args, args) == 1) - return (0); - else - return (1); - } - setjmp(toplevel); - for (;;) { - command(1, 0, 0); - } -} diff --git a/crypto/heimdal/appl/telnet/telnet/network.c b/crypto/heimdal/appl/telnet/telnet/network.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/network.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnet_locl.h" - -RCSID("$Id$"); - -Ring netoring, netiring; -size_t netobufsize = 64*1024; -size_t netibufsize = 64*1024; - -/* - * Initialize internal network data structures. - */ - -void -init_network(void) -{ - void *obuf, *ibuf; - - if ((obuf = malloc(netobufsize)) == NULL) - exit(1); - if ((ibuf = malloc(netibufsize)) == NULL) - exit(1); - - if (ring_init(&netoring, obuf, netobufsize) != 1) { - exit(1); - } - if (ring_init(&netiring, ibuf, netibufsize) != 1) { - exit(1); - } - NetTrace = stdout; -} - - -/* - * Check to see if any out-of-band data exists on a socket (for - * Telnet "synch" processing). - */ - -int -stilloob(void) -{ - static struct timeval timeout = { 0 }; - fd_set excepts; - int value; - - do { - FD_ZERO(&excepts); - if (net >= FD_SETSIZE) - errx (1, "fd too large"); - FD_SET(net, &excepts); - value = select(net+1, 0, 0, &excepts, &timeout); - } while ((value == -1) && (errno == EINTR)); - - if (value < 0) { - perror("select"); - quit(); - /* NOTREACHED */ - } - if (FD_ISSET(net, &excepts)) { - return 1; - } else { - return 0; - } -} - - -/* - * setneturg() - * - * Sets "neturg" to the current location. - */ - -void -setneturg(void) -{ - ring_mark(&netoring); -} - - -/* - * netflush - * Send as much data as possible to the network, - * handling requests for urgent data. - * - * The return value indicates whether we did any - * useful work. - */ - - -int -netflush(void) -{ - int n, n1; - -#if defined(ENCRYPTION) - if (encrypt_output) - ring_encrypt(&netoring, encrypt_output); -#endif - if ((n1 = n = ring_full_consecutive(&netoring)) > 0) { - if (!ring_at_mark(&netoring)) { - n = send(net, (char *)netoring.consume, n, 0); /* normal write */ - } else { - /* - * In 4.2 (and 4.3) systems, there is some question about - * what byte in a sendOOB operation is the "OOB" data. - * To make ourselves compatible, we only send ONE byte - * out of band, the one WE THINK should be OOB (though - * we really have more the TCP philosophy of urgent data - * rather than the Unix philosophy of OOB data). - */ - n = send(net, (char *)netoring.consume, 1, MSG_OOB);/* URGENT data */ - } - } - if (n < 0) { - if (errno != ENOBUFS && errno != EWOULDBLOCK) { - setcommandmode(); - perror(hostname); - NetClose(net); - ring_clear_mark(&netoring); - longjmp(peerdied, -1); - /*NOTREACHED*/ - } - n = 0; - } - if (netdata && n) { - Dump('>', netoring.consume, n); - } - if (n) { - ring_consumed(&netoring, n); - /* - * If we sent all, and more to send, then recurse to pick - * up the other half. - */ - if ((n1 == n) && ring_full_consecutive(&netoring)) { - netflush(); - } - return 1; - } else { - return 0; - } -} diff --git a/crypto/heimdal/appl/telnet/telnet/ring.h b/crypto/heimdal/appl/telnet/telnet/ring.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/ring.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ring.h 8.1 (Berkeley) 6/6/93 - */ - -/* $Id$ */ - -/* - * This defines a structure for a ring buffer. - * - * The circular buffer has two parts: - *((( - * full: [consume, supply) - * empty: [supply, consume) - *]]] - * - */ -typedef struct { - unsigned char *consume, /* where data comes out of */ - *supply, /* where data comes in to */ - *bottom, /* lowest address in buffer */ - *top, /* highest address+1 in buffer */ - *mark; /* marker (user defined) */ -#if defined(ENCRYPTION) - unsigned char *clearto; /* Data to this point is clear text */ - unsigned char *encryyptedto; /* Data is encrypted to here */ -#endif - int size; /* size in bytes of buffer */ - u_long consumetime, /* help us keep straight full, empty, etc. */ - supplytime; -} Ring; - -/* Here are some functions and macros to deal with the ring buffer */ - -/* Initialization routine */ -extern int - ring_init (Ring *ring, unsigned char *buffer, int count); - -/* Data movement routines */ -extern void - ring_supply_data (Ring *ring, unsigned char *buffer, int count); -#ifdef notdef -extern void - ring_consume_data (Ring *ring, unsigned char *buffer, int count); -#endif - -/* Buffer state transition routines */ -extern void - ring_supplied (Ring *ring, int count), - ring_consumed (Ring *ring, int count); - -/* Buffer state query routines */ -extern int - ring_empty_count (Ring *ring), - ring_empty_consecutive (Ring *ring), - ring_full_count (Ring *ring), - ring_full_consecutive (Ring *ring); - -#if defined(ENCRYPTION) -extern void - ring_encrypt (Ring *ring, void (*func)(unsigned char *, int)), - ring_clearto (Ring *ring); -#endif - -extern int ring_at_mark(Ring *ring); - -extern void - ring_clear_mark(Ring *ring), - ring_mark(Ring *ring); diff --git a/crypto/heimdal/appl/telnet/telnet/ring.c b/crypto/heimdal/appl/telnet/telnet/ring.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/ring.c +++ /dev/null @@ -1,321 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnet_locl.h" - -RCSID("$Id$"); - -/* - * This defines a structure for a ring buffer. - * - * The circular buffer has two parts: - *((( - * full: [consume, supply) - * empty: [supply, consume) - *]]] - * - */ - -/* Internal macros */ - -#define ring_subtract(d,a,b) (((a)-(b) >= 0)? \ - (a)-(b): (((a)-(b))+(d)->size)) - -#define ring_increment(d,a,c) (((a)+(c) < (d)->top)? \ - (a)+(c) : (((a)+(c))-(d)->size)) - -#define ring_decrement(d,a,c) (((a)-(c) >= (d)->bottom)? \ - (a)-(c) : (((a)-(c))-(d)->size)) - - -/* - * The following is a clock, used to determine full, empty, etc. - * - * There is some trickiness here. Since the ring buffers are initialized - * to ZERO on allocation, we need to make sure, when interpreting the - * clock, that when the times are EQUAL, then the buffer is FULL. - */ -static u_long ring_clock = 0; - - -#define ring_empty(d) (((d)->consume == (d)->supply) && \ - ((d)->consumetime >= (d)->supplytime)) -#define ring_full(d) (((d)->supply == (d)->consume) && \ - ((d)->supplytime > (d)->consumetime)) - - - - - -/* Buffer state transition routines */ - -int -ring_init(Ring *ring, unsigned char *buffer, int count) -{ - memset(ring, 0, sizeof *ring); - - ring->size = count; - - ring->supply = ring->consume = ring->bottom = buffer; - - ring->top = ring->bottom+ring->size; - -#if defined(ENCRYPTION) - ring->clearto = 0; -#endif - - return 1; -} - -/* Mark routines */ - -/* - * Mark the most recently supplied byte. - */ - -void -ring_mark(Ring *ring) -{ - ring->mark = ring_decrement(ring, ring->supply, 1); -} - -/* - * Is the ring pointing to the mark? - */ - -int -ring_at_mark(Ring *ring) -{ - if (ring->mark == ring->consume) { - return 1; - } else { - return 0; - } -} - -/* - * Clear any mark set on the ring. - */ - -void -ring_clear_mark(Ring *ring) -{ - ring->mark = 0; -} - -/* - * Add characters from current segment to ring buffer. - */ -void -ring_supplied(Ring *ring, int count) -{ - ring->supply = ring_increment(ring, ring->supply, count); - ring->supplytime = ++ring_clock; -} - -/* - * We have just consumed "c" bytes. - */ -void -ring_consumed(Ring *ring, int count) -{ - if (count == 0) /* don't update anything */ - return; - - if (ring->mark && - (ring_subtract(ring, ring->mark, ring->consume) < count)) { - ring->mark = 0; - } -#if defined(ENCRYPTION) - if (ring->consume < ring->clearto && - ring->clearto <= ring->consume + count) - ring->clearto = 0; - else if (ring->consume + count > ring->top && - ring->bottom <= ring->clearto && - ring->bottom + ((ring->consume + count) - ring->top)) - ring->clearto = 0; -#endif - ring->consume = ring_increment(ring, ring->consume, count); - ring->consumetime = ++ring_clock; - /* - * Try to encourage "ring_empty_consecutive()" to be large. - */ - if (ring_empty(ring)) { - ring->consume = ring->supply = ring->bottom; - } -} - - - -/* Buffer state query routines */ - - -/* Number of bytes that may be supplied */ -int -ring_empty_count(Ring *ring) -{ - if (ring_empty(ring)) { /* if empty */ - return ring->size; - } else { - return ring_subtract(ring, ring->consume, ring->supply); - } -} - -/* number of CONSECUTIVE bytes that may be supplied */ -int -ring_empty_consecutive(Ring *ring) -{ - if ((ring->consume < ring->supply) || ring_empty(ring)) { - /* - * if consume is "below" supply, or empty, then - * return distance to the top - */ - return ring_subtract(ring, ring->top, ring->supply); - } else { - /* - * else, return what we may. - */ - return ring_subtract(ring, ring->consume, ring->supply); - } -} - -/* Return the number of bytes that are available for consuming - * (but don't give more than enough to get to cross over set mark) - */ - -int -ring_full_count(Ring *ring) -{ - if ((ring->mark == 0) || (ring->mark == ring->consume)) { - if (ring_full(ring)) { - return ring->size; /* nothing consumed, but full */ - } else { - return ring_subtract(ring, ring->supply, ring->consume); - } - } else { - return ring_subtract(ring, ring->mark, ring->consume); - } -} - -/* - * Return the number of CONSECUTIVE bytes available for consuming. - * However, don't return more than enough to cross over set mark. - */ -int -ring_full_consecutive(Ring *ring) -{ - if ((ring->mark == 0) || (ring->mark == ring->consume)) { - if ((ring->supply < ring->consume) || ring_full(ring)) { - return ring_subtract(ring, ring->top, ring->consume); - } else { - return ring_subtract(ring, ring->supply, ring->consume); - } - } else { - if (ring->mark < ring->consume) { - return ring_subtract(ring, ring->top, ring->consume); - } else { /* Else, distance to mark */ - return ring_subtract(ring, ring->mark, ring->consume); - } - } -} - -/* - * Move data into the "supply" portion of of the ring buffer. - */ -void -ring_supply_data(Ring *ring, unsigned char *buffer, int count) -{ - int i; - - while (count) { - i = min(count, ring_empty_consecutive(ring)); - memmove(ring->supply, buffer, i); - ring_supplied(ring, i); - count -= i; - buffer += i; - } -} - -#ifdef notdef - -/* - * Move data from the "consume" portion of the ring buffer - */ -void -ring_consume_data(Ring *ring, unsigned char *buffer, int count) -{ - int i; - - while (count) { - i = min(count, ring_full_consecutive(ring)); - memmove(buffer, ring->consume, i); - ring_consumed(ring, i); - count -= i; - buffer += i; - } -} -#endif - -#if defined(ENCRYPTION) -void -ring_encrypt(Ring *ring, void (*encryptor)(unsigned char *, int)) -{ - unsigned char *s, *c; - - if (ring_empty(ring) || ring->clearto == ring->supply) - return; - - if (!(c = ring->clearto)) - c = ring->consume; - - s = ring->supply; - - if (s <= c) { - (*encryptor)(c, ring->top - c); - (*encryptor)(ring->bottom, s - ring->bottom); - } else - (*encryptor)(c, s - c); - - ring->clearto = ring->supply; -} - -void -ring_clearto(Ring *ring) -{ - if (!ring_empty(ring)) - ring->clearto = ring->supply; - else - ring->clearto = 0; -} -#endif - diff --git a/crypto/heimdal/appl/telnet/telnet/sys_bsd.c b/crypto/heimdal/appl/telnet/telnet/sys_bsd.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/sys_bsd.c +++ /dev/null @@ -1,979 +0,0 @@ -/* - * Copyright (c) 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnet_locl.h" - -RCSID("$Id$"); - -/* - * The following routines try to encapsulate what is system dependent - * (at least between 4.x and dos) which is used in telnet.c. - */ - -int - tout, /* Output file descriptor */ - tin, /* Input file descriptor */ - net; - -struct termios old_tc = { 0 }; -extern struct termios new_tc; - -# ifndef TCSANOW -# ifdef TCSETS -# define TCSANOW TCSETS -# define TCSADRAIN TCSETSW -# define tcgetattr(f, t) ioctl(f, TCGETS, (char *)t) -# else -# ifdef TCSETA -# define TCSANOW TCSETA -# define TCSADRAIN TCSETAW -# define tcgetattr(f, t) ioctl(f, TCGETA, (char *)t) -# else -# define TCSANOW TIOCSETA -# define TCSADRAIN TIOCSETAW -# define tcgetattr(f, t) ioctl(f, TIOCGETA, (char *)t) -# endif -# endif -# define tcsetattr(f, a, t) ioctl(f, a, (char *)t) -# define cfgetospeed(ptr) ((ptr)->c_cflag&CBAUD) -# ifdef CIBAUD -# define cfgetispeed(ptr) (((ptr)->c_cflag&CIBAUD) >> IBSHIFT) -# else -# define cfgetispeed(ptr) cfgetospeed(ptr) -# endif -# endif /* TCSANOW */ - -static fd_set ibits, obits, xbits; - - -void -init_sys(void) -{ - tout = fileno(stdout); - tin = fileno(stdin); - FD_ZERO(&ibits); - FD_ZERO(&obits); - FD_ZERO(&xbits); - - errno = 0; -} - - -int -TerminalWrite(char *buf, int n) -{ - return write(tout, buf, n); -} - -int -TerminalRead(unsigned char *buf, int n) -{ - return read(tin, buf, n); -} - -/* - * - */ - -int -TerminalAutoFlush(void) -{ -#if defined(LNOFLSH) - int flush; - - ioctl(0, TIOCLGET, (char *)&flush); - return !(flush&LNOFLSH); /* if LNOFLSH, no autoflush */ -#else /* LNOFLSH */ - return 1; -#endif /* LNOFLSH */ -} - -/* - * TerminalSpecialChars() - * - * Look at an input character to see if it is a special character - * and decide what to do. - * - * Output: - * - * 0 Don't add this character. - * 1 Do add this character - */ - -int -TerminalSpecialChars(int c) -{ - if (c == termIntChar) { - intp(); - return 0; - } else if (c == termQuitChar) { -#ifdef KLUDGELINEMODE - if (kludgelinemode) - sendbrk(); - else -#endif - sendabort(); - return 0; - } else if (c == termEofChar) { - if (my_want_state_is_will(TELOPT_LINEMODE)) { - sendeof(); - return 0; - } - return 1; - } else if (c == termSuspChar) { - sendsusp(); - return(0); - } else if (c == termFlushChar) { - xmitAO(); /* Transmit Abort Output */ - return 0; - } else if (!MODE_LOCAL_CHARS(globalmode)) { - if (c == termKillChar) { - xmitEL(); - return 0; - } else if (c == termEraseChar) { - xmitEC(); /* Transmit Erase Character */ - return 0; - } - } - return 1; -} - - -/* - * Flush output to the terminal - */ - -void -TerminalFlushOutput(void) -{ -#ifdef TIOCFLUSH - ioctl(fileno(stdout), TIOCFLUSH, (char *) 0); -#else - ioctl(fileno(stdout), TCFLSH, (char *) 0); -#endif -} - -void -TerminalSaveState(void) -{ - tcgetattr(0, &old_tc); - - new_tc = old_tc; - -#ifndef VDISCARD - termFlushChar = CONTROL('O'); -#endif -#ifndef VWERASE - termWerasChar = CONTROL('W'); -#endif -#ifndef VREPRINT - termRprntChar = CONTROL('R'); -#endif -#ifndef VLNEXT - termLiteralNextChar = CONTROL('V'); -#endif -#ifndef VSTART - termStartChar = CONTROL('Q'); -#endif -#ifndef VSTOP - termStopChar = CONTROL('S'); -#endif -#ifndef VSTATUS - termAytChar = CONTROL('T'); -#endif -} - -cc_t* -tcval(int func) -{ - switch(func) { - case SLC_IP: return(&termIntChar); - case SLC_ABORT: return(&termQuitChar); - case SLC_EOF: return(&termEofChar); - case SLC_EC: return(&termEraseChar); - case SLC_EL: return(&termKillChar); - case SLC_XON: return(&termStartChar); - case SLC_XOFF: return(&termStopChar); - case SLC_FORW1: return(&termForw1Char); - case SLC_FORW2: return(&termForw2Char); -# ifdef VDISCARD - case SLC_AO: return(&termFlushChar); -# endif -# ifdef VSUSP - case SLC_SUSP: return(&termSuspChar); -# endif -# ifdef VWERASE - case SLC_EW: return(&termWerasChar); -# endif -# ifdef VREPRINT - case SLC_RP: return(&termRprntChar); -# endif -# ifdef VLNEXT - case SLC_LNEXT: return(&termLiteralNextChar); -# endif -# ifdef VSTATUS - case SLC_AYT: return(&termAytChar); -# endif - - case SLC_SYNCH: - case SLC_BRK: - case SLC_EOR: - default: - return((cc_t *)0); - } -} - -void -TerminalDefaultChars(void) -{ - memmove(new_tc.c_cc, old_tc.c_cc, sizeof(old_tc.c_cc)); -# ifndef VDISCARD - termFlushChar = CONTROL('O'); -# endif -# ifndef VWERASE - termWerasChar = CONTROL('W'); -# endif -# ifndef VREPRINT - termRprntChar = CONTROL('R'); -# endif -# ifndef VLNEXT - termLiteralNextChar = CONTROL('V'); -# endif -# ifndef VSTART - termStartChar = CONTROL('Q'); -# endif -# ifndef VSTOP - termStopChar = CONTROL('S'); -# endif -# ifndef VSTATUS - termAytChar = CONTROL('T'); -# endif -} - -#ifdef notdef -void -TerminalRestoreState() -{ -} -#endif - -/* - * TerminalNewMode - set up terminal to a specific mode. - * MODE_ECHO: do local terminal echo - * MODE_FLOW: do local flow control - * MODE_TRAPSIG: do local mapping to TELNET IAC sequences - * MODE_EDIT: do local line editing - * - * Command mode: - * MODE_ECHO|MODE_EDIT|MODE_FLOW|MODE_TRAPSIG - * local echo - * local editing - * local xon/xoff - * local signal mapping - * - * Linemode: - * local/no editing - * Both Linemode and Single Character mode: - * local/remote echo - * local/no xon/xoff - * local/no signal mapping - */ - - -#ifdef SIGTSTP -static RETSIGTYPE susp(int); -#endif /* SIGTSTP */ -#ifdef SIGINFO -static RETSIGTYPE ayt(int); -#endif - -void -TerminalNewMode(int f) -{ - static int prevmode = 0; - struct termios tmp_tc; - int onoff; - int old; - cc_t esc; - - globalmode = f&~MODE_FORCE; - if (prevmode == f) - return; - - /* - * Write any outstanding data before switching modes - * ttyflush() returns 0 only when there is no more data - * left to write out, it returns -1 if it couldn't do - * anything at all, otherwise it returns 1 + the number - * of characters left to write. - */ - old = ttyflush(SYNCHing|flushout); - if (old < 0 || old > 1) { - tcgetattr(tin, &tmp_tc); - do { - /* - * Wait for data to drain, then flush again. - */ - tcsetattr(tin, TCSADRAIN, &tmp_tc); - old = ttyflush(SYNCHing|flushout); - } while (old < 0 || old > 1); - } - - old = prevmode; - prevmode = f&~MODE_FORCE; - tmp_tc = new_tc; - - if (f&MODE_ECHO) { - tmp_tc.c_lflag |= ECHO; - tmp_tc.c_oflag |= ONLCR; - if (crlf) - tmp_tc.c_iflag |= ICRNL; - } else { - tmp_tc.c_lflag &= ~ECHO; - tmp_tc.c_oflag &= ~ONLCR; -# ifdef notdef - if (crlf) - tmp_tc.c_iflag &= ~ICRNL; -# endif - } - - if ((f&MODE_FLOW) == 0) { - tmp_tc.c_iflag &= ~(IXOFF|IXON); /* Leave the IXANY bit alone */ - } else { - if (restartany < 0) { - tmp_tc.c_iflag |= IXOFF|IXON; /* Leave the IXANY bit alone */ - } else if (restartany > 0) { - tmp_tc.c_iflag |= IXOFF|IXON|IXANY; - } else { - tmp_tc.c_iflag |= IXOFF|IXON; - tmp_tc.c_iflag &= ~IXANY; - } - } - - if ((f&MODE_TRAPSIG) == 0) { - tmp_tc.c_lflag &= ~ISIG; - localchars = 0; - } else { - tmp_tc.c_lflag |= ISIG; - localchars = 1; - } - - if (f&MODE_EDIT) { - tmp_tc.c_lflag |= ICANON; - } else { - tmp_tc.c_lflag &= ~ICANON; - tmp_tc.c_iflag &= ~ICRNL; - tmp_tc.c_cc[VMIN] = 1; - tmp_tc.c_cc[VTIME] = 0; - } - - if ((f&(MODE_EDIT|MODE_TRAPSIG)) == 0) { -# ifdef VLNEXT - tmp_tc.c_cc[VLNEXT] = (cc_t)(_POSIX_VDISABLE); -# endif - } - - if (f&MODE_SOFT_TAB) { -# ifdef OXTABS - tmp_tc.c_oflag |= OXTABS; -# endif -# ifdef TABDLY - tmp_tc.c_oflag &= ~TABDLY; - tmp_tc.c_oflag |= TAB3; -# endif - } else { -# ifdef OXTABS - tmp_tc.c_oflag &= ~OXTABS; -# endif -# ifdef TABDLY - tmp_tc.c_oflag &= ~TABDLY; -# endif - } - - if (f&MODE_LIT_ECHO) { -# ifdef ECHOCTL - tmp_tc.c_lflag &= ~ECHOCTL; -# endif - } else { -# ifdef ECHOCTL - tmp_tc.c_lflag |= ECHOCTL; -# endif - } - - if (f == -1) { - onoff = 0; - } else { - if (f & MODE_INBIN) - tmp_tc.c_iflag &= ~ISTRIP; - else - tmp_tc.c_iflag |= ISTRIP; - if ((f & MODE_OUTBIN) || (f & MODE_OUT8)) { - tmp_tc.c_cflag &= ~(CSIZE|PARENB); - tmp_tc.c_cflag |= CS8; - if(f & MODE_OUTBIN) - tmp_tc.c_oflag &= ~OPOST; - else - tmp_tc.c_oflag |= OPOST; - } else { - tmp_tc.c_cflag &= ~(CSIZE|PARENB); - tmp_tc.c_cflag |= old_tc.c_cflag & (CSIZE|PARENB); - tmp_tc.c_oflag |= OPOST; - } - onoff = 1; - } - - if (f != -1) { - -#ifdef SIGTSTP - signal(SIGTSTP, susp); -#endif /* SIGTSTP */ -#ifdef SIGINFO - signal(SIGINFO, ayt); -#endif -#ifdef NOKERNINFO - tmp_tc.c_lflag |= NOKERNINFO; -#endif - /* - * We don't want to process ^Y here. It's just another - * character that we'll pass on to the back end. It has - * to process it because it will be processed when the - * user attempts to read it, not when we send it. - */ -# ifdef VDSUSP - tmp_tc.c_cc[VDSUSP] = (cc_t)(_POSIX_VDISABLE); -# endif - /* - * If the VEOL character is already set, then use VEOL2, - * otherwise use VEOL. - */ - esc = (rlogin != _POSIX_VDISABLE) ? rlogin : escape; - if ((tmp_tc.c_cc[VEOL] != esc) -# ifdef VEOL2 - && (tmp_tc.c_cc[VEOL2] != esc) -# endif - ) { - if (tmp_tc.c_cc[VEOL] == (cc_t)(_POSIX_VDISABLE)) - tmp_tc.c_cc[VEOL] = esc; -# ifdef VEOL2 - else if (tmp_tc.c_cc[VEOL2] == (cc_t)(_POSIX_VDISABLE)) - tmp_tc.c_cc[VEOL2] = esc; -# endif - } - } else { - sigset_t sm; - -#ifdef SIGINFO - signal(SIGINFO, ayt_status); -#endif -#ifdef SIGTSTP - signal(SIGTSTP, SIG_DFL); - sigemptyset(&sm); - sigaddset(&sm, SIGTSTP); - sigprocmask(SIG_UNBLOCK, &sm, NULL); -#endif /* SIGTSTP */ - tmp_tc = old_tc; - } - if (tcsetattr(tin, TCSADRAIN, &tmp_tc) < 0) - tcsetattr(tin, TCSANOW, &tmp_tc); - - ioctl(tin, FIONBIO, (char *)&onoff); - ioctl(tout, FIONBIO, (char *)&onoff); - -} - -/* - * Try to guess whether speeds are "encoded" (4.2BSD) or just numeric (4.4BSD). - */ -#if B4800 != 4800 -#define DECODE_BAUD -#endif - -#ifdef DECODE_BAUD -#ifndef B7200 -#define B7200 B4800 -#endif - -#ifndef B14400 -#define B14400 B9600 -#endif - -#ifndef B19200 -# define B19200 B14400 -#endif - -#ifndef B28800 -#define B28800 B19200 -#endif - -#ifndef B38400 -# define B38400 B28800 -#endif - -#ifndef B57600 -#define B57600 B38400 -#endif - -#ifndef B76800 -#define B76800 B57600 -#endif - -#ifndef B115200 -#define B115200 B76800 -#endif - -#ifndef B230400 -#define B230400 B115200 -#endif - - -/* - * This code assumes that the values B0, B50, B75... - * are in ascending order. They do not have to be - * contiguous. - */ -struct termspeeds { - long speed; - long value; -} termspeeds[] = { - { 0, B0 }, { 50, B50 }, { 75, B75 }, - { 110, B110 }, { 134, B134 }, { 150, B150 }, - { 200, B200 }, { 300, B300 }, { 600, B600 }, - { 1200, B1200 }, { 1800, B1800 }, { 2400, B2400 }, - { 4800, B4800 }, { 7200, B7200 }, { 9600, B9600 }, - { 14400, B14400 }, { 19200, B19200 }, { 28800, B28800 }, - { 38400, B38400 }, { 57600, B57600 }, { 115200, B115200 }, - { 230400, B230400 }, { -1, B230400 } -}; -#endif /* DECODE_BAUD */ - -void -TerminalSpeeds(long *input_speed, long *output_speed) -{ -#ifdef DECODE_BAUD - struct termspeeds *tp; -#endif /* DECODE_BAUD */ - long in, out; - - out = cfgetospeed(&old_tc); - in = cfgetispeed(&old_tc); - if (in == 0) - in = out; - -#ifdef DECODE_BAUD - tp = termspeeds; - while ((tp->speed != -1) && (tp->value < in)) - tp++; - *input_speed = tp->speed; - - tp = termspeeds; - while ((tp->speed != -1) && (tp->value < out)) - tp++; - *output_speed = tp->speed; -#else /* DECODE_BAUD */ - *input_speed = in; - *output_speed = out; -#endif /* DECODE_BAUD */ -} - -int -TerminalWindowSize(long *rows, long *cols) -{ - int irows, icols; - - if (get_window_size(STDIN_FILENO, &irows, &icols) == 0) { - *rows = irows; - *cols = icols; - return 1; - } else - return 0; -} - -int -NetClose(int fd) -{ - return close(fd); -} - - -void -NetNonblockingIO(int fd, int onoff) -{ - ioctl(fd, FIONBIO, (char *)&onoff); -} - - -/* - * Various signal handling routines. - */ - -static RETSIGTYPE deadpeer(int), - intr(int), intr2(int), susp(int), sendwin(int); -#ifdef SIGINFO -static RETSIGTYPE ayt(int); -#endif - - - /* ARGSUSED */ -static RETSIGTYPE -deadpeer(int sig) -{ - setcommandmode(); - longjmp(peerdied, -1); -} - -int intr_happened = 0; -int intr_waiting = 0; - - /* ARGSUSED */ -static RETSIGTYPE -intr(int sig) -{ - if (intr_waiting) { - intr_happened = 1; - return; - } - if (localchars) { - intp(); - return; - } - setcommandmode(); - longjmp(toplevel, -1); -} - - /* ARGSUSED */ -static RETSIGTYPE -intr2(int sig) -{ - if (localchars) { -#ifdef KLUDGELINEMODE - if (kludgelinemode) - sendbrk(); - else -#endif - sendabort(); - return; - } -} - -#ifdef SIGTSTP - /* ARGSUSED */ -static RETSIGTYPE -susp(int sig) -{ - if ((rlogin != _POSIX_VDISABLE) && rlogin_susp()) - return; - if (localchars) - sendsusp(); -} -#endif - -#ifdef SIGWINCH - /* ARGSUSED */ -static RETSIGTYPE -sendwin(int sig) -{ - if (connected) { - sendnaws(); - } -} -#endif - -#ifdef SIGINFO - /* ARGSUSED */ -static RETSIGTYPE -ayt(int sig) -{ - if (connected) - sendayt(); - else - ayt_status(sig); -} -#endif - - -void -sys_telnet_init(void) -{ - signal(SIGINT, intr); - signal(SIGQUIT, intr2); - signal(SIGPIPE, deadpeer); -#ifdef SIGWINCH - signal(SIGWINCH, sendwin); -#endif -#ifdef SIGTSTP - signal(SIGTSTP, susp); -#endif -#ifdef SIGINFO - signal(SIGINFO, ayt); -#endif - - setconnmode(0); - - NetNonblockingIO(net, 1); - - -#if defined(SO_OOBINLINE) - if (SetSockOpt(net, SOL_SOCKET, SO_OOBINLINE, 1) == -1) - perror("setsockopt (SO_OOBINLINE) (ignored)"); -#endif /* defined(SO_OOBINLINE) */ -} - -/* - * Process rings - - * - * This routine tries to fill up/empty our various rings. - * - * The parameter specifies whether this is a poll operation, - * or a block-until-something-happens operation. - * - * The return value is 1 if something happened, 0 if not. - */ - -int -process_rings(int netin, - int netout, - int netex, - int ttyin, - int ttyout, - int poll) /* If 0, then block until something to do */ -{ - int c; - /* One wants to be a bit careful about setting returnValue - * to one, since a one implies we did some useful work, - * and therefore probably won't be called to block next - * time (TN3270 mode only). - */ - int returnValue = 0; - static struct timeval TimeValue = { 0 }; - - if (net >= FD_SETSIZE - || tout >= FD_SETSIZE - || tin >= FD_SETSIZE) - errx (1, "fd too large"); - - if (netout) { - FD_SET(net, &obits); - } - if (ttyout) { - FD_SET(tout, &obits); - } - if (ttyin) { - FD_SET(tin, &ibits); - } - if (netin) { - FD_SET(net, &ibits); - } -#if !defined(SO_OOBINLINE) - if (netex) { - FD_SET(net, &xbits); - } -#endif - if ((c = select(FD_SETSIZE, &ibits, &obits, &xbits, - (poll == 0)? (struct timeval *)0 : &TimeValue)) < 0) { - if (c == -1) { - /* - * we can get EINTR if we are in line mode, - * and the user does an escape (TSTP), or - * some other signal generator. - */ - if (errno == EINTR) { - return 0; - } - /* I don't like this, does it ever happen? */ - printf("sleep(5) from telnet, after select\r\n"); - sleep(5); - } - return 0; - } - - /* - * Any urgent data? - */ - if (FD_ISSET(net, &xbits)) { - FD_CLR(net, &xbits); - SYNCHing = 1; - ttyflush(1); /* flush already enqueued data */ - } - - /* - * Something to read from the network... - */ - if (FD_ISSET(net, &ibits)) { - int canread; - - FD_CLR(net, &ibits); - canread = ring_empty_consecutive(&netiring); -#if !defined(SO_OOBINLINE) - /* - * In 4.2 (and some early 4.3) systems, the - * OOB indication and data handling in the kernel - * is such that if two separate TCP Urgent requests - * come in, one byte of TCP data will be overlaid. - * This is fatal for Telnet, but we try to live - * with it. - * - * In addition, in 4.2 (and...), a special protocol - * is needed to pick up the TCP Urgent data in - * the correct sequence. - * - * What we do is: if we think we are in urgent - * mode, we look to see if we are "at the mark". - * If we are, we do an OOB receive. If we run - * this twice, we will do the OOB receive twice, - * but the second will fail, since the second - * time we were "at the mark", but there wasn't - * any data there (the kernel doesn't reset - * "at the mark" until we do a normal read). - * Once we've read the OOB data, we go ahead - * and do normal reads. - * - * There is also another problem, which is that - * since the OOB byte we read doesn't put us - * out of OOB state, and since that byte is most - * likely the TELNET DM (data mark), we would - * stay in the TELNET SYNCH (SYNCHing) state. - * So, clocks to the rescue. If we've "just" - * received a DM, then we test for the - * presence of OOB data when the receive OOB - * fails (and AFTER we did the normal mode read - * to clear "at the mark"). - */ - if (SYNCHing) { - int atmark; - static int bogus_oob = 0, first = 1; - - ioctl(net, SIOCATMARK, (char *)&atmark); - if (atmark) { - c = recv(net, netiring.supply, canread, MSG_OOB); - if ((c == -1) && (errno == EINVAL)) { - c = recv(net, netiring.supply, canread, 0); - if (clocks.didnetreceive < clocks.gotDM) { - SYNCHing = stilloob(); - } - } else if (first && c > 0) { - /* - * Bogosity check. Systems based on 4.2BSD - * do not return an error if you do a second - * recv(MSG_OOB). So, we do one. If it - * succeeds and returns exactly the same - * data, then assume that we are running - * on a broken system and set the bogus_oob - * flag. (If the data was different, then - * we probably got some valid new data, so - * increment the count...) - */ - int i; - i = recv(net, netiring.supply + c, canread - c, MSG_OOB); - if (i == c && - memcmp(netiring.supply, netiring.supply + c, i) == 0) { - bogus_oob = 1; - first = 0; - } else if (i < 0) { - bogus_oob = 0; - first = 0; - } else - c += i; - } - if (bogus_oob && c > 0) { - int i; - /* - * Bogosity. We have to do the read - * to clear the atmark to get out of - * an infinate loop. - */ - i = read(net, netiring.supply + c, canread - c); - if (i > 0) - c += i; - } - } else { - c = recv(net, netiring.supply, canread, 0); - } - } else { - c = recv(net, netiring.supply, canread, 0); - } - settimer(didnetreceive); -#else /* !defined(SO_OOBINLINE) */ - c = recv(net, (char *)netiring.supply, canread, 0); -#endif /* !defined(SO_OOBINLINE) */ - if (c < 0 && errno == EWOULDBLOCK) { - c = 0; - } else if (c <= 0) { - return -1; - } - if (netdata) { - Dump('<', netiring.supply, c); - } - if (c) - ring_supplied(&netiring, c); - returnValue = 1; - } - - /* - * Something to read from the tty... - */ - if (FD_ISSET(tin, &ibits)) { - FD_CLR(tin, &ibits); - c = TerminalRead(ttyiring.supply, ring_empty_consecutive(&ttyiring)); - if (c < 0 && errno == EIO) - c = 0; - if (c < 0 && errno == EWOULDBLOCK) { - c = 0; - } else { - /* EOF detection for line mode!!!! */ - if ((c == 0) && MODE_LOCAL_CHARS(globalmode) && isatty(tin)) { - /* must be an EOF... */ - *ttyiring.supply = termEofChar; - c = 1; - } - if (c <= 0) { - return -1; - } - if (termdata) { - Dump('<', ttyiring.supply, c); - } - ring_supplied(&ttyiring, c); - } - returnValue = 1; /* did something useful */ - } - - if (FD_ISSET(net, &obits)) { - FD_CLR(net, &obits); - returnValue |= netflush(); - } - if (FD_ISSET(tout, &obits)) { - FD_CLR(tout, &obits); - returnValue |= (ttyflush(SYNCHing|flushout) > 0); - } - - return returnValue; -} diff --git a/crypto/heimdal/appl/telnet/telnet/telnet.1 b/crypto/heimdal/appl/telnet/telnet/telnet.1 deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/telnet.1 +++ /dev/null @@ -1,1369 +0,0 @@ -.\" Copyright (c) 1983, 1990, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)telnet.1 8.6 (Berkeley) 6/1/94 -.\" -.Dd June 1, 1994 -.Dt TELNET 1 -.Os BSD 4.2 -.Sh NAME -.Nm telnet -.Nd user interface to the -.Tn TELNET -protocol -.Sh SYNOPSIS -.Nm telnet -.Op Fl 78EFKLacdfrx -.Op Fl S Ar tos -.Op Fl X Ar authtype -.Op Fl e Ar escapechar -.Op Fl k Ar realm -.Op Fl l Ar user -.Op Fl n Ar tracefile -.Oo -.Ar host -.Op port -.Oc -.Sh DESCRIPTION -The -.Nm telnet -command -is used to communicate with another host using the -.Tn TELNET -protocol. -If -.Nm telnet -is invoked without the -.Ar host -argument, it enters command mode, -indicated by its prompt -.Pq Nm telnet\*[Gt] . -In this mode, it accepts and executes the commands listed below. -If it is invoked with arguments, it performs an -.Ic open -command with those arguments. -.Pp -Options: -.Bl -tag -width indent -.It Fl 8 -Specifies an 8-bit data path. This causes an attempt to -negotiate the -.Dv TELNET BINARY -option on both input and output. -.It Fl 7 -Do not try to negotiate -.Dv TELNET BINARY -option. -.It Fl E -Stops any character from being recognized as an escape character. -.It Fl F -If Kerberos V5 authentication is being used, the -.Fl F -option allows the local credentials to be forwarded -to the remote system, including any credentials that -have already been forwarded into the local environment. -.It Fl K -Specifies no automatic login to the remote system. -.It Fl L -Specifies an 8-bit data path on output. This causes the -BINARY option to be negotiated on output. -.It Fl S Ar tos -Sets the IP type-of-service (TOS) option for the telnet -connection to the value -.Ar tos , -which can be a numeric TOS value -or, on systems that support it, a symbolic -TOS name found in the /etc/iptos file. -.It Fl X Ar atype -Disables the -.Ar atype -type of authentication. -.It Fl a -Attempt automatic login. -Currently, this sends the user name via the -.Ev USER -variable -of the -.Ev ENVIRON -option if supported by the remote system. -The name used is that of the current user as returned by -.Xr getlogin 2 -if it agrees with the current user ID, -otherwise it is the name associated with the user ID. -.It Fl c -Disables the reading of the user's -.Pa \&.telnetrc -file. (See the -.Ic toggle skiprc -command on this man page.) -.It Fl d -Sets the initial value of the -.Ic debug -toggle to -.Dv TRUE -.It Fl e Ar escape char -Sets the initial -.Nm -.Nm telnet -escape character to -.Ar escape char . -If -.Ar escape char -is omitted, then -there will be no escape character. -.It Fl f -If Kerberos V5 authentication is being used, the -.Fl f -option allows the local credentials to be forwarded to the remote system. -.It Fl k Ar realm -If Kerberos authentication is being used, the -.Fl k -option requests that telnet obtain tickets for the remote host in -realm realm instead of the remote host's realm, as determined -by -.Xr krb_realmofhost 3 . -.It Fl l Ar user -When connecting to the remote system, if the remote system -understands the -.Ev ENVIRON -option, then -.Ar user -will be sent to the remote system as the value for the variable USER. -This option implies the -.Fl a -option. -This option may also be used with the -.Ic open -command. -.It Fl n Ar tracefile -Opens -.Ar tracefile -for recording trace information. -See the -.Ic set tracefile -command below. -.It Fl r -Specifies a user interface similar to -.Xr rlogin 1 . -In this -mode, the escape character is set to the tilde (~) character, -unless modified by the -e option. -.It Fl x -Turn on encryption of the data stream. When this option is turned on, -.B telnet -will exit with an error if authentication cannot be negotiated or if -encryption cannot be turned on. -.It Ar host -Indicates the official name, an alias, or the Internet address -of a remote host. -.It Ar port -Indicates a port number (address of an application). If a number is -not specified, the default -.Nm telnet -port is used. -.El -.Pp -When in rlogin mode, a line of the form ~. disconnects from the -remote host; ~ is the telnet escape character. -Similarly, the line ~^Z suspends the telnet session. -The line ~^] escapes to the normal telnet escape prompt. -.Pp -Once a connection has been opened, -.Nm telnet -will attempt to enable the -.Dv TELNET LINEMODE -option. -If this fails, then -.Nm telnet -will revert to one of two input modes: -either \*(Lqcharacter at a time\*(Rq -or \*(Lqold line by line\*(Rq -depending on what the remote system supports. -.Pp -When -.Dv LINEMODE -is enabled, character processing is done on the -local system, under the control of the remote system. When input -editing or character echoing is to be disabled, the remote system -will relay that information. The remote system will also relay -changes to any special characters that happen on the remote -system, so that they can take effect on the local system. -.Pp -In \*(Lqcharacter at a time\*(Rq mode, most -text typed is immediately sent to the remote host for processing. -.Pp -In \*(Lqold line by line\*(Rq mode, all text is echoed locally, -and (normally) only completed lines are sent to the remote host. -The \*(Lqlocal echo character\*(Rq (initially \*(Lq^E\*(Rq) may be used -to turn off and on the local echo -(this would mostly be used to enter passwords -without the password being echoed). -.Pp -If the -.Dv LINEMODE -option is enabled, or if the -.Ic localchars -toggle is -.Dv TRUE -(the default for \*(Lqold line by line\*(Lq; see below), -the user's -.Ic quit , -.Ic intr , -and -.Ic flush -characters are trapped locally, and sent as -.Tn TELNET -protocol sequences to the remote side. -If -.Dv LINEMODE -has ever been enabled, then the user's -.Ic susp -and -.Ic eof -are also sent as -.Tn TELNET -protocol sequences, -and -.Ic quit -is sent as a -.Dv TELNET ABORT -instead of -.Dv BREAK -There are options (see -.Ic toggle -.Ic autoflush -and -.Ic toggle -.Ic autosynch -below) -which cause this action to flush subsequent output to the terminal -(until the remote host acknowledges the -.Tn TELNET -sequence) and flush previous terminal input -(in the case of -.Ic quit -and -.Ic intr ) . -.Pp -While connected to a remote host, -.Nm telnet -command mode may be entered by typing the -.Nm telnet -\*(Lqescape character\*(Rq (initially \*(Lq^]\*(Rq). -When in command mode, the normal terminal editing conventions are available. -.Pp -The following -.Nm telnet -commands are available. -Only enough of each command to uniquely identify it need be typed -(this is also true for arguments to the -.Ic mode , -.Ic set , -.Ic toggle , -.Ic unset , -.Ic slc , -.Ic environ , -and -.Ic display -commands). -.Pp -.Bl -tag -width "mode type" -.It Ic auth Ar argument ... -The auth command manipulates the information sent through the -.Dv TELNET AUTHENTICATE -option. Valid arguments for the -auth command are as follows: -.Bl -tag -width "disable type" -.It Ic disable Ar type -Disables the specified type of authentication. To -obtain a list of available types, use the -.Ic auth disable ?\& -command. -.It Ic enable Ar type -Enables the specified type of authentication. To -obtain a list of available types, use the -.Ic auth enable ?\& -command. -.It Ic status -Lists the current status of the various types of -authentication. -.El -.It Ic close -Close a -.Tn TELNET -session and return to command mode. -.It Ic display Ar argument ... -Displays all, or some, of the -.Ic set -and -.Ic toggle -values (see below). -.It Ic encrypt Ar argument ... -The encrypt command manipulates the information sent through the -.Dv TELNET ENCRYPT -option. -.Pp -Note: Because of export controls, the -.Dv TELNET ENCRYPT -option is not supported outside of the United States and Canada. -.Pp -Valid arguments for the encrypt command are as follows: -.Bl -tag -width Ar -.It Ic disable Ar type Xo -.Op Cm input | output -.Xc -Disables the specified type of encryption. If you -omit the input and output, both input and output -are disabled. To obtain a list of available -types, use the -.Ic encrypt disable ?\& -command. -.It Ic enable Ar type Xo -.Op Cm input | output -.Xc -Enables the specified type of encryption. If you -omit input and output, both input and output are -enabled. To obtain a list of available types, use the -.Ic encrypt enable ?\& -command. -.It Ic input -This is the same as the -.Ic encrypt start input -command. -.It Ic -input -This is the same as the -.Ic encrypt stop input -command. -.It Ic output -This is the same as the -.Ic encrypt start output -command. -.It Ic -output -This is the same as the -.Ic encrypt stop output -command. -.It Ic start Op Cm input | output -Attempts to start encryption. If you omit -.Ic input -and -.Ic output , -both input and output are enabled. To -obtain a list of available types, use the -.Ic encrypt enable ?\& -command. -.It Ic status -Lists the current status of encryption. -.It Ic stop Op Cm input | output -Stops encryption. If you omit input and output, -encryption is on both input and output. -.It Ic type Ar type -Sets the default type of encryption to be used -with later -.Ic encrypt start -or -.Ic encrypt stop -commands. -.El -.It Ic environ Ar arguments ... -The -.Ic environ -command is used to manipulate the -the variables that my be sent through the -.Dv TELNET ENVIRON -option. -The initial set of variables is taken from the users -environment, with only the -.Ev DISPLAY -and -.Ev PRINTER -variables being exported by default. -The -.Ev USER -variable is also exported if the -.Fl a -or -.Fl l -options are used. -.Pp -Valid arguments for the -.Ic environ -command are: -.Bl -tag -width Fl -.It Ic define Ar variable value -Define the variable -.Ar variable -to have a value of -.Ar value . -Any variables defined by this command are automatically exported. -The -.Ar value -may be enclosed in single or double quotes so -that tabs and spaces may be included. -.It Ic undefine Ar variable -Remove -.Ar variable -from the list of environment variables. -.It Ic export Ar variable -Mark the variable -.Ar variable -to be exported to the remote side. -.It Ic unexport Ar variable -Mark the variable -.Ar variable -to not be exported unless -explicitly asked for by the remote side. -.It Ic list -List the current set of environment variables. -Those marked with a -.Cm * -will be sent automatically, -other variables will only be sent if explicitly requested. -.It Ic ?\& -Prints out help information for the -.Ic environ -command. -.El -.It Ic logout -Sends the -.Dv TELNET LOGOUT -option to the remote side. -This command is similar to a -.Ic close -command; however, if the remote side does not support the -.Dv LOGOUT -option, nothing happens. -If, however, the remote side does support the -.Dv LOGOUT -option, this command should cause the remote side to close the -.Tn TELNET -connection. -If the remote side also supports the concept of -suspending a user's session for later reattachment, -the logout argument indicates that you -should terminate the session immediately. -.It Ic mode Ar type -.Ar Type -is one of several options, depending on the state of the -.Tn TELNET -session. -The remote host is asked for permission to go into the requested mode. -If the remote host is capable of entering that mode, the requested -mode will be entered. -.Bl -tag -width Ar -.It Ic character -Disable the -.Dv TELNET LINEMODE -option, or, if the remote side does not understand the -.Dv LINEMODE -option, then enter \*(Lqcharacter at a time\*(Lq mode. -.It Ic line -Enable the -.Dv TELNET LINEMODE -option, or, if the remote side does not understand the -.Dv LINEMODE -option, then attempt to enter \*(Lqold-line-by-line\*(Lq mode. -.It Ic isig Pq Ic \-isig -Attempt to enable (disable) the -.Dv TRAPSIG -mode of the -.Dv LINEMODE -option. -This requires that the -.Dv LINEMODE -option be enabled. -.It Ic edit Pq Ic \-edit -Attempt to enable (disable) the -.Dv EDIT -mode of the -.Dv LINEMODE -option. -This requires that the -.Dv LINEMODE -option be enabled. -.It Ic softtabs Pq Ic \-softtabs -Attempt to enable (disable) the -.Dv SOFT_TAB -mode of the -.Dv LINEMODE -option. -This requires that the -.Dv LINEMODE -option be enabled. -.It Ic litecho Pq Ic \-litecho -Attempt to enable (disable) the -.Dv LIT_ECHO -mode of the -.Dv LINEMODE -option. -This requires that the -.Dv LINEMODE -option be enabled. -.It Ic ?\& -Prints out help information for the -.Ic mode -command. -.El -.It Xo -.Ic open Ar host -.Op Fl l Ar user -.Op Oo Fl Oc Ns Ar port -.Xc -Open a connection to the named host. -If no port number -is specified, -.Nm telnet -will attempt to contact a -.Tn TELNET -server at the default port. -The host specification may be either a host name (see -.Xr hosts 5 ) -or an Internet address specified in the \*(Lqdot notation\*(Rq (see -.Xr inet 3 ) . -The -.Op Fl l -option may be used to specify the user name -to be passed to the remote system via the -.Ev ENVIRON -option. -When connecting to a non-standard port, -.Nm telnet -omits any automatic initiation of -.Tn TELNET -options. When the port number is preceded by a minus sign, -the initial option negotiation is done. -After establishing a connection, the file -.Pa \&.telnetrc -in the -users home directory is opened. Lines beginning with a # are -comment lines. Blank lines are ignored. Lines that begin -without white space are the start of a machine entry. The -first thing on the line is the name of the machine that is -being connected to. The rest of the line, and successive -lines that begin with white space are assumed to be -.Nm telnet -commands and are processed as if they had been typed -in manually to the -.Nm telnet -command prompt. -.It Ic quit -Close any open -.Tn TELNET -session and exit -.Nm telnet . -An end of file (in command mode) will also close a session and exit. -.It Ic send Ar arguments -Sends one or more special character sequences to the remote host. -The following are the arguments which may be specified -(more than one argument may be specified at a time): -.Pp -.Bl -tag -width escape -.It Ic abort -Sends the -.Dv TELNET ABORT -(Abort -processes) -sequence. -.It Ic ao -Sends the -.Dv TELNET AO -(Abort Output) sequence, which should cause the remote system to flush -all output -.Em from -the remote system -.Em to -the user's terminal. -.It Ic ayt -Sends the -.Dv TELNET AYT -(Are You There) -sequence, to which the remote system may or may not choose to respond. -.It Ic brk -Sends the -.Dv TELNET BRK -(Break) sequence, which may have significance to the remote -system. -.It Ic ec -Sends the -.Dv TELNET EC -(Erase Character) -sequence, which should cause the remote system to erase the last character -entered. -.It Ic el -Sends the -.Dv TELNET EL -(Erase Line) -sequence, which should cause the remote system to erase the line currently -being entered. -.It Ic eof -Sends the -.Dv TELNET EOF -(End Of File) -sequence. -.It Ic eor -Sends the -.Dv TELNET EOR -(End of Record) -sequence. -.It Ic escape -Sends the current -.Nm telnet -escape character (initially \*(Lq^\*(Rq). -.It Ic ga -Sends the -.Dv TELNET GA -(Go Ahead) -sequence, which likely has no significance to the remote system. -.It Ic getstatus -If the remote side supports the -.Dv TELNET STATUS -command, -.Ic getstatus -will send the subnegotiation to request that the server send -its current option status. -.It Ic ip -Sends the -.Dv TELNET IP -(Interrupt Process) sequence, which should cause the remote -system to abort the currently running process. -.It Ic nop -Sends the -.Dv TELNET NOP -(No OPeration) -sequence. -.It Ic susp -Sends the -.Dv TELNET SUSP -(SUSPend process) -sequence. -.It Ic synch -Sends the -.Dv TELNET SYNCH -sequence. -This sequence causes the remote system to discard all previously typed -(but not yet read) input. -This sequence is sent as -.Tn TCP -urgent -data (and may not work if the remote system is a -.Bx 4.2 -system -- if -it doesn't work, a lower case \*(Lqr\*(Rq may be echoed on the terminal). -.It Ic do Ar cmd -.It Ic dont Ar cmd -.It Ic will Ar cmd -.It Ic wont Ar cmd -Sends the -.Dv TELNET DO -.Ar cmd -sequence. -.Ar Cmd -can be either a decimal number between 0 and 255, -or a symbolic name for a specific -.Dv TELNET -command. -.Ar Cmd -can also be either -.Ic help -or -.Ic ?\& -to print out help information, including -a list of known symbolic names. -.It Ic ?\& -Prints out help information for the -.Ic send -command. -.El -.It Ic set Ar argument value -.It Ic unset Ar argument value -The -.Ic set -command will set any one of a number of -.Nm telnet -variables to a specific value or to -.Dv TRUE . -The special value -.Ic off -turns off the function associated with -the variable, this is equivalent to using the -.Ic unset -command. -The -.Ic unset -command will disable or set to -.Dv FALSE -any of the specified functions. -The values of variables may be interrogated with the -.Ic display -command. -The variables which may be set or unset, but not toggled, are -listed here. In addition, any of the variables for the -.Ic toggle -command may be explicitly set or unset using -the -.Ic set -and -.Ic unset -commands. -.Bl -tag -width escape -.It Ic ayt -If -.Tn TELNET -is in localchars mode, or -.Dv LINEMODE -is enabled, and the status character is typed, a -.Dv TELNET AYT -sequence (see -.Ic send ayt -preceding) is sent to the -remote host. The initial value for the "Are You There" -character is the terminal's status character. -.It Ic echo -This is the value (initially \*(Lq^E\*(Rq) which, when in -\*(Lqline by line\*(Rq mode, toggles between doing local echoing -of entered characters (for normal processing), and suppressing -echoing of entered characters (for entering, say, a password). -.It Ic eof -If -.Nm telnet -is operating in -.Dv LINEMODE -or \*(Lqold line by line\*(Rq mode, entering this character -as the first character on a line will cause this character to be -sent to the remote system. -The initial value of the eof character is taken to be the terminal's -.Ic eof -character. -.It Ic erase -If -.Nm telnet -is in -.Ic localchars -mode (see -.Ic toggle -.Ic localchars -below), -.Sy and -if -.Nm telnet -is operating in \*(Lqcharacter at a time\*(Rq mode, then when this -character is typed, a -.Dv TELNET EC -sequence (see -.Ic send -.Ic ec -above) -is sent to the remote system. -The initial value for the erase character is taken to be -the terminal's -.Ic erase -character. -.It Ic escape -This is the -.Nm telnet -escape character (initially \*(Lq^[\*(Rq) which causes entry -into -.Nm telnet -command mode (when connected to a remote system). -.It Ic flushoutput -If -.Nm telnet -is in -.Ic localchars -mode (see -.Ic toggle -.Ic localchars -below) -and the -.Ic flushoutput -character is typed, a -.Dv TELNET AO -sequence (see -.Ic send -.Ic ao -above) -is sent to the remote host. -The initial value for the flush character is taken to be -the terminal's -.Ic flush -character. -.It Ic forw1 -.It Ic forw2 -If -.Tn TELNET -is operating in -.Dv LINEMODE , -these are the -characters that, when typed, cause partial lines to be -forwarded to the remote system. The initial value for -the forwarding characters are taken from the terminal's -eol and eol2 characters. -.It Ic interrupt -If -.Nm telnet -is in -.Ic localchars -mode (see -.Ic toggle -.Ic localchars -below) -and the -.Ic interrupt -character is typed, a -.Dv TELNET IP -sequence (see -.Ic send -.Ic ip -above) -is sent to the remote host. -The initial value for the interrupt character is taken to be -the terminal's -.Ic intr -character. -.It Ic kill -If -.Nm telnet -is in -.Ic localchars -mode (see -.Ic toggle -.Ic localchars -below), -.Ic and -if -.Nm telnet -is operating in \*(Lqcharacter at a time\*(Rq mode, then when this -character is typed, a -.Dv TELNET EL -sequence (see -.Ic send -.Ic el -above) -is sent to the remote system. -The initial value for the kill character is taken to be -the terminal's -.Ic kill -character. -.It Ic lnext -If -.Nm telnet -is operating in -.Dv LINEMODE -or \*(Lqold line by line\*(Lq mode, then this character is taken to -be the terminal's -.Ic lnext -character. -The initial value for the lnext character is taken to be -the terminal's -.Ic lnext -character. -.It Ic quit -If -.Nm telnet -is in -.Ic localchars -mode (see -.Ic toggle -.Ic localchars -below) -and the -.Ic quit -character is typed, a -.Dv TELNET BRK -sequence (see -.Ic send -.Ic brk -above) -is sent to the remote host. -The initial value for the quit character is taken to be -the terminal's -.Ic quit -character. -.It Ic reprint -If -.Nm telnet -is operating in -.Dv LINEMODE -or \*(Lqold line by line\*(Lq mode, then this character is taken to -be the terminal's -.Ic reprint -character. -The initial value for the reprint character is taken to be -the terminal's -.Ic reprint -character. -.It Ic rlogin -This is the rlogin escape character. -If set, the normal -.Tn TELNET -escape character is ignored unless it is -preceded by this character at the beginning of a line. -This character, at the beginning of a line followed by -a "." closes the connection; when followed by a ^Z it -suspends the telnet command. The initial state is to -disable the rlogin escape character. -.It Ic start -If the -.Dv TELNET TOGGLE-FLOW-CONTROL -option has been enabled, -then this character is taken to -be the terminal's -.Ic start -character. -The initial value for the kill character is taken to be -the terminal's -.Ic start -character. -.It Ic stop -If the -.Dv TELNET TOGGLE-FLOW-CONTROL -option has been enabled, -then this character is taken to -be the terminal's -.Ic stop -character. -The initial value for the kill character is taken to be -the terminal's -.Ic stop -character. -.It Ic susp -If -.Nm telnet -is in -.Ic localchars -mode, or -.Dv LINEMODE -is enabled, and the -.Ic suspend -character is typed, a -.Dv TELNET SUSP -sequence (see -.Ic send -.Ic susp -above) -is sent to the remote host. -The initial value for the suspend character is taken to be -the terminal's -.Ic suspend -character. -.It Ic tracefile -This is the file to which the output, caused by -.Ic netdata -or -.Ic option -tracing being -.Dv TRUE , -will be written. If it is set to -.Dq Fl , -then tracing information will be written to standard output (the default). -.It Ic worderase -If -.Nm telnet -is operating in -.Dv LINEMODE -or \*(Lqold line by line\*(Lq mode, then this character is taken to -be the terminal's -.Ic worderase -character. -The initial value for the worderase character is taken to be -the terminal's -.Ic worderase -character. -.It Ic ?\& -Displays the legal -.Ic set -.Pq Ic unset -commands. -.El -.It Ic slc Ar state -The -.Ic slc -command (Set Local Characters) is used to set -or change the state of the the special -characters when the -.Dv TELNET LINEMODE -option has -been enabled. Special characters are characters that get -mapped to -.Tn TELNET -commands sequences (like -.Ic ip -or -.Ic quit ) -or line editing characters (like -.Ic erase -and -.Ic kill ) . -By default, the local special characters are exported. -.Bl -tag -width Fl -.It Ic check -Verify the current settings for the current special characters. -The remote side is requested to send all the current special -character settings, and if there are any discrepancies with -the local side, the local side will switch to the remote value. -.It Ic export -Switch to the local defaults for the special characters. The -local default characters are those of the local terminal at -the time when -.Nm telnet -was started. -.It Ic import -Switch to the remote defaults for the special characters. -The remote default characters are those of the remote system -at the time when the -.Tn TELNET -connection was established. -.It Ic ?\& -Prints out help information for the -.Ic slc -command. -.El -.It Ic status -Show the current status of -.Nm telnet . -This includes the peer one is connected to, as well -as the current mode. -.It Ic toggle Ar arguments ... -Toggle (between -.Dv TRUE -and -.Dv FALSE ) -various flags that control how -.Nm telnet -responds to events. -These flags may be set explicitly to -.Dv TRUE -or -.Dv FALSE -using the -.Ic set -and -.Ic unset -commands listed above. -More than one argument may be specified. -The state of these flags may be interrogated with the -.Ic display -command. -Valid arguments are: -.Bl -tag -width Ar -.It Ic authdebug -Turns on debugging information for the authentication code. -.It Ic autoflush -If -.Ic autoflush -and -.Ic localchars -are both -.Dv TRUE , -then when the -.Ic ao , -or -.Ic quit -characters are recognized (and transformed into -.Tn TELNET -sequences; see -.Ic set -above for details), -.Nm telnet -refuses to display any data on the user's terminal -until the remote system acknowledges (via a -.Dv TELNET TIMING MARK -option) -that it has processed those -.Tn TELNET -sequences. -The initial value for this toggle is -.Dv TRUE -if the terminal user had not -done an "stty noflsh", otherwise -.Dv FALSE -(see -.Xr stty 1 ) . -.It Ic autodecrypt -When the -.Dv TELNET ENCRYPT -option is negotiated, by -default the actual encryption (decryption) of the data -stream does not start automatically. The autoencrypt -(autodecrypt) command states that encryption of the -output (input) stream should be enabled as soon as -possible. -.Pp -Note: Because of export controls, the -.Dv TELNET ENCRYPT -option is not supported outside the United States and Canada. -.It Ic autologin -If the remote side supports the -.Dv TELNET AUTHENTICATION -option -.Tn TELNET -attempts to use it to perform automatic authentication. If the -.Dv AUTHENTICATION -option is not supported, the user's login -name are propagated through the -.Dv TELNET ENVIRON -option. -This command is the same as specifying -.Ar a -option on the -.Ic open -command. -.It Ic autosynch -If -.Ic autosynch -and -.Ic localchars -are both -.Dv TRUE , -then when either the -.Ic intr -or -.Ic quit -characters is typed (see -.Ic set -above for descriptions of the -.Ic intr -and -.Ic quit -characters), the resulting -.Tn TELNET -sequence sent is followed by the -.Dv TELNET SYNCH -sequence. -This procedure -.Ic should -cause the remote system to begin throwing away all previously -typed input until both of the -.Tn TELNET -sequences have been read and acted upon. -The initial value of this toggle is -.Dv FALSE . -.It Ic binary -Enable or disable the -.Dv TELNET BINARY -option on both input and output. -.It Ic inbinary -Enable or disable the -.Dv TELNET BINARY -option on input. -.It Ic outbinary -Enable or disable the -.Dv TELNET BINARY -option on output. -.It Ic crlf -If this is -.Dv TRUE , -then carriage returns will be sent as -.Li \*[Lt]CR\*[Gt]\*[Lt]LF\*[Gt] . -If this is -.Dv FALSE , -then carriage returns will be send as -.Li \*[Lt]CR\*[Gt]\*[Lt]NUL\*[Gt] . -The initial value for this toggle is -.Dv FALSE . -.It Ic crmod -Toggle carriage return mode. -When this mode is enabled, most carriage return characters received from -the remote host will be mapped into a carriage return followed by -a line feed. -This mode does not affect those characters typed by the user, only -those received from the remote host. -This mode is not very useful unless the remote host -only sends carriage return, but never line feed. -The initial value for this toggle is -.Dv FALSE . -.It Ic debug -Toggles socket level debugging (useful only to the -.Ic super user ) . -The initial value for this toggle is -.Dv FALSE . -.It Ic encdebug -Turns on debugging information for the encryption code. -.It Ic localchars -If this is -.Dv TRUE , -then the -.Ic flush , -.Ic interrupt , -.Ic quit , -.Ic erase , -and -.Ic kill -characters (see -.Ic set -above) are recognized locally, and transformed into (hopefully) appropriate -.Tn TELNET -control sequences -(respectively -.Ic ao , -.Ic ip , -.Ic brk , -.Ic ec , -and -.Ic el ; -see -.Ic send -above). -The initial value for this toggle is -.Dv TRUE -in \*(Lqold line by line\*(Rq mode, -and -.Dv FALSE -in \*(Lqcharacter at a time\*(Rq mode. -When the -.Dv LINEMODE -option is enabled, the value of -.Ic localchars -is ignored, and assumed to always be -.Dv TRUE . -If -.Dv LINEMODE -has ever been enabled, then -.Ic quit -is sent as -.Ic abort , -and -.Ic eof -and -.Ic suspend -are sent as -.Ic eof -and -.Ic susp , -see -.Ic send -above). -.It Ic netdata -Toggles the display of all network data (in hexadecimal format). -The initial value for this toggle is -.Dv FALSE . -.It Ic options -Toggles the display of some internal -.Nm telnet -protocol processing (having to do with -.Tn TELNET -options). -The initial value for this toggle is -.Dv FALSE . -.It Ic prettydump -When the -.Ic netdata -toggle is enabled, if -.Ic prettydump -is enabled the output from the -.Ic netdata -command will be formatted in a more user readable format. -Spaces are put between each character in the output, and the -beginning of any -.Tn TELNET -escape sequence is preceded by a '*' to aid in locating them. -.It Ic skiprc -When the skiprc toggle is -.Dv TRUE , -.Tn TELNET -skips the reading of the -.Pa \&.telnetrc -file in the users home -directory when connections are opened. The initial -value for this toggle is -.Dv FALSE . -.It Ic termdata -Toggles the display of all terminal data (in hexadecimal format). -The initial value for this toggle is -.Dv FALSE . -.It Ic verbose_encrypt -When the -.Ic verbose_encrypt -toggle is -.Dv TRUE , -.Tn TELNET -prints out a message each time encryption is enabled or -disabled. The initial value for this toggle is -.Dv FALSE . -Note: Because of export controls, data encryption -is not supported outside of the United States and Canada. -.It Ic \&? -Displays the legal -.Ic toggle -commands. -.El -.It Ic z -Suspend -.Nm telnet . -This command only works when the user is using the -.Xr csh 1 . -.It Ic \&! Op Ar command -Execute a single command in a subshell on the local -system. If -.Ic command -is omitted, then an interactive -subshell is invoked. -.It Ic ?\& Op Ar command -Get help. With no arguments, -.Nm telnet -prints a help summary. -If a command is specified, -.Nm telnet -will print the help information for just that command. -.El -.Sh ENVIRONMENT -.Nm Telnet -uses at least the -.Ev HOME , -.Ev SHELL , -.Ev DISPLAY , -and -.Ev TERM -environment variables. -Other environment variables may be propagated -to the other side via the -.Dv TELNET ENVIRON -option. -.Sh FILES -.Bl -tag -width ~/.telnetrc -compact -.It Pa ~/.telnetrc -user customized telnet startup values -.El -.Sh HISTORY -The -.Nm Telnet -command appeared in -.Bx 4.2 . -.Sh NOTES -.Pp -On some remote systems, echo has to be turned off manually when in -\*(Lqold line by line\*(Rq mode. -.Pp -In \*(Lqold line by line\*(Rq mode or -.Dv LINEMODE -the terminal's -.Ic eof -character is only recognized (and sent to the remote system) -when it is the first character on a line. diff --git a/crypto/heimdal/appl/telnet/telnet/telnet.c b/crypto/heimdal/appl/telnet/telnet/telnet.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/telnet.c +++ /dev/null @@ -1,2420 +0,0 @@ -/* - * Copyright (c) 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnet_locl.h" - -RCSID("$Id$"); - -#define strip(x) (eight ? (x) : ((x) & 0x7f)) - -static unsigned char subbuffer[SUBBUFSIZE], - *subpointer, *subend; /* buffer for sub-options */ -#define SB_CLEAR() subpointer = subbuffer; -#define SB_TERM() { subend = subpointer; SB_CLEAR(); } -#define SB_ACCUM(c) if (subpointer < (subbuffer+sizeof subbuffer)) { \ - *subpointer++ = (c); \ - } - -#define SB_GET() ((*subpointer++)&0xff) -#define SB_PEEK() ((*subpointer)&0xff) -#define SB_EOF() (subpointer >= subend) -#define SB_LEN() (subend - subpointer) - -char options[256]; /* The combined options */ -char do_dont_resp[256]; -char will_wont_resp[256]; - -int - eight = 3, - binary = 0, - autologin = 0, /* Autologin anyone? */ - skiprc = 0, - connected, - showoptions, - ISend, /* trying to send network data in */ - debug = 0, - crmod, - netdata, /* Print out network data flow */ - crlf, /* Should '\r' be mapped to (or )? */ - telnetport, - wantencryption = 0, - SYNCHing, /* we are in TELNET SYNCH mode */ - flushout, /* flush output */ - autoflush = 0, /* flush output when interrupting? */ - autosynch, /* send interrupt characters with SYNCH? */ - localflow, /* we handle flow control locally */ - restartany, /* if flow control enabled, restart on any character */ - localchars, /* we recognize interrupt/quit */ - donelclchars, /* the user has set "localchars" */ - donebinarytoggle, /* the user has put us in binary */ - dontlecho, /* do we suppress local echoing right now? */ - globalmode; - -char *prompt = 0; - -int scheduler_lockout_tty = 0; - -cc_t escape; -cc_t rlogin; -#ifdef KLUDGELINEMODE -cc_t echoc; -#endif - -/* - * Telnet receiver states for fsm - */ -#define TS_DATA 0 -#define TS_IAC 1 -#define TS_WILL 2 -#define TS_WONT 3 -#define TS_DO 4 -#define TS_DONT 5 -#define TS_CR 6 -#define TS_SB 7 /* sub-option collection */ -#define TS_SE 8 /* looking for sub-option end */ - -static int telrcv_state; -#ifdef OLD_ENVIRON -unsigned char telopt_environ = TELOPT_NEW_ENVIRON; -#else -# define telopt_environ TELOPT_NEW_ENVIRON -#endif - -jmp_buf toplevel; -jmp_buf peerdied; - -int flushline; -int linemode; - -#ifdef KLUDGELINEMODE -int kludgelinemode = 1; -#endif - -/* - * The following are some clocks used to decide how to interpret - * the relationship between various variables. - */ - -Clocks clocks; - -static int is_unique(char *name, char **as, char **ae); - - -/* - * Initialize telnet environment. - */ - -void -init_telnet(void) -{ - env_init(); - - SB_CLEAR(); - memset(options, 0, sizeof options); - - connected = ISend = localflow = donebinarytoggle = 0; -#if defined(AUTHENTICATION) || defined(ENCRYPTION) - auth_encrypt_connect(connected); -#endif /* defined(AUTHENTICATION) || defined(ENCRYPTION) */ - restartany = -1; - - SYNCHing = 0; - - /* Don't change NetTrace */ - - escape = CONTROL(']'); - rlogin = _POSIX_VDISABLE; -#ifdef KLUDGELINEMODE - echoc = CONTROL('E'); -#endif - - flushline = 1; - telrcv_state = TS_DATA; -} - - -/* - * These routines are in charge of sending option negotiations - * to the other side. - * - * The basic idea is that we send the negotiation if either side - * is in disagreement as to what the current state should be. - */ - -void -send_do(int c, int init) -{ - if (init) { - if (((do_dont_resp[c] == 0) && my_state_is_do(c)) || - my_want_state_is_do(c)) - return; - set_my_want_state_do(c); - do_dont_resp[c]++; - } - NET2ADD(IAC, DO); - NETADD(c); - printoption("SENT", DO, c); -} - -void -send_dont(int c, int init) -{ - if (init) { - if (((do_dont_resp[c] == 0) && my_state_is_dont(c)) || - my_want_state_is_dont(c)) - return; - set_my_want_state_dont(c); - do_dont_resp[c]++; - } - NET2ADD(IAC, DONT); - NETADD(c); - printoption("SENT", DONT, c); -} - -void -send_will(int c, int init) -{ - if (init) { - if (((will_wont_resp[c] == 0) && my_state_is_will(c)) || - my_want_state_is_will(c)) - return; - set_my_want_state_will(c); - will_wont_resp[c]++; - } - NET2ADD(IAC, WILL); - NETADD(c); - printoption("SENT", WILL, c); -} - -void -send_wont(int c, int init) -{ - if (init) { - if (((will_wont_resp[c] == 0) && my_state_is_wont(c)) || - my_want_state_is_wont(c)) - return; - set_my_want_state_wont(c); - will_wont_resp[c]++; - } - NET2ADD(IAC, WONT); - NETADD(c); - printoption("SENT", WONT, c); -} - - -void -willoption(int option) -{ - int new_state_ok = 0; - - if (do_dont_resp[option]) { - --do_dont_resp[option]; - if (do_dont_resp[option] && my_state_is_do(option)) - --do_dont_resp[option]; - } - - if ((do_dont_resp[option] == 0) && my_want_state_is_dont(option)) { - - switch (option) { - - case TELOPT_ECHO: - case TELOPT_BINARY: - case TELOPT_SGA: - settimer(modenegotiated); - /* FALL THROUGH */ - case TELOPT_STATUS: -#if defined(AUTHENTICATION) - case TELOPT_AUTHENTICATION: -#endif -#if defined(ENCRYPTION) - case TELOPT_ENCRYPT: -#endif - new_state_ok = 1; - break; - - case TELOPT_TM: - if (flushout) - flushout = 0; - /* - * Special case for TM. If we get back a WILL, - * pretend we got back a WONT. - */ - set_my_want_state_dont(option); - set_my_state_dont(option); - return; /* Never reply to TM will's/wont's */ - - case TELOPT_LINEMODE: - default: - break; - } - - if (new_state_ok) { - set_my_want_state_do(option); - send_do(option, 0); - setconnmode(0); /* possibly set new tty mode */ - } else { - do_dont_resp[option]++; - send_dont(option, 0); - } - } - set_my_state_do(option); -#if defined(ENCRYPTION) - if (option == TELOPT_ENCRYPT) - encrypt_send_support(); -#endif -} - -void -wontoption(int option) -{ - if (do_dont_resp[option]) { - --do_dont_resp[option]; - if (do_dont_resp[option] && my_state_is_dont(option)) - --do_dont_resp[option]; - } - - if ((do_dont_resp[option] == 0) && my_want_state_is_do(option)) { - - switch (option) { - -#ifdef KLUDGELINEMODE - case TELOPT_SGA: - if (!kludgelinemode) - break; - /* FALL THROUGH */ -#endif - case TELOPT_ECHO: - settimer(modenegotiated); - break; - - case TELOPT_TM: - if (flushout) - flushout = 0; - set_my_want_state_dont(option); - set_my_state_dont(option); - return; /* Never reply to TM will's/wont's */ - -#ifdef ENCRYPTION - case TELOPT_ENCRYPT: - encrypt_not(); - break; -#endif - default: - break; - } - set_my_want_state_dont(option); - if (my_state_is_do(option)) - send_dont(option, 0); - setconnmode(0); /* Set new tty mode */ - } else if (option == TELOPT_TM) { - /* - * Special case for TM. - */ - if (flushout) - flushout = 0; - set_my_want_state_dont(option); - } - set_my_state_dont(option); -} - -static void -dooption(int option) -{ - int new_state_ok = 0; - - if (will_wont_resp[option]) { - --will_wont_resp[option]; - if (will_wont_resp[option] && my_state_is_will(option)) - --will_wont_resp[option]; - } - - if (will_wont_resp[option] == 0) { - if (my_want_state_is_wont(option)) { - - switch (option) { - - case TELOPT_TM: - /* - * Special case for TM. We send a WILL, but pretend - * we sent WONT. - */ - send_will(option, 0); - set_my_want_state_wont(TELOPT_TM); - set_my_state_wont(TELOPT_TM); - return; - - case TELOPT_BINARY: /* binary mode */ - case TELOPT_NAWS: /* window size */ - case TELOPT_TSPEED: /* terminal speed */ - case TELOPT_LFLOW: /* local flow control */ - case TELOPT_TTYPE: /* terminal type option */ - case TELOPT_SGA: /* no big deal */ -#if defined(ENCRYPTION) - case TELOPT_ENCRYPT: /* encryption variable option */ -#endif - new_state_ok = 1; - break; - - case TELOPT_NEW_ENVIRON: /* New environment variable option */ -#ifdef OLD_ENVIRON - if (my_state_is_will(TELOPT_OLD_ENVIRON)) - send_wont(TELOPT_OLD_ENVIRON, 1); /* turn off the old */ - goto env_common; - case TELOPT_OLD_ENVIRON: /* Old environment variable option */ - if (my_state_is_will(TELOPT_NEW_ENVIRON)) - break; /* Don't enable if new one is in use! */ - env_common: - telopt_environ = option; -#endif - new_state_ok = 1; - break; - -#if defined(AUTHENTICATION) - case TELOPT_AUTHENTICATION: - if (autologin) - new_state_ok = 1; - break; -#endif - - case TELOPT_XDISPLOC: /* X Display location */ - if (env_getvalue((unsigned char *)"DISPLAY")) - new_state_ok = 1; - break; - - case TELOPT_LINEMODE: -#ifdef KLUDGELINEMODE - kludgelinemode = 0; - send_do(TELOPT_SGA, 1); -#endif - set_my_want_state_will(TELOPT_LINEMODE); - send_will(option, 0); - set_my_state_will(TELOPT_LINEMODE); - slc_init(); - return; - - case TELOPT_ECHO: /* We're never going to echo... */ - default: - break; - } - - if (new_state_ok) { - set_my_want_state_will(option); - send_will(option, 0); - setconnmode(0); /* Set new tty mode */ - } else { - will_wont_resp[option]++; - send_wont(option, 0); - } - } else { - /* - * Handle options that need more things done after the - * other side has acknowledged the option. - */ - switch (option) { - case TELOPT_LINEMODE: -#ifdef KLUDGELINEMODE - kludgelinemode = 0; - send_do(TELOPT_SGA, 1); -#endif - set_my_state_will(option); - slc_init(); - send_do(TELOPT_SGA, 0); - return; - } - } - } - set_my_state_will(option); -} - -static void -dontoption(int option) -{ - - if (will_wont_resp[option]) { - --will_wont_resp[option]; - if (will_wont_resp[option] && my_state_is_wont(option)) - --will_wont_resp[option]; - } - - if ((will_wont_resp[option] == 0) && my_want_state_is_will(option)) { - switch (option) { - case TELOPT_LINEMODE: - linemode = 0; /* put us back to the default state */ - break; -#ifdef OLD_ENVIRON - case TELOPT_NEW_ENVIRON: - /* - * The new environ option wasn't recognized, try - * the old one. - */ - send_will(TELOPT_OLD_ENVIRON, 1); - telopt_environ = TELOPT_OLD_ENVIRON; - break; -#endif -#if 0 -#ifdef ENCRYPTION - case TELOPT_ENCRYPT: - encrypt_not(); - break; -#endif -#endif - } - /* we always accept a DONT */ - set_my_want_state_wont(option); - if (my_state_is_will(option)) - send_wont(option, 0); - setconnmode(0); /* Set new tty mode */ - } - set_my_state_wont(option); -} - -/* - * Given a buffer returned by tgetent(), this routine will turn - * the pipe separated list of names in the buffer into an array - * of pointers to null terminated names. We toss out any bad, - * duplicate, or verbose names (names with spaces). - */ - -static char *name_unknown = "UNKNOWN"; -static char *unknown[] = { 0, 0 }; - -static char ** -mklist(char *buf, char *name) -{ - int n; - char c, *cp, **argvp, *cp2, **argv, **avt; - - if (name) { - if ((int)strlen(name) > 40) { - name = 0; - unknown[0] = name_unknown; - } else { - unknown[0] = name; - strupr(name); - } - } else - unknown[0] = name_unknown; - /* - * Count up the number of names. - */ - for (n = 1, cp = buf; *cp && *cp != ':'; cp++) { - if (*cp == '|') - n++; - } - /* - * Allocate an array to put the name pointers into - */ - argv = (char **)malloc((n+3)*sizeof(char *)); - if (argv == 0) - return(unknown); - - /* - * Fill up the array of pointers to names. - */ - *argv = 0; - argvp = argv+1; - n = 0; - for (cp = cp2 = buf; (c = *cp); cp++) { - if (c == '|' || c == ':') { - *cp++ = '\0'; - /* - * Skip entries that have spaces or are over 40 - * characters long. If this is our environment - * name, then put it up front. Otherwise, as - * long as this is not a duplicate name (case - * insensitive) add it to the list. - */ - if (n || (cp - cp2 > 41)) - ; - else if (name && (strncasecmp(name, cp2, cp-cp2) == 0)) - *argv = cp2; - else if (is_unique(cp2, argv+1, argvp)) - *argvp++ = cp2; - if (c == ':') - break; - /* - * Skip multiple delimiters. Reset cp2 to - * the beginning of the next name. Reset n, - * the flag for names with spaces. - */ - while ((c = *cp) == '|') - cp++; - cp2 = cp; - n = 0; - } - /* - * Skip entries with spaces or non-ascii values. - * Convert lower case letters to upper case. - */ -#undef ISASCII -#define ISASCII(c) (!((c)&0x80)) - if ((c == ' ') || !ISASCII(c)) - n = 1; - else if (islower((unsigned char)c)) - *cp = toupper((unsigned char)c); - } - - /* - * Check for an old V6 2 character name. If the second - * name points to the beginning of the buffer, and is - * only 2 characters long, move it to the end of the array. - */ - if ((argv[1] == buf) && (strlen(argv[1]) == 2)) { - --argvp; - for (avt = &argv[1]; avt < argvp; avt++) - *avt = *(avt+1); - *argvp++ = buf; - } - - /* - * Duplicate last name, for TTYPE option, and null - * terminate the array. If we didn't find a match on - * our terminal name, put that name at the beginning. - */ - cp = *(argvp-1); - *argvp++ = cp; - *argvp = 0; - - if (*argv == 0) { - if (name) - *argv = name; - else { - --argvp; - for (avt = argv; avt < argvp; avt++) - *avt = *(avt+1); - } - } - if (*argv) - return(argv); - else - return(unknown); -} - -static int -is_unique(char *name, char **as, char **ae) -{ - char **ap; - int n; - - n = strlen(name) + 1; - for (ap = as; ap < ae; ap++) - if (strncasecmp(*ap, name, n) == 0) - return(0); - return (1); -} - -static char termbuf[1024]; - -static int -telnet_setupterm(const char *tname, int fd, int *errp) -{ -#ifdef HAVE_TGETENT - if (tgetent(termbuf, tname) == 1) { - termbuf[1023] = '\0'; - if (errp) - *errp = 1; - return(0); - } - if (errp) - *errp = 0; - return(-1); -#else - strlcpy(termbuf, tname, sizeof(termbuf)); - if(errp) *errp = 1; - return 0; -#endif -} - -int resettermname = 1; - -static char * -gettermname() -{ - char *tname; - static char **tnamep = 0; - static char **next; - int err; - - if (resettermname) { - resettermname = 0; - if (tnamep && tnamep != unknown) - free(tnamep); - if ((tname = (char *)env_getvalue((unsigned char *)"TERM")) && - telnet_setupterm(tname, 1, &err) == 0) { - tnamep = mklist(termbuf, tname); - } else { - if (tname && ((int)strlen(tname) <= 40)) { - unknown[0] = tname; - strupr(tname); - } else - unknown[0] = name_unknown; - tnamep = unknown; - } - next = tnamep; - } - if (*next == 0) - next = tnamep; - return(*next++); -} -/* - * suboption() - * - * Look at the sub-option buffer, and try to be helpful to the other - * side. - * - * Currently we recognize: - * - * Terminal type, send request. - * Terminal speed (send request). - * Local flow control (is request). - * Linemode - */ - -static void -suboption() -{ - unsigned char subchar; - - printsub('<', subbuffer, SB_LEN()+2); - switch (subchar = SB_GET()) { - case TELOPT_TTYPE: - if (my_want_state_is_wont(TELOPT_TTYPE)) - return; - if (SB_EOF() || SB_GET() != TELQUAL_SEND) { - return; - } else { - char *name; - unsigned char temp[50]; - int len; - - name = gettermname(); - len = strlen(name) + 4 + 2; - if (len < NETROOM()) { - snprintf((char *)temp, sizeof(temp), - "%c%c%c%c%s%c%c", IAC, SB, TELOPT_TTYPE, - TELQUAL_IS, name, IAC, SE); - ring_supply_data(&netoring, temp, len); - printsub('>', &temp[2], len-2); - } else { - ExitString("No room in buffer for terminal type.\n", 1); - /*NOTREACHED*/ - } - } - break; - case TELOPT_TSPEED: - if (my_want_state_is_wont(TELOPT_TSPEED)) - return; - if (SB_EOF()) - return; - if (SB_GET() == TELQUAL_SEND) { - long output_speed, input_speed; - unsigned char temp[50]; - int len; - - TerminalSpeeds(&input_speed, &output_speed); - - snprintf((char *)temp, sizeof(temp), - "%c%c%c%c%u,%u%c%c", IAC, SB, TELOPT_TSPEED, - TELQUAL_IS, - (unsigned)output_speed, - (unsigned)input_speed, IAC, SE); - len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */ - - if (len < NETROOM()) { - ring_supply_data(&netoring, temp, len); - printsub('>', temp+2, len - 2); - } -/*@*/ else printf("lm_will: not enough room in buffer\n"); - } - break; - case TELOPT_LFLOW: - if (my_want_state_is_wont(TELOPT_LFLOW)) - return; - if (SB_EOF()) - return; - switch(SB_GET()) { - case LFLOW_RESTART_ANY: - restartany = 1; - break; - case LFLOW_RESTART_XON: - restartany = 0; - break; - case LFLOW_ON: - localflow = 1; - break; - case LFLOW_OFF: - localflow = 0; - break; - default: - return; - } - setcommandmode(); - setconnmode(0); - break; - - case TELOPT_LINEMODE: - if (my_want_state_is_wont(TELOPT_LINEMODE)) - return; - if (SB_EOF()) - return; - switch (SB_GET()) { - case WILL: - lm_will(subpointer, SB_LEN()); - break; - case WONT: - lm_wont(subpointer, SB_LEN()); - break; - case DO: - lm_do(subpointer, SB_LEN()); - break; - case DONT: - lm_dont(subpointer, SB_LEN()); - break; - case LM_SLC: - slc(subpointer, SB_LEN()); - break; - case LM_MODE: - lm_mode(subpointer, SB_LEN(), 0); - break; - default: - break; - } - break; - -#ifdef OLD_ENVIRON - case TELOPT_OLD_ENVIRON: -#endif - case TELOPT_NEW_ENVIRON: - if (SB_EOF()) - return; - switch(SB_PEEK()) { - case TELQUAL_IS: - case TELQUAL_INFO: - if (my_want_state_is_dont(subchar)) - return; - break; - case TELQUAL_SEND: - if (my_want_state_is_wont(subchar)) { - return; - } - break; - default: - return; - } - env_opt(subpointer, SB_LEN()); - break; - - case TELOPT_XDISPLOC: - if (my_want_state_is_wont(TELOPT_XDISPLOC)) - return; - if (SB_EOF()) - return; - if (SB_GET() == TELQUAL_SEND) { - unsigned char temp[50], *dp; - int len; - - if ((dp = env_getvalue((unsigned char *)"DISPLAY")) == NULL) { - /* - * Something happened, we no longer have a DISPLAY - * variable. So, turn off the option. - */ - send_wont(TELOPT_XDISPLOC, 1); - break; - } - snprintf((char *)temp, sizeof(temp), - "%c%c%c%c%s%c%c", IAC, SB, TELOPT_XDISPLOC, - TELQUAL_IS, dp, IAC, SE); - len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */ - - if (len < NETROOM()) { - ring_supply_data(&netoring, temp, len); - printsub('>', temp+2, len - 2); - } -/*@*/ else printf("lm_will: not enough room in buffer\n"); - } - break; - -#if defined(AUTHENTICATION) - case TELOPT_AUTHENTICATION: { - if (!autologin) - break; - if (SB_EOF()) - return; - switch(SB_GET()) { - case TELQUAL_IS: - if (my_want_state_is_dont(TELOPT_AUTHENTICATION)) - return; - auth_is(subpointer, SB_LEN()); - break; - case TELQUAL_SEND: - if (my_want_state_is_wont(TELOPT_AUTHENTICATION)) - return; - auth_send(subpointer, SB_LEN()); - break; - case TELQUAL_REPLY: - if (my_want_state_is_wont(TELOPT_AUTHENTICATION)) - return; - auth_reply(subpointer, SB_LEN()); - break; - case TELQUAL_NAME: - if (my_want_state_is_dont(TELOPT_AUTHENTICATION)) - return; - auth_name(subpointer, SB_LEN()); - break; - } - } - break; -#endif -#if defined(ENCRYPTION) - case TELOPT_ENCRYPT: - if (SB_EOF()) - return; - switch(SB_GET()) { - case ENCRYPT_START: - if (my_want_state_is_dont(TELOPT_ENCRYPT)) - return; - encrypt_start(subpointer, SB_LEN()); - break; - case ENCRYPT_END: - if (my_want_state_is_dont(TELOPT_ENCRYPT)) - return; - encrypt_end(); - break; - case ENCRYPT_SUPPORT: - if (my_want_state_is_wont(TELOPT_ENCRYPT)) - return; - encrypt_support(subpointer, SB_LEN()); - break; - case ENCRYPT_REQSTART: - if (my_want_state_is_wont(TELOPT_ENCRYPT)) - return; - encrypt_request_start(subpointer, SB_LEN()); - break; - case ENCRYPT_REQEND: - if (my_want_state_is_wont(TELOPT_ENCRYPT)) - return; - /* - * We can always send an REQEND so that we cannot - * get stuck encrypting. We should only get this - * if we have been able to get in the correct mode - * anyhow. - */ - encrypt_request_end(); - break; - case ENCRYPT_IS: - if (my_want_state_is_dont(TELOPT_ENCRYPT)) - return; - encrypt_is(subpointer, SB_LEN()); - break; - case ENCRYPT_REPLY: - if (my_want_state_is_wont(TELOPT_ENCRYPT)) - return; - encrypt_reply(subpointer, SB_LEN()); - break; - case ENCRYPT_ENC_KEYID: - if (my_want_state_is_dont(TELOPT_ENCRYPT)) - return; - encrypt_enc_keyid(subpointer, SB_LEN()); - break; - case ENCRYPT_DEC_KEYID: - if (my_want_state_is_wont(TELOPT_ENCRYPT)) - return; - encrypt_dec_keyid(subpointer, SB_LEN()); - break; - default: - break; - } - break; -#endif - default: - break; - } -} - -static unsigned char str_lm[] = { IAC, SB, TELOPT_LINEMODE, 0, 0, IAC, SE }; - -void -lm_will(unsigned char *cmd, int len) -{ - if (len < 1) { -/*@*/ printf("lm_will: no command!!!\n"); /* Should not happen... */ - return; - } - switch(cmd[0]) { - case LM_FORWARDMASK: /* We shouldn't ever get this... */ - default: - str_lm[3] = DONT; - str_lm[4] = cmd[0]; - if (NETROOM() > sizeof(str_lm)) { - ring_supply_data(&netoring, str_lm, sizeof(str_lm)); - printsub('>', &str_lm[2], sizeof(str_lm)-2); - } -/*@*/ else printf("lm_will: not enough room in buffer\n"); - break; - } -} - -void -lm_wont(unsigned char *cmd, int len) -{ - if (len < 1) { -/*@*/ printf("lm_wont: no command!!!\n"); /* Should not happen... */ - return; - } - switch(cmd[0]) { - case LM_FORWARDMASK: /* We shouldn't ever get this... */ - default: - /* We are always DONT, so don't respond */ - return; - } -} - -void -lm_do(unsigned char *cmd, int len) -{ - if (len < 1) { -/*@*/ printf("lm_do: no command!!!\n"); /* Should not happen... */ - return; - } - switch(cmd[0]) { - case LM_FORWARDMASK: - default: - str_lm[3] = WONT; - str_lm[4] = cmd[0]; - if (NETROOM() > sizeof(str_lm)) { - ring_supply_data(&netoring, str_lm, sizeof(str_lm)); - printsub('>', &str_lm[2], sizeof(str_lm)-2); - } -/*@*/ else printf("lm_do: not enough room in buffer\n"); - break; - } -} - -void -lm_dont(unsigned char *cmd, int len) -{ - if (len < 1) { -/*@*/ printf("lm_dont: no command!!!\n"); /* Should not happen... */ - return; - } - switch(cmd[0]) { - case LM_FORWARDMASK: - default: - /* we are always WONT, so don't respond */ - break; - } -} - -static unsigned char str_lm_mode[] = { - IAC, SB, TELOPT_LINEMODE, LM_MODE, 0, IAC, SE -}; - -void -lm_mode(unsigned char *cmd, int len, int init) -{ - if (len != 1) - return; - if ((linemode&MODE_MASK&~MODE_ACK) == *cmd) - return; - if (*cmd&MODE_ACK) - return; - linemode = *cmd&(MODE_MASK&~MODE_ACK); - str_lm_mode[4] = linemode; - if (!init) - str_lm_mode[4] |= MODE_ACK; - if (NETROOM() > sizeof(str_lm_mode)) { - ring_supply_data(&netoring, str_lm_mode, sizeof(str_lm_mode)); - printsub('>', &str_lm_mode[2], sizeof(str_lm_mode)-2); - } -/*@*/ else printf("lm_mode: not enough room in buffer\n"); - setconnmode(0); /* set changed mode */ -} - - - -/* - * slc() - * Handle special character suboption of LINEMODE. - */ - -struct spc { - cc_t val; - cc_t *valp; - char flags; /* Current flags & level */ - char mylevel; /* Maximum level & flags */ -} spc_data[NSLC+1]; - -#define SLC_IMPORT 0 -#define SLC_EXPORT 1 -#define SLC_RVALUE 2 -static int slc_mode = SLC_EXPORT; - -void -slc_init() -{ - struct spc *spcp; - - localchars = 1; - for (spcp = spc_data; spcp < &spc_data[NSLC+1]; spcp++) { - spcp->val = 0; - spcp->valp = 0; - spcp->flags = spcp->mylevel = SLC_NOSUPPORT; - } - -#define initfunc(func, flags) { \ - spcp = &spc_data[func]; \ - if ((spcp->valp = tcval(func))) { \ - spcp->val = *spcp->valp; \ - spcp->mylevel = SLC_VARIABLE|flags; \ - } else { \ - spcp->val = 0; \ - spcp->mylevel = SLC_DEFAULT; \ - } \ - } - - initfunc(SLC_SYNCH, 0); - /* No BRK */ - initfunc(SLC_AO, 0); - initfunc(SLC_AYT, 0); - /* No EOR */ - initfunc(SLC_ABORT, SLC_FLUSHIN|SLC_FLUSHOUT); - initfunc(SLC_EOF, 0); - initfunc(SLC_SUSP, SLC_FLUSHIN); - initfunc(SLC_EC, 0); - initfunc(SLC_EL, 0); - initfunc(SLC_EW, 0); - initfunc(SLC_RP, 0); - initfunc(SLC_LNEXT, 0); - initfunc(SLC_XON, 0); - initfunc(SLC_XOFF, 0); - initfunc(SLC_FORW1, 0); - initfunc(SLC_FORW2, 0); - /* No FORW2 */ - - initfunc(SLC_IP, SLC_FLUSHIN|SLC_FLUSHOUT); -#undef initfunc - - if (slc_mode == SLC_EXPORT) - slc_export(); - else - slc_import(1); - -} - -void -slcstate() -{ - printf("Special characters are %s values\n", - slc_mode == SLC_IMPORT ? "remote default" : - slc_mode == SLC_EXPORT ? "local" : - "remote"); -} - -void -slc_mode_export() -{ - slc_mode = SLC_EXPORT; - if (my_state_is_will(TELOPT_LINEMODE)) - slc_export(); -} - -void -slc_mode_import(int def) -{ - slc_mode = def ? SLC_IMPORT : SLC_RVALUE; - if (my_state_is_will(TELOPT_LINEMODE)) - slc_import(def); -} - -unsigned char slc_import_val[] = { - IAC, SB, TELOPT_LINEMODE, LM_SLC, 0, SLC_VARIABLE, 0, IAC, SE -}; -unsigned char slc_import_def[] = { - IAC, SB, TELOPT_LINEMODE, LM_SLC, 0, SLC_DEFAULT, 0, IAC, SE -}; - -void -slc_import(int def) -{ - if (NETROOM() > sizeof(slc_import_val)) { - if (def) { - ring_supply_data(&netoring, slc_import_def, sizeof(slc_import_def)); - printsub('>', &slc_import_def[2], sizeof(slc_import_def)-2); - } else { - ring_supply_data(&netoring, slc_import_val, sizeof(slc_import_val)); - printsub('>', &slc_import_val[2], sizeof(slc_import_val)-2); - } - } -/*@*/ else printf("slc_import: not enough room\n"); -} - -void -slc_export() -{ - struct spc *spcp; - - TerminalDefaultChars(); - - slc_start_reply(); - for (spcp = &spc_data[1]; spcp < &spc_data[NSLC+1]; spcp++) { - if (spcp->mylevel != SLC_NOSUPPORT) { - if (spcp->val == (cc_t)(_POSIX_VDISABLE)) - spcp->flags = SLC_NOSUPPORT; - else - spcp->flags = spcp->mylevel; - if (spcp->valp) - spcp->val = *spcp->valp; - slc_add_reply(spcp - spc_data, spcp->flags, spcp->val); - } - } - slc_end_reply(); - slc_update(); - setconnmode(1); /* Make sure the character values are set */ -} - -void -slc(unsigned char *cp, int len) -{ - struct spc *spcp; - int func,level; - - slc_start_reply(); - - for (; len >= 3; len -=3, cp +=3) { - - func = cp[SLC_FUNC]; - - if (func == 0) { - /* - * Client side: always ignore 0 function. - */ - continue; - } - if (func > NSLC) { - if ((cp[SLC_FLAGS] & SLC_LEVELBITS) != SLC_NOSUPPORT) - slc_add_reply(func, SLC_NOSUPPORT, 0); - continue; - } - - spcp = &spc_data[func]; - - level = cp[SLC_FLAGS]&(SLC_LEVELBITS|SLC_ACK); - - if ((cp[SLC_VALUE] == (unsigned char)spcp->val) && - ((level&SLC_LEVELBITS) == (spcp->flags&SLC_LEVELBITS))) { - continue; - } - - if (level == (SLC_DEFAULT|SLC_ACK)) { - /* - * This is an error condition, the SLC_ACK - * bit should never be set for the SLC_DEFAULT - * level. Our best guess to recover is to - * ignore the SLC_ACK bit. - */ - cp[SLC_FLAGS] &= ~SLC_ACK; - } - - if (level == ((spcp->flags&SLC_LEVELBITS)|SLC_ACK)) { - spcp->val = (cc_t)cp[SLC_VALUE]; - spcp->flags = cp[SLC_FLAGS]; /* include SLC_ACK */ - continue; - } - - level &= ~SLC_ACK; - - if (level <= (spcp->mylevel&SLC_LEVELBITS)) { - spcp->flags = cp[SLC_FLAGS]|SLC_ACK; - spcp->val = (cc_t)cp[SLC_VALUE]; - } - if (level == SLC_DEFAULT) { - if ((spcp->mylevel&SLC_LEVELBITS) != SLC_DEFAULT) - spcp->flags = spcp->mylevel; - else - spcp->flags = SLC_NOSUPPORT; - } - slc_add_reply(func, spcp->flags, spcp->val); - } - slc_end_reply(); - if (slc_update()) - setconnmode(1); /* set the new character values */ -} - -void -slc_check() -{ - struct spc *spcp; - - slc_start_reply(); - for (spcp = &spc_data[1]; spcp < &spc_data[NSLC+1]; spcp++) { - if (spcp->valp && spcp->val != *spcp->valp) { - spcp->val = *spcp->valp; - if (spcp->val == (cc_t)(_POSIX_VDISABLE)) - spcp->flags = SLC_NOSUPPORT; - else - spcp->flags = spcp->mylevel; - slc_add_reply(spcp - spc_data, spcp->flags, spcp->val); - } - } - slc_end_reply(); - setconnmode(1); -} - - -unsigned char slc_reply[128]; -unsigned char const * const slc_reply_eom = &slc_reply[sizeof(slc_reply)]; -unsigned char *slc_replyp; - -void -slc_start_reply() -{ - slc_replyp = slc_reply; - *slc_replyp++ = IAC; - *slc_replyp++ = SB; - *slc_replyp++ = TELOPT_LINEMODE; - *slc_replyp++ = LM_SLC; -} - -void -slc_add_reply(unsigned char func, unsigned char flags, cc_t value) -{ - /* A sequence of up to 6 bytes my be written for this member of the SLC - * suboption list by this function. The end of negotiation command, - * which is written by slc_end_reply(), will require 2 additional - * bytes. Do not proceed unless there is sufficient space for these - * items. - */ - if (&slc_replyp[6+2] > slc_reply_eom) - return; - if ((*slc_replyp++ = func) == IAC) - *slc_replyp++ = IAC; - if ((*slc_replyp++ = flags) == IAC) - *slc_replyp++ = IAC; - if ((*slc_replyp++ = (unsigned char)value) == IAC) - *slc_replyp++ = IAC; -} - -void -slc_end_reply() -{ - int len; - - /* The end of negotiation command requires 2 bytes. */ - if (&slc_replyp[2] > slc_reply_eom) - return; - *slc_replyp++ = IAC; - *slc_replyp++ = SE; - len = slc_replyp - slc_reply; - if (len <= 6) - return; - if (NETROOM() > len) { - ring_supply_data(&netoring, slc_reply, slc_replyp - slc_reply); - printsub('>', &slc_reply[2], slc_replyp - slc_reply - 2); - } -/*@*/else printf("slc_end_reply: not enough room\n"); -} - -int -slc_update() -{ - struct spc *spcp; - int need_update = 0; - - for (spcp = &spc_data[1]; spcp < &spc_data[NSLC+1]; spcp++) { - if (!(spcp->flags&SLC_ACK)) - continue; - spcp->flags &= ~SLC_ACK; - if (spcp->valp && (*spcp->valp != spcp->val)) { - *spcp->valp = spcp->val; - need_update = 1; - } - } - return(need_update); -} - -#ifdef OLD_ENVIRON -# define old_env_var OLD_ENV_VAR -# define old_env_value OLD_ENV_VALUE -#endif - -void -env_opt(unsigned char *buf, int len) -{ - unsigned char *ep = 0, *epc = 0; - int i; - - switch(buf[0]&0xff) { - case TELQUAL_SEND: - env_opt_start(); - if (len == 1) { - env_opt_add(NULL); - } else for (i = 1; i < len; i++) { - switch (buf[i]&0xff) { -#ifdef OLD_ENVIRON - case OLD_ENV_VAR: - case OLD_ENV_VALUE: - /* - * Although OLD_ENV_VALUE is not legal, we will - * still recognize it, just in case it is an - * old server that has VAR & VALUE mixed up... - */ - /* FALL THROUGH */ -#else - case NEW_ENV_VAR: -#endif - case ENV_USERVAR: - if (ep) { - *epc = 0; - env_opt_add(ep); - } - ep = epc = &buf[i+1]; - break; - case ENV_ESC: - i++; - /*FALL THROUGH*/ - default: - if (epc) - *epc++ = buf[i]; - break; - } - } - if (ep) { - *epc = 0; - env_opt_add(ep); - } - env_opt_end(1); - break; - - case TELQUAL_IS: - case TELQUAL_INFO: - /* Ignore for now. We shouldn't get it anyway. */ - break; - - default: - break; - } -} - -#define OPT_REPLY_SIZE (2 * SUBBUFSIZE) -unsigned char *opt_reply; -unsigned char *opt_replyp; -unsigned char *opt_replyend; - -void -env_opt_start() -{ - if (opt_reply) { - void *tmp = realloc (opt_reply, OPT_REPLY_SIZE); - if (tmp != NULL) { - opt_reply = tmp; - } else { - free (opt_reply); - opt_reply = NULL; - } - } else - opt_reply = (unsigned char *)malloc(OPT_REPLY_SIZE); - if (opt_reply == NULL) { -/*@*/ printf("env_opt_start: malloc()/realloc() failed!!!\n"); - opt_reply = opt_replyp = opt_replyend = NULL; - return; - } - opt_replyp = opt_reply; - opt_replyend = opt_reply + OPT_REPLY_SIZE; - *opt_replyp++ = IAC; - *opt_replyp++ = SB; - *opt_replyp++ = telopt_environ; - *opt_replyp++ = TELQUAL_IS; -} - -void -env_opt_start_info() -{ - env_opt_start(); - if (opt_replyp) - opt_replyp[-1] = TELQUAL_INFO; -} - -void -env_opt_add(unsigned char *ep) -{ - unsigned char *vp, c; - - if (opt_reply == NULL) /*XXX*/ - return; /*XXX*/ - - if (ep == NULL || *ep == '\0') { - /* Send user defined variables first. */ - env_default(1, 0); - while ((ep = env_default(0, 0))) - env_opt_add(ep); - - /* Now add the list of well know variables. */ - env_default(1, 1); - while ((ep = env_default(0, 1))) - env_opt_add(ep); - return; - } - vp = env_getvalue(ep); - if (opt_replyp + (vp ? 2 * strlen((char *)vp) : 0) + - 2 * strlen((char *)ep) + 6 > opt_replyend) - { - int len; - void *tmp; - opt_replyend += OPT_REPLY_SIZE; - len = opt_replyend - opt_reply; - tmp = realloc(opt_reply, len); - if (tmp == NULL) { -/*@*/ printf("env_opt_add: realloc() failed!!!\n"); - opt_reply = opt_replyp = opt_replyend = NULL; - return; - } - opt_reply = tmp; - opt_replyp = opt_reply + len - (opt_replyend - opt_replyp); - opt_replyend = opt_reply + len; - } - if (opt_welldefined((char *)ep)) { -#ifdef OLD_ENVIRON - if (telopt_environ == TELOPT_OLD_ENVIRON) - *opt_replyp++ = old_env_var; - else -#endif - *opt_replyp++ = NEW_ENV_VAR; - } else - *opt_replyp++ = ENV_USERVAR; - for (;;) { - while ((c = *ep++)) { - if (opt_replyp + (2 + 2) > opt_replyend) - return; - switch(c&0xff) { - case IAC: - *opt_replyp++ = IAC; - break; - case NEW_ENV_VAR: - case NEW_ENV_VALUE: - case ENV_ESC: - case ENV_USERVAR: - *opt_replyp++ = ENV_ESC; - break; - } - *opt_replyp++ = c; - } - if ((ep = vp)) { - if (opt_replyp + (1 + 2 + 2) > opt_replyend) - return; -#ifdef OLD_ENVIRON - if (telopt_environ == TELOPT_OLD_ENVIRON) - *opt_replyp++ = old_env_value; - else -#endif - *opt_replyp++ = NEW_ENV_VALUE; - vp = NULL; - } else - break; - } -} - -int -opt_welldefined(char *ep) -{ - if ((strcmp(ep, "USER") == 0) || - (strcmp(ep, "DISPLAY") == 0) || - (strcmp(ep, "PRINTER") == 0) || - (strcmp(ep, "SYSTEMTYPE") == 0) || - (strcmp(ep, "JOB") == 0) || - (strcmp(ep, "ACCT") == 0)) - return(1); - return(0); -} - -void -env_opt_end(int emptyok) -{ - int len; - - if (opt_replyp + 2 > opt_replyend) - return; - len = opt_replyp + 2 - opt_reply; - if (emptyok || len > 6) { - *opt_replyp++ = IAC; - *opt_replyp++ = SE; - if (NETROOM() > len) { - ring_supply_data(&netoring, opt_reply, len); - printsub('>', &opt_reply[2], len - 2); - } -/*@*/ else printf("slc_end_reply: not enough room\n"); - } - if (opt_reply) { - free(opt_reply); - opt_reply = opt_replyp = opt_replyend = NULL; - } -} - - - -int -telrcv(void) -{ - int c; - int scc; - unsigned char *sbp = NULL; - int count; - int returnValue = 0; - - scc = 0; - count = 0; - while (TTYROOM() > 2) { - if (scc == 0) { - if (count) { - ring_consumed(&netiring, count); - returnValue = 1; - count = 0; - } - sbp = netiring.consume; - scc = ring_full_consecutive(&netiring); - if (scc == 0) { - /* No more data coming in */ - break; - } - } - - c = *sbp++ & 0xff, scc--; count++; -#if defined(ENCRYPTION) - if (decrypt_input) - c = (*decrypt_input)(c); -#endif - - switch (telrcv_state) { - - case TS_CR: - telrcv_state = TS_DATA; - if (c == '\0') { - break; /* Ignore \0 after CR */ - } - else if ((c == '\n') && my_want_state_is_dont(TELOPT_ECHO) && !crmod) { - TTYADD(c); - break; - } - /* Else, fall through */ - - case TS_DATA: - if (c == IAC) { - telrcv_state = TS_IAC; - break; - } - /* - * The 'crmod' hack (see following) is needed - * since we can't set CRMOD on output only. - * Machines like MULTICS like to send \r without - * \n; since we must turn off CRMOD to get proper - * input, the mapping is done here (sigh). - */ - if ((c == '\r') && my_want_state_is_dont(TELOPT_BINARY)) { - if (scc > 0) { - c = *sbp&0xff; -#if defined(ENCRYPTION) - if (decrypt_input) - c = (*decrypt_input)(c); -#endif - if (c == 0) { - sbp++, scc--; count++; - /* a "true" CR */ - TTYADD('\r'); - } else if (my_want_state_is_dont(TELOPT_ECHO) && - (c == '\n')) { - sbp++, scc--; count++; - TTYADD('\n'); - } else { -#if defined(ENCRYPTION) - if (decrypt_input) - (*decrypt_input)(-1); -#endif - - TTYADD('\r'); - if (crmod) { - TTYADD('\n'); - } - } - } else { - telrcv_state = TS_CR; - TTYADD('\r'); - if (crmod) { - TTYADD('\n'); - } - } - } else { - TTYADD(c); - } - continue; - - case TS_IAC: -process_iac: - switch (c) { - - case WILL: - telrcv_state = TS_WILL; - continue; - - case WONT: - telrcv_state = TS_WONT; - continue; - - case DO: - telrcv_state = TS_DO; - continue; - - case DONT: - telrcv_state = TS_DONT; - continue; - - case DM: - /* - * We may have missed an urgent notification, - * so make sure we flush whatever is in the - * buffer currently. - */ - printoption("RCVD", IAC, DM); - SYNCHing = 1; - ttyflush(1); - SYNCHing = stilloob(); - settimer(gotDM); - break; - - case SB: - SB_CLEAR(); - telrcv_state = TS_SB; - continue; - - - case IAC: - TTYADD(IAC); - break; - - case NOP: - case GA: - default: - printoption("RCVD", IAC, c); - break; - } - telrcv_state = TS_DATA; - continue; - - case TS_WILL: - printoption("RCVD", WILL, c); - willoption(c); - telrcv_state = TS_DATA; - continue; - - case TS_WONT: - printoption("RCVD", WONT, c); - wontoption(c); - telrcv_state = TS_DATA; - continue; - - case TS_DO: - printoption("RCVD", DO, c); - dooption(c); - if (c == TELOPT_NAWS) { - sendnaws(); - } else if (c == TELOPT_LFLOW) { - localflow = 1; - setcommandmode(); - setconnmode(0); - } - telrcv_state = TS_DATA; - continue; - - case TS_DONT: - printoption("RCVD", DONT, c); - dontoption(c); - flushline = 1; - setconnmode(0); /* set new tty mode (maybe) */ - telrcv_state = TS_DATA; - continue; - - case TS_SB: - if (c == IAC) { - telrcv_state = TS_SE; - } else { - SB_ACCUM(c); - } - continue; - - case TS_SE: - if (c != SE) { - if (c != IAC) { - /* - * This is an error. We only expect to get - * "IAC IAC" or "IAC SE". Several things may - * have happened. An IAC was not doubled, the - * IAC SE was left off, or another option got - * inserted into the suboption are all possibilities. - * If we assume that the IAC was not doubled, - * and really the IAC SE was left off, we could - * get into an infinite loop here. So, instead, - * we terminate the suboption, and process the - * partial suboption if we can. - */ - SB_ACCUM(IAC); - SB_ACCUM(c); - subpointer -= 2; - SB_TERM(); - - printoption("In SUBOPTION processing, RCVD", IAC, c); - suboption(); /* handle sub-option */ - telrcv_state = TS_IAC; - goto process_iac; - } - SB_ACCUM(c); - telrcv_state = TS_SB; - } else { - SB_ACCUM(IAC); - SB_ACCUM(SE); - subpointer -= 2; - SB_TERM(); - suboption(); /* handle sub-option */ - telrcv_state = TS_DATA; - } - } - } - if (count) - ring_consumed(&netiring, count); - return returnValue||count; -} - -static int bol = 1, local = 0; - -int -rlogin_susp(void) -{ - if (local) { - local = 0; - bol = 1; - command(0, "z\n", 2); - return(1); - } - return(0); -} - -static int -telsnd() -{ - int tcc; - int count; - int returnValue = 0; - unsigned char *tbp = NULL; - - tcc = 0; - count = 0; - while (NETROOM() > 2) { - int sc; - int c; - - if (tcc == 0) { - if (count) { - ring_consumed(&ttyiring, count); - returnValue = 1; - count = 0; - } - tbp = ttyiring.consume; - tcc = ring_full_consecutive(&ttyiring); - if (tcc == 0) { - break; - } - } - c = *tbp++ & 0xff, sc = strip(c), tcc--; count++; - if (rlogin != _POSIX_VDISABLE) { - if (bol) { - bol = 0; - if (sc == rlogin) { - local = 1; - continue; - } - } else if (local) { - local = 0; - if (sc == '.' || c == termEofChar) { - bol = 1; - command(0, "close\n", 6); - continue; - } - if (sc == termSuspChar) { - bol = 1; - command(0, "z\n", 2); - continue; - } - if (sc == escape) { - command(0, (char *)tbp, tcc); - bol = 1; - count += tcc; - tcc = 0; - flushline = 1; - break; - } - if (sc != rlogin) { - ++tcc; - --tbp; - --count; - c = sc = rlogin; - } - } - if ((sc == '\n') || (sc == '\r')) - bol = 1; - } else if (sc == escape) { - /* - * Double escape is a pass through of a single escape character. - */ - if (tcc && strip(*tbp) == escape) { - tbp++; - tcc--; - count++; - bol = 0; - } else { - command(0, (char *)tbp, tcc); - bol = 1; - count += tcc; - tcc = 0; - flushline = 1; - break; - } - } else - bol = 0; -#ifdef KLUDGELINEMODE - if (kludgelinemode && (globalmode&MODE_EDIT) && (sc == echoc)) { - if (tcc > 0 && strip(*tbp) == echoc) { - tcc--; tbp++; count++; - } else { - dontlecho = !dontlecho; - settimer(echotoggle); - setconnmode(0); - flushline = 1; - break; - } - } -#endif - if (MODE_LOCAL_CHARS(globalmode)) { - if (TerminalSpecialChars(sc) == 0) { - bol = 1; - break; - } - } - if (my_want_state_is_wont(TELOPT_BINARY)) { - switch (c) { - case '\n': - /* - * If we are in CRMOD mode (\r ==> \n) - * on our local machine, then probably - * a newline (unix) is CRLF (TELNET). - */ - if (MODE_LOCAL_CHARS(globalmode)) { - NETADD('\r'); - } - NETADD('\n'); - bol = flushline = 1; - break; - case '\r': - if (!crlf) { - NET2ADD('\r', '\0'); - } else { - NET2ADD('\r', '\n'); - } - bol = flushline = 1; - break; - case IAC: - NET2ADD(IAC, IAC); - break; - default: - NETADD(c); - break; - } - } else if (c == IAC) { - NET2ADD(IAC, IAC); - } else { - NETADD(c); - } - } - if (count) - ring_consumed(&ttyiring, count); - return returnValue||count; /* Non-zero if we did anything */ -} - -/* - * Scheduler() - * - * Try to do something. - * - * If we do something useful, return 1; else return 0. - * - */ - - - int -Scheduler(int block) /* should we block in the select ? */ -{ - /* One wants to be a bit careful about setting returnValue - * to one, since a one implies we did some useful work, - * and therefore probably won't be called to block next - * time (TN3270 mode only). - */ - int returnValue; - int netin, netout, netex, ttyin, ttyout; - - /* Decide which rings should be processed */ - - netout = ring_full_count(&netoring) && - (flushline || - (my_want_state_is_wont(TELOPT_LINEMODE) -#ifdef KLUDGELINEMODE - && (!kludgelinemode || my_want_state_is_do(TELOPT_SGA)) -#endif - ) || - my_want_state_is_will(TELOPT_BINARY)); - ttyout = ring_full_count(&ttyoring); - - ttyin = ring_empty_count(&ttyiring); - - netin = !ISend && ring_empty_count(&netiring); - - netex = !SYNCHing; - - /* If we have seen a signal recently, reset things */ - - if (scheduler_lockout_tty) { - ttyin = ttyout = 0; - } - - /* Call to system code to process rings */ - - returnValue = process_rings(netin, netout, netex, ttyin, ttyout, !block); - - /* Now, look at the input rings, looking for work to do. */ - - if (ring_full_count(&ttyiring)) { - returnValue |= telsnd(); - } - - if (ring_full_count(&netiring)) { - returnValue |= telrcv(); - } - return returnValue; -} - -extern int auth_has_failed; /* XXX should be somewhere else */ - -/* - * Select from tty and network... - */ -void -my_telnet(char *user) -{ - int printed_encrypt = 0; - - sys_telnet_init(); - -#if defined(AUTHENTICATION) || defined(ENCRYPTION) - { - static char local_host[256] = { 0 }; - - if (!local_host[0]) { - /* XXX - should be k_gethostname? */ - gethostname(local_host, sizeof(local_host)); - local_host[sizeof(local_host)-1] = 0; - } - auth_encrypt_init(local_host, hostname, "TELNET", 0); - auth_encrypt_user(user); - } -#endif - if (telnetport) { -#if defined(AUTHENTICATION) - if (autologin) - send_will(TELOPT_AUTHENTICATION, 1); -#endif -#if defined(ENCRYPTION) - send_do(TELOPT_ENCRYPT, 1); - send_will(TELOPT_ENCRYPT, 1); -#endif - send_do(TELOPT_SGA, 1); - send_will(TELOPT_TTYPE, 1); - send_will(TELOPT_NAWS, 1); - send_will(TELOPT_TSPEED, 1); - send_will(TELOPT_LFLOW, 1); - send_will(TELOPT_LINEMODE, 1); - send_will(TELOPT_NEW_ENVIRON, 1); - send_do(TELOPT_STATUS, 1); - if (env_getvalue((unsigned char *)"DISPLAY")) - send_will(TELOPT_XDISPLOC, 1); - if (binary) - tel_enter_binary(binary); - } - -#ifdef ENCRYPTION - /* - * Note: we assume a tie to the authentication option here. This - * is necessary so that authentication fails, we don't spin - * forever. - */ - if (telnetport && wantencryption) { - time_t timeout = time(0) + 60; - - send_do(TELOPT_ENCRYPT, 1); - send_will(TELOPT_ENCRYPT, 1); - while (1) { - if (my_want_state_is_wont(TELOPT_AUTHENTICATION)) { - if (wantencryption == -1) { - break; - } else { - printf("\nServer refused to negotiate authentication,\n"); - printf("which is required for encryption.\n"); - Exit(1); - } - } - if (auth_has_failed) { - printf("\nAuthentication negotiation has failed,\n"); - printf("which is required for encryption.\n"); - Exit(1); - } - if (my_want_state_is_dont(TELOPT_ENCRYPT) || - my_want_state_is_wont(TELOPT_ENCRYPT)) { - printf("\nServer refused to negotiate encryption.\n"); - Exit(1); - } - if (encrypt_is_encrypting()) - break; - if (time(0) > timeout) { - printf("\nEncryption could not be enabled.\n"); - Exit(1); - } - if (printed_encrypt == 0) { - printed_encrypt = 1; - printf("Waiting for encryption to be negotiated...\n"); - /* - * Turn on MODE_TRAPSIG and then turn off localchars - * so that ^C will cause telnet to exit. - */ - TerminalNewMode(getconnmode()|MODE_TRAPSIG); - intr_waiting = 1; - } - if (intr_happened) { - printf("\nUser interrupt.\n"); - Exit(1); - } - if (telnet_spin()) { - printf("\nServer disconnected.\n"); - Exit(1); - } - - } - if (printed_encrypt) { - printf("Encryption negotiated.\n"); - intr_waiting = 0; - setconnmode(0); - } - } -#endif - - for (;;) { - int schedValue; - - while ((schedValue = Scheduler(0)) != 0) { - if (schedValue == -1) { - setcommandmode(); - return; - } - } - - if (Scheduler(1) == -1) { - setcommandmode(); - return; - } - } -} - -/* - * netclear() - * - * We are about to do a TELNET SYNCH operation. Clear - * the path to the network. - * - * Things are a bit tricky since we may have sent the first - * byte or so of a previous TELNET command into the network. - * So, we have to scan the network buffer from the beginning - * until we are up to where we want to be. - * - * A side effect of what we do, just to keep things - * simple, is to clear the urgent data pointer. The principal - * caller should be setting the urgent data pointer AFTER calling - * us in any case. - */ - -static void -netclear() -{ -#if 0 /* XXX */ - char *thisitem, *next; - char *good; -#define wewant(p) ((nfrontp > p) && ((*p&0xff) == IAC) && \ - ((*(p+1)&0xff) != EC) && ((*(p+1)&0xff) != EL)) - - thisitem = netobuf; - - while ((next = nextitem(thisitem)) <= netobuf.send) { - thisitem = next; - } - - /* Now, thisitem is first before/at boundary. */ - - good = netobuf; /* where the good bytes go */ - - while (netoring.add > thisitem) { - if (wewant(thisitem)) { - int length; - - next = thisitem; - do { - next = nextitem(next); - } while (wewant(next) && (nfrontp > next)); - length = next-thisitem; - memmove(good, thisitem, length); - good += length; - thisitem = next; - } else { - thisitem = nextitem(thisitem); - } - } - -#endif /* 0 */ -} - -/* - * These routines add various telnet commands to the data stream. - */ - -static void -doflush() -{ - NET2ADD(IAC, DO); - NETADD(TELOPT_TM); - flushline = 1; - flushout = 1; - ttyflush(1); /* Flush/drop output */ - /* do printoption AFTER flush, otherwise the output gets tossed... */ - printoption("SENT", DO, TELOPT_TM); -} - -void -xmitAO(void) -{ - NET2ADD(IAC, AO); - printoption("SENT", IAC, AO); - if (autoflush) { - doflush(); - } -} - - -void -xmitEL(void) -{ - NET2ADD(IAC, EL); - printoption("SENT", IAC, EL); -} - -void -xmitEC(void) -{ - NET2ADD(IAC, EC); - printoption("SENT", IAC, EC); -} - - -int -dosynch() -{ - netclear(); /* clear the path to the network */ - NETADD(IAC); - setneturg(); - NETADD(DM); - printoption("SENT", IAC, DM); - return 1; -} - -int want_status_response = 0; - -int -get_status() -{ - unsigned char tmp[16]; - unsigned char *cp; - - if (my_want_state_is_dont(TELOPT_STATUS)) { - printf("Remote side does not support STATUS option\n"); - return 0; - } - cp = tmp; - - *cp++ = IAC; - *cp++ = SB; - *cp++ = TELOPT_STATUS; - *cp++ = TELQUAL_SEND; - *cp++ = IAC; - *cp++ = SE; - if (NETROOM() >= cp - tmp) { - ring_supply_data(&netoring, tmp, cp-tmp); - printsub('>', tmp+2, cp - tmp - 2); - } - ++want_status_response; - return 1; -} - -void -intp(void) -{ - NET2ADD(IAC, IP); - printoption("SENT", IAC, IP); - flushline = 1; - if (autoflush) { - doflush(); - } - if (autosynch) { - dosynch(); - } -} - -void -sendbrk(void) -{ - NET2ADD(IAC, BREAK); - printoption("SENT", IAC, BREAK); - flushline = 1; - if (autoflush) { - doflush(); - } - if (autosynch) { - dosynch(); - } -} - -void -sendabort(void) -{ - NET2ADD(IAC, ABORT); - printoption("SENT", IAC, ABORT); - flushline = 1; - if (autoflush) { - doflush(); - } - if (autosynch) { - dosynch(); - } -} - -void -sendsusp(void) -{ - NET2ADD(IAC, SUSP); - printoption("SENT", IAC, SUSP); - flushline = 1; - if (autoflush) { - doflush(); - } - if (autosynch) { - dosynch(); - } -} - -void -sendeof(void) -{ - NET2ADD(IAC, xEOF); - printoption("SENT", IAC, xEOF); -} - -void -sendayt(void) -{ - NET2ADD(IAC, AYT); - printoption("SENT", IAC, AYT); -} - -/* - * Send a window size update to the remote system. - */ - -void -sendnaws() -{ - long rows, cols; - unsigned char tmp[16]; - unsigned char *cp; - - if (my_state_is_wont(TELOPT_NAWS)) - return; - -#undef PUTSHORT -#define PUTSHORT(cp, x) { if ((*cp++ = ((x)>>8)&0xff) == IAC) *cp++ = IAC; \ - if ((*cp++ = ((x))&0xff) == IAC) *cp++ = IAC; } - - if (TerminalWindowSize(&rows, &cols) == 0) { /* Failed */ - return; - } - - cp = tmp; - - *cp++ = IAC; - *cp++ = SB; - *cp++ = TELOPT_NAWS; - PUTSHORT(cp, cols); - PUTSHORT(cp, rows); - *cp++ = IAC; - *cp++ = SE; - if (NETROOM() >= cp - tmp) { - ring_supply_data(&netoring, tmp, cp-tmp); - printsub('>', tmp+2, cp - tmp - 2); - } -} - -void -tel_enter_binary(int rw) -{ - if (rw&1) - send_do(TELOPT_BINARY, 1); - if (rw&2) - send_will(TELOPT_BINARY, 1); -} - -void -tel_leave_binary(int rw) -{ - if (rw&1) - send_dont(TELOPT_BINARY, 1); - if (rw&2) - send_wont(TELOPT_BINARY, 1); -} diff --git a/crypto/heimdal/appl/telnet/telnet/telnet_locl.h b/crypto/heimdal/appl/telnet/telnet/telnet_locl.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/telnet_locl.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* $Id$ */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include -#include -#ifdef HAVE_SIGNAL_H -#include -#endif -#include -#include -#ifdef HAVE_BSDSETJMP_H -#include -#endif - -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif - -/* termios.h *must* be included before curses.h, but not on Solaris 9, - at least, where we end up with - "/usr/include/term.h", line 1060: incomplete struct/union/enum termio: Ottyb -*/ -#if defined HAVE_TERMIOS_H && !defined __sun -#include -#endif - -#if defined(HAVE_CURSES_H) -#include -#ifdef HAVE_TERM_H -#include -#endif -#elif defined(HAVE_TERMCAP_H) -#include -#endif - -#if defined(HAVE_SYS_TERMIO_H) && !defined(HAVE_TERMIOS_H) -#include -#endif - -#ifdef HAVE_FCNTL_H -#include -#endif - -#ifdef HAVE_NETDB_H -#include -#endif - -#ifdef HAVE_PWD_H -#include -#endif - -#ifdef HAVE_SYS_SELECT_H -#include -#endif -#ifdef TIME_WITH_SYS_TIME -#include -#include -#elif defined(HAVE_SYS_TIME_H) -#include -#else -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include -#endif -/* not with SunOS 4 */ -#if defined(HAVE_SYS_IOCTL_H) && SunOS != 40 -#include -#endif -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif /* HAVE_SYS_RESOURCE_H */ -#ifdef HAVE_SYS_WAIT_H -#include -#endif -#ifdef HAVE_SYS_FILIO_H -#include -#endif -#ifdef HAVE_SYS_FILE_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_NETINET6_IN6_H -#include -#endif - -#ifdef HAVE_NETINET_IN_SYSTM_H -#include -#endif -#ifdef HAVE_NETINET_IP_H -#include -#endif -#ifdef HAVE_ARPA_INET_H -#ifdef _AIX -struct sockaddr_dl; /* AIX fun */ -struct ether_addr; -#endif -#include -#endif - -#ifdef HAVE_ARPA_TELNET_H -#include -#endif - -#ifdef SOCKS -#include -#endif - -#if defined(AUTHENTICATION) || defined(ENCRYPTION) -#include -#include -#endif -#include -#include - -#define LINEMODE -#ifndef KLUDGELINEMODE -#define KLUDGELINEMODE -#endif - -#include -#include - -#include "ring.h" -#include "externs.h" -#include "defines.h" -#include "types.h" - -/* prototypes */ - diff --git a/crypto/heimdal/appl/telnet/telnet/terminal.c b/crypto/heimdal/appl/telnet/telnet/terminal.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/terminal.c +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (c) 1988, 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnet_locl.h" - -RCSID("$Id$"); - -Ring ttyoring, ttyiring; -unsigned char ttyobuf[2*BUFSIZ], ttyibuf[BUFSIZ]; - -int termdata; /* Debugging flag */ - -# ifndef VDISCARD -cc_t termFlushChar; -# endif -# ifndef VLNEXT -cc_t termLiteralNextChar; -# endif -# ifndef VSUSP -cc_t termSuspChar; -# endif -# ifndef VWERASE -cc_t termWerasChar; -# endif -# ifndef VREPRINT -cc_t termRprntChar; -# endif -# ifndef VSTART -cc_t termStartChar; -# endif -# ifndef VSTOP -cc_t termStopChar; -# endif -# ifndef VEOL -cc_t termForw1Char; -# endif -# ifndef VEOL2 -cc_t termForw2Char; -# endif -# ifndef VSTATUS -cc_t termAytChar; -# endif - -/* - * initialize the terminal data structures. - */ - -void -init_terminal(void) -{ - if (ring_init(&ttyoring, ttyobuf, sizeof ttyobuf) != 1) { - exit(1); - } - if (ring_init(&ttyiring, ttyibuf, sizeof ttyibuf) != 1) { - exit(1); - } - autoflush = TerminalAutoFlush(); -} - - -/* - * Send as much data as possible to the terminal. - * - * Return value: - * -1: No useful work done, data waiting to go out. - * 0: No data was waiting, so nothing was done. - * 1: All waiting data was written out. - * n: All data - n was written out. - */ - - -int -ttyflush(int drop) -{ - int n, n0, n1; - - n0 = ring_full_count(&ttyoring); - if ((n1 = n = ring_full_consecutive(&ttyoring)) > 0) { - if (drop) { - TerminalFlushOutput(); - /* we leave 'n' alone! */ - } else { - n = TerminalWrite((char *)ttyoring.consume, n); - } - } - if (n > 0) { - if (termdata && n) { - Dump('>', ttyoring.consume, n); - } - /* - * If we wrote everything, and the full count is - * larger than what we wrote, then write the - * rest of the buffer. - */ - if (n1 == n && n0 > n) { - n1 = n0 - n; - if (!drop) - n1 = TerminalWrite((char *)ttyoring.bottom, n1); - if (n1 > 0) - n += n1; - } - ring_consumed(&ttyoring, n); - } - if (n < 0) - return -1; - if (n == n0) { - if (n0) - return -1; - return 0; - } - return n0 - n + 1; -} - - -/* - * These routines decides on what the mode should be (based on the values - * of various global variables). - */ - - -int -getconnmode(void) -{ - int mode = 0; - - if (my_want_state_is_dont(TELOPT_ECHO)) - mode |= MODE_ECHO; - - if (localflow) - mode |= MODE_FLOW; - - if ((eight & 1) || my_want_state_is_will(TELOPT_BINARY)) - mode |= MODE_INBIN; - - if (eight & 2) - mode |= MODE_OUT8; - if (his_want_state_is_will(TELOPT_BINARY)) - mode |= MODE_OUTBIN; - -#ifdef KLUDGELINEMODE - if (kludgelinemode) { - if (my_want_state_is_dont(TELOPT_SGA)) { - mode |= (MODE_TRAPSIG|MODE_EDIT); - if (dontlecho && (clocks.echotoggle > clocks.modenegotiated)) { - mode &= ~MODE_ECHO; - } - } - return(mode); - } -#endif - if (my_want_state_is_will(TELOPT_LINEMODE)) - mode |= linemode; - return(mode); -} - - void -setconnmode(force) - int force; -{ -#ifdef ENCRYPTION - static int enc_passwd = 0; -#endif - int newmode; - - newmode = getconnmode()|(force?MODE_FORCE:0); - - TerminalNewMode(newmode); - -#ifdef ENCRYPTION - if ((newmode & (MODE_ECHO|MODE_EDIT)) == MODE_EDIT) { - if (my_want_state_is_will(TELOPT_ENCRYPT) - && (enc_passwd == 0) && !encrypt_output) { - encrypt_request_start(0, 0); - enc_passwd = 1; - } - } else { - if (enc_passwd) { - encrypt_request_end(); - enc_passwd = 0; - } - } -#endif - -} - - - void -setcommandmode() -{ - TerminalNewMode(-1); -} diff --git a/crypto/heimdal/appl/telnet/telnet/types.h b/crypto/heimdal/appl/telnet/telnet/types.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/types.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)types.h 8.1 (Berkeley) 6/6/93 - */ - -typedef struct { - char *modedescriptions; - char modetype; -} Modelist; - -extern Modelist modelist[]; - -typedef struct { - int - system, /* what the current time is */ - echotoggle, /* last time user entered echo character */ - modenegotiated, /* last time operating mode negotiated */ - didnetreceive, /* last time we read data from network */ - gotDM; /* when did we last see a data mark */ -} Clocks; - -extern Clocks clocks; diff --git a/crypto/heimdal/appl/telnet/telnet/utilities.c b/crypto/heimdal/appl/telnet/telnet/utilities.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnet/utilities.c +++ /dev/null @@ -1,865 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#define TELOPTS -#define TELCMDS -#define SLC_NAMES - -#include "telnet_locl.h" - -RCSID("$Id$"); - -FILE *NetTrace = 0; /* Not in bss, since needs to stay */ -int prettydump; - -/* - * SetSockOpt() - * - * Compensate for differences in 4.2 and 4.3 systems. - */ - -int -SetSockOpt(int fd, int level, int option, int yesno) -{ -#ifdef HAVE_SETSOCKOPT -#ifndef NOT43 - return setsockopt(fd, level, option, - (void *)&yesno, sizeof yesno); -#else /* NOT43 */ - if (yesno == 0) { /* Can't do that in 4.2! */ - fprintf(stderr, "Error: attempt to turn off an option 0x%x.\n", - option); - return -1; - } - return setsockopt(fd, level, option, 0, 0); -#endif /* NOT43 */ -#else - return -1; -#endif -} - -/* - * The following are routines used to print out debugging information. - */ - -char NetTraceFile[256] = "(standard output)"; - -void -SetNetTrace(char *file) -{ - if (NetTrace && NetTrace != stdout) - fclose(NetTrace); - if (file && (strcmp(file, "-") != 0)) { - NetTrace = fopen(file, "w"); - if (NetTrace) { - strlcpy(NetTraceFile, file, sizeof(NetTraceFile)); - return; - } - fprintf(stderr, "Cannot open %s.\n", file); - } - NetTrace = stdout; - strlcpy(NetTraceFile, "(standard output)", sizeof(NetTraceFile)); -} - -void -Dump(char direction, unsigned char *buffer, int length) -{ -# define BYTES_PER_LINE 32 - unsigned char *pThis; - int offset; - - offset = 0; - - while (length) { - /* print one line */ - fprintf(NetTrace, "%c 0x%x\t", direction, offset); - pThis = buffer; - if (prettydump) { - buffer = buffer + min(length, BYTES_PER_LINE/2); - while (pThis < buffer) { - fprintf(NetTrace, "%c%.2x", - (((*pThis)&0xff) == 0xff) ? '*' : ' ', - (*pThis)&0xff); - pThis++; - } - length -= BYTES_PER_LINE/2; - offset += BYTES_PER_LINE/2; - } else { - buffer = buffer + min(length, BYTES_PER_LINE); - while (pThis < buffer) { - fprintf(NetTrace, "%.2x", (*pThis)&0xff); - pThis++; - } - length -= BYTES_PER_LINE; - offset += BYTES_PER_LINE; - } - if (NetTrace == stdout) { - fprintf(NetTrace, "\r\n"); - } else { - fprintf(NetTrace, "\n"); - } - if (length < 0) { - fflush(NetTrace); - return; - } - /* find next unique line */ - } - fflush(NetTrace); -} - - -void -printoption(char *direction, int cmd, int option) -{ - if (!showoptions) - return; - if (cmd == IAC) { - if (TELCMD_OK(option)) - fprintf(NetTrace, "%s IAC %s", direction, TELCMD(option)); - else - fprintf(NetTrace, "%s IAC %d", direction, option); - } else { - char *fmt; - fmt = (cmd == WILL) ? "WILL" : (cmd == WONT) ? "WONT" : - (cmd == DO) ? "DO" : (cmd == DONT) ? "DONT" : 0; - if (fmt) { - fprintf(NetTrace, "%s %s ", direction, fmt); - if (TELOPT_OK(option)) - fprintf(NetTrace, "%s", TELOPT(option)); - else if (option == TELOPT_EXOPL) - fprintf(NetTrace, "EXOPL"); - else - fprintf(NetTrace, "%d", option); - } else - fprintf(NetTrace, "%s %d %d", direction, cmd, option); - } - if (NetTrace == stdout) { - fprintf(NetTrace, "\r\n"); - fflush(NetTrace); - } else { - fprintf(NetTrace, "\n"); - } - return; -} - -void -optionstatus(void) -{ - int i; - - for (i = 0; i < 256; i++) { - if (do_dont_resp[i]) { - if (TELOPT_OK(i)) - printf("resp DO_DONT %s: %d\n", TELOPT(i), do_dont_resp[i]); - else if (TELCMD_OK(i)) - printf("resp DO_DONT %s: %d\n", TELCMD(i), do_dont_resp[i]); - else - printf("resp DO_DONT %d: %d\n", i, - do_dont_resp[i]); - if (my_want_state_is_do(i)) { - if (TELOPT_OK(i)) - printf("want DO %s\n", TELOPT(i)); - else if (TELCMD_OK(i)) - printf("want DO %s\n", TELCMD(i)); - else - printf("want DO %d\n", i); - } else { - if (TELOPT_OK(i)) - printf("want DONT %s\n", TELOPT(i)); - else if (TELCMD_OK(i)) - printf("want DONT %s\n", TELCMD(i)); - else - printf("want DONT %d\n", i); - } - } else { - if (my_state_is_do(i)) { - if (TELOPT_OK(i)) - printf(" DO %s\n", TELOPT(i)); - else if (TELCMD_OK(i)) - printf(" DO %s\n", TELCMD(i)); - else - printf(" DO %d\n", i); - } - } - if (will_wont_resp[i]) { - if (TELOPT_OK(i)) - printf("resp WILL_WONT %s: %d\n", TELOPT(i), will_wont_resp[i]); - else if (TELCMD_OK(i)) - printf("resp WILL_WONT %s: %d\n", TELCMD(i), will_wont_resp[i]); - else - printf("resp WILL_WONT %d: %d\n", - i, will_wont_resp[i]); - if (my_want_state_is_will(i)) { - if (TELOPT_OK(i)) - printf("want WILL %s\n", TELOPT(i)); - else if (TELCMD_OK(i)) - printf("want WILL %s\n", TELCMD(i)); - else - printf("want WILL %d\n", i); - } else { - if (TELOPT_OK(i)) - printf("want WONT %s\n", TELOPT(i)); - else if (TELCMD_OK(i)) - printf("want WONT %s\n", TELCMD(i)); - else - printf("want WONT %d\n", i); - } - } else { - if (my_state_is_will(i)) { - if (TELOPT_OK(i)) - printf(" WILL %s\n", TELOPT(i)); - else if (TELCMD_OK(i)) - printf(" WILL %s\n", TELCMD(i)); - else - printf(" WILL %d\n", i); - } - } - } - -} - -static void __attribute__((format (printf, 3, 4))) -qprintf(int quote, FILE *f, const char *fmt, ...) - -{ - va_list va; - if (quote) - fprintf(f, "\" "); - va_start(va, fmt); - vfprintf(f, fmt, va); - va_end(va); -} - -void -printsub(int direction, unsigned char *pointer, size_t length) -{ - int i; - unsigned char buf[512]; - - if (showoptions || direction == 0 || - (want_status_response && (pointer[0] == TELOPT_STATUS))) { - if (direction) { - fprintf(NetTrace, "%s IAC SB ", - (direction == '<')? "RCVD":"SENT"); - if (length >= 3) { - int j; - - i = pointer[length-2]; - j = pointer[length-1]; - - if (i != IAC || j != SE) { - fprintf(NetTrace, "(terminated by "); - if (TELOPT_OK(i)) - fprintf(NetTrace, "%s ", TELOPT(i)); - else if (TELCMD_OK(i)) - fprintf(NetTrace, "%s ", TELCMD(i)); - else - fprintf(NetTrace, "%d ", i); - if (TELOPT_OK(j)) - fprintf(NetTrace, "%s", TELOPT(j)); - else if (TELCMD_OK(j)) - fprintf(NetTrace, "%s", TELCMD(j)); - else - fprintf(NetTrace, "%d", j); - fprintf(NetTrace, ", not IAC SE!) "); - } - } - length -= 2; - } - if (length < 1) { - fprintf(NetTrace, "(Empty suboption??\?)"); - if (NetTrace == stdout) - fflush(NetTrace); - return; - } - switch (pointer[0]) { - case TELOPT_TTYPE: - fprintf(NetTrace, "TERMINAL-TYPE "); - switch (pointer[1]) { - case TELQUAL_IS: - fprintf(NetTrace, "IS \"%.*s\"", - (int)(length-2), - (char *)pointer+2); - break; - case TELQUAL_SEND: - fprintf(NetTrace, "SEND"); - break; - default: - fprintf(NetTrace, - "- unknown qualifier %d (0x%x).", - pointer[1], pointer[1]); - } - break; - case TELOPT_TSPEED: - fprintf(NetTrace, "TERMINAL-SPEED"); - if (length < 2) { - fprintf(NetTrace, " (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case TELQUAL_IS: - fprintf(NetTrace, " IS "); - fprintf(NetTrace, "%.*s", (int)(length-2), (char *)pointer+2); - break; - default: - if (pointer[1] == 1) - fprintf(NetTrace, " SEND"); - else - fprintf(NetTrace, " %d (unknown)", pointer[1]); - for (i = 2; i < length; i++) - fprintf(NetTrace, " ?%d?", pointer[i]); - break; - } - break; - - case TELOPT_LFLOW: - fprintf(NetTrace, "TOGGLE-FLOW-CONTROL"); - if (length < 2) { - fprintf(NetTrace, " (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case LFLOW_OFF: - fprintf(NetTrace, " OFF"); break; - case LFLOW_ON: - fprintf(NetTrace, " ON"); break; - case LFLOW_RESTART_ANY: - fprintf(NetTrace, " RESTART-ANY"); break; - case LFLOW_RESTART_XON: - fprintf(NetTrace, " RESTART-XON"); break; - default: - fprintf(NetTrace, " %d (unknown)", pointer[1]); - } - for (i = 2; i < length; i++) - fprintf(NetTrace, " ?%d?", pointer[i]); - break; - - case TELOPT_NAWS: - fprintf(NetTrace, "NAWS"); - if (length < 2) { - fprintf(NetTrace, " (empty suboption??\?)"); - break; - } - if (length == 2) { - fprintf(NetTrace, " ?%d?", pointer[1]); - break; - } - fprintf(NetTrace, " %d %d (%d)", - pointer[1], pointer[2], - (int)((((unsigned int)pointer[1])<<8)|((unsigned int)pointer[2]))); - if (length == 4) { - fprintf(NetTrace, " ?%d?", pointer[3]); - break; - } - fprintf(NetTrace, " %d %d (%d)", - pointer[3], pointer[4], - (int)((((unsigned int)pointer[3])<<8)|((unsigned int)pointer[4]))); - for (i = 5; i < length; i++) - fprintf(NetTrace, " ?%d?", pointer[i]); - break; - -#if defined(AUTHENTICATION) - case TELOPT_AUTHENTICATION: - fprintf(NetTrace, "AUTHENTICATION"); - if (length < 2) { - fprintf(NetTrace, " (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case TELQUAL_REPLY: - case TELQUAL_IS: - fprintf(NetTrace, " %s ", (pointer[1] == TELQUAL_IS) ? - "IS" : "REPLY"); - if (AUTHTYPE_NAME_OK(pointer[2])) - fprintf(NetTrace, "%s ", AUTHTYPE_NAME(pointer[2])); - else - fprintf(NetTrace, "%d ", pointer[2]); - if (length < 3) { - fprintf(NetTrace, "(partial suboption??\?)"); - break; - } - fprintf(NetTrace, "%s|%s", - ((pointer[3] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ? - "CLIENT" : "SERVER", - ((pointer[3] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ? - "MUTUAL" : "ONE-WAY"); - - auth_printsub(&pointer[1], length - 1, buf, sizeof(buf)); - fprintf(NetTrace, "%s", buf); - break; - - case TELQUAL_SEND: - i = 2; - fprintf(NetTrace, " SEND "); - while (i < length) { - if (AUTHTYPE_NAME_OK(pointer[i])) - fprintf(NetTrace, "%s ", AUTHTYPE_NAME(pointer[i])); - else - fprintf(NetTrace, "%d ", pointer[i]); - if (++i >= length) { - fprintf(NetTrace, "(partial suboption??\?)"); - break; - } - fprintf(NetTrace, "%s|%s ", - ((pointer[i] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ? - "CLIENT" : "SERVER", - ((pointer[i] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ? - "MUTUAL" : "ONE-WAY"); - ++i; - } - break; - - case TELQUAL_NAME: - i = 2; - fprintf(NetTrace, " NAME \""); - while (i < length) - putc(pointer[i++], NetTrace); - putc('"', NetTrace); - break; - - default: - for (i = 2; i < length; i++) - fprintf(NetTrace, " ?%d?", pointer[i]); - break; - } - break; -#endif - -#if defined(ENCRYPTION) - case TELOPT_ENCRYPT: - fprintf(NetTrace, "ENCRYPT"); - if (length < 2) { - fprintf(NetTrace, " (empty suboption?)"); - break; - } - switch (pointer[1]) { - case ENCRYPT_START: - fprintf(NetTrace, " START"); - break; - - case ENCRYPT_END: - fprintf(NetTrace, " END"); - break; - - case ENCRYPT_REQSTART: - fprintf(NetTrace, " REQUEST-START"); - break; - - case ENCRYPT_REQEND: - fprintf(NetTrace, " REQUEST-END"); - break; - - case ENCRYPT_IS: - case ENCRYPT_REPLY: - fprintf(NetTrace, " %s ", (pointer[1] == ENCRYPT_IS) ? - "IS" : "REPLY"); - if (length < 3) { - fprintf(NetTrace, " (partial suboption?)"); - break; - } - if (ENCTYPE_NAME_OK(pointer[2])) - fprintf(NetTrace, "%s ", ENCTYPE_NAME(pointer[2])); - else - fprintf(NetTrace, " %d (unknown)", pointer[2]); - - encrypt_printsub(&pointer[1], length - 1, buf, sizeof(buf)); - fprintf(NetTrace, "%s", buf); - break; - - case ENCRYPT_SUPPORT: - i = 2; - fprintf(NetTrace, " SUPPORT "); - while (i < length) { - if (ENCTYPE_NAME_OK(pointer[i])) - fprintf(NetTrace, "%s ", ENCTYPE_NAME(pointer[i])); - else - fprintf(NetTrace, "%d ", pointer[i]); - i++; - } - break; - - case ENCRYPT_ENC_KEYID: - fprintf(NetTrace, " ENC_KEYID "); - goto encommon; - - case ENCRYPT_DEC_KEYID: - fprintf(NetTrace, " DEC_KEYID "); - goto encommon; - - default: - fprintf(NetTrace, " %d (unknown)", pointer[1]); - encommon: - for (i = 2; i < length; i++) - fprintf(NetTrace, " %d", pointer[i]); - break; - } - break; -#endif - - case TELOPT_LINEMODE: - fprintf(NetTrace, "LINEMODE "); - if (length < 2) { - fprintf(NetTrace, " (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case WILL: - fprintf(NetTrace, "WILL "); - goto common; - case WONT: - fprintf(NetTrace, "WONT "); - goto common; - case DO: - fprintf(NetTrace, "DO "); - goto common; - case DONT: - fprintf(NetTrace, "DONT "); - common: - if (length < 3) { - fprintf(NetTrace, "(no option??\?)"); - break; - } - switch (pointer[2]) { - case LM_FORWARDMASK: - fprintf(NetTrace, "Forward Mask"); - for (i = 3; i < length; i++) - fprintf(NetTrace, " %x", pointer[i]); - break; - default: - fprintf(NetTrace, "%d (unknown)", pointer[2]); - for (i = 3; i < length; i++) - fprintf(NetTrace, " %d", pointer[i]); - break; - } - break; - - case LM_SLC: - fprintf(NetTrace, "SLC"); - for (i = 2; i < length - 2; i += 3) { - if (SLC_NAME_OK(pointer[i+SLC_FUNC])) - fprintf(NetTrace, " %s", SLC_NAME(pointer[i+SLC_FUNC])); - else - fprintf(NetTrace, " %d", pointer[i+SLC_FUNC]); - switch (pointer[i+SLC_FLAGS]&SLC_LEVELBITS) { - case SLC_NOSUPPORT: - fprintf(NetTrace, " NOSUPPORT"); break; - case SLC_CANTCHANGE: - fprintf(NetTrace, " CANTCHANGE"); break; - case SLC_VARIABLE: - fprintf(NetTrace, " VARIABLE"); break; - case SLC_DEFAULT: - fprintf(NetTrace, " DEFAULT"); break; - } - fprintf(NetTrace, "%s%s%s", - pointer[i+SLC_FLAGS]&SLC_ACK ? "|ACK" : "", - pointer[i+SLC_FLAGS]&SLC_FLUSHIN ? "|FLUSHIN" : "", - pointer[i+SLC_FLAGS]&SLC_FLUSHOUT ? "|FLUSHOUT" : ""); - if (pointer[i+SLC_FLAGS]& ~(SLC_ACK|SLC_FLUSHIN| - SLC_FLUSHOUT| SLC_LEVELBITS)) - fprintf(NetTrace, "(0x%x)", pointer[i+SLC_FLAGS]); - fprintf(NetTrace, " %d;", pointer[i+SLC_VALUE]); - if ((pointer[i+SLC_VALUE] == IAC) && - (pointer[i+SLC_VALUE+1] == IAC)) - i++; - } - for (; i < length; i++) - fprintf(NetTrace, " ?%d?", pointer[i]); - break; - - case LM_MODE: - fprintf(NetTrace, "MODE "); - if (length < 3) { - fprintf(NetTrace, "(no mode??\?)"); - break; - } - { - char tbuf[64]; - snprintf(tbuf, sizeof(tbuf), - "%s%s%s%s%s", - pointer[2]&MODE_EDIT ? "|EDIT" : "", - pointer[2]&MODE_TRAPSIG ? "|TRAPSIG" : "", - pointer[2]&MODE_SOFT_TAB ? "|SOFT_TAB" : "", - pointer[2]&MODE_LIT_ECHO ? "|LIT_ECHO" : "", - pointer[2]&MODE_ACK ? "|ACK" : ""); - fprintf(NetTrace, "%s", tbuf[1] ? &tbuf[1] : "0"); - } - if (pointer[2]&~(MODE_MASK)) - fprintf(NetTrace, " (0x%x)", pointer[2]); - for (i = 3; i < length; i++) - fprintf(NetTrace, " ?0x%x?", pointer[i]); - break; - default: - fprintf(NetTrace, "%d (unknown)", pointer[1]); - for (i = 2; i < length; i++) - fprintf(NetTrace, " %d", pointer[i]); - } - break; - - case TELOPT_STATUS: { - char *cp; - int j, k; - - fprintf(NetTrace, "STATUS"); - - switch (pointer[1]) { - default: - if (pointer[1] == TELQUAL_SEND) - fprintf(NetTrace, " SEND"); - else - fprintf(NetTrace, " %d (unknown)", pointer[1]); - for (i = 2; i < length; i++) - fprintf(NetTrace, " ?%d?", pointer[i]); - break; - case TELQUAL_IS: - if (--want_status_response < 0) - want_status_response = 0; - if (NetTrace == stdout) - fprintf(NetTrace, " IS\r\n"); - else - fprintf(NetTrace, " IS\n"); - - for (i = 2; i < length; i++) { - switch(pointer[i]) { - case DO: cp = "DO"; goto common2; - case DONT: cp = "DONT"; goto common2; - case WILL: cp = "WILL"; goto common2; - case WONT: cp = "WONT"; goto common2; - common2: - i++; - if (TELOPT_OK((int)pointer[i])) - fprintf(NetTrace, " %s %s", cp, TELOPT(pointer[i])); - else - fprintf(NetTrace, " %s %d", cp, pointer[i]); - - if (NetTrace == stdout) - fprintf(NetTrace, "\r\n"); - else - fprintf(NetTrace, "\n"); - break; - - case SB: - fprintf(NetTrace, " SB "); - i++; - j = k = i; - while (j < length) { - if (pointer[j] == SE) { - if (j+1 == length) - break; - if (pointer[j+1] == SE) - j++; - else - break; - } - pointer[k++] = pointer[j++]; - } - printsub(0, &pointer[i], k - i); - if (i < length) { - fprintf(NetTrace, " SE"); - i = j; - } else - i = j - 1; - - if (NetTrace == stdout) - fprintf(NetTrace, "\r\n"); - else - fprintf(NetTrace, "\n"); - - break; - - default: - fprintf(NetTrace, " %d", pointer[i]); - break; - } - } - break; - } - break; - } - - case TELOPT_XDISPLOC: - fprintf(NetTrace, "X-DISPLAY-LOCATION "); - switch (pointer[1]) { - case TELQUAL_IS: - fprintf(NetTrace, "IS \"%.*s\"", (int)(length-2), (char *)pointer+2); - break; - case TELQUAL_SEND: - fprintf(NetTrace, "SEND"); - break; - default: - fprintf(NetTrace, "- unknown qualifier %d (0x%x).", - pointer[1], pointer[1]); - } - break; - - case TELOPT_NEW_ENVIRON: - fprintf(NetTrace, "NEW-ENVIRON "); -#ifdef OLD_ENVIRON - goto env_common1; - case TELOPT_OLD_ENVIRON: - fprintf(NetTrace, "OLD-ENVIRON"); - env_common1: -#endif - switch (pointer[1]) { - case TELQUAL_IS: - fprintf(NetTrace, "IS "); - goto env_common; - case TELQUAL_SEND: - fprintf(NetTrace, "SEND "); - goto env_common; - case TELQUAL_INFO: - fprintf(NetTrace, "INFO "); - env_common: - { - int quote = 0; - for (i = 2; i < length; i++ ) { - switch (pointer[i]) { - case NEW_ENV_VAR: - qprintf(quote, NetTrace, "VAR "); - quote = 0; - break; - - case NEW_ENV_VALUE: - qprintf(quote, NetTrace, "VALUE"); - quote = 0; - break; - - case ENV_ESC: - qprintf(quote, NetTrace, "ESC "); - quote = 0; - break; - - case ENV_USERVAR: - qprintf(quote, NetTrace, "USERVAR "); - quote = 0; - break; - - default: - if (isprint(pointer[i]) && pointer[i] != '"') { - if (!quote) { - putc('"', NetTrace); - quote = 1; - } - putc(pointer[i], NetTrace); - } else { - qprintf(quote, NetTrace, "%03o ", pointer[i]); - quote = 0; - } - break; - } - } - if (quote) - putc('"', NetTrace); - break; - } - } - break; - - default: - if (TELOPT_OK(pointer[0])) - fprintf(NetTrace, "%s (unknown)", TELOPT(pointer[0])); - else - fprintf(NetTrace, "%d (unknown)", pointer[0]); - for (i = 1; i < length; i++) - fprintf(NetTrace, " %d", pointer[i]); - break; - } - if (direction) { - if (NetTrace == stdout) - fprintf(NetTrace, "\r\n"); - else - fprintf(NetTrace, "\n"); - } - if (NetTrace == stdout) - fflush(NetTrace); - } -} - -/* EmptyTerminal - called to make sure that the terminal buffer is empty. - * Note that we consider the buffer to run all the - * way to the kernel (thus the select). - */ - -void -EmptyTerminal(void) -{ - fd_set outs; - - FD_ZERO(&outs); - - if (tout >= FD_SETSIZE) - ExitString("fd too large", 1); - - if (TTYBYTES() == 0) { - FD_SET(tout, &outs); - select(tout+1, 0, &outs, 0, - (struct timeval *) 0); /* wait for TTLOWAT */ - } else { - while (TTYBYTES()) { - ttyflush(0); - FD_SET(tout, &outs); - select(tout+1, 0, &outs, 0, - (struct timeval *) 0); /* wait for TTLOWAT */ - } - } -} - -void -SetForExit(void) -{ - setconnmode(0); - do { - telrcv(); /* Process any incoming data */ - EmptyTerminal(); - } while (ring_full_count(&netiring)); /* While there is any */ - setcommandmode(); - fflush(stdout); - fflush(stderr); - setconnmode(0); - EmptyTerminal(); /* Flush the path to the tty */ - setcommandmode(); -} - -void -Exit(int returnCode) -{ - SetForExit(); - exit(returnCode); -} - -void -ExitString(char *string, int returnCode) -{ - SetForExit(); - fwrite(string, 1, strlen(string), stderr); - exit(returnCode); -} diff --git a/crypto/heimdal/appl/telnet/telnetd/Makefile.am b/crypto/heimdal/appl/telnet/telnetd/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -# $Id$ - -include $(top_srcdir)/Makefile.am.common - -AM_CPPFLAGS += -I$(srcdir)/.. $(INCLUDE_hcrypto) - -libexec_PROGRAMS = telnetd - -CHECK_LOCAL = - -telnetd_SOURCES = telnetd.c state.c termstat.c slc.c sys_term.c \ - utility.c global.c authenc.c defs.h ext.h telnetd.h - -man_MANS = telnetd.8 - -LDADD = \ - ../libtelnet/libtelnet.a \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_tgetent) \ - $(LIB_logwtmp) \ - $(LIB_logout) \ - $(LIB_openpty) \ - $(LIB_kdfs) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) diff --git a/crypto/heimdal/appl/telnet/telnetd/Makefile.in b/crypto/heimdal/appl/telnet/telnetd/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/Makefile.in +++ /dev/null @@ -1,973 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - -# $Id$ - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common -libexec_PROGRAMS = telnetd$(EXEEXT) -subdir = appl/telnet/telnetd -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(man8dir)" -PROGRAMS = $(libexec_PROGRAMS) -am_telnetd_OBJECTS = telnetd.$(OBJEXT) state.$(OBJEXT) \ - termstat.$(OBJEXT) slc.$(OBJEXT) sys_term.$(OBJEXT) \ - utility.$(OBJEXT) global.$(OBJEXT) authenc.$(OBJEXT) -telnetd_OBJECTS = $(am_telnetd_OBJECTS) -telnetd_LDADD = $(LDADD) -am__DEPENDENCIES_1 = -telnetd_DEPENDENCIES = ../libtelnet/libtelnet.a $(LIB_krb5) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(LIB_kdfs) $(am__DEPENDENCIES_1) -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 = $(telnetd_SOURCES) -DIST_SOURCES = $(telnetd_SOURCES) -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' -man8dir = $(mandir)/man8 -MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/.. $(INCLUDE_hcrypto) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -CHECK_LOCAL = -telnetd_SOURCES = telnetd.c state.c termstat.c slc.c sys_term.c \ - utility.c global.c authenc.c defs.h ext.h telnetd.h - -man_MANS = telnetd.8 -LDADD = \ - ../libtelnet/libtelnet.a \ - $(LIB_krb5) \ - $(LIB_hcrypto) \ - $(LIB_tgetent) \ - $(LIB_logwtmp) \ - $(LIB_logout) \ - $(LIB_openpty) \ - $(LIB_kdfs) \ - $(LIB_roken) - -EXTRA_DIST = NTMakefile $(man_MANS) -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 appl/telnet/telnetd/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign appl/telnet/telnetd/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-libexecPROGRAMS: $(libexec_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ - 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)$(libexecdir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ - } \ - ; done - -uninstall-libexecPROGRAMS: - @$(NORMAL_UNINSTALL) - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || 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)$(libexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libexecdir)" && rm -f $$files - -clean-libexecPROGRAMS: - @list='$(libexec_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 -telnetd$(EXEEXT): $(telnetd_OBJECTS) $(telnetd_DEPENDENCIES) - @rm -f telnetd$(EXEEXT) - $(LINK) $(telnetd_OBJECTS) $(telnetd_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/authenc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/global.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sys_term.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/telnetd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/termstat.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utility.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 -install-man8: $(man_MANS) - @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | 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,^[^8][0-9a-z]*$$,8,;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)$(man8dir)/$$inst'"; \ - $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$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)$(man8dir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ - done; } - -uninstall-man8: - @$(NORMAL_UNINSTALL) - @list=''; test -n "$(man8dir)" || exit 0; \ - files=`{ for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ - } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ - -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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" - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local -installdirs: - for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(man8dir)"; 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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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-libexecPROGRAMS 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-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-libexecPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: install-man8 - -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-libexecPROGRAMS uninstall-man - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man8 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libexecPROGRAMS clean-libtool ctags \ - dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ - install-html-am install-info install-info-am \ - install-libexecPROGRAMS install-man install-man8 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-hook \ - uninstall-libexecPROGRAMS uninstall-man uninstall-man8 - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/appl/telnet/telnetd/authenc.c b/crypto/heimdal/appl/telnet/telnetd/authenc.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/authenc.c +++ /dev/null @@ -1,80 +0,0 @@ -/*- - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnetd.h" - -RCSID("$Id$"); - -#ifdef AUTHENTICATION - -int -telnet_net_write(unsigned char *str, int len) -{ - if (nfrontp + len < netobuf + BUFSIZ) { - memmove(nfrontp, str, len); - nfrontp += len; - return(len); - } - return(0); -} - -void -net_encrypt(void) -{ -#ifdef ENCRYPTION - char *s = (nclearto > nbackp) ? nclearto : nbackp; - if (s < nfrontp && encrypt_output) { - (*encrypt_output)((unsigned char *)s, nfrontp - s); - } - nclearto = nfrontp; -#endif -} - -int -telnet_spin(void) -{ - return ttloop(); -} - -char * -telnet_getenv(const char *val) -{ - return(getenv(val)); -} - -char * -telnet_gets(char *prompt, char *result, int length, int echo) -{ - return NULL; -} -#endif diff --git a/crypto/heimdal/appl/telnet/telnetd/defs.h b/crypto/heimdal/appl/telnet/telnetd/defs.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/defs.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)defs.h 8.1 (Berkeley) 6/4/93 - */ - -/* - * Telnet server defines - */ - -#ifndef __DEFS_H__ -#define __DEFS_H__ - -#ifndef BSD -# define BSD 43 -#endif - -#if defined(PRINTOPTIONS) && defined(DIAGNOSTICS) -#define TELOPTS -#define TELCMDS -#define SLC_NAMES -#endif - -#if !defined(TIOCSCTTY) && defined(TCSETCTTY) -# define TIOCSCTTY TCSETCTTY -#endif - -#ifndef TIOCPKT_FLUSHWRITE -#define TIOCPKT_FLUSHWRITE 0x02 -#endif - -#ifndef TIOCPKT_NOSTOP -#define TIOCPKT_NOSTOP 0x10 -#endif - -#ifndef TIOCPKT_DOSTOP -#define TIOCPKT_DOSTOP 0x20 -#endif - -/* - * I/O data buffers defines - */ -#define NETSLOP 64 -#ifdef _CRAY -#undef BUFSIZ -#define BUFSIZ 2048 -#endif - -#define NIACCUM(c) { *netip++ = c; \ - ncc++; \ - } - -/* clock manipulations */ -#define settimer(x) (clocks.x = ++clocks.system) -#define sequenceIs(x,y) (clocks.x < clocks.y) - -/* - * Structures of information for each special character function. - */ -typedef struct { - unsigned char flag; /* the flags for this function */ - cc_t val; /* the value of the special character */ -} slcent, *Slcent; - -typedef struct { - slcent defset; /* the default settings */ - slcent current; /* the current settings */ - cc_t *sptr; /* a pointer to the char in */ - /* system data structures */ -} slcfun, *Slcfun; - -#ifdef DIAGNOSTICS -/* - * Diagnostics capabilities - */ -#define TD_REPORT 0x01 /* Report operations to client */ -#define TD_EXERCISE 0x02 /* Exercise client's implementation */ -#define TD_NETDATA 0x04 /* Display received data stream */ -#define TD_PTYDATA 0x08 /* Display data passed to pty */ -#define TD_OPTIONS 0x10 /* Report just telnet options */ -#endif /* DIAGNOSTICS */ - -/* - * We keep track of each side of the option negotiation. - */ - -#define MY_STATE_WILL 0x01 -#define MY_WANT_STATE_WILL 0x02 -#define MY_STATE_DO 0x04 -#define MY_WANT_STATE_DO 0x08 - -/* - * Macros to check the current state of things - */ - -#define my_state_is_do(opt) (options[opt]&MY_STATE_DO) -#define my_state_is_will(opt) (options[opt]&MY_STATE_WILL) -#define my_want_state_is_do(opt) (options[opt]&MY_WANT_STATE_DO) -#define my_want_state_is_will(opt) (options[opt]&MY_WANT_STATE_WILL) - -#define my_state_is_dont(opt) (!my_state_is_do(opt)) -#define my_state_is_wont(opt) (!my_state_is_will(opt)) -#define my_want_state_is_dont(opt) (!my_want_state_is_do(opt)) -#define my_want_state_is_wont(opt) (!my_want_state_is_will(opt)) - -#define set_my_state_do(opt) (options[opt] |= MY_STATE_DO) -#define set_my_state_will(opt) (options[opt] |= MY_STATE_WILL) -#define set_my_want_state_do(opt) (options[opt] |= MY_WANT_STATE_DO) -#define set_my_want_state_will(opt) (options[opt] |= MY_WANT_STATE_WILL) - -#define set_my_state_dont(opt) (options[opt] &= ~MY_STATE_DO) -#define set_my_state_wont(opt) (options[opt] &= ~MY_STATE_WILL) -#define set_my_want_state_dont(opt) (options[opt] &= ~MY_WANT_STATE_DO) -#define set_my_want_state_wont(opt) (options[opt] &= ~MY_WANT_STATE_WILL) - -/* - * Tricky code here. What we want to know is if the MY_STATE_WILL - * and MY_WANT_STATE_WILL bits have the same value. Since the two - * bits are adjacent, a little arithmatic will show that by adding - * in the lower bit, the upper bit will be set if the two bits were - * different, and clear if they were the same. - */ -#define my_will_wont_is_changing(opt) \ - ((options[opt]+MY_STATE_WILL) & MY_WANT_STATE_WILL) - -#define my_do_dont_is_changing(opt) \ - ((options[opt]+MY_STATE_DO) & MY_WANT_STATE_DO) - -/* - * Make everything symmetrical - */ - -#define HIS_STATE_WILL MY_STATE_DO -#define HIS_WANT_STATE_WILL MY_WANT_STATE_DO -#define HIS_STATE_DO MY_STATE_WILL -#define HIS_WANT_STATE_DO MY_WANT_STATE_WILL - -#define his_state_is_do my_state_is_will -#define his_state_is_will my_state_is_do -#define his_want_state_is_do my_want_state_is_will -#define his_want_state_is_will my_want_state_is_do - -#define his_state_is_dont my_state_is_wont -#define his_state_is_wont my_state_is_dont -#define his_want_state_is_dont my_want_state_is_wont -#define his_want_state_is_wont my_want_state_is_dont - -#define set_his_state_do set_my_state_will -#define set_his_state_will set_my_state_do -#define set_his_want_state_do set_my_want_state_will -#define set_his_want_state_will set_my_want_state_do - -#define set_his_state_dont set_my_state_wont -#define set_his_state_wont set_my_state_dont -#define set_his_want_state_dont set_my_want_state_wont -#define set_his_want_state_wont set_my_want_state_dont - -#define his_will_wont_is_changing my_do_dont_is_changing -#define his_do_dont_is_changing my_will_wont_is_changing - -#endif /* __DEFS_H__ */ diff --git a/crypto/heimdal/appl/telnet/telnetd/ext.h b/crypto/heimdal/appl/telnet/telnetd/ext.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/ext.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)ext.h 8.2 (Berkeley) 12/15/93 - */ - -/* $Id$ */ - -#ifndef __EXT_H__ -#define __EXT_H__ - -/* - * Telnet server variable declarations - */ -extern char options[256]; -extern char do_dont_resp[256]; -extern char will_wont_resp[256]; -extern int flowmode; /* current flow control state */ -extern int restartany; /* restart output on any character state */ -#ifdef DIAGNOSTICS -extern int diagnostic; /* telnet diagnostic capabilities */ -#endif /* DIAGNOSTICS */ -extern int require_otp; -#ifdef AUTHENTICATION -extern int auth_level; -#endif -extern const char *new_login; - -extern slcfun slctab[NSLC + 1]; /* slc mapping table */ - -extern char terminaltype[41]; - -/* - * I/O data buffers, pointers, and counters. - */ -extern char ptyobuf[BUFSIZ+NETSLOP], *pfrontp, *pbackp; - -extern char netibuf[BUFSIZ], *netip; - -extern char netobuf[BUFSIZ+NETSLOP], *nfrontp, *nbackp; -extern char *neturg; /* one past last bye of urgent data */ - -extern int pcc, ncc; - -extern int ourpty, net; -extern char *line; -extern int SYNCHing; /* we are in TELNET SYNCH mode */ - -int telnet_net_write (unsigned char *str, int len); -void net_encrypt (void); -int telnet_spin (void); -char *telnet_getenv (const char *val); -char *telnet_gets (char *prompt, char *result, int length, int echo); -void get_slc_defaults (void); -void telrcv (void); -void send_do (int option, int init); -void willoption (int option); -void send_dont (int option, int init); -void wontoption (int option); -void send_will (int option, int init); -void dooption (int option); -void send_wont (int option, int init); -void dontoption (int option); -void suboption (void); -void doclientstat (void); -void send_status (void); -void init_termbuf (void); -void set_termbuf (void); -int spcset (int func, cc_t *valp, cc_t **valpp); -void set_utid (void); -int getpty (int *ptynum); -int tty_isecho (void); -int tty_flowmode (void); -int tty_restartany (void); -void tty_setecho (int on); -int tty_israw (void); -void tty_binaryin (int on); -void tty_binaryout (int on); -int tty_isbinaryin (void); -int tty_isbinaryout (void); -int tty_issofttab (void); -void tty_setsofttab (int on); -int tty_islitecho (void); -void tty_setlitecho (int on); -int tty_iscrnl (void); -void tty_tspeed (int val); -void tty_rspeed (int val); -void getptyslave (void); -int cleanopen (char *); -void startslave (const char *host, const char *, int autologin, char *autoname); -void init_env (void); -void start_login (const char *host, int autologin, char *name); -void cleanup (int sig); -int main (int argc, char **argv); -int getterminaltype (char *name, size_t); -void _gettermname (void); -int terminaltypeok (char *s); -void my_telnet (int f, int p, const char*, const char *, int, char*); -void interrupt (void); -void sendbrk (void); -void sendsusp (void); -void recv_ayt (void); -void doeof (void); -void flowstat (void); -void clientstat (int code, int parm1, int parm2); -int ttloop (void); -int stilloob (int s); -void ptyflush (void); -char *nextitem (char *current); -void netclear (void); -void netflush (void); -void writenet (const void *, size_t); -void fatal (int f, char *msg); -void fatalperror (int f, const char *msg); -void fatalperror_errno (int f, const char *msg, int error); -void edithost (char *pat, char *host); -void putstr (char *s); -void putchr (int cc); -void putf (char *cp, char *where); -void printoption (char *fmt, int option); -void printsub (int direction, unsigned char *pointer, size_t length); -void printdata (char *tag, char *ptr, size_t cnt); -int login_tty(int t); - -#ifdef ENCRYPTION -extern void (*encrypt_output) (unsigned char *, int); -extern int (*decrypt_input) (int); -extern char *nclearto; -#endif - - -/* - * The following are some clocks used to decide how to interpret - * the relationship between various variables. - */ - -struct clocks_t{ - int - system, /* what the current time is */ - echotoggle, /* last time user entered echo character */ - modenegotiated, /* last time operating mode negotiated */ - didnetreceive, /* last time we read data from network */ - ttypesubopt, /* ttype subopt is received */ - tspeedsubopt, /* tspeed subopt is received */ - environsubopt, /* environ subopt is received */ - oenvironsubopt, /* old environ subopt is received */ - xdisplocsubopt, /* xdisploc subopt is received */ - baseline, /* time started to do timed action */ - gotDM; /* when did we last see a data mark */ -}; -extern struct clocks_t clocks; - -extern int log_unauth; -extern int no_warn; - -extern int def_tspeed, def_rspeed; -#ifdef TIOCSWINSZ -extern int def_row, def_col; -#endif - -#ifdef STREAMSPTY -extern int really_stream; -#endif - -#ifndef USE_IM -# ifdef CRAY -# define USE_IM "Cray UNICOS (%h) (%t)" -# endif -# ifdef _AIX -# define USE_IM "%s %v.%r (%h) (%t)" -# endif -# ifndef USE_IM -# define USE_IM "%s %r (%h) (%t)" -# endif -#endif - -#define DEFAULT_IM "\r\n\r\n" USE_IM "\r\n\r\n\r\n" - -#endif /* __EXT_H__ */ diff --git a/crypto/heimdal/appl/telnet/telnetd/global.c b/crypto/heimdal/appl/telnet/telnetd/global.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/global.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* a *lot* of ugly global definitions that really should be removed... - */ - -#include "telnetd.h" - -RCSID("$Id$"); - -/* - * Telnet server variable declarations - */ -char options[256]; -char do_dont_resp[256]; -char will_wont_resp[256]; -int linemode; /* linemode on/off */ -int flowmode; /* current flow control state */ -int restartany; /* restart output on any character state */ -#ifdef DIAGNOSTICS -int diagnostic; /* telnet diagnostic capabilities */ -#endif /* DIAGNOSTICS */ -int require_otp; - -slcfun slctab[NSLC + 1]; /* slc mapping table */ - -char terminaltype[41]; - -/* - * I/O data buffers, pointers, and counters. - */ -char ptyobuf[BUFSIZ+NETSLOP], *pfrontp, *pbackp; - -char netibuf[BUFSIZ], *netip; - -char netobuf[BUFSIZ+NETSLOP], *nfrontp, *nbackp; -char *neturg; /* one past last bye of urgent data */ - -int pcc, ncc; - -int ourpty, net; -int SYNCHing; /* we are in TELNET SYNCH mode */ - -/* - * The following are some clocks used to decide how to interpret - * the relationship between various variables. - */ - -struct clocks_t clocks; - - -/* whether to log unauthenticated login attempts */ -int log_unauth; - -/* do not print warning if connection is not encrypted */ -int no_warn; - -/* - * This function appends data to nfrontp and advances nfrontp. - */ - -int -output_data (const char *format, ...) -{ - va_list args; - int remaining, ret; - - va_start(args, format); - remaining = BUFSIZ - (nfrontp - netobuf); - ret = vsnprintf (nfrontp, - remaining, - format, - args); - nfrontp += min(ret, remaining-1); - va_end(args); - return ret; -} diff --git a/crypto/heimdal/appl/telnet/telnetd/slc.c b/crypto/heimdal/appl/telnet/telnetd/slc.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/slc.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnetd.h" - -RCSID("$Id$"); - -/* - * get_slc_defaults - * - * Initialize the slc mapping table. - */ -void -get_slc_defaults(void) -{ - int i; - - init_termbuf(); - - for (i = 1; i <= NSLC; i++) { - slctab[i].defset.flag = - spcset(i, &slctab[i].defset.val, &slctab[i].sptr); - slctab[i].current.flag = SLC_NOSUPPORT; - slctab[i].current.val = 0; - } - -} diff --git a/crypto/heimdal/appl/telnet/telnetd/state.c b/crypto/heimdal/appl/telnet/telnetd/state.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/state.c +++ /dev/null @@ -1,1360 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnetd.h" - -RCSID("$Id$"); - -unsigned char doopt[] = { IAC, DO, '%', 'c', 0 }; -unsigned char dont[] = { IAC, DONT, '%', 'c', 0 }; -unsigned char will[] = { IAC, WILL, '%', 'c', 0 }; -unsigned char wont[] = { IAC, WONT, '%', 'c', 0 }; -int not42 = 1; - -/* - * Buffer for sub-options, and macros - * for suboptions buffer manipulations - */ -unsigned char subbuffer[1024*64], *subpointer= subbuffer, *subend= subbuffer; - -#define SB_CLEAR() subpointer = subbuffer -#define SB_TERM() { subend = subpointer; SB_CLEAR(); } -#define SB_ACCUM(c) if (subpointer < (subbuffer+sizeof subbuffer)) { \ - *subpointer++ = (c); \ - } -#define SB_GET() ((*subpointer++)&0xff) -#define SB_EOF() (subpointer >= subend) -#define SB_LEN() (subend - subpointer) - -#ifdef ENV_HACK -unsigned char *subsave; -#define SB_SAVE() subsave = subpointer; -#define SB_RESTORE() subpointer = subsave; -#endif - - -/* - * State for recv fsm - */ -#define TS_DATA 0 /* base state */ -#define TS_IAC 1 /* look for double IAC's */ -#define TS_CR 2 /* CR-LF ->'s CR */ -#define TS_SB 3 /* throw away begin's... */ -#define TS_SE 4 /* ...end's (suboption negotiation) */ -#define TS_WILL 5 /* will option negotiation */ -#define TS_WONT 6 /* wont -''- */ -#define TS_DO 7 /* do -''- */ -#define TS_DONT 8 /* dont -''- */ - -void -telrcv(void) -{ - int c; - static int state = TS_DATA; - - while (ncc > 0) { - if ((&ptyobuf[BUFSIZ] - pfrontp) < 2) - break; - c = *netip++ & 0377, ncc--; -#ifdef ENCRYPTION - if (decrypt_input) - c = (*decrypt_input)(c); -#endif - switch (state) { - - case TS_CR: - state = TS_DATA; - /* Strip off \n or \0 after a \r */ - if ((c == 0) || (c == '\n')) { - break; - } - /* FALL THROUGH */ - - case TS_DATA: - if (c == IAC) { - state = TS_IAC; - break; - } - /* - * We now map \r\n ==> \r for pragmatic reasons. - * Many client implementations send \r\n when - * the user hits the CarriageReturn key. - * - * We USED to map \r\n ==> \n, since \r\n says - * that we want to be in column 1 of the next - * printable line, and \n is the standard - * unix way of saying that (\r is only good - * if CRMOD is set, which it normally is). - */ - if ((c == '\r') && his_state_is_wont(TELOPT_BINARY)) { - int nc = *netip; -#ifdef ENCRYPTION - if (decrypt_input) - nc = (*decrypt_input)(nc & 0xff); -#endif - { -#ifdef ENCRYPTION - if (decrypt_input) - (void)(*decrypt_input)(-1); -#endif - state = TS_CR; - } - } - *pfrontp++ = c; - break; - - case TS_IAC: - gotiac: switch (c) { - - /* - * Send the process on the pty side an - * interrupt. Do this with a NULL or - * interrupt char; depending on the tty mode. - */ - case IP: - DIAG(TD_OPTIONS, - printoption("td: recv IAC", c)); - interrupt(); - break; - - case BREAK: - DIAG(TD_OPTIONS, - printoption("td: recv IAC", c)); - sendbrk(); - break; - - /* - * Are You There? - */ - case AYT: - DIAG(TD_OPTIONS, - printoption("td: recv IAC", c)); - recv_ayt(); - break; - - /* - * Abort Output - */ - case AO: - { - DIAG(TD_OPTIONS, - printoption("td: recv IAC", c)); - ptyflush(); /* half-hearted */ - init_termbuf(); - - if (slctab[SLC_AO].sptr && - *slctab[SLC_AO].sptr != (cc_t)(_POSIX_VDISABLE)) { - *pfrontp++ = - (unsigned char)*slctab[SLC_AO].sptr; - } - - netclear(); /* clear buffer back */ - output_data ("%c%c", IAC, DM); - neturg = nfrontp-1; /* off by one XXX */ - DIAG(TD_OPTIONS, - printoption("td: send IAC", DM)); - break; - } - - /* - * Erase Character and - * Erase Line - */ - case EC: - case EL: - { - cc_t ch; - - DIAG(TD_OPTIONS, - printoption("td: recv IAC", c)); - ptyflush(); /* half-hearted */ - init_termbuf(); - if (c == EC) - ch = *slctab[SLC_EC].sptr; - else - ch = *slctab[SLC_EL].sptr; - if (ch != (cc_t)(_POSIX_VDISABLE)) - *pfrontp++ = (unsigned char)ch; - break; - } - - /* - * Check for urgent data... - */ - case DM: - DIAG(TD_OPTIONS, - printoption("td: recv IAC", c)); - SYNCHing = stilloob(net); - settimer(gotDM); - break; - - - /* - * Begin option subnegotiation... - */ - case SB: - state = TS_SB; - SB_CLEAR(); - continue; - - case WILL: - state = TS_WILL; - continue; - - case WONT: - state = TS_WONT; - continue; - - case DO: - state = TS_DO; - continue; - - case DONT: - state = TS_DONT; - continue; - case EOR: - if (his_state_is_will(TELOPT_EOR)) - doeof(); - break; - - /* - * Handle RFC 10xx Telnet linemode option additions - * to command stream (EOF, SUSP, ABORT). - */ - case xEOF: - doeof(); - break; - - case SUSP: - sendsusp(); - break; - - case ABORT: - sendbrk(); - break; - - case IAC: - *pfrontp++ = c; - break; - } - state = TS_DATA; - break; - - case TS_SB: - if (c == IAC) { - state = TS_SE; - } else { - SB_ACCUM(c); - } - break; - - case TS_SE: - if (c != SE) { - if (c != IAC) { - /* - * bad form of suboption negotiation. - * handle it in such a way as to avoid - * damage to local state. Parse - * suboption buffer found so far, - * then treat remaining stream as - * another command sequence. - */ - - /* for DIAGNOSTICS */ - SB_ACCUM(IAC); - SB_ACCUM(c); - subpointer -= 2; - - SB_TERM(); - suboption(); - state = TS_IAC; - goto gotiac; - } - SB_ACCUM(c); - state = TS_SB; - } else { - /* for DIAGNOSTICS */ - SB_ACCUM(IAC); - SB_ACCUM(SE); - subpointer -= 2; - - SB_TERM(); - suboption(); /* handle sub-option */ - state = TS_DATA; - } - break; - - case TS_WILL: - willoption(c); - state = TS_DATA; - continue; - - case TS_WONT: - wontoption(c); - if (c==TELOPT_ENCRYPT && his_do_dont_is_changing(TELOPT_ENCRYPT) ) - dontoption(c); - state = TS_DATA; - continue; - - case TS_DO: - dooption(c); - state = TS_DATA; - continue; - - case TS_DONT: - dontoption(c); - state = TS_DATA; - continue; - - default: - syslog(LOG_ERR, "telnetd: panic state=%d\n", state); - printf("telnetd: panic state=%d\n", state); - exit(1); - } - } -} /* end of telrcv */ - -/* - * The will/wont/do/dont state machines are based on Dave Borman's - * Telnet option processing state machine. - * - * These correspond to the following states: - * my_state = the last negotiated state - * want_state = what I want the state to go to - * want_resp = how many requests I have sent - * All state defaults are negative, and resp defaults to 0. - * - * When initiating a request to change state to new_state: - * - * if ((want_resp == 0 && new_state == my_state) || want_state == new_state) { - * do nothing; - * } else { - * want_state = new_state; - * send new_state; - * want_resp++; - * } - * - * When receiving new_state: - * - * if (want_resp) { - * want_resp--; - * if (want_resp && (new_state == my_state)) - * want_resp--; - * } - * if ((want_resp == 0) && (new_state != want_state)) { - * if (ok_to_switch_to new_state) - * want_state = new_state; - * else - * want_resp++; - * send want_state; - * } - * my_state = new_state; - * - * Note that new_state is implied in these functions by the function itself. - * will and do imply positive new_state, wont and dont imply negative. - * - * Finally, there is one catch. If we send a negative response to a - * positive request, my_state will be the positive while want_state will - * remain negative. my_state will revert to negative when the negative - * acknowlegment arrives from the peer. Thus, my_state generally tells - * us not only the last negotiated state, but also tells us what the peer - * wants to be doing as well. It is important to understand this difference - * as we may wish to be processing data streams based on our desired state - * (want_state) or based on what the peer thinks the state is (my_state). - * - * This all works fine because if the peer sends a positive request, the data - * that we receive prior to negative acknowlegment will probably be affected - * by the positive state, and we can process it as such (if we can; if we - * can't then it really doesn't matter). If it is that important, then the - * peer probably should be buffering until this option state negotiation - * is complete. - * - */ -void -send_do(int option, int init) -{ - if (init) { - if ((do_dont_resp[option] == 0 && his_state_is_will(option)) || - his_want_state_is_will(option)) - return; - /* - * Special case for TELOPT_TM: We send a DO, but pretend - * that we sent a DONT, so that we can send more DOs if - * we want to. - */ - if (option == TELOPT_TM) - set_his_want_state_wont(option); - else - set_his_want_state_will(option); - do_dont_resp[option]++; - } - output_data((const char *)doopt, option); - - DIAG(TD_OPTIONS, printoption("td: send do", option)); -} - -#ifdef AUTHENTICATION -extern void auth_request(void); -#endif -#ifdef ENCRYPTION -extern void encrypt_send_support(void); -#endif - -void -willoption(int option) -{ - int changeok = 0; - void (*func)(void) = NULL; - - /* - * process input from peer. - */ - - DIAG(TD_OPTIONS, printoption("td: recv will", option)); - - if (do_dont_resp[option]) { - do_dont_resp[option]--; - if (do_dont_resp[option] && his_state_is_will(option)) - do_dont_resp[option]--; - } - if (do_dont_resp[option] == 0) { - if (his_want_state_is_wont(option)) { - switch (option) { - - case TELOPT_BINARY: - init_termbuf(); - tty_binaryin(1); - set_termbuf(); - changeok++; - break; - - case TELOPT_ECHO: - /* - * See comments below for more info. - */ - not42 = 0; /* looks like a 4.2 system */ - break; - - case TELOPT_TM: - /* - * We never respond to a WILL TM, and - * we leave the state WONT. - */ - return; - - case TELOPT_LFLOW: - /* - * If we are going to support flow control - * option, then don't worry peer that we can't - * change the flow control characters. - */ - slctab[SLC_XON].defset.flag &= ~SLC_LEVELBITS; - slctab[SLC_XON].defset.flag |= SLC_DEFAULT; - slctab[SLC_XOFF].defset.flag &= ~SLC_LEVELBITS; - slctab[SLC_XOFF].defset.flag |= SLC_DEFAULT; - case TELOPT_TTYPE: - case TELOPT_SGA: - case TELOPT_NAWS: - case TELOPT_TSPEED: - case TELOPT_XDISPLOC: - case TELOPT_NEW_ENVIRON: - case TELOPT_OLD_ENVIRON: - changeok++; - break; - - -#ifdef AUTHENTICATION - case TELOPT_AUTHENTICATION: - func = auth_request; - changeok++; - break; -#endif - -#ifdef ENCRYPTION - case TELOPT_ENCRYPT: - func = encrypt_send_support; - changeok++; - break; -#endif - - default: - break; - } - if (changeok) { - set_his_want_state_will(option); - send_do(option, 0); - } else { - do_dont_resp[option]++; - send_dont(option, 0); - } - } else { - /* - * Option processing that should happen when - * we receive conformation of a change in - * state that we had requested. - */ - switch (option) { - case TELOPT_ECHO: - not42 = 0; /* looks like a 4.2 system */ - /* - * Egads, he responded "WILL ECHO". Turn - * it off right now! - */ - send_dont(option, 1); - /* - * "WILL ECHO". Kludge upon kludge! - * A 4.2 client is now echoing user input at - * the tty. This is probably undesireable and - * it should be stopped. The client will - * respond WONT TM to the DO TM that we send to - * check for kludge linemode. When the WONT TM - * arrives, linemode will be turned off and a - * change propogated to the pty. This change - * will cause us to process the new pty state - * in localstat(), which will notice that - * linemode is off and send a WILL ECHO - * so that we are properly in character mode and - * all is well. - */ - break; - -#ifdef AUTHENTICATION - case TELOPT_AUTHENTICATION: - func = auth_request; - break; -#endif - -#ifdef ENCRYPTION - case TELOPT_ENCRYPT: - func = encrypt_send_support; - break; -#endif - - case TELOPT_LFLOW: - func = flowstat; - break; - } - } - } - set_his_state_will(option); - if (func) - (*func)(); -} /* end of willoption */ - -void -send_dont(int option, int init) -{ - if (init) { - if ((do_dont_resp[option] == 0 && his_state_is_wont(option)) || - his_want_state_is_wont(option)) - return; - set_his_want_state_wont(option); - do_dont_resp[option]++; - } - output_data((const char *)dont, option); - - DIAG(TD_OPTIONS, printoption("td: send dont", option)); -} - -void -wontoption(int option) -{ - /* - * Process client input. - */ - - DIAG(TD_OPTIONS, printoption("td: recv wont", option)); - - if (do_dont_resp[option]) { - do_dont_resp[option]--; - if (do_dont_resp[option] && his_state_is_wont(option)) - do_dont_resp[option]--; - } - if (do_dont_resp[option] == 0) { - if (his_want_state_is_will(option)) { - /* it is always ok to change to negative state */ - switch (option) { - case TELOPT_ECHO: - not42 = 1; /* doesn't seem to be a 4.2 system */ - break; - - case TELOPT_BINARY: - init_termbuf(); - tty_binaryin(0); - set_termbuf(); - break; - - case TELOPT_TM: - /* - * If we get a WONT TM, and had sent a DO TM, - * don't respond with a DONT TM, just leave it - * as is. Short circut the state machine to - * achive this. - */ - set_his_want_state_wont(TELOPT_TM); - return; - - case TELOPT_LFLOW: - /* - * If we are not going to support flow control - * option, then let peer know that we can't - * change the flow control characters. - */ - slctab[SLC_XON].defset.flag &= ~SLC_LEVELBITS; - slctab[SLC_XON].defset.flag |= SLC_CANTCHANGE; - slctab[SLC_XOFF].defset.flag &= ~SLC_LEVELBITS; - slctab[SLC_XOFF].defset.flag |= SLC_CANTCHANGE; - break; - -#ifdef AUTHENTICATION - case TELOPT_AUTHENTICATION: - auth_finished(0, AUTH_REJECT); - break; -#endif - - /* - * For options that we might spin waiting for - * sub-negotiation, if the client turns off the - * option rather than responding to the request, - * we have to treat it here as if we got a response - * to the sub-negotiation, (by updating the timers) - * so that we'll break out of the loop. - */ - case TELOPT_TTYPE: - settimer(ttypesubopt); - break; - - case TELOPT_TSPEED: - settimer(tspeedsubopt); - break; - - case TELOPT_XDISPLOC: - settimer(xdisplocsubopt); - break; - - case TELOPT_OLD_ENVIRON: - settimer(oenvironsubopt); - break; - - case TELOPT_NEW_ENVIRON: - settimer(environsubopt); - break; - - default: - break; - } - set_his_want_state_wont(option); - if (his_state_is_will(option)) - send_dont(option, 0); - } else { - switch (option) { - case TELOPT_TM: - break; - -#ifdef AUTHENTICATION - case TELOPT_AUTHENTICATION: - auth_finished(0, AUTH_REJECT); - break; -#endif - default: - break; - } - } - } - set_his_state_wont(option); - -} /* end of wontoption */ - -void -send_will(int option, int init) -{ - if (init) { - if ((will_wont_resp[option] == 0 && my_state_is_will(option))|| - my_want_state_is_will(option)) - return; - set_my_want_state_will(option); - will_wont_resp[option]++; - } - output_data ((const char *)will, option); - - DIAG(TD_OPTIONS, printoption("td: send will", option)); -} - -/* - * When we get a DONT SGA, we will try once to turn it - * back on. If the other side responds DONT SGA, we - * leave it at that. This is so that when we talk to - * clients that understand KLUDGELINEMODE but not LINEMODE, - * we'll keep them in char-at-a-time mode. - */ -int turn_on_sga = 0; - -void -dooption(int option) -{ - int changeok = 0; - - /* - * Process client input. - */ - - DIAG(TD_OPTIONS, printoption("td: recv do", option)); - - if (will_wont_resp[option]) { - will_wont_resp[option]--; - if (will_wont_resp[option] && my_state_is_will(option)) - will_wont_resp[option]--; - } - if ((will_wont_resp[option] == 0) && (my_want_state_is_wont(option))) { - switch (option) { - case TELOPT_ECHO: - { - init_termbuf(); - tty_setecho(1); - set_termbuf(); - } - changeok++; - break; - - case TELOPT_BINARY: - init_termbuf(); - tty_binaryout(1); - set_termbuf(); - changeok++; - break; - - case TELOPT_SGA: - turn_on_sga = 0; - changeok++; - break; - - case TELOPT_STATUS: - changeok++; - break; - - case TELOPT_TM: - /* - * Special case for TM. We send a WILL, but - * pretend we sent a WONT. - */ - send_will(option, 0); - set_my_want_state_wont(option); - set_my_state_wont(option); - return; - - case TELOPT_LOGOUT: - /* - * When we get a LOGOUT option, respond - * with a WILL LOGOUT, make sure that - * it gets written out to the network, - * and then just go away... - */ - set_my_want_state_will(TELOPT_LOGOUT); - send_will(TELOPT_LOGOUT, 0); - set_my_state_will(TELOPT_LOGOUT); - netflush(); - cleanup(0); - /* NOT REACHED */ - break; - -#ifdef ENCRYPTION - case TELOPT_ENCRYPT: - changeok++; - break; -#endif - case TELOPT_LINEMODE: - case TELOPT_TTYPE: - case TELOPT_NAWS: - case TELOPT_TSPEED: - case TELOPT_LFLOW: - case TELOPT_XDISPLOC: -#ifdef TELOPT_ENVIRON - case TELOPT_NEW_ENVIRON: -#endif - case TELOPT_OLD_ENVIRON: - default: - break; - } - if (changeok) { - set_my_want_state_will(option); - send_will(option, 0); - } else { - will_wont_resp[option]++; - send_wont(option, 0); - } - } - set_my_state_will(option); - -} /* end of dooption */ - -void -send_wont(int option, int init) -{ - if (init) { - if ((will_wont_resp[option] == 0 && my_state_is_wont(option)) || - my_want_state_is_wont(option)) - return; - set_my_want_state_wont(option); - will_wont_resp[option]++; - } - output_data ((const char *)wont, option); - - DIAG(TD_OPTIONS, printoption("td: send wont", option)); -} - -void -dontoption(int option) -{ - /* - * Process client input. - */ - - - DIAG(TD_OPTIONS, printoption("td: recv dont", option)); - - if (will_wont_resp[option]) { - will_wont_resp[option]--; - if (will_wont_resp[option] && my_state_is_wont(option)) - will_wont_resp[option]--; - } - if ((will_wont_resp[option] == 0) && (my_want_state_is_will(option))) { - switch (option) { - case TELOPT_BINARY: - init_termbuf(); - tty_binaryout(0); - set_termbuf(); - break; - - case TELOPT_ECHO: /* we should stop echoing */ - { - init_termbuf(); - tty_setecho(0); - set_termbuf(); - } - break; - - case TELOPT_SGA: - set_my_want_state_wont(option); - if (my_state_is_will(option)) - send_wont(option, 0); - set_my_state_wont(option); - if (turn_on_sga ^= 1) - send_will(option, 1); - return; - - default: - break; - } - - set_my_want_state_wont(option); - if (my_state_is_will(option)) - send_wont(option, 0); - } - set_my_state_wont(option); - -} /* end of dontoption */ - -#ifdef ENV_HACK -int env_ovar = -1; -int env_ovalue = -1; -#else /* ENV_HACK */ -# define env_ovar OLD_ENV_VAR -# define env_ovalue OLD_ENV_VALUE -#endif /* ENV_HACK */ - -/* - * suboption() - * - * Look at the sub-option buffer, and try to be helpful to the other - * side. - * - * Currently we recognize: - * - * Terminal type is - * Linemode - * Window size - * Terminal speed - */ -void -suboption(void) -{ - int subchar; - - DIAG(TD_OPTIONS, {netflush(); printsub('<', subpointer, SB_LEN()+2);}); - - subchar = SB_GET(); - switch (subchar) { - case TELOPT_TSPEED: { - int xspeed, rspeed; - - if (his_state_is_wont(TELOPT_TSPEED)) /* Ignore if option disabled */ - break; - - settimer(tspeedsubopt); - - if (SB_EOF() || SB_GET() != TELQUAL_IS) - return; - - xspeed = atoi((char *)subpointer); - - while (SB_GET() != ',' && !SB_EOF()); - if (SB_EOF()) - return; - - rspeed = atoi((char *)subpointer); - clientstat(TELOPT_TSPEED, xspeed, rspeed); - - break; - - } /* end of case TELOPT_TSPEED */ - - case TELOPT_TTYPE: { /* Yaaaay! */ - char *p; - - if (his_state_is_wont(TELOPT_TTYPE)) /* Ignore if option disabled */ - break; - settimer(ttypesubopt); - - if (SB_EOF() || SB_GET() != TELQUAL_IS) { - return; /* ??? XXX but, this is the most robust */ - } - - p = terminaltype; - - while ((p < (terminaltype + sizeof terminaltype-1)) && - !SB_EOF()) { - int c; - - c = SB_GET(); - if (isupper(c)) { - c = tolower(c); - } - *p++ = c; /* accumulate name */ - } - *p = 0; - break; - } /* end of case TELOPT_TTYPE */ - - case TELOPT_NAWS: { - int xwinsize, ywinsize; - - if (his_state_is_wont(TELOPT_NAWS)) /* Ignore if option disabled */ - break; - - if (SB_EOF()) - return; - xwinsize = SB_GET() << 8; - if (SB_EOF()) - return; - xwinsize |= SB_GET(); - if (SB_EOF()) - return; - ywinsize = SB_GET() << 8; - if (SB_EOF()) - return; - ywinsize |= SB_GET(); - clientstat(TELOPT_NAWS, xwinsize, ywinsize); - - break; - - } /* end of case TELOPT_NAWS */ - - case TELOPT_STATUS: { - int mode; - - if (SB_EOF()) - break; - mode = SB_GET(); - switch (mode) { - case TELQUAL_SEND: - if (my_state_is_will(TELOPT_STATUS)) - send_status(); - break; - - case TELQUAL_IS: - break; - - default: - break; - } - break; - } /* end of case TELOPT_STATUS */ - - case TELOPT_XDISPLOC: { - if (SB_EOF() || SB_GET() != TELQUAL_IS) - return; - settimer(xdisplocsubopt); - subpointer[SB_LEN()] = '\0'; - esetenv("DISPLAY", (char *)subpointer, 1); - break; - } /* end of case TELOPT_XDISPLOC */ - -#ifdef TELOPT_NEW_ENVIRON - case TELOPT_NEW_ENVIRON: -#endif - case TELOPT_OLD_ENVIRON: { - int c; - char *cp, *varp, *valp; - - if (SB_EOF()) - return; - c = SB_GET(); - if (c == TELQUAL_IS) { - if (subchar == TELOPT_OLD_ENVIRON) - settimer(oenvironsubopt); - else - settimer(environsubopt); - } else if (c != TELQUAL_INFO) { - return; - } - -#ifdef TELOPT_NEW_ENVIRON - if (subchar == TELOPT_NEW_ENVIRON) { - while (!SB_EOF()) { - c = SB_GET(); - if ((c == NEW_ENV_VAR) || (c == ENV_USERVAR)) - break; - } - } else -#endif - { -#ifdef ENV_HACK - /* - * We only want to do this if we haven't already decided - * whether or not the other side has its VALUE and VAR - * reversed. - */ - if (env_ovar < 0) { - int last = -1; /* invalid value */ - int empty = 0; - int got_var = 0, got_value = 0, got_uservar = 0; - - /* - * The other side might have its VALUE and VAR values - * reversed. To be interoperable, we need to determine - * which way it is. If the first recognized character - * is a VAR or VALUE, then that will tell us what - * type of client it is. If the fist recognized - * character is a USERVAR, then we continue scanning - * the suboption looking for two consecutive - * VAR or VALUE fields. We should not get two - * consecutive VALUE fields, so finding two - * consecutive VALUE or VAR fields will tell us - * what the client is. - */ - SB_SAVE(); - while (!SB_EOF()) { - c = SB_GET(); - switch(c) { - case OLD_ENV_VAR: - if (last < 0 || last == OLD_ENV_VAR - || (empty && (last == OLD_ENV_VALUE))) - goto env_ovar_ok; - got_var++; - last = OLD_ENV_VAR; - break; - case OLD_ENV_VALUE: - if (last < 0 || last == OLD_ENV_VALUE - || (empty && (last == OLD_ENV_VAR))) - goto env_ovar_wrong; - got_value++; - last = OLD_ENV_VALUE; - break; - case ENV_USERVAR: - /* count strings of USERVAR as one */ - if (last != ENV_USERVAR) - got_uservar++; - if (empty) { - if (last == OLD_ENV_VALUE) - goto env_ovar_ok; - if (last == OLD_ENV_VAR) - goto env_ovar_wrong; - } - last = ENV_USERVAR; - break; - case ENV_ESC: - if (!SB_EOF()) - c = SB_GET(); - /* FALL THROUGH */ - default: - empty = 0; - continue; - } - empty = 1; - } - if (empty) { - if (last == OLD_ENV_VALUE) - goto env_ovar_ok; - if (last == OLD_ENV_VAR) - goto env_ovar_wrong; - } - /* - * Ok, the first thing was a USERVAR, and there - * are not two consecutive VAR or VALUE commands, - * and none of the VAR or VALUE commands are empty. - * If the client has sent us a well-formed option, - * then the number of VALUEs received should always - * be less than or equal to the number of VARs and - * USERVARs received. - * - * If we got exactly as many VALUEs as VARs and - * USERVARs, the client has the same definitions. - * - * If we got exactly as many VARs as VALUEs and - * USERVARS, the client has reversed definitions. - */ - if (got_uservar + got_var == got_value) { - env_ovar_ok: - env_ovar = OLD_ENV_VAR; - env_ovalue = OLD_ENV_VALUE; - } else if (got_uservar + got_value == got_var) { - env_ovar_wrong: - env_ovar = OLD_ENV_VALUE; - env_ovalue = OLD_ENV_VAR; - DIAG(TD_OPTIONS, { - output_data("ENVIRON VALUE and VAR are reversed!\r\n"); - }); - - } - } - SB_RESTORE(); -#endif - - while (!SB_EOF()) { - c = SB_GET(); - if ((c == env_ovar) || (c == ENV_USERVAR)) - break; - } - } - - if (SB_EOF()) - return; - - cp = varp = (char *)subpointer; - valp = 0; - - while (!SB_EOF()) { - c = SB_GET(); - if (subchar == TELOPT_OLD_ENVIRON) { - if (c == env_ovar) - c = NEW_ENV_VAR; - else if (c == env_ovalue) - c = NEW_ENV_VALUE; - } - switch (c) { - - case NEW_ENV_VALUE: - *cp = '\0'; - cp = valp = (char *)subpointer; - break; - - case NEW_ENV_VAR: - case ENV_USERVAR: - *cp = '\0'; - if (valp) - esetenv(varp, valp, 1); - else - unsetenv(varp); - cp = varp = (char *)subpointer; - valp = 0; - break; - - case ENV_ESC: - if (SB_EOF()) - break; - c = SB_GET(); - /* FALL THROUGH */ - default: - *cp++ = c; - break; - } - } - *cp = '\0'; - if (valp) - esetenv(varp, valp, 1); - else - unsetenv(varp); - break; - } /* end of case TELOPT_NEW_ENVIRON */ -#ifdef AUTHENTICATION - case TELOPT_AUTHENTICATION: - if (SB_EOF()) - break; - switch(SB_GET()) { - case TELQUAL_SEND: - case TELQUAL_REPLY: - /* - * These are sent by us and cannot be sent by - * the client. - */ - break; - case TELQUAL_IS: - auth_is(subpointer, SB_LEN()); - break; - case TELQUAL_NAME: - auth_name(subpointer, SB_LEN()); - break; - } - break; -#endif -#ifdef ENCRYPTION - case TELOPT_ENCRYPT: - if (SB_EOF()) - break; - switch(SB_GET()) { - case ENCRYPT_SUPPORT: - encrypt_support(subpointer, SB_LEN()); - break; - case ENCRYPT_IS: - encrypt_is(subpointer, SB_LEN()); - break; - case ENCRYPT_REPLY: - encrypt_reply(subpointer, SB_LEN()); - break; - case ENCRYPT_START: - encrypt_start(subpointer, SB_LEN()); - break; - case ENCRYPT_END: - if (require_encryption) - fatal(net, "Output encryption is not possible to turn off"); - encrypt_end(); - break; - case ENCRYPT_REQSTART: - encrypt_request_start(subpointer, SB_LEN()); - break; - case ENCRYPT_REQEND: - /* - * We can always send an REQEND so that we cannot - * get stuck encrypting. We should only get this - * if we have been able to get in the correct mode - * anyhow. - */ - if (require_encryption) - fatal(net, "Input encryption is not possible to turn off"); - encrypt_request_end(); - break; - case ENCRYPT_ENC_KEYID: - encrypt_enc_keyid(subpointer, SB_LEN()); - break; - case ENCRYPT_DEC_KEYID: - encrypt_dec_keyid(subpointer, SB_LEN()); - break; - default: - break; - } - break; -#endif - - default: - break; - } /* end of switch */ - -} /* end of suboption */ - -void -doclientstat(void) -{ - clientstat(TELOPT_LINEMODE, WILL, 0); -} - -#undef ADD -#define ADD(c) *ncp++ = c -#define ADD_DATA(c) { *ncp++ = c; if (c == SE || c == IAC) *ncp++ = c; } - -void -send_status(void) -{ - unsigned char statusbuf[256]; - unsigned char *ncp; - unsigned char i; - - ncp = statusbuf; - - netflush(); /* get rid of anything waiting to go out */ - - ADD(IAC); - ADD(SB); - ADD(TELOPT_STATUS); - ADD(TELQUAL_IS); - - /* - * We check the want_state rather than the current state, - * because if we received a DO/WILL for an option that we - * don't support, and the other side didn't send a DONT/WONT - * in response to our WONT/DONT, then the "state" will be - * WILL/DO, and the "want_state" will be WONT/DONT. We - * need to go by the latter. - */ - for (i = 0; i < (unsigned char)NTELOPTS; i++) { - if (my_want_state_is_will(i)) { - ADD(WILL); - ADD_DATA(i); - } - if (his_want_state_is_will(i)) { - ADD(DO); - ADD_DATA(i); - } - } - - if (his_want_state_is_will(TELOPT_LFLOW)) { - ADD(SB); - ADD(TELOPT_LFLOW); - if (flowmode) { - ADD(LFLOW_ON); - } else { - ADD(LFLOW_OFF); - } - ADD(SE); - - if (restartany >= 0) { - ADD(SB); - ADD(TELOPT_LFLOW); - if (restartany) { - ADD(LFLOW_RESTART_ANY); - } else { - ADD(LFLOW_RESTART_XON); - } - ADD(SE); - } - } - - - ADD(IAC); - ADD(SE); - - writenet(statusbuf, ncp - statusbuf); - netflush(); /* Send it on its way */ - - DIAG(TD_OPTIONS, - {printsub('>', statusbuf, ncp - statusbuf); netflush();}); -} diff --git a/crypto/heimdal/appl/telnet/telnetd/sys_term.c b/crypto/heimdal/appl/telnet/telnetd/sys_term.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/sys_term.c +++ /dev/null @@ -1,1910 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnetd.h" - -RCSID("$Id$"); - -#if defined(_CRAY) || (defined(__hpux) && !defined(HAVE_UTMPX_H)) -# define PARENT_DOES_UTMP -#endif - -#ifdef HAVE_UTMP_H -#include -#endif - -#ifdef HAVE_UTMPX_H -#include -#endif - -#ifdef HAVE_UTMPX_H -struct utmpx wtmp; -#elif defined(HAVE_UTMP_H) -struct utmp wtmp; -#endif /* HAVE_UTMPX_H */ - -#ifdef HAVE_STRUCT_UTMP_UT_HOST -int utmp_len = sizeof(wtmp.ut_host); -#else -int utmp_len = MaxHostNameLen; -#endif - -#ifndef UTMP_FILE -#ifdef _PATH_UTMP -#define UTMP_FILE _PATH_UTMP -#else -#define UTMP_FILE "/etc/utmp" -#endif -#endif - -/* really, mac os uses wtmpx (or asl) */ -#ifdef __APPLE__ -#undef _PATH_WTMP -#endif - -#if !defined(WTMP_FILE) && defined(_PATH_WTMP) -#define WTMP_FILE _PATH_WTMP -#endif - -#ifndef PARENT_DOES_UTMP -#ifdef WTMP_FILE -char wtmpf[] = WTMP_FILE; -#else -char wtmpf[] = "/usr/adm/wtmp"; -#endif -char utmpf[] = UTMP_FILE; -#else /* PARENT_DOES_UTMP */ -#ifdef WTMP_FILE -char wtmpf[] = WTMP_FILE; -#else -char wtmpf[] = "/etc/wtmp"; -#endif -#endif /* PARENT_DOES_UTMP */ - -#ifdef HAVE_TMPDIR_H -#include -#endif /* CRAY */ - -#if !(defined(__sgi) || defined(__linux) || defined(_AIX)) && defined(HAVE_SYS_TTY) -#include -#endif -#ifdef t_erase -#undef t_erase -#undef t_kill -#undef t_intrc -#undef t_quitc -#undef t_startc -#undef t_stopc -#undef t_eofc -#undef t_brkc -#undef t_suspc -#undef t_dsuspc -#undef t_rprntc -#undef t_flushc -#undef t_werasc -#undef t_lnextc -#endif - -#ifdef HAVE_TERMIOS_H -#include -#else -#ifdef HAVE_TERMIO_H -#include -#endif -#endif - -#ifdef HAVE_UTIL_H -#include -#endif -#ifdef HAVE_LIBUTIL_H -#include -#endif - -# ifndef TCSANOW -# ifdef TCSETS -# define TCSANOW TCSETS -# define TCSADRAIN TCSETSW -# define tcgetattr(f, t) ioctl(f, TCGETS, (char *)t) -# else -# ifdef TCSETA -# define TCSANOW TCSETA -# define TCSADRAIN TCSETAW -# define tcgetattr(f, t) ioctl(f, TCGETA, (char *)t) -# else -# define TCSANOW TIOCSETA -# define TCSADRAIN TIOCSETAW -# define tcgetattr(f, t) ioctl(f, TIOCGETA, (char *)t) -# endif -# endif -# define tcsetattr(f, a, t) ioctl(f, a, t) -# define cfsetospeed(tp, val) (tp)->c_cflag &= ~CBAUD; \ -(tp)->c_cflag |= (val) -# define cfgetospeed(tp) ((tp)->c_cflag & CBAUD) -# ifdef CIBAUD -# define cfsetispeed(tp, val) (tp)->c_cflag &= ~CIBAUD; \ - (tp)->c_cflag |= ((val)<c_cflag & CIBAUD)>>IBSHIFT) -# else -# define cfsetispeed(tp, val) (tp)->c_cflag &= ~CBAUD; \ - (tp)->c_cflag |= (val) -# define cfgetispeed(tp) ((tp)->c_cflag & CBAUD) -# endif -# endif /* TCSANOW */ - struct termios termbuf, termbuf2; /* pty control structure */ -# ifdef STREAMSPTY - static int ttyfd = -1; - int really_stream = 0; -# else -#define really_stream 0 -# endif - - const char *new_login = _PATH_LOGIN; - -/* - * init_termbuf() - * copy_termbuf(cp) - * set_termbuf() - * - * These three routines are used to get and set the "termbuf" structure - * to and from the kernel. init_termbuf() gets the current settings. - * copy_termbuf() hands in a new "termbuf" to write to the kernel, and - * set_termbuf() writes the structure into the kernel. - */ - - void - init_termbuf(void) -{ -# ifdef STREAMSPTY - if (really_stream) - tcgetattr(ttyfd, &termbuf); - else -# endif - tcgetattr(ourpty, &termbuf); - termbuf2 = termbuf; -} - -void -set_termbuf(void) -{ - /* - * Only make the necessary changes. - */ - if (memcmp(&termbuf, &termbuf2, sizeof(termbuf))) { -# ifdef STREAMSPTY - if (really_stream) - tcsetattr(ttyfd, TCSANOW, &termbuf); - else -# endif - tcsetattr(ourpty, TCSANOW, &termbuf); - } -} - - -/* - * spcset(func, valp, valpp) - * - * This function takes various special characters (func), and - * sets *valp to the current value of that character, and - * *valpp to point to where in the "termbuf" structure that - * value is kept. - * - * It returns the SLC_ level of support for this function. - */ - - -int -spcset(int func, cc_t *valp, cc_t **valpp) -{ - -#define setval(a, b) *valp = termbuf.c_cc[a]; \ - *valpp = &termbuf.c_cc[a]; \ - return(b); -#define defval(a) *valp = ((cc_t)a); *valpp = (cc_t *)0; return(SLC_DEFAULT); - - switch(func) { - case SLC_EOF: - setval(VEOF, SLC_VARIABLE); - case SLC_EC: - setval(VERASE, SLC_VARIABLE); - case SLC_EL: - setval(VKILL, SLC_VARIABLE); - case SLC_IP: - setval(VINTR, SLC_VARIABLE|SLC_FLUSHIN|SLC_FLUSHOUT); - case SLC_ABORT: - setval(VQUIT, SLC_VARIABLE|SLC_FLUSHIN|SLC_FLUSHOUT); - case SLC_XON: -#ifdef VSTART - setval(VSTART, SLC_VARIABLE); -#else - defval(0x13); -#endif - case SLC_XOFF: -#ifdef VSTOP - setval(VSTOP, SLC_VARIABLE); -#else - defval(0x11); -#endif - case SLC_EW: -#ifdef VWERASE - setval(VWERASE, SLC_VARIABLE); -#else - defval(0); -#endif - case SLC_RP: -#ifdef VREPRINT - setval(VREPRINT, SLC_VARIABLE); -#else - defval(0); -#endif - case SLC_LNEXT: -#ifdef VLNEXT - setval(VLNEXT, SLC_VARIABLE); -#else - defval(0); -#endif - case SLC_AO: -#if !defined(VDISCARD) && defined(VFLUSHO) -# define VDISCARD VFLUSHO -#endif -#ifdef VDISCARD - setval(VDISCARD, SLC_VARIABLE|SLC_FLUSHOUT); -#else - defval(0); -#endif - case SLC_SUSP: -#ifdef VSUSP - setval(VSUSP, SLC_VARIABLE|SLC_FLUSHIN); -#else - defval(0); -#endif -#ifdef VEOL - case SLC_FORW1: - setval(VEOL, SLC_VARIABLE); -#endif -#ifdef VEOL2 - case SLC_FORW2: - setval(VEOL2, SLC_VARIABLE); -#endif - case SLC_AYT: -#ifdef VSTATUS - setval(VSTATUS, SLC_VARIABLE); -#else - defval(0); -#endif - - case SLC_BRK: - case SLC_SYNCH: - case SLC_EOR: - defval(0); - - default: - *valp = 0; - *valpp = 0; - return(SLC_NOSUPPORT); - } -} - -#ifdef _CRAY -/* - * getnpty() - * - * Return the number of pty's configured into the system. - */ -int -getnpty() -{ -#ifdef _SC_CRAY_NPTY - int numptys; - - if ((numptys = sysconf(_SC_CRAY_NPTY)) != -1) - return numptys; - else -#endif /* _SC_CRAY_NPTY */ - return 128; -} -#endif /* CRAY */ - -/* - * getpty() - * - * Allocate a pty. As a side effect, the external character - * array "line" contains the name of the slave side. - * - * Returns the file descriptor of the opened pty. - */ - -static int ptyslavefd = -1; - -static char Xline[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -char *line = Xline; - -#ifdef _CRAY -char myline[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; -#endif /* CRAY */ - -#if !defined(HAVE_PTSNAME) && defined(STREAMSPTY) -static char *ptsname(int fd) -{ -#ifdef HAVE_TTYNAME - return ttyname(fd); -#else - return NULL; -#endif -} -#endif - -int getpty(int *ptynum) -{ -#if defined(HAVE_OPENPTY) || defined(__linux) || defined(__osf__) /* XXX */ - { - int master; - int slave; - if(openpty(&master, &slave, line, 0, 0) == 0){ - ptyslavefd = slave; - return master; - } - } -#endif /* HAVE_OPENPTY .... */ -#ifdef HAVE__GETPTY - { - int master; - char *p; - p = _getpty(&master, O_RDWR, 0600, 1); - if(p == NULL) - return -1; - strlcpy(line, p, sizeof(Xline)); - return master; - } -#endif - -#ifdef STREAMSPTY - { - char *clone[] = { "/dev/ptc", "/dev/ptmx", "/dev/ptm", - "/dev/ptym/clone", 0 }; - - char **q; - int p; - for(q=clone; *q; q++){ - p=open(*q, O_RDWR); - if(p >= 0){ -#ifdef HAVE_GRANTPT - grantpt(p); -#endif -#ifdef HAVE_UNLOCKPT - unlockpt(p); -#endif - strlcpy(line, ptsname(p), sizeof(Xline)); - really_stream = 1; - return p; - } - } - } -#endif /* STREAMSPTY */ -#ifndef _CRAY - { - int p; - char *cp, *p1, *p2; - int i; - -#ifndef __hpux - snprintf(line, sizeof(Xline), "/dev/ptyXX"); - p1 = &line[8]; - p2 = &line[9]; -#else - snprintf(line, sizeof(Xline), "/dev/ptym/ptyXX"); - p1 = &line[13]; - p2 = &line[14]; -#endif - - - for (cp = "pqrstuvwxyzPQRST"; *cp; cp++) { - struct stat stb; - - *p1 = *cp; - *p2 = '0'; - /* - * This stat() check is just to keep us from - * looping through all 256 combinations if there - * aren't that many ptys available. - */ - if (stat(line, &stb) < 0) - break; - for (i = 0; i < 16; i++) { - *p2 = "0123456789abcdef"[i]; - p = open(line, O_RDWR); - if (p > 0) { -#if SunOS == 40 - int dummy; -#endif - -#ifndef __hpux - line[5] = 't'; -#else - for (p1 = &line[8]; *p1; p1++) - *p1 = *(p1+1); - line[9] = 't'; -#endif - chown(line, 0, 0); - chmod(line, 0600); -#if SunOS == 40 - if (ioctl(p, TIOCGPGRP, &dummy) == 0 - || errno != EIO) { - chmod(line, 0666); - close(p); - line[5] = 'p'; - } else -#endif /* SunOS == 40 */ - return(p); - } - } - } - } -#else /* CRAY */ - { - extern lowpty, highpty; - struct stat sb; - int p; - - for (*ptynum = lowpty; *ptynum <= highpty; (*ptynum)++) { - snprintf(myline, sizeof(myline), "/dev/pty/%03d", *ptynum); - p = open(myline, 2); - if (p < 0) - continue; - snprintf(line, sizeof(Xline), "/dev/ttyp%03d", *ptynum); - /* - * Here are some shenanigans to make sure that there - * are no listeners lurking on the line. - */ - if(stat(line, &sb) < 0) { - close(p); - continue; - } - if(sb.st_uid || sb.st_gid || sb.st_mode != 0600) { - chown(line, 0, 0); - chmod(line, 0600); - close(p); - p = open(myline, 2); - if (p < 0) - continue; - } - /* - * Now it should be safe...check for accessability. - */ - if (access(line, 6) == 0) - return(p); - else { - /* no tty side to pty so skip it */ - close(p); - } - } - } -#endif /* CRAY */ - return(-1); -} - - -int -tty_isecho(void) -{ - return (termbuf.c_lflag & ECHO); -} - -int -tty_flowmode(void) -{ - return((termbuf.c_iflag & IXON) ? 1 : 0); -} - -int -tty_restartany(void) -{ - return((termbuf.c_iflag & IXANY) ? 1 : 0); -} - -void -tty_setecho(int on) -{ - if (on) - termbuf.c_lflag |= ECHO; - else - termbuf.c_lflag &= ~ECHO; -} - -int -tty_israw(void) -{ - return(!(termbuf.c_lflag & ICANON)); -} - -void -tty_binaryin(int on) -{ - if (on) { - termbuf.c_iflag &= ~ISTRIP; - } else { - termbuf.c_iflag |= ISTRIP; - } -} - -void -tty_binaryout(int on) -{ - if (on) { - termbuf.c_cflag &= ~(CSIZE|PARENB); - termbuf.c_cflag |= CS8; - termbuf.c_oflag &= ~OPOST; - } else { - termbuf.c_cflag &= ~CSIZE; - termbuf.c_cflag |= CS7|PARENB; - termbuf.c_oflag |= OPOST; - } -} - -int -tty_isbinaryin(void) -{ - return(!(termbuf.c_iflag & ISTRIP)); -} - -int -tty_isbinaryout(void) -{ - return(!(termbuf.c_oflag&OPOST)); -} - - -int -tty_issofttab(void) -{ -# ifdef OXTABS - return (termbuf.c_oflag & OXTABS); -# endif -# ifdef TABDLY - return ((termbuf.c_oflag & TABDLY) == TAB3); -# endif -} - -void -tty_setsofttab(int on) -{ - if (on) { -# ifdef OXTABS - termbuf.c_oflag |= OXTABS; -# endif -# ifdef TABDLY - termbuf.c_oflag &= ~TABDLY; - termbuf.c_oflag |= TAB3; -# endif - } else { -# ifdef OXTABS - termbuf.c_oflag &= ~OXTABS; -# endif -# ifdef TABDLY - termbuf.c_oflag &= ~TABDLY; - termbuf.c_oflag |= TAB0; -# endif - } -} - -int -tty_islitecho(void) -{ -# ifdef ECHOCTL - return (!(termbuf.c_lflag & ECHOCTL)); -# endif -# ifdef TCTLECH - return (!(termbuf.c_lflag & TCTLECH)); -# endif -# if !defined(ECHOCTL) && !defined(TCTLECH) - return (0); /* assumes ctl chars are echoed '^x' */ -# endif -} - -void -tty_setlitecho(int on) -{ -# ifdef ECHOCTL - if (on) - termbuf.c_lflag &= ~ECHOCTL; - else - termbuf.c_lflag |= ECHOCTL; -# endif -# ifdef TCTLECH - if (on) - termbuf.c_lflag &= ~TCTLECH; - else - termbuf.c_lflag |= TCTLECH; -# endif -} - -int -tty_iscrnl(void) -{ - return (termbuf.c_iflag & ICRNL); -} - -/* - * Try to guess whether speeds are "encoded" (4.2BSD) or just numeric (4.4BSD). - */ -#if B4800 != 4800 -#define DECODE_BAUD -#endif - -#ifdef DECODE_BAUD - -/* - * A table of available terminal speeds - */ -struct termspeeds { - int speed; - int value; -} termspeeds[] = { - { 0, B0 }, { 50, B50 }, { 75, B75 }, - { 110, B110 }, { 134, B134 }, { 150, B150 }, - { 200, B200 }, { 300, B300 }, { 600, B600 }, - { 1200, B1200 }, { 1800, B1800 }, { 2400, B2400 }, - { 4800, B4800 }, -#ifdef B7200 - { 7200, B7200 }, -#endif - { 9600, B9600 }, -#ifdef B14400 - { 14400, B14400 }, -#endif -#ifdef B19200 - { 19200, B19200 }, -#endif -#ifdef B28800 - { 28800, B28800 }, -#endif -#ifdef B38400 - { 38400, B38400 }, -#endif -#ifdef B57600 - { 57600, B57600 }, -#endif -#ifdef B115200 - { 115200, B115200 }, -#endif -#ifdef B230400 - { 230400, B230400 }, -#endif - { -1, 0 } -}; -#endif /* DECODE_BUAD */ - -void -tty_tspeed(int val) -{ -#ifdef DECODE_BAUD - struct termspeeds *tp; - - for (tp = termspeeds; (tp->speed != -1) && (val > tp->speed); tp++) - ; - if (tp->speed == -1) /* back up to last valid value */ - --tp; - cfsetospeed(&termbuf, tp->value); -#else /* DECODE_BUAD */ - cfsetospeed(&termbuf, val); -#endif /* DECODE_BUAD */ -} - -void -tty_rspeed(int val) -{ -#ifdef DECODE_BAUD - struct termspeeds *tp; - - for (tp = termspeeds; (tp->speed != -1) && (val > tp->speed); tp++) - ; - if (tp->speed == -1) /* back up to last valid value */ - --tp; - cfsetispeed(&termbuf, tp->value); -#else /* DECODE_BAUD */ - cfsetispeed(&termbuf, val); -#endif /* DECODE_BAUD */ -} - -#ifdef PARENT_DOES_UTMP -extern struct utmp wtmp; -extern char wtmpf[]; - -extern void utmp_sig_init (void); -extern void utmp_sig_reset (void); -extern void utmp_sig_wait (void); -extern void utmp_sig_notify (int); -# endif /* PARENT_DOES_UTMP */ - -#ifdef STREAMSPTY - -/* I_FIND seems to live a life of its own */ -static int my_find(int fd, char *module) -{ -#if defined(I_FIND) && defined(I_LIST) - static int flag; - static struct str_list sl; - int n; - int i; - - if(!flag){ - n = ioctl(fd, I_LIST, 0); - if(n < 0){ - perror("ioctl(fd, I_LIST, 0)"); - return -1; - } - sl.sl_modlist=(struct str_mlist*)malloc(n * sizeof(struct str_mlist)); - sl.sl_nmods = n; - n = ioctl(fd, I_LIST, &sl); - if(n < 0){ - perror("ioctl(fd, I_LIST, n)"); - return -1; - } - flag = 1; - } - - for(i=0; i= modules; p--){ - err = ioctl(fd, I_PUSH, *p); - if(err < 0 && errno != EINVAL) - fatalperror(net, "I_PUSH"); - } -} -#endif - -/* - * getptyslave() - * - * Open the slave side of the pty, and do any initialization - * that is necessary. The return value is a file descriptor - * for the slave side. - */ -void getptyslave(void) -{ - int t = -1; - - struct winsize ws; - /* - * Opening the slave side may cause initilization of the - * kernel tty structure. We need remember the state of - * if linemode was turned on - * terminal window size - * terminal speed - * so that we can re-set them if we need to. - */ - - - /* - * Make sure that we don't have a controlling tty, and - * that we are the session (process group) leader. - */ - -#ifdef HAVE_SETSID - if(setsid()<0) - fatalperror(net, "setsid()"); -#else -# ifdef TIOCNOTTY - t = open(_PATH_TTY, O_RDWR); - if (t >= 0) { - ioctl(t, TIOCNOTTY, (char *)0); - close(t); - } -# endif -#endif - -# ifdef PARENT_DOES_UTMP - /* - * Wait for our parent to get the utmp stuff to get done. - */ - utmp_sig_wait(); -# endif - - t = cleanopen(line); - if (t < 0) - fatalperror(net, line); - -#ifdef STREAMSPTY - ttyfd = t; - - - /* - * Not all systems have (or need) modules ttcompat and pckt so - * don't flag it as a fatal error if they don't exist. - */ - - if (really_stream) - { - /* these are the streams modules that we want pushed. note - that they are in reverse order, ptem will be pushed - first. maybe_push_modules() will try to push all modules - before the first one that isn't already pushed. i.e if - ldterm is pushed, only ttcompat will be attempted. - - all this is because we don't know which modules are - available, and we don't know which modules are already - pushed (via autopush, for instance). - - */ - - char *ttymodules[] = { "ttcompat", "ldterm", "ptem", NULL }; - char *ptymodules[] = { "pckt", NULL }; - - maybe_push_modules(t, ttymodules); - maybe_push_modules(ourpty, ptymodules); - } -#endif - /* - * set up the tty modes as we like them to be. - */ - init_termbuf(); -# ifdef TIOCSWINSZ - if (def_row || def_col) { - memset(&ws, 0, sizeof(ws)); - ws.ws_col = def_col; - ws.ws_row = def_row; - ioctl(t, TIOCSWINSZ, (char *)&ws); - } -# endif - - /* - * Settings for sgtty based systems - */ - - /* - * Settings for UNICOS (and HPUX) - */ -# if defined(_CRAY) || defined(__hpux) - termbuf.c_oflag = OPOST|ONLCR|TAB3; - termbuf.c_iflag = IGNPAR|ISTRIP|ICRNL|IXON; - termbuf.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK; - termbuf.c_cflag = EXTB|HUPCL|CS8; -# endif - - /* - * Settings for all other termios/termio based - * systems, other than 4.4BSD. In 4.4BSD the - * kernel does the initial terminal setup. - */ -# if !(defined(_CRAY) || defined(__hpux)) && (BSD <= 43) -# ifndef OXTABS -# define OXTABS 0 -# endif - termbuf.c_lflag |= ECHO; - termbuf.c_oflag |= ONLCR|OXTABS; - termbuf.c_iflag |= ICRNL; - termbuf.c_iflag &= ~IXOFF; -# endif - tty_rspeed((def_rspeed > 0) ? def_rspeed : 9600); - tty_tspeed((def_tspeed > 0) ? def_tspeed : 9600); - - /* - * Set the tty modes, and make this our controlling tty. - */ - set_termbuf(); - if (login_tty(t) == -1) - fatalperror(net, "login_tty"); - if (net > 2) - close(net); - if (ourpty > 2) { - close(ourpty); - ourpty = -1; - } -} - -#ifndef O_NOCTTY -#define O_NOCTTY 0 -#endif -/* - * Open the specified slave side of the pty, - * making sure that we have a clean tty. - */ - -int cleanopen(char *line) -{ - int t; - - if (ptyslavefd != -1) - return ptyslavefd; - -#ifdef STREAMSPTY - if (!really_stream) -#endif - { - /* - * Make sure that other people can't open the - * slave side of the connection. - */ - chown(line, 0, 0); - chmod(line, 0600); - } - -#ifdef HAVE_REVOKE - revoke(line); -#endif - - t = open(line, O_RDWR|O_NOCTTY); - - if (t < 0) - return(-1); - - /* - * Hangup anybody else using this ttyp, then reopen it for - * ourselves. - */ -# if !(defined(_CRAY) || defined(__hpux)) && (BSD <= 43) && !defined(STREAMSPTY) - signal(SIGHUP, SIG_IGN); -#ifdef HAVE_VHANGUP - vhangup(); -#else -#endif - signal(SIGHUP, SIG_DFL); - t = open(line, O_RDWR|O_NOCTTY); - if (t < 0) - return(-1); -# endif -# if defined(_CRAY) && defined(TCVHUP) - { - int i; - signal(SIGHUP, SIG_IGN); - ioctl(t, TCVHUP, (char *)0); - signal(SIGHUP, SIG_DFL); - - i = open(line, O_RDWR); - - if (i < 0) - return(-1); - close(t); - t = i; - } -# endif /* defined(CRAY) && defined(TCVHUP) */ - return(t); -} - -#if !defined(BSD4_4) - -int login_tty(int t) -{ - /* Dont need to set this as the controlling PTY on steams sockets, - * don't abort on failure. */ -# if defined(TIOCSCTTY) && !defined(__hpux) - if (ioctl(t, TIOCSCTTY, (char *)0) < 0 && !really_stream) - fatalperror(net, "ioctl(sctty)"); -# ifdef _CRAY - /* - * Close the hard fd to /dev/ttypXXX, and re-open through - * the indirect /dev/tty interface. - */ - close(t); - if ((t = open("/dev/tty", O_RDWR)) < 0) - fatalperror(net, "open(/dev/tty)"); -# endif -# else - /* - * We get our controlling tty assigned as a side-effect - * of opening up a tty device. But on BSD based systems, - * this only happens if our process group is zero. The - * setsid() call above may have set our pgrp, so clear - * it out before opening the tty... - */ -#ifdef HAVE_SETPGID - setpgid(0, 0); -#else - setpgrp(0, 0); /* if setpgid isn't available, setpgrp - probably takes arguments */ -#endif - close(open(line, O_RDWR)); -# endif - if (t != 0) - dup2(t, 0); - if (t != 1) - dup2(t, 1); - if (t != 2) - dup2(t, 2); - if (t > 2) - close(t); - return(0); -} -#endif /* BSD <= 43 */ - -/* - * This comes from ../../bsd/tty.c and should not really be here. - */ - -/* - * Clean the tty name. Return a pointer to the cleaned version. - */ - -static char * clean_ttyname (char *) __attribute__((unused)); - -static char * -clean_ttyname (char *tty) -{ - char *res = tty; - - if (strncmp (res, _PATH_DEV, strlen(_PATH_DEV)) == 0) - res += strlen(_PATH_DEV); - if (strncmp (res, "pty/", 4) == 0) - res += 4; - if (strncmp (res, "ptym/", 5) == 0) - res += 5; - return res; -} - -/* - * Generate a name usable as an `ut_id', typically without `tty'. - */ - -#ifdef HAVE_STRUCT_UTMP_UT_ID -static char * -make_id (char *tty) -{ - char *res = tty; - - if (strncmp (res, "pts/", 4) == 0) - res += 4; - if (strncmp (res, "tty", 3) == 0) - res += 3; - return res; -} -#endif - -/* - * startslave(host) - * - * Given a hostname, do whatever - * is necessary to startup the login process on the slave side of the pty. - */ - -/* ARGSUSED */ -void -startslave(const char *host, const char *utmp_host, - int autologin, char *autoname) -{ - int i; - -#ifdef AUTHENTICATION - if (!autoname || !autoname[0]) - autologin = 0; - - if (autologin < auth_level) { - fatal(net, "Authorization failed"); - exit(1); - } -#endif - - { - char *tbuf = - "\r\n*** Connection not encrypted! " - "Communication may be eavesdropped. ***\r\n"; -#ifdef ENCRYPTION - if (!no_warn && (encrypt_output == 0 || decrypt_input == 0)) -#endif - writenet(tbuf, strlen(tbuf)); - } -# ifdef PARENT_DOES_UTMP - utmp_sig_init(); -# endif /* PARENT_DOES_UTMP */ - - if ((i = fork()) < 0) - fatalperror(net, "fork"); - if (i) { -# ifdef PARENT_DOES_UTMP - /* - * Cray parent will create utmp entry for child and send - * signal to child to tell when done. Child waits for signal - * before doing anything important. - */ - int pid = i; - void sigjob (int); - - setpgrp(); - utmp_sig_reset(); /* reset handler to default */ - /* - * Create utmp entry for child - */ - wtmp.ut_time = time(NULL); - wtmp.ut_type = LOGIN_PROCESS; - wtmp.ut_pid = pid; - strncpy(wtmp.ut_user, "LOGIN", sizeof(wtmp.ut_user)); - strncpy(wtmp.ut_host, utmp_host, sizeof(wtmp.ut_host)); - strncpy(wtmp.ut_line, clean_ttyname(line), sizeof(wtmp.ut_line)); -#ifdef HAVE_STRUCT_UTMP_UT_ID - strncpy(wtmp.ut_id, wtmp.ut_line + 3, sizeof(wtmp.ut_id)); -#endif - - pututline(&wtmp); - endutent(); - if ((i = open(wtmpf, O_WRONLY|O_APPEND)) >= 0) { - write(i, &wtmp, sizeof(struct utmp)); - close(i); - } -#ifdef _CRAY - signal(WJSIGNAL, sigjob); -#endif - utmp_sig_notify(pid); -# endif /* PARENT_DOES_UTMP */ - } else { - getptyslave(); -#if defined(DCE) - /* if we authenticated via K5, try and join the PAG */ - kerberos5_dfspag(); -#endif - start_login(host, autologin, autoname); - /*NOTREACHED*/ - } -} - -char *envinit[3]; -#if !HAVE_DECL_ENVIRON -extern char **environ; -#endif - -void -init_env(void) -{ - char **envp; - - envp = envinit; - if ((*envp = getenv("TZ"))) - *envp++ -= 3; -#if defined(_CRAY) || defined(__hpux) - else - *envp++ = "TZ=GMT0"; -#endif - *envp = 0; - environ = envinit; -} - -/* - * scrub_env() - * - * We only accept the environment variables listed below. - */ - -static void -scrub_env(void) -{ - static const char *reject[] = { - "TERMCAP=/", - NULL - }; - - static const char *accept[] = { - "XAUTH=", "XAUTHORITY=", "DISPLAY=", - "TERM=", - "EDITOR=", - "PAGER=", - "PRINTER=", - "LOGNAME=", - "POSIXLY_CORRECT=", - "TERMCAP=", - NULL - }; - - char **cpp, **cpp2; - const char **p; - - for (cpp2 = cpp = environ; *cpp; cpp++) { - int reject_it = 0; - - for(p = reject; *p; p++) - if(strncmp(*cpp, *p, strlen(*p)) == 0) { - reject_it = 1; - break; - } - if (reject_it) - continue; - - for(p = accept; *p; p++) - if(strncmp(*cpp, *p, strlen(*p)) == 0) - break; - if(*p != NULL) - *cpp2++ = *cpp; - } - *cpp2 = NULL; -} - - -struct arg_val { - int size; - int argc; - char **argv; -}; - -static void addarg(struct arg_val*, const char*); - -/* - * start_login(host) - * - * Assuming that we are now running as a child processes, this - * function will turn us into the login process. - */ - -void -start_login(const char *host, int autologin, char *name) -{ - struct arg_val argv; - char *user; - int save_errno; - -#ifdef ENCRYPTION - encrypt_output = NULL; - decrypt_input = NULL; -#endif - -#ifdef HAVE_UTMPX_H - { - int pid = getpid(); - struct utmpx utmpx; - struct timeval tv; - char *clean_tty; - - /* - * Create utmp entry for child - */ - - clean_tty = clean_ttyname(line); - memset(&utmpx, 0, sizeof(utmpx)); - strncpy(utmpx.ut_user, ".telnet", sizeof(utmpx.ut_user)); - strncpy(utmpx.ut_line, clean_tty, sizeof(utmpx.ut_line)); -#ifdef HAVE_STRUCT_UTMP_UT_ID - strncpy(utmpx.ut_id, make_id(clean_tty), sizeof(utmpx.ut_id)); -#endif - utmpx.ut_pid = pid; - - utmpx.ut_type = LOGIN_PROCESS; - - gettimeofday (&tv, NULL); - utmpx.ut_tv.tv_sec = tv.tv_sec; - utmpx.ut_tv.tv_usec = tv.tv_usec; - - if (pututxline(&utmpx) == NULL) - fatal(net, "pututxline failed"); - } -#endif - - scrub_env(); - - /* - * -h : pass on name of host. - * WARNING: -h is accepted by login if and only if - * getuid() == 0. - * -p : don't clobber the environment (so terminal type stays set). - * - * -f : force this login, he has already been authenticated - */ - - /* init argv structure */ - argv.size=0; - argv.argc=0; - argv.argv=malloc(0); /*so we can call realloc later */ - addarg(&argv, "login"); - addarg(&argv, "-h"); - addarg(&argv, host); - addarg(&argv, "-p"); - if(name && name[0]) - user = name; - else - user = getenv("USER"); -#ifdef AUTHENTICATION - if (auth_level < 0 || autologin != AUTH_VALID) { - if(!no_warn) { - printf("User not authenticated. "); - if (require_otp) - printf("Using one-time password\r\n"); - else - printf("Using plaintext username and password\r\n"); - } - if (require_otp) { - addarg(&argv, "-a"); - addarg(&argv, "otp"); - } - if(log_unauth) - syslog(LOG_INFO, "unauthenticated access from %s (%s)", - host, user ? user : "unknown user"); - } - if (auth_level >= 0 && autologin == AUTH_VALID) - addarg(&argv, "-f"); -#endif - if(user){ - addarg(&argv, "--"); - addarg(&argv, strdup(user)); - } - if (getenv("USER")) { - /* - * Assume that login will set the USER variable - * correctly. For SysV systems, this means that - * USER will no longer be set, just LOGNAME by - * login. (The problem is that if the auto-login - * fails, and the user then specifies a different - * account name, he can get logged in with both - * LOGNAME and USER in his environment, but the - * USER value will be wrong. - */ - unsetenv("USER"); - } - closelog(); - /* - * This sleep(1) is in here so that telnetd can - * finish up with the tty. There's a race condition - * the login banner message gets lost... - */ - sleep(1); - - execv(new_login, argv.argv); - save_errno = errno; - syslog(LOG_ERR, "%s: %m", new_login); - fatalperror_errno(net, new_login, save_errno); - /*NOTREACHED*/ -} - -static void -addarg(struct arg_val *argv, const char *val) -{ - if(argv->size <= argv->argc+1) { - argv->argv = realloc(argv->argv, sizeof(char*) * (argv->size + 10)); - if (argv->argv == NULL) - fatal (net, "realloc: out of memory"); - argv->size+=10; - } - if((argv->argv[argv->argc++] = strdup(val)) == NULL) - fatal (net, "strdup: out of memory"); - argv->argv[argv->argc] = NULL; -} - - -/* - * rmut() - * - * This is the function called by cleanup() to - * remove the utmp entry for this person. - */ - -#ifdef HAVE_UTMPX_H -static void -rmut(void) -{ - struct utmpx utmpx, *non_save_utxp; - char *clean_tty = clean_ttyname(line); - - /* - * This updates the utmpx and utmp entries and make a wtmp/x entry - */ - - setutxent(); - memset(&utmpx, 0, sizeof(utmpx)); - strncpy(utmpx.ut_line, clean_tty, sizeof(utmpx.ut_line)); - utmpx.ut_type = LOGIN_PROCESS; - non_save_utxp = getutxline(&utmpx); - if (non_save_utxp) { - struct utmpx *utxp; - struct timeval tv; - char user0; - - utxp = malloc(sizeof(struct utmpx)); - *utxp = *non_save_utxp; - user0 = utxp->ut_user[0]; - utxp->ut_user[0] = '\0'; - utxp->ut_type = DEAD_PROCESS; -#ifdef HAVE_STRUCT_UTMPX_UT_EXIT -#ifdef _STRUCT___EXIT_STATUS - utxp->ut_exit.__e_termination = 0; - utxp->ut_exit.__e_exit = 0; -#elif defined(__osf__) /* XXX */ - utxp->ut_exit.ut_termination = 0; - utxp->ut_exit.ut_exit = 0; -#else - utxp->ut_exit.e_termination = 0; - utxp->ut_exit.e_exit = 0; -#endif -#endif - gettimeofday (&tv, NULL); - utxp->ut_tv.tv_sec = tv.tv_sec; - utxp->ut_tv.tv_usec = tv.tv_usec; - - pututxline(utxp); -#ifdef WTMPX_FILE - utxp->ut_user[0] = user0; - updwtmpx(WTMPX_FILE, utxp); -#elif defined(WTMP_FILE) - /* This is a strange system with a utmpx and a wtmp! */ - { - int f = open(wtmpf, O_WRONLY|O_APPEND); - struct utmp wtmp; - if (f >= 0) { - strncpy(wtmp.ut_line, clean_tty, sizeof(wtmp.ut_line)); - strncpy(wtmp.ut_name, "", sizeof(wtmp.ut_name)); -#ifdef HAVE_STRUCT_UTMP_UT_HOST - strncpy(wtmp.ut_host, "", sizeof(wtmp.ut_host)); -#endif - wtmp.ut_time = time(NULL); - write(f, &wtmp, sizeof(wtmp)); - close(f); - } - } -#endif - free (utxp); - } - endutxent(); -} /* end of rmut */ -#endif - -#if !defined(HAVE_UTMPX_H) && !(defined(_CRAY) || defined(__hpux)) && BSD <= 43 -static void -rmut(void) -{ - int f; - int found = 0; - struct utmp *u, *utmp; - int nutmp; - struct stat statbf; - char *clean_tty = clean_ttyname(line); - - f = open(utmpf, O_RDWR); - if (f >= 0) { - fstat(f, &statbf); - utmp = (struct utmp *)malloc((unsigned)statbf.st_size); - if (!utmp) - syslog(LOG_ERR, "utmp malloc failed"); - if (statbf.st_size && utmp) { - nutmp = read(f, utmp, (int)statbf.st_size); - nutmp /= sizeof(struct utmp); - - for (u = utmp ; u < &utmp[nutmp] ; u++) { - if (strncmp(u->ut_line, - clean_tty, - sizeof(u->ut_line)) || - u->ut_name[0]==0) - continue; - lseek(f, ((long)u)-((long)utmp), L_SET); - strncpy(u->ut_name, "", sizeof(u->ut_name)); -#ifdef HAVE_STRUCT_UTMP_UT_HOST - strncpy(u->ut_host, "", sizeof(u->ut_host)); -#endif - u->ut_time = time(NULL); - write(f, u, sizeof(wtmp)); - found++; - } - } - close(f); - } - if (found) { - f = open(wtmpf, O_WRONLY|O_APPEND); - if (f >= 0) { - strncpy(wtmp.ut_line, clean_tty, sizeof(wtmp.ut_line)); - strncpy(wtmp.ut_name, "", sizeof(wtmp.ut_name)); -#ifdef HAVE_STRUCT_UTMP_UT_HOST - strncpy(wtmp.ut_host, "", sizeof(wtmp.ut_host)); -#endif - wtmp.ut_time = time(NULL); - write(f, &wtmp, sizeof(wtmp)); - close(f); - } - } - chmod(line, 0666); - chown(line, 0, 0); - line[strlen("/dev/")] = 'p'; - chmod(line, 0666); - chown(line, 0, 0); -} /* end of rmut */ -#endif /* CRAY */ - -#if defined(__hpux) && !defined(HAVE_UTMPX_H) -static void -rmut (char *line) -{ - struct utmp utmp; - struct utmp *utptr; - int fd; /* for /etc/wtmp */ - - utmp.ut_type = USER_PROCESS; - strncpy(utmp.ut_line, clean_ttyname(line), sizeof(utmp.ut_line)); - setutent(); - utptr = getutline(&utmp); - /* write it out only if it exists */ - if (utptr) { - utptr->ut_type = DEAD_PROCESS; - utptr->ut_time = time(NULL); - pututline(utptr); - /* set wtmp entry if wtmp file exists */ - if ((fd = open(wtmpf, O_WRONLY | O_APPEND)) >= 0) { - write(fd, utptr, sizeof(utmp)); - close(fd); - } - } - endutent(); - - chmod(line, 0666); - chown(line, 0, 0); - line[14] = line[13]; - line[13] = line[12]; - line[8] = 'm'; - line[9] = '/'; - line[10] = 'p'; - line[11] = 't'; - line[12] = 'y'; - chmod(line, 0666); - chown(line, 0, 0); -} -#endif - -/* - * cleanup() - * - * This is the routine to call when we are all through, to - * clean up anything that needs to be cleaned up. - */ - -#ifdef PARENT_DOES_UTMP - -void -cleanup(int sig) -{ -#ifdef _CRAY - static int incleanup = 0; - int t; - int child_status; /* status of child process as returned by waitpid */ - int flags = WNOHANG|WUNTRACED; - - /* - * 1: Pick up the zombie, if we are being called - * as the signal handler. - * 2: If we are a nested cleanup(), return. - * 3: Try to clean up TMPDIR. - * 4: Fill in utmp with shutdown of process. - * 5: Close down the network and pty connections. - * 6: Finish up the TMPDIR cleanup, if needed. - */ - if (sig == SIGCHLD) { - while (waitpid(-1, &child_status, flags) > 0) - ; /* VOID */ - /* Check if the child process was stopped - * rather than exited. We want cleanup only if - * the child has died. - */ - if (WIFSTOPPED(child_status)) { - return; - } - } - t = sigblock(sigmask(SIGCHLD)); - if (incleanup) { - sigsetmask(t); - return; - } - incleanup = 1; - sigsetmask(t); - - t = cleantmp(&wtmp); - setutent(); /* just to make sure */ -#endif /* CRAY */ - rmut(line); - close(ourpty); - shutdown(net, 2); -#ifdef _CRAY - if (t == 0) - cleantmp(&wtmp); -#endif /* CRAY */ - exit(1); -} - -#else /* PARENT_DOES_UTMP */ - -void -cleanup(int sig) -{ -#if defined(HAVE_UTMPX_H) || !defined(HAVE_LOGWTMP) - rmut(); -#ifdef HAVE_VHANGUP -#ifndef __sgi - vhangup(); /* XXX */ -#endif -#endif -#else - char *p; - - p = line + sizeof("/dev/") - 1; - if (logout(p)) - logwtmp(p, "", ""); - chmod(line, 0666); - chown(line, 0, 0); - *p = 'p'; - chmod(line, 0666); - chown(line, 0, 0); -#endif - shutdown(net, 2); - exit(1); -} - -#endif /* PARENT_DOES_UTMP */ - -#ifdef PARENT_DOES_UTMP -/* - * _utmp_sig_rcv - * utmp_sig_init - * utmp_sig_wait - * These three functions are used to coordinate the handling of - * the utmp file between the server and the soon-to-be-login shell. - * The server actually creates the utmp structure, the child calls - * utmp_sig_wait(), until the server calls utmp_sig_notify() and - * signals the future-login shell to proceed. - */ -static int caught=0; /* NZ when signal intercepted */ -static void (*func)(); /* address of previous handler */ - -void -_utmp_sig_rcv(sig) - int sig; -{ - caught = 1; - signal(SIGUSR1, func); -} - -void -utmp_sig_init() -{ - /* - * register signal handler for UTMP creation - */ - if ((int)(func = signal(SIGUSR1, _utmp_sig_rcv)) == -1) - fatalperror(net, "telnetd/signal"); -} - -void -utmp_sig_reset() -{ - signal(SIGUSR1, func); /* reset handler to default */ -} - -# ifdef __hpux -# define sigoff() /* do nothing */ -# define sigon() /* do nothing */ -# endif - -void -utmp_sig_wait() -{ - /* - * Wait for parent to write our utmp entry. - */ - sigoff(); - while (caught == 0) { - pause(); /* wait until we get a signal (sigon) */ - sigoff(); /* turn off signals while we check caught */ - } - sigon(); /* turn on signals again */ -} - -void -utmp_sig_notify(pid) -{ - kill(pid, SIGUSR1); -} - -#ifdef _CRAY -static int gotsigjob = 0; - - /*ARGSUSED*/ -void -sigjob(sig) - int sig; -{ - int jid; - struct jobtemp *jp; - - while ((jid = waitjob(NULL)) != -1) { - if (jid == 0) { - return; - } - gotsigjob++; - jobend(jid, NULL, NULL); - } -} - -/* - * jid_getutid: - * called by jobend() before calling cleantmp() - * to find the correct $TMPDIR to cleanup. - */ - -struct utmp * -jid_getutid(jid) - int jid; -{ - struct utmp *cur = NULL; - - setutent(); /* just to make sure */ - while (cur = getutent()) { - if ( (cur->ut_type != NULL) && (jid == cur->ut_jid) ) { - return(cur); - } - } - - return(0); -} - -/* - * Clean up the TMPDIR that login created. - * The first time this is called we pick up the info - * from the utmp. If the job has already gone away, - * then we'll clean up and be done. If not, then - * when this is called the second time it will wait - * for the signal that the job is done. - */ -int -cleantmp(wtp) - struct utmp *wtp; -{ - struct utmp *utp; - static int first = 1; - int mask, omask, ret; - extern struct utmp *getutid (const struct utmp *_Id); - - - mask = sigmask(WJSIGNAL); - - if (first == 0) { - omask = sigblock(mask); - while (gotsigjob == 0) - sigpause(omask); - return(1); - } - first = 0; - setutent(); /* just to make sure */ - - utp = getutid(wtp); - if (utp == 0) { - syslog(LOG_ERR, "Can't get /etc/utmp entry to clean TMPDIR"); - return(-1); - } - /* - * Nothing to clean up if the user shell was never started. - */ - if (utp->ut_type != USER_PROCESS || utp->ut_jid == 0) - return(1); - - /* - * Block the WJSIGNAL while we are in jobend(). - */ - omask = sigblock(mask); - ret = jobend(utp->ut_jid, utp->ut_tpath, utp->ut_user); - sigsetmask(omask); - return(ret); -} - -int -jobend(jid, path, user) - int jid; - char *path; - char *user; -{ - static int saved_jid = 0; - static int pty_saved_jid = 0; - static char saved_path[sizeof(wtmp.ut_tpath)+1]; - static char saved_user[sizeof(wtmp.ut_user)+1]; - - /* - * this little piece of code comes into play - * only when ptyreconnect is used to reconnect - * to an previous session. - * - * this is the only time when the - * "saved_jid != jid" code is executed. - */ - - if ( saved_jid && saved_jid != jid ) { - if (!path) { /* called from signal handler */ - pty_saved_jid = jid; - } else { - pty_saved_jid = saved_jid; - } - } - - if (path) { - strlcpy(saved_path, path, sizeof(saved_path)); - strlcpy(saved_user, user, sizeof(saved_user)); - } - if (saved_jid == 0) { - saved_jid = jid; - return(0); - } - - /* if the jid has changed, get the correct entry from the utmp file */ - - if ( saved_jid != jid ) { - struct utmp *utp = NULL; - struct utmp *jid_getutid(); - - utp = jid_getutid(pty_saved_jid); - - if (utp == 0) { - syslog(LOG_ERR, "Can't get /etc/utmp entry to clean TMPDIR"); - return(-1); - } - - cleantmpdir(jid, utp->ut_tpath, utp->ut_user); - return(1); - } - - cleantmpdir(jid, saved_path, saved_user); - return(1); -} - -/* - * Fork a child process to clean up the TMPDIR - */ -cleantmpdir(jid, tpath, user) - int jid; - char *tpath; - char *user; -{ - switch(fork()) { - case -1: - syslog(LOG_ERR, "TMPDIR cleanup(%s): fork() failed: %m\n", - tpath); - break; - case 0: - execl(CLEANTMPCMD, CLEANTMPCMD, user, tpath, NULL); - syslog(LOG_ERR, "TMPDIR cleanup(%s): execl(%s) failed: %m\n", - tpath, CLEANTMPCMD); - exit(1); - default: - /* - * Forget about child. We will exit, and - * /etc/init will pick it up. - */ - break; - } -} -#endif /* CRAY */ -#endif /* defined(PARENT_DOES_UTMP) */ diff --git a/crypto/heimdal/appl/telnet/telnetd/telnetd.h b/crypto/heimdal/appl/telnet/telnetd/telnetd.h deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/telnetd.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)telnetd.h 8.1 (Berkeley) 6/4/93 - */ - - -#include - -#include -#include -#include -#include - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_PARAM_H -#include -#endif - -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef TIME_WITH_SYS_TIME -#include -#include -#elif defined(HAVE_SYS_TIME_H) -#include -#else -#include -#endif - -#ifdef HAVE_SYS_RESOURCE_H -#include -#endif /* HAVE_SYS_RESOURCE_H */ - -#ifdef HAVE_SYS_WAIT_H -#include -#endif - -#ifdef HAVE_FCNTL_H -#include -#endif -#ifdef HAVE_SYS_FILE_H -#include -#endif -#ifdef HAVE_SYS_STAT_H -#include -#endif - -/* including both and in SunOS 4 generates a - lot of warnings */ - -#if defined(HAVE_SYS_IOCTL_H) && SunOS != 40 -#include -#endif -#ifdef HAVE_SYS_FILIO_H -#include -#endif - -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_NETINET6_IN6_H -#include -#endif - -#ifdef HAVE_ARPA_INET_H -#include -#endif - -#include -#include -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_SYSLOG_H -#include -#endif -#include - -#ifdef HAVE_UNISTD_H -#include -#endif - -#include - -#ifdef HAVE_PTY_H -#include -#endif - -#ifdef STREAMSPTY -#ifdef HAVE_SAC_H -#include -#endif -#ifdef HAVE_SYS_STROPTS_H -#include -#endif - -# include - -#ifdef HAVE_SYS_UIO_H -#include -#ifdef __hpux -#undef SE -#endif -#endif -#ifdef HAVE_SYS_STREAM_H -#include -#endif - -#endif /* STREAMSPTY */ - -#undef NOERROR - -#include "defs.h" - -#ifndef _POSIX_VDISABLE -# ifdef VDISABLE -# define _POSIX_VDISABLE VDISABLE -# else -# define _POSIX_VDISABLE ((unsigned char)'\377') -# endif -#endif - - -#ifdef HAVE_SYS_PTY_H -#include -#endif -#ifdef HAVE_SYS_SELECT_H -#include -#endif - -#ifdef HAVE_SYS_PTYIO_H -#include -#endif - -#ifdef HAVE_SYS_UTSNAME_H -#include -#endif - -#ifdef HAVE_PATHS_H -#include -#endif - -#ifdef HAVE_ARPA_TELNET_H -#include -#endif - -#include "ext.h" - -#ifdef SOCKS -#include -/* This doesn't belong here. */ -struct tm *localtime(const time_t *); -struct hostent *gethostbyname(const char *); -#endif - -#ifdef AUTHENTICATION -#include -#include -#ifdef ENCRYPTION -#include -#endif -#endif - -#ifdef HAVE_LIBUTIL_H -#include -#endif - -#include - -/* Don't use the system login, use our version instead */ - -/* BINDIR should be defined somewhere else... */ - -#ifndef BINDIR -#define BINDIR "/usr/athena/bin" -#endif - -#undef _PATH_LOGIN -#define _PATH_LOGIN BINDIR "/login" - -/* fallbacks */ - -#ifndef _PATH_DEV -#define _PATH_DEV "/dev/" -#endif - -#ifndef _PATH_TTY -#define _PATH_TTY "/dev/tty" -#endif /* _PATH_TTY */ - -#ifdef DIAGNOSTICS -#define DIAG(a,b) if (diagnostic & (a)) b -#else -#define DIAG(a,b) -#endif - -/* other external variables */ -extern char **environ; - -/* prototypes */ - -/* appends data to nfrontp and advances */ -int output_data (const char *format, ...) -#ifdef __GNUC__ -__attribute__ ((format (printf, 1, 2))) -#endif -; - -#ifdef ENCRYPTION -extern int require_encryption; -#endif diff --git a/crypto/heimdal/appl/telnet/telnetd/telnetd.8 b/crypto/heimdal/appl/telnet/telnetd/telnetd.8 deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/telnetd.8 +++ /dev/null @@ -1,536 +0,0 @@ -.\" Copyright (c) 1983, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)telnetd.8 8.4 (Berkeley) 6/1/94 -.\" -.Dd September 19, 2006 -.Dt TELNETD 8 -.Os BSD 4.2 -.Sh NAME -.Nm telnetd -.Nd DARPA -.Tn TELNET -protocol server -.Sh SYNOPSIS -.Nm telnetd -.Op Fl BeUhkln -.Op Fl D Ar debugmode -.Op Fl S Ar tos -.Op Fl X Ar authtype -.Op Fl a Ar authmode -.Op Fl r Ns Ar lowpty-highpty -.Op Fl u Ar len -.Op Fl debug -.Op Fl L Ar /bin/login -.Op Fl y -.Op Ar port -.Sh DESCRIPTION -The -.Nm telnetd -command is a server which supports the -.Tn DARPA -standard -.Tn TELNET -virtual terminal protocol. -.Nm Telnetd -is normally invoked by the internet server (see -.Xr inetd 8 ) -for requests to connect to the -.Tn TELNET -port as indicated by the -.Pa /etc/services -file (see -.Xr services 5 ) . -The -.Fl debug -option may be used to start up -.Nm telnetd -manually, instead of through -.Xr inetd 8 . -If started up this way, -.Ar port -may be specified to run -.Nm telnetd -on an alternate -.Tn TCP -port number. -.Pp -The -.Nm telnetd -command accepts the following options: -.Bl -tag -width "-a authmode" -.It Fl a Ar authmode -This option may be used for specifying what mode should -be used for authentication. -Note that this option is only useful if -.Nm telnetd -has been compiled with support for the -.Dv AUTHENTICATION -option. -There are several valid values for -.Ar authmode : -.Bl -tag -width debug -.It debug -Turns on authentication debugging code. -.It user -Only allow connections when the remote user -can provide valid authentication information -to identify the remote user, -and is allowed access to the specified account -without providing a password. -.It valid -Only allow connections when the remote user -can provide valid authentication information -to identify the remote user. -The -.Xr login 1 -command will provide any additional user verification -needed if the remote user is not allowed automatic -access to the specified account. -.It other -Only allow connections that supply some authentication information. -This option is currently not supported -by any of the existing authentication mechanisms, -and is thus the same as specifying -.Fl a -.Cm valid . -.It otp -Only allow authenticated connections (as with -.Fl a -.Cm user ) -and also logins with one-time passwords (OTPs). This option will call -login with an option so that only OTPs are accepted. The user can of -course still type secret information at the prompt. -.It none -This is the default state. -Authentication information is not required. -If no or insufficient authentication information -is provided, then the -.Xr login 1 -program will provide the necessary user -verification. -.It off -This disables the authentication code. -All user verification will happen through the -.Xr login 1 -program. -.El -.It Fl B -Ignored. -.It Fl D Ar debugmode -This option may be used for debugging purposes. -This allows -.Nm telnetd -to print out debugging information -to the connection, allowing the user to see what -.Nm telnetd -is doing. -There are several possible values for -.Ar debugmode : -.Bl -tag -width exercise -.It Cm options -Prints information about the negotiation of -.Tn TELNET -options. -.It Cm report -Prints the -.Cm options -information, plus some additional information -about what processing is going on. -.It Cm netdata -Displays the data stream received by -.Nm telnetd . -.It Cm ptydata -Displays data written to the pty. -.It Cm exercise -Has not been implemented yet. -.El -.It Fl e -require encryption to be turned on (in both direction) by the client -and disconnects if the client tries to turn the encryption off (in -either direction). -.It Fl h -Disables the printing of host-specific information before -login has been completed. -.It Fl k -.It Fl l -Ignored. -.It Fl n -Disable -.Dv TCP -keep-alives. Normally -.Nm telnetd -enables the -.Tn TCP -keep-alive mechanism to probe connections that -have been idle for some period of time to determine -if the client is still there, so that idle connections -from machines that have crashed or can no longer -be reached may be cleaned up. -.It Fl r Ar lowpty-highpty -This option is only enabled when -.Nm telnetd -is compiled for -.Dv UNICOS . -It specifies an inclusive range of pseudo-terminal devices to -use. If the system has sysconf variable -.Dv _SC_CRAY_NPTY -configured, the default pty search range is 0 to -.Dv _SC_CRAY_NPTY ; -otherwise, the default range is 0 to 128. Either -.Ar lowpty -or -.Ar highpty -may be omitted to allow changing -either end of the search range. If -.Ar lowpty -is omitted, the - character is still required so that -.Nm telnetd -can differentiate -.Ar highpty -from -.Ar lowpty . -.It Fl S Ar tos -.It Fl u Ar len -This option is used to specify the size of the field -in the -.Dv utmp -structure that holds the remote host name. -If the resolved host name is longer than -.Ar len , -the dotted decimal value will be used instead. -This allows hosts with very long host names that -overflow this field to still be uniquely identified. -Specifying -.Fl u0 -indicates that only dotted decimal addresses -should be put into the -.Pa utmp -file. -.It Fl U -This option causes -.Nm telnetd -to refuse connections from addresses that -cannot be mapped back into a symbolic name -via the -.Xr gethostbyaddr 3 -routine. -.It Fl X Ar authtype -This option is only valid if -.Nm telnetd -has been built with support for the authentication option. -It disables the use of -.Ar authtype -authentication, and -can be used to temporarily disable -a specific authentication type without having to recompile -.Nm telnetd . -.It Fl L Ar pathname -Specify pathname to an alternative login program. -.It Fl y -Makes -.Nm -not warn when a user is trying to login with a cleartext password. -.El -.Pp -.Nm Telnetd -operates by allocating a pseudo-terminal device (see -.Xr pty 4 ) -for a client, then creating a login process which has -the slave side of the pseudo-terminal as -.Dv stdin , -.Dv stdout -and -.Dv stderr . -.Nm Telnetd -manipulates the master side of the pseudo-terminal, -implementing the -.Tn TELNET -protocol and passing characters -between the remote client and the login process. -.Pp -When a -.Tn TELNET -session is started up, -.Nm telnetd -sends -.Tn TELNET -options to the client side indicating -a willingness to do the -following -.Tn TELNET -options, which are described in more detail below: -.Bd -literal -offset indent -DO AUTHENTICATION -WILL ENCRYPT -DO TERMINAL TYPE -DO TSPEED -DO XDISPLOC -DO NEW-ENVIRON -DO ENVIRON -WILL SUPPRESS GO AHEAD -DO ECHO -DO LINEMODE -DO NAWS -WILL STATUS -DO LFLOW -DO TIMING-MARK -.Ed -.Pp -The pseudo-terminal allocated to the client is configured -to operate in -.Dq cooked -mode, and with -.Dv XTABS and -.Dv CRMOD -enabled (see -.Xr tty 4 ) . -.Pp -.Nm Telnetd -has support for enabling locally the following -.Tn TELNET -options: -.Bl -tag -width "DO AUTHENTICATION" -.It "WILL ECHO" -When the -.Dv LINEMODE -option is enabled, a -.Dv WILL ECHO -or -.Dv WONT ECHO -will be sent to the client to indicate the -current state of terminal echoing. -When terminal echo is not desired, a -.Dv WILL ECHO -is sent to indicate that -.Tn telnetd -will take care of echoing any data that needs to be -echoed to the terminal, and then nothing is echoed. -When terminal echo is desired, a -.Dv WONT ECHO -is sent to indicate that -.Tn telnetd -will not be doing any terminal echoing, so the -client should do any terminal echoing that is needed. -.It "WILL BINARY" -Indicates that the client is willing to send a -8 bits of data, rather than the normal 7 bits -of the Network Virtual Terminal. -.It "WILL SGA" -Indicates that it will not be sending -.Dv IAC GA , -go ahead, commands. -.It "WILL STATUS" -Indicates a willingness to send the client, upon -request, of the current status of all -.Tn TELNET -options. -.It "WILL TIMING-MARK" -Whenever a -.Dv DO TIMING-MARK -command is received, it is always responded -to with a -.Dv WILL TIMING-MARK -.It "WILL LOGOUT" -When a -.Dv DO LOGOUT -is received, a -.Dv WILL LOGOUT -is sent in response, and the -.Tn TELNET -session is shut down. -.It "WILL ENCRYPT" -Only sent if -.Nm telnetd -is compiled with support for data encryption, and -indicates a willingness to decrypt -the data stream. -.El -.Pp -.Nm Telnetd -has support for enabling remotely the following -.Tn TELNET -options: -.Bl -tag -width "DO AUTHENTICATION" -.It "DO BINARY" -Sent to indicate that -.Tn telnetd -is willing to receive an 8 bit data stream. -.It "DO LFLOW" -Requests that the client handle flow control -characters remotely. -.It "DO ECHO" -This is not really supported, but is sent to identify a 4.2BSD -.Xr telnet 1 -client, which will improperly respond with -.Dv WILL ECHO . -If a -.Dv WILL ECHO -is received, a -.Dv DONT ECHO -will be sent in response. -.It "DO TERMINAL-TYPE" -Indicates a desire to be able to request the -name of the type of terminal that is attached -to the client side of the connection. -.It "DO SGA" -Indicates that it does not need to receive -.Dv IAC GA , -the go ahead command. -.It "DO NAWS" -Requests that the client inform the server when -the window (display) size changes. -.It "DO TERMINAL-SPEED" -Indicates a desire to be able to request information -about the speed of the serial line to which -the client is attached. -.It "DO XDISPLOC" -Indicates a desire to be able to request the name -of the X windows display that is associated with -the telnet client. -.It "DO NEW-ENVIRON" -Indicates a desire to be able to request environment -variable information, as described in RFC 1572. -.It "DO ENVIRON" -Indicates a desire to be able to request environment -variable information, as described in RFC 1408. -.It "DO LINEMODE" -Only sent if -.Nm telnetd -is compiled with support for linemode, and -requests that the client do line by line processing. -.It "DO TIMING-MARK" -Only sent if -.Nm telnetd -is compiled with support for both linemode and -kludge linemode, and the client responded with -.Dv WONT LINEMODE . -If the client responds with -.Dv WILL TM , -the it is assumed that the client supports -kludge linemode. -Note that the -.Op Fl k -option can be used to disable this. -.It "DO AUTHENTICATION" -Only sent if -.Nm telnetd -is compiled with support for authentication, and -indicates a willingness to receive authentication -information for automatic login. -.It "DO ENCRYPT" -Only sent if -.Nm telnetd -is compiled with support for data encryption, and -indicates a willingness to decrypt -the data stream. -.El -.Sh FILES -.Bl -tag -width /etc/services -compact -.It Pa /etc/services -.It Pa /etc/inittab -(UNICOS systems only) -.It Pa /etc/iptos -(if supported) -.El -.Sh "SEE ALSO" -.Xr telnet 1 , -.Xr login 1 -.Sh STANDARDS -.Bl -tag -compact -width RFC-1572 -.It Cm RFC-854 -.Tn TELNET -PROTOCOL SPECIFICATION -.It Cm RFC-855 -TELNET OPTION SPECIFICATIONS -.It Cm RFC-856 -TELNET BINARY TRANSMISSION -.It Cm RFC-857 -TELNET ECHO OPTION -.It Cm RFC-858 -TELNET SUPPRESS GO AHEAD OPTION -.It Cm RFC-859 -TELNET STATUS OPTION -.It Cm RFC-860 -TELNET TIMING MARK OPTION -.It Cm RFC-861 -TELNET EXTENDED OPTIONS - LIST OPTION -.It Cm RFC-885 -TELNET END OF RECORD OPTION -.It Cm RFC-1073 -Telnet Window Size Option -.It Cm RFC-1079 -Telnet Terminal Speed Option -.It Cm RFC-1091 -Telnet Terminal-Type Option -.It Cm RFC-1096 -Telnet X Display Location Option -.It Cm RFC-1123 -Requirements for Internet Hosts -- Application and Support -.It Cm RFC-1184 -Telnet Linemode Option -.It Cm RFC-1372 -Telnet Remote Flow Control Option -.It Cm RFC-1416 -Telnet Authentication Option -.It Cm RFC-1411 -Telnet Authentication: Kerberos Version 4 -.It Cm RFC-1412 -Telnet Authentication: SPX -.It Cm RFC-1571 -Telnet Environment Option Interoperability Issues -.It Cm RFC-1572 -Telnet Environment Option -.El -.Sh BUGS -Some -.Tn TELNET -commands are only partially implemented. -.Pp -Because of bugs in the original 4.2 BSD -.Xr telnet 1 , -.Nm telnetd -performs some dubious protocol exchanges to try to discover if the remote -client is, in fact, a 4.2 BSD -.Xr telnet 1 . -.Pp -Binary mode -has no common interpretation except between similar operating systems -(Unix in this case). -.Pp -The terminal type name received from the remote client is converted to -lower case. -.Pp -.Nm Telnetd -never sends -.Tn TELNET -.Dv IAC GA -(go ahead) commands. diff --git a/crypto/heimdal/appl/telnet/telnetd/telnetd.c b/crypto/heimdal/appl/telnet/telnetd/telnetd.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/telnetd.c +++ /dev/null @@ -1,1401 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnetd.h" - -RCSID("$Id$"); - -#ifdef _SC_CRAY_SECURE_SYS -#include -#include -#include -#include -int secflag; -char tty_dev[16]; -struct secdev dv; -struct sysv sysv; -struct socksec ss; -#endif /* _SC_CRAY_SECURE_SYS */ - -#ifdef AUTHENTICATION -int auth_level = 0; -#endif - -#ifdef KRB5 -#define Authenticator k5_Authenticator -#include -#undef Authenticator -#endif - -extern int utmp_len; -int registerd_host_only = 0; -#ifdef ENCRYPTION -int require_encryption = 0; -#endif - -#ifdef STREAMSPTY - -#ifdef _AIX -#include -#endif -# ifdef HAVE_SYS_STRTTY_H -# include -# endif -# ifdef HAVE_SYS_STR_TTY_H -# include -# endif -/* make sure we don't get the bsd version */ -/* what is this here for? solaris? /joda */ -# ifdef HAVE_SYS_TTY_H -# include "/usr/include/sys/tty.h" -# endif -# ifdef HAVE_SYS_PTYVAR_H -# include -# endif - -/* - * Because of the way ptyibuf is used with streams messages, we need - * ptyibuf+1 to be on a full-word boundary. The following wierdness - * is simply to make that happen. - */ -long ptyibufbuf[BUFSIZ/sizeof(long)+1]; -char *ptyibuf = ((char *)&ptyibufbuf[1])-1; -char *ptyip = ((char *)&ptyibufbuf[1])-1; -char ptyibuf2[BUFSIZ]; -unsigned char ctlbuf[BUFSIZ]; -struct strbuf strbufc, strbufd; - -int readstream(int, char*, int); - -#else /* ! STREAMPTY */ - -/* - * I/O data buffers, - * pointers, and counters. - */ -char ptyibuf[BUFSIZ], *ptyip = ptyibuf; -char ptyibuf2[BUFSIZ]; - -#endif /* ! STREAMPTY */ - -int hostinfo = 1; /* do we print login banner? */ - -#ifdef _CRAY -extern int newmap; /* nonzero if \n maps to ^M^J */ -int lowpty = 0, highpty; /* low, high pty numbers */ -#endif /* CRAY */ - -int debug = 0; -int keepalive = 1; -char *progname; - -static void usage (int error_code); - -/* - * The string to pass to getopt(). We do it this way so - * that only the actual options that we support will be - * passed off to getopt(). - */ -char valid_opts[] = "Bd:hklnS:u:UL:y" -#ifdef AUTHENTICATION - "a:X:z" -#endif -#ifdef ENCRYPTION - "e" -#endif -#ifdef DIAGNOSTICS - "D:" -#endif -#ifdef _CRAY - "r:" -#endif - ; - -static void doit(struct sockaddr*, int); - -int -main(int argc, char **argv) -{ - struct sockaddr_storage __ss; - struct sockaddr *sa = (struct sockaddr *)&__ss; - int on = 1; - socklen_t sa_size; - int ch; -#if defined(IPPROTO_IP) && defined(IP_TOS) - int tos = -1; -#endif - pfrontp = pbackp = ptyobuf; - netip = netibuf; - nfrontp = nbackp = netobuf; - - setprogname(argv[0]); - - progname = *argv; -#ifdef ENCRYPTION - nclearto = 0; -#endif - -#ifdef _CRAY - /* - * Get number of pty's before trying to process options, - * which may include changing pty range. - */ - highpty = getnpty(); -#endif /* CRAY */ - - if (argc == 2 && strcmp(argv[1], "--version") == 0) { - print_version(NULL); - exit(0); - } - if (argc == 2 && strcmp(argv[1], "--help") == 0) - usage(0); - - while ((ch = getopt(argc, argv, valid_opts)) != -1) { - switch(ch) { - -#ifdef AUTHENTICATION - case 'a': - /* - * Check for required authentication level - */ - if (strcmp(optarg, "debug") == 0) { - auth_debug_mode = 1; - } else if (strcasecmp(optarg, "none") == 0) { - auth_level = 0; - } else if (strcasecmp(optarg, "otp") == 0) { - auth_level = 0; - require_otp = 1; - } else if (strcasecmp(optarg, "other") == 0) { - auth_level = AUTH_OTHER; - } else if (strcasecmp(optarg, "user") == 0) { - auth_level = AUTH_USER; - } else if (strcasecmp(optarg, "valid") == 0) { - auth_level = AUTH_VALID; - } else if (strcasecmp(optarg, "off") == 0) { - /* - * This hack turns off authentication - */ - auth_level = -1; - } else { - fprintf(stderr, - "telnetd: unknown authorization level for -a\n"); - } - break; -#endif /* AUTHENTICATION */ - - case 'B': /* BFTP mode is not supported any more */ - break; - case 'd': - if (strcmp(optarg, "ebug") == 0) { - debug++; - break; - } - usage(1); - /* NOTREACHED */ - break; - -#ifdef DIAGNOSTICS - case 'D': - /* - * Check for desired diagnostics capabilities. - */ - if (!strcmp(optarg, "report")) { - diagnostic |= TD_REPORT|TD_OPTIONS; - } else if (!strcmp(optarg, "exercise")) { - diagnostic |= TD_EXERCISE; - } else if (!strcmp(optarg, "netdata")) { - diagnostic |= TD_NETDATA; - } else if (!strcmp(optarg, "ptydata")) { - diagnostic |= TD_PTYDATA; - } else if (!strcmp(optarg, "options")) { - diagnostic |= TD_OPTIONS; - } else { - usage(1); - /* NOT REACHED */ - } - break; -#endif /* DIAGNOSTICS */ - -#ifdef ENCRYPTION - case 'e': - require_encryption = 1; - break; -#endif - - case 'h': - hostinfo = 0; - break; - - case 'k': /* Linemode is not supported any more */ - case 'l': - break; - - case 'n': - keepalive = 0; - break; - -#ifdef _CRAY - case 'r': - { - char *strchr(); - char *c; - - /* - * Allow the specification of alterations - * to the pty search range. It is legal to - * specify only one, and not change the - * other from its default. - */ - c = strchr(optarg, '-'); - if (c) { - *c++ = '\0'; - highpty = atoi(c); - } - if (*optarg != '\0') - lowpty = atoi(optarg); - if ((lowpty > highpty) || (lowpty < 0) || - (highpty > 32767)) { - usage(1); - /* NOT REACHED */ - } - break; - } -#endif /* CRAY */ - - case 'S': -#ifdef HAVE_PARSETOS - if ((tos = parsetos(optarg, "tcp")) < 0) - fprintf(stderr, "%s%s%s\n", - "telnetd: Bad TOS argument '", optarg, - "'; will try to use default TOS"); -#else - fprintf(stderr, "%s%s\n", "TOS option unavailable; ", - "-S flag not supported\n"); -#endif - break; - - case 'u': { - char *eptr; - - utmp_len = strtol(optarg, &eptr, 0); - if (optarg == eptr) - fprintf(stderr, "telnetd: unknown utmp len (%s)\n", optarg); - break; - } - - case 'U': - registerd_host_only = 1; - break; - -#ifdef AUTHENTICATION - case 'X': - /* - * Check for invalid authentication types - */ - auth_disable_name(optarg); - break; -#endif - case 'y': - no_warn = 1; - break; -#ifdef AUTHENTICATION - case 'z': - log_unauth = 1; - break; - -#endif /* AUTHENTICATION */ - - case 'L': - new_login = optarg; - break; - - default: - fprintf(stderr, "telnetd: %c: unknown option\n", ch); - /* FALLTHROUGH */ - case '?': - usage(0); - /* NOTREACHED */ - } - } - - argc -= optind; - argv += optind; - - if (debug) { - int port = 0; - struct servent *sp; - - if (argc > 1) { - usage (1); - } else if (argc == 1) { - sp = roken_getservbyname (*argv, "tcp"); - if (sp) - port = sp->s_port; - else - port = htons(atoi(*argv)); - } else { -#ifdef KRB5 - port = krb5_getportbyname (NULL, "telnet", "tcp", 23); -#else - port = k_getportbyname("telnet", "tcp", htons(23)); -#endif - } - mini_inetd (port, NULL); - } else if (argc > 0) { - usage(1); - /* NOT REACHED */ - } - -#ifdef _SC_CRAY_SECURE_SYS - secflag = sysconf(_SC_CRAY_SECURE_SYS); - - /* - * Get socket's security label - */ - if (secflag) { - socklen_t szss = sizeof(ss); - int sock_multi; - socklen_t szi = sizeof(int); - - memset(&dv, 0, sizeof(dv)); - - if (getsysv(&sysv, sizeof(struct sysv)) != 0) - fatalperror(net, "getsysv"); - - /* - * Get socket security label and set device values - * {security label to be set on ttyp device} - */ -#ifdef SO_SEC_MULTI /* 8.0 code */ - if ((getsockopt(0, SOL_SOCKET, SO_SECURITY, - (void *)&ss, &szss) < 0) || - (getsockopt(0, SOL_SOCKET, SO_SEC_MULTI, - (void *)&sock_multi, &szi) < 0)) - fatalperror(net, "getsockopt"); - else { - dv.dv_actlvl = ss.ss_actlabel.lt_level; - dv.dv_actcmp = ss.ss_actlabel.lt_compart; - if (!sock_multi) { - dv.dv_minlvl = dv.dv_maxlvl = dv.dv_actlvl; - dv.dv_valcmp = dv.dv_actcmp; - } else { - dv.dv_minlvl = ss.ss_minlabel.lt_level; - dv.dv_maxlvl = ss.ss_maxlabel.lt_level; - dv.dv_valcmp = ss.ss_maxlabel.lt_compart; - } - dv.dv_devflg = 0; - } -#else /* SO_SEC_MULTI */ /* 7.0 code */ - if (getsockopt(0, SOL_SOCKET, SO_SECURITY, - (void *)&ss, &szss) >= 0) { - dv.dv_actlvl = ss.ss_slevel; - dv.dv_actcmp = ss.ss_compart; - dv.dv_minlvl = ss.ss_minlvl; - dv.dv_maxlvl = ss.ss_maxlvl; - dv.dv_valcmp = ss.ss_maxcmp; - } -#endif /* SO_SEC_MULTI */ - } -#endif /* _SC_CRAY_SECURE_SYS */ - - roken_openlog("telnetd", LOG_PID | LOG_ODELAY, LOG_DAEMON); - sa_size = sizeof (__ss); - if (getpeername(STDIN_FILENO, sa, &sa_size) < 0) { - fprintf(stderr, "%s: ", progname); - perror("getpeername"); - _exit(1); - } - if (keepalive && - setsockopt(STDIN_FILENO, SOL_SOCKET, SO_KEEPALIVE, - (void *)&on, sizeof (on)) < 0) { - syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m"); - } - -#if defined(IPPROTO_IP) && defined(IP_TOS) && defined(HAVE_SETSOCKOPT) - { -# ifdef HAVE_GETTOSBYNAME - struct tosent *tp; - if (tos < 0 && (tp = gettosbyname("telnet", "tcp"))) - tos = tp->t_tos; -# endif - if (tos < 0) - tos = 020; /* Low Delay bit */ - if (tos - && sa->sa_family == AF_INET - && (setsockopt(STDIN_FILENO, IPPROTO_IP, IP_TOS, - (void *)&tos, sizeof(tos)) < 0) - && (errno != ENOPROTOOPT) ) - syslog(LOG_WARNING, "setsockopt (IP_TOS): %m"); - } -#endif /* defined(IPPROTO_IP) && defined(IP_TOS) */ - net = STDIN_FILENO; - doit(sa, sa_size); - /* NOTREACHED */ - return 0; -} /* end of main */ - -static void -usage(int exit_code) -{ - fprintf(stderr, "Usage: telnetd"); - fprintf(stderr, " [--help]"); - fprintf(stderr, " [--version]"); -#ifdef AUTHENTICATION - fprintf(stderr, " [-a (debug|other|otp|user|valid|off|none)]\n\t"); -#endif - fprintf(stderr, " [-debug]"); -#ifdef DIAGNOSTICS - fprintf(stderr, " [-D (options|report|exercise|netdata|ptydata)]\n\t"); -#endif -#ifdef AUTHENTICATION - fprintf(stderr, " [-edebug]"); -#endif - fprintf(stderr, " [-h]"); - fprintf(stderr, " [-L login]"); - fprintf(stderr, " [-n]"); -#ifdef _CRAY - fprintf(stderr, " [-r[lowpty]-[highpty]]"); -#endif - fprintf(stderr, "\n\t"); -#ifdef HAVE_GETTOSBYNAME - fprintf(stderr, " [-S tos]"); -#endif -#ifdef AUTHENTICATION - fprintf(stderr, " [-X auth-type] [-y] [-z]"); -#endif - fprintf(stderr, " [-u utmp_hostname_length] [-U]"); - fprintf(stderr, " [port]\n"); - exit(exit_code); -} - -/* - * getterminaltype - * - * Ask the other end to send along its terminal type and speed. - * Output is the variable terminaltype filled in. - */ -static unsigned char ttytype_sbbuf[] = { - IAC, SB, TELOPT_TTYPE, TELQUAL_SEND, IAC, SE -}; - -int -getterminaltype(char *name, size_t name_sz) -{ - int retval = -1; - - settimer(baseline); -#ifdef AUTHENTICATION - /* - * Handle the Authentication option before we do anything else. - */ - send_do(TELOPT_AUTHENTICATION, 1); - while (his_will_wont_is_changing(TELOPT_AUTHENTICATION)) - ttloop(); - if (his_state_is_will(TELOPT_AUTHENTICATION)) { - retval = auth_wait(name, name_sz); - } -#endif - -#ifdef ENCRYPTION - send_will(TELOPT_ENCRYPT, 1); - send_do(TELOPT_ENCRYPT, 1); /* esc@magic.fi */ -#endif - send_do(TELOPT_TTYPE, 1); - send_do(TELOPT_TSPEED, 1); - send_do(TELOPT_XDISPLOC, 1); - send_do(TELOPT_NEW_ENVIRON, 1); - send_do(TELOPT_OLD_ENVIRON, 1); - while ( -#ifdef ENCRYPTION - his_do_dont_is_changing(TELOPT_ENCRYPT) || -#endif - his_will_wont_is_changing(TELOPT_TTYPE) || - his_will_wont_is_changing(TELOPT_TSPEED) || - his_will_wont_is_changing(TELOPT_XDISPLOC) || - his_will_wont_is_changing(TELOPT_NEW_ENVIRON) || - his_will_wont_is_changing(TELOPT_OLD_ENVIRON)) { - ttloop(); - } -#ifdef ENCRYPTION - /* - * Wait for the negotiation of what type of encryption we can - * send with. If autoencrypt is not set, this will just return. - */ - if (his_state_is_will(TELOPT_ENCRYPT)) { - encrypt_wait(); - } - if (require_encryption) { - - while (encrypt_delay()) - if (telnet_spin()) - fatal(net, "Failed while waiting for encryption"); - - if (!encrypt_is_encrypting()) - fatal(net, "Encryption required but not turned on by client"); - } -#endif - if (his_state_is_will(TELOPT_TSPEED)) { - static unsigned char sb[] = - { IAC, SB, TELOPT_TSPEED, TELQUAL_SEND, IAC, SE }; - - telnet_net_write (sb, sizeof sb); - DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2);); - } - if (his_state_is_will(TELOPT_XDISPLOC)) { - static unsigned char sb[] = - { IAC, SB, TELOPT_XDISPLOC, TELQUAL_SEND, IAC, SE }; - - telnet_net_write (sb, sizeof sb); - DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2);); - } - if (his_state_is_will(TELOPT_NEW_ENVIRON)) { - static unsigned char sb[] = - { IAC, SB, TELOPT_NEW_ENVIRON, TELQUAL_SEND, IAC, SE }; - - telnet_net_write (sb, sizeof sb); - DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2);); - } - else if (his_state_is_will(TELOPT_OLD_ENVIRON)) { - static unsigned char sb[] = - { IAC, SB, TELOPT_OLD_ENVIRON, TELQUAL_SEND, IAC, SE }; - - telnet_net_write (sb, sizeof sb); - DIAG(TD_OPTIONS, printsub('>', sb + 2, sizeof sb - 2);); - } - if (his_state_is_will(TELOPT_TTYPE)) { - - telnet_net_write (ttytype_sbbuf, sizeof ttytype_sbbuf); - DIAG(TD_OPTIONS, printsub('>', ttytype_sbbuf + 2, - sizeof ttytype_sbbuf - 2);); - } - if (his_state_is_will(TELOPT_TSPEED)) { - while (sequenceIs(tspeedsubopt, baseline)) - ttloop(); - } - if (his_state_is_will(TELOPT_XDISPLOC)) { - while (sequenceIs(xdisplocsubopt, baseline)) - ttloop(); - } - if (his_state_is_will(TELOPT_NEW_ENVIRON)) { - while (sequenceIs(environsubopt, baseline)) - ttloop(); - } - if (his_state_is_will(TELOPT_OLD_ENVIRON)) { - while (sequenceIs(oenvironsubopt, baseline)) - ttloop(); - } - if (his_state_is_will(TELOPT_TTYPE)) { - char first[256], last[256]; - - while (sequenceIs(ttypesubopt, baseline)) - ttloop(); - - /* - * If the other side has already disabled the option, then - * we have to just go with what we (might) have already gotten. - */ - if (his_state_is_will(TELOPT_TTYPE) && !terminaltypeok(terminaltype)) { - strlcpy(first, terminaltype, sizeof(first)); - for(;;) { - /* - * Save the unknown name, and request the next name. - */ - strlcpy(last, terminaltype, sizeof(last)); - _gettermname(); - if (terminaltypeok(terminaltype)) - break; - if ((strncmp(last, terminaltype, sizeof(last)) == 0) || - his_state_is_wont(TELOPT_TTYPE)) { - /* - * We've hit the end. If this is the same as - * the first name, just go with it. - */ - if (strncmp(first, terminaltype, sizeof(first)) == 0) - break; - /* - * Get the terminal name one more time, so that - * RFC1091 compliant telnets will cycle back to - * the start of the list. - */ - _gettermname(); - if (strncmp(first, terminaltype, sizeof(first)) != 0) - strlcpy(terminaltype, first, sizeof(terminaltype)); - break; - } - } - } - } - return(retval); -} /* end of getterminaltype */ - -void -_gettermname(void) -{ - /* - * If the client turned off the option, - * we can't send another request, so we - * just return. - */ - if (his_state_is_wont(TELOPT_TTYPE)) - return; - settimer(baseline); - telnet_net_write (ttytype_sbbuf, sizeof ttytype_sbbuf); - DIAG(TD_OPTIONS, printsub('>', ttytype_sbbuf + 2, - sizeof ttytype_sbbuf - 2);); - while (sequenceIs(ttypesubopt, baseline)) - ttloop(); -} - -int -terminaltypeok(char *s) -{ - return 1; -} - - -char host_name[MaxHostNameLen]; -char remote_host_name[MaxHostNameLen]; -char remote_utmp_name[MaxHostNameLen]; - -/* - * Get a pty, scan input lines. - */ -static void -doit(struct sockaddr *who, int who_len) -{ - int level; - int ptynum; - char user_name[256]; - int error; - - /* - * Find an available pty to use. - */ - ourpty = getpty(&ptynum); - if (ourpty < 0) - fatal(net, "All network ports in use"); - -#ifdef _SC_CRAY_SECURE_SYS - /* - * set ttyp line security label - */ - if (secflag) { - char slave_dev[16]; - - snprintf(tty_dev, sizeof(tty_dev), "/dev/pty/%03d", ptynum); - if (setdevs(tty_dev, &dv) < 0) - fatal(net, "cannot set pty security"); - snprintf(slave_dev, sizeof(slave_dev), "/dev/ttyp%03d", ptynum); - if (setdevs(slave_dev, &dv) < 0) - fatal(net, "cannot set tty security"); - } -#endif /* _SC_CRAY_SECURE_SYS */ - - error = getnameinfo_verified (who, who_len, - remote_host_name, - sizeof(remote_host_name), - NULL, 0, - registerd_host_only ? NI_NAMEREQD : 0); - if (error) - fatal(net, "Couldn't resolve your address into a host name.\r\n\ -Please contact your net administrator"); - - gethostname(host_name, sizeof (host_name)); - - strlcpy (remote_utmp_name, remote_host_name, sizeof(remote_utmp_name)); - - /* Only trim if too long (and possible) */ - if (strlen(remote_utmp_name) > utmp_len) { - char *domain = strchr(host_name, '.'); - char *p = strchr(remote_utmp_name, '.'); - if (domain != NULL && p != NULL && (strcmp(p, domain) == 0)) - *p = '\0'; /* remove domain part */ - } - - /* - * If hostname still doesn't fit utmp, use ipaddr. - */ - if (strlen(remote_utmp_name) > utmp_len) { - error = getnameinfo (who, who_len, - remote_utmp_name, - sizeof(remote_utmp_name), - NULL, 0, - NI_NUMERICHOST); - if (error) - fatal(net, "Couldn't get numeric address\r\n"); - } - -#ifdef AUTHENTICATION - auth_encrypt_init(host_name, remote_host_name, "TELNETD", 1); -#endif - - init_env(); - - /* begin server processing */ - - /* - * Initialize the slc mapping table. - */ - - get_slc_defaults(); - - /* - * get terminal type. - */ - *user_name = 0; - level = getterminaltype(user_name, sizeof(user_name)); - esetenv("TERM", terminaltype[0] ? terminaltype : "network", 1); - -#ifdef _SC_CRAY_SECURE_SYS - if (secflag) { - if (setulvl(dv.dv_actlvl) < 0) - fatal(net,"cannot setulvl()"); - if (setucmp(dv.dv_actcmp) < 0) - fatal(net, "cannot setucmp()"); - } -#endif /* _SC_CRAY_SECURE_SYS */ - - my_telnet(net, ourpty, remote_host_name, remote_utmp_name, - level, user_name); - /*NOTREACHED*/ -} /* end of doit */ - -/* output contents of /etc/issue.net, or /etc/issue */ -static void -show_issue(void) -{ - FILE *f; - char buf[128]; - f = fopen(SYSCONFDIR "/issue.net", "r"); - if(f == NULL) - f = fopen(SYSCONFDIR "/issue", "r"); - if(f){ - while(fgets(buf, sizeof(buf), f) != NULL) { - size_t len = strcspn(buf, "\r\n"); - if(len == strlen(buf)) { - /* there's no newline */ - writenet(buf, len); - } else { - /* replace newline with \r\n */ - buf[len] = '\0'; - writenet(buf, len); - writenet("\r\n", 2); - } - } - fclose(f); - } -} - -/* - * Main loop. Select from pty and network, and - * hand data to telnet receiver finite state machine. - */ -void -my_telnet(int f, int p, const char *host, const char *utmp_host, - int level, char *autoname) -{ - int on = 1; - char *he; - char *IM; - int nfd; - int startslave_called = 0; - time_t timeout; - - /* - * Do some tests where it is desireable to wait for a response. - * Rather than doing them slowly, one at a time, do them all - * at once. - */ - if (my_state_is_wont(TELOPT_SGA)) - send_will(TELOPT_SGA, 1); - /* - * Is the client side a 4.2 (NOT 4.3) system? We need to know this - * because 4.2 clients are unable to deal with TCP urgent data. - * - * To find out, we send out a "DO ECHO". If the remote system - * answers "WILL ECHO" it is probably a 4.2 client, and we note - * that fact ("WILL ECHO" ==> that the client will echo what - * WE, the server, sends it; it does NOT mean that the client will - * echo the terminal input). - */ - send_do(TELOPT_ECHO, 1); - - /* - * Send along a couple of other options that we wish to negotiate. - */ - send_do(TELOPT_NAWS, 1); - send_will(TELOPT_STATUS, 1); - flowmode = 1; /* default flow control state */ - restartany = -1; /* uninitialized... */ - send_do(TELOPT_LFLOW, 1); - - /* - * Spin, waiting for a response from the DO ECHO. However, - * some REALLY DUMB telnets out there might not respond - * to the DO ECHO. So, we spin looking for NAWS, (most dumb - * telnets so far seem to respond with WONT for a DO that - * they don't understand...) because by the time we get the - * response, it will already have processed the DO ECHO. - * Kludge upon kludge. - */ - while (his_will_wont_is_changing(TELOPT_NAWS)) - ttloop(); - - /* - * But... - * The client might have sent a WILL NAWS as part of its - * startup code; if so, we'll be here before we get the - * response to the DO ECHO. We'll make the assumption - * that any implementation that understands about NAWS - * is a modern enough implementation that it will respond - * to our DO ECHO request; hence we'll do another spin - * waiting for the ECHO option to settle down, which is - * what we wanted to do in the first place... - */ - if (his_want_state_is_will(TELOPT_ECHO) && - his_state_is_will(TELOPT_NAWS)) { - while (his_will_wont_is_changing(TELOPT_ECHO)) - ttloop(); - } - /* - * On the off chance that the telnet client is broken and does not - * respond to the DO ECHO we sent, (after all, we did send the - * DO NAWS negotiation after the DO ECHO, and we won't get here - * until a response to the DO NAWS comes back) simulate the - * receipt of a will echo. This will also send a WONT ECHO - * to the client, since we assume that the client failed to - * respond because it believes that it is already in DO ECHO - * mode, which we do not want. - */ - if (his_want_state_is_will(TELOPT_ECHO)) { - DIAG(TD_OPTIONS, - {output_data("td: simulating recv\r\n"); - }); - willoption(TELOPT_ECHO); - } - - /* - * Finally, to clean things up, we turn on our echo. This - * will break stupid 4.2 telnets out of local terminal echo. - */ - - if (my_state_is_wont(TELOPT_ECHO)) - send_will(TELOPT_ECHO, 1); - -#ifdef TIOCPKT -#ifdef STREAMSPTY - if (!really_stream) -#endif - /* - * Turn on packet mode - */ - ioctl(p, TIOCPKT, (char *)&on); -#endif - - - /* - * Call telrcv() once to pick up anything received during - * terminal type negotiation, 4.2/4.3 determination, and - * linemode negotiation. - */ - telrcv(); - - ioctl(f, FIONBIO, (char *)&on); - ioctl(p, FIONBIO, (char *)&on); - -#if defined(SO_OOBINLINE) && defined(HAVE_SETSOCKOPT) - setsockopt(net, SOL_SOCKET, SO_OOBINLINE, - (void *)&on, sizeof on); -#endif /* defined(SO_OOBINLINE) */ - -#ifdef SIGTSTP - signal(SIGTSTP, SIG_IGN); -#endif -#ifdef SIGTTOU - /* - * Ignoring SIGTTOU keeps the kernel from blocking us - * in ttioct() in /sys/tty.c. - */ - signal(SIGTTOU, SIG_IGN); -#endif - - signal(SIGCHLD, cleanup); - -#ifdef TIOCNOTTY - { - int t; - t = open(_PATH_TTY, O_RDWR); - if (t >= 0) { - ioctl(t, TIOCNOTTY, (char *)0); - close(t); - } - } -#endif - - show_issue(); - /* - * Show banner that getty never gave. - * - * We put the banner in the pty input buffer. This way, it - * gets carriage return null processing, etc., just like all - * other pty --> client data. - */ - - if (getenv("USER")) - hostinfo = 0; - - IM = DEFAULT_IM; - he = 0; - edithost(he, host_name); - if (hostinfo && *IM) - putf(IM, ptyibuf2); - - if (pcc) - strncat(ptyibuf2, ptyip, pcc+1); - ptyip = ptyibuf2; - pcc = strlen(ptyip); - - DIAG(TD_REPORT, { - output_data("td: Entering processing loop\r\n"); - }); - - - nfd = ((f > p) ? f : p) + 1; - timeout = time(NULL) + 5; - for (;;) { - fd_set ibits, obits, xbits; - int c; - - /* wait for encryption to be turned on, but don't wait - indefinitely */ - if(!startslave_called && (!encrypt_delay() || timeout > time(NULL))){ - startslave_called = 1; - startslave(host, utmp_host, level, autoname); - } - - if (ncc < 0 && pcc < 0) - break; - - FD_ZERO(&ibits); - FD_ZERO(&obits); - FD_ZERO(&xbits); - - if (f >= FD_SETSIZE - || p >= FD_SETSIZE) - fatal(net, "fd too large"); - - /* - * Never look for input if there's still - * stuff in the corresponding output buffer - */ - if (nfrontp - nbackp || pcc > 0) { - FD_SET(f, &obits); - } else { - FD_SET(p, &ibits); - } - if (pfrontp - pbackp || ncc > 0) { - FD_SET(p, &obits); - } else { - FD_SET(f, &ibits); - } - if (!SYNCHing) { - FD_SET(f, &xbits); - } - if ((c = select(nfd, &ibits, &obits, &xbits, - (struct timeval *)0)) < 1) { - if (c == -1) { - if (errno == EINTR) { - continue; - } - } - sleep(5); - continue; - } - - /* - * Any urgent data? - */ - if (FD_ISSET(net, &xbits)) { - SYNCHing = 1; - } - - /* - * Something to read from the network... - */ - if (FD_ISSET(net, &ibits)) { -#ifndef SO_OOBINLINE - /* - * In 4.2 (and 4.3 beta) systems, the - * OOB indication and data handling in the kernel - * is such that if two separate TCP Urgent requests - * come in, one byte of TCP data will be overlaid. - * This is fatal for Telnet, but we try to live - * with it. - * - * In addition, in 4.2 (and...), a special protocol - * is needed to pick up the TCP Urgent data in - * the correct sequence. - * - * What we do is: if we think we are in urgent - * mode, we look to see if we are "at the mark". - * If we are, we do an OOB receive. If we run - * this twice, we will do the OOB receive twice, - * but the second will fail, since the second - * time we were "at the mark", but there wasn't - * any data there (the kernel doesn't reset - * "at the mark" until we do a normal read). - * Once we've read the OOB data, we go ahead - * and do normal reads. - * - * There is also another problem, which is that - * since the OOB byte we read doesn't put us - * out of OOB state, and since that byte is most - * likely the TELNET DM (data mark), we would - * stay in the TELNET SYNCH (SYNCHing) state. - * So, clocks to the rescue. If we've "just" - * received a DM, then we test for the - * presence of OOB data when the receive OOB - * fails (and AFTER we did the normal mode read - * to clear "at the mark"). - */ - if (SYNCHing) { - int atmark; - - ioctl(net, SIOCATMARK, (char *)&atmark); - if (atmark) { - ncc = recv(net, netibuf, sizeof (netibuf), MSG_OOB); - if ((ncc == -1) && (errno == EINVAL)) { - ncc = read(net, netibuf, sizeof (netibuf)); - if (sequenceIs(didnetreceive, gotDM)) { - SYNCHing = stilloob(net); - } - } - } else { - ncc = read(net, netibuf, sizeof (netibuf)); - } - } else { - ncc = read(net, netibuf, sizeof (netibuf)); - } - settimer(didnetreceive); -#else /* !defined(SO_OOBINLINE)) */ - ncc = read(net, netibuf, sizeof (netibuf)); -#endif /* !defined(SO_OOBINLINE)) */ - if (ncc < 0 && errno == EWOULDBLOCK) - ncc = 0; - else { - if (ncc <= 0) { - break; - } - netip = netibuf; - } - DIAG((TD_REPORT | TD_NETDATA), { - output_data("td: netread %d chars\r\n", ncc); - }); - DIAG(TD_NETDATA, printdata("nd", netip, ncc)); - } - - /* - * Something to read from the pty... - */ - if (FD_ISSET(p, &ibits)) { -#ifdef STREAMSPTY - if (really_stream) - pcc = readstream(p, ptyibuf, BUFSIZ); - else -#endif - pcc = read(p, ptyibuf, BUFSIZ); - - /* - * On some systems, if we try to read something - * off the master side before the slave side is - * opened, we get EIO. - */ - if (pcc < 0 && (errno == EWOULDBLOCK || -#ifdef EAGAIN - errno == EAGAIN || -#endif - errno == EIO)) { - pcc = 0; - } else { - if (pcc <= 0) - break; - if (ptyibuf[0] & TIOCPKT_FLUSHWRITE) { - netclear(); /* clear buffer back */ -#ifndef NO_URGENT - /* - * There are client telnets on some - * operating systems get screwed up - * royally if we send them urgent - * mode data. - */ - output_data ("%c%c", IAC, DM); - - neturg = nfrontp-1; /* off by one XXX */ - DIAG(TD_OPTIONS, - printoption("td: send IAC", DM)); - -#endif - } - if (his_state_is_will(TELOPT_LFLOW) && - (ptyibuf[0] & - (TIOCPKT_NOSTOP|TIOCPKT_DOSTOP))) { - int newflow = - ptyibuf[0] & TIOCPKT_DOSTOP ? 1 : 0; - if (newflow != flowmode) { - flowmode = newflow; - output_data("%c%c%c%c%c%c", - IAC, SB, TELOPT_LFLOW, - flowmode ? LFLOW_ON - : LFLOW_OFF, - IAC, SE); - DIAG(TD_OPTIONS, printsub('>', - (unsigned char *)nfrontp-4, - 4);); - } - } - pcc--; - ptyip = ptyibuf+1; - } - } - - while (pcc > 0) { - if ((&netobuf[BUFSIZ] - nfrontp) < 3) - break; - c = *ptyip++ & 0377, pcc--; - if (c == IAC) - *nfrontp++ = c; - *nfrontp++ = c; - if ((c == '\r') && (my_state_is_wont(TELOPT_BINARY))) { - if (pcc > 0 && ((*ptyip & 0377) == '\n')) { - *nfrontp++ = *ptyip++ & 0377; - pcc--; - } else - *nfrontp++ = '\0'; - } - } - - if (FD_ISSET(f, &obits) && (nfrontp - nbackp) > 0) - netflush(); - if (ncc > 0) - telrcv(); - if (FD_ISSET(p, &obits) && (pfrontp - pbackp) > 0) - ptyflush(); - } - cleanup(0); -} - -#ifndef TCSIG -# ifdef TIOCSIG -# define TCSIG TIOCSIG -# endif -#endif - -#ifdef STREAMSPTY - - int flowison = -1; /* current state of flow: -1 is unknown */ - -int -readstream(int p, char *ibuf, int bufsize) -{ - int flags = 0; - int ret = 0; - struct termios *tsp; -#if 0 - struct termio *tp; -#endif - struct iocblk *ip; - char vstop, vstart; - int ixon; - int newflow; - - strbufc.maxlen = BUFSIZ; - strbufc.buf = (char *)ctlbuf; - strbufd.maxlen = bufsize-1; - strbufd.len = 0; - strbufd.buf = ibuf+1; - ibuf[0] = 0; - - ret = getmsg(p, &strbufc, &strbufd, &flags); - if (ret < 0) /* error of some sort -- probably EAGAIN */ - return(-1); - - if (strbufc.len <= 0 || ctlbuf[0] == M_DATA) { - /* data message */ - if (strbufd.len > 0) { /* real data */ - return(strbufd.len + 1); /* count header char */ - } else { - /* nothing there */ - errno = EAGAIN; - return(-1); - } - } - - /* - * It's a control message. Return 1, to look at the flag we set - */ - - switch (ctlbuf[0]) { - case M_FLUSH: - if (ibuf[1] & FLUSHW) - ibuf[0] = TIOCPKT_FLUSHWRITE; - return(1); - - case M_IOCTL: - ip = (struct iocblk *) (ibuf+1); - - switch (ip->ioc_cmd) { -#ifdef TCSETS - case TCSETS: - case TCSETSW: - case TCSETSF: - tsp = (struct termios *) - (ibuf+1 + sizeof(struct iocblk)); - vstop = tsp->c_cc[VSTOP]; - vstart = tsp->c_cc[VSTART]; - ixon = tsp->c_iflag & IXON; - break; -#endif -#if 0 - case TCSETA: - case TCSETAW: - case TCSETAF: - tp = (struct termio *) (ibuf+1 + sizeof(struct iocblk)); - vstop = tp->c_cc[VSTOP]; - vstart = tp->c_cc[VSTART]; - ixon = tp->c_iflag & IXON; - break; -#endif - default: - errno = EAGAIN; - return(-1); - } - - newflow = (ixon && (vstart == 021) && (vstop == 023)) ? 1 : 0; - if (newflow != flowison) { /* it's a change */ - flowison = newflow; - ibuf[0] = newflow ? TIOCPKT_DOSTOP : TIOCPKT_NOSTOP; - return(1); - } - } - - /* nothing worth doing anything about */ - errno = EAGAIN; - return(-1); -} -#endif /* STREAMSPTY */ - -/* - * Send interrupt to process on other side of pty. - * If it is in raw mode, just write NULL; - * otherwise, write intr char. - */ -void -interrupt() -{ - ptyflush(); /* half-hearted */ - -#if defined(STREAMSPTY) && defined(TIOCSIGNAL) - /* Streams PTY style ioctl to post a signal */ - if (really_stream) - { - int sig = SIGINT; - ioctl(ourpty, TIOCSIGNAL, &sig); - ioctl(ourpty, I_FLUSH, FLUSHR); - } -#else -#ifdef TCSIG - ioctl(ourpty, TCSIG, (char *)SIGINT); -#else /* TCSIG */ - init_termbuf(); - *pfrontp++ = slctab[SLC_IP].sptr ? - (unsigned char)*slctab[SLC_IP].sptr : '\177'; -#endif /* TCSIG */ -#endif -} - -/* - * Send quit to process on other side of pty. - * If it is in raw mode, just write NULL; - * otherwise, write quit char. - */ -void -sendbrk() -{ - ptyflush(); /* half-hearted */ -#ifdef TCSIG - ioctl(ourpty, TCSIG, (char *)SIGQUIT); -#else /* TCSIG */ - init_termbuf(); - *pfrontp++ = slctab[SLC_ABORT].sptr ? - (unsigned char)*slctab[SLC_ABORT].sptr : '\034'; -#endif /* TCSIG */ -} - -void -sendsusp() -{ -#ifdef SIGTSTP - ptyflush(); /* half-hearted */ -# ifdef TCSIG - ioctl(ourpty, TCSIG, (char *)SIGTSTP); -# else /* TCSIG */ - *pfrontp++ = slctab[SLC_SUSP].sptr ? - (unsigned char)*slctab[SLC_SUSP].sptr : '\032'; -# endif /* TCSIG */ -#endif /* SIGTSTP */ -} - -/* - * When we get an AYT, if ^T is enabled, use that. Otherwise, - * just send back "[Yes]". - */ -void -recv_ayt() -{ -#if defined(SIGINFO) && defined(TCSIG) - if (slctab[SLC_AYT].sptr && *slctab[SLC_AYT].sptr != _POSIX_VDISABLE) { - ioctl(ourpty, TCSIG, (char *)SIGINFO); - return; - } -#endif - output_data("\r\n[Yes]\r\n"); -} - -void -doeof() -{ - init_termbuf(); - - *pfrontp++ = slctab[SLC_EOF].sptr ? - (unsigned char)*slctab[SLC_EOF].sptr : '\004'; -} diff --git a/crypto/heimdal/appl/telnet/telnetd/termstat.c b/crypto/heimdal/appl/telnet/telnetd/termstat.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/termstat.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "telnetd.h" - -RCSID("$Id$"); - -/* - * local variables - */ -int def_tspeed = -1, def_rspeed = -1; -#ifdef TIOCSWINSZ -int def_row = 0, def_col = 0; -#endif - -/* - * flowstat - * - * Check for changes to flow control - */ -void -flowstat(void) -{ - if (his_state_is_will(TELOPT_LFLOW)) { - if (tty_flowmode() != flowmode) { - flowmode = tty_flowmode(); - output_data("%c%c%c%c%c%c", - IAC, SB, TELOPT_LFLOW, - flowmode ? LFLOW_ON : LFLOW_OFF, - IAC, SE); - } - if (tty_restartany() != restartany) { - restartany = tty_restartany(); - output_data("%c%c%c%c%c%c", - IAC, SB, TELOPT_LFLOW, - restartany ? LFLOW_RESTART_ANY - : LFLOW_RESTART_XON, - IAC, SE); - } - } -} - -/* - * clientstat - * - * Process linemode related requests from the client. - * Client can request a change to only one of linemode, editmode or slc's - * at a time, and if using kludge linemode, then only linemode may be - * affected. - */ -void -clientstat(int code, int parm1, int parm2) -{ - /* - * Get a copy of terminal characteristics. - */ - init_termbuf(); - - /* - * Process request from client. code tells what it is. - */ - switch (code) { - case TELOPT_NAWS: -#ifdef TIOCSWINSZ - { - struct winsize ws; - - def_col = parm1; - def_row = parm2; - - /* - * Change window size as requested by client. - */ - - ws.ws_col = parm1; - ws.ws_row = parm2; - ioctl(ourpty, TIOCSWINSZ, (char *)&ws); - } -#endif /* TIOCSWINSZ */ - - break; - - case TELOPT_TSPEED: - { - def_tspeed = parm1; - def_rspeed = parm2; - /* - * Change terminal speed as requested by client. - * We set the receive speed first, so that if we can't - * store seperate receive and transmit speeds, the transmit - * speed will take precedence. - */ - tty_rspeed(parm2); - tty_tspeed(parm1); - set_termbuf(); - - break; - - } /* end of case TELOPT_TSPEED */ - - default: - /* What? */ - break; - } /* end of switch */ - - netflush(); - -} diff --git a/crypto/heimdal/appl/telnet/telnetd/utility.c b/crypto/heimdal/appl/telnet/telnetd/utility.c deleted file mode 100644 --- a/crypto/heimdal/appl/telnet/telnetd/utility.c +++ /dev/null @@ -1,1170 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#define PRINTOPTIONS -#include "telnetd.h" - -RCSID("$Id$"); - -/* - * utility functions performing io related tasks - */ - -/* - * ttloop - * - * A small subroutine to flush the network output buffer, get some - * data from the network, and pass it through the telnet state - * machine. We also flush the pty input buffer (by dropping its data) - * if it becomes too full. - * - * return 0 if OK or 1 if interrupted by a signal. - */ - -int -ttloop(void) -{ - DIAG(TD_REPORT, { - output_data("td: ttloop\r\n"); - }); - if (nfrontp-nbackp) - netflush(); - ncc = read(net, netibuf, sizeof netibuf); - if (ncc < 0) { - if (errno == EINTR) - return 1; - syslog(LOG_INFO, "ttloop: read: %m\n"); - exit(1); - } else if (ncc == 0) { - syslog(LOG_INFO, "ttloop: peer died\n"); - exit(1); - } - DIAG(TD_REPORT, { - output_data("td: ttloop read %d chars\r\n", ncc); - }); - netip = netibuf; - telrcv(); /* state machine */ - if (ncc > 0) { - pfrontp = pbackp = ptyobuf; - telrcv(); - } - return 0; -} /* end of ttloop */ - -/* - * Check a descriptor to see if out of band data exists on it. - */ -int -stilloob(int s) -{ - static struct timeval timeout = { 0 }; - fd_set excepts; - int value; - - if (s >= FD_SETSIZE) - fatal(ourpty, "fd too large"); - - do { - FD_ZERO(&excepts); - FD_SET(s, &excepts); - value = select(s+1, 0, 0, &excepts, &timeout); - } while ((value == -1) && (errno == EINTR)); - - if (value < 0) { - fatalperror(ourpty, "select"); - } - if (FD_ISSET(s, &excepts)) { - return 1; - } else { - return 0; - } -} - -void -ptyflush(void) -{ - int n; - - if ((n = pfrontp - pbackp) > 0) { - DIAG((TD_REPORT | TD_PTYDATA), { - output_data("td: ptyflush %d chars\r\n", n); - }); - DIAG(TD_PTYDATA, printdata("pd", pbackp, n)); - n = write(ourpty, pbackp, n); - } - if (n < 0) { - if (errno == EWOULDBLOCK || errno == EINTR) - return; - cleanup(0); - } - pbackp += n; - if (pbackp == pfrontp) - pbackp = pfrontp = ptyobuf; -} - -/* - * nextitem() - * - * Return the address of the next "item" in the TELNET data - * stream. This will be the address of the next character if - * the current address is a user data character, or it will - * be the address of the character following the TELNET command - * if the current address is a TELNET IAC ("I Am a Command") - * character. - */ -char * -nextitem(char *current) -{ - if ((*current&0xff) != IAC) { - return current+1; - } - switch (*(current+1)&0xff) { - case DO: - case DONT: - case WILL: - case WONT: - return current+3; - case SB:{ - /* loop forever looking for the SE */ - char *look = current+2; - - for (;;) { - if ((*look++&0xff) == IAC) { - if ((*look++&0xff) == SE) { - return look; - } - } - } - } - default: - return current+2; - } -} - - -/* - * netclear() - * - * We are about to do a TELNET SYNCH operation. Clear - * the path to the network. - * - * Things are a bit tricky since we may have sent the first - * byte or so of a previous TELNET command into the network. - * So, we have to scan the network buffer from the beginning - * until we are up to where we want to be. - * - * A side effect of what we do, just to keep things - * simple, is to clear the urgent data pointer. The principal - * caller should be setting the urgent data pointer AFTER calling - * us in any case. - */ -void -netclear(void) -{ - char *thisitem, *next; - char *good; -#define wewant(p) ((nfrontp > p) && ((*p&0xff) == IAC) && \ - ((*(p+1)&0xff) != EC) && ((*(p+1)&0xff) != EL)) - -#ifdef ENCRYPTION - thisitem = nclearto > netobuf ? nclearto : netobuf; -#else - thisitem = netobuf; -#endif - - while ((next = nextitem(thisitem)) <= nbackp) { - thisitem = next; - } - - /* Now, thisitem is first before/at boundary. */ - -#ifdef ENCRYPTION - good = nclearto > netobuf ? nclearto : netobuf; -#else - good = netobuf; /* where the good bytes go */ -#endif - - while (nfrontp > thisitem) { - if (wewant(thisitem)) { - int length; - - next = thisitem; - do { - next = nextitem(next); - } while (wewant(next) && (nfrontp > next)); - length = next-thisitem; - memmove(good, thisitem, length); - good += length; - thisitem = next; - } else { - thisitem = nextitem(thisitem); - } - } - - nbackp = netobuf; - nfrontp = good; /* next byte to be sent */ - neturg = 0; -} /* end of netclear */ - -extern int not42; - -/* - * netflush - * Send as much data as possible to the network, - * handling requests for urgent data. - */ -void -netflush(void) -{ - int n; - - if ((n = nfrontp - nbackp) > 0) { - DIAG(TD_REPORT, - { n += output_data("td: netflush %d chars\r\n", n); - }); -#ifdef ENCRYPTION - if (encrypt_output) { - char *s = nclearto ? nclearto : nbackp; - if (nfrontp - s > 0) { - (*encrypt_output)((unsigned char *)s, nfrontp-s); - nclearto = nfrontp; - } - } -#endif - /* - * if no urgent data, or if the other side appears to be an - * old 4.2 client (and thus unable to survive TCP urgent data), - * write the entire buffer in non-OOB mode. - */ -#if 1 /* remove this to make it work between solaris 2.6 and linux */ - if ((neturg == 0) || (not42 == 0)) { -#endif - n = write(net, nbackp, n); /* normal write */ -#if 1 /* remove this to make it work between solaris 2.6 and linux */ - } else { - n = neturg - nbackp; - /* - * In 4.2 (and 4.3) systems, there is some question about - * what byte in a sendOOB operation is the "OOB" data. - * To make ourselves compatible, we only send ONE byte - * out of band, the one WE THINK should be OOB (though - * we really have more the TCP philosophy of urgent data - * rather than the Unix philosophy of OOB data). - */ - if (n > 1) { - n = send(net, nbackp, n-1, 0); /* send URGENT all by itself */ - } else { - n = send(net, nbackp, n, MSG_OOB); /* URGENT data */ - } - } -#endif - } - if (n < 0) { - if (errno == EWOULDBLOCK || errno == EINTR) - return; - cleanup(0); - } - nbackp += n; -#ifdef ENCRYPTION - if (nbackp > nclearto) - nclearto = 0; -#endif - if (nbackp >= neturg) { - neturg = 0; - } - if (nbackp == nfrontp) { - nbackp = nfrontp = netobuf; -#ifdef ENCRYPTION - nclearto = 0; -#endif - } - return; -} - - -/* - * writenet - * - * Just a handy little function to write a bit of raw data to the net. - * It will force a transmit of the buffer if necessary - * - * arguments - * ptr - A pointer to a character string to write - * len - How many bytes to write - */ -void -writenet(const void *ptr, size_t len) -{ - /* flush buffer if no room for new data) */ - while ((&netobuf[BUFSIZ] - nfrontp) < len) { - /* if this fails, don't worry, buffer is a little big */ - netflush(); - } - if ((&netobuf[BUFSIZ] - nfrontp) < len) - abort(); - - memmove(nfrontp, ptr, len); - nfrontp += len; -} - - -/* - * miscellaneous functions doing a variety of little jobs follow ... - */ - - -void fatal(int f, char *msg) -{ - char buf[BUFSIZ]; - - snprintf(buf, sizeof(buf), "telnetd: %s.\r\n", msg); -#ifdef ENCRYPTION - if (encrypt_output) { - /* - * Better turn off encryption first.... - * Hope it flushes... - */ - encrypt_send_end(); - netflush(); - } -#endif - write(f, buf, (int)strlen(buf)); - sleep(1); /*XXX*/ - exit(1); -} - -void -fatalperror_errno(int f, const char *msg, int error) -{ - char buf[BUFSIZ]; - - snprintf(buf, sizeof(buf), "%s: %s", msg, strerror(error)); - fatal(f, buf); -} - -void -fatalperror(int f, const char *msg) -{ - fatalperror_errno(f, msg, errno); -} - -char editedhost[32]; - -void edithost(char *pat, char *host) -{ - char *res = editedhost; - - if (!pat) - pat = ""; - while (*pat) { - switch (*pat) { - - case '#': - if (*host) - host++; - break; - - case '@': - if (*host) - *res++ = *host++; - break; - - default: - *res++ = *pat; - break; - } - if (res == &editedhost[sizeof editedhost - 1]) { - *res = '\0'; - return; - } - pat++; - } - if (*host) - strlcpy (res, host, - sizeof editedhost - (res - editedhost)); - else - *res = '\0'; - editedhost[sizeof editedhost - 1] = '\0'; -} - -static char *putlocation; - -void -putstr(char *s) -{ - - while (*s) - putchr(*s++); -} - -void -putchr(int cc) -{ - *putlocation++ = cc; -} - -static char fmtstr[] = { "%l:%M%P on %A, %d %B %Y" }; - -void putf(char *cp, char *where) -{ -#ifdef HAVE_UNAME - struct utsname name; -#endif - char *slash; - time_t t; - char db[100]; - - /* if we don't have uname, set these to sensible values */ - char *sysname = "Unix", - *machine = "", - *release = "", - *version = ""; - -#ifdef HAVE_UNAME - uname(&name); - sysname=name.sysname; - machine=name.machine; - release=name.release; - version=name.version; -#endif - - putlocation = where; - - while (*cp) { - if (*cp != '%') { - putchr(*cp++); - continue; - } - switch (*++cp) { - - case 't': - slash = strchr(line+1, '/'); - if (slash == (char *) 0) - putstr(line); - else - putstr(&slash[1]); - break; - - case 'h': - putstr(editedhost); - break; - - case 's': - putstr(sysname); - break; - - case 'm': - putstr(machine); - break; - - case 'r': - putstr(release); - break; - - case 'v': - putstr(version); - break; - - case 'd': - time(&t); - strftime(db, sizeof(db), fmtstr, localtime(&t)); - putstr(db); - break; - - case '%': - putchr('%'); - break; - } - cp++; - } -} - -#ifdef DIAGNOSTICS -/* - * Print telnet options and commands in plain text, if possible. - */ -void -printoption(char *fmt, int option) -{ - if (TELOPT_OK(option)) - output_data("%s %s\r\n", - fmt, - TELOPT(option)); - else if (TELCMD_OK(option)) - output_data("%s %s\r\n", - fmt, - TELCMD(option)); - else - output_data("%s %d\r\n", - fmt, - option); - return; -} - -void -printsub(int direction, unsigned char *pointer, size_t length) - /* '<' or '>' */ - /* where suboption data sits */ - /* length of suboption data */ -{ - int i = 0; - unsigned char buf[512]; - - if (!(diagnostic & TD_OPTIONS)) - return; - - if (direction) { - output_data("td: %s suboption ", - direction == '<' ? "recv" : "send"); - if (length >= 3) { - int j; - - i = pointer[length-2]; - j = pointer[length-1]; - - if (i != IAC || j != SE) { - output_data("(terminated by "); - if (TELOPT_OK(i)) - output_data("%s ", - TELOPT(i)); - else if (TELCMD_OK(i)) - output_data("%s ", - TELCMD(i)); - else - output_data("%d ", - i); - if (TELOPT_OK(j)) - output_data("%s", - TELOPT(j)); - else if (TELCMD_OK(j)) - output_data("%s", - TELCMD(j)); - else - output_data("%d", - j); - output_data(", not IAC SE!) "); - } - } - length -= 2; - } - if (length < 1) { - output_data("(Empty suboption??\?)"); - return; - } - switch (pointer[0]) { - case TELOPT_TTYPE: - output_data("TERMINAL-TYPE "); - switch (pointer[1]) { - case TELQUAL_IS: - output_data("IS \"%.*s\"", - (int)(length-2), - (char *)pointer+2); - break; - case TELQUAL_SEND: - output_data("SEND"); - break; - default: - output_data("- unknown qualifier %d (0x%x).", - pointer[1], pointer[1]); - } - break; - case TELOPT_TSPEED: - output_data("TERMINAL-SPEED"); - if (length < 2) { - output_data(" (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case TELQUAL_IS: - output_data(" IS %.*s", (int)(length-2), (char *)pointer+2); - break; - default: - if (pointer[1] == 1) - output_data(" SEND"); - else - output_data(" %d (unknown)", pointer[1]); - for (i = 2; i < length; i++) { - output_data(" ?%d?", pointer[i]); - } - break; - } - break; - - case TELOPT_LFLOW: - output_data("TOGGLE-FLOW-CONTROL"); - if (length < 2) { - output_data(" (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case LFLOW_OFF: - output_data(" OFF"); - break; - case LFLOW_ON: - output_data(" ON"); - break; - case LFLOW_RESTART_ANY: - output_data(" RESTART-ANY"); - break; - case LFLOW_RESTART_XON: - output_data(" RESTART-XON"); - break; - default: - output_data(" %d (unknown)", - pointer[1]); - } - for (i = 2; i < length; i++) { - output_data(" ?%d?", - pointer[i]); - } - break; - - case TELOPT_NAWS: - output_data("NAWS"); - if (length < 2) { - output_data(" (empty suboption??\?)"); - break; - } - if (length == 2) { - output_data(" ?%d?", - pointer[1]); - break; - } - output_data(" %u %u(%u)", - pointer[1], - pointer[2], - (((unsigned int)pointer[1])<<8) + pointer[2]); - if (length == 4) { - output_data(" ?%d?", - pointer[3]); - break; - } - output_data(" %u %u(%u)", - pointer[3], - pointer[4], - (((unsigned int)pointer[3])<<8) + pointer[4]); - for (i = 5; i < length; i++) { - output_data(" ?%d?", - pointer[i]); - } - break; - - case TELOPT_LINEMODE: - output_data("LINEMODE "); - if (length < 2) { - output_data(" (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case WILL: - output_data("WILL "); - goto common; - case WONT: - output_data("WONT "); - goto common; - case DO: - output_data("DO "); - goto common; - case DONT: - output_data("DONT "); - common: - if (length < 3) { - output_data("(no option??\?)"); - break; - } - switch (pointer[2]) { - case LM_FORWARDMASK: - output_data("Forward Mask"); - for (i = 3; i < length; i++) { - output_data(" %x", pointer[i]); - } - break; - default: - output_data("%d (unknown)", - pointer[2]); - for (i = 3; i < length; i++) { - output_data(" %d", - pointer[i]); - } - break; - } - break; - - case LM_SLC: - output_data("SLC"); - for (i = 2; i < length - 2; i += 3) { - if (SLC_NAME_OK(pointer[i+SLC_FUNC])) - output_data(" %s", - SLC_NAME(pointer[i+SLC_FUNC])); - else - output_data(" %d", - pointer[i+SLC_FUNC]); - switch (pointer[i+SLC_FLAGS]&SLC_LEVELBITS) { - case SLC_NOSUPPORT: - output_data(" NOSUPPORT"); - break; - case SLC_CANTCHANGE: - output_data(" CANTCHANGE"); - break; - case SLC_VARIABLE: - output_data(" VARIABLE"); - break; - case SLC_DEFAULT: - output_data(" DEFAULT"); - break; - } - output_data("%s%s%s", - pointer[i+SLC_FLAGS]&SLC_ACK ? "|ACK" : "", - pointer[i+SLC_FLAGS]&SLC_FLUSHIN ? "|FLUSHIN" : "", - pointer[i+SLC_FLAGS]&SLC_FLUSHOUT ? "|FLUSHOUT" : ""); - if (pointer[i+SLC_FLAGS]& ~(SLC_ACK|SLC_FLUSHIN| - SLC_FLUSHOUT| SLC_LEVELBITS)) { - output_data("(0x%x)", - pointer[i+SLC_FLAGS]); - } - output_data(" %d;", - pointer[i+SLC_VALUE]); - if ((pointer[i+SLC_VALUE] == IAC) && - (pointer[i+SLC_VALUE+1] == IAC)) - i++; - } - for (; i < length; i++) { - output_data(" ?%d?", - pointer[i]); - } - break; - - case LM_MODE: - output_data("MODE "); - if (length < 3) { - output_data("(no mode??\?)"); - break; - } - { - char tbuf[32]; - snprintf(tbuf, - sizeof(tbuf), - "%s%s%s%s%s", - pointer[2]&MODE_EDIT ? "|EDIT" : "", - pointer[2]&MODE_TRAPSIG ? "|TRAPSIG" : "", - pointer[2]&MODE_SOFT_TAB ? "|SOFT_TAB" : "", - pointer[2]&MODE_LIT_ECHO ? "|LIT_ECHO" : "", - pointer[2]&MODE_ACK ? "|ACK" : ""); - output_data("%s", - tbuf[1] ? &tbuf[1] : "0"); - } - if (pointer[2]&~(MODE_EDIT|MODE_TRAPSIG|MODE_ACK)) { - output_data(" (0x%x)", - pointer[2]); - } - for (i = 3; i < length; i++) { - output_data(" ?0x%x?", - pointer[i]); - } - break; - default: - output_data("%d (unknown)", - pointer[1]); - for (i = 2; i < length; i++) { - output_data(" %d", pointer[i]); - } - } - break; - - case TELOPT_STATUS: { - char *cp; - int j, k; - - output_data("STATUS"); - - switch (pointer[1]) { - default: - if (pointer[1] == TELQUAL_SEND) - output_data(" SEND"); - else - output_data(" %d (unknown)", - pointer[1]); - for (i = 2; i < length; i++) { - output_data(" ?%d?", - pointer[i]); - } - break; - case TELQUAL_IS: - output_data(" IS\r\n"); - - for (i = 2; i < length; i++) { - switch(pointer[i]) { - case DO: cp = "DO"; goto common2; - case DONT: cp = "DONT"; goto common2; - case WILL: cp = "WILL"; goto common2; - case WONT: cp = "WONT"; goto common2; - common2: - i++; - if (TELOPT_OK(pointer[i])) - output_data(" %s %s", - cp, - TELOPT(pointer[i])); - else - output_data(" %s %d", - cp, - pointer[i]); - - output_data("\r\n"); - break; - - case SB: - output_data(" SB "); - i++; - j = k = i; - while (j < length) { - if (pointer[j] == SE) { - if (j+1 == length) - break; - if (pointer[j+1] == SE) - j++; - else - break; - } - pointer[k++] = pointer[j++]; - } - printsub(0, &pointer[i], k - i); - if (i < length) { - output_data(" SE"); - i = j; - } else - i = j - 1; - - output_data("\r\n"); - - break; - - default: - output_data(" %d", - pointer[i]); - break; - } - } - break; - } - break; - } - - case TELOPT_XDISPLOC: - output_data("X-DISPLAY-LOCATION "); - switch (pointer[1]) { - case TELQUAL_IS: - output_data("IS \"%.*s\"", - (int)(length-2), - (char *)pointer+2); - break; - case TELQUAL_SEND: - output_data("SEND"); - break; - default: - output_data("- unknown qualifier %d (0x%x).", - pointer[1], pointer[1]); - } - break; - - case TELOPT_NEW_ENVIRON: - output_data("NEW-ENVIRON "); - goto env_common1; - case TELOPT_OLD_ENVIRON: - output_data("OLD-ENVIRON"); - env_common1: - switch (pointer[1]) { - case TELQUAL_IS: - output_data("IS "); - goto env_common; - case TELQUAL_SEND: - output_data("SEND "); - goto env_common; - case TELQUAL_INFO: - output_data("INFO "); - env_common: - { - int quote = 0; - for (i = 2; i < length; i++ ) { - switch (pointer[i]) { - case NEW_ENV_VAR: - if (quote) - output_data("\" "); - output_data("VAR "); - quote = 0; - break; - - case NEW_ENV_VALUE: - if (quote) - output_data("\" "); - output_data("VALUE "); - quote = 0; - break; - - case ENV_ESC: - if (quote) - output_data("\" "); - output_data("ESC "); - quote = 0; - break; - - case ENV_USERVAR: - if (quote) - output_data("\" "); - output_data("USERVAR "); - quote = 0; - break; - - default: - if (isprint(pointer[i]) && pointer[i] != '"') { - if (!quote) { - output_data("\""); - quote = 1; - } - output_data("%c", pointer[i]); - } else { - output_data("%03o ", pointer[i]); - quote = 0; - } - break; - } - } - if (quote) - output_data("\""); - break; - } - } - break; - -#ifdef AUTHENTICATION - case TELOPT_AUTHENTICATION: - output_data("AUTHENTICATION"); - - if (length < 2) { - output_data(" (empty suboption??\?)"); - break; - } - switch (pointer[1]) { - case TELQUAL_REPLY: - case TELQUAL_IS: - output_data(" %s ", - (pointer[1] == TELQUAL_IS) ? - "IS" : "REPLY"); - if (AUTHTYPE_NAME_OK(pointer[2])) - output_data("%s ", - AUTHTYPE_NAME(pointer[2])); - else - output_data("%d ", - pointer[2]); - if (length < 3) { - output_data("(partial suboption??\?)"); - break; - } - output_data("%s|%s", - ((pointer[3] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ? - "CLIENT" : "SERVER", - ((pointer[3] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ? - "MUTUAL" : "ONE-WAY"); - - auth_printsub(&pointer[1], length - 1, buf, sizeof(buf)); - output_data("%s", - buf); - break; - - case TELQUAL_SEND: - i = 2; - output_data(" SEND "); - while (i < length) { - if (AUTHTYPE_NAME_OK(pointer[i])) - output_data("%s ", - AUTHTYPE_NAME(pointer[i])); - else - output_data("%d ", - pointer[i]); - if (++i >= length) { - output_data("(partial suboption??\?)"); - break; - } - output_data("%s|%s ", - ((pointer[i] & AUTH_WHO_MASK) == AUTH_WHO_CLIENT) ? - "CLIENT" : "SERVER", - ((pointer[i] & AUTH_HOW_MASK) == AUTH_HOW_MUTUAL) ? - "MUTUAL" : "ONE-WAY"); - ++i; - } - break; - - case TELQUAL_NAME: - i = 2; - output_data(" NAME \"%.*s\"", - (int)(length - 2), - pointer); - break; - - default: - for (i = 2; i < length; i++) { - output_data(" ?%d?", - pointer[i]); - } - break; - } - break; -#endif - -#ifdef ENCRYPTION - case TELOPT_ENCRYPT: - output_data("ENCRYPT"); - if (length < 2) { - output_data(" (empty suboption?)"); - break; - } - switch (pointer[1]) { - case ENCRYPT_START: - output_data(" START"); - break; - - case ENCRYPT_END: - output_data(" END"); - break; - - case ENCRYPT_REQSTART: - output_data(" REQUEST-START"); - break; - - case ENCRYPT_REQEND: - output_data(" REQUEST-END"); - break; - - case ENCRYPT_IS: - case ENCRYPT_REPLY: - output_data(" %s ", - (pointer[1] == ENCRYPT_IS) ? - "IS" : "REPLY"); - if (length < 3) { - output_data(" (partial suboption?)"); - break; - } - if (ENCTYPE_NAME_OK(pointer[2])) - output_data("%s ", - ENCTYPE_NAME(pointer[2])); - else - output_data(" %d (unknown)", - pointer[2]); - - encrypt_printsub(&pointer[1], length - 1, buf, sizeof(buf)); - output_data("%s", - buf); - break; - - case ENCRYPT_SUPPORT: - i = 2; - output_data(" SUPPORT "); - while (i < length) { - if (ENCTYPE_NAME_OK(pointer[i])) - output_data("%s ", - ENCTYPE_NAME(pointer[i])); - else - output_data("%d ", - pointer[i]); - i++; - } - break; - - case ENCRYPT_ENC_KEYID: - output_data(" ENC_KEYID %d", pointer[1]); - goto encommon; - - case ENCRYPT_DEC_KEYID: - output_data(" DEC_KEYID %d", pointer[1]); - goto encommon; - - default: - output_data(" %d (unknown)", pointer[1]); - encommon: - for (i = 2; i < length; i++) { - output_data(" %d", pointer[i]); - } - break; - } - break; -#endif - - default: - if (TELOPT_OK(pointer[0])) - output_data("%s (unknown)", - TELOPT(pointer[0])); - else - output_data("%d (unknown)", - pointer[i]); - for (i = 1; i < length; i++) { - output_data(" %d", pointer[i]); - } - break; - } - output_data("\r\n"); -} - -/* - * Dump a data buffer in hex and ascii to the output data stream. - */ -void -printdata(char *tag, char *ptr, size_t cnt) -{ - size_t i; - char xbuf[30]; - - while (cnt) { - /* flush net output buffer if no room for new data) */ - if ((&netobuf[BUFSIZ] - nfrontp) < 80) { - netflush(); - } - - /* add a line of output */ - output_data("%s: ", tag); - for (i = 0; i < 20 && cnt; i++) { - output_data("%02x", *ptr); - if (isprint((unsigned char)*ptr)) { - xbuf[i] = *ptr; - } else { - xbuf[i] = '.'; - } - if (i % 2) { - output_data(" "); - } - cnt--; - ptr++; - } - xbuf[i] = '\0'; - output_data(" %s\r\n", xbuf); - } -} -#endif /* DIAGNOSTICS */ diff --git a/crypto/heimdal/appl/test/Makefile.am b/crypto/heimdal/appl/test/Makefile.am --- a/crypto/heimdal/appl/test/Makefile.am +++ b/crypto/heimdal/appl/test/Makefile.am @@ -2,6 +2,8 @@ include $(top_srcdir)/Makefile.am.common +WFLAGS += $(WFLAGS_LITE) + noinst_PROGRAMS = tcp_client tcp_server gssapi_server gssapi_client \ uu_server uu_client nt_gss_server nt_gss_client http_client @@ -41,4 +43,4 @@ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) -EXTRA_DIST = NTMakefile +EXTRA_DIST = NTMakefile jgssapi_server.java diff --git a/crypto/heimdal/appl/test/Makefile.in b/crypto/heimdal/appl/test/Makefile.in --- a/crypto/heimdal/appl/test/Makefile.in +++ b/crypto/heimdal/appl/test/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,9 +94,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common noinst_PROGRAMS = tcp_client$(EXEEXT) tcp_server$(EXEEXT) \ gssapi_server$(EXEEXT) gssapi_client$(EXEEXT) \ uu_server$(EXEEXT) uu_client$(EXEEXT) nt_gss_server$(EXEEXT) \ @@ -51,7 +102,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -62,8 +112,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -76,6 +125,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -95,6 +145,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -110,6 +161,10 @@ am__DEPENDENCIES_3 = $(top_builddir)/lib/gssapi/libgssapi.la \ $(am__DEPENDENCIES_2) gssapi_client_DEPENDENCIES = $(am__DEPENDENCIES_3) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = am_gssapi_server_OBJECTS = gssapi_server.$(OBJEXT) \ gss_common.$(OBJEXT) common.$(OBJEXT) gssapi_server_OBJECTS = $(am_gssapi_server_OBJECTS) @@ -153,18 +208,45 @@ uu_server_DEPENDENCIES = $(top_builddir)/lib/krb5/libkrb5.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/common.Po ./$(DEPDIR)/gss_common.Po \ + ./$(DEPDIR)/gssapi_client.Po ./$(DEPDIR)/gssapi_server.Po \ + ./$(DEPDIR)/http_client.Po ./$(DEPDIR)/nt_gss_client.Po \ + ./$(DEPDIR)/nt_gss_common.Po ./$(DEPDIR)/nt_gss_server.Po \ + ./$(DEPDIR)/tcp_client.Po ./$(DEPDIR)/tcp_server.Po \ + ./$(DEPDIR)/uu_client.Po ./$(DEPDIR)/uu_server.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(gssapi_client_SOURCES) $(gssapi_server_SOURCES) \ $(http_client_SOURCES) $(nt_gss_client_SOURCES) \ $(nt_gss_server_SOURCES) $(tcp_client_SOURCES) \ @@ -175,13 +257,38 @@ $(nt_gss_server_SOURCES) $(tcp_client_SOURCES) \ $(tcp_server_SOURCES) $(uu_client_SOURCES) \ $(uu_server_SOURCES) -ETAGS = etags -CTAGS = ctags +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -196,16 +303,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -215,17 +325,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -244,12 +356,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -258,6 +367,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -274,10 +384,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -285,6 +393,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -299,12 +408,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -321,10 +433,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -334,14 +452,8 @@ STRIP = @STRIP@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS = @WFLAGS@ $(WFLAGS_LITE) +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -365,6 +477,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -388,9 +502,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -400,29 +519,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; tcp_client_SOURCES = tcp_client.c common.c test_locl.h tcp_server_SOURCES = tcp_server.c common.c test_locl.h gssapi_server_SOURCES = gssapi_server.c gss_common.c common.c \ @@ -448,11 +575,11 @@ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) -EXTRA_DIST = NTMakefile +EXTRA_DIST = NTMakefile jgssapi_server.java all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -465,15 +592,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign appl/test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign appl/test/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -492,33 +619,42 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -gssapi_client$(EXEEXT): $(gssapi_client_OBJECTS) $(gssapi_client_DEPENDENCIES) + +gssapi_client$(EXEEXT): $(gssapi_client_OBJECTS) $(gssapi_client_DEPENDENCIES) $(EXTRA_gssapi_client_DEPENDENCIES) @rm -f gssapi_client$(EXEEXT) - $(LINK) $(gssapi_client_OBJECTS) $(gssapi_client_LDADD) $(LIBS) -gssapi_server$(EXEEXT): $(gssapi_server_OBJECTS) $(gssapi_server_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(gssapi_client_OBJECTS) $(gssapi_client_LDADD) $(LIBS) + +gssapi_server$(EXEEXT): $(gssapi_server_OBJECTS) $(gssapi_server_DEPENDENCIES) $(EXTRA_gssapi_server_DEPENDENCIES) @rm -f gssapi_server$(EXEEXT) - $(LINK) $(gssapi_server_OBJECTS) $(gssapi_server_LDADD) $(LIBS) -http_client$(EXEEXT): $(http_client_OBJECTS) $(http_client_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(gssapi_server_OBJECTS) $(gssapi_server_LDADD) $(LIBS) + +http_client$(EXEEXT): $(http_client_OBJECTS) $(http_client_DEPENDENCIES) $(EXTRA_http_client_DEPENDENCIES) @rm -f http_client$(EXEEXT) - $(LINK) $(http_client_OBJECTS) $(http_client_LDADD) $(LIBS) -nt_gss_client$(EXEEXT): $(nt_gss_client_OBJECTS) $(nt_gss_client_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(http_client_OBJECTS) $(http_client_LDADD) $(LIBS) + +nt_gss_client$(EXEEXT): $(nt_gss_client_OBJECTS) $(nt_gss_client_DEPENDENCIES) $(EXTRA_nt_gss_client_DEPENDENCIES) @rm -f nt_gss_client$(EXEEXT) - $(LINK) $(nt_gss_client_OBJECTS) $(nt_gss_client_LDADD) $(LIBS) -nt_gss_server$(EXEEXT): $(nt_gss_server_OBJECTS) $(nt_gss_server_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(nt_gss_client_OBJECTS) $(nt_gss_client_LDADD) $(LIBS) + +nt_gss_server$(EXEEXT): $(nt_gss_server_OBJECTS) $(nt_gss_server_DEPENDENCIES) $(EXTRA_nt_gss_server_DEPENDENCIES) @rm -f nt_gss_server$(EXEEXT) - $(LINK) $(nt_gss_server_OBJECTS) $(nt_gss_server_LDADD) $(LIBS) -tcp_client$(EXEEXT): $(tcp_client_OBJECTS) $(tcp_client_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(nt_gss_server_OBJECTS) $(nt_gss_server_LDADD) $(LIBS) + +tcp_client$(EXEEXT): $(tcp_client_OBJECTS) $(tcp_client_DEPENDENCIES) $(EXTRA_tcp_client_DEPENDENCIES) @rm -f tcp_client$(EXEEXT) - $(LINK) $(tcp_client_OBJECTS) $(tcp_client_LDADD) $(LIBS) -tcp_server$(EXEEXT): $(tcp_server_OBJECTS) $(tcp_server_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(tcp_client_OBJECTS) $(tcp_client_LDADD) $(LIBS) + +tcp_server$(EXEEXT): $(tcp_server_OBJECTS) $(tcp_server_DEPENDENCIES) $(EXTRA_tcp_server_DEPENDENCIES) @rm -f tcp_server$(EXEEXT) - $(LINK) $(tcp_server_OBJECTS) $(tcp_server_LDADD) $(LIBS) -uu_client$(EXEEXT): $(uu_client_OBJECTS) $(uu_client_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(tcp_server_OBJECTS) $(tcp_server_LDADD) $(LIBS) + +uu_client$(EXEEXT): $(uu_client_OBJECTS) $(uu_client_DEPENDENCIES) $(EXTRA_uu_client_DEPENDENCIES) @rm -f uu_client$(EXEEXT) - $(LINK) $(uu_client_OBJECTS) $(uu_client_LDADD) $(LIBS) -uu_server$(EXEEXT): $(uu_server_OBJECTS) $(uu_server_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(uu_client_OBJECTS) $(uu_client_LDADD) $(LIBS) + +uu_server$(EXEEXT): $(uu_server_OBJECTS) $(uu_server_DEPENDENCIES) $(EXTRA_uu_server_DEPENDENCIES) @rm -f uu_server$(EXEEXT) - $(LINK) $(uu_server_OBJECTS) $(uu_server_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(uu_server_OBJECTS) $(uu_server_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -526,39 +662,45 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gss_common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssapi_client.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssapi_server.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http_client.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nt_gss_client.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nt_gss_common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nt_gss_server.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcp_client.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcp_server.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uu_client.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uu_server.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gss_common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssapi_client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gssapi_server.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/http_client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nt_gss_client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nt_gss_common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nt_gss_server.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcp_client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tcp_server.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uu_client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uu_server.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -566,26 +708,15 @@ 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) +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -597,15 +728,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -614,11 +741,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -666,10 +810,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -687,7 +836,18 @@ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/common.Po + -rm -f ./$(DEPDIR)/gss_common.Po + -rm -f ./$(DEPDIR)/gssapi_client.Po + -rm -f ./$(DEPDIR)/gssapi_server.Po + -rm -f ./$(DEPDIR)/http_client.Po + -rm -f ./$(DEPDIR)/nt_gss_client.Po + -rm -f ./$(DEPDIR)/nt_gss_common.Po + -rm -f ./$(DEPDIR)/nt_gss_server.Po + -rm -f ./$(DEPDIR)/tcp_client.Po + -rm -f ./$(DEPDIR)/tcp_server.Po + -rm -f ./$(DEPDIR)/uu_client.Po + -rm -f ./$(DEPDIR)/uu_server.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -711,9 +871,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -735,7 +894,18 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/common.Po + -rm -f ./$(DEPDIR)/gss_common.Po + -rm -f ./$(DEPDIR)/gssapi_client.Po + -rm -f ./$(DEPDIR)/gssapi_server.Po + -rm -f ./$(DEPDIR)/http_client.Po + -rm -f ./$(DEPDIR)/nt_gss_client.Po + -rm -f ./$(DEPDIR)/nt_gss_common.Po + -rm -f ./$(DEPDIR)/nt_gss_server.Po + -rm -f ./$(DEPDIR)/tcp_client.Po + -rm -f ./$(DEPDIR)/tcp_server.Po + -rm -f ./$(DEPDIR)/uu_client.Po + -rm -f ./$(DEPDIR)/uu_server.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -755,38 +925,53 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libtool clean-noinstPROGRAMS ctags \ - dist-hook distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libtool \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am dist-hook \ + 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + 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-hook + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -794,7 +979,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -839,11 +1024,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -851,6 +1045,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -893,6 +1089,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -906,13 +1115,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/appl/test/NTMakefile b/crypto/heimdal/appl/test/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/test/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=appl\test + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/appl/test/common.c b/crypto/heimdal/appl/test/common.c --- a/crypto/heimdal/appl/test/common.c +++ b/crypto/heimdal/appl/test/common.c @@ -33,12 +33,10 @@ #include "test_locl.h" -RCSID("$Id$"); - static int help_flag; static int version_flag; static char *port_str; -static char *keytab_str; +char *keytab_str; krb5_keytab keytab; char *service = SERVICE; char *mech = "krb5"; @@ -51,9 +49,9 @@ { "keytab", 'k', arg_string, &keytab_str, "keytab to use", "keytab" }, { "mech", 'm', arg_string, &mech, "gssapi mech to use", "mech" }, { "password", 'P', arg_string, &password, "password to use", "password" }, - { "fork", 'f', arg_flag, &fork_flag, "do fork" }, - { "help", 'h', arg_flag, &help_flag }, - { "version", 0, arg_flag, &version_flag } + { "fork", 'f', arg_flag, &fork_flag, "do fork", NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } }; static int num_args = sizeof(args) / sizeof(args[0]); @@ -115,12 +113,15 @@ if(argv[argc] != NULL) server_usage(1, args, num_args); - if (keytab_str != NULL) - ret = krb5_kt_resolve (*context, keytab_str, &keytab); - else - ret = krb5_kt_default (*context, &keytab); - if (ret) - krb5_err (*context, 1, ret, "krb5_kt_resolve/default"); + if (keytab_str != NULL) { + ret = krb5_kt_resolve (*context, keytab_str, &keytab); + if (ret) + krb5_err (*context, 1, ret, "krb5_kt_resolve"); + } else { + ret = krb5_kt_default (*context, &keytab); + if (ret) + krb5_err (*context, 1, ret, "krb5_kt_default"); + } return port; } @@ -162,6 +163,9 @@ s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); if (s < 0) continue; + + socket_set_ipv6only(s, 1); + if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { warn ("connect(%s)", hostname); close (s); diff --git a/crypto/heimdal/appl/test/gssapi_client.c b/crypto/heimdal/appl/test/gssapi_client.c --- a/crypto/heimdal/appl/test/gssapi_client.c +++ b/crypto/heimdal/appl/test/gssapi_client.c @@ -45,6 +45,7 @@ gss_buffer_desc real_input_token, real_output_token; gss_buffer_t input_token = &real_input_token, output_token = &real_output_token; + int conf_flag; /* get_mic */ @@ -62,6 +63,24 @@ write_token (sock, input_token); write_token (sock, output_token); + gss_release_buffer(&min_stat, output_token); + + /* verify mic */ + + read_token (sock, input_token); + read_token (sock, output_token); + + maj_stat = gss_verify_mic(&min_stat, + context_hdl, + input_token, + output_token, + NULL); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_verify_mic"); + + gss_release_buffer (&min_stat, input_token); + gss_release_buffer (&min_stat, output_token); + /* wrap */ input_token->length = 7; @@ -91,6 +110,21 @@ write_token (sock, output_token); + read_token (sock, input_token); + + maj_stat = gss_unwrap (&min_stat, + context_hdl, + input_token, + output_token, + &conf_flag, + NULL); + if(GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_unwrap"); + + write_token (sock, output_token); + + gss_release_buffer(&min_stat, output_token); + return 0; } @@ -111,8 +145,6 @@ OM_uint32 maj_stat, min_stat; gss_name_t server; gss_buffer_desc name_token; - u_char init_buf[4]; - u_char acct_buf[4]; gss_OID mech_oid; char *str; @@ -167,6 +199,8 @@ #if 0 struct gss_channel_bindings_struct input_chan_bindings; + u_char init_buf[4]; + u_char acct_buf[4]; input_chan_bindings.initiator_addrtype = GSS_C_AF_INET; input_chan_bindings.initiator_address.length = 4; diff --git a/crypto/heimdal/appl/test/gssapi_server.c b/crypto/heimdal/appl/test/gssapi_server.c --- a/crypto/heimdal/appl/test/gssapi_server.c +++ b/crypto/heimdal/appl/test/gssapi_server.c @@ -31,12 +31,15 @@ * SUCH DAMAGE. */ +/* + * A sample server that uses the GSSAPI. + */ + #include "test_locl.h" #include #include #include #include "gss_common.h" -RCSID("$Id$"); static int process_it(int sock, @@ -90,6 +93,24 @@ gss_release_buffer (&min_stat, input_token); gss_release_buffer (&min_stat, output_token); + /* create mic */ + + input_token->length = 6; + input_token->value = strdup("hejsan"); + + maj_stat = gss_get_mic(&min_stat, + context_hdl, + GSS_C_QOP_DEFAULT, + input_token, + output_token); + if (GSS_ERROR(maj_stat)) + gss_err (1, min_stat, "gss_get_mic"); + + write_token (sock, input_token); + write_token (sock, output_token); + + gss_release_buffer (&min_stat, output_token); + /* gss_unwrap */ read_token (sock, input_token); @@ -128,6 +149,25 @@ gss_release_buffer (&min_stat, input_token); gss_release_buffer (&min_stat, output_token); + input_token->value = "hejhej"; + input_token->length = 6; + + maj_stat = gss_wrap (&min_stat, + context_hdl, + 1, + GSS_C_QOP_DEFAULT, + input_token, + NULL, + output_token); + + write_token (sock, output_token); + gss_release_buffer (&min_stat, output_token); + + read_token (sock, input_token); + + if (input_token->length != 6 && memcmp(input_token->value, "hejhej", 6) != 0) + errx(1, "invalid reply"); + return 0; } @@ -294,13 +334,15 @@ } } -static int -doit (int port, const char *service) +static void +loop (int port, const char *service) { int sock, sock2; struct sockaddr_in my_addr; int one = 1; - int ret; + + if (keytab_str) + gsskrb5_register_acceptor_identity(keytab_str); sock = socket (AF_INET, SOCK_STREAM, 0); if (sock < 0) @@ -326,16 +368,25 @@ if (sock2 < 0) err (1, "accept"); - ret = proto (sock2, service); + proto (sock2, service); } - return ret; } +/* + * Iterative server; process one connection at a time. + */ int main(int argc, char **argv) { krb5_context context = NULL; /* XXX */ + krb5_error_code ret; int port = server_setup(&context, argc, argv); - return doit (port, service); + + ret = krb5_kt_have_content(context, keytab); + if (ret) + krb5_err (context, 1, ret, "krb5_kt_have_content"); + + loop (port, service); + return 0; } diff --git a/crypto/heimdal/appl/test/http_client.c b/crypto/heimdal/appl/test/http_client.c --- a/crypto/heimdal/appl/test/http_client.c +++ b/crypto/heimdal/appl/test/http_client.c @@ -117,15 +117,17 @@ static char *gss_service = "HTTP"; static struct getargs http_args[] = { - { "verbose", 'v', arg_flag, &verbose_flag, "verbose logging", }, + { "verbose", 'v', arg_flag, &verbose_flag, "verbose logging", NULL }, { "port", 'p', arg_string, &port_str, "port to connect to", "port" }, - { "delegate", 0, arg_flag, &delegate_flag, "gssapi delegate credential" }, + { "delegate", 0, arg_flag, &delegate_flag, "gssapi delegate credential", + NULL }, { "gss-service", 's', arg_string, &gss_service, "gssapi service to use", "service" }, { "mech", 'm', arg_string, &mech, "gssapi mech to use", "mech" }, - { "mutual", 0, arg_negative_flag, &mutual_flag, "no gssapi mutual auth" }, - { "help", 'h', arg_flag, &help_flag }, - { "version", 0, arg_flag, &version_flag } + { "mutual", 0, arg_negative_flag, &mutual_flag, "no gssapi mutual auth", + NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } }; static int num_http_args = sizeof(http_args) / sizeof(http_args[0]); @@ -189,7 +191,7 @@ static int http_query(const char *host, const char *page, - char **headers, int num_headers, struct http_req *req) + char **headers, struct http_req *req) { enum { RESPONSE, HEADER, BODY } state; ssize_t ret; @@ -204,7 +206,7 @@ errx(1, "connection failed"); fdprintf(s, "GET %s HTTP/1.0\r\n", page); - for (i = 0; i < num_headers; i++) + for (i = 0; headers[i]; i++) fdprintf(s, "%s\r\n", headers[i]); fdprintf(s, "Host: %s\r\n\r\n", host); @@ -290,8 +292,8 @@ struct http_req req; const char *host, *page; int i, done, print_body, gssapi_done, gssapi_started; - char *headers[10]; /* XXX */ - int num_headers; + char *headers[10] = { 0 }; + int num_headers = 0; gss_ctx_id_t context_hdl = GSS_C_NO_CONTEXT; gss_name_t server = GSS_C_NO_NAME; int optind = 0; @@ -337,9 +339,11 @@ do { print_body = 0; - http_query(host, page, headers, num_headers, &req); - for (i = 0 ; i < num_headers; i++) + http_query(host, page, headers, &req); + for (i = 0 ; headers[i]; i++) { free(headers[i]); + headers[i] = NULL; + } num_headers = 0; if (strstr(req.response, " 200 ") != NULL) { @@ -388,7 +392,7 @@ if (len == 0) errx(1, "invalid Negotiate token"); input_token.value = emalloc(len); - len = base64_decode(&h[i], input_token.value); + len = rk_base64_decode(&h[i], input_token.value); if (len < 0) errx(1, "invalid base64 Negotiate token %s", &h[i]); input_token.length = len; @@ -471,14 +475,13 @@ if (output_token.length) { char *neg_token; - base64_encode(output_token.value, - output_token.length, - &neg_token); + rk_base64_encode(output_token.value, + output_token.length, + &neg_token); - asprintf(&headers[0], "Authorization: Negotiate %s", + asprintf(&headers[num_headers++], "Authorization: Negotiate %s", neg_token); - num_headers = 1; free(neg_token); gss_release_buffer(&min_stat, &output_token); } diff --git a/crypto/heimdal/appl/test/jgssapi_server.java b/crypto/heimdal/appl/test/jgssapi_server.java new file mode 100644 --- /dev/null +++ b/crypto/heimdal/appl/test/jgssapi_server.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +import org.ietf.jgss.*; +import java.io.*; +import java.net.Socket; +import java.net.ServerSocket; + +public class jgssapi_server { + + static byte [] getMessage(DataInputStream inStream) + throws IOException + { + byte[] token; + token = new byte[inStream.readInt()]; + inStream.readFully(token); + return token; + } + + static void putMessage(DataOutputStream outStream, byte [] token) + throws IOException + { + outStream.writeInt(token.length); + outStream.write(token); + } + + + public static void main(String[] args) + throws IOException, GSSException { + + GSSManager manager = GSSManager.getInstance(); + + GSSContext context = manager.createContext((GSSCredential)null); + + byte[] token = null; + + int port = 4717; + + System.out.println("listen on port " + port); + + Socket s = new ServerSocket(port).accept(); + + DataInputStream inStream = new DataInputStream(s.getInputStream()); + DataOutputStream outStream = new DataOutputStream(s.getOutputStream()); + + System.out.println("negotiate context"); + while (!context.isEstablished()) { + token = getMessage(inStream); + + token = context.acceptSecContext(token, 0, token.length); + if (token != null) + putMessage(outStream, token); + } + + System.out.println("done"); + + /* + * mic + */ + System.out.println("mic test"); + + System.out.println(" verify mic"); + + byte[] intoken = getMessage(inStream); + byte[] outtoken = getMessage(inStream); + byte[] bytes = null; + + context.verifyMIC(outtoken, 0, outtoken.length, + intoken, 0, intoken.length, new MessageProp(0, false)); + + System.out.println(" create mic"); + + bytes = new byte[] { 0x66, 0x6f, 0x6f }; + + outtoken = context.getMIC(bytes, 0, bytes.length, new MessageProp(0, false)); + putMessage(outStream, bytes); + putMessage(outStream, outtoken); + + /* + * wrap int + */ + System.out.println("warp int"); + + outtoken = getMessage(inStream); + + bytes = context.unwrap(outtoken, 0, outtoken.length, new MessageProp(0, false)); + + if (bytes == null) + System.err.println("wrap int failed"); + + /* + * wrap conf + */ + System.out.println("warp conf"); + + outtoken = getMessage(inStream); + + bytes = context.unwrap(outtoken, 0, outtoken.length, new MessageProp(0, true)); + + if (bytes == null) + System.err.println("wrap conf failed"); + + + /* + * wrap conf + */ + System.out.println("warp conf"); + intoken = new byte[] { 0x66, 0x6f, 0x6f }; + outtoken = context.wrap(intoken, 0, intoken.length, new MessageProp(0, true)); + putMessage(outStream, outtoken); + outtoken = getMessage(inStream); + + context.dispose(); + + System.exit(0); + } +} + diff --git a/crypto/heimdal/appl/test/nt_gss_common.c b/crypto/heimdal/appl/test/nt_gss_common.c --- a/crypto/heimdal/appl/test/nt_gss_common.c +++ b/crypto/heimdal/appl/test/nt_gss_common.c @@ -86,6 +86,8 @@ | (net_len[2] << 16) | (net_len[3] << 24); + if (len > INT_MAX/16) + errx(1, "len too large"); buf->length = len; buf->value = malloc(len); if (read (sock, buf->value, len) != len) diff --git a/crypto/heimdal/appl/test/nt_gss_server.c b/crypto/heimdal/appl/test/nt_gss_server.c --- a/crypto/heimdal/appl/test/nt_gss_server.c +++ b/crypto/heimdal/appl/test/nt_gss_server.c @@ -58,8 +58,8 @@ { "service", 's', arg_string, &service, "service to use", "service" }, { "dump-auth", 0, arg_string, &auth_file, "dump authorization data", "file" }, - { "help", 'h', arg_flag, &help_flag }, - { "version", 0, arg_flag, &version_flag } + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } }; static int num_args = sizeof(args) / sizeof(args[0]); diff --git a/crypto/heimdal/appl/test/tcp_server.c b/crypto/heimdal/appl/test/tcp_server.c --- a/crypto/heimdal/appl/test/tcp_server.c +++ b/crypto/heimdal/appl/test/tcp_server.c @@ -31,9 +31,17 @@ * SUCH DAMAGE. */ +/* + * A sample server that uses the Kerberos V5 API. + * + * See "Introduction to the Kerberos 5 API" in the Doxygen documentation + * for a walkthrough of this code. + */ + #include "test_locl.h" RCSID("$Id$"); +/* The API needs one Kerberos context per thread. */ krb5_context context; static int @@ -50,20 +58,22 @@ uint32_t len, net_len; ssize_t n; + /* Initialize the authentication context, to be used to authenticate the peer. */ status = krb5_auth_con_init (context, &auth_context); if (status) krb5_err (context, 1, status, "krb5_auth_con_init"); + /* Extract the local and remote address from the socket into auth_context. */ status = krb5_auth_con_setaddrs_from_fd (context, auth_context, &sock); - if (status) krb5_err (context, 1, status, "krb5_auth_con_setaddrs_from_fd"); - if(gethostname (hostname, sizeof(hostname)) < 0) + if (gethostname (hostname, sizeof(hostname)) < 0) krb5_err (context, 1, errno, "gethostname"); + /* Create principal "server" for "service" on "hostname" (this host). */ status = krb5_sname_to_principal (context, hostname, service, @@ -72,17 +82,22 @@ if (status) krb5_err (context, 1, status, "krb5_sname_to_principal"); + /* + * Perform the server side of the sendauth protocol. On success, "ticket" + * contains the authenticated credentials of the client. + */ status = krb5_recvauth (context, &auth_context, &sock, VERSION, server, - 0, + 0, /* flags */ keytab, &ticket); if (status) krb5_err (context, 1, status, "krb5_recvauth"); + /* Extract the client name as a string. */ status = krb5_unparse_name (context, ticket->client, &name); @@ -95,6 +110,9 @@ krb5_data_zero (&data); krb5_data_zero (&packet); + /* + * Read the payload (encoded as length, value). + */ n = krb5_net_read (context, &sock, &net_len, 4); if (n == 0) krb5_errx (context, 1, "EOF in krb5_net_read"); @@ -111,6 +129,9 @@ if (n < 0) krb5_err (context, 1, errno, "krb5_net_read"); + /* + * Expect a KRB_SAFE message (authenticated, not encrypted) + */ status = krb5_rd_safe (context, auth_context, &packet, @@ -122,6 +143,9 @@ fprintf (stderr, "safe packet: %.*s\n", (int)data.length, (char *)data.data); + /* + * Read the payload (encoded as length, value). + */ n = krb5_net_read (context, &sock, &net_len, 4); if (n == 0) krb5_errx (context, 1, "EOF in krb5_net_read"); @@ -138,6 +162,9 @@ if (n < 0) krb5_err (context, 1, errno, "krb5_net_read"); + /* + * Expect a KRB_PRIV message (authenticated and encrypted) + */ status = krb5_rd_priv (context, auth_context, &packet, @@ -155,14 +182,24 @@ static int doit (int port, const char *service) { + /* Block waiting for a connection. */ mini_inetd (port, NULL); return proto (STDIN_FILENO, service); } +/* + * Process only one connection and then exit. + */ int main(int argc, char **argv) { int port = server_setup(&context, argc, argv); + krb5_error_code ret; + + ret = krb5_kt_have_content(context, keytab); + if (ret) + krb5_err (context, 1, ret, "krb5_kt_have_content"); + return doit (port, service); } diff --git a/crypto/heimdal/appl/test/test_locl.h b/crypto/heimdal/appl/test/test_locl.h --- a/crypto/heimdal/appl/test/test_locl.h +++ b/crypto/heimdal/appl/test/test_locl.h @@ -80,6 +80,7 @@ extern char *service; extern char *mech; +extern char *keytab_str; extern krb5_keytab keytab; extern int fork_flag; int server_setup(krb5_context*, int, char**); diff --git a/crypto/heimdal/appl/test/uu_client.c b/crypto/heimdal/appl/test/uu_client.c --- a/crypto/heimdal/appl/test/uu_client.c +++ b/crypto/heimdal/appl/test/uu_client.c @@ -39,7 +39,7 @@ static int proto (int sock, const char *hostname, const char *service) { - struct sockaddr_in remote, local; + struct sockaddr_storage remote, local; socklen_t addrlen; krb5_address remote_addr, local_addr; krb5_context context; @@ -54,12 +54,12 @@ addrlen = sizeof(local); if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 - || addrlen != sizeof(local)) + || addrlen > sizeof(local)) err (1, "getsockname(%s)", hostname); addrlen = sizeof(remote); if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 - || addrlen != sizeof(remote)) + || addrlen > sizeof(remote)) err (1, "getpeername(%s)", hostname); status = krb5_init_context(&context); @@ -74,13 +74,12 @@ if (status) krb5_err(context, 1, status, "krb5_auth_con_init"); - local_addr.addr_type = AF_INET; - local_addr.address.length = sizeof(local.sin_addr); - local_addr.address.data = &local.sin_addr; - - remote_addr.addr_type = AF_INET; - remote_addr.address.length = sizeof(remote.sin_addr); - remote_addr.address.data = &remote.sin_addr; + status = krb5_sockaddr2address (context, (struct sockaddr *)&local, &local_addr); + if (status) + krb5_err(context, 1, status, "krb5_sockaddr2address(local)"); + status = krb5_sockaddr2address (context, (struct sockaddr *)&remote, &remote_addr); + if (status) + krb5_err(context, 1, status, "krb5_sockaddr2address(remote)"); status = krb5_auth_con_setaddrs (context, auth_context, diff --git a/crypto/heimdal/appl/test/uu_server.c b/crypto/heimdal/appl/test/uu_server.c --- a/crypto/heimdal/appl/test/uu_server.c +++ b/crypto/heimdal/appl/test/uu_server.c @@ -39,7 +39,7 @@ static int proto (int sock, const char *service) { - struct sockaddr_in remote, local; + struct sockaddr_storage remote, local; socklen_t addrlen; krb5_address remote_addr, local_addr; krb5_ccache ccache; @@ -52,25 +52,24 @@ addrlen = sizeof(local); if (getsockname (sock, (struct sockaddr *)&local, &addrlen) < 0 - || addrlen != sizeof(local)) + || addrlen > sizeof(local)) err (1, "getsockname)"); addrlen = sizeof(remote); if (getpeername (sock, (struct sockaddr *)&remote, &addrlen) < 0 - || addrlen != sizeof(remote)) + || addrlen > sizeof(remote)) err (1, "getpeername"); status = krb5_auth_con_init (context, &auth_context); if (status) krb5_err(context, 1, status, "krb5_auth_con_init"); - local_addr.addr_type = AF_INET; - local_addr.address.length = sizeof(local.sin_addr); - local_addr.address.data = &local.sin_addr; - - remote_addr.addr_type = AF_INET; - remote_addr.address.length = sizeof(remote.sin_addr); - remote_addr.address.data = &remote.sin_addr; + status = krb5_sockaddr2address (context, (struct sockaddr *)&local, &local_addr); + if (status) + krb5_err(context, 1, status, "krb5_sockaddr2address(local)"); + status = krb5_sockaddr2address (context, (struct sockaddr *)&remote, &remote_addr); + if (status) + krb5_err(context, 1, status, "krb5_sockaddr2address(remote)"); status = krb5_auth_con_setaddrs (context, auth_context, @@ -174,34 +173,11 @@ static int doit (int port, const char *service) { - int sock, sock2; - struct sockaddr_in my_addr; - int one = 1; - - sock = socket (AF_INET, SOCK_STREAM, 0); - if (sock < 0) - err (1, "socket"); - - memset (&my_addr, 0, sizeof(my_addr)); - my_addr.sin_family = AF_INET; - my_addr.sin_port = port; - my_addr.sin_addr.s_addr = INADDR_ANY; - - if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, - (void *)&one, sizeof(one)) < 0) - warn ("setsockopt SO_REUSEADDR"); - - if (bind (sock, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) - err (1, "bind"); - - if (listen (sock, 1) < 0) - err (1, "listen"); + rk_socket_t sock; - sock2 = accept (sock, NULL, NULL); - if (sock2 < 0) - err (1, "accept"); + mini_inetd(port, &sock); - return proto (sock2, service); + return proto(sock, service); } int diff --git a/crypto/heimdal/autogen.sh b/crypto/heimdal/autogen.sh old mode 100644 new mode 100755 --- a/crypto/heimdal/autogen.sh +++ b/crypto/heimdal/autogen.sh @@ -2,5 +2,8 @@ # to really generate all files you need to run "make distcheck" in a # object tree, but this will do if you have all parts of the required # tool-chain installed +set -e autoreconf -f -i || { echo "autoreconf failed: $?"; exit 1; } -find . \( -name '*-private.h' -o -name '*-protos.h' \) -delete +find . \( -name '*-private.h' -o -name '*-protos.h' \) | xargs rm -f +perl -MJSON -e 'print foo;' || \ + { echo "you must install JSON perl module (cpan install JSON)"; exit 1; } diff --git a/crypto/heimdal/base/Makefile.am b/crypto/heimdal/base/Makefile.am deleted file mode 100644 --- a/crypto/heimdal/base/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ - -include $(top_srcdir)/Makefile.am.common - -lib_LTLIBRARIES = libheimbase.la -check_PROGRAMS = test_base - -libheimbase_la_LDFLAGS = -version-info 1:0:0 - -if versionscript -libheimbase_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map -endif - -include_HEADERS = heimbase.h - -dist_libheimbase_la_SOURCES = \ - array.c \ - baselocl.h \ - bool.c \ - dict.c \ - heimbase.c \ - heimbasepriv.h \ - heimqueue.h \ - null.c \ - number.c \ - string.c - -libheimbase_la_DEPENDENCIES = version-script.map - -test_base_LDADD = $(LIB_heimbase) - -EXTRA_DIST = NTMakefile version-script.map diff --git a/crypto/heimdal/base/Makefile.in b/crypto/heimdal/base/Makefile.in deleted file mode 100644 --- a/crypto/heimdal/base/Makefile.in +++ /dev/null @@ -1,941 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ - -# $Id$ - -# $Id$ - - -VPATH = @srcdir@ -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@ -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common -check_PROGRAMS = test_base$(EXEEXT) -@versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map -subdir = base -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ - $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ - $(top_srcdir)/cf/broken-glob.m4 \ - $(top_srcdir)/cf/broken-realloc.m4 \ - $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ - $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ - $(top_srcdir)/cf/capabilities.m4 \ - $(top_srcdir)/cf/check-compile-et.m4 \ - $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ - $(top_srcdir)/cf/check-man.m4 \ - $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ - $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ - $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ - $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ - $(top_srcdir)/cf/find-func-no-libs.m4 \ - $(top_srcdir)/cf/find-func-no-libs2.m4 \ - $(top_srcdir)/cf/find-func.m4 \ - $(top_srcdir)/cf/find-if-not-broken.m4 \ - $(top_srcdir)/cf/framework-security.m4 \ - $(top_srcdir)/cf/have-struct-field.m4 \ - $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ - $(top_srcdir)/cf/krb-bigendian.m4 \ - $(top_srcdir)/cf/krb-func-getlogin.m4 \ - $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ - $(top_srcdir)/cf/krb-readline.m4 \ - $(top_srcdir)/cf/krb-struct-spwd.m4 \ - $(top_srcdir)/cf/krb-struct-winsize.m4 \ - $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ - $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ - $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ - $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ - $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ - $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ - $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ - $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ - $(top_srcdir)/cf/roken-frag.m4 \ - $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ - $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ - $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ - $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/include/config.h -CONFIG_CLEAN_FILES = -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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" -LTLIBRARIES = $(lib_LTLIBRARIES) -libheimbase_la_LIBADD = -dist_libheimbase_la_OBJECTS = array.lo bool.lo dict.lo heimbase.lo \ - null.lo number.lo string.lo -libheimbase_la_OBJECTS = $(dist_libheimbase_la_OBJECTS) -libheimbase_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libheimbase_la_LDFLAGS) $(LDFLAGS) -o $@ -test_base_SOURCES = test_base.c -test_base_OBJECTS = test_base.$(OBJEXT) -test_base_DEPENDENCIES = $(LIB_heimbase) -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 = $(dist_libheimbase_la_SOURCES) test_base.c -DIST_SOURCES = $(dist_libheimbase_la_SOURCES) test_base.c -HEADERS = $(include_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ -AMTAR = @AMTAR@ -AR = @AR@ -ASN1_COMPILE = @ASN1_COMPILE@ -ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CANONICAL_HOST = @CANONICAL_HOST@ -CAPNG_CFLAGS = @CAPNG_CFLAGS@ -CAPNG_LIBS = @CAPNG_LIBS@ -CATMAN = @CATMAN@ -CATMANEXT = @CATMANEXT@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -COMPILE_ET = @COMPILE_ET@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ -DIR_hdbdir = @DIR_hdbdir@ -DIR_roken = @DIR_roken@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -GROFF = @GROFF@ -INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ -INCLUDE_libedit = @INCLUDE_libedit@ -INCLUDE_libintl = @INCLUDE_libintl@ -INCLUDE_openldap = @INCLUDE_openldap@ -INCLUDE_readline = @INCLUDE_readline@ -INCLUDE_sqlite3 = @INCLUDE_sqlite3@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ -LEX = @LEX@ -LEXLIB = @LEXLIB@ -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LIBADD_roken = @LIBADD_roken@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ -LIB_bswap16 = @LIB_bswap16@ -LIB_bswap32 = @LIB_bswap32@ -LIB_com_err = @LIB_com_err@ -LIB_com_err_a = @LIB_com_err_a@ -LIB_com_err_so = @LIB_com_err_so@ -LIB_crypt = @LIB_crypt@ -LIB_db_create = @LIB_db_create@ -LIB_dbm_firstkey = @LIB_dbm_firstkey@ -LIB_dbopen = @LIB_dbopen@ -LIB_dispatch_async_f = @LIB_dispatch_async_f@ -LIB_dlopen = @LIB_dlopen@ -LIB_dn_expand = @LIB_dn_expand@ -LIB_dns_search = @LIB_dns_search@ -LIB_door_create = @LIB_door_create@ -LIB_freeaddrinfo = @LIB_freeaddrinfo@ -LIB_gai_strerror = @LIB_gai_strerror@ -LIB_getaddrinfo = @LIB_getaddrinfo@ -LIB_gethostbyname = @LIB_gethostbyname@ -LIB_gethostbyname2 = @LIB_gethostbyname2@ -LIB_getnameinfo = @LIB_getnameinfo@ -LIB_getpwnam_r = @LIB_getpwnam_r@ -LIB_getsockopt = @LIB_getsockopt@ -LIB_hcrypto = @LIB_hcrypto@ -LIB_hcrypto_a = @LIB_hcrypto_a@ -LIB_hcrypto_appl = @LIB_hcrypto_appl@ -LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ -LIB_hstrerror = @LIB_hstrerror@ -LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ -LIB_libedit = @LIB_libedit@ -LIB_libintl = @LIB_libintl@ -LIB_loadquery = @LIB_loadquery@ -LIB_logout = @LIB_logout@ -LIB_logwtmp = @LIB_logwtmp@ -LIB_openldap = @LIB_openldap@ -LIB_openpty = @LIB_openpty@ -LIB_otp = @LIB_otp@ -LIB_pidfile = @LIB_pidfile@ -LIB_readline = @LIB_readline@ -LIB_res_ndestroy = @LIB_res_ndestroy@ -LIB_res_nsearch = @LIB_res_nsearch@ -LIB_res_search = @LIB_res_search@ -LIB_roken = @LIB_roken@ -LIB_security = @LIB_security@ -LIB_setsockopt = @LIB_setsockopt@ -LIB_socket = @LIB_socket@ -LIB_sqlite3 = @LIB_sqlite3@ -LIB_syslog = @LIB_syslog@ -LIB_tgetent = @LIB_tgetent@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -NO_AFS = @NO_AFS@ -NROFF = @NROFF@ -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@ -PKG_CONFIG = @PKG_CONFIG@ -PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ -PTHREAD_LDADD = @PTHREAD_LDADD@ -PTHREAD_LIBADD = @PTHREAD_LIBADD@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -SLC = @SLC@ -SLC_DEP = @SLC_DEP@ -STRIP = @STRIP@ -VERSION = @VERSION@ -VERSIONING = @VERSIONING@ -WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ -YACC = @YACC@ -YFLAGS = @YFLAGS@ -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_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@ -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@ -dpagaix_cflags = @dpagaix_cflags@ -dpagaix_ldadd = @dpagaix_ldadd@ -dpagaix_ldflags = @dpagaix_ldflags@ -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@ -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@ -subdirs = @subdirs@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -top_build_prefix = @top_build_prefix@ -top_builddir = @top_builddir@ -top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 -DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) -@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME -AM_CFLAGS = $(WFLAGS) -CP = cp -buildinclude = $(top_builddir)/include -LIB_el_init = @LIB_el_init@ -LIB_getattr = @LIB_getattr@ -LIB_getpwent_r = @LIB_getpwent_r@ -LIB_odm_initialize = @LIB_odm_initialize@ -LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ -libexec_heimdaldir = $(libexecdir)/heimdal -NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) -@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ -@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la - -@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la -@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -lib_LTLIBRARIES = libheimbase.la -libheimbase_la_LDFLAGS = -version-info 1:0:0 $(am__append_1) -include_HEADERS = heimbase.h -dist_libheimbase_la_SOURCES = \ - array.c \ - baselocl.h \ - bool.c \ - dict.c \ - heimbase.c \ - heimbasepriv.h \ - heimqueue.h \ - null.c \ - number.c \ - string.c - -libheimbase_la_DEPENDENCIES = version-script.map -test_base_LDADD = $(LIB_heimbase) -EXTRA_DIST = NTMakefile version-script.map -all: all-am - -.SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj -$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 base/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign base/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-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libheimbase.la: $(libheimbase_la_OBJECTS) $(libheimbase_la_DEPENDENCIES) - $(libheimbase_la_LINK) -rpath $(libdir) $(libheimbase_la_OBJECTS) $(libheimbase_la_LIBADD) $(LIBS) - -clean-checkPROGRAMS: - @list='$(check_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 -test_base$(EXEEXT): $(test_base_OBJECTS) $(test_base_DEPENDENCIES) - @rm -f test_base$(EXEEXT) - $(LINK) $(test_base_OBJECTS) $(test_base_LDADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bool.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dict.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heimbase.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/null.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/number.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_base.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 -install-includeHEADERS: $(include_HEADERS) - @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" - @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ - 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|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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" - -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 - $(MAKE) $(AM_MAKEFLAGS) \ - top_distdir="$(top_distdir)" distdir="$(distdir)" \ - dist-hook -check-am: all-am - $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) - $(MAKE) $(AM_MAKEFLAGS) check-local -check: check-am -all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local -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: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -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-checkPROGRAMS 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 - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-data-hook -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook -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 - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool ctags dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - 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-hook uninstall-includeHEADERS \ - uninstall-libLTLIBRARIES - - -install-suid-programs: - @foo='$(bin_SUIDS)'; \ - for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done - -install-exec-hook: install-suid-programs - -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ - for f in $$foo; do \ - f=`basename $$f`; \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done ; \ - foo='$(nobase_include_HEADERS)'; \ - for f in $$foo; do \ - if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ - else file="$$f"; fi; \ - $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ - if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ - : ; else \ - echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ - fi ; \ - done - -all-local: install-build-headers - -check-local:: - @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ - foo=''; elif test '$(CHECK_LOCAL)'; then \ - foo='$(CHECK_LOCAL)'; else \ - foo='$(PROGRAMS)'; fi; \ - if test "$$foo"; then \ - failed=0; all=0; \ - for i in $$foo; do \ - all=`expr $$all + 1`; \ - if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ - echo "PASS: $$i"; \ - else \ - echo "FAIL: $$i"; \ - failed=`expr $$failed + 1`; \ - fi; \ - done; \ - if test "$$failed" -eq 0; then \ - banner="All $$all tests passed"; \ - else \ - banner="$$failed of $$all tests failed"; \ - fi; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes"; \ - test "$$failed" -eq 0 || exit 1; \ - fi - -.x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ - -.hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ -#NROFF_MAN = nroff -man -.1.cat1: - $(NROFF_MAN) $< > $@ -.3.cat3: - $(NROFF_MAN) $< > $@ -.5.cat5: - $(NROFF_MAN) $< > $@ -.8.cat8: - $(NROFF_MAN) $< > $@ - -dist-cat1-mans: - @foo='$(man1_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.1) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat3-mans: - @foo='$(man3_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.3) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat5-mans: - @foo='$(man5_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.5) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-cat8-mans: - @foo='$(man8_MANS)'; \ - bar='$(man_MANS)'; \ - for i in $$bar; do \ - case $$i in \ - *.8) foo="$$foo $$i";; \ - esac; done ;\ - for i in $$foo; do \ - x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ - echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ - $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ - done - -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans - -install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) - -install-data-hook: install-cat-mans -uninstall-hook: uninstall-cat-mans - -.et.h: - $(COMPILE_ET) $< -.et.c: - $(COMPILE_ET) $< - -# -# Useful target for debugging -# - -check-valgrind: - tobjdir=`cd $(top_builddir) && pwd` ; \ - tsrcdir=`cd $(top_srcdir) && pwd` ; \ - env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check - -# -# Target to please samba build farm, builds distfiles in-tree. -# Will break when automake changes... -# - -distdir-in-tree: $(DISTFILES) $(INFO_DEPS) - list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" != .; then \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ - fi ; \ - done - -# 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: diff --git a/crypto/heimdal/base/NTMakefile b/crypto/heimdal/base/NTMakefile deleted file mode 100644 --- a/crypto/heimdal/base/NTMakefile +++ /dev/null @@ -1,53 +0,0 @@ -######################################################################## -# -# Copyright (c) 2010, Secure Endpoints Inc. -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# - Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# - Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN -# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -RELDIR=base - -!include ../windows/NTMakefile.w32 - -INCFILES=$(INCDIR)\heimbase.h - -libheimbase_OBJS = \ - $(OBJ)\array.obj \ - $(OBJ)\bool.obj \ - $(OBJ)\dict.obj \ - $(OBJ)\heimbase.obj \ - $(OBJ)\null.obj \ - $(OBJ)\number.obj \ - $(OBJ)\string.obj - -$(LIBHEIMBASE): $(libheimbase_OBJS) - $(LIBCON) - -all:: $(INCFILES) $(LIBHEIMBASE) - -clean:: - -$(RM) $(INCFILES) diff --git a/crypto/heimdal/base/array.c b/crypto/heimdal/base/array.c deleted file mode 100644 --- a/crypto/heimdal/base/array.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "baselocl.h" - -/* - * - */ - -struct heim_array_data { - size_t len; - heim_object_t *val; -}; - -static void -array_dealloc(heim_object_t ptr) -{ - heim_array_t array = ptr; - size_t n; - for (n = 0; n < array->len; n++) - heim_release(array->val[n]); - free(array->val); -} - -struct heim_type_data array_object = { - HEIM_TID_ARRAY, - "dict-object", - NULL, - array_dealloc, - NULL, - NULL, - NULL -}; - -/** - * Allocate an array - * - * @return A new allocated array, free with heim_release() - */ - -heim_array_t -heim_array_create(void) -{ - heim_array_t array; - - array = _heim_alloc_object(&array_object, sizeof(*array)); - if (array == NULL) - return NULL; - - array->val = NULL; - array->len = 0; - - return array; -} - -/** - * Get type id of an dict - * - * @return the type id - */ - -heim_tid_t -heim_array_get_type_id(void) -{ - return HEIM_TID_ARRAY; -} - -/** - * Append object to array - * - * @param array array to add too - * @param object the object to add - * - * @return zero if added, errno otherwise - */ - -int -heim_array_append_value(heim_array_t array, heim_object_t object) -{ - heim_object_t *ptr; - - ptr = realloc(array->val, (array->len + 1) * sizeof(array->val[0])); - if (ptr == NULL) - return ENOMEM; - array->val = ptr; - array->val[array->len++] = heim_retain(object); - - return 0; -} - -/** - * Iterate over all objects in array - * - * @param array array to iterate over - * @param fn function to call on each object - * @param ctx context passed to fn - */ - -void -heim_array_iterate_f(heim_array_t array, heim_array_iterator_f_t fn, void *ctx) -{ - size_t n; - for (n = 0; n < array->len; n++) - fn(array->val[n], ctx); -} - -#ifdef __BLOCKS__ -/** - * Iterate over all objects in array - * - * @param array array to iterate over - * @param fn block to call on each object - */ - -void -heim_array_iterate(heim_array_t array, void (^fn)(heim_object_t)) -{ - size_t n; - for (n = 0; n < array->len; n++) - fn(array->val[n]); -} -#endif - -/** - * Get length of array - * - * @param array array to get length of - * - * @return length of array - */ - -size_t -heim_array_get_length(heim_array_t array) -{ - return array->len; -} - -/** - * Copy value of array - * - * @param array array copy object from - * @param idx index of object, 0 based, must be smaller then - * heim_array_get_length() - * - * @return a retained copy of the object - */ - -heim_object_t -heim_array_copy_value(heim_array_t array, size_t idx) -{ - if (idx >= array->len) - heim_abort("index too large"); - return heim_retain(array->val[idx]); -} - -/** - * Delete value at idx - * - * @param array the array to modify - * @param idx the key to delete - */ - -void -heim_array_delete_value(heim_array_t array, size_t idx) -{ - heim_object_t obj; - if (idx >= array->len) - heim_abort("index too large"); - obj = array->val[idx]; - - array->len--; - - if (idx < array->len) - memmove(&array->val[idx], &array->val[idx + 1], - (array->len - idx) * sizeof(array->val[0])); - - heim_release(obj); -} - -#ifdef __BLOCKS__ -/** - * Get value at idx - * - * @param array the array to modify - * @param idx the key to delete - */ - -void -heim_array_filter(heim_array_t array, int (^block)(heim_object_t)) -{ - size_t n = 0; - - while (n < array->len) { - if (block(array->val[n])) { - heim_array_delete_value(array, n); - } else { - n++; - } - } -} - -#endif /* __BLOCKS__ */ diff --git a/crypto/heimdal/base/baselocl.h b/crypto/heimdal/base/baselocl.h deleted file mode 100644 --- a/crypto/heimdal/base/baselocl.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SELECT_H -#include -#endif - -#include -#include -#include -#include -#include - -#ifdef HAVE_UNISTD_H -#include -#endif - -#include "heimqueue.h" -#include "heim_threads.h" -#include "heimbase.h" -#include "heimbasepriv.h" - -#ifdef HAVE_DISPATCH_DISPATCH_H -#include -#endif - -#if defined(__GNUC__) && defined(HAVE___SYNC_ADD_AND_FETCH) - -#define heim_base_atomic_inc(x) __sync_add_and_fetch((x), 1) -#define heim_base_atomic_dec(x) __sync_sub_and_fetch((x), 1) -#define heim_base_atomic_type unsigned int -#define heim_base_atomic_max UINT_MAX - -#define heim_base_exchange_pointer(t,v) __sync_lock_test_and_set((t), (v)) - -#elif defined(_WIN32) - -#define heim_base_atomic_inc(x) InterlockedIncrement(x) -#define heim_base_atomic_dec(x) InterlockedDecrement(x) -#define heim_base_atomic_type LONG -#define heim_base_atomic_max MAXLONG - -#define heim_base_exchange_pointer(t,v) InterlockedExchangePointer((t),(v)) - -#else - -#define HEIM_BASE_NEED_ATOMIC_MUTEX 1 -extern HEIMDAL_MUTEX _heim_base_mutex; - -#define heim_base_atomic_type unsigned int - -static inline heim_base_atomic_type -heim_base_atomic_inc(heim_base_atomic_type *x) -{ - heim_base_atomic_type t; - HEIMDAL_MUTEX_lock(&_heim_base_mutex); - t = ++(*x); - HEIMDAL_MUTEX_unlock(&_heim_base_mutex); - return t; -} - -static inline heim_base_atomic_type -heim_base_atomic_dec(heim_base_atomic_type *x) -{ - heim_base_atomic_type t; - HEIMDAL_MUTEX_lock(&_heim_base_mutex); - t = --(*x); - HEIMDAL_MUTEX_unlock(&_heim_base_mutex); - return t; -} - -#define heim_base_atomic_max UINT_MAX - -#endif - -/* tagged strings/object/XXX */ -#define heim_base_is_tagged(x) (((uintptr_t)(x)) & 0x3) - -#define heim_base_is_tagged_object(x) ((((uintptr_t)(x)) & 0x3) == 1) -#define heim_base_make_tagged_object(x, tid) \ - ((heim_object_t)((((uintptr_t)(x)) << 5) | ((tid) << 2) | 0x1)) -#define heim_base_tagged_object_tid(x) ((((uintptr_t)(x)) & 0x1f) >> 2) -#define heim_base_tagged_object_value(x) (((uintptr_t)(x)) >> 5) - -/* - * - */ - -#undef HEIMDAL_NORETURN_ATTRIBUTE -#define HEIMDAL_NORETURN_ATTRIBUTE -#undef HEIMDAL_PRINTF_ATTRIBUTE -#define HEIMDAL_PRINTF_ATTRIBUTE(x) diff --git a/crypto/heimdal/base/bool.c b/crypto/heimdal/base/bool.c deleted file mode 100644 --- a/crypto/heimdal/base/bool.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "baselocl.h" - -struct heim_type_data _heim_bool_object = { - HEIM_TID_BOOL, - "bool-object", - NULL, - NULL, - NULL, - NULL, - NULL -}; - -heim_bool_t -heim_bool_create(int val) -{ - return heim_base_make_tagged_object(!!val, HEIM_TID_BOOL); -} - -int -heim_bool_val(heim_bool_t ptr) -{ - return heim_base_tagged_object_value(ptr); -} diff --git a/crypto/heimdal/base/dict.c b/crypto/heimdal/base/dict.c deleted file mode 100644 --- a/crypto/heimdal/base/dict.c +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (c) 2002, 1997 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "baselocl.h" - -struct hashentry { - struct hashentry **prev; - struct hashentry *next; - heim_object_t key; - heim_object_t value; -}; - -struct heim_dict_data { - size_t size; - struct hashentry **tab; -}; - -static void -dict_dealloc(void *ptr) -{ - heim_dict_t dict = ptr; - struct hashentry **h, *g, *i; - - for (h = dict->tab; h < &dict->tab[dict->size]; ++h) { - for (g = h[0]; g; g = i) { - i = g->next; - heim_release(g->key); - heim_release(g->value); - free(g); - } - } - free(dict->tab); -} - -struct heim_type_data dict_object = { - HEIM_TID_DICT, - "dict-object", - NULL, - dict_dealloc, - NULL, - NULL, - NULL -}; - -static size_t -isprime(size_t p) -{ - size_t q, i; - - for(i = 2 ; i < p; i++) { - q = p / i; - - if (i * q == p) - return 0; - if (i * i > p) - return 1; - } - return 1; -} - -static size_t -findprime(size_t p) -{ - if (p % 2 == 0) - p++; - - while (isprime(p) == 0) - p += 2; - - return p; -} - -/** - * Allocate an array - * - * @return A new allocated array, free with heim_release() - */ - -heim_dict_t -heim_dict_create(size_t size) -{ - heim_dict_t dict; - - dict = _heim_alloc_object(&dict_object, sizeof(*dict)); - - dict->size = findprime(size); - if (dict->size == 0) { - heim_release(dict); - return NULL; - } - - dict->tab = calloc(dict->size, sizeof(dict->tab[0])); - if (dict->tab == NULL) { - dict->size = 0; - heim_release(dict); - return NULL; - } - - return dict; -} - -/** - * Get type id of an dict - * - * @return the type id - */ - -heim_tid_t -heim_dict_get_type_id(void) -{ - return HEIM_TID_DICT; -} - -/* Intern search function */ - -static struct hashentry * -_search(heim_dict_t dict, heim_object_t ptr) -{ - unsigned long v = heim_get_hash(ptr); - struct hashentry *p; - - for (p = dict->tab[v % dict->size]; p != NULL; p = p->next) - if (heim_cmp(ptr, p->key) == 0) - return p; - - return NULL; -} - -/** - * Search for element in hash table - * - * @value dict the dict to search in - * @value key the key to search for - * - * @return a retained copy of the value for key or NULL if not found - */ - -heim_object_t -heim_dict_copy_value(heim_dict_t dict, heim_object_t key) -{ - struct hashentry *p; - p = _search(dict, key); - if (p == NULL) - return NULL; - - return heim_retain(p->value); -} - -/** - * Add key and value to dict - * - * @value dict the dict to add too - * @value key the key to add - * @value value the value to add - * - * @return 0 if added, errno if not - */ - -int -heim_dict_add_value(heim_dict_t dict, heim_object_t key, heim_object_t value) -{ - struct hashentry **tabptr, *h; - - h = _search(dict, key); - if (h) { - heim_release(h->value); - h->value = heim_retain(value); - } else { - unsigned long v; - - h = malloc(sizeof(*h)); - if (h == NULL) - return ENOMEM; - - h->key = heim_retain(key); - h->value = heim_retain(value); - - v = heim_get_hash(key); - - tabptr = &dict->tab[v % dict->size]; - h->next = *tabptr; - *tabptr = h; - h->prev = tabptr; - if (h->next) - h->next->prev = &h->next; - } - - return 0; -} - -/** - * Delete element with key key - * - * @value dict the dict to delete from - * @value key the key to delete - */ - -void -heim_dict_delete_key(heim_dict_t dict, heim_object_t key) -{ - struct hashentry *h = _search(dict, key); - - if (h == NULL) - return; - - heim_release(h->key); - heim_release(h->value); - - if ((*(h->prev) = h->next) != NULL) - h->next->prev = h->prev; - - free(h); -} - -/** - * Do something for each element - * - * @value dict the dict to interate over - * @value func the function to search for - * @value arg argument to func - */ - -void -heim_dict_iterate_f(heim_dict_t dict, heim_dict_iterator_f_t func, void *arg) -{ - struct hashentry **h, *g; - - for (h = dict->tab; h < &dict->tab[dict->size]; ++h) - for (g = *h; g; g = g->next) - func(g->key, g->value, arg); -} - -#ifdef __BLOCKS__ -/** - * Do something for each element - * - * @value dict the dict to interate over - * @value func the function to search for - */ - -void -heim_dict_iterate(heim_dict_t dict, void (^func)(heim_object_t, heim_object_t)) -{ - struct hashentry **h, *g; - - for (h = dict->tab; h < &dict->tab[dict->size]; ++h) - for (g = *h; g; g = g->next) - func(g->key, g->value); -} -#endif diff --git a/crypto/heimdal/base/heimbase.h b/crypto/heimdal/base/heimbase.h deleted file mode 100644 --- a/crypto/heimdal/base/heimbase.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef HEIM_BASE_H -#define HEIM_BASE_H 1 - -#include -#include -#include -#include - -typedef void * heim_object_t; -typedef unsigned int heim_tid_t; -typedef heim_object_t heim_bool_t; -typedef heim_object_t heim_null_t; -#define HEIM_BASE_ONCE_INIT 0 -typedef long heim_base_once_t; /* XXX arch dependant */ - -#if !defined(__has_extension) -#define __has_extension(x) 0 -#endif - -#define HEIM_REQUIRE_GNUC(m,n,p) \ - (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__) >= \ - (((m) * 10000) + ((n) * 100) + (p))) - - -#if __has_extension(__builtin_expect) || HEIM_REQUIRE_GNUC(3,0,0) -#define heim_builtin_expect(_op,_res) __builtin_expect(_op,_res) -#else -#define heim_builtin_expect(_op,_res) (_op) -#endif - - -void * heim_retain(heim_object_t); -void heim_release(heim_object_t); - -typedef void (*heim_type_dealloc)(void *); - -void * -heim_alloc(size_t size, const char *name, heim_type_dealloc dealloc); - -heim_tid_t -heim_get_tid(heim_object_t object); - -int -heim_cmp(heim_object_t a, heim_object_t b); - -unsigned long -heim_get_hash(heim_object_t ptr); - -void -heim_base_once_f(heim_base_once_t *, void *, void (*)(void *)); - -void -heim_abort(const char *fmt, ...) - HEIMDAL_NORETURN_ATTRIBUTE - HEIMDAL_PRINTF_ATTRIBUTE((printf, 1, 2)); - -void -heim_abortv(const char *fmt, va_list ap) - HEIMDAL_NORETURN_ATTRIBUTE - HEIMDAL_PRINTF_ATTRIBUTE((printf, 1, 0)); - -#define heim_assert(e,t) \ - (heim_builtin_expect(!(e), 0) ? heim_abort(t ":" #e) : (void)0) - -/* - * - */ - -heim_null_t -heim_null_create(void); - -heim_bool_t -heim_bool_create(int); - -int -heim_bool_val(heim_bool_t); - -/* - * Array - */ - -typedef struct heim_array_data *heim_array_t; - -heim_array_t heim_array_create(void); -heim_tid_t heim_array_get_type_id(void); - -typedef void (*heim_array_iterator_f_t)(heim_object_t, void *); - -int heim_array_append_value(heim_array_t, heim_object_t); -void heim_array_iterate_f(heim_array_t, heim_array_iterator_f_t, void *); -#ifdef __BLOCKS__ -void heim_array_iterate(heim_array_t, void (^)(heim_object_t)); -#endif -size_t heim_array_get_length(heim_array_t); -heim_object_t - heim_array_copy_value(heim_array_t, size_t); -void heim_array_delete_value(heim_array_t, size_t); -#ifdef __BLOCKS__ -void heim_array_filter(heim_array_t, int (^)(heim_object_t)); -#endif - -/* - * Dict - */ - -typedef struct heim_dict_data *heim_dict_t; - -heim_dict_t heim_dict_create(size_t size); -heim_tid_t heim_dict_get_type_id(void); - -typedef void (*heim_dict_iterator_f_t)(heim_object_t, heim_object_t, void *); - -int heim_dict_add_value(heim_dict_t, heim_object_t, heim_object_t); -void heim_dict_iterate_f(heim_dict_t, heim_dict_iterator_f_t, void *); -#ifdef __BLOCKS__ -void heim_dict_iterate(heim_dict_t, void (^)(heim_object_t, heim_object_t)); -#endif - -heim_object_t - heim_dict_copy_value(heim_dict_t, heim_object_t); -void heim_dict_delete_key(heim_dict_t, heim_object_t); - -/* - * String - */ - -typedef struct heim_string_data *heim_string_t; - -heim_string_t heim_string_create(const char *); -heim_tid_t heim_string_get_type_id(void); -const char * heim_string_get_utf8(heim_string_t); - -/* - * Number - */ - -typedef struct heim_number_data *heim_number_t; - -heim_number_t heim_number_create(int); -heim_tid_t heim_number_get_type_id(void); -int heim_number_get_int(heim_number_t); - -/* - * - */ - -typedef struct heim_auto_release * heim_auto_release_t; - -heim_auto_release_t heim_auto_release_create(void); -void heim_auto_release_drain(heim_auto_release_t); -void heim_auto_release(heim_object_t); - -#endif /* HEIM_BASE_H */ diff --git a/crypto/heimdal/base/heimbase.c b/crypto/heimdal/base/heimbase.c deleted file mode 100644 --- a/crypto/heimdal/base/heimbase.c +++ /dev/null @@ -1,559 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "baselocl.h" -#include - -static heim_base_atomic_type tidglobal = HEIM_TID_USER; - -struct heim_base { - heim_type_t isa; - heim_base_atomic_type ref_cnt; - HEIM_TAILQ_ENTRY(heim_base) autorel; - heim_auto_release_t autorelpool; - uintptr_t isaextra[3]; -}; - -/* specialized version of base */ -struct heim_base_mem { - heim_type_t isa; - heim_base_atomic_type ref_cnt; - HEIM_TAILQ_ENTRY(heim_base) autorel; - heim_auto_release_t autorelpool; - const char *name; - void (*dealloc)(void *); - uintptr_t isaextra[1]; -}; - -#define PTR2BASE(ptr) (((struct heim_base *)ptr) - 1) -#define BASE2PTR(ptr) ((void *)(((struct heim_base *)ptr) + 1)) - -#ifdef HEIM_BASE_NEED_ATOMIC_MUTEX -HEIMDAL_MUTEX _heim_base_mutex = HEIMDAL_MUTEX_INITIALIZER; -#endif - -/* - * Auto release structure - */ - -struct heim_auto_release { - HEIM_TAILQ_HEAD(, heim_base) pool; - HEIMDAL_MUTEX pool_mutex; - struct heim_auto_release *parent; -}; - - -/** - * Retain object - * - * @param object to be released, NULL is ok - * - * @return the same object as passed in - */ - -void * -heim_retain(void *ptr) -{ - struct heim_base *p = PTR2BASE(ptr); - - if (ptr == NULL || heim_base_is_tagged(ptr)) - return ptr; - - if (p->ref_cnt == heim_base_atomic_max) - return ptr; - - if ((heim_base_atomic_inc(&p->ref_cnt) - 1) == 0) - heim_abort("resurection"); - return ptr; -} - -/** - * Release object, free is reference count reaches zero - * - * @param object to be released - */ - -void -heim_release(void *ptr) -{ - heim_base_atomic_type old; - struct heim_base *p = PTR2BASE(ptr); - - if (ptr == NULL || heim_base_is_tagged(ptr)) - return; - - if (p->ref_cnt == heim_base_atomic_max) - return; - - old = heim_base_atomic_dec(&p->ref_cnt) + 1; - - if (old > 1) - return; - - if (old == 1) { - heim_auto_release_t ar = p->autorelpool; - /* remove from autorel pool list */ - if (ar) { - p->autorelpool = NULL; - HEIMDAL_MUTEX_lock(&ar->pool_mutex); - HEIM_TAILQ_REMOVE(&ar->pool, p, autorel); - HEIMDAL_MUTEX_unlock(&ar->pool_mutex); - } - if (p->isa->dealloc) - p->isa->dealloc(ptr); - free(p); - } else - heim_abort("over release"); -} - -static heim_type_t tagged_isa[9] = { - &_heim_number_object, - &_heim_null_object, - &_heim_bool_object, - - NULL, - NULL, - NULL, - - NULL, - NULL, - NULL -}; - -heim_type_t -_heim_get_isa(heim_object_t ptr) -{ - struct heim_base *p; - if (heim_base_is_tagged(ptr)) { - if (heim_base_is_tagged_object(ptr)) - return tagged_isa[heim_base_tagged_object_tid(ptr)]; - heim_abort("not a supported tagged type"); - } - p = PTR2BASE(ptr); - return p->isa; -} - -/** - * Get type ID of object - * - * @param object object to get type id of - * - * @return type id of object - */ - -heim_tid_t -heim_get_tid(heim_object_t ptr) -{ - heim_type_t isa = _heim_get_isa(ptr); - return isa->tid; -} - -/** - * Get hash value of object - * - * @param object object to get hash value for - * - * @return a hash value - */ - -unsigned long -heim_get_hash(heim_object_t ptr) -{ - heim_type_t isa = _heim_get_isa(ptr); - if (isa->hash) - return isa->hash(ptr); - return (unsigned long)ptr; -} - -/** - * Compare two objects, returns 0 if equal, can use used for qsort() - * and friends. - * - * @param a first object to compare - * @param b first object to compare - * - * @return 0 if objects are equal - */ - -int -heim_cmp(heim_object_t a, heim_object_t b) -{ - heim_tid_t ta, tb; - heim_type_t isa; - - ta = heim_get_tid(a); - tb = heim_get_tid(b); - - if (ta != tb) - return ta - tb; - - isa = _heim_get_isa(a); - - if (isa->cmp) - return isa->cmp(a, b); - - return (uintptr_t)a - (uintptr_t)b; -} - -/* - * Private - allocates an memory object - */ - -static void -memory_dealloc(void *ptr) -{ - struct heim_base_mem *p = (struct heim_base_mem *)PTR2BASE(ptr); - if (p->dealloc) - p->dealloc(ptr); -} - -struct heim_type_data memory_object = { - HEIM_TID_MEMORY, - "memory-object", - NULL, - memory_dealloc, - NULL, - NULL, - NULL -}; - -void * -heim_alloc(size_t size, const char *name, heim_type_dealloc dealloc) -{ - /* XXX use posix_memalign */ - - struct heim_base_mem *p = calloc(1, size + sizeof(*p)); - if (p == NULL) - return NULL; - p->isa = &memory_object; - p->ref_cnt = 1; - p->name = name; - p->dealloc = dealloc; - return BASE2PTR(p); -} - -heim_type_t -_heim_create_type(const char *name, - heim_type_init init, - heim_type_dealloc dealloc, - heim_type_copy copy, - heim_type_cmp cmp, - heim_type_hash hash) -{ - heim_type_t type; - - type = calloc(1, sizeof(*type)); - if (type == NULL) - return NULL; - - type->tid = heim_base_atomic_inc(&tidglobal); - type->name = name; - type->init = init; - type->dealloc = dealloc; - type->copy = copy; - type->cmp = cmp; - type->hash = hash; - - return type; -} - -heim_object_t -_heim_alloc_object(heim_type_t type, size_t size) -{ - /* XXX should use posix_memalign */ - struct heim_base *p = calloc(1, size + sizeof(*p)); - if (p == NULL) - return NULL; - p->isa = type; - p->ref_cnt = 1; - - return BASE2PTR(p); -} - -heim_tid_t -_heim_type_get_tid(heim_type_t type) -{ - return type->tid; -} - -/** - * Call func once and only once - * - * @param once pointer to a heim_base_once_t - * @param ctx context passed to func - * @param func function to be called - */ - -void -heim_base_once_f(heim_base_once_t *once, void *ctx, void (*func)(void *)) -{ -#ifdef HAVE_DISPATCH_DISPATCH_H - dispatch_once_f(once, ctx, func); -#else - static HEIMDAL_MUTEX mutex = HEIMDAL_MUTEX_INITIALIZER; - HEIMDAL_MUTEX_lock(&mutex); - if (*once == 0) { - *once = 1; - HEIMDAL_MUTEX_unlock(&mutex); - func(ctx); - HEIMDAL_MUTEX_lock(&mutex); - *once = 2; - HEIMDAL_MUTEX_unlock(&mutex); - } else if (*once == 2) { - HEIMDAL_MUTEX_unlock(&mutex); - } else { - HEIMDAL_MUTEX_unlock(&mutex); - while (1) { - struct timeval tv = { 0, 1000 }; - select(0, NULL, NULL, NULL, &tv); - HEIMDAL_MUTEX_lock(&mutex); - if (*once == 2) - break; - HEIMDAL_MUTEX_unlock(&mutex); - } - HEIMDAL_MUTEX_unlock(&mutex); - } -#endif -} - -/** - * Abort and log the failure (using syslog) - */ - -void -heim_abort(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - heim_abortv(fmt, ap); - va_end(ap); -} - -/** - * Abort and log the failure (using syslog) - */ - -void -heim_abortv(const char *fmt, va_list ap) -{ - static char str[1024]; - - vsnprintf(str, sizeof(str), fmt, ap); - syslog(LOG_ERR, "heim_abort: %s", str); - abort(); -} - -/* - * - */ - -static int ar_created = 0; -static HEIMDAL_thread_key ar_key; - -struct ar_tls { - struct heim_auto_release *head; - struct heim_auto_release *current; - HEIMDAL_MUTEX tls_mutex; -}; - -static void -ar_tls_delete(void *ptr) -{ - struct ar_tls *tls = ptr; - if (tls->head) - heim_release(tls->head); - free(tls); -} - -static void -init_ar_tls(void *ptr) -{ - int ret; - HEIMDAL_key_create(&ar_key, ar_tls_delete, ret); - if (ret == 0) - ar_created = 1; -} - -static struct ar_tls * -autorel_tls(void) -{ - static heim_base_once_t once = HEIM_BASE_ONCE_INIT; - struct ar_tls *arp; - int ret; - - heim_base_once_f(&once, NULL, init_ar_tls); - if (!ar_created) - return NULL; - - arp = HEIMDAL_getspecific(ar_key); - if (arp == NULL) { - - arp = calloc(1, sizeof(*arp)); - if (arp == NULL) - return NULL; - HEIMDAL_setspecific(ar_key, arp, ret); - if (ret) { - free(arp); - return NULL; - } - } - return arp; - -} - -static void -autorel_dealloc(void *ptr) -{ - heim_auto_release_t ar = ptr; - struct ar_tls *tls; - - tls = autorel_tls(); - if (tls == NULL) - heim_abort("autorelease pool released on thread w/o autorelease inited"); - - heim_auto_release_drain(ar); - - if (!HEIM_TAILQ_EMPTY(&ar->pool)) - heim_abort("pool not empty after draining"); - - HEIMDAL_MUTEX_lock(&tls->tls_mutex); - if (tls->current != ptr) - heim_abort("autorelease not releaseing top pool"); - - if (tls->current != tls->head) - tls->current = ar->parent; - HEIMDAL_MUTEX_unlock(&tls->tls_mutex); -} - -static int -autorel_cmp(void *a, void *b) -{ - return (a == b); -} - -static unsigned long -autorel_hash(void *ptr) -{ - return (unsigned long)ptr; -} - - -static struct heim_type_data _heim_autorel_object = { - HEIM_TID_AUTORELEASE, - "autorelease-pool", - NULL, - autorel_dealloc, - NULL, - autorel_cmp, - autorel_hash -}; - -/** - * - */ - -heim_auto_release_t -heim_auto_release_create(void) -{ - struct ar_tls *tls = autorel_tls(); - heim_auto_release_t ar; - - if (tls == NULL) - heim_abort("Failed to create/get autorelease head"); - - ar = _heim_alloc_object(&_heim_autorel_object, sizeof(struct heim_auto_release)); - if (ar) { - HEIMDAL_MUTEX_lock(&tls->tls_mutex); - if (tls->head == NULL) - tls->head = ar; - ar->parent = tls->current; - tls->current = ar; - HEIMDAL_MUTEX_unlock(&tls->tls_mutex); - } - - return ar; -} - -/** - * Mark the current object as a - */ - -void -heim_auto_release(heim_object_t ptr) -{ - struct heim_base *p = PTR2BASE(ptr); - struct ar_tls *tls = autorel_tls(); - heim_auto_release_t ar; - - if (ptr == NULL || heim_base_is_tagged(ptr)) - return; - - /* drop from old pool */ - if ((ar = p->autorelpool) != NULL) { - HEIMDAL_MUTEX_lock(&ar->pool_mutex); - HEIM_TAILQ_REMOVE(&ar->pool, p, autorel); - p->autorelpool = NULL; - HEIMDAL_MUTEX_unlock(&ar->pool_mutex); - } - - if (tls == NULL || (ar = tls->current) == NULL) - heim_abort("no auto relase pool in place, would leak"); - - HEIMDAL_MUTEX_lock(&ar->pool_mutex); - HEIM_TAILQ_INSERT_HEAD(&ar->pool, p, autorel); - p->autorelpool = ar; - HEIMDAL_MUTEX_unlock(&ar->pool_mutex); -} - -/** - * - */ - -void -heim_auto_release_drain(heim_auto_release_t autorel) -{ - heim_object_t obj; - - /* release all elements on the tail queue */ - - HEIMDAL_MUTEX_lock(&autorel->pool_mutex); - while(!HEIM_TAILQ_EMPTY(&autorel->pool)) { - obj = HEIM_TAILQ_FIRST(&autorel->pool); - HEIMDAL_MUTEX_unlock(&autorel->pool_mutex); - heim_release(BASE2PTR(obj)); - HEIMDAL_MUTEX_lock(&autorel->pool_mutex); - } - HEIMDAL_MUTEX_unlock(&autorel->pool_mutex); -} diff --git a/crypto/heimdal/base/heimbasepriv.h b/crypto/heimdal/base/heimbasepriv.h deleted file mode 100644 --- a/crypto/heimdal/base/heimbasepriv.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -typedef void (*heim_type_init)(void *); -typedef heim_object_t (*heim_type_copy)(void *); -typedef int (*heim_type_cmp)(void *, void *); -typedef unsigned long (*heim_type_hash)(void *); - -typedef struct heim_type_data *heim_type_t; - -enum { - HEIM_TID_NUMBER = 0, - HEIM_TID_NULL = 1, - HEIM_TID_BOOL = 2, - HEIM_TID_TAGGED_UNUSED2 = 3, - HEIM_TID_TAGGED_UNUSED3 = 4, - HEIM_TID_TAGGED_UNUSED4 = 5, - HEIM_TID_TAGGED_UNUSED5 = 6, - HEIM_TID_TAGGED_UNUSED6 = 7, - HEIM_TID_MEMORY = 128, - HEIM_TID_ARRAY = 129, - HEIM_TID_DICT = 130, - HEIM_TID_STRING = 131, - HEIM_TID_AUTORELEASE = 132, - HEIM_TID_USER = 255 - -}; - -struct heim_type_data { - heim_tid_t tid; - const char *name; - heim_type_init init; - heim_type_dealloc dealloc; - heim_type_copy copy; - heim_type_cmp cmp; - heim_type_hash hash; -}; - -heim_type_t _heim_get_isa(heim_object_t); - -heim_type_t -_heim_create_type(const char *name, - heim_type_init init, - heim_type_dealloc dealloc, - heim_type_copy copy, - heim_type_cmp cmp, - heim_type_hash hash); - -heim_object_t -_heim_alloc_object(heim_type_t type, size_t size); - -heim_tid_t -_heim_type_get_tid(heim_type_t type); - -/* tagged tid */ -extern struct heim_type_data _heim_null_object; -extern struct heim_type_data _heim_bool_object; -extern struct heim_type_data _heim_number_object; -extern struct heim_type_data _heim_string_object; diff --git a/crypto/heimdal/base/null.c b/crypto/heimdal/base/null.c deleted file mode 100644 --- a/crypto/heimdal/base/null.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "baselocl.h" - -struct heim_type_data _heim_null_object = { - HEIM_TID_NULL, - "null-object", - NULL, - NULL, - NULL, - NULL, - NULL -}; - -heim_null_t -heim_null_create(void) -{ - return heim_base_make_tagged_object(0, HEIM_TID_NULL); -} diff --git a/crypto/heimdal/base/number.c b/crypto/heimdal/base/number.c deleted file mode 100644 --- a/crypto/heimdal/base/number.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "baselocl.h" - -static void -number_dealloc(void *ptr) -{ -} - -static int -number_cmp(void *a, void *b) -{ - int na, nb; - - if (heim_base_is_tagged_object(a)) - na = heim_base_tagged_object_value(a); - else - na = *(int *)a; - - if (heim_base_is_tagged_object(b)) - nb = heim_base_tagged_object_value(b); - else - nb = *(int *)b; - - return na - nb; -} - -static unsigned long -number_hash(void *ptr) -{ - if (heim_base_is_tagged_object(ptr)) - return heim_base_tagged_object_value(ptr); - return (unsigned long)*(int *)ptr; -} - -struct heim_type_data _heim_number_object = { - HEIM_TID_NUMBER, - "number-object", - NULL, - number_dealloc, - NULL, - number_cmp, - number_hash -}; - -/** - * Create a number object - * - * @param the number to contain in the object - * - * @return a number object - */ - -heim_number_t -heim_number_create(int number) -{ - heim_number_t n; - - if (number < 0xffffff && number >= 0) - return heim_base_make_tagged_object(number, HEIM_TID_NUMBER); - - n = _heim_alloc_object(&_heim_number_object, sizeof(int)); - if (n) - *((int *)n) = number; - return n; -} - -/** - * Return the type ID of number objects - * - * @return type id of number objects - */ - -heim_tid_t -heim_number_get_type_id(void) -{ - return HEIM_TID_NUMBER; -} - -/** - * Get the int value of the content - * - * @param number the number object to get the value from - * - * @return an int - */ - -int -heim_number_get_int(heim_number_t number) -{ - if (heim_base_is_tagged_object(number)) - return heim_base_tagged_object_value(number); - return *(int *)number; -} diff --git a/crypto/heimdal/base/string.c b/crypto/heimdal/base/string.c deleted file mode 100644 --- a/crypto/heimdal/base/string.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "baselocl.h" -#include - -static void -string_dealloc(void *ptr) -{ -} - -static int -string_cmp(void *a, void *b) -{ - return strcmp(a, b); -} - -static unsigned long -string_hash(void *ptr) -{ - const char *s = ptr; - unsigned long n; - - for (n = 0; *s; ++s) - n += *s; - return n; -} - -struct heim_type_data _heim_string_object = { - HEIM_TID_STRING, - "string-object", - NULL, - string_dealloc, - NULL, - string_cmp, - string_hash -}; - -/** - * Create a string object - * - * @param string the string to create, must be an utf8 string - * - * @return string object - */ - -heim_string_t -heim_string_create(const char *string) -{ - size_t len = strlen(string); - heim_string_t s; - - s = _heim_alloc_object(&_heim_string_object, len + 1); - if (s) - memcpy(s, string, len + 1); - return s; -} - -/** - * Return the type ID of string objects - * - * @return type id of string objects - */ - -heim_tid_t -heim_string_get_type_id(void) -{ - return HEIM_TID_STRING; -} - -/** - * Get the string value of the content. - * - * @param string the string object to get the value from - * - * @return a utf8 string - */ - -const char * -heim_string_get_utf8(heim_string_t string) -{ - return (const char *)string; -} diff --git a/crypto/heimdal/base/test_base.c b/crypto/heimdal/base/test_base.c deleted file mode 100644 --- a/crypto/heimdal/base/test_base.c +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Portions Copyright (c) 2010 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include -#include - -#include "heimbase.h" -#include "heimbasepriv.h" - -static void -memory_free(heim_object_t obj) -{ -} - -static int -test_memory(void) -{ - void *ptr; - - ptr = heim_alloc(10, "memory", memory_free); - - heim_retain(ptr); - heim_release(ptr); - - heim_retain(ptr); - heim_release(ptr); - - heim_release(ptr); - - ptr = heim_alloc(10, "memory", NULL); - heim_release(ptr); - - return 0; -} - -static int -test_dict(void) -{ - heim_dict_t dict; - heim_number_t a1 = heim_number_create(1); - heim_string_t a2 = heim_string_create("hejsan"); - heim_number_t a3 = heim_number_create(3); - heim_string_t a4 = heim_string_create("foosan"); - - dict = heim_dict_create(10); - - heim_dict_add_value(dict, a1, a2); - heim_dict_add_value(dict, a3, a4); - - heim_dict_delete_key(dict, a3); - heim_dict_delete_key(dict, a1); - - heim_release(a1); - heim_release(a2); - heim_release(a3); - heim_release(a4); - - heim_release(dict); - - return 0; -} - -static int -test_auto_release(void) -{ - heim_auto_release_t ar1, ar2; - heim_number_t n1; - heim_string_t s1; - - ar1 = heim_auto_release_create(); - - s1 = heim_string_create("hejsan"); - heim_auto_release(s1); - - n1 = heim_number_create(1); - heim_auto_release(n1); - - ar2 = heim_auto_release_create(); - - n1 = heim_number_create(1); - heim_auto_release(n1); - - heim_release(ar2); - heim_release(ar1); - - return 0; -} - -static int -test_string(void) -{ - heim_string_t s1, s2; - const char *string = "hejsan"; - - s1 = heim_string_create(string); - s2 = heim_string_create(string); - - if (heim_cmp(s1, s2) != 0) { - printf("the same string is not the same\n"); - exit(1); - } - - heim_release(s1); - heim_release(s2); - - return 0; -} - -int -main(int argc, char **argv) -{ - int res = 0; - - res |= test_memory(); - res |= test_dict(); - res |= test_auto_release(); - res |= test_string(); - - return res; -} diff --git a/crypto/heimdal/base/version-script.map b/crypto/heimdal/base/version-script.map deleted file mode 100644 --- a/crypto/heimdal/base/version-script.map +++ /dev/null @@ -1,28 +0,0 @@ -HEIMDAL_BASE_1.0 { - global: - heim_abort; - heim_alloc; - heim_array_append_value; - heim_array_copy_value; - heim_array_create; - heim_array_delete_value; - heim_array_get_length; - heim_array_iterate_f; - heim_auto_release; - heim_auto_release_create; - heim_auto_release_drain; - heim_base_once_f; - heim_cmp; - heim_dict_add_value; - heim_dict_copy_value; - heim_dict_create; - heim_dict_delete_key; - heim_dict_iterate_f; - heim_release; - heim_retain; - heim_string_create; - heim_string_get_utf8; - heim_number_create; - local: - *; -}; diff --git a/crypto/heimdal/cf/ChangeLog b/crypto/heimdal/cf/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/ChangeLog @@ -0,0 +1,1295 @@ +2008-07-26 Love Hörnquist Åstrand + + * krb-ipv6.m4: Patch from Björn Schlögl to enable disable-ness of + ipv6. + +2008-05-20 Love Hörnquist Åstrand + + * sunos.m4: Detect solaris2.11 and later and assume its sunos=58. + Bug report from Klas Heggemann. + +2008-05-05 Love Hörnquist Åstrand + + * version-script.m4: Add -rpath to avoid building a convince + library, also sprinkle some other options to make the link line + more like automake's. + +2008-04-29 Love Hörnquist Åstrand + + * version-script.m4: use libtool to probe for version script to + make it work on amd64/ia64 where -fpic in needed to build shared + objects. + +2008-04-24 Björn Sandell + + * pthreads.m4: macros for OpenBSD + +2008-04-17 Love Hörnquist Åstrand + + * make-proto.pl: Define both export variables. + + * win32.m4: Export _FUNCTION and _VARIABLE for _win32 magic + + * krb-ipv6.m4: Rename cache variable to AC_CACHE_CHECK to make the + cached. + + * win32.m4: replace _export with __declspec(dllexport) + + * make-proto.pl: Add __declspec(dllimport) to the exported + functions. + +2008-04-07 Love Hörnquist Åstrand + + * wflags.m4: Add -Wstrict-overflow=5 as an example. + +2008-03-25 Love Hörnquist Åstrand + + * install-catman.sh: Match man_MANS = files with directories in + them. + +2008-02-23 Love Hörnquist Åstrand + + * make-proto.pl: Handle c-comments. + + * Makefile.am.common: Make DEFAULT_INCLUDES work better, avoid + picking up the wrong headerfiles. $(top_builddir)/include vs + ${builddir}. + +2008-01-21 Love Hörnquist Åstrand + + * Makefile.am.common: remove the check-symbols check + + * check-symbols.sh: removed, use version script instead + +2007-10-01 Love Hörnquist Åstrand + + * crypto.m4: openssl might require -ldl too, so lets check that. + +2007-07-31 Love Hörnquist Åstrand + + * Makefile.am.common (check-local::): exit on failure to perform + test. + +2007-07-28 Love Hörnquist Åstrand + + * Makefile.am.common (check-local): also check that --help works. + +2007-07-17 Love Hörnquist Åstrand + + * crypto.m4: depend on EVP_CIPHER_iv_length + +2007-06-27 Love Hörnquist Åstrand + + * Makefile.am.common: Need absolute reference to the top source + directory and top build directory. + +2007-06-20 Love Hörnquist Åstrand + + * wflags.m4: Add --enable-developer and make it cause -Werror to + be included. + +2007-06-18 Love Hörnquist Åstrand + + * Makefile.am.common: Merge from samba config. + + * Makefile.am.common (makedir-in-tree): depend on INFO_DEPS. + + * valgrind-suppressions: Unknown suppression in runtime link + editor + +2007-06-08 Love Hörnquist Åstrand + + * Makefile.am.common: Add heimdal-lorikeet target distdir-in-tree + +2007-06-04 Love Hörnquist Åstrand + + * framework-security.m4: test for -framework Security + +2007-05-10 Love Hörnquist Åstrand + + * roken-frag.m4: we have a fnmatch.h only if there is a working + implementation and a header file. If we do use roken, lets use our + own headerfile that does symbol renaming. + +2007-04-19 Love Hörnquist Åstrand + + * version-script.m4: check if ld supports --version-script + +2007-04-11 Love Hörnquist Åstrand + + * roken-frag.m4: drop broken-getnameinfo.m4 + + * roken-frag.m4: drop test for broken getnameinfo, that old aix is + no longer relevant. + +2007-02-16 Love Hörnquist Åstrand + + * install-catman.sh: Stop overwriting cmd. + +2007-01-15 Love Hörnquist Åstrand + + * install-catman.sh: Use test instead of [. + + * install-catman.sh: Use = instead of ==, make solaris more happy. + +2007-01-08 Love Hörnquist Åstrand + + * roken-frag.m4: More headerfiles for iruserok prototype check. + + * check-symbols.sh: Add fc_softc for AIX as ignore syms. + +2007-01-04 Love Hörnquist Åstrand + + * roken-frag.m4: Check if iruserok needs a prototype. + +2006-12-06 Love Hörnquist Åstrand + + * check-compile-et.m4: set automake symbol COM_ERR when we build + local com_err + +2006-11-16 Love Hörnquist Åstrand + + * valgrind-suppressions: We shouldn't be running /bin/ls under + valgrind, but for now, at least make it easier to see any other + warnings. From Andrew Bartlett. + +2006-10-22 Love Hörnquist Åstrand + + * Makefile.am.common: Add target for valgrind debugging + + * valgrind-suppressions: valgrind suppressions + +2006-10-21 Love Hörnquist Åstrand + + * check-lex.m4: Borrow test for autoconf cvs to help hpux hosts + +2006-10-20 Love Hörnquist Åstrand + + * Makefile.am.common: provide uninstall hook for cat/manpages. + + * install-catman.sh: provide uninstall command + +2006-10-19 Love Hörnquist Åstrand + + * roken-frag.m4: Add check for timegm. + + * roken-frag.m4: Include sys/types.h for sys/socket.h and netdb.h. + +2006-10-07 Love Hörnquist Åstrand + + * Makefile.am.common (install-build-headers): make this function + convoluted and deal with dist_, nodist, nobase and all its + friends. + + * have-struct-field.m4: memset the structure to make sure that we + don't get compiler warnings. + + * crypto.m4: OpenSSL_add_all_algorithms is not a openssl specific + requirement, hcrypto need to have to too. + + * crypto.m4: Require openssl have OpenSSL_add_all_algorithms + +2006-10-04 Love Hörnquist Åstrand + + * autobuild.m4: Add autobuild, GPLed, but free to use in projects + not avaible under GPL or LGPL (just like autoconf). + +2006-09-16 Love Hörnquist Åstrand + + * roken-frag.m4: Add samba_SOCKET_WRAPPER fragment + +2006-09-12 Love Hörnquist Åstrand + + * socket-wrapper.m4: Add socket-wrapper test + +2006-05-06 Love Hörnquist Åstrand + + * crypto.m4: Move up evp.h to please OpenSSL, from Douglas + E. Engert. + +2006-04-22 Love Hörnquist Åstrand + + * roken-frag.m4: Add check for fnmatch.h, its needed to be done + for the automake conditional below. + +2006-04-15 Love Hörnquist Åstrand + + * crypto.m4: Require SHA256 + +2006-01-18 Love Hörnquist Åstrand + + * crypto.m4 Check for if we are to consider + using OpenSSL, also check for headers since + make_crypto.c assumes that the name of the files. + +2006-01-13 Love Hörnquist Åstrand + + * crypto.m4: libdes is renamed to hcrypto + + * crypto.m4: Remove support for old hash names. + +2005-10-26 Love Hörnquist Åstrand + + * install-catman.sh: Add variable INSTALL_CATPAGES that controls + if cat pages are installed, defaults to true. From Johnny Lam + . + +2005-09-28 Love Hörnquist Åstrand + + * roken-frag.m4: Check for and uintptr_t + +2005-09-02 Love Hörnquist Åstrand + + * roken-frag.m4: Resolver check moved to rk_RESOLV, from Andrew + Bartlet + + * resolv.m4: Resolver checks, broken out so samba can use it From + Andrew Bartlet + +2005-08-22 Love Hörnquist Åstrand + + * roken-frag.m4: Check for res_ndestroy. + +2005-08-03 Love Hörnquist Åstrand + + * crypto.m4: Add , OpenSSL 0.9.8 needs it for size_t. + From: Quanah Gibson-Mount + +2005-07-12 Love Hörnquist Åstrand + + * check-compile-et.m4: check that initialize_conf_error_table_r + have the right argument + +2005-07-07 Love Hörnquist Åstrand + + * check-symbols.sh: allow symbols to start with ., aix uses this + +2005-06-16 Love Hörnquist Åstrand + + * krb-bigendian.m4: use ansi c prototypes + + * krb-func-getcwd-broken.m4: use ansi c prototypes + + * broken-snprintf.m4: use ansi c prototypes + + * have-pragma-weak.m4: use ansi c declarations + + * check-getpwnam_r-posix.m4: use ansi c declarations + + * broken-realloc.m4: use ansi c declarations + + * check-compile-et.m4: use ansi c declarations + + * dlopen.m4: add headers and argument to dlopen + + * c-function.m4: use ansi c declarations + + * check-var.m4: use ansi c declarations + + * pthreads.m4: disable threads on aix because of utmp/utmpx + problems + + * broken-getaddrinfo.m4: check for brokenness in getaddrinfo on + AIX that can't handle "0" as port number. + +2005-06-11 Love Hörnquist Åstrand + + * db.m4: Add an option to disable ndbm, from Stefan Metzmacher + + +2005-06-03 Love Hörnquist Åstrand + + * pthreads.m4: rework how pthreads support to turned on/off, + always run though the switch to figure out what the + linker/compiler flag are + +2005-06-01 Love Hörnquist Åstrand + + * pthreads.m4: s/else if/elif/ + + * check-symbols.sh: AIX have a diffrent nm, use -B to get bsd like + output + + * pthreads.m4: aix case: assume gcc handles -pthread, in the + non-gcc case, use the compiler as hint (xlc vs xlc_r) if this + environment handles threads or not + +2005-05-22 Love Hörnquist Åstrand + + * check-symbols.sh: ignore weak symbols too + +2005-05-19 David Love + + * check-getpwnam_r-posix.m4: define _POSIX_PTHREAD_SEMANTICS to + make solaris provide the right getpwname_r + +2005-05-17 Johan Danielsson + + * roken-frag.m4: am_conditional have_cgetent + +2005-05-10 David Love + + * roken-frag.m4: Get daemon declared on Solaris (it's in unistd.h + but masked by a feature test), just to avoid a warning, since it + has int args. + +2005-05-11 Love Hörnquist Åstrand + + * check-var.m4: AC_CHECK_DECL and AC_CHECK_DECLS have a subtile + diffrence, the later defines HAVE_ cpp symbols, the first doesn't. + +2005-05-05 Love Hörnquist Åstrand + + * check-symbols.sh: ignore N symbols too + +2005-04-30 Love Hörnquist Åstrand + + * broken-snprintf.m4: include checking if snprintf(NULL, 0, "") + works + + * check-compile-et.m4: require compile_et to generate a + initialize_FOO_error_table_r (they are used in libkrb5), and + always check for initialize_error_table_r + +2005-04-29 Love Hörnquist Åstrand + + * Makefile.am.common: add LIB_com_err + +2005-04-29 David Love + + * roken-frag.m4: Check for correct vis.h. + +2005-04-28 David Love + + * pthreads.m4: Set PTHREADS_LIBS on Irix. + +2005-04-27 Love Hörnquist Åstrand + + * broken-realloc.m4: use rk_realloc if realloc is broken, this + makes "host-tools" not beeing able to use realloc + + * pthreads.m4: Add support for Solaris, Irix, and modern + Linux. From David Love + +2005-04-25 Love Hörnquist Åstrand + + * check-symbols.sh: limit the units functions to + asn1_[A-Za-z0-9]*_units$ + +2005-04-20 Love Hörnquist Åstrand + + * check-symbols.sh: this lib include com_err, add -com_err to + CHECK_SYMBOLS + + * check-symbols.sh: print the type so I don't need to ask for it + +2005-04-18 Love Hörnquist Åstrand + + * check-symbols.sh: ignore filename symbols + +2005-04-04 Love Hörnquist Åstrand + + * check-symbols.sh: assume symbols prefixed with _ is a sideeffekt + of the local linker and also just fine + +2005-03-16 Love Hörnquist Åstrand + + * roken-frag.m4: include for + +2005-03-01 Love Hörnquist Åstrand + + * sunos.m4: Match solaris 10. From: Joakim Fallsjo + + +2004-12-29 Love + + * check-symbols.sh: add -asn1compile symbols + +2004-12-29 Love Hörnquist Åstrand + + * check-symbols.sh: add exported symbols test + + * Makefile.am.common: add CHECK_SYMBOLS tests, so that we don't + export to much stuff + +2004-09-03 Love Hörnquist Åstrand + + * make-proto.pl: add cpluscplus extern "C" support + +2004-07-09 Love Hörnquist Åstrand + + * pthreads.m4: add -pthread to LIBS since libtool doesn't preserve + it for us when adding is as a dependency on libs + +2004-04-24 Johan Danielsson + + * largefile.m4: like AC_SYS_LARGEFILE, but also add to CPPFLAGS + +2004-04-14 Love Hörnquist Åstrand + + * check-compile-et.m4: even more evil stuff for cross-compiling + + * check-x.m4: use AC_RUN_IFELSE so we can handle cross compiling + + * check-compile-et.m4: use AC_RUN_IFELSE so we can handle cross + compiling + +2004-04-13 Love Hörnquist Åstrand + + * make-proto.pl: if -E, add windows standard calling conv to + headerfile if needed + + * win32.m4: add rk_WIN32_EXPORT + +2004-02-12 Love Hörnquist Åstrand + + * configure.in: rename AC_WFLAGS to rk_WFLAGS + + * *.m4: overquote to pacify automake1.8 + +2004-02-11 Love Hörnquist Åstrand + + * roken-frag.m4: resolv.h is even more special + + * roken-frag.m4: AC_CHECK_HEADERS(net/if.h netinet6/in6_var.h + sys/sysctl.h sys/proc.h, resolv.h) are all special and need extra + help + + * test-package.m4: If there is a --with-PACKAGE=path but no + --with-PACKAGE-config, go seach for path/PACKEGE-config and use it + if it exists. Inspired by Harald Barth + +2003-09-03 Love Hörnquist Åstrand + + * crypto.m4: check for DES_, AES_, and if openssl UI_ + +2003-08-27 Johan Danielsson + + * vararray.m4: test for variable-length arrays + + * roken-frag.m4: test for poll and poll.h + +2003-08-16 Love Hörnquist Åstrand + + * Makefile.am.common: don't try doing local checks if CHECK_LOCAL + is set to no-check-local + +2003-08-01 Love Hörnquist Åstrand + + * check-compile-et.m4: check if compile_et support ``error_table N + M'' also, don't be overly aggressivly reset CFLAGS + +2003-07-22 Love Hörnquist Åstrand + + * pthreads.m4: pthread test + +2003-05-08 Johan Danielsson + + * Makefile.am.common: change install-data-local to + install-data-hook + +2003-05-05 Assar Westerlund + + * crypto.m4: define OPENSSL_DES_LIBDES_COMPATIBILITY + +2003-04-03 Love Hörnquist Åstrand + + * crypto.m4: check if libcrypto needs -lnsl or -lsocket + +2003-04-02 Love Hörnquist Åstrand + + * crypto.m4: in the case where se don't link with kerberos 4, use + ${with_openssl_include} if its are set (not + ${with_openssl}/include) same for with_openssl_lib + +2003-03-18 Love Hörnquist Åstrand + + * Makefile.am.common: always define LIB_kafs + +2003-03-12 Love Hörnquist Åstrand + + * check-compile-et.m4: check if the output of compile_et needs + initialize_error_table_r + +2003-02-17 Love Hörnquist Åstrand + + * check-var.m4: add a check if the variable is avaible when we + include the headerfiles + +2002-12-18 Johan Danielsson + + * roken-frag.m4: res_nsearch takes 6 parameters; spotted by Howard + Chu + +2002-10-25 Johan Danielsson + + * crypto.m4: do a better job at matching headers to libraries + +2002-10-16 Johan Danielsson + + * sunos.m4: more quoting + +2002-09-19 Johan Danielsson + + * make-proto.pl: check the processed string for closing ), not the + source + +2002-09-10 Johan Danielsson + + * crypto.m4: use m4 macros for test cases, also test for older + hash names + + * test-package.m4: include dep libraries in LIB_* + + * crypto.m4: move krb4 test before test for openssl, and bail out + if krb4 is requested, but the crypto library is not the same as + krb4 + + * db.m4: filter contents of LDFLAGS + +2002-09-09 Johan Danielsson + + * auth-modules.m4: rename to rk_AUTH_MODULES + + * auth-modules.m4: only include modules explicitly asked for + +2002-09-04 Johan Danielsson + + * roken-frag.m4: test for res_nsearch + +2002-09-03 Assar Westerlund + + * roken-frag.m4: check for sys/mman.h and mmap (used by + parse_reply-test) + +2002-08-28 Assar Westerlund + + * krb-readline.m4: also add LIB_tgetent in the case of editline + + * crypto.m4: define HAVE_OPENSSL even if we got to hear about it + by krb4 + +2002-08-28 Johan Danielsson + + * krb-readline.m4: add LIB_tgetent to LIB_readline if we have to + + * sunos.m4: various sunos tests + + * crypto.m4: try to extract the crypto compiler flags from + {INCLUDE,LIB}_krb4 + (XXX this is really horrible) + + * krb-readline.m4: don't add -rpath to LIB_readline (libtool + should to this for us), also don't append LIB_tgetent to + LIB_readline (TEST_PACKAGE should do this) + + * test-package.m4: add the possibility to use a *-config program + to get flags; rename to rk_TEST_PACKAGE while here + + * krb-bigendian.m4: move ENDIANESS_IN_SYS_PARAM_H tests here + + * aix.m4: rename to rk_AIX + + * telnet.m4: move telnet tests here + + * aix.m4: restructure this somewhat + + * dlopen.m4: test for dlopen suitable for AC_REQUIRE + + * irix.m4: move some stuff here and rename to irix.m4 + + * krb-sys-nextstep.m4: move SGTTY stuff to read_pwd.c + +2002-08-28 Jacques Vidrine + + * auth-modules.m4: do not build pam_krb4 on freebsd + +2002-08-26 Assar Westerlund + + * roken-frag.m4: test for the vis, strvis functions requiring + prototypes + +2002-08-23 Johan Danielsson + + * need-proto.m4: missing comma + +2002-08-22 Johan Danielsson + + * roken-frag.m4: some rototilling + + * need-proto.m4: use AS_TR_CPP + +2002-08-20 Johan Danielsson + + * roken-frag.m4: HAVE_TYPE instead of CHECK_TYPE ssize_t + + * krb-version.m4: use PACKAGE_TARNAME and PACKAGE_STRING + + * broken-getaddrinfo.m4: can't test for EAI_SERVICE here since AIX + is even more fsck:ed + + * roken-frag.m4: test for altzone + +2002-08-19 Johan Danielsson + + * Makefile.am.common: only define ROKEN_RENAME if do_roken_rename + +2002-08-13 Johan Danielsson + + * Makefile.am.common: add ROKEN_RENAME variable + +2002-08-12 Johan Danielsson + + * make-proto.pl: include to get va_list + + * destdirs.m4: also define localstatedir and sysconfdir + +2002-08-01 Johan Danielsson + + * crypto.m4: newer openssl seems to take the address of the + schedule parameter to des_cbc_encrypt, so we need to feed it a + variable, not just NULL (from Magnus Holmberg) + +2002-05-24 Johan Danielsson + + * misc.m4: change \100 back to @; some m4's (probably some regex) + doesn't like this as a replacement regexp; the reason it was once + changed to \100 was probably because of some autoconf bug at the + time + +2002-05-20 Johan Danielsson + + * broken2.m4 []-less is apparently the way to go + +2002-05-19 Johan Danielsson + + * otp.m4: check db_type instead of precence of dbm_firstkey + + * roken-frag.m4: don't AC_LIBOBJ more than one function at a time + + * find-if-not-broken.m4: s/AC_LIBOBJ/rk_LIBOBJ/ + + * broken2.m4: s/AC_LIBOBJ/rk_LIBOBJ/ + + * broken.m4: s/AC_LIBOBJ/rk_LIBOBJ/ + + * misc.m4: automake can't handle macros passed to AC_LIBOBJ, so + add an alias to it called rk_LIBOBJ; this requires that the + relevant source are manually included in roken/Makefile.am + + * aix.m4: ac_enable --diable-dynamic-afs + + * roken-frag.m4: use AC_LIBOBJ + + * krb-func-getcwd-broken.m4: use AC_LIBOBJ + + * find-if-not-broken.m4: use AC_LIBOBJ + + * broken2.m4: use AC_LIBOBJ + + * broken.m4: use AC_LIBOBJ + + * aix.m4: recognise aix5 + +2002-05-17 Johan Danielsson + + * crypto.m4: am-conditionalise HAVE_OPENSSL + + * db.m4: make it possible to run this twice + + * Makefile.am.common: also install nodist_include_HEADERS + +2002-05-16 Johan Danielsson + + * make-proto.pl: make it possible to redefine the "private" regexp + +2002-05-02 Johan Danielsson + + * db.m4: am_cond HAVE_* + +2002-04-30 Johan Danielsson + + * krb-ipv6.m4: use AC_HELP_STRING; fix logic bug in AC_MSG_RESULT + call + + * test-package.m4: use AC_HELP_STRING + + * roken.m4: use AC_HELP_STRING + + * osfc2.m4: use AC_HELP_STRING + + * mips-abi.m4: use AC_HELP_STRING + + * krb-bigendian.m4: use AC_HELP_STRING + + * db.m4: rework this somewhat; check for db3/4 in subdirs, change + --with to --enable; it should really be possible to point it to + some directory --with-berkeley-db=/foo + + * otp.m4: OTP test + +2002-04-25 Johan Danielsson + + * destdirs.m4: define BINDIR et al + +2002-04-18 Johan Danielsson + + * misc.m4: remove some stuff that is defined elsewhere + + * make-proto.pl: optionally remove __P and parameter names + +2001-11-30 Assar Westerlund + + * roken-frag.m4: move ipv6 tests after -lsocket (to handle Solaris + 8) + +2001-09-29 Assar Westerlund + + * install-catman.sh: handle man pages without SYNOPSIS but looking + for both SYNOPSIS and DESCRIPTION + +2001-09-18 Johan Danielsson + + * roken-frag.m4: include freeaddrinfo if using getaddrinfo + +2001-09-13 Assar Westerlund + + * db.m4: test for the ndbm database really being a .db one + and use it when moving/removing database files + +2001-09-03 Assar Westerlund + + * db.m4: prefer ndbm.h to dbm.h + * roken-frag.m4: check for atexit and on_exit + +2001-09-02 Assar Westerlund + + * check-compile-et.m4: only add /usr/include/et to CPPFLAGS if + it's actually used + +2001-09-01 Assar Westerlund + + * Makefile.am.common (AUTOMAKE_OPTIONS): set 1.4b here so that + users are warned if using earlier automake versions + + * find-func-no-libs2.m4: ignore "no" as a library - another + special case to make it easy to send the result from this macro + into another invocation + +2001-08-30 Assar Westerlund + + * db.m4: check for ndbm functions in db3 library too + +2001-08-29 Jacques Vidrine + + * check-compile-et.m4: Check for already-installed com_err. + * Makefile.am.common: Use the compile_et discovered at + configuration time. + +2001-08-29 Assar Westerlund + + * crypto.m4: use AC_WITH_ALL to allow separate specification of + include and lib + * with-all.m4: new macro for doing --with-foo, --with-foo-include, + and --with-foo-lib in a sensible way + + * find-func-no-libs2.m4: handle both -llib and lib in the second + argument also yes -> "" as a library, to ease callers that send in + results from this macro (this might be a little bit unclean) + +2001-08-28 Assar Westerlund + + * roken-frag.m4: test for issetugid + +2001-08-24 Assar Westerlund + + * Makefile.am.common: change one += to = to AM_CFLAGS to avoid an + error with recent automake + +2001-08-22 Assar Westerlund + + * crypto.m4: SHA1_CTX should be SHA_CTX + +2001-08-21 Assar Westerlund + + * roken-frag.m4: remove all winsock.h + for now, it does more harm than good under cygwin and if it should be + used, the correct conditional needs to be found + from + +2001-08-21 Johan Danielsson + + * check-var.m4: AC_TR_CPP -> AS_TR_CPP to make autoconf 2.52 happy + +2001-08-17 Johan Danielsson + + * krb-ipv6.m4: add test for non-existant in6addr_loopback in AIX + +2001-08-15 Johan Danielsson + + * roken-frag.m4: test for getaddrinfo's that doesn't like numeric + services + + * broken-getaddrinfo.m4: test for getaddrinfo's that doesn't like + numeric services + +2001-08-08 Assar Westerlund + + * db.m4: do a separate test for gdbm/ndbm.h and -lgdbm + +2001-08-05 Assar Westerlund + + * db.m4: ac_cv_funclib_\func can be yes + * db.m4: use AC_FIND_FUNC_NO_LIBS to test in libc + anset cache variables after first attempt at finding dbm_firstkey (how + should this be done?) + * db.m4: do not test for ndbm library when ndbm-db was found in libc + * db.m4: test for ndbm-compatability with db + * db.m4: add forgotten AC_SUBST + * db.m4: first steps towards a new db test + + * roken-frag.m4: remove header files checked by rk_db + +2001-08-05 Assar Westerlund + + * roken-frag.m4: remove header files checked by rk_db + +2001-06-24 Assar Westerlund + + * roken-frag.m4: make sure of building getaddrinfo et al if + missing + +2001-06-20 Johan Danielsson + + * install-catman.sh: try to install links to manpages + +2001-06-19 Assar Westerlund + + * broken-glob.m4: try to handle FreeBSD's GLOB_MAXPATH + +2001-06-18 Johan Danielsson + + * roken-frag.m4: test for getaddrinfo needs netdb.h on Tru64 + +2001-06-17 Assar Westerlund + + * roken-frag.m4 (AC_CHECK_HEADERS): test for random + * roken-frag.m4 (AC_CHECK_HEADERS): test for initstate and + setstate + + * roken-frag.m4 (AC_BROKEN): test for + emalloc,ecalloc,erealloc,estrdup + +2001-05-11 Johan Danielsson + + * roken-frag.m4: bswap{16,32} + +2001-03-26 Assar Westerlund + + * broken-glob.m4: also test for GLOB_LIMIT + * krb-ipv6.m4: restore CFLAGS if v6 is not detected + +2001-02-20 Assar Westerlund + + * roken-frag.m4: check for getprogname, setprogname + +2001-02-07 Assar Westerlund + + * Makefile.am.common (LIB_kdfs): set. use it. from Ake Sandgren + + +2000-12-26 Assar Westerlund + + * krb-ipv6.m4: remove some dnl that weren't the correct with + modern autoconf + +2000-12-15 Assar Westerlund + + * roken-frag.m4 (inet_ntoa, inet_ntop, inet_pton): add necessary + includes when testing + * broken2.m4: new variant of broken, with includes and arguments + + * test-package.m4: s/ifval/m4_ifval/ to keep in sync with + autoconf. from Ake Sandgren + * check-var.m4: s/ifval/m4_ifval/ to keep in sync with autoconf. + from Ake Sandgren + +2000-12-13 Assar Westerlund + + * krb-irix.m4: need to set irix to no first. From Ake Sandgren + + +2000-12-12 Johan Danielsson + + * roken-frag.m4: move sa_len test to before test for broken + getnameinfo + +2000-12-12 Assar Westerlund + + * roken-frag.m4: only test for broken getnameinfo if it exists + +2000-12-10 Johan Danielsson + + * roken-frag.m4: ifaddrs.h + +2000-12-06 Johan Danielsson + + * roken-frag.m4: test for unvis, and vis.h + + * roken-frag.m4: test for strvis* + +2000-12-05 Johan Danielsson + + * Makefile.am.common: just warn if we fail to setuid a program + + * broken-getnameinfo.m4: add more quotes + + * roken-frag.m4: test for getifaddrs + + * roken-frag.m4: test for broken AIX getnameinfo + + * broken-getnameinfo.m4: test for broken getnameinfo + +2000-12-01 Assar Westerlund + + * Makefile.am.common: add kludge for LIBS + +2000-11-30 Johan Danielsson + + * check-man.m4: update this after recent changes + + * Makefile.am.common: use install-catman.sh + + * install-catman.sh: script to install preformatted manual pages + + * Makefile.am.common: change cat handling + +2000-11-29 Johan Danielsson + + * roken-frag.m4: don't use AC_CONFIG_FILES here, since it doesn't + work with automake + +2000-11-15 Assar Westerlund + + * krb-readline.m4: link against the libtool-versions of + libeditline and libel_compat + + * Makefile.am.common (INCLUDES): add $(INCLUDES_roken) + * roken-frag.m4 (CPPFLAGS_roken): rename to INCLUDES_roken + +2000-11-05 Johan Danielsson + + * aix.m4: set aix + +2000-08-19 Assar Westerlund + + * krb-bigendian.m4: merge from arla: make it work better + +2000-08-07 Johan Danielsson + + * roken-frag.m4: check getsockname for proto compat + +2000-08-04 Johan Danielsson + + * Makefile.am.common: add library for pidfile + + * roken-frag.m4: tests for util.h and pidfile + +2000-07-19 Johan Danielsson + + * check-var.m4: rename to rk_CHECK_VAR, transposing the arguments, + and making the second optional, AU_DEFINE AC_CHECK_VAR to + rk_CHECK_VAR + + * roken-frag.m4: other roken tests + + * db.m4: db tests + +2000-07-18 Johan Danielsson + + * mips-abi.m4: AC_ERROR -> AC_MSG_ERROR + + * check-netinet-ip-and-tcp.m4: use cache_check, and make this work + with new autoconf + + * aix.m4: don't subst AFS_EXTRA_LD + +2000-07-15 Johan Danielsson + + * check-var.m4: workaround feature of newer autoconf + + * find-func-no-libs2.m4: use cleaner autoheader trick + + * have-type.m4: use cleaner autoheader trick + + * have-types.m4: use cleaner autoheader trick + + * test-package.m4: add 6th parameter for now + + * broken.m4: use cleaner autoheader trick + + * retsigtype.m4: test for signal handler return type + + * broken-realloc.m4: test for broken realloc + +2000-07-08 Assar Westerlund + + * roken.m4: set CPPFLAGS_roken and call AC_CONFIG_SUBDIRS + +2000-07-02 Assar Westerlund + + * Makefile.am.common (CP): set and use + +2000-04-05 Assar Westerlund + + * Makefile.am.common (INCLUDE_openldap, LIB_openldap): add + +2000-03-28 Assar Westerlund + + * krb-prog-yacc.m4: AC_MSG_WARNING should be AC_MSG_WARN + + * shared-libs.m4: try to update to freebsd5 (and elf) + +2000-03-16 Assar Westerlund + + * krb-prog-yacc.m4: warn we do not find any yacc + +2000-01-08 Assar Westerlund + + * krb-bigendian.m4: new file, replacement for ac_c_bigendian + +2000-01-01 Assar Westerlund + + * krb-ipv6.m4: re-organize: test for type of stack first so that + we can find the libraries that we might have to link the test + program against. not linking the test program means we don't know + if the right stuff is in the libraries. also cosmetic changes to + make sure we print the checking for... nicely + +1999-12-21 Assar Westerlund + + * krb-ipv6.m4: try linking, not only compiling + * krb-ipv6.m4: add --without-ipv6 make sure we have `in6addr_any' + which we use in the code. This test avoids false positives on + OpenBSD + +1999-11-29 Johan Danielsson + + * grok-type.m4: inttypes.h + +1999-11-05 Assar Westerlund + + * check-x.m4: include X_PRE_LIBS and X_EXTRA_LIBS when testing + +1999-11-01 Assar Westerlund + + * Makefile.am.common (install-build-headers): use `cp' instead of + INSTALL_DATA for copying header files inside the build tree. The + user might have redefined INSTALL_DATA to specify owners and other + information. + +1999-10-30 Assar Westerlund + + * find-func-no-libs2.m4: add yet another argument to allow specify + linker flags that will be added _before_ the library when trying + to link + + * find-func-no-libs.m4: add yet another argument to allow specify + linker flags that will be added _before_ the library when trying + to link + +1999-10-12 Assar Westerlund + + * find-func-no-libs2.m4 (AC_FIND_FUNC_NO_LIBS2): new argument + `extra libs' + + * find-func-no-libs.m4 (AC_FIND_FUNC_NO_LIBS): new argument `extra + libs' + +1999-09-01 Johan Danielsson + + * capabilities.m4: sgi capabilities + +1999-07-29 Assar Westerlund + + * have-struct-field.m4: quote macros when undefining + +1999-07-28 Assar Westerlund + + * Makefile.am.common (install-build-headers): add dependencies + +1999-07-24 Assar Westerlund + + * have-type.m4: try to get autoheader to co-operate + + * have-type.m4: stolen from Arla + + * krb-struct-sockaddr-sa-len.m4: not used any longer. removed. + +1999-06-13 Assar Westerlund + + * krb-struct-spwd.m4: consequent name of cache variables + + * krb-func-getlogin.m4: new file for testing for posix (broken) + getlogin + + * shared-libs.m4 (freebsd[34]): don't use ld -Bshareable + +1999-06-02 Johan Danielsson + + * check-x.m4: extended test for X + +1999-05-14 Assar Westerlund + + * check-netinet-ip-and-tcp.m4: proper autoheader tricks + + * check-netinet-ip-and-tcp.m4: new file for checking for + netinet/{ip,tcp}.h. These are special as they on Irix 6.5.3 + require to be included in advance. + + * check-xau.m4: we also need to check for XauFilename since it's + used by appl/kx. And on Irix 6.5 that function requires linking + with -lX11. + +1999-05-08 Assar Westerlund + + * krb-find-db.m4: try with more header files than ndbm.h + +1999-04-19 Assar Westerlund + + * test-package.m4: try to handle the case of --without-package + correctly + +1999-04-17 Assar Westerlund + + * make-aclocal: removed. Not used anymore, being replaced by + aclocal from automake. + +Thu Apr 15 14:17:26 1999 Johan Danielsson + + * make-proto.pl: handle __attribute__ + +Fri Apr 9 20:37:18 1999 Assar Westerlund + + * shared-libs.m4: quote $@ + (freebsd3): add install_symlink_command2 + +Wed Apr 7 20:40:22 1999 Assar Westerlund + + * shared-libs.m4 (hpux): no library dependencies + +Mon Apr 5 16:13:08 1999 Johan Danielsson + + * test-package.m4: compile and link, rather than looking for + files; also export more information, so it's possible to add rpath + information + +Tue Mar 30 13:49:54 1999 Johan Danielsson + + * Makefile.am.common: CFLAGS -> AM_CFLAGS + +Mon Mar 29 16:51:12 1999 Johan Danielsson + + * check-xau.m4: check for XauWriteAuth before checking for + XauReadAuth to catch -lX11:s not containing XauWriteAuth, and IRIX + 6.5 that doesn't work with -lXau + +Sat Mar 27 18:03:58 1999 Johan Danielsson + + * osfc2.m4: --enable-osfc2 + +Fri Mar 19 15:34:52 1999 Johan Danielsson + + * shared-libs.m4: move shared lib stuff here + +Wed Mar 24 23:24:51 1999 Assar Westerlund + + * Makefile.am.common (install-build-headers): simplify loop + +Tue Mar 23 17:31:23 1999 Johan Danielsson + + * check-getpwnam_r-posix.m4: check for getpwnam_r, and if it's + posix or not + +Tue Mar 23 00:00:13 1999 Assar Westerlund + + * Makefile.am.common (install_build_headers): try to make it work + better when list of headers is empty. handle make rewriting the + filenames. + + * Makefile.am.common: hesoid -> hesiod + +Sun Mar 21 14:48:03 1999 Johan Danielsson + + * grok-type.m4: + + * Makefile.am.common: fix for automake bug/feature; add more LIB_* + + * test-package.m4: fix typo + + * check-man.m4: fix some typos + + * auth-modules.m4: tests for authentication modules + +Thu Mar 18 11:02:55 1999 Johan Danielsson + + * Makefile.am.common: make install-build-headers a multi + dependency target + + * Makefile.am.common: remove include_dir hack + + * Makefile.am.common: define LIB_kafs and LIB_gssapi + + * krb-find-db.m4: subst DBLIB also + + * check-xau.m4: test for Xau{Read,Write}Auth + +Wed Mar 10 19:29:20 1999 Johan Danielsson + + * wflags.m4: AC_WFLAGS + +Mon Mar 1 11:23:41 1999 Johan Danielsson + + * have-struct-field.m4: remove extra AC_MSG_RESULT + + * proto-compat.m4: typo + + * krb-func-getcwd-broken.m4: update to autoconf 2.13 + + * krb-find-db.m4: update to autoconf 2.13 + + * check-declaration.m4: typo + + * have-pragma-weak.m4: update to autoconf 2.13 + + * have-struct-field.m4: better handling of types with spaces + +Mon Feb 22 20:05:06 1999 Johan Danielsson + + * broken-glob.m4: check for broken glob + +Sun Jan 31 06:50:33 1999 Assar Westerlund + + * krb-ipv6.m4: more magic for different v6 implementations. From + Jun-ichiro itojun Hagino + +Sun Nov 22 12:16:06 1998 Assar Westerlund + + * krb-struct-spwd.m4: new file + +Thu Jun 4 04:07:41 1998 Assar Westerlund + + * find-func-no-libs2.m4: new file + +Fri May 1 23:31:28 1998 Assar Westerlund + + * c-attribute.m4, c-function.m4: new files (from arla) + +Wed Mar 18 23:11:29 1998 Assar Westerlund + + * krb-ipv6.m4: rename HAVE_STRUCT_SOCKADDR_IN6 to HAVE_IPV6 + +Thu Feb 26 02:37:49 1998 Assar Westerlund + + * make-proto.pl: should work with perl4 + diff --git a/crypto/heimdal/cf/Makefile.am.common b/crypto/heimdal/cf/Makefile.am.common new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/Makefile.am.common @@ -0,0 +1,304 @@ +# $Id$ + +SUFFIXES = .et .h .pc.in .pc + +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include + +AM_CPPFLAGS = $(INCLUDES_roken) + +if do_roken_rename +ROKEN_RENAME = -DROKEN_RENAME +endif + +AM_CFLAGS = $(WFLAGS) + +CP = cp + +## set build_HEADERZ to headers that should just be installed in build tree + +buildinclude = $(top_builddir)/include + +## these aren't detected by automake +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_crypt = @LIB_crypt@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_openpty = @LIB_openpty@ +LIB_pidfile = @LIB_pidfile@ +LIB_res_search = @LIB_res_search@ +LIB_setpcred = @LIB_setpcred@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIB_com_err = @LIB_com_err@ +LIB_door_create = @LIB_door_create@ + +LIB_openssl_crypto = @LIB_openssl_crypto@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ + +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ + +INCLUDE_openldap = @INCLUDE_openldap@ +LIB_openldap = @LIB_openldap@ + +INCLUDE_readline = @INCLUDE_readline@ +LIB_readline = @LIB_readline@ + +LEXLIB = @LEXLIB@ + +libexec_heimdaldir = $(libexecdir)/heimdal + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + + + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +SUFFIXES += .x .z .hx + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; + +SUFFIXES += .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 + +NROFF_MAN = groff -mandoc -Tascii +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +## MAINTAINERCLEANFILES += + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +if NO_AFS +LIB_kafs = +else +LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +endif + +if KRB5 +LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ + $(top_builddir)/lib/asn1/libasn1.la +LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +endif + +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la + +if DCE +LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la +endif + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + + +#silent-rules + +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; diff --git a/crypto/heimdal/cf/aix.m4 b/crypto/heimdal/cf/aix.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/aix.m4 @@ -0,0 +1,62 @@ +dnl +dnl $Id$ +dnl + +AC_DEFUN([rk_AIX],[ + +aix=no +case "$host" in +*-*-aix3*) + aix=3 + ;; +*-*-aix[[4-9]]*) + aix=4 + ;; +esac + +AM_CONDITIONAL(AIX, test "$aix" != no)dnl +AM_CONDITIONAL(AIX4, test "$aix" = 4)dnl + +AC_ARG_ENABLE(dynamic-afs, + AS_HELP_STRING([--disable-dynamic-afs], + [do not use loaded AFS library with AIX])) + +if test "$aix" != no; then + + AC_DEFINE(NEED_QSORT, 1, [if your qsort is not a stable sort]) + + if test "$enable_dynamic_afs" != no; then + AC_REQUIRE([rk_DLOPEN]) + if test "$ac_cv_func_dlopen" = no; then + AC_FIND_FUNC_NO_LIBS(loadquery, ld) + fi + if test "$ac_cv_func_dlopen" != no; then + AIX_EXTRA_KAFS='$(LIB_dlopen)' + elif test "$ac_cv_func_loadquery" != no; then + AIX_EXTRA_KAFS='$(LIB_loadquery)' + else + AC_MSG_NOTICE([not using dynloaded AFS library]) + AIX_EXTRA_KAFS= + enable_dynamic_afs=no + fi + else + AIX_EXTRA_KAFS= + fi +fi + +AM_CONDITIONAL(AIX_DYNAMIC_AFS, test "$enable_dynamic_afs" != no)dnl +AC_SUBST(AIX_EXTRA_KAFS)dnl + +if test "$aix" != no; then + AC_DEFINE([_ALL_SOURCE],1,[Required for functional/sane headers on AIX]) +fi + +AH_BOTTOM([#if _AIX +/* XXX this is gross, but kills about a gazillion warnings */ +struct ether_addr; +struct sockaddr; +struct sockaddr_dl; +struct sockaddr_in; +#endif]) + +]) diff --git a/crypto/heimdal/cf/auth-modules.m4 b/crypto/heimdal/cf/auth-modules.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/auth-modules.m4 @@ -0,0 +1,45 @@ +dnl $Id$ +dnl +dnl Figure what authentication modules should be built +dnl +dnl rk_AUTH_MODULES(module-list) + +AC_DEFUN([rk_AUTH_MODULES],[ +AC_MSG_CHECKING([which authentication modules should be built]) + +z='m4_ifval([$1], $1, [sia pam afskauthlib])' +LIB_AUTH_SUBDIRS= +for i in $z; do +case $i in +sia) +if test "$ac_cv_header_siad_h" = yes; then + LIB_AUTH_SUBDIRS="$LIB_AUTH_SUBDIRS sia" +fi +;; +pam) +case "${host}" in +*-*-freebsd*) ac_cv_want_pam_krb4=no ;; +*) ac_cv_want_pam_krb4=yes ;; +esac + +if test "$ac_cv_want_pam_krb4" = yes -a \ + "$ac_cv_header_security_pam_modules_h" = yes -a \ + "$enable_shared" = yes; then + LIB_AUTH_SUBDIRS="$LIB_AUTH_SUBDIRS pam" +fi +;; +afskauthlib) +case "${host}" in +*-*-irix[[56]]*) LIB_AUTH_SUBDIRS="$LIB_AUTH_SUBDIRS afskauthlib" ;; +esac +;; +esac +done +if test "$LIB_AUTH_SUBDIRS"; then + AC_MSG_RESULT($LIB_AUTH_SUBDIRS) +else + AC_MSG_RESULT(none) +fi + +AC_SUBST(LIB_AUTH_SUBDIRS)dnl +]) diff --git a/crypto/heimdal/cf/broken-glob.m4 b/crypto/heimdal/cf/broken-glob.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/broken-glob.m4 @@ -0,0 +1,29 @@ +dnl $Id$ +dnl +dnl check for glob(3) +dnl +AC_DEFUN([AC_BROKEN_GLOB],[ +AC_CACHE_CHECK(for working glob, ac_cv_func_glob_working, +ac_cv_func_glob_working=yes +AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +#include ]],[[ +glob(NULL, GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE| +#ifdef GLOB_MAXPATH +GLOB_MAXPATH +#else +GLOB_LIMIT +#endif +, +NULL, NULL); +]])],[:],[ac_cv_func_glob_working=no])) + +if test "$ac_cv_func_glob_working" = yes; then + AC_DEFINE(HAVE_GLOB, 1, [define if you have a glob() that groks + GLOB_BRACE, GLOB_NOCHECK, GLOB_QUOTE, GLOB_TILDE, and GLOB_LIMIT]) +fi +if test "$ac_cv_func_glob_working" = yes; then +AC_NEED_PROTO([#include +#include ],glob) +fi +]) diff --git a/crypto/heimdal/cf/broken-realloc.m4 b/crypto/heimdal/cf/broken-realloc.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/broken-realloc.m4 @@ -0,0 +1,27 @@ +dnl +dnl $Id$ +dnl +dnl Test for realloc that doesn't handle NULL as first parameter +dnl +AC_DEFUN([rk_BROKEN_REALLOC], [ +AC_CACHE_CHECK(if realloc if broken, ac_cv_func_realloc_broken, [ +ac_cv_func_realloc_broken=no +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include + +int main(int argc, char **argv) +{ + return realloc(NULL, 17) == NULL; +} +]])],[:], [ac_cv_func_realloc_broken=yes],[:]) +]) +if test "$ac_cv_func_realloc_broken" = yes ; then + AC_DEFINE(BROKEN_REALLOC, 1, [Define if realloc(NULL) doesn't work.]) +fi +dnl AH_BOTTOM([#ifdef BROKEN_REALLOC +dnl #ifndef realloc +dnl #define realloc(X, Y) rk_realloc((X), (Y)) +dnl #endif +dnl #endif]) +]) diff --git a/crypto/heimdal/cf/broken-snprintf.m4 b/crypto/heimdal/cf/broken-snprintf.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/broken-snprintf.m4 @@ -0,0 +1,63 @@ +dnl $Id$ +dnl +AC_DEFUN([AC_BROKEN_SNPRINTF], [ +AC_CACHE_CHECK(for working snprintf,ac_cv_func_snprintf_working, +ac_cv_func_snprintf_working=yes +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +int main(int argc, char **argv) +{ + char foo[[3]]; + snprintf(foo, 2, "12"); + return strcmp(foo, "1") || snprintf(NULL, 0, "%d", 12) != 2; +}]])],[:],[ac_cv_func_snprintf_working=no],[:])) + +if test "$ac_cv_func_snprintf_working" = yes; then + AC_DEFINE_UNQUOTED(HAVE_SNPRINTF, 1, [define if you have a working snprintf]) +fi +if test "$ac_cv_func_snprintf_working" = yes; then +AC_NEED_PROTO([#include ],snprintf) +fi +]) + +AC_DEFUN([AC_BROKEN_VSNPRINTF],[ +AC_CACHE_CHECK(for working vsnprintf,ac_cv_func_vsnprintf_working, +ac_cv_func_vsnprintf_working=yes +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include + +int foo(int num, ...) +{ + char bar[[3]]; + va_list arg; + va_start(arg, num); + vsnprintf(bar, 2, "%s", arg); + va_end(arg); + return strcmp(bar, "1"); +} + +int bar(int num, int len, ...) +{ + int r; + va_list arg; + va_start(arg, len); + r = vsnprintf(NULL, 0, "%s", arg); + va_end(arg); + return r != len; +} + +int main(int argc, char **argv) +{ + return foo(0, "12") || bar(0, 2, "12"); +}]])],[:],[ac_cv_func_vsnprintf_working=no],[:])) + +if test "$ac_cv_func_vsnprintf_working" = yes; then + AC_DEFINE_UNQUOTED(HAVE_VSNPRINTF, 1, [define if you have a working vsnprintf]) +fi +if test "$ac_cv_func_vsnprintf_working" = yes; then +AC_NEED_PROTO([#include ],vsnprintf) +fi +]) diff --git a/crypto/heimdal/cf/broken.m4 b/crypto/heimdal/cf/broken.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/broken.m4 @@ -0,0 +1,12 @@ +dnl $Id$ +dnl +dnl +dnl Same as AC _REPLACE_FUNCS, just define HAVE_func if found in normal +dnl libraries + +AC_DEFUN([AC_BROKEN], +[AC_FOREACH([rk_func], [$1], + [AC_CHECK_FUNC(rk_func, + [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]rk_func), 1, + [Define if you have the function `]rk_func['.])], + [rk_LIBOBJ(rk_func)])])]) diff --git a/crypto/heimdal/cf/broken2.m4 b/crypto/heimdal/cf/broken2.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/broken2.m4 @@ -0,0 +1,25 @@ +dnl $Id$ +dnl +dnl AC_BROKEN but with more arguments + +dnl AC_BROKEN2(func, includes, arguments) +AC_DEFUN([AC_BROKEN2], +[AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(ac_cv_func_[]$1, +[AC_LINK_IFELSE([AC_LANG_PROGRAM([[$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_$1) || defined (__stub___$1) +choke me +#else +$1($3); +#endif +]])], [eval "ac_cv_func_[]$1=yes"], [eval "ac_cv_func_[]$1=no"])]) +if eval "test \"\${ac_cv_func_[]$1}\" = yes"; then + AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]$1), 1, define) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) + rk_LIBOBJ($1) +fi]) diff --git a/crypto/heimdal/cf/c-attribute.m4 b/crypto/heimdal/cf/c-attribute.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/c-attribute.m4 @@ -0,0 +1,28 @@ +dnl +dnl $Id$ +dnl + +dnl +dnl Test for __attribute__ +dnl + +AC_DEFUN([AC_C___ATTRIBUTE__], [ +AC_MSG_CHECKING(for __attribute__) +AC_CACHE_VAL(ac_cv___attribute__, [ +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include +static void foo(void) __attribute__ ((noreturn)); + +static void +foo(void) +{ + exit(1); +} +]])], +[ac_cv___attribute__=yes], +[ac_cv___attribute__=no])]) +if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__]) +fi +AC_MSG_RESULT($ac_cv___attribute__) +]) + diff --git a/crypto/heimdal/cf/c-function.m4 b/crypto/heimdal/cf/c-function.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/c-function.m4 @@ -0,0 +1,33 @@ +dnl +dnl $Id$ +dnl + +dnl +dnl Test for __FUNCTION__ +dnl + +AC_DEFUN([AC_C___FUNCTION__], [ +AC_MSG_CHECKING(for __FUNCTION__) +AC_CACHE_VAL(ac_cv___function__, [ +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include + +static char *foo(void) +{ + return __FUNCTION__; +} + +int main(int argc, char **argc) +{ + return strcmp(foo(), "foo") != 0; +} +]])], +[ac_cv___function__=yes], +[ac_cv___function__=no], +[ac_cv___function__=no])]) +if test "$ac_cv___function__" = "yes"; then + AC_DEFINE(HAVE___FUNCTION__, 1, [define if your compiler has __FUNCTION__]) +fi +AC_MSG_RESULT($ac_cv___function__) +]) + diff --git a/crypto/heimdal/cf/capabilities.m4 b/crypto/heimdal/cf/capabilities.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/capabilities.m4 @@ -0,0 +1,14 @@ +dnl +dnl $Id$ +dnl + +dnl +dnl Test SGI capabilities +dnl + +AC_DEFUN([KRB_CAPABILITIES],[ + +AC_CHECK_HEADERS(capability.h sys/capability.h) + +AC_CHECK_FUNCS(sgi_getcapabilitybyname cap_set_proc) +]) diff --git a/crypto/heimdal/cf/check-compile-et.m4 b/crypto/heimdal/cf/check-compile-et.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/check-compile-et.m4 @@ -0,0 +1,114 @@ +dnl $Id$ +dnl +dnl CHECK_COMPILE_ET +AC_DEFUN([CHECK_COMPILE_ET], [ + +AC_CHECK_PROG(COMPILE_ET, compile_et, [compile_et], [no]) + +krb_cv_compile_et="no" +krb_cv_com_err_need_r="" +krb_cv_compile_et_cross=no +if test "${COMPILE_ET}" != "no"; then + +dnl We have compile_et. Now let's see if it supports `prefix' and `index'. +AC_MSG_CHECKING(whether compile_et has the features we need) +cat > conftest_et.et <<'EOF' +error_table test conf +prefix CONFTEST +index 1 +error_code CODE1, "CODE1" +index 128 +error_code CODE2, "CODE2" +end +EOF +if ${COMPILE_ET} conftest_et.et >/dev/null 2>&1; then + dnl XXX Some systems have . + save_CPPFLAGS="${CPPFLAGS}" + if test -d "/usr/include/et"; then + CPPFLAGS="-I/usr/include/et ${CPPFLAGS}" + fi + dnl Check that the `prefix' and `index' directives were honored. + AC_LANG(C) + AC_RUN_IFELSE([AC_LANG_SOURCE([ +#include +#include +#include "conftest_et.h" +int main(int argc, char **argv){ +#ifndef ERROR_TABLE_BASE_conf +#error compile_et does not handle error_table N M +#endif +return (CONFTEST_CODE2 - CONFTEST_CODE1) != 127;} + ])], [krb_cv_compile_et="yes"],[CPPFLAGS="${save_CPPFLAGS}"], + [krb_cv_compile_et="yes" krb_cv_compile_et_cross=yes] ) +fi +AC_MSG_RESULT(${krb_cv_compile_et}) +if test "${krb_cv_compile_et}" = "yes" -a "${krb_cv_compile_et_cross}" = no; then + AC_MSG_CHECKING([for if com_err generates a initialize_conf_error_table_r]) + AC_EGREP_CPP([initialize_conf_error_table_r.*struct et_list], + [#include "conftest_et.h"], + [krb_cv_com_err_need_r="ok"]) + if test X"$krb_cv_com_err_need_r" = X ; then + AC_MSG_RESULT(no) + krb_cv_compile_et=no + else + AC_MSG_RESULT(yes) + fi +fi +rm -fr conftest* +fi + +if test "${krb_cv_compile_et_cross}" = yes ; then + krb_cv_com_err="cross" +elif test "${krb_cv_compile_et}" = "yes"; then + dnl Since compile_et seems to work, let's check libcom_err + krb_cv_save_LIBS="${LIBS}" + LIBS="${LIBS} -lcom_err" + AC_MSG_CHECKING(for com_err) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]],[[ + const char *p; + p = error_message(0); + initialize_error_table_r(0,0,0,0); + com_right_r(0, 0, 0, 0); + ]])],[krb_cv_com_err="yes"],[krb_cv_com_err="no"; CPPFLAGS="${save_CPPFLAGS}"]) + AC_MSG_RESULT(${krb_cv_com_err}) + LIBS="${krb_cv_save_LIBS}" +else + dnl Since compile_et doesn't work, forget about libcom_err + krb_cv_com_err="no" +fi + +dnl Only use the system's com_err if we found compile_et, libcom_err, and +dnl com_err.h. +if test "${krb_cv_com_err}" = "yes"; then + DIR_com_err="" + LIB_com_err="-lcom_err" + LIB_com_err_a="" + LIB_com_err_so="" + AC_MSG_NOTICE(Using the already-installed com_err) + COMPILE_ET="${ac_cv_prog_COMPILE_ET}" + localcomerr=no +elif test "${krb_cv_com_err}" = "cross"; then + DIR_com_err="com_err" + LIB_com_err="\$(top_builddir)/lib/com_err/libcom_err.la" + LIB_com_err_a="\$(top_builddir)/lib/com_err/.libs/libcom_err.a" + LIB_com_err_so="\$(top_builddir)/lib/com_err/.libs/libcom_err.so" + AC_MSG_NOTICE(Using our own com_err with toolchain compile_et) + COMPILE_ET="${ac_cv_prog_COMPILE_ET}" + localcomerr=yes +else + COMPILE_ET="\$(top_builddir)/lib/com_err/compile_et" + DIR_com_err="com_err" + LIB_com_err="\$(top_builddir)/lib/com_err/libcom_err.la" + LIB_com_err_a="\$(top_builddir)/lib/com_err/.libs/libcom_err.a" + LIB_com_err_so="\$(top_builddir)/lib/com_err/.libs/libcom_err.so" + AC_MSG_NOTICE(Using our own com_err) + localcomerr=yes +fi +AM_CONDITIONAL(COM_ERR, test "$localcomerr" = yes)dnl +AC_SUBST(COMPILE_ET) +AC_SUBST(DIR_com_err) +AC_SUBST(LIB_com_err) +AC_SUBST(LIB_com_err_a) +AC_SUBST(LIB_com_err_so) + +]) diff --git a/crypto/heimdal/cf/check-getpwnam_r-posix.m4 b/crypto/heimdal/cf/check-getpwnam_r-posix.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/check-getpwnam_r-posix.m4 @@ -0,0 +1,40 @@ +dnl $Id$ +dnl +dnl check for getpwnam_r, and if it's posix or not + +AC_DEFUN([AC_CHECK_GETPWNAM_R_POSIX],[ +AC_FIND_FUNC_NO_LIBS(getpwnam_r,c_r) +if test "$ac_cv_func_getpwnam_r" = yes; then + AC_CACHE_CHECK(if getpwnam_r is posix,ac_cv_func_getpwnam_r_posix, + ac_libs="$LIBS" + LIBS="$LIBS $LIB_getpwnam_r" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#define _POSIX_PTHREAD_SEMANTICS +#include +int main(int argc, char **argv) +{ + struct passwd pw, *pwd; + return getpwnam_r("", &pw, 0, 0, &pwd) < 0; +} +]])],[ac_cv_func_getpwnam_r_posix=yes],[ac_cv_func_getpwnam_r_posix=no],[:]) +LIBS="$ac_libs") + AC_CACHE_CHECK(if _POSIX_PTHREAD_SEMANTICS is needed,ac_cv_func_getpwnam_r_posix_def, + ac_libs="$LIBS" + LIBS="$LIBS $LIB_getpwnam_r" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +int main(int argc, char **argv) +{ + struct passwd pw, *pwd; + return getpwnam_r("", &pw, 0, 0, &pwd) < 0; +} +]])],[ac_cv_func_getpwnam_r_posix_def=no],[ac_cv_func_getpwnam_r_posix_def=yes],[:]) +LIBS="$ac_libs") +if test "$ac_cv_func_getpwnam_r_posix" = yes; then + AC_DEFINE(POSIX_GETPWNAM_R, 1, [Define if getpwnam_r has POSIX flavour.]) +fi +if test "$ac_cv_func_getpwnam_r_posix" = yes -a "$ac_cv_func_getpwnam_r_posix_def" = yes; then + AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Define to get POSIX getpwnam_r in some systems.]) +fi +fi +]) diff --git a/crypto/heimdal/cf/check-man.m4 b/crypto/heimdal/cf/check-man.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/check-man.m4 @@ -0,0 +1,57 @@ +dnl $Id$ +dnl check how to format manual pages +dnl + +AC_DEFUN([rk_CHECK_MAN], +[AC_PATH_PROG(NROFF, nroff) +AC_PATH_PROG(GROFF, groff) +AC_CACHE_CHECK(how to format man pages,ac_cv_sys_man_format, +[cat > conftest.1 << END +.Dd January 1, 1970 +.Dt CONFTEST 1 +.Sh NAME +.Nm conftest +.Nd foobar +END + +if test "$NROFF" ; then + for i in "-mdoc" "-mandoc"; do + if "$NROFF" $i conftest.1 2> /dev/null | \ + grep Jan > /dev/null 2>&1 ; then + ac_cv_sys_man_format="$NROFF $i" + break + fi + done +fi +if test "$ac_cv_sys_man_format" = "" -a "$GROFF" ; then + for i in "-mdoc" "-mandoc"; do + if "$GROFF" -Tascii $i conftest.1 2> /dev/null | \ + grep Jan > /dev/null 2>&1 ; then + ac_cv_sys_man_format="$GROFF -Tascii $i" + break + fi + done +fi +if test "$ac_cv_sys_man_format"; then + ac_cv_sys_man_format="$ac_cv_sys_man_format \[$]< > \[$]@" +fi +]) +if test "$ac_cv_sys_man_format"; then + CATMAN="$ac_cv_sys_man_format" + AC_SUBST(CATMAN) +fi +AM_CONDITIONAL(CATMAN, test "$CATMAN") +AC_CACHE_CHECK(extension of pre-formatted manual pages,ac_cv_sys_catman_ext, +[if grep _suffix /etc/man.conf > /dev/null 2>&1; then + ac_cv_sys_catman_ext=0 +else + ac_cv_sys_catman_ext=number +fi +]) +if test "$ac_cv_sys_catman_ext" = number; then + CATMANEXT='$$section' +else + CATMANEXT=0 +fi +AC_SUBST(CATMANEXT) +]) diff --git a/crypto/heimdal/cf/check-netinet-ip-and-tcp.m4 b/crypto/heimdal/cf/check-netinet-ip-and-tcp.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/check-netinet-ip-and-tcp.m4 @@ -0,0 +1,33 @@ +dnl +dnl $Id$ +dnl + +dnl extra magic check for netinet/{ip.h,tcp.h} because on irix 6.5.3 +dnl you have to include standards.h before including these files + +AC_DEFUN([CHECK_NETINET_IP_AND_TCP], +[ +AC_CHECK_HEADERS(standards.h) +for i in netinet/ip.h netinet/tcp.h; do + +cv=`echo "$i" | sed 'y%./+-%__p_%'` + +AC_CACHE_CHECK([for $i],ac_cv_header_$cv, +[AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ +#ifdef HAVE_STANDARDS_H +#include +#endif +#include <$i> +]])], +[eval "ac_cv_header_$cv=yes"], +[eval "ac_cv_header_$cv=no"])]) +ac_res=`eval echo \\$ac_cv_header_$cv` +if test "$ac_res" = yes; then + ac_tr_hdr=HAVE_`echo $i | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + AC_DEFINE_UNQUOTED($ac_tr_hdr, 1) +fi +done +if false;then + AC_CHECK_HEADERS(netinet/ip.h netinet/tcp.h) +fi +]) diff --git a/crypto/heimdal/cf/check-type-extra.m4 b/crypto/heimdal/cf/check-type-extra.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/check-type-extra.m4 @@ -0,0 +1,23 @@ +dnl $Id$ +dnl +dnl ac_check_type + extra headers + +dnl AC_CHECK_TYPE_EXTRA(TYPE, DEFAULT, HEADERS) +AC_DEFUN([AC_CHECK_TYPE_EXTRA], +[AC_REQUIRE([AC_HEADER_STDC])dnl +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(ac_cv_type_$1, +[AC_EGREP_CPP(dnl +changequote(<<,>>)dnl +<<$1[^a-zA-Z_0-9]>>dnl +changequote([,]), [#include +#if STDC_HEADERS +#include +#include +#endif +$3], ac_cv_type_$1=yes, ac_cv_type_$1=no)])dnl +AC_MSG_RESULT($ac_cv_type_$1) +if test $ac_cv_type_$1 = no; then + AC_DEFINE($1, $2, [Define this to what the type $1 should be.]) +fi +]) diff --git a/crypto/heimdal/cf/check-var.m4 b/crypto/heimdal/cf/check-var.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/check-var.m4 @@ -0,0 +1,28 @@ +dnl $Id$ +dnl +dnl rk_CHECK_VAR(variable, includes) +AC_DEFUN([rk_CHECK_VAR], [ +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL(ac_cv_var_$1, [ +m4_ifval([$2],[ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[$2 + void * foo(void) { return &$1; }]],[[foo()]])], + [ac_cv_var_$1=yes],[ac_cv_var_$1=no])]) +if test "$ac_cv_var_$1" != yes ; then +AC_LINK_IFELSE([AC_LANG_PROGRAM([[$2 +extern int $1; +int foo(void) { return $1; }]],[[foo()]])], + [ac_cv_var_$1=yes],[ac_cv_var_$1=no]) +fi +]) +ac_foo=`eval echo \\$ac_cv_var_$1` +AC_MSG_RESULT($ac_foo) +if test "$ac_foo" = yes; then + AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]$1), 1, + [Define if you have the `]$1[' variable.]) + m4_ifval([$2], [AC_CHECK_DECLS([$1],[],[],[$2])]) +fi +]) + +AC_WARNING_ENABLE([obsolete]) +AU_DEFUN([AC_CHECK_VAR], [rk_CHECK_VAR([$2], [$1])], [foo]) diff --git a/crypto/heimdal/cf/crypto.m4 b/crypto/heimdal/cf/crypto.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/crypto.m4 @@ -0,0 +1,166 @@ +dnl $Id$ +dnl +dnl test for crypto libraries: +dnl - libcrypto (from openssl) +dnl - own-built libhcrypto + +m4_define([test_headers], [ + #undef KRB5 /* makes md4.h et al unhappy */ + #ifdef HAVE_HCRYPTO_W_OPENSSL + #ifdef HAVE_SYS_TYPES_H + #include + #endif + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #else + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #endif + ]) +m4_define([test_body], [ + void *schedule = 0; + EVP_MD_CTX mdctx; + + EVP_md4(); + EVP_md5(); + EVP_sha1(); + EVP_sha256(); + + EVP_MD_CTX_init(&mdctx); + EVP_DigestInit_ex(&mdctx, EVP_sha1(), (ENGINE *)0); + EVP_CIPHER_iv_length(((EVP_CIPHER*)0)); + UI_UTIL_read_pw_string(0,0,0,0); + RAND_status(); + #ifdef HAVE_HCRYPTO_W_OPENSSL + EC_KEY_new(); + #endif + + OpenSSL_add_all_algorithms(); + AES_encrypt(0,0,0); + DES_cbc_encrypt(0, 0, 0, schedule, 0, 0); + RC4(0, 0, 0, 0);]) + +AC_DEFUN([KRB_CRYPTO],[ +AC_ARG_WITH([hcrypto-default-backend], + AS_HELP_STRING([--with-hcrypto-default-backend=cc|pkcs11_hcrypto|ossl|w32crypto|hcrypto], + [specify the default hcrypto backend]), + [ + CFLAGS="${CFLAGS} -DHCRYPTO_DEF_PROVIDER=${withval}" + case "$withval" in + cc) AC_DEFINE(HCRYPTO_DEF_PROVIDER, [cc], [Define to one of cc, pkcs11, ossl, w32crypto, or hcrypto to set a default hcrypto provider]);; + pkcs11_hcrypto) AC_DEFINE(HCRYPTO_DEF_PROVIDER, [pkcs11_hcrypto], [Define to one of cc, pkcs11, ossl, w32crypto, or hcrypto to set a default hcrypto provider]);; + ossl) AC_DEFINE(HCRYPTO_DEF_PROVIDER, [ossl], [Define to one of cc, pkcs11, ossl, w32crypto, or hcrypto to set a default hcrypto provider]);; + w32crypto) AC_DEFINE(HCRYPTO_DEF_PROVIDER, [w32crypto], [Define to one of cc, pkcs11, ossl, w32crypto, or hcrypto to set a default hcrypto provider]);; + hcrypto) AC_DEFINE(HCRYPTO_DEF_PROVIDER, [hcrypto], [Define to one of cc, pkcs11, ossl, w32crypto, or hcrypto to set a default hcrypto provider]);; + *) echo "Invalid hcrypto provider name ($withval)"; exit 5;; + esac + ], + []) +AC_ARG_WITH([hcrypto-fallback], + AS_HELP_STRING([--without-hcrypto-fallback], + [disable fallback on hcrypto for unavailable algorithms]), + [AC_DEFINE([HCRYPTO_FALLBACK],0,[Set to 1 to allow fallback to hcrypto for unavailable algorithms])], + [AC_DEFINE([HCRYPTO_FALLBACK],1,[Set to 1 to allow fallback to hcrypto for unavailable algorithms])]) +AC_WITH_ALL([openssl]) + +AC_MSG_CHECKING([for crypto library]) + +openssl=no + +if test "$with_openssl" = "yes"; then + with_openssl=/usr +fi +if test "$with_openssl" != "no"; then + saved_CFLAGS="${CFLAGS}" + saved_LDFLAGS="${LDFLAGS}" + INCLUDE_openssl_crypto= + LIB_openssl_crypto= + if test "$with_openssl_include" != ""; then + INCLUDE_openssl_crypto="-I${with_openssl_include}" + else + INCLUDE_openssl_crypto="-I${with_openssl}/include" + fi + if test "$with_openssl_lib" != ""; then + LIB_openssl_crypto="-L${with_openssl_lib}" + elif test "${with_openssl}" != "/usr" -a -d "${with_openssl}/lib"; then + LIB_openssl_crypto="-L${with_openssl}/lib" + fi + CFLAGS="-DHAVE_HCRYPTO_W_OPENSSL ${INCLUDE_openssl_crypto} ${CFLAGS}" + LDFLAGS="${LIB_openssl_crypto} ${LDFLAGS}" + AC_CHECK_LIB([crypto], [OPENSSL_init], + [LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto"; openssl=yes], [openssl=no], []) + # These cases are just for static linking on older OSes, + # presumably. + if test "$openssl" = "no"; then + AC_CHECK_LIB([crypto], [OPENSSL_init], + [LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto -ldl"; openssl=yes], [openssl=no], [-ldl]) + fi + if test "$openssl" = "no"; then + AC_CHECK_LIB([crypto], [OPENSSL_init], + [LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto -ldl -lnsl"; openssl=yes], [openssl=no], [-ldl -lnsl]) + fi + if test "$openssl" = "no"; then + AC_CHECK_LIB([crypto], [OPENSSL_init], + [LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto -ldl -lnsl -lsocket"; openssl=yes], [openssl=no], [-ldl -lnsl -lsocket]) + fi + if test "$openssl" = "no"; then + INCLUDE_openssl_crypto= + LIB_openssl_crypto= + fi + CFLAGS="${saved_CFLAGS}" + LDFLAGS="${saved_LDFLAGS}" +fi + +LIB_hcrypto='$(top_builddir)/lib/hcrypto/libhcrypto.la' +LIB_hcrypto_a='$(top_builddir)/lib/hcrypto/.libs/libhcrypto.a' +LIB_hcrypto_so='$(top_builddir)/lib/hcrypto/.libs/libhcrypto.so' +LIB_hcrypto_appl="-lhcrypto" + +AC_MSG_RESULT([included libhcrypto]) + +AC_ARG_WITH(pkcs11-module, + AS_HELP_STRING([--with-pkcs11-module=path], + [use PKCS11 module in path]), + [pkcs11_module="$withval"], + []) + +if test "$pkcs11_module" != ""; then + AC_DEFINE_UNQUOTED(PKCS11_MODULE_PATH, "$pkcs11_module", [path to PKCS11 module]) + openssl=no +fi + +if test "$openssl" = "yes"; then + AC_DEFINE([HAVE_HCRYPTO_W_OPENSSL], 1, [define to use openssl's libcrypto as the default backend for libhcrypto]) +fi +AM_CONDITIONAL(HAVE_HCRYPTO_W_OPENSSL, test "$openssl" = yes)dnl + +AC_SUBST(INCLUDE_openssl_crypto) +AC_SUBST(LIB_openssl_crypto) +AC_SUBST(LIB_hcrypto) +AC_SUBST(LIB_hcrypto_a) +AC_SUBST(LIB_hcrypto_so) +AC_SUBST(LIB_hcrypto_appl) +]) diff --git a/crypto/heimdal/cf/db.m4 b/crypto/heimdal/cf/db.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/db.m4 @@ -0,0 +1,268 @@ +dnl $Id$ +dnl +dnl tests for various db libraries +dnl + +AC_DEFUN([rk_DB],[ +AC_ARG_WITH(db-type-preference, + AS_HELP_STRING([--with-db-type-preference=list], + [specify HDB backend DB type preference as whitespace-separated list of db1, db3, lmdb, and/or sqlite]), + [db_type_preference="$withval"], + [db_type_preference="lmdb db3 db1 sqlite"]) +AC_ARG_WITH(berkeley-db, + AS_HELP_STRING([--with-berkeley-db], + [enable support for berkeley db @<:@default=check@:>@]), + [], + [with_berkeley_db=check]) + +dbheader="" +AC_ARG_WITH(berkeley-db-include, + AS_HELP_STRING([--with-berkeley-db-include=dir], + [use berkeley-db headers in dir]), + [dbheader=$withval], + [with_berkeley_db_include=check]) + +AC_ARG_ENABLE(ndbm-db, + AS_HELP_STRING([--disable-ndbm-db], + [if you don't want ndbm db]),[ +]) + +AC_ARG_ENABLE(mdb-db, + AS_HELP_STRING([--disable-mdb-db], + [if you don't want LMDB]),[ +]) + +have_db1=no +have_db3=no +have_lmdb=no +db_type=unknown + +AS_IF([test "x$with_berkeley_db" != xno], + [AS_IF([test "x$with_berkeley_db_include" != xcheck], + [AC_CHECK_HEADERS(["$dbheader/db.h"], + [AC_SUBST([DBHEADER], [$dbheader]) + AC_DEFINE([HAVE_DBHEADER], [1], + [Define if you have user supplied header location]) + ], + [if test "x$with_berkeley_db_include" != xcheck; then + AC_MSG_FAILURE( + [--with-berkeley-db-include was given but include test failed]) + fi + ])], + [AC_CHECK_HEADERS([ \ + db6/db.h \ + db5/db.h \ + db4/db.h \ + db3/db.h \ + db.h \ + ])]) + +dnl db_create is used by db3 and db4 and db5 and db6 + + AC_FIND_FUNC_NO_LIBS(db_create, [$dbheader] db-6 db-5 db4 db3 db, [ + #include + #ifdef HAVE_DBHEADER + #include <$dbheader/db.h> + #elif HAVE_DB6_DB_H + #include + #elif HAVE_DB5_DB_H + #include + #elif HAVE_DB4_DB_H + #include + #elif defined(HAVE_DB3_DB_H) + #include + #else + #include + #endif + ],[NULL, NULL, 0]) + + if test "$ac_cv_func_db_create" = "yes"; then + have_db3=yes + if test "$ac_cv_funclib_db_create" != "yes"; then + DB3LIB="$ac_cv_funclib_db_create" + else + DB3LIB="" + fi + AC_DEFINE(HAVE_DB3, 1, [define if you have a berkeley db3/4/5/6 library]) + fi + +dnl dbopen is used by db1/db2 + + AC_FIND_FUNC_NO_LIBS(dbopen, db2 db, [ + #include + #if defined(HAVE_DB2_DB_H) + #include + #elif defined(HAVE_DB_H) + #include + #else + #error no db.h + #endif + ],[NULL, 0, 0, 0, NULL]) + + if test "$ac_cv_func_dbopen" = "yes"; then + have_db1=yes + if test "$ac_cv_funclib_dbopen" != "yes"; then + DB1LIB="$ac_cv_funclib_dbopen" + else + DB1LIB="" + fi + AC_DEFINE(HAVE_DB1, 1, [define if you have a berkeley db1/2 library]) + fi + +dnl test for ndbm compatability + + if test "$ac_cv_func_dbm_firstkey" != yes; then + AC_FIND_FUNC_NO_LIBS2(dbm_firstkey, $ac_cv_funclib_dbopen $ac_cv_funclib_db_create, [ + #include + #define DB_DBM_HSEARCH 1 + #include + DBM *dbm; + ],[NULL]) + + if test "$ac_cv_func_dbm_firstkey" = "yes"; then + if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then + NDBMLIB="$ac_cv_funclib_dbm_firstkey" + else + NDBMLIB="" + fi + AC_DEFINE(HAVE_DB_NDBM, 1, [define if you have ndbm compat in db]) + AC_DEFINE(HAVE_NEW_DB, 1, [Define if NDBM really is DB (creates files *.db)]) + else + $as_unset ac_cv_func_dbm_firstkey + $as_unset ac_cv_funclib_dbm_firstkey + fi + fi + +]) # fi berkeley db + + +AS_IF([test "x$enable_mdb_db" != xno], + [AC_CHECK_HEADER(lmdb.h, [ + AC_CHECK_LIB(lmdb, mdb_env_create, have_lmdb=yes; LMDBLIB="-llmdb" + AC_DEFINE(HAVE_LMDB, 1, [define if you have the LMDB library]))])]) + +for db_type in unknown $db_type_preference; do + if eval test \"x\$have_${db_type}\" = xyes -o ${db_type} = sqlite; then + break + fi + db_type=unknown +done + +AS_IF([test "x$have_db3" = xyes -a "$db_type" = unknown], db_type=db3, db_type="$db_type") +AS_IF([test "x$have_db1" = xyes -a "$db_type" = unknown], db_type=db1, db_type="$db_type") +AS_IF([test "x$have_lmdb" = xyes -a "$db_type" = unknown], db_type=lmdb, db_type="$db_type") + +if test "$enable_ndbm_db" != "no"; then + + if test "$db_type" = "unknown" -o "$ac_cv_func_dbm_firstkey" = ""; then + + AC_CHECK_HEADERS([ \ + dbm.h \ + ndbm.h \ + ]) + + AC_FIND_FUNC_NO_LIBS(dbm_firstkey, ndbm, [ + #include + #if defined(HAVE_NDBM_H) + #include + #elif defined(HAVE_DBM_H) + #include + #endif + DBM *dbm; + ],[NULL]) + + if test "$ac_cv_func_dbm_firstkey" = "yes"; then + if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then + NDBMLIB="$ac_cv_funclib_dbm_firstkey" + else + NDBMLIB="" + fi + AC_DEFINE(HAVE_NDBM, 1, [define if you have a ndbm library])dnl + have_ndbm=yes + else + + $as_unset ac_cv_func_dbm_firstkey + $as_unset ac_cv_funclib_dbm_firstkey + + AC_CHECK_HEADERS([ \ + gdbm/ndbm.h \ + ]) + + AC_FIND_FUNC_NO_LIBS(dbm_firstkey, gdbm, [ + #include + #include + DBM *dbm; + ],[NULL]) + + if test "$ac_cv_func_dbm_firstkey" = "yes"; then + if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then + NDBMLIB="$ac_cv_funclib_dbm_firstkey" + else + NDBMLIB="" + fi + AC_DEFINE(HAVE_NDBM, 1, [define if you have a ndbm library])dnl + have_ndbm=yes + if test "$db_type" = "unknown"; then + db_type=ndbm + fi + fi + fi + fi #enable_ndbm_db +fi # unknown + +if test "$have_ndbm" = "yes"; then + AC_MSG_CHECKING([if ndbm is implemented with db]) + AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#if defined(HAVE_GDBM_NDBM_H) +#include +#elif defined(HAVE_NDBM_H) +#include +#elif defined(HAVE_DBM_H) +#include +#endif +int main(int argc, char **argv) +{ + DBM *d; + + d = dbm_open("conftest", O_RDWR | O_CREAT, 0666); + if (d == NULL) + return 1; + dbm_close(d); + return 0; +}]])],[ + if test -f conftest.db; then + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_NEW_DB, 1, [Define if NDBM really is DB (creates files *.db)]) + else + AC_MSG_RESULT([no]) + fi],[AC_MSG_RESULT([no])],[AC_MSG_RESULT([no-cross])]) +fi + +AM_CONDITIONAL(HAVE_DB1, test "$have_db1" = yes)dnl +AM_CONDITIONAL(HAVE_DB3, test "$have_db3" = yes)dnl +AM_CONDITIONAL(HAVE_LMDB, test "$have_lmdb" = yes)dnl +AM_CONDITIONAL(HAVE_NDBM, test "$have_ndbm" = yes)dnl +AM_CONDITIONAL(HAVE_DBHEADER, test "$dbheader" != "")dnl + +## it's probably not correct to include LDFLAGS here, but we might +## need it, for now just add any possible -L +z="" +for i in $LDFLAGS; do + case "$i" in + -L*) z="$z $i";; + esac +done +DB3LIB="$z $DB3LIB" +DB1LIB="$z $DB1LIB" +LMDBLIB="$z $LMDBLIB" +NDMBLIB="$z $NDBMLIB" +AC_SUBST(DB3LIB)dnl +AC_SUBST(DB1LIB)dnl +AC_SUBST(LMDBLIB)dnl +AC_SUBST(NDBMLIB)dnl +AC_SUBST(NDBMLIB)dnl +AC_SUBST(db_type)dnl +AC_SUBST(db_type_preference)dnl +]) diff --git a/crypto/heimdal/cf/destdirs.m4 b/crypto/heimdal/cf/destdirs.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/destdirs.m4 @@ -0,0 +1,18 @@ +dnl +dnl $Id$ +dnl + +AC_DEFUN([rk_DESTDIRS], [ +# This is done by AC_OUTPUT but we need the result here. +test "x$prefix" = xNONE && prefix=$ac_default_prefix +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +AC_FOREACH([rk_dir], [bin lib libexec localstate sbin sysconf], [ + x="${rk_dir[]dir}" + eval y="$x" + while test "x$y" != "x$x"; do + x="$y" + eval y="$x" + done + AC_DEFINE_UNQUOTED(AS_TR_CPP(rk_dir[]dir), "$x", [path to ]rk_dir[])]) +]) diff --git a/crypto/heimdal/cf/dispatch.m4 b/crypto/heimdal/cf/dispatch.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/dispatch.m4 @@ -0,0 +1,23 @@ + +AC_DEFUN([rk_LIBDISPATCH],[ + +AC_CHECK_PROGS(GCD_MIG, mig, no) + +if test "$GCD_MIG" != no; then + AC_CHECK_HEADERS([dispatch/dispatch.h]) + AC_FIND_FUNC_NO_LIBS(dispatch_async_f, dispatch, + [#ifdef HAVE_DISPATCH_DISPATCH_H + #include + #endif],[0,0,0]) + + if test "$ac_cv_func_dispatch_async_f" = yes -a "$GCD_MIG" != no; then + AC_DEFINE([HAVE_GCD], 1, [Define if os support gcd.]) + libdispatch=yes + else + libdispatch=no + fi + +fi +AM_CONDITIONAL(have_gcd, test "$libdispatch" = yes -a "$GCD_MIG" != no) + +]) diff --git a/crypto/heimdal/cf/dlopen.m4 b/crypto/heimdal/cf/dlopen.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/dlopen.m4 @@ -0,0 +1,19 @@ +dnl +dnl $Id$ +dnl + +AC_DEFUN([rk_DLOPEN], [ + AC_FIND_FUNC_NO_LIBS(dlopen, dl,[ +#ifdef HAVE_DLFCN_H +#include +#endif],[0,0]) + AM_CONDITIONAL(HAVE_DLOPEN, test "$ac_cv_funclib_dlopen" != no) +]) + +AC_DEFUN([rk_DLADDR], [ + AC_FIND_FUNC_NO_LIBS(dladdr, dl,[ +#ifdef HAVE_DLFCN_H +#include +#endif],[0,0]) + AM_CONDITIONAL(HAVE_DLADDR, test "$ac_cv_funclib_dladdr" != no) +]) diff --git a/crypto/heimdal/cf/find-func-no-libs.m4 b/crypto/heimdal/cf/find-func-no-libs.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/find-func-no-libs.m4 @@ -0,0 +1,9 @@ +dnl $Id$ +dnl +dnl +dnl Look for function in any of the specified libraries +dnl + +dnl AC_FIND_FUNC_NO_LIBS(func, libraries, includes, arguments, extra libs, extra args) +AC_DEFUN([AC_FIND_FUNC_NO_LIBS], [ +AC_FIND_FUNC_NO_LIBS2([$1], ["" $2], [$3], [$4], [$5], [$6])]) diff --git a/crypto/heimdal/cf/find-func-no-libs2.m4 b/crypto/heimdal/cf/find-func-no-libs2.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/find-func-no-libs2.m4 @@ -0,0 +1,62 @@ +dnl $Id$ +dnl +dnl +dnl Look for function in any of the specified libraries +dnl + +dnl AC_FIND_FUNC_NO_LIBS2(func, libraries, includes, arguments, extra libs, extra args) +AC_DEFUN([AC_FIND_FUNC_NO_LIBS2], [ + +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(ac_cv_funclib_$1, +[ +if eval "test \"\$ac_cv_func_$1\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in $2; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS="$6 $ac_lib $5 $ac_save_LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[$3]],[[$1($4)]])],[eval "if test -n \"$ac_lib\";then ac_cv_funclib_$1=$ac_lib; else ac_cv_funclib_$1=yes; fi";break]) + done + eval "ac_cv_funclib_$1=\${ac_cv_funclib_$1-no}" + LIBS="$ac_save_LIBS" +fi +]) + +eval "ac_res=\$ac_cv_funclib_$1" + +if false; then + AC_CHECK_FUNCS($1) +dnl AC_CHECK_LIBS($2, foo) +fi +# $1 +eval "ac_tr_func=HAVE_[]upcase($1)" +eval "ac_tr_lib=HAVE_LIB[]upcase($ac_res | sed -e 's/-l//')" +eval "LIB_$1=$ac_res" + +case "$ac_res" in + yes) + eval "ac_cv_func_$1=yes" + eval "LIB_$1=" + AC_DEFINE_UNQUOTED($ac_tr_func) + AC_MSG_RESULT([yes]) + ;; + no) + eval "ac_cv_func_$1=no" + eval "LIB_$1=" + AC_MSG_RESULT([no]) + ;; + *) + eval "ac_cv_func_$1=yes" + AC_DEFINE_UNQUOTED($ac_tr_func) + AC_DEFINE_UNQUOTED($ac_tr_lib) + AC_MSG_RESULT([yes, in $ac_res]) + ;; +esac +AC_SUBST(LIB_$1) +]) diff --git a/crypto/heimdal/cf/find-func.m4 b/crypto/heimdal/cf/find-func.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/find-func.m4 @@ -0,0 +1,9 @@ +dnl $Id$ +dnl +dnl AC_FIND_FUNC(func, libraries, includes, arguments) +AC_DEFUN([AC_FIND_FUNC], [ +AC_FIND_FUNC_NO_LIBS([$1], [$2], [$3], [$4]) +if test -n "$LIB_$1"; then + LIBS="$LIB_$1 $LIBS" +fi +]) diff --git a/crypto/heimdal/cf/find-if-not-broken.m4 b/crypto/heimdal/cf/find-if-not-broken.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/find-if-not-broken.m4 @@ -0,0 +1,12 @@ +dnl $Id$ +dnl +dnl +dnl Mix between AC_FIND_FUNC and AC_BROKEN +dnl + +AC_DEFUN([AC_FIND_IF_NOT_BROKEN], +[AC_FIND_FUNC([$1], [$2], [$3], [$4]) +if eval "test \"$ac_cv_func_$1\" != yes"; then + rk_LIBOBJ([$1]) +fi +]) diff --git a/crypto/heimdal/cf/framework-security.m4 b/crypto/heimdal/cf/framework-security.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/framework-security.m4 @@ -0,0 +1,31 @@ +AC_DEFUN([rk_FRAMEWORK_SECURITY], [ + +AC_MSG_CHECKING([for framework security]) +AC_CACHE_VAL(rk_cv_framework_security, +[ +if test "$rk_cv_framework_security" != yes; then + ac_save_LIBS="$LIBS" + LIBS="$ac_save_LIBS -framework Security -framework CoreFoundation" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +]], +[[SecKeychainSearchRef searchRef; +SecKeychainSearchCreateFromAttributes(NULL,kSecCertificateItemClass,NULL, &searchRef); +CFRelease(&searchRef); +]])],[rk_cv_framework_security=yes]) + LIBS="$ac_save_LIBS" +fi +]) + +if test "$rk_cv_framework_security" = yes; then + AC_DEFINE(HAVE_FRAMEWORK_SECURITY, 1, [Have -framework Security]) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi +AM_CONDITIONAL(FRAMEWORK_SECURITY, test "$rk_cv_framework_security" = yes) + +if test "$rk_cv_framework_security" = yes; then + AC_NEED_PROTO([#include ],SecKeyGetCSPHandle) +fi + +]) diff --git a/crypto/heimdal/cf/have-pragma-weak.m4 b/crypto/heimdal/cf/have-pragma-weak.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/have-pragma-weak.m4 @@ -0,0 +1,37 @@ +dnl $Id$ +dnl +AC_DEFUN([AC_HAVE_PRAGMA_WEAK], [ +if test "${enable_shared}" = "yes"; then +AC_MSG_CHECKING(for pragma weak) +AC_CACHE_VAL(ac_have_pragma_weak, [ +ac_have_pragma_weak=no +cat > conftest_foo.$ac_ext <<'EOF' +[#]line __oline__ "configure" +#include "confdefs.h" +#pragma weak foo = _foo +int _foo = 17; +EOF +cat > conftest_bar.$ac_ext <<'EOF' +[#]line __oline__ "configure" +#include "confdefs.h" +extern int foo; + +int t(void) { + return foo; +} + +int main(int argc, char **argv) { + return t(); +} +EOF +if AC_TRY_EVAL('CC -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest_foo.$ac_ext conftest_bar.$ac_ext 1>&AC_FD_CC'); then +ac_have_pragma_weak=yes +fi +rm -rf conftest* +]) +if test "$ac_have_pragma_weak" = "yes"; then + AC_DEFINE(HAVE_PRAGMA_WEAK, 1, [Define this if your compiler supports \`#pragma weak.'])dnl +fi +AC_MSG_RESULT($ac_have_pragma_weak) +fi +]) diff --git a/crypto/heimdal/cf/have-struct-field.m4 b/crypto/heimdal/cf/have-struct-field.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/have-struct-field.m4 @@ -0,0 +1,21 @@ +dnl $Id$ +dnl +dnl check for fields in a structure +dnl +dnl AC_HAVE_STRUCT_FIELD(struct, field, headers) + +AC_DEFUN([AC_HAVE_STRUCT_FIELD], [ +define(cache_val, translit(ac_cv_type_$1_$2, [A-Z ], [a-z_])) +AC_CACHE_CHECK([for $2 in $1], cache_val,[ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$3]], + [[$1 x; memset(&x, 0, sizeof(x)); x.$2]])], + [cache_val=yes], + [cache_val=no]) +]) +if test "$cache_val" = yes; then + define(foo, translit(HAVE_$1_$2, [a-z ], [A-Z_])) + AC_DEFINE(foo, 1, [Define if $1 has field $2.]) + undefine([foo]) +fi +undefine([cache_val]) +]) diff --git a/crypto/heimdal/cf/have-type.m4 b/crypto/heimdal/cf/have-type.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/have-type.m4 @@ -0,0 +1,30 @@ +dnl $Id$ +dnl +dnl check for existance of a type + +dnl AC_HAVE_TYPE(TYPE,INCLUDES) +AC_DEFUN([AC_HAVE_TYPE], [ +AC_REQUIRE([AC_HEADER_STDC]) +cv=`echo "$1" | sed 'y%./+- %__p__%'` +AC_MSG_CHECKING(for $1) +AC_CACHE_VAL([ac_cv_type_$cv], +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#if STDC_HEADERS +#include +#include +#endif +$2]], +[[$1 foo;]])], +[eval "ac_cv_type_$cv=yes"], +[eval "ac_cv_type_$cv=no"]))dnl +ac_foo=`eval echo \\$ac_cv_type_$cv` +AC_MSG_RESULT($ac_foo) +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo $1 | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + AC_CHECK_TYPES($1) +fi + AC_DEFINE_UNQUOTED($ac_tr_hdr, 1, [Define if you have type `$1']) +fi +]) diff --git a/crypto/heimdal/cf/have-types.m4 b/crypto/heimdal/cf/have-types.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/have-types.m4 @@ -0,0 +1,12 @@ +dnl +dnl $Id$ +dnl + +AC_DEFUN([AC_HAVE_TYPES], [ +for i in $1; do + AC_HAVE_TYPE($i) +done +if false;then + AC_CHECK_FUNCS($1) +fi +]) diff --git a/crypto/heimdal/cf/install-catman.sh b/crypto/heimdal/cf/install-catman.sh new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/install-catman.sh @@ -0,0 +1,74 @@ +#!/bin/sh +# +# $Id$ +# +# install preformatted manual pages + +cmd="$1"; shift +INSTALL_DATA="$1"; shift +mkinstalldirs="$1"; shift +srcdir="$1"; shift +manbase="$1"; shift +suffix="$1"; shift +catinstall="${INSTALL_CATPAGES-yes}" + +for f in "$@"; do + echo $f + base=`echo "$f" | sed 's~\.[^.]*$~~; s~.*/~~'` + section=`echo "$f" | sed 's/^[^.]*\.//'` + mandir="$manbase/man$section" + catdir="$manbase/cat$section" + c="$base.cat$section" + + if test "$catinstall" = yes -a -f "$srcdir/$c"; then + if test "$cmd" = install ; then + if test \! -d "$catdir"; then + eval "$mkinstalldirs $catdir" + fi + eval "echo $INSTALL_DATA $srcdir/$c $catdir/$base.$suffix" + eval "$INSTALL_DATA $srcdir/$c $catdir/$base.$suffix" + elif test "$cmd" = uninstall ; then + eval "echo rm -f $catdir/$base.$suffix" + eval "rm -f $catdir/$base.$suffix" + fi + fi + for link in `sed -n -e '/SYNOPSIS/q;/DESCRIPTION/q;s/^\.Nm \([^ ]*\).*/\1/p' $srcdir/$f`; do + if test "$link" = "$base" ; then + continue + fi + if test "$cmd" = install ; then + target="$mandir/$link.$section" + for lncmd in "ln -f $mandir/$base.$section $target" \ + "ln -s $base.$section $target" \ + "cp -f $mandir/$base.$section $target" + do + if eval "$lncmd"; then + eval echo "$lncmd" + break + fi + done + if test "$catinstall" = yes -a -f "$srcdir/$c"; then + eval target="$catdir/$link.$suffix" + eval source="$catdir/$base.$suffix" + for lncmd in "ln -f $source $target" \ + "ln -fs $source $target" \ + "cp -f $catdir/$source $target" + do + if eval "$lncmd"; then + eval echo "$lncmd" + break + fi + done + fi + elif test "$cmd" = uninstall ; then + target="$mandir/$link.$section" + eval "echo rm -f $target" + eval "rm -f $target" + if test "$catinstall" = yes; then + target="$catdir/$link.$suffix" + eval "echo rm -f $target" + eval "rm -f $target" + fi + fi + done +done diff --git a/crypto/heimdal/cf/irix.m4 b/crypto/heimdal/cf/irix.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/irix.m4 @@ -0,0 +1,15 @@ +dnl +dnl $Id$ +dnl + +AC_DEFUN([rk_IRIX], +[ +irix=no +case "$host" in +*-*-irix*) + irix=yes + ;; +esac +AM_CONDITIONAL(IRIX, test "$irix" != no)dnl + +]) diff --git a/crypto/heimdal/cf/krb-bigendian.m4 b/crypto/heimdal/cf/krb-bigendian.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-bigendian.m4 @@ -0,0 +1,62 @@ +dnl +dnl $Id$ +dnl + +dnl check if this computer is little or big-endian +dnl if we can figure it out at compile-time then don't define the cpp symbol +dnl otherwise test for it and define it. also allow options for overriding +dnl it when cross-compiling + +AC_DEFUN([KRB_C_BIGENDIAN], [ +AC_ARG_ENABLE(bigendian, + AS_HELP_STRING([--enable-bigendian],[the target is big endian]), +krb_cv_c_bigendian=yes) +AC_ARG_ENABLE(littleendian, + AS_HELP_STRING([--enable-littleendian],[the target is little endian]), +krb_cv_c_bigendian=no) +AC_CACHE_CHECK([whether byte order is known at compile time], +krb_cv_c_bigendian_compile, +[AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif]])],[krb_cv_c_bigendian_compile=yes],[krb_cv_c_bigendian_compile=no])]) +AC_CACHE_CHECK(whether byte ordering is bigendian, krb_cv_c_bigendian,[ + if test "$krb_cv_c_bigendian_compile" = "yes"; then + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif]])],[krb_cv_c_bigendian=yes],[krb_cv_c_bigendian=no]) + else + AC_RUN_IFELSE([AC_LANG_SOURCE([[main (int argc, char **argv) { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); + }]])],[krb_cv_c_bigendian=no],[krb_cv_c_bigendian=yes], + [AC_MSG_ERROR([specify either --enable-bigendian or --enable-littleendian])]) + fi +]) +if test "$krb_cv_c_bigendian" = "yes"; then + AC_DEFINE(WORDS_BIGENDIAN, 1, [define if target is big endian])dnl +fi +if test "$krb_cv_c_bigendian_compile" = "yes"; then + AC_DEFINE(ENDIANESS_IN_SYS_PARAM_H, 1, [define if sys/param.h defines the endiness])dnl +fi +AH_BOTTOM([ +#ifdef ENDIANESS_IN_SYS_PARAM_H +# include +# include +# if BYTE_ORDER == BIG_ENDIAN +# define WORDS_BIGENDIAN 1 +# endif +#endif +]) +]) diff --git a/crypto/heimdal/cf/krb-func-getcwd-broken.m4 b/crypto/heimdal/cf/krb-func-getcwd-broken.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-func-getcwd-broken.m4 @@ -0,0 +1,41 @@ +dnl $Id$ +dnl +dnl +dnl test for broken getcwd in (SunOS braindamage) +dnl + +AC_DEFUN([AC_KRB_FUNC_GETCWD_BROKEN], [ +if test "$ac_cv_func_getcwd" = yes; then +AC_MSG_CHECKING(if getcwd is broken) +AC_CACHE_VAL(ac_cv_func_getcwd_broken, [ +ac_cv_func_getcwd_broken=no + +AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +char *getcwd(char*, int); + +void *popen(char *cmd, char *mode) +{ + errno = ENOTTY; + return 0; +} + +int main(int argc, char **argv) +{ + char *ret; + ret = getcwd(0, 1024); + if(ret == 0 && errno == ENOTTY) + return 0; + return 1; +} +]])], [ac_cv_func_getcwd_broken=yes],[:],[:]) +]) +if test "$ac_cv_func_getcwd_broken" = yes; then + AC_DEFINE(BROKEN_GETCWD, 1, [Define if getcwd is broken (like in SunOS 4).])dnl + AC_LIBOBJ(getcwd) + AC_MSG_RESULT($ac_cv_func_getcwd_broken) +else + AC_MSG_RESULT([seems ok]) +fi +fi +]) diff --git a/crypto/heimdal/cf/krb-func-getlogin.m4 b/crypto/heimdal/cf/krb-func-getlogin.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-func-getlogin.m4 @@ -0,0 +1,22 @@ +dnl +dnl $Id$ +dnl +dnl test for POSIX (broken) getlogin +dnl + + +AC_DEFUN([AC_FUNC_GETLOGIN], [ +AC_CHECK_FUNCS(getlogin setlogin) +if test "$ac_cv_func_getlogin" = yes; then +AC_CACHE_CHECK(if getlogin is posix, ac_cv_func_getlogin_posix, [ +if test "$ac_cv_func_getlogin" = yes -a "$ac_cv_func_setlogin" = yes; then + ac_cv_func_getlogin_posix=no +else + ac_cv_func_getlogin_posix=yes +fi +]) +if test "$ac_cv_func_getlogin_posix" = yes; then + AC_DEFINE(POSIX_GETLOGIN, 1, [Define if getlogin has POSIX flavour (and not BSD).]) +fi +fi +]) diff --git a/crypto/heimdal/cf/krb-ipv6.m4 b/crypto/heimdal/cf/krb-ipv6.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-ipv6.m4 @@ -0,0 +1,154 @@ +dnl $Id$ +dnl +dnl test for IPv6 +dnl +ac_cv_lib_ipv6=check + +AC_DEFUN([AC_KRB_IPV6], [ +AC_ARG_WITH(ipv6, + AS_HELP_STRING([--without-ipv6],[do not enable IPv6 support]),[ + ac_cv_lib_ipv6="$withval" +]) +save_CFLAGS="${CFLAGS}" + +if test "X$ac_cv_lib_ipv6" != "Xno"; then + + AC_CACHE_CHECK([for IPv6 stack type], rk_cv_v6type, + [dnl check for different v6 implementations (by itojun) + v6type=unknown + v6lib=none + + for i in v6d toshiba kame inria zeta linux; do + case $i in + v6d) + AC_EGREP_CPP(yes, [ +#include +#ifdef __V6D__ +yes +#endif], + [v6type=$i; v6lib=v6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-I/usr/local/v6/include $CFLAGS"]) + ;; + toshiba) + AC_EGREP_CPP(yes, [ +#include +#ifdef _TOSHIBA_INET6 +yes +#endif], + [v6type=$i; v6lib=inet6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-DINET6 $CFLAGS"]) + ;; + kame) + AC_EGREP_CPP(yes, [ +#include +#ifdef __KAME__ +yes +#endif], + [v6type=$i; v6lib=inet6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-DINET6 $CFLAGS"]) + ;; + inria) + AC_EGREP_CPP(yes, [ +#include +#ifdef IPV6_INRIA_VERSION +yes +#endif], + [v6type=$i; CFLAGS="-DINET6 $CFLAGS"]) + ;; + zeta) + AC_EGREP_CPP(yes, [ +#include +#ifdef _ZETA_MINAMI_INET6 +yes +#endif], + [v6type=$i; v6lib=inet6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-DINET6 $CFLAGS"]) + ;; + linux) + if test -d /usr/inet6; then + v6type=$i + v6lib=inet6 + v6libdir=/usr/inet6 + CFLAGS="-DINET6 $CFLAGS" + fi + ;; + esac + if test "$v6type" != "unknown"; then + break + fi + done + + if test "$v6lib" != "none"; then + for dir in $v6libdir /usr/local/v6/lib /usr/local/lib; do + if test -d $dir -a -f $dir/lib$v6lib.a; then + LIBS="-L$dir -l$v6lib $LIBS" + break + fi + done + fi]) + + AC_CACHE_CHECK([for IPv6], rk_cv_lib_ipv6, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +]], + [[ + struct sockaddr_in6 sin6; + int s; + + s = socket(AF_INET6, SOCK_DGRAM, 0); + + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(17); + sin6.sin6_addr = in6addr_any; + bind(s, (struct sockaddr *)&sin6, sizeof(sin6)); +]])], + [ac_cv_lib_ipv6=yes], + [ac_cv_lib_ipv6=no])]) +fi + +if test "$ac_cv_lib_ipv6" = yes; then + AC_DEFINE(HAVE_IPV6, 1, [Define if you have IPv6.]) +else + CFLAGS="${save_CFLAGS}" +fi + +## test for AIX missing in6addr_loopback +if test "$ac_cv_lib_ipv6" = yes; then + AC_CACHE_CHECK([for in6addr_loopback],[rk_cv_var_in6addr_loopback],[ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif]],[[ +struct sockaddr_in6 sin6; +sin6.sin6_addr = in6addr_loopback; +]])],[ac_cv_var_in6addr_loopback=yes],[ac_cv_var_in6addr_loopback=no])]) + if test "$ac_cv_var_in6addr_loopback" = yes; then + AC_DEFINE(HAVE_IN6ADDR_LOOPBACK, 1, + [Define if you have the in6addr_loopback variable]) + fi +fi +]) \ No newline at end of file diff --git a/crypto/heimdal/cf/krb-prog-ln-s.m4 b/crypto/heimdal/cf/krb-prog-ln-s.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-prog-ln-s.m4 @@ -0,0 +1,28 @@ +dnl $Id$ +dnl +dnl +dnl Better test for ln -s, ln or cp +dnl + +AC_DEFUN([AC_KRB_PROG_LN_S], +[AC_MSG_CHECKING(for ln -s or something else) +AC_CACHE_VAL(ac_cv_prog_LN_S, +[rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + touch conftestdata1 + if ln conftestdata1 conftestdata2; then + rm -f conftestdata* + ac_cv_prog_LN_S=ln + else + ac_cv_prog_LN_S=cp + fi +fi])dnl +LN_S="$ac_cv_prog_LN_S" +AC_MSG_RESULT($ac_cv_prog_LN_S) +AC_SUBST(LN_S)dnl +]) + diff --git a/crypto/heimdal/cf/krb-prog-perl.m4 b/crypto/heimdal/cf/krb-prog-perl.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-prog-perl.m4 @@ -0,0 +1,21 @@ +dnl +dnl perl and some of its module are required to build some headers +dnl + +AC_DEFUN([AC_KRB_PROG_PERL], +[AC_CHECK_PROGS(PERL, perl, perl) +if test "$PERL" = ""; then + AC_MSG_ERROR([perl not found - Cannot build Heimdal without perl]) +fi +]) + +AC_DEFUN([AC_KRB_PERL_MOD], +[ +AC_MSG_CHECKING([for Perl5 module $1]) +if ! $PERL -M$1 -e 'exit(0);' >/dev/null 2>&1; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([perl module $1 not found - Cannot build Heimdal without perl module $1]) +else + AC_MSG_RESULT([yes]) +fi +]) diff --git a/crypto/heimdal/cf/krb-prog-ranlib.m4 b/crypto/heimdal/cf/krb-prog-ranlib.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-prog-ranlib.m4 @@ -0,0 +1,8 @@ +dnl $Id$ +dnl +dnl +dnl Also look for EMXOMF for OS/2 +dnl + +AC_DEFUN([AC_KRB_PROG_RANLIB], +[AC_CHECK_PROGS(RANLIB, ranlib EMXOMF, :)]) diff --git a/crypto/heimdal/cf/krb-prog-yacc.m4 b/crypto/heimdal/cf/krb-prog-yacc.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-prog-yacc.m4 @@ -0,0 +1,12 @@ +dnl $Id$ +dnl +dnl +dnl We prefer byacc or yacc because they do not use `alloca' +dnl + +AC_DEFUN([AC_KRB_PROG_YACC], +[AC_CHECK_PROGS(YACC, byacc yacc 'bison -y') +if test "$YACC" = ""; then + AC_MSG_WARN([yacc not found - some stuff will not build]) +fi +]) diff --git a/crypto/heimdal/cf/krb-readline.m4 b/crypto/heimdal/cf/krb-readline.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-readline.m4 @@ -0,0 +1,28 @@ +dnl $Id$ +dnl +dnl Tests for readline functions +dnl + +dnl el_init + +AC_DEFUN([KRB_READLINE],[ + +dnl readline + +ac_foo=no +build_editline=no +if test "$with_readline" = yes; then + : +elif test "$with_libedit" = yes; then + LIB_readline="${LIB_libedit}" +elif test "$ac_cv_func_readline" = yes; then + : +else + build_libedit=yes + LIB_readline="\$(top_builddir)/lib/libedit/src/libheimedit.la \$(LIB_tgetent)" +fi +AM_CONDITIONAL(LIBEDIT, test "$build_libedit" = yes) +AC_DEFINE(HAVE_READLINE, 1, + [Define if you have a readline compatible library.])dnl + +]) diff --git a/crypto/heimdal/cf/krb-struct-spwd.m4 b/crypto/heimdal/cf/krb-struct-spwd.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-struct-spwd.m4 @@ -0,0 +1,21 @@ +dnl $Id$ +dnl +dnl Test for `struct spwd' + +AC_DEFUN([AC_KRB_STRUCT_SPWD], [ +AC_MSG_CHECKING(for struct spwd) +AC_CACHE_VAL(ac_cv_struct_spwd, [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#ifdef HAVE_SHADOW_H +#include +#endif]],[[struct spwd foo;]])], +[ac_cv_struct_spwd=yes], +[ac_cv_struct_spwd=no]) +]) +AC_MSG_RESULT($ac_cv_struct_spwd) + +if test "$ac_cv_struct_spwd" = "yes"; then + AC_DEFINE(HAVE_STRUCT_SPWD, 1, [define if you have struct spwd]) +fi +]) diff --git a/crypto/heimdal/cf/krb-struct-winsize.m4 b/crypto/heimdal/cf/krb-struct-winsize.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-struct-winsize.m4 @@ -0,0 +1,25 @@ +dnl $Id$ +dnl +dnl +dnl Search for struct winsize +dnl + +AC_DEFUN([AC_KRB_STRUCT_WINSIZE], [ +AC_MSG_CHECKING(for struct winsize) +AC_CACHE_VAL(ac_cv_struct_winsize, [ +ac_cv_struct_winsize=no +for i in sys/termios.h sys/ioctl.h; do +AC_EGREP_HEADER( +struct[[ ]]*winsize,dnl +$i, ac_cv_struct_winsize=yes; break)dnl +done +]) +if test "$ac_cv_struct_winsize" = "yes"; then + AC_DEFINE(HAVE_STRUCT_WINSIZE, 1, [define if struct winsize is declared in sys/termios.h]) +fi +AC_MSG_RESULT($ac_cv_struct_winsize) +AC_EGREP_HEADER(ws_xpixel, termios.h, + AC_DEFINE(HAVE_WS_XPIXEL, 1, [define if struct winsize has ws_xpixel])) +AC_EGREP_HEADER(ws_ypixel, termios.h, + AC_DEFINE(HAVE_WS_YPIXEL, 1, [define if struct winsize has ws_ypixel])) +]) diff --git a/crypto/heimdal/cf/krb-sys-aix.m4 b/crypto/heimdal/cf/krb-sys-aix.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-sys-aix.m4 @@ -0,0 +1,15 @@ +dnl $Id$ +dnl +dnl +dnl AIX have a very different syscall convention +dnl +AC_DEFUN([AC_KRB_SYS_AIX], [ +AC_MSG_CHECKING(for AIX) +AC_CACHE_VAL(krb_cv_sys_aix, +AC_EGREP_CPP(yes, +[#ifdef _AIX + yes +#endif +], krb_cv_sys_aix=yes, krb_cv_sys_aix=no) ) +AC_MSG_RESULT($krb_cv_sys_aix) +]) diff --git a/crypto/heimdal/cf/krb-sys-nextstep.m4 b/crypto/heimdal/cf/krb-sys-nextstep.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-sys-nextstep.m4 @@ -0,0 +1,18 @@ +dnl $Id$ +dnl +dnl NEXTSTEP is not posix compliant by default, +dnl you need a switch -posix to the compiler +dnl + +AC_DEFUN([rk_SYS_NEXTSTEP], [ +AC_CACHE_CHECK(for NeXTSTEP, rk_cv_sys_nextstep, [ +AC_EGREP_CPP(yes, +[#if defined(NeXT) && !defined(__APPLE__) + yes +#endif +], rk_cv_sys_nextstep=yes, rk_cv_sys_nextstep=no)]) +if test "$rk_cv_sys_nextstep" = "yes"; then + CFLAGS="$CFLAGS -posix" + LIBS="$LIBS -posix" +fi +]) diff --git a/crypto/heimdal/cf/krb-version.m4 b/crypto/heimdal/cf/krb-version.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/krb-version.m4 @@ -0,0 +1,24 @@ +dnl $Id$ +dnl +dnl +dnl output a C header-file with some version strings +dnl + +AC_DEFUN([AC_KRB_VERSION],[ +cat > include/newversion.h.in </dev/null | sed 1q` + Date=`date` + mv -f include/newversion.h.in include/version.h.in + sed -e "s/@USER@/$User/" -e "s/@HOST@/$Host/" -e "s/@DATE@/$Date/" include/version.h.in > include/version.h +fi +]) diff --git a/crypto/heimdal/cf/largefile.m4 b/crypto/heimdal/cf/largefile.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/largefile.m4 @@ -0,0 +1,16 @@ +dnl $Id$ +dnl +dnl Figure out what flags we need for 64-bit file access, and also set +dnl them on the command line. +dnl +AC_DEFUN([rk_SYS_LARGEFILE],[ +AC_REQUIRE([AC_SYS_LARGEFILE])dnl +dnl need to set this on the command line, since it might otherwise break +dnl with generated code, such as lex +if test "$enable_largefile" != no -a "$ac_cv_sys_large_files" != no; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files" +fi +if test "$enable_largefile" != no -a "$ac_cv_sys_file_offset_bits" != no; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi +]) diff --git a/crypto/heimdal/cf/libtool.m4 b/crypto/heimdal/cf/libtool.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/libtool.m4 @@ -0,0 +1,8403 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2019, 2021-2022 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) 2014 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 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 this program. If not, see . +]) + +# serial 59 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.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +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_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _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_DECL_FILECMD])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 +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that 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 set != "${COLLECT_NAMES+set}"; 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 and +# ICC, which need '.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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + 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 0 = "$lt_write_fail" && 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 yes = "$silent" && + 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 that 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 +# Generated automatically by $as_me ($PACKAGE) $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. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_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 set != "${COLLECT_NAMES+set}"; 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) + + 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' + 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 0 = "$_lt_result"; 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 $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR $AR_FLAGS 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 0 = "$_lt_result" && $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*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; 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 yes != "$lt_cv_apple_cc_single_mod"; 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 set = "${lt_cv_aix_libpath+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 that will find a shell with a builtin +# printf (that 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], +[m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--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 yes = "$GCC"; 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 where 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 no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `$FILECMD conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `$FILECMD 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* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `$FILECMD conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `$FILECMD conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + 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" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + 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 yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `$FILECMD conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-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} +_LT_DECL([], [AR], [1], [The archiver]) + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS +_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. +_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], + [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 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; 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 + bitrig* | 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" ## exclude from sc_useless_quotes_in_assignment + # 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 yes = "[$]$2"; 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 yes = "[$]$2"; 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; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) + # 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" && \ + test undefined != "$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 17 != "$i" # 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 yes = "$cross_compiling"; 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 -fvisibility=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 yes != "$enable_dlopen"; 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 + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + 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 no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && 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 yes = "$lt_cv_dlopen_self"; 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 no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; 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 no = "$hard_links"; 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 where 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 yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; 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 relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; 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 -z "$STRIP"; then + AC_MSG_RESULT([no]) +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac + fi +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _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 +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; 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` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + 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" + elif test -n "$lt_multi_os_dir"; then + 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 + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +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 ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # 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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + 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%'\''`; $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* | *,icl*) + # Native MSVC or ICC + 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 and ICC 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* | midnightbsd*) + # 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$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + 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 + ;; + +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=no + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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 yes = "$lt_cv_prog_gnu_ld"; 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | 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 + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) 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="$sys_lib_dlsearch_path_spec $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* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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' + ;; + +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 yes = "$with_gnu_ld"; 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=sco + 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_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], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that 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 that 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 no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that 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='$FILECMD -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. + if ( 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* | midnightbsd*) + 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=$FILECMD + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=$FILECMD + 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 | 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=$FILECMD + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + ;; +os2*) + 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 + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + 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 no != "$lt_cv_path_NM"; 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 -headers /dev/null 2>&1 | $SED '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + 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 one 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 yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; 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 + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# 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"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$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"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, + # 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};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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 yes = "$pipe_works"; 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_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_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_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_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 yes = "$GXX"; 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + 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']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + 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 ia64 = "$host_cpu"; 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* | midnightbsd*) + # 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 ia64 != "$host_cpu"; 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 | 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + 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']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + 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 ia64 = "$host_cpu"; 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 + ;; + + 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' + case $cc_basename in + 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' + ;; + esac + ;; + + 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']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + 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 | 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' + ;; + tcc*) + # Fabrice Bellard et al's Tiny 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)='-static' + ;; + 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 that 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl* | icl*) + _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++ and ICC port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/([[^)]]\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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 + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + ;; + + 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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" + 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' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + 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 yes = "$supports_anon_versioning"; 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 cannot +*** 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 no = "$_LT_TAGVAR(ld_shlibs, $1)"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + 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++ or Intel C++ Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC + _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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 and ICC 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* | midnightbsd*) + _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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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 + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + 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* | bitrig*) + 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__`"; 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 + _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' + 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 + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + ;; + + osf3*) + if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes,yes = "$GCC,$enable_shared"; 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 what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || 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 no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); 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 yes != "$_lt_caught_CXX_error"; 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 yes = "$GXX"; 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 yes = "$GXX"; 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 yes = "$with_gnu_ld"; 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 ia64 = "$host_cpu"; 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + 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 + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + 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* | ,icl* | no,icl*) + # Native MSVC or ICC + # 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $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* | midnightbsd*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + 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 "x$output_objdir/$soname" = "x$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 yes = "$GXX"; 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 "x$output_objdir/$soname" = "x$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 no = "$with_gnu_ld"; 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 yes = "$GXX"; then + if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then + if test no = "$with_gnu_ld"; 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 | 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 yes = "$supports_anon_versioning"; 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 + ;; + + openbsd* | bitrig*) + 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__`"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 $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 $wl-h $wl$soname -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 $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 $wl-h $wl$soname -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 CANNOT 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes != "$_lt_caught_CXX_error" + +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 @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@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 x-L = "$p" || + test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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)= + ;; +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 no = "$F77"; 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 yes != "$_lt_disable_F77"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_F77" + +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 no = "$FC"; 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 yes != "$_lt_disable_FC"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_FC" + +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 set = "${GCJFLAGS+set}" || 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_FILECMD +# ---------------- +# Check for a file(cmd) program that can be used to detect file type and magic +m4_defun([_LT_DECL_FILECMD], +[AC_CHECK_TOOL([FILECMD], [file], [:]) +_LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) +])# _LD_DECL_FILECMD + +# _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 10 -lt "$lt_ac_count" && 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], +[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_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what 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 diff --git a/crypto/heimdal/cf/ltoptions.m4 b/crypto/heimdal/cf/ltoptions.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 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 8 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_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _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_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _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=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])]) diff --git a/crypto/heimdal/cf/ltsugar.m4 b/crypto/heimdal/cf/ltsugar.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 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 +]) diff --git a/crypto/heimdal/cf/ltversion.m4 b/crypto/heimdal/cf/ltversion.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/ltversion.m4 @@ -0,0 +1,24 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2019, 2021-2022 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 4245 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.7]) +m4_define([LT_PACKAGE_REVISION], [2.4.7]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.7' +macro_revision='2.4.7' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/crypto/heimdal/cf/lt~obsolete.m4 b/crypto/heimdal/cf/lt~obsolete.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 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])]) diff --git a/crypto/heimdal/cf/make-proto.pl b/crypto/heimdal/cf/make-proto.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/make-proto.pl @@ -0,0 +1,488 @@ +# Make prototypes from .c files +# $Id$ + +use Getopt::Std; +use File::Compare; + +use JSON; + +my $comment = 0; +my $doxygen = 0; +my $funcdoc = 0; +my $if_0 = 0; +my $brace = 0; +my $line = ""; +my $debug = 0; +my $oproto = 1; +my $private_func_re = "^_"; +my %depfunction; +my %exported; +my %deprecated; +my $apple = 0; +my %documentation; + +getopts('x:m:o:p:dqE:R:P:') || die "foo"; +if($opt_a) { + $apple = 1; +} + +if($opt_a) { + $apple = 1; +} + +if($opt_d) { + $debug = 1; +} + +if($opt_q) { + $oproto = 0; +} + +if($opt_R) { + $private_func_re = $opt_R; +} +my %flags = ( + 'multiline-proto' => 1, + 'header' => 1, + 'function-blocking' => 0, + 'gnuc-attribute' => 1, + 'cxx' => 1 + ); +if($opt_m) { + foreach $i (split(/,/, $opt_m)) { + if($i eq "roken") { + $flags{"multiline-proto"} = 0; + $flags{"header"} = 0; + $flags{"function-blocking"} = 0; + $flags{"gnuc-attribute"} = 0; + $flags{"cxx"} = 0; + } else { + if(substr($i, 0, 3) eq "no-") { + $flags{substr($i, 3)} = 0; + } else { + $flags{$i} = 1; + } + } + } +} + +if($opt_x) { + my $EXP; + local $/; + open(EXP, '<', $opt_x) || die "open ${opt_x}"; + my $obj = JSON->new->utf8->decode(); + close $EXP; + + foreach my $x (keys %$obj) { + if (defined $obj->{$x}->{"export"}) { + $exported{$x} = $obj->{$x}; + } + if (defined $obj->{$x}->{"deprecated"}) { + $deprecated{$x} = $obj->{$x}->{"deprecated"}; + } + } +} + +while(<>) { + print $brace, " ", $_ if($debug); + + # Handle C comments + s@/\*.*\*/@@; + s@//.*/@@; + if ( s@/\*\*(.*)@@) { $comment = 1; $doxygen = 1; $funcdoc = $1; + } elsif ( s@/\*.*@@) { $comment = 1; + } elsif ($comment && s@.*\*/@@) { $comment = 0; $doxygen = 0; + } elsif ($doxygen) { $funcdoc .= $_; next; + } elsif ($comment) { next; } + + if(/^\#if 0/) { + $if_0 = 1; + } + if($if_0 && /^\#endif/) { + $if_0 = 0; + } + if($if_0) { next } + if(/^\s*\#/) { + next; + } + if(/^\s*$/) { + $line = ""; + next; + } + if(/\{/){ + if (!/\}/) { + $brace++; + } + $_ = $line; + while(s/\*\//\ca/){ + s/\/\*(.|\n)*\ca//; + } + s/^\s*//; + s/\s*$//; + s/\s+/ /g; + if($_ =~ /\)$/){ + if(!/^static/ && !/^PRIVATE/){ + $attr = ""; + if(m/(.*)(__attribute__\s?\(.*\))/) { + $attr .= " $2"; + $_ = $1; + } + if(m/(.*)\s(\w+DEPRECATED_FUNCTION)\s?(\(.*\))(.*)/) { + $depfunction{$2} = 1; + $attr .= " $2$3"; + $_ = "$1 $4"; + } + if(m/(.*)\s(\w+DEPRECATED)(.*)/) { + $attr .= " $2"; + $_ = "$1 $3"; + } + if(m/(.*)\s(HEIMDAL_\w+_ATTRIBUTE)\s?(\(.*\))?(.*)/) { + $attr .= " $2$3"; + $_ = "$1 $4"; + } + # remove outer () + s/\s*\(//; + # remove , within () + while(s/\(([^()]*),(.*)\)/($1\$$2)/g){} + s/\<\s*void\s*\>/<>/; + # remove parameter names + if($opt_P eq "remove") { + s/(\s*)([a-zA-Z0-9_]+)([,>])/$3/g; + s/\s+\*/*/g; + s/\(\*(\s*)([a-zA-Z0-9_]+)\)/(*)/g; + } elsif($opt_P eq "comment") { + s/([a-zA-Z0-9_]+)([,>])/\/\*$1\*\/$2/g; + s/\(\*([a-zA-Z0-9_]+)\)/(*\/\*$1\*\/)/g; + } + s/\<\>//; + # add newlines before parameters + if($flags{"multiline-proto"}) { + s/,\s*/,\n\t/g; + } else { + s/,\s*/, /g; + } + # fix removed , + s/\$/,/g; + # match function name + /([a-zA-Z0-9_]+)\s*\/$RP/; + # insert newline before function name + if($flags{"multiline-proto"}) { + s/(.*)\s([a-zA-Z0-9_]+ \Q$LP\E)/$1\n$2/; + } + if($attr ne "") { + $_ .= "\n $attr"; + } + if ($funcdoc) { + $documentation{$f} = $funcdoc; + } + $funcdoc = undef; + if ($apple && exists $exported{$f}) { + $ios = $exported{$f}{ios}; + $ios = "NA" if (!defined $ios); + $mac = $exported{$f}{macos}; + $mac = "NA" if (!defined $mac); + die "$f neither" if ($mac eq "NA" and $ios eq "NA"); + $_ = $_ . " __OSX_AVAILABLE_STARTING(__MAC_${mac}, __IPHONE_${ios})"; + } + if (exists $deprecated{$f}) { + $_ = $_ . " GSSAPI_DEPRECATED_FUNCTION(\"$deprecated{$f}\")"; + $depfunction{GSSAPI_DEPRECATED_FUNCTION} = 1; + } + $_ = $_ . ";"; + $funcs{$f} = $_; + } + } + $line = ""; + } + if(/\}/){ + $brace--; + } + if(/^\}/){ + $brace = 0; + } + if($brace == 0) { + $line = $line . " " . $_; + } +} + +die "reached end of code and still in doxygen comment" if ($doxygen); +die "reached end of code and still in comment" if ($comment); + +sub foo { + local ($arg) = @_; + $_ = $arg; + s/.*\/([^\/]*)/$1/; + s/.*\\([^\\]*)/$1/; + s/[^a-zA-Z0-9]/_/g; + "__" . $_ . "__"; +} + +if($opt_o) { + open(OUT, ">${opt_o}.new"); + $block = &foo($opt_o); +} else { + $block = "__public_h__"; +} + +if($opt_p) { + open(PRIV, ">${opt_p}.new"); + $private = &foo($opt_p); +} else { + $private = "__private_h__"; +} + +$public_h = ""; +$private_h = ""; + +$public_h_header .= "/* This is a generated file */ +#ifndef $block +#define $block +#ifndef DOXY + +"; +if ($oproto) { + $public_h_header .= "#ifdef __STDC__ +#include +#ifndef __P +#define __P(x) x +#endif +#else +#ifndef __P +#define __P(x) () +#endif +#endif + +"; +} else { + $public_h_header .= "#include + +"; +} +$public_h_trailer = ""; + +$private_h_header = "/* This is a generated file */ +#ifndef $private +#define $private + +"; +if($oproto) { + $private_h_header .= "#ifdef __STDC__ +#include +#ifndef __P +#define __P(x) x +#endif +#else +#ifndef __P +#define __P(x) () +#endif +#endif + +"; +} else { + $private_h_header .= "#include + +"; +} +$private_h_trailer = ""; + + +foreach(sort keys %funcs){ + if(/^(DllMain|main)$/) { next } + if ($funcs{$_} =~ /\^/) { + $beginblock = "#ifdef __BLOCKS__\n"; + $endblock = "#endif /* __BLOCKS__ */\n"; + } else { + $beginblock = $endblock = ""; + } + # if we have an export table and doesn't have content, or matches private RE + if((scalar(keys(%exported)) ne 0 && !exists $exported{$_} ) || /$private_func_re/) { + $private_h .= $beginblock; +# if ($apple and not /$private_func_re/) { +# $private_h .= "#define $_ __ApplePrivate_${_}\n"; +# } + $private_h .= $funcs{$_} . "\n" ; + $private_h .= $endblock . "\n"; + if($funcs{$_} =~ /__attribute__/) { + $private_attribute_seen = 1; + } + } else { + if($documentation{$_}) { + $public_h .= "/**\n"; + $public_h .= "$documentation{$_}"; + $public_h .= " */\n\n"; + } + if($flags{"function-blocking"}) { + $fupper = uc $_; + if($exported{$_} =~ /proto/) { + $public_h .= "#if !defined(HAVE_$fupper) || defined(NEED_${fupper}_PROTO)\n"; + } else { + $public_h .= "#ifndef HAVE_$fupper\n"; + } + } + $public_h .= $beginblock . $funcs{$_} . "\n" . $endblock; + if($funcs{$_} =~ /__attribute__/) { + $public_attribute_seen = 1; + } + if($flags{"function-blocking"}) { + $public_h .= "#endif\n"; + } + $public_h .= "\n"; + } +} + +if($flags{"gnuc-attribute"}) { + if ($public_attribute_seen) { + $public_h_header .= "#if !defined(__GNUC__) && !defined(__attribute__) +#define __attribute__(x) +#endif + +"; + } + + if ($private_attribute_seen) { + $private_h_header .= "#if !defined(__GNUC__) && !defined(__attribute__) +#define __attribute__(x) +#endif + +"; + } +} + +my $depstr = ""; +my $undepstr = ""; +foreach (keys %depfunction) { + $depstr .= "#ifndef $_ +#ifndef __has_extension +#define __has_extension(x) 0 +#define ${_}has_extension 1 +#endif +#if __has_extension(attribute_deprecated_with_message) +#define $_(x) __attribute__((__deprecated__(x))) +#elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 ))) +#define $_(X) __attribute__((__deprecated__)) +#else +#define $_(X) +#endif +#ifdef ${_}has_extension +#undef __has_extension +#undef ${_}has_extension +#endif +#endif /* $_ */ + + +"; + $public_h_trailer .= "#undef $_ + +"; + $private_h_trailer .= "#undef $_ +#define $_(X) + +"; +} + +$public_h_header .= $depstr; +$private_h_header .= $depstr; + + +if($flags{"cxx"}) { + $public_h_header .= "#ifdef __cplusplus +extern \"C\" { +#endif + +"; + $public_h_trailer = "#ifdef __cplusplus +} +#endif + +" . $public_h_trailer; + +} +if ($opt_E) { + $public_h_header .= "#ifndef $opt_E +#ifndef ${opt_E}_FUNCTION +#if defined(_WIN32) +#define ${opt_E}_FUNCTION __declspec(dllimport) +#define ${opt_E}_CALL __stdcall +#define ${opt_E}_VARIABLE __declspec(dllimport) +#else +#define ${opt_E}_FUNCTION +#define ${opt_E}_CALL +#define ${opt_E}_VARIABLE +#endif +#endif +#endif +"; + + $private_h_header .= "#ifndef $opt_E +#ifndef ${opt_E}_FUNCTION +#if defined(_WIN32) +#define ${opt_E}_FUNCTION __declspec(dllimport) +#define ${opt_E}_CALL __stdcall +#define ${opt_E}_VARIABLE __declspec(dllimport) +#else +#define ${opt_E}_FUNCTION +#define ${opt_E}_CALL +#define ${opt_E}_VARIABLE +#endif +#endif +#endif + +"; +} + +$public_h_trailer .= $undepstr; +$private_h_trailer .= $undepstr; + +if ($public_h ne "" && $flags{"header"}) { + $public_h = $public_h_header . $public_h . + $public_h_trailer . "#endif /* DOXY */\n#endif /* $block */\n"; +} +if ($private_h ne "" && $flags{"header"}) { + $private_h = $private_h_header . $private_h . + $private_h_trailer . "#endif /* $private */\n"; +} + +if($opt_o) { + print OUT $public_h; +} +if($opt_p) { + print PRIV $private_h; +} + +close OUT; +close PRIV; + +if ($opt_o) { + + if (compare("${opt_o}.new", ${opt_o}) != 0) { + printf("updating ${opt_o}\n"); + rename("${opt_o}.new", ${opt_o}); + } else { + unlink("${opt_o}.new"); + } +} + +if ($opt_p) { + if (compare("${opt_p}.new", ${opt_p}) != 0) { + printf("updating ${opt_p}\n"); + rename("${opt_p}.new", ${opt_p}); + } else { + unlink("${opt_p}.new"); + } +} diff --git a/crypto/heimdal/cf/maybe-valgrind.sh b/crypto/heimdal/cf/maybe-valgrind.sh new file mode 100755 index 0000000000000000000000000000000000000000..4077a327806bdd941721aadb9527b9a6f29f0107 GIT binary patch literal 2395 zc$~FX-*4MC5PsKRaZ?SX8SFStfemQjVX~~m#2m?!Fo6M2kM!hAL*B- zT9smzQOfTtq3$!9{Jm25vdk*Py^iHmRuZd}7P`@#*Gu$>@{sN z&1;dB>REhyXeRiujJCWtClqpFBaKIuZERne^>d?D^4V%nLZF#Id-epn1z>J0t$suN>g^lQn;m2*JcFJ z%SehY=qiZ)2_C%>o3ixIX1!o(XwqFEpGPw;Di2$Kuc9;L1>j6v=$FCwm!1iMZbJMctS=$RfAOJQ(1WtTzdTh${2biC9Z zf=>#oX52& zF@@@eJB4(J@(izFXMh2Mhn_knt?IlG_0a8{x#y(TVyWru{M=Y2ta9=DH>}?u6RsOc zZs+tZjk1E|*3O^K0G`&;X;il2c=#kV4Qv#G7B$cA?E_a?4ptR+9I>R|=+^E0(I))M zr6IYuE=cUQcP#DpExo66Gl5JA)RJi9%yeme&49&VS&E7m?#|QlaF(LY_Z{_?bda-O ziiMW4bm{#I{MJNv%wQJVN%ig^_?`PANg;(E4jiYA9sWxy>h*AA@*)4kbIexPaUQaA zRg0<^y89J;N=Vkr*F3);E}POseQX5R)cc5K)oglsR+hY0!#AhcP|bFW%iWAaHGI~t zpD+7+%rAUgtH+w-410r9C^B&APg>y;qoYe+@j5fN_u`34y}=E8qSi= 2.8 has a flag to select +# which ABI to use, but only supports (as of 2.8.1) the N32 and 64 ABIs. +# +# Default to N32, but if GCC doesn't grok -mabi=n32, we assume an old +# GCC and revert back to O32. The same goes if O32 is asked for - old +# GCCs doesn't like the -mabi option, and new GCCs can't output O32. +# +# Don't you just love *all* the different SGI ABIs? + +case "${with_mips_abi}" in + 32|o32) abi='-mabi=32'; abilibdirext='' ;; + n32|yes) abi='-mabi=n32'; abilibdirext='32' ;; + 64) abi='-mabi=64'; abilibdirext='64' ;; + no) abi=''; abilibdirext='';; + *) AC_MSG_ERROR("Invalid ABI specified") ;; +esac +if test -n "$abi" ; then +ac_foo=krb_cv_gcc_`echo $abi | tr =- __` +dnl +dnl can't use AC_CACHE_CHECK here, since it doesn't quote CACHE-ID to +dnl AC_MSG_RESULT +dnl +AC_MSG_CHECKING([if $CC supports the $abi option]) +AC_CACHE_VAL($ac_foo, [ +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $abi" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[int x;]])],[eval $ac_foo=yes], [eval $ac_foo=no])dnl +CFLAGS="$save_CFLAGS" +]) +ac_res=`eval echo \\\$$ac_foo` +AC_MSG_RESULT($ac_res) +if test $ac_res = no; then +# Try to figure out why that failed... +case $abi in + -mabi=32) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mabi=n32" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[int x;]])],[ac_res=yes],[ac_res=no])dnl + CLAGS="$save_CFLAGS" + if test $ac_res = yes; then + # New GCC + AC_MSG_ERROR([$CC does not support the $with_mips_abi ABI]) + fi + # Old GCC + abi='' + abilibdirext='' + ;; + -mabi=n32|-mabi=64) + if test $with_mips_abi = yes; then + # Old GCC, default to O32 + abi='' + abilibdirext='' + else + # Some broken GCC + AC_MSG_ERROR([$CC does not support the $with_mips_abi ABI]) + fi + ;; +esac +fi #if test $ac_res = no; then +fi #if test -n "$abi" ; then +else +case "${with_mips_abi}" in + 32|o32) abi='-32'; abilibdirext='' ;; + n32|yes) abi='-n32'; abilibdirext='32' ;; + 64) abi='-64'; abilibdirext='64' ;; + no) abi=''; abilibdirext='';; + *) AC_MSG_ERROR("Invalid ABI specified") ;; +esac +fi #if test -n "$GCC"; then +;; +esac +]) diff --git a/crypto/heimdal/cf/misc.m4 b/crypto/heimdal/cf/misc.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/misc.m4 @@ -0,0 +1,15 @@ + +dnl $Id$ +dnl +AC_DEFUN([upcase],[`echo $1 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`])dnl +AC_DEFUN([rk_LIBOBJ],[AC_LIBOBJ([$1])])dnl +AC_DEFUN([rk_CONFIG_HEADER],[AH_TOP([#ifndef RCSID +#define RCSID(msg) \ +static /**/const char *const rcsid[] = { (const char *)rcsid, "@(#)" msg } +#endif + +/* Maximum values on all known systems */ +#define MaxHostNameLen (64+4) +#define MaxPathLen (1024+4) + +])]) \ No newline at end of file diff --git a/crypto/heimdal/cf/need-proto.m4 b/crypto/heimdal/cf/need-proto.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/need-proto.m4 @@ -0,0 +1,22 @@ +dnl $Id$ +dnl +dnl +dnl Check if we need the prototype for a function +dnl + +dnl AC_NEED_PROTO(includes, function) + +AC_DEFUN([AC_NEED_PROTO], [ +if test "$ac_cv_func_$2+set" != set -o "$ac_cv_func_$2" = yes; then +AC_CACHE_CHECK([if $2 needs a prototype], ac_cv_func_$2_noproto, +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$1 +struct foo { int foo; } xx; +extern int $2 (struct foo*);]],[[$2(&xx)]])], +[eval "ac_cv_func_$2_noproto=yes"], +[eval "ac_cv_func_$2_noproto=no"])) +if test "$ac_cv_func_$2_noproto" = yes; then + AC_DEFINE(AS_TR_CPP(NEED_[]$2[]_PROTO), 1, + [define if the system is missing a prototype for $2()]) +fi +fi +]) diff --git a/crypto/heimdal/cf/osfc2.m4 b/crypto/heimdal/cf/osfc2.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/osfc2.m4 @@ -0,0 +1,14 @@ +dnl $Id$ +dnl +dnl enable OSF C2 stuff + +AC_DEFUN([AC_CHECK_OSFC2],[ +AC_ARG_ENABLE(osfc2, + AS_HELP_STRING([--enable-osfc2],[enable some OSF C2 support])) +LIB_security= +if test "$enable_osfc2" = yes; then + AC_DEFINE(HAVE_OSFC2, 1, [Define to enable basic OSF C2 support.]) + LIB_security=-lsecurity +fi +AC_SUBST(LIB_security) +]) diff --git a/crypto/heimdal/cf/otp.m4 b/crypto/heimdal/cf/otp.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/otp.m4 @@ -0,0 +1,27 @@ +dnl $Id$ +dnl +dnl check requirements for OTP library +dnl +AC_DEFUN([rk_OTP],[ +AC_REQUIRE([rk_DB])dnl +AC_ARG_ENABLE(otp, + AS_HELP_STRING([--disable-otp],[if you don't want OTP support])) +if test "$enable_otp" = yes -a "$db_type" = unknown; then + AC_MSG_ERROR([OTP requires a NDBM/DB compatible library]) +fi +if test "$enable_otp" != no; then + if test "$db_type" != unknown; then + enable_otp=yes + else + enable_otp=no + fi +fi +if test "$enable_otp" = yes; then + AC_DEFINE(OTP, 1, [Define if you want OTP support in applications.]) + LIB_otp='$(top_builddir)/lib/otp/libotp.la' + AC_SUBST(LIB_otp) +fi +AC_MSG_CHECKING([whether to enable OTP library]) +AC_MSG_RESULT($enable_otp) +AM_CONDITIONAL(OTP, test "$enable_otp" = yes)dnl +]) diff --git a/crypto/heimdal/cf/pkg.m4 b/crypto/heimdal/cf/pkg.m4 new file mode 100644 index 0000000000000000000000000000000000000000..8cdc5e416612a333ab48a2fa65d3c09217141561 GIT binary patch literal 5220 zc$}qJZFAbn75;4fic^QlKnwUSoz9J~bE^=r>BT^Kxi=|w6(KFKwa`*&h0RauzwC2X z5(pb7&Xn&tgkqg&UDR7_e?pgdO#azmdIEdv<~-c|EdIFs`_ z6+X2;*2qq@;w65t-Vpv8YPE^ve4**TbbfmJj)tDnn*Qc4MN9*+4Bb%E&oRIJYbbQQ z3Z$-kYWbmVy}|L(LdLX;)I4&Rgs-zm2#VEAKe&;&q>W0*b3=-RFJm3aX#!oPW_3?g zL`&t%*#CNG}9w5iMg zXP{3qG{6hBf;9^O!oCL?1T+*u4V%b_p%A%ef$@TGXC^vupf9v5gE+PM3&I&gv%sf?yA}wmC*&G>x#S^_z8^DS zxPc1i#zO4fx$u(Yj6$WW^bkoT2~zu6G;w+t&nmS;uU@4;|3o7J_Xz3-t|w3&!-N4Y zE>5fTQN^0K-r96}es*?NJG(gjOO?h$J2l9Tp?bU$o`kC6(Gw=-x$u|msIs=m5+k&l{Qd+tj+g*gFU=~sj!3=~8 zSvkd(o`N$76e{R}Xu8^*s$p-6ReSM#u5_-+pgA0OM&-#y#0)J0l=!p7Q1RN)PUh9| zv2_I393834E-54P$YwcF8)f;y|-R-^V z_D0$3imCO+LU{L_3o$6=VIfR2a7~>`FA3ZT3#Ka2m68D6PduWWVrERalvw9VQw4Q0 zJ<1hB=Hx4!0fQNswHrxy$|xwgRV2|wMHHzhB~l<|m6q|NpMfw{@7{qfkyB4)=twgi^nT@v*^T>24pD8 zlPBEy9Y$g2>}`SJg(d!QRfFp$ccrr{vu;*0JJZjzsx!{8=%vr3i1~FtAb58UJuZ&v z{KJVa)+b>S1Yd!6baa#+oMFZg{#8mN3ePt)HJhiH;#%j9HO((%g08WVOO$>LF_{PT$%b zs^`9X!8!Xxn=@OU)V2Pg*=m2r9Q88w0^nux#bQ_Kd>A%UBFKna7Ohkq%c*I}1)gJ) z0$Cl>ik9ZO!c4nxS1S>wvr#sePIp9?PfBhG81aY++LK%4L*0hwb~F0tbD5~SUZ(#4 zLx?X>V$Kb(<;3EYgTY|pG+G_|dT1C2Dlb>4l89!3JCDtzS2_dvBhMn~ON`vb!Q>!Z zr~T1@1v0$<5g@Bjqe!`DLrMz4q`AkKPfYNPyo`z~2e$6io9?zfqsdY8^T^Br0nd#X ztk)vg?51b#&75Tz^JJvLr3j0?x^yq;R?;_zLxJHu>!iiowv}J4 z3S$|%Dn^X?fg2TTpYwES=R&$76!}w1_(tjGd$w5LpoBf}qx_^XlO?3sPwCr0>K$MoT?J#=nyk+!d!JYqO4P$VX2wg&0=4jE=R&}6zfROU*U z^j+_s-Omfh}*!E?r6qy1vZZor;la(32~>ju|c9%3c`-la$dK1TA}?L;fJg_WGS zjh9rkt@A>59rRsx)1P4=v7X-*_xxmy6z=A_uv|4)iJuo*uil@W6prz)V7`d&wOZ9x zG(Y)J&z+n(kSCi0*<6(h)6sbOXQJ2IufyZ0r6D1?sx_{%^>qXZ8 E06HB#DF6Tf literal 0 Hc$@ /dev/null ; then + dnl native_pthread_support=yes + dnl PTHREADS_CFLAGS="" + dnl PTHREADS_LIBS="" + dnl else + dnl native_pthread_support=no + dnl fi + native_pthread_support=no + ;; +mips-sgi-irix6.[[5-9]]) # maybe works for earlier versions too + native_pthread_support=yes + PTHREAD_LIBADD="-lpthread" + ;; +*-*-darwin*) + native_pthread_support=yes + ;; +*) + native_pthread_support=no + ;; +esac + +if test "$enable_pthread_support" = maybe ; then + enable_pthread_support="$native_pthread_support" +fi + +if test "$enable_pthread_support" != no; then + AC_DEFINE(ENABLE_PTHREAD_SUPPORT, 1, + [Define if you want have a thread safe libraries]) + dnl This sucks, but libtool doesn't save the depenecy on -pthread + dnl for libraries. + LIBS="$PTHREAD_LIBADD $LIBS" +else + PTHREAD_CFLAGS="" + PTHREAD_LIBADD="" +fi + +AM_CONDITIONAL(ENABLE_PTHREAD_SUPPORT, test "$enable_pthread_support" != no) + +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +LDADD="$LDADD $PTHREAD_LDADD" +LIBADD="$LIBADD $PTHREAD_LIBADD" + +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_LDADD) +AC_SUBST(PTHREAD_LIBADD) + +AC_MSG_RESULT($enable_pthread_support) +]) diff --git a/crypto/heimdal/cf/resolv.m4 b/crypto/heimdal/cf/resolv.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/resolv.m4 @@ -0,0 +1,118 @@ +dnl stuff used by DNS resolv code in roken +dnl +dnl $Id$ +dnl + +AC_DEFUN([rk_RESOLV],[ + +AC_CHECK_HEADERS([arpa/nameser.h dns.h]) + +AC_CHECK_HEADERS(resolv.h, , , [AC_INCLUDES_DEFAULT +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +]) + +AC_FIND_FUNC(res_search, resolv, +[ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif +], +[0,0,0,0,0]) + +AC_FIND_FUNC(res_nsearch, resolv, +[ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif +], +[0,0,0,0,0,0]) + +AC_FIND_FUNC(res_ndestroy, resolv, +[ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif +], +[0]) + +AC_FIND_FUNC_NO_LIBS(dns_search,, +[ +#ifdef HAVE_DNS_H +#include +#endif +], +[0,0,0,0,0,0,0,0]) + + +AC_FIND_FUNC(dn_expand, resolv, +[ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif +], +[0,0,0,0,0]) + +rk_CHECK_VAR(_res, +[#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif]) + +]) diff --git a/crypto/heimdal/cf/retsigtype.m4 b/crypto/heimdal/cf/retsigtype.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/retsigtype.m4 @@ -0,0 +1,18 @@ +dnl +dnl $Id$ +dnl +dnl Figure out return type of signal handlers, and define SIGRETURN macro +dnl that can be used to return from one +dnl +AC_DEFUN([rk_RETSIGTYPE],[ +AC_TYPE_SIGNAL +if test "$ac_cv_type_signal" = "void" ; then + AC_DEFINE(VOID_RETSIGTYPE, 1, [Define if signal handlers return void.]) +fi + +AH_BOTTOM([#ifdef VOID_RETSIGTYPE +#define SIGRETURN(x) return +#else +#define SIGRETURN(x) return (RETSIGTYPE)(x) +#endif]) +]) \ No newline at end of file diff --git a/crypto/heimdal/cf/roken-frag.m4 b/crypto/heimdal/cf/roken-frag.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/roken-frag.m4 @@ -0,0 +1,784 @@ +dnl $Id$ +dnl +dnl some code to get roken working +dnl +dnl rk_ROKEN(subdir) +dnl +AC_DEFUN([rk_ROKEN], [ + +AC_REQUIRE([rk_CONFIG_HEADER]) + +DIR_roken=roken +LIB_roken='$(top_builddir)/$1/libroken.la' +INCLUDES_roken='-I$(top_builddir)/$1 -I$(top_srcdir)/$1' + +dnl Checks for programs +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_AWK]) +AC_REQUIRE([AC_OBJEXT]) +AC_REQUIRE([AC_EXEEXT]) +AC_REQUIRE([LT_INIT]) + +AC_REQUIRE([AC_MIPS_ABI]) + +AC_DEFINE(rk_PATH_DELIM, '/', [Path name delimiter]) + +dnl C characteristics + +AC_REQUIRE([AC_C___ATTRIBUTE__]) +AC_REQUIRE([AC_C_INLINE]) +AC_REQUIRE([AC_C_CONST]) +rk_WFLAGS(-Wall -Wextra -Wno-sign-compare -Wno-unused-parameter -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast -Wmissing-declarations -Wnested-externs -Wshadow) + +dnl -Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wstrict-prototypes +dnl -Wcast-qual -Wswitch -Wformat=2 -Wwrite-strings + +AC_REQUIRE([rk_DB]) + +dnl C types + +AC_REQUIRE([AC_TYPE_SIZE_T]) +AC_HAVE_TYPE([ssize_t],[#include ]) +AC_REQUIRE([AC_TYPE_PID_T]) +AC_REQUIRE([AC_TYPE_UID_T]) +AC_HAVE_TYPE([long long]) + +AC_REQUIRE([rk_RETSIGTYPE]) + +dnl Checks for header files. +AC_REQUIRE([AC_HEADER_STDC]) +AC_REQUIRE([AC_HEADER_TIME]) + +AC_CHECK_HEADERS([\ + arpa/inet.h \ + config.h \ + crypt.h \ + dirent.h \ + errno.h \ + err.h \ + fcntl.h \ + fnmatch.h \ + grp.h \ + ifaddrs.h \ + netinet/in.h \ + netinet/in6.h \ + netinet/in_systm.h \ + netinet6/in6.h \ + paths.h \ + poll.h \ + pwd.h \ + rpcsvc/ypclnt.h \ + search.h \ + shadow.h \ + stdint.h \ + sys/auxv.h \ + sys/bswap.h \ + sys/errno.h \ + sys/ioctl.h \ + sys/mman.h \ + sys/param.h \ + sys/resource.h \ + sys/sockio.h \ + sys/stat.h \ + sys/time.h \ + sys/tty.h \ + sys/types.h \ + sys/uio.h \ + sys/utsname.h \ + sys/wait.h \ + syslog.h \ + termios.h \ + winsock2.h \ + ws2tcpip.h \ + unistd.h \ + userconf.h \ + usersec.h \ + util.h \ +]) + +AC_HAVE_TYPE([uintptr_t],[#ifdef HAVE_STDINT_H +#include +#endif]) + +dnl Sunpro 5.2 has a vis.h which is something different. +AC_CHECK_HEADERS(vis.h, , , [ +#include +#ifndef VIS_SP +#error invis +#endif]) + +AC_CHECK_HEADERS(netdb.h, , , [AC_INCLUDES_DEFAULT +#ifdef HAVE_SYS_TYPES_H +#include +#endif +]) + +AC_CHECK_HEADERS(sys/socket.h, , , [AC_INCLUDES_DEFAULT +#ifdef HAVE_SYS_TYPES_H +#include +#endif +]) + +AC_CHECK_HEADERS(net/if.h, , , [AC_INCLUDES_DEFAULT +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_SOCKET_H +#include +#endif]) + +AC_CHECK_HEADERS(netinet6/in6_var.h, , , [AC_INCLUDES_DEFAULT +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET6_IN6_H +#include +#endif +]) + +AC_CHECK_HEADERS(sys/sysctl.h, , , [AC_INCLUDES_DEFAULT +#ifdef HAVE_SYS_PARAM_H +#include +#endif +]) + +AC_CHECK_HEADERS(sys/proc.h, , , [AC_INCLUDES_DEFAULT +#ifdef HAVE_SYS_PARAM_H +#include +#endif +]) + +AC_REQUIRE([CHECK_NETINET_IP_AND_TCP]) + +AM_CONDITIONAL(have_err_h, test "$ac_cv_header_err_h" = yes) +AM_CONDITIONAL(have_ifaddrs_h, test "$ac_cv_header_ifaddrs_h" = yes) +AM_CONDITIONAL(have_search_h, test "$ac_cv_header_search_h" = yes) +AM_CONDITIONAL(have_vis_h, test "$ac_cv_header_vis_h" = yes) + +dnl Check for functions and libraries + +AC_FIND_FUNC(socket, socket) +AC_FIND_FUNC(gethostbyname, nsl) +AC_FIND_FUNC(syslog, syslog) + +AC_KRB_IPV6 + +AC_FIND_FUNC(gethostbyname2, inet6 ip6) + +rk_RESOLV + +AC_BROKEN_SNPRINTF +AC_BROKEN_VSNPRINTF + +AC_BROKEN_GLOB +if test "$ac_cv_func_glob_working" != yes; then + AC_LIBOBJ(glob) +fi +AM_CONDITIONAL(have_glob_h, test "$ac_cv_func_glob_working" = yes) + + +AC_CHECK_FUNCS([ \ + asnprintf \ + asprintf \ + atexit \ + cgetent \ + getauxval \ + getconfattr \ + getprogname \ + getrlimit \ + getspnam \ + issetugid \ + on_exit \ + poll \ + random \ + setprogname \ + strsvis \ + strsvisx \ + strunvis \ + strvis \ + strvisx \ + svis \ + sysconf \ + sysctl \ + tdelete \ + tfind \ + twalk \ + uname \ + unvis \ + vasnprintf \ + vasprintf \ + vis \ +]) + +if test "$ac_cv_func_cgetent" = no; then + AC_LIBOBJ(getcap) +fi +AM_CONDITIONAL(have_cgetent, test "$ac_cv_func_cgetent" = yes) + +AC_REQUIRE([AC_FUNC_GETLOGIN]) + +AC_REQUIRE([AC_FUNC_MMAP]) + +AC_FIND_FUNC_NO_LIBS(getsockopt,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif], +[0,0,0,0,0]) +AC_FIND_FUNC_NO_LIBS(setsockopt,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif], +[0,0,0,0,0]) + +AC_FIND_IF_NOT_BROKEN(hstrerror, resolv, +[#ifdef HAVE_NETDB_H +#include +#endif], +17) +AC_NEED_PROTO([ +#ifdef HAVE_NETDB_H +#include +#endif], +hstrerror) + +AC_FOREACH([rk_func], [asprintf vasprintf asnprintf vasnprintf], + [AC_NEED_PROTO([ + #include + #include ], + rk_func)]) + +AC_FIND_FUNC_NO_LIBS(bswap16,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_BSWAP_H +#include +#endif],0) + +AC_FIND_FUNC_NO_LIBS(bswap32,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_BSWAP_H +#include +#endif],0) + +AC_FIND_FUNC_NO_LIBS(bswap64,, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_BSWAP_H +#include +#endif],0) + +AC_FIND_FUNC_NO_LIBS(pidfile,util, +[#ifdef HAVE_UTIL_H +#include +#endif],0) + +AC_FIND_IF_NOT_BROKEN(getaddrinfo,, +[#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif],[0,0,0,0]) + +AC_FIND_IF_NOT_BROKEN(getnameinfo,, +[#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif],[0,0,0,0,0,0,0]) + +AC_FIND_IF_NOT_BROKEN(freeaddrinfo,, +[#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif],[0]) + +AC_FIND_IF_NOT_BROKEN(gai_strerror,, +[#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif],[0]) + +case "$host_os" in + darwin*) + ;; + *) + AC_BROKEN([daemon]) ;; +esac + +AC_BROKEN([ \ + chown \ + copyhostent \ + closefrom \ + ecalloc \ + emalloc \ + erealloc \ + estrdup \ + err \ + errx \ + fchown \ + flock \ + fnmatch \ + freehostent \ + getcwd \ + getdtablesize \ + getegid \ + geteuid \ + getgid \ + gethostname \ + getifaddrs \ + getipnodebyaddr \ + getipnodebyname \ + getopt \ + gettimeofday \ + getuid \ + getusershell \ + initgroups \ + innetgr \ + iruserok \ + localtime_r \ + lstat \ + memmove \ + memset_s \ + mkstemp \ + putenv \ + rcmd \ + readv \ + recvmsg \ + sendmsg \ + setegid \ + setenv \ + seteuid \ + strcasecmp \ + strdup \ + strerror \ + strftime \ + strlcat \ + strlcpy \ + strlwr \ + strncasecmp \ + strndup \ + strnlen \ + strptime \ + strsep \ + strsep_copy \ + strtok_r \ + strtoll \ + strtoull \ + strupr \ + swab \ + tsearch \ + timegm \ + unsetenv \ + verr \ + verrx \ + vsyslog \ + vwarn \ + vwarnx \ + warn \ + warnx \ + writev \ +]) + +AM_CONDITIONAL(have_fnmatch_h, + test "$ac_cv_header_fnmatch_h" = yes -a "$ac_cv_func_fnmatch" = yes) + +AC_FOREACH([rk_func], [strndup strsep strtok_r], + [AC_NEED_PROTO([#include ], rk_func)]) + +AC_CHECK_FUNC([strtoll], + [AC_DEFINE_UNQUOTED(HAVE_STRTOLL, 1, + [Define if you have the function strtoll.])]) + +AC_CHECK_FUNC([strtoull], + [AC_DEFINE_UNQUOTED(HAVE_STRTOULL, 1, + [Define if you have the function strtoull.])]) + +AC_FOREACH([rk_func], [strsvis strsvisx strunvis strvis strvisx svis unvis vis], +[AC_NEED_PROTO([#ifdef HAVE_VIS_H +#include +#endif], rk_func)]) + +AC_MSG_CHECKING([checking for dirfd]) +AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include +#ifdef HAVE_DIRENT_H +#include +#endif +]], + [[DIR *d = 0; dirfd(d);]])], + [ac_rk_have_dirfd=yes], [ac_rk_have_dirfd=no]) +if test "$ac_rk_have_dirfd" = "yes" ; then + AC_DEFINE_UNQUOTED(HAVE_DIRFD, 1, [have a dirfd function/macro]) +fi +AC_MSG_RESULT($ac_rk_have_dirfd) + +AC_HAVE_STRUCT_FIELD(DIR, dd_fd, [#include +#ifdef HAVE_DIRENT_H +#include +#endif]) + + +AC_BROKEN2(inet_aton, +[#ifdef 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], +[0,0]) + +AC_BROKEN2(inet_ntop, +[#ifdef 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], +[0, 0, 0, 0]) + +AC_BROKEN2(inet_pton, +[#ifdef 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], +[0,0,0]) + +dnl +dnl Check for sa_len in struct sockaddr, +dnl needs to come before the getnameinfo test +dnl +AC_HAVE_STRUCT_FIELD(struct sockaddr, sa_len, [#include +#include ]) + +#if test "$ac_cv_func_getaddrinfo" = "yes"; then +# rk_BROKEN_GETADDRINFO +# if test "$ac_cv_func_getaddrinfo_numserv" = no; then +# AC_LIBOBJ(getaddrinfo) +# AC_LIBOBJ(freeaddrinfo) +# fi +#fi + +AC_NEED_PROTO([#include ], setenv) +AC_NEED_PROTO([#include ], unsetenv) +AC_NEED_PROTO([#include ], gethostname) +AC_NEED_PROTO([#include ], mkstemp) +AC_NEED_PROTO([#include ], getusershell) +AC_NEED_PROTO([#include ], daemon) +AC_NEED_PROTO([ +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif], +iruserok) + +AC_NEED_PROTO([ +#ifdef 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], +inet_aton) + +AC_FIND_FUNC_NO_LIBS(crypt, crypt)dnl + +AC_REQUIRE([rk_BROKEN_REALLOC])dnl + +dnl AC_KRB_FUNC_GETCWD_BROKEN + +dnl strerror_r is great fun, on linux it exists before sus catched up, +dnl so the return type is diffrent, lets check for both + +AC_PROTO_COMPAT([ +#include +#include +], +strerror_r, int strerror_r(int, char *, size_t)) + +AC_CHECK_FUNC([strerror_r], + [AC_DEFINE_UNQUOTED(HAVE_STRERROR_R, 1, + [Define if you have the function strerror_r.])]) + +dnl +dnl Checks for prototypes and declarations +dnl + +AC_PROTO_COMPAT([ +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif +], +gethostbyname, struct hostent *gethostbyname(const char *)) + +AC_PROTO_COMPAT([ +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif +], +gethostbyaddr, struct hostent *gethostbyaddr(const void *, size_t, int)) + +AC_PROTO_COMPAT([ +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif +], +getservbyname, struct servent *getservbyname(const char *, const char *)) + +AC_PROTO_COMPAT([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +], +getsockname, int getsockname(int, struct sockaddr*, socklen_t*)) + +AC_PROTO_COMPAT([ +#ifdef HAVE_SYSLOG_H +#include +#endif +], +openlog, void openlog(const char *, int, int)) + +AC_NEED_PROTO([ +#ifdef HAVE_CRYPT_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +], +crypt) + +dnl variables + +rk_CHECK_VAR(h_errno, +[#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif +]) + +rk_CHECK_VAR(h_errlist, +[#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) + +rk_CHECK_VAR(h_nerr, +[#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) + +rk_CHECK_VAR([__progname], +[#ifdef HAVE_ERR_H +#include +#endif]) + +AC_CHECK_DECLS([optarg, optind, opterr, optopt, environ],[],[],[ +#include +#ifdef HAVE_UNISTD_H +#include +#endif]) + +dnl +dnl Check for fields in struct tm +dnl + +AC_HAVE_STRUCT_FIELD(struct tm, tm_gmtoff, [#include ]) +AC_HAVE_STRUCT_FIELD(struct tm, tm_zone, [#include ]) + +dnl +dnl or do we have a variable `timezone' ? +dnl + +rk_CHECK_VAR(timezone,[#include ]) +rk_CHECK_VAR(altzone,[#include ]) + +AC_HAVE_TYPE([sa_family_t],[ +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) +AC_HAVE_TYPE([socklen_t],[ +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) +AC_HAVE_TYPE([struct sockaddr], [ +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) +AC_HAVE_TYPE([struct sockaddr_storage], [ +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) +AC_HAVE_TYPE([struct addrinfo], [ +#include +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) +AC_HAVE_TYPE([struct ifaddrs], [#include ]) +AC_HAVE_TYPE([struct iovec],[ +#include +#include +]) +AC_HAVE_TYPE([struct msghdr],[ +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif]) + +dnl +dnl Check for struct winsize +dnl + +AC_KRB_STRUCT_WINSIZE + +dnl +dnl Check for struct spwd +dnl + +AC_KRB_STRUCT_SPWD + +# +# Check if we want samba's socket wrapper +# + +samba_SOCKET_WRAPPER + +dnl won't work with automake +dnl moved to AC_OUTPUT in configure.in +dnl AC_CONFIG_FILES($1/Makefile) + +LIB_roken="${LIB_roken} \$(LIB_crypt) \$(LIB_dbopen)" + +AC_SUBST(DIR_roken)dnl +AC_SUBST(LIB_roken)dnl +AC_SUBST(INCLUDES_roken)dnl +]) diff --git a/crypto/heimdal/cf/roken-h-process.pl b/crypto/heimdal/cf/roken-h-process.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/roken-h-process.pl @@ -0,0 +1,184 @@ +#!/usr/bin/perl + +use Getopt::Std; + +my $debug = 0; + +getopts('dc:p:o:') || die "foo"; + +if ($opt_d) { + $debug = 1; +} + +die "missing arg" if (!defined $opt_c || !defined $opt_p || !defined $opt_o); + +my %defines; +my $IN; +my $OUT; + +print "parse config.h\n" if ($debug); + +open IN, $opt_c || die "failed open ${opt_c}"; + +my @nesting; + +push @nesting, 1; + +while () { + if (m/\s*#ifdef\s+(.*)/) { + my $var = $1; + if (defined $defines{$var}) { + push @nesting, 1; + } else { + push @nesting, 0; + } + next; + } elsif (m/\s*#ifndef\s+(.*)/) { + my $var = $1; + if (defined $defines{$var}) { + push @nesting, 0; + } else { + push @nesting, 1; + } + next; + } elsif (m/\s*#else/) { + my $var = pop @nesting; + $var = !$var; + push @nesting, $var; + next; + } elsif ($nesting[$#nesting] and m/\s*#define\s+(\w+)\s+(\S+)/) { + my $res = $2; + $res = 1 if (!defined $res); + $defines{$1} = $res; + } +} + +close IN; + +if ($debug) { + foreach my $i (keys %defines) { + print "k: $i v: $defines{$i}\n"; + } +} + +open IN, "$opt_p" || die "failed open ${opt_p}"; +open OUT, ">$opt_o" || die "failed open ${opt_o}"; + +print "parse roken.h.in\n" if ($debug); + +print OUT "/* This is an OS dependent, generated file */\n"; +print OUT "\n"; +print OUT "\n"; +print OUT "#ifndef __ROKEN_H__\n"; +print OUT "#define __ROKEN_H__\n"; +print OUT "\n"; + +@nesting = (1); + +while () { + if (m/\s*#ifdef\s+(.*)/) { + my $var = $1; + if (defined $defines{$var}) { + push @nesting, 1; + } else { + push @nesting, 0; + } + next; + } elsif (m/\s*#ifndef\s+(.*)/) { + my $var = $1; + if (defined $defines{$var}) { + push @nesting, 0; + } else { + push @nesting, 1; + } + next; + } elsif (m/\s*#if\s+(.*)/) { + my $res = parse_if($1); + print "line = $res: $1\n" if ($debug); + push @nesting, $res; + next; + } elsif (m/\s*#elif\s+(.*)/) { + my $res = pop @nesting; + if ($res gt 0) { + $res = -1; + } else { + my $res = parse_if($1); + } + push @nesting, $res; + next; + } elsif (m/\s*#else/) { + my $var = pop @nesting; + $var = !$var; + push @nesting, $var; + next; + } elsif (m/\s*#endif/) { + pop @nesting; + next; + } + print "line: $_\n" if ($debug); + print "nesting dep $#{nesting}\n" if ($debug); + my $i = 0, $t = 1; + while ($i le $#nesting) { + $t = 0 if ($nesting[$i] le 0); + print "nesting $i val $nesting[$i] -> $t\n" if ($debug); + $i++; + } + if ($t) { + print OUT; + } +} + +print OUT "\n"; +print OUT "#endif /* __ROKEN_H__ */\n"; + + +close IN; + +exit 0; + +sub parse_if +{ + my ($neg, $var); + + $_ = shift; + + if (m/^\s*$/) { + print "end $_\n" if ($debug); + return 1; + } elsif (m/^\(([^&]+)\&\&(.*)\)\s*\|\|\s*\(([^&]+)\&\&(.*)\)$/) { + print "($1 and $2) or ($3 and $4)\n" if ($debug); + return ((parse_if($1) and parse_if($2)) or (parse_if($3) and parse_if($4))); + } elsif (m/^([^&]+)\&\&(.*)$/) { + print "$1 and $2\n" if ($debug); + return parse_if($1) and parse_if($2); + } elsif (m/^([^\|]+)\|\|(.*)$/) { + print "$1 or $2\n" if ($debug); + return (parse_if($1) or parse_if($2)); + } elsif (m/^\s*(\!)?\s*defined\((\w+)\)/) { + ($neg, $var) = ($1, $2); + print "def: ${neg}-defined(${var})\n" if ($debug); + my $res = defined $defines{$var}; + if ($neg eq "!") { + if ($res) { + $res = 0; + } else { + $res = 1; + } + } + print "res: $res\n" if ($debug); + return $res; + } elsif (m/^\s*(\!)?(\w+)/) { + ($neg, $var) = ($1, $2); + print "var: $neg $var\n" if ($debug); + my $res; + if (defined $defines{$var}) { + $res = $defines{$var}; + } else { + $res = 0; + } + $res = ! $res if ($neg =~ m/!/); + print "res: $res\n" if ($debug); + return $res; + } + die "failed parse: $_\n"; +} diff --git a/crypto/heimdal/cf/roken.m4 b/crypto/heimdal/cf/roken.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/roken.m4 @@ -0,0 +1,64 @@ +dnl $Id$ +dnl +dnl try to look for an installed roken library with sufficient stuff +dnl +dnl set LIB_roken to the what we should link with +dnl set DIR_roken to if the directory should be built +dnl set CPPFLAGS_roken to stuff to add to CPPFLAGS + +dnl AC_ROKEN(version,directory-to-try,roken-dir,fallback-library,fallback-cppflags) +AC_DEFUN([AC_ROKEN], [ + +AC_ARG_WITH(roken, + AS_HELP_STRING([--with-roken=dir],[use the roken library in dir]), +[if test "$withval" = "no"; then + AC_MSG_ERROR(roken is required) +fi]) + +save_CPPFLAGS="${CPPFLAGS}" + +case $with_roken in +yes|"") + dirs="$2" ;; +*) + dirs="$with_roken" ;; +esac + +roken_installed=no + +for i in $dirs; do + +AC_MSG_CHECKING(for roken in $i) + +CPPFLAGS="-I$i/include ${CPPFLAGS}" + +AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ +#include +#if ROKEN_VERSION < $1 +#error old roken version, should be $1 +fail +#endif +]])],[roken_installed=yes; break]) + +AC_MSG_RESULT($roken_installed) + +done + +CPPFLAGS="$save_CPPFLAGS" + +if test "$roken_installed" != "yes"; then + DIR_roken="roken" + LIB_roken='$4' + CPPFLAGS_roken='$5' + AC_CONFIG_SUBDIRS(lib/roken) +else + LIB_roken="$i/lib/libroken.la" + CPPFLAGS_roken="-I$i/include" +fi + +LIB_roken="${LIB_roken} \$(LIB_crypt) \$(LIB_dbopen)" + +AC_SUBST(LIB_roken)dnl +AC_SUBST(DIR_roken)dnl +AC_SUBST(CPPFLAGS_roken)dnl +]) diff --git a/crypto/heimdal/cf/socket-wrapper.m4 b/crypto/heimdal/cf/socket-wrapper.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/socket-wrapper.m4 @@ -0,0 +1,16 @@ +dnl $Id$ +dnl +AC_DEFUN([samba_SOCKET_WRAPPER], [ + +AC_ARG_ENABLE(socket-wrapper, + AS_HELP_STRING([--enable-socket-wrapper], + [use sambas socket-wrapper for testing])) + +AM_CONDITIONAL(have_socket_wrapper, test "x$enable_socket_wrapper" = xyes)dnl + +if test "x$enable_socket_wrapper" = xyes ; then + AC_DEFINE(SOCKET_WRAPPER_REPLACE, 1, + [Define if you want to use samba socket wrappers.]) +fi + +]) diff --git a/crypto/heimdal/cf/sunos.m4 b/crypto/heimdal/cf/sunos.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/sunos.m4 @@ -0,0 +1,29 @@ +dnl +dnl $Id$ +dnl + +AC_DEFUN([rk_SUNOS],[ +sunos=no +case "$host" in +*-*-solaris2.7) + sunos=57 + ;; +*-*-solaris2.1[[1-9]]) + AC_DEFINE([__EXTENSIONS__], [1], + [Enable general extensions on Solaris.]) + AC_DEFINE([_STDC_C11_BCI], [1], + [Enable C11 prototypes for memset_s and friends]) + sunos=511 + ;; +*-*-solaris2.[[89]] | *-*-solaris2.10) + sunos=58 + ;; +*-*-solaris2*) + sunos=50 + ;; +esac +if test "$sunos" != no; then + AC_DEFINE_UNQUOTED(SunOS, $sunos, + [Define to what version of SunOS you are running.]) +fi +]) diff --git a/crypto/heimdal/cf/symbol-version.py b/crypto/heimdal/cf/symbol-version.py new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/symbol-version.py @@ -0,0 +1,85 @@ +# +# Copyright (c) 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + + +import sys + +tokens = [ 'SYMBOL' ] +literals = ['{','}',';', ':'] + +t_SYMBOL = r'[a-zA-Z_][a-zA-Z0-9_\.]*' +t_ignore = " \t\n" + +def t_error(t): + print "Illegal character '%s'" % t.value[0] + t.lexer.skip(1) + +import ply.lex as lex +lex.lex() + +namespace = "global" +symbols = [] + +def p_syms(p): + 'syms : SYMBOL "{" elements "}"' + print "# %s" % p[1] + +def p_elements(p): + '''elements : element + | element elements''' + +def p_element(p): + '''element : SYMBOL ":" + | SYMBOL ";"''' + global namespace + if p[2] == ':': + namespace = p[1] + else: + symbols.append([namespace, p[1]]) + +def p_error(p): + if p: + print "Syntax error at '%s'" % p.value + else: + print "Syntax error at EOF" + +import ply.yacc as yacc +yacc.yacc() + +lines = sys.stdin.readlines() + +for line in lines: + yacc.parse(line) + +for symbol in symbols: + if symbol[0] == "global": + print "%s" % symbol[1] diff --git a/crypto/heimdal/cf/telnet.m4 b/crypto/heimdal/cf/telnet.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/telnet.m4 @@ -0,0 +1,75 @@ +dnl +dnl $Id$ +dnl +dnl stuff used by telnet + +AC_DEFUN([rk_TELNET],[ +AC_DEFINE(AUTHENTICATION, 1, + [Define if you want authentication support in telnet.])dnl +AC_DEFINE(ENCRYPTION, 1, + [Define if you want encryption support in telnet.])dnl +AC_DEFINE(DES_ENCRYPTION, 1, + [Define if you want to use DES encryption in telnet.])dnl +AC_DEFINE(DIAGNOSTICS, 1, + [Define this to enable diagnostics in telnet.])dnl +AC_DEFINE(OLD_ENVIRON, 1, + [Define this to enable old environment option in telnet.])dnl +if false; then + AC_DEFINE(ENV_HACK, 1, + [Define this if you want support for broken ENV_{VAR,VAL} telnets.]) +fi + +# Simple test for streamspty, based on the existance of getmsg(), alas +# this breaks on SunOS4 which have streams but BSD-like ptys +# +# And also something wierd has happend with dec-osf1, fallback to bsd-ptys + +case "$host" in +*-*-aix3*|*-*-sunos4*|*-*-osf*|*-*-hpux1[[01]]*) + ;; +*) + AC_CHECK_FUNC(getmsg) + if test "$ac_cv_func_getmsg" = "yes"; then + AC_CACHE_CHECK([if getmsg works], ac_cv_func_getmsg_works, + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + #include + + int main(int argc, char **argv) + { + int ret; + ret = getmsg(open("/dev/null", 0), NULL, NULL, NULL); + if(ret < 0 && errno == ENOSYS) + return 1; + return 0; + } + ]])], [ac_cv_func_getmsg_works=yes], + [ac_cv_func_getmsg_works=no], + [ac_cv_func_getmsg_works=no])) + if test "$ac_cv_func_getmsg_works" = "yes"; then + AC_DEFINE(HAVE_GETMSG, 1, + [Define if you have a working getmsg.]) + AC_DEFINE(STREAMSPTY, 1, + [Define if you have streams ptys.]) + fi + fi + ;; +esac + +AH_BOTTOM([ + +/* Set this to the default system lead string for telnetd + * can contain %-escapes: %s=sysname, %m=machine, %r=os-release + * %v=os-version, %t=tty, %h=hostname, %d=date and time + */ +#undef USE_IM + +/* Used with login -p */ +#undef LOGIN_ARGS + +/* set this to a sensible login */ +#ifndef LOGIN_PATH +#define LOGIN_PATH BINDIR "/login" +#endif +]) +]) diff --git a/crypto/heimdal/cf/test-package.m4 b/crypto/heimdal/cf/test-package.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/test-package.m4 @@ -0,0 +1,135 @@ +dnl $Id$ +dnl +dnl rk_TEST_PACKAGE(package,program,libraries,extra libs, +dnl default locations, conditional, config-program, headers) + +AC_DEFUN([rk_TEST_PACKAGE],[ +AC_ARG_WITH($1, + AS_HELP_STRING([--with-$1=dir],[use $1 in dir])) +AC_ARG_WITH($1-lib, + AS_HELP_STRING([--with-$1-lib=dir],[use $1 libraries in dir]), +[if test "$withval" = "yes" -o "$withval" = "no"; then + AC_MSG_ERROR([No argument for --with-$1-lib]) +elif test "X$with_$1" = "X"; then + with_$1=yes +fi]) +AC_ARG_WITH($1-include, + AS_HELP_STRING([--with-$1-include=dir],[use $1 headers in dir]), +[if test "$withval" = "yes" -o "$withval" = "no"; then + AC_MSG_ERROR([No argument for --with-$1-include]) +elif test "X$with_$1" = "X"; then + with_$1=yes +fi]) +AC_ARG_WITH($1-config, + AS_HELP_STRING([--with-$1-config=path],[config program for $1])) + +m4_ifval([$6], + m4_define([rk_pkgname], $6), + m4_define([rk_pkgname], AS_TR_CPP($1))) + +AC_MSG_CHECKING(for $1) + +case "$with_$1" in +yes|"") d='$5' ;; +no) d= ;; +*) d="$with_$1" ;; +esac + +header_dirs= +lib_dirs= +for i in $d; do + if test "$with_$1_include" = ""; then + if test -d "$i/include/$1"; then + header_dirs="$header_dirs $i/include/$1" + fi + if test -d "$i/include"; then + header_dirs="$header_dirs $i/include" + fi + fi + if test "$with_$1_lib" = ""; then + if test -d "$i/lib$abilibdirext"; then + lib_dirs="$lib_dirs $i/lib$abilibdirext" + fi + fi +done + +if test "$with_$1_include"; then + header_dirs="$with_$1_include $header_dirs" +fi +if test "$with_$1_lib"; then + lib_dirs="$with_$1_lib $lib_dirs" +fi + +if test "$with_$1_config" = ""; then + with_$1_config='$7' +fi + +$1_cflags= +$1_libs= + +case "$with_$1_config" in +yes|no|""|"$7") + if test -f $with_$1/bin/$7 ; then + with_$1_config=$with_$1/bin/$7 + fi + ;; +esac + +case "$with_$1_config" in +yes|no|"") + ;; +*) + $1_cflags="`$with_$1_config --cflags 2>&1`" + $1_libs="`$with_$1_config --libs 2>&1`" + ;; +esac + +found=no +if test "$with_$1" != no; then + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test "$[]$1_cflags" -a "$[]$1_libs"; then + CFLAGS="$[]$1_cflags $save_CFLAGS" + LIBS="$[]$1_libs $save_LIBS" + m4_ifval([$8],[AC_CHECK_HEADERS([[$8]])]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[$2]],[[]])],[ + INCLUDE_$1="$[]$1_cflags" + LIB_$1="$[]$1_libs" + AC_MSG_RESULT([from $with_$1_config]) + found=yes]) + fi + if test "$found" = no; then + ires= lres= + for i in $header_dirs; do + CFLAGS="-I$i $save_CFLAGS" + m4_ifval([$8],[AC_CHECK_HEADERS([[$8]])]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$2]],[[]])],[ires=$i;break]) + done + for i in $lib_dirs; do + LIBS="-L$i $3 $4 $save_LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[$2]],[[]])],[lres=$i;break]) + done + if test "$ires" -a "$lres" -a "$with_$1" != "no"; then + INCLUDE_$1="-I$ires" + LIB_$1="-L$lres $3 $4" + found=yes + AC_MSG_RESULT([headers $ires, libraries $lres]) + fi + fi + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" +fi + +if test "$found" = yes; then + AC_DEFINE_UNQUOTED(rk_pkgname, 1, [Define if you have the $1 package.]) + with_$1=yes +else + with_$1=no + INCLUDE_$1= + LIB_$1= + AC_MSG_RESULT(no) +fi + +AC_SUBST(INCLUDE_$1) +AC_SUBST(LIB_$1) +]) diff --git a/crypto/heimdal/cf/valgrind-suppressions b/crypto/heimdal/cf/valgrind-suppressions new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/valgrind-suppressions @@ -0,0 +1,168 @@ +{ + linux db init brokenness + Memcheck:Param + pwrite64(buf) + fun:do_pwrite64 + fun:__os_io + fun:__memp_pgwrite + fun:__memp_fsync + fun:__bam_read_root + fun:__bam_open + fun:__db_dbopen + fun:__db_open + fun:DB_open +} +{ + linux strerror + Memcheck:Leak + fun:_vgrZU_libcZdsoZa_malloc + fun:rwlock_add_to_list + fun:rwlock_have_already + fun:pthread_rwlock_rdlock + fun:__dcigettext + fun:dcgettext + fun:strerror_r + fun:strerror +} +{ + linux db close brokenness + Memcheck:Param + pwrite64(buf) + fun:do_pwrite64 + fun:__os_io + fun:__memp_pgwrite + fun:__memp_fsync + fun:__db_sync + fun:__db_close + fun:DB_close +} +{ + GLIBC 2.1.2 getservbyname defect + Memcheck:Leak + fun:_vgrZU_libcZdsoZa_malloc + fun:strdup + obj:* + obj:* + fun:getservbyname_r@@GLIBC_2.1.2 + fun:getservbyname +} +{ + glibc getaddrinfo defect + Memcheck:Leak + fun:_vgrZU_libcZdsoZa_malloc + fun:__libc_res_nsend + fun:__libc_res_nquery + fun:__libc_res_nquerydomain + fun:__libc_res_nsearch + obj:* + fun:gaih_inet + fun:getaddrinfo +} +{ + glibc dlopen failure called from /bin/ls + Memcheck:Addr4 + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so + obj:/lib/ld-2.3.6.so +} +{ + Unknown suppression in runtime link editor + Memcheck:Cond + obj:/lib/ld-2.5.so + obj:/lib/ld-2.5.so + obj:/lib/ld-2.5.so + obj:/lib/ld-2.5.so +} +{ + Unknown suppression in runtime link editor + Memcheck:Addr4 + obj:/lib/ld-2.5.so + obj:/lib/ld-2.5.so + obj:/lib/ld-2.5.so + obj:/lib/ld-2.5.so +} +{ + glibc sed leak 1 + Memcheck:Leak + fun:calloc + obj:/bin/sed + obj:/bin/sed + obj:/bin/sed + obj:/bin/sed + obj:/bin/sed + fun:(below main) +} +{ + Heimdal one-time init leak 1 + Memcheck:Leak + ... + fun:heim_base_once_f + ... +} +{ + Heimdal one-time init leak 2 + Memcheck:Leak + fun:pthread_once + ... +} +{ + Heimdal one-time init leak 3 + Memcheck:Leak + fun:calloc + fun:_heim_alloc_object + fun:heim_dict_create + fun:_krb5_load_plugins + fun:init_context_once + fun:once_callback_caller + fun:pthread_once + fun:heim_base_once_f + fun:krb5_init_context + fun:main +} +{ + Heimdal one-time init leak 4 + Memcheck:Leak + fun:calloc + fun:heim_dict_create + fun:_krb5_load_plugins + fun:init_context_once + fun:once_callback_caller + fun:pthread_once + fun:heim_base_once_f + fun:krb5_init_context + fun:main +} +{ + Heimdal ipropd-master leak 1 + Memcheck:Leak + ... + fun:krb5_kt_resolve + fun:main + obj:*ipropd-master +} +{ + Heimdal ipropd-master leak 2 + Memcheck:Leak + ... + fun:kadm5_init_with_skey_ctx + fun:main + obj:*ipropd-master +} +{ + Heimdal ipropd-slave leak 1 + Memcheck:Leak + ... + fun:krb5_auth_con_init + ... + fun:krb5_sendauth + fun:main + obj:*ipropd-slave +} +{ + Heimdal ipropd-slave leak 2 + Memcheck:Leak + ... + fun:kadm5_init_with_password_ctx + fun:main + obj:*ipropd-slave +} diff --git a/crypto/heimdal/cf/vararray.m4 b/crypto/heimdal/cf/vararray.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/vararray.m4 @@ -0,0 +1,16 @@ +dnl +dnl $Id$ +dnl +dnl Test for variable size arrays. +dnl + +AC_DEFUN([rk_C_VARARRAY], [ + AC_CACHE_CHECK([if the compiler supports variable-length arrays],[rk_cv_c_vararray],[ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]],[[int x = 0; { int y[x]; }]])], + [rk_cv_c_vararray=yes], + [rk_cv_c_vararray=no])]) + if test "$rk_cv_c_vararray" = yes; then + AC_DEFINE([HAVE_VARIABLE_LENGTH_ARRAY], [1], + [Define if your compiler supports variable-length arrays.]) + fi +]) diff --git a/crypto/heimdal/cf/version-script.m4 b/crypto/heimdal/cf/version-script.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/version-script.m4 @@ -0,0 +1,39 @@ +dnl check if ld supports --version-script +dnl +AC_DEFUN([rk_VERSIONSCRIPT],[ +AC_CACHE_CHECK(for ld --version-script, rk_cv_version_script,[ + rk_cv_version_script=no + + cat > conftest.map < conftest.c < \$def_name, + "vs=s" => \$vs_name, + "help|?" => \$show_help) or pod2usage( -exitval => 2, + -verbose => 3 ); +pod2usage( -exitval => 1, + -verbose => 3 ) if $show_help or !$def_name or !$vs_name; + +open (my $def, '<', $def_name) or die $!; +open (my $vs, '<', $vs_name) or die $!; + +# First go through the version-script + +my $global = 0; + +while(<$vs>) +{ + next unless m/^([^#]+)/; + + @a = split(/\s+|({|})/,$1); + + for $f (@a) { + given ($f) { + when (/global\:/) { $global = 1; } + when (/{|}|.*\:/) { $global = 0; } + when (/(.*)\;/ and $global == 1) { + $syms{$1} = 1; + } + } + } +} + +while(<$def>) +{ + next if m/^#/; + next unless m/^;!([^;]+)/ or m/^([^;]+);?(!?)/; + + @a = split(/\s+/, $1); + + for $f (@a) { + next if $f =~ /EXPORTS/ or $f =~ /DATA/ or not $f; + + if (not exists $syms{$f} and not $2) { + print "$f: Only in DEF\n"; + ++$def_only; + } + delete $syms{$f}; + } +} + +#while (($k,$v) = each %syms) { +for $k (sort keys %syms) { + print "$k: Only in VS\n"; + ++$vs_only; +} + +close($def); +close($vs); + +if ($def_only or $vs_only) { + print "\nMismatches found.\n"; + exit(1); +} + +__END__ + +=head1 NAME + +w32-sync-exported-symbols.pl - Synchronize Windows .def with version-script + +=head1 SYNOPSIS + +w32-sync-exported-symbols.pl {options} + + Options: + --def Name of .def file + --vs Name of version-script file + +=head1 DESCRIPTION + +Verifies that all the symbols exported by the version-script is also +accounted for in the .def file. Also checks that no extra symbols are +exported by the .def file unless they are marked as safe. + +=cut + diff --git a/crypto/heimdal/cf/w32-def-from-dll.pl b/crypto/heimdal/cf/w32-def-from-dll.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/w32-def-from-dll.pl @@ -0,0 +1,212 @@ +######################################################################## +# +# Copyright (c) 2010, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +my $show_module_name = 1; +my $use_indent = 1; +my $strip_leading_underscore = 0; +my $always_export = 0; +my $module_name = ""; +my $local_prefix = "SHIM_"; +my %forward_exports = (); +my %local_exports = (); + +sub build_forwarder_target_list($) +{ + $fn = shift; + + print STDERR "Processing defs from file [$fn]\n"; + + open(SP, '-|', "dumpbin /exports \"".$fn."\"") or die "Can't open pipe for $fn"; + + LINE: + while () { +# 112 6F 00071CDC krb5_encrypt_size + + /^ +([[:digit:]]+)\s+[[:xdigit:]]+\s[[:xdigit:]]{8,}\s+(\S+)(?:| = (\S*))$/ && do { + my ($ordinal, $symbol, $in) = ($1, $2, $3); + + if ($in eq "") { $in = $symbol }; + $forward_exports{$symbol} = $in; + }; + } + + close SP; +} + +# Dump all symbols for the given dll file that are defined and have +# external scope. + +sub build_def_file($) +{ + $fn = shift; + + print STDERR "Opening dump of DLL [$fn]\n"; + + open(SP, '-|', "dumpbin /exports \"".$fn."\"") or die "Can't open pipe for $fn"; + + LINE: + while () { +# 112 6F 00071CDC krb5_encrypt_size + + /^ +([[:digit:]]+)\s+[[:xdigit:]]+\s[[:xdigit:]]{8,}\s+(\S+)(?:| = (\S*))$/ && do { + my ($ordinal, $symbol, $in) = ($1, $2, $3); + + if ($strip_leading_underscore && $symbol =~ /_(.*)/) { + $symbol = $1; + } + if (exists $local_exports{$symbol}) { + print "\t".$symbol; + print " = ".$local_exports{$symbol}; + if ($in ne $local_exports{$symbol} and $in ne "") { + print STDERR "Incorrect calling convention for local $symbol\n"; + print STDERR " ".$in." != ".$local_exports{$symbol}."\n"; + } + print "\t@".$ordinal."\n"; + } elsif (exists $local_exports{$local_prefix.$symbol}) { + print "\t".$symbol; + print " = ".$local_exports{$local_prefix.$symbol}; + print "\t@".$ordinal."\n"; + } elsif (exists $forward_exports{$symbol}) { + print "\t".$symbol; + print " = ".$module_name; + if ($in ne $forward_exports{$symbol} and $in ne "") { + print STDERR "Incorrect calling convention for $symbol\n"; + print STDERR " ".$in." != ".$forward_exports{$symbol}."\n"; + } + my $texp = $forward_exports{$symbol}; + if ($texp =~ /^_([^@]+)$/) { $texp = $1; } + print $texp."\t@".$ordinal."\n"; + } elsif ($always_export) { + print "\t".$symbol." = ".$local_prefix.$symbol; + print "\t@".$ordinal."\n"; + } else { + print STDERR "Symbol not found: $symbol\n"; + } + }; + } + + close SP; +} + +sub build_local_exports_list($) +{ + $fn = shift; + + print STDERR "Opening dump of object [$fn]\n"; + + open(SP, '-|', "dumpbin /symbols \"".$fn."\"") or die "Can't open pipe for $fn"; + + LINE: + while () { + # 009 00000010 SECT3 notype () External | _remove_error_table@4 + m/^[[:xdigit:]]{3,}\s[[:xdigit:]]{8,}\s(\w+)\s+\w*\s+(?:\(\)| )\s+(\w+)\s+\|\s+(\S+)$/ && do { + my ($section, $visibility, $symbol) = ($1, $2, $3); + + if ($section ne "UNDEF" && $visibility eq "External") { + + my $exp_name = $symbol; + + if ($symbol =~ m/^_(\w+)(?:@.*|)$/) { + $exp_name = $1; + } + + if ($symbol =~ m/^_([^@]+)$/) { + $symbol = $1; + } + + $local_exports{$exp_name} = $symbol; + } + }; + } + + close SP; +} + +sub process_file($) +{ + $fn = shift; + + if ($fn =~ m/\.dll$/i) { + build_def_file($fn); + } elsif ($fn =~ m/\.obj$/i) { + build_local_exports_list($fn); + } else { + die "File type not recognized for $fn."; + } +} + +sub use_response_file($) +{ + $fn = shift; + + open (RF, '<', $fn) or die "Can't open response file $fn"; + + while () { + /^(\S+)$/ && do { + process_file($1); + } + } + close RF; +} + +print "; This is a generated file. Do not modify directly.\n"; +print "EXPORTS\n"; + +for (@ARGV) { + ARG: { + /^-m(.*)$/ && do { + $module_name = $1."."; + last ARG; + }; + + /^-l(.*)$/ && do { + $local_prefix = $1."_"; + last ARG; + }; + + /^-a$/ && do { + $always_export = 1; + last ARG; + }; + + /^-e(.*)$/ && do { + build_forwarder_target_list($1); + last ARG; + }; + + /^@(.*)$/ && do { + use_response_file($1); + last ARG; + }; + + process_file($_); + } +} diff --git a/crypto/heimdal/cf/w32-detect-vc-version.pl b/crypto/heimdal/cf/w32-detect-vc-version.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/w32-detect-vc-version.pl @@ -0,0 +1,49 @@ +######################################################################## +# +# Copyright (c) 2010, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +# Try to detect the version of Visual C++ in use by parsing the output +# of cl.exe. + +$cl_cmd = shift; + +die "C compiler command should be specified" if ($cl_cmd eq ''); + +open(CL, '-|', $cl_cmd." 2>&1") or die "Can't run C compiler command [$cl_cmd]"; + +$verline = ; + +if ($verline =~ /(\d+).(\d+).(\d+).(\d+)/) { + print "Found Version: $1.$2.$3.$4\n"; + exit $1 + 0; +} else { + print "Mismatch"; + exit 1; +} diff --git a/crypto/heimdal/cf/w32-hh-toc-from-info.pl b/crypto/heimdal/cf/w32-hh-toc-from-info.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/w32-hh-toc-from-info.pl @@ -0,0 +1,124 @@ +######################################################################## +# +# Copyright (c) 2010, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +use HTML::TreeBuilder; + + +my $input_file = "index.html"; +my $toc_file = "toc.hhc"; + +for (@ARGV) { + ARG: { + /-o(.*)/ && do { + $toc_file = $1; + last ARG; + }; + + $input_file = $_; + } +} + +print "Processing TOC in $input_file\n"; +print "Writing to $toc_file\n"; + +open(TOC, '>', $toc_file) or die "Can't open $toc_file\n"; + +my $tree = HTML::TreeBuilder->new(); + +$tree->parse_file($input_file); + +my $contents = $tree->look_down('class', 'contents'); +if (defined($contents)) { + my $clist = $contents->find_by_tag_name('ul'); +} + +print TOC ' + + + + + +'; + +process_ul_element($clist, 0); + +print TOC ' + + +'; + + +sub process_ul_element +{ + my $e = shift; + my $level = shift; + + return unless defined($e); + + if ($e->tag() eq "ul") { + + print TOC ' 'x$level; + print TOC "
    \n"; + + my @items = $e->content_list(); + + for (@items) { + process_li_element($_, $level + 1); + } + + print TOC ' 'x$level; + print TOC "
\n"; + } +} + +sub process_li_element +{ + my $e = shift; + my $level = shift; + + if ($e->tag() eq "li") { + my $a = $e->find_by_tag_name('a'); + + my $href = $a->attr('href'); + my @ac = $a->content_list(); + my $title = $ac[0]; + + print TOC " "x$level; + print TOC "
  • \n"; + + my @items = $e->content_list(); + + for (@items) { + process_ul_element($_, $level + 1); + } + } +} + diff --git a/crypto/heimdal/cf/w32-list-externs-from-objs.pl b/crypto/heimdal/cf/w32-list-externs-from-objs.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/w32-list-externs-from-objs.pl @@ -0,0 +1,114 @@ +######################################################################## +# +# Copyright (c) 2010, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +my $show_module_name = 1; +my $use_indent = 1; +my $strip_leading_underscore = 0; + +# Dump all symbols for the given object file that are defined and have +# external scope. + +sub dump_symbols_for_file($) +{ + $fn = shift; + + print STDERR "Opening dump of object [$fn]\n"; + + open(SP, '-|', "dumpbin /symbols \"".$fn."\"") or die "Can't open pipe for $fn"; + + LINE: + while () { + # 008 00000000 SECT3 notype () External | _encode_AccessDescription + + /^[[:xdigit:]]{3,}\s[[:xdigit:]]{8,}\s(\w+)\s+\w*\s+(\(\)| )\s+(\w+)\s+\|\s+([0-9a-zA-Z\@\_]+)$/ && do { + my ($section, $type, $visibility, $symbol) = ($1, $2, $3, $4); + + if ($section ne "UNDEF" && $visibility eq "External") { + print $fn if $show_module_name; + print "\t" if $use_indent || $show_module_name; + + if ($strip_leading_underscore && $symbol =~ /_(.*)/) { + $symbol = $1; + } + if ($strip_leading_underscore && $symbol =~ /(.*)\@.*$/) { + $symbol = $1; + } + print $symbol; + if ($type ne "()") { + print "\tDATA"; + } + print "\n"; + } + }; + } + + close SP; +} + +sub use_response_file($) +{ + $fn = shift; + + open (RF, '<', $fn) or die "Can't open response file $fn"; + + while () { + /(\S+)/ && do { + dump_symbols_for_file($1); + } + } + close RF; +} + +for (@ARGV) { + ARG: { + /^-q$/ && do { + $show_module_name = 0; + last ARG; + }; + + /^-1$/ && do { + $use_indent = 0; + last ARG; + }; + + /^-u$/ && do { + $strip_leading_underscore = 1; + last ARG; + }; + + /^@(.*)$/ && do { + use_response_file($1); + last ARG; + }; + + dump_symbols_for_file($_); + } +} diff --git a/crypto/heimdal/cf/wflags.m4 b/crypto/heimdal/cf/wflags.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/wflags.m4 @@ -0,0 +1,33 @@ +dnl $Id$ +dnl +dnl set WFLAGS + +AC_DEFUN([rk_WFLAGS],[ + +AC_ARG_ENABLE(developer, + AS_HELP_STRING([--enable-developer], [enable developer warnings])) +if test "X$enable_developer" = Xyes; then + dwflags="-Werror" +fi +AM_CONDITIONAL(DEVELOPER_MODE, test "X$enable_developer" = Xyes) + +WFLAGS_NOUNUSED="" +if test -z "$WFLAGS" -a "$GCC" = "yes"; then + # leave these out for now: + # -Wcast-align doesn't work well on alpha osf/1 + # -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast + # -Wmissing-declarations -Wnested-externs + # -Wstrict-overflow=5 + WFLAGS="ifelse($#, 0,-Wall, $1) $dwflags" + + # + # WFLAGS_LITE can be appended to WFLAGS to turn off a host of warnings + # that fail for various bits of older code in appl/. Let's not use it + # for the main libraries, though. + WFLAGS_LITE="-Wno-extra -Wno-missing-field-initializers -Wno-strict-aliasing -Wno-shadow" + # -Wno-unused-result (not supported on gcc-4.2) + +fi +AC_SUBST(WFLAGS)dnl +AC_SUBST(WFLAGS_LITE)dnl +]) diff --git a/crypto/heimdal/cf/win32.m4 b/crypto/heimdal/cf/win32.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/win32.m4 @@ -0,0 +1,16 @@ +dnl $Id$ +dnl rk_WIN32_EXPORT buildsymbol symbol-that-export +AC_DEFUN([rk_WIN32_EXPORT],[AH_TOP([#ifdef $1 +#ifndef $2 +#ifdef _WIN32_ +#define $2_FUNCTION __declspec(dllexport) +#define $2_CALL __stdcall +#define $2_VARIABLE __declspec(dllexport) +#else +#define $2_FUNCTION +#define $2_CALL +#define $2_VARIABLE +#endif +#endif +#endif +])]) diff --git a/crypto/heimdal/cf/with-all.m4 b/crypto/heimdal/cf/with-all.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/cf/with-all.m4 @@ -0,0 +1,42 @@ +dnl +dnl $Id$ +dnl + +dnl AC_WITH_ALL(name) + +AC_DEFUN([AC_WITH_ALL], [ +AC_ARG_WITH($1, + AS_HELP_STRING([--with-$1=dir], + [use $1 in dir])) + +AC_ARG_WITH($1-lib, + AS_HELP_STRING([--with-$1-lib=dir], + [use $1 libraries in dir]), +[if test "$withval" = "yes" -o "$withval" = "no"; then + AC_MSG_ERROR([No argument for --with-$1-lib]) +elif test "X$with_$1" = "X"; then + with_$1=yes +fi]) + +AC_ARG_WITH($1-include, + AS_HELP_STRING([--with-$1-include=dir], + [use $1 headers in dir]), +[if test "$withval" = "yes" -o "$withval" = "no"; then + AC_MSG_ERROR([No argument for --with-$1-include]) +elif test "X$with_$1" = "X"; then + with_$1=yes +fi]) + +case "$with_$1" in +yes) ;; +no) ;; +"") ;; +*) if test "$with_$1_include" = ""; then + with_$1_include="$with_$1/include" + fi + if test "$with_$1_lib" = ""; then + with_$1_lib="$with_$1/lib$abilibdirext" + fi + ;; +esac +]) \ No newline at end of file diff --git a/crypto/heimdal/compile b/crypto/heimdal/compile --- a/crypto/heimdal/compile +++ b/crypto/heimdal/compile @@ -1,10 +1,9 @@ #! /bin/sh -# Wrapper for compilers which do not understand `-c -o'. +# Wrapper for compilers which do not understand '-c -o'. -scriptversion=2009-10-06.20; # UTC +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software -# Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify @@ -18,7 +17,7 @@ # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# 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 @@ -29,21 +28,224 @@ # bugs to or send patches to # . +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + case $1 in '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] -Wrapper for compilers which do not understand `-c -o'. -Remove `-o dest.o' from ARGS, run PROGRAM with the remaining +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the -right script to run: please start by reading the file `INSTALL'. +right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF @@ -53,11 +255,14 @@ echo "compile $scriptversion" exit $? ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; esac ofile= cfile= -eat= for arg do @@ -66,8 +271,8 @@ else case $1 in -o) - # configure might choose to run compile as `compile cc -o foo foo.c'. - # So we strip `-o arg' only if arg is an object. + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) @@ -94,10 +299,10 @@ done if test -z "$ofile" || test -z "$cfile"; then - # If no `-o' option was seen then we might have been invoked from a + # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no - # `.c' file was seen then we are probably linking. That is also + # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi @@ -106,7 +311,7 @@ cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. -# Note: use `[/\\:.-]' here to ensure that we don't use the same name +# Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d @@ -135,9 +340,9 @@ # Local Variables: # mode: shell-script # sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/crypto/heimdal/config.guess b/crypto/heimdal/config.guess --- a/crypto/heimdal/config.guess +++ b/crypto/heimdal/config.guess @@ -1,14 +1,14 @@ -#! /bin/sh +#!/usr/bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. +# Copyright 1992-2022 Free Software Foundation, Inc. -timestamp='2009-11-20' +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-05-25' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# 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 @@ -17,26 +17,30 @@ # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# 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 Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# 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"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # 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 +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -45,7 +49,7 @@ Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -56,8 +60,7 @@ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright 1992-2022 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." @@ -91,7 +94,8 @@ exit 1 fi -trap 'exit 1' 1 2 15 +# Just in case it came from the environment. +GUESS= # 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 @@ -103,48 +107,93 @@ # 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= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { 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" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + 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 +} # 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 +if test -f /.attbin/uname ; 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_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/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +esac + # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # 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 @@ -153,22 +202,32 @@ # # 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 + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; 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 ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-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 + # to ELF recently (or will in the future) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -180,7 +239,14 @@ fi ;; *) - os=netbsd + os=netbsd + ;; + esac + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release @@ -188,42 +254,74 @@ # 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 + case $UNAME_VERSION in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; 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 ;; + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 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}'` + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on @@ -231,160 +329,158 @@ # 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 + case $ALPHA_CPU_TYPE in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + 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'` - exit ;; - 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 ;; + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; Amiga*:UNIX_System_V:4.0:*) - echo m68k-unknown-sysv4 - exit ;; + GUESS=m68k-unknown-sysv4 + ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos - exit ;; + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos - exit ;; + GUESS=$UNAME_MACHINE-unknown-morphos + ;; *:OS/390:*:*) - echo i370-ibm-openedition - exit ;; + GUESS=i370-ibm-openedition + ;; *:z/VM:*:*) - echo s390-ibm-zvmoe - exit ;; + GUESS=s390-ibm-zvmoe + ;; *:OS400:*:*) - echo powerpc-ibm-os400 - exit ;; + GUESS=powerpc-ibm-os400 + ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) - echo arm-unknown-riscos - exit ;; + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) - echo hppa1.1-hitachi-hiuxmpp - exit ;; + GUESS=hppa1.1-hitachi-hiuxmpp + ;; 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 ;; + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; NILE*:*:*:dcosx) - echo pyramid-pyramid-svr4 - exit ;; + GUESS=pyramid-pyramid-svr4 + ;; DRS?6000:unix:4.0:6*) - echo sparc-icl-nx6 - exit ;; + GUESS=sparc-icl-nx6 + ;; 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 ;; + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" + 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 test "$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) | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; 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 ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in + 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 ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit ;; + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; 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 + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case `/bin/arch` in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac - exit ;; + ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} - exit ;; + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; # 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 @@ -394,44 +490,44 @@ # 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 ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; RISC*:Mach:*:*) - echo mips-dec-mach_bsd4.3 - exit ;; + GUESS=mips-dec-mach_bsd4.3 + ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit ;; + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} - exit ;; + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -440,95 +536,96 @@ #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + 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); + 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); + 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` && + $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 ;; + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; Motorola:PowerMAX_OS:*:*) - echo powerpc-motorola-powermax - exit ;; + GUESS=powerpc-motorola-powermax + ;; Motorola:*:4.3:PL8-*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) - echo powerpc-harris-powermax - exit ;; + GUESS=powerpc-harris-powermax + ;; Night_Hawk:Power_UNIX:*:*) - echo powerpc-harris-powerunix - exit ;; + GUESS=powerpc-harris-powerunix + ;; m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit ;; + GUESS=m88k-harris-cxux7 + ;; m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit ;; + GUESS=m88k-motorola-sysv4 + ;; m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; AViiON:dgux:*:*) - # DG/UX returns AViiON for all architectures - UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x then - echo m88k-dg-dgux${UNAME_RELEASE} + GUESS=m88k-dg-dgux$UNAME_RELEASE else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else - echo i586-dg-dgux${UNAME_RELEASE} + GUESS=i586-dg-dgux$UNAME_RELEASE fi - exit ;; + ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit ;; + GUESS=m88k-dolphin-sysv3 + ;; M88*:*:R3*:*) # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit ;; + GUESS=m88k-motorola-sysv3 + ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit ;; + GUESS=m88k-tektronix-sysv3 + ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit ;; + GUESS=m68k-tektronix-bsd + ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit ;; + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; ????????: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 ' + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) - echo i386-ibm-aix - exit ;; + GUESS=i386-ibm-aix + ;; ia64:AIX:*:*) - if [ -x /usr/bin/oslevel ] ; then + if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} - exit ;; + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; *: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 + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -539,115 +636,116 @@ exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then - echo "$SYSTEM_NAME" + GUESS=$SYSTEM_NAME else - echo rs6000-ibm-aix3.2.5 + GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 + GUESS=rs6000-ibm-aix3.2.4 else - echo rs6000-ibm-aix3.2 + GUESS=rs6000-ibm-aix3.2 fi - exit ;; - *:AIX:*:[456]) + ;; + *: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 + 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` + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit ;; + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; *:AIX:*:*) - echo rs6000-ibm-aix - exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit ;; + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; 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 + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) - echo rs6000-bull-bosx - exit ;; + GUESS=rs6000-bull-bosx + ;; DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit ;; + GUESS=m68k-bull-sysv3 + ;; 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit ;; + GUESS=m68k-hp-bsd + ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit ;; + GUESS=m68k-hp-bsd4.4 + ;; 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 ;; + 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 + if test -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 + 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); - } + if test "$HP_ARCH" = ""; then + 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` + (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" ] + if test "$HP_ARCH" = hppa2.0w then - eval $set_cc_for_build + 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 @@ -658,23 +756,23 @@ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit ;; + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} - exit ;; + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -699,166 +797,187 @@ exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $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 ;; + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit ;; + GUESS=hppa1.0-hp-bsd + ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) - echo hppa1.0-hp-mpeix - exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit ;; + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit ;; + GUESS=hppa1.0-hp-osf + ;; i*86:OSF1:*:*) - if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + GUESS=$UNAME_MACHINE-unknown-osf1 fi - exit ;; + ;; parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit ;; + GUESS=hppa1.1-hp-lites + ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit ;; + GUESS=c1-convex-bsd + ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi - exit ;; + exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit ;; + GUESS=c34-convex-bsd + ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit ;; + GUESS=c38-convex-bsd + ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit ;; + GUESS=c4-convex-bsd + ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + 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_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' - exit ;; + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; 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 ;; + 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/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; 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 ;; + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; *:FreeBSD:*:*) - case ${UNAME_MACHINE} in - pc98) - echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=`/usr/bin/uname -p` + case $UNAME_PROCESSOR in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac - exit ;; + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 - exit ;; + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; *:Interix*:*) - case ${UNAME_MACHINE} in + case $UNAME_MACHINE in x86) - echo i586-pc-interix${UNAME_RELEASE} - exit ;; + GUESS=i586-pc-interix$UNAME_RELEASE + ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; IA64) - echo ia64-unknown-interix${UNAME_RELEASE} - exit ;; + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; 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 ;; + GUESS=$UNAME_MACHINE-pc-uwin + ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin - exit ;; + GUESS=x86_64-pc-cygwin + ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit ;; + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit ;; + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; *: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/[-(].*//'`-gnu - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -866,171 +985,252 @@ EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; - esac + esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} - exit ;; + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; arm*:Linux:*:*) - eval $set_cc_for_build + 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-gnu + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi fi - exit ;; + ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; cris:Linux:*:*) - echo cris-axis-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; frv:Linux:*:*) - echo frv-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + hexagon:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" - exit ;; + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; - or32:Linux:*:*) - echo or32-unknown-linux-gnu - exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu - exit ;; + GUESS=sparc-unknown-linux-$LIBC + ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu - exit ;; + GUESS=hppa64-unknown-linux-$LIBC + ;; 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-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; esac - exit ;; + ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu - exit ;; + GUESS=powerpc64-unknown-linux-$LIBC + ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu - exit ;; + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux - exit ;; + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + tile*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu - exit ;; + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac + fi + GUESS=$CPU-pc-linux-$LIBCABI + ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu - exit ;; + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; 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 ;; + GUESS=i386-sequent-sysv4 + ;; 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, + # 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 ;; + # Use sysv4.2uw... so that sysv4* matches it. + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; 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 ;; + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop - exit ;; + GUESS=$UNAME_MACHINE-unknown-stop + ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos - exit ;; + GUESS=$UNAME_MACHINE-unknown-atheos + ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable - exit ;; + GUESS=$UNAME_MACHINE-pc-syllable + ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; 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$//'` + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*: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} + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi - exit ;; + ;; i*86:*:5:[678]*) - # UnixWare 7.x, OpenUNIX and OpenServer 6. + # 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 ;; + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; 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 @@ -1040,43 +1240,43 @@ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else - echo ${UNAME_MACHINE}-pc-sysv32 + GUESS=$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. + # 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 + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. - echo i586-pc-msdosdjgpp - exit ;; + GUESS=i586-pc-msdosdjgpp + ;; Intel:Mach:3*:*) - echo i386-pc-mach3 - exit ;; + GUESS=i386-pc-mach3 + ;; paragon:*:*:*) - echo i860-intel-osf1 - exit ;; + GUESS=i860-intel-osf1 + ;; 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 + GUESS=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 + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi - exit ;; + ;; mini*:CTIX:SYS*5:*) # "miniframe" - echo m68010-convergent-sysv - exit ;; + GUESS=m68010-convergent-sysv + ;; mc68k:UNIX:SYSTEM5:3.51m) - echo m68k-convergent-sysv - exit ;; + GUESS=m68k-convergent-sysv + ;; M680?0:D-NIX:5.3:*) - echo m68k-diab-dnix - exit ;; + GUESS=m68k-diab-dnix + ;; 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) @@ -1084,231 +1284,298 @@ 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; } + && { 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; } ;; + && { 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; } ;; + /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; } + && { 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; } + && { 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; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; mc68030:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit ;; + GUESS=m68k-atari-sysv4 + ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit ;; + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} - exit ;; + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; RM*:ReliantUNIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit ;; + GUESS=mips-sni-sysv4 + ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + GUESS=$UNAME_MACHINE-sni-sysv4 else - echo ns32k-sni-sysv + GUESS=ns32k-sni-sysv fi - exit ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort - # says - echo i586-unisys-sysv4 - exit ;; + ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + GUESS=i586-unisys-sysv4 + ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm - echo hppa1.1-stratus-sysv4 - exit ;; + GUESS=hppa1.1-stratus-sysv4 + ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. - echo i860-stratus-sysv4 - exit ;; + GUESS=i860-stratus-sysv4 + ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos - exit ;; + GUESS=$UNAME_MACHINE-stratus-vos + ;; *:VOS:*:*) # From Paul.Green@stratus.com. - echo hppa1.1-stratus-vos - exit ;; + GUESS=hppa1.1-stratus-vos + ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit ;; + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; news*:NEWS-OS:6*:*) - echo mips-sony-newsos6 - exit ;; + GUESS=mips-sony-newsos6 + ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE else - echo mips-unknown-sysv${UNAME_RELEASE} + GUESS=mips-unknown-sysv$UNAME_RELEASE fi - exit ;; + ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. - echo powerpc-be-beos - exit ;; + GUESS=powerpc-be-beos + ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. - echo powerpc-apple-beos - exit ;; + GUESS=powerpc-apple-beos + ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. - echo i586-pc-beos - exit ;; + GUESS=i586-pc-beos + ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. - echo i586-pc-haiku - exit ;; + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} - exit ;; + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} - exit ;; + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$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 + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; *:QNX:*:4*) - echo i386-pc-qnx - exit ;; - NSE-?:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; *:NonStop-UX:*:*) - echo mips-compaq-nonstopux - exit ;; + GUESS=mips-compaq-nonstopux + ;; BS2000:POSIX*:*:*) - echo bs2000-siemens-sysv - exit ;; + GUESS=bs2000-siemens-sysv + ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} - exit ;; + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; *: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 + if test "${cputype-}" = 386; then UNAME_MACHINE=i386 - else - UNAME_MACHINE="$cputype" + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype fi - echo ${UNAME_MACHINE}-unknown-plan9 - exit ;; + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; *:TOPS-10:*:*) - echo pdp10-unknown-tops10 - exit ;; + GUESS=pdp10-unknown-tops10 + ;; *:TENEX:*:*) - echo pdp10-unknown-tenex - exit ;; + GUESS=pdp10-unknown-tenex + ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) - echo pdp10-dec-tops20 - exit ;; + GUESS=pdp10-dec-tops20 + ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) - echo pdp10-xkl-tops20 - exit ;; + GUESS=pdp10-xkl-tops20 + ;; *:TOPS-20:*:*) - echo pdp10-unknown-tops20 - exit ;; + GUESS=pdp10-unknown-tops20 + ;; *:ITS:*:*) - echo pdp10-unknown-its - exit ;; + GUESS=pdp10-unknown-its + ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} - exit ;; + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; *:*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 ;; + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) - echo i386-pc-xenix - exit ;; + GUESS=i386-pc-xenix + ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' - exit ;; + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos - exit ;; - i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros - exit ;; + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi -eval $set_cc_for_build -cat >$dummy.c < "$dummy.c" < -# include +#include +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif #endif main () { @@ -1321,20 +1588,12 @@ #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 - "4" + "4" #else - "" -#endif - ); exit (0); + "" #endif + ); exit (0); #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) @@ -1376,39 +1635,54 @@ #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); + 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 +#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 +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif #endif #if defined (alliant) && defined (i860) @@ -1419,54 +1693,46 @@ } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && +$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; } -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } +echo "$0: unable to guess system type" >&2 -# Convex versions that predate uname can use getsysinfo(1) +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 < in order to provide the needed -information to handle your system. +our_year=`echo $timestamp | sed 's,-.*,,'` +thisyear=`date +%Y` +# shellcheck disable=SC2003 +script_age=`expr "$thisyear" - "$our_year"` +if test "$script_age" -lt 3 ; then + cat >&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} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF +fi exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/crypto/heimdal/config.sub b/crypto/heimdal/config.sub --- a/crypto/heimdal/config.sub +++ b/crypto/heimdal/config.sub @@ -1,38 +1,33 @@ -#! /bin/sh +#!/usr/bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 -# Free Software Foundation, Inc. +# Copyright 1992-2022 Free Software Foundation, Inc. -timestamp='2009-11-20' +# shellcheck disable=SC2006,SC2268 # see below for rationale -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +timestamp='2022-01-03' + +# 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. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# 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. +# 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 to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -40,7 +35,7 @@ # 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 +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -57,15 +52,21 @@ # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -75,8 +76,7 @@ version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +Copyright 1992-2022 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." @@ -98,12 +98,12 @@ - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -119,1130 +119,1186 @@ 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-dietlibc | linux-newlib* | 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/'` - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | 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* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac ;; - -clix*) - basic_machine=clipper-intergraph + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # 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) + cpu=hppa1.1 + vendor=winbond ;; - -lynx*) - os=-lynxos + op50n) + cpu=hppa1.1 + vendor=oki ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + op60c) + cpu=hppa1.1 + vendor=oki ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` + ibm*) + cpu=i370 + vendor=ibm ;; - -psos*) - os=-psos + orion105) + cpu=clipper + vendor=highlevel ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple ;; -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 \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | 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 \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nios | nios2 \ - | ns16k | ns32k \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ - | pyramid \ - | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu | strongarm \ - | tahoe | thumb | tic4x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e \ - | we32k \ - | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - m6811 | m68hc11 | m6812 | m68hc12 | picochip) - # Motorola 68HC11/12. - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown + pmac | pmac-mpw) + cpu=powerpc + vendor=apple ;; - # 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-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ - | 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-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ - | 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-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ - | pyramid-* \ - | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ - | tahoe-* | thumb-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ - | 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 + cpu=m68000 + vendor=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 + cpu=we32k + vendor=att ;; bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - 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) - 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 + cpu=powerpc + vendor=ibm + basic_os=cnk ;; decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 + cpu=pdp10 + vendor=dec + basic_os=tops10 ;; decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 + cpu=pdp10 + vendor=dec + basic_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 + cpu=m68k + vendor=motorola ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 ;; encore | umax | mmax) - basic_machine=ns32k-encore + cpu=ns32k + vendor=encore ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} ;; fx2800) - basic_machine=i860-alliant + cpu=i860 + vendor=alliant ;; genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 + cpu=ns32k + vendor=ns ;; 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 + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp + cpu=m68000 + vendor=hp ;; hp9k3[2-9][0-9]) - basic_machine=m68k-hp + cpu=m68k + vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=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 + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp + cpu=hppa1.1 + vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp + cpu=hppa1.0 + vendor=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'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 ;; i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 ;; i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv ;; i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} ;; iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) + cpu=mips + vendor=sgi + case $basic_os in + irix*) ;; *) - os=-irix4 + basic_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 - ;; - 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/'` + cpu=m68000 + vendor=convergent ;; - 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-/'` - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - 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 + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint ;; 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* ) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) ;; - -ns2*) - os=-nextstep2 + ns2*) + basic_os=nextstep2 ;; *) - os=-nextstep3 + basic_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 - ;; - nsr-tandem) - basic_machine=nsr-tandem + cpu=np1 + vendor=gould ;; 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 + cpu=hppa1.1 + vendor=oki + basic_os=proelf ;; 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 + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 ;; pbd) - basic_machine=sparc-tti + cpu=sparc + vendor=tti ;; pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 + cpu=m68k + vendor=tti ;; - 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/^[^-]*-//'` + pc532) + cpu=ns32k + vendor=pc532 ;; pn) - basic_machine=pn-gould - ;; - power) basic_machine=power-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64) basic_machine=powerpc64-unknown + cpu=pn + vendor=gould ;; - 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/^[^-]*-//'` + power) + cpu=power + vendor=ibm ;; ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff + cpu=i386 + vendor=ibm ;; rm[46]00) - basic_machine=mips-siemens + cpu=mips + vendor=siemens ;; rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm + cpu=romp + vendor=ibm ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks ;; - sde) - basic_machine=mipsisa32-sde - os=-elf + tower | tower-32) + cpu=m68k + vendor=ncr ;; - sei) - basic_machine=mips-sei - os=-seiux + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu ;; - sequent) - basic_machine=i386-sequent + w65) + cpu=w65 + vendor=wdc ;; - sh) - basic_machine=sh-hitachi - os=-hms + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf ;; - sh5el) - basic_machine=sh5le-unknown + none) + cpu=none + vendor=none ;; - sh64) - basic_machine=sh64-unknown + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb | arc32 | arc64 \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | loongarch32 | loongarch64 | loongarchx32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r3 | mipsisa32r3el \ + | mipsisa32r5 | mipsisa32r5el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r3 | mipsisa64r3el \ + | mipsisa64r5 | mipsisa64r5el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv32be | riscv64 | riscv64be \ + | rl78 | romp | rs6000 | rx \ + | s390 | s390x \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | thumbv7* \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1250,200 +1306,215 @@ # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if test x$basic_os != x then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 - exit 1 + # No normalization, but not necessarily accepted, that comes below. ;; esac + else # Here we handle the default operating systems that come with various machines. @@ -1456,249 +1527,363 @@ # 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 +kernel= +case $cpu-$vendor in + score-*) + os=elf ;; - spu-*) - os=-elf + spu-*) + os=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + kernel=linux + os=gnu ;; arm*-semi) - os=-aout + os=aout + ;; + c4x-* | tic4x-*) + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix + ;; + hexagon-*) + os=elf + ;; + tic54x-*) + os=coff + ;; + tic55x-*) + os=coff ;; - c4x-* | tic4x-*) - os=-coff + tic6x-*) + os=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 + os=sunos3 ;; m68*-cisco) - os=-aout + os=aout ;; - mep-*) - os=-elf + mep-*) + os=elf ;; mips*-cisco) - os=-elf + os=elf ;; mips*-*) - os=-elf + os=elf ;; or32-*) - os=-coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 ;; - *-be) - os=-beos + pru-*) + os=elf ;; - *-haiku) - os=-haiku + *-be) + os=beos ;; *-ibm) - os=-aix + os=aix ;; - *-knuth) - os=-mmixware + *-knuth) + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna + os=luna ;; - *-next ) - os=-nextstep + *-next) + os=nextstep ;; *-sequent) - os=-ptx + os=ptx ;; *-crds) - os=-unos + os=unos ;; *-ns) - os=-genix + os=genix ;; i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os=coff ;; *-*bug) - os=-coff + os=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac + fi +# Now, validate our (potentially fixed-up) OS. +case $os in + # Sometimes we do "kernel-libc", so those need to count as OSes. + musl* | newlib* | relibc* | uclibc*) + ;; + # Likewise for "kernel-abi" + eabi* | gnueabi*) + ;; + # VxWorks passes extra cpu info in the 4th filed. + simlinux | simwindows | spe) + ;; + # Now accept the basic system types. + # The portable systems comes first. + # Each alternative MUST end in a * to match a version number. + gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ + | hiux* | abug | nacl* | netware* | windows* \ + | os9* | macos* | osx* | ios* \ + | mpw* | magic* | mmixware* | mon960* | lnews* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | mirbsd* | netbsd* | dicos* | openedition* | ose* \ + | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* | serenity* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | mint* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ + | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ + | fiwix* ) + ;; + # This one is extra strict with allowed versions + sco3.2v2 | sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + none) + ;; + *) + echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + # 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*) +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) vendor=acorn ;; - -sunos*) + *-sunos*) vendor=sun ;; - -cnk*|-aix*) + *-cnk* | *-aix*) vendor=ibm ;; - -beos*) + *-beos*) vendor=be ;; - -hpux*) + *-hpux*) vendor=hp ;; - -mpeix*) + *-mpeix*) vendor=hp ;; - -hiux*) + *-hiux*) vendor=hitachi ;; - -unos*) + *-unos*) vendor=crds ;; - -dgux*) + *-dgux*) vendor=dg ;; - -luna*) + *-luna*) vendor=omron ;; - -genix*) + *-genix*) vendor=ns ;; - -mvs* | -opened*) + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) vendor=ibm ;; - -os400*) + s390-* | s390x-*) vendor=ibm ;; - -ptx*) + *-ptx*) vendor=sequent ;; - -tpf*) + *-tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; - -aux*) + *-aux*) vendor=apple ;; - -hms*) + *-hms*) vendor=hitachi ;; - -mpw* | -macos*) + *-mpw* | *-macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; - -vos*) + *-vos*) vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/crypto/heimdal/configure b/crypto/heimdal/configure --- a/crypto/heimdal/configure +++ b/crypto/heimdal/configure @@ -1,13 +1,12 @@ #! /bin/sh # From configure.ac Revision. # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.65 for Heimdal 1.5.2. +# Generated by GNU Autoconf 2.71 for Heimdal 7.8.0. # -# Report bugs to . +# Report bugs to . # # -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # @@ -19,14 +18,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (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 +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -36,46 +37,46 @@ fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. 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 +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; 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 || @@ -84,22 +85,20 @@ 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -111,40 +110,47 @@ 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 + printf "%s\n" "$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'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +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 : + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (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 +else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( @@ -164,12 +170,16 @@ 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 : +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : -else +else \$as_nop exitcode=1; echo positional parameters were not saved. fi -test x\$exitcode = x0 || exit 1" +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || 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'\" && @@ -183,30 +193,38 @@ test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : + if (eval "$as_required") 2>/dev/null +then : as_have_required=yes -else +else $as_nop as_have_required=no fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : -else +else $as_nop 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=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac 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 + 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 : + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 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 : + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : break 2 fi fi @@ -214,36 +232,55 @@ 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 $as_found +then : - - if test "x$CONFIG_SHELL" != x; then : - # 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. - BASH_ENV=/dev/null - ENV=/dev/null - (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi 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." + + 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'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else - $as_echo "$0: Please tell bug-autoconf@gnu.org and -$0: heimdal-bugs@h5l.org about your system, including any -$0: error possibly output before this message. Then install -$0: a modern shell, or manually run the script under such a -$0: shell if you do have one." + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and +$0: https://github.com/heimdal/heimdal/issues about your +$0: system, including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." fi exit 1 fi @@ -267,6 +304,7 @@ } as_unset=as_fn_unset + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -284,6 +322,14 @@ as_fn_set_status $1 exit $1 } # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop # as_fn_mkdir_p # ------------- @@ -298,7 +344,7 @@ as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -307,7 +353,7 @@ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -328,22 +374,31 @@ test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p + +# 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 : +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 +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -355,32 +410,41 @@ # 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 : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop -# as_fn_error ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error @@ -407,7 +471,7 @@ $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -451,8 +515,12 @@ 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; } + { printf "%s\n" "$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). @@ -461,6 +529,10 @@ exit } + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -474,6 +546,13 @@ ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -487,16 +566,16 @@ # ... 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 -p'. + # 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 -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -508,28 +587,8 @@ as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x +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'" @@ -544,7 +603,7 @@ exec 6>&1 # Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` @@ -563,50 +622,46 @@ # Identity of this package. PACKAGE_NAME='Heimdal' PACKAGE_TARNAME='heimdal' -PACKAGE_VERSION='1.5.2' -PACKAGE_STRING='Heimdal 1.5.2' -PACKAGE_BUGREPORT='heimdal-bugs@h5l.org' +PACKAGE_VERSION='7.8.0' +PACKAGE_STRING='Heimdal 7.8.0' +PACKAGE_BUGREPORT='https://github.com/heimdal/heimdal/issues' PACKAGE_URL='' ac_unique_file="kuser/kinit.c" # Factoring default headers for most tests. ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include +#include +#ifdef HAVE_STDIO_H +# include #endif -#ifdef STDC_HEADERS +#ifdef HAVE_STDLIB_H # 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_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif #ifdef HAVE_UNISTD_H # include #endif" +ac_header_c_list= ac_default_prefix=/usr/heimdal -ac_header_list= +ac_func_c_list= enable_option_checking=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE @@ -629,24 +684,13 @@ KCM_TRUE LIB_door_create LIB_getpwnam_r +HAVE_DLADDR_FALSE +HAVE_DLADDR_TRUE +LIB_dladdr LIB_tgetent LIB_openpty LIB_logout LIB_logwtmp -NEED_WRITEAUTH_FALSE -NEED_WRITEAUTH_TRUE -LIB_XauFileName -LIB_XauReadAuth -LIB_XauWriteAuth -HAVE_X_FALSE -HAVE_X_TRUE -X_EXTRA_LIBS -X_LIBS -X_PRE_LIBS -X_CFLAGS -XMKMF -LIB_hesiod -INCLUDE_hesiod subdirs LIB_libedit INCLUDE_libedit @@ -658,10 +702,12 @@ CATMAN GROFF NROFF +ENABLE_AFS_STRING_TO_KEY LIB_security have_gcd_FALSE have_gcd_TRUE LIB_dispatch_async_f +GCD_MIG OTP_FALSE OTP_TRUE LIB_otp @@ -679,6 +725,7 @@ LIB_getnameinfo LIB_getaddrinfo LIB_pidfile +LIB_bswap64 LIB_bswap32 LIB_bswap16 LIB_hstrerror @@ -706,15 +753,22 @@ have_ifaddrs_h_TRUE have_err_h_FALSE have_err_h_TRUE -WFLAGS_NOIMPLICITINT -WFLAGS_NOUNUSED +WFLAGS_LITE WFLAGS -LIB_NDBM -DBLIB +DEVELOPER_MODE_FALSE +DEVELOPER_MODE_TRUE +db_type_preference +db_type +NDBMLIB +LMDBLIB +DB1LIB +DB3LIB HAVE_DBHEADER_FALSE HAVE_DBHEADER_TRUE HAVE_NDBM_FALSE HAVE_NDBM_TRUE +HAVE_LMDB_FALSE +HAVE_LMDB_TRUE HAVE_DB3_FALSE HAVE_DB3_TRUE HAVE_DB1_FALSE @@ -723,6 +777,8 @@ LIB_dbopen LIB_db_create DBHEADER +NO_AFS_FALSE +NO_AFS_TRUE NO_AFS dpagaix_ldflags dpagaix_ldadd @@ -732,23 +788,21 @@ PTHREAD_LIBADD PTHREAD_LDADD PTHREAD_CFLAGS +ENABLE_PTHREAD_SUPPORT_FALSE +ENABLE_PTHREAD_SUPPORT_TRUE LIB_hcrypto_appl LIB_hcrypto_so LIB_hcrypto_a LIB_hcrypto -INCLUDE_hcrypto -DIR_hcrypto -HAVE_OPENSSL_FALSE -HAVE_OPENSSL_TRUE +LIB_openssl_crypto +INCLUDE_openssl_crypto +HAVE_HCRYPTO_W_OPENSSL_FALSE +HAVE_HCRYPTO_W_OPENSSL_TRUE LIB_kdb do_roken_rename_FALSE do_roken_rename_TRUE KRB5_FALSE KRB5_TRUE -KRB4_FALSE -KRB4_TRUE -LIB_krb4 -INCLUDE_krb4 DIR_hdbdir LIB_libintl INCLUDE_libintl @@ -786,6 +840,7 @@ LEX YFLAGS YACC +PERL IRIX_FALSE IRIX_TRUE AIX_EXTRA_KAFS @@ -800,6 +855,18 @@ AIX_FALSE AIX_TRUE CANONICAL_HOST +CLANG_FORMAT +pkgpyexecdir +pyexecdir +pkgpythondir +pythondir +PYTHON_EXEC_PREFIX +PYTHON_PREFIX +PYTHON_PLATFORM +PYTHON_VERSION +PYTHON +CPP +LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO @@ -809,8 +876,7 @@ RANLIB ac_ct_AR AR -DLLTOOL -OBJDUMP +FILECMD LN_S NM ac_ct_DUMPBIN @@ -820,23 +886,13 @@ EGREP GREP SED -host_os -host_vendor -host_cpu -host -build_os -build_vendor -build_cpu -build -LIBTOOL -CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE +am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE -am__quote am__include DEPDIR OBJEXT @@ -846,9 +902,28 @@ LDFLAGS CFLAGS CC +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +OBJDUMP +DLLTOOL +AS MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +CSCOPE +ETAGS +CTAGS am__untar am__tar AMTAR @@ -891,6 +966,7 @@ docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -909,19 +985,25 @@ PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR -SHELL' +SHELL +am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_silent_rules enable_maintainer_mode -enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install +with_aix_soname +enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock +with_python_sys_prefix +with_python_prefix +with_python_exec_prefix enable_largefile enable_dynamic_afs with_mips_abi @@ -945,15 +1027,20 @@ with_libintl_include with_libintl_config with_hdbdir +with_hcrypto_default_backend +with_hcrypto_fallback with_openssl with_openssl_lib with_openssl_include +with_pkcs11_module enable_pthread_support enable_dce enable_afs_support +with_db_type_preference with_berkeley_db with_berkeley_db_include enable_ndbm_db +enable_mdb_db enable_developer with_ipv6 enable_socket_wrapper @@ -969,13 +1056,8 @@ with_libedit_lib with_libedit_include with_libedit_config -with_hesiod -with_hesiod_lib -with_hesiod_include -with_hesiod_config enable_bigendian enable_littleendian -with_x enable_kcm enable_heimdal_documentation ' @@ -987,13 +1069,14 @@ LDFLAGS LIBS CPPFLAGS +LT_SYS_LIBRARY_PATH CPP +PYTHON YACC YFLAGS PKG_CONFIG CAPNG_CFLAGS -CAPNG_LIBS -XMKMF' +CAPNG_LIBS' ac_subdirs_all='lib/libedit' # Initialize some variables set by options. @@ -1032,6 +1115,7 @@ sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' @@ -1056,12 +1140,11 @@ fi case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac - # Accept the important Cygnus configure options, so we can diagnose typos. - case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; @@ -1102,9 +1185,9 @@ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1128,9 +1211,9 @@ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid feature name: $ac_useropt" + as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" @@ -1283,6 +1366,15 @@ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1332,9 +1424,9 @@ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1348,9 +1440,9 @@ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error "invalid package name: $ac_useropt" + as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" @@ -1378,8 +1470,8 @@ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; - -*) as_fn_error "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information." + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; *=*) @@ -1387,17 +1479,17 @@ # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error "invalid variable name: \`$ac_envvar'" ;; + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + printf "%s\n" "$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} + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac @@ -1405,14 +1497,14 @@ if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error "missing argument to $ac_option" + as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; - fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi @@ -1420,7 +1512,7 @@ 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 + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1434,7 +1526,7 @@ [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac - as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' @@ -1448,8 +1540,6 @@ if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe - $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi @@ -1464,9 +1554,9 @@ ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error "working directory cannot be determined" + as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error "pwd does not report name of working directory" + as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. @@ -1478,7 +1568,7 @@ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | +printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -1505,11 +1595,11 @@ fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then @@ -1535,7 +1625,7 @@ # 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 Heimdal 1.5.2 to adapt to many kinds of systems. +\`configure' configures Heimdal 7.8.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1549,7 +1639,7 @@ --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages + -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files @@ -1575,6 +1665,7 @@ --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] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1597,10 +1688,6 @@ --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names -X features: - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR - System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] @@ -1609,7 +1696,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Heimdal 1.5.2:";; + short | recursive ) echo "Configuration of Heimdal 7.8.0:";; esac cat <<\_ACEOF @@ -1617,14 +1704,19 @@ --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 - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer --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] + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --disable-largefile omit support for large files --disable-dynamic-afs do not use loaded AFS library with AIX @@ -1640,6 +1732,7 @@ --enable-dce if you want support for DCE/DFS PAG's --disable-afs-support if you don't want support for AFS --disable-ndbm-db if you don't want ndbm db + --disable-mdb-db if you don't want LMDB --enable-developer enable developer warnings --enable-socket-wrapper use sambas socket-wrapper for testing --disable-otp if you don't want OTP support @@ -1656,11 +1749,19 @@ Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic try to use only PIC/non-PIC objects [default=use + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-python-sys-prefix + use Python's sys.prefix and sys.exec_prefix values + --with-python_prefix override the default PYTHON_PREFIX + --with-python_exec_prefix + override the default PYTHON_EXEC_PREFIX --with-mips-abi=abi ABI to use for IRIX (32, n32, or 64) --with-cross-tools=dir use cross tools in dir --with-openldap=dir use openldap in dir @@ -1684,10 +1785,21 @@ config program for libintl --with-hdbdir Default location for KDC database [default=/var/heimdal] + --with-hcrypto-default-backend=cc|pkcs11_hcrypto|ossl|w32crypto|hcrypto + specify the default hcrypto backend + --without-hcrypto-fallback + disable fallback on hcrypto for unavailable + algorithms --with-openssl=dir use openssl in dir --with-openssl-lib=dir use openssl libraries in dir --with-openssl-include=dir use openssl headers in dir + --with-pkcs11-module=path + use PKCS11 module in path + --with-db-type-preference=list + specify HDB backend DB type preference as + whitespace-separated list of db1, db3, lmdb, and/or + sqlite --with-berkeley-db enable support for berkeley db [default=check] --with-berkeley-db-include=dir use berkeley-db headers in dir @@ -1704,13 +1816,6 @@ use libedit headers in dir --with-libedit-config=path config program for libedit - --with-hesiod=dir use hesiod in dir - --with-hesiod-lib=dir use hesiod libraries in dir - --with-hesiod-include=dir - use hesiod headers in dir - --with-hesiod-config=path - config program for hesiod - --with-x use the X Window System Some influential environment variables: CC C compiler command @@ -1720,9 +1825,13 @@ 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 + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. CPP C preprocessor - YACC The `Yet Another C Compiler' implementation to use. Defaults to - the first program found out of: `bison -y', `byacc', `yacc'. + PYTHON the Python interpreter + YACC The `Yet Another Compiler Compiler' implementation to use. + Defaults to the first program found out of: `bison -y', `byacc', + `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. @@ -1730,12 +1839,11 @@ CAPNG_CFLAGS C compiler flags for CAPNG, overriding pkg-config CAPNG_LIBS linker flags for CAPNG, overriding pkg-config - XMKMF Path to xmkmf, Makefile generator for X Window System 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 . +Report bugs to . _ACEOF ac_status=$? fi @@ -1751,9 +1859,9 @@ case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$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|/||'` + ac_top_builddir_sub=`printf "%s\n" "$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/ ;; @@ -1781,7 +1889,8 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive @@ -1789,7 +1898,7 @@ echo && $SHELL "$ac_srcdir/configure" --help=recursive else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done @@ -1798,10 +1907,10 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Heimdal configure 1.5.2 -generated by GNU Autoconf 2.65 +Heimdal configure 7.8.0 +generated by GNU Autoconf 2.71 -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF @@ -1818,14 +1927,14 @@ ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - rm -f conftest.$ac_objext + rm -f conftest.$ac_objext conftest.beam 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 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1833,74 +1942,38 @@ cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$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 : + } && test -s conftest.$ac_objext +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile -# ac_fn_c_try_cpp LINENO -# ---------------------- -# Try to preprocess conftest.$ac_ext, and return whether this succeeded. -ac_fn_c_try_cpp () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if { { ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err - ac_status=$? - if test -s conftest.err; then - grep -v '^ *+' conftest.err >conftest.er1 - cat conftest.er1 >&5 - mv -f conftest.er1 conftest.err - fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } >/dev/null && { - 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_cpp - # 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 + rm -f conftest.$ac_objext conftest.beam 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 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -1908,17 +1981,18 @@ cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$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 || - $as_test_x conftest$ac_exeext - }; then : + test -x conftest$ac_exeext + } +then : ac_retval=0 -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 @@ -1928,7 +2002,7 @@ # 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link @@ -1940,83 +2014,44 @@ ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile -# 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} - as_fn_set_status $ac_retval - -} # ac_fn_c_try_run - # 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. @@ -2024,16 +2059,9 @@ #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 + which can conflict with char $2 (); below. */ +#include #undef $2 /* Override any GCC internal prototype to avoid an error. @@ -2051,152 +2079,143 @@ #endif int -main () +main (void) { return $2 (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func -# 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 () +# 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $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.$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;} -( cat <<\_ASBOX -## ----------------------------------- ## -## Report this to heimdal-bugs@h5l.org ## -## ----------------------------------- ## -_ASBOX - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $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; } +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$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 + printf "%s\n" "$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_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval -} # ac_fn_c_check_header_mongrel +} # ac_fn_c_try_cpp -# 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 () +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run 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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $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; - ; + 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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +if (sizeof ($2)) + return 0; + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int -main () +main (void) { if (sizeof (($2))) return 0; @@ -2204,58 +2223,134 @@ return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop eval "$3=yes" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type +# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR +# ------------------------------------------------------------------ +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. +ac_fn_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +printf %s "checking whether $as_decl_name is declared... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + eval ac_save_FLAGS=\$$6 + as_fn_append $6 " $5" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +#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 $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + eval $6=\$ac_save_FLAGS + +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_check_decl + # ac_fn_c_check_header_preproc LINENO HEADER VAR # ---------------------------------------------- -# Tests whether HEADER is present, setting the cache variable VAR accordingly. +# Tests whether HEADER exists and can be preprocessed (in isolation), setting +# the cache variable VAR accordingly. ac_fn_c_check_header_preproc () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : +if ac_fn_c_try_cpp "$LINENO" +then : eval "$3=yes" -else +else $as_nop eval "$3=no" fi -rm -f conftest.err conftest.$ac_ext +rm -f conftest.err conftest.i 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_preproc +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + 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 Heimdal $as_me 1.5.2, which was -generated by GNU Autoconf 2.65. Invocation command line was +It was created by Heimdal $as_me 7.8.0, which was +generated by GNU Autoconf 2.71. Invocation command line was - $ $0 $@ + $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log @@ -2288,8 +2383,12 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS @@ -2324,7 +2423,7 @@ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; @@ -2359,15 +2458,15 @@ # 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=$? + # Sanitize IFS. + IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo - cat <<\_ASBOX -## ---------------- ## + printf "%s\n" "## ---------------- ## ## Cache variables. ## -## ---------------- ## -_ASBOX +## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( @@ -2376,8 +2475,8 @@ 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;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -2401,53 +2500,47 @@ ) echo - cat <<\_ASBOX -## ----------------- ## + printf "%s\n" "## ----------------- ## ## Output variables. ## -## ----------------- ## -_ASBOX +## ----------------- ##" 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"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## + printf "%s\n" "## ------------------- ## ## File substitutions. ## -## ------------------- ## -_ASBOX +## ------------------- ##" 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"`;; + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac - $as_echo "$ac_var='\''$ac_val'\''" + printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## + printf "%s\n" "## ----------- ## ## confdefs.h. ## -## ----------- ## -_ASBOX +## ----------- ##" 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" + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && @@ -2461,56 +2554,50 @@ # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h -$as_echo "/* confdefs.h */" > confdefs.h +printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # 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 - ac_site_file1=$CONFIG_SITE + ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" + +for ac_site_file in $ac_site_files 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;} + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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 @@ -2518,22 +2605,437 @@ # 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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi -as_fn_append ac_header_list " stdlib.h" -as_fn_append ac_header_list " unistd.h" -as_fn_append ac_header_list " sys/param.h" +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*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 do not provoke an error unfortunately, instead are silently treated + as an "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 is necessary to write \x00 == 0 to get something + that is 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 **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __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 + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "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 bool +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 = 0; + float fnumber = 0; + + 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); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= 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[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H" +as_fn_append ac_header_c_list " sys/param.h sys_param_h HAVE_SYS_PARAM_H" +as_fn_append ac_func_c_list " getpagesize HAVE_GETPAGESIZE" + +# Auxiliary files required by this configure script. +ac_aux_files="compile config.guess config.sub ltmain.sh missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$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. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +fi + # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false @@ -2544,12 +3046,12 @@ 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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) @@ -2558,24 +3060,24 @@ 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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$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=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in @@ -2585,11 +3087,12 @@ 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## @@ -2607,32 +3110,11 @@ -am__api_version='1.11' - -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - for ac_t in install-sh install.sh shtool; do - if test -f "$ac_dir/$ac_t"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/$ac_t -c" - break 2 - fi - done -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 +am__api_version='1.16' -# 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), + # 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 @@ -2646,20 +3128,25 @@ # 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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]/* | \ + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in #(( + ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; @@ -2669,13 +3156,13 @@ # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + 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 + 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 + 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 @@ -2683,12 +3170,12 @@ 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" && + 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" + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi @@ -2704,7 +3191,7 @@ rm -rf conftest.one conftest.two conftest.dir fi - if test "${ac_cv_path_install+set}" = set; then + if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a @@ -2714,8 +3201,8 @@ INSTALL=$ac_install_sh fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. @@ -2725,58 +3212,73 @@ 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; } -# Just in case -sleep 1 -echo timestamp > conftest.file +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "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;; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac -# Do `set' in a subshell so we don't clobber the current shell's +# 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 ( - 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 - rm -f conftest.file - 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 - + 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! + 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "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. @@ -2785,29 +3287,26 @@ # 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"` +program_transform_name=`printf "%s\n" "$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 +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi # Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " 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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -2816,19 +3315,20 @@ esac fi -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right +# 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. +# 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 test "${ac_cv_prog_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -2836,11 +3336,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2851,11 +3355,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -2864,11 +3368,12 @@ 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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -2876,11 +3381,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2891,11 +3400,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -2903,8 +3412,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -2916,25 +3425,31 @@ 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; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then - if test "${ac_cv_path_mkdir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do - { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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) '* | \ + 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 ('*'coreutils) '* | \ + 'BusyBox '* | \ 'mkdir (fileutils) '4.1*) - ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done @@ -2945,7 +3460,7 @@ fi test -d ./--version && rmdir ./--version - if test "${ac_cv_path_mkdir+set}" = set; then + if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a @@ -2955,24 +3470,19 @@ MKDIR_P="$ac_install_sh -d" fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 -$as_echo "$MKDIR_P" >&6; } - -mkdir_p="$MKDIR_P" -case $mkdir_p in - [\\/$]* | ?:[\\/]*) ;; - */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; -esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$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 test "${ac_cv_prog_AWK+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else @@ -2980,11 +3490,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -2995,30 +3509,31 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; @@ -3028,12 +3543,12 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } SET_MAKE= else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi @@ -3046,13 +3561,54 @@ fi rmdir .tst 2>/dev/null +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + 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 + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi @@ -3068,17 +3624,13 @@ # Define the identity of the package. PACKAGE='heimdal' - VERSION='1.5.2' + VERSION='7.8.0' -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # Some tools Automake needs. @@ -3096,30 +3648,98 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. +# 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 (and possibly the TAP driver). 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}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' -AMTAR=${AMTAR-"${am_missing_run}tar"} -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi -{ $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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "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 : +if test ${enable_maintainer_mode+y} +then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else +else $as_nop USE_MAINTAINER_MODE=no fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 -$as_echo "$USE_MAINTAINER_MODE" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' @@ -3132,6 +3752,250 @@ + +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.7' +macro_revision='2.4.7' + + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + + + + # 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 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$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 + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$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 + + +# 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' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "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*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac + + + + + + + + + + + + + + + + + + + + + + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +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 + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3140,11 +4004,12 @@ 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 test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3152,11 +4017,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3167,11 +4036,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3180,11 +4049,12 @@ 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3192,11 +4062,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3207,11 +4081,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then @@ -3219,8 +4093,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3233,11 +4107,12 @@ 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 test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3245,11 +4120,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3260,11 +4139,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3273,11 +4152,12 @@ 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 test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3286,15 +4166,19 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3310,18 +4194,18 @@ # 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+' '}$@" + 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3332,11 +4216,12 @@ 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 test "${ac_cv_prog_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else @@ -3344,11 +4229,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3359,11 +4248,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3376,11 +4265,12 @@ 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 test "${ac_cv_prog_ac_ct_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else @@ -3388,11 +4278,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -3403,11 +4297,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -3419,8 +4313,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC @@ -3428,25 +4322,129 @@ fi fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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}clang" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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="clang" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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; } - -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 +printf "%s\n" "$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 +for ac_option in --version -v -V -qversion -version; 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 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then @@ -3456,7 +4454,7 @@ cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done @@ -3464,7 +4462,7 @@ /* end confdefs.h. */ int -main () +main (void) { ; @@ -3476,9 +4474,9 @@ # 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[^ ]*//'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$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.*" @@ -3499,11 +4497,12 @@ *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$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 : + printf "%s\n" "$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, @@ -3520,7 +4519,7 @@ # certainly right. break;; *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi @@ -3536,45 +4535,46 @@ done test "$ac_cv_exeext" = no && ac_cv_exeext= -else +else $as_nop 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 +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$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_set_status 77 -as_fn_error "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; } +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "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 +printf "%s\n" "$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 : + printf "%s\n" "$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 @@ -3588,15 +4588,15 @@ * ) 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; } +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext @@ -3605,7 +4605,7 @@ /* end confdefs.h. */ #include int -main () +main (void) { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; @@ -3617,8 +4617,8 @@ 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in @@ -3626,10 +4626,10 @@ *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in @@ -3637,39 +4637,40 @@ *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + printf "%s\n" "$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. + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. -See \`config.log' for more details." "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5; } fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 -$as_echo "$cross_compiling" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$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 test "${ac_cv_objext+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; @@ -3683,11 +4684,12 @@ *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" -$as_echo "$ac_try_echo"; } >&5 +printf "%s\n" "$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 : + printf "%s\n" "$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 @@ -3696,31 +4698,32 @@ break;; esac done -else - $as_echo "$as_me: failed program was:" >&5 +else $as_nop + printf "%s\n" "$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; } +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$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 test "${ac_cv_c_compiler_gnu+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { #ifndef __GNUC__ choke me @@ -3730,29 +4733,33 @@ return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_compiler_gnu=yes -else +else $as_nop ac_compiler_gnu=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi -ac_test_CFLAGS=${CFLAGS+set} +ac_test_CFLAGS=${CFLAGS+y} 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 test "${ac_cv_prog_cc_g+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no @@ -3761,57 +4768,60 @@ /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_g=yes -else +else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : -else +else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +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 +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then @@ -3826,95 +4836,144 @@ 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 test "${ac_cv_prog_cc_c89+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_prog_cc_c89=no +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -#include -/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ -struct buf { int x; }; -FILE * (*rcsopen) (struct buf *, struct stat *, int); -static char *e (p, i) - char **p; - int i; -{ - return p[i]; -} -static char *f (char * (*g) (char **, int), char **p, ...) -{ - char *s; - va_list v; - va_start (v,p); - s = g (p, va_arg (v,int)); - va_end (v); - return s; -} - -/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has - function prototypes and stuff, but not '\xHH' hex character constants. - These don't provoke an error unfortunately, instead are silently treated - as 'x'. The following induces an error, until -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]; +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -/* 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]; +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +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 conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi -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; -} +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program _ACEOF -for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ - -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +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 : + if ac_fn_c_try_compile "$LINENO" +then : ac_cv_prog_cc_c89=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext +rm -f core conftest.err conftest.$ac_objext conftest.beam 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 : +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi fi ac_ext=c @@ -3922,82 +4981,83 @@ 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 + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then : - enableval=$enable_dependency_tracking; -fi +int +main (void) +{ -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i fi - if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" 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="$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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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'. + # 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. @@ -4031,16 +5091,16 @@ : > 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 8's {/usr,}/bin/sh. - touch sub/conftst$i.h + # 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" + # 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 + # 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 @@ -4049,16 +5109,16 @@ test "$am__universal" = false || continue ;; nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested + # 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 ;; - msvisualcpp | msvcmsys) - # This compiler won't grok `-c -o', but also, the minuso test has + 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} @@ -4097,8 +5157,8 @@ 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if @@ -4112,478 +5172,283 @@ fi -if test "x$CC" != xcc; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "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 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } + ac_cv_path_SED=$SED fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed - ; - return 0; -} -_ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { { 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; } && - test -f conftest2.$ac_objext && { { 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 - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&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_try") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { { 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; } && - test -f conftest2.$ac_objext && { { 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 - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no -fi -rm -f core conftest* +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" -fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; 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; } -$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h -fi -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o -if test "$am_t" != yes; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # 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__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -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 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 test "${ac_cv_prog_CPP+set}" = set; 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.$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.$ac_ext -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : - break -fi - done - ac_cv_prog_CPP=$CPP -fi - CPP=$ac_cv_prog_CPP -else - ac_cv_prog_CPP=$CPP -fi -{ $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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 - # 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.$ac_ext + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 - # 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 + $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 - # Passes both tests. -ac_preproc_ok=: -break + ac_cv_path_GREP=$GREP fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then : -else - { { $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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" -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 `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;} ;; +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 - - -macro_version='2.4' -macro_revision='1.3293' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# 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 test "${ac_cv_build+set}" = set; then : - $as_echo_n "(cached) " >&6 + $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_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 + ac_cv_path_EGREP=$EGREP +fi + fi 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 test "${ac_cv_host+set}" = set; 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 - - -# 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' - -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 - - - - - - - - - - - - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" -{ $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 test "${ac_cv_path_SED+set}" = set; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +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 sed gsed; do + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$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 + 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_SED="$ac_path_SED" ac_path_SED_found=:;; + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 - $as_echo_n 0123456789 >"conftest.in" + printf %s 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 + printf "%s\n" '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_SED_max-0}; then + 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_SED="$ac_path_SED" - ac_path_SED_max=$ac_count + 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 @@ -4591,26 +5456,31 @@ rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac - $ac_path_SED_found && break 3 + $ac_path_FGREP_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 + 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_SED=$SED + ac_cv_path_FGREP=$FGREP fi + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" @@ -4622,325 +5492,114 @@ -{ $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 test "${ac_cv_path_GREP+set}" = set; then : - $as_echo_n "(cached) " >&6 + + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "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 yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&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" - { test -f "$ac_path_GREP" && $as_test_x "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; 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" - { test -f "$ac_path_EGREP" && $as_test_x "$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 fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if test "${ac_cv_path_FGREP+set}" = set; 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" - { test -f "$ac_path_FGREP" && $as_test_x "$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 - - - - - - - - - - - - - - - - - - - -# 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 test "${lt_cv_path_LD+set}" = set; 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 test "${lt_cv_prog_gnu_ld+set}" = set; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld @@ -4950,40 +5609,46 @@ -{ $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 test "${lt_cv_path_NM+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NM"; then # Let the user override the test. - lt_cv_path_NM="$NM" + lt_cv_path_NM=$NM else - lt_nm_to_check="${ac_tool_prefix}nm" + 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 + 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" + 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 + 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: + # 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'*) + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" - break + break 2 ;; *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" - break + break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but @@ -4994,15 +5659,15 @@ esac fi done - IFS="$lt_save_ifs" + 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" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : @@ -5013,11 +5678,12 @@ 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 test "${ac_cv_prog_DUMPBIN+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else @@ -5025,11 +5691,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5040,11 +5710,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5057,11 +5727,12 @@ 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 test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else @@ -5069,11 +5740,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5084,11 +5759,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5100,17 +5775,17 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) - DUMPBIN="$DUMPBIN -symbols" + DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: @@ -5118,8 +5793,8 @@ esac fi - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" + if test : != "$DUMPBIN"; then + NM=$DUMPBIN fi fi test -z "$NM" && NM=nm @@ -5129,11 +5804,12 @@ -{ $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 test "${lt_cv_nm_interface+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) @@ -5149,28 +5825,29 @@ 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "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 test "${lt_cv_sys_max_cmd_len+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop i=0 - teststring="ABCD" + teststring=ABCD case $build_os in msdosdjgpp*) @@ -5210,7 +5887,7 @@ lt_cv_sys_max_cmd_len=8192; ;; - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # 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` @@ -5229,6 +5906,11 @@ 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 @@ -5248,29 +5930,30 @@ 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/.*[ ]//'` + 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 + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$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 + 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"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ + 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 + test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring @@ -5288,12 +5971,12 @@ 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; } +if test -n "$lt_cv_sys_max_cmd_len"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len @@ -5306,30 +5989,6 @@ : ${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 @@ -5361,11 +6020,12 @@ -{ $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 test "${lt_cv_to_host_file_cmd+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $host in *-*-mingw* ) case $build in @@ -5401,18 +6061,19 @@ 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$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 test "${lt_cv_to_tool_file_cmd+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in @@ -5428,22 +6089,23 @@ 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$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 test "${lt_cv_ld_reload_flag+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; @@ -5452,13 +6114,13 @@ reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then + if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi @@ -5474,25 +6136,30 @@ 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 test "${ac_cv_prog_OBJDUMP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. + # Extract the first word of "${ac_tool_prefix}file", so it can be a program name with args. +set dummy ${ac_tool_prefix}file; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_FILECMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$FILECMD"; then + ac_cv_prog_FILECMD="$FILECMD" # 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=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_FILECMD="${ac_tool_prefix}file" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5501,38 +6168,43 @@ 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; } +FILECMD=$ac_cv_prog_FILECMD +if test -n "$FILECMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 +printf "%s\n" "$FILECMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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. +if test -z "$ac_cv_prog_FILECMD"; then + ac_ct_FILECMD=$FILECMD + # Extract the first word of "file", so it can be a program name with args. +set dummy file; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_FILECMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_FILECMD"; then + ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # 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=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_FILECMD="file" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5541,59 +6213,165 @@ 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; } +ac_ct_FILECMD=$ac_cv_prog_ac_ct_FILECMD +if test -n "$ac_ct_FILECMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5 +printf "%s\n" "$ac_ct_FILECMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" + if test "x$ac_ct_FILECMD" = x; then + FILECMD=":" 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - OBJDUMP=$ac_ct_OBJDUMP + FILECMD=$ac_ct_FILECMD fi else - OBJDUMP="$ac_cv_prog_OBJDUMP" + FILECMD="$ac_cv_prog_FILECMD" 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 test "${lt_cv_deplibs_check_method+set}" = set; then : - $as_echo_n "(cached) " >&6 +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. 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. - +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +# that 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 @@ -5605,7 +6383,7 @@ 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_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; @@ -5619,8 +6397,7 @@ # 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 + if ( 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 @@ -5640,14 +6417,14 @@ lt_cv_deplibs_check_method=pass_all ;; -freebsd* | dragonfly*) +freebsd* | dragonfly* | midnightbsd*) 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_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac @@ -5656,16 +6433,12 @@ 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 + lt_cv_file_magic_cmd=$FILECMD 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' @@ -5697,8 +6470,8 @@ lt_cv_deplibs_check_method=pass_all ;; -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; @@ -5712,7 +6485,7 @@ 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_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; @@ -5720,8 +6493,8 @@ 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 +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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)$' @@ -5774,11 +6547,14 @@ tpf*) lt_cv_deplibs_check_method=pass_all ;; +os2*) + 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no @@ -5822,11 +6598,12 @@ 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 test "${ac_cv_prog_DLLTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else @@ -5834,11 +6611,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5849,11 +6630,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -5862,11 +6643,12 @@ 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 test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else @@ -5874,11 +6656,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5889,11 +6675,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then @@ -5901,8 +6687,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL @@ -5919,20 +6705,18 @@ - - - -{ $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 test "${lt_cv_sharedlib_from_linklib_cmd+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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 + # two different shell functions defined in ltmain.sh; + # decide which one 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 @@ -5944,13 +6728,13 @@ ;; *) # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" + 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$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 @@ -5966,11 +6750,12 @@ 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 test "${ac_cv_prog_AR+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else @@ -5978,11 +6763,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -5993,11 +6782,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6010,11 +6799,12 @@ 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 test "${ac_cv_prog_ac_ct_AR+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else @@ -6022,11 +6812,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6037,11 +6831,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6053,8 +6847,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR @@ -6062,65 +6856,83 @@ fi : ${AR=ar} -: ${AR_FLAGS=cru} +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if test "${lt_cv_ar_at_file+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - if test "$ac_status" -eq 0; then + if test 0 -eq "$ac_status"; 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } - if test "$ac_status" -ne 0; then + if test 0 -ne "$ac_status"; 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 +rm -f core conftest.err conftest.$ac_objext conftest.beam 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } -if test "x$lt_cv_ar_at_file" = xno; then +if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file @@ -6135,11 +6947,12 @@ 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 test "${ac_cv_prog_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else @@ -6147,11 +6960,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6162,11 +6979,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6175,11 +6992,12 @@ 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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else @@ -6187,11 +7005,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6202,11 +7024,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then @@ -6214,8 +7036,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP @@ -6234,11 +7056,12 @@ 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 test "${ac_cv_prog_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else @@ -6246,11 +7069,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6261,11 +7088,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6274,11 +7101,12 @@ 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 test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else @@ -6286,11 +7114,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6301,11 +7133,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then @@ -6313,8 +7145,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB @@ -6337,14 +7169,14 @@ if test -n "$RANLIB"; then case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in @@ -6403,11 +7235,12 @@ # 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 test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] @@ -6427,7 +7260,7 @@ symcode='[ABCDGISTW]' ;; hpux*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; @@ -6460,14 +7293,44 @@ symcode='[ABCDGIRSTW]' ;; esac +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + # 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'" +lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$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'" +lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= @@ -6485,25 +7348,29 @@ # 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++, + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, # 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};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 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))}"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,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'" + 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'" + 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 @@ -6525,14 +7392,14 @@ 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 + printf "%s\n" "$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 + printf "%s\n" "$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 @@ -6546,11 +7413,11 @@ 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 +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST -#elif defined(__osf__) +#elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else @@ -6576,7 +7443,7 @@ { { "@PROGRAM@", (void *) 0 }, _LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; @@ -6596,13 +7463,13 @@ mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" + 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 + printf "%s\n" "$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 @@ -6623,7 +7490,7 @@ rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then + if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= @@ -6636,11 +7503,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 -$as_echo "ok" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } fi # Response file support. @@ -6676,82 +7543,183 @@ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then : +if test ${with_sysroot+y} +then : withval=$with_sysroot; -else +else $as_nop with_sysroot=no fi lt_sysroot= -case ${with_sysroot} in #( +case $with_sysroot in #( yes) - if test "$GCC" = yes; then + if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} # Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then : +if test ${enable_libtool_lock+y} +then : enableval=$enable_libtool_lock; fi -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +test no = "$enable_libtool_lock" || 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. + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *ELF-32*) - HPUX_IA64_MODE="32" + HPUX_IA64_MODE=32 ;; *ELF-64*) - HPUX_IA64_MODE="64" + HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. 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 + printf "%s\n" "$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 + if test yes = "$lt_cv_prog_gnu_ld"; then + case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; @@ -6763,7 +7731,7 @@ ;; esac else - case `/usr/bin/file conftest.$ac_objext` in + case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; @@ -6779,25 +7747,76 @@ rm -rf conftest* ;; -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + 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=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in + case `$FILECMD 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" + case `$FILECMD conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac ;; - ppc64-*linux*|powerpc64-*linux*) + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -6816,7 +7835,10 @@ x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - ppc*-*linux*|powerpc*-*linux*) + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) @@ -6834,13 +7856,14 @@ *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" + 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 test "${lt_cv_cc_needs_belf+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -6851,19 +7874,20 @@ /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_cc_needs_belf=yes -else +else $as_nop lt_cv_cc_needs_belf=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -6872,25 +7896,39 @@ 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" + CFLAGS=$SAVE_CFLAGS fi ;; -sparc*-*solaris*) - # Find out which ABI we are using. +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then - case `/usr/bin/file conftest.o` in + case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in - yes*) LD="${LD-ld} -m elf64_sparc" ;; + yes*) + case $host in + i?86-*-solaris*|x86_64-*-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" @@ -6904,16 +7942,17 @@ ;; esac -need_locks="$enable_libtool_lock" +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 test "${ac_cv_prog_MANIFEST_TOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else @@ -6921,11 +7960,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6936,11 +7979,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -6949,11 +7992,12 @@ 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 test "${ac_cv_prog_ac_ct_MANIFEST_TOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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 @@ -6961,11 +8005,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -6976,11 +8024,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then @@ -6988,8 +8036,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL @@ -6999,11 +8047,12 @@ 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 test "${lt_cv_path_mainfest_tool+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out @@ -7013,9 +8062,9 @@ 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi @@ -7029,11 +8078,12 @@ 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 test "${ac_cv_prog_DSYMUTIL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else @@ -7041,11 +8091,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7056,11 +8110,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7069,11 +8123,12 @@ 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 test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else @@ -7081,11 +8136,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7096,11 +8155,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then @@ -7108,8 +8167,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL @@ -7121,11 +8180,12 @@ 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 test "${ac_cv_prog_NMEDIT+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else @@ -7133,11 +8193,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7148,11 +8212,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7161,11 +8225,12 @@ 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 test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else @@ -7173,11 +8238,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7188,11 +8257,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then @@ -7200,8 +8269,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT @@ -7213,11 +8282,12 @@ 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 test "${ac_cv_prog_LIPO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else @@ -7225,11 +8295,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7240,11 +8314,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7253,11 +8327,12 @@ 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 test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else @@ -7265,11 +8340,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7280,11 +8359,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then @@ -7292,8 +8371,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO @@ -7305,11 +8384,12 @@ 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 test "${ac_cv_prog_OTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else @@ -7317,11 +8397,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7332,11 +8416,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7345,11 +8429,12 @@ 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 test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else @@ -7357,11 +8442,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7372,11 +8461,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then @@ -7384,8 +8473,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL @@ -7397,11 +8486,12 @@ 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 test "${ac_cv_prog_OTOOL64+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else @@ -7409,11 +8499,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7424,11 +8518,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -7437,11 +8531,12 @@ 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 test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else @@ -7449,11 +8544,15 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done @@ -7464,11 +8563,11 @@ 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then @@ -7476,8 +8575,8 @@ 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 @@ -7512,13 +8611,14 @@ - { $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 test "${lt_cv_apple_cc_single_mod+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then + 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 @@ -7530,7 +8630,13 @@ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? - if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + # 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 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 @@ -7539,13 +8645,15 @@ 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 test "${lt_cv_ld_exported_symbols_list+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym @@ -7554,38 +8662,41 @@ /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_ld_exported_symbols_list=yes -else +else $as_nop lt_cv_ld_exported_symbols_list=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" + 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 test "${lt_cv_ld_force_load+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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 "$AR $AR_FLAGS libconftest.a conftest.o" >&5 + $AR $AR_FLAGS libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF @@ -7594,7 +8705,9 @@ 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 -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 @@ -7603,36 +8716,31 @@ 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + _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' ;; + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.[012],*|,*powerpc*-darwin[5-8]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then + if test yes = "$lt_cv_apple_cc_single_mod"; 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' + if test yes = "$lt_cv_ld_exported_symbols_list"; 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}' + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -7640,166 +8748,86 @@ ;; esac +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} -{ $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 test "${ac_cv_header_stdc+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done -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 +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : -# 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 -" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi - -done - - -for ac_header in dlfcn.h -do : - ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +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" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLFCN_H 1 -_ACEOF +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi -done - # Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then : +# Check whether --enable-shared was given. +if test ${enable_shared+y} +then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; @@ -7807,17 +8835,17 @@ *) enable_shared=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_shared=yes fi @@ -7827,10 +8855,9 @@ - - - # Check whether --enable-static was given. -if test "${enable_static+set}" = set; then : +# Check whether --enable-static was given. +if test ${enable_static+y} +then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; @@ -7838,17 +8865,17 @@ *) enable_static=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac -else +else $as_nop enable_static=yes fi @@ -7858,60 +8885,466 @@ +enable_win32_dll=yes +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - -# Check whether --with-pic was given. -if test "${with_pic+set}" = set; then : - withval=$with_pic; pic_mode="$withval" +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } else - pic_mode=default + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -test -z "$pic_mode" && pic_mode=default +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_AS="as" + printf "%s\n" "$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_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - # 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 +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else - enable_fast_install=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + ;; +esac +test -z "$AS" && AS=as -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + enable_dlopen=no + + + + + + +# Check whether --with-pic was given. +if test ${with_pic+y} +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 $as_nop + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +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 $as_nop + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' @@ -7936,6 +9369,10 @@ + + + + @@ -7956,15 +9393,16 @@ -if test -n "${ZSH_VERSION+set}" ; then +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 test "${lt_cv_objdir+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then @@ -7975,17 +9413,15 @@ 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h @@ -7995,7 +9431,7 @@ # 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 + if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -8006,14 +9442,14 @@ ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). +# All known linkers require a '.a' archive for static linking (except MSVC and +# ICC, which need '.lib'). libext=a -with_gnu_ld="$lt_cv_prog_gnu_ld" +with_gnu_ld=$lt_cv_prog_gnu_ld -old_CC="$CC" -old_CFLAGS="$CFLAGS" +old_CC=$CC +old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc @@ -8022,15 +9458,8 @@ 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-%%"` +func_cc_basename $compiler +cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it @@ -8038,29 +9467,30 @@ 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 test "${lt_cv_path_MAGIC_CMD+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + 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" + 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 -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" + 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 : @@ -8083,19 +9513,19 @@ break fi done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8104,29 +9534,30 @@ 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 test "${lt_cv_path_MAGIC_CMD+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + 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" + 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 -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" + 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 : @@ -8149,19 +9580,19 @@ break fi done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -8176,7 +9607,7 @@ # Use C for the default configuration in the libtool script -lt_save_CC="$CC" +lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -8238,7 +9669,7 @@ lt_prog_compiler_no_builtin_flag= -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; @@ -8246,15 +9677,16 @@ 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 test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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" + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # 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 @@ -8281,10 +9713,10 @@ $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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } -if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : @@ -8302,17 +9734,18 @@ lt_prog_compiler_static= - if test "$GCC" = yes; then + if test yes = "$GCC"; 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 + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi + lt_prog_compiler_pic='-fPIC' ;; amigaos*) @@ -8323,8 +9756,8 @@ ;; 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'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -8340,6 +9773,11 @@ # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac ;; darwin* | rhapsody*) @@ -8400,7 +9838,9 @@ case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' - lt_prog_compiler_pic='-Xcompiler -fPIC' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi ;; esac else @@ -8408,7 +9848,7 @@ case $host_os in aix*) lt_prog_compiler_wl='-Wl,' - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else @@ -8416,10 +9856,29 @@ fi ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + 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' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac ;; hpux9* | hpux10* | hpux11*) @@ -8435,7 +9894,7 @@ ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? - lt_prog_compiler_static='${wl}-a ${wl}archive' + lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) @@ -8444,9 +9903,9 @@ lt_prog_compiler_static='-non_shared' ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. + # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' @@ -8471,6 +9930,12 @@ lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) @@ -8490,19 +9955,34 @@ lt_prog_compiler_static='-qstaticlink' ;; *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ F* | *Sun*Fortran*) + 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 @@ -8553,7 +10033,7 @@ ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi @@ -8582,7 +10062,7 @@ fi case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: + # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; @@ -8591,30 +10071,32 @@ ;; 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 test "${lt_cv_prog_compiler_pic+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$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 test "${lt_cv_prog_compiler_pic_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop 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" + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # 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 @@ -8641,10 +10123,10 @@ $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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } -if test x"$lt_cv_prog_compiler_pic_works" = xyes; then +if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; @@ -8670,13 +10152,14 @@ # 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 test "${lt_cv_prog_compiler_static_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_static_works=no - save_LDFLAGS="$LDFLAGS" + 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 @@ -8695,13 +10178,13 @@ fi fi $RM -r conftest* - LDFLAGS="$save_LDFLAGS" + 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } -if test x"$lt_cv_prog_compiler_static_works" = xyes; then +if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= @@ -8713,11 +10196,12 @@ - { $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 test "${lt_cv_prog_compiler_c_o+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -8760,19 +10244,20 @@ $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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$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 test "${lt_cv_prog_compiler_c_o+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest @@ -8815,28 +10300,28 @@ $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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } -hard_links="nottested" -if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; 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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else @@ -8848,8 +10333,8 @@ - { $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; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= @@ -8864,7 +10349,6 @@ hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= - hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported @@ -8880,9 +10364,9 @@ # 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'. + # 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 @@ -8894,18 +10378,18 @@ case $host_os in cygwin* | mingw* | pw32* | cegcc*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time + # FIXME: the MSVC++ and ICC 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 + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) - # we just hope/assume this is gcc and not c89 (= MSVC++) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; - openbsd*) + openbsd* | bitrig*) with_gnu_ld=no ;; esac @@ -8915,7 +10399,7 @@ # 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 + if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility @@ -8937,24 +10421,24 @@ esac fi - if test "$lt_use_gnu_ld_interface" = yes; then + if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' + 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' + 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' + 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 + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 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 ... @@ -8967,7 +10451,7 @@ case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then + if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 @@ -8986,7 +10470,7 @@ 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_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) @@ -9002,7 +10486,7 @@ 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' + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi @@ -9012,7 +10496,7 @@ # _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' + export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes @@ -9020,61 +10504,90 @@ 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' + 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, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - export_dynamic_flag_spec='${wl}-E' + 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' + 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 + if test linux-dietlibc = "$host_os"; 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 + && test no = "$tmp_diet" 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' + 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' + 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' ;; @@ -9085,43 +10598,47 @@ lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-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' + 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 + 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' + 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' + 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 + if test yes = "$supports_anon_versioning"; 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' + 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 + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; 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= - hardcode_libdir_flag_spec_ld='-rpath $libdir' + 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 + if test yes = "$supports_anon_versioning"; 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' + 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 @@ -9135,8 +10652,8 @@ 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' + 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 ;; @@ -9154,8 +10671,8 @@ _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' + 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 @@ -9167,7 +10684,7 @@ ld_shlibs=no cat <<_LT_EOF 1>&2 -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** 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 @@ -9182,9 +10699,9 @@ # 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' + 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 @@ -9201,15 +10718,15 @@ *) 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' + 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 + if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= @@ -9225,7 +10742,7 @@ # 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 + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported @@ -9233,34 +10750,57 @@ ;; aix[4-9]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; 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="" + 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". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. 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' + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { 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' + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive 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 + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -9279,13 +10819,21 @@ hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes - file_list_spec='${wl}-f,' + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac - if test "$GCC" = yes; then + if test yes = "$GCC"; 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` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -9304,52 +10852,61 @@ ;; esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; 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' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - export_dynamic_flag_spec='${wl}-bexpall' + 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 + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 + if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if test "${lt_cv_aix_libpath_+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -9364,10 +10921,10 @@ 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 \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" + lt_cv_aix_libpath_=/usr/lib:/lib fi fi @@ -9375,34 +10932,36 @@ 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" + 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 -n "$allow_undefined_flag"; 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' + if test ia64 = "$host_cpu"; 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" + 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 + if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else - if test "${lt_cv_aix_libpath_+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { @@ -9417,10 +10976,10 @@ 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 \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" + lt_cv_aix_libpath_=/usr/lib:/lib fi fi @@ -9428,21 +10987,33 @@ aix_libpath=$lt_cv_aix_libpath_ fi - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + 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 + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; 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' + 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' + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -9451,7 +11022,7 @@ 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_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) @@ -9468,12 +11039,12 @@ cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. + # Microsoft Visual C++ or Intel C++ Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in - cl*) - # Native MSVC + cl* | icl*) + # Native MSVC or ICC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes @@ -9481,44 +11052,46 @@ # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + 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=' + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $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' + 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 + # Assume MSVC and ICC 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" + 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. @@ -9537,23 +11110,24 @@ 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\"`' + if test yes = "$lt_cv_ld_force_load"; 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" + allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; + ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac - if test "$_lt_dar_can_shared" = "yes"; then + if test yes = "$_lt_dar_can_shared"; 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}" + 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 @@ -9567,10 +11141,6 @@ hardcode_shlibpath_var=no ;; - freebsd1*) - ld_shlibs=no - ;; - # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little @@ -9583,7 +11153,7 @@ ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2*) + freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes @@ -9591,7 +11161,7 @@ ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. - freebsd* | dragonfly*) + freebsd* | dragonfly* | midnightbsd*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes @@ -9599,34 +11169,33 @@ ;; 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' + if test yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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' + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + 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' + 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' + if test yes,no = "$GCC,$with_gnu_ld"; 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_flag_spec_ld='+b $libdir' + if test no = "$with_gnu_ld"; 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' + 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 @@ -9634,37 +11203,38 @@ ;; hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then + if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) - archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + 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+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' + 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' + 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' + 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 test "${lt_cv_prog_compiler__b+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" + 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 @@ -9683,14 +11253,14 @@ fi fi $RM -r conftest* - LDFLAGS="$save_LDFLAGS" + 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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$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' +if test yes = "$lt_cv_prog_compiler__b"; 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 @@ -9698,8 +11268,8 @@ ;; esac fi - if test "$with_gnu_ld" = no; then - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in @@ -9710,7 +11280,7 @@ *) hardcode_direct=yes hardcode_direct_absolute=yes - export_dynamic_flag_spec='${wl}-E' + export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. @@ -9721,48 +11291,60 @@ ;; 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' + if test yes = "$GCC"; 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 test "${lt_cv_irix_exported_symbol+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 : +if ac_fn_c_try_link "$LINENO" +then : lt_cv_irix_exported_symbol=yes -else +else $as_nop lt_cv_irix_exported_symbol=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" + 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' +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; 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' + 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_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out @@ -9777,7 +11359,7 @@ 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_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; @@ -9785,27 +11367,19 @@ *nto* | *qnx*) ;; - openbsd*) + openbsd* | bitrig*) 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 + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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' + 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 + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no @@ -9816,33 +11390,54 @@ 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' + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' ;; 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' + if test yes = "$GCC"; 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' + 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_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' + if test yes = "$GCC"; 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_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' + $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' @@ -9853,24 +11448,24 @@ 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' + if test yes = "$GCC"; 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' + $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_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' + $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' + 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' + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi @@ -9880,11 +11475,11 @@ 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 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' + if test yes = "$GCC"; 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 @@ -9894,10 +11489,10 @@ ;; sunos4*) - if test "x$host_vendor" = xsequent; then + if test sequent = "$host_vendor"; 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' + 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 @@ -9946,43 +11541,43 @@ ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) - no_undefined_flag='${wl}-z,text' + 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' + if test yes = "$GCC"; 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' + 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 + # Note: We CANNOT 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' + 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_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes - export_dynamic_flag_spec='${wl}-Bexport' + 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' + if test yes = "$GCC"; 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' + 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 ;; @@ -9997,18 +11592,18 @@ ;; esac - if test x$host_vendor = xsni; then + if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld @@ -10034,7 +11629,7 @@ # Assume -lc should be added archive_cmds_need_lc=yes - if test "$enable_shared" = yes && test "$GCC" = yes; then + if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. @@ -10043,18 +11638,19 @@ # 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 test "${lt_cv_archive_cmds_need_lc+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop $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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest @@ -10072,7 +11668,7 @@ 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no @@ -10086,8 +11682,8 @@ $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; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac @@ -10246,22 +11842,17 @@ + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } - - - - - { $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 +if test yes = "$GCC"; then case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; + 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" ;; + 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 @@ -10277,28 +11868,35 @@ ;; esac # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. + # 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` + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac 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 + 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" + elif test -n "$lt_multi_os_dir"; then 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; +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; + lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } @@ -10312,7 +11910,7 @@ # 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'` ;; + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else @@ -10321,7 +11919,7 @@ library_names_spec= libname_spec='lib$name' soname_spec= -shrext_cmds=".so" +shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -10338,56 +11936,108 @@ # flags to be left without arguments need_version=unknown + + case $host_os in aix3*) - version_type=linux - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + 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' + soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) - version_type=linux + 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 + if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + 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 + # 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 + 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot 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 + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' # 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 + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' # 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 + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac shlibpath_var=LIBPATH fi ;; @@ -10397,27 +12047,27 @@ 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}' + 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' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $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}' + library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) - version_type=linux + 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' + 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" @@ -10429,7 +12079,7 @@ cygwin* | mingw* | pw32* | cegcc*) version_type=windows - shrext_cmds=".dll" + shrext_cmds=.dll need_version=no need_lib_prefix=no @@ -10438,8 +12088,8 @@ # 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'\''`~ + 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~ @@ -10455,27 +12105,27 @@ 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}' + 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}' + 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}' + 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 + *,cl* | *,icl*) + # Native MSVC or ICC libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' case $build_os in mingw*) @@ -10491,7 +12141,7 @@ 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|^ ||'` + 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 @@ -10502,7 +12152,7 @@ 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" + 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'` @@ -10515,8 +12165,8 @@ 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'\''`~ + 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' @@ -10528,8 +12178,8 @@ ;; *) - # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + # Assume MSVC and ICC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac @@ -10542,8 +12192,8 @@ 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' + 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`' @@ -10553,44 +12203,41 @@ ;; dgux*) - version_type=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' - soname_spec='${libname}${release}${shared_ext}$major' + 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 ;; -freebsd1*) - dynamic_linker=no - ;; - -freebsd* | dragonfly*) +freebsd* | dragonfly* | midnightbsd*) # 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[123]*) objformat=aout ;; + 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}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + 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*) + freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) @@ -10609,25 +12256,15 @@ esac ;; -gnu*) - version_type=linux - 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 - hardcode_into_libs=yes - ;; - haiku*) - version_type=linux + 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' + 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 + shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -10645,14 +12282,15 @@ 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 + 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 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -10660,8 +12298,8 @@ 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' + 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 ;; @@ -10670,8 +12308,8 @@ 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' + 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, ... @@ -10681,11 +12319,11 @@ ;; interix[3-9]*) - version_type=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}' - soname_spec='${libname}${release}${shared_ext}$major' + 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 @@ -10696,16 +12334,16 @@ case $host_os in nonstopux*) version_type=nonstopux ;; *) - if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux + if test yes = "$lt_cv_prog_gnu_ld"; 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}' + 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= @@ -10724,8 +12362,8 @@ 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}" + 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 ;; @@ -10734,21 +12372,42 @@ dynamic_linker=no ;; -# This must be Linux ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | 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' + 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 test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir @@ -10756,2103 +12415,936 @@ 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 - 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 - 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 - 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 - 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 - 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 - 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_dld_shl_load+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_svld_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_dld_dld_link+set}" = set; 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" = x""yes; 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 test "${lt_cv_dlopen_self+set}" = set; 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 test "${lt_cv_dlopen_self_static+set}" = set; 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" - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - - - -test "$sysconfdir" = '${prefix}/etc' && sysconfdir='/etc' -test "$localstatedir" = '${prefix}/var' && localstatedir='/var/heimdal' - - -CANONICAL_HOST=$host - - -# Check whether --enable-largefile was given. -if test "${enable_largefile+set}" = set; then : - enableval=$enable_largefile; -fi - -if test "$enable_largefile" != no; then - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 -$as_echo_n "checking for special C compiler options needed for large files... " >&6; } -if test "${ac_cv_sys_largefile_CC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_sys_largefile_CC=no - if test "$GCC" != yes; then - ac_save_CC=$CC - while :; do - # IRIX 6.2 and later do not support large files by default, - # so use the C compiler's -n32 option if that helps. - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF - if ac_fn_c_try_compile "$LINENO"; then : - break -fi -rm -f core conftest.err conftest.$ac_objext - CC="$CC -n32" - if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_largefile_CC=' -n32'; break -fi -rm -f core conftest.err conftest.$ac_objext - break - done - CC=$ac_save_CC - rm -f conftest.$ac_ext - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 -$as_echo "$ac_cv_sys_largefile_CC" >&6; } - if test "$ac_cv_sys_largefile_CC" != no; then - CC=$CC$ac_cv_sys_largefile_CC - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 -$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } -if test "${ac_cv_sys_file_offset_bits+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_file_offset_bits=no; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _FILE_OFFSET_BITS 64 -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; + int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_file_offset_bits=64; break +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 -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_sys_file_offset_bits=unknown - break -done fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 -$as_echo "$ac_cv_sys_file_offset_bits" >&6; } -case $ac_cv_sys_file_offset_bits in #( - no | unknown) ;; - *) -cat >>confdefs.h <<_ACEOF -#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits -_ACEOF -;; -esac -rm -rf conftest* - if test $ac_cv_sys_file_offset_bits = unknown; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 -$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } -if test "${ac_cv_sys_large_files+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - while :; do - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_large_files=no; break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define _LARGE_FILES 1 -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_sys_large_files=1; break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_sys_large_files=unknown - break -done -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 -$as_echo "$ac_cv_sys_large_files" >&6; } -case $ac_cv_sys_large_files in #( - no | unknown) ;; - *) -cat >>confdefs.h <<_ACEOF -#define _LARGE_FILES $ac_cv_sys_large_files -_ACEOF -;; -esac -rm -rf conftest* + 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 + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) 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="$sys_lib_dlsearch_path_spec $lt_ld_extra" fi -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' + ;; -if test "$enable_largefile" != no -a "$ac_cv_sys_large_files" != no; then - CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files" -fi -if test "$enable_largefile" != no -a "$ac_cv_sys_file_offset_bits" != no; then - CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" -fi +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* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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' + ;; +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 yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen" >&5 -$as_echo_n "checking for dlopen... " >&6; } -if test "${ac_cv_funclib_dlopen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +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 + ;; -if eval "test \"\$ac_cv_func_dlopen\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" dl; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +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 + ;; -#ifdef HAVE_DLFCN_H -#include -#endif -int -main () -{ -dlopen(0,0) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dlopen=$ac_lib; else ac_cv_funclib_dlopen=yes; fi";break +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + 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 yes = "$with_gnu_ld"; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_dlopen=\${ac_cv_funclib_dlopen-no}" - LIBS="$ac_save_LIBS" + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH -eval "ac_res=\$ac_cv_funclib_dlopen" -if false; then - for ac_func in dlopen -do : - ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DLOPEN 1 -_ACEOF -fi -done -fi -# dlopen -eval "ac_tr_func=HAVE_`echo dlopen | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dlopen=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_dlopen=yes" - eval "LIB_dlopen=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_dlopen=no" - eval "LIB_dlopen=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_dlopen=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac - if test "$ac_cv_funclib_dlopen" != no; then - HAVE_DLOPEN_TRUE= - HAVE_DLOPEN_FALSE='#' -else - HAVE_DLOPEN_TRUE='#' - HAVE_DLOPEN_FALSE= -fi -aix=no -case "$host" in -*-*-aix3*) - aix=3 - ;; -*-*-aix[4-9]*) - aix=4 - ;; -esac - if test "$aix" != no; then - AIX_TRUE= - AIX_FALSE='#' -else - AIX_TRUE='#' - AIX_FALSE= -fi - if test "$aix" = 4; then - AIX4_TRUE= - AIX4_FALSE='#' -else - AIX4_TRUE='#' - AIX4_FALSE= -fi -# Check whether --enable-dynamic-afs was given. -if test "${enable_dynamic_afs+set}" = set; then : - enableval=$enable_dynamic_afs; -fi -if test "$aix" != no; then -$as_echo "#define NEED_QSORT 1" >>confdefs.h - if test "$enable_dynamic_afs" != no; then - if test "$ac_cv_func_dlopen" = no; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for loadquery" >&5 -$as_echo_n "checking for loadquery... " >&6; } -if test "${ac_cv_funclib_loadquery+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_loadquery\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" ld; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ -loadquery() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_loadquery=$ac_lib; else ac_cv_funclib_loadquery=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_loadquery=\${ac_cv_funclib_loadquery-no}" - LIBS="$ac_save_LIBS" -fi -fi -eval "ac_res=\$ac_cv_funclib_loadquery" -if false; then - for ac_func in loadquery -do : - ac_fn_c_check_func "$LINENO" "loadquery" "ac_cv_func_loadquery" -if test "x$ac_cv_func_loadquery" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LOADQUERY 1 -_ACEOF -fi -done -fi -# loadquery -eval "ac_tr_func=HAVE_`echo loadquery | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_loadquery=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_loadquery=yes" - eval "LIB_loadquery=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_loadquery=no" - eval "LIB_loadquery=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_loadquery=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac - fi - if test "$ac_cv_func_dlopen" != no; then - AIX_EXTRA_KAFS='$(LIB_dlopen)' - elif test "$ac_cv_func_loadquery" != no; then - AIX_EXTRA_KAFS='$(LIB_loadquery)' - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not using dynloaded AFS library" >&5 -$as_echo "$as_me: not using dynloaded AFS library" >&6;} - AIX_EXTRA_KAFS= - enable_dynamic_afs=no - fi - else - AIX_EXTRA_KAFS= - fi -fi - if test "$enable_dynamic_afs" != no; then - AIX_DYNAMIC_AFS_TRUE= - AIX_DYNAMIC_AFS_FALSE='#' -else - AIX_DYNAMIC_AFS_TRUE='#' - AIX_DYNAMIC_AFS_FALSE= -fi -if test "$aix" != no; then -$as_echo "#define _ALL_SOURCE 1" >>confdefs.h -fi -irix=no -case "$host" in -*-*-irix*) - irix=yes - ;; -esac - if test "$irix" != no; then - IRIX_TRUE= - IRIX_FALSE='#' -else - IRIX_TRUE='#' - IRIX_FALSE= -fi -sunos=no -case "$host" in -*-*-solaris2.7) - sunos=57 - ;; -*-*-solaris2.[89] | *-*-solaris2.1[0-9]) - sunos=58 - ;; -*-*-solaris2*) - sunos=50 - ;; -esac -if test "$sunos" != no; then -cat >>confdefs.h <<_ACEOF -#define SunOS $sunos -_ACEOF -fi -$as_echo "#define _GNU_SOURCE 1" >>confdefs.h -for ac_prog in 'bison -y' byacc -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 test "${ac_cv_prog_YACC+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_YACC="$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 -YACC=$ac_cv_prog_YACC -if test -n "$YACC"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 -$as_echo "$YACC" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - test -n "$YACC" && break -done -test -n "$YACC" || YACC="yacc" -for ac_prog in flex lex -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 test "${ac_cv_prog_LEX+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LEX="$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 -LEX=$ac_cv_prog_LEX -if test -n "$LEX"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 -$as_echo "$LEX" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - test -n "$LEX" && break -done -test -n "$LEX" || LEX=":" -if test "x$LEX" != "x:"; then - cat >conftest.l <<_ACEOF -%% -a { ECHO; } -b { REJECT; } -c { yymore (); } -d { yyless (1); } -e { yyless (input () != 0); } -f { unput (yytext[0]); } -. { BEGIN INITIAL; } -%% -#ifdef YYTEXT_POINTER -extern char *yytext; -#endif -int -main (void) -{ - return ! yylex () + ! yywrap (); -} -_ACEOF -{ { ac_try="$LEX conftest.l" -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 "$LEX conftest.l") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5 -$as_echo_n "checking lex output file root... " >&6; } -if test "${ac_cv_prog_lex_root+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if test -f lex.yy.c; then - ac_cv_prog_lex_root=lex.yy -elif test -f lexyy.c; then - ac_cv_prog_lex_root=lexyy -else - as_fn_error "cannot find output from $LEX; giving up" "$LINENO" 5 -fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 -$as_echo "$ac_cv_prog_lex_root" >&6; } -LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root -if test -z "${LEXLIB+set}"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5 -$as_echo_n "checking lex library... " >&6; } -if test "${ac_cv_lib_lex+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_save_LIBS=$LIBS - ac_cv_lib_lex='none needed' - for ac_lib in '' -lfl -ll; do - LIBS="$ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -`cat $LEX_OUTPUT_ROOT.c` -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_lex=$ac_lib -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - test "$ac_cv_lib_lex" != 'none needed' && break - done - LIBS=$ac_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 -$as_echo "$ac_cv_lib_lex" >&6; } - test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 -$as_echo_n "checking whether yytext is a pointer... " >&6; } -if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # POSIX says lex can declare yytext either as a pointer or an array; the -# default is implementation-dependent. Figure out which it is, since -# not all implementations provide the %pointer and %array declarations. -ac_cv_prog_lex_yytext_pointer=no -ac_save_LIBS=$LIBS -LIBS="$LEXLIB $ac_save_LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#define YYTEXT_POINTER 1 -`cat $LEX_OUTPUT_ROOT.c` -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_prog_lex_yytext_pointer=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 -$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; } -if test $ac_cv_prog_lex_yytext_pointer = yes; then -$as_echo "#define YYTEXT_POINTER 1" >>confdefs.h -fi -rm -f conftest.l $LEX_OUTPUT_ROOT.c -fi -if test "$LEX" = :; then - LEX=${am_missing_run}flex -fi -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 test "${ac_cv_prog_AWK+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 for ln -s or something else" >&5 -$as_echo_n "checking for ln -s or something else... " >&6; } -if test "${ac_cv_prog_LN_S+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - rm -f conftestdata -if ln -s X conftestdata 2>/dev/null -then - rm -f conftestdata - ac_cv_prog_LN_S="ln -s" -else - touch conftestdata1 - if ln conftestdata1 conftestdata2; then - rm -f conftestdata* - ac_cv_prog_LN_S=ln + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink else - ac_cv_prog_LN_S=cp + # 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless fi -LN_S="$ac_cv_prog_LN_S" -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_LN_S" >&5 -$as_echo "$ac_cv_prog_LN_S" >&6; } -# Check whether --with-mips_abi was given. -if test "${with_mips_abi+set}" = set; then : - withval=$with_mips_abi; + + + if test yes != "$enable_dlopen"; 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$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_nop + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes -case "$host_os" in -irix*) -with_mips_abi="${with_mips_abi:-yes}" -if test -n "$GCC"; then +fi -# GCC < 2.8 only supports the O32 ABI. GCC >= 2.8 has a flag to select -# which ABI to use, but only supports (as of 2.8.1) the N32 and 64 ABIs. -# -# Default to N32, but if GCC doesn't grok -mabi=n32, we assume an old -# GCC and revert back to O32. The same goes if O32 is asked for - old -# GCCs doesn't like the -mabi option, and new GCCs can't output O32. -# -# Don't you just love *all* the different SGI ABIs? + ;; -case "${with_mips_abi}" in - 32|o32) abi='-mabi=32'; abilibdirext='' ;; - n32|yes) abi='-mabi=n32'; abilibdirext='32' ;; - 64) abi='-mabi=64'; abilibdirext='64' ;; - no) abi=''; abilibdirext='';; - *) as_fn_error "\"Invalid ABI specified\"" "$LINENO" 5 ;; -esac -if test -n "$abi" ; then -ac_foo=krb_cv_gcc_`echo $abi | tr =- __` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC supports the $abi option" >&5 -$as_echo_n "checking if $CC supports the $abi option... " >&6; } -if { as_var=$ac_foo; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; -save_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS $abi" + *) + 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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char shl_load (); int -main () +main (void) { -int x; +return shl_load (); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval $ac_foo=yes -else - eval $ac_foo=no +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else $as_nop + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_extCFLAGS="$save_CFLAGS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$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 $as_nop + 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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_res=`eval echo \\\$$ac_foo` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if test $ac_res = no; then -# Try to figure out why that failed... -case $abi in - -mabi=32) - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -mabi=n32" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* 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. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char dld_link (); int -main () +main (void) { -int x; +return dld_link (); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_res=yes -else - ac_res=no +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$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 -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CLAGS="$save_CFLAGS" - if test $ac_res = yes; then - # New GCC - as_fn_error "$CC does not support the $with_mips_abi ABI" "$LINENO" 5 - fi - # Old GCC - abi='' - abilibdirext='' - ;; - -mabi=n32|-mabi=64) - if test $with_mips_abi = yes; then - # Old GCC, default to O32 - abi='' - abilibdirext='' - else - # Some broken GCC - as_fn_error "$CC does not support the $with_mips_abi ABI" "$LINENO" 5 - fi - ;; -esac -fi #if test $ac_res = no; then -fi #if test -n "$abi" ; then -else -case "${with_mips_abi}" in - 32|o32) abi='-32'; abilibdirext='' ;; - n32|yes) abi='-n32'; abilibdirext='32' ;; - 64) abi='-64'; abilibdirext='64' ;; - no) abi=''; abilibdirext='';; - *) as_fn_error "\"Invalid ABI specified\"" "$LINENO" 5 ;; -esac -fi #if test -n "$GCC"; then -;; -esac -CC="$CC $abi" -libdir="$libdir$abilibdirext" +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__" >&5 -$as_echo_n "checking for __attribute__... " >&6; } -if test "${ac_cv___attribute__+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -static void foo(void) __attribute__ ((noreturn)); +fi -static void -foo(void) -{ - exit(1); -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv___attribute__=yes -else - ac_cv___attribute__=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -if test "$ac_cv___attribute__" = "yes"; then - -$as_echo "#define HAVE___ATTRIBUTE__ 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute__" >&5 -$as_echo "$ac_cv___attribute__" >&6; } +fi + + ;; + esac + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - if test "$enable_shared" = "yes"; then - ENABLE_SHARED_TRUE= - ENABLE_SHARED_FALSE='#' -else - ENABLE_SHARED_TRUE='#' - ENABLE_SHARED_FALSE= -fi + 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 for ld --version-script" >&5 -$as_echo_n "checking for ld --version-script... " >&6; } -if test "${rk_cv_version_script+set}" = set; then : - $as_echo_n "(cached) " >&6 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; 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" - rk_cv_version_script=no +#if HAVE_DLFCN_H +#include +#endif - cat > conftest.map < conftest.c < - if { ac_try='${CC-cc} -c $CFLAGS -fPIC conftest.c' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; } && - { ac_try='${CC-cc} -shared -Wl,--version-script,conftest.map $CFLAGS $LDFLAGS -o libconftestlib.so conftest.o' - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 - (eval $ac_try) 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; }; - then - rk_cv_version_script=yes - fi -rm -rf conftest* libconftest* .libs +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $rk_cv_version_script" >&5 -$as_echo "$rk_cv_version_script" >&6; } +/* 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 -if test $rk_cv_version_script = yes ; then - doversioning=yes - LDFLAGS_VERSION_SCRIPT="-Wl,--version-script," -else - doversioning=no - LDFLAGS_VERSION_SCRIPT= -fi +/* When -fvisibility=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 test $doversioning = yes; then - versionscript_TRUE= - versionscript_FALSE='#' -else - versionscript_TRUE='#' - versionscript_FALSE= -fi + 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=$? + printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; 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 - if test "${cross_compiling}" = yes; then - CROSS_COMPILE_TRUE= - CROSS_COMPILE_FALSE='#' -else - CROSS_COMPILE_TRUE='#' - CROSS_COMPILE_FALSE= -fi +/* 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 -fvisibility=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; -# Check whether --with-cross-tools was given. -if test "${with_cross_tools+set}" = set; then : - withval=$with_cross_tools; if test "$withval" = "yes"; then - as_fn_error "Need path to cross tools" "$LINENO" 5 - fi - with_cross_tools="${with_cross_tools}/" + 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=$? + printf "%s\n" "$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* -if test "${cross_compiling}" != yes ; then - - ASN1_COMPILE="\$(top_builddir)/lib/asn1/asn1_compile\$(EXEEXT)" - SLC="\$(top_builddir)/lib/sl/slc" - - ASN1_COMPILE_DEP="\$(ASN1_COMPILE)" - SLC_DEP="\$(SLC)" -else - ASN1_COMPILE="${with_cross_tools}asn1_compile" - SLC="${with_cross_tools}slc" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi - ASN1_COMPILE_DEP= - SLC_DEP= + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac - ac_cv_prog_COMPILE_ET=${with_cross_tools}compile_et + 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 @@ -12863,1569 +13355,2002 @@ -$as_echo "#define HEIM_WEAK_CRYPTO 1" >>confdefs.h -# Check whether --with-openldap was given. -if test "${with_openldap+set}" = set; then : - withval=$with_openldap; -fi - - -# Check whether --with-openldap-lib was given. -if test "${with_openldap_lib+set}" = set; then : - withval=$with_openldap_lib; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-openldap-lib" "$LINENO" 5 -elif test "X$with_openldap" = "X"; then - with_openldap=yes -fi -fi -# Check whether --with-openldap-include was given. -if test "${with_openldap_include+set}" = set; then : - withval=$with_openldap_include; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-openldap-include" "$LINENO" 5 -elif test "X$with_openldap" = "X"; then - with_openldap=yes -fi -fi -# Check whether --with-openldap-config was given. -if test "${with_openldap_config+set}" = set; then : - withval=$with_openldap_config; +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -z "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openldap" >&5 -$as_echo_n "checking for openldap... " >&6; } - -case "$with_openldap" in -yes|"") d='' ;; -no) d= ;; -*) d="$with_openldap" ;; -esac -header_dirs= -lib_dirs= -for i in $d; do - if test "$with_openldap_include" = ""; then - if test -d "$i/include/openldap"; then - header_dirs="$header_dirs $i/include/openldap" - fi - if test -d "$i/include"; then - header_dirs="$header_dirs $i/include" - fi - fi - if test "$with_openldap_lib" = ""; then - if test -d "$i/lib$abilibdirext"; then - lib_dirs="$lib_dirs $i/lib$abilibdirext" - fi - fi -done -if test "$with_openldap_include"; then - header_dirs="$with_openldap_include $header_dirs" -fi -if test "$with_openldap_lib"; then - lib_dirs="$with_openldap_lib $lib_dirs" -fi -if test "$with_openldap_config" = ""; then - with_openldap_config='' -fi -openldap_cflags= -openldap_libs= -case "$with_openldap_config" in -yes|no|""|"") - if test -f $with_openldap/bin/ ; then - with_openldap_config=$with_openldap/bin/ - fi - ;; -esac -case "$with_openldap_config" in -yes|no|"") - ;; -*) - openldap_cflags="`$with_openldap_config --cflags 2>&1`" - openldap_libs="`$with_openldap_config --libs 2>&1`" - ;; -esac -found=no -if test "$with_openldap" != no; then - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - if test "$openldap_cflags" -a "$openldap_libs"; then - CFLAGS="$openldap_cflags $save_CFLAGS" - LIBS="$openldap_libs $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no - INCLUDE_openldap="$openldap_cflags" - LIB_openldap="$openldap_libs" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: from $with_openldap_config" >&5 -$as_echo "from $with_openldap_config" >&6; } - found=yes -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi - if test "$found" = no; then - ires= lres= - for i in $header_dirs; do - CFLAGS="-I$i $save_CFLAGS" + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ires=$i;break -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - for i in $lib_dirs; do - LIBS="-L$i -lldap -llber $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lres=$i;break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - if test "$ires" -a "$lres" -a "$with_openldap" != "no"; then - INCLUDE_openldap="-I$ires" - LIB_openldap="-L$lres -lldap -llber " - found=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 -$as_echo "headers $ires, libraries $lres" >&6; } - fi - fi - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" -fi -if test "$found" = yes; then -cat >>confdefs.h <<_ACEOF -#define OPENLDAP 1 -_ACEOF - with_openldap=yes -else - with_openldap=no - INCLUDE_openldap= - LIB_openldap= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&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 -# Check whether --enable-hdb-openldap-module was given. -if test "${enable_hdb_openldap_module+set}" = set; then : - enableval=$enable_hdb_openldap_module; -fi - -if test "$enable_hdb_openldap_module" = yes -a "$with_openldap" = yes; then - -$as_echo "#define OPENLDAP_MODULE 1" >>confdefs.h -fi - if test "$enable_hdb_openldap_module" = yes -a "$with_openldap" = yes; then - OPENLDAP_MODULE_TRUE= - OPENLDAP_MODULE_FALSE='#' -else - OPENLDAP_MODULE_TRUE='#' - OPENLDAP_MODULE_FALSE= -fi -# Check whether --enable-pk-init was given. -if test "${enable_pk_init+set}" = set; then : - enableval=$enable_pk_init; -fi -if test "$enable_pk_init" != no ;then -$as_echo "#define PKINIT 1" >>confdefs.h -fi - if test "$enable_pk_init" != no; then - PKINIT_TRUE= - PKINIT_FALSE='#' -else - PKINIT_TRUE='#' - PKINIT_FALSE= -fi -# Check whether --enable-digest was given. -if test "${enable_digest+set}" = set; then : - enableval=$enable_digest; -fi -if test "$enable_digest" != no ;then -$as_echo "#define DIGEST 1" >>confdefs.h + ac_config_commands="$ac_config_commands libtool" -fi -# Check whether --enable-kx509 was given. -if test "${enable_kx509+set}" = set; then : - enableval=$enable_kx509; -fi -if test "$enable_kx509" != no ;then -$as_echo "#define KX509 1" >>confdefs.h +# Only expand once: -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 test "${ac_cv_path_PKG_CONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. 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 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$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; } +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. 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 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$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; } +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test "x$ac_pt_PKG_CONFIG" = x; then - PKG_CONFIG="" + 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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - PKG_CONFIG=$ac_pt_PKG_CONFIG + CC=$ac_ct_CC fi else - PKG_CONFIG="$ac_cv_path_PKG_CONFIG" + CC="$ac_cv_prog_CC" 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 +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS fi - - -# Check whether --with-capng was given. -if test "${with_capng+set}" = set; then : - withval=$with_capng; +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - with_capng=check + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -if test "$with_capng" != "no"; then - -pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAPNG" >&5 -$as_echo_n "checking for CAPNG... " >&6; } -if test -n "$PKG_CONFIG"; then - if test -n "$CAPNG_CFLAGS"; then - pkg_cv_CAPNG_CFLAGS="$CAPNG_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcap-ng >= 0.4.0\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libcap-ng >= 0.4.0") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_CAPNG_CFLAGS=`$PKG_CONFIG --cflags "libcap-ng >= 0.4.0" 2>/dev/null` -else - pkg_failed=yes + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. else - pkg_failed=untried + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 -if test -n "$PKG_CONFIG"; then - if test -n "$CAPNG_LIBS"; then - pkg_cv_CAPNG_LIBS="$CAPNG_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcap-ng >= 0.4.0\""; } >&5 - ($PKG_CONFIG --exists --print-errors "libcap-ng >= 0.4.0") 2>&5 - ac_status=$? - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 - test $ac_status = 0; }; then - pkg_cv_CAPNG_LIBS=`$PKG_CONFIG --libs "libcap-ng >= 0.4.0" 2>/dev/null` -else - pkg_failed=yes fi - fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - pkg_failed=untried + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 $pkg_failed = yes; then - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } else - _pkg_short_errors_supported=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi - if test $_pkg_short_errors_supported = yes; then - CAPNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libcap-ng >= 0.4.0"` - else - CAPNG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libcap-ng >= 0.4.0"` - fi - # Put the nasty error message in config.log where it belongs - echo "$CAPNG_PKG_ERRORS" >&5 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - with_capng=no -elif test $pkg_failed = untried; then - with_capng=no -else - CAPNG_CFLAGS=$pkg_cv_CAPNG_CFLAGS - CAPNG_LIBS=$pkg_cv_CAPNG_LIBS - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - with_capng=yes + + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 -if test "$with_capng" = "yes"; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_CAPNG 1 -_ACEOF - -fi - if test "$with_capng" != "no"; then - HAVE_CAPNG_TRUE= - HAVE_CAPNG_FALSE='#' +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } else - HAVE_CAPNG_TRUE='#' - HAVE_CAPNG_FALSE= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + test -n "$ac_ct_CC" && break +done - - - -# Check whether --with-sqlite3 was given. -if test "${with_sqlite3+set}" = set; then : - withval=$with_sqlite3; + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi fi +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -# Check whether --with-sqlite3-lib was given. -if test "${with_sqlite3_lib+set}" = set; then : - withval=$with_sqlite3_lib; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-sqlite3-lib" "$LINENO" 5 -elif test "X$with_sqlite3" = "X"; then - with_sqlite3=yes fi fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -# Check whether --with-sqlite3-include was given. -if test "${with_sqlite3_include+set}" = set; then : - withval=$with_sqlite3_include; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-sqlite3-include" "$LINENO" 5 -elif test "X$with_sqlite3" = "X"; then - with_sqlite3=yes -fi fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - -# Check whether --with-sqlite3-config was given. -if test "${with_sqlite3_config+set}" = set; then : - withval=$with_sqlite3_config; +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3" >&5 -$as_echo_n "checking for sqlite3... " >&6; } +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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; } -case "$with_sqlite3" in -yes|"") d='' ;; -no) d= ;; -*) d="$with_sqlite3" ;; +# Provide some information about the compiler. +printf "%s\n" "$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 -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac - -header_dirs= -lib_dirs= -for i in $d; do - if test "$with_sqlite3_include" = ""; then - if test -d "$i/include/sqlite3"; then - header_dirs="$header_dirs $i/include/sqlite3" - fi - if test -d "$i/include"; then - header_dirs="$header_dirs $i/include" - fi - fi - if test "$with_sqlite3_lib" = ""; then - if test -d "$i/lib$abilibdirext"; then - lib_dirs="$lib_dirs $i/lib$abilibdirext" - fi - fi +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } done -if test "$with_sqlite3_include"; then - header_dirs="$with_sqlite3_include $header_dirs" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no fi -if test "$with_sqlite3_lib"; then - lib_dirs="$with_sqlite3_lib $lib_dirs" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test "$with_sqlite3_config" = ""; then - with_sqlite3_config='' +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ -sqlite3_cflags= -sqlite3_libs= +int +main (void) +{ -case "$with_sqlite3_config" in -yes|no|""|"") - if test -f $with_sqlite3/bin/ ; then - with_sqlite3_config=$with_sqlite3/bin/ - fi - ;; -esac + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -case "$with_sqlite3_config" in -yes|no|"") - ;; -*) - sqlite3_cflags="`$with_sqlite3_config --cflags 2>&1`" - sqlite3_libs="`$with_sqlite3_config --libs 2>&1`" - ;; -esac +int +main (void) +{ -found=no -if test "$with_sqlite3" != no; then - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - if test "$sqlite3_cflags" -a "$sqlite3_libs"; then - CFLAGS="$sqlite3_cflags $save_CFLAGS" - LIBS="$sqlite3_libs $save_LIBS" + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifndef SQLITE_OPEN_CREATE -#error "old version" -#endif + int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - INCLUDE_sqlite3="$sqlite3_cflags" - LIB_sqlite3="$sqlite3_libs" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: from $with_sqlite3_config" >&5 -$as_echo "from $with_sqlite3_config" >&6; } - found=yes +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; 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 +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi - if test "$found" = no; then - ires= lres= - for i in $header_dirs; do - CFLAGS="-I$i $save_CFLAGS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifndef SQLITE_OPEN_CREATE -#error "old version" -#endif -int -main () -{ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +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 conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi - ; - return 0; -} +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ires=$i;break +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 conftest.$ac_ext - done - for i in $lib_dirs; do - LIBS="-L$i -lsqlite3 $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +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 + + + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifndef SQLITE_OPEN_CREATE -#error "old version" -#endif + int -main () +main (void) { ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lres=$i;break + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - if test "$ires" -a "$lres" -a "$with_sqlite3" != "no"; then - INCLUDE_sqlite3="-I$ires" - LIB_sqlite3="-L$lres -lsqlite3 " - found=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 -$as_echo "headers $ires, libraries $lres" >&6; } - fi - fi - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu -if test "$found" = yes; then -cat >>confdefs.h <<_ACEOF -#define SQLITE3 1 -_ACEOF +depcc="$CC" am_compiler_list= - with_sqlite3=yes -else - with_sqlite3=no - INCLUDE_sqlite3= - LIB_sqlite3= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 -if test "X$with_sqlite3" != Xyes ; then - INCLUDE_sqlite3="-I\$(top_srcdir)/lib/sqlite" - LIB_sqlite3="\$(top_builddir)/lib/sqlite/libheimsqlite.la" fi - if test "X$with_sqlite3" = Xyes; then - SQLITE3_TRUE= - SQLITE3_FALSE='#' +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$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 - SQLITE3_TRUE='#' - SQLITE3_FALSE= + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= fi -$as_echo "#define HAVE_SQLITE3 1" >>confdefs.h +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "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 test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" 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. + # 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. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext -# Check whether --enable-sqlite-cache was given. -if test "${enable_sqlite_cache+set}" = set; then : - enableval=$enable_sqlite_cache; + # 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 $as_nop + # Passes both tests. +ac_preproc_ok=: +break fi +rm -f conftest.err conftest.i conftest.$ac_ext -if test "$enable_sqlite_cache" != no; then +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 -$as_echo "#define HAVE_SCC 1" >>confdefs.h + done + ac_cv_prog_CPP=$CPP fi - if test "$enable_sqlite_cache" != no; then - have_scc_TRUE= - have_scc_FALSE='#' + CPP=$ac_cv_prog_CPP else - have_scc_TRUE='#' - have_scc_FALSE= + ac_cv_prog_CPP=$CPP fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$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. + # 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. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : - - - - -# Check whether --with-libintl was given. -if test "${with_libintl+set}" = set; then : - withval=$with_libintl; +else $as_nop + # Broken: fails on valid input. +continue fi +rm -f conftest.err conftest.i conftest.$ac_ext - -# Check whether --with-libintl-lib was given. -if test "${with_libintl_lib+set}" = set; then : - withval=$with_libintl_lib; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-libintl-lib" "$LINENO" 5 -elif test "X$with_libintl" = "X"; then - with_libintl=yes -fi + # 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 $as_nop + # 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 : -# Check whether --with-libintl-include was given. -if test "${with_libintl_include+set}" = set; then : - withval=$with_libintl_include; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-libintl-include" "$LINENO" 5 -elif test "X$with_libintl" = "X"; then - with_libintl=yes -fi +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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 -# Check whether --with-libintl-config was given. -if test "${with_libintl_config+set}" = set; then : - withval=$with_libintl_config; -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libintl" >&5 -$as_echo_n "checking for libintl... " >&6; } -case "$with_libintl" in -yes|"") d='' ;; -no) d= ;; -*) d="$with_libintl" ;; -esac -header_dirs= -lib_dirs= -for i in $d; do - if test "$with_libintl_include" = ""; then - if test -d "$i/include/libintl"; then - header_dirs="$header_dirs $i/include/libintl" - fi - if test -d "$i/include"; then - header_dirs="$header_dirs $i/include" - fi - fi - if test "$with_libintl_lib" = ""; then - if test -d "$i/lib$abilibdirext"; then - lib_dirs="$lib_dirs $i/lib$abilibdirext" - fi - fi + # Find any Python interpreter. + if test -z "$PYTHON"; then + for ac_prog in python python2 python3 python3.9 python3.8 python3.7 python3.6 python3.5 python3.4 python3.3 python3.2 python3.1 python3.0 python2.7 python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PYTHON+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHON="$PYTHON" # 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_PYTHON="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$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 "$with_libintl_include"; then - header_dirs="$with_libintl_include $header_dirs" + ;; +esac fi -if test "$with_libintl_lib"; then - lib_dirs="$with_libintl_lib $lib_dirs" +PYTHON=$ac_cv_path_PYTHON +if test -n "$PYTHON"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 +printf "%s\n" "$PYTHON" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -if test "$with_libintl_config" = ""; then - with_libintl_config='' -fi -libintl_cflags= -libintl_libs= + test -n "$PYTHON" && break +done +test -n "$PYTHON" || PYTHON=":" -case "$with_libintl_config" in -yes|no|""|"") - if test -f $with_libintl/bin/ ; then - with_libintl_config=$with_libintl/bin/ - fi - ;; -esac + fi + am_display_PYTHON=python -case "$with_libintl_config" in -yes|no|"") - ;; -*) - libintl_cflags="`$with_libintl_config --cflags 2>&1`" - libintl_libs="`$with_libintl_config --libs 2>&1`" - ;; -esac -found=no -if test "$with_libintl" != no; then - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - if test "$libintl_cflags" -a "$libintl_libs"; then - CFLAGS="$libintl_cflags $save_CFLAGS" - LIBS="$libintl_libs $save_LIBS" + if test "$PYTHON" = :; then + as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5 + else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5 +printf %s "checking for $am_display_PYTHON version... " >&6; } +if test ${am_cv_python_version+y} +then : + printf %s "(cached) " >&6 +else $as_nop + am_cv_python_version=`$PYTHON -c "import sys; print ('%u.%u' % sys.version_info[:2])"` +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5 +printf "%s\n" "$am_cv_python_version" >&6; } + PYTHON_VERSION=$am_cv_python_version - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - INCLUDE_libintl="$libintl_cflags" - LIB_libintl="$libintl_libs" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: from $with_libintl_config" >&5 -$as_echo "from $with_libintl_config" >&6; } - found=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5 +printf %s "checking for $am_display_PYTHON platform... " >&6; } +if test ${am_cv_python_platform+y} +then : + printf %s "(cached) " >&6 +else $as_nop + am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"` fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi - if test "$found" = no; then - ires= lres= - for i in $header_dirs; do - CFLAGS="-I$i $save_CFLAGS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5 +printf "%s\n" "$am_cv_python_platform" >&6; } + PYTHON_PLATFORM=$am_cv_python_platform - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ires=$i;break + if test "x$prefix" = xNONE; then + am__usable_prefix=$ac_default_prefix + else + am__usable_prefix=$prefix + fi + + # Allow user to request using sys.* values from Python, + # instead of the GNU $prefix values. + +# Check whether --with-python-sys-prefix was given. +if test ${with_python_sys_prefix+y} +then : + withval=$with_python_sys_prefix; am_use_python_sys=: +else $as_nop + am_use_python_sys=false +fi + + + # Allow user to override whatever the default Python prefix is. + +# Check whether --with-python_prefix was given. +if test ${with_python_prefix+y} +then : + withval=$with_python_prefix; am_python_prefix_subst=$withval + am_cv_python_prefix=$withval + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON prefix" >&5 +printf %s "checking for explicit $am_display_PYTHON prefix... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 +printf "%s\n" "$am_cv_python_prefix" >&6; } +else $as_nop + + if $am_use_python_sys; then + # using python sys.prefix value, not GNU + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON prefix" >&5 +printf %s "checking for python default $am_display_PYTHON prefix... " >&6; } +if test ${am_cv_python_prefix+y} +then : + printf %s "(cached) " >&6 +else $as_nop + am_cv_python_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.prefix)"` +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_prefix" >&5 +printf "%s\n" "$am_cv_python_prefix" >&6; } + + case $am_cv_python_prefix in + $am__usable_prefix*) + am__strip_prefix=`echo "$am__usable_prefix" | sed 's|.|.|g'` + am_python_prefix_subst=`echo "$am_cv_python_prefix" | sed "s,^$am__strip_prefix,\\${prefix},"` + ;; + *) + am_python_prefix_subst=$am_cv_python_prefix + ;; + esac + else # using GNU prefix value, not python sys.prefix + am_python_prefix_subst='${prefix}' + am_python_prefix=$am_python_prefix_subst + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON prefix" >&5 +printf %s "checking for GNU default $am_display_PYTHON prefix... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_prefix" >&5 +printf "%s\n" "$am_python_prefix" >&6; } + fi fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - for i in $lib_dirs; do - LIBS="-L$i -lintl $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lres=$i;break + # Substituting python_prefix_subst value. + PYTHON_PREFIX=$am_python_prefix_subst + + + # emacs-page Now do it all over again for Python exec_prefix, but with yet + # another conditional: fall back to regular prefix if that was specified. + +# Check whether --with-python_exec_prefix was given. +if test ${with_python_exec_prefix+y} +then : + withval=$with_python_exec_prefix; am_python_exec_prefix_subst=$withval + am_cv_python_exec_prefix=$withval + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for explicit $am_display_PYTHON exec_prefix" >&5 +printf %s "checking for explicit $am_display_PYTHON exec_prefix... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 +printf "%s\n" "$am_cv_python_exec_prefix" >&6; } +else $as_nop + + # no explicit --with-python_exec_prefix, but if + # --with-python_prefix was given, use its value for python_exec_prefix too. + if test -n "$with_python_prefix" +then : + am_python_exec_prefix_subst=$with_python_prefix + am_cv_python_exec_prefix=$with_python_prefix + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python_prefix-given $am_display_PYTHON exec_prefix" >&5 +printf %s "checking for python_prefix-given $am_display_PYTHON exec_prefix... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 +printf "%s\n" "$am_cv_python_exec_prefix" >&6; } +else $as_nop + + # Set am__usable_exec_prefix whether using GNU or Python values, + # since we use that variable for pyexecdir. + if test "x$exec_prefix" = xNONE; then + am__usable_exec_prefix=$am__usable_prefix + else + am__usable_exec_prefix=$exec_prefix + fi + # + if $am_use_python_sys; then # using python sys.exec_prefix, not GNU + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for python default $am_display_PYTHON exec_prefix" >&5 +printf %s "checking for python default $am_display_PYTHON exec_prefix... " >&6; } +if test ${am_cv_python_exec_prefix+y} +then : + printf %s "(cached) " >&6 +else $as_nop + am_cv_python_exec_prefix=`$PYTHON -c "import sys; sys.stdout.write(sys.exec_prefix)"` +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_exec_prefix" >&5 +printf "%s\n" "$am_cv_python_exec_prefix" >&6; } + case $am_cv_python_exec_prefix in + $am__usable_exec_prefix*) + am__strip_prefix=`echo "$am__usable_exec_prefix" | sed 's|.|.|g'` + am_python_exec_prefix_subst=`echo "$am_cv_python_exec_prefix" | sed "s,^$am__strip_prefix,\\${exec_prefix},"` + ;; + *) + am_python_exec_prefix_subst=$am_cv_python_exec_prefix + ;; + esac + else # using GNU $exec_prefix, not python sys.exec_prefix + am_python_exec_prefix_subst='${exec_prefix}' + am_python_exec_prefix=$am_python_exec_prefix_subst + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU default $am_display_PYTHON exec_prefix" >&5 +printf %s "checking for GNU default $am_display_PYTHON exec_prefix... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_python_exec_prefix" >&5 +printf "%s\n" "$am_python_exec_prefix" >&6; } + fi fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - if test "$ires" -a "$lres" -a "$with_libintl" != "no"; then - INCLUDE_libintl="-I$ires" - LIB_libintl="-L$lres -lintl " - found=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 -$as_echo "headers $ires, libraries $lres" >&6; } - fi - fi - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" fi -if test "$found" = yes; then - -cat >>confdefs.h <<_ACEOF -#define LIBINTL 1 -_ACEOF + # Substituting python_exec_prefix_subst. + PYTHON_EXEC_PREFIX=$am_python_exec_prefix_subst + + + # Factor out some code duplication into this shell variable. + am_python_setup_sysconfig="\ +import sys +# Prefer sysconfig over distutils.sysconfig, for better compatibility +# with python 3.x. See automake bug#10227. +try: + import sysconfig +except ImportError: + can_use_sysconfig = 0 +else: + can_use_sysconfig = 1 +# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs: +# +try: + from platform import python_implementation + if python_implementation() == 'CPython' and sys.version[:3] == '2.7': + can_use_sysconfig = 0 +except ImportError: + pass" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory (pythondir)" >&5 +printf %s "checking for $am_display_PYTHON script directory (pythondir)... " >&6; } +if test ${am_cv_python_pythondir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$am_cv_python_prefix" = x; then + am_py_prefix=$am__usable_prefix + else + am_py_prefix=$am_cv_python_prefix + fi + am_cv_python_pythondir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix') +sys.stdout.write(sitedir)"` + # + case $am_cv_python_pythondir in + $am_py_prefix*) + am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'` + am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,\\${PYTHON_PREFIX},"` + ;; + *) + case $am_py_prefix in + /usr|/System*) ;; + *) am_cv_python_pythondir="\${PYTHON_PREFIX}/lib/python$PYTHON_VERSION/site-packages" + ;; + esac + ;; + esac - with_libintl=yes -else - with_libintl=no - INCLUDE_libintl= - LIB_libintl= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5 +printf "%s\n" "$am_cv_python_pythondir" >&6; } + pythondir=$am_cv_python_pythondir + pkgpythondir=\${pythondir}/$PACKAGE + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory (pyexecdir)" >&5 +printf %s "checking for $am_display_PYTHON extension module directory (pyexecdir)... " >&6; } +if test ${am_cv_python_pyexecdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$am_cv_python_exec_prefix" = x; then + am_py_exec_prefix=$am__usable_exec_prefix + else + am_py_exec_prefix=$am_cv_python_exec_prefix + fi + am_cv_python_pyexecdir=`$PYTHON -c " +$am_python_setup_sysconfig +if can_use_sysconfig: + sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_exec_prefix'}) +else: + from distutils import sysconfig + sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_exec_prefix') +sys.stdout.write(sitedir)"` + # + case $am_cv_python_pyexecdir in + $am_py_exec_prefix*) + am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'` + am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,\\${PYTHON_EXEC_PREFIX},"` + ;; + *) + case $am_py_exec_prefix in + /usr|/System*) ;; + *) am_cv_python_pyexecdir="\${PYTHON_EXEC_PREFIX}/lib/python$PYTHON_VERSION/site-packages" + ;; + esac + ;; + esac - -# Check whether --with-hdbdir was given. -if test "${with_hdbdir+set}" = set; then : - withval=$with_hdbdir; -else - with_hdbdir=/var/heimdal fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5 +printf "%s\n" "$am_cv_python_pyexecdir" >&6; } + pyexecdir=$am_cv_python_pyexecdir -DIR_hdbdir="$with_hdbdir" + pkgpyexecdir=\${pyexecdir}/$PACKAGE -with_krb4=no + fi - if false; then - KRB4_TRUE= - KRB4_FALSE='#' +# Extract the first word of "clang-format", so it can be a program name with args. +set dummy clang-format; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CLANG_FORMAT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CLANG_FORMAT"; then + ac_cv_prog_CLANG_FORMAT="$CLANG_FORMAT" # Let the user override the test. else - KRB4_TRUE='#' - KRB4_FALSE= -fi - +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_CLANG_FORMAT="clang-format" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS - if true; then - KRB5_TRUE= - KRB5_FALSE='#' -else - KRB5_TRUE='#' - KRB5_FALSE= + test -z "$ac_cv_prog_CLANG_FORMAT" && ac_cv_prog_CLANG_FORMAT="no" fi - - if true; then - do_roken_rename_TRUE= - do_roken_rename_FALSE='#' +fi +CLANG_FORMAT=$ac_cv_prog_CLANG_FORMAT +if test -n "$CLANG_FORMAT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CLANG_FORMAT" >&5 +printf "%s\n" "$CLANG_FORMAT" >&6; } else - do_roken_rename_TRUE='#' - do_roken_rename_FALSE= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -$as_echo "#define SUPPORT_INETD 1" >>confdefs.h - - - -$as_echo "#define KRB5 1" >>confdefs.h - - -crypto_lib=unknown - - -# Check whether --with-openssl was given. -if test "${with_openssl+set}" = set; then : - withval=$with_openssl; +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; fi - - -# Check whether --with-openssl-lib was given. -if test "${with_openssl_lib+set}" = set; then : - withval=$with_openssl_lib; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-openssl-lib" "$LINENO" 5 -elif test "X$with_openssl" = "X"; then - with_openssl=yes -fi +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no fi - - - -# Check whether --with-openssl-include was given. -if test "${with_openssl_include+set}" = set; then : - withval=$with_openssl_include; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-openssl-include" "$LINENO" 5 -elif test "X$with_openssl" = "X"; then - with_openssl=yes fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi +AM_BACKSLASH='\' -case "$with_openssl" in -yes) ;; -no) ;; -"") ;; -*) if test "$with_openssl_include" = ""; then - with_openssl_include="$with_openssl/include" - fi - if test "$with_openssl_lib" = ""; then - with_openssl_lib="$with_openssl/lib$abilibdirext" - fi - ;; -esac - -DIR_hcrypto= -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypto library" >&5 -$as_echo_n "checking for crypto library... " >&6; } +test "$sysconfdir" = '${prefix}/etc' && sysconfdir='/etc' +test "$localstatedir" = '${prefix}/var' && localstatedir='/var/heimdal' -openssl=no -if test "$crypto_lib" = "unknown" -a "$with_krb4" != "no"; then - save_CPPFLAGS="$CPPFLAGS" - save_LIBS="$LIBS" +CANONICAL_HOST=$host - cdirs= clibs= - for i in $LIB_krb4; do - case "$i" in - -L*) cdirs="$cdirs $i";; - -l*) clibs="$clibs $i";; - esac - done - ires= - for i in $INCLUDE_krb4; do - CFLAGS="-DHAVE_OPENSSL $i $save_CFLAGS" - for j in $cdirs; do - for k in $clibs; do - LIBS="$j $k $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +# Check whether --enable-largefile was given. +if test ${enable_largefile+y} +then : + enableval=$enable_largefile; +fi - #undef KRB5 /* makes md4.h et al unhappy */ - #ifdef HAVE_OPENSSL - #ifdef HAVE_SYS_TYPES_H - #include - #endif - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #else - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #endif +if test "$enable_largefile" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +printf %s "checking for special C compiler options needed for large files... " >&6; } +if test ${ac_cv_sys_largefile_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; int -main () +main (void) { - void *schedule = 0; - EVP_MD_CTX mdctx; - - EVP_md4(); - EVP_md5(); - EVP_sha1(); - EVP_sha256(); - - EVP_MD_CTX_init(&mdctx); - EVP_DigestInit_ex(&mdctx, EVP_sha1(), (ENGINE *)0); - EVP_CIPHER_iv_length(((EVP_CIPHER*)0)); - UI_UTIL_read_pw_string(0,0,0,0); - RAND_status(); - #ifdef HAVE_OPENSSL - EC_KEY_new(); - #endif - - OpenSSL_add_all_algorithms(); - AES_encrypt(0,0,0); - DES_cbc_encrypt(0, 0, 0, schedule, 0, 0); - RC4(0, 0, 0, 0); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - openssl=yes ires="$i" lres="$j $k"; break 3 + if ac_fn_c_try_compile "$LINENO" +then : + break fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - done - CFLAGS="$i $save_CFLAGS" - for j in $cdirs; do - for k in $clibs; do - LIBS="$j $k $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #undef KRB5 /* makes md4.h et al unhappy */ - #ifdef HAVE_OPENSSL - #ifdef HAVE_SYS_TYPES_H - #include - #endif - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #else - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #endif +rm -f core conftest.err conftest.$ac_objext conftest.beam + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +printf "%s\n" "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +printf %s "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test ${ac_cv_sys_file_offset_bits+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; int -main () +main (void) { - void *schedule = 0; - EVP_MD_CTX mdctx; - - EVP_md4(); - EVP_md5(); - EVP_sha1(); - EVP_sha256(); - - EVP_MD_CTX_init(&mdctx); - EVP_DigestInit_ex(&mdctx, EVP_sha1(), (ENGINE *)0); - EVP_CIPHER_iv_length(((EVP_CIPHER*)0)); - UI_UTIL_read_pw_string(0,0,0,0); - RAND_status(); - #ifdef HAVE_OPENSSL - EC_KEY_new(); - #endif - - OpenSSL_add_all_algorithms(); - AES_encrypt(0,0,0); - DES_cbc_encrypt(0, 0, 0, schedule, 0, 0); - RC4(0, 0, 0, 0); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - openssl=no ires="$i" lres="$j $k"; break 3 -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - done - done - - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" - if test "$ires" -a "$lres"; then - INCLUDE_hcrypto="$ires" - LIB_hcrypto="$lres" - crypto_lib=krb4 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: same as krb4" >&5 -$as_echo "same as krb4" >&6; } - LIB_hcrypto_a='$(LIB_hcrypto)' - LIB_hcrypto_so='$(LIB_hcrypto)' - LIB_hcrypto_appl='$(LIB_hcrypto)' - fi +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=no; break fi - -if test "$crypto_lib" = "unknown" -a "$with_openssl" != "no"; then - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - INCLUDE_hcrypto= - LIB_hcrypto= - if test "$with_openssl_include" != ""; then - INCLUDE_hcrypto="-I${with_openssl_include}" - fi - if test "$with_openssl_lib" != ""; then - LIB_hcrypto="-L${with_openssl_lib}" - fi - CFLAGS="-DHAVE_OPENSSL ${INCLUDE_hcrypto} ${CFLAGS}" - saved_LIB_hcrypto="$LIB_hcrypto" - for lres in "" "-ldl" "-lnsl -lsocket" "-lnsl -lsocket -ldl"; do - LIB_hcrypto="${saved_LIB_hcrypto} -lcrypto $lres" - LIB_hcrypto_a="$LIB_hcrypto" - LIB_hcrypto_so="$LIB_hcrypto" - LIB_hcrypto_appl="$LIB_hcrypto" - LIBS="${LIBS} ${LIB_hcrypto}" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - - #undef KRB5 /* makes md4.h et al unhappy */ - #ifdef HAVE_OPENSSL - #ifdef HAVE_SYS_TYPES_H - #include - #endif - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #else - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #endif - +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; int -main () +main (void) { - void *schedule = 0; - EVP_MD_CTX mdctx; - - EVP_md4(); - EVP_md5(); - EVP_sha1(); - EVP_sha256(); - - EVP_MD_CTX_init(&mdctx); - EVP_DigestInit_ex(&mdctx, EVP_sha1(), (ENGINE *)0); - EVP_CIPHER_iv_length(((EVP_CIPHER*)0)); - UI_UTIL_read_pw_string(0,0,0,0); - RAND_status(); - #ifdef HAVE_OPENSSL - EC_KEY_new(); - #endif - - OpenSSL_add_all_algorithms(); - AES_encrypt(0,0,0); - DES_cbc_encrypt(0, 0, 0, schedule, 0, 0); - RC4(0, 0, 0, 0); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - crypto_lib=libcrypto openssl=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libcrypto" >&5 -$as_echo "libcrypto" >&6; } - -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - if test "$crypto_lib" = libcrypto ; then - break; - fi - done - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" -fi - -if test "$crypto_lib" = "unknown"; then - - DIR_hcrypto='hcrypto' - LIB_hcrypto='$(top_builddir)/lib/hcrypto/libhcrypto.la' - LIB_hcrypto_a='$(top_builddir)/lib/hcrypto/.libs/libhcrypto.a' - LIB_hcrypto_so='$(top_builddir)/lib/hcrypto/.libs/libhcrypto.so' - LIB_hcrypto_appl="-lhcrypto" - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: included libhcrypto" >&5 -$as_echo "included libhcrypto" >&6; } - -fi - -if test "$with_krb4" != no -a "$crypto_lib" != krb4; then - as_fn_error "the crypto library used by krb4 lacks features -required by Kerberos 5; to continue, you need to install a newer -Kerberos 4 or configure --without-krb4" "$LINENO" 5 -fi - -if test "$openssl" = "yes"; then - -$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h - +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_file_offset_bits=64; break fi - if test "$openssl" = yes; then - HAVE_OPENSSL_TRUE= - HAVE_OPENSSL_FALSE='#' -else - HAVE_OPENSSL_TRUE='#' - HAVE_OPENSSL_FALSE= +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +printf "%s\n" "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +printf "%s\n" "#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits" >>confdefs.h +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +printf %s "checking for _LARGE_FILES value needed for large files... " >&6; } +if test ${ac_cv_sys_large_files+y} +then : + printf %s "(cached) " >&6 +else $as_nop + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ - - - - - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiling threadsafe libraries" >&5 -$as_echo_n "checking if compiling threadsafe libraries... " >&6; } - -# Check whether --enable-pthread-support was given. -if test "${enable_pthread_support+set}" = set; then : - enableval=$enable_pthread_support; -else - enable_pthread_support=maybe + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=no; break fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 31 << 31) - 1 + ((off_t) 1 << 31 << 31)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main (void) +{ - -case "$host" in -*-*-solaris2*) - native_pthread_support=yes - if test "$GCC" = yes; then - PTHREAD_CFLAGS=-pthreads - PTHREAD_LIBADD=-pthreads - else - PTHREAD_CFLAGS=-mt - PTHREAD_LDADD=-mt - PTHREAD_LIBADD=-mt - fi - ;; -*-*-netbsd[12]*) - native_pthread_support="if running netbsd 1.6T or newer" - PTHREAD_LIBADD="-lpthread" - ;; -*-*-netbsd[3456789]*) - native_pthread_support="netbsd 3 uses explict pthread" - PTHREAD_LIBADD="-lpthread" - ;; -*-*-freebsd[56789]*) - native_pthread_support=yes - PTHREAD_LIBADD="-pthread" - ;; -*-*-openbsd*) - native_pthread_support=yes - PTHREAD_CFLAGS=-pthread - PTHREAD_LIBADD=-pthread - ;; -*-*-linux* | *-*-linux-gnu) - case `uname -r` in - 2.*|3.*) - native_pthread_support=yes - PTHREAD_CFLAGS=-pthread - PTHREAD_LIBADD=-pthread - ;; - esac - ;; -*-*-kfreebsd*-gnu*) - native_pthread_support=yes - PTHREAD_CFLAGS=-pthread - PTHREAD_LIBADD=-pthread - ;; -*-*-aix*) - native_pthread_support=no - ;; -mips-sgi-irix6.[5-9]) # maybe works for earlier versions too - native_pthread_support=yes - PTHREAD_LIBADD="-lpthread" - ;; -*-*-darwin*) - native_pthread_support=yes - ;; -*) - native_pthread_support=no - ;; -esac - -if test "$enable_pthread_support" = maybe ; then - enable_pthread_support="$native_pthread_support" + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_sys_large_files=1; break fi - -if test "$enable_pthread_support" != no; then - -$as_echo "#define ENABLE_PTHREAD_SUPPORT 1" >>confdefs.h - - LIBS="$PTHREAD_LIBADD $LIBS" -else - PTHREAD_CFLAGS="" - PTHREAD_LIBADD="" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +printf "%s\n" "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +printf "%s\n" "#define _LARGE_FILES $ac_cv_sys_large_files" >>confdefs.h +;; +esac +rm -rf conftest* + fi fi +if test "$enable_largefile" != no -a "$ac_cv_sys_large_files" != no; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files" +fi +if test "$enable_largefile" != no -a "$ac_cv_sys_file_offset_bits" != no; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_pthread_support" >&5 -$as_echo "$enable_pthread_support" >&6; } -# Check whether --enable-dce was given. -if test "${enable_dce+set}" = set; then : - enableval=$enable_dce; -fi -if test "$enable_dce" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen" >&5 +printf %s "checking for dlopen... " >&6; } +if test ${ac_cv_funclib_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop -$as_echo "#define DCE 1" >>confdefs.h +if eval "test \"\$ac_cv_func_dlopen\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" dl; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_DLFCN_H +#include +#endif +int +main (void) +{ +dlopen(0,0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dlopen=$ac_lib; else ac_cv_funclib_dlopen=yes; fi";break fi - if test "$enable_dce" = yes; then - DCE_TRUE= - DCE_FALSE='#' -else - DCE_TRUE='#' - DCE_FALSE= +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_dlopen=\${ac_cv_funclib_dlopen-no}" + LIBS="$ac_save_LIBS" fi - -## XXX quite horrible: -if test -f /etc/ibmcxx.cfg; then - dpagaix_ldadd=`sed -n '/^xlc_r4/,/^$/p' /etc/ibmcxx.cfg | sed -n -e '/libraries/{;s/^[^=]*=\(.*\)/\1/;s/,/ /gp;}'` - dpagaix_cflags=`sed -n '/^xlc_r4/,/^$/p' /etc/ibmcxx.cfg | sed -n -e '/options/{;s/^[^=]*=\(.*\)/\1/;s/-q^,*//;s/,/ /gp;}'` - dpagaix_ldflags= -else - dpagaix_cflags="-D_THREAD_SAFE -D_AIX_PTHREADS_D7 -D_AIX32_THREADS=1 -D_AES_SOURCE -D_AIX41 -I/usr/include/dce" - dpagaix_ldadd="-L/usr/lib/threads -ldcelibc_r -ldcepthreads -lpthreads_compat lpthreads -lc_r" - dpagaix_ldflags="-Wl,-bI:dfspag.exp" fi +eval "ac_res=\$ac_cv_funclib_dlopen" +if false; then + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + printf "%s\n" "#define HAVE_DLOPEN 1" >>confdefs.h -# Check whether --enable-afs-support was given. -if test "${enable_afs_support+set}" = set; then : - enableval=$enable_afs_support; fi -if test "$enable_afs_support" = no; then - -$as_echo "#define NO_AFS 1" >>confdefs.h - - NO_AFS="1" fi +# dlopen +eval "ac_tr_func=HAVE_`echo dlopen | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_dlopen=$ac_res" +case "$ac_res" in + yes) + eval "ac_cv_func_dlopen=yes" + eval "LIB_dlopen=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_dlopen=no" + eval "LIB_dlopen=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_dlopen=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -# Check whether --with-berkeley-db was given. -if test "${with_berkeley_db+set}" = set; then : - withval=$with_berkeley_db; -else - with_berkeley_db=check -fi + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac -dbheader="" -# Check whether --with-berkeley-db-include was given. -if test "${with_berkeley_db_include+set}" = set; then : - withval=$with_berkeley_db_include; dbheader=$withval + if test "$ac_cv_funclib_dlopen" != no; then + HAVE_DLOPEN_TRUE= + HAVE_DLOPEN_FALSE='#' else - with_berkeley_db_include=check -fi - - -# Check whether --enable-ndbm-db was given. -if test "${enable_ndbm_db+set}" = set; then : - enableval=$enable_ndbm_db; - + HAVE_DLOPEN_TRUE='#' + HAVE_DLOPEN_FALSE= fi -have_ndbm=no -db_type=unknown - -if test "x$with_berkeley_db" != xno; then : - if test "x$with_berkeley_db_include" != xcheck; then : - for ac_header in "$dbheader/db.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - DBHEADER=$dbheader - -$as_echo "#define HAVE_DBHEADER 1" >>confdefs.h +aix=no +case "$host" in +*-*-aix3*) + aix=3 + ;; +*-*-aix[4-9]*) + aix=4 + ;; +esac + if test "$aix" != no; then + AIX_TRUE= + AIX_FALSE='#' else - if test "x$with_berkeley_db_include" != xcheck; 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 "--with-berkeley-db-include was given but include test failed -See \`config.log' for more details." "$LINENO" 5; } - fi - + AIX_TRUE='#' + AIX_FALSE= +fi + if test "$aix" = 4; then + AIX4_TRUE= + AIX4_FALSE='#' +else + AIX4_TRUE='#' + AIX4_FALSE= fi -done +# Check whether --enable-dynamic-afs was given. +if test ${enable_dynamic_afs+y} +then : + enableval=$enable_dynamic_afs; +fi -else - for ac_header in \ - db5/db.h \ - db4/db.h \ - db3/db.h \ - db.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +if test "$aix" != no; then -fi -done +printf "%s\n" "#define NEED_QSORT 1" >>confdefs.h -fi + if test "$enable_dynamic_afs" != no; then + if test "$ac_cv_func_dlopen" = no; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for db_create" >&5 -$as_echo_n "checking for db_create... " >&6; } -if test "${ac_cv_funclib_db_create+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for loadquery" >&5 +printf %s "checking for loadquery... " >&6; } +if test ${ac_cv_funclib_loadquery+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_db_create\" != yes" ; then +if eval "test \"\$ac_cv_func_loadquery\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" $dbheader db5 db4 db3 db; do + for ac_lib in "" ld; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -14437,2510 +15362,2554 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include - #ifdef HAVE_DBHEADER - #include <$dbheader/db.h> - #elif HAVE_DB5_DB_H - #include - #elif HAVE_DB4_DB_H - #include - #elif defined(HAVE_DB3_DB_H) - #include - #else - #include - #endif - int -main () +main (void) { -db_create(NULL, NULL, 0) +loadquery() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_db_create=$ac_lib; else ac_cv_funclib_db_create=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_loadquery=$ac_lib; else ac_cv_funclib_loadquery=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_db_create=\${ac_cv_funclib_db_create-no}" + eval "ac_cv_funclib_loadquery=\${ac_cv_funclib_loadquery-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_db_create" +eval "ac_res=\$ac_cv_funclib_loadquery" + +if false; then + ac_fn_c_check_func "$LINENO" "loadquery" "ac_cv_func_loadquery" +if test "x$ac_cv_func_loadquery" = xyes +then : + printf "%s\n" "#define HAVE_LOADQUERY 1" >>confdefs.h + +fi + +fi +# loadquery +eval "ac_tr_func=HAVE_`echo loadquery | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_loadquery=$ac_res" + +case "$ac_res" in + yes) + eval "ac_cv_func_loadquery=yes" + eval "LIB_loadquery=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_loadquery=no" + eval "LIB_loadquery=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_loadquery=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + + fi + if test "$ac_cv_func_dlopen" != no; then + AIX_EXTRA_KAFS='$(LIB_dlopen)' + elif test "$ac_cv_func_loadquery" != no; then + AIX_EXTRA_KAFS='$(LIB_loadquery)' + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not using dynloaded AFS library" >&5 +printf "%s\n" "$as_me: not using dynloaded AFS library" >&6;} + AIX_EXTRA_KAFS= + enable_dynamic_afs=no + fi + else + AIX_EXTRA_KAFS= + fi +fi + + if test "$enable_dynamic_afs" != no; then + AIX_DYNAMIC_AFS_TRUE= + AIX_DYNAMIC_AFS_FALSE='#' +else + AIX_DYNAMIC_AFS_TRUE='#' + AIX_DYNAMIC_AFS_FALSE= +fi + +if test "$aix" != no; then + +printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h + +fi + + -if false; then - for ac_func in db_create -do : - ac_fn_c_check_func "$LINENO" "db_create" "ac_cv_func_db_create" -if test "x$ac_cv_func_db_create" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DB_CREATE 1 -_ACEOF -fi -done +irix=no +case "$host" in +*-*-irix*) + irix=yes + ;; +esac + if test "$irix" != no; then + IRIX_TRUE= + IRIX_FALSE='#' +else + IRIX_TRUE='#' + IRIX_FALSE= fi -# db_create -eval "ac_tr_func=HAVE_`echo db_create | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_db_create=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_db_create=yes" - eval "LIB_db_create=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_db_create=no" - eval "LIB_db_create=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + +sunos=no +case "$host" in +*-*-solaris2.7) + sunos=57 ;; - *) - eval "ac_cv_func_db_create=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +*-*-solaris2.1[1-9]) - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h + + +printf "%s\n" "#define _STDC_C11_BCI 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + sunos=511 + ;; +*-*-solaris2.[89] | *-*-solaris2.10) + sunos=58 + ;; +*-*-solaris2*) + sunos=50 ;; esac +if test "$sunos" != no; then +printf "%s\n" "#define SunOS $sunos" >>confdefs.h +fi - if test "$ac_cv_func_db_create" = "yes"; then - db_type=db3 - if test "$ac_cv_funclib_db_create" != "yes"; then - DBLIB="$ac_cv_funclib_db_create" - else - DBLIB="" - fi -$as_echo "#define HAVE_DB3 1" >>confdefs.h - fi +printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbopen" >&5 -$as_echo_n "checking for dbopen... " >&6; } -if test "${ac_cv_funclib_dbopen+set}" = set; then : - $as_echo_n "(cached) " >&6 +if ! test -f "$srcdir/lib/asn1/der-protos.h" || + ! test -f "$srcdir/lib/asn1/der-private.h"; then + for ac_prog in perl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_PERL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$PERL"; then + ac_cv_prog_PERL="$PERL" # Let the user override the test. else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_PERL="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -if eval "test \"\$ac_cv_func_dbopen\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" db2 db; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include - #if defined(HAVE_DB2_DB_H) - #include - #elif defined(HAVE_DB_H) - #include - #else - #error no db.h - #endif - -int -main () -{ -dbopen(NULL, 0, 0, 0, NULL) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbopen=$ac_lib; else ac_cv_funclib_dbopen=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_dbopen=\${ac_cv_funclib_dbopen-no}" - LIBS="$ac_save_LIBS" fi - +PERL=$ac_cv_prog_PERL +if test -n "$PERL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +printf "%s\n" "$PERL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -eval "ac_res=\$ac_cv_funclib_dbopen" - -if false; then - for ac_func in dbopen -do : - ac_fn_c_check_func "$LINENO" "dbopen" "ac_cv_func_dbopen" -if test "x$ac_cv_func_dbopen" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DBOPEN 1 -_ACEOF + test -n "$PERL" && break +done +test -n "$PERL" || PERL="perl" +if test "$PERL" = ""; then + as_fn_error $? "perl not found - Cannot build Heimdal without perl" "$LINENO" 5 fi -done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Perl5 module Getopt::Std" >&5 +printf %s "checking for Perl5 module Getopt::Std... " >&6; } +if ! $PERL -MGetopt::Std -e 'exit(0);' >/dev/null 2>&1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "perl module Getopt::Std not found - Cannot build Heimdal without perl module Getopt::Std" "$LINENO" 5 +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi -# dbopen -eval "ac_tr_func=HAVE_`echo dbopen | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dbopen=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_dbopen=yes" - eval "LIB_dbopen=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_dbopen=no" - eval "LIB_dbopen=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_dbopen=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Perl5 module File::Compare" >&5 +printf %s "checking for Perl5 module File::Compare... " >&6; } +if ! $PERL -MFile::Compare -e 'exit(0);' >/dev/null 2>&1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "perl module File::Compare not found - Cannot build Heimdal without perl module File::Compare" "$LINENO" 5 +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Perl5 module JSON" >&5 +printf %s "checking for Perl5 module JSON... " >&6; } +if ! $PERL -MJSON -e 'exit(0);' >/dev/null 2>&1; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + as_fn_error $? "perl module JSON not found - Cannot build Heimdal without perl module JSON" "$LINENO" 5 +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi + +fi +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_YACC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_YACC="$ac_prog" + printf "%s\n" "$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 +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 +printf "%s\n" "$YACC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - if test "$ac_cv_func_dbopen" = "yes"; then - db_type=db1 - if test "$ac_cv_funclib_dbopen" != "yes"; then - DBLIB="$ac_cv_funclib_dbopen" - else - DBLIB="" - fi -$as_echo "#define HAVE_DB1 1" >>confdefs.h + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LEX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_LEX="$ac_prog" + printf "%s\n" "$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 +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5 +printf "%s\n" "$LEX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi - if test "$ac_cv_func_dbm_firstkey" != yes; then + test -n "$LEX" && break +done +test -n "$LEX" || LEX=":" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbm_firstkey" >&5 -$as_echo_n "checking for dbm_firstkey... " >&6; } -if test "${ac_cv_funclib_dbm_firstkey+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + if test "x$LEX" != "x:"; then + cat >conftest.l <<_ACEOF +%{ +#ifdef __cplusplus +extern "C" +#endif +int yywrap(void); +%} +%% +a { ECHO; } +b { REJECT; } +c { yymore (); } +d { yyless (1); } +e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */ +#ifdef __cplusplus + yyless ((yyinput () != 0)); +#else + yyless ((input () != 0)); +#endif + } +f { unput (yytext[0]); } +. { BEGIN INITIAL; } +%% +#ifdef YYTEXT_POINTER +extern char *yytext; +#endif +int +yywrap (void) +{ + return 1; +} +int +main (void) +{ + return ! yylex (); +} +_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex output file root" >&5 +printf %s "checking for lex output file root... " >&6; } +if test ${ac_cv_prog_lex_root+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +ac_cv_prog_lex_root=unknown +{ { ac_try="$LEX conftest.l" +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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$LEX conftest.l") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && +if test -f lex.yy.c; then + ac_cv_prog_lex_root=lex.yy +elif test -f lexyy.c; then + ac_cv_prog_lex_root=lexyy +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5 +printf "%s\n" "$ac_cv_prog_lex_root" >&6; } +if test "$ac_cv_prog_lex_root" = unknown +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot find output from $LEX; giving up on $LEX" >&5 +printf "%s\n" "$as_me: WARNING: cannot find output from $LEX; giving up on $LEX" >&2;} + LEX=: LEXLIB= +fi +LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root + +if test ${LEXLIB+y} +then : + +else $as_nop + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex library" >&5 +printf %s "checking for lex library... " >&6; } +if test ${ac_cv_lib_lex+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + ac_save_LIBS="$LIBS" + ac_found=false + for ac_cv_lib_lex in 'none needed' -lfl -ll 'not found'; do + case $ac_cv_lib_lex in #( + 'none needed') : + ;; #( + 'not found') : + break ;; #( + *) : + LIBS="$ac_cv_lib_lex $ac_save_LIBS" ;; #( + *) : + ;; +esac -if eval "test \"\$ac_cv_func_dbm_firstkey\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in $ac_cv_funclib_dbopen $ac_cv_funclib_db_create; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_found=: +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if $ac_found; then + break + fi + done + LIBS="$ac_save_LIBS" + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5 +printf "%s\n" "$ac_cv_lib_lex" >&6; } + if test "$ac_cv_lib_lex" = 'not found' +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required lex library not found; giving up on $LEX" >&5 +printf "%s\n" "$as_me: WARNING: required lex library not found; giving up on $LEX" >&2;} + LEX=: LEXLIB= +elif test "$ac_cv_lib_lex" = 'none needed' +then : + LEXLIB='' +else $as_nop + LEXLIB=$ac_cv_lib_lex +fi + ac_save_LIBS="$LIBS" + LIBS= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing yywrap" >&5 +printf %s "checking for library containing yywrap... " >&6; } +if test ${ac_cv_search_yywrap+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include - #define DB_DBM_HSEARCH 1 - #include - DBM *dbm; - +/* 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. */ +char yywrap (); int -main () +main (void) { -dbm_firstkey(NULL) +return yywrap (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbm_firstkey=$ac_lib; else ac_cv_funclib_dbm_firstkey=yes; fi";break +for ac_lib in '' fl l +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_yywrap=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext + if test ${ac_cv_search_yywrap+y} +then : + break fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_dbm_firstkey=\${ac_cv_funclib_dbm_firstkey-no}" - LIBS="$ac_save_LIBS" +done +if test ${ac_cv_search_yywrap+y} +then : + +else $as_nop + ac_cv_search_yywrap=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_yywrap" >&5 +printf "%s\n" "$ac_cv_search_yywrap" >&6; } +ac_res=$ac_cv_search_yywrap +if test "$ac_res" != no +then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + LEXLIB="$LIBS" fi + LIBS="$ac_save_LIBS" fi -eval "ac_res=\$ac_cv_funclib_dbm_firstkey" +if test "$LEX" != : +then : -if false; then - for ac_func in dbm_firstkey -do : - ac_fn_c_check_func "$LINENO" "dbm_firstkey" "ac_cv_func_dbm_firstkey" -if test "x$ac_cv_func_dbm_firstkey" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DBM_FIRSTKEY 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5 +printf %s "checking whether yytext is a pointer... " >&6; } +if test ${ac_cv_prog_lex_yytext_pointer+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # POSIX says lex can declare yytext either as a pointer or an array; the +# default is implementation-dependent. Figure out which it is, since +# not all implementations provide the %pointer and %array declarations. +ac_cv_prog_lex_yytext_pointer=no +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #define YYTEXT_POINTER 1 +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_lex_yytext_pointer=yes fi -done +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -# dbm_firstkey -eval "ac_tr_func=HAVE_`echo dbm_firstkey | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dbm_firstkey=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_dbm_firstkey=yes" - eval "LIB_dbm_firstkey=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_dbm_firstkey=no" - eval "LIB_dbm_firstkey=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_dbm_firstkey=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5 +printf "%s\n" "$ac_cv_prog_lex_yytext_pointer" >&6; } +if test $ac_cv_prog_lex_yytext_pointer = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +printf "%s\n" "#define YYTEXT_POINTER 1" >>confdefs.h +fi +fi +rm -f conftest.l $LEX_OUTPUT_ROOT.c - if test "$ac_cv_func_dbm_firstkey" = "yes"; then - if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then - LIB_NDBM="$ac_cv_funclib_dbm_firstkey" - else - LIB_NDBM="" - fi +fi +if test "$LEX" = :; then + LEX=${am_missing_run}flex +fi +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -$as_echo "#define HAVE_DB_NDBM 1" >>confdefs.h +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi -$as_echo "#define HAVE_NEW_DB 1" >>confdefs.h + test -n "$AWK" && break +done - else - $as_unset ac_cv_func_dbm_firstkey - $as_unset ac_cv_funclib_dbm_firstkey - fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ln -s or something else" >&5 +printf %s "checking for ln -s or something else... " >&6; } +if test ${ac_cv_prog_LN_S+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -f conftestdata +if ln -s X conftestdata 2>/dev/null +then + rm -f conftestdata + ac_cv_prog_LN_S="ln -s" +else + touch conftestdata1 + if ln conftestdata1 conftestdata2; then + rm -f conftestdata* + ac_cv_prog_LN_S=ln + else + ac_cv_prog_LN_S=cp fi +fi +fi +LN_S="$ac_cv_prog_LN_S" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_LN_S" >&5 +printf "%s\n" "$ac_cv_prog_LN_S" >&6; } -fi # fi berkeley db - -if test "$enable_ndbm_db" != "no"; then - - if test "$db_type" = "unknown" -o "$ac_cv_func_dbm_firstkey" = ""; then - - for ac_header in \ - dbm.h \ - ndbm.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +# Check whether --with-mips_abi was given. +if test ${with_mips_abi+y} +then : + withval=$with_mips_abi; fi -done - - +case "$host_os" in +irix*) +with_mips_abi="${with_mips_abi:-yes}" +if test -n "$GCC"; then +# GCC < 2.8 only supports the O32 ABI. GCC >= 2.8 has a flag to select +# which ABI to use, but only supports (as of 2.8.1) the N32 and 64 ABIs. +# +# Default to N32, but if GCC doesn't grok -mabi=n32, we assume an old +# GCC and revert back to O32. The same goes if O32 is asked for - old +# GCCs doesn't like the -mabi option, and new GCCs can't output O32. +# +# Don't you just love *all* the different SGI ABIs? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbm_firstkey" >&5 -$as_echo_n "checking for dbm_firstkey... " >&6; } -if test "${ac_cv_funclib_dbm_firstkey+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +case "${with_mips_abi}" in + 32|o32) abi='-mabi=32'; abilibdirext='' ;; + n32|yes) abi='-mabi=n32'; abilibdirext='32' ;; + 64) abi='-mabi=64'; abilibdirext='64' ;; + no) abi=''; abilibdirext='';; + *) as_fn_error $? "\"Invalid ABI specified\"" "$LINENO" 5 ;; +esac +if test -n "$abi" ; then +ac_foo=krb_cv_gcc_`echo $abi | tr =- __` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC supports the $abi option" >&5 +printf %s "checking if $CC supports the $abi option... " >&6; } +if eval test \${$ac_foo+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_dbm_firstkey\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" ndbm; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $abi" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include - #if defined(HAVE_NDBM_H) - #include - #elif defined(HAVE_DBM_H) - #include - #endif - DBM *dbm; - int -main () +main (void) { -dbm_firstkey(NULL) +int x; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbm_firstkey=$ac_lib; else ac_cv_funclib_dbm_firstkey=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_dbm_firstkey=\${ac_cv_funclib_dbm_firstkey-no}" - LIBS="$ac_save_LIBS" -fi - -fi - - -eval "ac_res=\$ac_cv_funclib_dbm_firstkey" - -if false; then - for ac_func in dbm_firstkey -do : - ac_fn_c_check_func "$LINENO" "dbm_firstkey" "ac_cv_func_dbm_firstkey" -if test "x$ac_cv_func_dbm_firstkey" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DBM_FIRSTKEY 1 -_ACEOF - +if ac_fn_c_try_compile "$LINENO" +then : + eval $ac_foo=yes +else $as_nop + eval $ac_foo=no fi -done +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_extCFLAGS="$save_CFLAGS" fi -# dbm_firstkey -eval "ac_tr_func=HAVE_`echo dbm_firstkey | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dbm_firstkey=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_dbm_firstkey=yes" - eval "LIB_dbm_firstkey=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_dbm_firstkey=no" - eval "LIB_dbm_firstkey=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_dbm_firstkey=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +ac_res=`eval echo \\\$$ac_foo` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if test $ac_res = no; then +# Try to figure out why that failed... +case $abi in + -mabi=32) + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -mabi=n32" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 +int +main (void) +{ +int x; + ; + return 0; +} _ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } +if ac_fn_c_try_compile "$LINENO" +then : + ac_res=yes +else $as_nop + ac_res=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CLAGS="$save_CFLAGS" + if test $ac_res = yes; then + # New GCC + as_fn_error $? "$CC does not support the $with_mips_abi ABI" "$LINENO" 5 + fi + # Old GCC + abi='' + abilibdirext='' + ;; + -mabi=n32|-mabi=64) + if test $with_mips_abi = yes; then + # Old GCC, default to O32 + abi='' + abilibdirext='' + else + # Some broken GCC + as_fn_error $? "$CC does not support the $with_mips_abi ABI" "$LINENO" 5 + fi ;; esac +fi #if test $ac_res = no; then +fi #if test -n "$abi" ; then +else +case "${with_mips_abi}" in + 32|o32) abi='-32'; abilibdirext='' ;; + n32|yes) abi='-n32'; abilibdirext='32' ;; + 64) abi='-64'; abilibdirext='64' ;; + no) abi=''; abilibdirext='';; + *) as_fn_error $? "\"Invalid ABI specified\"" "$LINENO" 5 ;; +esac +fi #if test -n "$GCC"; then +;; +esac +CC="$CC $abi" +libdir="$libdir$abilibdirext" - if test "$ac_cv_func_dbm_firstkey" = "yes"; then - if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then - LIB_NDBM="$ac_cv_funclib_dbm_firstkey" - else - LIB_NDBM="" - fi - -$as_echo "#define HAVE_NDBM 1" >>confdefs.h - have_ndbm=yes - if test "$db_type" = "unknown"; then - db_type=ndbm - DBLIB="$LIB_NDBM" - fi - else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __attribute__" >&5 +printf %s "checking for __attribute__... " >&6; } +if test ${ac_cv___attribute__+y} +then : + printf %s "(cached) " >&6 +else $as_nop - $as_unset ac_cv_func_dbm_firstkey - $as_unset ac_cv_funclib_dbm_firstkey +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +static void foo(void) __attribute__ ((noreturn)); - for ac_header in \ - gdbm/ndbm.h \ +static void +foo(void) +{ + exit(1); +} -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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF - +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv___attribute__=yes +else $as_nop + ac_cv___attribute__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -done - +if test "$ac_cv___attribute__" = "yes"; then +printf "%s\n" "#define HAVE___ATTRIBUTE__ 1" >>confdefs.h +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv___attribute__" >&5 +printf "%s\n" "$ac_cv___attribute__" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbm_firstkey" >&5 -$as_echo_n "checking for dbm_firstkey... " >&6; } -if test "${ac_cv_funclib_dbm_firstkey+set}" = set; then : - $as_echo_n "(cached) " >&6 + if test "$enable_shared" = "yes"; then + ENABLE_SHARED_TRUE= + ENABLE_SHARED_FALSE='#' else - -if eval "test \"\$ac_cv_func_dbm_firstkey\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" gdbm; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include - #include - DBM *dbm; - -int -main () -{ -dbm_firstkey(NULL) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbm_firstkey=$ac_lib; else ac_cv_funclib_dbm_firstkey=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_dbm_firstkey=\${ac_cv_funclib_dbm_firstkey-no}" - LIBS="$ac_save_LIBS" + ENABLE_SHARED_TRUE='#' + ENABLE_SHARED_FALSE= fi -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld --version-script" >&5 +printf %s "checking for ld --version-script... " >&6; } +if test ${rk_cv_version_script+y} +then : + printf %s "(cached) " >&6 +else $as_nop -eval "ac_res=\$ac_cv_funclib_dbm_firstkey" + rk_cv_version_script=no -if false; then - for ac_func in dbm_firstkey -do : - ac_fn_c_check_func "$LINENO" "dbm_firstkey" "ac_cv_func_dbm_firstkey" -if test "x$ac_cv_func_dbm_firstkey" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DBM_FIRSTKEY 1 -_ACEOF + cat > conftest.map < conftest.c <&5 + (eval $ac_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } && + { ac_try='${CC-cc} -shared -Wl,--version-script,conftest.map $CFLAGS $LDFLAGS -o libconftestlib.so conftest.o' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; + then + rk_cv_version_script=yes + fi +rm -rf conftest* libconftest* .libs fi -done +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $rk_cv_version_script" >&5 +printf "%s\n" "$rk_cv_version_script" >&6; } +if test $rk_cv_version_script = yes ; then + doversioning=yes + LDFLAGS_VERSION_SCRIPT="-Wl,--version-script," +else + doversioning=no + LDFLAGS_VERSION_SCRIPT= fi -# dbm_firstkey -eval "ac_tr_func=HAVE_`echo dbm_firstkey | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dbm_firstkey=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_dbm_firstkey=yes" - eval "LIB_dbm_firstkey=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_dbm_firstkey=no" - eval "LIB_dbm_firstkey=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_dbm_firstkey=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + if test $doversioning = yes; then + versionscript_TRUE= + versionscript_FALSE='#' +else + versionscript_TRUE='#' + versionscript_FALSE= +fi - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac - if test "$ac_cv_func_dbm_firstkey" = "yes"; then - if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then - LIB_NDBM="$ac_cv_funclib_dbm_firstkey" - else - LIB_NDBM="" - fi -$as_echo "#define HAVE_NDBM 1" >>confdefs.h - have_ndbm=yes - if test "$db_type" = "unknown"; then - db_type=ndbm - DBLIB="$LIB_NDBM" - fi - fi - fi - fi #enable_ndbm_db -fi # unknown -if test "$have_ndbm" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ndbm is implemented with db" >&5 -$as_echo_n "checking if ndbm is implemented with db... " >&6; } - if test "$cross_compiling" = yes; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no-cross" >&5 -$as_echo "no-cross" >&6; } -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#if defined(HAVE_GDBM_NDBM_H) -#include -#elif defined(HAVE_NDBM_H) -#include -#elif defined(HAVE_DBM_H) -#include -#endif -int main(int argc, char **argv) -{ - DBM *d; + if test "${cross_compiling}" = yes; then + CROSS_COMPILE_TRUE= + CROSS_COMPILE_FALSE='#' +else + CROSS_COMPILE_TRUE='#' + CROSS_COMPILE_FALSE= +fi - d = dbm_open("conftest", O_RDWR | O_CREAT, 0666); - if (d == NULL) - return 1; - dbm_close(d); - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - if test -f conftest.db; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } -$as_echo "#define HAVE_NEW_DB 1" >>confdefs.h +# Check whether --with-cross-tools was given. +if test ${with_cross_tools+y} +then : + withval=$with_cross_tools; if test "$withval" = "yes"; then + as_fn_error $? "Need path to cross tools" "$LINENO" 5 + fi + with_cross_tools="${with_cross_tools}/" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext fi -fi - if test "$db_type" = db1; then - HAVE_DB1_TRUE= - HAVE_DB1_FALSE='#' -else - HAVE_DB1_TRUE='#' - HAVE_DB1_FALSE= -fi - if test "$db_type" = db3; then - HAVE_DB3_TRUE= - HAVE_DB3_FALSE='#' -else - HAVE_DB3_TRUE='#' - HAVE_DB3_FALSE= -fi - if test "$db_type" = ndbm; then - HAVE_NDBM_TRUE= - HAVE_NDBM_FALSE='#' -else - HAVE_NDBM_TRUE='#' - HAVE_NDBM_FALSE= -fi - if test "$dbheader" != ""; then - HAVE_DBHEADER_TRUE= - HAVE_DBHEADER_FALSE='#' +if test "${cross_compiling}" != yes ; then + + ASN1_COMPILE="\$(top_builddir)/lib/asn1/asn1_compile\$(EXEEXT)" + SLC="\$(top_builddir)/lib/sl/slc" + + ASN1_COMPILE_DEP="\$(ASN1_COMPILE)" + SLC_DEP="\$(SLC)" else - HAVE_DBHEADER_TRUE='#' - HAVE_DBHEADER_FALSE= + ASN1_COMPILE="${with_cross_tools}asn1_compile" + SLC="${with_cross_tools}slc" + + ASN1_COMPILE_DEP= + SLC_DEP= + + ac_cv_prog_COMPILE_ET=${with_cross_tools}compile_et + fi -## it's probably not correct to include LDFLAGS here, but we might -## need it, for now just add any possible -L -z="" -for i in $LDFLAGS; do - case "$i" in - -L*) z="$z $i";; - esac -done -DBLIB="$z $DBLIB" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if test "${ac_cv_c_inline+set}" = set; 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 +printf "%s\n" "#define HEIM_WEAK_CRYPTO 1" >>confdefs.h -{ $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 test "${ac_cv_c_const+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* 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. */ - char *t; - 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 saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - 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 +# Check whether --with-openldap was given. +if test ${with_openldap+y} +then : + withval=$with_openldap; 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 +# Check whether --with-openldap-lib was given. +if test ${with_openldap_lib+y} +then : + withval=$with_openldap_lib; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-openldap-lib" "$LINENO" 5 +elif test "X$with_openldap" = "X"; then + with_openldap=yes +fi fi -ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = x""yes; then : -else +# Check whether --with-openldap-include was given. +if test ${with_openldap_include+y} +then : + withval=$with_openldap_include; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-openldap-include" "$LINENO" 5 +elif test "X$with_openldap" = "X"; then + with_openldap=yes +fi +fi -cat >>confdefs.h <<_ACEOF -#define size_t unsigned int -_ACEOF +# Check whether --with-openldap-config was given. +if test ${with_openldap_config+y} +then : + withval=$with_openldap_config; 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" = x""yes; then : -else -cat >>confdefs.h <<_ACEOF -#define pid_t int -_ACEOF -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openldap" >&5 +printf %s "checking for openldap... " >&6; } -{ $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 test "${ac_cv_type_uid_t+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include +case "$with_openldap" in +yes|"") d='' ;; +no) d= ;; +*) d="$with_openldap" ;; +esac -_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 +header_dirs= +lib_dirs= +for i in $d; do + if test "$with_openldap_include" = ""; then + if test -d "$i/include/openldap"; then + header_dirs="$header_dirs $i/include/openldap" + fi + if test -d "$i/include"; then + header_dirs="$header_dirs $i/include" + fi + fi + if test "$with_openldap_lib" = ""; then + if test -d "$i/lib$abilibdirext"; then + lib_dirs="$lib_dirs $i/lib$abilibdirext" + fi + fi +done + +if test "$with_openldap_include"; then + header_dirs="$with_openldap_include $header_dirs" +fi +if test "$with_openldap_lib"; then + lib_dirs="$with_openldap_lib $lib_dirs" fi -rm -f conftest* +if test "$with_openldap_config" = ""; then + with_openldap_config='' 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 +openldap_cflags= +openldap_libs= +case "$with_openldap_config" in +yes|no|""|"") + if test -f $with_openldap/bin/ ; then + with_openldap_config=$with_openldap/bin/ + fi + ;; +esac -$as_echo "#define gid_t int" >>confdefs.h +case "$with_openldap_config" in +yes|no|"") + ;; +*) + openldap_cflags="`$with_openldap_config --cflags 2>&1`" + openldap_libs="`$with_openldap_config --libs 2>&1`" + ;; +esac -fi +found=no +if test "$with_openldap" != no; then + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test "$openldap_cflags" -a "$openldap_libs"; then + CFLAGS="$openldap_cflags $save_CFLAGS" + LIBS="$openldap_libs $save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main (void) +{ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 -$as_echo_n "checking return type of signal handlers... " >&6; } -if test "${ac_cv_type_signal+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + INCLUDE_openldap="$openldap_cflags" + LIB_openldap="$openldap_libs" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: from $with_openldap_config" >&5 +printf "%s\n" "from $with_openldap_config" >&6; } + found=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + if test "$found" = no; then + ires= lres= + for i in $header_dirs; do + CFLAGS="-I$i $save_CFLAGS" + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include +#include +#include +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ires=$i;break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + for i in $lib_dirs; do + LIBS="-L$i -lldap -llber $save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include int -main () +main (void) { -return *(signal (0, 0)) (0) == 1; + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_signal=int +if ac_fn_c_try_link "$LINENO" +then : + lres=$i;break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + if test "$ires" -a "$lres" -a "$with_openldap" != "no"; then + INCLUDE_openldap="-I$ires" + LIB_openldap="-L$lres -lldap -llber " + found=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 +printf "%s\n" "headers $ires, libraries $lres" >&6; } + fi + fi + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" +fi + +if test "$found" = yes; then + +printf "%s\n" "#define OPENLDAP 1" >>confdefs.h + + with_openldap=yes else - ac_cv_type_signal=void + with_openldap=no + INCLUDE_openldap= + LIB_openldap= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + + + +# Check whether --enable-hdb-openldap-module was given. +if test ${enable_hdb_openldap_module+y} +then : + enableval=$enable_hdb_openldap_module; fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 -$as_echo "$ac_cv_type_signal" >&6; } -cat >>confdefs.h <<_ACEOF -#define RETSIGTYPE $ac_cv_type_signal -_ACEOF +if test "$enable_hdb_openldap_module" = yes -a "$with_openldap" = yes; then +printf "%s\n" "#define OPENLDAP_MODULE 1" >>confdefs.h -if test "$ac_cv_type_signal" = "void" ; then +fi + if test "$enable_hdb_openldap_module" = yes -a "$with_openldap" = yes; then + OPENLDAP_MODULE_TRUE= + OPENLDAP_MODULE_FALSE='#' +else + OPENLDAP_MODULE_TRUE='#' + OPENLDAP_MODULE_FALSE= +fi -$as_echo "#define VOID_RETSIGTYPE 1" >>confdefs.h -fi +# Check whether --enable-pk-init was given. +if test ${enable_pk_init+y} +then : + enableval=$enable_pk_init; +fi +if test "$enable_pk_init" != no ;then -{ $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 test "${ac_cv_header_time+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include +printf "%s\n" "#define PKINIT 1" >>confdefs.h -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 + if test "$enable_pk_init" != no; then + PKINIT_TRUE= + PKINIT_FALSE='#' +else + PKINIT_TRUE='#' + PKINIT_FALSE= 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 +# Check whether --enable-digest was given. +if test ${enable_digest+y} +then : + enableval=$enable_digest; fi +if test "$enable_digest" != no ;then -for ac_header in standards.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "standards.h" "ac_cv_header_standards_h" "$ac_includes_default" -if test "x$ac_cv_header_standards_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_STANDARDS_H 1 -_ACEOF +printf "%s\n" "#define DIGEST 1" >>confdefs.h fi -done +# Check whether --enable-kx509 was given. +if test ${enable_kx509+y} +then : + enableval=$enable_kx509; +fi -for i in netinet/ip.h netinet/tcp.h; do +if test "$enable_kx509" != no ;then -cv=`echo "$i" | sed 'y%./+-%__p_%'` +printf "%s\n" "#define KX509 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $i" >&5 -$as_echo_n "checking for $i... " >&6; } -if { as_var=ac_cv_header_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi -#ifdef HAVE_STANDARDS_H -#include -#endif -#include <$i> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - eval "ac_cv_header_$cv=yes" -else - eval "ac_cv_header_$cv=no" + +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 -rm -f conftest.err conftest.$ac_ext +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +printf "%s\n" "$PKG_CONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -eval ac_res=\$ac_cv_header_$cv - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -ac_res=`eval echo \\$ac_cv_header_$cv` -if test "$ac_res" = yes; then - ac_tr_hdr=HAVE_`echo $i | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi done -if false;then - for ac_header in netinet/ip.h netinet/tcp.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -done + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + PKG_CONFIG="" + fi +fi -for ac_func in getlogin setlogin -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +# Check whether --with-capng was given. +if test ${with_capng+y} +then : + withval=$with_capng; +else $as_nop + with_capng=check fi -done -if test "$ac_cv_func_getlogin" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if getlogin is posix" >&5 -$as_echo_n "checking if getlogin is posix... " >&6; } -if test "${ac_cv_func_getlogin_posix+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +if test "$with_capng" != "no"; then -if test "$ac_cv_func_getlogin" = yes -a "$ac_cv_func_setlogin" = yes; then - ac_cv_func_getlogin_posix=no +pkg_failed=no +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for CAPNG" >&5 +printf %s "checking for CAPNG... " >&6; } + +if test -n "$PKG_CONFIG"; then + if test -n "$CAPNG_CFLAGS"; then + pkg_cv_CAPNG_CFLAGS="$CAPNG_CFLAGS" + else + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcap-ng >= 0.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libcap-ng >= 0.4.0") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAPNG_CFLAGS=`$PKG_CONFIG --cflags "libcap-ng >= 0.4.0" 2>/dev/null` else - ac_cv_func_getlogin_posix=yes + pkg_failed=yes fi - + fi +else + pkg_failed=untried fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getlogin_posix" >&5 -$as_echo "$ac_cv_func_getlogin_posix" >&6; } -if test "$ac_cv_func_getlogin_posix" = yes; then - -$as_echo "#define POSIX_GETLOGIN 1" >>confdefs.h - +if test -n "$PKG_CONFIG"; then + if test -n "$CAPNG_LIBS"; then + pkg_cv_CAPNG_LIBS="$CAPNG_LIBS" + else + if test -n "$PKG_CONFIG" && \ + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcap-ng >= 0.4.0\""; } >&5 + ($PKG_CONFIG --exists --print-errors "libcap-ng >= 0.4.0") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_CAPNG_LIBS=`$PKG_CONFIG --libs "libcap-ng >= 0.4.0" 2>/dev/null` +else + pkg_failed=yes fi + fi +else + pkg_failed=untried fi +if test $pkg_failed = yes; then - for ac_header in $ac_header_list -do : - as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default -" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - +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 + CAPNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libcap-ng >= 0.4.0"` + else + CAPNG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libcap-ng >= 0.4.0"` + fi + # Put the nasty error message in config.log where it belongs + echo "$CAPNG_PKG_ERRORS" >&5 -done - + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + with_capng=no +elif test $pkg_failed = untried; then + with_capng=no +else + CAPNG_CFLAGS=$pkg_cv_CAPNG_CFLAGS + CAPNG_LIBS=$pkg_cv_CAPNG_LIBS + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + with_capng=yes +fi +fi +if test "$with_capng" = "yes"; then +printf "%s\n" "#define HAVE_CAPNG 1" >>confdefs.h +fi + if test "$with_capng" != "no"; then + HAVE_CAPNG_TRUE= + HAVE_CAPNG_FALSE='#' +else + HAVE_CAPNG_TRUE='#' + HAVE_CAPNG_FALSE= +fi -for ac_func in getpagesize -do : - ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" -if test "x$ac_cv_func_getpagesize" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETPAGESIZE 1 -_ACEOF +# Check whether --with-sqlite3 was given. +if test ${with_sqlite3+y} +then : + withval=$with_sqlite3; fi -done -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 -$as_echo_n "checking for working mmap... " >&6; } -if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_mmap_fixed_mapped=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -/* malloc might have been renamed as rpl_malloc. */ -#undef malloc -/* Thanks to Mike Haertel and Jim Avera for this test. - Here is a matrix of mmap possibilities: - mmap private not fixed - mmap private fixed at somewhere currently unmapped - mmap private fixed at somewhere already mapped - mmap shared not fixed - mmap shared fixed at somewhere currently unmapped - mmap shared fixed at somewhere already mapped - For private mappings, we should verify that changes cannot be read() - back from the file, nor mmap's back from the file at a different - address. (There have been systems where private was not correctly - implemented like the infamous i386 svr4.0, and systems where the - VM page cache was not coherent with the file system buffer cache - like early versions of FreeBSD and possibly contemporary NetBSD.) - For shared mappings, we should conversely verify that changes get - propagated back to all the places they're supposed to be. +# Check whether --with-sqlite3-lib was given. +if test ${with_sqlite3_lib+y} +then : + withval=$with_sqlite3_lib; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-sqlite3-lib" "$LINENO" 5 +elif test "X$with_sqlite3" = "X"; then + with_sqlite3=yes +fi +fi - Grep wants private fixed already mapped. - The main things grep needs to know about mmap are: - * does it exist and is it safe to write into the mmap'd area - * how to use it (BSD variants) */ -#include -#include +# Check whether --with-sqlite3-include was given. +if test ${with_sqlite3_include+y} +then : + withval=$with_sqlite3_include; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-sqlite3-include" "$LINENO" 5 +elif test "X$with_sqlite3" = "X"; then + with_sqlite3=yes +fi +fi -#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H -char *malloc (); -#endif -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ +# Check whether --with-sqlite3-config was given. +if test ${with_sqlite3_config+y} +then : + withval=$with_sqlite3_config; +fi -#endif /* no HAVE_GETPAGESIZE */ -int -main () -{ - char *data, *data2, *data3; - int i, pagesize; - int fd, fd2; - pagesize = getpagesize (); - /* First, make a file with some known garbage in it. */ - data = (char *) malloc (pagesize); - if (!data) - return 1; - for (i = 0; i < pagesize; ++i) - *(data + i) = rand (); - umask (0); - fd = creat ("conftest.mmap", 0600); - if (fd < 0) - return 2; - if (write (fd, data, pagesize) != pagesize) - return 3; - close (fd); +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sqlite3" >&5 +printf %s "checking for sqlite3... " >&6; } - /* Next, check that the tail of a page is zero-filled. File must have - non-zero length, otherwise we risk SIGBUS for entire page. */ - fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); - if (fd2 < 0) - return 4; - data2 = ""; - if (write (fd2, data2, 1) != 1) - return 5; - data2 = mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); - if (data2 == MAP_FAILED) - return 6; - for (i = 0; i < pagesize; ++i) - if (*(data2 + i)) - return 7; - close (fd2); - if (munmap (data2, pagesize)) - return 8; +case "$with_sqlite3" in +yes|"") d='' ;; +no) d= ;; +*) d="$with_sqlite3" ;; +esac - /* Next, try to mmap the file at a fixed address which already has - something else allocated at it. If we can, also make sure that - we see the same garbage. */ - fd = open ("conftest.mmap", O_RDWR); - if (fd < 0) - return 9; - if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) - return 10; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data2 + i)) - return 11; +header_dirs= +lib_dirs= +for i in $d; do + if test "$with_sqlite3_include" = ""; then + if test -d "$i/include/sqlite3"; then + header_dirs="$header_dirs $i/include/sqlite3" + fi + if test -d "$i/include"; then + header_dirs="$header_dirs $i/include" + fi + fi + if test "$with_sqlite3_lib" = ""; then + if test -d "$i/lib$abilibdirext"; then + lib_dirs="$lib_dirs $i/lib$abilibdirext" + fi + fi +done - /* Finally, make sure that changes to the mapped area do not - percolate back to the file as seen by read(). (This is a bug on - some variants of i386 svr4.0.) */ - for (i = 0; i < pagesize; ++i) - *(data2 + i) = *(data2 + i) + 1; - data3 = (char *) malloc (pagesize); - if (!data3) - return 12; - if (read (fd, data3, pagesize) != pagesize) - return 13; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data3 + i)) - return 14; - close (fd); - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_mmap_fixed_mapped=yes -else - ac_cv_func_mmap_fixed_mapped=no +if test "$with_sqlite3_include"; then + header_dirs="$with_sqlite3_include $header_dirs" fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +if test "$with_sqlite3_lib"; then + lib_dirs="$with_sqlite3_lib $lib_dirs" fi +if test "$with_sqlite3_config" = ""; then + with_sqlite3_config='' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 -$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } -if test $ac_cv_func_mmap_fixed_mapped = yes; then -$as_echo "#define HAVE_MMAP 1" >>confdefs.h +sqlite3_cflags= +sqlite3_libs= -fi -rm -f conftest.mmap conftest.txt +case "$with_sqlite3_config" in +yes|no|""|"") + if test -f $with_sqlite3/bin/ ; then + with_sqlite3_config=$with_sqlite3/bin/ + fi + ;; +esac +case "$with_sqlite3_config" in +yes|no|"") + ;; +*) + sqlite3_cflags="`$with_sqlite3_config --cflags 2>&1`" + sqlite3_libs="`$with_sqlite3_config --libs 2>&1`" + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if realloc if broken" >&5 -$as_echo_n "checking if realloc if broken... " >&6; } -if test "${ac_cv_func_realloc_broken+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +found=no +if test "$with_sqlite3" != no; then + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test "$sqlite3_cflags" -a "$sqlite3_libs"; then + CFLAGS="$sqlite3_cflags $save_CFLAGS" + LIBS="$sqlite3_libs $save_LIBS" -ac_cv_func_realloc_broken=no -if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#include - -int main(int argc, char **argv) +#include +#ifndef SQLITE_OPEN_CREATE +#error "old version" +#endif +int +main (void) { - return realloc(NULL, 17) == NULL; -} + ; + return 0; +} _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - : -else - ac_cv_func_realloc_broken=yes -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +if ac_fn_c_try_link "$LINENO" +then : + + INCLUDE_sqlite3="$sqlite3_cflags" + LIB_sqlite3="$sqlite3_libs" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: from $with_sqlite3_config" >&5 +printf "%s\n" "from $with_sqlite3_config" >&6; } + found=yes fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + if test "$found" = no; then + ires= lres= + for i in $header_dirs; do + CFLAGS="-I$i $save_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifndef SQLITE_OPEN_CREATE +#error "old version" +#endif +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ires=$i;break fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_broken" >&5 -$as_echo "$ac_cv_func_realloc_broken" >&6; } -if test "$ac_cv_func_realloc_broken" = yes ; then - -$as_echo "#define BROKEN_REALLOC 1" >>confdefs.h +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + for i in $lib_dirs; do + LIBS="-L$i -lsqlite3 $save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifndef SQLITE_OPEN_CREATE +#error "old version" +#endif +int +main (void) +{ + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lres=$i;break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + if test "$ires" -a "$lres" -a "$with_sqlite3" != "no"; then + INCLUDE_sqlite3="-I$ires" + LIB_sqlite3="-L$lres -lsqlite3 " + found=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 +printf "%s\n" "headers $ires, libraries $lres" >&6; } + fi + fi + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" fi +if test "$found" = yes; then +printf "%s\n" "#define SQLITE3 1" >>confdefs.h - - - -DIR_roken=roken -LIB_roken='$(top_builddir)/lib/roken/libroken.la' -INCLUDES_roken='-I$(top_builddir)/lib/roken -I$(top_srcdir)/lib/roken' + with_sqlite3=yes +else + with_sqlite3=no + INCLUDE_sqlite3= + LIB_sqlite3= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +if test "X$with_sqlite3" != Xyes ; then + INCLUDE_sqlite3="-I\$(top_srcdir)/lib/sqlite" + LIB_sqlite3="\$(top_builddir)/lib/sqlite/libheimsqlite.la" +fi + if test "X$with_sqlite3" = Xyes; then + SQLITE3_TRUE= + SQLITE3_FALSE='#' +else + SQLITE3_TRUE='#' + SQLITE3_FALSE= +fi +printf "%s\n" "#define HAVE_SQLITE3 1" >>confdefs.h -$as_echo "#define rk_PATH_DELIM '/'" >>confdefs.h +# Check whether --enable-sqlite-cache was given. +if test ${enable_sqlite_cache+y} +then : + enableval=$enable_sqlite_cache; +fi +if test "$enable_sqlite_cache" != no; then +printf "%s\n" "#define HAVE_SCC 1" >>confdefs.h +fi + if test "$enable_sqlite_cache" != no; then + have_scc_TRUE= + have_scc_FALSE='#' +else + have_scc_TRUE='#' + have_scc_FALSE= +fi -# Check whether --enable-developer was given. -if test "${enable_developer+set}" = set; then : - enableval=$enable_developer; +# Check whether --with-libintl was given. +if test ${with_libintl+y} +then : + withval=$with_libintl; fi -if test "X$enable_developer" = Xyes; then - dwflags="-Werror" -fi -WFLAGS_NOUNUSED="" -WFLAGS_NOIMPLICITINT="" -if test -z "$WFLAGS" -a "$GCC" = "yes"; then - # -Wno-implicit-int for broken X11 headers - # leave these out for now: - # -Wcast-align doesn't work well on alpha osf/1 - # -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast - # -Wmissing-declarations -Wnested-externs - # -Wstrict-overflow=5 - WFLAGS="-Wall -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast -Wmissing-declarations -Wnested-externs $dwflags" - WFLAGS_NOUNUSED="-Wno-unused" - WFLAGS_NOIMPLICITINT="-Wno-implicit-int" +# Check whether --with-libintl-lib was given. +if test ${with_libintl_lib+y} +then : + withval=$with_libintl_lib; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-libintl-lib" "$LINENO" 5 +elif test "X$with_libintl" = "X"; then + with_libintl=yes +fi fi +# Check whether --with-libintl-include was given. +if test ${with_libintl_include+y} +then : + withval=$with_libintl_include; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-libintl-include" "$LINENO" 5 +elif test "X$with_libintl" = "X"; then + with_libintl=yes +fi +fi +# Check whether --with-libintl-config was given. +if test ${with_libintl_config+y} +then : + withval=$with_libintl_config; +fi -cv=`echo "ssize_t" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 -$as_echo_n "checking for ssize_t... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -#if STDC_HEADERS -#include -#include -#endif -#include -int -main () -{ -ssize_t foo; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo ssize_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" -if test "x$ac_cv_type_ssize_t" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libintl" >&5 +printf %s "checking for libintl... " >&6; } -cat >>confdefs.h <<_ACEOF -#define HAVE_SSIZE_T 1 -_ACEOF +case "$with_libintl" in +yes|"") d='' ;; +no) d= ;; +*) d="$with_libintl" ;; +esac +header_dirs= +lib_dirs= +for i in $d; do + if test "$with_libintl_include" = ""; then + if test -d "$i/include/libintl"; then + header_dirs="$header_dirs $i/include/libintl" + fi + if test -d "$i/include"; then + header_dirs="$header_dirs $i/include" + fi + fi + if test "$with_libintl_lib" = ""; then + if test -d "$i/lib$abilibdirext"; then + lib_dirs="$lib_dirs $i/lib$abilibdirext" + fi + fi +done +if test "$with_libintl_include"; then + header_dirs="$with_libintl_include $header_dirs" fi - +if test "$with_libintl_lib"; then + lib_dirs="$with_libintl_lib $lib_dirs" fi -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF - +if test "$with_libintl_config" = ""; then + with_libintl_config='' fi +libintl_cflags= +libintl_libs= +case "$with_libintl_config" in +yes|no|""|"") + if test -f $with_libintl/bin/ ; then + with_libintl_config=$with_libintl/bin/ + fi + ;; +esac +case "$with_libintl_config" in +yes|no|"") + ;; +*) + libintl_cflags="`$with_libintl_config --cflags 2>&1`" + libintl_libs="`$with_libintl_config --libs 2>&1`" + ;; +esac +found=no +if test "$with_libintl" != no; then + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test "$libintl_cflags" -a "$libintl_libs"; then + CFLAGS="$libintl_cflags $save_CFLAGS" + LIBS="$libintl_libs $save_LIBS" -cv=`echo "long long" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 -$as_echo_n "checking for long long... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS -#include -#include -#endif - +#include int -main () +main (void) { -long long foo; + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo long long | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" -if test "x$ac_cv_type_long_long" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_LONG_LONG 1 -_ACEOF - - -fi - -fi - -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + INCLUDE_libintl="$libintl_cflags" + LIB_libintl="$libintl_libs" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: from $with_libintl_config" >&5 +printf "%s\n" "from $with_libintl_config" >&6; } + found=yes fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + if test "$found" = no; then + ires= lres= + for i in $header_dirs; do + CFLAGS="-I$i $save_CFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ - - - - - -for ac_header in \ - arpa/inet.h \ - config.h \ - crypt.h \ - dirent.h \ - errno.h \ - err.h \ - fcntl.h \ - fnmatch.h \ - grp.h \ - ifaddrs.h \ - netinet/in.h \ - netinet/in6.h \ - netinet/in_systm.h \ - netinet6/in6.h \ - paths.h \ - poll.h \ - pwd.h \ - rpcsvc/ypclnt.h \ - search.h \ - shadow.h \ - stdint.h \ - sys/bswap.h \ - sys/ioctl.h \ - sys/mman.h \ - sys/param.h \ - sys/resource.h \ - sys/sockio.h \ - sys/stat.h \ - sys/time.h \ - sys/tty.h \ - sys/types.h \ - sys/uio.h \ - sys/utsname.h \ - sys/wait.h \ - syslog.h \ - termios.h \ - winsock2.h \ - ws2tcpip.h \ - unistd.h \ - userconf.h \ - usersec.h \ - util.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + ; + return 0; +} _ACEOF - +if ac_fn_c_try_compile "$LINENO" +then : + ires=$i;break fi - -done - - - - -cv=`echo "uintptr_t" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uintptr_t" >&5 -$as_echo_n "checking for uintptr_t... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + for i in $lib_dirs; do + LIBS="-L$i -lintl $save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS -#include -#include -#endif -#ifdef HAVE_STDINT_H -#include -#endif +#include int -main () +main (void) { -uintptr_t foo; + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if ac_fn_c_try_link "$LINENO" +then : + lres=$i;break fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo uintptr_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" -if test "x$ac_cv_type_uintptr_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_UINTPTR_T 1 -_ACEOF - - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + if test "$ires" -a "$lres" -a "$with_libintl" != "no"; then + INCLUDE_libintl="-I$ires" + LIB_libintl="-L$lres -lintl " + found=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 +printf "%s\n" "headers $ires, libraries $lres" >&6; } + fi + fi + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" fi -fi +if test "$found" = yes; then -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF +printf "%s\n" "#define LIBINTL 1" >>confdefs.h + with_libintl=yes +else + with_libintl=no + INCLUDE_libintl= + LIB_libintl= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -for ac_header in vis.h -do : - ac_fn_c_check_header_compile "$LINENO" "vis.h" "ac_cv_header_vis_h" " -#include -#ifndef VIS_SP -#error invis -#endif -" -if test "x$ac_cv_header_vis_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VIS_H 1 -_ACEOF - -fi - -done -for ac_header in netdb.h -do : - ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default -#ifdef HAVE_SYS_TYPES_H -#include -#endif -" -if test "x$ac_cv_header_netdb_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NETDB_H 1 -_ACEOF +# Check whether --with-hdbdir was given. +if test ${with_hdbdir+y} +then : + withval=$with_hdbdir; +else $as_nop + with_hdbdir=/var/heimdal fi -done - +DIR_hdbdir="$with_hdbdir" -for ac_header in sys/socket.h -do : - ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default -#ifdef HAVE_SYS_TYPES_H -#include -#endif -" -if test "x$ac_cv_header_sys_socket_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_SOCKET_H 1 -_ACEOF + if true; then + KRB5_TRUE= + KRB5_FALSE='#' +else + KRB5_TRUE='#' + KRB5_FALSE= fi -done - - -for ac_header in net/if.h -do : - ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$ac_includes_default -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#if HAVE_SYS_SOCKET_H -#include -#endif -" -if test "x$ac_cv_header_net_if_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NET_IF_H 1 -_ACEOF - + if true; then + do_roken_rename_TRUE= + do_roken_rename_FALSE='#' +else + do_roken_rename_TRUE='#' + do_roken_rename_FALSE= fi -done -for ac_header in netinet6/in6_var.h -do : - ac_fn_c_check_header_compile "$LINENO" "netinet6/in6_var.h" "ac_cv_header_netinet6_in6_var_h" "$ac_includes_default -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#if HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET6_IN6_H -#include -#endif +printf "%s\n" "#define SUPPORT_INETD 1" >>confdefs.h -" -if test "x$ac_cv_header_netinet6_in6_var_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NETINET6_IN6_VAR_H 1 -_ACEOF -fi -done +printf "%s\n" "#define KRB5 1" >>confdefs.h -for ac_header in sys/sysctl.h -do : - ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "$ac_includes_default -#ifdef HAVE_SYS_PARAM_H -#include -#endif -" -if test "x$ac_cv_header_sys_sysctl_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_SYSCTL_H 1 -_ACEOF +# Check whether --with-hcrypto-default-backend was given. +if test ${with_hcrypto_default_backend+y} +then : + withval=$with_hcrypto_default_backend; + CFLAGS="${CFLAGS} -DHCRYPTO_DEF_PROVIDER=${withval}" + case "$withval" in + cc) +printf "%s\n" "#define HCRYPTO_DEF_PROVIDER cc" >>confdefs.h +;; + pkcs11_hcrypto) +printf "%s\n" "#define HCRYPTO_DEF_PROVIDER pkcs11_hcrypto" >>confdefs.h +;; + ossl) +printf "%s\n" "#define HCRYPTO_DEF_PROVIDER ossl" >>confdefs.h +;; + w32crypto) +printf "%s\n" "#define HCRYPTO_DEF_PROVIDER w32crypto" >>confdefs.h +;; + hcrypto) +printf "%s\n" "#define HCRYPTO_DEF_PROVIDER hcrypto" >>confdefs.h +;; + *) echo "Invalid hcrypto provider name ($withval)"; exit 5;; + esac fi -done +# Check whether --with-hcrypto-fallback was given. +if test ${with_hcrypto_fallback+y} +then : + withval=$with_hcrypto_fallback; +printf "%s\n" "#define HCRYPTO_FALLBACK 0" >>confdefs.h -for ac_header in sys/proc.h -do : - ac_fn_c_check_header_compile "$LINENO" "sys/proc.h" "ac_cv_header_sys_proc_h" "$ac_includes_default -#ifdef HAVE_SYS_PARAM_H -#include -#endif +else $as_nop -" -if test "x$ac_cv_header_sys_proc_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_PROC_H 1 -_ACEOF +printf "%s\n" "#define HCRYPTO_FALLBACK 1" >>confdefs.h fi -done +# Check whether --with-openssl was given. +if test ${with_openssl+y} +then : + withval=$with_openssl; +fi - if test "$ac_cv_header_err_h" = yes; then - have_err_h_TRUE= - have_err_h_FALSE='#' -else - have_err_h_TRUE='#' - have_err_h_FALSE= -fi - if test "$ac_cv_header_ifaddrs_h" = yes; then - have_ifaddrs_h_TRUE= - have_ifaddrs_h_FALSE='#' -else - have_ifaddrs_h_TRUE='#' - have_ifaddrs_h_FALSE= +# Check whether --with-openssl-lib was given. +if test ${with_openssl_lib+y} +then : + withval=$with_openssl_lib; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-openssl-lib" "$LINENO" 5 +elif test "X$with_openssl" = "X"; then + with_openssl=yes fi - - if test "$ac_cv_header_search_h" = yes; then - have_search_h_TRUE= - have_search_h_FALSE='#' -else - have_search_h_TRUE='#' - have_search_h_FALSE= fi - if test "$ac_cv_header_vis_h" = yes; then - have_vis_h_TRUE= - have_vis_h_FALSE='#' -else - have_vis_h_TRUE='#' - have_vis_h_FALSE= -fi +# Check whether --with-openssl-include was given. +if test ${with_openssl_include+y} +then : + withval=$with_openssl_include; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-openssl-include" "$LINENO" 5 +elif test "X$with_openssl" = "X"; then + with_openssl=yes +fi +fi +case "$with_openssl" in +yes) ;; +no) ;; +"") ;; +*) if test "$with_openssl_include" = ""; then + with_openssl_include="$with_openssl/include" + fi + if test "$with_openssl_lib" = ""; then + with_openssl_lib="$with_openssl/lib$abilibdirext" + fi + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for crypto library" >&5 +printf %s "checking for crypto library... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket" >&5 -$as_echo_n "checking for socket... " >&6; } -if test "${ac_cv_funclib_socket+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +openssl=no -if eval "test \"\$ac_cv_func_socket\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" socket; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$with_openssl" = "yes"; then + with_openssl=/usr +fi +if test "$with_openssl" != "no"; then + saved_CFLAGS="${CFLAGS}" + saved_LDFLAGS="${LDFLAGS}" + INCLUDE_openssl_crypto= + LIB_openssl_crypto= + if test "$with_openssl_include" != ""; then + INCLUDE_openssl_crypto="-I${with_openssl_include}" + else + INCLUDE_openssl_crypto="-I${with_openssl}/include" + fi + if test "$with_openssl_lib" != ""; then + LIB_openssl_crypto="-L${with_openssl_lib}" + elif test "${with_openssl}" != "/usr" -a -d "${with_openssl}/lib"; then + LIB_openssl_crypto="-L${with_openssl}/lib" + fi + CFLAGS="-DHAVE_HCRYPTO_W_OPENSSL ${INCLUDE_openssl_crypto} ${CFLAGS}" + LDFLAGS="${LIB_openssl_crypto} ${LDFLAGS}" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_init in -lcrypto" >&5 +printf %s "checking for OPENSSL_init in -lcrypto... " >&6; } +if test ${ac_cv_lib_crypto_OPENSSL_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypto $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. */ +char OPENSSL_init (); int -main () +main (void) { -socket() +return OPENSSL_init (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_socket=$ac_lib; else ac_cv_funclib_socket=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_crypto_OPENSSL_init=yes +else $as_nop + ac_cv_lib_crypto_OPENSSL_init=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_socket=\${ac_cv_funclib_socket-no}" - LIBS="$ac_save_LIBS" -fi - -fi - - -eval "ac_res=\$ac_cv_funclib_socket" - -if false; then - for ac_func in socket -do : - ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" -if test "x$ac_cv_func_socket" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SOCKET 1 -_ACEOF - -fi -done - -fi -# socket -eval "ac_tr_func=HAVE_`echo socket | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_socket=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_socket=yes" - eval "LIB_socket=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_socket=no" - eval "LIB_socket=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_socket=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac - - -if test -n "$LIB_socket"; then - LIBS="$LIB_socket $LIBS" -fi - - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname" >&5 -$as_echo_n "checking for gethostbyname... " >&6; } -if test "${ac_cv_funclib_gethostbyname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -if eval "test \"\$ac_cv_func_gethostbyname\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" nsl; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_OPENSSL_init" >&5 +printf "%s\n" "$ac_cv_lib_crypto_OPENSSL_init" >&6; } +if test "x$ac_cv_lib_crypto_OPENSSL_init" = xyes +then : + LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto"; openssl=yes +else $as_nop + openssl=no +fi + + # These cases are just for static linking on older OSes, + # presumably. + if test "$openssl" = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_init in -lcrypto" >&5 +printf %s "checking for OPENSSL_init in -lcrypto... " >&6; } +if test ${ac_cv_lib_crypto_OPENSSL_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypto -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. */ +char OPENSSL_init (); int -main () +main (void) { -gethostbyname() +return OPENSSL_init (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_gethostbyname=$ac_lib; else ac_cv_funclib_gethostbyname=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_crypto_OPENSSL_init=yes +else $as_nop + ac_cv_lib_crypto_OPENSSL_init=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_gethostbyname=\${ac_cv_funclib_gethostbyname-no}" - LIBS="$ac_save_LIBS" +LIBS=$ac_check_lib_save_LIBS fi - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_OPENSSL_init" >&5 +printf "%s\n" "$ac_cv_lib_crypto_OPENSSL_init" >&6; } +if test "x$ac_cv_lib_crypto_OPENSSL_init" = xyes +then : + LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto -ldl"; openssl=yes +else $as_nop + openssl=no fi + fi + if test "$openssl" = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_init in -lcrypto" >&5 +printf %s "checking for OPENSSL_init in -lcrypto... " >&6; } +if test ${ac_cv_lib_crypto_OPENSSL_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypto -ldl -lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -eval "ac_res=\$ac_cv_funclib_gethostbyname" - -if false; then - for ac_func in gethostbyname -do : - ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETHOSTBYNAME 1 +/* 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. */ +char OPENSSL_init (); +int +main (void) +{ +return OPENSSL_init (); + ; + return 0; +} _ACEOF - +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_crypto_OPENSSL_init=yes +else $as_nop + ac_cv_lib_crypto_OPENSSL_init=no fi -done - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS fi -# gethostbyname -eval "ac_tr_func=HAVE_`echo gethostbyname | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_gethostbyname=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_gethostbyname=yes" - eval "LIB_gethostbyname=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_gethostbyname=no" - eval "LIB_gethostbyname=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_gethostbyname=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac - - -if test -n "$LIB_gethostbyname"; then - LIBS="$LIB_gethostbyname $LIBS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_OPENSSL_init" >&5 +printf "%s\n" "$ac_cv_lib_crypto_OPENSSL_init" >&6; } +if test "x$ac_cv_lib_crypto_OPENSSL_init" = xyes +then : + LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto -ldl -lnsl"; openssl=yes +else $as_nop + openssl=no fi - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for syslog" >&5 -$as_echo_n "checking for syslog... " >&6; } -if test "${ac_cv_funclib_syslog+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -if eval "test \"\$ac_cv_func_syslog\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" syslog; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + fi + if test "$openssl" = "no"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OPENSSL_init in -lcrypto" >&5 +printf %s "checking for OPENSSL_init in -lcrypto... " >&6; } +if test ${ac_cv_lib_crypto_OPENSSL_init+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcrypto -ldl -lnsl -lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char OPENSSL_init (); int -main () +main (void) { -syslog() +return OPENSSL_init (); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_syslog=$ac_lib; else ac_cv_funclib_syslog=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_crypto_OPENSSL_init=yes +else $as_nop + ac_cv_lib_crypto_OPENSSL_init=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_syslog=\${ac_cv_funclib_syslog-no}" - LIBS="$ac_save_LIBS" +LIBS=$ac_check_lib_save_LIBS fi - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_OPENSSL_init" >&5 +printf "%s\n" "$ac_cv_lib_crypto_OPENSSL_init" >&6; } +if test "x$ac_cv_lib_crypto_OPENSSL_init" = xyes +then : + LIB_openssl_crypto="${LIB_openssl_crypto} -lcrypto -ldl -lnsl -lsocket"; openssl=yes +else $as_nop + openssl=no fi + fi + if test "$openssl" = "no"; then + INCLUDE_openssl_crypto= + LIB_openssl_crypto= + fi + CFLAGS="${saved_CFLAGS}" + LDFLAGS="${saved_LDFLAGS}" +fi -eval "ac_res=\$ac_cv_funclib_syslog" +LIB_hcrypto='$(top_builddir)/lib/hcrypto/libhcrypto.la' +LIB_hcrypto_a='$(top_builddir)/lib/hcrypto/.libs/libhcrypto.a' +LIB_hcrypto_so='$(top_builddir)/lib/hcrypto/.libs/libhcrypto.so' +LIB_hcrypto_appl="-lhcrypto" -if false; then - for ac_func in syslog -do : - ac_fn_c_check_func "$LINENO" "syslog" "ac_cv_func_syslog" -if test "x$ac_cv_func_syslog" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYSLOG 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: included libhcrypto" >&5 +printf "%s\n" "included libhcrypto" >&6; } -fi -done +# Check whether --with-pkcs11-module was given. +if test ${with_pkcs11_module+y} +then : + withval=$with_pkcs11_module; pkcs11_module="$withval" fi -# syslog -eval "ac_tr_func=HAVE_`echo syslog | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_syslog=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_syslog=yes" - eval "LIB_syslog=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_syslog=no" - eval "LIB_syslog=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_syslog=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +if test "$pkcs11_module" != ""; then +printf "%s\n" "#define PKCS11_MODULE_PATH \"$pkcs11_module\"" >>confdefs.h -if test -n "$LIB_syslog"; then - LIBS="$LIB_syslog $LIBS" + openssl=no fi +if test "$openssl" = "yes"; then +printf "%s\n" "#define HAVE_HCRYPTO_W_OPENSSL 1" >>confdefs.h - -# Check whether --with-ipv6 was given. -if test "${with_ipv6+set}" = set; then : - withval=$with_ipv6; - ac_cv_lib_ipv6="$withval" - +fi + if test "$openssl" = yes; then + HAVE_HCRYPTO_W_OPENSSL_TRUE= + HAVE_HCRYPTO_W_OPENSSL_FALSE='#' +else + HAVE_HCRYPTO_W_OPENSSL_TRUE='#' + HAVE_HCRYPTO_W_OPENSSL_FALSE= fi -save_CFLAGS="${CFLAGS}" -if test "X$ac_cv_lib_ipv6" != "Xno"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6 stack type" >&5 -$as_echo_n "checking for IPv6 stack type... " >&6; } -if test "${rk_cv_v6type+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - v6type=unknown - v6lib=none - for i in v6d toshiba kame inria zeta linux; do - case $i in - v6d) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#ifdef __V6D__ -yes -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - v6type=$i; v6lib=v6; - v6libdir=/usr/local/v6/lib; - CFLAGS="-I/usr/local/v6/include $CFLAGS" -fi -rm -f conftest* - ;; - toshiba) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#ifdef _TOSHIBA_INET6 -yes -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - v6type=$i; v6lib=inet6; - v6libdir=/usr/local/v6/lib; - CFLAGS="-DINET6 $CFLAGS" -fi -rm -f conftest* - ;; - kame) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#ifdef __KAME__ -yes -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - v6type=$i; v6lib=inet6; - v6libdir=/usr/local/v6/lib; - CFLAGS="-DINET6 $CFLAGS" -fi -rm -f conftest* - ;; - inria) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiling threadsafe libraries" >&5 +printf %s "checking if compiling threadsafe libraries... " >&6; } -#include -#ifdef IPV6_INRIA_VERSION -yes -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - v6type=$i; CFLAGS="-DINET6 $CFLAGS" +# Check whether --enable-pthread-support was given. +if test ${enable_pthread_support+y} +then : + enableval=$enable_pthread_support; +else $as_nop + enable_pthread_support=maybe fi -rm -f conftest* - ;; - zeta) - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#ifdef _ZETA_MINAMI_INET6 -yes -#endif -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "yes" >/dev/null 2>&1; then : - v6type=$i; v6lib=inet6; - v6libdir=/usr/local/v6/lib; - CFLAGS="-DINET6 $CFLAGS" +case "$host" in +*-*-solaris2*) + native_pthread_support=yes + if test "$GCC" = yes; then + PTHREAD_CFLAGS="-D_REENTRANT -D_TS_ERRNO" + PTHREAD_LIBADD=-lpthread + else + PTHREAD_CFLAGS="-mt -D_REENTRANT -D_TS_ERRNO" + PTHREAD_LDADD=-mt + PTHREAD_LIBADD="-mt -lpthread" + fi + ;; +*-*-netbsd[12]*) + native_pthread_support="if running netbsd 1.6T or newer" + PTHREAD_LIBADD="-lpthread" + ;; +*-*-netbsd[3456789]*) + native_pthread_support="netbsd 3 uses explict pthread" + PTHREAD_LIBADD="-lpthread" + ;; +*-*-freebsd[1234]) + ;; +*-*-freebsd*) + native_pthread_support=yes + PTHREAD_LIBADD="-pthread" + ;; +*-*-openbsd*) + native_pthread_support=yes + PTHREAD_CFLAGS=-pthread + PTHREAD_LIBADD=-pthread + ;; +*-*-gnu*) + native_pthread_support=yes + PTHREADS_CFLAGS=-pthread + PTHREAD_LIBADD="-pthread -lpthread" + ;; +*-*-linux* | *-*-linux-gnu) + case `uname -r` in + 2.*|3.*) + native_pthread_support=yes + PTHREAD_CFLAGS=-pthread + PTHREAD_LIBADD=-pthread + ;; + esac + ;; +*-*-kfreebsd*-gnu*) + native_pthread_support=yes + PTHREAD_CFLAGS=-pthread + PTHREAD_LIBADD=-pthread + ;; +*-*-aix*) + native_pthread_support=no + ;; +mips-sgi-irix6.[5-9]) # maybe works for earlier versions too + native_pthread_support=yes + PTHREAD_LIBADD="-lpthread" + ;; +*-*-darwin*) + native_pthread_support=yes + ;; +*) + native_pthread_support=no + ;; +esac + +if test "$enable_pthread_support" = maybe ; then + enable_pthread_support="$native_pthread_support" fi -rm -f conftest* - ;; - linux) - if test -d /usr/inet6; then - v6type=$i - v6lib=inet6 - v6libdir=/usr/inet6 - CFLAGS="-DINET6 $CFLAGS" - fi - ;; - esac - if test "$v6type" != "unknown"; then - break - fi - done +if test "$enable_pthread_support" != no; then - if test "$v6lib" != "none"; then - for dir in $v6libdir /usr/local/v6/lib /usr/local/lib; do - if test -d $dir -a -f $dir/lib$v6lib.a; then - LIBS="-L$dir -l$v6lib $LIBS" - break - fi - done - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $rk_cv_v6type" >&5 -$as_echo "$rk_cv_v6type" >&6; } +printf "%s\n" "#define ENABLE_PTHREAD_SUPPORT 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IPv6" >&5 -$as_echo_n "checking for IPv6... " >&6; } -if test "${rk_cv_lib_ipv6+set}" = set; then : - $as_echo_n "(cached) " >&6 + LIBS="$PTHREAD_LIBADD $LIBS" else + PTHREAD_CFLAGS="" + PTHREAD_LIBADD="" +fi - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + if test "$enable_pthread_support" != no; then + ENABLE_PTHREAD_SUPPORT_TRUE= + ENABLE_PTHREAD_SUPPORT_FALSE='#' +else + ENABLE_PTHREAD_SUPPORT_TRUE='#' + ENABLE_PTHREAD_SUPPORT_FALSE= +fi -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -int -main () -{ +CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +LDADD="$LDADD $PTHREAD_LDADD" +LIBADD="$LIBADD $PTHREAD_LIBADD" - struct sockaddr_in6 sin6; - int s; - s = socket(AF_INET6, SOCK_DGRAM, 0); - sin6.sin6_family = AF_INET6; - sin6.sin6_port = htons(17); - sin6.sin6_addr = in6addr_any; - bind(s, (struct sockaddr *)&sin6, sizeof(sin6)); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ipv6=yes -else - ac_cv_lib_ipv6=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: $rk_cv_lib_ipv6" >&5 -$as_echo "$rk_cv_lib_ipv6" >&6; } -fi -if test "$ac_cv_lib_ipv6" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_pthread_support" >&5 +printf "%s\n" "$enable_pthread_support" >&6; } -$as_echo "#define HAVE_IPV6 1" >>confdefs.h -else - CFLAGS="${save_CFLAGS}" +# Check whether --enable-dce was given. +if test ${enable_dce+y} +then : + enableval=$enable_dce; fi -## test for AIX missing in6addr_loopback -if test "$ac_cv_lib_ipv6" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for in6addr_loopback" >&5 -$as_echo_n "checking for in6addr_loopback... " >&6; } -if test "${rk_cv_var_in6addr_loopback+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -int -main () -{ +if test "$enable_dce" = yes; then -struct sockaddr_in6 sin6; -sin6.sin6_addr = in6addr_loopback; +printf "%s\n" "#define DCE 1" >>confdefs.h - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_in6addr_loopback=yes -else - ac_cv_var_in6addr_loopback=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + if test "$enable_dce" = yes; then + DCE_TRUE= + DCE_FALSE='#' +else + DCE_TRUE='#' + DCE_FALSE= fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $rk_cv_var_in6addr_loopback" >&5 -$as_echo "$rk_cv_var_in6addr_loopback" >&6; } - if test "$ac_cv_var_in6addr_loopback" = yes; then -$as_echo "#define HAVE_IN6ADDR_LOOPBACK 1" >>confdefs.h - fi +## XXX quite horrible: +if test -f /etc/ibmcxx.cfg; then + dpagaix_ldadd=`sed -n '/^xlc_r4/,/^$/p' /etc/ibmcxx.cfg | sed -n -e '/libraries/{;s/^[^=]*=\(.*\)/\1/;s/,/ /gp;}'` + dpagaix_cflags=`sed -n '/^xlc_r4/,/^$/p' /etc/ibmcxx.cfg | sed -n -e '/options/{;s/^[^=]*=\(.*\)/\1/;s/-q^,*//;s/,/ /gp;}'` + dpagaix_ldflags= +else + dpagaix_cflags="-D_THREAD_SAFE -D_AIX_PTHREADS_D7 -D_AIX32_THREADS=1 -D_AES_SOURCE -D_AIX41 -I/usr/include/dce" + dpagaix_ldadd="-L/usr/lib/threads -ldcelibc_r -ldcepthreads -lpthreads_compat lpthreads -lc_r" + dpagaix_ldflags="-Wl,-bI:dfspag.exp" fi +# Check whether --enable-afs-support was given. +if test ${enable_afs_support+y} +then : + enableval=$enable_afs_support; +fi +if test "$enable_afs_support" = no; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname2" >&5 -$as_echo_n "checking for gethostbyname2... " >&6; } -if test "${ac_cv_funclib_gethostbyname2+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -if eval "test \"\$ac_cv_func_gethostbyname2\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" inet6 ip6; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define NO_AFS 1" >>confdefs.h -int -main () -{ -gethostbyname2() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_gethostbyname2=$ac_lib; else ac_cv_funclib_gethostbyname2=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_gethostbyname2=\${ac_cv_funclib_gethostbyname2-no}" - LIBS="$ac_save_LIBS" + NO_AFS="1" fi - + if test "$enable_afs_support" = no; then + NO_AFS_TRUE= + NO_AFS_FALSE='#' +else + NO_AFS_TRUE='#' + NO_AFS_FALSE= fi -eval "ac_res=\$ac_cv_funclib_gethostbyname2" -if false; then - for ac_func in gethostbyname2 -do : - ac_fn_c_check_func "$LINENO" "gethostbyname2" "ac_cv_func_gethostbyname2" -if test "x$ac_cv_func_gethostbyname2" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETHOSTBYNAME2 1 -_ACEOF +# Check whether --with-db-type-preference was given. +if test ${with_db_type_preference+y} +then : + withval=$with_db_type_preference; db_type_preference="$withval" +else $as_nop + db_type_preference="lmdb db3 db1 sqlite" fi -done + +# Check whether --with-berkeley-db was given. +if test ${with_berkeley_db+y} +then : + withval=$with_berkeley_db; +else $as_nop + with_berkeley_db=check fi -# gethostbyname2 -eval "ac_tr_func=HAVE_`echo gethostbyname2 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_gethostbyname2=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_gethostbyname2=yes" - eval "LIB_gethostbyname2=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_gethostbyname2=no" - eval "LIB_gethostbyname2=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_gethostbyname2=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +dbheader="" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +# Check whether --with-berkeley-db-include was given. +if test ${with_berkeley_db_include+y} +then : + withval=$with_berkeley_db_include; dbheader=$withval +else $as_nop + with_berkeley_db_include=check +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +# Check whether --enable-ndbm-db was given. +if test ${enable_ndbm_db+y} +then : + enableval=$enable_ndbm_db; -if test -n "$LIB_gethostbyname2"; then - LIBS="$LIB_gethostbyname2 $LIBS" fi +# Check whether --enable-mdb-db was given. +if test ${enable_mdb_db+y} +then : + enableval=$enable_mdb_db; +fi + + +have_db1=no +have_db3=no +have_lmdb=no +db_type=unknown -for ac_header in arpa/nameser.h dns.h +if test "x$with_berkeley_db" != xno +then : + if test "x$with_berkeley_db_include" != xcheck +then : + for ac_header in "$dbheader/db.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : + as_ac_Header=`printf "%s\n" "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 +#define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF + DBHEADER=$dbheader + + +printf "%s\n" "#define HAVE_DBHEADER 1" >>confdefs.h + + +else $as_nop + if test "x$with_berkeley_db_include" != xcheck; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "--with-berkeley-db-include was given but include test failed +See \`config.log' for more details" "$LINENO" 5; } + fi fi done +else $as_nop + ac_fn_c_check_header_compile "$LINENO" "db6/db.h" "ac_cv_header_db6_db_h" "$ac_includes_default" +if test "x$ac_cv_header_db6_db_h" = xyes +then : + printf "%s\n" "#define HAVE_DB6_DB_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "db5/db.h" "ac_cv_header_db5_db_h" "$ac_includes_default" +if test "x$ac_cv_header_db5_db_h" = xyes +then : + printf "%s\n" "#define HAVE_DB5_DB_H 1" >>confdefs.h -for ac_header in resolv.h -do : - ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "$ac_includes_default -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif +fi +ac_fn_c_check_header_compile "$LINENO" "db4/db.h" "ac_cv_header_db4_db_h" "$ac_includes_default" +if test "x$ac_cv_header_db4_db_h" = xyes +then : + printf "%s\n" "#define HAVE_DB4_DB_H 1" >>confdefs.h -" -if test "x$ac_cv_header_resolv_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_RESOLV_H 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "db3/db.h" "ac_cv_header_db3_db_h" "$ac_includes_default" +if test "x$ac_cv_header_db3_db_h" = xyes +then : + printf "%s\n" "#define HAVE_DB3_DB_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "db.h" "ac_cv_header_db_h" "$ac_includes_default" +if test "x$ac_cv_header_db_h" = xyes +then : + printf "%s\n" "#define HAVE_DB_H 1" >>confdefs.h -done +fi +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_search" >&5 -$as_echo_n "checking for res_search... " >&6; } -if test "${ac_cv_funclib_res_search+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for db_create" >&5 +printf %s "checking for db_create... " >&6; } +if test ${ac_cv_funclib_db_create+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_res_search\" != yes" ; then +if eval "test \"\$ac_cv_func_db_create\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" resolv; do + for ac_lib in "" $dbheader db-6 db-5 db4 db3 db; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -16952,113 +17921,113 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif -#ifdef HAVE_RESOLV_H -#include -#endif - + #include + #ifdef HAVE_DBHEADER + #include <$dbheader/db.h> + #elif HAVE_DB6_DB_H + #include + #elif HAVE_DB5_DB_H + #include + #elif HAVE_DB4_DB_H + #include + #elif defined(HAVE_DB3_DB_H) + #include + #else + #include + #endif + int -main () +main (void) { -res_search(0,0,0,0,0) +db_create(NULL, NULL, 0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_res_search=$ac_lib; else ac_cv_funclib_res_search=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_db_create=$ac_lib; else ac_cv_funclib_db_create=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_res_search=\${ac_cv_funclib_res_search-no}" + eval "ac_cv_funclib_db_create=\${ac_cv_funclib_db_create-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_res_search" +eval "ac_res=\$ac_cv_funclib_db_create" if false; then - for ac_func in res_search -do : - ac_fn_c_check_func "$LINENO" "res_search" "ac_cv_func_res_search" -if test "x$ac_cv_func_res_search" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_RES_SEARCH 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "db_create" "ac_cv_func_db_create" +if test "x$ac_cv_func_db_create" = xyes +then : + printf "%s\n" "#define HAVE_DB_CREATE 1" >>confdefs.h fi -done fi -# res_search -eval "ac_tr_func=HAVE_`echo res_search | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# db_create +eval "ac_tr_func=HAVE_`echo db_create | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_res_search=$ac_res" +eval "LIB_db_create=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_res_search=yes" - eval "LIB_res_search=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_db_create=yes" + eval "LIB_db_create=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_res_search=no" - eval "LIB_res_search=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_db_create=no" + eval "LIB_db_create=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_res_search=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_db_create=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test -n "$LIB_res_search"; then - LIBS="$LIB_res_search $LIBS" -fi + if test "$ac_cv_func_db_create" = "yes"; then + have_db3=yes + if test "$ac_cv_funclib_db_create" != "yes"; then + DB3LIB="$ac_cv_funclib_db_create" + else + DB3LIB="" + fi +printf "%s\n" "#define HAVE_DB3 1" >>confdefs.h + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_nsearch" >&5 -$as_echo_n "checking for res_nsearch... " >&6; } -if test "${ac_cv_funclib_res_nsearch+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_res_nsearch\" != yes" ; then + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dbopen" >&5 +printf %s "checking for dbopen... " >&6; } +if test ${ac_cv_funclib_dbopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_dbopen\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" resolv; do + for ac_lib in "" db2 db; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -17070,113 +18039,107 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif -#ifdef HAVE_RESOLV_H -#include -#endif + #include + #if defined(HAVE_DB2_DB_H) + #include + #elif defined(HAVE_DB_H) + #include + #else + #error no db.h + #endif int -main () +main (void) { -res_nsearch(0,0,0,0,0,0) +dbopen(NULL, 0, 0, 0, NULL) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_res_nsearch=$ac_lib; else ac_cv_funclib_res_nsearch=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbopen=$ac_lib; else ac_cv_funclib_dbopen=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_res_nsearch=\${ac_cv_funclib_res_nsearch-no}" + eval "ac_cv_funclib_dbopen=\${ac_cv_funclib_dbopen-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_res_nsearch" +eval "ac_res=\$ac_cv_funclib_dbopen" if false; then - for ac_func in res_nsearch -do : - ac_fn_c_check_func "$LINENO" "res_nsearch" "ac_cv_func_res_nsearch" -if test "x$ac_cv_func_res_nsearch" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_RES_NSEARCH 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "dbopen" "ac_cv_func_dbopen" +if test "x$ac_cv_func_dbopen" = xyes +then : + printf "%s\n" "#define HAVE_DBOPEN 1" >>confdefs.h fi -done fi -# res_nsearch -eval "ac_tr_func=HAVE_`echo res_nsearch | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# dbopen +eval "ac_tr_func=HAVE_`echo dbopen | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_res_nsearch=$ac_res" +eval "LIB_dbopen=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_res_nsearch=yes" - eval "LIB_res_nsearch=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbopen=yes" + eval "LIB_dbopen=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_res_nsearch=no" - eval "LIB_res_nsearch=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_dbopen=no" + eval "LIB_dbopen=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_res_nsearch=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbopen=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test -n "$LIB_res_nsearch"; then - LIBS="$LIB_res_nsearch $LIBS" -fi + if test "$ac_cv_func_dbopen" = "yes"; then + have_db1=yes + if test "$ac_cv_funclib_dbopen" != "yes"; then + DB1LIB="$ac_cv_funclib_dbopen" + else + DB1LIB="" + fi + +printf "%s\n" "#define HAVE_DB1 1" >>confdefs.h + fi + if test "$ac_cv_func_dbm_firstkey" != yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_ndestroy" >&5 -$as_echo_n "checking for res_ndestroy... " >&6; } -if test "${ac_cv_funclib_res_ndestroy+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dbm_firstkey" >&5 +printf %s "checking for dbm_firstkey... " >&6; } +if test ${ac_cv_funclib_dbm_firstkey+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_res_ndestroy\" != yes" ; then +if eval "test \"\$ac_cv_func_dbm_firstkey\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" resolv; do + for ac_lib in $ac_cv_funclib_dbopen $ac_cv_funclib_db_create; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -17188,112 +18151,209 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif -#ifdef HAVE_RESOLV_H -#include -#endif + #include + #define DB_DBM_HSEARCH 1 + #include + DBM *dbm; int -main () +main (void) { -res_ndestroy(0) +dbm_firstkey(NULL) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_res_ndestroy=$ac_lib; else ac_cv_funclib_res_ndestroy=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbm_firstkey=$ac_lib; else ac_cv_funclib_dbm_firstkey=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_res_ndestroy=\${ac_cv_funclib_res_ndestroy-no}" + eval "ac_cv_funclib_dbm_firstkey=\${ac_cv_funclib_dbm_firstkey-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_res_ndestroy" +eval "ac_res=\$ac_cv_funclib_dbm_firstkey" if false; then - for ac_func in res_ndestroy -do : - ac_fn_c_check_func "$LINENO" "res_ndestroy" "ac_cv_func_res_ndestroy" -if test "x$ac_cv_func_res_ndestroy" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_RES_NDESTROY 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "dbm_firstkey" "ac_cv_func_dbm_firstkey" +if test "x$ac_cv_func_dbm_firstkey" = xyes +then : + printf "%s\n" "#define HAVE_DBM_FIRSTKEY 1" >>confdefs.h fi -done fi -# res_ndestroy -eval "ac_tr_func=HAVE_`echo res_ndestroy | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# dbm_firstkey +eval "ac_tr_func=HAVE_`echo dbm_firstkey | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_res_ndestroy=$ac_res" +eval "LIB_dbm_firstkey=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_res_ndestroy=yes" - eval "LIB_res_ndestroy=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbm_firstkey=yes" + eval "LIB_dbm_firstkey=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_res_ndestroy=no" - eval "LIB_res_ndestroy=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_dbm_firstkey=no" + eval "LIB_dbm_firstkey=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_res_ndestroy=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbm_firstkey=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test -n "$LIB_res_ndestroy"; then - LIBS="$LIB_res_ndestroy $LIBS" + + if test "$ac_cv_func_dbm_firstkey" = "yes"; then + if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then + NDBMLIB="$ac_cv_funclib_dbm_firstkey" + else + NDBMLIB="" + fi + +printf "%s\n" "#define HAVE_DB_NDBM 1" >>confdefs.h + + +printf "%s\n" "#define HAVE_NEW_DB 1" >>confdefs.h + + else + $as_unset ac_cv_func_dbm_firstkey + $as_unset ac_cv_funclib_dbm_firstkey + fi + fi + + +fi # fi berkeley db + + +if test "x$enable_mdb_db" != xno +then : + ac_fn_c_check_header_compile "$LINENO" "lmdb.h" "ac_cv_header_lmdb_h" "$ac_includes_default" +if test "x$ac_cv_header_lmdb_h" = xyes +then : + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mdb_env_create in -llmdb" >&5 +printf %s "checking for mdb_env_create in -llmdb... " >&6; } +if test ${ac_cv_lib_lmdb_mdb_env_create+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-llmdb $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. */ +char mdb_env_create (); +int +main (void) +{ +return mdb_env_create (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_lmdb_mdb_env_create=yes +else $as_nop + ac_cv_lib_lmdb_mdb_env_create=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lmdb_mdb_env_create" >&5 +printf "%s\n" "$ac_cv_lib_lmdb_mdb_env_create" >&6; } +if test "x$ac_cv_lib_lmdb_mdb_env_create" = xyes +then : + have_lmdb=yes; LMDBLIB="-llmdb" +printf "%s\n" "#define HAVE_LMDB 1" >>confdefs.h +fi +fi +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dns_search" >&5 -$as_echo_n "checking for dns_search... " >&6; } -if test "${ac_cv_funclib_dns_search+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +for db_type in unknown $db_type_preference; do + if eval test \"x\$have_${db_type}\" = xyes -o ${db_type} = sqlite; then + break + fi + db_type=unknown +done -if eval "test \"\$ac_cv_func_dns_search\" != yes" ; then +if test "x$have_db3" = xyes -a "$db_type" = unknown +then : + db_type=db3 +else $as_nop + db_type="$db_type" +fi +if test "x$have_db1" = xyes -a "$db_type" = unknown +then : + db_type=db1 +else $as_nop + db_type="$db_type" +fi +if test "x$have_lmdb" = xyes -a "$db_type" = unknown +then : + db_type=lmdb +else $as_nop + db_type="$db_type" +fi + +if test "$enable_ndbm_db" != "no"; then + + if test "$db_type" = "unknown" -o "$ac_cv_func_dbm_firstkey" = ""; then + + ac_fn_c_check_header_compile "$LINENO" "dbm.h" "ac_cv_header_dbm_h" "$ac_includes_default" +if test "x$ac_cv_header_dbm_h" = xyes +then : + printf "%s\n" "#define HAVE_DBM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ndbm.h" "ac_cv_header_ndbm_h" "$ac_includes_default" +if test "x$ac_cv_header_ndbm_h" = xyes +then : + printf "%s\n" "#define HAVE_NDBM_H 1" >>confdefs.h + +fi + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dbm_firstkey" >&5 +printf %s "checking for dbm_firstkey... " >&6; } +if test ${ac_cv_funclib_dbm_firstkey+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_dbm_firstkey\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" ; do + for ac_lib in "" ndbm; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -17305,100 +18365,115 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_DNS_H -#include -#endif + #include + #if defined(HAVE_NDBM_H) + #include + #elif defined(HAVE_DBM_H) + #include + #endif + DBM *dbm; int -main () +main (void) { -dns_search(0,0,0,0,0,0,0,0) +dbm_firstkey(NULL) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dns_search=$ac_lib; else ac_cv_funclib_dns_search=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbm_firstkey=$ac_lib; else ac_cv_funclib_dbm_firstkey=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_dns_search=\${ac_cv_funclib_dns_search-no}" + eval "ac_cv_funclib_dbm_firstkey=\${ac_cv_funclib_dbm_firstkey-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_dns_search" +eval "ac_res=\$ac_cv_funclib_dbm_firstkey" if false; then - for ac_func in dns_search -do : - ac_fn_c_check_func "$LINENO" "dns_search" "ac_cv_func_dns_search" -if test "x$ac_cv_func_dns_search" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DNS_SEARCH 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "dbm_firstkey" "ac_cv_func_dbm_firstkey" +if test "x$ac_cv_func_dbm_firstkey" = xyes +then : + printf "%s\n" "#define HAVE_DBM_FIRSTKEY 1" >>confdefs.h fi -done fi -# dns_search -eval "ac_tr_func=HAVE_`echo dns_search | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# dbm_firstkey +eval "ac_tr_func=HAVE_`echo dbm_firstkey | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dns_search=$ac_res" +eval "LIB_dbm_firstkey=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_dns_search=yes" - eval "LIB_dns_search=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbm_firstkey=yes" + eval "LIB_dbm_firstkey=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_dns_search=no" - eval "LIB_dns_search=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_dbm_firstkey=no" + eval "LIB_dbm_firstkey=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_dns_search=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbm_firstkey=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac + if test "$ac_cv_func_dbm_firstkey" = "yes"; then + if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then + NDBMLIB="$ac_cv_funclib_dbm_firstkey" + else + NDBMLIB="" + fi + +printf "%s\n" "#define HAVE_NDBM 1" >>confdefs.h + have_ndbm=yes + else + + $as_unset ac_cv_func_dbm_firstkey + $as_unset ac_cv_funclib_dbm_firstkey + + ac_fn_c_check_header_compile "$LINENO" "gdbm/ndbm.h" "ac_cv_header_gdbm_ndbm_h" "$ac_includes_default" +if test "x$ac_cv_header_gdbm_ndbm_h" = xyes +then : + printf "%s\n" "#define HAVE_GDBM_NDBM_H 1" >>confdefs.h +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dn_expand" >&5 -$as_echo_n "checking for dn_expand... " >&6; } -if test "${ac_cv_funclib_dn_expand+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_dn_expand\" != yes" ; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dbm_firstkey" >&5 +printf %s "checking for dbm_firstkey... " >&6; } +if test ${ac_cv_funclib_dbm_firstkey+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_dbm_firstkey\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" resolv; do + for ac_lib in "" gdbm; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -17410,1231 +18485,1606 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif -#ifdef HAVE_RESOLV_H -#include -#endif + #include + #include + DBM *dbm; int -main () +main (void) { -dn_expand(0,0,0,0,0) +dbm_firstkey(NULL) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dn_expand=$ac_lib; else ac_cv_funclib_dn_expand=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dbm_firstkey=$ac_lib; else ac_cv_funclib_dbm_firstkey=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_dn_expand=\${ac_cv_funclib_dn_expand-no}" + eval "ac_cv_funclib_dbm_firstkey=\${ac_cv_funclib_dbm_firstkey-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_dn_expand" +eval "ac_res=\$ac_cv_funclib_dbm_firstkey" if false; then - for ac_func in dn_expand -do : - ac_fn_c_check_func "$LINENO" "dn_expand" "ac_cv_func_dn_expand" -if test "x$ac_cv_func_dn_expand" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DN_EXPAND 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "dbm_firstkey" "ac_cv_func_dbm_firstkey" +if test "x$ac_cv_func_dbm_firstkey" = xyes +then : + printf "%s\n" "#define HAVE_DBM_FIRSTKEY 1" >>confdefs.h fi -done fi -# dn_expand -eval "ac_tr_func=HAVE_`echo dn_expand | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# dbm_firstkey +eval "ac_tr_func=HAVE_`echo dbm_firstkey | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dn_expand=$ac_res" +eval "LIB_dbm_firstkey=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_dn_expand=yes" - eval "LIB_dn_expand=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbm_firstkey=yes" + eval "LIB_dbm_firstkey=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_dn_expand=no" - eval "LIB_dn_expand=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_dbm_firstkey=no" + eval "LIB_dbm_firstkey=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_dn_expand=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dbm_firstkey=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test -n "$LIB_dn_expand"; then - LIBS="$LIB_dn_expand $LIBS" -fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _res" >&5 -$as_echo_n "checking for _res... " >&6; } -if test "${ac_cv_var__res+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + if test "$ac_cv_func_dbm_firstkey" = "yes"; then + if test "$ac_cv_funclib_dbm_firstkey" != "yes"; then + NDBMLIB="$ac_cv_funclib_dbm_firstkey" + else + NDBMLIB="" + fi +printf "%s\n" "#define HAVE_NDBM 1" >>confdefs.h + have_ndbm=yes + if test "$db_type" = "unknown"; then + db_type=ndbm + fi + fi + fi + fi #enable_ndbm_db +fi # unknown - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$have_ndbm" = "yes"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if ndbm is implemented with db" >&5 +printf %s "checking if ndbm is implemented with db... " >&6; } + if test "$cross_compiling" = yes +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no-cross" >&5 +printf "%s\n" "no-cross" >&6; } +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif -#ifdef HAVE_RESOLV_H -#include + +#include +#include +#if defined(HAVE_GDBM_NDBM_H) +#include +#elif defined(HAVE_NDBM_H) +#include +#elif defined(HAVE_DBM_H) +#include #endif - void * foo(void) { return &_res; } -int -main () +int main(int argc, char **argv) { -foo() - ; + DBM *d; + + d = dbm_open("conftest", O_RDWR | O_CREAT, 0666); + if (d == NULL) + return 1; + dbm_close(d); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var__res=yes +if ac_fn_c_try_run "$LINENO" +then : + + if test -f conftest.db; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + +printf "%s\n" "#define HAVE_NEW_DB 1" >>confdefs.h + + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi + + if test "$have_db1" = yes; then + HAVE_DB1_TRUE= + HAVE_DB1_FALSE='#' else - ac_cv_var__res=no + HAVE_DB1_TRUE='#' + HAVE_DB1_FALSE= fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_var__res" != yes ; then -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + if test "$have_db3" = yes; then + HAVE_DB3_TRUE= + HAVE_DB3_FALSE='#' +else + HAVE_DB3_TRUE='#' + HAVE_DB3_FALSE= +fi + if test "$have_lmdb" = yes; then + HAVE_LMDB_TRUE= + HAVE_LMDB_FALSE='#' +else + HAVE_LMDB_TRUE='#' + HAVE_LMDB_FALSE= +fi + if test "$have_ndbm" = yes; then + HAVE_NDBM_TRUE= + HAVE_NDBM_FALSE='#' +else + HAVE_NDBM_TRUE='#' + HAVE_NDBM_FALSE= +fi + if test "$dbheader" != ""; then + HAVE_DBHEADER_TRUE= + HAVE_DBHEADER_FALSE='#' +else + HAVE_DBHEADER_TRUE='#' + HAVE_DBHEADER_FALSE= +fi + +## it's probably not correct to include LDFLAGS here, but we might +## need it, for now just add any possible -L +z="" +for i in $LDFLAGS; do + case "$i" in + -L*) z="$z $i";; + esac +done +DB3LIB="$z $DB3LIB" +DB1LIB="$z $DB1LIB" +LMDBLIB="$z $LMDBLIB" +NDMBLIB="$z $NDBMLIB" + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo (void) {return 0; } +$ac_kw foo_t foo (void) {return 0; } #endif -#ifdef HAVE_ARPA_NAMESER_H -#include + +_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.beam conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$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 -#ifdef HAVE_RESOLV_H -#include +_ACEOF + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + +#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}; + /* IBM 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; + } + { /* IBM 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 -extern int _res; -int foo(void) { return _res; } -int -main () -{ -foo() + ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var__res=yes -else - ac_cv_var__res=no +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_const=yes +else $as_nop + ac_cv_c_const=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +printf "%s\n" "#define const /**/" >>confdefs.h fi -ac_foo=`eval echo \\$ac_cv_var__res` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then +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 : -cat >>confdefs.h <<_ACEOF -#define HAVE__RES 1 -_ACEOF +else $as_nop +printf "%s\n" "#define size_t unsigned int" >>confdefs.h -# ac_fn_c_check_decl LINENO SYMBOL VAR -# ------------------------------------ -# Tests whether SYMBOL is declared, setting cache variable VAR accordingly. -ac_fn_c_check_decl () -{ - as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5 -$as_echo_n "checking whether $2 is declared... " >&6; } -if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 +fi + +# Autoupdate added the next two lines to ensure that your configure +# script's behavior did not change. They are probably safe to remove. + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + + + 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 $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$4 + + #if defined _WIN64 && !defined __CYGWIN__ + LLP64 + #endif + int -main () +main (void) { -#ifndef $2 - (void) $2; -#endif ; return 0; } + _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "$3=yes" -else - eval "$3=no" +if ac_fn_c_try_compile "$LINENO" +then : + ac_pid_type='int' +else $as_nop + ac_pid_type='__int64' 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -} # ac_fn_c_check_decl -ac_fn_c_check_decl "$LINENO" "_res" "ac_cv_have_decl__res" "#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif -#ifdef HAVE_RESOLV_H -#include -#endif -" -if test "x$ac_cv_have_decl__res" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi +printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL__RES $ac_have_decl -_ACEOF fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working snprintf" >&5 -$as_echo_n "checking for working snprintf... " >&6; } -if test "${ac_cv_func_snprintf_working+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_func_snprintf_working=yes -if test "$cross_compiling" = yes; then : - : -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 +printf %s "checking for uid_t in sys/types.h... " >&6; } +if test ${ac_cv_type_uid_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include -#include -#include -int main(int argc, char **argv) -{ - char foo[3]; - snprintf(foo, 2, "12"); - return strcmp(foo, "1") || snprintf(NULL, 0, "%d", 12) != 2; -} _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - : -else - ac_cv_func_snprintf_working=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1 +then : + ac_cv_type_uid_t=yes +else $as_nop + ac_cv_type_uid_t=no fi +rm -rf conftest* fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_snprintf_working" >&5 -$as_echo "$ac_cv_func_snprintf_working" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 +printf "%s\n" "$ac_cv_type_uid_t" >&6; } +if test $ac_cv_type_uid_t = no; then -if test "$ac_cv_func_snprintf_working" = yes; then +printf "%s\n" "#define uid_t int" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_SNPRINTF 1 -_ACEOF + +printf "%s\n" "#define gid_t int" >>confdefs.h fi -if test "$ac_cv_func_snprintf_working" = yes; then -if test "$ac_cv_func_snprintf+set" != set -o "$ac_cv_func_snprintf" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if snprintf needs a prototype" >&5 -$as_echo_n "checking if snprintf needs a prototype... " >&6; } -if test "${ac_cv_func_snprintf_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 +printf %s "checking return type of signal handlers... " >&6; } +if test ${ac_cv_type_signal+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int snprintf (struct foo*); +#include +#include + int -main () +main (void) { -snprintf(&xx) +return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_snprintf_noproto=yes" -else - eval "ac_cv_func_snprintf_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_type_signal=int +else $as_nop + ac_cv_type_signal=void fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_snprintf_noproto" >&5 -$as_echo "$ac_cv_func_snprintf_noproto" >&6; } -if test "$ac_cv_func_snprintf_noproto" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 +printf "%s\n" "$ac_cv_type_signal" >&6; } -$as_echo "#define NEED_SNPRINTF_PROTO 1" >>confdefs.h +printf "%s\n" "#define RETSIGTYPE $ac_cv_type_signal" >>confdefs.h + + +if test "$ac_cv_type_signal" = "void" ; then + +printf "%s\n" "#define VOID_RETSIGTYPE 1" >>confdefs.h fi + + + + + +# Obsolete code to be removed. +if test $ac_cv_header_sys_time_h = yes; then + +printf "%s\n" "#define TIME_WITH_SYS_TIME 1" >>confdefs.h + fi +# End of obsolete code. + + +ac_fn_c_check_header_compile "$LINENO" "standards.h" "ac_cv_header_standards_h" "$ac_includes_default" +if test "x$ac_cv_header_standards_h" = xyes +then : + printf "%s\n" "#define HAVE_STANDARDS_H 1" >>confdefs.h fi +for i in netinet/ip.h netinet/tcp.h; do -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working vsnprintf" >&5 -$as_echo_n "checking for working vsnprintf... " >&6; } -if test "${ac_cv_func_vsnprintf_working+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_func_vsnprintf_working=yes -if test "$cross_compiling" = yes; then : - : -else +cv=`echo "$i" | sed 'y%./+-%__p_%'` + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $i" >&5 +printf %s "checking for $i... " >&6; } +if eval test \${ac_cv_header_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include - -int foo(int num, ...) -{ - char bar[3]; - va_list arg; - va_start(arg, num); - vsnprintf(bar, 2, "%s", arg); - va_end(arg); - return strcmp(bar, "1"); -} - -int bar(int num, int len, ...) -{ - int r; - va_list arg; - va_start(arg, len); - r = vsnprintf(NULL, 0, "%s", arg); - va_end(arg); - return r != len; -} +#ifdef HAVE_STANDARDS_H +#include +#endif +#include <$i> -int main(int argc, char **argv) -{ - return foo(0, "12") || bar(0, 2, "12"); -} _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - : -else - ac_cv_func_vsnprintf_working=no +if ac_fn_c_try_cpp "$LINENO" +then : + eval "ac_cv_header_$cv=yes" +else $as_nop + eval "ac_cv_header_$cv=no" +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi +eval ac_res=\$ac_cv_header_$cv + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +ac_res=`eval echo \\$ac_cv_header_$cv` +if test "$ac_res" = yes; then + ac_tr_hdr=HAVE_`echo $i | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h + +fi +done +if false;then + ac_fn_c_check_header_compile "$LINENO" "netinet/ip.h" "ac_cv_header_netinet_ip_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_ip_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_IP_H 1" >>confdefs.h + fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_fn_c_check_header_compile "$LINENO" "netinet/tcp.h" "ac_cv_header_netinet_tcp_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_tcp_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_TCP_H 1" >>confdefs.h + fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vsnprintf_working" >&5 -$as_echo "$ac_cv_func_vsnprintf_working" >&6; } -if test "$ac_cv_func_vsnprintf_working" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5 +printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; } +if test ${ac_cv_c_undeclared_builtin_options+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_CFLAGS=$CFLAGS + ac_cv_c_undeclared_builtin_options='cannot detect' + for ac_arg in '' -fno-builtin; do + CFLAGS="$ac_save_CFLAGS $ac_arg" + # This test program should *not* compile successfully. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -cat >>confdefs.h <<_ACEOF -#define HAVE_VSNPRINTF 1 +int +main (void) +{ +(void) strchr; + ; + return 0; +} _ACEOF +if ac_fn_c_try_compile "$LINENO" +then : -fi -if test "$ac_cv_func_vsnprintf_working" = yes; then - -if test "$ac_cv_func_vsnprintf+set" != set -o "$ac_cv_func_vsnprintf" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if vsnprintf needs a prototype" >&5 -$as_echo_n "checking if vsnprintf needs a prototype... " >&6; } -if test "${ac_cv_func_vsnprintf_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +else $as_nop + # This test program should compile successfully. + # No library function is consistently available on + # freestanding implementations, so test against a dummy + # declaration. Include always-available headers on the + # off chance that they somehow elicit warnings. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int vsnprintf (struct foo*); +#include +#include +#include +#include +extern void ac_decl (int, char *); + int -main () +main (void) { -vsnprintf(&xx) +(void) ac_decl (0, (char *) 0); + (void) ac_decl; + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_vsnprintf_noproto=yes" -else - eval "ac_cv_func_vsnprintf_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + if test x"$ac_arg" = x +then : + ac_cv_c_undeclared_builtin_options='none needed' +else $as_nop + ac_cv_c_undeclared_builtin_options=$ac_arg fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + break fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vsnprintf_noproto" >&5 -$as_echo "$ac_cv_func_vsnprintf_noproto" >&6; } -if test "$ac_cv_func_vsnprintf_noproto" = yes; then +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + CFLAGS=$ac_save_CFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5 +printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; } + case $ac_cv_c_undeclared_builtin_options in #( + 'cannot detect') : + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot make $CC report undeclared builtins +See \`config.log' for more details" "$LINENO" 5; } ;; #( + 'none needed') : + ac_c_undeclared_builtin_options='' ;; #( + *) : + ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;; +esac + -$as_echo "#define NEED_VSNPRINTF_PROTO 1" >>confdefs.h +ac_fn_c_check_func "$LINENO" "getlogin" "ac_cv_func_getlogin" +if test "x$ac_cv_func_getlogin" = xyes +then : + printf "%s\n" "#define HAVE_GETLOGIN 1" >>confdefs.h fi +ac_fn_c_check_func "$LINENO" "setlogin" "ac_cv_func_setlogin" +if test "x$ac_cv_func_setlogin" = xyes +then : + printf "%s\n" "#define HAVE_SETLOGIN 1" >>confdefs.h + +fi + +if test "$ac_cv_func_getlogin" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getlogin is posix" >&5 +printf %s "checking if getlogin is posix... " >&6; } +if test ${ac_cv_func_getlogin_posix+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if test "$ac_cv_func_getlogin" = yes -a "$ac_cv_func_setlogin" = yes; then + ac_cv_func_getlogin_posix=no +else + ac_cv_func_getlogin_posix=yes +fi + fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getlogin_posix" >&5 +printf "%s\n" "$ac_cv_func_getlogin_posix" >&6; } +if test "$ac_cv_func_getlogin_posix" = yes; then +printf "%s\n" "#define POSIX_GETLOGIN 1" >>confdefs.h + +fi fi +ac_func= +for ac_item in $ac_func_c_list +do + if test $ac_func; then + ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func + if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then + echo "#define $ac_item 1" >> confdefs.h + fi + ac_func= + else + ac_func=$ac_item + fi +done + -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working glob" >&5 -$as_echo_n "checking for working glob... " >&6; } -if test "${ac_cv_func_glob_working+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_cv_func_glob_working=yes -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 +printf %s "checking for working mmap... " >&6; } +if test ${ac_cv_func_mmap_fixed_mapped+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on platforms where we know the result. + linux*) ac_cv_func_mmap_fixed_mapped=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_mmap_fixed_mapped=no ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc + +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ + +#include +#include + +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ + +#endif /* no HAVE_GETPAGESIZE */ -#include -#include int -main () +main (void) { + char *data, *data2, *data3; + const char *cdata2; + int i, pagesize; + int fd, fd2; -glob(NULL, GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE| -#ifdef GLOB_MAXPATH -GLOB_MAXPATH -#else -GLOB_LIMIT -#endif -, -NULL, NULL); + pagesize = getpagesize (); - ; + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + return 1; + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + return 2; + if (write (fd, data, pagesize) != pagesize) + return 3; + close (fd); + + /* Next, check that the tail of a page is zero-filled. File must have + non-zero length, otherwise we risk SIGBUS for entire page. */ + fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); + if (fd2 < 0) + return 4; + cdata2 = ""; + if (write (fd2, cdata2, 1) != 1) + return 5; + data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); + if (data2 == MAP_FAILED) + return 6; + for (i = 0; i < pagesize; ++i) + if (*(data2 + i)) + return 7; + close (fd2); + if (munmap (data2, pagesize)) + return 8; + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + return 9; + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + return 10; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + return 11; + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + return 12; + if (read (fd, data3, pagesize) != pagesize) + return 13; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + return 14; + close (fd); + free (data); + free (data3); return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - : -else - ac_cv_func_glob_working=no +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_mmap_fixed_mapped=yes +else $as_nop + ac_cv_func_mmap_fixed_mapped=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_glob_working" >&5 -$as_echo "$ac_cv_func_glob_working" >&6; } -if test "$ac_cv_func_glob_working" = yes; then +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 +printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; } +if test $ac_cv_func_mmap_fixed_mapped = yes; then -$as_echo "#define HAVE_GLOB 1" >>confdefs.h +printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h fi -if test "$ac_cv_func_glob_working" = yes; then +rm -f conftest.mmap conftest.txt -if test "$ac_cv_func_glob+set" != set -o "$ac_cv_func_glob" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if glob needs a prototype" >&5 -$as_echo_n "checking if glob needs a prototype... " >&6; } -if test "${ac_cv_func_glob_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if realloc if broken" >&5 +printf %s "checking if realloc if broken... " >&6; } +if test ${ac_cv_func_realloc_broken+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +ac_cv_func_realloc_broken=no +if test "$cross_compiling" = yes +then : + : +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -struct foo { int foo; } xx; -extern int glob (struct foo*); -int -main () + +#include +#include + +int main(int argc, char **argv) { -glob(&xx) - ; - return 0; + return realloc(NULL, 17) == NULL; } + _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_glob_noproto=yes" -else - eval "ac_cv_func_glob_noproto=no" +if ac_fn_c_try_run "$LINENO" +then : + : +else $as_nop + ac_cv_func_realloc_broken=yes fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_glob_noproto" >&5 -$as_echo "$ac_cv_func_glob_noproto" >&6; } -if test "$ac_cv_func_glob_noproto" = yes; then -$as_echo "#define NEED_GLOB_PROTO 1" >>confdefs.h -fi -fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_broken" >&5 +printf "%s\n" "$ac_cv_func_realloc_broken" >&6; } +if test "$ac_cv_func_realloc_broken" = yes ; then + +printf "%s\n" "#define BROKEN_REALLOC 1" >>confdefs.h + +fi + + + + + +DIR_roken=roken +LIB_roken='$(top_builddir)/lib/roken/libroken.la' +INCLUDES_roken='-I$(top_builddir)/lib/roken -I$(top_srcdir)/lib/roken' + + + + -fi -if test "$ac_cv_func_glob_working" != yes; then - case " $LIBOBJS " in - *" glob.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS glob.$ac_objext" - ;; -esac -fi - if test "$ac_cv_func_glob_working" = yes; then - have_glob_h_TRUE= - have_glob_h_FALSE='#' -else - have_glob_h_TRUE='#' - have_glob_h_FALSE= -fi -for ac_func in \ - asnprintf \ - asprintf \ - atexit \ - cgetent \ - getconfattr \ - getprogname \ - getrlimit \ - getspnam \ - issetugid \ - on_exit \ - poll \ - random \ - setprogname \ - strsvis \ - strsvisx \ - strunvis \ - strvis \ - strvisx \ - svis \ - sysconf \ - sysctl \ - tdelete \ - tfind \ - twalk \ - uname \ - unvis \ - vasnprintf \ - vasprintf \ - vis \ +printf "%s\n" "#define rk_PATH_DELIM '/'" >>confdefs.h -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF -fi -done -if test "$ac_cv_func_cgetent" = no; then - case " $LIBOBJS " in - *" getcap.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getcap.$ac_objext" - ;; -esac + + + +# Check whether --enable-developer was given. +if test ${enable_developer+y} +then : + enableval=$enable_developer; +fi + +if test "X$enable_developer" = Xyes; then + dwflags="-Werror" fi - if test "$ac_cv_func_cgetent" = yes; then - have_cgetent_TRUE= - have_cgetent_FALSE='#' + if test "X$enable_developer" = Xyes; then + DEVELOPER_MODE_TRUE= + DEVELOPER_MODE_FALSE='#' else - have_cgetent_TRUE='#' - have_cgetent_FALSE= + DEVELOPER_MODE_TRUE='#' + DEVELOPER_MODE_FALSE= fi +WFLAGS_NOUNUSED="" +if test -z "$WFLAGS" -a "$GCC" = "yes"; then + # leave these out for now: + # -Wcast-align doesn't work well on alpha osf/1 + # -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast + # -Wmissing-declarations -Wnested-externs + # -Wstrict-overflow=5 + WFLAGS="-Wall -Wextra -Wno-sign-compare -Wno-unused-parameter -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast -Wmissing-declarations -Wnested-externs -Wshadow $dwflags" + # + # WFLAGS_LITE can be appended to WFLAGS to turn off a host of warnings + # that fail for various bits of older code in appl/. Let's not use it + # for the main libraries, though. + WFLAGS_LITE="-Wno-extra -Wno-missing-field-initializers -Wno-strict-aliasing -Wno-shadow" + # -Wno-unused-result (not supported on gcc-4.2) +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getsockopt" >&5 -$as_echo_n "checking for getsockopt... " >&6; } -if test "${ac_cv_funclib_getsockopt+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_getsockopt\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" ; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + + +cv=`echo "ssize_t" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ssize_t" >&5 +printf %s "checking for ssize_t... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_SYS_TYPES_H + #include +#if STDC_HEADERS +#include +#include #endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif +#include int -main () +main (void) { -getsockopt(0,0,0,0,0) +ssize_t foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_getsockopt=$ac_lib; else ac_cv_funclib_getsockopt=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_getsockopt=\${ac_cv_funclib_getsockopt-no}" - LIBS="$ac_save_LIBS" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo ssize_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + 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 : +printf "%s\n" "#define HAVE_SSIZE_T 1" >>confdefs.h -eval "ac_res=\$ac_cv_funclib_getsockopt" - -if false; then - for ac_func in getsockopt -do : - ac_fn_c_check_func "$LINENO" "getsockopt" "ac_cv_func_getsockopt" -if test "x$ac_cv_func_getsockopt" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETSOCKOPT 1 -_ACEOF fi -done fi -# getsockopt -eval "ac_tr_func=HAVE_`echo getsockopt | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_getsockopt=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_getsockopt=yes" - eval "LIB_getsockopt=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_getsockopt=no" - eval "LIB_getsockopt=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_getsockopt=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt" >&5 -$as_echo_n "checking for setsockopt... " >&6; } -if test "${ac_cv_funclib_setsockopt+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_setsockopt\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" ; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cv=`echo "long long" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 +printf %s "checking for long long... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_SYS_TYPES_H + #include +#if STDC_HEADERS +#include +#include #endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif + int -main () +main (void) { -setsockopt(0,0,0,0,0) +long long foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_setsockopt=$ac_lib; else ac_cv_funclib_setsockopt=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_setsockopt=\${ac_cv_funclib_setsockopt-no}" - LIBS="$ac_save_LIBS" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo long long | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +if test "x$ac_cv_type_long_long" = xyes +then : +printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h -eval "ac_res=\$ac_cv_funclib_setsockopt" -if false; then - for ac_func in setsockopt -do : - ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" -if test "x$ac_cv_func_setsockopt" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SETSOCKOPT 1 -_ACEOF +fi fi -done + +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h fi -# setsockopt -eval "ac_tr_func=HAVE_`echo setsockopt | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_setsockopt=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_setsockopt=yes" - eval "LIB_setsockopt=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_setsockopt=no" - eval "LIB_setsockopt=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_setsockopt=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default" +if test "x$ac_cv_header_arpa_inet_h" = xyes +then : + printf "%s\n" "#define HAVE_ARPA_INET_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "config.h" "ac_cv_header_config_h" "$ac_includes_default" +if test "x$ac_cv_header_config_h" = xyes +then : + printf "%s\n" "#define HAVE_CONFIG_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "crypt.h" "ac_cv_header_crypt_h" "$ac_includes_default" +if test "x$ac_cv_header_crypt_h" = xyes +then : + printf "%s\n" "#define HAVE_CRYPT_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "dirent.h" "ac_cv_header_dirent_h" "$ac_includes_default" +if test "x$ac_cv_header_dirent_h" = xyes +then : + printf "%s\n" "#define HAVE_DIRENT_H 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for hstrerror" >&5 -$as_echo_n "checking for hstrerror... " >&6; } -if test "${ac_cv_funclib_hstrerror+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_header_compile "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" +if test "x$ac_cv_header_errno_h" = xyes +then : + printf "%s\n" "#define HAVE_ERRNO_H 1" >>confdefs.h -if eval "test \"\$ac_cv_func_hstrerror\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" resolv; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include -#endif -int -main () -{ -hstrerror(17) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_hstrerror=$ac_lib; else ac_cv_funclib_hstrerror=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_hstrerror=\${ac_cv_funclib_hstrerror-no}" - LIBS="$ac_save_LIBS" +ac_fn_c_check_header_compile "$LINENO" "err.h" "ac_cv_header_err_h" "$ac_includes_default" +if test "x$ac_cv_header_err_h" = xyes +then : + printf "%s\n" "#define HAVE_ERR_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "fnmatch.h" "ac_cv_header_fnmatch_h" "$ac_includes_default" +if test "x$ac_cv_header_fnmatch_h" = xyes +then : + printf "%s\n" "#define HAVE_FNMATCH_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "grp.h" "ac_cv_header_grp_h" "$ac_includes_default" +if test "x$ac_cv_header_grp_h" = xyes +then : + printf "%s\n" "#define HAVE_GRP_H 1" >>confdefs.h -eval "ac_res=\$ac_cv_funclib_hstrerror" +fi +ac_fn_c_check_header_compile "$LINENO" "ifaddrs.h" "ac_cv_header_ifaddrs_h" "$ac_includes_default" +if test "x$ac_cv_header_ifaddrs_h" = xyes +then : + printf "%s\n" "#define HAVE_IFADDRS_H 1" >>confdefs.h -if false; then - for ac_func in hstrerror -do : - ac_fn_c_check_func "$LINENO" "hstrerror" "ac_cv_func_hstrerror" -if test "x$ac_cv_func_hstrerror" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_HSTRERROR 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "netinet/in6.h" "ac_cv_header_netinet_in6_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in6_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_IN6_H 1" >>confdefs.h fi -# hstrerror -eval "ac_tr_func=HAVE_`echo hstrerror | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_hstrerror=$ac_res" +ac_fn_c_check_header_compile "$LINENO" "netinet/in_systm.h" "ac_cv_header_netinet_in_systm_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in_systm_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_IN_SYSTM_H 1" >>confdefs.h -case "$ac_res" in - yes) - eval "ac_cv_func_hstrerror=yes" - eval "LIB_hstrerror=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "netinet6/in6.h" "ac_cv_header_netinet6_in6_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet6_in6_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET6_IN6_H 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_hstrerror=no" - eval "LIB_hstrerror=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_hstrerror=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "paths.h" "ac_cv_header_paths_h" "$ac_includes_default" +if test "x$ac_cv_header_paths_h" = xyes +then : + printf "%s\n" "#define HAVE_PATHS_H 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default" +if test "x$ac_cv_header_poll_h" = xyes +then : + printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +fi +ac_fn_c_check_header_compile "$LINENO" "pwd.h" "ac_cv_header_pwd_h" "$ac_includes_default" +if test "x$ac_cv_header_pwd_h" = xyes +then : + printf "%s\n" "#define HAVE_PWD_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "rpcsvc/ypclnt.h" "ac_cv_header_rpcsvc_ypclnt_h" "$ac_includes_default" +if test "x$ac_cv_header_rpcsvc_ypclnt_h" = xyes +then : + printf "%s\n" "#define HAVE_RPCSVC_YPCLNT_H 1" >>confdefs.h -if test -n "$LIB_hstrerror"; then - LIBS="$LIB_hstrerror $LIBS" fi +ac_fn_c_check_header_compile "$LINENO" "search.h" "ac_cv_header_search_h" "$ac_includes_default" +if test "x$ac_cv_header_search_h" = xyes +then : + printf "%s\n" "#define HAVE_SEARCH_H 1" >>confdefs.h -if eval "test \"$ac_cv_func_hstrerror\" != yes"; then - case " $LIBOBJS " in - *" hstrerror.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS hstrerror.$ac_objext" - ;; -esac +fi +ac_fn_c_check_header_compile "$LINENO" "shadow.h" "ac_cv_header_shadow_h" "$ac_includes_default" +if test "x$ac_cv_header_shadow_h" = xyes +then : + printf "%s\n" "#define HAVE_SHADOW_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes +then : + printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/auxv.h" "ac_cv_header_sys_auxv_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_auxv_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_AUXV_H 1" >>confdefs.h -if test "$ac_cv_func_hstrerror+set" != set -o "$ac_cv_func_hstrerror" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if hstrerror needs a prototype" >&5 -$as_echo_n "checking if hstrerror needs a prototype... " >&6; } -if test "${ac_cv_func_hstrerror_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "sys/bswap.h" "ac_cv_header_sys_bswap_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_bswap_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_BSWAP_H 1" >>confdefs.h -#ifdef HAVE_NETDB_H -#include -#endif -struct foo { int foo; } xx; -extern int hstrerror (struct foo*); -int -main () -{ -hstrerror(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_hstrerror_noproto=yes" -else - eval "ac_cv_func_hstrerror_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_header_compile "$LINENO" "sys/errno.h" "ac_cv_header_sys_errno_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_errno_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_ERRNO_H 1" >>confdefs.h + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_hstrerror_noproto" >&5 -$as_echo "$ac_cv_func_hstrerror_noproto" >&6; } -if test "$ac_cv_func_hstrerror_noproto" = yes; then +ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h -$as_echo "#define NEED_HSTRERROR_PROTO 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_MMAN_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_param_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "sys/resource.h" "ac_cv_header_sys_resource_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_resource_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_RESOURCE_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/sockio.h" "ac_cv_header_sys_sockio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sockio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SOCKIO_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stat.h" "ac_cv_header_sys_stat_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stat_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STAT_H 1" >>confdefs.h -if test "$ac_cv_func_asprintf+set" != set -o "$ac_cv_func_asprintf" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if asprintf needs a prototype" >&5 -$as_echo_n "checking if asprintf needs a prototype... " >&6; } -if test "${ac_cv_func_asprintf_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_time_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h - #include - #include -struct foo { int foo; } xx; -extern int asprintf (struct foo*); -int -main () -{ -asprintf(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_asprintf_noproto=yes" -else - eval "ac_cv_func_asprintf_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_header_compile "$LINENO" "sys/tty.h" "ac_cv_header_sys_tty_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_tty_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TTY_H 1" >>confdefs.h + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_asprintf_noproto" >&5 -$as_echo "$ac_cv_func_asprintf_noproto" >&6; } -if test "$ac_cv_func_asprintf_noproto" = yes; then +ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_types_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h -$as_echo "#define NEED_ASPRINTF_PROTO 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_uio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UIO_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_utsname_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UTSNAME_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_wait_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h -if test "$ac_cv_func_vasprintf+set" != set -o "$ac_cv_func_vasprintf" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if vasprintf needs a prototype" >&5 -$as_echo_n "checking if vasprintf needs a prototype... " >&6; } -if test "${ac_cv_func_vasprintf_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +ac_fn_c_check_header_compile "$LINENO" "syslog.h" "ac_cv_header_syslog_h" "$ac_includes_default" +if test "x$ac_cv_header_syslog_h" = xyes +then : + printf "%s\n" "#define HAVE_SYSLOG_H 1" >>confdefs.h - #include - #include -struct foo { int foo; } xx; -extern int vasprintf (struct foo*); -int -main () -{ -vasprintf(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_vasprintf_noproto=yes" -else - eval "ac_cv_func_vasprintf_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" +if test "x$ac_cv_header_termios_h" = xyes +then : + printf "%s\n" "#define HAVE_TERMIOS_H 1" >>confdefs.h + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vasprintf_noproto" >&5 -$as_echo "$ac_cv_func_vasprintf_noproto" >&6; } -if test "$ac_cv_func_vasprintf_noproto" = yes; then +ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default" +if test "x$ac_cv_header_winsock2_h" = xyes +then : + printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ws2tcpip.h" "ac_cv_header_ws2tcpip_h" "$ac_includes_default" +if test "x$ac_cv_header_ws2tcpip_h" = xyes +then : + printf "%s\n" "#define HAVE_WS2TCPIP_H 1" >>confdefs.h -$as_echo "#define NEED_VASPRINTF_PROTO 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "userconf.h" "ac_cv_header_userconf_h" "$ac_includes_default" +if test "x$ac_cv_header_userconf_h" = xyes +then : + printf "%s\n" "#define HAVE_USERCONF_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "usersec.h" "ac_cv_header_usersec_h" "$ac_includes_default" +if test "x$ac_cv_header_usersec_h" = xyes +then : + printf "%s\n" "#define HAVE_USERSEC_H 1" >>confdefs.h -if test "$ac_cv_func_asnprintf+set" != set -o "$ac_cv_func_asnprintf" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if asnprintf needs a prototype" >&5 -$as_echo_n "checking if asnprintf needs a prototype... " >&6; } -if test "${ac_cv_func_asnprintf_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" +if test "x$ac_cv_header_util_h" = xyes +then : + printf "%s\n" "#define HAVE_UTIL_H 1" >>confdefs.h + +fi + + + + +cv=`echo "uintptr_t" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uintptr_t" >&5 +printf %s "checking for uintptr_t... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - #include - #include -struct foo { int foo; } xx; -extern int asnprintf (struct foo*); +#include +#if STDC_HEADERS +#include +#include +#endif +#ifdef HAVE_STDINT_H +#include +#endif int -main () +main (void) { -asnprintf(&xx) +uintptr_t foo; ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_asnprintf_noproto=yes" -else - eval "ac_cv_func_asnprintf_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_asnprintf_noproto" >&5 -$as_echo "$ac_cv_func_asnprintf_noproto" >&6; } -if test "$ac_cv_func_asnprintf_noproto" = yes; then +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo uintptr_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "$ac_includes_default" +if test "x$ac_cv_type_uintptr_t" = xyes +then : + +printf "%s\n" "#define HAVE_UINTPTR_T 1" >>confdefs.h -$as_echo "#define NEED_ASNPRINTF_PROTO 1" >>confdefs.h fi + fi -if test "$ac_cv_func_vasnprintf+set" != set -o "$ac_cv_func_vasnprintf" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if vasnprintf needs a prototype" >&5 -$as_echo_n "checking if vasnprintf needs a prototype... " >&6; } -if test "${ac_cv_func_vasnprintf_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h - #include - #include -struct foo { int foo; } xx; -extern int vasnprintf (struct foo*); -int -main () -{ -vasnprintf(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_vasnprintf_noproto=yes" -else - eval "ac_cv_func_vasnprintf_noproto=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vasnprintf_noproto" >&5 -$as_echo "$ac_cv_func_vasnprintf_noproto" >&6; } -if test "$ac_cv_func_vasnprintf_noproto" = yes; then -$as_echo "#define NEED_VASNPRINTF_PROTO 1" >>confdefs.h + +ac_fn_c_check_header_compile "$LINENO" "vis.h" "ac_cv_header_vis_h" " +#include +#ifndef VIS_SP +#error invis +#endif +" +if test "x$ac_cv_header_vis_h" = xyes +then : + printf "%s\n" "#define HAVE_VIS_H 1" >>confdefs.h fi + + +ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +" +if test "x$ac_cv_header_netdb_h" = xyes +then : + printf "%s\n" "#define HAVE_NETDB_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default +#ifdef HAVE_SYS_TYPES_H +#include +#endif +" +if test "x$ac_cv_header_sys_socket_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bswap16" >&5 -$as_echo_n "checking for bswap16... " >&6; } -if test "${ac_cv_funclib_bswap16+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_bswap16\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" ; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$ac_includes_default #ifdef HAVE_SYS_TYPES_H #include #endif -#ifdef HAVE_SYS_BSWAP_H -#include +#if HAVE_SYS_SOCKET_H +#include #endif -int -main () -{ -bswap16(0) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_bswap16=$ac_lib; else ac_cv_funclib_bswap16=yes; fi";break +" +if test "x$ac_cv_header_net_if_h" = xyes +then : + printf "%s\n" "#define HAVE_NET_IF_H 1" >>confdefs.h + fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_bswap16=\${ac_cv_funclib_bswap16-no}" - LIBS="$ac_save_LIBS" + + +ac_fn_c_check_header_compile "$LINENO" "netinet6/in6_var.h" "ac_cv_header_netinet6_in6_var_h" "$ac_includes_default +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET6_IN6_H +#include +#endif + +" +if test "x$ac_cv_header_netinet6_in6_var_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET6_IN6_VAR_H 1" >>confdefs.h + fi + +ac_fn_c_check_header_compile "$LINENO" "sys/sysctl.h" "ac_cv_header_sys_sysctl_h" "$ac_includes_default +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +" +if test "x$ac_cv_header_sys_sysctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SYSCTL_H 1" >>confdefs.h + fi -eval "ac_res=\$ac_cv_funclib_bswap16" +ac_fn_c_check_header_compile "$LINENO" "sys/proc.h" "ac_cv_header_sys_proc_h" "$ac_includes_default +#ifdef HAVE_SYS_PARAM_H +#include +#endif -if false; then - for ac_func in bswap16 -do : - ac_fn_c_check_func "$LINENO" "bswap16" "ac_cv_func_bswap16" -if test "x$ac_cv_func_bswap16" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BSWAP16 1 -_ACEOF +" +if test "x$ac_cv_header_sys_proc_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PROC_H 1" >>confdefs.h + +fi + + + + + if test "$ac_cv_header_err_h" = yes; then + have_err_h_TRUE= + have_err_h_FALSE='#' +else + have_err_h_TRUE='#' + have_err_h_FALSE= +fi + + if test "$ac_cv_header_ifaddrs_h" = yes; then + have_ifaddrs_h_TRUE= + have_ifaddrs_h_FALSE='#' +else + have_ifaddrs_h_TRUE='#' + have_ifaddrs_h_FALSE= +fi + if test "$ac_cv_header_search_h" = yes; then + have_search_h_TRUE= + have_search_h_FALSE='#' +else + have_search_h_TRUE='#' + have_search_h_FALSE= fi -done + if test "$ac_cv_header_vis_h" = yes; then + have_vis_h_TRUE= + have_vis_h_FALSE='#' +else + have_vis_h_TRUE='#' + have_vis_h_FALSE= fi -# bswap16 -eval "ac_tr_func=HAVE_`echo bswap16 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_bswap16=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_bswap16=yes" - eval "LIB_bswap16=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_bswap16=no" - eval "LIB_bswap16=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_bswap16=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bswap32" >&5 -$as_echo_n "checking for bswap32... " >&6; } -if test "${ac_cv_funclib_bswap32+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socket" >&5 +printf %s "checking for socket... " >&6; } +if test ${ac_cv_funclib_socket+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_bswap32\" != yes" ; then +if eval "test \"\$ac_cv_func_socket\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" ; do + for ac_lib in "" socket; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -18645,100 +20095,90 @@ LIBS=" $ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_BSWAP_H -#include -#endif + int -main () +main (void) { -bswap32(0) +socket() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_bswap32=$ac_lib; else ac_cv_funclib_bswap32=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_socket=$ac_lib; else ac_cv_funclib_socket=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_bswap32=\${ac_cv_funclib_bswap32-no}" + eval "ac_cv_funclib_socket=\${ac_cv_funclib_socket-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_bswap32" +eval "ac_res=\$ac_cv_funclib_socket" if false; then - for ac_func in bswap32 -do : - ac_fn_c_check_func "$LINENO" "bswap32" "ac_cv_func_bswap32" -if test "x$ac_cv_func_bswap32" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_BSWAP32 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" +if test "x$ac_cv_func_socket" = xyes +then : + printf "%s\n" "#define HAVE_SOCKET 1" >>confdefs.h fi -done fi -# bswap32 -eval "ac_tr_func=HAVE_`echo bswap32 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# socket +eval "ac_tr_func=HAVE_`echo socket | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_bswap32=$ac_res" +eval "LIB_socket=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_bswap32=yes" - eval "LIB_bswap32=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_socket=yes" + eval "LIB_socket=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_bswap32=no" - eval "LIB_bswap32=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_socket=no" + eval "LIB_socket=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_bswap32=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_socket=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac +if test -n "$LIB_socket"; then + LIBS="$LIB_socket $LIBS" +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pidfile" >&5 -$as_echo_n "checking for pidfile... " >&6; } -if test "${ac_cv_funclib_pidfile+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_pidfile\" != yes" ; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname" >&5 +printf %s "checking for gethostbyname... " >&6; } +if test ${ac_cv_funclib_gethostbyname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_gethostbyname\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" util; do + for ac_lib in "" nsl; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -18749,98 +20189,90 @@ LIBS=" $ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_UTIL_H -#include -#endif + int -main () +main (void) { -pidfile(0) +gethostbyname() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_pidfile=$ac_lib; else ac_cv_funclib_pidfile=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_gethostbyname=$ac_lib; else ac_cv_funclib_gethostbyname=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_pidfile=\${ac_cv_funclib_pidfile-no}" + eval "ac_cv_funclib_gethostbyname=\${ac_cv_funclib_gethostbyname-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_pidfile" +eval "ac_res=\$ac_cv_funclib_gethostbyname" if false; then - for ac_func in pidfile -do : - ac_fn_c_check_func "$LINENO" "pidfile" "ac_cv_func_pidfile" -if test "x$ac_cv_func_pidfile" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_PIDFILE 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = xyes +then : + printf "%s\n" "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h fi -done fi -# pidfile -eval "ac_tr_func=HAVE_`echo pidfile | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# gethostbyname +eval "ac_tr_func=HAVE_`echo gethostbyname | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_pidfile=$ac_res" +eval "LIB_gethostbyname=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_pidfile=yes" - eval "LIB_pidfile=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_gethostbyname=yes" + eval "LIB_gethostbyname=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_pidfile=no" - eval "LIB_pidfile=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_gethostbyname=no" + eval "LIB_gethostbyname=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_pidfile=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_gethostbyname=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac +if test -n "$LIB_gethostbyname"; then + LIBS="$LIB_gethostbyname $LIBS" +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5 -$as_echo_n "checking for getaddrinfo... " >&6; } -if test "${ac_cv_funclib_getaddrinfo+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for syslog" >&5 +printf %s "checking for syslog... " >&6; } +if test ${ac_cv_funclib_syslog+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_getaddrinfo\" != yes" ; then +if eval "test \"\$ac_cv_func_syslog\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" ; do + for ac_lib in "" syslog; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -18851,216 +20283,334 @@ LIBS=" $ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif + int -main () +main (void) { -getaddrinfo(0,0,0,0) +syslog() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_getaddrinfo=$ac_lib; else ac_cv_funclib_getaddrinfo=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_syslog=$ac_lib; else ac_cv_funclib_syslog=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_getaddrinfo=\${ac_cv_funclib_getaddrinfo-no}" + eval "ac_cv_funclib_syslog=\${ac_cv_funclib_syslog-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_getaddrinfo" +eval "ac_res=\$ac_cv_funclib_syslog" if false; then - for ac_func in getaddrinfo -do : - ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" -if test "x$ac_cv_func_getaddrinfo" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETADDRINFO 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "syslog" "ac_cv_func_syslog" +if test "x$ac_cv_func_syslog" = xyes +then : + printf "%s\n" "#define HAVE_SYSLOG 1" >>confdefs.h fi -done fi -# getaddrinfo -eval "ac_tr_func=HAVE_`echo getaddrinfo | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# syslog +eval "ac_tr_func=HAVE_`echo syslog | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_getaddrinfo=$ac_res" +eval "LIB_syslog=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_getaddrinfo=yes" - eval "LIB_getaddrinfo=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_syslog=yes" + eval "LIB_syslog=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_getaddrinfo=no" - eval "LIB_getaddrinfo=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_syslog=no" + eval "LIB_syslog=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_getaddrinfo=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_syslog=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test -n "$LIB_getaddrinfo"; then - LIBS="$LIB_getaddrinfo $LIBS" +if test -n "$LIB_syslog"; then + LIBS="$LIB_syslog $LIBS" fi -if eval "test \"$ac_cv_func_getaddrinfo\" != yes"; then - case " $LIBOBJS " in - *" getaddrinfo.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext" - ;; -esac + + +# Check whether --with-ipv6 was given. +if test ${with_ipv6+y} +then : + withval=$with_ipv6; + ac_cv_lib_ipv6="$withval" + +fi + +save_CFLAGS="${CFLAGS}" + +if test "X$ac_cv_lib_ipv6" != "Xno"; then + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IPv6 stack type" >&5 +printf %s "checking for IPv6 stack type... " >&6; } +if test ${rk_cv_v6type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + v6type=unknown + v6lib=none + + for i in v6d toshiba kame inria zeta linux; do + case $i in + v6d) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __V6D__ +yes +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + v6type=$i; v6lib=v6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-I/usr/local/v6/include $CFLAGS" +fi +rm -rf conftest* + + ;; + toshiba) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef _TOSHIBA_INET6 +yes +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + v6type=$i; v6lib=inet6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-DINET6 $CFLAGS" +fi +rm -rf conftest* + + ;; + kame) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef __KAME__ +yes +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + v6type=$i; v6lib=inet6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-DINET6 $CFLAGS" +fi +rm -rf conftest* + + ;; + inria) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifdef IPV6_INRIA_VERSION +yes +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + v6type=$i; CFLAGS="-DINET6 $CFLAGS" fi +rm -rf conftest* + ;; + zeta) + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifdef _ZETA_MINAMI_INET6 +yes +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1 +then : + v6type=$i; v6lib=inet6; + v6libdir=/usr/local/v6/lib; + CFLAGS="-DINET6 $CFLAGS" +fi +rm -rf conftest* + ;; + linux) + if test -d /usr/inet6; then + v6type=$i + v6lib=inet6 + v6libdir=/usr/inet6 + CFLAGS="-DINET6 $CFLAGS" + fi + ;; + esac + if test "$v6type" != "unknown"; then + break + fi + done + if test "$v6lib" != "none"; then + for dir in $v6libdir /usr/local/v6/lib /usr/local/lib; do + if test -d $dir -a -f $dir/lib$v6lib.a; then + LIBS="-L$dir -l$v6lib $LIBS" + break + fi + done + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $rk_cv_v6type" >&5 +printf "%s\n" "$rk_cv_v6type" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for IPv6" >&5 +printf %s "checking for IPv6... " >&6; } +if test ${rk_cv_lib_ipv6+y} +then : + printf %s "(cached) " >&6 +else $as_nop -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getnameinfo" >&5 -$as_echo_n "checking for getnameinfo... " >&6; } -if test "${ac_cv_funclib_getnameinfo+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -if eval "test \"\$ac_cv_func_getnameinfo\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" ; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include + +#ifdef HAVE_SYS_TYPES_H +#include #endif -#ifdef HAVE_WS2TCPIP_H -#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include #endif + int -main () +main (void) { -getnameinfo(0,0,0,0,0,0,0) + + struct sockaddr_in6 sin6; + int s; + + s = socket(AF_INET6, SOCK_DGRAM, 0); + + sin6.sin6_family = AF_INET6; + sin6.sin6_port = htons(17); + sin6.sin6_addr = in6addr_any; + bind(s, (struct sockaddr *)&sin6, sizeof(sin6)); + ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_getnameinfo=$ac_lib; else ac_cv_funclib_getnameinfo=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_ipv6=yes +else $as_nop + ac_cv_lib_ipv6=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_getnameinfo=\${ac_cv_funclib_getnameinfo-no}" - LIBS="$ac_save_LIBS" fi - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $rk_cv_lib_ipv6" >&5 +printf "%s\n" "$rk_cv_lib_ipv6" >&6; } fi +if test "$ac_cv_lib_ipv6" = yes; then -eval "ac_res=\$ac_cv_funclib_getnameinfo" - -if false; then - for ac_func in getnameinfo -do : - ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo" -if test "x$ac_cv_func_getnameinfo" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETNAMEINFO 1 -_ACEOF - -fi -done +printf "%s\n" "#define HAVE_IPV6 1" >>confdefs.h +else + CFLAGS="${save_CFLAGS}" fi -# getnameinfo -eval "ac_tr_func=HAVE_`echo getnameinfo | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_getnameinfo=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_getnameinfo=yes" - eval "LIB_getnameinfo=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_getnameinfo=no" - eval "LIB_getnameinfo=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_getnameinfo=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +## test for AIX missing in6addr_loopback +if test "$ac_cv_lib_ipv6" = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for in6addr_loopback" >&5 +printf %s "checking for in6addr_loopback... " >&6; } +if test ${rk_cv_var_in6addr_loopback+y} +then : + printf %s "(cached) " >&6 +else $as_nop - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#endif +int +main (void) +{ +struct sockaddr_in6 sin6; +sin6.sin6_addr = in6addr_loopback; -if test -n "$LIB_getnameinfo"; then - LIBS="$LIB_getnameinfo $LIBS" + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_in6addr_loopback=yes +else $as_nop + ac_cv_var_in6addr_loopback=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $rk_cv_var_in6addr_loopback" >&5 +printf "%s\n" "$rk_cv_var_in6addr_loopback" >&6; } + if test "$ac_cv_var_in6addr_loopback" = yes; then -if eval "test \"$ac_cv_func_getnameinfo\" != yes"; then - case " $LIBOBJS " in - *" getnameinfo.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getnameinfo.$ac_objext" - ;; -esac +printf "%s\n" "#define HAVE_IN6ADDR_LOOPBACK 1" >>confdefs.h + fi fi @@ -19068,15 +20618,16 @@ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for freeaddrinfo" >&5 -$as_echo_n "checking for freeaddrinfo... " >&6; } -if test "${ac_cv_funclib_freeaddrinfo+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gethostbyname2" >&5 +printf %s "checking for gethostbyname2... " >&6; } +if test ${ac_cv_funclib_gethostbyname2+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_freeaddrinfo\" != yes" ; then +if eval "test \"\$ac_cv_func_gethostbyname2\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" ; do + for ac_lib in "" inet6 ip6; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -19087,97 +20638,108 @@ LIBS=" $ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif + int -main () +main (void) { -freeaddrinfo(0) +gethostbyname2() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_freeaddrinfo=$ac_lib; else ac_cv_funclib_freeaddrinfo=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_gethostbyname2=$ac_lib; else ac_cv_funclib_gethostbyname2=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_freeaddrinfo=\${ac_cv_funclib_freeaddrinfo-no}" + eval "ac_cv_funclib_gethostbyname2=\${ac_cv_funclib_gethostbyname2-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_freeaddrinfo" +eval "ac_res=\$ac_cv_funclib_gethostbyname2" if false; then - for ac_func in freeaddrinfo -do : - ac_fn_c_check_func "$LINENO" "freeaddrinfo" "ac_cv_func_freeaddrinfo" -if test "x$ac_cv_func_freeaddrinfo" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_FREEADDRINFO 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "gethostbyname2" "ac_cv_func_gethostbyname2" +if test "x$ac_cv_func_gethostbyname2" = xyes +then : + printf "%s\n" "#define HAVE_GETHOSTBYNAME2 1" >>confdefs.h fi -done fi -# freeaddrinfo -eval "ac_tr_func=HAVE_`echo freeaddrinfo | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# gethostbyname2 +eval "ac_tr_func=HAVE_`echo gethostbyname2 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_freeaddrinfo=$ac_res" +eval "LIB_gethostbyname2=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_freeaddrinfo=yes" - eval "LIB_freeaddrinfo=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_gethostbyname2=yes" + eval "LIB_gethostbyname2=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_freeaddrinfo=no" - eval "LIB_freeaddrinfo=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_gethostbyname2=no" + eval "LIB_gethostbyname2=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_freeaddrinfo=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_gethostbyname2=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test -n "$LIB_freeaddrinfo"; then - LIBS="$LIB_freeaddrinfo $LIBS" +if test -n "$LIB_gethostbyname2"; then + LIBS="$LIB_gethostbyname2 $LIBS" +fi + + + + +ac_fn_c_check_header_compile "$LINENO" "arpa/nameser.h" "ac_cv_header_arpa_nameser_h" "$ac_includes_default" +if test "x$ac_cv_header_arpa_nameser_h" = xyes +then : + printf "%s\n" "#define HAVE_ARPA_NAMESER_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dns.h" "ac_cv_header_dns_h" "$ac_includes_default" +if test "x$ac_cv_header_dns_h" = xyes +then : + printf "%s\n" "#define HAVE_DNS_H 1" >>confdefs.h + fi -if eval "test \"$ac_cv_func_freeaddrinfo\" != yes"; then - case " $LIBOBJS " in - *" freeaddrinfo.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS freeaddrinfo.$ac_objext" - ;; -esac + +ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "$ac_includes_default +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif + +" +if test "x$ac_cv_header_resolv_h" = xyes +then : + printf "%s\n" "#define HAVE_RESOLV_H 1" >>confdefs.h fi @@ -19186,15 +20748,16 @@ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gai_strerror" >&5 -$as_echo_n "checking for gai_strerror... " >&6; } -if test "${ac_cv_funclib_gai_strerror+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_search" >&5 +printf %s "checking for res_search... " >&6; } +if test ${ac_cv_funclib_res_search+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_gai_strerror\" != yes" ; then +if eval "test \"\$ac_cv_func_res_search\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" ; do + for ac_lib in "" resolv; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -19205,1826 +20768,2317 @@ LIBS=" $ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include + +#include +#ifdef HAVE_SYS_TYPES_H +#include #endif -#ifdef HAVE_WS2TCPIP_H -#include +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include #endif + int -main () +main (void) { -gai_strerror(0) +res_search(0,0,0,0,0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_gai_strerror=$ac_lib; else ac_cv_funclib_gai_strerror=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_res_search=$ac_lib; else ac_cv_funclib_res_search=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_gai_strerror=\${ac_cv_funclib_gai_strerror-no}" + eval "ac_cv_funclib_res_search=\${ac_cv_funclib_res_search-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_gai_strerror" +eval "ac_res=\$ac_cv_funclib_res_search" if false; then - for ac_func in gai_strerror -do : - ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror" -if test "x$ac_cv_func_gai_strerror" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GAI_STRERROR 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "res_search" "ac_cv_func_res_search" +if test "x$ac_cv_func_res_search" = xyes +then : + printf "%s\n" "#define HAVE_RES_SEARCH 1" >>confdefs.h fi -done fi -# gai_strerror -eval "ac_tr_func=HAVE_`echo gai_strerror | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# res_search +eval "ac_tr_func=HAVE_`echo res_search | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_gai_strerror=$ac_res" +eval "LIB_res_search=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_gai_strerror=yes" - eval "LIB_gai_strerror=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_res_search=yes" + eval "LIB_res_search=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_gai_strerror=no" - eval "LIB_gai_strerror=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_res_search=no" + eval "LIB_res_search=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_gai_strerror=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_res_search=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test -n "$LIB_gai_strerror"; then - LIBS="$LIB_gai_strerror $LIBS" -fi - -if eval "test \"$ac_cv_func_gai_strerror\" != yes"; then - case " $LIBOBJS " in - *" gai_strerror.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS gai_strerror.$ac_objext" - ;; -esac - +if test -n "$LIB_res_search"; then + LIBS="$LIB_res_search $LIBS" fi -case "$host_os" in - darwin*) - ;; - *) -$as_echo "#define SUPPORT_DETACH 1" >>confdefs.h - ac_fn_c_check_func "$LINENO" "daemon" "ac_cv_func_daemon" -if test "x$ac_cv_func_daemon" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_DAEMON 1 -_ACEOF -else - case " $LIBOBJS " in - *" daemon.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS daemon.$ac_objext" - ;; -esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_nsearch" >&5 +printf %s "checking for res_nsearch... " >&6; } +if test ${ac_cv_funclib_res_nsearch+y} +then : + printf %s "(cached) " >&6 +else $as_nop -fi - ;; -esac +if eval "test \"\$ac_cv_func_res_nsearch\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" resolv; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -ac_fn_c_check_func "$LINENO" "chown" "ac_cv_func_chown" -if test "x$ac_cv_func_chown" = x""yes; then : +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif -cat >>confdefs.h <<_ACEOF -#define HAVE_CHOWN 1 +int +main (void) +{ +res_nsearch(0,0,0,0,0,0) + ; + return 0; +} _ACEOF - -else - case " $LIBOBJS " in - *" chown.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS chown.$ac_objext" - ;; -esac - +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_res_nsearch=$ac_lib; else ac_cv_funclib_res_nsearch=yes; fi";break fi -ac_fn_c_check_func "$LINENO" "copyhostent" "ac_cv_func_copyhostent" -if test "x$ac_cv_func_copyhostent" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_COPYHOSTENT 1 -_ACEOF - -else - case " $LIBOBJS " in - *" copyhostent.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS copyhostent.$ac_objext" - ;; -esac - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_res_nsearch=\${ac_cv_funclib_res_nsearch-no}" + LIBS="$ac_save_LIBS" fi -ac_fn_c_check_func "$LINENO" "closefrom" "ac_cv_func_closefrom" -if test "x$ac_cv_func_closefrom" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_CLOSEFROM 1 -_ACEOF - -else - case " $LIBOBJS " in - *" closefrom.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS closefrom.$ac_objext" - ;; -esac fi -ac_fn_c_check_func "$LINENO" "ecalloc" "ac_cv_func_ecalloc" -if test "x$ac_cv_func_ecalloc" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_ECALLOC 1 -_ACEOF - -else - case " $LIBOBJS " in - *" ecalloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS ecalloc.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "emalloc" "ac_cv_func_emalloc" -if test "x$ac_cv_func_emalloc" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_EMALLOC 1 -_ACEOF +eval "ac_res=\$ac_cv_funclib_res_nsearch" -else - case " $LIBOBJS " in - *" emalloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS emalloc.$ac_objext" - ;; -esac +if false; then + ac_fn_c_check_func "$LINENO" "res_nsearch" "ac_cv_func_res_nsearch" +if test "x$ac_cv_func_res_nsearch" = xyes +then : + printf "%s\n" "#define HAVE_RES_NSEARCH 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "erealloc" "ac_cv_func_erealloc" -if test "x$ac_cv_func_erealloc" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_EREALLOC 1 -_ACEOF +fi +# res_nsearch +eval "ac_tr_func=HAVE_`echo res_nsearch | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_res_nsearch=$ac_res" -else - case " $LIBOBJS " in - *" erealloc.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS erealloc.$ac_objext" - ;; -esac +case "$ac_res" in + yes) + eval "ac_cv_func_res_nsearch=yes" + eval "LIB_res_nsearch=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -fi -ac_fn_c_check_func "$LINENO" "estrdup" "ac_cv_func_estrdup" -if test "x$ac_cv_func_estrdup" = x""yes; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_res_nsearch=no" + eval "LIB_res_nsearch=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_res_nsearch=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_ESTRDUP 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -else - case " $LIBOBJS " in - *" estrdup.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS estrdup.$ac_objext" - ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; esac -fi -ac_fn_c_check_func "$LINENO" "err" "ac_cv_func_err" -if test "x$ac_cv_func_err" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ERR 1 -_ACEOF +if test -n "$LIB_res_nsearch"; then + LIBS="$LIB_res_nsearch $LIBS" +fi -else - case " $LIBOBJS " in - *" err.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS err.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "errx" "ac_cv_func_errx" -if test "x$ac_cv_func_errx" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_ERRX 1 -_ACEOF -else - case " $LIBOBJS " in - *" errx.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS errx.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "fchown" "ac_cv_func_fchown" -if test "x$ac_cv_func_fchown" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_FCHOWN 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_ndestroy" >&5 +printf %s "checking for res_ndestroy... " >&6; } +if test ${ac_cv_funclib_res_ndestroy+y} +then : + printf %s "(cached) " >&6 +else $as_nop -else - case " $LIBOBJS " in - *" fchown.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS fchown.$ac_objext" - ;; -esac +if eval "test \"\$ac_cv_func_res_ndestroy\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" resolv; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -fi -ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock" -if test "x$ac_cv_func_flock" = x""yes; then : +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif -cat >>confdefs.h <<_ACEOF -#define HAVE_FLOCK 1 +int +main (void) +{ +res_ndestroy(0) + ; + return 0; +} _ACEOF - -else - case " $LIBOBJS " in - *" flock.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS flock.$ac_objext" - ;; -esac +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_res_ndestroy=$ac_lib; else ac_cv_funclib_res_ndestroy=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_res_ndestroy=\${ac_cv_funclib_res_ndestroy-no}" + LIBS="$ac_save_LIBS" +fi fi -ac_fn_c_check_func "$LINENO" "fnmatch" "ac_cv_func_fnmatch" -if test "x$ac_cv_func_fnmatch" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_FNMATCH 1 -_ACEOF -else - case " $LIBOBJS " in - *" fnmatch.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS fnmatch.$ac_objext" - ;; -esac +eval "ac_res=\$ac_cv_funclib_res_ndestroy" + +if false; then + ac_fn_c_check_func "$LINENO" "res_ndestroy" "ac_cv_func_res_ndestroy" +if test "x$ac_cv_func_res_ndestroy" = xyes +then : + printf "%s\n" "#define HAVE_RES_NDESTROY 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "freehostent" "ac_cv_func_freehostent" -if test "x$ac_cv_func_freehostent" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_FREEHOSTENT 1 -_ACEOF +fi +# res_ndestroy +eval "ac_tr_func=HAVE_`echo res_ndestroy | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_res_ndestroy=$ac_res" -else - case " $LIBOBJS " in - *" freehostent.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS freehostent.$ac_objext" - ;; -esac +case "$ac_res" in + yes) + eval "ac_cv_func_res_ndestroy=yes" + eval "LIB_res_ndestroy=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -fi -ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" -if test "x$ac_cv_func_getcwd" = x""yes; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_res_ndestroy=no" + eval "LIB_res_ndestroy=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_res_ndestroy=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_GETCWD 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -else - case " $LIBOBJS " in - *" getcwd.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getcwd.$ac_objext" - ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; esac + +if test -n "$LIB_res_ndestroy"; then + LIBS="$LIB_res_ndestroy $LIBS" fi -ac_fn_c_check_func "$LINENO" "getdtablesize" "ac_cv_func_getdtablesize" -if test "x$ac_cv_func_getdtablesize" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETDTABLESIZE 1 -_ACEOF -else - case " $LIBOBJS " in - *" getdtablesize.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getdtablesize.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "getegid" "ac_cv_func_getegid" -if test "x$ac_cv_func_getegid" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETEGID 1 -_ACEOF -else - case " $LIBOBJS " in - *" getegid.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getegid.$ac_objext" - ;; -esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dns_search" >&5 +printf %s "checking for dns_search... " >&6; } +if test ${ac_cv_funclib_dns_search+y} +then : + printf %s "(cached) " >&6 +else $as_nop -fi -ac_fn_c_check_func "$LINENO" "geteuid" "ac_cv_func_geteuid" -if test "x$ac_cv_func_geteuid" = x""yes; then : +if eval "test \"\$ac_cv_func_dns_search\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -cat >>confdefs.h <<_ACEOF -#define HAVE_GETEUID 1 -_ACEOF +#ifdef HAVE_DNS_H +#include +#endif -else - case " $LIBOBJS " in - *" geteuid.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS geteuid.$ac_objext" - ;; -esac +int +main (void) +{ +dns_search(0,0,0,0,0,0,0,0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dns_search=$ac_lib; else ac_cv_funclib_dns_search=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_dns_search=\${ac_cv_funclib_dns_search-no}" + LIBS="$ac_save_LIBS" +fi fi -ac_fn_c_check_func "$LINENO" "getgid" "ac_cv_func_getgid" -if test "x$ac_cv_func_getgid" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETGID 1 -_ACEOF -else - case " $LIBOBJS " in - *" getgid.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getgid.$ac_objext" - ;; -esac +eval "ac_res=\$ac_cv_funclib_dns_search" + +if false; then + ac_fn_c_check_func "$LINENO" "dns_search" "ac_cv_func_dns_search" +if test "x$ac_cv_func_dns_search" = xyes +then : + printf "%s\n" "#define HAVE_DNS_SEARCH 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" -if test "x$ac_cv_func_gethostname" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETHOSTNAME 1 -_ACEOF +fi +# dns_search +eval "ac_tr_func=HAVE_`echo dns_search | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_dns_search=$ac_res" -else - case " $LIBOBJS " in - *" gethostname.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS gethostname.$ac_objext" - ;; -esac +case "$ac_res" in + yes) + eval "ac_cv_func_dns_search=yes" + eval "LIB_dns_search=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -fi -ac_fn_c_check_func "$LINENO" "getifaddrs" "ac_cv_func_getifaddrs" -if test "x$ac_cv_func_getifaddrs" = x""yes; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_dns_search=no" + eval "LIB_dns_search=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_dns_search=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_GETIFADDRS 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -else - case " $LIBOBJS " in - *" getifaddrs.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getifaddrs.$ac_objext" - ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; esac -fi -ac_fn_c_check_func "$LINENO" "getipnodebyaddr" "ac_cv_func_getipnodebyaddr" -if test "x$ac_cv_func_getipnodebyaddr" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETIPNODEBYADDR 1 -_ACEOF -else - case " $LIBOBJS " in - *" getipnodebyaddr.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getipnodebyaddr.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "getipnodebyname" "ac_cv_func_getipnodebyname" -if test "x$ac_cv_func_getipnodebyname" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETIPNODEBYNAME 1 -_ACEOF -else - case " $LIBOBJS " in - *" getipnodebyname.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getipnodebyname.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "getopt" "ac_cv_func_getopt" -if test "x$ac_cv_func_getopt" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETOPT 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dn_expand" >&5 +printf %s "checking for dn_expand... " >&6; } +if test ${ac_cv_funclib_dn_expand+y} +then : + printf %s "(cached) " >&6 +else $as_nop -else - case " $LIBOBJS " in - *" getopt.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getopt.$ac_objext" - ;; -esac +if eval "test \"\$ac_cv_func_dn_expand\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" resolv; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -fi -ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = x""yes; then : +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif -cat >>confdefs.h <<_ACEOF -#define HAVE_GETTIMEOFDAY 1 +int +main (void) +{ +dn_expand(0,0,0,0,0) + ; + return 0; +} _ACEOF - -else - case " $LIBOBJS " in - *" gettimeofday.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS gettimeofday.$ac_objext" - ;; -esac +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dn_expand=$ac_lib; else ac_cv_funclib_dn_expand=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_dn_expand=\${ac_cv_funclib_dn_expand-no}" + LIBS="$ac_save_LIBS" +fi fi -ac_fn_c_check_func "$LINENO" "getuid" "ac_cv_func_getuid" -if test "x$ac_cv_func_getuid" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETUID 1 -_ACEOF -else - case " $LIBOBJS " in - *" getuid.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getuid.$ac_objext" - ;; -esac +eval "ac_res=\$ac_cv_funclib_dn_expand" + +if false; then + ac_fn_c_check_func "$LINENO" "dn_expand" "ac_cv_func_dn_expand" +if test "x$ac_cv_func_dn_expand" = xyes +then : + printf "%s\n" "#define HAVE_DN_EXPAND 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "getusershell" "ac_cv_func_getusershell" -if test "x$ac_cv_func_getusershell" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_GETUSERSHELL 1 -_ACEOF +fi +# dn_expand +eval "ac_tr_func=HAVE_`echo dn_expand | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_dn_expand=$ac_res" -else - case " $LIBOBJS " in - *" getusershell.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getusershell.$ac_objext" - ;; -esac +case "$ac_res" in + yes) + eval "ac_cv_func_dn_expand=yes" + eval "LIB_dn_expand=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -fi -ac_fn_c_check_func "$LINENO" "initgroups" "ac_cv_func_initgroups" -if test "x$ac_cv_func_initgroups" = x""yes; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_dn_expand=no" + eval "LIB_dn_expand=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_dn_expand=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_INITGROUPS 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -else - case " $LIBOBJS " in - *" initgroups.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS initgroups.$ac_objext" - ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; esac -fi -ac_fn_c_check_func "$LINENO" "innetgr" "ac_cv_func_innetgr" -if test "x$ac_cv_func_innetgr" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_INNETGR 1 -_ACEOF +if test -n "$LIB_dn_expand"; then + LIBS="$LIB_dn_expand $LIBS" +fi -else - case " $LIBOBJS " in - *" innetgr.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS innetgr.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "iruserok" "ac_cv_func_iruserok" -if test "x$ac_cv_func_iruserok" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_IRUSEROK 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for _res" >&5 +printf %s "checking for _res... " >&6; } +if test ${ac_cv_var__res+y} +then : + printf %s "(cached) " >&6 +else $as_nop -else - case " $LIBOBJS " in - *" iruserok.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS iruserok.$ac_objext" - ;; -esac + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif + void * foo(void) { return &_res; } +int +main (void) +{ +foo() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var__res=yes +else $as_nop + ac_cv_var__res=no fi -ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" -if test "x$ac_cv_func_localtime_r" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_LOCALTIME_R 1 +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_var__res" != yes ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif +extern int _res; +int foo(void) { return _res; } +int +main (void) +{ +foo() + ; + return 0; +} _ACEOF - -else - case " $LIBOBJS " in - *" localtime_r.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS localtime_r.$ac_objext" - ;; -esac +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var__res=yes +else $as_nop + ac_cv_var__res=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi fi -ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" -if test "x$ac_cv_func_lstat" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_LSTAT 1 -_ACEOF +ac_foo=`eval echo \\$ac_cv_var__res` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then -else - case " $LIBOBJS " in - *" lstat.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS lstat.$ac_objext" - ;; -esac +printf "%s\n" "#define HAVE__RES 1" >>confdefs.h + ac_fn_check_decl "$LINENO" "_res" "ac_cv_have_decl__res" "#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_NAMESER_H +#include +#endif +#ifdef HAVE_RESOLV_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl__res" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 fi -ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" -if test "x$ac_cv_func_memmove" = x""yes; then : +printf "%s\n" "#define HAVE_DECL__RES $ac_have_decl" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_MEMMOVE 1 -_ACEOF +fi -else - case " $LIBOBJS " in - *" memmove.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS memmove.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" -if test "x$ac_cv_func_mkstemp" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_MKSTEMP 1 -_ACEOF -else - case " $LIBOBJS " in - *" mkstemp.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS mkstemp.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" -if test "x$ac_cv_func_putenv" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working snprintf" >&5 +printf %s "checking for working snprintf... " >&6; } +if test ${ac_cv_func_snprintf_working+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_func_snprintf_working=yes +if test "$cross_compiling" = yes +then : + : +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -cat >>confdefs.h <<_ACEOF -#define HAVE_PUTENV 1 +#include +#include +int main(int argc, char **argv) +{ + char foo[3]; + snprintf(foo, 2, "12"); + return strcmp(foo, "1") || snprintf(NULL, 0, "%d", 12) != 2; +} _ACEOF - -else - case " $LIBOBJS " in - *" putenv.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS putenv.$ac_objext" - ;; -esac +if ac_fn_c_try_run "$LINENO" +then : + : +else $as_nop + ac_cv_func_snprintf_working=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 -ac_fn_c_check_func "$LINENO" "rcmd" "ac_cv_func_rcmd" -if test "x$ac_cv_func_rcmd" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_snprintf_working" >&5 +printf "%s\n" "$ac_cv_func_snprintf_working" >&6; } -cat >>confdefs.h <<_ACEOF -#define HAVE_RCMD 1 -_ACEOF +if test "$ac_cv_func_snprintf_working" = yes; then -else - case " $LIBOBJS " in - *" rcmd.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS rcmd.$ac_objext" - ;; -esac +printf "%s\n" "#define HAVE_SNPRINTF 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "readv" "ac_cv_func_readv" -if test "x$ac_cv_func_readv" = x""yes; then : +if test "$ac_cv_func_snprintf_working" = yes; then -cat >>confdefs.h <<_ACEOF -#define HAVE_READV 1 +if test "$ac_cv_func_snprintf+set" != set -o "$ac_cv_func_snprintf" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if snprintf needs a prototype" >&5 +printf %s "checking if snprintf needs a prototype... " >&6; } +if test ${ac_cv_func_snprintf_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +struct foo { int foo; } xx; +extern int snprintf (struct foo*); +int +main (void) +{ +snprintf(&xx) + ; + return 0; +} _ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_snprintf_noproto=yes" +else $as_nop + eval "ac_cv_func_snprintf_noproto=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_snprintf_noproto" >&5 +printf "%s\n" "$ac_cv_func_snprintf_noproto" >&6; } +if test "$ac_cv_func_snprintf_noproto" = yes; then -else - case " $LIBOBJS " in - *" readv.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS readv.$ac_objext" - ;; -esac +printf "%s\n" "#define NEED_SNPRINTF_PROTO 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "recvmsg" "ac_cv_func_recvmsg" -if test "x$ac_cv_func_recvmsg" = x""yes; then : +fi -cat >>confdefs.h <<_ACEOF -#define HAVE_RECVMSG 1 -_ACEOF +fi -else - case " $LIBOBJS " in - *" recvmsg.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS recvmsg.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "sendmsg" "ac_cv_func_sendmsg" -if test "x$ac_cv_func_sendmsg" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working vsnprintf" >&5 +printf %s "checking for working vsnprintf... " >&6; } +if test ${ac_cv_func_vsnprintf_working+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_func_vsnprintf_working=yes +if test "$cross_compiling" = yes +then : + : +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -cat >>confdefs.h <<_ACEOF -#define HAVE_SENDMSG 1 -_ACEOF +#include +#include +#include -else - case " $LIBOBJS " in - *" sendmsg.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS sendmsg.$ac_objext" - ;; -esac +int foo(int num, ...) +{ + char bar[3]; + va_list arg; + va_start(arg, num); + vsnprintf(bar, 2, "%s", arg); + va_end(arg); + return strcmp(bar, "1"); +} -fi -ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid" -if test "x$ac_cv_func_setegid" = x""yes; then : +int bar(int num, int len, ...) +{ + int r; + va_list arg; + va_start(arg, len); + r = vsnprintf(NULL, 0, "%s", arg); + va_end(arg); + return r != len; +} -cat >>confdefs.h <<_ACEOF -#define HAVE_SETEGID 1 +int main(int argc, char **argv) +{ + return foo(0, "12") || bar(0, 2, "12"); +} _ACEOF - -else - case " $LIBOBJS " in - *" setegid.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS setegid.$ac_objext" - ;; -esac - +if ac_fn_c_try_run "$LINENO" +then : + : +else $as_nop + ac_cv_func_vsnprintf_working=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" -if test "x$ac_cv_func_setenv" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_SETENV 1 -_ACEOF - -else - case " $LIBOBJS " in - *" setenv.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS setenv.$ac_objext" - ;; -esac fi -ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" -if test "x$ac_cv_func_seteuid" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vsnprintf_working" >&5 +printf "%s\n" "$ac_cv_func_vsnprintf_working" >&6; } -cat >>confdefs.h <<_ACEOF -#define HAVE_SETEUID 1 -_ACEOF +if test "$ac_cv_func_vsnprintf_working" = yes; then -else - case " $LIBOBJS " in - *" seteuid.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS seteuid.$ac_objext" - ;; -esac +printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" -if test "x$ac_cv_func_strcasecmp" = x""yes; then : +if test "$ac_cv_func_vsnprintf_working" = yes; then -cat >>confdefs.h <<_ACEOF -#define HAVE_STRCASECMP 1 +if test "$ac_cv_func_vsnprintf+set" != set -o "$ac_cv_func_vsnprintf" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if vsnprintf needs a prototype" >&5 +printf %s "checking if vsnprintf needs a prototype... " >&6; } +if test ${ac_cv_func_vsnprintf_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +struct foo { int foo; } xx; +extern int vsnprintf (struct foo*); +int +main (void) +{ +vsnprintf(&xx) + ; + return 0; +} _ACEOF - -else - case " $LIBOBJS " in - *" strcasecmp.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext" - ;; -esac - +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_vsnprintf_noproto=yes" +else $as_nop + eval "ac_cv_func_vsnprintf_noproto=no" fi -ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" -if test "x$ac_cv_func_strdup" = x""yes; then : +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vsnprintf_noproto" >&5 +printf "%s\n" "$ac_cv_func_vsnprintf_noproto" >&6; } +if test "$ac_cv_func_vsnprintf_noproto" = yes; then -cat >>confdefs.h <<_ACEOF -#define HAVE_STRDUP 1 -_ACEOF +printf "%s\n" "#define NEED_VSNPRINTF_PROTO 1" >>confdefs.h -else - case " $LIBOBJS " in - *" strdup.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strdup.$ac_objext" - ;; -esac +fi +fi fi -ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" -if test "x$ac_cv_func_strerror" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRERROR 1 -_ACEOF -else - case " $LIBOBJS " in - *" strerror.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strerror.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" -if test "x$ac_cv_func_strftime" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working glob" >&5 +printf %s "checking for working glob... " >&6; } +if test ${ac_cv_func_glob_working+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_func_glob_working=yes +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -cat >>confdefs.h <<_ACEOF -#define HAVE_STRFTIME 1 -_ACEOF +#include +#include +int +main (void) +{ -else - case " $LIBOBJS " in - *" strftime.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strftime.$ac_objext" - ;; -esac +glob(NULL, GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE| +#ifdef GLOB_MAXPATH +GLOB_MAXPATH +#else +GLOB_LIMIT +#endif +, +NULL, NULL); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + : +else $as_nop + ac_cv_func_glob_working=no fi -ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat" -if test "x$ac_cv_func_strlcat" = x""yes; then : +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_glob_working" >&5 +printf "%s\n" "$ac_cv_func_glob_working" >&6; } -cat >>confdefs.h <<_ACEOF -#define HAVE_STRLCAT 1 -_ACEOF +if test "$ac_cv_func_glob_working" = yes; then -else - case " $LIBOBJS " in - *" strlcat.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strlcat.$ac_objext" - ;; -esac +printf "%s\n" "#define HAVE_GLOB 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" -if test "x$ac_cv_func_strlcpy" = x""yes; then : +if test "$ac_cv_func_glob_working" = yes; then -cat >>confdefs.h <<_ACEOF -#define HAVE_STRLCPY 1 +if test "$ac_cv_func_glob+set" != set -o "$ac_cv_func_glob" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if glob needs a prototype" >&5 +printf %s "checking if glob needs a prototype... " >&6; } +if test ${ac_cv_func_glob_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct foo { int foo; } xx; +extern int glob (struct foo*); +int +main (void) +{ +glob(&xx) + ; + return 0; +} _ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_glob_noproto=yes" +else $as_nop + eval "ac_cv_func_glob_noproto=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_glob_noproto" >&5 +printf "%s\n" "$ac_cv_func_glob_noproto" >&6; } +if test "$ac_cv_func_glob_noproto" = yes; then -else - case " $LIBOBJS " in - *" strlcpy.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strlcpy.$ac_objext" - ;; -esac +printf "%s\n" "#define NEED_GLOB_PROTO 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strlwr" "ac_cv_func_strlwr" -if test "x$ac_cv_func_strlwr" = x""yes; then : +fi -cat >>confdefs.h <<_ACEOF -#define HAVE_STRLWR 1 -_ACEOF +fi -else - case " $LIBOBJS " in - *" strlwr.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strlwr.$ac_objext" +if test "$ac_cv_func_glob_working" != yes; then + case " $LIBOBJS " in + *" glob.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS glob.$ac_objext" ;; esac fi -ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" -if test "x$ac_cv_func_strncasecmp" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRNCASECMP 1 -_ACEOF - + if test "$ac_cv_func_glob_working" = yes; then + have_glob_h_TRUE= + have_glob_h_FALSE='#' else - case " $LIBOBJS " in - *" strncasecmp.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strncasecmp.$ac_objext" - ;; -esac - + have_glob_h_TRUE='#' + have_glob_h_FALSE= fi -ac_fn_c_check_func "$LINENO" "strndup" "ac_cv_func_strndup" -if test "x$ac_cv_func_strndup" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRNDUP 1 -_ACEOF -else - case " $LIBOBJS " in - *" strndup.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strndup.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen" -if test "x$ac_cv_func_strnlen" = x""yes; then : +ac_fn_c_check_func "$LINENO" "asnprintf" "ac_cv_func_asnprintf" +if test "x$ac_cv_func_asnprintf" = xyes +then : + printf "%s\n" "#define HAVE_ASNPRINTF 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_STRNLEN 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "asprintf" "ac_cv_func_asprintf" +if test "x$ac_cv_func_asprintf" = xyes +then : + printf "%s\n" "#define HAVE_ASPRINTF 1" >>confdefs.h -else - case " $LIBOBJS " in - *" strnlen.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strnlen.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "atexit" "ac_cv_func_atexit" +if test "x$ac_cv_func_atexit" = xyes +then : + printf "%s\n" "#define HAVE_ATEXIT 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strptime" "ac_cv_func_strptime" -if test "x$ac_cv_func_strptime" = x""yes; then : +ac_fn_c_check_func "$LINENO" "cgetent" "ac_cv_func_cgetent" +if test "x$ac_cv_func_cgetent" = xyes +then : + printf "%s\n" "#define HAVE_CGETENT 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_STRPTIME 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "getauxval" "ac_cv_func_getauxval" +if test "x$ac_cv_func_getauxval" = xyes +then : + printf "%s\n" "#define HAVE_GETAUXVAL 1" >>confdefs.h -else - case " $LIBOBJS " in - *" strptime.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strptime.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "getconfattr" "ac_cv_func_getconfattr" +if test "x$ac_cv_func_getconfattr" = xyes +then : + printf "%s\n" "#define HAVE_GETCONFATTR 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep" -if test "x$ac_cv_func_strsep" = x""yes; then : +ac_fn_c_check_func "$LINENO" "getprogname" "ac_cv_func_getprogname" +if test "x$ac_cv_func_getprogname" = xyes +then : + printf "%s\n" "#define HAVE_GETPROGNAME 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_STRSEP 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "getrlimit" "ac_cv_func_getrlimit" +if test "x$ac_cv_func_getrlimit" = xyes +then : + printf "%s\n" "#define HAVE_GETRLIMIT 1" >>confdefs.h -else - case " $LIBOBJS " in - *" strsep.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strsep.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "getspnam" "ac_cv_func_getspnam" +if test "x$ac_cv_func_getspnam" = xyes +then : + printf "%s\n" "#define HAVE_GETSPNAM 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strsep_copy" "ac_cv_func_strsep_copy" -if test "x$ac_cv_func_strsep_copy" = x""yes; then : +ac_fn_c_check_func "$LINENO" "issetugid" "ac_cv_func_issetugid" +if test "x$ac_cv_func_issetugid" = xyes +then : + printf "%s\n" "#define HAVE_ISSETUGID 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_STRSEP_COPY 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "on_exit" "ac_cv_func_on_exit" +if test "x$ac_cv_func_on_exit" = xyes +then : + printf "%s\n" "#define HAVE_ON_EXIT 1" >>confdefs.h -else - case " $LIBOBJS " in - *" strsep_copy.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strsep_copy.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" +if test "x$ac_cv_func_poll" = xyes +then : + printf "%s\n" "#define HAVE_POLL 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strtok_r" "ac_cv_func_strtok_r" -if test "x$ac_cv_func_strtok_r" = x""yes; then : +ac_fn_c_check_func "$LINENO" "random" "ac_cv_func_random" +if test "x$ac_cv_func_random" = xyes +then : + printf "%s\n" "#define HAVE_RANDOM 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_STRTOK_R 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "setprogname" "ac_cv_func_setprogname" +if test "x$ac_cv_func_setprogname" = xyes +then : + printf "%s\n" "#define HAVE_SETPROGNAME 1" >>confdefs.h -else - case " $LIBOBJS " in - *" strtok_r.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strtok_r.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "strsvis" "ac_cv_func_strsvis" +if test "x$ac_cv_func_strsvis" = xyes +then : + printf "%s\n" "#define HAVE_STRSVIS 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "strupr" "ac_cv_func_strupr" -if test "x$ac_cv_func_strupr" = x""yes; then : +ac_fn_c_check_func "$LINENO" "strsvisx" "ac_cv_func_strsvisx" +if test "x$ac_cv_func_strsvisx" = xyes +then : + printf "%s\n" "#define HAVE_STRSVISX 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUPR 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "strunvis" "ac_cv_func_strunvis" +if test "x$ac_cv_func_strunvis" = xyes +then : + printf "%s\n" "#define HAVE_STRUNVIS 1" >>confdefs.h -else - case " $LIBOBJS " in - *" strupr.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS strupr.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "strvis" "ac_cv_func_strvis" +if test "x$ac_cv_func_strvis" = xyes +then : + printf "%s\n" "#define HAVE_STRVIS 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "swab" "ac_cv_func_swab" -if test "x$ac_cv_func_swab" = x""yes; then : +ac_fn_c_check_func "$LINENO" "strvisx" "ac_cv_func_strvisx" +if test "x$ac_cv_func_strvisx" = xyes +then : + printf "%s\n" "#define HAVE_STRVISX 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_SWAB 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "svis" "ac_cv_func_svis" +if test "x$ac_cv_func_svis" = xyes +then : + printf "%s\n" "#define HAVE_SVIS 1" >>confdefs.h -else - case " $LIBOBJS " in - *" swab.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS swab.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf" +if test "x$ac_cv_func_sysconf" = xyes +then : + printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch" -if test "x$ac_cv_func_tsearch" = x""yes; then : +ac_fn_c_check_func "$LINENO" "sysctl" "ac_cv_func_sysctl" +if test "x$ac_cv_func_sysctl" = xyes +then : + printf "%s\n" "#define HAVE_SYSCTL 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_TSEARCH 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "tdelete" "ac_cv_func_tdelete" +if test "x$ac_cv_func_tdelete" = xyes +then : + printf "%s\n" "#define HAVE_TDELETE 1" >>confdefs.h -else - case " $LIBOBJS " in - *" tsearch.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS tsearch.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "tfind" "ac_cv_func_tfind" +if test "x$ac_cv_func_tfind" = xyes +then : + printf "%s\n" "#define HAVE_TFIND 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" -if test "x$ac_cv_func_timegm" = x""yes; then : +ac_fn_c_check_func "$LINENO" "twalk" "ac_cv_func_twalk" +if test "x$ac_cv_func_twalk" = xyes +then : + printf "%s\n" "#define HAVE_TWALK 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_TIMEGM 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname" +if test "x$ac_cv_func_uname" = xyes +then : + printf "%s\n" "#define HAVE_UNAME 1" >>confdefs.h -else - case " $LIBOBJS " in - *" timegm.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS timegm.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "unvis" "ac_cv_func_unvis" +if test "x$ac_cv_func_unvis" = xyes +then : + printf "%s\n" "#define HAVE_UNVIS 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" -if test "x$ac_cv_func_unsetenv" = x""yes; then : +ac_fn_c_check_func "$LINENO" "vasnprintf" "ac_cv_func_vasnprintf" +if test "x$ac_cv_func_vasnprintf" = xyes +then : + printf "%s\n" "#define HAVE_VASNPRINTF 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_UNSETENV 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "vasprintf" "ac_cv_func_vasprintf" +if test "x$ac_cv_func_vasprintf" = xyes +then : + printf "%s\n" "#define HAVE_VASPRINTF 1" >>confdefs.h -else - case " $LIBOBJS " in - *" unsetenv.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS unsetenv.$ac_objext" - ;; -esac +fi +ac_fn_c_check_func "$LINENO" "vis" "ac_cv_func_vis" +if test "x$ac_cv_func_vis" = xyes +then : + printf "%s\n" "#define HAVE_VIS 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "verr" "ac_cv_func_verr" -if test "x$ac_cv_func_verr" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_VERR 1 -_ACEOF -else - case " $LIBOBJS " in - *" verr.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS verr.$ac_objext" +if test "$ac_cv_func_cgetent" = no; then + case " $LIBOBJS " in + *" getcap.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getcap.$ac_objext" ;; esac fi -ac_fn_c_check_func "$LINENO" "verrx" "ac_cv_func_verrx" -if test "x$ac_cv_func_verrx" = x""yes; then : + if test "$ac_cv_func_cgetent" = yes; then + have_cgetent_TRUE= + have_cgetent_FALSE='#' +else + have_cgetent_TRUE='#' + have_cgetent_FALSE= +fi -cat >>confdefs.h <<_ACEOF -#define HAVE_VERRX 1 -_ACEOF -else - case " $LIBOBJS " in - *" verrx.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS verrx.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "vsyslog" "ac_cv_func_vsyslog" -if test "x$ac_cv_func_vsyslog" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_VSYSLOG 1 -_ACEOF -else - case " $LIBOBJS " in - *" vsyslog.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS vsyslog.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "vwarn" "ac_cv_func_vwarn" -if test "x$ac_cv_func_vwarn" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_VWARN 1 -_ACEOF -else - case " $LIBOBJS " in - *" vwarn.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS vwarn.$ac_objext" - ;; -esac -fi -ac_fn_c_check_func "$LINENO" "vwarnx" "ac_cv_func_vwarnx" -if test "x$ac_cv_func_vwarnx" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getsockopt" >&5 +printf %s "checking for getsockopt... " >&6; } +if test ${ac_cv_funclib_getsockopt+y} +then : + printf %s "(cached) " >&6 +else $as_nop -cat >>confdefs.h <<_ACEOF -#define HAVE_VWARNX 1 +if eval "test \"\$ac_cv_func_getsockopt\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +int +main (void) +{ +getsockopt(0,0,0,0,0) + ; + return 0; +} _ACEOF - -else - case " $LIBOBJS " in - *" vwarnx.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS vwarnx.$ac_objext" - ;; -esac +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_getsockopt=$ac_lib; else ac_cv_funclib_getsockopt=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_getsockopt=\${ac_cv_funclib_getsockopt-no}" + LIBS="$ac_save_LIBS" +fi fi -ac_fn_c_check_func "$LINENO" "warn" "ac_cv_func_warn" -if test "x$ac_cv_func_warn" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_WARN 1 -_ACEOF -else - case " $LIBOBJS " in - *" warn.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS warn.$ac_objext" - ;; -esac +eval "ac_res=\$ac_cv_funclib_getsockopt" + +if false; then + ac_fn_c_check_func "$LINENO" "getsockopt" "ac_cv_func_getsockopt" +if test "x$ac_cv_func_getsockopt" = xyes +then : + printf "%s\n" "#define HAVE_GETSOCKOPT 1" >>confdefs.h fi -ac_fn_c_check_func "$LINENO" "warnx" "ac_cv_func_warnx" -if test "x$ac_cv_func_warnx" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_WARNX 1 -_ACEOF +fi +# getsockopt +eval "ac_tr_func=HAVE_`echo getsockopt | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_getsockopt=$ac_res" -else - case " $LIBOBJS " in - *" warnx.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS warnx.$ac_objext" - ;; -esac +case "$ac_res" in + yes) + eval "ac_cv_func_getsockopt=yes" + eval "LIB_getsockopt=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -fi -ac_fn_c_check_func "$LINENO" "writev" "ac_cv_func_writev" -if test "x$ac_cv_func_writev" = x""yes; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_getsockopt=no" + eval "LIB_getsockopt=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_getsockopt=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_WRITEV 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -else - case " $LIBOBJS " in - *" writev.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS writev.$ac_objext" - ;; + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; esac -fi - if test "$ac_cv_header_fnmatch_h" = yes -a "$ac_cv_func_fnmatch" = yes; then - have_fnmatch_h_TRUE= - have_fnmatch_h_FALSE='#' -else - have_fnmatch_h_TRUE='#' - have_fnmatch_h_FALSE= -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for setsockopt" >&5 +printf %s "checking for setsockopt... " >&6; } +if test ${ac_cv_funclib_setsockopt+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if test "$ac_cv_func_strndup+set" != set -o "$ac_cv_func_strndup" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strndup needs a prototype" >&5 -$as_echo_n "checking if strndup needs a prototype... " >&6; } -if test "${ac_cv_func_strndup_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if eval "test \"\$ac_cv_func_setsockopt\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int strndup (struct foo*); +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif int -main () +main (void) { -strndup(&xx) +setsockopt(0,0,0,0,0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strndup_noproto=yes" -else - eval "ac_cv_func_strndup_noproto=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_setsockopt=$ac_lib; else ac_cv_funclib_setsockopt=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_setsockopt=\${ac_cv_funclib_setsockopt-no}" + LIBS="$ac_save_LIBS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strndup_noproto" >&5 -$as_echo "$ac_cv_func_strndup_noproto" >&6; } -if test "$ac_cv_func_strndup_noproto" = yes; then -$as_echo "#define NEED_STRNDUP_PROTO 1" >>confdefs.h + +eval "ac_res=\$ac_cv_funclib_setsockopt" + +if false; then + ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" +if test "x$ac_cv_func_setsockopt" = xyes +then : + printf "%s\n" "#define HAVE_SETSOCKOPT 1" >>confdefs.h fi + fi +# setsockopt +eval "ac_tr_func=HAVE_`echo setsockopt | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_setsockopt=$ac_res" -if test "$ac_cv_func_strsep+set" != set -o "$ac_cv_func_strsep" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strsep needs a prototype" >&5 -$as_echo_n "checking if strsep needs a prototype... " >&6; } -if test "${ac_cv_func_strsep_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +case "$ac_res" in + yes) + eval "ac_cv_func_setsockopt=yes" + eval "LIB_setsockopt=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_setsockopt=no" + eval "LIB_setsockopt=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_setsockopt=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for hstrerror" >&5 +printf %s "checking for hstrerror... " >&6; } +if test ${ac_cv_funclib_hstrerror+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_hstrerror\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" resolv; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int strsep (struct foo*); +#ifdef HAVE_NETDB_H +#include +#endif int -main () +main (void) { -strsep(&xx) +hstrerror(17) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strsep_noproto=yes" -else - eval "ac_cv_func_strsep_noproto=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_hstrerror=$ac_lib; else ac_cv_funclib_hstrerror=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_hstrerror=\${ac_cv_funclib_hstrerror-no}" + LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strsep_noproto" >&5 -$as_echo "$ac_cv_func_strsep_noproto" >&6; } -if test "$ac_cv_func_strsep_noproto" = yes; then -$as_echo "#define NEED_STRSEP_PROTO 1" >>confdefs.h +fi + + +eval "ac_res=\$ac_cv_funclib_hstrerror" + +if false; then + ac_fn_c_check_func "$LINENO" "hstrerror" "ac_cv_func_hstrerror" +if test "x$ac_cv_func_hstrerror" = xyes +then : + printf "%s\n" "#define HAVE_HSTRERROR 1" >>confdefs.h fi + fi +# hstrerror +eval "ac_tr_func=HAVE_`echo hstrerror | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_hstrerror=$ac_res" -if test "$ac_cv_func_strtok_r+set" != set -o "$ac_cv_func_strtok_r" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strtok_r needs a prototype" >&5 -$as_echo_n "checking if strtok_r needs a prototype... " >&6; } -if test "${ac_cv_func_strtok_r_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +case "$ac_res" in + yes) + eval "ac_cv_func_hstrerror=yes" + eval "LIB_hstrerror=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_hstrerror=no" + eval "LIB_hstrerror=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_hstrerror=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + +if test -n "$LIB_hstrerror"; then + LIBS="$LIB_hstrerror $LIBS" +fi + +if eval "test \"$ac_cv_func_hstrerror\" != yes"; then + case " $LIBOBJS " in + *" hstrerror.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS hstrerror.$ac_objext" + ;; +esac + +fi + + +if test "$ac_cv_func_hstrerror+set" != set -o "$ac_cv_func_hstrerror" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if hstrerror needs a prototype" >&5 +printf %s "checking if hstrerror needs a prototype... " >&6; } +if test ${ac_cv_func_hstrerror_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + +#ifdef HAVE_NETDB_H +#include +#endif struct foo { int foo; } xx; -extern int strtok_r (struct foo*); +extern int hstrerror (struct foo*); int -main () +main (void) { -strtok_r(&xx) +hstrerror(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strtok_r_noproto=yes" -else - eval "ac_cv_func_strtok_r_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_hstrerror_noproto=yes" +else $as_nop + eval "ac_cv_func_hstrerror_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtok_r_noproto" >&5 -$as_echo "$ac_cv_func_strtok_r_noproto" >&6; } -if test "$ac_cv_func_strtok_r_noproto" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_hstrerror_noproto" >&5 +printf "%s\n" "$ac_cv_func_hstrerror_noproto" >&6; } +if test "$ac_cv_func_hstrerror_noproto" = yes; then -$as_echo "#define NEED_STRTOK_R_PROTO 1" >>confdefs.h +printf "%s\n" "#define NEED_HSTRERROR_PROTO 1" >>confdefs.h fi fi -if test "$ac_cv_func_strsvis+set" != set -o "$ac_cv_func_strsvis" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strsvis needs a prototype" >&5 -$as_echo_n "checking if strsvis needs a prototype... " >&6; } -if test "${ac_cv_func_strsvis_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +if test "$ac_cv_func_asprintf+set" != set -o "$ac_cv_func_asprintf" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if asprintf needs a prototype" >&5 +printf %s "checking if asprintf needs a prototype... " >&6; } +if test ${ac_cv_func_asprintf_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include -#endif + + #include + #include struct foo { int foo; } xx; -extern int strsvis (struct foo*); +extern int asprintf (struct foo*); int -main () +main (void) { -strsvis(&xx) +asprintf(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strsvis_noproto=yes" -else - eval "ac_cv_func_strsvis_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_asprintf_noproto=yes" +else $as_nop + eval "ac_cv_func_asprintf_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strsvis_noproto" >&5 -$as_echo "$ac_cv_func_strsvis_noproto" >&6; } -if test "$ac_cv_func_strsvis_noproto" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_asprintf_noproto" >&5 +printf "%s\n" "$ac_cv_func_asprintf_noproto" >&6; } +if test "$ac_cv_func_asprintf_noproto" = yes; then -$as_echo "#define NEED_STRSVIS_PROTO 1" >>confdefs.h +printf "%s\n" "#define NEED_ASPRINTF_PROTO 1" >>confdefs.h fi fi -if test "$ac_cv_func_strsvisx+set" != set -o "$ac_cv_func_strsvisx" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strsvisx needs a prototype" >&5 -$as_echo_n "checking if strsvisx needs a prototype... " >&6; } -if test "${ac_cv_func_strsvisx_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +if test "$ac_cv_func_vasprintf+set" != set -o "$ac_cv_func_vasprintf" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if vasprintf needs a prototype" >&5 +printf %s "checking if vasprintf needs a prototype... " >&6; } +if test ${ac_cv_func_vasprintf_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include -#endif + + #include + #include struct foo { int foo; } xx; -extern int strsvisx (struct foo*); +extern int vasprintf (struct foo*); int -main () +main (void) { -strsvisx(&xx) +vasprintf(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strsvisx_noproto=yes" -else - eval "ac_cv_func_strsvisx_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_vasprintf_noproto=yes" +else $as_nop + eval "ac_cv_func_vasprintf_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strsvisx_noproto" >&5 -$as_echo "$ac_cv_func_strsvisx_noproto" >&6; } -if test "$ac_cv_func_strsvisx_noproto" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vasprintf_noproto" >&5 +printf "%s\n" "$ac_cv_func_vasprintf_noproto" >&6; } +if test "$ac_cv_func_vasprintf_noproto" = yes; then -$as_echo "#define NEED_STRSVISX_PROTO 1" >>confdefs.h +printf "%s\n" "#define NEED_VASPRINTF_PROTO 1" >>confdefs.h fi fi -if test "$ac_cv_func_strunvis+set" != set -o "$ac_cv_func_strunvis" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strunvis needs a prototype" >&5 -$as_echo_n "checking if strunvis needs a prototype... " >&6; } -if test "${ac_cv_func_strunvis_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +if test "$ac_cv_func_asnprintf+set" != set -o "$ac_cv_func_asnprintf" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if asnprintf needs a prototype" >&5 +printf %s "checking if asnprintf needs a prototype... " >&6; } +if test ${ac_cv_func_asnprintf_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include -#endif + + #include + #include struct foo { int foo; } xx; -extern int strunvis (struct foo*); +extern int asnprintf (struct foo*); int -main () +main (void) { -strunvis(&xx) +asnprintf(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strunvis_noproto=yes" -else - eval "ac_cv_func_strunvis_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_asnprintf_noproto=yes" +else $as_nop + eval "ac_cv_func_asnprintf_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strunvis_noproto" >&5 -$as_echo "$ac_cv_func_strunvis_noproto" >&6; } -if test "$ac_cv_func_strunvis_noproto" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_asnprintf_noproto" >&5 +printf "%s\n" "$ac_cv_func_asnprintf_noproto" >&6; } +if test "$ac_cv_func_asnprintf_noproto" = yes; then -$as_echo "#define NEED_STRUNVIS_PROTO 1" >>confdefs.h +printf "%s\n" "#define NEED_ASNPRINTF_PROTO 1" >>confdefs.h fi fi -if test "$ac_cv_func_strvis+set" != set -o "$ac_cv_func_strvis" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strvis needs a prototype" >&5 -$as_echo_n "checking if strvis needs a prototype... " >&6; } -if test "${ac_cv_func_strvis_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +if test "$ac_cv_func_vasnprintf+set" != set -o "$ac_cv_func_vasnprintf" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if vasnprintf needs a prototype" >&5 +printf %s "checking if vasnprintf needs a prototype... " >&6; } +if test ${ac_cv_func_vasnprintf_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include -#endif + + #include + #include struct foo { int foo; } xx; -extern int strvis (struct foo*); +extern int vasnprintf (struct foo*); int -main () +main (void) { -strvis(&xx) +vasnprintf(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strvis_noproto=yes" -else - eval "ac_cv_func_strvis_noproto=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_vasnprintf_noproto=yes" +else $as_nop + eval "ac_cv_func_vasnprintf_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strvis_noproto" >&5 -$as_echo "$ac_cv_func_strvis_noproto" >&6; } -if test "$ac_cv_func_strvis_noproto" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vasnprintf_noproto" >&5 +printf "%s\n" "$ac_cv_func_vasnprintf_noproto" >&6; } +if test "$ac_cv_func_vasnprintf_noproto" = yes; then -$as_echo "#define NEED_STRVIS_PROTO 1" >>confdefs.h +printf "%s\n" "#define NEED_VASNPRINTF_PROTO 1" >>confdefs.h fi fi -if test "$ac_cv_func_strvisx+set" != set -o "$ac_cv_func_strvisx" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strvisx needs a prototype" >&5 -$as_echo_n "checking if strvisx needs a prototype... " >&6; } -if test "${ac_cv_func_strvisx_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bswap16" >&5 +printf %s "checking for bswap16... " >&6; } +if test ${ac_cv_funclib_bswap16+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_bswap16\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_BSWAP_H +#include #endif -struct foo { int foo; } xx; -extern int strvisx (struct foo*); int -main () +main (void) { -strvisx(&xx) +bswap16(0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strvisx_noproto=yes" -else - eval "ac_cv_func_strvisx_noproto=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_bswap16=$ac_lib; else ac_cv_funclib_bswap16=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_bswap16=\${ac_cv_funclib_bswap16-no}" + LIBS="$ac_save_LIBS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strvisx_noproto" >&5 -$as_echo "$ac_cv_func_strvisx_noproto" >&6; } -if test "$ac_cv_func_strvisx_noproto" = yes; then -$as_echo "#define NEED_STRVISX_PROTO 1" >>confdefs.h + +eval "ac_res=\$ac_cv_funclib_bswap16" + +if false; then + ac_fn_c_check_func "$LINENO" "bswap16" "ac_cv_func_bswap16" +if test "x$ac_cv_func_bswap16" = xyes +then : + printf "%s\n" "#define HAVE_BSWAP16 1" >>confdefs.h fi + fi +# bswap16 +eval "ac_tr_func=HAVE_`echo bswap16 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_bswap16=$ac_res" -if test "$ac_cv_func_svis+set" != set -o "$ac_cv_func_svis" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if svis needs a prototype" >&5 -$as_echo_n "checking if svis needs a prototype... " >&6; } -if test "${ac_cv_func_svis_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +case "$ac_res" in + yes) + eval "ac_cv_func_bswap16=yes" + eval "LIB_bswap16=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_bswap16=no" + eval "LIB_bswap16=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_bswap16=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bswap32" >&5 +printf %s "checking for bswap32... " >&6; } +if test ${ac_cv_funclib_bswap32+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_bswap32\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_BSWAP_H +#include #endif -struct foo { int foo; } xx; -extern int svis (struct foo*); int -main () +main (void) { -svis(&xx) +bswap32(0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_svis_noproto=yes" -else - eval "ac_cv_func_svis_noproto=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_bswap32=$ac_lib; else ac_cv_funclib_bswap32=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_bswap32=\${ac_cv_funclib_bswap32-no}" + LIBS="$ac_save_LIBS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_svis_noproto" >&5 -$as_echo "$ac_cv_func_svis_noproto" >&6; } -if test "$ac_cv_func_svis_noproto" = yes; then -$as_echo "#define NEED_SVIS_PROTO 1" >>confdefs.h + +eval "ac_res=\$ac_cv_funclib_bswap32" + +if false; then + ac_fn_c_check_func "$LINENO" "bswap32" "ac_cv_func_bswap32" +if test "x$ac_cv_func_bswap32" = xyes +then : + printf "%s\n" "#define HAVE_BSWAP32 1" >>confdefs.h fi + fi +# bswap32 +eval "ac_tr_func=HAVE_`echo bswap32 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_bswap32=$ac_res" -if test "$ac_cv_func_unvis+set" != set -o "$ac_cv_func_unvis" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if unvis needs a prototype" >&5 -$as_echo_n "checking if unvis needs a prototype... " >&6; } -if test "${ac_cv_func_unvis_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +case "$ac_res" in + yes) + eval "ac_cv_func_bswap32=yes" + eval "LIB_bswap32=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_bswap32=no" + eval "LIB_bswap32=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_bswap32=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for bswap64" >&5 +printf %s "checking for bswap64... " >&6; } +if test ${ac_cv_funclib_bswap64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_bswap64\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_BSWAP_H +#include #endif -struct foo { int foo; } xx; -extern int unvis (struct foo*); int -main () +main (void) { -unvis(&xx) +bswap64(0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_unvis_noproto=yes" -else - eval "ac_cv_func_unvis_noproto=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_bswap64=$ac_lib; else ac_cv_funclib_bswap64=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_bswap64=\${ac_cv_funclib_bswap64-no}" + LIBS="$ac_save_LIBS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_unvis_noproto" >&5 -$as_echo "$ac_cv_func_unvis_noproto" >&6; } -if test "$ac_cv_func_unvis_noproto" = yes; then -$as_echo "#define NEED_UNVIS_PROTO 1" >>confdefs.h + +eval "ac_res=\$ac_cv_funclib_bswap64" + +if false; then + ac_fn_c_check_func "$LINENO" "bswap64" "ac_cv_func_bswap64" +if test "x$ac_cv_func_bswap64" = xyes +then : + printf "%s\n" "#define HAVE_BSWAP64 1" >>confdefs.h fi + fi +# bswap64 +eval "ac_tr_func=HAVE_`echo bswap64 | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_bswap64=$ac_res" -if test "$ac_cv_func_vis+set" != set -o "$ac_cv_func_vis" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if vis needs a prototype" >&5 -$as_echo_n "checking if vis needs a prototype... " >&6; } -if test "${ac_cv_func_vis_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +case "$ac_res" in + yes) + eval "ac_cv_func_bswap64=yes" + eval "LIB_bswap64=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_bswap64=no" + eval "LIB_bswap64=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_bswap64=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pidfile" >&5 +printf %s "checking for pidfile... " >&6; } +if test ${ac_cv_funclib_pidfile+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_pidfile\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" util; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_VIS_H -#include +#ifdef HAVE_UTIL_H +#include #endif -struct foo { int foo; } xx; -extern int vis (struct foo*); int -main () +main (void) { -vis(&xx) +pidfile(0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_vis_noproto=yes" -else - eval "ac_cv_func_vis_noproto=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_pidfile=$ac_lib; else ac_cv_funclib_pidfile=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_pidfile=\${ac_cv_funclib_pidfile-no}" + LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vis_noproto" >&5 -$as_echo "$ac_cv_func_vis_noproto" >&6; } -if test "$ac_cv_func_vis_noproto" = yes; then -$as_echo "#define NEED_VIS_PROTO 1" >>confdefs.h +fi + + +eval "ac_res=\$ac_cv_funclib_pidfile" + +if false; then + ac_fn_c_check_func "$LINENO" "pidfile" "ac_cv_func_pidfile" +if test "x$ac_cv_func_pidfile" = xyes +then : + printf "%s\n" "#define HAVE_PIDFILE 1" >>confdefs.h fi + fi +# pidfile +eval "ac_tr_func=HAVE_`echo pidfile | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_pidfile=$ac_res" +case "$ac_res" in + yes) + eval "ac_cv_func_pidfile=yes" + eval "LIB_pidfile=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking checking for dirfd" >&5 -$as_echo_n "checking checking for dirfd... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_pidfile=no" + eval "LIB_pidfile=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_pidfile=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5 +printf %s "checking for getaddrinfo... " >&6; } +if test ${ac_cv_funclib_getaddrinfo+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_getaddrinfo\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_DIRENT_H -#include +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include #endif - int -main () +main (void) { -DIR *d = 0; dirfd(d); +getaddrinfo(0,0,0,0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_rk_have_dirfd=yes -else - ac_rk_have_dirfd=no +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_getaddrinfo=$ac_lib; else ac_cv_funclib_getaddrinfo=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -if test "$ac_rk_have_dirfd" = "yes" ; then + done + eval "ac_cv_funclib_getaddrinfo=\${ac_cv_funclib_getaddrinfo-no}" + LIBS="$ac_save_LIBS" +fi + +fi + + +eval "ac_res=\$ac_cv_funclib_getaddrinfo" + +if false; then + ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" +if test "x$ac_cv_func_getaddrinfo" = xyes +then : + printf "%s\n" "#define HAVE_GETADDRINFO 1" >>confdefs.h + +fi + +fi +# getaddrinfo +eval "ac_tr_func=HAVE_`echo getaddrinfo | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_getaddrinfo=$ac_res" + +case "$ac_res" in + yes) + eval "ac_cv_func_getaddrinfo=yes" + eval "LIB_getaddrinfo=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_getaddrinfo=no" + eval "LIB_getaddrinfo=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_getaddrinfo=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + +if test -n "$LIB_getaddrinfo"; then + LIBS="$LIB_getaddrinfo $LIBS" +fi + +if eval "test \"$ac_cv_func_getaddrinfo\" != yes"; then + case " $LIBOBJS " in + *" getaddrinfo.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext" + ;; +esac + +fi + -cat >>confdefs.h <<_ACEOF -#define HAVE_DIRFD 1 -_ACEOF -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_rk_have_dirfd" >&5 -$as_echo "$ac_rk_have_dirfd" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dd_fd in DIR" >&5 -$as_echo_n "checking for dd_fd in DIR... " >&6; } -if test "${ac_cv_type_dir_dd_fd+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getnameinfo" >&5 +printf %s "checking for getnameinfo... " >&6; } +if test ${ac_cv_funclib_getnameinfo+y} +then : + printf %s "(cached) " >&6 +else $as_nop -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if eval "test \"\$ac_cv_func_getnameinfo\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#ifdef HAVE_DIRENT_H -#include +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include #endif int -main () +main (void) { -DIR x; memset(&x, 0, sizeof(x)); x.dd_fd +getnameinfo(0,0,0,0,0,0,0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_dir_dd_fd=yes -else - ac_cv_type_dir_dd_fd=no +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_getnameinfo=$ac_lib; else ac_cv_funclib_getnameinfo=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_getnameinfo=\${ac_cv_funclib_getnameinfo-no}" + LIBS="$ac_save_LIBS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_dir_dd_fd" >&5 -$as_echo "$ac_cv_type_dir_dd_fd" >&6; } -if test "$ac_cv_type_dir_dd_fd" = yes; then -$as_echo "#define HAVE_DIR_DD_FD 1" >>confdefs.h +eval "ac_res=\$ac_cv_funclib_getnameinfo" +if false; then + ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo" +if test "x$ac_cv_func_getnameinfo" = xyes +then : + printf "%s\n" "#define HAVE_GETNAMEINFO 1" >>confdefs.h fi +fi +# getnameinfo +eval "ac_tr_func=HAVE_`echo getnameinfo | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_getnameinfo=$ac_res" +case "$ac_res" in + yes) + eval "ac_cv_func_getnameinfo=yes" + eval "LIB_getnameinfo=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_getnameinfo=no" + eval "LIB_getnameinfo=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_getnameinfo=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton" >&5 -$as_echo_n "checking for inet_aton... " >&6; } -if test "${ac_cv_func_inet_aton+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef 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 -int -main () -{ - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_inet_aton) || defined (__stub___inet_aton) -choke me -#else -inet_aton(0,0); -#endif + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "ac_cv_func_inet_aton=yes" -else - eval "ac_cv_func_inet_aton=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac -if eval "test \"\${ac_cv_func_inet_aton}\" = yes"; then -cat >>confdefs.h <<_ACEOF -#define HAVE_INET_ATON 1 -_ACEOF +if test -n "$LIB_getnameinfo"; then + LIBS="$LIB_getnameinfo $LIBS" +fi - { $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; } - case " $LIBOBJS " in - *" inet_aton.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS inet_aton.$ac_objext" +if eval "test \"$ac_cv_func_getnameinfo\" != yes"; then + case " $LIBOBJS " in + *" getnameinfo.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getnameinfo.$ac_objext" ;; esac fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntop" >&5 -$as_echo_n "checking for inet_ntop... " >&6; } -if test "${ac_cv_func_inet_ntop+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for freeaddrinfo" >&5 +printf %s "checking for freeaddrinfo... " >&6; } +if test ${ac_cv_funclib_freeaddrinfo+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_freeaddrinfo\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include +#ifdef HAVE_NETDB_H +#include #endif -#ifdef HAVE_ARPA_INET_H -#include +#ifdef HAVE_WS2TCPIP_H +#include #endif int -main () +main (void) { - -/* 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_inet_ntop) || defined (__stub___inet_ntop) -choke me -#else -inet_ntop(0, 0, 0, 0); -#endif - +freeaddrinfo(0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "ac_cv_func_inet_ntop=yes" -else - eval "ac_cv_func_inet_ntop=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_freeaddrinfo=$ac_lib; else ac_cv_funclib_freeaddrinfo=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_freeaddrinfo=\${ac_cv_funclib_freeaddrinfo-no}" + LIBS="$ac_save_LIBS" fi -if eval "test \"\${ac_cv_func_inet_ntop}\" = yes"; then +fi -cat >>confdefs.h <<_ACEOF -#define HAVE_INET_NTOP 1 -_ACEOF - { $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; } - case " $LIBOBJS " in - *" inet_ntop.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS inet_ntop.$ac_objext" - ;; -esac +eval "ac_res=\$ac_cv_funclib_freeaddrinfo" + +if false; then + ac_fn_c_check_func "$LINENO" "freeaddrinfo" "ac_cv_func_freeaddrinfo" +if test "x$ac_cv_func_freeaddrinfo" = xyes +then : + printf "%s\n" "#define HAVE_FREEADDRINFO 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_pton" >&5 -$as_echo_n "checking for inet_pton... " >&6; } -if test "${ac_cv_func_inet_pton+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef 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 -int -main () -{ +fi +# freeaddrinfo +eval "ac_tr_func=HAVE_`echo freeaddrinfo | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_freeaddrinfo=$ac_res" -/* 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_inet_pton) || defined (__stub___inet_pton) -choke me -#else -inet_pton(0,0,0); -#endif +case "$ac_res" in + yes) + eval "ac_cv_func_freeaddrinfo=yes" + eval "LIB_freeaddrinfo=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "ac_cv_func_inet_pton=yes" -else - eval "ac_cv_func_inet_pton=no" -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_freeaddrinfo=no" + eval "LIB_freeaddrinfo=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_freeaddrinfo=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -if eval "test \"\${ac_cv_func_inet_pton}\" = yes"; then + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_INET_PTON 1 -_ACEOF + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac - { $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; } - case " $LIBOBJS " in - *" inet_pton.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS inet_pton.$ac_objext" + +if test -n "$LIB_freeaddrinfo"; then + LIBS="$LIB_freeaddrinfo $LIBS" +fi + +if eval "test \"$ac_cv_func_freeaddrinfo\" != yes"; then + case " $LIBOBJS " in + *" freeaddrinfo.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS freeaddrinfo.$ac_objext" ;; esac @@ -21032,2221 +23086,2254 @@ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sa_len in struct sockaddr" >&5 -$as_echo_n "checking for sa_len in struct sockaddr... " >&6; } -if test "${ac_cv_type_struct_sockaddr_sa_len+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for gai_strerror" >&5 +printf %s "checking for gai_strerror... " >&6; } +if test ${ac_cv_funclib_gai_strerror+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_gai_strerror\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" ; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif int -main () +main (void) { -struct sockaddr x; memset(&x, 0, sizeof(x)); x.sa_len +gai_strerror(0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_sockaddr_sa_len=yes -else - ac_cv_type_struct_sockaddr_sa_len=no +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_gai_strerror=$ac_lib; else ac_cv_funclib_gai_strerror=yes; fi";break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_gai_strerror=\${ac_cv_funclib_gai_strerror-no}" + LIBS="$ac_save_LIBS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_sockaddr_sa_len" >&5 -$as_echo "$ac_cv_type_struct_sockaddr_sa_len" >&6; } -if test "$ac_cv_type_struct_sockaddr_sa_len" = yes; then -$as_echo "#define HAVE_STRUCT_SOCKADDR_SA_LEN 1" >>confdefs.h +eval "ac_res=\$ac_cv_funclib_gai_strerror" + +if false; then + ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror" +if test "x$ac_cv_func_gai_strerror" = xyes +then : + printf "%s\n" "#define HAVE_GAI_STRERROR 1" >>confdefs.h +fi fi +# gai_strerror +eval "ac_tr_func=HAVE_`echo gai_strerror | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_gai_strerror=$ac_res" +case "$ac_res" in + yes) + eval "ac_cv_func_gai_strerror=yes" + eval "LIB_gai_strerror=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_gai_strerror=no" + eval "LIB_gai_strerror=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_gai_strerror=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h -if test "$ac_cv_func_getaddrinfo" = "yes"; then + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if getaddrinfo handles numeric services" >&5 -$as_echo_n "checking if getaddrinfo handles numeric services... " >&6; } -if test "${ac_cv_func_getaddrinfo_numserv+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_getaddrinfo_numserv=yes -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -#include -#include + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac -int -main(int argc, char **argv) -{ - struct addrinfo hints, *ai; - memset(&hints, 0, sizeof(hints)); - hints.ai_flags = AI_PASSIVE; - hints.ai_socktype = SOCK_STREAM; - hints.ai_family = PF_UNSPEC; - if(getaddrinfo(NULL, "17", &hints, &ai) != 0) - return 1; - if(getaddrinfo(NULL, "0", &hints, &ai) != 0) - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_getaddrinfo_numserv=yes -else - ac_cv_func_getaddrinfo_numserv=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +if test -n "$LIB_gai_strerror"; then + LIBS="$LIB_gai_strerror $LIBS" fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getaddrinfo_numserv" >&5 -$as_echo "$ac_cv_func_getaddrinfo_numserv" >&6; } - if test "$ac_cv_func_getaddrinfo_numserv" = no; then +if eval "test \"$ac_cv_func_gai_strerror\" != yes"; then case " $LIBOBJS " in - *" getaddrinfo.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext" + *" gai_strerror.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS gai_strerror.$ac_objext" ;; esac - case " $LIBOBJS " in - *" freeaddrinfo.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS freeaddrinfo.$ac_objext" +fi + + +case "$host_os" in + darwin*) + ;; + *) + ac_fn_c_check_func "$LINENO" "daemon" "ac_cv_func_daemon" +if test "x$ac_cv_func_daemon" = xyes +then : + +printf "%s\n" "#define HAVE_DAEMON 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" daemon.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS daemon.$ac_objext" ;; esac - fi fi + ;; +esac +ac_fn_c_check_func "$LINENO" "chown" "ac_cv_func_chown" +if test "x$ac_cv_func_chown" = xyes +then : -if test "$ac_cv_func_setenv+set" != set -o "$ac_cv_func_setenv" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if setenv needs a prototype" >&5 -$as_echo_n "checking if setenv needs a prototype... " >&6; } -if test "${ac_cv_func_setenv_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int setenv (struct foo*); -int -main () -{ -setenv(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_setenv_noproto=yes" -else - eval "ac_cv_func_setenv_noproto=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_setenv_noproto" >&5 -$as_echo "$ac_cv_func_setenv_noproto" >&6; } -if test "$ac_cv_func_setenv_noproto" = yes; then +printf "%s\n" "#define HAVE_CHOWN 1" >>confdefs.h -$as_echo "#define NEED_SETENV_PROTO 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" chown.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS chown.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "copyhostent" "ac_cv_func_copyhostent" +if test "x$ac_cv_func_copyhostent" = xyes +then : + +printf "%s\n" "#define HAVE_COPYHOSTENT 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" copyhostent.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS copyhostent.$ac_objext" + ;; +esac + fi +ac_fn_c_check_func "$LINENO" "closefrom" "ac_cv_func_closefrom" +if test "x$ac_cv_func_closefrom" = xyes +then : +printf "%s\n" "#define HAVE_CLOSEFROM 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" closefrom.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS closefrom.$ac_objext" + ;; +esac -if test "$ac_cv_func_unsetenv+set" != set -o "$ac_cv_func_unsetenv" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if unsetenv needs a prototype" >&5 -$as_echo_n "checking if unsetenv needs a prototype... " >&6; } -if test "${ac_cv_func_unsetenv_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int unsetenv (struct foo*); -int -main () -{ -unsetenv(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_unsetenv_noproto=yes" -else - eval "ac_cv_func_unsetenv_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_func "$LINENO" "ecalloc" "ac_cv_func_ecalloc" +if test "x$ac_cv_func_ecalloc" = xyes +then : + +printf "%s\n" "#define HAVE_ECALLOC 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" ecalloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS ecalloc.$ac_objext" + ;; +esac + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_unsetenv_noproto" >&5 -$as_echo "$ac_cv_func_unsetenv_noproto" >&6; } -if test "$ac_cv_func_unsetenv_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "emalloc" "ac_cv_func_emalloc" +if test "x$ac_cv_func_emalloc" = xyes +then : + +printf "%s\n" "#define HAVE_EMALLOC 1" >>confdefs.h -$as_echo "#define NEED_UNSETENV_PROTO 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" emalloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS emalloc.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "erealloc" "ac_cv_func_erealloc" +if test "x$ac_cv_func_erealloc" = xyes +then : + +printf "%s\n" "#define HAVE_EREALLOC 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" erealloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS erealloc.$ac_objext" + ;; +esac + fi +ac_fn_c_check_func "$LINENO" "estrdup" "ac_cv_func_estrdup" +if test "x$ac_cv_func_estrdup" = xyes +then : +printf "%s\n" "#define HAVE_ESTRDUP 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" estrdup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS estrdup.$ac_objext" + ;; +esac -if test "$ac_cv_func_gethostname+set" != set -o "$ac_cv_func_gethostname" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if gethostname needs a prototype" >&5 -$as_echo_n "checking if gethostname needs a prototype... " >&6; } -if test "${ac_cv_func_gethostname_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int gethostname (struct foo*); -int -main () -{ -gethostname(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_gethostname_noproto=yes" -else - eval "ac_cv_func_gethostname_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_func "$LINENO" "err" "ac_cv_func_err" +if test "x$ac_cv_func_err" = xyes +then : + +printf "%s\n" "#define HAVE_ERR 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" err.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS err.$ac_objext" + ;; +esac + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostname_noproto" >&5 -$as_echo "$ac_cv_func_gethostname_noproto" >&6; } -if test "$ac_cv_func_gethostname_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "errx" "ac_cv_func_errx" +if test "x$ac_cv_func_errx" = xyes +then : + +printf "%s\n" "#define HAVE_ERRX 1" >>confdefs.h -$as_echo "#define NEED_GETHOSTNAME_PROTO 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" errx.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS errx.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "fchown" "ac_cv_func_fchown" +if test "x$ac_cv_func_fchown" = xyes +then : + +printf "%s\n" "#define HAVE_FCHOWN 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" fchown.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS fchown.$ac_objext" + ;; +esac + fi +ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock" +if test "x$ac_cv_func_flock" = xyes +then : +printf "%s\n" "#define HAVE_FLOCK 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" flock.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS flock.$ac_objext" + ;; +esac -if test "$ac_cv_func_mkstemp+set" != set -o "$ac_cv_func_mkstemp" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if mkstemp needs a prototype" >&5 -$as_echo_n "checking if mkstemp needs a prototype... " >&6; } -if test "${ac_cv_func_mkstemp_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int mkstemp (struct foo*); -int -main () -{ -mkstemp(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_mkstemp_noproto=yes" -else - eval "ac_cv_func_mkstemp_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_func "$LINENO" "fnmatch" "ac_cv_func_fnmatch" +if test "x$ac_cv_func_fnmatch" = xyes +then : + +printf "%s\n" "#define HAVE_FNMATCH 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" fnmatch.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS fnmatch.$ac_objext" + ;; +esac + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mkstemp_noproto" >&5 -$as_echo "$ac_cv_func_mkstemp_noproto" >&6; } -if test "$ac_cv_func_mkstemp_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "freehostent" "ac_cv_func_freehostent" +if test "x$ac_cv_func_freehostent" = xyes +then : + +printf "%s\n" "#define HAVE_FREEHOSTENT 1" >>confdefs.h -$as_echo "#define NEED_MKSTEMP_PROTO 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" freehostent.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS freehostent.$ac_objext" + ;; +esac fi -fi +ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" +if test "x$ac_cv_func_getcwd" = xyes +then : +printf "%s\n" "#define HAVE_GETCWD 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" getcwd.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getcwd.$ac_objext" + ;; +esac -if test "$ac_cv_func_getusershell+set" != set -o "$ac_cv_func_getusershell" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if getusershell needs a prototype" >&5 -$as_echo_n "checking if getusershell needs a prototype... " >&6; } -if test "${ac_cv_func_getusershell_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int getusershell (struct foo*); -int -main () -{ -getusershell(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_getusershell_noproto=yes" -else - eval "ac_cv_func_getusershell_noproto=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getusershell_noproto" >&5 -$as_echo "$ac_cv_func_getusershell_noproto" >&6; } -if test "$ac_cv_func_getusershell_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "getdtablesize" "ac_cv_func_getdtablesize" +if test "x$ac_cv_func_getdtablesize" = xyes +then : -$as_echo "#define NEED_GETUSERSHELL_PROTO 1" >>confdefs.h +printf "%s\n" "#define HAVE_GETDTABLESIZE 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" getdtablesize.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getdtablesize.$ac_objext" + ;; +esac fi -fi +ac_fn_c_check_func "$LINENO" "getegid" "ac_cv_func_getegid" +if test "x$ac_cv_func_getegid" = xyes +then : +printf "%s\n" "#define HAVE_GETEGID 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" getegid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getegid.$ac_objext" + ;; +esac -if test "$ac_cv_func_daemon+set" != set -o "$ac_cv_func_daemon" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if daemon needs a prototype" >&5 -$as_echo_n "checking if daemon needs a prototype... " >&6; } -if test "${ac_cv_func_daemon_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -struct foo { int foo; } xx; -extern int daemon (struct foo*); -int -main () -{ -daemon(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_daemon_noproto=yes" -else - eval "ac_cv_func_daemon_noproto=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_daemon_noproto" >&5 -$as_echo "$ac_cv_func_daemon_noproto" >&6; } -if test "$ac_cv_func_daemon_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "geteuid" "ac_cv_func_geteuid" +if test "x$ac_cv_func_geteuid" = xyes +then : -$as_echo "#define NEED_DAEMON_PROTO 1" >>confdefs.h +printf "%s\n" "#define HAVE_GETEUID 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" geteuid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS geteuid.$ac_objext" + ;; +esac fi -fi +ac_fn_c_check_func "$LINENO" "getgid" "ac_cv_func_getgid" +if test "x$ac_cv_func_getgid" = xyes +then : +printf "%s\n" "#define HAVE_GETGID 1" >>confdefs.h -if test "$ac_cv_func_iruserok+set" != set -o "$ac_cv_func_iruserok" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if iruserok needs a prototype" >&5 -$as_echo_n "checking if iruserok needs a prototype... " >&6; } -if test "${ac_cv_func_iruserok_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +else $as_nop + case " $LIBOBJS " in + *" getgid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getgid.$ac_objext" + ;; +esac -#ifdef 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 -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif -struct foo { int foo; } xx; -extern int iruserok (struct foo*); -int -main () -{ -iruserok(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_iruserok_noproto=yes" -else - eval "ac_cv_func_iruserok_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_iruserok_noproto" >&5 -$as_echo "$ac_cv_func_iruserok_noproto" >&6; } -if test "$ac_cv_func_iruserok_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname" +if test "x$ac_cv_func_gethostname" = xyes +then : -$as_echo "#define NEED_IRUSEROK_PROTO 1" >>confdefs.h +printf "%s\n" "#define HAVE_GETHOSTNAME 1" >>confdefs.h -fi -fi +else $as_nop + case " $LIBOBJS " in + *" gethostname.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS gethostname.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "getifaddrs" "ac_cv_func_getifaddrs" +if test "x$ac_cv_func_getifaddrs" = xyes +then : +printf "%s\n" "#define HAVE_GETIFADDRS 1" >>confdefs.h -if test "$ac_cv_func_inet_aton+set" != set -o "$ac_cv_func_inet_aton" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if inet_aton needs a prototype" >&5 -$as_echo_n "checking if inet_aton needs a prototype... " >&6; } -if test "${ac_cv_func_inet_aton_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +else $as_nop + case " $LIBOBJS " in + *" getifaddrs.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getifaddrs.$ac_objext" + ;; +esac -#ifdef 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 -struct foo { int foo; } xx; -extern int inet_aton (struct foo*); -int -main () -{ -inet_aton(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_inet_aton_noproto=yes" -else - eval "ac_cv_func_inet_aton_noproto=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_inet_aton_noproto" >&5 -$as_echo "$ac_cv_func_inet_aton_noproto" >&6; } -if test "$ac_cv_func_inet_aton_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "getipnodebyaddr" "ac_cv_func_getipnodebyaddr" +if test "x$ac_cv_func_getipnodebyaddr" = xyes +then : -$as_echo "#define NEED_INET_ATON_PROTO 1" >>confdefs.h +printf "%s\n" "#define HAVE_GETIPNODEBYADDR 1" >>confdefs.h -fi -fi +else $as_nop + case " $LIBOBJS " in + *" getipnodebyaddr.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getipnodebyaddr.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "getipnodebyname" "ac_cv_func_getipnodebyname" +if test "x$ac_cv_func_getipnodebyname" = xyes +then : +printf "%s\n" "#define HAVE_GETIPNODEBYNAME 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" getipnodebyname.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getipnodebyname.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "getopt" "ac_cv_func_getopt" +if test "x$ac_cv_func_getopt" = xyes +then : -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for crypt" >&5 -$as_echo_n "checking for crypt... " >&6; } -if test "${ac_cv_funclib_crypt+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +printf "%s\n" "#define HAVE_GETOPT 1" >>confdefs.h -if eval "test \"\$ac_cv_func_crypt\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" crypt; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +else $as_nop + case " $LIBOBJS " in + *" getopt.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getopt.$ac_objext" + ;; +esac -int -main () -{ -crypt() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_crypt=$ac_lib; else ac_cv_funclib_crypt=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_crypt=\${ac_cv_funclib_crypt-no}" - LIBS="$ac_save_LIBS" fi +ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" +if test "x$ac_cv_func_gettimeofday" = xyes +then : -fi +printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" gettimeofday.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS gettimeofday.$ac_objext" + ;; +esac -eval "ac_res=\$ac_cv_funclib_crypt" +fi +ac_fn_c_check_func "$LINENO" "getuid" "ac_cv_func_getuid" +if test "x$ac_cv_func_getuid" = xyes +then : -if false; then - for ac_func in crypt -do : - ac_fn_c_check_func "$LINENO" "crypt" "ac_cv_func_crypt" -if test "x$ac_cv_func_crypt" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_CRYPT 1 -_ACEOF +printf "%s\n" "#define HAVE_GETUID 1" >>confdefs.h -fi -done +else $as_nop + case " $LIBOBJS " in + *" getuid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getuid.$ac_objext" + ;; +esac fi -# crypt -eval "ac_tr_func=HAVE_`echo crypt | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_crypt=$ac_res" +ac_fn_c_check_func "$LINENO" "getusershell" "ac_cv_func_getusershell" +if test "x$ac_cv_func_getusershell" = xyes +then : -case "$ac_res" in - yes) - eval "ac_cv_func_crypt=yes" - eval "LIB_crypt=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +printf "%s\n" "#define HAVE_GETUSERSHELL 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_crypt=no" - eval "LIB_crypt=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_crypt=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +else $as_nop + case " $LIBOBJS " in + *" getusershell.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS getusershell.$ac_objext" + ;; +esac + +fi +ac_fn_c_check_func "$LINENO" "initgroups" "ac_cv_func_initgroups" +if test "x$ac_cv_func_initgroups" = xyes +then : - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +printf "%s\n" "#define HAVE_INITGROUPS 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; +else $as_nop + case " $LIBOBJS " in + *" initgroups.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS initgroups.$ac_objext" + ;; esac +fi +ac_fn_c_check_func "$LINENO" "innetgr" "ac_cv_func_innetgr" +if test "x$ac_cv_func_innetgr" = xyes +then : +printf "%s\n" "#define HAVE_INNETGR 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" innetgr.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS innetgr.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "iruserok" "ac_cv_func_iruserok" +if test "x$ac_cv_func_iruserok" = xyes +then : +printf "%s\n" "#define HAVE_IRUSEROK 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if strerror_r is compatible with system prototype" >&5 -$as_echo_n "checking if strerror_r is compatible with system prototype... " >&6; } -if test "${ac_cv_func_strerror_r_proto_compat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include -#include +else $as_nop + case " $LIBOBJS " in + *" iruserok.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS iruserok.$ac_objext" + ;; +esac -int -main () -{ -int strerror_r(int, char *, size_t) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_strerror_r_proto_compat=yes" -else - eval "ac_cv_func_strerror_r_proto_compat=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_proto_compat" >&5 -$as_echo "$ac_cv_func_strerror_r_proto_compat" >&6; } +ac_fn_c_check_func "$LINENO" "localtime_r" "ac_cv_func_localtime_r" +if test "x$ac_cv_func_localtime_r" = xyes +then : -if test "$ac_cv_func_strerror_r_proto_compat" = yes; then +printf "%s\n" "#define HAVE_LOCALTIME_R 1" >>confdefs.h -$as_echo "#define STRERROR_R_PROTO_COMPATIBLE 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" localtime_r.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS localtime_r.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "lstat" "ac_cv_func_lstat" +if test "x$ac_cv_func_lstat" = xyes +then : +printf "%s\n" "#define HAVE_LSTAT 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" lstat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS lstat.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" +if test "x$ac_cv_func_memmove" = xyes +then : -ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" -if test "x$ac_cv_func_strerror_r" = x""yes; then : +printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_STRERROR_R 1 -_ACEOF +else $as_nop + case " $LIBOBJS " in + *" memmove.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS memmove.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "memset_s" "ac_cv_func_memset_s" +if test "x$ac_cv_func_memset_s" = xyes +then : +printf "%s\n" "#define HAVE_MEMSET_S 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" memset_s.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS memset_s.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "mkstemp" "ac_cv_func_mkstemp" +if test "x$ac_cv_func_mkstemp" = xyes +then : -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if gethostbyname is compatible with system prototype" >&5 -$as_echo_n "checking if gethostbyname is compatible with system prototype... " >&6; } -if test "${ac_cv_func_gethostbyname_proto_compat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_MKSTEMP 1" >>confdefs.h -#ifdef 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 -#ifdef HAVE_NETDB_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" mkstemp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS mkstemp.$ac_objext" + ;; +esac -int -main () -{ -struct hostent *gethostbyname(const char *) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_gethostbyname_proto_compat=yes" -else - eval "ac_cv_func_gethostbyname_proto_compat=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostbyname_proto_compat" >&5 -$as_echo "$ac_cv_func_gethostbyname_proto_compat" >&6; } +ac_fn_c_check_func "$LINENO" "putenv" "ac_cv_func_putenv" +if test "x$ac_cv_func_putenv" = xyes +then : -if test "$ac_cv_func_gethostbyname_proto_compat" = yes; then +printf "%s\n" "#define HAVE_PUTENV 1" >>confdefs.h -$as_echo "#define GETHOSTBYNAME_PROTO_COMPATIBLE 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" putenv.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS putenv.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "rcmd" "ac_cv_func_rcmd" +if test "x$ac_cv_func_rcmd" = xyes +then : +printf "%s\n" "#define HAVE_RCMD 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" rcmd.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS rcmd.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "readv" "ac_cv_func_readv" +if test "x$ac_cv_func_readv" = xyes +then : -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if gethostbyaddr is compatible with system prototype" >&5 -$as_echo_n "checking if gethostbyaddr is compatible with system prototype... " >&6; } -if test "${ac_cv_func_gethostbyaddr_proto_compat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_READV 1" >>confdefs.h -#ifdef 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 -#ifdef HAVE_NETDB_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" readv.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS readv.$ac_objext" + ;; +esac -int -main () -{ -struct hostent *gethostbyaddr(const void *, size_t, int) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_gethostbyaddr_proto_compat=yes" -else - eval "ac_cv_func_gethostbyaddr_proto_compat=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_func "$LINENO" "recvmsg" "ac_cv_func_recvmsg" +if test "x$ac_cv_func_recvmsg" = xyes +then : + +printf "%s\n" "#define HAVE_RECVMSG 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" recvmsg.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS recvmsg.$ac_objext" + ;; +esac + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostbyaddr_proto_compat" >&5 -$as_echo "$ac_cv_func_gethostbyaddr_proto_compat" >&6; } +ac_fn_c_check_func "$LINENO" "sendmsg" "ac_cv_func_sendmsg" +if test "x$ac_cv_func_sendmsg" = xyes +then : -if test "$ac_cv_func_gethostbyaddr_proto_compat" = yes; then +printf "%s\n" "#define HAVE_SENDMSG 1" >>confdefs.h -$as_echo "#define GETHOSTBYADDR_PROTO_COMPATIBLE 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" sendmsg.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS sendmsg.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "setegid" "ac_cv_func_setegid" +if test "x$ac_cv_func_setegid" = xyes +then : +printf "%s\n" "#define HAVE_SETEGID 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" setegid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS setegid.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "setenv" "ac_cv_func_setenv" +if test "x$ac_cv_func_setenv" = xyes +then : -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if getservbyname is compatible with system prototype" >&5 -$as_echo_n "checking if getservbyname is compatible with system prototype... " >&6; } -if test "${ac_cv_func_getservbyname_proto_compat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_SETENV 1" >>confdefs.h -#ifdef 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 -#ifdef HAVE_NETDB_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" setenv.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS setenv.$ac_objext" + ;; +esac -int -main () -{ -struct servent *getservbyname(const char *, const char *) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_getservbyname_proto_compat=yes" -else - eval "ac_cv_func_getservbyname_proto_compat=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_func "$LINENO" "seteuid" "ac_cv_func_seteuid" +if test "x$ac_cv_func_seteuid" = xyes +then : + +printf "%s\n" "#define HAVE_SETEUID 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" seteuid.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS seteuid.$ac_objext" + ;; +esac + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getservbyname_proto_compat" >&5 -$as_echo "$ac_cv_func_getservbyname_proto_compat" >&6; } +ac_fn_c_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" +if test "x$ac_cv_func_strcasecmp" = xyes +then : -if test "$ac_cv_func_getservbyname_proto_compat" = yes; then +printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h -$as_echo "#define GETSERVBYNAME_PROTO_COMPATIBLE 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strcasecmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strcasecmp.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" +if test "x$ac_cv_func_strdup" = xyes +then : +printf "%s\n" "#define HAVE_STRDUP 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strdup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strdup.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror" +if test "x$ac_cv_func_strerror" = xyes +then : -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if getsockname is compatible with system prototype" >&5 -$as_echo_n "checking if getsockname is compatible with system prototype... " >&6; } -if test "${ac_cv_func_getsockname_proto_compat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" strerror.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strerror.$ac_objext" + ;; +esac -int -main () -{ -int getsockname(int, struct sockaddr*, socklen_t*) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_getsockname_proto_compat=yes" -else - eval "ac_cv_func_getsockname_proto_compat=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" +if test "x$ac_cv_func_strftime" = xyes +then : + +printf "%s\n" "#define HAVE_STRFTIME 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" strftime.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strftime.$ac_objext" + ;; +esac + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getsockname_proto_compat" >&5 -$as_echo "$ac_cv_func_getsockname_proto_compat" >&6; } +ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat" +if test "x$ac_cv_func_strlcat" = xyes +then : -if test "$ac_cv_func_getsockname_proto_compat" = yes; then +printf "%s\n" "#define HAVE_STRLCAT 1" >>confdefs.h -$as_echo "#define GETSOCKNAME_PROTO_COMPATIBLE 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strlcat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strlcat.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" +if test "x$ac_cv_func_strlcpy" = xyes +then : +printf "%s\n" "#define HAVE_STRLCPY 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strlcpy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strlcpy.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "strlwr" "ac_cv_func_strlwr" +if test "x$ac_cv_func_strlwr" = xyes +then : -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if openlog is compatible with system prototype" >&5 -$as_echo_n "checking if openlog is compatible with system prototype... " >&6; } -if test "${ac_cv_func_openlog_proto_compat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_STRLWR 1" >>confdefs.h -#ifdef HAVE_SYSLOG_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" strlwr.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strlwr.$ac_objext" + ;; +esac -int -main () -{ -void openlog(const char *, int, int) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_openlog_proto_compat=yes" -else - eval "ac_cv_func_openlog_proto_compat=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_openlog_proto_compat" >&5 -$as_echo "$ac_cv_func_openlog_proto_compat" >&6; } +ac_fn_c_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" +if test "x$ac_cv_func_strncasecmp" = xyes +then : -if test "$ac_cv_func_openlog_proto_compat" = yes; then +printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h -$as_echo "#define OPENLOG_PROTO_COMPATIBLE 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strncasecmp.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strncasecmp.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "strndup" "ac_cv_func_strndup" +if test "x$ac_cv_func_strndup" = xyes +then : +printf "%s\n" "#define HAVE_STRNDUP 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strndup.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strndup.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "strnlen" "ac_cv_func_strnlen" +if test "x$ac_cv_func_strnlen" = xyes +then : -if test "$ac_cv_func_crypt+set" != set -o "$ac_cv_func_crypt" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if crypt needs a prototype" >&5 -$as_echo_n "checking if crypt needs a prototype... " >&6; } -if test "${ac_cv_func_crypt_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +printf "%s\n" "#define HAVE_STRNLEN 1" >>confdefs.h -#ifdef HAVE_CRYPT_H -#include -#endif -#ifdef HAVE_UNISTD_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" strnlen.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strnlen.$ac_objext" + ;; +esac -struct foo { int foo; } xx; -extern int crypt (struct foo*); -int -main () -{ -crypt(&xx) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_func_crypt_noproto=yes" -else - eval "ac_cv_func_crypt_noproto=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_crypt_noproto" >&5 -$as_echo "$ac_cv_func_crypt_noproto" >&6; } -if test "$ac_cv_func_crypt_noproto" = yes; then +ac_fn_c_check_func "$LINENO" "strptime" "ac_cv_func_strptime" +if test "x$ac_cv_func_strptime" = xyes +then : -$as_echo "#define NEED_CRYPT_PROTO 1" >>confdefs.h +printf "%s\n" "#define HAVE_STRPTIME 1" >>confdefs.h -fi -fi +else $as_nop + case " $LIBOBJS " in + *" strptime.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strptime.$ac_objext" + ;; +esac +fi +ac_fn_c_check_func "$LINENO" "strsep" "ac_cv_func_strsep" +if test "x$ac_cv_func_strsep" = xyes +then : +printf "%s\n" "#define HAVE_STRSEP 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strsep.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strsep.$ac_objext" + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for h_errno" >&5 -$as_echo_n "checking for h_errno... " >&6; } -if test "${ac_cv_var_h_errno+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_func "$LINENO" "strsep_copy" "ac_cv_func_strsep_copy" +if test "x$ac_cv_func_strsep_copy" = xyes +then : +printf "%s\n" "#define HAVE_STRSEP_COPY 1" >>confdefs.h - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" strsep_copy.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strsep_copy.$ac_objext" + ;; +esac - void * foo(void) { return &h_errno; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_h_errno=yes -else - ac_cv_var_h_errno=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_var_h_errno" != yes ; then -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif +ac_fn_c_check_func "$LINENO" "strtok_r" "ac_cv_func_strtok_r" +if test "x$ac_cv_func_strtok_r" = xyes +then : -extern int h_errno; -int foo(void) { return h_errno; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_h_errno=yes -else - ac_cv_var_h_errno=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi +printf "%s\n" "#define HAVE_STRTOK_R 1" >>confdefs.h -fi +else $as_nop + case " $LIBOBJS " in + *" strtok_r.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtok_r.$ac_objext" + ;; +esac -ac_foo=`eval echo \\$ac_cv_var_h_errno` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then +fi +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_H_ERRNO 1 -_ACEOF +printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h - ac_fn_c_check_decl "$LINENO" "h_errno" "ac_cv_have_decl_h_errno" "#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif +else $as_nop + case " $LIBOBJS " in + *" strtoll.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtoll.$ac_objext" + ;; +esac -" -if test "x$ac_cv_have_decl_h_errno" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 fi +ac_fn_c_check_func "$LINENO" "strtoull" "ac_cv_func_strtoull" +if test "x$ac_cv_func_strtoull" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_H_ERRNO $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_STRTOULL 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" strtoull.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strtoull.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "strupr" "ac_cv_func_strupr" +if test "x$ac_cv_func_strupr" = xyes +then : +printf "%s\n" "#define HAVE_STRUPR 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" strupr.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strupr.$ac_objext" + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for h_errlist" >&5 -$as_echo_n "checking for h_errlist... " >&6; } -if test "${ac_cv_var_h_errlist+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_func "$LINENO" "swab" "ac_cv_func_swab" +if test "x$ac_cv_func_swab" = xyes +then : +printf "%s\n" "#define HAVE_SWAB 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" swab.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS swab.$ac_objext" + ;; +esac - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif - void * foo(void) { return &h_errlist; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_h_errlist=yes -else - ac_cv_var_h_errlist=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_var_h_errlist" != yes ; then -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif -extern int h_errlist; -int foo(void) { return h_errlist; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_h_errlist=yes -else - ac_cv_var_h_errlist=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext fi +ac_fn_c_check_func "$LINENO" "tsearch" "ac_cv_func_tsearch" +if test "x$ac_cv_func_tsearch" = xyes +then : + +printf "%s\n" "#define HAVE_TSEARCH 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" tsearch.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS tsearch.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "timegm" "ac_cv_func_timegm" +if test "x$ac_cv_func_timegm" = xyes +then : -ac_foo=`eval echo \\$ac_cv_var_h_errlist` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then +printf "%s\n" "#define HAVE_TIMEGM 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_H_ERRLIST 1 -_ACEOF +else $as_nop + case " $LIBOBJS " in + *" timegm.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS timegm.$ac_objext" + ;; +esac - ac_fn_c_check_decl "$LINENO" "h_errlist" "ac_cv_have_decl_h_errlist" "#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif -" -if test "x$ac_cv_have_decl_h_errlist" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 fi +ac_fn_c_check_func "$LINENO" "unsetenv" "ac_cv_func_unsetenv" +if test "x$ac_cv_func_unsetenv" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_H_ERRLIST $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_UNSETENV 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" unsetenv.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS unsetenv.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "verr" "ac_cv_func_verr" +if test "x$ac_cv_func_verr" = xyes +then : +printf "%s\n" "#define HAVE_VERR 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" verr.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS verr.$ac_objext" + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for h_nerr" >&5 -$as_echo_n "checking for h_nerr... " >&6; } -if test "${ac_cv_var_h_nerr+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_func "$LINENO" "verrx" "ac_cv_func_verrx" +if test "x$ac_cv_func_verrx" = xyes +then : +printf "%s\n" "#define HAVE_VERRX 1" >>confdefs.h - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif - void * foo(void) { return &h_nerr; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_h_nerr=yes -else - ac_cv_var_h_nerr=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_var_h_nerr" != yes ; then -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif -extern int h_nerr; -int foo(void) { return h_nerr; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_h_nerr=yes -else - ac_cv_var_h_nerr=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi +else $as_nop + case " $LIBOBJS " in + *" verrx.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS verrx.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "vsyslog" "ac_cv_func_vsyslog" +if test "x$ac_cv_func_vsyslog" = xyes +then : -ac_foo=`eval echo \\$ac_cv_var_h_nerr` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then +printf "%s\n" "#define HAVE_VSYSLOG 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE_H_NERR 1 -_ACEOF +else $as_nop + case " $LIBOBJS " in + *" vsyslog.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vsyslog.$ac_objext" + ;; +esac - ac_fn_c_check_decl "$LINENO" "h_nerr" "ac_cv_have_decl_h_nerr" "#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif -" -if test "x$ac_cv_have_decl_h_nerr" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 fi +ac_fn_c_check_func "$LINENO" "vwarn" "ac_cv_func_vwarn" +if test "x$ac_cv_func_vwarn" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_H_NERR $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_VWARN 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" vwarn.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vwarn.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "vwarnx" "ac_cv_func_vwarnx" +if test "x$ac_cv_func_vwarnx" = xyes +then : +printf "%s\n" "#define HAVE_VWARNX 1" >>confdefs.h +else $as_nop + case " $LIBOBJS " in + *" vwarnx.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS vwarnx.$ac_objext" + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __progname" >&5 -$as_echo_n "checking for __progname... " >&6; } -if test "${ac_cv_var___progname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_func "$LINENO" "warn" "ac_cv_func_warn" +if test "x$ac_cv_func_warn" = xyes +then : +printf "%s\n" "#define HAVE_WARN 1" >>confdefs.h - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_ERR_H -#include -#endif - void * foo(void) { return &__progname; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var___progname=yes -else - ac_cv_var___progname=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_var___progname" != yes ; then -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#ifdef HAVE_ERR_H -#include -#endif -extern int __progname; -int foo(void) { return __progname; } -int -main () -{ -foo() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var___progname=yes -else - ac_cv_var___progname=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi +else $as_nop + case " $LIBOBJS " in + *" warn.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS warn.$ac_objext" + ;; +esac fi +ac_fn_c_check_func "$LINENO" "warnx" "ac_cv_func_warnx" +if test "x$ac_cv_func_warnx" = xyes +then : -ac_foo=`eval echo \\$ac_cv_var___progname` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then +printf "%s\n" "#define HAVE_WARNX 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE___PROGNAME 1 -_ACEOF +else $as_nop + case " $LIBOBJS " in + *" warnx.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS warnx.$ac_objext" + ;; +esac - ac_fn_c_check_decl "$LINENO" "__progname" "ac_cv_have_decl___progname" "#ifdef HAVE_ERR_H -#include -#endif -" -if test "x$ac_cv_have_decl___progname" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 fi +ac_fn_c_check_func "$LINENO" "writev" "ac_cv_func_writev" +if test "x$ac_cv_func_writev" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL___PROGNAME $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_WRITEV 1" >>confdefs.h + +else $as_nop + case " $LIBOBJS " in + *" writev.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS writev.$ac_objext" + ;; +esac fi -ac_fn_c_check_decl "$LINENO" "optarg" "ac_cv_have_decl_optarg" " -#include -#ifdef HAVE_UNISTD_H -#include -#endif -" -if test "x$ac_cv_have_decl_optarg" = x""yes; then : - ac_have_decl=1 + if test "$ac_cv_header_fnmatch_h" = yes -a "$ac_cv_func_fnmatch" = yes; then + have_fnmatch_h_TRUE= + have_fnmatch_h_FALSE='#' else - ac_have_decl=0 + have_fnmatch_h_TRUE='#' + have_fnmatch_h_FALSE= fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_OPTARG $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "optind" "ac_cv_have_decl_optind" " -#include -#ifdef HAVE_UNISTD_H -#include -#endif -" -if test "x$ac_cv_have_decl_optind" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_OPTIND $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "opterr" "ac_cv_have_decl_opterr" " -#include -#ifdef HAVE_UNISTD_H -#include -#endif -" -if test "x$ac_cv_have_decl_opterr" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_OPTERR $ac_have_decl +if test "$ac_cv_func_strndup+set" != set -o "$ac_cv_func_strndup" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strndup needs a prototype" >&5 +printf %s "checking if strndup needs a prototype... " >&6; } +if test ${ac_cv_func_strndup_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +struct foo { int foo; } xx; +extern int strndup (struct foo*); +int +main (void) +{ +strndup(&xx) + ; + return 0; +} _ACEOF -ac_fn_c_check_decl "$LINENO" "optopt" "ac_cv_have_decl_optopt" " -#include -#ifdef HAVE_UNISTD_H -#include -#endif -" -if test "x$ac_cv_have_decl_optopt" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strndup_noproto=yes" +else $as_nop + eval "ac_cv_func_strndup_noproto=no" fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_OPTOPT $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "environ" "ac_cv_have_decl_environ" " -#include -#ifdef HAVE_UNISTD_H -#include -#endif -" -if test "x$ac_cv_have_decl_environ" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strndup_noproto" >&5 +printf "%s\n" "$ac_cv_func_strndup_noproto" >&6; } +if test "$ac_cv_func_strndup_noproto" = yes; then -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ENVIRON $ac_have_decl -_ACEOF - +printf "%s\n" "#define NEED_STRNDUP_PROTO 1" >>confdefs.h +fi +fi +if test "$ac_cv_func_strsep+set" != set -o "$ac_cv_func_strsep" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strsep needs a prototype" >&5 +printf %s "checking if strsep needs a prototype... " >&6; } +if test ${ac_cv_func_strsep_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +struct foo { int foo; } xx; +extern int strsep (struct foo*); +int +main (void) +{ +strsep(&xx) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strsep_noproto=yes" +else $as_nop + eval "ac_cv_func_strsep_noproto=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strsep_noproto" >&5 +printf "%s\n" "$ac_cv_func_strsep_noproto" >&6; } +if test "$ac_cv_func_strsep_noproto" = yes; then +printf "%s\n" "#define NEED_STRSEP_PROTO 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff in struct tm" >&5 -$as_echo_n "checking for tm_gmtoff in struct tm... " >&6; } -if test "${ac_cv_type_struct_tm_tm_gmtoff+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +fi -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_func_strtok_r+set" != set -o "$ac_cv_func_strtok_r" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strtok_r needs a prototype" >&5 +printf %s "checking if strtok_r needs a prototype... " >&6; } +if test ${ac_cv_func_strtok_r_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include +struct foo { int foo; } xx; +extern int strtok_r (struct foo*); int -main () +main (void) { -struct tm x; memset(&x, 0, sizeof(x)); x.tm_gmtoff +strtok_r(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_tm_tm_gmtoff=yes -else - ac_cv_type_struct_tm_tm_gmtoff=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strtok_r_noproto=yes" +else $as_nop + eval "ac_cv_func_strtok_r_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strtok_r_noproto" >&5 +printf "%s\n" "$ac_cv_func_strtok_r_noproto" >&6; } +if test "$ac_cv_func_strtok_r_noproto" = yes; then + +printf "%s\n" "#define NEED_STRTOK_R_PROTO 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_tm_tm_gmtoff" >&5 -$as_echo "$ac_cv_type_struct_tm_tm_gmtoff" >&6; } -if test "$ac_cv_type_struct_tm_tm_gmtoff" = yes; then +fi -$as_echo "#define HAVE_STRUCT_TM_TM_GMTOFF 1" >>confdefs.h +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = xyes +then : +printf "%s\n" "#define HAVE_STRTOLL 1" >>confdefs.h fi +ac_fn_c_check_func "$LINENO" "strtoull" "ac_cv_func_strtoull" +if test "x$ac_cv_func_strtoull" = xyes +then : +printf "%s\n" "#define HAVE_STRTOULL 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tm_zone in struct tm" >&5 -$as_echo_n "checking for tm_zone in struct tm... " >&6; } -if test "${ac_cv_type_struct_tm_tm_zone+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + +if test "$ac_cv_func_strsvis+set" != set -o "$ac_cv_func_strsvis" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strsvis needs a prototype" >&5 +printf %s "checking if strsvis needs a prototype... " >&6; } +if test ${ac_cv_func_strsvis_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int strsvis (struct foo*); int -main () +main (void) { -struct tm x; memset(&x, 0, sizeof(x)); x.tm_zone +strsvis(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_tm_tm_zone=yes -else - ac_cv_type_struct_tm_tm_zone=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strsvis_noproto=yes" +else $as_nop + eval "ac_cv_func_strsvis_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_tm_tm_zone" >&5 -$as_echo "$ac_cv_type_struct_tm_tm_zone" >&6; } -if test "$ac_cv_type_struct_tm_tm_zone" = yes; then - - -$as_echo "#define HAVE_STRUCT_TM_TM_ZONE 1" >>confdefs.h +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strsvis_noproto" >&5 +printf "%s\n" "$ac_cv_func_strsvis_noproto" >&6; } +if test "$ac_cv_func_strsvis_noproto" = yes; then +printf "%s\n" "#define NEED_STRSVIS_PROTO 1" >>confdefs.h +fi fi +if test "$ac_cv_func_strsvisx+set" != set -o "$ac_cv_func_strsvisx" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strsvisx needs a prototype" >&5 +printf %s "checking if strsvisx needs a prototype... " >&6; } +if test ${ac_cv_func_strsvisx_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int strsvisx (struct foo*); +int +main (void) +{ +strsvisx(&xx) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strsvisx_noproto=yes" +else $as_nop + eval "ac_cv_func_strsvisx_noproto=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strsvisx_noproto" >&5 +printf "%s\n" "$ac_cv_func_strsvisx_noproto" >&6; } +if test "$ac_cv_func_strsvisx_noproto" = yes; then +printf "%s\n" "#define NEED_STRSVISX_PROTO 1" >>confdefs.h +fi +fi +if test "$ac_cv_func_strunvis+set" != set -o "$ac_cv_func_strunvis" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strunvis needs a prototype" >&5 +printf %s "checking if strunvis needs a prototype... " >&6; } +if test ${ac_cv_func_strunvis_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int strunvis (struct foo*); +int +main (void) +{ +strunvis(&xx) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strunvis_noproto=yes" +else $as_nop + eval "ac_cv_func_strunvis_noproto=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strunvis_noproto" >&5 +printf "%s\n" "$ac_cv_func_strunvis_noproto" >&6; } +if test "$ac_cv_func_strunvis_noproto" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for timezone" >&5 -$as_echo_n "checking for timezone... " >&6; } -if test "${ac_cv_var_timezone+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +printf "%s\n" "#define NEED_STRUNVIS_PROTO 1" >>confdefs.h +fi +fi - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_func_strvis+set" != set -o "$ac_cv_func_strvis" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strvis needs a prototype" >&5 +printf %s "checking if strvis needs a prototype... " >&6; } +if test ${ac_cv_func_strvis_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include - void * foo(void) { return &timezone; } +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int strvis (struct foo*); int -main () +main (void) { -foo() +strvis(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_timezone=yes -else - ac_cv_var_timezone=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strvis_noproto=yes" +else $as_nop + eval "ac_cv_func_strvis_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_var_timezone" != yes ; then -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strvis_noproto" >&5 +printf "%s\n" "$ac_cv_func_strvis_noproto" >&6; } +if test "$ac_cv_func_strvis_noproto" = yes; then + +printf "%s\n" "#define NEED_STRVIS_PROTO 1" >>confdefs.h + +fi +fi + +if test "$ac_cv_func_strvisx+set" != set -o "$ac_cv_func_strvisx" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strvisx needs a prototype" >&5 +printf %s "checking if strvisx needs a prototype... " >&6; } +if test ${ac_cv_func_strvisx_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -extern int timezone; -int foo(void) { return timezone; } +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int strvisx (struct foo*); int -main () +main (void) { -foo() +strvisx(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_timezone=yes -else - ac_cv_var_timezone=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strvisx_noproto=yes" +else $as_nop + eval "ac_cv_func_strvisx_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strvisx_noproto" >&5 +printf "%s\n" "$ac_cv_func_strvisx_noproto" >&6; } +if test "$ac_cv_func_strvisx_noproto" = yes; then -fi +printf "%s\n" "#define NEED_STRVISX_PROTO 1" >>confdefs.h -ac_foo=`eval echo \\$ac_cv_var_timezone` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then +fi +fi -cat >>confdefs.h <<_ACEOF -#define HAVE_TIMEZONE 1 +if test "$ac_cv_func_svis+set" != set -o "$ac_cv_func_svis" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if svis needs a prototype" >&5 +printf %s "checking if svis needs a prototype... " >&6; } +if test ${ac_cv_func_svis_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int svis (struct foo*); +int +main (void) +{ +svis(&xx) + ; + return 0; +} _ACEOF - - ac_fn_c_check_decl "$LINENO" "timezone" "ac_cv_have_decl_timezone" "#include -" -if test "x$ac_cv_have_decl_timezone" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_svis_noproto=yes" +else $as_nop + eval "ac_cv_func_svis_noproto=no" fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_svis_noproto" >&5 +printf "%s\n" "$ac_cv_func_svis_noproto" >&6; } +if test "$ac_cv_func_svis_noproto" = yes; then -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_TIMEZONE $ac_have_decl -_ACEOF +printf "%s\n" "#define NEED_SVIS_PROTO 1" >>confdefs.h +fi fi +if test "$ac_cv_func_unvis+set" != set -o "$ac_cv_func_unvis" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if unvis needs a prototype" >&5 +printf %s "checking if unvis needs a prototype... " >&6; } +if test ${ac_cv_func_unvis_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int unvis (struct foo*); +int +main (void) +{ +unvis(&xx) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_unvis_noproto=yes" +else $as_nop + eval "ac_cv_func_unvis_noproto=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_unvis_noproto" >&5 +printf "%s\n" "$ac_cv_func_unvis_noproto" >&6; } +if test "$ac_cv_func_unvis_noproto" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for altzone" >&5 -$as_echo_n "checking for altzone... " >&6; } -if test "${ac_cv_var_altzone+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +printf "%s\n" "#define NEED_UNVIS_PROTO 1" >>confdefs.h +fi +fi - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_func_vis+set" != set -o "$ac_cv_func_vis" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if vis needs a prototype" >&5 +printf %s "checking if vis needs a prototype... " >&6; } +if test ${ac_cv_func_vis_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include - void * foo(void) { return &altzone; } +#ifdef HAVE_VIS_H +#include +#endif +struct foo { int foo; } xx; +extern int vis (struct foo*); int -main () +main (void) { -foo() +vis(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_altzone=yes -else - ac_cv_var_altzone=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_vis_noproto=yes" +else $as_nop + eval "ac_cv_func_vis_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_cv_var_altzone" != yes ; then +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vis_noproto" >&5 +printf "%s\n" "$ac_cv_func_vis_noproto" >&6; } +if test "$ac_cv_func_vis_noproto" = yes; then + +printf "%s\n" "#define NEED_VIS_PROTO 1" >>confdefs.h + +fi +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking checking for dirfd" >&5 +printf %s "checking checking for dirfd... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -extern int altzone; -int foo(void) { return altzone; } +#include +#ifdef HAVE_DIRENT_H +#include +#endif + int -main () +main (void) { -foo() +DIR *d = 0; dirfd(d); ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_var_altzone=yes -else - ac_cv_var_altzone=no +if ac_fn_c_try_link "$LINENO" +then : + ac_rk_have_dirfd=yes +else $as_nop + ac_rk_have_dirfd=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -fi - -fi - -ac_foo=`eval echo \\$ac_cv_var_altzone` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - -cat >>confdefs.h <<_ACEOF -#define HAVE_ALTZONE 1 -_ACEOF - - ac_fn_c_check_decl "$LINENO" "altzone" "ac_cv_have_decl_altzone" "#include -" -if test "x$ac_cv_have_decl_altzone" = x""yes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi +if test "$ac_rk_have_dirfd" = "yes" ; then -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_ALTZONE $ac_have_decl -_ACEOF +printf "%s\n" "#define HAVE_DIRFD 1" >>confdefs.h fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_rk_have_dirfd" >&5 +printf "%s\n" "$ac_rk_have_dirfd" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dd_fd in DIR" >&5 +printf %s "checking for dd_fd in DIR... " >&6; } +if test ${ac_cv_type_dir_dd_fd+y} +then : + printf %s "(cached) " >&6 +else $as_nop -cv=`echo "sa_family_t" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sa_family_t" >&5 -$as_echo_n "checking for sa_family_t... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS -#include -#include -#endif - #include -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include +#ifdef HAVE_DIRENT_H +#include #endif int -main () +main (void) { -sa_family_t foo; +DIR x; memset(&x, 0, sizeof(x)); x.dd_fd ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_type_dir_dd_fd=yes +else $as_nop + ac_cv_type_dir_dd_fd=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo sa_family_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "sa_family_t" "ac_cv_type_sa_family_t" "$ac_includes_default" -if test "x$ac_cv_type_sa_family_t" = x""yes; then : +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_dir_dd_fd" >&5 +printf "%s\n" "$ac_cv_type_dir_dd_fd" >&6; } +if test "$ac_cv_type_dir_dd_fd" = yes; then -cat >>confdefs.h <<_ACEOF -#define HAVE_SA_FAMILY_T 1 -_ACEOF +printf "%s\n" "#define HAVE_DIR_DD_FD 1" >>confdefs.h -fi fi -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF - -fi -cv=`echo "socklen_t" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5 -$as_echo_n "checking for socklen_t... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_aton" >&5 +printf %s "checking for inet_aton... " >&6; } +if test ${ac_cv_func_inet_aton+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#ifdef HAVE_SYS_TYPES_H #include -#if STDC_HEADERS -#include -#include #endif - -#include #ifdef HAVE_SYS_SOCKET_H #include #endif -#ifdef HAVE_WS2TCPIP_H -#include +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include #endif int -main () +main (void) { -socklen_t foo; + +/* 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_inet_aton) || defined (__stub___inet_aton) +choke me +#else +inet_aton(0,0); +#endif + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "ac_cv_func_inet_aton=yes" +else $as_nop + eval "ac_cv_func_inet_aton=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo socklen_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "$ac_includes_default" -if test "x$ac_cv_type_socklen_t" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_SOCKLEN_T 1 -_ACEOF - -fi +if eval "test \"\${ac_cv_func_inet_aton}\" = yes"; then -fi +printf "%s\n" "#define HAVE_INET_ATON 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + case " $LIBOBJS " in + *" inet_aton.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS inet_aton.$ac_objext" + ;; +esac fi - - -cv=`echo "struct sockaddr" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr" >&5 -$as_echo_n "checking for struct sockaddr... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_ntop" >&5 +printf %s "checking for inet_ntop... " >&6; } +if test ${ac_cv_func_inet_ntop+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#ifdef HAVE_SYS_TYPES_H #include -#if STDC_HEADERS -#include -#include #endif - -#include #ifdef HAVE_SYS_SOCKET_H #include #endif -#ifdef HAVE_WS2TCPIP_H -#include +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include #endif int -main () +main (void) { -struct sockaddr foo; + +/* 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_inet_ntop) || defined (__stub___inet_ntop) +choke me +#else +inet_ntop(0, 0, 0, 0); +#endif + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "ac_cv_func_inet_ntop=yes" +else $as_nop + eval "ac_cv_func_inet_ntop=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo struct sockaddr | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "struct sockaddr" "ac_cv_type_struct_sockaddr" "$ac_includes_default" -if test "x$ac_cv_type_struct_sockaddr" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_SOCKADDR 1 -_ACEOF - -fi +if eval "test \"\${ac_cv_func_inet_ntop}\" = yes"; then -fi +printf "%s\n" "#define HAVE_INET_NTOP 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + case " $LIBOBJS " in + *" inet_ntop.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS inet_ntop.$ac_objext" + ;; +esac fi - - -cv=`echo "struct sockaddr_storage" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr_storage" >&5 -$as_echo_n "checking for struct sockaddr_storage... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inet_pton" >&5 +printf %s "checking for inet_pton... " >&6; } +if test ${ac_cv_func_inet_pton+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#ifdef HAVE_SYS_TYPES_H #include -#if STDC_HEADERS -#include -#include #endif - -#include #ifdef HAVE_SYS_SOCKET_H #include #endif -#ifdef HAVE_WS2TCPIP_H -#include +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include #endif int -main () +main (void) { -struct sockaddr_storage foo; + +/* 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_inet_pton) || defined (__stub___inet_pton) +choke me +#else +inet_pton(0,0,0); +#endif + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_link "$LINENO" +then : + eval "ac_cv_func_inet_pton=yes" +else $as_nop + eval "ac_cv_func_inet_pton=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo struct sockaddr_storage | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" "$ac_includes_default" -if test "x$ac_cv_type_struct_sockaddr_storage" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_SOCKADDR_STORAGE 1 -_ACEOF +if eval "test \"\${ac_cv_func_inet_pton}\" = yes"; then +printf "%s\n" "#define HAVE_INET_PTON 1" >>confdefs.h -fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + case " $LIBOBJS " in + *" inet_pton.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS inet_pton.$ac_objext" + ;; +esac fi -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF - -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sa_len in struct sockaddr" >&5 +printf %s "checking for sa_len in struct sockaddr... " >&6; } +if test ${ac_cv_type_struct_sockaddr_sa_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop -cv=`echo "struct addrinfo" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct addrinfo" >&5 -$as_echo_n "checking for struct addrinfo... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS -#include -#include -#endif - #include -#ifdef HAVE_NETDB_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif +#include int -main () +main (void) { -struct addrinfo foo; +struct sockaddr x; memset(&x, 0, sizeof(x)); x.sa_len ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo struct addrinfo | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "struct addrinfo" "ac_cv_type_struct_addrinfo" "$ac_includes_default" -if test "x$ac_cv_type_struct_addrinfo" = x""yes; then : +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_type_struct_sockaddr_sa_len=yes +else $as_nop + ac_cv_type_struct_sockaddr_sa_len=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_ADDRINFO 1 -_ACEOF +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_sockaddr_sa_len" >&5 +printf "%s\n" "$ac_cv_type_struct_sockaddr_sa_len" >&6; } +if test "$ac_cv_type_struct_sockaddr_sa_len" = yes; then -fi +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_SA_LEN 1" >>confdefs.h + fi -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF -fi +#if test "$ac_cv_func_getaddrinfo" = "yes"; then +# rk_BROKEN_GETADDRINFO +# if test "$ac_cv_func_getaddrinfo_numserv" = no; then +# AC_LIBOBJ(getaddrinfo) +# AC_LIBOBJ(freeaddrinfo) +# fi +#fi -cv=`echo "struct ifaddrs" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct ifaddrs" >&5 -$as_echo_n "checking for struct ifaddrs... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else +if test "$ac_cv_func_setenv+set" != set -o "$ac_cv_func_setenv" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if setenv needs a prototype" >&5 +printf %s "checking if setenv needs a prototype... " >&6; } +if test ${ac_cv_func_setenv_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS #include -#include -#endif -#include +struct foo { int foo; } xx; +extern int setenv (struct foo*); int -main () +main (void) { -struct ifaddrs foo; +setenv(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_setenv_noproto=yes" +else $as_nop + eval "ac_cv_func_setenv_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo struct ifaddrs | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "struct ifaddrs" "ac_cv_type_struct_ifaddrs" "$ac_includes_default" -if test "x$ac_cv_type_struct_ifaddrs" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_IFADDRS 1 -_ACEOF - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_setenv_noproto" >&5 +printf "%s\n" "$ac_cv_func_setenv_noproto" >&6; } +if test "$ac_cv_func_setenv_noproto" = yes; then -fi +printf "%s\n" "#define NEED_SETENV_PROTO 1" >>confdefs.h fi - -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF - fi - -cv=`echo "struct iovec" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct iovec" >&5 -$as_echo_n "checking for struct iovec... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else +if test "$ac_cv_func_unsetenv+set" != set -o "$ac_cv_func_unsetenv" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if unsetenv needs a prototype" >&5 +printf %s "checking if unsetenv needs a prototype... " >&6; } +if test ${ac_cv_func_unsetenv_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS #include -#include -#endif - -#include -#include - +struct foo { int foo; } xx; +extern int unsetenv (struct foo*); int -main () +main (void) { -struct iovec foo; +unsetenv(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_unsetenv_noproto=yes" +else $as_nop + eval "ac_cv_func_unsetenv_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo struct iovec | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "struct iovec" "ac_cv_type_struct_iovec" "$ac_includes_default" -if test "x$ac_cv_type_struct_iovec" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_IOVEC 1 -_ACEOF - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_unsetenv_noproto" >&5 +printf "%s\n" "$ac_cv_func_unsetenv_noproto" >&6; } +if test "$ac_cv_func_unsetenv_noproto" = yes; then -fi +printf "%s\n" "#define NEED_UNSETENV_PROTO 1" >>confdefs.h fi - -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF - fi - -cv=`echo "struct msghdr" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct msghdr" >&5 -$as_echo_n "checking for struct msghdr... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else +if test "$ac_cv_func_gethostname+set" != set -o "$ac_cv_func_gethostname" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if gethostname needs a prototype" >&5 +printf %s "checking if gethostname needs a prototype... " >&6; } +if test ${ac_cv_func_gethostname_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS -#include -#include -#endif - -#include -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_WS2TCPIP_H -#include -#endif +#include +struct foo { int foo; } xx; +extern int gethostname (struct foo*); int -main () +main (void) { -struct msghdr foo; +gethostname(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_gethostname_noproto=yes" +else $as_nop + eval "ac_cv_func_gethostname_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo struct msghdr | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "struct msghdr" "ac_cv_type_struct_msghdr" "$ac_includes_default" -if test "x$ac_cv_type_struct_msghdr" = x""yes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE_STRUCT_MSGHDR 1 -_ACEOF - +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostname_noproto" >&5 +printf "%s\n" "$ac_cv_func_gethostname_noproto" >&6; } +if test "$ac_cv_func_gethostname_noproto" = yes; then -fi +printf "%s\n" "#define NEED_GETHOSTNAME_PROTO 1" >>confdefs.h fi - -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF - fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct winsize" >&5 -$as_echo_n "checking for struct winsize... " >&6; } -if test "${ac_cv_struct_winsize+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -ac_cv_struct_winsize=no -for i in sys/termios.h sys/ioctl.h; do -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_func_mkstemp+set" != set -o "$ac_cv_func_mkstemp" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if mkstemp needs a prototype" >&5 +printf %s "checking if mkstemp needs a prototype... " >&6; } +if test ${ac_cv_func_mkstemp_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include <$i> - +#include +struct foo { int foo; } xx; +extern int mkstemp (struct foo*); +int +main (void) +{ +mkstemp(&xx) + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "struct[ ]*winsize" >/dev/null 2>&1; then : - ac_cv_struct_winsize=yes; break +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_mkstemp_noproto=yes" +else $as_nop + eval "ac_cv_func_mkstemp_noproto=no" fi -rm -f conftest* -done - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mkstemp_noproto" >&5 +printf "%s\n" "$ac_cv_func_mkstemp_noproto" >&6; } +if test "$ac_cv_func_mkstemp_noproto" = yes; then -if test "$ac_cv_struct_winsize" = "yes"; then - -$as_echo "#define HAVE_STRUCT_WINSIZE 1" >>confdefs.h +printf "%s\n" "#define NEED_MKSTEMP_PROTO 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_winsize" >&5 -$as_echo "$ac_cv_struct_winsize" >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "ws_xpixel" >/dev/null 2>&1; then : - -$as_echo "#define HAVE_WS_XPIXEL 1" >>confdefs.h - fi -rm -f conftest* -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include +if test "$ac_cv_func_getusershell+set" != set -o "$ac_cv_func_getusershell" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getusershell needs a prototype" >&5 +printf %s "checking if getusershell needs a prototype... " >&6; } +if test ${ac_cv_func_getusershell_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +struct foo { int foo; } xx; +extern int getusershell (struct foo*); +int +main (void) +{ +getusershell(&xx) + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "ws_ypixel" >/dev/null 2>&1; then : - -$as_echo "#define HAVE_WS_YPIXEL 1" >>confdefs.h - +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_getusershell_noproto=yes" +else $as_nop + eval "ac_cv_func_getusershell_noproto=no" fi -rm -f conftest* - - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getusershell_noproto" >&5 +printf "%s\n" "$ac_cv_func_getusershell_noproto" >&6; } +if test "$ac_cv_func_getusershell_noproto" = yes; then +printf "%s\n" "#define NEED_GETUSERSHELL_PROTO 1" >>confdefs.h +fi +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct spwd" >&5 -$as_echo_n "checking for struct spwd... " >&6; } -if test "${ac_cv_struct_spwd+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_func_daemon+set" != set -o "$ac_cv_func_daemon" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if daemon needs a prototype" >&5 +printf %s "checking if daemon needs a prototype... " >&6; } +if test ${ac_cv_func_daemon_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#ifdef HAVE_SHADOW_H -#include -#endif +#include +struct foo { int foo; } xx; +extern int daemon (struct foo*); int -main () +main (void) { -struct spwd foo; +daemon(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_struct_spwd=yes -else - ac_cv_struct_spwd=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_daemon_noproto=yes" +else $as_nop + eval "ac_cv_func_daemon_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_daemon_noproto" >&5 +printf "%s\n" "$ac_cv_func_daemon_noproto" >&6; } +if test "$ac_cv_func_daemon_noproto" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_spwd" >&5 -$as_echo "$ac_cv_struct_spwd" >&6; } - -if test "$ac_cv_struct_spwd" = "yes"; then - -$as_echo "#define HAVE_STRUCT_SPWD 1" >>confdefs.h +printf "%s\n" "#define NEED_DAEMON_PROTO 1" >>confdefs.h fi - - -# -# Check if we want samba's socket wrapper -# - - - -# Check whether --enable-socket-wrapper was given. -if test "${enable_socket_wrapper+set}" = set; then : - enableval=$enable_socket_wrapper; fi - if test "x$enable_socket_wrapper" = xyes; then - have_socket_wrapper_TRUE= - have_socket_wrapper_FALSE='#' -else - have_socket_wrapper_TRUE='#' - have_socket_wrapper_FALSE= +if test "$ac_cv_func_iruserok+set" != set -o "$ac_cv_func_iruserok" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if iruserok needs a prototype" >&5 +printf %s "checking if iruserok needs a prototype... " >&6; } +if test ${ac_cv_func_iruserok_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +struct foo { int foo; } xx; +extern int iruserok (struct foo*); +int +main (void) +{ +iruserok(&xx) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_iruserok_noproto=yes" +else $as_nop + eval "ac_cv_func_iruserok_noproto=no" fi - -if test "x$enable_socket_wrapper" = xyes ; then - -$as_echo "#define SOCKET_WRAPPER_REPLACE 1" >>confdefs.h - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_iruserok_noproto" >&5 +printf "%s\n" "$ac_cv_func_iruserok_noproto" >&6; } +if test "$ac_cv_func_iruserok_noproto" = yes; then +printf "%s\n" "#define NEED_IRUSEROK_PROTO 1" >>confdefs.h - - -LIB_roken="${LIB_roken} \$(LIB_crypt) \$(LIB_dbopen)" - - -LIBADD_roken="$LIB_roken" -LIB_roken="\$(top_builddir)/lib/vers/libvers.la $LIB_roken" - - -# Check whether --enable-otp was given. -if test "${enable_otp+set}" = set; then : - enableval=$enable_otp; -fi - -if test "$enable_otp" = yes -a "$db_type" = unknown; then - as_fn_error "OTP requires a NDBM/DB compatible library" "$LINENO" 5 fi -if test "$enable_otp" != no; then - if test "$db_type" != unknown; then - enable_otp=yes - else - enable_otp=no - fi fi -if test "$enable_otp" = yes; then -$as_echo "#define OTP 1" >>confdefs.h - LIB_otp='$(top_builddir)/lib/otp/libotp.la' +if test "$ac_cv_func_inet_aton+set" != set -o "$ac_cv_func_inet_aton" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if inet_aton needs a prototype" >&5 +printf %s "checking if inet_aton needs a prototype... " >&6; } +if test ${ac_cv_func_inet_aton_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef 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 +struct foo { int foo; } xx; +extern int inet_aton (struct foo*); +int +main (void) +{ +inet_aton(&xx) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_inet_aton_noproto=yes" +else $as_nop + eval "ac_cv_func_inet_aton_noproto=no" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable OTP library" >&5 -$as_echo_n "checking whether to enable OTP library... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_otp" >&5 -$as_echo "$enable_otp" >&6; } - if test "$enable_otp" = yes; then - OTP_TRUE= - OTP_FALSE='#' -else - OTP_TRUE='#' - OTP_FALSE= +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_inet_aton_noproto" >&5 +printf "%s\n" "$ac_cv_func_inet_aton_noproto" >&6; } +if test "$ac_cv_func_inet_aton_noproto" = yes; then - - - -for ac_header in dispatch/dispatch.h -do : - ac_fn_c_check_header_mongrel "$LINENO" "dispatch/dispatch.h" "ac_cv_header_dispatch_dispatch_h" "$ac_includes_default" -if test "x$ac_cv_header_dispatch_dispatch_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DISPATCH_DISPATCH_H 1 -_ACEOF +printf "%s\n" "#define NEED_INET_ATON_PROTO 1" >>confdefs.h fi - -done +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dispatch_async_f" >&5 -$as_echo_n "checking for dispatch_async_f... " >&6; } -if test "${ac_cv_funclib_dispatch_async_f+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for crypt" >&5 +printf %s "checking for crypt... " >&6; } +if test ${ac_cv_funclib_crypt+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_dispatch_async_f\" != yes" ; then +if eval "test \"\$ac_cv_func_crypt\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" dispatch; do + for ac_lib in "" crypt; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -23257,1904 +25344,1816 @@ LIBS=" $ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_DISPATCH_DISPATCH_H -#include -#endif + int -main () +main (void) { -dispatch_async_f(0,0,0) +crypt() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_dispatch_async_f=$ac_lib; else ac_cv_funclib_dispatch_async_f=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_crypt=$ac_lib; else ac_cv_funclib_crypt=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_dispatch_async_f=\${ac_cv_funclib_dispatch_async_f-no}" + eval "ac_cv_funclib_crypt=\${ac_cv_funclib_crypt-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_dispatch_async_f" +eval "ac_res=\$ac_cv_funclib_crypt" if false; then - for ac_func in dispatch_async_f -do : - ac_fn_c_check_func "$LINENO" "dispatch_async_f" "ac_cv_func_dispatch_async_f" -if test "x$ac_cv_func_dispatch_async_f" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DISPATCH_ASYNC_F 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "crypt" "ac_cv_func_crypt" +if test "x$ac_cv_func_crypt" = xyes +then : + printf "%s\n" "#define HAVE_CRYPT 1" >>confdefs.h fi -done fi -# dispatch_async_f -eval "ac_tr_func=HAVE_`echo dispatch_async_f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# crypt +eval "ac_tr_func=HAVE_`echo crypt | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_dispatch_async_f=$ac_res" +eval "LIB_crypt=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_dispatch_async_f=yes" - eval "LIB_dispatch_async_f=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_crypt=yes" + eval "LIB_crypt=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_dispatch_async_f=no" - eval "LIB_dispatch_async_f=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_crypt=no" + eval "LIB_crypt=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_dispatch_async_f=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_crypt=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test "$ac_cv_func_dispatch_async_f" = yes ; then -$as_echo "#define HAVE_GCD 1" >>confdefs.h - libdispatch=yes -else - libdispatch=no -fi - if test "$libdispatch" = yes; then - have_gcd_TRUE= - have_gcd_FALSE='#' -else - have_gcd_TRUE='#' - have_gcd_FALSE= -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if strerror_r is compatible with system prototype" >&5 +printf %s "checking if strerror_r is compatible with system prototype... " >&6; } +if test ${ac_cv_func_strerror_r_proto_compat+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +int +main (void) +{ +int strerror_r(int, char *, size_t) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_strerror_r_proto_compat=yes" +else $as_nop + eval "ac_cv_func_strerror_r_proto_compat=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_strerror_r_proto_compat" >&5 +printf "%s\n" "$ac_cv_func_strerror_r_proto_compat" >&6; } +if test "$ac_cv_func_strerror_r_proto_compat" = yes; then +printf "%s\n" "#define STRERROR_R_PROTO_COMPATIBLE 1" >>confdefs.h -# Check whether --enable-osfc2 was given. -if test "${enable_osfc2+set}" = set; then : - enableval=$enable_osfc2; fi -LIB_security= -if test "$enable_osfc2" = yes; then -$as_echo "#define HAVE_OSFC2 1" >>confdefs.h - LIB_security=-lsecurity +ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" +if test "x$ac_cv_func_strerror_r" = xyes +then : + +printf "%s\n" "#define HAVE_STRERROR_R 1" >>confdefs.h + fi -# Check whether --enable-mmap was given. -if test "${enable_mmap+set}" = set; then : - enableval=$enable_mmap; -fi -if test "$enable_mmap" = "no"; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if gethostbyname is compatible with system prototype" >&5 +printf %s "checking if gethostbyname is compatible with system prototype... " >&6; } +if test ${ac_cv_func_gethostbyname_proto_compat+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -$as_echo "#define NO_MMAP 1" >>confdefs.h +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif +int +main (void) +{ +struct hostent *gethostbyname(const char *) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_gethostbyname_proto_compat=yes" +else $as_nop + eval "ac_cv_func_gethostbyname_proto_compat=no" fi - -# Check whether --enable-afs-string-to-key was given. -if test "${enable_afs_string_to_key+set}" = set; then : - enableval=$enable_afs_string_to_key; -else - enable_afs_string_to_key=yes +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostbyname_proto_compat" >&5 +printf "%s\n" "$ac_cv_func_gethostbyname_proto_compat" >&6; } +if test "$ac_cv_func_gethostbyname_proto_compat" = yes; then -if test "$enable_afs_string_to_key" = "yes"; then - -$as_echo "#define ENABLE_AFS_STRING_TO_KEY 1" >>confdefs.h +printf "%s\n" "#define GETHOSTBYNAME_PROTO_COMPATIBLE 1" >>confdefs.h fi -# Extract the first word of "nroff", so it can be a program name with args. -set dummy nroff; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_NROFF+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $NROFF in - [\\/]* | ?:[\\/]*) - ac_cv_path_NROFF="$NROFF" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_NROFF="$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 -NROFF=$ac_cv_path_NROFF -if test -n "$NROFF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NROFF" >&5 -$as_echo "$NROFF" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if gethostbyaddr is compatible with system prototype" >&5 +printf %s "checking if gethostbyaddr is compatible with system prototype... " >&6; } +if test ${ac_cv_func_gethostbyaddr_proto_compat+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -# Extract the first word of "groff", so it can be a program name with args. -set dummy groff; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_GROFF+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $GROFF in - [\\/]* | ?:[\\/]*) - ac_cv_path_GROFF="$GROFF" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_GROFF="$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 +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif - ;; -esac +int +main (void) +{ +struct hostent *gethostbyaddr(const void *, size_t, int) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_gethostbyaddr_proto_compat=yes" +else $as_nop + eval "ac_cv_func_gethostbyaddr_proto_compat=no" fi -GROFF=$ac_cv_path_GROFF -if test -n "$GROFF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 -$as_echo "$GROFF" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_gethostbyaddr_proto_compat" >&5 +printf "%s\n" "$ac_cv_func_gethostbyaddr_proto_compat" >&6; } +if test "$ac_cv_func_gethostbyaddr_proto_compat" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to format man pages" >&5 -$as_echo_n "checking how to format man pages... " >&6; } -if test "${ac_cv_sys_man_format+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat > conftest.1 << END -.Dd January 1, 1970 -.Dt CONFTEST 1 -.Sh NAME -.Nm conftest -.Nd foobar -END +printf "%s\n" "#define GETHOSTBYADDR_PROTO_COMPATIBLE 1" >>confdefs.h -if test "$NROFF" ; then - for i in "-mdoc" "-mandoc"; do - if "$NROFF" $i conftest.1 2> /dev/null | \ - grep Jan > /dev/null 2>&1 ; then - ac_cv_sys_man_format="$NROFF $i" - break - fi - done -fi -if test "$ac_cv_sys_man_format" = "" -a "$GROFF" ; then - for i in "-mdoc" "-mandoc"; do - if "$GROFF" -Tascii $i conftest.1 2> /dev/null | \ - grep Jan > /dev/null 2>&1 ; then - ac_cv_sys_man_format="$GROFF -Tascii $i" - break - fi - done -fi -if test "$ac_cv_sys_man_format"; then - ac_cv_sys_man_format="$ac_cv_sys_man_format \$< > \$@" fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_man_format" >&5 -$as_echo "$ac_cv_sys_man_format" >&6; } -if test "$ac_cv_sys_man_format"; then - CATMAN="$ac_cv_sys_man_format" -fi - if test "$CATMAN"; then - CATMAN_TRUE= - CATMAN_FALSE='#' -else - CATMAN_TRUE='#' - CATMAN_FALSE= -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking extension of pre-formatted manual pages" >&5 -$as_echo_n "checking extension of pre-formatted manual pages... " >&6; } -if test "${ac_cv_sys_catman_ext+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if grep _suffix /etc/man.conf > /dev/null 2>&1; then - ac_cv_sys_catman_ext=0 -else - ac_cv_sys_catman_ext=number -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getservbyname is compatible with system prototype" >&5 +printf %s "checking if getservbyname is compatible with system prototype... " >&6; } +if test ${ac_cv_func_getservbyname_proto_compat+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef 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 +#ifdef HAVE_NETDB_H +#include +#endif + +int +main (void) +{ +struct servent *getservbyname(const char *, const char *) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_getservbyname_proto_compat=yes" +else $as_nop + eval "ac_cv_func_getservbyname_proto_compat=no" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_catman_ext" >&5 -$as_echo "$ac_cv_sys_catman_ext" >&6; } -if test "$ac_cv_sys_catman_ext" = number; then - CATMANEXT='$$section' -else - CATMANEXT=0 +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getservbyname_proto_compat" >&5 +printf "%s\n" "$ac_cv_func_getservbyname_proto_compat" >&6; } +if test "$ac_cv_func_getservbyname_proto_compat" = yes; then +printf "%s\n" "#define GETSERVBYNAME_PROTO_COMPATIBLE 1" >>confdefs.h +fi -# Check whether --with-readline was given. -if test "${with_readline+set}" = set; then : - withval=$with_readline; -fi -# Check whether --with-readline-lib was given. -if test "${with_readline_lib+set}" = set; then : - withval=$with_readline_lib; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-readline-lib" "$LINENO" 5 -elif test "X$with_readline" = "X"; then - with_readline=yes -fi -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getsockname is compatible with system prototype" >&5 +printf %s "checking if getsockname is compatible with system prototype... " >&6; } +if test ${ac_cv_func_getsockname_proto_compat+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif -# Check whether --with-readline-include was given. -if test "${with_readline_include+set}" = set; then : - withval=$with_readline_include; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-readline-include" "$LINENO" 5 -elif test "X$with_readline" = "X"; then - with_readline=yes +int +main (void) +{ +int getsockname(int, struct sockaddr*, socklen_t*) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_getsockname_proto_compat=yes" +else $as_nop + eval "ac_cv_func_getsockname_proto_compat=no" fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getsockname_proto_compat" >&5 +printf "%s\n" "$ac_cv_func_getsockname_proto_compat" >&6; } +if test "$ac_cv_func_getsockname_proto_compat" = yes; then -# Check whether --with-readline-config was given. -if test "${with_readline_config+set}" = set; then : - withval=$with_readline_config; -fi +printf "%s\n" "#define GETSOCKNAME_PROTO_COMPATIBLE 1" >>confdefs.h +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for readline" >&5 -$as_echo_n "checking for readline... " >&6; } -case "$with_readline" in -yes|"") d='' ;; -no) d= ;; -*) d="$with_readline" ;; -esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if openlog is compatible with system prototype" >&5 +printf %s "checking if openlog is compatible with system prototype... " >&6; } +if test ${ac_cv_func_openlog_proto_compat+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -header_dirs= -lib_dirs= -for i in $d; do - if test "$with_readline_include" = ""; then - if test -d "$i/include/readline"; then - header_dirs="$header_dirs $i/include/readline" - fi - if test -d "$i/include"; then - header_dirs="$header_dirs $i/include" - fi - fi - if test "$with_readline_lib" = ""; then - if test -d "$i/lib$abilibdirext"; then - lib_dirs="$lib_dirs $i/lib$abilibdirext" - fi - fi -done +#ifdef HAVE_SYSLOG_H +#include +#endif -if test "$with_readline_include"; then - header_dirs="$with_readline_include $header_dirs" -fi -if test "$with_readline_lib"; then - lib_dirs="$with_readline_lib $lib_dirs" +int +main (void) +{ +void openlog(const char *, int, int) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_openlog_proto_compat=yes" +else $as_nop + eval "ac_cv_func_openlog_proto_compat=no" fi - -if test "$with_readline_config" = ""; then - with_readline_config='' +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_openlog_proto_compat" >&5 +printf "%s\n" "$ac_cv_func_openlog_proto_compat" >&6; } -readline_cflags= -readline_libs= +if test "$ac_cv_func_openlog_proto_compat" = yes; then -case "$with_readline_config" in -yes|no|""|"") - if test -f $with_readline/bin/ ; then - with_readline_config=$with_readline/bin/ - fi - ;; -esac +printf "%s\n" "#define OPENLOG_PROTO_COMPATIBLE 1" >>confdefs.h -case "$with_readline_config" in -yes|no|"") - ;; -*) - readline_cflags="`$with_readline_config --cflags 2>&1`" - readline_libs="`$with_readline_config --libs 2>&1`" - ;; -esac +fi -found=no -if test "$with_readline" != no; then - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - if test "$readline_cflags" -a "$readline_libs"; then - CFLAGS="$readline_cflags $save_CFLAGS" - LIBS="$readline_libs $save_LIBS" - for ac_header in readline.h readline/readline.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF -fi -done - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_func_crypt+set" != set -o "$ac_cv_func_crypt" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if crypt needs a prototype" >&5 +printf %s "checking if crypt needs a prototype... " >&6; } +if test ${ac_cv_func_crypt_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if defined(HAVE_READLINE_READLINE_H) -#include -#elif defined(HAVE_READLINE_H) -#include + +#ifdef HAVE_CRYPT_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include #endif +struct foo { int foo; } xx; +extern int crypt (struct foo*); int -main () +main (void) { - +crypt(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - INCLUDE_readline="$readline_cflags" - LIB_readline="$readline_libs" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: from $with_readline_config" >&5 -$as_echo "from $with_readline_config" >&6; } - found=yes +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_func_crypt_noproto=yes" +else $as_nop + eval "ac_cv_func_crypt_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi - if test "$found" = no; then - ires= lres= - for i in $header_dirs; do - CFLAGS="-I$i $save_CFLAGS" - for ac_header in readline.h readline/readline.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_crypt_noproto" >&5 +printf "%s\n" "$ac_cv_func_crypt_noproto" >&6; } +if test "$ac_cv_func_crypt_noproto" = yes; then + +printf "%s\n" "#define NEED_CRYPT_PROTO 1" >>confdefs.h fi +fi -done - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for h_errno" >&5 +printf %s "checking for h_errno... " >&6; } +if test ${ac_cv_var_h_errno+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if defined(HAVE_READLINE_READLINE_H) -#include -#elif defined(HAVE_READLINE_H) -#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include #endif + void * foo(void) { return &h_errno; } int -main () +main (void) { - +foo() ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ires=$i;break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_h_errno=yes +else $as_nop + ac_cv_var_h_errno=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - for i in $lib_dirs; do - LIBS="-L$i -lreadline $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_var_h_errno" != yes ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if defined(HAVE_READLINE_READLINE_H) -#include -#elif defined(HAVE_READLINE_H) -#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include #endif +extern int h_errno; +int foo(void) { return h_errno; } int -main () +main (void) { - +foo() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lres=$i;break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_h_errno=yes +else $as_nop + ac_cv_var_h_errno=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - done - if test "$ires" -a "$lres" -a "$with_readline" != "no"; then - INCLUDE_readline="-I$ires" - LIB_readline="-L$lres -lreadline " - found=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 -$as_echo "headers $ires, libraries $lres" >&6; } - fi - fi - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" fi -if test "$found" = yes; then - -cat >>confdefs.h <<_ACEOF -#define READLINE 1 -_ACEOF - - with_readline=yes -else - with_readline=no - INCLUDE_readline= - LIB_readline= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +ac_foo=`eval echo \\$ac_cv_var_h_errno` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then +printf "%s\n" "#define HAVE_H_ERRNO 1" >>confdefs.h + ac_fn_check_decl "$LINENO" "h_errno" "ac_cv_have_decl_h_errno" "#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_h_errno" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_H_ERRNO $ac_have_decl" >>confdefs.h - - -# Check whether --with-libedit was given. -if test "${with_libedit+set}" = set; then : - withval=$with_libedit; fi -# Check whether --with-libedit-lib was given. -if test "${with_libedit_lib+set}" = set; then : - withval=$with_libedit_lib; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-libedit-lib" "$LINENO" 5 -elif test "X$with_libedit" = "X"; then - with_libedit=yes -fi -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for h_errlist" >&5 +printf %s "checking for h_errlist... " >&6; } +if test ${ac_cv_var_h_errlist+y} +then : + printf %s "(cached) " >&6 +else $as_nop -# Check whether --with-libedit-include was given. -if test "${with_libedit_include+set}" = set; then : - withval=$with_libedit_include; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-libedit-include" "$LINENO" 5 -elif test "X$with_libedit" = "X"; then - with_libedit=yes + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif + void * foo(void) { return &h_errlist; } +int +main (void) +{ +foo() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_h_errlist=yes +else $as_nop + ac_cv_var_h_errlist=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_var_h_errlist" != yes ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif +extern int h_errlist; +int foo(void) { return h_errlist; } +int +main (void) +{ +foo() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_h_errlist=yes +else $as_nop + ac_cv_var_h_errlist=no fi - - -# Check whether --with-libedit-config was given. -if test "${with_libedit_config+set}" = set; then : - withval=$with_libedit_config; +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext fi +fi +ac_foo=`eval echo \\$ac_cv_var_h_errlist` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then +printf "%s\n" "#define HAVE_H_ERRLIST 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libedit" >&5 -$as_echo_n "checking for libedit... " >&6; } - -case "$with_libedit" in -yes|"") d='' ;; -no) d= ;; -*) d="$with_libedit" ;; -esac - -header_dirs= -lib_dirs= -for i in $d; do - if test "$with_libedit_include" = ""; then - if test -d "$i/include/libedit"; then - header_dirs="$header_dirs $i/include/libedit" - fi - if test -d "$i/include"; then - header_dirs="$header_dirs $i/include" - fi - fi - if test "$with_libedit_lib" = ""; then - if test -d "$i/lib$abilibdirext"; then - lib_dirs="$lib_dirs $i/lib$abilibdirext" - fi - fi -done - -if test "$with_libedit_include"; then - header_dirs="$with_libedit_include $header_dirs" -fi -if test "$with_libedit_lib"; then - lib_dirs="$with_libedit_lib $lib_dirs" + ac_fn_check_decl "$LINENO" "h_errlist" "ac_cv_have_decl_h_errlist" "#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_h_errlist" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 fi +printf "%s\n" "#define HAVE_DECL_H_ERRLIST $ac_have_decl" >>confdefs.h -if test "$with_libedit_config" = ""; then - with_libedit_config='' fi -libedit_cflags= -libedit_libs= -case "$with_libedit_config" in -yes|no|""|"") - if test -f $with_libedit/bin/ ; then - with_libedit_config=$with_libedit/bin/ - fi - ;; -esac -case "$with_libedit_config" in -yes|no|"") - ;; -*) - libedit_cflags="`$with_libedit_config --cflags 2>&1`" - libedit_libs="`$with_libedit_config --libs 2>&1`" - ;; -esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for h_nerr" >&5 +printf %s "checking for h_nerr... " >&6; } +if test ${ac_cv_var_h_nerr+y} +then : + printf %s "(cached) " >&6 +else $as_nop -found=no -if test "$with_libedit" != no; then - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - if test "$libedit_cflags" -a "$libedit_libs"; then - CFLAGS="$libedit_cflags $save_CFLAGS" - LIBS="$libedit_libs $save_LIBS" - for ac_header in readline.h readline/readline.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif + void * foo(void) { return &h_nerr; } +int +main (void) +{ +foo() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_h_nerr=yes +else $as_nop + ac_cv_var_h_nerr=no fi - -done - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_var_h_nerr" != yes ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if defined(HAVE_READLINE_READLINE_H) -#include -#elif defined(HAVE_READLINE_H) -#include +#ifdef HAVE_NETDB_H +#include #endif - +#ifdef HAVE_WS2TCPIP_H +#include +#endif +extern int h_nerr; +int foo(void) { return h_nerr; } int -main () +main (void) { - +foo() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_h_nerr=yes +else $as_nop + ac_cv_var_h_nerr=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi - INCLUDE_libedit="$libedit_cflags" - LIB_libedit="$libedit_libs" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: from $with_libedit_config" >&5 -$as_echo "from $with_libedit_config" >&6; } - found=yes fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - fi - if test "$found" = no; then - ires= lres= - for i in $header_dirs; do - CFLAGS="-I$i $save_CFLAGS" - for ac_header in readline.h readline/readline.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + +ac_foo=`eval echo \\$ac_cv_var_h_nerr` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + +printf "%s\n" "#define HAVE_H_NERR 1" >>confdefs.h + + ac_fn_check_decl "$LINENO" "h_nerr" "ac_cv_have_decl_h_nerr" "#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_h_nerr" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_H_NERR $ac_have_decl" >>confdefs.h fi -done - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __progname" >&5 +printf %s "checking for __progname... " >&6; } +if test ${ac_cv_var___progname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if defined(HAVE_READLINE_READLINE_H) -#include -#elif defined(HAVE_READLINE_H) -#include +#ifdef HAVE_ERR_H +#include #endif - + void * foo(void) { return &__progname; } int -main () +main (void) { - +foo() ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ires=$i;break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var___progname=yes +else $as_nop + ac_cv_var___progname=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - for i in $lib_dirs; do - LIBS="-L$i -ledit $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_var___progname" != yes ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if defined(HAVE_READLINE_READLINE_H) -#include -#elif defined(HAVE_READLINE_H) -#include +#ifdef HAVE_ERR_H +#include #endif - +extern int __progname; +int foo(void) { return __progname; } int -main () +main (void) { - +foo() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lres=$i;break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var___progname=yes +else $as_nop + ac_cv_var___progname=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - done - if test "$ires" -a "$lres" -a "$with_libedit" != "no"; then - INCLUDE_libedit="-I$ires" - LIB_libedit="-L$lres -ledit " - found=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 -$as_echo "headers $ires, libraries $lres" >&6; } - fi - fi - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" fi -if test "$found" = yes; then +fi -cat >>confdefs.h <<_ACEOF -#define LIBEDIT 1 -_ACEOF +ac_foo=`eval echo \\$ac_cv_var___progname` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then - with_libedit=yes -else - with_libedit=no - INCLUDE_libedit= - LIB_libedit= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +printf "%s\n" "#define HAVE___PROGNAME 1" >>confdefs.h + ac_fn_check_decl "$LINENO" "__progname" "ac_cv_have_decl___progname" "#ifdef HAVE_ERR_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl___progname" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL___PROGNAME $ac_have_decl" >>confdefs.h +fi +ac_fn_check_decl "$LINENO" "optarg" "ac_cv_have_decl_optarg" " +#include +#ifdef HAVE_UNISTD_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_optarg" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_OPTARG $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "optind" "ac_cv_have_decl_optind" " +#include +#ifdef HAVE_UNISTD_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_optind" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_OPTIND $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "opterr" "ac_cv_have_decl_opterr" " +#include +#ifdef HAVE_UNISTD_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_opterr" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_OPTERR $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "optopt" "ac_cv_have_decl_optopt" " +#include +#ifdef HAVE_UNISTD_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_optopt" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_OPTOPT $ac_have_decl" >>confdefs.h +ac_fn_check_decl "$LINENO" "environ" "ac_cv_have_decl_environ" " +#include +#ifdef HAVE_UNISTD_H +#include +#endif +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_environ" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_ENVIRON $ac_have_decl" >>confdefs.h -subdirs="$subdirs lib/libedit" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff in struct tm" >&5 +printf %s "checking for tm_gmtoff in struct tm... " >&6; } +if test ${ac_cv_type_struct_tm_tm_gmtoff+y} +then : + printf %s "(cached) " >&6 +else $as_nop +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +struct tm x; memset(&x, 0, sizeof(x)); x.tm_gmtoff + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_type_struct_tm_tm_gmtoff=yes +else $as_nop + ac_cv_type_struct_tm_tm_gmtoff=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -# Check whether --with-hesiod was given. -if test "${with_hesiod+set}" = set; then : - withval=$with_hesiod; fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_tm_tm_gmtoff" >&5 +printf "%s\n" "$ac_cv_type_struct_tm_tm_gmtoff" >&6; } +if test "$ac_cv_type_struct_tm_tm_gmtoff" = yes; then -# Check whether --with-hesiod-lib was given. -if test "${with_hesiod_lib+set}" = set; then : - withval=$with_hesiod_lib; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-hesiod-lib" "$LINENO" 5 -elif test "X$with_hesiod" = "X"; then - with_hesiod=yes -fi -fi +printf "%s\n" "#define HAVE_STRUCT_TM_TM_GMTOFF 1" >>confdefs.h -# Check whether --with-hesiod-include was given. -if test "${with_hesiod_include+set}" = set; then : - withval=$with_hesiod_include; if test "$withval" = "yes" -o "$withval" = "no"; then - as_fn_error "No argument for --with-hesiod-include" "$LINENO" 5 -elif test "X$with_hesiod" = "X"; then - with_hesiod=yes -fi fi -# Check whether --with-hesiod-config was given. -if test "${with_hesiod_config+set}" = set; then : - withval=$with_hesiod_config; -fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tm_zone in struct tm" >&5 +printf %s "checking for tm_zone in struct tm... " >&6; } +if test ${ac_cv_type_struct_tm_tm_zone+y} +then : + printf %s "(cached) " >&6 +else $as_nop +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main (void) +{ +struct tm x; memset(&x, 0, sizeof(x)); x.tm_zone + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_type_struct_tm_tm_zone=yes +else $as_nop + ac_cv_type_struct_tm_tm_zone=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for hesiod" >&5 -$as_echo_n "checking for hesiod... " >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_tm_tm_zone" >&5 +printf "%s\n" "$ac_cv_type_struct_tm_tm_zone" >&6; } +if test "$ac_cv_type_struct_tm_tm_zone" = yes; then -case "$with_hesiod" in -yes|"") d='' ;; -no) d= ;; -*) d="$with_hesiod" ;; -esac -header_dirs= -lib_dirs= -for i in $d; do - if test "$with_hesiod_include" = ""; then - if test -d "$i/include/hesiod"; then - header_dirs="$header_dirs $i/include/hesiod" - fi - if test -d "$i/include"; then - header_dirs="$header_dirs $i/include" - fi - fi - if test "$with_hesiod_lib" = ""; then - if test -d "$i/lib$abilibdirext"; then - lib_dirs="$lib_dirs $i/lib$abilibdirext" - fi - fi -done +printf "%s\n" "#define HAVE_STRUCT_TM_TM_ZONE 1" >>confdefs.h -if test "$with_hesiod_include"; then - header_dirs="$with_hesiod_include $header_dirs" -fi -if test "$with_hesiod_lib"; then - lib_dirs="$with_hesiod_lib $lib_dirs" -fi -if test "$with_hesiod_config" = ""; then - with_hesiod_config='' fi -hesiod_cflags= -hesiod_libs= -case "$with_hesiod_config" in -yes|no|""|"") - if test -f $with_hesiod/bin/ ; then - with_hesiod_config=$with_hesiod/bin/ - fi - ;; -esac -case "$with_hesiod_config" in -yes|no|"") - ;; -*) - hesiod_cflags="`$with_hesiod_config --cflags 2>&1`" - hesiod_libs="`$with_hesiod_config --libs 2>&1`" - ;; -esac -found=no -if test "$with_hesiod" != no; then - save_CFLAGS="$CFLAGS" - save_LIBS="$LIBS" - if test "$hesiod_cflags" -a "$hesiod_libs"; then - CFLAGS="$hesiod_cflags $save_CFLAGS" - LIBS="$hesiod_libs $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for timezone" >&5 +printf %s "checking for timezone... " >&6; } +if test ${ac_cv_var_timezone+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include + void * foo(void) { return &timezone; } int -main () +main (void) { - +foo() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - - INCLUDE_hesiod="$hesiod_cflags" - LIB_hesiod="$hesiod_libs" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: from $with_hesiod_config" >&5 -$as_echo "from $with_hesiod_config" >&6; } - found=yes +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_timezone=yes +else $as_nop + ac_cv_var_timezone=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - fi - if test "$found" = no; then - ires= lres= - for i in $header_dirs; do - CFLAGS="-I$i $save_CFLAGS" - - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_var_timezone" != yes ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include +extern int timezone; +int foo(void) { return timezone; } int -main () +main (void) { +foo() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_timezone=yes +else $as_nop + ac_cv_var_timezone=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi + +fi + +ac_foo=`eval echo \\$ac_cv_var_timezone` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + +printf "%s\n" "#define HAVE_TIMEZONE 1" >>confdefs.h + ac_fn_check_decl "$LINENO" "timezone" "ac_cv_have_decl_timezone" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_timezone" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_TIMEZONE $ac_have_decl" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for altzone" >&5 +printf %s "checking for altzone... " >&6; } +if test ${ac_cv_var_altzone+y} +then : + printf %s "(cached) " >&6 +else $as_nop + + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + void * foo(void) { return &altzone; } +int +main (void) +{ +foo() ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ires=$i;break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_altzone=yes +else $as_nop + ac_cv_var_altzone=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done - for i in $lib_dirs; do - LIBS="-L$i -lhesiod $save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_var_altzone" != yes ; then +cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include +extern int altzone; +int foo(void) { return altzone; } int -main () +main (void) { - +foo() ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - lres=$i;break +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_var_altzone=yes +else $as_nop + ac_cv_var_altzone=no fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - done - if test "$ires" -a "$lres" -a "$with_hesiod" != "no"; then - INCLUDE_hesiod="-I$ires" - LIB_hesiod="-L$lres -lhesiod " - found=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 -$as_echo "headers $ires, libraries $lres" >&6; } - fi - fi - CFLAGS="$save_CFLAGS" - LIBS="$save_LIBS" fi -if test "$found" = yes; then - -cat >>confdefs.h <<_ACEOF -#define HESIOD 1 -_ACEOF - - with_hesiod=yes -else - with_hesiod=no - INCLUDE_hesiod= - LIB_hesiod= - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +ac_foo=`eval echo \\$ac_cv_var_altzone` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then +printf "%s\n" "#define HAVE_ALTZONE 1" >>confdefs.h + ac_fn_check_decl "$LINENO" "altzone" "ac_cv_have_decl_altzone" "#include +" "$ac_c_undeclared_builtin_options" "CFLAGS" +if test "x$ac_cv_have_decl_altzone" = xyes +then : + ac_have_decl=1 +else $as_nop + ac_have_decl=0 +fi +printf "%s\n" "#define HAVE_DECL_ALTZONE $ac_have_decl" >>confdefs.h +fi -# Check whether --enable-bigendian was given. -if test "${enable_bigendian+set}" = set; then : - enableval=$enable_bigendian; krb_cv_c_bigendian=yes -fi -# Check whether --enable-littleendian was given. -if test "${enable_littleendian+set}" = set; then : - enableval=$enable_littleendian; krb_cv_c_bigendian=no -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte order is known at compile time" >&5 -$as_echo_n "checking whether byte order is known at compile time... " >&6; } -if test "${krb_cv_c_bigendian_compile+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +cv=`echo "sa_family_t" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sa_family_t" >&5 +printf %s "checking for sa_family_t... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include -#include -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros +#if STDC_HEADERS +#include +#include #endif -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - krb_cv_c_bigendian_compile=yes -else - krb_cv_c_bigendian_compile=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $krb_cv_c_bigendian_compile" >&5 -$as_echo "$krb_cv_c_bigendian_compile" >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 -$as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if test "${krb_cv_c_bigendian+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - - if test "$krb_cv_c_bigendian_compile" = "yes"; then - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ #include -#include -#if BYTE_ORDER != BIG_ENDIAN - not big endian +#ifdef HAVE_SYS_SOCKET_H +#include #endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif +int +main (void) +{ +sa_family_t foo; + ; + return 0; +} _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - krb_cv_c_bigendian=yes -else - krb_cv_c_bigendian=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - else - if test "$cross_compiling" = yes; then : - as_fn_error "specify either --enable-bigendian or --enable-littleendian" "$LINENO" 5 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -main (int argc, char **argv) { - /* Are we little or big endian? From Harbison&Steele. */ - union - { - long l; - char c[sizeof (long)]; - } u; - u.l = 1; - exit (u.c[sizeof (long) - 1] == 1); - } -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - krb_cv_c_bigendian=no -else - krb_cv_c_bigendian=yes +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo sa_family_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "sa_family_t" "ac_cv_type_sa_family_t" "$ac_includes_default" +if test "x$ac_cv_type_sa_family_t" = xyes +then : - fi +printf "%s\n" "#define HAVE_SA_FAMILY_T 1" >>confdefs.h -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $krb_cv_c_bigendian" >&5 -$as_echo "$krb_cv_c_bigendian" >&6; } -if test "$krb_cv_c_bigendian" = "yes"; then -$as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h fi -if test "$krb_cv_c_bigendian_compile" = "yes"; then -$as_echo "#define ENDIANESS_IN_SYS_PARAM_H 1" >>confdefs.h fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 -$as_echo_n "checking for inline... " >&6; } -if test "${ac_cv_c_inline+set}" = set; 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 +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h 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 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 -$as_echo_n "checking for X... " >&6; } -# Check whether --with-x was given. -if test "${with_x+set}" = set; then : - withval=$with_x; -fi - -# $have_x is `yes', `no', `disabled', or empty when we do not yet know. -if test "x$with_x" = xno; then - # The user explicitly disabled X. - have_x=disabled -else - case $x_includes,$x_libraries in #( - *\'*) as_fn_error "cannot use X directory names containing '" "$LINENO" 5;; #( - *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - # One or both of the vars are not set, and there is no cached value. -ac_x_includes=no ac_x_libraries=no -rm -f -r conftest.dir -if mkdir conftest.dir; then - cd conftest.dir - cat >Imakefile <<'_ACEOF' -incroot: - @echo incroot='${INCROOT}' -usrlibdir: - @echo usrlibdir='${USRLIBDIR}' -libdir: - @echo libdir='${LIBDIR}' -_ACEOF - if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then - # GNU make sometimes prints "make[1]: Entering...", which would confuse us. - for ac_var in incroot usrlibdir libdir; do - eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" - done - # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. - for ac_extension in a so sl dylib la dll; do - if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && - test -f "$ac_im_libdir/libX11.$ac_extension"; then - ac_im_usrlibdir=$ac_im_libdir; break - fi - done - # Screen out bogus values from the imake configuration. They are - # bogus both because they are the default anyway, and because - # using them would break gcc on systems where it needs fixed includes. - case $ac_im_incroot in - /usr/include) ac_x_includes= ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; - esac - case $ac_im_usrlibdir in - /usr/lib | /usr/lib64 | /lib | /lib64) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; - esac - fi - cd .. - rm -f -r conftest.dir -fi - -# Standard set of common directories for X headers. -# Check X11 before X11Rn because it is often a symlink to the current release. -ac_x_header_dirs=' -/usr/X11/include -/usr/X11R7/include -/usr/X11R6/include -/usr/X11R5/include -/usr/X11R4/include - -/usr/include/X11 -/usr/include/X11R7 -/usr/include/X11R6 -/usr/include/X11R5 -/usr/include/X11R4 - -/usr/local/X11/include -/usr/local/X11R7/include -/usr/local/X11R6/include -/usr/local/X11R5/include -/usr/local/X11R4/include - -/usr/local/include/X11 -/usr/local/include/X11R7 -/usr/local/include/X11R6 -/usr/local/include/X11R5 -/usr/local/include/X11R4 - -/usr/X386/include -/usr/x386/include -/usr/XFree86/include/X11 - -/usr/include -/usr/local/include -/usr/unsupported/include -/usr/athena/include -/usr/local/x11r5/include -/usr/lpp/Xamples/include - -/usr/openwin/include -/usr/openwin/share/include' - -if test "$ac_x_includes" = no; then - # Guess where to find include files, by looking for Xlib.h. - # First, try using that file with no special directory specified. +cv=`echo "socklen_t" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socklen_t" >&5 +printf %s "checking for socklen_t... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - # We can compile using X headers with no special include directory. -ac_x_includes= -else - for ac_dir in $ac_x_header_dirs; do - if test -r "$ac_dir/X11/Xlib.h"; then - ac_x_includes=$ac_dir - break - fi -done -fi -rm -f conftest.err conftest.$ac_ext -fi # $ac_x_includes = no -if test "$ac_x_libraries" = no; then - # Check for the libraries. - # See if we find them without any special options. - # Don't add to $LIBS permanently. - ac_save_LIBS=$LIBS - LIBS="-lX11 $LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include +#include +#if STDC_HEADERS +#include +#include +#endif + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif int -main () +main (void) { -XrmInitialize () +socklen_t foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - LIBS=$ac_save_LIBS -# We can link X programs with no special library path. -ac_x_libraries= -else - LIBS=$ac_save_LIBS -for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` -do - # Don't even attempt the hair of trying to link an X program! - for ac_extension in a so sl dylib la dll; do - if test -r "$ac_dir/libX11.$ac_extension"; then - ac_x_libraries=$ac_dir - break 2 - fi - done -done +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi # $ac_x_libraries = no +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo socklen_t | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "$ac_includes_default" +if test "x$ac_cv_type_socklen_t" = xyes +then : + +printf "%s\n" "#define HAVE_SOCKLEN_T 1" >>confdefs.h + -case $ac_x_includes,$ac_x_libraries in #( - no,* | *,no | *\'*) - # Didn't find X, or a directory has "'" in its name. - ac_cv_have_x="have_x=no";; #( - *) - # Record where we found X for the cache. - ac_cv_have_x="have_x=yes\ - ac_x_includes='$ac_x_includes'\ - ac_x_libraries='$ac_x_libraries'" -esac fi -;; #( - *) have_x=yes;; - esac - eval "$ac_cv_have_x" -fi # $with_x != no -if test "$have_x" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 -$as_echo "$have_x" >&6; } - no_x=yes -else - # If each of the values was on the command line, it overrides each guess. - test "x$x_includes" = xNONE && x_includes=$ac_x_includes - test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries - # Update the cache value to reflect the command line values. - ac_cv_have_x="have_x=yes\ - ac_x_includes='$x_includes'\ - ac_x_libraries='$x_libraries'" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 -$as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h -if test "$no_x" = yes; then - # Not all programs may use this symbol, but it does not hurt to define it. +fi -$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h - X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= -else - if test -n "$x_includes"; then - X_CFLAGS="$X_CFLAGS -I$x_includes" - fi - # It would also be nice to do this for all -L options, not just this one. - if test -n "$x_libraries"; then - X_LIBS="$X_LIBS -L$x_libraries" - # For Solaris; some versions of Sun CC require a space after -R and - # others require no space. Words are not sufficient . . . . - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 -$as_echo_n "checking whether -R must be followed by a space... " >&6; } - ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" - ac_xsave_c_werror_flag=$ac_c_werror_flag - ac_c_werror_flag=yes - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cv=`echo "struct sockaddr" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr" >&5 +printf %s "checking for struct sockaddr... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include +#if STDC_HEADERS +#include +#include +#endif + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include +#endif int -main () +main (void) { - +struct sockaddr foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - X_LIBS="$X_LIBS -R$x_libraries" -else - LIBS="$ac_xsave_LIBS -R $x_libraries" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo struct sockaddr | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "struct sockaddr" "ac_cv_type_struct_sockaddr" "$ac_includes_default" +if test "x$ac_cv_type_struct_sockaddr" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR 1" >>confdefs.h -int -main () -{ - ; - 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; } - X_LIBS="$X_LIBS -R $x_libraries" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 -$as_echo "neither works" >&6; } fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext + fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - ac_c_werror_flag=$ac_xsave_c_werror_flag - LIBS=$ac_xsave_LIBS - fi - # Check for system-dependent libraries X programs must link with. - # Do this before checking for the system-independent R6 libraries - # (-lICE), since we may need -lsocket or whatever for X linking. +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h - if test "$ISC" = yes; then - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" - else - # Martyn Johnson says this is needed for Ultrix, if the X - # libraries were built with DECnet support. And Karl Berry says - # the Alpha needs dnet_stub (dnet does not exist). - ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi -/* 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 XOpenDisplay (); -int -main () -{ -return XOpenDisplay (); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 -$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } -if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldnet $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + +cv=`echo "struct sockaddr_storage" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct sockaddr_storage" >&5 +printf %s "checking for struct sockaddr_storage... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" +#include +#if STDC_HEADERS +#include +#include +#endif + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include #endif -char dnet_ntoa (); int -main () +main (void) { -return dnet_ntoa (); +struct sockaddr_storage foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dnet_dnet_ntoa=yes -else - ac_cv_lib_dnet_dnet_ntoa=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo struct sockaddr_storage | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "struct sockaddr_storage" "ac_cv_type_struct_sockaddr_storage" "$ac_includes_default" +if test "x$ac_cv_type_struct_sockaddr_storage" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_STORAGE 1" >>confdefs.h + + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 -$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" + fi - if test $ac_cv_lib_dnet_dnet_ntoa = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 -$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } -if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-ldnet_stub $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h + +fi + + + +cv=`echo "struct addrinfo" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct addrinfo" >&5 +printf %s "checking for struct addrinfo... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" +#include +#if STDC_HEADERS +#include +#include +#endif + +#include +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include #endif -char dnet_ntoa (); int -main () +main (void) { -return dnet_ntoa (); +struct addrinfo foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_dnet_stub_dnet_ntoa=yes -else - ac_cv_lib_dnet_stub_dnet_ntoa=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 -$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } -if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo struct addrinfo | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "struct addrinfo" "ac_cv_type_struct_addrinfo" "$ac_includes_default" +if test "x$ac_cv_type_struct_addrinfo" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_ADDRINFO 1" >>confdefs.h + + fi - fi fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - LIBS="$ac_xsave_LIBS" - # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, - # to get the SysV transport functions. - # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) - # needs -lnsl. - # The nsl library prevents programs from opening the X display - # on Irix 5.2, according to T.E. Dickey. - # The functions gethostbyname, getservbyname, and inet_addr are - # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. - ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = x""yes; then : +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h fi - if test $ac_cv_func_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 -$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } -if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lnsl $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + +cv=`echo "struct ifaddrs" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct ifaddrs" >&5 +printf %s "checking for struct ifaddrs... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" +#include +#if STDC_HEADERS +#include +#include #endif -char gethostbyname (); +#include int -main () +main (void) { -return gethostbyname (); +struct ifaddrs foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_nsl_gethostbyname=yes -else - ac_cv_lib_nsl_gethostbyname=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo struct ifaddrs | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "struct ifaddrs" "ac_cv_type_struct_ifaddrs" "$ac_includes_default" +if test "x$ac_cv_type_struct_ifaddrs" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_IFADDRS 1" >>confdefs.h + + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 -$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } -if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" + fi - if test $ac_cv_lib_nsl_gethostbyname = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 -$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } -if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lbsd $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h + +fi + + + +cv=`echo "struct iovec" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct iovec" >&5 +printf %s "checking for struct iovec... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" +#include +#if STDC_HEADERS +#include +#include #endif -char gethostbyname (); + +#include +#include + int -main () +main (void) { -return gethostbyname (); +struct iovec foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_bsd_gethostbyname=yes -else - ac_cv_lib_bsd_gethostbyname=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 -$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } -if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo struct iovec | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "struct iovec" "ac_cv_type_struct_iovec" "$ac_includes_default" +if test "x$ac_cv_type_struct_iovec" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_IOVEC 1" >>confdefs.h + + fi - fi - fi +fi - # lieder@skyler.mavd.honeywell.com says without -lsocket, - # socket/setsockopt and other routines are undefined under SCO ODT - # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary - # on later versions), says Simon Leinen: it contains gethostby* - # variants that don't use the name server (or something). -lsocket - # must be given before -lnsl if both are needed. We assume that - # if connect needs -lnsl, so does gethostbyname. - ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" -if test "x$ac_cv_func_connect" = x""yes; then : +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h fi - if test $ac_cv_func_connect = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 -$as_echo_n "checking for connect in -lsocket... " >&6; } -if test "${ac_cv_lib_socket_connect+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsocket $X_EXTRA_LIBS $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + +cv=`echo "struct msghdr" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct msghdr" >&5 +printf %s "checking for struct msghdr... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" +#include +#if STDC_HEADERS +#include +#include +#endif + +#include +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_WS2TCPIP_H +#include #endif -char connect (); int -main () +main (void) { -return connect (); +struct msghdr foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_socket_connect=yes -else - ac_cv_lib_socket_connect=no +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 -$as_echo "$ac_cv_lib_socket_connect" >&6; } -if test "x$ac_cv_lib_socket_connect" = x""yes; then : - X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo struct msghdr | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "struct msghdr" "ac_cv_type_struct_msghdr" "$ac_includes_default" +if test "x$ac_cv_type_struct_msghdr" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_MSGHDR 1" >>confdefs.h + + fi - fi +fi - # Guillermo Gomez says -lposix is necessary on A/UX. - ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" -if test "x$ac_cv_func_remove" = x""yes; then : +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h fi - if test $ac_cv_func_remove = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 -$as_echo_n "checking for remove in -lposix... " >&6; } -if test "${ac_cv_lib_posix_remove+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lposix $LIBS" + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct winsize" >&5 +printf %s "checking for struct winsize... " >&6; } +if test ${ac_cv_struct_winsize+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +ac_cv_struct_winsize=no +for i in sys/termios.h sys/ioctl.h; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include <$i> -/* 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 remove (); -int -main () -{ -return remove (); - ; - return 0; -} _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_posix_remove=yes -else - ac_cv_lib_posix_remove=no +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "struct[ ]*winsize" >/dev/null 2>&1 +then : + ac_cv_struct_winsize=yes; break fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -rf conftest* +done + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 -$as_echo "$ac_cv_lib_posix_remove" >&6; } -if test "x$ac_cv_lib_posix_remove" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" + +if test "$ac_cv_struct_winsize" = "yes"; then + +printf "%s\n" "#define HAVE_STRUCT_WINSIZE 1" >>confdefs.h + fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_winsize" >&5 +printf "%s\n" "$ac_cv_struct_winsize" >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include - fi +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ws_xpixel" >/dev/null 2>&1 +then : - # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. - ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" -if test "x$ac_cv_func_shmat" = x""yes; then : +printf "%s\n" "#define HAVE_WS_XPIXEL 1" >>confdefs.h fi +rm -rf conftest* - if test $ac_cv_func_shmat = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 -$as_echo_n "checking for shmat in -lipc... " >&6; } -if test "${ac_cv_lib_ipc_shmat+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#include -/* 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 shmat (); -int -main () -{ -return shmat (); - ; - return 0; -} _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ipc_shmat=yes -else - ac_cv_lib_ipc_shmat=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_ipc_shmat" >&5 -$as_echo "$ac_cv_lib_ipc_shmat" >&6; } -if test "x$ac_cv_lib_ipc_shmat" = x""yes; then : - X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "ws_ypixel" >/dev/null 2>&1 +then : + +printf "%s\n" "#define HAVE_WS_YPIXEL 1" >>confdefs.h + fi +rm -rf conftest* + + + - fi - fi - # Check for libraries that X11R6 Xt/Xaw programs need. - ac_save_LDFLAGS=$LDFLAGS - test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" - # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to - # check for ICE first), but we must link in the order -lSM -lICE or - # we get undefined symbols. So assume we have SM if we have ICE. - # These have to be linked with before -lX11, unlike the other - # libraries we check for below, so use a different variable. - # John Interrante, Karl Berry - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 -$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } -if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lICE $X_EXTRA_LIBS $LIBS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for struct spwd" >&5 +printf %s "checking for struct spwd... " >&6; } +if test ${ac_cv_struct_spwd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" +#include +#ifdef HAVE_SHADOW_H +#include #endif -char IceConnectionNumber (); int -main () +main (void) { -return IceConnectionNumber (); +struct spwd foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_ICE_IceConnectionNumber=yes -else - ac_cv_lib_ICE_IceConnectionNumber=no +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_struct_spwd=yes +else $as_nop + ac_cv_struct_spwd=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 -$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } -if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then : - X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_spwd" >&5 +printf "%s\n" "$ac_cv_struct_spwd" >&6; } + +if test "$ac_cv_struct_spwd" = "yes"; then + +printf "%s\n" "#define HAVE_STRUCT_SPWD 1" >>confdefs.h + fi - LDFLAGS=$ac_save_LDFLAGS +# +# Check if we want samba's socket wrapper +# + + + +# Check whether --enable-socket-wrapper was given. +if test ${enable_socket_wrapper+y} +then : + enableval=$enable_socket_wrapper; fi -# try to figure out if we need any additional ld flags, like -R -# and yes, the autoconf X test is utterly broken -if test "$no_x" != yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special X linker flags" >&5 -$as_echo_n "checking for special X linker flags... " >&6; } -if test "${krb_cv_sys_x_libs_rpath+set}" = set; then : - $as_echo_n "(cached) " >&6 + if test "x$enable_socket_wrapper" = xyes; then + have_socket_wrapper_TRUE= + have_socket_wrapper_FALSE='#' else + have_socket_wrapper_TRUE='#' + have_socket_wrapper_FALSE= +fi - ac_save_libs="$LIBS" - ac_save_cflags="$CFLAGS" - CFLAGS="$CFLAGS $X_CFLAGS" - krb_cv_sys_x_libs_rpath="" - krb_cv_sys_x_libs="" - for rflag in "" "-R" "-R " "-rpath "; do - if test "$rflag" = ""; then - foo="$X_LIBS" - else - foo="" - for flag in $X_LIBS; do - case $flag in - -L*) - foo="$foo $flag `echo $flag | sed \"s/-L/$rflag/\"`" - ;; - *) - foo="$foo $flag" - ;; - esac - done - fi - LIBS="$ac_save_libs $foo $X_PRE_LIBS -lX11 $X_EXTRA_LIBS" - if test "$cross_compiling" = yes; then : - krb_cv_sys_x_libs_rpath="" ; krb_cv_sys_x_libs="" ; break -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +if test "x$enable_socket_wrapper" = xyes ; then - #include - foo(void) - { - XOpenDisplay(NULL); - } - main(int argc, char **argv) - { - return 0; - } +printf "%s\n" "#define SOCKET_WRAPPER_REPLACE 1" >>confdefs.h -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - krb_cv_sys_x_libs_rpath="$rflag"; krb_cv_sys_x_libs="$foo"; break -else - : fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext + + + + +LIB_roken="${LIB_roken} \$(LIB_crypt) \$(LIB_dbopen)" + + +LIBADD_roken="$LIB_roken" +LIB_roken="\$(top_builddir)/lib/vers/libvers.la $LIB_roken" + + +# Check whether --enable-otp was given. +if test ${enable_otp+y} +then : + enableval=$enable_otp; fi - done - LIBS="$ac_save_libs" - CFLAGS="$ac_save_cflags" +if test "$enable_otp" = yes -a "$db_type" = unknown; then + as_fn_error $? "OTP requires a NDBM/DB compatible library" "$LINENO" 5 +fi +if test "$enable_otp" != no; then + if test "$db_type" != unknown; then + enable_otp=yes + else + enable_otp=no + fi +fi +if test "$enable_otp" = yes; then + +printf "%s\n" "#define OTP 1" >>confdefs.h + + LIB_otp='$(top_builddir)/lib/otp/libotp.la' fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $krb_cv_sys_x_libs_rpath" >&5 -$as_echo "$krb_cv_sys_x_libs_rpath" >&6; } - X_LIBS="$krb_cv_sys_x_libs" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable OTP library" >&5 +printf %s "checking whether to enable OTP library... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_otp" >&5 +printf "%s\n" "$enable_otp" >&6; } + if test "$enable_otp" = yes; then + OTP_TRUE= + OTP_FALSE='#' +else + OTP_TRUE='#' + OTP_FALSE= fi - if test "$no_x" != yes; then - HAVE_X_TRUE= - HAVE_X_FALSE='#' + + +for ac_prog in mig +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_GCD_MIG+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$GCD_MIG"; then + ac_cv_prog_GCD_MIG="$GCD_MIG" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_GCD_MIG="$ac_prog" + printf "%s\n" "$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 +GCD_MIG=$ac_cv_prog_GCD_MIG +if test -n "$GCD_MIG"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GCD_MIG" >&5 +printf "%s\n" "$GCD_MIG" >&6; } else - HAVE_X_TRUE='#' - HAVE_X_FALSE= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + test -n "$GCD_MIG" && break +done +test -n "$GCD_MIG" || GCD_MIG="no" -save_CFLAGS="$CFLAGS" -CFLAGS="$X_CFLAGS $CFLAGS" -save_LIBS="$LIBS" -LIBS="$X_PRE_LIBS $X_EXTRA_LIBS $LIBS" -save_LDFLAGS="$LDFLAGS" -LDFLAGS="$LDFLAGS $X_LIBS" -## check for XauWriteAuth first, so we detect the case where -## XauReadAuth is in -lX11, but XauWriteAuth is only in -lXau this -## could be done by checking for XauReadAuth in -lXau first, but this -## breaks in IRIX 6.5 +if test "$GCD_MIG" != no; then + ac_fn_c_check_header_compile "$LINENO" "dispatch/dispatch.h" "ac_cv_header_dispatch_dispatch_h" "$ac_includes_default" +if test "x$ac_cv_header_dispatch_dispatch_h" = xyes +then : + printf "%s\n" "#define HAVE_DISPATCH_DISPATCH_H 1" >>confdefs.h +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XauWriteAuth" >&5 -$as_echo_n "checking for XauWriteAuth... " >&6; } -if test "${ac_cv_funclib_XauWriteAuth+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_XauWriteAuth\" != yes" ; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dispatch_async_f" >&5 +printf %s "checking for dispatch_async_f... " >&6; } +if test ${ac_cv_funclib_dispatch_async_f+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_dispatch_async_f\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" X11 Xau; do + for ac_lib in "" dispatch; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -25165,1633 +27164,1727 @@ LIBS=" $ac_lib $ac_save_LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#ifdef HAVE_DISPATCH_DISPATCH_H + #include + #endif int -main () +main (void) { -XauWriteAuth(0,0) +dispatch_async_f(0,0,0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_XauWriteAuth=$ac_lib; else ac_cv_funclib_XauWriteAuth=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dispatch_async_f=$ac_lib; else ac_cv_funclib_dispatch_async_f=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_XauWriteAuth=\${ac_cv_funclib_XauWriteAuth-no}" + eval "ac_cv_funclib_dispatch_async_f=\${ac_cv_funclib_dispatch_async_f-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_XauWriteAuth" +eval "ac_res=\$ac_cv_funclib_dispatch_async_f" if false; then - for ac_func in XauWriteAuth -do : - ac_fn_c_check_func "$LINENO" "XauWriteAuth" "ac_cv_func_XauWriteAuth" -if test "x$ac_cv_func_XauWriteAuth" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_XAUWRITEAUTH 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "dispatch_async_f" "ac_cv_func_dispatch_async_f" +if test "x$ac_cv_func_dispatch_async_f" = xyes +then : + printf "%s\n" "#define HAVE_DISPATCH_ASYNC_F 1" >>confdefs.h fi -done fi -# XauWriteAuth -eval "ac_tr_func=HAVE_`echo XauWriteAuth | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# dispatch_async_f +eval "ac_tr_func=HAVE_`echo dispatch_async_f | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_XauWriteAuth=$ac_res" +eval "LIB_dispatch_async_f=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_XauWriteAuth=yes" - eval "LIB_XauWriteAuth=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dispatch_async_f=yes" + eval "LIB_dispatch_async_f=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_XauWriteAuth=no" - eval "LIB_XauWriteAuth=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_dispatch_async_f=no" + eval "LIB_dispatch_async_f=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_XauWriteAuth=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_dispatch_async_f=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -ac_xxx="$LIBS" -LIBS="$LIB_XauWriteAuth $LIBS" + if test "$ac_cv_func_dispatch_async_f" = yes -a "$GCD_MIG" != no; then + +printf "%s\n" "#define HAVE_GCD 1" >>confdefs.h + libdispatch=yes + else + libdispatch=no + fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XauReadAuth" >&5 -$as_echo_n "checking for XauReadAuth... " >&6; } -if test "${ac_cv_funclib_XauReadAuth+set}" = set; then : - $as_echo_n "(cached) " >&6 +fi + if test "$libdispatch" = yes -a "$GCD_MIG" != no; then + have_gcd_TRUE= + have_gcd_FALSE='#' else + have_gcd_TRUE='#' + have_gcd_FALSE= +fi -if eval "test \"\$ac_cv_func_XauReadAuth\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" X11 Xau; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -XauReadAuth(0) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_XauReadAuth=$ac_lib; else ac_cv_funclib_XauReadAuth=yes; fi";break + + + + +# Check whether --enable-osfc2 was given. +if test ${enable_osfc2+y} +then : + enableval=$enable_osfc2; +fi + +LIB_security= +if test "$enable_osfc2" = yes; then + +printf "%s\n" "#define HAVE_OSFC2 1" >>confdefs.h + + LIB_security=-lsecurity +fi + + + +# Check whether --enable-mmap was given. +if test ${enable_mmap+y} +then : + enableval=$enable_mmap; +fi + +if test "$enable_mmap" = "no"; then + +printf "%s\n" "#define NO_MMAP 1" >>confdefs.h + +fi + +# Check whether --enable-afs-string-to-key was given. +if test ${enable_afs_string_to_key+y} +then : + enableval=$enable_afs_string_to_key; +else $as_nop + enable_afs_string_to_key=yes +fi + + +if test "$enable_afs_string_to_key" = "yes"; then + +printf "%s\n" "#define ENABLE_AFS_STRING_TO_KEY 1" >>confdefs.h + + ENABLE_AFS_STRING_TO_KEY=1 +fi + + +# Extract the first word of "nroff", so it can be a program name with args. +set dummy nroff; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_NROFF+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $NROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_NROFF="$NROFF" # 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_NROFF="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$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 +NROFF=$ac_cv_path_NROFF +if test -n "$NROFF"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NROFF" >&5 +printf "%s\n" "$NROFF" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +# Extract the first word of "groff", so it can be a program name with args. +set dummy groff; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_GROFF+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $GROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GROFF="$GROFF" # 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_GROFF="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$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 +GROFF=$ac_cv_path_GROFF +if test -n "$GROFF"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 +printf "%s\n" "$GROFF" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to format man pages" >&5 +printf %s "checking how to format man pages... " >&6; } +if test ${ac_cv_sys_man_format+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat > conftest.1 << END +.Dd January 1, 1970 +.Dt CONFTEST 1 +.Sh NAME +.Nm conftest +.Nd foobar +END + +if test "$NROFF" ; then + for i in "-mdoc" "-mandoc"; do + if "$NROFF" $i conftest.1 2> /dev/null | \ + grep Jan > /dev/null 2>&1 ; then + ac_cv_sys_man_format="$NROFF $i" + break + fi + done fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +if test "$ac_cv_sys_man_format" = "" -a "$GROFF" ; then + for i in "-mdoc" "-mandoc"; do + if "$GROFF" -Tascii $i conftest.1 2> /dev/null | \ + grep Jan > /dev/null 2>&1 ; then + ac_cv_sys_man_format="$GROFF -Tascii $i" + break + fi done - eval "ac_cv_funclib_XauReadAuth=\${ac_cv_funclib_XauReadAuth-no}" - LIBS="$ac_save_LIBS" fi - +if test "$ac_cv_sys_man_format"; then + ac_cv_sys_man_format="$ac_cv_sys_man_format \$< > \$@" fi - -eval "ac_res=\$ac_cv_funclib_XauReadAuth" - -if false; then - for ac_func in XauReadAuth -do : - ac_fn_c_check_func "$LINENO" "XauReadAuth" "ac_cv_func_XauReadAuth" -if test "x$ac_cv_func_XauReadAuth" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_XAUREADAUTH 1 -_ACEOF - fi -done +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_man_format" >&5 +printf "%s\n" "$ac_cv_sys_man_format" >&6; } +if test "$ac_cv_sys_man_format"; then + CATMAN="$ac_cv_sys_man_format" fi -# XauReadAuth -eval "ac_tr_func=HAVE_`echo XauReadAuth | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_XauReadAuth=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_XauReadAuth=yes" - eval "LIB_XauReadAuth=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + if test "$CATMAN"; then + CATMAN_TRUE= + CATMAN_FALSE='#' +else + CATMAN_TRUE='#' + CATMAN_FALSE= +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_XauReadAuth=no" - eval "LIB_XauReadAuth=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_XauReadAuth=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking extension of pre-formatted manual pages" >&5 +printf %s "checking extension of pre-formatted manual pages... " >&6; } +if test ${ac_cv_sys_catman_ext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if grep _suffix /etc/man.conf > /dev/null 2>&1; then + ac_cv_sys_catman_ext=0 +else + ac_cv_sys_catman_ext=number +fi - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_catman_ext" >&5 +printf "%s\n" "$ac_cv_sys_catman_ext" >&6; } +if test "$ac_cv_sys_catman_ext" = number; then + CATMANEXT='$$section' +else + CATMANEXT=0 +fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac -LIBS="$LIB_XauReadAauth $LIBS" +# Check whether --with-readline was given. +if test ${with_readline+y} +then : + withval=$with_readline; +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XauFileName" >&5 -$as_echo_n "checking for XauFileName... " >&6; } -if test "${ac_cv_funclib_XauFileName+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_XauFileName\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" X11 Xau; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -XauFileName() - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_XauFileName=$ac_lib; else ac_cv_funclib_XauFileName=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_XauFileName=\${ac_cv_funclib_XauFileName-no}" - LIBS="$ac_save_LIBS" +# Check whether --with-readline-lib was given. +if test ${with_readline_lib+y} +then : + withval=$with_readline_lib; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-readline-lib" "$LINENO" 5 +elif test "X$with_readline" = "X"; then + with_readline=yes fi - fi -eval "ac_res=\$ac_cv_funclib_XauFileName" +# Check whether --with-readline-include was given. +if test ${with_readline_include+y} +then : + withval=$with_readline_include; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-readline-include" "$LINENO" 5 +elif test "X$with_readline" = "X"; then + with_readline=yes +fi +fi -if false; then - for ac_func in XauFileName -do : - ac_fn_c_check_func "$LINENO" "XauFileName" "ac_cv_func_XauFileName" -if test "x$ac_cv_func_XauFileName" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_XAUFILENAME 1 -_ACEOF +# Check whether --with-readline-config was given. +if test ${with_readline_config+y} +then : + withval=$with_readline_config; fi -done -fi -# XauFileName -eval "ac_tr_func=HAVE_`echo XauFileName | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_XauFileName=$ac_res" -case "$ac_res" in - yes) - eval "ac_cv_func_XauFileName=yes" - eval "LIB_XauFileName=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_XauFileName=no" - eval "LIB_XauFileName=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_XauFileName=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for readline" >&5 +printf %s "checking for readline... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; +case "$with_readline" in +yes|"") d='' ;; +no) d= ;; +*) d="$with_readline" ;; esac - -LIBS="$ac_xxx" - -## set LIB_XauReadAuth to union of these tests, since this is what the -## Makefiles are using -case "$ac_cv_funclib_XauWriteAuth" in -yes) ;; -no) ;; -*) if test "$ac_cv_funclib_XauReadAuth" = yes; then - if test "$ac_cv_funclib_XauFileName" = yes; then - LIB_XauReadAuth="$LIB_XauWriteAuth" - else - LIB_XauReadAuth="$LIB_XauWriteAuth $LIB_XauFileName" +header_dirs= +lib_dirs= +for i in $d; do + if test "$with_readline_include" = ""; then + if test -d "$i/include/readline"; then + header_dirs="$header_dirs $i/include/readline" fi - else - if test "$ac_cv_funclib_XauFileName" = yes; then - LIB_XauReadAuth="$LIB_XauReadAuth $LIB_XauWriteAuth" - else - LIB_XauReadAuth="$LIB_XauReadAuth $LIB_XauWriteAuth $LIB_XauFileName" + if test -d "$i/include"; then + header_dirs="$header_dirs $i/include" fi fi - ;; -esac - -if test "$AUTOMAKE" != ""; then - if test "$ac_cv_func_XauWriteAuth" != "yes"; then - NEED_WRITEAUTH_TRUE= - NEED_WRITEAUTH_FALSE='#' -else - NEED_WRITEAUTH_TRUE='#' - NEED_WRITEAUTH_FALSE= -fi - -else - - - if test "$ac_cv_func_XauWriteAuth" != "yes"; then - NEED_WRITEAUTH_TRUE= - NEED_WRITEAUTH_FALSE='#' - else - NEED_WRITEAUTH_TRUE='#' - NEED_WRITEAUTH_FALSE= + if test "$with_readline_lib" = ""; then + if test -d "$i/lib$abilibdirext"; then + lib_dirs="$lib_dirs $i/lib$abilibdirext" + fi fi -fi -CFLAGS=$save_CFLAGS -LIBS=$save_LIBS -LDFLAGS=$save_LDFLAGS - - - -{ $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 test "${ac_cv_c_const+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -/* FIXME: Include the comments suggested by Paul. */ -#ifndef __cplusplus - /* Ultrix mips cc rejects this. */ - typedef int charset[2]; - const charset cs; - /* 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. */ - char *t; - 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 saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; - } - { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; - if (!foo) return 0; - } - return !cs[0] && !zero.x; -#endif +done - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_c_const=yes -else - ac_cv_c_const=no +if test "$with_readline_include"; then + header_dirs="$with_readline_include $header_dirs" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if test "$with_readline_lib"; then + lib_dirs="$with_readline_lib $lib_dirs" 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 +if test "$with_readline_config" = ""; then + with_readline_config='' 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" = x""yes; then : - -else - -cat >>confdefs.h <<_ACEOF -#define off_t long int -_ACEOF +readline_cflags= +readline_libs= -fi +case "$with_readline_config" in +yes|no|""|"") + if test -f $with_readline/bin/ ; then + with_readline_config=$with_readline/bin/ + fi + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mode_t" >&5 -$as_echo_n "checking for mode_t... " >&6; } -if test "${ac_cv_type_mode_t+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#if STDC_HEADERS -#include -#include -#endif +case "$with_readline_config" in +yes|no|"") + ;; +*) + readline_cflags="`$with_readline_config --cflags 2>&1`" + readline_libs="`$with_readline_config --libs 2>&1`" + ;; +esac -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then : - ac_cv_type_mode_t=yes -else - ac_cv_type_mode_t=no -fi -rm -f conftest* +found=no +if test "$with_readline" != no; then + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test "$readline_cflags" -a "$readline_libs"; then + CFLAGS="$readline_cflags $save_CFLAGS" + LIBS="$readline_libs $save_LIBS" + ac_fn_c_check_header_compile "$LINENO" "readline.h" "ac_cv_header_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mode_t" >&5 -$as_echo "$ac_cv_type_mode_t" >&6; } -if test $ac_cv_type_mode_t = no; then - -$as_echo "#define mode_t unsigned short" >>confdefs.h +ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t" >&5 -$as_echo_n "checking for sig_atomic_t... " >&6; } -if test "${ac_cv_type_sig_atomic_t+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#if STDC_HEADERS -#include -#include +#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include #endif -#include + +int +main (void) +{ + + ; + return 0; +} _ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "sig_atomic_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then : - ac_cv_type_sig_atomic_t=yes -else - ac_cv_type_sig_atomic_t=no -fi -rm -f conftest* +if ac_fn_c_try_link "$LINENO" +then : + INCLUDE_readline="$readline_cflags" + LIB_readline="$readline_libs" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: from $with_readline_config" >&5 +printf "%s\n" "from $with_readline_config" >&6; } + found=yes fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_sig_atomic_t" >&5 -$as_echo "$ac_cv_type_sig_atomic_t" >&6; } -if test $ac_cv_type_sig_atomic_t = no; then +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + if test "$found" = no; then + ires= lres= + for i in $header_dirs; do + CFLAGS="-I$i $save_CFLAGS" + ac_fn_c_check_header_compile "$LINENO" "readline.h" "ac_cv_header_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_H 1" >>confdefs.h -$as_echo "#define sig_atomic_t int" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h fi + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include +#endif +int +main (void) +{ -cv=`echo "long long" | sed 'y%./+- %__p__%'` -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 -$as_echo_n "checking for long long... " >&6; } -if { as_var=ac_cv_type_$cv; eval "test \"\${$as_var+set}\" = set"; }; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ires=$i;break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + for i in $lib_dirs; do + LIBS="-L$i -lreadline $save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#include -#if STDC_HEADERS -#include -#include +#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include #endif int -main () +main (void) { -long long foo; + ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - eval "ac_cv_type_$cv=yes" -else - eval "ac_cv_type_$cv=no" +if ac_fn_c_try_link "$LINENO" +then : + lres=$i;break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + if test "$ires" -a "$lres" -a "$with_readline" != "no"; then + INCLUDE_readline="-I$ires" + LIB_readline="-L$lres -lreadline " + found=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 +printf "%s\n" "headers $ires, libraries $lres" >&6; } + fi + fi + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" fi -ac_foo=`eval echo \\$ac_cv_type_$cv` -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 -$as_echo "$ac_foo" >&6; } -if test "$ac_foo" = yes; then - ac_tr_hdr=HAVE_`echo long long | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` -if false; then - ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" -if test "x$ac_cv_type_long_long" = x""yes; then : -cat >>confdefs.h <<_ACEOF -#define HAVE_LONG_LONG 1 -_ACEOF +if test "$found" = yes; then +printf "%s\n" "#define READLINE 1" >>confdefs.h + with_readline=yes +else + with_readline=no + INCLUDE_readline= + LIB_readline= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi + + + + + + +# Check whether --with-libedit was given. +if test ${with_libedit+y} +then : + withval=$with_libedit; fi -cat >>confdefs.h <<_ACEOF -#define $ac_tr_hdr 1 -_ACEOF +# Check whether --with-libedit-lib was given. +if test ${with_libedit_lib+y} +then : + withval=$with_libedit_lib; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-libedit-lib" "$LINENO" 5 +elif test "X$with_libedit" = "X"; then + with_libedit=yes +fi 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 test "${ac_cv_header_time+set}" = set; 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 +# Check whether --with-libedit-include was given. +if test ${with_libedit_include+y} +then : + withval=$with_libedit_include; if test "$withval" = "yes" -o "$withval" = "no"; then + as_fn_error $? "No argument for --with-libedit-include" "$LINENO" 5 +elif test "X$with_libedit" = "X"; then + with_libedit=yes 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 +# Check whether --with-libedit-config was given. +if test ${with_libedit_config+y} +then : + withval=$with_libedit_config; fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 -$as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } -if test "${ac_cv_struct_tm+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include -int -main () -{ -struct tm tm; - int *p = &tm.tm_sec; - return !p; - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_struct_tm=time.h -else - ac_cv_struct_tm=sys/time.h + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libedit" >&5 +printf %s "checking for libedit... " >&6; } + +case "$with_libedit" in +yes|"") d='' ;; +no) d= ;; +*) d="$with_libedit" ;; +esac + +header_dirs= +lib_dirs= +for i in $d; do + if test "$with_libedit_include" = ""; then + if test -d "$i/include/libedit"; then + header_dirs="$header_dirs $i/include/libedit" + fi + if test -d "$i/include"; then + header_dirs="$header_dirs $i/include" + fi + fi + if test "$with_libedit_lib" = ""; then + if test -d "$i/lib$abilibdirext"; then + lib_dirs="$lib_dirs $i/lib$abilibdirext" + fi + fi +done + +if test "$with_libedit_include"; then + header_dirs="$with_libedit_include $header_dirs" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if test "$with_libedit_lib"; then + lib_dirs="$with_libedit_lib $lib_dirs" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 -$as_echo "$ac_cv_struct_tm" >&6; } -if test $ac_cv_struct_tm = sys/time.h; then -$as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h +if test "$with_libedit_config" = ""; then + with_libedit_config='' +fi + +libedit_cflags= +libedit_libs= + +case "$with_libedit_config" in +yes|no|""|"") + if test -f $with_libedit/bin/ ; then + with_libedit_config=$with_libedit/bin/ + fi + ;; +esac + +case "$with_libedit_config" in +yes|no|"") + ;; +*) + libedit_cflags="`$with_libedit_config --cflags 2>&1`" + libedit_libs="`$with_libedit_config --libs 2>&1`" + ;; +esac + +found=no +if test "$with_libedit" != no; then + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + if test "$libedit_cflags" -a "$libedit_libs"; then + CFLAGS="$libedit_cflags $save_CFLAGS" + LIBS="$libedit_libs $save_LIBS" + ac_fn_c_check_header_compile "$LINENO" "readline.h" "ac_cv_header_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_editline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h -{ $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 test "${ac_cv_header_stdc+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +fi + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -#include -#include -#include +#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include +#elif defined(HAVE_EDITLINE_READLINE_H) +#include +#endif int -main () +main (void) { ; 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 : +if ac_fn_c_try_link "$LINENO" +then : -else - ac_cv_header_stdc=no + INCLUDE_libedit="$libedit_cflags" + LIB_libedit="$libedit_libs" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: from $with_libedit_config" >&5 +printf "%s\n" "from $with_libedit_config" >&6; } + found=yes fi -rm -f conftest* +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + fi + if test "$found" = no; then + ires= lres= + for i in $header_dirs; do + CFLAGS="-I$i $save_CFLAGS" + ac_fn_c_check_header_compile "$LINENO" "readline.h" "ac_cv_header_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "readline/readline.h" "ac_cv_header_readline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_readline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_READLINE_READLINE_H 1" >>confdefs.h -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* +ac_fn_c_check_header_compile "$LINENO" "editline/readline.h" "ac_cv_header_editline_readline_h" "$ac_includes_default" +if test "x$ac_cv_header_editline_readline_h" = xyes +then : + printf "%s\n" "#define HAVE_EDITLINE_READLINE_H 1" >>confdefs.h 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 + 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)) +#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include +#elif defined(HAVE_EDITLINE_READLINE_H) +#include #endif -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int -main () +main (void) { - 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 +if ac_fn_c_try_compile "$LINENO" +then : + ires=$i;break fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + done + for i in $lib_dirs; do + LIBS="-L$i -ledit $save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include +#elif defined(HAVE_EDITLINE_READLINE_H) +#include +#endif -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 - - -for ac_header in \ - CommonCrypto/CommonDigest.h \ - CommonCrypto/CommonCryptor.h \ - arpa/ftp.h \ - arpa/telnet.h \ - bind/bitypes.h \ - bsdsetjmp.h \ - curses.h \ - dlfcn.h \ - execinfo.h \ - fnmatch.h \ - inttypes.h \ - io.h \ - libutil.h \ - limits.h \ - maillock.h \ - netgroup.h \ - netinet/in6_machtypes.h \ - pthread.h \ - pty.h \ - sac.h \ - sgtty.h \ - siad.h \ - signal.h \ - strings.h \ - stropts.h \ - sys/bitypes.h \ - sys/category.h \ - sys/file.h \ - sys/filio.h \ - sys/ioccom.h \ - sys/mman.h \ - sys/param.h \ - sys/pty.h \ - sys/ptyio.h \ - sys/select.h \ - sys/socket.h \ - sys/str_tty.h \ - sys/stream.h \ - sys/stropts.h \ - sys/syscall.h \ - sys/termio.h \ - sys/timeb.h \ - sys/times.h \ - sys/types.h \ - sys/un.h \ - locale.h \ - termcap.h \ - termio.h \ - termios.h \ - time.h \ - tmpdir.h \ - udb.h \ - util.h \ - utmp.h \ - utmpx.h \ +int +main (void) +{ -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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 + ; + return 0; +} _ACEOF - +if ac_fn_c_try_link "$LINENO" +then : + lres=$i;break +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + if test "$ires" -a "$lres" -a "$with_libedit" != "no"; then + INCLUDE_libedit="-I$ires" + LIB_libedit="-L$lres -ledit " + found=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: headers $ires, libraries $lres" >&5 +printf "%s\n" "headers $ires, libraries $lres" >&6; } + fi + fi + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" fi -done - +if test "$found" = yes; then -for ac_header in term.h -do : - ac_fn_c_check_header_preproc "$LINENO" "term.h" "ac_cv_header_term_h" -if test "x$ac_cv_header_term_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_TERM_H 1 -_ACEOF +printf "%s\n" "#define LIBEDIT 1" >>confdefs.h + with_libedit=yes +else + with_libedit=no + INCLUDE_libedit= + LIB_libedit= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi -done - - -for ac_header in asl.h -do : - ac_fn_c_check_header_compile "$LINENO" "asl.h" "ac_cv_header_asl_h" " -#include -#ifndef ASL_STRING_EMERG -#error ASL_STRING_EMERG missing -#endif -" -if test "x$ac_cv_header_asl_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_ASL_H 1 -_ACEOF -fi -done -for ac_header in net/if.h -do : - ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$ac_includes_default -#if HAVE_SYS_SOCKET_H -#include -#endif -" -if test "x$ac_cv_header_net_if_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_NET_IF_H 1 -_ACEOF -fi -done +subdirs="$subdirs lib/libedit" -for ac_header in sys/ptyvar.h -do : - ac_fn_c_check_header_compile "$LINENO" "sys/ptyvar.h" "ac_cv_header_sys_ptyvar_h" "$ac_includes_default -#if HAVE_SYS_TTY_H -#include -#endif -" -if test "x$ac_cv_header_sys_ptyvar_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_PTYVAR_H 1 -_ACEOF +# Check whether --enable-bigendian was given. +if test ${enable_bigendian+y} +then : + enableval=$enable_bigendian; krb_cv_c_bigendian=yes fi -done +# Check whether --enable-littleendian was given. +if test ${enable_littleendian+y} +then : + enableval=$enable_littleendian; krb_cv_c_bigendian=no +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte order is known at compile time" >&5 +printf %s "checking whether byte order is known at compile time... " >&6; } +if test ${krb_cv_c_bigendian_compile+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -for ac_header in sys/strtty.h -do : - ac_fn_c_check_header_compile "$LINENO" "sys/strtty.h" "ac_cv_header_sys_strtty_h" "$ac_includes_default -#if HAVE_TERMIOS_H -#include -#endif -#if HAVE_SYS_STREAM_H -#include +#include +#include +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros #endif -" -if test "x$ac_cv_header_sys_strtty_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_STRTTY_H 1 _ACEOF - +if ac_fn_c_try_compile "$LINENO" +then : + krb_cv_c_bigendian_compile=yes +else $as_nop + krb_cv_c_bigendian_compile=no fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $krb_cv_c_bigendian_compile" >&5 +printf "%s\n" "$krb_cv_c_bigendian_compile" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +printf %s "checking whether byte ordering is bigendian... " >&6; } +if test ${krb_cv_c_bigendian+y} +then : + printf %s "(cached) " >&6 +else $as_nop -done - + if test "$krb_cv_c_bigendian_compile" = "yes"; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ -for ac_header in sys/ucred.h -do : - ac_fn_c_check_header_compile "$LINENO" "sys/ucred.h" "ac_cv_header_sys_ucred_h" "$ac_includes_default -#if HAVE_SYS_TYPES_H #include -#endif -#if HAVE_SYS_PARAM_H #include +#if BYTE_ORDER != BIG_ENDIAN + not big endian #endif -" -if test "x$ac_cv_header_sys_ucred_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SYS_UCRED_H 1 _ACEOF - +if ac_fn_c_try_compile "$LINENO" +then : + krb_cv_c_bigendian=yes +else $as_nop + krb_cv_c_bigendian=no fi - -done - - -for ac_header in security/pam_modules.h -do : - ac_fn_c_check_header_compile "$LINENO" "security/pam_modules.h" "ac_cv_header_security_pam_modules_h" "$ac_includes_default -#include - -" -if test "x$ac_cv_header_security_pam_modules_h" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SECURITY_PAM_MODULES_H 1 +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + else + if test "$cross_compiling" = yes +then : + as_fn_error $? "specify either --enable-bigendian or --enable-littleendian" "$LINENO" 5 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +main (int argc, char **argv) { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); + } _ACEOF - +if ac_fn_c_try_run "$LINENO" +then : + krb_cv_c_bigendian=no +else $as_nop + krb_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -done + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $krb_cv_c_bigendian" >&5 +printf "%s\n" "$krb_cv_c_bigendian" >&6; } +if test "$krb_cv_c_bigendian" = "yes"; then +printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h +fi +if test "$krb_cv_c_bigendian_compile" = "yes"; then +printf "%s\n" "#define ENDIANESS_IN_SYS_PARAM_H 1" >>confdefs.h +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +printf %s "checking for inline... " >&6; } +if test ${ac_cv_c_inline+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 (void) {return 0; } +$ac_kw foo_t foo (void) {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.beam conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +printf "%s\n" "$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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for logwtmp" >&5 -$as_echo_n "checking for logwtmp... " >&6; } -if test "${ac_cv_funclib_logwtmp+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_logwtmp\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" util; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_UTIL_H -#include +int +main (void) +{ + +#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}; + /* IBM 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; + } + { /* IBM 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 -int -main () -{ -logwtmp(0,0,0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_logwtmp=$ac_lib; else ac_cv_funclib_logwtmp=yes; fi";break +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_c_const=yes +else $as_nop + ac_cv_c_const=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_logwtmp=\${ac_cv_funclib_logwtmp-no}" - LIBS="$ac_save_LIBS" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +printf "%s\n" "#define const /**/" >>confdefs.h 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 : -eval "ac_res=\$ac_cv_funclib_logwtmp" +else $as_nop -if false; then - for ac_func in logwtmp -do : - ac_fn_c_check_func "$LINENO" "logwtmp" "ac_cv_func_logwtmp" -if test "x$ac_cv_func_logwtmp" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LOGWTMP 1 -_ACEOF +printf "%s\n" "#define off_t long int" >>confdefs.h fi -done -fi -# logwtmp -eval "ac_tr_func=HAVE_`echo logwtmp | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_logwtmp=$ac_res" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mode_t" >&5 +printf %s "checking for mode_t... " >&6; } +if test ${ac_cv_type_mode_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#if STDC_HEADERS +#include +#include +#endif -case "$ac_res" in - yes) - eval "ac_cv_func_logwtmp=yes" - eval "LIB_logwtmp=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 _ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1 +then : + ac_cv_type_mode_t=yes +else $as_nop + ac_cv_type_mode_t=no +fi +rm -rf conftest* - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_logwtmp=no" - eval "LIB_logwtmp=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_logwtmp=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_mode_t" >&5 +printf "%s\n" "$ac_cv_type_mode_t" >&6; } +if test $ac_cv_type_mode_t = no; then - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +printf "%s\n" "#define mode_t unsigned short" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sig_atomic_t" >&5 +printf %s "checking for sig_atomic_t... " >&6; } +if test ${ac_cv_type_sig_atomic_t+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#if STDC_HEADERS +#include +#include +#endif +#include +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "sig_atomic_t[^a-zA-Z_0-9]" >/dev/null 2>&1 +then : + ac_cv_type_sig_atomic_t=yes +else $as_nop + ac_cv_type_sig_atomic_t=no +fi +rm -rf conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_sig_atomic_t" >&5 +printf "%s\n" "$ac_cv_type_sig_atomic_t" >&6; } +if test $ac_cv_type_sig_atomic_t = no; then +printf "%s\n" "#define sig_atomic_t int" >>confdefs.h +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for logout" >&5 -$as_echo_n "checking for logout... " >&6; } -if test "${ac_cv_funclib_logout+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_logout\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" util; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +cv=`echo "long long" | sed 'y%./+- %__p__%'` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for long long" >&5 +printf %s "checking for long long... " >&6; } +if eval test \${ac_cv_type_$cv+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#ifdef HAVE_UTIL_H -#include +#include +#if STDC_HEADERS +#include +#include #endif int -main () +main (void) { -logout(0) +long long foo; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_logout=$ac_lib; else ac_cv_funclib_logout=yes; fi";break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_logout=\${ac_cv_funclib_logout-no}" - LIBS="$ac_save_LIBS" +if ac_fn_c_try_compile "$LINENO" +then : + eval "ac_cv_type_$cv=yes" +else $as_nop + eval "ac_cv_type_$cv=no" fi - +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +ac_foo=`eval echo \\$ac_cv_type_$cv` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_foo" >&5 +printf "%s\n" "$ac_foo" >&6; } +if test "$ac_foo" = yes; then + ac_tr_hdr=HAVE_`echo long long | sed 'y%abcdefghijklmnopqrstuvwxyz./- %ABCDEFGHIJKLMNOPQRSTUVWXYZ____%'` +if false; then + ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default" +if test "x$ac_cv_type_long_long" = xyes +then : +printf "%s\n" "#define HAVE_LONG_LONG 1" >>confdefs.h -eval "ac_res=\$ac_cv_funclib_logout" - -if false; then - for ac_func in logout -do : - ac_fn_c_check_func "$LINENO" "logout" "ac_cv_func_logout" -if test "x$ac_cv_func_logout" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_LOGOUT 1 -_ACEOF fi -done fi -# logout -eval "ac_tr_func=HAVE_`echo logout | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_logout=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_logout=yes" - eval "LIB_logout=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_logout=no" - eval "LIB_logout=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_logout=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +printf "%s\n" "#define $ac_tr_hdr 1" >>confdefs.h +fi +# Obsolete code to be removed. +if test $ac_cv_header_sys_time_h = yes; then +printf "%s\n" "#define TIME_WITH_SYS_TIME 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty" >&5 -$as_echo_n "checking for openpty... " >&6; } -if test "${ac_cv_funclib_openpty+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +# End of obsolete code. -if eval "test \"\$ac_cv_func_openpty\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" util; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 +printf %s "checking whether struct tm is in sys/time.h or time.h... " >&6; } +if test ${ac_cv_struct_tm+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - -#ifdef HAVE_UTIL_H -#include -#endif +#include +#include int -main () +main (void) { -openpty(0,0,0,0,0) +struct tm tm; + int *p = &tm.tm_sec; + return !p; ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_openpty=$ac_lib; else ac_cv_funclib_openpty=yes; fi";break +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_struct_tm=time.h +else $as_nop + ac_cv_struct_tm=sys/time.h fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_openpty=\${ac_cv_funclib_openpty-no}" - LIBS="$ac_save_LIBS" +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 +printf "%s\n" "$ac_cv_struct_tm" >&6; } +if test $ac_cv_struct_tm = sys/time.h; then + +printf "%s\n" "#define TM_IN_SYS_TIME 1" >>confdefs.h fi -eval "ac_res=\$ac_cv_funclib_openpty" +# Autoupdate added the next two lines to ensure that your configure +# script's behavior did not change. They are probably safe to remove. -if false; then - for ac_func in openpty -do : - ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" -if test "x$ac_cv_func_openpty" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_OPENPTY 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 -done + fi fi -# openpty -eval "ac_tr_func=HAVE_`echo openpty | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_openpty=$ac_res" - -case "$ac_res" in - yes) - eval "ac_cv_func_openpty=yes" - eval "LIB_openpty=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_openpty=no" - eval "LIB_openpty=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_openpty=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +ac_fn_c_check_header_compile "$LINENO" "CommonCrypto/CommonDigest.h" "ac_cv_header_CommonCrypto_CommonDigest_h" "$ac_includes_default" +if test "x$ac_cv_header_CommonCrypto_CommonDigest_h" = xyes +then : + printf "%s\n" "#define HAVE_COMMONCRYPTO_COMMONDIGEST_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "CommonCrypto/CommonCryptor.h" "ac_cv_header_CommonCrypto_CommonCryptor_h" "$ac_includes_default" +if test "x$ac_cv_header_CommonCrypto_CommonCryptor_h" = xyes +then : + printf "%s\n" "#define HAVE_COMMONCRYPTO_COMMONCRYPTOR_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "arpa/telnet.h" "ac_cv_header_arpa_telnet_h" "$ac_includes_default" +if test "x$ac_cv_header_arpa_telnet_h" = xyes +then : + printf "%s\n" "#define HAVE_ARPA_TELNET_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "bind/bitypes.h" "ac_cv_header_bind_bitypes_h" "$ac_includes_default" +if test "x$ac_cv_header_bind_bitypes_h" = xyes +then : + printf "%s\n" "#define HAVE_BIND_BITYPES_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "bsdsetjmp.h" "ac_cv_header_bsdsetjmp_h" "$ac_includes_default" +if test "x$ac_cv_header_bsdsetjmp_h" = xyes +then : + printf "%s\n" "#define HAVE_BSDSETJMP_H 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent" >&5 -$as_echo_n "checking for tgetent... " >&6; } -if test "${ac_cv_funclib_tgetent+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_header_compile "$LINENO" "curses.h" "ac_cv_header_curses_h" "$ac_includes_default" +if test "x$ac_cv_header_curses_h" = xyes +then : + printf "%s\n" "#define HAVE_CURSES_H 1" >>confdefs.h -if eval "test \"\$ac_cv_func_tgetent\" != yes" ; then - ac_save_LIBS="$LIBS" - for ac_lib in "" termcap ncurses curses; do - case "$ac_lib" in - "") ;; - yes) ac_lib="" ;; - no) continue ;; - -l*) ;; - *) ac_lib="-l$ac_lib" ;; - esac - LIBS=" $ac_lib $ac_save_LIBS" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ +fi +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 : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h -#ifdef HAVE_TERMCAP_H -#include -#endif -#ifdef HAVE_CURSES_H -#include -#endif +fi +ac_fn_c_check_header_compile "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default" +if test "x$ac_cv_header_execinfo_h" = xyes +then : + printf "%s\n" "#define HAVE_EXECINFO_H 1" >>confdefs.h -int -main () -{ -tgetent(0,0) - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_tgetent=$ac_lib; else ac_cv_funclib_tgetent=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - eval "ac_cv_funclib_tgetent=\${ac_cv_funclib_tgetent-no}" - LIBS="$ac_save_LIBS" +ac_fn_c_check_header_compile "$LINENO" "fnmatch.h" "ac_cv_header_fnmatch_h" "$ac_includes_default" +if test "x$ac_cv_header_fnmatch_h" = xyes +then : + printf "%s\n" "#define HAVE_FNMATCH_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "inttypes.h" "ac_cv_header_inttypes_h" "$ac_includes_default" +if test "x$ac_cv_header_inttypes_h" = xyes +then : + printf "%s\n" "#define HAVE_INTTYPES_H 1" >>confdefs.h fi +ac_fn_c_check_header_compile "$LINENO" "io.h" "ac_cv_header_io_h" "$ac_includes_default" +if test "x$ac_cv_header_io_h" = xyes +then : + printf "%s\n" "#define HAVE_IO_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "libutil.h" "ac_cv_header_libutil_h" "$ac_includes_default" +if test "x$ac_cv_header_libutil_h" = xyes +then : + printf "%s\n" "#define HAVE_LIBUTIL_H 1" >>confdefs.h -eval "ac_res=\$ac_cv_funclib_tgetent" +fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h -if false; then - for ac_func in tgetent -do : - ac_fn_c_check_func "$LINENO" "tgetent" "ac_cv_func_tgetent" -if test "x$ac_cv_func_tgetent" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_TGETENT 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "maillock.h" "ac_cv_header_maillock_h" "$ac_includes_default" +if test "x$ac_cv_header_maillock_h" = xyes +then : + printf "%s\n" "#define HAVE_MAILLOCK_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "netgroup.h" "ac_cv_header_netgroup_h" "$ac_includes_default" +if test "x$ac_cv_header_netgroup_h" = xyes +then : + printf "%s\n" "#define HAVE_NETGROUP_H 1" >>confdefs.h fi -# tgetent -eval "ac_tr_func=HAVE_`echo tgetent | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_tgetent=$ac_res" +ac_fn_c_check_header_compile "$LINENO" "netinet/in6_machtypes.h" "ac_cv_header_netinet_in6_machtypes_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_in6_machtypes_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_IN6_MACHTYPES_H 1" >>confdefs.h -case "$ac_res" in - yes) - eval "ac_cv_func_tgetent=yes" - eval "LIB_tgetent=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "netinet/tcp.h" "ac_cv_header_netinet_tcp_h" "$ac_includes_default" +if test "x$ac_cv_header_netinet_tcp_h" = xyes +then : + printf "%s\n" "#define HAVE_NETINET_TCP_H 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - ;; - no) - eval "ac_cv_func_tgetent=no" - eval "LIB_tgetent=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - ;; - *) - eval "ac_cv_func_tgetent=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = xyes +then : + printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "pty.h" "ac_cv_header_pty_h" "$ac_includes_default" +if test "x$ac_cv_header_pty_h" = xyes +then : + printf "%s\n" "#define HAVE_PTY_H 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } - ;; -esac +fi +ac_fn_c_check_header_compile "$LINENO" "sac.h" "ac_cv_header_sac_h" "$ac_includes_default" +if test "x$ac_cv_header_sac_h" = xyes +then : + printf "%s\n" "#define HAVE_SAC_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sgtty.h" "ac_cv_header_sgtty_h" "$ac_includes_default" +if test "x$ac_cv_header_sgtty_h" = xyes +then : + printf "%s\n" "#define HAVE_SGTTY_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "siad.h" "ac_cv_header_siad_h" "$ac_includes_default" +if test "x$ac_cv_header_siad_h" = xyes +then : + printf "%s\n" "#define HAVE_SIAD_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "signal.h" "ac_cv_header_signal_h" "$ac_includes_default" +if test "x$ac_cv_header_signal_h" = xyes +then : + printf "%s\n" "#define HAVE_SIGNAL_H 1" >>confdefs.h -for ac_func in \ - _getpty \ - _scrsize \ - arc4random \ - backtrace \ - fcntl \ - getpeereid \ - getpeerucred \ - grantpt \ - mktime \ - ptsname \ - rand \ - revoke \ - select \ - setitimer \ - setpcred \ - setpgid \ - setproctitle \ - setregid \ - setresgid \ - setresuid \ - setreuid \ - setsid \ - setutent \ - sigaction \ - strstr \ - ttyname \ - ttyslot \ - umask \ - unlockpt \ - vhangup \ - yp_get_default_domain \ +fi +ac_fn_c_check_header_compile "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = xyes +then : + printf "%s\n" "#define HAVE_STRINGS_H 1" >>confdefs.h -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "stropts.h" "ac_cv_header_stropts_h" "$ac_includes_default" +if test "x$ac_cv_header_stropts_h" = xyes +then : + printf "%s\n" "#define HAVE_STROPTS_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/bitypes.h" "ac_cv_header_sys_bitypes_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_bitypes_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_BITYPES_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/category.h" "ac_cv_header_sys_category_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_category_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_CATEGORY_H 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking checking for __sync_add_and_fetch" >&5 -$as_echo_n "checking checking for __sync_add_and_fetch... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -unsigned int foo; __sync_add_and_fetch(&foo, 1); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_rk_have___sync_add_and_fetch=yes -else - ac_rk_have___sync_add_and_fetch=no fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -if test "$ac_rk_have___sync_add_and_fetch" = "yes" ; then +ac_fn_c_check_header_compile "$LINENO" "sys/file.h" "ac_cv_header_sys_file_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_file_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_FILE_H 1" >>confdefs.h -cat >>confdefs.h <<_ACEOF -#define HAVE___SYNC_ADD_AND_FETCH 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "sys/filio.h" "ac_cv_header_sys_filio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_filio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_FILIO_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_rk_have___sync_add_and_fetch" >&5 -$as_echo "$ac_rk_have___sync_add_and_fetch" >&6; } +ac_fn_c_check_header_compile "$LINENO" "sys/ioccom.h" "ac_cv_header_sys_ioccom_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioccom_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IOCCOM_H 1" >>confdefs.h +fi +ac_fn_c_check_header_compile "$LINENO" "sys/mman.h" "ac_cv_header_sys_mman_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mman_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_MMAN_H 1" >>confdefs.h -for ac_func in getpagesize -do : - ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize" -if test "x$ac_cv_func_getpagesize" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETPAGESIZE 1 -_ACEOF +fi +ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_param_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/pty.h" "ac_cv_header_sys_pty_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_pty_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PTY_H 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 -$as_echo_n "checking for working mmap... " >&6; } -if test "${ac_cv_func_mmap_fixed_mapped+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - ac_cv_func_mmap_fixed_mapped=no -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -$ac_includes_default -/* malloc might have been renamed as rpl_malloc. */ -#undef malloc +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ptyio.h" "ac_cv_header_sys_ptyio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ptyio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PTYIO_H 1" >>confdefs.h -/* Thanks to Mike Haertel and Jim Avera for this test. - Here is a matrix of mmap possibilities: - mmap private not fixed - mmap private fixed at somewhere currently unmapped - mmap private fixed at somewhere already mapped - mmap shared not fixed - mmap shared fixed at somewhere currently unmapped - mmap shared fixed at somewhere already mapped - For private mappings, we should verify that changes cannot be read() - back from the file, nor mmap's back from the file at a different - address. (There have been systems where private was not correctly - implemented like the infamous i386 svr4.0, and systems where the - VM page cache was not coherent with the file system buffer cache - like early versions of FreeBSD and possibly contemporary NetBSD.) - For shared mappings, we should conversely verify that changes get - propagated back to all the places they're supposed to be. +fi +ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h - Grep wants private fixed already mapped. - The main things grep needs to know about mmap are: - * does it exist and is it safe to write into the mmap'd area - * how to use it (BSD variants) */ +fi +ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_socket_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h -#include -#include +fi +ac_fn_c_check_header_compile "$LINENO" "sys/str_tty.h" "ac_cv_header_sys_str_tty_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_str_tty_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STR_TTY_H 1" >>confdefs.h -#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H -char *malloc (); -#endif +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stream.h" "ac_cv_header_sys_stream_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stream_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STREAM_H 1" >>confdefs.h -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ +fi +ac_fn_c_check_header_compile "$LINENO" "sys/stropts.h" "ac_cv_header_sys_stropts_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stropts_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STROPTS_H 1" >>confdefs.h -#endif /* no HAVE_GETPAGESIZE */ +fi +ac_fn_c_check_header_compile "$LINENO" "sys/syscall.h" "ac_cv_header_sys_syscall_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_syscall_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_SYSCALL_H 1" >>confdefs.h -int -main () -{ - char *data, *data2, *data3; - int i, pagesize; - int fd, fd2; +fi +ac_fn_c_check_header_compile "$LINENO" "sys/termio.h" "ac_cv_header_sys_termio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_termio_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TERMIO_H 1" >>confdefs.h - pagesize = getpagesize (); +fi +ac_fn_c_check_header_compile "$LINENO" "sys/timeb.h" "ac_cv_header_sys_timeb_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_timeb_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIMEB_H 1" >>confdefs.h - /* First, make a file with some known garbage in it. */ - data = (char *) malloc (pagesize); - if (!data) - return 1; - for (i = 0; i < pagesize; ++i) - *(data + i) = rand (); - umask (0); - fd = creat ("conftest.mmap", 0600); - if (fd < 0) - return 2; - if (write (fd, data, pagesize) != pagesize) - return 3; - close (fd); +fi +ac_fn_c_check_header_compile "$LINENO" "sys/times.h" "ac_cv_header_sys_times_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_times_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TIMES_H 1" >>confdefs.h - /* Next, check that the tail of a page is zero-filled. File must have - non-zero length, otherwise we risk SIGBUS for entire page. */ - fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); - if (fd2 < 0) - return 4; - data2 = ""; - if (write (fd2, data2, 1) != 1) - return 5; - data2 = mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); - if (data2 == MAP_FAILED) - return 6; - for (i = 0; i < pagesize; ++i) - if (*(data2 + i)) - return 7; - close (fd2); - if (munmap (data2, pagesize)) - return 8; +fi +ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_types_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h - /* Next, try to mmap the file at a fixed address which already has - something else allocated at it. If we can, also make sure that - we see the same garbage. */ - fd = open ("conftest.mmap", O_RDWR); - if (fd < 0) - return 9; - if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) - return 10; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data2 + i)) - return 11; +fi +ac_fn_c_check_header_compile "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_un_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UN_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = xyes +then : + printf "%s\n" "#define HAVE_LOCALE_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "termcap.h" "ac_cv_header_termcap_h" "$ac_includes_default" +if test "x$ac_cv_header_termcap_h" = xyes +then : + printf "%s\n" "#define HAVE_TERMCAP_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "termio.h" "ac_cv_header_termio_h" "$ac_includes_default" +if test "x$ac_cv_header_termio_h" = xyes +then : + printf "%s\n" "#define HAVE_TERMIO_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" +if test "x$ac_cv_header_termios_h" = xyes +then : + printf "%s\n" "#define HAVE_TERMIOS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default" +if test "x$ac_cv_header_time_h" = xyes +then : + printf "%s\n" "#define HAVE_TIME_H 1" >>confdefs.h - /* Finally, make sure that changes to the mapped area do not - percolate back to the file as seen by read(). (This is a bug on - some variants of i386 svr4.0.) */ - for (i = 0; i < pagesize; ++i) - *(data2 + i) = *(data2 + i) + 1; - data3 = (char *) malloc (pagesize); - if (!data3) - return 12; - if (read (fd, data3, pagesize) != pagesize) - return 13; - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data3 + i)) - return 14; - close (fd); - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_mmap_fixed_mapped=yes -else - ac_cv_func_mmap_fixed_mapped=no fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_fn_c_check_header_compile "$LINENO" "tmpdir.h" "ac_cv_header_tmpdir_h" "$ac_includes_default" +if test "x$ac_cv_header_tmpdir_h" = xyes +then : + printf "%s\n" "#define HAVE_TMPDIR_H 1" >>confdefs.h + fi +ac_fn_c_check_header_compile "$LINENO" "udb.h" "ac_cv_header_udb_h" "$ac_includes_default" +if test "x$ac_cv_header_udb_h" = xyes +then : + printf "%s\n" "#define HAVE_UDB_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "util.h" "ac_cv_header_util_h" "$ac_includes_default" +if test "x$ac_cv_header_util_h" = xyes +then : + printf "%s\n" "#define HAVE_UTIL_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 -$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; } -if test $ac_cv_func_mmap_fixed_mapped = yes; then -$as_echo "#define HAVE_MMAP 1" >>confdefs.h + +ac_fn_c_check_header_preproc "$LINENO" "term.h" "ac_cv_header_term_h" +if test "x$ac_cv_header_term_h" = xyes +then : + printf "%s\n" "#define HAVE_TERM_H 1" >>confdefs.h fi -rm -f conftest.mmap conftest.txt +ac_fn_c_check_header_compile "$LINENO" "asl.h" "ac_cv_header_asl_h" " +#include +#ifndef ASL_STRING_EMERG +#error ASL_STRING_EMERG missing +#endif +" +if test "x$ac_cv_header_asl_h" = xyes +then : + printf "%s\n" "#define HAVE_ASL_H 1" >>confdefs.h +fi -for ac_header in capability.h sys/capability.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" -eval as_val=\$$as_ac_Header - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF + +ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$ac_includes_default +#if HAVE_SYS_SOCKET_H +#include +#endif +" +if test "x$ac_cv_header_net_if_h" = xyes +then : + printf "%s\n" "#define HAVE_NET_IF_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/ptyvar.h" "ac_cv_header_sys_ptyvar_h" "$ac_includes_default +#if HAVE_SYS_TTY_H +#include +#endif +" +if test "x$ac_cv_header_sys_ptyvar_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PTYVAR_H 1" >>confdefs.h + +fi -for ac_func in sgi_getcapabilitybyname cap_set_proc -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF + +ac_fn_c_check_header_compile "$LINENO" "sys/strtty.h" "ac_cv_header_sys_strtty_h" "$ac_includes_default +#if HAVE_TERMIOS_H +#include +#endif +#if HAVE_SYS_STREAM_H +#include +#endif +" +if test "x$ac_cv_header_sys_strtty_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_STRTTY_H 1" >>confdefs.h fi -done +ac_fn_c_check_header_compile "$LINENO" "sys/ucred.h" "ac_cv_header_sys_ucred_h" "$ac_includes_default +#if HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_PARAM_H +#include +#endif +" +if test "x$ac_cv_header_sys_ucred_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_UCRED_H 1" >>confdefs.h + +fi + +ac_fn_c_check_header_compile "$LINENO" "security/pam_modules.h" "ac_cv_header_security_pam_modules_h" "$ac_includes_default +#include +" +if test "x$ac_cv_header_security_pam_modules_h" = xyes +then : + printf "%s\n" "#define HAVE_SECURITY_PAM_MODULES_H 1" >>confdefs.h +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpwnam_r" >&5 -$as_echo_n "checking for getpwnam_r... " >&6; } -if test "${ac_cv_funclib_getpwnam_r+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -if eval "test \"\$ac_cv_func_getpwnam_r\" != yes" ; then + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for logwtmp" >&5 +printf %s "checking for logwtmp... " >&6; } +if test ${ac_cv_funclib_logwtmp+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_logwtmp\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" c_r; do + for ac_lib in "" util; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -26803,179 +28896,275 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#ifdef HAVE_UTIL_H +#include +#endif + int -main () +main (void) { -getpwnam_r() +logwtmp(0,0,0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_getpwnam_r=$ac_lib; else ac_cv_funclib_getpwnam_r=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_logwtmp=$ac_lib; else ac_cv_funclib_logwtmp=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_getpwnam_r=\${ac_cv_funclib_getpwnam_r-no}" + eval "ac_cv_funclib_logwtmp=\${ac_cv_funclib_logwtmp-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_getpwnam_r" +eval "ac_res=\$ac_cv_funclib_logwtmp" if false; then - for ac_func in getpwnam_r -do : - ac_fn_c_check_func "$LINENO" "getpwnam_r" "ac_cv_func_getpwnam_r" -if test "x$ac_cv_func_getpwnam_r" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_GETPWNAM_R 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "logwtmp" "ac_cv_func_logwtmp" +if test "x$ac_cv_func_logwtmp" = xyes +then : + printf "%s\n" "#define HAVE_LOGWTMP 1" >>confdefs.h fi -done fi -# getpwnam_r -eval "ac_tr_func=HAVE_`echo getpwnam_r | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# logwtmp +eval "ac_tr_func=HAVE_`echo logwtmp | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_getpwnam_r=$ac_res" +eval "LIB_logwtmp=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_getpwnam_r=yes" - eval "LIB_getpwnam_r=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_logwtmp=yes" + eval "LIB_logwtmp=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_getpwnam_r=no" - eval "LIB_getpwnam_r=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_logwtmp=no" + eval "LIB_logwtmp=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_getpwnam_r=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_logwtmp=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac -if test "$ac_cv_func_getpwnam_r" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getpwnam_r is posix" >&5 -$as_echo_n "checking if getpwnam_r is posix... " >&6; } -if test "${ac_cv_func_getpwnam_r_posix+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_libs="$LIBS" - LIBS="$LIBS $LIB_getpwnam_r" - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for logout" >&5 +printf %s "checking for logout... " >&6; } +if test ${ac_cv_funclib_logout+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_logout\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" util; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#define _POSIX_PTHREAD_SEMANTICS -#include -int main(int argc, char **argv) +#ifdef HAVE_UTIL_H +#include +#endif + +int +main (void) { - struct passwd pw, *pwd; - return getpwnam_r("", &pw, 0, 0, &pwd) < 0; +logout(0) + ; + return 0; } - _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_getpwnam_r_posix=yes -else - ac_cv_func_getpwnam_r_posix=no +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_logout=$ac_lib; else ac_cv_funclib_logout=yes; fi";break fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_logout=\${ac_cv_funclib_logout-no}" + LIBS="$ac_save_LIBS" fi -LIBS="$ac_libs" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpwnam_r_posix" >&5 -$as_echo "$ac_cv_func_getpwnam_r_posix" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if _POSIX_PTHREAD_SEMANTICS is needed" >&5 -$as_echo_n "checking if _POSIX_PTHREAD_SEMANTICS is needed... " >&6; } -if test "${ac_cv_func_getpwnam_r_posix_def+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_libs="$LIBS" - LIBS="$LIBS $LIB_getpwnam_r" - if test "$cross_compiling" = yes; then : - : -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext + + +eval "ac_res=\$ac_cv_funclib_logout" + +if false; then + ac_fn_c_check_func "$LINENO" "logout" "ac_cv_func_logout" +if test "x$ac_cv_func_logout" = xyes +then : + printf "%s\n" "#define HAVE_LOGOUT 1" >>confdefs.h + +fi + +fi +# logout +eval "ac_tr_func=HAVE_`echo logout | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_logout=$ac_res" + +case "$ac_res" in + yes) + eval "ac_cv_func_logout=yes" + eval "LIB_logout=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_logout=no" + eval "LIB_logout=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_logout=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for openpty" >&5 +printf %s "checking for openpty... " >&6; } +if test ${ac_cv_funclib_openpty+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_openpty\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" util; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -int main(int argc, char **argv) +#ifdef HAVE_UTIL_H +#include +#endif + +int +main (void) { - struct passwd pw, *pwd; - return getpwnam_r("", &pw, 0, 0, &pwd) < 0; +openpty(0,0,0,0,0) + ; + return 0; } - _ACEOF -if ac_fn_c_try_run "$LINENO"; then : - ac_cv_func_getpwnam_r_posix_def=no -else - ac_cv_func_getpwnam_r_posix_def=yes +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_openpty=$ac_lib; else ac_cv_funclib_openpty=yes; fi";break fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_openpty=\${ac_cv_funclib_openpty-no}" + LIBS="$ac_save_LIBS" fi -LIBS="$ac_libs" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpwnam_r_posix_def" >&5 -$as_echo "$ac_cv_func_getpwnam_r_posix_def" >&6; } -if test "$ac_cv_func_getpwnam_r_posix" = yes; then -$as_echo "#define POSIX_GETPWNAM_R 1" >>confdefs.h -fi -if test "$ac_cv_func_getpwnam_r_posix" = yes -a "$ac_cv_func_getpwnam_r_posix_def" = yes; then +eval "ac_res=\$ac_cv_funclib_openpty" + +if false; then + ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" +if test "x$ac_cv_func_openpty" = xyes +then : + printf "%s\n" "#define HAVE_OPENPTY 1" >>confdefs.h + +fi + +fi +# openpty +eval "ac_tr_func=HAVE_`echo openpty | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_openpty=$ac_res" + +case "$ac_res" in + yes) + eval "ac_cv_func_openpty=yes" + eval "LIB_openpty=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_openpty=no" + eval "LIB_openpty=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_openpty=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h -$as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac -fi -fi -if test "$enable_pthread_support" != no; then - saved_LIBS="$LIBS" - LIBS="$LIBS $PTHREADS_LIBS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for door_create" >&5 -$as_echo_n "checking for door_create... " >&6; } -if test "${ac_cv_funclib_door_create+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent" >&5 +printf %s "checking for tgetent... " >&6; } +if test ${ac_cv_funclib_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop -if eval "test \"\$ac_cv_func_door_create\" != yes" ; then +if eval "test \"\$ac_cv_func_tgetent\" != yes" ; then ac_save_LIBS="$LIBS" - for ac_lib in "" door; do + for ac_lib in "" termcap ncurses curses; do case "$ac_lib" in "") ;; yes) ac_lib="" ;; @@ -26987,695 +29176,937 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ +#ifdef HAVE_TERMCAP_H +#include +#endif +#ifdef HAVE_CURSES_H +#include +#endif + int -main () +main (void) { -door_create() +tgetent(0,0) ; return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - eval "if test -n \"$ac_lib\";then ac_cv_funclib_door_create=$ac_lib; else ac_cv_funclib_door_create=yes; fi";break +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_tgetent=$ac_lib; else ac_cv_funclib_tgetent=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done - eval "ac_cv_funclib_door_create=\${ac_cv_funclib_door_create-no}" + eval "ac_cv_funclib_tgetent=\${ac_cv_funclib_tgetent-no}" LIBS="$ac_save_LIBS" fi fi -eval "ac_res=\$ac_cv_funclib_door_create" +eval "ac_res=\$ac_cv_funclib_tgetent" if false; then - for ac_func in door_create -do : - ac_fn_c_check_func "$LINENO" "door_create" "ac_cv_func_door_create" -if test "x$ac_cv_func_door_create" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_DOOR_CREATE 1 -_ACEOF + ac_fn_c_check_func "$LINENO" "tgetent" "ac_cv_func_tgetent" +if test "x$ac_cv_func_tgetent" = xyes +then : + printf "%s\n" "#define HAVE_TGETENT 1" >>confdefs.h fi -done fi -# door_create -eval "ac_tr_func=HAVE_`echo door_create | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +# tgetent +eval "ac_tr_func=HAVE_`echo tgetent | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" -eval "LIB_door_create=$ac_res" +eval "LIB_tgetent=$ac_res" case "$ac_res" in yes) - eval "ac_cv_func_door_create=yes" - eval "LIB_door_create=" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_tgetent=yes" + eval "LIB_tgetent=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } ;; no) - eval "ac_cv_func_door_create=no" - eval "LIB_door_create=" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + eval "ac_cv_func_tgetent=no" + eval "LIB_tgetent=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } ;; *) - eval "ac_cv_func_door_create=yes" - eval "ac_cv_lib_`echo "$ac_res" | sed 's/-l//'`=yes" - cat >>confdefs.h <<_ACEOF -#define $ac_tr_func 1 -_ACEOF + eval "ac_cv_func_tgetent=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h - cat >>confdefs.h <<_ACEOF -#define $ac_tr_lib 1 -_ACEOF + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 -$as_echo "yes, in $ac_res" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } ;; esac - LIBS="$saved_LIBS" + + +ac_fn_c_check_func "$LINENO" "_getpty" "ac_cv_func__getpty" +if test "x$ac_cv_func__getpty" = xyes +then : + printf "%s\n" "#define HAVE__GETPTY 1" >>confdefs.h + fi +ac_fn_c_check_func "$LINENO" "_scrsize" "ac_cv_func__scrsize" +if test "x$ac_cv_func__scrsize" = xyes +then : + printf "%s\n" "#define HAVE__SCRSIZE 1" >>confdefs.h -# Check whether --enable-kcm was given. -if test "${enable_kcm+set}" = set; then : - enableval=$enable_kcm; -else - enable_kcm=yes fi +ac_fn_c_check_func "$LINENO" "arc4random" "ac_cv_func_arc4random" +if test "x$ac_cv_func_arc4random" = xyes +then : + printf "%s\n" "#define HAVE_ARC4RANDOM 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "backtrace" "ac_cv_func_backtrace" +if test "x$ac_cv_func_backtrace" = xyes +then : + printf "%s\n" "#define HAVE_BACKTRACE 1" >>confdefs.h -if test "$enable_kcm" = yes ; then - if test "$ac_cv_header_sys_un_h" != yes -a "$ac_cv_funclib_door_create" != yes ; then - enable_kcm=no - fi fi -if test "$enable_kcm" = yes; then +ac_fn_c_check_func "$LINENO" "fcntl" "ac_cv_func_fcntl" +if test "x$ac_cv_func_fcntl" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL 1" >>confdefs.h -$as_echo "#define HAVE_KCM 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "fork" "ac_cv_func_fork" +if test "x$ac_cv_func_fork" = xyes +then : + printf "%s\n" "#define HAVE_FORK 1" >>confdefs.h fi - if test "$enable_kcm" = yes; then - KCM_TRUE= - KCM_FALSE='#' -else - KCM_TRUE='#' - KCM_FALSE= +ac_fn_c_check_func "$LINENO" "getpeereid" "ac_cv_func_getpeereid" +if test "x$ac_cv_func_getpeereid" = xyes +then : + printf "%s\n" "#define HAVE_GETPEEREID 1" >>confdefs.h + fi +ac_fn_c_check_func "$LINENO" "getpeerucred" "ac_cv_func_getpeerucred" +if test "x$ac_cv_func_getpeerucred" = xyes +then : + printf "%s\n" "#define HAVE_GETPEERUCRED 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "grantpt" "ac_cv_func_grantpt" +if test "x$ac_cv_func_grantpt" = xyes +then : + printf "%s\n" "#define HAVE_GRANTPT 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "kill" "ac_cv_func_kill" +if test "x$ac_cv_func_kill" = xyes +then : + printf "%s\n" "#define HAVE_KILL 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "mktime" "ac_cv_func_mktime" +if test "x$ac_cv_func_mktime" = xyes +then : + printf "%s\n" "#define HAVE_MKTIME 1" >>confdefs.h -for ac_func in getudbnam setlim -do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -eval as_val=\$$as_ac_var - if test "x$as_val" = x""yes; then : - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF +fi +ac_fn_c_check_func "$LINENO" "ptsname" "ac_cv_func_ptsname" +if test "x$ac_cv_func_ptsname" = xyes +then : + printf "%s\n" "#define HAVE_PTSNAME 1" >>confdefs.h fi -done +ac_fn_c_check_func "$LINENO" "rand" "ac_cv_func_rand" +if test "x$ac_cv_func_rand" = xyes +then : + printf "%s\n" "#define HAVE_RAND 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "revoke" "ac_cv_func_revoke" +if test "x$ac_cv_func_revoke" = xyes +then : + printf "%s\n" "#define HAVE_REVOKE 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select" +if test "x$ac_cv_func_select" = xyes +then : + printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "setitimer" "ac_cv_func_setitimer" +if test "x$ac_cv_func_setitimer" = xyes +then : + printf "%s\n" "#define HAVE_SETITIMER 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "setpcred" "ac_cv_func_setpcred" +if test "x$ac_cv_func_setpcred" = xyes +then : + printf "%s\n" "#define HAVE_SETPCRED 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "setpgid" "ac_cv_func_setpgid" +if test "x$ac_cv_func_setpgid" = xyes +then : + printf "%s\n" "#define HAVE_SETPGID 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_addr in struct utmp" >&5 -$as_echo_n "checking for ut_addr in struct utmp... " >&6; } -if test "${ac_cv_type_struct_utmp_ut_addr+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_func "$LINENO" "setproctitle" "ac_cv_func_setproctitle" +if test "x$ac_cv_func_setproctitle" = xyes +then : + printf "%s\n" "#define HAVE_SETPROCTITLE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setregid" "ac_cv_func_setregid" +if test "x$ac_cv_func_setregid" = xyes +then : + printf "%s\n" "#define HAVE_SETREGID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setresgid" "ac_cv_func_setresgid" +if test "x$ac_cv_func_setresgid" = xyes +then : + printf "%s\n" "#define HAVE_SETRESGID 1" >>confdefs.h -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmp x; memset(&x, 0, sizeof(x)); x.ut_addr - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmp_ut_addr=yes -else - ac_cv_type_struct_utmp_ut_addr=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_func "$LINENO" "setresuid" "ac_cv_func_setresuid" +if test "x$ac_cv_func_setresuid" = xyes +then : + printf "%s\n" "#define HAVE_SETRESUID 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmp_ut_addr" >&5 -$as_echo "$ac_cv_type_struct_utmp_ut_addr" >&6; } -if test "$ac_cv_type_struct_utmp_ut_addr" = yes; then +ac_fn_c_check_func "$LINENO" "setreuid" "ac_cv_func_setreuid" +if test "x$ac_cv_func_setreuid" = xyes +then : + printf "%s\n" "#define HAVE_SETREUID 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "setsid" "ac_cv_func_setsid" +if test "x$ac_cv_func_setsid" = xyes +then : + printf "%s\n" "#define HAVE_SETSID 1" >>confdefs.h -$as_echo "#define HAVE_STRUCT_UTMP_UT_ADDR 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "setutent" "ac_cv_func_setutent" +if test "x$ac_cv_func_setutent" = xyes +then : + printf "%s\n" "#define HAVE_SETUTENT 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" +if test "x$ac_cv_func_sigaction" = xyes +then : + printf "%s\n" "#define HAVE_SIGACTION 1" >>confdefs.h fi +ac_fn_c_check_func "$LINENO" "strstr" "ac_cv_func_strstr" +if test "x$ac_cv_func_strstr" = xyes +then : + printf "%s\n" "#define HAVE_STRSTR 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "ttyname" "ac_cv_func_ttyname" +if test "x$ac_cv_func_ttyname" = xyes +then : + printf "%s\n" "#define HAVE_TTYNAME 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "ttyslot" "ac_cv_func_ttyslot" +if test "x$ac_cv_func_ttyslot" = xyes +then : + printf "%s\n" "#define HAVE_TTYSLOT 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "umask" "ac_cv_func_umask" +if test "x$ac_cv_func_umask" = xyes +then : + printf "%s\n" "#define HAVE_UMASK 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_host in struct utmp" >&5 -$as_echo_n "checking for ut_host in struct utmp... " >&6; } -if test "${ac_cv_type_struct_utmp_ut_host+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +fi +ac_fn_c_check_func "$LINENO" "unlockpt" "ac_cv_func_unlockpt" +if test "x$ac_cv_func_unlockpt" = xyes +then : + printf "%s\n" "#define HAVE_UNLOCKPT 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "vhangup" "ac_cv_func_vhangup" +if test "x$ac_cv_func_vhangup" = xyes +then : + printf "%s\n" "#define HAVE_VHANGUP 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "waitpid" "ac_cv_func_waitpid" +if test "x$ac_cv_func_waitpid" = xyes +then : + printf "%s\n" "#define HAVE_WAITPID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "yp_get_default_domain" "ac_cv_func_yp_get_default_domain" +if test "x$ac_cv_func_yp_get_default_domain" = xyes +then : + printf "%s\n" "#define HAVE_YP_GET_DEFAULT_DOMAIN 1" >>confdefs.h + +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking checking for __sync_add_and_fetch" >&5 +printf %s "checking checking for __sync_add_and_fetch... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include int -main () +main (void) { -struct utmp x; memset(&x, 0, sizeof(x)); x.ut_host +unsigned int foo, bar; bar = __sync_add_and_fetch(&foo, 1); ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmp_ut_host=yes -else - ac_cv_type_struct_utmp_ut_host=no +if ac_fn_c_try_link "$LINENO" +then : + ac_rk_have___sync_add_and_fetch=yes +else $as_nop + ac_rk_have___sync_add_and_fetch=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +if test "$ac_rk_have___sync_add_and_fetch" = "yes" ; then + +printf "%s\n" "#define HAVE___SYNC_ADD_AND_FETCH 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmp_ut_host" >&5 -$as_echo "$ac_cv_type_struct_utmp_ut_host" >&6; } -if test "$ac_cv_type_struct_utmp_ut_host" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_rk_have___sync_add_and_fetch" >&5 +printf "%s\n" "$ac_rk_have___sync_add_and_fetch" >&6; } -$as_echo "#define HAVE_STRUCT_UTMP_UT_HOST 1" >>confdefs.h +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5 +printf %s "checking for working mmap... " >&6; } +if test ${ac_cv_func_mmap_fixed_mapped+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on platforms where we know the result. + linux*) ac_cv_func_mmap_fixed_mapped=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_mmap_fixed_mapped=no ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +/* malloc might have been renamed as rpl_malloc. */ +#undef malloc -fi +/* Thanks to Mike Haertel and Jim Avera for this test. + Here is a matrix of mmap possibilities: + mmap private not fixed + mmap private fixed at somewhere currently unmapped + mmap private fixed at somewhere already mapped + mmap shared not fixed + mmap shared fixed at somewhere currently unmapped + mmap shared fixed at somewhere already mapped + For private mappings, we should verify that changes cannot be read() + back from the file, nor mmap's back from the file at a different + address. (There have been systems where private was not correctly + implemented like the infamous i386 svr4.0, and systems where the + VM page cache was not coherent with the file system buffer cache + like early versions of FreeBSD and possibly contemporary NetBSD.) + For shared mappings, we should conversely verify that changes get + propagated back to all the places they're supposed to be. + Grep wants private fixed already mapped. + The main things grep needs to know about mmap are: + * does it exist and is it safe to write into the mmap'd area + * how to use it (BSD variants) */ +#include +#include +/* This mess was copied from the GNU getpagesize.h. */ +#ifndef HAVE_GETPAGESIZE +# ifdef _SC_PAGESIZE +# define getpagesize() sysconf(_SC_PAGESIZE) +# else /* no _SC_PAGESIZE */ +# ifdef HAVE_SYS_PARAM_H +# include +# ifdef EXEC_PAGESIZE +# define getpagesize() EXEC_PAGESIZE +# else /* no EXEC_PAGESIZE */ +# ifdef NBPG +# define getpagesize() NBPG * CLSIZE +# ifndef CLSIZE +# define CLSIZE 1 +# endif /* no CLSIZE */ +# else /* no NBPG */ +# ifdef NBPC +# define getpagesize() NBPC +# else /* no NBPC */ +# ifdef PAGESIZE +# define getpagesize() PAGESIZE +# endif /* PAGESIZE */ +# endif /* no NBPC */ +# endif /* no NBPG */ +# endif /* no EXEC_PAGESIZE */ +# else /* no HAVE_SYS_PARAM_H */ +# define getpagesize() 8192 /* punt totally */ +# endif /* no HAVE_SYS_PARAM_H */ +# endif /* no _SC_PAGESIZE */ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_id in struct utmp" >&5 -$as_echo_n "checking for ut_id in struct utmp... " >&6; } -if test "${ac_cv_type_struct_utmp_ut_id+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +#endif /* no HAVE_GETPAGESIZE */ -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include int -main () +main (void) { -struct utmp x; memset(&x, 0, sizeof(x)); x.ut_id - ; + char *data, *data2, *data3; + const char *cdata2; + int i, pagesize; + int fd, fd2; + + pagesize = getpagesize (); + + /* First, make a file with some known garbage in it. */ + data = (char *) malloc (pagesize); + if (!data) + return 1; + for (i = 0; i < pagesize; ++i) + *(data + i) = rand (); + umask (0); + fd = creat ("conftest.mmap", 0600); + if (fd < 0) + return 2; + if (write (fd, data, pagesize) != pagesize) + return 3; + close (fd); + + /* Next, check that the tail of a page is zero-filled. File must have + non-zero length, otherwise we risk SIGBUS for entire page. */ + fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600); + if (fd2 < 0) + return 4; + cdata2 = ""; + if (write (fd2, cdata2, 1) != 1) + return 5; + data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L); + if (data2 == MAP_FAILED) + return 6; + for (i = 0; i < pagesize; ++i) + if (*(data2 + i)) + return 7; + close (fd2); + if (munmap (data2, pagesize)) + return 8; + + /* Next, try to mmap the file at a fixed address which already has + something else allocated at it. If we can, also make sure that + we see the same garbage. */ + fd = open ("conftest.mmap", O_RDWR); + if (fd < 0) + return 9; + if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_FIXED, fd, 0L)) + return 10; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data2 + i)) + return 11; + + /* Finally, make sure that changes to the mapped area do not + percolate back to the file as seen by read(). (This is a bug on + some variants of i386 svr4.0.) */ + for (i = 0; i < pagesize; ++i) + *(data2 + i) = *(data2 + i) + 1; + data3 = (char *) malloc (pagesize); + if (!data3) + return 12; + if (read (fd, data3, pagesize) != pagesize) + return 13; + for (i = 0; i < pagesize; ++i) + if (*(data + i) != *(data3 + i)) + return 14; + close (fd); + free (data); + free (data3); return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmp_ut_id=yes -else - ac_cv_type_struct_utmp_ut_id=no +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_mmap_fixed_mapped=yes +else $as_nop + ac_cv_func_mmap_fixed_mapped=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmp_ut_id" >&5 -$as_echo "$ac_cv_type_struct_utmp_ut_id" >&6; } -if test "$ac_cv_type_struct_utmp_ut_id" = yes; then - -$as_echo "#define HAVE_STRUCT_UTMP_UT_ID 1" >>confdefs.h +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5 +printf "%s\n" "$ac_cv_func_mmap_fixed_mapped" >&6; } +if test $ac_cv_func_mmap_fixed_mapped = yes; then +printf "%s\n" "#define HAVE_MMAP 1" >>confdefs.h fi +rm -f conftest.mmap conftest.txt -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_pid in struct utmp" >&5 -$as_echo_n "checking for ut_pid in struct utmp... " >&6; } -if test "${ac_cv_type_struct_utmp_ut_pid+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +ac_fn_c_check_header_compile "$LINENO" "capability.h" "ac_cv_header_capability_h" "$ac_includes_default" +if test "x$ac_cv_header_capability_h" = xyes +then : + printf "%s\n" "#define HAVE_CAPABILITY_H 1" >>confdefs.h -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmp x; memset(&x, 0, sizeof(x)); x.ut_pid - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmp_ut_pid=yes -else - ac_cv_type_struct_utmp_ut_pid=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_fn_c_check_header_compile "$LINENO" "sys/capability.h" "ac_cv_header_sys_capability_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_capability_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_CAPABILITY_H 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmp_ut_pid" >&5 -$as_echo "$ac_cv_type_struct_utmp_ut_pid" >&6; } -if test "$ac_cv_type_struct_utmp_ut_pid" = yes; then -$as_echo "#define HAVE_STRUCT_UTMP_UT_PID 1" >>confdefs.h +ac_fn_c_check_func "$LINENO" "sgi_getcapabilitybyname" "ac_cv_func_sgi_getcapabilitybyname" +if test "x$ac_cv_func_sgi_getcapabilitybyname" = xyes +then : + printf "%s\n" "#define HAVE_SGI_GETCAPABILITYBYNAME 1" >>confdefs.h +fi +ac_fn_c_check_func "$LINENO" "cap_set_proc" "ac_cv_func_cap_set_proc" +if test "x$ac_cv_func_cap_set_proc" = xyes +then : + printf "%s\n" "#define HAVE_CAP_SET_PROC 1" >>confdefs.h fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_type in struct utmp" >&5 -$as_echo_n "checking for ut_type in struct utmp... " >&6; } -if test "${ac_cv_type_struct_utmp_ut_type+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dladdr" >&5 +printf %s "checking for dladdr... " >&6; } +if test ${ac_cv_funclib_dladdr+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +if eval "test \"\$ac_cv_func_dladdr\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" dl; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + +#ifdef HAVE_DLFCN_H +#include +#endif int -main () +main (void) { -struct utmp x; memset(&x, 0, sizeof(x)); x.ut_type +dladdr(0,0) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmp_ut_type=yes -else - ac_cv_type_struct_utmp_ut_type=no +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_dladdr=$ac_lib; else ac_cv_funclib_dladdr=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_dladdr=\${ac_cv_funclib_dladdr-no}" + LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmp_ut_type" >&5 -$as_echo "$ac_cv_type_struct_utmp_ut_type" >&6; } -if test "$ac_cv_type_struct_utmp_ut_type" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMP_UT_TYPE 1" >>confdefs.h - fi +eval "ac_res=\$ac_cv_funclib_dladdr" +if false; then + ac_fn_c_check_func "$LINENO" "dladdr" "ac_cv_func_dladdr" +if test "x$ac_cv_func_dladdr" = xyes +then : + printf "%s\n" "#define HAVE_DLADDR 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_user in struct utmp" >&5 -$as_echo_n "checking for ut_user in struct utmp... " >&6; } -if test "${ac_cv_type_struct_utmp_ut_user+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmp x; memset(&x, 0, sizeof(x)); x.ut_user - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmp_ut_user=yes -else - ac_cv_type_struct_utmp_ut_user=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmp_ut_user" >&5 -$as_echo "$ac_cv_type_struct_utmp_ut_user" >&6; } -if test "$ac_cv_type_struct_utmp_ut_user" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMP_UT_USER 1" >>confdefs.h - +# dladdr +eval "ac_tr_func=HAVE_`echo dladdr | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_dladdr=$ac_res" -fi +case "$ac_res" in + yes) + eval "ac_cv_func_dladdr=yes" + eval "LIB_dladdr=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_dladdr=no" + eval "LIB_dladdr=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_dladdr=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_host in struct utmpx" >&5 -$as_echo_n "checking for ut_host in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_host+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_host - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_host=yes + if test "$ac_cv_funclib_dladdr" != no; then + HAVE_DLADDR_TRUE= + HAVE_DLADDR_FALSE='#' else - ac_cv_type_struct_utmpx_ut_host=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - + HAVE_DLADDR_TRUE='#' + HAVE_DLADDR_FALSE= fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_host" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_host" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_host" = yes; then -$as_echo "#define HAVE_STRUCT_UTMPX_UT_HOST 1" >>confdefs.h -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_id in struct utmpx" >&5 -$as_echo_n "checking for ut_id in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_id+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for getpwnam_r" >&5 +printf %s "checking for getpwnam_r... " >&6; } +if test ${ac_cv_funclib_getpwnam_r+y} +then : + printf %s "(cached) " >&6 +else $as_nop -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if eval "test \"\$ac_cv_func_getpwnam_r\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" c_r; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + int -main () +main (void) { -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_id +getpwnam_r() ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_id=yes -else - ac_cv_type_struct_utmpx_ut_id=no +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_getpwnam_r=$ac_lib; else ac_cv_funclib_getpwnam_r=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_getpwnam_r=\${ac_cv_funclib_getpwnam_r-no}" + LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_id" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_id" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_id" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMPX_UT_ID 1" >>confdefs.h - fi +eval "ac_res=\$ac_cv_funclib_getpwnam_r" +if false; then + ac_fn_c_check_func "$LINENO" "getpwnam_r" "ac_cv_func_getpwnam_r" +if test "x$ac_cv_func_getpwnam_r" = xyes +then : + printf "%s\n" "#define HAVE_GETPWNAM_R 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_line in struct utmpx" >&5 -$as_echo_n "checking for ut_line in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_line+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_line - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_line=yes -else - ac_cv_type_struct_utmpx_ut_line=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_line" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_line" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_line" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMPX_UT_LINE 1" >>confdefs.h - +# getpwnam_r +eval "ac_tr_func=HAVE_`echo getpwnam_r | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_getpwnam_r=$ac_res" -fi +case "$ac_res" in + yes) + eval "ac_cv_func_getpwnam_r=yes" + eval "LIB_getpwnam_r=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_getpwnam_r=no" + eval "LIB_getpwnam_r=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_getpwnam_r=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_pid in struct utmpx" >&5 -$as_echo_n "checking for ut_pid in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_pid+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if test "$ac_cv_func_getpwnam_r" = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getpwnam_r is posix" >&5 +printf %s "checking if getpwnam_r is posix... " >&6; } +if test ${ac_cv_func_getpwnam_r_posix+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_libs="$LIBS" + LIBS="$LIBS $LIB_getpwnam_r" + if test "$cross_compiling" = yes +then : + : +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -int -main () + +#define _POSIX_PTHREAD_SEMANTICS +#include +int main(int argc, char **argv) { -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_pid - ; - return 0; + struct passwd pw, *pwd; + return getpwnam_r("", &pw, 0, 0, &pwd) < 0; } + _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_pid=yes -else - ac_cv_type_struct_utmpx_ut_pid=no +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_getpwnam_r_posix=yes +else $as_nop + ac_cv_func_getpwnam_r_posix=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_pid" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_pid" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_pid" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMPX_UT_PID 1" >>confdefs.h - +LIBS="$ac_libs" fi - - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_tv in struct utmpx" >&5 -$as_echo_n "checking for ut_tv in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_tv+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpwnam_r_posix" >&5 +printf "%s\n" "$ac_cv_func_getpwnam_r_posix" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _POSIX_PTHREAD_SEMANTICS is needed" >&5 +printf %s "checking if _POSIX_PTHREAD_SEMANTICS is needed... " >&6; } +if test ${ac_cv_func_getpwnam_r_posix_def+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_libs="$LIBS" + LIBS="$LIBS $LIB_getpwnam_r" + if test "$cross_compiling" = yes +then : + : +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include -int -main () + +#include +int main(int argc, char **argv) { -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_tv - ; - return 0; + struct passwd pw, *pwd; + return getpwnam_r("", &pw, 0, 0, &pwd) < 0; } + _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_tv=yes -else - ac_cv_type_struct_utmpx_ut_tv=no +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_getpwnam_r_posix_def=no +else $as_nop + ac_cv_func_getpwnam_r_posix_def=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +LIBS="$ac_libs" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_tv" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_tv" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_tv" = yes; then +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getpwnam_r_posix_def" >&5 +printf "%s\n" "$ac_cv_func_getpwnam_r_posix_def" >&6; } +if test "$ac_cv_func_getpwnam_r_posix" = yes; then +printf "%s\n" "#define POSIX_GETPWNAM_R 1" >>confdefs.h -$as_echo "#define HAVE_STRUCT_UTMPX_UT_TV 1" >>confdefs.h +fi +if test "$ac_cv_func_getpwnam_r_posix" = yes -a "$ac_cv_func_getpwnam_r_posix_def" = yes; then +printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h fi +fi + +if test "$enable_pthread_support" != no; then + saved_LIBS="$LIBS" + LIBS="$LIBS $PTHREADS_LIBS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_type in struct utmpx" >&5 -$as_echo_n "checking for ut_type in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_type+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for door_create" >&5 +printf %s "checking for door_create... " >&6; } +if test ${ac_cv_funclib_door_create+y} +then : + printf %s "(cached) " >&6 +else $as_nop -cat confdefs.h - <<_ACEOF >conftest.$ac_ext +if eval "test \"\$ac_cv_func_door_create\" != yes" ; then + ac_save_LIBS="$LIBS" + for ac_lib in "" door; do + case "$ac_lib" in + "") ;; + yes) ac_lib="" ;; + no) continue ;; + -l*) ;; + *) ac_lib="-l$ac_lib" ;; + esac + LIBS=" $ac_lib $ac_save_LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include + int -main () +main (void) { -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_type +door_create() ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_type=yes -else - ac_cv_type_struct_utmpx_ut_type=no +if ac_fn_c_try_link "$LINENO" +then : + eval "if test -n \"$ac_lib\";then ac_cv_funclib_door_create=$ac_lib; else ac_cv_funclib_door_create=yes; fi";break fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + done + eval "ac_cv_funclib_door_create=\${ac_cv_funclib_door_create-no}" + LIBS="$ac_save_LIBS" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_type" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_type" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_type" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMPX_UT_TYPE 1" >>confdefs.h - fi +eval "ac_res=\$ac_cv_funclib_door_create" +if false; then + ac_fn_c_check_func "$LINENO" "door_create" "ac_cv_func_door_create" +if test "x$ac_cv_func_door_create" = xyes +then : + printf "%s\n" "#define HAVE_DOOR_CREATE 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_user in struct utmpx" >&5 -$as_echo_n "checking for ut_user in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_user+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_user - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_user=yes -else - ac_cv_type_struct_utmpx_ut_user=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_user" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_user" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_user" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMPX_UT_USER 1" >>confdefs.h - +# door_create +eval "ac_tr_func=HAVE_`echo door_create | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "ac_tr_lib=HAVE_LIB`echo $ac_res | sed -e 's/-l//' | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`" +eval "LIB_door_create=$ac_res" -fi +case "$ac_res" in + yes) + eval "ac_cv_func_door_create=yes" + eval "LIB_door_create=" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + no) + eval "ac_cv_func_door_create=no" + eval "LIB_door_create=" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + *) + eval "ac_cv_func_door_create=yes" + printf "%s\n" "#define $ac_tr_func 1" >>confdefs.h + printf "%s\n" "#define $ac_tr_lib 1" >>confdefs.h + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes, in $ac_res" >&5 +printf "%s\n" "yes, in $ac_res" >&6; } + ;; +esac -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_exit in struct utmpx" >&5 -$as_echo_n "checking for ut_exit in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_exit+set}" = set; then : - $as_echo_n "(cached) " >&6 -else -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_exit - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_exit=yes -else - ac_cv_type_struct_utmpx_ut_exit=no + LIBS="$saved_LIBS" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Check whether --enable-kcm was given. +if test ${enable_kcm+y} +then : + enableval=$enable_kcm; +else $as_nop + enable_kcm=yes fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_exit" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_exit" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_exit" = yes; then - - -$as_echo "#define HAVE_STRUCT_UTMPX_UT_EXIT 1" >>confdefs.h +if test "$enable_kcm" = yes ; then + if test "$ac_cv_header_sys_un_h" != yes -a "$ac_cv_funclib_door_create" != yes ; then + enable_kcm=no + fi fi +if test "$enable_kcm" = yes; then +printf "%s\n" "#define HAVE_KCM 1" >>confdefs.h - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ut_syslen in struct utmpx" >&5 -$as_echo_n "checking for ut_syslen in struct utmpx... " >&6; } -if test "${ac_cv_type_struct_utmpx_ut_syslen+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -struct utmpx x; memset(&x, 0, sizeof(x)); x.ut_syslen - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_type_struct_utmpx_ut_syslen=yes +fi + if test "$enable_kcm" = yes; then + KCM_TRUE= + KCM_FALSE='#' else - ac_cv_type_struct_utmpx_ut_syslen=no + KCM_TRUE='#' + KCM_FALSE= fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_struct_utmpx_ut_syslen" >&5 -$as_echo "$ac_cv_type_struct_utmpx_ut_syslen" >&6; } -if test "$ac_cv_type_struct_utmpx_ut_syslen" = yes; then -$as_echo "#define HAVE_STRUCT_UTMPX_UT_SYSLEN 1" >>confdefs.h +ac_fn_c_check_func "$LINENO" "getudbnam" "ac_cv_func_getudbnam" +if test "x$ac_cv_func_getudbnam" = xyes +then : + printf "%s\n" "#define HAVE_GETUDBNAM 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "setlim" "ac_cv_func_setlim" +if test "x$ac_cv_func_setlim" = xyes +then : + printf "%s\n" "#define HAVE_SETLIM 1" >>confdefs.h fi @@ -27699,11 +30130,10 @@ #endif " -if test "x$ac_cv_type_int8_t" = x""yes; then : +if test "x$ac_cv_type_int8_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_INT8_T 1 -_ACEOF +printf "%s\n" "#define HAVE_INT8_T 1" >>confdefs.h fi @@ -27725,11 +30155,10 @@ #endif " -if test "x$ac_cv_type_int16_t" = x""yes; then : +if test "x$ac_cv_type_int16_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_INT16_T 1 -_ACEOF +printf "%s\n" "#define HAVE_INT16_T 1" >>confdefs.h fi @@ -27751,11 +30180,10 @@ #endif " -if test "x$ac_cv_type_int32_t" = x""yes; then : +if test "x$ac_cv_type_int32_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_INT32_T 1 -_ACEOF +printf "%s\n" "#define HAVE_INT32_T 1" >>confdefs.h fi @@ -27777,11 +30205,10 @@ #endif " -if test "x$ac_cv_type_int64_t" = x""yes; then : +if test "x$ac_cv_type_int64_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_INT64_T 1 -_ACEOF +printf "%s\n" "#define HAVE_INT64_T 1" >>confdefs.h fi @@ -27803,11 +30230,10 @@ #endif " -if test "x$ac_cv_type_u_int8_t" = x""yes; then : +if test "x$ac_cv_type_u_int8_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_U_INT8_T 1 -_ACEOF +printf "%s\n" "#define HAVE_U_INT8_T 1" >>confdefs.h fi @@ -27829,11 +30255,10 @@ #endif " -if test "x$ac_cv_type_u_int16_t" = x""yes; then : +if test "x$ac_cv_type_u_int16_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_U_INT16_T 1 -_ACEOF +printf "%s\n" "#define HAVE_U_INT16_T 1" >>confdefs.h fi @@ -27855,11 +30280,10 @@ #endif " -if test "x$ac_cv_type_u_int32_t" = x""yes; then : +if test "x$ac_cv_type_u_int32_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_U_INT32_T 1 -_ACEOF +printf "%s\n" "#define HAVE_U_INT32_T 1" >>confdefs.h fi @@ -27881,11 +30305,10 @@ #endif " -if test "x$ac_cv_type_u_int64_t" = x""yes; then : +if test "x$ac_cv_type_u_int64_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_U_INT64_T 1 -_ACEOF +printf "%s\n" "#define HAVE_U_INT64_T 1" >>confdefs.h fi @@ -27907,11 +30330,10 @@ #endif " -if test "x$ac_cv_type_uint8_t" = x""yes; then : +if test "x$ac_cv_type_uint8_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_UINT8_T 1 -_ACEOF +printf "%s\n" "#define HAVE_UINT8_T 1" >>confdefs.h fi @@ -27933,11 +30355,10 @@ #endif " -if test "x$ac_cv_type_uint16_t" = x""yes; then : +if test "x$ac_cv_type_uint16_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_UINT16_T 1 -_ACEOF +printf "%s\n" "#define HAVE_UINT16_T 1" >>confdefs.h fi @@ -27959,11 +30380,10 @@ #endif " -if test "x$ac_cv_type_uint32_t" = x""yes; then : +if test "x$ac_cv_type_uint32_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_UINT32_T 1 -_ACEOF +printf "%s\n" "#define HAVE_UINT32_T 1" >>confdefs.h fi @@ -27985,11 +30405,10 @@ #endif " -if test "x$ac_cv_type_uint64_t" = x""yes; then : +if test "x$ac_cv_type_uint64_t" = xyes +then : -cat >>confdefs.h <<_ACEOF -#define HAVE_UINT64_T 1 -_ACEOF +printf "%s\n" "#define HAVE_UINT64_T 1" >>confdefs.h fi @@ -27997,11 +30416,12 @@ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for framework security" >&5 -$as_echo_n "checking for framework security... " >&6; } -if test "${rk_cv_framework_security+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for framework security" >&5 +printf %s "checking for framework security... " >&6; } +if test ${rk_cv_framework_security+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test "$rk_cv_framework_security" != yes; then ac_save_LIBS="$LIBS" @@ -28011,7 +30431,7 @@ #include int -main () +main (void) { SecKeychainSearchRef searchRef; SecKeychainSearchCreateFromAttributes(NULL,kSecCertificateItemClass,NULL, &searchRef); @@ -28021,10 +30441,11 @@ return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : rk_cv_framework_security=yes fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_save_LIBS" fi @@ -28034,13 +30455,13 @@ if test "$rk_cv_framework_security" = yes; then -$as_echo "#define HAVE_FRAMEWORK_SECURITY 1" >>confdefs.h +printf "%s\n" "#define HAVE_FRAMEWORK_SECURITY 1" >>confdefs.h - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi if test "$rk_cv_framework_security" = yes; then FRAMEWORK_SECURITY_TRUE= @@ -28054,36 +30475,38 @@ if test "$rk_cv_framework_security" = yes; then if test "$ac_cv_func_SecKeyGetCSPHandle+set" != set -o "$ac_cv_func_SecKeyGetCSPHandle" = yes; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if SecKeyGetCSPHandle needs a prototype" >&5 -$as_echo_n "checking if SecKeyGetCSPHandle needs a prototype... " >&6; } -if test "${ac_cv_func_SecKeyGetCSPHandle_noproto+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if SecKeyGetCSPHandle needs a prototype" >&5 +printf %s "checking if SecKeyGetCSPHandle needs a prototype... " >&6; } +if test ${ac_cv_func_SecKeyGetCSPHandle_noproto+y} +then : + printf %s "(cached) " >&6 +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include struct foo { int foo; } xx; extern int SecKeyGetCSPHandle (struct foo*); int -main () +main (void) { SecKeyGetCSPHandle(&xx) ; return 0; } _ACEOF -if ac_fn_c_try_compile "$LINENO"; then : +if ac_fn_c_try_compile "$LINENO" +then : eval "ac_cv_func_SecKeyGetCSPHandle_noproto=yes" -else +else $as_nop eval "ac_cv_func_SecKeyGetCSPHandle_noproto=no" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_SecKeyGetCSPHandle_noproto" >&5 -$as_echo "$ac_cv_func_SecKeyGetCSPHandle_noproto" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_SecKeyGetCSPHandle_noproto" >&5 +printf "%s\n" "$ac_cv_func_SecKeyGetCSPHandle_noproto" >&6; } if test "$ac_cv_func_SecKeyGetCSPHandle_noproto" = yes; then -$as_echo "#define NEED_SECKEYGETCSPHANDLE_PROTO 1" >>confdefs.h +printf "%s\n" "#define NEED_SECKEYGETCSPHANDLE_PROTO 1" >>confdefs.h fi fi @@ -28116,24 +30539,24 @@ fi -$as_echo "#define HAVE_READLINE 1" >>confdefs.h +printf "%s\n" "#define HAVE_READLINE 1" >>confdefs.h -$as_echo "#define AUTHENTICATION 1" >>confdefs.h +printf "%s\n" "#define AUTHENTICATION 1" >>confdefs.h -$as_echo "#define ENCRYPTION 1" >>confdefs.h +printf "%s\n" "#define ENCRYPTION 1" >>confdefs.h -$as_echo "#define DES_ENCRYPTION 1" >>confdefs.h +printf "%s\n" "#define DES_ENCRYPTION 1" >>confdefs.h -$as_echo "#define DIAGNOSTICS 1" >>confdefs.h +printf "%s\n" "#define DIAGNOSTICS 1" >>confdefs.h -$as_echo "#define OLD_ENVIRON 1" >>confdefs.h +printf "%s\n" "#define OLD_ENVIRON 1" >>confdefs.h if false; then -$as_echo "#define ENV_HACK 1" >>confdefs.h +printf "%s\n" "#define ENV_HACK 1" >>confdefs.h fi @@ -28147,19 +30570,22 @@ ;; *) ac_fn_c_check_func "$LINENO" "getmsg" "ac_cv_func_getmsg" -if test "x$ac_cv_func_getmsg" = x""yes; then : +if test "x$ac_cv_func_getmsg" = xyes +then : fi if test "$ac_cv_func_getmsg" = "yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if getmsg works" >&5 -$as_echo_n "checking if getmsg works... " >&6; } -if test "${ac_cv_func_getmsg_works+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if getmsg works" >&5 +printf %s "checking if getmsg works... " >&6; } +if test ${ac_cv_func_getmsg_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : ac_cv_func_getmsg_works=no -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -28176,9 +30602,10 @@ } _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : ac_cv_func_getmsg_works=yes -else +else $as_nop ac_cv_func_getmsg_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -28186,14 +30613,14 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getmsg_works" >&5 -$as_echo "$ac_cv_func_getmsg_works" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_getmsg_works" >&5 +printf "%s\n" "$ac_cv_func_getmsg_works" >&6; } if test "$ac_cv_func_getmsg_works" = "yes"; then -$as_echo "#define HAVE_GETMSG 1" >>confdefs.h +printf "%s\n" "#define HAVE_GETMSG 1" >>confdefs.h -$as_echo "#define STREAMSPTY 1" >>confdefs.h +printf "%s\n" "#define STREAMSPTY 1" >>confdefs.h fi fi @@ -28207,11 +30634,12 @@ # Extract the first word of "compile_et", so it can be a program name with args. set dummy compile_et; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_COMPILE_ET+set}" = set; then : - $as_echo_n "(cached) " >&6 -else +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_COMPILE_ET+y} +then : + printf %s "(cached) " >&6 +else $as_nop if test -n "$COMPILE_ET"; then ac_cv_prog_COMPILE_ET="$COMPILE_ET" # Let the user override the test. else @@ -28219,26 +30647,31 @@ for as_dir in $PATH do IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_COMPILE_ET="compile_et" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + printf "%s\n" "$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_COMPILE_ET" && ac_cv_prog_COMPILE_ET="no" fi fi COMPILE_ET=$ac_cv_prog_COMPILE_ET if test -n "$COMPILE_ET"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMPILE_ET" >&5 -$as_echo "$COMPILE_ET" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $COMPILE_ET" >&5 +printf "%s\n" "$COMPILE_ET" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } fi @@ -28246,10 +30679,10 @@ krb_cv_compile_et="no" krb_cv_com_err_need_r="" krb_cv_compile_et_cross=no -if test "${COMPILE_ET}" = "compile_et"; then +if test "${COMPILE_ET}" != "no"; then -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compile_et has the features we need" >&5 -$as_echo_n "checking whether compile_et has the features we need... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compile_et has the features we need" >&5 +printf %s "checking whether compile_et has the features we need... " >&6; } cat > conftest_et.et <<'EOF' error_table test conf prefix CONFTEST @@ -28264,9 +30697,16 @@ if test -d "/usr/include/et"; then CPPFLAGS="-I/usr/include/et ${CPPFLAGS}" fi - if test "$cross_compiling" = yes; 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 + + if test "$cross_compiling" = yes +then : krb_cv_compile_et="yes" krb_cv_compile_et_cross=yes -else +else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -28280,9 +30720,10 @@ return (CONFTEST_CODE2 - CONFTEST_CODE1) != 127;} _ACEOF -if ac_fn_c_try_run "$LINENO"; then : +if ac_fn_c_try_run "$LINENO" +then : krb_cv_compile_et="yes" -else +else $as_nop CPPFLAGS="${save_CPPFLAGS}" fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ @@ -28290,28 +30731,29 @@ fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${krb_cv_compile_et}" >&5 -$as_echo "${krb_cv_compile_et}" >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${krb_cv_compile_et}" >&5 +printf "%s\n" "${krb_cv_compile_et}" >&6; } if test "${krb_cv_compile_et}" = "yes" -a "${krb_cv_compile_et_cross}" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for if com_err generates a initialize_conf_error_table_r" >&5 -$as_echo_n "checking for if com_err generates a initialize_conf_error_table_r... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for if com_err generates a initialize_conf_error_table_r" >&5 +printf %s "checking for if com_err generates a initialize_conf_error_table_r... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "conftest_et.h" _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "initialize_conf_error_table_r.*struct et_list" >/dev/null 2>&1; then : + $EGREP "initialize_conf_error_table_r.*struct et_list" >/dev/null 2>&1 +then : krb_cv_com_err_need_r="ok" fi -rm -f conftest* +rm -rf conftest* if test X"$krb_cv_com_err_need_r" = X ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } krb_cv_compile_et=no else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } fi fi rm -fr conftest* @@ -28322,13 +30764,13 @@ elif test "${krb_cv_compile_et}" = "yes"; then krb_cv_save_LIBS="${LIBS}" LIBS="${LIBS} -lcom_err" - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for com_err" >&5 -$as_echo_n "checking for com_err... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for com_err" >&5 +printf %s "checking for com_err... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int -main () +main (void) { const char *p; @@ -28340,15 +30782,16 @@ return 0; } _ACEOF -if ac_fn_c_try_link "$LINENO"; then : +if ac_fn_c_try_link "$LINENO" +then : krb_cv_com_err="yes" -else +else $as_nop krb_cv_com_err="no"; CPPFLAGS="${save_CPPFLAGS}" fi -rm -f core conftest.err conftest.$ac_objext \ +rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${krb_cv_com_err}" >&5 -$as_echo "${krb_cv_com_err}" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${krb_cv_com_err}" >&5 +printf "%s\n" "${krb_cv_com_err}" >&6; } LIBS="${krb_cv_save_LIBS}" else krb_cv_com_err="no" @@ -28359,8 +30802,8 @@ LIB_com_err="-lcom_err" LIB_com_err_a="" LIB_com_err_so="" - { $as_echo "$as_me:${as_lineno-$LINENO}: Using the already-installed com_err" >&5 -$as_echo "$as_me: Using the already-installed com_err" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using the already-installed com_err" >&5 +printf "%s\n" "$as_me: Using the already-installed com_err" >&6;} COMPILE_ET="${ac_cv_prog_COMPILE_ET}" localcomerr=no elif test "${krb_cv_com_err}" = "cross"; then @@ -28368,8 +30811,8 @@ LIB_com_err="\$(top_builddir)/lib/com_err/libcom_err.la" LIB_com_err_a="\$(top_builddir)/lib/com_err/.libs/libcom_err.a" LIB_com_err_so="\$(top_builddir)/lib/com_err/.libs/libcom_err.so" - { $as_echo "$as_me:${as_lineno-$LINENO}: Using our own com_err with toolchain compile_et" >&5 -$as_echo "$as_me: Using our own com_err with toolchain compile_et" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using our own com_err with toolchain compile_et" >&5 +printf "%s\n" "$as_me: Using our own com_err with toolchain compile_et" >&6;} COMPILE_ET="${ac_cv_prog_COMPILE_ET}" localcomerr=yes else @@ -28378,8 +30821,8 @@ LIB_com_err="\$(top_builddir)/lib/com_err/libcom_err.la" LIB_com_err_a="\$(top_builddir)/lib/com_err/.libs/libcom_err.a" LIB_com_err_so="\$(top_builddir)/lib/com_err/.libs/libcom_err.so" - { $as_echo "$as_me:${as_lineno-$LINENO}: Using our own com_err" >&5 -$as_echo "$as_me: Using our own com_err" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Using our own com_err" >&5 +printf "%s\n" "$as_me: Using our own com_err" >&6;} localcomerr=yes fi if test "$localcomerr" = yes; then @@ -28398,8 +30841,8 @@ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which authentication modules should be built" >&5 -$as_echo_n "checking which authentication modules should be built... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which authentication modules should be built" >&5 +printf %s "checking which authentication modules should be built... " >&6; } z='sia afskauthlib' LIB_AUTH_SUBDIRS= @@ -28430,11 +30873,11 @@ esac done if test "$LIB_AUTH_SUBDIRS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIB_AUTH_SUBDIRS" >&5 -$as_echo "$LIB_AUTH_SUBDIRS" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIB_AUTH_SUBDIRS" >&5 +printf "%s\n" "$LIB_AUTH_SUBDIRS" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } fi @@ -28452,9 +30895,7 @@ eval y="$x" done -cat >>confdefs.h <<_ACEOF -#define BINDIR "$x" -_ACEOF +printf "%s\n" "#define BINDIR \"$x\"" >>confdefs.h x="${libdir}" eval y="$x" @@ -28463,9 +30904,7 @@ eval y="$x" done -cat >>confdefs.h <<_ACEOF -#define LIBDIR "$x" -_ACEOF +printf "%s\n" "#define LIBDIR \"$x\"" >>confdefs.h x="${libexecdir}" eval y="$x" @@ -28474,9 +30913,7 @@ eval y="$x" done -cat >>confdefs.h <<_ACEOF -#define LIBEXECDIR "$x" -_ACEOF +printf "%s\n" "#define LIBEXECDIR \"$x\"" >>confdefs.h x="${localstatedir}" eval y="$x" @@ -28485,9 +30922,7 @@ eval y="$x" done -cat >>confdefs.h <<_ACEOF -#define LOCALSTATEDIR "$x" -_ACEOF +printf "%s\n" "#define LOCALSTATEDIR \"$x\"" >>confdefs.h x="${sbindir}" eval y="$x" @@ -28496,9 +30931,7 @@ eval y="$x" done -cat >>confdefs.h <<_ACEOF -#define SBINDIR "$x" -_ACEOF +printf "%s\n" "#define SBINDIR \"$x\"" >>confdefs.h x="${sysconfdir}" eval y="$x" @@ -28507,35 +30940,46 @@ eval y="$x" done -cat >>confdefs.h <<_ACEOF -#define SYSCONFDIR "$x" -_ACEOF +printf "%s\n" "#define SYSCONFDIR \"$x\"" >>confdefs.h # Check whether --enable-developer was given. -if test "${enable_developer+set}" = set; then : +if test ${enable_developer+y} +then : enableval=$enable_developer; fi if test "X$enable_developer" = Xyes; then dwflags="-Werror" fi + if test "X$enable_developer" = Xyes; then + DEVELOPER_MODE_TRUE= + DEVELOPER_MODE_FALSE='#' +else + DEVELOPER_MODE_TRUE='#' + DEVELOPER_MODE_FALSE= +fi + WFLAGS_NOUNUSED="" -WFLAGS_NOIMPLICITINT="" if test -z "$WFLAGS" -a "$GCC" = "yes"; then - # -Wno-implicit-int for broken X11 headers # leave these out for now: # -Wcast-align doesn't work well on alpha osf/1 # -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast # -Wmissing-declarations -Wnested-externs # -Wstrict-overflow=5 WFLAGS="-Wall -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast -Wmissing-declarations -Wnested-externs $dwflags" - WFLAGS_NOUNUSED="-Wno-unused" - WFLAGS_NOIMPLICITINT="-Wno-implicit-int" + + # + # WFLAGS_LITE can be appended to WFLAGS to turn off a host of warnings + # that fail for various bits of older code in appl/. Let's not use it + # for the main libraries, though. + WFLAGS_LITE="-Wno-extra -Wno-missing-field-initializers -Wno-strict-aliasing -Wno-shadow" + # -Wno-unused-result (not supported on gcc-4.2) + fi @@ -28545,7 +30989,8 @@ # Check whether --enable-heimdal-documentation was given. -if test "${enable_heimdal_documentation+set}" = set; then : +if test ${enable_heimdal_documentation+y} +then : enableval=$enable_heimdal_documentation; fi @@ -28558,7 +31003,7 @@ fi -ac_config_files="$ac_config_files Makefile etc/Makefile include/Makefile include/gssapi/Makefile include/hcrypto/Makefile include/kadm5/Makefile lib/Makefile base/Makefile lib/asn1/Makefile lib/com_err/Makefile lib/hcrypto/Makefile lib/hx509/Makefile lib/gssapi/Makefile lib/ntlm/Makefile lib/hdb/Makefile lib/ipc/Makefile lib/kadm5/Makefile lib/kafs/Makefile lib/kdfs/Makefile lib/krb5/Makefile lib/otp/Makefile lib/roken/Makefile lib/sl/Makefile lib/sqlite/Makefile lib/vers/Makefile lib/wind/Makefile po/Makefile kuser/Makefile kpasswd/Makefile kadmin/Makefile admin/Makefile kcm/Makefile kdc/Makefile appl/Makefile appl/afsutil/Makefile appl/ftp/Makefile appl/ftp/common/Makefile appl/ftp/ftp/Makefile appl/ftp/ftpd/Makefile appl/gssmask/Makefile appl/kx/Makefile appl/login/Makefile appl/otp/Makefile appl/popper/Makefile appl/push/Makefile appl/rsh/Makefile appl/rcp/Makefile appl/su/Makefile appl/xnlock/Makefile appl/telnet/Makefile appl/telnet/libtelnet/Makefile appl/telnet/telnet/Makefile appl/telnet/telnetd/Makefile appl/test/Makefile appl/kf/Makefile appl/dceutils/Makefile tests/Makefile tests/bin/Makefile tests/can/Makefile tests/db/Makefile tests/kdc/Makefile tests/ldap/Makefile tests/gss/Makefile tests/java/Makefile tests/plugin/Makefile packages/Makefile packages/mac/Makefile doc/Makefile tools/Makefile" +ac_config_files="$ac_config_files Makefile etc/Makefile include/Makefile include/gssapi/Makefile include/hcrypto/Makefile include/kadm5/Makefile lib/Makefile lib/base/Makefile lib/asn1/Makefile lib/com_err/Makefile lib/hcrypto/Makefile lib/hx509/Makefile lib/gssapi/Makefile lib/ntlm/Makefile lib/hdb/Makefile lib/ipc/Makefile lib/kadm5/Makefile lib/kafs/Makefile lib/kdfs/Makefile lib/krb5/Makefile lib/otp/Makefile lib/roken/Makefile lib/sl/Makefile lib/sqlite/Makefile lib/vers/Makefile lib/wind/Makefile po/Makefile kuser/Makefile kpasswd/Makefile kadmin/Makefile admin/Makefile kcm/Makefile kdc/Makefile appl/Makefile appl/afsutil/Makefile appl/dbutils/Makefile appl/gssmask/Makefile appl/otp/Makefile appl/su/Makefile appl/test/Makefile appl/kf/Makefile appl/dceutils/Makefile tests/Makefile tests/bin/Makefile tests/can/Makefile tests/db/Makefile tests/kdc/Makefile tests/ldap/Makefile tests/gss/Makefile tests/java/Makefile tests/plugin/Makefile packages/Makefile packages/mac/Makefile doc/Makefile tools/Makefile" cat >confcache <<\_ACEOF @@ -28588,8 +31033,8 @@ 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;} ;; + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( @@ -28619,19 +31064,30 @@ /^ac_cv_env_/b end t clear :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ 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 - test "x$cache_file" != "x/dev/null" && - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache @@ -28644,10 +31100,11 @@ 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"` + ac_i=`printf "%s\n" "$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" @@ -28658,6 +31115,14 @@ LTLIBOBJS=$ac_ltlibobjs +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' @@ -28667,184 +31132,200 @@ fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then - as_fn_error "conditional \"MAINTAINER_MODE\" was never defined. + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - as_fn_error "conditional \"AMDEP\" was never defined. + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then - as_fn_error "conditional \"am__fastdepCC\" was never defined. + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AIX_TRUE}" && test -z "${AIX_FALSE}"; then - as_fn_error "conditional \"AIX\" was never defined. + as_fn_error $? "conditional \"AIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AIX4_TRUE}" && test -z "${AIX4_FALSE}"; then - as_fn_error "conditional \"AIX4\" was never defined. + as_fn_error $? "conditional \"AIX4\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DLOPEN_TRUE}" && test -z "${HAVE_DLOPEN_FALSE}"; then - as_fn_error "conditional \"HAVE_DLOPEN\" was never defined. + as_fn_error $? "conditional \"HAVE_DLOPEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AIX_DYNAMIC_AFS_TRUE}" && test -z "${AIX_DYNAMIC_AFS_FALSE}"; then - as_fn_error "conditional \"AIX_DYNAMIC_AFS\" was never defined. + as_fn_error $? "conditional \"AIX_DYNAMIC_AFS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IRIX_TRUE}" && test -z "${IRIX_FALSE}"; then - as_fn_error "conditional \"IRIX\" was never defined. + as_fn_error $? "conditional \"IRIX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then - as_fn_error "conditional \"ENABLE_SHARED\" was never defined. + as_fn_error $? "conditional \"ENABLE_SHARED\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${versionscript_TRUE}" && test -z "${versionscript_FALSE}"; then - as_fn_error "conditional \"versionscript\" was never defined. + as_fn_error $? "conditional \"versionscript\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CROSS_COMPILE_TRUE}" && test -z "${CROSS_COMPILE_FALSE}"; then - as_fn_error "conditional \"CROSS_COMPILE\" was never defined. + as_fn_error $? "conditional \"CROSS_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OPENLDAP_MODULE_TRUE}" && test -z "${OPENLDAP_MODULE_FALSE}"; then - as_fn_error "conditional \"OPENLDAP_MODULE\" was never defined. + as_fn_error $? "conditional \"OPENLDAP_MODULE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${PKINIT_TRUE}" && test -z "${PKINIT_FALSE}"; then - as_fn_error "conditional \"PKINIT\" was never defined. + as_fn_error $? "conditional \"PKINIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_CAPNG_TRUE}" && test -z "${HAVE_CAPNG_FALSE}"; then - as_fn_error "conditional \"HAVE_CAPNG\" was never defined. + as_fn_error $? "conditional \"HAVE_CAPNG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${SQLITE3_TRUE}" && test -z "${SQLITE3_FALSE}"; then - as_fn_error "conditional \"SQLITE3\" was never defined. + as_fn_error $? "conditional \"SQLITE3\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_scc_TRUE}" && test -z "${have_scc_FALSE}"; then - as_fn_error "conditional \"have_scc\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${KRB4_TRUE}" && test -z "${KRB4_FALSE}"; then - as_fn_error "conditional \"KRB4\" was never defined. + as_fn_error $? "conditional \"have_scc\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${KRB5_TRUE}" && test -z "${KRB5_FALSE}"; then - as_fn_error "conditional \"KRB5\" was never defined. + as_fn_error $? "conditional \"KRB5\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${do_roken_rename_TRUE}" && test -z "${do_roken_rename_FALSE}"; then - as_fn_error "conditional \"do_roken_rename\" was never defined. + as_fn_error $? "conditional \"do_roken_rename\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_HCRYPTO_W_OPENSSL_TRUE}" && test -z "${HAVE_HCRYPTO_W_OPENSSL_FALSE}"; then + as_fn_error $? "conditional \"HAVE_HCRYPTO_W_OPENSSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${HAVE_OPENSSL_TRUE}" && test -z "${HAVE_OPENSSL_FALSE}"; then - as_fn_error "conditional \"HAVE_OPENSSL\" was never defined. +if test -z "${ENABLE_PTHREAD_SUPPORT_TRUE}" && test -z "${ENABLE_PTHREAD_SUPPORT_FALSE}"; then + as_fn_error $? "conditional \"ENABLE_PTHREAD_SUPPORT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DCE_TRUE}" && test -z "${DCE_FALSE}"; then - as_fn_error "conditional \"DCE\" was never defined. + as_fn_error $? "conditional \"DCE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${NO_AFS_TRUE}" && test -z "${NO_AFS_FALSE}"; then + as_fn_error $? "conditional \"NO_AFS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DB1_TRUE}" && test -z "${HAVE_DB1_FALSE}"; then - as_fn_error "conditional \"HAVE_DB1\" was never defined. + as_fn_error $? "conditional \"HAVE_DB1\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DB3_TRUE}" && test -z "${HAVE_DB3_FALSE}"; then - as_fn_error "conditional \"HAVE_DB3\" was never defined. + as_fn_error $? "conditional \"HAVE_DB3\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${HAVE_LMDB_TRUE}" && test -z "${HAVE_LMDB_FALSE}"; then + as_fn_error $? "conditional \"HAVE_LMDB\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_NDBM_TRUE}" && test -z "${HAVE_NDBM_FALSE}"; then - as_fn_error "conditional \"HAVE_NDBM\" was never defined. + as_fn_error $? "conditional \"HAVE_NDBM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DBHEADER_TRUE}" && test -z "${HAVE_DBHEADER_FALSE}"; then - as_fn_error "conditional \"HAVE_DBHEADER\" was never defined. + as_fn_error $? "conditional \"HAVE_DBHEADER\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DEVELOPER_MODE_TRUE}" && test -z "${DEVELOPER_MODE_FALSE}"; then + as_fn_error $? "conditional \"DEVELOPER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_err_h_TRUE}" && test -z "${have_err_h_FALSE}"; then - as_fn_error "conditional \"have_err_h\" was never defined. + as_fn_error $? "conditional \"have_err_h\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_ifaddrs_h_TRUE}" && test -z "${have_ifaddrs_h_FALSE}"; then - as_fn_error "conditional \"have_ifaddrs_h\" was never defined. + as_fn_error $? "conditional \"have_ifaddrs_h\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_search_h_TRUE}" && test -z "${have_search_h_FALSE}"; then - as_fn_error "conditional \"have_search_h\" was never defined. + as_fn_error $? "conditional \"have_search_h\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_vis_h_TRUE}" && test -z "${have_vis_h_FALSE}"; then - as_fn_error "conditional \"have_vis_h\" was never defined. + as_fn_error $? "conditional \"have_vis_h\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_glob_h_TRUE}" && test -z "${have_glob_h_FALSE}"; then - as_fn_error "conditional \"have_glob_h\" was never defined. + as_fn_error $? "conditional \"have_glob_h\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_cgetent_TRUE}" && test -z "${have_cgetent_FALSE}"; then - as_fn_error "conditional \"have_cgetent\" was never defined. + as_fn_error $? "conditional \"have_cgetent\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_fnmatch_h_TRUE}" && test -z "${have_fnmatch_h_FALSE}"; then - as_fn_error "conditional \"have_fnmatch_h\" was never defined. + as_fn_error $? "conditional \"have_fnmatch_h\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_socket_wrapper_TRUE}" && test -z "${have_socket_wrapper_FALSE}"; then - as_fn_error "conditional \"have_socket_wrapper\" was never defined. + as_fn_error $? "conditional \"have_socket_wrapper\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OTP_TRUE}" && test -z "${OTP_FALSE}"; then - as_fn_error "conditional \"OTP\" was never defined. + as_fn_error $? "conditional \"OTP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${have_gcd_TRUE}" && test -z "${have_gcd_FALSE}"; then - as_fn_error "conditional \"have_gcd\" was never defined. + as_fn_error $? "conditional \"have_gcd\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CATMAN_TRUE}" && test -z "${CATMAN_FALSE}"; then - as_fn_error "conditional \"CATMAN\" was never defined. -Usually this means the macro was only invoked conditionally." "$LINENO" 5 -fi -if test -z "${HAVE_X_TRUE}" && test -z "${HAVE_X_FALSE}"; then - as_fn_error "conditional \"HAVE_X\" was never defined. + as_fn_error $? "conditional \"CATMAN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -if test -z "${NEED_WRITEAUTH_TRUE}" && test -z "${NEED_WRITEAUTH_FALSE}"; then - as_fn_error "conditional \"NEED_WRITEAUTH\" was never defined. +if test -z "${HAVE_DLADDR_TRUE}" && test -z "${HAVE_DLADDR_FALSE}"; then + as_fn_error $? "conditional \"HAVE_DLADDR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${KCM_TRUE}" && test -z "${KCM_FALSE}"; then - as_fn_error "conditional \"KCM\" was never defined. + as_fn_error $? "conditional \"KCM\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${FRAMEWORK_SECURITY_TRUE}" && test -z "${FRAMEWORK_SECURITY_FALSE}"; then - as_fn_error "conditional \"FRAMEWORK_SECURITY\" was never defined. + as_fn_error $? "conditional \"FRAMEWORK_SECURITY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBEDIT_TRUE}" && test -z "${LIBEDIT_FALSE}"; then - as_fn_error "conditional \"LIBEDIT\" was never defined. + as_fn_error $? "conditional \"LIBEDIT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COM_ERR_TRUE}" && test -z "${COM_ERR_FALSE}"; then - as_fn_error "conditional \"COM_ERR\" was never defined. + as_fn_error $? "conditional \"COM_ERR\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${DEVELOPER_MODE_TRUE}" && test -z "${DEVELOPER_MODE_FALSE}"; then + as_fn_error $? "conditional \"DEVELOPER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HEIMDAL_DOCUMENTATION_TRUE}" && test -z "${HEIMDAL_DOCUMENTATION_FALSE}"; then - as_fn_error "conditional \"HEIMDAL_DOCUMENTATION\" was never defined. + as_fn_error $? "conditional \"HEIMDAL_DOCUMENTATION\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi -: ${CONFIG_STATUS=./config.status} +: "${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;} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL @@ -28867,14 +31348,16 @@ # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : +as_nop=: +if test ${ZSH_VERSION+y} && (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 +else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( @@ -28884,46 +31367,46 @@ fi + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. 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 +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then +if ${PATH_SEPARATOR+false} :; 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 || @@ -28932,22 +31415,20 @@ 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS @@ -28959,49 +31440,30 @@ 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 + printf "%s\n" "$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 ERROR [LINENO LOG_FD] -# --------------------------------- +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with status $?, using 1 if that was 0. +# script with STATUS, using 1 if that was 0. as_fn_error () { - as_status=$?; test $as_status -eq 0 && as_status=1 - if test "$3"; then - as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi - $as_echo "$as_me: error: $1" >&2 + printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error + # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. @@ -29028,18 +31490,20 @@ { 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 : +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 +else $as_nop as_fn_append () { eval $1=\$$1\$2 @@ -29051,12 +31515,13 @@ # 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 : +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : eval 'as_fn_arith () { as_val=$(( $* )) }' -else +else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` @@ -29087,7 +31552,7 @@ $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | +printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q @@ -29109,6 +31574,10 @@ as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) @@ -29122,6 +31591,12 @@ ECHO_N='-n';; esac +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file @@ -29135,16 +31610,16 @@ # ... 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 -p'. + # 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 -p' + as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi else - as_ln_s='cp -p' + as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null @@ -29163,7 +31638,7 @@ as_dirs= while :; do case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" @@ -29172,7 +31647,7 @@ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | +printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -29193,7 +31668,7 @@ test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p @@ -29204,28 +31679,16 @@ as_mkdir_p=false fi -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in #( - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x + +# 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'" @@ -29246,8 +31709,8 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Heimdal $as_me 1.5.2, which was -generated by GNU Autoconf 2.65. Invocation command line was +This file was extended by Heimdal $as_me 7.8.0, which was +generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -29306,17 +31769,19 @@ Configuration commands: $config_commands -Report bugs to ." +Report bugs to ." _ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -Heimdal config.status 1.5.2 -configured by $0, generated by GNU Autoconf 2.65, +Heimdal config.status 7.8.0 +configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" -Copyright (C) 2009 Free Software Foundation, Inc. +Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." @@ -29334,11 +31799,16 @@ 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 @@ -29351,37 +31821,38 @@ -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 ;; + printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; + printf "%s\n" "$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"` ;; + *\'*) ac_optarg=`printf "%s\n" "$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"` ;; + *\'*) ac_optarg=`printf "%s\n" "$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' + as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; + printf "%s\n" "$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' + -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" @@ -29401,9 +31872,9 @@ _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 + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" @@ -29417,7 +31888,7 @@ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX - $as_echo "$ac_log" + printf "%s\n" "$ac_log" } >&5 _ACEOF @@ -29425,7 +31896,7 @@ # # INIT-COMMANDS # -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout @@ -29439,10 +31910,15 @@ 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"`' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $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"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $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"`' @@ -29467,14 +31943,14 @@ 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"`' +FILECMD='`$ECHO "$FILECMD" | $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"`' +lt_ar_flags='`$ECHO "$lt_ar_flags" | $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"`' @@ -29489,10 +31965,13 @@ 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_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $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"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $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"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $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"`' @@ -29525,7 +32004,6 @@ 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_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $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"`' @@ -29558,7 +32036,8 @@ 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"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $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"`' @@ -29579,8 +32058,12 @@ } # Quote evaled strings. -for var in SHELL \ +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ ECHO \ +PATH_SEPARATOR \ SED \ GREP \ EGREP \ @@ -29591,15 +32074,13 @@ lt_SP2NL \ lt_NL2SP \ reload_flag \ -OBJDUMP \ +FILECMD \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ -DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ -AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ @@ -29608,9 +32089,12 @@ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ nm_file_list_spec \ +lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ @@ -29631,7 +32115,6 @@ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ -hardcode_libdir_flag_spec_ld \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ @@ -29646,7 +32129,7 @@ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -29673,10 +32156,11 @@ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; 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=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -29685,19 +32169,16 @@ 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 +# See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then +if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' @@ -29722,7 +32203,7 @@ "include/hcrypto/Makefile") CONFIG_FILES="$CONFIG_FILES include/hcrypto/Makefile" ;; "include/kadm5/Makefile") CONFIG_FILES="$CONFIG_FILES include/kadm5/Makefile" ;; "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; - "base/Makefile") CONFIG_FILES="$CONFIG_FILES base/Makefile" ;; + "lib/base/Makefile") CONFIG_FILES="$CONFIG_FILES lib/base/Makefile" ;; "lib/asn1/Makefile") CONFIG_FILES="$CONFIG_FILES lib/asn1/Makefile" ;; "lib/com_err/Makefile") CONFIG_FILES="$CONFIG_FILES lib/com_err/Makefile" ;; "lib/hcrypto/Makefile") CONFIG_FILES="$CONFIG_FILES lib/hcrypto/Makefile" ;; @@ -29750,24 +32231,10 @@ "kdc/Makefile") CONFIG_FILES="$CONFIG_FILES kdc/Makefile" ;; "appl/Makefile") CONFIG_FILES="$CONFIG_FILES appl/Makefile" ;; "appl/afsutil/Makefile") CONFIG_FILES="$CONFIG_FILES appl/afsutil/Makefile" ;; - "appl/ftp/Makefile") CONFIG_FILES="$CONFIG_FILES appl/ftp/Makefile" ;; - "appl/ftp/common/Makefile") CONFIG_FILES="$CONFIG_FILES appl/ftp/common/Makefile" ;; - "appl/ftp/ftp/Makefile") CONFIG_FILES="$CONFIG_FILES appl/ftp/ftp/Makefile" ;; - "appl/ftp/ftpd/Makefile") CONFIG_FILES="$CONFIG_FILES appl/ftp/ftpd/Makefile" ;; + "appl/dbutils/Makefile") CONFIG_FILES="$CONFIG_FILES appl/dbutils/Makefile" ;; "appl/gssmask/Makefile") CONFIG_FILES="$CONFIG_FILES appl/gssmask/Makefile" ;; - "appl/kx/Makefile") CONFIG_FILES="$CONFIG_FILES appl/kx/Makefile" ;; - "appl/login/Makefile") CONFIG_FILES="$CONFIG_FILES appl/login/Makefile" ;; "appl/otp/Makefile") CONFIG_FILES="$CONFIG_FILES appl/otp/Makefile" ;; - "appl/popper/Makefile") CONFIG_FILES="$CONFIG_FILES appl/popper/Makefile" ;; - "appl/push/Makefile") CONFIG_FILES="$CONFIG_FILES appl/push/Makefile" ;; - "appl/rsh/Makefile") CONFIG_FILES="$CONFIG_FILES appl/rsh/Makefile" ;; - "appl/rcp/Makefile") CONFIG_FILES="$CONFIG_FILES appl/rcp/Makefile" ;; "appl/su/Makefile") CONFIG_FILES="$CONFIG_FILES appl/su/Makefile" ;; - "appl/xnlock/Makefile") CONFIG_FILES="$CONFIG_FILES appl/xnlock/Makefile" ;; - "appl/telnet/Makefile") CONFIG_FILES="$CONFIG_FILES appl/telnet/Makefile" ;; - "appl/telnet/libtelnet/Makefile") CONFIG_FILES="$CONFIG_FILES appl/telnet/libtelnet/Makefile" ;; - "appl/telnet/telnet/Makefile") CONFIG_FILES="$CONFIG_FILES appl/telnet/telnet/Makefile" ;; - "appl/telnet/telnetd/Makefile") CONFIG_FILES="$CONFIG_FILES appl/telnet/telnetd/Makefile" ;; "appl/test/Makefile") CONFIG_FILES="$CONFIG_FILES appl/test/Makefile" ;; "appl/kf/Makefile") CONFIG_FILES="$CONFIG_FILES appl/kf/Makefile" ;; "appl/dceutils/Makefile") CONFIG_FILES="$CONFIG_FILES appl/dceutils/Makefile" ;; @@ -29785,7 +32252,7 @@ "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;; - *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -29795,9 +32262,9 @@ # 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 + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree @@ -29808,9 +32275,10 @@ # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= + tmp= ac_tmp= trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $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 } @@ -29818,12 +32286,13 @@ { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" + test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") -} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -29840,12 +32309,12 @@ fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\r' + ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$tmp/subs1.awk" && +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF @@ -29854,18 +32323,18 @@ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then - as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -29873,7 +32342,7 @@ rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -29921,7 +32390,7 @@ rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -29953,21 +32422,29 @@ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ - || as_fn_error "could not setup config files machinery" "$LINENO" 5 +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 $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// s/^[^=]*=[ ]*$// }' fi @@ -29979,7 +32456,7 @@ # 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 >"$tmp/defines.awk" <<\_ACAWK || +cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -29991,11 +32468,11 @@ # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then + 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 + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi @@ -30080,7 +32557,7 @@ _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - as_fn_error "could not setup config headers machinery" "$LINENO" 5 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" @@ -30093,7 +32570,7 @@ esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -30112,7 +32589,7 @@ for ac_f do case $ac_f in - -) ac_f="$tmp/stdin";; + -) 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 `:'. @@ -30121,9 +32598,9 @@ [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done @@ -30131,24 +32608,24 @@ # 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' + printf "%s\n" "$*" | 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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$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" | + ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -30158,7 +32635,7 @@ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | +printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -30182,9 +32659,9 @@ case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$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|/||'` + ac_top_builddir_sub=`printf "%s\n" "$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/ ;; @@ -30246,8 +32723,8 @@ 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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$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=' @@ -30284,23 +32761,24 @@ s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 +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' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -$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 "$tmp/stdin" + { 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"; } && + { printf "%s\n" "$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 +printf "%s\n" "$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 "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + -) 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 + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # @@ -30308,22 +32786,22 @@ # if test x"$ac_file" != x-; then { - $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then - { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 -$as_echo "$as_me: $ac_file is unchanged" >&6;} + printf "%s\n" "/* $configure_input */" >&1 \ + && 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ - || as_fn_error "could not create $ac_file" "$LINENO" 5 + 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 "$tmp/defines.awk"' "$ac_file_inputs" \ - || as_fn_error "could not create -" "$LINENO" 5 + printf "%s\n" "/* $configure_input */" >&1 \ + && 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" @@ -30341,7 +32819,7 @@ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$_am_arg" | +printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -30361,40 +32839,46 @@ 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;} + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$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 + # Older Autoconf 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 + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac shift - for mf + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_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 + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: 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 -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q @@ -30412,108 +32896,101 @@ 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"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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\(\/\/\)[^/].*/{ + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } - /^X\(\/\/\)$/{ + /^X\/\(\/\/\)$/{ s//\1/ q } - /^X\(\/\).*/{ + /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` - as_dir=$dirpart/$fdir; as_fn_mkdir_p - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk } ;; "libtool":C) - # See if we are running on zsh, and set the options which allow our + # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then + if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi - cfgfile="${ofile}T" + 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 +# Generated automatically by $as_me ($PACKAGE) $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. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 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 of the License, or +# (at your option) any later version. # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010 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. +# 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 +# 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. +# along with this program. If not, see . # The names of the tagged configurations supported by this script. -available_tags="" +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG @@ -30527,18 +33004,33 @@ # Whether or not to build static libraries. build_old_libs=$enable_static +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + # The host system. host_alias=$host_alias host=$host @@ -30594,8 +33086,8 @@ # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP +# A file(cmd) program that detects file types. +FILECMD=$lt_FILECMD # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method @@ -30609,17 +33101,17 @@ # 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 (by configure). +lt_ar_flags=$lt_ar_flags + # Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS +AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec @@ -30647,18 +33139,27 @@ # 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 into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + # 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 +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + # 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. +# The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + # The name of the directory that contains temporary libtool files. objdir=$objdir @@ -30749,8 +33250,11 @@ # 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 +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen @@ -30840,20 +33344,16 @@ # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec -# If ld is used when linking, flag to hardcode \$libdir into a binary -# during linking. This must work even if \$libdir does not exist. -hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld - # 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 +# 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 +# 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 +# "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute @@ -30903,6 +33403,65 @@ # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -30911,7 +33470,7 @@ # 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 +if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -30920,175 +33479,17 @@ esac -ltmain="$ac_aux_dir/ltmain.sh" + +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" \ + $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" @@ -31104,7 +33505,7 @@ ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || - as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. @@ -31125,7 +33526,7 @@ exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit $? + $ac_cs_success || as_fn_exit 1 fi # @@ -31167,7 +33568,7 @@ ;; *) case $ac_arg in - *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac @@ -31177,7 +33578,7 @@ # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in - *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" @@ -31198,17 +33599,17 @@ test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" - $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 - $as_echo "$ac_msg" >&6 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 + printf "%s\n" "$ac_msg" >&6 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|^\.[\\/]||'` + ac_dir_suffix=/`printf "%s\n" "$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|/||'` + ac_top_builddir_sub=`printf "%s\n" "$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/ ;; @@ -31238,17 +33639,15 @@ cd "$ac_dir" - # Check for guested configure; otherwise get Cygnus style configure. + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure - elif test -f "$ac_srcdir/configure.in"; then - # This should be Cygnus configure. - ac_sub_configure=$ac_aux_dir/configure else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 -$as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 +printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi @@ -31261,20 +33660,20 @@ ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac - { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 -$as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 +printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || - as_fn_error "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 + as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done 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;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi @@ -31284,7 +33683,7 @@ #define VERSION_HIDDEN #endif VERSION_HIDDEN const char *heimdal_long_version = "@(#)\$Version: $PACKAGE_STRING by @USER@ on @HOST@ ($host) @DATE@ \$"; -VERSION_HIDDEN const char *heimdal_version = "Heimdal 1.5.2"; +VERSION_HIDDEN const char *heimdal_version = "Heimdal 7.8.0"; EOF if test -f include/version.h && cmp -s include/newversion.h.in include/version.h.in; then @@ -31298,3 +33697,4 @@ mv -f include/newversion.h.in include/version.h.in sed -e "s/@USER@/$User/" -e "s/@HOST@/$Host/" -e "s/@DATE@/$Date/" include/version.h.in > include/version.h fi + diff --git a/crypto/heimdal/configure.ac b/crypto/heimdal/configure.ac new file mode 100644 --- /dev/null +++ b/crypto/heimdal/configure.ac @@ -0,0 +1,677 @@ +dnl Process this file with autoconf to produce a configure script. +AC_REVISION($Revision$) +AC_PREREQ(2.62) +test -z "$CFLAGS" && CFLAGS="-g" +AC_INIT([Heimdal],[7.8.0],[https://github.com/heimdal/heimdal/issues]) +AC_CONFIG_SRCDIR([kuser/kinit.c]) +AC_CONFIG_HEADERS(include/config.h) +AC_CONFIG_MACRO_DIR([cf]) + +AM_INIT_AUTOMAKE([foreign 1.11]) +AM_MAINTAINER_MODE + +LT_PREREQ([2.2]) +LT_INIT([shared static win32-dll]) + + +dnl Checks for programs. +AC_PROG_CC +AM_PROG_CC_C_O +AC_PROG_CPP +AM_PATH_PYTHON +AC_CHECK_PROG(CLANG_FORMAT, clang-format, [clang-format], [no]) + +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_PREFIX_DEFAULT(/usr/heimdal) + +test "$sysconfdir" = '${prefix}/etc' && sysconfdir='/etc' +test "$localstatedir" = '${prefix}/var' && localstatedir='/var/heimdal' + +AC_CANONICAL_HOST +CANONICAL_HOST=$host +AC_SUBST(CANONICAL_HOST) + +rk_SYS_LARGEFILE + +rk_AIX +rk_IRIX +rk_SUNOS + +dnl +dnl this is needed to run the configure tests against glibc +dnl +AC_DEFINE([_GNU_SOURCE], 1, + [Define to enable extensions on glibc-based systems such as Linux.]) + +AC_OBJEXT +AC_EXEEXT + +dnl +dnl this is needed when der-protos.h or der-private.h has to be generated +dnl +if ! test -f "$srcdir/lib/asn1/der-protos.h" || + ! test -f "$srcdir/lib/asn1/der-private.h"; then + AC_KRB_PROG_PERL + AC_KRB_PERL_MOD(Getopt::Std) + AC_KRB_PERL_MOD(File::Compare) + AC_KRB_PERL_MOD(JSON) +fi + +dnl AC_KRB_PROG_YACC +AC_PROG_YACC +AM_PROG_LEX +dnl AC_PROG_RANLIB +AC_PROG_AWK +AC_KRB_PROG_LN_S + +AC_MIPS_ABI +CC="$CC $abi" +libdir="$libdir$abilibdirext" + +AC_C___ATTRIBUTE__ + +AM_CONDITIONAL(ENABLE_SHARED, test "$enable_shared" = "yes") +rk_VERSIONSCRIPT + +dnl +dnl Helper bits for cross compiling +dnl + + + +AM_CONDITIONAL(CROSS_COMPILE, test "${cross_compiling}" = yes) + +AC_ARG_WITH(cross-tools, + AS_HELP_STRING([--with-cross-tools=dir], [use cross tools in dir]), + [if test "$withval" = "yes"; then + AC_MSG_ERROR([Need path to cross tools]) + fi + with_cross_tools="${with_cross_tools}/" + ]) + +if test "${cross_compiling}" != yes ; then + + ASN1_COMPILE="\$(top_builddir)/lib/asn1/asn1_compile\$(EXEEXT)" + SLC="\$(top_builddir)/lib/sl/slc" + + ASN1_COMPILE_DEP="\$(ASN1_COMPILE)" + SLC_DEP="\$(SLC)" +else + ASN1_COMPILE="${with_cross_tools}asn1_compile" + SLC="${with_cross_tools}slc" + + ASN1_COMPILE_DEP= + SLC_DEP= + + ac_cv_prog_COMPILE_ET=${with_cross_tools}compile_et + +fi + +AC_SUBST([ASN1_COMPILE]) +AC_SUBST([ASN1_COMPILE_DEP]) +AC_SUBST([SLC]) +AC_SUBST([SLC_DEP]) + +dnl --- + +AC_DEFINE(HEIM_WEAK_CRYPTO, 1, [Define if you want support for weak crypto]) + +rk_TEST_PACKAGE(openldap, +[#include +#include ], +[-lldap -llber],,,OPENLDAP) + +AC_ARG_ENABLE(hdb-openldap-module, + AS_HELP_STRING([--enable-hdb-openldap-module], + [if you want support to build openldap hdb as shared object])) +if test "$enable_hdb_openldap_module" = yes -a "$with_openldap" = yes; then + AC_DEFINE(OPENLDAP_MODULE, 1, [Define if you want support for hdb ldap module]) +fi +AM_CONDITIONAL(OPENLDAP_MODULE, test "$enable_hdb_openldap_module" = yes -a "$with_openldap" = yes) + +dnl +dnl Optional modules, pk-init, digest, kx509 +dnl + +AC_ARG_ENABLE(pk-init, + AS_HELP_STRING([--disable-pk-init], + [if you want disable to PK-INIT support])) +if test "$enable_pk_init" != no ;then + AC_DEFINE([PKINIT], 1, [Define to enable PKINIT.]) +fi +AM_CONDITIONAL(PKINIT, test "$enable_pk_init" != no) + +AC_ARG_ENABLE(digest, + AS_HELP_STRING([--disable-digest], + [if you want disable to DIGEST support])) +if test "$enable_digest" != no ;then + AC_DEFINE([DIGEST], 1, [Define to enable DIGEST.]) +fi + +AC_ARG_ENABLE(kx509, + AS_HELP_STRING([--disable-kx509], + [if you want disable to kx509 support])) +if test "$enable_kx509" != no ;then + AC_DEFINE([KX509], 1, [Define to enable kx509.]) +fi + +dnl Need to test if pkg-config exists +PKG_PROG_PKG_CONFIG + +dnl libcap-ng +AC_ARG_WITH([capng], + AC_HELP_STRING([--with-capng], [use libcap-ng to drop KDC privileges @<:@default=check@:>@]), + [], + [with_capng=check]) +if test "$with_capng" != "no"; then + PKG_CHECK_MODULES([CAPNG], [libcap-ng >= 0.4.0], + [with_capng=yes],[with_capng=no]) +fi +if test "$with_capng" = "yes"; then + AC_DEFINE_UNQUOTED([HAVE_CAPNG], 1, [whether capng is available for privilege reduction]) +fi +AM_CONDITIONAL([HAVE_CAPNG], [test "$with_capng" != "no"]) +AC_SUBST([CAPNG_CFLAGS]) +AC_SUBST([CAPNG_LIBS]) + +dnl Check for sqlite +rk_TEST_PACKAGE(sqlite3, +[#include +#ifndef SQLITE_OPEN_CREATE +#error "old version" +#endif], +[-lsqlite3],,,SQLITE3) + +if test "X$with_sqlite3" != Xyes ; then + INCLUDE_sqlite3="-I\$(top_srcdir)/lib/sqlite" + LIB_sqlite3="\$(top_builddir)/lib/sqlite/libheimsqlite.la" +fi +AM_CONDITIONAL(SQLITE3, test "X$with_sqlite3" = Xyes) + +AC_DEFINE(HAVE_SQLITE3, 1, [Define if you want support for sqlite in Heimdal.]) + +AC_ARG_ENABLE(sqlite-cache, + AS_HELP_STRING([--disable-sqlite-cache],[if you want support for cache in sqlite])) +if test "$enable_sqlite_cache" != no; then + AC_DEFINE(HAVE_SCC, 1, [Define if you want support for cache in sqlite.]) +fi +AM_CONDITIONAL(have_scc, test "$enable_sqlite_cache" != no) + + +dnl check for libintl +rk_TEST_PACKAGE(libintl, +[#include ], +[-lintl],,,LIBINTL) + +dnl path where the hdb directory is stored +AC_ARG_WITH([hdbdir], + [AS_HELP_STRING([--with-hdbdir],[Default location for KDC database @<:@default=/var/heimdal@:>@])], + [], + [with_hdbdir=/var/heimdal]) +DIR_hdbdir="$with_hdbdir" +AC_SUBST([DIR_hdbdir]) + + +AM_CONDITIONAL(KRB5, true) +AM_CONDITIONAL(do_roken_rename, true) + +AC_DEFINE(SUPPORT_INETD, 1, [Enable use of inetd style startup.])dnl + + +AC_DEFINE(KRB5, 1, [Enable Kerberos 5 support in applications.])dnl +AC_SUBST(LIB_kdb)dnl + +KRB_CRYPTO + +KRB_PTHREADS + +AC_ARG_ENABLE(dce, + AS_HELP_STRING([--enable-dce],[if you want support for DCE/DFS PAG's])) +if test "$enable_dce" = yes; then + AC_DEFINE(DCE, 1, [Define if you want support for DCE/DFS PAG's.]) +fi +AM_CONDITIONAL(DCE, test "$enable_dce" = yes) + +## XXX quite horrible: +if test -f /etc/ibmcxx.cfg; then + dpagaix_ldadd=`sed -n '/^xlc_r4/,/^$/p' /etc/ibmcxx.cfg | sed -n -e '/libraries/{;s/^[[^=]]*=\(.*\)/\1/;s/,/ /gp;}'` + dpagaix_cflags=`sed -n '/^xlc_r4/,/^$/p' /etc/ibmcxx.cfg | sed -n -e '/options/{;s/^[[^=]]*=\(.*\)/\1/;s/-q[^,]*//;s/,/ /gp;}'` + dpagaix_ldflags= +else + dpagaix_cflags="-D_THREAD_SAFE -D_AIX_PTHREADS_D7 -D_AIX32_THREADS=1 -D_AES_SOURCE -D_AIX41 -I/usr/include/dce" + dpagaix_ldadd="-L/usr/lib/threads -ldcelibc_r -ldcepthreads -lpthreads_compat lpthreads -lc_r" + dpagaix_ldflags="-Wl,-bI:dfspag.exp" +fi +AC_SUBST(dpagaix_cflags) +AC_SUBST(dpagaix_ldadd) +AC_SUBST(dpagaix_ldflags) + +AC_ARG_ENABLE([afs-support], + AS_HELP_STRING([--disable-afs-support],[if you don't want support for AFS])) +if test "$enable_afs_support" = no; then + AC_DEFINE(NO_AFS, 1, [Define if you don't wan't support for AFS.]) + NO_AFS="1" +fi +AC_SUBST(NO_AFS)dnl +AM_CONDITIONAL(NO_AFS, test "$enable_afs_support" = no) + +rk_DB + +dnl AC_ROKEN(10,[/usr/heimdal /usr/athena],[lib/roken],[$(top_builddir)/lib/roken/libroken.la],[-I$(top_builddir)/lib/roken -I$(top_srcdir)/lib/roken]) + +rk_ROKEN(lib/roken) +LIBADD_roken="$LIB_roken" +AC_SUBST(LIBADD_roken)dnl +LIB_roken="\$(top_builddir)/lib/vers/libvers.la $LIB_roken" + +rk_OTP + +rk_LIBDISPATCH + +AC_CHECK_OSFC2 + +AC_ARG_ENABLE(mmap, + AS_HELP_STRING([--disable-mmap],[disable use of mmap])) +if test "$enable_mmap" = "no"; then + AC_DEFINE(NO_MMAP, 1, [Define if you don't want to use mmap.]) +fi + +AC_ARG_ENABLE(afs-string-to-key, + AS_HELP_STRING([--disable-afs-string-to-key], + [disable use of weak AFS string-to-key functions]), + [], [enable_afs_string_to_key=yes]) + +if test "$enable_afs_string_to_key" = "yes"; then + AC_DEFINE(ENABLE_AFS_STRING_TO_KEY, 1, [Define if want to use the weak AFS string to key functions.]) + ENABLE_AFS_STRING_TO_KEY=1 +fi +AC_SUBST(ENABLE_AFS_STRING_TO_KEY)dnl + + +rk_CHECK_MAN + +rk_TEST_PACKAGE(readline, +[#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include +#endif +],-lreadline,,, READLINE,, [readline.h readline/readline.h]) + +rk_TEST_PACKAGE(libedit, +[#include +#if defined(HAVE_READLINE_READLINE_H) +#include +#elif defined(HAVE_READLINE_H) +#include +#elif defined(HAVE_EDITLINE_READLINE_H) +#include +#endif +],-ledit,,, READLINE,, [readline.h readline/readline.h editline/readline.h]) + +AC_CONFIG_SUBDIRS([lib/libedit]) + +KRB_C_BIGENDIAN +AC_C_INLINE + +dnl AM_C_PROTOTYPES + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_OFF_T +AC_CHECK_TYPE_EXTRA(mode_t, unsigned short, []) +AC_CHECK_TYPE_EXTRA(sig_atomic_t, int, [#include ]) +AC_HAVE_TYPE([long long]) +AC_HEADER_TIME +AC_STRUCT_TM + +dnl Checks for header files. +AC_HEADER_STDC + +AC_CHECK_HEADERS([\ + CommonCrypto/CommonDigest.h \ + CommonCrypto/CommonCryptor.h \ + arpa/telnet.h \ + bind/bitypes.h \ + bsdsetjmp.h \ + curses.h \ + dlfcn.h \ + execinfo.h \ + fnmatch.h \ + inttypes.h \ + io.h \ + libutil.h \ + limits.h \ + maillock.h \ + netgroup.h \ + netinet/in6_machtypes.h \ + netinet/tcp.h \ + pthread.h \ + pty.h \ + sac.h \ + sgtty.h \ + siad.h \ + signal.h \ + strings.h \ + stropts.h \ + sys/bitypes.h \ + sys/category.h \ + sys/file.h \ + sys/filio.h \ + sys/ioccom.h \ + sys/mman.h \ + sys/param.h \ + sys/pty.h \ + sys/ptyio.h \ + sys/select.h \ + sys/socket.h \ + sys/str_tty.h \ + sys/stream.h \ + sys/stropts.h \ + sys/syscall.h \ + sys/termio.h \ + sys/timeb.h \ + sys/times.h \ + sys/types.h \ + sys/un.h \ + locale.h \ + termcap.h \ + termio.h \ + termios.h \ + time.h \ + tmpdir.h \ + udb.h \ + util.h \ +]) + +dnl On Solaris 8 there's a compilation warning for term.h because +dnl it doesn't define `bool'. +AC_CHECK_HEADERS(term.h, , , -) + +dnl aix have asl.h (A/IX screen library) that we don't want +AC_CHECK_HEADERS(asl.h, , , [ +#include +#ifndef ASL_STRING_EMERG +#error ASL_STRING_EMERG missing +#endif]) + +AC_CHECK_HEADERS(net/if.h, , , [AC_INCLUDES_DEFAULT +#if HAVE_SYS_SOCKET_H +#include +#endif]) + +AC_CHECK_HEADERS(sys/ptyvar.h, , , [AC_INCLUDES_DEFAULT +#if HAVE_SYS_TTY_H +#include +#endif]) + +AC_CHECK_HEADERS(sys/strtty.h, , , [AC_INCLUDES_DEFAULT +#if HAVE_TERMIOS_H +#include +#endif +#if HAVE_SYS_STREAM_H +#include +#endif]) + +AC_CHECK_HEADERS(sys/ucred.h, , , [AC_INCLUDES_DEFAULT +#if HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_SYS_PARAM_H +#include +#endif]) + +AC_CHECK_HEADERS(security/pam_modules.h, , , [AC_INCLUDES_DEFAULT +#include +]) + +dnl export symbols +rk_WIN32_EXPORT(BUILD_KRB5_LIB, KRB5_LIB) +rk_WIN32_EXPORT(BUILD_ROKEN_LIB, ROKEN_LIB) +rk_WIN32_EXPORT(BUILD_GSSAPI_LIB, GSSAPI_LIB) + +dnl Checks for libraries. + +AC_FIND_FUNC_NO_LIBS(logwtmp, util,[ +#ifdef HAVE_UTIL_H +#include +#endif +],[0,0,0]) +AC_FIND_FUNC_NO_LIBS(logout, util,[ +#ifdef HAVE_UTIL_H +#include +#endif +],[0]) +AC_FIND_FUNC_NO_LIBS(openpty, util,[ +#ifdef HAVE_UTIL_H +#include +#endif +],[0,0,0,0,0]) + +AC_FIND_FUNC_NO_LIBS(tgetent, termcap ncurses curses,[ +#ifdef HAVE_TERMCAP_H +#include +#endif +#ifdef HAVE_CURSES_H +#include +#endif +],[0,0]) + +dnl Checks for library functions. + +AC_CHECK_FUNCS([ \ + _getpty \ + _scrsize \ + arc4random \ + backtrace \ + fcntl \ + fork \ + getpeereid \ + getpeerucred \ + grantpt \ + kill \ + mktime \ + ptsname \ + rand \ + revoke \ + select \ + setitimer \ + setpcred \ + setpgid \ + setproctitle \ + setregid \ + setresgid \ + setresuid \ + setreuid \ + setsid \ + setutent \ + sigaction \ + strstr \ + ttyname \ + ttyslot \ + umask \ + unlockpt \ + vhangup \ + waitpid \ + yp_get_default_domain \ +]) + +AC_MSG_CHECKING([checking for __sync_add_and_fetch]) +AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[unsigned int foo, bar; bar = __sync_add_and_fetch(&foo, 1);]])], + [ac_rk_have___sync_add_and_fetch=yes], [ac_rk_have___sync_add_and_fetch=no]) +if test "$ac_rk_have___sync_add_and_fetch" = "yes" ; then + AC_DEFINE_UNQUOTED(HAVE___SYNC_ADD_AND_FETCH, 1, [have __sync_add_and_fetch]) +fi +AC_MSG_RESULT($ac_rk_have___sync_add_and_fetch) + +AC_FUNC_MMAP + +KRB_CAPABILITIES +rk_DLADDR + +AC_CHECK_GETPWNAM_R_POSIX + +dnl detect doors on solaris +if test "$enable_pthread_support" != no; then + saved_LIBS="$LIBS" + LIBS="$LIBS $PTHREADS_LIBS" + AC_FIND_FUNC_NO_LIBS(door_create, door) + LIBS="$saved_LIBS" +fi + +AC_ARG_ENABLE(kcm, + AS_HELP_STRING([--enable-kcm],[enable Kerberos Credentials Manager]), +,[enable_kcm=yes]) + +if test "$enable_kcm" = yes ; then + if test "$ac_cv_header_sys_un_h" != yes -a "$ac_cv_funclib_door_create" != yes ; then + enable_kcm=no + fi +fi +if test "$enable_kcm" = yes; then + AC_DEFINE(HAVE_KCM, 1, + [Define if you want to use the Kerberos Credentials Manager.]) +fi +AM_CONDITIONAL(KCM, test "$enable_kcm" = yes) + + + +dnl Cray stuff +AC_CHECK_FUNCS(getudbnam setlim) + +dnl AC_KRB_FUNC_GETCWD_BROKEN + +AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, + u_int8_t, u_int16_t, u_int32_t, u_int64_t, + uint8_t, uint16_t, uint32_t, uint64_t],,,[ +#ifdef HAVE_INTTYPES_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_BITYPES_H +#include +#endif +#ifdef HAVE_BIND_BITYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN6_MACHTYPES_H +#include +#endif +]) + +rk_FRAMEWORK_SECURITY + +KRB_READLINE + +rk_TELNET + +dnl Some operating systems already have com_err and compile_et +CHECK_COMPILE_ET + +rk_AUTH_MODULES([sia afskauthlib]) + +rk_DESTDIRS + +rk_WFLAGS([-Wall -Wmissing-prototypes -Wpointer-arith -Wbad-function-cast -Wmissing-declarations -Wnested-externs]) + + +AH_BOTTOM([#ifdef __APPLE__ +#include +#endif]) + +AH_BOTTOM([#ifdef ROKEN_RENAME +#include "roken_rename.h" +#endif]) + +AC_ARG_ENABLE(heimdal-documentation, + AS_HELP_STRING([--disable-heimdal-documentation], + [if you want disable to heimdal documentation])) +AM_CONDITIONAL(HEIMDAL_DOCUMENTATION, test "$enable_heimdal_documentation" != no) + +AC_CONFIG_FILES(Makefile \ + etc/Makefile \ + include/Makefile \ + include/gssapi/Makefile \ + include/hcrypto/Makefile \ + include/kadm5/Makefile \ + lib/Makefile \ + lib/base/Makefile \ + lib/asn1/Makefile \ + lib/com_err/Makefile \ + lib/hcrypto/Makefile \ + lib/hx509/Makefile \ + lib/gssapi/Makefile \ + lib/ntlm/Makefile \ + lib/hdb/Makefile \ + lib/ipc/Makefile \ + lib/kadm5/Makefile \ + lib/kafs/Makefile \ + lib/kdfs/Makefile \ + lib/krb5/Makefile \ + lib/otp/Makefile \ + lib/roken/Makefile \ + lib/sl/Makefile \ + lib/sqlite/Makefile \ + lib/vers/Makefile \ + lib/wind/Makefile \ + po/Makefile \ + kuser/Makefile \ + kpasswd/Makefile \ + kadmin/Makefile \ + admin/Makefile \ + kcm/Makefile \ + kdc/Makefile \ + appl/Makefile \ + appl/afsutil/Makefile \ + appl/dbutils/Makefile \ + appl/gssmask/Makefile \ + appl/otp/Makefile \ + appl/su/Makefile \ + appl/test/Makefile \ + appl/kf/Makefile \ + appl/dceutils/Makefile \ + tests/Makefile \ + tests/bin/Makefile \ + tests/can/Makefile \ + tests/db/Makefile \ + tests/kdc/Makefile \ + tests/ldap/Makefile \ + tests/gss/Makefile \ + tests/java/Makefile \ + tests/plugin/Makefile \ + packages/Makefile \ + packages/mac/Makefile \ + doc/Makefile \ + tools/Makefile \ +) + +AC_OUTPUT + +dnl +dnl This is the release version name-number[beta] +dnl + +cat > include/newversion.h.in </dev/null | sed 1q` + Date=`date` + mv -f include/newversion.h.in include/version.h.in + sed -e "s/@USER@/$User/" -e "s/@HOST@/$Host/" -e "s/@DATE@/$Date/" include/version.h.in > include/version.h +fi diff --git a/crypto/heimdal/depcomp b/crypto/heimdal/depcomp new file mode 100755 --- /dev/null +++ b/crypto/heimdal/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# 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 + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +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 -ne 0; then + 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 -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # 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. +## 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. + tr ' ' "$nl" < "$tmpdepfile" \ + | 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 -ne 0; then + 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 + make_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. + set_dir_from "$object" + set_base_from "$object" + 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 -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$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 ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + 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 + rmdir '$lockdir' + exit 1 + " 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. + rmdir "$lockdir" + break + else + # If 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. + set_dir_from "$object" + set_base_from "$object" + 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 -ne 0; then + 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,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_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. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool 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$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +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 -ne 0; then + 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" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + 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" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | 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" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | 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 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/crypto/heimdal/doc/Makefile.am b/crypto/heimdal/doc/Makefile.am --- a/crypto/heimdal/doc/Makefile.am +++ b/crypto/heimdal/doc/Makefile.am @@ -24,6 +24,11 @@ chmod +x hdb.dxy.tmp mv hdb.dxy.tmp hdb.dxy +base.dxy: base.din Makefile + $(dxy_subst) < $(srcdir)/base.din > base.dxy.tmp + chmod +x base.dxy.tmp + mv base.dxy.tmp base.dxy + hx509.dxy: hx509.din Makefile $(dxy_subst) < $(srcdir)/hx509.din > hx509.dxy.tmp chmod +x hx509.dxy.tmp @@ -50,6 +55,7 @@ mv wind.dxy.tmp wind.dxy texi_subst = sed -e 's,[@]dbdir[@],$(localstatedir),g' \ + -e 's,[@]dbtype[@],$(db_type),g' \ -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' vars.texi: vars.tin Makefile @@ -57,16 +63,24 @@ chmod +x vars.texi.tmp mv vars.texi.tmp vars.texi -PROJECTS = hcrypto hdb hx509 gssapi krb5 ntlm wind +PROJECTS = base hdb hx509 gssapi krb5 ntlm wind + +PROJECTS += hcrypto -doxyout doxygen: hdb.dxy hx509.dxy hcrypto.dxy gssapi.dxy krb5.dxy ntlm.dxy wind.dxy - @find $(srcdir)/doxyout -type d ! -perm -200 -exec chmod u+w {} ';' ; \ +doxyout doxygen: base.dxy hdb.dxy hx509.dxy hcrypto.dxy gssapi.dxy krb5.dxy ntlm.dxy wind.dxy + @test -d $(srcdir)/doxyout && \ + find $(srcdir)/doxyout -type d ! -perm -200 -exec chmod u+w {} ';' ; \ rm -rf $(srcdir)/doxyout ; \ mkdir $(srcdir)/doxyout ; \ for a in $(PROJECTS) ; do \ echo $$a ; \ doxygen $$a.dxy; \ - (cd $(srcdir)/doxyout && find $$a/man -type f > $$a/manpages ) ; \ + (cd $(srcdir)/doxyout && \ + find $$a/man -name '_*' -type f -print | \ + perl -lne unlink && \ + find $$a/html -name 'dir_*.html' -type f -print | \ + perl -lne unlink && \ + find $$a/man -type f > $$a/manpages ) ; \ done install-data-hook: install-doxygen-manpage @@ -123,6 +137,7 @@ hcrypto.din \ header.html \ heimdal.css \ + base.din \ hx509.din \ krb5.din \ ntlm.din \ @@ -131,10 +146,14 @@ layman.asc \ doxytmpl.dxy \ wind.din \ + base.hhp \ + heimdal.hhp \ + hx509.hhp \ vars.tin CLEANFILES = \ hcrypto.dxy* \ + base.dxy* \ hx509.dxy* \ hdb.dxy* \ gssapi.dxy* \ diff --git a/crypto/heimdal/doc/Makefile.in b/crypto/heimdal/doc/Makefile.in --- a/crypto/heimdal/doc/Makefile.in +++ b/crypto/heimdal/doc/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,14 +93,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(heimdal_TEXINFOS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common mdate-sh subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -57,8 +107,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -71,6 +120,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -90,12 +140,53 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = SOURCES = DIST_SOURCES = +AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) +am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) +am__v_DVIPS_0 = @echo " DVIPS " $@; +am__v_DVIPS_1 = +AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) +am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) +am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; +am__v_MAKEINFO_1 = +AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) +am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) +am__v_INFOHTML_0 = @echo " INFOHTML" $@; +am__v_INFOHTML_1 = +AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) +am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) +am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; +am__v_TEXI2DVI_1 = +AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) +am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) +am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; +am__v_TEXI2PDF_1 = +AM_V_texinfo = $(am__v_texinfo_@AM_V@) +am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) +am__v_texinfo_0 = -q +am__v_texinfo_1 = +AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) +am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) +am__v_texidevnull_0 = > /dev/null +am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/heimdal.info $(srcdir)/hx509.info am__TEXINFO_TEX_DIR = $(srcdir) DVIS = heimdal.dvi hx509.dvi @@ -107,6 +198,11 @@ MAKEINFOHTML = $(MAKEINFO) --html AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) DVIPS = dvips +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac am__installdirs = "$(DESTDIR)$(infodir)" am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ @@ -129,11 +225,23 @@ 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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(heimdal_TEXINFOS) $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common mdate-sh DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -148,16 +256,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -167,17 +278,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -196,12 +309,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -210,6 +320,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -226,10 +337,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -237,6 +346,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -251,12 +361,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -273,10 +386,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -287,13 +406,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -317,6 +430,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -340,9 +455,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -352,29 +472,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; AUTOMAKE_OPTIONS = no-texinfo.tex MAKEINFOFLAGS = --css-include=$(srcdir)/heimdal.css TEXI2DVI = true # ARGH, make distcheck can't be disabled to not build dvifiles @@ -384,9 +512,10 @@ -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' texi_subst = sed -e 's,[@]dbdir[@],$(localstatedir),g' \ + -e 's,[@]dbtype[@],$(db_type),g' \ -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' -PROJECTS = hcrypto hdb hx509 gssapi krb5 ntlm wind +PROJECTS = base hdb hx509 gssapi krb5 ntlm wind hcrypto heimdal_TEXINFOS = \ ack.texi \ apps.texi \ @@ -412,6 +541,7 @@ hcrypto.din \ header.html \ heimdal.css \ + base.din \ hx509.din \ krb5.din \ ntlm.din \ @@ -420,10 +550,14 @@ layman.asc \ doxytmpl.dxy \ wind.din \ + base.hhp \ + heimdal.hhp \ + hx509.hhp \ vars.tin CLEANFILES = \ hcrypto.dxy* \ + base.dxy* \ hx509.dxy* \ hdb.dxy* \ gssapi.dxy* \ @@ -435,7 +569,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .dvi .html .info .pdf .ps .texi +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .dvi .html .info .pdf .ps .texi $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -448,15 +582,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -474,7 +608,7 @@ -rm -rf .libs _libs .texi.info: - restore=: && backupdir="$(am__leading_dot)am$$$$" && \ + $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ @@ -496,27 +630,25 @@ rm -rf $$backupdir; exit $$rc .texi.dvi: - TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ - $(TEXI2DVI) $< + $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ + $< .texi.pdf: - TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ - $(TEXI2PDF) $< + $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ + $< .texi.html: - rm -rf $(@:.html=.htp) - if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) + $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ - rm -rf $@; \ - if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ - mv $(@:.html=) $@; else mv $(@:.html=.htp) $@; fi; \ + rm -rf $@ && mv $(@:.html=.htp) $@; \ else \ - if test ! -d $(@:.html=.htp) && test -d $(@:.html=); then \ - rm -rf $(@:.html=); else rm -Rf $(@:.html=.htp) $@; fi; \ - exit 1; \ + rm -rf $(@:.html=.htp); exit 1; \ fi $(srcdir)/heimdal.info: heimdal.texi $(heimdal_TEXINFOS) heimdal.dvi: heimdal.texi $(heimdal_TEXINFOS) @@ -527,8 +659,8 @@ hx509.pdf: hx509.texi hx509.html: hx509.texi .dvi.ps: - TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ - $(DVIPS) -o $@ $< + $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @@ -550,9 +682,7 @@ uninstall-info-am: @$(PRE_UNINSTALL) - @if test -d '$(DESTDIR)$(infodir)' && \ - (install-info --version && \ - install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ @@ -609,12 +739,7 @@ done mostlyclean-aminfo: - -rm -rf heimdal.aux heimdal.cp heimdal.cps heimdal.fn heimdal.fns \ - heimdal.ky heimdal.kys heimdal.log heimdal.pg heimdal.tmp \ - heimdal.toc heimdal.tp heimdal.tps heimdal.vr heimdal.vrs \ - hx509.aux hx509.cp hx509.cps hx509.fn hx509.fns hx509.ky \ - hx509.kys hx509.log hx509.pg hx509.tmp hx509.toc hx509.tp \ - hx509.tps hx509.vr hx509.vrs + -rm -rf heimdal.t2d heimdal.t2p hx509.t2d hx509.t2p clean-aminfo: -test -z "heimdal.dvi heimdal.pdf heimdal.ps heimdal.html hx509.dvi hx509.pdf \ @@ -628,14 +753,16 @@ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done -tags: TAGS -TAGS: +tags TAGS: -ctags: CTAGS -CTAGS: +ctags CTAGS: +cscope cscopelist: -distdir: $(DISTFILES) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -686,10 +813,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -729,8 +861,11 @@ install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) - test -z "$(dvidir)" || $(MKDIR_P) "$(DESTDIR)$(dvidir)" @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -739,25 +874,28 @@ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: $(HTMLS) @$(NORMAL_INSTALL) - test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ - if test -d "$$d$$p"; then \ + d2=$$d$$p; \ + if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ - echo " $(INSTALL_DATA) '$$d$$p'/* '$(DESTDIR)$(htmldir)/$$f'"; \ - $(INSTALL_DATA) "$$d$$p"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ + echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ + $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ - list2="$$list2 $$d$$p"; \ + list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ @@ -769,9 +907,12 @@ install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) - test -z "$(infodir)" || $(MKDIR_P) "$(DESTDIR)$(infodir)" @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ + fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ @@ -789,8 +930,7 @@ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) - @if (install-info --version && \ - install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ @@ -804,8 +944,11 @@ install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) - test -z "$(pdfdir)" || $(MKDIR_P) "$(DESTDIR)$(pdfdir)" @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -817,8 +960,11 @@ install-ps-am: $(PSS) @$(NORMAL_INSTALL) - test -z "$(psdir)" || $(MKDIR_P) "$(DESTDIR)$(psdir)" @list='$(PSS)'; test -n "$(psdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -850,40 +996,54 @@ uninstall-pdf-am uninstall-ps-am @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am .PHONY: all all-am all-local check check-am check-local clean \ - clean-aminfo clean-generic clean-libtool dist-hook dist-info \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - 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-aminfo \ + clean-aminfo clean-generic clean-libtool cscopelist-am \ + ctags-am dist-hook dist-info distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook 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-aminfo \ maintainer-clean-generic mostlyclean mostlyclean-aminfo \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-dvi-am uninstall-hook \ + tags-am uninstall uninstall-am uninstall-dvi-am uninstall-hook \ uninstall-html-am uninstall-info-am uninstall-pdf-am \ uninstall-ps-am +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -891,7 +1051,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -936,11 +1096,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -948,6 +1117,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -990,6 +1161,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1003,13 +1187,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1050,6 +1234,11 @@ chmod +x hdb.dxy.tmp mv hdb.dxy.tmp hdb.dxy +base.dxy: base.din Makefile + $(dxy_subst) < $(srcdir)/base.din > base.dxy.tmp + chmod +x base.dxy.tmp + mv base.dxy.tmp base.dxy + hx509.dxy: hx509.din Makefile $(dxy_subst) < $(srcdir)/hx509.din > hx509.dxy.tmp chmod +x hx509.dxy.tmp @@ -1080,14 +1269,20 @@ chmod +x vars.texi.tmp mv vars.texi.tmp vars.texi -doxyout doxygen: hdb.dxy hx509.dxy hcrypto.dxy gssapi.dxy krb5.dxy ntlm.dxy wind.dxy - @find $(srcdir)/doxyout -type d ! -perm -200 -exec chmod u+w {} ';' ; \ +doxyout doxygen: base.dxy hdb.dxy hx509.dxy hcrypto.dxy gssapi.dxy krb5.dxy ntlm.dxy wind.dxy + @test -d $(srcdir)/doxyout && \ + find $(srcdir)/doxyout -type d ! -perm -200 -exec chmod u+w {} ';' ; \ rm -rf $(srcdir)/doxyout ; \ mkdir $(srcdir)/doxyout ; \ for a in $(PROJECTS) ; do \ echo $$a ; \ doxygen $$a.dxy; \ - (cd $(srcdir)/doxyout && find $$a/man -type f > $$a/manpages ) ; \ + (cd $(srcdir)/doxyout && \ + find $$a/man -name '_*' -type f -print | \ + perl -lne unlink && \ + find $$a/html -name 'dir_*.html' -type f -print | \ + perl -lne unlink && \ + find $$a/man -type f > $$a/manpages ) ; \ done install-data-hook: install-doxygen-manpage diff --git a/crypto/heimdal/doc/NTMakefile b/crypto/heimdal/doc/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/NTMakefile @@ -0,0 +1,126 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=doc + +!include ../windows/NTMakefile.w32 + +heimdal_TEXINFOS = \ + $(OBJ)\ack.texi \ + $(OBJ)\apps.texi \ + $(OBJ)\copyright.texi \ + $(OBJ)\heimdal.texi \ + $(OBJ)\install.texi \ + $(OBJ)\intro.texi \ + $(OBJ)\kerberos4.texi \ + $(OBJ)\migration.texi \ + $(OBJ)\misc.texi \ + $(OBJ)\programming.texi \ + $(OBJ)\setup.texi \ + $(OBJ)\vars.texi \ + $(OBJ)\whatis.texi \ + $(OBJ)\win2k.texi + +hx509_TEXINFOS = \ + $(OBJ)\hx509.texi + +{}.texi{$(OBJ)}.texi: + $(CP) $** $@ + +{}.tin{$(OBJ)}.texi: + $(SED) -e "s,[@]dbdir[@],x,g" \ + -e "s,[@]dbtype[@],sqlite,g" < $** > $@ \ + -e "s,[@]PACKAGE_VERSION[@],$(VER_PACKAGE_VERSION),g" < $** > $@ + +MAKEINFOFLAGS = --css-include=$(SRCDIR)/heimdal.css + +!ifdef APPVEYOR +MAKEINFO = $(PERL) C:\msys64\usr\bin\makeinfo +!endif + +###################################################################### +# Build heimdal.chm + +# Copyrights-and-Licenses.html is where the table of contents ends up +# when generating HTML output using makeinfo. Same goes for +# How-to-use-the-PKCS11-module.html below. + +$(OBJ)\heimdal\index.html $(OBJ)\heimdal\Copyrights-and-Licenses.html: $(heimdal_TEXINFOS) + cd $(OBJ) + $(MAKEINFO) $(MAKEINFOFLAGS) --html heimdal.texi + -$(MKDIR) heimdal + cd $(SRCDIR) + +$(OBJ)\heimdal\toc.hhc: $(OBJ)\heimdal\Copyrights-and-Licenses.html + $(PERL) $(SRC)\cf\w32-hh-toc-from-info.pl -o$@ $** + +$(OBJ)\heimdal\heimdal.hhp: heimdal.hhp + $(CP) $** $@ + +$(DOCDIR)\heimdal.chm: $(OBJ)\heimdal\heimdal.hhp $(OBJ)\heimdal\toc.hhc + cd $(OBJ)\heimdal + -$(HHC) heimdal.hhp + $(CP) heimdal.chm $@ + cd $(SRCDIR) + +###################################################################### +# Build hx509.chm + +$(OBJ)\hx509\index.html $(OBJ)\hx509\How-to-use-the-PKCS11-module.html: $(hx509_TEXINFOS) + cd $(OBJ) + $(MAKEINFO) $(MAKEINFOFLAGS) --html hx509.texi + -$(MKDIR) hx509 + cd $(SRCDIR) + +$(OBJ)\hx509\toc.hhc: $(OBJ)\hx509\How-to-use-the-PKCS11-module.html + $(PERL) $(SRC)\cf\w32-hh-toc-from-info.pl -o$@ $** + +$(OBJ)\hx509\hx509.hhp: hx509.hhp + $(CP) $** $@ + +$(DOCDIR)\hx509.chm: $(OBJ)\hx509\hx509.hhp $(OBJ)\hx509\toc.hhc + cd $(OBJ)\hx509 + -$(HHC) hx509.hhp + $(CP) hx509.chm $@ + cd $(SRCDIR) + +!ifndef NO_DOC +all:: $(OBJ)\heimdal\index.html $(OBJ)\hx509\index.html \ + $(DOCDIR)\heimdal.chm $(DOCDIR)\hx509.chm +!endif + +clean:: + -$(RM) $(OBJ)\heimdal\*.* + -$(RM) $(OBJ)\hx509\*.* + -$(RM) $(DOCDIR)\heimdal.chm + -$(RM) $(DOCDIR)\hx509.chm + +.SUFFIXES: .texi .tin diff --git a/crypto/heimdal/doc/ack.texi b/crypto/heimdal/doc/ack.texi --- a/crypto/heimdal/doc/ack.texi +++ b/crypto/heimdal/doc/ack.texi @@ -1,5 +1,3 @@ -@c $Id$ - @node Acknowledgments, Copyrights and Licenses, Migration, Top @comment node-name, next, previous, up @appendix Acknowledgments @@ -77,6 +75,7 @@ @item Johan Gadsjö @item Johan Ihrén @item John Center +@item Julian Ospald @item Jun-ichiro itojun Hagino @item KAMADA Ken'ichi @item Kamen Mazdrashki @@ -114,6 +113,7 @@ @item Simon Wilkinson @item Stefan Metzmacher @item Ted Percival +@item Timothy Pearson @item Tom Payerle @item Victor Guerra @item Zeqing Xia diff --git a/crypto/heimdal/doc/base.hhp b/crypto/heimdal/doc/base.hhp new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/base.hhp @@ -0,0 +1,8 @@ +[OPTIONS] +Compatibility=1.1 or later +Compiled file=heimbase.chm +Contents file=toc.hhc +Default topic=index.html +Display compile progress=No +Language=0x409 English (United States) +Title=Heimdal Base diff --git a/crypto/heimdal/doc/base.din b/crypto/heimdal/doc/base.din new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/base.din @@ -0,0 +1,15 @@ +# Doxyfile 1.5.3 + +PROJECT_NAME = Heimdal base library +PROJECT_NUMBER = @PACKAGE_VERSION@ +OUTPUT_DIRECTORY = @srcdir@/doxyout/base +INPUT = @srcdir@/../lib/base + +WARN_IF_UNDOCUMENTED = YES + +PERL_PATH = /usr/bin/perl + +HTML_HEADER = "@srcdir@/header.html" +HTML_FOOTER = "@srcdir@/footer.html" + +@INCLUDE = "@srcdir@/doxytmpl.dxy" diff --git a/crypto/heimdal/doc/copyright.texi b/crypto/heimdal/doc/copyright.texi --- a/crypto/heimdal/doc/copyright.texi +++ b/crypto/heimdal/doc/copyright.texi @@ -217,6 +217,9 @@ @verbatim Copyright (c) 2003-2011, PADL Software Pty Ltd. +Copyright (c) 2004, Andrew Bartlett. +Copyright (c) 2003 - 2008, Kungliga Tekniska Högskolan +Copyright (c) 2015, Timothy Pearson. All rights reserved. Redistribution and use in source and binary forms, with or without @@ -443,7 +446,7 @@ @verbatim -Copyright (c) 2009, Secure Endpoints Inc. +Copyright (c) 2009-2015, Secure Endpoints Inc. All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/crypto/heimdal/doc/doxyout/base/html/bc_s.png b/crypto/heimdal/doc/doxyout/base/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/base/html/dynsections.js b/crypto/heimdal/doc/doxyout/base/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ + +Graph Legend + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Graph Legend
    +
    +
    +

    This page explains how to interpret the graphs that are generated by doxygen.

    +

    Consider the following example:

    /*! Invisible class because of truncation */
    +
    class Invisible { };
    +
    +
    /*! Truncated class, inheritance relation is hidden */
    +
    class Truncated : public Invisible { };
    +
    +
    /* Class not documented with doxygen comments */
    +
    class Undocumented { };
    +
    +
    /*! Class that is inherited using public inheritance */
    +
    class PublicBase : public Truncated { };
    +
    +
    /*! A template class */
    +
    template<class T> class Templ { };
    +
    +
    /*! Class that is inherited using protected inheritance */
    +
    class ProtectedBase { };
    +
    +
    /*! Class that is inherited using private inheritance */
    +
    class PrivateBase { };
    +
    +
    /*! Class that is used by the Inherited class */
    +
    class Used { };
    +
    +
    /*! Super class that inherits a number of other classes */
    +
    class Inherited : public PublicBase,
    +
    protected ProtectedBase,
    +
    private PrivateBase,
    +
    public Undocumented,
    +
    public Templ<int>
    +
    {
    +
    private:
    +
    Used *m_usedClass;
    +
    };
    +

    This will result in the following graph:

    +

    The boxes in the above graph have the following meaning:

    +
      +
    • +A filled gray box represents the struct or class for which the graph is generated.
    • +
    • +A box with a black border denotes a documented struct or class.
    • +
    • +A box with a gray border denotes an undocumented struct or class.
    • +
    • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
    • +
    +

    The arrows have the following meaning:

    +
      +
    • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
    • +
    • +A dark green arrow is used for protected inheritance.
    • +
    • +A dark red arrow is used for private inheritance.
    • +
    • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
    • +
    • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
    • +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal base library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/base/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/base/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/base/html/graph_legend.png b/crypto/heimdal/doc/doxyout/base/html/graph_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 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 + +Heimbase + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Heimbase
    +
    +
    + +

    Registers a DB type for use with heim_db_create(). +

    +

    Registers a DB type for use with heim_db_create().

    +

    heim_db_register

    +
    Parameters
    + + + + +
    dbtypeName of DB type
    dataPrivate data argument to the dbtype's openf method
    pluginStructure with DB type methods (function pointers)
    +
    +
    +

    Backends that provide begin/commit/rollback methods must provide ACID semantics.

    +

    The registered DB type will have ACID semantics for backends that do not provide begin/commit/rollback methods but do provide lock/unlock and rdjournal/wrjournal methods (using a replay log journalling scheme).

    +

    If the registered DB type does not natively provide read vs. write transaction isolation but does provide a lock method then the DB will provide read/write transaction isolation.

    +
    Returns
    ENOMEM on failure, else 0.
    +

    Open a database of the given dbtype.

    +

    Database type names can be composed of one or more pseudo-DB types and one concrete DB type joined with a '+' between each. For example: "transaction+bdb" might be a Berkeley DB with a layer above that provides transactions.

    +

    Options may be provided via a dict (an associative array). Existing options include:

    +
      +
    • "create", with any value (create if DB doesn't exist)
    • +
    • "exclusive", with any value (exclusive create)
    • +
    • "truncate", with any value (truncate the DB)
    • +
    • "read-only", with any value (disallow writes)
    • +
    • "sync", with any value (make transactions durable)
    • +
    • "journal-name", with a string value naming a journal file name
    • +
    +
    Parameters
    + + + + + + +
    dbtypeName of DB type
    dbnameName of DB (likely a file path)
    optionsOptions dict
    dbOutput open DB handle
    errorOutput error object
    +
    +
    +
    Returns
    a DB handle
    +

    Clone (duplicate) an open DB handle.

    +

    This is useful for multi-threaded applications. Applications must synchronize access to any given DB handle.

    +

    Returns EBUSY if there is an open transaction for the input db.

    +
    Parameters
    + + + +
    dbOpen DB handle
    errorOutput error object
    +
    +
    +
    Returns
    a DB handle
    +

    Open a transaction on the given db.

    +
    Parameters
    + + + +
    dbOpen DB handle
    errorOutput error object
    +
    +
    +
    Returns
    0 on success, system error otherwise
    +

    Commit an open transaction on the given db.

    +
    Parameters
    + + + +
    dbOpen DB handle
    errorOutput error object
    +
    +
    +
    Returns
    0 on success, system error otherwise
    +

    Rollback an open transaction on the given db.

    +
    Parameters
    + + + +
    dbOpen DB handle
    errorOutput error object
    +
    +
    +
    Returns
    0 on success, system error otherwise
    +

    Get type ID of heim_db_t objects.

    +

    Lookup a key's value in the DB.

    +

    Returns 0 on success, -1 if the key does not exist in the DB, or a system error number on failure.

    +
    Parameters
    + + + + +
    dbOpen DB handle
    keyKey
    errorOutput error object
    +
    +
    +
    Returns
    the value (retained), if there is one for the given key
    +

    Set a key's value in the DB.

    +
    Parameters
    + + + + + +
    dbOpen DB handle
    keyKey
    valueValue (if NULL the key will be deleted, but empty is OK)
    errorOutput error object
    +
    +
    +
    Returns
    0 on success, system error otherwise
    +

    Delete a key and its value from the DB

    +
    Parameters
    + + + + +
    dbOpen DB handle
    keyKey
    errorOutput error object
    +
    +
    +
    Returns
    0 on success, system error otherwise
    +

    Iterate a callback function over keys and values from a DB.

    +
    Parameters
    + + + + + +
    dbOpen DB handle
    iter_dataCallback function's private data
    iter_fCallback function, called once per-key/value pair
    errorOutput error object
    +
    +
    +

    Get a node in a heim_object tree by path

    +
    Parameters
    + + + + +
    ptrtree
    errorerror (output)
    apNULL-terminated va_list of heim_object_ts that form a path
    +
    +
    +
    Returns
    object (not retained) if found
    +

    Get a node in a tree by path, with retained reference

    +
    Parameters
    + + + + +
    ptrtree
    errorerror (output)
    apNULL-terminated va_list of heim_object_ts that form a path
    +
    +
    +
    Returns
    retained object if found
    +

    Get a node in a tree by path

    +
    Parameters
    + + + + +
    ptrtree
    errorerror (output)
    ...NULL-terminated va_list of heim_object_ts that form a path
    +
    +
    +
    Returns
    object (not retained) if found
    +

    Get a node in a tree by path, with retained reference

    +
    Parameters
    + + + + +
    ptrtree
    errorerror (output)
    ...NULL-terminated va_list of heim_object_ts that form a path
    +
    +
    +
    Returns
    retained object if found
    +

    Create a path in a heim_object_t tree

    +
    Parameters
    + + + + + + +
    ptrthe tree
    sizethe size of the heim_dict_t nodes to be created
    leafleaf node to be added, if any
    errorerror (output)
    apNULL-terminated of path component objects
    +
    +
    +

    Create a path of heim_dict_t interior nodes in a given heim_object_t tree, as necessary, and set/replace a leaf, if given (if leaf is NULL then the leaf is not deleted).

    +
    Returns
    0 on success, else a system error
    +

    Create a path in a heim_object_t tree

    +
    Parameters
    + + + + + + +
    ptrthe tree
    sizethe size of the heim_dict_t nodes to be created
    leafleaf node to be added, if any
    errorerror (output)
    ...NULL-terminated list of path component objects
    +
    +
    +

    Create a path of heim_dict_t interior nodes in a given heim_object_t tree, as necessary, and set/replace a leaf, if given (if leaf is NULL then the leaf is not deleted).

    +
    Returns
    0 on success, else a system error
    +

    Delete leaf node named by a path in a heim_object_t tree

    +
    Parameters
    + + + + +
    ptrthe tree
    errorerror (output)
    apNULL-terminated list of path component objects
    +
    +
    +

    Dump a heimbase object to stderr (useful from the debugger!)

    +
    Parameters
    + + +
    objobject to dump using JSON or JSON-like format
    +
    +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal base library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/base/html/index.html b/crypto/heimdal/doc/doxyout/base/html/index.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/html/index.html @@ -0,0 +1,31 @@ + + +Main Page + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Heimdal base library Documentation
    +
    +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal base library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/base/html/jquery.js b/crypto/heimdal/doc/doxyout/base/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/base/html/menu.js b/crypto/heimdal/doc/doxyout/base/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/base/html/menudata.js b/crypto/heimdal/doc/doxyout/base/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/html/menudata.js @@ -0,0 +1,27 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Modules",url:"modules.html"}]} diff --git a/crypto/heimdal/doc/doxyout/base/html/modules.html b/crypto/heimdal/doc/doxyout/base/html/modules.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/html/modules.html @@ -0,0 +1,36 @@ + + +Modules + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Modules
    +
    +
    +
    Here is a list of all modules:
    + + +
     HeimbaseRegisters a DB type for use with heim_db_create()
    +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal base library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/base/html/nav_f.png b/crypto/heimdal/doc/doxyout/base/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/base/man/man3/heimbase.3 b/crypto/heimdal/doc/doxyout/base/man/man3/heimbase.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/man/man3/heimbase.3 @@ -0,0 +1,332 @@ +.TH "heimbase" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal base library" \" -*- nroff -*- +.ad l +.nh +.SH NAME +heimbase \- Heimbase +.PP + \- Registers a DB type for use with heim_db_create()\&. + +.SH SYNOPSIS +.br +.PP +.SH "Detailed Description" +.PP +Registers a DB type for use with heim_db_create()\&. + +heim_db_register +.PP +\fBParameters\fP +.RS 4 +\fIdbtype\fP Name of DB type +.br +\fIdata\fP Private data argument to the dbtype's openf method +.br +\fIplugin\fP Structure with DB type methods (function pointers) +.RE +.PP +Backends that provide begin/commit/rollback methods must provide ACID semantics\&. +.PP +The registered DB type will have ACID semantics for backends that do not provide begin/commit/rollback methods but do provide lock/unlock and rdjournal/wrjournal methods (using a replay log journalling scheme)\&. +.PP +If the registered DB type does not natively provide read vs\&. write transaction isolation but does provide a lock method then the DB will provide read/write transaction isolation\&. +.PP +\fBReturns\fP +.RS 4 +ENOMEM on failure, else 0\&. +.RE +.PP +Open a database of the given dbtype\&. +.PP +Database type names can be composed of one or more pseudo-DB types and one concrete DB type joined with a '+' between each\&. For example: 'transaction+bdb' might be a Berkeley DB with a layer above that provides transactions\&. +.PP +Options may be provided via a dict (an associative array)\&. Existing options include: +.PP +.IP "\(bu" 2 +'create', with any value (create if DB doesn't exist) +.IP "\(bu" 2 +'exclusive', with any value (exclusive create) +.IP "\(bu" 2 +'truncate', with any value (truncate the DB) +.IP "\(bu" 2 +'read-only', with any value (disallow writes) +.IP "\(bu" 2 +'sync', with any value (make transactions durable) +.IP "\(bu" 2 +'journal-name', with a string value naming a journal file name +.PP +.PP +\fBParameters\fP +.RS 4 +\fIdbtype\fP Name of DB type +.br +\fIdbname\fP Name of DB (likely a file path) +.br +\fIoptions\fP Options dict +.br +\fIdb\fP Output open DB handle +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +a DB handle +.RE +.PP +Clone (duplicate) an open DB handle\&. +.PP +This is useful for multi-threaded applications\&. Applications must synchronize access to any given DB handle\&. +.PP +Returns EBUSY if there is an open transaction for the input db\&. +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +a DB handle +.RE +.PP +Open a transaction on the given db\&. +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +0 on success, system error otherwise +.RE +.PP +Commit an open transaction on the given db\&. +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +0 on success, system error otherwise +.RE +.PP +Rollback an open transaction on the given db\&. +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +0 on success, system error otherwise +.RE +.PP +Get type ID of heim_db_t objects\&. +.PP +Lookup a key's value in the DB\&. +.PP +Returns 0 on success, -1 if the key does not exist in the DB, or a system error number on failure\&. +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIkey\fP Key +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +the value (retained), if there is one for the given key +.RE +.PP +Set a key's value in the DB\&. +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIkey\fP Key +.br +\fIvalue\fP Value (if NULL the key will be deleted, but empty is OK) +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +0 on success, system error otherwise +.RE +.PP +Delete a key and its value from the DB +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIkey\fP Key +.br +\fIerror\fP Output error object +.RE +.PP +\fBReturns\fP +.RS 4 +0 on success, system error otherwise +.RE +.PP +Iterate a callback function over keys and values from a DB\&. +.PP +\fBParameters\fP +.RS 4 +\fIdb\fP Open DB handle +.br +\fIiter_data\fP Callback function's private data +.br +\fIiter_f\fP Callback function, called once per-key/value pair +.br +\fIerror\fP Output error object +.RE +.PP +Get a node in a heim_object tree by path +.PP +\fBParameters\fP +.RS 4 +\fIptr\fP tree +.br +\fIerror\fP error (output) +.br +\fIap\fP NULL-terminated va_list of heim_object_ts that form a path +.RE +.PP +\fBReturns\fP +.RS 4 +object (not retained) if found +.RE +.PP +Get a node in a tree by path, with retained reference +.PP +\fBParameters\fP +.RS 4 +\fIptr\fP tree +.br +\fIerror\fP error (output) +.br +\fIap\fP NULL-terminated va_list of heim_object_ts that form a path +.RE +.PP +\fBReturns\fP +.RS 4 +retained object if found +.RE +.PP +Get a node in a tree by path +.PP +\fBParameters\fP +.RS 4 +\fIptr\fP tree +.br +\fIerror\fP error (output) +.br +\fI\&.\&.\&.\fP NULL-terminated va_list of heim_object_ts that form a path +.RE +.PP +\fBReturns\fP +.RS 4 +object (not retained) if found +.RE +.PP +Get a node in a tree by path, with retained reference +.PP +\fBParameters\fP +.RS 4 +\fIptr\fP tree +.br +\fIerror\fP error (output) +.br +\fI\&.\&.\&.\fP NULL-terminated va_list of heim_object_ts that form a path +.RE +.PP +\fBReturns\fP +.RS 4 +retained object if found +.RE +.PP +Create a path in a heim_object_t tree +.PP +\fBParameters\fP +.RS 4 +\fIptr\fP the tree +.br +\fIsize\fP the size of the heim_dict_t nodes to be created +.br +\fIleaf\fP leaf node to be added, if any +.br +\fIerror\fP error (output) +.br +\fIap\fP NULL-terminated of path component objects +.RE +.PP +Create a path of heim_dict_t interior nodes in a given heim_object_t tree, as necessary, and set/replace a leaf, if given (if leaf is NULL then the leaf is not deleted)\&. +.PP +\fBReturns\fP +.RS 4 +0 on success, else a system error +.RE +.PP +Create a path in a heim_object_t tree +.PP +\fBParameters\fP +.RS 4 +\fIptr\fP the tree +.br +\fIsize\fP the size of the heim_dict_t nodes to be created +.br +\fIleaf\fP leaf node to be added, if any +.br +\fIerror\fP error (output) +.br +\fI\&.\&.\&.\fP NULL-terminated list of path component objects +.RE +.PP +Create a path of heim_dict_t interior nodes in a given heim_object_t tree, as necessary, and set/replace a leaf, if given (if leaf is NULL then the leaf is not deleted)\&. +.PP +\fBReturns\fP +.RS 4 +0 on success, else a system error +.RE +.PP +Delete leaf node named by a path in a heim_object_t tree +.PP +\fBParameters\fP +.RS 4 +\fIptr\fP the tree +.br +\fIerror\fP error (output) +.br +\fIap\fP NULL-terminated list of path component objects +.RE +.PP +Dump a heimbase object to stderr (useful from the debugger!) +.PP +\fBParameters\fP +.RS 4 +\fIobj\fP object to dump using JSON or JSON-like format +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal base library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/base/manpages b/crypto/heimdal/doc/doxyout/base/manpages new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/base/manpages @@ -0,0 +1 @@ +base/man/man3/heimbase.3 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/bc_s.png b/crypto/heimdal/doc/doxyout/gssapi/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ h3 { - margin-top: 0; +form.search { + margin-bottom: 0px; + margin-top: 0px; } -.directory p { - margin: 0px; - white-space: nowrap; + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.directory div { - display: none; - margin: 0px; +*/ + +td.tiny { + font-size: 75%; } -.directory img { - vertical-align: -30%; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; } -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; + +th.dirtab { + background: #EBEFF6; + font-weight: bold; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; } -.directory-alt > h3 { - margin-top: 0; + +hr.footer { + height: 1px; } -.directory-alt p { - margin: 0px; - white-space: nowrap; + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; } -.directory-alt div { - display: none; - margin: 0px; + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -.directory-alt img { - vertical-align: -30%; + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; } diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/doxygen.png b/crypto/heimdal/doc/doxyout/gssapi/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tWI!7t@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`JY+|Kdr`d2-(ONuKA& z`@F5@iWMozvyuS-DJG-A!lRSFxj4eVTQ(O*ctC5l23a*NCT zUiG#bpmlC>)R3lz>e?DhO|`RWYpkY-Cv7yZvX=1p<>y~3vO1$fzhC-nV)3CLCmz1P@7CUvliZQpfu5;zp}ugqdu(jz*|T4tKK*%e@vB3o8?nX)G7YEO} zIVfR(?xMlF^f}`rl|s?m#rLFbqVx`xSj&_q(VMc@fTHZh}z-v68l% zry~x%T5iHj^14oBx^J>s?RnyD8<0POU=9lDQOGMB@Qv5Y7jCfG%j{AmV#TMGW1QMw zT#YF!z0x)@dY88&9zIW5@|0`{T~(%oEz)4CmbgKz&?JXM8PbTlGzy_abLK5`U0uI5 zjHCu-UX^?f&14ZFEI#m4m6HGb+pWe9G)EL9oc;V4^!AHAWY)_-0Wh%dA!_pW~AM2 zHZ{sky{TsvhxSG}|Kjt>YpOaDZqKGo-`}a-o=bjEydHSUR%_RxG>Ry*<{c88MP&ug zrltyHjJ>p!JX%>=hAAW0nBi-?hEq>Uc@@s%X-yA@MfsACeNgoN1A!3a_MdBcK263R zpQruAi4!wj!sVHNOf2y}FSc#gM1Zq3XU`YH3(W_aJO(H}DNQ%LguU8tiV}RK z`!2|z88ZfI8$CN%7oV-phP3SL?84r>l*~_CMZ$)pGy< diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/doxygen.svg b/crypto/heimdal/doc/doxyout/gssapi/html/doxygen.svg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/dynsections.js b/crypto/heimdal/doc/doxyout/gssapi/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ -HeimdalGSS-APIlibrary: Graph Legend +Graph Legend @@ -8,68 +8,71 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Graph Legend
    +
    -

    Graph Legend

    This page explains how to interpret the graphs that are generated by doxygen.

    -Consider the following example:

    /*! Invisible class because of truncation */
    -class Invisible { };
    -
    -/*! Truncated class, inheritance relation is hidden */
    -class Truncated : public Invisible { };
    -
    -/* Class not documented with doxygen comments */
    -class Undocumented { };
    -
    -/*! Class that is inherited using public inheritance */
    -class PublicBase : public Truncated { };
    -
    -/*! A template class */
    -template<class T> class Templ { };
    -
    -/*! Class that is inherited using protected inheritance */
    -class ProtectedBase { };
    -
    -/*! Class that is inherited using private inheritance */
    -class PrivateBase { };
    -
    -/*! Class that is used by the Inherited class */
    -class Used { };
    -
    -/*! Super class that inherits a number of other classes */
    -class Inherited : public PublicBase,
    -                  protected ProtectedBase,
    -                  private PrivateBase,
    -                  public Undocumented,
    -                  public Templ<int>
    -{
    -  private:
    -    Used *m_usedClass;
    -};
    -
    If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

    -

    -graph_legend.png -
    -

    -The boxes in the above graph have the following meaning:

      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      +
      class Invisible { };
      +
      +
      /*! Truncated class, inheritance relation is hidden */
      +
      class Truncated : public Invisible { };
      +
      +
      /* Class not documented with doxygen comments */
      +
      class Undocumented { };
      +
      +
      /*! Class that is inherited using public inheritance */
      +
      class PublicBase : public Truncated { };
      +
      +
      /*! A template class */
      +
      template<class T> class Templ { };
      +
      +
      /*! Class that is inherited using protected inheritance */
      +
      class ProtectedBase { };
      +
      +
      /*! Class that is inherited using private inheritance */
      +
      class PrivateBase { };
      +
      +
      /*! Class that is used by the Inherited class */
      +
      class Used { };
      +
      +
      /*! Super class that inherits a number of other classes */
      +
      class Inherited : public PublicBase,
      +
      protected ProtectedBase,
      +
      private PrivateBase,
      +
      public Undocumented,
      +
      public Templ<int>
      +
      {
      +
      private:
      +
      Used *m_usedClass;
      +
      };
      +

      This will result in the following graph:

      +

      The boxes in the above graph have the following meaning:

      +
      • A filled gray box represents the struct or class for which the graph is generated.
      • A box with a black border denotes a documented struct or class.
      • -A box with a grey border denotes an undocumented struct or class.
      • +A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -The arrows have the following meaning:
        +

        The arrows have the following meaning:

        +
        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • @@ -77,12 +80,12 @@
        • A dark red arrow is used for private inheritance.
        • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
        • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
        -
    +
    -Generated on Wed Jan 11 14:07:44 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.dot b/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.dot deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G -{ - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.png b/crypto/heimdal/doc/doxyout/gssapi/html/graph_legend.png index 9b96937bfd5f7a36ea8dbf2d64ed1bc0768f074d..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 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 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/group__gssapi.html b/crypto/heimdal/doc/doxyout/gssapi/html/group__gssapi.html --- a/crypto/heimdal/doc/doxyout/gssapi/html/group__gssapi.html +++ b/crypto/heimdal/doc/doxyout/gssapi/html/group__gssapi.html @@ -1,6 +1,6 @@ -HeimdalGSS-APIlibrary: Heimdal GSS-API functions +Heimdal GSS-API functions @@ -8,885 +8,1002 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal GSS-API functions
    +
    -

    Heimdal GSS-API functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_add_oid_set_member (OM_uint32 *minor_status, const gss_OID member_oid, gss_OID_set *oid_set)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_wrap_iov (OM_uint32 *minor_status, gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, int *conf_state, gss_iov_buffer_desc *iov, int iov_count)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_unwrap_iov (OM_uint32 *minor_status, gss_ctx_id_t context_handle, int *conf_state, gss_qop_t *qop_state, gss_iov_buffer_desc *iov, int iov_count)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_wrap_iov_length (OM_uint32 *minor_status, gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, int *conf_state, gss_iov_buffer_desc *iov, int iov_count)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_release_iov_buffer (OM_uint32 *minor_status, gss_iov_buffer_desc *iov, int iov_count)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_canonicalize_name (OM_uint32 *minor_status, const gss_name_t input_name, const gss_OID mech_type, gss_name_t *output_name)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_import_name (OM_uint32 *minor_status, const gss_buffer_t input_name_buffer, const gss_OID input_name_type, gss_name_t *output_name)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_init_sec_context (OM_uint32 *minor_status, const gss_cred_id_t initiator_cred_handle, gss_ctx_id_t *context_handle, const gss_name_t target_name, const gss_OID input_mech_type, OM_uint32 req_flags, OM_uint32 time_req, const gss_channel_bindings_t input_chan_bindings, const gss_buffer_t input_token, gss_OID *actual_mech_type, gss_buffer_t output_token, OM_uint32 *ret_flags, OM_uint32 *time_rec)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_inquire_saslname_for_mech (OM_uint32 *minor_status, const gss_OID desired_mech, gss_buffer_t sasl_mech_name, gss_buffer_t mech_name, gss_buffer_t mech_description)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_inquire_attrs_for_mech (OM_uint32 *minor_status, gss_const_OID mech, gss_OID_set *mech_attr, gss_OID_set *known_mech_attrs)
    GSSAPI_LIB_FUNCTION int
    -GSSAPI_LIB_CALL 
    gss_oid_equal (gss_const_OID a, gss_const_OID b)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_release_cred (OM_uint32 *minor_status, gss_cred_id_t *cred_handle)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_release_name (OM_uint32 *minor_status, gss_name_t *input_name)
    GSSAPI_LIB_FUNCTION OM_uint32
    -GSSAPI_LIB_CALL 
    gss_wrap (OM_uint32 *minor_status, const gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, int *conf_state, gss_buffer_t output_message_buffer)

    Variables

    gss_OID_desc GSSAPI_LIB_FUNCTION __gss_c_attr_stream_sizes_oid_desc
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_oid_set_member (OM_uint32 *minor_status, const gss_OID member_oid, gss_OID_set *oid_set)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov (OM_uint32 *minor_status, gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, int *conf_state, gss_iov_buffer_desc *iov, int iov_count)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_unwrap_iov (OM_uint32 *minor_status, gss_ctx_id_t context_handle, int *conf_state, gss_qop_t *qop_state, gss_iov_buffer_desc *iov, int iov_count)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov_length (OM_uint32 *minor_status, gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, int *conf_state, gss_iov_buffer_desc *iov, int iov_count)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_iov_buffer (OM_uint32 *minor_status, gss_iov_buffer_desc *iov, int iov_count)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_canonicalize_name (OM_uint32 *minor_status, gss_const_name_t input_name, const gss_OID mech_type, gss_name_t *output_name)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_display_status (OM_uint32 *minor_status, OM_uint32 status_value, int status_type, const gss_OID mech_type, OM_uint32 *message_context, gss_buffer_t status_string)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_export_name (OM_uint32 *minor_status, gss_const_name_t input_name, gss_buffer_t exported_name)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_import_name (OM_uint32 *minor_status, const gss_buffer_t input_name_buffer, const gss_OID input_name_type, gss_name_t *output_name)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_init_sec_context (OM_uint32 *minor_status, gss_const_cred_id_t initiator_cred_handle, gss_ctx_id_t *context_handle, gss_const_name_t target_name, const gss_OID input_mech_type, OM_uint32 req_flags, OM_uint32 time_req, const gss_channel_bindings_t input_chan_bindings, const gss_buffer_t input_token, gss_OID *actual_mech_type, gss_buffer_t output_token, OM_uint32 *ret_flags, OM_uint32 *time_rec)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_saslname_for_mech (OM_uint32 *minor_status, const gss_OID desired_mech, gss_buffer_t sasl_mech_name, gss_buffer_t mech_name, gss_buffer_t mech_description)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_attrs_for_mech (OM_uint32 *minor_status, gss_const_OID mech, gss_OID_set *mech_attr, gss_OID_set *known_mech_attrs)
     
    GSSAPI_LIB_FUNCTION int GSSAPI_LIB_CALL gss_oid_equal (gss_const_OID a, gss_const_OID b)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_cred (OM_uint32 *minor_status, gss_cred_id_t *cred_handle)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_name (OM_uint32 *minor_status, gss_name_t *input_name)
     
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap (OM_uint32 *minor_status, gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, int *conf_state, gss_buffer_t output_message_buffer)
     
    + + +

    +Variables

    gss_OID_desc GSSAPI_LIB_FUNCTION __gss_c_attr_stream_sizes_oid_desc
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ gss_add_oid_set_member()

    +
    - + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_oid_set_member GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_oid_set_member (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    const gss_OID  member_oid, const gss_OID member_oid,
    gss_OID_set *  oid_set gss_OID_set * oid_set 
    )
    +
    +

    Add a oid to the oid set, function does not make a copy of the oid, so the pointer to member_oid needs to be stable for the whole time oid_set is used.

    +

    If there is a duplicate member of the oid, the new member is not added to to the set.

    +
    Parameters
    + + + + +
    minor_statusminor status code.
    member_oidmember to add to the oid set
    oid_setoid set to add the member too
    +
    +
    +
    Returns
    a gss_error code, see gss_display_status() about printing the error code.
    + +
    -
    + +

    ◆ gss_canonicalize_name()

    -

    -Add a oid to the oid set, function does not make a copy of the oid, so the pointer to member_oid needs to be stable for the whole time oid_set is used.

    -If there is a duplicate member of the oid, the new member is not added to to the set.

    -

    Parameters:
    - - - - +
    +
    +
    minor_status minor status code.
    member_oid member to add to the oid set
    oid_set oid set to add the member too
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_canonicalize_name (OM_uint32 * minor_status,
    gss_const_name_t input_name,
    const gss_OID mech_type,
    gss_name_t * output_name 
    )
    +
    +

    gss_canonicalize_name takes a Internal Name (IN) and converts in into a mechanism specific Mechanism Name (MN).

    +

    The input name may multiple name, or generic name types.

    +

    If the input_name if of the GSS_C_NT_USER_NAME, and the Kerberos mechanism is specified, the resulting MN type is a GSS_KRB5_NT_PRINCIPAL_NAME.

    +

    For more information about Internal names and mechanism names.

    +
    Parameters
    + + + + +
    minor_statusminor status code.
    input_namename to covert, unchanged by gss_canonicalize_name().
    mech_typethe type to convert Name too.
    output_namethe resulting type, release with gss_release_name(), independent of input_name.
    +
    -
    Returns:
    a gss_error code, see gss_display_status() about printing the error code.
    +
    Returns
    a gss_error code, see gss_display_status() about printing the error code.
    -

    - + + +

    ◆ gss_display_status()

    +
    - + - - + + - - + + - - + + - - + + + + + + + + + + + + + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_canonicalize_name GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_display_status (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    const gss_name_t  input_name, OM_uint32 status_value,
    const gss_OID  mech_type, int status_type,
    gss_name_t *  output_name const gss_OID mech_type,
    OM_uint32 * message_context,
    gss_buffer_t status_string 
    )
    +
    +

    Convert a GSS-API status code to text

    +
    Parameters
    + + + + + + + +
    minor_statusminor status code
    status_valuestatus value to convert
    status_typeOne of: GSS_C_GSS_CODE - status_value is a GSS status code, GSS_C_MECH_CODE - status_value is a mechanism status code
    mech_typeunderlying mechanism. Use GSS_C_NO_OID to obtain the system default.
    message_contextstate information to extract further messages from the status_value
    status_stringthe allocated text representation. Release with gss_release_buffer()
    +
    +
    +
    Returns
    a gss_error code.
    + +
    -
    + +

    ◆ gss_export_name()

    -

    -gss_canonicalize_name takes a Internal Name (IN) and converts in into a mechanism specific Mechanism Name (MN).

    -The input name may multiple name, or generic name types.

    -If the input_name if of the GSS_C_NT_USER_NAME, and the Kerberos mechanism is specified, the resulting MN type is a GSS_KRB5_NT_PRINCIPAL_NAME.

    -For more information about internalVSmechname.

    -

    Parameters:
    - - - - - +
    +
    +
    minor_status minor status code.
    input_name name to covert, unchanged by gss_canonicalize_name().
    mech_type the type to convert Name too.
    output_name the resulting type, release with gss_release_name(), independent of input_name.
    + + + + + + + + + + + + + + + + + + + + + + + +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_export_name (OM_uint32 * minor_status,
    gss_const_name_t input_name,
    gss_buffer_t exported_name 
    )
    +
    +

    Convert a GGS-API name from internal form to contiguous string.

    +
    See also
    gss_import_name(), Internal names and mechanism names.
    +
    Parameters
    + + + +
    minor_statusminor status code
    input_nameinput name in internal name form
    exported_nameoutput name in contiguos string form
    +
    -
    Returns:
    a gss_error code, see gss_display_status() about printing the error code.
    +
    Returns
    a gss_error code, see gss_display_status() about printing the error code.
    -

    - + + +

    ◆ gss_import_name()

    +
    - + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_import_name GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_import_name (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    const gss_buffer_t  input_name_buffer, const gss_buffer_t input_name_buffer,
    const gss_OID  input_name_type, const gss_OID input_name_type,
    gss_name_t *  output_name gss_name_t * output_name 
    )
    -
    -
    - -

    -Import a name internal or mechanism name

    -Type of name and their format:

      -
    • GSS_C_NO_OID
    • GSS_C_NT_USER_NAME
    • GSS_C_NT_HOSTBASED_SERVICE
    • GSS_C_NT_EXPORT_NAME
    • GSS_C_NT_ANONYMOUS
    • GSS_KRB5_NT_PRINCIPAL_NAME
    -

    -For more information about internalVSmechname.

    -

    Parameters:
    - - - - - +
    +

    Convert a GGS-API name from contiguous string to internal form.

    +

    Type of name and their format:

      +
    • GSS_C_NO_OID
    • +
    • GSS_C_NT_USER_NAME
    • +
    • GSS_C_NT_HOSTBASED_SERVICE
    • +
    • GSS_C_NT_EXPORT_NAME
    • +
    • GSS_C_NT_ANONYMOUS
    • +
    • GSS_KRB5_NT_PRINCIPAL_NAME
    • +
    +
    See also
    gss_export_name(), Internal names and mechanism names.
    +
    Parameters
    +
    minor_status minor status code
    input_name_buffer import name buffer
    input_name_type type of the import name buffer
    output_name the resulting type, release with gss_release_name(), independent of input_name
    + + + +
    minor_statusminor status code
    input_name_bufferimport name buffer
    input_name_typetype of the import name buffer
    output_namethe resulting type, release with gss_release_name(), independent of input_name
    +
    -
    Returns:
    a gss_error code, see gss_display_status() about printing the error code.
    +
    Returns
    a gss_error code, see gss_display_status() about printing the error code.
    -

    - + + +

    ◆ gss_init_sec_context()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_init_sec_context GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_init_sec_context (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    const gss_cred_id_t  initiator_cred_handle, gss_const_cred_id_t initiator_cred_handle,
    gss_ctx_id_t *  context_handle, gss_ctx_id_t * context_handle,
    const gss_name_t  target_name, gss_const_name_t target_name,
    const gss_OID  input_mech_type, const gss_OID input_mech_type,
    OM_uint32  req_flags, OM_uint32 req_flags,
    OM_uint32  time_req, OM_uint32 time_req,
    const gss_channel_bindings_t  input_chan_bindings, const gss_channel_bindings_t input_chan_bindings,
    const gss_buffer_t  input_token, const gss_buffer_t input_token,
    gss_OID *  actual_mech_type, gss_OID * actual_mech_type,
    gss_buffer_t  output_token, gss_buffer_t output_token,
    OM_uint32 *  ret_flags, OM_uint32 * ret_flags,
    OM_uint32 *  time_rec OM_uint32 * time_rec 
    )
    -
    -
    - -

    -As the initiator build a context with an acceptor.

    -Returns in the major

      -
    • GSS_S_COMPLETE - if the context if build
    • GSS_S_CONTINUE_NEEDED - if the caller needs to continue another round of gss_i nit_sec_context
    • error code - any other error code
    -

    -

    Parameters:
    - - - - - - - - - - - - - - +
    +

    As the initiator build a context with an acceptor.

    +

    Returns in the major

      +
    • GSS_S_COMPLETE - if the context if build
    • +
    • GSS_S_CONTINUE_NEEDED - if the caller needs to continue another round of gss_i nit_sec_context
    • +
    • error code - any other error code
    • +
    +
    Parameters
    +
    minor_status minor status code.
    initiator_cred_handle the credential to use when building the context, if GSS_C_NO_CREDENTIAL is passed, the default credential for the mechanism will be used.
    context_handle a pointer to a context handle, will be returned as long as there is not an error.
    target_name the target name of acceptor, created using gss_import_name(). The name is can be of any name types the mechanism supports, check supported name types with gss_inquire_names_for_mech().
    input_mech_type mechanism type to use, if GSS_C_NO_OID is used, Kerberos (GSS_KRB5_MECHANISM) will be tried. Other available mechanism are listed in the GSS-API mechanisms section.
    req_flags flags using when building the context, see Context creation flags
    time_req time requested this context should be valid in seconds, common used value is GSS_C_INDEFINITE
    input_chan_bindings Channel bindings used, if not exepected otherwise, used GSS_C_NO_CHANNEL_BINDINGS
    input_token input token sent from the acceptor, for the initial packet the buffer of { NULL, 0 } should be used.
    actual_mech_type the actual mech used, MUST NOT be freed since it pointing to static memory.
    output_token if there is an output token, regardless of complete, continue_needed, or error it should be sent to the acceptor
    ret_flags return what flags was negotitated, caller should check if they are accetable. For example, if GSS_C_MUTUAL_FLAG was negotiated with the acceptor or not.
    time_rec amount of time this context is valid for
    + + + + + + + + + + + + +
    minor_statusminor status code.
    initiator_cred_handlethe credential to use when building the context, if GSS_C_NO_CREDENTIAL is passed, the default credential for the mechanism will be used.
    context_handlea pointer to a context handle, will be returned as long as there is not an error.
    target_namethe target name of acceptor, created using gss_import_name(). The name is can be of any name types the mechanism supports, check supported name types with gss_inquire_names_for_mech().
    input_mech_typemechanism type to use, if GSS_C_NO_OID is used, Kerberos (GSS_KRB5_MECHANISM) will be tried. Other available mechanism are listed in the GSS-API mechanisms section.
    req_flagsflags using when building the context, see Context creation flags
    time_reqtime requested this context should be valid in seconds, common used value is GSS_C_INDEFINITE
    input_chan_bindingsChannel bindings used, if not exepected otherwise, used GSS_C_NO_CHANNEL_BINDINGS
    input_tokeninput token sent from the acceptor, for the initial packet the buffer of { NULL, 0 } should be used.
    actual_mech_typethe actual mech used, MUST NOT be freed since it pointing to static memory.
    output_tokenif there is an output token, regardless of complete, continue_needed, or error it should be sent to the acceptor
    ret_flagsreturn what flags was negotitated, caller should check if they are accetable. For example, if GSS_C_MUTUAL_FLAG was negotiated with the acceptor or not.
    time_recamount of time this context is valid for
    +
    -
    Returns:
    a gss_error code, see gss_display_status() about printing the error code.
    +
    Returns
    a gss_error code, see gss_display_status() about printing the error code.
    -

    - + + +

    ◆ gss_inquire_attrs_for_mech()

    +
    - + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_attrs_for_mech GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_attrs_for_mech (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    gss_const_OID  mech, gss_const_OID mech,
    gss_OID_set *  mech_attr, gss_OID_set * mech_attr,
    gss_OID_set *  known_mech_attrs gss_OID_set * known_mech_attrs 
    )
    -
    -
    - -

    -List support attributes for a mech and/or all mechanisms.

    -

    Parameters:
    - - - - - +
    +

    List support attributes for a mech and/or all mechanisms.

    +
    Parameters
    +
    minor_status minor status code
    mech given together with mech_attr will return the list of attributes for mechanism, can optionally be GSS_C_NO_OID.
    mech_attr see mech parameter, can optionally be NULL, release with gss_release_oid_set().
    known_mech_attrs all attributes for mechanisms supported, release with gss_release_oid_set().
    + + + +
    minor_statusminor status code
    mechgiven together with mech_attr will return the list of attributes for mechanism, can optionally be GSS_C_NO_OID.
    mech_attrsee mech parameter, can optionally be NULL, release with gss_release_oid_set().
    known_mech_attrsall attributes for mechanisms supported, release with gss_release_oid_set().
    +
    -

    - + + +

    ◆ gss_inquire_saslname_for_mech()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_saslname_for_mech GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_saslname_for_mech (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    const gss_OID  desired_mech, const gss_OID desired_mech,
    gss_buffer_t  sasl_mech_name, gss_buffer_t sasl_mech_name,
    gss_buffer_t  mech_name, gss_buffer_t mech_name,
    gss_buffer_t  mech_description gss_buffer_t mech_description 
    )
    -
    -
    - -

    -Returns different protocol names and description of the mechanism.

    -

    Parameters:
    - - - - - - +
    +

    Returns different protocol names and description of the mechanism.

    +
    Parameters
    +
    minor_status minor status code
    desired_mech mech list query
    sasl_mech_name SASL GS2 protocol name
    mech_name gssapi protocol name
    mech_description description of gssapi mech
    + + + + +
    minor_statusminor status code
    desired_mechmech list query
    sasl_mech_nameSASL GS2 protocol name
    mech_namegssapi protocol name
    mech_descriptiondescription of gssapi mech
    +
    -
    Returns:
    returns GSS_S_COMPLETE or a error code.
    +
    Returns
    returns GSS_S_COMPLETE or a error code.
    -

    - + + +

    ◆ gss_oid_equal()

    +
    - + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION int GSSAPI_LIB_CALL gss_oid_equal GSSAPI_LIB_FUNCTION int GSSAPI_LIB_CALL gss_oid_equal (gss_const_OID  a, gss_const_OID a,
    gss_const_OID  b gss_const_OID b 
    )
    -
    -
    - -

    -Compare two GSS-API OIDs with each other.

    -GSS_C_NO_OID matches nothing, not even it-self.

    -

    Parameters:
    - - - +
    +

    Compare two GSS-API OIDs with each other.

    +

    GSS_C_NO_OID matches nothing, not even it-self.

    +
    Parameters
    +
    a first oid to compare
    b second oid to compare
    + +
    afirst oid to compare
    bsecond oid to compare
    +
    -
    Returns:
    non-zero when both oid are the same OID, zero when they are not the same.
    +
    Returns
    non-zero when both oid are the same OID, zero when they are not the same.
    -

    - + + +

    ◆ gss_release_cred()

    +
    - + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_cred GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_cred (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    gss_cred_id_t *  cred_handle gss_cred_id_t * cred_handle 
    )
    -
    -
    - -

    -Release a credentials

    -Its ok to release the GSS_C_NO_CREDENTIAL/NULL credential, it will return a GSS_S_COMPLETE error code. On return cred_handle is set ot GSS_C_NO_CREDENTIAL.

    -Example:

    -

     gss_cred_id_t cred = GSS_C_NO_CREDENTIAL;
    - major = gss_release_cred(&minor, &cred);
    -

    -

    Parameters:
    - - - +
    +

    Release a credentials

    +

    Its ok to release the GSS_C_NO_CREDENTIAL/NULL credential, it will return a GSS_S_COMPLETE error code. On return cred_handle is set ot GSS_C_NO_CREDENTIAL.

    +

    Example:

    +
    gss_cred_id_t cred = GSS_C_NO_CREDENTIAL;
    +
    major = gss_release_cred(&minor, &cred);
    +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_cred(OM_uint32 *, gss_cred_id_t *)
    Definition: gss_release_cred.c:54
    +
    Parameters
    +
    minor_status minor status return code, mech specific
    cred_handle a pointer to the credential too release
    + +
    minor_statusminor status return code, mech specific
    cred_handlea pointer to the credential too release
    +
    -
    Returns:
    an gssapi error code
    +
    Returns
    an gssapi error code
    -

    - + + +

    ◆ gss_release_iov_buffer()

    +
    - + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_iov_buffer GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_iov_buffer (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    gss_iov_buffer_desc *  iov, gss_iov_buffer_desc * iov,
    int  iov_count int iov_count 
    )
    -
    -
    +
    +

    Free all buffer allocated by gss_wrap_iov() or gss_unwrap_iov() by looking at the GSS_IOV_BUFFER_FLAG_ALLOCATED flag.

    -

    -Free all buffer allocated by gss_wrap_iov() or gss_unwrap_iov() by looking at the GSS_IOV_BUFFER_FLAG_ALLOCATED flag.

    -

    - + + +

    ◆ gss_release_name()

    +
    - + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_name GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_name (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    gss_name_t *  input_name gss_name_t * input_name 
    )
    -
    -
    - -

    -Free a name

    -import_name can point to NULL or be NULL, or a pointer to a gss_name_t structure. If it was a pointer to gss_name_t, the pointer will be set to NULL on success and failure.

    -

    Parameters:
    - - - +
    +

    Free a name

    +

    import_name can point to NULL or be NULL, or a pointer to a gss_name_t structure. If it was a pointer to gss_name_t, the pointer will be set to NULL on success and failure.

    +
    Parameters
    +
    minor_status minor status code
    input_name name to free
    + +
    minor_statusminor status code
    input_namename to free
    +
    -
    Returns:
    a gss_error code, see gss_display_status() about printing the error code.
    +
    Returns
    a gss_error code, see gss_display_status() about printing the error code.
    -

    - + + +

    ◆ gss_unwrap_iov()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_unwrap_iov GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_unwrap_iov (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    gss_ctx_id_t  context_handle, gss_ctx_id_t context_handle,
    int *  conf_state, int * conf_state,
    gss_qop_t *  qop_state, gss_qop_t * qop_state,
    gss_iov_buffer_desc *  iov, gss_iov_buffer_desc * iov,
    int  iov_count int iov_count 
    )
    -
    -
    +
    +

    Decrypt or verifies the signature on the data.

    -

    -Decrypt or verifies the signature on the data.

    -

    - + + +

    ◆ gss_wrap()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    const gss_ctx_id_t  context_handle, gss_const_ctx_id_t context_handle,
    int  conf_req_flag, int conf_req_flag,
    gss_qop_t  qop_req, gss_qop_t qop_req,
    const gss_buffer_t  input_message_buffer, const gss_buffer_t input_message_buffer,
    int *  conf_state, int * conf_state,
    gss_buffer_t  output_message_buffer gss_buffer_t output_message_buffer 
    )
    -
    -
    - -

    -Wrap a message using either confidentiality (encryption + signature) or sealing (signature).

    -

    Parameters:
    - - - - - - - - +
    +

    Wrap a message using either confidentiality (encryption + signature) or sealing (signature).

    +
    Parameters
    +
    minor_status minor status code.
    context_handle context handle.
    conf_req_flag if non zero, confidentiality is requestd.
    qop_req type of protection needed, in most cases it GSS_C_QOP_DEFAULT should be passed in.
    input_message_buffer messages to wrap
    conf_state returns non zero if confidentiality was honoured.
    output_message_buffer the resulting buffer, release with gss_release_buffer().
    + + + + + + +
    minor_statusminor status code.
    context_handlecontext handle.
    conf_req_flagif non zero, confidentiality is requestd.
    qop_reqtype of protection needed, in most cases it GSS_C_QOP_DEFAULT should be passed in.
    input_message_buffermessages to wrap
    conf_statereturns non zero if confidentiality was honoured.
    output_message_bufferthe resulting buffer, release with gss_release_buffer().
    +
    -

    - + + +

    ◆ gss_wrap_iov()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    gss_ctx_id_t  context_handle, gss_ctx_id_t context_handle,
    int  conf_req_flag, int conf_req_flag,
    gss_qop_t  qop_req, gss_qop_t qop_req,
    int *  conf_state, int * conf_state,
    gss_iov_buffer_desc *  iov, gss_iov_buffer_desc * iov,
    int  iov_count int iov_count 
    )
    -
    -
    - -

    -Encrypts or sign the data.

    -This is a more complicated version of gss_wrap(), it allows the caller to use AEAD data (signed header/trailer) and allow greater controll over where the encrypted data is placed.

    -The maximum packet size is gss_context_stream_sizes.max_msg_size.

    -The caller needs provide the folloing buffers when using in conf_req_flag=1 mode:

    +

    +

    Encrypts or sign the data.

    +

    This is a more complicated version of gss_wrap(), it allows the caller to use AEAD data (signed header/trailer) and allow greater controll over where the encrypted data is placed.

    +

    The maximum packet size is gss_context_stream_sizes.max_msg_size.

    +

    The caller needs provide the folloing buffers when using in conf_req_flag=1 mode:

      -
    • HEADER (of size gss_context_stream_sizes.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes.trailer)
    -

    +

  • HEADER (of size gss_context_stream_sizes.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes.trailer)
  • +
  • on DCE-RPC mode, the caller can skip PADDING and TRAILER if the DATA elements is padded to a block bountry and header is of at least size gss_context_stream_sizes.header + gss_context_stream_sizes.trailer.
  • + +

    HEADER, PADDING, TRAILER will be shrunken to the size required to transmit any of them too large.

    +

    To generate gss_wrap() compatible packets, use: HEADER | DATA | PADDING | TRAILER

    +

    When used in conf_req_flag=0,

      -
    • on DCE-RPC mode, the caller can skip PADDING and TRAILER if the DATA elements is padded to a block bountry and header is of at least size gss_context_stream_sizes.header + gss_context_stream_sizes.trailer.
    -

    -HEADER, PADDING, TRAILER will be shrunken to the size required to transmit any of them too large.

    -To generate gss_wrap() compatible packets, use: HEADER | DATA | PADDING | TRAILER

    -When used in conf_req_flag=0,

    -

      -
    • HEADER (of size gss_context_stream_sizes.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes.trailer)
    -

    -The input sizes of HEADER, PADDING and TRAILER can be fetched using gss_wrap_iov_length() or gss_context_query_attributes(). +

  • HEADER (of size gss_context_stream_sizes.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes.trailer)
  • + +

    The input sizes of HEADER, PADDING and TRAILER can be fetched using gss_wrap_iov_length() or gss_context_query_attributes().

    + +
    -

    - + +

    ◆ gss_wrap_iov_length()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov_length GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov_length (OM_uint32 *  minor_status, OM_uint32 * minor_status,
    gss_ctx_id_t  context_handle, gss_ctx_id_t context_handle,
    int  conf_req_flag, int conf_req_flag,
    gss_qop_t  qop_req, gss_qop_t qop_req,
    int *  conf_state, int * conf_state,
    gss_iov_buffer_desc *  iov, gss_iov_buffer_desc * iov,
    int  iov_count int iov_count 
    )
    -
    -
    +
    +

    Update the length fields in iov buffer for the types:

      +
    • GSS_IOV_BUFFER_TYPE_HEADER
    • +
    • GSS_IOV_BUFFER_TYPE_PADDING
    • +
    • GSS_IOV_BUFFER_TYPE_TRAILER
    • +
    +

    Consider using gss_context_query_attributes() to fetch the data instead.

    -

    -Update the length fields in iov buffer for the types:

      -
    • GSS_IOV_BUFFER_TYPE_HEADER
    • GSS_IOV_BUFFER_TYPE_PADDING
    • GSS_IOV_BUFFER_TYPE_TRAILER
    -

    -Consider using gss_context_query_attributes() to fetch the data instead.

    -

    -


    Variable Documentation

    - + +

    Variable Documentation

    + +

    ◆ __gss_c_attr_stream_sizes_oid_desc

    +
    - +
    gss_OID_desc GSSAPI_LIB_FUNCTION __gss_c_attr_stream_sizes_oid_desc gss_OID_desc GSSAPI_LIB_FUNCTION __gss_c_attr_stream_sizes_oid_desc
    -
    -
    - -

    -Initial value:

    -    {10, rk_UNCONST("\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x03")}
    -
    Query the context for parameters.

    -SSPI equivalent if this function is QueryContextAttributes.

    +

    +Initial value:
    =
    +
    {10, rk_UNCONST("\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x03")}
    +

    Query the context for parameters.

    +

    SSPI equivalent if this function is QueryContextAttributes.

      -
    • GSS_C_ATTR_STREAM_SIZES data is a gss_context_stream_sizes.
    +
  • GSS_C_ATTR_STREAM_SIZES data is a gss_context_stream_sizes.
  • +
    -

    +


    -Generated on Wed Jan 11 14:07:44 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_mechs_intro.html b/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_mechs_intro.html --- a/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_mechs_intro.html +++ b/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_mechs_intro.html @@ -1,6 +1,6 @@ -HeimdalGSS-APIlibrary: GSS-API mechanisms +GSS-API mechanisms @@ -8,23 +8,32 @@ keyhole logo

    - - + + + + + + +
    +
    +
    GSS-API mechanisms
    +
    -

    GSS-API mechanisms

    -GSS-API mechanisms

    +

    +GSS-API mechanisms

      -
    • Kerberos 5 - GSS_KRB5_MECHANISM
    • SPNEGO - GSS_SPNEGO_MECHANISM
    • NTLM - GSS_NTLM_MECHANISM
    -
    +
  • Kerberos 5 - GSS_KRB5_MECHANISM
  • +
  • SPNEGO - GSS_SPNEGO_MECHANISM
  • +
  • NTLM - GSS_NTLM_MECHANISM
  • + +
    +
    -Generated on Wed Jan 11 14:07:43 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_services_intro.html b/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_services_intro.html --- a/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_services_intro.html +++ b/crypto/heimdal/doc/doxyout/gssapi/html/gssapi_services_intro.html @@ -1,6 +1,6 @@ -HeimdalGSS-APIlibrary: Introduction to GSS-API services +Introduction to GSS-API services @@ -8,36 +8,65 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Introduction to GSS-API services
    +
    -

    Introduction to GSS-API services

    -GSS-API services

    -

    -Context creation

    +

    +GSS-API services

    +

    +Context creation

      -
    • delegation
    • mutual authentication
    • anonymous
    • use per message before context creation has completed
    -

    -return status:

      -
    • support conf
    • support int
    -

    -Context creation flags

    +
  • delegation
  • +
  • mutual authentication
  • +
  • anonymous
  • +
  • use per message before context creation has completed
  • + +

    return status:

      +
    • support conf
    • +
    • support int
    • +
    +

    +Context creation flags

      -
    • GSS_C_DELEG_FLAG
    • GSS_C_MUTUAL_FLAG
    • GSS_C_REPLAY_FLAG
    • GSS_C_SEQUENCE_FLAG
    • GSS_C_CONF_FLAG
    • GSS_C_INTEG_FLAG
    • GSS_C_ANON_FLAG
    • GSS_C_PROT_READY_FLAG
    • GSS_C_TRANS_FLAG
    • GSS_C_DCE_STYLE
    • GSS_C_IDENTIFY_FLAG
    • GSS_C_EXTENDED_ERROR_FLAG
    • GSS_C_DELEG_POLICY_FLAG
    -

    -Per-message services

    +
  • GSS_C_DELEG_FLAG
  • +
  • GSS_C_MUTUAL_FLAG
  • +
  • GSS_C_REPLAY_FLAG
  • +
  • GSS_C_SEQUENCE_FLAG
  • +
  • GSS_C_CONF_FLAG
  • +
  • GSS_C_INTEG_FLAG
  • +
  • GSS_C_ANON_FLAG
  • +
  • GSS_C_PROT_READY_FLAG
  • +
  • GSS_C_TRANS_FLAG
  • +
  • GSS_C_DCE_STYLE
  • +
  • GSS_C_IDENTIFY_FLAG
  • +
  • GSS_C_EXTENDED_ERROR_FLAG
  • +
  • GSS_C_DELEG_POLICY_FLAG
  • + +

    +Per-message services

      -
    • conf
    • int
    • message integrity
    • replay detection
    • out of sequence
    -
    +
  • conf
  • +
  • int
  • +
  • message integrity
  • +
  • replay detection
  • +
  • out of sequence
  • + +
    +
    -Generated on Wed Jan 11 14:07:43 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/index.html b/crypto/heimdal/doc/doxyout/gssapi/html/index.html --- a/crypto/heimdal/doc/doxyout/gssapi/html/index.html +++ b/crypto/heimdal/doc/doxyout/gssapi/html/index.html @@ -1,6 +1,6 @@ -HeimdalGSS-APIlibrary: Heimdal GSS-API Library +Heimdal GSS-API Library @@ -8,29 +8,38 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Heimdal GSS-API Library
    +
    -

    Heimdal GSS-API Library

    -

    -

    1.5.2

    Heimdal implements the following mechanisms:

    +

    Heimdal implements the following mechanisms:

      -
    • Kerberos 5
    • SPNEGO
    • NTLM
    -

    -See GSS-API mechanisms for more describtion about these mechanisms.

    -The project web page: http://www.h5l.org/

    +

  • Kerberos 5
  • +
  • SPNEGO
  • +
  • NTLM
  • + +
    See also
    -
    +
  • Introduction to GSS-API services
  • +
  • GSS-API mechanisms
  • +
  • Name forms
  • +
  • The project web page: http://www.h5l.org/
  • + +
    +
    -Generated on Wed Jan 11 14:07:43 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/internal_v_smechname.html b/crypto/heimdal/doc/doxyout/gssapi/html/internal_v_smechname.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/html/internal_v_smechname.html @@ -0,0 +1,42 @@ + + +Internal names and mechanism names + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Internal names and mechanism names
    +
    +
    +

    +Name forms

    +

    There are two name representations in GSS-API: Internal form and Contiguous string ("flat") form. Functions gss_export_name() and gss_import_name() can be used to convert between the two forms.

    +
      +
    • The contiguous string form is described by an oid specificing the type and an octet string. A special form of the contiguous string form is the exported name object. The exported name defined for each mechanism, is something that can be stored and compared later. The exported name is what should be used for ACLs comparisons.
    • +
    • The Internal form is opaque to the application programmer and is implementation-dependent.
    • +
    • There is also a special form of the Internal Name (IN), and that is the Mechanism Name (MN). In the mechanism name all the generic information is stripped of and only contain the information for one mechanism. In GSS-API some function return MN and some require MN as input. Each of these function is marked up as such.
    • +
    +

    @FIXME Describe relationship between import_name, canonicalize_name, export_name and friends. Also, update for RFC2743 language ("contiguous" and "flat" are gone, leaving just "exported name +token", "internal", and "MN").

    +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/internalvsmechname.html b/crypto/heimdal/doc/doxyout/gssapi/html/internalvsmechname.html deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/gssapi/html/internalvsmechname.html +++ /dev/null @@ -1,36 +0,0 @@ - - -HeimdalGSS-APIlibrary: Internal names and mechanism names - - - -

    -keyhole logo -

    - - - -
    -

    Internal names and mechanism names

    -Name forms

    -There are two forms of name in GSS-API, Internal form and Contiguous string ("flat") form. gss_export_name() and gss_import_name() can be used to convert between the two forms.

    -

      -
    • The contiguous string form is described by an oid specificing the type and an octet string. A special form of the contiguous string form is the exported name object. The exported name defined for each mechanism, is something that can be stored and complared later. The exported name is what should be used for ACLs comparisons.
    -

    -

      -
    • The Internal form
    -

    -There is also special form of the Internal Name (IN), and that is the Mechanism Name (MN). In the mechanism name all the generic information is stripped of and only contain the information for one mechanism. In GSS-API some function return MN and some require MN as input. Each of these function is marked up as such.

    -Describe relationship between import_name, canonicalize_name, export_name and friends.

    -
    -Generated on Wed Jan 11 14:07:43 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    - - diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/jquery.js b/crypto/heimdal/doc/doxyout/gssapi/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/menu.js b/crypto/heimdal/doc/doxyout/gssapi/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/menudata.js b/crypto/heimdal/doc/doxyout/gssapi/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/html/menudata.js @@ -0,0 +1,28 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Modules",url:"modules.html"}]} diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/modules.html b/crypto/heimdal/doc/doxyout/gssapi/html/modules.html --- a/crypto/heimdal/doc/doxyout/gssapi/html/modules.html +++ b/crypto/heimdal/doc/doxyout/gssapi/html/modules.html @@ -1,6 +1,6 @@ -HeimdalGSS-APIlibrary: Module Index +Modules @@ -8,22 +8,29 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    Modules
    +
    -

    Modules

    Here is a list of all modules: -
    +
    Here is a list of all modules:
    +

    -Generated on Wed Jan 11 14:07:44 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/nav_f.png b/crypto/heimdal/doc/doxyout/gssapi/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM -HeimdalGSS-APIlibrary: Page Index +Related Pages @@ -8,27 +8,31 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    Related Pages
    +
    -

    Related Pages

    Here is a list of all related documentation pages: -
    +
    Here is a list of all related documentation pages:
    +
    -Generated on Wed Jan 11 14:07:43 2012 for HeimdalGSS-APIlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal GSS-API library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/splitbar.png b/crypto/heimdal/doc/doxyout/gssapi/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zc%17D@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@IeJfk6j|89*WoOiV6}4AuZ}83fn> diff --git a/crypto/heimdal/doc/doxyout/gssapi/html/tab_b.png b/crypto/heimdal/doc/doxyout/gssapi/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 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 literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/gssapi/man/man3/__gss_c_attr_stream_sizes_oid_desc.3 b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gss_display_status.3 rename from crypto/heimdal/doc/doxyout/gssapi/man/man3/__gss_c_attr_stream_sizes_oid_desc.3 rename to crypto/heimdal/doc/doxyout/gssapi/man/man3/gss_display_status.3 diff --git a/crypto/heimdal/doc/doxyout/gssapi/man/man3/__gss_c_attr_stream_sizes_oid_desc.3 b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gss_export_name.3 rename from crypto/heimdal/doc/doxyout/gssapi/man/man3/__gss_c_attr_stream_sizes_oid_desc.3 rename to crypto/heimdal/doc/doxyout/gssapi/man/man3/gss_export_name.3 diff --git a/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi.3 b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi.3 --- a/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi.3 +++ b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi.3 @@ -1,8 +1,11 @@ -.TH "Heimdal GSS-API functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalGSS-APIlibrary" \" -*- nroff -*- +.TH "gssapi" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal GSS-API library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal GSS-API functions \- +gssapi \- Heimdal GSS-API functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -22,13 +25,19 @@ .RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_release_iov_buffer\fP (OM_uint32 *minor_status, gss_iov_buffer_desc *iov, int iov_count)" .br .ti -1c -.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_canonicalize_name\fP (OM_uint32 *minor_status, const gss_name_t input_name, const gss_OID mech_type, gss_name_t *output_name)" +.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_canonicalize_name\fP (OM_uint32 *minor_status, gss_const_name_t input_name, const gss_OID mech_type, gss_name_t *output_name)" +.br +.ti -1c +.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_display_status\fP (OM_uint32 *minor_status, OM_uint32 status_value, int status_type, const gss_OID mech_type, OM_uint32 *message_context, gss_buffer_t status_string)" +.br +.ti -1c +.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_export_name\fP (OM_uint32 *minor_status, gss_const_name_t input_name, gss_buffer_t exported_name)" .br .ti -1c .RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_import_name\fP (OM_uint32 *minor_status, const gss_buffer_t input_name_buffer, const gss_OID input_name_type, gss_name_t *output_name)" .br .ti -1c -.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_init_sec_context\fP (OM_uint32 *minor_status, const gss_cred_id_t initiator_cred_handle, gss_ctx_id_t *context_handle, const gss_name_t target_name, const gss_OID input_mech_type, OM_uint32 req_flags, OM_uint32 time_req, const gss_channel_bindings_t input_chan_bindings, const gss_buffer_t input_token, gss_OID *actual_mech_type, gss_buffer_t output_token, OM_uint32 *ret_flags, OM_uint32 *time_rec)" +.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_init_sec_context\fP (OM_uint32 *minor_status, gss_const_cred_id_t initiator_cred_handle, gss_ctx_id_t *context_handle, gss_const_name_t target_name, const gss_OID input_mech_type, OM_uint32 req_flags, OM_uint32 time_req, const gss_channel_bindings_t input_chan_bindings, const gss_buffer_t input_token, gss_OID *actual_mech_type, gss_buffer_t output_token, OM_uint32 *ret_flags, OM_uint32 *time_rec)" .br .ti -1c .RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_inquire_saslname_for_mech\fP (OM_uint32 *minor_status, const gss_OID desired_mech, gss_buffer_t sasl_mech_name, gss_buffer_t mech_name, gss_buffer_t mech_description)" @@ -46,7 +55,7 @@ .RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_release_name\fP (OM_uint32 *minor_status, gss_name_t *input_name)" .br .ti -1c -.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_wrap\fP (OM_uint32 *minor_status, const gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, int *conf_state, gss_buffer_t output_message_buffer)" +.RI "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL \fBgss_wrap\fP (OM_uint32 *minor_status, gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, int *conf_state, gss_buffer_t output_message_buffer)" .br .in -1c .SS "Variables" @@ -62,56 +71,100 @@ .SH "Function Documentation" .PP .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_oid_set_member (OM_uint32 * minor_status, const gss_OID member_oid, gss_OID_set * oid_set)" +Add a oid to the oid set, function does not make a copy of the oid, so the pointer to member_oid needs to be stable for the whole time oid_set is used\&. .PP -Add a oid to the oid set, function does not make a copy of the oid, so the pointer to member_oid needs to be stable for the whole time oid_set is used. -.PP -If there is a duplicate member of the oid, the new member is not added to to the set. +If there is a duplicate member of the oid, the new member is not added to to the set\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIminor_status\fP minor status code. +\fIminor_status\fP minor status code\&. .br \fImember_oid\fP member to add to the oid set .br \fIoid_set\fP oid set to add the member too .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a gss_error code, see gss_display_status() about printing the error code. +a gss_error code, see \fBgss_display_status()\fP about printing the error code\&. .RE .PP -.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_canonicalize_name (OM_uint32 * minor_status, const gss_name_t input_name, const gss_OID mech_type, gss_name_t * output_name)" +.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_canonicalize_name (OM_uint32 * minor_status, gss_const_name_t input_name, const gss_OID mech_type, gss_name_t * output_name)" +gss_canonicalize_name takes a Internal Name (IN) and converts in into a mechanism specific Mechanism Name (MN)\&. .PP -gss_canonicalize_name takes a Internal Name (IN) and converts in into a mechanism specific Mechanism Name (MN). +The input name may multiple name, or generic name types\&. .PP -The input name may multiple name, or generic name types. +If the input_name if of the GSS_C_NT_USER_NAME, and the Kerberos mechanism is specified, the resulting MN type is a GSS_KRB5_NT_PRINCIPAL_NAME\&. .PP -If the input_name if of the GSS_C_NT_USER_NAME, and the Kerberos mechanism is specified, the resulting MN type is a GSS_KRB5_NT_PRINCIPAL_NAME. +For more information about \fBInternal names and mechanism names\fP\&. .PP -For more information about \fBinternalVSmechname\fP. +\fBParameters\fP +.RS 4 +\fIminor_status\fP minor status code\&. +.br +\fIinput_name\fP name to covert, unchanged by \fBgss_canonicalize_name()\fP\&. +.br +\fImech_type\fP the type to convert Name too\&. +.br +\fIoutput_name\fP the resulting type, release with \fBgss_release_name()\fP, independent of input_name\&. +.RE .PP -\fBParameters:\fP +\fBReturns\fP .RS 4 -\fIminor_status\fP minor status code. +a gss_error code, see \fBgss_display_status()\fP about printing the error code\&. +.RE +.PP + +.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_display_status (OM_uint32 * minor_status, OM_uint32 status_value, int status_type, const gss_OID mech_type, OM_uint32 * message_context, gss_buffer_t status_string)" +Convert a GSS-API status code to text +.PP +\fBParameters\fP +.RS 4 +\fIminor_status\fP minor status code .br -\fIinput_name\fP name to covert, unchanged by \fBgss_canonicalize_name()\fP. +\fIstatus_value\fP status value to convert .br -\fImech_type\fP the type to convert Name too. +\fIstatus_type\fP One of: GSS_C_GSS_CODE - status_value is a GSS status code, GSS_C_MECH_CODE - status_value is a mechanism status code .br -\fIoutput_name\fP the resulting type, release with \fBgss_release_name()\fP, independent of input_name. +\fImech_type\fP underlying mechanism\&. Use GSS_C_NO_OID to obtain the system default\&. +.br +\fImessage_context\fP state information to extract further messages from the status_value +.br +\fIstatus_string\fP the allocated text representation\&. Release with gss_release_buffer() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a gss_error code, see gss_display_status() about printing the error code. +a gss_error code\&. .RE .PP -.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_import_name (OM_uint32 * minor_status, const gss_buffer_t input_name_buffer, const gss_OID input_name_type, gss_name_t * output_name)" +.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_export_name (OM_uint32 * minor_status, gss_const_name_t input_name, gss_buffer_t exported_name)" +Convert a GGS-API name from internal form to contiguous string\&. .PP -Import a name internal or mechanism name +\fBSee also\fP +.RS 4 +\fBgss_import_name()\fP, \fBInternal names and mechanism names\fP\&. +.RE +.PP +\fBParameters\fP +.RS 4 +\fIminor_status\fP minor status code +.br +\fIinput_name\fP input name in internal name form +.br +\fIexported_name\fP output name in contiguos string form +.RE +.PP +\fBReturns\fP +.RS 4 +a gss_error code, see \fBgss_display_status()\fP about printing the error code\&. +.RE +.PP + +.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_import_name (OM_uint32 * minor_status, const gss_buffer_t input_name_buffer, const gss_OID input_name_type, gss_name_t * output_name)" +Convert a GGS-API name from contiguous string to internal form\&. .PP Type of name and their format: .IP "\(bu" 2 @@ -128,9 +181,12 @@ GSS_KRB5_NT_PRINCIPAL_NAME .PP .PP -For more information about \fBinternalVSmechname\fP. +\fBSee also\fP +.RS 4 +\fBgss_export_name()\fP, \fBInternal names and mechanism names\fP\&. +.RE .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIminor_status\fP minor status code .br @@ -141,15 +197,14 @@ \fIoutput_name\fP the resulting type, release with \fBgss_release_name()\fP, independent of input_name .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a gss_error code, see gss_display_status() about printing the error code. +a gss_error code, see \fBgss_display_status()\fP about printing the error code\&. .RE .PP -.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_init_sec_context (OM_uint32 * minor_status, const gss_cred_id_t initiator_cred_handle, gss_ctx_id_t * context_handle, const gss_name_t target_name, const gss_OID input_mech_type, OM_uint32 req_flags, OM_uint32 time_req, const gss_channel_bindings_t input_chan_bindings, const gss_buffer_t input_token, gss_OID * actual_mech_type, gss_buffer_t output_token, OM_uint32 * ret_flags, OM_uint32 * time_rec)" -.PP -As the initiator build a context with an acceptor. +.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_init_sec_context (OM_uint32 * minor_status, gss_const_cred_id_t initiator_cred_handle, gss_ctx_id_t * context_handle, gss_const_name_t target_name, const gss_OID input_mech_type, OM_uint32 req_flags, OM_uint32 time_req, const gss_channel_bindings_t input_chan_bindings, const gss_buffer_t input_token, gss_OID * actual_mech_type, gss_buffer_t output_token, OM_uint32 * ret_flags, OM_uint32 * time_rec)" +As the initiator build a context with an acceptor\&. .PP Returns in the major .IP "\(bu" 2 @@ -160,17 +215,17 @@ error code - any other error code .PP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIminor_status\fP minor status code. +\fIminor_status\fP minor status code\&. .br -\fIinitiator_cred_handle\fP the credential to use when building the context, if GSS_C_NO_CREDENTIAL is passed, the default credential for the mechanism will be used. +\fIinitiator_cred_handle\fP the credential to use when building the context, if GSS_C_NO_CREDENTIAL is passed, the default credential for the mechanism will be used\&. .br -\fIcontext_handle\fP a pointer to a context handle, will be returned as long as there is not an error. +\fIcontext_handle\fP a pointer to a context handle, will be returned as long as there is not an error\&. .br -\fItarget_name\fP the target name of acceptor, created using \fBgss_import_name()\fP. The name is can be of any name types the mechanism supports, check supported name types with gss_inquire_names_for_mech(). +\fItarget_name\fP the target name of acceptor, created using \fBgss_import_name()\fP\&. The name is can be of any name types the mechanism supports, check supported name types with gss_inquire_names_for_mech()\&. .br -\fIinput_mech_type\fP mechanism type to use, if GSS_C_NO_OID is used, Kerberos (GSS_KRB5_MECHANISM) will be tried. Other available mechanism are listed in the \fBGSS-API mechanisms\fP section. +\fIinput_mech_type\fP mechanism type to use, if GSS_C_NO_OID is used, Kerberos (GSS_KRB5_MECHANISM) will be tried\&. Other available mechanism are listed in the \fBGSS-API mechanisms\fP section\&. .br \fIreq_flags\fP flags using when building the context, see \fBContext creation flags\fP .br @@ -178,44 +233,42 @@ .br \fIinput_chan_bindings\fP Channel bindings used, if not exepected otherwise, used GSS_C_NO_CHANNEL_BINDINGS .br -\fIinput_token\fP input token sent from the acceptor, for the initial packet the buffer of { NULL, 0 } should be used. +\fIinput_token\fP input token sent from the acceptor, for the initial packet the buffer of { NULL, 0 } should be used\&. .br -\fIactual_mech_type\fP the actual mech used, MUST NOT be freed since it pointing to static memory. +\fIactual_mech_type\fP the actual mech used, MUST NOT be freed since it pointing to static memory\&. .br \fIoutput_token\fP if there is an output token, regardless of complete, continue_needed, or error it should be sent to the acceptor .br -\fIret_flags\fP return what flags was negotitated, caller should check if they are accetable. For example, if GSS_C_MUTUAL_FLAG was negotiated with the acceptor or not. +\fIret_flags\fP return what flags was negotitated, caller should check if they are accetable\&. For example, if GSS_C_MUTUAL_FLAG was negotiated with the acceptor or not\&. .br \fItime_rec\fP amount of time this context is valid for .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a gss_error code, see gss_display_status() about printing the error code. +a gss_error code, see \fBgss_display_status()\fP about printing the error code\&. .RE .PP .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_attrs_for_mech (OM_uint32 * minor_status, gss_const_OID mech, gss_OID_set * mech_attr, gss_OID_set * known_mech_attrs)" +List support attributes for a mech and/or all mechanisms\&. .PP -List support attributes for a mech and/or all mechanisms. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIminor_status\fP minor status code .br -\fImech\fP given together with mech_attr will return the list of attributes for mechanism, can optionally be GSS_C_NO_OID. +\fImech\fP given together with mech_attr will return the list of attributes for mechanism, can optionally be GSS_C_NO_OID\&. .br -\fImech_attr\fP see mech parameter, can optionally be NULL, release with gss_release_oid_set(). +\fImech_attr\fP see mech parameter, can optionally be NULL, release with gss_release_oid_set()\&. .br -\fIknown_mech_attrs\fP all attributes for mechanisms supported, release with gss_release_oid_set(). +\fIknown_mech_attrs\fP all attributes for mechanisms supported, release with gss_release_oid_set()\&. .RE .PP .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_saslname_for_mech (OM_uint32 * minor_status, const gss_OID desired_mech, gss_buffer_t sasl_mech_name, gss_buffer_t mech_name, gss_buffer_t mech_description)" +Returns different protocol names and description of the mechanism\&. .PP -Returns different protocol names and description of the mechanism. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIminor_status\fP minor status code .br @@ -228,137 +281,127 @@ \fImech_description\fP description of gssapi mech .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -returns GSS_S_COMPLETE or a error code. +returns GSS_S_COMPLETE or a error code\&. .RE .PP .SS "GSSAPI_LIB_FUNCTION int GSSAPI_LIB_CALL gss_oid_equal (gss_const_OID a, gss_const_OID b)" +Compare two GSS-API OIDs with each other\&. .PP -Compare two GSS-API OIDs with each other. +GSS_C_NO_OID matches nothing, not even it-self\&. .PP -GSS_C_NO_OID matches nothing, not even it-self. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIa\fP first oid to compare .br \fIb\fP second oid to compare .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -non-zero when both oid are the same OID, zero when they are not the same. +non-zero when both oid are the same OID, zero when they are not the same\&. .RE .PP .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_cred (OM_uint32 * minor_status, gss_cred_id_t * cred_handle)" -.PP Release a credentials .PP -Its ok to release the GSS_C_NO_CREDENTIAL/NULL credential, it will return a GSS_S_COMPLETE error code. On return cred_handle is set ot GSS_C_NO_CREDENTIAL. +Its ok to release the GSS_C_NO_CREDENTIAL/NULL credential, it will return a GSS_S_COMPLETE error code\&. On return cred_handle is set ot GSS_C_NO_CREDENTIAL\&. .PP Example: .PP .PP .nf - gss_cred_id_t cred = GSS_C_NO_CREDENTIAL; - major = gss_release_cred(&minor, &cred); +gss_cred_id_t cred = GSS_C_NO_CREDENTIAL; +major = gss_release_cred(&minor, &cred); .fi .PP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIminor_status\fP minor status return code, mech specific .br \fIcred_handle\fP a pointer to the credential too release .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 an gssapi error code .RE .PP .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_iov_buffer (OM_uint32 * minor_status, gss_iov_buffer_desc * iov, int iov_count)" -.PP -Free all buffer allocated by \fBgss_wrap_iov()\fP or \fBgss_unwrap_iov()\fP by looking at the GSS_IOV_BUFFER_FLAG_ALLOCATED flag. +Free all buffer allocated by \fBgss_wrap_iov()\fP or \fBgss_unwrap_iov()\fP by looking at the GSS_IOV_BUFFER_FLAG_ALLOCATED flag\&. .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_name (OM_uint32 * minor_status, gss_name_t * input_name)" -.PP Free a name .PP -import_name can point to NULL or be NULL, or a pointer to a gss_name_t structure. If it was a pointer to gss_name_t, the pointer will be set to NULL on success and failure. +import_name can point to NULL or be NULL, or a pointer to a gss_name_t structure\&. If it was a pointer to gss_name_t, the pointer will be set to NULL on success and failure\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIminor_status\fP minor status code .br \fIinput_name\fP name to free .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a gss_error code, see gss_display_status() about printing the error code. +a gss_error code, see \fBgss_display_status()\fP about printing the error code\&. .RE .PP .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_unwrap_iov (OM_uint32 * minor_status, gss_ctx_id_t context_handle, int * conf_state, gss_qop_t * qop_state, gss_iov_buffer_desc * iov, int iov_count)" +Decrypt or verifies the signature on the data\&. +.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap (OM_uint32 * minor_status, gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, int * conf_state, gss_buffer_t output_message_buffer)" +Wrap a message using either confidentiality (encryption + signature) or sealing (signature)\&. .PP -Decrypt or verifies the signature on the data. -.SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap (OM_uint32 * minor_status, const gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, int * conf_state, gss_buffer_t output_message_buffer)" -.PP -Wrap a message using either confidentiality (encryption + signature) or sealing (signature). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIminor_status\fP minor status code. +\fIminor_status\fP minor status code\&. .br -\fIcontext_handle\fP context handle. +\fIcontext_handle\fP context handle\&. .br -\fIconf_req_flag\fP if non zero, confidentiality is requestd. +\fIconf_req_flag\fP if non zero, confidentiality is requestd\&. .br -\fIqop_req\fP type of protection needed, in most cases it GSS_C_QOP_DEFAULT should be passed in. +\fIqop_req\fP type of protection needed, in most cases it GSS_C_QOP_DEFAULT should be passed in\&. .br \fIinput_message_buffer\fP messages to wrap .br -\fIconf_state\fP returns non zero if confidentiality was honoured. +\fIconf_state\fP returns non zero if confidentiality was honoured\&. .br -\fIoutput_message_buffer\fP the resulting buffer, release with gss_release_buffer(). +\fIoutput_message_buffer\fP the resulting buffer, release with gss_release_buffer()\&. .RE .PP .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov (OM_uint32 * minor_status, gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, int * conf_state, gss_iov_buffer_desc * iov, int iov_count)" +Encrypts or sign the data\&. .PP -Encrypts or sign the data. -.PP -This is a more complicated version of \fBgss_wrap()\fP, it allows the caller to use AEAD data (signed header/trailer) and allow greater controll over where the encrypted data is placed. +This is a more complicated version of \fBgss_wrap()\fP, it allows the caller to use AEAD data (signed header/trailer) and allow greater controll over where the encrypted data is placed\&. .PP -The maximum packet size is gss_context_stream_sizes.max_msg_size. +The maximum packet size is gss_context_stream_sizes\&.max_msg_size\&. .PP The caller needs provide the folloing buffers when using in conf_req_flag=1 mode: .PP .IP "\(bu" 2 -HEADER (of size gss_context_stream_sizes.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes.trailer) -.PP -.PP +HEADER (of size gss_context_stream_sizes\&.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes\&.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes\&.trailer) .IP "\(bu" 2 -on DCE-RPC mode, the caller can skip PADDING and TRAILER if the DATA elements is padded to a block bountry and header is of at least size gss_context_stream_sizes.header + gss_context_stream_sizes.trailer. +on DCE-RPC mode, the caller can skip PADDING and TRAILER if the DATA elements is padded to a block bountry and header is of at least size gss_context_stream_sizes\&.header + gss_context_stream_sizes\&.trailer\&. .PP .PP -HEADER, PADDING, TRAILER will be shrunken to the size required to transmit any of them too large. +HEADER, PADDING, TRAILER will be shrunken to the size required to transmit any of them too large\&. .PP To generate \fBgss_wrap()\fP compatible packets, use: HEADER | DATA | PADDING | TRAILER .PP When used in conf_req_flag=0, .PP .IP "\(bu" 2 -HEADER (of size gss_context_stream_sizes.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes.trailer) +HEADER (of size gss_context_stream_sizes\&.header) { DATA or SIGN_ONLY } (optional, zero or more) PADDING (of size gss_context_stream_sizes\&.blocksize, if zero padding is zero, can be omitted) TRAILER (of size gss_context_stream_sizes\&.trailer) .PP .PP -The input sizes of HEADER, PADDING and TRAILER can be fetched using \fBgss_wrap_iov_length()\fP or gss_context_query_attributes(). +The input sizes of HEADER, PADDING and TRAILER can be fetched using \fBgss_wrap_iov_length()\fP or gss_context_query_attributes()\&. .SS "GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_iov_length (OM_uint32 * minor_status, gss_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, int * conf_state, gss_iov_buffer_desc * iov, int iov_count)" -.PP Update the length fields in iov buffer for the types: .IP "\(bu" 2 GSS_IOV_BUFFER_TYPE_HEADER @@ -368,22 +411,24 @@ GSS_IOV_BUFFER_TYPE_TRAILER .PP .PP -Consider using gss_context_query_attributes() to fetch the data instead. +Consider using gss_context_query_attributes() to fetch the data instead\&. .SH "Variable Documentation" .PP -.SS "gss_OID_desc GSSAPI_LIB_FUNCTION \fB__gss_c_attr_stream_sizes_oid_desc\fP" -.PP +.SS "gss_OID_desc GSSAPI_LIB_FUNCTION __gss_c_attr_stream_sizes_oid_desc" \fBInitial value:\fP .PP .nf - - {10, rk_UNCONST('\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x03')} += + {10, rk_UNCONST("\x2a\x86\x48\x86\xf7\x12\x01\x02\x01\x03")} .fi -Query the context for parameters. +Query the context for parameters\&. .PP -SSPI equivalent if this function is QueryContextAttributes. +SSPI equivalent if this function is QueryContextAttributes\&. .PP .IP "\(bu" 2 -GSS_C_ATTR_STREAM_SIZES data is a gss_context_stream_sizes. +GSS_C_ATTR_STREAM_SIZES data is a gss_context_stream_sizes\&. .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal GSS-API library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_mechs_intro.3 b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_mechs_intro.3 --- a/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_mechs_intro.3 +++ b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_mechs_intro.3 @@ -1,8 +1,9 @@ -.TH "gssapi_mechs_intro" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalGSS-APIlibrary" \" -*- nroff -*- +.TH "gssapi_mechs_intro" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal GSS-API library" \" -*- nroff -*- .ad l .nh .SH NAME gssapi_mechs_intro \- GSS-API mechanisms + .SH "GSS-API mechanisms" .PP .IP "\(bu" 2 diff --git a/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_services_intro.3 b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_services_intro.3 --- a/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_services_intro.3 +++ b/crypto/heimdal/doc/doxyout/gssapi/man/man3/gssapi_services_intro.3 @@ -1,8 +1,9 @@ -.TH "gssapi_services_intro" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalGSS-APIlibrary" \" -*- nroff -*- +.TH "gssapi_services_intro" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal GSS-API library" \" -*- nroff -*- .ad l .nh .SH NAME gssapi_services_intro \- Introduction to GSS-API services + .SH "GSS-API services" .PP .SS "Context creation" diff --git a/crypto/heimdal/doc/doxyout/gssapi/man/man3/internal_v_smechname.3 b/crypto/heimdal/doc/doxyout/gssapi/man/man3/internal_v_smechname.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/gssapi/man/man3/internal_v_smechname.3 @@ -0,0 +1,20 @@ +.TH "internal_v_smechname" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal GSS-API library" \" -*- nroff -*- +.ad l +.nh +.SH NAME +internal_v_smechname \- Internal names and mechanism names + +.SH "Name forms" +.PP +There are two name representations in GSS-API: Internal form and Contiguous string ('flat') form\&. Functions \fBgss_export_name()\fP and \fBgss_import_name()\fP can be used to convert between the two forms\&. +.PP +.IP "\(bu" 2 +The contiguous string form is described by an oid specificing the type and an octet string\&. A special form of the contiguous string form is the exported name object\&. The exported name defined for each mechanism, is something that can be stored and compared later\&. The exported name is what should be used for ACLs comparisons\&. +.IP "\(bu" 2 +The Internal form is opaque to the application programmer and is implementation-dependent\&. +.IP "\(bu" 2 +There is also a special form of the Internal Name (IN), and that is the Mechanism Name (MN)\&. In the mechanism name all the generic information is stripped of and only contain the information for one mechanism\&. In GSS-API some function return MN and some require MN as input\&. Each of these function is marked up as such\&. +.PP +.PP +@FIXME Describe relationship between import_name, canonicalize_name, export_name and friends\&. Also, update for RFC2743 language ('contiguous' and 'flat' are gone, leaving just 'exported name +token', 'internal', and 'MN')\&. diff --git a/crypto/heimdal/doc/doxyout/gssapi/man/man3/internalvsmechname.3 b/crypto/heimdal/doc/doxyout/gssapi/man/man3/internalvsmechname.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/gssapi/man/man3/internalvsmechname.3 +++ /dev/null @@ -1,20 +0,0 @@ -.TH "internalvsmechname" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalGSS-APIlibrary" \" -*- nroff -*- -.ad l -.nh -.SH NAME -internalvsmechname \- Internal names and mechanism names -.SH "Name forms" -.PP -There are two forms of name in GSS-API, Internal form and Contiguous string ('flat') form. gss_export_name() and \fBgss_import_name()\fP can be used to convert between the two forms. -.PP -.IP "\(bu" 2 -The contiguous string form is described by an oid specificing the type and an octet string. A special form of the contiguous string form is the exported name object. The exported name defined for each mechanism, is something that can be stored and complared later. The exported name is what should be used for ACLs comparisons. -.PP -.PP -.IP "\(bu" 2 -The Internal form -.PP -.PP -There is also special form of the Internal Name (IN), and that is the Mechanism Name (MN). In the mechanism name all the generic information is stripped of and only contain the information for one mechanism. In GSS-API some function return MN and some require MN as input. Each of these function is marked up as such. -.PP -Describe relationship between import_name, canonicalize_name, export_name and friends. diff --git a/crypto/heimdal/doc/doxyout/gssapi/manpages b/crypto/heimdal/doc/doxyout/gssapi/manpages --- a/crypto/heimdal/doc/doxyout/gssapi/manpages +++ b/crypto/heimdal/doc/doxyout/gssapi/manpages @@ -1,6 +1,11 @@ -gssapi/man/man3/__gss_c_attr_stream_sizes_oid_desc.3 +gssapi/man/man3/gssapi_services_intro.3 +gssapi/man/man3/gssapi_mechs_intro.3 +gssapi/man/man3/internal_v_smechname.3 +gssapi/man/man3/gssapi.3 gssapi/man/man3/gss_add_oid_set_member.3 gssapi/man/man3/gss_canonicalize_name.3 +gssapi/man/man3/gss_display_status.3 +gssapi/man/man3/gss_export_name.3 gssapi/man/man3/gss_import_name.3 gssapi/man/man3/gss_init_sec_context.3 gssapi/man/man3/gss_inquire_attrs_for_mech.3 @@ -13,7 +18,3 @@ gssapi/man/man3/gss_wrap.3 gssapi/man/man3/gss_wrap_iov.3 gssapi/man/man3/gss_wrap_iov_length.3 -gssapi/man/man3/gssapi.3 -gssapi/man/man3/gssapi_mechs_intro.3 -gssapi/man/man3/gssapi_services_intro.3 -gssapi/man/man3/internalvsmechname.3 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/bc_s.png b/crypto/heimdal/doc/doxyout/hcrypto/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ h3 { - margin-top: 0; +form.search { + margin-bottom: 0px; + margin-top: 0px; } -.directory p { - margin: 0px; - white-space: nowrap; + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.directory div { - display: none; - margin: 0px; +*/ + +td.tiny { + font-size: 75%; } -.directory img { - vertical-align: -30%; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; } -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; + +th.dirtab { + background: #EBEFF6; + font-weight: bold; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; } -.directory-alt > h3 { - margin-top: 0; + +hr.footer { + height: 1px; } -.directory-alt p { - margin: 0px; - white-space: nowrap; + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; } -.directory-alt div { - display: none; - margin: 0px; + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -.directory-alt img { - vertical-align: -30%; + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; } diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/doxygen.png b/crypto/heimdal/doc/doxyout/hcrypto/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tWI!7t@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`JY+|Kdr`d2-(ONuKA& z`@F5@iWMozvyuS-DJG-A!lRSFxj4eVTQ(O*ctC5l23a*NCT zUiG#bpmlC>)R3lz>e?DhO|`RWYpkY-Cv7yZvX=1p<>y~3vO1$fzhC-nV)3CLCmz1P@7CUvliZQpfu5;zp}ugqdu(jz*|T4tKK*%e@vB3o8?nX)G7YEO} zIVfR(?xMlF^f}`rl|s?m#rLFbqVx`xSj&_q(VMc@fTHZh}z-v68l% zry~x%T5iHj^14oBx^J>s?RnyD8<0POU=9lDQOGMB@Qv5Y7jCfG%j{AmV#TMGW1QMw zT#YF!z0x)@dY88&9zIW5@|0`{T~(%oEz)4CmbgKz&?JXM8PbTlGzy_abLK5`U0uI5 zjHCu-UX^?f&14ZFEI#m4m6HGb+pWe9G)EL9oc;V4^!AHAWY)_-0Wh%dA!_pW~AM2 zHZ{sky{TsvhxSG}|Kjt>YpOaDZqKGo-`}a-o=bjEydHSUR%_RxG>Ry*<{c88MP&ug zrltyHjJ>p!JX%>=hAAW0nBi-?hEq>Uc@@s%X-yA@MfsACeNgoN1A!3a_MdBcK263R zpQruAi4!wj!sVHNOf2y}FSc#gM1Zq3XU`YH3(W_aJO(H}DNQ%LguU8tiV}RK z`!2|z88ZfI8$CN%7oV-phP3SL?84r>l*~_CMZ$)pGy< diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/doxygen.svg b/crypto/heimdal/doc/doxyout/hcrypto/html/doxygen.svg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/dynsections.js b/crypto/heimdal/doc/doxyout/hcrypto/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l - -Heimdal crypto library: example_evp_cipher.c - - - -

    -keyhole logo -

    - - - -
    -

    example_evp_cipher.c

    This is an example how to use EVP_CipherInit_ex(), EVP_CipherUpdate() and EVP_CipherFinal_ex().

    -

    /*
    - * Copyright (c) 2008 Kungliga Tekniska Högskolan
    - * (Royal Institute of Technology, Stockholm, Sweden).
    - * All rights reserved.
    - *
    - * Redistribution and use in source and binary forms, with or without
    - * modification, are permitted provided that the following conditions
    - * are met:
    - *
    - * 1. Redistributions of source code must retain the above copyright
    - *    notice, this list of conditions and the following disclaimer.
    - *
    - * 2. Redistributions in binary form must reproduce the above copyright
    - *    notice, this list of conditions and the following disclaimer in the
    - *    documentation and/or other materials provided with the distribution.
    - *
    - * 3. Neither the name of the Institute nor the names of its contributors
    - *    may be used to endorse or promote products derived from this software
    - *    without specific prior written permission.
    - *
    - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
    - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    - * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
    - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    - * SUCH DAMAGE.
    - */
    -
    -#include <krb5-types.h> /* should really be stdint.h */
    -#include <hcrypto/evp.h>
    -
    -#include <stdio.h>
    -#include <stdlib.h>
    -#include <string.h>
    -#include <err.h>
    -#include <assert.h>
    -
    -#include "roken.h"
    -
    -/* key and initial vector */
    -static char key[16] =
    -    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4"
    -    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4";
    -static char ivec[16] =
    -    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4"
    -    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4";
    -
    -static void
    -usage(int exit_code) __attribute__((noreturn));
    -
    -static void
    -usage(int exit_code)
    -{
    -    printf("usage: %s in out\n", getprogname());
    -    exit(exit_code);
    -}
    -
    -
    -int
    -main(int argc, char **argv)
    -{
    -    int encryptp = 1;
    -    const char *ifn = NULL, *ofn = NULL;
    -    FILE *in, *out;
    -    void *ibuf, *obuf;
    -    int ilen, olen;
    -    size_t block_size = 0;
    -    const EVP_CIPHER *c = EVP_aes_128_cbc();
    -    EVP_CIPHER_CTX ctx;
    -    int ret;
    -
    -    setprogname(argv[0]);
    -
    -    if (argc == 2) {
    -        if (strcmp(argv[1], "--version") == 0) {
    -            printf("version");
    -            exit(0);
    -        }
    -        if (strcmp(argv[1], "--help") == 0)
    -            usage(0);
    -        usage(1);
    -    } else if (argc == 4) {
    -        block_size = atoi(argv[1]);
    -        if (block_size == 0)
    -            errx(1, "invalid blocksize %s", argv[1]);
    -        ifn = argv[2];
    -        ofn = argv[3];
    -    } else
    -        usage(1);
    -
    -    in = fopen(ifn, "r");
    -    if (in == NULL)
    -        errx(1, "failed to open input file");
    -    out = fopen(ofn, "w+");
    -    if (out == NULL)
    -        errx(1, "failed to open output file");
    -
    -    /* Check that key and ivec are long enough */
    -    assert(EVP_CIPHER_key_length(c) <= sizeof(key));
    -    assert(EVP_CIPHER_iv_length(c) <= sizeof(ivec));
    -
    -    /*
    -     * Allocate buffer, the output buffer is at least
    -     * EVP_CIPHER_block_size() longer
    -     */
    -    ibuf = malloc(block_size);
    -    obuf = malloc(block_size + EVP_CIPHER_block_size(c));
    -
    -    /*
    -     * Init the memory used for EVP_CIPHER_CTX and set the key and
    -     * ivec.
    -     */
    -    EVP_CIPHER_CTX_init(&ctx);
    -    EVP_CipherInit_ex(&ctx, c, NULL, key, ivec, encryptp);
    -
    -    /* read in buffer */
    -    while ((ilen = fread(ibuf, 1, block_size, in)) > 0) {
    -        /* encrypto/decrypt */
    -        ret = EVP_CipherUpdate(&ctx, obuf, &olen, ibuf, ilen);
    -        if (ret != 1) {
    -            EVP_CIPHER_CTX_cleanup(&ctx);
    -            errx(1, "EVP_CipherUpdate failed");
    -        }
    -        /* write out to output file */
    -        fwrite(obuf, 1, olen, out);
    -    }
    -    /* done reading */
    -    fclose(in);
    -
    -    /* clear up any last bytes left in the output buffer */
    -    ret = EVP_CipherFinal_ex(&ctx, obuf, &olen);
    -    EVP_CIPHER_CTX_cleanup(&ctx);
    -    if (ret != 1)
    -        errx(1, "EVP_CipherFinal_ex failed");
    -
    -    /* write the last bytes out and close */
    -    fwrite(obuf, 1, olen, out);
    -    fclose(out);
    -
    -    return 0;
    -}
    -
    -
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    - - diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/example_evp_cipher_8c-example.html b/crypto/heimdal/doc/doxyout/hcrypto/html/example_evp_cipher_8c-example.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/example_evp_cipher_8c-example.html @@ -0,0 +1,206 @@ + + +example_evp_cipher.c + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    example_evp_cipher.c
    +
    +
    +

    This is an example how to use EVP_CipherInit_ex(), EVP_CipherUpdate() and EVP_CipherFinal_ex().

    +
    /*
    +
    * Copyright (c) 2008 Kungliga Tekniska Högskolan
    +
    * (Royal Institute of Technology, Stockholm, Sweden).
    +
    * All rights reserved.
    +
    *
    +
    * Redistribution and use in source and binary forms, with or without
    +
    * modification, are permitted provided that the following conditions
    +
    * are met:
    +
    *
    +
    * 1. Redistributions of source code must retain the above copyright
    +
    * notice, this list of conditions and the following disclaimer.
    +
    *
    +
    * 2. Redistributions in binary form must reproduce the above copyright
    +
    * notice, this list of conditions and the following disclaimer in the
    +
    * documentation and/or other materials provided with the distribution.
    +
    *
    +
    * 3. Neither the name of the Institute nor the names of its contributors
    +
    * may be used to endorse or promote products derived from this software
    +
    * without specific prior written permission.
    +
    *
    +
    * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
    +
    * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    +
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    +
    * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
    +
    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    +
    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    +
    * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    +
    * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    +
    * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    +
    * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    +
    * SUCH DAMAGE.
    +
    */
    +
    +
    #include <config.h>
    +
    #include <roken.h>
    +
    +
    #include <krb5-types.h> /* should really be stdint.h */
    +
    #include <hcrypto/evp.h>
    +
    #include <hcrypto/evp-pkcs11.h>
    +
    #ifdef __APPLE__
    +
    #include <hcrypto/evp-cc.h>
    +
    #endif
    +
    #ifdef _WIN32
    +
    #include <hcrypto/evp-w32.h>
    +
    #endif
    +
    +
    #include <err.h>
    +
    #include <assert.h>
    +
    +
    /* key and initial vector */
    +
    static char key[16] =
    +
    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4"
    +
    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4";
    +
    static char ivec[16] =
    +
    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4"
    +
    "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4";
    +
    +
    static void
    +
    usage(int exit_code) __attribute__((noreturn));
    +
    +
    static void
    +
    usage(int exit_code)
    +
    {
    +
    printf("usage: %s in out [pkcs11 | cc | w32]\n", getprogname());
    +
    exit(exit_code);
    +
    }
    +
    +
    +
    int
    +
    main(int argc, char **argv)
    +
    {
    +
    int encryptp = 1;
    +
    const char *ifn = NULL, *ofn = NULL;
    +
    FILE *in, *out;
    +
    void *ibuf, *obuf;
    +
    int ilen, olen;
    +
    size_t block_size = 0;
    +
    const EVP_CIPHER *c = EVP_aes_128_cbc();
    +
    EVP_CIPHER_CTX ctx;
    +
    int ret;
    +
    +
    setprogname(argv[0]);
    +
    +
    if (argc == 2) {
    +
    if (strcmp(argv[1], "--version") == 0) {
    +
    printf("version");
    +
    exit(0);
    +
    }
    +
    if (strcmp(argv[1], "--help") == 0)
    +
    usage(0);
    +
    usage(1);
    +
    } else if (argc == 4 || argc == 5) {
    +
    block_size = atoi(argv[1]);
    +
    if (block_size == 0)
    +
    errx(1, "invalid blocksize %s", argv[1]);
    +
    ifn = argv[2];
    +
    ofn = argv[3];
    +
    if (argc == 5) {
    +
    if (strcmp(argv[4], "pkcs11") == 0)
    +
    c = hc_EVP_pkcs11_aes_128_cbc();
    +
    #ifdef __APPLE__
    +
    else if (strcmp(argv[4], "cc") == 0)
    +
    c = hc_EVP_cc_aes_128_cbc();
    +
    #endif
    +
    #ifdef _WIN32
    +
    else if (strcmp(argv[4], "w32") == 0)
    +
    c = hc_EVP_w32crypto_aes_128_cbc();
    +
    #endif
    +
    else
    +
    usage(1);
    +
    }
    +
    } else
    +
    usage(1);
    +
    +
    in = fopen(ifn, "r");
    +
    if (in == NULL)
    +
    errx(1, "failed to open input file");
    +
    out = fopen(ofn, "w+");
    +
    if (out == NULL)
    +
    errx(1, "failed to open output file");
    +
    +
    /* Check that key and ivec are long enough */
    +
    assert(EVP_CIPHER_key_length(c) <= sizeof(key));
    +
    assert(EVP_CIPHER_iv_length(c) <= sizeof(ivec));
    +
    +
    /*
    +
    * Allocate buffer, the output buffer is at least
    +
    * EVP_CIPHER_block_size() longer
    +
    */
    +
    ibuf = malloc(block_size);
    +
    obuf = malloc(block_size + EVP_CIPHER_block_size(c));
    +
    +
    /*
    +
    * Init the memory used for EVP_CIPHER_CTX and set the key and
    +
    * ivec.
    +
    */
    + +
    EVP_CipherInit_ex(&ctx, c, NULL, key, ivec, encryptp);
    +
    +
    /* read in buffer */
    +
    while ((ilen = fread(ibuf, 1, block_size, in)) > 0) {
    +
    /* encrypto/decrypt */
    +
    ret = EVP_CipherUpdate(&ctx, obuf, &olen, ibuf, ilen);
    +
    if (ret != 1) {
    + +
    errx(1, "EVP_CipherUpdate failed");
    +
    }
    +
    /* write out to output file */
    +
    fwrite(obuf, 1, olen, out);
    +
    }
    +
    /* done reading */
    +
    fclose(in);
    +
    +
    /* clear up any last bytes left in the output buffer */
    +
    ret = EVP_CipherFinal_ex(&ctx, obuf, &olen);
    + +
    if (ret != 1)
    +
    errx(1, "EVP_CipherFinal_ex failed");
    +
    +
    /* write the last bytes out and close */
    +
    fwrite(obuf, 1, olen, out);
    +
    fclose(out);
    +
    +
    return 0;
    +
    }
    +
    void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *c)
    Definition: evp.c:570
    +
    const EVP_CIPHER * EVP_aes_128_cbc(void)
    Definition: evp.c:1153
    +
    size_t EVP_CIPHER_block_size(const EVP_CIPHER *c)
    Definition: evp.c:523
    +
    size_t EVP_CIPHER_key_length(const EVP_CIPHER *c)
    Definition: evp.c:539
    +
    int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, void *out, int *outlen)
    Definition: evp.c:939
    +
    size_t EVP_CIPHER_iv_length(const EVP_CIPHER *c)
    Definition: evp.c:555
    +
    int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, void *out, int *outlen, void *in, size_t inlen)
    Definition: evp.c:853
    +
    int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *c, ENGINE *engine, const void *key, const void *iv, int encp)
    Definition: evp.c:775
    +
    int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
    Definition: evp.c:586
    +
    +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/examples.html b/crypto/heimdal/doc/doxyout/hcrypto/html/examples.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/examples.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/examples.html @@ -1,6 +1,6 @@ -Heimdal crypto library: Examples +Examples @@ -8,22 +8,28 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Examples
    +
    -

    Examples

    Here is a list of all examples:
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/folderclosed.png b/crypto/heimdal/doc/doxyout/hcrypto/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zc$@)f0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ -Heimdal crypto library: Graph Legend +Graph Legend @@ -8,68 +8,71 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Graph Legend
    +
    -

    Graph Legend

    This page explains how to interpret the graphs that are generated by doxygen.

    -Consider the following example:

    /*! Invisible class because of truncation */
    -class Invisible { };
    -
    -/*! Truncated class, inheritance relation is hidden */
    -class Truncated : public Invisible { };
    -
    -/* Class not documented with doxygen comments */
    -class Undocumented { };
    -
    -/*! Class that is inherited using public inheritance */
    -class PublicBase : public Truncated { };
    -
    -/*! A template class */
    -template<class T> class Templ { };
    -
    -/*! Class that is inherited using protected inheritance */
    -class ProtectedBase { };
    -
    -/*! Class that is inherited using private inheritance */
    -class PrivateBase { };
    -
    -/*! Class that is used by the Inherited class */
    -class Used { };
    -
    -/*! Super class that inherits a number of other classes */
    -class Inherited : public PublicBase,
    -                  protected ProtectedBase,
    -                  private PrivateBase,
    -                  public Undocumented,
    -                  public Templ<int>
    -{
    -  private:
    -    Used *m_usedClass;
    -};
    -
    If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

    -

    -graph_legend.png -
    -

    -The boxes in the above graph have the following meaning:

      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      +
      class Invisible { };
      +
      +
      /*! Truncated class, inheritance relation is hidden */
      +
      class Truncated : public Invisible { };
      +
      +
      /* Class not documented with doxygen comments */
      +
      class Undocumented { };
      +
      +
      /*! Class that is inherited using public inheritance */
      +
      class PublicBase : public Truncated { };
      +
      +
      /*! A template class */
      +
      template<class T> class Templ { };
      +
      +
      /*! Class that is inherited using protected inheritance */
      +
      class ProtectedBase { };
      +
      +
      /*! Class that is inherited using private inheritance */
      +
      class PrivateBase { };
      +
      +
      /*! Class that is used by the Inherited class */
      +
      class Used { };
      +
      +
      /*! Super class that inherits a number of other classes */
      +
      class Inherited : public PublicBase,
      +
      protected ProtectedBase,
      +
      private PrivateBase,
      +
      public Undocumented,
      +
      public Templ<int>
      +
      {
      +
      private:
      +
      Used *m_usedClass;
      +
      };
      +

      This will result in the following graph:

      +

      The boxes in the above graph have the following meaning:

      +
      • A filled gray box represents the struct or class for which the graph is generated.
      • A box with a black border denotes a documented struct or class.
      • -A box with a grey border denotes an undocumented struct or class.
      • +A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -The arrows have the following meaning:
        +

        The arrows have the following meaning:

        +
        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • @@ -77,12 +80,12 @@
        • A dark red arrow is used for private inheritance.
        • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
        • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
        -
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.dot b/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.dot deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G -{ - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.png b/crypto/heimdal/doc/doxyout/hcrypto/html/graph_legend.png index 9b96937bfd5f7a36ea8dbf2d64ed1bc0768f074d..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 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 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__core.html b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__core.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__core.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__core.html @@ -1,6 +1,6 @@ -Heimdal crypto library: hcrypto function controlling behavior +hcrypto function controlling behavior @@ -8,183 +8,187 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hcrypto function controlling behavior
    +
    -

    hcrypto function controlling behavior

    - - - - - - - - - - - - +

    Functions

    int EVP_CIPHER_CTX_rand_key (EVP_CIPHER_CTX *ctx, void *key)
    int EVP_CIPHER_CTX_ctrl (EVP_CIPHER_CTX *ctx, int type, int arg, void *data)
    void OpenSSL_add_all_algorithms (void)
    void OpenSSL_add_all_algorithms_conf (void)
    void OpenSSL_add_all_algorithms_noconf (void)
    + + + + + + + + + + +

    +Functions

    int EVP_CIPHER_CTX_rand_key (EVP_CIPHER_CTX *ctx, void *key)
     
    int EVP_CIPHER_CTX_ctrl (EVP_CIPHER_CTX *ctx, int type, int arg, void *data)
     
    void OpenSSL_add_all_algorithms (void)
     
    void OpenSSL_add_all_algorithms_conf (void)
     
    void OpenSSL_add_all_algorithms_noconf (void)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ EVP_CIPHER_CTX_ctrl()

    +
    - + - - + + - - + + - - + + - - + + - +
    int EVP_CIPHER_CTX_ctrl int EVP_CIPHER_CTX_ctrl (EVP_CIPHER_CTX *  ctx, EVP_CIPHER_CTX * ctx,
    int  type, int type,
    int  arg, int arg,
    void *  data void * data 
    )
    -
    -
    - -

    -Perform a operation on a ctx

    -

    Parameters:
    - - - - - +
    +

    Perform a operation on a ctx

    +
    Parameters
    +
    ctx context to perform operation on.
    type type of operation.
    arg argument to operation.
    data addition data to operation.
    + + + +
    ctxcontext to perform operation on.
    typetype of operation.
    argargument to operation.
    dataaddition data to operation.
    +
    -
    Returns:
    1 for success, 0 for failure.
    +
    Returns
    1 for success, 0 for failure.
    -

    - +

    + +

    ◆ EVP_CIPHER_CTX_rand_key()

    +
    - + - - + + - - + + - +
    int EVP_CIPHER_CTX_rand_key int EVP_CIPHER_CTX_rand_key (EVP_CIPHER_CTX *  ctx, EVP_CIPHER_CTX * ctx,
    void *  key void * key 
    )
    -
    -
    - -

    -Generate a random key for the specificed EVP_CIPHER.

    -

    Parameters:
    - - - +
    +

    Generate a random key for the specificed EVP_CIPHER.

    +
    Parameters
    +
    ctx EVP_CIPHER_CTX type to build the key for.
    key return key, must be at least EVP_CIPHER_key_length() byte long.
    + +
    ctxEVP_CIPHER_CTX type to build the key for.
    keyreturn key, must be at least EVP_CIPHER_key_length() byte long.
    +
    -
    Returns:
    1 for success, 0 for failure.
    +
    Returns
    1 for success, 0 for failure.
    -

    - + + +

    ◆ OpenSSL_add_all_algorithms()

    +
    - + - - - + +
    void OpenSSL_add_all_algorithms void OpenSSL_add_all_algorithms (void   ) void )
    -
    -
    +
    +

    Add all algorithms to the crypto core.

    -

    -Add all algorithms to the crypto core.

    -

    - + + +

    ◆ OpenSSL_add_all_algorithms_conf()

    +
    - + - - - + +
    void OpenSSL_add_all_algorithms_conf void OpenSSL_add_all_algorithms_conf (void   ) void )
    -
    -
    +
    +

    Add all algorithms to the crypto core using configuration file.

    -

    -Add all algorithms to the crypto core using configuration file.

    -

    - + + +

    ◆ OpenSSL_add_all_algorithms_noconf()

    +
    - + - - - + +
    void OpenSSL_add_all_algorithms_noconf void OpenSSL_add_all_algorithms_noconf (void   ) void )
    -
    -
    +
    +

    Add all algorithms to the crypto core, but don't use the configuration file.

    -

    -Add all algorithms to the crypto core, but don't use the configuration file.

    -

    +


    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__des.html b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__des.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__des.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__des.html @@ -1,6 +1,6 @@ -Heimdal crypto library: DES crypto functions +DES crypto functions @@ -8,903 +8,905 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    DES crypto functions
    +
    -

    DES crypto functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    void DES_set_odd_parity (DES_cblock *key)
    int HC_DEPRECATED DES_check_key_parity (DES_cblock *key)
    int DES_is_weak_key (DES_cblock *key)
    int HC_DEPRECATED DES_set_key (DES_cblock *key, DES_key_schedule *ks)
    int DES_set_key_unchecked (DES_cblock *key, DES_key_schedule *ks)
    int DES_set_key_checked (DES_cblock *key, DES_key_schedule *ks)
    int DES_key_sched (DES_cblock *key, DES_key_schedule *ks)
    void DES_encrypt (uint32_t u[2], DES_key_schedule *ks, int encp)
    void DES_ecb_encrypt (DES_cblock *input, DES_cblock *output, DES_key_schedule *ks, int encp)
    void DES_cbc_encrypt (const void *in, void *out, long length, DES_key_schedule *ks, DES_cblock *iv, int encp)
    void DES_pcbc_encrypt (const void *in, void *out, long length, DES_key_schedule *ks, DES_cblock *iv, int encp)
    void DES_ecb3_encrypt (DES_cblock *input, DES_cblock *output, DES_key_schedule *ks1, DES_key_schedule *ks2, DES_key_schedule *ks3, int encp)
    void DES_ede3_cbc_encrypt (const void *in, void *out, long length, DES_key_schedule *ks1, DES_key_schedule *ks2, DES_key_schedule *ks3, DES_cblock *iv, int encp)
    void DES_cfb64_encrypt (const void *in, void *out, long length, DES_key_schedule *ks, DES_cblock *iv, int *num, int encp)
    uint32_t DES_cbc_cksum (const void *in, DES_cblock *output, long length, DES_key_schedule *ks, DES_cblock *iv)
    void DES_string_to_key (const char *str, DES_cblock *key)
    int HC_DEPRECATED DES_new_random_key (DES_cblock *key)
    void HC_DEPRECATED DES_init_random_number_generator (DES_cblock *seed)
    void HC_DEPRECATED DES_random_key (DES_cblock *key)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void DES_set_odd_parity (DES_cblock *key)
     
    int HC_DEPRECATED DES_check_key_parity (DES_cblock *key)
     
    int DES_is_weak_key (DES_cblock *key)
     
    int HC_DEPRECATED DES_set_key (DES_cblock *key, DES_key_schedule *ks)
     
    int DES_set_key_unchecked (DES_cblock *key, DES_key_schedule *ks)
     
    int DES_set_key_checked (DES_cblock *key, DES_key_schedule *ks)
     
    int DES_key_sched (DES_cblock *key, DES_key_schedule *ks)
     
    void DES_encrypt (uint32_t u[2], DES_key_schedule *ks, int encp)
     
    void DES_ecb_encrypt (DES_cblock *input, DES_cblock *output, DES_key_schedule *ks, int encp)
     
    void DES_cbc_encrypt (const void *in, void *out, long length, DES_key_schedule *ks, DES_cblock *iv, int encp)
     
    void DES_pcbc_encrypt (const void *in, void *out, long length, DES_key_schedule *ks, DES_cblock *iv, int encp)
     
    void DES_ecb3_encrypt (DES_cblock *input, DES_cblock *output, DES_key_schedule *ks1, DES_key_schedule *ks2, DES_key_schedule *ks3, int encp)
     
    void DES_ede3_cbc_encrypt (const void *in, void *out, long length, DES_key_schedule *ks1, DES_key_schedule *ks2, DES_key_schedule *ks3, DES_cblock *iv, int encp)
     
    void DES_cfb64_encrypt (const void *in, void *out, long length, DES_key_schedule *ks, DES_cblock *iv, int *num, int encp)
     
    uint32_t DES_cbc_cksum (const void *in, DES_cblock *output, long length, DES_key_schedule *ks, DES_cblock *iv)
     
    void DES_string_to_key (const char *str, DES_cblock *key)
     
    int HC_DEPRECATED DES_new_random_key (DES_cblock *key)
     
    void HC_DEPRECATED DES_init_random_number_generator (DES_cblock *seed)
     
    void HC_DEPRECATED DES_random_key (DES_cblock *key)
     
    -

    Detailed Description

    -See the DES - Data Encryption Standard crypto interface for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the DES - Data Encryption Standard crypto interface for description and examples.

    +

    Function Documentation

    + +

    ◆ DES_cbc_cksum()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    uint32_t DES_cbc_cksum uint32_t DES_cbc_cksum (const void *  in, const void * in,
    DES_cblock *  output, DES_cblock * output,
    long  length, long length,
    DES_key_schedule *  ks, DES_key_schedule * ks,
    DES_cblock *  iv DES_cblock * iv 
    )
    -
    -
    - -

    -Crete a checksum using DES in CBC encryption mode. This mode is only used for Kerberos 4, and it should stay that way.

    -The IV must always be diffrent for diffrent input data blocks.

    -

    Parameters:
    - - - - - - +
    +

    Crete a checksum using DES in CBC encryption mode. This mode is only used for Kerberos 4, and it should stay that way.

    +

    The IV must always be diffrent for diffrent input data blocks.

    +
    Parameters
    +
    in data to checksum
    output the checksum
    length length of data
    ks key schedule to use
    iv initial vector to use
    + + + + +
    indata to checksum
    outputthe checksum
    lengthlength of data
    kskey schedule to use
    ivinitial vector to use
    +
    -

    - +

    + +

    ◆ DES_cbc_encrypt()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    void DES_cbc_encrypt void DES_cbc_encrypt (const void *  in, const void * in,
    void *  out, void * out,
    long  length, long length,
    DES_key_schedule *  ks, DES_key_schedule * ks,
    DES_cblock *  iv, DES_cblock * iv,
    int  encp int encp 
    )
    -
    -
    - -

    -Encrypt/decrypt a block using DES in Chain Block Cipher mode (cbc).

    -The IV must always be diffrent for diffrent input data blocks.

    -

    Parameters:
    - - - - - - - +
    +

    Encrypt/decrypt a block using DES in Chain Block Cipher mode (cbc).

    +

    The IV must always be diffrent for diffrent input data blocks.

    +
    Parameters
    +
    in data to encrypt
    out data to encrypt
    length length of data
    ks key schedule to use
    iv initial vector to use
    encp if non zero, encrypt. if zero, decrypt.
    + + + + + +
    indata to encrypt
    outdata to encrypt
    lengthlength of data
    kskey schedule to use
    ivinitial vector to use
    encpif non zero, encrypt. if zero, decrypt.
    +
    -

    - + + +

    ◆ DES_cfb64_encrypt()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    void DES_cfb64_encrypt void DES_cfb64_encrypt (const void *  in, const void * in,
    void *  out, void * out,
    long  length, long length,
    DES_key_schedule *  ks, DES_key_schedule * ks,
    DES_cblock *  iv, DES_cblock * iv,
    int *  num, int * num,
    int  encp int encp 
    )
    -
    -
    - -

    -Encrypt/decrypt using DES in cipher feedback mode with 64 bit feedback.

    -The IV must always be diffrent for diffrent input data blocks.

    -

    Parameters:
    - - - - - - - - +
    +

    Encrypt/decrypt using DES in cipher feedback mode with 64 bit feedback.

    +

    The IV must always be diffrent for diffrent input data blocks.

    +
    Parameters
    +
    in data to encrypt
    out data to encrypt
    length length of data
    ks key schedule to use
    iv initial vector to use
    num offset into in cipher block encryption/decryption stop last time.
    encp if non zero, encrypt. if zero, decrypt.
    + + + + + + +
    indata to encrypt
    outdata to encrypt
    lengthlength of data
    kskey schedule to use
    ivinitial vector to use
    numoffset into in cipher block encryption/decryption stop last time.
    encpif non zero, encrypt. if zero, decrypt.
    +
    -

    - + + +

    ◆ DES_check_key_parity()

    +
    - + - - - + +
    int HC_DEPRECATED DES_check_key_parity int HC_DEPRECATED DES_check_key_parity (DES_cblock *  key  ) DES_cblock * key)
    -
    -
    - -

    -Check if the key have correct parity.

    -

    Parameters:
    - - +
    +

    Check if the key have correct parity.

    +
    Parameters
    +
    key key to check the parity.
    +
    keykey to check the parity.
    +
    -
    Returns:
    1 on success, 0 on failure.
    +
    Returns
    1 on success, 0 on failure.
    -

    - + + +

    ◆ DES_ecb3_encrypt()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    void DES_ecb3_encrypt void DES_ecb3_encrypt (DES_cblock *  input, DES_cblock * input,
    DES_cblock *  output, DES_cblock * output,
    DES_key_schedule *  ks1, DES_key_schedule * ks1,
    DES_key_schedule *  ks2, DES_key_schedule * ks2,
    DES_key_schedule *  ks3, DES_key_schedule * ks3,
    int  encp int encp 
    )
    -
    -
    - -

    -Encrypt/decrypt a block using triple DES using EDE mode, encrypt/decrypt/encrypt.

    -

    Parameters:
    - - - - - - - +
    +

    Encrypt/decrypt a block using triple DES using EDE mode, encrypt/decrypt/encrypt.

    +
    Parameters
    +
    input data to encrypt
    output data to encrypt
    ks1 key schedule to use
    ks2 key schedule to use
    ks3 key schedule to use
    encp if non zero, encrypt. if zero, decrypt.
    + + + + + +
    inputdata to encrypt
    outputdata to encrypt
    ks1key schedule to use
    ks2key schedule to use
    ks3key schedule to use
    encpif non zero, encrypt. if zero, decrypt.
    +
    -

    - + + +

    ◆ DES_ecb_encrypt()

    +
    - + - - + + - - + + - - + + - - + + - +
    void DES_ecb_encrypt void DES_ecb_encrypt (DES_cblock *  input, DES_cblock * input,
    DES_cblock *  output, DES_cblock * output,
    DES_key_schedule *  ks, DES_key_schedule * ks,
    int  encp int encp 
    )
    -
    -
    - -

    -Encrypt/decrypt a block using DES.

    -

    Parameters:
    - - - - - +
    +

    Encrypt/decrypt a block using DES.

    +
    Parameters
    +
    input data to encrypt
    output data to encrypt
    ks key schedule to use
    encp if non zero, encrypt. if zero, decrypt.
    + + + +
    inputdata to encrypt
    outputdata to encrypt
    kskey schedule to use
    encpif non zero, encrypt. if zero, decrypt.
    +
    -

    - + + +

    ◆ DES_ede3_cbc_encrypt()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    void DES_ede3_cbc_encrypt void DES_ede3_cbc_encrypt (const void *  in, const void * in,
    void *  out, void * out,
    long  length, long length,
    DES_key_schedule *  ks1, DES_key_schedule * ks1,
    DES_key_schedule *  ks2, DES_key_schedule * ks2,
    DES_key_schedule *  ks3, DES_key_schedule * ks3,
    DES_cblock *  iv, DES_cblock * iv,
    int  encp int encp 
    )
    -
    -
    - -

    -Encrypt/decrypt using Triple DES in Chain Block Cipher mode (cbc).

    -The IV must always be diffrent for diffrent input data blocks.

    -

    Parameters:
    - - - - - - - - - +
    +

    Encrypt/decrypt using Triple DES in Chain Block Cipher mode (cbc).

    +

    The IV must always be diffrent for diffrent input data blocks.

    +
    Parameters
    +
    in data to encrypt
    out data to encrypt
    length length of data
    ks1 key schedule to use
    ks2 key schedule to use
    ks3 key schedule to use
    iv initial vector to use
    encp if non zero, encrypt. if zero, decrypt.
    + + + + + + + +
    indata to encrypt
    outdata to encrypt
    lengthlength of data
    ks1key schedule to use
    ks2key schedule to use
    ks3key schedule to use
    ivinitial vector to use
    encpif non zero, encrypt. if zero, decrypt.
    +
    -

    - + + +

    ◆ DES_encrypt()

    +
    - + - - + + - - + + - - + + - +
    void DES_encrypt void DES_encrypt (uint32_t  u[2], uint32_t u[2],
    DES_key_schedule *  ks, DES_key_schedule * ks,
    int  encp int encp 
    )
    -
    -
    - -

    -Encrypt/decrypt a block using DES. Also called ECB mode

    -

    Parameters:
    - - - - +
    +

    Encrypt/decrypt a block using DES. Also called ECB mode

    +
    Parameters
    +
    u data to encrypt
    ks key schedule to use
    encp if non zero, encrypt. if zero, decrypt.
    + + +
    udata to encrypt
    kskey schedule to use
    encpif non zero, encrypt. if zero, decrypt.
    +
    -

    - + + +

    ◆ DES_init_random_number_generator()

    +
    - + - - - + +
    void HC_DEPRECATED DES_init_random_number_generator void HC_DEPRECATED DES_init_random_number_generator (DES_cblock *  seed  ) DES_cblock * seed)
    -
    -
    - -

    -Seed the random number generator. Deprecated, use RAND - random number

    -

    Parameters:
    - - +
    +

    Seed the random number generator. Deprecated, use RAND - random number

    +
    Parameters
    +
    seed a seed to seed that random number generate with.
    +
    seeda seed to seed that random number generate with.
    +
    -

    - + + +

    ◆ DES_is_weak_key()

    +
    - + - - - + +
    int DES_is_weak_key int DES_is_weak_key (DES_cblock *  key  ) DES_cblock * key)
    -
    -
    - -

    -Checks if the key is any of the weaks keys that makes DES attacks trival.

    -

    Parameters:
    - - +
    +

    Checks if the key is any of the weaks keys that makes DES attacks trival.

    +
    Parameters
    +
    key key to check.
    +
    keykey to check.
    +
    -
    Returns:
    1 if the key is weak, 0 otherwise.
    +
    Returns
    1 if the key is weak, 0 otherwise.
    -

    - + + +

    ◆ DES_key_sched()

    +
    - + - - + + - - + + - +
    int DES_key_sched int DES_key_sched (DES_cblock *  key, DES_cblock * key,
    DES_key_schedule *  ks DES_key_schedule * ks 
    )
    -
    -
    - -

    -Compatibility function for eay libdes, works just like DES_set_key_checked().

    -

    Parameters:
    - - - +
    +

    Compatibility function for eay libdes, works just like DES_set_key_checked().

    +
    Parameters
    +
    key a key to initialize the key schedule with.
    ks a key schedule to initialize.
    + +
    keya key to initialize the key schedule with.
    ksa key schedule to initialize.
    +
    -
    Returns:
    0 on success, -1 on invalid parity, -2 on weak key.
    +
    Returns
    0 on success, -1 on invalid parity, -2 on weak key.
    -

    - + + +

    ◆ DES_new_random_key()

    +
    - + - - - + +
    int HC_DEPRECATED DES_new_random_key int HC_DEPRECATED DES_new_random_key (DES_cblock *  key  ) DES_cblock * key)
    -
    -
    - -

    -Generate a random des key using a random block, fixup parity and skip weak keys.

    -

    Parameters:
    - - +
    +

    Generate a random des key using a random block, fixup parity and skip weak keys.

    +
    Parameters
    +
    key is set to a random key.
    +
    keyis set to a random key.
    +
    -
    Returns:
    0 on success, non zero on random number generator failure.
    +
    Returns
    0 on success, non zero on random number generator failure.
    -

    - + + +

    ◆ DES_pcbc_encrypt()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    void DES_pcbc_encrypt void DES_pcbc_encrypt (const void *  in, const void * in,
    void *  out, void * out,
    long  length, long length,
    DES_key_schedule *  ks, DES_key_schedule * ks,
    DES_cblock *  iv, DES_cblock * iv,
    int  encp int encp 
    )
    -
    -
    - -

    -Encrypt/decrypt a block using DES in Propagating Cipher Block Chaining mode. This mode is only used for Kerberos 4, and it should stay that way.

    -The IV must always be diffrent for diffrent input data blocks.

    -

    Parameters:
    - - - - - - - +
    +

    Encrypt/decrypt a block using DES in Propagating Cipher Block Chaining mode. This mode is only used for Kerberos 4, and it should stay that way.

    +

    The IV must always be diffrent for diffrent input data blocks.

    +
    Parameters
    +
    in data to encrypt
    out data to encrypt
    length length of data
    ks key schedule to use
    iv initial vector to use
    encp if non zero, encrypt. if zero, decrypt.
    + + + + + +
    indata to encrypt
    outdata to encrypt
    lengthlength of data
    kskey schedule to use
    ivinitial vector to use
    encpif non zero, encrypt. if zero, decrypt.
    +
    -

    - + + +

    ◆ DES_random_key()

    +
    - + - - - + +
    void HC_DEPRECATED DES_random_key void HC_DEPRECATED DES_random_key (DES_cblock *  key  ) DES_cblock * key)
    -
    -
    - -

    -Generate a random key, deprecated since it doesn't return an error code, use DES_new_random_key().

    -

    Parameters:
    - - +
    +

    Generate a random key, deprecated since it doesn't return an error code, use DES_new_random_key().

    +
    Parameters
    +
    key is set to a random key.
    +
    keyis set to a random key.
    +
    -

    - + + +

    ◆ DES_set_key()

    +
    - + - - + + - - + + - +
    int HC_DEPRECATED DES_set_key int HC_DEPRECATED DES_set_key (DES_cblock *  key, DES_cblock * key,
    DES_key_schedule *  ks DES_key_schedule * ks 
    )
    -
    -
    - -

    -Setup a des key schedule from a key. Deprecated function, use DES_set_key_unchecked() or DES_set_key_checked() instead.

    -

    Parameters:
    - - - +
    +

    Setup a des key schedule from a key. Deprecated function, use DES_set_key_unchecked() or DES_set_key_checked() instead.

    +
    Parameters
    +
    key a key to initialize the key schedule with.
    ks a key schedule to initialize.
    + +
    keya key to initialize the key schedule with.
    ksa key schedule to initialize.
    +
    -
    Returns:
    0 on success
    +
    Returns
    0 on success
    -

    - + + +

    ◆ DES_set_key_checked()

    +
    - + - - + + - - + + - +
    int DES_set_key_checked int DES_set_key_checked (DES_cblock *  key, DES_cblock * key,
    DES_key_schedule *  ks DES_key_schedule * ks 
    )
    -
    -
    - -

    -Just like DES_set_key_unchecked() except checking that the key is not weak for or have correct parity.

    -

    Parameters:
    - - - +
    +

    Just like DES_set_key_unchecked() except checking that the key is not weak for or have correct parity.

    +
    Parameters
    +
    key a key to initialize the key schedule with.
    ks a key schedule to initialize.
    + +
    keya key to initialize the key schedule with.
    ksa key schedule to initialize.
    +
    -
    Returns:
    0 on success, -1 on invalid parity, -2 on weak key.
    +
    Returns
    0 on success, -1 on invalid parity, -2 on weak key.
    -

    - + + +

    ◆ DES_set_key_unchecked()

    +
    - + - - + + - - + + - +
    int DES_set_key_unchecked int DES_set_key_unchecked (DES_cblock *  key, DES_cblock * key,
    DES_key_schedule *  ks DES_key_schedule * ks 
    )
    -
    -
    - -

    -Setup a des key schedule from a key. The key is no longer needed after this transaction and can cleared.

    -Does NOT check that the key is weak for or have wrong parity.

    -

    Parameters:
    - - - +
    +

    Setup a des key schedule from a key. The key is no longer needed after this transaction and can cleared.

    +

    Does NOT check that the key is weak for or have wrong parity.

    +
    Parameters
    +
    key a key to initialize the key schedule with.
    ks a key schedule to initialize.
    + +
    keya key to initialize the key schedule with.
    ksa key schedule to initialize.
    +
    -
    Returns:
    0 on success
    +
    Returns
    0 on success
    -

    - + + +

    ◆ DES_set_odd_parity()

    +
    - + - - - + +
    void DES_set_odd_parity void DES_set_odd_parity (DES_cblock *  key  ) DES_cblock * key)
    -
    -
    - -

    -Set the parity of the key block, used to generate a des key from a random key. See DES key generation.

    -

    Parameters:
    - - +
    +

    Set the parity of the key block, used to generate a des key from a random key. See DES key generation.

    +
    Parameters
    +
    key key to fixup the parity for.
    +
    keykey to fixup the parity for.
    +
    -

    - + + +

    ◆ DES_string_to_key()

    +
    - + - - + + - - + + - +
    void DES_string_to_key void DES_string_to_key (const char *  str, const char * str,
    DES_cblock *  key DES_cblock * key 
    )
    -
    -
    - -

    -Convert a string to a DES key. Use something like PKCS5_PBKDF2_HMAC_SHA1() to create key from passwords.

    -

    Parameters:
    - - - +
    +

    Convert a string to a DES key. Use something like PKCS5_PBKDF2_HMAC_SHA1() to create key from passwords.

    +
    Parameters
    +
    str The string to convert to a key
    key the resulting key
    + +
    strThe string to convert to a key
    keythe resulting key
    +
    -

    +


    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__dh.html b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__dh.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__dh.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__dh.html @@ -1,6 +1,6 @@ -Heimdal crypto library: Diffie-Hellman functions +Diffie-Hellman functions @@ -8,574 +8,562 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Diffie-Hellman functions
    +
    -

    Diffie-Hellman functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    const DH_METHOD * DH_ltm_method (void)
    DH * DH_new (void)
    DH * DH_new_method (ENGINE *engine)
    void DH_free (DH *dh)
    int DH_up_ref (DH *dh)
    int DH_size (const DH *dh)
    int DH_set_ex_data (DH *dh, int idx, void *data)
    void * DH_get_ex_data (DH *dh, int idx)
    int DH_generate_parameters_ex (DH *dh, int prime_len, int generator, BN_GENCB *cb)
    int DH_check_pubkey (const DH *dh, const BIGNUM *pub_key, int *codes)
    int DH_generate_key (DH *dh)
    int DH_compute_key (unsigned char *shared_key, const BIGNUM *peer_pub_key, DH *dh)
    int DH_set_method (DH *dh, const DH_METHOD *method)
    const DH_METHOD * DH_null_method (void)
    void DH_set_default_method (const DH_METHOD *meth)
    const DH_METHOD * DH_get_default_method (void)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    const DH_METHOD * DH_ltm_method (void)
     
    DH * DH_new (void)
     
    DH * DH_new_method (ENGINE *engine)
     
    void DH_free (DH *dh)
     
    int DH_up_ref (DH *dh)
     
    int DH_size (const DH *dh)
     
    int DH_set_ex_data (DH *dh, int idx, void *data)
     
    void * DH_get_ex_data (DH *dh, int idx)
     
    int DH_generate_parameters_ex (DH *dh, int prime_len, int generator, BN_GENCB *cb)
     
    int DH_check_pubkey (const DH *dh, const BIGNUM *pub_key, int *codes)
     
    int DH_generate_key (DH *dh)
     
    int DH_compute_key (unsigned char *shared_key, const BIGNUM *peer_pub_key, DH *dh)
     
    int DH_set_method (DH *dh, const DH_METHOD *method)
     
    const DH_METHOD * DH_null_method (void)
     
    void DH_set_default_method (const DH_METHOD *meth)
     
    const DH_METHOD * DH_get_default_method (void)
     
    -

    Detailed Description

    -See the DH - Diffie-Hellman key exchange for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the DH - Diffie-Hellman key exchange for description and examples.

    +

    Function Documentation

    + +

    ◆ DH_check_pubkey()

    +
    - + - - + + - - + + - - + + - +
    int DH_check_pubkey int DH_check_pubkey (const DH *  dh, const DH * dh,
    const BIGNUM *  pub_key, const BIGNUM * pub_key,
    int *  codes int * codes 
    )
    -
    -
    - -

    -Check that the public key is sane.

    -

    Parameters:
    - - - - +
    +

    Check that the public key is sane.

    +
    Parameters
    +
    dh the local peer DH parameters.
    pub_key the remote peer public key parameters.
    codes return that the failures of the pub_key are.
    + + +
    dhthe local peer DH parameters.
    pub_keythe remote peer public key parameters.
    codesreturn that the failures of the pub_key are.
    +
    -
    Returns:
    1 on success, 0 on failure and *codes is set the the combined fail check for the public key
    - -

    -Checks that the function performs are:

      -
    • pub_key is not negative
    -

    -

      -
    • pub_key > 1 and pub_key < p - 1, to avoid small subgroups attack.
    -

    -

      -
    • if g == 2, pub_key have more then one bit set, if bits set is 1, log_2(pub_key) is trival
    +
    Returns
    1 on success, 0 on failure and *codes is set the the combined fail check for the public key
    +

    Checks that the function performs are:

      +
    • pub_key is not negative
    • +
    • pub_key > 1 and pub_key < p - 1, to avoid small subgroups attack.
    • +
    • if g == 2, pub_key have more then one bit set, if bits set is 1, log_2(pub_key) is trival
    • +
    -

    - +

    + +

    ◆ DH_compute_key()

    +
    - + - - + + - - + + - - + + - +
    int DH_compute_key int DH_compute_key (unsigned char *  shared_key, unsigned char * shared_key,
    const BIGNUM *  peer_pub_key, const BIGNUM * peer_pub_key,
    DH *  dh DH * dh 
    )
    -
    -
    - -

    -Complute the shared secret key.

    -

    Parameters:
    - - - - +
    +

    Complute the shared secret key.

    +
    Parameters
    +
    shared_key the resulting shared key, need to be at least DH_size() large.
    peer_pub_key the peer's public key.
    dh the dh key pair.
    + + +
    shared_keythe resulting shared key, need to be at least DH_size() large.
    peer_pub_keythe peer's public key.
    dhthe dh key pair.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    +

    Checks that the pubkey passed in is valid using DH_check_pubkey().

    -

    -Checks that the pubkey passed in is valid using DH_check_pubkey().

    -

    - + + +

    ◆ DH_free()

    +
    - + - - - + +
    void DH_free void DH_free (DH *  dh  ) DH * dh)
    -
    -
    - -

    -Free a DH object and release related resources, like ENGINE, that the object was using.

    -

    Parameters:
    - - +
    +

    Free a DH object and release related resources, like ENGINE, that the object was using.

    +
    Parameters
    +
    dh object to be freed.
    +
    dhobject to be freed.
    +
    -

    - + + +

    ◆ DH_generate_key()

    +
    - + - - - + +
    int DH_generate_key int DH_generate_key (DH *  dh  ) DH * dh)
    -
    -
    - -

    -Generate a new DH private-public key pair. The dh parameter must be allocted first with DH_new(). dh->p and dp->g must be set.

    -

    Parameters:
    - - +
    +

    Generate a new DH private-public key pair. The dh parameter must be allocted first with DH_new(). dh->p and dp->g must be set.

    +
    Parameters
    +
    dh dh parameter.
    +
    dhdh parameter.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ DH_generate_parameters_ex()

    +
    - + - - + + - - + + - - + + - - + + - +
    int DH_generate_parameters_ex int DH_generate_parameters_ex (DH *  dh, DH * dh,
    int  prime_len, int prime_len,
    int  generator, int generator,
    BN_GENCB *  cb BN_GENCB * cb 
    )
    -
    -
    - -

    -Generate DH parameters for the DH object give parameters.

    -

    Parameters:
    - - - - - +
    +

    Generate DH parameters for the DH object give parameters.

    +
    Parameters
    +
    dh The DH object to generate parameters for.
    prime_len length of the prime
    generator generator, g
    cb Callback parameters to show progress, can be NULL.
    + + + +
    dhThe DH object to generate parameters for.
    prime_lenlength of the prime
    generatorgenerator, g
    cbCallback parameters to show progress, can be NULL.
    +
    -
    Returns:
    the maximum size in bytes of the out data.
    +
    Returns
    the maximum size in bytes of the out data.
    -

    - + + +

    ◆ DH_get_default_method()

    +
    - + - - - + +
    const DH_METHOD* DH_get_default_method const DH_METHOD* DH_get_default_method (void   ) void )
    -
    -
    - -

    -Return the default DH implementation.

    -

    Returns:
    pointer to a DH_METHOD.
    +
    +

    Return the default DH implementation.

    +
    Returns
    pointer to a DH_METHOD.
    -

    - + + +

    ◆ DH_get_ex_data()

    +
    - + - - + + - - + + - +
    void* DH_get_ex_data void* DH_get_ex_data (DH *  dh, DH * dh,
    int  idx int idx 
    )
    -
    -
    - -

    -Get the data for index idx in the DH object.

    -

    Parameters:
    - - - +
    +

    Get the data for index idx in the DH object.

    +
    Parameters
    +
    dh DH object.
    idx index to get the data for.
    + +
    dhDH object.
    idxindex to get the data for.
    +
    -
    Returns:
    the object store in index idx
    +
    Returns
    the object store in index idx
    -

    - + + +

    ◆ DH_ltm_method()

    +
    - + - - - + +
    const DH_METHOD* DH_ltm_method const DH_METHOD* DH_ltm_method (void   ) void )
    -
    -
    - -

    -DH implementation using libtommath.

    -

    Returns:
    the DH_METHOD for the DH implementation using libtommath.
    +
    +

    DH implementation using libtommath.

    +
    Returns
    the DH_METHOD for the DH implementation using libtommath.
    -

    - + + +

    ◆ DH_new()

    +
    - + - - - + +
    DH* DH_new DH* DH_new (void   ) void )
    -
    -
    - -

    -Create a new DH object using DH_new_method(NULL), see DH_new_method().

    -

    Returns:
    a newly allocated DH object.
    +
    +

    Create a new DH object using DH_new_method(NULL), see DH_new_method().

    +
    Returns
    a newly allocated DH object.
    -

    - + + +

    ◆ DH_new_method()

    +
    - + - - - + +
    DH* DH_new_method DH* DH_new_method (ENGINE *  engine  ) ENGINE * engine)
    -
    -
    - -

    -Create a new DH object from the given engine, if the NULL is used, the default engine is used. Free the DH object with DH_free().

    -

    Parameters:
    - - +
    +

    Create a new DH object from the given engine, if the NULL is used, the default engine is used. Free the DH object with DH_free().

    +
    Parameters
    +
    engine The engine to use to allocate the DH object.
    +
    engineThe engine to use to allocate the DH object.
    +
    -
    Returns:
    a newly allocated DH object.
    +
    Returns
    a newly allocated DH object.
    -

    - + + +

    ◆ DH_null_method()

    +
    - + - - - + +
    const DH_METHOD* DH_null_method const DH_METHOD* DH_null_method (void   ) void )
    -
    -
    - -

    -Return the dummy DH implementation.

    -

    Returns:
    pointer to a DH_METHOD.
    +
    +

    Return the dummy DH implementation.

    +
    Returns
    pointer to a DH_METHOD.
    -

    - + + +

    ◆ DH_set_default_method()

    +
    - + - - - + +
    void DH_set_default_method void DH_set_default_method (const DH_METHOD *  meth  ) const DH_METHOD * meth)
    -
    -
    - -

    -Set the default DH implementation.

    -

    Parameters:
    - - +
    +

    Set the default DH implementation.

    +
    Parameters
    +
    meth pointer to a DH_METHOD.
    +
    methpointer to a DH_METHOD.
    +
    -

    - + + +

    ◆ DH_set_ex_data()

    +
    - + - - + + - - + + - - + + - +
    int DH_set_ex_data int DH_set_ex_data (DH *  dh, DH * dh,
    int  idx, int idx,
    void *  data void * data 
    )
    -
    -
    - -

    -Set the data index idx in the DH object to data.

    -

    Parameters:
    - - - - +
    +

    Set the data index idx in the DH object to data.

    +
    Parameters
    +
    dh DH object.
    idx index to set the data for.
    data data to store for the index idx.
    + + +
    dhDH object.
    idxindex to set the data for.
    datadata to store for the index idx.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ DH_set_method()

    +
    - + - - + + - - + + - +
    int DH_set_method int DH_set_method (DH *  dh, DH * dh,
    const DH_METHOD *  method const DH_METHOD * method 
    )
    -
    -
    - -

    -Set a new method for the DH keypair.

    -

    Parameters:
    - - - +
    +

    Set a new method for the DH keypair.

    +
    Parameters
    +
    dh dh parameter.
    method the new method for the DH parameter.
    + +
    dhdh parameter.
    methodthe new method for the DH parameter.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ DH_size()

    +
    - + - - - + +
    int DH_size int DH_size (const DH *  dh  ) const DH * dh)
    -
    -
    - -

    -The maximum output size of the DH_compute_key() function.

    -

    Parameters:
    - - +
    +

    The maximum output size of the DH_compute_key() function.

    +
    Parameters
    +
    dh The DH object to get the size from.
    +
    dhThe DH object to get the size from.
    +
    -
    Returns:
    the maximum size in bytes of the out data.
    +
    Returns
    the maximum size in bytes of the out data.
    -

    - + + +

    ◆ DH_up_ref()

    +
    - + - - - + +
    int DH_up_ref int DH_up_ref (DH *  dh  ) DH * dh)
    -
    -
    - -

    -Add a reference to the DH object. The object should be free with DH_free() to drop the reference.

    -

    Parameters:
    - - +
    +

    Add a reference to the DH object. The object should be free with DH_free() to drop the reference.

    +
    Parameters
    +
    dh the object to increase the reference count too.
    +
    dhthe object to increase the reference count too.
    +
    -
    Returns:
    the updated reference count, can't safely be used except for debug printing.
    +
    Returns
    the updated reference count, can't safely be used except for debug printing.
    -

    +


    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__evp.html b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__evp.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__evp.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__evp.html @@ -1,6 +1,6 @@ -Heimdal crypto library: EVP generic crypto functions +EVP generic crypto functions @@ -8,2359 +8,3096 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    EVP generic crypto functions
    +
    -

    EVP generic crypto functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    const EVP_CIPHER * EVP_wincrypt_des_ede3_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_aes_128_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_aes_192_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_aes_256_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_aes_128_cfb8 (void)
    const EVP_CIPHER * EVP_hcrypto_aes_192_cfb8 (void)
    const EVP_CIPHER * EVP_hcrypto_aes_256_cfb8 (void)
    const EVP_MD * EVP_hcrypto_sha256 (void)
    const EVP_MD * EVP_hcrypto_sha384 (void)
    const EVP_MD * EVP_hcrypto_sha512 (void)
    const EVP_MD * EVP_hcrypto_sha1 (void)
    const EVP_MD * EVP_hcrypto_md5 (void)
    const EVP_MD * EVP_hcrypto_md4 (void)
    const EVP_MD * EVP_hcrypto_md2 (void)
    const EVP_CIPHER * EVP_hcrypto_des_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_des_ede3_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_rc2_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_rc2_40_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_rc2_64_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_camellia_128_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_camellia_192_cbc (void)
    const EVP_CIPHER * EVP_hcrypto_camellia_256_cbc (void)
    size_t EVP_MD_size (const EVP_MD *md)
    size_t EVP_MD_block_size (const EVP_MD *md)
    EVP_MD_CTX * EVP_MD_CTX_create (void)
    void EVP_MD_CTX_init (EVP_MD_CTX *ctx) HC_DEPRECATED
    void EVP_MD_CTX_destroy (EVP_MD_CTX *ctx)
    int EVP_MD_CTX_cleanup (EVP_MD_CTX *ctx) HC_DEPRECATED
    const EVP_MD * EVP_MD_CTX_md (EVP_MD_CTX *ctx)
    size_t EVP_MD_CTX_size (EVP_MD_CTX *ctx)
    size_t EVP_MD_CTX_block_size (EVP_MD_CTX *ctx)
    int EVP_DigestInit_ex (EVP_MD_CTX *ctx, const EVP_MD *md, ENGINE *engine)
    int EVP_DigestUpdate (EVP_MD_CTX *ctx, const void *data, size_t size)
    int EVP_DigestFinal_ex (EVP_MD_CTX *ctx, void *hash, unsigned int *size)
    int EVP_Digest (const void *data, size_t dsize, void *hash, unsigned int *hsize, const EVP_MD *md, ENGINE *engine)
    const EVP_MD * EVP_sha256 (void)
    const EVP_MD * EVP_sha384 (void)
    const EVP_MD * EVP_sha512 (void)
    const EVP_MD * EVP_sha1 (void)
    const EVP_MD * EVP_sha (void)
    const EVP_MD * EVP_md5 (void)
    const EVP_MD * EVP_md4 (void)
    const EVP_MD * EVP_md2 (void)
    const EVP_MD * EVP_md_null (void)
    size_t EVP_CIPHER_block_size (const EVP_CIPHER *c)
    size_t EVP_CIPHER_key_length (const EVP_CIPHER *c)
    size_t EVP_CIPHER_iv_length (const EVP_CIPHER *c)
    void EVP_CIPHER_CTX_init (EVP_CIPHER_CTX *c)
    int EVP_CIPHER_CTX_cleanup (EVP_CIPHER_CTX *c)
    int EVP_CIPHER_CTX_set_key_length (EVP_CIPHER_CTX *c, int length)
    const EVP_CIPHER * EVP_CIPHER_CTX_cipher (EVP_CIPHER_CTX *ctx)
    size_t EVP_CIPHER_CTX_block_size (const EVP_CIPHER_CTX *ctx)
    size_t EVP_CIPHER_CTX_key_length (const EVP_CIPHER_CTX *ctx)
    size_t EVP_CIPHER_CTX_iv_length (const EVP_CIPHER_CTX *ctx)
    unsigned long EVP_CIPHER_CTX_flags (const EVP_CIPHER_CTX *ctx)
    int EVP_CIPHER_CTX_mode (const EVP_CIPHER_CTX *ctx)
    void * EVP_CIPHER_CTX_get_app_data (EVP_CIPHER_CTX *ctx)
    void EVP_CIPHER_CTX_set_app_data (EVP_CIPHER_CTX *ctx, void *data)
    int EVP_CipherInit_ex (EVP_CIPHER_CTX *ctx, const EVP_CIPHER *c, ENGINE *engine, const void *key, const void *iv, int encp)
    int EVP_CipherUpdate (EVP_CIPHER_CTX *ctx, void *out, int *outlen, void *in, size_t inlen)
    int EVP_CipherFinal_ex (EVP_CIPHER_CTX *ctx, void *out, int *outlen)
    const EVP_CIPHER * EVP_enc_null (void)
    const EVP_CIPHER * EVP_rc2_cbc (void)
    const EVP_CIPHER * EVP_rc2_40_cbc (void)
    const EVP_CIPHER * EVP_rc2_64_cbc (void)
    const EVP_CIPHER * EVP_rc4 (void)
    const EVP_CIPHER * EVP_rc4_40 (void)
    const EVP_CIPHER * EVP_des_cbc (void)
    const EVP_CIPHER * EVP_des_ede3_cbc (void)
    const EVP_CIPHER * EVP_aes_128_cbc (void)
    const EVP_CIPHER * EVP_aes_192_cbc (void)
    const EVP_CIPHER * EVP_aes_256_cbc (void)
    const EVP_CIPHER * EVP_aes_128_cfb8 (void)
    const EVP_CIPHER * EVP_aes_192_cfb8 (void)
    const EVP_CIPHER * EVP_aes_256_cfb8 (void)
    const EVP_CIPHER * EVP_camellia_128_cbc (void)
    const EVP_CIPHER * EVP_camellia_192_cbc (void)
    const EVP_CIPHER * EVP_camellia_256_cbc (void)
    const EVP_CIPHER * EVP_get_cipherbyname (const char *name)
    int EVP_BytesToKey (const EVP_CIPHER *type, const EVP_MD *md, const void *salt, const void *data, size_t datalen, unsigned int count, void *keydata, void *ivdata)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    const EVP_CIPHER * EVP_wincrypt_des_ede3_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_aes_128_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_aes_192_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_aes_256_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_aes_128_cfb8 (void)
     
    const EVP_CIPHER * EVP_hcrypto_aes_192_cfb8 (void)
     
    const EVP_CIPHER * EVP_hcrypto_aes_256_cfb8 (void)
     
    const EVP_MD * EVP_hcrypto_sha256 (void)
     
    const EVP_MD * EVP_hcrypto_sha384 (void)
     
    const EVP_MD * EVP_hcrypto_sha512 (void)
     
    const EVP_MD * EVP_hcrypto_sha1 (void)
     
    const EVP_MD * EVP_hcrypto_md5 (void)
     
    const EVP_MD * EVP_hcrypto_md4 (void)
     
    const EVP_CIPHER * EVP_hcrypto_des_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_des_ede3_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_rc2_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_rc2_40_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_rc2_64_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_camellia_128_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_camellia_192_cbc (void)
     
    const EVP_CIPHER * EVP_hcrypto_camellia_256_cbc (void)
     
     OSSL_CIPHER_ALGORITHM (rc2_cbc, hc_EVP_CIPH_CBC_MODE|hc_EVP_CIPH_VARIABLE_LENGTH) OSSL_CIPHER_ALGORITHM(rc2_40_cbc
     
    hc_EVP_CIPH_CBC_MODE OSSL_CIPHER_ALGORITHM (rc2_64_cbc, hc_EVP_CIPH_CBC_MODE|hc_EVP_CIPH_VARIABLE_LENGTH) OSSL_CIPHER_ALGORITHM(rc4
     
     WINCNG_CIPHER_ALGORITHM (des_ede3_cbc, BCRYPT_3DES_ALGORITHM, 8, 24, 8, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM (des_cbc, BCRYPT_DES_ALGORITHM, 8, 8, 8, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM (aes_128_cbc, BCRYPT_AES_ALGORITHM, 16, 16, 16, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM (aes_192_cbc, BCRYPT_AES_ALGORITHM, 16, 24, 16, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM (aes_256_cbc, BCRYPT_AES_ALGORITHM, 16, 32, 16, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM (aes_128_cfb8, BCRYPT_AES_ALGORITHM, 16, 16, 16, EVP_CIPH_CFB8_MODE)
     
     WINCNG_CIPHER_ALGORITHM (aes_192_cfb8, BCRYPT_AES_ALGORITHM, 16, 24, 16, EVP_CIPH_CFB8_MODE)
     
     WINCNG_CIPHER_ALGORITHM (aes_256_cfb8, BCRYPT_AES_ALGORITHM, 16, 32, 16, EVP_CIPH_CFB8_MODE)
     
     WINCNG_CIPHER_ALGORITHM (rc2_cbc, BCRYPT_RC2_ALGORITHM, 8, 16, 8, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM (rc2_40_cbc, BCRYPT_RC2_ALGORITHM, 8, 5, 8, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM (rc2_64_cbc, BCRYPT_RC2_ALGORITHM, 8, 8, 8, EVP_CIPH_CBC_MODE)
     
     WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_128_cbc)
     
     WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_192_cbc)
     
     WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_256_cbc)
     
     WINCNG_CIPHER_ALGORITHM (rc4, BCRYPT_RC4_ALGORITHM, 1, 16, 0, EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH)
     
     WINCNG_CIPHER_ALGORITHM (rc4_40, BCRYPT_RC4_ALGORITHM, 1, 5, 0, EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH)
     
    size_t EVP_MD_size (const EVP_MD *md)
     
    size_t EVP_MD_block_size (const EVP_MD *md)
     
    EVP_MD_CTX * EVP_MD_CTX_create (void)
     
    void EVP_MD_CTX_init (EVP_MD_CTX *ctx) HC_DEPRECATED
     
    void EVP_MD_CTX_destroy (EVP_MD_CTX *ctx)
     
    int EVP_MD_CTX_cleanup (EVP_MD_CTX *ctx) HC_DEPRECATED
     
    const EVP_MD * EVP_MD_CTX_md (EVP_MD_CTX *ctx)
     
    size_t EVP_MD_CTX_size (EVP_MD_CTX *ctx)
     
    size_t EVP_MD_CTX_block_size (EVP_MD_CTX *ctx)
     
    int EVP_DigestInit_ex (EVP_MD_CTX *ctx, const EVP_MD *md, ENGINE *engine)
     
    int EVP_DigestUpdate (EVP_MD_CTX *ctx, const void *data, size_t size)
     
    int EVP_DigestFinal_ex (EVP_MD_CTX *ctx, void *hash, unsigned int *size)
     
    int EVP_Digest (const void *data, size_t dsize, void *hash, unsigned int *hsize, const EVP_MD *md, ENGINE *engine)
     
    const EVP_MD * EVP_sha256 (void)
     
    const EVP_MD * EVP_sha384 (void)
     
    const EVP_MD * EVP_sha512 (void)
     
    const EVP_MD * EVP_sha1 (void)
     
    const EVP_MD * EVP_sha (void)
     
    const EVP_MD * EVP_md5 (void)
     
    const EVP_MD * EVP_md4 (void)
     
    const EVP_MD * EVP_md_null (void)
     
    size_t EVP_CIPHER_block_size (const EVP_CIPHER *c)
     
    size_t EVP_CIPHER_key_length (const EVP_CIPHER *c)
     
    size_t EVP_CIPHER_iv_length (const EVP_CIPHER *c)
     
    void EVP_CIPHER_CTX_init (EVP_CIPHER_CTX *c)
     
    int EVP_CIPHER_CTX_cleanup (EVP_CIPHER_CTX *c)
     
    int EVP_CIPHER_CTX_set_key_length (EVP_CIPHER_CTX *c, int length)
     
    const EVP_CIPHER * EVP_CIPHER_CTX_cipher (EVP_CIPHER_CTX *ctx)
     
    size_t EVP_CIPHER_CTX_block_size (const EVP_CIPHER_CTX *ctx)
     
    size_t EVP_CIPHER_CTX_key_length (const EVP_CIPHER_CTX *ctx)
     
    size_t EVP_CIPHER_CTX_iv_length (const EVP_CIPHER_CTX *ctx)
     
    unsigned long EVP_CIPHER_CTX_flags (const EVP_CIPHER_CTX *ctx)
     
    int EVP_CIPHER_CTX_mode (const EVP_CIPHER_CTX *ctx)
     
    void * EVP_CIPHER_CTX_get_app_data (EVP_CIPHER_CTX *ctx)
     
    void EVP_CIPHER_CTX_set_app_data (EVP_CIPHER_CTX *ctx, void *data)
     
    int EVP_CipherInit_ex (EVP_CIPHER_CTX *ctx, const EVP_CIPHER *c, ENGINE *engine, const void *key, const void *iv, int encp)
     
    int EVP_CipherUpdate (EVP_CIPHER_CTX *ctx, void *out, int *outlen, void *in, size_t inlen)
     
    int EVP_CipherFinal_ex (EVP_CIPHER_CTX *ctx, void *out, int *outlen)
     
    const EVP_CIPHER * EVP_enc_null (void)
     
    const EVP_CIPHER * EVP_rc2_cbc (void)
     
    const EVP_CIPHER * EVP_rc2_40_cbc (void)
     
    const EVP_CIPHER * EVP_rc2_64_cbc (void)
     
    const EVP_CIPHER * EVP_rc4 (void)
     
    const EVP_CIPHER * EVP_rc4_40 (void)
     
    const EVP_CIPHER * EVP_des_cbc (void)
     
    const EVP_CIPHER * EVP_des_ede3_cbc (void)
     
    const EVP_CIPHER * EVP_aes_128_cbc (void)
     
    const EVP_CIPHER * EVP_aes_192_cbc (void)
     
    const EVP_CIPHER * EVP_aes_256_cbc (void)
     
    const EVP_CIPHER * EVP_aes_128_cfb8 (void)
     
    const EVP_CIPHER * EVP_aes_192_cfb8 (void)
     
    const EVP_CIPHER * EVP_aes_256_cfb8 (void)
     
    const EVP_CIPHER * EVP_camellia_128_cbc (void)
     
    const EVP_CIPHER * EVP_camellia_192_cbc (void)
     
    const EVP_CIPHER * EVP_camellia_256_cbc (void)
     
    const EVP_CIPHER * EVP_get_cipherbyname (const char *name)
     
    int EVP_BytesToKey (const EVP_CIPHER *type, const EVP_MD *md, const void *salt, const void *data, size_t datalen, unsigned int count, void *keydata, void *ivdata)
     
    -

    Detailed Description

    -See the EVP - generic crypto interface for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the EVP - generic crypto interface for description and examples.

    +

    Function Documentation

    + +

    ◆ EVP_aes_128_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_aes_128_cbc const EVP_CIPHER* EVP_aes_128_cbc (void   ) void )
    -
    -
    +
    +

    The AES-128 cipher type

    +
    Returns
    the AES-128 EVP_CIPHER pointer.
    +
    Examples
    example_evp_cipher.c.
    +
    -

    -The AES-128 cipher type

    -

    Returns:
    the AES-128 EVP_CIPHER pointer.
    -
    Examples:
    -example_evp_cipher.c.
    -

    - +

    + +

    ◆ EVP_aes_128_cfb8()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_aes_128_cfb8 const EVP_CIPHER* EVP_aes_128_cfb8 (void   ) void )
    -
    -
    - -

    -The AES-128 cipher type

    -

    Returns:
    the AES-128 EVP_CIPHER pointer.
    +
    +

    The AES-128 cipher type

    +
    Returns
    the AES-128 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_aes_192_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_aes_192_cbc const EVP_CIPHER* EVP_aes_192_cbc (void   ) void )
    -
    -
    - -

    -The AES-192 cipher type

    -

    Returns:
    the AES-192 EVP_CIPHER pointer.
    +
    +

    The AES-192 cipher type

    +
    Returns
    the AES-192 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_aes_192_cfb8()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_aes_192_cfb8 const EVP_CIPHER* EVP_aes_192_cfb8 (void   ) void )
    -
    -
    - -

    -The AES-192 cipher type

    -

    Returns:
    the AES-192 EVP_CIPHER pointer.
    +
    +

    The AES-192 cipher type

    +
    Returns
    the AES-192 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_aes_256_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_aes_256_cbc const EVP_CIPHER* EVP_aes_256_cbc (void   ) void )
    -
    -
    - -

    -The AES-256 cipher type

    -

    Returns:
    the AES-256 EVP_CIPHER pointer.
    +
    +

    The AES-256 cipher type

    +
    Returns
    the AES-256 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_aes_256_cfb8()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_aes_256_cfb8 const EVP_CIPHER* EVP_aes_256_cfb8 (void   ) void )
    -
    -
    - -

    -The AES-256 cipher type

    -

    Returns:
    the AES-256 EVP_CIPHER pointer.
    +
    +

    The AES-256 cipher type

    +
    Returns
    the AES-256 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_BytesToKey()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - -
    int EVP_BytesToKey int EVP_BytesToKey (const EVP_CIPHER *  type, const EVP_CIPHER * type,
    const EVP_MD *  md, const EVP_MD * md,
    const void *  salt, const void * salt,
    const void *  data, const void * data,
    size_t  datalen, size_t datalen,
    unsigned int  count, unsigned int count,
    void *  keydata, void * keydata,
    void *  ivdata void * ivdata 
    )
    -
    -
    - -

    -Provides a legancy string to key function, used in PEM files.

    -New protocols should use new string to key functions like NIST SP56-800A or PKCS#5 v2.0 (see PKCS5_PBKDF2_HMAC_SHA1()).

    -

    Parameters:
    - - - - - - - - - + + +
    type type of cipher to use
    md message digest to use
    salt salt salt string, should be an binary 8 byte buffer.
    data the password/input key string.
    datalen length of data parameter.
    count iteration counter.
    keydata output keydata, needs to of the size EVP_CIPHER_key_length().
    ivdata output ivdata, needs to of the size EVP_CIPHER_block_size().
    +
    +

    Provides a legancy string to key function, used in PEM files.

    +

    New protocols should use new string to key functions like NIST SP56-800A or PKCS#5 v2.0 (see PKCS5_PBKDF2_HMAC_SHA1()).

    +
    Parameters
    + + + + + + + + +
    typetype of cipher to use
    mdmessage digest to use
    saltsalt salt string, should be an binary 8 byte buffer.
    datathe password/input key string.
    datalenlength of data parameter.
    countiteration counter.
    keydataoutput keydata, needs to of the size EVP_CIPHER_key_length().
    ivdataoutput ivdata, needs to of the size EVP_CIPHER_block_size().
    +
    -
    Returns:
    the size of derived key.
    +
    Returns
    the size of derived key.
    -

    - + + +

    ◆ EVP_camellia_128_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_camellia_128_cbc const EVP_CIPHER* EVP_camellia_128_cbc (void   ) void )
    -
    -
    - -

    -The Camellia-128 cipher type

    -

    Returns:
    the Camellia-128 EVP_CIPHER pointer.
    +
    +

    The Camellia-128 cipher type

    +
    Returns
    the Camellia-128 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_camellia_192_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_camellia_192_cbc const EVP_CIPHER* EVP_camellia_192_cbc (void   ) void )
    -
    -
    - -

    -The Camellia-198 cipher type

    -

    Returns:
    the Camellia-198 EVP_CIPHER pointer.
    +
    +

    The Camellia-198 cipher type

    +
    Returns
    the Camellia-198 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_camellia_256_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_camellia_256_cbc const EVP_CIPHER* EVP_camellia_256_cbc (void   ) void )
    -
    -
    - -

    -The Camellia-256 cipher type

    -

    Returns:
    the Camellia-256 EVP_CIPHER pointer.
    +
    +

    The Camellia-256 cipher type

    +
    Returns
    the Camellia-256 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_CIPHER_block_size()

    +
    - + - - - + +
    size_t EVP_CIPHER_block_size size_t EVP_CIPHER_block_size (const EVP_CIPHER *  c  ) const EVP_CIPHER * c)
    -
    -
    - -

    -Return the block size of the cipher.

    -

    Parameters:
    - - +
    +

    Return the block size of the cipher.

    +
    Parameters
    +
    c cipher to get the block size from.
    +
    ccipher to get the block size from.
    +
    +
    +
    Returns
    the block size of the cipher.
    +
    Examples
    example_evp_cipher.c.
    -
    Returns:
    the block size of the cipher.
    -
    Examples:
    -example_evp_cipher.c.
    + +
    -

    - + +

    ◆ EVP_CIPHER_CTX_block_size()

    +
    - + - - - + +
    size_t EVP_CIPHER_CTX_block_size size_t EVP_CIPHER_CTX_block_size (const EVP_CIPHER_CTX *  ctx  ) const EVP_CIPHER_CTX * ctx)
    -
    -
    - -

    -Return the block size of the cipher context.

    -

    Parameters:
    - - +
    +

    Return the block size of the cipher context.

    +
    Parameters
    +
    ctx cipher context to get the block size from.
    +
    ctxcipher context to get the block size from.
    +
    -
    Returns:
    the block size of the cipher context.
    +
    Returns
    the block size of the cipher context.
    -

    - + + +

    ◆ EVP_CIPHER_CTX_cipher()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_CIPHER_CTX_cipher const EVP_CIPHER* EVP_CIPHER_CTX_cipher (EVP_CIPHER_CTX *  ctx  ) EVP_CIPHER_CTX * ctx)
    -
    -
    - -

    -Return the EVP_CIPHER for a EVP_CIPHER_CTX context.

    -

    Parameters:
    - - +
    +

    Return the EVP_CIPHER for a EVP_CIPHER_CTX context.

    +
    Parameters
    +
    ctx the context to get the cipher type from.
    +
    ctxthe context to get the cipher type from.
    +
    -
    Returns:
    the EVP_CIPHER pointer.
    +
    Returns
    the EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_CIPHER_CTX_cleanup()

    +
    - + - - - + +
    int EVP_CIPHER_CTX_cleanup int EVP_CIPHER_CTX_cleanup (EVP_CIPHER_CTX *  c  ) EVP_CIPHER_CTX * c)
    -
    -
    - -

    -Clean up the EVP_CIPHER_CTX context.

    -

    Parameters:
    - - +
    +

    Clean up the EVP_CIPHER_CTX context.

    +
    Parameters
    +
    c the cipher to clean up.
    +
    cthe cipher to clean up.
    +
    -
    Returns:
    1 on success.
    -
    Examples:
    -example_evp_cipher.c.
    +
    Returns
    1 on success.
    +
    Examples
    example_evp_cipher.c.
    +
    +
    -

    - + + +

    ◆ EVP_CIPHER_CTX_flags()

    +
    - + - - - + +
    unsigned long EVP_CIPHER_CTX_flags unsigned long EVP_CIPHER_CTX_flags (const EVP_CIPHER_CTX *  ctx  ) const EVP_CIPHER_CTX * ctx)
    -
    -
    - -

    -Get the flags for an EVP_CIPHER_CTX context.

    -

    Parameters:
    - - +
    +

    Get the flags for an EVP_CIPHER_CTX context.

    +
    Parameters
    +
    ctx the EVP_CIPHER_CTX to get the flags from
    +
    ctxthe EVP_CIPHER_CTX to get the flags from
    +
    -
    Returns:
    the flags for an EVP_CIPHER_CTX.
    +
    Returns
    the flags for an EVP_CIPHER_CTX.
    -

    - + + +

    ◆ EVP_CIPHER_CTX_get_app_data()

    +
    - + - - - + +
    void* EVP_CIPHER_CTX_get_app_data void* EVP_CIPHER_CTX_get_app_data (EVP_CIPHER_CTX *  ctx  ) EVP_CIPHER_CTX * ctx)
    -
    -
    - -

    -Get the app data for an EVP_CIPHER_CTX context.

    -

    Parameters:
    - - +
    +

    Get the app data for an EVP_CIPHER_CTX context.

    +
    Parameters
    +
    ctx the EVP_CIPHER_CTX to get the app data from
    +
    ctxthe EVP_CIPHER_CTX to get the app data from
    +
    -
    Returns:
    the app data for an EVP_CIPHER_CTX.
    +
    Returns
    the app data for an EVP_CIPHER_CTX.
    -

    - + + +

    ◆ EVP_CIPHER_CTX_init()

    +
    - + - - - + +
    void EVP_CIPHER_CTX_init void EVP_CIPHER_CTX_init (EVP_CIPHER_CTX *  c  ) EVP_CIPHER_CTX * c)
    -
    -
    - -

    -Initiate a EVP_CIPHER_CTX context. Clean up with EVP_CIPHER_CTX_cleanup().

    -

    Parameters:
    - - +
    +

    Initiate a EVP_CIPHER_CTX context. Clean up with EVP_CIPHER_CTX_cleanup().

    +
    Parameters
    +
    c the cipher initiate.
    +
    cthe cipher initiate.
    +
    +
    +
    Examples
    example_evp_cipher.c.
    -
    Examples:
    -example_evp_cipher.c.
    + +
    -

    - + +

    ◆ EVP_CIPHER_CTX_iv_length()

    +
    - + - - - + +
    size_t EVP_CIPHER_CTX_iv_length size_t EVP_CIPHER_CTX_iv_length (const EVP_CIPHER_CTX *  ctx  ) const EVP_CIPHER_CTX * ctx)
    -
    -
    - -

    -Return the IV size of the cipher context.

    -

    Parameters:
    - - +
    +

    Return the IV size of the cipher context.

    +
    Parameters
    +
    ctx cipher context to get the IV size from.
    +
    ctxcipher context to get the IV size from.
    +
    -
    Returns:
    the IV size of the cipher context.
    +
    Returns
    the IV size of the cipher context.
    -

    - + + +

    ◆ EVP_CIPHER_CTX_key_length()

    +
    - + - - - + +
    size_t EVP_CIPHER_CTX_key_length size_t EVP_CIPHER_CTX_key_length (const EVP_CIPHER_CTX *  ctx  ) const EVP_CIPHER_CTX * ctx)
    -
    -
    - -

    -Return the key size of the cipher context.

    -

    Parameters:
    - - +
    +

    Return the key size of the cipher context.

    +
    Parameters
    +
    ctx cipher context to get the key size from.
    +
    ctxcipher context to get the key size from.
    +
    -
    Returns:
    the key size of the cipher context.
    +
    Returns
    the key size of the cipher context.
    -

    - + + +

    ◆ EVP_CIPHER_CTX_mode()

    +
    - + - - - + +
    int EVP_CIPHER_CTX_mode int EVP_CIPHER_CTX_mode (const EVP_CIPHER_CTX *  ctx  ) const EVP_CIPHER_CTX * ctx)
    -
    -
    - -

    -Get the mode for an EVP_CIPHER_CTX context.

    -

    Parameters:
    - - +
    +

    Get the mode for an EVP_CIPHER_CTX context.

    +
    Parameters
    +
    ctx the EVP_CIPHER_CTX to get the mode from
    +
    ctxthe EVP_CIPHER_CTX to get the mode from
    +
    -
    Returns:
    the mode for an EVP_CIPHER_CTX.
    +
    Returns
    the mode for an EVP_CIPHER_CTX.
    -

    - + + +

    ◆ EVP_CIPHER_CTX_set_app_data()

    +
    - + - - + + - - + + - +
    void EVP_CIPHER_CTX_set_app_data void EVP_CIPHER_CTX_set_app_data (EVP_CIPHER_CTX *  ctx, EVP_CIPHER_CTX * ctx,
    void *  data void * data 
    )
    -
    -
    - -

    -Set the app data for an EVP_CIPHER_CTX context.

    -

    Parameters:
    - - - +
    +

    Set the app data for an EVP_CIPHER_CTX context.

    +
    Parameters
    +
    ctx the EVP_CIPHER_CTX to set the app data for
    data the app data to set for an EVP_CIPHER_CTX.
    + +
    ctxthe EVP_CIPHER_CTX to set the app data for
    datathe app data to set for an EVP_CIPHER_CTX.
    +
    -

    - + + +

    ◆ EVP_CIPHER_CTX_set_key_length()

    +
    - + - - + + - - + + - +
    int EVP_CIPHER_CTX_set_key_length int EVP_CIPHER_CTX_set_key_length (EVP_CIPHER_CTX *  c, EVP_CIPHER_CTX * c,
    int  length int length 
    )
    -
    -
    - -

    -If the cipher type supports it, change the key length

    -

    Parameters:
    - - - +
    +

    If the cipher type supports it, change the key length

    +
    Parameters
    +
    c the cipher context to change the key length for
    length new key length
    + +
    cthe cipher context to change the key length for
    lengthnew key length
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ EVP_CIPHER_iv_length()

    +
    - + - - - + +
    size_t EVP_CIPHER_iv_length size_t EVP_CIPHER_iv_length (const EVP_CIPHER *  c  ) const EVP_CIPHER * c)
    -
    -
    - -

    -Return the IV size of the cipher.

    -

    Parameters:
    - - +
    +

    Return the IV size of the cipher.

    +
    Parameters
    +
    c cipher to get the IV size from.
    +
    ccipher to get the IV size from.
    +
    +
    +
    Returns
    the IV size of the cipher.
    +
    Examples
    example_evp_cipher.c.
    -
    Returns:
    the IV size of the cipher.
    -
    Examples:
    -example_evp_cipher.c.
    + +
    -

    - + +

    ◆ EVP_CIPHER_key_length()

    +
    - + - - - + +
    size_t EVP_CIPHER_key_length size_t EVP_CIPHER_key_length (const EVP_CIPHER *  c  ) const EVP_CIPHER * c)
    -
    -
    - -

    -Return the key size of the cipher.

    -

    Parameters:
    - - +
    +

    Return the key size of the cipher.

    +
    Parameters
    +
    c cipher to get the key size from.
    +
    ccipher to get the key size from.
    +
    -
    Returns:
    the key size of the cipher.
    -
    Examples:
    -example_evp_cipher.c.
    +
    Returns
    the key size of the cipher.
    +
    Examples
    example_evp_cipher.c.
    +
    +
    -

    - + + +

    ◆ EVP_CipherFinal_ex()

    +
    - + - - + + - - + + - - + + - +
    int EVP_CipherFinal_ex int EVP_CipherFinal_ex (EVP_CIPHER_CTX *  ctx, EVP_CIPHER_CTX * ctx,
    void *  out, void * out,
    int *  outlen int * outlen 
    )
    -
    -
    - -

    -Encipher/decipher final data

    -

    Parameters:
    - - - - +
    +

    Encipher/decipher final data

    +
    Parameters
    +
    ctx the cipher context.
    out output data from the operation.
    outlen output length
    + + +
    ctxthe cipher context.
    outoutput data from the operation.
    outlenoutput length
    +
    +
    +

    The input length needs to be at least EVP_CIPHER_block_size() bytes long.

    +

    See EVP Cipher for an example how to use this function.

    +
    Returns
    1 on success.
    +
    Examples
    example_evp_cipher.c.
    -The input length needs to be at least EVP_CIPHER_block_size() bytes long.

    -See EVP Cipher for an example how to use this function.

    -

    Returns:
    1 on success.
    -
    Examples:
    -example_evp_cipher.c.
    + +
    -

    - + +

    ◆ EVP_CipherInit_ex()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - -
    int EVP_CipherInit_ex int EVP_CipherInit_ex (EVP_CIPHER_CTX *  ctx, EVP_CIPHER_CTX * ctx,
    const EVP_CIPHER *  c, const EVP_CIPHER * c,
    ENGINE *  engine, ENGINE * engine,
    const void *  key, const void * key,
    const void *  iv, const void * iv,
    int  encp int encp 
    )
    -
    -
    - -

    -Initiate the EVP_CIPHER_CTX context to encrypt or decrypt data. Clean up with EVP_CIPHER_CTX_cleanup().

    -

    Parameters:
    - - - - - - - + + +
    ctx context to initiate
    c cipher to use.
    engine crypto engine to use, NULL to select default.
    key the crypto key to use, NULL will use the previous value.
    iv the IV to use, NULL will use the previous value.
    encp non zero will encrypt, -1 use the previous value.
    +
    +

    Initiate the EVP_CIPHER_CTX context to encrypt or decrypt data. Clean up with EVP_CIPHER_CTX_cleanup().

    +
    Parameters
    + + + + + + +
    ctxcontext to initiate
    ccipher to use.
    enginecrypto engine to use, NULL to select default.
    keythe crypto key to use, NULL will use the previous value.
    ivthe IV to use, NULL will use the previous value.
    encpnon zero will encrypt, -1 use the previous value.
    +
    -
    Returns:
    1 on success.
    -
    Examples:
    -example_evp_cipher.c.
    +
    Returns
    1 on success.
    +
    Examples
    example_evp_cipher.c.
    +
    +
    -

    - + + +

    ◆ EVP_CipherUpdate()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - -
    int EVP_CipherUpdate int EVP_CipherUpdate (EVP_CIPHER_CTX *  ctx, EVP_CIPHER_CTX * ctx,
    void *  out, void * out,
    int *  outlen, int * outlen,
    void *  in, void * in,
    size_t  inlen size_t inlen 
    )
    -
    -
    - -

    -Encipher/decipher partial data

    -

    Parameters:
    - - - - - - + + +
    ctx the cipher context.
    out output data from the operation.
    outlen output length
    in input data to the operation.
    inlen length of data.
    +
    +

    Encipher/decipher partial data

    +
    Parameters
    + + + + + +
    ctxthe cipher context.
    outoutput data from the operation.
    outlenoutput length
    ininput data to the operation.
    inlenlength of data.
    +
    +
    +

    The output buffer length should at least be EVP_CIPHER_block_size() byte longer then the input length.

    +

    See EVP Cipher for an example how to use this function.

    +
    Returns
    1 on success.
    +

    If there in no spare bytes in the left from last Update and the input length is on the block boundery, the EVP_CipherUpdate() function can take a shortcut (and preformance gain) and directly encrypt the data, otherwise we hav to fix it up and store extra it the EVP_CIPHER_CTX.

    +
    Examples
    example_evp_cipher.c.
    -The output buffer length should at least be EVP_CIPHER_block_size() byte longer then the input length.

    -See EVP Cipher for an example how to use this function.

    -

    Returns:
    1 on success.
    -

    -If there in no spare bytes in the left from last Update and the input length is on the block boundery, the EVP_CipherUpdate() function can take a shortcut (and preformance gain) and directly encrypt the data, otherwise we hav to fix it up and store extra it the EVP_CIPHER_CTX.

    Examples:
    -example_evp_cipher.c.
    -

    - + + +

    ◆ EVP_des_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_des_cbc const EVP_CIPHER* EVP_des_cbc (void   ) void )
    -
    -
    - -

    -The DES cipher type

    -

    Returns:
    the DES-CBC EVP_CIPHER pointer.
    +
    +

    The DES cipher type

    +
    Returns
    the DES-CBC EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_des_ede3_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_des_ede3_cbc const EVP_CIPHER* EVP_des_ede3_cbc (void   ) void )
    -
    -
    - -

    -The tripple DES cipher type

    -

    Returns:
    the DES-EDE3-CBC EVP_CIPHER pointer.
    +
    +

    The triple DES cipher type

    +
    Returns
    the DES-EDE3-CBC EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_Digest()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - -
    int EVP_Digest int EVP_Digest (const void *  data, const void * data,
    size_t  dsize, size_t dsize,
    void *  hash, void * hash,
    unsigned int *  hsize, unsigned int * hsize,
    const EVP_MD *  md, const EVP_MD * md,
    ENGINE *  engine ENGINE * engine 
    )
    -
    -
    - -

    -Do the whole EVP_MD_CTX_create(), EVP_DigestInit_ex(), EVP_DigestUpdate(), EVP_DigestFinal_ex(), EVP_MD_CTX_destroy() dance in one call.

    -

    Parameters:
    - - - - - - - + + +
    data the data to update the context with
    dsize length of data
    hash output data of at least EVP_MD_size() length.
    hsize output length of hash.
    md message digest to use
    engine engine to use, NULL for default engine.
    +
    +

    Do the whole EVP_MD_CTX_create(), EVP_DigestInit_ex(), EVP_DigestUpdate(), EVP_DigestFinal_ex(), EVP_MD_CTX_destroy() dance in one call.

    +
    Parameters
    + + + + + + +
    datathe data to update the context with
    dsizelength of data
    hashoutput data of at least EVP_MD_size() length.
    hsizeoutput length of hash.
    mdmessage digest to use
    engineengine to use, NULL for default engine.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ EVP_DigestFinal_ex()

    +
    - + - - + + - - + + - - + + - +
    int EVP_DigestFinal_ex int EVP_DigestFinal_ex (EVP_MD_CTX *  ctx, EVP_MD_CTX * ctx,
    void *  hash, void * hash,
    unsigned int *  size unsigned int * size 
    )
    -
    -
    - -

    -Complete the message digest.

    -

    Parameters:
    - - - - +
    +

    Complete the message digest.

    +
    Parameters
    +
    ctx the context to complete.
    hash the output of the message digest function. At least EVP_MD_size().
    size the output size of hash.
    + + +
    ctxthe context to complete.
    hashthe output of the message digest function. At least EVP_MD_size().
    sizethe output size of hash.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ EVP_DigestInit_ex()

    +
    - + - - + + - - + + - - + + - +
    int EVP_DigestInit_ex int EVP_DigestInit_ex (EVP_MD_CTX *  ctx, EVP_MD_CTX * ctx,
    const EVP_MD *  md, const EVP_MD * md,
    ENGINE *  engine ENGINE * engine 
    )
    -
    -
    - -

    -Init a EVP_MD_CTX for use a specific message digest and engine.

    -

    Parameters:
    - - - - +
    +

    Init a EVP_MD_CTX for use a specific message digest and engine.

    +
    Parameters
    +
    ctx the message digest context to init.
    md the message digest to use.
    engine the engine to use, NULL to use the default engine.
    + + +
    ctxthe message digest context to init.
    mdthe message digest to use.
    enginethe engine to use, NULL to use the default engine.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ EVP_DigestUpdate()

    +
    - + - - + + - - + + - - + + - +
    int EVP_DigestUpdate int EVP_DigestUpdate (EVP_MD_CTX *  ctx, EVP_MD_CTX * ctx,
    const void *  data, const void * data,
    size_t  size size_t size 
    )
    -
    -
    - -

    -Update the digest with some data.

    -

    Parameters:
    - - - - +
    +

    Update the digest with some data.

    +
    Parameters
    +
    ctx the context to update
    data the data to update the context with
    size length of data
    + + +
    ctxthe context to update
    datathe data to update the context with
    sizelength of data
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ EVP_enc_null()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_enc_null const EVP_CIPHER* EVP_enc_null (void   ) void )
    -
    -
    - -

    -The NULL cipher type, does no encryption/decryption.

    -

    Returns:
    the null EVP_CIPHER pointer.
    +
    +

    The NULL cipher type, does no encryption/decryption.

    +
    Returns
    the null EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_get_cipherbyname()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_get_cipherbyname const EVP_CIPHER* EVP_get_cipherbyname (const char *  name  ) const char * name)
    -
    -
    - -

    -Get the cipher type using their name.

    -

    Parameters:
    - - +
    +

    Get the cipher type using their name.

    +
    Parameters
    +
    name the name of the cipher.
    +
    namethe name of the cipher.
    +
    -
    Returns:
    the selected EVP_CIPHER pointer or NULL if not found.
    +
    Returns
    the selected EVP_CIPHER pointer or NULL if not found.
    -

    - -

    -
    - - - - - - - - - -
    const EVP_CIPHER* EVP_hcrypto_aes_128_cbc (void   ) 
    -
    - -

    -The AES-128 cipher type (hcrypto)

    -

    Returns:
    the AES-128 EVP_CIPHER pointer.
    + +

    ◆ EVP_hcrypto_aes_128_cbc()

    -
    -

    -

    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_aes_128_cfb8 const EVP_CIPHER* EVP_hcrypto_aes_128_cbc (void   ) void )
    -
    -
    - -

    -The AES-128 CFB8 cipher type (hcrypto)

    -

    Returns:
    the AES-128 EVP_CIPHER pointer.
    +
    +

    The AES-128 cipher type (hcrypto)

    +
    Returns
    the AES-128 EVP_CIPHER pointer.
    -

    - -

    -
    - - - - - - - - - -
    const EVP_CIPHER* EVP_hcrypto_aes_192_cbc (void   ) 
    -
    - -

    -The AES-192 cipher type (hcrypto)

    -

    Returns:
    the AES-192 EVP_CIPHER pointer.
    + +

    ◆ EVP_hcrypto_aes_128_cfb8()

    -
    -

    -

    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_aes_192_cfb8 const EVP_CIPHER* EVP_hcrypto_aes_128_cfb8 (void   ) void )
    -
    -
    - -

    -The AES-192 CFB8 cipher type (hcrypto)

    -

    Returns:
    the AES-192 EVP_CIPHER pointer.
    +
    +

    The AES-128 CFB8 cipher type (hcrypto)

    +
    Returns
    the AES-128 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_aes_192_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_aes_256_cbc const EVP_CIPHER* EVP_hcrypto_aes_192_cbc (void   ) void )
    -
    -
    - -

    -The AES-256 cipher type (hcrypto)

    -

    Returns:
    the AES-256 EVP_CIPHER pointer.
    +
    +

    The AES-192 cipher type (hcrypto)

    +
    Returns
    the AES-192 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_aes_192_cfb8()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_aes_256_cfb8 const EVP_CIPHER* EVP_hcrypto_aes_192_cfb8 (void   ) void )
    -
    -
    - -

    -The AES-256 CFB8 cipher type (hcrypto)

    -

    Returns:
    the AES-256 EVP_CIPHER pointer.
    +
    +

    The AES-192 CFB8 cipher type (hcrypto)

    +
    Returns
    the AES-192 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_aes_256_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_camellia_128_cbc const EVP_CIPHER* EVP_hcrypto_aes_256_cbc (void   ) void )
    -
    -
    - -

    -The Camellia-128 cipher type - hcrypto

    -

    Returns:
    the Camellia-128 EVP_CIPHER pointer.
    +
    +

    The AES-256 cipher type (hcrypto)

    +
    Returns
    the AES-256 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_aes_256_cfb8()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_camellia_192_cbc const EVP_CIPHER* EVP_hcrypto_aes_256_cfb8 (void   ) void )
    -
    -
    - -

    -The Camellia-198 cipher type - hcrypto

    -

    Returns:
    the Camellia-198 EVP_CIPHER pointer.
    +
    +

    The AES-256 CFB8 cipher type (hcrypto)

    +
    Returns
    the AES-256 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_camellia_128_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_camellia_256_cbc const EVP_CIPHER* EVP_hcrypto_camellia_128_cbc (void   ) void )
    -
    -
    - -

    -The Camellia-256 cipher type - hcrypto

    -

    Returns:
    the Camellia-256 EVP_CIPHER pointer.
    +
    +

    The Camellia-128 cipher type - hcrypto

    +
    Returns
    the Camellia-128 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_camellia_192_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_des_cbc const EVP_CIPHER* EVP_hcrypto_camellia_192_cbc (void   ) void )
    -
    -
    - -

    -The DES cipher type

    -

    Returns:
    the DES-CBC EVP_CIPHER pointer.
    +
    +

    The Camellia-198 cipher type - hcrypto

    +
    Returns
    the Camellia-198 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_camellia_256_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_des_ede3_cbc const EVP_CIPHER* EVP_hcrypto_camellia_256_cbc (void   ) void )
    -
    -
    - -

    -The tripple DES cipher type - hcrypto

    -

    Returns:
    the DES-EDE3-CBC EVP_CIPHER pointer.
    +
    +

    The Camellia-256 cipher type - hcrypto

    +
    Returns
    the Camellia-256 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_des_cbc()

    +
    - + - - - + +
    const EVP_MD* EVP_hcrypto_md2 const EVP_CIPHER* EVP_hcrypto_des_cbc (void   ) void )
    -
    -
    - -

    -The message digest MD2 - hcrypto

    -

    Returns:
    the message digest type.
    +
    +

    The DES cipher type

    +
    Returns
    the DES-CBC EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_des_ede3_cbc()

    +
    - + - - - + +
    const EVP_MD* EVP_hcrypto_md4 const EVP_CIPHER* EVP_hcrypto_des_ede3_cbc (void   ) void )
    -
    -
    - -

    -The message digest MD4 - hcrypto

    -

    Returns:
    the message digest type.
    +
    +

    The triple DES cipher type - hcrypto

    +
    Returns
    the DES-EDE3-CBC EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_md4()

    +
    - + - - - + +
    const EVP_MD* EVP_hcrypto_md5 const EVP_MD* EVP_hcrypto_md4 (void   ) void )
    -
    -
    - -

    -The message digest MD5 - hcrypto

    -

    Returns:
    the message digest type.
    +
    +

    The message digest MD4 - hcrypto

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_hcrypto_md5()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_rc2_40_cbc const EVP_MD* EVP_hcrypto_md5 (void   ) void )
    -
    -
    - -

    -The RC2-40 cipher type

    -

    Returns:
    the RC2-40 EVP_CIPHER pointer.
    +
    +

    The message digest MD5 - hcrypto

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_hcrypto_rc2_40_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_rc2_64_cbc const EVP_CIPHER* EVP_hcrypto_rc2_40_cbc (void   ) void )
    -
    -
    - -

    -The RC2-64 cipher type

    -

    Returns:
    the RC2-64 EVP_CIPHER pointer.
    +
    +

    The RC2-40 cipher type

    +
    Returns
    the RC2-40 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_rc2_64_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_hcrypto_rc2_cbc const EVP_CIPHER* EVP_hcrypto_rc2_64_cbc (void   ) void )
    -
    -
    - -

    -The RC2 cipher type - hcrypto

    -

    Returns:
    the RC2 EVP_CIPHER pointer.
    +
    +

    The RC2-64 cipher type

    +
    Returns
    the RC2-64 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_rc2_cbc()

    +
    - + - - - + +
    const EVP_MD* EVP_hcrypto_sha1 const EVP_CIPHER* EVP_hcrypto_rc2_cbc (void   ) void )
    -
    -
    - -

    -The message digest SHA1 - hcrypto

    -

    Returns:
    the message digest type.
    +
    +

    The RC2 cipher type - hcrypto

    +
    Returns
    the RC2 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_hcrypto_sha1()

    +
    - + - - - + +
    const EVP_MD* EVP_hcrypto_sha256 const EVP_MD* EVP_hcrypto_sha1 (void   ) void )
    -
    -
    - -

    -The message digest SHA256 - hcrypto

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA1 - hcrypto

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_hcrypto_sha256()

    +
    - + - - - + +
    const EVP_MD* EVP_hcrypto_sha384 const EVP_MD* EVP_hcrypto_sha256 (void   ) void )
    -
    -
    - -

    -The message digest SHA384 - hcrypto

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA256 - hcrypto

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_hcrypto_sha384()

    +
    - + - - - + +
    const EVP_MD* EVP_hcrypto_sha512 const EVP_MD* EVP_hcrypto_sha384 (void   ) void )
    -
    -
    - -

    -The message digest SHA512 - hcrypto

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA384 - hcrypto

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_hcrypto_sha512()

    +
    - + - - - + +
    const EVP_MD* EVP_md2 const EVP_MD* EVP_hcrypto_sha512 (void   ) void )
    -
    -
    - -

    -The message digest MD2

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA512 - hcrypto

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_md4()

    +
    - + - - - + +
    const EVP_MD* EVP_md4 const EVP_MD* EVP_md4 (void   ) void )
    -
    -
    - -

    -The message digest MD4

    -

    Returns:
    the message digest type.
    +
    +

    The message digest MD4

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_md5()

    +
    - + - - - + +
    const EVP_MD* EVP_md5 const EVP_MD* EVP_md5 (void   ) void )
    -
    -
    - -

    -The message digest MD5

    -

    Returns:
    the message digest type.
    +
    +

    The message digest MD5

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_MD_block_size()

    +
    - + - - - + +
    size_t EVP_MD_block_size size_t EVP_MD_block_size (const EVP_MD *  md  ) const EVP_MD * md)
    -
    -
    - -

    -Return the blocksize of the message digest function.

    -

    Parameters:
    - - +
    +

    Return the blocksize of the message digest function.

    +
    Parameters
    +
    md the evp message
    +
    mdthe evp message
    +
    -
    Returns:
    size size of the message digest block size
    +
    Returns
    size size of the message digest block size
    -

    - + + +

    ◆ EVP_MD_CTX_block_size()

    +
    - + - - - + +
    size_t EVP_MD_CTX_block_size size_t EVP_MD_CTX_block_size (EVP_MD_CTX *  ctx  ) EVP_MD_CTX * ctx)
    -
    -
    - -

    -Return the blocksize of the message digest function.

    -

    Parameters:
    - - +
    +

    Return the blocksize of the message digest function.

    +
    Parameters
    +
    ctx the evp message digest context
    +
    ctxthe evp message digest context
    +
    -
    Returns:
    size size of the message digest block size
    +
    Returns
    size size of the message digest block size
    -

    - + + +

    ◆ EVP_MD_CTX_cleanup()

    +
    - + - - - + +
    int EVP_MD_CTX_cleanup int EVP_MD_CTX_cleanup (EVP_MD_CTX *  ctx  ) EVP_MD_CTX * ctx)
    -
    -
    - -

    -Free the resources used by the EVP_MD context.

    -

    Parameters:
    - - +
    +

    Free the resources used by the EVP_MD context.

    +
    Parameters
    +
    ctx the context to free the resources from.
    +
    ctxthe context to free the resources from.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ EVP_MD_CTX_create()

    +
    - + - - - + +
    EVP_MD_CTX* EVP_MD_CTX_create EVP_MD_CTX* EVP_MD_CTX_create (void   ) void )
    -
    -
    - -

    -Allocate a messsage digest context object. Free with EVP_MD_CTX_destroy().

    -

    Returns:
    a newly allocated message digest context object.
    +
    +

    Allocate a messsage digest context object. Free with EVP_MD_CTX_destroy().

    +
    Returns
    a newly allocated message digest context object.
    -

    - + + +

    ◆ EVP_MD_CTX_destroy()

    +
    - + - - - + +
    void EVP_MD_CTX_destroy void EVP_MD_CTX_destroy (EVP_MD_CTX *  ctx  ) EVP_MD_CTX * ctx)
    -
    -
    - -

    -Free a messsage digest context object.

    -

    Parameters:
    - - +
    +

    Free a messsage digest context object.

    +
    Parameters
    +
    ctx context to free.
    +
    ctxcontext to free.
    +
    -

    - + + +

    ◆ EVP_MD_CTX_init()

    +
    - + - - - + +
    void EVP_MD_CTX_init void EVP_MD_CTX_init (EVP_MD_CTX *  ctx  ) EVP_MD_CTX * ctx)
    -
    -
    - -

    -Initiate a messsage digest context object. Deallocate with EVP_MD_CTX_cleanup(). Please use EVP_MD_CTX_create() instead.

    -

    Parameters:
    - - +
    +

    Initiate a messsage digest context object. Deallocate with EVP_MD_CTX_cleanup(). Please use EVP_MD_CTX_create() instead.

    +
    Parameters
    +
    ctx variable to initiate.
    +
    ctxvariable to initiate.
    +
    -

    - + + +

    ◆ EVP_MD_CTX_md()

    +
    - + - - - + +
    const EVP_MD* EVP_MD_CTX_md const EVP_MD* EVP_MD_CTX_md (EVP_MD_CTX *  ctx  ) EVP_MD_CTX * ctx)
    -
    -
    - -

    -Get the EVP_MD use for a specified context.

    -

    Parameters:
    - - +
    +

    Get the EVP_MD use for a specified context.

    +
    Parameters
    +
    ctx the EVP_MD context to get the EVP_MD for.
    +
    ctxthe EVP_MD context to get the EVP_MD for.
    +
    -
    Returns:
    the EVP_MD used for the context.
    +
    Returns
    the EVP_MD used for the context.
    -

    - + + +

    ◆ EVP_MD_CTX_size()

    +
    - + - - - + +
    size_t EVP_MD_CTX_size size_t EVP_MD_CTX_size (EVP_MD_CTX *  ctx  ) EVP_MD_CTX * ctx)
    -
    -
    - -

    -Return the output size of the message digest function.

    -

    Parameters:
    - - +
    +

    Return the output size of the message digest function.

    +
    Parameters
    +
    ctx the evp message digest context
    +
    ctxthe evp message digest context
    +
    -
    Returns:
    size output size of the message digest function.
    +
    Returns
    size output size of the message digest function.
    -

    - + + +

    ◆ EVP_md_null()

    +
    - + - - - + +
    const EVP_MD* EVP_md_null const EVP_MD* EVP_md_null (void   ) void )
    -
    -
    - -

    -The null message digest

    -

    Returns:
    the message digest type.
    +
    +

    The null message digest

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_MD_size()

    +
    - + - - - + +
    size_t EVP_MD_size size_t EVP_MD_size (const EVP_MD *  md  ) const EVP_MD * md)
    -
    -
    - -

    -Return the output size of the message digest function.

    -

    Parameters:
    - - +
    +

    Return the output size of the message digest function.

    +
    Parameters
    +
    md the evp message
    +
    mdthe evp message
    +
    -
    Returns:
    size output size of the message digest function.
    +
    Returns
    size output size of the message digest function.
    -

    - + + +

    ◆ EVP_rc2_40_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_rc2_40_cbc const EVP_CIPHER* EVP_rc2_40_cbc (void   ) void )
    -
    -
    - -

    -The RC2 cipher type

    -

    Returns:
    the RC2 EVP_CIPHER pointer.
    +
    +

    The RC2 cipher type

    +
    Returns
    the RC2 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_rc2_64_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_rc2_64_cbc const EVP_CIPHER* EVP_rc2_64_cbc (void   ) void )
    -
    -
    - -

    -The RC2 cipher type

    -

    Returns:
    the RC2 EVP_CIPHER pointer.
    +
    +

    The RC2 cipher type

    +
    Returns
    the RC2 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_rc2_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_rc2_cbc const EVP_CIPHER* EVP_rc2_cbc (void   ) void )
    -
    -
    - -

    -The RC2 cipher type

    -

    Returns:
    the RC2 EVP_CIPHER pointer.
    +
    +

    The RC2 cipher type

    +
    Returns
    the RC2 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_rc4()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_rc4 const EVP_CIPHER* EVP_rc4 (void   ) void )
    -
    -
    - -

    -The RC4 cipher type

    -

    Returns:
    the RC4 EVP_CIPHER pointer.
    +
    +

    The RC4 cipher type

    +
    Returns
    the RC4 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_rc4_40()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_rc4_40 const EVP_CIPHER* EVP_rc4_40 (void   ) void )
    -
    -
    - -

    -The RC4-40 cipher type

    -

    Returns:
    the RC4-40 EVP_CIPHER pointer.
    +
    +

    The RC4-40 cipher type

    +
    Returns
    the RC4-40 EVP_CIPHER pointer.
    -

    - + + +

    ◆ EVP_sha()

    +
    - + - - - + +
    const EVP_MD* EVP_sha const EVP_MD* EVP_sha (void   ) void )
    -
    -
    - -

    -The message digest SHA1

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA1

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_sha1()

    +
    - + - - - + +
    const EVP_MD* EVP_sha1 const EVP_MD* EVP_sha1 (void   ) void )
    -
    -
    - -

    -The message digest SHA1

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA1

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_sha256()

    +
    - + - - - + +
    const EVP_MD* EVP_sha256 const EVP_MD* EVP_sha256 (void   ) void )
    -
    -
    - -

    -The message digest SHA256

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA256

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_sha384()

    +
    - + - - - + +
    const EVP_MD* EVP_sha384 const EVP_MD* EVP_sha384 (void   ) void )
    -
    -
    - -

    -The message digest SHA384

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA384

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_sha512()

    +
    - + - - - + +
    const EVP_MD* EVP_sha512 const EVP_MD* EVP_sha512 (void   ) void )
    -
    -
    - -

    -The message digest SHA512

    -

    Returns:
    the message digest type.
    +
    +

    The message digest SHA512

    +
    Returns
    the message digest type.
    -

    - + + +

    ◆ EVP_wincrypt_des_ede3_cbc()

    +
    - + - - - + +
    const EVP_CIPHER* EVP_wincrypt_des_ede3_cbc const EVP_CIPHER* EVP_wincrypt_des_ede3_cbc (void   ) void )
    +
    +

    The triple DES cipher type (Micrsoft crypt provider)

    +
    Returns
    the DES-EDE3-CBC EVP_CIPHER pointer.
    +
    -
    +
    + +

    ◆ OSSL_CIPHER_ALGORITHM() [1/2]

    -

    -The tripple DES cipher type (Micrsoft crypt provider)

    -

    Returns:
    the DES-EDE3-CBC EVP_CIPHER pointer.
    +
    +
    + + + + + + + + + + + + + + + + + + +
    hc_EVP_CIPH_CBC_MODE OSSL_CIPHER_ALGORITHM (rc2_64_cbc ,
    hc_EVP_CIPH_CBC_MODE| hc_EVP_CIPH_VARIABLE_LENGTH 
    )
    +
    +

    The RC2-64 cipher type - OpenSSL

    +
    Returns
    the RC2-64 EVP_CIPHER pointer. The Camellia-128 cipher type - OpenSSL
    +
    +the Camellia-128 EVP_CIPHER pointer. The Camellia-198 cipher type - OpenSSL
    +
    +the Camellia-198 EVP_CIPHER pointer. The Camellia-256 cipher type - OpenSSL
    +
    +the Camellia-256 EVP_CIPHER pointer. The RC4 cipher type (OpenSSL provider)
    +
    +the RC4 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ OSSL_CIPHER_ALGORITHM() [2/2]

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    OSSL_CIPHER_ALGORITHM (rc2_cbc ,
    hc_EVP_CIPH_CBC_MODE| hc_EVP_CIPH_VARIABLE_LENGTH 
    )
    +
    +

    The triple DES cipher type (OpenSSL provider)

    +
    Returns
    the DES-EDE3-CBC EVP_CIPHER pointer. The DES cipher type (OpenSSL provider)
    +
    +the DES-CBC EVP_CIPHER pointer. The AES-128 cipher type (OpenSSL provider)
    +
    +the AES-128-CBC EVP_CIPHER pointer. The AES-192 cipher type (OpenSSL provider)
    +
    +the AES-192-CBC EVP_CIPHER pointer. The AES-256 cipher type (OpenSSL provider)
    +
    +the AES-256-CBC EVP_CIPHER pointer. The AES-128 CFB8 cipher type (OpenSSL provider)
    +
    +the AES-128-CFB8 EVP_CIPHER pointer. The AES-192 CFB8 cipher type (OpenSSL provider)
    +
    +the AES-192-CFB8 EVP_CIPHER pointer. The AES-256 CFB8 cipher type (OpenSSL provider)
    +
    +the AES-256-CFB8 EVP_CIPHER pointer. The RC2 cipher type - OpenSSL
    +
    +the RC2 EVP_CIPHER pointer. The RC2-40 cipher type - OpenSSL
    +
    +the RC2-40 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [1/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (aes_128_cbc ,
    BCRYPT_AES_ALGORITHM ,
    16 ,
    16 ,
    16 ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The AES-128 cipher type (Windows CNG provider)

    +
    Returns
    the AES-128-CBC EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [2/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (aes_128_cfb8 ,
    BCRYPT_AES_ALGORITHM ,
    16 ,
    16 ,
    16 ,
    EVP_CIPH_CFB8_MODE  
    )
    +
    +

    The AES-128 CFB8 cipher type (Windows CNG provider)

    +
    Returns
    the AES-128-CFB8 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [3/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (aes_192_cbc ,
    BCRYPT_AES_ALGORITHM ,
    16 ,
    24 ,
    16 ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The AES-192 cipher type (Windows CNG provider)

    +
    Returns
    the AES-192-CBC EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [4/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (aes_192_cfb8 ,
    BCRYPT_AES_ALGORITHM ,
    16 ,
    24 ,
    16 ,
    EVP_CIPH_CFB8_MODE  
    )
    +
    +

    The AES-192 CFB8 cipher type (Windows CNG provider)

    +
    Returns
    the AES-192-CFB8 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [5/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (aes_256_cbc ,
    BCRYPT_AES_ALGORITHM ,
    16 ,
    32 ,
    16 ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The AES-256 cipher type (Windows CNG provider)

    +
    Returns
    the AES-256-CBC EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [6/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (aes_256_cfb8 ,
    BCRYPT_AES_ALGORITHM ,
    16 ,
    32 ,
    16 ,
    EVP_CIPH_CFB8_MODE  
    )
    +
    +

    The AES-256 CFB8 cipher type (Windows CNG provider)

    +
    Returns
    the AES-256-CFB8 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [7/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (des_cbc ,
    BCRYPT_DES_ALGORITHM ,
    ,
    ,
    ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The DES cipher type (Windows CNG provider)

    +
    Returns
    the DES-CBC EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [8/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (des_ede3_cbc ,
    BCRYPT_3DES_ALGORITHM ,
    ,
    24 ,
    ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The triple DES cipher type (Windows CNG provider)

    +
    Returns
    the DES-EDE3-CBC EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [9/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (rc2_40_cbc ,
    BCRYPT_RC2_ALGORITHM ,
    ,
    ,
    ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The RC2-40 cipher type - Windows CNG

    +
    Returns
    the RC2-40 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [10/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (rc2_64_cbc ,
    BCRYPT_RC2_ALGORITHM ,
    ,
    ,
    ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The RC2-64 cipher type - Windows CNG

    +
    Returns
    the RC2-64 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [11/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (rc2_cbc ,
    BCRYPT_RC2_ALGORITHM ,
    ,
    16 ,
    ,
    EVP_CIPH_CBC_MODE  
    )
    +
    +

    The RC2 cipher type - Windows CNG

    +
    Returns
    the RC2 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [12/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (rc4 ,
    BCRYPT_RC4_ALGORITHM ,
    ,
    16 ,
    ,
    EVP_CIPH_STREAM_CIPHER| EVP_CIPH_VARIABLE_LENGTH 
    )
    +
    +

    The RC4 cipher type (Windows CNG provider)

    +
    Returns
    the RC4 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM() [13/13]

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM (rc4_40 ,
    BCRYPT_RC4_ALGORITHM ,
    ,
    ,
    ,
    EVP_CIPH_STREAM_CIPHER| EVP_CIPH_VARIABLE_LENGTH 
    )
    +
    +

    The RC4-40 cipher type (Windows CNG provider)

    +
    Returns
    the RC4 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM_UNAVAILABLE() [1/3]

    + +
    +
    + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_128_cbc )
    +
    +

    The Camellia-128 cipher type - CommonCrypto

    +
    Returns
    the Camellia-128 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM_UNAVAILABLE() [2/3]

    + +
    +
    + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_192_cbc )
    +
    +

    The Camellia-198 cipher type - CommonCrypto

    +
    Returns
    the Camellia-198 EVP_CIPHER pointer.
    + +
    +
    + +

    ◆ WINCNG_CIPHER_ALGORITHM_UNAVAILABLE() [3/3]

    + +
    +
    + + + + + + + + +
    WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_256_cbc )
    +
    +

    The Camellia-256 cipher type - CommonCrypto

    +
    Returns
    the Camellia-256 EVP_CIPHER pointer.
    -

    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__misc.html b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__misc.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__misc.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__misc.html @@ -1,6 +1,6 @@ -Heimdal crypto library: hcrypto miscellaneous functions +hcrypto miscellaneous functions @@ -8,99 +8,187 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hcrypto miscellaneous functions
    +
    -

    hcrypto miscellaneous functions

    - - - - +

    Functions

    int PKCS5_PBKDF2_HMAC_SHA1 (const void *password, size_t password_len, const void *salt, size_t salt_len, unsigned long iter, size_t keylen, void *key)
    + + + + +

    +Functions

    int PKCS5_PBKDF2_HMAC (const void *password, size_t password_len, const void *salt, size_t salt_len, unsigned long iter, const EVP_MD *md, size_t keylen, void *key)
     
    int PKCS5_PBKDF2_HMAC_SHA1 (const void *password, size_t password_len, const void *salt, size_t salt_len, unsigned long iter, size_t keylen, void *key)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ PKCS5_PBKDF2_HMAC()

    +
    - + - - + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int PKCS5_PBKDF2_HMAC_SHA1 int PKCS5_PBKDF2_HMAC (const void *  password, const void * password,
    size_t password_len,
    size_t  password_len, const void * salt,
    const void *  salt, size_t salt_len,
    size_t  salt_len, unsigned long iter,
    unsigned long  iter, const EVP_MD * md,
    size_t  keylen, size_t keylen,
    void *  key void * key 
    )
    +
    +

    As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key.

    +
    Parameters
    + + + + + + + + + +
    passwordPassword.
    password_lenLength of password.
    saltSalt
    salt_lenLength of salt.
    iteriteration counter.
    mdthe digest function.
    keylenthe output key length.
    keythe output key.
    +
    +
    +
    Returns
    1 on success, non 1 on failure.
    + +
    -
    + +

    ◆ PKCS5_PBKDF2_HMAC_SHA1()

    -

    -As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key.

    -

    Parameters:
    - - - - - - - - +
    +
    +
    password Password.
    password_len Length of password.
    salt Salt
    salt_len Length of salt.
    iter iteration counter.
    keylen the output key length.
    key the output key.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int PKCS5_PBKDF2_HMAC_SHA1 (const void * password,
    size_t password_len,
    const void * salt,
    size_t salt_len,
    unsigned long iter,
    size_t keylen,
    void * key 
    )
    +
    +

    As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key.

    +
    Parameters
    + + + + + + + +
    passwordPassword.
    password_lenLength of password.
    saltSalt
    salt_lenLength of salt.
    iteriteration counter.
    keylenthe output key length.
    keythe output key.
    +
    -
    Returns:
    1 on success, non 1 on failure.
    +
    Returns
    1 on success, non 1 on failure.
    -

    +


    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rand.html b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rand.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rand.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rand.html @@ -1,6 +1,6 @@ -Heimdal crypto library: RAND crypto functions +RAND crypto functions @@ -8,418 +8,421 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    RAND crypto functions
    +
    -

    RAND crypto functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    void RAND_seed (const void *indata, size_t size)
    int RAND_bytes (void *outdata, size_t size)
    void RAND_cleanup (void)
    void RAND_add (const void *indata, size_t size, double entropi)
    int RAND_pseudo_bytes (void *outdata, size_t size)
    int RAND_status (void)
    int RAND_set_rand_method (const RAND_METHOD *meth)
    const RAND_METHOD * RAND_get_rand_method (void)
    int RAND_set_rand_engine (ENGINE *engine)
    int RAND_load_file (const char *filename, size_t size)
    int RAND_write_file (const char *filename)
    const char * RAND_file_name (char *filename, size_t size)
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void RAND_seed (const void *indata, size_t size)
     
    int RAND_bytes (void *outdata, size_t size)
     
    void RAND_cleanup (void)
     
    void RAND_add (const void *indata, size_t size, double entropi)
     
    int RAND_pseudo_bytes (void *outdata, size_t size)
     
    int RAND_status (void)
     
    int RAND_set_rand_method (const RAND_METHOD *meth)
     
    const RAND_METHOD * RAND_get_rand_method (void)
     
    int RAND_set_rand_engine (ENGINE *engine)
     
    int RAND_load_file (const char *filename, size_t size)
     
    int RAND_write_file (const char *filename)
     
    const char * RAND_file_name (char *filename, size_t size)
     
    -

    Detailed Description

    -See the RAND - random number for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the RAND - random number for description and examples.

    +

    Function Documentation

    + +

    ◆ RAND_add()

    +
    - + - - + + - - + + - - + + - +
    void RAND_add void RAND_add (const void *  indata, const void * indata,
    size_t  size, size_t size,
    double  entropi double entropi 
    )
    -
    -
    - -

    -Seed that random number generator. Secret material can securely be feed into the function, they will never be returned.

    -

    Parameters:
    - - - - +
    +

    Seed that random number generator. Secret material can securely be feed into the function, they will never be returned.

    +
    Parameters
    +
    indata the input data.
    size size of in data.
    entropi entropi in data.
    + + +
    indatathe input data.
    sizesize of in data.
    entropientropi in data.
    +
    -

    - +

    + +

    ◆ RAND_bytes()

    +
    - + - - + + - - + + - +
    int RAND_bytes int RAND_bytes (void *  outdata, void * outdata,
    size_t  size size_t size 
    )
    -
    -
    - -

    -Get a random block from the random generator, can be used for key material.

    -

    Parameters:
    - - - +
    +

    Get a random block from the random generator, can be used for key material.

    +
    Parameters
    +
    outdata random data
    size length random data
    + +
    outdatarandom data
    sizelength random data
    +
    -
    Returns:
    1 on success, 0 on failure.
    +
    Returns
    1 on success, 0 on failure.
    -

    - + + +

    ◆ RAND_cleanup()

    +
    - + - - - + +
    void RAND_cleanup void RAND_cleanup (void   ) void )
    -
    -
    +
    +

    Reset and free memory used by the random generator.

    -

    -Reset and free memory used by the random generator.

    -

    - + + +

    ◆ RAND_file_name()

    +
    - + - - + + - - + + - +
    const char* RAND_file_name const char* RAND_file_name (char *  filename, char * filename,
    size_t  size size_t size 
    )
    -
    -
    - -

    -Return the default random state filename for a user to use for RAND_load_file(), and RAND_write_file().

    -

    Parameters:
    - - - +
    +

    Return the default random state filename for a user to use for RAND_load_file(), and RAND_write_file().

    +
    Parameters
    +
    filename buffer to hold file name.
    size size of buffer filename.
    + +
    filenamebuffer to hold file name.
    sizesize of buffer filename.
    +
    -
    Returns:
    the buffer filename or NULL on failure.
    +
    Returns
    the buffer filename or NULL on failure.
    -

    - + + +

    ◆ RAND_get_rand_method()

    +
    - + - - - + +
    const RAND_METHOD* RAND_get_rand_method const RAND_METHOD* RAND_get_rand_method (void   ) void )
    -
    -
    +
    +

    Get the default random method.

    +
    Returns
    Returns a RAND_METHOD
    -

    -Get the default random method.

    -

    - + + +

    ◆ RAND_load_file()

    +
    - + - - + + - - + + - +
    int RAND_load_file int RAND_load_file (const char *  filename, const char * filename,
    size_t  size size_t size 
    )
    -
    -
    - -

    -Load a a file and feed it into RAND_seed().

    -

    Parameters:
    - - - +
    +

    Load a a file and feed it into RAND_seed().

    +
    Parameters
    +
    filename name of file to read.
    size minimum size to read.
    + +
    filenamename of file to read.
    sizeminimum size to read.
    +
    +
    Returns
    Returns the number of seed bytes loaded (0 indicates failure)
    -

    - + + +

    ◆ RAND_pseudo_bytes()

    +
    - + - - + + - - + + - +
    int RAND_pseudo_bytes int RAND_pseudo_bytes (void *  outdata, void * outdata,
    size_t  size size_t size 
    )
    -
    -
    - -

    -Get a random block from the random generator, should NOT be used for key material.

    -

    Parameters:
    - - - +
    +

    Get a random block from the random generator, should NOT be used for key material.

    +
    Parameters
    +
    outdata random data
    size length random data
    + +
    outdatarandom data
    sizelength random data
    +
    -
    Returns:
    1 on success, 0 on failure.
    +
    Returns
    1 on success, 0 on failure.
    -

    - + + +

    ◆ RAND_seed()

    +
    - + - - + + - - + + - +
    void RAND_seed void RAND_seed (const void *  indata, const void * indata,
    size_t  size size_t size 
    )
    -
    -
    - -

    -Seed that random number generator. Secret material can securely be feed into the function, they will never be returned.

    -

    Parameters:
    - - - +
    +

    Seed that random number generator. Secret material can securely be feed into the function, they will never be returned.

    +
    Parameters
    +
    indata seed data
    size length seed data
    + +
    indataseed data
    sizelength seed data
    +
    -

    - + + +

    ◆ RAND_set_rand_engine()

    +
    - + - - - + +
    int RAND_set_rand_engine int RAND_set_rand_engine (ENGINE *  engine  ) ENGINE * engine)
    -
    -
    - -

    -Set the default random method from engine.

    -

    Parameters:
    - - +
    +

    Set the default random method from engine.

    +
    Parameters
    +
    engine use engine, if NULL is passed it, old method and engine is cleared.
    +
    engineuse engine, if NULL is passed it, old method and engine is cleared.
    +
    -
    Returns:
    1 on success, 0 on failure.
    +
    Returns
    1 on success, 0 on failure.
    -

    - + + +

    ◆ RAND_set_rand_method()

    +
    - + - - - + +
    int RAND_set_rand_method int RAND_set_rand_method (const RAND_METHOD *  meth  ) const RAND_METHOD * meth)
    -
    -
    - -

    -Set the default random method.

    -

    Parameters:
    - - +
    +

    Set the default random method.

    +
    Parameters
    +
    meth set the new default method.
    +
    methset the new default method.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ RAND_status()

    +
    - + - - - + +
    int RAND_status int RAND_status (void   ) void )
    -
    -
    - -

    -Return status of the random generator

    -

    Returns:
    1 if the random generator can deliver random data.
    +
    +

    Return status of the random generator

    +
    Returns
    1 if the random generator can deliver random data.
    -

    - + + +

    ◆ RAND_write_file()

    +
    - + - - - + +
    int RAND_write_file int RAND_write_file (const char *  filename  ) const char * filename)
    -
    -
    - -

    -Write of random numbers to a file to store for later initiation with RAND_load_file().

    -

    Parameters:
    - - +
    +

    Write of random numbers to a file to store for later initiation with RAND_load_file().

    +
    Parameters
    +
    filename name of file to write.
    +
    filenamename of file to write.
    +
    -
    Returns:
    1 on success and non-one on failure.
    +
    Returns
    1 on success and non-one on failure.
    -

    +


    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rsa.html b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rsa.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rsa.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/group__hcrypto__rsa.html @@ -1,6 +1,6 @@ -Heimdal crypto library: RSA functions +RSA functions @@ -8,271 +8,272 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    RSA functions
    +
    -

    RSA functions

    - - - - - - - - - - - - - - - - - - +

    Functions

    RSA * RSA_new (void)
    RSA * RSA_new_method (ENGINE *engine)
    void RSA_free (RSA *rsa)
    int RSA_up_ref (RSA *rsa)
    const RSA_METHOD * RSA_get_method (const RSA *rsa)
    int RSA_set_method (RSA *rsa, const RSA_METHOD *method)
    int RSA_set_app_data (RSA *rsa, void *arg)
    void * RSA_get_app_data (const RSA *rsa)
    + + + + + + + + + + + + + + + + +

    +Functions

    RSA * RSA_new (void)
     
    RSA * RSA_new_method (ENGINE *engine)
     
    void RSA_free (RSA *rsa)
     
    int RSA_up_ref (RSA *rsa)
     
    const RSA_METHOD * RSA_get_method (const RSA *rsa)
     
    int RSA_set_method (RSA *rsa, const RSA_METHOD *method)
     
    int RSA_set_app_data (RSA *rsa, void *arg)
     
    void * RSA_get_app_data (const RSA *rsa)
     
    -

    Detailed Description

    -See the RSA - public-key cryptography for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the RSA - public-key cryptography for description and examples.

    +

    Function Documentation

    + +

    ◆ RSA_free()

    +
    - + - - - + +
    void RSA_free void RSA_free (RSA *  rsa  ) RSA * rsa)
    -
    -
    - -

    -Free an allocation RSA object.

    -

    Parameters:
    - - +
    +

    Free an allocation RSA object.

    +
    Parameters
    +
    rsa the RSA object to free.
    +
    rsathe RSA object to free.
    +
    -

    - +

    + +

    ◆ RSA_get_app_data()

    +
    - + - - - + +
    void* RSA_get_app_data void* RSA_get_app_data (const RSA *  rsa  ) const RSA * rsa)
    -
    -
    - -

    -Get the application data for the RSA object.

    -

    Parameters:
    - - +
    +

    Get the application data for the RSA object.

    +
    Parameters
    +
    rsa the rsa object to get the parameter for
    +
    rsathe rsa object to get the parameter for
    +
    -
    Returns:
    the data object
    +
    Returns
    the data object
    -

    - + + +

    ◆ RSA_get_method()

    +
    - + - - - + +
    const RSA_METHOD* RSA_get_method const RSA_METHOD* RSA_get_method (const RSA *  rsa  ) const RSA * rsa)
    -
    -
    - -

    -Return the RSA_METHOD used for this RSA object.

    -

    Parameters:
    - - +
    +

    Return the RSA_METHOD used for this RSA object.

    +
    Parameters
    +
    rsa the object to get the method from.
    +
    rsathe object to get the method from.
    +
    -
    Returns:
    the method used for this RSA object.
    +
    Returns
    the method used for this RSA object.
    -

    - + + +

    ◆ RSA_new()

    +
    - + - - - + +
    RSA* RSA_new RSA* RSA_new (void   ) void )
    -
    -
    - -

    -Same as RSA_new_method() using NULL as engine.

    -

    Returns:
    a newly allocated RSA object. Free with RSA_free().
    +
    +

    Same as RSA_new_method() using NULL as engine.

    +
    Returns
    a newly allocated RSA object. Free with RSA_free().
    -

    - + + +

    ◆ RSA_new_method()

    +
    - + - - - + +
    RSA* RSA_new_method RSA* RSA_new_method (ENGINE *  engine  ) ENGINE * engine)
    -
    -
    - -

    -Allocate a new RSA object using the engine, if NULL is specified as the engine, use the default RSA engine as returned by ENGINE_get_default_RSA().

    -

    Parameters:
    - - +
    +

    Allocate a new RSA object using the engine, if NULL is specified as the engine, use the default RSA engine as returned by ENGINE_get_default_RSA().

    +
    Parameters
    +
    engine Specific what ENGINE RSA provider should be used.
    +
    engineSpecific what ENGINE RSA provider should be used.
    +
    -
    Returns:
    a newly allocated RSA object. Free with RSA_free().
    +
    Returns
    a newly allocated RSA object. Free with RSA_free().
    -

    - + + +

    ◆ RSA_set_app_data()

    +
    - + - - + + - - + + - +
    int RSA_set_app_data int RSA_set_app_data (RSA *  rsa, RSA * rsa,
    void *  arg void * arg 
    )
    -
    -
    - -

    -Set the application data for the RSA object.

    -

    Parameters:
    - - - +
    +

    Set the application data for the RSA object.

    +
    Parameters
    +
    rsa the rsa object to set the parameter for
    arg the data object to store
    + +
    rsathe rsa object to set the parameter for
    argthe data object to store
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ RSA_set_method()

    +
    - + - - + + - - + + - +
    int RSA_set_method int RSA_set_method (RSA *  rsa, RSA * rsa,
    const RSA_METHOD *  method const RSA_METHOD * method 
    )
    -
    -
    - -

    -Set a new method for the RSA keypair.

    -

    Parameters:
    - - - +
    +

    Set a new method for the RSA keypair.

    +
    Parameters
    +
    rsa rsa parameter.
    method the new method for the RSA parameter.
    + +
    rsarsa parameter.
    methodthe new method for the RSA parameter.
    +
    -
    Returns:
    1 on success.
    +
    Returns
    1 on success.
    -

    - + + +

    ◆ RSA_up_ref()

    +
    - + - - - + +
    int RSA_up_ref int RSA_up_ref (RSA *  rsa  ) RSA * rsa)
    -
    -
    - -

    -Add an extra reference to the RSA object. The object should be free with RSA_free() to drop the reference.

    -

    Parameters:
    - - +
    +

    Add an extra reference to the RSA object. The object should be free with RSA_free() to drop the reference.

    +
    Parameters
    +
    rsa the object to add reference counting too.
    +
    rsathe object to add reference counting too.
    +
    -
    Returns:
    the current reference count, can't safely be used except for debug printing.
    +
    Returns
    the current reference count, can't safely be used except for debug printing.
    -

    +


    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/index.html b/crypto/heimdal/doc/doxyout/hcrypto/html/index.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/index.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/index.html @@ -1,6 +1,6 @@ -Heimdal crypto library: Heimdal crypto library +Heimdal crypto library @@ -8,40 +8,52 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Heimdal crypto library
    +
    -

    Heimdal crypto library

    -

    -

    1.5.2

    -Introduction

    -Heimdal libhcrypto library is a implementation many crypto algorithms, among others: AES, SHA, DES, RSA, Camellia and many help function.

    -hcrypto provies a OpenSSL compatible interface libcrypto interface and is licensed under a 3 clause BSD license (GPL compatible).

    -The project web page: http://www.h5l.org/

    -Sections of this manual:

    +

    +Introduction

    +

    Heimdal libhcrypto library is a implementation many crypto algorithms, among others: AES, SHA, DES, RSA, Camellia and many help function.

    +

    hcrypto provies a OpenSSL compatible interface libcrypto interface and is licensed under a 3 clause BSD license (GPL compatible).

    +

    The project web page: http://www.h5l.org/

    +

    Sections of this manual:

    -

    -Older interfaces that you should not use:

    +

  • EVP - generic crypto interface, EVP generic crypto functions
  • +
  • RAND - random number, RAND crypto functions
  • +
  • DH - Diffie-Hellman key exchange, Diffie-Hellman functions
  • +
  • RSA - public-key cryptography, RSA functions
  • +
  • hcrypto miscellaneous functions
  • + +

    Older interfaces that you should not use:

    -

    -Control functions

    -Functions controlling general behavior, like adding algorithms, are documented in this module: hcrypto function controlling behavior .

    -Return values

    -Return values are diffrent in this module to be compatible with OpenSSL interface. The diffrence is that on success 1 is returned instead of the customary 0.

    -History

    -Eric Young implemented DES in the library libdes, that grew into libcrypto in the ssleay package. ssleay went into recession and then got picked up by the OpenSSL (htp://www.openssl.org/) project.

    -libhcrypto is an independent implementation with no code decended from ssleay/openssl. Both includes some common imported code, for example the AES implementation.

    +
  • DES - Data Encryption Standard crypto interface, DES crypto functions
  • + +

    +Control functions

    +

    Functions controlling general behavior, like adding algorithms, are documented in this module: hcrypto function controlling behavior .

    +

    +Return values

    +

    Return values are diffrent in this module to be compatible with OpenSSL interface. The diffrence is that on success 1 is returned instead of the customary 0.

    +

    +History

    +

    Eric Young implemented DES in the library libdes, that grew into libcrypto in the ssleay package. ssleay went into recession and then got picked up by the OpenSSL (htp://www.openssl.org/) project.

    +

    libhcrypto is an independent implementation with no code decended from ssleay/openssl. Both includes some common imported code, for example the AES implementation.

    +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/jquery.js b/crypto/heimdal/doc/doxyout/hcrypto/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/menu.js b/crypto/heimdal/doc/doxyout/hcrypto/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/menudata.js b/crypto/heimdal/doc/doxyout/hcrypto/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/menudata.js @@ -0,0 +1,29 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Modules",url:"modules.html"}, +{text:"Examples",url:"examples.html"}]} diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/modules.html b/crypto/heimdal/doc/doxyout/hcrypto/html/modules.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/modules.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/modules.html @@ -1,6 +1,6 @@ -Heimdal crypto library: Module Index +Modules @@ -8,28 +8,35 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    Modules
    +
    +
    Here is a list of all modules:
    +

    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/nav_f.png b/crypto/heimdal/doc/doxyout/hcrypto/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM -Heimdal crypto library: DES - Data Encryption Standard crypto interface +DES - Data Encryption Standard crypto interface @@ -8,38 +8,51 @@ keyhole logo

    - - +
    +
    +
    DES - Data Encryption Standard crypto interface
    +
    -

    DES - Data Encryption Standard crypto interface

    See the library functions here: DES crypto functions

    -DES was created by IBM, modififed by NSA and then adopted by NBS (now NIST) and published ad FIPS PUB 46 (updated by FIPS 46-1).

    -Since the 19th May 2005 DES was withdrawn by NIST and should no longer be used. See EVP - generic crypto interface for replacement encryption algorithms and interfaces.

    -Read more the iteresting history of DES on Wikipedia http://www.wikipedia.org/wiki/Data_Encryption_Standard .

    -DES key generation

    -To generate a DES key safely you have to use the code-snippet below. This is because the DES_random_key() can fail with an abort() in case of and failure to start the random generator.

    -There is a replacement function DES_new_random_key(), however that function does not exists in OpenSSL.

    -

     DES_cblock key;
    - do {
    -     if (RAND_rand(&key, sizeof(key)) != 1)
    -          goto failure;
    -     DES_set_odd_parity(key);
    - } while (DES_is_weak_key(&key));
    -

    -DES implementation history

    -There was no complete BSD licensed, fast, GPL compatible implementation of DES, so Love wrote the part that was missing, fast key schedule setup and adapted the interface to the orignal libdes.

    -The document that got me started for real was "Efficient Implementation of the Data Encryption Standard" by Dag Arne Osvik. I never got to the PC1 transformation was working, instead I used table-lookup was used for all key schedule setup. The document was very useful since it de-mystified other implementations for me.

    -The core DES function (SBOX + P transformation) is from Richard Outerbridge public domain DES implementation. My sanity is saved thanks to his work. Thank you Richard.

    +

    See the library functions here: DES crypto functions

    +

    DES was created by IBM, modififed by NSA and then adopted by NBS (now NIST) and published ad FIPS PUB 46 (updated by FIPS 46-1).

    +

    Since the 19th May 2005 DES was withdrawn by NIST and should no longer be used. See EVP - generic crypto interface for replacement encryption algorithms and interfaces.

    +

    Read more the iteresting history of DES on Wikipedia http://www.wikipedia.org/wiki/Data_Encryption_Standard .

    +

    +DES key generation

    +

    To generate a DES key safely you have to use the code-snippet below. This is because the DES_random_key() can fail with an abort() in case of and failure to start the random generator.

    +

    There is a replacement function DES_new_random_key(), however that function does not exists in OpenSSL.

    +
    DES_cblock key;
    +
    do {
    +
    if (RAND_rand(&key, sizeof(key)) != 1)
    +
    goto failure;
    + +
    } while (DES_is_weak_key(&key));
    +
    int DES_is_weak_key(DES_cblock *key)
    Definition: des.c:178
    +
    void DES_set_odd_parity(DES_cblock *key)
    Definition: des.c:117
    +

    +DES implementation history

    +

    There was no complete BSD licensed, fast, GPL compatible implementation of DES, so Love wrote the part that was missing, fast key schedule setup and adapted the interface to the orignal libdes.

    +

    The document that got me started for real was "Efficient +Implementation of the Data Encryption Standard" by Dag Arne Osvik. I never got to the PC1 transformation was working, instead I used table-lookup was used for all key schedule setup. The document was very useful since it de-mystified other implementations for me.

    +

    The core DES function (SBOX + P transformation) is from Richard Outerbridge public domain DES implementation. My sanity is saved thanks to his work. Thank you Richard.

    +
    +

    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/page_dh.html b/crypto/heimdal/doc/doxyout/hcrypto/html/page_dh.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/page_dh.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/page_dh.html @@ -1,6 +1,6 @@ -Heimdal crypto library: DH - Diffie-Hellman key exchange +DH - Diffie-Hellman key exchange @@ -8,23 +8,32 @@ keyhole logo

    - - +
    +
    +
    DH - Diffie-Hellman key exchange
    +
    -

    DH - Diffie-Hellman key exchange

    Diffie-Hellman key exchange is a protocol that allows two parties to establish a shared secret key.

    -Include and example how to use DH_new() and friends here.

    -See the library functions here: Diffie-Hellman functions

    +

    Diffie-Hellman key exchange is a protocol that allows two parties to establish a shared secret key.

    +

    Include and example how to use DH_new() and friends here.

    +

    See the library functions here: Diffie-Hellman functions

    +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/page_evp.html b/crypto/heimdal/doc/doxyout/hcrypto/html/page_evp.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/page_evp.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/page_evp.html @@ -1,6 +1,6 @@ -Heimdal crypto library: EVP - generic crypto interface +EVP - generic crypto interface @@ -8,23 +8,33 @@ keyhole logo

    - - +
    +
    +
    EVP - generic crypto interface
    +
    -

    EVP - generic crypto interface

    See the library functions here: EVP generic crypto functions

    -EVP Cipher

    -The use of EVP_CipherInit_ex() and EVP_Cipher() is pretty easy to understand forward, then EVP_CipherUpdate() and EVP_CipherFinal_ex() really needs an example to explain example_evp_cipher::c .
    +

    See the library functions here: EVP generic crypto functions

    +

    +EVP Cipher

    +

    The use of EVP_CipherInit_ex() and EVP_Cipher() is pretty easy to understand forward, then EVP_CipherUpdate() and EVP_CipherFinal_ex() really needs an example to explain example_evp_cipher.c .

    +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/page_rand.html b/crypto/heimdal/doc/doxyout/hcrypto/html/page_rand.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/page_rand.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/page_rand.html @@ -1,6 +1,6 @@ -Heimdal crypto library: RAND - random number +RAND - random number @@ -8,21 +8,30 @@ keyhole logo

    - - +
    +
    +
    RAND - random number
    +
    -

    RAND - random number

    See the library functions here: RAND crypto functions
    +

    See the library functions here: RAND crypto functions

    +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/page_rsa.html b/crypto/heimdal/doc/doxyout/hcrypto/html/page_rsa.html --- a/crypto/heimdal/doc/doxyout/hcrypto/html/page_rsa.html +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/page_rsa.html @@ -1,6 +1,6 @@ -Heimdal crypto library: RSA - public-key cryptography +RSA - public-key cryptography @@ -8,24 +8,35 @@ keyhole logo

    - - +
    +
    +
    RSA - public-key cryptography
    +
    -

    RSA - public-key cryptography

    RSA is named by its inventors (Ron Rivest, Adi Shamir, and Leonard Adleman) (published in 1977), patented expired in 21 September 2000.

    -Speed for RSA in seconds no key blinding 1000 iteration, same rsa keys (1024 and 2048) operation performed each eteration sign, verify, encrypt, decrypt on a random bit pattern

    -name 1024 2048 4098 ================================= gmp: 0.73 6.60 44.80 tfm: 2.45 -- -- ltm: 3.79 20.74 105.41 (default in hcrypto) openssl: 4.04 11.90 82.59 cdsa: 15.89 102.89 721.40 imath: 40.62 -- --

    -See the library functions here: RSA functions

    +

    RSA is named by its inventors (Ron Rivest, Adi Shamir, and Leonard Adleman) (published in 1977), patented expired in 21 September 2000.

    +

    Speed for RSA in seconds no key blinding 1000 iteration, same rsa keys (1024 and 2048) operation performed each eteration sign, verify, encrypt, decrypt on a random bit pattern

    +

    +name 1024 2048 4098

    +

    gmp: 0.73 6.60 44.80 tfm: 2.45 – – ltm: 3.79 20.74 105.41 (default in hcrypto) openssl: 4.04 11.90 82.59 cdsa: 15.89 102.89 721.40 imath: 40.62 – –

    +

    See the library functions here: RSA functions

    +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdal crypto library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/pages.html b/crypto/heimdal/doc/doxyout/hcrypto/html/pages.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/html/pages.html @@ -0,0 +1,33 @@ + + +Related Pages + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal crypto library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/splitbar.png b/crypto/heimdal/doc/doxyout/hcrypto/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zc%17D@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@IeJfk6j|89*WoOiV6}4AuZ}83fn> diff --git a/crypto/heimdal/doc/doxyout/hcrypto/html/tab_b.png b/crypto/heimdal/doc/doxyout/hcrypto/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 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 literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/EVP_hcrypto_md2.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/OSSL_CIPHER_ALGORITHM.3 rename from crypto/heimdal/doc/doxyout/hcrypto/man/man3/EVP_hcrypto_md2.3 rename to crypto/heimdal/doc/doxyout/hcrypto/man/man3/OSSL_CIPHER_ALGORITHM.3 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/PKCS5_PBKDF2_HMAC.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/PKCS5_PBKDF2_HMAC.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/PKCS5_PBKDF2_HMAC.3 @@ -0,0 +1 @@ +.so man3/hcrypto_misc.3 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/EVP_md2.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/WINCNG_CIPHER_ALGORITHM.3 rename from crypto/heimdal/doc/doxyout/hcrypto/man/man3/EVP_md2.3 rename to crypto/heimdal/doc/doxyout/hcrypto/man/man3/WINCNG_CIPHER_ALGORITHM.3 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/EVP_hcrypto_md2.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/WINCNG_CIPHER_ALGORITHM_UNAVAILABLE.3 rename from crypto/heimdal/doc/doxyout/hcrypto/man/man3/EVP_hcrypto_md2.3 rename to crypto/heimdal/doc/doxyout/hcrypto/man/man3/WINCNG_CIPHER_ALGORITHM_UNAVAILABLE.3 diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_core.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_core.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_core.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_core.3 @@ -1,8 +1,11 @@ -.TH "hcrypto function controlling behavior" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "hcrypto_core" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME -hcrypto function controlling behavior \- +hcrypto_core \- hcrypto function controlling behavior +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -28,49 +31,47 @@ .SH "Function Documentation" .PP .SS "int EVP_CIPHER_CTX_ctrl (EVP_CIPHER_CTX * ctx, int type, int arg, void * data)" -.PP Perform a operation on a ctx .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP context to perform operation on. +\fIctx\fP context to perform operation on\&. .br -\fItype\fP type of operation. +\fItype\fP type of operation\&. .br -\fIarg\fP argument to operation. +\fIarg\fP argument to operation\&. .br -\fIdata\fP addition data to operation. +\fIdata\fP addition data to operation\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 for success, 0 for failure. +1 for success, 0 for failure\&. .RE .PP .SS "int EVP_CIPHER_CTX_rand_key (EVP_CIPHER_CTX * ctx, void * key)" +Generate a random key for the specificed EVP_CIPHER\&. .PP -Generate a random key for the specificed EVP_CIPHER. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP EVP_CIPHER_CTX type to build the key for. +\fIctx\fP EVP_CIPHER_CTX type to build the key for\&. .br -\fIkey\fP return key, must be at least \fBEVP_CIPHER_key_length()\fP byte long. +\fIkey\fP return key, must be at least \fBEVP_CIPHER_key_length()\fP byte long\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 for success, 0 for failure. +1 for success, 0 for failure\&. .RE .PP .SS "void OpenSSL_add_all_algorithms (void)" -.PP -Add all algorithms to the crypto core. +Add all algorithms to the crypto core\&. .SS "void OpenSSL_add_all_algorithms_conf (void)" -.PP -Add all algorithms to the crypto core using configuration file. +Add all algorithms to the crypto core using configuration file\&. .SS "void OpenSSL_add_all_algorithms_noconf (void)" -.PP -Add all algorithms to the crypto core, but don't use the configuration file. +Add all algorithms to the crypto core, but don't use the configuration file\&. +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal crypto library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_des.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_des.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_des.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_des.3 @@ -1,8 +1,11 @@ -.TH "DES crypto functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "hcrypto_des" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME -DES crypto functions \- +hcrypto_des \- DES crypto functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -66,16 +69,15 @@ .in -1c .SH "Detailed Description" .PP -See the \fBDES - Data Encryption Standard crypto interface\fP for description and examples. +See the \fBDES - Data Encryption Standard crypto interface\fP for description and examples\&. .SH "Function Documentation" .PP .SS "uint32_t DES_cbc_cksum (const void * in, DES_cblock * output, long length, DES_key_schedule * ks, DES_cblock * iv)" +Crete a checksum using DES in CBC encryption mode\&. This mode is only used for Kerberos 4, and it should stay that way\&. .PP -Crete a checksum using DES in CBC encryption mode. This mode is only used for Kerberos 4, and it should stay that way. -.PP -The IV must always be diffrent for diffrent input data blocks. +The IV must always be diffrent for diffrent input data blocks\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIin\fP data to checksum .br @@ -90,12 +92,11 @@ .PP .SS "void DES_cbc_encrypt (const void * in, void * out, long length, DES_key_schedule * ks, DES_cblock * iv, int encp)" +Encrypt/decrypt a block using DES in Chain Block Cipher mode (cbc)\&. .PP -Encrypt/decrypt a block using DES in Chain Block Cipher mode (cbc). +The IV must always be diffrent for diffrent input data blocks\&. .PP -The IV must always be diffrent for diffrent input data blocks. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIin\fP data to encrypt .br @@ -107,17 +108,16 @@ .br \fIiv\fP initial vector to use .br -\fIencp\fP if non zero, encrypt. if zero, decrypt. +\fIencp\fP if non zero, encrypt\&. if zero, decrypt\&. .RE .PP .SS "void DES_cfb64_encrypt (const void * in, void * out, long length, DES_key_schedule * ks, DES_cblock * iv, int * num, int encp)" +Encrypt/decrypt using DES in cipher feedback mode with 64 bit feedback\&. .PP -Encrypt/decrypt using DES in cipher feedback mode with 64 bit feedback. -.PP -The IV must always be diffrent for diffrent input data blocks. +The IV must always be diffrent for diffrent input data blocks\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIin\fP data to encrypt .br @@ -129,32 +129,30 @@ .br \fIiv\fP initial vector to use .br -\fInum\fP offset into in cipher block encryption/decryption stop last time. +\fInum\fP offset into in cipher block encryption/decryption stop last time\&. .br -\fIencp\fP if non zero, encrypt. if zero, decrypt. +\fIencp\fP if non zero, encrypt\&. if zero, decrypt\&. .RE .PP .SS "int HC_DEPRECATED DES_check_key_parity (DES_cblock * key)" +Check if the key have correct parity\&. .PP -Check if the key have correct parity. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP key to check the parity. +\fIkey\fP key to check the parity\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success, 0 on failure. +1 on success, 0 on failure\&. .RE .PP .SS "void DES_ecb3_encrypt (DES_cblock * input, DES_cblock * output, DES_key_schedule * ks1, DES_key_schedule * ks2, DES_key_schedule * ks3, int encp)" +Encrypt/decrypt a block using triple DES using EDE mode, encrypt/decrypt/encrypt\&. .PP -Encrypt/decrypt a block using triple DES using EDE mode, encrypt/decrypt/encrypt. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIinput\fP data to encrypt .br @@ -166,15 +164,14 @@ .br \fIks3\fP key schedule to use .br -\fIencp\fP if non zero, encrypt. if zero, decrypt. +\fIencp\fP if non zero, encrypt\&. if zero, decrypt\&. .RE .PP .SS "void DES_ecb_encrypt (DES_cblock * input, DES_cblock * output, DES_key_schedule * ks, int encp)" +Encrypt/decrypt a block using DES\&. .PP -Encrypt/decrypt a block using DES. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIinput\fP data to encrypt .br @@ -182,17 +179,16 @@ .br \fIks\fP key schedule to use .br -\fIencp\fP if non zero, encrypt. if zero, decrypt. +\fIencp\fP if non zero, encrypt\&. if zero, decrypt\&. .RE .PP .SS "void DES_ede3_cbc_encrypt (const void * in, void * out, long length, DES_key_schedule * ks1, DES_key_schedule * ks2, DES_key_schedule * ks3, DES_cblock * iv, int encp)" +Encrypt/decrypt using Triple DES in Chain Block Cipher mode (cbc)\&. .PP -Encrypt/decrypt using Triple DES in Chain Block Cipher mode (cbc). -.PP -The IV must always be diffrent for diffrent input data blocks. +The IV must always be diffrent for diffrent input data blocks\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIin\fP data to encrypt .br @@ -208,88 +204,82 @@ .br \fIiv\fP initial vector to use .br -\fIencp\fP if non zero, encrypt. if zero, decrypt. +\fIencp\fP if non zero, encrypt\&. if zero, decrypt\&. .RE .PP .SS "void DES_encrypt (uint32_t u[2], DES_key_schedule * ks, int encp)" +Encrypt/decrypt a block using DES\&. Also called ECB mode .PP -Encrypt/decrypt a block using DES. Also called ECB mode -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIu\fP data to encrypt .br \fIks\fP key schedule to use .br -\fIencp\fP if non zero, encrypt. if zero, decrypt. +\fIencp\fP if non zero, encrypt\&. if zero, decrypt\&. .RE .PP .SS "void HC_DEPRECATED DES_init_random_number_generator (DES_cblock * seed)" +Seed the random number generator\&. Deprecated, use \fBRAND - random number\fP .PP -Seed the random number generator. Deprecated, use \fBRAND - random number\fP -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIseed\fP a seed to seed that random number generate with. +\fIseed\fP a seed to seed that random number generate with\&. .RE .PP .SS "int DES_is_weak_key (DES_cblock * key)" +Checks if the key is any of the weaks keys that makes DES attacks trival\&. .PP -Checks if the key is any of the weaks keys that makes DES attacks trival. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP key to check. +\fIkey\fP key to check\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 if the key is weak, 0 otherwise. +1 if the key is weak, 0 otherwise\&. .RE .PP .SS "int DES_key_sched (DES_cblock * key, DES_key_schedule * ks)" +Compatibility function for eay libdes, works just like \fBDES_set_key_checked()\fP\&. .PP -Compatibility function for eay libdes, works just like \fBDES_set_key_checked()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP a key to initialize the key schedule with. +\fIkey\fP a key to initialize the key schedule with\&. .br -\fIks\fP a key schedule to initialize. +\fIks\fP a key schedule to initialize\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, -1 on invalid parity, -2 on weak key. +0 on success, -1 on invalid parity, -2 on weak key\&. .RE .PP .SS "int HC_DEPRECATED DES_new_random_key (DES_cblock * key)" +Generate a random des key using a random block, fixup parity and skip weak keys\&. .PP -Generate a random des key using a random block, fixup parity and skip weak keys. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP is set to a random key. +\fIkey\fP is set to a random key\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, non zero on random number generator failure. +0 on success, non zero on random number generator failure\&. .RE .PP .SS "void DES_pcbc_encrypt (const void * in, void * out, long length, DES_key_schedule * ks, DES_cblock * iv, int encp)" +Encrypt/decrypt a block using DES in Propagating Cipher Block Chaining mode\&. This mode is only used for Kerberos 4, and it should stay that way\&. .PP -Encrypt/decrypt a block using DES in Propagating Cipher Block Chaining mode. This mode is only used for Kerberos 4, and it should stay that way. +The IV must always be diffrent for diffrent input data blocks\&. .PP -The IV must always be diffrent for diffrent input data blocks. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIin\fP data to encrypt .br @@ -301,88 +291,82 @@ .br \fIiv\fP initial vector to use .br -\fIencp\fP if non zero, encrypt. if zero, decrypt. +\fIencp\fP if non zero, encrypt\&. if zero, decrypt\&. .RE .PP .SS "void HC_DEPRECATED DES_random_key (DES_cblock * key)" +Generate a random key, deprecated since it doesn't return an error code, use \fBDES_new_random_key()\fP\&. .PP -Generate a random key, deprecated since it doesn't return an error code, use \fBDES_new_random_key()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP is set to a random key. +\fIkey\fP is set to a random key\&. .RE .PP .SS "int HC_DEPRECATED DES_set_key (DES_cblock * key, DES_key_schedule * ks)" +Setup a des key schedule from a key\&. Deprecated function, use \fBDES_set_key_unchecked()\fP or \fBDES_set_key_checked()\fP instead\&. .PP -Setup a des key schedule from a key. Deprecated function, use \fBDES_set_key_unchecked()\fP or \fBDES_set_key_checked()\fP instead. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP a key to initialize the key schedule with. +\fIkey\fP a key to initialize the key schedule with\&. .br -\fIks\fP a key schedule to initialize. +\fIks\fP a key schedule to initialize\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 0 on success .RE .PP .SS "int DES_set_key_checked (DES_cblock * key, DES_key_schedule * ks)" +Just like \fBDES_set_key_unchecked()\fP except checking that the key is not weak for or have correct parity\&. .PP -Just like \fBDES_set_key_unchecked()\fP except checking that the key is not weak for or have correct parity. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP a key to initialize the key schedule with. +\fIkey\fP a key to initialize the key schedule with\&. .br -\fIks\fP a key schedule to initialize. +\fIks\fP a key schedule to initialize\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, -1 on invalid parity, -2 on weak key. +0 on success, -1 on invalid parity, -2 on weak key\&. .RE .PP .SS "int DES_set_key_unchecked (DES_cblock * key, DES_key_schedule * ks)" +Setup a des key schedule from a key\&. The key is no longer needed after this transaction and can cleared\&. .PP -Setup a des key schedule from a key. The key is no longer needed after this transaction and can cleared. -.PP -Does NOT check that the key is weak for or have wrong parity. +Does NOT check that the key is weak for or have wrong parity\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP a key to initialize the key schedule with. +\fIkey\fP a key to initialize the key schedule with\&. .br -\fIks\fP a key schedule to initialize. +\fIks\fP a key schedule to initialize\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 0 on success .RE .PP .SS "void DES_set_odd_parity (DES_cblock * key)" +Set the parity of the key block, used to generate a des key from a random key\&. See \fBDES key generation\fP\&. .PP -Set the parity of the key block, used to generate a des key from a random key. See \fBDES key generation\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIkey\fP key to fixup the parity for. +\fIkey\fP key to fixup the parity for\&. .RE .PP .SS "void DES_string_to_key (const char * str, DES_cblock * key)" +Convert a string to a DES key\&. Use something like \fBPKCS5_PBKDF2_HMAC_SHA1()\fP to create key from passwords\&. .PP -Convert a string to a DES key. Use something like \fBPKCS5_PBKDF2_HMAC_SHA1()\fP to create key from passwords. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIstr\fP The string to convert to a key .br @@ -390,3 +374,6 @@ .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal crypto library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_dh.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_dh.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_dh.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_dh.3 @@ -1,8 +1,11 @@ -.TH "Diffie-Hellman functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "hcrypto_dh" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME -Diffie-Hellman functions \- +hcrypto_dh \- Diffie-Hellman functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -57,254 +60,233 @@ .in -1c .SH "Detailed Description" .PP -See the \fBDH - Diffie-Hellman key exchange\fP for description and examples. +See the \fBDH - Diffie-Hellman key exchange\fP for description and examples\&. .SH "Function Documentation" .PP .SS "int DH_check_pubkey (const DH * dh, const BIGNUM * pub_key, int * codes)" +Check that the public key is sane\&. .PP -Check that the public key is sane. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP the local peer DH parameters. +\fIdh\fP the local peer DH parameters\&. .br -\fIpub_key\fP the remote peer public key parameters. +\fIpub_key\fP the remote peer public key parameters\&. .br -\fIcodes\fP return that the failures of the pub_key are. +\fIcodes\fP return that the failures of the pub_key are\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 1 on success, 0 on failure and *codes is set the the combined fail check for the public key .RE -.PP - .PP Checks that the function performs are: .IP "\(bu" 2 pub_key is not negative -.PP -.PP .IP "\(bu" 2 -pub_key > 1 and pub_key < p - 1, to avoid small subgroups attack. -.PP -.PP +pub_key > 1 and pub_key < p - 1, to avoid small subgroups attack\&. .IP "\(bu" 2 -if g == 2, pub_key have more then one bit set, if bits set is 1, log_2(pub_key) is trival +if g == 2, pub_key have more then one bit set, if bits set is 1, log_2(pub_key) is trival .PP .SS "int DH_compute_key (unsigned char * shared_key, const BIGNUM * peer_pub_key, DH * dh)" +Complute the shared secret key\&. .PP -Complute the shared secret key. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIshared_key\fP the resulting shared key, need to be at least \fBDH_size()\fP large. +\fIshared_key\fP the resulting shared key, need to be at least \fBDH_size()\fP large\&. .br -\fIpeer_pub_key\fP the peer's public key. +\fIpeer_pub_key\fP the peer's public key\&. .br -\fIdh\fP the dh key pair. +\fIdh\fP the dh key pair\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP - -.PP -Checks that the pubkey passed in is valid using \fBDH_check_pubkey()\fP. +Checks that the pubkey passed in is valid using \fBDH_check_pubkey()\fP\&. .SS "void DH_free (DH * dh)" +Free a DH object and release related resources, like ENGINE, that the object was using\&. .PP -Free a DH object and release related resources, like ENGINE, that the object was using. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP object to be freed. +\fIdh\fP object to be freed\&. .RE .PP .SS "int DH_generate_key (DH * dh)" +Generate a new DH private-public key pair\&. The dh parameter must be allocted first with \fBDH_new()\fP\&. dh->p and dp->g must be set\&. .PP -Generate a new DH private-public key pair. The dh parameter must be allocted first with \fBDH_new()\fP. dh->p and dp->g must be set. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP dh parameter. +\fIdh\fP dh parameter\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int DH_generate_parameters_ex (DH * dh, int prime_len, int generator, BN_GENCB * cb)" +Generate DH parameters for the DH object give parameters\&. .PP -Generate DH parameters for the DH object give parameters. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP The DH object to generate parameters for. +\fIdh\fP The DH object to generate parameters for\&. .br \fIprime_len\fP length of the prime .br \fIgenerator\fP generator, g .br -\fIcb\fP Callback parameters to show progress, can be NULL. +\fIcb\fP Callback parameters to show progress, can be NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the maximum size in bytes of the out data. +the maximum size in bytes of the out data\&. .RE .PP .SS "const DH_METHOD* DH_get_default_method (void)" +Return the default DH implementation\&. .PP -Return the default DH implementation. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -pointer to a DH_METHOD. +pointer to a DH_METHOD\&. .RE .PP .SS "void* DH_get_ex_data (DH * dh, int idx)" +Get the data for index idx in the DH object\&. .PP -Get the data for index idx in the DH object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP DH object. +\fIdh\fP DH object\&. .br -\fIidx\fP index to get the data for. +\fIidx\fP index to get the data for\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 the object store in index idx .RE .PP .SS "const DH_METHOD* DH_ltm_method (void)" +DH implementation using libtommath\&. .PP -DH implementation using libtommath. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the DH_METHOD for the DH implementation using libtommath. +the DH_METHOD for the DH implementation using libtommath\&. .RE .PP .SS "DH* DH_new (void)" +Create a new DH object using DH_new_method(NULL), see \fBDH_new_method()\fP\&. .PP -Create a new DH object using DH_new_method(NULL), see \fBDH_new_method()\fP. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a newly allocated DH object. +a newly allocated DH object\&. .RE .PP .SS "DH* DH_new_method (ENGINE * engine)" +Create a new DH object from the given engine, if the NULL is used, the default engine is used\&. Free the DH object with \fBDH_free()\fP\&. .PP -Create a new DH object from the given engine, if the NULL is used, the default engine is used. Free the DH object with \fBDH_free()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIengine\fP The engine to use to allocate the DH object. +\fIengine\fP The engine to use to allocate the DH object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a newly allocated DH object. +a newly allocated DH object\&. .RE .PP .SS "const DH_METHOD* DH_null_method (void)" +Return the dummy DH implementation\&. .PP -Return the dummy DH implementation. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -pointer to a DH_METHOD. +pointer to a DH_METHOD\&. .RE .PP .SS "void DH_set_default_method (const DH_METHOD * meth)" +Set the default DH implementation\&. .PP -Set the default DH implementation. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fImeth\fP pointer to a DH_METHOD. +\fImeth\fP pointer to a DH_METHOD\&. .RE .PP .SS "int DH_set_ex_data (DH * dh, int idx, void * data)" +Set the data index idx in the DH object to data\&. .PP -Set the data index idx in the DH object to data. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP DH object. +\fIdh\fP DH object\&. .br -\fIidx\fP index to set the data for. +\fIidx\fP index to set the data for\&. .br -\fIdata\fP data to store for the index idx. +\fIdata\fP data to store for the index idx\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int DH_set_method (DH * dh, const DH_METHOD * method)" +Set a new method for the DH keypair\&. .PP -Set a new method for the DH keypair. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP dh parameter. +\fIdh\fP dh parameter\&. .br -\fImethod\fP the new method for the DH parameter. +\fImethod\fP the new method for the DH parameter\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int DH_size (const DH * dh)" +The maximum output size of the \fBDH_compute_key()\fP function\&. .PP -The maximum output size of the \fBDH_compute_key()\fP function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP The DH object to get the size from. +\fIdh\fP The DH object to get the size from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the maximum size in bytes of the out data. +the maximum size in bytes of the out data\&. .RE .PP .SS "int DH_up_ref (DH * dh)" +Add a reference to the DH object\&. The object should be free with \fBDH_free()\fP to drop the reference\&. .PP -Add a reference to the DH object. The object should be free with \fBDH_free()\fP to drop the reference. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIdh\fP the object to increase the reference count too. +\fIdh\fP the object to increase the reference count too\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the updated reference count, can't safely be used except for debug printing. +the updated reference count, can't safely be used except for debug printing\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal crypto library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_evp.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_evp.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_evp.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_evp.3 @@ -1,8 +1,11 @@ -.TH "EVP generic crypto functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "hcrypto_evp" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME -EVP generic crypto functions \- +hcrypto_evp \- EVP generic crypto functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -46,9 +49,6 @@ .RI "const EVP_MD * \fBEVP_hcrypto_md4\fP (void)" .br .ti -1c -.RI "const EVP_MD * \fBEVP_hcrypto_md2\fP (void)" -.br -.ti -1c .RI "const EVP_CIPHER * \fBEVP_hcrypto_des_cbc\fP (void)" .br .ti -1c @@ -73,6 +73,60 @@ .RI "const EVP_CIPHER * \fBEVP_hcrypto_camellia_256_cbc\fP (void)" .br .ti -1c +.RI "\fBOSSL_CIPHER_ALGORITHM\fP (rc2_cbc, hc_EVP_CIPH_CBC_MODE|hc_EVP_CIPH_VARIABLE_LENGTH) OSSL_CIPHER_ALGORITHM(rc2_40_cbc" +.br +.ti -1c +.RI "hc_EVP_CIPH_CBC_MODE \fBOSSL_CIPHER_ALGORITHM\fP (rc2_64_cbc, hc_EVP_CIPH_CBC_MODE|hc_EVP_CIPH_VARIABLE_LENGTH) OSSL_CIPHER_ALGORITHM(rc4" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (des_ede3_cbc, BCRYPT_3DES_ALGORITHM, 8, 24, 8, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (des_cbc, BCRYPT_DES_ALGORITHM, 8, 8, 8, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (aes_128_cbc, BCRYPT_AES_ALGORITHM, 16, 16, 16, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (aes_192_cbc, BCRYPT_AES_ALGORITHM, 16, 24, 16, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (aes_256_cbc, BCRYPT_AES_ALGORITHM, 16, 32, 16, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (aes_128_cfb8, BCRYPT_AES_ALGORITHM, 16, 16, 16, EVP_CIPH_CFB8_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (aes_192_cfb8, BCRYPT_AES_ALGORITHM, 16, 24, 16, EVP_CIPH_CFB8_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (aes_256_cfb8, BCRYPT_AES_ALGORITHM, 16, 32, 16, EVP_CIPH_CFB8_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (rc2_cbc, BCRYPT_RC2_ALGORITHM, 8, 16, 8, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (rc2_40_cbc, BCRYPT_RC2_ALGORITHM, 8, 5, 8, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (rc2_64_cbc, BCRYPT_RC2_ALGORITHM, 8, 8, 8, EVP_CIPH_CBC_MODE)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM_UNAVAILABLE\fP (camellia_128_cbc)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM_UNAVAILABLE\fP (camellia_192_cbc)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM_UNAVAILABLE\fP (camellia_256_cbc)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (rc4, BCRYPT_RC4_ALGORITHM, 1, 16, 0, EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH)" +.br +.ti -1c +.RI "\fBWINCNG_CIPHER_ALGORITHM\fP (rc4_40, BCRYPT_RC4_ALGORITHM, 1, 5, 0, EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH)" +.br +.ti -1c .RI "size_t \fBEVP_MD_size\fP (const EVP_MD *md)" .br .ti -1c @@ -133,9 +187,6 @@ .RI "const EVP_MD * \fBEVP_md4\fP (void)" .br .ti -1c -.RI "const EVP_MD * \fBEVP_md2\fP (void)" -.br -.ti -1c .RI "const EVP_MD * \fBEVP_md_null\fP (void)" .br .ti -1c @@ -249,535 +300,500 @@ .in -1c .SH "Detailed Description" .PP -See the \fBEVP - generic crypto interface\fP for description and examples. +See the \fBEVP - generic crypto interface\fP for description and examples\&. .SH "Function Documentation" .PP .SS "const EVP_CIPHER* EVP_aes_128_cbc (void)" -.PP The AES-128 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-128 EVP_CIPHER pointer. +the AES-128 EVP_CIPHER pointer\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "const EVP_CIPHER* EVP_aes_128_cfb8 (void)" -.PP The AES-128 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-128 EVP_CIPHER pointer. +the AES-128 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_aes_192_cbc (void)" -.PP The AES-192 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-192 EVP_CIPHER pointer. +the AES-192 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_aes_192_cfb8 (void)" -.PP The AES-192 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-192 EVP_CIPHER pointer. +the AES-192 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_aes_256_cbc (void)" -.PP The AES-256 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-256 EVP_CIPHER pointer. +the AES-256 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_aes_256_cfb8 (void)" -.PP The AES-256 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-256 EVP_CIPHER pointer. +the AES-256 EVP_CIPHER pointer\&. .RE .PP .SS "int EVP_BytesToKey (const EVP_CIPHER * type, const EVP_MD * md, const void * salt, const void * data, size_t datalen, unsigned int count, void * keydata, void * ivdata)" +Provides a legancy string to key function, used in PEM files\&. .PP -Provides a legancy string to key function, used in PEM files. -.PP -New protocols should use new string to key functions like NIST SP56-800A or PKCS#5 v2.0 (see \fBPKCS5_PBKDF2_HMAC_SHA1()\fP). +New protocols should use new string to key functions like NIST SP56-800A or PKCS#5 v2\&.0 (see \fBPKCS5_PBKDF2_HMAC_SHA1()\fP)\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fItype\fP type of cipher to use .br \fImd\fP message digest to use .br -\fIsalt\fP salt salt string, should be an binary 8 byte buffer. +\fIsalt\fP salt salt string, should be an binary 8 byte buffer\&. .br -\fIdata\fP the password/input key string. +\fIdata\fP the password/input key string\&. .br -\fIdatalen\fP length of data parameter. +\fIdatalen\fP length of data parameter\&. .br -\fIcount\fP iteration counter. +\fIcount\fP iteration counter\&. .br -\fIkeydata\fP output keydata, needs to of the size \fBEVP_CIPHER_key_length()\fP. +\fIkeydata\fP output keydata, needs to of the size \fBEVP_CIPHER_key_length()\fP\&. .br -\fIivdata\fP output ivdata, needs to of the size \fBEVP_CIPHER_block_size()\fP. +\fIivdata\fP output ivdata, needs to of the size \fBEVP_CIPHER_block_size()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the size of derived key. +the size of derived key\&. .RE .PP .SS "const EVP_CIPHER* EVP_camellia_128_cbc (void)" -.PP The Camellia-128 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the Camellia-128 EVP_CIPHER pointer. +the Camellia-128 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_camellia_192_cbc (void)" -.PP The Camellia-198 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the Camellia-198 EVP_CIPHER pointer. +the Camellia-198 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_camellia_256_cbc (void)" -.PP The Camellia-256 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the Camellia-256 EVP_CIPHER pointer. +the Camellia-256 EVP_CIPHER pointer\&. .RE .PP .SS "size_t EVP_CIPHER_block_size (const EVP_CIPHER * c)" +Return the block size of the cipher\&. .PP -Return the block size of the cipher. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIc\fP cipher to get the block size from. +\fIc\fP cipher to get the block size from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the block size of the cipher. +the block size of the cipher\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "size_t EVP_CIPHER_CTX_block_size (const EVP_CIPHER_CTX * ctx)" +Return the block size of the cipher context\&. .PP -Return the block size of the cipher context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP cipher context to get the block size from. +\fIctx\fP cipher context to get the block size from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the block size of the cipher context. +the block size of the cipher context\&. .RE .PP .SS "const EVP_CIPHER* EVP_CIPHER_CTX_cipher (EVP_CIPHER_CTX * ctx)" +Return the EVP_CIPHER for a EVP_CIPHER_CTX context\&. .PP -Return the EVP_CIPHER for a EVP_CIPHER_CTX context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the context to get the cipher type from. +\fIctx\fP the context to get the cipher type from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the EVP_CIPHER pointer. +the EVP_CIPHER pointer\&. .RE .PP .SS "int EVP_CIPHER_CTX_cleanup (EVP_CIPHER_CTX * c)" +Clean up the EVP_CIPHER_CTX context\&. .PP -Clean up the EVP_CIPHER_CTX context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIc\fP the cipher to clean up. +\fIc\fP the cipher to clean up\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "unsigned long EVP_CIPHER_CTX_flags (const EVP_CIPHER_CTX * ctx)" +Get the flags for an EVP_CIPHER_CTX context\&. .PP -Get the flags for an EVP_CIPHER_CTX context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP the EVP_CIPHER_CTX to get the flags from .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the flags for an EVP_CIPHER_CTX. +the flags for an EVP_CIPHER_CTX\&. .RE .PP .SS "void* EVP_CIPHER_CTX_get_app_data (EVP_CIPHER_CTX * ctx)" +Get the app data for an EVP_CIPHER_CTX context\&. .PP -Get the app data for an EVP_CIPHER_CTX context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP the EVP_CIPHER_CTX to get the app data from .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the app data for an EVP_CIPHER_CTX. +the app data for an EVP_CIPHER_CTX\&. .RE .PP .SS "void EVP_CIPHER_CTX_init (EVP_CIPHER_CTX * c)" +Initiate a EVP_CIPHER_CTX context\&. Clean up with \fBEVP_CIPHER_CTX_cleanup()\fP\&. .PP -Initiate a EVP_CIPHER_CTX context. Clean up with \fBEVP_CIPHER_CTX_cleanup()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIc\fP the cipher initiate. +\fIc\fP the cipher initiate\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "size_t EVP_CIPHER_CTX_iv_length (const EVP_CIPHER_CTX * ctx)" +Return the IV size of the cipher context\&. .PP -Return the IV size of the cipher context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP cipher context to get the IV size from. +\fIctx\fP cipher context to get the IV size from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the IV size of the cipher context. +the IV size of the cipher context\&. .RE .PP .SS "size_t EVP_CIPHER_CTX_key_length (const EVP_CIPHER_CTX * ctx)" +Return the key size of the cipher context\&. .PP -Return the key size of the cipher context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP cipher context to get the key size from. +\fIctx\fP cipher context to get the key size from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the key size of the cipher context. +the key size of the cipher context\&. .RE .PP .SS "int EVP_CIPHER_CTX_mode (const EVP_CIPHER_CTX * ctx)" +Get the mode for an EVP_CIPHER_CTX context\&. .PP -Get the mode for an EVP_CIPHER_CTX context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP the EVP_CIPHER_CTX to get the mode from .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the mode for an EVP_CIPHER_CTX. +the mode for an EVP_CIPHER_CTX\&. .RE .PP .SS "void EVP_CIPHER_CTX_set_app_data (EVP_CIPHER_CTX * ctx, void * data)" +Set the app data for an EVP_CIPHER_CTX context\&. .PP -Set the app data for an EVP_CIPHER_CTX context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP the EVP_CIPHER_CTX to set the app data for .br -\fIdata\fP the app data to set for an EVP_CIPHER_CTX. +\fIdata\fP the app data to set for an EVP_CIPHER_CTX\&. .RE .PP .SS "int EVP_CIPHER_CTX_set_key_length (EVP_CIPHER_CTX * c, int length)" -.PP If the cipher type supports it, change the key length .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIc\fP the cipher context to change the key length for .br \fIlength\fP new key length .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "size_t EVP_CIPHER_iv_length (const EVP_CIPHER * c)" +Return the IV size of the cipher\&. .PP -Return the IV size of the cipher. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIc\fP cipher to get the IV size from. +\fIc\fP cipher to get the IV size from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the IV size of the cipher. +the IV size of the cipher\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "size_t EVP_CIPHER_key_length (const EVP_CIPHER * c)" +Return the key size of the cipher\&. .PP -Return the key size of the cipher. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIc\fP cipher to get the key size from. +\fIc\fP cipher to get the key size from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the key size of the cipher. +the key size of the cipher\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "int EVP_CipherFinal_ex (EVP_CIPHER_CTX * ctx, void * out, int * outlen)" -.PP Encipher/decipher final data .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the cipher context. +\fIctx\fP the cipher context\&. .br -\fIout\fP output data from the operation. +\fIout\fP output data from the operation\&. .br \fIoutlen\fP output length .RE .PP -The input length needs to be at least \fBEVP_CIPHER_block_size()\fP bytes long. +The input length needs to be at least \fBEVP_CIPHER_block_size()\fP bytes long\&. .PP -See \fBEVP Cipher\fP for an example how to use this function. +See \fBEVP Cipher\fP for an example how to use this function\&. .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "int EVP_CipherInit_ex (EVP_CIPHER_CTX * ctx, const EVP_CIPHER * c, ENGINE * engine, const void * key, const void * iv, int encp)" +Initiate the EVP_CIPHER_CTX context to encrypt or decrypt data\&. Clean up with \fBEVP_CIPHER_CTX_cleanup()\fP\&. .PP -Initiate the EVP_CIPHER_CTX context to encrypt or decrypt data. Clean up with \fBEVP_CIPHER_CTX_cleanup()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP context to initiate .br -\fIc\fP cipher to use. +\fIc\fP cipher to use\&. .br -\fIengine\fP crypto engine to use, NULL to select default. +\fIengine\fP crypto engine to use, NULL to select default\&. .br -\fIkey\fP the crypto key to use, NULL will use the previous value. +\fIkey\fP the crypto key to use, NULL will use the previous value\&. .br -\fIiv\fP the IV to use, NULL will use the previous value. +\fIiv\fP the IV to use, NULL will use the previous value\&. .br -\fIencp\fP non zero will encrypt, -1 use the previous value. +\fIencp\fP non zero will encrypt, -1 use the previous value\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "int EVP_CipherUpdate (EVP_CIPHER_CTX * ctx, void * out, int * outlen, void * in, size_t inlen)" -.PP Encipher/decipher partial data .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the cipher context. +\fIctx\fP the cipher context\&. .br -\fIout\fP output data from the operation. +\fIout\fP output data from the operation\&. .br \fIoutlen\fP output length .br -\fIin\fP input data to the operation. +\fIin\fP input data to the operation\&. .br -\fIinlen\fP length of data. +\fIinlen\fP length of data\&. .RE .PP -The output buffer length should at least be \fBEVP_CIPHER_block_size()\fP byte longer then the input length. +The output buffer length should at least be \fBEVP_CIPHER_block_size()\fP byte longer then the input length\&. .PP -See \fBEVP Cipher\fP for an example how to use this function. +See \fBEVP Cipher\fP for an example how to use this function\&. .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP - -.PP -If there in no spare bytes in the left from last Update and the input length is on the block boundery, the \fBEVP_CipherUpdate()\fP function can take a shortcut (and preformance gain) and directly encrypt the data, otherwise we hav to fix it up and store extra it the EVP_CIPHER_CTX. +If there in no spare bytes in the left from last Update and the input length is on the block boundery, the \fBEVP_CipherUpdate()\fP function can take a shortcut (and preformance gain) and directly encrypt the data, otherwise we hav to fix it up and store extra it the EVP_CIPHER_CTX\&. .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBexample_evp_cipher.c\fP. +\fBexample_evp_cipher\&.c\fP\&. .SS "const EVP_CIPHER* EVP_des_cbc (void)" -.PP The DES cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the DES-CBC EVP_CIPHER pointer. +the DES-CBC EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_des_ede3_cbc (void)" +The triple DES cipher type .PP -The tripple DES cipher type -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the DES-EDE3-CBC EVP_CIPHER pointer. +the DES-EDE3-CBC EVP_CIPHER pointer\&. .RE .PP .SS "int EVP_Digest (const void * data, size_t dsize, void * hash, unsigned int * hsize, const EVP_MD * md, ENGINE * engine)" +Do the whole \fBEVP_MD_CTX_create()\fP, \fBEVP_DigestInit_ex()\fP, \fBEVP_DigestUpdate()\fP, \fBEVP_DigestFinal_ex()\fP, \fBEVP_MD_CTX_destroy()\fP dance in one call\&. .PP -Do the whole \fBEVP_MD_CTX_create()\fP, \fBEVP_DigestInit_ex()\fP, \fBEVP_DigestUpdate()\fP, \fBEVP_DigestFinal_ex()\fP, \fBEVP_MD_CTX_destroy()\fP dance in one call. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata\fP the data to update the context with .br \fIdsize\fP length of data .br -\fIhash\fP output data of at least \fBEVP_MD_size()\fP length. +\fIhash\fP output data of at least \fBEVP_MD_size()\fP length\&. .br -\fIhsize\fP output length of hash. +\fIhsize\fP output length of hash\&. .br \fImd\fP message digest to use .br -\fIengine\fP engine to use, NULL for default engine. +\fIengine\fP engine to use, NULL for default engine\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int EVP_DigestFinal_ex (EVP_MD_CTX * ctx, void * hash, unsigned int * size)" +Complete the message digest\&. .PP -Complete the message digest. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the context to complete. +\fIctx\fP the context to complete\&. .br -\fIhash\fP the output of the message digest function. At least \fBEVP_MD_size()\fP. +\fIhash\fP the output of the message digest function\&. At least \fBEVP_MD_size()\fP\&. .br -\fIsize\fP the output size of hash. +\fIsize\fP the output size of hash\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int EVP_DigestInit_ex (EVP_MD_CTX * ctx, const EVP_MD * md, ENGINE * engine)" +Init a EVP_MD_CTX for use a specific message digest and engine\&. .PP -Init a EVP_MD_CTX for use a specific message digest and engine. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the message digest context to init. +\fIctx\fP the message digest context to init\&. .br -\fImd\fP the message digest to use. +\fImd\fP the message digest to use\&. .br -\fIengine\fP the engine to use, NULL to use the default engine. +\fIengine\fP the engine to use, NULL to use the default engine\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int EVP_DigestUpdate (EVP_MD_CTX * ctx, const void * data, size_t size)" +Update the digest with some data\&. .PP -Update the digest with some data. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP the context to update .br @@ -786,514 +802,640 @@ \fIsize\fP length of data .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "const EVP_CIPHER* EVP_enc_null (void)" +The NULL cipher type, does no encryption/decryption\&. .PP -The NULL cipher type, does no encryption/decryption. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the null EVP_CIPHER pointer. +the null EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_get_cipherbyname (const char * name)" +Get the cipher type using their name\&. .PP -Get the cipher type using their name. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIname\fP the name of the cipher. +\fIname\fP the name of the cipher\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the selected EVP_CIPHER pointer or NULL if not found. +the selected EVP_CIPHER pointer or NULL if not found\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_aes_128_cbc (void)" -.PP The AES-128 cipher type (hcrypto) .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-128 EVP_CIPHER pointer. +the AES-128 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_aes_128_cfb8 (void)" -.PP The AES-128 CFB8 cipher type (hcrypto) .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-128 EVP_CIPHER pointer. +the AES-128 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_aes_192_cbc (void)" -.PP The AES-192 cipher type (hcrypto) .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-192 EVP_CIPHER pointer. +the AES-192 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_aes_192_cfb8 (void)" -.PP The AES-192 CFB8 cipher type (hcrypto) .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-192 EVP_CIPHER pointer. +the AES-192 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_aes_256_cbc (void)" -.PP The AES-256 cipher type (hcrypto) .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-256 EVP_CIPHER pointer. +the AES-256 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_aes_256_cfb8 (void)" -.PP The AES-256 CFB8 cipher type (hcrypto) .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the AES-256 EVP_CIPHER pointer. +the AES-256 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_camellia_128_cbc (void)" -.PP The Camellia-128 cipher type - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the Camellia-128 EVP_CIPHER pointer. +the Camellia-128 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_camellia_192_cbc (void)" -.PP The Camellia-198 cipher type - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the Camellia-198 EVP_CIPHER pointer. +the Camellia-198 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_camellia_256_cbc (void)" -.PP The Camellia-256 cipher type - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the Camellia-256 EVP_CIPHER pointer. +the Camellia-256 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_des_cbc (void)" -.PP The DES cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the DES-CBC EVP_CIPHER pointer. +the DES-CBC EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_des_ede3_cbc (void)" +The triple DES cipher type - hcrypto .PP -The tripple DES cipher type - hcrypto -.PP -\fBReturns:\fP -.RS 4 -the DES-EDE3-CBC EVP_CIPHER pointer. -.RE -.PP - -.SS "const EVP_MD* EVP_hcrypto_md2 (void)" -.PP -The message digest MD2 - hcrypto -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the DES-EDE3-CBC EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_MD* EVP_hcrypto_md4 (void)" -.PP The message digest MD4 - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_hcrypto_md5 (void)" -.PP The message digest MD5 - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_rc2_40_cbc (void)" -.PP The RC2-40 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC2-40 EVP_CIPHER pointer. +the RC2-40 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_rc2_64_cbc (void)" -.PP The RC2-64 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC2-64 EVP_CIPHER pointer. +the RC2-64 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_hcrypto_rc2_cbc (void)" -.PP The RC2 cipher type - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC2 EVP_CIPHER pointer. +the RC2 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_MD* EVP_hcrypto_sha1 (void)" -.PP The message digest SHA1 - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_hcrypto_sha256 (void)" -.PP The message digest SHA256 - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_hcrypto_sha384 (void)" -.PP The message digest SHA384 - hcrypto .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_hcrypto_sha512 (void)" -.PP The message digest SHA512 - hcrypto .PP -\fBReturns:\fP -.RS 4 -the message digest type. -.RE -.PP - -.SS "const EVP_MD* EVP_md2 (void)" -.PP -The message digest MD2 -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_md4 (void)" -.PP The message digest MD4 .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_md5 (void)" -.PP The message digest MD5 .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "size_t EVP_MD_block_size (const EVP_MD * md)" +Return the blocksize of the message digest function\&. .PP -Return the blocksize of the message digest function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fImd\fP the evp message .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 size size of the message digest block size .RE .PP .SS "size_t EVP_MD_CTX_block_size (EVP_MD_CTX * ctx)" +Return the blocksize of the message digest function\&. .PP -Return the blocksize of the message digest function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP the evp message digest context .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 size size of the message digest block size .RE .PP .SS "int EVP_MD_CTX_cleanup (EVP_MD_CTX * ctx)" +Free the resources used by the EVP_MD context\&. .PP -Free the resources used by the EVP_MD context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the context to free the resources from. +\fIctx\fP the context to free the resources from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "EVP_MD_CTX* EVP_MD_CTX_create (void)" +Allocate a messsage digest context object\&. Free with \fBEVP_MD_CTX_destroy()\fP\&. .PP -Allocate a message digest context object. Free with \fBEVP_MD_CTX_destroy()\fP. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a newly allocated message digest context object. +a newly allocated message digest context object\&. .RE .PP .SS "void EVP_MD_CTX_destroy (EVP_MD_CTX * ctx)" +Free a messsage digest context object\&. .PP -Free a message digest context object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP context to free. +\fIctx\fP context to free\&. .RE .PP .SS "void EVP_MD_CTX_init (EVP_MD_CTX * ctx)" +Initiate a messsage digest context object\&. Deallocate with \fBEVP_MD_CTX_cleanup()\fP\&. Please use \fBEVP_MD_CTX_create()\fP instead\&. .PP -Initiate a message digest context object. Deallocate with \fBEVP_MD_CTX_cleanup()\fP. Please use \fBEVP_MD_CTX_create()\fP instead. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP variable to initiate. +\fIctx\fP variable to initiate\&. .RE .PP .SS "const EVP_MD* EVP_MD_CTX_md (EVP_MD_CTX * ctx)" +Get the EVP_MD use for a specified context\&. .PP -Get the EVP_MD use for a specified context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the EVP_MD context to get the EVP_MD for. +\fIctx\fP the EVP_MD context to get the EVP_MD for\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the EVP_MD used for the context. +the EVP_MD used for the context\&. .RE .PP .SS "size_t EVP_MD_CTX_size (EVP_MD_CTX * ctx)" +Return the output size of the message digest function\&. .PP -Return the output size of the message digest function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP the evp message digest context .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -size output size of the message digest function. +size output size of the message digest function\&. .RE .PP .SS "const EVP_MD* EVP_md_null (void)" -.PP The null message digest .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "size_t EVP_MD_size (const EVP_MD * md)" +Return the output size of the message digest function\&. .PP -Return the output size of the message digest function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fImd\fP the evp message .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -size output size of the message digest function. +size output size of the message digest function\&. .RE .PP .SS "const EVP_CIPHER* EVP_rc2_40_cbc (void)" -.PP The RC2 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC2 EVP_CIPHER pointer. +the RC2 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_rc2_64_cbc (void)" -.PP The RC2 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC2 EVP_CIPHER pointer. +the RC2 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_rc2_cbc (void)" -.PP The RC2 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC2 EVP_CIPHER pointer. +the RC2 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_rc4 (void)" -.PP The RC4 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC4 EVP_CIPHER pointer. +the RC4 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_CIPHER* EVP_rc4_40 (void)" -.PP The RC4-40 cipher type .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the RC4-40 EVP_CIPHER pointer. +the RC4-40 EVP_CIPHER pointer\&. .RE .PP .SS "const EVP_MD* EVP_sha (void)" -.PP The message digest SHA1 .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_sha1 (void)" -.PP The message digest SHA1 .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_sha256 (void)" -.PP The message digest SHA256 .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_sha384 (void)" -.PP The message digest SHA384 .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_MD* EVP_sha512 (void)" -.PP The message digest SHA512 .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the message digest type. +the message digest type\&. .RE .PP .SS "const EVP_CIPHER* EVP_wincrypt_des_ede3_cbc (void)" +The triple DES cipher type (Micrsoft crypt provider) +.PP +\fBReturns\fP +.RS 4 +the DES-EDE3-CBC EVP_CIPHER pointer\&. +.RE +.PP + +.SS "hc_EVP_CIPH_CBC_MODE OSSL_CIPHER_ALGORITHM (rc2_64_cbc, hc_EVP_CIPH_CBC_MODE| hc_EVP_CIPH_VARIABLE_LENGTH)" +The RC2-64 cipher type - OpenSSL +.PP +\fBReturns\fP +.RS 4 +the RC2-64 EVP_CIPHER pointer\&. The Camellia-128 cipher type - OpenSSL +.PP +the Camellia-128 EVP_CIPHER pointer\&. The Camellia-198 cipher type - OpenSSL +.PP +the Camellia-198 EVP_CIPHER pointer\&. The Camellia-256 cipher type - OpenSSL +.PP +the Camellia-256 EVP_CIPHER pointer\&. The RC4 cipher type (OpenSSL provider) +.PP +the RC4 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "OSSL_CIPHER_ALGORITHM (rc2_cbc, hc_EVP_CIPH_CBC_MODE| hc_EVP_CIPH_VARIABLE_LENGTH)" +The triple DES cipher type (OpenSSL provider) +.PP +\fBReturns\fP +.RS 4 +the DES-EDE3-CBC EVP_CIPHER pointer\&. The DES cipher type (OpenSSL provider) +.PP +the DES-CBC EVP_CIPHER pointer\&. The AES-128 cipher type (OpenSSL provider) +.PP +the AES-128-CBC EVP_CIPHER pointer\&. The AES-192 cipher type (OpenSSL provider) +.PP +the AES-192-CBC EVP_CIPHER pointer\&. The AES-256 cipher type (OpenSSL provider) +.PP +the AES-256-CBC EVP_CIPHER pointer\&. The AES-128 CFB8 cipher type (OpenSSL provider) +.PP +the AES-128-CFB8 EVP_CIPHER pointer\&. The AES-192 CFB8 cipher type (OpenSSL provider) +.PP +the AES-192-CFB8 EVP_CIPHER pointer\&. The AES-256 CFB8 cipher type (OpenSSL provider) +.PP +the AES-256-CFB8 EVP_CIPHER pointer\&. The RC2 cipher type - OpenSSL +.PP +the RC2 EVP_CIPHER pointer\&. The RC2-40 cipher type - OpenSSL +.PP +the RC2-40 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (aes_128_cbc, BCRYPT_AES_ALGORITHM, 16, 16, 16, EVP_CIPH_CBC_MODE)" +The AES-128 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the AES-128-CBC EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (aes_128_cfb8, BCRYPT_AES_ALGORITHM, 16, 16, 16, EVP_CIPH_CFB8_MODE)" +The AES-128 CFB8 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the AES-128-CFB8 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (aes_192_cbc, BCRYPT_AES_ALGORITHM, 16, 24, 16, EVP_CIPH_CBC_MODE)" +The AES-192 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the AES-192-CBC EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (aes_192_cfb8, BCRYPT_AES_ALGORITHM, 16, 24, 16, EVP_CIPH_CFB8_MODE)" +The AES-192 CFB8 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the AES-192-CFB8 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (aes_256_cbc, BCRYPT_AES_ALGORITHM, 16, 32, 16, EVP_CIPH_CBC_MODE)" +The AES-256 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the AES-256-CBC EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (aes_256_cfb8, BCRYPT_AES_ALGORITHM, 16, 32, 16, EVP_CIPH_CFB8_MODE)" +The AES-256 CFB8 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the AES-256-CFB8 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (des_cbc, BCRYPT_DES_ALGORITHM, 8, 8, 8, EVP_CIPH_CBC_MODE)" +The DES cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the DES-CBC EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (des_ede3_cbc, BCRYPT_3DES_ALGORITHM, 8, 24, 8, EVP_CIPH_CBC_MODE)" +The triple DES cipher type (Windows CNG provider) .PP -The tripple DES cipher type (Micrsoft crypt provider) +\fBReturns\fP +.RS 4 +the DES-EDE3-CBC EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (rc2_40_cbc, BCRYPT_RC2_ALGORITHM, 8, 5, 8, EVP_CIPH_CBC_MODE)" +The RC2-40 cipher type - Windows CNG .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the DES-EDE3-CBC EVP_CIPHER pointer. +the RC2-40 EVP_CIPHER pointer\&. .RE .PP +.SS "WINCNG_CIPHER_ALGORITHM (rc2_64_cbc, BCRYPT_RC2_ALGORITHM, 8, 8, 8, EVP_CIPH_CBC_MODE)" +The RC2-64 cipher type - Windows CNG +.PP +\fBReturns\fP +.RS 4 +the RC2-64 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (rc2_cbc, BCRYPT_RC2_ALGORITHM, 8, 16, 8, EVP_CIPH_CBC_MODE)" +The RC2 cipher type - Windows CNG +.PP +\fBReturns\fP +.RS 4 +the RC2 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (rc4, BCRYPT_RC4_ALGORITHM, 1, 16, 0, EVP_CIPH_STREAM_CIPHER| EVP_CIPH_VARIABLE_LENGTH)" +The RC4 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the RC4 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM (rc4_40, BCRYPT_RC4_ALGORITHM, 1, 5, 0, EVP_CIPH_STREAM_CIPHER| EVP_CIPH_VARIABLE_LENGTH)" +The RC4-40 cipher type (Windows CNG provider) +.PP +\fBReturns\fP +.RS 4 +the RC4 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_128_cbc)" +The Camellia-128 cipher type - CommonCrypto +.PP +\fBReturns\fP +.RS 4 +the Camellia-128 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_192_cbc)" +The Camellia-198 cipher type - CommonCrypto +.PP +\fBReturns\fP +.RS 4 +the Camellia-198 EVP_CIPHER pointer\&. +.RE +.PP + +.SS "WINCNG_CIPHER_ALGORITHM_UNAVAILABLE (camellia_256_cbc)" +The Camellia-256 cipher type - CommonCrypto +.PP +\fBReturns\fP +.RS 4 +the Camellia-256 EVP_CIPHER pointer\&. +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal crypto library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_misc.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_misc.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_misc.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_misc.3 @@ -1,12 +1,18 @@ -.TH "hcrypto miscellaneous functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "hcrypto_misc" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME -hcrypto miscellaneous functions \- +hcrypto_misc \- hcrypto miscellaneous functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c .ti -1c +.RI "int \fBPKCS5_PBKDF2_HMAC\fP (const void *password, size_t password_len, const void *salt, size_t salt_len, unsigned long iter, const EVP_MD *md, size_t keylen, void *key)" +.br +.ti -1c .RI "int \fBPKCS5_PBKDF2_HMAC_SHA1\fP (const void *password, size_t password_len, const void *salt, size_t salt_len, unsigned long iter, size_t keylen, void *key)" .br .in -1c @@ -15,30 +21,60 @@ .SH "Function Documentation" .PP -.SS "int PKCS5_PBKDF2_HMAC_SHA1 (const void * password, size_t password_len, const void * salt, size_t salt_len, unsigned long iter, size_t keylen, void * key)" +.SS "int PKCS5_PBKDF2_HMAC (const void * password, size_t password_len, const void * salt, size_t salt_len, unsigned long iter, const EVP_MD * md, size_t keylen, void * key)" +As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key\&. +.PP +\fBParameters\fP +.RS 4 +\fIpassword\fP Password\&. +.br +\fIpassword_len\fP Length of password\&. +.br +\fIsalt\fP Salt +.br +\fIsalt_len\fP Length of salt\&. +.br +\fIiter\fP iteration counter\&. +.br +\fImd\fP the digest function\&. +.br +\fIkeylen\fP the output key length\&. +.br +\fIkey\fP the output key\&. +.RE .PP -As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key. +\fBReturns\fP +.RS 4 +1 on success, non 1 on failure\&. +.RE .PP -\fBParameters:\fP + +.SS "int PKCS5_PBKDF2_HMAC_SHA1 (const void * password, size_t password_len, const void * salt, size_t salt_len, unsigned long iter, size_t keylen, void * key)" +As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key\&. +.PP +\fBParameters\fP .RS 4 -\fIpassword\fP Password. +\fIpassword\fP Password\&. .br -\fIpassword_len\fP Length of password. +\fIpassword_len\fP Length of password\&. .br \fIsalt\fP Salt .br -\fIsalt_len\fP Length of salt. +\fIsalt_len\fP Length of salt\&. .br -\fIiter\fP iteration counter. +\fIiter\fP iteration counter\&. .br -\fIkeylen\fP the output key length. +\fIkeylen\fP the output key length\&. .br -\fIkey\fP the output key. +\fIkey\fP the output key\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success, non 1 on failure. +1 on success, non 1 on failure\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal crypto library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rand.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rand.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rand.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rand.3 @@ -1,8 +1,11 @@ -.TH "RAND crypto functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "hcrypto_rand" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME -RAND crypto functions \- +hcrypto_rand \- RAND crypto functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -45,97 +48,101 @@ .in -1c .SH "Detailed Description" .PP -See the \fBRAND - random number\fP for description and examples. +See the \fBRAND - random number\fP for description and examples\&. .SH "Function Documentation" .PP .SS "void RAND_add (const void * indata, size_t size, double entropi)" +Seed that random number generator\&. Secret material can securely be feed into the function, they will never be returned\&. .PP -Seed that random number generator. Secret material can securely be feed into the function, they will never be returned. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIindata\fP the input data. +\fIindata\fP the input data\&. .br -\fIsize\fP size of in data. +\fIsize\fP size of in data\&. .br -\fIentropi\fP entropi in data. +\fIentropi\fP entropi in data\&. .RE .PP .SS "int RAND_bytes (void * outdata, size_t size)" +Get a random block from the random generator, can be used for key material\&. .PP -Get a random block from the random generator, can be used for key material. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIoutdata\fP random data .br \fIsize\fP length random data .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success, 0 on failure. +1 on success, 0 on failure\&. .RE .PP .SS "void RAND_cleanup (void)" -.PP -Reset and free memory used by the random generator. +Reset and free memory used by the random generator\&. .SS "const char* RAND_file_name (char * filename, size_t size)" +Return the default random state filename for a user to use for \fBRAND_load_file()\fP, and \fBRAND_write_file()\fP\&. .PP -Return the default random state filename for a user to use for \fBRAND_load_file()\fP, and \fBRAND_write_file()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIfilename\fP buffer to hold file name. +\fIfilename\fP buffer to hold file name\&. .br -\fIsize\fP size of buffer filename. +\fIsize\fP size of buffer filename\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the buffer filename or NULL on failure. +the buffer filename or NULL on failure\&. .RE .PP .SS "const RAND_METHOD* RAND_get_rand_method (void)" +Get the default random method\&. .PP -Get the default random method. -.SS "int RAND_load_file (const char * filename, size_t size)" +\fBReturns\fP +.RS 4 +Returns a RAND_METHOD +.RE .PP -Load a a file and feed it into \fBRAND_seed()\fP. + +.SS "int RAND_load_file (const char * filename, size_t size)" +Load a a file and feed it into \fBRAND_seed()\fP\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIfilename\fP name of file to read. +\fIfilename\fP name of file to read\&. .br -\fIsize\fP minimum size to read. +\fIsize\fP minimum size to read\&. +.RE +.PP +\fBReturns\fP +.RS 4 +Returns the number of seed bytes loaded (0 indicates failure) .RE .PP .SS "int RAND_pseudo_bytes (void * outdata, size_t size)" +Get a random block from the random generator, should NOT be used for key material\&. .PP -Get a random block from the random generator, should NOT be used for key material. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIoutdata\fP random data .br \fIsize\fP length random data .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success, 0 on failure. +1 on success, 0 on failure\&. .RE .PP .SS "void RAND_seed (const void * indata, size_t size)" +Seed that random number generator\&. Secret material can securely be feed into the function, they will never be returned\&. .PP -Seed that random number generator. Secret material can securely be feed into the function, they will never be returned. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIindata\fP seed data .br @@ -144,57 +151,56 @@ .PP .SS "int RAND_set_rand_engine (ENGINE * engine)" +Set the default random method from engine\&. .PP -Set the default random method from engine. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIengine\fP use engine, if NULL is passed it, old method and engine is cleared. +\fIengine\fP use engine, if NULL is passed it, old method and engine is cleared\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success, 0 on failure. +1 on success, 0 on failure\&. .RE .PP .SS "int RAND_set_rand_method (const RAND_METHOD * meth)" +Set the default random method\&. .PP -Set the default random method. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fImeth\fP set the new default method. +\fImeth\fP set the new default method\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int RAND_status (void)" -.PP Return status of the random generator .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 if the random generator can deliver random data. +1 if the random generator can deliver random data\&. .RE .PP .SS "int RAND_write_file (const char * filename)" +Write of random numbers to a file to store for later initiation with \fBRAND_load_file()\fP\&. .PP -Write of random numbers to a file to store for later initiation with \fBRAND_load_file()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIfilename\fP name of file to write. +\fIfilename\fP name of file to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success and non-one on failure. +1 on success and non-one on failure\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal crypto library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rsa.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rsa.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rsa.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/hcrypto_rsa.3 @@ -1,8 +1,11 @@ -.TH "RSA functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "hcrypto_rsa" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME -RSA functions \- +hcrypto_rsa \- RSA functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -33,120 +36,115 @@ .in -1c .SH "Detailed Description" .PP -See the \fBRSA - public-key cryptography\fP for description and examples. +See the \fBRSA - public-key cryptography\fP for description and examples\&. .SH "Function Documentation" .PP .SS "void RSA_free (RSA * rsa)" +Free an allocation RSA object\&. .PP -Free an allocation RSA object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIrsa\fP the RSA object to free. +\fIrsa\fP the RSA object to free\&. .RE .PP .SS "void* RSA_get_app_data (const RSA * rsa)" +Get the application data for the RSA object\&. .PP -Get the application data for the RSA object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIrsa\fP the rsa object to get the parameter for .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 the data object .RE .PP .SS "const RSA_METHOD* RSA_get_method (const RSA * rsa)" +Return the RSA_METHOD used for this RSA object\&. .PP -Return the RSA_METHOD used for this RSA object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIrsa\fP the object to get the method from. +\fIrsa\fP the object to get the method from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the method used for this RSA object. +the method used for this RSA object\&. .RE .PP .SS "RSA* RSA_new (void)" +Same as \fBRSA_new_method()\fP using NULL as engine\&. .PP -Same as \fBRSA_new_method()\fP using NULL as engine. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a newly allocated RSA object. Free with \fBRSA_free()\fP. +a newly allocated RSA object\&. Free with \fBRSA_free()\fP\&. .RE .PP .SS "RSA* RSA_new_method (ENGINE * engine)" +Allocate a new RSA object using the engine, if NULL is specified as the engine, use the default RSA engine as returned by ENGINE_get_default_RSA()\&. .PP -Allocate a new RSA object using the engine, if NULL is specified as the engine, use the default RSA engine as returned by ENGINE_get_default_RSA(). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIengine\fP Specific what ENGINE RSA provider should be used. +\fIengine\fP Specific what ENGINE RSA provider should be used\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a newly allocated RSA object. Free with \fBRSA_free()\fP. +a newly allocated RSA object\&. Free with \fBRSA_free()\fP\&. .RE .PP .SS "int RSA_set_app_data (RSA * rsa, void * arg)" +Set the application data for the RSA object\&. .PP -Set the application data for the RSA object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIrsa\fP the rsa object to set the parameter for .br \fIarg\fP the data object to store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int RSA_set_method (RSA * rsa, const RSA_METHOD * method)" +Set a new method for the RSA keypair\&. .PP -Set a new method for the RSA keypair. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIrsa\fP rsa parameter. +\fIrsa\fP rsa parameter\&. .br -\fImethod\fP the new method for the RSA parameter. +\fImethod\fP the new method for the RSA parameter\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -1 on success. +1 on success\&. .RE .PP .SS "int RSA_up_ref (RSA * rsa)" +Add an extra reference to the RSA object\&. The object should be free with \fBRSA_free()\fP to drop the reference\&. .PP -Add an extra reference to the RSA object. The object should be free with \fBRSA_free()\fP to drop the reference. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIrsa\fP the object to add reference counting too. +\fIrsa\fP the object to add reference counting too\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the current reference count, can't safely be used except for debug printing. +the current reference count, can't safely be used except for debug printing\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal crypto library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_des.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_des.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_des.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_des.3 @@ -1,35 +1,36 @@ -.TH "page_des" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "page_des" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME page_des \- DES - Data Encryption Standard crypto interface See the library functions here: \fBDES crypto functions\fP .PP -DES was created by IBM, modififed by NSA and then adopted by NBS (now NIST) and published ad FIPS PUB 46 (updated by FIPS 46-1). +DES was created by IBM, modififed by NSA and then adopted by NBS (now NIST) and published ad FIPS PUB 46 (updated by FIPS 46-1)\&. .PP -Since the 19th May 2005 DES was withdrawn by NIST and should no longer be used. See \fBEVP - generic crypto interface\fP for replacement encryption algorithms and interfaces. +Since the 19th May 2005 DES was withdrawn by NIST and should no longer be used\&. See \fBEVP - generic crypto interface\fP for replacement encryption algorithms and interfaces\&. .PP -Read more the iteresting history of DES on Wikipedia http://www.wikipedia.org/wiki/Data_Encryption_Standard . +Read more the iteresting history of DES on Wikipedia http://www.wikipedia.org/wiki/Data_Encryption_Standard \&. .SH "DES key generation" .PP -To generate a DES key safely you have to use the code-snippet below. This is because the \fBDES_random_key()\fP can fail with an abort() in case of and failure to start the random generator. +To generate a DES key safely you have to use the code-snippet below\&. This is because the \fBDES_random_key()\fP can fail with an abort() in case of and failure to start the random generator\&. .PP -There is a replacement function \fBDES_new_random_key()\fP, however that function does not exists in OpenSSL. +There is a replacement function \fBDES_new_random_key()\fP, however that function does not exists in OpenSSL\&. .PP .PP .nf - DES_cblock key; - do { - if (RAND_rand(&key, sizeof(key)) != 1) - goto failure; - DES_set_odd_parity(key); - } while (DES_is_weak_key(&key)); +DES_cblock key; +do { + if (RAND_rand(&key, sizeof(key)) != 1) + goto failure; + DES_set_odd_parity(key); +} while (DES_is_weak_key(&key)); .fi .PP .SH "DES implementation history" .PP -There was no complete BSD licensed, fast, GPL compatible implementation of DES, so Love wrote the part that was missing, fast key schedule setup and adapted the interface to the orignal libdes. +There was no complete BSD licensed, fast, GPL compatible implementation of DES, so Love wrote the part that was missing, fast key schedule setup and adapted the interface to the orignal libdes\&. .PP -The document that got me started for real was 'Efficient Implementation of the Data Encryption Standard' by Dag Arne Osvik. I never got to the PC1 transformation was working, instead I used table-lookup was used for all key schedule setup. The document was very useful since it de-mystified other implementations for me. +The document that got me started for real was 'Efficient +Implementation of the Data Encryption Standard' by Dag Arne Osvik\&. I never got to the PC1 transformation was working, instead I used table-lookup was used for all key schedule setup\&. The document was very useful since it de-mystified other implementations for me\&. .PP -The core DES function (SBOX + P transformation) is from Richard Outerbridge public domain DES implementation. My sanity is saved thanks to his work. Thank you Richard. +The core DES function (SBOX + P transformation) is from Richard Outerbridge public domain DES implementation\&. My sanity is saved thanks to his work\&. Thank you Richard\&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_dh.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_dh.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_dh.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_dh.3 @@ -1,10 +1,10 @@ -.TH "page_dh" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "page_dh" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME page_dh \- DH - Diffie-Hellman key exchange -Diffie-Hellman key exchange is a protocol that allows two parties to establish a shared secret key. +Diffie-Hellman key exchange is a protocol that allows two parties to establish a shared secret key\&. .PP -Include and example how to use \fBDH_new()\fP and friends here. +Include and example how to use \fBDH_new()\fP and friends here\&. .PP See the library functions here: \fBDiffie-Hellman functions\fP diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_evp.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_evp.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_evp.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_evp.3 @@ -1,4 +1,4 @@ -.TH "page_evp" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "page_evp" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME @@ -6,4 +6,4 @@ See the library functions here: \fBEVP generic crypto functions\fP .SH "EVP Cipher" .PP -The use of \fBEVP_CipherInit_ex()\fP and EVP_Cipher() is pretty easy to understand forward, then \fBEVP_CipherUpdate()\fP and \fBEVP_CipherFinal_ex()\fP really needs an example to explain \fBexample_evp_cipher::c\fP . +The use of \fBEVP_CipherInit_ex()\fP and EVP_Cipher() is pretty easy to understand forward, then \fBEVP_CipherUpdate()\fP and \fBEVP_CipherFinal_ex()\fP really needs an example to explain \fBexample_evp_cipher\&.c\fP \&. diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rand.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rand.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rand.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rand.3 @@ -1,4 +1,4 @@ -.TH "page_rand" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "page_rand" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rsa.3 b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rsa.3 --- a/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rsa.3 +++ b/crypto/heimdal/doc/doxyout/hcrypto/man/man3/page_rsa.3 @@ -1,12 +1,13 @@ -.TH "page_rsa" 3 "11 Jan 2012" "Version 1.5.2" "Heimdal crypto library" \" -*- nroff -*- +.TH "page_rsa" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal crypto library" \" -*- nroff -*- .ad l .nh .SH NAME page_rsa \- RSA - public-key cryptography -RSA is named by its inventors (Ron Rivest, Adi Shamir, and Leonard Adleman) (published in 1977), patented expired in 21 September 2000. +RSA is named by its inventors (Ron Rivest, Adi Shamir, and Leonard Adleman) (published in 1977), patented expired in 21 September 2000\&. .PP Speed for RSA in seconds no key blinding 1000 iteration, same rsa keys (1024 and 2048) operation performed each eteration sign, verify, encrypt, decrypt on a random bit pattern +.SH "name 1024 2048 4098" .PP -name 1024 2048 4098 ================================= gmp: 0.73 6.60 44.80 tfm: 2.45 -- -- ltm: 3.79 20.74 105.41 (default in hcrypto) openssl: 4.04 11.90 82.59 cdsa: 15.89 102.89 721.40 imath: 40.62 -- -- +gmp: 0\&.73 6\&.60 44\&.80 tfm: 2\&.45 -- -- ltm: 3\&.79 20\&.74 105\&.41 (default in hcrypto) openssl: 4\&.04 11\&.90 82\&.59 cdsa: 15\&.89 102\&.89 721\&.40 imath: 40\&.62 -- -- .PP See the library functions here: \fBRSA functions\fP diff --git a/crypto/heimdal/doc/doxyout/hcrypto/manpages b/crypto/heimdal/doc/doxyout/hcrypto/manpages --- a/crypto/heimdal/doc/doxyout/hcrypto/manpages +++ b/crypto/heimdal/doc/doxyout/hcrypto/manpages @@ -1,22 +1,9 @@ -hcrypto/man/man3/DES_cbc_cksum.3 -hcrypto/man/man3/DES_cbc_encrypt.3 -hcrypto/man/man3/DES_cfb64_encrypt.3 -hcrypto/man/man3/DES_check_key_parity.3 -hcrypto/man/man3/DES_ecb3_encrypt.3 -hcrypto/man/man3/DES_ecb_encrypt.3 -hcrypto/man/man3/DES_ede3_cbc_encrypt.3 -hcrypto/man/man3/DES_encrypt.3 -hcrypto/man/man3/DES_init_random_number_generator.3 -hcrypto/man/man3/DES_is_weak_key.3 -hcrypto/man/man3/DES_key_sched.3 -hcrypto/man/man3/DES_new_random_key.3 -hcrypto/man/man3/DES_pcbc_encrypt.3 -hcrypto/man/man3/DES_random_key.3 -hcrypto/man/man3/DES_set_key.3 -hcrypto/man/man3/DES_set_key_checked.3 -hcrypto/man/man3/DES_set_key_unchecked.3 -hcrypto/man/man3/DES_set_odd_parity.3 -hcrypto/man/man3/DES_string_to_key.3 +hcrypto/man/man3/page_des.3 +hcrypto/man/man3/page_dh.3 +hcrypto/man/man3/page_evp.3 +hcrypto/man/man3/page_rand.3 +hcrypto/man/man3/page_rsa.3 +hcrypto/man/man3/hcrypto_dh.3 hcrypto/man/man3/DH_check_pubkey.3 hcrypto/man/man3/DH_compute_key.3 hcrypto/man/man3/DH_free.3 @@ -33,6 +20,16 @@ hcrypto/man/man3/DH_set_method.3 hcrypto/man/man3/DH_size.3 hcrypto/man/man3/DH_up_ref.3 +hcrypto/man/man3/hcrypto_rsa.3 +hcrypto/man/man3/RSA_free.3 +hcrypto/man/man3/RSA_get_app_data.3 +hcrypto/man/man3/RSA_get_method.3 +hcrypto/man/man3/RSA_new.3 +hcrypto/man/man3/RSA_new_method.3 +hcrypto/man/man3/RSA_set_app_data.3 +hcrypto/man/man3/RSA_set_method.3 +hcrypto/man/man3/RSA_up_ref.3 +hcrypto/man/man3/hcrypto_evp.3 hcrypto/man/man3/EVP_aes_128_cbc.3 hcrypto/man/man3/EVP_aes_128_cfb8.3 hcrypto/man/man3/EVP_aes_192_cbc.3 @@ -47,14 +44,12 @@ hcrypto/man/man3/EVP_CIPHER_CTX_block_size.3 hcrypto/man/man3/EVP_CIPHER_CTX_cipher.3 hcrypto/man/man3/EVP_CIPHER_CTX_cleanup.3 -hcrypto/man/man3/EVP_CIPHER_CTX_ctrl.3 hcrypto/man/man3/EVP_CIPHER_CTX_flags.3 hcrypto/man/man3/EVP_CIPHER_CTX_get_app_data.3 hcrypto/man/man3/EVP_CIPHER_CTX_init.3 hcrypto/man/man3/EVP_CIPHER_CTX_iv_length.3 hcrypto/man/man3/EVP_CIPHER_CTX_key_length.3 hcrypto/man/man3/EVP_CIPHER_CTX_mode.3 -hcrypto/man/man3/EVP_CIPHER_CTX_rand_key.3 hcrypto/man/man3/EVP_CIPHER_CTX_set_app_data.3 hcrypto/man/man3/EVP_CIPHER_CTX_set_key_length.3 hcrypto/man/man3/EVP_CIPHER_iv_length.3 @@ -81,7 +76,6 @@ hcrypto/man/man3/EVP_hcrypto_camellia_256_cbc.3 hcrypto/man/man3/EVP_hcrypto_des_cbc.3 hcrypto/man/man3/EVP_hcrypto_des_ede3_cbc.3 -hcrypto/man/man3/EVP_hcrypto_md2.3 hcrypto/man/man3/EVP_hcrypto_md4.3 hcrypto/man/man3/EVP_hcrypto_md5.3 hcrypto/man/man3/EVP_hcrypto_rc2_40_cbc.3 @@ -91,7 +85,6 @@ hcrypto/man/man3/EVP_hcrypto_sha256.3 hcrypto/man/man3/EVP_hcrypto_sha384.3 hcrypto/man/man3/EVP_hcrypto_sha512.3 -hcrypto/man/man3/EVP_md2.3 hcrypto/man/man3/EVP_md4.3 hcrypto/man/man3/EVP_md5.3 hcrypto/man/man3/EVP_MD_block_size.3 @@ -115,22 +108,10 @@ hcrypto/man/man3/EVP_sha384.3 hcrypto/man/man3/EVP_sha512.3 hcrypto/man/man3/EVP_wincrypt_des_ede3_cbc.3 -hcrypto/man/man3/hcrypto_core.3 -hcrypto/man/man3/hcrypto_des.3 -hcrypto/man/man3/hcrypto_dh.3 -hcrypto/man/man3/hcrypto_evp.3 -hcrypto/man/man3/hcrypto_misc.3 +hcrypto/man/man3/OSSL_CIPHER_ALGORITHM.3 +hcrypto/man/man3/WINCNG_CIPHER_ALGORITHM.3 +hcrypto/man/man3/WINCNG_CIPHER_ALGORITHM_UNAVAILABLE.3 hcrypto/man/man3/hcrypto_rand.3 -hcrypto/man/man3/hcrypto_rsa.3 -hcrypto/man/man3/OpenSSL_add_all_algorithms.3 -hcrypto/man/man3/OpenSSL_add_all_algorithms_conf.3 -hcrypto/man/man3/OpenSSL_add_all_algorithms_noconf.3 -hcrypto/man/man3/page_des.3 -hcrypto/man/man3/page_dh.3 -hcrypto/man/man3/page_evp.3 -hcrypto/man/man3/page_rand.3 -hcrypto/man/man3/page_rsa.3 -hcrypto/man/man3/PKCS5_PBKDF2_HMAC_SHA1.3 hcrypto/man/man3/RAND_add.3 hcrypto/man/man3/RAND_bytes.3 hcrypto/man/man3/RAND_cleanup.3 @@ -143,11 +124,32 @@ hcrypto/man/man3/RAND_set_rand_method.3 hcrypto/man/man3/RAND_status.3 hcrypto/man/man3/RAND_write_file.3 -hcrypto/man/man3/RSA_free.3 -hcrypto/man/man3/RSA_get_app_data.3 -hcrypto/man/man3/RSA_get_method.3 -hcrypto/man/man3/RSA_new.3 -hcrypto/man/man3/RSA_new_method.3 -hcrypto/man/man3/RSA_set_app_data.3 -hcrypto/man/man3/RSA_set_method.3 -hcrypto/man/man3/RSA_up_ref.3 +hcrypto/man/man3/hcrypto_des.3 +hcrypto/man/man3/DES_cbc_cksum.3 +hcrypto/man/man3/DES_cbc_encrypt.3 +hcrypto/man/man3/DES_cfb64_encrypt.3 +hcrypto/man/man3/DES_check_key_parity.3 +hcrypto/man/man3/DES_ecb3_encrypt.3 +hcrypto/man/man3/DES_ecb_encrypt.3 +hcrypto/man/man3/DES_ede3_cbc_encrypt.3 +hcrypto/man/man3/DES_encrypt.3 +hcrypto/man/man3/DES_init_random_number_generator.3 +hcrypto/man/man3/DES_is_weak_key.3 +hcrypto/man/man3/DES_key_sched.3 +hcrypto/man/man3/DES_new_random_key.3 +hcrypto/man/man3/DES_pcbc_encrypt.3 +hcrypto/man/man3/DES_random_key.3 +hcrypto/man/man3/DES_set_key.3 +hcrypto/man/man3/DES_set_key_checked.3 +hcrypto/man/man3/DES_set_key_unchecked.3 +hcrypto/man/man3/DES_set_odd_parity.3 +hcrypto/man/man3/DES_string_to_key.3 +hcrypto/man/man3/hcrypto_core.3 +hcrypto/man/man3/EVP_CIPHER_CTX_ctrl.3 +hcrypto/man/man3/EVP_CIPHER_CTX_rand_key.3 +hcrypto/man/man3/OpenSSL_add_all_algorithms.3 +hcrypto/man/man3/OpenSSL_add_all_algorithms_conf.3 +hcrypto/man/man3/OpenSSL_add_all_algorithms_noconf.3 +hcrypto/man/man3/hcrypto_misc.3 +hcrypto/man/man3/PKCS5_PBKDF2_HMAC.3 +hcrypto/man/man3/PKCS5_PBKDF2_HMAC_SHA1.3 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/annotated.html b/crypto/heimdal/doc/doxyout/hdb/html/annotated.html --- a/crypto/heimdal/doc/doxyout/hdb/html/annotated.html +++ b/crypto/heimdal/doc/doxyout/hdb/html/annotated.html @@ -1,6 +1,6 @@ -Heimdalhdblibrary: Data Structures +Data Structures @@ -8,28 +8,30 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Data Structures
    +
    -

    Data Structures

    Here are the data structures with brief descriptions: - - +
    Here are the data structures with brief descriptions:
    +
    HDB
    hdb_entry_ex
    + +
     CHDB
     Chdb_entry_ex
    -
    + +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdalhdblibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/bc_s.png b/crypto/heimdal/doc/doxyout/hdb/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + +Data Structure Index + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Data Structure Index
    +
    +
    + + +
    +
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/hdb/html/closed.png b/crypto/heimdal/doc/doxyout/hdb/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zc%17D@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ h3 { - margin-top: 0; +form.search { + margin-bottom: 0px; + margin-top: 0px; } -.directory p { - margin: 0px; - white-space: nowrap; + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.directory div { - display: none; - margin: 0px; +*/ + +td.tiny { + font-size: 75%; } -.directory img { - vertical-align: -30%; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; } -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; + +th.dirtab { + background: #EBEFF6; + font-weight: bold; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; } -.directory-alt > h3 { - margin-top: 0; + +hr.footer { + height: 1px; } -.directory-alt p { - margin: 0px; - white-space: nowrap; + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; } -.directory-alt div { - display: none; - margin: 0px; + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -.directory-alt img { - vertical-align: -30%; + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; } diff --git a/crypto/heimdal/doc/doxyout/hdb/html/doxygen.png b/crypto/heimdal/doc/doxyout/hdb/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tWI!7t@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`JY+|Kdr`d2-(ONuKA& z`@F5@iWMozvyuS-DJG-A!lRSFxj4eVTQ(O*ctC5l23a*NCT zUiG#bpmlC>)R3lz>e?DhO|`RWYpkY-Cv7yZvX=1p<>y~3vO1$fzhC-nV)3CLCmz1P@7CUvliZQpfu5;zp}ugqdu(jz*|T4tKK*%e@vB3o8?nX)G7YEO} zIVfR(?xMlF^f}`rl|s?m#rLFbqVx`xSj&_q(VMc@fTHZh}z-v68l% zry~x%T5iHj^14oBx^J>s?RnyD8<0POU=9lDQOGMB@Qv5Y7jCfG%j{AmV#TMGW1QMw zT#YF!z0x)@dY88&9zIW5@|0`{T~(%oEz)4CmbgKz&?JXM8PbTlGzy_abLK5`U0uI5 zjHCu-UX^?f&14ZFEI#m4m6HGb+pWe9G)EL9oc;V4^!AHAWY)_-0Wh%dA!_pW~AM2 zHZ{sky{TsvhxSG}|Kjt>YpOaDZqKGo-`}a-o=bjEydHSUR%_RxG>Ry*<{c88MP&ug zrltyHjJ>p!JX%>=hAAW0nBi-?hEq>Uc@@s%X-yA@MfsACeNgoN1A!3a_MdBcK263R zpQruAi4!wj!sVHNOf2y}FSc#gM1Zq3XU`YH3(W_aJO(H}DNQ%LguU8tiV}RK z`!2|z88ZfI8$CN%7oV-phP3SL?84r>l*~_CMZ$)pGy< diff --git a/crypto/heimdal/doc/doxyout/hdb/html/doxygen.svg b/crypto/heimdal/doc/doxyout/hdb/html/doxygen.svg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hdb/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/hdb/html/dynsections.js b/crypto/heimdal/doc/doxyout/hdb/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hdb/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ -Heimdalhdblibrary: Data Fields +Data Fields @@ -8,78 +8,91 @@ keyhole logo

    - - + + + + + +
    -Here is a list of all documented struct and union fields with links to the struct/union documentation for each field: -

    -

      +
      Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
      -
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdalhdblibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/functions_vars.html b/crypto/heimdal/doc/doxyout/hdb/html/functions_vars.html --- a/crypto/heimdal/doc/doxyout/hdb/html/functions_vars.html +++ b/crypto/heimdal/doc/doxyout/hdb/html/functions_vars.html @@ -1,6 +1,6 @@ -Heimdalhdblibrary: Data Fields - Variables +Data Fields - Variables @@ -8,78 +8,91 @@ keyhole logo

    - - + + + + + +
    -  -

    -

      -
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdalhdblibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.html b/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.html --- a/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.html +++ b/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.html @@ -1,6 +1,6 @@ -Heimdalhdblibrary: Graph Legend +Graph Legend @@ -8,67 +8,71 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Graph Legend
    +
    -

    Graph Legend

    This page explains how to interpret the graphs that are generated by doxygen.

    -Consider the following example:

    /*! Invisible class because of truncation */
    -class Invisible { };
    -
    -/*! Truncated class, inheritance relation is hidden */
    -class Truncated : public Invisible { };
    -
    -/* Class not documented with doxygen comments */
    -class Undocumented { };
    -
    -/*! Class that is inherited using public inheritance */
    -class PublicBase : public Truncated { };
    -
    -/*! A template class */
    -template<class T> class Templ { };
    -
    -/*! Class that is inherited using protected inheritance */
    -class ProtectedBase { };
    -
    -/*! Class that is inherited using private inheritance */
    -class PrivateBase { };
    -
    -/*! Class that is used by the Inherited class */
    -class Used { };
    -
    -/*! Super class that inherits a number of other classes */
    -class Inherited : public PublicBase,
    -                  protected ProtectedBase,
    -                  private PrivateBase,
    -                  public Undocumented,
    -                  public Templ<int>
    -{
    -  private:
    -    Used *m_usedClass;
    -};
    -
    If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

    -

    -graph_legend.png -
    -

    -The boxes in the above graph have the following meaning:

      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      +
      class Invisible { };
      +
      +
      /*! Truncated class, inheritance relation is hidden */
      +
      class Truncated : public Invisible { };
      +
      +
      /* Class not documented with doxygen comments */
      +
      class Undocumented { };
      +
      +
      /*! Class that is inherited using public inheritance */
      +
      class PublicBase : public Truncated { };
      +
      +
      /*! A template class */
      +
      template<class T> class Templ { };
      +
      +
      /*! Class that is inherited using protected inheritance */
      +
      class ProtectedBase { };
      +
      +
      /*! Class that is inherited using private inheritance */
      +
      class PrivateBase { };
      +
      +
      /*! Class that is used by the Inherited class */
      +
      class Used { };
      +
      +
      /*! Super class that inherits a number of other classes */
      +
      class Inherited : public PublicBase,
      +
      protected ProtectedBase,
      +
      private PrivateBase,
      +
      public Undocumented,
      +
      public Templ<int>
      +
      {
      +
      private:
      +
      Used *m_usedClass;
      +
      };
      +

      This will result in the following graph:

      +

      The boxes in the above graph have the following meaning:

      +
      • A filled gray box represents the struct or class for which the graph is generated.
      • A box with a black border denotes a documented struct or class.
      • -A box with a grey border denotes an undocumented struct or class.
      • +A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -The arrows have the following meaning:
        +

        The arrows have the following meaning:

        +
        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • @@ -76,12 +80,12 @@
        • A dark red arrow is used for private inheritance.
        • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
        • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
        -
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdalhdblibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.dot b/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.dot deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G -{ - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.png b/crypto/heimdal/doc/doxyout/hdb/html/graph_legend.png index 9b96937bfd5f7a36ea8dbf2d64ed1bc0768f074d..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 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 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/index.html b/crypto/heimdal/doc/doxyout/hdb/html/index.html --- a/crypto/heimdal/doc/doxyout/hdb/html/index.html +++ b/crypto/heimdal/doc/doxyout/hdb/html/index.html @@ -1,6 +1,6 @@ -Heimdalhdblibrary: Heimdal database backend library +Heimdal database backend library @@ -8,26 +8,36 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Heimdal database backend library
    +
    -

    Heimdal database backend library

    -

    -

    1.5.2

    -Introduction

    -Heimdal libhdb library provides the backend support for Heimdal kdc and kadmind. Its here where plugins for diffrent database engines can be pluged in and extend support for here Heimdal get the principal and policy data from.

    -Example of Heimdal backend are:

      -
    • Berkeley DB 1.85
    • Berkeley DB 3.0
    • Berkeley DB 4.0
    • New Berkeley DB
    • LDAP
    -

    -The project web page: http://www.h5l.org/

    +

    +Introduction

    +

    Heimdal libhdb library provides the backend support for Heimdal kdc and kadmind. Its here where plugins for diffrent database engines can be pluged in and extend support for here Heimdal get the principal and policy data from.

    +

    Example of Heimdal backend are:

      +
    • Berkeley DB 1.85
    • +
    • Berkeley DB 3.0
    • +
    • Berkeley DB 4.0
    • +
    • New Berkeley DB
    • +
    • LDAP
    • +
    +

    The project web page: http://www.h5l.org/

    +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdalhdblibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/jquery.js b/crypto/heimdal/doc/doxyout/hdb/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hdb/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hdb/html/menu.js b/crypto/heimdal/doc/doxyout/hdb/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hdb/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/hdb/html/menudata.js b/crypto/heimdal/doc/doxyout/hdb/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hdb/html/menudata.js @@ -0,0 +1,31 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}]} diff --git a/crypto/heimdal/doc/doxyout/hdb/html/nav_f.png b/crypto/heimdal/doc/doxyout/hdb/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@ -Heimdalhdblibrary: HDB Struct Reference +HDB Struct Reference @@ -8,423 +8,447 @@ keyhole logo

    - - + + + + + +
    +
    + +
    +
    HDB Struct Reference
    +
    -

    HDB Struct Reference

    #include <hdb.h> -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    #include <hdb.h>

    +

    Data Fields

    char * hdb_name
    krb5_error_code(* hdb_open )(krb5_context, struct HDB *, int, mode_t)
    krb5_error_code(* hdb_close )(krb5_context, struct HDB *)
    void(* hdb_free )(krb5_context, struct HDB *, hdb_entry_ex *)
    krb5_error_code(* hdb_fetch_kvno )(krb5_context, struct HDB *, krb5_const_principal, unsigned, krb5_kvno, hdb_entry_ex *)
    krb5_error_code(* hdb_store )(krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
    krb5_error_code(* hdb_remove )(krb5_context, struct HDB *, krb5_const_principal)
    krb5_error_code(* hdb_firstkey )(krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
    krb5_error_code(* hdb_nextkey )(krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
    krb5_error_code(* hdb_lock )(krb5_context, struct HDB *, int)
    krb5_error_code(* hdb_unlock )(krb5_context, struct HDB *)
    krb5_error_code(* hdb_rename )(krb5_context, struct HDB *, const char *)
    krb5_error_code(* hdb__get )(krb5_context, struct HDB *, krb5_data, krb5_data *)
    krb5_error_code(* hdb__put )(krb5_context, struct HDB *, int, krb5_data, krb5_data)
    krb5_error_code(* hdb__del )(krb5_context, struct HDB *, krb5_data)
    krb5_error_code(* hdb_destroy )(krb5_context, struct HDB *)
    krb5_error_code(* hdb_get_realms )(krb5_context, struct HDB *, krb5_realm **)
    krb5_error_code(* hdb_password )(krb5_context, struct HDB *, hdb_entry_ex *, const char *, int)
    krb5_error_code(* hdb_auth_status )(krb5_context, struct HDB *, hdb_entry_ex *, int)
    krb5_error_code(* hdb_check_constrained_delegation )(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    char * hdb_name
     
    krb5_error_code(* hdb_open )(krb5_context, struct HDB *, int, mode_t)
     
    krb5_error_code(* hdb_close )(krb5_context, struct HDB *)
     
    void(* hdb_free )(krb5_context, struct HDB *, hdb_entry_ex *)
     
    krb5_error_code(* hdb_fetch_kvno )(krb5_context, struct HDB *, krb5_const_principal, unsigned, krb5_kvno, hdb_entry_ex *)
     
    krb5_error_code(* hdb_store )(krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
     
    krb5_error_code(* hdb_remove )(krb5_context, struct HDB *, unsigned, krb5_const_principal)
     
    krb5_error_code(* hdb_firstkey )(krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
     
    krb5_error_code(* hdb_nextkey )(krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
     
    krb5_error_code(* hdb_lock )(krb5_context, struct HDB *, int)
     
    krb5_error_code(* hdb_unlock )(krb5_context, struct HDB *)
     
    krb5_error_code(* hdb_rename )(krb5_context, struct HDB *, const char *)
     
    krb5_error_code(* hdb__get )(krb5_context, struct HDB *, krb5_data, krb5_data *)
     
    krb5_error_code(* hdb__put )(krb5_context, struct HDB *, int, krb5_data, krb5_data)
     
    krb5_error_code(* hdb__del )(krb5_context, struct HDB *, krb5_data)
     
    krb5_error_code(* hdb_destroy )(krb5_context, struct HDB *)
     
    krb5_error_code(* hdb_get_realms )(krb5_context, struct HDB *, krb5_realm **)
     
    krb5_error_code(* hdb_password )(krb5_context, struct HDB *, hdb_entry_ex *, const char *, int)
     
    krb5_error_code(* hdb_auth_status )(krb5_context, struct HDB *, hdb_entry_ex *, int)
     
    krb5_error_code(* hdb_check_constrained_delegation )(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal)
     
    krb5_error_code(* hdb_check_pkinit_ms_upn_match )(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal)
     
    krb5_error_code(* hdb_check_s4u2self )(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal)
     
    krb5_error_code(* hdb_set_sync )(krb5_context, struct HDB *, int)
     
    +

    Detailed Description

    +

    HDB backend function pointer structure

    +

    The HDB structure is what the KDC and kadmind framework uses to query the backend database when talking about principals.

    +

    Field Documentation

    + +

    ◆ hdb__del

    -krb5_error_code(* hdb_check_pkinit_ms_upn_match )(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal) +
    +
    + + + + +
    krb5_error_code(* HDB::hdb__del) (krb5_context, struct HDB *, krb5_data)
    +
    +

    Delete and hdb_entry from a classical DB backend

    +

    This function takes a principal key (krb5_data) naming the record to delete.

    +

    Same discussion as in HDB::hdb__put

    -krb5_error_code(* hdb_check_s4u2self )(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal) +
    +
    + +

    ◆ hdb__get

    - -

    Detailed Description

    -HDB backend function pointer structure

    -The HDB structure is what the KDC and kadmind framework uses to query the backend database when talking about principals.


    Field Documentation

    -
    - +
    char* HDB::hdb_name krb5_error_code(* HDB::hdb__get) (krb5_context, struct HDB *, krb5_data, krb5_data *)
    -
    -
    +
    +

    Get an hdb_entry from a classical DB backend

    +

    This function takes a principal key (krb5_data) and returns all data related to principal in the return krb5_data. The returned encoded entry is of type hdb_entry or hdb_entry_alias.

    -

    -don't use, only for DB3

    -

    - +

    + +

    ◆ hdb__put

    +
    - +
    krb5_error_code(* HDB::hdb_open)(krb5_context, struct HDB *, int, mode_t) krb5_error_code(* HDB::hdb__put) (krb5_context, struct HDB *, int, krb5_data, krb5_data)
    -
    -
    +
    +

    Store an hdb_entry from a classical DB backend

    +

    This function takes a principal key (krb5_data) and encoded hdb_entry or hdb_entry_alias as the data to store.

    +

    For a file-based DB, this must synchronize to disk when done. This is sub-optimal for kadm5_s_rename_principal(), and for kadm5_s_modify_principal() when using principal aliases; to improve this so that only one fsync() need be done per-transaction will require HDB API extensions.

    -

    -Open (or create) the a Kerberos database.

    -Open (or create) the a Kerberos database that was resolved with hdb_create(). The third and fourth flag to the function are the same as open(), thus passing O_CREAT will create the data base if it doesn't exists.

    -Then done the caller should call hdb_close(), and to release all resources hdb_destroy().

    -

    - +

    + +

    ◆ hdb_auth_status

    +
    - +
    krb5_error_code(* HDB::hdb_close)(krb5_context, struct HDB *) krb5_error_code(* HDB::hdb_auth_status) (krb5_context, struct HDB *, hdb_entry_ex *, int)
    -
    -
    +
    +

    Auth feedback

    +

    This is a feedback call that allows backends that provides lockout functionality to register failure and/or successes.

    +

    In case the entry is locked out, the backend should set the hdb_entry.flags.locked-out flag.

    -

    -Close the database for transaction

    -Closes the database for further transactions, wont release any permanant resources. the database can be ->hdb_open-ed again.

    -

    - +

    + +

    ◆ hdb_check_constrained_delegation

    +
    - +
    void(* HDB::hdb_free)(krb5_context, struct HDB *, hdb_entry_ex *) krb5_error_code(* HDB::hdb_check_constrained_delegation) (krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal)
    -
    -
    +
    +

    Check if delegation is allowed.

    -

    -Free an entry after use.

    -

    - + + +

    ◆ hdb_check_pkinit_ms_upn_match

    +
    - +
    krb5_error_code(* HDB::hdb_fetch_kvno)(krb5_context, struct HDB *, krb5_const_principal, unsigned, krb5_kvno, hdb_entry_ex *) krb5_error_code(* HDB::hdb_check_pkinit_ms_upn_match) (krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal)
    -
    -
    +
    +

    Check if this name is an alias for the supplied client for PKINIT userPrinicpalName logins

    -

    -Fetch an entry from the backend

    -Fetch an entry from the backend, flags are what type of entry should be fetch: client, server, krbtgt. knvo (if specified and flags HDB_F_KVNO_SPECIFIED set) is the kvno to get

    -

    - + + +

    ◆ hdb_check_s4u2self

    +
    - +
    krb5_error_code(* HDB::hdb_store)(krb5_context, struct HDB *, unsigned, hdb_entry_ex *) krb5_error_code(* HDB::hdb_check_s4u2self) (krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal)
    -
    -
    +
    +

    Check if s4u2self is allowed from this client to this server

    -

    -Store an entry to database

    -

    - + + +

    ◆ hdb_close

    +
    - +
    krb5_error_code(* HDB::hdb_remove)(krb5_context, struct HDB *, krb5_const_principal) krb5_error_code(* HDB::hdb_close) (krb5_context, struct HDB *)
    -
    -
    +
    +

    Close the database for transaction

    +

    Closes the database for further transactions, wont release any permanant resources. the database can be ->hdb_open-ed again.

    -

    -Remove an entry from the database.

    -

    - + + +

    ◆ hdb_destroy

    +
    - +
    krb5_error_code(* HDB::hdb_firstkey)(krb5_context, struct HDB *, unsigned, hdb_entry_ex *) krb5_error_code(* HDB::hdb_destroy) (krb5_context, struct HDB *)
    -
    -
    +
    +

    Destroy the handle to the database.

    +

    Destroy the handle to the database, deallocate all memory and related resources. Does not remove any permanent data. Its the logical reverse of hdb_create() function that is the entry point for the module.

    -

    -As part of iteration, fetch one entry

    -

    - + + +

    ◆ hdb_fetch_kvno

    +
    - +
    krb5_error_code(* HDB::hdb_nextkey)(krb5_context, struct HDB *, unsigned, hdb_entry_ex *) krb5_error_code(* HDB::hdb_fetch_kvno) (krb5_context, struct HDB *, krb5_const_principal, unsigned, krb5_kvno, hdb_entry_ex *)
    -
    -
    +
    +

    Fetch an entry from the backend

    +

    Fetch an entry from the backend, flags are what type of entry should be fetch: client, server, krbtgt. knvo (if specified and flags HDB_F_KVNO_SPECIFIED set) is the kvno to get

    -

    -As part of iteration, fetch next entry

    -

    - + + +

    ◆ hdb_firstkey

    +
    - +
    krb5_error_code(* HDB::hdb_lock)(krb5_context, struct HDB *, int) krb5_error_code(* HDB::hdb_firstkey) (krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
    -
    -
    +
    +

    As part of iteration, fetch one entry

    -

    -Lock database

    -A lock can only be held by one consumers. Transaction can still happen on the database while the lock is held, so the entry is only useful for syncroning creation of the database and renaming of the database.

    -

    - + + +

    ◆ hdb_free

    +
    - +
    krb5_error_code(* HDB::hdb_unlock)(krb5_context, struct HDB *) void(* HDB::hdb_free) (krb5_context, struct HDB *, hdb_entry_ex *)
    -
    -
    +
    +

    Free an entry after use.

    -

    -Unlock database

    -

    - + + +

    ◆ hdb_get_realms

    +
    - +
    krb5_error_code(* HDB::hdb_rename)(krb5_context, struct HDB *, const char *) krb5_error_code(* HDB::hdb_get_realms) (krb5_context, struct HDB *, krb5_realm **)
    -
    -
    +
    +

    Get the list of realms this backend handles. This call is optional to support. The returned realms are used for announcing the realms over bonjour. Free returned array with krb5_free_host_realm().

    -

    -Rename the data base.

    -Assume that the database is not hdb_open'ed and not locked.

    -

    - + + +

    ◆ hdb_lock

    +
    - +
    krb5_error_code(* HDB::hdb__get)(krb5_context, struct HDB *, krb5_data, krb5_data *) krb5_error_code(* HDB::hdb_lock) (krb5_context, struct HDB *, int)
    -
    -
    +
    +

    Lock database

    +

    A lock can only be held by one consumers. Transaction can still happen on the database while the lock is held, so the entry is only useful for syncroning creation of the database and renaming of the database.

    -

    -Get an hdb_entry from a classical DB backend

    -If the database is a classical DB (ie BDB, NDBM, GDBM, etc) backend, this function will take a principal key (krb5_data) and return all data related to principal in the return krb5_data. The returned encoded entry is of type hdb_entry or hdb_entry_alias.

    -

    - + + +

    ◆ hdb_name

    +
    - +
    krb5_error_code(* HDB::hdb__put)(krb5_context, struct HDB *, int, krb5_data, krb5_data) char* HDB::hdb_name
    -
    -
    +
    +

    don't use, only for DB3

    -

    -Store an hdb_entry from a classical DB backend

    -Same discussion as in HDB::hdb__get

    -

    - + + +

    ◆ hdb_nextkey

    +
    - +
    krb5_error_code(* HDB::hdb__del)(krb5_context, struct HDB *, krb5_data) krb5_error_code(* HDB::hdb_nextkey) (krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
    -
    -
    +
    +

    As part of iteration, fetch next entry

    -

    -Delete and hdb_entry from a classical DB backend

    -Same discussion as in HDB::hdb__get

    -

    - + + +

    ◆ hdb_open

    +
    - +
    krb5_error_code(* HDB::hdb_destroy)(krb5_context, struct HDB *) krb5_error_code(* HDB::hdb_open) (krb5_context, struct HDB *, int, mode_t)
    -
    -
    +
    +

    Open (or create) the a Kerberos database.

    +

    Open (or create) the a Kerberos database that was resolved with hdb_create(). The third and fourth flag to the function are the same as open(), thus passing O_CREAT will create the data base if it doesn't exists.

    +

    Then done the caller should call hdb_close(), and to release all resources hdb_destroy().

    -

    -Destroy the handle to the database.

    -Destroy the handle to the database, deallocate all memory and related resources. Does not remove any permanent data. Its the logical reverse of hdb_create() function that is the entry point for the module.

    -

    - + + +

    ◆ hdb_password

    +
    - +
    krb5_error_code(* HDB::hdb_get_realms)(krb5_context, struct HDB *, krb5_realm **) krb5_error_code(* HDB::hdb_password) (krb5_context, struct HDB *, hdb_entry_ex *, const char *, int)
    -
    -
    +
    +

    Change password.

    +

    Will update keys for the entry when given password. The new keys must be written into the entry and will then later be ->hdb_store() into the database. The backend will still perform all other operations, increasing the kvno, and update modification timestamp.

    +

    The backend needs to call _kadm5_set_keys() and perform password quality checks.

    -

    -Get the list of realms this backend handles. This call is optional to support. The returned realms are used for announcing the realms over bonjour. Free returned array with krb5_free_host_realm().

    -

    - + + +

    ◆ hdb_remove

    +
    - +
    krb5_error_code(* HDB::hdb_password)(krb5_context, struct HDB *, hdb_entry_ex *, const char *, int) krb5_error_code(* HDB::hdb_remove) (krb5_context, struct HDB *, unsigned, krb5_const_principal)
    -
    -
    +
    +

    Remove an entry from the database.

    -

    -Change password.

    -Will update keys for the entry when given password. The new keys must be written into the entry and will then later be ->hdb_store() into the database. The backend will still perform all other operations, increasing the kvno, and update modification timestamp.

    -The backend needs to call _kadm5_set_keys() and perform password quality checks.

    -

    - + + +

    ◆ hdb_rename

    +
    - +
    krb5_error_code(* HDB::hdb_auth_status)(krb5_context, struct HDB *, hdb_entry_ex *, int) krb5_error_code(* HDB::hdb_rename) (krb5_context, struct HDB *, const char *)
    -
    -
    +
    +

    Rename the data base.

    +

    Assume that the database is not hdb_open'ed and not locked.

    -

    -Auth feedback

    -This is a feedback call that allows backends that provides lockout functionality to register failure and/or successes.

    -In case the entry is locked out, the backend should set the hdb_entry.flags.locked-out flag.

    -

    - + + +

    ◆ hdb_set_sync

    +
    - +
    krb5_error_code(* HDB::hdb_check_constrained_delegation)(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal) krb5_error_code(* HDB::hdb_set_sync) (krb5_context, struct HDB *, int)
    -
    -
    +
    +

    Enable/disable synchronous updates

    +

    Calling this with 0 disables sync. Calling it with non-zero enables sync and does an fsync().

    -

    -Check if delegation is allowed.

    -

    - + + +

    ◆ hdb_store

    +
    - +
    krb5_error_code(* HDB::hdb_check_pkinit_ms_upn_match)(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal) krb5_error_code(* HDB::hdb_store) (krb5_context, struct HDB *, unsigned, hdb_entry_ex *)
    -
    -
    +
    +

    Store an entry to database

    -

    -Check if this name is an alias for the supplied client for PKINIT userPrinicpalName logins

    -

    - + + +

    ◆ hdb_unlock

    +
    - +
    krb5_error_code(* HDB::hdb_check_s4u2self)(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal) krb5_error_code(* HDB::hdb_unlock) (krb5_context, struct HDB *)
    -
    -
    +
    +

    Unlock database

    -

    -Check if s4u2self is allowed from this client to this server

    -

    -


    The documentation for this struct was generated from the following file:
      -
    • /Users/lha/src/heimdal/heimdal-release/heimdal-1.5.2/lib/hdb/hdb.h
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/hdb/hdb.h
    • +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdalhdblibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/structhdb__entry__ex.html b/crypto/heimdal/doc/doxyout/hdb/html/structhdb__entry__ex.html --- a/crypto/heimdal/doc/doxyout/hdb/html/structhdb__entry__ex.html +++ b/crypto/heimdal/doc/doxyout/hdb/html/structhdb__entry__ex.html @@ -1,6 +1,6 @@ -Heimdalhdblibrary: hdb_entry_ex Struct Reference +hdb_entry_ex Struct Reference @@ -8,32 +8,31 @@ keyhole logo

    - - + + + + + + +
    +
    +
    hdb_entry_ex Struct Reference
    +
    -

    hdb_entry_ex Struct Reference

    #include <hdb.h> -

    - - -
    -


    Detailed Description

    -hdb_entry_ex is a wrapper structure around the hdb_entry structure that allows backends to keep a pointer to the backing store, ie in ->hdb_fetch_kvno(), so that we the kadmin/kpasswd backend gets around to ->hdb_store(), the backend doesn't need to lookup the entry again.
    The documentation for this struct was generated from the following file:
      -
    • /Users/lha/src/heimdal/heimdal-release/heimdal-1.5.2/lib/hdb/hdb.h
    -
    + +

    #include <hdb.h>

    +

    Detailed Description

    +

    hdb_entry_ex is a wrapper structure around the hdb_entry structure that allows backends to keep a pointer to the backing store, ie in ->hdb_fetch_kvno(), so that we the kadmin/kpasswd backend gets around to ->hdb_store(), the backend doesn't need to lookup the entry again.

    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/hdb/hdb.h
    • +
    +
    -Generated on Wed Jan 11 14:07:38 2012 for Heimdalhdblibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal hdb library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hdb/html/sync_off.png b/crypto/heimdal/doc/doxyout/hdb/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zc$@)M1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@IeJfk6j|89*WoOiV6}4AuZ}83fn> diff --git a/crypto/heimdal/doc/doxyout/hdb/html/tab_b.png b/crypto/heimdal/doc/doxyout/hdb/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 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 literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hdb/man/man3/HDB.3 b/crypto/heimdal/doc/doxyout/hdb/man/man3/HDB.3 --- a/crypto/heimdal/doc/doxyout/hdb/man/man3/HDB.3 +++ b/crypto/heimdal/doc/doxyout/hdb/man/man3/HDB.3 @@ -1,13 +1,13 @@ -.TH "HDB" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalhdblibrary" \" -*- nroff -*- +.TH "HDB" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal hdb library" \" -*- nroff -*- .ad l .nh .SH NAME -HDB \- +HDB .SH SYNOPSIS .br .PP -\fC#include \fP .PP +\fC#include \fP .SS "Data Fields" .in +1c @@ -30,7 +30,7 @@ .RI "krb5_error_code(* \fBhdb_store\fP )(krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" .br .ti -1c -.RI "krb5_error_code(* \fBhdb_remove\fP )(krb5_context, struct \fBHDB\fP *, krb5_const_principal)" +.RI "krb5_error_code(* \fBhdb_remove\fP )(krb5_context, struct \fBHDB\fP *, unsigned, krb5_const_principal)" .br .ti -1c .RI "krb5_error_code(* \fBhdb_firstkey\fP )(krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" @@ -77,109 +77,98 @@ .ti -1c .RI "krb5_error_code(* \fBhdb_check_s4u2self\fP )(krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, krb5_const_principal)" .br +.ti -1c +.RI "krb5_error_code(* \fBhdb_set_sync\fP )(krb5_context, struct \fBHDB\fP *, int)" +.br .in -1c .SH "Detailed Description" .PP \fBHDB\fP backend function pointer structure .PP -The \fBHDB\fP structure is what the KDC and kadmind framework uses to query the backend database when talking about principals. +The \fBHDB\fP structure is what the KDC and kadmind framework uses to query the backend database when talking about principals\&. .SH "Field Documentation" .PP -.SS "char* \fBHDB::hdb_name\fP" -.PP -don't use, only for DB3 -.SS "krb5_error_code(* \fBHDB::hdb_open\fP)(krb5_context, struct \fBHDB\fP *, int, mode_t)" -.PP -Open (or create) the a Kerberos database. -.PP -Open (or create) the a Kerberos database that was resolved with hdb_create(). The third and fourth flag to the function are the same as open(), thus passing O_CREAT will create the data base if it doesn't exists. -.PP -Then done the caller should call \fBhdb_close()\fP, and to release all resources \fBhdb_destroy()\fP. -.SS "krb5_error_code(* \fBHDB::hdb_close\fP)(krb5_context, struct \fBHDB\fP *)" -.PP -Close the database for transaction -.PP -Closes the database for further transactions, wont release any permanant resources. the database can be ->hdb_open-ed again. -.SS "void(* \fBHDB::hdb_free\fP)(krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *)" -.PP -Free an entry after use. -.SS "krb5_error_code(* \fBHDB::hdb_fetch_kvno\fP)(krb5_context, struct \fBHDB\fP *, krb5_const_principal, unsigned, krb5_kvno, \fBhdb_entry_ex\fP *)" -.PP -Fetch an entry from the backend -.PP -Fetch an entry from the backend, flags are what type of entry should be fetch: client, server, krbtgt. knvo (if specified and flags HDB_F_KVNO_SPECIFIED set) is the kvno to get -.SS "krb5_error_code(* \fBHDB::hdb_store\fP)(krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" -.PP -Store an entry to database -.SS "krb5_error_code(* \fBHDB::hdb_remove\fP)(krb5_context, struct \fBHDB\fP *, krb5_const_principal)" -.PP -Remove an entry from the database. -.SS "krb5_error_code(* \fBHDB::hdb_firstkey\fP)(krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" -.PP -As part of iteration, fetch one entry -.SS "krb5_error_code(* \fBHDB::hdb_nextkey\fP)(krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" -.PP -As part of iteration, fetch next entry -.SS "krb5_error_code(* \fBHDB::hdb_lock\fP)(krb5_context, struct \fBHDB\fP *, int)" -.PP -Lock database -.PP -A lock can only be held by one consumers. Transaction can still happen on the database while the lock is held, so the entry is only useful for syncroning creation of the database and renaming of the database. -.SS "krb5_error_code(* \fBHDB::hdb_unlock\fP)(krb5_context, struct \fBHDB\fP *)" -.PP -Unlock database -.SS "krb5_error_code(* \fBHDB::hdb_rename\fP)(krb5_context, struct \fBHDB\fP *, const char *)" -.PP -Rename the data base. +.SS "krb5_error_code(* HDB::hdb__del) (krb5_context, struct \fBHDB\fP *, krb5_data)" +Delete and hdb_entry from a classical DB backend .PP -Assume that the database is not hdb_open'ed and not locked. -.SS "krb5_error_code(* \fBHDB::hdb__get\fP)(krb5_context, struct \fBHDB\fP *, krb5_data, krb5_data *)" +This function takes a principal key (krb5_data) naming the record to delete\&. .PP +Same discussion as in \fBHDB::hdb__put\fP +.SS "krb5_error_code(* HDB::hdb__get) (krb5_context, struct \fBHDB\fP *, krb5_data, krb5_data *)" Get an hdb_entry from a classical DB backend .PP -If the database is a classical DB (ie BDB, NDBM, GDBM, etc) backend, this function will take a principal key (krb5_data) and return all data related to principal in the return krb5_data. The returned encoded entry is of type hdb_entry or hdb_entry_alias. -.SS "krb5_error_code(* \fBHDB::hdb__put\fP)(krb5_context, struct \fBHDB\fP *, int, krb5_data, krb5_data)" -.PP +This function takes a principal key (krb5_data) and returns all data related to principal in the return krb5_data\&. The returned encoded entry is of type hdb_entry or hdb_entry_alias\&. +.SS "krb5_error_code(* HDB::hdb__put) (krb5_context, struct \fBHDB\fP *, int, krb5_data, krb5_data)" Store an hdb_entry from a classical DB backend .PP -Same discussion as in \fBHDB::hdb__get\fP -.SS "krb5_error_code(* \fBHDB::hdb__del\fP)(krb5_context, struct \fBHDB\fP *, krb5_data)" +This function takes a principal key (krb5_data) and encoded hdb_entry or hdb_entry_alias as the data to store\&. .PP -Delete and hdb_entry from a classical DB backend -.PP -Same discussion as in \fBHDB::hdb__get\fP -.SS "krb5_error_code(* \fBHDB::hdb_destroy\fP)(krb5_context, struct \fBHDB\fP *)" +For a file-based DB, this must synchronize to disk when done\&. This is sub-optimal for kadm5_s_rename_principal(), and for kadm5_s_modify_principal() when using principal aliases; to improve this so that only one fsync() need be done per-transaction will require \fBHDB\fP API extensions\&. +.SS "krb5_error_code(* HDB::hdb_auth_status) (krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, int)" +Auth feedback .PP -Destroy the handle to the database. +This is a feedback call that allows backends that provides lockout functionality to register failure and/or successes\&. .PP -Destroy the handle to the database, deallocate all memory and related resources. Does not remove any permanent data. Its the logical reverse of hdb_create() function that is the entry point for the module. -.SS "krb5_error_code(* \fBHDB::hdb_get_realms\fP)(krb5_context, struct \fBHDB\fP *, krb5_realm **)" +In case the entry is locked out, the backend should set the hdb_entry\&.flags\&.locked-out flag\&. +.SS "krb5_error_code(* HDB::hdb_check_constrained_delegation) (krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, krb5_const_principal)" +Check if delegation is allowed\&. +.SS "krb5_error_code(* HDB::hdb_check_pkinit_ms_upn_match) (krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, krb5_const_principal)" +Check if this name is an alias for the supplied client for PKINIT userPrinicpalName logins +.SS "krb5_error_code(* HDB::hdb_check_s4u2self) (krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, krb5_const_principal)" +Check if s4u2self is allowed from this client to this server +.SS "krb5_error_code(* HDB::hdb_close) (krb5_context, struct \fBHDB\fP *)" +Close the database for transaction .PP -Get the list of realms this backend handles. This call is optional to support. The returned realms are used for announcing the realms over bonjour. Free returned array with krb5_free_host_realm(). -.SS "krb5_error_code(* \fBHDB::hdb_password\fP)(krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, const char *, int)" +Closes the database for further transactions, wont release any permanant resources\&. the database can be ->hdb_open-ed again\&. +.SS "krb5_error_code(* HDB::hdb_destroy) (krb5_context, struct \fBHDB\fP *)" +Destroy the handle to the database\&. .PP -Change password. +Destroy the handle to the database, deallocate all memory and related resources\&. Does not remove any permanent data\&. Its the logical reverse of hdb_create() function that is the entry point for the module\&. +.SS "krb5_error_code(* HDB::hdb_fetch_kvno) (krb5_context, struct \fBHDB\fP *, krb5_const_principal, unsigned, krb5_kvno, \fBhdb_entry_ex\fP *)" +Fetch an entry from the backend .PP -Will update keys for the entry when given password. The new keys must be written into the entry and will then later be ->\fBhdb_store()\fP into the database. The backend will still perform all other operations, increasing the kvno, and update modification timestamp. +Fetch an entry from the backend, flags are what type of entry should be fetch: client, server, krbtgt\&. knvo (if specified and flags HDB_F_KVNO_SPECIFIED set) is the kvno to get +.SS "krb5_error_code(* HDB::hdb_firstkey) (krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" +As part of iteration, fetch one entry +.SS "void(* HDB::hdb_free) (krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *)" +Free an entry after use\&. +.SS "krb5_error_code(* HDB::hdb_get_realms) (krb5_context, struct \fBHDB\fP *, krb5_realm **)" +Get the list of realms this backend handles\&. This call is optional to support\&. The returned realms are used for announcing the realms over bonjour\&. Free returned array with krb5_free_host_realm()\&. +.SS "krb5_error_code(* HDB::hdb_lock) (krb5_context, struct \fBHDB\fP *, int)" +Lock database .PP -The backend needs to call _kadm5_set_keys() and perform password quality checks. -.SS "krb5_error_code(* \fBHDB::hdb_auth_status\fP)(krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, int)" +A lock can only be held by one consumers\&. Transaction can still happen on the database while the lock is held, so the entry is only useful for syncroning creation of the database and renaming of the database\&. +.SS "char* HDB::hdb_name" +don't use, only for DB3 +.SS "krb5_error_code(* HDB::hdb_nextkey) (krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" +As part of iteration, fetch next entry +.SS "krb5_error_code(* HDB::hdb_open) (krb5_context, struct \fBHDB\fP *, int, mode_t)" +Open (or create) the a Kerberos database\&. .PP -Auth feedback +Open (or create) the a Kerberos database that was resolved with hdb_create()\&. The third and fourth flag to the function are the same as open(), thus passing O_CREAT will create the data base if it doesn't exists\&. .PP -This is a feedback call that allows backends that provides lockout functionality to register failure and/or successes. +Then done the caller should call \fBhdb_close()\fP, and to release all resources \fBhdb_destroy()\fP\&. +.SS "krb5_error_code(* HDB::hdb_password) (krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, const char *, int)" +Change password\&. .PP -In case the entry is locked out, the backend should set the hdb_entry.flags.locked-out flag. -.SS "krb5_error_code(* \fBHDB::hdb_check_constrained_delegation\fP)(krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, krb5_const_principal)" +Will update keys for the entry when given password\&. The new keys must be written into the entry and will then later be ->\fBhdb_store()\fP into the database\&. The backend will still perform all other operations, increasing the kvno, and update modification timestamp\&. .PP -Check if delegation is allowed. -.SS "krb5_error_code(* \fBHDB::hdb_check_pkinit_ms_upn_match\fP)(krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, krb5_const_principal)" +The backend needs to call _kadm5_set_keys() and perform password quality checks\&. +.SS "krb5_error_code(* HDB::hdb_remove) (krb5_context, struct \fBHDB\fP *, unsigned, krb5_const_principal)" +Remove an entry from the database\&. +.SS "krb5_error_code(* HDB::hdb_rename) (krb5_context, struct \fBHDB\fP *, const char *)" +Rename the data base\&. .PP -Check if this name is an alias for the supplied client for PKINIT userPrinicpalName logins -.SS "krb5_error_code(* \fBHDB::hdb_check_s4u2self\fP)(krb5_context, struct \fBHDB\fP *, \fBhdb_entry_ex\fP *, krb5_const_principal)" +Assume that the database is not hdb_open'ed and not locked\&. +.SS "krb5_error_code(* HDB::hdb_set_sync) (krb5_context, struct \fBHDB\fP *, int)" +Enable/disable synchronous updates .PP -Check if s4u2self is allowed from this client to this server +Calling this with 0 disables sync\&. Calling it with non-zero enables sync and does an fsync()\&. +.SS "krb5_error_code(* HDB::hdb_store) (krb5_context, struct \fBHDB\fP *, unsigned, \fBhdb_entry_ex\fP *)" +Store an entry to database +.SS "krb5_error_code(* HDB::hdb_unlock) (krb5_context, struct \fBHDB\fP *)" +Unlock database .SH "Author" .PP -Generated automatically by Doxygen for Heimdalhdblibrary from the source code. +Generated automatically by Doxygen for Heimdal hdb library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hdb/man/man3/hdb_entry_ex.3 b/crypto/heimdal/doc/doxyout/hdb/man/man3/hdb_entry_ex.3 --- a/crypto/heimdal/doc/doxyout/hdb/man/man3/hdb_entry_ex.3 +++ b/crypto/heimdal/doc/doxyout/hdb/man/man3/hdb_entry_ex.3 @@ -1,17 +1,17 @@ -.TH "hdb_entry_ex" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalhdblibrary" \" -*- nroff -*- +.TH "hdb_entry_ex" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal hdb library" \" -*- nroff -*- .ad l .nh .SH NAME -hdb_entry_ex \- +hdb_entry_ex .SH SYNOPSIS .br .PP -\fC#include \fP .PP +\fC#include \fP .SH "Detailed Description" .PP -\fBhdb_entry_ex\fP is a wrapper structure around the hdb_entry structure that allows backends to keep a pointer to the backing store, ie in ->hdb_fetch_kvno(), so that we the kadmin/kpasswd backend gets around to ->hdb_store(), the backend doesn't need to lookup the entry again. +\fBhdb_entry_ex\fP is a wrapper structure around the hdb_entry structure that allows backends to keep a pointer to the backing store, ie in ->hdb_fetch_kvno(), so that we the kadmin/kpasswd backend gets around to ->hdb_store(), the backend doesn't need to lookup the entry again\&. .SH "Author" .PP -Generated automatically by Doxygen for Heimdalhdblibrary from the source code. +Generated automatically by Doxygen for Heimdal hdb library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hdb/man/man3/hdb_set_sync.3 b/crypto/heimdal/doc/doxyout/hdb/man/man3/hdb_set_sync.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hdb/man/man3/hdb_set_sync.3 @@ -0,0 +1 @@ +.so man3/HDB.3 diff --git a/crypto/heimdal/doc/doxyout/hdb/manpages b/crypto/heimdal/doc/doxyout/hdb/manpages --- a/crypto/heimdal/doc/doxyout/hdb/manpages +++ b/crypto/heimdal/doc/doxyout/hdb/manpages @@ -8,7 +8,6 @@ hdb/man/man3/hdb_check_s4u2self.3 hdb/man/man3/hdb_close.3 hdb/man/man3/hdb_destroy.3 -hdb/man/man3/hdb_entry_ex.3 hdb/man/man3/hdb_fetch_kvno.3 hdb/man/man3/hdb_firstkey.3 hdb/man/man3/hdb_free.3 @@ -20,5 +19,7 @@ hdb/man/man3/hdb_password.3 hdb/man/man3/hdb_remove.3 hdb/man/man3/hdb_rename.3 +hdb/man/man3/hdb_set_sync.3 hdb/man/man3/hdb_store.3 hdb/man/man3/hdb_unlock.3 +hdb/man/man3/hdb_entry_ex.3 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/bc_s.png b/crypto/heimdal/doc/doxyout/hx509/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ h3 { - margin-top: 0; +form.search { + margin-bottom: 0px; + margin-top: 0px; } -.directory p { - margin: 0px; - white-space: nowrap; + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.directory div { - display: none; - margin: 0px; +*/ + +td.tiny { + font-size: 75%; } -.directory img { - vertical-align: -30%; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; } -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; + +th.dirtab { + background: #EBEFF6; + font-weight: bold; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; } -.directory-alt > h3 { - margin-top: 0; + +hr.footer { + height: 1px; } -.directory-alt p { - margin: 0px; - white-space: nowrap; + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; } -.directory-alt div { - display: none; - margin: 0px; + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -.directory-alt img { - vertical-align: -30%; + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; } diff --git a/crypto/heimdal/doc/doxyout/hx509/html/doxygen.png b/crypto/heimdal/doc/doxyout/hx509/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tWI!7t@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`JY+|Kdr`d2-(ONuKA& z`@F5@iWMozvyuS-DJG-A!lRSFxj4eVTQ(O*ctC5l23a*NCT zUiG#bpmlC>)R3lz>e?DhO|`RWYpkY-Cv7yZvX=1p<>y~3vO1$fzhC-nV)3CLCmz1P@7CUvliZQpfu5;zp}ugqdu(jz*|T4tKK*%e@vB3o8?nX)G7YEO} zIVfR(?xMlF^f}`rl|s?m#rLFbqVx`xSj&_q(VMc@fTHZh}z-v68l% zry~x%T5iHj^14oBx^J>s?RnyD8<0POU=9lDQOGMB@Qv5Y7jCfG%j{AmV#TMGW1QMw zT#YF!z0x)@dY88&9zIW5@|0`{T~(%oEz)4CmbgKz&?JXM8PbTlGzy_abLK5`U0uI5 zjHCu-UX^?f&14ZFEI#m4m6HGb+pWe9G)EL9oc;V4^!AHAWY)_-0Wh%dA!_pW~AM2 zHZ{sky{TsvhxSG}|Kjt>YpOaDZqKGo-`}a-o=bjEydHSUR%_RxG>Ry*<{c88MP&ug zrltyHjJ>p!JX%>=hAAW0nBi-?hEq>Uc@@s%X-yA@MfsACeNgoN1A!3a_MdBcK263R zpQruAi4!wj!sVHNOf2y}FSc#gM1Zq3XU`YH3(W_aJO(H}DNQ%LguU8tiV}RK z`!2|z88ZfI8$CN%7oV-phP3SL?84r>l*~_CMZ$)pGy< diff --git a/crypto/heimdal/doc/doxyout/hx509/html/doxygen.svg b/crypto/heimdal/doc/doxyout/hx509/html/doxygen.svg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hx509/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/hx509/html/dynsections.js b/crypto/heimdal/doc/doxyout/hx509/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hx509/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ -Heimdalx509library: Graph Legend +Graph Legend @@ -8,68 +8,71 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Graph Legend
    +
    -

    Graph Legend

    This page explains how to interpret the graphs that are generated by doxygen.

    -Consider the following example:

    /*! Invisible class because of truncation */
    -class Invisible { };
    -
    -/*! Truncated class, inheritance relation is hidden */
    -class Truncated : public Invisible { };
    -
    -/* Class not documented with doxygen comments */
    -class Undocumented { };
    -
    -/*! Class that is inherited using public inheritance */
    -class PublicBase : public Truncated { };
    -
    -/*! A template class */
    -template<class T> class Templ { };
    -
    -/*! Class that is inherited using protected inheritance */
    -class ProtectedBase { };
    -
    -/*! Class that is inherited using private inheritance */
    -class PrivateBase { };
    -
    -/*! Class that is used by the Inherited class */
    -class Used { };
    -
    -/*! Super class that inherits a number of other classes */
    -class Inherited : public PublicBase,
    -                  protected ProtectedBase,
    -                  private PrivateBase,
    -                  public Undocumented,
    -                  public Templ<int>
    -{
    -  private:
    -    Used *m_usedClass;
    -};
    -
    If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

    -

    -graph_legend.png -
    -

    -The boxes in the above graph have the following meaning:

      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      +
      class Invisible { };
      +
      +
      /*! Truncated class, inheritance relation is hidden */
      +
      class Truncated : public Invisible { };
      +
      +
      /* Class not documented with doxygen comments */
      +
      class Undocumented { };
      +
      +
      /*! Class that is inherited using public inheritance */
      +
      class PublicBase : public Truncated { };
      +
      +
      /*! A template class */
      +
      template<class T> class Templ { };
      +
      +
      /*! Class that is inherited using protected inheritance */
      +
      class ProtectedBase { };
      +
      +
      /*! Class that is inherited using private inheritance */
      +
      class PrivateBase { };
      +
      +
      /*! Class that is used by the Inherited class */
      +
      class Used { };
      +
      +
      /*! Super class that inherits a number of other classes */
      +
      class Inherited : public PublicBase,
      +
      protected ProtectedBase,
      +
      private PrivateBase,
      +
      public Undocumented,
      +
      public Templ<int>
      +
      {
      +
      private:
      +
      Used *m_usedClass;
      +
      };
      +

      This will result in the following graph:

      +

      The boxes in the above graph have the following meaning:

      +
      • A filled gray box represents the struct or class for which the graph is generated.
      • A box with a black border denotes a documented struct or class.
      • -A box with a grey border denotes an undocumented struct or class.
      • +A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -The arrows have the following meaning:
        +

        The arrows have the following meaning:

        +
        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • @@ -77,12 +80,12 @@
        • A dark red arrow is used for private inheritance.
        • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
        • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
        -
    +
    -Generated on Wed Jan 11 14:07:41 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.dot b/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.dot deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G -{ - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.png b/crypto/heimdal/doc/doxyout/hx509/html/graph_legend.png index 9b96937bfd5f7a36ea8dbf2d64ed1bc0768f074d..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 zc$}5I1yohtyFH8u2m(rX3KB}U)KR*-yHmRJ2$Is>Al=<9-4fC%Al=gaU%c=Ajql!X z-0>gZw`H8eKI~ZQS@W6CoNKRRu$+u2>Pv!`FfcHv;$lJyFfg!%;P**HSn$eZN}mVb z5DX+mgOpKboA=HgLB0b6Bl>JJS!&VSN)1NPo%;1;pr$ux5=?ECMM?lbI^@dY&106)lPpI zOwkAuVm!S5a^(`8R`=0#zRk@|*a)F+RGLcf6O+AD85tLt87;L(jno5L^ zpG3}+%gM>9+v+~m(<7{_+kO-^IW?u-Xm30ePoFIkMv%-U8vUv8sJx^kmD6UqShXC7 zPAxJ%-o(_j&tqs|fro{qDle~hZti-i*(E(a9T}IQ#eU=EgSEEy(&17wE}dG1!`9Ei zK?zR-ef`xstA)+cjCQ;A-q27KzsQIP*-xK*nwvf3(i~P?pn*4-tO+t%PnpXch?UO z57^k)%gf6lIP`1hBn|c(gR12^R&!OxU?d=qcdUV3I~w-J#v2d!w_#yng-S)q$@A30 z!c;LyQk#>7ie6q`k`fXKb-`~;CbN%ESUREG*HND)#pFR#xUI4qFCzy{oqS2M4t^HQu)eoPvUa zFJ1)3$H!-jM%Z(ug0PIF@g#Ju%F$qPq}(sqw9n1Xs%dDbsH%bi8BJm}ov$%(f4H#( zQD}BKLNH`~2J;c?^Fkdx4b66c6b0xeKR-Y8{v20;=Iz^!=A*WS2D^3B46i!w!qO!_Lbn@8P*t7E)-R9#Oh-H0!U7Zdm zq(?$V#-vgWFTk!*3kfM0ARH&eA8l}Sw2z67l2S-e@N3uVZ)67bsy|mJ>(Gbm{JJ_0 ze*Y1Z_wV0>>p_hO`HelE!RXC?@;aP38jO2SMMZUGiSYH)o2aVl>Jx};8u!N9ny-Fh zX69<#d)4D$kVy45E4{k!X=rlt@(l3uii0oy($|)@k zlZ}duO#I+L^^h!+Z?n?Y+S1YjJ{{U%Ng59K$HKv3!9(%z@L0|O4PjwnX~`0!#5iIH z^d+mHp)t5>>*?tkB=kn0pslT~wUrne!bub!8;e!GQ43y==thQMxw*Lkv|CsfR>0en{nV;8CP_Q3PWKJ`YQ&Ivs-)gsxVDqh{WdB#btfr=>n_?3V zG7QXjMl5V>bOBrjt>4CG7{QZ$#%|Pi)6>)8^=BJ@{*dswE6K^(?oQHDP-Ktt-+t~3 zCkE(#n4C>cPG-<)xdIqkn45z~K#)mh+fkH6Q~$bLAMx$mOM!x#8Z7cNzz}O|Yw4S* z?3OCl*4Fy^M$30J{9GXl`aEmB>WS%8Ci;14Pl?+k0U* zS5d)qCk#3bQl6)^xV#(+xC3PHod{!jt~2S>)Rc5OZ)0XAIRnEX$d1S>$N-tnlAO_vfC`TJb&?uPNxOr zV3I(l98K&|+wI|etz}+bp5=7OT&qWYU|?URVc+L}wr?RJ#>U3&*PDc3KmqkiXYemA zF1BQ5W+ude^1Kc2^RdDCAi25uw$VY%K z+qb#k#`|;C`3olD2b&qOKCP;v z5}%Nusitr_ zeKGS{{C8J>_@3yM>KHlL!GoL4=j(or5InZw&4AnNxD)q1`$^IuRz(Qj;3AL?-NSXF zJ%+?gx88N}z4GCjEOvGvj3#~s1kn2CrU)7lGe+h+`}WqtL>NP|I}alKsHsy{Zxt09 zGCf3!>%NRlT2P0?u*rfH-9;_b0=Tyz-Y*Vfg86;JatvPxWfgAm zd%^qktR*IT4(Ty1Et;fq*NTj-g4X=b@Cz$A=Ek7N#;y&bA>TF=O17Q46cuVQWSU18 zkj-c_w=_iJCIUx#cA5+3`XG{bXJ!w!!xM)UV3sXD9_xQg#Ct|QIY0OnS`r zYxrwy6n+Rbg> z8+Mx@a+5_-2{l3}|Imk=k5-d@=HO&wt1c{*t{?}}<@a+O;?~z9S{D$gy?Oz!*!O3_ z+~kAzuSuyegCC(czFn&i_m`T_dY^;gfDDq5hc2z!z`i@dRb%?-Y7aFulvGk8@$Sml z>iBB(spsh+8;Lvg-D5qz-cND*LF$YRUxd;s{ygN%t~e%lZWxs7Zp}x15O zR*~wG!xuAf(6OXB%x)el9}4yg!HpV>42?b1 ziJksKV~!=GpcVrTULs{=)tzc6GAj?LWc6`B7X#++!u)IAJ0M=6+h!9E(cVmJ~v>=!hx%cpB)A=pE}+bRYIMwMaT zt52fL(Vw19C(}YfMFs5Uk+fPp%1>COCqns8zQIv__;7u>0zG20+n=p`_39NLy@Ikb zHV)3T)6GZ`T`w%2F?iVB{@;A__58 z%+A)9se!>?P)SJnJ-HYdevXe<{^C_uRyH>`N6fsrafd=5`}_Mr*^x^zHWY z2(X&>@o%5JJd?g$I(qu9t}aHchU4Q^pu)O9g#*eh7kp9i+H%0v zFqu!}MEsN?L!144Aq%+|qQr1=a(Yd~C8w?~P8Aa@l=bbKM14qNO3F$*w7sIjcBV`l z9UVP_6ta2A5eoMYTj>?F%x&p02T0_SfF{$@7BWhjnVX{r3;9Ln zl?FW}>eVk_zT~i)XRFW?rEA!Fx~Ujo;l}2tt=;n)sIZvJqm|3k)4kg@p*K+@CN61h z(8q_Fa^0ilRu7(m9EmULbMhLC zsUja-3|w3QUyfsYq13v%3ozCQI^j%2s-3~Q9t|L{zx`oIl$EER#gn0!o`+9X)U)}@ z5GtTKl0BlOIY{QyztzL*y!K@B!_%7dDFD_%x(UV4S!bHJ^O0NPG}$6Y5h4V3n^ zn#RYEFuI4^p_F$^UA?`%&)YTN+1c6W=H~9+q5j-m!T@cUq4)p4+h}O-iDrW>`PYt* zi0FuLsHkD^$T%gyP35bEgUkjl)B9u%K3Hg%yRxpXZm)T%Oj1EXK~&WA{^p#6gX2C( zz5hhx^jmQ7&hD=De9gebgu-|9dtDEY+r>tQ=g*&;vnAKpbMnjU=q!(o*#eJZ*cXod z+11kp*y_YYyt~@0tgPJJ4P0GMatexH=5)#CopXqR7rSpNta_qm%VbgwJ#~7m9=9wgteK1#TItELmC4l$%-=+l=Ng+`YyBx^J z#+$3gUqrp@Z@jq9sW1DwyFDN8FM(de3)tA&I$EeNuc>haPJZd<;`B5QKK@)`9IZ`O zOUqq6y=G81i4Ej(Qi#*;q_-da@EeM!?JXrGkb<6`cc~v7Iy*aW zuHJ6}@^1FNzsWDFJd(6)T2OY^@Rn5B&*%bG&DRsIX-@U zcRGqLP+MCI3?cOTud$h#S^nJO(h@MO{Dpr2WW*#T8PzI&XBThUH@dmGH9H?`2!S#E>Z=mM-J!#`qZ`~}=D50`2!XKtczi;IdtF!-Ic?=@fc zg*a>uCmFFce*gYsaTKuN zZG*-8_r;)QwYi^L{MmSj%4f_dVPfUr=+zA+;nR?px9dMF1%eq2|8*d#_cqr_w)pD5 z(<|F-%-q~fU_{S%rwk14r7W@nUZ39sx?>|iB^Sz7;JFZ5Jvbo7#}96ok&v)=aL{b? zbjuI721kI*<05(`P*7H84SE79!fd01DNrag*vg=tv9ZU8RX8{})&R=Ds}OQp5BK-~ zpyv0!bDb(uKHVC9+$}D*u(Ui01{{8SaR72_6(9)Q;YHiP*RXoY3<$K%<<@54v1)6bKuG{7aCUZ9dWZdFpf=XmtIfur{2E4_q4Pphu5M)Lawf^4Gj&)7rZGW{B~>I z(QhSj=rtVIx{>Y_56ztfEYG&b5y^RFI63QqDFE(VL`bMarHPM@>2$ zDQVHsokKL*$U=y%Zl}FNLzc@eZaO+Tz>sxNd)F9|*E=7~`}z3+EZT!m0;OPMX(@>4 zb#>e^Gvfk2fjnGMq>S`#8C9xL%cg5JIqm@0_8b=WIJhO-da222U|`^?8(6fHi_u1h zEtw4duyPtIDwEUA5fI(W%ggeDg5!$|ofYeB7c3@)X=01G*fDc)PcwSX3MF0Bri;s_QYd9%8 zFK>E>UPs}_%=zIGkF4w{7(1OtdwB9c>+6bga=#A`NwBac?F#MIds{uPC;I!hyMr-7 zVtuXRK~P_5|9STzwc^$B(d!Flpc_D_`g9$*Ql0ju8=IO8@GgK44-b(|=l#IMRMF6Y zM_vO;#GgNZAdh#7pbl|x;AHe0RJt;%(ZxqajjwhEf@T3USy@;NZrGnVNhha0U0huFeDu`HHSGQK4lAIhG76!dN;6&-NUTJ%p zd_yJV;DtW$a&jg}QLVIka6%xDzdOFJ_eI#)*g&t2GXnxdtgPr$Mi}0`dlNHIZ@n}) zI=TWVA{3vM3FSQvjhuqQOGHF5X=x`%$Hh7;!T^0z?cMXe84w?Ga&mQbbyrSNkbqAr zll-MWi^s)2$e6<7Vo_n?Rc2FD)1iR@KCc_L_wSJ(5B&9K%iA9;OidG#l9JNX54X3k zh8WxR@TL!Tuc}_(!jfa5p^e@0O2*U8HM=k#$wD9yP%?p<)K3HkJ1lGj+*eXU!qLg8 ztFu$5#g*Cp%#0%?Odl_0L`7M-=g6w5xfy_j_x=0#TwH1*B2@hRZH zi-QGl@)h}{)j;d|I!Sm?5a6FfuXIq-9?yQs66b$js2f>YB8FP&>FF67V&dR{%Ee*5 z$aNROWV6f*P`J3b2=YY`sF9%|~da;lS>n|azCDoB2&Vq;^&!RiBM#K*_i^*WCOzysXJ z!ot#awT67x9GWq~$ICnM>lZ1X`{a&agua@XSWtHMdX9L^-TnOuZQ8L(?@XPw6L(z5>B9UxC?#rYYJge|S~nkRYS=tMM-~!vz3133|1$v^IAFAv&*7_J&qP*eovrLe3lJs}}bwj0U^2n!TuTP~uOF3DH+GG&B?uLEr~}q)U?OW!fLh6a=pD$~?CIv00l~_d;LyjQMgM$rbPc z7-PfUP&Xjt9^x}IS4Sa_q3yj6kif3-$;ob0L{!wNU%$E{nn2|PR?t(1nmS(>dXL@3 zWNEqgUbPHpSUn~&N(E^~%9SuE8%i^4z zKR}$F1YeOH7XDdAQaBzm|hE^qt$_wUW|>T`jDiVC!hZ6HuKHiYwk1q;2g zksJl;&fGlM#@pMQpP!kX9UF4jG;$vh5OCG!GirN#VRcvQ>ni}#MAoCq(sj1)35Ji` z=~%9ZM;F7vD^Wd{Ox~T0jEsFuz-6L7POs;mot-&)7RpfHHM<;v^AKLVSl5lQJ^?86 z&!}QTN#Xb6esJ)?{U}R7KyY!i0_w%p_yKnM;>u;Y!{e*`GR^tXqA2MUj*(>ckdI^q zg@xz2Juz)<{0{=6qA%J<7sch}qw4B79yA053;+YP)Kf_%ep$H&m5?exAJj8|oJJsW z(_~iKygWeN*3=|S7&2x_0;N5L(Oijf_Mt(%Z#>E9bmn1`s661t#t}@9>UtizTlec_6 zx3#qun7)F7p!!ol;>~p{JI;l`eiGv0{Z<6=;Qk2#R<)&VrMH)gntBU((*y?X=!67W zaq$m!YeK+agFKHJ5JEhduYJ$Ssj8{DFg!dwGGetiT?z{1QrXYWP6Iujh|#BZYBz2Fw*-ZRkV3q9A&`s?y%x9A0GF#( z2}#KhMBxz;ub00U{?|miq_%dNOUBCZ@aM$_JAkH%$;o|<@3FCyX*@2@hl`Eozo<-2 zw}4i7nzu}d_J099iDPyZI2F=w*OG?~QqRiD3NR2N`SSHAS=k7ge8oZ~h6El!lFLHx z;=bAN+nhvjpsb}e=j7zLTJ?d~L@5(Sk19o1V&r}2LcnQV-WU}+KU1%~yGEab7Z(B> z_2rqIUq~yHlS+bu>&L5I;1-ez3HfY+l6W2NG z<>_BL(KM1%OLOzpRuh&adwYAt%;{+r;5N(P0h6td{ymq`)+R2Olo1nCt1*iLBnz$v zawn15@EGP5DZl6TSSDyAtLaZJZtga>QxSQ2;M^~J!w6dhjEs$M+j0d15)^sRadG=} zBM1I$ZkjBg#mD2o`$NP0a|;T%fXoVy2%&lZJ}@xwvdyqrd-wWutF*NADx;Mye8u<^ zVj8d8-<$J2PV2?7nHeb1s$g)?1VGURvKKTvI4I~z@&g;;eS1)EtvVy=3OmmH%%$^| z%N3Ncw6rwYH16}Q4CvZx31Csw)YY$VZqoTYRCILO_GZz(efx%(iHyr|{Hn*A)D+NY z7gI@FoA+da{1Q%s=k?!>p@glC4R|;>HBHT}&CQESqmGG*iO%u^R}d;9Vq!O_Gj|Md zJQRK!nwlqR5u}kuEcoP;i;Hx$w80OTPCrKJQ4j>h#S0CQh><^=o9|rlWK*~959o+k z?KsokDby<7b(Sx%QkPH39BF81xMpbdVYU?(ngb#=G6Jxtehn-SC?vA7vUiyK;wydq zvWfIL^cE{VN$|JO$;=@FWIMl@IwYHD~79k|%oA3qo(|7R@#0Q*QH^H(v- zzusa$)A@MF$v=T+gANG`Z}gEuyAxibqV_X2tlJL2Aui7?f9iFWB#Y9IN85!Zwsr^1U2z!*+c6RET zkEK;qQc?m+(nL@1%L-klLLq=H$YBs;z&D^ET;=yJ8~{Saq>}0%9`249NK8xw9Cz>%&aJKr{ga1cVo_h{$3FHa0fA=+rBCd3k~ISZ?zQc?1V0g7iPh z+>)uOsSyby@aH75wzBGxrAkgtUhfS9G7z7CwAysEq_h-BI6##l^{|H3bCxq@Ky3>n z78Vrz-pZ}3s{`if;%&d|d`v5}YN?m;4#9r2yB@u(0<^1)`VJ^85Fj99xoBz4=WEO} zu&^H#zgs@9-x|#T3JQ;q5TKLfgS`+UCS>=#|LArmNjDG^LK-NiqT=l21lZ{igaqhu ze}DJ@eJuu6Ev-9%ZRo=_b({pCY2A8j?U^m~^Yilvq7MdER(!w*13DokC0!Oi_Idu| z>3KB6(=(rf@87?05~Tsj13txJ)B%D{DpQUIYY_OZ%kvrCr>Dh0CJqh`1_uWN6rdl-F(3m$o*e6*0Nl1R)&hP5_3CHp2Ssgd zui->yp*QHaE7gr5xQtX7!N7%r%Yc#wK!BJDT%@~)2e40V4GpeaKhtK)v`_#3wYRfV zZ*i@xtz{Pg5ZD1?6fx6UmAb-fkoxfOP&Awf)E>Bpd~gMSe}7QH0s;_%h2{Ytjihh_ z$^!1s^G|;i;D-$FnnSNIz~$K(h^s}~^bvz=eeC=_Ujs%2X0?cQE;a&lf?d|@KUFJHdF2!2A>*%=BVB4AoVPHUnE zn4*LP(CcOa0fC~TqLPx53VvR*2XT+8OWC@GtK0g$0EK$fpZv=@fC@TfuM7+fmeP;W z1wf=hCAKg#yUHmLql_*r+(~A)bUs=>SY7Q%u{Ji2i;J5|kbrx(yU{;0J$<-7lVlU9 z*f$8}ud^eZ4rnVS-R?oF??eA2xH$bh<*WoSdA1(C6mnx;~!*qW9*; z{cfqDfvZKCEI_}qvXYGe6}mJ%9S{6|e0;CR@2rJmH98g08{pSuCC{;-jBpdvj66Jq zHt$CSv&S)jhQ~~jG7%DjYpZ{HsEy9S$+<4uaICRwY-*aHpTBMufAYb@d}RjR#>7** z#Vav6Swmjl=O3LbAkZ23n)IeYz7?&%F*l!rw5#Io?rx@Bcl~w#@$rW3nx-ZM1_lrD z!-q!e1=pW|6EB+#6;%K$+=*EC5efq=E9Ob8bCeIFp- zI34<&GGEbiVq;-(d%x_Gkrm|^5YyFd-$SkV#GUGQ^R!L~2IlHj+0#7wabS8n2?vn| zE6hL7b3U35Q#o7mX-Xy2FbGCRQlN`WYuo?VUq;wV0fWJdMN*h8B7Q4&JiOk4q(#eZ62A?lXeki!_M{gvCq`9Fq&j}l> z?V&5TvLyQ5J<0<{ns4OOg`y|Nj@g-JXHK-4ncpm%V zNXGVpoYqeR%|f^UI}^ump1Z|NFlb@4O0`6-qnv4Jak0s{f{~XJ$?xm#F5}LbDvAj7 zQU!W!_uBNI?XF!PRe@ zFJa$A22rBuYlSYH_>kf=L>^)9eR~&kB~-m#2}$JXozqqf}c55r9vCrs-t{-hQ<*1g_=mNrH!R5P{Ih7 zl#(R+xDtoWg5#T<_g4(@&=JMFzU`-y_6>$UnA$R~Lh2po6<~Qo=8#fG_`JB!CJW_Y zeSWN-+3yH9I1M#3?&#)BvhEUlJN1|Ko7kzf4vUbX{mK2a^7vOrM!~w@fRJJ0{=Vzt zfFfE<2*dm$Q&5rf^T#aPl^|Kz=P?&Y(0-$;4@5uX=^b8?Xwhv4`Au$R+(O)J0UTNN9^}3nWF(JgC$4{+!ubey1reU7q$16S*U1FI1-AbCldk*iGH7?;cn9`5D zQ;G51JcTXbToD?1+nf-saC5y?|Lz@uhr}Z#1~bnsS2`2z zT;g|@Tjfwk;)}0Ws0boX=fVySeo$s4I4eoX1Xj~OeWB=%TAgKe@efm~&sJCG5bqsS zJZ>gu7PVx5=pz-^+YD`u@XQUNP-4hyXuKiQ+nX%p7Q~5zv71vH>*WnIx97&Hn#cOk z@(dzS(3pJQ=Ub2X$Q_ONmjENYukRh#3_m{<$>^hF=2nc_xH($WVk6MTA7Z^St z$)XVd{+;09z@)+Y`oSTTja?M!oecTp#B$a4epbO94M+Z|Tnd+6wCm1jF2PFzL84h( zJIlkx8&x^#{pO&^M!$U9gBFk}+hhc-U}?^5K-KRbQ|_^dh)2SYwN4s%%uRb4gCFMFnJlq3E#e*gFH&@ zacgU(=48EjygI?Xxv>x=og&j`ZH%K0EorVDf6NRgc%S?I6zTOE=S&sJCOa-9n~(M}Bs;lfvh5SYP+>XrHmQ+)7_p7XTY9amAdp|NVPS zwP}}y1)ih3W*;3HmB{3Tg8P|Sb5oNq48@TR4uK|bT0B-CJdR8dll8b*=9~A%0KkG zS21@`BO}U{*4u~%E^)L>q}q9nn^MinnX(=>PF7sT^sLfS&l^XYqrALCJaJuJcBW$o zM9!_zrft%~H5STJ^}qAeFF{__Oau+CJb%{sh}i;NsW9wIySfrkohfX8Y%9A= za&Rc_?5fVn`ip__ZGK^{scA4goXTM<8Ax22oOkd{C<|^jTXR9xEffb+>8jPJCaj5} z#muU*{%P-SJ&z%TQmdX>-UT}Q8Uume!@wwvUIPvY<^T(l;^}dV@ zK0+BXGD*q%6wcP1T*#_P1JhOHibl$kL4%O`m=6kTxytWu@_% znVaO$34mHmOmH%R`q(&X+0oZF$lclT(uj+yren;6!Ak>g?}t-en@0kO`;#v+ZU=!jcJ^{Co60Zi5pTN)saSNa`u) zq^ylu(g>!6!ZMkQ=8a=}meLc0#JkwLsJ|>S;t{>#e81=A=%}Nlq~qyH9@xdsK9wbh z^4SWNj=nEq(tXg9d1hL@6qDk@)q9|P0CM?vaid_!i1x2ab1Bch3(ZjQ;pla~X8k6_ zqu2QHG?mgvEOus0&FQf%D?R<=I>sAE_l3c@_I5ALpF9y!VnU#0oHp*r984WW<)(|x z3BR{+?^mB24n!Af*3ZkP&MsuTcXaIh{29~jPFy1*_U8qZ=A})6SXOnC7PcThF(Ev$ zX4RmOdV}g!A=xFej-;fAgoHR~yP27Zw|8x5D8L?x4y~R^Z$`RGV8U+RE^;{oNbvXp zlcrHe+_~N_A0kK}YrS{^^x@v1cQJ*T|FU3VnMQywOiDuHX48*K)oSs)zHW4o78F=s zyL=25>MT^WR4J=Lb2Re>gzs{0aYhR54hg|jElWMQ-f|F8d%xa)B$?z`7aryt9tK+u z(H?spdFwA}ZvGTi@MC0Tt*BTW9?tSW@nd@W<0t*uOUiR`JgHt%Bxvf@t&qM|<`8AV zJ;SYOSjOA!?*UlVg*&OiNCAZk3VZ`Z-f!jTFz()l)l)8|Km+Q zRjEM6PzKW#863PBRF1X%(gwx#Y;OE2%e961ca`~&n2`M3-52clOemU;tG*>g?*s~R z>n=7I8#P!>8Jb+>$1;)d0`v(vfxn=6jeHBN1`fGUcCF`04>7{m>*H1DPokWTYIHJU z{R<(u6cZB#I5>u_tybDv!(utB?k`dw($xusvqgT1ge9ccYD$i+h8lr<@(BpoOiaAn z-fjsBO1(THG%|i$T5^__DrGXtF*%JB*JdYF&HOvi*H?bM7d_|^5{D})#Cvw;$nQ3x z6eNmF4BP(r@OQSdorHhUTL0ux--HPzTLH4Y`%Q=tox7EujO=8sC#dLM^4G5?xVl_P zDSI!u3m$&gIJ{THn=~U}4-kQ_FyzwY84FLlkmOp?Pw=UsaP;4Ip_D89o+>8dZk1M5 zO%h=KE{6izL%=M%aRCd$_ICGMOKeL&2SO;X{hyIiO_I@cTG>Q0pwcPWYaMqcsy!~7 zJRcfczZ;@|nV4_~eADc*9xUXWvM@}qxgT)k`etOR$JH1 zeC#CN{Uh%U_!&!${-L5zdw%5bjZn&ha?=)XZ8YMv%e9{7!9kI?Z`CdLkN~;0-gh$_ ziYUEb2|w=rLMVX1|okSfQ*>k3!O*E7q*Zlt0!6_GItcqI2Pf?)gaDNuE2(Qx9i zvEzn}s@&pW9X6$6V{ZL2ivy4WKxIdv-`!KT?ZnedmT93E zW_mT1ZjyH3p=`E#ASE!i7ZsQ}+A>{S)aA+rjGUI$C{VEnsNe_|OBw5Fv0cvCabp#9 z;^IW!ik8ScN0AVVG#SR@^u5Ihrw#gWx;C6WDe6Ax&O_w4u6S*|ov+v9jhr$w{9f{)g-)H#`^{}uGxp^T~s}Vha z?nF(Esj2xjiM0pW==kIR?b@t-JPPTjfY zwq@ulIXb3So+P3Yeg^c27jNiofcU8i*FEx97`L2J-}B2SbMxSxU*{qUxiB#!C}JzFCUcO#whxVlLG}YDlh8tIe?pt_!j-@$l>0n_^&dy35 zU(_8qj}eo1Sg)((b1G(=)gC3|>SAVYS&D#;z>xbDOuFBRepFH-37gI;dIxdXbQKjf zq^6Epb!xAC4}$PMc5iRlYt)|RM?!rOTXv`w{rz<5tmTYBa!OJN zuIyahNXM9*_Sh$BxQ z2nkDU^K%P(<`n1DZhK`w$&O&e!M>EtX*1biH*|l`;|$9M8#-z6;Bxe?Og91vMJhTW z!QLTd=RjIs5py}7bF>~ewvS!BKdOdqU>>WgF3z`RLQY9U>p#oHUXV{NFMA)%*B&3+ za;KGLW>)HT_+r0T`5oB3J5_wSKWAud%@0Q&h8KDJDFSq&To>2R-&j~=Gd|AiH!9Qi zA0q=jvK&=vQe`zw*UcXMb~A{&_*~dDp%<|iJC-})vSUMm`{`y`aq-AF1sjNKJ+1bfz`V$WikJs}GjXWnm9~`r_z0DO{iRuDcnBj=0$CO`KXsFv6&{b(# zso{Qb9dx=y@$=Whb}^lb7wcn6Faah!@#M$1sXVy1LyX0wd<3it3|~YP*dZZ3Zg*Vg zo&G_osS?N`l?(Meh?=?HUe@n@f?}x<$7hlfZrkrK7JmHr5gLk8_~>LLp8pFUB_JRG z!FO?mG4i$}U%$F>Ztf^M`&2-%T0ubq5w7#N6zd1!^M|wj{FYtb1aXG8@V0Qwz>}Tl z>-MDXu57WfCAYUW1FMk!qoBgg@_*!t?YV`c7hl($+r)IKL!Q()x})5qUcKE4^~8{Y z*(9EZ1N)F(<=_3I2MF2Ne61zq@$Tu%U~zGArP|HY9UZG$FD4#c4M? zAAlWnfv2_2o>#UyI_b5wPKHlgc1A`G0Ko5LXb54bIVbAEm$U&^h@Jm&jz{DR)zO?+1Gg;TIWaNH50-~g>+}hHz?Z_=a!@*IP&%V368{qG+kGFYv*yeft zx1^-x_isIX{G_X^D{IvyMcy~?_K@EZ(b3${$C(t)l|&}}@_=3$$sr1l3phCVTy}QU z6h>ux@v1Fl*$I=02Ake{oCi(TYV|Snb5Zlp`$$#?XAAZ4#A1(jjf<#+cX`scZEfk~ z+iEwob_r?Y0mbq`^tRpO?~;4*xkuV% zxI7WX_87lUc-&NIsirOoZvnH_{C03x6?&IHGCB|g5YGm$+1ew+N-lD88%AySxMU3r zlf3)A^5O(~R_Z9f!vSRTx0O!iRG8wVk1Q7E=Btc3IXP_X>~7^rQYI^^)NkK9ZT(D3 z<8gUf$~!lAJ;d0~#>)Dho_@oYi=Urg=nXo#63C?GWgU5WAGC=FUD7FccXvl_ZFzZl z4UMLThS}lal1uF1|M|qfcX_#OLD_|;@+gIs<>TQCPbym40M6$^h*ST}EF6_fNxzN0y3IFy-Wwl}gM@_SH}>>=no&1BApsW+P0z|IEhVM6pdbjX$rh;h zeMtMU7$rtXkHFKCxNjjL6n=Op2oLeCt@ovx_3?D-6GQHr8X5rgo?c#~>3r`Q8ILwM z17weyc9{)(9eJW2Zv_&OZhD`iVSo4#xAoJ%T;sgC>`=8u!e?x3xQ=7BRLjP&cFEJr zVXY&$Te{od6eqwq5Q#gh&BFchp`_Aodqx+TJ5rXFsQ6k^a?ktjq%d=p6O(G6&-Ql| z3}JJ{JQtwMVcE%M5u8zBM^JLA%HIODL$Q84zfA`}EY*#?pYQqGCu$$euZ^ zqT(+?PHR29>G^qX@4G9jg}RMDe~5Tp(Vz)K8{zn@ROIA7LmM)QOsmVS9#@V~=wq|X z5lhmre6|QYJiI>M^u$C~aq-^9hQGd=fPimeB3?NxY*)q8lFp^3xDgY>$L6ia!zCU+ zv^1GMCOT?rQDNbYrzN}2Q%f@YmpTM_zne%=&;!8Fx7tt~C(Kd^qfnz-PU@I{7}5QfoTG zV(*0Q$mQj$Kl?MyW$yFg&aXoOC%iLCitOQ0#@&;3C1c}8>6FjFLt$gVO>0gzzi>Lq zADojatMUnb@O(@BtGPE-7X25seN6UOTA#pJ=m_$T$pD=I4L>u1Ks$fCqjIBnY8PM^LN z-CWkx+S4g+I;%RnstE}-MIz$sYlxom z=>tBpKBp;dE^WSU>I22f-# zclDiT>u0N&#JhAh@u7tU=N$zHX69$AyE7*BlUp@r3pD*je@pYfcXtbUd3n8k`_@m+ z)3YTi3f(*V;e2lj&m&=U%Ykqw|6}Ga7@xQ^P#={}Ie4g1wsK-P{_nxu5XdULOiOIZg z_#vrNXj3t>>Szm>VqbwnwJqj+?-x{I;ri6HeCt`gW@!6&!=0#Omw8=9!OP2tR(JNM z+FGyiELvU9)tqvOV;2>Be2sjzxiPb}vN;OUhiK7;q>t8{E-cW8r|iYbZPZ`Llld}BpUoRzmH5)T(VP{F0W2?&x64gLaYsna@0%V-lB7njN*Ju@(1w9Kn$W%c$MLcE0ZJ^fvM zGm=ZKh`CkeLY46a4!n7$S!KV4b=$^1U4CBOJF+hyF|wF({VI~%|DD~tK4m=pTLj0m z{i-?aJ=I${&dUxlxJFVG8^FJ+<@VcW;m=VBq6U^6%~{~S?R|qHKOR^ND`P~}bXa_i zWJ4&CkZo@^3Z6P#Vs+U^bEJDjtFw4$;_e+uVV)`PW5OHm3CaJwu&HOp6=bMft--Zn z=V*ZF@;w9RCkJH8mAAHD?o(4>n&uQB$w){OWt z>5X)q8!x|SvRXIeRz83iLmr+PlM{lQ4ZRsS=y)!TjNBpO>sON8UQlpxbDqfKvSwub zR<%4GI3WBMQK^){#DC^rRFVdNaEUoZhYq}(I{BH6VD1FthztVjv%7~6JdKd(R;%kt zSyh$1xcKzEJFLF}lWBNV-ezRF(ZbxpW%S`a(cjbNK^I>elpuYm_l3H&%JfYI6Rq&G z%R)NJsk`7{;jPhjl-HxvQ_9N?QEP|RwDk1MVtW>J=EzIRV(*P5`eSNLqMT@7YN!~| z3X@yl!V10k(}H($sGaNIqh@2HiHlp^LE;!V z@+VKHXtIu~SUQTZSph>H2UKhrE(V!e>^<$uZe zXRNU!oK>F7$Kvnq9aS|n+*(_|f;?~;FEx?tu*+0T-APMZT^>A&N?6FsVMHDI>%;VQ@wJe=6+It+8xuD-BOP6HQ*vI`8&1o3et(1C+h!$Y z{M+=WJnRUItTqwTG^HIn=Az7f5!AXZ4Hr9#$}ySNzGOcv9-^b0idC~8uPAh+LK`fe zblz4depfxI&c2GZn}DLa6efGXw8D^vYtKi+WTN($FTMcV{5)#9l5y3~FYCg&uB@yo zJ9}WUk?QMGf~}(Euk)E1;H2BrFKY|)c7B(ZQG|9OX|*QnsPEuoydmezp_L%}XCzh2 zMIavWnYrwPz?V2;#U29l zxXtxLPeeq$ug&j8xdMz0iYxCQR~6y-+O~6@tybg_oL3!bw(iCo^wiW|rdw{*GAI{K zt^p0nq@<2p!$}pfu?noLR*Z}>jA-W7)Cg8ZiL6H|P)`@wD@?=S47f?!YUWxl6D&OkO0xJDz!+rjC z(e6t}$F^kR44!Sx-S$XbiVOE4(PZxz##coBEl{YoSbxFO|Ia{ghFE+J4BcYW`TWWw zd%}>DLrSCD>Hah4^DFZ9I08Y-LPPZf^mw}*7(6b}hcjgdR#x^}Ha52RbaWvSr3q0{ zOq`^#&k!VcB^lb9T$%sA!Cm(@xt~*YXrE9ai0$q&w`s37L-!HWBE(`V_98a=ou`aL}HFq`IZm>XvUFGi9JuEJxAMY;rqqbJyAYt(`Ux{9wJO7ZD7Mk1yyI z^uJ9I7*(<9s`zjs@Sa=-6S#+^_%Ecpc~F_ltVs?Kv&Y9SCUcGsFD)I8k+8vK$&fr{aui}SSl7ffZ5^MZwk;= z6vT1`GSJVrxqdSVOzrRBk9)tg-`z`Y-VT4VKuL6a^zJXymMqsMgt#z}hV-E7utObK zPe&n&z_KW7Y3=>i+dr_9%)~=!nXM^So)|RX=6K2SZp`*|s9NOhv)_cvFkjKpKOC)a z_76&EsPFK6NSd9)H#bMEVO&l0P0Yx6yqj5QAFdg8{&28nWB9|gt?ey3`d(+}pUKH9 zWh#Oii-%-_rgrH5RPi`H{lU`=Rb`i5r=Kix%3Swq6|?!#j^JXiwcBIRevrS8zb(8i+vti(;8}6w9Q46cU0M0z)!(5@ zi-(euOHP|!1O%$6fr-6ob*n`&eD+;TZ-ucHR>^F$Niz-OcU_KQyHdIx5#@+qJ_6aI zXInY9I5`?&!^iwTueKB zlXN|qEw_F?!|`7?WQPRkGc#X%d&{q`&WVT+WO$iW8}vBR7V4pS`p`YsUxrVIX$H%!1Qn=c*5$NNR^2tZx(xDCGF*2MvN&2nah zT{`GgvE)ownWmBUPWaJowYEASQ~{+U;#HkX;_FkNU;-^=NSH0pmM z409eD5bx`Ov?(M#_SroH#sgI36JaJD`8O#y+1!%X34WU=q!lbG$ z&=Je=npNyI3fXYa@h3|0$fT7=?Wgj`k!oxhnSc(~h--WQRZ@j>P*l(b92WU33H3s4Tpu4?+}!Z7vF&Pi?cJK2AvHBvd3hv`hd%!PKUzIv z_VzS!8Sn-Nz57R&_|VIXih6o_bi?ni?Va50*ZWq^L@bN!3m_6O(G<5nF@HiD{Y!$W*BrZhgwxX)OPF6UeWwb)U@}q&CPZV%IO4*{pj45BRDi7!p6#~$Ab$-wD0Kd8Iicm(-w|q0IaT& z5#{&+%$17~ge*HMDr$UOzIbYWX(=r=)${(wDWvC(pO}OM0Rh20I~OM>Fy4mcGnO1F zmKGKYii&{&0lmGwp(5D}2MqM|#6(1&Ei9V6ZtF(39Jtf0tgO`4)pb>o$Zu|L+&w&M zHLSqxd^2D_8l;}SF#2*4MWPPbleNy^ArSzaay7V<+wMn+~xD9+3zXJlmLzS{Xk z9oQwWrnYU%<=gS}ts}Ixr?1q4Gm?^k3e{FuPfAOZ78frpF8;N54jdE0S8|gnU|3aE zXKF2HcK7x&c-^9Z=fgze&AsjylaICKTAZCVV@cX~ZeBUMbZ-?1IygAU%cH8E)6&)^ zCicA82ZD7x?!BtLgF{M6%GTCaK2S*nVJk;A=H@`0%+KY^KmC|JD@87@Ir(4++b8~Ym$Cb}!apzu(?S8S`&&$o7`&`%5)RY!=c6Qd$ z(c$F_EiYPKUEQWeAr~S;<5HS|34gYA_iVq8Bhl_&+LQZQeEG#K$>A2X~ZO5j>OC@C| zFRxb6mBz*oCd$IXJt4S^PhY~l*q?LQ`bqn8F9;Nm$98Sdu!bD7|oa@~ZuxVKFq>!$S!m`kv> z^GxNWwgf0BKv$*;BFk&vu^kob#OXKIeIz*z>j)Qk#@F zK_Cz*%QI&75Xd@EECU;%V#*yucZu1l^Jg8*SJ&1u4tKBRLE@B^A-<3`2t-LKfJ`Qn zNF-HNRTK)v;cyZY6ZQ4=Ei5e1XtbiDB9TZeEG%qnY!t^>TU!f$Vr?syB!cX1FF;OA z3}1mjWVTqEopcD!26Lps@{6~hMoiM@A`NP^zOJp6D4K0kPzcK3%L~=CG1U!&mTbu~ zybXuEXkrdZLIRX2yI(*tut^AT()cam@zzLiZS&hGDJXaLjt7e>8x1a`HuH~ee6{HtH^tEs49q^D(rKi+&#MJfgN{SlhIvzquk$=gmqW8L6)*tMuKU0!VlOm` zSTW)iRMnHbGlAAF6On|ClS7;%Ix!N&Ur_dn+u+%K!|p>Zy{PEuP)b_irgundT znZ7fAMJ0}CX)o&ywpO(b>#Opo=I?+IYVv=c#3V5)N#g%FDRUqvHxynWwpspVa~`X0CVW2WLv7^rB0aq--r!@vw>blt^b-pyvHiC;U|JJl-98MUa+jV!mC46r8#rYjic7MnQ=WRf- z9%C3?#IjEX>0^i*GT%al?81 zJ4ILhCFg4UO!*wpqS(c+vgpexwpOe;0Bv8~7}9j~G2aB!h?S#+A6SneIsJclie=lTSrfeX(yC4S7& zDi?ZAy_apf2yExU%SUOUP08ST?;^ zTS^N!;OdeuZ)oxWoOV3g4Z7bWO3_vf!F{b|Dt&b%aaTVXyUq-LsKW@@9T9;0& zi5SvmxL(+-6f61V&6t&I_aRR_m}A#uCF=lipG22{#+&D!bve2^S1E-nJI3Js>$(YT zRn#M_qbzyT-iV{Gty;m{jw?!2`)AbBFAQA4D+r#O#pfk^2QD40HQjjQx3@5O{Q)US z1DZ6;{gBi5QNGo}sidOGGHisN+%{rOoqW$>r$@9HJQ*tx>CeT$S8iHYi=bP z<35gVA7fupQ}Mm*j(4ug>@h6fI{hh_0fsOp%W-3Mi#ebTdv{U4U81h2N+$4F>&Gkk zK8|#?lVKU7yN0{m)>MX%H1R3nhwr6D-**+SK&P)_GZx|3e6kqosuySQ{6TS{O2uc7 zEMqeV35Pcg#%zBBcIx|ea2lfEi!UR|9B>(`u8J=nd0-MZ8nt+}jzt&}1R%(GZoa-{^pj0%eh`04!?G?G}I}{F8?Tm59azdsw*Dmc!eD+f9 zIi}+2Yiye@>*IAVV!yj~qEBF`Jgn1W{2oJ@Hpt}nxzLE>yc}a)JgWjT09ya>rLgAB zLksYopZx3?6qN*{L3yd|ewUg4gh zMLK@WosL*&;NI`p=%y^!M!0#eY49FgKiH(Y6k)++W{)@LJud9K%rfcJ>O6u5T#1+S z|6HDOIGb;_a3cNbC1nOiAAkq{JB({Ki$Qb&S-EAx92YzWw-uN%mm`kGyQkZx^Xf=x zr}PS5`7PSDg6|V6Ix_rzs`+3ps>SfuxVP(hs;@#S%vvchO+O(*-8bUJx<$1%od1T#; zJPSIow)k>OD4Wfn=Y8CbINgkN?(=XIj?kWr_>*fv!RQog{=@{Maw`NZUnmx77tqUggW1EHE{ z%4`mfSc>b~c`_WAh1>C^xy)}}fI#8wKI=tUqndijeYZDqnt!UCB3KRbbUtpP*&4TG zY2M+T3@W7MlrT2g{AMFM6OOs*o>QrS>m;2GKgKy?+2Z zm*G;CyzjOBA8h-Gl~46zTL_Y6v(*jq)3zh$pWx!=*2PCX!1zCi(h@~VyRjzSEb~J> z(sboL5oef&K@G{HwnHcGl|NiA4YEqHQQMZ=MLfkSQYO}=H>gmYjAHxv(e}Z`8>Di$ zh6fO1Ct->Q1AAWlx|ay?PKZm%cG*}B0}5j!tuMjeYNt{<1VD(iV}m|Te(Hux_HYUc&FLC zG~gOF>}=Xs8P^XZ0U5{l?tC=E)!P#RXzXiJ737={d;^aTD8%WjNdiwj*bkqZajw(D z@h|y@^{m@A;byFdxJ6l=>I+FMmcsF7e)N@xs41Zo2Gu8dqay7iF_@=17Y{ELc`V|{ z%NQTVN|v<66k~I6Jow~Wlj?$q!iCMFdRG&S{wN*xN;gj`l4|-*Nq*zj;S1Ix^*^YuqO|kx4ZRdpHsAocMkZH;4j$9TS+Qj3B)3{+5Sc7dSp=04NcY1FwHtd$~L(Zho z3lLnUm*CGWHOG4%XA?TSz6pLeoD+CTa_vP*q>ReAeVFtagNSqhP zs!Uk&9~vVOv)kDH#B;2A`#H;91&L?q`YQ#&C{BHlAc>`ZSr=XK0>fyr2v+5UV+4;` zNWdc838L^*PW21&wxE{ z%a=S@{gwcA{=&LV>}P4`UGjPZsgkJmi~p9@cJ1W1Jcji_Bj)qvBR`)XD{t~w`T9&q z*q81b;L4H;dZJLM9nmkq0=s=V#-F9j;l`1V+*(d99pKP{I9n)5>)4ayFbw)q*h9{2 zxToO2h;t-Ev}kznF6fStY~%`yxzh?2Ev?4ksy_{3NA9EN!@K!|R_Ufq3#@0~#$3?- zrArNYLaQk2ca-y}^%$a`&5}7Q9g8lhHeX2FiBIubG(TDuCtN{U-RLD*%+ItHn&VE_^ z(JGpkCeI=DLwn+)Uzc0GvK8Ni)2P<@toR{gZs&8{u+NO%%@ zEnrn$)oDdNcOrZGbr1R`1cQPN+qMkwi_0U%X(&+C)AM7V_M}yHF{rF_byajb;-c`F zI9LId<|GjO8X=KV$43c{npVsQTq>`axuR*?B`3NbZO-IR*uRa8l{t2SYXhJrY#;yG(m^ u2vuGJ_*dw~-!B*}4^~?Hy8r%Tm?iB^t@q_TmJfo6o29v}S@|jNd;bRFhKnlz diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 library +hx509 library @@ -8,82 +8,87 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 library
    +
    -

    hx509 library

    - - - - - - +

    Functions

    int hx509_context_init (hx509_context *context)
    void hx509_context_free (hx509_context *context)
    + + + + +

    +Functions

    int hx509_context_init (hx509_context *context)
     
    void hx509_context_free (hx509_context *context)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ hx509_context_free()

    +
    - + - - - + +
    void hx509_context_free void hx509_context_free (hx509_context *  context  ) hx509_context * context)
    -
    -
    - -

    -Free the context allocated by hx509_context_init().

    -

    Parameters:
    - - +
    +

    Free the context allocated by hx509_context_init().

    +
    Parameters
    +
    context context to be freed.
    +
    contextcontext to be freed.
    +
    -

    - +

    + +

    ◆ hx509_context_init()

    +
    - + - - - + +
    int hx509_context_init int hx509_context_init (hx509_context *  context  ) hx509_context * context)
    -
    -
    - -

    -Creates a hx509 context that most functions in the library uses. The context is only allowed to be used by one thread at each moment. Free the context with hx509_context_free().

    -

    Parameters:
    - - +
    +

    Creates a hx509 context that most functions in the library uses. The context is only allowed to be used by one thread at each moment. Free the context with hx509_context_free().

    +
    Parameters
    +
    context Returns a pointer to new hx509 context.
    +
    contextReturns a pointer to new hx509 context.
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__ca.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__ca.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__ca.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__ca.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 CA functions +hx509 CA functions @@ -8,1172 +8,1224 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 CA functions
    +
    -

    hx509 CA functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    int hx509_ca_tbs_init (hx509_context context, hx509_ca_tbs *tbs)
    void hx509_ca_tbs_free (hx509_ca_tbs *tbs)
    int hx509_ca_tbs_set_notBefore (hx509_context context, hx509_ca_tbs tbs, time_t t)
    int hx509_ca_tbs_set_notAfter (hx509_context context, hx509_ca_tbs tbs, time_t t)
    int hx509_ca_tbs_set_notAfter_lifetime (hx509_context context, hx509_ca_tbs tbs, time_t delta)
    struct units * hx509_ca_tbs_template_units (void)
    int hx509_ca_tbs_set_template (hx509_context context, hx509_ca_tbs tbs, int flags, hx509_cert cert)
    int hx509_ca_tbs_set_ca (hx509_context context, hx509_ca_tbs tbs, int pathLenConstraint)
    int hx509_ca_tbs_set_proxy (hx509_context context, hx509_ca_tbs tbs, int pathLenConstraint)
    int hx509_ca_tbs_set_domaincontroller (hx509_context context, hx509_ca_tbs tbs)
    int hx509_ca_tbs_set_spki (hx509_context context, hx509_ca_tbs tbs, const SubjectPublicKeyInfo *spki)
    int hx509_ca_tbs_set_serialnumber (hx509_context context, hx509_ca_tbs tbs, const heim_integer *serialNumber)
    int hx509_ca_tbs_add_eku (hx509_context context, hx509_ca_tbs tbs, const heim_oid *oid)
    int hx509_ca_tbs_add_crl_dp_uri (hx509_context context, hx509_ca_tbs tbs, const char *uri, hx509_name issuername)
    int hx509_ca_tbs_add_san_otherName (hx509_context context, hx509_ca_tbs tbs, const heim_oid *oid, const heim_octet_string *os)
    int hx509_ca_tbs_add_san_pkinit (hx509_context context, hx509_ca_tbs tbs, const char *principal)
    int hx509_ca_tbs_add_san_ms_upn (hx509_context context, hx509_ca_tbs tbs, const char *principal)
    int hx509_ca_tbs_add_san_jid (hx509_context context, hx509_ca_tbs tbs, const char *jid)
    int hx509_ca_tbs_add_san_hostname (hx509_context context, hx509_ca_tbs tbs, const char *dnsname)
    int hx509_ca_tbs_add_san_rfc822name (hx509_context context, hx509_ca_tbs tbs, const char *rfc822Name)
    int hx509_ca_tbs_set_subject (hx509_context context, hx509_ca_tbs tbs, hx509_name subject)
    int hx509_ca_tbs_set_unique (hx509_context context, hx509_ca_tbs tbs, const heim_bit_string *subjectUniqueID, const heim_bit_string *issuerUniqueID)
    int hx509_ca_tbs_subject_expand (hx509_context context, hx509_ca_tbs tbs, hx509_env env)
    int hx509_ca_sign (hx509_context context, hx509_ca_tbs tbs, hx509_cert signer, hx509_cert *certificate)
    int hx509_ca_sign_self (hx509_context context, hx509_ca_tbs tbs, hx509_private_key signer, hx509_cert *certificate)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int hx509_ca_tbs_init (hx509_context context, hx509_ca_tbs *tbs)
     
    void hx509_ca_tbs_free (hx509_ca_tbs *tbs)
     
    int hx509_ca_tbs_set_notBefore (hx509_context context, hx509_ca_tbs tbs, time_t t)
     
    int hx509_ca_tbs_set_notAfter (hx509_context context, hx509_ca_tbs tbs, time_t t)
     
    int hx509_ca_tbs_set_notAfter_lifetime (hx509_context context, hx509_ca_tbs tbs, time_t delta)
     
    const struct units * hx509_ca_tbs_template_units (void)
     
    int hx509_ca_tbs_set_template (hx509_context context, hx509_ca_tbs tbs, int flags, hx509_cert cert)
     
    int hx509_ca_tbs_set_ca (hx509_context context, hx509_ca_tbs tbs, int pathLenConstraint)
     
    int hx509_ca_tbs_set_proxy (hx509_context context, hx509_ca_tbs tbs, int pathLenConstraint)
     
    int hx509_ca_tbs_set_domaincontroller (hx509_context context, hx509_ca_tbs tbs)
     
    int hx509_ca_tbs_set_spki (hx509_context context, hx509_ca_tbs tbs, const SubjectPublicKeyInfo *spki)
     
    int hx509_ca_tbs_set_serialnumber (hx509_context context, hx509_ca_tbs tbs, const heim_integer *serialNumber)
     
    int hx509_ca_tbs_add_eku (hx509_context context, hx509_ca_tbs tbs, const heim_oid *oid)
     
    int hx509_ca_tbs_add_crl_dp_uri (hx509_context context, hx509_ca_tbs tbs, const char *uri, hx509_name issuername)
     
    int hx509_ca_tbs_add_san_otherName (hx509_context context, hx509_ca_tbs tbs, const heim_oid *oid, const heim_octet_string *os)
     
    int hx509_ca_tbs_add_san_pkinit (hx509_context context, hx509_ca_tbs tbs, const char *principal)
     
    int hx509_ca_tbs_add_san_ms_upn (hx509_context context, hx509_ca_tbs tbs, const char *principal)
     
    int hx509_ca_tbs_add_san_jid (hx509_context context, hx509_ca_tbs tbs, const char *jid)
     
    int hx509_ca_tbs_add_san_hostname (hx509_context context, hx509_ca_tbs tbs, const char *dnsname)
     
    int hx509_ca_tbs_add_san_rfc822name (hx509_context context, hx509_ca_tbs tbs, const char *rfc822Name)
     
    int hx509_ca_tbs_set_subject (hx509_context context, hx509_ca_tbs tbs, hx509_name subject)
     
    int hx509_ca_tbs_set_unique (hx509_context context, hx509_ca_tbs tbs, const heim_bit_string *subjectUniqueID, const heim_bit_string *issuerUniqueID)
     
    int hx509_ca_tbs_subject_expand (hx509_context context, hx509_ca_tbs tbs, hx509_env env)
     
    int hx509_ca_tbs_set_signature_algorithm (hx509_context context, hx509_ca_tbs tbs, const AlgorithmIdentifier *sigalg)
     
    int hx509_ca_sign (hx509_context context, hx509_ca_tbs tbs, hx509_cert signer, hx509_cert *certificate)
     
    int hx509_ca_sign_self (hx509_context context, hx509_ca_tbs tbs, hx509_private_key signer, hx509_cert *certificate)
     
    -

    Detailed Description

    -See the Hx509 CA functions for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the Hx509 CA functions for description and examples.

    +

    Function Documentation

    + +

    ◆ hx509_ca_sign()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_ca_sign int hx509_ca_sign (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    hx509_cert  signer, hx509_cert signer,
    hx509_cert *  certificate hx509_cert * certificate 
    )
    -
    -
    - -

    -Sign a to-be-signed certificate object with a issuer certificate.

    -The caller needs to at least have called the following functions on the to-be-signed certificate object:

    -

    -When done the to-be-signed certificate object should be freed with hx509_ca_tbs_free().

    -When creating self-signed certificate use hx509_ca_sign_self() instead.

    -

    Parameters:
    - - - - - +
    +

    Sign a to-be-signed certificate object with a issuer certificate.

    +

    The caller needs to at least have called the following functions on the to-be-signed certificate object:

    +

    When done the to-be-signed certificate object should be freed with hx509_ca_tbs_free().

    +

    When creating self-signed certificate use hx509_ca_sign_self() instead.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    signer the CA certificate object to sign with (need private key).
    certificate return cerificate, free with hx509_cert_free().
    + + + +
    contextA hx509 context.
    tbsobject to be signed.
    signerthe CA certificate object to sign with (need private key).
    certificatereturn cerificate, free with hx509_cert_free().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - +

    + +

    ◆ hx509_ca_sign_self()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_ca_sign_self int hx509_ca_sign_self (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    hx509_private_key  signer, hx509_private_key signer,
    hx509_cert *  certificate hx509_cert * certificate 
    )
    -
    -
    - -

    -Work just like hx509_ca_sign() but signs it-self.

    -

    Parameters:
    - - - - - +
    +

    Work just like hx509_ca_sign() but signs it-self.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    signer private key to sign with.
    certificate return cerificate, free with hx509_cert_free().
    + + + +
    contextA hx509 context.
    tbsobject to be signed.
    signerprivate key to sign with.
    certificatereturn cerificate, free with hx509_cert_free().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_add_crl_dp_uri()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_crl_dp_uri int hx509_ca_tbs_add_crl_dp_uri (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const char *  uri, const char * uri,
    hx509_name  issuername hx509_name issuername 
    )
    -
    -
    - -

    -Add CRL distribution point URI to the to-be-signed certificate object.

    -

    Parameters:
    - - - - - +
    +

    Add CRL distribution point URI to the to-be-signed certificate object.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    uri uri to the CRL.
    issuername name of the issuer.
    + + + +
    contextA hx509 context.
    tbsobject to be signed.
    uriuri to the CRL.
    issuernamename of the issuer.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    +

    issuername not supported

    -

    -issuername not supported

    -

    - + + +

    ◆ hx509_ca_tbs_add_eku()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_eku int hx509_ca_tbs_add_eku (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const heim_oid *  oid const heim_oid * oid 
    )
    -
    -
    - -

    -An an extended key usage to the to-be-signed certificate object. Duplicates will detected and not added.

    -

    Parameters:
    - - - - +
    +

    An an extended key usage to the to-be-signed certificate object. Duplicates will detected and not added.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    oid extended key usage to add.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    oidextended key usage to add.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_add_san_hostname()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_san_hostname int hx509_ca_tbs_add_san_hostname (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const char *  dnsname const char * dnsname 
    )
    -
    -
    - -

    -Add a Subject Alternative Name hostname to to-be-signed certificate object. A domain match starts with ., an exact match does not.

    -Example of a an domain match: .domain.se matches the hostname host.domain.se.

    -

    Parameters:
    - - - - +
    +

    Add a Subject Alternative Name hostname to to-be-signed certificate object. A domain match starts with ., an exact match does not.

    +

    Example of a an domain match: .domain.se matches the hostname host.domain.se.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    dnsname a hostame.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    dnsnamea hostame.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_add_san_jid()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_san_jid int hx509_ca_tbs_add_san_jid (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const char *  jid const char * jid 
    )
    -
    -
    - -

    -Add a Jabber/XMPP jid Subject Alternative Name to the to-be-signed certificate object. The jid is an UTF8 string.

    -

    Parameters:
    - - - - +
    +

    Add a Jabber/XMPP jid Subject Alternative Name to the to-be-signed certificate object. The jid is an UTF8 string.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    jid string of an a jabber id in UTF8.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    jidstring of an a jabber id in UTF8.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_add_san_ms_upn()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_san_ms_upn int hx509_ca_tbs_add_san_ms_upn (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const char *  principal const char * principal 
    )
    -
    -
    - -

    -Add Microsoft UPN Subject Alternative Name to the to-be-signed certificate object. The principal string is a UTF8 string.

    -

    Parameters:
    - - - - +
    +

    Add Microsoft UPN Subject Alternative Name to the to-be-signed certificate object. The principal string is a UTF8 string.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    principal Microsoft UPN string.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    principalMicrosoft UPN string.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_add_san_otherName()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_san_otherName int hx509_ca_tbs_add_san_otherName (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const heim_oid *  oid, const heim_oid * oid,
    const heim_octet_string *  os const heim_octet_string * os 
    )
    -
    -
    - -

    -Add Subject Alternative Name otherName to the to-be-signed certificate object.

    -

    Parameters:
    - - - - - +
    +

    Add Subject Alternative Name otherName to the to-be-signed certificate object.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    oid the oid of the OtherName.
    os data in the other name.
    + + + +
    contextA hx509 context.
    tbsobject to be signed.
    oidthe oid of the OtherName.
    osdata in the other name.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_add_san_pkinit()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_san_pkinit int hx509_ca_tbs_add_san_pkinit (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const char *  principal const char * principal 
    )
    -
    -
    - -

    -Add Kerberos Subject Alternative Name to the to-be-signed certificate object. The principal string is a UTF8 string.

    -

    Parameters:
    - - - - +
    +

    Add Kerberos Subject Alternative Name to the to-be-signed certificate object. The principal string is a UTF8 string.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    principal Kerberos principal to add to the certificate.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    principalKerberos principal to add to the certificate.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_add_san_rfc822name()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_add_san_rfc822name int hx509_ca_tbs_add_san_rfc822name (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const char *  rfc822Name const char * rfc822Name 
    )
    -
    -
    - -

    -Add a Subject Alternative Name rfc822 (email address) to to-be-signed certificate object.

    -

    Parameters:
    - - - - +
    +

    Add a Subject Alternative Name rfc822 (email address) to to-be-signed certificate object.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    rfc822Name a string to a email address.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    rfc822Namea string to a email address.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_free()

    +
    - + - - - + +
    void hx509_ca_tbs_free void hx509_ca_tbs_free (hx509_ca_tbs *  tbs  ) hx509_ca_tbs * tbs)
    -
    -
    - -

    -Free an To Be Signed object.

    -

    Parameters:
    - - +
    +

    Free an To Be Signed object.

    +
    Parameters
    +
    tbs object to free.
    +
    tbsobject to free.
    +
    -

    - + + +

    ◆ hx509_ca_tbs_init()

    +
    - + - - + + - - + + - +
    int hx509_ca_tbs_init int hx509_ca_tbs_init (hx509_context  context, hx509_context context,
    hx509_ca_tbs *  tbs hx509_ca_tbs * tbs 
    )
    -
    -
    - -

    -Allocate an to-be-signed certificate object that will be converted into an certificate.

    -

    Parameters:
    - - - +
    +

    Allocate an to-be-signed certificate object that will be converted into an certificate.

    +
    Parameters
    +
    context A hx509 context.
    tbs returned to-be-signed certicate object, free with hx509_ca_tbs_free().
    + +
    contextA hx509 context.
    tbsreturned to-be-signed certicate object, free with hx509_ca_tbs_free().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_ca()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_ca int hx509_ca_tbs_set_ca (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    int  pathLenConstraint int pathLenConstraint 
    )
    -
    -
    - -

    -Make the to-be-signed certificate object a CA certificate. If the pathLenConstraint is negative path length constraint is used.

    -

    Parameters:
    - - - - +
    +

    Make the to-be-signed certificate object a CA certificate. If the pathLenConstraint is negative path length constraint is used.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    pathLenConstraint path length constraint, negative, no constraint.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    pathLenConstraintpath length constraint, negative, no constraint.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_domaincontroller()

    +
    - + - - + + - - + + - +
    int hx509_ca_tbs_set_domaincontroller int hx509_ca_tbs_set_domaincontroller (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs hx509_ca_tbs tbs 
    )
    -
    -
    - -

    -Make the to-be-signed certificate object a windows domain controller certificate.

    -

    Parameters:
    - - - +
    +

    Make the to-be-signed certificate object a windows domain controller certificate.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    + +
    contextA hx509 context.
    tbsobject to be signed.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_notAfter()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_notAfter int hx509_ca_tbs_set_notAfter (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    time_t  t time_t t 
    )
    -
    -
    - -

    -Set the absolute time when the certificate is valid to.

    -

    Parameters:
    - - - - +
    +

    Set the absolute time when the certificate is valid to.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    t time when the certificate will expire
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    ttime when the certificate will expire
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_notAfter_lifetime()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_notAfter_lifetime int hx509_ca_tbs_set_notAfter_lifetime (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    time_t  delta time_t delta 
    )
    -
    -
    - -

    -Set the relative time when the certificiate is going to expire.

    -

    Parameters:
    - - - - +
    +

    Set the relative time when the certificiate is going to expire.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    delta seconds to the certificate is going to expire.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    deltaseconds to the certificate is going to expire.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_notBefore()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_notBefore int hx509_ca_tbs_set_notBefore (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    time_t  t time_t t 
    )
    -
    -
    - -

    -Set the absolute time when the certificate is valid from. If not set the current time will be used.

    -

    Parameters:
    - - - - +
    +

    Set the absolute time when the certificate is valid from. If not set the current time will be used.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    t time the certificated will start to be valid
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    ttime the certificated will start to be valid
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_proxy()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_proxy int hx509_ca_tbs_set_proxy (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    int  pathLenConstraint int pathLenConstraint 
    )
    -
    -
    - -

    -Make the to-be-signed certificate object a proxy certificate. If the pathLenConstraint is negative path length constraint is used.

    -

    Parameters:
    - - - - +
    +

    Make the to-be-signed certificate object a proxy certificate. If the pathLenConstraint is negative path length constraint is used.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    pathLenConstraint path length constraint, negative, no constraint.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    pathLenConstraintpath length constraint, negative, no constraint.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_serialnumber()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_serialnumber int hx509_ca_tbs_set_serialnumber (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const heim_integer *  serialNumber const heim_integer * serialNumber 
    )
    -
    -
    - -

    -Set the serial number to use for to-be-signed certificate object.

    -

    Parameters:
    - - - - +
    +

    Set the serial number to use for to-be-signed certificate object.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    serialNumber serial number to use for the to-be-signed certificate object.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    serialNumberserial number to use for the to-be-signed certificate object.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_signature_algorithm()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_spki int hx509_ca_tbs_set_signature_algorithm (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const SubjectPublicKeyInfo *  spki const AlgorithmIdentifier * sigalg 
    )
    -
    -
    - -

    -Set the subject public key info (SPKI) in the to-be-signed certificate object. SPKI is the public key and key related parameters in the certificate.

    -

    Parameters:
    - - - - +
    +

    Set signature algorithm on the to be signed certificate

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    spki subject public key info to use for the to-be-signed certificate object.
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    sigalgsignature algorithm to use
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_spki()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_subject int hx509_ca_tbs_set_spki (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    hx509_name  subject const SubjectPublicKeyInfo * spki 
    )
    +
    +

    Set the subject public key info (SPKI) in the to-be-signed certificate object. SPKI is the public key and key related parameters in the certificate.

    +
    Parameters
    + + + + +
    contextA hx509 context.
    tbsobject to be signed.
    spkisubject public key info to use for the to-be-signed certificate object.
    +
    +
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    + +
    -
    + +

    ◆ hx509_ca_tbs_set_subject()

    -

    -Set the subject name of a to-be-signed certificate object.

    -

    Parameters:
    - - - - +
    +
    +
    context A hx509 context.
    tbs object to be signed.
    subject the name to set a subject.
    + + + + + + + + + + + + + + + + + + + + + + + +
    int hx509_ca_tbs_set_subject (hx509_context context,
    hx509_ca_tbs tbs,
    hx509_name subject 
    )
    +
    +

    Set the subject name of a to-be-signed certificate object.

    +
    Parameters
    + + + +
    contextA hx509 context.
    tbsobject to be signed.
    subjectthe name to set a subject.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_template()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_template int hx509_ca_tbs_set_template (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    int  flags, int flags,
    hx509_cert  cert hx509_cert cert 
    )
    -
    -
    - -

    -Initialize the to-be-signed certificate object from a template certifiate.

    -

    Parameters:
    - - - - - +
    +

    Initialize the to-be-signed certificate object from a template certifiate.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    flags bit field selecting what to copy from the template certifiate.
    cert template certificate.
    + + + +
    contextA hx509 context.
    tbsobject to be signed.
    flagsbit field selecting what to copy from the template certifiate.
    certtemplate certificate.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_set_unique()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_ca_tbs_set_unique int hx509_ca_tbs_set_unique (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    const heim_bit_string *  subjectUniqueID, const heim_bit_string * subjectUniqueID,
    const heim_bit_string *  issuerUniqueID const heim_bit_string * issuerUniqueID 
    )
    -
    -
    - -

    -Set the issuerUniqueID and subjectUniqueID

    -These are only supposed to be used considered with version 2 certificates, replaced by the two extensions SubjectKeyIdentifier and IssuerKeyIdentifier. This function is to allow application using legacy protocol to issue them.

    -

    Parameters:
    - - - - - +
    +

    Set the issuerUniqueID and subjectUniqueID

    +

    These are only supposed to be used considered with version 2 certificates, replaced by the two extensions SubjectKeyIdentifier and IssuerKeyIdentifier. This function is to allow application using legacy protocol to issue them.

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    issuerUniqueID to be set
    subjectUniqueID to be set
    + + + +
    contextA hx509 context.
    tbsobject to be signed.
    issuerUniqueIDto be set
    subjectUniqueIDto be set
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_subject_expand()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ca_tbs_subject_expand int hx509_ca_tbs_subject_expand (hx509_context  context, hx509_context context,
    hx509_ca_tbs  tbs, hx509_ca_tbs tbs,
    hx509_env  env hx509_env env 
    )
    -
    -
    - -

    -Expand the the subject name in the to-be-signed certificate object using hx509_name_expand().

    -

    Parameters:
    - - - - +
    +

    Expand the the subject name in the to-be-signed certificate object using hx509_name_expand().

    +
    Parameters
    +
    context A hx509 context.
    tbs object to be signed.
    env enviroment variable to expand variables in the subject name, see hx509_env_init().
    + + +
    contextA hx509 context.
    tbsobject to be signed.
    envenvironment variable to expand variables in the subject name, see hx509_env_init().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ca_tbs_template_units()

    +
    - + - - - - + + +
    struct units* hx509_ca_tbs_template_units const struct units* hx509_ca_tbs_template_units (void   )  [read]void )
    -
    -
    - -

    -Make of template units, use to build flags argument to hx509_ca_tbs_set_template() with parse_units().

    -

    Returns:
    an units structure.
    +
    +

    Make of template units, use to build flags argument to hx509_ca_tbs_set_template() with parse_units().

    +
    Returns
    an units structure.
    -

    +


    -Generated on Wed Jan 11 14:07:41 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cert.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cert.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cert.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cert.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 certificate functions +hx509 certificate functions @@ -8,1418 +8,1424 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 certificate functions
    +
    -

    hx509 certificate functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    int hx509_cert_init (hx509_context context, const Certificate *c, hx509_cert *cert)
    int hx509_cert_init_data (hx509_context context, const void *ptr, size_t len, hx509_cert *cert)
    void hx509_cert_free (hx509_cert cert)
    hx509_cert hx509_cert_ref (hx509_cert cert)
    void hx509_verify_ctx_f_allow_default_trustanchors (hx509_verify_ctx ctx, int boolean)
    int hx509_cert_find_subjectAltName_otherName (hx509_context context, hx509_cert cert, const heim_oid *oid, hx509_octet_string_list *list)
    int hx509_cert_cmp (hx509_cert p, hx509_cert q)
    int hx509_cert_get_issuer (hx509_cert p, hx509_name *name)
    int hx509_cert_get_subject (hx509_cert p, hx509_name *name)
    int hx509_cert_get_base_subject (hx509_context context, hx509_cert c, hx509_name *name)
    int hx509_cert_get_serialnumber (hx509_cert p, heim_integer *i)
    time_t hx509_cert_get_notBefore (hx509_cert p)
    time_t hx509_cert_get_notAfter (hx509_cert p)
    int hx509_cert_get_SPKI (hx509_context context, hx509_cert p, SubjectPublicKeyInfo *spki)
    int hx509_cert_get_SPKI_AlgorithmIdentifier (hx509_context context, hx509_cert p, AlgorithmIdentifier *alg)
    int hx509_cert_get_issuer_unique_id (hx509_context context, hx509_cert p, heim_bit_string *issuer)
    int hx509_cert_get_subject_unique_id (hx509_context context, hx509_cert p, heim_bit_string *subject)
    int hx509_verify_hostname (hx509_context context, const hx509_cert cert, int flags, hx509_hostname_type type, const char *hostname, const struct sockaddr *sa, int sa_size)
    hx509_cert_attribute hx509_cert_get_attribute (hx509_cert cert, const heim_oid *oid)
    int hx509_cert_set_friendly_name (hx509_cert cert, const char *name)
    const char * hx509_cert_get_friendly_name (hx509_cert cert)
    int hx509_query_alloc (hx509_context context, hx509_query **q)
    void hx509_query_match_option (hx509_query *q, hx509_query_option option)
    int hx509_query_match_issuer_serial (hx509_query *q, const Name *issuer, const heim_integer *serialNumber)
    int hx509_query_match_friendly_name (hx509_query *q, const char *name)
    int hx509_query_match_eku (hx509_query *q, const heim_oid *eku)
    int hx509_query_match_cmp_func (hx509_query *q, int(*func)(hx509_context, hx509_cert, void *), void *ctx)
    void hx509_query_free (hx509_context context, hx509_query *q)
    void hx509_query_statistic_file (hx509_context context, const char *fn)
    void hx509_query_unparse_stats (hx509_context context, int printtype, FILE *out)
    int hx509_cert_check_eku (hx509_context context, hx509_cert cert, const heim_oid *eku, int allow_any_eku)
    int hx509_cert_binary (hx509_context context, hx509_cert c, heim_octet_string *os)
    int hx509_print_cert (hx509_context context, hx509_cert cert, FILE *out)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    hx509_cert hx509_cert_init (hx509_context context, const Certificate *c, heim_error_t *error)
     
    hx509_cert hx509_cert_init_data (hx509_context context, const void *ptr, size_t len, heim_error_t *error)
     
    void hx509_cert_free (hx509_cert cert)
     
    hx509_cert hx509_cert_ref (hx509_cert cert)
     
    void hx509_verify_ctx_f_allow_default_trustanchors (hx509_verify_ctx ctx, int boolean)
     
    int hx509_cert_find_subjectAltName_otherName (hx509_context context, hx509_cert cert, const heim_oid *oid, hx509_octet_string_list *list)
     
    int hx509_cert_cmp (hx509_cert p, hx509_cert q)
     
    int hx509_cert_get_issuer (hx509_cert p, hx509_name *name)
     
    int hx509_cert_get_subject (hx509_cert p, hx509_name *name)
     
    int hx509_cert_get_base_subject (hx509_context context, hx509_cert c, hx509_name *name)
     
    int hx509_cert_get_serialnumber (hx509_cert p, heim_integer *i)
     
    time_t hx509_cert_get_notBefore (hx509_cert p)
     
    time_t hx509_cert_get_notAfter (hx509_cert p)
     
    int hx509_cert_get_SPKI (hx509_context context, hx509_cert p, SubjectPublicKeyInfo *spki)
     
    int hx509_cert_get_SPKI_AlgorithmIdentifier (hx509_context context, hx509_cert p, AlgorithmIdentifier *alg)
     
    int hx509_cert_get_issuer_unique_id (hx509_context context, hx509_cert p, heim_bit_string *issuer)
     
    int hx509_cert_get_subject_unique_id (hx509_context context, hx509_cert p, heim_bit_string *subject)
     
    int hx509_verify_hostname (hx509_context context, const hx509_cert cert, int flags, hx509_hostname_type type, const char *hostname, const struct sockaddr *sa, int sa_size)
     
    hx509_cert_attribute hx509_cert_get_attribute (hx509_cert cert, const heim_oid *oid)
     
    int hx509_cert_set_friendly_name (hx509_cert cert, const char *name)
     
    const char * hx509_cert_get_friendly_name (hx509_cert cert)
     
    int hx509_query_alloc (hx509_context context, hx509_query **q)
     
    void hx509_query_match_option (hx509_query *q, hx509_query_option option)
     
    int hx509_query_match_issuer_serial (hx509_query *q, const Name *issuer, const heim_integer *serialNumber)
     
    int hx509_query_match_friendly_name (hx509_query *q, const char *name)
     
    int hx509_query_match_eku (hx509_query *q, const heim_oid *eku)
     
    int hx509_query_match_cmp_func (hx509_query *q, int(*func)(hx509_context, hx509_cert, void *), void *ctx)
     
    void hx509_query_free (hx509_context context, hx509_query *q)
     
    void hx509_query_statistic_file (hx509_context context, const char *fn)
     
    void hx509_query_unparse_stats (hx509_context context, int printtype, FILE *out)
     
    int hx509_cert_check_eku (hx509_context context, hx509_cert cert, const heim_oid *eku, int allow_any_eku)
     
    int hx509_cert_binary (hx509_context context, hx509_cert c, heim_octet_string *os)
     
    int hx509_print_cert (hx509_context context, hx509_cert cert, FILE *out)
     
    -

    Detailed Description

    -See the The basic certificate for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the The basic certificate for description and examples.

    +

    Function Documentation

    + +

    ◆ hx509_cert_binary()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_binary int hx509_cert_binary (hx509_context  context, hx509_context context,
    hx509_cert  c, hx509_cert c,
    heim_octet_string *  os heim_octet_string * os 
    )
    -
    -
    - -

    -Encodes the hx509 certificate as a DER encode binary.

    -

    Parameters:
    - - - - +
    +

    Encodes the hx509 certificate as a DER encode binary.

    +
    Parameters
    +
    context A hx509 context.
    c the certificate to encode.
    os the encode certificate, set to NULL, 0 on case of error. Free the os->data with hx509_xfree().
    + + +
    contextA hx509 context.
    cthe certificate to encode.
    osthe encode certificate, set to NULL, 0 on case of error. Free the os->data with hx509_xfree().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - +

    + +

    ◆ hx509_cert_check_eku()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_cert_check_eku int hx509_cert_check_eku (hx509_context  context, hx509_context context,
    hx509_cert  cert, hx509_cert cert,
    const heim_oid *  eku, const heim_oid * eku,
    int  allow_any_eku int allow_any_eku 
    )
    -
    -
    - -

    -Check the extended key usage on the hx509 certificate.

    -

    Parameters:
    - - - - - +
    +

    Check the extended key usage on the hx509 certificate.

    +
    Parameters
    +
    context A hx509 context.
    cert A hx509 context.
    eku the EKU to check for
    allow_any_eku if the any EKU is set, allow that to be a substitute.
    + + + +
    contextA hx509 context.
    certA hx509 context.
    ekuthe EKU to check for
    allow_any_ekuif the any EKU is set, allow that to be a substitute.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_cmp()

    +
    - + - - + + - - + + - +
    int hx509_cert_cmp int hx509_cert_cmp (hx509_cert  p, hx509_cert p,
    hx509_cert  q hx509_cert q 
    )
    -
    -
    - -

    -Compare to hx509 certificate object, useful for sorting.

    -

    Parameters:
    - - - +
    +

    Compare to hx509 certificate object, useful for sorting.

    +
    Parameters
    +
    p a hx509 certificate object.
    q a hx509 certificate object.
    + +
    pa hx509 certificate object.
    qa hx509 certificate object.
    +
    -
    Returns:
    0 the objects are the same, returns > 0 is p is "larger" then q, < 0 if p is "smaller" then q.
    +
    Returns
    0 the objects are the same, returns > 0 is p is "larger" then q, < 0 if p is "smaller" then q.
    -

    - + + +

    ◆ hx509_cert_find_subjectAltName_otherName()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_cert_find_subjectAltName_otherName int hx509_cert_find_subjectAltName_otherName (hx509_context  context, hx509_context context,
    hx509_cert  cert, hx509_cert cert,
    const heim_oid *  oid, const heim_oid * oid,
    hx509_octet_string_list *  list hx509_octet_string_list * list 
    )
    -
    -
    - -

    -Return a list of subjectAltNames specified by oid in the certificate. On error the

    -The returned list of octet string should be freed with hx509_free_octet_string_list().

    -

    Parameters:
    - - - - - +
    +

    Return a list of subjectAltNames specified by oid in the certificate. On error the

    +

    The returned list of octet string should be freed with hx509_free_octet_string_list().

    +
    Parameters
    +
    context A hx509 context.
    cert a hx509 certificate object.
    oid an oid to for SubjectAltName.
    list list of matching SubjectAltName.
    + + + +
    contextA hx509 context.
    certa hx509 certificate object.
    oidan oid to for SubjectAltName.
    listlist of matching SubjectAltName.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_free()

    +
    - + - - - + +
    void hx509_cert_free void hx509_cert_free (hx509_cert  cert  ) hx509_cert cert)
    -
    -
    - -

    -Free reference to the hx509 certificate object, if the refcounter reaches 0, the object if freed. Its allowed to pass in NULL.

    -

    Parameters:
    - - +
    +

    Free reference to the hx509 certificate object, if the refcounter reaches 0, the object if freed. Its allowed to pass in NULL.

    +
    Parameters
    +
    cert the cert to free.
    +
    certthe cert to free.
    +
    -

    - + + +

    ◆ hx509_cert_get_attribute()

    +
    - + - - + + - - + + - +
    hx509_cert_attribute hx509_cert_get_attribute hx509_cert_attribute hx509_cert_get_attribute (hx509_cert  cert, hx509_cert cert,
    const heim_oid *  oid const heim_oid * oid 
    )
    -
    -
    - -

    -Get an external attribute for the certificate, examples are friendly name and id.

    -

    Parameters:
    - - - +
    +

    Get an external attribute for the certificate, examples are friendly name and id.

    +
    Parameters
    +
    cert hx509 certificate object to search
    oid an oid to search for.
    + +
    certhx509 certificate object to search
    oidan oid to search for.
    +
    -
    Returns:
    an hx509_cert_attribute, only valid as long as the certificate is referenced.
    +
    Returns
    an hx509_cert_attribute, only valid as long as the certificate is referenced.
    -

    - + + +

    ◆ hx509_cert_get_base_subject()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_get_base_subject int hx509_cert_get_base_subject (hx509_context  context, hx509_context context,
    hx509_cert  c, hx509_cert c,
    hx509_name *  name hx509_name * name 
    )
    -
    -
    - -

    -Return the name of the base subject of the hx509 certificate. If the certiicate is a verified proxy certificate, the this function return the base certificate (root of the proxy chain). If the proxy certificate is not verified with the base certificate HX509_PROXY_CERTIFICATE_NOT_CANONICALIZED is returned.

    -

    Parameters:
    - - - - +
    +

    Return the name of the base subject of the hx509 certificate. If the certiicate is a verified proxy certificate, the this function return the base certificate (root of the proxy chain). If the proxy certificate is not verified with the base certificate HX509_PROXY_CERTIFICATE_NOT_CANONICALIZED is returned.

    +
    Parameters
    +
    context a hx509 context.
    c a hx509 certificate object.
    name a pointer to a hx509 name, should be freed by hx509_name_free(). See also hx509_cert_get_subject().
    + + +
    contexta hx509 context.
    ca hx509 certificate object.
    namea pointer to a hx509 name, should be freed by hx509_name_free(). See also hx509_cert_get_subject().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_get_friendly_name()

    +
    - + - - - + +
    const char* hx509_cert_get_friendly_name const char* hx509_cert_get_friendly_name (hx509_cert  cert  ) hx509_cert cert)
    -
    -
    - -

    -Get friendly name of the certificate.

    -

    Parameters:
    - - +
    +

    Get friendly name of the certificate.

    +
    Parameters
    +
    cert cert to get the friendly name from.
    +
    certcert to get the friendly name from.
    +
    -
    Returns:
    an friendly name or NULL if there is. The friendly name is only valid as long as the certificate is referenced.
    +
    Returns
    an friendly name or NULL if there is. The friendly name is only valid as long as the certificate is referenced.
    -

    - + + +

    ◆ hx509_cert_get_issuer()

    +
    - + - - + + - - + + - +
    int hx509_cert_get_issuer int hx509_cert_get_issuer (hx509_cert  p, hx509_cert p,
    hx509_name *  name hx509_name * name 
    )
    -
    -
    - -

    -Return the name of the issuer of the hx509 certificate.

    -

    Parameters:
    - - - +
    +

    Return the name of the issuer of the hx509 certificate.

    +
    Parameters
    +
    p a hx509 certificate object.
    name a pointer to a hx509 name, should be freed by hx509_name_free().
    + +
    pa hx509 certificate object.
    namea pointer to a hx509 name, should be freed by hx509_name_free().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_get_issuer_unique_id()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_get_issuer_unique_id int hx509_cert_get_issuer_unique_id (hx509_context  context, hx509_context context,
    hx509_cert  p, hx509_cert p,
    heim_bit_string *  issuer heim_bit_string * issuer 
    )
    -
    -
    - -

    -Get a copy of the Issuer Unique ID

    -

    Parameters:
    - - - - +
    +

    Get a copy of the Issuer Unique ID

    +
    Parameters
    +
    context a hx509_context
    p a hx509 certificate
    issuer the issuer id returned, free with der_free_bit_string()
    + + +
    contexta hx509_context
    pa hx509 certificate
    issuerthe issuer id returned, free with der_free_bit_string()
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string(). The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a issuerUniqueID
    +
    Returns
    An hx509 error code, see hx509_get_error_string(). The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a issuerUniqueID
    -

    - + + +

    ◆ hx509_cert_get_notAfter()

    +
    - + - - - + +
    time_t hx509_cert_get_notAfter time_t hx509_cert_get_notAfter (hx509_cert  p  ) hx509_cert p)
    -
    -
    - -

    -Get notAfter time of the certificate.

    -

    Parameters:
    - - +
    +

    Get notAfter time of the certificate.

    +
    Parameters
    +
    p a hx509 certificate object.
    +
    pa hx509 certificate object.
    +
    -
    Returns:
    return not after time.
    +
    Returns
    return not after time.
    -

    - + + +

    ◆ hx509_cert_get_notBefore()

    +
    - + - - - + +
    time_t hx509_cert_get_notBefore time_t hx509_cert_get_notBefore (hx509_cert  p  ) hx509_cert p)
    -
    -
    - -

    -Get notBefore time of the certificate.

    -

    Parameters:
    - - +
    +

    Get notBefore time of the certificate.

    +
    Parameters
    +
    p a hx509 certificate object.
    +
    pa hx509 certificate object.
    +
    -
    Returns:
    return not before time
    +
    Returns
    return not before time
    -

    - + + +

    ◆ hx509_cert_get_serialnumber()

    +
    - + - - + + - - + + - +
    int hx509_cert_get_serialnumber int hx509_cert_get_serialnumber (hx509_cert  p, hx509_cert p,
    heim_integer *  i heim_integer * i 
    )
    -
    -
    - -

    -Get serial number of the certificate.

    -

    Parameters:
    - - - +
    +

    Get serial number of the certificate.

    +
    Parameters
    +
    p a hx509 certificate object.
    i serial number, should be freed ith der_free_heim_integer().
    + +
    pa hx509 certificate object.
    iserial number, should be freed ith der_free_heim_integer().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_get_SPKI()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_get_SPKI int hx509_cert_get_SPKI (hx509_context  context, hx509_context context,
    hx509_cert  p, hx509_cert p,
    SubjectPublicKeyInfo *  spki SubjectPublicKeyInfo * spki 
    )
    -
    -
    - -

    -Get the SubjectPublicKeyInfo structure from the hx509 certificate.

    -

    Parameters:
    - - - - +
    +

    Get the SubjectPublicKeyInfo structure from the hx509 certificate.

    +
    Parameters
    +
    context a hx509 context.
    p a hx509 certificate object.
    spki SubjectPublicKeyInfo, should be freed with free_SubjectPublicKeyInfo().
    + + +
    contexta hx509 context.
    pa hx509 certificate object.
    spkiSubjectPublicKeyInfo, should be freed with free_SubjectPublicKeyInfo().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_get_SPKI_AlgorithmIdentifier()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_get_SPKI_AlgorithmIdentifier int hx509_cert_get_SPKI_AlgorithmIdentifier (hx509_context  context, hx509_context context,
    hx509_cert  p, hx509_cert p,
    AlgorithmIdentifier *  alg AlgorithmIdentifier * alg 
    )
    -
    -
    - -

    -Get the AlgorithmIdentifier from the hx509 certificate.

    -

    Parameters:
    - - - - +
    +

    Get the AlgorithmIdentifier from the hx509 certificate.

    +
    Parameters
    +
    context a hx509 context.
    p a hx509 certificate object.
    alg AlgorithmIdentifier, should be freed with free_AlgorithmIdentifier(). The algorithmidentifier is typicly rsaEncryption, or id-ecPublicKey, or some other public key mechanism.
    + + +
    contexta hx509 context.
    pa hx509 certificate object.
    algAlgorithmIdentifier, should be freed with free_AlgorithmIdentifier(). The algorithmidentifier is typicly rsaEncryption, or id-ecPublicKey, or some other public key mechanism.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_get_subject()

    +
    - + - - + + - - + + - +
    int hx509_cert_get_subject int hx509_cert_get_subject (hx509_cert  p, hx509_cert p,
    hx509_name *  name hx509_name * name 
    )
    -
    -
    - -

    -Return the name of the subject of the hx509 certificate.

    -

    Parameters:
    - - - +
    +

    Return the name of the subject of the hx509 certificate.

    +
    Parameters
    +
    p a hx509 certificate object.
    name a pointer to a hx509 name, should be freed by hx509_name_free(). See also hx509_cert_get_base_subject().
    + +
    pa hx509 certificate object.
    namea pointer to a hx509 name, should be freed by hx509_name_free(). See also hx509_cert_get_base_subject().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_cert_get_subject_unique_id()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_get_subject_unique_id int hx509_cert_get_subject_unique_id (hx509_context  context, hx509_context context,
    hx509_cert  p, hx509_cert p,
    heim_bit_string *  subject heim_bit_string * subject 
    )
    -
    -
    - -

    -Get a copy of the Subect Unique ID

    -

    Parameters:
    - - - - +
    +

    Get a copy of the Subect Unique ID

    +
    Parameters
    +
    context a hx509_context
    p a hx509 certificate
    subject the subject id returned, free with der_free_bit_string()
    + + +
    contexta hx509_context
    pa hx509 certificate
    subjectthe subject id returned, free with der_free_bit_string()
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string(). The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a subjectUniqueID
    +
    Returns
    An hx509 error code, see hx509_get_error_string(). The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a subjectUniqueID
    -

    - + + +

    ◆ hx509_cert_init()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_init hx509_cert hx509_cert_init (hx509_context  context, hx509_context context,
    const Certificate *  c, const Certificate * c,
    hx509_cert *  cert heim_error_t * error 
    )
    -
    -
    - -

    -Allocate and init an hx509 certificate object from the decoded certificate `c´.

    -

    Parameters:
    - - - - +
    +

    Allocate and init an hx509 certificate object from the decoded certificate `c´.

    +
    Parameters
    +
    context A hx509 context.
    c 
    cert 
    + + +
    contextA hx509 context.
    c
    error
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 certificate
    -

    - + + +

    ◆ hx509_cert_init_data()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_cert_init_data hx509_cert hx509_cert_init_data (hx509_context  context, hx509_context context,
    const void *  ptr, const void * ptr,
    size_t  len, size_t len,
    hx509_cert *  cert heim_error_t * error 
    )
    -
    -
    - -

    -Just like hx509_cert_init(), but instead of a decode certificate takes an pointer and length to a memory region that contains a DER/BER encoded certificate.

    -If the memory region doesn't contain just the certificate and nothing more the function will fail with HX509_EXTRA_DATA_AFTER_STRUCTURE.

    -

    Parameters:
    - - - - - +
    +

    Just like hx509_cert_init(), but instead of a decode certificate takes an pointer and length to a memory region that contains a DER/BER encoded certificate.

    +

    If the memory region doesn't contain just the certificate and nothing more the function will fail with HX509_EXTRA_DATA_AFTER_STRUCTURE.

    +
    Parameters
    +
    context A hx509 context.
    ptr pointer to memory region containing encoded certificate.
    len length of memory region.
    cert a return pointer to a hx509 certificate object, will contain NULL on error.
    + + + +
    contextA hx509 context.
    ptrpointer to memory region containing encoded certificate.
    lenlength of memory region.
    errorpossibly returns an error
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 certificate
    -

    - + + +

    ◆ hx509_cert_ref()

    +
    - + - - - + +
    hx509_cert hx509_cert_ref hx509_cert hx509_cert_ref (hx509_cert  cert  ) hx509_cert cert)
    -
    -
    - -

    -Add a reference to a hx509 certificate object.

    -

    Parameters:
    - - +
    +

    Add a reference to a hx509 certificate object.

    +
    Parameters
    +
    cert a pointer to an hx509 certificate object.
    +
    certa pointer to an hx509 certificate object.
    +
    -
    Returns:
    the same object as is passed in.
    +
    Returns
    the same object as is passed in.
    -

    - + + +

    ◆ hx509_cert_set_friendly_name()

    +
    - + - - + + - - + + - +
    int hx509_cert_set_friendly_name int hx509_cert_set_friendly_name (hx509_cert  cert, hx509_cert cert,
    const char *  name const char * name 
    )
    -
    -
    - -

    -Set the friendly name on the certificate.

    -

    Parameters:
    - - - +
    +

    Set the friendly name on the certificate.

    +
    Parameters
    +
    cert The certificate to set the friendly name on
    name Friendly name.
    + +
    certThe certificate to set the friendly name on
    nameFriendly name.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_print_cert()

    +
    - + - - + + - - + + - - + + - +
    int hx509_print_cert int hx509_print_cert (hx509_context  context, hx509_context context,
    hx509_cert  cert, hx509_cert cert,
    FILE *  out FILE * out 
    )
    -
    -
    - -

    -Print a simple representation of a certificate

    -

    Parameters:
    - - - - +
    +

    Print a simple representation of a certificate

    +
    Parameters
    +
    context A hx509 context, can be NULL
    cert certificate to print
    out the stdio output stream, if NULL, stdout is used
    + + +
    contextA hx509 context, can be NULL
    certcertificate to print
    outthe stdio output stream, if NULL, stdout is used
    +
    -
    Returns:
    An hx509 error code
    +
    Returns
    An hx509 error code
    -

    - + + +

    ◆ hx509_query_alloc()

    +
    - + - - + + - - + + - +
    int hx509_query_alloc int hx509_query_alloc (hx509_context  context, hx509_context context,
    hx509_query **  q hx509_query ** q 
    )
    -
    -
    - -

    -Allocate an query controller. Free using hx509_query_free().

    -

    Parameters:
    - - - +
    +

    Allocate an query controller. Free using hx509_query_free().

    +
    Parameters
    +
    context A hx509 context.
    q return pointer to a hx509_query.
    + +
    contextA hx509 context.
    qreturn pointer to a hx509_query.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_query_free()

    +
    - + - - + + - - + + - +
    void hx509_query_free void hx509_query_free (hx509_context  context, hx509_context context,
    hx509_query *  q hx509_query * q 
    )
    -
    -
    - -

    -Free the query controller.

    -

    Parameters:
    - - - +
    +

    Free the query controller.

    +
    Parameters
    +
    context A hx509 context.
    q a pointer to the query controller.
    + +
    contextA hx509 context.
    qa pointer to the query controller.
    +
    -

    - + + +

    ◆ hx509_query_match_cmp_func()

    +
    - + - - + + - - + + - - + + - +
    int hx509_query_match_cmp_func int hx509_query_match_cmp_func (hx509_query *  q, hx509_query * q,
    int(*)(hx509_context, hx509_cert, void *)  func, int(*)(hx509_context, hx509_cert, void *) func,
    void *  ctx void * ctx 
    )
    -
    -
    - -

    -Set the query controller to match using a specific match function.

    -

    Parameters:
    - - - - +
    +

    Set the query controller to match using a specific match function.

    +
    Parameters
    +
    q a hx509 query controller.
    func function to use for matching, if the argument is NULL, the match function is removed.
    ctx context passed to the function.
    + + +
    qa hx509 query controller.
    funcfunction to use for matching, if the argument is NULL, the match function is removed.
    ctxcontext passed to the function.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_query_match_eku()

    +
    - + - - + + - - + + - +
    int hx509_query_match_eku int hx509_query_match_eku (hx509_query *  q, hx509_query * q,
    const heim_oid *  eku const heim_oid * eku 
    )
    -
    -
    - -

    -Set the query controller to require an one specific EKU (extended key usage). Any previous EKU matching is overwitten. If NULL is passed in as the eku, the EKU requirement is reset.

    -

    Parameters:
    - - - +
    +

    Set the query controller to require an one specific EKU (extended key usage). Any previous EKU matching is overwitten. If NULL is passed in as the eku, the EKU requirement is reset.

    +
    Parameters
    +
    q a hx509 query controller.
    eku an EKU to match on.
    + +
    qa hx509 query controller.
    ekuan EKU to match on.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_query_match_friendly_name()

    +
    - + - - + + - - + + - +
    int hx509_query_match_friendly_name int hx509_query_match_friendly_name (hx509_query *  q, hx509_query * q,
    const char *  name const char * name 
    )
    -
    -
    - -

    -Set the query controller to match on a friendly name

    -

    Parameters:
    - - - +
    +

    Set the query controller to match on a friendly name

    +
    Parameters
    +
    q a hx509 query controller.
    name a friendly name to match on
    + +
    qa hx509 query controller.
    namea friendly name to match on
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_query_match_issuer_serial()

    +
    - + - - + + - - + + - - + + - +
    int hx509_query_match_issuer_serial int hx509_query_match_issuer_serial (hx509_query *  q, hx509_query * q,
    const Name *  issuer, const Name * issuer,
    const heim_integer *  serialNumber const heim_integer * serialNumber 
    )
    -
    -
    - -

    -Set the issuer and serial number of match in the query controller. The function make copies of the isser and serial number.

    -

    Parameters:
    - - - - +
    +

    Set the issuer and serial number of match in the query controller. The function make copies of the isser and serial number.

    +
    Parameters
    +
    q a hx509 query controller
    issuer issuer to search for
    serialNumber the serialNumber of the issuer.
    + + +
    qa hx509 query controller
    issuerissuer to search for
    serialNumberthe serialNumber of the issuer.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_query_match_option()

    +
    - + - - + + - - + + - +
    void hx509_query_match_option void hx509_query_match_option (hx509_query *  q, hx509_query * q,
    hx509_query_option  option hx509_query_option option 
    )
    -
    -
    - -

    -Set match options for the hx509 query controller.

    -

    Parameters:
    - - - +
    +

    Set match options for the hx509 query controller.

    +
    Parameters
    +
    q query controller.
    option options to control the query controller.
    + +
    qquery controller.
    optionoptions to control the query controller.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_query_statistic_file()

    +
    - + - - + + - - + + - +
    void hx509_query_statistic_file void hx509_query_statistic_file (hx509_context  context, hx509_context context,
    const char *  fn const char * fn 
    )
    -
    -
    - -

    -Set a statistic file for the query statistics.

    -

    Parameters:
    - - - +
    +

    Set a statistic file for the query statistics.

    +
    Parameters
    +
    context A hx509 context.
    fn statistics file name
    + +
    contextA hx509 context.
    fnstatistics file name
    +
    -

    - + + +

    ◆ hx509_query_unparse_stats()

    +
    - + - - + + - - + + - - + + - +
    void hx509_query_unparse_stats void hx509_query_unparse_stats (hx509_context  context, hx509_context context,
    int  printtype, int printtype,
    FILE *  out FILE * out 
    )
    -
    -
    - -

    -Unparse the statistics file and print the result on a FILE descriptor.

    -

    Parameters:
    - - - - +
    +

    Unparse the statistics file and print the result on a FILE descriptor.

    +
    Parameters
    +
    context A hx509 context.
    printtype tyep to print
    out the FILE to write the data on.
    + + +
    contextA hx509 context.
    printtypetyep to print
    outthe FILE to write the data on.
    +
    -

    - + + +

    ◆ hx509_verify_ctx_f_allow_default_trustanchors()

    +
    - + - - + + - - + + - +
    void hx509_verify_ctx_f_allow_default_trustanchors void hx509_verify_ctx_f_allow_default_trustanchors (hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    int  boolean int boolean 
    )
    -
    -
    - -

    -Allow using the operating system builtin trust anchors if no other trust anchors are configured.

    -

    Parameters:
    - - - +
    +

    Allow using the operating system builtin trust anchors if no other trust anchors are configured.

    +
    Parameters
    +
    ctx a verification context
    boolean if non zero, useing the operating systems builtin trust anchors.
    + +
    ctxa verification context
    booleanif non zero, useing the operating systems builtin trust anchors.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_verify_hostname()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_verify_hostname int hx509_verify_hostname (hx509_context  context, hx509_context context,
    const hx509_cert  cert, const hx509_cert cert,
    int  flags, int flags,
    hx509_hostname_type  type, hx509_hostname_type type,
    const char *  hostname, const char * hostname,
    const struct sockaddr *  sa, const struct sockaddr * sa,
    int  sa_size int sa_size 
    )
    -
    -
    - -

    -Verify that the certificate is allowed to be used for the hostname and address.

    -

    Parameters:
    - - - -
    context A hx509 context.
    cert the certificate to match with
    flags Flags to modify the behavior:
      -
    • HX509_VHN_F_ALLOW_NO_MATCH no match is ok
    +
    +

    Verify that the certificate is allowed to be used for the hostname and address.

    +
    Parameters
    + + + + - - - - + + +
    contextA hx509 context.
    certthe certificate to match with
    flagsFlags to modify the behavior:
      +
    • HX509_VHN_F_ALLOW_NO_MATCH no match is ok
    • +
    type type of hostname:
      -
    • HX509_HN_HOSTNAME for plain hostname.
    • HX509_HN_DNSSRV for DNS SRV names.
    +
    typetype of hostname:
      +
    • HX509_HN_HOSTNAME for plain hostname.
    • +
    • HX509_HN_DNSSRV for DNS SRV names.
    • +
    hostname the hostname to check
    sa address of the host
    sa_size length of address
    hostnamethe hostname to check
    saaddress of the host
    sa_sizelength of address
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cms.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cms.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cms.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__cms.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 CMS/pkcs7 functions +hx509 CMS/pkcs7 functions @@ -8,497 +8,514 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 CMS/pkcs7 functions
    +
    -

    hx509 CMS/pkcs7 functions

    - - - - - - - - - - - - - - +

    Functions

    int hx509_cms_wrap_ContentInfo (const heim_oid *oid, const heim_octet_string *buf, heim_octet_string *res)
    int hx509_cms_unwrap_ContentInfo (const heim_octet_string *in, heim_oid *oid, heim_octet_string *out, int *have_data)
    int hx509_cms_unenvelope (hx509_context context, hx509_certs certs, int flags, const void *data, size_t length, const heim_octet_string *encryptedContent, time_t time_now, heim_oid *contentType, heim_octet_string *content)
    int hx509_cms_envelope_1 (hx509_context context, int flags, hx509_cert cert, const void *data, size_t length, const heim_oid *encryption_type, const heim_oid *contentType, heim_octet_string *content)
    int hx509_cms_verify_signed (hx509_context context, hx509_verify_ctx ctx, unsigned int flags, const void *data, size_t length, const heim_octet_string *signedContent, hx509_certs pool, heim_oid *contentType, heim_octet_string *content, hx509_certs *signer_certs)
    int hx509_cms_create_signed_1 (hx509_context context, int flags, const heim_oid *eContentType, const void *data, size_t length, const AlgorithmIdentifier *digest_alg, hx509_cert cert, hx509_peer_info peer, hx509_certs anchors, hx509_certs pool, heim_octet_string *signed_data)
    + + + + + + + + + + + + +

    +Functions

    int hx509_cms_wrap_ContentInfo (const heim_oid *oid, const heim_octet_string *buf, heim_octet_string *res)
     
    int hx509_cms_unwrap_ContentInfo (const heim_octet_string *in, heim_oid *oid, heim_octet_string *out, int *have_data)
     
    int hx509_cms_unenvelope (hx509_context context, hx509_certs certs, int flags, const void *data, size_t length, const heim_octet_string *encryptedContent, time_t time_now, heim_oid *contentType, heim_octet_string *content)
     
    int hx509_cms_envelope_1 (hx509_context context, int flags, hx509_cert cert, const void *data, size_t length, const heim_oid *encryption_type, const heim_oid *contentType, heim_octet_string *content)
     
    int hx509_cms_verify_signed (hx509_context context, hx509_verify_ctx ctx, unsigned int flags, const void *data, size_t length, const heim_octet_string *signedContent, hx509_certs pool, heim_oid *contentType, heim_octet_string *content, hx509_certs *signer_certs)
     
    int hx509_cms_create_signed_1 (hx509_context context, int flags, const heim_oid *eContentType, const void *data, size_t length, const AlgorithmIdentifier *digest_alg, hx509_cert cert, hx509_peer_info peer, hx509_certs anchors, hx509_certs pool, heim_octet_string *signed_data)
     
    -

    Detailed Description

    -See the CMS/PKCS7 message functions. for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the CMS/PKCS7 message functions. for description and examples.

    +

    Function Documentation

    + +

    ◆ hx509_cms_create_signed_1()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_cms_create_signed_1 int hx509_cms_create_signed_1 (hx509_context  context, hx509_context context,
    int  flags, int flags,
    const heim_oid *  eContentType, const heim_oid * eContentType,
    const void *  data, const void * data,
    size_t  length, size_t length,
    const AlgorithmIdentifier *  digest_alg, const AlgorithmIdentifier * digest_alg,
    hx509_cert  cert, hx509_cert cert,
    hx509_peer_info  peer, hx509_peer_info peer,
    hx509_certs  anchors, hx509_certs anchors,
    hx509_certs  pool, hx509_certs pool,
    heim_octet_string *  signed_data heim_octet_string * signed_data 
    )
    -
    -
    - -

    -Decode SignedData and verify that the signature is correct.

    -

    Parameters:
    - - - - - - - - - - - - +
    +

    Decode SignedData and verify that the signature is correct.

    +
    Parameters
    +
    context A hx509 context.
    flags 
    eContentType the type of the data.
    data data to sign
    length length of the data that data point to.
    digest_alg digest algorithm to use, use NULL to get the default or the peer determined algorithm.
    cert certificate to use for sign the data.
    peer info about the peer the message to send the message to, like what digest algorithm to use.
    anchors trust anchors that the client will use, used to polulate the certificates included in the message
    pool certificates to use in try to build the path to the trust anchors.
    signed_data the output of the function, free with der_free_octet_string().
    + + + + + + + + + + +
    contextA hx509 context.
    flags
    eContentTypethe type of the data.
    datadata to sign
    lengthlength of the data that data point to.
    digest_algdigest algorithm to use, use NULL to get the default or the peer determined algorithm.
    certcertificate to use for sign the data.
    peerinfo about the peer the message to send the message to, like what digest algorithm to use.
    anchorstrust anchors that the client will use, used to polulate the certificates included in the message
    poolcertificates to use in try to build the path to the trust anchors.
    signed_datathe output of the function, free with der_free_octet_string().
    +
    +
    Returns
    Returns an hx509 error code.
    -

    - +

    + +

    ◆ hx509_cms_envelope_1()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_cms_envelope_1 int hx509_cms_envelope_1 (hx509_context  context, hx509_context context,
    int  flags, int flags,
    hx509_cert  cert, hx509_cert cert,
    const void *  data, const void * data,
    size_t  length, size_t length,
    const heim_oid *  encryption_type, const heim_oid * encryption_type,
    const heim_oid *  contentType, const heim_oid * contentType,
    heim_octet_string *  content heim_octet_string * content 
    )
    -
    -
    - -

    -Encrypt end encode EnvelopedData.

    -Encrypt and encode EnvelopedData. The data is encrypted with a random key and the the random key is encrypted with the certificates private key. This limits what private key type can be used to RSA.

    -

    Parameters:
    - - -
    context A hx509 context.
    flags flags to control the behavior.
      -
    • HX509_CMS_EV_NO_KU_CHECK - Dont check KU on certificate
    • HX509_CMS_EV_ALLOW_WEAK - Allow weak crytpo
    • HX509_CMS_EV_ID_NAME - prefer issuer name and serial number
    +
    +

    Encrypt end encode EnvelopedData.

    +

    Encrypt and encode EnvelopedData. The data is encrypted with a random key and the the random key is encrypted with the certificates private key. This limits what private key type can be used to RSA.

    +
    Parameters
    + + + - - - - - - + + + + + +
    contextA hx509 context.
    flagsflags to control the behavior.
      +
    • HX509_CMS_EV_NO_KU_CHECK - Don't check KU on certificate
    • +
    • HX509_CMS_EV_ALLOW_WEAK - Allow weak crytpo
    • +
    • HX509_CMS_EV_ID_NAME - prefer issuer name and serial number
    • +
    cert Certificate to encrypt the EnvelopedData encryption key with.
    data pointer the data to encrypt.
    length length of the data that data point to.
    encryption_type Encryption cipher to use for the bulk data, use NULL to get default.
    contentType type of the data that is encrypted
    content the output of the function, free with der_free_octet_string().
    certCertificate to encrypt the EnvelopedData encryption key with.
    datapointer the data to encrypt.
    lengthlength of the data that data point to.
    encryption_typeEncryption cipher to use for the bulk data, use NULL to get default.
    contentTypetype of the data that is encrypted
    contentthe output of the function, free with der_free_octet_string().
    +
    +
    Returns
    an hx509 error code.
    -

    - + + +

    ◆ hx509_cms_unenvelope()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_cms_unenvelope int hx509_cms_unenvelope (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    int  flags, int flags,
    const void *  data, const void * data,
    size_t  length, size_t length,
    const heim_octet_string *  encryptedContent, const heim_octet_string * encryptedContent,
    time_t  time_now, time_t time_now,
    heim_oid *  contentType, heim_oid * contentType,
    heim_octet_string *  content heim_octet_string * content 
    )
    -
    -
    - -

    -Decode and unencrypt EnvelopedData.

    -Extract data and parameteres from from the EnvelopedData. Also supports using detached EnvelopedData.

    -

    Parameters:
    - - - - - - - - - - +
    +

    Decode and unencrypt EnvelopedData.

    +

    Extract data and parameteres from from the EnvelopedData. Also supports using detached EnvelopedData.

    +
    Parameters
    +
    context A hx509 context.
    certs Certificate that can decrypt the EnvelopedData encryption key.
    flags HX509_CMS_UE flags to control the behavior.
    data pointer the structure the contains the DER/BER encoded EnvelopedData stucture.
    length length of the data that data point to.
    encryptedContent in case of detached signature, this contains the actual encrypted data, othersize its should be NULL.
    time_now set the current time, if zero the library uses now as the date.
    contentType output type oid, should be freed with der_free_oid().
    content the data, free with der_free_octet_string().
    + + + + + + + + +
    contextA hx509 context.
    certsCertificate that can decrypt the EnvelopedData encryption key.
    flagsHX509_CMS_UE flags to control the behavior.
    datapointer the structure the contains the DER/BER encoded EnvelopedData stucture.
    lengthlength of the data that data point to.
    encryptedContentin case of detached signature, this contains the actual encrypted data, othersize its should be NULL.
    time_nowset the current time, if zero the library uses now as the date.
    contentTypeoutput type oid, should be freed with der_free_oid().
    contentthe data, free with der_free_octet_string().
    +
    +
    Returns
    an hx509 error code.
    -

    - + + +

    ◆ hx509_cms_unwrap_ContentInfo()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_cms_unwrap_ContentInfo int hx509_cms_unwrap_ContentInfo (const heim_octet_string *  in, const heim_octet_string * in,
    heim_oid *  oid, heim_oid * oid,
    heim_octet_string *  out, heim_octet_string * out,
    int *  have_data int * have_data 
    )
    -
    -
    - -

    -Decode an ContentInfo and unwrap data and oid it.

    -

    Parameters:
    - - - - - +
    +

    Decode an ContentInfo and unwrap data and oid it.

    +
    Parameters
    +
    in the encoded buffer.
    oid type of the content.
    out data to be wrapped.
    have_data since the data is optional, this flags show dthe diffrence between no data and the zero length data.
    + + + +
    inthe encoded buffer.
    oidtype of the content.
    outdata to be wrapped.
    have_datasince the data is optional, this flags show dthe diffrence between no data and the zero length data.
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_cms_verify_signed()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_cms_verify_signed int hx509_cms_verify_signed (hx509_context  context, hx509_context context,
    hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    unsigned int  flags, unsigned int flags,
    const void *  data, const void * data,
    size_t  length, size_t length,
    const heim_octet_string *  signedContent, const heim_octet_string * signedContent,
    hx509_certs  pool, hx509_certs pool,
    heim_oid *  contentType, heim_oid * contentType,
    heim_octet_string *  content, heim_octet_string * content,
    hx509_certs *  signer_certs hx509_certs * signer_certs 
    )
    -
    -
    - -

    -Decode SignedData and verify that the signature is correct.

    -

    Parameters:
    - - - -
    context A hx509 context.
    ctx a hx509 verify context.
    flags to control the behaivor of the function.
      -
    • HX509_CMS_VS_NO_KU_CHECK - Don't check KeyUsage
    • HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH - allow oid mismatch
    • HX509_CMS_VS_ALLOW_ZERO_SIGNER - no signer, see below.
    +
    +

    Decode SignedData and verify that the signature is correct.

    +
    Parameters
    + + + + - - - - - - - + + + + + + +
    contextA hx509 context.
    ctxa hx509 verify context.
    flagsto control the behaivor of the function.
      +
    • HX509_CMS_VS_NO_KU_CHECK - Don't check KeyUsage
    • +
    • HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH - allow oid mismatch
    • +
    • HX509_CMS_VS_ALLOW_ZERO_SIGNER - no signer, see below.
    • +
    data pointer to CMS SignedData encoded data.
    length length of the data that data point to.
    signedContent external data used for signature.
    pool certificate pool to build certificates paths.
    contentType free with der_free_oid().
    content the output of the function, free with der_free_octet_string().
    signer_certs list of the cerficates used to sign this request, free with hx509_certs_free().
    datapointer to CMS SignedData encoded data.
    lengthlength of the data that data point to.
    signedContentexternal data used for signature.
    poolcertificate pool to build certificates paths.
    contentTypefree with der_free_oid().
    contentthe output of the function, free with der_free_octet_string().
    signer_certslist of the cerficates used to sign this request, free with hx509_certs_free().
    +
    +
    Returns
    an hx509 error code.
    +

    If HX509_CMS_VS_NO_KU_CHECK is set, allow more liberal search for matching certificates by not considering KeyUsage bits on the certificates.

    +

    If HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH, allow encapContentInfo mismatch with the oid in signedAttributes (or if no signedAttributes where use, pkcs7-data oid). This is only needed to work with broken CMS implementations that doesn't follow CMS signedAttributes rules.

    +

    If HX509_CMS_VS_NO_VALIDATE flags is set, do not verify the signing certificates and leave that up to the caller.

    +

    If HX509_CMS_VS_ALLOW_ZERO_SIGNER is set, allow empty SignerInfo (no signatures). If SignedData have no signatures, the function will return 0 with signer_certs set to NULL. Zero signers is allowed by the standard, but since its only useful in corner cases, it make into a flag that the caller have to turn on.

    -

    -If HX509_CMS_VS_NO_KU_CHECK is set, allow more liberal search for matching certificates by not considering KeyUsage bits on the certificates.

    -If HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH, allow encapContentInfo mismatch with the oid in signedAttributes (or if no signedAttributes where use, pkcs7-data oid). This is only needed to work with broken CMS implementations that doesn't follow CMS signedAttributes rules.

    -If HX509_CMS_VS_NO_VALIDATE flags is set, do not verify the signing certificates and leave that up to the caller.

    -If HX509_CMS_VS_ALLOW_ZERO_SIGNER is set, allow empty SignerInfo (no signatures). If SignedData have no signatures, the function will return 0 with signer_certs set to NULL. Zero signers is allowed by the standard, but since its only useful in corner cases, it make into a flag that the caller have to turn on.

    -

    - + + +

    ◆ hx509_cms_wrap_ContentInfo()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cms_wrap_ContentInfo int hx509_cms_wrap_ContentInfo (const heim_oid *  oid, const heim_oid * oid,
    const heim_octet_string *  buf, const heim_octet_string * buf,
    heim_octet_string *  res heim_octet_string * res 
    )
    -
    -
    - -

    -Wrap data and oid in a ContentInfo and encode it.

    -

    Parameters:
    - - - - +
    +

    Wrap data and oid in a ContentInfo and encode it.

    +
    Parameters
    +
    oid type of the content.
    buf data to be wrapped. If a NULL pointer is passed in, the optional content field in the ContentInfo is not going be filled in.
    res the encoded buffer, the result should be freed with der_free_octet_string().
    + + +
    oidtype of the content.
    bufdata to be wrapped. If a NULL pointer is passed in, the optional content field in the ContentInfo is not going be filled in.
    resthe encoded buffer, the result should be freed with der_free_octet_string().
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__crypto.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__crypto.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__crypto.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__crypto.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 crypto functions +hx509 crypto functions @@ -8,85 +8,92 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 crypto functions
    +
    -

    hx509 crypto functions

    - - - - +

    Functions

    int hx509_verify_signature (hx509_context context, const hx509_cert signer, const AlgorithmIdentifier *alg, const heim_octet_string *data, const heim_octet_string *sig)
    + + +

    +Functions

    int hx509_verify_signature (hx509_context context, const hx509_cert signer, const AlgorithmIdentifier *alg, const heim_octet_string *data, const heim_octet_string *sig)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ hx509_verify_signature()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_verify_signature int hx509_verify_signature (hx509_context  context, hx509_context context,
    const hx509_cert  signer, const hx509_cert signer,
    const AlgorithmIdentifier *  alg, const AlgorithmIdentifier * alg,
    const heim_octet_string *  data, const heim_octet_string * data,
    const heim_octet_string *  sig const heim_octet_string * sig 
    )
    -
    -
    - -

    -Verify a signature made using the private key of an certificate.

    -

    Parameters:
    - - - - - - +
    +

    Verify a signature made using the private key of an certificate.

    +
    Parameters
    +
    context A hx509 context.
    signer the certificate that made the signature.
    alg algorthm that was used to sign the data.
    data the data that was signed.
    sig the sigature to verify.
    + + + + +
    contextA hx509 context.
    signerthe certificate that made the signature.
    algalgorthm that was used to sign the data.
    datathe data that was signed.
    sigthe sigature to verify.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__env.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__env.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__env.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__env.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 enviroment functions +hx509 environment functions @@ -8,304 +8,310 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 environment functions
    +
    -

    hx509 enviroment functions

    - - - - - - - - - - - - - - +

    Functions

    int hx509_env_add (hx509_context context, hx509_env *env, const char *key, const char *value)
    int hx509_env_add_binding (hx509_context context, hx509_env *env, const char *key, hx509_env list)
    const char * hx509_env_lfind (hx509_context context, hx509_env env, const char *key, size_t len)
    const char * hx509_env_find (hx509_context context, hx509_env env, const char *key)
    hx509_env hx509_env_find_binding (hx509_context context, hx509_env env, const char *key)
    void hx509_env_free (hx509_env *env)
    + + + + + + + + + + + + +

    +Functions

    int hx509_env_add (hx509_context context, hx509_env *env, const char *key, const char *value)
     
    int hx509_env_add_binding (hx509_context context, hx509_env *env, const char *key, hx509_env list)
     
    const char * hx509_env_lfind (hx509_context context, hx509_env env, const char *key, size_t len)
     
    const char * hx509_env_find (hx509_context context, hx509_env env, const char *key)
     
    hx509_env hx509_env_find_binding (hx509_context context, hx509_env env, const char *key)
     
    void hx509_env_free (hx509_env *env)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ hx509_env_add()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_env_add int hx509_env_add (hx509_context  context, hx509_context context,
    hx509_env *  env, hx509_env * env,
    const char *  key, const char * key,
    const char *  value const char * value 
    )
    -
    -
    - -

    -Add a new key/value pair to the hx509_env.

    -

    Parameters:
    - - - - - +
    +

    Add a new key/value pair to the hx509_env.

    +
    Parameters
    +
    context A hx509 context.
    env enviroment to add the enviroment variable too.
    key key to add
    value value to add
    + + + +
    contextA hx509 context.
    envenvironment to add the environment variable too.
    keykey to add
    valuevalue to add
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - +

    + +

    ◆ hx509_env_add_binding()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_env_add_binding int hx509_env_add_binding (hx509_context  context, hx509_context context,
    hx509_env *  env, hx509_env * env,
    const char *  key, const char * key,
    hx509_env  list hx509_env list 
    )
    -
    -
    - -

    -Add a new key/binding pair to the hx509_env.

    -

    Parameters:
    - - - - - +
    +

    Add a new key/binding pair to the hx509_env.

    +
    Parameters
    +
    context A hx509 context.
    env enviroment to add the enviroment variable too.
    key key to add
    list binding list to add
    + + + +
    contextA hx509 context.
    envenvironment to add the environment variable too.
    keykey to add
    listbinding list to add
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_env_find()

    +
    - + - - + + - - + + - - + + - +
    const char* hx509_env_find const char* hx509_env_find (hx509_context  context, hx509_context context,
    hx509_env  env, hx509_env env,
    const char *  key const char * key 
    )
    -
    -
    - -

    -Search the hx509_env for a key.

    -

    Parameters:
    - - - - +
    +

    Search the hx509_env for a key.

    +
    Parameters
    +
    context A hx509 context.
    env enviroment to add the enviroment variable too.
    key key to search for.
    + + +
    contextA hx509 context.
    envenvironment to add the environment variable too.
    keykey to search for.
    +
    -
    Returns:
    the value if the key is found, NULL otherwise.
    +
    Returns
    the value if the key is found, NULL otherwise.
    -

    - + + +

    ◆ hx509_env_find_binding()

    +
    - + - - + + - - + + - - + + - +
    hx509_env hx509_env_find_binding hx509_env hx509_env_find_binding (hx509_context  context, hx509_context context,
    hx509_env  env, hx509_env env,
    const char *  key const char * key 
    )
    -
    -
    - -

    -Search the hx509_env for a binding.

    -

    Parameters:
    - - - - +
    +

    Search the hx509_env for a binding.

    +
    Parameters
    +
    context A hx509 context.
    env enviroment to add the enviroment variable too.
    key key to search for.
    + + +
    contextA hx509 context.
    envenvironment to add the environment variable too.
    keykey to search for.
    +
    -
    Returns:
    the binding if the key is found, NULL if not found.
    +
    Returns
    the binding if the key is found, NULL if not found.
    -

    - + + +

    ◆ hx509_env_free()

    +
    - + - - - + +
    void hx509_env_free void hx509_env_free (hx509_env *  env  ) hx509_env * env)
    -
    -
    - -

    -Free an hx509_env enviroment context.

    -

    Parameters:
    - - +
    +

    Free an hx509_env environment context.

    +
    Parameters
    +
    env the enviroment to free.
    +
    envthe environment to free.
    +
    -

    - + + +

    ◆ hx509_env_lfind()

    +
    - + - - + + - - + + - - + + - - + + - +
    const char* hx509_env_lfind const char* hx509_env_lfind (hx509_context  context, hx509_context context,
    hx509_env  env, hx509_env env,
    const char *  key, const char * key,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Search the hx509_env for a length based key.

    -

    Parameters:
    - - - - - +
    +

    Search the hx509_env for a length based key.

    +
    Parameters
    +
    context A hx509 context.
    env enviroment to add the enviroment variable too.
    key key to search for.
    len length of key.
    + + + +
    contextA hx509 context.
    envenvironment to add the environment variable too.
    keykey to search for.
    lenlength of key.
    +
    -
    Returns:
    the value if the key is found, NULL otherwise.
    +
    Returns
    the value if the key is found, NULL otherwise.
    -

    +


    -Generated on Wed Jan 11 14:07:41 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__error.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__error.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__error.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__error.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 error functions +hx509 error functions @@ -8,301 +8,309 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 error functions
    +
    -

    hx509 error functions

    - - - - - - - - - - - - - - +

    Functions

    void hx509_clear_error_string (hx509_context context)
    void hx509_set_error_stringv (hx509_context context, int flags, int code, const char *fmt, va_list ap)
    void hx509_set_error_string (hx509_context context, int flags, int code, const char *fmt,...)
    char * hx509_get_error_string (hx509_context context, int error_code)
    void hx509_free_error_string (char *str)
    void hx509_err (hx509_context context, int exit_code, int error_code, const char *fmt,...)
    + + + + + + + + + + + + +

    +Functions

    void hx509_clear_error_string (hx509_context context)
     
    void hx509_set_error_stringv (hx509_context context, int flags, int code, const char *fmt, va_list ap)
     
    void hx509_set_error_string (hx509_context context, int flags, int code, const char *fmt,...)
     
    char * hx509_get_error_string (hx509_context context, int error_code)
     
    void hx509_free_error_string (char *str)
     
    void hx509_err (hx509_context context, int exit_code, int error_code, const char *fmt,...)
     
    -

    Detailed Description

    -See the Hx509 error reporting functions for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the Hx509 error reporting functions for description and examples.

    +

    Function Documentation

    + +

    ◆ hx509_clear_error_string()

    +
    - + - - - + +
    void hx509_clear_error_string void hx509_clear_error_string (hx509_context  context  ) hx509_context context)
    -
    -
    - -

    -Resets the error strings the hx509 context.

    -

    Parameters:
    - - +
    +

    Resets the error strings the hx509 context.

    +
    Parameters
    +
    context A hx509 context.
    +
    contextA hx509 context.
    +
    -

    - +

    + +

    ◆ hx509_err()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    void hx509_err void hx509_err (hx509_context  context, hx509_context context,
    int  exit_code, int exit_code,
    int  error_code, int error_code,
    const char *  fmt, const char * fmt,
      ...  ... 
    )
    -
    -
    - -

    -Print error message and fatally exit from error code

    -

    Parameters:
    - - - - - - +
    +

    Print error message and fatally exit from error code

    +
    Parameters
    +
    context A hx509 context.
    exit_code exit() code from process.
    error_code Error code for the reason to exit.
    fmt format string with the exit message.
    ... argument to format string.
    + + + + +
    contextA hx509 context.
    exit_codeexit() code from process.
    error_codeError code for the reason to exit.
    fmtformat string with the exit message.
    ...argument to format string.
    +
    -

    - + + +

    ◆ hx509_free_error_string()

    +
    - + - - - + +
    void hx509_free_error_string void hx509_free_error_string (char *  str  ) char * str)
    -
    -
    - -

    -Free error string returned by hx509_get_error_string().

    -

    Parameters:
    - - +
    +

    Free error string returned by hx509_get_error_string().

    +
    Parameters
    +
    str error string to free.
    +
    strerror string to free.
    +
    -

    - + + +

    ◆ hx509_get_error_string()

    +
    - + - - + + - - + + - +
    char* hx509_get_error_string char* hx509_get_error_string (hx509_context  context, hx509_context context,
    int  error_code int error_code 
    )
    -
    -
    - -

    -Get an error string from context associated with error_code.

    -

    Parameters:
    - - - +
    +

    Get an error string from context associated with error_code.

    +
    Parameters
    +
    context A hx509 context.
    error_code Get error message for this error code.
    + +
    contextA hx509 context.
    error_codeGet error message for this error code.
    +
    -
    Returns:
    error string, free with hx509_free_error_string().
    +
    Returns
    error string, free with hx509_free_error_string().
    -

    - + + +

    ◆ hx509_set_error_string()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    void hx509_set_error_string void hx509_set_error_string (hx509_context  context, hx509_context context,
    int  flags, int flags,
    int  code, int code,
    const char *  fmt, const char * fmt,
      ...  ... 
    )
    -
    -
    - -

    -See hx509_set_error_stringv().

    -

    Parameters:
    - - - + + + +

    ◆ krb5_clear_error_message()

    -
    context A hx509 context.
    flags 
      -
    • HX509_ERROR_APPEND appends the error string to the old messages (code is updated).
    +
    +

    See hx509_set_error_stringv().

    +
    Parameters
    + + + - - - + + +
    contextA hx509 context.
    flags
      +
    • HX509_ERROR_APPEND appends the error string to the old messages (code is updated).
    • +
    code error code related to error message
    fmt error message format
    ... arguments to error message format
    codeerror code related to error message
    fmterror message format
    ...arguments to error message format
    +
    -

    - + + +

    ◆ hx509_set_error_stringv()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    void hx509_set_error_stringv void hx509_set_error_stringv (hx509_context  context, hx509_context context,
    int  flags, int flags,
    int  code, int code,
    const char *  fmt, const char * fmt,
    va_list  ap va_list ap 
    )
    -
    -
    - -

    -Add an error message to the hx509 context.

    -

    Parameters:
    - - - + + + +

    ◆ krb5_abortx()

    - +
    +
    +
    context A hx509 context.
    flags 
      -
    • HX509_ERROR_APPEND appends the error string to the old messages (code is updated).
    +
    +

    Add an error message to the hx509 context.

    +
    Parameters
    + + + - - - + + +
    contextA hx509 context.
    flags
      +
    • HX509_ERROR_APPEND appends the error string to the old messages (code is updated).
    • +
    code error code related to error message
    fmt error message format
    ap arguments to error message format
    codeerror code related to error message
    fmterror message format
    aparguments to error message format
    +
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__keyset.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__keyset.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__keyset.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__keyset.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 certificate store functions +hx509 certificate store functions @@ -8,774 +8,774 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 certificate store functions
    +
    -

    hx509 certificate store functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    int hx509_certs_init (hx509_context context, const char *name, int flags, hx509_lock lock, hx509_certs *certs)
    int hx509_certs_store (hx509_context context, hx509_certs certs, int flags, hx509_lock lock)
    void hx509_certs_free (hx509_certs *certs)
    int hx509_certs_start_seq (hx509_context context, hx509_certs certs, hx509_cursor *cursor)
    int hx509_certs_next_cert (hx509_context context, hx509_certs certs, hx509_cursor cursor, hx509_cert *cert)
    int hx509_certs_end_seq (hx509_context context, hx509_certs certs, hx509_cursor cursor)
    int hx509_certs_iter_f (hx509_context context, hx509_certs certs, int(*func)(hx509_context, void *, hx509_cert), void *ctx)
    int hx509_ci_print_names (hx509_context context, void *ctx, hx509_cert c)
    int hx509_certs_add (hx509_context context, hx509_certs certs, hx509_cert cert)
    int hx509_certs_find (hx509_context context, hx509_certs certs, const hx509_query *q, hx509_cert *r)
    int hx509_certs_filter (hx509_context context, hx509_certs certs, const hx509_query *q, hx509_certs *result)
    int hx509_certs_merge (hx509_context context, hx509_certs to, hx509_certs from)
    int hx509_certs_append (hx509_context context, hx509_certs to, hx509_lock lock, const char *name)
    int hx509_get_one_cert (hx509_context context, hx509_certs certs, hx509_cert *c)
    int hx509_certs_info (hx509_context context, hx509_certs certs, int(*func)(void *, const char *), void *ctx)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int hx509_certs_init (hx509_context context, const char *name, int flags, hx509_lock lock, hx509_certs *certs)
     
    int hx509_certs_store (hx509_context context, hx509_certs certs, int flags, hx509_lock lock)
     
    void hx509_certs_free (hx509_certs *certs)
     
    int hx509_certs_start_seq (hx509_context context, hx509_certs certs, hx509_cursor *cursor)
     
    int hx509_certs_next_cert (hx509_context context, hx509_certs certs, hx509_cursor cursor, hx509_cert *cert)
     
    int hx509_certs_end_seq (hx509_context context, hx509_certs certs, hx509_cursor cursor)
     
    int hx509_certs_iter_f (hx509_context context, hx509_certs certs, int(*func)(hx509_context, void *, hx509_cert), void *ctx)
     
    int hx509_ci_print_names (hx509_context context, void *ctx, hx509_cert c)
     
    int hx509_certs_add (hx509_context context, hx509_certs certs, hx509_cert cert)
     
    int hx509_certs_find (hx509_context context, hx509_certs certs, const hx509_query *q, hx509_cert *r)
     
    int hx509_certs_filter (hx509_context context, hx509_certs certs, const hx509_query *q, hx509_certs *result)
     
    int hx509_certs_merge (hx509_context context, hx509_certs to, hx509_certs from)
     
    int hx509_certs_append (hx509_context context, hx509_certs to, hx509_lock lock, const char *name)
     
    int hx509_get_one_cert (hx509_context context, hx509_certs certs, hx509_cert *c)
     
    int hx509_certs_info (hx509_context context, hx509_certs certs, int(*func)(void *, const char *), void *ctx)
     
    -

    Detailed Description

    -See the Certificate store operations for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the Certificate store operations for description and examples.

    +

    Function Documentation

    + +

    ◆ hx509_certs_add()

    +
    - + - - + + - - + + - - + + - +
    int hx509_certs_add int hx509_certs_add (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    hx509_cert  cert hx509_cert cert 
    )
    -
    -
    - -

    -Add a certificate to the certificiate store.

    -The receiving keyset certs will either increase reference counter of the cert or make a deep copy, either way, the caller needs to free the cert itself.

    -

    Parameters:
    - - - - +
    +

    Add a certificate to the certificiate store.

    +

    The receiving keyset certs will either increase reference counter of the cert or make a deep copy, either way, the caller needs to free the cert itself.

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to add the certificate to.
    cert certificate to add.
    + + +
    contexta hx509 context.
    certscertificate store to add the certificate to.
    certcertificate to add.
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - +

    + +

    ◆ hx509_certs_append()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_certs_append int hx509_certs_append (hx509_context  context, hx509_context context,
    hx509_certs  to, hx509_certs to,
    hx509_lock  lock, hx509_lock lock,
    const char *  name const char * name 
    )
    -
    -
    - -

    -Same a hx509_certs_merge() but use a lock and name to describe the from source.

    -

    Parameters:
    - - - - - +
    +

    Same a hx509_certs_merge() but use a lock and name to describe the from source.

    +
    Parameters
    +
    context a hx509 context.
    to the store to merge into.
    lock a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see Locking and unlocking certificates and encrypted data.).
    name name of the source store
    + + + +
    contexta hx509 context.
    tothe store to merge into.
    locka lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see Locking and unlocking certificates and encrypted data.).
    namename of the source store
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_certs_end_seq()

    +
    - + - - + + - - + + - - + + - +
    int hx509_certs_end_seq int hx509_certs_end_seq (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    hx509_cursor  cursor hx509_cursor cursor 
    )
    -
    -
    - -

    -End the iteration over certificates.

    -

    Parameters:
    - - - - +
    +

    End the iteration over certificates.

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to iterate over.
    cursor cursor that will keep track of progress, freed.
    + + +
    contexta hx509 context.
    certscertificate store to iterate over.
    cursorcursor that will keep track of progress, freed.
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_certs_filter()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_certs_filter int hx509_certs_filter (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    const hx509_query *  q, const hx509_query * q,
    hx509_certs *  result hx509_certs * result 
    )
    -
    -
    - -

    -Filter certificate matching the query.

    -

    Parameters:
    - - - - - +
    +

    Filter certificate matching the query.

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to search.
    q query allocated with hx509 query functions functions.
    result the filtered certificate store, caller must free with hx509_certs_free().
    + + + +
    contexta hx509 context.
    certscertificate store to search.
    qquery allocated with hx509 query functions functions.
    resultthe filtered certificate store, caller must free with hx509_certs_free().
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    +

    Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query.

    -

    -Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query.

    -

    - + + +

    ◆ hx509_certs_find()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_certs_find int hx509_certs_find (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    const hx509_query *  q, const hx509_query * q,
    hx509_cert *  r hx509_cert * r 
    )
    -
    -
    - -

    -Find a certificate matching the query.

    -

    Parameters:
    - - - - - +
    +

    Find a certificate matching the query.

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to search.
    q query allocated with hx509 query functions functions.
    r return certificate (or NULL on error), should be freed with hx509_cert_free().
    + + + +
    contexta hx509 context.
    certscertificate store to search.
    qquery allocated with hx509 query functions functions.
    rreturn certificate (or NULL on error), should be freed with hx509_cert_free().
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    +

    Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query.

    -

    -Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query.

    -

    - + + +

    ◆ hx509_certs_free()

    +
    - + - - - + +
    void hx509_certs_free void hx509_certs_free (hx509_certs *  certs  ) hx509_certs * certs)
    -
    -
    - -

    -Free a certificate store.

    -

    Parameters:
    - - +
    +

    Free a certificate store.

    +
    Parameters
    +
    certs certificate store to free.
    +
    certscertificate store to free.
    +
    -

    - + + +

    ◆ hx509_certs_info()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_certs_info int hx509_certs_info (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    int(*)(void *, const char *)  func, int(*)(void *, const char *) func,
    void *  ctx void * ctx 
    )
    -
    -
    - -

    -Print some info about the certificate store.

    -

    Parameters:
    - - - - - +
    +

    Print some info about the certificate store.

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to print information about.
    func function that will get each line of the information, if NULL is used the data is printed on a FILE descriptor that should be passed in ctx, if ctx also is NULL, stdout is used.
    ctx parameter to func.
    + + + +
    contexta hx509 context.
    certscertificate store to print information about.
    funcfunction that will get each line of the information, if NULL is used the data is printed on a FILE descriptor that should be passed in ctx, if ctx also is NULL, stdout is used.
    ctxparameter to func.
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_certs_init()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_certs_init int hx509_certs_init (hx509_context  context, hx509_context context,
    const char *  name, const char * name,
    int  flags, int flags,
    hx509_lock  lock, hx509_lock lock,
    hx509_certs *  certs hx509_certs * certs 
    )
    -
    -
    - -

    -Open or creates a new hx509 certificate store.

    -

    Parameters:
    - - - - +
    +
    +
    context A hx509 context
    name name of the store, format is TYPE:type-specific-string, if NULL is used the MEMORY store is used.
    flags list of flags:
      -
    • HX509_CERTS_CREATE create a new keystore of the specific TYPE.
    • HX509_CERTS_UNPROTECT_ALL fails if any private key failed to be extracted.
    +
    +

    Open or creates a new hx509 certificate store.

    +
    Parameters
    + + + + - - + +
    contextA hx509 context
    namename of the store, format is TYPE:type-specific-string, if NULL is used the MEMORY store is used.
    flagslist of flags:
      +
    • HX509_CERTS_CREATE create a new keystore of the specific TYPE.
    • +
    • HX509_CERTS_UNPROTECT_ALL fails if any private key failed to be extracted.
    • +
    lock a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see Locking and unlocking certificates and encrypted data.).
    certs return pointer, free with hx509_certs_free().
    locka lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see Locking and unlocking certificates and encrypted data.).
    certsreturn pointer, free with hx509_certs_free().
    +
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_certs_iter_f()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_certs_iter_f int hx509_certs_iter_f (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    int(*)(hx509_context, void *, hx509_cert)  func, int(*)(hx509_context, void *, hx509_cert) func,
    void *  ctx void * ctx 
    )
    -
    -
    - -

    -Iterate over all certificates in a keystore and call an function for each fo them.

    -

    Parameters:
    - - - - - +
    +

    Iterate over all certificates in a keystore and call a function for each of them.

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to iterate over.
    func function to call for each certificate. The function should return non-zero to abort the iteration, that value is passed back to the caller of hx509_certs_iter_f().
    ctx context variable that will passed to the function.
    + + + +
    contexta hx509 context.
    certscertificate store to iterate over.
    funcfunction to call for each certificate. The function should return non-zero to abort the iteration, that value is passed back to the caller of hx509_certs_iter_f().
    ctxcontext variable that will passed to the function.
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_certs_merge()

    +
    - + - - + + - - + + - - + + - +
    int hx509_certs_merge int hx509_certs_merge (hx509_context  context, hx509_context context,
    hx509_certs  to, hx509_certs to,
    hx509_certs  from hx509_certs from 
    )
    -
    -
    - -

    -Merge a certificate store into another. The from store is keep intact.

    -

    Parameters:
    - - - - +
    +

    Merge a certificate store into another. The from store is keep intact.

    +
    Parameters
    +
    context a hx509 context.
    to the store to merge into.
    from the store to copy the object from.
    + + +
    contexta hx509 context.
    tothe store to merge into.
    fromthe store to copy the object from.
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_certs_next_cert()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_certs_next_cert int hx509_certs_next_cert (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    hx509_cursor  cursor, hx509_cursor cursor,
    hx509_cert *  cert hx509_cert * cert 
    )
    -
    -
    - -

    -Get next ceritificate from the certificate keystore pointed out by cursor.

    -

    Parameters:
    - - - - - +
    +

    Get next ceritificate from the certificate keystore pointed out by cursor.

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to iterate over.
    cursor cursor that keeps track of progress.
    cert return certificate next in store, NULL if the store contains no more certificates. Free with hx509_cert_free().
    + + + +
    contexta hx509 context.
    certscertificate store to iterate over.
    cursorcursor that keeps track of progress.
    certreturn certificate next in store, NULL if the store contains no more certificates. Free with hx509_cert_free().
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_certs_start_seq()

    +
    - + - - + + - - + + - - + + - +
    int hx509_certs_start_seq int hx509_certs_start_seq (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    hx509_cursor *  cursor hx509_cursor * cursor 
    )
    -
    -
    - -

    -Start the integration

    -

    Parameters:
    - - - - +
    +

    Start the integration

    +
    Parameters
    +
    context a hx509 context.
    certs certificate store to iterate over
    cursor cursor that will keep track of progress, free with hx509_certs_end_seq().
    + + +
    contexta hx509 context.
    certscertificate store to iterate over
    cursorcursor that will keep track of progress, free with hx509_certs_end_seq().
    +
    -
    Returns:
    Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION is returned if the certificate store doesn't support the iteration operation.
    +
    Returns
    Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION is returned if the certificate store doesn't support the iteration operation.
    -

    - + + +

    ◆ hx509_certs_store()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_certs_store int hx509_certs_store (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    int  flags, int flags,
    hx509_lock  lock hx509_lock lock 
    )
    -
    -
    - -

    -Write the certificate store to stable storage.

    -

    Parameters:
    - - - - - +
    +

    Write the certificate store to stable storage.

    +
    Parameters
    +
    context A hx509 context.
    certs a certificate store to store.
    flags currently unused, use 0.
    lock a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see Locking and unlocking certificates and encrypted data.).
    + + + +
    contextA hx509 context.
    certsa certificate store to store.
    flagscurrently unused, use 0.
    locka lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see Locking and unlocking certificates and encrypted data.).
    +
    -
    Returns:
    Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION if the certificate store doesn't support the store operation.
    +
    Returns
    Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION if the certificate store doesn't support the store operation.
    -

    - + + +

    ◆ hx509_ci_print_names()

    +
    - + - - + + - - + + - - + + - +
    int hx509_ci_print_names int hx509_ci_print_names (hx509_context  context, hx509_context context,
    void *  ctx, void * ctx,
    hx509_cert  c hx509_cert c 
    )
    -
    -
    - -

    -Iterate over all certificates in a keystore and call an function for each fo them.

    -

    Parameters:
    - - - - -
    context a hx509 context.
    certs certificate store to iterate over.
    func function to call for each certificate. The function should return non-zero to abort the iteration, that value is passed back to the caller of hx509_certs_iter().
    -
    -
    Returns:
    Returns an hx509 error code. Function to use to hx509_certs_iter_f() as a function argument, the ctx variable to hx509_certs_iter_f() should be a FILE file descriptor.
    -
    Parameters:
    - - - - +
    +

    Function to use to hx509_certs_iter_f() as a function argument, the ctx variable to hx509_certs_iter_f() should be a FILE file descriptor.

    +
    Parameters
    +
    context a hx509 context.
    ctx used by hx509_certs_iter_f().
    c a certificate
    + + +
    contexta hx509 context.
    ctxused by hx509_certs_iter_f().
    ca certificate
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    - + + +

    ◆ hx509_get_one_cert()

    +
    - + - - + + - - + + - - + + - +
    int hx509_get_one_cert int hx509_get_one_cert (hx509_context  context, hx509_context context,
    hx509_certs  certs, hx509_certs certs,
    hx509_cert *  c hx509_cert * c 
    )
    -
    -
    - -

    -Get one random certificate from the certificate store.

    -

    Parameters:
    - - - - +
    +

    Get one random certificate from the certificate store.

    +
    Parameters
    +
    context a hx509 context.
    certs a certificate store to get the certificate from.
    c return certificate, should be freed with hx509_cert_free().
    + + +
    contexta hx509 context.
    certsa certificate store to get the certificate from.
    creturn certificate, should be freed with hx509_cert_free().
    +
    -
    Returns:
    Returns an hx509 error code.
    +
    Returns
    Returns an hx509 error code.
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__lock.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__lock.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__lock.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__lock.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 lock functions +hx509 lock functions @@ -8,22 +8,25 @@ keyhole logo

    - - + + + + + + +
    +
    +
    hx509 lock functions
    +
    -

    hx509 lock functions

    - -
    -See the Locking and unlocking certificates and encrypted data. for description and examples.
    +

    See the Locking and unlocking certificates and encrypted data. for description and examples.

    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__misc.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__misc.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__misc.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__misc.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 misc functions +hx509 misc functions @@ -8,81 +8,86 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 misc functions
    +
    -

    hx509 misc functions

    - - - - - - +

    Functions

    void hx509_free_octet_string_list (hx509_octet_string_list *list)
    void hx509_xfree (void *ptr)
    + + + + +

    +Functions

    void hx509_free_octet_string_list (hx509_octet_string_list *list)
     
    void hx509_xfree (void *ptr)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ hx509_free_octet_string_list()

    +
    - + - - - + +
    void hx509_free_octet_string_list void hx509_free_octet_string_list (hx509_octet_string_list *  list  ) hx509_octet_string_list * list)
    -
    -
    - -

    -Free a list of octet strings returned by another hx509 library function.

    -

    Parameters:
    - - +
    +

    Free a list of octet strings returned by another hx509 library function.

    +
    Parameters
    +
    list list to be freed.
    +
    listlist to be freed.
    +
    -

    - +

    + +

    ◆ hx509_xfree()

    +
    - + - - - + +
    void hx509_xfree void hx509_xfree (void *  ptr  ) void * ptr)
    -
    -
    - -

    -Free a data element allocated in the library.

    -

    Parameters:
    - - +
    +

    Free a data element allocated in the library.

    +
    Parameters
    +
    ptr data to be freed.
    +
    ptrdata to be freed.
    +
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__name.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__name.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__name.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__name.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 name functions +hx509 name functions @@ -8,463 +8,468 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 name functions
    +
    -

    hx509 name functions

    - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    int hx509_name_to_string (const hx509_name name, char **str)
    int hx509_name_cmp (hx509_name n1, hx509_name n2)
    int hx509_parse_name (hx509_context context, const char *str, hx509_name *name)
    int hx509_name_copy (hx509_context context, const hx509_name from, hx509_name *to)
    int hx509_name_to_Name (const hx509_name from, Name *to)
    int hx509_name_expand (hx509_context context, hx509_name name, hx509_env env)
    void hx509_name_free (hx509_name *name)
    int hx509_unparse_der_name (const void *data, size_t length, char **str)
    int hx509_name_binary (const hx509_name name, heim_octet_string *os)
    int hx509_name_is_null_p (const hx509_name name)
    int hx509_general_name_unparse (GeneralName *name, char **str)
    + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int hx509_name_to_string (const hx509_name name, char **str)
     
    int hx509_name_cmp (hx509_name n1, hx509_name n2)
     
    int hx509_parse_name (hx509_context context, const char *str, hx509_name *name)
     
    int hx509_name_copy (hx509_context context, const hx509_name from, hx509_name *to)
     
    int hx509_name_to_Name (const hx509_name from, Name *to)
     
    int hx509_name_expand (hx509_context context, hx509_name name, hx509_env env)
     
    void hx509_name_free (hx509_name *name)
     
    int hx509_unparse_der_name (const void *data, size_t length, char **str)
     
    int hx509_name_binary (const hx509_name name, heim_octet_string *os)
     
    int hx509_name_is_null_p (const hx509_name name)
     
    int hx509_general_name_unparse (GeneralName *name, char **str)
     
    -

    Detailed Description

    -See the PKIX/X.509 Names for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the PKIX/X.509 Names for description and examples.

    +

    Function Documentation

    + +

    ◆ hx509_general_name_unparse()

    +
    - + - - + + - - + + - +
    int hx509_general_name_unparse int hx509_general_name_unparse (GeneralName *  name, GeneralName * name,
    char **  str char ** str 
    )
    -
    -
    - -

    -Unparse the hx509 name in name into a string.

    -

    Parameters:
    - - - +
    +

    Unparse the hx509 name in name into a string.

    +
    Parameters
    +
    name the name to print
    str an allocated string returns the name in string form
    + +
    namethe name to print
    stran allocated string returns the name in string form
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - +

    + +

    ◆ hx509_name_binary()

    +
    - + - - + + - - + + - +
    int hx509_name_binary int hx509_name_binary (const hx509_name  name, const hx509_name name,
    heim_octet_string *  os heim_octet_string * os 
    )
    -
    -
    - -

    -Convert a hx509_name object to DER encoded name.

    -

    Parameters:
    - - - +
    +

    Convert a hx509_name object to DER encoded name.

    +
    Parameters
    +
    name name to concert
    os data to a DER encoded name, free the resulting octet string with hx509_xfree(os->data).
    + +
    namename to concert
    osdata to a DER encoded name, free the resulting octet string with hx509_xfree(os->data).
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_name_cmp()

    +
    - + - - + + - - + + - +
    int hx509_name_cmp int hx509_name_cmp (hx509_name  n1, hx509_name n1,
    hx509_name  n2 hx509_name n2 
    )
    -
    -
    - -

    -Compare to hx509 name object, useful for sorting.

    -

    Parameters:
    - - - +
    +

    Compare to hx509 name object, useful for sorting.

    +
    Parameters
    +
    n1 a hx509 name object.
    n2 a hx509 name object.
    + +
    n1a hx509 name object.
    n2a hx509 name object.
    +
    -
    Returns:
    0 the objects are the same, returns > 0 is n2 is "larger" then n2, < 0 if n1 is "smaller" then n2.
    +
    Returns
    0 the objects are the same, returns > 0 is n2 is "larger" then n2, < 0 if n1 is "smaller" then n2.
    -

    - + + +

    ◆ hx509_name_copy()

    +
    - + - - + + - - + + - - + + - +
    int hx509_name_copy int hx509_name_copy (hx509_context  context, hx509_context context,
    const hx509_name  from, const hx509_name from,
    hx509_name *  to hx509_name * to 
    )
    -
    -
    - -

    -Copy a hx509 name object.

    -

    Parameters:
    - - - - +
    +

    Copy a hx509 name object.

    +
    Parameters
    +
    context A hx509 cotext.
    from the name to copy from
    to the name to copy to
    + + +
    contextA hx509 cotext.
    fromthe name to copy from
    tothe name to copy to
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_name_expand()

    +
    - + - - + + - - + + - - + + - +
    int hx509_name_expand int hx509_name_expand (hx509_context  context, hx509_context context,
    hx509_name  name, hx509_name name,
    hx509_env  env hx509_env env 
    )
    -
    -
    - -

    -Expands variables in the name using env. Variables are on the form ${name}. Useful when dealing with certificate templates.

    -

    Parameters:
    - - - - +
    +

    Expands variables in the name using env. Variables are on the form ${name}. Useful when dealing with certificate templates.

    +
    Parameters
    +
    context A hx509 cotext.
    name the name to expand.
    env environment variable to expand.
    + + +
    contextA hx509 cotext.
    namethe name to expand.
    envenvironment variable to expand.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    +

    Only UTF8String rdnSequence names are allowed

    -

    -Only UTF8String rdnSequence names are allowed

    -

    - + + +

    ◆ hx509_name_free()

    +
    - + - - - + +
    void hx509_name_free void hx509_name_free (hx509_name *  name  ) hx509_name * name)
    -
    -
    - -

    -Free a hx509 name object, upond return *name will be NULL.

    -

    Parameters:
    - - +
    +

    Free a hx509 name object, upond return *name will be NULL.

    +
    Parameters
    +
    name a hx509 name object to be freed.
    +
    namea hx509 name object to be freed.
    +
    -

    - + + +

    ◆ hx509_name_is_null_p()

    +
    - + - - - + +
    int hx509_name_is_null_p int hx509_name_is_null_p (const hx509_name  name  ) const hx509_name name)
    -
    -
    - -

    -Unparse the hx509 name in name into a string.

    -

    Parameters:
    - - +
    +

    Unparse the hx509 name in name into a string.

    +
    Parameters
    +
    name the name to check if its empty/null.
    +
    namethe name to check if its empty/null.
    +
    -
    Returns:
    non zero if the name is empty/null.
    +
    Returns
    non zero if the name is empty/null.
    -

    - + + +

    ◆ hx509_name_to_Name()

    +
    - + - - + + - - + + - +
    int hx509_name_to_Name int hx509_name_to_Name (const hx509_name  from, const hx509_name from,
    Name *  to Name * to 
    )
    -
    -
    - -

    -Convert a hx509_name into a Name.

    -

    Parameters:
    - - - +
    +

    Convert a hx509_name into a Name.

    +
    Parameters
    +
    from the name to copy from
    to the name to copy to
    + +
    fromthe name to copy from
    tothe name to copy to
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_name_to_string()

    +
    - + - - + + - - + + - +
    int hx509_name_to_string int hx509_name_to_string (const hx509_name  name, const hx509_name name,
    char **  str char ** str 
    )
    -
    -
    - -

    -Convert the hx509 name object into a printable string. The resulting string should be freed with free().

    -

    Parameters:
    - - - +
    +

    Convert the hx509 name object into a printable string. The resulting string should be freed with free().

    +
    Parameters
    +
    name name to print
    str the string to return
    + +
    namename to print
    strthe string to return
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_parse_name()

    +
    - + - - + + - - + + - - + + - +
    int hx509_parse_name int hx509_parse_name (hx509_context  context, hx509_context context,
    const char *  str, const char * str,
    hx509_name *  name hx509_name * name 
    )
    -
    -
    - -

    -Parse a string into a hx509 name object.

    -

    Parameters:
    - - - - +
    +

    Parse a string into a hx509 name object.

    +
    Parameters
    +
    context A hx509 context.
    str a string to parse.
    name the resulting object, NULL in case of error.
    + + +
    contextA hx509 context.
    stra string to parse.
    namethe resulting object, NULL in case of error.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_unparse_der_name()

    +
    - + - - + + - - + + - - + + - +
    int hx509_unparse_der_name int hx509_unparse_der_name (const void *  data, const void * data,
    size_t  length, size_t length,
    char **  str char ** str 
    )
    -
    -
    - -

    -Convert a DER encoded name info a string.

    -

    Parameters:
    - - - - +
    +

    Convert a DER encoded name info a string.

    +
    Parameters
    +
    data data to a DER/BER encoded name
    length length of data
    str the resulting string, is NULL on failure.
    + + +
    datadata to a DER/BER encoded name
    lengthlength of data
    strthe resulting string, is NULL on failure.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__peer.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__peer.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__peer.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__peer.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 certificate selecting functions +hx509 certificate selecting functions @@ -8,230 +8,236 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 certificate selecting functions
    +
    -

    hx509 certificate selecting functions

    - - - - - - - - - - - - +

    Functions

    int hx509_peer_info_alloc (hx509_context context, hx509_peer_info *peer)
    void hx509_peer_info_free (hx509_peer_info peer)
    int hx509_peer_info_set_cert (hx509_peer_info peer, hx509_cert cert)
    int hx509_peer_info_add_cms_alg (hx509_context context, hx509_peer_info peer, const AlgorithmIdentifier *val)
    int hx509_peer_info_set_cms_algs (hx509_context context, hx509_peer_info peer, const AlgorithmIdentifier *val, size_t len)
    + + + + + + + + + + +

    +Functions

    int hx509_peer_info_alloc (hx509_context context, hx509_peer_info *peer)
     
    void hx509_peer_info_free (hx509_peer_info peer)
     
    int hx509_peer_info_set_cert (hx509_peer_info peer, hx509_cert cert)
     
    int hx509_peer_info_add_cms_alg (hx509_context context, hx509_peer_info peer, const AlgorithmIdentifier *val)
     
    int hx509_peer_info_set_cms_algs (hx509_context context, hx509_peer_info peer, const AlgorithmIdentifier *val, size_t len)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ hx509_peer_info_add_cms_alg()

    +
    - + - - + + - - + + - - + + - +
    int hx509_peer_info_add_cms_alg int hx509_peer_info_add_cms_alg (hx509_context  context, hx509_context context,
    hx509_peer_info  peer, hx509_peer_info peer,
    const AlgorithmIdentifier *  val const AlgorithmIdentifier * val 
    )
    -
    -
    - -

    -Add an additional algorithm that the peer supports.

    -

    Parameters:
    - - - - +
    +

    Add an additional algorithm that the peer supports.

    +
    Parameters
    +
    context A hx509 context.
    peer the peer to set the new algorithms for
    val an AlgorithmsIdentier to add
    + + +
    contextA hx509 context.
    peerthe peer to set the new algorithms for
    valan AlgorithmsIdentier to add
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - +

    + +

    ◆ hx509_peer_info_alloc()

    +
    - + - - + + - - + + - +
    int hx509_peer_info_alloc int hx509_peer_info_alloc (hx509_context  context, hx509_context context,
    hx509_peer_info *  peer hx509_peer_info * peer 
    )
    -
    -
    - -

    -Allocate a new peer info structure an init it to default values.

    -

    Parameters:
    - - - +
    +

    Allocate a new peer info structure an init it to default values.

    +
    Parameters
    +
    context A hx509 context.
    peer return an allocated peer, free with hx509_peer_info_free().
    + +
    contextA hx509 context.
    peerreturn an allocated peer, free with hx509_peer_info_free().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_peer_info_free()

    +
    - + - - - + +
    void hx509_peer_info_free void hx509_peer_info_free (hx509_peer_info  peer  ) hx509_peer_info peer)
    -
    -
    - -

    -Free a peer info structure.

    -

    Parameters:
    - - +
    +

    Free a peer info structure.

    +
    Parameters
    +
    peer peer info to be freed.
    +
    peerpeer info to be freed.
    +
    -

    - + + +

    ◆ hx509_peer_info_set_cert()

    +
    - + - - + + - - + + - +
    int hx509_peer_info_set_cert int hx509_peer_info_set_cert (hx509_peer_info  peer, hx509_peer_info peer,
    hx509_cert  cert hx509_cert cert 
    )
    -
    -
    - -

    -Set the certificate that remote peer is using.

    -

    Parameters:
    - - - +
    +

    Set the certificate that remote peer is using.

    +
    Parameters
    +
    peer peer info to update
    cert cerificate of the remote peer.
    + +
    peerpeer info to update
    certcerificate of the remote peer.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_peer_info_set_cms_algs()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_peer_info_set_cms_algs int hx509_peer_info_set_cms_algs (hx509_context  context, hx509_context context,
    hx509_peer_info  peer, hx509_peer_info peer,
    const AlgorithmIdentifier *  val, const AlgorithmIdentifier * val,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Set the algorithms that the peer supports.

    -

    Parameters:
    - - - - - +
    +

    Set the algorithms that the peer supports.

    +
    Parameters
    +
    context A hx509 context.
    peer the peer to set the new algorithms for
    val array of supported AlgorithmsIdentiers
    len length of array val.
    + + + +
    contextA hx509 context.
    peerthe peer to set the new algorithms for
    valarray of supported AlgorithmsIdentiers
    lenlength of array val.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    +


    -Generated on Wed Jan 11 14:07:41 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__print.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__print.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__print.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__print.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 printing functions +hx509 printing functions @@ -8,445 +8,453 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 printing functions
    +
    -

    hx509 printing functions

    - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    void hx509_print_stdout (void *ctx, const char *fmt, va_list va)
    int hx509_oid_sprint (const heim_oid *oid, char **str)
    void hx509_oid_print (const heim_oid *oid, hx509_vprint_func func, void *ctx)
    void hx509_bitstring_print (const heim_bit_string *b, hx509_vprint_func func, void *ctx)
    int hx509_cert_keyusage_print (hx509_context context, hx509_cert c, char **s)
    int hx509_validate_ctx_init (hx509_context context, hx509_validate_ctx *ctx)
    void hx509_validate_ctx_set_print (hx509_validate_ctx ctx, hx509_vprint_func func, void *c)
    void hx509_validate_ctx_add_flags (hx509_validate_ctx ctx, int flags)
    void hx509_validate_ctx_free (hx509_validate_ctx ctx)
    int hx509_validate_cert (hx509_context context, hx509_validate_ctx ctx, hx509_cert cert)
    + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void hx509_print_stdout (void *ctx, const char *fmt, va_list va)
     
    int hx509_oid_sprint (const heim_oid *oid, char **str)
     
    void hx509_oid_print (const heim_oid *oid, hx509_vprint_func func, void *ctx)
     
    void hx509_bitstring_print (const heim_bit_string *b, hx509_vprint_func func, void *ctx)
     
    int hx509_cert_keyusage_print (hx509_context context, hx509_cert c, char **s)
     
    int hx509_validate_ctx_init (hx509_context context, hx509_validate_ctx *ctx)
     
    void hx509_validate_ctx_set_print (hx509_validate_ctx ctx, hx509_vprint_func func, void *c)
     
    void hx509_validate_ctx_add_flags (hx509_validate_ctx ctx, int flags)
     
    void hx509_validate_ctx_free (hx509_validate_ctx ctx)
     
    int hx509_validate_cert (hx509_context context, hx509_validate_ctx ctx, hx509_cert cert)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ hx509_bitstring_print()

    +
    - + - - + + - - + + - - + + - +
    void hx509_bitstring_print void hx509_bitstring_print (const heim_bit_string *  b, const heim_bit_string * b,
    hx509_vprint_func  func, hx509_vprint_func func,
    void *  ctx void * ctx 
    )
    -
    -
    - -

    -Print a bitstring using a hx509_vprint_func function. To print to stdout use hx509_print_stdout().

    -

    Parameters:
    - - - - +
    +

    Print a bitstring using a hx509_vprint_func function. To print to stdout use hx509_print_stdout().

    +
    Parameters
    +
    b bit string to print.
    func hx509_vprint_func to print with.
    ctx context variable to hx509_vprint_func function.
    + + +
    bbit string to print.
    funchx509_vprint_func to print with.
    ctxcontext variable to hx509_vprint_func function.
    +
    -

    - +

    + +

    ◆ hx509_cert_keyusage_print()

    +
    - + - - + + - - + + - - + + - +
    int hx509_cert_keyusage_print int hx509_cert_keyusage_print (hx509_context  context, hx509_context context,
    hx509_cert  c, hx509_cert c,
    char **  s char ** s 
    )
    -
    -
    - -

    -Print certificate usage for a certificate to a string.

    -

    Parameters:
    - - - - +
    +

    Print certificate usage for a certificate to a string.

    +
    Parameters
    +
    context A hx509 context.
    c a certificate print the keyusage for.
    s the return string with the keysage printed in to, free with hx509_xfree().
    + + +
    contextA hx509 context.
    ca certificate print the keyusage for.
    sthe return string with the keysage printed in to, free with hx509_xfree().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_oid_print()

    +
    - + - - + + - - + + - - + + - +
    void hx509_oid_print void hx509_oid_print (const heim_oid *  oid, const heim_oid * oid,
    hx509_vprint_func  func, hx509_vprint_func func,
    void *  ctx void * ctx 
    )
    -
    -
    - -

    -Print a oid using a hx509_vprint_func function. To print to stdout use hx509_print_stdout().

    -

    Parameters:
    - - - - +
    +

    Print a oid using a hx509_vprint_func function. To print to stdout use hx509_print_stdout().

    +
    Parameters
    +
    oid oid to print
    func hx509_vprint_func to print with.
    ctx context variable to hx509_vprint_func function.
    + + +
    oidoid to print
    funchx509_vprint_func to print with.
    ctxcontext variable to hx509_vprint_func function.
    +
    -

    - + + +

    ◆ hx509_oid_sprint()

    +
    - + - - + + - - + + - +
    int hx509_oid_sprint int hx509_oid_sprint (const heim_oid *  oid, const heim_oid * oid,
    char **  str char ** str 
    )
    -
    -
    - -

    -Print a oid to a string.

    -

    Parameters:
    - - - +
    +

    Print a oid to a string.

    +
    Parameters
    +
    oid oid to print
    str allocated string, free with hx509_xfree().
    + +
    oidoid to print
    strallocated string, free with hx509_xfree().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_print_stdout()

    +
    - + - - + + - - + + - - + + - +
    void hx509_print_stdout void hx509_print_stdout (void *  ctx, void * ctx,
    const char *  fmt, const char * fmt,
    va_list  va va_list va 
    )
    -
    -
    - -

    -Helper function to print on stdout for:

    -

    -

    Parameters:
    - - - - +
    +

    Helper function to print on stdout for:

    +
    Parameters
    +
    ctx the context to the print function. If the ctx is NULL, stdout is used.
    fmt the printing format.
    va the argumet list.
    + + +
    ctxthe context to the print function. If the ctx is NULL, stdout is used.
    fmtthe printing format.
    vathe argumet list.
    +
    -

    - + + +

    ◆ hx509_validate_cert()

    +
    - + - - + + - - + + - - + + - +
    int hx509_validate_cert int hx509_validate_cert (hx509_context  context, hx509_context context,
    hx509_validate_ctx  ctx, hx509_validate_ctx ctx,
    hx509_cert  cert hx509_cert cert 
    )
    -
    -
    - -

    -Validate/Print the status of the certificate.

    -

    Parameters:
    - - - - +
    +

    Validate/Print the status of the certificate.

    +
    Parameters
    +
    context A hx509 context.
    ctx A hx509 validation context.
    cert the cerificate to validate/print.
    + + +
    contextA hx509 context.
    ctxA hx509 validation context.
    certthe cerificate to validate/print.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_validate_ctx_add_flags()

    +
    - + - - + + - - + + - +
    void hx509_validate_ctx_add_flags void hx509_validate_ctx_add_flags (hx509_validate_ctx  ctx, hx509_validate_ctx ctx,
    int  flags int flags 
    )
    -
    -
    - -

    -Add flags to control the behaivor of the hx509_validate_cert() function.

    -

    Parameters:
    - - - +
    +

    Add flags to control the behaivor of the hx509_validate_cert() function.

    +
    Parameters
    +
    ctx A hx509 validation context.
    flags flags to add to the validation context.
    + +
    ctxA hx509 validation context.
    flagsflags to add to the validation context.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_validate_ctx_free()

    +
    - + - - - + +
    void hx509_validate_ctx_free void hx509_validate_ctx_free (hx509_validate_ctx  ctx  ) hx509_validate_ctx ctx)
    -
    -
    - -

    -Free an hx509 validate context.

    -

    Parameters:
    - - +
    +

    Free an hx509 validate context.

    +
    Parameters
    +
    ctx the hx509 validate context to free.
    +
    ctxthe hx509 validate context to free.
    +
    -

    - + + +

    ◆ hx509_validate_ctx_init()

    +
    - + - - + + - - + + - +
    int hx509_validate_ctx_init int hx509_validate_ctx_init (hx509_context  context, hx509_context context,
    hx509_validate_ctx *  ctx hx509_validate_ctx * ctx 
    )
    -
    -
    - -

    -Allocate a hx509 validation/printing context.

    -

    Parameters:
    - - - +
    +

    Allocate a hx509 validation/printing context.

    +
    Parameters
    +
    context A hx509 context.
    ctx a new allocated hx509 validation context, free with hx509_validate_ctx_free().
    + +
    contextA hx509 context.
    ctxa new allocated hx509 validation context, free with hx509_validate_ctx_free().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_validate_ctx_set_print()

    +
    - + - - + + - - + + - - + + - +
    void hx509_validate_ctx_set_print void hx509_validate_ctx_set_print (hx509_validate_ctx  ctx, hx509_validate_ctx ctx,
    hx509_vprint_func  func, hx509_vprint_func func,
    void *  c void * c 
    )
    -
    -
    - -

    -Set the printing functions for the validation context.

    -

    Parameters:
    - - - - +
    +

    Set the printing functions for the validation context.

    +
    Parameters
    +
    ctx a hx509 valication context.
    func the printing function to usea.
    c the context variable to the printing function.
    + + +
    ctxa hx509 valication context.
    functhe printing function to usea.
    cthe context variable to the printing function.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    +


    -Generated on Wed Jan 11 14:07:41 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__query.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__query.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__query.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__query.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 query functions +hx509 query functions @@ -8,22 +8,24 @@ keyhole logo

    - - + + + + + + +
    +
    +
    hx509 query functions
    +
    -

    hx509 query functions

    - -
    -
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__revoke.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__revoke.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__revoke.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__revoke.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 revokation checking functions +hx509 revokation checking functions @@ -8,371 +8,378 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 revokation checking functions
    +
    -

    hx509 revokation checking functions

    - - - - - - - - - - - - - - - - +

    Functions

    int hx509_revoke_init (hx509_context context, hx509_revoke_ctx *ctx)
    void hx509_revoke_free (hx509_revoke_ctx *ctx)
    int hx509_revoke_add_ocsp (hx509_context context, hx509_revoke_ctx ctx, const char *path)
    int hx509_revoke_add_crl (hx509_context context, hx509_revoke_ctx ctx, const char *path)
    int hx509_revoke_verify (hx509_context context, hx509_revoke_ctx ctx, hx509_certs certs, time_t now, hx509_cert cert, hx509_cert parent_cert)
    int hx509_ocsp_request (hx509_context context, hx509_certs reqcerts, hx509_certs pool, hx509_cert signer, const AlgorithmIdentifier *digest, heim_octet_string *request, heim_octet_string *nonce)
    int hx509_revoke_ocsp_print (hx509_context context, const char *path, FILE *out)
    + + + + + + + + + + + + + + +

    +Functions

    int hx509_revoke_init (hx509_context context, hx509_revoke_ctx *ctx)
     
    void hx509_revoke_free (hx509_revoke_ctx *ctx)
     
    int hx509_revoke_add_ocsp (hx509_context context, hx509_revoke_ctx ctx, const char *path)
     
    int hx509_revoke_add_crl (hx509_context context, hx509_revoke_ctx ctx, const char *path)
     
    int hx509_revoke_verify (hx509_context context, hx509_revoke_ctx ctx, hx509_certs certs, time_t now, hx509_cert cert, hx509_cert parent_cert)
     
    int hx509_ocsp_request (hx509_context context, hx509_certs reqcerts, hx509_certs pool, hx509_cert signer, const AlgorithmIdentifier *digest, heim_octet_string *request, heim_octet_string *nonce)
     
    int hx509_revoke_ocsp_print (hx509_context context, const char *path, FILE *out)
     
    -

    Detailed Description

    -See the Revocation methods for description and examples.

    Function Documentation

    - +

    Detailed Description

    +

    See the Revocation methods for description and examples.

    +

    Function Documentation

    + +

    ◆ hx509_ocsp_request()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_ocsp_request int hx509_ocsp_request (hx509_context  context, hx509_context context,
    hx509_certs  reqcerts, hx509_certs reqcerts,
    hx509_certs  pool, hx509_certs pool,
    hx509_cert  signer, hx509_cert signer,
    const AlgorithmIdentifier *  digest, const AlgorithmIdentifier * digest,
    heim_octet_string *  request, heim_octet_string * request,
    heim_octet_string *  nonce heim_octet_string * nonce 
    )
    -
    -
    - -

    -Create an OCSP request for a set of certificates.

    -

    Parameters:
    - - - - - - - - +
    +

    Create an OCSP request for a set of certificates.

    +
    Parameters
    +
    context a hx509 context
    reqcerts list of certificates to request ocsp data for
    pool certificate pool to use when signing
    signer certificate to use to sign the request
    digest the signing algorithm in the request, if NULL use the default signature algorithm,
    request the encoded request, free with free_heim_octet_string().
    nonce nonce in the request, free with free_heim_octet_string().
    + + + + + + +
    contexta hx509 context
    reqcertslist of certificates to request ocsp data for
    poolcertificate pool to use when signing
    signercertificate to use to sign the request
    digestthe signing algorithm in the request, if NULL use the default signature algorithm,
    requestthe encoded request, free with free_heim_octet_string().
    noncenonce in the request, free with free_heim_octet_string().
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - +

    + +

    ◆ hx509_revoke_add_crl()

    +
    - + - - + + - - + + - - + + - +
    int hx509_revoke_add_crl int hx509_revoke_add_crl (hx509_context  context, hx509_context context,
    hx509_revoke_ctx  ctx, hx509_revoke_ctx ctx,
    const char *  path const char * path 
    )
    -
    -
    - -

    -Add a CRL file to the revokation context.

    -

    Parameters:
    - - - - +
    +

    Add a CRL file to the revokation context.

    +
    Parameters
    +
    context hx509 context
    ctx hx509 revokation context
    path path to file that is going to be added to the context.
    + + +
    contexthx509 context
    ctxhx509 revokation context
    pathpath to file that is going to be added to the context.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_revoke_add_ocsp()

    +
    - + - - + + - - + + - - + + - +
    int hx509_revoke_add_ocsp int hx509_revoke_add_ocsp (hx509_context  context, hx509_context context,
    hx509_revoke_ctx  ctx, hx509_revoke_ctx ctx,
    const char *  path const char * path 
    )
    -
    -
    - -

    -Add a OCSP file to the revokation context.

    -

    Parameters:
    - - - - +
    +

    Add a OCSP file to the revokation context.

    +
    Parameters
    +
    context hx509 context
    ctx hx509 revokation context
    path path to file that is going to be added to the context.
    + + +
    contexthx509 context
    ctxhx509 revokation context
    pathpath to file that is going to be added to the context.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_revoke_free()

    +
    - + - - - + +
    void hx509_revoke_free void hx509_revoke_free (hx509_revoke_ctx *  ctx  ) hx509_revoke_ctx * ctx)
    -
    -
    - -

    -Free a hx509 revokation context.

    -

    Parameters:
    - - +
    +

    Free a hx509 revokation context.

    +
    Parameters
    +
    ctx context to be freed
    +
    ctxcontext to be freed
    +
    -

    - + + +

    ◆ hx509_revoke_init()

    +
    - + - - + + - - + + - +
    int hx509_revoke_init int hx509_revoke_init (hx509_context  context, hx509_context context,
    hx509_revoke_ctx *  ctx hx509_revoke_ctx * ctx 
    )
    -
    -
    - -

    -Allocate a revokation context. Free with hx509_revoke_free().

    -

    Parameters:
    - - - +
    +

    Allocate a revokation context. Free with hx509_revoke_free().

    +
    Parameters
    +
    context A hx509 context.
    ctx returns a newly allocated revokation context.
    + +
    contextA hx509 context.
    ctxreturns a newly allocated revokation context.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_revoke_ocsp_print()

    +
    - + - - + + - - + + - - + + - +
    int hx509_revoke_ocsp_print int hx509_revoke_ocsp_print (hx509_context  context, hx509_context context,
    const char *  path, const char * path,
    FILE *  out FILE * out 
    )
    -
    -
    - -

    -Print the OCSP reply stored in a file.

    -

    Parameters:
    - - - - +
    +

    Print the OCSP reply stored in a file.

    +
    Parameters
    +
    context a hx509 context
    path path to a file with a OCSP reply
    out the out FILE descriptor to print the reply on
    + + +
    contexta hx509 context
    pathpath to a file with a OCSP reply
    outthe out FILE descriptor to print the reply on
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_revoke_verify()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_revoke_verify int hx509_revoke_verify (hx509_context  context, hx509_context context,
    hx509_revoke_ctx  ctx, hx509_revoke_ctx ctx,
    hx509_certs  certs, hx509_certs certs,
    time_t  now, time_t now,
    hx509_cert  cert, hx509_cert cert,
    hx509_cert  parent_cert hx509_cert parent_cert 
    )
    -
    -
    - -

    -Check that a certificate is not expired according to a revokation context. Also need the parent certificte to the check OCSP parent identifier.

    -

    Parameters:
    - - - - - - - +
    +

    Check that a certificate is not expired according to a revokation context. Also need the parent certificte to the check OCSP parent identifier.

    +
    Parameters
    +
    context hx509 context
    ctx hx509 revokation context
    certs 
    now 
    cert 
    parent_cert 
    + + + + + +
    contexthx509 context
    ctxhx509 revokation context
    certs
    now
    cert
    parent_cert
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__verify.html b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__verify.html --- a/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__verify.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/group__hx509__verify.html @@ -1,6 +1,6 @@ -Heimdalx509library: hx509 verification functions +hx509 verification functions @@ -8,707 +8,713 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    hx509 verification functions
    +
    -

    hx509 verification functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    void hx509_context_set_missing_revoke (hx509_context context, int flag)
    int hx509_verify_init_ctx (hx509_context context, hx509_verify_ctx *ctx)
    void hx509_verify_destroy_ctx (hx509_verify_ctx ctx)
    void hx509_verify_attach_anchors (hx509_verify_ctx ctx, hx509_certs set)
    void hx509_verify_attach_revoke (hx509_verify_ctx ctx, hx509_revoke_ctx revoke_ctx)
    void hx509_verify_set_time (hx509_verify_ctx ctx, time_t t)
    void hx509_verify_set_max_depth (hx509_verify_ctx ctx, unsigned int max_depth)
    void hx509_verify_set_proxy_certificate (hx509_verify_ctx ctx, int boolean)
    void hx509_verify_set_strict_rfc3280_verification (hx509_verify_ctx ctx, int boolean)
    int hx509_verify_path (hx509_context context, hx509_verify_ctx ctx, hx509_cert cert, hx509_certs pool)
    int hx509_ocsp_verify (hx509_context context, time_t now, hx509_cert cert, int flags, const void *data, size_t length, time_t *expiration)
    int hx509_crl_alloc (hx509_context context, hx509_crl *crl)
    int hx509_crl_add_revoked_certs (hx509_context context, hx509_crl crl, hx509_certs certs)
    int hx509_crl_lifetime (hx509_context context, hx509_crl crl, int delta)
    void hx509_crl_free (hx509_context context, hx509_crl *crl)
    int hx509_crl_sign (hx509_context context, hx509_cert signer, hx509_crl crl, heim_octet_string *os)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void hx509_context_set_missing_revoke (hx509_context context, int flag)
     
    int hx509_verify_init_ctx (hx509_context context, hx509_verify_ctx *ctx)
     
    void hx509_verify_destroy_ctx (hx509_verify_ctx ctx)
     
    void hx509_verify_attach_anchors (hx509_verify_ctx ctx, hx509_certs set)
     
    void hx509_verify_attach_revoke (hx509_verify_ctx ctx, hx509_revoke_ctx revoke_ctx)
     
    void hx509_verify_set_time (hx509_verify_ctx ctx, time_t t)
     
    void hx509_verify_set_max_depth (hx509_verify_ctx ctx, unsigned int max_depth)
     
    void hx509_verify_set_proxy_certificate (hx509_verify_ctx ctx, int boolean)
     
    void hx509_verify_set_strict_rfc3280_verification (hx509_verify_ctx ctx, int boolean)
     
    int hx509_verify_path (hx509_context context, hx509_verify_ctx ctx, hx509_cert cert, hx509_certs pool)
     
    int hx509_ocsp_verify (hx509_context context, time_t now, hx509_cert cert, int flags, const void *data, size_t length, time_t *expiration)
     
    int hx509_crl_alloc (hx509_context context, hx509_crl *crl)
     
    int hx509_crl_add_revoked_certs (hx509_context context, hx509_crl crl, hx509_certs certs)
     
    int hx509_crl_lifetime (hx509_context context, hx509_crl crl, int delta)
     
    void hx509_crl_free (hx509_context context, hx509_crl *crl)
     
    int hx509_crl_sign (hx509_context context, hx509_cert signer, hx509_crl crl, heim_octet_string *os)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ hx509_context_set_missing_revoke()

    +
    - + - - + + - - + + - +
    void hx509_context_set_missing_revoke void hx509_context_set_missing_revoke (hx509_context  context, hx509_context context,
    int  flag int flag 
    )
    -
    -
    - -

    -Selects if the hx509_revoke_verify() function is going to require the existans of a revokation method (OCSP, CRL) or not. Note that hx509_verify_path(), hx509_cms_verify_signed(), and other function call hx509_revoke_verify().

    -

    Parameters:
    - - - +
    +

    Selects if the hx509_revoke_verify() function is going to require the existans of a revokation method (OCSP, CRL) or not. Note that hx509_verify_path(), hx509_cms_verify_signed(), and other function call hx509_revoke_verify().

    +
    Parameters
    +
    context hx509 context to change the flag for.
    flag zero, revokation method required, non zero missing revokation method ok
    + +
    contexthx509 context to change the flag for.
    flagzero, revokation method required, non zero missing revokation method ok
    +
    -

    - +

    + +

    ◆ hx509_crl_add_revoked_certs()

    +
    - + - - + + - - + + - - + + - +
    int hx509_crl_add_revoked_certs int hx509_crl_add_revoked_certs (hx509_context  context, hx509_context context,
    hx509_crl  crl, hx509_crl crl,
    hx509_certs  certs hx509_certs certs 
    )
    -
    -
    - -

    -Add revoked certificate to an CRL context.

    -

    Parameters:
    - - - - +
    +

    Add revoked certificate to an CRL context.

    +
    Parameters
    +
    context a hx509 context.
    crl the CRL to add the revoked certificate to.
    certs keyset of certificate to revoke.
    + + +
    contexta hx509 context.
    crlthe CRL to add the revoked certificate to.
    certskeyset of certificate to revoke.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_crl_alloc()

    +
    - + - - + + - - + + - +
    int hx509_crl_alloc int hx509_crl_alloc (hx509_context  context, hx509_context context,
    hx509_crl *  crl hx509_crl * crl 
    )
    -
    -
    - -

    -Create a CRL context. Use hx509_crl_free() to free the CRL context.

    -

    Parameters:
    - - - +
    +

    Create a CRL context. Use hx509_crl_free() to free the CRL context.

    +
    Parameters
    +
    context a hx509 context.
    crl return pointer to a newly allocated CRL context.
    + +
    contexta hx509 context.
    crlreturn pointer to a newly allocated CRL context.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_crl_free()

    +
    - + - - + + - - + + - +
    void hx509_crl_free void hx509_crl_free (hx509_context  context, hx509_context context,
    hx509_crl *  crl hx509_crl * crl 
    )
    -
    -
    - -

    -Free a CRL context.

    -

    Parameters:
    - - - +
    +

    Free a CRL context.

    +
    Parameters
    +
    context a hx509 context.
    crl a CRL context to free.
    + +
    contexta hx509 context.
    crla CRL context to free.
    +
    -

    - + + +

    ◆ hx509_crl_lifetime()

    +
    - + - - + + - - + + - - + + - +
    int hx509_crl_lifetime int hx509_crl_lifetime (hx509_context  context, hx509_context context,
    hx509_crl  crl, hx509_crl crl,
    int  delta int delta 
    )
    -
    -
    - -

    -Set the lifetime of a CRL context.

    -

    Parameters:
    - - - - +
    +

    Set the lifetime of a CRL context.

    +
    Parameters
    +
    context a hx509 context.
    crl a CRL context
    delta delta time the certificate is valid, library adds the current time to this.
    + + +
    contexta hx509 context.
    crla CRL context
    deltadelta time the certificate is valid, library adds the current time to this.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_crl_sign()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_crl_sign int hx509_crl_sign (hx509_context  context, hx509_context context,
    hx509_cert  signer, hx509_cert signer,
    hx509_crl  crl, hx509_crl crl,
    heim_octet_string *  os heim_octet_string * os 
    )
    -
    -
    - -

    -Sign a CRL and return an encode certificate.

    -

    Parameters:
    - - - - - +
    +

    Sign a CRL and return an encode certificate.

    +
    Parameters
    +
    context a hx509 context.
    signer certificate to sign the CRL with
    crl the CRL to sign
    os return the signed and encoded CRL, free with free_heim_octet_string()
    + + + +
    contexta hx509 context.
    signercertificate to sign the CRL with
    crlthe CRL to sign
    osreturn the signed and encoded CRL, free with free_heim_octet_string()
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_ocsp_verify()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int hx509_ocsp_verify int hx509_ocsp_verify (hx509_context  context, hx509_context context,
    time_t  now, time_t now,
    hx509_cert  cert, hx509_cert cert,
    int  flags, int flags,
    const void *  data, const void * data,
    size_t  length, size_t length,
    time_t *  expiration time_t * expiration 
    )
    -
    -
    - -

    -Verify that the certificate is part of the OCSP reply and it's not expired. Doesn't verify signature the OCSP reply or it's done by a authorized sender, that is assumed to be already done.

    -

    Parameters:
    - - - - - - - - +
    +

    Verify that the certificate is part of the OCSP reply and it's not expired. Doesn't verify signature the OCSP reply or it's done by a authorized sender, that is assumed to be already done.

    +
    Parameters
    +
    context a hx509 context
    now the time right now, if 0, use the current time.
    cert the certificate to verify
    flags flags control the behavior
    data pointer to the encode ocsp reply
    length the length of the encode ocsp reply
    expiration return the time the OCSP will expire and need to be rechecked.
    + + + + + + +
    contexta hx509 context
    nowthe time right now, if 0, use the current time.
    certthe certificate to verify
    flagsflags control the behavior
    datapointer to the encode ocsp reply
    lengththe length of the encode ocsp reply
    expirationreturn the time the OCSP will expire and need to be rechecked.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_verify_attach_anchors()

    +
    - + - - + + - - + + - +
    void hx509_verify_attach_anchors void hx509_verify_attach_anchors (hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    hx509_certs  set hx509_certs set 
    )
    -
    -
    - -

    -Set the trust anchors in the verification context, makes an reference to the keyset, so the consumer can free the keyset independent of the destruction of the verification context (ctx). If there already is a keyset attached, it's released.

    -

    Parameters:
    - - - +
    +

    Set the trust anchors in the verification context, makes an reference to the keyset, so the consumer can free the keyset independent of the destruction of the verification context (ctx). If there already is a keyset attached, it's released.

    +
    Parameters
    +
    ctx a verification context
    set a keyset containing the trust anchors.
    + +
    ctxa verification context
    seta keyset containing the trust anchors.
    +
    -

    - + + +

    ◆ hx509_verify_attach_revoke()

    +
    - + - - + + - - + + - +
    void hx509_verify_attach_revoke void hx509_verify_attach_revoke (hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    hx509_revoke_ctx  revoke_ctx hx509_revoke_ctx revoke_ctx 
    )
    -
    -
    - -

    -Attach an revocation context to the verfication context, , makes an reference to the revoke context, so the consumer can free the revoke context independent of the destruction of the verification context. If there is no revoke context, the verification process is NOT going to check any verification status.

    -

    Parameters:
    - - - +
    +

    Attach an revocation context to the verfication context, , makes an reference to the revoke context, so the consumer can free the revoke context independent of the destruction of the verification context. If there is no revoke context, the verification process is NOT going to check any verification status.

    +
    Parameters
    +
    ctx a verification context.
    revoke_ctx a revoke context.
    + +
    ctxa verification context.
    revoke_ctxa revoke context.
    +
    -

    - + + +

    ◆ hx509_verify_destroy_ctx()

    +
    - + - - - + +
    void hx509_verify_destroy_ctx void hx509_verify_destroy_ctx (hx509_verify_ctx  ctx  ) hx509_verify_ctx ctx)
    -
    -
    - -

    -Free an hx509 verification context.

    -

    Parameters:
    - - +
    +

    Free an hx509 verification context.

    +
    Parameters
    +
    ctx the context to be freed.
    +
    ctxthe context to be freed.
    +
    -

    - + + +

    ◆ hx509_verify_init_ctx()

    +
    - + - - + + - - + + - +
    int hx509_verify_init_ctx int hx509_verify_init_ctx (hx509_context  context, hx509_context context,
    hx509_verify_ctx *  ctx hx509_verify_ctx * ctx 
    )
    -
    -
    - -

    -Allocate an verification context that is used fo control the verification process.

    -

    Parameters:
    - - - +
    +

    Allocate an verification context that is used fo control the verification process.

    +
    Parameters
    +
    context A hx509 context.
    ctx returns a pointer to a hx509_verify_ctx object.
    + +
    contextA hx509 context.
    ctxreturns a pointer to a hx509_verify_ctx object.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_verify_path()

    +
    - + - - + + - - + + - - + + - - + + - +
    int hx509_verify_path int hx509_verify_path (hx509_context  context, hx509_context context,
    hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    hx509_cert  cert, hx509_cert cert,
    hx509_certs  pool hx509_certs pool 
    )
    -
    -
    - -

    -Build and verify the path for the certificate to the trust anchor specified in the verify context. The path is constructed from the certificate, the pool and the trust anchors.

    -

    Parameters:
    - - - - - +
    +

    Build and verify the path for the certificate to the trust anchor specified in the verify context. The path is constructed from the certificate, the pool and the trust anchors.

    +
    Parameters
    +
    context A hx509 context.
    ctx A hx509 verification context.
    cert the certificate to build the path from.
    pool A keyset of certificates to build the chain from.
    + + + +
    contextA hx509 context.
    ctxA hx509 verification context.
    certthe certificate to build the path from.
    poolA keyset of certificates to build the chain from.
    +
    -
    Returns:
    An hx509 error code, see hx509_get_error_string().
    +
    Returns
    An hx509 error code, see hx509_get_error_string().
    -

    - + + +

    ◆ hx509_verify_set_max_depth()

    +
    - + - - + + - - + + - +
    void hx509_verify_set_max_depth void hx509_verify_set_max_depth (hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    unsigned int  max_depth unsigned int max_depth 
    )
    -
    -
    - -

    -Set the maximum depth of the certificate chain that the path builder is going to try.

    -

    Parameters:
    - - - +
    +

    Set the maximum depth of the certificate chain that the path builder is going to try.

    +
    Parameters
    +
    ctx a verification context
    max_depth maxium depth of the certificate chain, include trust anchor.
    + +
    ctxa verification context
    max_depthmaxium depth of the certificate chain, include trust anchor.
    +
    -

    - + + +

    ◆ hx509_verify_set_proxy_certificate()

    +
    - + - - + + - - + + - +
    void hx509_verify_set_proxy_certificate void hx509_verify_set_proxy_certificate (hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    int  boolean int boolean 
    )
    -
    -
    - -

    -Allow or deny the use of proxy certificates

    -

    Parameters:
    - - - +
    +

    Allow or deny the use of proxy certificates

    +
    Parameters
    +
    ctx a verification context
    boolean if non zero, allow proxy certificates.
    + +
    ctxa verification context
    booleanif non zero, allow proxy certificates.
    +
    -

    - + + +

    ◆ hx509_verify_set_strict_rfc3280_verification()

    +
    - + - - + + - - + + - +
    void hx509_verify_set_strict_rfc3280_verification void hx509_verify_set_strict_rfc3280_verification (hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    int  boolean int boolean 
    )
    -
    -
    - -

    -Select strict RFC3280 verification of certificiates. This means checking key usage on CA certificates, this will make version 1 certificiates unuseable.

    -

    Parameters:
    - - - +
    +

    Select strict RFC3280 verification of certificiates. This means checking key usage on CA certificates, this will make version 1 certificiates unuseable.

    +
    Parameters
    +
    ctx a verification context
    boolean if non zero, use strict verification.
    + +
    ctxa verification context
    booleanif non zero, use strict verification.
    +
    -

    - + + +

    ◆ hx509_verify_set_time()

    +
    - + - - + + - - + + - +
    void hx509_verify_set_time void hx509_verify_set_time (hx509_verify_ctx  ctx, hx509_verify_ctx ctx,
    time_t  t time_t t 
    )
    -
    -
    - -

    -Set the clock time the the verification process is going to use. Used to check certificate in the past and future time. If not set the current time will be used.

    -

    Parameters:
    - - - +
    +

    Set the clock time the the verification process is going to use. Used to check certificate in the past and future time. If not set the current time will be used.

    +
    Parameters
    +
    ctx a verification context.
    t the time the verifiation is using.
    + +
    ctxa verification context.
    tthe time the verifiation is using.
    +
    -

    +


    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/index.html b/crypto/heimdal/doc/doxyout/hx509/html/index.html --- a/crypto/heimdal/doc/doxyout/hx509/html/index.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/index.html @@ -1,6 +1,6 @@ -Heimdalx509library: Heimdal PKIX/X.509 library +Heimdal PKIX/X.509 library @@ -8,28 +8,42 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Heimdal PKIX/X.509 library
    +
    -

    Heimdal PKIX/X.509 library

    -

    -

    1.5.2

    -Introduction

    -Heimdal libhx509 library is a implementation of the PKIX/X.509 and related protocols.

    -PKIX/X.509 is ...

    -Sections in this manual are:

    -

    -The project web page: http://www.h5l.org/

    +

    +Introduction

    +

    Heimdal libhx509 library is a implementation of the PKIX/X.509 and related protocols.

    +

    PKIX/X.509 is ...

    +

    Sections in this manual are:

    +

    The project web page: http://www.h5l.org/

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/jquery.js b/crypto/heimdal/doc/doxyout/hx509/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hx509/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hx509/html/menu.js b/crypto/heimdal/doc/doxyout/hx509/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hx509/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/hx509/html/menudata.js b/crypto/heimdal/doc/doxyout/hx509/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hx509/html/menudata.js @@ -0,0 +1,28 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Modules",url:"modules.html"}]} diff --git a/crypto/heimdal/doc/doxyout/hx509/html/modules.html b/crypto/heimdal/doc/doxyout/hx509/html/modules.html --- a/crypto/heimdal/doc/doxyout/hx509/html/modules.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/modules.html @@ -1,6 +1,6 @@ -Heimdalx509library: Module Index +Modules @@ -8,37 +8,44 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    Modules
    +
    +
    Here is a list of all modules:
    +

    -Generated on Wed Jan 11 14:07:41 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/nav_f.png b/crypto/heimdal/doc/doxyout/hx509/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM -Heimdalx509library: Hx509 CA functions +Hx509 CA functions @@ -8,19 +8,26 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    Hx509 CA functions
    +
    -

    Hx509 CA functions

    See the library functions here: hx509 CA functions
    +

    See the library functions here: hx509 CA functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_cert.html b/crypto/heimdal/doc/doxyout/hx509/html/page_cert.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_cert.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_cert.html @@ -1,6 +1,6 @@ -Heimdalx509library: The basic certificate +The basic certificate @@ -8,21 +8,28 @@ keyhole logo

    - - + + + + + + +
    +
    +
    The basic certificate
    +
    -

    The basic certificate

    The basic hx509 cerificate object in hx509 is hx509_cert. The hx509_cert object is representing one X509/PKIX certificate and associated attributes; like private key, friendly name, etc.

    -A hx509_cert object is usully found via the keyset interfaces (Certificate store operations), but its also possible to create a certificate directly from a parsed object with hx509_cert_init() and hx509_cert_init_data().

    -See the library functions here: hx509 certificate functions

    +

    The basic hx509 cerificate object in hx509 is hx509_cert. The hx509_cert object is representing one X509/PKIX certificate and associated attributes; like private key, friendly name, etc.

    +

    A hx509_cert object is usully found via the keyset interfaces (Certificate store operations), but its also possible to create a certificate directly from a parsed object with hx509_cert_init() and hx509_cert_init_data().

    +

    See the library functions here: hx509 certificate functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_cms.html b/crypto/heimdal/doc/doxyout/hx509/html/page_cms.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_cms.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_cms.html @@ -1,6 +1,6 @@ -Heimdalx509library: CMS/PKCS7 message functions. +CMS/PKCS7 message functions. @@ -8,23 +8,33 @@ keyhole logo

    - - + + + + + + +
    +
    +
    CMS/PKCS7 message functions.
    +
    -

    CMS/PKCS7 message functions.

    CMS is defined in RFC 3369 and is an continuation of the RSA Labs standard PKCS7. The basic messages in CMS is

    +

    CMS is defined in RFC 3369 and is an continuation of the RSA Labs standard PKCS7. The basic messages in CMS is

      -
    • SignedData Data signed with private key (RSA, DSA, ECDSA) or secret (symmetric) key
    • EnvelopedData Data encrypted with private key (RSA)
    • EncryptedData Data encrypted with secret (symmetric) key.
    • ContentInfo Wrapper structure including type and data.
    -

    -See the library functions here: hx509 CMS/pkcs7 functions

    +
  • SignedData Data signed with private key (RSA, DSA, ECDSA) or secret (symmetric) key
  • +
  • EnvelopedData Data encrypted with private key (RSA)
  • +
  • EncryptedData Data encrypted with secret (symmetric) key.
  • +
  • ContentInfo Wrapper structure including type and data.
  • + +

    See the library functions here: hx509 CMS/pkcs7 functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_env.html b/crypto/heimdal/doc/doxyout/hx509/html/page_env.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_env.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_env.html @@ -1,6 +1,6 @@ -Heimdalx509library: Hx509 enviroment functions +Hx509 environment functions @@ -8,19 +8,26 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Hx509 environment functions
    +
    +

    See the library functions here: hx509 environment functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_error.html b/crypto/heimdal/doc/doxyout/hx509/html/page_error.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_error.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_error.html @@ -1,6 +1,6 @@ -Heimdalx509library: Hx509 error reporting functions +Hx509 error reporting functions @@ -8,19 +8,26 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Hx509 error reporting functions
    +
    +

    See the library functions here: hx509 error functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_keyset.html b/crypto/heimdal/doc/doxyout/hx509/html/page_keyset.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_keyset.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_keyset.html @@ -1,6 +1,6 @@ -Heimdalx509library: Certificate store operations +Certificate store operations @@ -8,22 +8,36 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Certificate store operations
    +
    -

    Certificate store operations

    Type of certificates store:
      -
    • MEMORY In memory based format. Doesnt support storing.
    • FILE FILE supports raw DER certicates and PEM certicates. When PEM is used the file can contain may certificates and match private keys. Support storing the certificates. DER format only supports on certificate and no private key.
    • PEM-FILE Same as FILE, defaulting to PEM encoded certificates.
    • PEM-FILE Same as FILE, defaulting to DER encoded certificates.
    • PKCS11
    • PKCS12
    • DIR
    • KEYCHAIN Apple Mac OS X KeyChain backed keychain object.
    -

    -See the library functions here: hx509 certificate store functions

    +

    Type of certificates store:

      +
    • MEMORY In memory based format. Doesnt support storing.
    • +
    • FILE FILE supports raw DER certicates and PEM certicates. When PEM is used the file can contain may certificates and match private keys. Support storing the certificates. DER format only supports on certificate and no private key.
    • +
    • PEM-FILE Same as FILE, defaulting to PEM encoded certificates.
    • +
    • PEM-FILE Same as FILE, defaulting to DER encoded certificates.
    • +
    • PKCS11
    • +
    • PKCS12
    • +
    • DIR
    • +
    • KEYCHAIN Apple Mac OS X KeyChain backed keychain object.
    • +
    +

    See the library functions here: hx509 certificate store functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_lock.html b/crypto/heimdal/doc/doxyout/hx509/html/page_lock.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_lock.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_lock.html @@ -1,6 +1,6 @@ -Heimdalx509library: Locking and unlocking certificates and encrypted data. +Locking and unlocking certificates and encrypted data. @@ -8,19 +8,26 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Locking and unlocking certificates and encrypted data.
    +
    +

    See the library functions here: hx509 lock functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_name.html b/crypto/heimdal/doc/doxyout/hx509/html/page_name.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_name.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_name.html @@ -1,6 +1,6 @@ -Heimdalx509library: PKIX/X.509 Names +PKIX/X.509 Names @@ -8,25 +8,32 @@ keyhole logo

    - - + + + + + + +
    +
    +
    PKIX/X.509 Names
    +
    -

    PKIX/X.509 Names

    There are several names in PKIX/X.509, GeneralName and Name.

    -A Name consists of an ordered list of Relative Distinguished Names (RDN). Each RDN consists of an unordered list of typed strings. The types are defined by OID and have long and short description. For example id-at-commonName (2.5.4.3) have the long name CommonName and short name CN. The string itself can be of several encoding, UTF8, UTF16, Teltex string, etc. The type limit what encoding should be used.

    -GeneralName is a broader nametype that can contains al kind of stuff like Name, IP addresses, partial Name, etc.

    -Name is mapped into a hx509_name object.

    -Parse and string name into a hx509_name object with hx509_parse_name(), make it back into string representation with hx509_name_to_string().

    -Name string are defined rfc2253, rfc1779 and X.501.

    -See the library functions here: hx509 name functions

    +

    There are several names in PKIX/X.509, GeneralName and Name.

    +

    A Name consists of an ordered list of Relative Distinguished Names (RDN). Each RDN consists of an unordered list of typed strings. The types are defined by OID and have long and short description. For example id-at-commonName (2.5.4.3) have the long name CommonName and short name CN. The string itself can be of several encoding, UTF8, UTF16, Teltex string, etc. The type limit what encoding should be used.

    +

    GeneralName is a broader nametype that can contains al kind of stuff like Name, IP addresses, partial Name, etc.

    +

    Name is mapped into a hx509_name object.

    +

    Parse and string name into a hx509_name object with hx509_parse_name(), make it back into string representation with hx509_name_to_string().

    +

    Name string are defined rfc2253, rfc1779 and X.501.

    +

    See the library functions here: hx509 name functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_peer.html b/crypto/heimdal/doc/doxyout/hx509/html/page_peer.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_peer.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_peer.html @@ -1,6 +1,6 @@ -Heimdalx509library: Hx509 crypto selecting functions +Hx509 crypto selecting functions @@ -8,20 +8,27 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Hx509 crypto selecting functions
    +
    -

    Hx509 crypto selecting functions

    Peer info structures are used togeter with hx509_crypto_select() to select the best avaible crypto algorithm to use.

    -See the library functions here: hx509 certificate selecting functions

    +

    Peer info structures are used togeter with hx509_crypto_select() to select the best avaible crypto algorithm to use.

    +

    See the library functions here: hx509 certificate selecting functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_print.html b/crypto/heimdal/doc/doxyout/hx509/html/page_print.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_print.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_print.html @@ -1,6 +1,6 @@ -Heimdalx509library: Hx509 printing functions +Hx509 printing functions @@ -8,19 +8,26 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Hx509 printing functions
    +
    -

    Hx509 printing functions

    See the library functions here: hx509 printing functions
    +

    See the library functions here: hx509 printing functions

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/page_revoke.html b/crypto/heimdal/doc/doxyout/hx509/html/page_revoke.html --- a/crypto/heimdal/doc/doxyout/hx509/html/page_revoke.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/page_revoke.html @@ -1,6 +1,6 @@ -Heimdalx509library: Revocation methods +Revocation methods @@ -8,21 +8,28 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Revocation methods
    +
    -

    Revocation methods

    There are two revocation method for PKIX/X.509: CRL and OCSP. Revocation is needed if the private key is lost and stolen. Depending on how picky you are, you might want to make revocation for destroyed private keys too (smartcard broken), but that should not be a problem.

    -CRL is a list of certifiates that have expired.

    -OCSP is an online checking method where the requestor sends a list of certificates to the OCSP server to return a signed reply if they are valid or not. Some services sends a OCSP reply as part of the hand-shake to make the revoktion decision simpler/faster for the client.

    +

    There are two revocation method for PKIX/X.509: CRL and OCSP. Revocation is needed if the private key is lost and stolen. Depending on how picky you are, you might want to make revocation for destroyed private keys too (smartcard broken), but that should not be a problem.

    +

    CRL is a list of certifiates that have expired.

    +

    OCSP is an online checking method where the requestor sends a list of certificates to the OCSP server to return a signed reply if they are valid or not. Some services sends a OCSP reply as part of the hand-shake to make the revoktion decision simpler/faster for the client.

    +
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/pages.html b/crypto/heimdal/doc/doxyout/hx509/html/pages.html --- a/crypto/heimdal/doc/doxyout/hx509/html/pages.html +++ b/crypto/heimdal/doc/doxyout/hx509/html/pages.html @@ -1,6 +1,6 @@ -Heimdalx509library: Page Index +Related Pages @@ -8,43 +8,39 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Related Pages
    +
    +
    Here is a list of all related documentation pages:
    +
    -Generated on Wed Jan 11 14:07:40 2012 for Heimdalx509library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:25 for Heimdal x509 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/hx509/html/splitbar.png b/crypto/heimdal/doc/doxyout/hx509/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zc%17D@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@IeJfk6j|89*WoOiV6}4AuZ}83fn> diff --git a/crypto/heimdal/doc/doxyout/hx509/html/tab_b.png b/crypto/heimdal/doc/doxyout/hx509/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 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 literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509.3 @@ -1,8 +1,11 @@ -.TH "hx509 library" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 library \- +hx509 \- hx509 library +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -19,27 +22,28 @@ .SH "Function Documentation" .PP .SS "void hx509_context_free (hx509_context * context)" +Free the context allocated by \fBhx509_context_init()\fP\&. .PP -Free the context allocated by \fBhx509_context_init()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP context to be freed. +\fIcontext\fP context to be freed\&. .RE .PP .SS "int hx509_context_init (hx509_context * context)" +Creates a hx509 context that most functions in the library uses\&. The context is only allowed to be used by one thread at each moment\&. Free the context with \fBhx509_context_free()\fP\&. .PP -Creates a hx509 context that most functions in the library uses. The context is only allowed to be used by one thread at each moment. Free the context with \fBhx509_context_free()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Returns a pointer to new hx509 context. +\fIcontext\fP Returns a pointer to new hx509 context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_ca.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_ca.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_ca.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_ca.3 @@ -1,8 +1,11 @@ -.TH "hx509 CA functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_ca" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 CA functions \- +hx509_ca \- hx509 CA functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -22,7 +25,7 @@ .RI "int \fBhx509_ca_tbs_set_notAfter_lifetime\fP (hx509_context context, hx509_ca_tbs tbs, time_t delta)" .br .ti -1c -.RI "struct units * \fBhx509_ca_tbs_template_units\fP (void)" +.RI "const struct units * \fBhx509_ca_tbs_template_units\fP (void)" .br .ti -1c .RI "int \fBhx509_ca_tbs_set_template\fP (hx509_context context, hx509_ca_tbs tbs, int flags, hx509_cert cert)" @@ -76,6 +79,9 @@ .RI "int \fBhx509_ca_tbs_subject_expand\fP (hx509_context context, hx509_ca_tbs tbs, hx509_env env)" .br .ti -1c +.RI "int \fBhx509_ca_tbs_set_signature_algorithm\fP (hx509_context context, hx509_ca_tbs tbs, const AlgorithmIdentifier *sigalg)" +.br +.ti -1c .RI "int \fBhx509_ca_sign\fP (hx509_context context, hx509_ca_tbs tbs, hx509_cert signer, hx509_cert *certificate)" .br .ti -1c @@ -84,12 +90,11 @@ .in -1c .SH "Detailed Description" .PP -See the \fBHx509 CA functions\fP for description and examples. +See the \fBHx509 CA functions\fP for description and examples\&. .SH "Function Documentation" .PP .SS "int hx509_ca_sign (hx509_context context, hx509_ca_tbs tbs, hx509_cert signer, hx509_cert * certificate)" -.PP -Sign a to-be-signed certificate object with a issuer certificate. +Sign a to-be-signed certificate object with a issuer certificate\&. .PP The caller needs to at least have called the following functions on the to-be-signed certificate object: .IP "\(bu" 2 @@ -100,474 +105,469 @@ \fBhx509_ca_tbs_set_spki()\fP .PP .PP -When done the to-be-signed certificate object should be freed with \fBhx509_ca_tbs_free()\fP. +When done the to-be-signed certificate object should be freed with \fBhx509_ca_tbs_free()\fP\&. .PP -When creating self-signed certificate use \fBhx509_ca_sign_self()\fP instead. +When creating self-signed certificate use \fBhx509_ca_sign_self()\fP instead\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIsigner\fP the CA certificate object to sign with (need private key). +\fIsigner\fP the CA certificate object to sign with (need private key)\&. .br -\fIcertificate\fP return cerificate, free with \fBhx509_cert_free()\fP. +\fIcertificate\fP return cerificate, free with \fBhx509_cert_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_sign_self (hx509_context context, hx509_ca_tbs tbs, hx509_private_key signer, hx509_cert * certificate)" +Work just like \fBhx509_ca_sign()\fP but signs it-self\&. .PP -Work just like \fBhx509_ca_sign()\fP but signs it-self. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIsigner\fP private key to sign with. +\fIsigner\fP private key to sign with\&. .br -\fIcertificate\fP return cerificate, free with \fBhx509_cert_free()\fP. +\fIcertificate\fP return cerificate, free with \fBhx509_cert_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_add_crl_dp_uri (hx509_context context, hx509_ca_tbs tbs, const char * uri, hx509_name issuername)" +Add CRL distribution point URI to the to-be-signed certificate object\&. .PP -Add CRL distribution point URI to the to-be-signed certificate object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIuri\fP uri to the CRL. +\fIuri\fP uri to the CRL\&. .br -\fIissuername\fP name of the issuer. +\fIissuername\fP name of the issuer\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP - -.PP -issuername not supported +issuername not supported .SS "int hx509_ca_tbs_add_eku (hx509_context context, hx509_ca_tbs tbs, const heim_oid * oid)" +An an extended key usage to the to-be-signed certificate object\&. Duplicates will detected and not added\&. .PP -An an extended key usage to the to-be-signed certificate object. Duplicates will detected and not added. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIoid\fP extended key usage to add. +\fIoid\fP extended key usage to add\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_add_san_hostname (hx509_context context, hx509_ca_tbs tbs, const char * dnsname)" +Add a Subject Alternative Name hostname to to-be-signed certificate object\&. A domain match starts with \&., an exact match does not\&. .PP -Add a Subject Alternative Name hostname to to-be-signed certificate object. A domain match starts with ., an exact match does not. +Example of a an domain match: \&.domain\&.se matches the hostname host\&.domain\&.se\&. .PP -Example of a an domain match: .domain.se matches the hostname host.domain.se. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIdnsname\fP a hostame. +\fIdnsname\fP a hostame\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_add_san_jid (hx509_context context, hx509_ca_tbs tbs, const char * jid)" +Add a Jabber/XMPP jid Subject Alternative Name to the to-be-signed certificate object\&. The jid is an UTF8 string\&. .PP -Add a Jabber/XMPP jid Subject Alternative Name to the to-be-signed certificate object. The jid is an UTF8 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIjid\fP string of an a jabber id in UTF8. +\fIjid\fP string of an a jabber id in UTF8\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_add_san_ms_upn (hx509_context context, hx509_ca_tbs tbs, const char * principal)" +Add Microsoft UPN Subject Alternative Name to the to-be-signed certificate object\&. The principal string is a UTF8 string\&. .PP -Add Microsoft UPN Subject Alternative Name to the to-be-signed certificate object. The principal string is a UTF8 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIprincipal\fP Microsoft UPN string. +\fIprincipal\fP Microsoft UPN string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_add_san_otherName (hx509_context context, hx509_ca_tbs tbs, const heim_oid * oid, const heim_octet_string * os)" +Add Subject Alternative Name otherName to the to-be-signed certificate object\&. .PP -Add Subject Alternative Name otherName to the to-be-signed certificate object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIoid\fP the oid of the OtherName. +\fIoid\fP the oid of the OtherName\&. .br -\fIos\fP data in the other name. +\fIos\fP data in the other name\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_add_san_pkinit (hx509_context context, hx509_ca_tbs tbs, const char * principal)" +Add Kerberos Subject Alternative Name to the to-be-signed certificate object\&. The principal string is a UTF8 string\&. .PP -Add Kerberos Subject Alternative Name to the to-be-signed certificate object. The principal string is a UTF8 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIprincipal\fP Kerberos principal to add to the certificate. +\fIprincipal\fP Kerberos principal to add to the certificate\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_add_san_rfc822name (hx509_context context, hx509_ca_tbs tbs, const char * rfc822Name)" +Add a Subject Alternative Name rfc822 (email address) to to-be-signed certificate object\&. .PP -Add a Subject Alternative Name rfc822 (email address) to to-be-signed certificate object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIrfc822Name\fP a string to a email address. +\fIrfc822Name\fP a string to a email address\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_ca_tbs_free (hx509_ca_tbs * tbs)" +Free an To Be Signed object\&. .PP -Free an To Be Signed object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fItbs\fP object to free. +\fItbs\fP object to free\&. .RE .PP .SS "int hx509_ca_tbs_init (hx509_context context, hx509_ca_tbs * tbs)" +Allocate an to-be-signed certificate object that will be converted into an certificate\&. .PP -Allocate an to-be-signed certificate object that will be converted into an certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP returned to-be-signed certicate object, free with \fBhx509_ca_tbs_free()\fP. +\fItbs\fP returned to-be-signed certicate object, free with \fBhx509_ca_tbs_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_ca (hx509_context context, hx509_ca_tbs tbs, int pathLenConstraint)" +Make the to-be-signed certificate object a CA certificate\&. If the pathLenConstraint is negative path length constraint is used\&. .PP -Make the to-be-signed certificate object a CA certificate. If the pathLenConstraint is negative path length constraint is used. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIpathLenConstraint\fP path length constraint, negative, no constraint. +\fIpathLenConstraint\fP path length constraint, negative, no constraint\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_domaincontroller (hx509_context context, hx509_ca_tbs tbs)" +Make the to-be-signed certificate object a windows domain controller certificate\&. .PP -Make the to-be-signed certificate object a windows domain controller certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_notAfter (hx509_context context, hx509_ca_tbs tbs, time_t t)" +Set the absolute time when the certificate is valid to\&. .PP -Set the absolute time when the certificate is valid to. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br \fIt\fP time when the certificate will expire .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_notAfter_lifetime (hx509_context context, hx509_ca_tbs tbs, time_t delta)" +Set the relative time when the certificiate is going to expire\&. .PP -Set the relative time when the certificiate is going to expire. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIdelta\fP seconds to the certificate is going to expire. +\fIdelta\fP seconds to the certificate is going to expire\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_notBefore (hx509_context context, hx509_ca_tbs tbs, time_t t)" +Set the absolute time when the certificate is valid from\&. If not set the current time will be used\&. .PP -Set the absolute time when the certificate is valid from. If not set the current time will be used. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br \fIt\fP time the certificated will start to be valid .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_proxy (hx509_context context, hx509_ca_tbs tbs, int pathLenConstraint)" +Make the to-be-signed certificate object a proxy certificate\&. If the pathLenConstraint is negative path length constraint is used\&. .PP -Make the to-be-signed certificate object a proxy certificate. If the pathLenConstraint is negative path length constraint is used. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIpathLenConstraint\fP path length constraint, negative, no constraint. +\fIpathLenConstraint\fP path length constraint, negative, no constraint\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_serialnumber (hx509_context context, hx509_ca_tbs tbs, const heim_integer * serialNumber)" +Set the serial number to use for to-be-signed certificate object\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A hx509 context\&. +.br +\fItbs\fP object to be signed\&. +.br +\fIserialNumber\fP serial number to use for the to-be-signed certificate object\&. +.RE +.PP +\fBReturns\fP +.RS 4 +An hx509 error code, see \fBhx509_get_error_string()\fP\&. +.RE .PP -Set the serial number to use for to-be-signed certificate object. + +.SS "int hx509_ca_tbs_set_signature_algorithm (hx509_context context, hx509_ca_tbs tbs, const AlgorithmIdentifier * sigalg)" +Set signature algorithm on the to be signed certificate .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIserialNumber\fP serial number to use for the to-be-signed certificate object. +\fIsigalg\fP signature algorithm to use .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_spki (hx509_context context, hx509_ca_tbs tbs, const SubjectPublicKeyInfo * spki)" +Set the subject public key info (SPKI) in the to-be-signed certificate object\&. SPKI is the public key and key related parameters in the certificate\&. .PP -Set the subject public key info (SPKI) in the to-be-signed certificate object. SPKI is the public key and key related parameters in the certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIspki\fP subject public key info to use for the to-be-signed certificate object. +\fIspki\fP subject public key info to use for the to-be-signed certificate object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_subject (hx509_context context, hx509_ca_tbs tbs, hx509_name subject)" +Set the subject name of a to-be-signed certificate object\&. .PP -Set the subject name of a to-be-signed certificate object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIsubject\fP the name to set a subject. +\fIsubject\fP the name to set a subject\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_template (hx509_context context, hx509_ca_tbs tbs, int flags, hx509_cert cert)" +Initialize the to-be-signed certificate object from a template certifiate\&. .PP -Initialize the to-be-signed certificate object from a template certifiate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIflags\fP bit field selecting what to copy from the template certifiate. +\fIflags\fP bit field selecting what to copy from the template certifiate\&. .br -\fIcert\fP template certificate. +\fIcert\fP template certificate\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_set_unique (hx509_context context, hx509_ca_tbs tbs, const heim_bit_string * subjectUniqueID, const heim_bit_string * issuerUniqueID)" -.PP Set the issuerUniqueID and subjectUniqueID .PP -These are only supposed to be used considered with version 2 certificates, replaced by the two extensions SubjectKeyIdentifier and IssuerKeyIdentifier. This function is to allow application using legacy protocol to issue them. +These are only supposed to be used considered with version 2 certificates, replaced by the two extensions SubjectKeyIdentifier and IssuerKeyIdentifier\&. This function is to allow application using legacy protocol to issue them\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br \fIissuerUniqueID\fP to be set .br \fIsubjectUniqueID\fP to be set .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ca_tbs_subject_expand (hx509_context context, hx509_ca_tbs tbs, hx509_env env)" +Expand the the subject name in the to-be-signed certificate object using \fBhx509_name_expand()\fP\&. .PP -Expand the the subject name in the to-be-signed certificate object using \fBhx509_name_expand()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fItbs\fP object to be signed. +\fItbs\fP object to be signed\&. .br -\fIenv\fP environment variable to expand variables in the subject name, see hx509_env_init(). +\fIenv\fP environment variable to expand variables in the subject name, see hx509_env_init()\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP -.SS "struct units* hx509_ca_tbs_template_units (void)\fC [read]\fP" +.SS "const struct units* hx509_ca_tbs_template_units (void)" +Make of template units, use to build flags argument to \fBhx509_ca_tbs_set_template()\fP with parse_units()\&. .PP -Make of template units, use to build flags argument to \fBhx509_ca_tbs_set_template()\fP with parse_units(). -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -an units structure. +an units structure\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_ca_tbs_set_signature_algorithm.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_ca_tbs_set_signature_algorithm.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_ca_tbs_set_signature_algorithm.3 @@ -0,0 +1 @@ +.so man3/hx509_ca.3 diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cert.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cert.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cert.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cert.3 @@ -1,16 +1,19 @@ -.TH "hx509 certificate functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_cert" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 certificate functions \- +hx509_cert \- hx509 certificate functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c .ti -1c -.RI "int \fBhx509_cert_init\fP (hx509_context context, const Certificate *c, hx509_cert *cert)" +.RI "hx509_cert \fBhx509_cert_init\fP (hx509_context context, const Certificate *c, heim_error_t *error)" .br .ti -1c -.RI "int \fBhx509_cert_init_data\fP (hx509_context context, const void *ptr, size_t len, hx509_cert *cert)" +.RI "hx509_cert \fBhx509_cert_init_data\fP (hx509_context context, const void *ptr, size_t len, heim_error_t *error)" .br .ti -1c .RI "void \fBhx509_cert_free\fP (hx509_cert cert)" @@ -108,172 +111,162 @@ .in -1c .SH "Detailed Description" .PP -See the \fBThe basic certificate\fP for description and examples. +See the \fBThe basic certificate\fP for description and examples\&. .SH "Function Documentation" .PP .SS "int hx509_cert_binary (hx509_context context, hx509_cert c, heim_octet_string * os)" +Encodes the hx509 certificate as a DER encode binary\&. .PP -Encodes the hx509 certificate as a DER encode binary. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIc\fP the certificate to encode. +\fIc\fP the certificate to encode\&. .br -\fIos\fP the encode certificate, set to NULL, 0 on case of error. Free the os->data with \fBhx509_xfree()\fP. +\fIos\fP the encode certificate, set to NULL, 0 on case of error\&. Free the os->data with \fBhx509_xfree()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_cert_check_eku (hx509_context context, hx509_cert cert, const heim_oid * eku, int allow_any_eku)" +Check the extended key usage on the hx509 certificate\&. .PP -Check the extended key usage on the hx509 certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIcert\fP A hx509 context. +\fIcert\fP A hx509 context\&. .br \fIeku\fP the EKU to check for .br -\fIallow_any_eku\fP if the any EKU is set, allow that to be a substitute. +\fIallow_any_eku\fP if the any EKU is set, allow that to be a substitute\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_cert_cmp (hx509_cert p, hx509_cert q)" +Compare to hx509 certificate object, useful for sorting\&. .PP -Compare to hx509 certificate object, useful for sorting. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .br -\fIq\fP a hx509 certificate object. +\fIq\fP a hx509 certificate object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 the objects are the same, returns > 0 is p is 'larger' then q, < 0 if p is 'smaller' then q. +0 the objects are the same, returns > 0 is p is 'larger' then q, < 0 if p is 'smaller' then q\&. .RE .PP .SS "int hx509_cert_find_subjectAltName_otherName (hx509_context context, hx509_cert cert, const heim_oid * oid, hx509_octet_string_list * list)" +Return a list of subjectAltNames specified by oid in the certificate\&. On error the .PP -Return a list of subjectAltNames specified by oid in the certificate. On error the +The returned list of octet string should be freed with \fBhx509_free_octet_string_list()\fP\&. .PP -The returned list of octet string should be freed with \fBhx509_free_octet_string_list()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIcert\fP a hx509 certificate object. +\fIcert\fP a hx509 certificate object\&. .br -\fIoid\fP an oid to for SubjectAltName. +\fIoid\fP an oid to for SubjectAltName\&. .br -\fIlist\fP list of matching SubjectAltName. +\fIlist\fP list of matching SubjectAltName\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_cert_free (hx509_cert cert)" +Free reference to the hx509 certificate object, if the refcounter reaches 0, the object if freed\&. Its allowed to pass in NULL\&. .PP -Free reference to the hx509 certificate object, if the refcounter reaches 0, the object if freed. Its allowed to pass in NULL. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcert\fP the cert to free. +\fIcert\fP the cert to free\&. .RE .PP .SS "hx509_cert_attribute hx509_cert_get_attribute (hx509_cert cert, const heim_oid * oid)" +Get an external attribute for the certificate, examples are friendly name and id\&. .PP -Get an external attribute for the certificate, examples are friendly name and id. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcert\fP hx509 certificate object to search .br -\fIoid\fP an oid to search for. +\fIoid\fP an oid to search for\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -an hx509_cert_attribute, only valid as long as the certificate is referenced. +an hx509_cert_attribute, only valid as long as the certificate is referenced\&. .RE .PP .SS "int hx509_cert_get_base_subject (hx509_context context, hx509_cert c, hx509_name * name)" +Return the name of the base subject of the hx509 certificate\&. If the certiicate is a verified proxy certificate, the this function return the base certificate (root of the proxy chain)\&. If the proxy certificate is not verified with the base certificate HX509_PROXY_CERTIFICATE_NOT_CANONICALIZED is returned\&. .PP -Return the name of the base subject of the hx509 certificate. If the certiicate is a verified proxy certificate, the this function return the base certificate (root of the proxy chain). If the proxy certificate is not verified with the base certificate HX509_PROXY_CERTIFICATE_NOT_CANONICALIZED is returned. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIc\fP a hx509 certificate object. +\fIc\fP a hx509 certificate object\&. .br -\fIname\fP a pointer to a hx509 name, should be freed by \fBhx509_name_free()\fP. See also \fBhx509_cert_get_subject()\fP. +\fIname\fP a pointer to a hx509 name, should be freed by \fBhx509_name_free()\fP\&. See also \fBhx509_cert_get_subject()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "const char* hx509_cert_get_friendly_name (hx509_cert cert)" +Get friendly name of the certificate\&. .PP -Get friendly name of the certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcert\fP cert to get the friendly name from. +\fIcert\fP cert to get the friendly name from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -an friendly name or NULL if there is. The friendly name is only valid as long as the certificate is referenced. +an friendly name or NULL if there is\&. The friendly name is only valid as long as the certificate is referenced\&. .RE .PP .SS "int hx509_cert_get_issuer (hx509_cert p, hx509_name * name)" +Return the name of the issuer of the hx509 certificate\&. .PP -Return the name of the issuer of the hx509 certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .br -\fIname\fP a pointer to a hx509 name, should be freed by \fBhx509_name_free()\fP. +\fIname\fP a pointer to a hx509 name, should be freed by \fBhx509_name_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_cert_get_issuer_unique_id (hx509_context context, hx509_cert p, heim_bit_string * issuer)" -.PP Get a copy of the Issuer Unique ID .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a hx509_context .br @@ -282,119 +275,112 @@ \fIissuer\fP the issuer id returned, free with der_free_bit_string() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a issuerUniqueID +An hx509 error code, see \fBhx509_get_error_string()\fP\&. The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a issuerUniqueID .RE .PP .SS "time_t hx509_cert_get_notAfter (hx509_cert p)" +Get notAfter time of the certificate\&. .PP -Get notAfter time of the certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -return not after time. +return not after time\&. .RE .PP .SS "time_t hx509_cert_get_notBefore (hx509_cert p)" +Get notBefore time of the certificate\&. .PP -Get notBefore time of the certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 return not before time .RE .PP .SS "int hx509_cert_get_serialnumber (hx509_cert p, heim_integer * i)" +Get serial number of the certificate\&. .PP -Get serial number of the certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .br -\fIi\fP serial number, should be freed ith der_free_heim_integer(). +\fIi\fP serial number, should be freed ith der_free_heim_integer()\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_cert_get_SPKI (hx509_context context, hx509_cert p, SubjectPublicKeyInfo * spki)" +Get the SubjectPublicKeyInfo structure from the hx509 certificate\&. .PP -Get the SubjectPublicKeyInfo structure from the hx509 certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .br -\fIspki\fP SubjectPublicKeyInfo, should be freed with free_SubjectPublicKeyInfo(). +\fIspki\fP SubjectPublicKeyInfo, should be freed with free_SubjectPublicKeyInfo()\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_cert_get_SPKI_AlgorithmIdentifier (hx509_context context, hx509_cert p, AlgorithmIdentifier * alg)" +Get the AlgorithmIdentifier from the hx509 certificate\&. .PP -Get the AlgorithmIdentifier from the hx509 certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .br -\fIalg\fP AlgorithmIdentifier, should be freed with free_AlgorithmIdentifier(). The algorithmidentifier is typicly rsaEncryption, or id-ecPublicKey, or some other public key mechanism. +\fIalg\fP AlgorithmIdentifier, should be freed with free_AlgorithmIdentifier()\&. The algorithmidentifier is typicly rsaEncryption, or id-ecPublicKey, or some other public key mechanism\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_cert_get_subject (hx509_cert p, hx509_name * name)" +Return the name of the subject of the hx509 certificate\&. .PP -Return the name of the subject of the hx509 certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP a hx509 certificate object. +\fIp\fP a hx509 certificate object\&. .br -\fIname\fP a pointer to a hx509 name, should be freed by \fBhx509_name_free()\fP. See also \fBhx509_cert_get_base_subject()\fP. +\fIname\fP a pointer to a hx509 name, should be freed by \fBhx509_name_free()\fP\&. See also \fBhx509_cert_get_base_subject()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_cert_get_subject_unique_id (hx509_context context, hx509_cert p, heim_bit_string * subject)" -.PP Get a copy of the Subect Unique ID .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a hx509_context .br @@ -403,91 +389,86 @@ \fIsubject\fP the subject id returned, free with der_free_bit_string() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a subjectUniqueID +An hx509 error code, see \fBhx509_get_error_string()\fP\&. The error code HX509_EXTENSION_NOT_FOUND is returned if the certificate doesn't have a subjectUniqueID .RE .PP -.SS "int hx509_cert_init (hx509_context context, const Certificate * c, hx509_cert * cert)" -.PP -Allocate and init an hx509 certificate object from the decoded certificate `c´. +.SS "hx509_cert hx509_cert_init (hx509_context context, const Certificate * c, heim_error_t * error)" +Allocate and init an hx509 certificate object from the decoded certificate `c´\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIc\fP .br -\fIcert\fP +\fIerror\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 certificate .RE .PP -.SS "int hx509_cert_init_data (hx509_context context, const void * ptr, size_t len, hx509_cert * cert)" -.PP -Just like \fBhx509_cert_init()\fP, but instead of a decode certificate takes an pointer and length to a memory region that contains a DER/BER encoded certificate. +.SS "hx509_cert hx509_cert_init_data (hx509_context context, const void * ptr, size_t len, heim_error_t * error)" +Just like \fBhx509_cert_init()\fP, but instead of a decode certificate takes an pointer and length to a memory region that contains a DER/BER encoded certificate\&. .PP -If the memory region doesn't contain just the certificate and nothing more the function will fail with HX509_EXTRA_DATA_AFTER_STRUCTURE. +If the memory region doesn't contain just the certificate and nothing more the function will fail with HX509_EXTRA_DATA_AFTER_STRUCTURE\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIptr\fP pointer to memory region containing encoded certificate. +\fIptr\fP pointer to memory region containing encoded certificate\&. .br -\fIlen\fP length of memory region. +\fIlen\fP length of memory region\&. .br -\fIcert\fP a return pointer to a hx509 certificate object, will contain NULL on error. +\fIerror\fP possibly returns an error .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 certificate .RE .PP .SS "hx509_cert hx509_cert_ref (hx509_cert cert)" +Add a reference to a hx509 certificate object\&. .PP -Add a reference to a hx509 certificate object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcert\fP a pointer to an hx509 certificate object. +\fIcert\fP a pointer to an hx509 certificate object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the same object as is passed in. +the same object as is passed in\&. .RE .PP .SS "int hx509_cert_set_friendly_name (hx509_cert cert, const char * name)" +Set the friendly name on the certificate\&. .PP -Set the friendly name on the certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcert\fP The certificate to set the friendly name on .br -\fIname\fP Friendly name. +\fIname\fP Friendly name\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_print_cert (hx509_context context, hx509_cert cert, FILE * out)" -.PP Print a simple representation of a certificate .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A hx509 context, can be NULL .br @@ -496,180 +477,169 @@ \fIout\fP the stdio output stream, if NULL, stdout is used .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 An hx509 error code .RE .PP .SS "int hx509_query_alloc (hx509_context context, hx509_query ** q)" +Allocate an query controller\&. Free using \fBhx509_query_free()\fP\&. .PP -Allocate an query controller. Free using \fBhx509_query_free()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIq\fP return pointer to a hx509_query. +\fIq\fP return pointer to a hx509_query\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_query_free (hx509_context context, hx509_query * q)" +Free the query controller\&. .PP -Free the query controller. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIq\fP a pointer to the query controller. +\fIq\fP a pointer to the query controller\&. .RE .PP .SS "int hx509_query_match_cmp_func (hx509_query * q, int(*)(hx509_context, hx509_cert, void *) func, void * ctx)" +Set the query controller to match using a specific match function\&. .PP -Set the query controller to match using a specific match function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIq\fP a hx509 query controller. +\fIq\fP a hx509 query controller\&. .br -\fIfunc\fP function to use for matching, if the argument is NULL, the match function is removed. +\fIfunc\fP function to use for matching, if the argument is NULL, the match function is removed\&. .br -\fIctx\fP context passed to the function. +\fIctx\fP context passed to the function\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_query_match_eku (hx509_query * q, const heim_oid * eku)" +Set the query controller to require an one specific EKU (extended key usage)\&. Any previous EKU matching is overwitten\&. If NULL is passed in as the eku, the EKU requirement is reset\&. .PP -Set the query controller to require an one specific EKU (extended key usage). Any previous EKU matching is overwitten. If NULL is passed in as the eku, the EKU requirement is reset. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIq\fP a hx509 query controller. +\fIq\fP a hx509 query controller\&. .br -\fIeku\fP an EKU to match on. +\fIeku\fP an EKU to match on\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_query_match_friendly_name (hx509_query * q, const char * name)" -.PP Set the query controller to match on a friendly name .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIq\fP a hx509 query controller. +\fIq\fP a hx509 query controller\&. .br \fIname\fP a friendly name to match on .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_query_match_issuer_serial (hx509_query * q, const Name * issuer, const heim_integer * serialNumber)" +Set the issuer and serial number of match in the query controller\&. The function make copies of the isser and serial number\&. .PP -Set the issuer and serial number of match in the query controller. The function make copies of the isser and serial number. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIq\fP a hx509 query controller .br \fIissuer\fP issuer to search for .br -\fIserialNumber\fP the serialNumber of the issuer. +\fIserialNumber\fP the serialNumber of the issuer\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_query_match_option (hx509_query * q, hx509_query_option option)" +Set match options for the hx509 query controller\&. .PP -Set match options for the hx509 query controller. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIq\fP query controller. +\fIq\fP query controller\&. .br -\fIoption\fP options to control the query controller. +\fIoption\fP options to control the query controller\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_query_statistic_file (hx509_context context, const char * fn)" +Set a statistic file for the query statistics\&. .PP -Set a statistic file for the query statistics. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIfn\fP statistics file name .RE .PP .SS "void hx509_query_unparse_stats (hx509_context context, int printtype, FILE * out)" +Unparse the statistics file and print the result on a FILE descriptor\&. .PP -Unparse the statistics file and print the result on a FILE descriptor. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIprinttype\fP tyep to print .br -\fIout\fP the FILE to write the data on. +\fIout\fP the FILE to write the data on\&. .RE .PP .SS "void hx509_verify_ctx_f_allow_default_trustanchors (hx509_verify_ctx ctx, int boolean)" +Allow using the operating system builtin trust anchors if no other trust anchors are configured\&. .PP -Allow using the operating system builtin trust anchors if no other trust anchors are configured. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP a verification context .br -\fIboolean\fP if non zero, useing the operating systems builtin trust anchors. +\fIboolean\fP if non zero, useing the operating systems builtin trust anchors\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_verify_hostname (hx509_context context, const hx509_cert cert, int flags, hx509_hostname_type type, const char * hostname, const struct sockaddr * sa, int sa_size)" +Verify that the certificate is allowed to be used for the hostname and address\&. .PP -Verify that the certificate is allowed to be used for the hostname and address. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIcert\fP the certificate to match with .br @@ -680,9 +650,9 @@ .br \fItype\fP type of hostname: .IP "\(bu" 2 -HX509_HN_HOSTNAME for plain hostname. +HX509_HN_HOSTNAME for plain hostname\&. .IP "\(bu" 2 -HX509_HN_DNSSRV for DNS SRV names. +HX509_HN_DNSSRV for DNS SRV names\&. .PP .br \fIhostname\fP the hostname to check @@ -692,9 +662,12 @@ \fIsa_size\fP length of address .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cms.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cms.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cms.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_cms.3 @@ -1,8 +1,11 @@ -.TH "hx509 CMS/pkcs7 functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_cms" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 CMS/pkcs7 functions \- +hx509_cms \- hx509 CMS/pkcs7 functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -27,180 +30,195 @@ .in -1c .SH "Detailed Description" .PP -See the \fBCMS/PKCS7 message functions.\fP for description and examples. +See the \fBCMS/PKCS7 message functions\&.\fP for description and examples\&. .SH "Function Documentation" .PP .SS "int hx509_cms_create_signed_1 (hx509_context context, int flags, const heim_oid * eContentType, const void * data, size_t length, const AlgorithmIdentifier * digest_alg, hx509_cert cert, hx509_peer_info peer, hx509_certs anchors, hx509_certs pool, heim_octet_string * signed_data)" +Decode SignedData and verify that the signature is correct\&. .PP -Decode SignedData and verify that the signature is correct. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIflags\fP .br -\fIeContentType\fP the type of the data. +\fIeContentType\fP the type of the data\&. .br \fIdata\fP data to sign .br -\fIlength\fP length of the data that data point to. +\fIlength\fP length of the data that data point to\&. .br -\fIdigest_alg\fP digest algorithm to use, use NULL to get the default or the peer determined algorithm. +\fIdigest_alg\fP digest algorithm to use, use NULL to get the default or the peer determined algorithm\&. .br -\fIcert\fP certificate to use for sign the data. +\fIcert\fP certificate to use for sign the data\&. .br -\fIpeer\fP info about the peer the message to send the message to, like what digest algorithm to use. +\fIpeer\fP info about the peer the message to send the message to, like what digest algorithm to use\&. .br \fIanchors\fP trust anchors that the client will use, used to polulate the certificates included in the message .br -\fIpool\fP certificates to use in try to build the path to the trust anchors. +\fIpool\fP certificates to use in try to build the path to the trust anchors\&. .br -\fIsigned_data\fP the output of the function, free with der_free_octet_string(). +\fIsigned_data\fP the output of the function, free with der_free_octet_string()\&. +.RE +.PP +\fBReturns\fP +.RS 4 +Returns an hx509 error code\&. .RE .PP .SS "int hx509_cms_envelope_1 (hx509_context context, int flags, hx509_cert cert, const void * data, size_t length, const heim_oid * encryption_type, const heim_oid * contentType, heim_octet_string * content)" +Encrypt end encode EnvelopedData\&. .PP -Encrypt end encode EnvelopedData. +Encrypt and encode EnvelopedData\&. The data is encrypted with a random key and the the random key is encrypted with the certificates private key\&. This limits what private key type can be used to RSA\&. .PP -Encrypt and encode EnvelopedData. The data is encrypted with a random key and the the random key is encrypted with the certificates private key. This limits what private key type can be used to RSA. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIflags\fP flags to control the behavior. +\fIflags\fP flags to control the behavior\&. .IP "\(bu" 2 -HX509_CMS_EV_NO_KU_CHECK - Dont check KU on certificate +HX509_CMS_EV_NO_KU_CHECK - Don't check KU on certificate .IP "\(bu" 2 HX509_CMS_EV_ALLOW_WEAK - Allow weak crytpo .IP "\(bu" 2 HX509_CMS_EV_ID_NAME - prefer issuer name and serial number .PP .br -\fIcert\fP Certificate to encrypt the EnvelopedData encryption key with. +\fIcert\fP Certificate to encrypt the EnvelopedData encryption key with\&. .br -\fIdata\fP pointer the data to encrypt. +\fIdata\fP pointer the data to encrypt\&. .br -\fIlength\fP length of the data that data point to. +\fIlength\fP length of the data that data point to\&. .br -\fIencryption_type\fP Encryption cipher to use for the bulk data, use NULL to get default. +\fIencryption_type\fP Encryption cipher to use for the bulk data, use NULL to get default\&. .br \fIcontentType\fP type of the data that is encrypted .br -\fIcontent\fP the output of the function, free with der_free_octet_string(). +\fIcontent\fP the output of the function, free with der_free_octet_string()\&. +.RE +.PP +\fBReturns\fP +.RS 4 +an hx509 error code\&. .RE .PP .SS "int hx509_cms_unenvelope (hx509_context context, hx509_certs certs, int flags, const void * data, size_t length, const heim_octet_string * encryptedContent, time_t time_now, heim_oid * contentType, heim_octet_string * content)" +Decode and unencrypt EnvelopedData\&. .PP -Decode and unencrypt EnvelopedData. -.PP -Extract data and parameteres from from the EnvelopedData. Also supports using detached EnvelopedData. +Extract data and parameteres from from the EnvelopedData\&. Also supports using detached EnvelopedData\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIcerts\fP Certificate that can decrypt the EnvelopedData encryption key. +\fIcerts\fP Certificate that can decrypt the EnvelopedData encryption key\&. .br -\fIflags\fP HX509_CMS_UE flags to control the behavior. +\fIflags\fP HX509_CMS_UE flags to control the behavior\&. .br -\fIdata\fP pointer the structure the contains the DER/BER encoded EnvelopedData stucture. +\fIdata\fP pointer the structure the contains the DER/BER encoded EnvelopedData stucture\&. .br -\fIlength\fP length of the data that data point to. +\fIlength\fP length of the data that data point to\&. .br -\fIencryptedContent\fP in case of detached signature, this contains the actual encrypted data, othersize its should be NULL. +\fIencryptedContent\fP in case of detached signature, this contains the actual encrypted data, othersize its should be NULL\&. .br -\fItime_now\fP set the current time, if zero the library uses now as the date. +\fItime_now\fP set the current time, if zero the library uses now as the date\&. .br -\fIcontentType\fP output type oid, should be freed with der_free_oid(). +\fIcontentType\fP output type oid, should be freed with der_free_oid()\&. .br -\fIcontent\fP the data, free with der_free_octet_string(). +\fIcontent\fP the data, free with der_free_octet_string()\&. +.RE +.PP +\fBReturns\fP +.RS 4 +an hx509 error code\&. .RE .PP .SS "int hx509_cms_unwrap_ContentInfo (const heim_octet_string * in, heim_oid * oid, heim_octet_string * out, int * have_data)" +Decode an ContentInfo and unwrap data and oid it\&. .PP -Decode an ContentInfo and unwrap data and oid it. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP the encoded buffer. +\fIin\fP the encoded buffer\&. .br -\fIoid\fP type of the content. +\fIoid\fP type of the content\&. .br -\fIout\fP data to be wrapped. +\fIout\fP data to be wrapped\&. .br -\fIhave_data\fP since the data is optional, this flags show dthe diffrence between no data and the zero length data. +\fIhave_data\fP since the data is optional, this flags show dthe diffrence between no data and the zero length data\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_cms_verify_signed (hx509_context context, hx509_verify_ctx ctx, unsigned int flags, const void * data, size_t length, const heim_octet_string * signedContent, hx509_certs pool, heim_oid * contentType, heim_octet_string * content, hx509_certs * signer_certs)" +Decode SignedData and verify that the signature is correct\&. .PP -Decode SignedData and verify that the signature is correct. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIctx\fP a hx509 verify context. +\fIctx\fP a hx509 verify context\&. .br -\fIflags\fP to control the behaivor of the function. +\fIflags\fP to control the behaivor of the function\&. .IP "\(bu" 2 HX509_CMS_VS_NO_KU_CHECK - Don't check KeyUsage .IP "\(bu" 2 HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH - allow oid mismatch .IP "\(bu" 2 -HX509_CMS_VS_ALLOW_ZERO_SIGNER - no signer, see below. +HX509_CMS_VS_ALLOW_ZERO_SIGNER - no signer, see below\&. .PP .br -\fIdata\fP pointer to CMS SignedData encoded data. +\fIdata\fP pointer to CMS SignedData encoded data\&. .br -\fIlength\fP length of the data that data point to. +\fIlength\fP length of the data that data point to\&. .br -\fIsignedContent\fP external data used for signature. +\fIsignedContent\fP external data used for signature\&. .br -\fIpool\fP certificate pool to build certificates paths. +\fIpool\fP certificate pool to build certificates paths\&. .br -\fIcontentType\fP free with der_free_oid(). +\fIcontentType\fP free with der_free_oid()\&. .br -\fIcontent\fP the output of the function, free with der_free_octet_string(). +\fIcontent\fP the output of the function, free with der_free_octet_string()\&. .br -\fIsigner_certs\fP list of the cerficates used to sign this request, free with \fBhx509_certs_free()\fP. +\fIsigner_certs\fP list of the cerficates used to sign this request, free with \fBhx509_certs_free()\fP\&. .RE .PP - +\fBReturns\fP +.RS 4 +an hx509 error code\&. +.RE .PP -If HX509_CMS_VS_NO_KU_CHECK is set, allow more liberal search for matching certificates by not considering KeyUsage bits on the certificates. +If HX509_CMS_VS_NO_KU_CHECK is set, allow more liberal search for matching certificates by not considering KeyUsage bits on the certificates\&. .PP -If HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH, allow encapContentInfo mismatch with the oid in signedAttributes (or if no signedAttributes where use, pkcs7-data oid). This is only needed to work with broken CMS implementations that doesn't follow CMS signedAttributes rules. +If HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH, allow encapContentInfo mismatch with the oid in signedAttributes (or if no signedAttributes where use, pkcs7-data oid)\&. This is only needed to work with broken CMS implementations that doesn't follow CMS signedAttributes rules\&. .PP -If HX509_CMS_VS_NO_VALIDATE flags is set, do not verify the signing certificates and leave that up to the caller. +If HX509_CMS_VS_NO_VALIDATE flags is set, do not verify the signing certificates and leave that up to the caller\&. .PP -If HX509_CMS_VS_ALLOW_ZERO_SIGNER is set, allow empty SignerInfo (no signatures). If SignedData have no signatures, the function will return 0 with signer_certs set to NULL. Zero signers is allowed by the standard, but since its only useful in corner cases, it make into a flag that the caller have to turn on. +If HX509_CMS_VS_ALLOW_ZERO_SIGNER is set, allow empty SignerInfo (no signatures)\&. If SignedData have no signatures, the function will return 0 with signer_certs set to NULL\&. Zero signers is allowed by the standard, but since its only useful in corner cases, it make into a flag that the caller have to turn on\&. .SS "int hx509_cms_wrap_ContentInfo (const heim_oid * oid, const heim_octet_string * buf, heim_octet_string * res)" +Wrap data and oid in a ContentInfo and encode it\&. .PP -Wrap data and oid in a ContentInfo and encode it. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIoid\fP type of the content. +\fIoid\fP type of the content\&. .br -\fIbuf\fP data to be wrapped. If a NULL pointer is passed in, the optional content field in the ContentInfo is not going be filled in. +\fIbuf\fP data to be wrapped\&. If a NULL pointer is passed in, the optional content field in the ContentInfo is not going be filled in\&. .br -\fIres\fP the encoded buffer, the result should be freed with der_free_octet_string(). +\fIres\fP the encoded buffer, the result should be freed with der_free_octet_string()\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_crypto.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_crypto.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_crypto.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_crypto.3 @@ -1,8 +1,11 @@ -.TH "hx509 crypto functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_crypto" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 crypto functions \- +hx509_crypto \- hx509 crypto functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -16,25 +19,27 @@ .SH "Function Documentation" .PP .SS "int hx509_verify_signature (hx509_context context, const hx509_cert signer, const AlgorithmIdentifier * alg, const heim_octet_string * data, const heim_octet_string * sig)" +Verify a signature made using the private key of an certificate\&. .PP -Verify a signature made using the private key of an certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIsigner\fP the certificate that made the signature. +\fIsigner\fP the certificate that made the signature\&. .br -\fIalg\fP algorthm that was used to sign the data. +\fIalg\fP algorthm that was used to sign the data\&. .br -\fIdata\fP the data that was signed. +\fIdata\fP the data that was signed\&. .br -\fIsig\fP the sigature to verify. +\fIsig\fP the sigature to verify\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_env.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_env.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_env.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_env.3 @@ -1,8 +1,11 @@ -.TH "hx509 environment functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_env" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 environment functions \- +hx509_env \- hx509 environment functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -31,113 +34,110 @@ .SH "Function Documentation" .PP .SS "int hx509_env_add (hx509_context context, hx509_env * env, const char * key, const char * value)" +Add a new key/value pair to the hx509_env\&. .PP -Add a new key/value pair to the hx509_env. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIenv\fP environment to add the environment variable too. +\fIenv\fP environment to add the environment variable too\&. .br \fIkey\fP key to add .br \fIvalue\fP value to add .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_env_add_binding (hx509_context context, hx509_env * env, const char * key, hx509_env list)" +Add a new key/binding pair to the hx509_env\&. .PP -Add a new key/binding pair to the hx509_env. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIenv\fP environment to add the environment variable too. +\fIenv\fP environment to add the environment variable too\&. .br \fIkey\fP key to add .br \fIlist\fP binding list to add .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "const char* hx509_env_find (hx509_context context, hx509_env env, const char * key)" +Search the hx509_env for a key\&. .PP -Search the hx509_env for a key. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIenv\fP environment to add the environment variable too. +\fIenv\fP environment to add the environment variable too\&. .br -\fIkey\fP key to search for. +\fIkey\fP key to search for\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the value if the key is found, NULL otherwise. +the value if the key is found, NULL otherwise\&. .RE .PP .SS "hx509_env hx509_env_find_binding (hx509_context context, hx509_env env, const char * key)" +Search the hx509_env for a binding\&. .PP -Search the hx509_env for a binding. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIenv\fP environment to add the environment variable too. +\fIenv\fP environment to add the environment variable too\&. .br -\fIkey\fP key to search for. +\fIkey\fP key to search for\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the binding if the key is found, NULL if not found. +the binding if the key is found, NULL if not found\&. .RE .PP .SS "void hx509_env_free (hx509_env * env)" +Free an hx509_env environment context\&. .PP -Free an hx509_env environment context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIenv\fP the environment to free. +\fIenv\fP the environment to free\&. .RE .PP .SS "const char* hx509_env_lfind (hx509_context context, hx509_env env, const char * key, size_t len)" +Search the hx509_env for a length based key\&. .PP -Search the hx509_env for a length based key. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIenv\fP environment to add the environment variable too. +\fIenv\fP environment to add the environment variable too\&. .br -\fIkey\fP key to search for. +\fIkey\fP key to search for\&. .br -\fIlen\fP length of key. +\fIlen\fP length of key\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -the value if the key is found, NULL otherwise. +the value if the key is found, NULL otherwise\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_error.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_error.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_error.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_error.3 @@ -1,8 +1,11 @@ -.TH "hx509 error functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_error" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 error functions \- +hx509_error \- hx509 error functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -13,7 +16,7 @@ .RI "void \fBhx509_set_error_stringv\fP (hx509_context context, int flags, int code, const char *fmt, va_list ap)" .br .ti -1c -.RI "void \fBhx509_set_error_string\fP (hx509_context context, int flags, int code, const char *fmt,...)" +.RI "void \fBhx509_set_error_string\fP (hx509_context context, int flags, int code, const char *fmt,\&.\&.\&.)" .br .ti -1c .RI "char * \fBhx509_get_error_string\fP (hx509_context context, int error_code)" @@ -22,101 +25,95 @@ .RI "void \fBhx509_free_error_string\fP (char *str)" .br .ti -1c -.RI "void \fBhx509_err\fP (hx509_context context, int exit_code, int error_code, const char *fmt,...)" +.RI "void \fBhx509_err\fP (hx509_context context, int exit_code, int error_code, const char *fmt,\&.\&.\&.)" .br .in -1c .SH "Detailed Description" .PP -See the \fBHx509 error reporting functions\fP for description and examples. +See the \fBHx509 error reporting functions\fP for description and examples\&. .SH "Function Documentation" .PP .SS "void hx509_clear_error_string (hx509_context context)" +Resets the error strings the hx509 context\&. .PP -Resets the error strings the hx509 context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .RE .PP -.SS "void hx509_err (hx509_context context, int exit_code, int error_code, const char * fmt, ...)" -.PP +.SS "void hx509_err (hx509_context context, int exit_code, int error_code, const char * fmt, \&.\&.\&.)" Print error message and fatally exit from error code .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIexit_code\fP exit() code from process. +\fIexit_code\fP exit() code from process\&. .br -\fIerror_code\fP Error code for the reason to exit. +\fIerror_code\fP Error code for the reason to exit\&. .br -\fIfmt\fP format string with the exit message. +\fIfmt\fP format string with the exit message\&. .br -\fI...\fP argument to format string. +\fI\&.\&.\&.\fP argument to format string\&. .RE .PP .SS "void hx509_free_error_string (char * str)" +Free error string returned by \fBhx509_get_error_string()\fP\&. .PP -Free error string returned by \fBhx509_get_error_string()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIstr\fP error string to free. +\fIstr\fP error string to free\&. .RE .PP .SS "char* hx509_get_error_string (hx509_context context, int error_code)" +Get an error string from context associated with error_code\&. .PP -Get an error string from context associated with error_code. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIerror_code\fP Get error message for this error code. +\fIerror_code\fP Get error message for this error code\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -error string, free with \fBhx509_free_error_string()\fP. +error string, free with \fBhx509_free_error_string()\fP\&. .RE .PP -.SS "void hx509_set_error_string (hx509_context context, int flags, int code, const char * fmt, ...)" -.PP -See \fBhx509_set_error_stringv()\fP. +.SS "void hx509_set_error_string (hx509_context context, int flags, int code, const char * fmt, \&.\&.\&.)" +See \fBhx509_set_error_stringv()\fP\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIflags\fP .IP "\(bu" 2 -HX509_ERROR_APPEND appends the error string to the old messages (code is updated). +HX509_ERROR_APPEND appends the error string to the old messages (code is updated)\&. .PP .br \fIcode\fP error code related to error message .br \fIfmt\fP error message format .br -\fI...\fP arguments to error message format +\fI\&.\&.\&.\fP arguments to error message format .RE .PP .SS "void hx509_set_error_stringv (hx509_context context, int flags, int code, const char * fmt, va_list ap)" +Add an error message to the hx509 context\&. .PP -Add an error message to the hx509 context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIflags\fP .IP "\(bu" 2 -HX509_ERROR_APPEND appends the error string to the old messages (code is updated). +HX509_ERROR_APPEND appends the error string to the old messages (code is updated)\&. .PP .br \fIcode\fP error code related to error message @@ -127,3 +124,6 @@ .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_keyset.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_keyset.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_keyset.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_keyset.3 @@ -1,8 +1,11 @@ -.TH "hx509 certificate store functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_keyset" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 certificate store functions \- +hx509_keyset \- hx509 certificate store functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -54,320 +57,295 @@ .in -1c .SH "Detailed Description" .PP -See the \fBCertificate store operations\fP for description and examples. +See the \fBCertificate store operations\fP for description and examples\&. .SH "Function Documentation" .PP .SS "int hx509_certs_add (hx509_context context, hx509_certs certs, hx509_cert cert)" +Add a certificate to the certificiate store\&. .PP -Add a certificate to the certificiate store. -.PP -The receiving keyset certs will either increase reference counter of the cert or make a deep copy, either way, the caller needs to free the cert itself. +The receiving keyset certs will either increase reference counter of the cert or make a deep copy, either way, the caller needs to free the cert itself\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP certificate store to add the certificate to. +\fIcerts\fP certificate store to add the certificate to\&. .br -\fIcert\fP certificate to add. +\fIcert\fP certificate to add\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_append (hx509_context context, hx509_certs to, hx509_lock lock, const char * name)" +Same a \fBhx509_certs_merge()\fP but use a lock and name to describe the from source\&. .PP -Same a \fBhx509_certs_merge()\fP but use a lock and name to describe the from source. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIto\fP the store to merge into. +\fIto\fP the store to merge into\&. .br -\fIlock\fP a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see \fBLocking and unlocking certificates and encrypted data.\fP). +\fIlock\fP a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see \fBLocking and unlocking certificates and encrypted data\&.\fP)\&. .br \fIname\fP name of the source store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_end_seq (hx509_context context, hx509_certs certs, hx509_cursor cursor)" +End the iteration over certificates\&. .PP -End the iteration over certificates. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP certificate store to iterate over. +\fIcerts\fP certificate store to iterate over\&. .br -\fIcursor\fP cursor that will keep track of progress, freed. +\fIcursor\fP cursor that will keep track of progress, freed\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_filter (hx509_context context, hx509_certs certs, const hx509_query * q, hx509_certs * result)" +Filter certificate matching the query\&. .PP -Filter certificate matching the query. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP certificate store to search. +\fIcerts\fP certificate store to search\&. .br -\fIq\fP query allocated with \fBhx509 query functions\fP functions. +\fIq\fP query allocated with \fBhx509 query functions\fP functions\&. .br -\fIresult\fP the filtered certificate store, caller must free with \fBhx509_certs_free()\fP. +\fIresult\fP the filtered certificate store, caller must free with \fBhx509_certs_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP - -.PP -Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query. +Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query\&. .SS "int hx509_certs_find (hx509_context context, hx509_certs certs, const hx509_query * q, hx509_cert * r)" +Find a certificate matching the query\&. .PP -Find a certificate matching the query. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP certificate store to search. +\fIcerts\fP certificate store to search\&. .br -\fIq\fP query allocated with \fBhx509 query functions\fP functions. +\fIq\fP query allocated with \fBhx509 query functions\fP functions\&. .br -\fIr\fP return certificate (or NULL on error), should be freed with \fBhx509_cert_free()\fP. +\fIr\fP return certificate (or NULL on error), should be freed with \fBhx509_cert_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP - -.PP -Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query. +Return HX509_CERT_NOT_FOUND if no certificate in certs matched the query\&. .SS "void hx509_certs_free (hx509_certs * certs)" +Free a certificate store\&. .PP -Free a certificate store. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcerts\fP certificate store to free. +\fIcerts\fP certificate store to free\&. .RE .PP .SS "int hx509_certs_info (hx509_context context, hx509_certs certs, int(*)(void *, const char *) func, void * ctx)" +Print some info about the certificate store\&. .PP -Print some info about the certificate store. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP certificate store to print information about. +\fIcerts\fP certificate store to print information about\&. .br -\fIfunc\fP function that will get each line of the information, if NULL is used the data is printed on a FILE descriptor that should be passed in ctx, if ctx also is NULL, stdout is used. +\fIfunc\fP function that will get each line of the information, if NULL is used the data is printed on a FILE descriptor that should be passed in ctx, if ctx also is NULL, stdout is used\&. .br -\fIctx\fP parameter to func. +\fIctx\fP parameter to func\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_init (hx509_context context, const char * name, int flags, hx509_lock lock, hx509_certs * certs)" +Open or creates a new hx509 certificate store\&. .PP -Open or creates a new hx509 certificate store. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A hx509 context .br -\fIname\fP name of the store, format is TYPE:type-specific-string, if NULL is used the MEMORY store is used. +\fIname\fP name of the store, format is TYPE:type-specific-string, if NULL is used the MEMORY store is used\&. .br \fIflags\fP list of flags: .IP "\(bu" 2 -HX509_CERTS_CREATE create a new keystore of the specific TYPE. +HX509_CERTS_CREATE create a new keystore of the specific TYPE\&. .IP "\(bu" 2 -HX509_CERTS_UNPROTECT_ALL fails if any private key failed to be extracted. +HX509_CERTS_UNPROTECT_ALL fails if any private key failed to be extracted\&. .PP .br -\fIlock\fP a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see \fBLocking and unlocking certificates and encrypted data.\fP). +\fIlock\fP a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see \fBLocking and unlocking certificates and encrypted data\&.\fP)\&. .br -\fIcerts\fP return pointer, free with \fBhx509_certs_free()\fP. +\fIcerts\fP return pointer, free with \fBhx509_certs_free()\fP\&. +.RE +.PP +\fBReturns\fP +.RS 4 +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_iter_f (hx509_context context, hx509_certs certs, int(*)(hx509_context, void *, hx509_cert) func, void * ctx)" +Iterate over all certificates in a keystore and call a function for each of them\&. .PP -Iterate over all certificates in a keystore and call an function for each fo them. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP certificate store to iterate over. +\fIcerts\fP certificate store to iterate over\&. .br -\fIfunc\fP function to call for each certificate. The function should return non-zero to abort the iteration, that value is passed back to the caller of \fBhx509_certs_iter_f()\fP. +\fIfunc\fP function to call for each certificate\&. The function should return non-zero to abort the iteration, that value is passed back to the caller of \fBhx509_certs_iter_f()\fP\&. .br -\fIctx\fP context variable that will passed to the function. +\fIctx\fP context variable that will passed to the function\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_merge (hx509_context context, hx509_certs to, hx509_certs from)" +Merge a certificate store into another\&. The from store is keep intact\&. .PP -Merge a certificate store into another. The from store is keep intact. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIto\fP the store to merge into. +\fIto\fP the store to merge into\&. .br -\fIfrom\fP the store to copy the object from. +\fIfrom\fP the store to copy the object from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_next_cert (hx509_context context, hx509_certs certs, hx509_cursor cursor, hx509_cert * cert)" +Get next ceritificate from the certificate keystore pointed out by cursor\&. .PP -Get next ceritificate from the certificate keystore pointed out by cursor. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP certificate store to iterate over. +\fIcerts\fP certificate store to iterate over\&. .br -\fIcursor\fP cursor that keeps track of progress. +\fIcursor\fP cursor that keeps track of progress\&. .br -\fIcert\fP return certificate next in store, NULL if the store contains no more certificates. Free with \fBhx509_cert_free()\fP. +\fIcert\fP return certificate next in store, NULL if the store contains no more certificates\&. Free with \fBhx509_cert_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_certs_start_seq (hx509_context context, hx509_certs certs, hx509_cursor * cursor)" -.PP Start the integration .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br \fIcerts\fP certificate store to iterate over .br -\fIcursor\fP cursor that will keep track of progress, free with \fBhx509_certs_end_seq()\fP. +\fIcursor\fP cursor that will keep track of progress, free with \fBhx509_certs_end_seq()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION is returned if the certificate store doesn't support the iteration operation. +Returns an hx509 error code\&. HX509_UNSUPPORTED_OPERATION is returned if the certificate store doesn't support the iteration operation\&. .RE .PP .SS "int hx509_certs_store (hx509_context context, hx509_certs certs, int flags, hx509_lock lock)" +Write the certificate store to stable storage\&. .PP -Write the certificate store to stable storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIcerts\fP a certificate store to store. +\fIcerts\fP a certificate store to store\&. .br -\fIflags\fP currently unused, use 0. +\fIflags\fP currently unused, use 0\&. .br -\fIlock\fP a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see \fBLocking and unlocking certificates and encrypted data.\fP). +\fIlock\fP a lock that unlocks the certificates store, use NULL to select no password/certifictes/prompt lock (see \fBLocking and unlocking certificates and encrypted data\&.\fP)\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION if the certificate store doesn't support the store operation. +Returns an hx509 error code\&. HX509_UNSUPPORTED_OPERATION if the certificate store doesn't support the store operation\&. .RE .PP .SS "int hx509_ci_print_names (hx509_context context, void * ctx, hx509_cert c)" +Function to use to \fBhx509_certs_iter_f()\fP as a function argument, the ctx variable to \fBhx509_certs_iter_f()\fP should be a FILE file descriptor\&. .PP -Iterate over all certificates in a keystore and call an function for each fo them. -.PP -\fBParameters:\fP -.RS 4 -\fIcontext\fP a hx509 context. -.br -\fIcerts\fP certificate store to iterate over. -.br -\fIfunc\fP function to call for each certificate. The function should return non-zero to abort the iteration, that value is passed back to the caller of hx509_certs_iter(). -.RE -.PP -\fBReturns:\fP -.RS 4 -Returns an hx509 error code. Function to use to \fBhx509_certs_iter_f()\fP as a function argument, the ctx variable to \fBhx509_certs_iter_f()\fP should be a FILE file descriptor. -.RE -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIctx\fP used by \fBhx509_certs_iter_f()\fP. +\fIctx\fP used by \fBhx509_certs_iter_f()\fP\&. .br \fIc\fP a certificate .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP .SS "int hx509_get_one_cert (hx509_context context, hx509_certs certs, hx509_cert * c)" +Get one random certificate from the certificate store\&. .PP -Get one random certificate from the certificate store. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcerts\fP a certificate store to get the certificate from. +\fIcerts\fP a certificate store to get the certificate from\&. .br -\fIc\fP return certificate, should be freed with \fBhx509_cert_free()\fP. +\fIc\fP return certificate, should be freed with \fBhx509_cert_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns an hx509 error code. +Returns an hx509 error code\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_lock.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_lock.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_lock.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_lock.3 @@ -1,5 +1,14 @@ -.TH "hx509 lock functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_lock" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 lock functions \- See the \fBLocking and unlocking certificates and encrypted data.\fP for description and examples. +hx509_lock \- hx509 lock functions +.SH SYNOPSIS +.br +.PP +.SH "Detailed Description" +.PP +See the \fBLocking and unlocking certificates and encrypted data\&.\fP for description and examples\&. +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_misc.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_misc.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_misc.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_misc.3 @@ -1,8 +1,11 @@ -.TH "hx509 misc functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_misc" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 misc functions \- +hx509_misc \- hx509 misc functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -19,22 +22,23 @@ .SH "Function Documentation" .PP .SS "void hx509_free_octet_string_list (hx509_octet_string_list * list)" +Free a list of octet strings returned by another hx509 library function\&. .PP -Free a list of octet strings returned by another hx509 library function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIlist\fP list to be freed. +\fIlist\fP list to be freed\&. .RE .PP .SS "void hx509_xfree (void * ptr)" +Free a data element allocated in the library\&. .PP -Free a data element allocated in the library. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIptr\fP data to be freed. +\fIptr\fP data to be freed\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_name.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_name.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_name.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_name.3 @@ -1,8 +1,11 @@ -.TH "hx509 name functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_name" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 name functions \- +hx509_name \- hx509 name functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -42,194 +45,184 @@ .in -1c .SH "Detailed Description" .PP -See the \fBPKIX/X.509 Names\fP for description and examples. +See the \fBPKIX/X\&.509 Names\fP for description and examples\&. .SH "Function Documentation" .PP .SS "int hx509_general_name_unparse (GeneralName * name, char ** str)" +Unparse the hx509 name in name into a string\&. .PP -Unparse the hx509 name in name into a string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIname\fP the name to print .br \fIstr\fP an allocated string returns the name in string form .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_name_binary (const hx509_name name, heim_octet_string * os)" +Convert a hx509_name object to DER encoded name\&. .PP -Convert a hx509_name object to DER encoded name. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIname\fP name to concert .br -\fIos\fP data to a DER encoded name, free the resulting octet string with hx509_xfree(os->data). +\fIos\fP data to a DER encoded name, free the resulting octet string with hx509_xfree(os->data)\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_name_cmp (hx509_name n1, hx509_name n2)" +Compare to hx509 name object, useful for sorting\&. .PP -Compare to hx509 name object, useful for sorting. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIn1\fP a hx509 name object. +\fIn1\fP a hx509 name object\&. .br -\fIn2\fP a hx509 name object. +\fIn2\fP a hx509 name object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 the objects are the same, returns > 0 is n2 is 'larger' then n2, < 0 if n1 is 'smaller' then n2. +0 the objects are the same, returns > 0 is n2 is 'larger' then n2, < 0 if n1 is 'smaller' then n2\&. .RE .PP .SS "int hx509_name_copy (hx509_context context, const hx509_name from, hx509_name * to)" +Copy a hx509 name object\&. .PP -Copy a hx509 name object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 cotext. +\fIcontext\fP A hx509 cotext\&. .br \fIfrom\fP the name to copy from .br \fIto\fP the name to copy to .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_name_expand (hx509_context context, hx509_name name, hx509_env env)" +Expands variables in the name using env\&. Variables are on the form ${name}\&. Useful when dealing with certificate templates\&. .PP -Expands variables in the name using env. Variables are on the form ${name}. Useful when dealing with certificate templates. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 cotext. +\fIcontext\fP A hx509 cotext\&. .br -\fIname\fP the name to expand. +\fIname\fP the name to expand\&. .br -\fIenv\fP environment variable to expand. +\fIenv\fP environment variable to expand\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP - -.PP -Only UTF8String rdnSequence names are allowed +Only UTF8String rdnSequence names are allowed .SS "void hx509_name_free (hx509_name * name)" +Free a hx509 name object, upond return *name will be NULL\&. .PP -Free a hx509 name object, upond return *name will be NULL. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIname\fP a hx509 name object to be freed. +\fIname\fP a hx509 name object to be freed\&. .RE .PP .SS "int hx509_name_is_null_p (const hx509_name name)" +Unparse the hx509 name in name into a string\&. .PP -Unparse the hx509 name in name into a string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIname\fP the name to check if its empty/null. +\fIname\fP the name to check if its empty/null\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -non zero if the name is empty/null. +non zero if the name is empty/null\&. .RE .PP .SS "int hx509_name_to_Name (const hx509_name from, Name * to)" +Convert a hx509_name into a Name\&. .PP -Convert a hx509_name into a Name. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIfrom\fP the name to copy from .br \fIto\fP the name to copy to .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_name_to_string (const hx509_name name, char ** str)" +Convert the hx509 name object into a printable string\&. The resulting string should be freed with free()\&. .PP -Convert the hx509 name object into a printable string. The resulting string should be freed with free(). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIname\fP name to print .br \fIstr\fP the string to return .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_parse_name (hx509_context context, const char * str, hx509_name * name)" +Parse a string into a hx509 name object\&. .PP -Parse a string into a hx509 name object. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIstr\fP a string to parse. +\fIstr\fP a string to parse\&. .br -\fIname\fP the resulting object, NULL in case of error. +\fIname\fP the resulting object, NULL in case of error\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_unparse_der_name (const void * data, size_t length, char ** str)" +Convert a DER encoded name info a string\&. .PP -Convert a DER encoded name info a string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata\fP data to a DER/BER encoded name .br \fIlength\fP length of data .br -\fIstr\fP the resulting string, is NULL on failure. +\fIstr\fP the resulting string, is NULL on failure\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_peer.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_peer.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_peer.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_peer.3 @@ -1,8 +1,11 @@ -.TH "hx509 certificate selecting functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_peer" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 certificate selecting functions \- +hx509_peer \- hx509 certificate selecting functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -28,86 +31,84 @@ .SH "Function Documentation" .PP .SS "int hx509_peer_info_add_cms_alg (hx509_context context, hx509_peer_info peer, const AlgorithmIdentifier * val)" +Add an additional algorithm that the peer supports\&. .PP -Add an additional algorithm that the peer supports. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIpeer\fP the peer to set the new algorithms for .br \fIval\fP an AlgorithmsIdentier to add .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_peer_info_alloc (hx509_context context, hx509_peer_info * peer)" +Allocate a new peer info structure an init it to default values\&. .PP -Allocate a new peer info structure an init it to default values. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIpeer\fP return an allocated peer, free with \fBhx509_peer_info_free()\fP. +\fIpeer\fP return an allocated peer, free with \fBhx509_peer_info_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_peer_info_free (hx509_peer_info peer)" +Free a peer info structure\&. .PP -Free a peer info structure. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIpeer\fP peer info to be freed. +\fIpeer\fP peer info to be freed\&. .RE .PP .SS "int hx509_peer_info_set_cert (hx509_peer_info peer, hx509_cert cert)" +Set the certificate that remote peer is using\&. .PP -Set the certificate that remote peer is using. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIpeer\fP peer info to update .br -\fIcert\fP cerificate of the remote peer. +\fIcert\fP cerificate of the remote peer\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_peer_info_set_cms_algs (hx509_context context, hx509_peer_info peer, const AlgorithmIdentifier * val, size_t len)" +Set the algorithms that the peer supports\&. .PP -Set the algorithms that the peer supports. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br \fIpeer\fP the peer to set the new algorithms for .br \fIval\fP array of supported AlgorithmsIdentiers .br -\fIlen\fP length of array val. +\fIlen\fP length of array val\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_print.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_print.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_print.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_print.3 @@ -1,8 +1,11 @@ -.TH "hx509 printing functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_print" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 printing functions \- +hx509_print \- hx509 printing functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -43,169 +46,162 @@ .SH "Function Documentation" .PP .SS "void hx509_bitstring_print (const heim_bit_string * b, hx509_vprint_func func, void * ctx)" +Print a bitstring using a hx509_vprint_func function\&. To print to stdout use \fBhx509_print_stdout()\fP\&. .PP -Print a bitstring using a hx509_vprint_func function. To print to stdout use \fBhx509_print_stdout()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIb\fP bit string to print. +\fIb\fP bit string to print\&. .br -\fIfunc\fP hx509_vprint_func to print with. +\fIfunc\fP hx509_vprint_func to print with\&. .br -\fIctx\fP context variable to hx509_vprint_func function. +\fIctx\fP context variable to hx509_vprint_func function\&. .RE .PP .SS "int hx509_cert_keyusage_print (hx509_context context, hx509_cert c, char ** s)" +Print certificate usage for a certificate to a string\&. .PP -Print certificate usage for a certificate to a string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIc\fP a certificate print the keyusage for. +\fIc\fP a certificate print the keyusage for\&. .br -\fIs\fP the return string with the keysage printed in to, free with \fBhx509_xfree()\fP. +\fIs\fP the return string with the keysage printed in to, free with \fBhx509_xfree()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_oid_print (const heim_oid * oid, hx509_vprint_func func, void * ctx)" +Print a oid using a hx509_vprint_func function\&. To print to stdout use \fBhx509_print_stdout()\fP\&. .PP -Print a oid using a hx509_vprint_func function. To print to stdout use \fBhx509_print_stdout()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIoid\fP oid to print .br -\fIfunc\fP hx509_vprint_func to print with. +\fIfunc\fP hx509_vprint_func to print with\&. .br -\fIctx\fP context variable to hx509_vprint_func function. +\fIctx\fP context variable to hx509_vprint_func function\&. .RE .PP .SS "int hx509_oid_sprint (const heim_oid * oid, char ** str)" +Print a oid to a string\&. .PP -Print a oid to a string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIoid\fP oid to print .br -\fIstr\fP allocated string, free with \fBhx509_xfree()\fP. +\fIstr\fP allocated string, free with \fBhx509_xfree()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_print_stdout (void * ctx, const char * fmt, va_list va)" -.PP Helper function to print on stdout for: .IP "\(bu" 2 \fBhx509_oid_print()\fP, .IP "\(bu" 2 \fBhx509_bitstring_print()\fP, .IP "\(bu" 2 -\fBhx509_validate_ctx_set_print()\fP. +\fBhx509_validate_ctx_set_print()\fP\&. .PP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the context to the print function. If the ctx is NULL, stdout is used. +\fIctx\fP the context to the print function\&. If the ctx is NULL, stdout is used\&. .br -\fIfmt\fP the printing format. +\fIfmt\fP the printing format\&. .br -\fIva\fP the argumet list. +\fIva\fP the argumet list\&. .RE .PP .SS "int hx509_validate_cert (hx509_context context, hx509_validate_ctx ctx, hx509_cert cert)" +Validate/Print the status of the certificate\&. .PP -Validate/Print the status of the certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIctx\fP A hx509 validation context. +\fIctx\fP A hx509 validation context\&. .br -\fIcert\fP the cerificate to validate/print. +\fIcert\fP the cerificate to validate/print\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_validate_ctx_add_flags (hx509_validate_ctx ctx, int flags)" +Add flags to control the behaivor of the \fBhx509_validate_cert()\fP function\&. .PP -Add flags to control the behaivor of the \fBhx509_validate_cert()\fP function. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP A hx509 validation context. +\fIctx\fP A hx509 validation context\&. .br -\fIflags\fP flags to add to the validation context. +\fIflags\fP flags to add to the validation context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_validate_ctx_free (hx509_validate_ctx ctx)" +Free an hx509 validate context\&. .PP -Free an hx509 validate context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the hx509 validate context to free. +\fIctx\fP the hx509 validate context to free\&. .RE .PP .SS "int hx509_validate_ctx_init (hx509_context context, hx509_validate_ctx * ctx)" +Allocate a hx509 validation/printing context\&. .PP -Allocate a hx509 validation/printing context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIctx\fP a new allocated hx509 validation context, free with \fBhx509_validate_ctx_free()\fP. +\fIctx\fP a new allocated hx509 validation context, free with \fBhx509_validate_ctx_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_validate_ctx_set_print (hx509_validate_ctx ctx, hx509_vprint_func func, void * c)" +Set the printing functions for the validation context\&. .PP -Set the printing functions for the validation context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP a hx509 valication context. +\fIctx\fP a hx509 valication context\&. .br -\fIfunc\fP the printing function to usea. +\fIfunc\fP the printing function to usea\&. .br -\fIc\fP the context variable to the printing function. +\fIc\fP the context variable to the printing function\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_query.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_query.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_query.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_query.3 @@ -1,5 +1,14 @@ -.TH "hx509 query functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_query" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 query functions \- +hx509_query \- hx509 query functions +.SH SYNOPSIS +.br +.PP +.SH "Detailed Description" +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_revoke.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_revoke.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_revoke.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_revoke.3 @@ -1,8 +1,11 @@ -.TH "hx509 revokation checking functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_revoke" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 revokation checking functions \- +hx509_revoke \- hx509 revokation checking functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -30,14 +33,13 @@ .in -1c .SH "Detailed Description" .PP -See the \fBRevocation methods\fP for description and examples. +See the \fBRevocation methods\fP for description and examples\&. .SH "Function Documentation" .PP .SS "int hx509_ocsp_request (hx509_context context, hx509_certs reqcerts, hx509_certs pool, hx509_cert signer, const AlgorithmIdentifier * digest, heim_octet_string * request, heim_octet_string * nonce)" +Create an OCSP request for a set of certificates\&. .PP -Create an OCSP request for a set of certificates. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a hx509 context .br @@ -49,87 +51,82 @@ .br \fIdigest\fP the signing algorithm in the request, if NULL use the default signature algorithm, .br -\fIrequest\fP the encoded request, free with free_heim_octet_string(). +\fIrequest\fP the encoded request, free with free_heim_octet_string()\&. .br -\fInonce\fP nonce in the request, free with free_heim_octet_string(). +\fInonce\fP nonce in the request, free with free_heim_octet_string()\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_revoke_add_crl (hx509_context context, hx509_revoke_ctx ctx, const char * path)" +Add a CRL file to the revokation context\&. .PP -Add a CRL file to the revokation context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP hx509 context .br \fIctx\fP hx509 revokation context .br -\fIpath\fP path to file that is going to be added to the context. +\fIpath\fP path to file that is going to be added to the context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_revoke_add_ocsp (hx509_context context, hx509_revoke_ctx ctx, const char * path)" +Add a OCSP file to the revokation context\&. .PP -Add a OCSP file to the revokation context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP hx509 context .br \fIctx\fP hx509 revokation context .br -\fIpath\fP path to file that is going to be added to the context. +\fIpath\fP path to file that is going to be added to the context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_revoke_free (hx509_revoke_ctx * ctx)" +Free a hx509 revokation context\&. .PP -Free a hx509 revokation context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP context to be freed .RE .PP .SS "int hx509_revoke_init (hx509_context context, hx509_revoke_ctx * ctx)" +Allocate a revokation context\&. Free with \fBhx509_revoke_free()\fP\&. .PP -Allocate a revokation context. Free with \fBhx509_revoke_free()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIctx\fP returns a newly allocated revokation context. +\fIctx\fP returns a newly allocated revokation context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_revoke_ocsp_print (hx509_context context, const char * path, FILE * out)" +Print the OCSP reply stored in a file\&. .PP -Print the OCSP reply stored in a file. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a hx509 context .br @@ -138,17 +135,16 @@ \fIout\fP the out FILE descriptor to print the reply on .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_revoke_verify (hx509_context context, hx509_revoke_ctx ctx, hx509_certs certs, time_t now, hx509_cert cert, hx509_cert parent_cert)" +Check that a certificate is not expired according to a revokation context\&. Also need the parent certificte to the check OCSP parent identifier\&. .PP -Check that a certificate is not expired according to a revokation context. Also need the parent certificte to the check OCSP parent identifier. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP hx509 context .br @@ -163,9 +159,12 @@ \fIparent_cert\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_verify.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_verify.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_verify.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/hx509_verify.3 @@ -1,8 +1,11 @@ -.TH "hx509 verification functions" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "hx509_verify" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -hx509 verification functions \- +hx509_verify \- hx509 verification functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -61,91 +64,85 @@ .SH "Function Documentation" .PP .SS "void hx509_context_set_missing_revoke (hx509_context context, int flag)" +Selects if the \fBhx509_revoke_verify()\fP function is going to require the existans of a revokation method (OCSP, CRL) or not\&. Note that \fBhx509_verify_path()\fP, \fBhx509_cms_verify_signed()\fP, and other function call \fBhx509_revoke_verify()\fP\&. .PP -Selects if the \fBhx509_revoke_verify()\fP function is going to require the existans of a revokation method (OCSP, CRL) or not. Note that \fBhx509_verify_path()\fP, \fBhx509_cms_verify_signed()\fP, and other function call \fBhx509_revoke_verify()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP hx509 context to change the flag for. +\fIcontext\fP hx509 context to change the flag for\&. .br \fIflag\fP zero, revokation method required, non zero missing revokation method ok .RE .PP .SS "int hx509_crl_add_revoked_certs (hx509_context context, hx509_crl crl, hx509_certs certs)" +Add revoked certificate to an CRL context\&. .PP -Add revoked certificate to an CRL context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcrl\fP the CRL to add the revoked certificate to. +\fIcrl\fP the CRL to add the revoked certificate to\&. .br -\fIcerts\fP keyset of certificate to revoke. +\fIcerts\fP keyset of certificate to revoke\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_crl_alloc (hx509_context context, hx509_crl * crl)" +Create a CRL context\&. Use \fBhx509_crl_free()\fP to free the CRL context\&. .PP -Create a CRL context. Use \fBhx509_crl_free()\fP to free the CRL context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcrl\fP return pointer to a newly allocated CRL context. +\fIcrl\fP return pointer to a newly allocated CRL context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_crl_free (hx509_context context, hx509_crl * crl)" +Free a CRL context\&. .PP -Free a CRL context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br -\fIcrl\fP a CRL context to free. +\fIcrl\fP a CRL context to free\&. .RE .PP .SS "int hx509_crl_lifetime (hx509_context context, hx509_crl crl, int delta)" +Set the lifetime of a CRL context\&. .PP -Set the lifetime of a CRL context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br \fIcrl\fP a CRL context .br -\fIdelta\fP delta time the certificate is valid, library adds the current time to this. +\fIdelta\fP delta time the certificate is valid, library adds the current time to this\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_crl_sign (hx509_context context, hx509_cert signer, hx509_crl crl, heim_octet_string * os)" +Sign a CRL and return an encode certificate\&. .PP -Sign a CRL and return an encode certificate. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a hx509 context. +\fIcontext\fP a hx509 context\&. .br \fIsigner\fP certificate to sign the CRL with .br @@ -154,21 +151,20 @@ \fIos\fP return the signed and encoded CRL, free with free_heim_octet_string() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_ocsp_verify (hx509_context context, time_t now, hx509_cert cert, int flags, const void * data, size_t length, time_t * expiration)" +Verify that the certificate is part of the OCSP reply and it's not expired\&. Doesn't verify signature the OCSP reply or it's done by a authorized sender, that is assumed to be already done\&. .PP -Verify that the certificate is part of the OCSP reply and it's not expired. Doesn't verify signature the OCSP reply or it's done by a authorized sender, that is assumed to be already done. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a hx509 context .br -\fInow\fP the time right now, if 0, use the current time. +\fInow\fP the time right now, if 0, use the current time\&. .br \fIcert\fP the certificate to verify .br @@ -178,132 +174,126 @@ .br \fIlength\fP the length of the encode ocsp reply .br -\fIexpiration\fP return the time the OCSP will expire and need to be rechecked. +\fIexpiration\fP return the time the OCSP will expire and need to be rechecked\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_verify_attach_anchors (hx509_verify_ctx ctx, hx509_certs set)" +Set the trust anchors in the verification context, makes an reference to the keyset, so the consumer can free the keyset independent of the destruction of the verification context (ctx)\&. If there already is a keyset attached, it's released\&. .PP -Set the trust anchors in the verification context, makes an reference to the keyset, so the consumer can free the keyset independent of the destruction of the verification context (ctx). If there already is a keyset attached, it's released. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP a verification context .br -\fIset\fP a keyset containing the trust anchors. +\fIset\fP a keyset containing the trust anchors\&. .RE .PP .SS "void hx509_verify_attach_revoke (hx509_verify_ctx ctx, hx509_revoke_ctx revoke_ctx)" +Attach an revocation context to the verfication context, , makes an reference to the revoke context, so the consumer can free the revoke context independent of the destruction of the verification context\&. If there is no revoke context, the verification process is NOT going to check any verification status\&. .PP -Attach an revocation context to the verfication context, , makes an reference to the revoke context, so the consumer can free the revoke context independent of the destruction of the verification context. If there is no revoke context, the verification process is NOT going to check any verification status. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP a verification context. +\fIctx\fP a verification context\&. .br -\fIrevoke_ctx\fP a revoke context. +\fIrevoke_ctx\fP a revoke context\&. .RE .PP .SS "void hx509_verify_destroy_ctx (hx509_verify_ctx ctx)" +Free an hx509 verification context\&. .PP -Free an hx509 verification context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP the context to be freed. +\fIctx\fP the context to be freed\&. .RE .PP .SS "int hx509_verify_init_ctx (hx509_context context, hx509_verify_ctx * ctx)" +Allocate an verification context that is used fo control the verification process\&. .PP -Allocate an verification context that is used fo control the verification process. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIctx\fP returns a pointer to a hx509_verify_ctx object. +\fIctx\fP returns a pointer to a hx509_verify_ctx object\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "int hx509_verify_path (hx509_context context, hx509_verify_ctx ctx, hx509_cert cert, hx509_certs pool)" +Build and verify the path for the certificate to the trust anchor specified in the verify context\&. The path is constructed from the certificate, the pool and the trust anchors\&. .PP -Build and verify the path for the certificate to the trust anchor specified in the verify context. The path is constructed from the certificate, the pool and the trust anchors. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A hx509 context. +\fIcontext\fP A hx509 context\&. .br -\fIctx\fP A hx509 verification context. +\fIctx\fP A hx509 verification context\&. .br -\fIcert\fP the certificate to build the path from. +\fIcert\fP the certificate to build the path from\&. .br -\fIpool\fP A keyset of certificates to build the chain from. +\fIpool\fP A keyset of certificates to build the chain from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An hx509 error code, see \fBhx509_get_error_string()\fP. +An hx509 error code, see \fBhx509_get_error_string()\fP\&. .RE .PP .SS "void hx509_verify_set_max_depth (hx509_verify_ctx ctx, unsigned int max_depth)" +Set the maximum depth of the certificate chain that the path builder is going to try\&. .PP -Set the maximum depth of the certificate chain that the path builder is going to try. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP a verification context .br -\fImax_depth\fP maxium depth of the certificate chain, include trust anchor. +\fImax_depth\fP maxium depth of the certificate chain, include trust anchor\&. .RE .PP .SS "void hx509_verify_set_proxy_certificate (hx509_verify_ctx ctx, int boolean)" -.PP Allow or deny the use of proxy certificates .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP a verification context .br -\fIboolean\fP if non zero, allow proxy certificates. +\fIboolean\fP if non zero, allow proxy certificates\&. .RE .PP .SS "void hx509_verify_set_strict_rfc3280_verification (hx509_verify_ctx ctx, int boolean)" +Select strict RFC3280 verification of certificiates\&. This means checking key usage on CA certificates, this will make version 1 certificiates unuseable\&. .PP -Select strict RFC3280 verification of certificiates. This means checking key usage on CA certificates, this will make version 1 certificiates unusable. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIctx\fP a verification context .br -\fIboolean\fP if non zero, use strict verification. +\fIboolean\fP if non zero, use strict verification\&. .RE .PP .SS "void hx509_verify_set_time (hx509_verify_ctx ctx, time_t t)" +Set the clock time the the verification process is going to use\&. Used to check certificate in the past and future time\&. If not set the current time will be used\&. .PP -Set the clock time the the verification process is going to use. Used to check certificate in the past and future time. If not set the current time will be used. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIctx\fP a verification context. +\fIctx\fP a verification context\&. .br -\fIt\fP the time the verifiation is using. +\fIt\fP the time the verifiation is using\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal x509 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_ca.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_ca.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_ca.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_ca.3 @@ -1,4 +1,4 @@ -.TH "page_ca" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_ca" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cert.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cert.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cert.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cert.3 @@ -1,10 +1,10 @@ -.TH "page_cert" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_cert" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME page_cert \- The basic certificate -The basic hx509 cerificate object in hx509 is hx509_cert. The hx509_cert object is representing one X509/PKIX certificate and associated attributes; like private key, friendly name, etc. +The basic hx509 cerificate object in hx509 is hx509_cert\&. The hx509_cert object is representing one X509/PKIX certificate and associated attributes; like private key, friendly name, etc\&. .PP -A hx509_cert object is usully found via the keyset interfaces (\fBCertificate store operations\fP), but its also possible to create a certificate directly from a parsed object with \fBhx509_cert_init()\fP and \fBhx509_cert_init_data()\fP. +A hx509_cert object is usully found via the keyset interfaces (\fBCertificate store operations\fP), but its also possible to create a certificate directly from a parsed object with \fBhx509_cert_init()\fP and \fBhx509_cert_init_data()\fP\&. .PP See the library functions here: \fBhx509 certificate functions\fP diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cms.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cms.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cms.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_cms.3 @@ -1,18 +1,18 @@ -.TH "page_cms" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_cms" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -page_cms \- CMS/PKCS7 message functions. -CMS is defined in RFC 3369 and is an continuation of the RSA Labs standard PKCS7. The basic messages in CMS is +page_cms \- CMS/PKCS7 message functions\&. +CMS is defined in RFC 3369 and is an continuation of the RSA Labs standard PKCS7\&. The basic messages in CMS is .PP .IP "\(bu" 2 SignedData Data signed with private key (RSA, DSA, ECDSA) or secret (symmetric) key .IP "\(bu" 2 EnvelopedData Data encrypted with private key (RSA) .IP "\(bu" 2 -EncryptedData Data encrypted with secret (symmetric) key. +EncryptedData Data encrypted with secret (symmetric) key\&. .IP "\(bu" 2 -ContentInfo Wrapper structure including type and data. +ContentInfo Wrapper structure including type and data\&. .PP .PP See the library functions here: \fBhx509 CMS/pkcs7 functions\fP diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_env.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_env.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_env.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_env.3 @@ -1,4 +1,4 @@ -.TH "page_env" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_env" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_error.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_error.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_error.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_error.3 @@ -1,4 +1,4 @@ -.TH "page_error" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_error" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_keyset.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_keyset.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_keyset.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_keyset.3 @@ -1,17 +1,17 @@ -.TH "page_keyset" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_keyset" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME page_keyset \- Certificate store operations Type of certificates store: .IP "\(bu" 2 -MEMORY In memory based format. Doesnt support storing. +MEMORY In memory based format\&. Doesnt support storing\&. .IP "\(bu" 2 -FILE FILE supports raw DER certicates and PEM certicates. When PEM is used the file can contain may certificates and match private keys. Support storing the certificates. DER format only supports on certificate and no private key. +FILE FILE supports raw DER certicates and PEM certicates\&. When PEM is used the file can contain may certificates and match private keys\&. Support storing the certificates\&. DER format only supports on certificate and no private key\&. .IP "\(bu" 2 -PEM-FILE Same as FILE, defaulting to PEM encoded certificates. +PEM-FILE Same as FILE, defaulting to PEM encoded certificates\&. .IP "\(bu" 2 -PEM-FILE Same as FILE, defaulting to DER encoded certificates. +PEM-FILE Same as FILE, defaulting to DER encoded certificates\&. .IP "\(bu" 2 PKCS11 .IP "\(bu" 2 @@ -19,7 +19,7 @@ .IP "\(bu" 2 DIR .IP "\(bu" 2 -KEYCHAIN Apple Mac OS X KeyChain backed keychain object. +KEYCHAIN Apple Mac OS X KeyChain backed keychain object\&. .PP .PP See the library functions here: \fBhx509 certificate store functions\fP diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_lock.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_lock.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_lock.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_lock.3 @@ -1,6 +1,6 @@ -.TH "page_lock" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_lock" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -page_lock \- Locking and unlocking certificates and encrypted data. +page_lock \- Locking and unlocking certificates and encrypted data\&. See the library functions here: \fBhx509 lock functions\fP diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_name.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_name.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_name.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_name.3 @@ -1,18 +1,18 @@ -.TH "page_name" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_name" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME -page_name \- PKIX/X.509 Names -There are several names in PKIX/X.509, GeneralName and Name. +page_name \- PKIX/X\&.509 Names +There are several names in PKIX/X\&.509, GeneralName and Name\&. .PP -A Name consists of an ordered list of Relative Distinguished Names (RDN). Each RDN consists of an unordered list of typed strings. The types are defined by OID and have long and short description. For example id-at-commonName (2.5.4.3) have the long name CommonName and short name CN. The string itself can be of several encoding, UTF8, UTF16, Teltex string, etc. The type limit what encoding should be used. +A Name consists of an ordered list of Relative Distinguished Names (RDN)\&. Each RDN consists of an unordered list of typed strings\&. The types are defined by OID and have long and short description\&. For example id-at-commonName (2\&.5\&.4\&.3) have the long name CommonName and short name CN\&. The string itself can be of several encoding, UTF8, UTF16, Teltex string, etc\&. The type limit what encoding should be used\&. .PP -GeneralName is a broader nametype that can contains al kind of stuff like Name, IP addresses, partial Name, etc. +GeneralName is a broader nametype that can contains al kind of stuff like Name, IP addresses, partial Name, etc\&. .PP -Name is mapped into a hx509_name object. +Name is mapped into a hx509_name object\&. .PP -Parse and string name into a hx509_name object with \fBhx509_parse_name()\fP, make it back into string representation with \fBhx509_name_to_string()\fP. +Parse and string name into a hx509_name object with \fBhx509_parse_name()\fP, make it back into string representation with \fBhx509_name_to_string()\fP\&. .PP -Name string are defined rfc2253, rfc1779 and X.501. +Name string are defined rfc2253, rfc1779 and X\&.501\&. .PP See the library functions here: \fBhx509 name functions\fP diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_peer.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_peer.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_peer.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_peer.3 @@ -1,8 +1,8 @@ -.TH "page_peer" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_peer" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME page_peer \- Hx509 crypto selecting functions -Peer info structures are used togeter with hx509_crypto_select() to select the best avaible crypto algorithm to use. +Peer info structures are used togeter with hx509_crypto_select() to select the best avaible crypto algorithm to use\&. .PP See the library functions here: \fBhx509 certificate selecting functions\fP diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_print.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_print.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_print.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_print.3 @@ -1,4 +1,4 @@ -.TH "page_print" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_print" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_revoke.3 b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_revoke.3 --- a/crypto/heimdal/doc/doxyout/hx509/man/man3/page_revoke.3 +++ b/crypto/heimdal/doc/doxyout/hx509/man/man3/page_revoke.3 @@ -1,10 +1,10 @@ -.TH "page_revoke" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalx509library" \" -*- nroff -*- +.TH "page_revoke" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal x509 library" \" -*- nroff -*- .ad l .nh .SH NAME page_revoke \- Revocation methods -There are two revocation method for PKIX/X.509: CRL and OCSP. Revocation is needed if the private key is lost and stolen. Depending on how picky you are, you might want to make revocation for destroyed private keys too (smartcard broken), but that should not be a problem. +There are two revocation method for PKIX/X\&.509: CRL and OCSP\&. Revocation is needed if the private key is lost and stolen\&. Depending on how picky you are, you might want to make revocation for destroyed private keys too (smartcard broken), but that should not be a problem\&. .PP -CRL is a list of certifiates that have expired. +CRL is a list of certifiates that have expired\&. .PP -OCSP is an online checking method where the requestor sends a list of certificates to the OCSP server to return a signed reply if they are valid or not. Some services sends a OCSP reply as part of the hand-shake to make the revoktion decision simpler/faster for the client. +OCSP is an online checking method where the requestor sends a list of certificates to the OCSP server to return a signed reply if they are valid or not\&. Some services sends a OCSP reply as part of the hand-shake to make the revoktion decision simpler/faster for the client\&. diff --git a/crypto/heimdal/doc/doxyout/hx509/manpages b/crypto/heimdal/doc/doxyout/hx509/manpages --- a/crypto/heimdal/doc/doxyout/hx509/manpages +++ b/crypto/heimdal/doc/doxyout/hx509/manpages @@ -1,31 +1,24 @@ +hx509/man/man3/page_ca.3 +hx509/man/man3/page_cert.3 +hx509/man/man3/page_cms.3 +hx509/man/man3/page_env.3 +hx509/man/man3/page_error.3 +hx509/man/man3/page_keyset.3 +hx509/man/man3/page_lock.3 +hx509/man/man3/page_name.3 +hx509/man/man3/page_peer.3 +hx509/man/man3/page_print.3 +hx509/man/man3/page_revoke.3 hx509/man/man3/hx509.3 -hx509/man/man3/hx509_bitstring_print.3 -hx509/man/man3/hx509_ca.3 -hx509/man/man3/hx509_ca_sign.3 -hx509/man/man3/hx509_ca_sign_self.3 -hx509/man/man3/hx509_ca_tbs_add_crl_dp_uri.3 -hx509/man/man3/hx509_ca_tbs_add_eku.3 -hx509/man/man3/hx509_ca_tbs_add_san_hostname.3 -hx509/man/man3/hx509_ca_tbs_add_san_jid.3 -hx509/man/man3/hx509_ca_tbs_add_san_ms_upn.3 -hx509/man/man3/hx509_ca_tbs_add_san_otherName.3 -hx509/man/man3/hx509_ca_tbs_add_san_pkinit.3 -hx509/man/man3/hx509_ca_tbs_add_san_rfc822name.3 -hx509/man/man3/hx509_ca_tbs_free.3 -hx509/man/man3/hx509_ca_tbs_init.3 -hx509/man/man3/hx509_ca_tbs_set_ca.3 -hx509/man/man3/hx509_ca_tbs_set_domaincontroller.3 -hx509/man/man3/hx509_ca_tbs_set_notAfter.3 -hx509/man/man3/hx509_ca_tbs_set_notAfter_lifetime.3 -hx509/man/man3/hx509_ca_tbs_set_notBefore.3 -hx509/man/man3/hx509_ca_tbs_set_proxy.3 -hx509/man/man3/hx509_ca_tbs_set_serialnumber.3 -hx509/man/man3/hx509_ca_tbs_set_spki.3 -hx509/man/man3/hx509_ca_tbs_set_subject.3 -hx509/man/man3/hx509_ca_tbs_set_template.3 -hx509/man/man3/hx509_ca_tbs_set_unique.3 -hx509/man/man3/hx509_ca_tbs_subject_expand.3 -hx509/man/man3/hx509_ca_tbs_template_units.3 +hx509/man/man3/hx509_context_free.3 +hx509/man/man3/hx509_context_init.3 +hx509/man/man3/hx509_error.3 +hx509/man/man3/hx509_clear_error_string.3 +hx509/man/man3/hx509_err.3 +hx509/man/man3/hx509_free_error_string.3 +hx509/man/man3/hx509_get_error_string.3 +hx509/man/man3/hx509_set_error_string.3 +hx509/man/man3/hx509_set_error_stringv.3 hx509/man/man3/hx509_cert.3 hx509/man/man3/hx509_cert_binary.3 hx509/man/man3/hx509_cert_check_eku.3 @@ -46,9 +39,21 @@ hx509/man/man3/hx509_cert_get_subject_unique_id.3 hx509/man/man3/hx509_cert_init.3 hx509/man/man3/hx509_cert_init_data.3 -hx509/man/man3/hx509_cert_keyusage_print.3 hx509/man/man3/hx509_cert_ref.3 hx509/man/man3/hx509_cert_set_friendly_name.3 +hx509/man/man3/hx509_print_cert.3 +hx509/man/man3/hx509_query_alloc.3 +hx509/man/man3/hx509_query_free.3 +hx509/man/man3/hx509_query_match_cmp_func.3 +hx509/man/man3/hx509_query_match_eku.3 +hx509/man/man3/hx509_query_match_friendly_name.3 +hx509/man/man3/hx509_query_match_issuer_serial.3 +hx509/man/man3/hx509_query_match_option.3 +hx509/man/man3/hx509_query_statistic_file.3 +hx509/man/man3/hx509_query_unparse_stats.3 +hx509/man/man3/hx509_verify_ctx_f_allow_default_trustanchors.3 +hx509/man/man3/hx509_verify_hostname.3 +hx509/man/man3/hx509_keyset.3 hx509/man/man3/hx509_certs_add.3 hx509/man/man3/hx509_certs_append.3 hx509/man/man3/hx509_certs_end_seq.3 @@ -63,7 +68,7 @@ hx509/man/man3/hx509_certs_start_seq.3 hx509/man/man3/hx509_certs_store.3 hx509/man/man3/hx509_ci_print_names.3 -hx509/man/man3/hx509_clear_error_string.3 +hx509/man/man3/hx509_get_one_cert.3 hx509/man/man3/hx509_cms.3 hx509/man/man3/hx509_cms_create_signed_1.3 hx509/man/man3/hx509_cms_envelope_1.3 @@ -71,33 +76,13 @@ hx509/man/man3/hx509_cms_unwrap_ContentInfo.3 hx509/man/man3/hx509_cms_verify_signed.3 hx509/man/man3/hx509_cms_wrap_ContentInfo.3 -hx509/man/man3/hx509_context_free.3 -hx509/man/man3/hx509_context_init.3 -hx509/man/man3/hx509_context_set_missing_revoke.3 -hx509/man/man3/hx509_crl_add_revoked_certs.3 -hx509/man/man3/hx509_crl_alloc.3 -hx509/man/man3/hx509_crl_free.3 -hx509/man/man3/hx509_crl_lifetime.3 -hx509/man/man3/hx509_crl_sign.3 hx509/man/man3/hx509_crypto.3 -hx509/man/man3/hx509_env.3 -hx509/man/man3/hx509_env_add.3 -hx509/man/man3/hx509_env_add_binding.3 -hx509/man/man3/hx509_env_find.3 -hx509/man/man3/hx509_env_find_binding.3 -hx509/man/man3/hx509_env_free.3 -hx509/man/man3/hx509_env_lfind.3 -hx509/man/man3/hx509_err.3 -hx509/man/man3/hx509_error.3 -hx509/man/man3/hx509_free_error_string.3 -hx509/man/man3/hx509_free_octet_string_list.3 -hx509/man/man3/hx509_general_name_unparse.3 -hx509/man/man3/hx509_get_error_string.3 -hx509/man/man3/hx509_get_one_cert.3 -hx509/man/man3/hx509_keyset.3 -hx509/man/man3/hx509_lock.3 +hx509/man/man3/hx509_verify_signature.3 hx509/man/man3/hx509_misc.3 +hx509/man/man3/hx509_free_octet_string_list.3 +hx509/man/man3/hx509_xfree.3 hx509/man/man3/hx509_name.3 +hx509/man/man3/hx509_general_name_unparse.3 hx509/man/man3/hx509_name_binary.3 hx509/man/man3/hx509_name_cmp.3 hx509/man/man3/hx509_name_copy.3 @@ -106,67 +91,83 @@ hx509/man/man3/hx509_name_is_null_p.3 hx509/man/man3/hx509_name_to_Name.3 hx509/man/man3/hx509_name_to_string.3 -hx509/man/man3/hx509_ocsp_request.3 -hx509/man/man3/hx509_ocsp_verify.3 -hx509/man/man3/hx509_oid_print.3 -hx509/man/man3/hx509_oid_sprint.3 hx509/man/man3/hx509_parse_name.3 -hx509/man/man3/hx509_peer.3 -hx509/man/man3/hx509_peer_info_add_cms_alg.3 -hx509/man/man3/hx509_peer_info_alloc.3 -hx509/man/man3/hx509_peer_info_free.3 -hx509/man/man3/hx509_peer_info_set_cert.3 -hx509/man/man3/hx509_peer_info_set_cms_algs.3 -hx509/man/man3/hx509_print.3 -hx509/man/man3/hx509_print_cert.3 -hx509/man/man3/hx509_print_stdout.3 -hx509/man/man3/hx509_query.3 -hx509/man/man3/hx509_query_alloc.3 -hx509/man/man3/hx509_query_free.3 -hx509/man/man3/hx509_query_match_cmp_func.3 -hx509/man/man3/hx509_query_match_eku.3 -hx509/man/man3/hx509_query_match_friendly_name.3 -hx509/man/man3/hx509_query_match_issuer_serial.3 -hx509/man/man3/hx509_query_match_option.3 -hx509/man/man3/hx509_query_statistic_file.3 -hx509/man/man3/hx509_query_unparse_stats.3 +hx509/man/man3/hx509_unparse_der_name.3 hx509/man/man3/hx509_revoke.3 +hx509/man/man3/hx509_ocsp_request.3 hx509/man/man3/hx509_revoke_add_crl.3 hx509/man/man3/hx509_revoke_add_ocsp.3 hx509/man/man3/hx509_revoke_free.3 hx509/man/man3/hx509_revoke_init.3 hx509/man/man3/hx509_revoke_ocsp_print.3 hx509/man/man3/hx509_revoke_verify.3 -hx509/man/man3/hx509_set_error_string.3 -hx509/man/man3/hx509_set_error_stringv.3 -hx509/man/man3/hx509_unparse_der_name.3 -hx509/man/man3/hx509_validate_cert.3 -hx509/man/man3/hx509_validate_ctx_add_flags.3 -hx509/man/man3/hx509_validate_ctx_free.3 -hx509/man/man3/hx509_validate_ctx_init.3 -hx509/man/man3/hx509_validate_ctx_set_print.3 hx509/man/man3/hx509_verify.3 +hx509/man/man3/hx509_context_set_missing_revoke.3 +hx509/man/man3/hx509_crl_add_revoked_certs.3 +hx509/man/man3/hx509_crl_alloc.3 +hx509/man/man3/hx509_crl_free.3 +hx509/man/man3/hx509_crl_lifetime.3 +hx509/man/man3/hx509_crl_sign.3 +hx509/man/man3/hx509_ocsp_verify.3 hx509/man/man3/hx509_verify_attach_anchors.3 hx509/man/man3/hx509_verify_attach_revoke.3 -hx509/man/man3/hx509_verify_ctx_f_allow_default_trustanchors.3 hx509/man/man3/hx509_verify_destroy_ctx.3 -hx509/man/man3/hx509_verify_hostname.3 hx509/man/man3/hx509_verify_init_ctx.3 hx509/man/man3/hx509_verify_path.3 hx509/man/man3/hx509_verify_set_max_depth.3 hx509/man/man3/hx509_verify_set_proxy_certificate.3 hx509/man/man3/hx509_verify_set_strict_rfc3280_verification.3 hx509/man/man3/hx509_verify_set_time.3 -hx509/man/man3/hx509_verify_signature.3 -hx509/man/man3/hx509_xfree.3 -hx509/man/man3/page_ca.3 -hx509/man/man3/page_cert.3 -hx509/man/man3/page_cms.3 -hx509/man/man3/page_env.3 -hx509/man/man3/page_error.3 -hx509/man/man3/page_keyset.3 -hx509/man/man3/page_lock.3 -hx509/man/man3/page_name.3 -hx509/man/man3/page_peer.3 -hx509/man/man3/page_print.3 -hx509/man/man3/page_revoke.3 +hx509/man/man3/hx509_lock.3 +hx509/man/man3/hx509_query.3 +hx509/man/man3/hx509_ca.3 +hx509/man/man3/hx509_ca_sign.3 +hx509/man/man3/hx509_ca_sign_self.3 +hx509/man/man3/hx509_ca_tbs_add_crl_dp_uri.3 +hx509/man/man3/hx509_ca_tbs_add_eku.3 +hx509/man/man3/hx509_ca_tbs_add_san_hostname.3 +hx509/man/man3/hx509_ca_tbs_add_san_jid.3 +hx509/man/man3/hx509_ca_tbs_add_san_ms_upn.3 +hx509/man/man3/hx509_ca_tbs_add_san_otherName.3 +hx509/man/man3/hx509_ca_tbs_add_san_pkinit.3 +hx509/man/man3/hx509_ca_tbs_add_san_rfc822name.3 +hx509/man/man3/hx509_ca_tbs_free.3 +hx509/man/man3/hx509_ca_tbs_init.3 +hx509/man/man3/hx509_ca_tbs_set_ca.3 +hx509/man/man3/hx509_ca_tbs_set_domaincontroller.3 +hx509/man/man3/hx509_ca_tbs_set_notAfter.3 +hx509/man/man3/hx509_ca_tbs_set_notAfter_lifetime.3 +hx509/man/man3/hx509_ca_tbs_set_notBefore.3 +hx509/man/man3/hx509_ca_tbs_set_proxy.3 +hx509/man/man3/hx509_ca_tbs_set_serialnumber.3 +hx509/man/man3/hx509_ca_tbs_set_signature_algorithm.3 +hx509/man/man3/hx509_ca_tbs_set_spki.3 +hx509/man/man3/hx509_ca_tbs_set_subject.3 +hx509/man/man3/hx509_ca_tbs_set_template.3 +hx509/man/man3/hx509_ca_tbs_set_unique.3 +hx509/man/man3/hx509_ca_tbs_subject_expand.3 +hx509/man/man3/hx509_ca_tbs_template_units.3 +hx509/man/man3/hx509_peer.3 +hx509/man/man3/hx509_peer_info_add_cms_alg.3 +hx509/man/man3/hx509_peer_info_alloc.3 +hx509/man/man3/hx509_peer_info_free.3 +hx509/man/man3/hx509_peer_info_set_cert.3 +hx509/man/man3/hx509_peer_info_set_cms_algs.3 +hx509/man/man3/hx509_print.3 +hx509/man/man3/hx509_bitstring_print.3 +hx509/man/man3/hx509_cert_keyusage_print.3 +hx509/man/man3/hx509_oid_print.3 +hx509/man/man3/hx509_oid_sprint.3 +hx509/man/man3/hx509_print_stdout.3 +hx509/man/man3/hx509_validate_cert.3 +hx509/man/man3/hx509_validate_ctx_add_flags.3 +hx509/man/man3/hx509_validate_ctx_free.3 +hx509/man/man3/hx509_validate_ctx_init.3 +hx509/man/man3/hx509_validate_ctx_set_print.3 +hx509/man/man3/hx509_env.3 +hx509/man/man3/hx509_env_add.3 +hx509/man/man3/hx509_env_add_binding.3 +hx509/man/man3/hx509_env_find.3 +hx509/man/man3/hx509_env_find_binding.3 +hx509/man/man3/hx509_env_free.3 +hx509/man/man3/hx509_env_lfind.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/annotated.html b/crypto/heimdal/doc/doxyout/krb5/html/annotated.html --- a/crypto/heimdal/doc/doxyout/krb5/html/annotated.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/annotated.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Data Structures +Data Structures @@ -8,28 +8,32 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Data Structures
    +
    -

    Data Structures

    Here are the data structures with brief descriptions: - +
    Here are the data structures with brief descriptions:
    +
    krb5_crypto_iov
    + + + +
     Ckrb5_crypto_iov
     Ckrb5plugin_an2ln_ftable_descDescription of the krb5_aname_to_lname(3) plugin facility
     Ckrb5plugin_db_ftable_descDescription of the krb5 DB plugin facility
     Ckrb5plugin_kuserok_ftable_descDescription of the krb5_kuserok(3) plugin facility
    -
    + +
    -Generated on Wed Jan 11 14:07:50 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/bc_s.png b/crypto/heimdal/doc/doxyout/krb5/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + +Data Structure Index + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Data Structure Index
    +
    + +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/krb5/html/closed.png b/crypto/heimdal/doc/doxyout/krb5/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zc%17D@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ h3 { - margin-top: 0; +form.search { + margin-bottom: 0px; + margin-top: 0px; } -.directory p { - margin: 0px; - white-space: nowrap; + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.directory div { - display: none; - margin: 0px; +*/ + +td.tiny { + font-size: 75%; } -.directory img { - vertical-align: -30%; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; } -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; + +th.dirtab { + background: #EBEFF6; + font-weight: bold; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; } -.directory-alt > h3 { - margin-top: 0; + +hr.footer { + height: 1px; } -.directory-alt p { - margin: 0px; - white-space: nowrap; + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; } -.directory-alt div { - display: none; - margin: 0px; + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -.directory-alt img { - vertical-align: -30%; + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; } diff --git a/crypto/heimdal/doc/doxyout/krb5/html/doxygen.png b/crypto/heimdal/doc/doxyout/krb5/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tWI!7t@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`JY+|Kdr`d2-(ONuKA& z`@F5@iWMozvyuS-DJG-A!lRSFxj4eVTQ(O*ctC5l23a*NCT zUiG#bpmlC>)R3lz>e?DhO|`RWYpkY-Cv7yZvX=1p<>y~3vO1$fzhC-nV)3CLCmz1P@7CUvliZQpfu5;zp}ugqdu(jz*|T4tKK*%e@vB3o8?nX)G7YEO} zIVfR(?xMlF^f}`rl|s?m#rLFbqVx`xSj&_q(VMc@fTHZh}z-v68l% zry~x%T5iHj^14oBx^J>s?RnyD8<0POU=9lDQOGMB@Qv5Y7jCfG%j{AmV#TMGW1QMw zT#YF!z0x)@dY88&9zIW5@|0`{T~(%oEz)4CmbgKz&?JXM8PbTlGzy_abLK5`U0uI5 zjHCu-UX^?f&14ZFEI#m4m6HGb+pWe9G)EL9oc;V4^!AHAWY)_-0Wh%dA!_pW~AM2 zHZ{sky{TsvhxSG}|Kjt>YpOaDZqKGo-`}a-o=bjEydHSUR%_RxG>Ry*<{c88MP&ug zrltyHjJ>p!JX%>=hAAW0nBi-?hEq>Uc@@s%X-yA@MfsACeNgoN1A!3a_MdBcK263R zpQruAi4!wj!sVHNOf2y}FSc#gM1Zq3XU`YH3(W_aJO(H}DNQ%LguU8tiV}RK z`!2|z88ZfI8$CN%7oV-phP3SL?84r>l*~_CMZ$)pGy< diff --git a/crypto/heimdal/doc/doxyout/krb5/html/doxygen.svg b/crypto/heimdal/doc/doxyout/krb5/html/doxygen.svg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/krb5/html/dynsections.js b/crypto/heimdal/doc/doxyout/krb5/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ -HeimdalKerberos5library: Graph Legend +Graph Legend @@ -8,69 +8,71 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Graph Legend
    +
    -

    Graph Legend

    This page explains how to interpret the graphs that are generated by doxygen.

    -Consider the following example:

    /*! Invisible class because of truncation */
    -class Invisible { };
    -
    -/*! Truncated class, inheritance relation is hidden */
    -class Truncated : public Invisible { };
    -
    -/* Class not documented with doxygen comments */
    -class Undocumented { };
    -
    -/*! Class that is inherited using public inheritance */
    -class PublicBase : public Truncated { };
    -
    -/*! A template class */
    -template<class T> class Templ { };
    -
    -/*! Class that is inherited using protected inheritance */
    -class ProtectedBase { };
    -
    -/*! Class that is inherited using private inheritance */
    -class PrivateBase { };
    -
    -/*! Class that is used by the Inherited class */
    -class Used { };
    -
    -/*! Super class that inherits a number of other classes */
    -class Inherited : public PublicBase,
    -                  protected ProtectedBase,
    -                  private PrivateBase,
    -                  public Undocumented,
    -                  public Templ<int>
    -{
    -  private:
    -    Used *m_usedClass;
    -};
    -
    If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

    -

    -graph_legend.png -
    -

    -The boxes in the above graph have the following meaning:

      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      +
      class Invisible { };
      +
      +
      /*! Truncated class, inheritance relation is hidden */
      +
      class Truncated : public Invisible { };
      +
      +
      /* Class not documented with doxygen comments */
      +
      class Undocumented { };
      +
      +
      /*! Class that is inherited using public inheritance */
      +
      class PublicBase : public Truncated { };
      +
      +
      /*! A template class */
      +
      template<class T> class Templ { };
      +
      +
      /*! Class that is inherited using protected inheritance */
      +
      class ProtectedBase { };
      +
      +
      /*! Class that is inherited using private inheritance */
      +
      class PrivateBase { };
      +
      +
      /*! Class that is used by the Inherited class */
      +
      class Used { };
      +
      +
      /*! Super class that inherits a number of other classes */
      +
      class Inherited : public PublicBase,
      +
      protected ProtectedBase,
      +
      private PrivateBase,
      +
      public Undocumented,
      +
      public Templ<int>
      +
      {
      +
      private:
      +
      Used *m_usedClass;
      +
      };
      +

      This will result in the following graph:

      +

      The boxes in the above graph have the following meaning:

      +
      • A filled gray box represents the struct or class for which the graph is generated.
      • A box with a black border denotes a documented struct or class.
      • -A box with a grey border denotes an undocumented struct or class.
      • +A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -The arrows have the following meaning:
        +

        The arrows have the following meaning:

        +
        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • @@ -78,12 +80,12 @@
        • A dark red arrow is used for private inheritance.
        • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
        • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
        -
    +
    -Generated on Wed Jan 11 14:07:50 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.dot b/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.dot deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G -{ - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.png b/crypto/heimdal/doc/doxyout/krb5/html/graph_legend.png index 9b96937bfd5f7a36ea8dbf2d64ed1bc0768f074d..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 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 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 library +Heimdal Kerberos 5 library @@ -8,2230 +8,2215 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 library
    +
    -

    Heimdal Kerberos 5 library

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_add_et_list (krb5_context context, void(*func)(struct et_list **))
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_password (krb5_context context, krb5_creds *creds, const char *newpw, krb5_principal targprinc, int *result_code, krb5_data *result_code_string, krb5_data *result_string)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_context (krb5_context *context)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_context (krb5_context context, krb5_context *out)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_context (krb5_context context)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_config_files (krb5_context context, char **filenames)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_prepend_config_files_default (const char *filelist, char ***pfilenames)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_default_config_files (char ***pfilenames)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_config_files (char **filenames)
    KRB5_LIB_FUNCTION const
    -krb5_enctype *KRB5_LIB_CALL 
    krb5_kerberos_enctypes (krb5_context context)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_default_in_tkt_etypes (krb5_context context, const krb5_enctype *etypes)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_default_in_tkt_etypes (krb5_context context, krb5_pdu pdu_type, krb5_enctype **etypes)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_init_ets (krb5_context context)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_set_use_admin_kdc (krb5_context context, krb5_boolean flag)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_get_use_admin_kdc (krb5_context context)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_add_extra_addresses (krb5_context context, krb5_addresses *addresses)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_extra_addresses (krb5_context context, const krb5_addresses *addresses)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_extra_addresses (krb5_context context, krb5_addresses *addresses)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_add_ignore_addresses (krb5_context context, krb5_addresses *addresses)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_ignore_addresses (krb5_context context, const krb5_addresses *addresses)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_ignore_addresses (krb5_context context, krb5_addresses *addresses)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_fcache_version (krb5_context context, int version)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_fcache_version (krb5_context context, int *version)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_is_thread_safe (void)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_set_dns_canonicalize_hostname (krb5_context context, krb5_boolean flag)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_get_dns_canonicalize_hostname (krb5_context context)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_kdc_sec_offset (krb5_context context, int32_t *sec, int32_t *usec)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_kdc_sec_offset (krb5_context context, int32_t sec, int32_t usec)
    KRB5_LIB_FUNCTION time_t
    -KRB5_LIB_CALL 
    krb5_get_max_time_skew (krb5_context context)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_set_max_time_skew (krb5_context context, time_t t)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_set_home_dir_access (krb5_context context, krb5_boolean allow)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_host_realm (krb5_context context, const krb5_realm *from, krb5_realm **to)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_free_cred_contents (krb5_context context, krb5_creds *c)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_creds_contents (krb5_context context, const krb5_creds *incred, krb5_creds *c)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_creds (krb5_context context, const krb5_creds *incred, krb5_creds **outcred)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_free_creds (krb5_context context, krb5_creds *c)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_compare_creds (krb5_context context, krb5_flags whichfields, const krb5_creds *mcreds, const krb5_creds *creds)
    KRB5_LIB_FUNCTION unsigned
    -long KRB5_LIB_CALL 
    krb5_creds_get_ticket_flags (krb5_creds *creds)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_data_zero (krb5_data *p)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_data_free (krb5_data *p)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_data (krb5_context context, krb5_data *p)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_data_alloc (krb5_data *p, int len)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_data_realloc (krb5_data *p, int len)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_data_copy (krb5_data *p, const void *data, size_t len)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_data (krb5_context context, const krb5_data *indata, krb5_data **outdata)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_cmp (const krb5_data *data1, const krb5_data *data2)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_ct_cmp (const krb5_data *data1, const krb5_data *data2)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_krbhst_get_addrinfo (krb5_context context, krb5_krbhst_info *host, struct addrinfo **ai)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_free_ticket (krb5_context context, krb5_ticket *ticket)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_ticket (krb5_context context, const krb5_ticket *from, krb5_ticket **to)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ticket_get_client (krb5_context context, const krb5_ticket *ticket, krb5_principal *client)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ticket_get_server (krb5_context context, const krb5_ticket *ticket, krb5_principal *server)
    KRB5_LIB_FUNCTION time_t
    -KRB5_LIB_CALL 
    krb5_ticket_get_endtime (krb5_context context, const krb5_ticket *ticket)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ticket_get_authorization_data_type (krb5_context context, krb5_ticket *ticket, int type, krb5_data *data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_real_time (krb5_context context, krb5_timestamp sec, int32_t usec)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_et_list (krb5_context context, void(*func)(struct et_list **))
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_password (krb5_context context, krb5_creds *creds, const char *newpw, krb5_principal targprinc, int *result_code, krb5_data *result_code_string, krb5_data *result_string)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context (krb5_context *context)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_context (krb5_context context, krb5_context *out)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context (krb5_context context)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_config_files (krb5_context context, char **filenames)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_prepend_config_files_default (const char *filelist, char ***pfilenames)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_config_files (char ***pfilenames)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_config_files (char **filenames)
     
    KRB5_LIB_FUNCTION const krb5_enctype *KRB5_LIB_CALL krb5_kerberos_enctypes (krb5_context context)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_default_in_tkt_etypes (krb5_context context, const krb5_enctype *etypes)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_in_tkt_etypes (krb5_context context, krb5_pdu pdu_type, krb5_enctype **etypes)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_ets (krb5_context context)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_use_admin_kdc (krb5_context context, krb5_boolean flag)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_use_admin_kdc (krb5_context context)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_extra_addresses (krb5_context context, krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_extra_addresses (krb5_context context, const krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_extra_addresses (krb5_context context, krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_ignore_addresses (krb5_context context, krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_ignore_addresses (krb5_context context, const krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_ignore_addresses (krb5_context context, krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_fcache_version (krb5_context context, int version)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_fcache_version (krb5_context context, int *version)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_thread_safe (void)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_dns_canonicalize_hostname (krb5_context context, krb5_boolean flag)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_dns_canonicalize_hostname (krb5_context context)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_kdc_sec_offset (krb5_context context, int32_t *sec, int32_t *usec)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_kdc_sec_offset (krb5_context context, int32_t sec, int32_t usec)
     
    KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_get_max_time_skew (krb5_context context)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_max_time_skew (krb5_context context, time_t t)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_set_home_dir_access (krb5_context context, krb5_boolean allow)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_host_realm (krb5_context context, const krb5_realm *from, krb5_realm **to)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_cred_contents (krb5_context context, krb5_creds *c)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds_contents (krb5_context context, const krb5_creds *incred, krb5_creds *c)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds (krb5_context context, const krb5_creds *incred, krb5_creds **outcred)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds (krb5_context context, krb5_creds *c)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_compare_creds (krb5_context context, krb5_flags whichfields, const krb5_creds *mcreds, const krb5_creds *creds)
     
    KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_creds_get_ticket_flags (krb5_creds *creds)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_zero (krb5_data *p)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_free (krb5_data *p)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data (krb5_context context, krb5_data *p)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_alloc (krb5_data *p, int len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_realloc (krb5_data *p, int len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_copy (krb5_data *p, const void *data, size_t len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_data (krb5_context context, const krb5_data *indata, krb5_data **outdata)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_cmp (const krb5_data *data1, const krb5_data *data2)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_ct_cmp (const krb5_data *data1, const krb5_data *data2)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_get_err_text (krb5_context context, krb5_error_code code) KRB5_DEPRECATED_FUNCTION("Use krb5_get_error_message instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_krbhst_get_addrinfo (krb5_context context, krb5_krbhst_info *host, struct addrinfo **ai)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_ticket (krb5_context context, krb5_ticket *ticket)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_ticket (krb5_context context, const krb5_ticket *from, krb5_ticket **to)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_client (krb5_context context, const krb5_ticket *ticket, krb5_principal *client)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_server (krb5_context context, const krb5_ticket *ticket, krb5_principal *server)
     
    KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_ticket_get_endtime (krb5_context context, const krb5_ticket *ticket)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_authorization_data_type (krb5_context context, krb5_ticket *ticket, int type, krb5_data *data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_real_time (krb5_context context, krb5_timestamp sec, int32_t usec)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_add_et_list()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_et_list KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_et_list (krb5_context  context, krb5_context context,
    void(*)(struct et_list **)  func void(*)(struct et_list **) func 
    )
    -
    -
    - -

    -Add a specified list of error messages to the et list in context. Call func (probably a comerr-generated function) with a pointer to the current et_list.

    -

    Parameters:
    - - - +
    +

    Add a specified list of error messages to the et list in context. Call func (probably a comerr-generated function) with a pointer to the current et_list.

    +
    Parameters
    +
    context A kerberos context.
    func The generated com_err et function.
    + +
    contextA kerberos context.
    funcThe generated com_err et function.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - +

    + +

    ◆ krb5_add_extra_addresses()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_extra_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_extra_addresses (krb5_context  context, krb5_context context,
    krb5_addresses *  addresses krb5_addresses * addresses 
    )
    -
    -
    - -

    -Add extra address to the address list that the library will add to the client's address list when communicating with the KDC.

    -

    Parameters:
    - - - +
    +

    Add extra address to the address list that the library will add to the client's address list when communicating with the KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    addresses addreses to add
    + +
    contextKerberos 5 context.
    addressesaddreses to add
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_add_ignore_addresses()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_ignore_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_ignore_addresses (krb5_context  context, krb5_context context,
    krb5_addresses *  addresses krb5_addresses * addresses 
    )
    -
    -
    - -

    -Add extra addresses to ignore when fetching addresses from the underlaying operating system.

    -

    Parameters:
    - - - +
    +

    Add extra addresses to ignore when fetching addresses from the underlaying operating system.

    +
    Parameters
    +
    context Kerberos 5 context.
    addresses addreses to ignore
    + +
    contextKerberos 5 context.
    addressesaddreses to ignore
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_compare_creds()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_compare_creds KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_compare_creds (krb5_context  context, krb5_context context,
    krb5_flags  whichfields, krb5_flags whichfields,
    const krb5_creds *  mcreds, const krb5_creds * mcreds,
    const krb5_creds *  creds const krb5_creds * creds 
    )
    -
    -
    - -

    -Return TRUE if `mcreds' and `creds' are equal (`whichfields' determines what equal means).

    -The following flags, set in whichfields affects the comparison:

      -
    • KRB5_TC_MATCH_SRV_NAMEONLY Consider all realms equal when comparing the service principal.
    • KRB5_TC_MATCH_KEYTYPE Compare enctypes.
    • KRB5_TC_MATCH_FLAGS_EXACT Make sure that the ticket flags are identical.
    • KRB5_TC_MATCH_FLAGS Make sure that all ticket flags set in mcreds are also present in creds .
    • KRB5_TC_MATCH_TIMES_EXACT Compares the ticket times exactly.
    • KRB5_TC_MATCH_TIMES Compares only the expiration times of the creds.
    • KRB5_TC_MATCH_AUTHDATA Compares the authdata fields.
    • KRB5_TC_MATCH_2ND_TKT Compares the second tickets (used by user-to-user authentication).
    • KRB5_TC_MATCH_IS_SKEY Compares the existance of the second ticket.
    -

    -

    Parameters:
    - - - - - +
    +

    Return TRUE if ‘mcreds’ and ‘creds’ are equal (‘whichfields’ determines what equal means).

    +

    The following flags, set in whichfields affects the comparison:

      +
    • KRB5_TC_MATCH_SRV_NAMEONLY Consider all realms equal when comparing the service principal.
    • +
    • KRB5_TC_MATCH_KEYTYPE Compare enctypes.
    • +
    • KRB5_TC_MATCH_FLAGS_EXACT Make sure that the ticket flags are identical.
    • +
    • KRB5_TC_MATCH_FLAGS Make sure that all ticket flags set in mcreds are also present in creds .
    • +
    • KRB5_TC_MATCH_TIMES_EXACT Compares the ticket times exactly.
    • +
    • KRB5_TC_MATCH_TIMES Compares only the expiration times of the creds.
    • +
    • KRB5_TC_MATCH_AUTHDATA Compares the authdata fields.
    • +
    • KRB5_TC_MATCH_2ND_TKT Compares the second tickets (used by user-to-user authentication).
    • +
    • KRB5_TC_MATCH_IS_SKEY Compares the existance of the second ticket.
    • +
    +
    Parameters
    +
    context Kerberos 5 context.
    whichfields which fields to compare.
    mcreds cred to compare with.
    creds cred to compare with.
    + + + +
    contextKerberos 5 context.
    whichfieldswhich fields to compare.
    mcredscred to compare with.
    credscred to compare with.
    +
    -
    Returns:
    return TRUE if mcred and creds are equal, FALSE if not.
    +
    Returns
    return TRUE if mcred and creds are equal, FALSE if not.
    -

    - + + +

    ◆ krb5_copy_context()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_context KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_context (krb5_context  context, krb5_context context,
    krb5_context *  out krb5_context * out 
    )
    -
    -
    - -

    -Make a copy for the Kerberos 5 context, the new krb5_context shoud be freed with krb5_free_context().

    -

    Parameters:
    - - - +
    +

    Make a copy for the Kerberos 5 context, the new krb5_context shoud be freed with krb5_free_context().

    +
    Parameters
    +
    context the Kerberos context to copy
    out the copy of the Kerberos, set to NULL error.
    + +
    contextthe Kerberos context to copy
    outthe copy of the Kerberos, set to NULL error.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_copy_creds()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds (krb5_context  context, krb5_context context,
    const krb5_creds *  incred, const krb5_creds * incred,
    krb5_creds **  outcred krb5_creds ** outcred 
    )
    -
    -
    - -

    -Copy krb5_creds.

    -

    Parameters:
    - - - - +
    +

    Copy krb5_creds.

    +
    Parameters
    +
    context Kerberos 5 context.
    incred source credential
    outcred destination credential, free with krb5_free_creds().
    + + +
    contextKerberos 5 context.
    incredsource credential
    outcreddestination credential, free with krb5_free_creds().
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_copy_creds_contents()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds_contents KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds_contents (krb5_context  context, krb5_context context,
    const krb5_creds *  incred, const krb5_creds * incred,
    krb5_creds *  c krb5_creds * c 
    )
    -
    -
    - -

    -Copy content of krb5_creds.

    -

    Parameters:
    - - - - +
    +

    Copy content of krb5_creds.

    +
    Parameters
    +
    context Kerberos 5 context.
    incred source credential
    c destination credential, free with krb5_free_cred_contents().
    + + +
    contextKerberos 5 context.
    incredsource credential
    cdestination credential, free with krb5_free_cred_contents().
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_copy_data()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_data KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_data (krb5_context  context, krb5_context context,
    const krb5_data *  indata, const krb5_data * indata,
    krb5_data **  outdata krb5_data ** outdata 
    )
    -
    -
    - -

    -Copy the data into a newly allocated krb5_data.

    -

    Parameters:
    - - - - +
    +

    Copy the data into a newly allocated krb5_data.

    +
    Parameters
    +
    context Kerberos 5 context.
    indata the krb5_data data to copy
    outdata new krb5_date to copy too. Free with krb5_free_data().
    + + +
    contextKerberos 5 context.
    indatathe krb5_data data to copy
    outdatanew krb5_date to copy too. Free with krb5_free_data().
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    -

    - + + +

    ◆ krb5_copy_host_realm()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_host_realm KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_host_realm (krb5_context  context, krb5_context context,
    const krb5_realm *  from, const krb5_realm * from,
    krb5_realm **  to krb5_realm ** to 
    )
    -
    -
    - -

    -Copy the list of realms from `from' to `to'.

    -

    Parameters:
    - - - - +
    +

    Copy the list of realms from ‘from’ to ‘to’.

    +
    Parameters
    +
    context Kerberos 5 context.
    from list of realms to copy from.
    to list of realms to copy to, free list of krb5_free_host_realm().
    + + +
    contextKerberos 5 context.
    fromlist of realms to copy from.
    tolist of realms to copy to, free list of krb5_free_host_realm().
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_copy_ticket()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_ticket KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_ticket (krb5_context  context, krb5_context context,
    const krb5_ticket *  from, const krb5_ticket * from,
    krb5_ticket **  to krb5_ticket ** to 
    )
    -
    -
    - -

    -Copy ticket and content

    -

    Parameters:
    - - - - +
    +

    Copy ticket and content

    +
    Parameters
    +
    context a Kerberos 5 context
    from ticket to copy
    to new copy of ticket, free with krb5_free_ticket()
    + + +
    contexta Kerberos 5 context
    fromticket to copy
    tonew copy of ticket, free with krb5_free_ticket()
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_creds_get_ticket_flags()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_creds_get_ticket_flags KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_creds_get_ticket_flags (krb5_creds *  creds  ) krb5_creds * creds)
    -
    -
    - -

    -Returns the ticket flags for the credentials in creds. See also krb5_ticket_get_flags().

    -

    Parameters:
    - - +
    +

    Returns the ticket flags for the credentials in creds. See also krb5_ticket_get_flags().

    +
    Parameters
    +
    creds credential to get ticket flags from
    +
    credscredential to get ticket flags from
    +
    -
    Returns:
    ticket flags
    +
    Returns
    ticket flags
    -

    - + + +

    ◆ krb5_data_alloc()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_alloc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_alloc (krb5_data *  p, krb5_data * p,
    int  len int len 
    )
    -
    -
    - -

    -Allocate data of and krb5_data.

    -

    Parameters:
    - - - +
    +

    Allocate data of and krb5_data.

    +
    Parameters
    +
    p krb5_data to allocate.
    len size to allocate.
    + +
    pkrb5_data to allocate.
    lensize to allocate.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    -

    - + + +

    ◆ krb5_data_cmp()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_cmp KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_cmp (const krb5_data *  data1, const krb5_data * data1,
    const krb5_data *  data2 const krb5_data * data2 
    )
    -
    -
    - -

    -Compare to data.

    -

    Parameters:
    - - - +
    +

    Compare to data.

    +
    Parameters
    +
    data1 krb5_data to compare
    data2 krb5_data to compare
    + +
    data1krb5_data to compare
    data2krb5_data to compare
    +
    -
    Returns:
    return the same way as memcmp(), useful when sorting.
    +
    Returns
    return the same way as memcmp(), useful when sorting.
    -

    - + + +

    ◆ krb5_data_copy()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_copy KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_copy (krb5_data *  p, krb5_data * p,
    const void *  data, const void * data,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Copy the data of len into the krb5_data.

    -

    Parameters:
    - - - - +
    +

    Copy the data of len into the krb5_data.

    +
    Parameters
    +
    p krb5_data to copy into.
    data data to copy..
    len new size.
    + + +
    pkrb5_data to copy into.
    datadata to copy..
    lennew size.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    -

    - + + +

    ◆ krb5_data_ct_cmp()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_ct_cmp KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_ct_cmp (const krb5_data *  data1, const krb5_data * data1,
    const krb5_data *  data2 const krb5_data * data2 
    )
    -
    -
    - -

    -Compare to data not exposing timing information from the checksum data

    -

    Parameters:
    - - - +
    +

    Compare to data not exposing timing information from the checksum data

    +
    Parameters
    +
    data1 krb5_data to compare
    data2 krb5_data to compare
    + +
    data1krb5_data to compare
    data2krb5_data to compare
    +
    -
    Returns:
    returns zero for same data, otherwise non zero.
    +
    Returns
    returns zero for same data, otherwise non zero.
    -

    - + + +

    ◆ krb5_data_free()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_free KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_free (krb5_data *  p  ) krb5_data * p)
    -
    -
    - -

    -Free the content of krb5_data structure, its ok to free a zeroed structure (with memset() or krb5_data_zero()). When done, the structure will be zeroed. The same function is called krb5_free_data_contents() in MIT Kerberos.

    -

    Parameters:
    - - +
    +

    Free the content of krb5_data structure, its ok to free a zeroed structure (with memset() or krb5_data_zero()). When done, the structure will be zeroed. The same function is called krb5_free_data_contents() in MIT Kerberos.

    +
    Parameters
    +
    p krb5_data to free.
    +
    pkrb5_data to free.
    +
    -

    - + + +

    ◆ krb5_data_realloc()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_realloc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_realloc (krb5_data *  p, krb5_data * p,
    int  len int len 
    )
    -
    -
    - -

    -Grow (or shrink) the content of krb5_data to a new size.

    -

    Parameters:
    - - - +
    +

    Grow (or shrink) the content of krb5_data to a new size.

    +
    Parameters
    +
    p krb5_data to free.
    len new size.
    + +
    pkrb5_data to free.
    lennew size.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned.
    -

    - + + +

    ◆ krb5_data_zero()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_zero KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_zero (krb5_data *  p  ) krb5_data * p)
    -
    -
    - -

    -Reset the (potentially uninitalized) krb5_data structure.

    -

    Parameters:
    - - +
    +

    Reset the (potentially uninitalized) krb5_data structure.

    +
    Parameters
    +
    p krb5_data to reset.
    +
    pkrb5_data to reset.
    +
    -

    - + + +

    ◆ krb5_free_config_files()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_config_files KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_config_files (char **  filenames  ) char ** filenames)
    -
    -
    - -

    -Free a list of configuration files.

    -

    Parameters:
    - - +
    +

    Free a list of configuration files.

    +
    Parameters
    +
    filenames list, terminated with a NULL pointer, to be freed. NULL is an valid argument.
    +
    filenameslist, terminated with a NULL pointer, to be freed. NULL is an valid argument.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_free_context()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Frees the krb5_context allocated by krb5_init_context().

    -

    Parameters:
    - - +
    +

    Frees the krb5_context allocated by krb5_init_context().

    +
    Parameters
    +
    context context to be freed.
    +
    contextcontext to be freed.
    +
    -

    - + + +

    ◆ krb5_free_cred_contents()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_cred_contents KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_cred_contents (krb5_context  context, krb5_context context,
    krb5_creds *  c krb5_creds * c 
    )
    -
    -
    - -

    -Free content of krb5_creds.

    -

    Parameters:
    - - - +
    +

    Free content of krb5_creds.

    +
    Parameters
    +
    context Kerberos 5 context.
    c krb5_creds to free.
    + +
    contextKerberos 5 context.
    ckrb5_creds to free.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_free_creds()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds (krb5_context  context, krb5_context context,
    krb5_creds *  c krb5_creds * c 
    )
    -
    -
    - -

    -Free krb5_creds.

    -

    Parameters:
    - - - +
    +

    Free krb5_creds.

    +
    Parameters
    +
    context Kerberos 5 context.
    c krb5_creds to free.
    + +
    contextKerberos 5 context.
    ckrb5_creds to free.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_free_data()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data (krb5_context  context, krb5_context context,
    krb5_data *  p krb5_data * p 
    )
    -
    -
    - -

    -Free krb5_data (and its content).

    -

    Parameters:
    - - - +
    +

    Free krb5_data (and its content).

    +
    Parameters
    +
    context Kerberos 5 context.
    p krb5_data to free.
    + +
    contextKerberos 5 context.
    pkrb5_data to free.
    +
    -

    - + + +

    ◆ krb5_free_ticket()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_ticket KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_ticket (krb5_context  context, krb5_context context,
    krb5_ticket *  ticket krb5_ticket * ticket 
    )
    -
    -
    - -

    -Free ticket and content

    -

    Parameters:
    - - - +
    +

    Free ticket and content

    +
    Parameters
    +
    context a Kerberos 5 context
    ticket ticket to free
    + +
    contexta Kerberos 5 context
    ticketticket to free
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_get_default_config_files()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_config_files KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_config_files (char ***  pfilenames  ) char *** pfilenames)
    -
    -
    - -

    -Get the global configuration list.

    -

    Parameters:
    - - +
    +

    Get the global configuration list.

    +
    Parameters
    +
    pfilenames return array of filenames, should be freed with krb5_free_config_files().
    +
    pfilenamesreturn array of filenames, should be freed with krb5_free_config_files().
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_get_default_in_tkt_etypes()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_in_tkt_etypes KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_in_tkt_etypes (krb5_context  context, krb5_context context,
    krb5_pdu  pdu_type, krb5_pdu pdu_type,
    krb5_enctype **  etypes krb5_enctype ** etypes 
    )
    -
    -
    - -

    -Get the default encryption types that will be use in communcation with the KDC, clients and servers.

    -

    Parameters:
    - - - +
    +

    Get the default encryption types that will be use in communcation with the KDC, clients and servers.

    +
    Parameters
    +
    context Kerberos 5 context.
    etypes Encryption types, array terminated with ETYPE_NULL(0), caller should free array with krb5_xfree():
    + + +
    contextKerberos 5 context.
    pdu_typerequest type (AS, TGS or none)
    etypesEncryption types, array terminated with ETYPE_NULL(0), caller should free array with krb5_xfree():
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_get_dns_canonicalize_hostname()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_dns_canonicalize_hostname KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_dns_canonicalize_hostname (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Get if the library uses DNS to canonicalize hostnames.

    -

    Parameters:
    - - +
    +

    Get if the library uses DNS to canonicalize hostnames.

    +
    Parameters
    +
    context Kerberos 5 context.
    +
    contextKerberos 5 context.
    +
    -
    Returns:
    return non zero if the library uses DNS to canonicalize hostnames.
    +
    Returns
    return non zero if the library uses DNS to canonicalize hostnames.
    -

    - + + +

    ◆ krb5_get_err_text()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_extra_addresses KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_get_err_text (krb5_context  context, krb5_context context,
    krb5_addresses *  addresses krb5_error_code code 
    )
    -
    -
    - -

    -Get extra address to the address list that the library will add to the client's address list when communicating with the KDC.

    -

    Parameters:
    - - - +
    +

    Return the error string for the error code. The caller must not free the string.

    +

    This function is deprecated since its not threadsafe.

    +
    Parameters
    +
    context Kerberos 5 context.
    addresses addreses to set
    + +
    contextKerberos 5 context.
    codeKerberos error code.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    the error message matching code
    -

    - + + +

    ◆ krb5_get_extra_addresses()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_fcache_version KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_extra_addresses (krb5_context  context, krb5_context context,
    int *  version krb5_addresses * addresses 
    )
    -
    -
    - -

    -Get version of fcache that the library should use.

    -

    Parameters:
    - - - +
    +

    Get extra address to the address list that the library will add to the client's address list when communicating with the KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    version version number.
    + +
    contextKerberos 5 context.
    addressesaddreses to set
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_get_fcache_version()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_ignore_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_fcache_version (krb5_context  context, krb5_context context,
    krb5_addresses *  addresses int * version 
    )
    +
    +

    Get version of fcache that the library should use.

    +
    Parameters
    + + + +
    contextKerberos 5 context.
    versionversion number.
    +
    +
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    -
    +
    + +

    ◆ krb5_get_ignore_addresses()

    -

    -Get extra addresses to ignore when fetching addresses from the underlaying operating system.

    -

    Parameters:
    - - - +
    +
    +
    context Kerberos 5 context.
    addresses list addreses ignored
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_ignore_addresses (krb5_context context,
    krb5_addresses * addresses 
    )
    +
    +

    Get extra addresses to ignore when fetching addresses from the underlaying operating system.

    +
    Parameters
    + + +
    contextKerberos 5 context.
    addresseslist addreses ignored
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_get_kdc_sec_offset()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_kdc_sec_offset KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_kdc_sec_offset (krb5_context  context, krb5_context context,
    int32_t *  sec, int32_t * sec,
    int32_t *  usec int32_t * usec 
    )
    -
    -
    - -

    -Get current offset in time to the KDC.

    -

    Parameters:
    - - - - +
    +

    Get current offset in time to the KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    sec seconds part of offset.
    usec micro seconds part of offset.
    + + +
    contextKerberos 5 context.
    secseconds part of offset.
    usecmicro seconds part of offset.
    +
    -
    Returns:
    returns zero
    +
    Returns
    returns zero
    -

    - + + +

    ◆ krb5_get_max_time_skew()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_get_max_time_skew KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_get_max_time_skew (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Get max time skew allowed.

    -

    Parameters:
    - - +
    +

    Get max time skew allowed.

    +
    Parameters
    +
    context Kerberos 5 context.
    +
    contextKerberos 5 context.
    +
    -
    Returns:
    timeskew in seconds.
    +
    Returns
    timeskew in seconds.
    -

    - + + +

    ◆ krb5_get_use_admin_kdc()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_use_admin_kdc KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_use_admin_kdc (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Make the kerberos library default to the admin KDC.

    -

    Parameters:
    - - +
    +

    Make the kerberos library default to the admin KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    +
    contextKerberos 5 context.
    +
    -
    Returns:
    boolean flag to telling the context will use admin KDC as the default KDC.
    +
    Returns
    boolean flag to telling the context will use admin KDC as the default KDC.
    -

    - + + +

    ◆ krb5_init_context()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context (krb5_context *  context  ) krb5_context * context)
    -
    -
    - -

    -Initializes the context structure and reads the configuration file /etc/krb5.conf. The structure should be freed by calling krb5_free_context() when it is no longer being used.

    -

    Parameters:
    - - +
    +

    Initializes the context structure and reads the configuration file /etc/krb5.conf. The structure should be freed by calling krb5_free_context() when it is no longer being used.

    +
    Parameters
    +
    context pointer to returned context
    +
    contextpointer to returned context
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an errno code is returned. Failure means either that something bad happened during initialization (typically ENOMEM) or that Kerberos should not be used ENXIO.
    +
    Returns
    Returns 0 to indicate success. Otherwise an errno code is returned. Failure means either that something bad happened during initialization (typically ENOMEM) or that Kerberos should not be used ENXIO. If the function returns HEIM_ERR_RANDOM_OFFLINE, the random source is not available and later Kerberos calls might fail.
    +

    krb5_init_context() will get one random byte to make sure our random is alive. Assumption is that once the non blocking source allows us to pull bytes, its all seeded and allows us to pull more bytes.

    +

    Most Kerberos users calls krb5_init_context(), so this is useful point where we can do the checking.

    -

    - + + +

    ◆ krb5_init_ets()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_ets KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_ets (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Init the built-in ets in the Kerberos library.

    -

    Parameters:
    - - +
    +

    Init the built-in ets in the Kerberos library.

    +
    Parameters
    +
    context kerberos context to add the ets too
    +
    contextkerberos context to add the ets too
    +
    -

    - + + +

    ◆ krb5_is_thread_safe()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_thread_safe KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_thread_safe (void   ) void )
    -
    -
    - -

    -Runtime check if the Kerberos library was complied with thread support.

    -

    Returns:
    TRUE if the library was compiled with thread support, FALSE if not.
    +
    +

    Runtime check if the Kerberos library was complied with thread support.

    +
    Returns
    TRUE if the library was compiled with thread support, FALSE if not.
    -

    - + + +

    ◆ krb5_kerberos_enctypes()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION const krb5_enctype* KRB5_LIB_CALL krb5_kerberos_enctypes KRB5_LIB_FUNCTION const krb5_enctype* KRB5_LIB_CALL krb5_kerberos_enctypes (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Returns the list of Kerberos encryption types sorted in order of most preferred to least preferred encryption type. Note that some encryption types might be disabled, so you need to check with krb5_enctype_valid() before using the encryption type.

    -

    Returns:
    list of enctypes, terminated with ETYPE_NULL. Its a static array completed into the Kerberos library so the content doesn't need to be freed.
    +
    +

    Returns the list of Kerberos encryption types sorted in order of most preferred to least preferred encryption type. Note that some encryption types might be disabled, so you need to check with krb5_enctype_valid() before using the encryption type.

    +
    Returns
    list of enctypes, terminated with ETYPE_NULL. Its a static array completed into the Kerberos library so the content doesn't need to be freed.
    -

    - + + +

    ◆ krb5_krbhst_get_addrinfo()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_krbhst_get_addrinfo KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_krbhst_get_addrinfo (krb5_context  context, krb5_context context,
    krb5_krbhst_info *  host, krb5_krbhst_info * host,
    struct addrinfo **  ai struct addrinfo ** ai 
    )
    -
    -
    +
    +

    Return an ‘struct addrinfo *’ for a KDC host.

    +

    Returns an the struct addrinfo in in that corresponds to the information in ‘host’. free:ing is handled by krb5_krbhst_free, so the returned ai must not be released.

    -

    -Return an `struct addrinfo *' for a KDC host.

    -Returns an the struct addrinfo in in that corresponds to the information in `host'. free:ing is handled by krb5_krbhst_free, so the returned ai must not be released. -

    -First try this as an IP address, this allows us to add a dot at the end to stop using the search domains.

    -If the hostname contains a dot, assumes it's a FQDN and don't use search domains since that might be painfully slow when machine is disconnected from that network.

    -

    - + + +

    ◆ krb5_prepend_config_files_default()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_prepend_config_files_default KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_prepend_config_files_default (const char *  filelist, const char * filelist,
    char ***  pfilenames char *** pfilenames 
    )
    -
    -
    - -

    -Prepend the filename to the global configuration list.

    -

    Parameters:
    - - - +
    +

    Prepend the filename to the global configuration list.

    +
    Parameters
    +
    filelist a filename to add to the default list of filename
    pfilenames return array of filenames, should be freed with krb5_free_config_files().
    + +
    filelista filename to add to the default list of filename
    pfilenamesreturn array of filenames, should be freed with krb5_free_config_files().
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_set_config_files()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_config_files KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_config_files (krb5_context  context, krb5_context context,
    char **  filenames char ** filenames 
    )
    -
    -
    - -

    -Reinit the context from a new set of filenames.

    -

    Parameters:
    - - - +
    +

    Reinit the context from a new set of filenames.

    +
    Parameters
    +
    context context to add configuration too.
    filenames array of filenames, end of list is indicated with a NULL filename.
    + +
    contextcontext to add configuration too.
    filenamesarray of filenames, end of list is indicated with a NULL filename.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_set_default_in_tkt_etypes()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_default_in_tkt_etypes KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_default_in_tkt_etypes (krb5_context  context, krb5_context context,
    const krb5_enctype *  etypes const krb5_enctype * etypes 
    )
    -
    -
    - -

    -Set the default encryption types that will be use in communcation with the KDC, clients and servers.

    -

    Parameters:
    - - - +
    +

    Set the default encryption types that will be use in communcation with the KDC, clients and servers.

    +
    Parameters
    +
    context Kerberos 5 context.
    etypes Encryption types, array terminated with ETYPE_NULL (0).
    + +
    contextKerberos 5 context.
    etypesEncryption types, array terminated with ETYPE_NULL (0). A value of NULL resets the encryption types to the defaults set in the configuration file.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_set_dns_canonicalize_hostname()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_dns_canonicalize_hostname KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_dns_canonicalize_hostname (krb5_context  context, krb5_context context,
    krb5_boolean  flag krb5_boolean flag 
    )
    -
    -
    - -

    -Set if the library should use DNS to canonicalize hostnames.

    -

    Parameters:
    - - - +
    +

    Set if the library should use DNS to canonicalize hostnames.

    +
    Parameters
    +
    context Kerberos 5 context.
    flag if its dns canonicalizion is used or not.
    + +
    contextKerberos 5 context.
    flagif its dns canonicalizion is used or not.
    +
    -

    - + + +

    ◆ krb5_set_extra_addresses()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_extra_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_extra_addresses (krb5_context  context, krb5_context context,
    const krb5_addresses *  addresses const krb5_addresses * addresses 
    )
    -
    -
    - -

    -Set extra address to the address list that the library will add to the client's address list when communicating with the KDC.

    -

    Parameters:
    - - - +
    +

    Set extra address to the address list that the library will add to the client's address list when communicating with the KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    addresses addreses to set
    + +
    contextKerberos 5 context.
    addressesaddreses to set
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_set_fcache_version()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_fcache_version KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_fcache_version (krb5_context  context, krb5_context context,
    int  version int version 
    )
    -
    -
    - -

    -Set version of fcache that the library should use.

    -

    Parameters:
    - - - +
    +

    Set version of fcache that the library should use.

    +
    Parameters
    +
    context Kerberos 5 context.
    version version number.
    + +
    contextKerberos 5 context.
    versionversion number.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_set_home_dir_access()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_set_home_dir_access KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_set_home_dir_access (krb5_context  context, krb5_context context,
    krb5_boolean  allow krb5_boolean allow 
    )
    -
    -
    - -

    -Enable and disable home directory access on either the global state or the krb5_context state. By calling krb5_set_home_dir_access() with context set to NULL, the global state is configured otherwise the state for the krb5_context is modified.

    -For home directory access to be allowed, both the global state and the krb5_context state have to be allowed.

    -Administrator (root user), never uses the home directory.

    -

    Parameters:
    - - - +
    +

    Enable and disable home directory access on either the global state or the krb5_context state. By calling krb5_set_home_dir_access() with context set to NULL, the global state is configured otherwise the state for the krb5_context is modified.

    +

    For home directory access to be allowed, both the global state and the krb5_context state have to be allowed.

    +
    Parameters
    +
    context a Kerberos 5 context or NULL
    allow allow if TRUE home directory
    + +
    contexta Kerberos 5 context or NULL
    allowallow if TRUE home directory
    +
    -
    Returns:
    the old value
    +
    Returns
    the old value
    -

    - + + +

    ◆ krb5_set_ignore_addresses()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_ignore_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_ignore_addresses (krb5_context  context, krb5_context context,
    const krb5_addresses *  addresses const krb5_addresses * addresses 
    )
    -
    -
    - -

    -Set extra addresses to ignore when fetching addresses from the underlaying operating system.

    -

    Parameters:
    - - - +
    +

    Set extra addresses to ignore when fetching addresses from the underlaying operating system.

    +
    Parameters
    +
    context Kerberos 5 context.
    addresses addreses to ignore
    + +
    contextKerberos 5 context.
    addressesaddreses to ignore
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_set_kdc_sec_offset()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_kdc_sec_offset KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_kdc_sec_offset (krb5_context  context, krb5_context context,
    int32_t  sec, int32_t sec,
    int32_t  usec int32_t usec 
    )
    -
    -
    - -

    -Set current offset in time to the KDC.

    -

    Parameters:
    - - - - +
    +

    Set current offset in time to the KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    sec seconds part of offset.
    usec micro seconds part of offset.
    + + +
    contextKerberos 5 context.
    secseconds part of offset.
    usecmicro seconds part of offset.
    +
    -
    Returns:
    returns zero
    +
    Returns
    returns zero
    -

    - + + +

    ◆ krb5_set_max_time_skew()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_max_time_skew KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_max_time_skew (krb5_context  context, krb5_context context,
    time_t  t time_t t 
    )
    -
    -
    - -

    -Set max time skew allowed.

    -

    Parameters:
    - - - +
    +

    Set max time skew allowed.

    +
    Parameters
    +
    context Kerberos 5 context.
    t timeskew in seconds.
    + +
    contextKerberos 5 context.
    ttimeskew in seconds.
    +
    -

    - + + +

    ◆ krb5_set_password()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_password KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_password (krb5_context  context, krb5_context context,
    krb5_creds *  creds, krb5_creds * creds,
    const char *  newpw, const char * newpw,
    krb5_principal  targprinc, krb5_principal targprinc,
    int *  result_code, int * result_code,
    krb5_data *  result_code_string, krb5_data * result_code_string,
    krb5_data *  result_string krb5_data * result_string 
    )
    -
    -
    - -

    -Change password using creds.

    -

    Parameters:
    - - - - - - - - +
    +

    Change password using creds.

    +
    Parameters
    +
    context a Keberos context
    creds The initial kadmin/passwd for the principal or an admin principal
    newpw The new password to set
    targprinc if unset, the default principal is used.
    result_code Result code, KRB5_KPASSWD_SUCCESS is when password is changed.
    result_code_string binary message from the server, contains at least the result_code.
    result_string A message from the kpasswd service or the library in human printable form. The string is NUL terminated.
    + + + + + + +
    contexta Keberos context
    credsThe initial kadmin/passwd for the principal or an admin principal
    newpwThe new password to set
    targprincif unset, the default principal is used.
    result_codeResult code, KRB5_KPASSWD_SUCCESS is when password is changed.
    result_code_stringbinary message from the server, contains at least the result_code.
    result_stringA message from the kpasswd service or the library in human printable form. The string is NUL terminated.
    +
    -
    Returns:
    On sucess and *result_code is KRB5_KPASSWD_SUCCESS, the password is changed.
    -@ +
    Returns
    On sucess and *result_code is KRB5_KPASSWD_SUCCESS, the password is changed.
    +

    @

    + +
    -

    - + +

    ◆ krb5_set_real_time()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_real_time KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_real_time (krb5_context  context, krb5_context context,
    krb5_timestamp  sec, krb5_timestamp sec,
    int32_t  usec int32_t usec 
    )
    -
    -
    - -

    -Set the absolute time that the caller knows the kdc has so the kerberos library can calculate the relative diffrence beteen the KDC time and local system time.

    -

    Parameters:
    - - - - +
    +

    Set the absolute time that the caller knows the kdc has so the kerberos library can calculate the relative diffrence beteen the KDC time and local system time.

    +
    Parameters
    +
    context Keberos 5 context.
    sec The applications new of "now" in seconds
    usec The applications new of "now" in micro seconds
    + + +
    contextKeberos 5 context.
    secThe applications new of "now" in seconds
    usecThe applications new of "now" in micro seconds
    +
    -
    Returns:
    Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    Kerberos 5 error code, see krb5_get_error_message().
    +

    If the caller passes in a negative usec, its assumed to be unknown and the function will use the current time usec.

    -

    -If the caller passes in a negative usec, its assumed to be unknown and the function will use the current time usec.

    -

    - + + +

    ◆ krb5_set_use_admin_kdc()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_use_admin_kdc KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_use_admin_kdc (krb5_context  context, krb5_context context,
    krb5_boolean  flag krb5_boolean flag 
    )
    -
    -
    - -

    -Make the kerberos library default to the admin KDC.

    -

    Parameters:
    - - - +
    +

    Make the kerberos library default to the admin KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    flag boolean flag to select if the use the admin KDC or not.
    + +
    contextKerberos 5 context.
    flagboolean flag to select if the use the admin KDC or not.
    +
    -

    - + + +

    ◆ krb5_ticket_get_authorization_data_type()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_authorization_data_type KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_authorization_data_type (krb5_context  context, krb5_context context,
    krb5_ticket *  ticket, krb5_ticket * ticket,
    int  type, int type,
    krb5_data *  data krb5_data * data 
    )
    -
    -
    - -

    -Extract the authorization data type of type from the ticket. Store the field in data. This function is to use for kerberos applications.

    -

    Parameters:
    - - - - - +
    +

    Extract the authorization data type of type from the ticket. Store the field in data. This function is to use for kerberos applications.

    +
    Parameters
    +
    context a Kerberos 5 context
    ticket Kerberos ticket
    type type to fetch
    data returned data, free with krb5_data_free()
    + + + +
    contexta Kerberos 5 context
    ticketKerberos ticket
    typetype to fetch
    datareturned data, free with krb5_data_free()
    +
    -

    - + + +

    ◆ krb5_ticket_get_client()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_client KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_client (krb5_context  context, krb5_context context,
    const krb5_ticket *  ticket, const krb5_ticket * ticket,
    krb5_principal *  client krb5_principal * client 
    )
    -
    -
    - -

    -Return client principal in ticket

    -

    Parameters:
    - - - - +
    +

    Return client principal in ticket

    +
    Parameters
    +
    context a Kerberos 5 context
    ticket ticket to copy
    client client principal, free with krb5_free_principal()
    + + +
    contexta Kerberos 5 context
    ticketticket to copy
    clientclient principal, free with krb5_free_principal()
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_ticket_get_endtime()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_ticket_get_endtime KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_ticket_get_endtime (krb5_context  context, krb5_context context,
    const krb5_ticket *  ticket const krb5_ticket * ticket 
    )
    -
    -
    - -

    -Return end time of ticket

    -

    Parameters:
    - - - +
    +

    Return end time of ticket

    +
    Parameters
    +
    context a Kerberos 5 context
    ticket ticket to copy
    + +
    contexta Kerberos 5 context
    ticketticket to copy
    +
    -
    Returns:
    end time of ticket
    +
    Returns
    end time of ticket
    -

    - + + +

    ◆ krb5_ticket_get_server()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_server KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_server (krb5_context  context, krb5_context context,
    const krb5_ticket *  ticket, const krb5_ticket * ticket,
    krb5_principal *  server krb5_principal * server 
    )
    -
    -
    - -

    -Return server principal in ticket

    -

    Parameters:
    - - - - +
    +

    Return server principal in ticket

    +
    Parameters
    +
    context a Kerberos 5 context
    ticket ticket to copy
    server server principal, free with krb5_free_principal()
    + + +
    contexta Kerberos 5 context
    ticketticket to copy
    serverserver principal, free with krb5_free_principal()
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    +


    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__address.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__address.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__address.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__address.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 address functions +Heimdal Kerberos 5 address functions @@ -8,996 +8,980 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 address functions
    +
    -

    Heimdal Kerberos 5 address functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_sockaddr2address (krb5_context context, const struct sockaddr *sa, krb5_address *addr)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_sockaddr2port (krb5_context context, const struct sockaddr *sa, int16_t *port)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_addr2sockaddr (krb5_context context, const krb5_address *addr, struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
    KRB5_LIB_FUNCTION size_t
    -KRB5_LIB_CALL 
    krb5_max_sockaddr_size (void)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_sockaddr_uninteresting (const struct sockaddr *sa)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_h_addr2sockaddr (krb5_context context, int af, const char *addr, struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_h_addr2addr (krb5_context context, int af, const char *haddr, krb5_address *addr)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_anyaddr (krb5_context context, int af, struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_print_address (const krb5_address *addr, char *str, size_t len, size_t *ret_len)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_parse_address (krb5_context context, const char *string, krb5_addresses *addresses)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_address_order (krb5_context context, const krb5_address *addr1, const krb5_address *addr2)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_address_compare (krb5_context context, const krb5_address *addr1, const krb5_address *addr2)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_address_search (krb5_context context, const krb5_address *addr, const krb5_addresses *addrlist)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_free_address (krb5_context context, krb5_address *address)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_free_addresses (krb5_context context, krb5_addresses *addresses)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_address (krb5_context context, const krb5_address *inaddr, krb5_address *outaddr)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_addresses (krb5_context context, const krb5_addresses *inaddr, krb5_addresses *outaddr)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_append_addresses (krb5_context context, krb5_addresses *dest, const krb5_addresses *source)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_make_addrport (krb5_context context, krb5_address **res, const krb5_address *addr, int16_t port)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_address_prefixlen_boundary (krb5_context context, const krb5_address *inaddr, unsigned long prefixlen, krb5_address *low, krb5_address *high)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2address (krb5_context context, const struct sockaddr *sa, krb5_address *addr)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2port (krb5_context context, const struct sockaddr *sa, int16_t *port)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_addr2sockaddr (krb5_context context, const krb5_address *addr, struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
     
    KRB5_LIB_FUNCTION size_t KRB5_LIB_CALL krb5_max_sockaddr_size (void)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_sockaddr_uninteresting (const struct sockaddr *sa)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2sockaddr (krb5_context context, int af, const char *addr, struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2addr (krb5_context context, int af, const char *haddr, krb5_address *addr)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_anyaddr (krb5_context context, int af, struct sockaddr *sa, krb5_socklen_t *sa_size, int port)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_print_address (const krb5_address *addr, char *str, size_t len, size_t *ret_len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_address (krb5_context context, const char *string, krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_address_order (krb5_context context, const krb5_address *addr1, const krb5_address *addr2)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_compare (krb5_context context, const krb5_address *addr1, const krb5_address *addr2)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_search (krb5_context context, const krb5_address *addr, const krb5_addresses *addrlist)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_address (krb5_context context, krb5_address *address)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_addresses (krb5_context context, krb5_addresses *addresses)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_address (krb5_context context, const krb5_address *inaddr, krb5_address *outaddr)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_addresses (krb5_context context, const krb5_addresses *inaddr, krb5_addresses *outaddr)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_append_addresses (krb5_context context, krb5_addresses *dest, const krb5_addresses *source)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_addrport (krb5_context context, krb5_address **res, const krb5_address *addr, int16_t port)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_address_prefixlen_boundary (krb5_context context, const krb5_address *inaddr, unsigned long prefixlen, krb5_address *low, krb5_address *high)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_addr2sockaddr()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_addr2sockaddr KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_addr2sockaddr (krb5_context  context, krb5_context context,
    const krb5_address *  addr, const krb5_address * addr,
    struct sockaddr *  sa, struct sockaddr * sa,
    krb5_socklen_t *  sa_size, krb5_socklen_t * sa_size,
    int  port int port 
    )
    -
    -
    - -

    -krb5_addr2sockaddr sets the "struct sockaddr sockaddr" from addr and port. The argument sa_size should initially contain the size of the sa and after the call, it will contain the actual length of the address. In case of the sa is too small to fit the whole address, the up to *sa_size will be stored, and then *sa_size will be set to the required length.

    -

    Parameters:
    - - - - - - +
    +

    krb5_addr2sockaddr sets the "struct sockaddr sockaddr" from addr and port. The argument sa_size should initially contain the size of the sa and after the call, it will contain the actual length of the address. In case of the sa is too small to fit the whole address, the up to *sa_size will be stored, and then *sa_size will be set to the required length.

    +
    Parameters
    +
    context a Keberos context
    addr the address to copy the from
    sa the struct sockaddr that will be filled in
    sa_size pointer to length of sa, and after the call, it will contain the actual length of the address.
    port set port in sa.
    + + + + +
    contexta Keberos context
    addrthe address to copy the from
    sathe struct sockaddr that will be filled in
    sa_sizepointer to length of sa, and after the call, it will contain the actual length of the address.
    portset port in sa.
    +
    -
    Returns:
    Return an error code or 0. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported.
    +
    Returns
    Return an error code or 0. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported.
    -

    - +

    + +

    ◆ krb5_address_compare()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_compare KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_compare (krb5_context  context, krb5_context context,
    const krb5_address *  addr1, const krb5_address * addr1,
    const krb5_address *  addr2 const krb5_address * addr2 
    )
    -
    -
    - -

    -krb5_address_compare compares the addresses addr1 and addr2. Returns TRUE if the two addresses are the same.

    -

    Parameters:
    - - - - +
    +

    krb5_address_compare compares the addresses addr1 and addr2. Returns TRUE if the two addresses are the same.

    +
    Parameters
    +
    context a Keberos context
    addr1 address to compare
    addr2 address to compare
    + + +
    contexta Keberos context
    addr1address to compare
    addr2address to compare
    +
    -
    Returns:
    Return an TRUE is the address are the same FALSE if not
    +
    Returns
    Return an TRUE is the address are the same FALSE if not
    -

    - + + +

    ◆ krb5_address_order()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_address_order KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_address_order (krb5_context  context, krb5_context context,
    const krb5_address *  addr1, const krb5_address * addr1,
    const krb5_address *  addr2 const krb5_address * addr2 
    )
    -
    -
    - -

    -krb5_address_order compares the addresses addr1 and addr2 so that it can be used for sorting addresses. If the addresses are the same address krb5_address_order will return 0. Behavies like memcmp(2).

    -

    Parameters:
    - - - - +
    +

    krb5_address_order compares the addresses addr1 and addr2 so that it can be used for sorting addresses. If the addresses are the same address krb5_address_order will return 0. Behavies like memcmp(2).

    +
    Parameters
    +
    context a Keberos context
    addr1 krb5_address to compare
    addr2 krb5_address to compare
    + + +
    contexta Keberos context
    addr1krb5_address to compare
    addr2krb5_address to compare
    +
    -
    Returns:
    < 0 if address addr1 in "less" then addr2. 0 if addr1 and addr2 is the same address, > 0 if addr2 is "less" then addr1.
    +
    Returns
    < 0 if address addr1 in "less" then addr2. 0 if addr1 and addr2 is the same address, > 0 if addr2 is "less" then addr1.
    -

    - + + +

    ◆ krb5_address_prefixlen_boundary()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_address_prefixlen_boundary KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_address_prefixlen_boundary (krb5_context  context, krb5_context context,
    const krb5_address *  inaddr, const krb5_address * inaddr,
    unsigned long  prefixlen, unsigned long prefixlen,
    krb5_address *  low, krb5_address * low,
    krb5_address *  high krb5_address * high 
    )
    -
    -
    - -

    -Calculate the boundary addresses of `inaddr'/`prefixlen' and store them in `low' and `high'.

    -

    Parameters:
    - - - - - - +
    +

    Calculate the boundary addresses of ‘inaddr’/‘prefixlen’ and store them in ‘low’ and ‘high’.

    +
    Parameters
    +
    context a Keberos context
    inaddr address in prefixlen that the bondery searched
    prefixlen width of boundery
    low lowest address
    high highest address
    + + + + +
    contexta Keberos context
    inaddraddress in prefixlen that the bondery searched
    prefixlenwidth of boundery
    lowlowest address
    highhighest address
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_address_search()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_search KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_search (krb5_context  context, krb5_context context,
    const krb5_address *  addr, const krb5_address * addr,
    const krb5_addresses *  addrlist const krb5_addresses * addrlist 
    )
    -
    -
    - -

    -krb5_address_search checks if the address addr is a member of the address set list addrlist .

    -

    Parameters:
    - - - - +
    +

    krb5_address_search checks if the address addr is a member of the address set list addrlist .

    +
    Parameters
    +
    context a Keberos context.
    addr address to search for.
    addrlist list of addresses to look in for addr.
    + + +
    contexta Keberos context.
    addraddress to search for.
    addrlistlist of addresses to look in for addr.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_anyaddr()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_anyaddr KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_anyaddr (krb5_context  context, krb5_context context,
    int  af, int af,
    struct sockaddr *  sa, struct sockaddr * sa,
    krb5_socklen_t *  sa_size, krb5_socklen_t * sa_size,
    int  port int port 
    )
    -
    -
    - -

    -krb5_anyaddr fills in a "struct sockaddr sa" that can be used to bind(2) to. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address.

    -

    Parameters:
    - - - - - - +
    +

    krb5_anyaddr fills in a "struct sockaddr sa" that can be used to bind(2) to. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address.

    +
    Parameters
    +
    context a Keberos context
    af address family
    sa sockaddr
    sa_size lenght of sa.
    port for to fill into sa.
    + + + + +
    contexta Keberos context
    afaddress family
    sasockaddr
    sa_sizelenght of sa.
    portfor to fill into sa.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_append_addresses()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_append_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_append_addresses (krb5_context  context, krb5_context context,
    krb5_addresses *  dest, krb5_addresses * dest,
    const krb5_addresses *  source const krb5_addresses * source 
    )
    -
    -
    - -

    -krb5_append_addresses adds the set of addresses in source to dest. While copying the addresses, duplicates are also sorted out.

    -

    Parameters:
    - - - - +
    +

    krb5_append_addresses adds the set of addresses in source to dest. While copying the addresses, duplicates are also sorted out.

    +
    Parameters
    +
    context a Keberos context
    dest destination of copy operation
    source adresses that are going to be added to dest
    + + +
    contexta Keberos context
    destdestination of copy operation
    sourceadresses that are going to be added to dest
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_copy_address()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_address KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_address (krb5_context  context, krb5_context context,
    const krb5_address *  inaddr, const krb5_address * inaddr,
    krb5_address *  outaddr krb5_address * outaddr 
    )
    -
    -
    - -

    -krb5_copy_address copies the content of address inaddr to outaddr.

    -

    Parameters:
    - - - - +
    +

    krb5_copy_address copies the content of address inaddr to outaddr.

    +
    Parameters
    +
    context a Keberos context
    inaddr pointer to source address
    outaddr pointer to destination address
    + + +
    contexta Keberos context
    inaddrpointer to source address
    outaddrpointer to destination address
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_copy_addresses()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_addresses (krb5_context  context, krb5_context context,
    const krb5_addresses *  inaddr, const krb5_addresses * inaddr,
    krb5_addresses *  outaddr krb5_addresses * outaddr 
    )
    -
    -
    - -

    -krb5_copy_addresses copies the content of addresses inaddr to outaddr.

    -

    Parameters:
    - - - - +
    +

    krb5_copy_addresses copies the content of addresses inaddr to outaddr.

    +
    Parameters
    +
    context a Keberos context
    inaddr pointer to source addresses
    outaddr pointer to destination addresses
    + + +
    contexta Keberos context
    inaddrpointer to source addresses
    outaddrpointer to destination addresses
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_free_address()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_address KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_address (krb5_context  context, krb5_context context,
    krb5_address *  address krb5_address * address 
    )
    -
    -
    - -

    -krb5_free_address frees the data stored in the address that is alloced with any of the krb5_address functions.

    -

    Parameters:
    - - - +
    +

    krb5_free_address frees the data stored in the address that is alloced with any of the krb5_address functions.

    +
    Parameters
    +
    context a Keberos context
    address addresss to be freed.
    + +
    contexta Keberos context
    addressaddresss to be freed.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_free_addresses()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_addresses KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_addresses (krb5_context  context, krb5_context context,
    krb5_addresses *  addresses krb5_addresses * addresses 
    )
    -
    -
    - -

    -krb5_free_addresses frees the data stored in the address that is alloced with any of the krb5_address functions.

    -

    Parameters:
    - - - +
    +

    krb5_free_addresses frees the data stored in the address that is alloced with any of the krb5_address functions.

    +
    Parameters
    +
    context a Keberos context
    addresses addressses to be freed.
    + +
    contexta Keberos context
    addressesaddressses to be freed.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_h_addr2addr()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2addr KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2addr (krb5_context  context, krb5_context context,
    int  af, int af,
    const char *  haddr, const char * haddr,
    krb5_address *  addr krb5_address * addr 
    )
    -
    -
    - -

    -krb5_h_addr2addr works like krb5_h_addr2sockaddr with the exception that it operates on a krb5_address instead of a struct sockaddr.

    -

    Parameters:
    - - - - - +
    +

    krb5_h_addr2addr works like krb5_h_addr2sockaddr with the exception that it operates on a krb5_address instead of a struct sockaddr.

    +
    Parameters
    +
    context a Keberos context
    af address family
    haddr host address from struct hostent.
    addr returned krb5_address.
    + + + +
    contexta Keberos context
    afaddress family
    haddrhost address from struct hostent.
    addrreturned krb5_address.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_h_addr2sockaddr()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2sockaddr KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2sockaddr (krb5_context  context, krb5_context context,
    int  af, int af,
    const char *  addr, const char * addr,
    struct sockaddr *  sa, struct sockaddr * sa,
    krb5_socklen_t *  sa_size, krb5_socklen_t * sa_size,
    int  port int port 
    )
    -
    -
    - -

    -krb5_h_addr2sockaddr initializes a "struct sockaddr sa" from af and the "struct hostent" (see gethostbyname(3) ) h_addr_list component. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address.

    -

    Parameters:
    - - - - - - - +
    +

    krb5_h_addr2sockaddr initializes a "struct sockaddr sa" from af and the "struct hostent" (see gethostbyname(3) ) h_addr_list component. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address.

    +
    Parameters
    +
    context a Keberos context
    af addresses
    addr address
    sa returned struct sockaddr
    sa_size size of sa
    port port to set in sa.
    + + + + + +
    contexta Keberos context
    afaddresses
    addraddress
    sareturned struct sockaddr
    sa_sizesize of sa
    portport to set in sa.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_make_addrport()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_addrport KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_addrport (krb5_context  context, krb5_context context,
    krb5_address **  res, krb5_address ** res,
    const krb5_address *  addr, const krb5_address * addr,
    int16_t  port int16_t port 
    )
    -
    -
    - -

    -Create an address of type KRB5_ADDRESS_ADDRPORT from (addr, port)

    -

    Parameters:
    - - - - - +
    +

    Create an address of type KRB5_ADDRESS_ADDRPORT from (addr, port)

    +
    Parameters
    +
    context a Keberos context
    res built address from addr/port
    addr address to use
    port port to use
    + + + +
    contexta Keberos context
    resbuilt address from addr/port
    addraddress to use
    portport to use
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_max_sockaddr_size()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION size_t KRB5_LIB_CALL krb5_max_sockaddr_size KRB5_LIB_FUNCTION size_t KRB5_LIB_CALL krb5_max_sockaddr_size (void   ) void )
    -
    -
    - -

    -krb5_max_sockaddr_size returns the max size of the .Li struct sockaddr that the Kerberos library will return.

    -

    Returns:
    Return an size_t of the maximum struct sockaddr.
    +
    +

    krb5_max_sockaddr_size returns the max size of the .Li struct sockaddr that the Kerberos library will return.

    +
    Returns
    Return an size_t of the maximum struct sockaddr.
    -

    - + + +

    ◆ krb5_parse_address()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_address KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_address (krb5_context  context, krb5_context context,
    const char *  string, const char * string,
    krb5_addresses *  addresses krb5_addresses * addresses 
    )
    -
    -
    - -

    -krb5_parse_address returns the resolved hostname in string to the krb5_addresses addresses .

    -

    Parameters:
    - - - - +
    +

    krb5_parse_address returns the resolved hostname in string to the krb5_addresses addresses .

    +
    Parameters
    +
    context a Keberos context
    string 
    addresses 
    + + +
    contexta Keberos context
    string
    addresses
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_print_address()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_print_address KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_print_address (const krb5_address *  addr, const krb5_address * addr,
    char *  str, char * str,
    size_t  len, size_t len,
    size_t *  ret_len size_t * ret_len 
    )
    -
    -
    - -

    -krb5_print_address prints the address in addr to the string string that have the length len. If ret_len is not NULL, it will be filled with the length of the string if size were unlimited (not including the final NUL) .

    -

    Parameters:
    - - - - - +
    +

    krb5_print_address prints the address in addr to the string string that have the length len. If ret_len is not NULL, it will be filled with the length of the string if size were unlimited (not including the final NUL) .

    +
    Parameters
    +
    addr address to be printed
    str pointer string to print the address into
    len length that will fit into area pointed to by "str".
    ret_len return length the str.
    + + + +
    addraddress to be printed
    strpointer string to print the address into
    lenlength that will fit into area pointed to by "str".
    ret_lenreturn length the str.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_sockaddr2address()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2address KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2address (krb5_context  context, krb5_context context,
    const struct sockaddr *  sa, const struct sockaddr * sa,
    krb5_address *  addr krb5_address * addr 
    )
    -
    -
    - -

    -krb5_sockaddr2address stores a address a "struct sockaddr" sa in the krb5_address addr.

    -

    Parameters:
    - - - - +
    +

    krb5_sockaddr2address stores a address a "struct sockaddr" sa in the krb5_address addr.

    +
    Parameters
    +
    context a Keberos context
    sa a struct sockaddr to extract the address from
    addr an Kerberos 5 address to store the address in.
    + + +
    contexta Keberos context
    saa struct sockaddr to extract the address from
    addran Kerberos 5 address to store the address in.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_sockaddr2port()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2port KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2port (krb5_context  context, krb5_context context,
    const struct sockaddr *  sa, const struct sockaddr * sa,
    int16_t *  port int16_t * port 
    )
    -
    -
    - -

    -krb5_sockaddr2port extracts a port (if possible) from a "struct sockaddr.

    -

    Parameters:
    - - - - +
    +

    krb5_sockaddr2port extracts a port (if possible) from a "struct sockaddr.

    +
    Parameters
    +
    context a Keberos context
    sa a struct sockaddr to extract the port from
    port a pointer to an int16_t store the port in.
    + + +
    contexta Keberos context
    saa struct sockaddr to extract the port from
    porta pointer to an int16_t store the port in.
    +
    -
    Returns:
    Return an error code or 0. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported.
    +
    Returns
    Return an error code or 0. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported.
    -

    - + + +

    ◆ krb5_sockaddr_uninteresting()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_sockaddr_uninteresting KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_sockaddr_uninteresting (const struct sockaddr *  sa  ) const struct sockaddr * sa)
    -
    -
    - -

    -krb5_sockaddr_uninteresting returns TRUE for all .Fa sa that the kerberos library thinks are uninteresting. One example are link local addresses.

    -

    Parameters:
    - - +
    +

    krb5_sockaddr_uninteresting returns TRUE for all .Fa sa that the kerberos library thinks are uninteresting. One example are link local addresses.

    +
    Parameters
    +
    sa pointer to struct sockaddr that might be interesting.
    +
    sapointer to struct sockaddr that might be interesting.
    +
    -
    Returns:
    Return a non zero for uninteresting addresses.
    +
    Returns
    Return a non zero for uninteresting addresses.
    -

    +


    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__auth.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__auth.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__auth.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__auth.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 authentication functions +Heimdal Kerberos 5 authentication functions @@ -8,313 +8,313 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 authentication functions
    +
    -

    Heimdal Kerberos 5 authentication functions

    - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_rd_req_in_ctx_alloc (krb5_context context, krb5_rd_req_in_ctx *ctx)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_rd_req_in_set_keytab (krb5_context context, krb5_rd_req_in_ctx in, krb5_keytab keytab)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_rd_req_in_set_pac_check (krb5_context context, krb5_rd_req_in_ctx in, krb5_boolean flag)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_rd_req_out_get_server (krb5_context context, krb5_rd_req_out_ctx out, krb5_principal *principal)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_rd_req_out_ctx_free (krb5_context context, krb5_rd_req_out_ctx ctx)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_rd_req_ctx (krb5_context context, krb5_auth_context *auth_context, const krb5_data *inbuf, krb5_const_principal server, krb5_rd_req_in_ctx inctx, krb5_rd_req_out_ctx *outctx)
    + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_ctx_alloc (krb5_context context, krb5_rd_req_in_ctx *ctx)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_keytab (krb5_context context, krb5_rd_req_in_ctx in, krb5_keytab keytab)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_pac_check (krb5_context context, krb5_rd_req_in_ctx in, krb5_boolean flag)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_out_get_server (krb5_context context, krb5_rd_req_out_ctx out, krb5_principal *principal)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_rd_req_out_ctx_free (krb5_context context, krb5_rd_req_out_ctx ctx)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_ctx (krb5_context context, krb5_auth_context *auth_context, const krb5_data *inbuf, krb5_const_principal server, krb5_rd_req_in_ctx inctx, krb5_rd_req_out_ctx *outctx)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_rd_req_ctx()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_ctx KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_ctx (krb5_context  context, krb5_context context,
    krb5_auth_context *  auth_context, krb5_auth_context * auth_context,
    const krb5_data *  inbuf, const krb5_data * inbuf,
    krb5_const_principal  server, krb5_const_principal server,
    krb5_rd_req_in_ctx  inctx, krb5_rd_req_in_ctx inctx,
    krb5_rd_req_out_ctx *  outctx krb5_rd_req_out_ctx * outctx 
    )
    -
    -
    - -

    -The core server function that verify application authentication requests from clients.

    -

    Parameters:
    - - - - - - - +
    +

    The core server function that verify application authentication requests from clients.

    +
    Parameters
    +
    context Keberos 5 context.
    auth_context the authentication context, can be NULL, then default values for the authentication context will used.
    inbuf the (AP-REQ) authentication buffer
    server the server with authenticate as, if NULL the function will try to find any available credential in the keytab that will verify the reply. The function will prefer the server the server client specified in the AP-REQ, but if there is no mach, it will try all keytab entries for a match. This have serious performance issues for larger keytabs.
    inctx control the behavior of the function, if NULL, the default behavior is used.
    outctx the return outctx, free with krb5_rd_req_out_ctx_free().
    + + + + + +
    contextKeberos 5 context.
    auth_contextthe authentication context, can be NULL, then default values for the authentication context will used.
    inbufthe (AP-REQ) authentication buffer
    serverthe server to authenticate to. If NULL the function will try to find any available credential in the keytab that will verify the reply. The function will prefer the server specified in the AP-REQ, but if there is no mach, it will try all keytab entries for a match. This has serious performance issues for large keytabs.
    inctxcontrol the behavior of the function, if NULL, the default behavior is used.
    outctxthe return outctx, free with krb5_rd_req_out_ctx_free().
    +
    -
    Returns:
    Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    Kerberos 5 error code, see krb5_get_error_message().
    -

    - +

    + +

    ◆ krb5_rd_req_in_ctx_alloc()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_ctx_alloc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_ctx_alloc (krb5_context  context, krb5_context context,
    krb5_rd_req_in_ctx *  ctx krb5_rd_req_in_ctx * ctx 
    )
    -
    -
    - -

    -Allocate a krb5_rd_req_in_ctx as an input parameter to krb5_rd_req_ctx(). The caller should free the context with krb5_rd_req_in_ctx_free() when done with the context.

    -

    Parameters:
    - - - +
    +

    Allocate a krb5_rd_req_in_ctx as an input parameter to krb5_rd_req_ctx(). The caller should free the context with krb5_rd_req_in_ctx_free() when done with the context.

    +
    Parameters
    +
    context Keberos 5 context.
    ctx in ctx to krb5_rd_req_ctx().
    + +
    contextKeberos 5 context.
    ctxin ctx to krb5_rd_req_ctx().
    +
    -
    Returns:
    Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    Kerberos 5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_rd_req_in_set_keytab()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_keytab KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_keytab (krb5_context  context, krb5_context context,
    krb5_rd_req_in_ctx  in, krb5_rd_req_in_ctx in,
    krb5_keytab  keytab krb5_keytab keytab 
    )
    -
    -
    - -

    -Set the keytab that krb5_rd_req_ctx() will use.

    -

    Parameters:
    - - - - +
    +

    Set the keytab that krb5_rd_req_ctx() will use.

    +
    Parameters
    +
    context Keberos 5 context.
    in in ctx to krb5_rd_req_ctx().
    keytab keytab that krb5_rd_req_ctx() will use, only copy the pointer, so the caller must free they keytab after krb5_rd_req_in_ctx_free() is called.
    + + +
    contextKeberos 5 context.
    inin ctx to krb5_rd_req_ctx().
    keytabkeytab that krb5_rd_req_ctx() will use, only copy the pointer, so the caller must free they keytab after krb5_rd_req_in_ctx_free() is called.
    +
    -
    Returns:
    Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    Kerberos 5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_rd_req_in_set_pac_check()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_pac_check KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_pac_check (krb5_context  context, krb5_context context,
    krb5_rd_req_in_ctx  in, krb5_rd_req_in_ctx in,
    krb5_boolean  flag krb5_boolean flag 
    )
    -
    -
    - -

    -Set if krb5_rq_red() is going to check the Windows PAC or not

    -

    Parameters:
    - - - - +
    +

    Set if krb5_rq_red() is going to check the Windows PAC or not

    +
    Parameters
    +
    context Keberos 5 context.
    in krb5_rd_req_in_ctx to check the option on.
    flag flag to select if to check the pac (TRUE) or not (FALSE).
    + + +
    contextKeberos 5 context.
    inkrb5_rd_req_in_ctx to check the option on.
    flagflag to select if to check the pac (TRUE) or not (FALSE).
    +
    -
    Returns:
    Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    Kerberos 5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_rd_req_out_ctx_free()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_rd_req_out_ctx_free KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_rd_req_out_ctx_free (krb5_context  context, krb5_context context,
    krb5_rd_req_out_ctx  ctx krb5_rd_req_out_ctx ctx 
    )
    -
    -
    - -

    -Free the krb5_rd_req_out_ctx.

    -

    Parameters:
    - - - +
    +

    Free the krb5_rd_req_out_ctx.

    +
    Parameters
    +
    context Keberos 5 context.
    ctx krb5_rd_req_out_ctx context to free.
    + +
    contextKeberos 5 context.
    ctxkrb5_rd_req_out_ctx context to free.
    +
    -

    - + + +

    ◆ krb5_rd_req_out_get_server()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_out_get_server KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_out_get_server (krb5_context  context, krb5_context context,
    krb5_rd_req_out_ctx  out, krb5_rd_req_out_ctx out,
    krb5_principal *  principal krb5_principal * principal 
    )
    -
    -
    - -

    -Get the principal that was used in the request from the client. Might not match whats in the ticket if krb5_rd_req_ctx() searched in the keytab for a matching key.

    -

    Parameters:
    - - - - +
    +

    Get the principal that was used in the request from the client. Might not match whats in the ticket if krb5_rd_req_ctx() searched in the keytab for a matching key.

    +
    Parameters
    +
    context a Kerberos 5 context.
    out a krb5_rd_req_out_ctx from krb5_rd_req_ctx().
    principal return principal, free with krb5_free_principal().
    + + +
    contexta Kerberos 5 context.
    outa krb5_rd_req_out_ctx from krb5_rd_req_ctx().
    principalreturn principal, free with krb5_free_principal().
    +
    -

    +


    -Generated on Wed Jan 11 14:07:50 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ccache.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ccache.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ccache.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ccache.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 credential cache functions +Heimdal Kerberos 5 credential cache functions @@ -8,2257 +8,2245 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 credential cache functions
    +
    -

    Heimdal Kerberos 5 credential cache functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_register (krb5_context context, const krb5_cc_ops *ops, krb5_boolean override)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_resolve (krb5_context context, const char *name, krb5_ccache *id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_new_unique (krb5_context context, const char *type, const char *hint, krb5_ccache *id)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_cc_get_name (krb5_context context, krb5_ccache id)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_cc_get_type (krb5_context context, krb5_ccache id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_full_name (krb5_context context, krb5_ccache id, char **str)
    KRB5_LIB_FUNCTION const
    -krb5_cc_ops *KRB5_LIB_CALL 
    krb5_cc_get_ops (krb5_context context, krb5_ccache id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_switch (krb5_context context, krb5_ccache id)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_cc_support_switch (krb5_context context, const char *type)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_set_default_name (krb5_context context, const char *name)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_cc_default_name (krb5_context context)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_default (krb5_context context, krb5_ccache *id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_initialize (krb5_context context, krb5_ccache id, krb5_principal primary_principal)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_destroy (krb5_context context, krb5_ccache id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_close (krb5_context context, krb5_ccache id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_store_cred (krb5_context context, krb5_ccache id, krb5_creds *creds)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_retrieve_cred (krb5_context context, krb5_ccache id, krb5_flags whichfields, const krb5_creds *mcreds, krb5_creds *creds)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_principal (krb5_context context, krb5_ccache id, krb5_principal *principal)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_start_seq_get (krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_next_cred (krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor, krb5_creds *creds)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_end_seq_get (krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_remove_cred (krb5_context context, krb5_ccache id, krb5_flags which, krb5_creds *cred)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_set_flags (krb5_context context, krb5_ccache id, krb5_flags flags)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_flags (krb5_context context, krb5_ccache id, krb5_flags *flags)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_copy_match_f (krb5_context context, const krb5_ccache from, krb5_ccache to, krb5_boolean(*match)(krb5_context, void *, const krb5_creds *), void *matchctx, unsigned int *matched)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_copy_cache (krb5_context context, const krb5_ccache from, krb5_ccache to)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_version (krb5_context context, const krb5_ccache id)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_cc_clear_mcred (krb5_creds *mcred)
    KRB5_LIB_FUNCTION const
    -krb5_cc_ops *KRB5_LIB_CALL 
    krb5_cc_get_prefix_ops (krb5_context context, const char *prefix)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_cache_get_first (krb5_context context, const char *type, krb5_cc_cache_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_cache_next (krb5_context context, krb5_cc_cache_cursor cursor, krb5_ccache *id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_cache_end_seq_get (krb5_context context, krb5_cc_cache_cursor cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_cache_match (krb5_context context, krb5_principal client, krb5_ccache *id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_move (krb5_context context, krb5_ccache from, krb5_ccache to)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_is_config_principal (krb5_context context, krb5_const_principal principal)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_set_config (krb5_context context, krb5_ccache id, krb5_const_principal principal, const char *name, krb5_data *data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_config (krb5_context context, krb5_ccache id, krb5_const_principal principal, const char *name, krb5_data *data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cccol_cursor_new (krb5_context context, krb5_cccol_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cccol_cursor_next (krb5_context context, krb5_cccol_cursor cursor, krb5_ccache *cache)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cccol_cursor_free (krb5_context context, krb5_cccol_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_last_change_time (krb5_context context, krb5_ccache id, krb5_timestamp *mtime)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cccol_last_change_time (krb5_context context, const char *type, krb5_timestamp *mtime)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_friendly_name (krb5_context context, krb5_ccache id, char **name)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_set_friendly_name (krb5_context context, krb5_ccache id, const char *name)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_lifetime (krb5_context context, krb5_ccache id, time_t *t)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_set_kdc_offset (krb5_context context, krb5_ccache id, krb5_deltat offset)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_get_kdc_offset (krb5_context context, krb5_ccache id, krb5_deltat *offset)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_gen_new (krb5_context context, const krb5_cc_ops *ops, krb5_ccache *id) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cc_copy_creds (krb5_context context, const krb5_ccache from, krb5_ccache to)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_validated_creds (krb5_context context, krb5_creds *creds, krb5_principal client, krb5_ccache ccache, char *service)

    Variables

    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_acc_ops
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_fcc_ops
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_mcc_ops
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_register (krb5_context context, const krb5_cc_ops *ops, krb5_boolean override)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_resolve (krb5_context context, const char *name, krb5_ccache *id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_new_unique (krb5_context context, const char *type, const char *hint, krb5_ccache *id)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_cc_get_name (krb5_context context, krb5_ccache id)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_cc_get_type (krb5_context context, krb5_ccache id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_full_name (krb5_context context, krb5_ccache id, char **str)
     
    KRB5_LIB_FUNCTION const krb5_cc_ops *KRB5_LIB_CALL krb5_cc_get_ops (krb5_context context, krb5_ccache id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_switch (krb5_context context, krb5_ccache id)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_cc_support_switch (krb5_context context, const char *type)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_default_name (krb5_context context, const char *name)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_cc_default_name (krb5_context context)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_default (krb5_context context, krb5_ccache *id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_initialize (krb5_context context, krb5_ccache id, krb5_principal primary_principal)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_destroy (krb5_context context, krb5_ccache id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_close (krb5_context context, krb5_ccache id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_store_cred (krb5_context context, krb5_ccache id, krb5_creds *creds)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_retrieve_cred (krb5_context context, krb5_ccache id, krb5_flags whichfields, const krb5_creds *mcreds, krb5_creds *creds)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_principal (krb5_context context, krb5_ccache id, krb5_principal *principal)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_start_seq_get (krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_next_cred (krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor, krb5_creds *creds)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_end_seq_get (krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_remove_cred (krb5_context context, krb5_ccache id, krb5_flags which, krb5_creds *cred)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_flags (krb5_context context, krb5_ccache id, krb5_flags flags)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_flags (krb5_context context, krb5_ccache id, krb5_flags *flags)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_match_f (krb5_context context, const krb5_ccache from, krb5_ccache to, krb5_boolean(*match)(krb5_context, void *, const krb5_creds *), void *matchctx, unsigned int *matched)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_cache (krb5_context context, const krb5_ccache from, krb5_ccache to)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_version (krb5_context context, const krb5_ccache id)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_cc_clear_mcred (krb5_creds *mcred)
     
    KRB5_LIB_FUNCTION const krb5_cc_ops *KRB5_LIB_CALL krb5_cc_get_prefix_ops (krb5_context context, const char *prefix)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_get_first (krb5_context context, const char *type, krb5_cc_cache_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_next (krb5_context context, krb5_cc_cache_cursor cursor, krb5_ccache *id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_end_seq_get (krb5_context context, krb5_cc_cache_cursor cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_match (krb5_context context, krb5_principal client, krb5_ccache *id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_move (krb5_context context, krb5_ccache from, krb5_ccache to)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_config_principal (krb5_context context, krb5_const_principal principal)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_config (krb5_context context, krb5_ccache id, krb5_const_principal principal, const char *name, krb5_data *data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_config (krb5_context context, krb5_ccache id, krb5_const_principal principal, const char *name, krb5_data *data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_new (krb5_context context, krb5_cccol_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_next (krb5_context context, krb5_cccol_cursor cursor, krb5_ccache *cache)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_free (krb5_context context, krb5_cccol_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_last_change_time (krb5_context context, krb5_ccache id, krb5_timestamp *mtime)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_last_change_time (krb5_context context, const char *type, krb5_timestamp *mtime)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_friendly_name (krb5_context context, krb5_ccache id, char **name)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_friendly_name (krb5_context context, krb5_ccache id, const char *name)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_lifetime (krb5_context context, krb5_ccache id, time_t *t)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_kdc_offset (krb5_context context, krb5_ccache id, krb5_deltat offset)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_kdc_offset (krb5_context context, krb5_ccache id, krb5_deltat *offset)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_gen_new (krb5_context context, const krb5_cc_ops *ops, krb5_ccache *id) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_creds (krb5_context context, const krb5_ccache from, krb5_ccache to)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_validated_creds (krb5_context context, krb5_creds *creds, krb5_principal client, krb5_ccache ccache, char *service)
     
    + + + + + + + + +

    +Variables

    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_acc_ops
     
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_dcc_ops
     
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_fcc_ops
     
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_mcc_ops
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_cc_cache_end_seq_get()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_end_seq_get KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_end_seq_get (krb5_context  context, krb5_context context,
    krb5_cc_cache_cursor  cursor krb5_cc_cache_cursor cursor 
    )
    -
    -
    - -

    -Destroy the cursor `cursor'.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Destroy the cursor ‘cursor’.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - +

    + +

    ◆ krb5_cc_cache_get_first()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_get_first KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_get_first (krb5_context  context, krb5_context context,
    const char *  type, const char * type,
    krb5_cc_cache_cursor *  cursor krb5_cc_cache_cursor * cursor 
    )
    -
    -
    - -

    -Start iterating over all caches of specified type. See also krb5_cccol_cursor_new().

    -

    Parameters:
    - - - - +
    +

    Start iterating over all caches of specified type. See also krb5_cccol_cursor_new().

    +
    Parameters
    +
    context A Kerberos 5 context
    type optional type to iterate over, if NULL, the default cache is used.
    cursor cursor should be freed with krb5_cc_cache_end_seq_get().
    + + +
    contextA Kerberos 5 context
    typeoptional type to iterate over, if NULL, the default cache is used.
    cursorcursor should be freed with krb5_cc_cache_end_seq_get().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_cache_match()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_match KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_match (krb5_context  context, krb5_context context,
    krb5_principal  client, krb5_principal client,
    krb5_ccache *  id krb5_ccache * id 
    )
    -
    -
    - -

    -Search for a matching credential cache that have the `principal' as the default principal. On success, `id' needs to be freed with krb5_cc_close() or krb5_cc_destroy().

    -

    Parameters:
    - - - - +
    +

    Search for a matching credential cache that have the ‘principal’ as the default principal. On success, ‘id’ needs to be freed with krb5_cc_close() or krb5_cc_destroy().

    +
    Parameters
    +
    context A Kerberos 5 context
    client The principal to search for
    id the returned credential cache
    + + +
    contextA Kerberos 5 context
    clientThe principal to search for
    idthe returned credential cache
    +
    -
    Returns:
    On failure, error code is returned and `id' is set to NULL.
    +
    Returns
    On failure, error code is returned and ‘id’ is set to NULL.
    -

    - + + +

    ◆ krb5_cc_cache_next()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_next KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_next (krb5_context  context, krb5_context context,
    krb5_cc_cache_cursor  cursor, krb5_cc_cache_cursor cursor,
    krb5_ccache *  id krb5_ccache * id 
    )
    -
    -
    - -

    -Retrieve the next cache pointed to by (`cursor') in `id' and advance `cursor'.

    -

    Parameters:
    - - - - +
    +

    Retrieve the next cache pointed to by (‘cursor’) in ‘id’ and advance ‘cursor’.

    +
    Parameters
    +
    context A Kerberos 5 context
    cursor the iterator cursor, returned by krb5_cc_cache_get_first()
    id next ccache
    + + +
    contextA Kerberos 5 context
    cursorthe iterator cursor, returned by krb5_cc_cache_get_first()
    idnext ccache
    +
    -
    Returns:
    Return 0 or an error code. Returns KRB5_CC_END when the end of caches is reached, see krb5_get_error_message().
    +
    Returns
    Return 0 or an error code. Returns KRB5_CC_END when the end of caches is reached, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_clear_mcred()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_cc_clear_mcred KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_cc_clear_mcred (krb5_creds *  mcred  ) krb5_creds * mcred)
    -
    -
    +
    +

    Clear ‘mcreds’ so it can be used with krb5_cc_retrieve_cred

    -

    -Clear `mcreds' so it can be used with krb5_cc_retrieve_cred

    -

    - + + +

    ◆ krb5_cc_close()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_close KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_close (krb5_context  context, krb5_context context,
    krb5_ccache  id krb5_ccache id 
    )
    -
    -
    - -

    -Stop using the ccache `id' and free the related resources.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Stop using the ccache ‘id’ and free the related resources.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_copy_cache()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_cache KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_cache (krb5_context  context, krb5_context context,
    const krb5_ccache  from, const krb5_ccache from,
    krb5_ccache  to krb5_ccache to 
    )
    -
    -
    +
    +

    Just like krb5_cc_copy_match_f(), but copy everything.

    +

    @

    -

    -Just like krb5_cc_copy_match_f(), but copy everything.

    -@

    -

    - + + +

    ◆ krb5_cc_copy_creds()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_creds (krb5_context  context, krb5_context context,
    const krb5_ccache  from, const krb5_ccache from,
    krb5_ccache  to krb5_ccache to 
    )
    -
    -
    +
    +

    MIT compat glue

    -

    -MIT compat glue

    -

    - + + +

    ◆ krb5_cc_copy_match_f()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_match_f KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_match_f (krb5_context  context, krb5_context context,
    const krb5_ccache  from, const krb5_ccache from,
    krb5_ccache  to, krb5_ccache to,
    krb5_boolean(*)(krb5_context, void *, const krb5_creds *)  match, krb5_boolean(*)(krb5_context, void *, const krb5_creds *) match,
    void *  matchctx, void * matchctx,
    unsigned int *  matched unsigned int * matched 
    )
    -
    -
    - -

    -Copy the contents of `from' to `to' if the given match function return true.

    -

    Parameters:
    - - - - - - - +
    +

    Copy the contents of ‘from’ to ‘to’ if the given match function return true.

    +
    Parameters
    +
    context A Kerberos 5 context.
    from the cache to copy data from.
    to the cache to copy data to.
    match a match function that should return TRUE if cred argument should be copied, if NULL, all credentials are copied.
    matchctx context passed to match function.
    matched set to true if there was a credential that matched, may be NULL.
    + + + + + +
    contextA Kerberos 5 context.
    fromthe cache to copy data from.
    tothe cache to copy data to.
    matcha match function that should return TRUE if cred argument should be copied, if NULL, all credentials are copied.
    matchctxcontext passed to match function.
    matchedset to true if there was a credential that matched, may be NULL.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_default()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_default KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_default (krb5_context  context, krb5_context context,
    krb5_ccache *  id krb5_ccache * id 
    )
    -
    -
    - -

    -Open the default ccache in `id'.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Open the default ccache in ‘id’.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_default_name()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_default_name KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_default_name (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Return a pointer to a context static string containing the default ccache name.

    -

    Returns:
    String to the default credential cache name.
    +
    +

    Return a pointer to a context static string containing the default ccache name.

    +
    Returns
    String to the default credential cache name.
    -

    - + + +

    ◆ krb5_cc_destroy()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_destroy KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_destroy (krb5_context  context, krb5_context context,
    krb5_ccache  id krb5_ccache id 
    )
    -
    -
    - -

    -Remove the ccache `id'.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Remove the ccache ‘id’.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_end_seq_get()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_end_seq_get KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_end_seq_get (krb5_context  context, krb5_context context,
    const krb5_ccache  id, const krb5_ccache id,
    krb5_cc_cursor *  cursor krb5_cc_cursor * cursor 
    )
    -
    -
    +
    +

    Destroy the cursor ‘cursor’.

    -

    -Destroy the cursor `cursor'.

    -

    - + + +

    ◆ krb5_cc_gen_new()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_gen_new KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_gen_new (krb5_context  context, krb5_context context,
    const krb5_cc_ops *  ops, const krb5_cc_ops * ops,
    krb5_ccache *  id krb5_ccache * id 
    )
    -
    -
    - -

    -Generate a new ccache of type `ops' in `id'.

    -Deprecated: use krb5_cc_new_unique() instead.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Generate a new ccache of type ‘ops’ in ‘id’.

    +

    Deprecated: use krb5_cc_new_unique() instead.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_get_config()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_config KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_config (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_const_principal  principal, krb5_const_principal principal,
    const char *  name, const char * name,
    krb5_data *  data krb5_data * data 
    )
    -
    -
    - -

    -Get some configuration for the credential cache in the cache.

    -

    Parameters:
    - - - - - - +
    +

    Get some configuration for the credential cache in the cache.

    +
    Parameters
    +
    context a Keberos context
    id the credential cache to store the data for
    principal configuration for a specific principal, if NULL, global for the whole cache.
    name name under which the configuraion is stored.
    data data to fetched, free with krb5_data_free()
    + + + + +
    contexta Keberos context
    idthe credential cache to store the data for
    principalconfiguration for a specific principal, if NULL, global for the whole cache.
    namename under which the configuraion is stored.
    datadata to fetched, free with krb5_data_free()
    +
    -

    - + + +

    ◆ krb5_cc_get_flags()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_flags KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_flags (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_flags *  flags krb5_flags * flags 
    )
    -
    -
    +
    +

    Get the flags of ‘id’, store them in ‘flags’.

    -

    -Get the flags of `id', store them in `flags'.

    -

    - + + +

    ◆ krb5_cc_get_friendly_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_friendly_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_friendly_name (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    char **  name char ** name 
    )
    -
    -
    - -

    -Return a friendly name on credential cache. Free the result with krb5_xfree().

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Return a friendly name on credential cache. Free the result with krb5_xfree().

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_get_full_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_full_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_full_name (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    char **  str char ** str 
    )
    -
    -
    - -

    -Return the complete resolvable name the cache

    -

    Parameters:
    - - - - +
    +

    Return the complete resolvable name the cache

    +
    Parameters
    +
    context a Keberos context
    id return pointer to a found credential cache
    str the returned name of a credential cache, free with krb5_xfree()
    + + +
    contexta Keberos context
    idreturn pointer to a found credential cache
    strthe returned name of a credential cache, free with krb5_xfree()
    +
    -
    Returns:
    Returns 0 or an error (and then *str is set to NULL).
    +
    Returns
    Returns 0 or an error (and then *str is set to NULL).
    -

    - + + +

    ◆ krb5_cc_get_kdc_offset()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_kdc_offset KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_kdc_offset (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_deltat *  offset krb5_deltat * offset 
    )
    -
    -
    - -

    -Get the time offset betwen the client and the KDC

    -If the backend doesn't support KDC offset, use the context global setting.

    -

    Parameters:
    - - - - +
    +

    Get the time offset betwen the client and the KDC

    +

    If the backend doesn't support KDC offset, use the context global setting.

    +
    Parameters
    +
    context A Kerberos 5 context.
    id a credential cache
    offset the offset in seconds
    + + +
    contextA Kerberos 5 context.
    ida credential cache
    offsetthe offset in seconds
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_get_lifetime()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_lifetime KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_lifetime (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    time_t *  t time_t * t 
    )
    -
    -
    - -

    -Get the lifetime of the initial ticket in the cache

    -Get the lifetime of the initial ticket in the cache, if the initial ticket was not found, the error code KRB5_CC_END is returned.

    -

    Parameters:
    - - - - +
    +

    Get the lifetime of the initial ticket in the cache

    +

    Get the lifetime of the initial ticket in the cache, if the initial ticket was not found, the error code KRB5_CC_END is returned.

    +
    Parameters
    +
    context A Kerberos 5 context.
    id a credential cache
    t the relative lifetime of the initial ticket
    + + +
    contextA Kerberos 5 context.
    ida credential cache
    tthe relative lifetime of the initial ticket
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    +

    If we find the start krbtgt in the cache, use that as the lifespan.

    +

    If there was no krbtgt, use the shortest lifetime of service tickets that have yet to expire. If all credentials are expired, krb5_cc_get_lifetime() will fail.

    -

    - + + +

    ◆ krb5_cc_get_name()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_name KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_name (krb5_context  context, krb5_context context,
    krb5_ccache  id krb5_ccache id 
    )
    -
    -
    +
    +

    Return the name of the ccache ‘id’

    -

    -Return the name of the ccache `id'

    -

    - + + +

    ◆ krb5_cc_get_ops()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION const krb5_cc_ops* KRB5_LIB_CALL krb5_cc_get_ops KRB5_LIB_FUNCTION const krb5_cc_ops* KRB5_LIB_CALL krb5_cc_get_ops (krb5_context  context, krb5_context context,
    krb5_ccache  id krb5_ccache id 
    )
    -
    -
    +
    +

    Return krb5_cc_ops of a the ccache ‘id’.

    -

    -Return krb5_cc_ops of a the ccache `id'.

    -

    - + + +

    ◆ krb5_cc_get_prefix_ops()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION const krb5_cc_ops* KRB5_LIB_CALL krb5_cc_get_prefix_ops KRB5_LIB_FUNCTION const krb5_cc_ops* KRB5_LIB_CALL krb5_cc_get_prefix_ops (krb5_context  context, krb5_context context,
    const char *  prefix const char * prefix 
    )
    -
    -
    - -

    -Get the cc ops that is registered in `context' to handle the prefix. prefix can be a complete credential cache name or a prefix, the function will only use part up to the first colon (:) if there is one. If prefix the argument is NULL, the default ccache implemtation is returned.

    -

    Returns:
    Returns NULL if ops not found.
    +
    +

    Get the cc ops that is registered in ‘context’ to handle the prefix. prefix can be a complete credential cache name or a prefix, the function will only use part up to the first colon (:) if there is one. If prefix the argument is NULL, the default ccache implemtation is returned.

    +
    Returns
    Returns NULL if ops not found.
    -

    - + + +

    ◆ krb5_cc_get_principal()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_principal KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_principal (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_principal *  principal krb5_principal * principal 
    )
    -
    -
    - -

    -Return the principal of `id' in `principal'.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Return the principal of ‘id’ in ‘principal’.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_get_type()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_type KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_type (krb5_context  context, krb5_context context,
    krb5_ccache  id krb5_ccache id 
    )
    -
    -
    +
    +

    Return the type of the ccache ‘id’.

    -

    -Return the type of the ccache `id'.

    -

    - + + +

    ◆ krb5_cc_get_version()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_version KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_version (krb5_context  context, krb5_context context,
    const krb5_ccache  id const krb5_ccache id 
    )
    -
    -
    +
    +

    Return the version of ‘id’.

    -

    -Return the version of `id'.

    -

    - + + +

    ◆ krb5_cc_initialize()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_initialize KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_initialize (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_principal  primary_principal krb5_principal primary_principal 
    )
    -
    -
    - -

    -Create a new ccache in `id' for `primary_principal'.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Create a new ccache in ‘id’ for ‘primary_principal’.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_last_change_time()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_last_change_time KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_last_change_time (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_timestamp *  mtime krb5_timestamp * mtime 
    )
    -
    -
    - -

    -Return the last time the credential cache was modified.

    -

    Parameters:
    - - - - +
    +

    Return the last time the credential cache was modified.

    +
    Parameters
    +
    context A Kerberos 5 context
    id The credential cache to probe
    mtime the last modification time, set to 0 on error.
    + + +
    contextA Kerberos 5 context
    idThe credential cache to probe
    mtimethe last modification time, set to 0 on error.
    +
    -
    Returns:
    Return 0 or and error. See krb5_get_error_message().
    +
    Returns
    Return 0 or and error. See krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_move()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_move KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_move (krb5_context  context, krb5_context context,
    krb5_ccache  from, krb5_ccache from,
    krb5_ccache  to krb5_ccache to 
    )
    -
    -
    - -

    -Move the content from one credential cache to another. The operation is an atomic switch.

    -

    Parameters:
    - - - - +
    +

    Move the content from one credential cache to another. The operation is an atomic switch.

    +
    Parameters
    +
    context a Keberos context
    from the credential cache to move the content from
    to the credential cache to move the content to
    + + +
    contexta Keberos context
    fromthe credential cache to move the content from
    tothe credential cache to move the content to
    +
    -
    Returns:
    On sucess, from is freed. On failure, error code is returned and from and to are both still allocated, see krb5_get_error_message().
    +
    Returns
    On sucess, from is freed. On failure, error code is returned and from and to are both still allocated, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_new_unique()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_new_unique KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_new_unique (krb5_context  context, krb5_context context,
    const char *  type, const char * type,
    const char *  hint, const char * hint,
    krb5_ccache *  id krb5_ccache * id 
    )
    -
    -
    - -

    -Generates a new unique ccache of `type` in `id'. If `type' is NULL, the library chooses the default credential cache type. The supplied `hint' (that can be NULL) is a string that the credential cache type can use to base the name of the credential on, this is to make it easier for the user to differentiate the credentials.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Generates a new unique ccache of type in ‘id’. If ‘type’ is NULL, the library chooses the default credential cache type. The supplied ‘hint’ (that can be NULL) is a string that the credential cache type can use to base the name of the credential on, this is to make it easier for the user to differentiate the credentials.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_next_cred()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_next_cred KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_next_cred (krb5_context  context, krb5_context context,
    const krb5_ccache  id, const krb5_ccache id,
    krb5_cc_cursor *  cursor, krb5_cc_cursor * cursor,
    krb5_creds *  creds krb5_creds * creds 
    )
    -
    -
    - -

    -Retrieve the next cred pointed to by (`id', `cursor') in `creds' and advance `cursor'.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Retrieve the next cred pointed to by (‘id’, ‘cursor’) in ‘creds’ and advance ‘cursor’.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_register()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_register KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_register (krb5_context  context, krb5_context context,
    const krb5_cc_ops *  ops, const krb5_cc_ops * ops,
    krb5_boolean  override krb5_boolean override 
    )
    -
    -
    - -

    -Add a new ccache type with operations `ops', overwriting any existing one if `override'.

    -

    Parameters:
    - - - - +
    +

    Add a new ccache type with operations ‘ops’, overwriting any existing one if ‘override’.

    +
    Parameters
    +
    context a Keberos context
    ops type of plugin symbol
    override flag to select if the registration is to overide an existing ops with the same name.
    + + +
    contexta Keberos context
    opstype of plugin symbol
    overrideflag to select if the registration is to overide an existing ops with the same name.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_remove_cred()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_remove_cred KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_remove_cred (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_flags  which, krb5_flags which,
    krb5_creds *  cred krb5_creds * cred 
    )
    -
    -
    +
    +

    Remove the credential identified by ‘cred’, ‘which’ from ‘id’.

    -

    -Remove the credential identified by `cred', `which' from `id'.

    -

    - + + +

    ◆ krb5_cc_resolve()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_resolve KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_resolve (krb5_context  context, krb5_context context,
    const char *  name, const char * name,
    krb5_ccache *  id krb5_ccache * id 
    )
    -
    -
    - -

    -Find and allocate a ccache in `id' from the specification in `residual'. If the ccache name doesn't contain any colon, interpret it as a file name.

    -

    Parameters:
    - - - - +
    +

    Find and allocate a ccache in ‘id’ from the specification in ‘residual’. If the ccache name doesn't contain any colon, interpret it as a file name.

    +
    Parameters
    +
    context a Keberos context.
    name string name of a credential cache.
    id return pointer to a found credential cache.
    + + +
    contexta Keberos context.
    namestring name of a credential cache.
    idreturn pointer to a found credential cache.
    +
    -
    Returns:
    Return 0 or an error code. In case of an error, id is set to NULL, see krb5_get_error_message().
    +
    Returns
    Return 0 or an error code. In case of an error, id is set to NULL, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_retrieve_cred()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_retrieve_cred KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_retrieve_cred (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_flags  whichfields, krb5_flags whichfields,
    const krb5_creds *  mcreds, const krb5_creds * mcreds,
    krb5_creds *  creds krb5_creds * creds 
    )
    -
    -
    - -

    -Retrieve the credential identified by `mcreds' (and `whichfields') from `id' in `creds'. 'creds' must be free by the caller using krb5_free_cred_contents.

    -

    Parameters:
    - - - - - - +
    +

    Retrieve the credential identified by ‘mcreds’ (and ‘whichfields’) from ‘id’ in ‘creds’. 'creds' must be free by the caller using krb5_free_cred_contents.

    +
    Parameters
    +
    context A Kerberos 5 context
    id a Kerberos 5 credential cache
    whichfields what fields to use for matching credentials, same flags as whichfields in krb5_compare_creds()
    mcreds template credential to use for comparing
    creds returned credential, free with krb5_free_cred_contents()
    + + + + +
    contextA Kerberos 5 context
    ida Kerberos 5 credential cache
    whichfieldswhat fields to use for matching credentials, same flags as whichfields in krb5_compare_creds()
    mcredstemplate credential to use for comparing
    credsreturned credential, free with krb5_free_cred_contents()
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_set_config()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_config KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_config (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_const_principal  principal, krb5_const_principal principal,
    const char *  name, const char * name,
    krb5_data *  data krb5_data * data 
    )
    -
    -
    - -

    -Store some configuration for the credential cache in the cache. Existing configuration under the same name is over-written.

    -

    Parameters:
    - - - - - - +
    +

    Store some configuration for the credential cache in the cache. Existing configuration under the same name is over-written.

    +
    Parameters
    +
    context a Keberos context
    id the credential cache to store the data for
    principal configuration for a specific principal, if NULL, global for the whole cache.
    name name under which the configuraion is stored.
    data data to store, if NULL, configure is removed.
    + + + + +
    contexta Keberos context
    idthe credential cache to store the data for
    principalconfiguration for a specific principal, if NULL, global for the whole cache.
    namename under which the configuraion is stored.
    datadata to store, if NULL, configure is removed.
    +
    -

    - + + +

    ◆ krb5_cc_set_default_name()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_default_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_default_name (krb5_context  context, krb5_context context,
    const char *  name const char * name 
    )
    -
    -
    +
    +

    Set the default cc name for ‘context’ to ‘name’.

    -

    -Set the default cc name for `context' to `name'.

    -

    - + + +

    ◆ krb5_cc_set_flags()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_flags KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_flags (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_flags  flags krb5_flags flags 
    )
    -
    -
    +
    +

    Set the flags of ‘id’ to ‘flags’.

    -

    -Set the flags of `id' to `flags'.

    -

    - + + +

    ◆ krb5_cc_set_friendly_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_friendly_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_friendly_name (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    const char *  name const char * name 
    )
    -
    -
    - -

    -Set the friendly name on credential cache.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Set the friendly name on credential cache.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_set_kdc_offset()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_kdc_offset KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_kdc_offset (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_deltat  offset krb5_deltat offset 
    )
    -
    -
    - -

    -Set the time offset betwen the client and the KDC

    -If the backend doesn't support KDC offset, use the context global setting.

    -

    Parameters:
    - - - - +
    +

    Set the time offset betwen the client and the KDC

    +

    If the backend doesn't support KDC offset, use the context global setting.

    +
    Parameters
    +
    context A Kerberos 5 context.
    id a credential cache
    offset the offset in seconds
    + + +
    contextA Kerberos 5 context.
    ida credential cache
    offsetthe offset in seconds
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_start_seq_get()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_start_seq_get KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_start_seq_get (krb5_context  context, krb5_context context,
    const krb5_ccache  id, const krb5_ccache id,
    krb5_cc_cursor *  cursor krb5_cc_cursor * cursor 
    )
    -
    -
    - -

    -Start iterating over `id', `cursor' is initialized to the beginning. Caller must free the cursor with krb5_cc_end_seq_get().

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Start iterating over ‘id’, ‘cursor’ is initialized to the beginning. Caller must free the cursor with krb5_cc_end_seq_get().

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_store_cred()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_store_cred KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_store_cred (krb5_context  context, krb5_context context,
    krb5_ccache  id, krb5_ccache id,
    krb5_creds *  creds krb5_creds * creds 
    )
    -
    -
    - -

    -Store `creds' in the ccache `id'.

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Store ‘creds’ in the ccache ‘id’.

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cc_support_switch()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_cc_support_switch KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_cc_support_switch (krb5_context  context, krb5_context context,
    const char *  type const char * type 
    )
    -
    -
    +
    +

    Return true if the default credential cache support switch

    -

    -Return true if the default credential cache support switch

    -

    - + + +

    ◆ krb5_cc_switch()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_switch KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_switch (krb5_context  context, krb5_context context,
    krb5_ccache  id krb5_ccache id 
    )
    -
    -
    - -

    -Switch the default default credential cache for a specific credcache type (and name for some implementations).

    -

    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    +

    Switch the default default credential cache for a specific credcache type (and name for some implementations).

    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cccol_cursor_free()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_free KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_free (krb5_context  context, krb5_context context,
    krb5_cccol_cursor *  cursor krb5_cccol_cursor * cursor 
    )
    -
    -
    - -

    -End an iteration and free all resources, can be done before end is reached.

    -

    Parameters:
    - - - +
    +

    End an iteration and free all resources, can be done before end is reached.

    +
    Parameters
    +
    context A Kerberos 5 context
    cursor the iteration cursor to be freed.
    + +
    contextA Kerberos 5 context
    cursorthe iteration cursor to be freed.
    +
    -
    Returns:
    Return 0 or and error, KRB5_CC_END is returned at the end of iteration. See krb5_get_error_message().
    +
    Returns
    Return 0 or and error, KRB5_CC_END is returned at the end of iteration. See krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cccol_cursor_new()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_new KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_new (krb5_context  context, krb5_context context,
    krb5_cccol_cursor *  cursor krb5_cccol_cursor * cursor 
    )
    -
    -
    - -

    -Get a new cache interation cursor that will interate over all credentials caches independent of type.

    -

    Parameters:
    - - - +
    +

    Get a new cache interation cursor that will interate over all credentials caches independent of type.

    +
    Parameters
    +
    context a Keberos context
    cursor passed into krb5_cccol_cursor_next() and free with krb5_cccol_cursor_free().
    + +
    contexta Keberos context
    cursorpassed into krb5_cccol_cursor_next() and free with krb5_cccol_cursor_free().
    +
    -
    Returns:
    Returns 0 or and error code, see krb5_get_error_message().
    +
    Returns
    Returns 0 or and error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cccol_cursor_next()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_next KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_next (krb5_context  context, krb5_context context,
    krb5_cccol_cursor  cursor, krb5_cccol_cursor cursor,
    krb5_ccache *  cache krb5_ccache * cache 
    )
    -
    -
    - -

    -Get next credential cache from the iteration.

    -

    Parameters:
    - - - - +
    +

    Get next credential cache from the iteration.

    +
    Parameters
    +
    context A Kerberos 5 context
    cursor the iteration cursor
    cache the returned cursor, pointer is set to NULL on failure and a cache on success. The returned cache needs to be freed with krb5_cc_close() or destroyed with krb5_cc_destroy(). MIT Kerberos behavies slightly diffrent and sets cache to NULL when all caches are iterated over and return 0.
    + + +
    contextA Kerberos 5 context
    cursorthe iteration cursor
    cachethe returned cursor, pointer is set to NULL on failure and a cache on success. The returned cache needs to be freed with krb5_cc_close() or destroyed with krb5_cc_destroy(). MIT Kerberos behavies slightly diffrent and sets cache to NULL when all caches are iterated over and return 0.
    +
    -
    Returns:
    Return 0 or and error, KRB5_CC_END is returned at the end of iteration. See krb5_get_error_message().
    +
    Returns
    Return 0 or and error, KRB5_CC_END is returned at the end of iteration. See krb5_get_error_message().
    -

    - + + +

    ◆ krb5_cccol_last_change_time()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_last_change_time KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_last_change_time (krb5_context  context, krb5_context context,
    const char *  type, const char * type,
    krb5_timestamp *  mtime krb5_timestamp * mtime 
    )
    -
    -
    - -

    -Return the last modfication time for a cache collection. The query can be limited to a specific cache type. If the function return 0 and mtime is 0, there was no credentials in the caches.

    -

    Parameters:
    - - - - +
    +

    Return the last modfication time for a cache collection. The query can be limited to a specific cache type. If the function return 0 and mtime is 0, there was no credentials in the caches.

    +
    Parameters
    +
    context A Kerberos 5 context
    type The credential cache to probe, if NULL, all type are traversed.
    mtime the last modification time, set to 0 on error.
    + + +
    contextA Kerberos 5 context
    typeThe credential cache to probe, if NULL, all type are traversed.
    mtimethe last modification time, set to 0 on error.
    +
    -
    Returns:
    Return 0 or and error. See krb5_get_error_message().
    +
    Returns
    Return 0 or and error. See krb5_get_error_message().
    -

    - + + +

    ◆ krb5_get_validated_creds()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_validated_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_validated_creds (krb5_context  context, krb5_context context,
    krb5_creds *  creds, krb5_creds * creds,
    krb5_principal  client, krb5_principal client,
    krb5_ccache  ccache, krb5_ccache ccache,
    char *  service char * service 
    )
    -
    -
    - -

    -Validate the newly fetch credential, see also krb5_verify_init_creds().

    -

    Parameters:
    - - - - - - +
    +

    Validate the newly fetch credential, see also krb5_verify_init_creds().

    +
    Parameters
    +
    context a Kerberos 5 context
    creds the credentials to verify
    client the client name to match up
    ccache the credential cache to use
    service a service name to use, used with krb5_sname_to_principal() to build a hostname to use to verify.
    + + + + +
    contexta Kerberos 5 context
    credsthe credentials to verify
    clientthe client name to match up
    ccachethe credential cache to use
    servicea service name to use, used with krb5_sname_to_principal() to build a hostname to use to verify.
    +
    -

    - + + +

    ◆ krb5_is_config_principal()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_config_principal KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_config_principal (krb5_context  context, krb5_context context,
    krb5_const_principal  principal krb5_const_principal principal 
    )
    -
    -
    - -

    -Return TRUE (non zero) if the principal is a configuration principal (generated part of krb5_cc_set_config()). Returns FALSE (zero) if not a configuration principal.

    -

    Parameters:
    - - - +
    +

    Return TRUE (non zero) if the principal is a configuration principal (generated part of krb5_cc_set_config()). Returns FALSE (zero) if not a configuration principal.

    +
    Parameters
    +
    context a Keberos context
    principal principal to check if it a configuration principal
    + +
    contexta Keberos context
    principalprincipal to check if it a configuration principal
    +
    -

    -


    Variable Documentation

    - + +

    Variable Documentation

    + +

    ◆ krb5_acc_ops

    +
    - +
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_acc_ops KRB5_LIB_VARIABLE const krb5_cc_ops krb5_acc_ops
    -
    -
    +
    +Initial value:
    = {
    +
    KRB5_CC_OPS_VERSION,
    +
    "API",
    +
    acc_get_name,
    +
    acc_resolve,
    +
    acc_gen_new,
    +
    acc_initialize,
    +
    acc_destroy,
    +
    acc_close,
    +
    acc_store_cred,
    +
    NULL,
    +
    acc_get_principal,
    +
    acc_get_first,
    +
    acc_get_next,
    +
    acc_end_get,
    +
    acc_remove_cred,
    +
    acc_set_flags,
    +
    acc_get_version,
    +
    acc_get_cache_first,
    +
    acc_get_cache_next,
    +
    acc_end_cache_get,
    +
    acc_move,
    +
    acc_get_default_name,
    +
    acc_set_default,
    +
    acc_lastchange,
    +
    NULL,
    +
    NULL,
    +
    }
    +

    Variable containing the API based credential cache implemention.

    + +
    +
    + +

    ◆ krb5_dcc_ops

    -

    -Initial value:

     {
    -    KRB5_CC_OPS_VERSION,
    -    "API",
    -    acc_get_name,
    -    acc_resolve,
    -    acc_gen_new,
    -    acc_initialize,
    -    acc_destroy,
    -    acc_close,
    -    acc_store_cred,
    -    NULL, 
    -    acc_get_principal,
    -    acc_get_first,
    -    acc_get_next,
    -    acc_end_get,
    -    acc_remove_cred,
    -    acc_set_flags,
    -    acc_get_version,
    -    acc_get_cache_first,
    -    acc_get_cache_next,
    -    acc_end_cache_get,
    -    acc_move,
    -    acc_get_default_name,
    -    acc_set_default,
    -    acc_lastchange,
    -    NULL,
    -    NULL,
    -}
    -
    Variable containing the API based credential cache implemention. - -

    -

    - +
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_fcc_ops KRB5_LIB_VARIABLE const krb5_cc_ops krb5_dcc_ops
    -
    -
    +
    +Initial value:
    = {
    +
    KRB5_CC_OPS_VERSION,
    +
    "DIR",
    +
    dcc_get_name,
    +
    dcc_resolve,
    +
    dcc_gen_new,
    +
    dcc_initialize,
    +
    dcc_destroy,
    +
    dcc_close,
    +
    dcc_store_cred,
    +
    NULL,
    +
    dcc_get_principal,
    +
    dcc_get_first,
    +
    dcc_get_next,
    +
    dcc_end_get,
    +
    dcc_remove_cred,
    +
    dcc_set_flags,
    +
    dcc_get_version,
    +
    dcc_get_cache_first,
    +
    dcc_get_cache_next,
    +
    dcc_end_cache_get,
    +
    dcc_move,
    +
    dcc_get_default_name,
    +
    dcc_set_default,
    +
    dcc_lastchange,
    +
    dcc_set_kdc_offset,
    +
    dcc_get_kdc_offset
    +
    }
    +

    Variable containing the DIR based credential cache implemention.

    + +
    +
    + +

    ◆ krb5_fcc_ops

    -

    -Initial value:

     {
    -    KRB5_CC_OPS_VERSION,
    -    "FILE",
    -    fcc_get_name,
    -    fcc_resolve,
    -    fcc_gen_new,
    -    fcc_initialize,
    -    fcc_destroy,
    -    fcc_close,
    -    fcc_store_cred,
    -    NULL, 
    -    fcc_get_principal,
    -    fcc_get_first,
    -    fcc_get_next,
    -    fcc_end_get,
    -    fcc_remove_cred,
    -    fcc_set_flags,
    -    fcc_get_version,
    -    fcc_get_cache_first,
    -    fcc_get_cache_next,
    -    fcc_end_cache_get,
    -    fcc_move,
    -    fcc_get_default_name,
    -    NULL,
    -    fcc_lastchange,
    -    fcc_set_kdc_offset,
    -    fcc_get_kdc_offset
    -}
    -
    Variable containing the FILE based credential cache implemention. - -

    -

    - +
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_mcc_ops KRB5_LIB_VARIABLE const krb5_cc_ops krb5_fcc_ops
    -
    -
    +
    +Initial value:
    = {
    +
    KRB5_CC_OPS_VERSION,
    +
    "FILE",
    +
    fcc_get_name,
    +
    fcc_resolve,
    +
    fcc_gen_new,
    +
    fcc_initialize,
    +
    fcc_destroy,
    +
    fcc_close,
    +
    fcc_store_cred,
    +
    NULL,
    +
    fcc_get_principal,
    +
    fcc_get_first,
    +
    fcc_get_next,
    +
    fcc_end_get,
    +
    fcc_remove_cred,
    +
    fcc_set_flags,
    +
    fcc_get_version,
    +
    fcc_get_cache_first,
    +
    fcc_get_cache_next,
    +
    fcc_end_cache_get,
    +
    fcc_move,
    +
    fcc_get_default_name,
    +
    NULL,
    +
    fcc_lastchange,
    +
    fcc_set_kdc_offset,
    +
    fcc_get_kdc_offset
    +
    }
    +

    Variable containing the FILE based credential cache implemention.

    + +
    +
    + +

    ◆ krb5_mcc_ops

    -

    -Initial value:

     {
    -    KRB5_CC_OPS_VERSION,
    -    "MEMORY",
    -    mcc_get_name,
    -    mcc_resolve,
    -    mcc_gen_new,
    -    mcc_initialize,
    -    mcc_destroy,
    -    mcc_close,
    -    mcc_store_cred,
    -    NULL, 
    -    mcc_get_principal,
    -    mcc_get_first,
    -    mcc_get_next,
    -    mcc_end_get,
    -    mcc_remove_cred,
    -    mcc_set_flags,
    -    NULL,
    -    mcc_get_cache_first,
    -    mcc_get_cache_next,
    -    mcc_end_cache_get,
    -    mcc_move,
    -    mcc_default_name,
    -    NULL,
    -    mcc_lastchange,
    -    mcc_set_kdc_offset,
    -    mcc_get_kdc_offset
    -}
    -
    Variable containing the MEMORY based credential cache implemention. - -

    - +

    +
    + + + + +
    KRB5_LIB_VARIABLE const krb5_cc_ops krb5_mcc_ops
    +
    +Initial value:
    = {
    +
    KRB5_CC_OPS_VERSION,
    +
    "MEMORY",
    +
    mcc_get_name,
    +
    mcc_resolve,
    +
    mcc_gen_new,
    +
    mcc_initialize,
    +
    mcc_destroy,
    +
    mcc_close,
    +
    mcc_store_cred,
    +
    NULL,
    +
    mcc_get_principal,
    +
    mcc_get_first,
    +
    mcc_get_next,
    +
    mcc_end_get,
    +
    mcc_remove_cred,
    +
    mcc_set_flags,
    +
    NULL,
    +
    mcc_get_cache_first,
    +
    mcc_get_cache_next,
    +
    mcc_end_cache_get,
    +
    mcc_move,
    +
    mcc_default_name,
    +
    NULL,
    +
    mcc_lastchange,
    +
    mcc_set_kdc_offset,
    +
    mcc_get_kdc_offset
    +
    }
    +

    Variable containing the MEMORY based credential cache implemention.

    + +
    +
    +
    -Generated on Wed Jan 11 14:07:48 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__credential.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__credential.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__credential.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__credential.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 credential handing functions +Heimdal Kerberos 5 credential handing functions @@ -8,851 +8,840 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 credential handing functions
    +
    -

    Heimdal Kerberos 5 credential handing functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_fwd_tgt_creds (krb5_context context, krb5_auth_context auth_context, const char *hostname, krb5_principal client, krb5_principal server, krb5_ccache ccache, int forwardable, krb5_data *out_data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_forwarded_creds (krb5_context context, krb5_auth_context auth_context, krb5_ccache ccache, krb5_flags flags, const char *hostname, krb5_creds *in_creds, krb5_data *out_data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_init_creds_opt_alloc (krb5_context context, krb5_get_init_creds_opt **opt)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_get_init_creds_opt_free (krb5_context context, krb5_get_init_creds_opt *opt)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_creds_init (krb5_context context, krb5_principal client, krb5_prompter_fct prompter, void *prompter_data, krb5_deltat start_time, krb5_get_init_creds_opt *options, krb5_init_creds_context *rctx)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_creds_set_service (krb5_context context, krb5_init_creds_context ctx, const char *service)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_creds_set_password (krb5_context context, krb5_init_creds_context ctx, const char *password)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_creds_set_keytab (krb5_context context, krb5_init_creds_context ctx, krb5_keytab keytab)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_creds_step (krb5_context context, krb5_init_creds_context ctx, krb5_data *in, krb5_data *out, krb5_krbhst_info *hostinfo, unsigned int *flags)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_creds_get_error (krb5_context context, krb5_init_creds_context ctx, KRB_ERROR *error)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_init_creds_free (krb5_context context, krb5_init_creds_context ctx)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_init_creds_get (krb5_context context, krb5_init_creds_context ctx)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_init_creds_password (krb5_context context, krb5_creds *creds, krb5_principal client, const char *password, krb5_prompter_fct prompter, void *data, krb5_deltat start_time, const char *in_tkt_service, krb5_get_init_creds_opt *options)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_init_creds_keyblock (krb5_context context, krb5_creds *creds, krb5_principal client, krb5_keyblock *keyblock, krb5_deltat start_time, const char *in_tkt_service, krb5_get_init_creds_opt *options)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_init_creds_keytab (krb5_context context, krb5_creds *creds, krb5_principal client, krb5_keytab keytab, krb5_deltat start_time, const char *in_tkt_service, krb5_get_init_creds_opt *options)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_fwd_tgt_creds (krb5_context context, krb5_auth_context auth_context, const char *hostname, krb5_principal client, krb5_principal server, krb5_ccache ccache, int forwardable, krb5_data *out_data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_forwarded_creds (krb5_context context, krb5_auth_context auth_context, krb5_ccache ccache, krb5_flags flags, const char *hostname, krb5_creds *in_creds, krb5_data *out_data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_alloc (krb5_context context, krb5_get_init_creds_opt **opt)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_free (krb5_context context, krb5_get_init_creds_opt *opt)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_init (krb5_context context, krb5_principal client, krb5_prompter_fct prompter, void *prompter_data, krb5_deltat start_time, krb5_get_init_creds_opt *options, krb5_init_creds_context *rctx)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_service (krb5_context context, krb5_init_creds_context ctx, const char *service)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_password (krb5_context context, krb5_init_creds_context ctx, const char *password)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_keytab (krb5_context context, krb5_init_creds_context ctx, krb5_keytab keytab)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_step (krb5_context context, krb5_init_creds_context ctx, krb5_data *in, krb5_data *out, krb5_krbhst_info *hostinfo, unsigned int *flags)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get_error (krb5_context context, krb5_init_creds_context ctx, KRB_ERROR *error)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_creds_free (krb5_context context, krb5_init_creds_context ctx)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get (krb5_context context, krb5_init_creds_context ctx)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_password (krb5_context context, krb5_creds *creds, krb5_principal client, const char *password, krb5_prompter_fct prompter, void *data, krb5_deltat start_time, const char *in_tkt_service, krb5_get_init_creds_opt *options)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keyblock (krb5_context context, krb5_creds *creds, krb5_principal client, krb5_keyblock *keyblock, krb5_deltat start_time, const char *in_tkt_service, krb5_get_init_creds_opt *options)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keytab (krb5_context context, krb5_creds *creds, krb5_principal client, krb5_keytab keytab, krb5_deltat start_time, const char *in_tkt_service, krb5_get_init_creds_opt *options)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_fwd_tgt_creds()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_fwd_tgt_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_fwd_tgt_creds (krb5_context  context, krb5_context context,
    krb5_auth_context  auth_context, krb5_auth_context auth_context,
    const char *  hostname, const char * hostname,
    krb5_principal  client, krb5_principal client,
    krb5_principal  server, krb5_principal server,
    krb5_ccache  ccache, krb5_ccache ccache,
    int  forwardable, int forwardable,
    krb5_data *  out_data krb5_data * out_data 
    )
    -
    -
    - -

    -Forward credentials for client to host hostname , making them forwardable if forwardable, and returning the blob of data to sent in out_data. If hostname == NULL, pick it from server.

    -

    Parameters:
    - - - - - - - - - +
    +

    Forward credentials for client to host hostname , making them forwardable if forwardable, and returning the blob of data to sent in out_data. If hostname == NULL, pick it from server.

    +
    Parameters
    +
    context A kerberos 5 context.
    auth_context the auth context with the key to encrypt the out_data.
    hostname the host to forward the tickets too.
    client the client to delegate from.
    server the server to delegate the credential too.
    ccache credential cache to use.
    forwardable make the forwarded ticket forwabledable.
    out_data the resulting credential.
    + + + + + + + +
    contextA kerberos 5 context.
    auth_contextthe auth context with the key to encrypt the out_data.
    hostnamethe host to forward the tickets too.
    clientthe client to delegate from.
    serverthe server to delegate the credential too.
    ccachecredential cache to use.
    forwardablemake the forwarded ticket forwabledable.
    out_datathe resulting credential.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - +

    + +

    ◆ krb5_get_forwarded_creds()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_forwarded_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_forwarded_creds (krb5_context  context, krb5_context context,
    krb5_auth_context  auth_context, krb5_auth_context auth_context,
    krb5_ccache  ccache, krb5_ccache ccache,
    krb5_flags  flags, krb5_flags flags,
    const char *  hostname, const char * hostname,
    krb5_creds *  in_creds, krb5_creds * in_creds,
    krb5_data *  out_data krb5_data * out_data 
    )
    -
    -
    - -

    -Gets tickets forwarded to hostname. If the tickets that are forwarded are address-less, the forwarded tickets will also be address-less.

    -If the ticket have any address, hostname will be used for figure out the address to forward the ticket too. This since this might use DNS, its insecure and also doesn't represent configured all addresses of the host. For example, the host might have two adresses, one IPv4 and one IPv6 address where the later is not published in DNS. This IPv6 address might be used communications and thus the resulting ticket useless.

    -

    Parameters:
    - - - - - - - - +
    +

    Gets tickets forwarded to hostname. If the tickets that are forwarded are address-less, the forwarded tickets will also be address-less.

    +

    If the ticket have any address, hostname will be used for figure out the address to forward the ticket too. This since this might use DNS, its insecure and also doesn't represent configured all addresses of the host. For example, the host might have two adresses, one IPv4 and one IPv6 address where the later is not published in DNS. This IPv6 address might be used communications and thus the resulting ticket useless.

    +
    Parameters
    +
    context A kerberos 5 context.
    auth_context the auth context with the key to encrypt the out_data.
    ccache credential cache to use
    flags the flags to control the resulting ticket flags
    hostname the host to forward the tickets too.
    in_creds the in client and server ticket names. The client and server components forwarded to the remote host.
    out_data the resulting credential.
    + + + + + + +
    contextA kerberos 5 context.
    auth_contextthe auth context with the key to encrypt the out_data.
    ccachecredential cache to use
    flagsthe flags to control the resulting ticket flags
    hostnamethe host to forward the tickets too.
    in_credsthe in client and server ticket names. The client and server components forwarded to the remote host.
    out_datathe resulting credential.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    +

    Some older of the MIT gssapi library used clear-text tickets (warped inside AP-REQ encryption), use the krb5_auth_context flag KRB5_AUTH_CONTEXT_CLEAR_FORWARDED_CRED to support those tickets. The session key is used otherwise to encrypt the forwarded ticket.

    -

    -Some older of the MIT gssapi library used clear-text tickets (warped inside AP-REQ encryption), use the krb5_auth_context flag KRB5_AUTH_CONTEXT_CLEAR_FORWARDED_CRED to support those tickets. The session key is used otherwise to encrypt the forwarded ticket.

    -

    - + + +

    ◆ krb5_get_init_creds_keyblock()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keyblock KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keyblock (krb5_context  context, krb5_context context,
    krb5_creds *  creds, krb5_creds * creds,
    krb5_principal  client, krb5_principal client,
    krb5_keyblock *  keyblock, krb5_keyblock * keyblock,
    krb5_deltat  start_time, krb5_deltat start_time,
    const char *  in_tkt_service, const char * in_tkt_service,
    krb5_get_init_creds_opt *  options krb5_get_init_creds_opt * options 
    )
    -
    -
    +
    +

    Get new credentials using keyblock.

    -

    -Get new credentials using keyblock.

    -

    - + + +

    ◆ krb5_get_init_creds_keytab()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keytab KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keytab (krb5_context  context, krb5_context context,
    krb5_creds *  creds, krb5_creds * creds,
    krb5_principal  client, krb5_principal client,
    krb5_keytab  keytab, krb5_keytab keytab,
    krb5_deltat  start_time, krb5_deltat start_time,
    const char *  in_tkt_service, const char * in_tkt_service,
    krb5_get_init_creds_opt *  options krb5_get_init_creds_opt * options 
    )
    -
    -
    +
    +

    Get new credentials using keytab.

    -

    -Get new credentials using keytab.

    -

    - + + +

    ◆ krb5_get_init_creds_opt_alloc()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_alloc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_alloc (krb5_context  context, krb5_context context,
    krb5_get_init_creds_opt **  opt krb5_get_init_creds_opt ** opt 
    )
    -
    -
    +
    +

    Allocate a new krb5_get_init_creds_opt structure, free with krb5_get_init_creds_opt_free().

    -

    -Allocate a new krb5_get_init_creds_opt structure, free with krb5_get_init_creds_opt_free().

    -

    - + + +

    ◆ krb5_get_init_creds_opt_free()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_free KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_free (krb5_context  context, krb5_context context,
    krb5_get_init_creds_opt *  opt krb5_get_init_creds_opt * opt 
    )
    -
    -
    +
    +

    Free krb5_get_init_creds_opt structure.

    -

    -Free krb5_get_init_creds_opt structure.

    -

    - + + +

    ◆ krb5_get_init_creds_password()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_password KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_password (krb5_context  context, krb5_context context,
    krb5_creds *  creds, krb5_creds * creds,
    krb5_principal  client, krb5_principal client,
    const char *  password, const char * password,
    krb5_prompter_fct  prompter, krb5_prompter_fct prompter,
    void *  data, void * data,
    krb5_deltat  start_time, krb5_deltat start_time,
    const char *  in_tkt_service, const char * in_tkt_service,
    krb5_get_init_creds_opt *  options krb5_get_init_creds_opt * options 
    )
    -
    -
    +
    +

    Get new credentials using password.

    -

    -Get new credentials using password.

    -

    - + + +

    ◆ krb5_init_creds_free()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_creds_free KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_creds_free (krb5_context  context, krb5_context context,
    krb5_init_creds_context  ctx krb5_init_creds_context ctx 
    )
    -
    -
    - -

    -Free the krb5_init_creds_context allocated by krb5_init_creds_init().

    -

    Parameters:
    - - - +
    +

    Free the krb5_init_creds_context allocated by krb5_init_creds_init().

    +
    Parameters
    +
    context A Kerberos 5 context.
    ctx The krb5_init_creds_context to free.
    + +
    contextA Kerberos 5 context.
    ctxThe krb5_init_creds_context to free.
    +
    -

    - + + +

    ◆ krb5_init_creds_get()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get (krb5_context  context, krb5_context context,
    krb5_init_creds_context  ctx krb5_init_creds_context ctx 
    )
    -
    -
    - -

    -Get new credentials as setup by the krb5_init_creds_context.

    -

    Parameters:
    - - - +
    +

    Get new credentials as setup by the krb5_init_creds_context.

    +
    Parameters
    +
    context A Kerberos 5 context.
    ctx The krb5_init_creds_context to process.
    + +
    contextA Kerberos 5 context.
    ctxThe krb5_init_creds_context to process.
    +
    -

    - + + +

    ◆ krb5_init_creds_get_error()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get_error KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get_error (krb5_context  context, krb5_context context,
    krb5_init_creds_context  ctx, krb5_init_creds_context ctx,
    KRB_ERROR *  error KRB_ERROR * error 
    )
    -
    -
    - -

    -Get the last error from the transaction.

    -

    Returns:
    Returns 0 or an error code
    +
    +

    Get the last error from the transaction.

    +
    Returns
    Returns 0 or an error code
    -

    - + + +

    ◆ krb5_init_creds_init()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_init KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_init (krb5_context  context, krb5_context context,
    krb5_principal  client, krb5_principal client,
    krb5_prompter_fct  prompter, krb5_prompter_fct prompter,
    void *  prompter_data, void * prompter_data,
    krb5_deltat  start_time, krb5_deltat start_time,
    krb5_get_init_creds_opt *  options, krb5_get_init_creds_opt * options,
    krb5_init_creds_context *  rctx krb5_init_creds_context * rctx 
    )
    -
    -
    - -

    -Start a new context to get a new initial credential.

    -

    Parameters:
    - - - - - - - - +
    +

    Start a new context to get a new initial credential.

    +
    Parameters
    +
    context A Kerberos 5 context.
    client The Kerberos principal to get the credential for, if NULL is given, the default principal is used as determined by krb5_get_default_principal().
    prompter 
    prompter_data 
    start_time the time the ticket should start to be valid or 0 for now.
    options a options structure, can be NULL for default options.
    rctx A new allocated free with krb5_init_creds_free().
    + + + + + + +
    contextA Kerberos 5 context.
    clientThe Kerberos principal to get the credential for, if NULL is given, the default principal is used as determined by krb5_get_default_principal().
    prompter
    prompter_data
    start_timethe time the ticket should start to be valid or 0 for now.
    optionsa options structure, can be NULL for default options.
    rctxA new allocated free with krb5_init_creds_free().
    +
    -
    Returns:
    0 for success or an Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    0 for success or an Kerberos 5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_init_creds_set_keytab()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_keytab KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_keytab (krb5_context  context, krb5_context context,
    krb5_init_creds_context  ctx, krb5_init_creds_context ctx,
    krb5_keytab  keytab krb5_keytab keytab 
    )
    -
    -
    - -

    -Set the keytab to use for authentication.

    -

    Parameters:
    - - - - +
    +

    Set the keytab to use for authentication.

    +
    Parameters
    +
    context a Kerberos 5 context.
    ctx ctx krb5_init_creds_context context.
    keytab the keytab to read the key from.
    + + +
    contexta Kerberos 5 context.
    ctxctx krb5_init_creds_context context.
    keytabthe keytab to read the key from.
    +
    -
    Returns:
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_init_creds_set_password()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_password KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_password (krb5_context  context, krb5_context context,
    krb5_init_creds_context  ctx, krb5_init_creds_context ctx,
    const char *  password const char * password 
    )
    -
    -
    - -

    -Sets the password that will use for the request.

    -

    Parameters:
    - - - - +
    +

    Sets the password that will use for the request.

    +
    Parameters
    +
    context a Kerberos 5 context.
    ctx ctx krb5_init_creds_context context.
    password the password to use.
    + + +
    contexta Kerberos 5 context.
    ctxctx krb5_init_creds_context context.
    passwordthe password to use.
    +
    -
    Returns:
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_init_creds_set_service()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_service KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_service (krb5_context  context, krb5_context context,
    krb5_init_creds_context  ctx, krb5_init_creds_context ctx,
    const char *  service const char * service 
    )
    -
    -
    - -

    -Sets the service that the is requested. This call is only neede for special initial tickets, by default the a krbtgt is fetched in the default realm.

    -

    Parameters:
    - - - - +
    +

    Sets the service that the is requested. This call is only neede for special initial tickets, by default the a krbtgt is fetched in the default realm.

    +
    Parameters
    +
    context a Kerberos 5 context.
    ctx a krb5_init_creds_context context.
    service the service given as a string, for example "kadmind/admin". If NULL, the default krbtgt in the clients realm is set.
    + + +
    contexta Kerberos 5 context.
    ctxa krb5_init_creds_context context.
    servicethe service given as a string, for example "kadmind/admin". If NULL, the default krbtgt in the clients realm is set.
    +
    -
    Returns:
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_init_creds_step()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_step KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_step (krb5_context  context, krb5_context context,
    krb5_init_creds_context  ctx, krb5_init_creds_context ctx,
    krb5_data *  in, krb5_data * in,
    krb5_data *  out, krb5_data * out,
    krb5_krbhst_info *  hostinfo, krb5_krbhst_info * hostinfo,
    unsigned int *  flags unsigned int * flags 
    )
    -
    -
    - -

    -The core loop if krb5_get_init_creds() function family. Create the packets and have the caller send them off to the KDC.

    -If the caller want all work been done for them, use krb5_init_creds_get() instead.

    -

    Parameters:
    - - - - - - - +
    +

    The core loop if krb5_get_init_creds() function family. Create the packets and have the caller send them off to the KDC.

    +

    If the caller want all work been done for them, use krb5_init_creds_get() instead.

    +
    Parameters
    +
    context a Kerberos 5 context.
    ctx ctx krb5_init_creds_context context.
    in input data from KDC, first round it should be reset by krb5_data_zer().
    out reply to KDC.
    hostinfo KDC address info, first round it can be NULL.
    flags status of the round, if KRB5_INIT_CREDS_STEP_FLAG_CONTINUE is set, continue one more round.
    + + + + + +
    contexta Kerberos 5 context.
    ctxctx krb5_init_creds_context context.
    ininput data from KDC, first round it should be reset by krb5_data_zer().
    outreply to KDC.
    hostinfoKDC address info, first round it can be NULL.
    flagsstatus of the round, if KRB5_INIT_CREDS_STEP_FLAG_CONTINUE is set, continue one more round.
    +
    -
    Returns:
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    +
    Returns
    0 for success, or an Kerberos 5 error code, see krb5_get_error_message().
    -

    +


    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__crypto.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__crypto.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__crypto.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__crypto.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 cryptography functions +Heimdal Kerberos 5 cryptography functions @@ -8,1255 +8,1468 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 cryptography functions
    +
    -

    Heimdal Kerberos 5 cryptography functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_enctype_valid (krb5_context context, krb5_enctype etype)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_cksumtype_to_enctype (krb5_context context, krb5_cksumtype ctype, krb5_enctype *etype)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_encrypt_iov_ivec (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, int num_data, void *ivec)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_decrypt_iov_ivec (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, unsigned int num_data, void *ivec)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_create_checksum_iov (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, unsigned int num_data, krb5_cksumtype *type)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_verify_checksum_iov (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, unsigned int num_data, krb5_cksumtype *type)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_crypto_init (krb5_context context, const krb5_keyblock *key, krb5_enctype etype, krb5_crypto *crypto)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_crypto_destroy (krb5_context context, krb5_crypto crypto)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_crypto_getblocksize (krb5_context context, krb5_crypto crypto, size_t *blocksize)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_crypto_getenctype (krb5_context context, krb5_crypto crypto, krb5_enctype *enctype)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_crypto_getpadsize (krb5_context context, krb5_crypto crypto, size_t *padsize)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_crypto_getconfoundersize (krb5_context context, krb5_crypto crypto, size_t *confoundersize)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_enctype_disable (krb5_context context, krb5_enctype enctype)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_enctype_enable (krb5_context context, krb5_enctype enctype)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_allow_weak_crypto (krb5_context context, krb5_boolean enable)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_random_to_key (krb5_context context, krb5_enctype type, const void *data, size_t size, krb5_keyblock *key)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_crypto_fx_cf2 (krb5_context context, const krb5_crypto crypto1, const krb5_crypto crypto2, krb5_data *pepper1, krb5_data *pepper2, krb5_enctype enctype, krb5_keyblock *res)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_generate_subkey_extended (krb5_context context, const krb5_keyblock *key, krb5_enctype etype, krb5_keyblock **subkey)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_keyblock_zero (krb5_keyblock *keyblock)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_keyblock_contents (krb5_context context, krb5_keyblock *keyblock)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_keyblock (krb5_context context, krb5_keyblock *keyblock)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_keyblock_contents (krb5_context context, const krb5_keyblock *inblock, krb5_keyblock *to)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_keyblock (krb5_context context, const krb5_keyblock *inblock, krb5_keyblock **to)
    KRB5_LIB_FUNCTION krb5_enctype
    -KRB5_LIB_CALL 
    krb5_keyblock_get_enctype (const krb5_keyblock *block)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_keyblock_init (krb5_context context, krb5_enctype type, const void *data, size_t size, krb5_keyblock *key)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_random (void *buf, size_t len)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_generate_random_block (void *buf, size_t len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_valid (krb5_context context, krb5_enctype etype)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cksumtype_to_enctype (krb5_context context, krb5_cksumtype ctype, krb5_enctype *etype)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_encrypt_iov_ivec (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, int num_data, void *ivec)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_decrypt_iov_ivec (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, unsigned int num_data, void *ivec)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_create_checksum_iov (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, unsigned int num_data, krb5_cksumtype *type)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verify_checksum_iov (krb5_context context, krb5_crypto crypto, unsigned usage, krb5_crypto_iov *data, unsigned int num_data, krb5_cksumtype *type)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_init (krb5_context context, const krb5_keyblock *key, krb5_enctype etype, krb5_crypto *crypto)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_destroy (krb5_context context, krb5_crypto crypto)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getblocksize (krb5_context context, krb5_crypto crypto, size_t *blocksize)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getenctype (krb5_context context, krb5_crypto crypto, krb5_enctype *enctype)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getpadsize (krb5_context context, krb5_crypto crypto, size_t *padsize)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getconfoundersize (krb5_context context, krb5_crypto crypto, size_t *confoundersize)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_disable (krb5_context context, krb5_enctype enctype)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_enable (krb5_context context, krb5_enctype enctype)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_allow_weak_crypto (krb5_context context, krb5_boolean enable)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_enctype_weak (krb5_context context, krb5_enctype enctype)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_enctype_requires_random_salt (krb5_context context, krb5_enctype enctype)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_random_to_key (krb5_context context, krb5_enctype type, const void *data, size_t size, krb5_keyblock *key)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_fx_cf2 (krb5_context context, const krb5_crypto crypto1, const krb5_crypto crypto2, krb5_data *pepper1, krb5_data *pepper2, krb5_enctype enctype, krb5_keyblock *res)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey_extended (krb5_context context, const krb5_keyblock *key, krb5_enctype etype, krb5_keyblock **subkey)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_keyblock_zero (krb5_keyblock *keyblock)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock_contents (krb5_context context, krb5_keyblock *keyblock)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock (krb5_context context, krb5_keyblock *keyblock)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock_contents (krb5_context context, const krb5_keyblock *inblock, krb5_keyblock *to)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock (krb5_context context, const krb5_keyblock *inblock, krb5_keyblock **to)
     
    KRB5_LIB_FUNCTION krb5_enctype KRB5_LIB_CALL krb5_keyblock_get_enctype (const krb5_keyblock *block)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keyblock_init (krb5_context context, krb5_enctype type, const void *data, size_t size, krb5_keyblock *key)
     
    krb5_error_code _krb5_SP800_108_HMAC_KDF (krb5_context context, const krb5_data *kdf_K1, const krb5_data *kdf_label, const krb5_data *kdf_context, const EVP_MD *md, krb5_data *kdf_K0)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ _krb5_enctype_requires_random_salt()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_allow_weak_crypto KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_enctype_requires_random_salt (krb5_context  context, krb5_context context,
    krb5_boolean  enable krb5_enctype enctype 
    )
    -
    -
    - -

    -Enable or disable all weak encryption types

    -

    Parameters:
    - - - +
    +

    Returns whether the encryption type should use randomly generated salts

    +
    Parameters
    +
    context Kerberos 5 context
    enable true to enable, false to disable
    + +
    contextKerberos 5 context
    enctypeencryption type to probe
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Returns true if generated salts should have random component
    -

    - +

    + +

    ◆ _krb5_SP800_108_HMAC_KDF()

    +
    - + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cksumtype_to_enctype krb5_error_code _krb5_SP800_108_HMAC_KDF (krb5_context  context, krb5_context context,
    krb5_cksumtype  ctype, const krb5_data * kdf_K1,
    krb5_enctype *  etype const krb5_data * kdf_label,
    const krb5_data * kdf_context,
    const EVP_MD * md,
    krb5_data * kdf_K0 
    )
    +
    +

    As described in SP800-108 5.1 (for HMAC)

    +
    Parameters
    + + + + + + + +
    contextKerberos 5 context
    kdf_K1Base key material.
    kdf_labelA string that identifies the purpose for the derived key.
    kdf_contextA binary string containing parties, nonce, etc.
    mdMessage digest function to use for PRF.
    kdf_K0Derived key data.
    +
    +
    +
    Returns
    Return an error code for an failure or 0 on success.
    + +
    -
    + +

    ◆ krb5_allow_weak_crypto()

    -

    -Return the coresponding encryption type for a checksum type.

    -

    Parameters:
    - - - - +
    +
    +
    context Kerberos context
    ctype The checksum type to get the result enctype for
    etype The returned encryption, when the matching etype is not found, etype is set to ETYPE_NULL.
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_allow_weak_crypto (krb5_context context,
    krb5_boolean enable 
    )
    +
    +

    Enable or disable all weak encryption types

    +
    Parameters
    + + +
    contextKerberos 5 context
    enabletrue to enable, false to disable
    +
    -
    Returns:
    Return an error code for an failure or 0 on success.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_cksumtype_to_enctype()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cksumtype_to_enctype (krb5_context  context, krb5_context context,
    const krb5_keyblock *  inblock, krb5_cksumtype ctype,
    krb5_keyblock **  to krb5_enctype * etype 
    )
    -
    -
    - -

    -Copy a keyblock, free the output keyblock with krb5_free_keyblock().

    -

    Parameters:
    - - - - +
    +

    Return the coresponding encryption type for a checksum type.

    +
    Parameters
    +
    context a Kerberos 5 context
    inblock the key to copy
    to the output key.
    + + +
    contextKerberos context
    ctypeThe checksum type to get the result enctype for
    etypeThe returned encryption, when the matching etype is not found, etype is set to ETYPE_NULL.
    +
    -
    Returns:
    0 on success or a Kerberos 5 error code
    +
    Returns
    Return an error code for an failure or 0 on success.
    -

    - + + +

    ◆ krb5_copy_keyblock()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock_contents KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock (krb5_context  context, krb5_context context,
    const krb5_keyblock *  inblock, const krb5_keyblock * inblock,
    krb5_keyblock *  to krb5_keyblock ** to 
    )
    +
    +

    Copy a keyblock, free the output keyblock with krb5_free_keyblock().

    +
    Parameters
    + + + + +
    contexta Kerberos 5 context
    inblockthe key to copy
    tothe output key.
    +
    +
    +
    Returns
    0 on success or a Kerberos 5 error code
    + +
    -
    + +

    ◆ krb5_copy_keyblock_contents()

    -

    -Copy a keyblock, free the output keyblock with krb5_free_keyblock_contents().

    -

    Parameters:
    - - - - +
    +
    +
    context a Kerberos 5 context
    inblock the key to copy
    to the output key.
    + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock_contents (krb5_context context,
    const krb5_keyblock * inblock,
    krb5_keyblock * to 
    )
    +
    +

    Copy a keyblock, free the output keyblock with krb5_free_keyblock_contents().

    +
    Parameters
    + + + +
    contexta Kerberos 5 context
    inblockthe key to copy
    tothe output key.
    +
    -
    Returns:
    0 on success or a Kerberos 5 error code
    +
    Returns
    0 on success or a Kerberos 5 error code
    -

    - + + +

    ◆ krb5_create_checksum_iov()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_create_checksum_iov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_create_checksum_iov (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    unsigned  usage, unsigned usage,
    krb5_crypto_iov data, krb5_crypto_iovdata,
    unsigned int  num_data, unsigned int num_data,
    krb5_cksumtype *  type krb5_cksumtype * type 
    )
    -
    -
    - -

    -Create a Kerberos message checksum.

    -

    Parameters:
    - - - - - - - +
    +

    Create a Kerberos message checksum.

    +
    Parameters
    +
    context Kerberos context
    crypto Kerberos crypto context
    usage Key usage for this buffer
    data array of buffers to process
    num_data length of array
    type output data
    + + + + + +
    contextKerberos context
    cryptoKerberos crypto context
    usageKey usage for this buffer
    dataarray of buffers to process
    num_datalength of array
    typeoutput data
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_crypto_destroy()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_destroy KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_destroy (krb5_context  context, krb5_context context,
    krb5_crypto  crypto krb5_crypto crypto 
    )
    -
    -
    - -

    -Free a crypto context created by krb5_crypto_init().

    -

    Parameters:
    - - - +
    +

    Free a crypto context created by krb5_crypto_init().

    +
    Parameters
    +
    context Kerberos context
    crypto crypto context to free
    + +
    contextKerberos context
    cryptocrypto context to free
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_crypto_fx_cf2()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_fx_cf2 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_fx_cf2 (krb5_context  context, krb5_context context,
    const krb5_crypto  crypto1, const krb5_crypto crypto1,
    const krb5_crypto  crypto2, const krb5_crypto crypto2,
    krb5_data *  pepper1, krb5_data * pepper1,
    krb5_data *  pepper2, krb5_data * pepper2,
    krb5_enctype  enctype, krb5_enctype enctype,
    krb5_keyblock *  res krb5_keyblock * res 
    )
    -
    -
    - -

    -The FX-CF2 key derivation function, used in FAST and preauth framework.

    -

    Parameters:
    - - - - - - - - +
    +

    The FX-CF2 key derivation function, used in FAST and preauth framework.

    +
    Parameters
    +
    context Kerberos 5 context
    crypto1 first key to combine
    crypto2 second key to combine
    pepper1 factor to combine with first key to garante uniqueness
    pepper2 factor to combine with second key to garante uniqueness
    enctype the encryption type of the resulting key
    res allocated key, free with krb5_free_keyblock_contents()
    + + + + + + +
    contextKerberos 5 context
    crypto1first key to combine
    crypto2second key to combine
    pepper1factor to combine with first key to garante uniqueness
    pepper2factor to combine with second key to garante uniqueness
    enctypethe encryption type of the resulting key
    resallocated key, free with krb5_free_keyblock_contents()
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_crypto_getblocksize()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getblocksize KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getblocksize (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    size_t *  blocksize size_t * blocksize 
    )
    -
    -
    - -

    -Return the blocksize used algorithm referenced by the crypto context

    -

    Parameters:
    - - - - +
    +

    Return the blocksize used algorithm referenced by the crypto context

    +
    Parameters
    +
    context Kerberos context
    crypto crypto context to query
    blocksize the resulting blocksize
    + + +
    contextKerberos context
    cryptocrypto context to query
    blocksizethe resulting blocksize
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_crypto_getconfoundersize()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getconfoundersize KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getconfoundersize (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    size_t *  confoundersize size_t * confoundersize 
    )
    -
    -
    - -

    -Return the confounder size used by the crypto context

    -

    Parameters:
    - - - - +
    +

    Return the confounder size used by the crypto context

    +
    Parameters
    +
    context Kerberos context
    crypto crypto context to query
    confoundersize the returned confounder size
    + + +
    contextKerberos context
    cryptocrypto context to query
    confoundersizethe returned confounder size
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_crypto_getenctype()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getenctype KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getenctype (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    krb5_enctype *  enctype krb5_enctype * enctype 
    )
    -
    -
    - -

    -Return the encryption type used by the crypto context

    -

    Parameters:
    - - - - +
    +

    Return the encryption type used by the crypto context

    +
    Parameters
    +
    context Kerberos context
    crypto crypto context to query
    enctype the resulting encryption type
    + + +
    contextKerberos context
    cryptocrypto context to query
    enctypethe resulting encryption type
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_crypto_getpadsize()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getpadsize KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getpadsize (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    size_t *  padsize size_t * padsize 
    )
    -
    -
    - -

    -Return the padding size used by the crypto context

    -

    Parameters:
    - - - - +
    +

    Return the padding size used by the crypto context

    +
    Parameters
    +
    context Kerberos context
    crypto crypto context to query
    padsize the return padding size
    + + +
    contextKerberos context
    cryptocrypto context to query
    padsizethe return padding size
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_crypto_init()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_init KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_init (krb5_context  context, krb5_context context,
    const krb5_keyblock *  key, const krb5_keyblock * key,
    krb5_enctype  etype, krb5_enctype etype,
    krb5_crypto *  crypto krb5_crypto * crypto 
    )
    -
    -
    - -

    -Create a crypto context used for all encryption and signature operation. The encryption type to use is taken from the key, but can be overridden with the enctype parameter. This can be useful for encryptions types which is compatiable (DES for example).

    -To free the crypto context, use krb5_crypto_destroy().

    -

    Parameters:
    - - - - - +
    +

    Create a crypto context used for all encryption and signature operation. The encryption type to use is taken from the key, but can be overridden with the enctype parameter. This can be useful for encryptions types which is compatiable (DES for example).

    +

    To free the crypto context, use krb5_crypto_destroy().

    +
    Parameters
    +
    context Kerberos context
    key the key block information with all key data
    etype the encryption type
    crypto the resulting crypto context
    + + + +
    contextKerberos context
    keythe key block information with all key data
    etypethe encryption type
    cryptothe resulting crypto context
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_decrypt_iov_ivec()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_decrypt_iov_ivec KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_decrypt_iov_ivec (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    unsigned  usage, unsigned usage,
    krb5_crypto_iov data, krb5_crypto_iovdata,
    unsigned int  num_data, unsigned int num_data,
    void *  ivec void * ivec 
    )
    -
    -
    - -

    -Inline decrypt a Kerberos message.

    -

    Parameters:
    - - - - - - - +
    +

    Inline decrypt a Kerberos message.

    +
    Parameters
    +
    context Kerberos context
    crypto Kerberos crypto context
    usage Key usage for this buffer
    data array of buffers to process
    num_data length of array
    ivec initial cbc/cts vector
    + + + + + +
    contextKerberos context
    cryptoKerberos crypto context
    usageKey usage for this buffer
    dataarray of buffers to process
    num_datalength of array
    ivecinitial cbc/cts vector
    +
    -
    Returns:
    Return an error code or 0.
    -1. KRB5_CRYPTO_TYPE_HEADER 2. one KRB5_CRYPTO_TYPE_DATA and array [0,...] of KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used unencrypoted protocol headers and trailers. The output data will be of same size as the input data or shorter. +
    Returns
    Return an error code or 0.
    +
      +
    1. KRB5_CRYPTO_TYPE_HEADER
    2. +
    3. one KRB5_CRYPTO_TYPE_DATA and array [0,...] of KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used unencrypoted protocol headers and trailers. The output data will be of same size as the input data or shorter.
    4. +
    + +
    -

    - + +

    ◆ krb5_encrypt_iov_ivec()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_encrypt_iov_ivec KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_encrypt_iov_ivec (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    unsigned  usage, unsigned usage,
    krb5_crypto_iov data, krb5_crypto_iovdata,
    int  num_data, int num_data,
    void *  ivec void * ivec 
    )
    -
    -
    - -

    -Inline encrypt a kerberos message

    -

    Parameters:
    - - - - - - - +
    +

    Inline encrypt a kerberos message

    +
    Parameters
    +
    context Kerberos context
    crypto Kerberos crypto context
    usage Key usage for this buffer
    data array of buffers to process
    num_data length of array
    ivec initial cbc/cts vector
    + + + + + +
    contextKerberos context
    cryptoKerberos crypto context
    usageKey usage for this buffer
    dataarray of buffers to process
    num_datalength of array
    ivecinitial cbc/cts vector
    +
    -
    Returns:
    Return an error code or 0.
    -Kerberos encrypted data look like this:

    -1. KRB5_CRYPTO_TYPE_HEADER 2. array [1,...] KRB5_CRYPTO_TYPE_DATA and array [0,...] KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used headers and trailers. 3. KRB5_CRYPTO_TYPE_PADDING, at least on padsize long if padsize > 1 4. KRB5_CRYPTO_TYPE_TRAILER +

    Returns
    Return an error code or 0.
    +

    Kerberos encrypted data look like this:

    +
      +
    1. KRB5_CRYPTO_TYPE_HEADER
    2. +
    3. array [1,...] KRB5_CRYPTO_TYPE_DATA and array [0,...] KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used headers and trailers.
    4. +
    5. KRB5_CRYPTO_TYPE_PADDING, at least on padsize long if padsize > 1
    6. +
    7. KRB5_CRYPTO_TYPE_TRAILER
    8. +
    + +
    -

    - + +

    ◆ krb5_enctype_disable()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_disable KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_disable (krb5_context  context, krb5_context context,
    krb5_enctype  enctype krb5_enctype enctype 
    )
    -
    -
    - -

    -Disable encryption type

    -

    Parameters:
    - - - +
    +

    Disable encryption type

    +
    Parameters
    +
    context Kerberos 5 context
    enctype encryption type to disable
    + +
    contextKerberos 5 context
    enctypeencryption type to disable
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_enctype_enable()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_enable KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_enable (krb5_context  context, krb5_context context,
    krb5_enctype  enctype krb5_enctype enctype 
    )
    -
    -
    - -

    -Enable encryption type

    -

    Parameters:
    - - - +
    +

    Enable encryption type

    +
    Parameters
    +
    context Kerberos 5 context
    enctype encryption type to enable
    + +
    contextKerberos 5 context
    enctypeencryption type to enable
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_enctype_valid()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_valid KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_valid (krb5_context  context, krb5_context context,
    krb5_enctype  etype krb5_enctype etype 
    )
    -
    -
    - -

    -Check if a enctype is valid, return 0 if it is.

    -

    Parameters:
    - - - +
    +

    Check if a enctype is valid, return 0 if it is.

    +
    Parameters
    +
    context Kerberos context
    etype enctype to check if its valid or not
    + +
    contextKerberos context
    etypeenctype to check if its valid or not
    +
    -
    Returns:
    Return an error code for an failure or 0 on success (enctype valid).
    +
    Returns
    Return an error code for an failure or 0 on success (enctype valid).
    -

    - + + +

    ◆ krb5_free_keyblock()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock (krb5_context  context, krb5_context context,
    krb5_keyblock *  keyblock krb5_keyblock * keyblock 
    )
    +
    +

    Free a keyblock, also zero out the content of the keyblock, uses krb5_free_keyblock_contents() to free the content.

    +
    Parameters
    + + + +
    contexta Kerberos 5 context
    keyblockkeyblock to free, NULL is valid argument
    +
    +
    + +
    -
    + +

    ◆ krb5_free_keyblock_contents()

    -

    -Free a keyblock, also zero out the content of the keyblock, uses krb5_free_keyblock_contents() to free the content.

    -

    Parameters:
    - - - +
    +
    +
    context a Kerberos 5 context
    keyblock keyblock to free, NULL is valid argument
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock_contents (krb5_context context,
    krb5_keyblock * keyblock 
    )
    +
    +

    Free a keyblock's content, also zero out the content of the keyblock.

    +
    Parameters
    + + +
    contexta Kerberos 5 context
    keyblockkeyblock content to free, NULL is valid argument
    +
    -

    - + + +

    ◆ krb5_generate_random()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock_contents HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_random (krb5_context  context, void * buf,
    krb5_keyblock *  keyblock size_t len 
    )
    +
    +

    Fill buffer buf with len bytes of PRNG randomness that is ok to use for key generation, padding and public diclosing the randomness w/o disclosing the randomness source.

    +

    This function can fail, and callers must check the return value.

    +
    Parameters
    + + + +
    bufa buffer to fill with randomness
    lenlength of memory that buf points to.
    +
    +
    +
    Returns
    return 0 on success or HEIM_ERR_RANDOM_OFFLINE if the funcation failed to initialize the randomness source.
    +
    -
    +
    + +

    ◆ krb5_generate_random_block()

    -

    -Free a keyblock's content, also zero out the content of the keyblock.

    -

    Parameters:
    - - - +
    +
    +
    context a Kerberos 5 context
    keyblock keyblock content to free, NULL is valid argument
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_generate_random_block (void * buf,
    size_t len 
    )
    +
    +

    Fill buffer buf with len bytes of PRNG randomness that is ok to use for key generation, padding and public diclosing the randomness w/o disclosing the randomness source.

    +

    This function can NOT fail, instead it will abort() and program will crash.

    +

    If this function is called after a successful krb5_init_context(), the chance of it failing is low due to that krb5_init_context() pulls out some random, and quite commonly the randomness sources will not fail once it have started to produce good output, /dev/urandom behavies that way.

    +
    Parameters
    + + +
    bufa buffer to fill with randomness
    lenlength of memory that buf points to.
    +
    -

    - + + +

    ◆ krb5_generate_subkey_extended()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey_extended KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey_extended (krb5_context  context, krb5_context context,
    const krb5_keyblock *  key, const krb5_keyblock * key,
    krb5_enctype  etype, krb5_enctype etype,
    krb5_keyblock **  subkey krb5_keyblock ** subkey 
    )
    +
    +

    Generate subkey, from keyblock

    +
    Parameters
    + + + + + +
    contextkerberos context
    keysession key
    etypeencryption type of subkey, if ETYPE_NULL, use key's enctype
    subkeyreturned new, free with krb5_free_keyblock().
    +
    +
    +
    Returns
    0 on success or a Kerberos 5 error code
    +
    -
    +
    + +

    ◆ krb5_is_enctype_weak()

    -

    -Generate subkey, from keyblock

    -

    Parameters:
    - - - - - +
    +
    +
    context kerberos context
    key session key
    etype encryption type of subkey, if ETYPE_NULL, use key's enctype
    subkey returned new, free with krb5_free_keyblock().
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_enctype_weak (krb5_context context,
    krb5_enctype enctype 
    )
    +
    +

    Returns is the encryption is strong or weak

    +
    Parameters
    + + +
    contextKerberos 5 context
    enctypeencryption type to probe
    +
    -
    Returns:
    0 on success or a Kerberos 5 error code
    +
    Returns
    Returns true if encryption type is weak or is not supported.
    -

    - + + +

    ◆ krb5_keyblock_get_enctype()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_enctype KRB5_LIB_CALL krb5_keyblock_get_enctype KRB5_LIB_FUNCTION krb5_enctype KRB5_LIB_CALL krb5_keyblock_get_enctype (const krb5_keyblock *  block  ) const krb5_keyblock * block)
    -
    -
    +
    +

    Get encryption type of a keyblock.

    -

    -Get encryption type of a keyblock.

    -

    - + + +

    ◆ krb5_keyblock_init()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keyblock_init KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keyblock_init (krb5_context  context, krb5_context context,
    krb5_enctype  type, krb5_enctype type,
    const void *  data, const void * data,
    size_t  size, size_t size,
    krb5_keyblock *  key krb5_keyblock * key 
    )
    -
    -
    - -

    -Fill in `key' with key data of type `enctype' from `data' of length `size'. Key should be freed using krb5_free_keyblock_contents().

    -

    Returns:
    0 on success or a Kerberos 5 error code
    +
    +

    Fill in ‘key’ with key data of type ‘enctype’ from ‘data’ of length ‘size’. Key should be freed using krb5_free_keyblock_contents().

    +
    Returns
    0 on success or a Kerberos 5 error code
    -

    - + + +

    ◆ krb5_keyblock_zero()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_keyblock_zero KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_keyblock_zero (krb5_keyblock *  keyblock  ) krb5_keyblock * keyblock)
    -
    -
    - -

    -Zero out a keyblock

    -

    Parameters:
    - - +
    +

    Zero out a keyblock

    +
    Parameters
    +
    keyblock keyblock to zero out
    +
    keyblockkeyblock to zero out
    +
    -

    - + + +

    ◆ krb5_random_to_key()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_random_to_key KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_random_to_key (krb5_context  context, krb5_context context,
    krb5_enctype  type, krb5_enctype type,
    const void *  data, const void * data,
    size_t  size, size_t size,
    krb5_keyblock *  key krb5_keyblock * key 
    )
    -
    -
    - -

    -Converts the random bytestring to a protocol key according to Kerberos crypto frame work. It may be assumed that all the bits of the input string are equally random, even though the entropy present in the random source may be limited.

    -

    Parameters:
    - - - - - - +
    +

    Converts the random bytestring to a protocol key according to Kerberos crypto frame work. It may be assumed that all the bits of the input string are equally random, even though the entropy present in the random source may be limited.

    +
    Parameters
    +
    context Kerberos 5 context
    type the enctype resulting key will be of
    data input random data to convert to a key
    size size of input random data, at least krb5_enctype_keysize() long
    key key, output key, free with krb5_free_keyblock_contents()
    + + + + +
    contextKerberos 5 context
    typethe enctype resulting key will be of
    datainput random data to convert to a key
    sizesize of input random data, at least krb5_enctype_keysize() long
    keykey, output key, free with krb5_free_keyblock_contents()
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_verify_checksum_iov()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verify_checksum_iov KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verify_checksum_iov (krb5_context  context, krb5_context context,
    krb5_crypto  crypto, krb5_crypto crypto,
    unsigned  usage, unsigned usage,
    krb5_crypto_iov data, krb5_crypto_iovdata,
    unsigned int  num_data, unsigned int num_data,
    krb5_cksumtype *  type krb5_cksumtype * type 
    )
    -
    -
    - -

    -Verify a Kerberos message checksum.

    -

    Parameters:
    - - - - - - - +
    +

    Verify a Kerberos message checksum.

    +
    Parameters
    +
    context Kerberos context
    crypto Kerberos crypto context
    usage Key usage for this buffer
    data array of buffers to process
    num_data length of array
    type return checksum type if not NULL
    + + + + + +
    contextKerberos context
    cryptoKerberos crypto context
    usageKey usage for this buffer
    dataarray of buffers to process
    num_datalength of array
    typereturn checksum type if not NULL
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    +


    -Generated on Wed Jan 11 14:07:48 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__deprecated.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__deprecated.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__deprecated.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__deprecated.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 deprecated functions +Heimdal Kerberos 5 deprecated functions @@ -8,1282 +8,1260 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 deprecated functions
    +
    -

    Heimdal Kerberos 5 deprecated functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_change_password (krb5_context context, krb5_creds *creds, const char *newpw, int *result_code, krb5_data *result_code_string, krb5_data *result_string) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_config_parse_string_multi (krb5_context context, const char *string, krb5_config_section **res) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_keytype_to_enctypes (krb5_context context, krb5_keytype keytype, unsigned *len, krb5_enctype **val) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_enctypes_compatible_keys (krb5_context context, krb5_enctype etype1, krb5_enctype etype2) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_data_contents (krb5_context context, krb5_data *data) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_keytype_to_enctypes_default (krb5_context context, krb5_keytype keytype, unsigned *len, krb5_enctype **val) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_keytype_to_string (krb5_context context, krb5_keytype keytype, char **string) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_string_to_keytype (krb5_context context, const char *string, krb5_keytype *keytype) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_CALLCONV 
    krb5_password_key_proc (krb5_context context, krb5_enctype type, krb5_salt salt, krb5_const_pointer keyseed, krb5_keyblock **key) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_in_tkt_with_password (krb5_context context, krb5_flags options, krb5_addresses *addrs, const krb5_enctype *etypes, const krb5_preauthtype *pre_auth_types, const char *password, krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_in_tkt_with_skey (krb5_context context, krb5_flags options, krb5_addresses *addrs, const krb5_enctype *etypes, const krb5_preauthtype *pre_auth_types, const krb5_keyblock *key, krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_CALLCONV 
    krb5_keytab_key_proc (krb5_context context, krb5_enctype enctype, krb5_salt salt, krb5_const_pointer keyseed, krb5_keyblock **key) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_in_tkt_with_keytab (krb5_context context, krb5_flags options, krb5_addresses *addrs, const krb5_enctype *etypes, const krb5_preauthtype *pre_auth_types, krb5_keytab keytab, krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION krb5_realm
    -*KRB5_LIB_CALL 
    krb5_princ_realm (krb5_context context, krb5_principal principal) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_princ_set_realm (krb5_context context, krb5_principal principal, krb5_realm *realm) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_free_creds_contents (krb5_context context, krb5_creds *c) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_error_string (krb5_context context, char *str) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_set_error_string (krb5_context context, const char *fmt,...) __attribute__((format(printf
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_vset_error_string (krb5_context context, const char *fmt, va_list args) __attribute__((format(printf
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_clear_error_string (krb5_context context) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_cred_from_kdc_opt (krb5_context context, krb5_ccache ccache, krb5_creds *in_creds, krb5_creds **out_creds, krb5_creds ***ret_tgts, krb5_flags flags) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_cred_from_kdc (krb5_context context, krb5_ccache ccache, krb5_creds *in_creds, krb5_creds **out_creds, krb5_creds ***ret_tgts) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_unparsed_name (krb5_context context, char *str) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_generate_subkey (krb5_context context, const krb5_keyblock *key, krb5_keyblock **subkey) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_auth_getremoteseqnumber (krb5_context context, krb5_auth_context auth_context, int32_t *seqnumber) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_get_init_creds_opt_init (krb5_get_init_creds_opt *opt) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_get_init_creds_opt_get_error (krb5_context context, krb5_get_init_creds_opt *opt, KRB_ERROR **error) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_c_enctype_compare (krb5_context context, krb5_enctype e1, krb5_enctype e2, krb5_boolean *similar) KRB5_DEPRECATED_FUNCTION("Use X instead")
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_change_password (krb5_context context, krb5_creds *creds, const char *newpw, int *result_code, krb5_data *result_code_string, krb5_data *result_string) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_string_multi (krb5_context context, const char *string, krb5_config_section **res) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes (krb5_context context, krb5_keytype keytype, unsigned *len, krb5_enctype **val) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_enctypes_compatible_keys (krb5_context context, krb5_enctype etype1, krb5_enctype etype2) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data_contents (krb5_context context, krb5_data *data) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes_default (krb5_context context, krb5_keytype keytype, unsigned *len, krb5_enctype **val) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_string (krb5_context context, krb5_keytype keytype, char **string) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_string_to_keytype (krb5_context context, const char *string, krb5_keytype *keytype) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_password_key_proc (krb5_context context, krb5_enctype type, krb5_salt salt, krb5_const_pointer keyseed, krb5_keyblock **key) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_password (krb5_context context, krb5_flags options, krb5_addresses *addrs, const krb5_enctype *etypes, const krb5_preauthtype *pre_auth_types, const char *password, krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_skey (krb5_context context, krb5_flags options, krb5_addresses *addrs, const krb5_enctype *etypes, const krb5_preauthtype *pre_auth_types, const krb5_keyblock *key, krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_keytab_key_proc (krb5_context context, krb5_enctype enctype, krb5_salt salt, krb5_const_pointer keyseed, krb5_keyblock **key) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_keytab (krb5_context context, krb5_flags options, krb5_addresses *addrs, const krb5_enctype *etypes, const krb5_preauthtype *pre_auth_types, krb5_keytab keytab, krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_realm *KRB5_LIB_CALL krb5_princ_realm (krb5_context context, krb5_principal principal) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_princ_set_realm (krb5_context context, krb5_principal principal, krb5_realm *realm) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds_contents (krb5_context context, krb5_creds *c) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_string (krb5_context context, char *str) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_error_string (krb5_context context, const char *fmt,...) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vset_error_string (krb5_context context, const char *fmt, va_list args) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_string (krb5_context context) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc_opt (krb5_context context, krb5_ccache ccache, krb5_creds *in_creds, krb5_creds **out_creds, krb5_creds ***ret_tgts, krb5_flags flags) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc (krb5_context context, krb5_ccache ccache, krb5_creds *in_creds, krb5_creds **out_creds, krb5_creds ***ret_tgts) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_unparsed_name (krb5_context context, char *str) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey (krb5_context context, const krb5_keyblock *key, krb5_keyblock **subkey) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_getremoteseqnumber (krb5_context context, krb5_auth_context auth_context, int32_t *seqnumber) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_init (krb5_get_init_creds_opt *opt) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_get_error (krb5_context context, krb5_get_init_creds_opt *opt, KRB_ERROR **error) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_c_enctype_compare (krb5_context context, krb5_enctype e1, krb5_enctype e2, krb5_boolean *similar) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_auth_getremoteseqnumber()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_getremoteseqnumber KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_getremoteseqnumber (krb5_context  context, krb5_context context,
    krb5_auth_context  auth_context, krb5_auth_context auth_context,
    int32_t *  seqnumber int32_t * seqnumber 
    )
    -
    -
    +
    +

    Deprecated: use krb5_auth_con_getremoteseqnumber()

    -

    -Deprecated: use krb5_auth_con_getremoteseqnumber()

    -

    - +

    + +

    ◆ krb5_c_enctype_compare()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_c_enctype_compare KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_c_enctype_compare (krb5_context  context, krb5_context context,
    krb5_enctype  e1, krb5_enctype e1,
    krb5_enctype  e2, krb5_enctype e2,
    krb5_boolean *  similar krb5_boolean * similar 
    )
    -
    -
    +
    +

    Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    -Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    - + + +

    ◆ krb5_change_password()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_change_password KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_change_password (krb5_context  context, krb5_context context,
    krb5_creds *  creds, krb5_creds * creds,
    const char *  newpw, const char * newpw,
    int *  result_code, int * result_code,
    krb5_data *  result_code_string, krb5_data * result_code_string,
    krb5_data *  result_string krb5_data * result_string 
    )
    -
    -
    - -

    -Deprecated: krb5_change_password() is deprecated, use krb5_set_password().

    -

    Parameters:
    - - - - - - - +
    +

    Deprecated: krb5_change_password() is deprecated, use krb5_set_password().

    +
    Parameters
    +
    context a Keberos context
    creds 
    newpw 
    result_code 
    result_code_string 
    result_string 
    + + + + + +
    contexta Keberos context
    creds
    newpw
    result_code
    result_code_string
    result_string
    +
    -
    Returns:
    On sucess password is changed.
    -@ +
    Returns
    On sucess password is changed.
    +

    @

    +
    -

    - + + +

    ◆ krb5_clear_error_string()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_string KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_string (krb5_context  context  ) krb5_context context)
    -
    -
    - -

    -Clear the error message returned by krb5_get_error_string().

    -Deprecated: use krb5_clear_error_message()

    -

    Parameters:
    - - +
    +

    Clear the error message returned by krb5_get_error_string().

    +

    Deprecated: use krb5_clear_error_message()

    +
    Parameters
    +
    context Kerberos context
    +
    contextKerberos context
    +
    -

    - + + +

    ◆ krb5_config_parse_string_multi()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_string_multi KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_string_multi (krb5_context  context, krb5_context context,
    const char *  string, const char * string,
    krb5_config_section **  res krb5_config_section ** res 
    )
    -
    -
    +
    +

    Deprecated: configuration files are not strings

    -

    -Deprecated: configuration files are not strings

    -

    - + + +

    ◆ krb5_enctypes_compatible_keys()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_enctypes_compatible_keys KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_enctypes_compatible_keys (krb5_context  context, krb5_context context,
    krb5_enctype  etype1, krb5_enctype etype1,
    krb5_enctype  etype2 krb5_enctype etype2 
    )
    -
    -
    +
    +

    Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    -Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    - + + +

    ◆ krb5_free_creds_contents()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds_contents KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds_contents (krb5_context  context, krb5_context context,
    krb5_creds *  c krb5_creds * c 
    )
    -
    -
    +
    +

    Deprecated: use krb5_free_cred_contents()

    -

    -Deprecated: use krb5_free_cred_contents()

    -

    - + + +

    ◆ krb5_free_data_contents()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data_contents KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data_contents (krb5_context  context, krb5_context context,
    krb5_data *  data krb5_data * data 
    )
    -
    -
    - -

    -Same as krb5_data_free(). MIT compat.

    -Deprecated: use krb5_data_free().

    -

    Parameters:
    - - - +
    +

    Same as krb5_data_free(). MIT compat.

    +

    Deprecated: use krb5_data_free().

    +
    Parameters
    +
    context Kerberos 5 context.
    data krb5_data to free.
    + +
    contextKerberos 5 context.
    datakrb5_data to free.
    +
    -

    - + + +

    ◆ krb5_free_error_string()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_string KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_string (krb5_context  context, krb5_context context,
    char *  str char * str 
    )
    -
    -
    - -

    -Free the error message returned by krb5_get_error_string().

    -Deprecated: use krb5_free_error_message()

    -

    Parameters:
    - - - +
    +

    Free the error message returned by krb5_get_error_string().

    +

    Deprecated: use krb5_free_error_message()

    +
    Parameters
    +
    context Kerberos context
    str error message to free
    + +
    contextKerberos context
    strerror message to free
    +
    -

    - + + +

    ◆ krb5_free_unparsed_name()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_unparsed_name KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_unparsed_name (krb5_context  context, krb5_context context,
    char *  str char * str 
    )
    -
    -
    +
    +

    Deprecated: use krb5_xfree().

    -

    -Deprecated: use krb5_xfree().

    -

    - + + +

    ◆ krb5_generate_subkey()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey (krb5_context  context, krb5_context context,
    const krb5_keyblock *  key, const krb5_keyblock * key,
    krb5_keyblock **  subkey krb5_keyblock ** subkey 
    )
    -
    -
    +
    -

    - + + +

    ◆ krb5_get_cred_from_kdc()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc (krb5_context  context, krb5_context context,
    krb5_ccache  ccache, krb5_ccache ccache,
    krb5_creds *  in_creds, krb5_creds * in_creds,
    krb5_creds **  out_creds, krb5_creds ** out_creds,
    krb5_creds ***  ret_tgts krb5_creds *** ret_tgts 
    )
    -
    -
    +
    +

    Deprecated: use krb5_get_credentials_with_flags().

    -

    -Deprecated: use krb5_get_credentials_with_flags().

    -

    - + + +

    ◆ krb5_get_cred_from_kdc_opt()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc_opt KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc_opt (krb5_context  context, krb5_context context,
    krb5_ccache  ccache, krb5_ccache ccache,
    krb5_creds *  in_creds, krb5_creds * in_creds,
    krb5_creds **  out_creds, krb5_creds ** out_creds,
    krb5_creds ***  ret_tgts, krb5_creds *** ret_tgts,
    krb5_flags  flags krb5_flags flags 
    )
    -
    -
    +
    +

    Deprecated: use krb5_get_credentials_with_flags().

    -

    -Deprecated: use krb5_get_credentials_with_flags().

    -

    - + + +

    ◆ krb5_get_in_tkt_with_keytab()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_keytab KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_keytab (krb5_context  context, krb5_context context,
    krb5_flags  options, krb5_flags options,
    krb5_addresses *  addrs, krb5_addresses * addrs,
    const krb5_enctype *  etypes, const krb5_enctype * etypes,
    const krb5_preauthtype *  pre_auth_types, const krb5_preauthtype * pre_auth_types,
    krb5_keytab  keytab, krb5_keytab keytab,
    krb5_ccache  ccache, krb5_ccache ccache,
    krb5_creds *  creds, krb5_creds * creds,
    krb5_kdc_rep *  ret_as_reply krb5_kdc_rep * ret_as_reply 
    )
    -
    -
    +
    +

    Deprecated: use krb5_get_init_creds() and friends.

    -

    -Deprecated: use krb5_get_init_creds() and friends.

    -

    - + + +

    ◆ krb5_get_in_tkt_with_password()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_password KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_password (krb5_context  context, krb5_context context,
    krb5_flags  options, krb5_flags options,
    krb5_addresses *  addrs, krb5_addresses * addrs,
    const krb5_enctype *  etypes, const krb5_enctype * etypes,
    const krb5_preauthtype *  pre_auth_types, const krb5_preauthtype * pre_auth_types,
    const char *  password, const char * password,
    krb5_ccache  ccache, krb5_ccache ccache,
    krb5_creds *  creds, krb5_creds * creds,
    krb5_kdc_rep *  ret_as_reply krb5_kdc_rep * ret_as_reply 
    )
    -
    -
    +
    +

    Deprecated: use krb5_get_init_creds() and friends.

    -

    -Deprecated: use krb5_get_init_creds() and friends.

    -

    - + + +

    ◆ krb5_get_in_tkt_with_skey()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_skey KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_skey (krb5_context  context, krb5_context context,
    krb5_flags  options, krb5_flags options,
    krb5_addresses *  addrs, krb5_addresses * addrs,
    const krb5_enctype *  etypes, const krb5_enctype * etypes,
    const krb5_preauthtype *  pre_auth_types, const krb5_preauthtype * pre_auth_types,
    const krb5_keyblock *  key, const krb5_keyblock * key,
    krb5_ccache  ccache, krb5_ccache ccache,
    krb5_creds *  creds, krb5_creds * creds,
    krb5_kdc_rep *  ret_as_reply krb5_kdc_rep * ret_as_reply 
    )
    -
    -
    +
    +

    Deprecated: use krb5_get_init_creds() and friends.

    -

    -Deprecated: use krb5_get_init_creds() and friends.

    -

    - + + +

    ◆ krb5_get_init_creds_opt_get_error()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_get_error KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_get_error (krb5_context  context, krb5_context context,
    krb5_get_init_creds_opt *  opt, krb5_get_init_creds_opt * opt,
    KRB_ERROR **  error KRB_ERROR ** error 
    )
    -
    -
    +
    +

    Deprecated: use the new krb5_init_creds_init() and krb5_init_creds_get_error().

    -

    -Deprecated: use the new krb5_init_creds_init() and krb5_init_creds_get_error().

    -

    - + + +

    ◆ krb5_get_init_creds_opt_init()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_init KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_init (krb5_get_init_creds_opt *  opt  ) krb5_get_init_creds_opt * opt)
    -
    -
    +
    +

    Deprecated: use krb5_get_init_creds_opt_alloc().

    +

    The reason krb5_get_init_creds_opt_init() is deprecated is that krb5_get_init_creds_opt is a static structure and for ABI reason it can't grow, ie can't add new functionality.

    -

    -Deprecated: use krb5_get_init_creds_opt_alloc().

    -The reason krb5_get_init_creds_opt_init() is deprecated is that krb5_get_init_creds_opt is a static structure and for ABI reason it can't grow, ie can't add new functionality.

    -

    - + + +

    ◆ krb5_keytab_key_proc()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_keytab_key_proc KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_keytab_key_proc (krb5_context  context, krb5_context context,
    krb5_enctype  enctype, krb5_enctype enctype,
    krb5_salt  salt, krb5_salt salt,
    krb5_const_pointer  keyseed, krb5_const_pointer keyseed,
    krb5_keyblock **  key krb5_keyblock ** key 
    )
    -
    -
    +
    +

    Deprecated: use krb5_get_init_creds() and friends.

    -

    -Deprecated: use krb5_get_init_creds() and friends.

    -

    - + + +

    ◆ krb5_keytype_to_enctypes()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes (krb5_context  context, krb5_context context,
    krb5_keytype  keytype, krb5_keytype keytype,
    unsigned *  len, unsigned * len,
    krb5_enctype **  val krb5_enctype ** val 
    )
    -
    -
    +
    +

    Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    -Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    - + + +

    ◆ krb5_keytype_to_enctypes_default()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes_default KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes_default (krb5_context  context, krb5_context context,
    krb5_keytype  keytype, krb5_keytype keytype,
    unsigned *  len, unsigned * len,
    krb5_enctype **  val krb5_enctype ** val 
    )
    -
    -
    +
    +

    Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    -Deprecated: keytypes doesn't exists, they are really enctypes.

    -

    - + + +

    ◆ krb5_keytype_to_string()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_string KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_string (krb5_context  context, krb5_context context,
    krb5_keytype  keytype, krb5_keytype keytype,
    char **  string char ** string 
    )
    -
    -
    +
    +

    Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_enctype_to_string().

    -

    -Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_enctype_to_string().

    -

    - + + +

    ◆ krb5_password_key_proc()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_password_key_proc KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_password_key_proc (krb5_context  context, krb5_context context,
    krb5_enctype  type, krb5_enctype type,
    krb5_salt  salt, krb5_salt salt,
    krb5_const_pointer  keyseed, krb5_const_pointer keyseed,
    krb5_keyblock **  key krb5_keyblock ** key 
    )
    -
    -
    +
    +

    Deprecated: use krb5_get_init_creds() and friends.

    -

    -Deprecated: use krb5_get_init_creds() and friends.

    -

    - + + +

    ◆ krb5_princ_realm()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_realm* KRB5_LIB_CALL krb5_princ_realm KRB5_LIB_FUNCTION krb5_realm* KRB5_LIB_CALL krb5_princ_realm (krb5_context  context, krb5_context context,
    krb5_principal  principal krb5_principal principal 
    )
    -
    -
    +
    +

    Deprecated: use krb5_principal_get_realm()

    -

    -Deprecated: use krb5_principal_get_realm()

    -

    - + + +

    ◆ krb5_princ_set_realm()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_princ_set_realm KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_princ_set_realm (krb5_context  context, krb5_context context,
    krb5_principal  principal, krb5_principal principal,
    krb5_realm *  realm krb5_realm * realm 
    )
    -
    -
    +
    +

    Deprecated: use krb5_principal_set_realm()

    -

    -Deprecated: use krb5_principal_set_realm()

    -

    - + + +

    ◆ krb5_set_error_string()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_error_string KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_error_string (krb5_context  context, krb5_context context,
    const char *  fmt, const char * fmt,
      ...  ... 
    )
    -
    -
    - -

    -Set the error message returned by krb5_get_error_string().

    -Deprecated: use krb5_get_error_message()

    -

    Parameters:
    - - - +
    +

    Set the error message returned by krb5_get_error_string().

    +

    Deprecated: use krb5_get_error_message()

    +
    Parameters
    +
    context Kerberos context
    fmt error message to free
    + +
    contextKerberos context
    fmterror message to free
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    - + + +

    ◆ krb5_string_to_keytype()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_string_to_keytype KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_string_to_keytype (krb5_context  context, krb5_context context,
    const char *  string, const char * string,
    krb5_keytype *  keytype krb5_keytype * keytype 
    )
    -
    -
    +
    +

    Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_string_to_enctype().

    -

    -Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_string_to_enctype().

    -

    - + + +

    ◆ krb5_vset_error_string()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vset_error_string KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vset_error_string (krb5_context  context, krb5_context context,
    const char *  fmt, const char * fmt,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Set the error message returned by krb5_get_error_string(), deprecated, use krb5_set_error_message().

    -Deprecated: use krb5_vset_error_message()

    -

    Parameters:
    - - - +
    +

    Set the error message returned by krb5_get_error_string(), deprecated, use krb5_set_error_message().

    +

    Deprecated: use krb5_vset_error_message()

    +
    Parameters
    +
    context Kerberos context
    msg error message to free
    + + +
    contextKerberos context
    fmterror message to free
    argsvariable argument list vector
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    +


    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__digest.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__digest.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__digest.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__digest.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 digest service +Heimdal Kerberos 5 digest service @@ -8,80 +8,85 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 digest service
    +
    -

    Heimdal Kerberos 5 digest service

    - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_digest_probe (krb5_context context, krb5_realm realm, krb5_ccache ccache, unsigned *flags)
    + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_digest_probe (krb5_context context, krb5_realm realm, krb5_ccache ccache, unsigned *flags)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_digest_probe()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_digest_probe KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_digest_probe (krb5_context  context, krb5_context context,
    krb5_realm  realm, krb5_realm realm,
    krb5_ccache  ccache, krb5_ccache ccache,
    unsigned *  flags unsigned * flags 
    )
    -
    -
    - -

    -Get the supported/allowed mechanism for this principal.

    -

    Parameters:
    - - - - - +
    +

    Get the supported/allowed mechanism for this principal.

    +
    Parameters
    +
    context A Keberos context.
    realm The realm of the KDC.
    ccache The credential cache to use when talking to the KDC.
    flags The supported mechanism.
    + + + +
    contextA Keberos context.
    realmThe realm of the KDC.
    ccacheThe credential cache to use when talking to the KDC.
    flagsThe supported mechanism.
    +
    -
    Returns:
    Return an error code or 0.
    +
    Returns
    Return an error code or 0.
    -

    +
    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__error.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__error.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__error.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__error.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 error reporting functions +Heimdal Kerberos 5 error reporting functions @@ -8,232 +8,1069 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 error reporting functions
    +
    -

    Heimdal Kerberos 5 error reporting functions

    - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_eai_to_heim_errno (int eai_errno, int system_error)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION char *KRB5_LIB_CALL krb5_get_error_string (krb5_context context) KRB5_DEPRECATED_FUNCTION("Use krb5_get_error_message instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_eai_to_heim_errno (int eai_errno, int system_error)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_errno_to_heim_errno (int eai_errno)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_message (krb5_context context)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_error_message (krb5_context context, krb5_error_code ret, const char *fmt,...) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vset_error_message (krb5_context context, krb5_error_code ret, const char *fmt, va_list args) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_prepend_error_message (krb5_context context, krb5_error_code ret, const char *fmt,...) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vprepend_error_message (krb5_context context, krb5_error_code ret, const char *fmt, va_list args) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_get_error_message (krb5_context context, krb5_error_code code)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_message (krb5_context context, const char *msg)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarn (krb5_context context, krb5_error_code code, const char *fmt, va_list ap) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warn (krb5_context context, krb5_error_code code, const char *fmt,...) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarnx (krb5_context context, const char *fmt, va_list ap) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warnx (krb5_context context, const char *fmt,...) __attribute__((__format__(__printf__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verr (krb5_context context, int eval, krb5_error_code code, const char *fmt, va_list ap) __attribute__((__noreturn__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err (krb5_context context, int eval, krb5_error_code code, const char *fmt,...) __attribute__((__noreturn__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verrx (krb5_context context, int eval, const char *fmt, va_list ap) __attribute__((__noreturn__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_errx (krb5_context context, int eval, const char *fmt,...) __attribute__((__noreturn__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vabort (krb5_context context, krb5_error_code code, const char *fmt, va_list ap) __attribute__((__noreturn__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abort (krb5_context context, krb5_error_code code, const char *fmt,...) __attribute__((__noreturn__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abortx (krb5_context context, const char *fmt,...) __attribute__((__noreturn__
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_warn_dest (krb5_context context, krb5_log_facility *fac)
     
    KRB5_LIB_FUNCTION krb5_log_facility *KRB5_LIB_CALL krb5_get_warn_dest (krb5_context context)
     
    +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_abort()

    -
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_h_errno_to_heim_errno (int eai_errno)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abort (krb5_context context,
    krb5_error_code code,
    const char * fmt,
     ... 
    )
    +
    +

    Log a warning to the log, default stderr, include the error from the last failure and then abort.

    +
    Parameters
    + + + + + +
    contextA Kerberos 5 context
    codeerror code of the last error
    fmtmessage to print
    ...arguments for format string
    +
    +
    -
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_clear_error_message (krb5_context context)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_set_error_message (krb5_context context, krb5_error_code ret, const char *fmt,...) __attribute__((format(printf
    + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abortx (krb5_context context,
    const char * fmt,
     ... 
    )
    +
    +

    Log a warning to the log, default stderr, and then abort.

    +
    Parameters
    + + + + +
    contextA Kerberos 5 context
    fmtprintf format string of message to print
    ...arguments for format string
    +
    +
    -
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_vwarn (krb5_context context, krb5_error_code code, const char *fmt, va_list ap) __attribute__((format(printf
    -

    Detailed Description

    -

    Function Documentation

    -
    - + - - - + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_message KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_message (krb5_context  context  ) krb5_context context)
    +
    +

    Clears the error message from the Kerberos 5 context.

    +
    Parameters
    + + +
    contextThe Kerberos 5 context to clear
    +
    +
    +
    -
    +
    + +

    ◆ krb5_eai_to_heim_errno()

    -

    -Clears the error message from the Kerberos 5 context.

    -

    Parameters:
    - - +
    +
    +
    context The Kerberos 5 context to clear
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_eai_to_heim_errno (int eai_errno,
    int system_error 
    )
    +
    +

    Convert the getaddrinfo() error code to a Kerberos et error code.

    +
    Parameters
    + + +
    eai_errnocontains the error code from getaddrinfo().
    system_errorshould have the value of errno after the failed getaddrinfo().
    +
    +
    Returns
    Kerberos error code representing the EAI errors.
    -

    - +

    + +

    ◆ krb5_err()

    +
    - + - - + + + + + + + + + + + + + + - - + + + + + + + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_eai_to_heim_errno KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err (int  eai_errno, krb5_context context,
    int eval,
    krb5_error_code code,
    int  system_error const char * fmt,
     ... 
    )
    +
    +

    Log a warning to the log, default stderr, include bthe error from the last failure and then exit.

    +
    Parameters
    + + + + + +
    contextA Kerberos 5 context
    evalthe exit code to exit with
    codeerror code of the last error
    fmtmessage to print
    +
    +
    +
    -
    +
    + +

    ◆ krb5_errx()

    -

    -Convert the getaddrinfo() error code to a Kerberos et error code.

    -

    Parameters:
    - - - +
    +
    +
    eai_errno contains the error code from getaddrinfo().
    system_error should have the value of errno after the failed getaddrinfo().
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_errx (krb5_context context,
    int eval,
    const char * fmt,
     ... 
    )
    +
    +

    Log a warning to the log, default stderr, and then exit.

    +
    Parameters
    + + + +
    contextA Kerberos 5 context
    evalthe exit code to exit with
    fmtmessage to print
    +
    -
    Returns:
    Kerberos error code representing the EAI errors.
    -

    - + + +

    ◆ krb5_free_error_message()

    +
    - + - - - + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_errno_to_heim_errno KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_message (int  eai_errno  ) krb5_context context,
    const char * msg 
    )
    +
    +

    Free the error message returned by krb5_get_error_message().

    +
    Parameters
    + + + +
    contextKerberos context
    msgerror message to free, returned byg krb5_get_error_message().
    +
    +
    +
    -
    +
    + +

    ◆ krb5_get_error_message()

    -

    -Convert the gethostname() error code (h_error) to a Kerberos et error code.

    -

    Parameters:
    - - +
    +
    +
    eai_errno contains the error code from gethostname().
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_get_error_message (krb5_context context,
    krb5_error_code code 
    )
    +
    +

    Return the error message for ‘code’ in context. On memory allocation error the function returns NULL.

    +
    Parameters
    + + + +
    contextKerberos 5 context
    codeError code related to the error
    +
    +
    +
    Returns
    an error string, needs to be freed with krb5_free_error_message(). The functions return NULL on error.
    + +
    + + +

    ◆ krb5_get_error_string()

    + +
    +
    + + + + + + + + +
    KRB5_LIB_FUNCTION char* KRB5_LIB_CALL krb5_get_error_string (krb5_context context)
    +
    +

    Return the error message in context. On error or no error string, the function returns NULL.

    +
    Parameters
    + + +
    contextKerberos 5 context
    +
    +
    +
    Returns
    an error string, needs to be freed with krb5_free_error_message(). The functions return NULL on error.
    + +
    +
    + +

    ◆ krb5_get_warn_dest()

    + +
    +
    + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_log_facility* KRB5_LIB_CALL krb5_get_warn_dest (krb5_context context)
    +
    +

    Get the default logging facility.

    +
    Parameters
    + + +
    contextA Kerberos 5 context
    +
    +
    + +
    +
    + +

    ◆ krb5_h_errno_to_heim_errno()

    + +
    +
    + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_errno_to_heim_errno (int eai_errno)
    +
    +

    Convert the gethostname() error code (h_error) to a Kerberos et error code.

    +
    Parameters
    + +
    eai_errnocontains the error code from gethostname().
    +
    -
    Returns:
    Kerberos error code representing the gethostname errors.
    +
    Returns
    Kerberos error code representing the gethostname errors.
    -

    - + + +

    ◆ krb5_prepend_error_message()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_error_message KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_prepend_error_message (krb5_context  context, krb5_context context,
    krb5_error_code  ret, krb5_error_code ret,
    const char *  fmt, const char * fmt,
      ...  ... 
    )
    +
    +

    Prepend the context full error string for a specific error code. The error that is stored should be internationalized.

    +

    The if context is NULL, no error string is stored.

    +
    Parameters
    + + + + + +
    contextKerberos 5 context
    retThe error code
    fmtError string for the error code
    ...printf(3) style parameters.
    +
    +
    + +
    -
    + +

    ◆ krb5_set_error_message()

    -

    -Set the context full error string for a specific error code. The error that is stored should be internationalized.

    -The if context is NULL, no error string is stored.

    -

    Parameters:
    - - - - - +
    +
    +
    context Kerberos 5 context
    ret The error code
    fmt Error string for the error code
    ... printf(3) style parameters.
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_error_message (krb5_context context,
    krb5_error_code ret,
    const char * fmt,
     ... 
    )
    +
    +

    Set the context full error string for a specific error code. The error that is stored should be internationalized.

    +

    The if context is NULL, no error string is stored.

    +
    Parameters
    + + + + + +
    contextKerberos 5 context
    retThe error code
    fmtError string for the error code
    ...printf(3) style parameters.
    +
    +
    + +
    + + +

    ◆ krb5_set_warn_dest()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_warn_dest (krb5_context context,
    krb5_log_facility * fac 
    )
    +
    +

    Set the default logging facility.

    +
    Parameters
    + + +
    contextA Kerberos 5 context
    facFacility to use for logging.
    +
    -

    - + + +

    ◆ krb5_vabort()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarn KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vabort (krb5_context  context, krb5_context context,
    krb5_error_code  code, krb5_error_code code,
    const char *  fmt, const char * fmt,
    va_list  ap va_list ap 
    )
    +
    +

    Log a warning to the log, default stderr, include bthe error from the last failure and then abort.

    +
    Parameters
    + + + + + +
    contextA Kerberos 5 context
    codeerror code of the last error
    fmtmessage to print
    aparguments
    +
    +
    + +
    -
    + +

    ◆ krb5_verr()

    -

    -Log a warning to the log, default stderr, include the error from the last failure.

    -

    Parameters:
    - - - - - +
    +
    +
    context A Kerberos 5 context.
    code error code of the last error
    fmt message to print
    ap arguments
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verr (krb5_context context,
    int eval,
    krb5_error_code code,
    const char * fmt,
    va_list ap 
    )
    +
    +

    Log a warning to the log, default stderr, include bthe error from the last failure and then exit.

    +
    Parameters
    + + + + + + +
    contextA Kerberos 5 context
    evalthe exit code to exit with
    codeerror code of the last error
    fmtmessage to print
    aparguments
    +
    +
    + +
    + + +

    ◆ krb5_verrx()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verrx (krb5_context context,
    int eval,
    const char * fmt,
    va_list ap 
    )
    +
    +

    Log a warning to the log, default stderr, and then exit.

    +
    Parameters
    + + + + + +
    contextA Kerberos 5 context
    evalthe exit code to exit with
    fmtmessage to print
    aparguments
    +
    +
    + +
    +
    + +

    ◆ krb5_vprepend_error_message()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vprepend_error_message (krb5_context context,
    krb5_error_code ret,
    const char * fmt,
    va_list args 
    )
    +
    +

    Prepend the contexts's full error string for a specific error code.

    +

    The if context is NULL, no error string is stored.

    +
    Parameters
    + + + + + +
    contextKerberos 5 context
    retThe error code
    fmtError string for the error code
    argsprintf(3) style parameters.
    +
    +
    + +
    +
    + +

    ◆ krb5_vset_error_message()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vset_error_message (krb5_context context,
    krb5_error_code ret,
    const char * fmt,
    va_list args 
    )
    +
    +

    Set the context full error string for a specific error code.

    +

    The if context is NULL, no error string is stored.

    +
    Parameters
    + + + + + +
    contextKerberos 5 context
    retThe error code
    fmtError string for the error code
    argsprintf(3) style parameters.
    +
    +
    + +
    +
    + +

    ◆ krb5_vwarn()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarn (krb5_context context,
    krb5_error_code code,
    const char * fmt,
    va_list ap 
    )
    +
    +

    Log a warning to the log, default stderr, include the error from the last failure.

    +
    Parameters
    + + + + + +
    contextA Kerberos 5 context.
    codeerror code of the last error
    fmtmessage to print
    aparguments
    +
    +
    + +
    +
    + +

    ◆ krb5_vwarnx()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarnx (krb5_context context,
    const char * fmt,
    va_list ap 
    )
    +
    +

    Log a warning to the log, default stderr.

    +
    Parameters
    + + + + +
    contextA Kerberos 5 context.
    fmtmessage to print
    aparguments
    +
    +
    + +
    +
    + +

    ◆ krb5_warn()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warn (krb5_context context,
    krb5_error_code code,
    const char * fmt,
     ... 
    )
    +
    +

    Log a warning to the log, default stderr, include the error from the last failure.

    +
    Parameters
    + + + + +
    contextA Kerberos 5 context.
    codeerror code of the last error
    fmtmessage to print
    +
    +
    + +
    +
    + +

    ◆ krb5_warnx()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warnx (krb5_context context,
    const char * fmt,
     ... 
    )
    +
    +

    Log a warning to the log, default stderr.

    +
    Parameters
    + + +
    contextA Kerberos 5 context.
    fmtmessage to print
    +
    -

    +


    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__keytab.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__keytab.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__keytab.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__keytab.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 keytab handling functions +Heimdal Kerberos 5 keytab handling functions @@ -8,1048 +8,1033 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 keytab handling functions
    +
    -

    Heimdal Kerberos 5 keytab handling functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_register (krb5_context context, const krb5_kt_ops *ops)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_default_name (krb5_context context, char *name, size_t namesize)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_default_modify_name (krb5_context context, char *name, size_t namesize)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_default (krb5_context context, krb5_keytab *id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_read_service_key (krb5_context context, krb5_pointer keyprocarg, krb5_principal principal, krb5_kvno vno, krb5_enctype enctype, krb5_keyblock **key)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_get_type (krb5_context context, krb5_keytab keytab, char *prefix, size_t prefixsize)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_get_name (krb5_context context, krb5_keytab keytab, char *name, size_t namesize)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_get_full_name (krb5_context context, krb5_keytab keytab, char **str)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_close (krb5_context context, krb5_keytab id)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_destroy (krb5_context context, krb5_keytab id)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_kt_compare (krb5_context context, krb5_keytab_entry *entry, krb5_const_principal principal, krb5_kvno vno, krb5_enctype enctype)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_get_entry (krb5_context context, krb5_keytab id, krb5_const_principal principal, krb5_kvno kvno, krb5_enctype enctype, krb5_keytab_entry *entry)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_copy_entry_contents (krb5_context context, const krb5_keytab_entry *in, krb5_keytab_entry *out)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_free_entry (krb5_context context, krb5_keytab_entry *entry)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_start_seq_get (krb5_context context, krb5_keytab id, krb5_kt_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_next_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry *entry, krb5_kt_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_end_seq_get (krb5_context context, krb5_keytab id, krb5_kt_cursor *cursor)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_add_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry *entry)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_kt_remove_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry *entry)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_kt_have_content (krb5_context context, krb5_keytab id)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_register (krb5_context context, const krb5_kt_ops *ops)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_resolve (krb5_context context, const char *name, krb5_keytab *id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_name (krb5_context context, char *name, size_t namesize)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_modify_name (krb5_context context, char *name, size_t namesize)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default (krb5_context context, krb5_keytab *id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_read_service_key (krb5_context context, krb5_pointer keyprocarg, krb5_principal principal, krb5_kvno vno, krb5_enctype enctype, krb5_keyblock **key)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_type (krb5_context context, krb5_keytab keytab, char *prefix, size_t prefixsize)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_name (krb5_context context, krb5_keytab keytab, char *name, size_t namesize)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_full_name (krb5_context context, krb5_keytab keytab, char **str)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_close (krb5_context context, krb5_keytab id)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_destroy (krb5_context context, krb5_keytab id)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kt_compare (krb5_context context, krb5_keytab_entry *entry, krb5_const_principal principal, krb5_kvno vno, krb5_enctype enctype)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_entry (krb5_context context, krb5_keytab id, krb5_const_principal principal, krb5_kvno kvno, krb5_enctype enctype, krb5_keytab_entry *entry)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_copy_entry_contents (krb5_context context, const krb5_keytab_entry *in, krb5_keytab_entry *out)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_free_entry (krb5_context context, krb5_keytab_entry *entry)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_start_seq_get (krb5_context context, krb5_keytab id, krb5_kt_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_next_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry *entry, krb5_kt_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_end_seq_get (krb5_context context, krb5_keytab id, krb5_kt_cursor *cursor)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_add_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry *entry)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_remove_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry *entry)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_have_content (krb5_context context, krb5_keytab id)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_kt_add_entry()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_add_entry KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_add_entry (krb5_context  context, krb5_context context,
    krb5_keytab  id, krb5_keytab id,
    krb5_keytab_entry *  entry krb5_keytab_entry * entry 
    )
    -
    -
    - -

    -Add the entry in `entry' to the keytab `id'.

    -

    Parameters:
    - - - - +
    +

    Add the entry in ‘entry’ to the keytab ‘id’.

    +
    Parameters
    +
    context a Keberos context.
    id a keytab.
    entry the entry to add
    + + +
    contexta Keberos context.
    ida keytab.
    entrythe entry to add
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - +

    + +

    ◆ krb5_kt_close()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_close KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_close (krb5_context  context, krb5_context context,
    krb5_keytab  id krb5_keytab id 
    )
    -
    -
    - -

    -Finish using the keytab in `id'. All resources will be released, even on errors.

    -

    Parameters:
    - - - +
    +

    Finish using the keytab in ‘id’. All resources will be released, even on errors.

    +
    Parameters
    +
    context a Keberos context.
    id keytab to close.
    + +
    contexta Keberos context.
    idkeytab to close.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_compare()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kt_compare KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kt_compare (krb5_context  context, krb5_context context,
    krb5_keytab_entry *  entry, krb5_keytab_entry * entry,
    krb5_const_principal  principal, krb5_const_principal principal,
    krb5_kvno  vno, krb5_kvno vno,
    krb5_enctype  enctype krb5_enctype enctype 
    )
    -
    -
    - -

    -Compare `entry' against `principal, vno, enctype'. Any of `principal, vno, enctype' might be 0 which acts as a wildcard. Return TRUE if they compare the same, FALSE otherwise.

    -

    Parameters:
    - - - - - - +
    +

    Compare ‘entry’ against ‘principal, vno, enctype’. Any of ‘principal, vno, enctype’ might be 0 which acts as a wildcard. Return TRUE if they compare the same, FALSE otherwise.

    +
    Parameters
    +
    context a Keberos context.
    entry an entry to match with.
    principal principal to match, NULL matches all principals.
    vno key version to match, 0 matches all key version numbers.
    enctype encryption type to match, 0 matches all encryption types.
    + + + + +
    contexta Keberos context.
    entryan entry to match with.
    principalprincipal to match, NULL matches all principals.
    vnokey version to match, 0 matches all key version numbers.
    enctypeencryption type to match, 0 matches all encryption types.
    +
    -
    Returns:
    Return TRUE or match, FALSE if not matched.
    +
    Returns
    Return TRUE or match, FALSE if not matched.
    -

    - + + +

    ◆ krb5_kt_copy_entry_contents()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_copy_entry_contents KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_copy_entry_contents (krb5_context  context, krb5_context context,
    const krb5_keytab_entry *  in, const krb5_keytab_entry * in,
    krb5_keytab_entry *  out krb5_keytab_entry * out 
    )
    -
    -
    - -

    -Copy the contents of `in' into `out'.

    -

    Parameters:
    - - - - +
    +

    Copy the contents of ‘in’ into ‘out’.

    +
    Parameters
    +
    context a Keberos context.
    in the keytab entry to copy.
    out the copy of the keytab entry, free with krb5_kt_free_entry().
    + + +
    contexta Keberos context.
    inthe keytab entry to copy.
    outthe copy of the keytab entry, free with krb5_kt_free_entry().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_default()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default (krb5_context  context, krb5_context context,
    krb5_keytab *  id krb5_keytab * id 
    )
    -
    -
    - -

    -Set `id' to the default keytab.

    -

    Parameters:
    - - - +
    +

    Set ‘id’ to the default keytab.

    +
    Parameters
    +
    context a Keberos context.
    id the new default keytab.
    + +
    contexta Keberos context.
    idthe new default keytab.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_default_modify_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_modify_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_modify_name (krb5_context  context, krb5_context context,
    char *  name, char * name,
    size_t  namesize size_t namesize 
    )
    -
    -
    - -

    -Copy the name of the default modify keytab into `name'.

    -

    Parameters:
    - - - - +
    +

    Copy the name of the default modify keytab into ‘name’.

    +
    Parameters
    +
    context a Keberos context.
    name buffer where the name will be written
    namesize length of name
    + + +
    contexta Keberos context.
    namebuffer where the name will be written
    namesizelength of name
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_default_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_name (krb5_context  context, krb5_context context,
    char *  name, char * name,
    size_t  namesize size_t namesize 
    )
    -
    -
    - -

    -copy the name of the default keytab into `name'.

    -

    Parameters:
    - - - - +
    +

    copy the name of the default keytab into ‘name’.

    +
    Parameters
    +
    context a Keberos context.
    name buffer where the name will be written
    namesize length of name
    + + +
    contexta Keberos context.
    namebuffer where the name will be written
    namesizelength of name
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_destroy()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_destroy KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_destroy (krb5_context  context, krb5_context context,
    krb5_keytab  id krb5_keytab id 
    )
    -
    -
    - -

    -Destroy (remove) the keytab in `id'. All resources will be released, even on errors, does the equvalment of krb5_kt_close() on the resources.

    -

    Parameters:
    - - - +
    +

    Destroy (remove) the keytab in ‘id’. All resources will be released, even on errors, does the equvalment of krb5_kt_close() on the resources.

    +
    Parameters
    +
    context a Keberos context.
    id keytab to destroy.
    + +
    contexta Keberos context.
    idkeytab to destroy.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_end_seq_get()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_end_seq_get KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_end_seq_get (krb5_context  context, krb5_context context,
    krb5_keytab  id, krb5_keytab id,
    krb5_kt_cursor *  cursor krb5_kt_cursor * cursor 
    )
    -
    -
    - -

    -Release all resources associated with `cursor'.

    -

    Parameters:
    - - - - +
    +

    Release all resources associated with ‘cursor’.

    +
    Parameters
    +
    context a Keberos context.
    id a keytab.
    cursor the cursor to free.
    + + +
    contexta Keberos context.
    ida keytab.
    cursorthe cursor to free.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_free_entry()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_free_entry KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_free_entry (krb5_context  context, krb5_context context,
    krb5_keytab_entry *  entry krb5_keytab_entry * entry 
    )
    -
    -
    - -

    -Free the contents of `entry'.

    -

    Parameters:
    - - - +
    +

    Free the contents of ‘entry’.

    +
    Parameters
    +
    context a Keberos context.
    entry the entry to free
    + +
    contexta Keberos context.
    entrythe entry to free
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_get_entry()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_entry KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_entry (krb5_context  context, krb5_context context,
    krb5_keytab  id, krb5_keytab id,
    krb5_const_principal  principal, krb5_const_principal principal,
    krb5_kvno  kvno, krb5_kvno kvno,
    krb5_enctype  enctype, krb5_enctype enctype,
    krb5_keytab_entry *  entry krb5_keytab_entry * entry 
    )
    -
    -
    - -

    -Retrieve the keytab entry for `principal, kvno, enctype' into `entry' from the keytab `id'. Matching is done like krb5_kt_compare().

    -

    Parameters:
    - - - - - - - +
    +

    Retrieve the keytab entry for ‘principal, kvno, enctype’ into ‘entry’ from the keytab ‘id’. Matching is done like krb5_kt_compare().

    +
    Parameters
    +
    context a Keberos context.
    id a keytab.
    principal principal to match, NULL matches all principals.
    kvno key version to match, 0 matches all key version numbers.
    enctype encryption type to match, 0 matches all encryption types.
    entry the returned entry, free with krb5_kt_free_entry().
    + + + + + +
    contexta Keberos context.
    ida keytab.
    principalprincipal to match, NULL matches all principals.
    kvnokey version to match, 0 matches all key version numbers.
    enctypeencryption type to match, 0 matches all encryption types.
    entrythe returned entry, free with krb5_kt_free_entry().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_get_full_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_full_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_full_name (krb5_context  context, krb5_context context,
    krb5_keytab  keytab, krb5_keytab keytab,
    char **  str char ** str 
    )
    -
    -
    - -

    -Retrieve the full name of the keytab `keytab' and store the name in `str'.

    -

    Parameters:
    - - - - +
    +

    Retrieve the full name of the keytab ‘keytab’ and store the name in ‘str’.

    +
    Parameters
    +
    context a Keberos context.
    keytab keytab to get name for.
    str the name of the keytab name, usee krb5_xfree() to free the string. On error, *str is set to NULL.
    + + +
    contexta Keberos context.
    keytabkeytab to get name for.
    strthe name of the keytab name, usee krb5_xfree() to free the string. On error, *str is set to NULL.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_get_name()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_name (krb5_context  context, krb5_context context,
    krb5_keytab  keytab, krb5_keytab keytab,
    char *  name, char * name,
    size_t  namesize size_t namesize 
    )
    -
    -
    - -

    -Retrieve the name of the keytab `keytab' into `name', `namesize'

    -

    Parameters:
    - - - - - +
    +

    Retrieve the name of the keytab ‘keytab’ into ‘name’, ‘namesize’

    +
    Parameters
    +
    context a Keberos context.
    keytab the keytab to get the name for.
    name name buffer.
    namesize size of name buffer.
    + + + +
    contexta Keberos context.
    keytabthe keytab to get the name for.
    namename buffer.
    namesizesize of name buffer.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_get_type()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_type KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_type (krb5_context  context, krb5_context context,
    krb5_keytab  keytab, krb5_keytab keytab,
    char *  prefix, char * prefix,
    size_t  prefixsize size_t prefixsize 
    )
    -
    -
    - -

    -Return the type of the `keytab' in the string `prefix of length `prefixsize'.

    -

    Parameters:
    - - - - - +
    +

    Return the type of the ‘keytab’ in the string prefix of length prefixsize'.

    +
    Parameters
    +
    context a Keberos context.
    keytab the keytab to get the prefix for
    prefix prefix buffer
    prefixsize length of prefix buffer
    + + + +
    contexta Keberos context.
    keytabthe keytab to get the prefix for
    prefixprefix buffer
    prefixsizelength of prefix buffer
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_have_content()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kt_have_content KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_have_content (krb5_context  context, krb5_context context,
    krb5_keytab  id krb5_keytab id 
    )
    -
    -
    - -

    -Return true if the keytab exists and have entries

    -

    Parameters:
    - - - +
    +

    Return true if the keytab exists and have entries

    +
    Parameters
    +
    context a Keberos context.
    id a keytab.
    + +
    contexta Keberos context.
    ida keytab.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_next_entry()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_next_entry KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_next_entry (krb5_context  context, krb5_context context,
    krb5_keytab  id, krb5_keytab id,
    krb5_keytab_entry *  entry, krb5_keytab_entry * entry,
    krb5_kt_cursor *  cursor krb5_kt_cursor * cursor 
    )
    -
    -
    - -

    -Get the next entry from keytab, advance the cursor. On last entry the function will return KRB5_KT_END.

    -

    Parameters:
    - - - - - +
    +

    Get the next entry from keytab, advance the cursor. On last entry the function will return KRB5_KT_END.

    +
    Parameters
    +
    context a Keberos context.
    id a keytab.
    entry the returned entry, free with krb5_kt_free_entry().
    cursor the cursor of the iteration.
    + + + +
    contexta Keberos context.
    ida keytab.
    entrythe returned entry, free with krb5_kt_free_entry().
    cursorthe cursor of the iteration.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_read_service_key()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_read_service_key KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_read_service_key (krb5_context  context, krb5_context context,
    krb5_pointer  keyprocarg, krb5_pointer keyprocarg,
    krb5_principal  principal, krb5_principal principal,
    krb5_kvno  vno, krb5_kvno vno,
    krb5_enctype  enctype, krb5_enctype enctype,
    krb5_keyblock **  key krb5_keyblock ** key 
    )
    -
    -
    - -

    -Read the key identified by `(principal, vno, enctype)' from the keytab in `keyprocarg' (the default if == NULL) into `*key'.

    -

    Parameters:
    - - - - - - - +
    +

    Read the key identified by ‘(principal, vno, enctype)’ from the keytab in ‘keyprocarg’ (the default if == NULL) into ‘*key’.

    +
    Parameters
    +
    context a Keberos context.
    keyprocarg 
    principal 
    vno 
    enctype 
    key 
    + + + + + +
    contexta Keberos context.
    keyprocarg
    principal
    vno
    enctype
    key
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_register()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_register KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_register (krb5_context  context, krb5_context context,
    const krb5_kt_ops *  ops const krb5_kt_ops * ops 
    )
    -
    -
    - -

    -Register a new keytab backend.

    -

    Parameters:
    - - - +
    +

    Register a new keytab backend.

    +
    Parameters
    +
    context a Keberos context.
    ops a backend to register.
    + +
    contexta Keberos context.
    opsa backend to register.
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_remove_entry()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_remove_entry KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_remove_entry (krb5_context  context, krb5_context context,
    krb5_keytab  id, krb5_keytab id,
    krb5_keytab_entry *  entry krb5_keytab_entry * entry 
    )
    -
    -
    - -

    -Remove an entry from the keytab, matching is done using krb5_kt_compare().

    -

    Parameters:
    - - - - +
    +

    Remove an entry from the keytab, matching is done using krb5_kt_compare().

    +
    Parameters
    +
    context a Keberos context.
    id a keytab.
    entry the entry to remove
    + + +
    contexta Keberos context.
    ida keytab.
    entrythe entry to remove
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_resolve()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_resolve KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_resolve (krb5_context  context, krb5_context context,
    const char *  name, const char * name,
    krb5_keytab *  id krb5_keytab * id 
    )
    -
    -
    - -

    -Resolve the keytab name (of the form `type:residual') in `name' into a keytab in `id'.

    -

    Parameters:
    - - - - +
    +

    Resolve the keytab name (of the form ‘type:residual’) in ‘name’ into a keytab in ‘id’.

    +
    Parameters
    +
    context a Keberos context.
    name name to resolve
    id resulting keytab, free with krb5_kt_close().
    + + +
    contexta Keberos context.
    namename to resolve
    idresulting keytab, free with krb5_kt_close().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_kt_start_seq_get()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_start_seq_get KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_start_seq_get (krb5_context  context, krb5_context context,
    krb5_keytab  id, krb5_keytab id,
    krb5_kt_cursor *  cursor krb5_kt_cursor * cursor 
    )
    -
    -
    - -

    -Set `cursor' to point at the beginning of `id'.

    -

    Parameters:
    - - - - +
    +

    Set ‘cursor’ to point at the beginning of ‘id’.

    +
    Parameters
    +
    context a Keberos context.
    id a keytab.
    cursor a newly allocated cursor, free with krb5_kt_end_seq_get().
    + + +
    contexta Keberos context.
    ida keytab.
    cursora newly allocated cursor, free with krb5_kt_end_seq_get().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    +


    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__pac.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__pac.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__pac.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__pac.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 PAC handling functions +Heimdal Kerberos 5 PAC handling functions @@ -8,148 +8,152 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 PAC handling functions
    +
    -

    Heimdal Kerberos 5 PAC handling functions

    - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_pac_get_buffer (krb5_context context, krb5_pac p, uint32_t type, krb5_data *data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_pac_verify (krb5_context context, const krb5_pac pac, time_t authtime, krb5_const_principal principal, const krb5_keyblock *server, const krb5_keyblock *privsvr)
    + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_get_buffer (krb5_context context, krb5_pac p, uint32_t type, krb5_data *data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_verify (krb5_context context, const krb5_pac pac, time_t authtime, krb5_const_principal principal, const krb5_keyblock *server, const krb5_keyblock *privsvr)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_pac_get_buffer()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_get_buffer KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_get_buffer (krb5_context  context, krb5_context context,
    krb5_pac  p, krb5_pac p,
    uint32_t  type, uint32_t type,
    krb5_data *  data krb5_data * data 
    )
    -
    -
    - -

    -Get the PAC buffer of specific type from the pac.

    -

    Parameters:
    - - - - - +
    +

    Get the PAC buffer of specific type from the pac.

    +
    Parameters
    +
    context Kerberos 5 context.
    p the pac structure returned by krb5_pac_parse().
    type type of buffer to get
    data return data, free with krb5_data_free().
    + + + +
    contextKerberos 5 context.
    pthe pac structure returned by krb5_pac_parse().
    typetype of buffer to get
    datareturn data, free with krb5_data_free().
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - +

    + +

    ◆ krb5_pac_verify()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_verify KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_verify (krb5_context  context, krb5_context context,
    const krb5_pac  pac, const krb5_pac pac,
    time_t  authtime, time_t authtime,
    krb5_const_principal  principal, krb5_const_principal principal,
    const krb5_keyblock *  server, const krb5_keyblock * server,
    const krb5_keyblock *  privsvr const krb5_keyblock * privsvr 
    )
    -
    -
    - -

    -Verify the PAC.

    -

    Parameters:
    - - - - - - - +
    +

    Verify the PAC.

    +
    Parameters
    +
    context Kerberos 5 context.
    pac the pac structure returned by krb5_pac_parse().
    authtime The time of the ticket the PAC belongs to.
    principal the principal to verify.
    server The service key, most always be given.
    privsvr The KDC key, may be given.
    + + + + + +
    contextKerberos 5 context.
    pacthe pac structure returned by krb5_pac_parse().
    authtimeThe time of the ticket the PAC belongs to.
    principalthe principal to verify.
    serverThe service key, most always be given.
    privsvrThe KDC key, may be given.
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    +


    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__principal.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__principal.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__principal.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__principal.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 principal functions +Heimdal Kerberos 5 principal functions @@ -8,1173 +8,1373 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 principal functions
    +
    -

    Heimdal Kerberos 5 principal functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_free_principal (krb5_context context, krb5_principal p)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_principal_set_type (krb5_context context, krb5_principal principal, int type)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_principal_get_type (krb5_context context, krb5_const_principal principal)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_principal_get_realm (krb5_context context, krb5_const_principal principal)
    KRB5_LIB_FUNCTION unsigned int
    -KRB5_LIB_CALL 
    krb5_principal_get_num_comp (krb5_context context, krb5_const_principal principal)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_parse_name_flags (krb5_context context, const char *name, int flags, krb5_principal *principal)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_parse_name (krb5_context context, const char *name, krb5_principal *principal)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_unparse_name_fixed (krb5_context context, krb5_const_principal principal, char *name, size_t len)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_unparse_name_fixed_short (krb5_context context, krb5_const_principal principal, char *name, size_t len)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_unparse_name_fixed_flags (krb5_context context, krb5_const_principal principal, int flags, char *name, size_t len)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_unparse_name (krb5_context context, krb5_const_principal principal, char **name)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_unparse_name_flags (krb5_context context, krb5_const_principal principal, int flags, char **name)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_unparse_name_short (krb5_context context, krb5_const_principal principal, char **name)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_principal_set_realm (krb5_context context, krb5_principal principal, krb5_const_realm realm)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_build_principal (krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm,...)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_make_principal (krb5_context context, krb5_principal *principal, krb5_const_realm realm,...)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_copy_principal (krb5_context context, krb5_const_principal inprinc, krb5_principal *outprinc)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_principal_compare_any_realm (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_principal_compare (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_realm_compare (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_principal_match (krb5_context context, krb5_const_principal princ, krb5_const_principal pattern)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_sname_to_principal (krb5_context context, const char *hostname, const char *sname, int32_t type, krb5_principal *ret_princ)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_parse_nametype (krb5_context context, const char *str, int32_t *nametype)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_principal_is_krbtgt (krb5_context context, krb5_const_principal p)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_principal (krb5_context context, krb5_principal p)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_principal_set_type (krb5_context context, krb5_principal principal, int type)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_principal_get_type (krb5_context context, krb5_const_principal principal)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_principal_get_realm (krb5_context context, krb5_const_principal principal)
     
    KRB5_LIB_FUNCTION unsigned int KRB5_LIB_CALL krb5_principal_get_num_comp (krb5_context context, krb5_const_principal principal)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name_flags (krb5_context context, const char *name, int flags, krb5_principal *principal)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name (krb5_context context, const char *name, krb5_principal *principal)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed (krb5_context context, krb5_const_principal principal, char *name, size_t len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_short (krb5_context context, krb5_const_principal principal, char *name, size_t len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_flags (krb5_context context, krb5_const_principal principal, int flags, char *name, size_t len)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name (krb5_context context, krb5_const_principal principal, char **name)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_flags (krb5_context context, krb5_const_principal principal, int flags, char **name)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_short (krb5_context context, krb5_const_principal principal, char **name)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_principal_set_realm (krb5_context context, krb5_principal principal, krb5_const_realm realm)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_build_principal (krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm,...)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_principal (krb5_context context, krb5_principal *principal, krb5_const_realm realm,...)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_principal (krb5_context context, krb5_const_principal inprinc, krb5_principal *outprinc)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare_any_realm (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_realm_compare (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_match (krb5_context context, krb5_const_principal princ, krb5_const_principal pattern)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_nametype (krb5_context context, const char *str, int32_t *nametype)
     
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_null (krb5_context context, krb5_const_principal principal)
     
    krb5_boolean KRB5_LIB_FUNCTION krb5_realm_is_lkdc (const char *realm)
     
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_lkdc (krb5_context context, krb5_const_principal principal)
     
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_pku2u (krb5_context context, krb5_const_principal principal)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_krbtgt (krb5_context context, krb5_const_principal p)
     
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_gss_hostbased_service (krb5_context context, krb5_const_principal principal)
     
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_root_krbtgt (krb5_context context, krb5_const_principal p)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_anonymous (krb5_context context, krb5_const_principal p, unsigned int flags)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sname_to_principal (krb5_context context, const char *hostname, const char *sname, int32_t type, krb5_principal *ret_princ)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_build_principal()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_build_principal KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_build_principal (krb5_context  context, krb5_context context,
    krb5_principal *  principal, krb5_principal * principal,
    int  rlen, int rlen,
    krb5_const_realm  realm, krb5_const_realm realm,
      ...  ... 
    )
    -
    -
    - -

    -Build a principal using vararg style building

    -

    Parameters:
    - - - - - - +
    +

    Build a principal using vararg style building

    +
    Parameters
    +
    context A Kerberos context.
    principal returned principal
    rlen length of realm
    realm realm name
    ... a list of components ended with NULL.
    + + + + +
    contextA Kerberos context.
    principalreturned principal
    rlenlength of realm
    realmrealm name
    ...a list of components ended with NULL.
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - +

    + +

    ◆ krb5_copy_principal()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_principal KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_principal (krb5_context  context, krb5_context context,
    krb5_const_principal  inprinc, krb5_const_principal inprinc,
    krb5_principal *  outprinc krb5_principal * outprinc 
    )
    -
    -
    - -

    -Copy a principal

    -

    Parameters:
    - - - - +
    +

    Copy a principal

    +
    Parameters
    +
    context A Kerberos context.
    inprinc principal to copy
    outprinc copied principal, free with krb5_free_principal()
    + + +
    contextA Kerberos context.
    inprincprincipal to copy
    outprinccopied principal, free with krb5_free_principal()
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_free_principal()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_principal KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_principal (krb5_context  context, krb5_context context,
    krb5_principal  p krb5_principal p 
    )
    -
    -
    - -

    -Frees a Kerberos principal allocated by the library with krb5_parse_name(), krb5_make_principal() or any other related principal functions.

    -

    Parameters:
    - - - +
    +

    Frees a Kerberos principal allocated by the library with krb5_parse_name(), krb5_make_principal() or any other related principal functions.

    +
    Parameters
    +
    context A Kerberos context.
    p a principal to free.
    + +
    contextA Kerberos context.
    pa principal to free.
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_make_principal()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_principal KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_principal (krb5_context  context, krb5_context context,
    krb5_principal *  principal, krb5_principal * principal,
    krb5_const_realm  realm, krb5_const_realm realm,
      ...  ... 
    )
    -
    -
    - -

    -Build a principal using vararg style building

    -

    Parameters:
    - - - - - +
    +

    Build a principal using vararg style building

    +
    Parameters
    +
    context A Kerberos context.
    principal returned principal
    realm realm name
    ... a list of components ended with NULL.
    + + + +
    contextA Kerberos context.
    principalreturned principal
    realmrealm name
    ...a list of components ended with NULL.
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_parse_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name (krb5_context  context, krb5_context context,
    const char *  name, const char * name,
    krb5_principal *  principal krb5_principal * principal 
    )
    -
    -
    - -

    -Parse a name into a krb5_principal structure

    -

    Parameters:
    - - - - +
    +

    Parse a name into a krb5_principal structure

    +
    Parameters
    +
    context Kerberos 5 context
    name name to parse into a Kerberos principal
    principal returned principal, free with krb5_free_principal().
    + + +
    contextKerberos 5 context
    namename to parse into a Kerberos principal
    principalreturned principal, free with krb5_free_principal().
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_parse_name_flags()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name_flags KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name_flags (krb5_context  context, krb5_context context,
    const char *  name, const char * name,
    int  flags, int flags,
    krb5_principal *  principal krb5_principal * principal 
    )
    -
    -
    - -

    -Parse a name into a krb5_principal structure, flags controls the behavior.

    -

    Parameters:
    - - - - - +
    +

    Parse a name into a krb5_principal structure, flags controls the behavior.

    +
    Parameters
    +
    context Kerberos 5 context
    name name to parse into a Kerberos principal
    flags flags to control the behavior
    principal returned principal, free with krb5_free_principal().
    + + + +
    contextKerberos 5 context
    namename to parse into a Kerberos principal
    flagsflags to control the behavior
    principalreturned principal, free with krb5_free_principal().
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_parse_nametype()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_nametype KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_nametype (krb5_context  context, krb5_context context,
    const char *  str, const char * str,
    int32_t *  nametype int32_t * nametype 
    )
    -
    -
    +
    +

    Parse nametype string and return a nametype integer

    -

    -Parse nametype string and return a nametype integer

    -

    - + + +

    ◆ krb5_principal_compare()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare (krb5_context  context, krb5_context context,
    krb5_const_principal  princ1, krb5_const_principal princ1,
    krb5_const_principal  princ2 krb5_const_principal princ2 
    )
    -
    -
    - -

    -Compares the two principals, including realm of the principals and returns TRUE if they are the same and FALSE if not.

    -

    Parameters:
    - - - - +
    +

    Compares the two principals, including realm of the principals and returns TRUE if they are the same and FALSE if not.

    +
    Parameters
    +
    context Kerberos 5 context
    princ1 first principal to compare
    princ2 second principal to compare
    + + +
    contextKerberos 5 context
    princ1first principal to compare
    princ2second principal to compare
    +
    -
    See also:
    krb5_principal_compare_any_realm()

    -krb5_realm_compare()

    +
    See also
    krb5_principal_compare_any_realm()
    +
    +krb5_realm_compare()
    -

    - + + +

    ◆ krb5_principal_compare_any_realm()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare_any_realm KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare_any_realm (krb5_context  context, krb5_context context,
    krb5_const_principal  princ1, krb5_const_principal princ1,
    krb5_const_principal  princ2 krb5_const_principal princ2 
    )
    -
    -
    - -

    -Return TRUE iff princ1 == princ2 (without considering the realm)

    -

    Parameters:
    - - - - +
    +

    Return TRUE iff princ1 == princ2 (without considering the realm)

    +
    Parameters
    +
    context Kerberos 5 context
    princ1 first principal to compare
    princ2 second principal to compare
    + + +
    contextKerberos 5 context
    princ1first principal to compare
    princ2second principal to compare
    +
    -
    Returns:
    non zero if equal, 0 if not
    -
    See also:
    krb5_principal_compare()

    -krb5_realm_compare()

    +
    Returns
    non zero if equal, 0 if not
    +
    See also
    krb5_principal_compare()
    +
    +krb5_realm_compare()
    -

    - + + +

    ◆ krb5_principal_get_num_comp()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION unsigned int KRB5_LIB_CALL krb5_principal_get_num_comp KRB5_LIB_FUNCTION unsigned int KRB5_LIB_CALL krb5_principal_get_num_comp (krb5_context  context, krb5_context context,
    krb5_const_principal  principal krb5_const_principal principal 
    )
    -
    -
    - -

    -Get number of component is principal.

    -

    Parameters:
    - - - +
    +

    Get number of component is principal.

    +
    Parameters
    +
    context Kerberos 5 context
    principal principal to query
    + +
    contextKerberos 5 context
    principalprincipal to query
    +
    -
    Returns:
    number of components in string
    +
    Returns
    number of components in string
    -

    - + + +

    ◆ krb5_principal_get_realm()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_principal_get_realm KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_principal_get_realm (krb5_context  context, krb5_context context,
    krb5_const_principal  principal krb5_const_principal principal 
    )
    +
    +

    Get the realm of the principal

    +
    Parameters
    + + + +
    contextA Kerberos context.
    principalprincipal to get the realm for
    +
    +
    +
    Returns
    realm of the principal, don't free or use after krb5_principal is freed
    +
    -
    +
    + +

    ◆ krb5_principal_get_type()

    -

    -Get the realm of the principal

    -

    Parameters:
    - - - +
    +
    +
    context A Kerberos context.
    principal principal to get the realm for
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_principal_get_type (krb5_context context,
    krb5_const_principal principal 
    )
    +
    +

    Get the type of the principal

    +
    Parameters
    + + +
    contextA Kerberos context.
    principalprincipal to get the type for
    +
    -
    Returns:
    realm of the principal, don't free or use after krb5_principal is freed
    +
    Returns
    the type of principal
    -

    - + + +

    ◆ krb5_principal_is_anonymous()

    +
    - + - - + + - - + + + + + + + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_principal_get_type KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_anonymous (krb5_context  context, krb5_context context,
    krb5_const_principal  principal krb5_const_principal p,
    unsigned int flags 
    )
    +
    +

    Returns true iff name is WELLKNOWN/ANONYMOUS

    +
    -
    +
    + +

    ◆ krb5_principal_is_gss_hostbased_service()

    -

    -Get the type of the principal

    -

    Parameters:
    - - - -
    context A Kerberos context.
    principal principal to get the type for
    -
    -
    Returns:
    the type of principal
    +
    +
    + + + + + + + + + + + + + + + + + + +
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_gss_hostbased_service (krb5_context context,
    krb5_const_principal principal 
    )
    +
    +

    Returns true iff name is an WELLKNOWN:ORG.H5L.HOSTBASED-SERVICE

    -

    - +

    + +

    ◆ krb5_principal_is_krbtgt()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_krbtgt KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_krbtgt (krb5_context  context, krb5_context context,
    krb5_const_principal  p krb5_const_principal p 
    )
    +
    +

    Check if the cname part of the principal is a krbtgt principal

    +
    -
    +
    + +

    ◆ krb5_principal_is_lkdc()

    -

    -Check if the cname part of the principal is a krbtgt principal +

    +
    + + + + + + + + + + + + + + + + + + +
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_lkdc (krb5_context context,
    krb5_const_principal principal 
    )
    +
    +

    Returns true if name is Kerberos an LKDC realm

    + +
    -

    - + +

    ◆ krb5_principal_is_null()

    +
    - + - - + + - - + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_match krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_null (krb5_context  context, krb5_context context,
    krb5_const_principal  princ, krb5_const_principal principal 
    )
    +
    +

    Returns true if name is Kerberos NULL name

    + +
    +
    + +

    ◆ krb5_principal_is_pku2u()

    + +
    +
    + + + + + + - - + + - +
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_pku2u (krb5_context context,
    krb5_const_principal  pattern krb5_const_principal principal 
    )
    +
    +

    Returns true if name is Kerberos an LKDC realm

    + +
    -
    + +

    ◆ krb5_principal_is_root_krbtgt()

    -

    -return TRUE iff princ matches pattern +

    +
    + + + + + + + + + + + + + + + + + + +
    krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_root_krbtgt (krb5_context context,
    krb5_const_principal p 
    )
    +
    +

    Check if the cname part of the principal is a initial or renewed krbtgt principal

    + +
    -

    - + +

    ◆ krb5_principal_match()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_principal_set_realm KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_match (krb5_context  context, krb5_context context,
    krb5_principal  principal, krb5_const_principal princ,
    krb5_const_realm  realm krb5_const_principal pattern 
    )
    +
    +

    return TRUE iff princ matches pattern

    +
    -
    +
    + +

    ◆ krb5_principal_set_realm()

    -

    -Set a new realm for a principal, and as a side-effect free the previous realm.

    -

    Parameters:
    - - - - +
    +
    +
    context A Kerberos context.
    principal principal set the realm for
    realm the new realm to set
    + + + + + + + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_principal_set_realm (krb5_context context,
    krb5_principal principal,
    krb5_const_realm realm 
    )
    +
    +

    Set a new realm for a principal, and as a side-effect free the previous realm.

    +
    Parameters
    + + + +
    contextA Kerberos context.
    principalprincipal set the realm for
    realmthe new realm to set
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_principal_set_type()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_principal_set_type KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_principal_set_type (krb5_context  context, krb5_context context,
    krb5_principal  principal, krb5_principal principal,
    int  type int type 
    )
    -
    -
    - -

    -Set the type of the principal

    -

    Parameters:
    - - - - +
    +

    Set the type of the principal

    +
    Parameters
    +
    context A Kerberos context.
    principal principal to set the type for
    type the new type
    + + +
    contextA Kerberos context.
    principalprincipal to set the type for
    typethe new type
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_realm_compare()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_realm_compare KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_realm_compare (krb5_context  context, krb5_context context,
    krb5_const_principal  princ1, krb5_const_principal princ1,
    krb5_const_principal  princ2 krb5_const_principal princ2 
    )
    -
    -
    - -

    -return TRUE iff realm(princ1) == realm(princ2)

    -

    Parameters:
    - - - - +
    +

    return TRUE iff realm(princ1) == realm(princ2)

    +
    Parameters
    +
    context Kerberos 5 context
    princ1 first principal to compare
    princ2 second principal to compare
    + + +
    contextKerberos 5 context
    princ1first principal to compare
    princ2second principal to compare
    +
    -
    See also:
    krb5_principal_compare_any_realm()

    -krb5_principal_compare()

    +
    See also
    krb5_principal_compare_any_realm()
    +
    +krb5_principal_compare()
    + +
    +
    + +

    ◆ krb5_realm_is_lkdc()

    + +
    +
    + + + + + + + + +
    krb5_boolean KRB5_LIB_FUNCTION krb5_realm_is_lkdc (const char * realm)
    +
    +

    Returns true if name is Kerberos an LKDC realm

    -

    - + + +

    ◆ krb5_sname_to_principal()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sname_to_principal KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sname_to_principal (krb5_context  context, krb5_context context,
    const char *  hostname, const char * hostname,
    const char *  sname, const char * sname,
    int32_t  type, int32_t type,
    krb5_principal *  ret_princ krb5_principal * ret_princ 
    )
    -
    -
    - -

    -Create a principal for the service running on hostname. If KRB5_NT_SRV_HST is used, the hostname is canonization using DNS (or some other service), this is potentially insecure.

    -

    Parameters:
    - - - - - - +
    +

    Create a principal for the given service running on the given hostname. If KRB5_NT_SRV_HST is used, the hostname is canonicalized according the configured name canonicalization rules, with canonicalization delayed in some cases. One rule involves DNS, which is insecure unless DNSSEC is used, but we don't use DNSSEC-capable resolver APIs here, so that if DNSSEC is used we wouldn't know it.

    +

    Canonicalization is immediate (not delayed) only when there is only one canonicalization rule and that rule indicates that we should do a host lookup by name (i.e., DNS).

    +
    Parameters
    +
    context A Kerberos context.
    hostname hostname to use
    sname Service name to use
    type name type of pricipal, use KRB5_NT_SRV_HST or KRB5_NT_UNKNOWN.
    ret_princ return principal, free with krb5_free_principal().
    + + + + +
    contextA Kerberos context.
    hostnamehostname to use
    snameService name to use
    typename type of principal, use KRB5_NT_SRV_HST or KRB5_NT_UNKNOWN.
    ret_princreturn principal, free with krb5_free_principal().
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_unparse_name()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name (krb5_context  context, krb5_context context,
    krb5_const_principal  principal, krb5_const_principal principal,
    char **  name char ** name 
    )
    -
    -
    - -

    -Unparse the Kerberos name into a string

    -

    Parameters:
    - - - - +
    +

    Unparse the Kerberos name into a string

    +
    Parameters
    +
    context Kerberos 5 context
    principal principal to query
    name resulting string, free with krb5_xfree()
    + + +
    contextKerberos 5 context
    principalprincipal to query
    nameresulting string, free with krb5_xfree()
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_unparse_name_fixed()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed (krb5_context  context, krb5_context context,
    krb5_const_principal  principal, krb5_const_principal principal,
    char *  name, char * name,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Unparse the principal name to a fixed buffer

    -

    Parameters:
    - - - - - +
    +

    Unparse the principal name to a fixed buffer

    +
    Parameters
    +
    context A Kerberos context.
    principal principal to unparse
    name buffer to write name to
    len length of buffer
    + + + +
    contextA Kerberos context.
    principalprincipal to unparse
    namebuffer to write name to
    lenlength of buffer
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_unparse_name_fixed_flags()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_flags KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_flags (krb5_context  context, krb5_context context,
    krb5_const_principal  principal, krb5_const_principal principal,
    int  flags, int flags,
    char *  name, char * name,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Unparse the principal name with unparse flags to a fixed buffer.

    -

    Parameters:
    - - - - - - +
    +

    Unparse the principal name with unparse flags to a fixed buffer.

    +
    Parameters
    +
    context A Kerberos context.
    principal principal to unparse
    flags unparse flags
    name buffer to write name to
    len length of buffer
    + + + + +
    contextA Kerberos context.
    principalprincipal to unparse
    flagsunparse flags
    namebuffer to write name to
    lenlength of buffer
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_unparse_name_fixed_short()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_short KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_short (krb5_context  context, krb5_context context,
    krb5_const_principal  principal, krb5_const_principal principal,
    char *  name, char * name,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Unparse the principal name to a fixed buffer. The realm is skipped if its a default realm.

    -

    Parameters:
    - - - - - +
    +

    Unparse the principal name to a fixed buffer. The realm is skipped if its a default realm.

    +
    Parameters
    +
    context A Kerberos context.
    principal principal to unparse
    name buffer to write name to
    len length of buffer
    + + + +
    contextA Kerberos context.
    principalprincipal to unparse
    namebuffer to write name to
    lenlength of buffer
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_unparse_name_flags()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_flags KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_flags (krb5_context  context, krb5_context context,
    krb5_const_principal  principal, krb5_const_principal principal,
    int  flags, int flags,
    char **  name char ** name 
    )
    -
    -
    - -

    -Unparse the Kerberos name into a string

    -

    Parameters:
    - - - - - +
    +

    Unparse the Kerberos name into a string

    +
    Parameters
    +
    context Kerberos 5 context
    principal principal to query
    flags flag to determine the behavior
    name resulting string, free with krb5_xfree()
    + + + +
    contextKerberos 5 context
    principalprincipal to query
    flagsflag to determine the behavior
    nameresulting string, free with krb5_xfree()
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_unparse_name_short()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_short KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_short (krb5_context  context, krb5_context context,
    krb5_const_principal  principal, krb5_const_principal principal,
    char **  name char ** name 
    )
    -
    -
    - -

    -Unparse the principal name to a allocated buffer. The realm is skipped if its a default realm.

    -

    Parameters:
    - - - - +
    +

    Unparse the principal name to a allocated buffer. The realm is skipped if its a default realm.

    +
    Parameters
    +
    context A Kerberos context.
    principal principal to unparse
    name returned buffer, free with krb5_xfree()
    + + +
    contextA Kerberos context.
    principalprincipal to unparse
    namereturned buffer, free with krb5_xfree()
    +
    -
    Returns:
    An krb5 error code, see krb5_get_error_message().
    +
    Returns
    An krb5 error code, see krb5_get_error_message().
    -

    +


    -Generated on Wed Jan 11 14:07:48 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__storage.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__storage.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__storage.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__storage.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 storage functions +Heimdal Kerberos 5 storage functions @@ -8,2085 +8,2265 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 storage functions
    +
    -

    Heimdal Kerberos 5 storage functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_storage_set_flags (krb5_storage *sp, krb5_flags flags)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_storage_clear_flags (krb5_storage *sp, krb5_flags flags)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_storage_is_flags (krb5_storage *sp, krb5_flags flags)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_storage_set_byteorder (krb5_storage *sp, krb5_flags byteorder)
    KRB5_LIB_FUNCTION krb5_flags
    -KRB5_LIB_CALL 
    krb5_storage_get_byteorder (krb5_storage *sp)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_storage_set_max_alloc (krb5_storage *sp, size_t size)
    KRB5_LIB_FUNCTION off_t
    -KRB5_LIB_CALL 
    krb5_storage_seek (krb5_storage *sp, off_t offset, int whence)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_truncate (krb5_storage *sp, off_t offset)
    KRB5_LIB_FUNCTION krb5_ssize_t
    -KRB5_LIB_CALL 
    krb5_storage_read (krb5_storage *sp, void *buf, size_t len)
    KRB5_LIB_FUNCTION krb5_ssize_t
    -KRB5_LIB_CALL 
    krb5_storage_write (krb5_storage *sp, const void *buf, size_t len)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_storage_set_eof_code (krb5_storage *sp, int code)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_get_eof_code (krb5_storage *sp)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_storage_free (krb5_storage *sp)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_storage_to_data (krb5_storage *sp, krb5_data *data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_int32 (krb5_storage *sp, int32_t value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_uint32 (krb5_storage *sp, uint32_t value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_int32 (krb5_storage *sp, int32_t *value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_uint32 (krb5_storage *sp, uint32_t *value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_int16 (krb5_storage *sp, int16_t value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_uint16 (krb5_storage *sp, uint16_t value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_int16 (krb5_storage *sp, int16_t *value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_uint16 (krb5_storage *sp, uint16_t *value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_int8 (krb5_storage *sp, int8_t value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_uint8 (krb5_storage *sp, uint8_t value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_int8 (krb5_storage *sp, int8_t *value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_uint8 (krb5_storage *sp, uint8_t *value)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_data (krb5_storage *sp, krb5_data data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_data (krb5_storage *sp, krb5_data *data)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_string (krb5_storage *sp, const char *s)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_string (krb5_storage *sp, char **string)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_stringz (krb5_storage *sp, const char *s)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_stringz (krb5_storage *sp, char **string)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_principal (krb5_storage *sp, krb5_const_principal p)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_principal (krb5_storage *sp, krb5_principal *princ)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_keyblock (krb5_storage *sp, krb5_keyblock p)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_keyblock (krb5_storage *sp, krb5_keyblock *p)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_times (krb5_storage *sp, krb5_times times)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_times (krb5_storage *sp, krb5_times *times)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_address (krb5_storage *sp, krb5_address p)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_address (krb5_storage *sp, krb5_address *adr)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_addrs (krb5_storage *sp, krb5_addresses p)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_addrs (krb5_storage *sp, krb5_addresses *adr)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_authdata (krb5_storage *sp, krb5_authdata auth)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_authdata (krb5_storage *sp, krb5_authdata *auth)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_creds (krb5_storage *sp, krb5_creds *creds)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_creds (krb5_storage *sp, krb5_creds *creds)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_store_creds_tag (krb5_storage *sp, krb5_creds *creds)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_ret_creds_tag (krb5_storage *sp, krb5_creds *creds)
    KRB5_LIB_FUNCTION krb5_storage
    -*KRB5_LIB_CALL 
    krb5_storage_emem (void)
    KRB5_LIB_FUNCTION krb5_storage
    -*KRB5_LIB_CALL 
    krb5_storage_from_fd (krb5_socket_t fd_in)
    KRB5_LIB_FUNCTION krb5_storage
    -*KRB5_LIB_CALL 
    krb5_storage_from_mem (void *buf, size_t len)
    KRB5_LIB_FUNCTION krb5_storage
    -*KRB5_LIB_CALL 
    krb5_storage_from_data (krb5_data *data)
    KRB5_LIB_FUNCTION krb5_storage
    -*KRB5_LIB_CALL 
    krb5_storage_from_readonly_mem (const void *buf, size_t len)
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_flags (krb5_storage *sp, krb5_flags flags)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_clear_flags (krb5_storage *sp, krb5_flags flags)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_storage_is_flags (krb5_storage *sp, krb5_flags flags)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_byteorder (krb5_storage *sp, krb5_flags byteorder)
     
    KRB5_LIB_FUNCTION krb5_flags KRB5_LIB_CALL krb5_storage_get_byteorder (krb5_storage *sp)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_max_alloc (krb5_storage *sp, size_t size)
     
    KRB5_LIB_FUNCTION off_t KRB5_LIB_CALL krb5_storage_seek (krb5_storage *sp, off_t offset, int whence)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_truncate (krb5_storage *sp, off_t offset)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_fsync (krb5_storage *sp)
     
    KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_read (krb5_storage *sp, void *buf, size_t len)
     
    KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_write (krb5_storage *sp, const void *buf, size_t len)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_eof_code (krb5_storage *sp, int code)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_get_eof_code (krb5_storage *sp)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_free (krb5_storage *sp)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_to_data (krb5_storage *sp, krb5_data *data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int32 (krb5_storage *sp, int32_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int64 (krb5_storage *sp, int64_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint32 (krb5_storage *sp, uint32_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint64 (krb5_storage *sp, uint64_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int64 (krb5_storage *sp, int64_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint64 (krb5_storage *sp, uint64_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int32 (krb5_storage *sp, int32_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint32 (krb5_storage *sp, uint32_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int16 (krb5_storage *sp, int16_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint16 (krb5_storage *sp, uint16_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int16 (krb5_storage *sp, int16_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint16 (krb5_storage *sp, uint16_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int8 (krb5_storage *sp, int8_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint8 (krb5_storage *sp, uint8_t value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int8 (krb5_storage *sp, int8_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint8 (krb5_storage *sp, uint8_t *value)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_data (krb5_storage *sp, krb5_data data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_data (krb5_storage *sp, krb5_data *data)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_string (krb5_storage *sp, const char *s)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_string (krb5_storage *sp, char **string)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_stringz (krb5_storage *sp, const char *s)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_stringz (krb5_storage *sp, char **string)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_principal (krb5_storage *sp, krb5_const_principal p)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_principal (krb5_storage *sp, krb5_principal *princ)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_keyblock (krb5_storage *sp, krb5_keyblock p)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_keyblock (krb5_storage *sp, krb5_keyblock *p)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_times (krb5_storage *sp, krb5_times times)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_times (krb5_storage *sp, krb5_times *times)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_address (krb5_storage *sp, krb5_address p)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_address (krb5_storage *sp, krb5_address *adr)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_addrs (krb5_storage *sp, krb5_addresses p)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_addrs (krb5_storage *sp, krb5_addresses *adr)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_authdata (krb5_storage *sp, krb5_authdata auth)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_authdata (krb5_storage *sp, krb5_authdata *auth)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds (krb5_storage *sp, krb5_creds *creds)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds (krb5_storage *sp, krb5_creds *creds)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds_tag (krb5_storage *sp, krb5_creds *creds)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds_tag (krb5_storage *sp, krb5_creds *creds)
     
    KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL krb5_storage_emem (void)
     
    KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL krb5_storage_from_fd (int fd_in)
     
    KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL krb5_storage_from_mem (void *buf, size_t len)
     
    KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL krb5_storage_from_data (krb5_data *data)
     
    KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL krb5_storage_from_readonly_mem (const void *buf, size_t len)
     
    KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL krb5_storage_from_socket (krb5_socket_t sock_in)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_ret_address()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_address KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_address (krb5_storage *  sp, krb5_storage * sp,
    krb5_address *  adr krb5_address * adr 
    )
    -
    -
    - -

    -Read a address block from the storage.

    -

    Parameters:
    - - - +
    +

    Read a address block from the storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    adr the address block read from storage
    + +
    spthe storage buffer to write to
    adrthe address block read from storage
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - +

    + +

    ◆ krb5_ret_addrs()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_addrs KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_addrs (krb5_storage *  sp, krb5_storage * sp,
    krb5_addresses *  adr krb5_addresses * adr 
    )
    -
    -
    - -

    -Read a addresses block from the storage.

    -

    Parameters:
    - - - +
    +

    Read a addresses block from the storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    adr the addresses block read from storage
    + +
    spthe storage buffer to write to
    adrthe addresses block read from storage
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_authdata()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_authdata KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_authdata (krb5_storage *  sp, krb5_storage * sp,
    krb5_authdata *  auth krb5_authdata * auth 
    )
    -
    -
    - -

    -Read a auth data from the storage.

    -

    Parameters:
    - - - +
    +

    Read a auth data from the storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    auth the auth data block read from storage
    + +
    spthe storage buffer to write to
    auththe auth data block read from storage
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_creds()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds (krb5_storage *  sp, krb5_storage * sp,
    krb5_creds *  creds krb5_creds * creds 
    )
    -
    -
    - -

    -Read a credentials block from the storage.

    -

    Parameters:
    - - - +
    +

    Read a credentials block from the storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    creds the credentials block read from storage
    + +
    spthe storage buffer to write to
    credsthe credentials block read from storage
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_creds_tag()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds_tag KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds_tag (krb5_storage *  sp, krb5_storage * sp,
    krb5_creds *  creds krb5_creds * creds 
    )
    -
    -
    - -

    -Read a tagged credentials block from the storage.

    -

    Parameters:
    - - - +
    +

    Read a tagged credentials block from the storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    creds the credentials block read from storage
    + +
    spthe storage buffer to write to
    credsthe credentials block read from storage
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_data()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_data KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_data (krb5_storage *  sp, krb5_storage * sp,
    krb5_data *  data krb5_data * data 
    )
    -
    -
    - -

    -Parse a data from the storage.

    -

    Parameters:
    - - - +
    +

    Parse a data from the storage.

    +
    Parameters
    +
    sp the storage buffer to read from
    data the parsed data
    + +
    spthe storage buffer to read from
    datathe parsed data
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_int16()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int16 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int16 (krb5_storage *  sp, krb5_storage * sp,
    int16_t *  value int16_t * value 
    )
    -
    -
    - -

    -Read a int16 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +

    Read a int16 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value read from the buffer
    + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_int32()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int32 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int32 (krb5_storage *  sp, krb5_storage * sp,
    int32_t *  value int32_t * value 
    )
    -
    -
    - -

    -Read a int32 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +

    Read a int32 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value read from the buffer
    + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_int64()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int8 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int64 (krb5_storage *  sp, krb5_storage * sp,
    int8_t *  value int64_t * value 
    )
    -
    -
    - -

    -Read a int8 from storage

    -

    Parameters:
    - - - +
    +

    Read a int64 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value read from the buffer
    + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_int8()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_keyblock KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int8 (krb5_storage *  sp, krb5_storage * sp,
    krb5_keyblock *  p int8_t * value 
    )
    -
    -
    - -

    -Read a keyblock from the storage.

    -

    Parameters:
    - - - +
    +

    Read a int8 from storage

    +
    Parameters
    +
    sp the storage buffer to write to
    p the keyblock read from storage, free using krb5_free_keyblock()
    + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_keyblock()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_principal KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_keyblock (krb5_storage *  sp, krb5_storage * sp,
    krb5_principal *  princ krb5_keyblock * p 
    )
    -
    -
    - -

    -Parse principal from the storage.

    -

    Parameters:
    - - - +
    +

    Read a keyblock from the storage.

    +
    Parameters
    +
    sp the storage buffer to read from
    princ the parsed principal
    + +
    spthe storage buffer to write to
    pthe keyblock read from storage, free using krb5_free_keyblock()
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_principal()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_string KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_principal (krb5_storage *  sp, krb5_storage * sp,
    char **  string krb5_principal * princ 
    )
    -
    -
    - -

    -Parse a string from the storage.

    -

    Parameters:
    - - - +
    +

    Parse principal from the storage.

    +
    Parameters
    +
    sp the storage buffer to read from
    string the parsed string
    + +
    spthe storage buffer to read from
    princthe parsed principal
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_string()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_stringz KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_string (krb5_storage *  sp, krb5_storage * sp,
    char **  string char ** string 
    )
    -
    -
    - -

    -Parse zero terminated string from the storage.

    -

    Parameters:
    - - - +
    +

    Parse a string from the storage.

    +
    Parameters
    +
    sp the storage buffer to read from
    string the parsed string
    + +
    spthe storage buffer to read from
    stringthe parsed string
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_stringz()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_times KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_stringz (krb5_storage *  sp, krb5_storage * sp,
    krb5_times *  times char ** string 
    )
    -
    -
    - -

    -Read a times block from the storage.

    -

    Parameters:
    - - - +
    +

    Parse zero terminated string from the storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    times the times block read from storage
    + +
    spthe storage buffer to read from
    stringthe parsed string
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_times()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint16 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_times (krb5_storage *  sp, krb5_storage * sp,
    uint16_t *  value krb5_times * times 
    )
    -
    -
    - -

    -Read a int16 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +

    Read a times block from the storage.

    +
    Parameters
    +
    sp the storage to write too
    value the value read from the buffer
    + +
    spthe storage buffer to write to
    timesthe times block read from storage
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_uint16()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint32 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint16 (krb5_storage *  sp, krb5_storage * sp,
    uint32_t *  value uint16_t * value 
    )
    -
    -
    - -

    -Read a uint32 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +

    Read a int16 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value read from the buffer
    + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_uint32()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint8 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint32 (krb5_storage *  sp, krb5_storage * sp,
    uint8_t *  value uint32_t * value 
    )
    -
    -
    - -

    -Read a uint8 from storage

    -

    Parameters:
    - - - +
    +

    Read a uint32 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value read from the buffer
    + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_uint64()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_clear_flags KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint64 (krb5_storage *  sp, krb5_storage * sp,
    krb5_flags  flags uint64_t * value 
    )
    -
    -
    - -

    -Clear the flags on a storage buffer

    -

    Parameters:
    - - - +
    +

    Read a uint64 from storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage buffer to clear the flags on
    flags the flags to clear
    + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_ret_uint8()

    +
    - + - - - + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_emem KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint8 (void   ) krb5_storage * sp,
    uint8_t * value 
    )
    -
    -
    - -

    -Create a elastic (allocating) memory storage backend. Memory is allocated on demand. Free returned krb5_storage with krb5_storage_free().

    -

    Returns:
    A krb5_storage on success, or NULL on out of memory error.
    -
    See also:
    krb5_storage_from_mem()

    -krb5_storage_from_readonly_mem()

    -krb5_storage_from_fd()

    -krb5_storage_from_data()

    +
    +

    Read a uint8 from storage

    +
    Parameters
    + + + +
    spthe storage to write too
    valuethe value read from the buffer
    +
    +
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_storage_clear_flags()

    +
    - + - - - + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_free KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_clear_flags (krb5_storage *  sp  ) krb5_storage * sp,
    krb5_flags flags 
    )
    -
    -
    - -

    -Free a krb5 storage.

    -

    Parameters:
    - - +
    +

    Clear the flags on a storage buffer

    +
    Parameters
    +
    sp the storage to free.
    + +
    spthe storage buffer to clear the flags on
    flagsthe flags to clear
    +
    -
    Returns:
    An Kerberos 5 error code.
    -

    - + + +

    ◆ krb5_storage_emem()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_data KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_emem (krb5_data *  data  ) void )
    +
    +

    Create a elastic (allocating) memory storage backend. Memory is allocated on demand. Free returned krb5_storage with krb5_storage_free().

    +
    Returns
    A krb5_storage on success, or NULL on out of memory error.
    +
    See also
    krb5_storage_from_mem()
    +
    +krb5_storage_from_readonly_mem()
    +
    +krb5_storage_from_fd()
    +
    +krb5_storage_from_data()
    +
    +krb5_storage_from_socket()
    + +
    -
    + +

    ◆ krb5_storage_free()

    -

    -Create a fixed size memory storage block

    -

    Returns:
    A krb5_storage on success, or NULL on out of memory error.
    -
    See also:
    krb5_storage_mem()

    -krb5_storage_from_mem()

    -krb5_storage_from_readonly_mem()

    -krb5_storage_from_fd()

    +
    +
    + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_free (krb5_storage * sp)
    +
    +

    Free a krb5 storage.

    +
    Parameters
    + + +
    spthe storage to free.
    +
    +
    +
    Returns
    An Kerberos 5 error code.
    -

    - +

    + +

    ◆ krb5_storage_from_data()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_fd KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_data (krb5_socket_t  fd_in  ) krb5_data * data)
    +
    +

    Create a fixed size memory storage block

    +
    Returns
    A krb5_storage on success, or NULL on out of memory error.
    +
    See also
    krb5_storage_mem()
    +
    +krb5_storage_from_mem()
    +
    +krb5_storage_from_readonly_mem()
    +
    +krb5_storage_from_fd()
    +
    -
    +
    + +

    ◆ krb5_storage_from_fd()

    -

    -

    Returns:
    A krb5_storage on success, or NULL on out of memory error.
    -
    See also:
    krb5_storage_emem()

    -krb5_storage_from_mem()

    -krb5_storage_from_readonly_mem()

    -krb5_storage_from_data()

    +
    +
    + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_fd (int fd_in)
    +
    +
    Returns
    A krb5_storage on success, or NULL on out of memory error.
    +
    See also
    krb5_storage_emem()
    +
    +krb5_storage_from_mem()
    +
    +krb5_storage_from_readonly_mem()
    +
    +krb5_storage_from_data()
    +
    +krb5_storage_from_socket()
    -

    - +

    + +

    ◆ krb5_storage_from_mem()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_mem KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_mem (void *  buf, void * buf,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Create a fixed size memory storage block

    -

    Returns:
    A krb5_storage on success, or NULL on out of memory error.
    -
    See also:
    krb5_storage_mem()

    -krb5_storage_from_readonly_mem()

    -krb5_storage_from_data()

    -krb5_storage_from_fd()

    +
    +

    Create a fixed size memory storage block

    +
    Returns
    A krb5_storage on success, or NULL on out of memory error.
    +
    See also
    krb5_storage_mem()
    +
    +krb5_storage_from_readonly_mem()
    +
    +krb5_storage_from_data()
    +
    +krb5_storage_from_fd()
    +
    +krb5_storage_from_socket()
    -

    - + + +

    ◆ krb5_storage_from_readonly_mem()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_readonly_mem KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_readonly_mem (const void *  buf, const void * buf,
    size_t  len size_t len 
    )
    +
    +

    Create a fixed size memory storage block that is read only

    +
    Returns
    A krb5_storage on success, or NULL on out of memory error.
    +
    See also
    krb5_storage_mem()
    +
    +krb5_storage_from_mem()
    +
    +krb5_storage_from_data()
    +
    +krb5_storage_from_fd()
    + +
    -
    + +

    ◆ krb5_storage_from_socket()

    -

    -Create a fixed size memory storage block that is read only

    -

    Returns:
    A krb5_storage on success, or NULL on out of memory error.
    -
    See also:
    krb5_storage_mem()

    -krb5_storage_from_mem()

    -krb5_storage_from_data()

    -krb5_storage_from_fd()

    +
    +
    + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_socket (krb5_socket_t sock_in)
    +
    +
    Returns
    A krb5_storage on success, or NULL on out of memory error.
    +
    See also
    krb5_storage_emem()
    +
    +krb5_storage_from_mem()
    +
    +krb5_storage_from_readonly_mem()
    +
    +krb5_storage_from_data()
    +
    +krb5_storage_from_fd()
    -

    - +

    + +

    ◆ krb5_storage_fsync()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION krb5_flags KRB5_LIB_CALL krb5_storage_get_byteorder KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_fsync (krb5_storage *  sp  ) krb5_storage * sp)
    -
    -
    +
    +

    Sync the storage buffer to its backing store. If there is no backing store this function will return success.

    +
    Parameters
    + + +
    spthe storage buffer to sync
    +
    +
    +
    Returns
    A Kerberos 5 error code
    -

    -Return the current byteorder for the buffer. See krb5_storage_set_byteorder() for the list or byte order contants.

    -

    - + + +

    ◆ krb5_storage_get_byteorder()

    +
    - + - - - + +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_get_eof_code KRB5_LIB_FUNCTION krb5_flags KRB5_LIB_CALL krb5_storage_get_byteorder (krb5_storage *  sp  ) krb5_storage * sp)
    +
    +

    Return the current byteorder for the buffer. See krb5_storage_set_byteorder() for the list or byte order contants.

    + +
    -
    + +

    ◆ krb5_storage_get_eof_code()

    -

    -Get the return code that will be used when end of storage is reached.

    -

    Parameters:
    - - +
    +
    +
    sp the storage
    + + + + + + + +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_get_eof_code (krb5_storage * sp)
    +
    +

    Get the return code that will be used when end of storage is reached.

    +
    Parameters
    + +
    spthe storage
    +
    -
    Returns:
    storage error code
    +
    Returns
    storage error code
    -

    - + + +

    ◆ krb5_storage_is_flags()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_storage_is_flags KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_storage_is_flags (krb5_storage *  sp, krb5_storage * sp,
    krb5_flags  flags krb5_flags flags 
    )
    -
    -
    - -

    -Return true or false depending on if the storage flags is set or not. NB testing for the flag 0 always return true.

    -

    Parameters:
    - - - +
    +

    Return true or false depending on if the storage flags is set or not. NB testing for the flag 0 always return true.

    +
    Parameters
    +
    sp the storage buffer to check flags on
    flags The flags to test for
    + +
    spthe storage buffer to check flags on
    flagsThe flags to test for
    +
    -
    Returns:
    true if all the flags are set, false if not.
    +
    Returns
    true if all the flags are set, false if not.
    -

    - + + +

    ◆ krb5_storage_read()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_read KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_read (krb5_storage *  sp, krb5_storage * sp,
    void *  buf, void * buf,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Read to the storage buffer.

    -

    Parameters:
    - - - - +
    +

    Read to the storage buffer.

    +
    Parameters
    +
    sp the storage buffer to read from
    buf the buffer to store the data in
    len the length to read
    + + +
    spthe storage buffer to read from
    bufthe buffer to store the data in
    lenthe length to read
    +
    -
    Returns:
    The length of data read (can be shorter then len), or negative on error.
    +
    Returns
    The length of data read (can be shorter then len), or negative on error.
    -

    - + + +

    ◆ krb5_storage_seek()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION off_t KRB5_LIB_CALL krb5_storage_seek KRB5_LIB_FUNCTION off_t KRB5_LIB_CALL krb5_storage_seek (krb5_storage *  sp, krb5_storage * sp,
    off_t  offset, off_t offset,
    int  whence int whence 
    )
    -
    -
    - -

    -Seek to a new offset.

    -

    Parameters:
    - - - - +
    +

    Seek to a new offset.

    +
    Parameters
    +
    sp the storage buffer to seek in.
    offset the offset to seek
    whence relateive searching, SEEK_CUR from the current position, SEEK_END from the end, SEEK_SET absolute from the start.
    + + +
    spthe storage buffer to seek in.
    offsetthe offset to seek
    whencerelateive searching, SEEK_CUR from the current position, SEEK_END from the end, SEEK_SET absolute from the start.
    +
    -
    Returns:
    The new current offset
    +
    Returns
    The new current offset
    -

    - + + +

    ◆ krb5_storage_set_byteorder()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_byteorder KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_byteorder (krb5_storage *  sp, krb5_storage * sp,
    krb5_flags  byteorder krb5_flags byteorder 
    )
    -
    -
    - -

    -Set the new byte order of the storage buffer.

    -

    Parameters:
    - - - +
    +

    Set the new byte order of the storage buffer.

    +
    Parameters
    +
    sp the storage buffer to set the byte order for.
    byteorder the new byte order.
    + +
    spthe storage buffer to set the byte order for.
    byteorderthe new byte order.
    +
    -The byte order are: KRB5_STORAGE_BYTEORDER_BE, KRB5_STORAGE_BYTEORDER_LE and KRB5_STORAGE_BYTEORDER_HOST. +

    The byte order are: KRB5_STORAGE_BYTEORDER_BE, KRB5_STORAGE_BYTEORDER_LE and KRB5_STORAGE_BYTEORDER_HOST.

    +
    -

    - + + +

    ◆ krb5_storage_set_eof_code()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_eof_code KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_eof_code (krb5_storage *  sp, krb5_storage * sp,
    int  code int code 
    )
    -
    -
    - -

    -Set the return code that will be used when end of storage is reached.

    -

    Parameters:
    - - - +
    +

    Set the return code that will be used when end of storage is reached.

    +
    Parameters
    +
    sp the storage
    code the error code to return on end of storage
    + +
    spthe storage
    codethe error code to return on end of storage
    +
    -

    - + + +

    ◆ krb5_storage_set_flags()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_flags KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_flags (krb5_storage *  sp, krb5_storage * sp,
    krb5_flags  flags krb5_flags flags 
    )
    -
    -
    - -

    -Add the flags on a storage buffer by or-ing in the flags to the buffer.

    -

    Parameters:
    - - - +
    +

    Add the flags on a storage buffer by or-ing in the flags to the buffer.

    +
    Parameters
    +
    sp the storage buffer to set the flags on
    flags the flags to set
    + +
    spthe storage buffer to set the flags on
    flagsthe flags to set
    +
    -

    - + + +

    ◆ krb5_storage_set_max_alloc()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_max_alloc KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_max_alloc (krb5_storage *  sp, krb5_storage * sp,
    size_t  size size_t size 
    )
    -
    -
    - -

    -Set the max alloc value

    -

    Parameters:
    - - - +
    +

    Set the max alloc value

    +
    Parameters
    +
    sp the storage buffer set the max allow for
    size maximum size to allocate, use 0 to remove limit
    + +
    spthe storage buffer set the max allow for
    sizemaximum size to allocate, use 0 to remove limit
    +
    -

    - + + +

    ◆ krb5_storage_to_data()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_to_data KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_to_data (krb5_storage *  sp, krb5_storage * sp,
    krb5_data *  data krb5_data * data 
    )
    -
    -
    - -

    -Copy the contnent of storage

    -

    Parameters:
    - - - +
    +

    Copy the contnent of storage

    +
    Parameters
    +
    sp the storage to copy to a data
    data the copied data, free with krb5_data_free()
    + +
    spthe storage to copy to a data
    datathe copied data, free with krb5_data_free()
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_storage_truncate()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_truncate KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_truncate (krb5_storage *  sp, krb5_storage * sp,
    off_t  offset off_t offset 
    )
    -
    -
    - -

    -Truncate the storage buffer in sp to offset.

    -

    Parameters:
    - - - +
    +

    Truncate the storage buffer in sp to offset.

    +
    Parameters
    +
    sp the storage buffer to truncate.
    offset the offset to truncate too.
    + +
    spthe storage buffer to truncate.
    offsetthe offset to truncate too.
    +
    -
    Returns:
    An Kerberos 5 error code.
    +
    Returns
    An Kerberos 5 error code.
    -

    - + + +

    ◆ krb5_storage_write()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_write KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_write (krb5_storage *  sp, krb5_storage * sp,
    const void *  buf, const void * buf,
    size_t  len size_t len 
    )
    -
    -
    - -

    -Write to the storage buffer.

    -

    Parameters:
    - - - - +
    +

    Write to the storage buffer.

    +
    Parameters
    +
    sp the storage buffer to write to
    buf the buffer to write to the storage buffer
    len the length to write
    + + +
    spthe storage buffer to write to
    bufthe buffer to write to the storage buffer
    lenthe length to write
    +
    -
    Returns:
    The length of data written (can be shorter then len), or negative on error.
    +
    Returns
    The length of data written (can be shorter then len), or negative on error.
    -

    - + + +

    ◆ krb5_store_address()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_address KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_address (krb5_storage *  sp, krb5_storage * sp,
    krb5_address  p krb5_address p 
    )
    -
    -
    - -

    -Write a address block to storage.

    -

    Parameters:
    - - - +
    +

    Write a address block to storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    p the address block to write.
    + +
    spthe storage buffer to write to
    pthe address block to write.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_addrs()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_addrs KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_addrs (krb5_storage *  sp, krb5_storage * sp,
    krb5_addresses  p krb5_addresses p 
    )
    -
    -
    - -

    -Write a addresses block to storage.

    -

    Parameters:
    - - - +
    +

    Write a addresses block to storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    p the addresses block to write.
    + +
    spthe storage buffer to write to
    pthe addresses block to write.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_authdata()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_authdata KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_authdata (krb5_storage *  sp, krb5_storage * sp,
    krb5_authdata  auth krb5_authdata auth 
    )
    -
    -
    - -

    -Write a auth data block to storage.

    -

    Parameters:
    - - - +
    +

    Write a auth data block to storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    auth the auth data block to write.
    + +
    spthe storage buffer to write to
    auththe auth data block to write.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_creds()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds (krb5_storage *  sp, krb5_storage * sp,
    krb5_creds *  creds krb5_creds * creds 
    )
    -
    -
    - -

    -Write a credentials block to storage.

    -

    Parameters:
    - - - +
    +

    Write a credentials block to storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    creds the creds block to write.
    + +
    spthe storage buffer to write to
    credsthe creds block to write.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_creds_tag()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds_tag KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds_tag (krb5_storage *  sp, krb5_storage * sp,
    krb5_creds *  creds krb5_creds * creds 
    )
    -
    -
    - -

    -Write a tagged credentials block to storage.

    -

    Parameters:
    - - - +
    +

    Write a tagged credentials block to storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    creds the creds block to write.
    + +
    spthe storage buffer to write to
    credsthe creds block to write.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_data()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_data KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_data (krb5_storage *  sp, krb5_storage * sp,
    krb5_data  data krb5_data data 
    )
    -
    -
    - -

    -Store a data to the storage. The data is stored with an int32 as lenght plus the data (not padded).

    -

    Parameters:
    - - - +
    +

    Store a data to the storage. The data is stored with an int32 as lenght plus the data (not padded).

    +
    Parameters
    +
    sp the storage buffer to write to
    data the buffer to store.
    + +
    spthe storage buffer to write to
    datathe buffer to store.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_int16()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int16 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int16 (krb5_storage *  sp, krb5_storage * sp,
    int16_t  value int16_t value 
    )
    -
    -
    - -

    -Store a int16 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +

    Store a int16 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value to store
    + +
    spthe storage to write too
    valuethe value to store
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_int32()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int32 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int32 (krb5_storage *  sp, krb5_storage * sp,
    int32_t  value int32_t value 
    )
    -
    -
    - -

    -Store a int32 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +

    Store a int32 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value to store
    + +
    spthe storage to write too
    valuethe value to store
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_int64()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int8 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int64 (krb5_storage *  sp, krb5_storage * sp,
    int8_t  value int64_t value 
    )
    -
    -
    - -

    -Store a int8 to storage.

    -

    Parameters:
    - - - +
    +

    Store a int64 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    +
    sp the storage to write too
    value the value to store
    + +
    spthe storage to write too
    valuethe value to store
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_int8()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_keyblock KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int8 (krb5_storage *  sp, krb5_storage * sp,
    krb5_keyblock  p int8_t value 
    )
    -
    -
    - -

    -Store a keyblock to the storage.

    -

    Parameters:
    - - - +
    +

    Store a int8 to storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    p the keyblock to write
    + +
    spthe storage to write too
    valuethe value to store
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_keyblock()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_principal KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_keyblock (krb5_storage *  sp, krb5_storage * sp,
    krb5_const_principal  p krb5_keyblock p 
    )
    -
    -
    - -

    -Write a principal block to storage.

    -

    Parameters:
    - - - +
    +

    Store a keyblock to the storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    p the principal block to write.
    + +
    spthe storage buffer to write to
    pthe keyblock to write
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_principal()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_string KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_principal (krb5_storage *  sp, krb5_storage * sp,
    const char *  s krb5_const_principal p 
    )
    -
    -
    - -

    -Store a string to the buffer. The data is formated as an len:uint32 plus the string itself (not padded).

    -

    Parameters:
    - - - +
    +

    Write a principal block to storage.

    +
    Parameters
    +
    sp the storage buffer to write to
    s the string to store.
    + +
    spthe storage buffer to write to
    pthe principal block to write.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_string()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_stringz KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_string (krb5_storage *  sp, krb5_storage * sp,
    const char *  s const char * s 
    )
    -
    -
    - -

    -Store a zero terminated string to the buffer. The data is stored one character at a time until a NUL is stored.

    -

    Parameters:
    - - - +
    +

    Store a string to the buffer. The data is formated as an len:uint32 plus the string itself (not padded).

    +
    Parameters
    +
    sp the storage buffer to write to
    s the string to store.
    + +
    spthe storage buffer to write to
    sthe string to store.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_stringz()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_times KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_stringz (krb5_storage *  sp, krb5_storage * sp,
    krb5_times  times const char * s 
    )
    -
    -
    - -

    -Write a times block to storage.

    -

    Parameters:
    - - - +
    +

    Store a zero terminated string to the buffer. The data is stored one character at a time until a NUL is stored.

    +
    Parameters
    +
    sp the storage buffer to write to
    times the times block to write.
    + +
    spthe storage buffer to write to
    sthe string to store.
    +
    -
    Returns:
    0 on success, a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_times()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint16 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_times (krb5_storage *  sp, krb5_storage * sp,
    uint16_t  value krb5_times times 
    )
    -
    -
    - -

    -Store a uint16 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +

    Write a times block to storage.

    +
    Parameters
    +
    sp the storage to write too
    value the value to store
    + +
    spthe storage buffer to write to
    timesthe times block to write.
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 on success, a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_uint16()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint32 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint16 (krb5_storage *  sp, krb5_storage * sp,
    uint32_t  value uint16_t value 
    )
    +
    +

    Store a uint16 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    + + + +
    spthe storage to write too
    valuethe value to store
    +
    +
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    + +
    -
    + +

    ◆ krb5_store_uint32()

    -

    -Store a uint32 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    -

    Parameters:
    - - - +
    +
    +
    sp the storage to write too
    value the value to store
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint32 (krb5_storage * sp,
    uint32_t value 
    )
    +
    +

    Store a uint32 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    + + +
    spthe storage to write too
    valuethe value to store
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    - + + +

    ◆ krb5_store_uint64()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint8 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint64 (krb5_storage *  sp, krb5_storage * sp,
    uint8_t  value uint64_t value 
    )
    +
    +

    Store a uint64 to storage, byte order is controlled by the settings on the storage, see krb5_storage_set_byteorder().

    +
    Parameters
    + + + +
    spthe storage to write too
    valuethe value to store
    +
    +
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    + +
    -
    + +

    ◆ krb5_store_uint8()

    -

    -Store a uint8 to storage.

    -

    Parameters:
    - - - +
    +
    +
    sp the storage to write too
    value the value to store
    + + + + + + + + + + + + + + + + + +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint8 (krb5_storage * sp,
    uint8_t value 
    )
    +
    +

    Store a uint8 to storage.

    +
    Parameters
    + + +
    spthe storage to write too
    valuethe value to store
    +
    -
    Returns:
    0 for success, or a Kerberos 5 error code on failure.
    +
    Returns
    0 for success, or a Kerberos 5 error code on failure.
    -

    +


    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__support.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__support.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__support.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__support.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 support functions +Heimdal Kerberos 5 support functions @@ -8,1313 +8,1363 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 support functions
    +
    -

    Heimdal Kerberos 5 support functions

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_acl_match_string (krb5_context context, const char *string, const char *format,...)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_acl_match_file (krb5_context context, const char *file, const char *format,...)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_config_parse_file_multi (krb5_context context, const char *fname, krb5_config_section **res)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_config_file_free (krb5_context context, krb5_config_section *s)
    KRB5_LIB_FUNCTION const
    -krb5_config_binding
    -*KRB5_LIB_CALL 
    krb5_config_get_list (krb5_context context, const krb5_config_section *c,...)
    KRB5_LIB_FUNCTION const
    -krb5_config_binding
    -*KRB5_LIB_CALL 
    krb5_config_vget_list (krb5_context context, const krb5_config_section *c, va_list args)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_config_get_string (krb5_context context, const krb5_config_section *c,...)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_config_vget_string (krb5_context context, const krb5_config_section *c, va_list args)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_config_vget_string_default (krb5_context context, const krb5_config_section *c, const char *def_value, va_list args)
    KRB5_LIB_FUNCTION const char
    -*KRB5_LIB_CALL 
    krb5_config_get_string_default (krb5_context context, const krb5_config_section *c, const char *def_value,...)
    KRB5_LIB_FUNCTION char
    -**KRB5_LIB_CALL 
    krb5_config_vget_strings (krb5_context context, const krb5_config_section *c, va_list args)
    KRB5_LIB_FUNCTION char
    -**KRB5_LIB_CALL 
    krb5_config_get_strings (krb5_context context, const krb5_config_section *c,...)
    KRB5_LIB_FUNCTION void
    -KRB5_LIB_CALL 
    krb5_config_free_strings (char **strings)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_config_vget_bool_default (krb5_context context, const krb5_config_section *c, krb5_boolean def_value, va_list args)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_config_vget_bool (krb5_context context, const krb5_config_section *c, va_list args)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_config_get_bool_default (krb5_context context, const krb5_config_section *c, krb5_boolean def_value,...)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_config_get_bool (krb5_context context, const krb5_config_section *c,...)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time_default (krb5_context context, const krb5_config_section *c, int def_value, va_list args)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time (krb5_context context, const krb5_config_section *c, va_list args)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time_default (krb5_context context, const krb5_config_section *c, int def_value,...)
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time (krb5_context context, const krb5_config_section *c,...)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_expand_hostname (krb5_context context, const char *orig_hostname, char **new_hostname)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_expand_hostname_realms (krb5_context context, const char *orig_hostname, char **new_hostname, char ***realms)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_free_host_realm (krb5_context context, krb5_realm *realmlist)
    KRB5_LIB_FUNCTION krb5_boolean
    -KRB5_LIB_CALL 
    krb5_kuserok (krb5_context context, krb5_principal principal, const char *luser)
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb5_plugin_register (krb5_context context, enum krb5_plugin_type type, const char *name, void *symbol)
    + + + + + + + + + + +

    +Data Structures

    struct  krb5plugin_an2ln_ftable_desc
     Description of the krb5_aname_to_lname(3) plugin facility. More...
     
    struct  krb5plugin_db_ftable_desc
     Description of the krb5 DB plugin facility. More...
     
    struct  krb5plugin_kuserok_ftable_desc
     Description of the krb5_kuserok(3) plugin facility. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_string (krb5_context context, const char *string, const char *format,...)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_file (krb5_context context, const char *file, const char *format,...)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_aname_to_localname (krb5_context context, krb5_const_principal aname, size_t lnsize, char *lname)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_file_multi (krb5_context context, const char *fname, krb5_config_section **res)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_file_free (krb5_context context, krb5_config_section *s)
     
    KRB5_LIB_FUNCTION const krb5_config_binding *KRB5_LIB_CALL krb5_config_get_list (krb5_context context, const krb5_config_section *c,...)
     
    KRB5_LIB_FUNCTION const krb5_config_binding *KRB5_LIB_CALL krb5_config_vget_list (krb5_context context, const krb5_config_section *c, va_list args)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_config_get_string (krb5_context context, const krb5_config_section *c,...)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_config_vget_string (krb5_context context, const krb5_config_section *c, va_list args)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_config_vget_string_default (krb5_context context, const krb5_config_section *c, const char *def_value, va_list args)
     
    KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL krb5_config_get_string_default (krb5_context context, const krb5_config_section *c, const char *def_value,...)
     
    KRB5_LIB_FUNCTION char **KRB5_LIB_CALL krb5_config_vget_strings (krb5_context context, const krb5_config_section *c, va_list args)
     
    KRB5_LIB_FUNCTION char **KRB5_LIB_CALL krb5_config_get_strings (krb5_context context, const krb5_config_section *c,...)
     
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_config_free_strings (char **strings)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool_default (krb5_context context, const krb5_config_section *c, krb5_boolean def_value, va_list args)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool (krb5_context context, const krb5_config_section *c, va_list args)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool_default (krb5_context context, const krb5_config_section *c, krb5_boolean def_value,...)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool (krb5_context context, const krb5_config_section *c,...)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time_default (krb5_context context, const krb5_config_section *c, int def_value, va_list args)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time (krb5_context context, const krb5_config_section *c, va_list args)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time_default (krb5_context context, const krb5_config_section *c, int def_value,...)
     
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time (krb5_context context, const krb5_config_section *c,...)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname (krb5_context context, const char *orig_hostname, char **new_hostname)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname_realms (krb5_context context, const char *orig_hostname, char **new_hostname, char ***realms)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_host_realm (krb5_context context, krb5_realm *realmlist)
     
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kuserok (krb5_context context, krb5_principal principal, const char *luser)
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_plugin_register (krb5_context context, enum krb5_plugin_type type, const char *name, void *symbol)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_acl_match_file()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_file KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_file (krb5_context  context, krb5_context context,
    const char *  file, const char * file,
    const char *  format, const char * format,
      ...  ... 
    )
    -
    -
    - -

    -krb5_acl_match_file matches ACL format against each line in a file using krb5_acl_match_string(). Lines starting with # are treated like comments and ignored.

    -

    Parameters:
    - - - - - +
    +

    krb5_acl_match_file matches ACL format against each line in a file using krb5_acl_match_string(). Lines starting with # are treated like comments and ignored.

    +
    Parameters
    +
    context Kerberos 5 context.
    file file with acl listed in the file.
    format format to match.
    ... parameter to format string.
    + + + +
    contextKerberos 5 context.
    filefile with acl listed in the file.
    formatformat to match.
    ...parameter to format string.
    +
    -
    Returns:
    Return an error code or 0.
    -
    See also:
    krb5_acl_match_string
    +
    Returns
    Return an error code or 0.
    +
    See also
    krb5_acl_match_string
    -

    - +

    + +

    ◆ krb5_acl_match_string()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_string KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_string (krb5_context  context, krb5_context context,
    const char *  string, const char * string,
    const char *  format, const char * format,
      ...  ... 
    )
    -
    -
    - -

    -krb5_acl_match_string matches ACL format against a string.

    -The ACL format has three format specifiers: s, f, and r. Each specifier will retrieve one argument from the variable arguments for either matching or storing data. The input string is split up using " " (space) and "\t" (tab) as a delimiter; multiple and "\t" in a row are considered to be the same.

    -List of format specifiers:

      -
    • s Matches a string using strcmp(3) (case sensitive).
    • f Matches the string with fnmatch(3). Theflags argument (the last argument) passed to the fnmatch function is 0.
    • r Returns a copy of the string in the char ** passed in; the copy must be freed with free(3). There is no need to free(3) the string on error: the function will clean up and set the pointer to NULL.
    -

    -

    Parameters:
    - - - - - +
    +

    krb5_acl_match_string matches ACL format against a string.

    +

    The ACL format has three format specifiers: s, f, and r. Each specifier will retrieve one argument from the variable arguments for either matching or storing data. The input string is split up using " " (space) and "\t" (tab) as a delimiter; multiple and "\t" in a row are considered to be the same.

    +

    List of format specifiers:

      +
    • s Matches a string using strcmp(3) (case sensitive).
    • +
    • f Matches the string with fnmatch(3). Theflags argument (the last argument) passed to the fnmatch function is 0.
    • +
    • r Returns a copy of the string in the char ** passed in; the copy must be freed with free(3). There is no need to free(3) the string on error: the function will clean up and set the pointer to NULL.
    • +
    +
    Parameters
    +
    context Kerberos 5 context
    string string to match with
    format format to match
    ... parameter to format string
    + + + +
    contextKerberos 5 context
    stringstring to match with
    formatformat to match
    ...parameter to format string
    +
    -
    Returns:
    Return an error code or 0.
    -
     char *s;
    -
    - ret = krb5_acl_match_string(context, "foo", "s", "foo");
    - if (ret)
    -     krb5_errx(context, 1, "acl didn't match");
    - ret = krb5_acl_match_string(context, "foo foo baz/kaka",
    -     "ss", "foo", &s, "foo/\\*");
    - if (ret) {
    -     // no need to free(s) on error
    -     assert(s == NULL);
    -     krb5_errx(context, 1, "acl didn't match");
    - }
    - free(s);
    -

    -

    See also:
    krb5_acl_match_file
    +
    Returns
    Return an error code or 0.
    +
    char *s;
    +
    +
    ret = krb5_acl_match_string(context, "foo", "s", "foo");
    +
    if (ret)
    +
    krb5_errx(context, 1, "acl didn't match");
    +
    ret = krb5_acl_match_string(context, "foo foo baz/kaka",
    +
    "ss", "foo", &s, "foo/\\*");
    +
    if (ret) {
    +
    // no need to free(s) on error
    +
    assert(s == NULL);
    +
    krb5_errx(context, 1, "acl didn't match");
    +
    }
    +
    free(s);
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_errx(krb5_context context, int eval, const char *fmt,...) __attribute__((__noreturn__
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_string(krb5_context context, const char *string, const char *format,...)
    Definition: acl.c:200
    +
    See also
    krb5_acl_match_file
    -

    - + + +

    ◆ krb5_aname_to_localname()

    +
    - + - - + + + + + + + + + + + + + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_file_free KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_aname_to_localname (krb5_context  context, krb5_context context,
    krb5_const_principal aname,
    size_t lnsize,
    krb5_config_section *  s char * lname 
    )
    -
    -
    - -

    -Free configuration file section, the result of krb5_config_parse_file() and krb5_config_parse_file_multi().

    -

    Parameters:
    - - - +
    +

    Map a principal name to a local username.

    +

    Returns 0 on success, KRB5_NO_LOCALNAME if no mapping was found, or some Kerberos or system error.

    +

    Inputs:

    +
    Parameters
    +
    context A Kerberos 5 context
    s the configuration section to free
    + + + +
    contextA krb5_context
    anameA principal name
    lnsizeThe size of the buffer into which the username will be written
    lnameThe buffer into which the username will be written
    +
    -
    Returns:
    returns 0 on successes, otherwise an error code, see krb5_get_error_message()
    -

    - + + +

    ◆ krb5_config_file_free()

    +
    - + - - - + + + + + + + + + + + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_config_free_strings KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_file_free (char **  strings  ) krb5_context context,
    krb5_config_section * s 
    )
    +
    +

    Free configuration file section, the result of krb5_config_parse_file() and krb5_config_parse_file_multi().

    +
    Parameters
    + + + +
    contextA Kerberos 5 context
    sthe configuration section to free
    +
    +
    +
    Returns
    returns 0 on successes, otherwise an error code, see krb5_get_error_message()
    + +
    -
    + +

    ◆ krb5_config_free_strings()

    -

    -Free the resulting strings from krb5_config-get_strings() and krb5_config_vget_strings().

    -

    Parameters:
    - - +
    +
    +
    strings strings to free
    + + + + + + + +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_config_free_strings (char ** strings)
    +
    +

    Free the resulting strings from krb5_config-get_strings() and krb5_config_vget_strings().

    +
    Parameters
    + +
    stringsstrings to free
    +
    -

    - + + +

    ◆ krb5_config_get_bool()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
      ...  ... 
    )
    -
    -
    - -

    -Like krb5_config_get_bool() but with a va_list list of configuration selection.

    -Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    -

    Parameters:
    - - - - +
    +

    Like krb5_config_get_bool() but with a va_list list of configuration selection.

    +

    Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    ... a list of names, terminated with NULL.
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    TRUE or FALSE
    +
    Returns
    TRUE or FALSE
    -

    - + + +

    ◆ krb5_config_get_bool_default()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool_default KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool_default (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    krb5_boolean  def_value, krb5_boolean def_value,
      ...  ... 
    )
    -
    -
    - -

    -krb5_config_get_bool_default() will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    -

    Parameters:
    - - - - - +
    +

    krb5_config_get_bool_default() will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    def_value the default value to return if no configuration found in the database.
    ... a list of names, terminated with NULL.
    + + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    def_valuethe default value to return if no configuration found in the database.
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    TRUE or FALSE
    +
    Returns
    TRUE or FALSE
    -

    - + + +

    ◆ krb5_config_get_list()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION const krb5_config_binding* KRB5_LIB_CALL krb5_config_get_list KRB5_LIB_FUNCTION const krb5_config_binding* KRB5_LIB_CALL krb5_config_get_list (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
      ...  ... 
    )
    -
    -
    - -

    -Get a list of configuration binding list for more processing

    -

    Parameters:
    - - - - +
    +

    Get a list of configuration binding list for more processing

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    ... a list of names, terminated with NULL.
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    NULL if configuration list is not found, a list otherwise
    +
    Returns
    NULL if configuration list is not found, a list otherwise
    -

    - + + +

    ◆ krb5_config_get_string()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
      ...  ... 
    )
    -
    -
    - -

    -Returns a "const char *" to a string in the configuration database. The string may not be valid after a reload of the configuration database so a caller should make a local copy if it needs to keep the string.

    -

    Parameters:
    - - - - +
    +

    Returns a "const char *" to a string in the configuration database. The string may not be valid after a reload of the configuration database so a caller should make a local copy if it needs to keep the string.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    ... a list of names, terminated with NULL.
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    NULL if configuration string not found, a string otherwise
    +
    Returns
    NULL if configuration string not found, a string otherwise
    -

    - + + +

    ◆ krb5_config_get_string_default()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string_default KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string_default (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    const char *  def_value, const char * def_value,
      ...  ... 
    )
    -
    -
    - -

    -Like krb5_config_get_string(), but instead of returning NULL, instead return a default value.

    -

    Parameters:
    - - - - - +
    +

    Like krb5_config_get_string(), but instead of returning NULL, instead return a default value.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    def_value the default value to return if no configuration found in the database.
    ... a list of names, terminated with NULL.
    + + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    def_valuethe default value to return if no configuration found in the database.
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    a configuration string
    +
    Returns
    a configuration string
    -

    - + + +

    ◆ krb5_config_get_strings()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_get_strings KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_get_strings (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
      ...  ... 
    )
    -
    -
    - -

    -Get a list of configuration strings, free the result with krb5_config_free_strings().

    -

    Parameters:
    - - - - +
    +

    Get a list of configuration strings, free the result with krb5_config_free_strings().

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    ... a list of names, terminated with NULL.
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    TRUE or FALSE
    +
    Returns
    TRUE or FALSE
    -

    - + + +

    ◆ krb5_config_get_time()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
      ...  ... 
    )
    -
    -
    - -

    -Get the time from the configuration file using a relative time, for example: 1h30s

    -

    Parameters:
    - - - - +
    +

    Get the time from the configuration file using a relative time, for example: 1h30s

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    ... a list of names, terminated with NULL.
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    parsed the time or -1 on error
    +
    Returns
    parsed the time or -1 on error
    -

    - + + +

    ◆ krb5_config_get_time_default()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time_default KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time_default (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    int  def_value, int def_value,
      ...  ... 
    )
    -
    -
    - -

    -Get the time from the configuration file using a relative time, for example: 1h30s

    -

    Parameters:
    - - - - - +
    +

    Get the time from the configuration file using a relative time, for example: 1h30s

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    def_value the default value to return if no configuration found in the database.
    ... a list of names, terminated with NULL.
    + + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    def_valuethe default value to return if no configuration found in the database.
    ...a list of names, terminated with NULL.
    +
    -
    Returns:
    parsed the time (or def_value on parse error)
    +
    Returns
    parsed the time (or def_value on parse error)
    -

    - + + +

    ◆ krb5_config_parse_file_multi()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_file_multi KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_file_multi (krb5_context  context, krb5_context context,
    const char *  fname, const char * fname,
    krb5_config_section **  res krb5_config_section ** res 
    )
    -
    -
    - -

    -Parse a configuration file and add the result into res. This interface can be used to parse several configuration files into one resulting krb5_config_section by calling it repeatably.

    -

    Parameters:
    - - - - +
    +

    Parse a configuration file and add the result into res. This interface can be used to parse several configuration files into one resulting krb5_config_section by calling it repeatably.

    +
    Parameters
    +
    context a Kerberos 5 context.
    fname a file name to a Kerberos configuration file
    res the returned result, must be free with krb5_free_config_files().
    + + +
    contexta Kerberos 5 context.
    fnamea file name to a Kerberos configuration file
    resthe returned result, must be free with krb5_free_config_files().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    +

    If the fname starts with "~/" parse configuration file in the current users home directory. The behavior can be disabled and enabled by calling krb5_set_home_dir_access().

    -

    -If the fname starts with "~/" parse configuration file in the current users home directory. The behavior can be disabled and enabled by calling krb5_set_home_dir_access().

    -

    - + + +

    ◆ krb5_config_vget_bool()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    va_list  args va_list args 
    )
    -
    -
    - -

    -krb5_config_get_bool() will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    -

    Parameters:
    - - - - +
    +

    krb5_config_get_bool() will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    args a va_list of arguments
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    argsa va_list of arguments
    +
    -
    Returns:
    TRUE or FALSE
    +
    Returns
    TRUE or FALSE
    -

    - + + +

    ◆ krb5_config_vget_bool_default()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool_default KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool_default (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    krb5_boolean  def_value, krb5_boolean def_value,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Like krb5_config_get_bool_default() but with a va_list list of configuration selection.

    -Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    -

    Parameters:
    - - - - - +
    +

    Like krb5_config_get_bool_default() but with a va_list list of configuration selection.

    +

    Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    def_value the default value to return if no configuration found in the database.
    args a va_list of arguments
    + + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    def_valuethe default value to return if no configuration found in the database.
    argsa va_list of arguments
    +
    -
    Returns:
    TRUE or FALSE
    +
    Returns
    TRUE or FALSE
    -

    - + + +

    ◆ krb5_config_vget_list()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION const krb5_config_binding* KRB5_LIB_CALL krb5_config_vget_list KRB5_LIB_FUNCTION const krb5_config_binding* KRB5_LIB_CALL krb5_config_vget_list (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Get a list of configuration binding list for more processing

    -

    Parameters:
    - - - - +
    +

    Get a list of configuration binding list for more processing

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    args a va_list of arguments
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    argsa va_list of arguments
    +
    -
    Returns:
    NULL if configuration list is not found, a list otherwise
    +
    Returns
    NULL if configuration list is not found, a list otherwise
    -

    - + + +

    ◆ krb5_config_vget_string()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Like krb5_config_get_string(), but uses a va_list instead of ...

    -

    Parameters:
    - - - - +
    +

    Like krb5_config_get_string(), but uses a va_list instead of ...

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    args a va_list of arguments
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    argsa va_list of arguments
    +
    -
    Returns:
    NULL if configuration string not found, a string otherwise
    +
    Returns
    NULL if configuration string not found, a string otherwise
    -

    - + + +

    ◆ krb5_config_vget_string_default()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string_default KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string_default (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    const char *  def_value, const char * def_value,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Like krb5_config_vget_string(), but instead of returning NULL, instead return a default value.

    -

    Parameters:
    - - - - - +
    +

    Like krb5_config_vget_string(), but instead of returning NULL, instead return a default value.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    def_value the default value to return if no configuration found in the database.
    args a va_list of arguments
    + + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    def_valuethe default value to return if no configuration found in the database.
    argsa va_list of arguments
    +
    -
    Returns:
    a configuration string
    +
    Returns
    a configuration string
    -

    - + + +

    ◆ krb5_config_vget_strings()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_vget_strings KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_vget_strings (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Get a list of configuration strings, free the result with krb5_config_free_strings().

    -

    Parameters:
    - - - - +
    +

    Get a list of configuration strings, free the result with krb5_config_free_strings().

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    args a va_list of arguments
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    argsa va_list of arguments
    +
    -
    Returns:
    TRUE or FALSE
    +
    Returns
    TRUE or FALSE
    -

    - + + +

    ◆ krb5_config_vget_time()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Get the time from the configuration file using a relative time, for example: 1h30s

    -

    Parameters:
    - - - - +
    +

    Get the time from the configuration file using a relative time, for example: 1h30s

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    args a va_list of arguments
    + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    argsa va_list of arguments
    +
    -
    Returns:
    parsed the time or -1 on error
    +
    Returns
    parsed the time or -1 on error
    -

    - + + +

    ◆ krb5_config_vget_time_default()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time_default KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time_default (krb5_context  context, krb5_context context,
    const krb5_config_section *  c, const krb5_config_section * c,
    int  def_value, int def_value,
    va_list  args va_list args 
    )
    -
    -
    - -

    -Get the time from the configuration file using a relative time.

    -Like krb5_config_get_time_default() but with a va_list list of configuration selection.

    -

    Parameters:
    - - - - - +
    +

    Get the time from the configuration file using a relative time.

    +

    Like krb5_config_get_time_default() but with a va_list list of configuration selection.

    +
    Parameters
    +
    context A Kerberos 5 context.
    c a configuration section, or NULL to use the section from context
    def_value the default value to return if no configuration found in the database.
    args a va_list of arguments
    + + + +
    contextA Kerberos 5 context.
    ca configuration section, or NULL to use the section from context
    def_valuethe default value to return if no configuration found in the database.
    argsa va_list of arguments
    +
    -
    Returns:
    parsed the time (or def_value on parse error)
    +
    Returns
    parsed the time (or def_value on parse error)
    -

    - + + +

    ◆ krb5_expand_hostname()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname (krb5_context  context, krb5_context context,
    const char *  orig_hostname, const char * orig_hostname,
    char **  new_hostname char ** new_hostname 
    )
    -
    -
    - -

    -krb5_expand_hostname() tries to make orig_hostname into a more canonical one in the newly allocated space returned in new_hostname.

    -

    Parameters:
    - - - - +
    +

    krb5_expand_hostname() tries to make orig_hostname into a more canonical one in the newly allocated space returned in new_hostname.

    +
    Parameters
    +
    context a Keberos context
    orig_hostname hostname to canonicalise.
    new_hostname output hostname, caller must free hostname with krb5_xfree().
    + + +
    contexta Keberos context
    orig_hostnamehostname to canonicalise.
    new_hostnameoutput hostname, caller must free hostname with krb5_xfree().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_expand_hostname_realms()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname_realms KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname_realms (krb5_context  context, krb5_context context,
    const char *  orig_hostname, const char * orig_hostname,
    char **  new_hostname, char ** new_hostname,
    char ***  realms char *** realms 
    )
    -
    -
    - -

    -krb5_expand_hostname_realms() expands orig_hostname to a name we believe to be a hostname in newly allocated space in new_hostname and return the realms new_hostname is believed to belong to in realms.

    -

    Parameters:
    - - - - - +
    +

    krb5_expand_hostname_realms() expands orig_hostname to a name we believe to be a hostname in newly allocated space in new_hostname and return the realms new_hostname is believed to belong to in realms.

    +
    Parameters
    +
    context a Keberos context
    orig_hostname hostname to canonicalise.
    new_hostname output hostname, caller must free hostname with krb5_xfree().
    realms output possible realms, is an array that is terminated with NULL. Caller must free with krb5_free_host_realm().
    + + + +
    contexta Keberos context
    orig_hostnamehostname to canonicalise.
    new_hostnameoutput hostname, caller must free hostname with krb5_xfree().
    realmsoutput possible realms, is an array that is terminated with NULL. Caller must free with krb5_free_host_realm().
    +
    -
    Returns:
    Return an error code or 0, see krb5_get_error_message().
    +
    Returns
    Return an error code or 0, see krb5_get_error_message().
    -

    - + + +

    ◆ krb5_free_host_realm()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_host_realm KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_host_realm (krb5_context  context, krb5_context context,
    krb5_realm *  realmlist krb5_realm * realmlist 
    )
    -
    -
    - -

    -Free all memory allocated by `realmlist'

    -

    Parameters:
    - - - +
    +

    Free all memory allocated by ‘realmlist’

    +
    Parameters
    +
    context A Kerberos 5 context.
    realmlist realmlist to free, NULL is ok
    + +
    contextA Kerberos 5 context.
    realmlistrealmlist to free, NULL is ok
    +
    -
    Returns:
    a Kerberos error code, always 0.
    +
    Returns
    a Kerberos error code, always 0.
    -

    - + + +

    ◆ krb5_kuserok()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kuserok KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kuserok (krb5_context  context, krb5_context context,
    krb5_principal  principal, krb5_principal principal,
    const char *  luser const char * luser 
    )
    -
    -
    - -

    -This function takes the name of a local user and checks if principal is allowed to log in as that user.

    -The user may have a ~/.k5login file listing principals that are allowed to login as that user. If that file does not exist, all principals with a first component identical to the username, and a realm considered local, are allowed access.

    -The .k5login file must contain one principal per line, be owned by user and not be writable by group or other (but must be readable by anyone).

    -Note that if the file exists, no implicit access rights are given to user@LOCALREALM.

    -Optionally, a set of files may be put in ~/.k5login.d (a directory), in which case they will all be checked in the same manner as .k5login. The files may be called anything, but files starting with a hash (#) , or ending with a tilde (~) are ignored. Subdirectories are not traversed. Note that this directory may not be checked by other Kerberos implementations.

    -If no configuration file exists, match user against local domains, ie luser@LOCAL-REALMS-IN-CONFIGURATION-FILES.

    -

    Parameters:
    - - - - +
    +

    This function takes the name of a local user and checks if principal is allowed to log in as that user.

    +

    The user may have a ~/.k5login file listing principals that are allowed to login as that user. If that file does not exist, all principals with a only one component that is identical to the username, and a realm considered local, are allowed access.

    +

    The .k5login file must contain one principal per line, be owned by user and not be writable by group or other (but must be readable by anyone).

    +

    Note that if the file exists, no implicit access rights are given to user@LOCALREALM.

    +

    Optionally, a set of files may be put in ~/.k5login.d (a directory), in which case they will all be checked in the same manner as .k5login. The files may be called anything, but files starting with a hash (#) , or ending with a tilde (~) are ignored. Subdirectories are not traversed. Note that this directory may not be checked by other Kerberos implementations.

    +

    If no configuration file exists, match user against local domains, ie luser@LOCAL-REALMS-IN-CONFIGURATION-FILES.

    +
    Parameters
    +
    context Kerberos 5 context.
    principal principal to check if allowed to login
    luser local user id
    + + +
    contextKerberos 5 context.
    principalprincipal to check if allowed to login
    luserlocal user id
    +
    -
    Returns:
    returns TRUE if access should be granted, FALSE otherwise.
    +
    Returns
    returns TRUE if access should be granted, FALSE otherwise.
    -

    - + + +

    ◆ krb5_plugin_register()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_plugin_register KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_plugin_register (krb5_context  context, krb5_context context,
    enum krb5_plugin_type  type, enum krb5_plugin_type type,
    const char *  name, const char * name,
    void *  symbol void * symbol 
    )
    -
    -
    - -

    -Register a plugin symbol name of specific type.

    Parameters:
    - - - - - +
    +

    Register a plugin symbol name of specific type.

    Parameters
    +
    context a Keberos context
    type type of plugin symbol
    name name of plugin symbol
    symbol a pointer to the named symbol
    + + + +
    contexta Keberos context
    typetype of plugin symbol
    namename of plugin symbol
    symbola pointer to the named symbol
    +
    -
    Returns:
    In case of error a non zero error com_err error is returned and the Kerberos error string is set.
    +
    Returns
    In case of error a non zero error com_err error is returned and the Kerberos error string is set.
    -

    +


    -Generated on Wed Jan 11 14:07:50 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ticket.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ticket.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ticket.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__ticket.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 ticket functions +Heimdal Kerberos 5 ticket functions @@ -8,66 +8,71 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 5 ticket functions
    +
    -

    Heimdal Kerberos 5 ticket functions

    - - - - +

    Functions

    KRB5_LIB_FUNCTION unsigned
    -long KRB5_LIB_CALL 
    krb5_ticket_get_flags (krb5_context context, const krb5_ticket *ticket)
    + + +

    +Functions

    KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_ticket_get_flags (krb5_context context, const krb5_ticket *ticket)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb5_ticket_get_flags()

    +
    - + - - + + - - + + - +
    KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_ticket_get_flags KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_ticket_get_flags (krb5_context  context, krb5_context context,
    const krb5_ticket *  ticket const krb5_ticket * ticket 
    )
    -
    -
    - -

    -Get the flags from the Kerberos ticket

    -

    Parameters:
    - - - +
    +

    Get the flags from the Kerberos ticket

    +
    Parameters
    +
    context Kerberos context
    ticket Kerberos ticket
    + +
    contextKerberos context
    ticketKerberos ticket
    +
    -
    Returns:
    ticket flags
    +
    Returns
    ticket flags
    -

    +
    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__v4compat.html b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__v4compat.html --- a/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__v4compat.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/group__krb5__v4compat.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 4 compatiblity functions +Heimdal Kerberos 4 compatiblity functions @@ -8,127 +8,131 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal Kerberos 4 compatiblity functions
    +
    -

    Heimdal Kerberos 4 compatiblity functions

    - - - - - - +

    Functions

    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb524_convert_creds_kdc (krb5_context context, krb5_creds *in_cred, struct credentials *v4creds) KRB5_DEPRECATED_FUNCTION("Use X instead")
    KRB5_LIB_FUNCTION
    -krb5_error_code KRB5_LIB_CALL 
    krb524_convert_creds_kdc_ccache (krb5_context context, krb5_ccache ccache, krb5_creds *in_cred, struct credentials *v4creds) KRB5_DEPRECATED_FUNCTION("Use X instead")
    + + + + +

    +Functions

    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc (krb5_context context, krb5_creds *in_cred, struct credentials *v4creds) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc_ccache (krb5_context context, krb5_ccache ccache, krb5_creds *in_cred, struct credentials *v4creds) KRB5_DEPRECATED_FUNCTION("Use X instead")
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ krb524_convert_creds_kdc()

    +
    - + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc (krb5_context  context, krb5_context context,
    krb5_creds *  in_cred, krb5_creds * in_cred,
    struct credentials *  v4creds struct credentials * v4creds 
    )
    -
    -
    - -

    -Convert the v5 credentials in in_cred to v4-dito in v4creds. This is done by sending them to the 524 function in the KDC. If `in_cred' doesn't contain a DES session key, then a new one is gotten from the KDC and stored in the cred cache `ccache'.

    -

    Parameters:
    - - - - +
    +

    Convert the v5 credentials in in_cred to v4-dito in v4creds. This is done by sending them to the 524 function in the KDC. If ‘in_cred’ doesn't contain a DES session key, then a new one is gotten from the KDC and stored in the cred cache ‘ccache’.

    +
    Parameters
    +
    context Kerberos 5 context.
    in_cred the credential to convert
    v4creds the converted credential
    + + +
    contextKerberos 5 context.
    in_credthe credential to convert
    v4credsthe converted credential
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    - +

    + +

    ◆ krb524_convert_creds_kdc_ccache()

    +
    - + - - + + - - + + - - + + - - + + - +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc_ccache KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc_ccache (krb5_context  context, krb5_context context,
    krb5_ccache  ccache, krb5_ccache ccache,
    krb5_creds *  in_cred, krb5_creds * in_cred,
    struct credentials *  v4creds struct credentials * v4creds 
    )
    -
    -
    - -

    -Convert the v5 credentials in in_cred to v4-dito in v4creds, check the credential cache ccache before checking with the KDC.

    -

    Parameters:
    - - - - - +
    +

    Convert the v5 credentials in in_cred to v4-dito in v4creds, check the credential cache ccache before checking with the KDC.

    +
    Parameters
    +
    context Kerberos 5 context.
    ccache credential cache used to check for des-ticket.
    in_cred the credential to convert
    v4creds the converted credential
    + + + +
    contextKerberos 5 context.
    ccachecredential cache used to check for des-ticket.
    in_credthe credential to convert
    v4credsthe converted credential
    +
    -
    Returns:
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    +
    Returns
    Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message().
    -

    +


    -Generated on Wed Jan 11 14:07:49 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/index.html b/crypto/heimdal/doc/doxyout/krb5/html/index.html --- a/crypto/heimdal/doc/doxyout/krb5/html/index.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/index.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Heimdal Kerberos 5 library +Heimdal Kerberos 5 library @@ -8,30 +8,37 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Heimdal Kerberos 5 library
    +
    -

    Heimdal Kerberos 5 library

    -

    -

    1.5.2

    -Introduction

    -Heimdal libkrb5 library is a implementation of the Kerberos protocol.

    -Kerberos is a system for authenticating users and services on a network. It is built upon the assumption that the network is ``unsafe''. For example, data sent over the network can be eavesdropped and altered, and addresses can also be faked. Therefore they cannot be used for authentication purposes.

    +

    +Introduction

    +

    Heimdal libkrb5 library is a implementation of the Kerberos protocol.

    +

    Kerberos is a system for authenticating users and services on a network. It is built upon the assumption that the network is `‘unsafe’'. For example, data sent over the network can be eavesdropped and altered, and addresses can also be faked. Therefore they cannot be used for authentication purposes.

    -

    -If you want to know more about the file formats that is used by Heimdal, please see: File formats

    -The project web page: http://www.h5l.org/

    +
  • Introduction to the Kerberos 5 API
  • +
  • The principal handing functions.
  • +
  • The credential cache functions
  • +
  • The keytab handing functions
  • + +

    If you want to know more about the file formats that is used by Heimdal, please see: File formats

    +

    The project web page: http://www.h5l.org/

    +
    +
    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/jquery.js b/crypto/heimdal/doc/doxyout/krb5/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/krb5/html/krb5_ccache_intro.html b/crypto/heimdal/doc/doxyout/krb5/html/krb5_ccache_intro.html --- a/crypto/heimdal/doc/doxyout/krb5/html/krb5_ccache_intro.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/krb5_ccache_intro.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: The credential cache functions +The credential cache functions @@ -8,67 +8,87 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    The credential cache functions
    +
    -

    The credential cache functions

    -Kerberos credential caches

    -krb5_ccache structure holds a Kerberos credential cache.

    -Heimdal support the follow types of credential caches:

    +

    +Kerberos credential caches

    +

    krb5_ccache structure holds a Kerberos credential cache.

    +

    Heimdal support the follow types of credential caches:

      -
    • SCC Store the credential in a database
    • FILE Store the credential in memory
    • MEMORY Store the credential in memory
    • API A credential cache server based solution for Mac OS X
    • KCM A credential cache server based solution for all platforms
    -

    -Example

    -This is a minimalistic version of klist:
    #include <krb5.h>
    -
    -int
    -main (int argc, char **argv)
    -{
    -    krb5_context context;
    -    krb5_cc_cursor cursor;
    -    krb5_error_code ret;
    -    krb5_ccache id;
    -    krb5_creds creds;
    -
    -    if (krb5_init_context (&context) != 0)
    -        errx(1, "krb5_context");
    -
    -    ret = krb5_cc_default (context, &id);
    -    if (ret)
    -        krb5_err(context, 1, ret, "krb5_cc_default");
    -
    -    ret = krb5_cc_start_seq_get(context, id, &cursor);
    -    if (ret)
    -        krb5_err(context, 1, ret, "krb5_cc_start_seq_get");
    -
    -    while((ret = krb5_cc_next_cred(context, id, &cursor, &creds)) == 0){
    -        char *principal;
    -
    -        krb5_unparse_name(context, creds.server, &principal);
    -        printf("principal: %s\\n", principal);
    -        free(principal);
    -        krb5_free_cred_contents (context, &creds);
    -    }
    -    ret = krb5_cc_end_seq_get(context, id, &cursor);
    -    if (ret)
    -        krb5_err(context, 1, ret, "krb5_cc_end_seq_get");
    -
    -    krb5_cc_close(context, id);
    -
    -    krb5_free_context(context);
    -    return 0;
    -}
    -
    +
  • SCC Store the credential in a database
  • +
  • FILE Store the credential in memory
  • +
  • MEMORY Store the credential in memory
  • +
  • API A credential cache server based solution for Mac OS X
  • +
  • KCM A credential cache server based solution for all platforms
  • + +

    +Example

    +

    This is a minimalistic version of klist:

    #include <krb5.h>
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    krb5_context context;
    +
    krb5_cc_cursor cursor;
    +
    krb5_error_code ret;
    +
    krb5_ccache id;
    +
    krb5_creds creds;
    +
    +
    if (krb5_init_context (&context) != 0)
    +
    errx(1, "krb5_context");
    +
    +
    ret = krb5_cc_default (context, &id);
    +
    if (ret)
    +
    krb5_err(context, 1, ret, "krb5_cc_default");
    +
    +
    ret = krb5_cc_start_seq_get(context, id, &cursor);
    +
    if (ret)
    +
    krb5_err(context, 1, ret, "krb5_cc_start_seq_get");
    +
    +
    while((ret = krb5_cc_next_cred(context, id, &cursor, &creds)) == 0){
    +
    char *principal;
    +
    +
    krb5_unparse_name(context, creds.server, &principal);
    +
    printf("principal: %s\\n", principal);
    +
    free(principal);
    +
    krb5_free_cred_contents (context, &creds);
    +
    }
    +
    ret = krb5_cc_end_seq_get(context, id, &cursor);
    +
    if (ret)
    +
    krb5_err(context, 1, ret, "krb5_cc_end_seq_get");
    +
    +
    krb5_cc_close(context, id);
    +
    + +
    return 0;
    +
    }
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_end_seq_get(krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor)
    Definition: cache.c:875
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_start_seq_get(krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor)
    Definition: cache.c:841
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_default(krb5_context context, krb5_ccache *id)
    Definition: cache.c:649
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_next_cred(krb5_context context, const krb5_ccache id, krb5_cc_cursor *cursor, krb5_creds *creds)
    Definition: cache.c:859
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_close(krb5_context context, krb5_ccache id)
    Definition: cache.c:712
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err(krb5_context context, int eval, krb5_error_code code, const char *fmt,...) __attribute__((__noreturn__
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name(krb5_context context, krb5_const_principal principal, char **name)
    Definition: principal.c:608
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context(krb5_context *context)
    Definition: context.c:417
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_cred_contents(krb5_context context, krb5_creds *c)
    Definition: creds.c:49
    +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context(krb5_context context)
    Definition: context.c:615
    +
    +

    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/krb5_fileformats.html b/crypto/heimdal/doc/doxyout/krb5/html/krb5_fileformats.html --- a/crypto/heimdal/doc/doxyout/krb5/html/krb5_fileformats.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/krb5_fileformats.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: File formats +File formats @@ -8,147 +8,145 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    File formats
    +
    -

    File formats

    -File formats

    -This section documents the diffrent file formats that are used in Heimdal and other Kerberos implementations.

    -keytab

    -The keytab binary format is not a standard format. The format has evolved and may continue to. It is however understood by several Kerberos implementations including Heimdal, MIT, Sun's Java ktab and are created by the ktpass.exe utility from Windows. So it has established itself as the defacto format for storing Kerberos keys.

    -The following C-like structure definitions illustrate the MIT keytab file format. All values are in network byte order. All text is ASCII.

    -

       keytab {
    -       uint16_t file_format_version;                    # 0x502
    -       keytab_entry entries[*];
    -   };
    -
    -   keytab_entry {
    -       int32_t size;
    -       uint16_t num_components;   # subtract 1 if version 0x501
    -       counted_octet_string realm;
    -       counted_octet_string components[num_components];
    -       uint32_t name_type;       # not present if version 0x501
    -       uint32_t timestamp;
    -       uint8_t vno8;
    -       keyblock key;
    -       uint32_t vno; #only present if >= 4 bytes left in entry
    -       uint32_t flags; #only present if >= 4 bytes left in entry
    -   };
    -
    -   counted_octet_string {
    -       uint16_t length;
    -       uint8_t data[length];
    -   };
    -
    -   keyblock {
    -       uint16_t type;
    -       counted_octet_string;
    -   };
    -

    -All numbers are stored in network byteorder (big endian) format.

    -The keytab file format begins with the 16 bit file_format_version which at the time this document was authored is 0x502. The format of older keytabs is described at the end of this document.

    -The file_format_version is immediately followed by an array of keytab_entry structures which are prefixed with a 32 bit size indicating the number of bytes that follow in the entry. Note that the size should be evaluated as signed. This is because a negative value indicates that the entry is in fact empty (e.g. it has been deleted) and that the negative value of that negative value (which is of course a positive value) is the offset to the next keytab_entry. Based on these size values alone the entire keytab file can be traversed.

    -The size is followed by a 16 bit num_components field indicating the number of counted_octet_string components in the components array.

    -The num_components field is followed by a counted_octet_string representing the realm of the principal.

    -A counted_octet_string is simply an array of bytes prefixed with a 16 bit length. For the realm and name components, the counted_octet_string bytes are ASCII encoded text with no zero terminator.

    -Following the realm is the components array that represents the name of the principal. The text of these components may be joined with slashs to construct the typical SPN representation. For example, the service principal HTTP/www.foo.net@FOO.NET would consist of name components "HTTP" followed by "www.foo.net".

    -Following the components array is the 32 bit name_type (e.g. 1 is KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc). In practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL.

    -The 32 bit timestamp indicates the time the key was established for that principal. The value represents the number of seconds since Jan 1, 1970.

    -The 8 bit vno8 field is the version number of the key. This value is overridden by the 32 bit vno field if it is present. The vno8 field is filled with the lower 8 bits of the 32 bit protocol kvno field.

    -The keyblock structure consists of a 16 bit value indicating the encryption type and is a counted_octet_string containing the key. The encryption type is the same as the Kerberos standard (e.g. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, etc).

    -The last field of the keytab_entry structure is optional. If the size of the keytab_entry indicates that there are at least 4 bytes remaining, a 32 bit value representing the key version number is present. This value supersedes the 8 bit vno8 value preceeding the keyblock.

    -Older keytabs with a file_format_version of 0x501 are different in three ways:

    +

    +File formats

    +

    This section documents the diffrent file formats that are used in Heimdal and other Kerberos implementations.

    +

    +keytab

    +

    The keytab binary format is not a standard format. The format has evolved and may continue to. It is however understood by several Kerberos implementations including Heimdal, MIT, Sun's Java ktab and are created by the ktpass.exe utility from Windows. So it has established itself as the defacto format for storing Kerberos keys.

    +

    The following C-like structure definitions illustrate the MIT keytab file format. All values are in network byte order. All text is ASCII.

    +
    keytab {
    +
    uint16_t file_format_version; # 0x502
    +
    keytab_entry entries[*];
    +
    };
    +
    +
    keytab_entry {
    +
    int32_t size;
    +
    uint16_t num_components; # subtract 1 if version 0x501
    +
    counted_octet_string realm;
    +
    counted_octet_string components[num_components];
    +
    uint32_t name_type; # not present if version 0x501
    +
    uint32_t timestamp;
    +
    uint8_t vno8;
    +
    keyblock key;
    +
    uint32_t vno; #only present if >= 4 bytes left in entry
    +
    uint32_t flags; #only present if >= 4 bytes left in entry
    +
    };
    +
    +
    counted_octet_string {
    +
    uint16_t length;
    +
    uint8_t data[length];
    +
    };
    +
    +
    keyblock {
    +
    uint16_t type;
    +
    counted_octet_string;
    +
    };
    +

    All numbers are stored in network byteorder (big endian) format.

    +

    The keytab file format begins with the 16 bit file_format_version which at the time this document was authored is 0x502. The format of older keytabs is described at the end of this document.

    +

    The file_format_version is immediately followed by an array of keytab_entry structures which are prefixed with a 32 bit size indicating the number of bytes that follow in the entry. Note that the size should be evaluated as signed. This is because a negative value indicates that the entry is in fact empty (e.g. it has been deleted) and that the negative value of that negative value (which is of course a positive value) is the offset to the next keytab_entry. Based on these size values alone the entire keytab file can be traversed.

    +

    The size is followed by a 16 bit num_components field indicating the number of counted_octet_string components in the components array.

    +

    The num_components field is followed by a counted_octet_string representing the realm of the principal.

    +

    A counted_octet_string is simply an array of bytes prefixed with a 16 bit length. For the realm and name components, the counted_octet_string bytes are ASCII encoded text with no zero terminator.

    +

    Following the realm is the components array that represents the name of the principal. The text of these components may be joined with slashs to construct the typical SPN representation. For example, the service principal HTTP/www.foo.net@FOO.NET would consist of name components "HTTP" followed by "www.foo.net".

    +

    Following the components array is the 32 bit name_type (e.g. 1 is KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc). In practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL.

    +

    The 32 bit timestamp indicates the time the key was established for that principal. The value represents the number of seconds since Jan 1, 1970.

    +

    The 8 bit vno8 field is the version number of the key. This value is overridden by the 32 bit vno field if it is present. The vno8 field is filled with the lower 8 bits of the 32 bit protocol kvno field.

    +

    The keyblock structure consists of a 16 bit value indicating the encryption type and is a counted_octet_string containing the key. The encryption type is the same as the Kerberos standard (e.g. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, etc).

    +

    The last field of the keytab_entry structure is optional. If the size of the keytab_entry indicates that there are at least 4 bytes remaining, a 32 bit value representing the key version number is present. This value supersedes the 8 bit vno8 value preceeding the keyblock.

    +

    Older keytabs with a file_format_version of 0x501 are different in three ways:

      -
    • All integers are in host byte order [1].
    • The num_components field is 1 too large (i.e. after decoding, decrement by 1).
    • The 32 bit name_type field is not present.
    -

    -[1] The file_format_version field should really be treated as two separate 8 bit quantities representing the major and minor version number respectively.

    -Heimdal database dump file

    -Format of the Heimdal text dump file as of Heimdal 0.6.3:

    -Each line in the dump file is one entry in the database.

    -Each field of a line is separated by one or more spaces, with the exception of fields consisting of principals containing spaces, where space can be quoted with \ and \ is quoted by \.

    -Fields and their types are:

    -

            Quoted princial (quote character is \) [string]
    -        Keys [keys]
    -        Created by [event]
    -        Modified by [event optional]
    -        Valid start time [time optional]
    -        Valid end time [time optional]
    -        Password end valid time [time optional]
    -        Max lifetime of ticket [time optional]
    -        Max renew time of ticket [integer optional]
    -        Flags [hdb flags]
    -        Generation number [generation optional]
    -        Extensions [extentions optional]
    -

    -Fields following these silently are ignored.

    -All optional fields will be skipped if they fail to parse (or comprise the optional field marker of "-", w/o quotes).

    -Example:

    -

     fred\@CODE.COM 27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:- 20020415130120:admin\@CODE.COM 20041221112428:fred\@CODE.COM - - - 86400 604800 126 20020415130120:793707:28 -
    -

    -Encoding of types are as follows:

    -

      -
    • keys
    -

    -

     kvno:[masterkvno:keytype:keydata:salt]{zero or more separated by :}
    -

    -kvno is the key version number.

    -keydata is hex-encoded

    -masterkvno is the kvno of the database master key. If this field is empty, the kadmin load and merge operations will encrypt the key data with the master key if there is one. Otherwise the key data will be imported asis.

    -salt is encoded as "-" (no/default salt) or

    -

     salt-type /
    - salt-type / "string"
    - salt-type / hex-encoded-data
    -

    -keytype is the protocol enctype number; see enum ENCTYPE in include/krb5_asn1.h for values.

    -Example:

     27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:-
    -

    -

     kvno=27,{key: masterkvno=1,keytype=des3-cbc-sha1,keydata=..., default salt}...
    -

    -

      -
    • time
    -

    -Format of the time is: YYYYmmddHHMMSS, corresponding to strftime format "%Y%m%d%k%M%S".

    -Time is expressed in UTC.

    -Time can be optional (using -), when the time 0 is used.

    -Example:

    -

     20041221112428
    -

    +

  • All integers are in host byte order [1].
  • +
  • The num_components field is 1 too large (i.e. after decoding, decrement by 1).
  • +
  • The 32 bit name_type field is not present.
  • + +

    [1] The file_format_version field should really be treated as two separate 8 bit quantities representing the major and minor version number respectively.

    +

    +Heimdal database dump file

    +

    Format of the Heimdal text dump file as of Heimdal 0.6.3:

    +

    Each line in the dump file is one entry in the database.

    +

    Each field of a line is separated by one or more spaces, with the exception of fields consisting of principals containing spaces, where space can be quoted with \ and \ is quoted by .

    +

    Fields and their types are:

    +
    Quoted princial (quote character is \) [string]
    +
    Keys [keys]
    +
    Created by [event]
    +
    Modified by [event optional]
    +
    Valid start time [time optional]
    +
    Valid end time [time optional]
    +
    Password end valid time [time optional]
    +
    Max lifetime of ticket [time optional]
    +
    Max renew time of ticket [integer optional]
    +
    Flags [hdb flags]
    +
    Generation number [generation optional]
    +
    Extensions [extentions optional]
    +

    Fields following these silently are ignored.

    +

    All optional fields will be skipped if they fail to parse (or comprise the optional field marker of "-", w/o quotes).

    +

    Example:

    +
    fred\@CODE.COM 27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:- 20020415130120:admin\@CODE.COM 20041221112428:fred\@CODE.COM - - - 86400 604800 126 20020415130120:793707:28 -
    +

    Encoding of types are as follows:

      -
    • event
    -

    -

            time:principal
    -

    -time is as given in format time

    -principal is a string. Not quoting it may not work in earlier versions of Heimdal.

    -Example:

     20041221112428:bloggs\@CODE.COM
    -

    +

  • keys
  • + +
    kvno:[masterkvno:keytype:keydata:salt]{zero or more separated by :}
    +

    kvno is the key version number.

    +

    keydata is hex-encoded

    +

    masterkvno is the kvno of the database master key. If this field is empty, the kadmin load and merge operations will encrypt the key data with the master key if there is one. Otherwise the key data will be imported asis.

    +

    salt is encoded as "-" (no/default salt) or

    +
    salt-type /
    +
    salt-type / "string"
    +
    salt-type / hex-encoded-data
    +

    keytype is the protocol enctype number; see enum ENCTYPE in include/krb5_asn1.h for values.

    +

    Example:

    27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:-
    +
    kvno=27,{key: masterkvno=1,keytype=des3-cbc-sha1,keydata=..., default salt}...
    +
      +
    • time
    • +
    +

    Format of the time is: YYYYmmddHHMMSS, corresponding to strftime format "%Y%m%d%k%M%S".

    +

    Time is expressed in UTC.

    +

    Time can be optional (using -), when the time 0 is used.

    +

    Example:

    +
    20041221112428
    +
      +
    • event
    • +
    +
    time:principal
    +

    time is as given in format time

    +

    principal is a string. Not quoting it may not work in earlier versions of Heimdal.

    +

    Example:

    20041221112428:bloggs\@CODE.COM
    +
      +
    • hdb flags
    • +
    +

    Integer encoding of HDB flags, see HDBFlags in lib/hdb/hdb.asn1. Each bit in the integer is the same as the bit in the specification.

      -
    • hdb flags
    -

    -Integer encoding of HDB flags, see HDBFlags in lib/hdb/hdb.asn1. Each bit in the integer is the same as the bit in the specification.

    +

  • generation:
  • + +
    time:usec:gen
    +

    usec is a the microsecond, integer. gen is generation number, integer.

    +

    The generation can be defaulted (using '-') or the empty string

      -
    • generation:
    -

    -

     time:usec:gen
    -

    -usec is a the microsecond, integer. gen is generation number, integer.

    -The generation can be defaulted (using '-') or the empty string

    -

      -
    • extensions:
    -

    -

     first-hex-encoded-HDB-Extension[:second-...]
    -

    -HDB-extension is encoded the DER encoded HDB-Extension from lib/hdb/hdb.asn1. Consumers HDB extensions should be aware that unknown entires needs to be preserved even thought the ASN.1 data content might be unknown. There is a critical flag in the data to show to the KDC that the entry MUST be understod if the entry is to be used.

    +
  • extensions:
  • + +
    first-hex-encoded-HDB-Extension[:second-...]
    +

    HDB-extension is encoded the DER encoded HDB-Extension from lib/hdb/hdb.asn1. Consumers HDB extensions should be aware that unknown entires needs to be preserved even thought the ASN.1 data content might be unknown. There is a critical flag in the data to show to the KDC that the entry MUST be understod if the entry is to be used.

    +
    +
    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/krb5_init_creds_intro.html b/crypto/heimdal/doc/doxyout/krb5/html/krb5_init_creds_intro.html --- a/crypto/heimdal/doc/doxyout/krb5/html/krb5_init_creds_intro.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/krb5_init_creds_intro.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: The initial credential handing functions +The initial credential handing functions @@ -8,22 +8,28 @@ keyhole logo

    - - + + + + + + +
    +
    +
    The initial credential handing functions
    +
    +

    +Initial credential

    +

    Functions to get initial credentials: Heimdal Kerberos 5 credential handing functions .

    +
    +
    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/krb5_introduction.html b/crypto/heimdal/doc/doxyout/krb5/html/krb5_introduction.html --- a/crypto/heimdal/doc/doxyout/krb5/html/krb5_introduction.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/krb5_introduction.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Introduction to the Kerberos 5 API +Introduction to the Kerberos 5 API @@ -8,197 +8,210 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Introduction to the Kerberos 5 API
    +
    -

    Introduction to the Kerberos 5 API

    -Kerberos 5 API Overview

    -All functions are documented in manual pages. This section tries to give an overview of the major components used in Kerberos library, and point to where to look for a specific function.

    -Kerberos context

    -A kerberos context (krb5_context) holds all per thread state. All global variables that are context specific are stored in this structure, including default encryption types, credential cache (for example, a ticket file), and default realms.

    -The internals of the structure should never be accessed directly, functions exist for extracting information.

    -See the manual page for krb5_init_context() how to create a context and module Heimdal Kerberos 5 library for more information about the functions.

    -Kerberos authentication context

    -Kerberos authentication context (krb5_auth_context) holds all context related to an authenticated connection, in a similar way to the kerberos context that holds the context for the thread or process.

    -The krb5_auth_context is used by various functions that are directly related to authentication between the server/client. Example of data that this structure contains are various flags, addresses of client and server, port numbers, keyblocks (and subkeys), sequence numbers, replay cache, and checksum types.

    -Kerberos principal

    -The Kerberos principal is the structure that identifies a user or service in Kerberos. The structure that holds the principal is the krb5_principal. There are function to extract the realm and elements of the principal, but most applications have no reason to inspect the content of the structure.

    -The are several ways to create a principal (with different degree of portability), and one way to free it.

    -See also the page The principal handing functions. for more information and also module Heimdal Kerberos 5 principal functions.

    -Credential cache

    -A credential cache holds the tickets for a user. A given user can have several credential caches, one for each realm where the user have the initial tickets (the first krbtgt).

    -The credential cache data can be stored internally in different way, each of them for different proposes. File credential (FILE) caches and processes based (KCM) caches are for permanent storage. While memory caches (MEMORY) are local caches to the local process.

    -Caches are opened with krb5_cc_resolve() or created with krb5_cc_new_unique().

    -If the cache needs to be opened again (using krb5_cc_resolve()) krb5_cc_close() will close the handle, but not the remove the cache. krb5_cc_destroy() will zero out the cache, remove the cache so it can no longer be referenced.

    -See also The credential cache functions and Heimdal Kerberos 5 credential cache functions .

    -Kerberos errors

    -Kerberos errors are based on the com_err library. All error codes are 32-bit signed numbers, the first 24 bits define what subsystem the error originates from, and last 8 bits are 255 error codes within the library. Each error code have fixed string associated with it. For example, the error-code -1765328383 have the symbolic name KRB5KDC_ERR_NAME_EXP, and associated error string ``Client's entry in database has expired''.

    -This is a great improvement compared to just getting one of the unix error-codes back. However, Heimdal have an extention to pass back customised errors messages. Instead of getting ``Key table entry not found'', the user might back ``failed to find host/host.example.com@EXAMLE.COM(kvno 3) in keytab /etc/krb5.keytab (des-cbc-crc)''. This improves the chance that the user find the cause of the error so you should use the customised error message whenever it's available.

    -See also module Heimdal Kerberos 5 error reporting functions .

    -Keytab management

    -A keytab is a storage for locally stored keys. Heimdal includes keytab support for Kerberos 5 keytabs, Kerberos 4 srvtab, AFS-KeyFile's, and for storing keys in memory.

    -Keytabs are used for servers and long-running services.

    -See also The keytab handing functions and Heimdal Kerberos 5 keytab handling functions .

    -Kerberos crypto

    -Heimdal includes a implementation of the Kerberos crypto framework, all crypto operations. To create a crypto context call krb5_crypto_init().

    -See also module Heimdal Kerberos 5 cryptography functions .

    -Walkthrough of a sample Kerberos 5 client

    -This example contains parts of a sample TCP Kerberos 5 clients, if you want a real working client, please look in appl/test directory in the Heimdal distribution.

    -All Kerberos error-codes that are returned from kerberos functions in this program are passed to krb5_err, that will print a descriptive text of the error code and exit. Graphical programs can convert error-code to a human readable error-string with the krb5_get_error_message() function.

    -Note that you should not use any Kerberos function before krb5_init_context() have completed successfully. That is the reason err() is used when krb5_init_context() fails.

    -First the client needs to call krb5_init_context to initialise the Kerberos 5 library. This is only needed once per thread in the program. If the function returns a non-zero value it indicates that either the Kerberos implementation is failing or it's disabled on this host.

    -

     #include <krb5.h>
    -
    - int
    - main(int argc, char **argv)
    - {
    -         krb5_context context;
    -
    -         if (krb5_init_context(&context))
    -                 errx (1, "krb5_context");
    -

    -Now the client wants to connect to the host at the other end. The preferred way of doing this is using getaddrinfo (for operating system that have this function implemented), since getaddrinfo is neutral to the address type and can use any protocol that is available.

    -

             struct addrinfo *ai, *a;
    -         struct addrinfo hints;
    -         int error;
    -
    -         memset (&hints, 0, sizeof(hints));
    -         hints.ai_socktype = SOCK_STREAM;
    -         hints.ai_protocol = IPPROTO_TCP;
    -
    -         error = getaddrinfo (hostname, "pop3", &hints, &ai);
    -         if (error)
    -                 errx (1, "%s: %s", hostname, gai_strerror(error));
    -
    -         for (a = ai; a != NULL; a = a->ai_next) {
    -                 int s;
    -
    -                 s = socket (a->ai_family, a->ai_socktype, a->ai_protocol);
    -                 if (s < 0)
    -                         continue;
    -                 if (connect (s, a->ai_addr, a->ai_addrlen) < 0) {
    -                         warn ("connect(%s)", hostname);
    -                             close (s);
    -                             continue;
    -                 }
    -                 freeaddrinfo (ai);
    -                 ai = NULL;
    -         }
    -         if (ai) {
    -                     freeaddrinfo (ai);
    -                     errx ("failed to contact %s", hostname);
    -         }
    -

    -Before authenticating, an authentication context needs to be created. This context keeps all information for one (to be) authenticated connection (see krb5_auth_context).

    -

             status = krb5_auth_con_init (context, &auth_context);
    -         if (status)
    -                 krb5_err (context, 1, status, "krb5_auth_con_init");
    -

    -For setting the address in the authentication there is a help function krb5_auth_con_setaddrs_from_fd() that does everything that is needed when given a connected file descriptor to the socket.

    -

             status = krb5_auth_con_setaddrs_from_fd (context,
    -                                                  auth_context,
    -                                                  &sock);
    -         if (status)
    -                 krb5_err (context, 1, status,
    -                           "krb5_auth_con_setaddrs_from_fd");
    -

    -The next step is to build a server principal for the service we want to connect to. (See also krb5_sname_to_principal().)

    -

             status = krb5_sname_to_principal (context,
    -                                           hostname,
    -                                           service,
    -                                           KRB5_NT_SRV_HST,
    -                                           &server);
    -         if (status)
    -                 krb5_err (context, 1, status, "krb5_sname_to_principal");
    -

    -The client principal is not passed to krb5_sendauth() function, this causes the krb5_sendauth() function to try to figure it out itself.

    -The server program is using the function krb5_recvauth() to receive the Kerberos 5 authenticator.

    -In this case, mutual authentication will be tried. That means that the server will authenticate to the client. Using mutual authentication is good since it enables the user to verify that they are talking to the right server (a server that knows the key).

    -If you are using a non-blocking socket you will need to do all work of krb5_sendauth() yourself. Basically you need to send over the authenticator from krb5_mk_req() and, in case of mutual authentication, verifying the result from the server with krb5_rd_rep().

    -

             status = krb5_sendauth (context,
    -                                 &auth_context,
    -                                 &sock,
    -                                 VERSION,
    -                                 NULL,
    -                                 server,
    -                                 AP_OPTS_MUTUAL_REQUIRED,
    -                                 NULL,
    -                                 NULL,
    -                                 NULL,
    -                                 NULL,
    -                                 NULL,
    -                                 NULL);
    -         if (status)
    -                 krb5_err (context, 1, status, "krb5_sendauth");
    -

    -Once authentication has been performed, it is time to send some data. First we create a krb5_data structure, then we sign it with krb5_mk_safe() using the auth_context that contains the session-key that was exchanged in the krb5_sendauth()/krb5_recvauth() authentication sequence.

    -

             data.data   = "hej";
    -         data.length = 3;
    -
    -         krb5_data_zero (&packet);
    -
    -         status = krb5_mk_safe (context,
    -                                auth_context,
    -                                &data,
    -                                &packet,
    -                                NULL);
    -         if (status)
    -                 krb5_err (context, 1, status, "krb5_mk_safe");
    -

    -And send it over the network.

    -

             len = packet.length;
    -         net_len = htonl(len);
    -
    -         if (krb5_net_write (context, &sock, &net_len, 4) != 4)
    -                 err (1, "krb5_net_write");
    -         if (krb5_net_write (context, &sock, packet.data, len) != len)
    -                 err (1, "krb5_net_write");
    -

    -To send encrypted (and signed) data krb5_mk_priv() should be used instead. krb5_mk_priv() works the same way as krb5_mk_safe(), with the exception that it encrypts the data in addition to signing it.

    -

             data.data   = "hemligt";
    -         data.length = 7;
    -
    -         krb5_data_free (&packet);
    -
    -         status = krb5_mk_priv (context,
    -                                auth_context,
    -                                &data,
    -                                &packet,
    -                                NULL);
    -         if (status)
    -                 krb5_err (context, 1, status, "krb5_mk_priv");
    -

    -And send it over the network.

    -

             len = packet.length;
    -         net_len = htonl(len);
    -
    -         if (krb5_net_write (context, &sock, &net_len, 4) != 4)
    -                 err (1, "krb5_net_write");
    -         if (krb5_net_write (context, &sock, packet.data, len) != len)
    -                 err (1, "krb5_net_write");
    -

    -The server is using krb5_rd_safe() and krb5_rd_priv() to verify the signature and decrypt the packet.

    -Validating a password in an application

    -See the manual page for krb5_verify_user().

    -API differences to MIT Kerberos

    -This section is somewhat disorganised, but so far there is no overall structure to the differences, though some of the have their root in that Heimdal uses an ASN.1 compiler and MIT doesn't.

    -Principal and realms

    -Heimdal stores the realm as a krb5_realm, that is a char *. MIT Kerberos uses a krb5_data to store a realm.

    -In Heimdal krb5_principal doesn't contain the component name_type; it's instead stored in component name.name_type. To get and set the nametype in Heimdal, use krb5_principal_get_type() and krb5_principal_set_type().

    -For more information about principal and realms, see krb5_principal.

    -Error messages

    -To get the error string, Heimdal uses krb5_get_error_message(). This is to return custom error messages (like ``Can't find host/datan.example.com@CODE.COM in /etc/krb5.conf.'' instead of a ``Key table entry not found'' that error_message returns.

    -Heimdal uses a threadsafe(r) version of the com_err interface; the global com_err table isn't initialised. Then error_message returns quite a boring error string (just the error code itself).

    +

    +Kerberos 5 API Overview

    +

    All functions are documented in manual pages. This section tries to give an overview of the major components used in Kerberos library, and point to where to look for a specific function.

    +

    +Kerberos context

    +

    A kerberos context (krb5_context) holds all per thread state. All global variables that are context specific are stored in this structure, including default encryption types, credential cache (for example, a ticket file), and default realms.

    +

    The internals of the structure should never be accessed directly, functions exist for extracting information.

    +

    See the manual page for krb5_init_context() how to create a context and module Heimdal Kerberos 5 library for more information about the functions.

    +

    +Kerberos authentication context

    +

    Kerberos authentication context (krb5_auth_context) holds all context related to an authenticated connection, in a similar way to the kerberos context that holds the context for the thread or process.

    +

    The krb5_auth_context is used by various functions that are directly related to authentication between the server/client. Example of data that this structure contains are various flags, addresses of client and server, port numbers, keyblocks (and subkeys), sequence numbers, replay cache, and checksum types.

    +

    +Kerberos principal

    +

    The Kerberos principal is the structure that identifies a user or service in Kerberos. The structure that holds the principal is the krb5_principal. There are function to extract the realm and elements of the principal, but most applications have no reason to inspect the content of the structure.

    +

    The are several ways to create a principal (with different degree of portability), and one way to free it.

    +

    See also the page The principal handing functions. for more information and also module Heimdal Kerberos 5 principal functions.

    +

    +Credential cache

    +

    A credential cache holds the tickets for a user. A given user can have several credential caches, one for each realm where the user have the initial tickets (the first krbtgt).

    +

    The credential cache data can be stored internally in different way, each of them for different proposes. File credential (FILE) caches and processes based (KCM) caches are for permanent storage. While memory caches (MEMORY) are local caches to the local process.

    +

    Caches are opened with krb5_cc_resolve() or created with krb5_cc_new_unique().

    +

    If the cache needs to be opened again (using krb5_cc_resolve()) krb5_cc_close() will close the handle, but not the remove the cache. krb5_cc_destroy() will zero out the cache, remove the cache so it can no longer be referenced.

    +

    See also The credential cache functions and Heimdal Kerberos 5 credential cache functions .

    +

    +Kerberos errors

    +

    Kerberos errors are based on the com_err library. All error codes are 32-bit signed numbers, the first 24 bits define what subsystem the error originates from, and last 8 bits are 255 error codes within the library. Each error code have fixed string associated with it. For example, the error-code -1765328383 have the symbolic name KRB5KDC_ERR_NAME_EXP, and associated error string `‘Client's entry in database has expired’'.

    +

    This is a great improvement compared to just getting one of the unix error-codes back. However, Heimdal have an extention to pass back customised errors messages. Instead of getting Key table entry not found'', the user might backfailed to find host/host.example.com@EXAMLE.COM(kvno 3) in keytab /etc/krb5.keytab (des-cbc-crc)''. This improves the chance that the user find the cause of the error so you should use the customised error message whenever it's available.

    +

    See also module Heimdal Kerberos 5 error reporting functions .

    +

    +Keytab management

    +

    A keytab is a storage for locally stored keys. Heimdal includes keytab support for Kerberos 5 keytabs, Kerberos 4 srvtab, AFS-KeyFile's, and for storing keys in memory.

    +

    Keytabs are used for servers and long-running services.

    +

    See also The keytab handing functions and Heimdal Kerberos 5 keytab handling functions .

    +

    +Kerberos crypto

    +

    Heimdal includes a implementation of the Kerberos crypto framework, all crypto operations. To create a crypto context call krb5_crypto_init().

    +

    See also module Heimdal Kerberos 5 cryptography functions .

    +

    +Walkthrough of a sample Kerberos 5 client

    +

    This example contains parts of a sample TCP Kerberos 5 clients, if you want a real working client, please look in appl/test directory in the Heimdal distribution.

    +

    All Kerberos error-codes that are returned from kerberos functions in this program are passed to krb5_err, that will print a descriptive text of the error code and exit. Graphical programs can convert error-code to a human readable error-string with the krb5_get_error_message() function.

    +

    Note that you should not use any Kerberos function before krb5_init_context() have completed successfully. That is the reason err() is used when krb5_init_context() fails.

    +

    First the client needs to call krb5_init_context to initialise the Kerberos 5 library. This is only needed once per thread in the program. If the function returns a non-zero value it indicates that either the Kerberos implementation is failing or it's disabled on this host.

    +
    #include <krb5.h>
    +
    +
    int
    +
    main(int argc, char **argv)
    +
    {
    +
    krb5_context context;
    +
    +
    if (krb5_init_context(&context))
    +
    errx (1, "krb5_context");
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context(krb5_context *context)
    Definition: context.c:417
    +

    Now the client wants to connect to the host at the other end. The preferred way of doing this is using getaddrinfo (for operating system that have this function implemented), since getaddrinfo is neutral to the address type and can use any protocol that is available.

    +
    struct addrinfo *ai, *a;
    +
    struct addrinfo hints;
    +
    int error;
    +
    +
    memset (&hints, 0, sizeof(hints));
    +
    hints.ai_socktype = SOCK_STREAM;
    +
    hints.ai_protocol = IPPROTO_TCP;
    +
    +
    error = getaddrinfo (hostname, "pop3", &hints, &ai);
    +
    if (error)
    +
    errx (1, "%s: %s", hostname, gai_strerror(error));
    +
    +
    for (a = ai; a != NULL; a = a->ai_next) {
    +
    int s;
    +
    +
    s = socket (a->ai_family, a->ai_socktype, a->ai_protocol);
    +
    if (s < 0)
    +
    continue;
    +
    if (connect (s, a->ai_addr, a->ai_addrlen) < 0) {
    +
    warn ("connect(%s)", hostname);
    +
    close (s);
    +
    continue;
    +
    }
    +
    freeaddrinfo (ai);
    +
    ai = NULL;
    +
    }
    +
    if (ai) {
    +
    freeaddrinfo (ai);
    +
    errx ("failed to contact %s", hostname);
    +
    }
    +

    Before authenticating, an authentication context needs to be created. This context keeps all information for one (to be) authenticated connection (see krb5_auth_context).

    +
    status = krb5_auth_con_init (context, &auth_context);
    +
    if (status)
    +
    krb5_err (context, 1, status, "krb5_auth_con_init");
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err(krb5_context context, int eval, krb5_error_code code, const char *fmt,...) __attribute__((__noreturn__
    +

    For setting the address in the authentication there is a help function krb5_auth_con_setaddrs_from_fd() that does everything that is needed when given a connected file descriptor to the socket.

    +
    status = krb5_auth_con_setaddrs_from_fd (context,
    +
    auth_context,
    +
    &sock);
    +
    if (status)
    +
    krb5_err (context, 1, status,
    +
    "krb5_auth_con_setaddrs_from_fd");
    +

    The next step is to build a server principal for the service we want to connect to. (See also krb5_sname_to_principal().)

    +
    status = krb5_sname_to_principal (context,
    +
    hostname,
    +
    service,
    +
    KRB5_NT_SRV_HST,
    +
    &server);
    +
    if (status)
    +
    krb5_err (context, 1, status, "krb5_sname_to_principal");
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sname_to_principal(krb5_context context, const char *hostname, const char *sname, int32_t type, krb5_principal *ret_princ)
    Definition: principal.c:1364
    +

    The client principal is not passed to krb5_sendauth() function, this causes the krb5_sendauth() function to try to figure it out itself.

    +

    The server program is using the function krb5_recvauth() to receive the Kerberos 5 authenticator.

    +

    In this case, mutual authentication will be tried. That means that the server will authenticate to the client. Using mutual authentication is required to avoid man-in-the-middle attacks, since it enables the user to verify that they are talking to the right server (a server that knows the key).

    +

    If you are using a non-blocking socket you will need to do all work of krb5_sendauth() yourself. Basically you need to send over the authenticator from krb5_mk_req() and, in case of mutual authentication, verifying the result from the server with krb5_rd_rep().

    +
    status = krb5_sendauth (context,
    +
    &auth_context,
    +
    &sock,
    +
    VERSION,
    +
    NULL,
    +
    server,
    +
    AP_OPTS_MUTUAL_REQUIRED,
    +
    NULL,
    +
    NULL,
    +
    NULL,
    +
    NULL,
    +
    NULL,
    +
    NULL);
    +
    if (status)
    +
    krb5_err (context, 1, status, "krb5_sendauth");
    +

    Once authentication has been performed, it is time to send some data. First we create a krb5_data structure, then we sign it with krb5_mk_safe() using the auth_context that contains the session-key that was exchanged in the krb5_sendauth()/krb5_recvauth() authentication sequence.

    +
    data.data = "hej";
    +
    data.length = 3;
    +
    +
    krb5_data_zero (&packet);
    +
    +
    status = krb5_mk_safe (context,
    +
    auth_context,
    +
    &data,
    +
    &packet,
    +
    NULL);
    +
    if (status)
    +
    krb5_err (context, 1, status, "krb5_mk_safe");
    +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_zero(krb5_data *p)
    Definition: data.c:45
    +

    And send it over the network.

    +
    len = packet.length;
    +
    net_len = htonl(len);
    +
    +
    if (krb5_net_write (context, &sock, &net_len, 4) != 4)
    +
    err (1, "krb5_net_write");
    +
    if (krb5_net_write (context, &sock, packet.data, len) != len)
    +
    err (1, "krb5_net_write");
    +

    To send encrypted (and signed) data krb5_mk_priv() should be used instead. krb5_mk_priv() works the same way as krb5_mk_safe(), with the exception that it encrypts the data in addition to signing it.

    +
    data.data = "hemligt";
    +
    data.length = 7;
    +
    +
    krb5_data_free (&packet);
    +
    +
    status = krb5_mk_priv (context,
    +
    auth_context,
    +
    &data,
    +
    &packet,
    +
    NULL);
    +
    if (status)
    +
    krb5_err (context, 1, status, "krb5_mk_priv");
    +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_free(krb5_data *p)
    Definition: data.c:63
    +

    And send it over the network.

    +
    len = packet.length;
    +
    net_len = htonl(len);
    +
    +
    if (krb5_net_write (context, &sock, &net_len, 4) != 4)
    +
    err (1, "krb5_net_write");
    +
    if (krb5_net_write (context, &sock, packet.data, len) != len)
    +
    err (1, "krb5_net_write");
    +

    The server is using krb5_rd_safe() and krb5_rd_priv() to verify the signature and decrypt the packet.

    +

    +Validating a password in an application

    +

    See the manual page for krb5_verify_user().

    +

    +API differences to MIT Kerberos

    +

    This section is somewhat disorganised, but so far there is no overall structure to the differences, though some of the have their root in that Heimdal uses an ASN.1 compiler and MIT doesn't.

    +

    +Principal and realms

    +

    Heimdal stores the realm as a krb5_realm, that is a char *. MIT Kerberos uses a krb5_data to store a realm.

    +

    In Heimdal krb5_principal doesn't contain the component name_type; it's instead stored in component name.name_type. To get and set the nametype in Heimdal, use krb5_principal_get_type() and krb5_principal_set_type().

    +

    For more information about principal and realms, see krb5_principal.

    +

    +Error messages

    +

    To get the error string, Heimdal uses krb5_get_error_message(). This is to return custom error messages (like Can't find host/datan.example.com\@CODE.COM in /etc/krb5.conf.'' instead of aKey table entry not found'' that error_message returns.

    +

    Heimdal uses a threadsafe(r) version of the com_err interface; the global com_err table isn't initialised. Then error_message returns quite a boring error string (just the error code itself).

    +
    +
    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/krb5_keytab_intro.html b/crypto/heimdal/doc/doxyout/krb5/html/krb5_keytab_intro.html --- a/crypto/heimdal/doc/doxyout/krb5/html/krb5_keytab_intro.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/krb5_keytab_intro.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: The keytab handing functions +The keytab handing functions @@ -8,75 +8,88 @@ keyhole logo

    - - + + + + + + +
    +
    +
    The keytab handing functions
    +
    -

    The keytab handing functions

    -Kerberos Keytabs

    -See the library functions here: Heimdal Kerberos 5 keytab handling functions

    -Keytabs are long term key storage for servers, their equvalment of password files.

    -Normally the only function that useful for server are to specify what keytab to use to other core functions like krb5_rd_req() krb5_kt_resolve(), and krb5_kt_close().

    -Keytab names

    -A keytab name is on the form type:residual. The residual part is specific to each keytab-type.

    -When a keytab-name is resolved, the type is matched with an internal list of keytab types. If there is no matching keytab type, the default keytab is used. The current default type is FILE.

    -The default value can be changed in the configuration file /etc/krb5.conf by setting the variable [defaults]default_keytab_name.

    -The keytab types that are implemented in Heimdal are:

      -
    • file store the keytab in a file, the type's name is FILE . The residual part is a filename. For compatibility with other Kerberos implemtation WRFILE and JAVA14 is also accepted. WRFILE has the same format as FILE. JAVA14 have a format that is compatible with older versions of MIT kerberos and SUN's Java based installation. They store a truncted kvno, so when the knvo excess 255, they are truncted in this format.
    -

    -

      -
    • keytab store the keytab in a AFS keyfile (usually /usr/afs/etc/KeyFile ), the type's name is AFSKEYFILE. The residual part is a filename.
    -

    -

      -
    • memory The keytab is stored in a memory segment. This allows sensitive and/or temporary data not to be stored on disk. The type's name is MEMORY. Each MEMORY keytab is referenced counted by and opened by the residual name, so two handles can point to the same memory area. When the last user closes using krb5_kt_close() the keytab, the keys in they keytab is memset() to zero and freed and can no longer be looked up by name.
    -

    -Keytab example

    -This is a minimalistic version of ktutil.

    -

    int
    -main (int argc, char **argv)
    -{
    -    krb5_context context;
    -    krb5_keytab keytab;
    -    krb5_kt_cursor cursor;
    -    krb5_keytab_entry entry;
    -    krb5_error_code ret;
    -    char *principal;
    -
    -    if (krb5_init_context (&context) != 0)
    -        errx(1, "krb5_context");
    -
    -    ret = krb5_kt_default (context, &keytab);
    -    if (ret)
    -        krb5_err(context, 1, ret, "krb5_kt_default");
    -
    -    ret = krb5_kt_start_seq_get(context, keytab, &cursor);
    -    if (ret)
    -        krb5_err(context, 1, ret, "krb5_kt_start_seq_get");
    -    while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0){
    -        krb5_unparse_name(context, entry.principal, &principal);
    -        printf("principal: %s\n", principal);
    -        free(principal);
    -        krb5_kt_free_entry(context, &entry);
    -    }
    -    ret = krb5_kt_end_seq_get(context, keytab, &cursor);
    -    if (ret)
    -        krb5_err(context, 1, ret, "krb5_kt_end_seq_get");
    -    ret = krb5_kt_close(context, keytab);
    -    if (ret)
    -        krb5_err(context, 1, ret, "krb5_kt_close");
    -    krb5_free_context(context);
    -    return 0;
    -}
    -
    +

    +Kerberos Keytabs

    +

    See the library functions here: Heimdal Kerberos 5 keytab handling functions

    +

    Keytabs are long term key storage for servers, their equvalment of password files.

    +

    Normally the only function that useful for server are to specify what keytab to use to other core functions like krb5_rd_req() krb5_kt_resolve(), and krb5_kt_close().

    +

    +Keytab names

    +

    A keytab name is on the form type:residual. The residual part is specific to each keytab-type.

    +

    When a keytab-name is resolved, the type is matched with an internal list of keytab types. If there is no matching keytab type, the default keytab is used. The current default type is FILE.

    +

    The default value can be changed in the configuration file /etc/krb5.conf by setting the variable [defaults]default_keytab_name.

    +

    The keytab types that are implemented in Heimdal are:

      +
    • file store the keytab in a file, the type's name is FILE . The residual part is a filename. For compatibility with other Kerberos implemtation WRFILE and JAVA14 is also accepted. WRFILE has the same format as FILE. JAVA14 have a format that is compatible with older versions of MIT kerberos and SUN's Java based installation. They store a truncted kvno, so when the knvo excess 255, they are truncted in this format.
    • +
    • keytab store the keytab in a AFS keyfile (usually /usr/afs/etc/KeyFile ), the type's name is AFSKEYFILE. The residual part is a filename.
    • +
    • memory The keytab is stored in a memory segment. This allows sensitive and/or temporary data not to be stored on disk. The type's name is MEMORY. Each MEMORY keytab is referenced counted by and opened by the residual name, so two handles can point to the same memory area. When the last user closes using krb5_kt_close() the keytab, the keys in they keytab is memset() to zero and freed and can no longer be looked up by name.
    • +
    +

    +Keytab example

    +

    This is a minimalistic version of ktutil.

    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    krb5_context context;
    +
    krb5_keytab keytab;
    +
    krb5_kt_cursor cursor;
    +
    krb5_keytab_entry entry;
    +
    krb5_error_code ret;
    +
    char *principal;
    +
    +
    if (krb5_init_context (&context) != 0)
    +
    errx(1, "krb5_context");
    +
    +
    ret = krb5_kt_default (context, &keytab);
    +
    if (ret)
    +
    krb5_err(context, 1, ret, "krb5_kt_default");
    +
    +
    ret = krb5_kt_start_seq_get(context, keytab, &cursor);
    +
    if (ret)
    +
    krb5_err(context, 1, ret, "krb5_kt_start_seq_get");
    +
    while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0){
    +
    krb5_unparse_name(context, entry.principal, &principal);
    +
    printf("principal: %s\n", principal);
    +
    free(principal);
    +
    krb5_kt_free_entry(context, &entry);
    +
    }
    +
    ret = krb5_kt_end_seq_get(context, keytab, &cursor);
    +
    if (ret)
    +
    krb5_err(context, 1, ret, "krb5_kt_end_seq_get");
    +
    ret = krb5_kt_close(context, keytab);
    +
    if (ret)
    +
    krb5_err(context, 1, ret, "krb5_kt_close");
    + +
    return 0;
    +
    }
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err(krb5_context context, int eval, krb5_error_code code, const char *fmt,...) __attribute__((__noreturn__
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_end_seq_get(krb5_context context, krb5_keytab id, krb5_kt_cursor *cursor)
    Definition: keytab.c:847
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_start_seq_get(krb5_context context, krb5_keytab id, krb5_kt_cursor *cursor)
    Definition: keytab.c:790
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_close(krb5_context context, krb5_keytab id)
    Definition: keytab.c:484
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_free_entry(krb5_context context, krb5_keytab_entry *entry)
    Definition: keytab.c:768
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_next_entry(krb5_context context, krb5_keytab id, krb5_keytab_entry *entry, krb5_kt_cursor *cursor)
    Definition: keytab.c:819
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default(krb5_context context, krb5_keytab *id)
    Definition: keytab.c:333
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name(krb5_context context, krb5_const_principal principal, char **name)
    Definition: principal.c:608
    +
    KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context(krb5_context *context)
    Definition: context.c:417
    +
    KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context(krb5_context context)
    Definition: context.c:615
    +
    +
    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/krb5_principal_intro.html b/crypto/heimdal/doc/doxyout/krb5/html/krb5_principal_intro.html --- a/crypto/heimdal/doc/doxyout/krb5/html/krb5_principal_intro.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/krb5_principal_intro.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: The principal handing functions. +The principal handing functions. @@ -8,25 +8,29 @@ keyhole logo

    - - + + + + + + +
    +
    +
    The principal handing functions.
    +
    -

    The principal handing functions.

    A Kerberos principal is a email address looking string that contains to parts separeted by a @. The later part is the kerbero realm the principal belongs to and the former is a list of 0 or more components. For example
    -lha@SU.SE
    +

    A Kerberos principal is a email address looking string that contains two parts separated by . The second part is the kerberos realm the principal belongs to and the first is a list of 0 or more components. For example

    lha@SU.SE
     host/hummel.it.su.se@SU.SE
     host/admin@H5L.ORG
    -

    -See the library functions here: Heimdal Kerberos 5 principal functions

    +

    See the library functions here: Heimdal Kerberos 5 principal functions

    +
    +
    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/menu.js b/crypto/heimdal/doc/doxyout/krb5/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/krb5/html/menudata.js b/crypto/heimdal/doc/doxyout/krb5/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/menudata.js @@ -0,0 +1,30 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Modules",url:"modules.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}]}]} diff --git a/crypto/heimdal/doc/doxyout/krb5/html/modules.html b/crypto/heimdal/doc/doxyout/krb5/html/modules.html --- a/crypto/heimdal/doc/doxyout/krb5/html/modules.html +++ b/crypto/heimdal/doc/doxyout/krb5/html/modules.html @@ -1,6 +1,6 @@ -HeimdalKerberos5library: Module Index +Modules @@ -8,38 +8,44 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Modules
    +
    +
    Here is a list of all modules:
    +
    -Generated on Wed Jan 11 14:07:50 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/nav_f.png b/crypto/heimdal/doc/doxyout/krb5/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM -HeimdalKerberos5library: Page Index +Related Pages @@ -8,34 +8,34 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Related Pages
    +
    +
    Here is a list of all related documentation pages:
    +
    -Generated on Wed Jan 11 14:07:47 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/splitbar.png b/crypto/heimdal/doc/doxyout/krb5/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zc%17D@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@ -HeimdalKerberos5library: krb5_crypto_iov Struct Reference +krb5_crypto_iov Struct Reference @@ -8,33 +8,31 @@ keyhole logo

    - - + + + + + + +
    +
    +
    krb5_crypto_iov Struct Reference
    +
    -

    krb5_crypto_iov Struct Reference

    #include <krb5.h> -

    - - -
    -


    Detailed Description

    -Semi private, not stable yet
    The documentation for this struct was generated from the following file:
      -
    • /Users/lha/src/heimdal/heimdal-release/heimdal-1.5.2/lib/krb5/krb5.h
    -
    + +

    #include <krb5.h>

    +

    Detailed Description

    +

    Semi private, not stable yet

    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/krb5/krb5.h
    • +
    +
    -Generated on Wed Jan 11 14:07:50 2012 for HeimdalKerberos5library by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__an2ln__ftable__desc.html b/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__an2ln__ftable__desc.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__an2ln__ftable__desc.html @@ -0,0 +1,62 @@ + + +krb5plugin_an2ln_ftable_desc Struct Reference + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    krb5plugin_an2ln_ftable_desc Struct Reference
    +
    +
    + +

    Description of the krb5_aname_to_lname(3) plugin facility. + More...

    + +

    #include <an2ln_plugin.h>

    +

    Detailed Description

    +

    Description of the krb5_aname_to_lname(3) plugin facility.

    +

    The krb5_aname_to_lname(3) function is pluggable. The plugin is named KRB5_PLUGIN_AN2LN ("an2ln"), with a single minor version, KRB5_PLUGIN_AN2LN_VERSION_0 (0).

    +

    The plugin for krb5_aname_to_lname(3) consists of a data symbol referencing a structure of type krb5plugin_an2ln_ftable, with four fields:

    +
    Parameters
    + + + + + +
    initPlugin initialization function (see krb5-plugin(7))
    minor_versionThe plugin minor version number (0)
    finiPlugin finalization function
    an2lnPlugin aname_to_lname function
    +
    +
    +

    The an2ln field is the plugin entry point that performs the traditional aname_to_lname operation however the plugin desires. It is invoked in no particular order relative to other an2ln plugins, but it has a 'rule' argument that indicates which plugin is intended to act on the rule. The plugin an2ln function must return KRB5_PLUGIN_NO_HANDLE if the rule is not applicable to it.

    +

    The plugin an2ln function has the following arguments, in this order:

    +
      +
    1. plug_ctx, the context value output by the plugin's init function
    2. +
    3. context, a krb5_context
    4. +
    5. rule, the aname_to_lname rule being evaluated (from krb5.conf(5))
    6. +
    7. aname, the krb5_principal to be mapped to an lname
    8. +
    9. set_res_f, a function the plugin must call to set its result
    10. +
    11. set_res_ctx, the first argument to set_res_f (the second is the result lname string)
    12. +
    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/krb5/an2ln_plugin.h
    • +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__db__ftable__desc.html b/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__db__ftable__desc.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__db__ftable__desc.html @@ -0,0 +1,52 @@ + + +krb5plugin_db_ftable_desc Struct Reference + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    krb5plugin_db_ftable_desc Struct Reference
    +
    +
    + +

    Description of the krb5 DB plugin facility. + More...

    + +

    #include <db_plugin.h>

    +

    Detailed Description

    +

    Description of the krb5 DB plugin facility.

    +

    The krb5_aname_to_lname(3) function's DB rule is pluggable. The plugin is named KRB5_PLUGIN_DB ("krb5_db_plug"), with a single minor version, KRB5_PLUGIN_DB_VERSION_0 (0).

    +

    The plugin consists of a data symbol referencing a structure of type krb5plugin_db_ftable_desc, with three fields:

    +
    Parameters
    + + + + +
    initPlugin initialization function (see krb5-plugin(7))
    minor_versionThe plugin minor version number (0)
    finiPlugin finalization function
    +
    +
    +

    The init entry point is expected to call heim_db_register(). The fini entry point is expected to do nothing.

    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/krb5/db_plugin.h
    • +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__kuserok__ftable__desc.html b/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__kuserok__ftable__desc.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/html/structkrb5plugin__kuserok__ftable__desc.html @@ -0,0 +1,64 @@ + + +krb5plugin_kuserok_ftable_desc Struct Reference + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    krb5plugin_kuserok_ftable_desc Struct Reference
    +
    +
    + +

    Description of the krb5_kuserok(3) plugin facility. + More...

    + +

    #include <kuserok_plugin.h>

    +

    Detailed Description

    +

    Description of the krb5_kuserok(3) plugin facility.

    +

    The krb5_kuserok(3) function is pluggable. The plugin is named KRB5_PLUGIN_KUSEROK ("krb5_plugin_kuserok"), with a single minor version, KRB5_PLUGIN_KUSEROK_VERSION_0 (0).

    +

    The plugin for krb5_kuserok(3) consists of a data symbol referencing a structure of type krb5plugin_kuserok_ftable, with four fields:

    +
    Parameters
    + + + + + +
    initPlugin initialization function (see krb5-plugin(7))
    minor_versionThe plugin minor version number (0)
    finiPlugin finalization function
    kuserokPlugin kuserok function
    +
    +
    +

    The kuserok field is the plugin entry point that performs the traditional kuserok operation however the plugin desires. It is invoked in no particular order relative to other kuserok plugins, but it has a 'rule' argument that indicates which plugin is intended to act on the rule. The plugin kuserok function must return KRB5_PLUGIN_NO_HANDLE if the rule is not applicable to it.

    +

    The plugin kuserok function has the following arguments, in this order:

    +
      +
    1. plug_ctx, the context value output by the plugin's init function
    2. +
    3. context, a krb5_context
    4. +
    5. rule, the kuserok rule being evaluated (from krb5.conf(5))
    6. +
    7. flags
    8. +
    9. k5login_dir, configured location of k5login per-user files if any
    10. +
    11. luser, name of the local user account to which principal is attempting to access.
    12. +
    13. principal, the krb5_principal trying to access the luser account
    14. +
    15. result, a krb5_boolean pointer where the plugin will output its result
    16. +
    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/krb5/kuserok_plugin.h
    • +
    +
    +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal Kerberos 5 library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/krb5/html/sync_off.png b/crypto/heimdal/doc/doxyout/krb5/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zc$@)M1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@IeJfk6j|89*WoOiV6}4AuZ}83fn> diff --git a/crypto/heimdal/doc/doxyout/krb5/html/tab_b.png b/crypto/heimdal/doc/doxyout/krb5/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zc%17D@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLnZT`}F1e&(Gg}Y(8=I;HA5#Z$3JI=gGB)FQ#odI(O&E^@q;x zK6mr*m3xOS-#u~t!I@i+u0DKm^U160k6t`|^WpV}&n+8{U%dD9&a>B#U%!9-@yol< zU%&tQ{rk_K|NsC0`}dE5ET97-Kz?Ch`|mI9rna83hMm2xP=jBIMDsOm+zXwzZmG~R;R#)lv4Bfe&~f#I#c>DyWWAHt+!RY)&KI$b@p(kMyG{*;gWDg zyeL|eZf{dHNYmXyDSufzJVRAfbRbM z_*_M>zpHsROHdQR3?hv$<0IX%BTMTIQLHdEZ*?slZQZ-a-^YJQNK8tGr=+HRM11<3 zo{{+_EBk9sZeBjZL|x8!pRcJ2s=NY?!Qv{bs%vWN>hT03siCo{xuvzOy-r=-Snb$B z?S14fR(DTt-;e$Q_TbR)$mkenoIAnePfkq_7XuAcR5Uc?mRD9q;x&o%-_l$EW|sjJ z{-+DZ<+sKvX|B4wF*u;08G8l%6i9bd*wA*qNg5kf3|1s)&jJdZBL4{?_s4 zg^@i>zqP7_nSCZ?Zj@SG>LE)9>a^{sggJH>f)OUSXf?>bQqMw24x|>3dW}h}6|!;n>A7yCx`h#Zh>*i1 z)h~^=#O~H}*Oj*K)PsD|Z^aNqGu?$QdG3wGHQ`{j|9Dp;NxH;sPt@~hItSG}k#_vH zd3EEKbeT`j^Js4RwY4r1jpt0WZ;#4CE)B8hFgxrEF4W06!-Y@Kfv+ zjVDtbwVq6-fsK%pA6>0yClQ`b##5jEGD6-=u=PexrQd|kPG#JQGoH@8;rrpJ@`DoO zbXGv!>~wbU_G7>FzXzVo|uPS#Gzx|3a<5cj7|bC=?l3&y5>F!b21M7YUc6 z5@n0T`PH%@(sI^TP=oln?X$*p_gBxFex4*fYX+!oJ!{z^vY-~sU$j^V&Aw!3W|ex`BhU(d_4fG}12^oLFW4^8s*;|2 zDd$6n{A5YcVOuOy!VGFYA2Rx!S^)3;!!d&1g{zIr{YmG%qEJGlyk`Z7s@FqkqP*JfbHg<0;|Wn-*QsGWeDr;K;ESxhoi$VuP-{ zW*K4UNnFUDNPU3;u(jthE~bQ}ujp0Us#=AKJrsFR$pJ|E?IRA#PaINK&TQM~q!MZV zV6V#kGbc5BJ#T;-?xF(9+Wn?*?;ZJv)zjA656>avor==c5kOPJla=o7kpStU)k@1NyDq-JO)A5XA^RNT7>%>X9SZ=Z9`%8>_I-=yJ zNU8!jnBiw5`qDlBaJN!0q%t11<29wkx}M4miV$UURZ7onSpwu!+m0IGr_ZpdT~MMZ zXE~|#9M!Yy@}1SAY(v-uDU}tqDar$=mf7!ubjRq3^OfAn{?Mj%$JvO#sVA2?9=qY` z;-tTGpuy;bHLV98AuiNcMS`6nSMDk4%S&BntXQqR=|pj{%rY72`UujOm32fO_)zHr z_CsIprnuBz73KLJ@}od!tqkmjx{^WrQDU=(^h`$mRSM}x8Ce~)J^JQqJ*^)Tu~vRZ zwftHq#JjxBp)|4Q>2)@3ppLkP4o)t=8J%#oCbgv`oLTNGrLmhf*Rb6!PmB#?9 z08vtl+lMwW9P!fd6xZRI=%6tA2xn7L-_j8%r+*xv@s@|DxM7}W&_}0jq=fE2F?N+_ zS#vj}#6czo+I$waXb?jjQN@OLx^PzSWqj#zm0=^;bl-~w^^MEP*vOgRDdsEu{ZPEg^%atonVz(%{<6@S8+?}@Tt;#``Z;!d&{RP3d?eDUDWl=G)=ha}Q z?lvyoIg+l9SpN>xD*oWb;AuHL?=Xi~Cdn!D4~(pnp%o|KVT}9MbNEhs&PqzG>w^Po z1Pa)FB@MxN@S6qU--DMCg{}{kJP5RF@Zj|NNZ#>~4f?OOlbM~aw@)B87zKFL%!i9oa>*IZp)fN6rN+6bLFHkVh$~ zuaLt)dL8`k^By`d6mVe;4H_0cShN{@VJxY%8=fC>vdyGpBtBJ*3+PDOQ6FO|A*E^& esvXLqH-=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5.3 @@ -1,9 +1,13 @@ -.TH "Heimdal Kerberos 5 library" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME krb5 \- Heimdal Kerberos 5 library .SH SYNOPSIS +.br +.PP +.SS "Functions" + .in +1c .ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_add_et_list\fP (krb5_context context, void(*func)(struct et_list **))" @@ -147,6 +151,9 @@ .RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_data_ct_cmp\fP (const krb5_data *data1, const krb5_data *data2)" .br .ti -1c +.RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_get_err_text\fP (krb5_context context, krb5_error_code code) KRB5_DEPRECATED_FUNCTION('Use \fBkrb5_get_error_message\fP instead')" +.br +.ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_krbhst_get_addrinfo\fP (krb5_context context, krb5_krbhst_info *host, struct addrinfo **ai)" .br .ti -1c @@ -177,196 +184,186 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_et_list (krb5_context context, void(*)(struct et_list **) func)" +Add a specified list of error messages to the et list in context\&. Call func (probably a comerr-generated function) with a pointer to the current et_list\&. .PP -Add a specified list of error messages to the et list in context. Call func (probably a comerr-generated function) with a pointer to the current et_list. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A kerberos context. +\fIcontext\fP A kerberos context\&. .br -\fIfunc\fP The generated com_err et function. +\fIfunc\fP The generated com_err et function\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_extra_addresses (krb5_context context, krb5_addresses * addresses)" +Add extra address to the address list that the library will add to the client's address list when communicating with the KDC\&. .PP -Add extra address to the address list that the library will add to the client's address list when communicating with the KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIaddresses\fP addreses to add .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_ignore_addresses (krb5_context context, krb5_addresses * addresses)" +Add extra addresses to ignore when fetching addresses from the underlaying operating system\&. .PP -Add extra addresses to ignore when fetching addresses from the underlaying operating system. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIaddresses\fP addreses to ignore .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_compare_creds (krb5_context context, krb5_flags whichfields, const krb5_creds * mcreds, const krb5_creds * creds)" -.PP -Return TRUE if `mcreds' and `creds' are equal (`whichfields' determines what equal means). +Return TRUE if `mcreds' and `creds' are equal (`whichfields' determines what equal means)\&. .PP The following flags, set in whichfields affects the comparison: .IP "\(bu" 2 -KRB5_TC_MATCH_SRV_NAMEONLY Consider all realms equal when comparing the service principal. +KRB5_TC_MATCH_SRV_NAMEONLY Consider all realms equal when comparing the service principal\&. .IP "\(bu" 2 -KRB5_TC_MATCH_KEYTYPE Compare enctypes. +KRB5_TC_MATCH_KEYTYPE Compare enctypes\&. .IP "\(bu" 2 -KRB5_TC_MATCH_FLAGS_EXACT Make sure that the ticket flags are identical. +KRB5_TC_MATCH_FLAGS_EXACT Make sure that the ticket flags are identical\&. .IP "\(bu" 2 -KRB5_TC_MATCH_FLAGS Make sure that all ticket flags set in mcreds are also present in creds . +KRB5_TC_MATCH_FLAGS Make sure that all ticket flags set in mcreds are also present in creds \&. .IP "\(bu" 2 -KRB5_TC_MATCH_TIMES_EXACT Compares the ticket times exactly. +KRB5_TC_MATCH_TIMES_EXACT Compares the ticket times exactly\&. .IP "\(bu" 2 -KRB5_TC_MATCH_TIMES Compares only the expiration times of the creds. +KRB5_TC_MATCH_TIMES Compares only the expiration times of the creds\&. .IP "\(bu" 2 -KRB5_TC_MATCH_AUTHDATA Compares the authdata fields. +KRB5_TC_MATCH_AUTHDATA Compares the authdata fields\&. .IP "\(bu" 2 -KRB5_TC_MATCH_2ND_TKT Compares the second tickets (used by user-to-user authentication). +KRB5_TC_MATCH_2ND_TKT Compares the second tickets (used by user-to-user authentication)\&. .IP "\(bu" 2 -KRB5_TC_MATCH_IS_SKEY Compares the existance of the second ticket. +KRB5_TC_MATCH_IS_SKEY Compares the existance of the second ticket\&. .PP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIwhichfields\fP which fields to compare. +\fIwhichfields\fP which fields to compare\&. .br -\fImcreds\fP cred to compare with. +\fImcreds\fP cred to compare with\&. .br -\fIcreds\fP cred to compare with. +\fIcreds\fP cred to compare with\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -return TRUE if mcred and creds are equal, FALSE if not. +return TRUE if mcred and creds are equal, FALSE if not\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_context (krb5_context context, krb5_context * out)" +Make a copy for the Kerberos 5 context, the new krb5_context shoud be freed with \fBkrb5_free_context()\fP\&. .PP -Make a copy for the Kerberos 5 context, the new krb5_context shoud be freed with \fBkrb5_free_context()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP the Kerberos context to copy .br -\fIout\fP the copy of the Kerberos, set to NULL error. +\fIout\fP the copy of the Kerberos, set to NULL error\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds (krb5_context context, const krb5_creds * incred, krb5_creds ** outcred)" +Copy krb5_creds\&. .PP -Copy krb5_creds. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIincred\fP source credential .br -\fIoutcred\fP destination credential, free with \fBkrb5_free_creds()\fP. +\fIoutcred\fP destination credential, free with \fBkrb5_free_creds()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds_contents (krb5_context context, const krb5_creds * incred, krb5_creds * c)" +Copy content of krb5_creds\&. .PP -Copy content of krb5_creds. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIincred\fP source credential .br -\fIc\fP destination credential, free with \fBkrb5_free_cred_contents()\fP. +\fIc\fP destination credential, free with \fBkrb5_free_cred_contents()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_data (krb5_context context, const krb5_data * indata, krb5_data ** outdata)" +Copy the data into a newly allocated krb5_data\&. .PP -Copy the data into a newly allocated krb5_data. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIindata\fP the krb5_data data to copy .br -\fIoutdata\fP new krb5_date to copy too. Free with \fBkrb5_free_data()\fP. +\fIoutdata\fP new krb5_date to copy too\&. Free with \fBkrb5_free_data()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned. +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_host_realm (krb5_context context, const krb5_realm * from, krb5_realm ** to)" +Copy the list of realms from `from' to `to'\&. .PP -Copy the list of realms from `from' to `to'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIfrom\fP list of realms to copy from. +\fIfrom\fP list of realms to copy from\&. .br -\fIto\fP list of realms to copy to, free list of \fBkrb5_free_host_realm()\fP. +\fIto\fP list of realms to copy to, free list of \fBkrb5_free_host_realm()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_ticket (krb5_context context, const krb5_ticket * from, krb5_ticket ** to)" -.PP Copy ticket and content .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br @@ -375,594 +372,571 @@ \fIto\fP new copy of ticket, free with \fBkrb5_free_ticket()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_creds_get_ticket_flags (krb5_creds * creds)" +Returns the ticket flags for the credentials in creds\&. See also \fBkrb5_ticket_get_flags()\fP\&. .PP -Returns the ticket flags for the credentials in creds. See also \fBkrb5_ticket_get_flags()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcreds\fP credential to get ticket flags from .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 ticket flags .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_alloc (krb5_data * p, int len)" +Allocate data of and krb5_data\&. .PP -Allocate data of and krb5_data. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP krb5_data to allocate. +\fIp\fP krb5_data to allocate\&. .br -\fIlen\fP size to allocate. +\fIlen\fP size to allocate\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned. +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned\&. .RE .PP .SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_cmp (const krb5_data * data1, const krb5_data * data2)" +Compare to data\&. .PP -Compare to data. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata1\fP krb5_data to compare .br \fIdata2\fP krb5_data to compare .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -return the same way as memcmp(), useful when sorting. +return the same way as memcmp(), useful when sorting\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_copy (krb5_data * p, const void * data, size_t len)" +Copy the data of len into the krb5_data\&. .PP -Copy the data of len into the krb5_data. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP krb5_data to copy into. +\fIp\fP krb5_data to copy into\&. .br -\fIdata\fP data to copy.. +\fIdata\fP data to copy\&.\&. .br -\fIlen\fP new size. +\fIlen\fP new size\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned. +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned\&. .RE .PP .SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_ct_cmp (const krb5_data * data1, const krb5_data * data2)" -.PP Compare to data not exposing timing information from the checksum data .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata1\fP krb5_data to compare .br \fIdata2\fP krb5_data to compare .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -returns zero for same data, otherwise non zero. +returns zero for same data, otherwise non zero\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_free (krb5_data * p)" +Free the content of krb5_data structure, its ok to free a zeroed structure (with memset() or \fBkrb5_data_zero()\fP)\&. When done, the structure will be zeroed\&. The same function is called \fBkrb5_free_data_contents()\fP in MIT Kerberos\&. .PP -Free the content of krb5_data structure, its ok to free a zeroed structure (with memset() or \fBkrb5_data_zero()\fP). When done, the structure will be zeroed. The same function is called \fBkrb5_free_data_contents()\fP in MIT Kerberos. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP krb5_data to free. +\fIp\fP krb5_data to free\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_realloc (krb5_data * p, int len)" +Grow (or shrink) the content of krb5_data to a new size\&. .PP -Grow (or shrink) the content of krb5_data to a new size. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP krb5_data to free. +\fIp\fP krb5_data to free\&. .br -\fIlen\fP new size. +\fIlen\fP new size\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned. +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_zero (krb5_data * p)" +Reset the (potentially uninitalized) krb5_data structure\&. .PP -Reset the (potentially uninitalized) krb5_data structure. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIp\fP krb5_data to reset. +\fIp\fP krb5_data to reset\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_config_files (char ** filenames)" +Free a list of configuration files\&. .PP -Free a list of configuration files. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIfilenames\fP list, terminated with a NULL pointer, to be freed. NULL is an valid argument. +\fIfilenames\fP list, terminated with a NULL pointer, to be freed\&. NULL is an valid argument\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context (krb5_context context)" +Frees the krb5_context allocated by \fBkrb5_init_context()\fP\&. .PP -Frees the krb5_context allocated by \fBkrb5_init_context()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP context to be freed. +\fIcontext\fP context to be freed\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_cred_contents (krb5_context context, krb5_creds * c)" +Free content of krb5_creds\&. .PP -Free content of krb5_creds. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIc\fP krb5_creds to free. +\fIc\fP krb5_creds to free\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds (krb5_context context, krb5_creds * c)" +Free krb5_creds\&. .PP -Free krb5_creds. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIc\fP krb5_creds to free. +\fIc\fP krb5_creds to free\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data (krb5_context context, krb5_data * p)" +Free krb5_data (and its content)\&. .PP -Free krb5_data (and its content). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIp\fP krb5_data to free. +\fIp\fP krb5_data to free\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_ticket (krb5_context context, krb5_ticket * ticket)" -.PP Free ticket and content .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br \fIticket\fP ticket to free .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_config_files (char *** pfilenames)" +Get the global configuration list\&. .PP -Get the global configuration list. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIpfilenames\fP return array of filenames, should be freed with \fBkrb5_free_config_files()\fP. +\fIpfilenames\fP return array of filenames, should be freed with \fBkrb5_free_config_files()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_in_tkt_etypes (krb5_context context, krb5_pdu pdu_type, krb5_enctype ** etypes)" +Get the default encryption types that will be use in communcation with the KDC, clients and servers\&. .PP -Get the default encryption types that will be use in communcation with the KDC, clients and servers. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. +.br +\fIpdu_type\fP request type (AS, TGS or none) .br \fIetypes\fP Encryption types, array terminated with ETYPE_NULL(0), caller should free array with krb5_xfree(): .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_dns_canonicalize_hostname (krb5_context context)" +Get if the library uses DNS to canonicalize hostnames\&. .PP -Get if the library uses DNS to canonicalize hostnames. +\fBParameters\fP +.RS 4 +\fIcontext\fP Kerberos 5 context\&. +.RE .PP -\fBParameters:\fP +\fBReturns\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +return non zero if the library uses DNS to canonicalize hostnames\&. .RE .PP -\fBReturns:\fP + +.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_get_err_text (krb5_context context, krb5_error_code code)" +Return the error string for the error code\&. The caller must not free the string\&. +.PP +This function is deprecated since its not threadsafe\&. +.PP +\fBParameters\fP .RS 4 -return non zero if the library uses DNS to canonicalize hostnames. +\fIcontext\fP Kerberos 5 context\&. +.br +\fIcode\fP Kerberos error code\&. +.RE +.PP +\fBReturns\fP +.RS 4 +the error message matching code .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_extra_addresses (krb5_context context, krb5_addresses * addresses)" +Get extra address to the address list that the library will add to the client's address list when communicating with the KDC\&. .PP -Get extra address to the address list that the library will add to the client's address list when communicating with the KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIaddresses\fP addreses to set .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_fcache_version (krb5_context context, int * version)" +Get version of fcache that the library should use\&. .PP -Get version of fcache that the library should use. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIversion\fP version number. +\fIversion\fP version number\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_ignore_addresses (krb5_context context, krb5_addresses * addresses)" +Get extra addresses to ignore when fetching addresses from the underlaying operating system\&. .PP -Get extra addresses to ignore when fetching addresses from the underlaying operating system. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIaddresses\fP list addreses ignored .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_kdc_sec_offset (krb5_context context, int32_t * sec, int32_t * usec)" +Get current offset in time to the KDC\&. .PP -Get current offset in time to the KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIsec\fP seconds part of offset. +\fIsec\fP seconds part of offset\&. .br -\fIusec\fP micro seconds part of offset. +\fIusec\fP micro seconds part of offset\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns zero .RE .PP .SS "KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_get_max_time_skew (krb5_context context)" +Get max time skew allowed\&. .PP -Get max time skew allowed. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -timeskew in seconds. +timeskew in seconds\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_use_admin_kdc (krb5_context context)" +Make the kerberos library default to the admin KDC\&. .PP -Make the kerberos library default to the admin KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -boolean flag to telling the context will use admin KDC as the default KDC. +boolean flag to telling the context will use admin KDC as the default KDC\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context (krb5_context * context)" +Initializes the context structure and reads the configuration file /etc/krb5\&.conf\&. The structure should be freed by calling \fBkrb5_free_context()\fP when it is no longer being used\&. .PP -Initializes the context structure and reads the configuration file /etc/krb5.conf. The structure should be freed by calling \fBkrb5_free_context()\fP when it is no longer being used. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP pointer to returned context .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an errno code is returned. Failure means either that something bad happened during initialization (typically ENOMEM) or that Kerberos should not be used ENXIO. +Returns 0 to indicate success\&. Otherwise an errno code is returned\&. Failure means either that something bad happened during initialization (typically ENOMEM) or that Kerberos should not be used ENXIO\&. If the function returns HEIM_ERR_RANDOM_OFFLINE, the random source is not available and later Kerberos calls might fail\&. .RE .PP - -.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_ets (krb5_context context)" +\fBkrb5_init_context()\fP will get one random byte to make sure our random is alive\&. Assumption is that once the non blocking source allows us to pull bytes, its all seeded and allows us to pull more bytes\&. .PP -Init the built-in ets in the Kerberos library. +Most Kerberos users calls \fBkrb5_init_context()\fP, so this is useful point where we can do the checking\&. +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_ets (krb5_context context)" +Init the built-in ets in the Kerberos library\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP kerberos context to add the ets too .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_thread_safe (void)" +Runtime check if the Kerberos library was complied with thread support\&. .PP -Runtime check if the Kerberos library was complied with thread support. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -TRUE if the library was compiled with thread support, FALSE if not. +TRUE if the library was compiled with thread support, FALSE if not\&. .RE .PP .SS "KRB5_LIB_FUNCTION const krb5_enctype* KRB5_LIB_CALL krb5_kerberos_enctypes (krb5_context context)" +Returns the list of Kerberos encryption types sorted in order of most preferred to least preferred encryption type\&. Note that some encryption types might be disabled, so you need to check with \fBkrb5_enctype_valid()\fP before using the encryption type\&. .PP -Returns the list of Kerberos encryption types sorted in order of most preferred to least preferred encryption type. Note that some encryption types might be disabled, so you need to check with \fBkrb5_enctype_valid()\fP before using the encryption type. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -list of enctypes, terminated with ETYPE_NULL. Its a static array completed into the Kerberos library so the content doesn't need to be freed. +list of enctypes, terminated with ETYPE_NULL\&. Its a static array completed into the Kerberos library so the content doesn't need to be freed\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_krbhst_get_addrinfo (krb5_context context, krb5_krbhst_info * host, struct addrinfo ** ai)" +Return an `struct addrinfo *' for a KDC host\&. .PP -Return an `struct addrinfo *' for a KDC host. -.PP -Returns an the struct addrinfo in in that corresponds to the information in `host'. free:ing is handled by krb5_krbhst_free, so the returned ai must not be released. -.PP -First try this as an IP address, this allows us to add a dot at the end to stop using the search domains. -.PP -If the hostname contains a dot, assumes it's a FQDN and don't use search domains since that might be painfully slow when machine is disconnected from that network. +Returns an the struct addrinfo in in that corresponds to the information in `host'\&. free:ing is handled by krb5_krbhst_free, so the returned ai must not be released\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_prepend_config_files_default (const char * filelist, char *** pfilenames)" +Prepend the filename to the global configuration list\&. .PP -Prepend the filename to the global configuration list. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIfilelist\fP a filename to add to the default list of filename .br -\fIpfilenames\fP return array of filenames, should be freed with \fBkrb5_free_config_files()\fP. +\fIpfilenames\fP return array of filenames, should be freed with \fBkrb5_free_config_files()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_config_files (krb5_context context, char ** filenames)" +Reinit the context from a new set of filenames\&. .PP -Reinit the context from a new set of filenames. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP context to add configuration too. +\fIcontext\fP context to add configuration too\&. .br -\fIfilenames\fP array of filenames, end of list is indicated with a NULL filename. +\fIfilenames\fP array of filenames, end of list is indicated with a NULL filename\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_default_in_tkt_etypes (krb5_context context, const krb5_enctype * etypes)" +Set the default encryption types that will be use in communcation with the KDC, clients and servers\&. .PP -Set the default encryption types that will be use in communcation with the KDC, clients and servers. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIetypes\fP Encryption types, array terminated with ETYPE_NULL (0). +\fIetypes\fP Encryption types, array terminated with ETYPE_NULL (0)\&. A value of NULL resets the encryption types to the defaults set in the configuration file\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_dns_canonicalize_hostname (krb5_context context, krb5_boolean flag)" +Set if the library should use DNS to canonicalize hostnames\&. .PP -Set if the library should use DNS to canonicalize hostnames. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIflag\fP if its dns canonicalizion is used or not. +\fIflag\fP if its dns canonicalizion is used or not\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_extra_addresses (krb5_context context, const krb5_addresses * addresses)" +Set extra address to the address list that the library will add to the client's address list when communicating with the KDC\&. .PP -Set extra address to the address list that the library will add to the client's address list when communicating with the KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIaddresses\fP addreses to set .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_fcache_version (krb5_context context, int version)" +Set version of fcache that the library should use\&. .PP -Set version of fcache that the library should use. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIversion\fP version number. +\fIversion\fP version number\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_set_home_dir_access (krb5_context context, krb5_boolean allow)" +Enable and disable home directory access on either the global state or the krb5_context state\&. By calling \fBkrb5_set_home_dir_access()\fP with context set to NULL, the global state is configured otherwise the state for the krb5_context is modified\&. .PP -Enable and disable home directory access on either the global state or the krb5_context state. By calling \fBkrb5_set_home_dir_access()\fP with context set to NULL, the global state is configured otherwise the state for the krb5_context is modified. -.PP -For home directory access to be allowed, both the global state and the krb5_context state have to be allowed. +For home directory access to be allowed, both the global state and the krb5_context state have to be allowed\&. .PP -Administrator (root user), never uses the home directory. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context or NULL .br \fIallow\fP allow if TRUE home directory .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 the old value .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_ignore_addresses (krb5_context context, const krb5_addresses * addresses)" +Set extra addresses to ignore when fetching addresses from the underlaying operating system\&. .PP -Set extra addresses to ignore when fetching addresses from the underlaying operating system. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIaddresses\fP addreses to ignore .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_kdc_sec_offset (krb5_context context, int32_t sec, int32_t usec)" +Set current offset in time to the KDC\&. .PP -Set current offset in time to the KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIsec\fP seconds part of offset. +\fIsec\fP seconds part of offset\&. .br -\fIusec\fP micro seconds part of offset. +\fIusec\fP micro seconds part of offset\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns zero .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_max_time_skew (krb5_context context, time_t t)" +Set max time skew allowed\&. .PP -Set max time skew allowed. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIt\fP timeskew in seconds. +\fIt\fP timeskew in seconds\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_password (krb5_context context, krb5_creds * creds, const char * newpw, krb5_principal targprinc, int * result_code, krb5_data * result_code_string, krb5_data * result_string)" +Change password using creds\&. .PP -Change password using creds. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -970,59 +944,54 @@ .br \fInewpw\fP The new password to set .br -\fItargprinc\fP if unset, the default principal is used. +\fItargprinc\fP if unset, the default principal is used\&. .br -\fIresult_code\fP Result code, KRB5_KPASSWD_SUCCESS is when password is changed. +\fIresult_code\fP Result code, KRB5_KPASSWD_SUCCESS is when password is changed\&. .br -\fIresult_code_string\fP binary message from the server, contains at least the result_code. +\fIresult_code_string\fP binary message from the server, contains at least the result_code\&. .br -\fIresult_string\fP A message from the kpasswd service or the library in human printable form. The string is NUL terminated. +\fIresult_string\fP A message from the kpasswd service or the library in human printable form\&. The string is NUL terminated\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -On sucess and *result_code is KRB5_KPASSWD_SUCCESS, the password is changed. +On sucess and *result_code is KRB5_KPASSWD_SUCCESS, the password is changed\&. .RE .PP @ .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_real_time (krb5_context context, krb5_timestamp sec, int32_t usec)" +Set the absolute time that the caller knows the kdc has so the kerberos library can calculate the relative diffrence beteen the KDC time and local system time\&. .PP -Set the absolute time that the caller knows the kdc has so the kerberos library can calculate the relative diffrence beteen the KDC time and local system time. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Keberos 5 context. +\fIcontext\fP Keberos 5 context\&. .br \fIsec\fP The applications new of 'now' in seconds .br \fIusec\fP The applications new of 'now' in micro seconds .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Kerberos 5 error code, see krb5_get_error_message(). +Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP - -.PP -If the caller passes in a negative usec, its assumed to be unknown and the function will use the current time usec. +If the caller passes in a negative usec, its assumed to be unknown and the function will use the current time usec\&. .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_use_admin_kdc (krb5_context context, krb5_boolean flag)" +Make the kerberos library default to the admin KDC\&. .PP -Make the kerberos library default to the admin KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIflag\fP boolean flag to select if the use the admin KDC or not. +\fIflag\fP boolean flag to select if the use the admin KDC or not\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_authorization_data_type (krb5_context context, krb5_ticket * ticket, int type, krb5_data * data)" +Extract the authorization data type of type from the ticket\&. Store the field in data\&. This function is to use for kerberos applications\&. .PP -Extract the authorization data type of type from the ticket. Store the field in data. This function is to use for kerberos applications. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br @@ -1035,10 +1004,9 @@ .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_client (krb5_context context, const krb5_ticket * ticket, krb5_principal * client)" -.PP Return client principal in ticket .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br @@ -1047,34 +1015,32 @@ \fIclient\fP client principal, free with \fBkrb5_free_principal()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_ticket_get_endtime (krb5_context context, const krb5_ticket * ticket)" -.PP Return end time of ticket .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br \fIticket\fP ticket to copy .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 end time of ticket .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_server (krb5_context context, const krb5_ticket * ticket, krb5_principal * server)" -.PP Return server principal in ticket .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br @@ -1083,9 +1049,12 @@ \fIserver\fP server principal, free with \fBkrb5_free_principal()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_abort.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_abort.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_abort.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_abortx.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_abortx.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_abortx.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_address.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_address.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_address.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_address.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 address functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_address" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 address functions \- +krb5_address \- Heimdal Kerberos 5 address functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -73,10 +76,9 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_addr2sockaddr (krb5_context context, const krb5_address * addr, struct sockaddr * sa, krb5_socklen_t * sa_size, int port)" +krb5_addr2sockaddr sets the 'struct sockaddr sockaddr' from addr and port\&. The argument sa_size should initially contain the size of the sa and after the call, it will contain the actual length of the address\&. In case of the sa is too small to fit the whole address, the up to *sa_size will be stored, and then *sa_size will be set to the required length\&. .PP -krb5_addr2sockaddr sets the 'struct sockaddr sockaddr' from addr and port. The argument sa_size should initially contain the size of the sa and after the call, it will contain the actual length of the address. In case of the sa is too small to fit the whole address, the up to *sa_size will be stored, and then *sa_size will be set to the required length. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -84,22 +86,21 @@ .br \fIsa\fP the struct sockaddr that will be filled in .br -\fIsa_size\fP pointer to length of sa, and after the call, it will contain the actual length of the address. +\fIsa_size\fP pointer to length of sa, and after the call, it will contain the actual length of the address\&. .br -\fIport\fP set port in sa. +\fIport\fP set port in sa\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported. +Return an error code or 0\&. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_compare (krb5_context context, const krb5_address * addr1, const krb5_address * addr2)" +krb5_address_compare compares the addresses addr1 and addr2\&. Returns TRUE if the two addresses are the same\&. .PP -krb5_address_compare compares the addresses addr1 and addr2. Returns TRUE if the two addresses are the same. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -108,17 +109,16 @@ \fIaddr2\fP address to compare .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 Return an TRUE is the address are the same FALSE if not .RE .PP .SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_address_order (krb5_context context, const krb5_address * addr1, const krb5_address * addr2)" +krb5_address_order compares the addresses addr1 and addr2 so that it can be used for sorting addresses\&. If the addresses are the same address krb5_address_order will return 0\&. Behavies like memcmp(2)\&. .PP -krb5_address_order compares the addresses addr1 and addr2 so that it can be used for sorting addresses. If the addresses are the same address krb5_address_order will return 0. Behavies like memcmp(2). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -127,17 +127,16 @@ \fIaddr2\fP krb5_address to compare .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -< 0 if address addr1 in 'less' then addr2. 0 if addr1 and addr2 is the same address, > 0 if addr2 is 'less' then addr1. +< 0 if address addr1 in 'less' then addr2\&. 0 if addr1 and addr2 is the same address, > 0 if addr2 is 'less' then addr1\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_address_prefixlen_boundary (krb5_context context, const krb5_address * inaddr, unsigned long prefixlen, krb5_address * low, krb5_address * high)" +Calculate the boundary addresses of `inaddr'/`prefixlen' and store them in `low' and `high'\&. .PP -Calculate the boundary addresses of `inaddr'/`prefixlen' and store them in `low' and `high'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -150,36 +149,34 @@ \fIhigh\fP highest address .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_search (krb5_context context, const krb5_address * addr, const krb5_addresses * addrlist)" +krb5_address_search checks if the address addr is a member of the address set list addrlist \&. .PP -krb5_address_search checks if the address addr is a member of the address set list addrlist . -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIaddr\fP address to search for. +\fIaddr\fP address to search for\&. .br -\fIaddrlist\fP list of addresses to look in for addr. +\fIaddrlist\fP list of addresses to look in for addr\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_anyaddr (krb5_context context, int af, struct sockaddr * sa, krb5_socklen_t * sa_size, int port)" +krb5_anyaddr fills in a 'struct sockaddr sa' that can be used to bind(2) to\&. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address\&. .PP -krb5_anyaddr fills in a 'struct sockaddr sa' that can be used to bind(2) to. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -187,22 +184,21 @@ .br \fIsa\fP sockaddr .br -\fIsa_size\fP lenght of sa. +\fIsa_size\fP lenght of sa\&. .br -\fIport\fP for to fill into sa. +\fIport\fP for to fill into sa\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_append_addresses (krb5_context context, krb5_addresses * dest, const krb5_addresses * source)" +krb5_append_addresses adds the set of addresses in source to dest\&. While copying the addresses, duplicates are also sorted out\&. .PP -krb5_append_addresses adds the set of addresses in source to dest. While copying the addresses, duplicates are also sorted out. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -211,17 +207,16 @@ \fIsource\fP adresses that are going to be added to dest .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_address (krb5_context context, const krb5_address * inaddr, krb5_address * outaddr)" +krb5_copy_address copies the content of address inaddr to outaddr\&. .PP -krb5_copy_address copies the content of address inaddr to outaddr. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -230,17 +225,16 @@ \fIoutaddr\fP pointer to destination address .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_addresses (krb5_context context, const krb5_addresses * inaddr, krb5_addresses * outaddr)" +krb5_copy_addresses copies the content of addresses inaddr to outaddr\&. .PP -krb5_copy_addresses copies the content of addresses inaddr to outaddr. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -249,72 +243,68 @@ \fIoutaddr\fP pointer to destination addresses .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_address (krb5_context context, krb5_address * address)" +krb5_free_address frees the data stored in the address that is alloced with any of the krb5_address functions\&. .PP -krb5_free_address frees the data stored in the address that is alloced with any of the krb5_address functions. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br -\fIaddress\fP address to be freed. +\fIaddress\fP addresss to be freed\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_addresses (krb5_context context, krb5_addresses * addresses)" +krb5_free_addresses frees the data stored in the address that is alloced with any of the krb5_address functions\&. .PP -krb5_free_addresses frees the data stored in the address that is alloced with any of the krb5_address functions. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br -\fIaddresses\fP addressses to be freed. +\fIaddresses\fP addressses to be freed\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2addr (krb5_context context, int af, const char * haddr, krb5_address * addr)" +krb5_h_addr2addr works like krb5_h_addr2sockaddr with the exception that it operates on a krb5_address instead of a struct sockaddr\&. .PP -krb5_h_addr2addr works like krb5_h_addr2sockaddr with the exception that it operates on a krb5_address instead of a struct sockaddr. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br \fIaf\fP address family .br -\fIhaddr\fP host address from struct hostent. +\fIhaddr\fP host address from struct hostent\&. .br -\fIaddr\fP returned krb5_address. +\fIaddr\fP returned krb5_address\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2sockaddr (krb5_context context, int af, const char * addr, struct sockaddr * sa, krb5_socklen_t * sa_size, int port)" +krb5_h_addr2sockaddr initializes a 'struct sockaddr sa' from af and the 'struct hostent' (see gethostbyname(3) ) h_addr_list component\&. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address\&. .PP -krb5_h_addr2sockaddr initializes a 'struct sockaddr sa' from af and the 'struct hostent' (see gethostbyname(3) ) h_addr_list component. The argument sa_size should initially contain the size of the sa, and after the call, it will contain the actual length of the address. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -326,20 +316,19 @@ .br \fIsa_size\fP size of sa .br -\fIport\fP port to set in sa. +\fIport\fP port to set in sa\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_addrport (krb5_context context, krb5_address ** res, const krb5_address * addr, int16_t port)" -.PP Create an address of type KRB5_ADDRESS_ADDRPORT from (addr, port) .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -350,27 +339,25 @@ \fIport\fP port to use .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION size_t KRB5_LIB_CALL krb5_max_sockaddr_size (void)" +krb5_max_sockaddr_size returns the max size of the \&.Li struct sockaddr that the Kerberos library will return\&. .PP -krb5_max_sockaddr_size returns the max size of the .Li struct sockaddr that the Kerberos library will return. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an size_t of the maximum struct sockaddr. +Return an size_t of the maximum struct sockaddr\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_address (krb5_context context, const char * string, krb5_addresses * addresses)" +krb5_parse_address returns the resolved hostname in string to the krb5_addresses addresses \&. .PP -krb5_parse_address returns the resolved hostname in string to the krb5_addresses addresses . -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -379,83 +366,82 @@ \fIaddresses\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_print_address (const krb5_address * addr, char * str, size_t len, size_t * ret_len)" +krb5_print_address prints the address in addr to the string string that have the length len\&. If ret_len is not NULL, it will be filled with the length of the string if size were unlimited (not including the final NUL) \&. .PP -krb5_print_address prints the address in addr to the string string that have the length len. If ret_len is not NULL, it will be filled with the length of the string if size were unlimited (not including the final NUL) . -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIaddr\fP address to be printed .br \fIstr\fP pointer string to print the address into .br -\fIlen\fP length that will fit into area pointed to by 'str'. +\fIlen\fP length that will fit into area pointed to by 'str'\&. .br -\fIret_len\fP return length the str. +\fIret_len\fP return length the str\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2address (krb5_context context, const struct sockaddr * sa, krb5_address * addr)" +krb5_sockaddr2address stores a address a 'struct sockaddr' sa in the krb5_address addr\&. .PP -krb5_sockaddr2address stores a address a 'struct sockaddr' sa in the krb5_address addr. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br \fIsa\fP a struct sockaddr to extract the address from .br -\fIaddr\fP an Kerberos 5 address to store the address in. +\fIaddr\fP an Kerberos 5 address to store the address in\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2port (krb5_context context, const struct sockaddr * sa, int16_t * port)" +krb5_sockaddr2port extracts a port (if possible) from a "struct sockaddr\&. .PP -krb5_sockaddr2port extracts a port (if possible) from a 'struct sockaddr. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br \fIsa\fP a struct sockaddr to extract the port from .br -\fIport\fP a pointer to an int16_t store the port in. +\fIport\fP a pointer to an int16_t store the port in\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported. +Return an error code or 0\&. Will return KRB5_PROG_ATYPE_NOSUPP in case address type is not supported\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_sockaddr_uninteresting (const struct sockaddr * sa)" +krb5_sockaddr_uninteresting returns TRUE for all \&.Fa sa that the kerberos library thinks are uninteresting\&. One example are link local addresses\&. .PP -krb5_sockaddr_uninteresting returns TRUE for all .Fa sa that the kerberos library thinks are uninteresting. One example are link local addresses. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIsa\fP pointer to struct sockaddr that might be interesting. +\fIsa\fP pointer to struct sockaddr that might be interesting\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return a non zero for uninteresting addresses. +Return a non zero for uninteresting addresses\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_aname_to_localname.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_aname_to_localname.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_aname_to_localname.3 @@ -0,0 +1 @@ +.so man3/krb5_support.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_auth.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_auth.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_auth.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_auth.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 authentication functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_auth" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 authentication functions \- +krb5_auth \- Heimdal Kerberos 5 authentication functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -31,108 +34,105 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_ctx (krb5_context context, krb5_auth_context * auth_context, const krb5_data * inbuf, krb5_const_principal server, krb5_rd_req_in_ctx inctx, krb5_rd_req_out_ctx * outctx)" +The core server function that verify application authentication requests from clients\&. .PP -The core server function that verify application authentication requests from clients. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Keberos 5 context. +\fIcontext\fP Keberos 5 context\&. .br -\fIauth_context\fP the authentication context, can be NULL, then default values for the authentication context will used. +\fIauth_context\fP the authentication context, can be NULL, then default values for the authentication context will used\&. .br \fIinbuf\fP the (AP-REQ) authentication buffer .br -\fIserver\fP the server with authenticate as, if NULL the function will try to find any available credential in the keytab that will verify the reply. The function will prefer the server the server client specified in the AP-REQ, but if there is no mach, it will try all keytab entries for a match. This have serious performance issues for larger keytabs. +\fIserver\fP the server to authenticate to\&. If NULL the function will try to find any available credential in the keytab that will verify the reply\&. The function will prefer the server specified in the AP-REQ, but if there is no mach, it will try all keytab entries for a match\&. This has serious performance issues for large keytabs\&. .br -\fIinctx\fP control the behavior of the function, if NULL, the default behavior is used. +\fIinctx\fP control the behavior of the function, if NULL, the default behavior is used\&. .br -\fIoutctx\fP the return outctx, free with \fBkrb5_rd_req_out_ctx_free()\fP. +\fIoutctx\fP the return outctx, free with \fBkrb5_rd_req_out_ctx_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Kerberos 5 error code, see krb5_get_error_message(). +Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_ctx_alloc (krb5_context context, krb5_rd_req_in_ctx * ctx)" +Allocate a krb5_rd_req_in_ctx as an input parameter to \fBkrb5_rd_req_ctx()\fP\&. The caller should free the context with krb5_rd_req_in_ctx_free() when done with the context\&. .PP -Allocate a krb5_rd_req_in_ctx as an input parameter to \fBkrb5_rd_req_ctx()\fP. The caller should free the context with krb5_rd_req_in_ctx_free() when done with the context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Keberos 5 context. +\fIcontext\fP Keberos 5 context\&. .br -\fIctx\fP in ctx to \fBkrb5_rd_req_ctx()\fP. +\fIctx\fP in ctx to \fBkrb5_rd_req_ctx()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Kerberos 5 error code, see krb5_get_error_message(). +Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_keytab (krb5_context context, krb5_rd_req_in_ctx in, krb5_keytab keytab)" +Set the keytab that \fBkrb5_rd_req_ctx()\fP will use\&. .PP -Set the keytab that \fBkrb5_rd_req_ctx()\fP will use. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Keberos 5 context. +\fIcontext\fP Keberos 5 context\&. .br -\fIin\fP in ctx to \fBkrb5_rd_req_ctx()\fP. +\fIin\fP in ctx to \fBkrb5_rd_req_ctx()\fP\&. .br -\fIkeytab\fP keytab that \fBkrb5_rd_req_ctx()\fP will use, only copy the pointer, so the caller must free they keytab after krb5_rd_req_in_ctx_free() is called. +\fIkeytab\fP keytab that \fBkrb5_rd_req_ctx()\fP will use, only copy the pointer, so the caller must free they keytab after krb5_rd_req_in_ctx_free() is called\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Kerberos 5 error code, see krb5_get_error_message(). +Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_pac_check (krb5_context context, krb5_rd_req_in_ctx in, krb5_boolean flag)" -.PP Set if krb5_rq_red() is going to check the Windows PAC or not .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Keberos 5 context. +\fIcontext\fP Keberos 5 context\&. .br -\fIin\fP krb5_rd_req_in_ctx to check the option on. +\fIin\fP krb5_rd_req_in_ctx to check the option on\&. .br -\fIflag\fP flag to select if to check the pac (TRUE) or not (FALSE). +\fIflag\fP flag to select if to check the pac (TRUE) or not (FALSE)\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Kerberos 5 error code, see krb5_get_error_message(). +Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_rd_req_out_ctx_free (krb5_context context, krb5_rd_req_out_ctx ctx)" +Free the krb5_rd_req_out_ctx\&. .PP -Free the krb5_rd_req_out_ctx. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Keberos 5 context. +\fIcontext\fP Keberos 5 context\&. .br -\fIctx\fP krb5_rd_req_out_ctx context to free. +\fIctx\fP krb5_rd_req_out_ctx context to free\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_out_get_server (krb5_context context, krb5_rd_req_out_ctx out, krb5_principal * principal)" +Get the principal that was used in the request from the client\&. Might not match whats in the ticket if \fBkrb5_rd_req_ctx()\fP searched in the keytab for a matching key\&. .PP -Get the principal that was used in the request from the client. Might not match whats in the ticket if \fBkrb5_rd_req_ctx()\fP searched in the keytab for a matching key. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Kerberos 5 context. +\fIcontext\fP a Kerberos 5 context\&. .br -\fIout\fP a krb5_rd_req_out_ctx from \fBkrb5_rd_req_ctx()\fP. +\fIout\fP a krb5_rd_req_out_ctx from \fBkrb5_rd_req_ctx()\fP\&. .br -\fIprincipal\fP return principal, free with \fBkrb5_free_principal()\fP. +\fIprincipal\fP return principal, free with \fBkrb5_free_principal()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 credential cache functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_ccache" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 credential cache functions \- +krb5_ccache \- Heimdal Kerberos 5 credential cache functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -164,6 +167,9 @@ .RI "KRB5_LIB_VARIABLE const krb5_cc_ops \fBkrb5_acc_ops\fP" .br .ti -1c +.RI "KRB5_LIB_VARIABLE const krb5_cc_ops \fBkrb5_dcc_ops\fP" +.br +.ti -1c .RI "KRB5_LIB_VARIABLE const krb5_cc_ops \fBkrb5_fcc_ops\fP" .br .ti -1c @@ -176,39 +182,36 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_end_seq_get (krb5_context context, krb5_cc_cache_cursor cursor)" +Destroy the cursor `cursor'\&. .PP -Destroy the cursor `cursor'. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_get_first (krb5_context context, const char * type, krb5_cc_cache_cursor * cursor)" +Start iterating over all caches of specified type\&. See also \fBkrb5_cccol_cursor_new()\fP\&. .PP -Start iterating over all caches of specified type. See also \fBkrb5_cccol_cursor_new()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br -\fItype\fP optional type to iterate over, if NULL, the default cache is used. +\fItype\fP optional type to iterate over, if NULL, the default cache is used\&. .br -\fIcursor\fP cursor should be freed with \fBkrb5_cc_cache_end_seq_get()\fP. +\fIcursor\fP cursor should be freed with \fBkrb5_cc_cache_end_seq_get()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_match (krb5_context context, krb5_principal client, krb5_ccache * id)" +Search for a matching credential cache that have the `principal' as the default principal\&. On success, `id' needs to be freed with \fBkrb5_cc_close()\fP or \fBkrb5_cc_destroy()\fP\&. .PP -Search for a matching credential cache that have the `principal' as the default principal. On success, `id' needs to be freed with \fBkrb5_cc_close()\fP or \fBkrb5_cc_destroy()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br @@ -217,17 +220,16 @@ \fIid\fP the returned credential cache .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -On failure, error code is returned and `id' is set to NULL. +On failure, error code is returned and `id' is set to NULL\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_next (krb5_context context, krb5_cc_cache_cursor cursor, krb5_ccache * id)" +Retrieve the next cache pointed to by (`cursor') in `id' and advance `cursor'\&. .PP -Retrieve the next cache pointed to by (`cursor') in `id' and advance `cursor'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br @@ -236,139 +238,125 @@ \fIid\fP next ccache .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return 0 or an error code. Returns KRB5_CC_END when the end of caches is reached, see krb5_get_error_message(). +Return 0 or an error code\&. Returns KRB5_CC_END when the end of caches is reached, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_cc_clear_mcred (krb5_creds * mcred)" -.PP Clear `mcreds' so it can be used with krb5_cc_retrieve_cred .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_close (krb5_context context, krb5_ccache id)" +Stop using the ccache `id' and free the related resources\&. .PP -Stop using the ccache `id' and free the related resources. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_cache (krb5_context context, const krb5_ccache from, krb5_ccache to)" -.PP -Just like \fBkrb5_cc_copy_match_f()\fP, but copy everything. +Just like \fBkrb5_cc_copy_match_f()\fP, but copy everything\&. .PP @ .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_creds (krb5_context context, const krb5_ccache from, krb5_ccache to)" -.PP MIT compat glue .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_match_f (krb5_context context, const krb5_ccache from, krb5_ccache to, krb5_boolean(*)(krb5_context, void *, const krb5_creds *) match, void * matchctx, unsigned int * matched)" +Copy the contents of `from' to `to' if the given match function return true\&. .PP -Copy the contents of `from' to `to' if the given match function return true. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br -\fIfrom\fP the cache to copy data from. +\fIfrom\fP the cache to copy data from\&. .br -\fIto\fP the cache to copy data to. +\fIto\fP the cache to copy data to\&. .br -\fImatch\fP a match function that should return TRUE if cred argument should be copied, if NULL, all credentials are copied. +\fImatch\fP a match function that should return TRUE if cred argument should be copied, if NULL, all credentials are copied\&. .br -\fImatchctx\fP context passed to match function. +\fImatchctx\fP context passed to match function\&. .br -\fImatched\fP set to true if there was a credential that matched, may be NULL. +\fImatched\fP set to true if there was a credential that matched, may be NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_default (krb5_context context, krb5_ccache * id)" +Open the default ccache in `id'\&. .PP -Open the default ccache in `id'. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_default_name (krb5_context context)" +Return a pointer to a context static string containing the default ccache name\&. .PP -Return a pointer to a context static string containing the default ccache name. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -String to the default credential cache name. +String to the default credential cache name\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_destroy (krb5_context context, krb5_ccache id)" +Remove the ccache `id'\&. .PP -Remove the ccache `id'. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_end_seq_get (krb5_context context, const krb5_ccache id, krb5_cc_cursor * cursor)" -.PP -Destroy the cursor `cursor'. +Destroy the cursor `cursor'\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_gen_new (krb5_context context, const krb5_cc_ops * ops, krb5_ccache * id)" +Generate a new ccache of type `ops' in `id'\&. .PP -Generate a new ccache of type `ops' in `id'. +Deprecated: use \fBkrb5_cc_new_unique()\fP instead\&. .PP -Deprecated: use \fBkrb5_cc_new_unique()\fP instead. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_config (krb5_context context, krb5_ccache id, krb5_const_principal principal, const char * name, krb5_data * data)" +Get some configuration for the credential cache in the cache\&. .PP -Get some configuration for the credential cache in the cache. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br \fIid\fP the credential cache to store the data for .br -\fIprincipal\fP configuration for a specific principal, if NULL, global for the whole cache. +\fIprincipal\fP configuration for a specific principal, if NULL, global for the whole cache\&. .br -\fIname\fP name under which the configuraion is stored. +\fIname\fP name under which the configuraion is stored\&. .br \fIdata\fP data to fetched, free with \fBkrb5_data_free()\fP .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_flags (krb5_context context, krb5_ccache id, krb5_flags * flags)" -.PP -Get the flags of `id', store them in `flags'. +Get the flags of `id', store them in `flags'\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_friendly_name (krb5_context context, krb5_ccache id, char ** name)" +Return a friendly name on credential cache\&. Free the result with krb5_xfree()\&. .PP -Return a friendly name on credential cache. Free the result with krb5_xfree(). -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_full_name (krb5_context context, krb5_ccache id, char ** str)" -.PP Return the complete resolvable name the cache .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -377,120 +365,111 @@ \fIstr\fP the returned name of a credential cache, free with krb5_xfree() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 or an error (and then *str is set to NULL). +Returns 0 or an error (and then *str is set to NULL)\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_kdc_offset (krb5_context context, krb5_ccache id, krb5_deltat * offset)" +Get the time offset betwen the client and the KDC .PP -Get the time offset between the client and the KDC -.PP -If the backend doesn't support KDC offset, use the context global setting. +If the backend doesn't support KDC offset, use the context global setting\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIid\fP a credential cache .br \fIoffset\fP the offset in seconds .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_lifetime (krb5_context context, krb5_ccache id, time_t * t)" -.PP Get the lifetime of the initial ticket in the cache .PP -Get the lifetime of the initial ticket in the cache, if the initial ticket was not found, the error code KRB5_CC_END is returned. +Get the lifetime of the initial ticket in the cache, if the initial ticket was not found, the error code KRB5_CC_END is returned\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIid\fP a credential cache .br \fIt\fP the relative lifetime of the initial ticket .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP - -.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_name (krb5_context context, krb5_ccache id)" +If we find the start krbtgt in the cache, use that as the lifespan\&. .PP +If there was no krbtgt, use the shortest lifetime of service tickets that have yet to expire\&. If all credentials are expired, \fBkrb5_cc_get_lifetime()\fP will fail\&. +.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_name (krb5_context context, krb5_ccache id)" Return the name of the ccache `id' .SS "KRB5_LIB_FUNCTION const krb5_cc_ops* KRB5_LIB_CALL krb5_cc_get_ops (krb5_context context, krb5_ccache id)" -.PP -Return krb5_cc_ops of a the ccache `id'. +Return krb5_cc_ops of a the ccache `id'\&. .SS "KRB5_LIB_FUNCTION const krb5_cc_ops* KRB5_LIB_CALL krb5_cc_get_prefix_ops (krb5_context context, const char * prefix)" +Get the cc ops that is registered in `context' to handle the prefix\&. prefix can be a complete credential cache name or a prefix, the function will only use part up to the first colon (:) if there is one\&. If prefix the argument is NULL, the default ccache implemtation is returned\&. .PP -Get the cc ops that is registered in `context' to handle the prefix. prefix can be a complete credential cache name or a prefix, the function will only use part up to the first colon (:) if there is one. If prefix the argument is NULL, the default ccache implemtation is returned. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns NULL if ops not found. +Returns NULL if ops not found\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_principal (krb5_context context, krb5_ccache id, krb5_principal * principal)" +Return the principal of `id' in `principal'\&. .PP -Return the principal of `id' in `principal'. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_type (krb5_context context, krb5_ccache id)" -.PP -Return the type of the ccache `id'. +Return the type of the ccache `id'\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_version (krb5_context context, const krb5_ccache id)" -.PP -Return the version of `id'. +Return the version of `id'\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_initialize (krb5_context context, krb5_ccache id, krb5_principal primary_principal)" +Create a new ccache in `id' for `primary_principal'\&. .PP -Create a new ccache in `id' for `primary_principal'. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_last_change_time (krb5_context context, krb5_ccache id, krb5_timestamp * mtime)" +Return the last time the credential cache was modified\&. .PP -Return the last time the credential cache was modified. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br \fIid\fP The credential cache to probe .br -\fImtime\fP the last modification time, set to 0 on error. +\fImtime\fP the last modification time, set to 0 on error\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return 0 or and error. See krb5_get_error_message(). +Return 0 or and error\&. See \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_move (krb5_context context, krb5_ccache from, krb5_ccache to)" +Move the content from one credential cache to another\&. The operation is an atomic switch\&. .PP -Move the content from one credential cache to another. The operation is an atomic switch. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -499,78 +478,72 @@ \fIto\fP the credential cache to move the content to .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -On sucess, from is freed. On failure, error code is returned and from and to are both still allocated, see krb5_get_error_message(). +On sucess, from is freed\&. On failure, error code is returned and from and to are both still allocated, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_new_unique (krb5_context context, const char * type, const char * hint, krb5_ccache * id)" +Generates a new unique ccache of \fCtype\fP in `id'\&. If `type' is NULL, the library chooses the default credential cache type\&. The supplied `hint' (that can be NULL) is a string that the credential cache type can use to base the name of the credential on, this is to make it easier for the user to differentiate the credentials\&. .PP -Generates a new unique ccache of `type` in `id'. If `type' is NULL, the library chooses the default credential cache type. The supplied `hint' (that can be NULL) is a string that the credential cache type can use to base the name of the credential on, this is to make it easier for the user to differentiate the credentials. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_next_cred (krb5_context context, const krb5_ccache id, krb5_cc_cursor * cursor, krb5_creds * creds)" +Retrieve the next cred pointed to by (`id', `cursor') in `creds' and advance `cursor'\&. .PP -Retrieve the next cred pointed to by (`id', `cursor') in `creds' and advance `cursor'. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_register (krb5_context context, const krb5_cc_ops * ops, krb5_boolean override)" +Add a new ccache type with operations `ops', overwriting any existing one if `override'\&. .PP -Add a new ccache type with operations `ops', overwriting any existing one if `override'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br \fIops\fP type of plugin symbol .br -\fIoverride\fP flag to select if the registration is to overide an existing ops with the same name. +\fIoverride\fP flag to select if the registration is to overide an existing ops with the same name\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_remove_cred (krb5_context context, krb5_ccache id, krb5_flags which, krb5_creds * cred)" -.PP -Remove the credential identified by `cred', `which' from `id'. +Remove the credential identified by `cred', `which' from `id'\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_resolve (krb5_context context, const char * name, krb5_ccache * id)" +Find and allocate a ccache in `id' from the specification in `residual'\&. If the ccache name doesn't contain any colon, interpret it as a file name\&. .PP -Find and allocate a ccache in `id' from the specification in `residual'. If the ccache name doesn't contain any colon, interpret it as a file name. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIname\fP string name of a credential cache. +\fIname\fP string name of a credential cache\&. .br -\fIid\fP return pointer to a found credential cache. +\fIid\fP return pointer to a found credential cache\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return 0 or an error code. In case of an error, id is set to NULL, see krb5_get_error_message(). +Return 0 or an error code\&. In case of an error, id is set to NULL, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_retrieve_cred (krb5_context context, krb5_ccache id, krb5_flags whichfields, const krb5_creds * mcreds, krb5_creds * creds)" +Retrieve the credential identified by `mcreds' (and `whichfields') from `id' in `creds'\&. 'creds' must be free by the caller using krb5_free_cred_contents\&. .PP -Retrieve the credential identified by `mcreds' (and `whichfields') from `id' in `creds'. 'creds' must be free by the caller using krb5_free_cred_contents. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br @@ -583,177 +556,163 @@ \fIcreds\fP returned credential, free with \fBkrb5_free_cred_contents()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_config (krb5_context context, krb5_ccache id, krb5_const_principal principal, const char * name, krb5_data * data)" +Store some configuration for the credential cache in the cache\&. Existing configuration under the same name is over-written\&. .PP -Store some configuration for the credential cache in the cache. Existing configuration under the same name is over-written. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br \fIid\fP the credential cache to store the data for .br -\fIprincipal\fP configuration for a specific principal, if NULL, global for the whole cache. +\fIprincipal\fP configuration for a specific principal, if NULL, global for the whole cache\&. .br -\fIname\fP name under which the configuraion is stored. +\fIname\fP name under which the configuraion is stored\&. .br -\fIdata\fP data to store, if NULL, configure is removed. +\fIdata\fP data to store, if NULL, configure is removed\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_default_name (krb5_context context, const char * name)" -.PP -Set the default cc name for `context' to `name'. +Set the default cc name for `context' to `name'\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_flags (krb5_context context, krb5_ccache id, krb5_flags flags)" -.PP -Set the flags of `id' to `flags'. +Set the flags of `id' to `flags'\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_friendly_name (krb5_context context, krb5_ccache id, const char * name)" +Set the friendly name on credential cache\&. .PP -Set the friendly name on credential cache. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_kdc_offset (krb5_context context, krb5_ccache id, krb5_deltat offset)" +Set the time offset betwen the client and the KDC .PP -Set the time offset between the client and the KDC +If the backend doesn't support KDC offset, use the context global setting\&. .PP -If the backend doesn't support KDC offset, use the context global setting. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIid\fP a credential cache .br \fIoffset\fP the offset in seconds .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_start_seq_get (krb5_context context, const krb5_ccache id, krb5_cc_cursor * cursor)" +Start iterating over `id', `cursor' is initialized to the beginning\&. Caller must free the cursor with \fBkrb5_cc_end_seq_get()\fP\&. .PP -Start iterating over `id', `cursor' is initialized to the beginning. Caller must free the cursor with \fBkrb5_cc_end_seq_get()\fP. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_store_cred (krb5_context context, krb5_ccache id, krb5_creds * creds)" +Store `creds' in the ccache `id'\&. .PP -Store `creds' in the ccache `id'. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_cc_support_switch (krb5_context context, const char * type)" -.PP Return true if the default credential cache support switch .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_switch (krb5_context context, krb5_ccache id)" +Switch the default default credential cache for a specific credcache type (and name for some implementations)\&. .PP -Switch the default default credential cache for a specific credcache type (and name for some implementations). -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_free (krb5_context context, krb5_cccol_cursor * cursor)" +End an iteration and free all resources, can be done before end is reached\&. .PP -End an iteration and free all resources, can be done before end is reached. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br -\fIcursor\fP the iteration cursor to be freed. +\fIcursor\fP the iteration cursor to be freed\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return 0 or and error, KRB5_CC_END is returned at the end of iteration. See krb5_get_error_message(). +Return 0 or and error, KRB5_CC_END is returned at the end of iteration\&. See \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_new (krb5_context context, krb5_cccol_cursor * cursor)" +Get a new cache interation cursor that will interate over all credentials caches independent of type\&. .PP -Get a new cache interation cursor that will interate over all credentials caches independent of type. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br -\fIcursor\fP passed into \fBkrb5_cccol_cursor_next()\fP and free with \fBkrb5_cccol_cursor_free()\fP. +\fIcursor\fP passed into \fBkrb5_cccol_cursor_next()\fP and free with \fBkrb5_cccol_cursor_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 or and error code, see krb5_get_error_message(). +Returns 0 or and error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_next (krb5_context context, krb5_cccol_cursor cursor, krb5_ccache * cache)" +Get next credential cache from the iteration\&. .PP -Get next credential cache from the iteration. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br \fIcursor\fP the iteration cursor .br -\fIcache\fP the returned cursor, pointer is set to NULL on failure and a cache on success. The returned cache needs to be freed with \fBkrb5_cc_close()\fP or destroyed with \fBkrb5_cc_destroy()\fP. MIT Kerberos behavies slightly diffrent and sets cache to NULL when all caches are iterated over and return 0. +\fIcache\fP the returned cursor, pointer is set to NULL on failure and a cache on success\&. The returned cache needs to be freed with \fBkrb5_cc_close()\fP or destroyed with \fBkrb5_cc_destroy()\fP\&. MIT Kerberos behavies slightly diffrent and sets cache to NULL when all caches are iterated over and return 0\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return 0 or and error, KRB5_CC_END is returned at the end of iteration. See krb5_get_error_message(). +Return 0 or and error, KRB5_CC_END is returned at the end of iteration\&. See \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_last_change_time (krb5_context context, const char * type, krb5_timestamp * mtime)" +Return the last modfication time for a cache collection\&. The query can be limited to a specific cache type\&. If the function return 0 and mtime is 0, there was no credentials in the caches\&. .PP -Return the last modfication time for a cache collection. The query can be limited to a specific cache type. If the function return 0 and mtime is 0, there was no credentials in the caches. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br -\fItype\fP The credential cache to probe, if NULL, all type are traversed. +\fItype\fP The credential cache to probe, if NULL, all type are traversed\&. .br -\fImtime\fP the last modification time, set to 0 on error. +\fImtime\fP the last modification time, set to 0 on error\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return 0 or and error. See krb5_get_error_message(). +Return 0 or and error\&. See \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_validated_creds (krb5_context context, krb5_creds * creds, krb5_principal client, krb5_ccache ccache, char * service)" +Validate the newly fetch credential, see also krb5_verify_init_creds()\&. .PP -Validate the newly fetch credential, see also krb5_verify_init_creds(). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br @@ -763,15 +722,14 @@ .br \fIccache\fP the credential cache to use .br -\fIservice\fP a service name to use, used with \fBkrb5_sname_to_principal()\fP to build a hostname to use to verify. +\fIservice\fP a service name to use, used with \fBkrb5_sname_to_principal()\fP to build a hostname to use to verify\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_config_principal (krb5_context context, krb5_const_principal principal)" +Return TRUE (non zero) if the principal is a configuration principal (generated part of \fBkrb5_cc_set_config()\fP)\&. Returns FALSE (zero) if not a configuration principal\&. .PP -Return TRUE (non zero) if the principal is a configuration principal (generated part of \fBkrb5_cc_set_config()\fP). Returns FALSE (zero) if not a configuration principal. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -781,14 +739,13 @@ .SH "Variable Documentation" .PP -.SS "KRB5_LIB_VARIABLE const krb5_cc_ops \fBkrb5_acc_ops\fP" -.PP +.SS "KRB5_LIB_VARIABLE const krb5_cc_ops krb5_acc_ops" \fBInitial value:\fP .PP .nf - { += { KRB5_CC_OPS_VERSION, - 'API', + "API", acc_get_name, acc_resolve, acc_gen_new, @@ -815,15 +772,48 @@ NULL, } .fi -Variable containing the API based credential cache implemention. -.SS "KRB5_LIB_VARIABLE const krb5_cc_ops \fBkrb5_fcc_ops\fP" +Variable containing the API based credential cache implemention\&. +.SS "KRB5_LIB_VARIABLE const krb5_cc_ops krb5_dcc_ops" +\fBInitial value:\fP .PP +.nf += { + KRB5_CC_OPS_VERSION, + "DIR", + dcc_get_name, + dcc_resolve, + dcc_gen_new, + dcc_initialize, + dcc_destroy, + dcc_close, + dcc_store_cred, + NULL, + dcc_get_principal, + dcc_get_first, + dcc_get_next, + dcc_end_get, + dcc_remove_cred, + dcc_set_flags, + dcc_get_version, + dcc_get_cache_first, + dcc_get_cache_next, + dcc_end_cache_get, + dcc_move, + dcc_get_default_name, + dcc_set_default, + dcc_lastchange, + dcc_set_kdc_offset, + dcc_get_kdc_offset +} +.fi +Variable containing the DIR based credential cache implemention\&. +.SS "KRB5_LIB_VARIABLE const krb5_cc_ops krb5_fcc_ops" \fBInitial value:\fP .PP .nf - { += { KRB5_CC_OPS_VERSION, - 'FILE', + "FILE", fcc_get_name, fcc_resolve, fcc_gen_new, @@ -850,15 +840,14 @@ fcc_get_kdc_offset } .fi -Variable containing the FILE based credential cache implemention. -.SS "KRB5_LIB_VARIABLE const krb5_cc_ops \fBkrb5_mcc_ops\fP" -.PP +Variable containing the FILE based credential cache implemention\&. +.SS "KRB5_LIB_VARIABLE const krb5_cc_ops krb5_mcc_ops" \fBInitial value:\fP .PP .nf - { += { KRB5_CC_OPS_VERSION, - 'MEMORY', + "MEMORY", mcc_get_name, mcc_resolve, mcc_gen_new, @@ -885,4 +874,7 @@ mcc_get_kdc_offset } .fi -Variable containing the MEMORY based credential cache implemention. +Variable containing the MEMORY based credential cache implemention\&. +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache_intro.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache_intro.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache_intro.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ccache_intro.3 @@ -1,11 +1,12 @@ -.TH "krb5_ccache_intro" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_ccache_intro" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME krb5_ccache_intro \- The credential cache functions + .SH "Kerberos credential caches" .PP -krb5_ccache structure holds a Kerberos credential cache. +krb5_ccache structure holds a Kerberos credential cache\&. .PP Heimdal support the follow types of credential caches: .PP @@ -24,7 +25,7 @@ This is a minimalistic version of klist: .PP .nf -#include +#include int main (int argc, char **argv) @@ -36,27 +37,27 @@ krb5_creds creds; if (krb5_init_context (&context) != 0) - errx(1, 'krb5_context'); + errx(1, "krb5_context"); ret = krb5_cc_default (context, &id); if (ret) - krb5_err(context, 1, ret, 'krb5_cc_default'); + krb5_err(context, 1, ret, "krb5_cc_default"); ret = krb5_cc_start_seq_get(context, id, &cursor); if (ret) - krb5_err(context, 1, ret, 'krb5_cc_start_seq_get'); + krb5_err(context, 1, ret, "krb5_cc_start_seq_get"); while((ret = krb5_cc_next_cred(context, id, &cursor, &creds)) == 0){ char *principal; - krb5_unparse_name(context, creds.server, &principal); - printf('principal: %s\\n', principal); + krb5_unparse_name(context, creds\&.server, &principal); + printf("principal: %s\\n", principal); free(principal); krb5_free_cred_contents (context, &creds); } ret = krb5_cc_end_seq_get(context, id, &cursor); if (ret) - krb5_err(context, 1, ret, 'krb5_cc_end_seq_get'); + krb5_err(context, 1, ret, "krb5_cc_end_seq_get"); krb5_cc_close(context, id); diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_credential.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_credential.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_credential.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_credential.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 credential handing functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_credential" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 credential handing functions \- +krb5_credential \- Heimdal Kerberos 5 credential handing functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -58,222 +61,208 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_fwd_tgt_creds (krb5_context context, krb5_auth_context auth_context, const char * hostname, krb5_principal client, krb5_principal server, krb5_ccache ccache, int forwardable, krb5_data * out_data)" +Forward credentials for client to host hostname , making them forwardable if forwardable, and returning the blob of data to sent in out_data\&. If hostname == NULL, pick it from server\&. .PP -Forward credentials for client to host hostname , making them forwardable if forwardable, and returning the blob of data to sent in out_data. If hostname == NULL, pick it from server. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A kerberos 5 context. +\fIcontext\fP A kerberos 5 context\&. .br -\fIauth_context\fP the auth context with the key to encrypt the out_data. +\fIauth_context\fP the auth context with the key to encrypt the out_data\&. .br -\fIhostname\fP the host to forward the tickets too. +\fIhostname\fP the host to forward the tickets too\&. .br -\fIclient\fP the client to delegate from. +\fIclient\fP the client to delegate from\&. .br -\fIserver\fP the server to delegate the credential too. +\fIserver\fP the server to delegate the credential too\&. .br -\fIccache\fP credential cache to use. +\fIccache\fP credential cache to use\&. .br -\fIforwardable\fP make the forwarded ticket forwabledable. +\fIforwardable\fP make the forwarded ticket forwabledable\&. .br -\fIout_data\fP the resulting credential. +\fIout_data\fP the resulting credential\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_forwarded_creds (krb5_context context, krb5_auth_context auth_context, krb5_ccache ccache, krb5_flags flags, const char * hostname, krb5_creds * in_creds, krb5_data * out_data)" +Gets tickets forwarded to hostname\&. If the tickets that are forwarded are address-less, the forwarded tickets will also be address-less\&. .PP -Gets tickets forwarded to hostname. If the tickets that are forwarded are address-less, the forwarded tickets will also be address-less. +If the ticket have any address, hostname will be used for figure out the address to forward the ticket too\&. This since this might use DNS, its insecure and also doesn't represent configured all addresses of the host\&. For example, the host might have two adresses, one IPv4 and one IPv6 address where the later is not published in DNS\&. This IPv6 address might be used communications and thus the resulting ticket useless\&. .PP -If the ticket have any address, hostname will be used for figure out the address to forward the ticket too. This since this might use DNS, its insecure and also doesn't represent configured all addresses of the host. For example, the host might have two adresses, one IPv4 and one IPv6 address where the later is not published in DNS. This IPv6 address might be used communications and thus the resulting ticket useless. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A kerberos 5 context. +\fIcontext\fP A kerberos 5 context\&. .br -\fIauth_context\fP the auth context with the key to encrypt the out_data. +\fIauth_context\fP the auth context with the key to encrypt the out_data\&. .br \fIccache\fP credential cache to use .br \fIflags\fP the flags to control the resulting ticket flags .br -\fIhostname\fP the host to forward the tickets too. +\fIhostname\fP the host to forward the tickets too\&. .br -\fIin_creds\fP the in client and server ticket names. The client and server components forwarded to the remote host. +\fIin_creds\fP the in client and server ticket names\&. The client and server components forwarded to the remote host\&. .br -\fIout_data\fP the resulting credential. +\fIout_data\fP the resulting credential\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP - -.PP -Some older of the MIT gssapi library used clear-text tickets (warped inside AP-REQ encryption), use the krb5_auth_context flag KRB5_AUTH_CONTEXT_CLEAR_FORWARDED_CRED to support those tickets. The session key is used otherwise to encrypt the forwarded ticket. +Some older of the MIT gssapi library used clear-text tickets (warped inside AP-REQ encryption), use the krb5_auth_context flag KRB5_AUTH_CONTEXT_CLEAR_FORWARDED_CRED to support those tickets\&. The session key is used otherwise to encrypt the forwarded ticket\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keyblock (krb5_context context, krb5_creds * creds, krb5_principal client, krb5_keyblock * keyblock, krb5_deltat start_time, const char * in_tkt_service, krb5_get_init_creds_opt * options)" -.PP -Get new credentials using keyblock. +Get new credentials using keyblock\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keytab (krb5_context context, krb5_creds * creds, krb5_principal client, krb5_keytab keytab, krb5_deltat start_time, const char * in_tkt_service, krb5_get_init_creds_opt * options)" -.PP -Get new credentials using keytab. +Get new credentials using keytab\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_alloc (krb5_context context, krb5_get_init_creds_opt ** opt)" -.PP -Allocate a new krb5_get_init_creds_opt structure, free with \fBkrb5_get_init_creds_opt_free()\fP. +Allocate a new krb5_get_init_creds_opt structure, free with \fBkrb5_get_init_creds_opt_free()\fP\&. .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_free (krb5_context context, krb5_get_init_creds_opt * opt)" -.PP -Free krb5_get_init_creds_opt structure. +Free krb5_get_init_creds_opt structure\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_password (krb5_context context, krb5_creds * creds, krb5_principal client, const char * password, krb5_prompter_fct prompter, void * data, krb5_deltat start_time, const char * in_tkt_service, krb5_get_init_creds_opt * options)" -.PP -Get new credentials using password. +Get new credentials using password\&. .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_creds_free (krb5_context context, krb5_init_creds_context ctx)" +Free the krb5_init_creds_context allocated by \fBkrb5_init_creds_init()\fP\&. .PP -Free the krb5_init_creds_context allocated by \fBkrb5_init_creds_init()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br -\fIctx\fP The krb5_init_creds_context to free. +\fIctx\fP The krb5_init_creds_context to free\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get (krb5_context context, krb5_init_creds_context ctx)" +Get new credentials as setup by the krb5_init_creds_context\&. .PP -Get new credentials as setup by the krb5_init_creds_context. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br -\fIctx\fP The krb5_init_creds_context to process. +\fIctx\fP The krb5_init_creds_context to process\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get_error (krb5_context context, krb5_init_creds_context ctx, KRB_ERROR * error)" +Get the last error from the transaction\&. .PP -Get the last error from the transaction. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 Returns 0 or an error code .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_init (krb5_context context, krb5_principal client, krb5_prompter_fct prompter, void * prompter_data, krb5_deltat start_time, krb5_get_init_creds_opt * options, krb5_init_creds_context * rctx)" +Start a new context to get a new initial credential\&. .PP -Start a new context to get a new initial credential. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br -\fIclient\fP The Kerberos principal to get the credential for, if NULL is given, the default principal is used as determined by krb5_get_default_principal(). +\fIclient\fP The Kerberos principal to get the credential for, if NULL is given, the default principal is used as determined by krb5_get_default_principal()\&. .br \fIprompter\fP .br \fIprompter_data\fP .br -\fIstart_time\fP the time the ticket should start to be valid or 0 for now. +\fIstart_time\fP the time the ticket should start to be valid or 0 for now\&. .br -\fIoptions\fP a options structure, can be NULL for default options. +\fIoptions\fP a options structure, can be NULL for default options\&. .br -\fIrctx\fP A new allocated free with \fBkrb5_init_creds_free()\fP. +\fIrctx\fP A new allocated free with \fBkrb5_init_creds_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success or an Kerberos 5 error code, see krb5_get_error_message(). +0 for success or an Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_keytab (krb5_context context, krb5_init_creds_context ctx, krb5_keytab keytab)" +Set the keytab to use for authentication\&. .PP -Set the keytab to use for authentication. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Kerberos 5 context. +\fIcontext\fP a Kerberos 5 context\&. .br -\fIctx\fP ctx krb5_init_creds_context context. +\fIctx\fP ctx krb5_init_creds_context context\&. .br -\fIkeytab\fP the keytab to read the key from. +\fIkeytab\fP the keytab to read the key from\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or an Kerberos 5 error code, see krb5_get_error_message(). +0 for success, or an Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_password (krb5_context context, krb5_init_creds_context ctx, const char * password)" +Sets the password that will use for the request\&. .PP -Sets the password that will use for the request. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Kerberos 5 context. +\fIcontext\fP a Kerberos 5 context\&. .br -\fIctx\fP ctx krb5_init_creds_context context. +\fIctx\fP ctx krb5_init_creds_context context\&. .br -\fIpassword\fP the password to use. +\fIpassword\fP the password to use\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or an Kerberos 5 error code, see krb5_get_error_message(). +0 for success, or an Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_service (krb5_context context, krb5_init_creds_context ctx, const char * service)" +Sets the service that the is requested\&. This call is only neede for special initial tickets, by default the a krbtgt is fetched in the default realm\&. .PP -Sets the service that the is requested. This call is only neede for special initial tickets, by default the a krbtgt is fetched in the default realm. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Kerberos 5 context. +\fIcontext\fP a Kerberos 5 context\&. .br -\fIctx\fP a krb5_init_creds_context context. +\fIctx\fP a krb5_init_creds_context context\&. .br -\fIservice\fP the service given as a string, for example 'kadmind/admin'. If NULL, the default krbtgt in the clients realm is set. +\fIservice\fP the service given as a string, for example 'kadmind/admin'\&. If NULL, the default krbtgt in the clients realm is set\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or an Kerberos 5 error code, see krb5_get_error_message(). +0 for success, or an Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_step (krb5_context context, krb5_init_creds_context ctx, krb5_data * in, krb5_data * out, krb5_krbhst_info * hostinfo, unsigned int * flags)" +The core loop if krb5_get_init_creds() function family\&. Create the packets and have the caller send them off to the KDC\&. .PP -The core loop if krb5_get_init_creds() function family. Create the packets and have the caller send them off to the KDC. +If the caller want all work been done for them, use \fBkrb5_init_creds_get()\fP instead\&. .PP -If the caller want all work been done for them, use \fBkrb5_init_creds_get()\fP instead. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Kerberos 5 context. +\fIcontext\fP a Kerberos 5 context\&. .br -\fIctx\fP ctx krb5_init_creds_context context. +\fIctx\fP ctx krb5_init_creds_context context\&. .br -\fIin\fP input data from KDC, first round it should be reset by krb5_data_zer(). +\fIin\fP input data from KDC, first round it should be reset by krb5_data_zer()\&. .br -\fIout\fP reply to KDC. +\fIout\fP reply to KDC\&. .br -\fIhostinfo\fP KDC address info, first round it can be NULL. +\fIhostinfo\fP KDC address info, first round it can be NULL\&. .br -\fIflags\fP status of the round, if KRB5_INIT_CREDS_STEP_FLAG_CONTINUE is set, continue one more round. +\fIflags\fP status of the round, if KRB5_INIT_CREDS_STEP_FLAG_CONTINUE is set, continue one more round\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or an Kerberos 5 error code, see krb5_get_error_message(). +0 for success, or an Kerberos 5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto.3 @@ -1,12 +1,21 @@ -.TH "Heimdal Kerberos 5 cryptography functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_crypto" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 cryptography functions \- +krb5_crypto \- Heimdal Kerberos 5 cryptography functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c .ti -1c +.RI "HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_generate_random\fP (void *buf, size_t len)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_generate_random_block\fP (void *buf, size_t len)" +.br +.ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_enctype_valid\fP (krb5_context context, krb5_enctype etype)" .br .ti -1c @@ -52,6 +61,12 @@ .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_allow_weak_crypto\fP (krb5_context context, krb5_boolean enable)" .br .ti -1c +.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_is_enctype_weak\fP (krb5_context context, krb5_enctype enctype)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fB_krb5_enctype_requires_random_salt\fP (krb5_context context, krb5_enctype enctype)" +.br +.ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_random_to_key\fP (krb5_context context, krb5_enctype type, const void *data, size_t size, krb5_keyblock *key)" .br .ti -1c @@ -81,91 +96,129 @@ .ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_keyblock_init\fP (krb5_context context, krb5_enctype type, const void *data, size_t size, krb5_keyblock *key)" .br +.ti -1c +.RI "krb5_error_code \fB_krb5_SP800_108_HMAC_KDF\fP (krb5_context context, const krb5_data *kdf_K1, const krb5_data *kdf_label, const krb5_data *kdf_context, const EVP_MD *md, krb5_data *kdf_K0)" +.br .in -1c .SH "Detailed Description" .PP .SH "Function Documentation" .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_allow_weak_crypto (krb5_context context, krb5_boolean enable)" +.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_enctype_requires_random_salt (krb5_context context, krb5_enctype enctype)" +Returns whether the encryption type should use randomly generated salts +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP Kerberos 5 context +.br +\fIenctype\fP encryption type to probe +.RE .PP +\fBReturns\fP +.RS 4 +Returns true if generated salts should have random component +.RE +.PP + +.SS "krb5_error_code _krb5_SP800_108_HMAC_KDF (krb5_context context, const krb5_data * kdf_K1, const krb5_data * kdf_label, const krb5_data * kdf_context, const EVP_MD * md, krb5_data * kdf_K0)" +As described in SP800-108 5\&.1 (for HMAC) +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP Kerberos 5 context +.br +\fIkdf_K1\fP Base key material\&. +.br +\fIkdf_label\fP A string that identifies the purpose for the derived key\&. +.br +\fIkdf_context\fP A binary string containing parties, nonce, etc\&. +.br +\fImd\fP Message digest function to use for PRF\&. +.br +\fIkdf_K0\fP Derived key data\&. +.RE +.PP +\fBReturns\fP +.RS 4 +Return an error code for an failure or 0 on success\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_allow_weak_crypto (krb5_context context, krb5_boolean enable)" Enable or disable all weak encryption types .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br \fIenable\fP true to enable, false to disable .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cksumtype_to_enctype (krb5_context context, krb5_cksumtype ctype, krb5_enctype * etype)" +Return the coresponding encryption type for a checksum type\&. .PP -Return the coresponding encryption type for a checksum type. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br \fIctype\fP The checksum type to get the result enctype for .br -\fIetype\fP The returned encryption, when the matching etype is not found, etype is set to ETYPE_NULL. +\fIetype\fP The returned encryption, when the matching etype is not found, etype is set to ETYPE_NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code for an failure or 0 on success. +Return an error code for an failure or 0 on success\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock (krb5_context context, const krb5_keyblock * inblock, krb5_keyblock ** to)" +Copy a keyblock, free the output keyblock with \fBkrb5_free_keyblock()\fP\&. .PP -Copy a keyblock, free the output keyblock with \fBkrb5_free_keyblock()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br \fIinblock\fP the key to copy .br -\fIto\fP the output key. +\fIto\fP the output key\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 0 on success or a Kerberos 5 error code .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock_contents (krb5_context context, const krb5_keyblock * inblock, krb5_keyblock * to)" +Copy a keyblock, free the output keyblock with \fBkrb5_free_keyblock_contents()\fP\&. .PP -Copy a keyblock, free the output keyblock with \fBkrb5_free_keyblock_contents()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br \fIinblock\fP the key to copy .br -\fIto\fP the output key. +\fIto\fP the output key\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 0 on success or a Kerberos 5 error code .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_create_checksum_iov (krb5_context context, krb5_crypto crypto, unsigned usage, \fBkrb5_crypto_iov\fP * data, unsigned int num_data, krb5_cksumtype * type)" +Create a Kerberos message checksum\&. .PP -Create a Kerberos message checksum. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -180,34 +233,32 @@ \fItype\fP output data .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_destroy (krb5_context context, krb5_crypto crypto)" +Free a crypto context created by \fBkrb5_crypto_init()\fP\&. .PP -Free a crypto context created by \fBkrb5_crypto_init()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br \fIcrypto\fP crypto context to free .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_fx_cf2 (krb5_context context, const krb5_crypto crypto1, const krb5_crypto crypto2, krb5_data * pepper1, krb5_data * pepper2, krb5_enctype enctype, krb5_keyblock * res)" +The FX-CF2 key derivation function, used in FAST and preauth framework\&. .PP -The FX-CF2 key derivation function, used in FAST and preauth framework. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -224,17 +275,16 @@ \fIres\fP allocated key, free with \fBkrb5_free_keyblock_contents()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getblocksize (krb5_context context, krb5_crypto crypto, size_t * blocksize)" -.PP Return the blocksize used algorithm referenced by the crypto context .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -243,17 +293,16 @@ \fIblocksize\fP the resulting blocksize .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getconfoundersize (krb5_context context, krb5_crypto crypto, size_t * confoundersize)" -.PP Return the confounder size used by the crypto context .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -262,17 +311,16 @@ \fIconfoundersize\fP the returned confounder size .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getenctype (krb5_context context, krb5_crypto crypto, krb5_enctype * enctype)" -.PP Return the encryption type used by the crypto context .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -281,17 +329,16 @@ \fIenctype\fP the resulting encryption type .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getpadsize (krb5_context context, krb5_crypto crypto, size_t * padsize)" -.PP Return the padding size used by the crypto context .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -300,19 +347,18 @@ \fIpadsize\fP the return padding size .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_init (krb5_context context, const krb5_keyblock * key, krb5_enctype etype, krb5_crypto * crypto)" +Create a crypto context used for all encryption and signature operation\&. The encryption type to use is taken from the key, but can be overridden with the enctype parameter\&. This can be useful for encryptions types which is compatiable (DES for example)\&. .PP -Create a crypto context used for all encryption and signature operation. The encryption type to use is taken from the key, but can be overridden with the enctype parameter. This can be useful for encryptions types which is compatiable (DES for example). +To free the crypto context, use \fBkrb5_crypto_destroy()\fP\&. .PP -To free the crypto context, use \fBkrb5_crypto_destroy()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -323,17 +369,16 @@ \fIcrypto\fP the resulting crypto context .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_decrypt_iov_ivec (krb5_context context, krb5_crypto crypto, unsigned usage, \fBkrb5_crypto_iov\fP * data, unsigned int num_data, void * ivec)" +Inline decrypt a Kerberos message\&. .PP -Inline decrypt a Kerberos message. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -348,17 +393,21 @@ \fIivec\fP initial cbc/cts vector .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP -1. KRB5_CRYPTO_TYPE_HEADER 2. one KRB5_CRYPTO_TYPE_DATA and array [0,...] of KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used unencrypoted protocol headers and trailers. The output data will be of same size as the input data or shorter. -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_encrypt_iov_ivec (krb5_context context, krb5_crypto crypto, unsigned usage, \fBkrb5_crypto_iov\fP * data, int num_data, void * ivec)" +.IP "1." 4 +KRB5_CRYPTO_TYPE_HEADER +.IP "2." 4 +one KRB5_CRYPTO_TYPE_DATA and array [0,\&.\&.\&.] of KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order\&. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used unencrypoted protocol headers and trailers\&. The output data will be of same size as the input data or shorter\&. .PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_encrypt_iov_ivec (krb5_context context, krb5_crypto crypto, unsigned usage, \fBkrb5_crypto_iov\fP * data, int num_data, void * ivec)" Inline encrypt a kerberos message .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -373,70 +422,75 @@ \fIivec\fP initial cbc/cts vector .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP Kerberos encrypted data look like this: .PP -1. KRB5_CRYPTO_TYPE_HEADER 2. array [1,...] KRB5_CRYPTO_TYPE_DATA and array [0,...] KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used headers and trailers. 3. KRB5_CRYPTO_TYPE_PADDING, at least on padsize long if padsize > 1 4. KRB5_CRYPTO_TYPE_TRAILER -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_disable (krb5_context context, krb5_enctype enctype)" +.IP "1." 4 +KRB5_CRYPTO_TYPE_HEADER +.IP "2." 4 +array [1,\&.\&.\&.] KRB5_CRYPTO_TYPE_DATA and array [0,\&.\&.\&.] KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver have to aware of the order\&. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used headers and trailers\&. +.IP "3." 4 +KRB5_CRYPTO_TYPE_PADDING, at least on padsize long if padsize > 1 +.IP "4." 4 +KRB5_CRYPTO_TYPE_TRAILER .PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_disable (krb5_context context, krb5_enctype enctype)" Disable encryption type .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br \fIenctype\fP encryption type to disable .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_enable (krb5_context context, krb5_enctype enctype)" -.PP Enable encryption type .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br \fIenctype\fP encryption type to enable .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_valid (krb5_context context, krb5_enctype etype)" +Check if a enctype is valid, return 0 if it is\&. .PP -Check if a enctype is valid, return 0 if it is. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br \fIetype\fP enctype to check if its valid or not .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code for an failure or 0 on success (enctype valid). +Return an error code for an failure or 0 on success (enctype valid)\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock (krb5_context context, krb5_keyblock * keyblock)" +Free a keyblock, also zero out the content of the keyblock, uses \fBkrb5_free_keyblock_contents()\fP to free the content\&. .PP -Free a keyblock, also zero out the content of the keyblock, uses \fBkrb5_free_keyblock_contents()\fP to free the content. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br @@ -445,10 +499,9 @@ .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock_contents (krb5_context context, krb5_keyblock * keyblock)" +Free a keyblock's content, also zero out the content of the keyblock\&. .PP -Free a keyblock's content, also zero out the content of the keyblock. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Kerberos 5 context .br @@ -456,11 +509,43 @@ .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey_extended (krb5_context context, const krb5_keyblock * key, krb5_enctype etype, krb5_keyblock ** subkey)" +.SS "HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_random (void * buf, size_t len)" +Fill buffer buf with len bytes of PRNG randomness that is ok to use for key generation, padding and public diclosing the randomness w/o disclosing the randomness source\&. +.PP +This function can fail, and callers must check the return value\&. +.PP +\fBParameters\fP +.RS 4 +\fIbuf\fP a buffer to fill with randomness +.br +\fIlen\fP length of memory that buf points to\&. +.RE +.PP +\fBReturns\fP +.RS 4 +return 0 on success or HEIM_ERR_RANDOM_OFFLINE if the funcation failed to initialize the randomness source\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_generate_random_block (void * buf, size_t len)" +Fill buffer buf with len bytes of PRNG randomness that is ok to use for key generation, padding and public diclosing the randomness w/o disclosing the randomness source\&. +.PP +This function can NOT fail, instead it will abort() and program will crash\&. .PP +If this function is called after a successful \fBkrb5_init_context()\fP, the chance of it failing is low due to that \fBkrb5_init_context()\fP pulls out some random, and quite commonly the randomness sources will not fail once it have started to produce good output, /dev/urandom behavies that way\&. +.PP +\fBParameters\fP +.RS 4 +\fIbuf\fP a buffer to fill with randomness +.br +\fIlen\fP length of memory that buf points to\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey_extended (krb5_context context, const krb5_keyblock * key, krb5_enctype etype, krb5_keyblock ** subkey)" Generate subkey, from keyblock .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP kerberos context .br @@ -468,43 +553,55 @@ .br \fIetype\fP encryption type of subkey, if ETYPE_NULL, use key's enctype .br -\fIsubkey\fP returned new, free with \fBkrb5_free_keyblock()\fP. +\fIsubkey\fP returned new, free with \fBkrb5_free_keyblock()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 0 on success or a Kerberos 5 error code .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_enctype KRB5_LIB_CALL krb5_keyblock_get_enctype (const krb5_keyblock * block)" +.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_enctype_weak (krb5_context context, krb5_enctype enctype)" +Returns is the encryption is strong or weak .PP -Get encryption type of a keyblock. -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keyblock_init (krb5_context context, krb5_enctype type, const void * data, size_t size, krb5_keyblock * key)" +\fBParameters\fP +.RS 4 +\fIcontext\fP Kerberos 5 context +.br +\fIenctype\fP encryption type to probe +.RE .PP -Fill in `key' with key data of type `enctype' from `data' of length `size'. Key should be freed using \fBkrb5_free_keyblock_contents()\fP. +\fBReturns\fP +.RS 4 +Returns true if encryption type is weak or is not supported\&. +.RE .PP -\fBReturns:\fP + +.SS "KRB5_LIB_FUNCTION krb5_enctype KRB5_LIB_CALL krb5_keyblock_get_enctype (const krb5_keyblock * block)" +Get encryption type of a keyblock\&. +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keyblock_init (krb5_context context, krb5_enctype type, const void * data, size_t size, krb5_keyblock * key)" +Fill in `key' with key data of type `enctype' from `data' of length `size'\&. Key should be freed using \fBkrb5_free_keyblock_contents()\fP\&. +.PP +\fBReturns\fP .RS 4 0 on success or a Kerberos 5 error code .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_keyblock_zero (krb5_keyblock * keyblock)" -.PP Zero out a keyblock .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkeyblock\fP keyblock to zero out .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_random_to_key (krb5_context context, krb5_enctype type, const void * data, size_t size, krb5_keyblock * key)" +Converts the random bytestring to a protocol key according to Kerberos crypto frame work\&. It may be assumed that all the bits of the input string are equally random, even though the entropy present in the random source may be limited\&. .PP -Converts the random bytestring to a protocol key according to Kerberos crypto frame work. It may be assumed that all the bits of the input string are equally random, even though the entropy present in the random source may be limited. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -517,17 +614,16 @@ \fIkey\fP key, output key, free with \fBkrb5_free_keyblock_contents()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verify_checksum_iov (krb5_context context, krb5_crypto crypto, unsigned usage, \fBkrb5_crypto_iov\fP * data, unsigned int num_data, krb5_cksumtype * type)" +Verify a Kerberos message checksum\&. .PP -Verify a Kerberos message checksum. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -542,9 +638,12 @@ \fItype\fP return checksum type if not NULL .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto_iov.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto_iov.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto_iov.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_crypto_iov.3 @@ -1,17 +1,17 @@ -.TH "krb5_crypto_iov" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_crypto_iov" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -krb5_crypto_iov \- +krb5_crypto_iov .SH SYNOPSIS .br .PP -\fC#include \fP .PP +\fC#include \fP .SH "Detailed Description" .PP Semi private, not stable yet .SH "Author" .PP -Generated automatically by Doxygen for HeimdalKerberos5library from the source code. +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_dcc_ops.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_dcc_ops.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_dcc_ops.3 @@ -0,0 +1 @@ +.so man3/krb5_ccache.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_deprecated.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_deprecated.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_deprecated.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_deprecated.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 deprecated functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_deprecated" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 deprecated functions \- +krb5_deprecated \- Heimdal Kerberos 5 deprecated functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -58,10 +61,10 @@ .RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_free_error_string\fP (krb5_context context, char *str) KRB5_DEPRECATED_FUNCTION('Use X instead')" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_set_error_string\fP (krb5_context context, const char *fmt,...) __attribute__((format(printf" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_set_error_string\fP (krb5_context context, const char *fmt,\&.\&.\&.) __attribute__((__format__(__printf__" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_vset_error_string\fP (krb5_context context, const char *fmt, va_list args) __attribute__((format(printf" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_vset_error_string\fP (krb5_context context, const char *fmt, va_list args) __attribute__((__format__(__printf__" .br .ti -1c .RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_clear_error_string\fP (krb5_context context) KRB5_DEPRECATED_FUNCTION('Use X instead')" @@ -97,16 +100,13 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_getremoteseqnumber (krb5_context context, krb5_auth_context auth_context, int32_t * seqnumber)" -.PP Deprecated: use krb5_auth_con_getremoteseqnumber() .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_c_enctype_compare (krb5_context context, krb5_enctype e1, krb5_enctype e2, krb5_boolean * similar)" -.PP -Deprecated: keytypes doesn't exists, they are really enctypes. +Deprecated: keytypes doesn't exists, they are really enctypes\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_change_password (krb5_context context, krb5_creds * creds, const char * newpw, int * result_code, krb5_data * result_code_string, krb5_data * result_string)" +Deprecated: \fBkrb5_change_password()\fP is deprecated, use \fBkrb5_set_password()\fP\&. .PP -Deprecated: \fBkrb5_change_password()\fP is deprecated, use \fBkrb5_set_password()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -121,54 +121,48 @@ \fIresult_string\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -On sucess password is changed. +On sucess password is changed\&. .RE .PP @ .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_string (krb5_context context)" -.PP -Clear the error message returned by krb5_get_error_string(). +Clear the error message returned by \fBkrb5_get_error_string()\fP\&. .PP Deprecated: use \fBkrb5_clear_error_message()\fP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_string_multi (krb5_context context, const char * string, krb5_config_section ** res)" -.PP Deprecated: configuration files are not strings .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_enctypes_compatible_keys (krb5_context context, krb5_enctype etype1, krb5_enctype etype2)" -.PP -Deprecated: keytypes doesn't exists, they are really enctypes. +Deprecated: keytypes doesn't exists, they are really enctypes\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds_contents (krb5_context context, krb5_creds * c)" -.PP Deprecated: use \fBkrb5_free_cred_contents()\fP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data_contents (krb5_context context, krb5_data * data)" +Same as \fBkrb5_data_free()\fP\&. MIT compat\&. .PP -Same as \fBkrb5_data_free()\fP. MIT compat. -.PP -Deprecated: use \fBkrb5_data_free()\fP. +Deprecated: use \fBkrb5_data_free()\fP\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIdata\fP krb5_data to free. +\fIdata\fP krb5_data to free\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_string (krb5_context context, char * str)" +Free the error message returned by \fBkrb5_get_error_string()\fP\&. .PP -Free the error message returned by krb5_get_error_string(). +Deprecated: use \fBkrb5_free_error_message()\fP .PP -Deprecated: use krb5_free_error_message() -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br @@ -177,93 +171,79 @@ .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_unparsed_name (krb5_context context, char * str)" -.PP -Deprecated: use krb5_xfree(). +Deprecated: use krb5_xfree()\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey (krb5_context context, const krb5_keyblock * key, krb5_keyblock ** subkey)" -.PP Deprecated: use \fBkrb5_generate_subkey_extended()\fP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc (krb5_context context, krb5_ccache ccache, krb5_creds * in_creds, krb5_creds ** out_creds, krb5_creds *** ret_tgts)" -.PP -Deprecated: use krb5_get_credentials_with_flags(). +Deprecated: use krb5_get_credentials_with_flags()\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc_opt (krb5_context context, krb5_ccache ccache, krb5_creds * in_creds, krb5_creds ** out_creds, krb5_creds *** ret_tgts, krb5_flags flags)" -.PP -Deprecated: use krb5_get_credentials_with_flags(). +Deprecated: use krb5_get_credentials_with_flags()\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_keytab (krb5_context context, krb5_flags options, krb5_addresses * addrs, const krb5_enctype * etypes, const krb5_preauthtype * pre_auth_types, krb5_keytab keytab, krb5_ccache ccache, krb5_creds * creds, krb5_kdc_rep * ret_as_reply)" -.PP -Deprecated: use krb5_get_init_creds() and friends. +Deprecated: use krb5_get_init_creds() and friends\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_password (krb5_context context, krb5_flags options, krb5_addresses * addrs, const krb5_enctype * etypes, const krb5_preauthtype * pre_auth_types, const char * password, krb5_ccache ccache, krb5_creds * creds, krb5_kdc_rep * ret_as_reply)" -.PP -Deprecated: use krb5_get_init_creds() and friends. +Deprecated: use krb5_get_init_creds() and friends\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_skey (krb5_context context, krb5_flags options, krb5_addresses * addrs, const krb5_enctype * etypes, const krb5_preauthtype * pre_auth_types, const krb5_keyblock * key, krb5_ccache ccache, krb5_creds * creds, krb5_kdc_rep * ret_as_reply)" -.PP -Deprecated: use krb5_get_init_creds() and friends. +Deprecated: use krb5_get_init_creds() and friends\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_get_error (krb5_context context, krb5_get_init_creds_opt * opt, KRB_ERROR ** error)" -.PP -Deprecated: use the new \fBkrb5_init_creds_init()\fP and \fBkrb5_init_creds_get_error()\fP. +Deprecated: use the new \fBkrb5_init_creds_init()\fP and \fBkrb5_init_creds_get_error()\fP\&. .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_init (krb5_get_init_creds_opt * opt)" +Deprecated: use \fBkrb5_get_init_creds_opt_alloc()\fP\&. .PP -Deprecated: use \fBkrb5_get_init_creds_opt_alloc()\fP. -.PP -The reason \fBkrb5_get_init_creds_opt_init()\fP is deprecated is that krb5_get_init_creds_opt is a static structure and for ABI reason it can't grow, ie can't add new functionality. +The reason \fBkrb5_get_init_creds_opt_init()\fP is deprecated is that krb5_get_init_creds_opt is a static structure and for ABI reason it can't grow, ie can't add new functionality\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_keytab_key_proc (krb5_context context, krb5_enctype enctype, krb5_salt salt, krb5_const_pointer keyseed, krb5_keyblock ** key)" -.PP -Deprecated: use krb5_get_init_creds() and friends. +Deprecated: use krb5_get_init_creds() and friends\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes (krb5_context context, krb5_keytype keytype, unsigned * len, krb5_enctype ** val)" -.PP -Deprecated: keytypes doesn't exists, they are really enctypes. +Deprecated: keytypes doesn't exists, they are really enctypes\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes_default (krb5_context context, krb5_keytype keytype, unsigned * len, krb5_enctype ** val)" -.PP -Deprecated: keytypes doesn't exists, they are really enctypes. +Deprecated: keytypes doesn't exists, they are really enctypes\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_string (krb5_context context, krb5_keytype keytype, char ** string)" -.PP -Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_enctype_to_string(). +Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_enctype_to_string()\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_password_key_proc (krb5_context context, krb5_enctype type, krb5_salt salt, krb5_const_pointer keyseed, krb5_keyblock ** key)" -.PP -Deprecated: use krb5_get_init_creds() and friends. +Deprecated: use krb5_get_init_creds() and friends\&. .SS "KRB5_LIB_FUNCTION krb5_realm* KRB5_LIB_CALL krb5_princ_realm (krb5_context context, krb5_principal principal)" -.PP Deprecated: use \fBkrb5_principal_get_realm()\fP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_princ_set_realm (krb5_context context, krb5_principal principal, krb5_realm * realm)" -.PP Deprecated: use \fBkrb5_principal_set_realm()\fP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_error_string (krb5_context context, const char * fmt, ...)" -.PP -Set the error message returned by krb5_get_error_string(). +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_error_string (krb5_context context, const char * fmt, \&.\&.\&.)" +Set the error message returned by \fBkrb5_get_error_string()\fP\&. .PP -Deprecated: use krb5_get_error_message() +Deprecated: use \fBkrb5_get_error_message()\fP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br \fIfmt\fP error message to free .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_string_to_keytype (krb5_context context, const char * string, krb5_keytype * keytype)" -.PP -Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_string_to_enctype(). +Deprecated: keytypes doesn't exists, they are really enctypes in most cases, use krb5_string_to_enctype()\&. .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vset_error_string (krb5_context context, const char * fmt, va_list args)" +Set the error message returned by \fBkrb5_get_error_string()\fP, deprecated, use \fBkrb5_set_error_message()\fP\&. .PP -Set the error message returned by krb5_get_error_string(), deprecated, use \fBkrb5_set_error_message()\fP. -.PP -Deprecated: use krb5_vset_error_message() +Deprecated: use \fBkrb5_vset_error_message()\fP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br -\fImsg\fP error message to free +\fIfmt\fP error message to free +.br +\fIargs\fP variable argument list vector .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_digest.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_digest.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_digest.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_digest.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 digest service" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_digest" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 digest service \- +krb5_digest \- Heimdal Kerberos 5 digest service +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -16,23 +19,25 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_digest_probe (krb5_context context, krb5_realm realm, krb5_ccache ccache, unsigned * flags)" +Get the supported/allowed mechanism for this principal\&. .PP -Get the supported/allowed mechanism for this principal. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Keberos context. +\fIcontext\fP A Keberos context\&. .br -\fIrealm\fP The realm of the KDC. +\fIrealm\fP The realm of the KDC\&. .br -\fIccache\fP The credential cache to use when talking to the KDC. +\fIccache\fP The credential cache to use when talking to the KDC\&. .br -\fIflags\fP The supported mechanism. +\fIflags\fP The supported mechanism\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_err.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_err.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_err.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_error.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_error.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_error.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_error.3 @@ -1,12 +1,18 @@ -.TH "Heimdal Kerberos 5 error reporting functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_error" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 error reporting functions \- +krb5_error \- Heimdal Kerberos 5 error reporting functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c .ti -1c +.RI "KRB5_LIB_FUNCTION char *KRB5_LIB_CALL \fBkrb5_get_error_string\fP (krb5_context context) KRB5_DEPRECATED_FUNCTION('Use \fBkrb5_get_error_message\fP instead')" +.br +.ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_eai_to_heim_errno\fP (int eai_errno, int system_error)" .br .ti -1c @@ -16,10 +22,61 @@ .RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_clear_error_message\fP (krb5_context context)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_set_error_message\fP (krb5_context context, krb5_error_code ret, const char *fmt,...) __attribute__((format(printf" +.RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_set_error_message\fP (krb5_context context, krb5_error_code ret, const char *fmt,\&.\&.\&.) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_vset_error_message\fP (krb5_context context, krb5_error_code ret, const char *fmt, va_list args) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_prepend_error_message\fP (krb5_context context, krb5_error_code ret, const char *fmt,\&.\&.\&.) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_vprepend_error_message\fP (krb5_context context, krb5_error_code ret, const char *fmt, va_list args) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_get_error_message\fP (krb5_context context, krb5_error_code code)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_free_error_message\fP (krb5_context context, const char *msg)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_vwarn\fP (krb5_context context, krb5_error_code code, const char *fmt, va_list ap) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_warn\fP (krb5_context context, krb5_error_code code, const char *fmt,\&.\&.\&.) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_vwarnx\fP (krb5_context context, const char *fmt, va_list ap) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_warnx\fP (krb5_context context, const char *fmt,\&.\&.\&.) __attribute__((__format__(__printf__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_verr\fP (krb5_context context, int eval, krb5_error_code code, const char *fmt, va_list ap) __attribute__((__noreturn__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_err\fP (krb5_context context, int eval, krb5_error_code code, const char *fmt,\&.\&.\&.) __attribute__((__noreturn__" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_vwarn\fP (krb5_context context, krb5_error_code code, const char *fmt, va_list ap) __attribute__((format(printf" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_verrx\fP (krb5_context context, int eval, const char *fmt, va_list ap) __attribute__((__noreturn__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_errx\fP (krb5_context context, int eval, const char *fmt,\&.\&.\&.) __attribute__((__noreturn__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_vabort\fP (krb5_context context, krb5_error_code code, const char *fmt, va_list ap) __attribute__((__noreturn__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_abort\fP (krb5_context context, krb5_error_code code, const char *fmt,\&.\&.\&.) __attribute__((__noreturn__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_abortx\fP (krb5_context context, const char *fmt,\&.\&.\&.) __attribute__((__noreturn__" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_set_warn_dest\fP (krb5_context context, krb5_log_facility *fac)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_log_facility *KRB5_LIB_CALL \fBkrb5_get_warn_dest\fP (krb5_context context)" .br .in -1c .SH "Detailed Description" @@ -27,55 +84,249 @@ .SH "Function Documentation" .PP -.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_message (krb5_context context)" +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abort (krb5_context context, krb5_error_code code, const char * fmt, \&.\&.\&.)" +Log a warning to the log, default stderr, include the error from the last failure and then abort\&. .PP -Clears the error message from the Kerberos 5 context. +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIcode\fP error code of the last error +.br +\fIfmt\fP message to print +.br +\fI\&.\&.\&.\fP arguments for format string +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abortx (krb5_context context, const char * fmt, \&.\&.\&.)" +Log a warning to the log, default stderr, and then abort\&. .PP -\fBParameters:\fP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIfmt\fP printf format string of message to print +.br +\fI\&.\&.\&.\fP arguments for format string +.RE +.PP + +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_message (krb5_context context)" +Clears the error message from the Kerberos 5 context\&. +.PP +\fBParameters\fP .RS 4 \fIcontext\fP The Kerberos 5 context to clear .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_eai_to_heim_errno (int eai_errno, int system_error)" +Convert the getaddrinfo() error code to a Kerberos et error code\&. +.PP +\fBParameters\fP +.RS 4 +\fIeai_errno\fP contains the error code from getaddrinfo()\&. +.br +\fIsystem_error\fP should have the value of errno after the failed getaddrinfo()\&. +.RE +.PP +\fBReturns\fP +.RS 4 +Kerberos error code representing the EAI errors\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err (krb5_context context, int eval, krb5_error_code code, const char * fmt, \&.\&.\&.)" +Log a warning to the log, default stderr, include bthe error from the last failure and then exit\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIeval\fP the exit code to exit with +.br +\fIcode\fP error code of the last error +.br +\fIfmt\fP message to print +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_errx (krb5_context context, int eval, const char * fmt, \&.\&.\&.)" +Log a warning to the log, default stderr, and then exit\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIeval\fP the exit code to exit with +.br +\fIfmt\fP message to print +.RE .PP -Convert the getaddrinfo() error code to a Kerberos et error code. + +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_message (krb5_context context, const char * msg)" +Free the error message returned by \fBkrb5_get_error_message()\fP\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIeai_errno\fP contains the error code from getaddrinfo(). +\fIcontext\fP Kerberos context +.br +\fImsg\fP error message to free, returned byg \fBkrb5_get_error_message()\fP\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_get_error_message (krb5_context context, krb5_error_code code)" +Return the error message for `code' in context\&. On memory allocation error the function returns NULL\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP Kerberos 5 context .br -\fIsystem_error\fP should have the value of errno after the failed getaddrinfo(). +\fIcode\fP Error code related to the error .RE .PP -\fBReturns:\fP +\fBReturns\fP +.RS 4 +an error string, needs to be freed with \fBkrb5_free_error_message()\fP\&. The functions return NULL on error\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION char* KRB5_LIB_CALL krb5_get_error_string (krb5_context context)" +Return the error message in context\&. On error or no error string, the function returns NULL\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP Kerberos 5 context +.RE +.PP +\fBReturns\fP +.RS 4 +an error string, needs to be freed with \fBkrb5_free_error_message()\fP\&. The functions return NULL on error\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_log_facility* KRB5_LIB_CALL krb5_get_warn_dest (krb5_context context)" +Get the default logging facility\&. +.PP +\fBParameters\fP .RS 4 -Kerberos error code representing the EAI errors. +\fIcontext\fP A Kerberos 5 context .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_errno_to_heim_errno (int eai_errno)" +Convert the gethostname() error code (h_error) to a Kerberos et error code\&. .PP -Convert the gethostname() error code (h_error) to a Kerberos et error code. +\fBParameters\fP +.RS 4 +\fIeai_errno\fP contains the error code from gethostname()\&. +.RE .PP -\fBParameters:\fP +\fBReturns\fP .RS 4 -\fIeai_errno\fP contains the error code from gethostname(). +Kerberos error code representing the gethostname errors\&. .RE .PP -\fBReturns:\fP + +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_prepend_error_message (krb5_context context, krb5_error_code ret, const char * fmt, \&.\&.\&.)" +Prepend the context full error string for a specific error code\&. The error that is stored should be internationalized\&. +.PP +The if context is NULL, no error string is stored\&. +.PP +\fBParameters\fP .RS 4 -Kerberos error code representing the gethostname errors. +\fIcontext\fP Kerberos 5 context +.br +\fIret\fP The error code +.br +\fIfmt\fP Error string for the error code +.br +\fI\&.\&.\&.\fP printf(3) style parameters\&. .RE .PP -.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_error_message (krb5_context context, krb5_error_code ret, const char * fmt, ...)" +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_error_message (krb5_context context, krb5_error_code ret, const char * fmt, \&.\&.\&.)" +Set the context full error string for a specific error code\&. The error that is stored should be internationalized\&. +.PP +The if context is NULL, no error string is stored\&. .PP -Set the context full error string for a specific error code. The error that is stored should be internationalized. +\fBParameters\fP +.RS 4 +\fIcontext\fP Kerberos 5 context +.br +\fIret\fP The error code +.br +\fIfmt\fP Error string for the error code +.br +\fI\&.\&.\&.\fP printf(3) style parameters\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_warn_dest (krb5_context context, krb5_log_facility * fac)" +Set the default logging facility\&. .PP -The if context is NULL, no error string is stored. +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIfac\fP Facility to use for logging\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vabort (krb5_context context, krb5_error_code code, const char * fmt, va_list ap)" +Log a warning to the log, default stderr, include bthe error from the last failure and then abort\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIcode\fP error code of the last error +.br +\fIfmt\fP message to print +.br +\fIap\fP arguments +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verr (krb5_context context, int eval, krb5_error_code code, const char * fmt, va_list ap)" +Log a warning to the log, default stderr, include bthe error from the last failure and then exit\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIeval\fP the exit code to exit with +.br +\fIcode\fP error code of the last error +.br +\fIfmt\fP message to print +.br +\fIap\fP arguments +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verrx (krb5_context context, int eval, const char * fmt, va_list ap)" +Log a warning to the log, default stderr, and then exit\&. .PP -\fBParameters:\fP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context +.br +\fIeval\fP the exit code to exit with +.br +\fIfmt\fP message to print +.br +\fIap\fP arguments +.RE +.PP + +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vprepend_error_message (krb5_context context, krb5_error_code ret, const char * fmt, va_list args)" +Prepend the contexts's full error string for a specific error code\&. +.PP +The if context is NULL, no error string is stored\&. +.PP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -83,17 +334,33 @@ .br \fIfmt\fP Error string for the error code .br -\fI...\fP printf(3) style parameters. +\fIargs\fP printf(3) style parameters\&. .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarn (krb5_context context, krb5_error_code code, const char * fmt, va_list ap)" +.SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vset_error_message (krb5_context context, krb5_error_code ret, const char * fmt, va_list args)" +Set the context full error string for a specific error code\&. .PP -Log a warning to the log, default stderr, include the error from the last failure. +The if context is NULL, no error string is stored\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP Kerberos 5 context +.br +\fIret\fP The error code +.br +\fIfmt\fP Error string for the error code +.br +\fIargs\fP printf(3) style parameters\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarn (krb5_context context, krb5_error_code code, const char * fmt, va_list ap)" +Log a warning to the log, default stderr, include the error from the last failure\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context\&. .br \fIcode\fP error code of the last error .br @@ -103,3 +370,43 @@ .RE .PP +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarnx (krb5_context context, const char * fmt, va_list ap)" +Log a warning to the log, default stderr\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context\&. +.br +\fIfmt\fP message to print +.br +\fIap\fP arguments +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warn (krb5_context context, krb5_error_code code, const char * fmt, \&.\&.\&.)" +Log a warning to the log, default stderr, include the error from the last failure\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context\&. +.br +\fIcode\fP error code of the last error +.br +\fIfmt\fP message to print +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warnx (krb5_context context, const char * fmt, \&.\&.\&.)" +Log a warning to the log, default stderr\&. +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A Kerberos 5 context\&. +.br +\fIfmt\fP message to print +.RE +.PP + +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_errx.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_errx.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_errx.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_fileformats.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_fileformats.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_fileformats.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_fileformats.3 @@ -1,118 +1,119 @@ -.TH "krb5_fileformats" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_fileformats" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME krb5_fileformats \- File formats + .SH "File formats" .PP -This section documents the diffrent file formats that are used in Heimdal and other Kerberos implementations. +This section documents the diffrent file formats that are used in Heimdal and other Kerberos implementations\&. .SS "keytab" -The keytab binary format is not a standard format. The format has evolved and may continue to. It is however understood by several Kerberos implementations including Heimdal, MIT, Sun's Java ktab and are created by the ktpass.exe utility from Windows. So it has established itself as the defacto format for storing Kerberos keys. +The keytab binary format is not a standard format\&. The format has evolved and may continue to\&. It is however understood by several Kerberos implementations including Heimdal, MIT, Sun's Java ktab and are created by the ktpass\&.exe utility from Windows\&. So it has established itself as the defacto format for storing Kerberos keys\&. .PP -The following C-like structure definitions illustrate the MIT keytab file format. All values are in network byte order. All text is ASCII. +The following C-like structure definitions illustrate the MIT keytab file format\&. All values are in network byte order\&. All text is ASCII\&. .PP .PP .nf - keytab { - uint16_t file_format_version; # 0x502 - keytab_entry entries[*]; - }; +keytab { + uint16_t file_format_version; # 0x502 + keytab_entry entries[*]; +}; - keytab_entry { - int32_t size; - uint16_t num_components; # subtract 1 if version 0x501 - counted_octet_string realm; - counted_octet_string components[num_components]; - uint32_t name_type; # not present if version 0x501 - uint32_t timestamp; - uint8_t vno8; - keyblock key; - uint32_t vno; #only present if >= 4 bytes left in entry - uint32_t flags; #only present if >= 4 bytes left in entry - }; +keytab_entry { + int32_t size; + uint16_t num_components; # subtract 1 if version 0x501 + counted_octet_string realm; + counted_octet_string components[num_components]; + uint32_t name_type; # not present if version 0x501 + uint32_t timestamp; + uint8_t vno8; + keyblock key; + uint32_t vno; #only present if >= 4 bytes left in entry + uint32_t flags; #only present if >= 4 bytes left in entry +}; - counted_octet_string { - uint16_t length; - uint8_t data[length]; - }; +counted_octet_string { + uint16_t length; + uint8_t data[length]; +}; - keyblock { - uint16_t type; - counted_octet_string; - }; +keyblock { + uint16_t type; + counted_octet_string; +}; .fi .PP .PP -All numbers are stored in network byteorder (big endian) format. +All numbers are stored in network byteorder (big endian) format\&. .PP -The keytab file format begins with the 16 bit file_format_version which at the time this document was authored is 0x502. The format of older keytabs is described at the end of this document. +The keytab file format begins with the 16 bit file_format_version which at the time this document was authored is 0x502\&. The format of older keytabs is described at the end of this document\&. .PP -The file_format_version is immediately followed by an array of keytab_entry structures which are prefixed with a 32 bit size indicating the number of bytes that follow in the entry. Note that the size should be evaluated as signed. This is because a negative value indicates that the entry is in fact empty (e.g. it has been deleted) and that the negative value of that negative value (which is of course a positive value) is the offset to the next keytab_entry. Based on these size values alone the entire keytab file can be traversed. +The file_format_version is immediately followed by an array of keytab_entry structures which are prefixed with a 32 bit size indicating the number of bytes that follow in the entry\&. Note that the size should be evaluated as signed\&. This is because a negative value indicates that the entry is in fact empty (e\&.g\&. it has been deleted) and that the negative value of that negative value (which is of course a positive value) is the offset to the next keytab_entry\&. Based on these size values alone the entire keytab file can be traversed\&. .PP -The size is followed by a 16 bit num_components field indicating the number of counted_octet_string components in the components array. +The size is followed by a 16 bit num_components field indicating the number of counted_octet_string components in the components array\&. .PP -The num_components field is followed by a counted_octet_string representing the realm of the principal. +The num_components field is followed by a counted_octet_string representing the realm of the principal\&. .PP -A counted_octet_string is simply an array of bytes prefixed with a 16 bit length. For the realm and name components, the counted_octet_string bytes are ASCII encoded text with no zero terminator. +A counted_octet_string is simply an array of bytes prefixed with a 16 bit length\&. For the realm and name components, the counted_octet_string bytes are ASCII encoded text with no zero terminator\&. .PP -Following the realm is the components array that represents the name of the principal. The text of these components may be joined with slashs to construct the typical SPN representation. For example, the service principal HTTP/www.foo.net@FOO.NET would consist of name components 'HTTP' followed by 'www.foo.net'. +Following the realm is the components array that represents the name of the principal\&. The text of these components may be joined with slashs to construct the typical SPN representation\&. For example, the service principal HTTP/www\&.foo\&.net@FOO\&.NET would consist of name components 'HTTP' followed by 'www\&.foo\&.net'\&. .PP -Following the components array is the 32 bit name_type (e.g. 1 is KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc). In practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL. +Following the components array is the 32 bit name_type (e\&.g\&. 1 is KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc)\&. In practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL\&. .PP -The 32 bit timestamp indicates the time the key was established for that principal. The value represents the number of seconds since Jan 1, 1970. +The 32 bit timestamp indicates the time the key was established for that principal\&. The value represents the number of seconds since Jan 1, 1970\&. .PP -The 8 bit vno8 field is the version number of the key. This value is overridden by the 32 bit vno field if it is present. The vno8 field is filled with the lower 8 bits of the 32 bit protocol kvno field. +The 8 bit vno8 field is the version number of the key\&. This value is overridden by the 32 bit vno field if it is present\&. The vno8 field is filled with the lower 8 bits of the 32 bit protocol kvno field\&. .PP -The keyblock structure consists of a 16 bit value indicating the encryption type and is a counted_octet_string containing the key. The encryption type is the same as the Kerberos standard (e.g. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, etc). +The keyblock structure consists of a 16 bit value indicating the encryption type and is a counted_octet_string containing the key\&. The encryption type is the same as the Kerberos standard (e\&.g\&. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, etc)\&. .PP -The last field of the keytab_entry structure is optional. If the size of the keytab_entry indicates that there are at least 4 bytes remaining, a 32 bit value representing the key version number is present. This value supersedes the 8 bit vno8 value preceeding the keyblock. +The last field of the keytab_entry structure is optional\&. If the size of the keytab_entry indicates that there are at least 4 bytes remaining, a 32 bit value representing the key version number is present\&. This value supersedes the 8 bit vno8 value preceeding the keyblock\&. .PP Older keytabs with a file_format_version of 0x501 are different in three ways: .PP .IP "\(bu" 2 -All integers are in host byte order [1]. +All integers are in host byte order [1]\&. .IP "\(bu" 2 -The num_components field is 1 too large (i.e. after decoding, decrement by 1). +The num_components field is 1 too large (i\&.e\&. after decoding, decrement by 1)\&. .IP "\(bu" 2 -The 32 bit name_type field is not present. +The 32 bit name_type field is not present\&. .PP .PP -[1] The file_format_version field should really be treated as two separate 8 bit quantities representing the major and minor version number respectively. +[1] The file_format_version field should really be treated as two separate 8 bit quantities representing the major and minor version number respectively\&. .SS "Heimdal database dump file" -Format of the Heimdal text dump file as of Heimdal 0.6.3: +Format of the Heimdal text dump file as of Heimdal 0\&.6\&.3: .PP -Each line in the dump file is one entry in the database. +Each line in the dump file is one entry in the database\&. .PP -Each field of a line is separated by one or more spaces, with the exception of fields consisting of principals containing spaces, where space can be quoted with \\ and \\ is quoted by \\. +Each field of a line is separated by one or more spaces, with the exception of fields consisting of principals containing spaces, where space can be quoted with \\ and \\ is quoted by . .PP Fields and their types are: .PP .PP .nf - Quoted principal (quote character is \) [string] - Keys [keys] - Created by [event] - Modified by [event optional] - Valid start time [time optional] - Valid end time [time optional] - Password end valid time [time optional] - Max lifetime of ticket [time optional] - Max renew time of ticket [integer optional] - Flags [hdb flags] - Generation number [generation optional] - Extensions [extentions optional] +Quoted princial (quote character is \) [string] +Keys [keys] +Created by [event] +Modified by [event optional] +Valid start time [time optional] +Valid end time [time optional] +Password end valid time [time optional] +Max lifetime of ticket [time optional] +Max renew time of ticket [integer optional] +Flags [hdb flags] +Generation number [generation optional] +Extensions [extentions optional] .fi .PP .PP -Fields following these silently are ignored. +Fields following these silently are ignored\&. .PP -All optional fields will be skipped if they fail to parse (or comprise the optional field marker of '-', w/o quotes). +All optional fields will be skipped if they fail to parse (or comprise the optional field marker of '-', w/o quotes)\&. .PP Example: .PP .PP .nf - fred\@CODE.COM 27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:- 20020415130120:admin\@CODE.COM 20041221112428:fred\@CODE.COM - - - 86400 604800 126 20020415130120:793707:28 - +fred\@CODE\&.COM 27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:- 20020415130120:admin\@CODE\&.COM 20041221112428:fred\@CODE\&.COM - - - 86400 604800 126 20020415130120:793707:28 - .fi .PP .PP @@ -124,39 +125,39 @@ .PP .PP .nf - kvno:[masterkvno:keytype:keydata:salt]{zero or more separated by :} +kvno:[masterkvno:keytype:keydata:salt]{zero or more separated by :} .fi .PP .PP -kvno is the key version number. +kvno is the key version number\&. .PP keydata is hex-encoded .PP -masterkvno is the kvno of the database master key. If this field is empty, the kadmin load and merge operations will encrypt the key data with the master key if there is one. Otherwise the key data will be imported asis. +masterkvno is the kvno of the database master key\&. If this field is empty, the kadmin load and merge operations will encrypt the key data with the master key if there is one\&. Otherwise the key data will be imported asis\&. .PP salt is encoded as '-' (no/default salt) or .PP .PP .nf - salt-type / - salt-type / 'string' - salt-type / hex-encoded-data +salt-type / +salt-type / "string" +salt-type / hex-encoded-data .fi .PP .PP -keytype is the protocol enctype number; see enum ENCTYPE in include/krb5_asn1.h for values. +keytype is the protocol enctype number; see enum ENCTYPE in include/krb5_asn1\&.h for values\&. .PP Example: .PP .nf - 27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:- +27:1:16:e8b4c8fc7e60b9e641dcf4cff3f08a701d982a2f89ba373733d26ca59ba6c789666f6b8bfcf169412bb1e5dceb9b33cda29f3412:-:1:3:4498a933881178c744f4232172dcd774c64e81fa6d05ecdf643a7e390624a0ebf3c7407a:-:1:2:b01934b13eb795d76f3a80717d469639b4da0cfb644161340ef44fdeb375e54d684dbb85:-:1:1:ea8e16d8078bf60c781da90f508d4deccba70595258b9d31888d33987cd31af0c9cced2e:- .fi .PP .PP .PP .nf - kvno=27,{key: masterkvno=1,keytype=des3-cbc-sha1,keydata=..., default salt}... +kvno=27,{key: masterkvno=1,keytype=des3-cbc-sha1,keydata=\&.\&.\&., default salt}\&.\&.\&. .fi .PP .PP @@ -164,17 +165,17 @@ time .PP .PP -Format of the time is: YYYYmmddHHMMSS, corresponding to strftime format '%Y%m%d%k%M%S'. +Format of the time is: YYYYmmddHHMMSS, corresponding to strftime format '%Y%m%d%k%M%S'\&. .PP -Time is expressed in UTC. +Time is expressed in UTC\&. .PP -Time can be optional (using -), when the time 0 is used. +Time can be optional (using -), when the time 0 is used\&. .PP Example: .PP .PP .nf - 20041221112428 +20041221112428 .fi .PP .PP @@ -184,18 +185,18 @@ .PP .PP .nf - time:principal +time:principal .fi .PP .PP time is as given in format time .PP -principal is a string. Not quoting it may not work in earlier versions of Heimdal. +principal is a string\&. Not quoting it may not work in earlier versions of Heimdal\&. .PP Example: .PP .nf - 20041221112428:bloggs\@CODE.COM +20041221112428:bloggs\@CODE\&.COM .fi .PP @@ -204,7 +205,7 @@ hdb flags .PP .PP -Integer encoding of HDB flags, see HDBFlags in lib/hdb/hdb.asn1. Each bit in the integer is the same as the bit in the specification. +Integer encoding of HDB flags, see HDBFlags in lib/hdb/hdb\&.asn1\&. Each bit in the integer is the same as the bit in the specification\&. .PP .IP "\(bu" 2 generation: @@ -212,11 +213,11 @@ .PP .PP .nf - time:usec:gen +time:usec:gen .fi .PP .PP -usec is a the microsecond, integer. gen is generation number, integer. +usec is a the microsecond, integer\&. gen is generation number, integer\&. .PP The generation can be defaulted (using '-') or the empty string .PP @@ -226,8 +227,8 @@ .PP .PP .nf - first-hex-encoded-HDB-Extension[:second-...] +first-hex-encoded-HDB-Extension[:second-\&.\&.\&.] .fi .PP .PP -HDB-extension is encoded the DER encoded HDB-Extension from lib/hdb/hdb.asn1. Consumers HDB extensions should be aware that unknown entires needs to be preserved even thought the ASN.1 data content might be unknown. There is a critical flag in the data to show to the KDC that the entry MUST be understod if the entry is to be used. +HDB-extension is encoded the DER encoded HDB-Extension from lib/hdb/hdb\&.asn1\&. Consumers HDB extensions should be aware that unknown entires needs to be preserved even thought the ASN\&.1 data content might be unknown\&. There is a critical flag in the data to show to the KDC that the entry MUST be understod if the entry is to be used\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_free_error_message.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_free_error_message.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_free_error_message.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_generate_random.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_generate_random.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_generate_random.3 @@ -0,0 +1 @@ +.so man3/krb5_crypto.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_generate_random_block.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_generate_random_block.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_generate_random_block.3 @@ -0,0 +1 @@ +.so man3/krb5_crypto.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_err_text.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_err_text.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_err_text.3 @@ -0,0 +1 @@ +.so man3/krb5.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_error_message.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_error_message.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_error_message.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_error_string.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_error_string.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_error_string.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_warn_dest.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_warn_dest.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_get_warn_dest.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_init_creds_intro.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_init_creds_intro.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_init_creds_intro.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_init_creds_intro.3 @@ -1,8 +1,9 @@ -.TH "krb5_init_creds_intro" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_init_creds_intro" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME krb5_init_creds_intro \- The initial credential handing functions + .SH "Initial credential" .PP -Functions to get initial credentials: \fBHeimdal Kerberos 5 credential handing functions\fP . +Functions to get initial credentials: \fBHeimdal Kerberos 5 credential handing functions\fP \&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_introduction.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_introduction.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_introduction.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_introduction.3 @@ -1,259 +1,260 @@ -.TH "krb5_introduction" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_introduction" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME krb5_introduction \- Introduction to the Kerberos 5 API + .SH "Kerberos 5 API Overview" .PP -All functions are documented in manual pages. This section tries to give an overview of the major components used in Kerberos library, and point to where to look for a specific function. +All functions are documented in manual pages\&. This section tries to give an overview of the major components used in Kerberos library, and point to where to look for a specific function\&. .SS "Kerberos context" -A kerberos context (krb5_context) holds all per thread state. All global variables that are context specific are stored in this structure, including default encryption types, credential cache (for example, a ticket file), and default realms. +A kerberos context (krb5_context) holds all per thread state\&. All global variables that are context specific are stored in this structure, including default encryption types, credential cache (for example, a ticket file), and default realms\&. .PP -The internals of the structure should never be accessed directly, functions exist for extracting information. +The internals of the structure should never be accessed directly, functions exist for extracting information\&. .PP -See the manual page for \fBkrb5_init_context()\fP how to create a context and module \fBHeimdal Kerberos 5 library\fP for more information about the functions. +See the manual page for \fBkrb5_init_context()\fP how to create a context and module \fBHeimdal Kerberos 5 library\fP for more information about the functions\&. .SS "Kerberos authentication context" -Kerberos authentication context (krb5_auth_context) holds all context related to an authenticated connection, in a similar way to the kerberos context that holds the context for the thread or process. +Kerberos authentication context (krb5_auth_context) holds all context related to an authenticated connection, in a similar way to the kerberos context that holds the context for the thread or process\&. .PP -The krb5_auth_context is used by various functions that are directly related to authentication between the server/client. Example of data that this structure contains are various flags, addresses of client and server, port numbers, keyblocks (and subkeys), sequence numbers, replay cache, and checksum types. +The krb5_auth_context is used by various functions that are directly related to authentication between the server/client\&. Example of data that this structure contains are various flags, addresses of client and server, port numbers, keyblocks (and subkeys), sequence numbers, replay cache, and checksum types\&. .SS "Kerberos principal" -The Kerberos principal is the structure that identifies a user or service in Kerberos. The structure that holds the principal is the krb5_principal. There are function to extract the realm and elements of the principal, but most applications have no reason to inspect the content of the structure. +The Kerberos principal is the structure that identifies a user or service in Kerberos\&. The structure that holds the principal is the krb5_principal\&. There are function to extract the realm and elements of the principal, but most applications have no reason to inspect the content of the structure\&. .PP -The are several ways to create a principal (with different degree of portability), and one way to free it. +The are several ways to create a principal (with different degree of portability), and one way to free it\&. .PP -See also the page \fBThe principal handing functions.\fP for more information and also module \fBHeimdal Kerberos 5 principal functions\fP. +See also the page \fBThe principal handing functions\&.\fP for more information and also module \fBHeimdal Kerberos 5 principal functions\fP\&. .SS "Credential cache" -A credential cache holds the tickets for a user. A given user can have several credential caches, one for each realm where the user have the initial tickets (the first krbtgt). +A credential cache holds the tickets for a user\&. A given user can have several credential caches, one for each realm where the user have the initial tickets (the first krbtgt)\&. .PP -The credential cache data can be stored internally in different way, each of them for different proposes. File credential (FILE) caches and processes based (KCM) caches are for permanent storage. While memory caches (MEMORY) are local caches to the local process. +The credential cache data can be stored internally in different way, each of them for different proposes\&. File credential (FILE) caches and processes based (KCM) caches are for permanent storage\&. While memory caches (MEMORY) are local caches to the local process\&. .PP -Caches are opened with \fBkrb5_cc_resolve()\fP or created with \fBkrb5_cc_new_unique()\fP. +Caches are opened with \fBkrb5_cc_resolve()\fP or created with \fBkrb5_cc_new_unique()\fP\&. .PP -If the cache needs to be opened again (using \fBkrb5_cc_resolve()\fP) \fBkrb5_cc_close()\fP will close the handle, but not the remove the cache. \fBkrb5_cc_destroy()\fP will zero out the cache, remove the cache so it can no longer be referenced. +If the cache needs to be opened again (using \fBkrb5_cc_resolve()\fP) \fBkrb5_cc_close()\fP will close the handle, but not the remove the cache\&. \fBkrb5_cc_destroy()\fP will zero out the cache, remove the cache so it can no longer be referenced\&. .PP -See also \fBThe credential cache functions\fP and \fBHeimdal Kerberos 5 credential cache functions\fP . +See also \fBThe credential cache functions\fP and \fBHeimdal Kerberos 5 credential cache functions\fP \&. .SS "Kerberos errors" -Kerberos errors are based on the com_err library. All error codes are 32-bit signed numbers, the first 24 bits define what subsystem the error originates from, and last 8 bits are 255 error codes within the library. Each error code have fixed string associated with it. For example, the error-code -1765328383 have the symbolic name KRB5KDC_ERR_NAME_EXP, and associated error string ``Client's entry in database has expired''. +Kerberos errors are based on the com_err library\&. All error codes are 32-bit signed numbers, the first 24 bits define what subsystem the error originates from, and last 8 bits are 255 error codes within the library\&. Each error code have fixed string associated with it\&. For example, the error-code -1765328383 have the symbolic name KRB5KDC_ERR_NAME_EXP, and associated error string ``Client's entry in database has expired''\&. .PP -This is a great improvement compared to just getting one of the unix error-codes back. However, Heimdal have an extention to pass back customised errors messages. Instead of getting ``Key table entry not found'', the user might back ``failed to find host/host.example.com@EXAMLE.COM(kvno 3) in keytab /etc/krb5.keytab (des-cbc-crc)''. This improves the chance that the user find the cause of the error so you should use the customised error message whenever it's available. +This is a great improvement compared to just getting one of the unix error-codes back\&. However, Heimdal have an extention to pass back customised errors messages\&. Instead of getting \fCKey table entry not found'', the user might back\fPfailed to find host/host\&.example\&.com@EXAMLE\&.COM(kvno 3) in keytab /etc/krb5\&.keytab (des-cbc-crc)''\&. This improves the chance that the user find the cause of the error so you should use the customised error message whenever it's available\&. .PP -See also module \fBHeimdal Kerberos 5 error reporting functions\fP . +See also module \fBHeimdal Kerberos 5 error reporting functions\fP \&. .SS "Keytab management" -A keytab is a storage for locally stored keys. Heimdal includes keytab support for Kerberos 5 keytabs, Kerberos 4 srvtab, AFS-KeyFile's, and for storing keys in memory. +A keytab is a storage for locally stored keys\&. Heimdal includes keytab support for Kerberos 5 keytabs, Kerberos 4 srvtab, AFS-KeyFile's, and for storing keys in memory\&. .PP -Keytabs are used for servers and long-running services. +Keytabs are used for servers and long-running services\&. .PP -See also \fBThe keytab handing functions\fP and \fBHeimdal Kerberos 5 keytab handling functions\fP . +See also \fBThe keytab handing functions\fP and \fBHeimdal Kerberos 5 keytab handling functions\fP \&. .SS "Kerberos crypto" -Heimdal includes a implementation of the Kerberos crypto framework, all crypto operations. To create a crypto context call \fBkrb5_crypto_init()\fP. +Heimdal includes a implementation of the Kerberos crypto framework, all crypto operations\&. To create a crypto context call \fBkrb5_crypto_init()\fP\&. .PP -See also module \fBHeimdal Kerberos 5 cryptography functions\fP . +See also module \fBHeimdal Kerberos 5 cryptography functions\fP \&. .SH "Walkthrough of a sample Kerberos 5 client" .PP -This example contains parts of a sample TCP Kerberos 5 clients, if you want a real working client, please look in appl/test directory in the Heimdal distribution. +This example contains parts of a sample TCP Kerberos 5 clients, if you want a real working client, please look in appl/test directory in the Heimdal distribution\&. .PP -All Kerberos error-codes that are returned from kerberos functions in this program are passed to krb5_err, that will print a descriptive text of the error code and exit. Graphical programs can convert error-code to a human readable error-string with the krb5_get_error_message() function. +All Kerberos error-codes that are returned from kerberos functions in this program are passed to krb5_err, that will print a descriptive text of the error code and exit\&. Graphical programs can convert error-code to a human readable error-string with the \fBkrb5_get_error_message()\fP function\&. .PP -Note that you should not use any Kerberos function before \fBkrb5_init_context()\fP have completed successfully. That is the reason err() is used when \fBkrb5_init_context()\fP fails. +Note that you should not use any Kerberos function before \fBkrb5_init_context()\fP have completed successfully\&. That is the reason err() is used when \fBkrb5_init_context()\fP fails\&. .PP -First the client needs to call krb5_init_context to initialise the Kerberos 5 library. This is only needed once per thread in the program. If the function returns a non-zero value it indicates that either the Kerberos implementation is failing or it's disabled on this host. +First the client needs to call krb5_init_context to initialise the Kerberos 5 library\&. This is only needed once per thread in the program\&. If the function returns a non-zero value it indicates that either the Kerberos implementation is failing or it's disabled on this host\&. .PP .PP .nf - #include +#include - int - main(int argc, char **argv) - { - krb5_context context; +int +main(int argc, char **argv) +{ + krb5_context context; - if (krb5_init_context(&context)) - errx (1, 'krb5_context'); + if (krb5_init_context(&context)) + errx (1, "krb5_context"); .fi .PP .PP -Now the client wants to connect to the host at the other end. The preferred way of doing this is using getaddrinfo (for operating system that have this function implemented), since getaddrinfo is neutral to the address type and can use any protocol that is available. +Now the client wants to connect to the host at the other end\&. The preferred way of doing this is using getaddrinfo (for operating system that have this function implemented), since getaddrinfo is neutral to the address type and can use any protocol that is available\&. .PP .PP .nf - struct addrinfo *ai, *a; - struct addrinfo hints; - int error; +struct addrinfo *ai, *a; +struct addrinfo hints; +int error; - memset (&hints, 0, sizeof(hints)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; +memset (&hints, 0, sizeof(hints)); +hints\&.ai_socktype = SOCK_STREAM; +hints\&.ai_protocol = IPPROTO_TCP; - error = getaddrinfo (hostname, 'pop3', &hints, &ai); - if (error) - errx (1, '%s: %s', hostname, gai_strerror(error)); +error = getaddrinfo (hostname, "pop3", &hints, &ai); +if (error) + errx (1, "%s: %s", hostname, gai_strerror(error)); - for (a = ai; a != NULL; a = a->ai_next) { - int s; +for (a = ai; a != NULL; a = a->ai_next) { + int s; - s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); - if (s < 0) - continue; - if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { - warn ('connect(%s)', hostname); - close (s); - continue; - } - freeaddrinfo (ai); - ai = NULL; - } - if (ai) { - freeaddrinfo (ai); - errx ('failed to contact %s', hostname); - } + s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); + if (s < 0) + continue; + if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { + warn ("connect(%s)", hostname); + close (s); + continue; + } + freeaddrinfo (ai); + ai = NULL; +} +if (ai) { + freeaddrinfo (ai); + errx ("failed to contact %s", hostname); +} .fi .PP .PP -Before authenticating, an authentication context needs to be created. This context keeps all information for one (to be) authenticated connection (see krb5_auth_context). +Before authenticating, an authentication context needs to be created\&. This context keeps all information for one (to be) authenticated connection (see krb5_auth_context)\&. .PP .PP .nf - status = krb5_auth_con_init (context, &auth_context); - if (status) - krb5_err (context, 1, status, 'krb5_auth_con_init'); +status = krb5_auth_con_init (context, &auth_context); +if (status) + krb5_err (context, 1, status, "krb5_auth_con_init"); .fi .PP .PP -For setting the address in the authentication there is a help function krb5_auth_con_setaddrs_from_fd() that does everything that is needed when given a connected file descriptor to the socket. +For setting the address in the authentication there is a help function krb5_auth_con_setaddrs_from_fd() that does everything that is needed when given a connected file descriptor to the socket\&. .PP .PP .nf - status = krb5_auth_con_setaddrs_from_fd (context, - auth_context, - &sock); - if (status) - krb5_err (context, 1, status, - 'krb5_auth_con_setaddrs_from_fd'); +status = krb5_auth_con_setaddrs_from_fd (context, + auth_context, + &sock); +if (status) + krb5_err (context, 1, status, + "krb5_auth_con_setaddrs_from_fd"); .fi .PP .PP -The next step is to build a server principal for the service we want to connect to. (See also \fBkrb5_sname_to_principal()\fP.) +The next step is to build a server principal for the service we want to connect to\&. (See also \fBkrb5_sname_to_principal()\fP\&.) .PP .PP .nf - status = krb5_sname_to_principal (context, - hostname, - service, - KRB5_NT_SRV_HST, - &server); - if (status) - krb5_err (context, 1, status, 'krb5_sname_to_principal'); +status = krb5_sname_to_principal (context, + hostname, + service, + KRB5_NT_SRV_HST, + &server); +if (status) + krb5_err (context, 1, status, "krb5_sname_to_principal"); .fi .PP .PP -The client principal is not passed to krb5_sendauth() function, this causes the krb5_sendauth() function to try to figure it out itself. +The client principal is not passed to krb5_sendauth() function, this causes the krb5_sendauth() function to try to figure it out itself\&. .PP -The server program is using the function krb5_recvauth() to receive the Kerberos 5 authenticator. +The server program is using the function krb5_recvauth() to receive the Kerberos 5 authenticator\&. .PP -In this case, mutual authentication will be tried. That means that the server will authenticate to the client. Using mutual authentication is good since it enables the user to verify that they are talking to the right server (a server that knows the key). +In this case, mutual authentication will be tried\&. That means that the server will authenticate to the client\&. Using mutual authentication is required to avoid man-in-the-middle attacks, since it enables the user to verify that they are talking to the right server (a server that knows the key)\&. .PP -If you are using a non-blocking socket you will need to do all work of krb5_sendauth() yourself. Basically you need to send over the authenticator from krb5_mk_req() and, in case of mutual authentication, verifying the result from the server with krb5_rd_rep(). +If you are using a non-blocking socket you will need to do all work of krb5_sendauth() yourself\&. Basically you need to send over the authenticator from krb5_mk_req() and, in case of mutual authentication, verifying the result from the server with krb5_rd_rep()\&. .PP .PP .nf - status = krb5_sendauth (context, - &auth_context, - &sock, - VERSION, - NULL, - server, - AP_OPTS_MUTUAL_REQUIRED, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL); - if (status) - krb5_err (context, 1, status, 'krb5_sendauth'); +status = krb5_sendauth (context, + &auth_context, + &sock, + VERSION, + NULL, + server, + AP_OPTS_MUTUAL_REQUIRED, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL); +if (status) + krb5_err (context, 1, status, "krb5_sendauth"); .fi .PP .PP -Once authentication has been performed, it is time to send some data. First we create a krb5_data structure, then we sign it with krb5_mk_safe() using the auth_context that contains the session-key that was exchanged in the krb5_sendauth()/krb5_recvauth() authentication sequence. +Once authentication has been performed, it is time to send some data\&. First we create a krb5_data structure, then we sign it with krb5_mk_safe() using the auth_context that contains the session-key that was exchanged in the krb5_sendauth()/krb5_recvauth() authentication sequence\&. .PP .PP .nf - data.data = 'hej'; - data.length = 3; +data\&.data = "hej"; +data\&.length = 3; - krb5_data_zero (&packet); +krb5_data_zero (&packet); - status = krb5_mk_safe (context, - auth_context, - &data, - &packet, - NULL); - if (status) - krb5_err (context, 1, status, 'krb5_mk_safe'); +status = krb5_mk_safe (context, + auth_context, + &data, + &packet, + NULL); +if (status) + krb5_err (context, 1, status, "krb5_mk_safe"); .fi .PP .PP -And send it over the network. +And send it over the network\&. .PP .PP .nf - len = packet.length; - net_len = htonl(len); +len = packet\&.length; +net_len = htonl(len); - if (krb5_net_write (context, &sock, &net_len, 4) != 4) - err (1, 'krb5_net_write'); - if (krb5_net_write (context, &sock, packet.data, len) != len) - err (1, 'krb5_net_write'); +if (krb5_net_write (context, &sock, &net_len, 4) != 4) + err (1, "krb5_net_write"); +if (krb5_net_write (context, &sock, packet\&.data, len) != len) + err (1, "krb5_net_write"); .fi .PP .PP -To send encrypted (and signed) data krb5_mk_priv() should be used instead. krb5_mk_priv() works the same way as krb5_mk_safe(), with the exception that it encrypts the data in addition to signing it. +To send encrypted (and signed) data krb5_mk_priv() should be used instead\&. krb5_mk_priv() works the same way as krb5_mk_safe(), with the exception that it encrypts the data in addition to signing it\&. .PP .PP .nf - data.data = 'hemligt'; - data.length = 7; +data\&.data = "hemligt"; +data\&.length = 7; - krb5_data_free (&packet); +krb5_data_free (&packet); - status = krb5_mk_priv (context, - auth_context, - &data, - &packet, - NULL); - if (status) - krb5_err (context, 1, status, 'krb5_mk_priv'); +status = krb5_mk_priv (context, + auth_context, + &data, + &packet, + NULL); +if (status) + krb5_err (context, 1, status, "krb5_mk_priv"); .fi .PP .PP -And send it over the network. +And send it over the network\&. .PP .PP .nf - len = packet.length; - net_len = htonl(len); +len = packet\&.length; +net_len = htonl(len); - if (krb5_net_write (context, &sock, &net_len, 4) != 4) - err (1, 'krb5_net_write'); - if (krb5_net_write (context, &sock, packet.data, len) != len) - err (1, 'krb5_net_write'); +if (krb5_net_write (context, &sock, &net_len, 4) != 4) + err (1, "krb5_net_write"); +if (krb5_net_write (context, &sock, packet\&.data, len) != len) + err (1, "krb5_net_write"); .fi .PP .PP -The server is using krb5_rd_safe() and krb5_rd_priv() to verify the signature and decrypt the packet. +The server is using krb5_rd_safe() and krb5_rd_priv() to verify the signature and decrypt the packet\&. .SH "Validating a password in an application" .PP -See the manual page for krb5_verify_user(). +See the manual page for krb5_verify_user()\&. .SH "API differences to MIT Kerberos" .PP -This section is somewhat disorganised, but so far there is no overall structure to the differences, though some of the have their root in that Heimdal uses an ASN.1 compiler and MIT doesn't. +This section is somewhat disorganised, but so far there is no overall structure to the differences, though some of the have their root in that Heimdal uses an ASN\&.1 compiler and MIT doesn't\&. .SS "Principal and realms" -Heimdal stores the realm as a krb5_realm, that is a char *. MIT Kerberos uses a krb5_data to store a realm. +Heimdal stores the realm as a krb5_realm, that is a char *\&. MIT Kerberos uses a krb5_data to store a realm\&. .PP -In Heimdal krb5_principal doesn't contain the component name_type; it's instead stored in component name.name_type. To get and set the nametype in Heimdal, use \fBkrb5_principal_get_type()\fP and \fBkrb5_principal_set_type()\fP. +In Heimdal krb5_principal doesn't contain the component name_type; it's instead stored in component name\&.name_type\&. To get and set the nametype in Heimdal, use \fBkrb5_principal_get_type()\fP and \fBkrb5_principal_set_type()\fP\&. .PP -For more information about principal and realms, see krb5_principal. +For more information about principal and realms, see krb5_principal\&. .SS "Error messages" -To get the error string, Heimdal uses krb5_get_error_message(). This is to return custom error messages (like ``Can't find host/datan.example.com@CODE.COM in /etc/krb5.conf.'' instead of a ``Key table entry not found'' that error_message returns. +To get the error string, Heimdal uses \fBkrb5_get_error_message()\fP\&. This is to return custom error messages (like \fCCan't find host/datan\&.example\&.com\\@CODE\&.COM in /etc/krb5\&.conf\&.'' instead of a\fPKey table entry not found'' that error_message returns\&. .PP -Heimdal uses a threadsafe(r) version of the com_err interface; the global com_err table isn't initialised. Then error_message returns quite a boring error string (just the error code itself). +Heimdal uses a threadsafe(r) version of the com_err interface; the global com_err table isn't initialised\&. Then error_message returns quite a boring error string (just the error code itself)\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_is_enctype_weak.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_is_enctype_weak.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_is_enctype_weak.3 @@ -0,0 +1 @@ +.so man3/krb5_crypto.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 keytab handling functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_keytab" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 keytab handling functions \- +krb5_keytab \- Heimdal Kerberos 5 keytab handling functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -67,7 +70,7 @@ .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_kt_remove_entry\fP (krb5_context context, krb5_keytab id, krb5_keytab_entry *entry)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_kt_have_content\fP (krb5_context context, krb5_keytab id)" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_kt_have_content\fP (krb5_context context, krb5_keytab id)" .br .in -1c .SH "Detailed Description" @@ -76,263 +79,249 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_add_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry * entry)" +Add the entry in `entry' to the keytab `id'\&. .PP -Add the entry in `entry' to the keytab `id'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP a keytab. +\fIid\fP a keytab\&. .br \fIentry\fP the entry to add .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_close (krb5_context context, krb5_keytab id)" +Finish using the keytab in `id'\&. All resources will be released, even on errors\&. .PP -Finish using the keytab in `id'. All resources will be released, even on errors. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP keytab to close. +\fIid\fP keytab to close\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kt_compare (krb5_context context, krb5_keytab_entry * entry, krb5_const_principal principal, krb5_kvno vno, krb5_enctype enctype)" +Compare `entry' against `principal, vno, enctype'\&. Any of `principal, vno, enctype' might be 0 which acts as a wildcard\&. Return TRUE if they compare the same, FALSE otherwise\&. .PP -Compare `entry' against `principal, vno, enctype'. Any of `principal, vno, enctype' might be 0 which acts as a wildcard. Return TRUE if they compare the same, FALSE otherwise. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIentry\fP an entry to match with. +\fIentry\fP an entry to match with\&. .br -\fIprincipal\fP principal to match, NULL matches all principals. +\fIprincipal\fP principal to match, NULL matches all principals\&. .br -\fIvno\fP key version to match, 0 matches all key version numbers. +\fIvno\fP key version to match, 0 matches all key version numbers\&. .br -\fIenctype\fP encryption type to match, 0 matches all encryption types. +\fIenctype\fP encryption type to match, 0 matches all encryption types\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return TRUE or match, FALSE if not matched. +Return TRUE or match, FALSE if not matched\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_copy_entry_contents (krb5_context context, const krb5_keytab_entry * in, krb5_keytab_entry * out)" +Copy the contents of `in' into `out'\&. .PP -Copy the contents of `in' into `out'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIin\fP the keytab entry to copy. +\fIin\fP the keytab entry to copy\&. .br -\fIout\fP the copy of the keytab entry, free with \fBkrb5_kt_free_entry()\fP. +\fIout\fP the copy of the keytab entry, free with \fBkrb5_kt_free_entry()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default (krb5_context context, krb5_keytab * id)" +Set `id' to the default keytab\&. .PP -Set `id' to the default keytab. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP the new default keytab. +\fIid\fP the new default keytab\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_modify_name (krb5_context context, char * name, size_t namesize)" +Copy the name of the default modify keytab into `name'\&. .PP -Copy the name of the default modify keytab into `name'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br \fIname\fP buffer where the name will be written .br \fInamesize\fP length of name .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_name (krb5_context context, char * name, size_t namesize)" +copy the name of the default keytab into `name'\&. .PP -copy the name of the default keytab into `name'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br \fIname\fP buffer where the name will be written .br \fInamesize\fP length of name .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_destroy (krb5_context context, krb5_keytab id)" +Destroy (remove) the keytab in `id'\&. All resources will be released, even on errors, does the equvalment of \fBkrb5_kt_close()\fP on the resources\&. .PP -Destroy (remove) the keytab in `id'. All resources will be released, even on errors, does the equvalment of \fBkrb5_kt_close()\fP on the resources. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP keytab to destroy. +\fIid\fP keytab to destroy\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_end_seq_get (krb5_context context, krb5_keytab id, krb5_kt_cursor * cursor)" +Release all resources associated with `cursor'\&. .PP -Release all resources associated with `cursor'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP a keytab. +\fIid\fP a keytab\&. .br -\fIcursor\fP the cursor to free. +\fIcursor\fP the cursor to free\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_free_entry (krb5_context context, krb5_keytab_entry * entry)" +Free the contents of `entry'\&. .PP -Free the contents of `entry'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br \fIentry\fP the entry to free .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_entry (krb5_context context, krb5_keytab id, krb5_const_principal principal, krb5_kvno kvno, krb5_enctype enctype, krb5_keytab_entry * entry)" +Retrieve the keytab entry for `principal, kvno, enctype' into `entry' from the keytab `id'\&. Matching is done like \fBkrb5_kt_compare()\fP\&. .PP -Retrieve the keytab entry for `principal, kvno, enctype' into `entry' from the keytab `id'. Matching is done like \fBkrb5_kt_compare()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP a keytab. +\fIid\fP a keytab\&. .br -\fIprincipal\fP principal to match, NULL matches all principals. +\fIprincipal\fP principal to match, NULL matches all principals\&. .br -\fIkvno\fP key version to match, 0 matches all key version numbers. +\fIkvno\fP key version to match, 0 matches all key version numbers\&. .br -\fIenctype\fP encryption type to match, 0 matches all encryption types. +\fIenctype\fP encryption type to match, 0 matches all encryption types\&. .br -\fIentry\fP the returned entry, free with \fBkrb5_kt_free_entry()\fP. +\fIentry\fP the returned entry, free with \fBkrb5_kt_free_entry()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_full_name (krb5_context context, krb5_keytab keytab, char ** str)" +Retrieve the full name of the keytab `keytab' and store the name in `str'\&. .PP -Retrieve the full name of the keytab `keytab' and store the name in `str'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIkeytab\fP keytab to get name for. +\fIkeytab\fP keytab to get name for\&. .br -\fIstr\fP the name of the keytab name, usee krb5_xfree() to free the string. On error, *str is set to NULL. +\fIstr\fP the name of the keytab name, usee krb5_xfree() to free the string\&. On error, *str is set to NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_name (krb5_context context, krb5_keytab keytab, char * name, size_t namesize)" -.PP Retrieve the name of the keytab `keytab' into `name', `namesize' .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIkeytab\fP the keytab to get the name for. +\fIkeytab\fP the keytab to get the name for\&. .br -\fIname\fP name buffer. +\fIname\fP name buffer\&. .br -\fInamesize\fP size of name buffer. +\fInamesize\fP size of name buffer\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_type (krb5_context context, krb5_keytab keytab, char * prefix, size_t prefixsize)" +Return the type of the `keytab' in the string \fCprefix of length \fPprefixsize'\&. .PP -Return the type of the `keytab' in the string `prefix of length `prefixsize'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br \fIkeytab\fP the keytab to get the prefix for .br @@ -341,57 +330,54 @@ \fIprefixsize\fP length of prefix buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kt_have_content (krb5_context context, krb5_keytab id)" -.PP +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_have_content (krb5_context context, krb5_keytab id)" Return true if the keytab exists and have entries .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP a keytab. +\fIid\fP a keytab\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_next_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry * entry, krb5_kt_cursor * cursor)" +Get the next entry from keytab, advance the cursor\&. On last entry the function will return KRB5_KT_END\&. .PP -Get the next entry from keytab, advance the cursor. On last entry the function will return KRB5_KT_END. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP a keytab. +\fIid\fP a keytab\&. .br -\fIentry\fP the returned entry, free with \fBkrb5_kt_free_entry()\fP. +\fIentry\fP the returned entry, free with \fBkrb5_kt_free_entry()\fP\&. .br -\fIcursor\fP the cursor of the iteration. +\fIcursor\fP the cursor of the iteration\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_read_service_key (krb5_context context, krb5_pointer keyprocarg, krb5_principal principal, krb5_kvno vno, krb5_enctype enctype, krb5_keyblock ** key)" +Read the key identified by `(principal, vno, enctype)' from the keytab in `keyprocarg' (the default if == NULL) into `*key'\&. .PP -Read the key identified by `(principal, vno, enctype)' from the keytab in `keyprocarg' (the default if == NULL) into `*key'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br \fIkeyprocarg\fP .br @@ -404,83 +390,82 @@ \fIkey\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_register (krb5_context context, const krb5_kt_ops * ops)" +Register a new keytab backend\&. .PP -Register a new keytab backend. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIops\fP a backend to register. +\fIops\fP a backend to register\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_remove_entry (krb5_context context, krb5_keytab id, krb5_keytab_entry * entry)" +Remove an entry from the keytab, matching is done using \fBkrb5_kt_compare()\fP\&. .PP -Remove an entry from the keytab, matching is done using \fBkrb5_kt_compare()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP a keytab. +\fIid\fP a keytab\&. .br \fIentry\fP the entry to remove .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_resolve (krb5_context context, const char * name, krb5_keytab * id)" +Resolve the keytab name (of the form `type:residual') in `name' into a keytab in `id'\&. .PP -Resolve the keytab name (of the form `type:residual') in `name' into a keytab in `id'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br \fIname\fP name to resolve .br -\fIid\fP resulting keytab, free with \fBkrb5_kt_close()\fP. +\fIid\fP resulting keytab, free with \fBkrb5_kt_close()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_start_seq_get (krb5_context context, krb5_keytab id, krb5_kt_cursor * cursor)" +Set `cursor' to point at the beginning of `id'\&. .PP -Set `cursor' to point at the beginning of `id'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Keberos context. +\fIcontext\fP a Keberos context\&. .br -\fIid\fP a keytab. +\fIid\fP a keytab\&. .br -\fIcursor\fP a newly allocated cursor, free with \fBkrb5_kt_end_seq_get()\fP. +\fIcursor\fP a newly allocated cursor, free with \fBkrb5_kt_end_seq_get()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab_intro.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab_intro.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab_intro.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_keytab_intro.3 @@ -1,36 +1,33 @@ -.TH "krb5_keytab_intro" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_keytab_intro" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME krb5_keytab_intro \- The keytab handing functions + .SH "Kerberos Keytabs" .PP See the library functions here: \fBHeimdal Kerberos 5 keytab handling functions\fP .PP -Keytabs are long term key storage for servers, their equvalment of password files. +Keytabs are long term key storage for servers, their equvalment of password files\&. .PP -Normally the only function that useful for server are to specify what keytab to use to other core functions like krb5_rd_req() \fBkrb5_kt_resolve()\fP, and \fBkrb5_kt_close()\fP. +Normally the only function that useful for server are to specify what keytab to use to other core functions like krb5_rd_req() \fBkrb5_kt_resolve()\fP, and \fBkrb5_kt_close()\fP\&. .SS "Keytab names" -A keytab name is on the form type:residual. The residual part is specific to each keytab-type. +A keytab name is on the form type:residual\&. The residual part is specific to each keytab-type\&. .PP -When a keytab-name is resolved, the type is matched with an internal list of keytab types. If there is no matching keytab type, the default keytab is used. The current default type is FILE. +When a keytab-name is resolved, the type is matched with an internal list of keytab types\&. If there is no matching keytab type, the default keytab is used\&. The current default type is FILE\&. .PP -The default value can be changed in the configuration file /etc/krb5.conf by setting the variable [defaults]default_keytab_name. +The default value can be changed in the configuration file /etc/krb5\&.conf by setting the variable [defaults]default_keytab_name\&. .PP The keytab types that are implemented in Heimdal are: .IP "\(bu" 2 -file store the keytab in a file, the type's name is FILE . The residual part is a filename. For compatibility with other Kerberos implemtation WRFILE and JAVA14 is also accepted. WRFILE has the same format as FILE. JAVA14 have a format that is compatible with older versions of MIT kerberos and SUN's Java based installation. They store a truncted kvno, so when the knvo excess 255, they are truncted in this format. -.PP -.PP +file store the keytab in a file, the type's name is FILE \&. The residual part is a filename\&. For compatibility with other Kerberos implemtation WRFILE and JAVA14 is also accepted\&. WRFILE has the same format as FILE\&. JAVA14 have a format that is compatible with older versions of MIT kerberos and SUN's Java based installation\&. They store a truncted kvno, so when the knvo excess 255, they are truncted in this format\&. .IP "\(bu" 2 -keytab store the keytab in a AFS keyfile (usually /usr/afs/etc/KeyFile ), the type's name is AFSKEYFILE. The residual part is a filename. -.PP -.PP +keytab store the keytab in a AFS keyfile (usually /usr/afs/etc/KeyFile ), the type's name is AFSKEYFILE\&. The residual part is a filename\&. .IP "\(bu" 2 -memory The keytab is stored in a memory segment. This allows sensitive and/or temporary data not to be stored on disk. The type's name is MEMORY. Each MEMORY keytab is referenced counted by and opened by the residual name, so two handles can point to the same memory area. When the last user closes using \fBkrb5_kt_close()\fP the keytab, the keys in they keytab is memset() to zero and freed and can no longer be looked up by name. +memory The keytab is stored in a memory segment\&. This allows sensitive and/or temporary data not to be stored on disk\&. The type's name is MEMORY\&. Each MEMORY keytab is referenced counted by and opened by the residual name, so two handles can point to the same memory area\&. When the last user closes using \fBkrb5_kt_close()\fP the keytab, the keys in they keytab is memset() to zero and freed and can no longer be looked up by name\&. .PP .SS "Keytab example" -This is a minimalistic version of ktutil. +This is a minimalistic version of ktutil\&. .PP .PP .nf @@ -45,27 +42,27 @@ char *principal; if (krb5_init_context (&context) != 0) - errx(1, 'krb5_context'); + errx(1, "krb5_context"); ret = krb5_kt_default (context, &keytab); if (ret) - krb5_err(context, 1, ret, 'krb5_kt_default'); + krb5_err(context, 1, ret, "krb5_kt_default"); ret = krb5_kt_start_seq_get(context, keytab, &cursor); if (ret) - krb5_err(context, 1, ret, 'krb5_kt_start_seq_get'); + krb5_err(context, 1, ret, "krb5_kt_start_seq_get"); while((ret = krb5_kt_next_entry(context, keytab, &entry, &cursor)) == 0){ - krb5_unparse_name(context, entry.principal, &principal); - printf('principal: %s\n', principal); + krb5_unparse_name(context, entry\&.principal, &principal); + printf("principal: %s\n", principal); free(principal); krb5_kt_free_entry(context, &entry); } ret = krb5_kt_end_seq_get(context, keytab, &cursor); if (ret) - krb5_err(context, 1, ret, 'krb5_kt_end_seq_get'); + krb5_err(context, 1, ret, "krb5_kt_end_seq_get"); ret = krb5_kt_close(context, keytab); if (ret) - krb5_err(context, 1, ret, 'krb5_kt_close'); + krb5_err(context, 1, ret, "krb5_kt_close"); krb5_free_context(context); return 0; } diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_pac.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_pac.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_pac.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_pac.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 PAC handling functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_pac" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 PAC handling functions \- +krb5_pac \- Heimdal Kerberos 5 PAC handling functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -19,48 +22,49 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_get_buffer (krb5_context context, krb5_pac p, uint32_t type, krb5_data * data)" +Get the PAC buffer of specific type from the pac\&. .PP -Get the PAC buffer of specific type from the pac. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIp\fP the pac structure returned by krb5_pac_parse(). +\fIp\fP the pac structure returned by krb5_pac_parse()\&. .br \fItype\fP type of buffer to get .br -\fIdata\fP return data, free with \fBkrb5_data_free()\fP. +\fIdata\fP return data, free with \fBkrb5_data_free()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_verify (krb5_context context, const krb5_pac pac, time_t authtime, krb5_const_principal principal, const krb5_keyblock * server, const krb5_keyblock * privsvr)" +Verify the PAC\&. .PP -Verify the PAC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIpac\fP the pac structure returned by krb5_pac_parse(). +\fIpac\fP the pac structure returned by krb5_pac_parse()\&. .br -\fIauthtime\fP The time of the ticket the PAC belongs to. +\fIauthtime\fP The time of the ticket the PAC belongs to\&. .br -\fIprincipal\fP the principal to verify. +\fIprincipal\fP the principal to verify\&. .br -\fIserver\fP The service key, most always be given. +\fIserver\fP The service key, most always be given\&. .br -\fIprivsvr\fP The KDC key, may be given. +\fIprivsvr\fP The KDC key, may be given\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_prepend_error_message.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_prepend_error_message.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_prepend_error_message.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 principal functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_principal" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 principal functions \- +krb5_principal \- Heimdal Kerberos 5 principal functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -49,10 +52,10 @@ .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_principal_set_realm\fP (krb5_context context, krb5_principal principal, krb5_const_realm realm)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_build_principal\fP (krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm,...)" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_build_principal\fP (krb5_context context, krb5_principal *principal, int rlen, krb5_const_realm realm,\&.\&.\&.)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_make_principal\fP (krb5_context context, krb5_principal *principal, krb5_const_realm realm,...)" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_make_principal\fP (krb5_context context, krb5_principal *principal, krb5_const_realm realm,\&.\&.\&.)" .br .ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_copy_principal\fP (krb5_context context, krb5_const_principal inprinc, krb5_principal *outprinc)" @@ -70,27 +73,47 @@ .RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_principal_match\fP (krb5_context context, krb5_const_principal princ, krb5_const_principal pattern)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_sname_to_principal\fP (krb5_context context, const char *hostname, const char *sname, int32_t type, krb5_principal *ret_princ)" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_parse_nametype\fP (krb5_context context, const char *str, int32_t *nametype)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_parse_nametype\fP (krb5_context context, const char *str, int32_t *nametype)" +.RI "krb5_boolean KRB5_LIB_FUNCTION \fBkrb5_principal_is_null\fP (krb5_context context, krb5_const_principal principal)" +.br +.ti -1c +.RI "krb5_boolean KRB5_LIB_FUNCTION \fBkrb5_realm_is_lkdc\fP (const char *realm)" +.br +.ti -1c +.RI "krb5_boolean KRB5_LIB_FUNCTION \fBkrb5_principal_is_lkdc\fP (krb5_context context, krb5_const_principal principal)" +.br +.ti -1c +.RI "krb5_boolean KRB5_LIB_FUNCTION \fBkrb5_principal_is_pku2u\fP (krb5_context context, krb5_const_principal principal)" .br .ti -1c .RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_principal_is_krbtgt\fP (krb5_context context, krb5_const_principal p)" .br +.ti -1c +.RI "krb5_boolean KRB5_LIB_FUNCTION \fBkrb5_principal_is_gss_hostbased_service\fP (krb5_context context, krb5_const_principal principal)" +.br +.ti -1c +.RI "krb5_boolean KRB5_LIB_FUNCTION \fBkrb5_principal_is_root_krbtgt\fP (krb5_context context, krb5_const_principal p)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_principal_is_anonymous\fP (krb5_context context, krb5_const_principal p, unsigned int flags)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_sname_to_principal\fP (krb5_context context, const char *hostname, const char *sname, int32_t type, krb5_principal *ret_princ)" +.br .in -1c .SH "Detailed Description" .PP .SH "Function Documentation" .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_build_principal (krb5_context context, krb5_principal * principal, int rlen, krb5_const_realm realm, ...)" -.PP +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_build_principal (krb5_context context, krb5_principal * principal, int rlen, krb5_const_realm realm, \&.\&.\&.)" Build a principal using vararg style building .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP returned principal .br @@ -98,96 +121,91 @@ .br \fIrealm\fP realm name .br -\fI...\fP a list of components ended with NULL. +\fI\&.\&.\&.\fP a list of components ended with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_principal (krb5_context context, krb5_const_principal inprinc, krb5_principal * outprinc)" -.PP Copy a principal .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIinprinc\fP principal to copy .br \fIoutprinc\fP copied principal, free with \fBkrb5_free_principal()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_principal (krb5_context context, krb5_principal p)" +Frees a Kerberos principal allocated by the library with \fBkrb5_parse_name()\fP, \fBkrb5_make_principal()\fP or any other related principal functions\&. .PP -Frees a Kerberos principal allocated by the library with \fBkrb5_parse_name()\fP, \fBkrb5_make_principal()\fP or any other related principal functions. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br -\fIp\fP a principal to free. +\fIp\fP a principal to free\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_principal (krb5_context context, krb5_principal * principal, krb5_const_realm realm, ...)" -.PP +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_principal (krb5_context context, krb5_principal * principal, krb5_const_realm realm, \&.\&.\&.)" Build a principal using vararg style building .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP returned principal .br \fIrealm\fP realm name .br -\fI...\fP a list of components ended with NULL. +\fI\&.\&.\&.\fP a list of components ended with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name (krb5_context context, const char * name, krb5_principal * principal)" -.PP Parse a name into a krb5_principal structure .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br \fIname\fP name to parse into a Kerberos principal .br -\fIprincipal\fP returned principal, free with \fBkrb5_free_principal()\fP. +\fIprincipal\fP returned principal, free with \fBkrb5_free_principal()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name_flags (krb5_context context, const char * name, int flags, krb5_principal * principal)" +Parse a name into a krb5_principal structure, flags controls the behavior\&. .PP -Parse a name into a krb5_principal structure, flags controls the behavior. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -195,23 +213,21 @@ .br \fIflags\fP flags to control the behavior .br -\fIprincipal\fP returned principal, free with \fBkrb5_free_principal()\fP. +\fIprincipal\fP returned principal, free with \fBkrb5_free_principal()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_nametype (krb5_context context, const char * str, int32_t * nametype)" -.PP Parse nametype string and return a nametype integer .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)" +Compares the two principals, including realm of the principals and returns TRUE if they are the same and FALSE if not\&. .PP -Compares the two principals, including realm of the principals and returns TRUE if they are the same and FALSE if not. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -220,7 +236,7 @@ \fIprinc2\fP second principal to compare .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 \fBkrb5_principal_compare_any_realm()\fP .PP @@ -229,10 +245,9 @@ .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare_any_realm (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)" -.PP Return TRUE iff princ1 == princ2 (without considering the realm) .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -241,12 +256,12 @@ \fIprinc2\fP second principal to compare .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 non zero if equal, 0 if not .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 \fBkrb5_principal_compare()\fP .PP @@ -255,105 +270,109 @@ .PP .SS "KRB5_LIB_FUNCTION unsigned int KRB5_LIB_CALL krb5_principal_get_num_comp (krb5_context context, krb5_const_principal principal)" +Get number of component is principal\&. .PP -Get number of component is principal. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br \fIprincipal\fP principal to query .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 number of components in string .RE .PP .SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_principal_get_realm (krb5_context context, krb5_const_principal principal)" -.PP Get the realm of the principal .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal to get the realm for .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 realm of the principal, don't free or use after krb5_principal is freed .RE .PP .SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_principal_get_type (krb5_context context, krb5_const_principal principal)" -.PP Get the type of the principal .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal to get the type for .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 the type of principal .RE .PP +.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_anonymous (krb5_context context, krb5_const_principal p, unsigned int flags)" +Returns true iff name is WELLKNOWN/ANONYMOUS +.SS "krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_gss_hostbased_service (krb5_context context, krb5_const_principal principal)" +Returns true iff name is an WELLKNOWN:ORG\&.H5L\&.HOSTBASED-SERVICE .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_krbtgt (krb5_context context, krb5_const_principal p)" -.PP Check if the cname part of the principal is a krbtgt principal +.SS "krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_lkdc (krb5_context context, krb5_const_principal principal)" +Returns true if name is Kerberos an LKDC realm +.SS "krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_null (krb5_context context, krb5_const_principal principal)" +Returns true if name is Kerberos NULL name +.SS "krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_pku2u (krb5_context context, krb5_const_principal principal)" +Returns true if name is Kerberos an LKDC realm +.SS "krb5_boolean KRB5_LIB_FUNCTION krb5_principal_is_root_krbtgt (krb5_context context, krb5_const_principal p)" +Check if the cname part of the principal is a initial or renewed krbtgt principal .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_match (krb5_context context, krb5_const_principal princ, krb5_const_principal pattern)" -.PP return TRUE iff princ matches pattern .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_principal_set_realm (krb5_context context, krb5_principal principal, krb5_const_realm realm)" +Set a new realm for a principal, and as a side-effect free the previous realm\&. .PP -Set a new realm for a principal, and as a side-effect free the previous realm. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal set the realm for .br \fIrealm\fP the new realm to set .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_principal_set_type (krb5_context context, krb5_principal principal, int type)" -.PP Set the type of the principal .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal to set the type for .br \fItype\fP the new type .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_realm_compare (krb5_context context, krb5_const_principal princ1, krb5_const_principal princ2)" -.PP return TRUE iff realm(princ1) == realm(princ2) .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -362,7 +381,7 @@ \fIprinc2\fP second principal to compare .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 \fBkrb5_principal_compare_any_realm()\fP .PP @@ -370,34 +389,36 @@ .RE .PP +.SS "krb5_boolean KRB5_LIB_FUNCTION krb5_realm_is_lkdc (const char * realm)" +Returns true if name is Kerberos an LKDC realm .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sname_to_principal (krb5_context context, const char * hostname, const char * sname, int32_t type, krb5_principal * ret_princ)" +Create a principal for the given service running on the given hostname\&. If KRB5_NT_SRV_HST is used, the hostname is canonicalized according the configured name canonicalization rules, with canonicalization delayed in some cases\&. One rule involves DNS, which is insecure unless DNSSEC is used, but we don't use DNSSEC-capable resolver APIs here, so that if DNSSEC is used we wouldn't know it\&. .PP -Create a principal for the service running on hostname. If KRB5_NT_SRV_HST is used, the hostname is canonization using DNS (or some other service), this is potentially insecure. +Canonicalization is immediate (not delayed) only when there is only one canonicalization rule and that rule indicates that we should do a host lookup by name (i\&.e\&., DNS)\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIhostname\fP hostname to use .br \fIsname\fP Service name to use .br -\fItype\fP name type of principal, use KRB5_NT_SRV_HST or KRB5_NT_UNKNOWN. +\fItype\fP name type of principal, use KRB5_NT_SRV_HST or KRB5_NT_UNKNOWN\&. .br -\fIret_princ\fP return principal, free with \fBkrb5_free_principal()\fP. +\fIret_princ\fP return principal, free with \fBkrb5_free_principal()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name (krb5_context context, krb5_const_principal principal, char ** name)" -.PP Unparse the Kerberos name into a string .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -406,19 +427,18 @@ \fIname\fP resulting string, free with krb5_xfree() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed (krb5_context context, krb5_const_principal principal, char * name, size_t len)" -.PP Unparse the principal name to a fixed buffer .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal to unparse .br @@ -427,19 +447,18 @@ \fIlen\fP length of buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_flags (krb5_context context, krb5_const_principal principal, int flags, char * name, size_t len)" +Unparse the principal name with unparse flags to a fixed buffer\&. .PP -Unparse the principal name with unparse flags to a fixed buffer. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal to unparse .br @@ -450,19 +469,18 @@ \fIlen\fP length of buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_short (krb5_context context, krb5_const_principal principal, char * name, size_t len)" +Unparse the principal name to a fixed buffer\&. The realm is skipped if its a default realm\&. .PP -Unparse the principal name to a fixed buffer. The realm is skipped if its a default realm. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal to unparse .br @@ -471,17 +489,16 @@ \fIlen\fP length of buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_flags (krb5_context context, krb5_const_principal principal, int flags, char ** name)" -.PP Unparse the Kerberos name into a string .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -492,28 +509,30 @@ \fIname\fP resulting string, free with krb5_xfree() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_short (krb5_context context, krb5_const_principal principal, char ** name)" +Unparse the principal name to a allocated buffer\&. The realm is skipped if its a default realm\&. .PP -Unparse the principal name to a allocated buffer. The realm is skipped if its a default realm. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos context. +\fIcontext\fP A Kerberos context\&. .br \fIprincipal\fP principal to unparse .br \fIname\fP returned buffer, free with krb5_xfree() .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An krb5 error code, see krb5_get_error_message(). +An krb5 error code, see \fBkrb5_get_error_message()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_intro.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_intro.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_intro.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_intro.3 @@ -1,12 +1,11 @@ -.TH "krb5_principal_intro" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_principal_intro" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -krb5_principal_intro \- The principal handing functions. -A Kerberos principal is a email address looking string that contains to parts separeted by a @. The later part is the kerbero realm the principal belongs to and the former is a list of 0 or more components. For example +krb5_principal_intro \- The principal handing functions\&. +A Kerberos principal is a email address looking string that contains two parts separated by . The second part is the kerberos realm the principal belongs to and the first is a list of 0 or more components\&. For example .PP .nf - lha@SU.SE host/hummel.it.su.se@SU.SE host/admin@H5L.ORG diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_anonymous.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_anonymous.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_anonymous.3 @@ -0,0 +1 @@ +.so man3/krb5_principal.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_gss_hostbased_service.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_gss_hostbased_service.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_gss_hostbased_service.3 @@ -0,0 +1 @@ +.so man3/krb5_principal.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_lkdc.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_lkdc.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_lkdc.3 @@ -0,0 +1 @@ +.so man3/krb5_principal.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_null.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_null.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_null.3 @@ -0,0 +1 @@ +.so man3/krb5_principal.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_pku2u.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_pku2u.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_pku2u.3 @@ -0,0 +1 @@ +.so man3/krb5_principal.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_root_krbtgt.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_root_krbtgt.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_principal_is_root_krbtgt.3 @@ -0,0 +1 @@ +.so man3/krb5_principal.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_realm_is_lkdc.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_realm_is_lkdc.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_realm_is_lkdc.3 @@ -0,0 +1 @@ +.so man3/krb5_principal.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ret_int64.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ret_int64.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ret_int64.3 @@ -0,0 +1 @@ +.so man3/krb5_storage.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ret_uint64.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ret_uint64.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ret_uint64.3 @@ -0,0 +1 @@ +.so man3/krb5_storage.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_set_warn_dest.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_set_warn_dest.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_set_warn_dest.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 storage functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_storage" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 storage functions \- +krb5_storage \- Heimdal Kerberos 5 storage functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -31,6 +34,9 @@ .RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_storage_truncate\fP (krb5_storage *sp, off_t offset)" .br .ti -1c +.RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_storage_fsync\fP (krb5_storage *sp)" +.br +.ti -1c .RI "KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL \fBkrb5_storage_read\fP (krb5_storage *sp, void *buf, size_t len)" .br .ti -1c @@ -52,9 +58,21 @@ .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_store_int32\fP (krb5_storage *sp, int32_t value)" .br .ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_store_int64\fP (krb5_storage *sp, int64_t value)" +.br +.ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_store_uint32\fP (krb5_storage *sp, uint32_t value)" .br .ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_store_uint64\fP (krb5_storage *sp, uint64_t value)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_ret_int64\fP (krb5_storage *sp, int64_t *value)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_ret_uint64\fP (krb5_storage *sp, uint64_t *value)" +.br +.ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_ret_int32\fP (krb5_storage *sp, int32_t *value)" .br .ti -1c @@ -154,7 +172,7 @@ .RI "KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL \fBkrb5_storage_emem\fP (void)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL \fBkrb5_storage_from_fd\fP (krb5_socket_t fd_in)" +.RI "KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL \fBkrb5_storage_from_fd\fP (int fd_in)" .br .ti -1c .RI "KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL \fBkrb5_storage_from_mem\fP (void *buf, size_t len)" @@ -165,6 +183,9 @@ .ti -1c .RI "KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL \fBkrb5_storage_from_readonly_mem\fP (const void *buf, size_t len)" .br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_storage *KRB5_LIB_CALL \fBkrb5_storage_from_socket\fP (krb5_socket_t sock_in)" +.br .in -1c .SH "Detailed Description" .PP @@ -172,299 +193,313 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_address (krb5_storage * sp, krb5_address * adr)" +Read a address block from the storage\&. .PP -Read a address block from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fIadr\fP the address block read from storage .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_addrs (krb5_storage * sp, krb5_addresses * adr)" +Read a addresses block from the storage\&. .PP -Read a addresses block from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fIadr\fP the addresses block read from storage .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_authdata (krb5_storage * sp, krb5_authdata * auth)" +Read a auth data from the storage\&. .PP -Read a auth data from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fIauth\fP the auth data block read from storage .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds (krb5_storage * sp, krb5_creds * creds)" +Read a credentials block from the storage\&. .PP -Read a credentials block from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fIcreds\fP the credentials block read from storage .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds_tag (krb5_storage * sp, krb5_creds * creds)" +Read a tagged credentials block from the storage\&. .PP -Read a tagged credentials block from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fIcreds\fP the credentials block read from storage .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_data (krb5_storage * sp, krb5_data * data)" +Parse a data from the storage\&. .PP -Parse a data from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to read from .br \fIdata\fP the parsed data .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int16 (krb5_storage * sp, int16_t * value)" +Read a int16 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -Read a int16 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value read from the buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int32 (krb5_storage * sp, int32_t * value)" +Read a int32 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -Read a int32 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. +\fBParameters\fP +.RS 4 +\fIsp\fP the storage to write too +.br +\fIvalue\fP the value read from the buffer +.RE .PP -\fBParameters:\fP +\fBReturns\fP +.RS 4 +0 for success, or a Kerberos 5 error code on failure\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int64 (krb5_storage * sp, int64_t * value)" +Read a int64 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. +.PP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value read from the buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int8 (krb5_storage * sp, int8_t * value)" -.PP Read a int8 from storage .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value read from the buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_keyblock (krb5_storage * sp, krb5_keyblock * p)" +Read a keyblock from the storage\&. .PP -Read a keyblock from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fIp\fP the keyblock read from storage, free using \fBkrb5_free_keyblock()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_principal (krb5_storage * sp, krb5_principal * princ)" +Parse principal from the storage\&. .PP -Parse principal from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to read from .br \fIprinc\fP the parsed principal .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_string (krb5_storage * sp, char ** string)" +Parse a string from the storage\&. .PP -Parse a string from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to read from .br \fIstring\fP the parsed string .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_stringz (krb5_storage * sp, char ** string)" +Parse zero terminated string from the storage\&. .PP -Parse zero terminated string from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to read from .br \fIstring\fP the parsed string .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_times (krb5_storage * sp, krb5_times * times)" +Read a times block from the storage\&. .PP -Read a times block from the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fItimes\fP the times block read from storage .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint16 (krb5_storage * sp, uint16_t * value)" +Read a int16 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -Read a int16 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value read from the buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint32 (krb5_storage * sp, uint32_t * value)" +Read a uint32 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -Read a uint32 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. +\fBParameters\fP +.RS 4 +\fIsp\fP the storage to write too +.br +\fIvalue\fP the value read from the buffer +.RE .PP -\fBParameters:\fP +\fBReturns\fP +.RS 4 +0 for success, or a Kerberos 5 error code on failure\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint64 (krb5_storage * sp, uint64_t * value)" +Read a uint64 from storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. +.PP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value read from the buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint8 (krb5_storage * sp, uint8_t * value)" -.PP Read a uint8 from storage .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value read from the buffer .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_clear_flags (krb5_storage * sp, krb5_flags flags)" -.PP Clear the flags on a storage buffer .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to clear the flags on .br @@ -473,15 +508,14 @@ .PP .SS "KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_emem (void)" +Create a elastic (allocating) memory storage backend\&. Memory is allocated on demand\&. Free returned krb5_storage with \fBkrb5_storage_free()\fP\&. .PP -Create a elastic (allocating) memory storage backend. Memory is allocated on demand. Free returned krb5_storage with \fBkrb5_storage_free()\fP. -.PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -A krb5_storage on success, or NULL on out of memory error. +A krb5_storage on success, or NULL on out of memory error\&. .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 \fBkrb5_storage_from_mem()\fP .PP @@ -490,34 +524,34 @@ \fBkrb5_storage_from_fd()\fP .PP \fBkrb5_storage_from_data()\fP +.PP +\fBkrb5_storage_from_socket()\fP .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_free (krb5_storage * sp)" +Free a krb5 storage\&. .PP -Free a krb5 storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIsp\fP the storage to free. +\fIsp\fP the storage to free\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An Kerberos 5 error code. +An Kerberos 5 error code\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_data (krb5_data * data)" -.PP Create a fixed size memory storage block .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -A krb5_storage on success, or NULL on out of memory error. +A krb5_storage on success, or NULL on out of memory error\&. .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 krb5_storage_mem() .PP @@ -529,14 +563,15 @@ .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_fd (krb5_socket_t fd_in)" +.SS "KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_fd (int fd_in)" + .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -A krb5_storage on success, or NULL on out of memory error. +A krb5_storage on success, or NULL on out of memory error\&. .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 \fBkrb5_storage_emem()\fP .PP @@ -545,19 +580,20 @@ \fBkrb5_storage_from_readonly_mem()\fP .PP \fBkrb5_storage_from_data()\fP +.PP +\fBkrb5_storage_from_socket()\fP .RE .PP .SS "KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_mem (void * buf, size_t len)" -.PP Create a fixed size memory storage block .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -A krb5_storage on success, or NULL on out of memory error. +A krb5_storage on success, or NULL on out of memory error\&. .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 krb5_storage_mem() .PP @@ -566,19 +602,20 @@ \fBkrb5_storage_from_data()\fP .PP \fBkrb5_storage_from_fd()\fP +.PP +\fBkrb5_storage_from_socket()\fP .RE .PP .SS "KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_readonly_mem (const void * buf, size_t len)" -.PP Create a fixed size memory storage block that is read only .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -A krb5_storage on success, or NULL on out of memory error. +A krb5_storage on success, or NULL on out of memory error\&. .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 krb5_storage_mem() .PP @@ -590,46 +627,78 @@ .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_flags KRB5_LIB_CALL krb5_storage_get_byteorder (krb5_storage * sp)" +.SS "KRB5_LIB_FUNCTION krb5_storage* KRB5_LIB_CALL krb5_storage_from_socket (krb5_socket_t sock_in)" + .PP -Return the current byteorder for the buffer. See \fBkrb5_storage_set_byteorder()\fP for the list or byte order contants. -.SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_get_eof_code (krb5_storage * sp)" +\fBReturns\fP +.RS 4 +A krb5_storage on success, or NULL on out of memory error\&. +.RE .PP -Get the return code that will be used when end of storage is reached. +\fBSee also\fP +.RS 4 +\fBkrb5_storage_emem()\fP .PP -\fBParameters:\fP +\fBkrb5_storage_from_mem()\fP +.PP +\fBkrb5_storage_from_readonly_mem()\fP +.PP +\fBkrb5_storage_from_data()\fP +.PP +\fBkrb5_storage_from_fd()\fP +.RE +.PP + +.SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_fsync (krb5_storage * sp)" +Sync the storage buffer to its backing store\&. If there is no backing store this function will return success\&. +.PP +\fBParameters\fP +.RS 4 +\fIsp\fP the storage buffer to sync +.RE +.PP +\fBReturns\fP +.RS 4 +A Kerberos 5 error code +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_flags KRB5_LIB_CALL krb5_storage_get_byteorder (krb5_storage * sp)" +Return the current byteorder for the buffer\&. See \fBkrb5_storage_set_byteorder()\fP for the list or byte order contants\&. +.SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_get_eof_code (krb5_storage * sp)" +Get the return code that will be used when end of storage is reached\&. +.PP +\fBParameters\fP .RS 4 \fIsp\fP the storage .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 storage error code .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_storage_is_flags (krb5_storage * sp, krb5_flags flags)" +Return true or false depending on if the storage flags is set or not\&. NB testing for the flag 0 always return true\&. .PP -Return true or false depending on if the storage flags is set or not. NB testing for the flag 0 always return true. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to check flags on .br \fIflags\fP The flags to test for .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -true if all the flags are set, false if not. +true if all the flags are set, false if not\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_read (krb5_storage * sp, void * buf, size_t len)" +Read to the storage buffer\&. .PP -Read to the storage buffer. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to read from .br @@ -638,48 +707,45 @@ \fIlen\fP the length to read .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -The length of data read (can be shorter then len), or negative on error. +The length of data read (can be shorter then len), or negative on error\&. .RE .PP .SS "KRB5_LIB_FUNCTION off_t KRB5_LIB_CALL krb5_storage_seek (krb5_storage * sp, off_t offset, int whence)" +Seek to a new offset\&. .PP -Seek to a new offset. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIsp\fP the storage buffer to seek in. +\fIsp\fP the storage buffer to seek in\&. .br \fIoffset\fP the offset to seek .br -\fIwhence\fP relateive searching, SEEK_CUR from the current position, SEEK_END from the end, SEEK_SET absolute from the start. +\fIwhence\fP relateive searching, SEEK_CUR from the current position, SEEK_END from the end, SEEK_SET absolute from the start\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 The new current offset .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_byteorder (krb5_storage * sp, krb5_flags byteorder)" +Set the new byte order of the storage buffer\&. .PP -Set the new byte order of the storage buffer. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIsp\fP the storage buffer to set the byte order for. +\fIsp\fP the storage buffer to set the byte order for\&. .br -\fIbyteorder\fP the new byte order. +\fIbyteorder\fP the new byte order\&. .RE .PP -The byte order are: KRB5_STORAGE_BYTEORDER_BE, KRB5_STORAGE_BYTEORDER_LE and KRB5_STORAGE_BYTEORDER_HOST. +The byte order are: KRB5_STORAGE_BYTEORDER_BE, KRB5_STORAGE_BYTEORDER_LE and KRB5_STORAGE_BYTEORDER_HOST\&. .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_eof_code (krb5_storage * sp, int code)" +Set the return code that will be used when end of storage is reached\&. .PP -Set the return code that will be used when end of storage is reached. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage .br @@ -688,10 +754,9 @@ .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_flags (krb5_storage * sp, krb5_flags flags)" +Add the flags on a storage buffer by or-ing in the flags to the buffer\&. .PP -Add the flags on a storage buffer by or-ing in the flags to the buffer. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to set the flags on .br @@ -700,10 +765,9 @@ .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_max_alloc (krb5_storage * sp, size_t size)" -.PP Set the max alloc value .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer set the max allow for .br @@ -712,44 +776,41 @@ .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_to_data (krb5_storage * sp, krb5_data * data)" -.PP Copy the contnent of storage .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to copy to a data .br \fIdata\fP the copied data, free with \fBkrb5_data_free()\fP .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_truncate (krb5_storage * sp, off_t offset)" +Truncate the storage buffer in sp to offset\&. .PP -Truncate the storage buffer in sp to offset. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIsp\fP the storage buffer to truncate. +\fIsp\fP the storage buffer to truncate\&. .br -\fIoffset\fP the offset to truncate too. +\fIoffset\fP the offset to truncate too\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -An Kerberos 5 error code. +An Kerberos 5 error code\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_write (krb5_storage * sp, const void * buf, size_t len)" +Write to the storage buffer\&. .PP -Write to the storage buffer. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br @@ -758,298 +819,316 @@ \fIlen\fP the length to write .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -The length of data written (can be shorter then len), or negative on error. +The length of data written (can be shorter then len), or negative on error\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_address (krb5_storage * sp, krb5_address p)" +Write a address block to storage\&. .PP -Write a address block to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIp\fP the address block to write. +\fIp\fP the address block to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_addrs (krb5_storage * sp, krb5_addresses p)" +Write a addresses block to storage\&. .PP -Write a addresses block to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIp\fP the addresses block to write. +\fIp\fP the addresses block to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_authdata (krb5_storage * sp, krb5_authdata auth)" +Write a auth data block to storage\&. .PP -Write a auth data block to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIauth\fP the auth data block to write. +\fIauth\fP the auth data block to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds (krb5_storage * sp, krb5_creds * creds)" +Write a credentials block to storage\&. .PP -Write a credentials block to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIcreds\fP the creds block to write. +\fIcreds\fP the creds block to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds_tag (krb5_storage * sp, krb5_creds * creds)" +Write a tagged credentials block to storage\&. .PP -Write a tagged credentials block to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIcreds\fP the creds block to write. +\fIcreds\fP the creds block to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_data (krb5_storage * sp, krb5_data data)" +Store a data to the storage\&. The data is stored with an int32 as lenght plus the data (not padded)\&. .PP -Store a data to the storage. The data is stored with an int32 as lenght plus the data (not padded). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIdata\fP the buffer to store. +\fIdata\fP the buffer to store\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int16 (krb5_storage * sp, int16_t value)" +Store a int16 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -Store a int16 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value to store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int32 (krb5_storage * sp, int32_t value)" +Store a int32 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -Store a int32 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. +\fBParameters\fP +.RS 4 +\fIsp\fP the storage to write too +.br +\fIvalue\fP the value to store +.RE .PP -\fBParameters:\fP +\fBReturns\fP +.RS 4 +0 for success, or a Kerberos 5 error code on failure\&. +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int64 (krb5_storage * sp, int64_t value)" +Store a int64 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. +.PP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value to store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int8 (krb5_storage * sp, int8_t value)" +Store a int8 to storage\&. .PP -Store a int8 to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value to store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_keyblock (krb5_storage * sp, krb5_keyblock p)" +Store a keyblock to the storage\&. .PP -Store a keyblock to the storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br \fIp\fP the keyblock to write .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_principal (krb5_storage * sp, krb5_const_principal p)" +Write a principal block to storage\&. .PP -Write a principal block to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIp\fP the principal block to write. +\fIp\fP the principal block to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_string (krb5_storage * sp, const char * s)" +Store a string to the buffer\&. The data is formated as an len:uint32 plus the string itself (not padded)\&. .PP -Store a string to the buffer. The data is formated as an len:uint32 plus the string itself (not padded). -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIs\fP the string to store. +\fIs\fP the string to store\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_stringz (krb5_storage * sp, const char * s)" +Store a zero terminated string to the buffer\&. The data is stored one character at a time until a NUL is stored\&. .PP -Store a zero terminated string to the buffer. The data is stored one character at a time until a NUL is stored. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fIs\fP the string to store. +\fIs\fP the string to store\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_times (krb5_storage * sp, krb5_times times)" +Write a times block to storage\&. .PP -Write a times block to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage buffer to write to .br -\fItimes\fP the times block to write. +\fItimes\fP the times block to write\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, a Kerberos 5 error code on failure. +0 on success, a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint16 (krb5_storage * sp, uint16_t value)" +Store a uint16 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -Store a uint16 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value to store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint32 (krb5_storage * sp, uint32_t value)" +Store a uint32 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. +.PP +\fBParameters\fP +.RS 4 +\fIsp\fP the storage to write too +.br +\fIvalue\fP the value to store +.RE +.PP +\fBReturns\fP +.RS 4 +0 for success, or a Kerberos 5 error code on failure\&. +.RE .PP -Store a uint32 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP. + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint64 (krb5_storage * sp, uint64_t value)" +Store a uint64 to storage, byte order is controlled by the settings on the storage, see \fBkrb5_storage_set_byteorder()\fP\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value to store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint8 (krb5_storage * sp, uint8_t value)" +Store a uint8 to storage\&. .PP -Store a uint8 to storage. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIsp\fP the storage to write too .br \fIvalue\fP the value to store .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 for success, or a Kerberos 5 error code on failure. +0 for success, or a Kerberos 5 error code on failure\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage_from_socket.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage_from_socket.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage_from_socket.3 @@ -0,0 +1 @@ +.so man3/krb5_storage.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage_fsync.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage_fsync.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_storage_fsync.3 @@ -0,0 +1 @@ +.so man3/krb5_storage.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_store_int64.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_store_int64.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_store_int64.3 @@ -0,0 +1 @@ +.so man3/krb5_storage.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_store_uint64.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_store_uint64.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_store_uint64.3 @@ -0,0 +1 @@ +.so man3/krb5_storage.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_support.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_support.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_support.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_support.3 @@ -1,16 +1,38 @@ -.TH "Heimdal Kerberos 5 support functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_support" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 support functions \- +krb5_support \- Heimdal Kerberos 5 support functions +.SH SYNOPSIS +.br +.PP +.SS "Data Structures" + +.in +1c +.ti -1c +.RI "struct \fBkrb5plugin_an2ln_ftable_desc\fP" +.br +.RI "Description of the krb5_aname_to_lname(3) plugin facility\&. " +.ti -1c +.RI "struct \fBkrb5plugin_db_ftable_desc\fP" +.br +.RI "Description of the krb5 DB plugin facility\&. " +.ti -1c +.RI "struct \fBkrb5plugin_kuserok_ftable_desc\fP" +.br +.RI "Description of the krb5_kuserok(3) plugin facility\&. " +.in -1c .SS "Functions" .in +1c .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_acl_match_string\fP (krb5_context context, const char *string, const char *format,...)" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_acl_match_string\fP (krb5_context context, const char *string, const char *format,\&.\&.\&.)" +.br +.ti -1c +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_acl_match_file\fP (krb5_context context, const char *file, const char *format,\&.\&.\&.)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_acl_match_file\fP (krb5_context context, const char *file, const char *format,...)" +.RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_aname_to_localname\fP (krb5_context context, krb5_const_principal aname, size_t lnsize, char *lname)" .br .ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_config_parse_file_multi\fP (krb5_context context, const char *fname, krb5_config_section **res)" @@ -19,13 +41,13 @@ .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_config_file_free\fP (krb5_context context, krb5_config_section *s)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION const krb5_config_binding *KRB5_LIB_CALL \fBkrb5_config_get_list\fP (krb5_context context, const krb5_config_section *c,...)" +.RI "KRB5_LIB_FUNCTION const krb5_config_binding *KRB5_LIB_CALL \fBkrb5_config_get_list\fP (krb5_context context, const krb5_config_section *c,\&.\&.\&.)" .br .ti -1c .RI "KRB5_LIB_FUNCTION const krb5_config_binding *KRB5_LIB_CALL \fBkrb5_config_vget_list\fP (krb5_context context, const krb5_config_section *c, va_list args)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_config_get_string\fP (krb5_context context, const krb5_config_section *c,...)" +.RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_config_get_string\fP (krb5_context context, const krb5_config_section *c,\&.\&.\&.)" .br .ti -1c .RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_config_vget_string\fP (krb5_context context, const krb5_config_section *c, va_list args)" @@ -34,13 +56,13 @@ .RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_config_vget_string_default\fP (krb5_context context, const krb5_config_section *c, const char *def_value, va_list args)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_config_get_string_default\fP (krb5_context context, const krb5_config_section *c, const char *def_value,...)" +.RI "KRB5_LIB_FUNCTION const char *KRB5_LIB_CALL \fBkrb5_config_get_string_default\fP (krb5_context context, const krb5_config_section *c, const char *def_value,\&.\&.\&.)" .br .ti -1c .RI "KRB5_LIB_FUNCTION char **KRB5_LIB_CALL \fBkrb5_config_vget_strings\fP (krb5_context context, const krb5_config_section *c, va_list args)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION char **KRB5_LIB_CALL \fBkrb5_config_get_strings\fP (krb5_context context, const krb5_config_section *c,...)" +.RI "KRB5_LIB_FUNCTION char **KRB5_LIB_CALL \fBkrb5_config_get_strings\fP (krb5_context context, const krb5_config_section *c,\&.\&.\&.)" .br .ti -1c .RI "KRB5_LIB_FUNCTION void KRB5_LIB_CALL \fBkrb5_config_free_strings\fP (char **strings)" @@ -52,10 +74,10 @@ .RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_config_vget_bool\fP (krb5_context context, const krb5_config_section *c, va_list args)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_config_get_bool_default\fP (krb5_context context, const krb5_config_section *c, krb5_boolean def_value,...)" +.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_config_get_bool_default\fP (krb5_context context, const krb5_config_section *c, krb5_boolean def_value,\&.\&.\&.)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_config_get_bool\fP (krb5_context context, const krb5_config_section *c,...)" +.RI "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL \fBkrb5_config_get_bool\fP (krb5_context context, const krb5_config_section *c,\&.\&.\&.)" .br .ti -1c .RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_config_vget_time_default\fP (krb5_context context, const krb5_config_section *c, int def_value, va_list args)" @@ -64,10 +86,10 @@ .RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_config_vget_time\fP (krb5_context context, const krb5_config_section *c, va_list args)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_config_get_time_default\fP (krb5_context context, const krb5_config_section *c, int def_value,...)" +.RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_config_get_time_default\fP (krb5_context context, const krb5_config_section *c, int def_value,\&.\&.\&.)" .br .ti -1c -.RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_config_get_time\fP (krb5_context context, const krb5_config_section *c,...)" +.RI "KRB5_LIB_FUNCTION int KRB5_LIB_CALL \fBkrb5_config_get_time\fP (krb5_context context, const krb5_config_section *c,\&.\&.\&.)" .br .ti -1c .RI "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL \fBkrb5_expand_hostname\fP (krb5_context context, const char *orig_hostname, char **new_hostname)" @@ -90,48 +112,46 @@ .SH "Function Documentation" .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_file (krb5_context context, const char * file, const char * format, ...)" +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_file (krb5_context context, const char * file, const char * format, \&.\&.\&.)" +krb5_acl_match_file matches ACL format against each line in a file using \fBkrb5_acl_match_string()\fP\&. Lines starting with # are treated like comments and ignored\&. .PP -krb5_acl_match_file matches ACL format against each line in a file using \fBkrb5_acl_match_string()\fP. Lines starting with # are treated like comments and ignored. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIfile\fP file with acl listed in the file. +\fIfile\fP file with acl listed in the file\&. .br -\fIformat\fP format to match. +\fIformat\fP format to match\&. .br -\fI...\fP parameter to format string. +\fI\&.\&.\&.\fP parameter to format string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 \fBkrb5_acl_match_string\fP .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_string (krb5_context context, const char * string, const char * format, ...)" -.PP -krb5_acl_match_string matches ACL format against a string. +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_string (krb5_context context, const char * string, const char * format, \&.\&.\&.)" +krb5_acl_match_string matches ACL format against a string\&. .PP -The ACL format has three format specifiers: s, f, and r. Each specifier will retrieve one argument from the variable arguments for either matching or storing data. The input string is split up using ' ' (space) and '\\t' (tab) as a delimiter; multiple and '\\t' in a row are considered to be the same. +The ACL format has three format specifiers: s, f, and r\&. Each specifier will retrieve one argument from the variable arguments for either matching or storing data\&. The input string is split up using ' ' (space) and '\\t' (tab) as a delimiter; multiple and '\\t' in a row are considered to be the same\&. .PP List of format specifiers: .IP "\(bu" 2 -s Matches a string using strcmp(3) (case sensitive). +s Matches a string using strcmp(3) (case sensitive)\&. .IP "\(bu" 2 -f Matches the string with fnmatch(3). Theflags argument (the last argument) passed to the fnmatch function is 0. +f Matches the string with fnmatch(3)\&. Theflags argument (the last argument) passed to the fnmatch function is 0\&. .IP "\(bu" 2 -r Returns a copy of the string in the char ** passed in; the copy must be freed with free(3). There is no need to free(3) the string on error: the function will clean up and set the pointer to NULL. +r Returns a copy of the string in the char ** passed in; the copy must be freed with free(3)\&. There is no need to free(3) the string on error: the function will clean up and set the pointer to NULL\&. .PP .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos 5 context .br @@ -139,499 +159,492 @@ .br \fIformat\fP format to match .br -\fI...\fP parameter to format string +\fI\&.\&.\&.\fP parameter to format string .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0. +Return an error code or 0\&. .RE .PP .PP .nf - char *s; +char *s; - ret = krb5_acl_match_string(context, 'foo', 's', 'foo'); - if (ret) - krb5_errx(context, 1, 'acl didn't match'); - ret = krb5_acl_match_string(context, 'foo foo baz/kaka', - 'ss', 'foo', &s, 'foo/\\*'); - if (ret) { - // no need to free(s) on error - assert(s == NULL); - krb5_errx(context, 1, 'acl didn't match'); - } - free(s); +ret = krb5_acl_match_string(context, "foo", "s", "foo"); +if (ret) + krb5_errx(context, 1, "acl didn't match"); +ret = krb5_acl_match_string(context, "foo foo baz/kaka", + "ss", "foo", &s, "foo/\\*"); +if (ret) { + // no need to free(s) on error + assert(s == NULL); + krb5_errx(context, 1, "acl didn't match"); +} +free(s); .fi .PP .PP -\fBSee also:\fP +\fBSee also\fP .RS 4 \fBkrb5_acl_match_file\fP .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_file_free (krb5_context context, krb5_config_section * s)" +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_aname_to_localname (krb5_context context, krb5_const_principal aname, size_t lnsize, char * lname)" +Map a principal name to a local username\&. +.PP +Returns 0 on success, KRB5_NO_LOCALNAME if no mapping was found, or some Kerberos or system error\&. .PP -Free configuration file section, the result of krb5_config_parse_file() and \fBkrb5_config_parse_file_multi()\fP. +Inputs: +.PP +\fBParameters\fP +.RS 4 +\fIcontext\fP A krb5_context +.br +\fIaname\fP A principal name +.br +\fIlnsize\fP The size of the buffer into which the username will be written +.br +\fIlname\fP The buffer into which the username will be written +.RE +.PP + +.SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_file_free (krb5_context context, krb5_config_section * s)" +Free configuration file section, the result of krb5_config_parse_file() and \fBkrb5_config_parse_file_multi()\fP\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP A Kerberos 5 context .br \fIs\fP the configuration section to free .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -returns 0 on successes, otherwise an error code, see krb5_get_error_message() +returns 0 on successes, otherwise an error code, see \fBkrb5_get_error_message()\fP .RE .PP .SS "KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_config_free_strings (char ** strings)" +Free the resulting strings from krb5_config-get_strings() and \fBkrb5_config_vget_strings()\fP\&. .PP -Free the resulting strings from krb5_config-get_strings() and \fBkrb5_config_vget_strings()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIstrings\fP strings to free .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool (krb5_context context, const krb5_config_section * c, ...)" -.PP -Like \fBkrb5_config_get_bool()\fP but with a va_list list of configuration selection. +.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool (krb5_context context, const krb5_config_section * c, \&.\&.\&.)" +Like \fBkrb5_config_get_bool()\fP but with a va_list list of configuration selection\&. .PP -Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE. +Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 TRUE or FALSE .RE .PP -.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool_default (krb5_context context, const krb5_config_section * c, krb5_boolean def_value, ...)" +.SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool_default (krb5_context context, const krb5_config_section * c, krb5_boolean def_value, \&.\&.\&.)" +\fBkrb5_config_get_bool_default()\fP will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE\&. .PP -\fBkrb5_config_get_bool_default()\fP will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fIdef_value\fP the default value to return if no configuration found in the database. +\fIdef_value\fP the default value to return if no configuration found in the database\&. .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 TRUE or FALSE .RE .PP -.SS "KRB5_LIB_FUNCTION const krb5_config_binding* KRB5_LIB_CALL krb5_config_get_list (krb5_context context, const krb5_config_section * c, ...)" -.PP +.SS "KRB5_LIB_FUNCTION const krb5_config_binding* KRB5_LIB_CALL krb5_config_get_list (krb5_context context, const krb5_config_section * c, \&.\&.\&.)" Get a list of configuration binding list for more processing .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 NULL if configuration list is not found, a list otherwise .RE .PP -.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string (krb5_context context, const krb5_config_section * c, ...)" +.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string (krb5_context context, const krb5_config_section * c, \&.\&.\&.)" +Returns a 'const char *' to a string in the configuration database\&. The string may not be valid after a reload of the configuration database so a caller should make a local copy if it needs to keep the string\&. .PP -Returns a 'const char *' to a string in the configuration database. The string may not be valid after a reload of the configuration database so a caller should make a local copy if it needs to keep the string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 NULL if configuration string not found, a string otherwise .RE .PP -.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string_default (krb5_context context, const krb5_config_section * c, const char * def_value, ...)" -.PP -Like \fBkrb5_config_get_string()\fP, but instead of returning NULL, instead return a default value. +.SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string_default (krb5_context context, const krb5_config_section * c, const char * def_value, \&.\&.\&.)" +Like \fBkrb5_config_get_string()\fP, but instead of returning NULL, instead return a default value\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fIdef_value\fP the default value to return if no configuration found in the database. +\fIdef_value\fP the default value to return if no configuration found in the database\&. .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 a configuration string .RE .PP -.SS "KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_get_strings (krb5_context context, const krb5_config_section * c, ...)" -.PP -Get a list of configuration strings, free the result with \fBkrb5_config_free_strings()\fP. +.SS "KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_get_strings (krb5_context context, const krb5_config_section * c, \&.\&.\&.)" +Get a list of configuration strings, free the result with \fBkrb5_config_free_strings()\fP\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 TRUE or FALSE .RE .PP -.SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time (krb5_context context, const krb5_config_section * c, ...)" -.PP +.SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time (krb5_context context, const krb5_config_section * c, \&.\&.\&.)" Get the time from the configuration file using a relative time, for example: 1h30s .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 parsed the time or -1 on error .RE .PP -.SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time_default (krb5_context context, const krb5_config_section * c, int def_value, ...)" -.PP +.SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time_default (krb5_context context, const krb5_config_section * c, int def_value, \&.\&.\&.)" Get the time from the configuration file using a relative time, for example: 1h30s .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fIdef_value\fP the default value to return if no configuration found in the database. +\fIdef_value\fP the default value to return if no configuration found in the database\&. .br -\fI...\fP a list of names, terminated with NULL. +\fI\&.\&.\&.\fP a list of names, terminated with NULL\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 parsed the time (or def_value on parse error) .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_file_multi (krb5_context context, const char * fname, krb5_config_section ** res)" +Parse a configuration file and add the result into res\&. This interface can be used to parse several configuration files into one resulting krb5_config_section by calling it repeatably\&. .PP -Parse a configuration file and add the result into res. This interface can be used to parse several configuration files into one resulting krb5_config_section by calling it repeatably. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP a Kerberos 5 context. +\fIcontext\fP a Kerberos 5 context\&. .br \fIfname\fP a file name to a Kerberos configuration file .br -\fIres\fP the returned result, must be free with \fBkrb5_free_config_files()\fP. +\fIres\fP the returned result, must be free with \fBkrb5_free_config_files()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP - -.PP -If the fname starts with '~/' parse configuration file in the current users home directory. The behavior can be disabled and enabled by calling \fBkrb5_set_home_dir_access()\fP. +If the fname starts with '~/' parse configuration file in the current users home directory\&. The behavior can be disabled and enabled by calling \fBkrb5_set_home_dir_access()\fP\&. .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool (krb5_context context, const krb5_config_section * c, va_list args)" +\fBkrb5_config_get_bool()\fP will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE\&. .PP -\fBkrb5_config_get_bool()\fP will convert the configuration option value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 TRUE or FALSE .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool_default (krb5_context context, const krb5_config_section * c, krb5_boolean def_value, va_list args)" +Like \fBkrb5_config_get_bool_default()\fP but with a va_list list of configuration selection\&. .PP -Like \fBkrb5_config_get_bool_default()\fP but with a va_list list of configuration selection. +Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE\&. .PP -Configuration value to a boolean value, where yes/true and any non-zero number means TRUE and other value is FALSE. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fIdef_value\fP the default value to return if no configuration found in the database. +\fIdef_value\fP the default value to return if no configuration found in the database\&. .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 TRUE or FALSE .RE .PP .SS "KRB5_LIB_FUNCTION const krb5_config_binding* KRB5_LIB_CALL krb5_config_vget_list (krb5_context context, const krb5_config_section * c, va_list args)" -.PP Get a list of configuration binding list for more processing .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 NULL if configuration list is not found, a list otherwise .RE .PP .SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string (krb5_context context, const krb5_config_section * c, va_list args)" +Like \fBkrb5_config_get_string()\fP, but uses a va_list instead of \&.\&.\&. .PP -Like \fBkrb5_config_get_string()\fP, but uses a va_list instead of ... -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 NULL if configuration string not found, a string otherwise .RE .PP .SS "KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string_default (krb5_context context, const krb5_config_section * c, const char * def_value, va_list args)" +Like \fBkrb5_config_vget_string()\fP, but instead of returning NULL, instead return a default value\&. .PP -Like \fBkrb5_config_vget_string()\fP, but instead of returning NULL, instead return a default value. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fIdef_value\fP the default value to return if no configuration found in the database. +\fIdef_value\fP the default value to return if no configuration found in the database\&. .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 a configuration string .RE .PP .SS "KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_vget_strings (krb5_context context, const krb5_config_section * c, va_list args)" +Get a list of configuration strings, free the result with \fBkrb5_config_free_strings()\fP\&. .PP -Get a list of configuration strings, free the result with \fBkrb5_config_free_strings()\fP. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 TRUE or FALSE .RE .PP .SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time (krb5_context context, const krb5_config_section * c, va_list args)" -.PP Get the time from the configuration file using a relative time, for example: 1h30s .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 parsed the time or -1 on error .RE .PP .SS "KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time_default (krb5_context context, const krb5_config_section * c, int def_value, va_list args)" +Get the time from the configuration file using a relative time\&. .PP -Get the time from the configuration file using a relative time. -.PP -Like \fBkrb5_config_get_time_default()\fP but with a va_list list of configuration selection. +Like \fBkrb5_config_get_time_default()\fP but with a va_list list of configuration selection\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIc\fP a configuration section, or NULL to use the section from context .br -\fIdef_value\fP the default value to return if no configuration found in the database. +\fIdef_value\fP the default value to return if no configuration found in the database\&. .br \fIargs\fP a va_list of arguments .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 parsed the time (or def_value on parse error) .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname (krb5_context context, const char * orig_hostname, char ** new_hostname)" +\fBkrb5_expand_hostname()\fP tries to make orig_hostname into a more canonical one in the newly allocated space returned in new_hostname\&. .PP -\fBkrb5_expand_hostname()\fP tries to make orig_hostname into a more canonical one in the newly allocated space returned in new_hostname. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br -\fIorig_hostname\fP hostname to canonicalise. +\fIorig_hostname\fP hostname to canonicalise\&. .br -\fInew_hostname\fP output hostname, caller must free hostname with krb5_xfree(). +\fInew_hostname\fP output hostname, caller must free hostname with krb5_xfree()\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname_realms (krb5_context context, const char * orig_hostname, char ** new_hostname, char *** realms)" +\fBkrb5_expand_hostname_realms()\fP expands orig_hostname to a name we believe to be a hostname in newly allocated space in new_hostname and return the realms new_hostname is believed to belong to in realms\&. .PP -\fBkrb5_expand_hostname_realms()\fP expands orig_hostname to a name we believe to be a hostname in newly allocated space in new_hostname and return the realms new_hostname is believed to belong to in realms. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br -\fIorig_hostname\fP hostname to canonicalise. +\fIorig_hostname\fP hostname to canonicalise\&. .br -\fInew_hostname\fP output hostname, caller must free hostname with krb5_xfree(). +\fInew_hostname\fP output hostname, caller must free hostname with krb5_xfree()\&. .br -\fIrealms\fP output possible realms, is an array that is terminated with NULL. Caller must free with \fBkrb5_free_host_realm()\fP. +\fIrealms\fP output possible realms, is an array that is terminated with NULL\&. Caller must free with \fBkrb5_free_host_realm()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Return an error code or 0, see krb5_get_error_message(). +Return an error code or 0, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_host_realm (krb5_context context, krb5_realm * realmlist)" -.PP Free all memory allocated by `realmlist' .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP A Kerberos 5 context. +\fIcontext\fP A Kerberos 5 context\&. .br \fIrealmlist\fP realmlist to free, NULL is ok .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -a Kerberos error code, always 0. +a Kerberos error code, always 0\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kuserok (krb5_context context, krb5_principal principal, const char * luser)" +This function takes the name of a local user and checks if principal is allowed to log in as that user\&. .PP -This function takes the name of a local user and checks if principal is allowed to log in as that user. +The user may have a ~/\&.k5login file listing principals that are allowed to login as that user\&. If that file does not exist, all principals with a only one component that is identical to the username, and a realm considered local, are allowed access\&. .PP -The user may have a ~/.k5login file listing principals that are allowed to login as that user. If that file does not exist, all principals with a first component identical to the username, and a realm considered local, are allowed access. +The \&.k5login file must contain one principal per line, be owned by user and not be writable by group or other (but must be readable by anyone)\&. .PP -The .k5login file must contain one principal per line, be owned by user and not be writable by group or other (but must be readable by anyone). +Note that if the file exists, no implicit access rights are given to user@LOCALREALM\&. .PP -Note that if the file exists, no implicit access rights are given to user@LOCALREALM. +Optionally, a set of files may be put in ~/\&.k5login\&.d (a directory), in which case they will all be checked in the same manner as \&.k5login\&. The files may be called anything, but files starting with a hash (#) , or ending with a tilde (~) are ignored\&. Subdirectories are not traversed\&. Note that this directory may not be checked by other Kerberos implementations\&. .PP -Optionally, a set of files may be put in ~/.k5login.d (a directory), in which case they will all be checked in the same manner as .k5login. The files may be called anything, but files starting with a hash (#) , or ending with a tilde (~) are ignored. Subdirectories are not traversed. Note that this directory may not be checked by other Kerberos implementations. +If no configuration file exists, match user against local domains, ie luser@LOCAL-REALMS-IN-CONFIGURATION-FILES\&. .PP -If no configuration file exists, match user against local domains, ie luser@LOCAL-REALMS-IN-CONFIGURATION-FILES. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIprincipal\fP principal to check if allowed to login .br \fIluser\fP local user id .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -returns TRUE if access should be granted, FALSE otherwise. +returns TRUE if access should be granted, FALSE otherwise\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_plugin_register (krb5_context context, enum krb5_plugin_type type, const char * name, void * symbol)" +Register a plugin symbol name of specific type\&. .PP -Register a plugin symbol name of specific type. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP a Keberos context .br @@ -642,9 +655,12 @@ \fIsymbol\fP a pointer to the named symbol .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of error a non zero error com_err error is returned and the Kerberos error string is set. +In case of error a non zero error com_err error is returned and the Kerberos error string is set\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ticket.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ticket.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ticket.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_ticket.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 5 ticket functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_ticket" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 5 ticket functions \- +krb5_ticket \- Heimdal Kerberos 5 ticket functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -16,19 +19,21 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_ticket_get_flags (krb5_context context, const krb5_ticket * ticket)" -.PP Get the flags from the Kerberos ticket .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIcontext\fP Kerberos context .br \fIticket\fP Kerberos ticket .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 ticket flags .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_v4compat.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_v4compat.3 --- a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_v4compat.3 +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_v4compat.3 @@ -1,8 +1,11 @@ -.TH "Heimdal Kerberos 4 compatibility functions" 3 "11 Jan 2012" "Version 1.5.2" "HeimdalKerberos5library" \" -*- nroff -*- +.TH "krb5_v4compat" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal Kerberos 4 compatibility functions \- +krb5_v4compat \- Heimdal Kerberos 4 compatiblity functions +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -19,42 +22,43 @@ .SH "Function Documentation" .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc (krb5_context context, krb5_creds * in_cred, struct credentials * v4creds)" +Convert the v5 credentials in in_cred to v4-dito in v4creds\&. This is done by sending them to the 524 function in the KDC\&. If `in_cred' doesn't contain a DES session key, then a new one is gotten from the KDC and stored in the cred cache `ccache'\&. .PP -Convert the v5 credentials in in_cred to v4-dito in v4creds. This is done by sending them to the 524 function in the KDC. If `in_cred' doesn't contain a DES session key, then a new one is gotten from the KDC and stored in the cred cache `ccache'. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br \fIin_cred\fP the credential to convert .br \fIv4creds\fP the converted credential .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP .SS "KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc_ccache (krb5_context context, krb5_ccache ccache, krb5_creds * in_cred, struct credentials * v4creds)" +Convert the v5 credentials in in_cred to v4-dito in v4creds, check the credential cache ccache before checking with the KDC\&. .PP -Convert the v5 credentials in in_cred to v4-dito in v4creds, check the credential cache ccache before checking with the KDC. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIcontext\fP Kerberos 5 context. +\fIcontext\fP Kerberos 5 context\&. .br -\fIccache\fP credential cache used to check for des-ticket. +\fIccache\fP credential cache used to check for des-ticket\&. .br \fIin_cred\fP the credential to convert .br \fIv4creds\fP the converted credential .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -Returns 0 to indicate success. Otherwise an kerberos et error code is returned, see krb5_get_error_message(). +Returns 0 to indicate success\&. Otherwise an kerberos et error code is returned, see \fBkrb5_get_error_message()\fP\&. .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vabort.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vabort.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vabort.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_verr.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_verr.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_verr.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_verrx.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_verrx.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_verrx.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vprepend_error_message.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vprepend_error_message.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vprepend_error_message.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vset_error_message.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vset_error_message.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vset_error_message.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vwarnx.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vwarnx.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_vwarnx.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_warn.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_warn.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_warn.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_warnx.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_warnx.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5_warnx.3 @@ -0,0 +1 @@ +.so man3/krb5_error.3 diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_an2ln_ftable_desc.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_an2ln_ftable_desc.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_an2ln_ftable_desc.3 @@ -0,0 +1,52 @@ +.TH "krb5plugin_an2ln_ftable_desc" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- +.ad l +.nh +.SH NAME +krb5plugin_an2ln_ftable_desc \- Description of the krb5_aname_to_lname(3) plugin facility\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fC#include \fP +.SH "Detailed Description" +.PP +Description of the krb5_aname_to_lname(3) plugin facility\&. + +The krb5_aname_to_lname(3) function is pluggable\&. The plugin is named KRB5_PLUGIN_AN2LN ('an2ln'), with a single minor version, KRB5_PLUGIN_AN2LN_VERSION_0 (0)\&. +.PP +The plugin for krb5_aname_to_lname(3) consists of a data symbol referencing a structure of type krb5plugin_an2ln_ftable, with four fields: +.PP +\fBParameters\fP +.RS 4 +\fIinit\fP Plugin initialization function (see krb5-plugin(7)) +.br +\fIminor_version\fP The plugin minor version number (0) +.br +\fIfini\fP Plugin finalization function +.br +\fIan2ln\fP Plugin aname_to_lname function +.RE +.PP +The an2ln field is the plugin entry point that performs the traditional aname_to_lname operation however the plugin desires\&. It is invoked in no particular order relative to other an2ln plugins, but it has a 'rule' argument that indicates which plugin is intended to act on the rule\&. The plugin an2ln function must return KRB5_PLUGIN_NO_HANDLE if the rule is not applicable to it\&. +.PP +The plugin an2ln function has the following arguments, in this order: +.PP +.IP "1." 4 +plug_ctx, the context value output by the plugin's init function +.IP "2." 4 +context, a krb5_context +.IP "3." 4 +rule, the aname_to_lname rule being evaluated (from krb5\&.conf(5)) +.IP "4." 4 +aname, the krb5_principal to be mapped to an lname +.IP "5." 4 +set_res_f, a function the plugin must call to set its result +.IP "6." 4 +set_res_ctx, the first argument to set_res_f (the second is the result lname string) +.PP + + +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_db_ftable_desc.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_db_ftable_desc.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_db_ftable_desc.3 @@ -0,0 +1,33 @@ +.TH "krb5plugin_db_ftable_desc" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- +.ad l +.nh +.SH NAME +krb5plugin_db_ftable_desc \- Description of the krb5 DB plugin facility\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fC#include \fP +.SH "Detailed Description" +.PP +Description of the krb5 DB plugin facility\&. + +The krb5_aname_to_lname(3) function's DB rule is pluggable\&. The plugin is named KRB5_PLUGIN_DB ('krb5_db_plug'), with a single minor version, KRB5_PLUGIN_DB_VERSION_0 (0)\&. +.PP +The plugin consists of a data symbol referencing a structure of type \fBkrb5plugin_db_ftable_desc\fP, with three fields: +.PP +\fBParameters\fP +.RS 4 +\fIinit\fP Plugin initialization function (see krb5-plugin(7)) +.br +\fIminor_version\fP The plugin minor version number (0) +.br +\fIfini\fP Plugin finalization function +.RE +.PP +The init entry point is expected to call heim_db_register()\&. The fini entry point is expected to do nothing\&. + +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_kuserok_ftable_desc.3 b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_kuserok_ftable_desc.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/krb5/man/man3/krb5plugin_kuserok_ftable_desc.3 @@ -0,0 +1,56 @@ +.TH "krb5plugin_kuserok_ftable_desc" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal Kerberos 5 library" \" -*- nroff -*- +.ad l +.nh +.SH NAME +krb5plugin_kuserok_ftable_desc \- Description of the krb5_kuserok(3) plugin facility\&. + +.SH SYNOPSIS +.br +.PP +.PP +\fC#include \fP +.SH "Detailed Description" +.PP +Description of the krb5_kuserok(3) plugin facility\&. + +The krb5_kuserok(3) function is pluggable\&. The plugin is named KRB5_PLUGIN_KUSEROK ('krb5_plugin_kuserok'), with a single minor version, KRB5_PLUGIN_KUSEROK_VERSION_0 (0)\&. +.PP +The plugin for krb5_kuserok(3) consists of a data symbol referencing a structure of type krb5plugin_kuserok_ftable, with four fields: +.PP +\fBParameters\fP +.RS 4 +\fIinit\fP Plugin initialization function (see krb5-plugin(7)) +.br +\fIminor_version\fP The plugin minor version number (0) +.br +\fIfini\fP Plugin finalization function +.br +\fIkuserok\fP Plugin kuserok function +.RE +.PP +The kuserok field is the plugin entry point that performs the traditional kuserok operation however the plugin desires\&. It is invoked in no particular order relative to other kuserok plugins, but it has a 'rule' argument that indicates which plugin is intended to act on the rule\&. The plugin kuserok function must return KRB5_PLUGIN_NO_HANDLE if the rule is not applicable to it\&. +.PP +The plugin kuserok function has the following arguments, in this order: +.PP +.IP "1." 4 +plug_ctx, the context value output by the plugin's init function +.IP "2." 4 +context, a krb5_context +.IP "3." 4 +rule, the kuserok rule being evaluated (from krb5\&.conf(5)) +.IP "4." 4 +flags +.IP "5." 4 +k5login_dir, configured location of k5login per-user files if any +.IP "6." 4 +luser, name of the local user account to which principal is attempting to access\&. +.IP "7." 4 +principal, the krb5_principal trying to access the luser account +.IP "8." 4 +result, a krb5_boolean pointer where the plugin will output its result +.PP + + +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal Kerberos 5 library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/krb5/manpages b/crypto/heimdal/doc/doxyout/krb5/manpages --- a/crypto/heimdal/doc/doxyout/krb5/manpages +++ b/crypto/heimdal/doc/doxyout/krb5/manpages @@ -1,25 +1,120 @@ +krb5/man/man3/krb5_ccache_intro.3 +krb5/man/man3/krb5_introduction.3 +krb5/man/man3/krb5_fileformats.3 +krb5/man/man3/krb5_init_creds_intro.3 +krb5/man/man3/krb5_keytab_intro.3 +krb5/man/man3/krb5_principal_intro.3 krb5/man/man3/krb5.3 -krb5/man/man3/krb524_convert_creds_kdc.3 -krb5/man/man3/krb524_convert_creds_kdc_ccache.3 -krb5/man/man3/krb5_acc_ops.3 -krb5/man/man3/krb5_acl_match_file.3 -krb5/man/man3/krb5_acl_match_string.3 krb5/man/man3/krb5_add_et_list.3 krb5/man/man3/krb5_add_extra_addresses.3 krb5/man/man3/krb5_add_ignore_addresses.3 -krb5/man/man3/krb5_addr2sockaddr.3 +krb5/man/man3/krb5_compare_creds.3 +krb5/man/man3/krb5_copy_context.3 +krb5/man/man3/krb5_copy_creds.3 +krb5/man/man3/krb5_copy_creds_contents.3 +krb5/man/man3/krb5_copy_data.3 +krb5/man/man3/krb5_copy_host_realm.3 +krb5/man/man3/krb5_copy_ticket.3 +krb5/man/man3/krb5_creds_get_ticket_flags.3 +krb5/man/man3/krb5_data_alloc.3 +krb5/man/man3/krb5_data_cmp.3 +krb5/man/man3/krb5_data_copy.3 +krb5/man/man3/krb5_data_ct_cmp.3 +krb5/man/man3/krb5_data_free.3 +krb5/man/man3/krb5_data_realloc.3 +krb5/man/man3/krb5_data_zero.3 +krb5/man/man3/krb5_free_config_files.3 +krb5/man/man3/krb5_free_context.3 +krb5/man/man3/krb5_free_cred_contents.3 +krb5/man/man3/krb5_free_creds.3 +krb5/man/man3/krb5_free_data.3 +krb5/man/man3/krb5_free_ticket.3 +krb5/man/man3/krb5_get_default_config_files.3 +krb5/man/man3/krb5_get_default_in_tkt_etypes.3 +krb5/man/man3/krb5_get_dns_canonicalize_hostname.3 +krb5/man/man3/krb5_get_err_text.3 +krb5/man/man3/krb5_get_extra_addresses.3 +krb5/man/man3/krb5_get_fcache_version.3 +krb5/man/man3/krb5_get_ignore_addresses.3 +krb5/man/man3/krb5_get_kdc_sec_offset.3 +krb5/man/man3/krb5_get_max_time_skew.3 +krb5/man/man3/krb5_get_use_admin_kdc.3 +krb5/man/man3/krb5_init_context.3 +krb5/man/man3/krb5_init_ets.3 +krb5/man/man3/krb5_is_thread_safe.3 +krb5/man/man3/krb5_kerberos_enctypes.3 +krb5/man/man3/krb5_krbhst_get_addrinfo.3 +krb5/man/man3/krb5_prepend_config_files_default.3 +krb5/man/man3/krb5_set_config_files.3 +krb5/man/man3/krb5_set_default_in_tkt_etypes.3 +krb5/man/man3/krb5_set_dns_canonicalize_hostname.3 +krb5/man/man3/krb5_set_extra_addresses.3 +krb5/man/man3/krb5_set_fcache_version.3 +krb5/man/man3/krb5_set_home_dir_access.3 +krb5/man/man3/krb5_set_ignore_addresses.3 +krb5/man/man3/krb5_set_kdc_sec_offset.3 +krb5/man/man3/krb5_set_max_time_skew.3 +krb5/man/man3/krb5_set_password.3 +krb5/man/man3/krb5_set_real_time.3 +krb5/man/man3/krb5_set_use_admin_kdc.3 +krb5/man/man3/krb5_ticket_get_authorization_data_type.3 +krb5/man/man3/krb5_ticket_get_client.3 +krb5/man/man3/krb5_ticket_get_endtime.3 +krb5/man/man3/krb5_ticket_get_server.3 krb5/man/man3/krb5_address.3 +krb5/man/man3/krb5_addr2sockaddr.3 krb5/man/man3/krb5_address_compare.3 krb5/man/man3/krb5_address_order.3 krb5/man/man3/krb5_address_prefixlen_boundary.3 krb5/man/man3/krb5_address_search.3 -krb5/man/man3/krb5_allow_weak_crypto.3 krb5/man/man3/krb5_anyaddr.3 krb5/man/man3/krb5_append_addresses.3 -krb5/man/man3/krb5_auth.3 -krb5/man/man3/krb5_auth_getremoteseqnumber.3 +krb5/man/man3/krb5_copy_address.3 +krb5/man/man3/krb5_copy_addresses.3 +krb5/man/man3/krb5_free_address.3 +krb5/man/man3/krb5_free_addresses.3 +krb5/man/man3/krb5_h_addr2addr.3 +krb5/man/man3/krb5_h_addr2sockaddr.3 +krb5/man/man3/krb5_make_addrport.3 +krb5/man/man3/krb5_max_sockaddr_size.3 +krb5/man/man3/krb5_parse_address.3 +krb5/man/man3/krb5_print_address.3 +krb5/man/man3/krb5_sockaddr2address.3 +krb5/man/man3/krb5_sockaddr2port.3 +krb5/man/man3/krb5_sockaddr_uninteresting.3 +krb5/man/man3/krb5_principal.3 krb5/man/man3/krb5_build_principal.3 -krb5/man/man3/krb5_c_enctype_compare.3 +krb5/man/man3/krb5_copy_principal.3 +krb5/man/man3/krb5_free_principal.3 +krb5/man/man3/krb5_make_principal.3 +krb5/man/man3/krb5_parse_name.3 +krb5/man/man3/krb5_parse_name_flags.3 +krb5/man/man3/krb5_parse_nametype.3 +krb5/man/man3/krb5_principal_compare.3 +krb5/man/man3/krb5_principal_compare_any_realm.3 +krb5/man/man3/krb5_principal_get_num_comp.3 +krb5/man/man3/krb5_principal_get_realm.3 +krb5/man/man3/krb5_principal_get_type.3 +krb5/man/man3/krb5_principal_is_anonymous.3 +krb5/man/man3/krb5_principal_is_gss_hostbased_service.3 +krb5/man/man3/krb5_principal_is_krbtgt.3 +krb5/man/man3/krb5_principal_is_lkdc.3 +krb5/man/man3/krb5_principal_is_null.3 +krb5/man/man3/krb5_principal_is_pku2u.3 +krb5/man/man3/krb5_principal_is_root_krbtgt.3 +krb5/man/man3/krb5_principal_match.3 +krb5/man/man3/krb5_principal_set_realm.3 +krb5/man/man3/krb5_principal_set_type.3 +krb5/man/man3/krb5_realm_compare.3 +krb5/man/man3/krb5_realm_is_lkdc.3 +krb5/man/man3/krb5_sname_to_principal.3 +krb5/man/man3/krb5_unparse_name.3 +krb5/man/man3/krb5_unparse_name_fixed.3 +krb5/man/man3/krb5_unparse_name_fixed_flags.3 +krb5/man/man3/krb5_unparse_name_fixed_short.3 +krb5/man/man3/krb5_unparse_name_flags.3 +krb5/man/man3/krb5_unparse_name_short.3 +krb5/man/man3/krb5_ccache.3 krb5/man/man3/krb5_cc_cache_end_seq_get.3 krb5/man/man3/krb5_cc_cache_get_first.3 krb5/man/man3/krb5_cc_cache_match.3 @@ -64,52 +159,22 @@ krb5/man/man3/krb5_cc_store_cred.3 krb5/man/man3/krb5_cc_support_switch.3 krb5/man/man3/krb5_cc_switch.3 -krb5/man/man3/krb5_ccache.3 -krb5/man/man3/krb5_ccache_intro.3 krb5/man/man3/krb5_cccol_cursor_free.3 krb5/man/man3/krb5_cccol_cursor_new.3 krb5/man/man3/krb5_cccol_cursor_next.3 krb5/man/man3/krb5_cccol_last_change_time.3 -krb5/man/man3/krb5_change_password.3 +krb5/man/man3/krb5_get_validated_creds.3 +krb5/man/man3/krb5_is_config_principal.3 +krb5/man/man3/krb5_acc_ops.3 +krb5/man/man3/krb5_dcc_ops.3 +krb5/man/man3/krb5_fcc_ops.3 +krb5/man/man3/krb5_mcc_ops.3 +krb5/man/man3/krb5_crypto.3 +krb5/man/man3/krb5_allow_weak_crypto.3 krb5/man/man3/krb5_cksumtype_to_enctype.3 -krb5/man/man3/krb5_clear_error_message.3 -krb5/man/man3/krb5_clear_error_string.3 -krb5/man/man3/krb5_compare_creds.3 -krb5/man/man3/krb5_config_file_free.3 -krb5/man/man3/krb5_config_free_strings.3 -krb5/man/man3/krb5_config_get_bool.3 -krb5/man/man3/krb5_config_get_bool_default.3 -krb5/man/man3/krb5_config_get_list.3 -krb5/man/man3/krb5_config_get_string.3 -krb5/man/man3/krb5_config_get_string_default.3 -krb5/man/man3/krb5_config_get_strings.3 -krb5/man/man3/krb5_config_get_time.3 -krb5/man/man3/krb5_config_get_time_default.3 -krb5/man/man3/krb5_config_parse_file_multi.3 -krb5/man/man3/krb5_config_parse_string_multi.3 -krb5/man/man3/krb5_config_vget_bool.3 -krb5/man/man3/krb5_config_vget_bool_default.3 -krb5/man/man3/krb5_config_vget_list.3 -krb5/man/man3/krb5_config_vget_string.3 -krb5/man/man3/krb5_config_vget_string_default.3 -krb5/man/man3/krb5_config_vget_strings.3 -krb5/man/man3/krb5_config_vget_time.3 -krb5/man/man3/krb5_config_vget_time_default.3 -krb5/man/man3/krb5_copy_address.3 -krb5/man/man3/krb5_copy_addresses.3 -krb5/man/man3/krb5_copy_context.3 -krb5/man/man3/krb5_copy_creds.3 -krb5/man/man3/krb5_copy_creds_contents.3 -krb5/man/man3/krb5_copy_data.3 -krb5/man/man3/krb5_copy_host_realm.3 krb5/man/man3/krb5_copy_keyblock.3 krb5/man/man3/krb5_copy_keyblock_contents.3 -krb5/man/man3/krb5_copy_principal.3 -krb5/man/man3/krb5_copy_ticket.3 krb5/man/man3/krb5_create_checksum_iov.3 -krb5/man/man3/krb5_credential.3 -krb5/man/man3/krb5_creds_get_ticket_flags.3 -krb5/man/man3/krb5_crypto.3 krb5/man/man3/krb5_crypto_destroy.3 krb5/man/man3/krb5_crypto_fx_cf2.3 krb5/man/man3/krb5_crypto_getblocksize.3 @@ -117,99 +182,94 @@ krb5/man/man3/krb5_crypto_getenctype.3 krb5/man/man3/krb5_crypto_getpadsize.3 krb5/man/man3/krb5_crypto_init.3 -krb5/man/man3/krb5_crypto_iov.3 -krb5/man/man3/krb5_data_alloc.3 -krb5/man/man3/krb5_data_cmp.3 -krb5/man/man3/krb5_data_copy.3 -krb5/man/man3/krb5_data_ct_cmp.3 -krb5/man/man3/krb5_data_free.3 -krb5/man/man3/krb5_data_realloc.3 -krb5/man/man3/krb5_data_zero.3 krb5/man/man3/krb5_decrypt_iov_ivec.3 -krb5/man/man3/krb5_deprecated.3 -krb5/man/man3/krb5_digest.3 -krb5/man/man3/krb5_digest_probe.3 -krb5/man/man3/krb5_eai_to_heim_errno.3 krb5/man/man3/krb5_encrypt_iov_ivec.3 krb5/man/man3/krb5_enctype_disable.3 krb5/man/man3/krb5_enctype_enable.3 krb5/man/man3/krb5_enctype_valid.3 -krb5/man/man3/krb5_enctypes_compatible_keys.3 -krb5/man/man3/krb5_error.3 -krb5/man/man3/krb5_expand_hostname.3 -krb5/man/man3/krb5_expand_hostname_realms.3 -krb5/man/man3/krb5_fcc_ops.3 -krb5/man/man3/krb5_fileformats.3 -krb5/man/man3/krb5_free_address.3 -krb5/man/man3/krb5_free_addresses.3 -krb5/man/man3/krb5_free_config_files.3 -krb5/man/man3/krb5_free_context.3 -krb5/man/man3/krb5_free_cred_contents.3 -krb5/man/man3/krb5_free_creds.3 -krb5/man/man3/krb5_free_creds_contents.3 -krb5/man/man3/krb5_free_data.3 -krb5/man/man3/krb5_free_data_contents.3 -krb5/man/man3/krb5_free_error_string.3 -krb5/man/man3/krb5_free_host_realm.3 krb5/man/man3/krb5_free_keyblock.3 krb5/man/man3/krb5_free_keyblock_contents.3 -krb5/man/man3/krb5_free_principal.3 -krb5/man/man3/krb5_free_ticket.3 -krb5/man/man3/krb5_free_unparsed_name.3 -krb5/man/man3/krb5_fwd_tgt_creds.3 -krb5/man/man3/krb5_generate_subkey.3 +krb5/man/man3/krb5_generate_random.3 +krb5/man/man3/krb5_generate_random_block.3 krb5/man/man3/krb5_generate_subkey_extended.3 -krb5/man/man3/krb5_get_cred_from_kdc.3 -krb5/man/man3/krb5_get_cred_from_kdc_opt.3 -krb5/man/man3/krb5_get_default_config_files.3 -krb5/man/man3/krb5_get_default_in_tkt_etypes.3 -krb5/man/man3/krb5_get_dns_canonicalize_hostname.3 -krb5/man/man3/krb5_get_extra_addresses.3 -krb5/man/man3/krb5_get_fcache_version.3 +krb5/man/man3/krb5_is_enctype_weak.3 +krb5/man/man3/krb5_keyblock_get_enctype.3 +krb5/man/man3/krb5_keyblock_init.3 +krb5/man/man3/krb5_keyblock_zero.3 +krb5/man/man3/krb5_random_to_key.3 +krb5/man/man3/krb5_verify_checksum_iov.3 +krb5/man/man3/krb5_credential.3 +krb5/man/man3/krb5_fwd_tgt_creds.3 krb5/man/man3/krb5_get_forwarded_creds.3 -krb5/man/man3/krb5_get_ignore_addresses.3 -krb5/man/man3/krb5_get_in_tkt_with_keytab.3 -krb5/man/man3/krb5_get_in_tkt_with_password.3 -krb5/man/man3/krb5_get_in_tkt_with_skey.3 krb5/man/man3/krb5_get_init_creds_keyblock.3 krb5/man/man3/krb5_get_init_creds_keytab.3 krb5/man/man3/krb5_get_init_creds_opt_alloc.3 krb5/man/man3/krb5_get_init_creds_opt_free.3 -krb5/man/man3/krb5_get_init_creds_opt_get_error.3 -krb5/man/man3/krb5_get_init_creds_opt_init.3 krb5/man/man3/krb5_get_init_creds_password.3 -krb5/man/man3/krb5_get_kdc_sec_offset.3 -krb5/man/man3/krb5_get_max_time_skew.3 -krb5/man/man3/krb5_get_use_admin_kdc.3 -krb5/man/man3/krb5_get_validated_creds.3 -krb5/man/man3/krb5_h_addr2addr.3 -krb5/man/man3/krb5_h_addr2sockaddr.3 -krb5/man/man3/krb5_h_errno_to_heim_errno.3 -krb5/man/man3/krb5_init_context.3 krb5/man/man3/krb5_init_creds_free.3 krb5/man/man3/krb5_init_creds_get.3 krb5/man/man3/krb5_init_creds_get_error.3 krb5/man/man3/krb5_init_creds_init.3 -krb5/man/man3/krb5_init_creds_intro.3 krb5/man/man3/krb5_init_creds_set_keytab.3 krb5/man/man3/krb5_init_creds_set_password.3 krb5/man/man3/krb5_init_creds_set_service.3 krb5/man/man3/krb5_init_creds_step.3 -krb5/man/man3/krb5_init_ets.3 -krb5/man/man3/krb5_introduction.3 -krb5/man/man3/krb5_is_config_principal.3 -krb5/man/man3/krb5_is_thread_safe.3 -krb5/man/man3/krb5_kerberos_enctypes.3 -krb5/man/man3/krb5_keyblock_get_enctype.3 -krb5/man/man3/krb5_keyblock_init.3 -krb5/man/man3/krb5_keyblock_zero.3 -krb5/man/man3/krb5_keytab.3 -krb5/man/man3/krb5_keytab_intro.3 +krb5/man/man3/krb5_deprecated.3 +krb5/man/man3/krb5_auth_getremoteseqnumber.3 +krb5/man/man3/krb5_c_enctype_compare.3 +krb5/man/man3/krb5_change_password.3 +krb5/man/man3/krb5_clear_error_string.3 +krb5/man/man3/krb5_config_parse_string_multi.3 +krb5/man/man3/krb5_enctypes_compatible_keys.3 +krb5/man/man3/krb5_free_creds_contents.3 +krb5/man/man3/krb5_free_data_contents.3 +krb5/man/man3/krb5_free_error_string.3 +krb5/man/man3/krb5_free_unparsed_name.3 +krb5/man/man3/krb5_generate_subkey.3 +krb5/man/man3/krb5_get_cred_from_kdc.3 +krb5/man/man3/krb5_get_cred_from_kdc_opt.3 +krb5/man/man3/krb5_get_in_tkt_with_keytab.3 +krb5/man/man3/krb5_get_in_tkt_with_password.3 +krb5/man/man3/krb5_get_in_tkt_with_skey.3 +krb5/man/man3/krb5_get_init_creds_opt_get_error.3 +krb5/man/man3/krb5_get_init_creds_opt_init.3 krb5/man/man3/krb5_keytab_key_proc.3 krb5/man/man3/krb5_keytype_to_enctypes.3 krb5/man/man3/krb5_keytype_to_enctypes_default.3 krb5/man/man3/krb5_keytype_to_string.3 -krb5/man/man3/krb5_krbhst_get_addrinfo.3 +krb5/man/man3/krb5_password_key_proc.3 +krb5/man/man3/krb5_princ_realm.3 +krb5/man/man3/krb5_princ_set_realm.3 +krb5/man/man3/krb5_set_error_string.3 +krb5/man/man3/krb5_string_to_keytype.3 +krb5/man/man3/krb5_vset_error_string.3 +krb5/man/man3/krb5_digest.3 +krb5/man/man3/krb5_digest_probe.3 +krb5/man/man3/krb5_error.3 +krb5/man/man3/krb5_abort.3 +krb5/man/man3/krb5_abortx.3 +krb5/man/man3/krb5_clear_error_message.3 +krb5/man/man3/krb5_eai_to_heim_errno.3 +krb5/man/man3/krb5_err.3 +krb5/man/man3/krb5_errx.3 +krb5/man/man3/krb5_free_error_message.3 +krb5/man/man3/krb5_get_error_message.3 +krb5/man/man3/krb5_get_error_string.3 +krb5/man/man3/krb5_get_warn_dest.3 +krb5/man/man3/krb5_h_errno_to_heim_errno.3 +krb5/man/man3/krb5_prepend_error_message.3 +krb5/man/man3/krb5_set_error_message.3 +krb5/man/man3/krb5_set_warn_dest.3 +krb5/man/man3/krb5_vabort.3 +krb5/man/man3/krb5_verr.3 +krb5/man/man3/krb5_verrx.3 +krb5/man/man3/krb5_vprepend_error_message.3 +krb5/man/man3/krb5_vset_error_message.3 +krb5/man/man3/krb5_vwarn.3 +krb5/man/man3/krb5_vwarnx.3 +krb5/man/man3/krb5_warn.3 +krb5/man/man3/krb5_warnx.3 +krb5/man/man3/krb5_keytab.3 krb5/man/man3/krb5_kt_add_entry.3 krb5/man/man3/krb5_kt_close.3 krb5/man/man3/krb5_kt_compare.3 @@ -231,43 +291,15 @@ krb5/man/man3/krb5_kt_remove_entry.3 krb5/man/man3/krb5_kt_resolve.3 krb5/man/man3/krb5_kt_start_seq_get.3 -krb5/man/man3/krb5_kuserok.3 -krb5/man/man3/krb5_make_addrport.3 -krb5/man/man3/krb5_make_principal.3 -krb5/man/man3/krb5_max_sockaddr_size.3 -krb5/man/man3/krb5_mcc_ops.3 +krb5/man/man3/krb5_ticket.3 +krb5/man/man3/krb5_ticket_get_flags.3 krb5/man/man3/krb5_pac.3 krb5/man/man3/krb5_pac_get_buffer.3 krb5/man/man3/krb5_pac_verify.3 -krb5/man/man3/krb5_parse_address.3 -krb5/man/man3/krb5_parse_name.3 -krb5/man/man3/krb5_parse_name_flags.3 -krb5/man/man3/krb5_parse_nametype.3 -krb5/man/man3/krb5_password_key_proc.3 -krb5/man/man3/krb5_plugin_register.3 -krb5/man/man3/krb5_prepend_config_files_default.3 -krb5/man/man3/krb5_princ_realm.3 -krb5/man/man3/krb5_princ_set_realm.3 -krb5/man/man3/krb5_principal.3 -krb5/man/man3/krb5_principal_compare.3 -krb5/man/man3/krb5_principal_compare_any_realm.3 -krb5/man/man3/krb5_principal_get_num_comp.3 -krb5/man/man3/krb5_principal_get_realm.3 -krb5/man/man3/krb5_principal_get_type.3 -krb5/man/man3/krb5_principal_intro.3 -krb5/man/man3/krb5_principal_is_krbtgt.3 -krb5/man/man3/krb5_principal_match.3 -krb5/man/man3/krb5_principal_set_realm.3 -krb5/man/man3/krb5_principal_set_type.3 -krb5/man/man3/krb5_print_address.3 -krb5/man/man3/krb5_random_to_key.3 -krb5/man/man3/krb5_rd_req_ctx.3 -krb5/man/man3/krb5_rd_req_in_ctx_alloc.3 -krb5/man/man3/krb5_rd_req_in_set_keytab.3 -krb5/man/man3/krb5_rd_req_in_set_pac_check.3 -krb5/man/man3/krb5_rd_req_out_ctx_free.3 -krb5/man/man3/krb5_rd_req_out_get_server.3 -krb5/man/man3/krb5_realm_compare.3 +krb5/man/man3/krb5_v4compat.3 +krb5/man/man3/krb524_convert_creds_kdc.3 +krb5/man/man3/krb524_convert_creds_kdc_ccache.3 +krb5/man/man3/krb5_storage.3 krb5/man/man3/krb5_ret_address.3 krb5/man/man3/krb5_ret_addrs.3 krb5/man/man3/krb5_ret_authdata.3 @@ -276,6 +308,7 @@ krb5/man/man3/krb5_ret_data.3 krb5/man/man3/krb5_ret_int16.3 krb5/man/man3/krb5_ret_int32.3 +krb5/man/man3/krb5_ret_int64.3 krb5/man/man3/krb5_ret_int8.3 krb5/man/man3/krb5_ret_keyblock.3 krb5/man/man3/krb5_ret_principal.3 @@ -284,26 +317,8 @@ krb5/man/man3/krb5_ret_times.3 krb5/man/man3/krb5_ret_uint16.3 krb5/man/man3/krb5_ret_uint32.3 +krb5/man/man3/krb5_ret_uint64.3 krb5/man/man3/krb5_ret_uint8.3 -krb5/man/man3/krb5_set_config_files.3 -krb5/man/man3/krb5_set_default_in_tkt_etypes.3 -krb5/man/man3/krb5_set_dns_canonicalize_hostname.3 -krb5/man/man3/krb5_set_error_message.3 -krb5/man/man3/krb5_set_error_string.3 -krb5/man/man3/krb5_set_extra_addresses.3 -krb5/man/man3/krb5_set_fcache_version.3 -krb5/man/man3/krb5_set_home_dir_access.3 -krb5/man/man3/krb5_set_ignore_addresses.3 -krb5/man/man3/krb5_set_kdc_sec_offset.3 -krb5/man/man3/krb5_set_max_time_skew.3 -krb5/man/man3/krb5_set_password.3 -krb5/man/man3/krb5_set_real_time.3 -krb5/man/man3/krb5_set_use_admin_kdc.3 -krb5/man/man3/krb5_sname_to_principal.3 -krb5/man/man3/krb5_sockaddr2address.3 -krb5/man/man3/krb5_sockaddr2port.3 -krb5/man/man3/krb5_sockaddr_uninteresting.3 -krb5/man/man3/krb5_storage.3 krb5/man/man3/krb5_storage_clear_flags.3 krb5/man/man3/krb5_storage_emem.3 krb5/man/man3/krb5_storage_free.3 @@ -311,6 +326,8 @@ krb5/man/man3/krb5_storage_from_fd.3 krb5/man/man3/krb5_storage_from_mem.3 krb5/man/man3/krb5_storage_from_readonly_mem.3 +krb5/man/man3/krb5_storage_from_socket.3 +krb5/man/man3/krb5_storage_fsync.3 krb5/man/man3/krb5_storage_get_byteorder.3 krb5/man/man3/krb5_storage_get_eof_code.3 krb5/man/man3/krb5_storage_is_flags.3 @@ -331,6 +348,7 @@ krb5/man/man3/krb5_store_data.3 krb5/man/man3/krb5_store_int16.3 krb5/man/man3/krb5_store_int32.3 +krb5/man/man3/krb5_store_int64.3 krb5/man/man3/krb5_store_int8.3 krb5/man/man3/krb5_store_keyblock.3 krb5/man/man3/krb5_store_principal.3 @@ -339,22 +357,44 @@ krb5/man/man3/krb5_store_times.3 krb5/man/man3/krb5_store_uint16.3 krb5/man/man3/krb5_store_uint32.3 +krb5/man/man3/krb5_store_uint64.3 krb5/man/man3/krb5_store_uint8.3 -krb5/man/man3/krb5_string_to_keytype.3 krb5/man/man3/krb5_support.3 -krb5/man/man3/krb5_ticket.3 -krb5/man/man3/krb5_ticket_get_authorization_data_type.3 -krb5/man/man3/krb5_ticket_get_client.3 -krb5/man/man3/krb5_ticket_get_endtime.3 -krb5/man/man3/krb5_ticket_get_flags.3 -krb5/man/man3/krb5_ticket_get_server.3 -krb5/man/man3/krb5_unparse_name.3 -krb5/man/man3/krb5_unparse_name_fixed.3 -krb5/man/man3/krb5_unparse_name_fixed_flags.3 -krb5/man/man3/krb5_unparse_name_fixed_short.3 -krb5/man/man3/krb5_unparse_name_flags.3 -krb5/man/man3/krb5_unparse_name_short.3 -krb5/man/man3/krb5_v4compat.3 -krb5/man/man3/krb5_verify_checksum_iov.3 -krb5/man/man3/krb5_vset_error_string.3 -krb5/man/man3/krb5_vwarn.3 +krb5/man/man3/krb5_acl_match_file.3 +krb5/man/man3/krb5_acl_match_string.3 +krb5/man/man3/krb5_aname_to_localname.3 +krb5/man/man3/krb5_config_file_free.3 +krb5/man/man3/krb5_config_free_strings.3 +krb5/man/man3/krb5_config_get_bool.3 +krb5/man/man3/krb5_config_get_bool_default.3 +krb5/man/man3/krb5_config_get_list.3 +krb5/man/man3/krb5_config_get_string.3 +krb5/man/man3/krb5_config_get_string_default.3 +krb5/man/man3/krb5_config_get_strings.3 +krb5/man/man3/krb5_config_get_time.3 +krb5/man/man3/krb5_config_get_time_default.3 +krb5/man/man3/krb5_config_parse_file_multi.3 +krb5/man/man3/krb5_config_vget_bool.3 +krb5/man/man3/krb5_config_vget_bool_default.3 +krb5/man/man3/krb5_config_vget_list.3 +krb5/man/man3/krb5_config_vget_string.3 +krb5/man/man3/krb5_config_vget_string_default.3 +krb5/man/man3/krb5_config_vget_strings.3 +krb5/man/man3/krb5_config_vget_time.3 +krb5/man/man3/krb5_config_vget_time_default.3 +krb5/man/man3/krb5_expand_hostname.3 +krb5/man/man3/krb5_expand_hostname_realms.3 +krb5/man/man3/krb5_free_host_realm.3 +krb5/man/man3/krb5_kuserok.3 +krb5/man/man3/krb5_plugin_register.3 +krb5/man/man3/krb5_auth.3 +krb5/man/man3/krb5_rd_req_ctx.3 +krb5/man/man3/krb5_rd_req_in_ctx_alloc.3 +krb5/man/man3/krb5_rd_req_in_set_keytab.3 +krb5/man/man3/krb5_rd_req_in_set_pac_check.3 +krb5/man/man3/krb5_rd_req_out_ctx_free.3 +krb5/man/man3/krb5_rd_req_out_get_server.3 +krb5/man/man3/krb5_crypto_iov.3 +krb5/man/man3/krb5plugin_an2ln_ftable_desc.3 +krb5/man/man3/krb5plugin_db_ftable_desc.3 +krb5/man/man3/krb5plugin_kuserok_ftable_desc.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/annotated.html b/crypto/heimdal/doc/doxyout/ntlm/html/annotated.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/annotated.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/annotated.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: Data Structures +Data Structures @@ -8,32 +8,32 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Data Structures
    +
    -

    Data Structures

    Here are the data structures with brief descriptions: - - - - +
    Here are the data structures with brief descriptions:
    +
    ntlm_buf
    ntlm_type1
    ntlm_type2
    ntlm_type3
    + + + +
     Cntlm_buf
     Cntlm_type1
     Cntlm_type2
     Cntlm_type3
    -
    + +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/bc_s.png b/crypto/heimdal/doc/doxyout/ntlm/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + +Data Structure Index + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    Data Structure Index
    +
    + +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/closed.png b/crypto/heimdal/doc/doxyout/ntlm/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zc%17D@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ h3 { - margin-top: 0; +form.search { + margin-bottom: 0px; + margin-top: 0px; } -.directory p { - margin: 0px; - white-space: nowrap; + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.directory div { - display: none; - margin: 0px; +*/ + +td.tiny { + font-size: 75%; } -.directory img { - vertical-align: -30%; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; } -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; + +th.dirtab { + background: #EBEFF6; + font-weight: bold; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; } -.directory-alt > h3 { - margin-top: 0; + +hr.footer { + height: 1px; } -.directory-alt p { - margin: 0px; - white-space: nowrap; + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; } -.directory-alt div { - display: none; - margin: 0px; + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -.directory-alt img { - vertical-align: -30%; + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; } diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/doxygen.png b/crypto/heimdal/doc/doxyout/ntlm/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tWI!7t@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`JY+|Kdr`d2-(ONuKA& z`@F5@iWMozvyuS-DJG-A!lRSFxj4eVTQ(O*ctC5l23a*NCT zUiG#bpmlC>)R3lz>e?DhO|`RWYpkY-Cv7yZvX=1p<>y~3vO1$fzhC-nV)3CLCmz1P@7CUvliZQpfu5;zp}ugqdu(jz*|T4tKK*%e@vB3o8?nX)G7YEO} zIVfR(?xMlF^f}`rl|s?m#rLFbqVx`xSj&_q(VMc@fTHZh}z-v68l% zry~x%T5iHj^14oBx^J>s?RnyD8<0POU=9lDQOGMB@Qv5Y7jCfG%j{AmV#TMGW1QMw zT#YF!z0x)@dY88&9zIW5@|0`{T~(%oEz)4CmbgKz&?JXM8PbTlGzy_abLK5`U0uI5 zjHCu-UX^?f&14ZFEI#m4m6HGb+pWe9G)EL9oc;V4^!AHAWY)_-0Wh%dA!_pW~AM2 zHZ{sky{TsvhxSG}|Kjt>YpOaDZqKGo-`}a-o=bjEydHSUR%_RxG>Ry*<{c88MP&ug zrltyHjJ>p!JX%>=hAAW0nBi-?hEq>Uc@@s%X-yA@MfsACeNgoN1A!3a_MdBcK263R zpQruAi4!wj!sVHNOf2y}FSc#gM1Zq3XU`YH3(W_aJO(H}DNQ%LguU8tiV}RK z`!2|z88ZfI8$CN%7oV-phP3SL?84r>l*~_CMZ$)pGy< diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/doxygen.svg b/crypto/heimdal/doc/doxyout/ntlm/html/doxygen.svg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/ntlm/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/dynsections.js b/crypto/heimdal/doc/doxyout/ntlm/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/ntlm/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l -Heimdalntlmlibrary: Examples +Examples @@ -8,23 +8,28 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Examples
    +
    -

    Examples

    Here is a list of all examples:
    +
    -Generated on Wed Jan 11 14:07:51 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/folderclosed.png b/crypto/heimdal/doc/doxyout/ntlm/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zc$@)f0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ -Heimdalntlmlibrary: Data Fields +Data Fields @@ -8,71 +8,28 @@ keyhole logo

    - - + + + + + +
    -Here is a list of all documented struct and union fields with links to the struct/union documentation for each field: -

    -

    +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/functions_vars.html b/crypto/heimdal/doc/doxyout/ntlm/html/functions_vars.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/functions_vars.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/functions_vars.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: Data Fields - Variables +Data Fields - Variables @@ -8,71 +8,28 @@ keyhole logo

    - - + + + + + +
    -  -

    -

    +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.html b/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: Graph Legend +Graph Legend @@ -8,69 +8,71 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Graph Legend
    +
    -

    Graph Legend

    This page explains how to interpret the graphs that are generated by doxygen.

    -Consider the following example:

    /*! Invisible class because of truncation */
    -class Invisible { };
    -
    -/*! Truncated class, inheritance relation is hidden */
    -class Truncated : public Invisible { };
    -
    -/* Class not documented with doxygen comments */
    -class Undocumented { };
    -
    -/*! Class that is inherited using public inheritance */
    -class PublicBase : public Truncated { };
    -
    -/*! A template class */
    -template<class T> class Templ { };
    -
    -/*! Class that is inherited using protected inheritance */
    -class ProtectedBase { };
    -
    -/*! Class that is inherited using private inheritance */
    -class PrivateBase { };
    -
    -/*! Class that is used by the Inherited class */
    -class Used { };
    -
    -/*! Super class that inherits a number of other classes */
    -class Inherited : public PublicBase,
    -                  protected ProtectedBase,
    -                  private PrivateBase,
    -                  public Undocumented,
    -                  public Templ<int>
    -{
    -  private:
    -    Used *m_usedClass;
    -};
    -
    If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

    -

    -graph_legend.png -
    -

    -The boxes in the above graph have the following meaning:

      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      +
      class Invisible { };
      +
      +
      /*! Truncated class, inheritance relation is hidden */
      +
      class Truncated : public Invisible { };
      +
      +
      /* Class not documented with doxygen comments */
      +
      class Undocumented { };
      +
      +
      /*! Class that is inherited using public inheritance */
      +
      class PublicBase : public Truncated { };
      +
      +
      /*! A template class */
      +
      template<class T> class Templ { };
      +
      +
      /*! Class that is inherited using protected inheritance */
      +
      class ProtectedBase { };
      +
      +
      /*! Class that is inherited using private inheritance */
      +
      class PrivateBase { };
      +
      +
      /*! Class that is used by the Inherited class */
      +
      class Used { };
      +
      +
      /*! Super class that inherits a number of other classes */
      +
      class Inherited : public PublicBase,
      +
      protected ProtectedBase,
      +
      private PrivateBase,
      +
      public Undocumented,
      +
      public Templ<int>
      +
      {
      +
      private:
      +
      Used *m_usedClass;
      +
      };
      +

      This will result in the following graph:

      +

      The boxes in the above graph have the following meaning:

      +
      • A filled gray box represents the struct or class for which the graph is generated.
      • A box with a black border denotes a documented struct or class.
      • -A box with a grey border denotes an undocumented struct or class.
      • +A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -The arrows have the following meaning:
        +

        The arrows have the following meaning:

        +
        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • @@ -78,12 +80,12 @@
        • A dark red arrow is used for private inheritance.
        • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
        • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
        -
    +
    -Generated on Wed Jan 11 14:07:51 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.dot b/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.dot deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G -{ - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.png b/crypto/heimdal/doc/doxyout/ntlm/html/graph_legend.png index 9b96937bfd5f7a36ea8dbf2d64ed1bc0768f074d..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 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 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/group__ntlm__core.html b/crypto/heimdal/doc/doxyout/ntlm/html/group__ntlm__core.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/group__ntlm__core.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/group__ntlm__core.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: Heimdal NTLM library +Heimdal NTLM library @@ -8,929 +8,976 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal NTLM library
    +
    -

    Heimdal NTLM library

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    void heim_ntlm_free_buf (struct ntlm_buf *p)
    void heim_ntlm_free_targetinfo (struct ntlm_targetinfo *ti)
    int heim_ntlm_encode_targetinfo (const struct ntlm_targetinfo *ti, int ucs2, struct ntlm_buf *data)
    int heim_ntlm_decode_targetinfo (const struct ntlm_buf *data, int ucs2, struct ntlm_targetinfo *ti)
    void heim_ntlm_free_type1 (struct ntlm_type1 *data)
    int heim_ntlm_encode_type1 (const struct ntlm_type1 *type1, struct ntlm_buf *data)
    void heim_ntlm_free_type2 (struct ntlm_type2 *data)
    int heim_ntlm_encode_type2 (const struct ntlm_type2 *type2, struct ntlm_buf *data)
    void heim_ntlm_free_type3 (struct ntlm_type3 *data)
    int heim_ntlm_encode_type3 (const struct ntlm_type3 *type3, struct ntlm_buf *data)
    int heim_ntlm_nt_key (const char *password, struct ntlm_buf *key)
    int heim_ntlm_calculate_ntlm1 (void *key, size_t len, unsigned char challenge[8], struct ntlm_buf *answer)
    int heim_ntlm_build_ntlm1_master (void *key, size_t len, struct ntlm_buf *session, struct ntlm_buf *master)
    int heim_ntlm_build_ntlm2_master (void *key, size_t len, struct ntlm_buf *blob, struct ntlm_buf *session, struct ntlm_buf *master)
    int heim_ntlm_keyex_unwrap (struct ntlm_buf *baseKey, struct ntlm_buf *encryptedSession, struct ntlm_buf *session)
    int heim_ntlm_ntlmv2_key (const void *key, size_t len, const char *username, const char *target, unsigned char ntlmv2[16])
    int heim_ntlm_calculate_lm2 (const void *key, size_t len, const char *username, const char *target, const unsigned char serverchallenge[8], unsigned char ntlmv2[16], struct ntlm_buf *answer)
    int heim_ntlm_calculate_ntlm2 (const void *key, size_t len, const char *username, const char *target, const unsigned char serverchallenge[8], const struct ntlm_buf *infotarget, unsigned char ntlmv2[16], struct ntlm_buf *answer)
    int heim_ntlm_verify_ntlm2 (const void *key, size_t len, const char *username, const char *target, time_t now, const unsigned char serverchallenge[8], const struct ntlm_buf *answer, struct ntlm_buf *infotarget, unsigned char ntlmv2[16])
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void heim_ntlm_free_buf (struct ntlm_buf *p)
     
    void heim_ntlm_free_targetinfo (struct ntlm_targetinfo *ti)
     
    int heim_ntlm_encode_targetinfo (const struct ntlm_targetinfo *ti, int ucs2, struct ntlm_buf *data)
     
    int heim_ntlm_decode_targetinfo (const struct ntlm_buf *data, int ucs2, struct ntlm_targetinfo *ti)
     
    void heim_ntlm_free_type1 (struct ntlm_type1 *data)
     
    int heim_ntlm_encode_type1 (const struct ntlm_type1 *type1, struct ntlm_buf *data)
     
    void heim_ntlm_free_type2 (struct ntlm_type2 *data)
     
    int heim_ntlm_encode_type2 (const struct ntlm_type2 *type2, struct ntlm_buf *data)
     
    void heim_ntlm_free_type3 (struct ntlm_type3 *data)
     
    int heim_ntlm_encode_type3 (const struct ntlm_type3 *type3, struct ntlm_buf *data, size_t *mic_offset)
     
    int heim_ntlm_nt_key (const char *password, struct ntlm_buf *key)
     
    int heim_ntlm_calculate_ntlm1 (void *key, size_t len, unsigned char challenge[8], struct ntlm_buf *answer)
     
    int heim_ntlm_build_ntlm1_master (void *key, size_t len, struct ntlm_buf *session, struct ntlm_buf *master)
     
    int heim_ntlm_build_ntlm2_master (void *key, size_t len, struct ntlm_buf *blob, struct ntlm_buf *session, struct ntlm_buf *master)
     
    int heim_ntlm_keyex_unwrap (struct ntlm_buf *baseKey, struct ntlm_buf *encryptedSession, struct ntlm_buf *session)
     
    int heim_ntlm_ntlmv2_key (const void *key, size_t len, const char *username, const char *target, int upper_case_target, unsigned char ntlmv2[16])
     
    int heim_ntlm_calculate_lm2 (const void *key, size_t len, const char *username, const char *target, const unsigned char serverchallenge[8], unsigned char ntlmv2[16], struct ntlm_buf *answer)
     
    int heim_ntlm_calculate_ntlm2 (const void *key, size_t len, const char *username, const char *target, const unsigned char serverchallenge[8], const struct ntlm_buf *infotarget, unsigned char ntlmv2[16], struct ntlm_buf *answer)
     
    int heim_ntlm_verify_ntlm2 (const void *key, size_t len, const char *username, const char *target, time_t now, const unsigned char serverchallenge[8], const struct ntlm_buf *answer, struct ntlm_buf *infotarget, unsigned char ntlmv2[16])
     
    -

    Detailed Description

    -The NTLM core functions implement the string2key generation function, message encode and decode function, and the hash function functions.

    Function Documentation

    - +

    Detailed Description

    +

    The NTLM core functions implement the string2key generation function, message encode and decode function, and the hash function functions.

    +

    Function Documentation

    + +

    ◆ heim_ntlm_build_ntlm1_master()

    +
    - + - - + + - - + + - - + + - - + + - +
    int heim_ntlm_build_ntlm1_master int heim_ntlm_build_ntlm1_master (void *  key, void * key,
    size_t  len, size_t len,
    struct ntlm_buf session, struct ntlm_bufsession,
    struct ntlm_buf master struct ntlm_bufmaster 
    )
    -
    -
    - -

    -Generates an NTLMv1 session random with assosited session master key.

    -

    Parameters:
    - - - - - +
    +

    Generates an NTLMv1 session random with assosited session master key.

    +
    Parameters
    +
    key the ntlm v1 key
    len length of key
    session generated session nonce, should be freed with heim_ntlm_free_buf().
    master calculated session master key, should be freed with heim_ntlm_free_buf().
    + + + +
    keythe ntlm v1 key
    lenlength of key
    sessiongenerated session nonce, should be freed with heim_ntlm_free_buf().
    mastercalculated session master key, should be freed with heim_ntlm_free_buf().
    +
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - +

    + +

    ◆ heim_ntlm_build_ntlm2_master()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    int heim_ntlm_build_ntlm2_master int heim_ntlm_build_ntlm2_master (void *  key, void * key,
    size_t  len, size_t len,
    struct ntlm_buf blob, struct ntlm_bufblob,
    struct ntlm_buf session, struct ntlm_bufsession,
    struct ntlm_buf master struct ntlm_bufmaster 
    )
    -
    -
    - -

    -Generates an NTLMv2 session random with associated session master key.

    -

    Parameters:
    - - - - - - +
    +

    Generates an NTLMv2 session random with associated session master key.

    +
    Parameters
    +
    key the NTLMv2 key
    len length of key
    blob the NTLMv2 "blob"
    session generated session nonce, should be freed with heim_ntlm_free_buf().
    master calculated session master key, should be freed with heim_ntlm_free_buf().
    + + + + +
    keythe NTLMv2 key
    lenlength of key
    blobthe NTLMv2 "blob"
    sessiongenerated session nonce, should be freed with heim_ntlm_free_buf().
    mastercalculated session master key, should be freed with heim_ntlm_free_buf().
    +
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_calculate_lm2()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int heim_ntlm_calculate_lm2 int heim_ntlm_calculate_lm2 (const void *  key, const void * key,
    size_t  len, size_t len,
    const char *  username, const char * username,
    const char *  target, const char * target,
    const unsigned char  serverchallenge[8], const unsigned char serverchallenge[8],
    unsigned char  ntlmv2[16], unsigned char ntlmv2[16],
    struct ntlm_buf answer struct ntlm_bufanswer 
    )
    -
    -
    - -

    -Calculate LMv2 response

    -

    Parameters:
    - - - - - - - - +
    +

    Calculate LMv2 response

    +
    Parameters
    +
    key the ntlm key
    len length of key
    username name of the user, as sent in the message, assumed to be in UTF8.
    target the name of the target, assumed to be in UTF8.
    serverchallenge challenge as sent by the server in the type2 message.
    ntlmv2 calculated session key
    answer ntlm response answer, should be freed with heim_ntlm_free_buf().
    + + + + + + +
    keythe ntlm key
    lenlength of key
    usernamename of the user, as sent in the message, assumed to be in UTF8.
    targetthe name of the target, assumed to be in UTF8.
    serverchallengechallenge as sent by the server in the type2 message.
    ntlmv2calculated session key
    answerntlm response answer, should be freed with heim_ntlm_free_buf().
    +
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_calculate_ntlm1()

    +
    - + - - + + - - + + - - + + - - + + - +
    int heim_ntlm_calculate_ntlm1 int heim_ntlm_calculate_ntlm1 (void *  key, void * key,
    size_t  len, size_t len,
    unsigned char  challenge[8], unsigned char challenge[8],
    struct ntlm_buf answer struct ntlm_bufanswer 
    )
    -
    -
    - -

    -Calculate NTLMv1 response hash

    -

    Parameters:
    - - - - - +
    +

    Calculate NTLMv1 response hash

    +
    Parameters
    +
    key the ntlm v1 key
    len length of key
    challenge sent by the server
    answer calculated answer, should be freed with heim_ntlm_free_buf().
    + + + +
    keythe ntlm v1 key
    lenlength of key
    challengesent by the server
    answercalculated answer, should be freed with heim_ntlm_free_buf().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_calculate_ntlm2()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int heim_ntlm_calculate_ntlm2 int heim_ntlm_calculate_ntlm2 (const void *  key, const void * key,
    size_t  len, size_t len,
    const char *  username, const char * username,
    const char *  target, const char * target,
    const unsigned char  serverchallenge[8], const unsigned char serverchallenge[8],
    const struct ntlm_buf infotarget, const struct ntlm_bufinfotarget,
    unsigned char  ntlmv2[16], unsigned char ntlmv2[16],
    struct ntlm_buf answer struct ntlm_bufanswer 
    )
    -
    -
    - -

    -Calculate NTLMv2 response

    -

    Parameters:
    - - - - - - - - - +
    +

    Calculate NTLMv2 response

    +
    Parameters
    +
    key the ntlm key
    len length of key
    username name of the user, as sent in the message, assumed to be in UTF8.
    target the name of the target, assumed to be in UTF8.
    serverchallenge challenge as sent by the server in the type2 message.
    infotarget infotarget as sent by the server in the type2 message.
    ntlmv2 calculated session key
    answer ntlm response answer, should be freed with heim_ntlm_free_buf().
    + + + + + + + +
    keythe ntlm key
    lenlength of key
    usernamename of the user, as sent in the message, assumed to be in UTF8.
    targetthe name of the target, assumed to be in UTF8.
    serverchallengechallenge as sent by the server in the type2 message.
    infotargetinfotarget as sent by the server in the type2 message.
    ntlmv2calculated session key
    answerntlm response answer, should be freed with heim_ntlm_free_buf().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_decode_targetinfo()

    +
    - + - - + + - - + + - - + + - +
    int heim_ntlm_decode_targetinfo int heim_ntlm_decode_targetinfo (const struct ntlm_buf data, const struct ntlm_bufdata,
    int  ucs2, int ucs2,
    struct ntlm_targetinfo *  ti struct ntlm_targetinfo * ti 
    )
    -
    -
    - -

    -Decodes an NTLM targetinfo message

    -

    Parameters:
    - - - - +
    +

    Decodes an NTLM targetinfo message

    +
    Parameters
    +
    data input data buffer with the encode NTLM targetinfo message
    ucs2 if the strings should be encoded with ucs2 (selected by flag in message).
    ti the decoded target info, should be freed with heim_ntlm_free_targetinfo().
    + + +
    datainput data buffer with the encode NTLM targetinfo message
    ucs2if the strings should be encoded with ucs2 (selected by flag in message).
    tithe decoded target info, should be freed with heim_ntlm_free_targetinfo().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_encode_targetinfo()

    +
    - + - - + + - - + + - - + + - +
    int heim_ntlm_encode_targetinfo int heim_ntlm_encode_targetinfo (const struct ntlm_targetinfo *  ti, const struct ntlm_targetinfo * ti,
    int  ucs2, int ucs2,
    struct ntlm_buf data struct ntlm_bufdata 
    )
    -
    -
    - -

    -Encodes a ntlm_targetinfo message.

    -

    Parameters:
    - - - - +
    +

    Encodes a ntlm_targetinfo message.

    +
    Parameters
    +
    ti the ntlm_targetinfo message to encode.
    ucs2 ignored
    data is the return buffer with the encoded message, should be freed with heim_ntlm_free_buf().
    + + +
    tithe ntlm_targetinfo message to encode.
    ucs2ignored
    datais the return buffer with the encoded message, should be freed with heim_ntlm_free_buf().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_encode_type1()

    +
    - + - - + + - - + + - +
    int heim_ntlm_encode_type1 int heim_ntlm_encode_type1 (const struct ntlm_type1 type1, const struct ntlm_type1type1,
    struct ntlm_buf data struct ntlm_bufdata 
    )
    -
    -
    - -

    -Encodes an ntlm_type1 message.

    -

    Parameters:
    - - - +
    +

    Encodes an ntlm_type1 message.

    +
    Parameters
    +
    type1 the ntlm_type1 message to encode.
    data is the return buffer with the encoded message, should be freed with heim_ntlm_free_buf().
    + +
    type1the ntlm_type1 message to encode.
    datais the return buffer with the encoded message, should be freed with heim_ntlm_free_buf().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_encode_type2()

    +
    - + - - + + - - + + - +
    int heim_ntlm_encode_type2 int heim_ntlm_encode_type2 (const struct ntlm_type2 type2, const struct ntlm_type2type2,
    struct ntlm_buf data struct ntlm_bufdata 
    )
    -
    -
    - -

    -Encodes an ntlm_type2 message.

    -

    Parameters:
    - - - +
    +

    Encodes an ntlm_type2 message.

    +
    Parameters
    +
    type2 the ntlm_type2 message to encode.
    data is the return buffer with the encoded message, should be freed with heim_ntlm_free_buf().
    + +
    type2the ntlm_type2 message to encode.
    datais the return buffer with the encoded message, should be freed with heim_ntlm_free_buf().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_encode_type3()

    +
    - + - - + + - - + + + + + + + + - +
    int heim_ntlm_encode_type3 int heim_ntlm_encode_type3 (const struct ntlm_type3 type3, const struct ntlm_type3type3,
    struct ntlm_buf data struct ntlm_bufdata,
    size_t * mic_offset 
    )
    -
    -
    - -

    -Encodes an ntlm_type3 message.

    -

    Parameters:
    - - - +
    +

    Encodes an ntlm_type3 message.

    +
    Parameters
    +
    type3 the ntlm_type3 message to encode.
    data is the return buffer with the encoded message, should be freed with heim_ntlm_free_buf().
    + + +
    type3the ntlm_type3 message to encode.
    datais the return buffer with the encoded message, should be
    [out]mic_offsetoffset of message integrity code freed with heim_ntlm_free_buf().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_free_buf()

    +
    - + - - - + +
    void heim_ntlm_free_buf void heim_ntlm_free_buf (struct ntlm_buf p  ) struct ntlm_bufp)
    -
    -
    - -

    -heim_ntlm_free_buf frees the ntlm buffer

    -

    Parameters:
    - - +
    +

    heim_ntlm_free_buf frees the ntlm buffer

    +
    Parameters
    +
    p buffer to be freed
    +
    pbuffer to be freed
    +
    +
    +
    Examples
    test_ntlm.c.
    -

    - + + +

    ◆ heim_ntlm_free_targetinfo()

    +
    - + - - - + +
    void heim_ntlm_free_targetinfo void heim_ntlm_free_targetinfo (struct ntlm_targetinfo *  ti  ) struct ntlm_targetinfo * ti)
    -
    -
    - -

    -Frees the ntlm_targetinfo message

    -

    Parameters:
    - - +
    +

    Frees the ntlm_targetinfo message

    +
    Parameters
    +
    ti targetinfo to be freed
    +
    titargetinfo to be freed
    +
    +
    +
    Examples
    test_ntlm.c.
    -

    - + + +

    ◆ heim_ntlm_free_type1()

    +
    - + - - - + +
    void heim_ntlm_free_type1 void heim_ntlm_free_type1 (struct ntlm_type1 data  ) struct ntlm_type1data)
    -
    -
    - -

    -Frees the ntlm_type1 message

    -

    Parameters:
    - - +
    +

    Frees the ntlm_type1 message

    +
    Parameters
    +
    data message to be freed
    +
    datamessage to be freed
    +
    +
    +
    Examples
    test_ntlm.c.
    -

    - + + +

    ◆ heim_ntlm_free_type2()

    +
    - + - - - + +
    void heim_ntlm_free_type2 void heim_ntlm_free_type2 (struct ntlm_type2 data  ) struct ntlm_type2data)
    -
    -
    - -

    -Frees the ntlm_type2 message

    -

    Parameters:
    - - +
    +

    Frees the ntlm_type2 message

    +
    Parameters
    +
    data message to be freed
    +
    datamessage to be freed
    +
    +
    +
    Examples
    test_ntlm.c.
    -

    - + + +

    ◆ heim_ntlm_free_type3()

    +
    - + - - - + +
    void heim_ntlm_free_type3 void heim_ntlm_free_type3 (struct ntlm_type3 data  ) struct ntlm_type3data)
    -
    -
    - -

    -Frees the ntlm_type3 message

    -

    Parameters:
    - - +
    +

    Frees the ntlm_type3 message

    +
    Parameters
    +
    data message to be freed
    +
    datamessage to be freed
    +
    +
    +
    Examples
    test_ntlm.c.
    -

    - + + +

    ◆ heim_ntlm_keyex_unwrap()

    +
    - + - - + + - - + + - - + + - +
    int heim_ntlm_keyex_unwrap int heim_ntlm_keyex_unwrap (struct ntlm_buf baseKey, struct ntlm_bufbaseKey,
    struct ntlm_buf encryptedSession, struct ntlm_bufencryptedSession,
    struct ntlm_buf session struct ntlm_bufsession 
    )
    -
    -
    - -

    -Given a key and encrypted session, unwrap the session key

    -

    Parameters:
    - - - - +
    +

    Given a key and encrypted session, unwrap the session key

    +
    Parameters
    +
    baseKey the sessionBaseKey
    encryptedSession encrypted session, type3.session field.
    session generated session nonce, should be freed with heim_ntlm_free_buf().
    + + +
    baseKeythe sessionBaseKey
    encryptedSessionencrypted session, type3.session field.
    sessiongenerated session nonce, should be freed with heim_ntlm_free_buf().
    +
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_nt_key()

    +
    - + - - + + - - + + - +
    int heim_ntlm_nt_key int heim_ntlm_nt_key (const char *  password, const char * password,
    struct ntlm_buf key struct ntlm_bufkey 
    )
    -
    -
    - -

    -Calculate the NTLM key, the password is assumed to be in UTF8.

    -

    Parameters:
    - - - +
    +

    Calculate the NTLM key, the password is assumed to be in UTF8.

    +
    Parameters
    +
    password password to calcute the key for.
    key calcuted key, should be freed with heim_ntlm_free_buf().
    + +
    passwordpassword to calcute the key for.
    keycalcuted key, should be freed with heim_ntlm_free_buf().
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    - + + +

    ◆ heim_ntlm_ntlmv2_key()

    +
    - + - - + + - - + + - - + + - - + + - - + + + + + + + + - +
    int heim_ntlm_ntlmv2_key int heim_ntlm_ntlmv2_key (const void *  key, const void * key,
    size_t  len, size_t len,
    const char *  username, const char * username,
    const char *  target, const char * target,
    unsigned char  ntlmv2[16] int upper_case_target,
    unsigned char ntlmv2[16] 
    )
    -
    -
    - -

    -Generates an NTLMv2 session key.

    -

    Parameters:
    - - - - - - +
    +

    Generates an NTLMv2 session key.

    +
    Parameters
    +
    key the ntlm key
    len length of key
    username name of the user, as sent in the message, assumed to be in UTF8.
    target the name of the target, assumed to be in UTF8.
    ntlmv2 the ntlmv2 session key
    + + + + + +
    keythe ntlm key
    lenlength of key
    usernamename of the user, as sent in the message, assumed to be in UTF8.
    targetthe name of the target, assumed to be in UTF8.
    upper_case_targetupper case the target, should not be used only for legacy systems
    ntlmv2the ntlmv2 session key
    +
    -
    Returns:
    0 on success, or an error code on failure.
    +
    Returns
    0 on success, or an error code on failure.
    -

    - + + +

    ◆ heim_ntlm_verify_ntlm2()

    +
    - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - +
    int heim_ntlm_verify_ntlm2 int heim_ntlm_verify_ntlm2 (const void *  key, const void * key,
    size_t  len, size_t len,
    const char *  username, const char * username,
    const char *  target, const char * target,
    time_t  now, time_t now,
    const unsigned char  serverchallenge[8], const unsigned char serverchallenge[8],
    const struct ntlm_buf answer, const struct ntlm_bufanswer,
    struct ntlm_buf infotarget, struct ntlm_bufinfotarget,
    unsigned char  ntlmv2[16] unsigned char ntlmv2[16] 
    )
    -
    -
    - -

    -Verify NTLMv2 response.

    -

    Parameters:
    - - - - - - - - - - +
    +

    Verify NTLMv2 response.

    +
    Parameters
    +
    key the ntlm key
    len length of key
    username name of the user, as sent in the message, assumed to be in UTF8.
    target the name of the target, assumed to be in UTF8.
    now the time now (0 if the library should pick it up itself)
    serverchallenge challenge as sent by the server in the type2 message.
    answer ntlm response answer, should be freed with heim_ntlm_free_buf().
    infotarget infotarget as sent by the server in the type2 message.
    ntlmv2 calculated session key
    + + + + + + + + +
    keythe ntlm key
    lenlength of key
    usernamename of the user, as sent in the message, assumed to be in UTF8.
    targetthe name of the target, assumed to be in UTF8.
    nowthe time now (0 if the library should pick it up itself)
    serverchallengechallenge as sent by the server in the type2 message.
    answerntlm response answer, should be freed with heim_ntlm_free_buf().
    infotargetinfotarget as sent by the server in the type2 message.
    ntlmv2calculated session key
    +
    +
    +
    Returns
    In case of success 0 is return, an errors, a errno in what went wrong.
    +

    First check with the domain as the client passed it to the function.

    +

    Second check with domain uppercased.

    +

    Third check with empty domain.

    +
    Examples
    test_ntlm.c.
    -
    Returns:
    In case of success 0 is return, an errors, a errno in what went wrong.
    -

    +


    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/index.html b/crypto/heimdal/doc/doxyout/ntlm/html/index.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/index.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/index.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: Heimdal NTLM library +Heimdal NTLM library @@ -8,30 +8,35 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Heimdal NTLM library
    +
    -

    Heimdal NTLM library

    -

    -

    1.5.2

    -Introduction

    -Heimdal libheimntlm library is a implementation of the NTLM protocol, both version 1 and 2. The GSS-API mech that uses this library adds support for transport encryption and integrity checking.

    -NTLM is a protocol for mutual authentication, its still used in many protocol where Kerberos is not support, one example is EAP/X802.1x mechanism LEAP from Microsoft and Cisco.

    -This is a support library for the core protocol, its used in Heimdal to implement and GSS-API mechanism. There is also support in the KDC to do remote digest authenticiation, this to allow services to authenticate users w/o direct access to the users ntlm hashes (same as Kerberos arcfour enctype keys).

    -More information about the NTLM protocol can found here http://davenport.sourceforge.net/ntlm.html .

    -The Heimdal projects web page: http://www.h5l.org/

    -NTLM Example

    -Example to to use test_ntlm::c .
    +

    +Introduction

    +

    Heimdal libheimntlm library is a implementation of the NTLM protocol, both version 1 and 2. The GSS-API mech that uses this library adds support for transport encryption and integrity checking.

    +

    NTLM is a protocol for mutual authentication, its still used in many protocol where Kerberos is not support, one example is EAP/X802.1x mechanism LEAP from Microsoft and Cisco.

    +

    This is a support library for the core protocol, its used in Heimdal to implement and GSS-API mechanism. There is also support in the KDC to do remote digest authenticiation, this to allow services to authenticate users w/o direct access to the users ntlm hashes (same as Kerberos arcfour enctype keys).

    +

    More information about the NTLM protocol can found here http://davenport.sourceforge.net/ntlm.html .

    +

    The Heimdal projects web page: http://www.h5l.org/

    +

    +NTLM Example

    +

    Example to to use test_ntlm.c .

    +
    +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/jquery.js b/crypto/heimdal/doc/doxyout/ntlm/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/ntlm/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/menu.js b/crypto/heimdal/doc/doxyout/ntlm/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/ntlm/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/menudata.js b/crypto/heimdal/doc/doxyout/ntlm/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/ntlm/html/menudata.js @@ -0,0 +1,33 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Modules",url:"modules.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Examples",url:"examples.html"}]} diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/modules.html b/crypto/heimdal/doc/doxyout/ntlm/html/modules.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/modules.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/modules.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: Module Index +Modules @@ -8,23 +8,29 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    Modules
    +
    -

    Modules

    Here is a list of all modules: -
    +
    Here is a list of all modules:
    +

    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/nav_f.png b/crypto/heimdal/doc/doxyout/ntlm/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@ -Heimdalntlmlibrary: ntlm_buf Struct Reference +ntlm_buf Struct Reference @@ -8,75 +8,78 @@ keyhole logo

    - - + + + + + +
    +
    + +
    +
    ntlm_buf Struct Reference
    +
    -

    ntlm_buf Struct Reference

    #include <heimntlm.h> -

    - - - - - - +

    #include <heimntlm.h>

    +

    Data Fields

    size_t length
    void * data
    + + + + +

    +Data Fields

    size_t length
     
    void * data
     
    -


    Detailed Description

    -Buffer for storing data in the NTLM library. When filled in by the library it should be freed with heim_ntlm_free_buf().
    Examples:
    +

    Detailed Description

    +

    Buffer for storing data in the NTLM library. When filled in by the library it should be freed with heim_ntlm_free_buf().

    +
    Examples
    test_ntlm.c.
    +
    +

    Field Documentation

    + +

    ◆ data

    -

    -test_ntlm.c.


    Field Documentation

    -
    - +
    size_t ntlm_buf::length void* ntlm_buf::data
    -
    -
    +
    +

    pointer to the data itself

    +
    Examples
    test_ntlm.c.
    +
    -

    -length buffer data

    Examples:
    -test_ntlm.c.
    -

    - +

    + +

    ◆ length

    +
    - +
    void* ntlm_buf::data size_t ntlm_buf::length
    -
    -
    +
    +

    length buffer data

    +
    Examples
    test_ntlm.c.
    +
    -

    -pointer to the data itself

    Examples:
    -test_ntlm.c.
    -

    -


    The documentation for this struct was generated from the following file:
      -
    • /Users/lha/src/heimdal/heimdal-release/heimdal-1.5.2/lib/ntlm/heimntlm.h
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/ntlm/heimntlm.h
    • +
    +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type1.html b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type1.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type1.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type1.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: ntlm_type1 Struct Reference +ntlm_type1 Struct Reference @@ -8,111 +8,33 @@ keyhole logo

    - - + + + + + + +
    +
    +
    ntlm_type1 Struct Reference
    +
    -

    ntlm_type1 Struct Reference

    #include <heimntlm.h> -

    - - - - - - - - - - - -

    Data Fields

    uint32_t flags
    char * domain
    char * hostname
    uint32_t os [2]
    -


    Detailed Description

    -Struct for the NTLM type1 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with heim_ntlm_free_type1().
    Examples:
    - -

    -test_ntlm.c.


    Field Documentation

    - -
    -
    - - - - -
    uint32_t ntlm_type1::flags
    -
    -
    -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    char* ntlm_type1::domain
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    char* ntlm_type1::hostname
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    uint32_t ntlm_type1::os[2]
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    -


    The documentation for this struct was generated from the following file:
      -
    • /Users/lha/src/heimdal/heimdal-release/heimdal-1.5.2/lib/ntlm/heimntlm.h
    -
    +

    #include <heimntlm.h>

    +

    Detailed Description

    +

    Struct for the NTLM type1 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with heim_ntlm_free_type1().

    +
    Examples
    test_ntlm.c.
    +
    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/ntlm/heimntlm.h
    • +
    +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2.html b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2.html --- a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2.html +++ b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2.html @@ -1,6 +1,6 @@ -Heimdalntlmlibrary: ntlm_type2 Struct Reference +ntlm_type2 Struct Reference @@ -8,152 +8,42 @@ keyhole logo

    - - + + + + + + +
    +
    +
    ntlm_type2 Struct Reference
    +
    -

    ntlm_type2 Struct Reference

    #include <heimntlm.h> -

    + +

    #include <heimntlm.h>

    Collaboration diagram for ntlm_type2:
    -
    -

    Collaboration graph
    - - -
    [legend]
    - - - - - - - - - - - - - - - -

    Data Fields

    uint32_t flags
    char * targetname
    struct ntlm_buf targetinfo
    unsigned char challenge [8]
    uint32_t context [2]
    uint32_t os [2]
    -

    Detailed Description

    -Struct for the NTLM type2 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with heim_ntlm_free_type2().
    Examples:
    - -

    -test_ntlm.c.


    Field Documentation

    - -
    -
    - - - - -
    uint32_t ntlm_type2::flags
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    char* ntlm_type2::targetname
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    struct ntlm_buf ntlm_type2::targetinfo [read]
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    unsigned char ntlm_type2::challenge[8]
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    uint32_t ntlm_type2::context[2]
    -
    -
    - -

    - -

    -

    - -

    -
    - - - - -
    uint32_t ntlm_type2::os[2]
    -
    -
    - -

    - -

    -

    -


    The documentation for this struct was generated from the following file:
      -
    • /Users/lha/src/heimdal/heimdal-release/heimdal-1.5.2/lib/ntlm/heimntlm.h
    -
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +

    Detailed Description

    +

    Struct for the NTLM type2 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with heim_ntlm_free_type2().

    +
    Examples
    test_ntlm.c.
    +
    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/ntlm/heimntlm.h
    • +
    +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.map b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.map --- a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.map +++ b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.map @@ -1 +1,4 @@ - + + + + diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.md5 b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.md5 --- a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.md5 +++ b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.md5 @@ -1 +1 @@ -b5989391473842dda9191d0175c17177 \ No newline at end of file +4ea1502acc4e1f5bbab43d1826f092bd \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.png b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type2__coll__graph.png index 14c79b434fb7ef5466409f4a94183e39173c77ae..e479b0f4a74972047527ae8ff430bf546b913d41 GIT binary patch literal 4015 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 -Heimdalntlmlibrary: ntlm_type3 Struct Reference +ntlm_type3 Struct Reference @@ -8,187 +8,42 @@ keyhole logo

    - - + + + + + + +
    +
    +
    ntlm_type3 Struct Reference
    +
    -

    ntlm_type3 Struct Reference

    #include <heimntlm.h> -

    + +

    #include <heimntlm.h>

    Collaboration diagram for ntlm_type3:
    -
    -

    Collaboration graph
    - - -
    [legend]
    - - - - - - - - - - - - - - - - - - - -

    Data Fields

    uint32_t flags
    char * username
    char * targetname
    struct ntlm_buf lm
    struct ntlm_buf ntlm
    struct ntlm_buf sessionkey
    char * ws
    uint32_t os [2]
    -

    Detailed Description

    -Struct for the NTLM type3 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with heim_ntlm_free_type3().
    Examples:
    - -

    -test_ntlm.c.


    Field Documentation

    - -
    -
    - - - - -
    uint32_t ntlm_type3::flags
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    char* ntlm_type3::username
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    char* ntlm_type3::targetname
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    struct ntlm_buf ntlm_type3::lm [read]
    -
    -
    - -

    - -

    -

    - -

    -
    - - - - -
    struct ntlm_buf ntlm_type3::ntlm [read]
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    struct ntlm_buf ntlm_type3::sessionkey [read]
    -
    -
    - -

    - -

    -

    - -

    -
    - - - - -
    char* ntlm_type3::ws
    -
    -
    - -

    -

    Examples:
    -test_ntlm.c.
    -
    -

    - -

    -
    - - - - -
    uint32_t ntlm_type3::os[2]
    -
    -
    - -

    - -

    -

    -


    The documentation for this struct was generated from the following file:
      -
    • /Users/lha/src/heimdal/heimdal-release/heimdal-1.5.2/lib/ntlm/heimntlm.h
    -
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    +

    Detailed Description

    +

    Struct for the NTLM type3 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with heim_ntlm_free_type3().

    +
    Examples
    test_ntlm.c.
    +
    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jaltman/src/sourdough-waffles/lib/ntlm/heimntlm.h
    • +
    +
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.map b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.map --- a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.map +++ b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.map @@ -1 +1,4 @@ - + + + + diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.md5 b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.md5 --- a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.md5 +++ b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.md5 @@ -1 +1 @@ -e51b24543271b5e19333877ec8086fcd \ No newline at end of file +a58b46610424eb6327f95db1f19c3aa8 \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.png b/crypto/heimdal/doc/doxyout/ntlm/html/structntlm__type3__coll__graph.png index 6553470777e867e963e06dddf4943589b6138228..fd9b67548ac3084542c4c6355e9e2144184f9e83 GIT binary patch literal 4596 zc${UI1z1#Hx5kI=4nab?MP%R)qSP>S4T6AxBGTOq%^+P8L&ty$sEB}wATlB$B{dG+ z(h5jONOL#ez0dvb_uQ%T%s%H?`<%Vkdf(qlKp1G!P+p~kKp-^QTJXEz7zDnBOGG%u$%&sI-1`fk#Z%QjqsbxC_dPkVD^Bn^4%c_809)vFQ)aw_6> z-Z4^y$MIRz*wH(}UdoLDT4-^_>&ZOK)*f_sV{cFI?;awWo)GiBkAz@|GBA_QQ=06D z{t5)!!>O|CPZSy!mi5fmgn^TjT24-`+#ZKL$ScgujDBfYET-1`ibqtGVtIL4uQzS} z!=N36oRacMaq*m%D?1Bv3B& zgQS{QUDPE3rF^U5jrUW?|~;B+VzAx2>>&3@3lLx;AH;PEu}%9m}lr z7m)Gu^Se#dl8jYb$0a3E>FMh;Ff*6d#8y^H^ySM^nVOnz@9lkk?>Gp7WM^l0cXyYJ zoou`xtg-E)<-FxXOhG{rpP2Y0F0QL4m0*bamreJ2Nm*IU;bCBDS(&P#Azjjy8yavp zF-%R(`xjo&ZL*G{K+bbhPEt^iBrh-TRb^!~xZTOADetXW#mwyNww@k}CgfJ^hY$ND zSK)jNo70U%TwGj%K|%8^kwo(TYs0AZt%>(!f`Wp$v9Yd(x$xVSXJ%w3cdb0fYY2{y zkLk&Yy^u)F`}gx;-sk7%I6VHz+qc&xBqV+;E)vnu(8wz&v~_orU!3ly!lo#wsiT{l zm1JaP8R+SGd=GpGvU1(*?BExpIGl=^Sq{vbl$3POQ(wPdX*bcM3y;q@cYpl&$?DJrkg_uadUI?S{>kmsMy%>;_>**su&73*@>~SD`a%sa1|94{?E^~wYEeS@fxpr z*!a{`)N_&0qvae3sy&X5Us{@xmX>zB33=lmxABr~LDappF=B|emR8`5)IdpWmvB1M zm|fM2y%RfoXvBFaHgMcjkR{#2?~rRQ)UWE|a=auJPVv z4;XaRVyW)y>q{TKX=jmfz2rTXG_xjTJFD^A`s{roM1i)ZEj2}Pk+xNenN(HT-%<}c zH4)hONx08^mV%Wsf|R4dd;4^rrhNI8_(r($QT5!qs!@xvHAY5|vMpYuHt%DmO>-tl%~s zbb!R4b=C|lk!p*VmYs2k;-2$pFD7l6*%b9eoIRwAbhz-`MIz~$&*iLp z!&w6I^ia>|){j|7K08%;X!b9jha`HjnC4j({pB2db9-~nRi7e+FwC(G%#uRZpK?*9Yej$jC?6OS0xeJ97t*{DghC!nwT8drHU;CMKp}%&&RQ z`<}H5B`;p6U6hMd4Bi={V+lh4PkwR}0_n+xI?_T~rl&b2B_*YufgqKyzJ2@lrt7Fg zmg@%1y5+Nhf&Nx}HP_+OP@?wDd4WLYsC`H2Im{iA&=Bb>Ka$oN9-STUcMl9WSahN; zm#VZ>KtNb{XcxIPd#|TKCYI9k551P5p{BjP;E*(PtXvR8>2zDo&fcC^M1)-2w6bNj zIO6H(sA-{6*i~(9ZTa9m5uj=(DNX+Cto0rMqZ%6IW;n==VOUtS51QW<;L1o{8 zUE)z4@V*!XY;~+hd7+Fm zV`XKf*XiMo(lG_E`Im6T)3dYhGc$@M4zEop6%`fl1a70AUKbHTf%!}C-WuGx7i3l? z0fWK1J5w$<+z*LF<8TO{^V1+0Ij@|@GzcsN=S!!Dkv9hJ@V%?A7XoSSv$#}Nq#S|y z*wn-XBiA-G6kb_bS=#z?ArwuYk&yudu{2#=UA3*OIKPjK2eTC>L6Ca-P=K*1hJq*jPr896@oy-X^)BYr~?_&UgWzzb>1hdc zJ@EKi|8>(m`+$IerBvnfG!Ee#ZyQvn8a#z9>)q0|kzQUrms5Frd)qC1P1ySbs)G=S z4r4G!*HbQj4-b!}quo_X=Yj5S9#&S?(ibnH=waQ->`*NookVOqRACaWe6++wOh&d? z;Mp7*6GIXj8oIsr%NU|~BSBa|pk;OzgMpMhd#379h^?D7F*9rL>(g_{d;MDUK^+JC z*{XJ7tcKwr9xN?HB|Kc|;P(_66bk+M>(}@7o*}H$cRn^YHXcA4hL}5%CSo16_PtBo z*G3CYYZZg0>fJwjFOp)E!V+)VcJj!}v#AWaiV+YHh+My(l{Z>>p9n(KNt1oRsH>}+ zx2}xyRcxrOy=u|~=1xpZM3|e$GYK2uddY@3+1TR8$IS%<1RgDRrqGiwO?3yOr>-{D zoUC)n`>s$!T5vdeaBb-jsK@loOgPM8FUVxx^^GbaLghJ*I!$CuI&*Gt6?| zM?xhhmi}IRQlAY!aewUUs>{jA86Ou%CMqiWZ0u;K>sn8p^H4mXt-PDIqyQ(Z$$6vi zgdTde$Ok!puI`DZXXNHKC^sn5DJ(3EfAdDX5$GCkbQ%zSY2>C=@aLybX$euxEG+vI zoe50B@n|%Yvx`f{nBnqdzQmQ-ybI+7xkgS`IR(R?AZ z{{hO6KKFbJRSv3a2}Y0DU|s#=_Jww-Y5%`pHY*10wKoX+5;TAOk8uzU*R}NZD;!|B zp-w)a_7xQ@Pds{A7H5e0W%sva(mTq}|X{Q&T(J^J)+kKy}_aXs)>oo4@kH3U&^6 zY$dFlIj=>WzMDR^?q6(+p{n`tp#wA+1Q2(3_whzwVFS#a1OObwBqTP=-?Gwl%3f7e z5JIA3VlLZ+FXzYNk8N#lh8(zo6th|B%NzgTdIhLgUw{9191ivTIiH<_1I*g`8c>yX z#ZWPuaYt!&BLFhdMMYfA$7|w+^4^3+MMd5H{V~PG*C0P$q$;)bo~{_+?XaGEFt#d{6tG%zpOe3SX8c*4Iw8N7ckaOpFaJ(!_UWu z8yO)1^z-eT4jc~Wk&vJc`McTC=)0PRMn{1*NufF;gAuN&$uBNWg~4EOqodrL^TrhX zqfoo^(<4Z5XQ~VoidL5KyaAqy2qGmXM~2(&FU#4jW^GDbD-of*b?a8{ZKPz?gCcgKT2axA zBgzOgR_rstU7VbqRdsc#K)a>L&c@aq>bN5q8yoB8>#Js9FyOjwOE~&>XDu~L+>B33 zihg&czrFC5uaw8MeBK_wO+YLJ5R767DNtT>OG`Bo=Es8=#l34)_4TZsot+<%TihPA zSWzg-<-voZzBsuN_Oe+R1u-EYOhBp!uOEm*>8Plv^a}o=0lo94u?bPjpz=j>ZLKsw zuX)g_nqvcRT3K01IrOnzmJWag`lOEWdUp;`B#%5jQRPwv4{x$ww^jKRM@L^@Ul$h_cXxNEr>DQa zzW@LL|Ns9$to#Q60004WQchCOUXKLDy$FO0h z{h4WtEg=Vy(4Cic;PgFiEv1_c@Agvoo8C=Fl$YQ{EYrlp<^FxaF1}wVk)F zKpCtN``C8M_9t+T-Im)NZ-@3a?(*8fwnB{BnZVwMT@X8bTzhNS#h!Uj^yA9SHruzi zXN6>!zlr9BWcf#8*+~)$znvWkUu-8&w&UP;vXk@eDEN)+B#DUM$aa1NmTk7#zNQ^* zsex^_SAS&qo7YF!1K;`{X@7p}8`B;i*M`3ZWSi~y_QJsSE$nN~V~@4Rmu?TRXO1dS z?a8IvUG0gb+g~|c1L?vV4Lj=+t-}G2d?MuF7ds~9ohaP zKp1NkJxXP5?qYuH#xk6?RXd@(B&C|%h9*_|@JgGWrpW~!P|7q5v5@AWknX2%Oj2o^ zYH_MH?WDe<+>qm3?H0J{Fd^o)?qM?bs8KVa)8jvsv&pS8`dM%PPKC&2v&wBK7Pes; z=}#xApjrsI^VABt#kQ`NL(EVtYw1>kzFDiTW7qFxyrIp~{|Eray zwlb<}%I#u4rB`my=xZpot`ySvUMRP-EH~NOqo(uLt!Vdasqlxgx+`MZ8vu!E~1P2NV|Vb8oo}lXP+b6Y_sj{y}}Ipl)(1! Z;U7ou&kQ#A=NSM1002ovPDHLkV1fWC@pk|K diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/sync_off.png b/crypto/heimdal/doc/doxyout/ntlm/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zc$@)M1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@IeJfk6j|89*WoOiV6}4AuZ}83fn> diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/tab_b.png b/crypto/heimdal/doc/doxyout/ntlm/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 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 literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/test__ntlm_8c-example.html b/crypto/heimdal/doc/doxyout/ntlm/html/test__ntlm_8c-example.html deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/html/test__ntlm_8c-example.html +++ /dev/null @@ -1,408 +0,0 @@ - - -Heimdalntlmlibrary: test_ntlm.c - - - -

    -keyhole logo -

    - - - -
    -

    test_ntlm.c

    Example how to use the NTLM primitives.

    -

    /*
    - * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
    - * (Royal Institute of Technology, Stockholm, Sweden).
    - * All rights reserved.
    - *
    - * Redistribution and use in source and binary forms, with or without
    - * modification, are permitted provided that the following conditions
    - * are met:
    - *
    - * 1. Redistributions of source code must retain the above copyright
    - *    notice, this list of conditions and the following disclaimer.
    - *
    - * 2. Redistributions in binary form must reproduce the above copyright
    - *    notice, this list of conditions and the following disclaimer in the
    - *    documentation and/or other materials provided with the distribution.
    - *
    - * 3. Neither the name of KTH nor the names of its contributors may be
    - *    used to endorse or promote products derived from this software without
    - *    specific prior written permission.
    - *
    - * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
    - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
    - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
    - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    - */
    -
    -#include "config.h"
    -
    -#include <stdio.h>
    -#include <err.h>
    -#include <roken.h>
    -#include <getarg.h>
    -
    -#include <krb5-types.h> /* or <inttypes.h> */
    -#include <heimntlm.h>
    -
    -static int
    -test_parse(void)
    -{
    -    const char *user = "foo",
    -        *domain = "mydomain",
    -        *password = "digestpassword",
    -        *target = "DOMAIN";
    -    struct ntlm_type1 type1;
    -    struct ntlm_type2 type2;
    -    struct ntlm_type3 type3;
    -    struct ntlm_buf data;
    -    int ret, flags;
    -
    -    memset(&type1, 0, sizeof(type1));
    -
    -    type1.flags = NTLM_NEG_UNICODE|NTLM_NEG_TARGET|NTLM_NEG_NTLM;
    -    type1.domain = rk_UNCONST(domain);
    -    type1.hostname = NULL;
    -    type1.os[0] = 0;
    -    type1.os[1] = 0;
    -
    -    ret = heim_ntlm_encode_type1(&type1, &data);
    -    if (ret)
    -        errx(1, "heim_ntlm_encode_type1");
    -
    -    memset(&type1, 0, sizeof(type1));
    -
    -    ret = heim_ntlm_decode_type1(&data, &type1);
    -    free(data.data);
    -    if (ret)
    -        errx(1, "heim_ntlm_encode_type1");
    -
    -    heim_ntlm_free_type1(&type1);
    -
    -    /*
    -     *
    -     */
    -
    -    memset(&type2, 0, sizeof(type2));
    -
    -    flags = NTLM_NEG_UNICODE | NTLM_NEG_NTLM | NTLM_TARGET_DOMAIN;
    -    type2.flags = flags;
    -
    -    memset(type2.challenge, 0x7f, sizeof(type2.challenge));
    -    type2.targetname = rk_UNCONST(target);
    -    type2.targetinfo.data = NULL;
    -    type2.targetinfo.length = 0;
    -
    -    ret = heim_ntlm_encode_type2(&type2, &data);
    -    if (ret)
    -        errx(1, "heim_ntlm_encode_type2");
    -
    -    memset(&type2, 0, sizeof(type2));
    -
    -    ret = heim_ntlm_decode_type2(&data, &type2);
    -    free(data.data);
    -    if (ret)
    -        errx(1, "heim_ntlm_decode_type2");
    -
    -    heim_ntlm_free_type2(&type2);
    -
    -    /*
    -     *
    -     */
    -
    -    memset(&type3, 0, sizeof(type3));
    -
    -    type3.flags = flags;
    -    type3.username = rk_UNCONST(user);
    -    type3.targetname = rk_UNCONST(target);
    -    type3.ws = rk_UNCONST("workstation");
    -
    -    {
    -        struct ntlm_buf key;
    -        heim_ntlm_nt_key(password, &key);
    -
    -        heim_ntlm_calculate_ntlm1(key.data, key.length,
    -                                  type2.challenge,
    -                                  &type3.ntlm);
    -        free(key.data);
    -    }
    -
    -    ret = heim_ntlm_encode_type3(&type3, &data);
    -    if (ret)
    -        errx(1, "heim_ntlm_encode_type3");
    -
    -    free(type3.ntlm.data);
    -
    -    memset(&type3, 0, sizeof(type3));
    -
    -    ret = heim_ntlm_decode_type3(&data, 1, &type3);
    -    free(data.data);
    -    if (ret)
    -        errx(1, "heim_ntlm_decode_type3");
    -
    -    if (strcmp("workstation", type3.ws) != 0)
    -        errx(1, "type3 ws wrong");
    -
    -    if (strcmp(target, type3.targetname) != 0)
    -        errx(1, "type3 targetname wrong");
    -
    -    if (strcmp(user, type3.username) != 0)
    -        errx(1, "type3 username wrong");
    -
    -
    -    heim_ntlm_free_type3(&type3);
    -
    -    /*
    -     * NTLMv2
    -     */
    -
    -    memset(&type2, 0, sizeof(type2));
    -
    -    flags = NTLM_NEG_UNICODE | NTLM_NEG_NTLM | NTLM_TARGET_DOMAIN;
    -    type2.flags = flags;
    -
    -    memset(type2.challenge, 0x7f, sizeof(type2.challenge));
    -    type2.targetname = rk_UNCONST(target);
    -    type2.targetinfo.data = "\x00\x00";
    -    type2.targetinfo.length = 2;
    -
    -    ret = heim_ntlm_encode_type2(&type2, &data);
    -    if (ret)
    -        errx(1, "heim_ntlm_encode_type2");
    -
    -    memset(&type2, 0, sizeof(type2));
    -
    -    ret = heim_ntlm_decode_type2(&data, &type2);
    -    free(data.data);
    -    if (ret)
    -        errx(1, "heim_ntlm_decode_type2");
    -
    -    heim_ntlm_free_type2(&type2);
    -
    -    return 0;
    -}
    -
    -static int
    -test_keys(void)
    -{
    -    const char
    -        *username = "test",
    -        *password = "test1234",
    -        *target = "TESTNT";
    -    const unsigned char
    -        serverchallenge[8] = "\x67\x7f\x1c\x55\x7a\x5e\xe9\x6c";
    -    struct ntlm_buf infotarget, infotarget2, answer, key;
    -    unsigned char ntlmv2[16], ntlmv2_1[16];
    -    int ret;
    -
    -    infotarget.length = 70;
    -    infotarget.data =
    -        "\x02\x00\x0c\x00\x54\x00\x45\x00\x53\x00\x54\x00\x4e\x00\x54\x00"
    -        "\x01\x00\x0c\x00\x4d\x00\x45\x00\x4d\x00\x42\x00\x45\x00\x52\x00"
    -        "\x03\x00\x1e\x00\x6d\x00\x65\x00\x6d\x00\x62\x00\x65\x00\x72\x00"
    -            "\x2e\x00\x74\x00\x65\x00\x73\x00\x74\x00\x2e\x00\x63\x00\x6f"
    -            "\x00\x6d\x00"
    -        "\x00\x00\x00\x00";
    -
    -    answer.length = 0;
    -    answer.data = NULL;
    -
    -    heim_ntlm_nt_key(password, &key);
    -
    -    ret = heim_ntlm_calculate_ntlm2(key.data,
    -                                    key.length,
    -                                    username,
    -                                    target,
    -                                    serverchallenge,
    -                                    &infotarget,
    -                                    ntlmv2,
    -                                    &answer);
    -    if (ret)
    -        errx(1, "heim_ntlm_calculate_ntlm2");
    -
    -    ret = heim_ntlm_verify_ntlm2(key.data,
    -                                 key.length,
    -                                 username,
    -                                 target,
    -                                 0,
    -                                 serverchallenge,
    -                                 &answer,
    -                                 &infotarget2,
    -                                 ntlmv2_1);
    -    if (ret)
    -        errx(1, "heim_ntlm_verify_ntlm2");
    -
    -    if (memcmp(ntlmv2, ntlmv2_1, sizeof(ntlmv2)) != 0)
    -        errx(1, "ntlm master key not same");
    -
    -    if (infotarget.length > infotarget2.length)
    -        errx(1, "infotarget length");
    -
    -    if (memcmp(infotarget.data, infotarget2.data, infotarget.length) != 0)
    -        errx(1, "infotarget not the same");
    -
    -    free(key.data);
    -    free(answer.data);
    -    free(infotarget2.data);
    -
    -    return 0;
    -}
    -
    -static int
    -test_ntlm2_session_resp(void)
    -{
    -    int ret;
    -    struct ntlm_buf lm, ntlm;
    -
    -    const unsigned char lm_resp[24] =
    -        "\xff\xff\xff\x00\x11\x22\x33\x44"
    -        "\x00\x00\x00\x00\x00\x00\x00\x00"
    -        "\x00\x00\x00\x00\x00\x00\x00\x00";
    -    const unsigned char ntlm2_sess_resp[24] =
    -        "\x10\xd5\x50\x83\x2d\x12\xb2\xcc"
    -        "\xb7\x9d\x5a\xd1\xf4\xee\xd3\xdf"
    -        "\x82\xac\xa4\xc3\x68\x1d\xd4\x55";
    -
    -    const unsigned char client_nonce[8] =
    -        "\xff\xff\xff\x00\x11\x22\x33\x44";
    -    const unsigned char server_challenge[8] =
    -        "\x01\x23\x45\x67\x89\xab\xcd\xef";
    -
    -    const unsigned char ntlm_hash[16] =
    -        "\xcd\x06\xca\x7c\x7e\x10\xc9\x9b"
    -        "\x1d\x33\xb7\x48\x5a\x2e\xd8\x08";
    -
    -    ret = heim_ntlm_calculate_ntlm2_sess(client_nonce,
    -                                         server_challenge,
    -                                         ntlm_hash,
    -                                         &lm,
    -                                         &ntlm);
    -    if (ret)
    -        errx(1, "heim_ntlm_calculate_ntlm2_sess_resp");
    -
    -    if (lm.length != 24 || memcmp(lm.data, lm_resp, 24) != 0)
    -        errx(1, "lm_resp wrong");
    -    if (ntlm.length != 24 || memcmp(ntlm.data, ntlm2_sess_resp, 24) != 0)
    -        errx(1, "ntlm2_sess_resp wrong");
    -
    -    free(lm.data);
    -    free(ntlm.data);
    -
    -
    -    return 0;
    -}
    -
    -static int
    -test_targetinfo(void)
    -{
    -    struct ntlm_targetinfo ti;
    -    struct ntlm_buf buf;
    -    const char *dnsservername = "dnsservername";
    -    int ret;
    -
    -    memset(&ti, 0, sizeof(ti));
    -
    -    ti.dnsservername = rk_UNCONST(dnsservername);
    -    ti.avflags = 1;
    -    ret = heim_ntlm_encode_targetinfo(&ti, 1, &buf);
    -    if (ret)
    -        return ret;
    -
    -    memset(&ti, 0, sizeof(ti));
    -
    -    ret = heim_ntlm_decode_targetinfo(&buf, 1, &ti);
    -    if (ret)
    -        return ret;
    -
    -    if (ti.dnsservername == NULL ||
    -        strcmp(ti.dnsservername, dnsservername) != 0)
    -        errx(1, "ti.dnshostname != %s", dnsservername);
    -    if (ti.avflags != 1)
    -        errx(1, "ti.avflags != 1");
    -
    -    heim_ntlm_free_targetinfo(&ti);
    -
    -    return 0;
    -}
    -
    -static int verbose_flag = 0;
    -static int version_flag = 0;
    -static int help_flag    = 0;
    -
    -static struct getargs args[] = {
    -    {"verbose", 0,      arg_flag,       &verbose_flag, "verbose printing", NULL },
    -    {"version", 0,      arg_flag,       &version_flag, "print version", NULL },
    -    {"help",    0,      arg_flag,       &help_flag,  NULL, NULL }
    -};
    -
    -static void
    -usage (int ret)
    -{
    -    arg_printusage (args, sizeof(args)/sizeof(*args),
    -                    NULL, "");
    -    exit (ret);
    -}
    -
    -int
    -main(int argc, char **argv)
    -{
    -    int ret = 0, optind = 0;
    -
    -    setprogname(argv[0]);
    -
    -    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind))
    -        usage(1);
    -
    -    if (help_flag)
    -        usage (0);
    -
    -    if(version_flag){
    -        print_version(NULL);
    -        exit(0);
    -    }
    -
    -    argc -= optind;
    -    argv += optind;
    -
    -    if (verbose_flag)
    -        printf("test_parse\n");
    -
    -    ret += test_parse();
    -    if (verbose_flag)
    -        printf("test_keys\n");
    -
    -    ret += test_keys();
    -    if (verbose_flag)
    -        printf("test_ntlm2_session_resp\n");
    -    ret += test_ntlm2_session_resp();
    -
    -    if (verbose_flag)
    -        printf("test_targetinfo\n");
    -    ret += test_targetinfo();
    -
    -    return ret;
    -}
    -
    -
    -Generated on Wed Jan 11 14:07:50 2012 for Heimdalntlmlibrary by doxygen 1.5.6
    - - diff --git a/crypto/heimdal/doc/doxyout/ntlm/html/test_ntlm_8c-example.html b/crypto/heimdal/doc/doxyout/ntlm/html/test_ntlm_8c-example.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/ntlm/html/test_ntlm_8c-example.html @@ -0,0 +1,669 @@ + + +test_ntlm.c + + + +

    +keyhole logo +

    + + + + + + + +
    +
    +
    test_ntlm.c
    +
    +
    +

    Example how to use the NTLM primitives.

    +
    /*
    +
    * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
    +
    * (Royal Institute of Technology, Stockholm, Sweden).
    +
    * All rights reserved.
    +
    *
    +
    * Redistribution and use in source and binary forms, with or without
    +
    * modification, are permitted provided that the following conditions
    +
    * are met:
    +
    *
    +
    * 1. Redistributions of source code must retain the above copyright
    +
    * notice, this list of conditions and the following disclaimer.
    +
    *
    +
    * 2. Redistributions in binary form must reproduce the above copyright
    +
    * notice, this list of conditions and the following disclaimer in the
    +
    * documentation and/or other materials provided with the distribution.
    +
    *
    +
    * 3. Neither the name of KTH nor the names of its contributors may be
    +
    * used to endorse or promote products derived from this software without
    +
    * specific prior written permission.
    +
    *
    +
    * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
    +
    * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    +
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    +
    * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
    +
    * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    +
    * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    +
    * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
    +
    * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    +
    * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    +
    * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
    +
    * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    */
    +
    +
    #include "config.h"
    +
    +
    #include <stdio.h>
    +
    #include <err.h>
    +
    #include <roken.h>
    +
    #include <getarg.h>
    +
    +
    #include <krb5-types.h> /* or <inttypes.h> */
    +
    #include <heimntlm.h>
    +
    +
    static int dumpdata_flag;
    +
    +
    static int
    +
    test_parse(void)
    +
    {
    +
    const char *user = "foo",
    +
    *domain = "mydomain",
    +
    *hostname = "myhostname",
    +
    *password = "digestpassword",
    +
    *target = "DOMAIN";
    +
    struct ntlm_type1 type1;
    +
    struct ntlm_type2 type2;
    +
    struct ntlm_type3 type3;
    +
    struct ntlm_buf data;
    +
    int ret, flags;
    +
    +
    memset(&type1, 0, sizeof(type1));
    +
    +
    type1.flags = NTLM_NEG_UNICODE|NTLM_NEG_TARGET|NTLM_NEG_NTLM|NTLM_NEG_VERSION;
    +
    type1.domain = rk_UNCONST(domain);
    +
    type1.hostname = rk_UNCONST(hostname);
    +
    type1.os[0] = 0;
    +
    type1.os[1] = 0;
    +
    +
    ret = heim_ntlm_encode_type1(&type1, &data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_encode_type1");
    +
    +
    memset(&type1, 0, sizeof(type1));
    +
    +
    if (dumpdata_flag)
    +
    rk_dumpdata("ntlm-type1", data.data, data.length);
    +
    +
    ret = heim_ntlm_decode_type1(&data, &type1);
    +
    free(data.data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_encode_type1");
    +
    +
    if (strcmp(type1.domain, domain) != 0)
    +
    errx(1, "parser got domain wrong: %s", type1.domain);
    +
    +
    if (strcmp(type1.hostname, hostname) != 0)
    +
    errx(1, "parser got hostname wrong: %s", type1.hostname);
    +
    + +
    +
    /*
    +
    *
    +
    */
    +
    +
    memset(&type2, 0, sizeof(type2));
    +
    +
    flags = NTLM_NEG_UNICODE | NTLM_NEG_NTLM | NTLM_TARGET_DOMAIN;
    +
    type2.flags = flags;
    +
    +
    memset(type2.challenge, 0x7f, sizeof(type2.challenge));
    +
    type2.targetname = rk_UNCONST(target);
    +
    type2.targetinfo.data = NULL;
    +
    type2.targetinfo.length = 0;
    +
    +
    ret = heim_ntlm_encode_type2(&type2, &data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_encode_type2");
    +
    +
    memset(&type2, 0, sizeof(type2));
    +
    +
    if (dumpdata_flag)
    +
    rk_dumpdata("ntlm-type2", data.data, data.length);
    +
    +
    ret = heim_ntlm_decode_type2(&data, &type2);
    +
    free(data.data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_decode_type2");
    +
    + +
    +
    /*
    +
    *
    +
    */
    +
    +
    memset(&type3, 0, sizeof(type3));
    +
    +
    type3.flags = flags;
    +
    type3.username = rk_UNCONST(user);
    +
    type3.targetname = rk_UNCONST(target);
    +
    type3.ws = rk_UNCONST("workstation");
    +
    +
    {
    +
    struct ntlm_buf key;
    +
    heim_ntlm_nt_key(password, &key);
    +
    + +
    type2.challenge,
    +
    &type3.ntlm);
    +
    free(key.data);
    +
    }
    +
    +
    ret = heim_ntlm_encode_type3(&type3, &data, NULL);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_encode_type3");
    +
    +
    free(type3.ntlm.data);
    +
    +
    memset(&type3, 0, sizeof(type3));
    +
    +
    if (dumpdata_flag)
    +
    rk_dumpdata("ntlm-type3", data.data, data.length);
    +
    +
    ret = heim_ntlm_decode_type3(&data, 1, &type3);
    +
    free(data.data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_decode_type3");
    +
    +
    if (strcmp("workstation", type3.ws) != 0)
    +
    errx(1, "type3 ws wrong");
    +
    +
    if (strcmp(target, type3.targetname) != 0)
    +
    errx(1, "type3 targetname wrong");
    +
    +
    if (strcmp(user, type3.username) != 0)
    +
    errx(1, "type3 username wrong");
    +
    +
    + +
    +
    /*
    +
    * NTLMv2
    +
    */
    +
    +
    memset(&type2, 0, sizeof(type2));
    +
    +
    flags = NTLM_NEG_UNICODE | NTLM_NEG_NTLM | NTLM_TARGET_DOMAIN;
    +
    type2.flags = flags;
    +
    +
    memset(type2.challenge, 0x7f, sizeof(type2.challenge));
    +
    type2.targetname = rk_UNCONST(target);
    +
    type2.targetinfo.data = "\x00\x00";
    +
    type2.targetinfo.length = 2;
    +
    +
    ret = heim_ntlm_encode_type2(&type2, &data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_encode_type2");
    +
    +
    memset(&type2, 0, sizeof(type2));
    +
    +
    ret = heim_ntlm_decode_type2(&data, &type2);
    +
    free(data.data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_decode_type2");
    +
    + +
    +
    return 0;
    +
    }
    +
    +
    static int
    +
    test_keys(void)
    +
    {
    +
    const char
    +
    *username = "test",
    +
    *password = "test1234",
    +
    *target = "TESTNT";
    +
    const unsigned char
    +
    serverchallenge[8] = "\x67\x7f\x1c\x55\x7a\x5e\xe9\x6c";
    +
    struct ntlm_buf infotarget, infotarget2, answer, key;
    +
    unsigned char ntlmv2[16], ntlmv2_1[16];
    +
    int ret;
    +
    +
    infotarget.length = 70;
    +
    infotarget.data =
    +
    "\x02\x00\x0c\x00\x54\x00\x45\x00\x53\x00\x54\x00\x4e\x00\x54\x00"
    +
    "\x01\x00\x0c\x00\x4d\x00\x45\x00\x4d\x00\x42\x00\x45\x00\x52\x00"
    +
    "\x03\x00\x1e\x00\x6d\x00\x65\x00\x6d\x00\x62\x00\x65\x00\x72\x00"
    +
    "\x2e\x00\x74\x00\x65\x00\x73\x00\x74\x00\x2e\x00\x63\x00\x6f"
    +
    "\x00\x6d\x00"
    +
    "\x00\x00\x00\x00";
    +
    +
    answer.length = 0;
    +
    answer.data = NULL;
    +
    +
    heim_ntlm_nt_key(password, &key);
    +
    +
    ret = heim_ntlm_calculate_ntlm2(key.data,
    +
    key.length,
    +
    username,
    +
    target,
    +
    serverchallenge,
    +
    &infotarget,
    +
    ntlmv2,
    +
    &answer);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_calculate_ntlm2");
    +
    +
    ret = heim_ntlm_verify_ntlm2(key.data,
    +
    key.length,
    +
    username,
    +
    target,
    +
    0,
    +
    serverchallenge,
    +
    &answer,
    +
    &infotarget2,
    +
    ntlmv2_1);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_verify_ntlm2");
    +
    +
    if (memcmp(ntlmv2, ntlmv2_1, sizeof(ntlmv2)) != 0)
    +
    errx(1, "ntlm master key not same");
    +
    +
    if (infotarget.length > infotarget2.length)
    +
    errx(1, "infotarget length");
    +
    +
    if (memcmp(infotarget.data, infotarget2.data, infotarget.length) != 0)
    +
    errx(1, "infotarget not the same");
    +
    +
    free(key.data);
    +
    free(answer.data);
    +
    free(infotarget2.data);
    +
    +
    return 0;
    +
    }
    +
    +
    static int
    +
    test_ntlm2_session_resp(void)
    +
    {
    +
    int ret;
    +
    struct ntlm_buf lm, ntlm;
    +
    +
    const unsigned char lm_resp[24] =
    +
    "\xff\xff\xff\x00\x11\x22\x33\x44"
    +
    "\x00\x00\x00\x00\x00\x00\x00\x00"
    +
    "\x00\x00\x00\x00\x00\x00\x00\x00";
    +
    const unsigned char ntlm2_sess_resp[24] =
    +
    "\x10\xd5\x50\x83\x2d\x12\xb2\xcc"
    +
    "\xb7\x9d\x5a\xd1\xf4\xee\xd3\xdf"
    +
    "\x82\xac\xa4\xc3\x68\x1d\xd4\x55";
    +
    +
    const unsigned char client_nonce[8] =
    +
    "\xff\xff\xff\x00\x11\x22\x33\x44";
    +
    const unsigned char server_challenge[8] =
    +
    "\x01\x23\x45\x67\x89\xab\xcd\xef";
    +
    +
    const unsigned char ntlm_hash[16] =
    +
    "\xcd\x06\xca\x7c\x7e\x10\xc9\x9b"
    +
    "\x1d\x33\xb7\x48\x5a\x2e\xd8\x08";
    +
    +
    ret = heim_ntlm_calculate_ntlm2_sess(client_nonce,
    +
    server_challenge,
    +
    ntlm_hash,
    +
    &lm,
    +
    &ntlm);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_calculate_ntlm2_sess_resp");
    +
    +
    if (lm.length != 24 || memcmp(lm.data, lm_resp, 24) != 0)
    +
    errx(1, "lm_resp wrong");
    +
    if (ntlm.length != 24 || memcmp(ntlm.data, ntlm2_sess_resp, 24) != 0)
    +
    errx(1, "ntlm2_sess_resp wrong");
    +
    +
    free(lm.data);
    +
    free(ntlm.data);
    +
    +
    +
    return 0;
    +
    }
    +
    +
    static int
    +
    test_ntlmv2(void)
    +
    {
    +
    unsigned char type3[413] =
    +
    "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00\x00\x18\x00\x18\x00"
    +
    "\x80\x00\x00\x00\x9e\x00\x9e\x00\x98\x00\x00\x00\x14\x00\x14\x00"
    +
    "\x48\x00\x00\x00\x10\x00\x10\x00\x5c\x00\x00\x00\x14\x00\x14\x00"
    +
    "\x6c\x00\x00\x00\x00\x00\x00\x00\x36\x01\x00\x00\x05\x82\x88\xa2"
    +
    "\x05\x01\x28\x0a\x00\x00\x00\x0f\x43\x00\x4f\x00\x4c\x00\x4c\x00"
    +
    "\x45\x00\x59\x00\x2d\x00\x58\x00\x50\x00\x34\x00\x54\x00\x45\x00"
    +
    "\x53\x00\x54\x00\x55\x00\x53\x00\x45\x00\x52\x00\x43\x00\x4f\x00"
    +
    "\x4c\x00\x4c\x00\x45\x00\x59\x00\x2d\x00\x58\x00\x50\x00\x34\x00"
    +
    "\x2f\x96\xec\x0a\xf7\x9f\x2e\x24\xba\x09\x48\x10\xa5\x22\xd4\xe1"
    +
    "\x16\x6a\xca\x58\x74\x9a\xc1\x4f\x54\x6f\xee\x40\x96\xce\x43\x6e"
    +
    "\xdf\x99\x20\x71\x6c\x9a\xda\x2a\x01\x01\x00\x00\x00\x00\x00\x00"
    +
    "\x8d\xc0\x57\xc9\x79\x5e\xcb\x01\x16\x6a\xca\x58\x74\x9a\xc1\x4f"
    +
    "\x00\x00\x00\x00\x02\x00\x14\x00\x4e\x00\x55\x00\x54\x00\x43\x00"
    +
    "\x52\x00\x41\x00\x43\x00\x4b\x00\x45\x00\x52\x00\x01\x00\x14\x00"
    +
    "\x4e\x00\x55\x00\x54\x00\x43\x00\x52\x00\x41\x00\x43\x00\x4b\x00"
    +
    "\x45\x00\x52\x00\x04\x00\x12\x00\x61\x00\x70\x00\x70\x00\x6c\x00"
    +
    "\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x03\x00\x20\x00\x68\x00"
    +
    "\x75\x00\x6d\x00\x6d\x00\x65\x00\x6c\x00\x2e\x00\x61\x00\x70\x00"
    +
    "\x70\x00\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x00\x00"
    +
    "\x00\x00\x00\x00\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64\x00\x6f"
    +
    "\x00\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32\x00\x20"
    +
    "\x00\x53\x00\x65\x00\x72\x00\x76\x00\x69\x00\x63\x00\x65\x00\x20"
    +
    "\x00\x50\x00\x61\x00\x63\x00\x6b\x00\x20\x00\x33\x00\x20\x00\x32"
    +
    "\x00\x36\x00\x30\x00\x30\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64"
    +
    "\x00\x6f\x00\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32"
    +
    "\x00\x20\x00\x35\x00\x2e\x00\x31\x00\x00\x00\x00\x00";
    +
    const unsigned char challenge[8] =
    +
    "\xe4\x9c\x6a\x12\xe1\xbd\xde\x6a";
    +
    unsigned char sessionkey[16];
    +
    +
    const char key[16] = "\xD1\x83\x98\x3E\xAE\xA7\xBE\x99\x59\xC8\xF4\xC1\x98\xED\x0E\x68";
    +
    +
    struct ntlm_buf data;
    +
    struct ntlm_type3 t3;
    +
    int ret;
    +
    +
    struct ntlm_targetinfo ti;
    +
    +
    unsigned char timsg[114] =
    +
    "\002\000\024\000N\000U\000T\000C\000R\000A\000C\000K\000E\000R\000\001\000\024\000N\000U\000T\000C\000R\000A\000C\000K\000E\000R\000\004\000\022\000a\000p\000p\000l\000e\000.\000c\000o\000m\000\003\000 \000h\000u\000m\000m\000e\000l\000.\000a\000p\000p\000l\000e\000.\000c\000o\000m\000\000\000\000\000\000\000\000";
    +
    +
    +
    data.data = type3;
    +
    data.length = sizeof(type3);
    +
    +
    ret = heim_ntlm_decode_type3(&data, 1, &t3);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_decode_type3");
    +
    +
    memset(&ti, 0, sizeof(ti));
    +
    +
    data.data = timsg;
    +
    data.length = sizeof(timsg);
    +
    +
    ret = heim_ntlm_decode_targetinfo(&data, 1, &ti);
    +
    if (ret)
    +
    return ret;
    +
    +
    ret = heim_ntlm_verify_ntlm2(key, sizeof(key),
    +
    t3.username,
    +
    t3.targetname,
    +
    1285615547,
    +
    challenge,
    +
    &t3.ntlm,
    +
    &data,
    +
    sessionkey);
    +
    if (ret)
    +
    errx(1, "verify_ntlmv2");
    +
    +
    if (sizeof(timsg) != data.length || memcmp(timsg, data.data, sizeof(timsg)) != 0)
    +
    errx(1, "target info wrong: %d != %d",
    +
    (int)sizeof(timsg), (int)data.length);
    +
    + + +
    +
    return 0;
    +
    }
    +
    +
    static int
    +
    test_targetinfo(void)
    +
    {
    +
    struct ntlm_targetinfo ti;
    +
    struct ntlm_buf buf;
    +
    const char *dnsservername = "dnsservername";
    +
    const char *targetname = "targetname";
    +
    const char z16[16] = { 0 };
    +
    int ret;
    +
    +
    memset(&ti, 0, sizeof(ti));
    +
    +
    ti.dnsservername = rk_UNCONST(dnsservername);
    +
    ti.avflags = 1;
    +
    ti.targetname = rk_UNCONST(targetname);
    +
    ti.channel_bindings.data = rk_UNCONST(z16);
    +
    ti.channel_bindings.length = sizeof(z16);
    +
    +
    ret = heim_ntlm_encode_targetinfo(&ti, 1, &buf);
    +
    if (ret)
    +
    return ret;
    +
    +
    memset(&ti, 0, sizeof(ti));
    +
    +
    ret = heim_ntlm_decode_targetinfo(&buf, 1, &ti);
    +
    if (ret)
    +
    return ret;
    +
    +
    if (ti.dnsservername == NULL ||
    +
    strcmp(ti.dnsservername, dnsservername) != 0)
    +
    errx(1, "ti.dnshostname != %s", dnsservername);
    +
    if (ti.avflags != 1)
    +
    errx(1, "ti.avflags != 1");
    +
    if (ti.targetname == NULL ||
    +
    strcmp(ti.targetname, targetname) != 0)
    +
    errx(1, "ti.targetname != %s", targetname);
    +
    +
    if (ti.channel_bindings.length != sizeof(z16) ||
    +
    memcmp(ti.channel_bindings.data, z16, sizeof(z16)) != 0)
    +
    errx(1, "ti.channel_bindings != Z(16)");
    +
    + +
    +
    return 0;
    +
    }
    +
    +
    static int
    +
    test_string2key(void)
    +
    {
    +
    const char *pw = "山田";
    +
    struct ntlm_buf buf;
    +
    +
    unsigned char key[16] = {
    +
    0xc6, 0x5d, 0xc7, 0x61, 0xa1, 0x34, 0x17, 0xa1,
    +
    0x17, 0x08, 0x9c, 0x1b, 0xb0, 0x0d, 0x0f, 0x19
    +
    };
    +
    +
    if (heim_ntlm_nt_key(pw, &buf) != 0)
    +
    errx(1, "heim_ntlmv_nt_key(jp)");
    +
    +
    if (buf.length != 16 || memcmp(buf.data, key, 16) != 0)
    +
    errx(1, "compare failed");
    +
    + +
    +
    return 0;
    +
    }
    +
    +
    static int
    +
    test_jp(void)
    +
    {
    +
    char buf2[220] =
    +
    "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x06\x00\x06\x00"
    +
    "\x38\x00\x00\x00\x05\x02\x89\x62\x62\x94\xb1\xf3\x56\x80\xb0\xf9"
    +
    "\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x3e\x00\x00\x00"
    +
    "\x06\x01\xb0\x1d\x00\x00\x00\x0f\x43\x00\x4f\x00\x53\x00\x02\x00"
    +
    "\x06\x00\x43\x00\x4f\x00\x53\x00\x01\x00\x12\x00\x43\x00\x4f\x00"
    +
    "\x53\x00\x57\x00\x49\x00\x4e\x00\x37\x00\x4a\x00\x50\x00\x04\x00"
    +
    "\x1a\x00\x63\x00\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00"
    +
    "\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x03\x00\x2e\x00"
    +
    "\x63\x00\x6f\x00\x73\x00\x77\x00\x69\x00\x6e\x00\x37\x00\x6a\x00"
    +
    "\x70\x00\x2e\x00\x63\x00\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00"
    +
    "\x70\x00\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x05\x00"
    +
    "\x1a\x00\x63\x00\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00"
    +
    "\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x07\x00\x08\x00"
    +
    "\x94\x51\xf0\xbd\xdc\x61\xcb\x01\x00\x00\x00\x00";
    +
    +
    char buf3[362] =
    +
    "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00\x00\x18\x00\x18\x00"
    +
    "\x74\x00\x00\x00\xce\x00\xce\x00\x8c\x00\x00\x00\x1a\x00\x1a\x00"
    +
    "\x40\x00\x00\x00\x04\x00\x04\x00\x5a\x00\x00\x00\x16\x00\x16\x00"
    +
    "\x5e\x00\x00\x00\x10\x00\x10\x00\x5a\x01\x00\x00\x05\x02\x89\x62"
    +
    "\x31\x00\x37\x00\x2e\x00\x32\x00\x30\x00\x31\x00\x2e\x00\x35\x00"
    +
    "\x37\x00\x2e\x00\x31\x00\x32\x00\x31\x00\x71\x5c\x30\x75\x77\x00"
    +
    "\x6f\x00\x72\x00\x6b\x00\x73\x00\x74\x00\x61\x00\x74\x00\x69\x00"
    +
    "\x6f\x00\x6e\x00\xab\xad\xeb\x72\x01\xd4\x5f\xdf\x59\x07\x5f\xa9"
    +
    "\xfd\x54\x98\x2d\xfa\x17\xbb\xf1\x3c\x8f\xf5\x20\xe6\x8f\xd7\x0a"
    +
    "\xc9\x19\x3e\x94\x61\x31\xdb\x0f\x55\xe8\xe2\x53\x01\x01\x00\x00"
    +
    "\x00\x00\x00\x00\x00\x06\x3e\x30\xe4\x61\xcb\x01\x71\x98\x10\x6b"
    +
    "\x4c\x82\xec\xb3\x00\x00\x00\x00\x02\x00\x06\x00\x43\x00\x4f\x00"
    +
    "\x53\x00\x01\x00\x12\x00\x43\x00\x4f\x00\x53\x00\x57\x00\x49\x00"
    +
    "\x4e\x00\x37\x00\x4a\x00\x50\x00\x04\x00\x1a\x00\x63\x00\x6f\x00"
    +
    "\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00\x6c\x00\x65\x00\x2e\x00"
    +
    "\x63\x00\x6f\x00\x6d\x00\x03\x00\x2e\x00\x63\x00\x6f\x00\x73\x00"
    +
    "\x77\x00\x69\x00\x6e\x00\x37\x00\x6a\x00\x70\x00\x2e\x00\x63\x00"
    +
    "\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00\x6c\x00\x65\x00"
    +
    "\x2e\x00\x63\x00\x6f\x00\x6d\x00\x05\x00\x1a\x00\x63\x00\x6f\x00"
    +
    "\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00\x6c\x00\x65\x00\x2e\x00"
    +
    "\x63\x00\x6f\x00\x6d\x00\x07\x00\x08\x00\xab\xec\xcc\x30\xe4\x61"
    +
    "\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x2e\xba\x3f\xd1\xb1"
    +
    "\xa7\x70\x00\x9d\x55\xa0\x59\x74\x2b\x78";
    +
    +
    +
    struct ntlm_type2 type2;
    +
    struct ntlm_type3 type3;
    +
    struct ntlm_buf data;
    +
    int ret;
    +
    +
    data.length = sizeof(buf2);
    +
    data.data = buf2;
    +
    +
    memset(&type2, 0, sizeof(type2));
    +
    +
    ret = heim_ntlm_decode_type2(&data, &type2);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_decode_type2(jp): %d", ret);
    +
    +
    data.data = NULL;
    +
    data.length = 0;
    +
    +
    ret = heim_ntlm_encode_type2(&type2, &data);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_encode_type2(jp): %d", ret);
    +
    + + +
    +
    data.length = sizeof(buf3);
    +
    data.data = buf3;
    +
    +
    memset(&type3, 0, sizeof(type3));
    +
    +
    ret = heim_ntlm_decode_type3(&data, 1, &type3);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_decode_type2(jp): %d", ret);
    +
    +
    data.data = NULL;
    +
    data.length = 0;
    +
    +
    ret = heim_ntlm_encode_type3(&type3, &data, NULL);
    +
    if (ret)
    +
    errx(1, "heim_ntlm_decode_type2(jp): %d", ret);
    +
    + + +
    +
    return 0;
    +
    }
    +
    +
    +
    static int verbose_flag = 0;
    +
    static int version_flag = 0;
    +
    static int help_flag = 0;
    +
    +
    static struct getargs args[] = {
    +
    {"verbose", 0, arg_flag, &verbose_flag, "verbose printing", NULL },
    +
    {"version", 0, arg_flag, &version_flag, "print version", NULL },
    +
    {"help", 0, arg_flag, &help_flag, NULL, NULL }
    +
    };
    +
    +
    static void
    +
    usage (int ret)
    +
    {
    +
    arg_printusage (args, sizeof(args)/sizeof(*args),
    +
    NULL, "");
    +
    exit (ret);
    +
    }
    +
    +
    int
    +
    main(int argc, char **argv)
    +
    {
    +
    int ret = 0, optidx = 0;
    +
    +
    setprogname(argv[0]);
    +
    +
    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
    +
    usage(1);
    +
    +
    if (help_flag)
    +
    usage (0);
    +
    +
    if(version_flag){
    +
    print_version(NULL);
    +
    exit(0);
    +
    }
    +
    +
    if (verbose_flag)
    +
    printf("test_parse\n");
    +
    ret |= test_parse();
    +
    +
    if (verbose_flag)
    +
    printf("test_keys\n");
    +
    ret |= test_keys();
    +
    +
    if (verbose_flag)
    +
    printf("test_ntlm2_session_resp\n");
    +
    ret |= test_ntlm2_session_resp();
    +
    +
    if (verbose_flag)
    +
    printf("test_targetinfo\n");
    +
    ret |= test_targetinfo();
    +
    +
    if (verbose_flag)
    +
    printf("test_ntlmv2\n");
    +
    ret |= test_ntlmv2();
    +
    +
    if (verbose_flag)
    +
    printf("test_string2key\n");
    +
    ret |= test_string2key();
    +
    +
    if (verbose_flag)
    +
    printf("test_jp\n");
    +
    ret |= test_jp();
    +
    +
    return ret;
    +
    }
    +
    int heim_ntlm_encode_type1(const struct ntlm_type1 *type1, struct ntlm_buf *data)
    Definition: ntlm.c:732
    +
    int heim_ntlm_nt_key(const char *password, struct ntlm_buf *key)
    Definition: ntlm.c:1211
    +
    int heim_ntlm_encode_type2(const struct ntlm_type2 *type2, struct ntlm_buf *data)
    Definition: ntlm.c:893
    +
    int heim_ntlm_encode_targetinfo(const struct ntlm_targetinfo *ti, int ucs2, struct ntlm_buf *data)
    Definition: ntlm.c:482
    +
    int heim_ntlm_verify_ntlm2(const void *key, size_t len, const char *username, const char *target, time_t now, const unsigned char serverchallenge[8], const struct ntlm_buf *answer, struct ntlm_buf *infotarget, unsigned char ntlmv2[16])
    Definition: ntlm.c:1850
    +
    void heim_ntlm_free_buf(struct ntlm_buf *p)
    Definition: ntlm.c:197
    +
    void heim_ntlm_free_targetinfo(struct ntlm_targetinfo *ti)
    Definition: ntlm.c:444
    +
    void heim_ntlm_free_type1(struct ntlm_type1 *data)
    Definition: ntlm.c:656
    +
    void heim_ntlm_free_type2(struct ntlm_type2 *data)
    Definition: ntlm.c:819
    +
    int heim_ntlm_calculate_ntlm2(const void *key, size_t len, const char *username, const char *target, const unsigned char serverchallenge[8], const struct ntlm_buf *infotarget, unsigned char ntlmv2[16], struct ntlm_buf *answer)
    Definition: ntlm.c:1643
    +
    void heim_ntlm_free_type3(struct ntlm_type3 *data)
    Definition: ntlm.c:963
    +
    int heim_ntlm_encode_type3(const struct ntlm_type3 *type3, struct ntlm_buf *data, size_t *mic_offset)
    Definition: ntlm.c:1067
    +
    int heim_ntlm_calculate_ntlm1(void *key, size_t len, unsigned char challenge[8], struct ntlm_buf *answer)
    Definition: ntlm.c:1259
    +
    int heim_ntlm_decode_targetinfo(const struct ntlm_buf *data, int ucs2, struct ntlm_targetinfo *ti)
    Definition: ntlm.c:557
    +
    Definition: heimntlm.h:43
    +
    void * data
    Definition: heimntlm.h:45
    +
    size_t length
    Definition: heimntlm.h:44
    +
    Definition: heimntlm.h:120
    +
    Definition: heimntlm.h:133
    +
    Definition: heimntlm.h:148
    +
    +
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal ntlm library by doxygen 1.9.1
    + + diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/challenge.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/challenge.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/challenge.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type2.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/context.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/context.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/context.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type2.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/domain.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/domain.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/domain.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type1.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/flags.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/flags.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/flags.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type1.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/hostname.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/hostname.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/hostname.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type1.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/lm.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/lm.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/lm.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type3.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type3.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_buf.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_buf.3 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_buf.3 +++ b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_buf.3 @@ -1,13 +1,13 @@ -.TH "ntlm_buf" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalntlmlibrary" \" -*- nroff -*- +.TH "ntlm_buf" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal ntlm library" \" -*- nroff -*- .ad l .nh .SH NAME -ntlm_buf \- +ntlm_buf .SH SYNOPSIS .br .PP -\fC#include \fP .PP +\fC#include \fP .SS "Data Fields" .in +1c @@ -20,29 +20,26 @@ .in -1c .SH "Detailed Description" .PP -Buffer for storing data in the NTLM library. When filled in by the library it should be freed with \fBheim_ntlm_free_buf()\fP. +Buffer for storing data in the NTLM library\&. When filled in by the library it should be freed with \fBheim_ntlm_free_buf()\fP\&. .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -.PP -\fBtest_ntlm.c\fP. +\fBtest_ntlm\&.c\fP\&. .SH "Field Documentation" .PP -.SS "size_t \fBntlm_buf::length\fP" -.PP -length buffer data +.SS "void* ntlm_buf::data" +pointer to the data itself .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBtest_ntlm.c\fP. -.SS "void* \fBntlm_buf::data\fP" -.PP -pointer to the data itself +\fBtest_ntlm\&.c\fP\&. +.SS "size_t ntlm_buf::length" +length buffer data .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBtest_ntlm.c\fP. +\fBtest_ntlm\&.c\fP\&. .SH "Author" .PP -Generated automatically by Doxygen for Heimdalntlmlibrary from the source code. +Generated automatically by Doxygen for Heimdal ntlm library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_core.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_core.3 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_core.3 +++ b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_core.3 @@ -1,8 +1,11 @@ -.TH "Heimdal NTLM library" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalntlmlibrary" \" -*- nroff -*- +.TH "ntlm_core" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal ntlm library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal NTLM library \- +ntlm_core \- Heimdal NTLM library +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -34,7 +37,7 @@ .RI "void \fBheim_ntlm_free_type3\fP (struct \fBntlm_type3\fP *data)" .br .ti -1c -.RI "int \fBheim_ntlm_encode_type3\fP (const struct \fBntlm_type3\fP *type3, struct \fBntlm_buf\fP *data)" +.RI "int \fBheim_ntlm_encode_type3\fP (const struct \fBntlm_type3\fP *type3, struct \fBntlm_buf\fP *data, size_t *mic_offset)" .br .ti -1c .RI "int \fBheim_ntlm_nt_key\fP (const char *password, struct \fBntlm_buf\fP *key)" @@ -52,7 +55,7 @@ .RI "int \fBheim_ntlm_keyex_unwrap\fP (struct \fBntlm_buf\fP *baseKey, struct \fBntlm_buf\fP *encryptedSession, struct \fBntlm_buf\fP *session)" .br .ti -1c -.RI "int \fBheim_ntlm_ntlmv2_key\fP (const void *key, size_t len, const char *username, const char *target, unsigned char ntlmv2[16])" +.RI "int \fBheim_ntlm_ntlmv2_key\fP (const void *key, size_t len, const char *username, const char *target, int upper_case_target, unsigned char ntlmv2[16])" .br .ti -1c .RI "int \fBheim_ntlm_calculate_lm2\fP (const void *key, size_t len, const char *username, const char *target, const unsigned char serverchallenge[8], unsigned char ntlmv2[16], struct \fBntlm_buf\fP *answer)" @@ -66,35 +69,33 @@ .in -1c .SH "Detailed Description" .PP -The NTLM core functions implement the string2key generation function, message encode and decode function, and the hash function functions. +The NTLM core functions implement the string2key generation function, message encode and decode function, and the hash function functions\&. .SH "Function Documentation" .PP .SS "int heim_ntlm_build_ntlm1_master (void * key, size_t len, struct \fBntlm_buf\fP * session, struct \fBntlm_buf\fP * master)" +Generates an NTLMv1 session random with assosited session master key\&. .PP -Generates an NTLMv1 session random with assosited session master key. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkey\fP the ntlm v1 key .br \fIlen\fP length of key .br -\fIsession\fP generated session nonce, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIsession\fP generated session nonce, should be freed with \fBheim_ntlm_free_buf()\fP\&. .br -\fImaster\fP calculated session master key, should be freed with \fBheim_ntlm_free_buf()\fP. +\fImaster\fP calculated session master key, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP .SS "int heim_ntlm_build_ntlm2_master (void * key, size_t len, struct \fBntlm_buf\fP * blob, struct \fBntlm_buf\fP * session, struct \fBntlm_buf\fP * master)" +Generates an NTLMv2 session random with associated session master key\&. .PP -Generates an NTLMv2 session random with associated session master key. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkey\fP the NTLMv2 key .br @@ -102,49 +103,47 @@ .br \fIblob\fP the NTLMv2 'blob' .br -\fIsession\fP generated session nonce, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIsession\fP generated session nonce, should be freed with \fBheim_ntlm_free_buf()\fP\&. .br -\fImaster\fP calculated session master key, should be freed with \fBheim_ntlm_free_buf()\fP. +\fImaster\fP calculated session master key, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP .SS "int heim_ntlm_calculate_lm2 (const void * key, size_t len, const char * username, const char * target, const unsigned char serverchallenge[8], unsigned char ntlmv2[16], struct \fBntlm_buf\fP * answer)" -.PP Calculate LMv2 response .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkey\fP the ntlm key .br \fIlen\fP length of key .br -\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8. +\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8\&. .br -\fItarget\fP the name of the target, assumed to be in UTF8. +\fItarget\fP the name of the target, assumed to be in UTF8\&. .br -\fIserverchallenge\fP challenge as sent by the server in the type2 message. +\fIserverchallenge\fP challenge as sent by the server in the type2 message\&. .br \fIntlmv2\fP calculated session key .br -\fIanswer\fP ntlm response answer, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIanswer\fP ntlm response answer, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP .SS "int heim_ntlm_calculate_ntlm1 (void * key, size_t len, unsigned char challenge[8], struct \fBntlm_buf\fP * answer)" -.PP Calculate NTLMv1 response hash .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkey\fP the ntlm v1 key .br @@ -152,270 +151,322 @@ .br \fIchallenge\fP sent by the server .br -\fIanswer\fP calculated answer, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIanswer\fP calculated answer, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "int heim_ntlm_calculate_ntlm2 (const void * key, size_t len, const char * username, const char * target, const unsigned char serverchallenge[8], const struct \fBntlm_buf\fP * infotarget, unsigned char ntlmv2[16], struct \fBntlm_buf\fP * answer)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_calculate_ntlm2 (const void * key, size_t len, const char * username, const char * target, const unsigned char serverchallenge[8], const struct \fBntlm_buf\fP * infotarget, unsigned char ntlmv2[16], struct \fBntlm_buf\fP * answer)" Calculate NTLMv2 response .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkey\fP the ntlm key .br \fIlen\fP length of key .br -\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8. +\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8\&. .br -\fItarget\fP the name of the target, assumed to be in UTF8. +\fItarget\fP the name of the target, assumed to be in UTF8\&. .br -\fIserverchallenge\fP challenge as sent by the server in the type2 message. +\fIserverchallenge\fP challenge as sent by the server in the type2 message\&. .br -\fIinfotarget\fP infotarget as sent by the server in the type2 message. +\fIinfotarget\fP infotarget as sent by the server in the type2 message\&. .br \fIntlmv2\fP calculated session key .br -\fIanswer\fP ntlm response answer, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIanswer\fP ntlm response answer, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "int heim_ntlm_decode_targetinfo (const struct \fBntlm_buf\fP * data, int ucs2, struct ntlm_targetinfo * ti)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_decode_targetinfo (const struct \fBntlm_buf\fP * data, int ucs2, struct ntlm_targetinfo * ti)" Decodes an NTLM targetinfo message .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata\fP input data buffer with the encode NTLM targetinfo message .br -\fIucs2\fP if the strings should be encoded with ucs2 (selected by flag in message). +\fIucs2\fP if the strings should be encoded with ucs2 (selected by flag in message)\&. .br -\fIti\fP the decoded target info, should be freed with \fBheim_ntlm_free_targetinfo()\fP. +\fIti\fP the decoded target info, should be freed with \fBheim_ntlm_free_targetinfo()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "int heim_ntlm_encode_targetinfo (const struct ntlm_targetinfo * ti, int ucs2, struct \fBntlm_buf\fP * data)" .PP -Encodes a ntlm_targetinfo message. +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_encode_targetinfo (const struct ntlm_targetinfo * ti, int ucs2, struct \fBntlm_buf\fP * data)" +Encodes a ntlm_targetinfo message\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIti\fP the ntlm_targetinfo message to encode. +\fIti\fP the ntlm_targetinfo message to encode\&. .br \fIucs2\fP ignored .br -\fIdata\fP is the return buffer with the encoded message, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIdata\fP is the return buffer with the encoded message, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "int heim_ntlm_encode_type1 (const struct \fBntlm_type1\fP * type1, struct \fBntlm_buf\fP * data)" .PP -Encodes an \fBntlm_type1\fP message. +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_encode_type1 (const struct \fBntlm_type1\fP * type1, struct \fBntlm_buf\fP * data)" +Encodes an \fBntlm_type1\fP message\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fItype1\fP the \fBntlm_type1\fP message to encode. +\fItype1\fP the \fBntlm_type1\fP message to encode\&. .br -\fIdata\fP is the return buffer with the encoded message, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIdata\fP is the return buffer with the encoded message, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "int heim_ntlm_encode_type2 (const struct \fBntlm_type2\fP * type2, struct \fBntlm_buf\fP * data)" .PP -Encodes an \fBntlm_type2\fP message. +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_encode_type2 (const struct \fBntlm_type2\fP * type2, struct \fBntlm_buf\fP * data)" +Encodes an \fBntlm_type2\fP message\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fItype2\fP the \fBntlm_type2\fP message to encode. +\fItype2\fP the \fBntlm_type2\fP message to encode\&. .br -\fIdata\fP is the return buffer with the encoded message, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIdata\fP is the return buffer with the encoded message, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "int heim_ntlm_encode_type3 (const struct \fBntlm_type3\fP * type3, struct \fBntlm_buf\fP * data)" .PP -Encodes an \fBntlm_type3\fP message. +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_encode_type3 (const struct \fBntlm_type3\fP * type3, struct \fBntlm_buf\fP * data, size_t * mic_offset)" +Encodes an \fBntlm_type3\fP message\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fItype3\fP the \fBntlm_type3\fP message to encode. +\fItype3\fP the \fBntlm_type3\fP message to encode\&. +.br +\fIdata\fP is the return buffer with the encoded message, should be .br -\fIdata\fP is the return buffer with the encoded message, should be freed with \fBheim_ntlm_free_buf()\fP. +\fImic_offset\fP offset of message integrity code freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "void heim_ntlm_free_buf (struct \fBntlm_buf\fP * p)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "void heim_ntlm_free_buf (struct \fBntlm_buf\fP * p)" heim_ntlm_free_buf frees the ntlm buffer .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIp\fP buffer to be freed .RE .PP -.SS "void heim_ntlm_free_targetinfo (struct ntlm_targetinfo * ti)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "void heim_ntlm_free_targetinfo (struct ntlm_targetinfo * ti)" Frees the ntlm_targetinfo message .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIti\fP targetinfo to be freed .RE .PP -.SS "void heim_ntlm_free_type1 (struct \fBntlm_type1\fP * data)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "void heim_ntlm_free_type1 (struct \fBntlm_type1\fP * data)" Frees the \fBntlm_type1\fP message .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata\fP message to be freed .RE .PP -.SS "void heim_ntlm_free_type2 (struct \fBntlm_type2\fP * data)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "void heim_ntlm_free_type2 (struct \fBntlm_type2\fP * data)" Frees the \fBntlm_type2\fP message .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata\fP message to be freed .RE .PP -.SS "void heim_ntlm_free_type3 (struct \fBntlm_type3\fP * data)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "void heim_ntlm_free_type3 (struct \fBntlm_type3\fP * data)" Frees the \fBntlm_type3\fP message .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIdata\fP message to be freed .RE .PP -.SS "int heim_ntlm_keyex_unwrap (struct \fBntlm_buf\fP * baseKey, struct \fBntlm_buf\fP * encryptedSession, struct \fBntlm_buf\fP * session)" .PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_keyex_unwrap (struct \fBntlm_buf\fP * baseKey, struct \fBntlm_buf\fP * encryptedSession, struct \fBntlm_buf\fP * session)" Given a key and encrypted session, unwrap the session key .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIbaseKey\fP the sessionBaseKey .br -\fIencryptedSession\fP encrypted session, type3.session field. +\fIencryptedSession\fP encrypted session, type3\&.session field\&. .br -\fIsession\fP generated session nonce, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIsession\fP generated session nonce, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP .SS "int heim_ntlm_nt_key (const char * password, struct \fBntlm_buf\fP * key)" +Calculate the NTLM key, the password is assumed to be in UTF8\&. .PP -Calculate the NTLM key, the password is assumed to be in UTF8. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIpassword\fP password to calcute the key for. +\fIpassword\fP password to calcute the key for\&. .br -\fIkey\fP calcuted key, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIkey\fP calcuted key, should be freed with \fBheim_ntlm_free_buf()\fP\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP -.SS "int heim_ntlm_ntlmv2_key (const void * key, size_t len, const char * username, const char * target, unsigned char ntlmv2[16])" .PP -Generates an NTLMv2 session key. +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SS "int heim_ntlm_ntlmv2_key (const void * key, size_t len, const char * username, const char * target, int upper_case_target, unsigned char ntlmv2[16])" +Generates an NTLMv2 session key\&. .PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkey\fP the ntlm key .br \fIlen\fP length of key .br -\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8. +\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8\&. +.br +\fItarget\fP the name of the target, assumed to be in UTF8\&. .br -\fItarget\fP the name of the target, assumed to be in UTF8. +\fIupper_case_target\fP upper case the target, should not be used only for legacy systems .br \fIntlmv2\fP the ntlmv2 session key .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -0 on success, or an error code on failure. +0 on success, or an error code on failure\&. .RE .PP .SS "int heim_ntlm_verify_ntlm2 (const void * key, size_t len, const char * username, const char * target, time_t now, const unsigned char serverchallenge[8], const struct \fBntlm_buf\fP * answer, struct \fBntlm_buf\fP * infotarget, unsigned char ntlmv2[16])" +Verify NTLMv2 response\&. .PP -Verify NTLMv2 response. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIkey\fP the ntlm key .br \fIlen\fP length of key .br -\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8. +\fIusername\fP name of the user, as sent in the message, assumed to be in UTF8\&. .br -\fItarget\fP the name of the target, assumed to be in UTF8. +\fItarget\fP the name of the target, assumed to be in UTF8\&. .br \fInow\fP the time now (0 if the library should pick it up itself) .br -\fIserverchallenge\fP challenge as sent by the server in the type2 message. +\fIserverchallenge\fP challenge as sent by the server in the type2 message\&. .br -\fIanswer\fP ntlm response answer, should be freed with \fBheim_ntlm_free_buf()\fP. +\fIanswer\fP ntlm response answer, should be freed with \fBheim_ntlm_free_buf()\fP\&. .br -\fIinfotarget\fP infotarget as sent by the server in the type2 message. +\fIinfotarget\fP infotarget as sent by the server in the type2 message\&. .br \fIntlmv2\fP calculated session key .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -In case of success 0 is return, an errors, a errno in what went wrong. +In case of success 0 is return, an errors, a errno in what went wrong\&. .RE .PP - +First check with the domain as the client passed it to the function\&. +.PP +Second check with domain uppercased\&. +.PP +Third check with empty domain\&. +.PP +\fBExamples\fP +.in +1c +\fBtest_ntlm\&.c\fP\&. +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal ntlm library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type1.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type1.3 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type1.3 +++ b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type1.3 @@ -1,68 +1,21 @@ -.TH "ntlm_type1" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalntlmlibrary" \" -*- nroff -*- +.TH "ntlm_type1" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal ntlm library" \" -*- nroff -*- .ad l .nh .SH NAME -ntlm_type1 \- +ntlm_type1 .SH SYNOPSIS .br .PP -\fC#include \fP .PP -.SS "Data Fields" - -.in +1c -.ti -1c -.RI "uint32_t \fBflags\fP" -.br -.ti -1c -.RI "char * \fBdomain\fP" -.br -.ti -1c -.RI "char * \fBhostname\fP" -.br -.ti -1c -.RI "uint32_t \fBos\fP [2]" -.br -.in -1c +\fC#include \fP .SH "Detailed Description" .PP -Struct for the NTLM type1 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with \fBheim_ntlm_free_type1()\fP. -.PP -\fBExamples: \fP -.in +1c -.PP -\fBtest_ntlm.c\fP. -.SH "Field Documentation" -.PP -.SS "uint32_t \fBntlm_type1::flags\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "char* \fBntlm_type1::domain\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "char* \fBntlm_type1::hostname\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "uint32_t \fBntlm_type1::os\fP[2]" -.PP - +Struct for the NTLM type1 message info, the strings is assumed to be in UTF8\&. When filled in by the library it should be freed with \fBheim_ntlm_free_type1()\fP\&. .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBtest_ntlm.c\fP. +\fBtest_ntlm\&.c\fP\&. .SH "Author" .PP -Generated automatically by Doxygen for Heimdalntlmlibrary from the source code. +Generated automatically by Doxygen for Heimdal ntlm library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type2.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type2.3 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type2.3 +++ b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type2.3 @@ -1,80 +1,21 @@ -.TH "ntlm_type2" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalntlmlibrary" \" -*- nroff -*- +.TH "ntlm_type2" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal ntlm library" \" -*- nroff -*- .ad l .nh .SH NAME -ntlm_type2 \- +ntlm_type2 .SH SYNOPSIS .br .PP -\fC#include \fP .PP -.SS "Data Fields" - -.in +1c -.ti -1c -.RI "uint32_t \fBflags\fP" -.br -.ti -1c -.RI "char * \fBtargetname\fP" -.br -.ti -1c -.RI "struct \fBntlm_buf\fP \fBtargetinfo\fP" -.br -.ti -1c -.RI "unsigned char \fBchallenge\fP [8]" -.br -.ti -1c -.RI "uint32_t \fBcontext\fP [2]" -.br -.ti -1c -.RI "uint32_t \fBos\fP [2]" -.br -.in -1c +\fC#include \fP .SH "Detailed Description" .PP -Struct for the NTLM type2 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with \fBheim_ntlm_free_type2()\fP. -.PP -\fBExamples: \fP -.in +1c -.PP -\fBtest_ntlm.c\fP. -.SH "Field Documentation" -.PP -.SS "uint32_t \fBntlm_type2::flags\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "char* \fBntlm_type2::targetname\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "struct \fBntlm_buf\fP \fBntlm_type2::targetinfo\fP\fC [read]\fP" -.PP - +Struct for the NTLM type2 message info, the strings is assumed to be in UTF8\&. When filled in by the library it should be freed with \fBheim_ntlm_free_type2()\fP\&. .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBtest_ntlm.c\fP. -.SS "unsigned char \fBntlm_type2::challenge\fP[8]" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "uint32_t \fBntlm_type2::context\fP[2]" -.PP - -.SS "uint32_t \fBntlm_type2::os\fP[2]" -.PP - +\fBtest_ntlm\&.c\fP\&. .SH "Author" .PP -Generated automatically by Doxygen for Heimdalntlmlibrary from the source code. +Generated automatically by Doxygen for Heimdal ntlm library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type3.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type3.3 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type3.3 +++ b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ntlm_type3.3 @@ -1,96 +1,21 @@ -.TH "ntlm_type3" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalntlmlibrary" \" -*- nroff -*- +.TH "ntlm_type3" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal ntlm library" \" -*- nroff -*- .ad l .nh .SH NAME -ntlm_type3 \- +ntlm_type3 .SH SYNOPSIS .br .PP -\fC#include \fP .PP -.SS "Data Fields" - -.in +1c -.ti -1c -.RI "uint32_t \fBflags\fP" -.br -.ti -1c -.RI "char * \fBusername\fP" -.br -.ti -1c -.RI "char * \fBtargetname\fP" -.br -.ti -1c -.RI "struct \fBntlm_buf\fP \fBlm\fP" -.br -.ti -1c -.RI "struct \fBntlm_buf\fP \fBntlm\fP" -.br -.ti -1c -.RI "struct \fBntlm_buf\fP \fBsessionkey\fP" -.br -.ti -1c -.RI "char * \fBws\fP" -.br -.ti -1c -.RI "uint32_t \fBos\fP [2]" -.br -.in -1c +\fC#include \fP .SH "Detailed Description" .PP -Struct for the NTLM type3 message info, the strings is assumed to be in UTF8. When filled in by the library it should be freed with \fBheim_ntlm_free_type3()\fP. -.PP -\fBExamples: \fP -.in +1c -.PP -\fBtest_ntlm.c\fP. -.SH "Field Documentation" -.PP -.SS "uint32_t \fBntlm_type3::flags\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "char* \fBntlm_type3::username\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "char* \fBntlm_type3::targetname\fP" -.PP - +Struct for the NTLM type3 message info, the strings is assumed to be in UTF8\&. When filled in by the library it should be freed with \fBheim_ntlm_free_type3()\fP\&. .PP -\fBExamples: \fP +\fBExamples\fP .in +1c -\fBtest_ntlm.c\fP. -.SS "struct \fBntlm_buf\fP \fBntlm_type3::lm\fP\fC [read]\fP" -.PP - -.SS "struct \fBntlm_buf\fP \fBntlm_type3::ntlm\fP\fC [read]\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "struct \fBntlm_buf\fP \fBntlm_type3::sessionkey\fP\fC [read]\fP" -.PP - -.SS "char* \fBntlm_type3::ws\fP" -.PP - -.PP -\fBExamples: \fP -.in +1c -\fBtest_ntlm.c\fP. -.SS "uint32_t \fBntlm_type3::os\fP[2]" -.PP - +\fBtest_ntlm\&.c\fP\&. .SH "Author" .PP -Generated automatically by Doxygen for Heimdalntlmlibrary from the source code. +Generated automatically by Doxygen for Heimdal ntlm library from the source code\&. diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/os.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/os.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/os.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type1.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/sessionkey.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/sessionkey.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/sessionkey.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type3.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/targetinfo.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/targetinfo.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/targetinfo.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type2.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/targetname.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/targetname.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/targetname.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type2.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/username.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/username.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/username.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type3.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ws.3 b/crypto/heimdal/doc/doxyout/ntlm/man/man3/ws.3 deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/ntlm/man/man3/ws.3 +++ /dev/null @@ -1 +0,0 @@ -.so man3/ntlm_type3.3 diff --git a/crypto/heimdal/doc/doxyout/ntlm/manpages b/crypto/heimdal/doc/doxyout/ntlm/manpages --- a/crypto/heimdal/doc/doxyout/ntlm/manpages +++ b/crypto/heimdal/doc/doxyout/ntlm/manpages @@ -1,8 +1,4 @@ -ntlm/man/man3/challenge.3 -ntlm/man/man3/context.3 -ntlm/man/man3/data.3 -ntlm/man/man3/domain.3 -ntlm/man/man3/flags.3 +ntlm/man/man3/ntlm_core.3 ntlm/man/man3/heim_ntlm_build_ntlm1_master.3 ntlm/man/man3/heim_ntlm_build_ntlm2_master.3 ntlm/man/man3/heim_ntlm_calculate_lm2.3 @@ -22,18 +18,9 @@ ntlm/man/man3/heim_ntlm_nt_key.3 ntlm/man/man3/heim_ntlm_ntlmv2_key.3 ntlm/man/man3/heim_ntlm_verify_ntlm2.3 -ntlm/man/man3/hostname.3 -ntlm/man/man3/length.3 -ntlm/man/man3/lm.3 -ntlm/man/man3/ntlm.3 ntlm/man/man3/ntlm_buf.3 -ntlm/man/man3/ntlm_core.3 +ntlm/man/man3/data.3 +ntlm/man/man3/length.3 ntlm/man/man3/ntlm_type1.3 ntlm/man/man3/ntlm_type2.3 ntlm/man/man3/ntlm_type3.3 -ntlm/man/man3/os.3 -ntlm/man/man3/sessionkey.3 -ntlm/man/man3/targetinfo.3 -ntlm/man/man3/targetname.3 -ntlm/man/man3/username.3 -ntlm/man/man3/ws.3 diff --git a/crypto/heimdal/doc/doxyout/wind/html/bc_s.png b/crypto/heimdal/doc/doxyout/wind/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zc$@*G0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 Hc$@_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 Hc$@7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 Hc$@ h3 { - margin-top: 0; +form.search { + margin-bottom: 0px; + margin-top: 0px; } -.directory p { - margin: 0px; - white-space: nowrap; + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; } -.directory div { - display: none; - margin: 0px; +*/ + +td.tiny { + font-size: 75%; } -.directory img { - vertical-align: -30%; + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; } -/* these are for tree view when not used as main index */ -.directory-alt { - font-size: 100%; - font-weight: bold; + +th.dirtab { + background: #EBEFF6; + font-weight: bold; } -.directory-alt h3 { - margin: 0px; - margin-top: 1em; - font-size: 11pt; + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; } -.directory-alt > h3 { - margin-top: 0; + +hr.footer { + height: 1px; } -.directory-alt p { - margin: 0px; - white-space: nowrap; + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; } -.directory-alt div { - display: none; - margin: 0px; + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; } -.directory-alt img { - vertical-align: -30%; + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; } diff --git a/crypto/heimdal/doc/doxyout/wind/html/doxygen.png b/crypto/heimdal/doc/doxyout/wind/html/doxygen.png deleted file mode 100644 index f0a274bbaffdd67f6d784c894d9cf28729db0e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@F7(Vx-ms?uoS`b@hdRtpo6o^%HU>M$hfGrBvQnk$LE?p^P!kn&ikhyq! zX~V@&tWI!7t@V?oTL96Bi%aRiwbe1)9DWQI#?)=HxS7QSw`JY+|Kdr`d2-(ONuKA& z`@F5@iWMozvyuS-DJG-A!lRSFxj4eVTQ(O*ctC5l23a*NCT zUiG#bpmlC>)R3lz>e?DhO|`RWYpkY-Cv7yZvX=1p<>y~3vO1$fzhC-nV)3CLCmz1P@7CUvliZQpfu5;zp}ugqdu(jz*|T4tKK*%e@vB3o8?nX)G7YEO} zIVfR(?xMlF^f}`rl|s?m#rLFbqVx`xSj&_q(VMc@fTHZh}z-v68l% zry~x%T5iHj^14oBx^J>s?RnyD8<0POU=9lDQOGMB@Qv5Y7jCfG%j{AmV#TMGW1QMw zT#YF!z0x)@dY88&9zIW5@|0`{T~(%oEz)4CmbgKz&?JXM8PbTlGzy_abLK5`U0uI5 zjHCu-UX^?f&14ZFEI#m4m6HGb+pWe9G)EL9oc;V4^!AHAWY)_-0Wh%dA!_pW~AM2 zHZ{sky{TsvhxSG}|Kjt>YpOaDZqKGo-`}a-o=bjEydHSUR%_RxG>Ry*<{c88MP&ug zrltyHjJ>p!JX%>=hAAW0nBi-?hEq>Uc@@s%X-yA@MfsACeNgoN1A!3a_MdBcK263R zpQruAi4!wj!sVHNOf2y}FSc#gM1Zq3XU`YH3(W_aJO(H}DNQ%LguU8tiV}RK z`!2|z88ZfI8$CN%7oV-phP3SL?84r>l*~_CMZ$)pGy< diff --git a/crypto/heimdal/doc/doxyout/wind/html/doxygen.svg b/crypto/heimdal/doc/doxyout/wind/html/doxygen.svg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/wind/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/doc/doxyout/wind/html/dynsections.js b/crypto/heimdal/doc/doxyout/wind/html/dynsections.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/wind/html/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 Hc$@ -Heimdalwindlibrary: Graph Legend +Graph Legend @@ -8,67 +8,71 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Graph Legend
    +
    -

    Graph Legend

    This page explains how to interpret the graphs that are generated by doxygen.

    -Consider the following example:

    /*! Invisible class because of truncation */
    -class Invisible { };
    -
    -/*! Truncated class, inheritance relation is hidden */
    -class Truncated : public Invisible { };
    -
    -/* Class not documented with doxygen comments */
    -class Undocumented { };
    -
    -/*! Class that is inherited using public inheritance */
    -class PublicBase : public Truncated { };
    -
    -/*! A template class */
    -template<class T> class Templ { };
    -
    -/*! Class that is inherited using protected inheritance */
    -class ProtectedBase { };
    -
    -/*! Class that is inherited using private inheritance */
    -class PrivateBase { };
    -
    -/*! Class that is used by the Inherited class */
    -class Used { };
    -
    -/*! Super class that inherits a number of other classes */
    -class Inherited : public PublicBase,
    -                  protected ProtectedBase,
    -                  private PrivateBase,
    -                  public Undocumented,
    -                  public Templ<int>
    -{
    -  private:
    -    Used *m_usedClass;
    -};
    -
    If the MAX_DOT_GRAPH_HEIGHT tag in the configuration file is set to 240 this will result in the following graph:

    -

    -graph_legend.png -
    -

    -The boxes in the above graph have the following meaning:

      +

      This page explains how to interpret the graphs that are generated by doxygen.

      +

      Consider the following example:

      /*! Invisible class because of truncation */
      +
      class Invisible { };
      +
      +
      /*! Truncated class, inheritance relation is hidden */
      +
      class Truncated : public Invisible { };
      +
      +
      /* Class not documented with doxygen comments */
      +
      class Undocumented { };
      +
      +
      /*! Class that is inherited using public inheritance */
      +
      class PublicBase : public Truncated { };
      +
      +
      /*! A template class */
      +
      template<class T> class Templ { };
      +
      +
      /*! Class that is inherited using protected inheritance */
      +
      class ProtectedBase { };
      +
      +
      /*! Class that is inherited using private inheritance */
      +
      class PrivateBase { };
      +
      +
      /*! Class that is used by the Inherited class */
      +
      class Used { };
      +
      +
      /*! Super class that inherits a number of other classes */
      +
      class Inherited : public PublicBase,
      +
      protected ProtectedBase,
      +
      private PrivateBase,
      +
      public Undocumented,
      +
      public Templ<int>
      +
      {
      +
      private:
      +
      Used *m_usedClass;
      +
      };
      +

      This will result in the following graph:

      +

      The boxes in the above graph have the following meaning:

      +
      • A filled gray box represents the struct or class for which the graph is generated.
      • A box with a black border denotes a documented struct or class.
      • -A box with a grey border denotes an undocumented struct or class.
      • +A box with a gray border denotes an undocumented struct or class.
      • A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
      -The arrows have the following meaning:
        +

        The arrows have the following meaning:

        +
        • A dark blue arrow is used to visualize a public inheritance relation between two classes.
        • @@ -76,12 +80,12 @@
        • A dark red arrow is used for private inheritance.
        • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
        • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
        • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
        • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
        -
    +
    -Generated on Wed Jan 11 14:07:51 2012 for Heimdalwindlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal wind library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/wind/html/graph_legend.dot b/crypto/heimdal/doc/doxyout/wind/html/graph_legend.dot deleted file mode 100644 --- a/crypto/heimdal/doc/doxyout/wind/html/graph_legend.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph G -{ - edge [fontname="FreeSans",fontsize=10,labelfontname="FreeSans",labelfontsize=10]; - node [fontname="FreeSans",fontsize=10,shape=record]; - Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPublicBase.html"]; - Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="red",URL="$classTruncated.html"]; - Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="FreeSans"]; - Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classProtectedBase.html"]; - Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="FreeSans"]; - Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classPrivateBase.html"]; - Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="grey75"]; - Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="FreeSans"]; - Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="FreeSans"]; - Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classTempl.html"]; - Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="FreeSans"]; - Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="FreeSans",color="black",URL="$classUsed.html"]; -} diff --git a/crypto/heimdal/doc/doxyout/wind/html/graph_legend.md5 b/crypto/heimdal/doc/doxyout/wind/html/graph_legend.md5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/wind/html/graph_legend.md5 @@ -0,0 +1 @@ +f51bf6e9a10430aafef59831b08dcbfe \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/wind/html/graph_legend.png b/crypto/heimdal/doc/doxyout/wind/html/graph_legend.png index 9b96937bfd5f7a36ea8dbf2d64ed1bc0768f074d..f323741337e1a9852906f2f13bf066b78b2c7a44 GIT binary patch literal 20848 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 diff --git a/crypto/heimdal/doc/doxyout/wind/html/group__wind.html b/crypto/heimdal/doc/doxyout/wind/html/group__wind.html --- a/crypto/heimdal/doc/doxyout/wind/html/group__wind.html +++ b/crypto/heimdal/doc/doxyout/wind/html/group__wind.html @@ -1,6 +1,6 @@ -Heimdalwindlibrary: Heimdal wind library +Heimdal wind library @@ -8,673 +8,679 @@ keyhole logo

    - - + + + + + + +
    + +
    +
    Heimdal wind library
    +
    -

    Heimdal wind library

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    Functions

    int wind_punycode_label_toascii (const uint32_t *in, size_t in_len, char *out, size_t *out_len)
    int wind_stringprep (const uint32_t *in, size_t in_len, uint32_t *out, size_t *out_len, wind_profile_flags flags)
    int wind_profile (const char *name, wind_profile_flags *flags)
    int wind_utf8ucs4 (const char *in, uint32_t *out, size_t *out_len)
    int wind_utf8ucs4_length (const char *in, size_t *out_len)
    int wind_ucs4utf8 (const uint32_t *in, size_t in_len, char *out, size_t *out_len)
    int wind_ucs4utf8_length (const uint32_t *in, size_t in_len, size_t *out_len)
    int wind_ucs2read (const void *ptr, size_t len, unsigned int *flags, uint16_t *out, size_t *out_len)
    int wind_ucs2write (const uint16_t *in, size_t in_len, unsigned int *flags, void *ptr, size_t *out_len)
    int wind_utf8ucs2 (const char *in, uint16_t *out, size_t *out_len)
    int wind_utf8ucs2_length (const char *in, size_t *out_len)
    int wind_ucs2utf8 (const uint16_t *in, size_t in_len, char *out, size_t *out_len)
    int wind_ucs2utf8_length (const uint16_t *in, size_t in_len, size_t *out_len)
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int wind_punycode_label_toascii (const uint32_t *in, size_t in_len, char *out, size_t *out_len)
     
    int wind_stringprep (const uint32_t *in, size_t in_len, uint32_t *out, size_t *out_len, wind_profile_flags flags)
     
    int wind_profile (const char *name, wind_profile_flags *flags)
     
    int wind_utf8ucs4 (const char *in, uint32_t *out, size_t *out_len)
     
    int wind_utf8ucs4_length (const char *in, size_t *out_len)
     
    int wind_ucs4utf8 (const uint32_t *in, size_t in_len, char *out, size_t *out_len)
     
    int wind_ucs4utf8_length (const uint32_t *in, size_t in_len, size_t *out_len)
     
    int wind_ucs2read (const void *ptr, size_t len, unsigned int *flags, uint16_t *out, size_t *out_len)
     
    int wind_ucs2write (const uint16_t *in, size_t in_len, unsigned int *flags, void *ptr, size_t *out_len)
     
    int wind_utf8ucs2 (const char *in, uint16_t *out, size_t *out_len)
     
    int wind_utf8ucs2_length (const char *in, size_t *out_len)
     
    int wind_ucs2utf8 (const uint16_t *in, size_t in_len, char *out, size_t *out_len)
     
    int wind_ucs2utf8_length (const uint16_t *in, size_t in_len, size_t *out_len)
     
    -

    Detailed Description

    -

    Function Documentation

    - +

    Detailed Description

    +

    Function Documentation

    + +

    ◆ wind_profile()

    +
    - + - - + + - - + + - +
    int wind_profile int wind_profile (const char *  name, const char * name,
    wind_profile_flags *  flags wind_profile_flags * flags 
    )
    -
    -
    - -

    -Try to find the profile given a name.

    -

    Parameters:
    - - - +
    +

    Try to find the profile given a name.

    +
    Parameters
    +
    name name of the profile.
    flags the resulting profile.
    + +
    namename of the profile.
    flagsthe resulting profile.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - +

    + +

    ◆ wind_punycode_label_toascii()

    +
    - + - - + + - - + + - - + + - - + + - +
    int wind_punycode_label_toascii int wind_punycode_label_toascii (const uint32_t *  in, const uint32_t * in,
    size_t  in_len, size_t in_len,
    char *  out, char * out,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Convert an UCS4 string to a puny-coded DNS label string suitable when combined with delimiters and other labels for DNS lookup.

    -

    Parameters:
    - - - - - +
    +

    Convert an UCS4 string to a puny-coded DNS label string suitable when combined with delimiters and other labels for DNS lookup.

    +
    Parameters
    +
    in an UCS4 string to convert
    in_len the length of in.
    out the resulting puny-coded string. The string is not NUL terminatied.
    out_len before processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    + + + +
    inan UCS4 string to convert
    in_lenthe length of in.
    outthe resulting puny-coded string. The string is not NUL terminatied.
    out_lenbefore processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_stringprep()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    int wind_stringprep int wind_stringprep (const uint32_t *  in, const uint32_t * in,
    size_t  in_len, size_t in_len,
    uint32_t *  out, uint32_t * out,
    size_t *  out_len, size_t * out_len,
    wind_profile_flags  flags wind_profile_flags flags 
    )
    -
    -
    - -

    -Process a input UCS4 string according a string-prep profile.

    -

    Parameters:
    - - - - - - +
    +

    Process a input UCS4 string according a string-prep profile.

    +
    Parameters
    +
    in input UCS4 string to process
    in_len length of the input string
    out output UCS4 string
    out_len length of the output string.
    flags stringprep profile.
    + + + + +
    ininput UCS4 string to process
    in_lenlength of the input string
    outoutput UCS4 string
    out_lenlength of the output string.
    flagsstringprep profile.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_ucs2read()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    int wind_ucs2read int wind_ucs2read (const void *  ptr, const void * ptr,
    size_t  len, size_t len,
    unsigned int *  flags, unsigned int * flags,
    uint16_t *  out, uint16_t * out,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Read in an UCS2 from a buffer.

    -

    Parameters:
    - - - - - - +
    +

    Read in an UCS2 from a buffer.

    +
    Parameters
    +
    ptr The input buffer to read from.
    len the length of the input buffer.
    flags Flags to control the behavior of the function.
    out the output UCS2, the array must be at least out/2 long.
    out_len the output length
    + + + + +
    ptrThe input buffer to read from.
    lenthe length of the input buffer.
    flagsFlags to control the behavior of the function.
    outthe output UCS2, the array must be at least out/2 long.
    out_lenthe output length
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise.
    +
    Returns
    returns 0 on success, an wind error code otherwise.
    +

    if len is zero, flags are unchanged

    +

    if len is odd, WIND_ERR_LENGTH_NOT_MOD2 is returned

    +

    If the flags WIND_RW_BOM is set, check for BOM. If not BOM is found, check is LE/BE flag is already and use that otherwise fail with WIND_ERR_NO_BOM. When done, clear WIND_RW_BOM and the LE/BE flag and set the resulting LE/BE flag.

    -

    -if len is zero, flags are unchanged

    -if len is odd, WIND_ERR_LENGTH_NOT_MOD2 is returned

    -If the flags WIND_RW_BOM is set, check for BOM. If not BOM is found, check is LE/BE flag is already and use that otherwise fail with WIND_ERR_NO_BOM. When done, clear WIND_RW_BOM and the LE/BE flag and set the resulting LE/BE flag.

    -

    - + + +

    ◆ wind_ucs2utf8()

    +
    - + - - + + - - + + - - + + - - + + - +
    int wind_ucs2utf8 int wind_ucs2utf8 (const uint16_t *  in, const uint16_t * in,
    size_t  in_len, size_t in_len,
    char *  out, char * out,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Convert an UCS2 string to a UTF-8 string.

    -

    Parameters:
    - - - - - +
    +

    Convert an UCS2 string to a UTF-8 string.

    +
    Parameters
    +
    in an UCS2 string to convert.
    in_len the length of the in UCS2 string.
    out the resulting UTF-8 strint, must be at least wind_ucs2utf8_length() long. If out is NULL, the function will calculate the needed space for the out variable (just like wind_ucs2utf8_length()).
    out_len before processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    + + + +
    inan UCS2 string to convert.
    in_lenthe length of the in UCS2 string.
    outthe resulting UTF-8 strint, must be at least wind_ucs2utf8_length() long. If out is NULL, the function will calculate the needed space for the out variable (just like wind_ucs2utf8_length()).
    out_lenbefore processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_ucs2utf8_length()

    +
    - + - - + + - - + + - - + + - +
    int wind_ucs2utf8_length int wind_ucs2utf8_length (const uint16_t *  in, const uint16_t * in,
    size_t  in_len, size_t in_len,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Calculate the length of from converting a UCS2 string to an UTF-8 string.

    -

    Parameters:
    - - - - +
    +

    Calculate the length of from converting a UCS2 string to an UTF-8 string.

    +
    Parameters
    +
    in an UCS2 string to convert.
    in_len an UCS2 string length to convert.
    out_len the length of the resulting UTF-8 string.
    + + +
    inan UCS2 string to convert.
    in_lenan UCS2 string length to convert.
    out_lenthe length of the resulting UTF-8 string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_ucs2write()

    +
    - + - - + + - - + + - - + + - - + + - - + + - +
    int wind_ucs2write int wind_ucs2write (const uint16_t *  in, const uint16_t * in,
    size_t  in_len, size_t in_len,
    unsigned int *  flags, unsigned int * flags,
    void *  ptr, void * ptr,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Write an UCS2 string to a buffer.

    -

    Parameters:
    - - - - - - +
    +

    Write an UCS2 string to a buffer.

    +
    Parameters
    +
    in The input UCS2 string.
    in_len the length of the input buffer.
    flags Flags to control the behavior of the function.
    ptr The input buffer to write to, the array must be at least (in + 1) * 2 bytes long.
    out_len the output length
    + + + + +
    inThe input UCS2 string.
    in_lenthe length of the input buffer.
    flagsFlags to control the behavior of the function.
    ptrThe input buffer to write to, the array must be at least (in + 1) * 2 bytes long.
    out_lenthe output length
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise.
    +
    Returns
    returns 0 on success, an wind error code otherwise.
    +

    If in buffer is not of length be mod 2, WIND_ERR_LENGTH_NOT_MOD2 is returned

    +

    On zero input length, flags are preserved

    +

    If flags have WIND_RW_BOM set, the byte order mark is written first to the output data

    +

    If the output wont fit into out_len, WIND_ERR_OVERRUN is returned

    -

    -If in buffer is not of length be mod 2, WIND_ERR_LENGTH_NOT_MOD2 is returned

    -On zero input length, flags are preserved

    -If flags have WIND_RW_BOM set, the byte order mark is written first to the output data

    -If the output wont fit into out_len, WIND_ERR_OVERRUN is returned

    -

    - + + +

    ◆ wind_ucs4utf8()

    +
    - + - - + + - - + + - - + + - - + + - +
    int wind_ucs4utf8 int wind_ucs4utf8 (const uint32_t *  in, const uint32_t * in,
    size_t  in_len, size_t in_len,
    char *  out, char * out,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Convert an UCS4 string to a UTF-8 string.

    -

    Parameters:
    - - - - - +
    +

    Convert an UCS4 string to a UTF-8 string.

    +
    Parameters
    +
    in an UCS4 string to convert.
    in_len the length input array.
    out the resulting UTF-8 strint, must be at least wind_ucs4utf8_length() + 1 long (the extra char for the NUL). If out is NULL, the function will calculate the needed space for the out variable (just like wind_ucs4utf8_length()).
    out_len before processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    + + + +
    inan UCS4 string to convert.
    in_lenthe length input array.
    outthe resulting UTF-8 strint, must be at least wind_ucs4utf8_length() + 1 long (the extra char for the NUL). If out is NULL, the function will calculate the needed space for the out variable (just like wind_ucs4utf8_length()).
    out_lenbefore processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_ucs4utf8_length()

    +
    - + - - + + - - + + - - + + - +
    int wind_ucs4utf8_length int wind_ucs4utf8_length (const uint32_t *  in, const uint32_t * in,
    size_t  in_len, size_t in_len,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Calculate the length of from converting a UCS4 string to an UTF-8 string.

    -

    Parameters:
    - - - - +
    +

    Calculate the length of from converting a UCS4 string to an UTF-8 string.

    +
    Parameters
    +
    in an UCS4 string to convert.
    in_len the length of UCS4 string to convert.
    out_len the length of the resulting UTF-8 string.
    + + +
    inan UCS4 string to convert.
    in_lenthe length of UCS4 string to convert.
    out_lenthe length of the resulting UTF-8 string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_utf8ucs2()

    +
    - + - - + + - - + + - - + + - +
    int wind_utf8ucs2 int wind_utf8ucs2 (const char *  in, const char * in,
    uint16_t *  out, uint16_t * out,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Convert an UTF-8 string to an UCS2 string.

    -

    Parameters:
    - - - - +
    +

    Convert an UTF-8 string to an UCS2 string.

    +
    Parameters
    +
    in an UTF-8 string to convert.
    out the resulting UCS2 strint, must be at least wind_utf8ucs2_length() long. If out is NULL, the function will calculate the needed space for the out variable (just like wind_utf8ucs2_length()).
    out_len before processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    + + +
    inan UTF-8 string to convert.
    outthe resulting UCS2 strint, must be at least wind_utf8ucs2_length() long. If out is NULL, the function will calculate the needed space for the out variable (just like wind_utf8ucs2_length()).
    out_lenbefore processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_utf8ucs2_length()

    +
    - + - - + + - - + + - +
    int wind_utf8ucs2_length int wind_utf8ucs2_length (const char *  in, const char * in,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Calculate the length of from converting a UTF-8 string to a UCS2 string.

    -

    Parameters:
    - - - +
    +

    Calculate the length of from converting a UTF-8 string to a UCS2 string.

    +
    Parameters
    +
    in an UTF-8 string to convert.
    out_len the length of the resulting UCS4 string.
    + +
    inan UTF-8 string to convert.
    out_lenthe length of the resulting UCS4 string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_utf8ucs4()

    +
    - + - - + + - - + + - - + + - +
    int wind_utf8ucs4 int wind_utf8ucs4 (const char *  in, const char * in,
    uint32_t *  out, uint32_t * out,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Convert an UTF-8 string to an UCS4 string.

    -

    Parameters:
    - - - - +
    +

    Convert an UTF-8 string to an UCS4 string.

    +
    Parameters
    +
    in an UTF-8 string to convert.
    out the resulting UCS4 strint, must be at least wind_utf8ucs4_length() long. If out is NULL, the function will calculate the needed space for the out variable (just like wind_utf8ucs4_length()).
    out_len before processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    + + +
    inan UTF-8 string to convert.
    outthe resulting UCS4 strint, must be at least wind_utf8ucs4_length() long. If out is NULL, the function will calculate the needed space for the out variable (just like wind_utf8ucs4_length()).
    out_lenbefore processing out_len should be the length of the out variable, after processing it will be the length of the out string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    - + + +

    ◆ wind_utf8ucs4_length()

    +
    - + - - + + - - + + - +
    int wind_utf8ucs4_length int wind_utf8ucs4_length (const char *  in, const char * in,
    size_t *  out_len size_t * out_len 
    )
    -
    -
    - -

    -Calculate the length of from converting a UTF-8 string to a UCS4 string.

    -

    Parameters:
    - - - +
    +

    Calculate the length of from converting a UTF-8 string to a UCS4 string.

    +
    Parameters
    +
    in an UTF-8 string to convert.
    out_len the length of the resulting UCS4 string.
    + +
    inan UTF-8 string to convert.
    out_lenthe length of the resulting UCS4 string.
    +
    -
    Returns:
    returns 0 on success, an wind error code otherwise
    +
    Returns
    returns 0 on success, an wind error code otherwise
    -

    +


    -Generated on Wed Jan 11 14:07:51 2012 for Heimdalwindlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal wind library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/wind/html/index.html b/crypto/heimdal/doc/doxyout/wind/html/index.html --- a/crypto/heimdal/doc/doxyout/wind/html/index.html +++ b/crypto/heimdal/doc/doxyout/wind/html/index.html @@ -1,6 +1,6 @@ -Heimdalwindlibrary: Heimdal wind library +Heimdal wind library @@ -8,23 +8,29 @@ keyhole logo

    - - + + + + + + +
    +
    +
    Heimdal wind library
    +
    -

    Heimdal wind library

    -

    -

    1.5.2

    -Introduction

    -Heimdal wind library is a implementation of stringprep and some of its profiles.

    -The project web page: http://www.h5l.org/

    +

    +Introduction

    +

    Heimdal wind library is a implementation of stringprep and some of its profiles.

    +

    The project web page: http://www.h5l.org/

    +
    +
    -Generated on Wed Jan 11 14:07:51 2012 for Heimdalwindlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal wind library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/wind/html/jquery.js b/crypto/heimdal/doc/doxyout/wind/html/jquery.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/wind/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/wind/html/menu.js b/crypto/heimdal/doc/doxyout/wind/html/menu.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/wind/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/crypto/heimdal/doc/doxyout/wind/html/menudata.js b/crypto/heimdal/doc/doxyout/wind/html/menudata.js new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/doxyout/wind/html/menudata.js @@ -0,0 +1,27 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Modules",url:"modules.html"}]} diff --git a/crypto/heimdal/doc/doxyout/wind/html/modules.html b/crypto/heimdal/doc/doxyout/wind/html/modules.html --- a/crypto/heimdal/doc/doxyout/wind/html/modules.html +++ b/crypto/heimdal/doc/doxyout/wind/html/modules.html @@ -1,6 +1,6 @@ -Heimdalwindlibrary: Module Index +Modules @@ -8,21 +8,29 @@ keyhole logo

    - - + + + + + +
    +
    +
    +
    Modules
    +
    -

    Modules

    Here is a list of all modules: -
    +
    Here is a list of all modules:
    +

    -Generated on Wed Jan 11 14:07:51 2012 for Heimdalwindlibrary by doxygen 1.5.6
    +Generated on Tue Nov 15 2022 14:04:26 for Heimdal wind library by doxygen 1.9.1 diff --git a/crypto/heimdal/doc/doxyout/wind/html/nav_f.png b/crypto/heimdal/doc/doxyout/wind/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zc%17D@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 Hc$@F$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 Hc$@oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 Hc$@Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 Hc$@*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 Hc$@IeJfk6j|89*WoOiV6}4AuZ}83fn> diff --git a/crypto/heimdal/doc/doxyout/wind/html/tab_b.png b/crypto/heimdal/doc/doxyout/wind/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 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 literal 0 Hc$@li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/crypto/heimdal/doc/doxyout/wind/man/man3/wind.3 b/crypto/heimdal/doc/doxyout/wind/man/man3/wind.3 --- a/crypto/heimdal/doc/doxyout/wind/man/man3/wind.3 +++ b/crypto/heimdal/doc/doxyout/wind/man/man3/wind.3 @@ -1,8 +1,11 @@ -.TH "Heimdal wind library" 3 "11 Jan 2012" "Version 1.5.2" "Heimdalwindlibrary" \" -*- nroff -*- +.TH "wind" 3 "Tue Nov 15 2022" "Version 7.8.0" "Heimdal wind library" \" -*- nroff -*- .ad l .nh .SH NAME -Heimdal wind library \- +wind \- Heimdal wind library +.SH SYNOPSIS +.br +.PP .SS "Functions" .in +1c @@ -52,48 +55,45 @@ .SH "Function Documentation" .PP .SS "int wind_profile (const char * name, wind_profile_flags * flags)" +Try to find the profile given a name\&. .PP -Try to find the profile given a name. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIname\fP name of the profile. +\fIname\fP name of the profile\&. .br -\fIflags\fP the resulting profile. +\fIflags\fP the resulting profile\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_punycode_label_toascii (const uint32_t * in, size_t in_len, char * out, size_t * out_len)" +Convert an UCS4 string to a puny-coded DNS label string suitable when combined with delimiters and other labels for DNS lookup\&. .PP -Convert an UCS4 string to a puny-coded DNS label string suitable when combined with delimiters and other labels for DNS lookup. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIin\fP an UCS4 string to convert .br -\fIin_len\fP the length of in. +\fIin_len\fP the length of in\&. .br -\fIout\fP the resulting puny-coded string. The string is not NUL terminatied. +\fIout\fP the resulting puny-coded string\&. The string is not NUL terminatied\&. .br -\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string. +\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_stringprep (const uint32_t * in, size_t in_len, uint32_t * out, size_t * out_len, wind_profile_flags flags)" +Process a input UCS4 string according a string-prep profile\&. .PP -Process a input UCS4 string according a string-prep profile. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 \fIin\fP input UCS4 string to process .br @@ -101,109 +101,101 @@ .br \fIout\fP output UCS4 string .br -\fIout_len\fP length of the output string. +\fIout_len\fP length of the output string\&. .br -\fIflags\fP stringprep profile. +\fIflags\fP stringprep profile\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_ucs2read (const void * ptr, size_t len, unsigned int * flags, uint16_t * out, size_t * out_len)" +Read in an UCS2 from a buffer\&. .PP -Read in an UCS2 from a buffer. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIptr\fP The input buffer to read from. +\fIptr\fP The input buffer to read from\&. .br -\fIlen\fP the length of the input buffer. +\fIlen\fP the length of the input buffer\&. .br -\fIflags\fP Flags to control the behavior of the function. +\fIflags\fP Flags to control the behavior of the function\&. .br -\fIout\fP the output UCS2, the array must be at least out/2 long. +\fIout\fP the output UCS2, the array must be at least out/2 long\&. .br \fIout_len\fP the output length .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -returns 0 on success, an wind error code otherwise. +returns 0 on success, an wind error code otherwise\&. .RE -.PP - .PP if len is zero, flags are unchanged .PP if len is odd, WIND_ERR_LENGTH_NOT_MOD2 is returned .PP -If the flags WIND_RW_BOM is set, check for BOM. If not BOM is found, check is LE/BE flag is already and use that otherwise fail with WIND_ERR_NO_BOM. When done, clear WIND_RW_BOM and the LE/BE flag and set the resulting LE/BE flag. +If the flags WIND_RW_BOM is set, check for BOM\&. If not BOM is found, check is LE/BE flag is already and use that otherwise fail with WIND_ERR_NO_BOM\&. When done, clear WIND_RW_BOM and the LE/BE flag and set the resulting LE/BE flag\&. .SS "int wind_ucs2utf8 (const uint16_t * in, size_t in_len, char * out, size_t * out_len)" +Convert an UCS2 string to a UTF-8 string\&. .PP -Convert an UCS2 string to a UTF-8 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UCS2 string to convert. +\fIin\fP an UCS2 string to convert\&. .br -\fIin_len\fP the length of the in UCS2 string. +\fIin_len\fP the length of the in UCS2 string\&. .br -\fIout\fP the resulting UTF-8 strint, must be at least \fBwind_ucs2utf8_length()\fP long. If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_ucs2utf8_length()\fP). +\fIout\fP the resulting UTF-8 strint, must be at least \fBwind_ucs2utf8_length()\fP long\&. If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_ucs2utf8_length()\fP)\&. .br -\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string. +\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_ucs2utf8_length (const uint16_t * in, size_t in_len, size_t * out_len)" +Calculate the length of from converting a UCS2 string to an UTF-8 string\&. .PP -Calculate the length of from converting a UCS2 string to an UTF-8 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UCS2 string to convert. +\fIin\fP an UCS2 string to convert\&. .br -\fIin_len\fP an UCS2 string length to convert. +\fIin_len\fP an UCS2 string length to convert\&. .br -\fIout_len\fP the length of the resulting UTF-8 string. +\fIout_len\fP the length of the resulting UTF-8 string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_ucs2write (const uint16_t * in, size_t in_len, unsigned int * flags, void * ptr, size_t * out_len)" +Write an UCS2 string to a buffer\&. .PP -Write an UCS2 string to a buffer. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP The input UCS2 string. +\fIin\fP The input UCS2 string\&. .br -\fIin_len\fP the length of the input buffer. +\fIin_len\fP the length of the input buffer\&. .br -\fIflags\fP Flags to control the behavior of the function. +\fIflags\fP Flags to control the behavior of the function\&. .br -\fIptr\fP The input buffer to write to, the array must be at least (in + 1) * 2 bytes long. +\fIptr\fP The input buffer to write to, the array must be at least (in + 1) * 2 bytes long\&. .br \fIout_len\fP the output length .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 -returns 0 on success, an wind error code otherwise. +returns 0 on success, an wind error code otherwise\&. .RE -.PP - .PP If in buffer is not of length be mod 2, WIND_ERR_LENGTH_NOT_MOD2 is returned .PP @@ -211,116 +203,113 @@ .PP If flags have WIND_RW_BOM set, the byte order mark is written first to the output data .PP -If the output wont fit into out_len, WIND_ERR_OVERRUN is returned +If the output wont fit into out_len, WIND_ERR_OVERRUN is returned .SS "int wind_ucs4utf8 (const uint32_t * in, size_t in_len, char * out, size_t * out_len)" +Convert an UCS4 string to a UTF-8 string\&. .PP -Convert an UCS4 string to a UTF-8 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UCS4 string to convert. +\fIin\fP an UCS4 string to convert\&. .br -\fIin_len\fP the length input array. +\fIin_len\fP the length input array\&. .br -\fIout\fP the resulting UTF-8 strint, must be at least \fBwind_ucs4utf8_length()\fP + 1 long (the extra char for the NUL). If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_ucs4utf8_length()\fP). +\fIout\fP the resulting UTF-8 strint, must be at least \fBwind_ucs4utf8_length()\fP + 1 long (the extra char for the NUL)\&. If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_ucs4utf8_length()\fP)\&. .br -\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string. +\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_ucs4utf8_length (const uint32_t * in, size_t in_len, size_t * out_len)" +Calculate the length of from converting a UCS4 string to an UTF-8 string\&. .PP -Calculate the length of from converting a UCS4 string to an UTF-8 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UCS4 string to convert. +\fIin\fP an UCS4 string to convert\&. .br -\fIin_len\fP the length of UCS4 string to convert. +\fIin_len\fP the length of UCS4 string to convert\&. .br -\fIout_len\fP the length of the resulting UTF-8 string. +\fIout_len\fP the length of the resulting UTF-8 string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_utf8ucs2 (const char * in, uint16_t * out, size_t * out_len)" +Convert an UTF-8 string to an UCS2 string\&. .PP -Convert an UTF-8 string to an UCS2 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UTF-8 string to convert. +\fIin\fP an UTF-8 string to convert\&. .br -\fIout\fP the resulting UCS2 strint, must be at least \fBwind_utf8ucs2_length()\fP long. If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_utf8ucs2_length()\fP). +\fIout\fP the resulting UCS2 strint, must be at least \fBwind_utf8ucs2_length()\fP long\&. If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_utf8ucs2_length()\fP)\&. .br -\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string. +\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_utf8ucs2_length (const char * in, size_t * out_len)" +Calculate the length of from converting a UTF-8 string to a UCS2 string\&. .PP -Calculate the length of from converting a UTF-8 string to a UCS2 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UTF-8 string to convert. +\fIin\fP an UTF-8 string to convert\&. .br -\fIout_len\fP the length of the resulting UCS4 string. +\fIout_len\fP the length of the resulting UCS4 string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_utf8ucs4 (const char * in, uint32_t * out, size_t * out_len)" +Convert an UTF-8 string to an UCS4 string\&. .PP -Convert an UTF-8 string to an UCS4 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UTF-8 string to convert. +\fIin\fP an UTF-8 string to convert\&. .br -\fIout\fP the resulting UCS4 strint, must be at least \fBwind_utf8ucs4_length()\fP long. If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_utf8ucs4_length()\fP). +\fIout\fP the resulting UCS4 strint, must be at least \fBwind_utf8ucs4_length()\fP long\&. If out is NULL, the function will calculate the needed space for the out variable (just like \fBwind_utf8ucs4_length()\fP)\&. .br -\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string. +\fIout_len\fP before processing out_len should be the length of the out variable, after processing it will be the length of the out string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP .SS "int wind_utf8ucs4_length (const char * in, size_t * out_len)" +Calculate the length of from converting a UTF-8 string to a UCS4 string\&. .PP -Calculate the length of from converting a UTF-8 string to a UCS4 string. -.PP -\fBParameters:\fP +\fBParameters\fP .RS 4 -\fIin\fP an UTF-8 string to convert. +\fIin\fP an UTF-8 string to convert\&. .br -\fIout_len\fP the length of the resulting UCS4 string. +\fIout_len\fP the length of the resulting UCS4 string\&. .RE .PP -\fBReturns:\fP +\fBReturns\fP .RS 4 returns 0 on success, an wind error code otherwise .RE .PP +.SH "Author" +.PP +Generated automatically by Doxygen for Heimdal wind library from the source code\&. diff --git a/crypto/heimdal/doc/doxytmpl.dxy b/crypto/heimdal/doc/doxytmpl.dxy --- a/crypto/heimdal/doc/doxytmpl.dxy +++ b/crypto/heimdal/doc/doxytmpl.dxy @@ -26,7 +26,6 @@ JAVADOC_AUTOBRIEF = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 8 @@ -65,7 +64,6 @@ ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES -SHOW_DIRECTORIES = NO FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages @@ -105,8 +103,7 @@ *.inc \ *.m \ *.mm \ - *.dox \ - *.py + *.dox RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO @@ -142,7 +139,6 @@ HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO HTML_DYNAMIC_SECTIONS = NO CHM_FILE = @@ -190,8 +186,6 @@ #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output @@ -213,7 +207,7 @@ SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = -PREDEFINED = +PREDEFINED = DOXY EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- @@ -227,7 +221,6 @@ # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO -MSCGEN_PATH = /Applications/Doxygen.app/Contents/Resources/ HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES CLASS_GRAPH = YES @@ -242,7 +235,6 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = png -DOT_PATH = /Applications/Doxygen.app/Contents/Resources/ DOTFILE_DIRS = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 diff --git a/crypto/heimdal/doc/footer.html b/crypto/heimdal/doc/footer.html new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/footer.html @@ -0,0 +1,4 @@ +
    +Generated on $datetime for $projectname by doxygen $doxygenversion
    + + diff --git a/crypto/heimdal/doc/hdb.din b/crypto/heimdal/doc/hdb.din new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/hdb.din @@ -0,0 +1,15 @@ +# Doxyfile 1.5.3 + +PROJECT_NAME = Heimdal hdb library +PROJECT_NUMBER = @PACKAGE_VERSION@ +OUTPUT_DIRECTORY = @srcdir@/doxyout/hdb +INPUT = @srcdir@/../lib/hdb + +WARN_IF_UNDOCUMENTED = YES + +PERL_PATH = /usr/bin/perl + +HTML_HEADER = "@srcdir@/header.html" +HTML_FOOTER = "@srcdir@/footer.html" + +@INCLUDE = "@srcdir@/doxytmpl.dxy" diff --git a/crypto/heimdal/doc/heimdal.hhp b/crypto/heimdal/doc/heimdal.hhp new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/heimdal.hhp @@ -0,0 +1,8 @@ +[OPTIONS] +Compatibility=1.1 or later +Compiled file=heimdal.chm +Contents file=toc.hhc +Default topic=index.html +Display compile progress=No +Language=0x409 English (United States) +Title=Heimdal \ No newline at end of file diff --git a/crypto/heimdal/doc/heimdal.info b/crypto/heimdal/doc/heimdal.info new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/heimdal.info @@ -0,0 +1,3438 @@ +This is heimdal.info, produced by makeinfo version 6.8 from +heimdal.texi. + +INFO-DIR-SECTION Security +START-INFO-DIR-ENTRY +* Heimdal: (heimdal). The Kerberos 5 distribution from KTH +END-INFO-DIR-ENTRY + + +File: heimdal.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) + +Heimdal +******* + +This manual for version 7.8.0 of Heimdal. + +* Menu: + +* Introduction:: +* What is Kerberos?:: +* Building and Installing:: +* Setting up a realm:: +* Applications:: +* Things in search for a better place:: +* Kerberos 4 issues:: +* Windows compatibility:: +* Programming with Kerberos:: +* Migration:: +* Acknowledgments:: +* Copyrights and Licenses:: + + -- The Detailed Node Listing -- + +Setting up a realm + +* Configuration file:: +* Creating the database:: +* Modifying the database:: +* keytabs:: +* Remote administration:: +* Password changing:: +* Testing clients and servers:: +* Slave Servers:: +* Incremental propagation:: +* Encryption types and salting:: +* Credential cache server - KCM:: +* Cross realm:: +* Transit policy:: +* Setting up DNS:: +* Using LDAP to store the database:: +* Providing Kerberos credentials to servers and programs:: +* Setting up PK-INIT:: +* Debugging Kerberos problems:: + +Applications + +* Authentication modules:: +* AFS:: + +Authentication modules + +* Digital SIA:: +* IRIX:: + +Kerberos 4 issues + +* Principal conversion issues:: +* Converting a version 4 database:: + +Windows compatibility + +* Configuring Windows to use a Heimdal KDC:: +* Inter-Realm keys (trust) between Windows and a Heimdal KDC:: +* Create account mappings:: +* Encryption types:: +* Authorisation data:: +* Quirks of Windows 2000 KDC:: +* Useful links when reading about the Windows:: + +Programming with Kerberos + + + +File: heimdal.info, Node: Introduction, Next: What is Kerberos?, Prev: Top, Up: Top + +1 Introduction +************** + +What is Heimdal? +================ + +Heimdal is a free implementation of Kerberos 5. The goals are to: + + * have an implementation that can be freely used by anyone + * be protocol compatible with existing implementations and, if not in + conflict, with RFC 4120 (and any future updated RFC). RFC 4120 + replaced RFC 1510. + * be reasonably compatible with the M.I.T Kerberos V5 API + * have support for Kerberos V5 over GSS-API (RFC1964) + * include the most important and useful application programs (rsh, + telnet, popper, etc.) + * include enough backwards compatibility with Kerberos V4 + +Status +====== + +Heimdal has the following features (this does not mean any of this +works): + + * a stub generator and a library to encode/decode/whatever ASN.1/DER + stuff + * a 'libkrb5' library that should be possible to get to work with + simple applications + * a GSS-API library + * 'kinit', 'klist', 'kdestroy' + * 'telnet', 'telnetd' + * 'rsh', 'rshd' + * 'popper', 'push' (a movemail equivalent) + * 'ftp', and 'ftpd' + * a library 'libkafs' for authenticating to AFS and a program + 'afslog' that uses it + * some simple test programs + * a KDC that supports most things, + * simple programs for distributing databases between a KDC master and + slaves + * a password changing daemon 'kpasswdd', library functions for + changing passwords and a simple client + * some kind of administration system + * Kerberos V4 support in many of the applications. + +Bug reports +=========== + +If you find bugs in this software, make sure it is a genuine bug and not +just a part of the code that isn't implemented. + +Bug reports should be sent to . Please include +information on what machine and operating system (including version) you +are running, what you are trying to do, what happens, what you think +should have happened, an example for us to repeat, the output you get +when trying the example, and a patch for the problem if you have one. +Please make any patches with 'diff -u' or 'diff -c'. + +Suggestions, comments and other non bug reports are also welcome. + +Mailing list +============ + +There are two mailing lists with talk about Heimdal. + is a low-volume announcement list, while + is for general discussion. Send a message to + to subscribe. + +Heimdal source code, binaries and the manual +============================================ + +The source code for heimdal, links to binaries and the manual (this +document) can be found on our web-page at +. + + +File: heimdal.info, Node: What is Kerberos?, Next: Building and Installing, Prev: Introduction, Up: Top + +2 What is Kerberos? +******************* + + Now this Cerberus had three heads of dogs, + the tail of a dragon, and on his back the + heads of all sorts of snakes. + -- Pseudo-Apollodorus Library 2.5.12 + +Kerberos is a system for authenticating users and services on a network. +It is built upon the assumption that the network is "unsafe". For +example, data sent over the network can be eavesdropped and altered, and +addresses can also be faked. Therefore they cannot be used for +authentication purposes. + +Kerberos is a trusted third-party service. That means that there is a +third party (the kerberos server) that is trusted by all the entities on +the network (users and services, usually called "principals"). All +principals share a secret password (or key) with the kerberos server and +this enables principals to verify that the messages from the kerberos +server are authentic. Thus trusting the kerberos server, users and +services can authenticate each other. + +2.1 Basic mechanism +=================== + + *Note* This discussion is about Kerberos version 4, but version 5 + works similarly. + +In Kerberos, principals use "tickets" to prove that they are who they +claim to be. In the following example, A is the initiator of the +authentication exchange, usually a user, and B is the service that A +wishes to use. + +To obtain a ticket for a specific service, A sends a ticket request to +the kerberos server. The request contains A's and B's names (along with +some other fields). The kerberos server checks that both A and B are +valid principals. + +Having verified the validity of the principals, it creates a packet +containing A's and B's names, A's network address (A), the current +time (T), the lifetime of the ticket (LIFE), and a secret +"session key" (K). This packet is encrypted with B's secret key +(K). The actual ticket (T) looks like this: ({A, B, A, +T, LIFE, K}K). + +The reply to A consists of the ticket (T), B's name, the current +time, the lifetime of the ticket, and the session key, all encrypted in +A's secret key ({B, T, LIFE, K, T}K). A decrypts the +reply and retains it for later use. + + +Before sending a message to B, A creates an authenticator consisting of +A's name, A's address, the current time, and a "checksum" chosen by A, +all encrypted with the secret session key ({A, A, T, +CHECKSUM}K). This is sent together with the ticket received from +the kerberos server to B. Upon reception, B decrypts the ticket using +B's secret key. Since the ticket contains the session key that the +authenticator was encrypted with, B can now also decrypt the +authenticator. To verify that A really is A, B now has to compare the +contents of the ticket with that of the authenticator. If everything +matches, B now considers A as properly authenticated. + +2.2 Different attacks +===================== + +Impersonating A +--------------- + +An impostor, C could steal the authenticator and the ticket as it is +transmitted across the network, and use them to impersonate A. The +address in the ticket and the authenticator was added to make it more +difficult to perform this attack. To succeed C will have to either use +the same machine as A or fake the source addresses of the packets. By +including the time stamp in the authenticator, C does not have much time +in which to mount the attack. + +Impersonating B +--------------- + +C can hijack B's network address, and when A sends her credentials, C +just pretend to verify them. C can't be sure that she is talking to A. + +2.3 Defence strategies +====================== + +It would be possible to add a "replay cache" to the server side. The +idea is to save the authenticators sent during the last few minutes, so +that B can detect when someone is trying to retransmit an already used +message. This is somewhat impractical (mostly regarding efficiency), +and is not part of Kerberos 4; MIT Kerberos 5 contains it. + +To authenticate B, A might request that B sends something back that +proves that B has access to the session key. An example of this is the +checksum that A sent as part of the authenticator. One typical +procedure is to add one to the checksum, encrypt it with the session key +and send it back to A. This is called "mutual authentication". + +The session key can also be used to add cryptographic checksums to the +messages sent between A and B (known as "message integrity"). +Encryption can also be added ("message confidentiality"). This is +probably the best approach in all cases. + +2.4 Further reading +=================== + +The original paper on Kerberos from 1988 is 'Kerberos: An Authentication +Service for Open Network Systems', by Jennifer Steiner, Clifford Neuman +and Jeffrey I. Schiller. + +A less technical description can be found in 'Designing an +Authentication System: a Dialogue in Four Scenes' by Bill Bryant, also +from 1988. + +These documents can be found on our web-page at +. + + +File: heimdal.info, Node: Building and Installing, Next: Setting up a realm, Prev: What is Kerberos?, Up: Top + +3 Building and Installing +************************* + +Build and install instructions are located here: + + + +Prebuilt packages is located here: + + + + +File: heimdal.info, Node: Setting up a realm, Next: Applications, Prev: Building and Installing, Up: Top + +4 Setting up a realm +******************** + +A realm is an administrative domain. The name of a Kerberos realm is +usually the Internet domain name in uppercase. Call your realm the same +as your Internet domain name if you do not have strong reasons for not +doing so. It will make life easier for you and everyone else. + +* Menu: + +* Configuration file:: +* Creating the database:: +* Modifying the database:: +* Checking the setup:: +* keytabs:: +* Remote administration:: +* Password changing:: +* Testing clients and servers:: +* Slave Servers:: +* Incremental propagation:: +* Encryption types and salting:: +* Credential cache server - KCM:: +* Cross realm:: +* Transit policy:: +* Setting up DNS:: +* Using LDAP to store the database:: +* Providing Kerberos credentials to servers and programs:: +* Setting up PK-INIT:: +* Debugging Kerberos problems:: + + +File: heimdal.info, Node: Configuration file, Next: Creating the database, Prev: Setting up a realm, Up: Setting up a realm + +4.1 Configuration file +====================== + +To setup a realm you will first have to create a configuration file: +'/etc/krb5.conf'. The 'krb5.conf' file can contain many configuration +options, some of which are described here. + +There is a sample 'krb5.conf' supplied with the distribution. + +The configuration file is a hierarchical structure consisting of +sections, each containing a list of bindings (either variable +assignments or subsections). A section starts with '['section-name']'. +A binding consists of a left hand side, an equal sign ('=') and a right +hand side (the left hand side tag must be separated from the equal sign +with some whitespace). Subsections have a '{' as the first +non-whitespace character after the equal sign. All other bindings are +treated as variable assignments. The value of a variable extends to the +end of the line. + + [section1] + a-subsection = { + var = value1 + other-var = value with {} + sub-sub-section = { + var = 123 + } + } + var = some other value + [section2] + var = yet another value + +In this manual, names of sections and bindings will be given as strings +separated by slashes ('/'). The 'other-var' variable will thus be +'section1/a-subsection/other-var'. + +For in-depth information about the contents of the configuration file, +refer to the 'krb5.conf' manual page. Some of the more important +sections are briefly described here. + +The 'libdefaults' section contains a list of library configuration +parameters, such as the default realm and the timeout for KDC responses. +The 'realms' section contains information about specific realms, such as +where they hide their KDC. This section serves the same purpose as the +Kerberos 4 'krb.conf' file, but can contain more information. Finally +the 'domain_realm' section contains a list of mappings from domains to +realms, equivalent to the Kerberos 4 'krb.realms' file. + +To continue with the realm setup, you will have to create a +configuration file, with contents similar to the following. + + [libdefaults] + default_realm = MY.REALM + [realms] + MY.REALM = { + kdc = my.kdc my.slave.kdc + kdc = my.third.kdc + kdc = 130.237.237.17 + kdc = [2001:6b0:1:ea::100]:88 + } + [domain_realm] + .my.domain = MY.REALM + + +If you use a realm name equal to your domain name, you can omit the +'libdefaults', and 'domain_realm', sections. If you have a DNS +SRV-record for your realm, or your Kerberos server has DNS CNAME +'kerberos.my.realm', you can omit the 'realms' section too. + +If you want to use a different configuration file then the default you +can point a file with the environment variable 'KRB5_CONFIG'. + + env KRB5_CONFIG=$HOME/etc/krb5.conf kinit user@REALM + + +File: heimdal.info, Node: Creating the database, Next: Modifying the database, Prev: Configuration file, Up: Setting up a realm + +4.2 Creating the database +========================= + +The database library will look for the database in the directory +'/var/heimdal', so you should probably create that directory. Make sure +the directory has restrictive permissions. + + # mkdir /var/heimdal + # chmod og-rwx /var/heimdal + +Heimdal supports various database backends: lmdb (LMDB), db3 (Berkeley +DB 3.x, 4.x, or 5.x), db1 (Berkeley DB 2.x), sqlite (SQLite3), and ldap +(LDAP). The default is db3, and is selected at build time from one of +lmdb, db3, or db1. + +These defaults can be overriden in the 'database' key in the 'kdc' +section of the configuration. + + [kdc] + database = { + dbname = lmdb:/path/to/db-file + realm = REALM + acl_file = /path/to/kadmind.acl + mkey_file = /path/to/mkey + log_file = /path/to/iprop-log-file + } + +To use LDAP, see *Note Using LDAP to store the database::. + +The keys of all the principals are stored in the database. If you +choose to, these can be encrypted with a master key. You do not have to +remember this key (or password), but just to enter it once and it will +be stored in a file ('/var/heimdal/m-key'). If you want to have a +master key, run 'kstash' to create this master key: + + # kstash + Master key: + Verifying password - Master key: + +If you want to generate a random master key you can use the +'--random-key' flag to kstash. This will make sure you have a good key +on which attackers can't do a dictionary attack. + +If you have a master key, make sure you make a backup of your master key +file; without it backups of the database are of no use. + +To initialise the database use the 'kadmin' program, with the '-l' +option (to enable local database mode). First issue a 'init MY.REALM' +command. This will create the database and insert default principals +for that realm. You can have more than one realm in one database, so +'init' does not destroy any old database. + +Before creating the database, 'init' will ask you some questions about +maximum ticket lifetimes. + +After creating the database you should probably add yourself to it. You +do this with the 'add' command. It takes as argument the name of a +principal. The principal should contain a realm, so if you haven't set +up a default realm, you will need to explicitly include the realm. + + # kadmin -l + kadmin> init MY.REALM + Realm max ticket life [unlimited]: + Realm max renewable ticket life [unlimited]: + kadmin> add me + Max ticket life [unlimited]: + Max renewable life [unlimited]: + Attributes []: + Password: + Verifying password - Password: + +Now start the KDC and try getting a ticket. + + # kdc & + # kinit me + me@MY.REALMS's Password: + # klist + Credentials cache: /tmp/krb5cc_0 + Principal: me@MY.REALM + + Issued Expires Principal + Aug 25 07:25:55 Aug 25 17:25:55 krbtgt/MY.REALM@MY.REALM + +If you are curious you can use the 'dump' command to list all the +entries in the database. It should look something similar to the +following example (note that the entries here are truncated for +typographical reasons): + + kadmin> dump + me@MY.REALM 1:0:1:0b01d3cb7c293b57:-:0:7:8aec316b9d1629e3baf8 ... + kadmin/admin@MY.REALM 1:0:1:e5c8a2675b37a443:-:0:7:cb913ebf85 ... + krbtgt/MY.REALM@MY.REALM 1:0:1:52b53b61c875ce16:-:0:7:c8943be ... + kadmin/changepw@MY.REALM 1:0:1:f48c8af2b340e9fb:-:0:7:e3e6088 ... + + +File: heimdal.info, Node: Modifying the database, Next: Checking the setup, Prev: Creating the database, Up: Setting up a realm + +4.3 Modifying the database +========================== + +All modifications of principals are done with with kadmin. + +A principal has several attributes and lifetimes associated with it. + +Principals are added, renamed, modified, and deleted with the kadmin +commands 'add', 'rename', 'modify', 'delete'. Both interactive editing +and command line flags can be used (use -help to list the available +options). + +There are different kinds of types for the fields in the database; +attributes, absolute time times and relative times. + +4.3.1 Attributes +---------------- + +When doing interactive editing, attributes are listed with '?'. + +The attributes are given in a comma (',') separated list. Attributes +are removed from the list by prefixing them with '-'. + + kadmin> modify me + Max ticket life [1 day]: + Max renewable life [1 week]: + Principal expiration time [never]: + Password expiration time [never]: + Attributes [disallow-renewable]: requires-pre-auth,-disallow-renewable + kadmin> get me + Principal: me@MY.REALM + [...] + Attributes: requires-pre-auth + +4.3.2 Absolute times +-------------------- + +The format for absolute times are any of the following: + + never + now + YYYY-mm-dd + YYYY-mm-dd HH:MM:SS + +4.3.3 Relative times +-------------------- + +The format for relative times are any of the following combined: + + N year + M month + O day + P hour + Q minute + R second + + +File: heimdal.info, Node: Checking the setup, Next: keytabs, Prev: Modifying the database, Up: Setting up a realm + +4.4 Checking the setup +====================== + +There are two tools that can check the consistency of the Kerberos +configuration file and the Kerberos database. + +The Kerberos configuration file is checked using 'verify_krb5_conf'. +The tool checks for common errors, but commonly there are several +uncommon configuration entries that are never added to the tool and thus +generates "unknown entry" warnings. This is usually nothing to worry +about. + +The database check is built into the kadmin tool. It will check for +common configuration error that will cause problems later. Common check +are for existence and flags on important principals. The database check +by run by the following command : + + kadmin -l check REALM.EXAMPLE.ORG + + +File: heimdal.info, Node: keytabs, Next: Remote administration, Prev: Checking the setup, Up: Setting up a realm + +4.5 keytabs +=========== + +To extract a service ticket from the database and put it in a keytab, +you need to first create the principal in the database with 'add' (using +the '--random-key' flag to get a random key) and then extract it with +'ext_keytab'. + + kadmin> add --random-key host/my.host.name + Max ticket life [unlimited]: + Max renewable life [unlimited]: + Attributes []: + kadmin> ext host/my.host.name + kadmin> exit + # ktutil list + Version Type Principal + 1 des-cbc-md5 host/my.host.name@MY.REALM + 1 des-cbc-md4 host/my.host.name@MY.REALM + 1 des-cbc-crc host/my.host.name@MY.REALM + 1 des3-cbc-sha1 host/my.host.name@MY.REALM + + +File: heimdal.info, Node: Remote administration, Next: Password changing, Prev: keytabs, Up: Setting up a realm + +4.6 Remote administration +========================= + +The administration server, 'kadmind', can be started by 'inetd' (which +isn't recommended) or run as a normal daemon. If you want to start it +from 'inetd' you should add a line similar to the one below to your +'/etc/inetd.conf'. + + kerberos-adm stream tcp nowait root /usr/heimdal/libexec/kadmind kadmind + +You might need to add 'kerberos-adm' to your '/etc/services' as +'749/tcp'. + +Access to the administration server is controlled by an ACL file, +(default '/var/heimdal/kadmind.acl'.) The file has the following +syntax: + principal [priv1,priv2,...] [glob-pattern] + +The matching is from top to bottom for matching principals (and if +given, glob-pattern). When there is a match, the access rights of that +line are applied. + +The privileges you can assign to a principal are: 'add', +'change-password' (or 'cpw' for short), 'delete', 'get', 'list', and +'modify', or the special privilege 'all'. All of these roughly +correspond to the different commands in 'kadmin'. + +If a GLOB-PATTERN is given on a line, it restricts the access rights for +the principal to only apply for subjects that match the pattern. The +patterns are of the same type as those used in shell globbing, see +fnmatch(3). + +In the example below 'lha/admin' can change every principal in the +database. 'jimmy/admin' can only modify principals that belong to the +realm 'E.KTH.SE'. 'mille/admin' is working at the help desk, so he +should only be able to change the passwords for single component +principals (ordinary users). He will not be able to change any '/admin' +principal. + + lha/admin@E.KTH.SE all + jimmy/admin@E.KTH.SE all *@E.KTH.SE + jimmy/admin@E.KTH.SE all */*@E.KTH.SE + mille/admin@E.KTH.SE change-password *@E.KTH.SE + + +File: heimdal.info, Node: Password changing, Next: Testing clients and servers, Prev: Remote administration, Up: Setting up a realm + +4.7 Password changing +===================== + +To allow users to change their passwords, you should run 'kpasswdd'. It +is not run from 'inetd'. + +You might need to add 'kpasswd' to your '/etc/services' as '464/udp'. +If your realm is not setup to use DNS, you might also need to add a +'kpasswd_server' entry to the realm configuration in '/etc/krb5.conf' on +client machines: + + [realms] + MY.REALM = { + kdc = my.kdc my.slave.kdc + kpasswd_server = my.kdc + } + +4.7.1 Password quality assurance +-------------------------------- + +It is important that users have good passwords, both to make it harder +to guess them and to avoid off-line attacks (although pre-authentication +provides some defence against off-line attacks). To ensure that the +users choose good passwords, you can enable password quality controls in +'kpasswdd' and 'kadmind'. The controls themselves are done in a shared +library or an external program that is used by 'kpasswdd'. To configure +in these controls, add lines similar to the following to your +'/etc/krb5.conf': + + [password_quality] + policies = external-check builtin:minimum-length modulename:policyname + external_program = /bin/false + policy_libraries = LIBRARY1.SO LIBRARY2.SO + +In '[password_quality]policies' the module name is optional if the +policy name is unique in all modules (members of 'policy_libraries'). +All built-in policies can be qualified with a module name of 'builtin' +to unambiguously specify the built-in policy and not a policy by the +same name from a loaded module. + +The built-in policies are + + * external-check + + Executes the program specified by + '[password_quality]external_program'. + + A number of key/value pairs are passed as input to the program, one + per line, ending with the string 'end'. The key/value lines are of + the form + principal: PRINCIPAL + new-password: PASSWORD + where PASSWORD is the password to check for the previous PRINCIPAL. + + If the external application approves the password, it should return + 'APPROVED' on standard out and exit with exit code 0. If it + doesn't approve the password, an one line error message explaining + the problem should be returned on standard error and the + application should exit with exit code 0. In case of a fatal + error, the application should, if possible, print an error message + on standard error and exit with a non-zero error code. + + * minimum-length + + The minimum length password quality check reads the configuration + file stanza '[password_quality]min_length' and requires the + password to be at least this length. + + * character-class + + The character-class password quality check reads the configuration + file stanza '[password_quality]min_classes'. The policy requires + the password to have characters from at least that many character + classes. Default value if not given is 3. + + The four different characters classes are, uppercase, lowercase, + number, special characters. + +If you want to write your own shared object to check password policies, +see the manual page 'kadm5_pwcheck(3)'. + +Code for a password quality checking function that uses the cracklib +library can be found in 'lib/kadm5/sample_password_check.c' in the +source code distribution. It requires that the cracklib library be +built with the patch available at +. + +A sample policy external program is included in +'lib/kadm5/check-cracklib.pl'. + +If no password quality checking function is configured, the only check +performed is that the password is at least six characters long. + +To check the password policy settings, use the command +'verify-password-quality' in 'kadmin' program. The password +verification is only performed locally, on the client. It may be +convenient to set the environment variable 'KRB5_CONFIG' to point to a +test version of 'krb5.conf' while you're testing the +'[password_quality]' stanza that way. + + +File: heimdal.info, Node: Testing clients and servers, Next: Slave Servers, Prev: Password changing, Up: Setting up a realm + +4.8 Testing clients and servers +=============================== + +Now you should be able to run all the clients and servers. Refer to the +appropriate man pages for information on how to use them. + + +File: heimdal.info, Node: Slave Servers, Next: Incremental propagation, Prev: Testing clients and servers, Up: Setting up a realm + +4.9 Slave servers, Incremental propagation, Testing clients and servers, Setting up a realm +=========================================================================================== + +It is desirable to have at least one backup (slave) server in case the +master server fails. It is possible to have any number of such slave +servers but more than three usually doesn't buy much more redundancy. + +All Kerberos servers for a realm must have the same database so that +they present the same service to the users. The 'hprop' program, +running on the master, will propagate the database to the slaves, +running 'hpropd' processes. + +Every slave needs a database directory, the master key (if it was used +for the database) and a keytab with the principal 'hprop/HOSTNAME'. Add +the principal with the 'ktutil' command and start 'hpropd', as follows: + + slave# ktutil get -p foo/admin hprop/`hostname` + slave# mkdir /var/heimdal + slave# hpropd + +The master will use the principal 'kadmin/hprop' to authenticate to the +slaves. This principal should be added when running 'kadmin -l init' +but if you do not have it in your database for whatever reason, please +add it with 'kadmin -l add'. + +Then run 'hprop' on the master: + + master# hprop slave + +This was just an hands-on example to make sure that everything was +working properly. Doing it manually is of course the wrong way, and to +automate this you will want to start 'hpropd' from 'inetd' on the +slave(s) and regularly run 'hprop' on the master to regularly propagate +the database. Starting the propagation once an hour from 'cron' is +probably a good idea. + + +File: heimdal.info, Node: Incremental propagation, Next: Encryption types and salting, Prev: Slave Servers, Up: Setting up a realm + +4.10 Incremental propagation +============================ + +There is also a newer mechanism for doing incremental propagation in +Heimdal. Instead of sending the whole database regularly, it sends the +changes as they happen on the master to the slaves. The master keeps +track of all the changes by assigning a version number to every change +to the database. The slaves know which was the latest version they saw +and in this way it can be determined if they are in sync or not. A log +of all the changes is kept on the master, and when a slave is at an +older version than the oldest one in the log, the whole database has to +be sent. + +Protocol-wise, all the slaves connect to the master and as a greeting +tell it the latest version that they have ('IHAVE' message). The master +then responds by sending all the changes between that version and the +current version at the master (a series of 'FORYOU' messages) or the +whole database in a 'TELLYOUEVERYTHING' message. There is also a +keep-alive protocol that makes sure all slaves are up and running. + +In addition on listening on the network to get connection from new +slaves, the ipropd-master also listens on a status unix socket. kadmind +and kpasswdd both open that socket when a transation is done and written +a notification to the socket. That cause ipropd-master to check for new +version in the log file. As a fallback in case a notification is lost +by the unix socket, the log file is checked after 30 seconds of no +event. + +4.10.1 Configuring incremental propagation +------------------------------------------ + +The program that runs on the master is 'ipropd-master' and all clients +run 'ipropd-slave'. + +Create the file '/var/heimdal/slaves' on the master containing all the +slaves that the database should be propagated to. Each line contains +the full name of the principal (for example +'iprop/hemligare.foo.se@FOO.SE'). + +You should already have 'iprop/tcp' defined as 2121, in your +'/etc/services'. Otherwise, or if you need to use a different port for +some peculiar reason, you can use the '--port' option. This is useful +when you have multiple realms to distribute from one server. + +Then you need to create those principals that you added in the +configuration file. Create one 'iprop/hostname' for the master and for +every slave. + + master# /usr/heimdal/sbin/ktutil get iprop/`hostname` + + slave# /usr/heimdal/sbin/ktutil get iprop/`hostname` + +The next step is to start the 'ipropd-master' process on the master +server. The 'ipropd-master' listens on the UNIX domain socket +'/var/heimdal/signal' to know when changes have been made to the +database so they can be propagated to the slaves. There is also a +safety feature of testing the version number regularly (every 30 +seconds) to see if it has been modified by some means that do not raise +this signal. Then, start 'ipropd-slave' on all the slaves: + + master# /usr/heimdal/libexec/ipropd-master & + slave# /usr/heimdal/libexec/ipropd-slave master & + +To manage the iprop log file you should use the 'iprop-log' command. +With it you can dump, truncate and replay the logfile. + +4.10.2 Status of iprop master and slave +--------------------------------------- + +Both the master and slave provides status of the world as they see it. + +The master write outs the current status of the slaves, last seen and +their version number in '/var/heimdal/slaves-stats'. + +The slave write out the current status in +'/var/heimdal/ipropd-slave-status'. + +These locations can be changed with command line options, and in the +case of 'ipropd_master', the configuration file. + + +File: heimdal.info, Node: Encryption types and salting, Next: Credential cache server - KCM, Prev: Incremental propagation, Up: Setting up a realm + +4.11 Encryption types and salting +================================= + +The encryption types that the KDC is going to assign by default is +possible to change. Since the keys used for user authentication is +salted the encryption types are described together with the salt +strings. + +Salting is used to make it harder to pre-calculate all possible keys. +Using a salt increases the search space to make it almost impossible to +pre-calculate all keys. Salting is the process of mixing a public +string (the salt) with the password, then sending it through an +encryption type specific string-to-key function that will output the +fixed size encryption key. + +In Kerberos 5 the salt is determined by the encryption type, except in +some special cases. + +In 'des' there is the Kerberos 4 salt (none at all) or the afs-salt +(using the cell (realm in AFS lingo)). + +In 'arcfour' (the encryption type that Microsoft Windows 2000 uses) +there is no salt. This is to be compatible with NTLM keys in Windows NT +4. + +'[kadmin]default_keys' in 'krb5.conf' controls what salting to use. + +The syntax of '[kadmin]default_keys' is +'[etype:]salt-type[:salt-string]'. 'etype' is the encryption type +(des-cbc-crc, arcfour-hmac-md5, aes256-cts-hmac-sha1-96), 'salt-type' is +the type of salt (pw-salt or afs3-salt), and the salt-string is the +string that will be used as salt (remember that if the salt is +appended/prepended, the empty salt "" is the same thing as no salt at +all). + +Common types of salting include + + * 'v4' (or 'des:pw-salt:') + + The Kerberos 4 salting is using no salt at all. Reason there is + colon at the end of the salt string is that it makes the salt the + empty string (same as no salt). + + * 'v5' (or 'pw-salt') + + 'pw-salt' uses the default salt for each encryption type is + specified for. If the encryption type 'etype' isn't given, all + default encryption will be used. + + * 'afs3-salt' + + 'afs3-salt' is the salt that is used with Transarc kaserver. It's + the cell name appended to the password. + + +File: heimdal.info, Node: Credential cache server - KCM, Next: Cross realm, Prev: Encryption types and salting, Up: Setting up a realm + +4.12 Credential cache server - KCM +================================== + +When KCM running is easy for users to switch between different kerberos +principals using 'kswitch' or built in support in application, like +OpenSSH's GSSAPIClientIdentity. + +Other advantages are that there is the long term credentials are not +written to disk and on reboot the credential is removed when kcm process +stopps running. + +Configure the system startup script to start the kcm process, +'/usr/heimdal/libexec/kcm' and then configure the system to use kcm in +'krb5.conf'. + + [libdefaults] + default_cc_type = KCM + +Now when you run 'kinit' it doesn't overwrite your existing credentials +but rather just add them to the set of credentials. 'klist -l' lists +the credentials and the star marks the default credential. + + $ kinit lha@KTH.SE + lha@KTH.SE's Password: + $ klist -l + Name Cache name Expires + lha@KTH.SE 0 Nov 22 23:09:40 * + lha@SU.SE Initial default ccache Nov 22 14:14:24 + +When switching between credentials you can use 'kswitch'. + + $ kswitch -i + Principal + 1 lha@KTH.SE + 2 lha@SU.SE + Select number: 2 + +After switching, a new set of credentials are used as default. + + $ klist -l + Name Cache name Expires + lha@SU.SE Initial default ccache Nov 22 14:14:24 * + lha@KTH.SE 0 Nov 22 23:09:40 + +Som applications, like openssh with Simon Wilkinsons patch applied, +support specifiying that credential to use. The example below will +login to the host computer.kth.se using lha@KTH.SE (not the current +default credential). + + $ ssh \ + -o GSSAPIAuthentication=yes \ + -o GSSAPIKeyExchange=yes \ + -o GSSAPIClientIdentity=lha@KTH.SE \ + computer.kth.se + + +File: heimdal.info, Node: Cross realm, Next: Transit policy, Prev: Credential cache server - KCM, Up: Setting up a realm + +4.13 Cross realm +================ + +Suppose you reside in the realm 'MY.REALM', how do you authenticate to a +server in 'OTHER.REALM'? Having valid tickets in 'MY.REALM' allows you +to communicate with Kerberised services in that realm. However, the +computer in the other realm does not have a secret key shared with the +Kerberos server in your realm. + +It is possible to share keys between two realms that trust each other. +When a client program, such as 'telnet' or 'ssh', finds that the other +computer is in a different realm, it will try to get a ticket granting +ticket for that other realm, but from the local Kerberos server. With +that ticket granting ticket, it will then obtain service tickets from +the Kerberos server in the other realm. + +For a two way trust between 'MY.REALM' and 'OTHER.REALM' add the +following principals to each realm. The principals should be +'krbtgt/OTHER.REALM@MY.REALM' and 'krbtgt/MY.REALM@OTHER.REALM' in +'MY.REALM', and 'krbtgt/MY.REALM@OTHER.REALM' and +'krbtgt/OTHER.REALM@MY.REALM'in 'OTHER.REALM'. + +In Kerberos 5 the trust can be configured to be one way. So that users +from 'MY.REALM' can authenticate to services in 'OTHER.REALM', but not +the opposite. In the example above, the 'krbtgt/MY.REALM@OTHER.REALM' +then should be removed. + +The two principals must have the same key, key version number, and the +same set of encryption types. Remember to transfer the two keys in a +safe manner. + + vr$ klist + Credentials cache: FILE:/tmp/krb5cc_913.console + Principal: lha@E.KTH.SE + + Issued Expires Principal + May 3 13:55:52 May 3 23:55:54 krbtgt/E.KTH.SE@E.KTH.SE + + vr$ telnet -l lha hummel.it.su.se + Trying 2001:6b0:5:1095:250:fcff:fe24:dbf... + Connected to hummel.it.su.se. + Escape character is '^]'. + Waiting for encryption to be negotiated... + [ Trying mutual KERBEROS5 (host/hummel.it.su.se@SU.SE)... ] + [ Kerberos V5 accepts you as ``lha@E.KTH.SE'' ] + Encryption negotiated. + Last login: Sat May 3 14:11:47 from vr.l.nxs.se + hummel$ exit + + vr$ klist + Credentials cache: FILE:/tmp/krb5cc_913.console + Principal: lha@E.KTH.SE + + Issued Expires Principal + May 3 13:55:52 May 3 23:55:54 krbtgt/E.KTH.SE@E.KTH.SE + May 3 13:55:56 May 3 23:55:54 krbtgt/SU.SE@E.KTH.SE + May 3 14:10:54 May 3 23:55:54 host/hummel.it.su.se@SU.SE + + + +File: heimdal.info, Node: Transit policy, Next: Setting up DNS, Prev: Cross realm, Up: Setting up a realm + +4.14 Transit policy +=================== + +Under some circumstances, you may not wish to set up direct cross-realm +trust with every realm to which you wish to authenticate or from which +you wish to accept authentications. Kerberos supports multi-hop +cross-realm trust where a client principal in realm A authenticates to a +service in realm C through a realm B with which both A and C have +cross-realm trust relationships. In this situation, A and C need not +set up cross-realm principals between each other. + +If you want to use cross-realm authentication through an intermediate +realm, it must be explicitly allowed by either the KDCs for the realm to +which the client is authenticating (in this case, realm C), or the +server receiving the request. This is done in 'krb5.conf' in the +'[capaths]' section. + +In addition, the client in realm A need to be configured to know how to +reach realm C via realm B. This can be done either on the client or via +KDC configuration in the KDC for realm A. + +4.14.1 Allowing cross-realm transits +------------------------------------ + +When the ticket transits through a realm to another realm, the +destination realm adds its peer to the "transited-realms" field in the +ticket. The field is unordered, since there is no way to know if know +if one of the transited-realms changed the order of the list. For the +authentication to be accepted by the final destination realm, all of the +transited realms must be listed as trusted in the '[capaths]' +configuration, either in the KDC for the destination realm or on the +server receiving the authentication. + +The syntax for '[capaths]' section is: + + [capaths] + CLIENT-REALM = { + SERVER-REALM = PERMITTED-CROSS-REALMS ... + } + +In the following example, the realm 'STACKEN.KTH.SE' only has direct +cross-realm set up with 'KTH.SE'. 'KTH.SE' has direct cross-realm set +up with 'STACKEN.KTH.SE' and 'SU.SE'. 'DSV.SU.SE' only has direct +cross-realm set up with 'SU.SE'. The goal is to allow principals in the +'DSV.SU.SE' or 'SU.SE' realms to authenticate to services in +'STACKEN.KTH.SE'. This is done with the following '[capaths]' entry on +either the server accepting authentication or on the KDC for +'STACKEN.KTH.SE'. + + [capaths] + SU.SE = { + STACKEN.KTH.SE = KTH.SE + } + DSV.SU.SE = { + STACKEN.KTH.SE = SU.SE KTH.SE + } + +The first entry allows cross-realm authentication from clients in +'SU.SE' transiting through 'KTH.SE' to 'STACKEN.KTH.SE'. The second +entry allows cross-realm authentication from clients in 'DSV.SU.SE' +transiting through both 'SU.SE' and 'KTH.SE' to 'STACKEN.KTH.SE'. + +Be careful of which realm goes where; it's easy to put realms in the +wrong place. The block is tagged with the client realm (the realm of +the principal authenticating), and the realm before the equal sign is +the final destination realm: the realm to which the client is +authenticating. After the equal sign go all the realms that the client +transits through. + +The order of the 'PERMITTED-CROSS-REALMS' is not important when doing +transit cross realm verification. + +4.14.2 Configuring client cross-realm transits +---------------------------------------------- + +The '[capaths]' section is also used for another purpose: to tell +clients which realm to transit through to reach a realm with which their +local realm does not have cross-realm trust. This can be done by either +putting a '[capaths]' entry in the configuration of the client or by +putting the entry in the configuration of the KDC for the client's local +realm. In the latter case, the KDC will then hand back a referral to +the client when the client requests a cross-realm ticket to the +destination realm, telling the client to try to go through an +intermediate realm. + +For client configuration, the order of 'PERMITTED-CROSS-REALMS' is +significant, since only the first realm in this section (after the equal +sign) is used by the client. + +For example, again consider the '[capaths]' entry above for the case of +a client in the 'SU.SE' realm, and assume that the client or the 'SU.SE' +KDC has that '[capaths]' entry. If the client attempts to authenticate +to a service in the 'STACKEN.KTH.SE' realm, that entry says to first +authenticate cross-realm to the 'KTH.SE' realm (the first realm listed +in the 'PERMITTED-CROSS-REALMS' section), and then from there to +'STACKEN.KTH.SE'. + +Each entry in '[capaths]' can only give the next hop, since only the +first realm in 'PERMITTED-CROSS-REALMS' is used. If, for instance, a +client in 'DSV.SU.SE' had a '[capaths]' configuration as above but +without the first block for 'SU.SE', they would not be able to reach +'STACKEN.KTH.SE'. They would get as far as 'SU.SE' based on the +'DSV.SU.SE' entry in '[capaths]' and then attempt to go directly from +there to 'STACKEN.KTH.SE' and get stuck (unless, of course, the 'SU.SE' +KDC had the additional entry required to tell the client to go through +'KTH.SE'). + +4.14.3 Active Directory forest example +-------------------------------------- + +One common place where a '[capaths]' configuration is desirable is with +Windows Active Directory forests. One common Active Directory +configuration is to have one top-level Active Directory realm but then +divide systems, services, and users into child realms (perhaps based on +organizational unit). One generally establishes cross-realm trust only +with the top-level realm, and then uses transit policy to permit +authentications to and from the child realms. + +For example, suppose an organization has a Heimdal realm 'EXAMPLE.COM', +a Windows Active Directory realm 'WIN.EXAMPLE.COM', and then child +Active Directory realms 'ENGR.WIN.EXAMPLE.COM' and +'SALES.WIN.EXAMPLE.COM'. The goal is to allow users in any of these +realms to authenticate to services in any of these realms. The +'EXAMPLE.COM' KDC (and possibly client) configuration should therefore +contain a '[capaths]' section as follows: + + [capaths] + ENGR.WIN.EXAMPLE.COM = { + EXAMPLE.COM = WIN.EXAMPLE.COM + } + SALES.WIN.EXAMPLE.COM = { + EXAMPLE.COM = WIN.EXAMPLE.COM + } + EXAMPLE.COM = { + ENGR.WIN.EXAMPLE.COM = WIN.EXAMPLE.COM + SALES.WIN.EXAMPLE.COM = WIN.EXAMPLE.COM + } + +The first two blocks allow clients in the 'ENGR.WIN.EXAMPLE.COM' and +'SALES.WIN.EXAMPLE.COM' realms to authenticate to services in the +'EXAMPLE.COM' realm. The third block tells the client (or tells the KDC +to tell the client via referrals) to transit through 'WIN.EXAMPLE.COM' +to reach these realms. Both sides of the configuration are needed for +bi-directional transited cross-realm authentication. + + +File: heimdal.info, Node: Setting up DNS, Next: Using LDAP to store the database, Prev: Transit policy, Up: Setting up a realm + +4.15 Setting up DNS +=================== + +4.15.1 Using DNS to find KDC +---------------------------- + +If there is information about where to find the KDC or kadmind for a +realm in the 'krb5.conf' for a realm, that information will be +preferred, and DNS will not be queried. + +Heimdal will try to use DNS to find the KDCs for a realm. First it will +try to find a 'SRV' resource record (RR) for the realm. If no SRV RRs +are found, it will fall back to looking for an 'A' RR for a machine +named kerberos.REALM, and then kerberos-1.REALM, etc + +Adding this information to DNS minimises the client configuration (in +the common case, resulting in no configuration needed) and allows the +system administrator to change the number of KDCs and on what machines +they are running without caring about clients. + +The downside of using DNS is that the client might be fooled to use the +wrong server if someone fakes DNS replies/data, but storing the IP +addresses of the KDC on all the clients makes it very hard to change the +infrastructure. + +An example of the configuration for the realm 'EXAMPLE.COM': + + + $ORIGIN example.com. + _kerberos._tcp SRV 10 1 88 kerberos.example.com. + _kerberos._udp SRV 10 1 88 kerberos.example.com. + _kerberos._tcp SRV 10 1 88 kerberos-1.example.com. + _kerberos._udp SRV 10 1 88 kerberos-1.example.com. + _kpasswd._udp SRV 10 1 464 kerberos.example.com. + _kerberos-adm._tcp SRV 10 1 749 kerberos.example.com. + + +More information about DNS SRV resource records can be found in RFC-2782 +(A DNS RR for specifying the location of services (DNS SRV)). + +4.15.2 Using DNS to map hostname to Kerberos realm +-------------------------------------------------- + +Heimdal also supports a way to lookup a realm from a hostname. This to +minimise configuration needed on clients. Using this has the drawback +that clients can be redirected by an attacker to realms within the same +cross realm trust and made to believe they are talking to the right +server (since Kerberos authentication will succeed). + +An example configuration that informs clients that for the realms +it.example.com and srv.example.com, they should use the realm +EXAMPLE.COM: + + + $ORIGIN example.com. + _kerberos.it TXT "EXAMPLE.COM" + _kerberos.srv TXT "EXAMPLE.COM" + + + +File: heimdal.info, Node: Using LDAP to store the database, Next: Providing Kerberos credentials to servers and programs, Prev: Setting up DNS, Up: Setting up a realm + +4.16 Using LDAP to store the database +===================================== + +This document describes how to install the LDAP backend for Heimdal. +Note that before attempting to configure such an installation, you +should be aware of the implications of storing private information (such +as users' keys) in a directory service primarily designed for public +information. Nonetheless, with a suitable authorisation policy, it is +possible to set this up in a secure fashion. A knowledge of LDAP, +Kerberos, and C is necessary to install this backend. The HDB schema +was devised by Leif Johansson. + +This assumes, OpenLDAP 2.3 or later. + +Requirements: + + * A current release of Heimdal, configured with + '--with-openldap=/usr/local' (adjust according to where you have + installed OpenLDAP). + + You can verify that you manage to configure LDAP support by running + 'kdc --builtin-hdb', and checking that 'ldap:' is one entry in the + list. + + Its also possible to configure the ldap backend as a shared module, + see option -hdb-openldap-module to configure. + + * Optionally configure OpenLDAP with '--enable-local' to enable the + local transport. + + * Add the hdb schema to the LDAP server, it's included in the + source-tree in 'lib/hdb/hdb.schema'. Example from slapd.conf: + + include /usr/local/etc/openldap/schema/hdb.schema + + * Configure the LDAP server ACLs to accept writes from clients. For + example: + + access to * + by dn.exact="uid=heimdal,dc=services,dc=example,dc=com" write + ... + + authz-regexp "gidNumber=.*\\\+uidNumber=0,cn=peercred,cn=external,cn=auth'' + "uid=heimdal,dc=services,dc=example,dc=com" + + + The sasl-regexp is for mapping between the SASL/EXTERNAL and a user + in a tree. The user that the key is mapped to should be have a + krb5Principal aux object with krb5PrincipalName set so that the + "creator" and "modifier" is right in 'kadmin'. + + Another option is to create an admins group and add the dn to that + group. + + If a non-local LDAP connection is used, the authz-regexp is not + needed as Heimdal will bind to LDAP over the network using provided + credentials. + + Since Heimdal talks to the LDAP server over a UNIX domain socket + when configured for ldapi:///, and uses external sasl + authentication, it's not possible to require security layer quality + (ssf in cyrus-sasl lingo). So that requirement has to be turned + off in OpenLDAP 'slapd' configuration file 'slapd.conf'. + + sasl-secprops minssf=0 + + * + Start 'slapd' with the local listener (as well as the default + TCP/IP listener on port 389) as follows: + + slapd -h "ldapi:/// ldap:///" + + Note: These is a bug in 'slapd' where it appears to corrupt the + krb5Key binary attribute on shutdown. This may be related to our + use of the V3 schema definition syntax instead of the old + UMich-style, V2 syntax. + + * You should specify the distinguished name under which your + principals will be stored in 'krb5.conf'. Also you need to enter + the path to the kadmin acl file: + + [kdc] + # Optional configuration + hdb-ldap-structural-object = inetOrgPerson + hdb-ldap-url = ldapi:/// (default), ldap://hostname or ldaps://hostname + hdb-ldap-secret-file = /path/to/file/containing/ldap/credentials + hdb-ldap-start-tls = false + + database = { + dbname = ldap:ou=KerberosPrincipals,dc=example,dc=com + acl_file = /path/to/kadmind.acl + mkey_file = /path/to/mkey + } + + 'mkey_file' can be excluded if you feel that you trust your ldap + directory to have the raw keys inside it. The + hdb-ldap-structural-object is not necessary if you do not need + Samba comatibility. + + If connecting to a server over a non-local transport, the + 'hdb-ldap-url' and 'hdb-ldap-secret-file' options must be provided. + The 'hdb-ldap-secret-file' must contain the bind credentials: + + [kdc] + hdb-ldap-bind-dn = uid=heimdal,dc=services,dc=example,dc=com + hdb-ldap-bind-password = secretBindPassword + + The 'hdb-ldap-secret-file' and should be protected with appropriate + file permissions + + * Once you have built Heimdal and started the LDAP server, run kadmin + (as usual) to initialise the database. Note that the instructions + for stashing a master key are as per any Heimdal installation. + + kdc# kadmin -l + kadmin> init EXAMPLE.COM + Realm max ticket life [unlimited]: + Realm max renewable ticket life [unlimited]: + kadmin> add lukeh + Max ticket life [1 day]: + Max renewable life [1 week]: + Principal expiration time [never]: + Password expiration time [never]: + Attributes []: + lukeh@EXAMPLE.COM's Password: + Verifying password - lukeh@EXAMPLE.COM's Password: + kadmin> exit + + Verify that the principal database has indeed been stored in the + directory with the following command: + + kdc# ldapsearch -L -h localhost -D cn=manager \ + -w secret -b ou=KerberosPrincipals,dc=example,dc=com \ + 'objectclass=krb5KDCEntry' + + * Now consider adding indexes to the database to speed up the access, + at least theses should be added to slapd.conf. + + index objectClass eq + index cn eq,sub,pres + index uid eq,sub,pres + index displayName eq,sub,pres + index krb5PrincipalName eq + +4.16.1 smbk5pwd overlay +----------------------- + +The smbk5pwd overlay, updates the krb5Key and krb5KeyVersionNumber +appropriately when it receives an LDAP Password change Extended +Operation: + + + +4.16.2 Troubleshooting guide +---------------------------- + + + +4.16.3 Using Samba LDAP password database +----------------------------------------- + +The Samba domain and the Kerberos realm can have different names since +arcfour's string to key functions principal/realm independent. So now +will be your first and only chance name your Kerberos realm without +needing to deal with old configuration files. + +First, you should set up Samba and get that working with LDAP backend. + +Now you can proceed as in *Note Using LDAP to store the database::. +Heimdal will pick up the Samba LDAP entries if they are in the same +search space as the Kerberos entries. + + +File: heimdal.info, Node: Providing Kerberos credentials to servers and programs, Next: Setting up PK-INIT, Prev: Using LDAP to store the database, Up: Setting up a realm + +4.17 Providing Kerberos credentials to servers and programs +=========================================================== + +Some services require Kerberos credentials when they start to make +connections to other services or need to use them when they have +started. + +The easiest way to get tickets for a service is to store the key in a +keytab. Both ktutil get and kadmin ext can be used to get a keytab. +ktutil get is better in that way it changes the key/password for the +user. This is also the problem with ktutil. If ktutil is used for the +same service principal on several hosts, they keytab will only be useful +on the last host. In that case, run the extract command on one host and +then securely copy the keytab around to all other hosts that need it. + + host# ktutil -k /etc/krb5-service.keytab \ + get -p lha/admin@EXAMPLE.ORG service-principal@EXAMPLE.ORG + lha/admin@EXAMPLE.ORG's Password: + +To get a Kerberos credential file for the service, use kinit in the +'--keytab' mode. This will not ask for a password but instead fetch the +key from the keytab. + + service@host$ kinit --cache=/var/run/service_krb5_cache \ + --keytab=/etc/krb5-service.keytab \ + service-principal@EXAMPLE.ORG + +Long running services might need credentials longer then the expiration +time of the tickets. kinit can run in a mode that refreshes the tickets +before they expire. This is useful for services that write into AFS and +other distributed file systems using Kerberos. To run the long running +script, just append the program and arguments (if any) after the +principal. kinit will stop refreshing credentials and remove the +credentials when the script-to-start-service exits. + + service@host$ kinit --cache=/var/run/service_krb5_cache \ + --keytab=/etc/krb5-service.keytab \ + service-principal@EXAMPLE.ORG \ + script-to-start-service argument1 argument2 + + +File: heimdal.info, Node: Setting up PK-INIT, Next: Debugging Kerberos problems, Prev: Providing Kerberos credentials to servers and programs, Up: Setting up a realm + +4.18 Setting up PK-INIT +======================= + +PK-INIT leverages an existing PKI (public key infrastructure), using +certificates to get the initial ticket (usually the krbtgt +ticket-granting ticket). + +To use PK-INIT you must first have a PKI. If you don't have one, it is +time to create it. You should first read the whole current chapter of +the document to see the requirements imposed on the CA software. + +A mapping between the PKI certificate and what principals that +certificate is allowed to use must exist. There are several ways to do +this. The administrator can use a configuration file, store the +principal in the SubjectAltName extension of the certificate, or store +the mapping in the principals entry in the kerberos database. + +4.19 Certificates +================= + +This and following subsection documents the requirements on the KDC and +client certificates and the format used in the id-pkinit-san OtherName +extension. + +On how to create certificates, you should read *note Use OpenSSL to +create certificates::. + +4.19.1 KDC certificate +---------------------- + +The certificate for the KDC has several requirements. + +First, the certificate should have an Extended Key Usage (EKU) +id-pkkdcekuoid (1.3.6.1.5.2.3.5) set. Second, there must be a +subjectAltName otherName using OID id-pkinit-san (1.3.6.1.5.2.2) in the +type field and a DER encoded KRB5PrincipalName that matches the name of +the TGS of the target realm. Also, if the certificate has a +nameConstraints extension with a Generalname with dNSName or iPAdress, +it must match the hostname or adress of the KDC. + +The client is not required by the standard to check the server +certificate for this information if the client has external information +confirming which certificate the KDC is supposed to be using. However, +adding this information to the KDC certificate removes the need to +specially configure the client to recognize the KDC certificate. + +Remember that if the client would accept any certificate as the KDC's +certificate, the client could be fooled into trusting something that +isn't a KDC and thus expose the user to giving away information (like a +password or other private information) that it is supposed to keep +secret. + +4.19.2 Client certificate +------------------------- + +The client certificate may need to have a EKU id-pkekuoid +(1.3.6.1.5.2.3.4) set depending on the configuration on the KDC. + +It possible to store the principal (if allowed by the KDC) in the +certificate and thus delegate responsibility to do the mapping between +certificates and principals to the CA. + +This behavior is controlled by KDC configuration option: + + [kdc] + pkinit_principal_in_certificate = yes + +4.19.2.1 Using KRB5PrincipalName in id-pkinit-san +................................................. + +The OtherName extension in the GeneralName is used to do the mapping +between certificate and principal. For the KDC certificate, this stores +the krbtgt principal name for that KDC. For the client certificate, this +stores the principal for which that certificate is allowed to get +tickets. + +The principal is stored in a SubjectAltName in the certificate using +OtherName. The OID in the type is id-pkinit-san. + + id-pkinit-san OBJECT IDENTIFIER ::= { iso (1) org (3) dod (6) + internet (1) security (5) kerberosv5 (2) 2 } + +The data part of the OtherName is filled with the following DER encoded +ASN.1 structure: + + KRB5PrincipalName ::= SEQUENCE { + realm [0] Realm, + principalName [1] PrincipalName + } + +where Realm and PrincipalName is defined by the Kerberos ASN.1 +specification. + +4.20 Naming certificate using hx509 +=================================== + +hx509 is the X.509 software used in Heimdal to handle certificates. +hx509 supports several different syntaxes for specifying certificate +files or formats. Several formats may be used: PEM, certificates +embedded in PKCS#12 files, certificates embedded in PKCS#11 devices, and +raw DER encoded certificates. + +Those formats may be specified as follows: + +DIR: + + DIR specifies a directory which contains certificates in the DER or + PEM format. + + The main feature of DIR is that the directory is read on demand + when iterating over certificates. This allows applications, in + some situations, to avoid having to store all certificates in + memory. It's very useful for tests that iterate over large numbers + of certificates. + + The syntax is: + + DIR:/path/to/der/files + +FILE: + + FILE: specifies a file that contains a certificate or private key. + The file can be either a PEM (openssl) file or a raw DER encoded + certificate. If it's a PEM file, it can contain several keys and + certificates and the code will try to match the private key and + certificate together. Multiple files may be specified, separated + by commas. + + It's useful to have one PEM file that contains all the trust + anchors. + + The syntax is: + + FILE:certificate.pem,private-key.key,other-cert.pem,.... + +PKCS11: + + PKCS11: is used to handle smartcards via PKCS#11 drivers, such as + soft-token, opensc, or muscle. The argument specifies a shared + object that implements the PKCS#11 API. The default is to use all + slots on the device/token. + + The syntax is: + + PKCS11:shared-object.so + +PKCS12: + + PKCS12: is used to handle PKCS#12 files. PKCS#12 files commonly + have the extension pfx or p12. + + The syntax is: + + PKCS12:/path/to/file.pfx + +4.21 Configure the Kerberos software +==================================== + +First configure the client's trust anchors and what parameters to +verify. See the subsections below for how to do that. Then, you can +use kinit to get yourself tickets. For example: + + $ kinit -C FILE:$HOME/.certs/lha.crt,$HOME/.certs/lha.key lha@EXAMPLE.ORG + Enter your private key passphrase: + : lha@nutcracker ; klist + Credentials cache: FILE:/tmp/krb5cc_19100a + Principal: lha@EXAMPLE.ORG + + Issued Expires Principal + Apr 20 02:08:08 Apr 20 12:08:08 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG + +Using PKCS#11 it can look like this instead: + + $ kinit -C PKCS11:/usr/heimdal/lib/hx509.so lha@EXAMPLE.ORG + PIN code for SoftToken (slot): + $ klist + Credentials cache: API:4 + Principal: lha@EXAMPLE.ORG + + Issued Expires Principal + Mar 26 23:40:10 Mar 27 09:40:10 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG + +4.22 Configure the client +========================= + + [appdefaults] + pkinit_anchors = FILE:/path/to/trust-anchors.pem + + [realms] + EXAMPLE.COM = { + pkinit_require_eku = true + pkinit_require_krbtgt_otherName = true + pkinit_win2k = no + pkinit_win2k_require_binding = yes + } + + +4.23 Configure the KDC +====================== + +Configuration options for the KDC. + +enable-pkinit = bool + + Enable PKINIT for this KDC. + +pkinit_identity = string + + Identity that the KDC will use when talking to clients. Mandatory. + +pkinit_anchors = string + + Trust anchors that the KDC will use when evaluating the trust of + the client certificate. Mandatory. + +pkinit_pool = strings ... + + Extra certificate the KDC will use when building trust chains if it + can't find enough certificates in the request from the client. + +pkinit_allow_proxy_certificate = bool + + Allow clients to use proxy certificates. The root certificate of + the client's End Entity certificate is used for authorisation. + +pkinit_win2k_require_binding = bool + + Require windows clients up be upgrade to not allow cut and paste + attack on encrypted data, applies to Windows XP and windows 2000 + servers. + +pkinit_principal_in_certificate = bool + + Enable the KDC to use id-pkinit-san to determine to determine the + mapping between a certificate and principal. + + [kdc] + enable-pkinit = yes + pkinit_identity = FILE:/secure/kdc.crt,/secure/kdc.key + pkinit_anchors = FILE:/path/to/trust-anchors.pem + pkinit_pool = PKCS12:/path/to/useful-intermediate-certs.pfx + pkinit_pool = FILE:/path/to/other-useful-intermediate-certs.pem + pkinit_allow_proxy_certificate = no + pkinit_win2k_require_binding = yes + pkinit_principal_in_certificate = no + +4.23.1 Using pki-mapping file +----------------------------- + +Note that the file contents are space sensitive. + + # cat /var/heimdal/pki-mapping + # comments starts with # + lha@EXAMPLE.ORG:C=SE,O=Stockholm universitet,CN=Love,UID=lha + lha@EXAMPLE.ORG:CN=Love,UID=lha + +4.23.2 Using the Kerberos database +---------------------------------- + +You can also store the subject of the certificate in the principal entry +in the kerberos database. + + kadmin modify --pkinit-acl="CN=baz,DC=test,DC=h5l,DC=se" user@REALM + +4.24 Use hxtool to create certificates +====================================== + +4.24.1 Generate certificates +---------------------------- + +First, you need to generate a CA certificate. This example creates a CA +certificate that will be valid for 10 years. + +You need to change -subject in the command below to something +appropriate for your site. + + hxtool issue-certificate \ + --self-signed \ + --issue-ca \ + --generate-key=rsa \ + --subject="CN=CA,DC=test,DC=h5l,DC=se" \ + --lifetime=10years \ + --certificate="FILE:ca.pem" + +The KDC needs to have a certificate, so generate a certificate of the +type "pkinit-kdc" and set the PK-INIT specifial SubjectAltName to the +name of the krbtgt of the realm. + +You need to change -subject and -pk-init-principal in the command below +to something appropriate for your site. + + hxtool issue-certificate \ + --ca-certificate=FILE:ca.pem \ + --generate-key=rsa \ + --type="pkinit-kdc" \ + --pk-init-principal="krbtgt/TEST.H5L.SE@TEST.H5L.SE" \ + --subject="uid=kdc,DC=test,DC=h5l,DC=se" \ + --certificate="FILE:kdc.pem" + +The users also needs to have certificates. For your first client, +generate a certificate of type "pkinit-client". The client doesn't need +to have the PK-INIT SubjectAltName set; you can have the Subject DN in +the ACL file (pki-mapping) instead. + +You need to change -subject and -pk-init-principal in the command below +to something appropriate for your site. You can omit -pk-init-principal +if you're going to use the ACL file instead. + + hxtool issue-certificate \ + --ca-certificate=FILE:ca.pem \ + --generate-key=rsa \ + --type="pkinit-client" \ + --pk-init-principal="lha@TEST.H5L.SE" \ + --subject="uid=lha,DC=test,DC=h5l,DC=se" \ + --certificate="FILE:user.pem" + +4.24.2 Validate the certificate +------------------------------- + +hxtool also contains a tool that will validate certificates according to +rules from the PKIX document. These checks are not complete, but they +provide a good test of whether you got all of the basic bits right in +your certificates. + + hxtool validate FILE:user.pem + +4.25 Use OpenSSL to create certificates +======================================= + +This section tries to give the CA owners hints how to create +certificates using OpenSSL (or CA software based on OpenSSL). + +4.25.1 Using OpenSSL to create certificates with krb5PrincipalName +------------------------------------------------------------------ + +To make OpenSSL create certificates with krb5PrincipalName, use an +'openssl.cnf' as described below. To see a complete example of creating +client and KDC certificates, see the test-data generation script +'lib/hx509/data/gen-req.sh' in the source-tree. The certicates it +creates are used to test the PK-INIT functionality in +'tests/kdc/check-kdc.in'. + +To use this example you have to use OpenSSL 0.9.8a or later. + + + [user_certificate] + subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:princ_name + + [princ_name] + realm = EXP:0, GeneralString:MY.REALM + principal_name = EXP:1, SEQUENCE:principal_seq + + [principal_seq] + name_type = EXP:0, INTEGER:1 + name_string = EXP:1, SEQUENCE:principals + + [principals] + princ1 = GeneralString:userid + + +Command usage: + + openssl x509 -extensions user_certificate + openssl ca -extensions user_certificate + +4.26 Using PK-INIT with Windows +=============================== + +4.26.1 Client configration +-------------------------- + +Clients using a Windows KDC with PK-INIT need configuration since +windows uses pre-standard format and this can't be autodetected. + +The pkinit_win2k_require_binding option requires the reply for the KDC +to be of the new, secure, type that binds the request to reply. Before, +clients could fake the reply from the KDC. To use this option you have +to apply a fix from Microsoft. + + [realms] + MY.MS.REALM = { + pkinit_win2k = yes + pkinit_win2k_require_binding = no + } + +4.26.2 Certificates +------------------- + +The client certificates need to have the extended keyusage "Microsoft +Smartcardlogin" (openssl has the OID shortname msSmartcardLogin). + +See Microsoft Knowledge Base Article - 281245 "Guidelines for Enabling +Smart Card Logon with Third-Party Certification Authorities" for a more +extensive description of how set setup an external CA so that it +includes all the information required to make a Windows KDC happy. + +4.26.3 Configure Windows 2000 CA +-------------------------------- + +To enable Microsoft Smartcardlogin for certificates in your Windows 2000 +CA, you want to look at Microsoft Knowledge Base Article - 313274 "HOW +TO: Configure a Certification Authority to Issue Smart Card Certificates +in Windows". + + +File: heimdal.info, Node: Debugging Kerberos problems, Prev: Setting up PK-INIT, Up: Setting up a realm + +4.27 Debugging Kerberos problems +================================ + +To debug Kerberos client and server problems you can enable debug +traceing by adding the following to '/etc/krb5,conf'. Note that the +trace logging is sparse at the moment, but will continue to improve. + + [logging] + libkrb5 = 0-/SYSLOG: + + +File: heimdal.info, Node: Applications, Next: Things in search for a better place, Prev: Setting up a realm, Up: Top + +5 Applications +************** + +* Menu: + +* Authentication modules:: +* AFS:: + + +File: heimdal.info, Node: Authentication modules, Next: AFS, Prev: Applications, Up: Applications + +5.1 Authentication modules +========================== + +The problem of having different authentication mechanisms has been +recognised by several vendors, and several solutions have appeared. In +most cases these solutions involve some kind of shared modules that are +loaded at run-time. Modules for some of these systems can be found in +'lib/auth'. Presently there are modules for Digital's SIA, and IRIX' +'login' and 'xdm' (in 'lib/auth/afskauthlib'). + +* Menu: + +* Digital SIA:: +* IRIX:: + + +File: heimdal.info, Node: Digital SIA, Next: IRIX, Prev: Authentication modules, Up: Authentication modules + +5.1.1 Digital SIA +----------------- + +How to install the SIA module depends on which OS version you're +running. Tru64 5.0 has a new command, 'siacfg', which makes this +process quite simple. If you have this program, you should just be able +to run: + siacfg -a KRB5 /usr/athena/lib/libsia_krb5.so + +On older versions, or if you want to do it by hand, you have to do the +following (not tested by us on Tru64 5.0): + + * Make sure 'libsia_krb5.so' is available in '/usr/athena/lib'. If + '/usr/athena' is not on local disk, you might want to put it in + '/usr/shlib' or someplace else. If you do, you'll have to edit + 'krb5_matrix.conf' to reflect the new location (you will also have + to do this if you installed in some other directory than + '/usr/athena'). If you built with shared libraries, you will have + to copy the shared 'libkrb.so', 'libdes.so', 'libkadm.so', and + 'libkafs.so' to a place where the loader can find them (such as + '/usr/shlib'). + * Copy (your possibly edited) 'krb5_matrix.conf' to '/etc/sia'. + * Apply 'security.patch' to '/sbin/init.d/security'. + * Turn on KRB5 security by issuing 'rcmgr set SECURITY KRB5' and + 'rcmgr set KRB5_MATRIX_CONF krb5_matrix.conf'. + * Digital thinks you should reboot your machine, but that really + shouldn't be necessary. It's usually sufficient just to run + '/sbin/init.d/security start' (and restart any applications that + use SIA, like 'xdm'.) + +Users with local passwords (like 'root') should be able to login safely. + +When using Digital's xdm the 'KRB5CCNAME' environment variable isn't +passed along as it should (since xdm zaps the environment). Instead you +have to set 'KRB5CCNAME' to the correct value in +'/usr/lib/X11/xdm/Xsession'. Add a line similar to + KRB5CCNAME=FILE:/tmp/krb5cc`id -u`_`ps -o ppid= -p $$`; export KRB5CCNAME +If you use CDE, 'dtlogin' allows you to specify which additional +environment variables it should export. To add 'KRB5CCNAME' to this +list, edit '/usr/dt/config/Xconfig', and look for the definition of +'exportList'. You want to add something like: + Dtlogin.exportList: KRB5CCNAME + +Notes to users with Enhanced security +..................................... + +Digital's 'ENHANCED' (C2) security, and Kerberos solve two different +problems. C2 deals with local security, adds better control of who can +do what, auditing, and similar things. Kerberos deals with network +security. + +To make C2 security work with Kerberos you will have to do the +following. + + * Replace all occurrences of 'krb5_matrix.conf' with + 'krb5+c2_matrix.conf' in the directions above. + * You must enable "vouching" in the 'default' database. This will + make the OSFC2 module trust other SIA modules, so you can login + without giving your C2 password. To do this use 'edauth' to edit + the default entry '/usr/tcb/bin/edauth -dd default', and add a + 'd_accept_alternate_vouching' capability, if not already present. + * For each user who does _not_ have a local C2 password, you should + set the password expiration field to zero. You can do this for + each user, or in the 'default' table. To do this use 'edauth' to + set (or change) the 'u_exp' capability to 'u_exp#0'. + * You also need to be aware that the shipped 'login', 'rcp', and + 'rshd', don't do any particular C2 magic (such as checking for + various forms of disabled accounts), so if you rely on those + features, you shouldn't use those programs. If you configure with + '--enable-osfc2', these programs will, however, set the login UID. + Still: use at your own risk. + +At present 'su' does not accept the vouching flag, so it will not work +as expected. + +Also, kerberised ftp will not work with C2 passwords. You can solve +this by using both Digital's ftpd and our on different ports. + +*Remember*, if you do these changes you will get a system that most +certainly does _not_ fulfil the requirements of a C2 system. If C2 is +what you want, for instance if someone else is forcing you to use it, +you're out of luck. If you use enhanced security because you want a +system that is more secure than it would otherwise be, you probably got +an even more secure system. Passwords will not be sent in the clear, +for instance. + + +File: heimdal.info, Node: IRIX, Prev: Digital SIA, Up: Authentication modules + +5.1.2 IRIX +---------- + +The IRIX support is a module that is compatible with Transarc's +'afskauthlib.so'. It should work with all programs that use this +library. This should include 'login' and 'xdm'. + +The interface is not very documented but it seems that you have to copy +'libkafs.so', 'libkrb.so', and 'libdes.so' to '/usr/lib', or build your +'afskauthlib.so' statically. + +The 'afskauthlib.so' itself is able to reside in '/usr/vice/etc', +'/usr/afsws/lib', or the current directory (wherever that is). + +IRIX 6.4 and newer seem to have all programs (including 'xdm' and +'login') in the N32 object format, whereas in older versions they were +O32. For it to work, the 'afskauthlib.so' library has to be in the same +object format as the program that tries to load it. This might require +that you have to configure and build for O32 in addition to the default +N32. + +Apart from this it should "just work"; there are no configuration files. + +Note that recent Irix 6.5 versions (at least 6.5.22) have PAM, including +a 'pam_krb5.so' module. Not all relevant programs use PAM, though, e.g. +'ssh'. In particular, for console graphical login you need to turn off +'visuallogin' and turn on 'xdm' with 'chkconfig'. + + +File: heimdal.info, Node: AFS, Prev: Authentication modules, Up: Applications + +5.2 AFS +======= + +AFS is a distributed filesystem that uses Kerberos for authentication. + +For more information about AFS see OpenAFS and +Arla . + +5.2.1 kafs and afslog +--------------------- + +'afslog(1)' will obtains AFS tokens for a number of cells. What cells +to get tokens for can either be specified as an explicit list, as file +paths to get tokens for, or be left unspecified, in which case will use +whatever magic 'kafs(3)' decides upon. + +If not told what cell to get credentials for, 'kafs(3)' will search for +the files ThisCell and TheseCells in the locations specified in +'kafs(3)' and try to get tokens for these cells and the cells specified +in $HOME/.TheseCells. + +More usefully it will look at and ~/.TheseCells in your home directory +and for each line which is a cell get afs token for these cells. + +The TheseCells file defines the the cells to which applications on the +local client machine should try to aquire tokens for. It must reside in +the directories searched by 'kafs(3)' on every AFS client machine. + +The file is in ASCII format and contains one character string, the cell +name, per line. Cell names are case sensitive, but most cell names are +lower case. + +See manpage for 'kafs(3)' for search locations of ThisCell and +TheseCells. + +5.2.2 How to get a KeyFile +-------------------------- + +'ktutil -k AFSKEYFILE:KeyFile get afs@MY.REALM' + +or you can extract it with kadmin + + kadmin> ext -k AFSKEYFILE:/usr/afs/etc/KeyFile afs@My.CELL.NAME + +You have to make sure you have a 'des-cbc-md5' encryption type since +that is the enctype that will be converted. + +5.2.3 How to convert a srvtab to a KeyFile +------------------------------------------ + +You need a '/usr/vice/etc/ThisCell' containing the cellname of your +AFS-cell. + +'ktutil copy krb4:/root/afs-srvtab AFSKEYFILE:/usr/afs/etc/KeyFile'. + +If keyfile already exists, this will add the new key in afs-srvtab to +KeyFile. + +5.3 Using 2b tokens with AFS +============================ + +5.3.1 What is 2b ? +------------------ + +2b is the name of the proposal that was implemented to give basic +Kerberos 5 support to AFS in rxkad. It's not real Kerberos 5 support +since it still uses fcrypt for data encryption and not Kerberos +encryption types. + +Its only possible (in all cases) to do this for DES encryption types +because only then the token (the AFS equivalent of a ticket) will be +smaller than the maximum size that can fit in the token cache in the +OpenAFS/Transarc client. It is a so tight fit that some extra wrapping +on the ASN1/DER encoding is removed from the Kerberos ticket. + +2b uses a Kerberos 5 EncTicketPart instead of a Kerberos 4 ditto for the +part of the ticket that is encrypted with the service's key. The client +doesn't know what's inside the encrypted data so to the client it +doesn't matter. + +To differentiate between Kerberos 4 tickets and Kerberos 5 tickets, 2b +uses a special kvno, 213 for 2b tokens and 255 for Kerberos 5 tokens. + +Its a requirement that all AFS servers that support 2b also support +native Kerberos 5 in rxkad. + +5.3.2 Configuring a Heimdal kdc to use 2b tokens +------------------------------------------------ + +Support for 2b tokens in the kdc are turned on for specific principals +by adding them to the string list option '[kdc]use_2b' in the kdc's +'krb5.conf' file. + + [kdc] + use_2b = { + afs@SU.SE = yes + afs/it.su.se@SU.SE = yes + } + +5.3.3 Configuring AFS clients for 2b support +-------------------------------------------- + +There is no need to configure AFS clients for 2b support. The only +software that needs to be installed/upgrade is a Kerberos 5 enabled +'afslog'. + + +File: heimdal.info, Node: Things in search for a better place, Next: Kerberos 4 issues, Prev: Applications, Up: Top + +6 Things in search for a better place +************************************* + +6.1 Making things work on Ciscos +================================ + +Modern versions of Cisco IOS has some support for authenticating via +Kerberos 5. This can be used both by having the router get a ticket +when you login (boring), and by using Kerberos authenticated telnet to +access your router (less boring). The following has been tested on IOS +11.2(12), things might be different with other versions. Old versions +are known to have bugs. + +To make this work, you will first have to configure your router to use +Kerberos (this is explained in the documentation). A sample +configuration looks like the following: + + aaa new-model + aaa authentication login default krb5-telnet krb5 enable + aaa authorization exec krb5-instance + kerberos local-realm FOO.SE + kerberos srvtab entry host/router.foo.se 0 891725446 4 1 8 012345678901234567 + kerberos server FOO.SE 10.0.0.1 + kerberos instance map admin 15 + +This tells you (among other things) that when logging in, the router +should try to authenticate with kerberised telnet, and if that fails try +to verify a plain text password via a Kerberos ticket exchange (as +opposed to a local database, RADIUS or something similar), and if that +fails try the local enable password. If you're not careful when you +specify the 'login default' authentication mechanism, you might not be +able to login at all. The 'instance map' and 'authorization exec' lines +says that people with 'admin' instances should be given 'enabled' shells +when logging in. + +The numbers after the principal on the 'srvtab' line are principal type, +time stamp (in seconds since 1970), key version number (4), keytype (1 +== des), key length (always 8 with des), and then the key. + +To make the Heimdal KDC produce tickets that the Cisco can decode you +might have to turn on the 'encode_as_rep_as_tgs_rep' flag in the KDC. +You will also have to specify that the router can't handle anything but +'des-cbc-crc'. This can be done with the 'del_enctype' command of +'kadmin'. + +This all fine and so, but unless you have an IOS version with encryption +(available only in the U.S) it doesn't really solve any problems. Sure +you don't have to send your password over the wire, but since the telnet +connection isn't protected it's still possible for someone to steal your +session. This won't be fixed until someone adds integrity to the telnet +protocol. + +A working solution would be to hook up a machine with a real operating +system to the console of the Cisco and then use it as a backwards +terminal server. + + +File: heimdal.info, Node: Kerberos 4 issues, Next: Windows compatibility, Prev: Things in search for a better place, Up: Top + +7 Kerberos 4 issues +******************* + +Kerberos 4 KDC and KA server have been moved. + +For more about AFS, see the section *Note AFS::. + +* Menu: + +* Principal conversion issues:: +* Converting a version 4 database:: + + +File: heimdal.info, Node: Principal conversion issues, Next: Converting a version 4 database, Prev: Kerberos 4 issues, Up: Kerberos 4 issues + +7.1 Principal conversion issues +=============================== + +First, Kerberos 4 and Kerberos 5 principals are different. A version 4 +principal consists of a name, an instance, and a realm. A version 5 +principal has one or more components, and a realm (the terms "name" and +"instance" are still used, for the first and second component, +respectively). Also, in some cases the name of a version 4 principal +differs from the first component of the corresponding version 5 +principal. One notable example is the "host" type principals, where the +version 4 name is 'rcmd' (for "remote command"), and the version 5 name +is 'host'. For the class of principals that has a hostname as instance, +there is an other major difference, Kerberos 4 uses only the first +component of the hostname, whereas Kerberos 5 uses the fully qualified +hostname. + +Because of this it can be hard or impossible to correctly convert a +version 4 principal to a version 5 principal (1). The biggest problem +is to know if the conversion resulted in a valid principal. To give an +example, suppose you want to convert the principal 'rcmd.foo'. + +The 'rcmd' name suggests that the instance is a hostname (even if there +are exceptions to this rule). To correctly convert the instance 'foo' +to a hostname, you have to know which host it is referring to. You can +to this by either guessing (from the realm) which domain name to append, +or you have to have a list of possible hostnames. In the simplest cases +you can cover most principals with the first rule. If you have several +domains sharing a single realm this will not usually work. If the +exceptions are few you can probably come by with a lookup table for the +exceptions. + +In a complex scenario you will need some kind of host lookup mechanism. +Using DNS for this is tempting, but DNS is error prone, slow and unsafe +(2). + +Fortunately, the KDC has a trump on hand: it can easily tell if a +principal exists in the database. The KDC will use +'krb5_425_conv_principal_ext' to convert principals when handling to +version 4 requests. + + ---------- Footnotes ---------- + + (1) the other way is not always trivial either, but usually easier + + (2) at least until secure DNS is commonly available + + +File: heimdal.info, Node: Converting a version 4 database, Prev: Principal conversion issues, Up: Kerberos 4 issues + +7.2 Converting a version 4 database +=================================== + +If you want to convert an existing version 4 database, the principal +conversion issue arises too. + +If you decide to convert your database once and for all, you will only +have to do this conversion once. It is also possible to run a version 5 +KDC as a slave to a version 4 KDC. In this case this conversion will +happen every time the database is propagated. When doing this +conversion, there are a few things to look out for. If you have stale +entries in the database, these entries will not be converted. This +might be because these principals are not used anymore, or it might be +just because the principal couldn't be converted. + +You might also see problems with a many-to-one mapping of principals. +For instance, if you are using DNS lookups and you have two principals +'rcmd.foo' and 'rcmd.bar', where 'foo' is a CNAME for 'bar', the +resulting principals will be the same. Since the conversion function +can't tell which is correct, these conflicts will have to be resolved +manually. + +7.2.1 Conversion example +------------------------ + +Given the following set of hosts and services: + + foo.se rcmd + mail.foo.se rcmd, pop + ftp.bar.se rcmd, ftp + +you have a database that consists of the following principals: + +'rcmd.foo', 'rcmd.mail', 'pop.mail', 'rcmd.ftp', and 'ftp.ftp'. + +lets say you also got these extra principals: 'rcmd.gone', +'rcmd.old-mail', where 'gone.foo.se' was a machine that has now passed +away, and 'old-mail.foo.se' was an old mail machine that is now a CNAME +for 'mail.foo.se'. + +When you convert this database you want the following conversions to be +done: + rcmd.foo host/foo.se + rcmd.mail host/mail.foo.se + pop.mail pop/mail.foo.se + rcmd.ftp host/ftp.bar.se + ftp.ftp ftp/ftp.bar.se + rcmd.gone removed + rcmd.old-mail removed + +A 'krb5.conf' that does this looks like: + + [realms] + FOO.SE = { + v4_name_convert = { + host = { + ftp = ftp + pop = pop + rcmd = host + } + } + v4_instance_convert = { + foo = foo.se + ftp = ftp.bar.se + } + default_domain = foo.se + } + +The 'v4_name_convert' section says which names should be considered +having an instance consisting of a hostname, and it also says how the +names should be converted (for instance 'rcmd' should be converted to +'host'). The 'v4_instance_convert' section says how a hostname should +be qualified (this is just a hosts-file in disguise). Host-instances +that aren't covered by 'v4_instance_convert' are qualified by appending +the contents of the 'default_domain'. + +Actually, this example doesn't work. Or rather, it works to well. +Since it has no way of knowing which hostnames are valid and which are +not, it will happily convert 'rcmd.gone' to 'host/gone.foo.se'. This +isn't a big problem, but if you have run your kerberos realm for a few +years, chances are big that you have quite a few 'junk' principals. + +If you don't want this you can remove the 'default_domain' statement, +but then you will have to add entries for _all_ your hosts in the +'v4_instance_convert' section. + +Instead of doing this you can use DNS to convert instances. This is not +a solution without problems, but it is probably easier than adding lots +of static host entries. + +To enable DNS lookup you should turn on 'v4_instance_resolve' in the +'[libdefaults]' section. + +7.2.2 Converting a database +--------------------------- + +The database conversion is done with 'hprop'. You can run this command +to propagate the database to the machine called 'slave-server' (which +should be running a 'hpropd'). + + hprop --source=krb4-db --master-key=/.m slave-server + +This command can also be to use for converting the v4 database on the +server: + + hprop -n --source=krb4-db -d /var/kerberos/principal --master-key=/.m | hpropd -n + + +File: heimdal.info, Node: Windows compatibility, Next: Programming with Kerberos, Prev: Kerberos 4 issues, Up: Top + +8 Windows compatibility +*********************** + +Microsoft Windows, starting from version 2000 (formerly known as Windows +NT 5), implements Kerberos 5. Their implementation, however, has some +quirks, peculiarities, and bugs. This chapter is a short summary of the +compatibility issues between Heimdal and various Windows versions. + +The big problem with the Kerberos implementation in Windows is that the +available documentation is more focused on getting things to work rather +than how they work, and not that useful in figuring out how things +really work. It's of course subject to change all the time and mostly +consists of our not so inspired guesses. Hopefully it's still somewhat +useful. + +* Menu: + +* Configuring Windows to use a Heimdal KDC:: +* Inter-Realm keys (trust) between Windows and a Heimdal KDC:: +* Create account mappings:: +* Encryption types:: +* Authorisation data:: +* Quirks of Windows 2000 KDC:: +* Useful links when reading about the Windows:: + + +File: heimdal.info, Node: Configuring Windows to use a Heimdal KDC, Next: Inter-Realm keys (trust) between Windows and a Heimdal KDC, Prev: Windows compatibility, Up: Windows compatibility + +8.1 Configuring Windows to use a Heimdal KDC +============================================ + +You need the command line program called 'ksetup.exe'. This program +comes with the Windows Support Tools, available from either the +installation CD-ROM ('SUPPORT/TOOLS/SUPPORT.CAB'), or from Microsoft web +site. Starting from Windows 2008, it is already installed. This +program is used to configure the Kerberos settings on a Workstation. + +'Ksetup' store the domain information under the registry key: +'HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\LSA\Kerberos\Domains'. + +Use the 'kadmin' program in Heimdal to create a host principal in the +Kerberos realm. + + unix% kadmin + kadmin> ank --password=password host/datan.example.com + +The name 'datan.example.com' should be replaced with DNS name of the +workstation. + +You must configure the workstation as a member of a workgroup, as +opposed to a member in an NT domain, and specify the KDC server of the +realm as follows: + C:> ksetup /setdomain EXAMPLE.COM + C:> ksetup /addkdc EXAMPLE.COM kdc.example.com + +Set the machine password, i.e. create the local keytab: + C:> ksetup /SetComputerPassword password + +The password used in 'ksetup /setmachpassword' must be the same as the +password used in the 'kadmin ank' command. + +The workstation must now be rebooted. + +A mapping between local NT users and Kerberos principals must be +specified. You have two choices. First: + + C:> ksetup /mapuser user@MY.REALM nt_user + +This will map a user to a specific principal; this allows you to have +other usernames in the realm than in your NT user database. (Don't ask +me why on earth you would want that...) + +You can also say: + C:> ksetup /mapuser * * +The Windows machine will now map any user to the corresponding +principal, for example 'nisse' to the principal 'nisse@MY.REALM'. (This +is most likely what you want.) + + +File: heimdal.info, Node: Inter-Realm keys (trust) between Windows and a Heimdal KDC, Next: Create account mappings, Prev: Configuring Windows to use a Heimdal KDC, Up: Windows compatibility + +8.2 Inter-Realm keys (trust) between Windows and a Heimdal KDC +============================================================== + +See also the Step-by-Step guide from Microsoft, referenced below. + +Install Windows, and create a new controller (Active Directory Server) +for the domain. + +By default the trust will be non-transitive. This means that only users +directly from the trusted domain may authenticate. This can be changed +to transitive by using the 'netdom.exe' tool. 'netdom.exe' can also be +used to add the trust between two realms. + +You need to tell Windows on what hosts to find the KDCs for the +non-Windows realm with 'ksetup', see *Note Configuring Windows to use a +Heimdal KDC::. + +This needs to be done on all computers that want enable cross-realm +login with 'Mapped Names'. + +Then you need to add the inter-realm keys on the Windows KDC. Start the +Domain Tree Management tool (found in Programs, Administrative tools, +Active Directory Domains and Trusts). + +Right click on Properties of your domain, select the Trust tab. Press +Add on the appropriate trust windows and enter domain name and password. +When prompted if this is a non-Windows Kerberos realm, press OK. + +Do not forget to add trusts in both directions (if that's what you +want). + +If you want to use 'netdom.exe' instead of the Domain Tree Management +tool, you do it like this: + + netdom trust NT.REALM.EXAMPLE.COM /Domain:EXAMPLE.COM /add /realm /passwordt:TrustPassword + +You also need to add the inter-realm keys to the Heimdal KDC. But take +care to the encryption types and salting used for those keys. There +should be no encryption type stronger than the one configured on Windows +side for this relationship, itself limited to the ones supported by this +specific version of Windows, nor any Kerberos 4 salted hashes, as +Windows does not seem to understand them. Otherwise, the trust will not +works. + +Here are the version-specific needed information: + 1. Windows 2000: maximum encryption type is DES + 2. Windows 2003: maximum encryption type is DES + 3. Windows 2003RC2: maximum encryption type is RC4, relationship + defaults to DES + 4. Windows 2008: maximum encryption type is AES, relationship defaults + to RC4 + +For Windows 2003RC2, to change the trust encryption type, you have to +use the 'ktpass', from the Windows 2003 Resource kit *service pack2*, +available from Microsoft web site. + + C:> ktpass /MITRealmName UNIX.EXAMPLE.COM /TrustEncryp RC4 + +For Windows 2008, the same operation can be done with the 'ksetup', +installed by default. + + C:> ksetup /SetEncTypeAttre EXAMPLE.COM AES256-SHA1 + +Once the relationship is correctly configured, you can add the required +inter-realm keys, using heimdal default encryption types: + + kadmin add krbtgt/NT.REALM.EXAMPLE.COM@EXAMPLE.COM + kadmin add krbtgt/REALM.EXAMPLE.COM@NT.EXAMPLE.COM + +Use the same passwords for both keys. + +And if needed, to remove unsupported encryptions, such as the following +ones for a Windows 2003RC2 server. + + kadmin del_enctype krbtgt/REALM.EXAMPLE.COM@NT.EXAMPLE.COM aes256-cts-hmac-sha1-96 + kadmin del_enctype krbtgt/REALM.EXAMPLE.COM@NT.EXAMPLE.COM des3-cbc-sha1 + kadmin del_enctype krbtgt/NT.EXAMPLE.COM@EXAMPLE.COM aes256-cts-hmac-sha1-96 + kadmin del_enctype krbtgt/NT.EXAMPLE.COM@EXAMPLE.COM des3-cbc-sha1 + +Do not forget to reboot before trying the new realm-trust (after running +'ksetup'). It looks like it might work, but packets are never sent to +the non-Windows KDC. + + +File: heimdal.info, Node: Create account mappings, Next: Encryption types, Prev: Inter-Realm keys (trust) between Windows and a Heimdal KDC, Up: Windows compatibility + +8.3 Create account mappings +=========================== + +Start the 'Active Directory Users and Computers' tool. Select the View +menu, that is in the left corner just below the real menu (or press +Alt-V), and select Advanced Features. Right click on the user that you +are going to do a name mapping for and choose Name mapping. + +Click on the Kerberos Names tab and add a new principal from the +non-Windows domain. + +This adds 'authorizationNames' entry to the users LDAP entry to the +Active Directory LDAP catalog. When you create users by script you can +add this entry instead. + + +File: heimdal.info, Node: Encryption types, Next: Authorisation data, Prev: Create account mappings, Up: Windows compatibility + +8.4 Encryption types +==================== + +Windows 2000 supports both the standard DES encryptions ('des-cbc-crc' +and 'des-cbc-md5') and its own proprietary encryption that is based on +MD4 and RC4 that is documented in and is supposed to be described in +'draft-brezak-win2k-krb-rc4-hmac-03.txt'. New users will get both MD4 +and DES keys. Users that are converted from a NT4 database, will only +have MD4 passwords and will need a password change to get a DES key. + + +File: heimdal.info, Node: Authorisation data, Next: Quirks of Windows 2000 KDC, Prev: Encryption types, Up: Windows compatibility + +8.5 Authorisation data +====================== + +The Windows 2000 KDC also adds extra authorisation data in tickets. It +is at this point unclear what triggers it to do this. The format of +this data is only available under a "secret" license from Microsoft, +which prohibits you implementing it. + +A simple way of getting hold of the data to be able to understand it +better is described here. + + 1. Find the client example on using the SSPI in the SDK documentation. + 2. Change "AuthSamp" in the source code to lowercase. + 3. Build the program. + 4. Add the "authsamp" principal with a known password to the database. + Make sure it has a DES key. + 5. Run 'ktutil add' to add the key for that principal to a keytab. + 6. Run 'appl/test/nt_gss_server -p 2000 -s authsamp --dump-auth=FILE' + where FILE is an appropriate file. + 7. It should authenticate and dump for you the authorisation data in + the file. + 8. The tool 'lib/asn1/asn1_print' is somewhat useful for analysing the + data. + + +File: heimdal.info, Node: Quirks of Windows 2000 KDC, Next: Useful links when reading about the Windows, Prev: Authorisation data, Up: Windows compatibility + +8.6 Quirks of Windows 2000 KDC +============================== + +There are some issues with salts and Windows 2000. Using an empty +salt--which is the only one that Kerberos 4 supported, and is therefore +known as a Kerberos 4 compatible salt--does not work, as far as we can +tell from out experiments and users' reports. Therefore, you have to +make sure you keep around keys with all the different types of salts +that are required. Microsoft have fixed this issue post Windows 2003. + +Microsoft seems also to have forgotten to implement the checksum +algorithms 'rsa-md4-des' and 'rsa-md5-des'. This can make Name mapping +(*note Create account mappings::) fail if a 'des-cbc-md5' key is used. +To make the KDC return only 'des-cbc-crc' you must delete the +'des-cbc-md5' key from the kdc using the 'kadmin del_enctype' command. + + kadmin del_enctype lha des-cbc-md5 + +You should also add the following entries to the 'krb5.conf' file: + + [libdefaults] + default_etypes = des-cbc-crc + default_etypes_des = des-cbc-crc + +These configuration options will make sure that no checksums of the +unsupported types are generated. + + +File: heimdal.info, Node: Useful links when reading about the Windows, Prev: Quirks of Windows 2000 KDC, Up: Windows compatibility + +8.7 Useful links when reading about the Windows +=============================================== + +See also our paper presented at the 2001 Usenix Annual Technical +Conference, available in the proceedings or at +. + +There are lots of texts about Kerberos on Microsoft's web site, here is +a short list of the interesting documents that we have managed to find. + + * Step-by-Step Guide to Kerberos 5 (krb5 1.0) Interoperability: + . + Kerberos GSS-API (in Windows-eze SSPI), Windows as a client in a + non-Windows KDC realm, adding unix clients to a Windows 2000 KDC, + and adding cross-realm trust (*note Inter-Realm keys (trust) + between Windows and a Heimdal KDC::). + + * Windows 2000 Kerberos Authentication: + . + White paper that describes how Kerberos is used in Windows 2000. + + * Overview of Kerberos: + . + Links to useful other links. + + * Event logging for Kerberos: + . + Basically it say that you can add a registry key + 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\LogLevel' + with value DWORD equal to 1, and then you'll get logging in the + Event Logger. + +Other useful programs include these: + + * pwdump2 + + + +File: heimdal.info, Node: Programming with Kerberos, Next: Migration, Prev: Windows compatibility, Up: Top + +9 Programming with Kerberos +*************************** + +See the Kerberos 5 API introduction and documentation on the Heimdal +webpage. + + +File: heimdal.info, Node: Migration, Next: Acknowledgments, Prev: Programming with Kerberos, Up: Top + +10 Migration +************ + +10.1 Migration from MIT Kerberos to Heimdal +=========================================== + +hpropd can read MIT Kerberos dump in "kdb5_util load_dump version 5" or +version 6 format. Simply run: 'kdb5_util dump'. + +To load the MIT Kerberos dump file, use the following command: + +'/usr/heimdal/libexec/hprop --database=dump-file +--master-key=/var/db/krb5kdc/mit_stash --source=mit-dump --decrypt +--stdout | /usr/heimdal/libexec/hpropd --stdin' + +kadmin can dump in MIT Kerberos format. Simply run: 'kadmin -l dump -f +MIT'. + +The Heimdal KDC and kadmind, as well as kadmin -l and the libkadm5srv +library can read and write MIT KDBs, and can read MIT stash files. To +build with KDB support requires having a standalone libdb from MIT +Kerberos and associated headers, then you can configure Heildal as +follows: + +'./configure ... CPPFLAGS=-I/path-to-mit-db-headers +LDFLAGS="-L/path-to-mit-db-object -Wl,-rpath -Wl,/path-to-mit-db-object" +LDLIBS=-ldb' + +At this time support for MIT Kerberos KDB dump/load format and direct +KDB access does not include support for PKINIT, or K/M key history, +constrained delegation, and other advanced features. + +Heimdal supports using multiple HDBs at once, with all write going to +just one HDB. This allows for entries to be moved to a native HDB from +an MIT KDB over time as those entries are changed. Or you can use hprop +and hpropd. + +10.2 General issues +=================== + +When migrating from a Kerberos 4 KDC. + +10.3 Order in what to do things: +================================ + + * Convert the database, check all principals that hprop complains + about. + + 'hprop -n --source=| hpropd -n' + + Replace with whatever source you have, like krb4-db or + krb4-dump. + + * Run a Kerberos 5 slave for a while. + + * Figure out if it does everything you want it to. + + Make sure that all things that you use works for you. + + * Let a small number of controlled users use Kerberos 5 tools. + + Find a sample population of your users and check what programs they + use, you can also check the kdc-log to check what ticket are + checked out. + + * Burn the bridge and change the master. + * Let all users use the Kerberos 5 tools by default. + * Turn off services that do not need Kerberos 4 authentication. + + Things that might be hard to get away is old programs with support + for Kerberos 4. Example applications are old Eudora installations + using KPOP, and Zephyr. Eudora can use the Kerberos 4 kerberos in + the Heimdal kdc. + + +File: heimdal.info, Node: Acknowledgments, Next: Copyrights and Licenses, Prev: Migration, Up: Top + +Appendix A Acknowledgments +************************** + +Eric Young wrote "libdes". Heimdal used to use libdes, without it +kth-krb would never have existed. Since there are no longer any Eric +Young code left in the library, we renamed it to libhcrypto. + +All functions in libhcrypto have been re-implemented or used available +public domain code. The core AES function where written by Vincent +Rijmen, Antoon Bosselaers and Paulo Barreto. The core DES SBOX +transformation was written by Richard Outerbridge. 'imath' that is used +for public key crypto support is written by Michael J. Fromberger. + +The University of California at Berkeley initially wrote 'telnet', and +'telnetd'. The authentication and encryption code of 'telnet' and +'telnetd' was added by David Borman (then of Cray Research, Inc). The +encryption code was removed when this was exported and then added back +by Juha Eskelinen. + +The 'popper' was also a Berkeley program initially. + +Some of the functions in 'libroken' also come from Berkeley by way of +NetBSD/FreeBSD. + +'editline' was written by Simmule Turner and Rich Salz. Heimdal +contains a modifed copy. + +The 'getifaddrs' implementation for Linux was written by Hideaki +YOSHIFUJI for the Usagi project. + +The 'pkcs11.h' headerfile was written by the Scute project. + +Bugfixes, documentation, encouragement, and code has been contributed +by: +Alexander Boström +Allan McRae +Andrew Bartlett +Andrew Cobaugh +Andrew Tridge +Anton Lundin +Asanka Herath +Björn Grönvall +Björn Sandell +Björn Schlögl +Brandon S. Allbery KF8NH +Brian A May +Buck Huppmann +Cacdric Schieli +Chaskiel M Grundman +Christos Zoulas +Cizzi Storm +Daniel Kouril +David Love +David Markey +David R Boldt +Derrick J Brashear +Donald Norwood +Douglas E Engert +Frank van der Linden +Gabor Gombas +Guido Günther +Guillaume Rousse +Harald Barth +Ingo Schwarze +Jacques A. Vidrine +Jaideep Padhye +Jan Rekorajski +Jason McIntyre +Jeffrey Altman +Jelmer Vernooij +Joerg Pulz +Johan Danielsson +Johan Gadsjö +Johan Ihrén +John Center +Julian Ospald +Jun-ichiro itojun Hagino +KAMADA Ken'ichi +Kamen Mazdrashki +Karolin Seeger +Ken Hornstein +Love Hörnquist Åstrand +Luke Howard +Magnus Ahltorp +Magnus Holmberg +Marc Horowitz +Mario Strasser +Mark Eichin +Martin von Gagern +Matthias Dieter Wallnöfer +Matthieu Patou +Mattias Amnefelt +Michael B Allen +Michael Fromberger +Michal Vocu +Milosz Kmieciak +Miroslav Ruda +Mustafa A. Hashmi +Nicolas Williams +Patrik Lundin +Petr Holub +Phil Fisher +Rafal Malinowski +Ragnar Sundblad +Rainer Toebbicke +Richard Nyberg +Roland C. Dowdeswell +Roman Divacky +Russ Allbery +Sho Hosoda, 細田 将 +Simon Wilkinson +Stefan Metzmacher +Ted Percival +Timothy Pearson +Tom Payerle +Victor Guerra +Zeqing Xia +Åke Sandgren +and we hope that those not mentioned here will forgive us. + +All bugs were introduced by ourselves. + + +File: heimdal.info, Node: Copyrights and Licenses, Prev: Acknowledgments, Up: Top + +Appendix B Copyrights and Licenses +********************************** + +Kungliga Tekniska Högskolan +=========================== + + +Copyright (c) 1997-2011 Kungliga Tekniska Högskolan +(Royal Institute of Technology, Stockholm, Sweden). +All rights reserved. + +Portions Copyright (c) 2009 Apple Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the Institute nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + +Massachusetts Institute of Technology +===================================== + +The parts of the libtelnet that handle Kerberos. + + +Copyright (C) 1990 by the Massachusetts Institute of Technology + +Export of this software from the United States of America may +require a specific license from the United States Government. +It is the responsibility of any person or organization contemplating +export to obtain such a license before exporting. + +WITHIN THAT CONSTRAINT, permission to use, copy, modify, and +distribute this software and its documentation for any purpose and +without fee is hereby granted, provided that the above copyright +notice appear in all copies and that both that copyright notice and +this permission notice appear in supporting documentation, and that +the name of M.I.T. not be used in advertising or publicity pertaining +to distribution of the software without specific, written prior +permission. M.I.T. makes no representations about the suitability of +this software for any purpose. It is provided "as is" without express +or implied warranty. + + +The Regents of the University of California +=========================================== + +The parts of the libroken, most of libtelnet, telnet, ftp, and popper. + + +Copyright (c) 1988, 1990, 1993 + The Regents of the University of California. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + +The Regents of the University of California. +============================================ + +libedit + + +Copyright (c) 1992, 1993 + The Regents of the University of California. All rights reserved. + +This code is derived from software contributed to Berkeley by +Christos Zoulas of Cornell University. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + +TomsFastMath / LibTomMath +========================= + +Tom's fast math (bignum support) and LibTomMath + + +LibTomMath is hereby released into the Public Domain. + + +Doug Rabson +=========== + +GSS-API mechglue layer. + + +Copyright (c) 2005 Doug Rabson +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + +PADL Software Pty Ltd +===================== + +GSS-API CFX, SPNEGO, naming extensions, API extensions. +KCM credential cache. +HDB LDAP backend. + + +Copyright (c) 2003-2011, PADL Software Pty Ltd. +Copyright (c) 2004, Andrew Bartlett. +Copyright (c) 2003 - 2008, Kungliga Tekniska Högskolan +Copyright (c) 2015, Timothy Pearson. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name of PADL Software nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + +Marko Kreen +=========== + +Fortuna in libhcrypto + + +Copyright (c) 2005 Marko Kreen +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + + +NTT (Nippon Telegraph and Telephone Corporation) +================================================ + +Camellia in libhcrypto + + +Copyright (c) 2006,2007 +NTT (Nippon Telegraph and Telephone Corporation) . All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer as + the first lines of this file unmodified. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY NTT ``AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL NTT BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +The NetBSD Foundation, Inc. +=========================== + +vis.c in libroken + + +Copyright (c) 1999, 2005 The NetBSD Foundation, Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +Vincent Rijmen, Antoon Bosselaers, Paulo Barreto +================================================ + +AES in libhcrypto + + +rijndael-alg-fst.c + +@version 3.0 (December 2000) + +Optimised ANSI C code for the Rijndael cipher (now AES) + +@author Vincent Rijmen +@author Antoon Bosselaers +@author Paulo Barreto + +This code is hereby placed in the public domain. + +THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Apple, Inc +========== + +kdc/announce.c + + +Copyright (c) 2008 Apple Inc. All Rights Reserved. + +Export of this software from the United States of America may require +a specific license from the United States Government. It is the +responsibility of any person or organization contemplating export to +obtain such a license before exporting. + +WITHIN THAT CONSTRAINT, permission to use, copy, modify, and +distribute this software and its documentation for any purpose and +without fee is hereby granted, provided that the above copyright +notice appear in all copies and that both that copyright notice and +this permission notice appear in supporting documentation, and that +the name of Apple Inc. not be used in advertising or publicity pertaining +to distribution of the software without specific, written prior +permission. Apple Inc. makes no representations about the suitability of +this software for any purpose. It is provided "as is" without express +or implied warranty. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + +Richard Outerbridge +=================== + +DES core in libhcrypto + + +D3DES (V5.09) - + +A portable, public domain, version of the Data Encryption Standard. + +Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge. +Thanks to: Dan Hoey for his excellent Initial and Inverse permutation +code; Jim Gillogly & Phil Karn for the DES key schedule code; Dennis +Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau, +for humouring me on. + +Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge. +(GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992. + + + +Secure Endpoints Inc +==================== + +Windows support + + +Copyright (c) 2009-2015, Secure Endpoints Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + + +Novell, Inc +=========== + +lib/hcrypto/test_dh.c + + +Copyright (c) 2007, Novell, Inc. +Author: Matthias Koenig + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the Novell nor the names of its contributors may be used + to endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + + + + +Tag Table: +Node: Top211 +Node: Introduction1689 +Node: What is Kerberos?4418 +Node: Building and Installing9518 +Node: Setting up a realm9845 +Node: Configuration file10797 +Node: Creating the database13877 +Node: Modifying the database17536 +Node: Checking the setup19129 +Node: keytabs19987 +Node: Remote administration20845 +Node: Password changing22758 +Node: Testing clients and servers26949 +Node: Slave Servers27277 +Node: Incremental propagation29032 +Node: Encryption types and salting32754 +Node: Credential cache server - KCM34937 +Node: Cross realm36922 +Node: Transit policy39476 +Node: Setting up DNS46258 +Node: Using LDAP to store the database48739 +Node: Providing Kerberos credentials to servers and programs55598 +Node: Setting up PK-INIT57705 +Ref: Use OpenSSL to create certificates68970 +Node: Debugging Kerberos problems71512 +Node: Applications71944 +Node: Authentication modules72144 +Node: Digital SIA72739 +Node: IRIX77134 +Node: AFS78428 +Node: Things in search for a better place82188 +Node: Kerberos 4 issues84926 +Node: Principal conversion issues85274 +Ref: Principal conversion issues-Footnote-187518 +Ref: Principal conversion issues-Footnote-287589 +Node: Converting a version 4 database87645 +Node: Windows compatibility91968 +Node: Configuring Windows to use a Heimdal KDC93057 +Node: Inter-Realm keys (trust) between Windows and a Heimdal KDC95132 +Node: Create account mappings98807 +Node: Encryption types99562 +Node: Authorisation data100162 +Node: Quirks of Windows 2000 KDC101301 +Node: Useful links when reading about the Windows102596 +Node: Programming with Kerberos104399 +Node: Migration104649 +Node: Acknowledgments107290 +Node: Copyrights and Licenses110169 + +End Tag Table + + +Local Variables: +coding: utf-8 +End: diff --git a/crypto/heimdal/doc/heimdal.texi b/crypto/heimdal/doc/heimdal.texi --- a/crypto/heimdal/doc/heimdal.texi +++ b/crypto/heimdal/doc/heimdal.texi @@ -97,6 +97,7 @@ * Using LDAP to store the database:: * Providing Kerberos credentials to servers and programs:: * Setting up PK-INIT:: +* Debugging Kerberos problems:: Applications diff --git a/crypto/heimdal/doc/hx509.hhp b/crypto/heimdal/doc/hx509.hhp new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/hx509.hhp @@ -0,0 +1,8 @@ +[OPTIONS] +Compatibility=1.1 or later +Compiled file=hx509.chm +Contents file=toc.hhc +Default topic=index.html +Display compile progress=No +Language=0x409 English (United States) +Title=HX509 \ No newline at end of file diff --git a/crypto/heimdal/doc/hx509.info b/crypto/heimdal/doc/hx509.info new file mode 100644 --- /dev/null +++ b/crypto/heimdal/doc/hx509.info @@ -0,0 +1,618 @@ +This is hx509.info, produced by makeinfo version 6.8 from hx509.texi. + +INFO-DIR-SECTION Security +START-INFO-DIR-ENTRY +* hx509: (hx509). The X.509 distribution from KTH +END-INFO-DIR-ENTRY + + +File: hx509.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) + +Heimdal +******* + +This manual is for version 7.8.0 of hx509. + +* Menu: + +* Introduction:: +* What is X.509 ?:: +* Setting up a CA:: +* CMS signing and encryption:: +* Certificate matching:: +* Software PKCS 11 module:: +* Creating a CA certificate:: +* Issuing certificates:: +* Issuing CRLs:: +* Application requirements:: +* CMS background:: +* Matching syntax:: +* How to use the PKCS11 module:: + + -- The Detailed Node Listing -- + +Setting up a CA + +* Creating a CA certificate:: +* Issuing certificates:: +* Issuing CRLs:: +* Application requirements:: + +CMS signing and encryption + +* CMS background:: + +Certificate matching + +* Matching syntax:: + +Software PKCS 11 module + +* How to use the PKCS11 module:: + + + +File: hx509.info, Node: Introduction, Next: What is X.509 ?, Prev: Top, Up: Top + +1 Introduction +************** + +The goals of a PKI infrastructure (as defined in RFC 3280) is to meet _the +needs of deterministic, automated identification, authentication, access +control, and authorization_. + +The administrator should be aware of certain terminologies as explained +by the aforementioned RFC before attemping to put in place a PKI +infrastructure. Briefly, these are: + + * CA Certificate Authority + * RA Registration Authority, i.e., an optional system to which a CA + delegates certain management functions. + * CRL Issuer An optional system to which a CA delegates the + publication of certificate revocation lists. + * Repository A system or collection of distributed systems that + stores certificates and CRLs and serves as a means of distributing + these certificates and CRLs to end entities + +hx509 (Heimdal x509 support) is a near complete X.509 stack that can +handle CMS messages (crypto system used in S/MIME and Kerberos PK-INIT) +and basic certificate processing tasks, path construction, path +validation, OCSP and CRL validation, PKCS10 message construction, CMS +Encrypted (shared secret encrypted), CMS SignedData (certificate +signed), and CMS EnvelopedData (certificate encrypted). + +hx509 can use PKCS11 tokens, PKCS12 files, PEM files, and/or DER encoded +files. + + +File: hx509.info, Node: What is X.509 ?, Next: Setting up a CA, Prev: Introduction, Up: Top + +2 What is X.509, PKIX, PKCS7 and CMS ? +************************************** + +X.509 was created by CCITT (later ITU) for the X.500 directory service. +Today, X.509 discussions and implementations commonly reference the +IETF's PKIX Certificate and CRL Profile of the X.509 v3 certificate +standard, as specified in RFC 3280. + +ITU continues to develop the X.509 standard together with the IETF in a +rather complicated dance. + +X.509 is a public key based security system that has associated data +stored within a so called certificate. Initially, X.509 was a strict +hierarchical system with one root. However, ever evolving requiments +and technology advancements saw the inclusion of multiple policy roots, +bridges and mesh solutions. + +x.509 can also be used as a peer to peer system, though often seen as a +common scenario. + +2.1 Type of certificates +======================== + +There are several flavors of certificate in X.509. + + * Trust anchors + + Trust anchors are strictly not certificates, but commonly stored in + a certificate format as they become easier to manage. Trust + anchors are the keys that an end entity would trust to validate + other certificates. This is done by building a path from the + certificate you want to validate to to any of the trust anchors you + have. + + * End Entity (EE) certificates + + End entity certificates are the most common types of certificates. + End entity certificates cannot issue (sign) certificate themselves + and are generally used to authenticate and authorize users and + services. + + * Certification Authority (CA) certificates + + Certificate authority certificates have the right to issue + additional certificates (be it sub-ordinate CA certificates to + build an trust anchors or end entity certificates). There is no + limit to how many certificates a CA may issue, but there might + other restrictions, like the maximum path depth. + + * Proxy certificates + + Remember the statement "End Entity certificates cannot issue + certificates"? Well that statement is not entirely true. There is + an extension called proxy certificates defined in RFC3820, that + allows certificates to be issued by end entity certificates. The + service that receives the proxy certificates must have explicitly + turned on support for proxy certificates, so their use is somewhat + limited. + + Proxy certificates can be limited by policies stored in the + certificate to what they can be used for. This allows users to + delegate the proxy certificate to services (by sending over the + certificate and private key) so the service can access services on + behalf of the user. + + One example of this would be a print service. The user wants to + print a large job in the middle of the night when the printer isn't + used that much, so the user creates a proxy certificate with the + policy that it can only be used to access files related to this + print job, creates the print job description and send both the + description and proxy certificate with key over to print service. + Later at night when the print service initializes (without any user + intervention), access to the files for the print job is granted via + the proxy certificate. As a result of (in-place) policy + limitations, the certificate cannot be used for any other purposes. + +2.2 Building a path +=================== + +Before validating a certificate path (or chain), the path needs to be +constructed. Given a certificate (EE, CA, Proxy, or any other type), +the path construction algorithm will try to find a path to one of the +trust anchors. + +The process starts by looking at the issuing CA of the certificate, by +Name or Key Identifier, and tries to find that certificate while at the +same time evaluting any policies in-place. + + +File: hx509.info, Node: Setting up a CA, Next: Creating a CA certificate, Prev: What is X.509 ?, Up: Top + +3 Setting up a CA +***************** + +Do not let information overload scare you off! If you are simply +testing or getting started with a PKI infrastructure, skip all this and +go to the next chapter (see: *note Creating a CA certificate::). + +Creating a CA certificate should be more the just creating a +certificate, CA's should define a policy. Again, if you are simply +testing a PKI, policies do not matter so much. However, when it comes +to trust in an organisation, it will probably matter more whom your +users and sysadmins will find it acceptable to trust. + +At the same time, try to keep things simple, it's not very hard to run a +Certificate authority and the process to get new certificates should be +simple. + +You may find it helpful to answer the following policy questions for +your organization at a later stage: + + * How do you trust your CA. + * What is the CA responsibility. + * Review of CA activity. + * How much process should it be to issue certificate. + * Who is allowed to issue certificates. + * Who is allowed to requests certificates. + * How to handle certificate revocation, issuing CRLs and maintain + OCSP services. + + +File: hx509.info, Node: Creating a CA certificate, Next: Issuing certificates, Prev: Setting up a CA, Up: Top + +3.1 Creating a CA certificate +============================= + +This section describes how to create a CA certificate and what to think +about. + +3.1.1 Lifetime CA certificate +----------------------------- + +You probably want to create a CA certificate with a long lifetime, 10 +years at the very minimum. This is because you don't want to push out +the certificate (as a trust anchor) to all you users again when the old +CA certificate expires. Although a trust anchor can't really expire, +not all software works in accordance with published standards. + +Keep in mind the security requirements might be different 10-20 years +into the future. For example, SHA1 is going to be withdrawn in 2010, so +make sure you have enough buffering in your choice of digest/hash +algorithms, signature algorithms and key lengths. + +3.1.2 Create a CA certificate +----------------------------- + +This command below can be used to generate a self-signed CA certificate. + + hxtool issue-certificate \ + --self-signed \ + --issue-ca \ + --generate-key=rsa \ + --subject="CN=CertificateAuthority,DC=test,DC=h5l,DC=se" \ + --lifetime=10years \ + --certificate="FILE:ca.pem" + +3.1.3 Extending the lifetime of a CA certificate +------------------------------------------------ + +You just realised that your CA certificate is going to expire soon and +that you need replace it with a new CA. The easiest way to do that is to +extend the lifetime of your existing CA certificate. + +The example below will extend the CA certificate's lifetime by 10 years. +You should compare this new certificate if it contains all the special +tweaks as the old certificate had. + + hxtool issue-certificate \ + --self-signed \ + --issue-ca \ + --lifetime="10years" \ + --template-certificate="FILE:ca.pem" \ + --template-fields="serialNumber,notBefore,subject,SPKI" \ + --ca-private-key=FILE:ca.pem \ + --certificate="FILE:new-ca.pem" + +3.1.4 Subordinate CA +-------------------- + +This example below creates a new subordinate certificate authority. + + hxtool issue-certificate \ + --ca-certificate=FILE:ca.pem \ + --issue-ca \ + --generate-key=rsa \ + --subject="CN=CertificateAuthority,DC=dev,DC=test,DC=h5l,DC=se" \ + --certificate="FILE:dev-ca.pem" + + +File: hx509.info, Node: Issuing certificates, Next: Issuing CRLs, Prev: Creating a CA certificate, Up: Top + +3.2 Issuing certificates +======================== + +First you'll create a CA certificate, after that you have to deal with +your users and servers and issue certificates to them. + + * Do all the work themself + + Generate the key for the user. This has the problme that the the + CA knows the private key of the user. For a paranoid user this + might leave feeling of disconfort. + + * Have the user do part of the work + + Receive PKCS10 certificate requests fromusers. PKCS10 is a request + for a certificate. The user may specify what DN they want as well + as provide a certificate signing request (CSR). To prove the user + have the key, the whole request is signed by the private key of the + user. + +3.2.1 Name space management +--------------------------- + +What people might want to see. + +Re-issue certificates just because people moved within the organization. + +Expose privacy information. + +Using Sub-component name (+ notation). + +3.2.2 Certificate Revocation, CRL and OCSP +------------------------------------------ + +Certificates that a CA issues may need to be revoked at some stage. As +an example, an employee leaves the organization and does not bother +handing in his smart card (or even if the smart card is handed back - +the certificate on it must no longer be acceptable to services; the +employee has left). + +You may also want to revoke a certificate for a service which is no +longer being offered on your network. Overlooking these scenarios can +lead to security holes which will quickly become a nightmare to deal +with. + +There are two primary protocols for dealing with certificate revokation. +Namely: + + * Certificate Revocation List (CRL) + * Online Certificate Status Protocol (OCSP) + +If however the certificate in qeustion has been destroyed, there is no +need to revoke the certificate because it can not be used by someone +else. This matter since for each certificate you add to CRL, the +download time and processing time for clients are longer. + +CRLs and OCSP responders however greatly help manage compatible services +which may authenticate and authorize users (or services) on an on-going +basis. As an example, VPN connectivity established via certificates for +connecting clients would require your VPN software to make use of a CRL +or an OCSP service to ensure revoked certificates belonging to former +clients are not allowed access to (formerly subscribed) network +services. + + +File: hx509.info, Node: Issuing CRLs, Next: Application requirements, Prev: Issuing certificates, Up: Top + +3.3 Issuing CRLs +================ + +Create an empty CRL with no certificates revoked. Default expiration +value is one year from now. + + hxtool crl-sign \ + --crl-file=crl.der \ + --signer=FILE:ca.pem + +Create a CRL with all certificates in the directory +'/path/to/revoked/dir' included in the CRL as revoked. Also make it +expire one month from now. + + hxtool crl-sign \ + --crl-file=crl.der \ + --signer=FILE:ca.pem \ + --lifetime='1 month' \ + DIR:/path/to/revoked/dir + + +File: hx509.info, Node: Application requirements, Next: CMS signing and encryption, Prev: Issuing CRLs, Up: Top + +3.4 Application requirements +============================ + +Application place different requirements on certificates. This section +tries to expand what they are and how to use hxtool to generate +certificates for those services. + +3.4.1 HTTPS - server +-------------------- + + hxtool issue-certificate \ + --subject="CN=www.test.h5l.se,DC=test,DC=h5l,DC=se" \ + --type="https-server" \ + --hostname="www.test.h5l.se" \ + --hostname="www2.test.h5l.se" \ + ... + +3.4.2 HTTPS - client +-------------------- + + hxtool issue-certificate \ + --subject="UID=testus,DC=test,DC=h5l,DC=se" \ + --type="https-client" \ + ... + +3.4.3 S/MIME - email +-------------------- + +There are two things that should be set in S/MIME certificates, one or +more email addresses and an extended eku usage (EKU), emailProtection. + +The email address format used in S/MIME certificates is defined in +RFC2822, section 3.4.1 and it should be an "addr-spec". + +There are two ways to specifify email address in certificates. The old +way is in the subject distinguished name, _this should not be used_. +The new way is using a Subject Alternative Name (SAN). + +Even though the email address is stored in certificates, they don't need +to be, email reader programs are required to accept certificates that +doesn't have either of the two methods of storing email in certificates +- in which case, the email client will try to protect the user by +printing the name of the certificate instead. + +S/MIME certificate can be used in another special way. They can be +issued with a NULL subject distinguished name plus the email in SAN, +this is a valid certificate. This is used when you wont want to share +more information then you need to. + +hx509 issue-certificate supports adding the email SAN to certificate by +using the -email option, -email also gives an implicit emailProtection +eku. If you want to create an certificate without an email address, the +option -type=email will add the emailProtection EKU. + + hxtool issue-certificate \ + --subject="UID=testus-email,DC=test,DC=h5l,DC=se" \ + --type=email \ + --email="testus@test.h5l.se" \ + ... + +An example of an certificate without and subject distinguished name with +an email address in a SAN. + + hxtool issue-certificate \ + --subject="" \ + --type=email \ + --email="testus@test.h5l.se" \ + ... + +3.4.4 PK-INIT +------------- + +A PK-INIT infrastructure allows users and services to pick up kerberos +credentials (tickets) based on their certificate. This, for example, +allows users to authenticate to their desktops using smartcards while +acquiring kerberos tickets in the process. + +As an example, an office network which offers centrally controlled +desktop logins, mail, messaging (xmpp) and openafs would give users +single sign-on facilities via smartcard based logins. Once the kerberos +ticket has been acquired, all kerberized services would immediately +become accessible based on deployed security policies. + +Let's go over the process of initializing a demo PK-INIT framework: + + hxtool issue-certificate \ + --type="pkinit-kdc" \ + --pk-init-principal="krbtgt/TEST.H5L.SE@TEST.H5L.SE" \ + --hostname=kerberos.test.h5l.se \ + --ca-certificate="FILE:ca.pem,ca.key" \ + --generate-key=rsa \ + --certificate="FILE:kdc.pem" \ + --subject="cn=kdc" + +How to create a certificate for a user. + + hxtool issue-certificate \ + --type="pkinit-client" \ + --pk-init-principal="user@TEST.H5L.SE" \ + --ca-certificate="FILE:ca.pem,ca.key" \ + --generate-key=rsa \ + --subject="cn=Test User" \ + --certificate="FILE:user.pem" + +The -type field can be specified multiple times. The same certificate +can hence house extensions for both pkinit-client as well as S/MIME. + +To use the PKCS11 module, please see the section: *note How to use the +PKCS11 module::. + +More about how to configure the KDC, see the documentation in the +Heimdal manual to set up the KDC. + +3.4.5 XMPP/Jabber +----------------- + +The jabber server certificate should have a dNSname that is the same as +the user entered into the application, not the same as the host name of +the machine. + + hxtool issue-certificate \ + --subject="CN=xmpp1.test.h5l.se,DC=test,DC=h5l,DC=se" \ + --hostname="xmpp1.test.h5l.se" \ + --hostname="test.h5l.se" \ + ... + +The certificate may also contain a jabber identifier (JID) that, if the +receiver allows it, authorises the server or client to use that JID. + +When storing a JID inside the certificate, both for server and client, +it's stored inside a UTF8String within an otherName entity inside the +subjectAltName, using the OID id-on-xmppAddr (1.3.6.1.5.5.7.8.5). + +To read more about the requirements, see RFC3920, Extensible Messaging +and Presence Protocol (XMPP): Core. + +hxtool issue-certificate have support to add jid to the certificate +using the option '--jid'. + + hxtool issue-certificate \ + --subject="CN=Love,DC=test,DC=h5l,DC=se" \ + --jid="lha@test.h5l.se" \ + ... + + +File: hx509.info, Node: CMS signing and encryption, Next: CMS background, Prev: Application requirements, Up: Top + +4 CMS signing and encryption +**************************** + +CMS is the Cryptographic Message System that among other, is used by +S/MIME (secure email) and Kerberos PK-INIT. It's an extended version of +the RSA, Inc standard PKCS7. + + +File: hx509.info, Node: CMS background, Next: Certificate matching, Prev: CMS signing and encryption, Up: Top + +4.1 CMS background +================== + + +File: hx509.info, Node: Certificate matching, Next: Matching syntax, Prev: CMS background, Up: Top + +5 Certificate matching +********************** + +To match certificates hx509 have a special query language to match +certifictes in queries and ACLs. + + +File: hx509.info, Node: Matching syntax, Next: Software PKCS 11 module, Prev: Certificate matching, Up: Top + +5.1 Matching syntax +=================== + +This is the language definitions somewhat slopply descriped: + + + expr = TRUE, + FALSE, + ! expr, + expr AND expr, + expr OR expr, + ( expr ) + compare + + compare = + word == word, + word != word, + word IN ( word [, word ...]) + word IN %{variable.subvariable} + + word = + STRING, + %{variable} + + + +File: hx509.info, Node: Software PKCS 11 module, Next: How to use the PKCS11 module, Prev: Matching syntax, Up: Top + +6 Software PKCS 11 module +************************* + +PKCS11 is a standard created by RSA, Inc to support hardware and +software encryption modules. It can be used by smartcard to expose the +crypto primitives inside without exposing the crypto keys. + +Hx509 includes a software implementation of PKCS11 that runs within the +memory space of the process and thus exposes the keys to the +application. + + +File: hx509.info, Node: How to use the PKCS11 module, Prev: Software PKCS 11 module, Up: Top + +6.1 How to use the PKCS11 module +================================ + + $ cat > ~/.soft-pkcs11.rc <\arg\ @end html + @end macro @end ifhtml diff --git a/crypto/heimdal/doc/win2k.texi b/crypto/heimdal/doc/win2k.texi --- a/crypto/heimdal/doc/win2k.texi +++ b/crypto/heimdal/doc/win2k.texi @@ -311,4 +311,5 @@ @itemize @bullet @item pwdump2 -@uref{http://www.bindview.com/Support/RAZOR/Utilities/Windows/pwdump2_readme.cfm}@end itemize +@uref{http://www.bindview.com/Support/RAZOR/Utilities/Windows/pwdump2_readme.cfm} +@end itemize diff --git a/crypto/heimdal/etc/Makefile.in b/crypto/heimdal/etc/Makefile.in --- a/crypto/heimdal/etc/Makefile.in +++ b/crypto/heimdal/etc/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,14 +93,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common subdir = etc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -57,8 +107,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -71,6 +120,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -90,17 +140,41 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -115,16 +189,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -134,17 +211,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -163,12 +242,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -177,6 +253,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -193,10 +270,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -204,6 +279,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -218,12 +294,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -240,10 +319,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -254,13 +339,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -284,6 +363,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -307,9 +388,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -319,34 +405,42 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; EXTRA_DIST = NTMakefile services.append all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -359,15 +453,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign etc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign etc/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -383,14 +477,16 @@ clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: + +ctags CTAGS: -ctags: CTAGS -CTAGS: +cscope cscopelist: +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -438,10 +534,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -480,9 +581,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -522,37 +622,50 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am .PHONY: all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool dist-hook distclean \ - distclean-generic distclean-libtool distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook 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-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-hook + clean-generic clean-libtool cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-hook 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-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -560,7 +673,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -605,11 +718,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -617,6 +739,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -659,6 +783,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -672,13 +809,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/etc/NTMakefile b/crypto/heimdal/etc/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/etc/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=etc + +!include ../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/include/Makefile.am b/crypto/heimdal/include/Makefile.am --- a/crypto/heimdal/include/Makefile.am +++ b/crypto/heimdal/include/Makefile.am @@ -13,7 +13,7 @@ noinst_HEADERS = heim_threads.h crypto-headers.h -EXTRA_DIST = NTMakefile krb5-types.cross +EXTRA_DIST = NTMakefile krb5-types.cross config.h.w32 if !CROSS_COMPILE @@ -28,18 +28,20 @@ endif CLEANFILES = \ - asn1.h \ + an2ln_plugin.h \ asn1-common.h \ asn1-template.h \ + asn1.h \ asn1_err.h \ base64.h \ + ccache_plugin.h \ cms_asn1.h \ - crmf_asn1.h \ com_err.h \ com_right.h \ - ccache_plugin.h \ - der-protos.h \ + crmf_asn1.h \ + db_plugin.h \ der-private.h \ + der-protos.h \ der.h \ digest_asn1.h \ editline.h \ @@ -47,6 +49,8 @@ getarg.h \ glob.h \ gssapi.h \ + gssapi_mech.h \ + hdb-private.h \ hdb-protos.h \ hdb.h \ hdb_asn1.h \ @@ -58,11 +62,14 @@ heimntlm-protos.h \ heimntlm.h \ hex.h \ + hx509-private.h \ hx509-protos.h \ hx509.h \ hx509_err.h \ k524_err.h \ kafs.h \ + kcm-protos.h \ + kdc-private.h \ kdc-protos.h \ kdc.h \ krb5-private.h \ @@ -76,6 +83,7 @@ kx509_asn1.h \ kx509_err.h \ locate_plugin.h \ + login-protos.h \ ntlm_err.h \ ocsp_asn1.h \ otp.h \ @@ -94,6 +102,8 @@ rtbl.h \ send_to_kdc_plugin.h \ sl.h \ + sqlite3.h \ + sqlite3ext.h \ test-mem.h \ vers.h \ vis.h \ diff --git a/crypto/heimdal/include/Makefile.in b/crypto/heimdal/include/Makefile.in --- a/crypto/heimdal/include/Makefile.in +++ b/crypto/heimdal/include/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -23,6 +22,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -41,16 +95,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(srcdir)/config.h.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common noinst_PROGRAMS = bits$(EXEEXT) subdir = include ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -61,8 +110,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -75,6 +123,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -94,6 +143,8 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = @@ -102,27 +153,59 @@ bits_SOURCES = bits.c bits_OBJECTS = bits.$(OBJEXT) bits_LDADD = $(LDADD) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/bits.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = bits.c DIST_SOURCES = bits.c -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 +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-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/||"`;; \ @@ -144,16 +227,44 @@ 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)$(includedir)" HEADERS = $(nodist_include_HEADERS) $(noinst_HEADERS) 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 +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ + config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ @@ -183,7 +294,9 @@ ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -198,16 +311,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -217,17 +333,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -246,12 +364,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -260,6 +375,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -276,10 +392,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -287,6 +401,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -301,12 +416,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -323,10 +441,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -337,13 +461,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -367,6 +485,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -390,9 +510,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -402,47 +527,57 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) -DHOST=\"$(CANONICAL_HOST)\" @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; SUBDIRS = kadm5 hcrypto gssapi CHECK_LOCAL = no-check-local nodist_include_HEADERS = krb5-types.h noinst_HEADERS = heim_threads.h crypto-headers.h -EXTRA_DIST = NTMakefile krb5-types.cross +EXTRA_DIST = NTMakefile krb5-types.cross config.h.w32 CLEANFILES = \ - asn1.h \ + an2ln_plugin.h \ asn1-common.h \ asn1-template.h \ + asn1.h \ asn1_err.h \ base64.h \ + ccache_plugin.h \ cms_asn1.h \ - crmf_asn1.h \ com_err.h \ com_right.h \ - ccache_plugin.h \ - der-protos.h \ + crmf_asn1.h \ + db_plugin.h \ der-private.h \ + der-protos.h \ der.h \ digest_asn1.h \ editline.h \ @@ -450,6 +585,8 @@ getarg.h \ glob.h \ gssapi.h \ + gssapi_mech.h \ + hdb-private.h \ hdb-protos.h \ hdb.h \ hdb_asn1.h \ @@ -461,11 +598,14 @@ heimntlm-protos.h \ heimntlm.h \ hex.h \ + hx509-private.h \ hx509-protos.h \ hx509.h \ hx509_err.h \ k524_err.h \ kafs.h \ + kcm-protos.h \ + kdc-private.h \ kdc-protos.h \ kdc.h \ krb5-private.h \ @@ -479,6 +619,7 @@ kx509_asn1.h \ kx509_err.h \ locate_plugin.h \ + login-protos.h \ ntlm_err.h \ ocsp_asn1.h \ otp.h \ @@ -497,6 +638,8 @@ rtbl.h \ send_to_kdc_plugin.h \ sl.h \ + sqlite3.h \ + sqlite3ext.h \ test-mem.h \ vers.h \ vis.h \ @@ -513,7 +656,7 @@ $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -526,15 +669,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -546,10 +689,8 @@ $(am__aclocal_m4_deps): config.h: stamp-h1 - @if test ! -f $@; then \ - rm -f stamp-h1; \ - $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ - else :; fi + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 @@ -570,9 +711,10 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -bits$(EXEEXT): $(bits_OBJECTS) $(bits_DEPENDENCIES) + +bits$(EXEEXT): $(bits_OBJECTS) $(bits_DEPENDENCIES) $(EXTRA_bits_DEPENDENCIES) @rm -f bits$(EXEEXT) - $(LINK) $(bits_OBJECTS) $(bits_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(bits_OBJECTS) $(bits_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -580,28 +722,34 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bits.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bits.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -610,8 +758,11 @@ -rm -rf .libs _libs install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -625,27 +776,28 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(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): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# 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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + 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; \ @@ -660,57 +812,12 @@ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(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; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && 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 +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -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) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -726,12 +833,7 @@ 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -743,15 +845,11 @@ $$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; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -760,11 +858,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -796,13 +911,10 @@ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || 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; \ @@ -844,10 +956,15 @@ installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -867,7 +984,7 @@ mostlyclean-am distclean: distclean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/bits.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-tags @@ -891,9 +1008,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-recursive install-html-am: @@ -915,7 +1031,7 @@ installcheck-am: maintainer-clean: maintainer-clean-recursive - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/bits.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -935,43 +1051,56 @@ uninstall-am: uninstall-nodist_includeHEADERS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \ - ctags-recursive install-am install-data-am install-exec-am \ - install-strip tags-recursive uninstall-am - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool clean-noinstPROGRAMS ctags \ - ctags-recursive dist-hook distclean distclean-compile \ +.MAKE: $(am__recursive_targets) all check-am install-am \ + install-data-am install-strip uninstall-am + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + am--depfiles check check-am check-local clean clean-generic \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am dist-hook distclean distclean-compile \ distclean-generic distclean-hdr distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am \ install-data-hook install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-info install-info-am install-man \ + install-exec-am install-exec-local install-html \ + install-html-am install-info install-info-am install-man \ install-nodist_includeHEADERS 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-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - tags tags-recursive uninstall uninstall-am uninstall-hook \ + tags tags-am uninstall uninstall-am uninstall-hook \ uninstall-nodist_includeHEADERS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -979,7 +1108,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1024,11 +1153,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1036,6 +1174,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1078,6 +1218,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1091,13 +1244,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/include/NTMakefile b/crypto/heimdal/include/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/include/NTMakefile @@ -0,0 +1,121 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=include + +SUBDIRS=kadm5 hcrypto gssapi + +!include ../windows/NTMakefile.w32 +!include ../windows/NTMakefile.version +!include ../windows/NTMakefile.config + +INCFILES= \ + $(INCDIR)\config.h \ + $(INCDIR)\crypto-headers.h \ + $(INCDIR)\heim_threads.h \ + $(INCDIR)\krb5-types.h \ + $(INCDIR)\version.h + +$(INCDIR)\krb5-types.h: $(OBJ)\bits.exe + $(OBJ)\bits.exe $(INCDIR)\krb5-types.h + +$(OBJ)\bits.exe: $(OBJ)\bits.obj + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(INCDIR)\config.h: config.h.w32 ..\windows\NTMakefile.config ..\windows\NTMakefile.version NTMakefile + $(PERL) << < config.h.w32 > $@ + +while(<>) { + + if (m/\@FEATURE_DEFS\@/) { + + if ("$(KRB5)") { print "#define KRB5 1\n"; } + if ("$(KRB4)") { print "#define KRB4 1\n"; } + if ("$(WEAK_CRYPTO)") { print "#define HEIM_WEAK_CRYPTO 1\n"; } + if ("$(HCRYPTO_FALLBACK)") { print "#define HCRYPTO_FALLBACK 1\n"; } else { print "#define HCRYPTO_FALLBACK 0\n"; } + if ("$(PKINIT)") { print "#define PKINIT 1\n"; } + if ("$(NO_AFS)") { print "#define NO_AFS 1\n"; } + if ("$(OPENLDAP)") { print "#define OPENLDAP 1\n"; } + if ("$(OPENLDAP_MODULE)") { print "#define OPENLDAP_MODULE 1\n"; } + if ("$(OTP)") { print "#define OTP 1 \n"; } + if ("$(AUTHENTICATION)") { print "#define AUTHENTICATION 1\n"; } + if ("$(DIAGNOSTICS)") { print "#define DIAGNOSTICS 1\n"; } + if ("$(ENCRYPTION)") { print "#define ENCRYPTION 1\n"; } + if ("$(ENABLE_AFS_STRING_TO_KEY)") { print "#define ENABLE_AFS_STRING_TO_KEY 1\n"; } + if ("$(ENABLE_PTHREAD_SUPPORT)") { print "#define ENABLE_PTHREAD_SUPPORT 1\n"; } + if ("$(HAVE_PTHREAD_H)") { print "#define HAVE_PTHREAD_H 1\n"; } + if ("$(ENV_HACK)") { print "#define ENV_HACK 1\n"; } + if ("$(HAVE_KCM)") { print "#define HAVE_KCM 1\n"; } + if ("$(HAVE_SCC)") { print "#define HAVE_SCC 1\n"; } + if ("$(HAVE_STDINT_H)") { print "#define HAVE_STDINT_H 1\n"; } + if ("$(DIR_hdbdir)") { print "#define HDB_DB_DIR \"".'$(DIR_hdbdir)'."\"\n"; } + if ("$(HAVE_MSLSA_CACHE)") { print "#define HAVE_MSLSA_CACHE 1\n"; } + if ("$(NO_LOCALNAME)") { print "#define NO_LOCALNAME 1\n"; } + + } elsif (m/\@VERSION_OPTDEFS\@/) { + + if ("$(VER_PRERELEASE)") { print "#define VER_PRERELEASE 1\n"; } + if ("$(VER_PRIVATE)") { print "#define VER_PRIVATE \"$(VER_PRIVATE)\"\n"; } + if ("$(VER_SPECIAL)") { print "#define VER_SPECIAL \"$(VER_SPECIAL)\"\n"; } + if ("$(BUILD)" eq "dbg") { print "#define VER_DEBUG 1\n"; } + print "#define HOST \"$(COMPUTERNAME)\"\n"; + + } else { + + s/\@PACKAGE\@/$(VER_PACKAGE)/; + s/\@PACKAGE_NAME\@/$(VER_PACKAGE_NAME)/; + s{\@PACKAGE_BUGREPORT\@}{$(VER_PACKAGE_BUGREPORT:@=\@)}; + s/\@PACKAGE_VERSION\@/$(VER_PACKAGE_VERSION)/; + s/\@PACKAGE_COPYRIGHT\@/$(VER_PACKAGE_COPYRIGHT)/; + s/\@PACKAGE_COMPANY\@/$(VER_PACKAGE_COMPANY)/; + s/\@MAJOR\@/$(VER_PRODUCT_MAJOR)/; + s/\@MINOR\@/$(VER_PRODUCT_MINOR)/; + s/\@AUX\@/$(VER_PRODUCT_AUX)/; + s/\@PATCH\@/$(VER_PRODUCT_PATCH)/; + + print $_; + } +} + +<< + +$(INCDIR)\version.h: ..\windows\NTMakefile.version NTMakefile + $(CP) << $@ +const char *heimdal_long_version = "@(#)$$Version: $(VER_PACKAGE_NAME) $(VER_PACKAGE_VERSION) by $(USERNAME) on $(COMPUTERNAME) ($(CPU)-pc-windows) $$"; +const char *heimdal_version = "$(VER_PACKAGE_NAME) $(VER_PACKAGE_VERSION)"; +<< + +all:: $(INCFILES) + +clean:: + -$(RM) $(INCFILES) + diff --git a/crypto/heimdal/include/bits.c b/crypto/heimdal/include/bits.c --- a/crypto/heimdal/include/bits.c +++ b/crypto/heimdal/include/bits.c @@ -49,7 +49,7 @@ #define BITSIZE(TYPE) \ { \ int b = 0; TYPE x = 1, zero = 0; const char *pre = "u"; \ - char tmp[128], tmp2[128]; \ + char tmp[128], tmp2[192]; \ while(x){ x <<= 1; b++; if(x < zero) pre=""; } \ if(b >= len){ \ size_t tabs; \ @@ -68,13 +68,13 @@ #endif static void -try_signed(FILE *f, int len) __attribute__ ((unused)); +try_signed(FILE *f, int len) __attribute__ ((__unused__)); static void -try_unsigned(FILE *f, int len) __attribute__ ((unused)); +try_unsigned(FILE *f, int len) __attribute__ ((__unused__)); static int -print_bt(FILE *f, int flag) __attribute__ ((unused)); +print_bt(FILE *f, int flag) __attribute__ ((__unused__)); static void try_signed(FILE *f, int len) @@ -118,7 +118,8 @@ { FILE *f; int flag; - const char *fn, *hb; + char *p = NULL; + const char *hb; if (argc > 1 && strcmp(argv[1], "--version") == 0) { printf("some version"); @@ -126,14 +127,11 @@ } if(argc < 2){ - fn = "bits.h"; hb = "__BITS_H__"; f = stdout; } else { - char *p; - fn = argv[1]; - p = malloc(strlen(fn) + 5); - sprintf(p, "__%s__", fn); + p = malloc(strlen(argv[1]) + 5); + sprintf(p, "__%s__", argv[1]); hb = p; for(; *p; p++){ if(!isalnum((unsigned char)*p)) @@ -141,9 +139,6 @@ } f = fopen(argv[1], "w"); } - fprintf(f, "/* %s -- this file was generated for %s by\n", fn, HOST); - fprintf(f, " %*s %s */\n\n", (int)strlen(fn), "", - "$Id$"); fprintf(f, "#ifndef %s\n", hb); fprintf(f, "#define %s\n", hb); fprintf(f, "\n"); @@ -255,39 +250,57 @@ #endif /* KRB5 */ + fprintf(f, "#if !defined(__has_extension)\n"); + fprintf(f, "#define __has_extension(x) 0\n"); + fprintf(f, "#endif\n\n"); + + fprintf(f, "#ifndef KRB5TYPES_REQUIRE_GNUC\n"); + fprintf(f, "#define KRB5TYPES_REQUIRE_GNUC(m,n,p) \\\n"); + fprintf(f, " (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__) >= \\\n"); + fprintf(f, " (((m) * 10000) + ((n) * 100) + (p)))\n"); + fprintf(f, "#endif\n\n"); + fprintf(f, "#ifndef HEIMDAL_DEPRECATED\n"); - fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); - fprintf(f, "#define HEIMDAL_DEPRECATED __attribute__((deprecated))\n"); + fprintf(f, "#if __has_extension(deprecated) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n"); + fprintf(f, "#define HEIMDAL_DEPRECATED __attribute__ ((__deprecated__))\n"); fprintf(f, "#elif defined(_MSC_VER) && (_MSC_VER>1200)\n"); fprintf(f, "#define HEIMDAL_DEPRECATED __declspec(deprecated)\n"); fprintf(f, "#else\n"); fprintf(f, "#define HEIMDAL_DEPRECATED\n"); fprintf(f, "#endif\n"); - fprintf(f, "#endif\n"); + fprintf(f, "#endif\n\n"); fprintf(f, "#ifndef HEIMDAL_PRINTF_ATTRIBUTE\n"); - fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); - fprintf(f, "#define HEIMDAL_PRINTF_ATTRIBUTE(x) __attribute__((format x))\n"); + fprintf(f, "#if __has_extension(format) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n"); + fprintf(f, "#define HEIMDAL_PRINTF_ATTRIBUTE(x) __attribute__ ((__format__ x))\n"); fprintf(f, "#else\n"); fprintf(f, "#define HEIMDAL_PRINTF_ATTRIBUTE(x)\n"); fprintf(f, "#endif\n"); - fprintf(f, "#endif\n"); + fprintf(f, "#endif\n\n"); fprintf(f, "#ifndef HEIMDAL_NORETURN_ATTRIBUTE\n"); - fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); - fprintf(f, "#define HEIMDAL_NORETURN_ATTRIBUTE __attribute__((noreturn))\n"); + fprintf(f, "#if __has_extension(noreturn) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n"); + fprintf(f, "#define HEIMDAL_NORETURN_ATTRIBUTE __attribute__ ((__noreturn__))\n"); fprintf(f, "#else\n"); fprintf(f, "#define HEIMDAL_NORETURN_ATTRIBUTE\n"); fprintf(f, "#endif\n"); - fprintf(f, "#endif\n"); + fprintf(f, "#endif\n\n"); fprintf(f, "#ifndef HEIMDAL_UNUSED_ATTRIBUTE\n"); - fprintf(f, "#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 )))\n"); - fprintf(f, "#define HEIMDAL_UNUSED_ATTRIBUTE __attribute__((unused))\n"); + fprintf(f, "#if __has_extension(unused) || KRB5TYPES_REQUIRE_GNUC(3,1,0)\n"); + fprintf(f, "#define HEIMDAL_UNUSED_ATTRIBUTE __attribute__ ((__unused__))\n"); fprintf(f, "#else\n"); fprintf(f, "#define HEIMDAL_UNUSED_ATTRIBUTE\n"); fprintf(f, "#endif\n"); + fprintf(f, "#endif\n\n"); + + fprintf(f, "#ifndef HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE\n"); + fprintf(f, "#if __has_extension(warn_unused_result) || KRB5TYPES_REQUIRE_GNUC(3,3,0)\n"); + fprintf(f, "#define HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE __attribute__ ((__warn_unused_result__))\n"); + fprintf(f, "#else\n"); + fprintf(f, "#define HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE\n"); fprintf(f, "#endif\n"); + fprintf(f, "#endif\n\n"); fprintf(f, "#endif /* %s */\n", hb); diff --git a/crypto/heimdal/include/config.h.in b/crypto/heimdal/include/config.h.in --- a/crypto/heimdal/include/config.h.in +++ b/crypto/heimdal/include/config.h.in @@ -114,9 +114,6 @@ /* Define to 1 if you have the `arc4random' function. */ #undef HAVE_ARC4RANDOM -/* Define to 1 if you have the header file. */ -#undef HAVE_ARPA_FTP_H - /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H @@ -153,6 +150,9 @@ /* Define to 1 if you have the `bswap32' function. */ #undef HAVE_BSWAP32 +/* Define to 1 if you have the `bswap64' function. */ +#undef HAVE_BSWAP64 + /* Define to 1 if you have the header file. */ #undef HAVE_CAPABILITY_H @@ -198,7 +198,7 @@ /* define if you have a berkeley db1/2 library */ #undef HAVE_DB1 -/* define if you have a berkeley db3/4/5 library */ +/* define if you have a berkeley db3/4/5/6 library */ #undef HAVE_DB3 /* Define to 1 if you have the header file. */ @@ -210,6 +210,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_DB5_DB_H +/* Define to 1 if you have the header file. */ +#undef HAVE_DB6_DB_H + /* Define if you have user supplied header location */ #undef HAVE_DBHEADER @@ -294,6 +297,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_DISPATCH_DISPATCH_H +/* Define to 1 if you have the `dladdr' function. */ +#undef HAVE_DLADDR + /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H @@ -315,6 +321,9 @@ /* Define if you have the function `ecalloc'. */ #undef HAVE_ECALLOC +/* Define to 1 if you have the header file. */ +#undef HAVE_EDITLINE_READLINE_H + /* Define if you have the function `emalloc'. */ #undef HAVE_EMALLOC @@ -357,6 +366,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_FNMATCH_H +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + /* Have -framework Security */ #undef HAVE_FRAMEWORK_SECURITY @@ -378,6 +390,9 @@ /* Define to 1 if you have the `getaddrinfo' function. */ #undef HAVE_GETADDRINFO +/* Define to 1 if you have the `getauxval' function. */ +#undef HAVE_GETAUXVAL + /* Define to 1 if you have the `getconfattr' function. */ #undef HAVE_GETCONFATTR @@ -472,6 +487,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_GRP_H +/* define to use openssl's libcrypto as the default backend for libhcrypto */ +#undef HAVE_HCRYPTO_W_OPENSSL + /* Define to 1 if you have the `hstrerror' function. */ #undef HAVE_HSTRERROR @@ -535,12 +553,18 @@ /* Define if you want to use the Kerberos Credentials Manager. */ #undef HAVE_KCM +/* Define to 1 if you have the `kill' function. */ +#undef HAVE_KILL + /* Define to 1 if you have the header file. */ #undef HAVE_LIBUTIL_H /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H +/* define if you have the LMDB library */ +#undef HAVE_LMDB + /* Define to 1 if you have the `loadquery' function. */ #undef HAVE_LOADQUERY @@ -568,8 +592,8 @@ /* Define if you have the function `memmove'. */ #undef HAVE_MEMMOVE -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H +/* Define if you have the function `memset_s'. */ +#undef HAVE_MEMSET_S /* Define if you have the function `mkstemp'. */ #undef HAVE_MKSTEMP @@ -628,9 +652,6 @@ /* Define to 1 if you have the `openpty' function. */ #undef HAVE_OPENPTY -/* define to use openssl's libcrypto */ -#undef HAVE_OPENSSL - /* Define to enable basic OSF C2 support. */ #undef HAVE_OSFC2 @@ -673,12 +694,11 @@ /* Define if you have a readline compatible library. */ #undef HAVE_READLINE -/* Define to 1 if you have the - <[readline.h])[][]_AH_CHECK_HEADER([readline/readline.h]> header file. */ +/* Define to 1 if you have the header file. */ #undef HAVE_READLINE_H -/* Define to 1 if you have the header file. */ -#undef HAVE_READLINE_READLINE_H_ +/* Define to 1 if you have the header file. */ +#undef HAVE_READLINE_READLINE_H /* Define if you have the function `readv'. */ #undef HAVE_READV @@ -815,6 +835,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H @@ -881,6 +904,12 @@ /* Define if you have the function `strtok_r'. */ #undef HAVE_STRTOK_R +/* Define if you have the function strtoll. */ +#undef HAVE_STRTOLL + +/* Define if you have the function strtoull. */ +#undef HAVE_STRTOULL + /* Define to 1 if the system has the type `struct addrinfo'. */ #undef HAVE_STRUCT_ADDRINFO @@ -911,51 +940,6 @@ /* Define if struct tm has field tm_zone. */ #undef HAVE_STRUCT_TM_TM_ZONE -/* Define if struct utmpx has field ut_exit. */ -#undef HAVE_STRUCT_UTMPX_UT_EXIT - -/* Define if struct utmpx has field ut_host. */ -#undef HAVE_STRUCT_UTMPX_UT_HOST - -/* Define if struct utmpx has field ut_id. */ -#undef HAVE_STRUCT_UTMPX_UT_ID - -/* Define if struct utmpx has field ut_line. */ -#undef HAVE_STRUCT_UTMPX_UT_LINE - -/* Define if struct utmpx has field ut_pid. */ -#undef HAVE_STRUCT_UTMPX_UT_PID - -/* Define if struct utmpx has field ut_syslen. */ -#undef HAVE_STRUCT_UTMPX_UT_SYSLEN - -/* Define if struct utmpx has field ut_tv. */ -#undef HAVE_STRUCT_UTMPX_UT_TV - -/* Define if struct utmpx has field ut_type. */ -#undef HAVE_STRUCT_UTMPX_UT_TYPE - -/* Define if struct utmpx has field ut_user. */ -#undef HAVE_STRUCT_UTMPX_UT_USER - -/* Define if struct utmp has field ut_addr. */ -#undef HAVE_STRUCT_UTMP_UT_ADDR - -/* Define if struct utmp has field ut_host. */ -#undef HAVE_STRUCT_UTMP_UT_HOST - -/* Define if struct utmp has field ut_id. */ -#undef HAVE_STRUCT_UTMP_UT_ID - -/* Define if struct utmp has field ut_pid. */ -#undef HAVE_STRUCT_UTMP_UT_PID - -/* Define if struct utmp has field ut_type. */ -#undef HAVE_STRUCT_UTMP_UT_TYPE - -/* Define if struct utmp has field ut_user. */ -#undef HAVE_STRUCT_UTMP_UT_USER - /* define if struct winsize is declared in sys/termios.h */ #undef HAVE_STRUCT_WINSIZE @@ -989,6 +973,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_AUXV_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_BITYPES_H @@ -1001,6 +988,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_CATEGORY_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_ERRNO_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H @@ -1187,12 +1177,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UTIL_H -/* Define to 1 if you have the header file. */ -#undef HAVE_UTMPX_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UTMP_H - /* Define to 1 if the system has the type `u_int16_t'. */ #undef HAVE_U_INT16_T @@ -1238,6 +1222,9 @@ /* Define if you have the function `vwarnx'. */ #undef HAVE_VWARNX +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + /* Define if you have the function `warn'. */ #undef HAVE_WARN @@ -1259,15 +1246,6 @@ /* define if struct winsize has ws_ypixel */ #undef HAVE_WS_YPIXEL -/* Define to 1 if you have the `XauFileName' function. */ -#undef HAVE_XAUFILENAME - -/* Define to 1 if you have the `XauReadAuth' function. */ -#undef HAVE_XAUREADAUTH - -/* Define to 1 if you have the `XauWriteAuth' function. */ -#undef HAVE_XAUWRITEAUTH - /* Define to 1 if you have the `yp_get_default_domain' function. */ #undef HAVE_YP_GET_DEFAULT_DOMAIN @@ -1289,12 +1267,16 @@ /* have __sync_add_and_fetch */ #undef HAVE___SYNC_ADD_AND_FETCH +/* Define to one of cc, pkcs11, ossl, w32crypto, or hcrypto to set a default + hcrypto provider */ +#undef HCRYPTO_DEF_PROVIDER + +/* Set to 1 to allow fallback to hcrypto for unavailable algorithms */ +#undef HCRYPTO_FALLBACK + /* Define if you want support for weak crypto */ #undef HEIM_WEAK_CRYPTO -/* Define if you have the hesiod package. */ -#undef HESIOD - /* Enable Kerberos 5 support in applications. */ #undef KRB5 @@ -1316,8 +1298,7 @@ /* path to localstate */ #undef LOCALSTATEDIR -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ +/* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* define if the system is missing a prototype for asnprintf() */ @@ -1413,9 +1394,6 @@ /* Define if you don't wan't support for AFS. */ #undef NO_AFS -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - /* Define if you don't want to use mmap. */ #undef NO_MMAP @@ -1456,6 +1434,9 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION +/* path to PKCS11 module */ +#undef PKCS11_MODULE_PATH + /* Define to enable PKINIT. */ #undef PKINIT @@ -1480,7 +1461,9 @@ /* Define if you have the sqlite3 package. */ #undef SQLITE3 -/* Define to 1 if you have the ANSI C header files. */ +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Define if you have streams ptys. */ @@ -1490,9 +1473,6 @@ char *, size_t) */ #undef STRERROR_R_PROTO_COMPATIBLE -/* Define if os support want to detach is daemonens. */ -#undef SUPPORT_DETACH - /* Enable use of inetd style startup. */ #undef SUPPORT_INETD @@ -1502,7 +1482,8 @@ /* Define to what version of SunOS you are running. */ #undef SunOS -/* Define to 1 if you can safely include both and . */ +/* Define to 1 if you can safely include both and . This + macro is obsolete. */ #undef TIME_WITH_SYS_TIME /* Define to 1 if your declares `struct tm'. */ @@ -1517,9 +1498,6 @@ /* define if target is big endian */ #undef WORDS_BIGENDIAN -/* Define to 1 if the X Window System is missing or not being used. */ -#undef X_DISPLAY_MISSING - /* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a `char[]'. */ #undef YYTEXT_POINTER @@ -1539,6 +1517,12 @@ /* Define to get POSIX getpwnam_r in some systems. */ #undef _POSIX_PTHREAD_SEMANTICS +/* Enable C11 prototypes for memset_s and friends */ +#undef _STDC_C11_BCI + +/* Enable general extensions on Solaris. */ +#undef __EXTENSIONS__ + /* Define to empty if `const' does not conform to ANSI C. */ #undef const @@ -1557,7 +1541,7 @@ /* Define to `long int' if does not define. */ #undef off_t -/* Define to `int' if does not define. */ +/* Define as a signed integer type capable of holding a process identifier. */ #undef pid_t /* Path name delimiter */ @@ -1580,10 +1564,6 @@ struct sockaddr_in; #endif -#ifdef __APPLE__ -#include -#endif - #ifdef ROKEN_RENAME #include "roken_rename.h" #endif @@ -1594,10 +1574,6 @@ #define SIGRETURN(x) return (RETSIGTYPE)(x) #endif -#ifdef BROKEN_REALLOC -#define realloc(X, Y) rk_realloc((X), (Y)) -#endif - #ifdef ENDIANESS_IN_SYS_PARAM_H # include @@ -1624,3 +1600,7 @@ #define LOGIN_PATH BINDIR "/login" #endif + +#ifdef __APPLE__ +#include +#endif diff --git a/crypto/heimdal/include/config.h.w32 b/crypto/heimdal/include/config.h.w32 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/include/config.h.w32 @@ -0,0 +1,1493 @@ +/*********************************************************************** + * Copyright (c) 2009-2016, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +#ifndef RCSID +#define RCSID(msg) \ +static const char *const rcsid[] = { (const char *)rcsid, "@(#)" msg } +#endif + +/* If this file is being included by a resource script, don't bother + with anything other than the version macros. */ +#ifndef RC_INVOKED + +#define MaxHostNameLen (64+4) +#define MaxPathLen MAX_PATH + +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN MaxHostNameLen +#endif +#ifndef MAXPATHLEN +#define MAXPATHLEN MaxPathLen +#endif + +#ifdef BUILD_KRB5_LIB +#ifndef KRB5_LIB +#ifdef _WIN32 +#define KRB5_LIB_FUNCTION +#define KRB5_LIB_CALL __stdcall +#define KRB5_LIB_VARIABLE +#else +#define KRB5_LIB_FUNCTION +#define KRB5_LIB_CALL +#define KRB5_LIB_VARIABLE +#endif +#endif +#endif + + +#ifdef BUILD_ROKEN_LIB +#ifndef ROKEN_LIB +#ifdef _WIN32 +#define ROKEN_LIB_FUNCTION +#define ROKEN_LIB_CALL __cdecl +#define ROKEN_LIB_VARIABLE +#else +#define ROKEN_LIB_FUNCTION +#define ROKEN_LIB_CALL +#define ROKEN_LIB_VARIABLE +#endif +#endif +#endif + + +#ifdef BUILD_GSSAPI_LIB +#ifndef GSSAPI_LIB +#ifdef _WIN32 +#define GSSAPI_LIB_FUNCTION +#define GSSAPI_LIB_CALL __stdcall +#define GSSAPI_LIB_VARIABLE +#else +#define GSSAPI_LIB_FUNCTION +#define GSSAPI_LIB_CALL +#define GSSAPI_LIB_VARIABLE +#endif +#endif +#endif + +/* Feature macros */ + +@FEATURE_DEFS@ + +/* Define is backslashes act as path name delimiters */ +#define BACKSLASH_PATH_DELIM 1 + +/* Path separator character */ +#define PATH_SEP ";" + +/* Define if you want to use DES encryption in telnet. */ +#define DES_ENCRYPTION 1 + +/* Define this if you want support for broken ENV_{VAR,VAL} telnets. */ +/* #undef ENV_HACK */ + +/* define if prototype of gethostbyaddr is compatible with struct hostent + *gethostbyaddr(const void *, size_t, int) */ +/* #undef GETHOSTBYADDR_PROTO_COMPATIBLE */ + +/* define if prototype of gethostbyname is compatible with struct hostent + *gethostbyname(const char *) */ +#define GETHOSTBYNAME_PROTO_COMPATIBLE 1 + +/* define if prototype of getservbyname is compatible with struct servent + *getservbyname(const char *, const char *) */ +#define GETSERVBYNAME_PROTO_COMPATIBLE 1 + +/* define if prototype of getsockname is compatible with int getsockname(int, + struct sockaddr*, socklen_t*) */ +/* #undef GETSOCKNAME_PROTO_COMPATIBLE */ + +/* Define if you have the `altzone' variable. */ +/* #undef HAVE_ALTZONE */ + +/* Define to 1 if you have the `arc4random' function. */ +/* #undef HAVE_ARC4RANDOM */ + +/* 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_ARPA_NAMESER_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ARPA_TELNET_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ASL_H */ + +/* Define to 1 if you have the `asnprintf' function. */ +/* #undef HAVE_ASNPRINTF */ + +/* Define to 1 if you have the `asprintf' function. */ +/* #undef HAVE_ASPRINTF */ + +/* Define to 1 if you have the `atexit' function. */ +#define HAVE_ATEXIT 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BIND_BITYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BSDSETJMP_H */ + +/* Define to 1 if you have the `bswap16' function. */ +/* #undef HAVE_BSWAP16 */ + +/* Define to 1 if you have the `bswap32' function. */ +/* #undef HAVE_BSWAP32 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CAPABILITY_H */ + +/* Define to 1 if you have the `cap_set_proc' function. */ +/* #undef HAVE_CAP_SET_PROC */ + +/* Define to 1 if you have the `cgetent' function. */ +/* #undef HAVE_CGETENT */ + +/* Define if the system defines 'CHAR' type */ +#define HAVE_CHAR 1 + +/* Define if you have the function `chown'. */ +#define HAVE_CHOWN 1 + +/* Define if you have the function `closefrom'. */ +/* #undef HAVE_CLOSEFROM */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CONFIG_H */ + +/* Define if is present on the system is should be used for + handling low level console operations. */ +#define HAVE_CONIO_H + +/* Define if you have the function `copyhostent'. */ +/* #undef HAVE_COPYHOSTENT */ + +/* Define to 1 if you have the `crypt' function. */ +/* #undef HAVE_CRYPT */ + +/* Define to 1 if you have the header file. */ +/* #ndef HAVE_CRYPT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CURSES_H */ + +/* Define if you have the function `daemon'. */ +/* #define HAVE_DAEMON 1 */ + +/* define if you have a berkeley db1/2 library */ +/* #undef HAVE_DB1 */ + +/* define if you have a berkeley db3/4 library */ +/* #define HAVE_DB3 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DB3_DB_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_DB4_DB_H 1 */ + +/* Define to 1 if you have the `dbm_firstkey' function. */ +/* #define HAVE_DBM_FIRSTKEY 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DBM_H */ + +/* Define to 1 if you have the `dbopen' function. */ +/* #undef HAVE_DBOPEN */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_DB_185_H 1 */ + +/* Define to 1 if you have the `db_create' function. */ +/* #define HAVE_DB_CREATE 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_DB_H 1 */ + +/* define if you have ndbm compat in db */ +/* #define HAVE_DB_NDBM 1 */ + +/* Define to 1 if you have the declaration of `altzone', and to 0 if you + don't. */ +/* #undef HAVE_DECL_ALTZONE */ + +/* Define to 1 if you have the declaration of `environ', and to 0 if you + don't. */ +#define HAVE_DECL_ENVIRON 1 + +/* Define to 1 if you have the declaration of `h_errlist', and to 0 if you + don't. */ +/* #undef HAVE_DECL_H_ERRLIST */ + +/* Define to 1 if you have the declaration of `h_errno', and to 0 if you + don't. */ +#define HAVE_DECL_H_ERRNO 1 + +/* Define to 1 if you have the declaration of `h_nerr', and to 0 if you don't. + */ +/* #undef HAVE_DECL_H_NERR */ + +/* Define to 1 if you have the declaration of `optarg', and to 0 if you don't. + */ +/* #undef HAVE_DECL_OPTARG */ + +/* Define to 1 if you have the declaration of `opterr', and to 0 if you don't. + */ +/* #undef HAVE_DECL_OPTERR */ + +/* Define to 1 if you have the declaration of `optind', and to 0 if you don't. + */ +/* #undef HAVE_DECL_OPTIND */ + +/* Define to 1 if you have the declaration of `optopt', and to 0 if you don't. + */ +/* #undef HAVE_DECL_OPTOPT */ + +/* Define to 1 if you have the declaration of `timezone', and to 0 if you + don't. */ +#define HAVE_DECL_TIMEZONE 1 + +/* Define to 1 if you have the declaration of `_res', and to 0 if you don't. + */ +/* #undef HAVE_DECL__RES */ + +/* Define to 1 if you have the declaration of `__progname', and to 0 if you + don't. */ +#define HAVE_DECL___PROGNAME 0 + +/* Define to 1 if you have the header file. */ +/* MSVC doesn't provide a , but we implement it in + lib/roken. */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +/* MSVC doesn't provide a , but we implement it in lib/roken. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `dlopen' function. */ +/* MSVC doesn't provide a , but we implement it in lib/roken. */ +#define HAVE_DLOPEN 1 + +/* Define to 1 if you have the `dladdr' function. */ +/* MSVC doesn't provide a , but we implement it in lib/roken. */ +#define HAVE_DLADDR 1 + +/* Define to 1 if you have the `dn_expand' function. */ +/* #undef HAVE_DN_EXPAND */ + +/* Define to 1 if you have the `door_create' function. */ +/* #undef HAVE_DOOR_CREATE */ + +/* Define if you have the function `ecalloc'. */ +/* #undef HAVE_ECALLOC */ + +/* Define to 1 if you have the `el_init' function. */ +/* #undef HAVE_EL_INIT */ + +/* Define if you have the function `emalloc'. */ +/* #undef HAVE_EMALLOC */ + +/* Define if you have the function `erealloc'. */ +/* #undef HAVE_EREALLOC */ + +/* Define if you have the function `err'. */ +#define HAVE_ERR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define if you have the function `errx'. */ +#define HAVE_ERRX 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERR_H 1 + +/* Define if you have the function `estrdup'. */ +/* #undef HAVE_ESTRDUP */ + +/* Define if you have the function `fchown'. */ +/* #undef HAVE_FCHOWN */ + +/* Define to 1 if you have the `fcntl' function. */ +/* #undef HAVE_FCNTL */ + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define if you have the function `flock'. */ +/* #undef HAVE_FLOCK */ + +/* Define if you have the function `fnmatch'. */ +/* #undef HAVE_FNMATCH */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_FNMATCH_H */ + +/* Define if el_init takes four arguments. */ +/* #undef HAVE_FOUR_VALUED_EL_INIT */ + +/* Have -framework Security */ +/* #undef HAVE_FRAMEWORK_SECURITY */ + +/* Define to 1 if you have the `freeaddrinfo' function. */ +#define HAVE_FREEADDRINFO 1 + +/* Define if you have the function `freehostent'. */ +/* #undef HAVE_FREEHOSTENT */ + +/* Define to 1 if you have the `gai_strerror' function. */ +#define HAVE_GAI_STRERROR 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_GDBM_NDBM_H */ + +/* Define to 1 if you have the `getaddrinfo' function. */ +#define HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getconfattr' function. */ +/* #undef HAVE_GETCONFATTR */ + +/* Define if you have the function `getcwd'. */ +#define HAVE_GETCWD 1 + +/* Define if you have the function `getdtablesize'. */ +/* #define HAVE_GETDTABLESIZE 1 */ + +/* Define if you have the function `getegid'. */ +/* #define HAVE_GETEGID 1 */ + +/* Define if you have the function `geteuid'. */ +/* #define HAVE_GETEUID 1 */ + +/* Define if you have the function `getgid'. */ +/* #define HAVE_GETGID 1 */ + +/* Define to 1 if you have the `gethostbyname' function. */ +#define HAVE_GETHOSTBYNAME 1 + +/* Define to 1 if you have the `gethostbyname2' function. */ +/* #undef HAVE_GETHOSTBYNAME2 */ + +/* Define if you have the function `gethostname'. */ +#define HAVE_GETHOSTNAME 1 + +/* Define if you have the function `getifaddrs'. */ +/* #undef HAVE_GETIFADDRS */ + +/* Define if you have the function `getipnodebyaddr'. */ +/* #undef HAVE_GETIPNODEBYADDR */ + +/* Define if you have the function `getipnodebyname'. */ +/* #undef HAVE_GETIPNODEBYNAME */ + +/* Define to 1 if you have the `getlogin' function. */ +/* #define HAVE_GETLOGIN 1 */ + +/* Define if you have a working getmsg. */ +/* #undef HAVE_GETMSG */ + +/* Define to 1 if you have the `getnameinfo' function. */ +#define HAVE_GETNAMEINFO 1 + +/* Define if you have the function `getopt'. */ +/* #define HAVE_GETOPT 1 */ + +/* Define to 1 if you have the `getpagesize' function. */ +/* #define HAVE_GETPAGESIZE 1 */ + +/* Define to 1 if you have the `getpeereid' function. */ +/* #define HAVE_GETPEEREID 1 */ + +/* Define to 1 if you have the `getpeerucred' function. */ +/* #undef HAVE_GETPEERUCRED */ + +/* Define to 1 if you have the `getprogname' function. */ +/* #define HAVE_GETPROGNAME 1 */ + +/* Define to 1 if you have the `getpwnam_r' function. */ +/* #define HAVE_GETPWNAM_R 1 */ + +/* Define to 1 if you have the `getrlimit' function. */ +/* #define HAVE_GETRLIMIT 1 */ + +/* Define to 1 if you have the `getsockopt' function. */ +#define HAVE_GETSOCKOPT 1 + +/* Define to 1 if you have the `getspnam' function. */ +/* #undef HAVE_GETSPNAM */ + +/* Define if you have the function `gettimeofday'. */ +/* #define HAVE_GETTIMEOFDAY 1 */ + +/* Define to 1 if you have the `getudbnam' function. */ +/* #undef HAVE_GETUDBNAM */ + +/* Define if you have the function `getuid'. */ +/* #define HAVE_GETUID 1 */ + +/* Define if you have the function `getusershell'. */ +/* #define HAVE_GETUSERSHELL 1 */ + +/* define if you have a glob() that groks GLOB_BRACE, GLOB_NOCHECK, + GLOB_QUOTE, GLOB_TILDE, and GLOB_LIMIT */ +/* #define HAVE_GLOB 1 */ + +/* Define to 1 if you have the `grantpt' function. */ +/* #define HAVE_GRANTPT 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_GRP_H 1 */ + +/* Define to 1 if you have the `hstrerror' function. */ +/* #define HAVE_HSTRERROR 1 */ + +/* Define if you have the `h_errlist' variable. */ +/* #undef HAVE_H_ERRLIST */ + +/* Define if you have the `h_errno' variable. */ +/* #define HAVE_H_ERRNO 1 */ + +/* Define if you have the `h_nerr' variable. */ +/* #undef HAVE_H_NERR */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_IFADDRS_H */ + +/* Define if you have the in6addr_loopback variable */ +/* #undef HAVE_IN6ADDR_LOOPBACK */ + +/* */ +#define HAVE_INET_ADDR 1 + +/* define */ +/* #define HAVE_INET_ATON 1 */ + +/* define */ +/* #define HAVE_INET_NTOP 1 */ + +/* define */ +/* #define HAVE_INET_PTON 1 */ + +#if _WIN32_WINNT >= 0x0600 + +#define HAVE_INET_NTOP 1 + +#define HAVE_INET_PTON 1 + +#endif + +/* Define if you have the function `initgroups'. */ +/* #define HAVE_INITGROUPS 1 */ + +/* Define to 1 if you have the `initstate' function. */ +/* #define HAVE_INITSTATE 1 */ + +/* Define if you have the function `innetgr'. */ +/* #undef HAVE_INNETGR */ + +/* Define to 1 if the system has the type `int16_t'. */ +/* #define HAVE_INT16_T 1 */ + +/* Define to 1 if the system has the type `int32_t'. */ +/* #define HAVE_INT32_T 1 */ + +/* Define to 1 if the system has the type `int64_t'. */ +/* #define HAVE_INT64_T 1 */ + +/* Define to 1 if the system has the type `int8_t'. */ +/* #define HAVE_INT8_T 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_INTTYPES_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_IO_H 1 + +/* Define if you have IPv6. */ +#define HAVE_IPV6 1 + +/* Define if you have the function `iruserok'. */ +/* #define HAVE_IRUSEROK 1 */ + +/* Define to 1 if you have the `issetugid' function. */ +/* #undef HAVE_ISSETUGID */ + +/* Define if you want to use the Kerberos Credentials Manager. */ +/* #define HAVE_KCM 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_LIBUTIL_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the `loadquery' function. */ +/* #undef HAVE_LOADQUERY */ + +/* Define if you have the function `localtime_r'. */ +/* #define HAVE_LOCALTIME_R 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if you have the `logout' function. */ +/* #define HAVE_LOGOUT 1 */ + +/* Define to 1 if you have the `logwtmp' function. */ +/* #define HAVE_LOGWTMP 1 */ + +/* Define to 1 if the system has the type `long long'. */ +#define HAVE_LONG_LONG 1 + +/* Define if you have the function `lstat'. */ +/* #define HAVE_LSTAT 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MAILLOCK_H */ + +/* Define if you have the function `memmove'. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define if you have the function `mkstemp'. */ +/* #define HAVE_MKSTEMP 1 */ + +/* Define to 1 if you have the `mktime' function. */ +#define HAVE_MKTIME 1 + +/* Define to 1 if you have a working `mmap' system call. */ +/* #undef HAVE_MMAP */ + +/* define if you have a ndbm library */ +/* #undef HAVE_NDBM */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NDBM_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_NETDB_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETGROUP_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET6_IN6_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET6_IN6_VAR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_IN6_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_IN6_MACHTYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_NETINET_IN_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_NETINET_TCP_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_NETINET_IN_SYSTM_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_NETINET_IP_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_NETINET_TCP_H 1 */ + +/* Define if you want to use Netinfo instead of krb5.conf. */ +/* #undef HAVE_NETINFO */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINFO_NI_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_NET_IF_H 1 */ + +/* Define if NDBM really is DB (creates files *.db) */ +/* #define HAVE_NEW_DB 1 */ + +/* Define to 1 if you have the `on_exit' function. */ +/* #define HAVE_ON_EXIT 1 */ + +/* Define to 1 if you have the '_onexit' function */ +#define HAVE__ONEXIT 1 + +/* Define to 1 if you have the `openpty' function. */ +/* #define HAVE_OPENPTY 1 */ + +/* define to 1 to use openssl's libcrypto as a (default) backend for libhcrypto */ +/* #undef HAVE_HCRYPTO_W_OPENSSL */ + +/* Define to enable basic OSF C2 support. */ +/* #undef HAVE_OSFC2 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_PATHS_H 1 */ + +/* Define to 1 if you have the `pidfile' function. */ +/* #undef HAVE_PIDFILE */ + +/* Define to 1 if you have the `poll' function. */ +/* #define HAVE_POLL 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_POLL_H 1 */ + +/* Define to 1 if you have the header file. */ +/* This option is added by the NTMakefile if we have a . */ +/* #define HAVE_PTHREAD_H 1 */ + +/* Define to 1 if you have the `ptsname' function. */ +/* #define HAVE_PTSNAME 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_PTY_H 1 */ + +/* Define if you have the function `putenv'. */ +#define HAVE_PUTENV 1 + +/* Define to 1 if you have the header file. */ +/* #define HAVE_PWD_H 1 */ + +/* Define to 1 if you have the `rand' function. */ +#define HAVE_RAND 1 + +/* Define to 1 if you have the `random' function. */ +/* #define HAVE_RANDOM 1 */ + +/* Define if you have the function `rcmd'. */ +/* #define HAVE_RCMD 1 */ + +/* Define if you have a readline compatible library. */ +/* #define HAVE_READLINE 1 */ + +/* Define if you have the function `readv'. */ +/* #define HAVE_READV 1 */ + +/* Define if you have the function `recvmsg'. */ +/* #define HAVE_RECVMSG 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_RESOLV_H */ + +/* Define to 1 if you have the `res_ndestroy' function. */ +/* #undef HAVE_RES_NDESTROY */ + +/* Define to 1 if you have the `res_nsearch' function. */ +/* #undef HAVE_RES_NSEARCH */ + +/* Define to 1 if you have the `res_search' function. */ +/* #undef HAVE_RES_SEARCH */ + +/* Define to 1 if you have the `revoke' function. */ +/* #define HAVE_REVOKE 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_RPCSVC_YPCLNT_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SAC_H */ + +/* Define to 1 if the system has the type `sa_family_t'. */ +/* #define HAVE_SA_FAMILY_T 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SECURITY_PAM_MODULES_H */ + +/* Define to 1 if you have the `select' function. */ +#define HAVE_SELECT 1 + +/* Define if you have the function `sendmsg'. */ +/* #define HAVE_SENDMSG 1 */ + +/* Define if you have the function `setegid'. */ +/* #define HAVE_SETEGID 1 */ + +/* Define if you have the function `setenv'. */ +#define HAVE_SETENV 1 + +/* Define if you have the function `seteuid'. */ +/* #define HAVE_SETEUID 1 */ + +/* Define to 1 if you have the `setitimer' function. */ +/* #define HAVE_SETITIMER 1 */ + +/* Define to 1 if you have the `setlim' function. */ +/* #undef HAVE_SETLIM */ + +/* Define to 1 if you have the `setlogin' function. */ +/* #undef HAVE_SETLOGIN */ + +/* Define to 1 if you have the `setpcred' function. */ +/* #undef HAVE_SETPCRED */ + +/* Define to 1 if you have the `setpgid' function. */ +/* #define HAVE_SETPGID 1 */ + +/* Define to 1 if you have the `setproctitle' function. */ +/* #undef HAVE_SETPROCTITLE */ + +/* Define to 1 if you have the `setprogname' function. */ +/* #define HAVE_SETPROGNAME 1 */ + +/* Define to 1 if you have the `setregid' function. */ +/* #define HAVE_SETREGID 1 */ + +/* 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 `setreuid' function. */ +/* #define HAVE_SETREUID 1 */ + +/* Define to 1 if you have the `setsid' function. */ +/* #define HAVE_SETSID 1 */ + +/* Define to 1 if you have the `setsockopt' function. */ +#define HAVE_SETSOCKOPT 1 + +/* Define to 1 if you have the `setstate' function. */ +/* #define HAVE_SETSTATE 1 */ + +/* Define to 1 if you have the `setutent' function. */ +/* #define HAVE_SETUTENT 1 */ + +/* Define to 1 if you have the `sgi_getcapabilitybyname' function. */ +/* #undef HAVE_SGI_GETCAPABILITYBYNAME */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SGTTY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SHADOW_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SIAD_H */ + +/* Define to 1 if you have the `sigaction' function. */ +/* #define HAVE_SIGACTION 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* define if you have a working snprintf */ +/* snprintf() and vsnprintf() do exist. But the implementations are + not C99 compliant. */ +/* #define HAVE_SNPRINTF 1 */ + +/* Define to 1 if you have the `socket' function. */ +#define HAVE_SOCKET 1 + +/* Define to 1 if the system has the type `socklen_t'. */ +#define HAVE_SOCKLEN_T 1 + +/* Define to 1 if the system has the type `ssize_t'. */ +/* #define HAVE_SSIZE_T 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STANDARDS_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_STDINT_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define if you have the function `strcasecmp'. */ +#define HAVE_STRCASECMP 1 +#define strcasecmp _stricmp + +/* Define if you have the function `strdup'. */ +#define HAVE_STRDUP 1 + +/* Define if you have the function `strerror'. */ +#define HAVE_STRERROR 1 + +/* Define if you have the function `strftime'. */ +#define HAVE_STRFTIME 1 + +/* Define to 1 if you have the header file. */ +/* #define HAVE_STRINGS_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define if you have the function `strlcat'. */ +/* #define HAVE_STRLCAT 1 */ + +/* Define if you have the function `strlcpy'. */ +/* #define HAVE_STRLCPY 1 */ + +/* Define if you have the function `strlwr'. */ +#define HAVE_STRLWR 1 + +/* Define if you have the function `strncasecmp'. */ +#define HAVE_STRNCASECMP 1 +#define strncasecmp _strnicmp + +/* Define if you have the function `strndup'. */ +/* #define HAVE_STRNDUP 1 */ + +/* Define if you have the function `strnlen'. */ +#define HAVE_STRNLEN 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STROPTS_H */ + +/* Define if you have the function `strptime'. */ +/* #define HAVE_STRPTIME 1 */ + +/* Define if you have the function `strsep'. */ +/* #define HAVE_STRSEP 1 */ + +/* Define if you have the function `strsep_copy'. */ +/* #undef HAVE_STRSEP_COPY */ + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the `strsvis' function. */ +/* #undef HAVE_STRSVIS */ + +/* Define if you have the function `strtok_r'. */ +/* #define HAVE_STRTOK_R 1 */ + +#if defined(__has_include) +# if __has_include() +# define HAVE_UCRT 1 +# endif +#endif + +#ifdef HAVE_UCRT +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#endif + +/* Define to 1 if the system has the type `struct addrinfo'. */ +#define HAVE_STRUCT_ADDRINFO 1 + +/* Define to 1 if the system has the type `struct ifaddrs'. */ +/* #undef HAVE_STRUCT_IFADDRS */ + +/* Define to 1 if the system has the type `struct iovec'. */ +/* #define HAVE_STRUCT_IOVEC 1 */ + +/* Define to 1 if the system has the type `struct msghdr'. */ +/* #define HAVE_STRUCT_MSGHDR 1 */ + +/* Define to 1 if the system has the type `struct sockaddr'. */ +#define HAVE_STRUCT_SOCKADDR 1 + +/* Define if struct sockaddr has field sa_len. */ +/* #undef HAVE_STRUCT_SOCKADDR_SA_LEN */ + +/* Define to 1 if the system has the type `struct sockaddr_storage'. */ +#define HAVE_STRUCT_SOCKADDR_STORAGE 1 + +/* define if you have struct spwd */ +/* #undef HAVE_STRUCT_SPWD */ + +/* Define if struct tm has field tm_gmtoff. */ +/* #undef HAVE_STRUCT_TM_TM_GMTOFF */ + +/* Define if struct tm has field tm_zone. */ +/* #undef HAVE_STRUCT_TM_TM_ZONE */ + +/* define if struct winsize is declared in sys/termios.h */ +/* #define HAVE_STRUCT_WINSIZE 1 */ + +/* Define to 1 if you have the `strunvis' function. */ +/* #undef HAVE_STRUNVIS */ + +/* Define if you have the function `strupr'. */ +#define HAVE_STRUPR 1 + +/* Define to 1 if you have the `strvis' function. */ +/* #undef HAVE_STRVIS */ + +/* Define to 1 if you have the `strvisx' function. */ +/* #undef HAVE_STRVISX */ + +/* Define to 1 if you have the `svis' function. */ +/* #undef HAVE_SVIS */ + +/* Define if you have the function `swab'. */ +#define HAVE_SWAB 1 + +/* Define to 1 if you have the `sysconf' function. */ +/* #define HAVE_SYSCONF 1 */ + +/* Define to 1 if you have the `sysctl' function. */ +/* #undef HAVE_SYSCTL */ + +/* syslog is provided for _win32 in lib/roken */ + +/* Define to 1 if you have the `syslog' function. */ +#define HAVE_SYSLOG 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYSLOG_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_BITYPES_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_BSWAP_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_CAPABILITY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_CATEGORY_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_FILE_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_FILIO_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_IOCCOM_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_IOCTL_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_MMAN_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_PARAM_H 1 */ + +/* 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_PTYIO_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PTYVAR_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PTY_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_RESOURCE_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_SELECT_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_SOCKET_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SOCKIO_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_STREAM_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_STRTTY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_STR_TTY_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SYSCALL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SYSCTL_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_TERMIO_H 1 */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIMEB_H 1 + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_TIMES_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_TIME_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_TTY_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_UCRED_H */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_UIO_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_UN_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_UTSNAME_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_SYS_WAIT_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_TERMCAP_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_TERMIOS_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_TERMIO_H 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TERM_H */ + +/* Define to 1 if you have the `tgetent' function. */ +/* #define HAVE_TGETENT 1 */ + +/* Define if you have the function `timegm'. */ +/* #define HAVE_TIMEGM 1 */ + +/* Define if you have the `timezone' variable. */ +#define HAVE_TIMEZONE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TMPDIR_H */ + +/* Define to 1 if you have the `ttyname' function. */ +/* #define HAVE_TTYNAME 1 */ + +/* Define to 1 if you have the `ttyslot' function. */ +/* #define HAVE_TTYSLOT 1 */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UDB_H */ + +/* Define to 1 if the system has the type `uint16_t'. */ +/* #define HAVE_UINT16_T 1 */ + +/* Define to 1 if the system has the type `uint32_t'. */ +/* #define HAVE_UINT32_T 1 */ + +/* Define to 1 if the system has the type `uint64_t'. */ +/* #define HAVE_UINT64_T 1 */ + +/* Define to 1 if the system has the type `uint8_t'. */ +/* #define HAVE_UINT8_T 1 */ + +/* Define to 1 if the system has the type `uintptr_t'. */ +#define HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the `umask' function. */ +/* #define HAVE_UMASK 1 */ + +/* Define to 1 if you have the `uname' function. */ +/* #define HAVE_UNAME 1 */ + +/* Define to 1 if you have the header file. */ +/* #define HAVE_UNISTD_H 1 */ + +/* Define to 1 if you have the `unlockpt' function. */ +/* #define HAVE_UNLOCKPT 1 */ + +/* Define if you have the function `unsetenv'. */ +/* #define HAVE_UNSETENV 1 */ + +/* Define to 1 if you have the `unvis' function. */ +/* #undef HAVE_UNVIS */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_USERCONF_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_USERSEC_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UTIL_H */ + +/* Define to 1 if the system has the type `u_int16_t'. */ +/* #define HAVE_U_INT16_T 1 */ + +/* Define to 1 if the system has the type `u_int32_t'. */ +/* #define HAVE_U_INT32_T 1 */ + +/* Define to 1 if the system has the type `u_int64_t'. */ +/* #define HAVE_U_INT64_T 1 */ + +/* Define to 1 if the system has the type `u_int8_t'. */ +/* #define HAVE_U_INT8_T 1 */ + +/* Define to 1 if you have the `vasnprintf' function. */ +/* #undef HAVE_VASNPRINTF */ + +/* Define to 1 if you have the `vasprintf' function. */ +/* #define HAVE_VASPRINTF 1 */ + +/* Define if you have the function `verr'. */ +/* #define HAVE_VERR 1 */ + +/* Define if you have the function `verrx'. */ +/* #define HAVE_VERRX 1 */ + +/* Define to 1 if you have the `vhangup' function. */ +/* #define HAVE_VHANGUP 1 */ + +/* Define to 1 if you have the `vis' function. */ +/* #undef HAVE_VIS */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VIS_H */ + +/* define if you have a working vsnprintf */ +/* snprintf() and vsnprintf() do exist. But the implementations are + not C99 compliant. */ +/* #define HAVE_VSNPRINTF 1 */ + +/* Define if you have the function `vsyslog'. */ +#define HAVE_VSYSLOG 1 + +/* Define if you have the function `vwarn'. */ +/* #define HAVE_VWARN 1 */ + +/* Define if you have the function `vwarnx'. */ +/* #define HAVE_VWARNX 1 */ + +/* Define if you have the function `warn'. */ +/* #define HAVE_WARN 1 */ + +/* Define if you have the function `warnx'. */ +/* #define HAVE_WARNX 1 */ + +/* Define if you have the function `writev'. */ +/* #define HAVE_WRITEV 1 */ + +/* Defined if we have WinSock */ +#define HAVE_WINSOCK 1 + +/* Defined if we have WinDNS */ +#define HAVE_WINDNS 1 + +/* define if struct winsize has ws_xpixel */ +/* #define HAVE_WS_XPIXEL 1 */ + +/* define if struct winsize has ws_ypixel */ +/* #define HAVE_WS_YPIXEL 1 */ + +/* Define to 1 if you have the `yp_get_default_domain' function. */ +/* #undef HAVE_YP_GET_DEFAULT_DOMAIN */ + +/* Define to 1 if you have the `_getpty' function. */ +/* #undef HAVE__GETPTY */ + +/* Define if you have the `_res' variable. */ +/* #undef HAVE__RES */ + +/* Define to 1 if you have the `_scrsize' function. */ +/* #undef HAVE__SCRSIZE */ + +/* define if your compiler has __attribute__ */ +/* #define HAVE___ATTRIBUTE__ 1 */ + +/* Define if you have the `__progname' variable. */ +/* #define HAVE___PROGNAME 1 */ + +/* Define if you are running IRIX 4. */ +/* #undef IRIX4 */ + +/* define if the system is missing a prototype for asnprintf() */ +/* #define NEED_ASNPRINTF_PROTO 1 */ + +/* define if the system is missing a prototype for asprintf() */ +/* #undef NEED_ASPRINTF_PROTO */ + +/* define if the system is missing a prototype for crypt() */ +/* #undef NEED_CRYPT_PROTO */ + +/* define if the system is missing a prototype for daemon() */ +/* #undef NEED_DAEMON_PROTO */ + +/* define if the system is missing a prototype for gethostname() */ +/* #undef NEED_GETHOSTNAME_PROTO */ + +/* define if the system is missing a prototype for getusershell() */ +/* #undef NEED_GETUSERSHELL_PROTO */ + +/* define if the system is missing a prototype for glob() */ +/* #undef NEED_GLOB_PROTO */ + +/* define if the system is missing a prototype for hstrerror() */ +/* #undef NEED_HSTRERROR_PROTO */ + +/* define if the system is missing a prototype for inet_aton() */ +/* #undef NEED_INET_ATON_PROTO */ + +/* define if the system is missing a prototype for iruserok() */ +/* #undef NEED_IRUSEROK_PROTO */ + +/* define if the system is missing a prototype for mkstemp() */ +/* #define NEED_MKSTEMP_PROTO 1 */ + +/* define if the system is missing a prototype for SecKeyGetCSPHandle() */ +/* #undef NEED_SECKEYGETCSPHANDLE_PROTO */ + +/* define if the system is missing a prototype for setenv() */ +#define NEED_SETENV_PROTO 1 + +/* define if the system is missing a prototype for snprintf() */ +/* #undef NEED_SNPRINTF_PROTO */ + +/* define if the system is missing a prototype for strndup() */ +/* #undef NEED_STRNDUP_PROTO */ + +/* define if the system is missing a prototype for strsep() */ +/* #undef NEED_STRSEP_PROTO */ + +/* define if the system is missing a prototype for strsvis() */ +/* #define NEED_STRSVIS_PROTO 1 */ + +/* define if the system is missing a prototype for strtok_r() */ +#define NEED_STRTOK_R_PROTO 1 + +/* define if the system is missing a prototype for strunvis() */ +/* #define NEED_STRUNVIS_PROTO 1 */ + +/* define if the system is missing a prototype for strvisx() */ +/* #define NEED_STRVISX_PROTO 1 */ + +/* define if the system is missing a prototype for strvis() */ +/* #define NEED_STRVIS_PROTO 1 */ + +/* define if the system is missing a prototype for svis() */ +/* #define NEED_SVIS_PROTO 1 */ + +/* define if the system is missing a prototype for unsetenv() */ +/* #undef NEED_UNSETENV_PROTO */ + +/* define if the system is missing a prototype for unvis() */ +/* #define NEED_UNVIS_PROTO 1 */ + +/* define if the system is missing a prototype for vasnprintf() */ +/* #define NEED_VASNPRINTF_PROTO 1 */ + +/* define if the system is missing a prototype for vasprintf() */ +/* #undef NEED_VASPRINTF_PROTO */ + +/* define if the system is missing a prototype for vis() */ +/* #define NEED_VIS_PROTO 1 */ + +/* define if the system is missing a prototype for vsnprintf() */ +/* #undef NEED_VSNPRINTF_PROTO */ + +/* Define to 1 if your C compiler doesn't accept -c and -o together. */ +/* #undef NO_MINUS_C_MINUS_O */ + +/* Define if you don't want to use mmap. */ +#define NO_MMAP 1 + +/* Define if the Unix rand method is not defined */ +#define NO_RAND_UNIX_METHOD 1 + +/* Define if the Fortuna rand method is not defined */ +#define NO_RAND_FORTUNA_METHOD 1 + +/* Define if PID files should not be used. */ +#define NO_PIDFILES 1 + +/* Define if SIGPIPE is not supported */ +#define NO_SIGPIPE 1 + +/* Define if SIGXCPU is not supported */ +#define NO_SIGXCPU 1 + +/* Define if sleep() is not available */ +#define NO_SLEEP 1 + +/* Define to 1 if Unix sockets (AF_UNIX) are not available. */ +#define NO_UNIX_SOCKETS 1 + +/* Define to 1 if POSIX link/unlink operations should be avoided. + This may be because the behavior of links are not not consistent + with POSIX or because the filesystem may not support POSIX + links. */ +#define NO_POSIX_LINKS 1 + +/* Define this to enable old environment option in telnet. */ +/* #define OLD_ENVIRON 1 */ + +/* define if prototype of openlog is compatible with void openlog(const char + *, int, int) */ +#define OPENLOG_PROTO_COMPATIBLE 1 + +/* Define if getlogin has POSIX flavour (and not BSD). */ +/* #define POSIX_GETLOGIN 1 */ + +/* Define if getpwnam_r has POSIX flavour. */ +/* #define POSIX_GETPWNAM_R 1 */ + +/* Define if you have the readline package. */ +#define READLINE 1 + +/* Define if rename() does not unlink an existing file */ +#define RENAME_DOES_NOT_UNLINK 1 + +/* Define if you want to use samba socket wrappers. */ +/* #undef SOCKET_WRAPPER_REPLACE */ + +/* Define if a socket is not a file descriptor */ +#define SOCKET_IS_NOT_AN_FD 1 + +/* Define if FD_SETSIZE check does not apply to this platform */ +#define NO_LIMIT_FD_SETSIZE 1 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if you have streams ptys. */ +/* #undef STREAMSPTY */ + +/* Define to 1 if you can safely include both and . */ +/* #define TIME_WITH_SYS_TIME 1 */ + +/* Define to 1 if your declares `struct tm'. */ +/* #undef TM_IN_SYS_TIME */ + +/* define if target is big endian */ +/* #undef WORDS_BIGENDIAN */ + +/* Define to 1 if the X Window System is missing or not being used. */ +#define X_DISPLAY_MISSING 1 + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +/* #undef YYTEXT_POINTER */ + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define to enable extensions on glibc-based systems such as Linux. */ +/* #define _GNU_SOURCE 1 */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Set this to the default system lead string for telnetd + * can contain %-escapes: %s=sysname, %m=machine, %r=os-release + * %v=os-version, %t=tty, %h=hostname, %d=date and time + */ +/* #undef USE_IM */ + +/* Used with login -p */ +/* #undef LOGIN_ARGS */ + +#ifdef ROKEN_RENAME +#include "roken_rename.h" +#endif + +#if defined(ENCRYPTION) && !defined(AUTHENTICATION) +#define AUTHENTICATION 1 +#endif + + + +/* Paths */ + +#define SYSCONFDIR "%{COMMONCONFIG}" + +#define LIBDIR "%{LIBDIR}" + +#endif /* RC_INVOKED */ + + +/* Version info */ + +#define PACKAGE "@PACKAGE@" + +#define PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@" + +#define PACKAGE_NAME "@PACKAGE_NAME@" + +#define PACKAGE_STRING "@PACKAGE_NAME@ @PACKAGE_VERSION@" + +#define PACKAGE_TARNAME "@PACKAGE@" + +#define PACKAGE_VERSION "@PACKAGE_VERSION@" + +#define PACKAGE_COMPANY "@PACKAGE_COMPANY@" + +#define PACKAGE_COPYRIGHT "@PACKAGE_COPYRIGHT@" + +#define VERSION "@PACKAGE_VERSION@" + +#define RC_PRODVER_MAJOR @MAJOR@ + +#define RC_PRODVER_MINOR @MINOR@ + +#define RC_PRODVER_AUX @AUX@ + +#define RC_PRODVER_PATCH @PATCH@ + +#define RC_PRODVER_C @MAJOR@,@MINOR@,@AUX@,@PATCH@ + +#define RC_PRODVER_CS "@MAJOR@,@MINOR@,@AUX@,@PATCH@" + +#define RC_PRODVER_DS "@MAJOR@.@MINOR@.@AUX@.@PATCH@" + +#define RC_PRODUCT_NAME_0409 PACKAGE_NAME + +#define RC_PRODUCT_VER_0409 PACKAGE_VERSION + +#define RC_COMPANY_0409 PACKAGE_COMPANY + +#define RC_COPYRIGHT_0409 PACKAGE_COPYRIGHT + +@VERSION_OPTDEFS@ + +#endif /* __CONFIG_H__ */ diff --git a/crypto/heimdal/include/crypto-headers.h b/crypto/heimdal/include/crypto-headers.h --- a/crypto/heimdal/include/crypto-headers.h +++ b/crypto/heimdal/include/crypto-headers.h @@ -5,33 +5,6 @@ #error "need config.h" #endif -#ifdef HAVE_OPENSSL - -#define OPENSSL_DES_LIBDES_COMPATIBILITY - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef BN_is_negative -#define BN_set_negative(bn, flag) ((bn)->neg=(flag)?1:0) -#define BN_is_negative(bn) ((bn)->neg != 0) -#endif - -#else /* !HAVE_OPENSSL */ - #ifdef KRB5 #include #endif @@ -48,10 +21,5 @@ #include #include #include -#include -#include -#include - -#endif /* HAVE_OPENSSL */ #endif /* __crypto_header__ */ diff --git a/crypto/heimdal/include/gssapi/Makefile.in b/crypto/heimdal/include/gssapi/Makefile.in --- a/crypto/heimdal/include/gssapi/Makefile.in +++ b/crypto/heimdal/include/gssapi/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,14 +93,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common subdir = include/gssapi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -57,8 +107,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -71,6 +120,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -90,17 +140,41 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -115,16 +189,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -134,17 +211,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -163,12 +242,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -177,6 +253,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -193,10 +270,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -204,6 +279,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -218,12 +294,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -240,10 +319,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -254,13 +339,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -284,6 +363,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -307,9 +388,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -319,35 +405,43 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; CLEANFILES = gssapi.h gssapi_krb5.h gssapi_spnego.h gssapi_ntlm.h gssapi_oid.h EXTRA_DIST = NTMakefile all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -360,15 +454,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/gssapi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/gssapi/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -384,14 +478,16 @@ clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: + +ctags CTAGS: -ctags: CTAGS -CTAGS: +cscope cscopelist: +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -439,10 +535,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -482,9 +583,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -524,37 +624,50 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am .PHONY: all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool dist-hook distclean \ - distclean-generic distclean-libtool distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook 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-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-hook + clean-generic clean-libtool cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-hook 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-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -562,7 +675,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -607,11 +720,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -619,6 +741,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -661,6 +785,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -674,13 +811,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/include/gssapi/NTMakefile b/crypto/heimdal/include/gssapi/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/include/gssapi/NTMakefile @@ -0,0 +1,34 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=include\gssapi + +!include ../../windows/NTMakefile.w32 diff --git a/crypto/heimdal/include/hcrypto/Makefile.am b/crypto/heimdal/include/hcrypto/Makefile.am --- a/crypto/heimdal/include/hcrypto/Makefile.am +++ b/crypto/heimdal/include/hcrypto/Makefile.am @@ -16,7 +16,6 @@ evp-hcrypto.h \ evp-cc.h \ hmac.h \ - md2.h \ md4.h \ md5.h \ pkcs12.h \ @@ -25,6 +24,7 @@ rc4.h \ rsa.h \ sha.h \ - ui.h + ui.h \ + undef.h EXTRA_DIST = NTMakefile diff --git a/crypto/heimdal/include/hcrypto/Makefile.in b/crypto/heimdal/include/hcrypto/Makefile.in --- a/crypto/heimdal/include/hcrypto/Makefile.in +++ b/crypto/heimdal/include/hcrypto/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,14 +93,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common subdir = include/hcrypto ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -57,8 +107,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -71,6 +120,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -90,17 +140,41 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -115,16 +189,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -134,17 +211,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -163,12 +242,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -177,6 +253,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -193,10 +270,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -204,6 +279,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -218,12 +294,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -240,10 +319,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -254,13 +339,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -284,6 +363,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -307,9 +388,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -319,29 +405,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; CLEANFILES = \ aes.h \ bn.h \ @@ -356,7 +450,6 @@ evp-hcrypto.h \ evp-cc.h \ hmac.h \ - md2.h \ md4.h \ md5.h \ pkcs12.h \ @@ -365,13 +458,14 @@ rc4.h \ rsa.h \ sha.h \ - ui.h + ui.h \ + undef.h EXTRA_DIST = NTMakefile all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -384,15 +478,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/hcrypto/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/hcrypto/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -408,14 +502,16 @@ clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: + +ctags CTAGS: -ctags: CTAGS -CTAGS: +cscope cscopelist: +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -463,10 +559,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -506,9 +607,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -548,37 +648,50 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am .PHONY: all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool dist-hook distclean \ - distclean-generic distclean-libtool distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook 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-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-hook + clean-generic clean-libtool cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-hook 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-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -586,7 +699,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -631,11 +744,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -643,6 +765,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -685,6 +809,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -698,13 +835,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/include/hcrypto/NTMakefile b/crypto/heimdal/include/hcrypto/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/include/hcrypto/NTMakefile @@ -0,0 +1,34 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=include\hcrypto + +!include ../../windows/NTMakefile.w32 diff --git a/crypto/heimdal/include/heim_threads.h b/crypto/heimdal/include/heim_threads.h --- a/crypto/heimdal/include/heim_threads.h +++ b/crypto/heimdal/include/heim_threads.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003 Kungliga Tekniska Högskolan + * Copyright (c) 2003-2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -46,6 +46,24 @@ #ifndef HEIM_THREADS_H #define HEIM_THREADS_H 1 +#ifdef _MSC_VER + +#define HEIMDAL_THREAD_LOCAL __declspec(thread) + +#else + +#if defined(__clang__) || defined(__GNUC__) || defined(__SUNPRO_C) +#define HEIMDAL_THREAD_LOCAL __thread +#else +#error "thread-local attribute not defined for your compiler" +#endif /* clang or gcc */ + +#endif /* _MSC_VER */ + +/* For testing the for-Windows implementation of thread keys on non-Windows */ +typedef unsigned long HEIM_PRIV_thread_key; + + /* assume headers already included */ #if defined(__NetBSD__) && __NetBSD_Version__ >= 106120000 && __NetBSD_Version__< 299001200 && defined(ENABLE_PTHREAD_SUPPORT) @@ -81,6 +99,9 @@ #define HEIMDAL_getspecific(k) thr_getspecific(k) #define HEIMDAL_key_delete(k) thr_keydelete(k) +#define HEIMDAL_THREAD_ID thr_t +#define HEIMDAL_THREAD_create(t,f,a) thr_create((t), 0, (f), (a)) + #elif defined(ENABLE_PTHREAD_SUPPORT) && (!defined(__NetBSD__) || __NetBSD_Version__ >= 299001200) #include @@ -92,8 +113,8 @@ #define HEIMDAL_MUTEX_unlock(m) pthread_mutex_unlock(m) #define HEIMDAL_MUTEX_destroy(m) pthread_mutex_destroy(m) -#define HEIMDAL_RWLOCK rwlock_t -#define HEIMDAL_RWLOCK_INITIALIZER RWLOCK_INITIALIZER +#define HEIMDAL_RWLOCK pthread_rwlock_t +#define HEIMDAL_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER #define HEIMDAL_RWLOCK_init(l) pthread_rwlock_init(l, NULL) #define HEIMDAL_RWLOCK_rdlock(l) pthread_rwlock_rdlock(l) #define HEIMDAL_RWLOCK_wrlock(l) pthread_rwlock_wrlock(l) @@ -102,11 +123,172 @@ #define HEIMDAL_RWLOCK_unlock(l) pthread_rwlock_unlock(l) #define HEIMDAL_RWLOCK_destroy(l) pthread_rwlock_destroy(l) +#ifdef HEIM_BASE_MAINTAINER +#define HEIMDAL_thread_key unsigned long +#define HEIM_PRIV_thread_key HEIMDAL_thread_key +#define HEIMDAL_key_create(k,d,r) do { r = heim_w32_key_create(k,d); } while(0) +#define HEIMDAL_setspecific(k,s,r) do { r = heim_w32_setspecific(k,s); } while(0) +#define HEIMDAL_getspecific(k) (heim_w32_getspecific(k)) +#define HEIMDAL_key_delete(k) (heim_w32_delete_key(k)) +#else #define HEIMDAL_thread_key pthread_key_t #define HEIMDAL_key_create(k,d,r) do { r = pthread_key_create(k,d); } while(0) #define HEIMDAL_setspecific(k,s,r) do { r = pthread_setspecific(k,s); } while(0) #define HEIMDAL_getspecific(k) pthread_getspecific(k) #define HEIMDAL_key_delete(k) pthread_key_delete(k) +#endif + +#define HEIMDAL_THREAD_ID pthread_t +#define HEIMDAL_THREAD_create(t,f,a) pthread_create((t), 0, (f), (a)) + +#elif defined(_WIN32) + +typedef struct heim_mutex { + HANDLE h; +} heim_mutex_t; + +static inline int +heim_mutex_init(heim_mutex_t *m) +{ + m->h = CreateSemaphore(NULL, 1, 1, NULL); + if (m->h == INVALID_HANDLE_VALUE) + return EAGAIN; + return 0; +} + +static inline int +heim_mutex_lock(heim_mutex_t *m) +{ + HANDLE h, new_h; + int created = 0; + + h = InterlockedCompareExchangePointer(&m->h, m->h, m->h); + if (h == INVALID_HANDLE_VALUE || h == NULL) { + created = 1; + new_h = CreateSemaphore(NULL, 0, 1, NULL); + if (new_h == INVALID_HANDLE_VALUE) + return EAGAIN; + if (InterlockedCompareExchangePointer(&m->h, new_h, h) != h) { + created = 0; + CloseHandle(new_h); + } + } + if (!created) + WaitForSingleObject(m->h, INFINITE); + return 0; +} + +static inline int +heim_mutex_unlock(heim_mutex_t *m) +{ + if (ReleaseSemaphore(m->h, 1, NULL) == FALSE) + return EPERM; + return 0; +} + +static inline int +heim_mutex_destroy(heim_mutex_t *m) +{ + HANDLE h; + + h = InterlockedCompareExchangePointer(&m->h, INVALID_HANDLE_VALUE, m->h); + if (h != INVALID_HANDLE_VALUE) + CloseHandle(h); + return 0; +} + +#define HEIMDAL_MUTEX heim_mutex_t +#define HEIMDAL_MUTEX_INITIALIZER { INVALID_HANDLE_VALUE } +#define HEIMDAL_MUTEX_init(m) heim_mutex_init((m)) +#define HEIMDAL_MUTEX_lock(m) heim_mutex_lock((m)) +#define HEIMDAL_MUTEX_unlock(m) heim_mutex_unlock((m)) +#define HEIMDAL_MUTEX_destroy(m) heim_mutex_destroy((m)) + +typedef struct heim_rwlock { + SRWLOCK lock; + int exclusive; +} heim_rwlock_t; + +static inline int +heim_rwlock_init(heim_rwlock_t *l) +{ + InitializeSRWLock(&l->lock); + l->exclusive = 0; + return 0; +} + +static inline int +heim_rwlock_rdlock(heim_rwlock_t *l) +{ + AcquireSRWLockShared(&l->lock); + return 0; +} + +static inline int +heim_rwlock_wrlock(heim_rwlock_t *l) +{ + AcquireSRWLockExclusive(&l->lock); + l->exclusive = 1; + return 0; +} + +static inline int +heim_rwlock_tryrdlock(heim_rwlock_t *l) +{ + if (TryAcquireSRWLockShared(&l->lock)) + return 0; + return EBUSY; +} + +static inline int +heim_rwlock_trywrlock(heim_rwlock_t *l) +{ + if (TryAcquireSRWLockExclusive(&l->lock)) + return 0; + return EBUSY; +} + +static inline int +heim_rwlock_unlock(heim_rwlock_t *l) +{ + if (l->exclusive) { + l->exclusive = 0; + ReleaseSRWLockExclusive(&(l)->lock); + } else { + ReleaseSRWLockShared(&(l)->lock); + } + return 0; +} + +static inline int +heim_rwlock_destroy(heim_rwlock_t *l) +{ + /* SRW locks cannot be destroyed so re-initialize */ + InitializeSRWLock(&l->lock); + l->exclusive = 0; + return 0; +} + +#define HEIMDAL_RWLOCK heim_rwlock_t +#define HEIMDAL_RWLOCK_INITIALIZER {SRWLOCK_INIT, 0} +#define HEIMDAL_RWLOCK_init(l) heim_rwlock_init((l)) +#define HEIMDAL_RWLOCK_rdlock(l) heim_rwlock_rdlock((l)) +#define HEIMDAL_RWLOCK_wrlock(l) heim_rwlock_wrlock((l)) +#define HEIMDAL_RWLOCK_tryrdlock(l) heim_rwlock_tryrdlock((l)) +#define HEIMDAL_RWLOCK_trywrlock(l) heim_rwlock_trywrlock((l)) +#define HEIMDAL_RWLOCK_unlock(l) heim_rwlock_unlock((l)) +#define HEIMDAL_RWLOCK_destroy(l) heim_rwlock_destroy((l)) + +#define HEIMDAL_thread_key unsigned long +#define HEIM_PRIV_thread_key HEIMDAL_thread_key +#define HEIMDAL_key_create(k,d,r) do { r = heim_w32_key_create(k,d); } while(0) +#define HEIMDAL_setspecific(k,s,r) do { r = heim_w32_setspecific(k,s); } while(0) +#define HEIMDAL_getspecific(k) (heim_w32_getspecific(k)) +#define HEIMDAL_key_delete(k) (heim_w32_delete_key(k)) + +#define HEIMDAL_THREAD_ID DWORD +#define HEIMDAL_THREAD_create(t,f,a) \ + ((CreateThread(0, 0, (f), (a), 0, (t)) == INVALID_HANDLE_VALUE) ? EINVAL : 0) #elif defined(HEIMDAL_DEBUG_THREADS) @@ -132,6 +314,9 @@ #define HEIMDAL_internal_thread_key 1 +#define HEIMDAL_THREAD_ID int +#define HEIMDAL_THREAD_create(t,f,a) abort() + #else /* no thread support, no debug case */ #define HEIMDAL_MUTEX int @@ -151,6 +336,9 @@ #define HEIMDAL_RWLOCK_unlock(l) do { } while(0) #define HEIMDAL_RWLOCK_destroy(l) do { } while(0) +#define HEIMDAL_THREAD_ID int +#define HEIMDAL_THREAD_create(t,f,a) abort() + #define HEIMDAL_internal_thread_key 1 #endif /* no thread support */ @@ -172,4 +360,9 @@ #undef HEIMDAL_internal_thread_key #endif /* HEIMDAL_internal_thread_key */ +int heim_w32_key_create(HEIM_PRIV_thread_key *, void (*)(void *)); +int heim_w32_delete_key(HEIM_PRIV_thread_key); +int heim_w32_setspecific(HEIM_PRIV_thread_key, void *); +void *heim_w32_getspecific(HEIM_PRIV_thread_key); + #endif /* HEIM_THREADS_H */ diff --git a/crypto/heimdal/include/kadm5/Makefile.in b/crypto/heimdal/include/kadm5/Makefile.in --- a/crypto/heimdal/include/kadm5/Makefile.in +++ b/crypto/heimdal/include/kadm5/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,14 +93,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common subdir = include/kadm5 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -57,8 +107,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -71,6 +120,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -90,17 +140,41 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -115,16 +189,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -134,17 +211,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -163,12 +242,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -177,6 +253,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -193,10 +270,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -204,6 +279,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -218,12 +294,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -240,10 +319,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -254,13 +339,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -284,6 +363,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -307,9 +388,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -319,36 +405,44 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; CLEANFILES = admin.h kadm5_err.h private.h kadm5-private.h \ kadm5-protos.h kadm5-pwcheck.h EXTRA_DIST = NTMakefile all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -361,15 +455,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/kadm5/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign include/kadm5/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -385,14 +479,16 @@ clean-libtool: -rm -rf .libs _libs -tags: TAGS -TAGS: +tags TAGS: + +ctags CTAGS: -ctags: CTAGS -CTAGS: +cscope cscopelist: +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -440,10 +536,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -483,9 +584,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -525,37 +625,50 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am .PHONY: all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool dist-hook distclean \ - distclean-generic distclean-libtool distdir dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook 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-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-am uninstall-hook + clean-generic clean-libtool cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-hook 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-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -563,7 +676,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -608,11 +721,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -620,6 +742,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -662,6 +786,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -675,13 +812,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/include/kadm5/NTMakefile b/crypto/heimdal/include/kadm5/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/include/kadm5/NTMakefile @@ -0,0 +1,34 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=include\kadm5 + +!include ../../windows/NTMakefile.w32 diff --git a/crypto/heimdal/include/krb5-types.cross b/crypto/heimdal/include/krb5-types.cross --- a/crypto/heimdal/include/krb5-types.cross +++ b/crypto/heimdal/include/krb5-types.cross @@ -24,7 +24,7 @@ #ifndef HEIMDAL_DEPRECATED #if __has_extension(deprecated) || KRB5TYPES_REQUIRE_GNUC(3,1,0) -#define HEIMDAL_DEPRECATED __attribute__((deprecated)) +#define HEIMDAL_DEPRECATED __attribute__ ((__deprecated__)) #elif defined(_MSC_VER) && (_MSC_VER>1200) #define HEIMDAL_DEPRECATED __declspec(deprecated) #else @@ -34,7 +34,7 @@ #ifndef HEIMDAL_PRINTF_ATTRIBUTE #if __has_extension(format) || KRB5TYPES_REQUIRE_GNUC(3,1,0) -#define HEIMDAL_PRINTF_ATTRIBUTE(x) __attribute__((format x)) +#define HEIMDAL_PRINTF_ATTRIBUTE(x) __attribute__ ((__format__ x)) #else #define HEIMDAL_PRINTF_ATTRIBUTE(x) #endif @@ -42,7 +42,7 @@ #ifndef HEIMDAL_NORETURN_ATTRIBUTE #if __has_extension(noreturn) || KRB5TYPES_REQUIRE_GNUC(3,1,0) -#define HEIMDAL_NORETURN_ATTRIBUTE __attribute__((noreturn)) +#define HEIMDAL_NORETURN_ATTRIBUTE __attribute__ ((__noreturn__)) #else #define HEIMDAL_NORETURN_ATTRIBUTE #endif @@ -50,12 +50,18 @@ #ifndef HEIMDAL_UNUSED_ATTRIBUTE #if __has_extension(unused) || KRB5TYPES_REQUIRE_GNUC(3,1,0) -#define HEIMDAL_UNUSED_ATTRIBUTE __attribute__((unused)) +#define HEIMDAL_UNUSED_ATTRIBUTE __attribute__ ((__unused__)) #else #define HEIMDAL_UNUSED_ATTRIBUTE #endif #endif +#ifndef HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE +#if __has_extension(__warn_unused_result__) || KRB5TYPES_REQUIRE_GNUC(3,3,0) +#define HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE __attribute__ ((__warn_unused_result__)) +#endif +#endif + typedef int krb5_socket_t; #endif /* __krb5_types_h__ */ diff --git a/crypto/heimdal/install-sh b/crypto/heimdal/install-sh --- a/crypto/heimdal/install-sh +++ b/crypto/heimdal/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2009-04-28.21; # UTC +scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -35,25 +35,21 @@ # 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 +# '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. +tab=' ' nl=' ' -IFS=" "" $nl" +IFS=" $tab$nl" -# set DOITPROG to echo to test this script +# 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 +doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. @@ -68,22 +64,16 @@ 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 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -97,7 +87,7 @@ dst_arg= copy_on_change=false -no_target_directory= +is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE @@ -114,18 +104,28 @@ --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve 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. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -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 + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do @@ -137,42 +137,62 @@ -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift;; + shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift;; + shift;; + + -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; - -t) dst_arg=$2 - shift;; + -S) backupsuffix="$2" + shift;; + + -t) + is_target_a_directory=always + 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;; + -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; - --) shift - break;; + --) shift + break;; - -*) echo "$0: invalid option: $1" >&2 - exit 1;; + -*) echo "$0: invalid option: $1" >&2 + exit 1;; *) break;; esac shift done +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + 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. @@ -186,6 +206,10 @@ 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 @@ -194,13 +218,26 @@ echo "$0: no input file specified." >&2 exit 1 fi - # It's OK to call `install-sh -d' without argument. + # 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 - trap '(exit $?); exit' 1 2 13 15 + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +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. @@ -211,16 +248,16 @@ *[0-7]) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw='% 200' + u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw=,u+rw + u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac @@ -228,9 +265,9 @@ for src do - # Protect names starting with `-'. + # Protect names problematic for 'test' and other utilities. case $src in - -*) src=./$src;; + -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then @@ -238,6 +275,10 @@ dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -252,185 +293,150 @@ echo "$0: no destination specified." >&2 exit 1 fi - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. + # If destination is a directory, append the input filename. if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi dstdir=$dst - dst=$dstdir/`basename "$src"` + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac 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' - ` - + dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + 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 + # 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 + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else - mkdir_mode= + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null 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-writeable 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;; + trap '' 0;; esac if $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # 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='';; + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; esac - eval "$initialize_posix_glob" - oIFS=$IFS IFS=/ - $posix_glob set -f + set -f set fnord $dstdir shift - $posix_glob set +f + set +f IFS=$oIFS prefixes= for d do - test -z "$d" && 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/ + 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 + # 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 @@ -443,14 +449,25 @@ else # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_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") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -465,20 +482,24 @@ # 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 && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - + set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -486,24 +507,24 @@ # 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" + # 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 "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd "$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 @@ -512,9 +533,9 @@ done # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/crypto/heimdal/kadmin/Makefile.am b/crypto/heimdal/kadmin/Makefile.am --- a/crypto/heimdal/kadmin/Makefile.am +++ b/crypto/heimdal/kadmin/Makefile.am @@ -2,13 +2,13 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_libintl) $(INCLUDE_readline) $(INCLUDE_hcrypto) -I$(srcdir)/../lib/krb5 -I$(top_builddir)/include/gssapi +AM_CPPFLAGS += $(INCLUDE_libintl) $(INCLUDE_readline) -I$(srcdir)/../lib/krb5 -I$(top_builddir)/include/gssapi -sbin_PROGRAMS = kadmin +bin_PROGRAMS = kadmin libexec_PROGRAMS = kadmind -man_MANS = kadmin.8 kadmind.8 +man_MANS = kadmin.1 kadmind.8 noinst_PROGRAMS = add_random_users @@ -65,7 +65,7 @@ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) kadmind_LDADD = $(top_builddir)/lib/kadm5/libkadm5srv.la \ ../lib/gssapi/libgssapi.la \ diff --git a/crypto/heimdal/kadmin/Makefile.in b/crypto/heimdal/kadmin/Makefile.in --- a/crypto/heimdal/kadmin/Makefile.in +++ b/crypto/heimdal/kadmin/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,10 +94,7 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -sbin_PROGRAMS = kadmin$(EXEEXT) +bin_PROGRAMS = kadmin$(EXEEXT) libexec_PROGRAMS = kadmind$(EXEEXT) noinst_PROGRAMS = add_random_users$(EXEEXT) TESTS = test_util$(EXEEXT) @@ -52,7 +103,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -63,8 +113,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -77,6 +126,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -96,25 +146,31 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ + "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" am__EXEEXT_1 = test_util$(EXEEXT) -am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" \ - "$(DESTDIR)$(man8dir)" -PROGRAMS = $(libexec_PROGRAMS) $(noinst_PROGRAMS) $(sbin_PROGRAMS) +PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(noinst_PROGRAMS) am_add_random_users_OBJECTS = add-random-users.$(OBJEXT) add_random_users_OBJECTS = $(am_add_random_users_OBJECTS) am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) add_random_users_DEPENDENCIES = \ $(top_builddir)/lib/kadm5/libkadm5clnt.la \ $(top_builddir)/lib/kadm5/libkadm5srv.la $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = dist_kadmin_OBJECTS = ank.$(OBJEXT) add_enctype.$(OBJEXT) \ check.$(OBJEXT) cpw.$(OBJEXT) del.$(OBJEXT) \ del_enctype.$(OBJEXT) dump.$(OBJEXT) ext.$(OBJEXT) \ @@ -140,23 +196,61 @@ $(top_builddir)/lib/sl/libsl.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) test_util_DEPENDENCIES = $(am__DEPENDENCIES_3) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/add-random-users.Po \ + ./$(DEPDIR)/add_enctype.Po ./$(DEPDIR)/ank.Po \ + ./$(DEPDIR)/check.Po ./$(DEPDIR)/cpw.Po ./$(DEPDIR)/del.Po \ + ./$(DEPDIR)/del_enctype.Po ./$(DEPDIR)/dump.Po \ + ./$(DEPDIR)/ext.Po ./$(DEPDIR)/get.Po ./$(DEPDIR)/init.Po \ + ./$(DEPDIR)/kadm_conn.Po ./$(DEPDIR)/kadmin-commands.Po \ + ./$(DEPDIR)/kadmin.Po ./$(DEPDIR)/kadmind.Po \ + ./$(DEPDIR)/load.Po ./$(DEPDIR)/mod.Po \ + ./$(DEPDIR)/pw_quality.Po ./$(DEPDIR)/random_password.Po \ + ./$(DEPDIR)/rename.Po ./$(DEPDIR)/rpc.Po ./$(DEPDIR)/server.Po \ + ./$(DEPDIR)/stash.Po ./$(DEPDIR)/test_util.Po \ + ./$(DEPDIR)/util.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(add_random_users_SOURCES) $(dist_kadmin_SOURCES) \ $(nodist_kadmin_SOURCES) $(kadmind_SOURCES) \ $(test_util_SOURCES) DIST_SOURCES = $(add_random_users_SOURCES) $(dist_kadmin_SOURCES) \ $(kadmind_SOURCES) $(test_util_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/||"`;; \ @@ -178,17 +272,221 @@ 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 man8dir = $(mandir)/man8 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -203,16 +501,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -222,17 +523,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -251,12 +554,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -265,6 +565,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -281,10 +582,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -292,6 +591,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -306,12 +606,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -328,10 +631,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -342,13 +651,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -372,6 +675,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -395,9 +700,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -407,32 +717,39 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_libintl) $(INCLUDE_readline) \ - $(INCLUDE_hcrypto) -I$(srcdir)/../lib/krb5 \ - -I$(top_builddir)/include/gssapi + -I$(srcdir)/../lib/krb5 -I$(top_builddir)/include/gssapi @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -man_MANS = kadmin.8 kadmind.8 + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +man_MANS = kadmin.1 kadmind.8 dist_kadmin_SOURCES = \ ank.c \ add_enctype.c \ @@ -474,7 +791,7 @@ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) kadmind_LDADD = $(top_builddir)/lib/kadm5/libkadm5srv.la \ ../lib/gssapi/libgssapi.la \ @@ -507,7 +824,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -520,15 +837,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kadmin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign kadmin/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -538,25 +855,21 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): - -clean-checkPROGRAMS: - @list='$(check_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 -install-libexecPROGRAMS: $(libexec_PROGRAMS) +install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + @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; \ + 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|.*|.|' \ + 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 } \ @@ -567,23 +880,24 @@ 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)$(libexecdir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ + 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-libexecPROGRAMS: +uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(libexecdir)" && rm -f $$files + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files -clean-libexecPROGRAMS: - @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \ +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ @@ -591,24 +905,29 @@ echo " rm -f" $$list; \ rm -f $$list -clean-noinstPROGRAMS: - @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ +clean-checkPROGRAMS: + @list='$(check_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 -install-sbinPROGRAMS: $(sbin_PROGRAMS) +install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -619,41 +938,55 @@ 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)$(sbindir)$$dir'"; \ - $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ } \ ; done -uninstall-sbinPROGRAMS: +uninstall-libexecPROGRAMS: @$(NORMAL_UNINSTALL) - @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(sbindir)" && rm -f $$files + echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libexecdir)" && rm -f $$files -clean-sbinPROGRAMS: - @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ +clean-libexecPROGRAMS: + @list='$(libexec_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 -add_random_users$(EXEEXT): $(add_random_users_OBJECTS) $(add_random_users_DEPENDENCIES) + +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 + +add_random_users$(EXEEXT): $(add_random_users_OBJECTS) $(add_random_users_DEPENDENCIES) $(EXTRA_add_random_users_DEPENDENCIES) @rm -f add_random_users$(EXEEXT) - $(LINK) $(add_random_users_OBJECTS) $(add_random_users_LDADD) $(LIBS) -kadmin$(EXEEXT): $(kadmin_OBJECTS) $(kadmin_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(add_random_users_OBJECTS) $(add_random_users_LDADD) $(LIBS) + +kadmin$(EXEEXT): $(kadmin_OBJECTS) $(kadmin_DEPENDENCIES) $(EXTRA_kadmin_DEPENDENCIES) @rm -f kadmin$(EXEEXT) - $(LINK) $(kadmin_OBJECTS) $(kadmin_LDADD) $(LIBS) -kadmind$(EXEEXT): $(kadmind_OBJECTS) $(kadmind_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kadmin_OBJECTS) $(kadmin_LDADD) $(LIBS) + +kadmind$(EXEEXT): $(kadmind_OBJECTS) $(kadmind_DEPENDENCIES) $(EXTRA_kadmind_DEPENDENCIES) @rm -f kadmind$(EXEEXT) - $(LINK) $(kadmind_OBJECTS) $(kadmind_LDADD) $(LIBS) -test_util$(EXEEXT): $(test_util_OBJECTS) $(test_util_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kadmind_OBJECTS) $(kadmind_LDADD) $(LIBS) + +test_util$(EXEEXT): $(test_util_OBJECTS) $(test_util_DEPENDENCIES) $(EXTRA_test_util_DEPENDENCIES) @rm -f test_util$(EXEEXT) - $(LINK) $(test_util_OBJECTS) $(test_util_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_util_OBJECTS) $(test_util_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -661,65 +994,121 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add-random-users.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_enctype.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ank.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpw.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/del.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/del_enctype.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ext.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadm_conn.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadmin-commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadmin.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadmind.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pw_quality.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random_password.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stash.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_util.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add-random-users.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/add_enctype.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ank.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpw.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/del.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/del_enctype.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ext.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadm_conn.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadmin-commands.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadmin.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadmind.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/load.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mod.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pw_quality.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random_password.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rpc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stash.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_util.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -install-man8: $(man_MANS) +install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ + @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 '/\.8[a-z]*$$/p'; \ + 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) +install-man8: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -748,30 +1137,17 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -783,15 +1159,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -800,116 +1172,191 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - skipped="($$skip tests were not run)"; \ + color_start= color_end=; \ fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -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 + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test_util.log: test_util$(EXEEXT) + @p='test_util$(EXEEXT)'; \ + b='test_util'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -948,7 +1395,7 @@ check: check-am all-am: Makefile $(PROGRAMS) $(MANS) all-local installdirs: - for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -961,11 +1408,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -979,12 +1434,36 @@ @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-checkPROGRAMS clean-generic clean-libexecPROGRAMS \ - clean-libtool clean-noinstPROGRAMS clean-sbinPROGRAMS \ +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + clean-libexecPROGRAMS clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/add-random-users.Po + -rm -f ./$(DEPDIR)/add_enctype.Po + -rm -f ./$(DEPDIR)/ank.Po + -rm -f ./$(DEPDIR)/check.Po + -rm -f ./$(DEPDIR)/cpw.Po + -rm -f ./$(DEPDIR)/del.Po + -rm -f ./$(DEPDIR)/del_enctype.Po + -rm -f ./$(DEPDIR)/dump.Po + -rm -f ./$(DEPDIR)/ext.Po + -rm -f ./$(DEPDIR)/get.Po + -rm -f ./$(DEPDIR)/init.Po + -rm -f ./$(DEPDIR)/kadm_conn.Po + -rm -f ./$(DEPDIR)/kadmin-commands.Po + -rm -f ./$(DEPDIR)/kadmin.Po + -rm -f ./$(DEPDIR)/kadmind.Po + -rm -f ./$(DEPDIR)/load.Po + -rm -f ./$(DEPDIR)/mod.Po + -rm -f ./$(DEPDIR)/pw_quality.Po + -rm -f ./$(DEPDIR)/random_password.Po + -rm -f ./$(DEPDIR)/rename.Po + -rm -f ./$(DEPDIR)/rpc.Po + -rm -f ./$(DEPDIR)/server.Po + -rm -f ./$(DEPDIR)/stash.Po + -rm -f ./$(DEPDIR)/test_util.Po + -rm -f ./$(DEPDIR)/util.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1008,9 +1487,9 @@ install-dvi-am: -install-exec-am: install-libexecPROGRAMS install-sbinPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libexecPROGRAMS + install-html: install-html-am install-html-am: @@ -1019,7 +1498,7 @@ install-info-am: -install-man: install-man8 +install-man: install-man1 install-man8 install-pdf: install-pdf-am @@ -1032,7 +1511,31 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/add-random-users.Po + -rm -f ./$(DEPDIR)/add_enctype.Po + -rm -f ./$(DEPDIR)/ank.Po + -rm -f ./$(DEPDIR)/check.Po + -rm -f ./$(DEPDIR)/cpw.Po + -rm -f ./$(DEPDIR)/del.Po + -rm -f ./$(DEPDIR)/del_enctype.Po + -rm -f ./$(DEPDIR)/dump.Po + -rm -f ./$(DEPDIR)/ext.Po + -rm -f ./$(DEPDIR)/get.Po + -rm -f ./$(DEPDIR)/init.Po + -rm -f ./$(DEPDIR)/kadm_conn.Po + -rm -f ./$(DEPDIR)/kadmin-commands.Po + -rm -f ./$(DEPDIR)/kadmin.Po + -rm -f ./$(DEPDIR)/kadmind.Po + -rm -f ./$(DEPDIR)/load.Po + -rm -f ./$(DEPDIR)/mod.Po + -rm -f ./$(DEPDIR)/pw_quality.Po + -rm -f ./$(DEPDIR)/random_password.Po + -rm -f ./$(DEPDIR)/rename.Po + -rm -f ./$(DEPDIR)/rpc.Po + -rm -f ./$(DEPDIR)/server.Po + -rm -f ./$(DEPDIR)/stash.Po + -rm -f ./$(DEPDIR)/test_util.Po + -rm -f ./$(DEPDIR)/util.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1049,48 +1552,64 @@ ps-am: -uninstall-am: uninstall-libexecPROGRAMS uninstall-man \ - uninstall-sbinPROGRAMS +uninstall-am: uninstall-binPROGRAMS uninstall-libexecPROGRAMS \ + uninstall-man @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man8 +uninstall-man: uninstall-man1 uninstall-man8 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-checkPROGRAMS clean-generic \ - clean-libexecPROGRAMS clean-libtool clean-noinstPROGRAMS \ - clean-sbinPROGRAMS ctags dist-hook distclean distclean-compile \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-generic clean-libexecPROGRAMS \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ - install-libexecPROGRAMS install-man install-man8 install-pdf \ - install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ + install-binPROGRAMS install-data install-data-am \ + install-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ + install-html-am install-info install-info-am \ + install-libexecPROGRAMS install-man install-man1 install-man8 \ + 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-hook \ - uninstall-libexecPROGRAMS uninstall-man uninstall-man8 \ - uninstall-sbinPROGRAMS + pdf pdf-am ps ps-am recheck tags tags-am uninstall \ + uninstall-am uninstall-binPROGRAMS uninstall-hook \ + uninstall-libexecPROGRAMS uninstall-man uninstall-man1 \ + uninstall-man8 + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1098,7 +1617,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1143,11 +1662,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1155,6 +1683,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1197,6 +1727,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1210,13 +1753,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/kadmin/NTMakefile b/crypto/heimdal/kadmin/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kadmin/NTMakefile @@ -0,0 +1,134 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=kadmin +cincdirs=-I$(OBJ) -I$(INCDIR)\gssapi + +!include ../windows/NTMakefile.w32 + +SBIN_PROGRAMS=$(SBINDIR)\kadmin.exe + +# Disable kadmind.exe since currently it doesn't build +#LIBEXEC_PROGRAMS=$(LIBEXECDIR)\kadmind.exe +# + +COMMON_LIBS= \ + $(LIBHDB) \ + $(LIBHEIMDAL) \ + $(LIBROKEN) + +KADMIN_OBJS= \ + $(OBJ)\ank.obj \ + $(OBJ)\add_enctype.obj \ + $(OBJ)\check.obj \ + $(OBJ)\cpw.obj \ + $(OBJ)\del.obj \ + $(OBJ)\del_enctype.obj \ + $(OBJ)\dump.obj \ + $(OBJ)\ext.obj \ + $(OBJ)\get.obj \ + $(OBJ)\init.obj \ + $(OBJ)\kadmin.obj \ + $(OBJ)\load.obj \ + $(OBJ)\mod.obj \ + $(OBJ)\rename.obj \ + $(OBJ)\stash.obj \ + $(OBJ)\util.obj \ + $(OBJ)\pw_quality.obj \ + $(OBJ)\random_password.obj \ + $(OBJ)\kadmin-commands.obj \ + $(OBJ)\kadmin-version.res + +KADMIN_LIBS= \ + $(LIBKADM5CLNT) \ + $(LIBKADM5SRV) \ + $(LIBSL) \ + $(COMMON_LIBS) \ + $(LIBVERS) \ + $(LIBCOMERR) + +INCFILES=$(OBJ)\kadmin-commands.h + +$(OBJ)\kadmin-commands.c $(OBJ)\kadmin-commands.h: kadmin-commands.in + cd $(OBJ) + $(CP) $(SRCDIR)\kadmin-commands.in $(OBJ) + $(BINDIR)\slc.exe kadmin-commands.in + cd $(SRCDIR) + +$(SBINDIR)\kadmin.exe: $(KADMIN_OBJS) $(KADMIN_LIBS) + $(EXECONLINK) + $(EXEPREP) + +KADMIND_OBJS= \ + $(OBJ)\rpc.obj \ + $(OBJ)\server.obj \ + $(OBJ)\kadmind.obj \ + $(OBJ)\kadm_conn.obj \ + $(OBJ)\kadmind-version.res + +KADMIND_LIBS=\ + $(LIBKADM5SRV) \ + $(LIBGSSAPI) \ + $(COMMON_LIBS) + +$(LIBEXECDIR)\kadmind.exe: $(KADMIND_OBJS) $(KADMIND_LIBS) + $(EXECONLINK) + $(EXEPREP) + +all:: $(INCFILES) $(SBIN_PROGRAMS) $(LIBEXEC_PROGRAMS) + +clean:: + -$(RM) $(SBIN_PROGRAMS:.exe=.*) + -$(RM) $(LIBEXEC_PROGRAMS:.exe=.*) + + + + +NOINST_PROGRAMS=$(OBJ)\add_random_users.exe + +$(OBJ)\add_random_users.exe: $(OBJ)\add_random_users.obj $(LIBKADM5SRV) $(LIBKADM5CLNT) $(COMMON_LIBS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +TEST_BINARIES=$(OBJ)\test_util.exe + +$(OBJ)\test_util.exe: $(OBJ)\test_util.obj $(OBJ)\util.obj $(KADMIN_LIBS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +test-binaries: $(TEST_BINARIES) + +test-run: + cd $(OBJ) + test_util.exe + cd $(SRCDIR) + +test:: test-binaries test-run diff --git a/crypto/heimdal/kadmin/add-random-users.c b/crypto/heimdal/kadmin/add-random-users.c --- a/crypto/heimdal/kadmin/add-random-users.c +++ b/crypto/heimdal/kadmin/add-random-users.c @@ -77,8 +77,7 @@ } static void -add_user (krb5_context context, void *kadm_handle, - unsigned nwords, char **words) +add_user (krb5_context ctx, void *hndl, unsigned nwords, char **words) { kadm5_principal_ent_rec princ; char name[64]; @@ -94,14 +93,14 @@ mask = KADM5_PRINCIPAL; memset(&princ, 0, sizeof(princ)); - ret = krb5_parse_name(context, name, &princ.principal); + ret = krb5_parse_name(ctx, name, &princ.principal); if (ret) - krb5_err(context, 1, ret, "krb5_parse_name"); + krb5_err(ctx, 1, ret, "krb5_parse_name"); - ret = kadm5_create_principal (kadm_handle, &princ, mask, name); + ret = kadm5_create_principal (hndl, &princ, mask, name); if (ret) - krb5_err (context, 1, ret, "kadm5_create_principal"); - kadm5_free_principal_ent(kadm_handle, &princ); + krb5_err (ctx, 1, ret, "kadm5_create_principal"); + kadm5_free_principal_ent(hndl, &princ); printf ("%s\n", name); } @@ -110,37 +109,38 @@ { krb5_error_code ret; int i; - void *kadm_handle; - krb5_context context; + void *hndl; + krb5_context ctx; unsigned nwords; char **words; - ret = krb5_init_context(&context); + ret = krb5_init_context(&ctx); if (ret) errx (1, "krb5_init_context failed: %d", ret); - ret = kadm5_s_init_with_password_ctx(context, + ret = kadm5_s_init_with_password_ctx(ctx, KADM5_ADMIN_SERVICE, NULL, KADM5_ADMIN_SERVICE, NULL, 0, 0, - &kadm_handle); + &hndl); if(ret) - krb5_err(context, 1, ret, "kadm5_init_with_password"); + krb5_err(ctx, 1, ret, "kadm5_init_with_password"); nwords = read_words (filename, &words); for (i = 0; i < n; ++i) - add_user (context, kadm_handle, nwords, words); - kadm5_destroy(kadm_handle); - krb5_free_context(context); + add_user (ctx, hndl, nwords, words); + kadm5_destroy(hndl); + krb5_free_context(ctx); + free(words); } static int version_flag = 0; static int help_flag = 0; static struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; static void diff --git a/crypto/heimdal/kadmin/add_enctype.c b/crypto/heimdal/kadmin/add_enctype.c --- a/crypto/heimdal/kadmin/add_enctype.c +++ b/crypto/heimdal/kadmin/add_enctype.c @@ -55,7 +55,7 @@ return 0; } - memset (&princ, 0, sizeof(princ)); + memset(&princ, 0, sizeof(princ)); princ_name = argv[0]; n_etypes = argc - 1; etypes = malloc (n_etypes * sizeof(*etypes)); @@ -65,7 +65,7 @@ } argv++; for (i = 0; i < n_etypes; ++i) { - ret = krb5_string_to_enctype (context, argv[i], &etypes[i]); + ret = krb5_string_to_enctype(context, argv[i], &etypes[i]); if (ret) { krb5_warnx (context, "bad enctype \"%s\"", argv[i]); goto out2; @@ -74,20 +74,27 @@ ret = krb5_parse_name(context, princ_name, &princ_ent); if (ret) { - krb5_warn (context, ret, "krb5_parse_name %s", princ_name); + krb5_warn(context, ret, "krb5_parse_name %s", princ_name); goto out2; } + /* The principal might have zero keys, but it will still have a kvno! */ ret = kadm5_get_principal(kadm_handle, princ_ent, &princ, - KADM5_PRINCIPAL | KADM5_KEY_DATA); + KADM5_KVNO | KADM5_PRINCIPAL | KADM5_KEY_DATA); if (ret) { - krb5_free_principal (context, princ_ent); - krb5_warnx (context, "no such principal: %s", princ_name); + krb5_free_principal(context, princ_ent); + krb5_warnx(context, "no such principal: %s", princ_name); goto out2; } - new_key_data = malloc((princ.n_key_data + n_etypes) - * sizeof(*new_key_data)); + /* Check that we got key data */ + if (kadm5_all_keys_are_bogus(princ.n_key_data, princ.key_data)) { + krb5_warnx(context, "user lacks get-keys privilege"); + goto out; + } + + new_key_data = calloc(princ.n_key_data + n_etypes, + sizeof(*new_key_data)); if (new_key_data == NULL) { krb5_warnx (context, "out of memory"); goto out; @@ -98,6 +105,7 @@ for (j = 0; j < n_etypes; ++j) { if (etypes[j] == key->key_data_type[0]) { + /* XXX Should this be an error? The admin can del_enctype... */ krb5_warnx(context, "enctype %d already exists", (int)etypes[j]); free(new_key_data); @@ -113,7 +121,7 @@ memset(&new_key_data[n], 0, sizeof(new_key_data[n])); new_key_data[n].key_data_ver = 2; - new_key_data[n].key_data_kvno = 0; + new_key_data[n].key_data_kvno = princ.kvno; ret = krb5_generate_random_keyblock (context, etypes[i], &keyblock); if (ret) { diff --git a/crypto/heimdal/kadmin/ank.c b/crypto/heimdal/kadmin/ank.c --- a/crypto/heimdal/kadmin/ank.c +++ b/crypto/heimdal/kadmin/ank.c @@ -68,6 +68,7 @@ int rand_password, int use_defaults, char *password, + char *policy, krb5_key_data *key_data, const char *max_ticket_life, const char *max_renewable_life, @@ -94,7 +95,7 @@ ret = set_entry(context, &princ, &mask, max_ticket_life, max_renewable_life, - expiration, pw_expiration, attributes); + expiration, pw_expiration, attributes, policy); if (ret) goto out; @@ -124,11 +125,21 @@ } else if(password == NULL) { char *princ_name; char *prompt; + int aret; - krb5_unparse_name(context, princ_ent, &princ_name); - asprintf (&prompt, "%s's Password: ", princ_name); + ret = krb5_unparse_name(context, princ_ent, &princ_name); + if (ret) + goto out; + aret = asprintf (&prompt, "%s's Password: ", princ_name); free (princ_name); - ret = UI_UTIL_read_pw_string (pwbuf, sizeof(pwbuf), prompt, 1); + if (aret == -1) { + ret = ENOMEM; + krb5_set_error_message(context, ret, "out of memory"); + goto out; + } + ret = UI_UTIL_read_pw_string (pwbuf, sizeof(pwbuf), prompt, + UI_UTIL_FLAG_VERIFY | + UI_UTIL_FLAG_VERIFY_SILENT); free (prompt); if (ret) { ret = KRB5_LIBOS_BADPWDMATCH; @@ -158,11 +169,18 @@ free(new_keys); kadm5_get_principal(kadm_handle, princ_ent, &princ, KADM5_PRINCIPAL | KADM5_KVNO | KADM5_ATTRIBUTES); + krb5_free_principal(context, princ_ent); + princ_ent = princ.principal; princ.attributes &= (~KRB5_KDB_DISALLOW_ALL_TIX); + /* + * Updating kvno w/o key data and vice-versa gives _kadm5_setup_entry() + * and _kadm5_set_keys2() headaches. But we used to, so we handle + * this in in those two functions. Might as well leave this code as + * it was then. + */ princ.kvno = 1; kadm5_modify_principal(kadm_handle, &princ, KADM5_ATTRIBUTES | KADM5_KVNO); - kadm5_free_principal_ent(kadm_handle, &princ); } else if (key_data) { ret = kadm5_chpass_principal_with_key (kadm_handle, princ_ent, 3, key_data); @@ -171,9 +189,10 @@ } kadm5_get_principal(kadm_handle, princ_ent, &princ, KADM5_PRINCIPAL | KADM5_ATTRIBUTES); + krb5_free_principal(context, princ_ent); + princ_ent = princ.principal; princ.attributes &= (~KRB5_KDB_DISALLOW_ALL_TIX); kadm5_modify_principal(kadm_handle, &princ, KADM5_ATTRIBUTES); - kadm5_free_principal_ent(kadm_handle, &princ); } else if (rand_password) { char *princ_name; @@ -182,8 +201,7 @@ free (princ_name); } out: - if (princ_ent) - krb5_free_principal (context, princ_ent); + kadm5_free_principal_ent(kadm_handle, &princ); /* frees princ_ent */ if(default_ent) kadm5_free_principal_ent (kadm_handle, default_ent); if (password != NULL) @@ -245,6 +263,7 @@ opt->random_password_flag, opt->use_defaults_flag, opt->password_string, + opt->policy_string, kdp, opt->max_ticket_life_string, opt->max_renewable_life_string, diff --git a/crypto/heimdal/kadmin/check.c b/crypto/heimdal/kadmin/check.c --- a/crypto/heimdal/kadmin/check.c +++ b/crypto/heimdal/kadmin/check.c @@ -51,7 +51,7 @@ } memset(ent, 0, sizeof(*ent)); - ret = kadm5_get_principal(kadm_handle, principal, ent, 0); + ret = kadm5_get_principal(kadm_handle, principal, ent, KADM5_ATTRIBUTES); krb5_free_principal(context, principal); if(ret) return 1; @@ -184,6 +184,35 @@ kadm5_free_principal_ent(kadm_handle, &ent); + /* + * Check default@REALM + * + * Check that disallow-all-tix is set on the default principal + * (or that the entry doesn't exists) + */ + + if (asprintf(&p, "default@%s", realm) == -1) { + krb5_warn(context, errno, "asprintf"); + goto fail; + } + + ret = get_check_entry(p, &ent); + if (ret == 0) { + if ((ent.attributes & KRB5_KDB_DISALLOW_ALL_TIX) == 0) { + printf("default template entry is not disabled\n"); + ret = EINVAL; + } + kadm5_free_principal_ent(kadm_handle, &ent); + + } else { + ret = 0; + } + + free(p); + + if (ret) + goto fail; + /* * Check for duplicate afs keys */ diff --git a/crypto/heimdal/kadmin/cpw.c b/crypto/heimdal/kadmin/cpw.c --- a/crypto/heimdal/kadmin/cpw.c +++ b/crypto/heimdal/kadmin/cpw.c @@ -35,6 +35,7 @@ #include "kadmin-commands.h" struct cpw_entry_data { + int keepold; int random_key; int random_password; char *password; @@ -42,14 +43,15 @@ }; static int -set_random_key (krb5_principal principal) +set_random_key (krb5_principal principal, int keepold) { krb5_error_code ret; int i; krb5_keyblock *keys; int num_keys; - ret = kadm5_randkey_principal(kadm_handle, principal, &keys, &num_keys); + ret = kadm5_randkey_principal_3(kadm_handle, principal, keepold, 0, NULL, + &keys, &num_keys); if(ret) return ret; for(i = 0; i < num_keys; i++) @@ -59,13 +61,13 @@ } static int -set_random_password (krb5_principal principal) +set_random_password (krb5_principal principal, int keepold) { krb5_error_code ret; char pw[128]; random_password (pw, sizeof(pw)); - ret = kadm5_chpass_principal(kadm_handle, principal, pw); + ret = kadm5_chpass_principal_3(kadm_handle, principal, keepold, 0, NULL, pw); if (ret == 0) { char *princ_name; @@ -74,24 +76,31 @@ printf ("%s's password set to \"%s\"\n", princ_name, pw); free (princ_name); } - memset (pw, 0, sizeof(pw)); + memset_s(pw, sizeof(pw), 0, sizeof(pw)); return ret; } static int -set_password (krb5_principal principal, char *password) +set_password (krb5_principal principal, char *password, int keepold) { krb5_error_code ret = 0; char pwbuf[128]; + int aret; if(password == NULL) { char *princ_name; char *prompt; - krb5_unparse_name(context, principal, &princ_name); - asprintf(&prompt, "%s's Password: ", princ_name); + ret = krb5_unparse_name(context, principal, &princ_name); + if (ret) + return ret; + aret = asprintf(&prompt, "%s's Password: ", princ_name); free (princ_name); - ret = UI_UTIL_read_pw_string(pwbuf, sizeof(pwbuf), prompt, 1); + if (aret == -1) + return ENOMEM; + ret = UI_UTIL_read_pw_string(pwbuf, sizeof(pwbuf), prompt, + UI_UTIL_FLAG_VERIFY | + UI_UTIL_FLAG_VERIFY_SILENT); free (prompt); if(ret){ return 0; /* XXX error code? */ @@ -99,18 +108,19 @@ password = pwbuf; } if(ret == 0) - ret = kadm5_chpass_principal(kadm_handle, principal, password); - memset(pwbuf, 0, sizeof(pwbuf)); + ret = kadm5_chpass_principal_3(kadm_handle, principal, keepold, 0, NULL, + password); + memset_s(pwbuf, sizeof(pwbuf), 0, sizeof(pwbuf)); return ret; } static int -set_key_data (krb5_principal principal, krb5_key_data *key_data) +set_key_data (krb5_principal principal, krb5_key_data *key_data, int keepold) { krb5_error_code ret; - ret = kadm5_chpass_principal_with_key (kadm_handle, principal, - 3, key_data); + ret = kadm5_chpass_principal_with_key_3(kadm_handle, principal, keepold, + 3, key_data); return ret; } @@ -120,13 +130,13 @@ struct cpw_entry_data *e = data; if (e->random_key) - return set_random_key (principal); + return set_random_key (principal, e->keepold); else if (e->random_password) - return set_random_password (principal); + return set_random_password (principal, e->keepold); else if (e->key_data) - return set_key_data (principal, e->key_data); + return set_key_data (principal, e->key_data, e->keepold); else - return set_password (principal, e->password); + return set_password (principal, e->password, e->keepold); } int @@ -138,6 +148,7 @@ int num; krb5_key_data key_data[3]; + data.keepold = opt->keepold_flag; data.random_key = opt->random_key_flag; data.random_password = opt->random_password_flag; data.password = opt->password_string; diff --git a/crypto/heimdal/kadmin/del_enctype.c b/crypto/heimdal/kadmin/del_enctype.c --- a/crypto/heimdal/kadmin/del_enctype.c +++ b/crypto/heimdal/kadmin/del_enctype.c @@ -49,6 +49,7 @@ krb5_key_data *new_key_data; int n_etypes; krb5_enctype *etypes; + krb5_key_data *key; memset (&princ, 0, sizeof(princ)); princ_name = argv[0]; @@ -81,6 +82,11 @@ goto out2; } + if (kadm5_all_keys_are_bogus(princ.n_key_data, princ.key_data)) { + krb5_warnx(context, "user lacks get-keys privilege"); + goto out; + } + new_key_data = malloc(princ.n_key_data * sizeof(*new_key_data)); if (new_key_data == NULL && princ.n_key_data != 0) { krb5_warnx (context, "out of memory"); @@ -88,14 +94,15 @@ } for (i = 0, j = 0; i < princ.n_key_data; ++i) { - krb5_key_data *key = &princ.key_data[i]; int docopy = 1; + key = &princ.key_data[i]; - for (k = 0; k < n_etypes; ++k) + for (k = 0; k < n_etypes; ++k) { if (etypes[k] == key->key_data_type[0]) { docopy = 0; break; } + } if (docopy) { new_key_data[j++] = *key; } else { @@ -106,6 +113,10 @@ } free (princ.key_data); + if (j == 0) { + free(new_key_data); + new_key_data = NULL; + } princ.n_key_data = j; princ.key_data = new_key_data; diff --git a/crypto/heimdal/kadmin/dump.c b/crypto/heimdal/kadmin/dump.c --- a/crypto/heimdal/kadmin/dump.c +++ b/crypto/heimdal/kadmin/dump.c @@ -42,32 +42,42 @@ { krb5_error_code ret; FILE *f; + struct hdb_print_entry_arg parg; HDB *db = NULL; - if(!local_flag) { + if (!local_flag) { krb5_warnx(context, "dump is only available in local (-l) mode"); return 0; } db = _kadm5_s_get_db(kadm_handle); - if(argc == 0) + if (argc == 0) f = stdout; else f = fopen(argv[0], "w"); - if(f == NULL) { + if (f == NULL) { krb5_warn(context, errno, "open: %s", argv[0]); goto out; } ret = db->hdb_open(context, db, O_RDONLY, 0600); - if(ret) { + if (ret) { krb5_warn(context, ret, "hdb_open"); goto out; } + if (!opt->format_string || strcmp(opt->format_string, "Heimdal") == 0) { + parg.fmt = HDB_DUMP_HEIMDAL; + } else if (opt->format_string && strcmp(opt->format_string, "MIT") == 0) { + parg.fmt = HDB_DUMP_MIT; + fprintf(f, "kdb5_util load_dump version 5\n"); /* 5||6, either way */ + } else { + krb5_errx(context, 1, "Supported dump formats: Heimdal and MIT"); + } + parg.out = f; hdb_foreach(context, db, opt->decrypt_flag ? HDB_F_DECRYPT : 0, - hdb_print_entry, f); + hdb_print_entry, &parg); db->hdb_close(context, db); out: diff --git a/crypto/heimdal/kadmin/ext.c b/crypto/heimdal/kadmin/ext.c --- a/crypto/heimdal/kadmin/ext.c +++ b/crypto/heimdal/kadmin/ext.c @@ -36,6 +36,7 @@ struct ext_keytab_data { krb5_keytab keytab; + int random_key_flag; }; static int @@ -46,43 +47,76 @@ struct ext_keytab_data *e = data; krb5_keytab_entry *keys = NULL; krb5_keyblock *k = NULL; - int i, n_k; + size_t i; + int n_k = 0; + uint32_t mask; + char *unparsed = NULL; - ret = kadm5_get_principal(kadm_handle, principal, &princ, - KADM5_PRINCIPAL|KADM5_KVNO|KADM5_KEY_DATA); - if(ret) + mask = KADM5_PRINCIPAL; + if (!e->random_key_flag) + mask |= KADM5_KVNO | KADM5_KEY_DATA; + + ret = kadm5_get_principal(kadm_handle, principal, &princ, mask); + if (ret) return ret; - if (princ.n_key_data) { - keys = malloc(sizeof(*keys) * princ.n_key_data); + ret = krb5_unparse_name(context, principal, &unparsed); + if (ret) + goto out; + + if (!e->random_key_flag) { + if (princ.n_key_data == 0) { + krb5_warnx(context, "principal has no keys, or user lacks " + "get-keys privilege for %s", unparsed); + goto out; + } + /* + * kadmin clients and servers from master between 1.5 and 1.6 + * can have corrupted a principal's keys in the HDB. If some + * are bogus but not all are, then that must have happened. + * + * If all keys are bogus then the server may be a pre-1.6, + * post-1.5 server and the client lacks get-keys privilege, or + * the keys are corrupted. We can't tell here. + */ + if (kadm5_all_keys_are_bogus(princ.n_key_data, princ.key_data)) { + krb5_warnx(context, "user lacks get-keys privilege for %s", + unparsed); + goto out; + } + if (kadm5_some_keys_are_bogus(princ.n_key_data, princ.key_data)) { + krb5_warnx(context, "some keys for %s are corrupted in the HDB", + unparsed); + } + keys = calloc(sizeof(*keys), princ.n_key_data); if (keys == NULL) { - kadm5_free_principal_ent(kadm_handle, &princ); - krb5_clear_error_message(context); - return ENOMEM; + ret = krb5_enomem(context); + goto out; } for (i = 0; i < princ.n_key_data; i++) { krb5_key_data *kd = &princ.key_data[i]; + /* Don't extract bogus keys */ + if (kadm5_all_keys_are_bogus(1, kd)) + continue; + keys[i].principal = princ.principal; keys[i].vno = kd->key_data_kvno; keys[i].keyblock.keytype = kd->key_data_type[0]; keys[i].keyblock.keyvalue.length = kd->key_data_length[0]; keys[i].keyblock.keyvalue.data = kd->key_data_contents[0]; keys[i].timestamp = time(NULL); + n_k++; } - - n_k = princ.n_key_data; - } else { + } else if (e->random_key_flag) { ret = kadm5_randkey_principal(kadm_handle, principal, &k, &n_k); - if (ret) { - kadm5_free_principal_ent(kadm_handle, &princ); - return ret; - } - keys = malloc(sizeof(*keys) * n_k); + if (ret) + goto out; + + keys = calloc(sizeof(*keys), n_k); if (keys == NULL) { - kadm5_free_principal_ent(kadm_handle, &princ); - krb5_clear_error_message(context); - return ENOMEM; + ret = krb5_enomem(context); + goto out; } for (i = 0; i < n_k; i++) { keys[i].principal = principal; @@ -92,20 +126,25 @@ } } - for(i = 0; i < n_k; i++) { + if (n_k == 0) + krb5_warn(context, ret, "no keys written to keytab for %s", unparsed); + + for (i = 0; i < n_k; i++) { ret = krb5_kt_add_entry(context, e->keytab, &keys[i]); - if(ret) - krb5_warn(context, ret, "krb5_kt_add_entry(%d)", i); + if (ret) + krb5_warn(context, ret, "krb5_kt_add_entry(%lu)", (unsigned long)i); } + out: + kadm5_free_principal_ent(kadm_handle, &princ); if (k) { - memset(k, 0, n_k * sizeof(*k)); + for (i = 0; i < n_k; i++) + memset(k[i].keyvalue.data, 0, k[i].keyvalue.length); free(k); } - if (keys) - free(keys); - kadm5_free_principal_ent(kadm_handle, &princ); - return 0; + free(unparsed); + free(keys); + return ret; } int @@ -125,6 +164,8 @@ return 1; } + data.random_key_flag = opt->random_key_flag; + for(i = 0; i < argc; i++) { ret = foreach_principal(argv[i], do_ext_keytab, "ext", &data); if (ret) diff --git a/crypto/heimdal/kadmin/get.c b/crypto/heimdal/kadmin/get.c --- a/crypto/heimdal/kadmin/get.c +++ b/crypto/heimdal/kadmin/get.c @@ -60,11 +60,13 @@ { "last_failed", KADM5_LAST_FAILED, 0, 0, "Last fail", "Last failed login", 0 }, { "fail_auth_count", KADM5_FAIL_AUTH_COUNT, 0, 0, "Fail count", "Failed login count", RTBL_ALIGN_RIGHT }, { "policy", KADM5_POLICY, 0, 0, "Policy", "Policy", 0 }, - { "keytypes", KADM5_KEY_DATA, 0, KADM5_PRINCIPAL, "Keytypes", "Keytypes", 0 }, + { "keytypes", KADM5_KEY_DATA, 0, KADM5_PRINCIPAL | KADM5_KVNO, "Keytypes", "Keytypes", 0 }, { "password", KADM5_TL_DATA, KRB5_TL_PASSWORD, KADM5_KEY_DATA, "Password", "Password", 0 }, { "pkinit-acl", KADM5_TL_DATA, KRB5_TL_PKINIT_ACL, 0, "PK-INIT ACL", "PK-INIT ACL", 0 }, { "aliases", KADM5_TL_DATA, KRB5_TL_ALIASES, 0, "Aliases", "Aliases", 0 }, - { NULL } + { "hist-kvno-diff-clnt", KADM5_TL_DATA, KRB5_TL_HIST_KVNO_DIFF_CLNT, 0, "Clnt hist keys", "Historic keys allowed for client", 0 }, + { "hist-kvno-diff-svc", KADM5_TL_DATA, KRB5_TL_HIST_KVNO_DIFF_SVC, 0, "Svc hist keys", "Historic keys allowed for service", 0 }, + { NULL, 0, 0, 0, NULL, NULL, 0 } }; struct field_info { @@ -123,12 +125,17 @@ { krb5_error_code ret; char *s; + int aret; + buf[0] = '\0'; ret = krb5_enctype_to_string (context, k->key_data_type[0], &s); - if (ret) - asprintf (&s, "unknown(%d)", k->key_data_type[0]); + if (ret) { + aret = asprintf (&s, "unknown(%d)", k->key_data_type[0]); + if (aret == -1) + return; /* Nothing to do here, we have no way to pass the err */ + } strlcpy(buf, s, buf_len); free(s); @@ -138,22 +145,33 @@ k->key_data_type[0], k->key_data_type[1], &s); - if (ret) - asprintf (&s, "unknown(%d)", k->key_data_type[1]); + if (ret) { + aret = asprintf (&s, "unknown(%d)", k->key_data_type[1]); + if (aret == -1) + return; /* Again, nothing else to do... */ + } strlcat(buf, s, buf_len); free(s); + aret = 0; if (cmp_salt(def_salt, k) == 0) s = strdup(""); else if(k->key_data_length[1] == 0) s = strdup("()"); else - asprintf (&s, "(%.*s)", k->key_data_length[1], - (char *)k->key_data_contents[1]); + aret = asprintf (&s, "(%.*s)", k->key_data_length[1], + (char *)k->key_data_contents[1]); + if (aret == -1 || s == NULL) + return; /* Again, nothing else we can do... */ strlcat(buf, s, buf_len); free(s); - + aret = asprintf (&s, "[%d]", k->key_data_kvno); + if (aret == -1) + return; strlcat(buf, ")", buf_len); + + strlcat(buf, s, buf_len); + free(s); } static void diff --git a/crypto/heimdal/kadmin/init.c b/crypto/heimdal/kadmin/init.c --- a/crypto/heimdal/kadmin/init.c +++ b/crypto/heimdal/kadmin/init.c @@ -37,11 +37,14 @@ #include "kadmin-commands.h" #include +#define CRE_DUP_OK 1 + static kadm5_ret_t create_random_entry(krb5_principal princ, unsigned max_life, unsigned max_rlife, - uint32_t attributes) + uint32_t attributes, + unsigned flags) { kadm5_principal_ent_rec ent; kadm5_ret_t ret; @@ -78,6 +81,8 @@ /* Create the entry with a random password */ ret = kadm5_create_principal(kadm_handle, &ent, mask, password); if(ret) { + if (ret == KADM5_DUP && (flags & CRE_DUP_OK)) + goto out; krb5_warn(context, ret, "create_random_entry(%s): randkey failed", name); goto out; @@ -152,6 +157,10 @@ krb5_warn(context, ret, "hdb_open"); return 0; } + ret = kadm5_log_reinit(kadm_handle, 0); + if (ret) + krb5_err(context, 1, ret, "Failed iprop log initialization"); + kadm5_log_end(kadm_handle); db->hdb_close(context, db); for(i = 0; i < argc; i++){ krb5_principal princ; @@ -177,7 +186,7 @@ if(ret) return 0; - create_random_entry(princ, max_life, max_rlife, 0); + create_random_entry(princ, max_life, max_rlife, 0, 0); krb5_free_principal(context, princ); if (opt->bare_flag) @@ -198,13 +207,14 @@ KRB5_KDB_DISALLOW_POSTDATED| KRB5_KDB_DISALLOW_RENEWABLE| KRB5_KDB_DISALLOW_PROXIABLE| - KRB5_KDB_REQUIRES_PRE_AUTH); + KRB5_KDB_REQUIRES_PRE_AUTH, + 0); krb5_free_principal(context, princ); /* Create `kadmin/admin' */ krb5_make_principal(context, &princ, realm, "kadmin", "admin", NULL); - create_random_entry(princ, 60*60, 60*60, KRB5_KDB_REQUIRES_PRE_AUTH); + create_random_entry(princ, 60*60, 60*60, KRB5_KDB_REQUIRES_PRE_AUTH, 0); krb5_free_principal(context, princ); /* Create `changepw/kerberos' (for v4 compat) */ @@ -212,7 +222,7 @@ "changepw", "kerberos", NULL); create_random_entry(princ, 60*60, 60*60, KRB5_KDB_DISALLOW_TGT_BASED| - KRB5_KDB_PWCHANGE_SERVICE); + KRB5_KDB_PWCHANGE_SERVICE, 0); krb5_free_principal(context, princ); @@ -221,17 +231,26 @@ "kadmin", "hprop", NULL); create_random_entry(princ, 60*60, 60*60, KRB5_KDB_REQUIRES_PRE_AUTH| - KRB5_KDB_DISALLOW_TGT_BASED); + KRB5_KDB_DISALLOW_TGT_BASED, 0); krb5_free_principal(context, princ); /* Create `WELLKNOWN/ANONYMOUS' for anonymous as-req */ krb5_make_principal(context, &princ, realm, KRB5_WELLKNOWN_NAME, KRB5_ANON_NAME, NULL); create_random_entry(princ, 60*60, 60*60, - KRB5_KDB_REQUIRES_PRE_AUTH); + KRB5_KDB_REQUIRES_PRE_AUTH, 0); krb5_free_principal(context, princ); + /* Create `WELLKNONW/org.h5l.fast-cookie@WELLKNOWN:ORG.H5L' for FAST cookie */ + krb5_make_principal(context, &princ, KRB5_WELLKNOWN_ORG_H5L_REALM, + KRB5_WELLKNOWN_NAME, "org.h5l.fast-cookie", NULL); + create_random_entry(princ, 60*60, 60*60, + KRB5_KDB_REQUIRES_PRE_AUTH| + KRB5_KDB_DISALLOW_TGT_BASED| + KRB5_KDB_DISALLOW_ALL_TIX, CRE_DUP_OK); + krb5_free_principal(context, princ); + /* Create `default' */ { kadm5_principal_ent_rec ent; diff --git a/crypto/heimdal/kadmin/kadm_conn.c b/crypto/heimdal/kadmin/kadm_conn.c --- a/crypto/heimdal/kadmin/kadm_conn.c +++ b/crypto/heimdal/kadmin/kadm_conn.c @@ -36,6 +36,8 @@ #include #endif +extern int daemon_child; + struct kadm_port { char *port; unsigned short def_port; @@ -189,7 +191,8 @@ pgrp = getpid(); - if(setpgid(0, pgrp) < 0) + /* systemd may cause setpgid to fail with EPERM */ + if(setpgid(0, pgrp) < 0 && errno != EPERM) err(1, "setpgid"); signal(SIGTERM, terminate); @@ -261,6 +264,7 @@ if(tmp == NULL) { krb5_warnx(contextp, "failed to reallocate %lu bytes", (unsigned long)(num_socks + i) * sizeof(*socks)); + freeaddrinfo(ai); continue; } socks = tmp; @@ -291,5 +295,8 @@ if(num_socks == 0) krb5_errx(contextp, 1, "no sockets to listen to - exiting"); + roken_detach_finish(NULL, daemon_child); + wait_for_connection(contextp, socks, num_socks); + free(socks); } diff --git a/crypto/heimdal/kadmin/kadmin-commands.in b/crypto/heimdal/kadmin/kadmin-commands.in --- a/crypto/heimdal/kadmin/kadmin-commands.in +++ b/crypto/heimdal/kadmin/kadmin-commands.in @@ -76,6 +76,12 @@ type = "flag" help = "decrypt keys" } + option = { + long = "format" + short = "f" + type = "string" + help = "dump format, mit or heimdal (default: heimdal)" + } argument = "[dump-file]" min_args = "0" max_args = "1" @@ -174,11 +180,31 @@ argument = "time" help = "password expiration time" } + option = { + long = "hist-kvno-diff-clnt" + type = "integer" + argument = "kvno diff" + help = "historic keys allowed for client" + default = "-1" + } + option = { + long = "hist-kvno-diff-svc" + type = "integer" + argument = "kvno diff" + help = "historic keys allowed for service" + default = "-1" + } option = { long = "use-defaults" type = "flag" help = "use default values" } + option = { + long = "policy" + type = "string" + argument = "policy" + help = "policy name" + } argument = "principal..." min_args = "1" help = "Adds a principal to the database." @@ -210,6 +236,11 @@ type = "string" help = "DES key in hex" } + option = { + long = "keepold" + type = "flag" + help = "keep old keys/password" + } argument = "principal..." min_args = "1" help = "Changes the password of one or more principals matching the expressions." @@ -249,6 +280,12 @@ type = "string" help = "keytab to use" } + option = { + long = "random-key" + short = "r" + type = "flag" + help = "set random key" + } argument = "principal..." min_args = "1" help = "Extracts the keys of all principals matching the expressions, and stores them in a keytab." @@ -353,6 +390,26 @@ argument = "subject dn" help = "aliases" } + option = { + long = "policy" + type = "string" + argument = "policy" + help = "policy name" + } + option = { + long = "hist-kvno-diff-clnt" + type = "integer" + argument = "kvno diff" + help = "historic keys allowed for client" + default = "-1" + } + option = { + long = "hist-kvno-diff-svc" + type = "integer" + argument = "kvno diff" + help = "historic keys allowed for service" + default = "-1" + } argument = "principal" min_args = "1" max_args = "1" @@ -414,6 +471,22 @@ max_args = "1" help = "Check the realm (if not given, the default realm) for configuration errors." } +command = { + name = "lock" + function = "lock" + argument = "" + min_args = "0" + max_args = "0" + help = "Lock the database for writing (use with care)." +} +command = { + name = "unlock" + function = "unlock" + argument = "" + min_args = "0" + max_args = "0" + help = "Unlock the database." +} command = { name = "help" name = "?" diff --git a/crypto/heimdal/kadmin/kadmin-version.rc b/crypto/heimdal/kadmin/kadmin-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kadmin/kadmin-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Kerberos Administration Tool" +#define RC_FILE_ORIG_0409 "kadmin.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kadmin/kadmin.1 b/crypto/heimdal/kadmin/kadmin.1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kadmin/kadmin.1 @@ -0,0 +1,368 @@ +.\" Copyright (c) 2000 - 2007 Kungliga Tekniska Högskolan +.\" (Royal Institute of Technology, Stockholm, Sweden). +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" 3. Neither the name of the Institute nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd Feb 22, 2007 +.Dt KADMIN 1 +.Os HEIMDAL +.Sh NAME +.Nm kadmin +.Nd Kerberos administration utility +.Sh SYNOPSIS +.Nm +.Bk -words +.Op Fl p Ar string \*(Ba Fl Fl principal= Ns Ar string +.Op Fl K Ar string \*(Ba Fl Fl keytab= Ns Ar string +.Op Fl c Ar file \*(Ba Fl Fl config-file= Ns Ar file +.Op Fl k Ar file \*(Ba Fl Fl key-file= Ns Ar file +.Op Fl r Ar realm \*(Ba Fl Fl realm= Ns Ar realm +.Op Fl a Ar host \*(Ba Fl Fl admin-server= Ns Ar host +.Op Fl s Ar port number \*(Ba Fl Fl server-port= Ns Ar port number +.Op Fl l | Fl Fl local +.Op Fl h | Fl Fl help +.Op Fl v | Fl Fl version +.Op Ar command +.Ek +.Sh DESCRIPTION +The +.Nm +program is used to make modifications to the Kerberos database, either remotely via the +.Xr kadmind 8 +daemon, or locally (with the +.Fl l +option). +.Pp +Supported options: +.Bl -tag -width Ds +.It Fl p Ar string , Fl Fl principal= Ns Ar string +principal to authenticate as +.It Fl K Ar string , Fl Fl keytab= Ns Ar string +keytab for authentication principal +.It Fl c Ar file , Fl Fl config-file= Ns Ar file +location of config file +.It Fl k Ar file , Fl Fl key-file= Ns Ar file +location of master key file +.It Fl r Ar realm , Fl Fl realm= Ns Ar realm +realm to use +.It Fl a Ar host , Fl Fl admin-server= Ns Ar host +server to contact +.It Fl s Ar port number , Fl Fl server-port= Ns Ar port number +port to use +.It Fl l , Fl Fl local +local admin mode +.El +.Pp +If no +.Ar command +is given on the command line, +.Nm +will prompt for commands to process. Some of the commands that take +one or more principals as argument +.Ns ( Nm delete , +.Nm ext_keytab , +.Nm get , +.Nm modify , +and +.Nm passwd ) +will accept a glob style wildcard, and perform the operation on all +matching principals. +.Pp +Commands include: +.\" not using a list here, since groff apparently gets confused +.\" with nested Xo/Xc +.Pp +.Nm add +.Op Fl r | Fl Fl random-key +.Op Fl Fl random-password +.Op Fl p Ar string \*(Ba Fl Fl password= Ns Ar string +.Op Fl Fl key= Ns Ar string +.Op Fl Fl max-ticket-life= Ns Ar lifetime +.Op Fl Fl max-renewable-life= Ns Ar lifetime +.Op Fl Fl attributes= Ns Ar attributes +.Op Fl Fl expiration-time= Ns Ar time +.Op Fl Fl pw-expiration-time= Ns Ar time +.Op Fl Fl policy= Ns Ar policy-name +.Ar principal... +.Bd -ragged -offset indent +Adds a new principal to the database. The options not passed on the +command line will be promped for. +The only policy supported by Heimdal servers is +.Ql default . +.Ed +.Pp +.Nm add_enctype +.Op Fl r | Fl Fl random-key +.Ar principal enctypes... +.Pp +.Bd -ragged -offset indent +Adds a new encryption type to the principal, only random key are +supported. +.Ed +.Pp +.Nm delete +.Ar principal... +.Bd -ragged -offset indent +Removes a principal. +.Ed +.Pp +.Nm del_enctype +.Ar principal enctypes... +.Bd -ragged -offset indent +Removes some enctypes from a principal; this can be useful if the +service belonging to the principal is known to not handle certain +enctypes. +.Ed +.Pp +.Nm ext_keytab +.Oo Fl k Ar string \*(Ba Xo +.Fl Fl keytab= Ns Ar string +.Xc +.Oc +.Ar principal... +.Bd -ragged -offset indent +Creates a keytab with the keys of the specified principals. Requires +get-keys rights, otherwise the principal's keys are changed and saved in +the keytab. +.Ed +.Pp +.Nm get +.Op Fl l | Fl Fl long +.Op Fl s | Fl Fl short +.Op Fl t | Fl Fl terse +.Op Fl o Ar string | Fl Fl column-info= Ns Ar string +.Ar principal... +.Bd -ragged -offset indent +Lists the matching principals, short prints the result as a table, +while long format produces a more verbose output. Which columns to +print can be selected with the +.Fl o +option. The argument is a comma separated list of column names +optionally appended with an equal sign +.Pq Sq = +and a column header. Which columns are printed by default differ +slightly between short and long output. +.Pp +The default terse output format is similar to +.Fl s o Ar principal= , +just printing the names of matched principals. +.Pp +Possible column names include: +.Li principal , +.Li princ_expire_time , +.Li pw_expiration , +.Li last_pwd_change , +.Li max_life , +.Li max_rlife , +.Li mod_time , +.Li mod_name , +.Li attributes , +.Li kvno , +.Li mkvno , +.Li last_success , +.Li last_failed , +.Li fail_auth_count , +.Li policy , +and +.Li keytypes . +.Ed +.Pp +.Nm modify +.Oo Fl a Ar attributes \*(Ba Xo +.Fl Fl attributes= Ns Ar attributes +.Xc +.Oc +.Op Fl Fl max-ticket-life= Ns Ar lifetime +.Op Fl Fl max-renewable-life= Ns Ar lifetime +.Op Fl Fl expiration-time= Ns Ar time +.Op Fl Fl pw-expiration-time= Ns Ar time +.Op Fl Fl kvno= Ns Ar number +.Op Fl Fl policy= Ns Ar policy-name +.Ar principal... +.Bd -ragged -offset indent +Modifies certain attributes of a principal. If run without command +line options, you will be prompted. With command line options, it will +only change the ones specified. +.Pp +Only policy supported by Heimdal is +.Ql default . +.Pp +Possible attributes are: +.Li new-princ , +.Li support-desmd5 , +.Li pwchange-service , +.Li disallow-svr , +.Li requires-pw-change , +.Li requires-hw-auth , +.Li requires-pre-auth , +.Li disallow-all-tix , +.Li disallow-dup-skey , +.Li disallow-proxiable , +.Li disallow-renewable , +.Li disallow-tgt-based , +.Li disallow-forwardable , +.Li disallow-postdated +.Pp +Attributes may be negated with a "-", e.g., +.Pp +kadmin -l modify -a -disallow-proxiable user +.Ed +.Pp +.Nm passwd +.Op Fl Fl keepold +.Op Fl r | Fl Fl random-key +.Op Fl Fl random-password +.Oo Fl p Ar string \*(Ba Xo +.Fl Fl password= Ns Ar string +.Xc +.Oc +.Op Fl Fl key= Ns Ar string +.Ar principal... +.Bd -ragged -offset indent +Changes the password of an existing principal. +.Ed +.Pp +.Nm verify-password-quality +.Ar principal +.Ar password +.Bd -ragged -offset indent +Run the password quality check function locally. +You can run this on the host that is configured to run the kadmind +process to verify that your configuration file is correct. +The verification is done locally, if kadmin is run in remote mode, +no rpc call is done to the server. NOTE: if the environment has +verify-password-quality configured to use a back-end that stores +password history (such as heimdal-history), running +verify-quality-password will cause an update to the password +database meaning that merely verifying the quality of the password +using verify-quality-password invalidates the use of that +principal/password in the future. +.Ed +.Pp +.Nm privileges +.Bd -ragged -offset indent +Lists the operations you are allowed to perform. These include +.Li add , +.Li add_enctype , +.Li change-password , +.Li delete , +.Li del_enctype , +.Li get , +.Li get-keys , +.Li list , +and +.Li modify . +.Ed +.Pp +.Nm rename +.Ar from to +.Bd -ragged -offset indent +Renames a principal. This is normally transparent, but since keys are +salted with the principal name, they will have a non-standard salt, +and clients which are unable to cope with this will fail. Kerberos 4 +suffers from this. +.Ed +.Pp +.Nm check +.Op Ar realm +.Pp +.Bd -ragged -offset indent +Check database for strange configurations on important principals. If +no realm is given, the default realm is used. +.Ed +.Pp +When running in local mode, the following commands can also be used: +.Pp +.Nm dump +.Op Fl d | Fl Fl decrypt +.Op Fl f Ns Ar format | Fl Fl format= Ns Ar format +.Op Ar dump-file +.Bd -ragged -offset indent +Writes the database in +.Dq machine readable text +form to the specified file, or standard out. If the database is +encrypted, the dump will also have encrypted keys, unless +.Fl Fl decrypt +is used. If +.Fl Fl format=MIT +is used then the dump will be in MIT format. Otherwise it will be in +Heimdal format. +.Ed +.Pp +.Nm init +.Op Fl Fl realm-max-ticket-life= Ns Ar string +.Op Fl Fl realm-max-renewable-life= Ns Ar string +.Ar realm +.Bd -ragged -offset indent +Initializes the Kerberos database with entries for a new realm. It's +possible to have more than one realm served by one server. +.Ed +.Pp +.Nm load +.Ar file +.Bd -ragged -offset indent +Reads a previously dumped database, and re-creates that database from +scratch. +.Ed +.Pp +.Nm merge +.Ar file +.Bd -ragged -offset indent +Similar to +.Nm load +but just modifies the database with the entries in the dump file. +.Ed +.Pp +.Nm stash +.Oo Fl e Ar enctype \*(Ba Xo +.Fl Fl enctype= Ns Ar enctype +.Xc +.Oc +.Oo Fl k Ar keyfile \*(Ba Xo +.Fl Fl key-file= Ns Ar keyfile +.Xc +.Oc +.Op Fl Fl convert-file +.Op Fl Fl master-key-fd= Ns Ar fd +.Bd -ragged -offset indent +Writes the Kerberos master key to a file used by the KDC. +.Ed +.\".Sh ENVIRONMENT +.\".Sh FILES +.\".Sh EXAMPLES +.\".Sh DIAGNOSTICS +.Sh SEE ALSO +.Xr kadmind 8 , +.Xr kdc 8 +.\".Sh STANDARDS +.\".Sh HISTORY +.\".Sh AUTHORS +.\".Sh BUGS diff --git a/crypto/heimdal/kadmin/kadmin.8 b/crypto/heimdal/kadmin/kadmin.8 deleted file mode 100644 --- a/crypto/heimdal/kadmin/kadmin.8 +++ /dev/null @@ -1,347 +0,0 @@ -.\" Copyright (c) 2000 - 2007 Kungliga Tekniska Högskolan -.\" (Royal Institute of Technology, Stockholm, Sweden). -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" -.\" 3. Neither the name of the Institute nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" $Id$ -.\" -.Dd Feb 22, 2007 -.Dt KADMIN 8 -.Os HEIMDAL -.Sh NAME -.Nm kadmin -.Nd Kerberos administration utility -.Sh SYNOPSIS -.Nm -.Bk -words -.Op Fl p Ar string \*(Ba Fl Fl principal= Ns Ar string -.Op Fl K Ar string \*(Ba Fl Fl keytab= Ns Ar string -.Op Fl c Ar file \*(Ba Fl Fl config-file= Ns Ar file -.Op Fl k Ar file \*(Ba Fl Fl key-file= Ns Ar file -.Op Fl r Ar realm \*(Ba Fl Fl realm= Ns Ar realm -.Op Fl a Ar host \*(Ba Fl Fl admin-server= Ns Ar host -.Op Fl s Ar port number \*(Ba Fl Fl server-port= Ns Ar port number -.Op Fl l | Fl Fl local -.Op Fl h | Fl Fl help -.Op Fl v | Fl Fl version -.Op Ar command -.Ek -.Sh DESCRIPTION -The -.Nm -program is used to make modifications to the Kerberos database, either remotely via the -.Xr kadmind 8 -daemon, or locally (with the -.Fl l -option). -.Pp -Supported options: -.Bl -tag -width Ds -.It Fl p Ar string , Fl Fl principal= Ns Ar string -principal to authenticate as -.It Fl K Ar string , Fl Fl keytab= Ns Ar string -keytab for authentication principal -.It Fl c Ar file , Fl Fl config-file= Ns Ar file -location of config file -.It Fl k Ar file , Fl Fl key-file= Ns Ar file -location of master key file -.It Fl r Ar realm , Fl Fl realm= Ns Ar realm -realm to use -.It Fl a Ar host , Fl Fl admin-server= Ns Ar host -server to contact -.It Fl s Ar port number , Fl Fl server-port= Ns Ar port number -port to use -.It Fl l , Fl Fl local -local admin mode -.El -.Pp -If no -.Ar command -is given on the command line, -.Nm -will prompt for commands to process. Some of the commands that take -one or more principals as argument -.Ns ( Nm delete , -.Nm ext_keytab , -.Nm get , -.Nm modify , -and -.Nm passwd ) -will accept a glob style wildcard, and perform the operation on all -matching principals. -.Pp -Commands include: -.\" not using a list here, since groff apparently gets confused -.\" with nested Xo/Xc -.Pp -.Nm add -.Op Fl r | Fl Fl random-key -.Op Fl Fl random-password -.Op Fl p Ar string \*(Ba Fl Fl password= Ns Ar string -.Op Fl Fl key= Ns Ar string -.Op Fl Fl max-ticket-life= Ns Ar lifetime -.Op Fl Fl max-renewable-life= Ns Ar lifetime -.Op Fl Fl attributes= Ns Ar attributes -.Op Fl Fl expiration-time= Ns Ar time -.Op Fl Fl pw-expiration-time= Ns Ar time -.Ar principal... -.Bd -ragged -offset indent -Adds a new principal to the database. The options not passed on the -command line will be promped for. -.Ed -.Pp -.Nm add_enctype -.Op Fl r | Fl Fl random-key -.Ar principal enctypes... -.Pp -.Bd -ragged -offset indent -Adds a new encryption type to the principal, only random key are -supported. -.Ed -.Pp -.Nm delete -.Ar principal... -.Bd -ragged -offset indent -Removes a principal. -.Ed -.Pp -.Nm del_enctype -.Ar principal enctypes... -.Bd -ragged -offset indent -Removes some enctypes from a principal; this can be useful if the -service belonging to the principal is known to not handle certain -enctypes. -.Ed -.Pp -.Nm ext_keytab -.Oo Fl k Ar string \*(Ba Xo -.Fl Fl keytab= Ns Ar string -.Xc -.Oc -.Ar principal... -.Bd -ragged -offset indent -Creates a keytab with the keys of the specified principals. -.Ed -.Pp -.Nm get -.Op Fl l | Fl Fl long -.Op Fl s | Fl Fl short -.Op Fl t | Fl Fl terse -.Op Fl o Ar string | Fl Fl column-info= Ns Ar string -.Ar principal... -.Bd -ragged -offset indent -Lists the matching principals, short prints the result as a table, -while long format produces a more verbose output. Which columns to -print can be selected with the -.Fl o -option. The argument is a comma separated list of column names -optionally appended with an equal sign -.Pq Sq = -and a column header. Which columns are printed by default differ -slightly between short and long output. -.Pp -The default terse output format is similar to -.Fl s o Ar principal= , -just printing the names of matched principals. -.Pp -Possible column names include: -.Li principal , -.Li princ_expire_time , -.Li pw_expiration , -.Li last_pwd_change , -.Li max_life , -.Li max_rlife , -.Li mod_time , -.Li mod_name , -.Li attributes , -.Li kvno , -.Li mkvno , -.Li last_success , -.Li last_failed , -.Li fail_auth_count , -.Li policy , -and -.Li keytypes . -.Ed -.Pp -.Nm modify -.Oo Fl a Ar attributes \*(Ba Xo -.Fl Fl attributes= Ns Ar attributes -.Xc -.Oc -.Op Fl Fl max-ticket-life= Ns Ar lifetime -.Op Fl Fl max-renewable-life= Ns Ar lifetime -.Op Fl Fl expiration-time= Ns Ar time -.Op Fl Fl pw-expiration-time= Ns Ar time -.Op Fl Fl kvno= Ns Ar number -.Ar principal... -.Bd -ragged -offset indent -Modifies certain attributes of a principal. If run without command -line options, you will be prompted. With command line options, it will -only change the ones specified. -.Pp -Possible attributes are: -.Li new-princ , -.Li support-desmd5 , -.Li pwchange-service , -.Li disallow-svr , -.Li requires-pw-change , -.Li requires-hw-auth , -.Li requires-pre-auth , -.Li disallow-all-tix , -.Li disallow-dup-skey , -.Li disallow-proxiable , -.Li disallow-renewable , -.Li disallow-tgt-based , -.Li disallow-forwardable , -.Li disallow-postdated -.Pp -Attributes may be negated with a "-", e.g., -.Pp -kadmin -l modify -a -disallow-proxiable user -.Ed -.Pp -.Nm passwd -.Op Fl r | Fl Fl random-key -.Op Fl Fl random-password -.Oo Fl p Ar string \*(Ba Xo -.Fl Fl password= Ns Ar string -.Xc -.Oc -.Op Fl Fl key= Ns Ar string -.Ar principal... -.Bd -ragged -offset indent -Changes the password of an existing principal. -.Ed -.Pp -.Nm password-quality -.Ar principal -.Ar password -.Bd -ragged -offset indent -Run the password quality check function locally. -You can run this on the host that is configured to run the kadmind -process to verify that your configuration file is correct. -The verification is done locally, if kadmin is run in remote mode, -no rpc call is done to the server. -.Ed -.Pp -.Nm privileges -.Bd -ragged -offset indent -Lists the operations you are allowed to perform. These include -.Li add , -.Li add_enctype , -.Li change-password , -.Li delete , -.Li del_enctype , -.Li get , -.Li list , -and -.Li modify . -.Ed -.Pp -.Nm rename -.Ar from to -.Bd -ragged -offset indent -Renames a principal. This is normally transparent, but since keys are -salted with the principal name, they will have a non-standard salt, -and clients which are unable to cope with this will fail. Kerberos 4 -suffers from this. -.Ed -.Pp -.Nm check -.Op Ar realm -.Pp -.Bd -ragged -offset indent -Check database for strange configurations on important principals. If -no realm is given, the default realm is used. -.Ed -.Pp -When running in local mode, the following commands can also be used: -.Pp -.Nm dump -.Op Fl d | Fl Fl decrypt -.Op Ar dump-file -.Bd -ragged -offset indent -Writes the database in -.Dq human readable -form to the specified file, or standard out. If the database is -encrypted, the dump will also have encrypted keys, unless -.Fl Fl decrypt -is used. -.Ed -.Pp -.Nm init -.Op Fl Fl realm-max-ticket-life= Ns Ar string -.Op Fl Fl realm-max-renewable-life= Ns Ar string -.Ar realm -.Bd -ragged -offset indent -Initializes the Kerberos database with entries for a new realm. It's -possible to have more than one realm served by one server. -.Ed -.Pp -.Nm load -.Ar file -.Bd -ragged -offset indent -Reads a previously dumped database, and re-creates that database from -scratch. -.Ed -.Pp -.Nm merge -.Ar file -.Bd -ragged -offset indent -Similar to -.Nm load -but just modifies the database with the entries in the dump file. -.Ed -.Pp -.Nm stash -.Oo Fl e Ar enctype \*(Ba Xo -.Fl Fl enctype= Ns Ar enctype -.Xc -.Oc -.Oo Fl k Ar keyfile \*(Ba Xo -.Fl Fl key-file= Ns Ar keyfile -.Xc -.Oc -.Op Fl Fl convert-file -.Op Fl Fl master-key-fd= Ns Ar fd -.Bd -ragged -offset indent -Writes the Kerberos master key to a file used by the KDC. -.Ed -.\".Sh ENVIRONMENT -.\".Sh FILES -.\".Sh EXAMPLES -.\".Sh DIAGNOSTICS -.Sh SEE ALSO -.Xr kadmind 8 , -.Xr kdc 8 -.\".Sh STANDARDS -.\".Sh HISTORY -.\".Sh AUTHORS -.\".Sh BUGS diff --git a/crypto/heimdal/kadmin/kadmin.c b/crypto/heimdal/kadmin/kadmin.c --- a/crypto/heimdal/kadmin/kadmin.c +++ b/crypto/heimdal/kadmin/kadmin.c @@ -112,6 +112,18 @@ return 0; } +int +lock(void *opt, int argc, char **argv) +{ + return kadm5_lock(kadm_handle); +} + +int +unlock(void *opt, int argc, char **argv) +{ + return kadm5_unlock(kadm_handle); +} + static void usage(int ret) { @@ -147,6 +159,7 @@ kadm5_config_params conf; int optidx = 0; int exit_status = 0; + int aret; setprogname(argv[0]); @@ -169,8 +182,8 @@ argv += optidx; if (config_file == NULL) { - asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); - if (config_file == NULL) + aret = asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); + if (aret == -1) errx(1, "out of memory"); } @@ -265,7 +278,7 @@ if (argc != 0) { ret = sl_command (commands, argc, argv); if(ret == -1) - krb5_warnx (context, "unrecognized command: %s", argv[0]); + sl_did_you_mean(commands, argv[0]); else if (ret == -2) ret = 0; if(ret != 0) diff --git a/crypto/heimdal/kadmin/kadmin.cat1 b/crypto/heimdal/kadmin/kadmin.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kadmin/kadmin.cat1 @@ -0,0 +1,192 @@ +KADMIN(1) BSD General Commands Manual KADMIN(1) + +NAME + kadmin -- Kerberos administration utility + +SYNOPSIS + kadmin [-p string | --principal=string] [-K string | --keytab=string] + [-c file | --config-file=file] [-k file | --key-file=file] + [-r realm | --realm=realm] [-a host | --admin-server=host] + [-s port number | --server-port=port number] [-l | --local] + [-h | --help] [-v | --version] [command] + +DESCRIPTION + The kadmin program is used to make modifications to the Kerberos data- + base, either remotely via the kadmind(8) daemon, or locally (with the -l + option). + + Supported options: + + -p string, --principal=string + principal to authenticate as + + -K string, --keytab=string + keytab for authentication principal + + -c file, --config-file=file + location of config file + + -k file, --key-file=file + location of master key file + + -r realm, --realm=realm + realm to use + + -a host, --admin-server=host + server to contact + + -s port number, --server-port=port number + port to use + + -l, --local + local admin mode + + If no command is given on the command line, kadmin will prompt for com- + mands to process. Some of the commands that take one or more principals + as argument (delete, ext_keytab, get, modify, and passwd) will accept a + glob style wildcard, and perform the operation on all matching princi- + pals. + + Commands include: + + add [-r | --random-key] [--random-password] [-p string | + --password=string] [--key=string] [--max-ticket-life=lifetime] + [--max-renewable-life=lifetime] [--attributes=attributes] + [--expiration-time=time] [--pw-expiration-time=time] + [--policy=policy-name] principal... + + Adds a new principal to the database. The options not passed on the + command line will be promped for. The only policy supported by + Heimdal servers is `default'. + + add_enctype [-r | --random-key] principal enctypes... + + Adds a new encryption type to the principal, only random key are + supported. + + delete principal... + + Removes a principal. + + del_enctype principal enctypes... + + Removes some enctypes from a principal; this can be useful if the + service belonging to the principal is known to not handle certain + enctypes. + + ext_keytab [-k string | --keytab=string] principal... + + Creates a keytab with the keys of the specified principals. Re- + quires get-keys rights, otherwise the principal's keys are changed + and saved in the keytab. + + get [-l | --long] [-s | --short] [-t | --terse] [-o string | + --column-info=string] principal... + + Lists the matching principals, short prints the result as a table, + while long format produces a more verbose output. Which columns to + print can be selected with the -o option. The argument is a comma + separated list of column names optionally appended with an equal + sign (`=') and a column header. Which columns are printed by de- + fault differ slightly between short and long output. + + The default terse output format is similar to -s -o principal=, + just printing the names of matched principals. + + Possible column names include: principal, princ_expire_time, + pw_expiration, last_pwd_change, max_life, max_rlife, mod_time, + mod_name, attributes, kvno, mkvno, last_success, last_failed, + fail_auth_count, policy, and keytypes. + + modify [-a attributes | --attributes=attributes] + [--max-ticket-life=lifetime] [--max-renewable-life=lifetime] + [--expiration-time=time] [--pw-expiration-time=time] [--kvno=number] + [--policy=policy-name] principal... + + Modifies certain attributes of a principal. If run without command + line options, you will be prompted. With command line options, it + will only change the ones specified. + + Only policy supported by Heimdal is `default'. + + Possible attributes are: new-princ, support-desmd5, + pwchange-service, disallow-svr, requires-pw-change, + requires-hw-auth, requires-pre-auth, disallow-all-tix, + disallow-dup-skey, disallow-proxiable, disallow-renewable, + disallow-tgt-based, disallow-forwardable, disallow-postdated + + Attributes may be negated with a "-", e.g., + + kadmin -l modify -a -disallow-proxiable user + + passwd [--keepold] [-r | --random-key] [--random-password] [-p string | + --password=string] [--key=string] principal... + + Changes the password of an existing principal. + + verify-password-quality principal password + + Run the password quality check function locally. You can run this + on the host that is configured to run the kadmind process to verify + that your configuration file is correct. The verification is done + locally, if kadmin is run in remote mode, no rpc call is done to + the server. NOTE: if the environment has verify-password-quality + configured to use a back-end that stores password history (such as + heimdal-history), running verify-quality-password will cause an up- + date to the password database meaning that merely verifying the + quality of the password using verify-quality-password invalidates + the use of that principal/password in the future. + + privileges + + Lists the operations you are allowed to perform. These include add, + add_enctype, change-password, delete, del_enctype, get, get-keys, + list, and modify. + + rename from to + + Renames a principal. This is normally transparent, but since keys + are salted with the principal name, they will have a non-standard + salt, and clients which are unable to cope with this will fail. + Kerberos 4 suffers from this. + + check [realm] + + Check database for strange configurations on important principals. + If no realm is given, the default realm is used. + + When running in local mode, the following commands can also be used: + + dump [-d | --decrypt] [-fformat | --format=format] [dump-file] + + Writes the database in "machine readable text" form to the speci- + fied file, or standard out. If the database is encrypted, the dump + will also have encrypted keys, unless --decrypt is used. If + --format=MIT is used then the dump will be in MIT format. Other- + wise it will be in Heimdal format. + + init [--realm-max-ticket-life=string] [--realm-max-renewable-life=string] + realm + + Initializes the Kerberos database with entries for a new realm. + It's possible to have more than one realm served by one server. + + load file + + Reads a previously dumped database, and re-creates that database + from scratch. + + merge file + + Similar to load but just modifies the database with the entries in + the dump file. + + stash [-e enctype | --enctype=enctype] [-k keyfile | --key-file=keyfile] + [--convert-file] [--master-key-fd=fd] + + Writes the Kerberos master key to a file used by the KDC. + +SEE ALSO + kadmind(8), kdc(8) + +HEIMDAL Feb 22, 2007 HEIMDAL diff --git a/crypto/heimdal/kadmin/kadmin_locl.h b/crypto/heimdal/kadmin/kadmin_locl.h --- a/crypto/heimdal/kadmin/kadmin_locl.h +++ b/crypto/heimdal/kadmin/kadmin_locl.h @@ -109,6 +109,9 @@ int parse_attributes (const char *, krb5_flags *, int *, int); int edit_attributes (const char *, krb5_flags *, int *, int); +int parse_policy (const char *, char **, int *, int); +int edit_policy (const char *, char **, int *, int); + void time_t2str(time_t, char *, size_t, int); int str2time_t (const char *, time_t *); int parse_timet (const char *, krb5_timestamp *, int *, int); @@ -124,7 +127,7 @@ void set_defaults(kadm5_principal_ent_t, int *, kadm5_principal_ent_t, int); int set_entry(krb5_context, kadm5_principal_ent_t, int *, const char *, const char *, const char *, - const char *, const char *); + const char *, const char *, const char *); int foreach_principal(const char *, int (*)(krb5_principal, void*), const char *, void *); diff --git a/crypto/heimdal/kadmin/kadmind-version.rc b/crypto/heimdal/kadmin/kadmind-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kadmin/kadmind-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Kerberos Administration Server" +#define RC_FILE_ORIG_0409 "kadmind.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kadmin/kadmind.8 b/crypto/heimdal/kadmin/kadmind.8 --- a/crypto/heimdal/kadmin/kadmind.8 +++ b/crypto/heimdal/kadmin/kadmind.8 @@ -107,7 +107,9 @@ .It get .It -all +get-keys +.It +all (everything except get-keys) .El .Pp And the optional @@ -147,14 +149,15 @@ .D1 Nm Fl Fl ports Ns Li "=\*[q]+ 4711\*[q] &" .Pp This acl file will grant Joe all rights, and allow Mallory to view and -add host principals. +add host principals, as well as extract host principal keys (e.g., into +keytabs). .Bd -literal -offset indent joe/admin@EXAMPLE.COM all -mallory/admin@EXAMPLE.COM add,get host/*@EXAMPLE.COM +mallory/admin@EXAMPLE.COM add,get-keys host/*@EXAMPLE.COM .Ed .\".Sh DIAGNOSTICS .Sh SEE ALSO .Xr kpasswd 1 , -.Xr kadmin 8 , +.Xr kadmin 1 , .Xr kdc 8 , .Xr kpasswdd 8 diff --git a/crypto/heimdal/kadmin/kadmind.c b/crypto/heimdal/kadmin/kadmind.c --- a/crypto/heimdal/kadmin/kadmind.c +++ b/crypto/heimdal/kadmin/kadmind.c @@ -37,7 +37,7 @@ static char *check_function = NULL; static getarg_strings policy_libraries = { 0, NULL }; static char *config_file; -static char sHDB[] = "HDB:"; +static char sHDB[] = "HDBGET:"; static char *keytab_str = sHDB; static int help_flag; static int version_flag; @@ -45,6 +45,9 @@ static char *port_str; char *realm; +static int detach_from_console = -1; +int daemon_child = -1; + static struct getargs args[] = { { "config-file", 'c', arg_string, &config_file, @@ -68,6 +71,14 @@ { "debug", 'd', arg_flag, &debug_flag, "enable debugging", NULL }, + { + "detach", 0 , arg_flag, &detach_from_console, + "detach from console", NULL + }, + { + "daemon-child", 0 , arg_integer, &daemon_child, + "private argument, do not use", NULL + }, { "ports", 'p', arg_string, &port_str, "ports to listen to", "port" }, { "help", 'h', arg_flag, &help_flag, NULL, NULL }, @@ -98,10 +109,6 @@ setprogname(argv[0]); - ret = krb5_init_context(&context); - if (ret) - errx (1, "krb5_init_context failed: %d", ret); - if (getarg(args, num_args, argc, argv, &optidx)) { warnx("error at argument `%s'", argv[optidx]); usage(1); @@ -115,6 +122,13 @@ exit(0); } + if (detach_from_console > 0 && daemon_child == -1) + roken_detach_prep(argc, argv, "--daemon-child"); + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + argc -= optidx; #ifndef __clang_analyzer__ argv += optidx; @@ -123,8 +137,10 @@ usage(1); if (config_file == NULL) { - asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); - if (config_file == NULL) + int aret; + + aret = asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); + if (aret == -1) errx(1, "out of memory"); } @@ -144,7 +160,7 @@ if (ret) krb5_err(context, 1, ret, "krb5_set_warn_dest"); - ret = krb5_kt_register(context, &hdb_kt_ops); + ret = krb5_kt_register(context, &hdb_get_kt_ops); if(ret) krb5_err(context, 1, ret, "krb5_kt_register"); @@ -175,7 +191,6 @@ mini_inetd(debug_port, &sfd); } else { #ifdef _WIN32 - pidfile(NULL); start_server(context, port_str); #else struct sockaddr_storage __ss; @@ -189,7 +204,6 @@ if(roken_getsockname(STDIN_FILENO, sa, &sa_size) < 0 && rk_SOCK_ERRNO == ENOTSOCK) { - pidfile(NULL); start_server(context, port_str); } #endif /* _WIN32 */ diff --git a/crypto/heimdal/kadmin/kadmind.cat8 b/crypto/heimdal/kadmin/kadmind.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kadmin/kadmind.cat8 @@ -0,0 +1,87 @@ +KADMIND(8) BSD System Manager's Manual KADMIND(8) + +NAME + kadmind -- server for administrative access to Kerberos database + +SYNOPSIS + kadmind [-c file | --config-file=file] [-k file | --key-file=file] + [--keytab=keytab] [-r realm | --realm=realm] [-d | --debug] [-p + port | --ports=port] + +DESCRIPTION + kadmind listens for requests for changes to the Kerberos database and + performs these, subject to permissions. When starting, if stdin is a + socket it assumes that it has been started by inetd(8), otherwise it be- + haves as a daemon, forking processes for each new connection. The --debug + option causes kadmind to accept exactly one connection, which is useful + for debugging. + + The kpasswdd(8) daemon is responsible for the Kerberos 5 password chang- + ing protocol (used by kpasswd(1)). + + This daemon should only be run on the master server, and not on any + slaves. + + Principals are always allowed to change their own password and list their + own principal. Apart from that, doing any operation requires permission + explicitly added in the ACL file /var/heimdal/kadmind.acl. The format of + this file is: + + principal rights [principal-pattern] + + Where rights is any (comma separated) combination of: + +o change-password or cpw + +o list + +o delete + +o modify + +o add + +o get + +o get-keys + +o all (everything except get-keys) + + And the optional principal-pattern restricts the rights to operations on + principals that match the glob-style pattern. + + Supported options: + + -c file, --config-file=file + location of config file + + -k file, --key-file=file + location of master key file + + --keytab=keytab + what keytab to use + + -r realm, --realm=realm + realm to use + + -d, --debug + enable debugging + + -p port, --ports=port + ports to listen to. By default, if run as a daemon, it listens to + port 749, but you can add any number of ports with this option. + The port string is a whitespace separated list of port specifica- + tions, with the special string "+" representing the default port. + +FILES + /var/heimdal/kadmind.acl + +EXAMPLES + This will cause kadmind to listen to port 4711 in addition to any com- + piled in defaults: + + kadmind --ports="+ 4711" & + + This acl file will grant Joe all rights, and allow Mallory to view and + add host principals, as well as extract host principal keys (e.g., into + keytabs). + + joe/admin@EXAMPLE.COM all + mallory/admin@EXAMPLE.COM add,get-keys host/*@EXAMPLE.COM + +SEE ALSO + kpasswd(1), kadmin(1), kdc(8), kpasswdd(8) + +HEIMDAL December 8, 2004 HEIMDAL diff --git a/crypto/heimdal/kadmin/load.c b/crypto/heimdal/kadmin/load.c --- a/crypto/heimdal/kadmin/load.c +++ b/crypto/heimdal/kadmin/load.c @@ -31,6 +31,8 @@ * SUCH DAMAGE. */ +#include + #include "kadmin_locl.h" #include "kadmin-commands.h" #include @@ -308,9 +310,11 @@ return 0; } +/* On error modify strp to point to the problem element */ static int -parse_extensions(char *str, HDB_extensions **e) +parse_extensions(char **strp, HDB_extensions **e) { + char *str = *strp; char *p; int ret; @@ -328,18 +332,21 @@ void *d; len = strlen(p); - d = malloc(len); + d = emalloc(len); len = hex_decode(p, d, len); if (len < 0) { free(d); + *strp = p; return -1; } ret = decode_HDB_extension(d, len, &ext, NULL); free(d); - if (ret) + if (ret) { + *strp = p; return -1; + } d = realloc((*e)->val, ((*e)->len + 1) * sizeof((*e)->val[0])); if (d == NULL) abort(); @@ -353,6 +360,45 @@ return 0; } +/* XXX: Principal names with '\n' cannot be dumped or loaded */ +static int +my_fgetln(FILE *f, char **bufp, size_t *szp, size_t *lenp) +{ + size_t len; + size_t sz = *szp; + char *buf = *bufp; + char *p, *n; + + if (!buf) { + buf = malloc(sz ? sz : 8192); + if (!buf) + return ENOMEM; + if (!sz) + sz = 8192; + } + + len = 0; + while ((p = fgets(&buf[len], sz-len, f)) != NULL) { + len += strlen(&buf[len]); + if (buf[len-1] == '\n') + break; + if (feof(f)) + break; + if (sz > SIZE_MAX/2 || + (n = realloc(buf, sz += 1 + (sz >> 1))) == NULL) { + free(buf); + *bufp = NULL; + *szp = 0; + *lenp = 0; + return ENOMEM; + } + buf = n; + } + *bufp = buf; + *szp = sz; + *lenp = len; + return 0; /* *len == 0 || no EOL -> EOF */ +} /* * Parse the dump file in `filename' and create the database (merging @@ -362,50 +408,64 @@ static int doit(const char *filename, int mergep) { - krb5_error_code ret; + krb5_error_code ret = 0; + krb5_error_code ret2 = 0; FILE *f; - char s[8192]; /* XXX should fix this properly */ + char *line = NULL; + size_t linesz = 0; + size_t linelen = 0; char *p; - int line; + int lineno; int flags = O_RDWR; struct entry e; hdb_entry_ex ent; HDB *db = _kadm5_s_get_db(kadm_handle); f = fopen(filename, "r"); - if(f == NULL){ + if (f == NULL) { krb5_warn(context, errno, "fopen(%s)", filename); return 1; } - ret = kadm5_log_truncate (kadm_handle); + /* + * We don't have a version number in the dump, so we don't know which iprop + * log entries to keep, if any. We throw the log away. + * + * We could merge the ipropd-master/slave dump/load here as an option, in + * which case we would first load the dump. + * + * If we're merging, first recover unconfirmed records in the existing log. + */ + if (mergep) + ret = kadm5_log_init(kadm_handle); + if (ret == 0) + ret = kadm5_log_reinit(kadm_handle, 0); if (ret) { fclose (f); - krb5_warn(context, ret, "kadm5_log_truncate"); + krb5_warn(context, ret, "kadm5_log_reinit"); return 1; } - if(!mergep) + if (!mergep) flags |= O_CREAT | O_TRUNC; ret = db->hdb_open(context, db, flags, 0600); - if(ret){ + if (ret){ krb5_warn(context, ret, "hdb_open"); fclose(f); return 1; } - line = 0; - ret = 0; - while(fgets(s, sizeof(s), f) != NULL) { - line++; - - p = s; + (void) db->hdb_set_sync(context, db, 0); + for (lineno = 1; + (ret2 = my_fgetln(f, &line, &linesz, &linelen)) == 0 && linelen > 0; + ++lineno) { + p = line; while (isspace((unsigned char)*p)) p++; e.principal = p; - for(p = s; *p; p++){ - if(*p == '\\') + for (p = line; *p; p++){ + if (*p == '\\') /* Support '\n' escapes??? */ p++; - else if(isspace((unsigned char)*p)) { + else if (isspace((unsigned char)*p)) { *p = 0; break; } @@ -446,96 +506,117 @@ skip_next(p); memset(&ent, 0, sizeof(ent)); - ret = krb5_parse_name(context, e.principal, &ent.entry.principal); - if(ret) { + ret2 = krb5_parse_name(context, e.principal, &ent.entry.principal); + if (ret2) { const char *msg = krb5_get_error_message(context, ret); fprintf(stderr, "%s:%d:%s (%s)\n", - filename, line, msg, e.principal); + filename, lineno, msg, e.principal); krb5_free_error_message(context, msg); + ret = 1; continue; } if (parse_keys(&ent.entry, e.key)) { fprintf (stderr, "%s:%d:error parsing keys (%s)\n", - filename, line, e.key); + filename, lineno, e.key); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_event(&ent.entry.created_by, e.created) == -1) { fprintf (stderr, "%s:%d:error parsing created event (%s)\n", - filename, line, e.created); + filename, lineno, e.created); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_event_alloc (&ent.entry.modified_by, e.modified) == -1) { fprintf (stderr, "%s:%d:error parsing event (%s)\n", - filename, line, e.modified); + filename, lineno, e.modified); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_time_string_alloc (&ent.entry.valid_start, e.valid_start) == -1) { fprintf (stderr, "%s:%d:error parsing time (%s)\n", - filename, line, e.valid_start); + filename, lineno, e.valid_start); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_time_string_alloc (&ent.entry.valid_end, e.valid_end) == -1) { fprintf (stderr, "%s:%d:error parsing time (%s)\n", - filename, line, e.valid_end); + filename, lineno, e.valid_end); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_time_string_alloc (&ent.entry.pw_end, e.pw_end) == -1) { fprintf (stderr, "%s:%d:error parsing time (%s)\n", - filename, line, e.pw_end); + filename, lineno, e.pw_end); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_integer_alloc (&ent.entry.max_life, e.max_life) == -1) { fprintf (stderr, "%s:%d:error parsing lifetime (%s)\n", - filename, line, e.max_life); + filename, lineno, e.max_life); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_integer_alloc (&ent.entry.max_renew, e.max_renew) == -1) { fprintf (stderr, "%s:%d:error parsing lifetime (%s)\n", - filename, line, e.max_renew); + filename, lineno, e.max_renew); hdb_free_entry (context, &ent); + ret = 1; continue; } if (parse_hdbflags2int (&ent.entry.flags, e.flags) != 1) { fprintf (stderr, "%s:%d:error parsing flags (%s)\n", - filename, line, e.flags); + filename, lineno, e.flags); hdb_free_entry (context, &ent); + ret = 1; continue; } if(parse_generation(e.generation, &ent.entry.generation) == -1) { fprintf (stderr, "%s:%d:error parsing generation (%s)\n", - filename, line, e.generation); + filename, lineno, e.generation); hdb_free_entry (context, &ent); + ret = 1; continue; } - if(parse_extensions(e.extensions, &ent.entry.extensions) == -1) { + if (parse_extensions(&e.extensions, &ent.entry.extensions) == -1) { fprintf (stderr, "%s:%d:error parsing extension (%s)\n", - filename, line, e.extensions); + filename, lineno, e.extensions); hdb_free_entry (context, &ent); + ret = 1; continue; } - ret = db->hdb_store(context, db, HDB_F_REPLACE, &ent); + ret2 = db->hdb_store(context, db, HDB_F_REPLACE, &ent); hdb_free_entry (context, &ent); - if (ret) { - krb5_warn(context, ret, "db_store"); + if (ret2) { + krb5_warn(context, ret2, "db_store"); break; } } - db->hdb_close(context, db); + free(line); + if (ret2) + ret = ret2; + ret2 = db->hdb_set_sync(context, db, 1); + if (ret2) + krb5_err(context, 1, ret, "failed to sync the HDB"); + (void) kadm5_log_end(kadm_handle); + ret2 = db->hdb_close(context, db); + if (ret2) + ret = ret2; fclose(f); return ret != 0; } diff --git a/crypto/heimdal/kadmin/mod.c b/crypto/heimdal/kadmin/mod.c --- a/crypto/heimdal/kadmin/mod.c +++ b/crypto/heimdal/kadmin/mod.c @@ -41,7 +41,7 @@ tl = ecalloc(1, sizeof(*tl)); tl->tl_data_next = NULL; - tl->tl_data_type = KRB5_TL_EXTENSION; + tl->tl_data_type = type; tl->tl_data_length = data->length; tl->tl_data_contents = data->data; @@ -192,6 +192,37 @@ add_tl(princ, KRB5_TL_EXTENSION, &buf); } +static void +add_kvno_diff(krb5_context contextp, kadm5_principal_ent_rec *princ, + int is_svc_diff, krb5_kvno kvno_diff) +{ + krb5_error_code ret; + HDB_extension ext; + krb5_data buf; + size_t size = 0; + + if (kvno_diff < 0) + return; + if (kvno_diff > 2048) + kvno_diff = 2048; + + if (is_svc_diff) { + ext.data.element = choice_HDB_extension_data_hist_kvno_diff_svc; + ext.data.u.hist_kvno_diff_svc = (unsigned int)kvno_diff; + } else { + ext.data.element = choice_HDB_extension_data_hist_kvno_diff_clnt; + ext.data.u.hist_kvno_diff_clnt = (unsigned int)kvno_diff; + } + ASN1_MALLOC_ENCODE(HDB_extension, buf.data, buf.length, + &ext, &size, ret); + if (ret) + abort(); + if (buf.length != size) + abort(); + + add_tl(princ, KRB5_TL_EXTENSION, &buf); +} + static int do_mod_entry(krb5_principal principal, void *data) { @@ -214,16 +245,20 @@ e->expiration_time_string || e->pw_expiration_time_string || e->attributes_string || + e->policy_string || e->kvno_integer != -1 || e->constrained_delegation_strings.num_strings || e->alias_strings.num_strings || - e->pkinit_acl_strings.num_strings) { + e->pkinit_acl_strings.num_strings || + e->hist_kvno_diff_clnt_integer != -1 || + e->hist_kvno_diff_svc_integer != -1) { ret = set_entry(context, &princ, &mask, e->max_ticket_life_string, e->max_renewable_life_string, e->expiration_time_string, e->pw_expiration_time_string, - e->attributes_string); + e->attributes_string, + e->policy_string); if(e->kvno_integer != -1) { princ.kvno = e->kvno_integer; mask |= KADM5_KVNO; @@ -241,7 +276,14 @@ add_pkinit_acl(context, &princ, &e->pkinit_acl_strings); mask |= KADM5_TL_DATA; } - + if (e->hist_kvno_diff_clnt_integer != -1) { + add_kvno_diff(context, &princ, 0, e->hist_kvno_diff_clnt_integer); + mask |= KADM5_TL_DATA; + } + if (e->hist_kvno_diff_svc_integer != -1) { + add_kvno_diff(context, &princ, 1, e->hist_kvno_diff_svc_integer); + mask |= KADM5_TL_DATA; + } } else ret = edit_entry(&princ, &mask, NULL, 0); if(ret == 0) { diff --git a/crypto/heimdal/kadmin/random_password.c b/crypto/heimdal/kadmin/random_password.c --- a/crypto/heimdal/kadmin/random_password.c +++ b/crypto/heimdal/kadmin/random_password.c @@ -68,7 +68,8 @@ "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 2, "@$%&*()-+=:,/<>1234567890", 1); strlcpy(pw, pass, len); - memset(pass, 0, strlen(pass)); + len = strlen(pass); + memset_s(pass, len, 0, len); free(pass); #endif } @@ -155,7 +156,7 @@ } } (*pw)[len] = '\0'; - memset(rbuf, 0, sizeof(rbuf)); + memset_s(rbuf, sizeof(rbuf), 0, sizeof(rbuf)); free(classes); } #endif diff --git a/crypto/heimdal/kadmin/rpc.c b/crypto/heimdal/kadmin/rpc.c --- a/crypto/heimdal/kadmin/rpc.c +++ b/crypto/heimdal/kadmin/rpc.c @@ -33,13 +33,9 @@ #include "kadmin_locl.h" -#include -//#include -//#include - -static gss_OID_desc krb5_mechanism = -{9, (void *)(uintptr_t) "\x2a\x86\x48\x86\xf7\x12\x01\x02\x02"}; -#define GSS_KRB5_MECHANISM (&krb5_mechanism) +#include +#include +#include #define CHECK(x) \ do { \ @@ -467,7 +463,7 @@ ent->max_life = flag; CHECK(krb5_ret_uint32(sp, &flag)); if (flag == 0) - ret_principal_xdr(contextp, sp, &ent->mod_name); + CHECK(ret_principal_xdr(contextp, sp, &ent->mod_name)); CHECK(krb5_ret_uint32(sp, &flag)); ent->mod_date = flag; CHECK(krb5_ret_uint32(sp, &flag)); @@ -935,7 +931,7 @@ INSIST(gctx.ctx == NULL); gctx.inprogress = 1; - /* FALL THOUGH */ + /* FALLTHROUGH */ case RPG_CONTINUE_INIT: { gss_name_t src_name = GSS_C_NO_NAME; krb5_data in; @@ -1101,7 +1097,7 @@ dcontext = contextp; - sp = krb5_storage_from_fd(sock); + sp = krb5_storage_from_socket(sock); INSIST(sp != NULL); process_stream(contextp, buf, len, sp); diff --git a/crypto/heimdal/kadmin/server.c b/crypto/heimdal/kadmin/server.c --- a/crypto/heimdal/kadmin/server.c +++ b/crypto/heimdal/kadmin/server.c @@ -34,40 +34,41 @@ #include "kadmin_locl.h" #include +static kadm5_ret_t check_aliases(kadm5_server_context *, + kadm5_principal_ent_rec *, + kadm5_principal_ent_rec *); + static kadm5_ret_t kadmind_dispatch(void *kadm_handlep, krb5_boolean initial, krb5_data *in, krb5_data *out) { - kadm5_ret_t ret = 0; - kadm5_ret_t ret_sp = 0; + kadm5_ret_t ret; int32_t cmd, mask, tmp; kadm5_server_context *contextp = kadm_handlep; char client[128], name[128], name2[128]; const char *op = ""; krb5_principal princ, princ2; - kadm5_principal_ent_rec ent; - char *password, *expression; + kadm5_principal_ent_rec ent, ent_prev; + char *password = NULL, *expression; krb5_keyblock *new_keys; + krb5_key_salt_tuple *ks_tuple = NULL; + krb5_boolean keepold = FALSE; + int n_ks_tuple = 0; int n_keys; char **princs; int n_princs; - krb5_storage *rsp = NULL; /* response goes here */ - krb5_storage *sp = NULL; + int keys_ok = 0; + krb5_storage *sp; + int len; - memset(&ent, 0, sizeof(ent)); - krb5_data_zero(out); - ret = krb5_unparse_name_fixed(contextp->context, contextp->caller, + krb5_unparse_name_fixed(contextp->context, contextp->caller, client, sizeof(client)); sp = krb5_storage_from_data(in); if (sp == NULL) krb5_errx(contextp->context, 1, "out of memory"); - ret = krb5_ret_int32(sp, &cmd); - if (ret) { - krb5_storage_free(sp); - goto fail; - } + krb5_ret_int32(sp, &cmd); switch(cmd){ case kadm_get:{ op = "GET"; @@ -80,20 +81,56 @@ goto fail; } mask |= KADM5_PRINCIPAL; - ret = krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); + krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); krb5_warnx(contextp->context, "%s: %s %s", client, op, name); - if (ret == 0) - ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_GET, princ); - if(ret){ + + /* If the caller doesn't have KADM5_PRIV_GET, we're done. */ + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_GET, princ); + if (ret) { krb5_free_principal(contextp->context, princ); goto fail; - } + } + + /* Then check to see if it is ok to return keys */ + if ((mask & KADM5_KEY_DATA) != 0) { + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_GET_KEYS, + princ); + if (ret == 0) { + keys_ok = 1; + } else if ((mask == (KADM5_PRINCIPAL|KADM5_KEY_DATA)) || + (mask == (KADM5_PRINCIPAL|KADM5_KVNO|KADM5_KEY_DATA))) { + /* + * Requests for keys will get bogus keys, which is useful if + * the client just wants to see what (kvno, enctype)s the + * principal has keys for, but terrible if the client wants to + * write the keys into a keytab or modify the principal and + * write the bogus keys back to the server. + * + * We use a heuristic to detect which case we're handling here. + * If the client only asks for the flags in the above + * condition, then it's very likely a kadmin ext_keytab, + * add_enctype, or other request that should not see bogus + * keys. We deny them. + * + * The kadmin get command can be coaxed into making a request + * with the same mask. But the default long and terse output + * modes request other things too, so in all likelihood this + * heuristic will not hurt any kadmin get uses. + */ + krb5_free_principal(contextp->context, princ); + goto fail; + } + } + ret = kadm5_get_principal(kadm_handlep, princ, &ent, mask); krb5_storage_free(sp); sp = krb5_storage_emem(); krb5_store_int32(sp, ret); - if(ret == 0){ - kadm5_store_principal_ent(sp, &ent); + if (ret == 0){ + if (keys_ok) + kadm5_store_principal_ent(sp, &ent); + else + kadm5_store_principal_ent_nokeys(sp, &ent); kadm5_free_principal_ent(kadm_handlep, &ent); } krb5_free_principal(contextp->context, princ); @@ -104,14 +141,19 @@ ret = krb5_ret_principal(sp, &princ); if(ret) goto fail; - ret = krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); + krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); krb5_warnx(contextp->context, "%s: %s %s", client, op, name); - if (ret == 0) - ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_DELETE, princ); + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_DELETE, princ); if(ret){ krb5_free_principal(contextp->context, princ); goto fail; } + + /* + * There's no need to check that the caller has permission to + * delete the victim principal's aliases. + */ + ret = kadm5_delete_principal(kadm_handlep, princ); krb5_free_principal(contextp->context, princ); krb5_storage_free(sp); @@ -126,31 +168,37 @@ goto fail; ret = krb5_ret_int32(sp, &mask); if(ret){ - kadm5_free_principal_ent(contextp->context, &ent); + kadm5_free_principal_ent(kadm_handlep, &ent); goto fail; } ret = krb5_ret_string(sp, &password); if(ret){ - kadm5_free_principal_ent(contextp->context, &ent); + kadm5_free_principal_ent(kadm_handlep, &ent); goto fail; } - ret = krb5_unparse_name_fixed(contextp->context, ent.principal, + krb5_unparse_name_fixed(contextp->context, ent.principal, name, sizeof(name)); krb5_warnx(contextp->context, "%s: %s %s", client, op, name); - if (ret == 0) - ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_ADD, + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_ADD, ent.principal); if(ret){ - kadm5_free_principal_ent(contextp->context, &ent); - memset(password, 0, strlen(password)); - free(password); + kadm5_free_principal_ent(kadm_handlep, &ent); goto fail; } + if ((mask & KADM5_TL_DATA)) { + /* + * Also check that the caller can create the aliases, if the + * new principal has any. + */ + ret = check_aliases(contextp, &ent, NULL); + if (ret) { + kadm5_free_principal_ent(kadm_handlep, &ent); + goto fail; + } + } ret = kadm5_create_principal(kadm_handlep, &ent, mask, password); kadm5_free_principal_ent(kadm_handlep, &ent); - memset(password, 0, strlen(password)); - free(password); krb5_storage_free(sp); sp = krb5_storage_emem(); krb5_store_int32(sp, ret); @@ -166,16 +214,34 @@ kadm5_free_principal_ent(contextp, &ent); goto fail; } - ret = krb5_unparse_name_fixed(contextp->context, ent.principal, + krb5_unparse_name_fixed(contextp->context, ent.principal, name, sizeof(name)); krb5_warnx(contextp->context, "%s: %s %s", client, op, name); - if (ret == 0) - ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_MODIFY, + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_MODIFY, ent.principal); if(ret){ kadm5_free_principal_ent(contextp, &ent); goto fail; } + if ((mask & KADM5_TL_DATA)) { + /* + * Also check that the caller can create aliases that are in + * the new entry but not the old one. There's no need to + * check that the caller can delete aliases it wants to + * drop. See also handling of rename. + */ + ret = kadm5_get_principal(kadm_handlep, ent.principal, &ent_prev, mask); + if (ret) { + kadm5_free_principal_ent(contextp, &ent); + goto fail; + } + ret = check_aliases(contextp, &ent, &ent_prev); + kadm5_free_principal_ent(contextp, &ent_prev); + if (ret) { + kadm5_free_principal_ent(contextp, &ent); + goto fail; + } + } ret = kadm5_modify_principal(kadm_handlep, &ent, mask); kadm5_free_principal_ent(kadm_handlep, &ent); krb5_storage_free(sp); @@ -193,18 +259,29 @@ krb5_free_principal(contextp->context, princ); goto fail; } - ret = krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); - if (ret == 0) - ret = krb5_unparse_name_fixed(contextp->context, princ2, name2, sizeof(name2)); + krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); + krb5_unparse_name_fixed(contextp->context, princ2, + name2, sizeof(name2)); krb5_warnx(contextp->context, "%s: %s %s -> %s", client, op, name, name2); - if (ret == 0) - ret = _kadm5_acl_check_permission(contextp, + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_ADD, - princ2) - || _kadm5_acl_check_permission(contextp, - KADM5_PRIV_DELETE, - princ); + princ2); + if (ret == 0) { + /* + * Also require modify for the principal. For backwards + * compatibility, allow delete permission on the old name to + * cure lack of modify permission on the old name. + */ + ret = _kadm5_acl_check_permission(contextp, + KADM5_PRIV_MODIFY, + princ); + if (ret) { + ret = _kadm5_acl_check_permission(contextp, + KADM5_PRIV_DELETE, + princ); + } + } if(ret){ krb5_free_principal(contextp->context, princ); krb5_free_principal(contextp->context, princ2); @@ -221,14 +298,19 @@ case kadm_chpass:{ op = "CHPASS"; ret = krb5_ret_principal(sp, &princ); - if(ret) + if (ret) goto fail; ret = krb5_ret_string(sp, &password); - if(ret){ + if (ret) { krb5_free_principal(contextp->context, princ); goto fail; } - ret = krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); + ret = krb5_ret_int32(sp, &keepold); + if (ret && ret != HEIM_ERR_EOF) { + krb5_free_principal(contextp->context, princ); + goto fail; + } + krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); krb5_warnx(contextp->context, "%s: %s %s", client, op, name); /* @@ -241,39 +323,34 @@ * c) the user is on the CPW ACL. */ - if (ret == 0) { - if (krb5_config_get_bool_default(contextp->context, NULL, TRUE, - "kadmin", "allow_self_change_password", NULL) - && initial - && krb5_principal_compare (contextp->context, contextp->caller, - princ)) - { - krb5_data pwd_data; - const char *pwd_reason; - - pwd_data.data = password; - pwd_data.length = strlen(password); - - pwd_reason = kadm5_check_password_quality (contextp->context, - princ, &pwd_data); - if (pwd_reason != NULL) - ret = KADM5_PASS_Q_DICT; - else - ret = 0; - } else - ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_CPW, princ); - } + if (krb5_config_get_bool_default(contextp->context, NULL, TRUE, + "kadmin", "allow_self_change_password", NULL) + && initial + && krb5_principal_compare (contextp->context, contextp->caller, + princ)) + { + krb5_data pwd_data; + const char *pwd_reason; + + pwd_data.data = password; + pwd_data.length = strlen(password); + + pwd_reason = kadm5_check_password_quality (contextp->context, + princ, &pwd_data); + if (pwd_reason != NULL) + ret = KADM5_PASS_Q_DICT; + else + ret = 0; + } else + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_CPW, princ); if(ret) { krb5_free_principal(contextp->context, princ); - memset(password, 0, strlen(password)); - free(password); goto fail; } - ret = kadm5_chpass_principal(kadm_handlep, princ, password); + ret = kadm5_chpass_principal_3(kadm_handlep, princ, keepold, 0, NULL, + password); krb5_free_principal(contextp->context, princ); - memset(password, 0, strlen(password)); - free(password); krb5_storage_free(sp); sp = krb5_storage_emem(); krb5_store_int32(sp, ret); @@ -293,6 +370,11 @@ krb5_free_principal(contextp->context, princ); goto fail; } + ret = krb5_ret_int32(sp, &keepold); + if (ret && ret != HEIM_ERR_EOF) { + krb5_free_principal(contextp->context, princ); + goto fail; + } /* n_key_data will be squeezed into an int16_t below. */ if (n_key_data < 0 || n_key_data >= 1 << 16 || (size_t)n_key_data > UINT_MAX/sizeof(*key_data)) { @@ -320,7 +402,7 @@ } } - ret = krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); + krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); krb5_warnx(contextp->context, "%s: %s %s", client, op, name); /* @@ -328,8 +410,7 @@ * this it to force password quality check on the user. */ - if (ret == 0) - ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_CPW, princ); + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_CPW, princ); if(ret) { int16_t dummy = n_key_data; @@ -338,8 +419,8 @@ krb5_free_principal(contextp->context, princ); goto fail; } - ret = kadm5_chpass_principal_with_key(kadm_handlep, princ, - n_key_data, key_data); + ret = kadm5_chpass_principal_with_key_3(kadm_handlep, princ, keepold, + n_key_data, key_data); { int16_t dummy = n_key_data; kadm5_free_key_data (contextp, &dummy, key_data); @@ -356,7 +437,7 @@ ret = krb5_ret_principal(sp, &princ); if(ret) goto fail; - ret = krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); + krb5_unparse_name_fixed(contextp->context, princ, name, sizeof(name)); krb5_warnx(contextp->context, "%s: %s %s", client, op, name); /* * The change is allowed if at least one of: @@ -364,21 +445,68 @@ * b) the user is on the CPW ACL. */ - if (ret == 0) { - if (initial - && krb5_principal_compare (contextp->context, contextp->caller, + if (initial + && krb5_principal_compare (contextp->context, contextp->caller, princ)) - ret = 0; - else - ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_CPW, princ); - } + ret = 0; + else + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_CPW, princ); + if(ret) { krb5_free_principal(contextp->context, princ); goto fail; } - ret = kadm5_randkey_principal(kadm_handlep, princ, - &new_keys, &n_keys); + + /* + * See comments in kadm5_c_randkey_principal() regarding the + * protocol. + */ + ret = krb5_ret_int32(sp, &keepold); + if (ret != 0 && ret != HEIM_ERR_EOF) { + krb5_free_principal(contextp->context, princ); + goto fail; + } + + ret = krb5_ret_int32(sp, &n_ks_tuple); + if (ret != 0 && ret != HEIM_ERR_EOF) { + krb5_free_principal(contextp->context, princ); + goto fail; + } else if (ret == 0) { + size_t i; + + if (n_ks_tuple < 0) { + ret = EOVERFLOW; + krb5_free_principal(contextp->context, princ); + goto fail; + } + + if ((ks_tuple = calloc(n_ks_tuple, sizeof (*ks_tuple))) == NULL) { + ret = errno; + krb5_free_principal(contextp->context, princ); + goto fail; + } + + for (i = 0; i < n_ks_tuple; i++) { + ret = krb5_ret_int32(sp, &ks_tuple[i].ks_enctype); + if (ret != 0) { + krb5_free_principal(contextp->context, princ); + free(ks_tuple); + goto fail; + } + ret = krb5_ret_int32(sp, &ks_tuple[i].ks_salttype); + if (ret != 0) { + krb5_free_principal(contextp->context, princ); + free(ks_tuple); + goto fail; + } + } + } + ret = kadm5_randkey_principal_3(kadm_handlep, princ, keepold, + n_ks_tuple, ks_tuple, &new_keys, + &n_keys); krb5_free_principal(contextp->context, princ); + free(ks_tuple); + krb5_storage_free(sp); sp = krb5_storage_emem(); krb5_store_int32(sp, ret); @@ -386,7 +514,8 @@ int i; krb5_store_int32(sp, n_keys); for(i = 0; i < n_keys; i++){ - krb5_store_keyblock(sp, new_keys[i]); + if (ret == 0) + ret = krb5_store_keyblock(sp, new_keys[i]); krb5_free_keyblock_contents(contextp->context, &new_keys[i]); } free(new_keys); @@ -428,11 +557,9 @@ krb5_store_int32(sp, ret); if(ret == 0){ int i; - if ((ret = krb5_store_int32(sp, n_princs))) - goto fail; + krb5_store_int32(sp, n_princs); for(i = 0; i < n_princs; i++) - if ((ret = krb5_store_string(sp, princs[i]))) - goto fail; + krb5_store_string(sp, princs[i]); kadm5_free_name_list(kadm_handlep, princs, &n_princs); } break; @@ -444,16 +571,140 @@ krb5_store_int32(sp, KADM5_FAILURE); break; } + if (password != NULL) { + len = strlen(password); + memset_s(password, len, 0, len); + free(password); + } krb5_storage_to_data(sp, out); krb5_storage_free(sp); return 0; fail: + if (password != NULL) { + len = strlen(password); + memset_s(password, len, 0, len); + free(password); + } krb5_warn(contextp->context, ret, "%s", op); krb5_storage_seek(sp, 0, SEEK_SET); krb5_store_int32(sp, ret); krb5_storage_to_data(sp, out); krb5_storage_free(sp); - return ret; + return 0; +} + +struct iter_aliases_ctx { + HDB_Ext_Aliases aliases; + krb5_tl_data *tl; + int alias_idx; + int done; +}; + +static kadm5_ret_t +iter_aliases(kadm5_principal_ent_rec *from, + struct iter_aliases_ctx *ctx, + krb5_principal *out) +{ + HDB_extension ext; + kadm5_ret_t ret; + size_t size; + + *out = NULL; + + if (ctx->done > 0) + return 0; + + if (ctx->done == 0) { + if (ctx->alias_idx < ctx->aliases.aliases.len) { + *out = &ctx->aliases.aliases.val[ctx->alias_idx++]; + return 0; + } + /* Out of aliases in this TL, step to next TL */ + ctx->tl = ctx->tl->tl_data_next; + } else if (ctx->done < 0) { + /* Setup iteration context */ + memset(ctx, 0, sizeof(*ctx)); + ctx->done = 0; + ctx->aliases.aliases.val = NULL; + ctx->aliases.aliases.len = 0; + ctx->tl = from->tl_data; + } + + free_HDB_Ext_Aliases(&ctx->aliases); + ctx->alias_idx = 0; + + /* Find TL with aliases */ + for (; ctx->tl != NULL; ctx->tl = ctx->tl->tl_data_next) { + if (ctx->tl->tl_data_type != KRB5_TL_EXTENSION) + continue; + + ret = decode_HDB_extension(ctx->tl->tl_data_contents, + ctx->tl->tl_data_length, + &ext, &size); + if (ret) + return ret; + if (ext.data.element == choice_HDB_extension_data_aliases && + ext.data.u.aliases.aliases.len > 0) { + ctx->aliases = ext.data.u.aliases; + break; + } + free_HDB_extension(&ext); + } + + if (ctx->tl != NULL && ctx->aliases.aliases.len > 0) { + *out = &ctx->aliases.aliases.val[ctx->alias_idx++]; + return 0; + } + + ctx->done = 1; + return 0; +} + +static kadm5_ret_t +check_aliases(kadm5_server_context *contextp, + kadm5_principal_ent_rec *add_princ, + kadm5_principal_ent_rec *del_princ) +{ + kadm5_ret_t ret; + struct iter_aliases_ctx iter; + struct iter_aliases_ctx iter_del; + krb5_principal new_name, old_name; + int match; + + /* + * Yeah, this is O(N^2). Gathering and sorting all the aliases + * would be a bit of a pain; if we ever have principals with enough + * aliases for this to be a problem, we can fix it then. + */ + for (iter.done = -1; iter.done != 1;) { + match = 0; + ret = iter_aliases(add_princ, &iter, &new_name); + if (ret) + return ret; + if (iter.done == 1) + break; + for (iter_del.done = -1; iter_del.done != 1;) { + ret = iter_aliases(del_princ, &iter_del, &old_name); + if (ret) + return ret; + if (iter_del.done == 1) + break; + if (!krb5_principal_compare(contextp->context, new_name, old_name)) + continue; + free_HDB_Ext_Aliases(&iter_del.aliases); + match = 1; + break; + } + if (match) + continue; + ret = _kadm5_acl_check_permission(contextp, KADM5_PRIV_ADD, new_name); + if (ret) { + free_HDB_Ext_Aliases(&iter.aliases); + return ret; + } + } + + return 0; } static void @@ -473,8 +724,6 @@ ret = krb5_read_priv_message(contextp, ac, &fd, &in); if(ret == HEIM_ERR_EOF) exit(0); - if (in.length == 0) - ret = HEIM_ERR_OPNOTSUPP; if(ret) krb5_err(contextp, 1, ret, "krb5_read_priv_message"); doing_useful_work = 1; @@ -510,7 +759,7 @@ krb5_boolean initial; krb5_auth_context ac = NULL; - unsigned kadm_version; + unsigned kadm_version = 1; kadm5_config_params realm_params; ret = krb5_recvauth_match_version(contextp, &ac, &fd, @@ -538,9 +787,7 @@ ret = krb5_read_priv_message(contextp, ac, &fd, ¶ms); if(ret) krb5_err(contextp, 1, ret, "krb5_read_priv_message"); - ret = _kadm5_unmarshal_params(contextp, ¶ms, &realm_params); - if(ret) - krb5_err(contextp, 1, ret, "Could not read or parse kadm5 parameters"); + _kadm5_unmarshal_params(contextp, ¶ms, &realm_params); } initial = ticket->ticket.flags.initial; diff --git a/crypto/heimdal/kadmin/stash.c b/crypto/heimdal/kadmin/stash.c --- a/crypto/heimdal/kadmin/stash.c +++ b/crypto/heimdal/kadmin/stash.c @@ -41,10 +41,11 @@ int stash(struct stash_options *opt, int argc, char **argv) { - char buf[1024]; + char buf[1024+1]; krb5_error_code ret; krb5_enctype enctype; hdb_master_key mkey; + int aret; if(!local_flag) { krb5_warnx(context, "stash is only available in local (-l) mode"); @@ -58,8 +59,8 @@ } if(opt->key_file_string == NULL) { - asprintf(&opt->key_file_string, "%s/m-key", hdb_db_dir(context)); - if (opt->key_file_string == NULL) + aret = asprintf(&opt->key_file_string, "%s/m-key", hdb_db_dir(context)); + if (aret == -1) errx(1, "out of memory"); } @@ -74,6 +75,7 @@ if (ret) krb5_warn(context, ret, "reading master key from %s", opt->key_file_string); + hdb_free_master_key(context, mkey); return 0; } else { krb5_keyblock key; @@ -84,7 +86,7 @@ salt.saltvalue.length = 0; if(opt->master_key_fd_integer != -1) { ssize_t n; - n = read(opt->master_key_fd_integer, buf, sizeof(buf)); + n = read(opt->master_key_fd_integer, buf, sizeof(buf)-1); if(n == 0) krb5_warnx(context, "end of file reading passphrase"); else if(n < 0) { @@ -97,7 +99,8 @@ random_password (buf, sizeof(buf)); printf("Using random master stash password: %s\n", buf); } else { - if(UI_UTIL_read_pw_string(buf, sizeof(buf), "Master key: ", 1)) { + if(UI_UTIL_read_pw_string(buf, sizeof(buf), "Master key: ", + UI_UTIL_FLAG_VERIFY)) { hdb_free_master_key(context, mkey); return 0; } @@ -111,10 +114,15 @@ } { - char *new, *old; - asprintf(&old, "%s.old", opt->key_file_string); - asprintf(&new, "%s.new", opt->key_file_string); - if(old == NULL || new == NULL) { + char *new = NULL, *old = NULL; + + aret = asprintf(&old, "%s.old", opt->key_file_string); + if (aret == -1) { + ret = ENOMEM; + goto out; + } + aret = asprintf(&new, "%s.new", opt->key_file_string); + if (aret == -1) { ret = ENOMEM; goto out; } diff --git a/crypto/heimdal/kadmin/util.c b/crypto/heimdal/kadmin/util.c --- a/crypto/heimdal/kadmin/util.c +++ b/crypto/heimdal/kadmin/util.c @@ -145,6 +145,61 @@ return 0; } +/* + * try to parse the string `resp' into policy in `attr', also + * setting the `bit' in `mask' if attributes are given and valid. + */ + +#define VALID_POLICY_NAME_CHARS \ + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_" + +int +parse_policy (const char *resp, char **policy, int *mask, int bit) +{ + if (strspn(resp, VALID_POLICY_NAME_CHARS) == strlen(resp) && + *resp != '\0') { + + *policy = strdup(resp); + if (*policy == NULL) { + fprintf (stderr, "Out of memory"); + return -1; + } + if (mask) + *mask |= bit; + return 0; + } else if(*resp == '?') { + print_flags_table (kdb_attrs, stderr); + } else { + fprintf (stderr, "Unable to parse \"%s\"\n", resp); + } + return -1; +} + +/* + * allow the user to edit the attributes in `attr', prompting with `prompt' + */ + +int +edit_policy (const char *prompt, char **policy, int *mask, int bit) +{ + char buf[1024], resp[1024]; + + if (mask && (*mask & bit)) + return 0; + + buf[0] = '\0'; + strlcpy(buf, "default", sizeof (buf)); + for (;;) { + if(get_response("Policy", buf, resp, sizeof(resp)) != 0) + return 1; + if (resp[0] == '\0') + break; + if (parse_policy (resp, policy, mask, bit) == 0) + break; + } + return 0; +} + /* * time_t * the special value 0 means ``never'' @@ -391,6 +446,14 @@ && (default_mask & KADM5_ATTRIBUTES) && !(*mask & KADM5_ATTRIBUTES)) ent->attributes = default_ent->attributes & ~KRB5_KDB_DISALLOW_ALL_TIX; + + if (default_ent + && (default_mask & KADM5_POLICY) + && !(*mask & KADM5_POLICY)) { + ent->policy = strdup(default_ent->policy); + if (ent->policy == NULL) + abort(); + } } int @@ -420,6 +483,10 @@ KADM5_ATTRIBUTES) != 0) return 1; + if(edit_policy ("Policy", &ent->policy, mask, + KADM5_POLICY) != 0) + return 1; + return 0; } @@ -437,7 +504,8 @@ const char *max_renewable_life, const char *expiration, const char *pw_expiration, - const char *attributes) + const char *attributes, + const char *policy) { if (max_ticket_life != NULL) { if (parse_deltat (max_ticket_life, &ent->max_life, @@ -475,6 +543,13 @@ return 1; } } + if (policy != NULL) { + if (parse_policy (policy, &ent->policy, + mask, KADM5_POLICY)) { + krb5_warnx (contextp, "unable to parse `%s'", attributes); + return 1; + } + } return 0; } diff --git a/crypto/heimdal/kcm/Makefile.am b/crypto/heimdal/kcm/Makefile.am --- a/crypto/heimdal/kcm/Makefile.am +++ b/crypto/heimdal/kcm/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_libintl) $(INCLUDE_krb4) $(INCLUDE_hcrypto) -I$(srcdir)/../lib/krb5 +AM_CPPFLAGS += $(INCLUDE_libintl) -I$(srcdir)/../lib/krb5 libexec_PROGRAMS = kcm @@ -17,14 +17,15 @@ glue.c \ headers.h \ kcm_locl.h \ - kcm-protos.h \ log.c \ main.c \ protocol.c \ sessions.c \ renew.c -$(srcdir)/kcm-protos.h: +noinst_HEADERS = $(srcdir)/kcm-protos.h + +$(srcdir)/kcm-protos.h: $(kcm_SOURCES) cd $(srcdir); perl ../cf/make-proto.pl -o kcm-protos.h -q -P comment $(kcm_SOURCES) || rm -f kcm-protos.h $(kcm_OBJECTS): $(srcdir)/kcm-protos.h @@ -33,7 +34,6 @@ LDADD = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_krb4) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/ntlm/libheimntlm.la \ diff --git a/crypto/heimdal/kcm/Makefile.in b/crypto/heimdal/kcm/Makefile.in --- a/crypto/heimdal/kcm/Makefile.in +++ b/crypto/heimdal/kcm/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,7 +20,63 @@ # $Id$ + VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,15 +95,11 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common libexec_PROGRAMS = kcm$(EXEEXT) subdir = kcm ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -59,8 +110,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -73,6 +123,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -92,6 +143,8 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -107,24 +160,60 @@ am__DEPENDENCIES_1 = kcm_DEPENDENCIES = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/ntlm/libheimntlm.la \ $(top_builddir)/lib/ipc/libheim-ipcs.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/acl.Po ./$(DEPDIR)/acquire.Po \ + ./$(DEPDIR)/cache.Po ./$(DEPDIR)/client.Po \ + ./$(DEPDIR)/config.Po ./$(DEPDIR)/connect.Po \ + ./$(DEPDIR)/events.Po ./$(DEPDIR)/glue.Po ./$(DEPDIR)/log.Po \ + ./$(DEPDIR)/main.Po ./$(DEPDIR)/protocol.Po \ + ./$(DEPDIR)/renew.Po ./$(DEPDIR)/sessions.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(kcm_SOURCES) DIST_SOURCES = $(kcm_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/||"`;; \ @@ -146,15 +235,42 @@ 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; }; \ + } man8dir = $(mandir)/man8 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -169,16 +285,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -188,17 +307,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -217,12 +338,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -231,6 +349,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -247,10 +366,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -258,6 +375,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -272,12 +390,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -294,10 +415,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -308,13 +435,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -338,6 +459,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -361,9 +484,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -373,30 +501,38 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_libintl) $(INCLUDE_krb4) \ - $(INCLUDE_hcrypto) -I$(srcdir)/../lib/krb5 +AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_libintl) \ + -I$(srcdir)/../lib/krb5 @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; kcm_SOURCES = \ acl.c \ acquire.c \ @@ -408,17 +544,16 @@ glue.c \ headers.h \ kcm_locl.h \ - kcm-protos.h \ log.c \ main.c \ protocol.c \ sessions.c \ renew.c +noinst_HEADERS = $(srcdir)/kcm-protos.h man_MANS = kcm.8 LDADD = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_krb4) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/ntlm/libheimntlm.la \ @@ -431,7 +566,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -444,15 +579,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kcm/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign kcm/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -464,14 +599,19 @@ $(am__aclocal_m4_deps): install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -492,7 +632,8 @@ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files @@ -505,9 +646,10 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -kcm$(EXEEXT): $(kcm_OBJECTS) $(kcm_DEPENDENCIES) + +kcm$(EXEEXT): $(kcm_OBJECTS) $(kcm_DEPENDENCIES) $(EXTRA_kcm_DEPENDENCIES) @rm -f kcm$(EXEEXT) - $(LINK) $(kcm_OBJECTS) $(kcm_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(kcm_OBJECTS) $(kcm_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -515,40 +657,46 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acl.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connect.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/events.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glue.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renew.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sessions.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acquire.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connect.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/events.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glue.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/protocol.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/renew.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sessions.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -557,11 +705,18 @@ -rm -rf .libs _libs install-man8: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -590,30 +745,17 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -625,15 +767,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -642,24 +780,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -695,7 +837,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-local check: check-am -all-am: Makefile $(PROGRAMS) $(MANS) all-local +all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) all-local installdirs: for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ @@ -710,10 +852,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -731,7 +878,19 @@ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/acl.Po + -rm -f ./$(DEPDIR)/acquire.Po + -rm -f ./$(DEPDIR)/cache.Po + -rm -f ./$(DEPDIR)/client.Po + -rm -f ./$(DEPDIR)/config.Po + -rm -f ./$(DEPDIR)/connect.Po + -rm -f ./$(DEPDIR)/events.Po + -rm -f ./$(DEPDIR)/glue.Po + -rm -f ./$(DEPDIR)/log.Po + -rm -f ./$(DEPDIR)/main.Po + -rm -f ./$(DEPDIR)/protocol.Po + -rm -f ./$(DEPDIR)/renew.Po + -rm -f ./$(DEPDIR)/sessions.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -755,9 +914,8 @@ install-dvi-am: -install-exec-am: install-libexecPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local install-libexecPROGRAMS + install-html: install-html-am install-html-am: @@ -779,7 +937,19 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/acl.Po + -rm -f ./$(DEPDIR)/acquire.Po + -rm -f ./$(DEPDIR)/cache.Po + -rm -f ./$(DEPDIR)/client.Po + -rm -f ./$(DEPDIR)/config.Po + -rm -f ./$(DEPDIR)/connect.Po + -rm -f ./$(DEPDIR)/events.Po + -rm -f ./$(DEPDIR)/glue.Po + -rm -f ./$(DEPDIR)/log.Po + -rm -f ./$(DEPDIR)/main.Po + -rm -f ./$(DEPDIR)/protocol.Po + -rm -f ./$(DEPDIR)/renew.Po + -rm -f ./$(DEPDIR)/sessions.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -801,40 +971,54 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man8 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libexecPROGRAMS clean-libtool ctags \ - dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libexecPROGRAMS \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am \ install-libexecPROGRAMS install-man install-man8 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-hook \ + tags tags-am uninstall uninstall-am uninstall-hook \ uninstall-libexecPROGRAMS uninstall-man uninstall-man8 +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -842,7 +1026,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -887,11 +1071,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -899,6 +1092,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -941,6 +1136,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -954,13 +1162,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -991,7 +1199,7 @@ fi ; \ done -$(srcdir)/kcm-protos.h: +$(srcdir)/kcm-protos.h: $(kcm_SOURCES) cd $(srcdir); perl ../cf/make-proto.pl -o kcm-protos.h -q -P comment $(kcm_SOURCES) || rm -f kcm-protos.h $(kcm_OBJECTS): $(srcdir)/kcm-protos.h diff --git a/crypto/heimdal/kcm/NTMakefile b/crypto/heimdal/kcm/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kcm/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=kcm + +!include ../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/kcm/acquire.c b/crypto/heimdal/kcm/acquire.c --- a/crypto/heimdal/kcm/acquire.c +++ b/crypto/heimdal/kcm/acquire.c @@ -48,7 +48,9 @@ krb5_get_init_creds_opt *opt = NULL; krb5_ccache_data ccdata; char *in_tkt_service = NULL; + const char *estr; + *credp = NULL; memset(&cred, 0, sizeof(cred)); KCM_ASSERT_VALID(ccache); @@ -77,9 +79,11 @@ if (ccache->server != NULL) { ret = krb5_unparse_name(context, ccache->server, &in_tkt_service); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(0, "Failed to unparse service principal name for cache %s: %s", - ccache->name, krb5_get_err_text(context, ret)); - return ret; + ccache->name, estr); + krb5_free_error_message(context, estr); + goto out; } } @@ -114,28 +118,28 @@ } if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(0, "Failed to acquire credentials for cache %s: %s", - ccache->name, krb5_get_err_text(context, ret)); - if (in_tkt_service != NULL) - free(in_tkt_service); + ccache->name, estr); + krb5_free_error_message(context, estr); goto out; } - if (in_tkt_service != NULL) - free(in_tkt_service); - /* Swap them in */ kcm_ccache_remove_creds_internal(context, ccache); ret = kcm_ccache_store_cred_internal(context, ccache, &cred, 0, credp); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(0, "Failed to store credentials for cache %s: %s", - ccache->name, krb5_get_err_text(context, ret)); + ccache->name, estr); + krb5_free_error_message(context, estr); krb5_free_cred_contents(context, &cred); goto out; } out: + free(in_tkt_service); if (opt) krb5_get_init_creds_opt_free(context, opt); diff --git a/crypto/heimdal/kcm/cache.c b/crypto/heimdal/kcm/cache.c --- a/crypto/heimdal/kcm/cache.c +++ b/crypto/heimdal/kcm/cache.c @@ -42,12 +42,15 @@ { unsigned n; char *name; + int ret; HEIMDAL_MUTEX_lock(&ccache_mutex); n = ++ccache_nextid; HEIMDAL_MUTEX_unlock(&ccache_mutex); - asprintf(&name, "%ld:%u", (long)uid, n); + ret = asprintf(&name, "%ld:%u", (long)uid, n); + if (ret == -1) + return NULL; return name; } diff --git a/crypto/heimdal/kcm/client.c b/crypto/heimdal/kcm/client.c --- a/crypto/heimdal/kcm/client.c +++ b/crypto/heimdal/kcm/client.c @@ -43,11 +43,13 @@ kcm_ccache *ccache) { krb5_error_code ret; + const char *estr; ret = kcm_ccache_resolve(context, name, ccache); if (ret) { - kcm_log(1, "Failed to resolve cache %s: %s", - name, krb5_get_err_text(context, ret)); + estr = krb5_get_error_message(context, ret); + kcm_log(1, "Failed to resolve cache %s: %s", name, estr); + krb5_free_error_message(context, estr); return ret; } @@ -67,11 +69,13 @@ { krb5_error_code ret; kcm_ccache ccache; + const char *estr; ret = kcm_ccache_resolve(context, name, &ccache); if (ret) { - kcm_log(1, "Failed to resolve cache %s: %s", - name, krb5_get_err_text(context, ret)); + estr = krb5_get_error_message(context, ret); + kcm_log(1, "Failed to resolve cache %s: %s", name, estr); + krb5_free_error_message(context, estr); return ret; } @@ -92,6 +96,7 @@ { krb5_error_code ret; kcm_ccache ccache; + const char *estr; /* We insist the ccache name starts with UID or UID: */ if (name_constraints != 0) { @@ -127,8 +132,9 @@ if (ret == KRB5_FCC_NOFILE) { ret = kcm_ccache_new(context, name, &ccache); if (ret) { - kcm_log(1, "Failed to initialize cache %s: %s", - name, krb5_get_err_text(context, ret)); + estr = krb5_get_error_message(context, ret); + kcm_log(1, "Failed to initialize cache %s: %s", name, estr); + krb5_free_error_message(context, estr); return ret; } @@ -139,8 +145,9 @@ } else { ret = kcm_zero_ccache_data(context, ccache); if (ret) { - kcm_log(1, "Failed to empty cache %s: %s", - name, krb5_get_err_text(context, ret)); + estr = krb5_get_error_message(context, ret); + kcm_log(1, "Failed to empty cache %s: %s", name, estr); + krb5_free_error_message(context, estr); kcm_release_ccache(context, ccache); return ret; } diff --git a/crypto/heimdal/kcm/config.c b/crypto/heimdal/kcm/config.c --- a/crypto/heimdal/kcm/config.c +++ b/crypto/heimdal/kcm/config.c @@ -44,10 +44,8 @@ static char *max_request_str; /* `max_request' as a string */ -#ifdef SUPPORT_DETACH int detach_from_console = -1; -#define DETACH_IS_DEFAULT FALSE -#endif +int daemon_child = -1; static const char *system_cache_name = NULL; static const char *system_keytab = NULL; @@ -86,22 +84,17 @@ }, { "launchd", 0, arg_flag, &launchd_flag, - "when in use by launchd" + "when in use by launchd", NULL }, -#ifdef SUPPORT_DETACH -#if DETACH_IS_DEFAULT { - "detach", 'D', arg_negative_flag, &detach_from_console, - "don't detach from console" + "detach", 0 , arg_flag, &detach_from_console, + "detach from console", NULL }, -#else { - "detach", 0 , arg_flag, &detach_from_console, - "detach from console" + "daemon-child", 0 , arg_integer, &daemon_child, + "private argument, do not use", NULL }, -#endif -#endif - { "help", 'h', arg_flag, &help_flag }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, { "system-principal", 'k', arg_string, &system_principal, "system principal name", "principal" @@ -116,11 +109,11 @@ }, { "name-constraints", 'n', arg_negative_flag, &name_constraints, - "disable credentials cache name constraints" + "disable credentials cache name constraints", NULL }, { "disallow-getting-krbtgt", 0, arg_flag, &disallow_getting_krbtgt, - "disable fetching krbtgt from the cache" + "disable fetching krbtgt from the cache", NULL }, { "renewable-life", 'r', arg_string, &renew_life, @@ -148,7 +141,7 @@ "user", 'u', arg_string, &system_user, "system cache owner", "user" }, - { "version", 'v', arg_flag, &version_flag } + { "version", 'v', arg_flag, &version_flag, NULL, NULL } }; static int num_args = sizeof(args) / sizeof(args[0]); @@ -277,7 +270,7 @@ renew_life = kcm_system_config_get_string("renew_life"); if (renew_life == NULL) - renew_life = "1 month"; + renew_life = "6 months"; if (renew_life != NULL) { ccache->renew_life = parse_time(renew_life, "s"); @@ -328,13 +321,13 @@ kcm_configure(int argc, char **argv) { krb5_error_code ret; - int optind = 0; + int optidx = 0; const char *p; - while(getarg(args, num_args, argc, argv, &optind)) - warnx("error at argument `%s'", argv[optind]); + while (getarg(args, num_args, argc, argv, &optidx)) + warnx("error at argument `%s'", argv[optidx]); - if(help_flag) + if (help_flag) usage (0); if (version_flag) { @@ -342,8 +335,10 @@ exit(0); } - argc -= optind; - argv += optind; + argc -= optidx; +#ifndef __clang_analyzer__ + argv += optidx; +#endif if (argc != 0) usage(1); @@ -387,13 +382,11 @@ krb5_err(kcm_context, 1, ret, "initializing system ccache"); } -#ifdef SUPPORT_DETACH if(detach_from_console == -1) detach_from_console = krb5_config_get_bool_default(kcm_context, NULL, - DETACH_IS_DEFAULT, + FALSE, "kcm", "detach", NULL); -#endif kcm_openlog(); if(max_request == 0) max_request = 64 * 1024; diff --git a/crypto/heimdal/kcm/events.c b/crypto/heimdal/kcm/events.c --- a/crypto/heimdal/kcm/events.c +++ b/crypto/heimdal/kcm/events.c @@ -61,10 +61,10 @@ } static void -print_times(time_t time, char buf[64]) +print_times(time_t t, char buf[64]) { - if (time) - strftime(buf, 64, "%m-%dT%H:%M", gmtime(&time)); + if (t) + strftime(buf, 64, "%m-%dT%H:%M", gmtime(&t)); else strlcpy(buf, "never", 64); } @@ -398,6 +398,7 @@ { krb5_error_code ret; kcm_event **e; + const char *estr; HEIMDAL_MUTEX_lock(&events_mutex); @@ -415,14 +416,18 @@ if (now >= (*e)->fire_time) { ret = kcm_fire_event(context, e); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(1, "Could not fire event for cache %s: %s", - (*e)->ccache->name, krb5_get_err_text(context, ret)); + (*e)->ccache->name, estr); + krb5_free_error_message(context, estr); } } else if ((*e)->expire_time && now >= (*e)->expire_time) { ret = kcm_remove_event_internal(context, e); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(1, "Could not expire event for cache %s: %s", - (*e)->ccache->name, krb5_get_err_text(context, ret)); + (*e)->ccache->name, estr); + krb5_free_error_message(context, estr); } } diff --git a/crypto/heimdal/kcm/glue.c b/crypto/heimdal/kcm/glue.c --- a/crypto/heimdal/kcm/glue.c +++ b/crypto/heimdal/kcm/glue.c @@ -263,7 +263,16 @@ kcmss_end_get, kcmss_remove_cred, kcmss_set_flags, - kcmss_get_version + kcmss_get_version, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, }; krb5_error_code diff --git a/crypto/heimdal/kcm/kcm-protos.h b/crypto/heimdal/kcm/kcm-protos.h --- a/crypto/heimdal/kcm/kcm-protos.h +++ b/crypto/heimdal/kcm/kcm-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __kcm_protos_h__ #define __kcm_protos_h__ +#ifndef DOXY #include @@ -303,4 +304,5 @@ } #endif +#endif /* DOXY */ #endif /* __kcm_protos_h__ */ diff --git a/crypto/heimdal/kcm/kcm.8 b/crypto/heimdal/kcm/kcm.8 --- a/crypto/heimdal/kcm/kcm.8 +++ b/crypto/heimdal/kcm/kcm.8 @@ -33,7 +33,7 @@ .\" .Dd May 29, 2005 .Dt KCM 8 -.Os Heimdal +.Os .Sh NAME .Nm kcm .Nd process-based credential cache for Kerberos tickets. diff --git a/crypto/heimdal/kcm/kcm.cat8 b/crypto/heimdal/kcm/kcm.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kcm/kcm.cat8 @@ -0,0 +1,91 @@ +KCM(8) BSD System Manager's Manual KCM(8) + +NAME + kcm -- process-based credential cache for Kerberos tickets. + +SYNOPSIS + kcm [--cache-name=cachename] [-c file | --config-file=file] [-g group | + --group=group] [--max-request=size] [--disallow-getting-krbtgt] + [--detach] [-h | --help] [-k principal | + --system-principal=principal] [-l time | --lifetime=time] [-m mode | + --mode=mode] [-n | --no-name-constraints] [-r time | + --renewable-life=time] [-s path | --socket-path=path] + [--door-path=path] [-S principal | --server=principal] [-t keytab | + --keytab=keytab] [-u user | --user=user] [-v | --version] + +DESCRIPTION + kcm is a process based credential cache. To use it, set the KRB5CCNAME + environment variable to `KCM:uid' or add the stanza + + + [libdefaults] + default_cc_name = KCM:%{uid} + + to the /etc/krb5.conf configuration file and make sure kcm is started in + the system startup files. + + The kcm daemon can hold the credentials for all users in the system. Ac- + cess control is done with Unix-like permissions. The daemon checks the + access on all operations based on the uid and gid of the user. The tick- + ets are renewed as long as is permitted by the KDC's policy. + + The kcm daemon can also keep a SYSTEM credential that server processes + can use to access services. One example of usage might be an nss_ldap + module that quickly needs to get credentials and doesn't want to renew + the ticket itself. + + Supported options: + + --cache-name=cachename + system cache name + + -c file, --config-file=file + location of config file + + -g group, --group=group + system cache group + + --max-request=size + max size for a kcm-request + + --disallow-getting-krbtgt + disallow extracting any krbtgt from the kcm daemon. + + --detach + detach from console + + -h, --help + + -k principal, --system-principal=principal + system principal name + + -l time, --lifetime=time + lifetime of system tickets + + -m mode, --mode=mode + octal mode of system cache + + -n, --no-name-constraints + disable credentials cache name constraints + + -r time, --renewable-life=time + renewable lifetime of system tickets + + -s path, --socket-path=path + path to kcm domain socket + + --door-path=path + path to kcm door socket + + -S principal, --server=principal + server to get system ticket for + + -t keytab, --keytab=keytab + system keytab name + + -u user, --user=user + system cache owner + + -v, --version + +BSD May 29, 2005 BSD diff --git a/crypto/heimdal/kcm/kcm_locl.h b/crypto/heimdal/kcm/kcm_locl.h --- a/crypto/heimdal/kcm/kcm_locl.h +++ b/crypto/heimdal/kcm/kcm_locl.h @@ -169,9 +169,8 @@ extern size_t max_request; extern sig_atomic_t exit_flag; extern int name_constraints; -#ifdef SUPPORT_DETACH extern int detach_from_console; -#endif +extern int daemon_child; extern int launchd_flag; extern int disallow_getting_krbtgt; diff --git a/crypto/heimdal/kcm/log.c b/crypto/heimdal/kcm/log.c --- a/crypto/heimdal/kcm/log.c +++ b/crypto/heimdal/kcm/log.c @@ -35,30 +35,30 @@ RCSID("$Id$"); -static krb5_log_facility *logf; +static krb5_log_facility *logfac; void kcm_openlog(void) { char **s = NULL, **p; - krb5_initlog(kcm_context, "kcm", &logf); + krb5_initlog(kcm_context, "kcm", &logfac); s = krb5_config_get_strings(kcm_context, NULL, "kcm", "logging", NULL); if(s == NULL) s = krb5_config_get_strings(kcm_context, NULL, "logging", "kcm", NULL); if(s){ for(p = s; *p; p++) - krb5_addlog_dest(kcm_context, logf, *p); + krb5_addlog_dest(kcm_context, logfac, *p); krb5_config_free_strings(s); }else - krb5_addlog_dest(kcm_context, logf, DEFAULT_LOG_DEST); - krb5_set_warn_dest(kcm_context, logf); + krb5_addlog_dest(kcm_context, logfac, DEFAULT_LOG_DEST); + krb5_set_warn_dest(kcm_context, logfac); } char* kcm_log_msg_va(int level, const char *fmt, va_list ap) { char *msg; - krb5_vlog_msg(kcm_context, logf, &msg, level, fmt, ap); + krb5_vlog_msg(kcm_context, logfac, &msg, level, fmt, ap); return msg; } diff --git a/crypto/heimdal/kcm/main.c b/crypto/heimdal/kcm/main.c --- a/crypto/heimdal/kcm/main.c +++ b/crypto/heimdal/kcm/main.c @@ -35,18 +35,10 @@ RCSID("$Id$"); -sig_atomic_t exit_flag = 0; - krb5_context kcm_context = NULL; const char *service_name = "org.h5l.kcm"; -static RETSIGTYPE -sigterm(int sig) -{ - exit_flag = 1; -} - static RETSIGTYPE sigusr1(int sig) { @@ -78,13 +70,9 @@ struct sigaction sa; sa.sa_flags = 0; - sa.sa_handler = sigterm; + sa.sa_handler = sigusr1; sigemptyset(&sa.sa_mask); - sigaction(SIGINT, &sa, NULL); - sigaction(SIGTERM, &sa, NULL); - - sa.sa_handler = sigusr1; sigaction(SIGUSR1, &sa, NULL); sa.sa_handler = sigusr2; @@ -94,17 +82,13 @@ sigaction(SIGPIPE, &sa, NULL); } #else - signal(SIGINT, sigterm); - signal(SIGTERM, sigterm); signal(SIGUSR1, sigusr1); signal(SIGUSR2, sigusr2); signal(SIGPIPE, SIG_IGN); #endif -#ifdef SUPPORT_DETACH - if (detach_from_console) - daemon(0, 0); -#endif - pidfile(NULL); + if (detach_from_console && !launchd_flag && daemon_child == -1) + roken_detach_prep(argc, argv, "--daemon-child"); + rk_pidfile(NULL); if (launchd_flag) { heim_sipc mach; @@ -114,6 +98,8 @@ heim_sipc_service_unix(service_name, kcm_service, NULL, &un); } + roken_detach_finish(NULL, daemon_child); + heim_ipc_main(); krb5_free_context(kcm_context); diff --git a/crypto/heimdal/kcm/protocol.c b/crypto/heimdal/kcm/protocol.c --- a/crypto/heimdal/kcm/protocol.c +++ b/crypto/heimdal/kcm/protocol.c @@ -824,7 +824,7 @@ if (ret != 0) { krb5_free_principal(context, server); - krb5_free_keyblock(context, &key); + krb5_free_keyblock_contents(context, &key); } kcm_release_ccache(context, ccache); @@ -1070,6 +1070,7 @@ krb5_error_code ret; const char *name = NULL; char *n = NULL; + int aret; KCM_LOG_REQUEST(context, client, opcode); @@ -1083,8 +1084,9 @@ name = n = kcm_ccache_first_name(client); if (name == NULL) { - asprintf(&n, "%d", (int)client->uid); - name = n; + aret = asprintf(&n, "%d", (int)client->uid); + if (aret != -1) + name = n; } if (name == NULL) return ENOMEM; @@ -1135,17 +1137,19 @@ } if (c == NULL) { c = malloc(sizeof(*c)); - if (c == NULL) + if (c == NULL) { + free(name); return ENOMEM; + } c->session = client->session; c->uid = client->uid; - c->name = strdup(name); + c->name = name; c->next = default_caches; default_caches = c; } else { free(c->name); - c->name = strdup(name); + c->name = name; } return 0; @@ -1495,7 +1499,7 @@ */ if (1 || type2.targetinfo.length == 0) { - struct ntlm_buf sessionkey; + struct ntlm_buf tmpsesskey; if (type2.flags & NTLM_NEG_NTLM2_SESSION) { unsigned char nonce[8]; @@ -1522,7 +1526,7 @@ ret = heim_ntlm_build_ntlm1_master(c->nthash.data, c->nthash.length, - &sessionkey, + &tmpsesskey, &type3.sessionkey); if (ret) { if (type3.lm.data) @@ -1532,7 +1536,7 @@ goto error; } - free(sessionkey.data); + free(tmpsesskey.data); if (ret) { if (type3.lm.data) free(type3.lm.data); @@ -1627,7 +1631,7 @@ } #endif - ret = heim_ntlm_encode_type3(&type3, &ndata); + ret = heim_ntlm_encode_type3(&type3, &ndata, NULL); if (ret) goto error; diff --git a/crypto/heimdal/kcm/renew.c b/crypto/heimdal/kcm/renew.c --- a/crypto/heimdal/kcm/renew.c +++ b/crypto/heimdal/kcm/renew.c @@ -44,6 +44,7 @@ krb5_kdc_flags flags; krb5_const_realm realm; krb5_ccache_data ccdata; + const char *estr; memset(&in, 0, sizeof(in)); @@ -66,8 +67,10 @@ if (ccache->server != NULL) { ret = krb5_copy_principal(context, ccache->server, &in.server); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(0, "Failed to copy service principal: %s", - krb5_get_err_text(context, ret)); + estr); + krb5_free_error_message(context, estr); goto out; } } else { @@ -75,8 +78,10 @@ ret = krb5_make_principal(context, &in.server, realm, KRB5_TGS_NAME, realm, NULL); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(0, "Failed to make TGS principal for realm %s: %s", - realm, krb5_get_err_text(context, ret)); + realm, estr); + krb5_free_error_message(context, estr); goto out; } } @@ -98,8 +103,10 @@ &in, &out); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(0, "Failed to renew credentials for cache %s: %s", - ccache->name, krb5_get_err_text(context, ret)); + ccache->name, estr); + krb5_free_error_message(context, estr); goto out; } @@ -108,8 +115,10 @@ ret = kcm_ccache_store_cred_internal(context, ccache, out, 0, credp); if (ret) { + estr = krb5_get_error_message(context, ret); kcm_log(0, "Failed to store credentials for cache %s: %s", - ccache->name, krb5_get_err_text(context, ret)); + ccache->name, estr); + krb5_free_error_message(context, estr); krb5_free_creds(context, out); goto out; } diff --git a/crypto/heimdal/kdc/Makefile.am b/crypto/heimdal/kdc/Makefile.am --- a/crypto/heimdal/kdc/Makefile.am +++ b/crypto/heimdal/kdc/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_libintl) $(INCLUDE_krb4) $(INCLUDE_hcrypto) -I$(srcdir)/../lib/krb5 +AM_CPPFLAGS += $(INCLUDE_libintl) $(INCLUDE_openssl_crypto) -I$(srcdir)/../lib/krb5 lib_LTLIBRARIES = libkdc.la @@ -12,7 +12,7 @@ libexec_PROGRAMS = hprop hpropd kdc digest-service -noinst_PROGRAMS = kdc-replay +noinst_PROGRAMS = kdc-replay kdc-tester man_MANS = kdc.8 kstash.8 hprop.8 hpropd.8 string2key.8 @@ -31,16 +31,20 @@ announce.c \ main.c +kdc_tester_SOURCES = \ + config.c \ + kdc-tester.c + libkdc_la_SOURCES = \ - kdc-private.h \ - kdc-protos.h \ default_config.c \ set_dbinfo.c \ digest.c \ + fast.c \ kdc_locl.h \ kerberos5.c \ krb5tgs.c \ pkinit.c \ + pkinit-ec.c \ log.c \ misc.c \ kx509.c \ @@ -48,8 +52,19 @@ windc.c \ rx.h +KDC_PROTOS = $(srcdir)/kdc-protos.h $(srcdir)/kdc-private.h + +ALL_OBJECTS = $(kdc_OBJECTS) +ALL_OBJECTS += $(kdc_replay_OBJECTS) +ALL_OBJECTS += $(kdc_tester_OBJECTS) +ALL_OBJECTS += $(libkdc_la_OBJECTS) +ALL_OBJECTS += $(string2key_OBJECTS) +ALL_OBJECTS += $(kstash_OBJECTS) +ALL_OBJECTS += $(hprop_OBJECTS) +ALL_OBJECTS += $(hpropd_OBJECTS) +ALL_OBJECTS += $(digest_service_OBJECTS) -$(libkdc_la_OBJECTS): $(srcdir)/kdc-protos.h $(srcdir)/kdc-private.h +$(ALL_OBJECTS): $(KDC_PROTOS) libkdc_la_LDFLAGS = -version-info 2:0:0 @@ -58,30 +73,30 @@ endif $(libkdc_la_OBJECTS): $(srcdir)/version-script.map -$(srcdir)/kdc-protos.h: +$(srcdir)/kdc-protos.h: $(libkdc_la_SOURCES) cd $(srcdir) && perl ../cf/make-proto.pl -q -P comment -o kdc-protos.h $(libkdc_la_SOURCES) || rm -f kdc-protos.h -$(srcdir)/kdc-private.h: +$(srcdir)/kdc-private.h: $(libkdc_la_SOURCES) cd $(srcdir) && perl ../cf/make-proto.pl -q -P comment -p kdc-private.h $(libkdc_la_SOURCES) || rm -f kdc-private.h hprop_LDADD = \ $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_kdb) $(LIB_krb4) \ + $(LIB_kdb) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) hpropd_LDADD = \ $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_kdb) $(LIB_krb4) \ + $(LIB_kdb) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) if PKINIT LIB_pkinit = $(top_builddir)/lib/hx509/libhx509.la @@ -91,20 +106,20 @@ $(LIB_pkinit) \ $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_kdb) $(LIB_krb4) \ + $(LIB_kdb) \ $(top_builddir)/lib/ntlm/libheimntlm.la \ $(LIB_hcrypto) \ + $(LIB_openssl_crypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) LDADD = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_krb4) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) kdc_LDADD = libkdc.la $(LDADD) $(LIB_pidfile) $(CAPNG_LIBS) @@ -119,9 +134,11 @@ $(top_builddir)/lib/ipc/libheim-ipcs.la \ $(LDADD) $(LIB_pidfile) kdc_replay_LDADD = libkdc.la $(LDADD) $(LIB_pidfile) +kdc_tester_LDADD = libkdc.la $(LDADD) $(LIB_pidfile) $(LIB_heimbase) -include_HEADERS = kdc.h kdc-protos.h +include_HEADERS = kdc.h $(srcdir)/kdc-protos.h +noinst_HEADERS = $(srcdir)/kdc-private.h krb5dir = $(includedir)/krb5 krb5_HEADERS = windc_plugin.h diff --git a/crypto/heimdal/kdc/Makefile.in b/crypto/heimdal/kdc/Makefile.in --- a/crypto/heimdal/kdc/Makefile.in +++ b/crypto/heimdal/kdc/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,20 +96,16 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(include_HEADERS) $(krb5_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common bin_PROGRAMS = string2key$(EXEEXT) sbin_PROGRAMS = kstash$(EXEEXT) libexec_PROGRAMS = hprop$(EXEEXT) hpropd$(EXEEXT) kdc$(EXEEXT) \ digest-service$(EXEEXT) -noinst_PROGRAMS = kdc-replay$(EXEEXT) +noinst_PROGRAMS = kdc-replay$(EXEEXT) kdc-tester$(EXEEXT) @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map subdir = kdc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -66,8 +116,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -80,6 +129,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -99,10 +149,18 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) $(krb5_HEADERS) \ + $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ + "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(includedir)" \ + "$(DESTDIR)$(krb5dir)" +PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(noinst_PROGRAMS) \ + $(sbin_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -124,32 +182,39 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" \ - "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(includedir)" \ - "$(DESTDIR)$(krb5dir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libkdc_la_DEPENDENCIES = $(LIB_pkinit) \ $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(top_builddir)/lib/ntlm/libheimntlm.la \ + $(top_builddir)/lib/ntlm/libheimntlm.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) am_libkdc_la_OBJECTS = default_config.lo set_dbinfo.lo digest.lo \ - kerberos5.lo krb5tgs.lo pkinit.lo log.lo misc.lo kx509.lo \ - process.lo windc.lo + fast.lo kerberos5.lo krb5tgs.lo pkinit.lo pkinit-ec.lo log.lo \ + misc.lo kx509.lo process.lo windc.lo libkdc_la_OBJECTS = $(am_libkdc_la_OBJECTS) -libkdc_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libkdc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libkdc_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(noinst_PROGRAMS) \ - $(sbin_PROGRAMS) am_digest_service_OBJECTS = digest-service.$(OBJEXT) digest_service_OBJECTS = $(am_digest_service_OBJECTS) am__DEPENDENCIES_2 = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) digest_service_DEPENDENCIES = libkdc.la \ $(top_builddir)/lib/ntlm/libheimntlm.la \ @@ -159,70 +224,138 @@ hprop_OBJECTS = $(am_hprop_OBJECTS) hprop_DEPENDENCIES = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_hpropd_OBJECTS = hpropd.$(OBJEXT) hpropd_OBJECTS = $(am_hpropd_OBJECTS) hpropd_DEPENDENCIES = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_kdc_OBJECTS = kdc-connect.$(OBJEXT) kdc-config.$(OBJEXT) \ kdc-announce.$(OBJEXT) kdc-main.$(OBJEXT) kdc_OBJECTS = $(am_kdc_OBJECTS) kdc_DEPENDENCIES = libkdc.la $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -kdc_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(kdc_CFLAGS) $(CFLAGS) $(kdc_LDFLAGS) \ - $(LDFLAGS) -o $@ +kdc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(kdc_CFLAGS) $(CFLAGS) \ + $(kdc_LDFLAGS) $(LDFLAGS) -o $@ kdc_replay_SOURCES = kdc-replay.c kdc_replay_OBJECTS = kdc-replay.$(OBJEXT) kdc_replay_DEPENDENCIES = libkdc.la $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) +am_kdc_tester_OBJECTS = config.$(OBJEXT) kdc-tester.$(OBJEXT) +kdc_tester_OBJECTS = $(am_kdc_tester_OBJECTS) +kdc_tester_DEPENDENCIES = libkdc.la $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_1) $(LIB_heimbase) am_kstash_OBJECTS = kstash.$(OBJEXT) kstash_OBJECTS = $(am_kstash_OBJECTS) kstash_LDADD = $(LDADD) kstash_DEPENDENCIES = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_string2key_OBJECTS = string2key.$(OBJEXT) string2key_OBJECTS = $(am_string2key_OBJECTS) string2key_LDADD = $(LDADD) string2key_DEPENDENCIES = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/config.Po \ + ./$(DEPDIR)/default_config.Plo ./$(DEPDIR)/digest-service.Po \ + ./$(DEPDIR)/digest.Plo ./$(DEPDIR)/fast.Plo \ + ./$(DEPDIR)/hprop.Po ./$(DEPDIR)/hpropd.Po \ + ./$(DEPDIR)/kdc-announce.Po ./$(DEPDIR)/kdc-config.Po \ + ./$(DEPDIR)/kdc-connect.Po ./$(DEPDIR)/kdc-main.Po \ + ./$(DEPDIR)/kdc-replay.Po ./$(DEPDIR)/kdc-tester.Po \ + ./$(DEPDIR)/kerberos5.Plo ./$(DEPDIR)/krb5tgs.Plo \ + ./$(DEPDIR)/kstash.Po ./$(DEPDIR)/kx509.Plo \ + ./$(DEPDIR)/log.Plo ./$(DEPDIR)/misc.Plo \ + ./$(DEPDIR)/mit_dump.Po ./$(DEPDIR)/pkinit-ec.Plo \ + ./$(DEPDIR)/pkinit.Plo ./$(DEPDIR)/process.Plo \ + ./$(DEPDIR)/set_dbinfo.Plo ./$(DEPDIR)/string2key.Po \ + ./$(DEPDIR)/windc.Plo 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(libkdc_la_SOURCES) $(digest_service_SOURCES) \ $(hprop_SOURCES) $(hpropd_SOURCES) $(kdc_SOURCES) kdc-replay.c \ - $(kstash_SOURCES) $(string2key_SOURCES) + $(kdc_tester_SOURCES) $(kstash_SOURCES) $(string2key_SOURCES) DIST_SOURCES = $(libkdc_la_SOURCES) $(digest_service_SOURCES) \ $(hprop_SOURCES) $(hpropd_SOURCES) $(kdc_SOURCES) kdc-replay.c \ - $(kstash_SOURCES) $(string2key_SOURCES) + $(kdc_tester_SOURCES) $(kstash_SOURCES) $(string2key_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac man8dir = $(mandir)/man8 MANS = $(man_MANS) -HEADERS = $(include_HEADERS) $(krb5_HEADERS) -ETAGS = etags -CTAGS = ctags +HEADERS = $(include_HEADERS) $(krb5_HEADERS) $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -237,16 +370,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -256,17 +392,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -285,12 +423,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -299,6 +434,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -315,10 +451,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -326,6 +460,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -340,12 +475,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -362,10 +500,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -376,13 +520,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -406,6 +544,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -429,9 +569,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -441,30 +586,38 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_libintl) $(INCLUDE_krb4) \ - $(INCLUDE_hcrypto) -I$(srcdir)/../lib/krb5 +AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_libintl) \ + $(INCLUDE_openssl_crypto) -I$(srcdir)/../lib/krb5 @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; lib_LTLIBRARIES = libkdc.la man_MANS = kdc.8 kstash.8 hprop.8 hpropd.8 string2key.8 hprop_SOURCES = hprop.c mit_dump.c hprop.h @@ -479,16 +632,20 @@ announce.c \ main.c +kdc_tester_SOURCES = \ + config.c \ + kdc-tester.c + libkdc_la_SOURCES = \ - kdc-private.h \ - kdc-protos.h \ default_config.c \ set_dbinfo.c \ digest.c \ + fast.c \ kdc_locl.h \ kerberos5.c \ krb5tgs.c \ pkinit.c \ + pkinit-ec.c \ log.c \ misc.c \ kx509.c \ @@ -496,44 +653,49 @@ windc.c \ rx.h +KDC_PROTOS = $(srcdir)/kdc-protos.h $(srcdir)/kdc-private.h +ALL_OBJECTS = $(kdc_OBJECTS) $(kdc_replay_OBJECTS) \ + $(kdc_tester_OBJECTS) $(libkdc_la_OBJECTS) \ + $(string2key_OBJECTS) $(kstash_OBJECTS) $(hprop_OBJECTS) \ + $(hpropd_OBJECTS) $(digest_service_OBJECTS) libkdc_la_LDFLAGS = -version-info 2:0:0 $(am__append_1) hprop_LDADD = \ $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_kdb) $(LIB_krb4) \ + $(LIB_kdb) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) hpropd_LDADD = \ $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_kdb) $(LIB_krb4) \ + $(LIB_kdb) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) @PKINIT_TRUE@LIB_pkinit = $(top_builddir)/lib/hx509/libhx509.la libkdc_la_LIBADD = \ $(LIB_pkinit) \ $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_kdb) $(LIB_krb4) \ + $(LIB_kdb) \ $(top_builddir)/lib/ntlm/libheimntlm.la \ $(LIB_hcrypto) \ + $(LIB_openssl_crypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) LDADD = $(top_builddir)/lib/hdb/libhdb.la \ $(top_builddir)/lib/krb5/libkrb5.la \ - $(LIB_krb4) \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_roken) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) kdc_LDADD = libkdc.la $(LDADD) $(LIB_pidfile) $(CAPNG_LIBS) @FRAMEWORK_SECURITY_TRUE@kdc_LDFLAGS = -framework SystemConfiguration -framework CoreFoundation @@ -545,7 +707,9 @@ $(LDADD) $(LIB_pidfile) kdc_replay_LDADD = libkdc.la $(LDADD) $(LIB_pidfile) -include_HEADERS = kdc.h kdc-protos.h +kdc_tester_LDADD = libkdc.la $(LDADD) $(LIB_pidfile) $(LIB_heimbase) +include_HEADERS = kdc.h $(srcdir)/kdc-protos.h +noinst_HEADERS = $(srcdir)/kdc-private.h krb5dir = $(includedir)/krb5 krb5_HEADERS = windc_plugin.h build_HEADERZ = $(krb5_HEADERS) # XXX @@ -562,7 +726,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -575,15 +739,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kdc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign kdc/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -593,49 +757,21 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libkdc.la: $(libkdc_la_OBJECTS) $(libkdc_la_DEPENDENCIES) - $(libkdc_la_LINK) -rpath $(libdir) $(libkdc_la_OBJECTS) $(libkdc_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -656,7 +792,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -671,14 +808,19 @@ rm -f $$list install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -699,7 +841,8 @@ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files @@ -723,14 +866,19 @@ rm -f $$list install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sbindir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -751,7 +899,8 @@ @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files @@ -764,27 +913,76 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -digest-service$(EXEEXT): $(digest_service_OBJECTS) $(digest_service_DEPENDENCIES) + +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}; \ + } + +libkdc.la: $(libkdc_la_OBJECTS) $(libkdc_la_DEPENDENCIES) $(EXTRA_libkdc_la_DEPENDENCIES) + $(AM_V_CCLD)$(libkdc_la_LINK) -rpath $(libdir) $(libkdc_la_OBJECTS) $(libkdc_la_LIBADD) $(LIBS) + +digest-service$(EXEEXT): $(digest_service_OBJECTS) $(digest_service_DEPENDENCIES) $(EXTRA_digest_service_DEPENDENCIES) @rm -f digest-service$(EXEEXT) - $(LINK) $(digest_service_OBJECTS) $(digest_service_LDADD) $(LIBS) -hprop$(EXEEXT): $(hprop_OBJECTS) $(hprop_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(digest_service_OBJECTS) $(digest_service_LDADD) $(LIBS) + +hprop$(EXEEXT): $(hprop_OBJECTS) $(hprop_DEPENDENCIES) $(EXTRA_hprop_DEPENDENCIES) @rm -f hprop$(EXEEXT) - $(LINK) $(hprop_OBJECTS) $(hprop_LDADD) $(LIBS) -hpropd$(EXEEXT): $(hpropd_OBJECTS) $(hpropd_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(hprop_OBJECTS) $(hprop_LDADD) $(LIBS) + +hpropd$(EXEEXT): $(hpropd_OBJECTS) $(hpropd_DEPENDENCIES) $(EXTRA_hpropd_DEPENDENCIES) @rm -f hpropd$(EXEEXT) - $(LINK) $(hpropd_OBJECTS) $(hpropd_LDADD) $(LIBS) -kdc$(EXEEXT): $(kdc_OBJECTS) $(kdc_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(hpropd_OBJECTS) $(hpropd_LDADD) $(LIBS) + +kdc$(EXEEXT): $(kdc_OBJECTS) $(kdc_DEPENDENCIES) $(EXTRA_kdc_DEPENDENCIES) @rm -f kdc$(EXEEXT) - $(kdc_LINK) $(kdc_OBJECTS) $(kdc_LDADD) $(LIBS) -kdc-replay$(EXEEXT): $(kdc_replay_OBJECTS) $(kdc_replay_DEPENDENCIES) + $(AM_V_CCLD)$(kdc_LINK) $(kdc_OBJECTS) $(kdc_LDADD) $(LIBS) + +kdc-replay$(EXEEXT): $(kdc_replay_OBJECTS) $(kdc_replay_DEPENDENCIES) $(EXTRA_kdc_replay_DEPENDENCIES) @rm -f kdc-replay$(EXEEXT) - $(LINK) $(kdc_replay_OBJECTS) $(kdc_replay_LDADD) $(LIBS) -kstash$(EXEEXT): $(kstash_OBJECTS) $(kstash_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kdc_replay_OBJECTS) $(kdc_replay_LDADD) $(LIBS) + +kdc-tester$(EXEEXT): $(kdc_tester_OBJECTS) $(kdc_tester_DEPENDENCIES) $(EXTRA_kdc_tester_DEPENDENCIES) + @rm -f kdc-tester$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(kdc_tester_OBJECTS) $(kdc_tester_LDADD) $(LIBS) + +kstash$(EXEEXT): $(kstash_OBJECTS) $(kstash_DEPENDENCIES) $(EXTRA_kstash_DEPENDENCIES) @rm -f kstash$(EXEEXT) - $(LINK) $(kstash_OBJECTS) $(kstash_LDADD) $(LIBS) -string2key$(EXEEXT): $(string2key_OBJECTS) $(string2key_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kstash_OBJECTS) $(kstash_LDADD) $(LIBS) + +string2key$(EXEEXT): $(string2key_OBJECTS) $(string2key_DEPENDENCIES) $(EXTRA_string2key_DEPENDENCIES) @rm -f string2key$(EXEEXT) - $(LINK) $(string2key_OBJECTS) $(string2key_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(string2key_OBJECTS) $(string2key_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -792,105 +990,115 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default_config.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digest-service.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digest.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hprop.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpropd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-announce.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-config.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-connect.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-replay.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kerberos5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krb5tgs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kstash.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kx509.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mit_dump.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkinit.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_dbinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string2key.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/config.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default_config.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digest-service.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/digest.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fast.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hprop.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpropd.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-announce.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-config.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-connect.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-replay.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdc-tester.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kerberos5.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krb5tgs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kstash.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kx509.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mit_dump.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkinit-ec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pkinit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/process.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_dbinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string2key.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windc.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< kdc-connect.o: connect.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-connect.o -MD -MP -MF $(DEPDIR)/kdc-connect.Tpo -c -o kdc-connect.o `test -f 'connect.c' || echo '$(srcdir)/'`connect.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-connect.Tpo $(DEPDIR)/kdc-connect.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='connect.c' object='kdc-connect.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-connect.o -MD -MP -MF $(DEPDIR)/kdc-connect.Tpo -c -o kdc-connect.o `test -f 'connect.c' || echo '$(srcdir)/'`connect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-connect.Tpo $(DEPDIR)/kdc-connect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='connect.c' object='kdc-connect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-connect.o `test -f 'connect.c' || echo '$(srcdir)/'`connect.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-connect.o `test -f 'connect.c' || echo '$(srcdir)/'`connect.c kdc-connect.obj: connect.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-connect.obj -MD -MP -MF $(DEPDIR)/kdc-connect.Tpo -c -o kdc-connect.obj `if test -f 'connect.c'; then $(CYGPATH_W) 'connect.c'; else $(CYGPATH_W) '$(srcdir)/connect.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-connect.Tpo $(DEPDIR)/kdc-connect.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='connect.c' object='kdc-connect.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-connect.obj -MD -MP -MF $(DEPDIR)/kdc-connect.Tpo -c -o kdc-connect.obj `if test -f 'connect.c'; then $(CYGPATH_W) 'connect.c'; else $(CYGPATH_W) '$(srcdir)/connect.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-connect.Tpo $(DEPDIR)/kdc-connect.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='connect.c' object='kdc-connect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-connect.obj `if test -f 'connect.c'; then $(CYGPATH_W) 'connect.c'; else $(CYGPATH_W) '$(srcdir)/connect.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-connect.obj `if test -f 'connect.c'; then $(CYGPATH_W) 'connect.c'; else $(CYGPATH_W) '$(srcdir)/connect.c'; fi` kdc-config.o: config.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-config.o -MD -MP -MF $(DEPDIR)/kdc-config.Tpo -c -o kdc-config.o `test -f 'config.c' || echo '$(srcdir)/'`config.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-config.Tpo $(DEPDIR)/kdc-config.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='config.c' object='kdc-config.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-config.o -MD -MP -MF $(DEPDIR)/kdc-config.Tpo -c -o kdc-config.o `test -f 'config.c' || echo '$(srcdir)/'`config.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-config.Tpo $(DEPDIR)/kdc-config.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config.c' object='kdc-config.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-config.o `test -f 'config.c' || echo '$(srcdir)/'`config.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-config.o `test -f 'config.c' || echo '$(srcdir)/'`config.c kdc-config.obj: config.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-config.obj -MD -MP -MF $(DEPDIR)/kdc-config.Tpo -c -o kdc-config.obj `if test -f 'config.c'; then $(CYGPATH_W) 'config.c'; else $(CYGPATH_W) '$(srcdir)/config.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-config.Tpo $(DEPDIR)/kdc-config.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='config.c' object='kdc-config.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-config.obj -MD -MP -MF $(DEPDIR)/kdc-config.Tpo -c -o kdc-config.obj `if test -f 'config.c'; then $(CYGPATH_W) 'config.c'; else $(CYGPATH_W) '$(srcdir)/config.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-config.Tpo $(DEPDIR)/kdc-config.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config.c' object='kdc-config.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-config.obj `if test -f 'config.c'; then $(CYGPATH_W) 'config.c'; else $(CYGPATH_W) '$(srcdir)/config.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-config.obj `if test -f 'config.c'; then $(CYGPATH_W) 'config.c'; else $(CYGPATH_W) '$(srcdir)/config.c'; fi` kdc-announce.o: announce.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-announce.o -MD -MP -MF $(DEPDIR)/kdc-announce.Tpo -c -o kdc-announce.o `test -f 'announce.c' || echo '$(srcdir)/'`announce.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-announce.Tpo $(DEPDIR)/kdc-announce.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='announce.c' object='kdc-announce.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-announce.o -MD -MP -MF $(DEPDIR)/kdc-announce.Tpo -c -o kdc-announce.o `test -f 'announce.c' || echo '$(srcdir)/'`announce.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-announce.Tpo $(DEPDIR)/kdc-announce.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='announce.c' object='kdc-announce.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-announce.o `test -f 'announce.c' || echo '$(srcdir)/'`announce.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-announce.o `test -f 'announce.c' || echo '$(srcdir)/'`announce.c kdc-announce.obj: announce.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-announce.obj -MD -MP -MF $(DEPDIR)/kdc-announce.Tpo -c -o kdc-announce.obj `if test -f 'announce.c'; then $(CYGPATH_W) 'announce.c'; else $(CYGPATH_W) '$(srcdir)/announce.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-announce.Tpo $(DEPDIR)/kdc-announce.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='announce.c' object='kdc-announce.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-announce.obj -MD -MP -MF $(DEPDIR)/kdc-announce.Tpo -c -o kdc-announce.obj `if test -f 'announce.c'; then $(CYGPATH_W) 'announce.c'; else $(CYGPATH_W) '$(srcdir)/announce.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-announce.Tpo $(DEPDIR)/kdc-announce.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='announce.c' object='kdc-announce.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-announce.obj `if test -f 'announce.c'; then $(CYGPATH_W) 'announce.c'; else $(CYGPATH_W) '$(srcdir)/announce.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-announce.obj `if test -f 'announce.c'; then $(CYGPATH_W) 'announce.c'; else $(CYGPATH_W) '$(srcdir)/announce.c'; fi` kdc-main.o: main.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-main.o -MD -MP -MF $(DEPDIR)/kdc-main.Tpo -c -o kdc-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-main.Tpo $(DEPDIR)/kdc-main.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='kdc-main.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-main.o -MD -MP -MF $(DEPDIR)/kdc-main.Tpo -c -o kdc-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-main.Tpo $(DEPDIR)/kdc-main.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='kdc-main.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c kdc-main.obj: main.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-main.obj -MD -MP -MF $(DEPDIR)/kdc-main.Tpo -c -o kdc-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/kdc-main.Tpo $(DEPDIR)/kdc-main.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='main.c' object='kdc-main.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -MT kdc-main.obj -MD -MP -MF $(DEPDIR)/kdc-main.Tpo -c -o kdc-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/kdc-main.Tpo $(DEPDIR)/kdc-main.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='main.c' object='kdc-main.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(kdc_CFLAGS) $(CFLAGS) -c -o kdc-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi` mostlyclean-libtool: -rm -f *.lo @@ -899,11 +1107,18 @@ -rm -rf .libs _libs install-man8: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -932,13 +1147,14 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @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"; \ @@ -952,13 +1168,14 @@ @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-krb5HEADERS: $(krb5_HEADERS) @$(NORMAL_INSTALL) - test -z "$(krb5dir)" || $(MKDIR_P) "$(DESTDIR)$(krb5dir)" @list='$(krb5_HEADERS)'; test -n "$(krb5dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(krb5dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(krb5dir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -972,30 +1189,17 @@ @$(NORMAL_UNINSTALL) @list='$(krb5_HEADERS)'; test -n "$(krb5dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(krb5dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(krb5dir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(krb5dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -1007,15 +1211,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -1024,24 +1224,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -1077,12 +1281,16 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-local check: check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS) \ +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(HEADERS) \ all-local install-binPROGRAMS: install-libLTLIBRARIES +install-libexecPROGRAMS: install-libLTLIBRARIES + +install-sbinPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(krb5dir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(krb5dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -1095,10 +1303,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -1117,7 +1330,32 @@ clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/config.Po + -rm -f ./$(DEPDIR)/default_config.Plo + -rm -f ./$(DEPDIR)/digest-service.Po + -rm -f ./$(DEPDIR)/digest.Plo + -rm -f ./$(DEPDIR)/fast.Plo + -rm -f ./$(DEPDIR)/hprop.Po + -rm -f ./$(DEPDIR)/hpropd.Po + -rm -f ./$(DEPDIR)/kdc-announce.Po + -rm -f ./$(DEPDIR)/kdc-config.Po + -rm -f ./$(DEPDIR)/kdc-connect.Po + -rm -f ./$(DEPDIR)/kdc-main.Po + -rm -f ./$(DEPDIR)/kdc-replay.Po + -rm -f ./$(DEPDIR)/kdc-tester.Po + -rm -f ./$(DEPDIR)/kerberos5.Plo + -rm -f ./$(DEPDIR)/krb5tgs.Plo + -rm -f ./$(DEPDIR)/kstash.Po + -rm -f ./$(DEPDIR)/kx509.Plo + -rm -f ./$(DEPDIR)/log.Plo + -rm -f ./$(DEPDIR)/misc.Plo + -rm -f ./$(DEPDIR)/mit_dump.Po + -rm -f ./$(DEPDIR)/pkinit-ec.Plo + -rm -f ./$(DEPDIR)/pkinit.Plo + -rm -f ./$(DEPDIR)/process.Plo + -rm -f ./$(DEPDIR)/set_dbinfo.Plo + -rm -f ./$(DEPDIR)/string2key.Po + -rm -f ./$(DEPDIR)/windc.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1142,10 +1380,10 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES \ - install-libexecPROGRAMS install-sbinPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libLTLIBRARIES install-libexecPROGRAMS \ + install-sbinPROGRAMS + install-html: install-html-am install-html-am: @@ -1167,7 +1405,32 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/config.Po + -rm -f ./$(DEPDIR)/default_config.Plo + -rm -f ./$(DEPDIR)/digest-service.Po + -rm -f ./$(DEPDIR)/digest.Plo + -rm -f ./$(DEPDIR)/fast.Plo + -rm -f ./$(DEPDIR)/hprop.Po + -rm -f ./$(DEPDIR)/hpropd.Po + -rm -f ./$(DEPDIR)/kdc-announce.Po + -rm -f ./$(DEPDIR)/kdc-config.Po + -rm -f ./$(DEPDIR)/kdc-connect.Po + -rm -f ./$(DEPDIR)/kdc-main.Po + -rm -f ./$(DEPDIR)/kdc-replay.Po + -rm -f ./$(DEPDIR)/kdc-tester.Po + -rm -f ./$(DEPDIR)/kerberos5.Plo + -rm -f ./$(DEPDIR)/krb5tgs.Plo + -rm -f ./$(DEPDIR)/kstash.Po + -rm -f ./$(DEPDIR)/kx509.Plo + -rm -f ./$(DEPDIR)/log.Plo + -rm -f ./$(DEPDIR)/misc.Plo + -rm -f ./$(DEPDIR)/mit_dump.Po + -rm -f ./$(DEPDIR)/pkinit-ec.Plo + -rm -f ./$(DEPDIR)/pkinit.Plo + -rm -f ./$(DEPDIR)/process.Plo + -rm -f ./$(DEPDIR)/set_dbinfo.Plo + -rm -f ./$(DEPDIR)/string2key.Po + -rm -f ./$(DEPDIR)/windc.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1191,46 +1454,60 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man8 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libexecPROGRAMS clean-libtool clean-noinstPROGRAMS \ - clean-sbinPROGRAMS ctags dist-hook distclean distclean-compile \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool \ + clean-noinstPROGRAMS clean-sbinPROGRAMS cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-includeHEADERS install-info install-info-am \ - install-krb5HEADERS install-libLTLIBRARIES \ + install-exec-am install-exec-local install-html \ + install-html-am install-includeHEADERS install-info \ + install-info-am install-krb5HEADERS install-libLTLIBRARIES \ install-libexecPROGRAMS install-man install-man8 install-pdf \ install-pdf-am install-ps install-ps-am install-sbinPROGRAMS \ 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 \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-hook uninstall-includeHEADERS \ uninstall-krb5HEADERS uninstall-libLTLIBRARIES \ uninstall-libexecPROGRAMS uninstall-man uninstall-man8 \ uninstall-sbinPROGRAMS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1238,7 +1515,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1283,11 +1560,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1295,6 +1581,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1337,6 +1625,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1350,13 +1651,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1387,13 +1688,13 @@ fi ; \ done -$(libkdc_la_OBJECTS): $(srcdir)/kdc-protos.h $(srcdir)/kdc-private.h +$(ALL_OBJECTS): $(KDC_PROTOS) $(libkdc_la_OBJECTS): $(srcdir)/version-script.map -$(srcdir)/kdc-protos.h: +$(srcdir)/kdc-protos.h: $(libkdc_la_SOURCES) cd $(srcdir) && perl ../cf/make-proto.pl -q -P comment -o kdc-protos.h $(libkdc_la_SOURCES) || rm -f kdc-protos.h -$(srcdir)/kdc-private.h: +$(srcdir)/kdc-private.h: $(libkdc_la_SOURCES) cd $(srcdir) && perl ../cf/make-proto.pl -q -P comment -p kdc-private.h $(libkdc_la_SOURCES) || rm -f kdc-private.h # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/crypto/heimdal/kdc/NTMakefile b/crypto/heimdal/kdc/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/NTMakefile @@ -0,0 +1,150 @@ +######################################################################## +# +# Copyright (c) 2009-2016, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=kdc + +!include ../windows/NTMakefile.w32 + +BINPROGRAMS=$(BINDIR)\string2key.exe + +SBINPROGRAMS=$(SBINDIR)\kstash.exe + +LIBEXECPROGRAMS= \ + $(LIBEXECDIR)\hprop.exe \ + $(LIBEXECDIR)\hpropd.exe \ + $(LIBEXECDIR)\kdc.exe \ +# $(LIBEXECDIR)\digest-service.exe + +NOINST_PROGRAMS=$(OBJ)\kdc-replay.exe + +INCFILES=\ + $(INCDIR)\kdc.h \ + $(INCDIR)\kdc-protos.h \ + $(INCDIR)\kdc-private.h \ + $(INCDIR)\krb5\windc_plugin.h + +all:: $(INCFILES) $(LIBKDC) $(BINPROGRAMS) $(SBINPROGRAMS) $(LIBEXECPROGRAMS) + +clean:: + -$(RM) $(LIBKDC) + -$(RM) $(BINPROGRAMS:.exe=.*) $(SBINPROGRAMS:.exe=.*) $(LIBEXECPROGRAMS:.exe=.*) + +BIN_LIBS=\ + $(LIBHDB) \ + $(LIBHEIMDAL) \ + $(LIBROKEN) \ + $(LIBVERS) + +$(LIBEXECDIR)\hprop.exe: $(OBJ)\hprop.obj $(OBJ)\mit_dump.obj $(BIN_LIBS) $(OBJ)\hprop-version.res + $(EXECONLINK) + $(EXEPREP) + +$(LIBEXECDIR)\hpropd.exe: $(OBJ)\hpropd.obj $(BIN_LIBS) $(OBJ)\hpropd-version.res + $(EXECONLINK) + $(EXEPREP) + +$(SBINDIR)\kstash.exe: $(OBJ)\kstash.obj $(BIN_LIBS) $(OBJ)\kstash-version.res + $(EXECONLINK) + $(EXEPREP) + +$(BINDIR)\string2key.exe: $(OBJ)\string2key.obj $(BIN_LIBS) $(OBJ)\string2key-version.res + $(EXECONLINK) + $(EXEPREP) + +$(BINDIR)\digest-service.exe: $(OBJ)\digest-service.obj $(BIN_LIBS) + $(EXECONLINK) + $(EXEPREP) + +$(LIBEXECDIR)\kdc.exe: \ + $(OBJ)\connect.obj $(OBJ)\config.obj $(OBJ)\announce.obj \ + $(OBJ)\main.obj $(OBJ)\kdc-version.res \ + $(LIBKDC) $(BIN_LIBS) $(LIB_openssl_crypto) + $(EXECONLINK) + $(EXEPREP) + +LIBKDC_OBJS=\ + $(OBJ)\default_config.obj \ + $(OBJ)\set_dbinfo.obj \ + $(OBJ)\digest.obj \ + $(OBJ)\fast.obj \ + $(OBJ)\kerberos5.obj \ + $(OBJ)\krb5tgs.obj \ + $(OBJ)\pkinit.obj \ + $(OBJ)\pkinit-ec.obj \ + $(OBJ)\log.obj \ + $(OBJ)\misc.obj \ + $(OBJ)\kx509.obj \ + $(OBJ)\process.obj \ + $(OBJ)\windc.obj + +LIBKDC_LIBS=\ + $(LIBHDB) \ + $(LIBHEIMBASE) \ + $(LIBHEIMDAL) \ + $(LIBHEIMNTLM) \ + $(LIB_openssl_crypto) \ + $(LIBROKEN) + +LIBKDCRES=$(OBJ)\libkdc-version.res + +$(LIBEXECDIR)\libkdc.dll: $(LIBKDC_OBJS) $(LIBKDC_LIBS) $(LIBKDCRES) + $(DLLGUILINK) -implib:$(LIBKDC) -def:libkdc-exports.def + $(DLLPREP_NODIST) + +$(LIBKDC): $(LIBEXECDIR)\libkdc.dll + +clean:: + -$(RM) $(LIBEXECDIR)\libkdc.* + +libkdc_la_SOURCES = \ + default_config.c \ + set_dbinfo.c \ + digest.c \ + fast.c \ + kdc_locl.h \ + kerberos5.c \ + krb5tgs.c \ + pkinit.c \ + pkinit-ec.c \ + log.c \ + misc.c \ + kx509.c \ + process.c \ + windc.c \ + rx.h + +$(OBJ)\kdc-protos.h: $(libkdc_la_SOURCES) + $(PERL) ..\cf\make-proto.pl -q -P remove -o $@ $(libkdc_la_SOURCES) \ + || $(RM) $@ + +$(OBJ)\kdc-private.h: $(libkdc_la_SOURCES) + $(PERL) ..\cf\make-proto.pl -q -P remove -p $@ $(libkdc_la_SOURCES) \ + || $(RM) $@ diff --git a/crypto/heimdal/kdc/config.c b/crypto/heimdal/kdc/config.c --- a/crypto/heimdal/kdc/config.c +++ b/crypto/heimdal/kdc/config.c @@ -52,9 +52,25 @@ static int disable_des = -1; static int builtin_hdb_flag; +int testing_flag; static int help_flag; static int version_flag; +/* Should we enable the HTTP hack? */ +int enable_http = -1; + +/* Log over requests to the KDC */ +const char *request_log; + +/* A string describing on what ports to listen */ +const char *port_str; + +krb5_addresses explicit_addresses; + +size_t max_request_udp; +size_t max_request_tcp; + + static struct getarg_strings addresses_str; /* addresses to listen on */ char *runas_string; @@ -79,18 +95,19 @@ { "ports", 'P', arg_string, rk_UNCONST(&port_str), "ports to listen to", "portspec" }, -#ifdef SUPPORT_DETACH -#if DETACH_IS_DEFAULT - { - "detach", 'D', arg_negative_flag, &detach_from_console, - "don't detach from console", NULL - }, -#else { "detach", 0 , arg_flag, &detach_from_console, "detach from console", NULL }, -#endif + { + "daemon-child", 0 , arg_flag, &daemon_child, + "private argument, do not use", NULL + }, +#ifdef __APPLE__ + { + "bonjour", 0 , arg_flag, &do_bonjour, + "private argument, do not use", NULL + }, #endif { "addresses", 0, arg_strings, &addresses_str, "addresses to listen on", "list of addresses" }, @@ -104,6 +121,7 @@ { "chroot", 0, arg_string, &chroot_string, "chroot directory to run in", NULL }, + { "testing", 0, arg_flag, &testing_flag, NULL, NULL }, { "help", 'h', arg_flag, &help_flag, NULL, NULL }, { "version", 'v', arg_flag, &version_flag, NULL, NULL } }; @@ -134,17 +152,19 @@ } krb5_kdc_configuration * -configure(krb5_context context, int argc, char **argv) +configure(krb5_context context, int argc, char **argv, int *optidx) { krb5_kdc_configuration *config; krb5_error_code ret; - int optidx = 0; + const char *p; - while(getarg(args, num_args, argc, argv, &optidx)) - warnx("error at argument `%s'", argv[optidx]); + *optidx = 0; + + while (getarg(args, num_args, argc, argv, optidx)) + warnx("error at argument `%s'", argv[*optidx]); - if(help_flag) + if (help_flag) usage (0); if (version_flag) { @@ -162,18 +182,22 @@ exit(0); } - argc -= optidx; - argv += optidx; + if(detach_from_console == -1) + detach_from_console = krb5_config_get_bool_default(context, NULL, + FALSE, + "kdc", + "detach", NULL); - if (argc != 0) - usage(1); + if (detach_from_console && daemon_child == -1) + roken_detach_prep(argc, argv, "--daemon-child"); { char **files; + int aret; if (config_file == NULL) { - asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); - if (config_file == NULL) + aret = asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); + if (aret == -1 || config_file == NULL) errx(1, "out of memory"); } @@ -253,14 +277,6 @@ krb5_errx(context, 1, "enforce-transited-policy deprecated, " "use [kdc]transited-policy instead"); -#ifdef SUPPORT_DETACH - if(detach_from_console == -1) - detach_from_console = krb5_config_get_bool_default(context, NULL, - DETACH_IS_DEFAULT, - "kdc", - "detach", NULL); -#endif /* SUPPORT_DETACH */ - if(max_request_tcp == 0) max_request_tcp = 64 * 1024; if(max_request_udp == 0) diff --git a/crypto/heimdal/kdc/connect.c b/crypto/heimdal/kdc/connect.c --- a/crypto/heimdal/kdc/connect.c +++ b/crypto/heimdal/kdc/connect.c @@ -33,20 +33,6 @@ #include "kdc_locl.h" -/* Should we enable the HTTP hack? */ -int enable_http = -1; - -/* Log over requests to the KDC */ -const char *request_log; - -/* A string describing on what ports to listen */ -const char *port_str; - -krb5_addresses explicit_addresses; - -size_t max_request_udp; -size_t max_request_tcp; - /* * a tuple describing on what to listen */ @@ -61,6 +47,7 @@ static struct port_desc *ports; static size_t num_ports; +static pid_t bonjour_pid = -1; /* * add `family, port, protocol' to the list with duplicate suppresion. @@ -272,6 +259,7 @@ d->s = rk_INVALID_SOCKET; return; } + rk_cloexec(d->s); #if defined(HAVE_SETSOCKOPT) && defined(SOL_SOCKET) && defined(SO_REUSEADDR) { int one = 1; @@ -281,6 +269,8 @@ d->type = type; d->port = port; + socket_set_nonblocking(d->s, 1); + if(rk_IS_SOCKET_ERROR(bind(d->s, sa, sa_size))){ char a_str[256]; size_t len; @@ -471,16 +461,18 @@ ssize_t n; buf = malloc(max_request_udp); - if(buf == NULL){ - kdc_log(context, config, 0, "Failed to allocate %lu bytes", (unsigned long)max_request_udp); + if (buf == NULL){ + kdc_log(context, config, 0, "Failed to allocate %lu bytes", + (unsigned long)max_request_udp); return; } d->sock_len = sizeof(d->__ss); n = recvfrom(d->s, buf, max_request_udp, 0, d->sa, &d->sock_len); - if(rk_IS_SOCKET_ERROR(n)) - krb5_warn(context, rk_SOCK_ERRNO, "recvfrom"); - else { + if (rk_IS_SOCKET_ERROR(n)) { + if (rk_SOCK_ERRNO != EAGAIN && rk_SOCK_ERRNO != EINTR) + krb5_warn(context, rk_SOCK_ERRNO, "recvfrom"); + } else { addr_to_string (context, d->sa, d->sock_len, d->addr_string, sizeof(d->addr_string)); if ((size_t)n == max_request_udp) { @@ -523,15 +515,21 @@ de_http(char *buf) { unsigned char *p, *q; - for(p = q = (unsigned char *)buf; *p; p++, q++) { - if(*p == '%' && isxdigit(p[1]) && isxdigit(p[2])) { - unsigned int x; - if(sscanf((char *)p + 1, "%2x", &x) != 1) + unsigned int x; + + for (p = q = (unsigned char *)buf; *p; p++, q++) { + if (*p == '%') { + if (!(isxdigit(p[1]) && isxdigit(p[2]))) + return -1; + + if (sscanf((char *)p + 1, "%2x", &x) != 1) return -1; + *q = x; p += 2; - } else + } else { *q = *p; + } } *q = '\0'; return 0; @@ -556,7 +554,8 @@ d[child].sock_len = sizeof(d[child].__ss); s = accept(d[parent].s, d[child].sa, &d[child].sock_len); if(rk_IS_BAD_SOCKET(s)) { - krb5_warn(context, rk_SOCK_ERRNO, "accept"); + if (rk_SOCK_ERRNO != EAGAIN && rk_SOCK_ERRNO != EINTR) + krb5_warn(context, rk_SOCK_ERRNO, "accept"); return; } @@ -695,7 +694,7 @@ free(data); return -1; } - len = base64_decode(t, data); + len = rk_base64_decode(t, data); if(len <= 0){ const char *msg = " 404 Not found\r\n" @@ -838,18 +837,67 @@ } } -void -loop(krb5_context context, - krb5_kdc_configuration *config) +#ifdef HAVE_FORK +static void +handle_islive(int fd) { - struct descr *d; - unsigned int ndescr; + char buf; + int ret; - ndescr = init_sockets(context, config, &d); - if(ndescr <= 0) - krb5_errx(context, 1, "No sockets!"); - kdc_log(context, config, 0, "KDC started"); - while(exit_flag == 0){ + ret = read(fd, &buf, 1); + if (ret != 1) + exit_flag = -1; +} +#endif + +krb5_boolean +realloc_descrs(struct descr **d, unsigned int *ndescr) +{ + struct descr *tmp; + size_t i; + + tmp = realloc(*d, (*ndescr + 4) * sizeof(**d)); + if(tmp == NULL) + return FALSE; + + *d = tmp; + reinit_descrs (*d, *ndescr); + memset(*d + *ndescr, 0, 4 * sizeof(**d)); + for(i = *ndescr; i < *ndescr + 4; i++) + init_descr (*d + i); + + *ndescr += 4; + + return TRUE; +} + +int +next_min_free(krb5_context context, struct descr **d, unsigned int *ndescr) +{ + size_t i; + int min_free; + + for(i = 0; i < *ndescr; i++) { + int s = (*d + i)->s; + if(rk_IS_BAD_SOCKET(s)) + return i; + } + + min_free = *ndescr; + if(!realloc_descrs(d, ndescr)) { + min_free = -1; + krb5_warnx(context, "No memory"); + } + + return min_free; +} + +static void +loop(krb5_context context, krb5_kdc_configuration *config, + struct descr *d, unsigned int ndescr, int islive) +{ + + while (exit_flag == 0) { struct timeval tmout; fd_set fds; int min_free = -1; @@ -857,9 +905,13 @@ size_t i; FD_ZERO(&fds); - for(i = 0; i < ndescr; i++) { - if(!rk_IS_BAD_SOCKET(d[i].s)){ - if(d[i].type == SOCK_STREAM && + if (islive > -1) { + FD_SET(islive, &fds); + max_fd = islive; + } + for (i = 0; i < ndescr; i++) { + if (!rk_IS_BAD_SOCKET(d[i].s)) { + if (d[i].type == SOCK_STREAM && d[i].timeout && d[i].timeout < time(NULL)) { kdc_log(context, config, 1, "TCP-connection from %s expired after %lu bytes", @@ -868,7 +920,7 @@ continue; } #ifndef NO_LIMIT_FD_SETSIZE - if(max_fd < d[i].s) + if (max_fd < d[i].s) max_fd = d[i].s; #ifdef FD_SETSIZE if (max_fd >= FD_SETSIZE) @@ -876,22 +928,6 @@ #endif #endif FD_SET(d[i].s, &fds); - } else if(min_free < 0 || i < (size_t)min_free) - min_free = i; - } - if(min_free == -1){ - struct descr *tmp; - tmp = realloc(d, (ndescr + 4) * sizeof(*d)); - if(tmp == NULL) - krb5_warnx(context, "No memory"); - else { - d = tmp; - reinit_descrs (d, ndescr); - memset(d + ndescr, 0, 4 * sizeof(*d)); - for(i = ndescr; i < ndescr + 4; i++) - init_descr (&d[i]); - min_free = ndescr; - ndescr += 4; } } @@ -905,23 +941,331 @@ krb5_warn(context, rk_SOCK_ERRNO, "select"); break; default: - for(i = 0; i < ndescr; i++) - if(!rk_IS_BAD_SOCKET(d[i].s) && FD_ISSET(d[i].s, &fds)) { - if(d[i].type == SOCK_DGRAM) +#ifdef HAVE_FORK + if (islive > -1 && FD_ISSET(islive, &fds)) + handle_islive(islive); +#endif + for (i = 0; i < ndescr; i++) + if (!rk_IS_BAD_SOCKET(d[i].s) && FD_ISSET(d[i].s, &fds)) { + min_free = next_min_free(context, &d, &ndescr); + + if (d[i].type == SOCK_DGRAM) handle_udp(context, config, &d[i]); - else if(d[i].type == SOCK_STREAM) + else if (d[i].type == SOCK_STREAM) handle_tcp(context, config, d, i, min_free); } } } - if (0); + + switch (exit_flag) { + case -1: + kdc_log(context, config, 0, + "KDC worker process exiting because KDC master exited."); + break; #ifdef SIGXCPU - else if(exit_flag == SIGXCPU) + case SIGXCPU: kdc_log(context, config, 0, "CPU time limit exceeded"); + break; #endif - else if(exit_flag == SIGINT || exit_flag == SIGTERM) + case SIGINT: + case SIGTERM: kdc_log(context, config, 0, "Terminated"); - else + break; + default: kdc_log(context, config, 0, "Unexpected exit reason: %d", exit_flag); - free (d); + break; + } +} + +#ifdef __APPLE__ +static void +bonjour_kid(krb5_context context, krb5_kdc_configuration *config, const char *argv0, int *islive) +{ + char buf; + + if (do_bonjour > 0) { + bonjour_announce(context, config); + + while (read(0, &buf, 1) == 1) + continue; + _exit(0); + } + + if ((bonjour_pid = fork()) != 0) + return; + + close(islive[0]); + if (dup2(islive[1], 0) == -1) + err(1, "failed to announce with bonjour (dup)"); + if (islive[1] != 0) + close(islive[1]); + execlp(argv0, "kdc", "--bonjour", NULL); + err(1, "failed to announce with bonjour (exec)"); +} +#endif + +#ifdef HAVE_FORK +static void +kill_kids(pid_t *pids, int max_kids, int sig) +{ + int i; + + for (i=0; i < max_kids; i++) + if (pids[i] > 0) + kill(sig, pids[i]); + if (bonjour_pid > 0) + kill(sig, bonjour_pid); +} + +static int +reap_kid(krb5_context context, krb5_kdc_configuration *config, + pid_t *pids, int max_kids, int options) +{ + pid_t pid; + char *what; + int status; + int i = 0; /* quiet warnings */ + + pid = waitpid(-1, &status, options); + if (pid < 1) + return 0; + + if (pid != bonjour_pid) { + for (i=0; i < max_kids; i++) { + if (pids[i] == pid) + break; + } + + if (i == max_kids) { + /* XXXrcd: this should not happen, have to do something, though */ + return 0; + } + } + + if (pid == bonjour_pid) + what = "bonjour"; + else + what = "worker"; + if (WIFEXITED(status)) + kdc_log(context, config, 0, "KDC reaped %s process: %d, exit status: %d", + what, (int)pid, WEXITSTATUS(status)); + else if (WIFSIGNALED(status)) + kdc_log(context, config, 0, "KDC reaped %s process: %d, term signal %d%s", + what, (int)pid, WTERMSIG(status), + WCOREDUMP(status) ? " (core dumped)" : ""); + else + kdc_log(context, config, 0, "KDC reaped %s process: %d", + what, (int)pid); + if (pid == bonjour_pid) { + bonjour_pid = (pid_t)-1; + return 0; + } else { + pids[i] = (pid_t)0; + return 1; + } +} + +static int +reap_kids(krb5_context context, krb5_kdc_configuration *config, + pid_t *pids, int max_kids) +{ + int reaped = 0; + + for (;;) { + if (reap_kid(context, config, pids, max_kids, WNOHANG) == 0) + break; + reaped++; + } + + return reaped; +} + +static void +select_sleep(int microseconds) +{ + struct timeval tv; + + tv.tv_sec = microseconds / 1000000; + tv.tv_usec = microseconds % 1000000; + select(0, NULL, NULL, NULL, &tv); +} +#endif + +void +start_kdc(krb5_context context, + krb5_kdc_configuration *config, const char *argv0) +{ + struct timeval tv1; + struct timeval tv2; + struct descr *d; + unsigned int ndescr; + pid_t pid = -1; +#ifdef HAVE_FORK + pid_t *pids; + int max_kdcs = config->num_kdc_processes; + int num_kdcs = 0; + int i; + int islive[2]; +#endif + +#ifdef __APPLE__ + if (do_bonjour > 0) + bonjour_kid(context, config, argv0, NULL); +#endif + +#ifdef HAVE_FORK +#ifdef _SC_NPROCESSORS_ONLN + if (max_kdcs < 1) + max_kdcs = sysconf(_SC_NPROCESSORS_ONLN); +#endif + + if (max_kdcs < 1) + max_kdcs = 1; + + pids = calloc(max_kdcs, sizeof(*pids)); + if (!pids) + krb5_err(context, 1, errno, "malloc"); + + /* + * We open a socketpair of which we hand one end to each of our kids. + * When we exit, for whatever reason, the children will notice an EOF + * on their end and be able to cleanly exit. + */ + + if (socketpair(PF_UNIX, SOCK_STREAM, 0, islive) == -1) + krb5_errx(context, 1, "socketpair"); + socket_set_nonblocking(islive[1], 1); +#endif + + ndescr = init_sockets(context, config, &d); + if(ndescr <= 0) + krb5_errx(context, 1, "No sockets!"); + +#ifdef HAVE_FORK + +# ifdef __APPLE__ + if (do_bonjour < 0) + bonjour_kid(context, config, argv0, islive); +# endif + + kdc_log(context, config, 0, "KDC started master process pid=%d", getpid()); +#else + kdc_log(context, config, 0, "KDC started pid=%d", getpid()); +#endif + + roken_detach_finish(NULL, daemon_child); + + tv1.tv_sec = 0; + tv1.tv_usec = 0; + +#ifdef HAVE_FORK + if (!testing_flag) { + /* Note that we might never execute the body of this loop */ + while (exit_flag == 0) { + + /* Slow down the creation of KDCs... */ + + gettimeofday(&tv2, NULL); + if (tv1.tv_sec == tv2.tv_sec && tv2.tv_usec - tv1.tv_usec < 25000) { +#if 0 /* XXXrcd: should print a message... */ + kdc_log(context, config, 0, "Spawning KDCs too quickly, " + "pausing for 50ms"); +#endif + select_sleep(12500); + continue; + } + + if (num_kdcs >= max_kdcs) { + num_kdcs -= reap_kid(context, config, pids, max_kdcs, 0); + continue; + } + + if (num_kdcs > 0) + num_kdcs -= reap_kids(context, config, pids, max_kdcs); + + pid = fork(); + switch (pid) { + case 0: + close(islive[0]); + loop(context, config, d, ndescr, islive[1]); + exit(0); + case -1: + /* XXXrcd: hmmm, do something useful?? */ + kdc_log(context, config, 0, + "KDC master process could not fork worker process"); + sleep(10); + break; + default: + for (i=0; i < max_kdcs; i++) { + if (pids[i] == 0) { + pids[i] = pid; + break; + } + } + kdc_log(context, config, 0, "KDC worker process started: %d", + pid); + num_kdcs++; + gettimeofday(&tv1, NULL); + break; + } + } + + /* Closing these sockets should cause the kids to die... */ + + close(islive[0]); + close(islive[1]); + + /* Close our listener sockets before terminating workers */ + for (i = 0; i < ndescr; ++i) + clear_descr(&d[i]); + + gettimeofday(&tv1, NULL); + tv2 = tv1; + + /* Reap every 10ms, terminate stragglers once a second, give up after 10 */ + for (;;) { + struct timeval tv3; + num_kdcs -= reap_kids(context, config, pids, max_kdcs); + if (num_kdcs == 0 && bonjour_pid <= 0) + goto end; + /* + * Using select to sleep will fail with EINTR if we receive a + * SIGCHLD. This is desirable. + */ + select_sleep(10000); + gettimeofday(&tv3, NULL); + if (tv3.tv_sec - tv1.tv_sec > 10 || + (tv3.tv_sec - tv1.tv_sec == 10 && tv3.tv_usec >= tv1.tv_usec)) + break; + if (tv3.tv_sec - tv2.tv_sec > 1 || + (tv3.tv_sec - tv2.tv_sec == 1 && tv3.tv_usec >= tv2.tv_usec)) { + kill_kids(pids, max_kdcs, SIGTERM); + tv2 = tv3; + } + } + + /* Kill stragglers and reap every 200ms, give up after 15s */ + for (;;) { + kill_kids(pids, max_kdcs, SIGKILL); + num_kdcs -= reap_kids(context, config, pids, max_kdcs); + if (num_kdcs == 0 && bonjour_pid <= 0) + break; + select_sleep(200000); + gettimeofday(&tv2, NULL); + if (tv2.tv_sec - tv1.tv_sec > 15 || + (tv2.tv_sec - tv1.tv_sec == 15 && tv2.tv_usec >= tv1.tv_usec)) + break; + } + + end: + kdc_log(context, config, 0, "KDC master process exiting", pid); + free(pids); + } else { + loop(context, config, d, ndescr, -1); + kdc_log(context, config, 0, "KDC exiting", pid); + } +#else + loop(context, config, d, ndescr, -1); + kdc_log(context, config, 0, "KDC exiting", pid); +#endif } diff --git a/crypto/heimdal/kdc/default_config.c b/crypto/heimdal/kdc/default_config.c --- a/crypto/heimdal/kdc/default_config.c +++ b/crypto/heimdal/kdc/default_config.c @@ -48,6 +48,7 @@ return ENOMEM; } + c->num_kdc_processes = -1; c->require_preauth = TRUE; c->kdc_warn_pwexpire = 0; c->encode_as_rep_as_tgs_rep = FALSE; @@ -58,6 +59,8 @@ c->check_ticket_addresses = TRUE; c->allow_null_ticket_addresses = TRUE; c->allow_anonymous = FALSE; + c->historical_anon_realm = FALSE; + c->strict_nametypes = FALSE; c->trpolicy = TRPOLICY_ALWAYS_CHECK; c->enable_pkinit = FALSE; c->pkinit_princ_in_cert = TRUE; @@ -66,6 +69,10 @@ c->num_db = 0; c->logf = NULL; + c->num_kdc_processes = + krb5_config_get_int_default(context, NULL, c->num_kdc_processes, + "kdc", "num-kdc-processes", NULL); + c->require_preauth = krb5_config_get_bool_default(context, NULL, c->require_preauth, @@ -158,6 +165,18 @@ "kdc", "allow-anonymous", NULL); + c->historical_anon_realm = + krb5_config_get_bool_default(context, NULL, + c->historical_anon_realm, + "kdc", + "historical_anon_realm", NULL); + + c->strict_nametypes = + krb5_config_get_bool_default(context, NULL, + c->strict_nametypes, + "kdc", + "strict-nametypes", NULL); + c->max_datagram_reply_length = krb5_config_get_int_default(context, NULL, diff --git a/crypto/heimdal/kdc/digest-service.c b/crypto/heimdal/kdc/digest-service.c index 4d339a2ddd35547c052f97100190b943f73e28d5..0115866503d0f04c654b082db1d283afb2a611e6 GIT binary patch literal 7477 zc$~EuYg5}u^0WOb`kV@}Dd7OO$?b+CSHc#cijlpNoP`F1wKCH z3pd9fhJ3;>`4+@;@RHaMxCO+8=pvTCld2u{H?+&hVNxwG@e#Sma21pv;;FhGB)GKmVaKk8%(2@jL>?4d(%Ahh)f}DhxklIHrF&klq0O64=ndRRw z6C^L0WRNYHM=6G+0p(sw$rXz<%d(m!_N8utH9ogLsip?_JTb=~^`SO|vugz6kzv`o zJ+(DZjUf!ihHdI+Q+sS$@W&sjg(R2h)*i!enYr#un#BmJM}lFjDm^ZP*7?0tJKiQ8R3?F4fU!!&2ncF!W4ACDpSL z=f)+Wp+nu&1~yq#Jq^%vsNV=X(nK5R^q_s#&=}RcRwP?X`+bT?2qbPp^-8@!^SaMC z2E#I#n%WhqjIOYzXQi?iLNf;3>tkZ{Nw>5f22HmJK^Kxgsn^`bDL0?Og}RBy zS^_IPsGy&NI{c`U@)8+S!O~^gjL(UaH62_^?^7+jZnt0fY!<`}E(gv~!z3Q4=zM2j zUQg^XLW9@~3+$qu1#__uv;Lw}9sbh~<}Aw{H;a$@i}y9af(22Whtc-wL9q0ir*rJh z>735m`D%$*8usrz#ma}}t>c9OHZN!Crf!sN9h|f!=8!95YQL{fKHR@K{LN&47I=QL z$@tdyoK(OZpJg8G*G~|?rXE5Lu%Fyvv*bG7rZ;aKLdT{y3+6>CI_ti8MbeCVtp|5W z;J3*K4qc|$&AW7hc=^3T4H0`f`NIi(H+Nwlg)8kAb+ZQ0OR@3MPYD#qOA;U9-JR3j zAs!kS8AoyPPWMn?ul>DEAj2MANuL};od0>kPm4GU<}t}xxG7|ex5`_#`f~L4tH7u! zinkY>!gn}Sz?fnWc@P-fE7a!MeGcW{Q$X30gMZ^-+|rf9?qMIheu_|HAiy8k3S)pj z^+TcUGF+jmOL3G1|7K3k|A>Pi=9jy85su?l?E6WCH$H}gYlq>&@u@2ny z>v}vHw25Y333np57MfF}v9RbtFh~3QS>bsY8uZZN$@*{>y7P^rDt>Ecau~A31E0}Q z5*FKelGQ}E>2%& zuU}?m`mHscB1q^dRIBG5M~X1-Lkb=1ivUu}{kk(&B~6?UN*a@8%Ov*JwA>N9Xwh(~-wFIZv-MMp-kbO{GX?k%fuD(m+Ic4-A#iT`$*S(ZbUbR@p1(1t45X|a1_tFL)m ziu+)my}_*KiQlVq<&7L$(~RZbVmn5Xy3KV2xE!82=gx&@I|Cfl3|lB!{_auqNMo+l zEM+?#AXq+Ym{3o2O^-}E#)7W7kz^gb=N(nbFO>w)?CXiq$qjB4CQ*VYl79htCvD~tt_3%SQa4ge& zs}hjA*fLXv76IyfB$w_}kVqY_*=8L)k<(ZY$G>o^vJu&1FN6Jz;eHq~^`)w7QmdrQl}nv|Cg^-HHoP^55`5NI=j6zPbk~4lCmKSGZZ_xGv*rOQ5y075GNqL*%j8 z+K=8!zu@OzvYiHu?;a3-#zSTkA{{3=X{AUd);-1Xu&5FkX$SXp$lD{53S@f-^3%<2mIa!_0UN=A1J(~^jufHnq$eHS~c2{=Q z=8JSrH5wB)UiUTZG6oyt)~=?}+CkfHec!G}4DGT^etQ1N)F+ZM@qc+X@dfrHp?$QC zKatOZVbxEcO=cqKZC=UEmEuU=qN-&aIalgvG#)sbF&GcE?s^NO>vq{M_k?A?wkDuH zd$g04H}Vt9LIqmZGK+{2)4fU3yeqDBLGbS9hiKZ}>XX6t!o>%gJ=CB?;fYgPS3hhn zO0*EwtmE@uyTxZnj*R0NR65FW@L~N$fOgdd3zrVvIw$p0yv-<>5>P_q^(DTKWI#V( zzS8n72Ju#hn01s^>(%0w(n2t&SLg~}i>Z&O@Sv2GQXmq)y4$3!E7K%zKb$m-iHpeL zs)+z5vo5{$;C21=%i-7F##fPo&zEv_FTYKY4m2<4915IPS&JwY>2zcO*nNSQv~9H(5H*WcwJay?oXst6=QoPISG|YX@xYlRp=Ex2)-Yj zKf86{@;{60HV&MK2)jnSastq!Ecf#wXAsX3(_Kb!5HD5=n0f5pF5@7??3w13!W+ zE>f5Aof|)L(iP0(G|UwE=I2X@Q~ozDa^e!ko21pv;;1;Ku)GKsWaKk8%(2^KfpyrywtoSa)9RYL<@PmRe3eW(rL>>7c%H8w5X znpqmC;~@+tW6RLbX4b?o;mjaBoIG(<7?19O%2U7VPb%OH67{530WKJ*wQsq zL3V@DY^aYf6hJO8o>(x_uXGF1tcgMriP1JCOwQp-GX|IVsh;U0-MZ!qo$J<^#GRu& z6{f0T>4VuwHDEe3rW2EMBg=-mIT)$>l{V}HDuIGQ`=E_2FfY~7Xv0$E)iCr-LnYO- z5$DDwp`kZU_jC;iBa`F*+hljJeI|ripP)e90d?3JQF@)NtP*uX3-c ztMH?W9X4HKoJKdqXvFxDtFrh=)8yJjIg_$*t`MJ{B)KaZ)GDwl+@M5_8BEF|BN}$+INPLK`IHy)177dJyqd3^2T@=`B ze{U0LY>lp@iN_G-Ur+dM5oP`&A~{PZg^cmacgt3vkKTL{7&S$)8Nn%hheHL%Gb{-Y z0)u;nsy4gNq5OLaC|h#yZfp!gy0Y0l>|+s65lRdM_&r;}K8kE?3T=~Mg{mfEEA#)& z?417*8-B!lwfGQ@<5ui@afl5Z!@;$~aN#u6m5OoyW3UuBQlKMp@*ov{c?*T_o&Mr= zq&vGPp;tK_BVl9y*@)Dok6urT@aNEd0uBCl3Wq)T-fngG%YgN|E>8w+su@?poye_) z<`iipEP4>k(f)o`xGshUJ#=`o-kb-{Vq>d{-`bfRhHP=eV>IK~^+f2R-Pk9X$4w||8|;L9)~LFNPJVF4OOtx<~Fs2nzyC6_r}?4%zB>qy-HVJ z$gwodS?(^kVWQl9 zl1aySplfab%~p-U`DA9;msje*z8bzpbR@2eq$sYdHaU%@X`I?P zfM?F4<~_v4EG3@-ABgeV;H2&xFH3+NJH&EJ_twJ?rT?)^@U1g|+{JYs1s%1SW4a(tMyrcr`eyZ33!Km z9G$?m;8M5XirnFSWxnF;<1RY(;2r+-@&BC@6oRZgDCE*D1X-{vl|eVF2@vj^5E z*blwed;}5@w1D5i{S?O(@%tOxta7~f;vJPhYiBF)jUG1Swzz&Dy^+ZOB8ywi>imV{43P`(VV3v5qsl?xzPS~M- zjBfX7+DU)zN7xH$n%2U$t*bQKL&7v(NtzNNWTBg^wi>Ju-C(=B2lr%7Z=QG@ecU2I zEBWWqlZU?b^nq{fR!*MIXB*9rRnKNY{OhmEJ93(OtlX7VwfP~PQw_z$ji37(b{T_> zL2FmhXzieFx4v(mM+|LJCO@rzGWCh1O#EM;O?-jMqUnmyE@MB#~3T36p}UXkc3RI`pxdhHgU9yu}& zVo>QQ2f>H+TL9fsmn=wZ>N+R&UF>EQObI9ackxoYjfZhAKNHFeVq-)b4!?_}XtH>9Cef+p9 zW$b#NXuKdO5GT3s-HXe#cx+%f4xkHqm?oX>q&;O4i0Eu-D^wtS%rwEXhq)pwKWaV~ z$WX1phjnm08oWqyAK7xdTONIK2Pdo@@!Cbqr_v=2?(WIO)}a0($EZC$oOl;~S64YKRgyjWs`y&7C4Bd9I}rC{9?^s0d{lkk4$LvPL|jDqVNH z8yX)si^~6`X~m9f`2wkJTb)ivnr)XC=JkslgpNzsh3bheaEi!XdNu*Lr@Nh)-Zozc zeVPm^qt^3u{Yg=Q%G<=D*WjJ|A&ZN=`=-i{7cBDp`LR diff --git a/crypto/heimdal/kdc/digest.c b/crypto/heimdal/kdc/digest.c --- a/crypto/heimdal/kdc/digest.c +++ b/crypto/heimdal/kdc/digest.c @@ -238,7 +238,7 @@ kdc_log(context, config, 0, "Digest request from %s", from); - ret = krb5_kt_resolve(context, "HDB:", &id); + ret = krb5_kt_resolve(context, "HDBGET:", &id); if (ret) { kdc_log(context, config, 0, "Can't open database for digest"); goto out; @@ -375,8 +375,8 @@ case choice_DigestReqInner_init: { unsigned char server_nonce[16], identifier; - RAND_bytes(&identifier, sizeof(identifier)); - RAND_bytes(server_nonce, sizeof(server_nonce)); + RAND_pseudo_bytes(&identifier, sizeof(identifier)); + RAND_pseudo_bytes(server_nonce, sizeof(server_nonce)); server_nonce[0] = kdc_time & 0xff; server_nonce[1] = (kdc_time >> 8) & 0xff; @@ -406,11 +406,12 @@ if (ireq.u.init.channel) { char *s; + int aret; - asprintf(&s, "%s-%s:%s", r.u.initReply.nonce, - ireq.u.init.channel->cb_type, - ireq.u.init.channel->cb_binding); - if (s == NULL) { + aret = asprintf(&s, "%s-%s:%s", r.u.initReply.nonce, + ireq.u.init.channel->cb_type, + ireq.u.init.channel->cb_binding); + if (aret == -1 || s == NULL) { ret = ENOMEM; krb5_set_error_message(context, ret, "Failed to allocate channel binding"); @@ -427,6 +428,8 @@ } if (strcasecmp(ireq.u.init.type, "CHAP") == 0) { + int aret; + r.u.initReply.identifier = malloc(sizeof(*r.u.initReply.identifier)); if (r.u.initReply.identifier == NULL) { @@ -435,8 +438,8 @@ goto out; } - asprintf(r.u.initReply.identifier, "%02X", identifier & 0xff); - if (*r.u.initReply.identifier == NULL) { + aret = asprintf(r.u.initReply.identifier, "%02X", identifier&0xff); + if (aret == -1 || *r.u.initReply.identifier == NULL) { ret = ENOMEM; krb5_set_error_message(context, ret, "malloc: out of memory"); goto out; @@ -605,7 +608,7 @@ } t = p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); - if (abs((kdc_time & 0xffffffff) - t) > context->max_skew) { + if (labs((kdc_time & 0xffffffff) - t) > context->max_skew) { ret = EINVAL; krb5_set_error_message(context, ret, "time screw in server nonce "); goto out; @@ -798,7 +801,7 @@ } } else if (strcasecmp(ireq.u.digestRequest.type, "MS-CHAP-V2") == 0) { - unsigned char md[SHA_DIGEST_LENGTH], challange[SHA_DIGEST_LENGTH]; + unsigned char md[SHA_DIGEST_LENGTH], challenge[SHA_DIGEST_LENGTH]; krb5_principal clientprincipal = NULL; char *mdx; const char *username; @@ -833,7 +836,7 @@ ctp = EVP_MD_CTX_create(); - /* ChallangeHash */ + /* ChallengeHash */ EVP_DigestInit_ex(ctp, EVP_sha1(), NULL); { ssize_t ssize; @@ -864,7 +867,7 @@ EVP_DigestUpdate(ctp, serverNonce.data, serverNonce.length); EVP_DigestUpdate(ctp, username, strlen(username)); - EVP_DigestFinal_ex(ctp, challange, NULL); + EVP_DigestFinal_ex(ctp, challenge, NULL); EVP_MD_CTX_destroy(ctp); @@ -883,7 +886,7 @@ goto failed; } - ret = hdb_enctype2key(context, &user->entry, + ret = hdb_enctype2key(context, &user->entry, NULL, ETYPE_ARCFOUR_HMAC_MD5, &key); if (ret) { krb5_set_error_message(context, ret, @@ -895,7 +898,7 @@ /* ChallengeResponse */ ret = heim_ntlm_calculate_ntlm1(key->key.keyvalue.data, key->key.keyvalue.length, - challange, &answer); + challenge, &answer); if (ret) { krb5_set_error_message(context, ret, "NTLM missing arcfour key"); goto failed; @@ -946,7 +949,7 @@ EVP_DigestInit_ex(ctxp, EVP_sha1(), NULL); EVP_DigestUpdate(ctxp, md, sizeof(md)); - EVP_DigestUpdate(ctxp, challange, 8); + EVP_DigestUpdate(ctxp, challenge, 8); EVP_DigestUpdate(ctxp, ms_chap_v2_magic2, sizeof(ms_chap_v2_magic2)); EVP_DigestFinal_ex(ctxp, md, NULL); @@ -997,10 +1000,12 @@ } } else { + int aret; + r.element = choice_DigestRepInner_error; - asprintf(&r.u.error.reason, "Unsupported digest type %s", - ireq.u.digestRequest.type); - if (r.u.error.reason == NULL) { + aret = asprintf(&r.u.error.reason, "Unsupported digest type %s", + ireq.u.digestRequest.type); + if (aret == -1 || r.u.error.reason == NULL) { ret = ENOMEM; krb5_set_error_message(context, ret, "malloc: out of memory"); goto out; @@ -1059,15 +1064,15 @@ krb5_set_error_message(context, ret, "malloc: out of memory"); goto out; } - r.u.ntlmInitReply.challange.data = malloc(8); - if (r.u.ntlmInitReply.challange.data == NULL) { + r.u.ntlmInitReply.challenge.data = malloc(8); + if (r.u.ntlmInitReply.challenge.data == NULL) { ret = ENOMEM; krb5_set_error_message(context, ret, "malloc: out of memory"); goto out; } - r.u.ntlmInitReply.challange.length = 8; - if (RAND_bytes(r.u.ntlmInitReply.challange.data, - r.u.ntlmInitReply.challange.length) != 1) + r.u.ntlmInitReply.challenge.length = 8; + if (RAND_bytes(r.u.ntlmInitReply.challenge.data, + r.u.ntlmInitReply.challenge.length) != 1) { ret = ENOMEM; krb5_set_error_message(context, ret, "out of random error"); @@ -1102,10 +1107,10 @@ goto out; } - ret = krb5_storage_write(sp, r.u.ntlmInitReply.challange.data, 8); + ret = krb5_storage_write(sp, r.u.ntlmInitReply.challenge.data, 8); if (ret != 8) { ret = ENOMEM; - krb5_set_error_message(context, ret, "storage write challange"); + krb5_set_error_message(context, ret, "storage write challenge"); goto out; } ret = krb5_store_uint32(sp, r.u.ntlmInitReply.flags); @@ -1139,7 +1144,7 @@ case choice_DigestReqInner_ntlmRequest: { krb5_principal clientprincipal; unsigned char sessionkey[16]; - unsigned char challange[8]; + unsigned char challenge[8]; uint32_t flags; Key *key = NULL; int version; @@ -1188,10 +1193,10 @@ goto out; } - ret = krb5_storage_read(sp, challange, sizeof(challange)); - if (ret != sizeof(challange)) { + ret = krb5_storage_read(sp, challenge, sizeof(challenge)); + if (ret != sizeof(challenge)) { ret = ENOMEM; - krb5_set_error_message(context, ret, "NTLM storage read challange"); + krb5_set_error_message(context, ret, "NTLM storage read challenge"); goto out; } ret = krb5_ret_uint32(sp, &flags); @@ -1209,7 +1214,7 @@ goto out; } - ret = hdb_enctype2key(context, &user->entry, + ret = hdb_enctype2key(context, &user->entry, NULL, ETYPE_ARCFOUR_HMAC_MD5, &key); if (ret) { krb5_set_error_message(context, ret, "NTLM missing arcfour key"); @@ -1243,7 +1248,7 @@ ireq.u.ntlmRequest.username, targetname, 0, - challange, + challenge, &answer, &infotarget, sessionkey); @@ -1284,10 +1289,10 @@ EVP_DigestInit_ex(ctx, EVP_md5(), NULL); - EVP_DigestUpdate(ctx, challange, sizeof(challange)); + EVP_DigestUpdate(ctx, challenge, sizeof(challenge)); EVP_DigestUpdate(ctx, ireq.u.ntlmRequest.lm.data, 8); EVP_DigestFinal_ex(ctx, sessionhash, NULL); - memcpy(challange, sessionhash, sizeof(challange)); + memcpy(challenge, sessionhash, sizeof(challenge)); EVP_MD_CTX_destroy(ctx); @@ -1300,7 +1305,7 @@ ret = heim_ntlm_calculate_ntlm1(key->key.keyvalue.data, key->key.keyvalue.length, - challange, &answer); + challenge, &answer); if (ret) { krb5_set_error_message(context, ret, "NTLM missing arcfour key"); goto failed; @@ -1333,7 +1338,7 @@ if (ireq.u.ntlmRequest.sessionkey) { unsigned char masterkey[MD4_DIGEST_LENGTH]; - EVP_CIPHER_CTX *rc4; + EVP_CIPHER_CTX rc4; size_t len; if ((flags & NTLM_NEG_KEYEX) == 0) { @@ -1354,18 +1359,12 @@ } - rc4 = EVP_CIPHER_CTX_new(); - if (rc4 == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - "NTLM failed to malloc cipher context"); - goto failed; - } - EVP_CipherInit_ex(rc4, EVP_rc4(), NULL, sessionkey, NULL, 1); - EVP_Cipher(rc4, + EVP_CIPHER_CTX_init(&rc4); + EVP_CipherInit_ex(&rc4, EVP_rc4(), NULL, sessionkey, NULL, 1); + EVP_Cipher(&rc4, masterkey, ireq.u.ntlmRequest.sessionkey->data, sizeof(masterkey)); - EVP_CIPHER_CTX_free(rc4); + EVP_CIPHER_CTX_cleanup(&rc4); r.u.ntlmResponse.sessionkey = malloc(sizeof(*r.u.ntlmResponse.sessionkey)); diff --git a/crypto/heimdal/kdc/fast.c b/crypto/heimdal/kdc/fast.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/fast.c @@ -0,0 +1,560 @@ +/* + * Copyright (c) 1997-2011 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 - 2011 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "kdc_locl.h" + +static krb5_error_code +get_fastuser_crypto(kdc_request_t r, krb5_enctype enctype, krb5_crypto *crypto) +{ + krb5_principal fast_princ; + hdb_entry_ex *fast_user = NULL; + Key *cookie_key = NULL; + krb5_error_code ret; + + *crypto = NULL; + + ret = krb5_make_principal(r->context, &fast_princ, + KRB5_WELLKNOWN_ORG_H5L_REALM, + KRB5_WELLKNOWN_NAME, "org.h5l.fast-cookie", NULL); + if (ret) + goto out; + + ret = _kdc_db_fetch(r->context, r->config, fast_princ, + HDB_F_GET_CLIENT, NULL, NULL, &fast_user); + krb5_free_principal(r->context, fast_princ); + if (ret) + goto out; + + if (enctype == KRB5_ENCTYPE_NULL) + ret = _kdc_get_preferred_key(r->context, r->config, fast_user, + "fast-cookie", &enctype, &cookie_key); + else + ret = hdb_enctype2key(r->context, &fast_user->entry, NULL, + enctype, &cookie_key); + if (ret) + goto out; + + ret = krb5_crypto_init(r->context, &cookie_key->key, 0, crypto); + if (ret) + goto out; + + out: + if (fast_user) + _kdc_free_ent(r->context, fast_user); + + return ret; +} + + +static krb5_error_code +fast_parse_cookie(kdc_request_t r, const PA_DATA *pa) +{ + krb5_crypto crypto = NULL; + krb5_error_code ret; + KDCFastCookie data; + krb5_data d1; + size_t len; + + ret = decode_KDCFastCookie(pa->padata_value.data, + pa->padata_value.length, + &data, &len); + if (ret) + return ret; + + if (len != pa->padata_value.length || strcmp("H5L1", data.version) != 0) { + free_KDCFastCookie(&data); + return KRB5KDC_ERR_POLICY; + } + + ret = get_fastuser_crypto(r, data.cookie.etype, &crypto); + if (ret) + goto out; + + ret = krb5_decrypt_EncryptedData(r->context, crypto, + KRB5_KU_H5L_COOKIE, + &data.cookie, &d1); + krb5_crypto_destroy(r->context, crypto); + if (ret) + goto out; + + ret = decode_KDCFastState(d1.data, d1.length, &r->fast, &len); + krb5_data_free(&d1); + if (ret) + goto out; + + if (r->fast.expiration < kdc_time) { + kdc_log(r->context, r->config, 0, "fast cookie expired"); + ret = KRB5KDC_ERR_POLICY; + goto out; + } + + out: + free_KDCFastCookie(&data); + + return ret; +} + +static krb5_error_code +fast_add_cookie(kdc_request_t r, METHOD_DATA *method_data) +{ + krb5_crypto crypto = NULL; + KDCFastCookie shell; + krb5_error_code ret; + krb5_data data; + size_t size; + + memset(&shell, 0, sizeof(shell)); + + r->fast.expiration = kdc_time + FAST_EXPIRATION_TIME; + + ASN1_MALLOC_ENCODE(KDCFastState, data.data, data.length, + &r->fast, &size, ret); + if (ret) + return ret; + heim_assert(size == data.length, "internal asn1 encoder error"); + + ret = get_fastuser_crypto(r, KRB5_ENCTYPE_NULL, &crypto); + if (ret) + goto out; + + ret = krb5_encrypt_EncryptedData(r->context, crypto, + KRB5_KU_H5L_COOKIE, + data.data, data.length, 0, + &shell.cookie); + krb5_crypto_destroy(r->context, crypto); + if (ret) + goto out; + + free(data.data); + + shell.version = "H5L1"; + + ASN1_MALLOC_ENCODE(KDCFastCookie, data.data, data.length, + &shell, &size, ret); + free_EncryptedData(&shell.cookie); + if (ret) + goto out; + heim_assert(size == data.length, "internal asn1 encoder error"); + + ret = krb5_padata_add(r->context, method_data, + KRB5_PADATA_FX_COOKIE, + data.data, data.length); + out: + if (ret) + free(data.data); + return ret; +} + +krb5_error_code +_kdc_fast_mk_response(krb5_context context, + krb5_crypto armor_crypto, + METHOD_DATA *pa_data, + krb5_keyblock *strengthen_key, + KrbFastFinished *finished, + krb5uint32 nonce, + krb5_data *data) +{ + PA_FX_FAST_REPLY fxfastrep; + KrbFastResponse fastrep; + krb5_error_code ret; + krb5_data buf; + size_t size; + + memset(&fxfastrep, 0, sizeof(fxfastrep)); + memset(&fastrep, 0, sizeof(fastrep)); + krb5_data_zero(data); + + if (pa_data) { + fastrep.padata.val = pa_data->val; + fastrep.padata.len = pa_data->len; + } + fastrep.strengthen_key = strengthen_key; + fastrep.finished = finished; + fastrep.nonce = nonce; + + ASN1_MALLOC_ENCODE(KrbFastResponse, buf.data, buf.length, + &fastrep, &size, ret); + if (ret) + return ret; + if (buf.length != size) + krb5_abortx(context, "internal asn.1 error"); + + fxfastrep.element = choice_PA_FX_FAST_REPLY_armored_data; + + ret = krb5_encrypt_EncryptedData(context, + armor_crypto, + KRB5_KU_FAST_REP, + buf.data, + buf.length, + 0, + &fxfastrep.u.armored_data.enc_fast_rep); + krb5_data_free(&buf); + if (ret) + return ret; + + ASN1_MALLOC_ENCODE(PA_FX_FAST_REPLY, data->data, data->length, + &fxfastrep, &size, ret); + free_PA_FX_FAST_REPLY(&fxfastrep); + if (ret) + return ret; + if (data->length != size) + krb5_abortx(context, "internal asn.1 error"); + + return 0; +} + + +krb5_error_code +_kdc_fast_mk_error(krb5_context context, + kdc_request_t r, + METHOD_DATA *error_method, + krb5_crypto armor_crypto, + const KDC_REQ_BODY *req_body, + krb5_error_code outer_error, + const char *e_text, + krb5_principal error_server, + const PrincipalName *error_client_name, + const Realm *error_client_realm, + time_t *csec, int *cusec, + krb5_data *error_msg) +{ + krb5_error_code ret; + krb5_data e_data; + size_t size; + + krb5_data_zero(&e_data); + + if (armor_crypto) { + PA_FX_FAST_REPLY fxfastrep; + KrbFastResponse fastrep; + + memset(&fxfastrep, 0, sizeof(fxfastrep)); + memset(&fastrep, 0, sizeof(fastrep)); + + /* first add the KRB-ERROR to the fast errors */ + + ret = krb5_mk_error_ext(context, + outer_error, + e_text, + NULL, + error_server, + error_client_name, + error_client_realm, + NULL, + NULL, + &e_data); + if (ret) + return ret; + + ret = krb5_padata_add(context, error_method, + KRB5_PADATA_FX_ERROR, + e_data.data, e_data.length); + if (ret) { + krb5_data_free(&e_data); + return ret; + } + + if (/* hide_principal */ 0) { + error_client_name = NULL; + error_client_realm = NULL; + error_server = NULL; + e_text = NULL; + } + + if (r) + ret = fast_add_cookie(r, error_method); + else + ret = krb5_padata_add(context, error_method, + KRB5_PADATA_FX_COOKIE, + NULL, 0); + if (ret) { + kdc_log(r->context, r->config, 0, "failed to add fast cookie with: %d", ret); + free_METHOD_DATA(error_method); + return ret; + } + + ret = _kdc_fast_mk_response(context, armor_crypto, + error_method, NULL, NULL, + req_body->nonce, &e_data); + free_METHOD_DATA(error_method); + if (ret) + return ret; + + ret = krb5_padata_add(context, error_method, + KRB5_PADATA_FX_FAST, + e_data.data, e_data.length); + if (ret) + return ret; + } + + if (error_method && error_method->len) { + ASN1_MALLOC_ENCODE(METHOD_DATA, e_data.data, e_data.length, + error_method, &size, ret); + if (ret) + return ret; + if (e_data.length != size) + krb5_abortx(context, "internal asn.1 error"); + } + + ret = krb5_mk_error_ext(context, + outer_error, + e_text, + (e_data.length ? &e_data : NULL), + error_server, + error_client_name, + error_client_realm, + csec, + cusec, + error_msg); + krb5_data_free(&e_data); + + return ret; +} + +krb5_error_code +_kdc_fast_unwrap_request(kdc_request_t r) +{ + krb5_principal armor_server = NULL; + hdb_entry_ex *armor_user = NULL; + PA_FX_FAST_REQUEST fxreq; + krb5_auth_context ac = NULL; + krb5_ticket *ticket = NULL; + krb5_flags ap_req_options; + Key *armor_key = NULL; + krb5_keyblock armorkey; + krb5_error_code ret; + krb5_ap_req ap_req; + unsigned char *buf = NULL; + KrbFastReq fastreq; + size_t len, size; + krb5_data data; + const PA_DATA *pa; + int i = 0; + + /* + * First look for FX_COOKIE and and process it + */ + pa = _kdc_find_padata(&r->req, &i, KRB5_PADATA_FX_COOKIE); + if (pa) { + ret = fast_parse_cookie(r, pa); + if (ret) + goto out; + } + + i = 0; + pa = _kdc_find_padata(&r->req, &i, KRB5_PADATA_FX_FAST); + if (pa == NULL) + return 0; + + ret = decode_PA_FX_FAST_REQUEST(pa->padata_value.data, + pa->padata_value.length, + &fxreq, + &len); + if (ret) + goto out; + if (len != pa->padata_value.length) { + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + if (fxreq.element != choice_PA_FX_FAST_REQUEST_armored_data) { + kdc_log(r->context, r->config, 0, + "AS-REQ FAST contain unknown type: %d", (int)fxreq.element); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + /* pull out armor key */ + if (fxreq.u.armored_data.armor == NULL) { + kdc_log(r->context, r->config, 0, + "AS-REQ armor missing"); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + if (fxreq.u.armored_data.armor->armor_type != 1) { + kdc_log(r->context, r->config, 0, + "AS-REQ armor type not ap-req"); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + ret = krb5_decode_ap_req(r->context, + &fxreq.u.armored_data.armor->armor_value, + &ap_req); + if(ret) { + kdc_log(r->context, r->config, 0, "AP-REQ decode failed"); + goto out; + } + + /* Save that principal that was in the request */ + ret = _krb5_principalname2krb5_principal(r->context, + &armor_server, + ap_req.ticket.sname, + ap_req.ticket.realm); + if (ret) { + free_AP_REQ(&ap_req); + goto out; + } + + ret = _kdc_db_fetch(r->context, r->config, armor_server, + HDB_F_GET_SERVER, NULL, NULL, &armor_user); + if(ret == HDB_ERR_NOT_FOUND_HERE) { + kdc_log(r->context, r->config, 5, + "armor key does not have secrets at this KDC, " + "need to proxy"); + goto out; + } else if (ret) { + free_AP_REQ(&ap_req); + ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; + goto out; + } + + ret = hdb_enctype2key(r->context, &armor_user->entry, NULL, + ap_req.ticket.enc_part.etype, + &armor_key); + if (ret) { + free_AP_REQ(&ap_req); + goto out; + } + + ret = krb5_verify_ap_req2(r->context, &ac, + &ap_req, + armor_server, + &armor_key->key, + 0, + &ap_req_options, + &ticket, + KRB5_KU_AP_REQ_AUTH); + free_AP_REQ(&ap_req); + if (ret) + goto out; + + if (ac->remote_subkey == NULL) { + krb5_auth_con_free(r->context, ac); + kdc_log(r->context, r->config, 0, + "FAST AP-REQ remote subkey missing"); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + ret = _krb5_fast_armor_key(r->context, + ac->remote_subkey, + &ticket->ticket.key, + &armorkey, + &r->armor_crypto); + krb5_auth_con_free(r->context, ac); + krb5_free_ticket(r->context, ticket); + if (ret) + goto out; + + krb5_free_keyblock_contents(r->context, &armorkey); + + /* verify req-checksum of the outer body */ + + ASN1_MALLOC_ENCODE(KDC_REQ_BODY, buf, len, &r->req.req_body, &size, ret); + if (ret) + goto out; + if (size != len) { + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + ret = krb5_verify_checksum(r->context, r->armor_crypto, + KRB5_KU_FAST_REQ_CHKSUM, + buf, len, + &fxreq.u.armored_data.req_checksum); + if (ret) { + kdc_log(r->context, r->config, 0, + "FAST request have a bad checksum"); + goto out; + } + + ret = krb5_decrypt_EncryptedData(r->context, r->armor_crypto, + KRB5_KU_FAST_ENC, + &fxreq.u.armored_data.enc_fast_req, + &data); + if (ret) { + kdc_log(r->context, r->config, 0, + "Failed to decrypt FAST request"); + goto out; + } + + ret = decode_KrbFastReq(data.data, data.length, &fastreq, &size); + if (ret) { + krb5_data_free(&data); + goto out; + } + if (data.length != size) { + krb5_data_free(&data); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + krb5_data_free(&data); + + free_KDC_REQ_BODY(&r->req.req_body); + ret = copy_KDC_REQ_BODY(&fastreq.req_body, &r->req.req_body); + if (ret) + goto out; + + /* check for unsupported mandatory options */ + if (FastOptions2int(fastreq.fast_options) & 0xfffc) { + kdc_log(r->context, r->config, 0, + "FAST unsupported mandatory option set"); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + /* KDC MUST ignore outer pa data preauth-14 - 6.5.5 */ + if (r->req.padata) + free_METHOD_DATA(r->req.padata); + else + ALLOC(r->req.padata); + + ret = copy_METHOD_DATA(&fastreq.padata, r->req.padata); + if (ret) + goto out; + + free_KrbFastReq(&fastreq); + free_PA_FX_FAST_REQUEST(&fxreq); + + out: + if (armor_server) + krb5_free_principal(r->context, armor_server); + if(armor_user) + _kdc_free_ent(r->context, armor_user); + + return ret; +} diff --git a/crypto/heimdal/kdc/headers.h b/crypto/heimdal/kdc/headers.h --- a/crypto/heimdal/kdc/headers.h +++ b/crypto/heimdal/kdc/headers.h @@ -47,6 +47,9 @@ #include #include #include +#ifdef HAVE_UNISTD_H +#include +#endif #ifdef HAVE_SYS_TYPES_H #include #endif @@ -106,6 +109,8 @@ #include #include +#include + #undef ALLOC #define ALLOC(X) ((X) = calloc(1, sizeof(*(X)))) #undef ALLOC_SEQ diff --git a/crypto/heimdal/kdc/hprop-version.rc b/crypto/heimdal/kdc/hprop-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/hprop-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "KDC Database Propagation Tool" +#define RC_FILE_ORIG_0409 "hprop.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kdc/hprop.h b/crypto/heimdal/kdc/hprop.h --- a/crypto/heimdal/kdc/hprop.h +++ b/crypto/heimdal/kdc/hprop.h @@ -46,7 +46,7 @@ #define HPROP_VERSION "hprop-0.0" #define HPROP_NAME "hprop" -#define HPROP_KEYTAB "HDB:" +#define HPROP_KEYTAB "HDBGET:" #define HPROP_PORT 754 #ifndef NEVERDATE diff --git a/crypto/heimdal/kdc/hprop.8 b/crypto/heimdal/kdc/hprop.8 --- a/crypto/heimdal/kdc/hprop.8 +++ b/crypto/heimdal/kdc/hprop.8 @@ -115,7 +115,8 @@ encrypted with a master key. This option transmits the database with unencrypted keys. .It Fl E , Fl Fl encrypt -This option transmits the database with encrypted keys. +This option transmits the database with encrypted keys. This is the +default if no option is supplied. .It Fl n , Fl Fl stdout Dump the database on stdout, in a format that can be fed to hpropd. .El diff --git a/crypto/heimdal/kdc/hprop.c b/crypto/heimdal/kdc/hprop.c --- a/crypto/heimdal/kdc/hprop.c +++ b/crypto/heimdal/kdc/hprop.c @@ -161,7 +161,7 @@ krb5_preauthtype preauth = KRB5_PADATA_ENC_TIMESTAMP; krb5_creds creds; - ret = krb5_kt_register(context, &hdb_kt_ops); + ret = krb5_kt_register(context, &hdb_get_kt_ops); if(ret) krb5_err(context, 1, ret, "krb5_kt_register"); ret = krb5_kt_resolve(context, ktname, &keytab); @@ -341,7 +341,6 @@ if(ret) { failed++; krb5_warn(context, ret, "krb5_sendauth (%s)", host); - close(fd); goto next_host; } diff --git a/crypto/heimdal/kdc/hprop.cat8 b/crypto/heimdal/kdc/hprop.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/hprop.cat8 @@ -0,0 +1,67 @@ +HPROP(8) BSD System Manager's Manual HPROP(8) + +NAME + hprop -- propagate the KDC database + +SYNOPSIS + hprop [-m file | --master-key=file] [-d file | --database=file] + [--source=heimdal|mit-dump] [-r string | --v4-realm=string] [-c + cell | --cell=cell] [-k keytab | --keytab=keytab] [-R string | + --v5-realm=string] [-D | --decrypt] [-E | --encrypt] + [-n | --stdout] [-v | --verbose] [--version] [-h | --help] + [host[:port]] ... + +DESCRIPTION + hprop takes a principal database in a specified format and converts it + into a stream of Heimdal database records. This stream can either be + written to standard out, or (more commonly) be propagated to a hpropd(8) + server running on a different machine. + + If propagating, it connects to all hosts specified on the command by + opening a TCP connection to port 754 (service hprop) and sends the data- + base in encrypted form. + + Supported options: + + -m file, --master-key=file + Where to find the master key to encrypt or decrypt keys with. + + -d file, --database=file + The database to be propagated. + + --source=heimdal|mit-dump|krb4-dump|kaserver + Specifies the type of the source database. Alternatives include: + + heimdal a Heimdal database + mit-dump a MIT Kerberos 5 dump file + +.It Fl k Ar keytab , Fl Fl keytab= Ns Ar keytab The keytab to + use for fetching the key to be used for authenticating to the + propagation daemon(s). The key hprop/hostname is used from this + keytab. The default is to fetch the key from the KDC database. + + -R string, --v5-realm=string + Local realm override. + + -D, --decrypt + The encryption keys in the database can either be in clear, or + encrypted with a master key. This option transmits the database + with unencrypted keys. + + -E, --encrypt + This option transmits the database with encrypted keys. This is + the default if no option is supplied. + + -n, --stdout + Dump the database on stdout, in a format that can be fed to + hpropd. + +EXAMPLES + The following will propagate a database to another machine (which should + run hpropd(8)): + + $ hprop slave-1 slave-2 + +SEE ALSO + hpropd(8) + +HEIMDAL December 8, 2004 HEIMDAL diff --git a/crypto/heimdal/kdc/hpropd-version.rc b/crypto/heimdal/kdc/hpropd-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/hpropd-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Propagated KDC database recipient" +#define RC_FILE_ORIG_0409 "hpropd.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kdc/hpropd.c b/crypto/heimdal/kdc/hpropd.c --- a/crypto/heimdal/kdc/hpropd.c +++ b/crypto/heimdal/kdc/hpropd.c @@ -85,23 +85,23 @@ setprogname(argv[0]); ret = krb5_init_context(&context); - if(ret) + if (ret) exit(1); ret = krb5_openlog(context, "hpropd", &fac); - if(ret) + if (ret) errx(1, "krb5_openlog"); krb5_set_warn_dest(context, fac); - if(getarg(args, num_args, argc, argv, &optidx)) + if (getarg(args, num_args, argc, argv, &optidx)) usage(1); - if(local_realm != NULL) + if (local_realm != NULL) krb5_set_default_realm(context, local_realm); - if(help_flag) + if (help_flag) usage(0); - if(version_flag) { + if (version_flag) { print_version(NULL); exit(0); } @@ -117,7 +117,7 @@ if (database == NULL) database = hdb_default_db(context); - if(from_stdin) { + if (from_stdin) { sock = STDIN_FILENO; } else { struct sockaddr_storage ss; @@ -145,7 +145,7 @@ HPROP_PORT), &sock); } sin_len = sizeof(ss); - if(getpeername(sock, sa, &sin_len) < 0) + if (getpeername(sock, sa, &sin_len) < 0) krb5_err(context, 1, errno, "getpeername"); if (inet_ntop(sa->sa_family, @@ -157,8 +157,8 @@ krb5_log(context, fac, 0, "Connection from %s", addr_name); - ret = krb5_kt_register(context, &hdb_kt_ops); - if(ret) + ret = krb5_kt_register(context, &hdb_get_kt_ops); + if (ret) krb5_err(context, 1, ret, "krb5_kt_register"); if (ktname != NULL) { @@ -173,7 +173,7 @@ ret = krb5_recvauth(context, &ac, &sock, HPROP_VERSION, NULL, 0, keytab, &ticket); - if(ret) + if (ret) krb5_err(context, 1, ret, "krb5_recvauth"); ret = krb5_unparse_name(context, ticket->server, &server); @@ -186,15 +186,15 @@ krb5_free_ticket (context, ticket); ret = krb5_auth_con_getauthenticator(context, ac, &authent); - if(ret) + if (ret) krb5_err(context, 1, ret, "krb5_auth_con_getauthenticator"); ret = krb5_make_principal(context, &c1, NULL, "kadmin", "hprop", NULL); - if(ret) + if (ret) krb5_err(context, 1, ret, "krb5_make_principal"); _krb5_principalname2krb5_principal(context, &c2, authent->cname, authent->crealm); - if(!krb5_principal_compare(context, c1, c2)) { + if (!krb5_principal_compare(context, c1, c2)) { char *s; ret = krb5_unparse_name(context, c2, &s); if (ret) @@ -205,48 +205,52 @@ krb5_free_principal(context, c2); ret = krb5_kt_close(context, keytab); - if(ret) + if (ret) krb5_err(context, 1, ret, "krb5_kt_close"); } - if(!print_dump) { - asprintf(&tmp_db, "%s~", database); + if (!print_dump) { + int aret; + + aret = asprintf(&tmp_db, "%s~", database); + if (aret == -1) + krb5_errx(context, 1, "hdb_create: out of memory"); ret = hdb_create(context, &db, tmp_db); - if(ret) + if (ret) krb5_err(context, 1, ret, "hdb_create(%s)", tmp_db); ret = db->hdb_open(context, db, O_RDWR | O_CREAT | O_TRUNC, 0600); - if(ret) + if (ret) krb5_err(context, 1, ret, "hdb_open(%s)", tmp_db); } nprincs = 0; - while(1){ + while (1){ krb5_data data; hdb_entry_ex entry; - if(from_stdin) { + if (from_stdin) { ret = krb5_read_message(context, &sock, &data); - if(ret != 0 && ret != HEIM_ERR_EOF) + if (ret != 0 && ret != HEIM_ERR_EOF) krb5_err(context, 1, ret, "krb5_read_message"); } else { ret = krb5_read_priv_message(context, ac, &sock, &data); - if(ret) + if (ret) krb5_err(context, 1, ret, "krb5_read_priv_message"); } - if(ret == HEIM_ERR_EOF || data.length == 0) { - if(!from_stdin) { + if (ret == HEIM_ERR_EOF || data.length == 0) { + if (!from_stdin) { data.data = NULL; data.length = 0; krb5_write_priv_message(context, ac, &sock, &data); } - if(!print_dump) { + if (!print_dump) { ret = db->hdb_close(context, db); - if(ret) + if (ret) krb5_err(context, 1, ret, "db_close"); ret = db->hdb_rename(context, db, database); - if(ret) + if (ret) krb5_err(context, 1, ret, "db_rename"); } break; @@ -254,20 +258,24 @@ memset(&entry, 0, sizeof(entry)); ret = hdb_value2entry(context, &data, &entry.entry); krb5_data_free(&data); - if(ret) + if (ret) krb5_err(context, 1, ret, "hdb_value2entry"); - if(print_dump) - hdb_print_entry(context, db, &entry, stdout); - else { + if (print_dump) { + struct hdb_print_entry_arg parg; + + parg.out = stdout; + parg.fmt = HDB_DUMP_HEIMDAL; + hdb_print_entry(context, db, &entry, &parg); + } else { ret = db->hdb_store(context, db, 0, &entry); - if(ret == HDB_ERR_EXISTS) { + if (ret == HDB_ERR_EXISTS) { char *s; ret = krb5_unparse_name(context, entry.entry.principal, &s); if (ret) s = strdup(unparseable_name); krb5_warnx(context, "Entry exists: %s", s); free(s); - } else if(ret) + } else if (ret) krb5_err(context, 1, ret, "db_store"); else nprincs++; diff --git a/crypto/heimdal/kdc/hpropd.cat8 b/crypto/heimdal/kdc/hpropd.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/hpropd.cat8 @@ -0,0 +1,43 @@ +HPROPD(8) BSD System Manager's Manual HPROPD(8) + +NAME + hpropd -- receive a propagated database + +SYNOPSIS + hpropd [-d file | --database=file] [-n | --stdin] [--print] + [-i | --no-inetd] [-k keytab | --keytab=keytab] [-4 | --v4dump] + +DESCRIPTION + hpropd receives a database sent by hprop. and writes it as a local data- + base. + + By default, hpropd expects to be started from inetd if stdin is a socket + and expects to receive the dumped database over stdin otherwise. If the + database is sent over the network, it is authenticated and encrypted. + Only connections authenticated with the principal kadmin/hprop are ac- + cepted. + + Options supported: + + -d file, --database=file + database + + -n, --stdin + read from stdin + + --print + print dump to stdout + + -i, --no-inetd + not started from inetd + + -k keytab, --keytab=keytab + keytab to use for authentication + + -4, --v4dump + create v4 type DB + +SEE ALSO + hprop(8) + +HEIMDAL August 27, 1997 HEIMDAL diff --git a/crypto/heimdal/kdc/kdc-private.h b/crypto/heimdal/kdc/kdc-private.h --- a/crypto/heimdal/kdc/kdc-private.h +++ b/crypto/heimdal/kdc/kdc-private.h @@ -10,7 +10,7 @@ krb5_kdc_configuration */*config*/, hdb_entry_ex */*krbtgt*/, krb5_enctype /*enctype*/, - krb5_principal /*client*/, + krb5_const_principal /*client*/, krb5_const_principal /*server*/, krb5_principals /*principals*/, EncTicketPart */*tkt*/); @@ -24,10 +24,7 @@ krb5_error_code _kdc_as_rep ( - krb5_context /*context*/, - krb5_kdc_configuration */*config*/, - KDC_REQ */*req*/, - const krb5_data */*req_buffer*/, + kdc_request_t /*r*/, krb5_data */*reply*/, const char */*from*/, struct sockaddr */*from_addr*/, @@ -42,7 +39,7 @@ hdb_entry_ex */*server_ex*/, const char */*server_name*/, KDC_REQ */*req*/, - krb5_data */*e_data*/); + METHOD_DATA */*method_data*/); krb5_boolean _kdc_check_addresses ( @@ -51,6 +48,13 @@ HostAddresses */*addresses*/, const struct sockaddr */*from*/); +krb5_error_code +_kdc_check_anon_policy ( + krb5_context /*context*/, + krb5_kdc_configuration */*config*/, + hdb_entry_ex */*client*/, + hdb_entry_ex */*server*/); + krb5_error_code _kdc_db_fetch ( krb5_context /*context*/, @@ -83,8 +87,10 @@ _kdc_encode_reply ( krb5_context /*context*/, krb5_kdc_configuration */*config*/, + krb5_crypto /*armor_crypto*/, + uint32_t /*nonce*/, KDC_REP */*rep*/, - const EncTicketPart */*et*/, + EncTicketPart */*et*/, EncKDCRepPart */*ek*/, krb5_enctype /*etype*/, int /*skvno*/, @@ -95,6 +101,35 @@ const char **/*e_text*/, krb5_data */*reply*/); +krb5_error_code +_kdc_fast_mk_error ( + krb5_context /*context*/, + kdc_request_t /*r*/, + METHOD_DATA */*error_method*/, + krb5_crypto /*armor_crypto*/, + const KDC_REQ_BODY */*req_body*/, + krb5_error_code /*outer_error*/, + const char */*e_text*/, + krb5_principal /*error_server*/, + const PrincipalName */*error_client_name*/, + const Realm */*error_client_realm*/, + time_t */*csec*/, + int */*cusec*/, + krb5_data */*error_msg*/); + +krb5_error_code +_kdc_fast_mk_response ( + krb5_context /*context*/, + krb5_crypto /*armor_crypto*/, + METHOD_DATA */*pa_data*/, + krb5_keyblock */*strengthen_key*/, + KrbFastFinished */*finished*/, + krb5uint32 /*nonce*/, + krb5_data */*data*/); + +krb5_error_code +_kdc_fast_unwrap_request (kdc_request_t /*r*/); + krb5_error_code _kdc_find_etype ( krb5_context /*context*/, @@ -120,6 +155,21 @@ krb5_context /*context*/, hdb_entry_ex */*ent*/); +krb5_error_code +_kdc_generate_ecdh_keyblock ( + krb5_context /*context*/, + void */*ec_key_pk*/, + void **/*ec_key_key*/, + unsigned char **/*dh_gen_key*/, + size_t */*dh_gen_keylen*/); + +krb5_error_code +_kdc_get_ecdh_param ( + krb5_context /*context*/, + krb5_kdc_configuration */*config*/, + SubjectPublicKeyInfo */*dh_key_info*/, + void **/*out*/); + krb5_error_code _kdc_get_preferred_key ( krb5_context /*context*/, @@ -129,10 +179,13 @@ krb5_enctype */*enctype*/, Key **/*key*/); +krb5_boolean +_kdc_is_anon_request (const KDC_REQ */*req*/); + krb5_boolean _kdc_is_anonymous ( krb5_context /*context*/, - krb5_principal /*principal*/); + krb5_const_principal /*principal*/); krb5_boolean _kdc_is_weak_exception ( @@ -178,6 +231,12 @@ pk_client_params */*cp*/, char **/*subject_name*/); +void +_kdc_pk_free_client_ec_param ( + krb5_context /*context*/, + void */*ec_key_pk*/, + void */*ec_key_key*/); + void _kdc_pk_free_client_param ( krb5_context /*context*/, @@ -192,7 +251,7 @@ krb5_enctype /*sessionetype*/, const KDC_REQ */*req*/, const krb5_data */*req_buffer*/, - krb5_keyblock **/*reply_key*/, + krb5_keyblock */*reply_key*/, krb5_keyblock */*sessionkey*/, METHOD_DATA */*md*/); @@ -205,6 +264,13 @@ hdb_entry_ex */*client*/, pk_client_params **/*ret_params*/); +krb5_error_code +_kdc_serialize_ecdh_key ( + krb5_context /*context*/, + void */*key*/, + unsigned char **/*out*/, + size_t */*out_len*/); + krb5_error_code _kdc_tgs_rep ( krb5_context /*context*/, diff --git a/crypto/heimdal/kdc/kdc-protos.h b/crypto/heimdal/kdc/kdc-protos.h --- a/crypto/heimdal/kdc/kdc-protos.h +++ b/crypto/heimdal/kdc/kdc-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __kdc_protos_h__ #define __kdc_protos_h__ +#ifndef DOXY #include @@ -18,6 +19,12 @@ const char */*server_name*/, krb5_boolean /*is_as_req*/); +krb5_error_code +kdc_kx509_verify_service_principal ( + krb5_context /*context*/, + const char */*cname*/, + krb5_principal /*sprincipal*/); + void kdc_log ( krb5_context /*context*/, @@ -114,4 +121,5 @@ } #endif +#endif /* DOXY */ #endif /* __kdc_protos_h__ */ diff --git a/crypto/heimdal/kdc/kdc-replay.c b/crypto/heimdal/kdc/kdc-replay.c --- a/crypto/heimdal/kdc/kdc-replay.c +++ b/crypto/heimdal/kdc/kdc-replay.c @@ -37,11 +37,11 @@ static int help_flag; struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 'h', arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL } }; -const static int num_args = sizeof(args) / sizeof(args[0]); +static const int num_args = sizeof(args) / sizeof(args[0]); static void usage(int ret) diff --git a/crypto/heimdal/kdc/kdc-tester.c b/crypto/heimdal/kdc/kdc-tester.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/kdc-tester.c @@ -0,0 +1,508 @@ +/* + * Copyright (c) 1997-2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "kdc_locl.h" +#include "send_to_kdc_plugin.h" + +struct perf { + unsigned long as_req; + unsigned long tgs_req; + struct timeval start; + struct timeval stop; + struct perf *next; +} *ptop; + +int detach_from_console = -1; +int daemon_child = -1; +int do_bonjour = -1; + +static krb5_kdc_configuration *kdc_config; +static krb5_context kdc_context; + +static struct sockaddr_storage sa; +static const char *astr = "0.0.0.0"; + +static void eval_object(heim_object_t); + + +/* + * + */ + +static krb5_error_code +plugin_init(krb5_context context, void **pctx) +{ + *pctx = NULL; + return 0; +} + +static void +plugin_fini(void *ctx) +{ +} + +static krb5_error_code +plugin_send_to_kdc(krb5_context context, + void *ctx, + krb5_krbhst_info *ho, + time_t timeout, + const krb5_data *in, + krb5_data *out) +{ + return KRB5_PLUGIN_NO_HANDLE; +} + +static krb5_error_code +plugin_send_to_realm(krb5_context context, + void *ctx, + krb5_const_realm realm, + time_t timeout, + const krb5_data *in, + krb5_data *out) +{ + int ret; + + krb5_kdc_update_time(NULL); + + ret = krb5_kdc_process_request(kdc_context, kdc_config, + in->data, in->length, + out, NULL, astr, + (struct sockaddr *)&sa, 0); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_kdc_process_request"); + + return 0; +} + +static krb5plugin_send_to_kdc_ftable send_to_kdc = { + KRB5_PLUGIN_SEND_TO_KDC_VERSION_2, + plugin_init, + plugin_fini, + plugin_send_to_kdc, + plugin_send_to_realm +}; + +static void +perf_start(struct perf *perf) +{ + memset(perf, 0, sizeof(*perf)); + + gettimeofday(&perf->start, NULL); + perf->next = ptop; + ptop = perf; +} + +static void +perf_stop(struct perf *perf) +{ + gettimeofday(&perf->stop, NULL); + ptop = perf->next; + + if (ptop) { + ptop->as_req += perf->as_req; + ptop->tgs_req += perf->tgs_req; + } + + timevalsub(&perf->stop, &perf->start); + printf("time: %lu.%06lu\n", + (unsigned long)perf->stop.tv_sec, + (unsigned long)perf->stop.tv_usec); + +#define USEC_PER_SEC 1000000 + + if (perf->as_req) { + double as_ps = 0.0; + as_ps = (perf->as_req * USEC_PER_SEC) / (double)((perf->stop.tv_sec * USEC_PER_SEC) + perf->stop.tv_usec); + printf("as-req/s %.2lf (total %lu requests)\n", as_ps, perf->as_req); + } + + if (perf->tgs_req) { + double tgs_ps = 0.0; + tgs_ps = (perf->tgs_req * USEC_PER_SEC) / (double)((perf->stop.tv_sec * USEC_PER_SEC) + perf->stop.tv_usec); + printf("tgs-req/s %.2lf (total %lu requests)\n", tgs_ps, perf->tgs_req); + } +} + +/* + * + */ + +static void +eval_repeat(heim_dict_t o) +{ + heim_object_t or = heim_dict_get_value(o, HSTR("value")); + heim_number_t n = heim_dict_get_value(o, HSTR("num")); + int i, num; + struct perf perf; + + perf_start(&perf); + + heim_assert(or != NULL, "value missing"); + heim_assert(n != NULL, "num missing"); + + num = heim_number_get_int(n); + heim_assert(num >= 0, "num >= 0"); + + for (i = 0; i < num; i++) + eval_object(or); + + perf_stop(&perf); +} + +/* + * + */ + +static krb5_error_code +copy_keytab(krb5_context context, krb5_keytab from, krb5_keytab to) +{ + krb5_keytab_entry entry; + krb5_kt_cursor cursor; + krb5_error_code ret; + + ret = krb5_kt_start_seq_get(context, from, &cursor); + if (ret) + return ret; + while((ret = krb5_kt_next_entry(context, from, &entry, &cursor)) == 0){ + krb5_kt_add_entry(context, to, &entry); + krb5_kt_free_entry(context, &entry); + } + return krb5_kt_end_seq_get(context, from, &cursor); +} + +/* + * + */ + +static void +eval_kinit(heim_dict_t o) +{ + heim_string_t user, password, keytab, fast_armor_cc, pk_user_id, ccache; + krb5_get_init_creds_opt *opt; + krb5_init_creds_context ctx; + krb5_principal client; + krb5_keytab ktmem = NULL; + krb5_ccache fast_cc = NULL; + krb5_error_code ret; + + if (ptop) + ptop->as_req++; + + user = heim_dict_get_value(o, HSTR("client")); + if (user == NULL) + krb5_errx(kdc_context, 1, "no client"); + + password = heim_dict_get_value(o, HSTR("password")); + keytab = heim_dict_get_value(o, HSTR("keytab")); + pk_user_id = heim_dict_get_value(o, HSTR("pkinit-user-cert-id")); + if (password == NULL && keytab == NULL && pk_user_id == NULL) + krb5_errx(kdc_context, 1, "password, keytab, nor PKINIT user cert ID"); + + ccache = heim_dict_get_value(o, HSTR("ccache")); + + ret = krb5_parse_name(kdc_context, heim_string_get_utf8(user), &client); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_unparse_name"); + + /* PKINIT parts */ + ret = krb5_get_init_creds_opt_alloc (kdc_context, &opt); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_get_init_creds_opt_alloc"); + + if (pk_user_id) { + heim_bool_t rsaobj = heim_dict_get_value(o, HSTR("pkinit-use-rsa")); + int use_rsa = rsaobj ? heim_bool_val(rsaobj) : 0; + + ret = krb5_get_init_creds_opt_set_pkinit(kdc_context, opt, + client, + heim_string_get_utf8(pk_user_id), + NULL, NULL, NULL, + use_rsa ? 2 : 0, + NULL, NULL, NULL); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_get_init_creds_opt_set_pkinit"); + } + + ret = krb5_init_creds_init(kdc_context, client, NULL, NULL, 0, opt, &ctx); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_init_creds_init"); + + fast_armor_cc = heim_dict_get_value(o, HSTR("fast-armor-cc")); + if (fast_armor_cc) { + + ret = krb5_cc_resolve(kdc_context, heim_string_get_utf8(fast_armor_cc), &fast_cc); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_cc_resolve"); + + ret = krb5_init_creds_set_fast_ccache(kdc_context, ctx, fast_cc); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_init_creds_set_fast_ccache"); + } + + if (password) { + ret = krb5_init_creds_set_password(kdc_context, ctx, + heim_string_get_utf8(password)); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_init_creds_set_password"); + } + if (keytab) { + krb5_keytab kt = NULL; + + ret = krb5_kt_resolve(kdc_context, heim_string_get_utf8(keytab), &kt); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_kt_resolve"); + + ret = krb5_kt_resolve(kdc_context, "MEMORY:keytab", &ktmem); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_kt_resolve(MEMORY)"); + + ret = copy_keytab(kdc_context, kt, ktmem); + if (ret) + krb5_err(kdc_context, 1, ret, "copy_keytab"); + + krb5_kt_close(kdc_context, kt); + + ret = krb5_init_creds_set_keytab(kdc_context, ctx, ktmem); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_init_creds_set_keytab"); + } + + ret = krb5_init_creds_get(kdc_context, ctx); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_init_creds_get"); + + if (ccache) { + const char *name = heim_string_get_utf8(ccache); + krb5_creds cred; + krb5_ccache cc; + + ret = krb5_init_creds_get_creds(kdc_context, ctx, &cred); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_init_creds_get_creds"); + + ret = krb5_cc_resolve(kdc_context, name, &cc); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_cc_resolve"); + + krb5_init_creds_store(kdc_context, ctx, cc); + + ret = krb5_cc_close(kdc_context, cc); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_cc_close"); + + krb5_free_cred_contents(kdc_context, &cred); + } + + krb5_init_creds_free(kdc_context, ctx); + + if (ktmem) + krb5_kt_close(kdc_context, ktmem); + if (fast_cc) + krb5_cc_close(kdc_context, fast_cc); +} + +/* + * + */ + +static void +eval_kgetcred(heim_dict_t o) +{ + heim_string_t server, ccache; + krb5_get_creds_opt opt; + heim_bool_t nostore; + krb5_error_code ret; + krb5_ccache cc = NULL; + krb5_principal s; + krb5_creds *out = NULL; + + if (ptop) + ptop->tgs_req++; + + server = heim_dict_get_value(o, HSTR("server")); + if (server == NULL) + krb5_errx(kdc_context, 1, "no server"); + + ccache = heim_dict_get_value(o, HSTR("ccache")); + if (ccache == NULL) + krb5_errx(kdc_context, 1, "no ccache"); + + nostore = heim_dict_get_value(o, HSTR("nostore")); + if (nostore == NULL) + nostore = heim_bool_create(1); + + ret = krb5_cc_resolve(kdc_context, heim_string_get_utf8(ccache), &cc); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_cc_resolve"); + + ret = krb5_parse_name(kdc_context, heim_string_get_utf8(server), &s); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_parse_name"); + + ret = krb5_get_creds_opt_alloc(kdc_context, &opt); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_get_creds_opt_alloc"); + + if (heim_bool_val(nostore)) + krb5_get_creds_opt_add_options(kdc_context, opt, KRB5_GC_NO_STORE); + + ret = krb5_get_creds(kdc_context, opt, cc, s, &out); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_get_creds"); + + krb5_free_creds(kdc_context, out); + krb5_free_principal(kdc_context, s); + krb5_get_creds_opt_free(kdc_context, opt); + krb5_cc_close(kdc_context, cc); +} + + +/* + * + */ + +static void +eval_kdestroy(heim_dict_t o) +{ + heim_string_t ccache = heim_dict_get_value(o, HSTR("ccache"));; + krb5_error_code ret; + const char *name; + krb5_ccache cc; + + heim_assert(ccache != NULL, "ccache_missing"); + + name = heim_string_get_utf8(ccache); + + ret = krb5_cc_resolve(kdc_context, name, &cc); + if (ret) + krb5_err(kdc_context, 1, ret, "krb5_cc_resolve"); + + krb5_cc_destroy(kdc_context, cc); +} + + +/* + * + */ + +static void +eval_array_element(heim_object_t o, void *ptr, int *stop) +{ + eval_object(o); +} + +static void +eval_object(heim_object_t o) +{ + heim_tid_t t = heim_get_tid(o); + + if (t == heim_array_get_type_id()) { + heim_array_iterate_f(o, NULL, eval_array_element); + } else if (t == heim_dict_get_type_id()) { + const char *op = heim_dict_get_value(o, HSTR("op")); + + heim_assert(op != NULL, "op missing"); + + if (strcmp(op, "repeat") == 0) { + eval_repeat(o); + } else if (strcmp(op, "kinit") == 0) { + eval_kinit(o); + } else if (strcmp(op, "kgetcred") == 0) { + eval_kgetcred(o); + } else if (strcmp(op, "kdestroy") == 0) { + eval_kdestroy(o); + } else { + errx(1, "unsupported ops %s", op); + } + + } else + errx(1, "unsupported"); +} + + +int +main(int argc, char **argv) +{ + krb5_error_code ret; + int optidx = 0; + + setprogname(argv[0]); + + ret = krb5_init_context(&kdc_context); + if (ret == KRB5_CONFIG_BADFORMAT) + errx (1, "krb5_init_context failed to parse configuration file"); + else if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + ret = krb5_kt_register(kdc_context, &hdb_get_kt_ops); + if (ret) + errx (1, "krb5_kt_register(HDB) failed: %d", ret); + + kdc_config = configure(kdc_context, argc, argv, &optidx); + + argc -= optidx; + argv += optidx; + + if (argc == 0) + errx(1, "missing operations"); + + krb5_plugin_register(kdc_context, PLUGIN_TYPE_DATA, + KRB5_PLUGIN_SEND_TO_KDC, &send_to_kdc); + + { + void *buf; + size_t size; + heim_object_t o; + + if (rk_undumpdata(argv[0], &buf, &size)) + errx(1, "undumpdata: %s", argv[0]); + + o = heim_json_create_with_bytes(buf, size, 10, 0, NULL); + free(buf); + if (o == NULL) + errx(1, "heim_json"); + + /* + * do the work here + */ + + eval_object(o); + + heim_release(o); + } + + krb5_free_context(kdc_context); + return 0; +} diff --git a/crypto/heimdal/kdc/kdc-version.rc b/crypto/heimdal/kdc/kdc-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/kdc-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Heimdal Kerberos v5 Server" +#define RC_FILE_ORIG_0409 "kdc.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kdc/kdc.h b/crypto/heimdal/kdc/kdc.h --- a/crypto/heimdal/kdc/kdc.h +++ b/crypto/heimdal/kdc/kdc.h @@ -57,6 +57,8 @@ struct HDB **db; int num_db; + int num_kdc_processes; + krb5_boolean encode_as_rep_as_tgs_rep; /* bug compatibility */ krb5_boolean tgt_use_strongest_session_key; @@ -67,6 +69,8 @@ krb5_boolean check_ticket_addresses; krb5_boolean allow_null_ticket_addresses; krb5_boolean allow_anonymous; + krb5_boolean historical_anon_realm; + krb5_boolean strict_nametypes; enum krb5_kdc_trpolicy trpolicy; krb5_boolean enable_pkinit; diff --git a/crypto/heimdal/kdc/kdc.8 b/crypto/heimdal/kdc/kdc.8 --- a/crypto/heimdal/kdc/kdc.8 +++ b/crypto/heimdal/kdc/kdc.8 @@ -47,9 +47,6 @@ .Op Fl p | Fl Fl no-require-preauth .Op Fl Fl max-request= Ns Ar size .Op Fl H | Fl Fl enable-http -.Op Fl Fl no-524 -.Op Fl Fl kerberos4 -.Op Fl Fl kerberos4-cross-realm .Oo Fl r Ar string \*(Ba Xo .Fl Fl v4-realm= Ns Ar string .Xc @@ -76,7 +73,7 @@ .Pa /var/heimdal/kdc.conf . This is the only value that can't be specified in the config file. .It Fl p , Fl Fl no-require-preauth -Turn off the requirement for pre-authentication in the initial AS-REQ +Turn off the requirement for pre-autentication in the initial AS-REQ for all principals. The use of pre-authentication makes it more difficult to do offline password attacks. @@ -84,7 +81,7 @@ that don't support pre-authentication. Since the version 4 protocol doesn't support any pre-authentication, serving version 4 clients is just about the same as not requiring -pre-authentication. +pre-athentication. The default is to require pre-authentication. Adding the require-preauth per principal is a more flexible way of handling this. @@ -93,14 +90,6 @@ willing to handle. .It Fl H , Fl Fl enable-http Makes the kdc listen on port 80 and handle requests encapsulated in HTTP. -.It Fl Fl no-524 -don't respond to 524 requests -.It Fl Fl kerberos4 -respond to Kerberos 4 requests -.It Fl Fl kerberos4-cross-realm -respond to Kerberos 4 requests from foreign realms. -This is a known security hole and should not be enabled unless you -understand the consequences and are willing to live with them. .It Fl r Ar string , Fl Fl v4-realm= Ns Ar string What realm this server should act as when dealing with version 4 requests. @@ -124,7 +113,7 @@ .It Fl Fl detach detach from pty and run as a daemon. .It Fl Fl disable-des -disable add des encryption types, makes the kdc not use them. +disable all des encryption types, makes the kdc not use them. .El .Pp All activities are logged to one or more destinations, see @@ -166,6 +155,19 @@ This option is only relevant when check-ticket-addresses is TRUE. .It Li allow-anonymous = Va boolean Permit anonymous tickets with no addresses. +.It Li historical_anon_realm = Va boolean +Enables pre-7.0 non-RFC-comformant KDC behavior. +With this option set to +.Li true +the client realm in anonymous pkinit AS replies will be the requested realm, +rather than the RFC-conformant +.Li WELLKNOWN:ANONYMOUS +realm. +This can have a security impact on servers that expect to grant access to +anonymous-but-authenticated to the KDC users of the realm in question: +they would also grant access to unauthenticated anonymous users. +As such, it is not recommend to set this option to +.Li true. .It Li max-kdc-datagram-reply-length = Va number Maximum packet size the UDP rely that the KDC will transmit, instead the KDC sends back a reply telling the client to use TCP instead. diff --git a/crypto/heimdal/kdc/kdc.cat8 b/crypto/heimdal/kdc/kdc.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/kdc.cat8 @@ -0,0 +1,171 @@ +KDC(8) BSD System Manager's Manual KDC(8) + +NAME + kdc -- Kerberos 5 server + +SYNOPSIS + kdc [-c file | --config-file=file] [-p | --no-require-preauth] + [--max-request=size] [-H | --enable-http] [-r string | + --v4-realm=string] [-P portspec | --ports=portspec] [--detach] + [--disable-des] [--addresses=list of addresses] + +DESCRIPTION + kdc serves requests for tickets. When it starts, it first checks the + flags passed, any options that are not specified with a command line flag + are taken from a config file, or from a default compiled-in value. + + Options supported: + + -c file, --config-file=file + Specifies the location of the config file, the default is + /var/heimdal/kdc.conf. This is the only value that can't be + specified in the config file. + + -p, --no-require-preauth + Turn off the requirement for pre-autentication in the initial AS- + REQ for all principals. The use of pre-authentication makes it + more difficult to do offline password attacks. You might want to + turn it off if you have clients that don't support pre-authenti- + cation. Since the version 4 protocol doesn't support any pre-au- + thentication, serving version 4 clients is just about the same as + not requiring pre-athentication. The default is to require pre- + authentication. Adding the require-preauth per principal is a + more flexible way of handling this. + + --max-request=size + Gives an upper limit on the size of the requests that the kdc is + willing to handle. + + -H, --enable-http + Makes the kdc listen on port 80 and handle requests encapsulated + in HTTP. + + -r string, --v4-realm=string + What realm this server should act as when dealing with version 4 + requests. The database can contain any number of realms, but + since the version 4 protocol doesn't contain a realm for the + server, it must be explicitly specified. The default is whatever + is returned by krb_get_lrealm(). This option is only available + if the KDC has been compiled with version 4 support. + + -P portspec, --ports=portspec + Specifies the set of ports the KDC should listen on. It is given + as a white-space separated list of services or port numbers. + + --addresses=list of addresses + The list of addresses to listen for requests on. By default, the + kdc will listen on all the locally configured addresses. If only + a subset is desired, or the automatic detection fails, this op- + tion might be used. + + --detach + detach from pty and run as a daemon. + + --disable-des + disable all des encryption types, makes the kdc not use them. + + All activities are logged to one or more destinations, see krb5.conf(5), + and krb5_openlog(3). The entity used for logging is kdc. + +CONFIGURATION FILE + The configuration file has the same syntax as krb5.conf(5), but will be + read before /etc/krb5.conf, so it may override settings found there. Op- + tions specific to the KDC only are found in the "[kdc]" section. All the + command-line options can preferably be added in the configuration file. + The only difference is the pre-authentication flag, which has to be spec- + ified as: + + require-preauth = no + + (in fact you can specify the option as --require-preauth=no). + + And there are some configuration options which do not have command-line + equivalents: + + enable-digest = boolean + turn on support for digest processing in the KDC. The default + is FALSE. + + check-ticket-addresses = boolean + Check the addresses in the ticket when processing TGS re- + quests. The default is TRUE. + + allow-null-ticket-addresses = boolean + Permit tickets with no addresses. This option is only rele- + vant when check-ticket-addresses is TRUE. + + allow-anonymous = boolean + Permit anonymous tickets with no addresses. + + historical_anon_realm = boolean + Enables pre-7.0 non-RFC-comformant KDC behavior. With this + option set to true the client realm in anonymous pkinit AS + replies will be the requested realm, rather than the RFC-con- + formant WELLKNOWN:ANONYMOUS realm. This can have a security + impact on servers that expect to grant access to anonymous- + but-authenticated to the KDC users of the realm in question: + they would also grant access to unauthenticated anonymous + users. As such, it is not recommend to set this option to + true. + + max-kdc-datagram-reply-length = number + Maximum packet size the UDP rely that the KDC will transmit, + instead the KDC sends back a reply telling the client to use + TCP instead. + + transited-policy = always-check | allow-per-principal | + always-honour-request + This controls how KDC requests with the + disable-transited-check flag are handled. It can be one of: + + always-check + Always check transited encoding, this is the de- + fault. + + allow-per-principal + Currently this is identical to always-check. In a + future release, it will be possible to mark a prin- + cipal as able to handle unchecked requests. + + always-honour-request + Always do what the client asked. In a future re- + lease, it will be possible to force a check per + principal. + + encode_as_rep_as_tgs_rep = boolean + Encode AS-Rep as TGS-Rep to be bug-compatible with old DCE + code. The Heimdal clients allow both. + + kdc_warn_pwexpire = time + How long before password/principal expiration the KDC should + start sending out warning messages. + + The configuration file is only read when the kdc is started. If changes + made to the configuration file are to take effect, the kdc needs to be + restarted. + + An example of a config file: + + [kdc] + require-preauth = no + v4-realm = FOO.SE + +BUGS + If the machine running the KDC has new addresses added to it, the KDC + will have to be restarted to listen to them. The reason it doesn't just + listen to wildcarded (like INADDR_ANY) addresses, is that the replies has + to come from the same address they were sent to, and most OS:es doesn't + pass this information to the application. If your normal mode of opera- + tion require that you add and remove addresses, the best option is proba- + bly to listen to a wildcarded TCP socket, and make sure your clients use + TCP to connect. For instance, this will listen to IPv4 TCP port 88 only: + + kdc --addresses=0.0.0.0 --ports="88/tcp" + + There should be a way to specify protocol, port, and address triplets, + not just addresses and protocol, port tuples. + +SEE ALSO + kinit(1), krb5.conf(5) + +HEIMDAL August 24, 2006 HEIMDAL diff --git a/crypto/heimdal/kdc/kdc_locl.h b/crypto/heimdal/kdc/kdc_locl.h --- a/crypto/heimdal/kdc/kdc_locl.h +++ b/crypto/heimdal/kdc/kdc_locl.h @@ -43,8 +43,53 @@ typedef struct pk_client_params pk_client_params; struct DigestREQ; struct Kx509Request; +typedef struct kdc_request_desc *kdc_request_t; + #include +#define FAST_EXPIRATION_TIME (3 * 60) + +struct kdc_request_desc { + krb5_context context; + krb5_kdc_configuration *config; + + /* */ + + krb5_data request; + KDC_REQ req; + METHOD_DATA *padata; + + /* out */ + + METHOD_DATA outpadata; + + KDC_REP rep; + EncTicketPart et; + EncKDCRepPart ek; + + /* PA methods can affect both the reply key and the session key (pkinit) */ + krb5_enctype sessionetype; + krb5_keyblock reply_key; + krb5_keyblock session_key; + + const char *e_text; + + /* state */ + krb5_principal client_princ; + char *client_name; + hdb_entry_ex *client; + HDB *clientdb; + + krb5_principal server_princ; + char *server_name; + hdb_entry_ex *server; + + krb5_crypto armor_crypto; + + KDCFastState fast; +}; + + extern sig_atomic_t exit_flag; extern size_t max_request_udp; extern size_t max_request_tcp; @@ -54,12 +99,11 @@ extern int enable_http; -#ifdef SUPPORT_DETACH - -#define DETACH_IS_DEFAULT FALSE - extern int detach_from_console; -#endif +extern int daemon_child; +extern int do_bonjour; + +extern int testing_flag; extern const struct units _kdc_digestunits[]; @@ -72,10 +116,10 @@ extern char *chroot_string; void -loop(krb5_context context, krb5_kdc_configuration *config); +start_kdc(krb5_context context, krb5_kdc_configuration *config, const char *argv0); krb5_kdc_configuration * -configure(krb5_context context, int argc, char **argv); +configure(krb5_context context, int argc, char **argv, int *optidx); #ifdef __APPLE__ void bonjour_announce(krb5_context, krb5_kdc_configuration *); diff --git a/crypto/heimdal/kdc/kerberos5.c b/crypto/heimdal/kdc/kerberos5.c --- a/crypto/heimdal/kdc/kerberos5.c +++ b/crypto/heimdal/kdc/kerberos5.c @@ -92,9 +92,9 @@ { if (principal->name.name_string.len > 0 && strcmp(principal->name.name_string.val[0], "afs") == 0 && - (etype == ETYPE_DES_CBC_CRC - || etype == ETYPE_DES_CBC_MD4 - || etype == ETYPE_DES_CBC_MD5)) + (etype == (krb5_enctype)ETYPE_DES_CBC_CRC + || etype == (krb5_enctype)ETYPE_DES_CBC_MD4 + || etype == (krb5_enctype)ETYPE_DES_CBC_MD5)) return TRUE; return FALSE; } @@ -116,10 +116,44 @@ return TRUE; } +/* + * Detect if `key' is the using the the precomputed `default_salt' + * (for des-cbc-crc) or any salt otherwise. + * + * This is for avoiding Kerberos v4 (yes really) keys in AS-REQ as + * that salt is strange, and a buggy client will try to use the + * principal as the salt and not the returned value. + */ + +static krb5_boolean +is_good_salt_p(const krb5_salt *default_salt, const Key *key) +{ + if (key->key.keytype == KRB5_ENCTYPE_DES_CBC_CRC) + return is_default_salt_p(default_salt, key); + + return TRUE; +} + +krb5_boolean +_kdc_is_anon_request(const KDC_REQ *req) +{ + const KDC_REQ_BODY *b = &req->req_body; + + /* + * Versions of Heimdal from 0.9rc1 through 1.50 use bit 14 instead + * of 16 for request_anonymous, as indicated in the anonymous draft + * prior to version 11. Bit 14 is assigned to S4U2Proxy, but S4U2Proxy + * requests are only sent to the TGS and, in any case, would have an + * additional ticket present. + */ + return b->kdc_options.request_anonymous || + (b->kdc_options.cname_in_addl_tkt && !b->additional_tickets); +} + /* * return the first appropriate key of `princ' in `ret_key'. Look for * all the etypes in (`etypes', `len'), stopping as soon as we find - * one, but preferring one that has default salt + * one, but preferring one that has default salt. */ krb5_error_code @@ -130,9 +164,10 @@ { krb5_error_code ret; krb5_salt def_salt; - krb5_enctype enctype = ETYPE_NULL; - Key *key; - int i; + krb5_enctype enctype = (krb5_enctype)ETYPE_NULL; + const krb5_enctype *p; + Key *key = NULL; + int i, k; /* We'll want to avoid keys with v4 salted keys in the pre-auth case... */ ret = krb5_get_pw_salt(context, princ->entry.principal, &def_salt); @@ -142,9 +177,6 @@ ret = KRB5KDC_ERR_ETYPE_NOSUPP; if (use_strongest_session_key) { - const krb5_enctype *p; - krb5_enctype clientbest = ETYPE_NULL; - int j; /* * Pick the strongest key that the KDC, target service, and @@ -159,34 +191,35 @@ /* drive the search with local supported enctypes list */ p = krb5_kerberos_enctypes(context); - for (i = 0; p[i] != ETYPE_NULL && enctype == ETYPE_NULL; i++) { - if (krb5_enctype_valid(context, p[i]) != 0) + for (i = 0; + p[i] != (krb5_enctype)ETYPE_NULL && enctype == (krb5_enctype)ETYPE_NULL; + i++) { + if (krb5_enctype_valid(context, p[i]) != 0 && + !_kdc_is_weak_exception(princ->entry.principal, p[i])) continue; /* check that the client supports it too */ - for (j = 0; j < len && enctype == ETYPE_NULL; j++) { - if (p[i] != etypes[j]) - continue; - /* save best of union of { client, crypto system } */ - if (clientbest == ETYPE_NULL) - clientbest = p[i]; - /* check target princ support */ - ret = hdb_enctype2key(context, &princ->entry, p[i], &key); - if (ret) - continue; - if (is_preauth && !is_default_salt_p(&def_salt, key)) + for (k = 0; k < len && enctype == (krb5_enctype)ETYPE_NULL; k++) { + + if (p[i] != etypes[k]) continue; - enctype = p[i]; + + /* check target princ support */ + key = NULL; + while (hdb_next_enctype2key(context, &princ->entry, NULL, + p[i], &key) == 0) { + if (key->key.keyvalue.length == 0) { + ret = KRB5KDC_ERR_NULL_KEY; + continue; + } + enctype = p[i]; + ret = 0; + if (is_preauth && ret_key != NULL && + !is_good_salt_p(&def_salt, key)) + continue; + } } } - if (clientbest != ETYPE_NULL && enctype == ETYPE_NULL) - enctype = clientbest; - else if (enctype == ETYPE_NULL) - ret = KRB5KDC_ERR_ETYPE_NOSUPP; - if (ret == 0 && ret_enctype != NULL) - *ret_enctype = enctype; - if (ret == 0 && ret_key != NULL) - *ret_key = key; } else { /* * Pick the first key from the client's enctype list that is @@ -197,29 +230,51 @@ * weak enctypes in krb5.conf and selects this key selection * algorithm, then we get exactly what RFC4120 says. */ - for(key = NULL, i = 0; ret != 0 && i < len; i++, key = NULL) { + for(i = 0; ret != 0 && i < len; i++) { if (krb5_enctype_valid(context, etypes[i]) != 0 && !_kdc_is_weak_exception(princ->entry.principal, etypes[i])) continue; - while (hdb_next_enctype2key(context, &princ->entry, etypes[i], &key) == 0) { + key = NULL; + while (ret != 0 && + hdb_next_enctype2key(context, &princ->entry, NULL, + etypes[i], &key) == 0) { if (key->key.keyvalue.length == 0) { ret = KRB5KDC_ERR_NULL_KEY; continue; } - if (ret_key != NULL) - *ret_key = key; - if (ret_enctype != NULL) - *ret_enctype = etypes[i]; + enctype = etypes[i]; ret = 0; - if (is_preauth && is_default_salt_p(&def_salt, key)) - goto out; + if (is_preauth && ret_key != NULL && + !is_good_salt_p(&def_salt, key)) + continue; } } } -out: + if (enctype == (krb5_enctype)ETYPE_NULL) { + /* + * if the service principal is one for which there is a known 1DES + * exception and no other enctype matches both the client request and + * the service key list, provide a DES-CBC-CRC key. + */ + if (ret_key == NULL && + _kdc_is_weak_exception(princ->entry.principal, ETYPE_DES_CBC_CRC)) { + ret = 0; + enctype = ETYPE_DES_CBC_CRC; + } else { + ret = KRB5KDC_ERR_ETYPE_NOSUPP; + } + } + + if (ret == 0) { + if (ret_enctype != NULL) + *ret_enctype = enctype; + if (ret_key != NULL) + *ret_key = key; + } + krb5_free_salt (context, def_salt); return ret; } @@ -227,18 +282,48 @@ krb5_error_code _kdc_make_anonymous_principalname (PrincipalName *pn) { - pn->name_type = KRB5_NT_PRINCIPAL; - pn->name_string.len = 1; - pn->name_string.val = malloc(sizeof(*pn->name_string.val)); + pn->name_type = KRB5_NT_WELLKNOWN; + pn->name_string.len = 2; + pn->name_string.val = calloc(2, sizeof(*pn->name_string.val)); if (pn->name_string.val == NULL) - return ENOMEM; - pn->name_string.val[0] = strdup("anonymous"); - if (pn->name_string.val[0] == NULL) { - free(pn->name_string.val); - pn->name_string.val = NULL; - return ENOMEM; - } + goto failed; + + pn->name_string.val[0] = strdup(KRB5_WELLKNOWN_NAME); + if (pn->name_string.val[0] == NULL) + goto failed; + + pn->name_string.val[1] = strdup(KRB5_ANON_NAME); + if (pn->name_string.val[1] == NULL) + goto failed; + return 0; + +failed: + free_PrincipalName(pn); + + pn->name_type = KRB5_NT_UNKNOWN; + pn->name_string.len = 0; + pn->name_string.val = NULL; + + return ENOMEM; +} + +static void +_kdc_r_log(kdc_request_t r, int level, const char *fmt, ...) +{ + va_list ap; + char *s; + va_start(ap, fmt); + s = kdc_log_msg_va(r->context, r->config, level, fmt, ap); + if(s) free(s); + va_end(ap); +} + +static void +_kdc_set_e_text(kdc_request_t r, const char *e_text) +{ + r->e_text = e_text; + kdc_log(r->context, r->config, 0, "%s", e_text); } void @@ -271,6 +356,459 @@ type, authtime_str, starttime_str, endtime_str, renewtime_str); } +/* + * + */ + +#ifdef PKINIT + +static krb5_error_code +pa_pkinit_validate(kdc_request_t r, const PA_DATA *pa) +{ + pk_client_params *pkp = NULL; + char *client_cert = NULL; + krb5_error_code ret; + + ret = _kdc_pk_rd_padata(r->context, r->config, &r->req, pa, r->client, &pkp); + if (ret || pkp == NULL) { + ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; + _kdc_r_log(r, 5, "Failed to decode PKINIT PA-DATA -- %s", + r->client_name); + goto out; + } + + ret = _kdc_pk_check_client(r->context, + r->config, + r->clientdb, + r->client, + pkp, + &client_cert); + if (ret) { + _kdc_set_e_text(r, "PKINIT certificate not allowed to " + "impersonate principal"); + goto out; + } + + _kdc_r_log(r, 0, "PKINIT pre-authentication succeeded -- %s using %s", + r->client_name, client_cert); + free(client_cert); + + ret = _kdc_pk_mk_pa_reply(r->context, r->config, pkp, r->client, + r->sessionetype, &r->req, &r->request, + &r->reply_key, &r->session_key, &r->outpadata); + if (ret) { + _kdc_set_e_text(r, "Failed to build PK-INIT reply"); + goto out; + } +#if 0 + ret = _kdc_add_inital_verified_cas(r->context, r->config, + pkp, &r->et); +#endif + out: + if (pkp) + _kdc_pk_free_client_param(r->context, pkp); + + return ret; +} + +#endif /* PKINIT */ + +/* + * + */ + +static krb5_error_code +make_pa_enc_challange(krb5_context context, METHOD_DATA *md, + krb5_crypto crypto) +{ + PA_ENC_TS_ENC p; + unsigned char *buf; + size_t buf_size; + size_t len; + EncryptedData encdata; + krb5_error_code ret; + int32_t usec; + int usec2; + + krb5_us_timeofday (context, &p.patimestamp, &usec); + usec2 = usec; + p.pausec = &usec2; + + ASN1_MALLOC_ENCODE(PA_ENC_TS_ENC, buf, buf_size, &p, &len, ret); + if (ret) + return ret; + if(buf_size != len) + krb5_abortx(context, "internal error in ASN.1 encoder"); + + ret = krb5_encrypt_EncryptedData(context, + crypto, + KRB5_KU_ENC_CHALLENGE_KDC, + buf, + len, + 0, + &encdata); + free(buf); + if (ret) + return ret; + + ASN1_MALLOC_ENCODE(EncryptedData, buf, buf_size, &encdata, &len, ret); + free_EncryptedData(&encdata); + if (ret) + return ret; + if(buf_size != len) + krb5_abortx(context, "internal error in ASN.1 encoder"); + + ret = krb5_padata_add(context, md, KRB5_PADATA_ENCRYPTED_CHALLENGE, buf, len); + if (ret) + free(buf); + return ret; +} + +static krb5_error_code +pa_enc_chal_validate(kdc_request_t r, const PA_DATA *pa) +{ + krb5_data pepper1, pepper2, ts_data; + int invalidPassword = 0; + EncryptedData enc_data; + krb5_enctype aenctype; + krb5_error_code ret; + struct Key *k; + size_t size; + int i; + + heim_assert(r->armor_crypto != NULL, "ENC-CHAL called for non FAST"); + + if (_kdc_is_anon_request(&r->req)) { + ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; + kdc_log(r->context, r->config, 0, "ENC-CHALL doesn't support anon"); + return ret; + } + + ret = decode_EncryptedData(pa->padata_value.data, + pa->padata_value.length, + &enc_data, + &size); + if (ret) { + ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; + _kdc_r_log(r, 5, "Failed to decode PA-DATA -- %s", + r->client_name); + return ret; + } + + pepper1.data = "clientchallengearmor"; + pepper1.length = strlen(pepper1.data); + pepper2.data = "challengelongterm"; + pepper2.length = strlen(pepper2.data); + + krb5_crypto_getenctype(r->context, r->armor_crypto, &aenctype); + + for (i = 0; i < r->client->entry.keys.len; i++) { + krb5_crypto challangecrypto, longtermcrypto; + krb5_keyblock challangekey; + PA_ENC_TS_ENC p; + + k = &r->client->entry.keys.val[i]; + + ret = krb5_crypto_init(r->context, &k->key, 0, &longtermcrypto); + if (ret) + continue; + + ret = krb5_crypto_fx_cf2(r->context, r->armor_crypto, longtermcrypto, + &pepper1, &pepper2, aenctype, + &challangekey); + krb5_crypto_destroy(r->context, longtermcrypto); + if (ret) + continue; + + ret = krb5_crypto_init(r->context, &challangekey, 0, + &challangecrypto); + if (ret) + continue; + + ret = krb5_decrypt_EncryptedData(r->context, challangecrypto, + KRB5_KU_ENC_CHALLENGE_CLIENT, + &enc_data, + &ts_data); + if (ret) { + const char *msg = krb5_get_error_message(r->context, ret); + krb5_error_code ret2; + char *str = NULL; + + invalidPassword = 1; + + ret2 = krb5_enctype_to_string(r->context, k->key.keytype, &str); + if (ret2) + str = NULL; + _kdc_r_log(r, 5, "Failed to decrypt ENC-CHAL -- %s " + "(enctype %s) error %s", + r->client_name, str ? str : "unknown enctype", msg); + krb5_free_error_message(r->context, msg); + free(str); + + continue; + } + + ret = decode_PA_ENC_TS_ENC(ts_data.data, + ts_data.length, + &p, + &size); + krb5_data_free(&ts_data); + if(ret){ + krb5_crypto_destroy(r->context, challangecrypto); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + _kdc_r_log(r, 5, "Failed to decode PA-ENC-TS_ENC -- %s", + r->client_name); + continue; + } + + if (labs(kdc_time - p.patimestamp) > r->context->max_skew) { + char client_time[100]; + + krb5_crypto_destroy(r->context, challangecrypto); + + krb5_format_time(r->context, p.patimestamp, + client_time, sizeof(client_time), TRUE); + + ret = KRB5KRB_AP_ERR_SKEW; + _kdc_r_log(r, 0, "Too large time skew, " + "client time %s is out by %u > %u seconds -- %s", + client_time, + (unsigned)labs(kdc_time - p.patimestamp), + r->context->max_skew, + r->client_name); + + free_PA_ENC_TS_ENC(&p); + goto out; + } + + free_PA_ENC_TS_ENC(&p); + + ret = make_pa_enc_challange(r->context, &r->outpadata, + challangecrypto); + krb5_crypto_destroy(r->context, challangecrypto); + if (ret) + goto out; + + set_salt_padata(&r->outpadata, k->salt); + krb5_free_keyblock_contents(r->context, &r->reply_key); + ret = krb5_copy_keyblock_contents(r->context, &k->key, &r->reply_key); + if (ret) + goto out; + + /* + * Success + */ + if (r->clientdb->hdb_auth_status) + r->clientdb->hdb_auth_status(r->context, r->clientdb, r->client, + HDB_AUTH_SUCCESS); + goto out; + } + + if (invalidPassword && r->clientdb->hdb_auth_status) { + r->clientdb->hdb_auth_status(r->context, r->clientdb, r->client, + HDB_AUTH_WRONG_PASSWORD); + ret = KRB5KDC_ERR_PREAUTH_FAILED; + } + out: + free_EncryptedData(&enc_data); + + return ret; +} + +static krb5_error_code +pa_enc_ts_validate(kdc_request_t r, const PA_DATA *pa) +{ + EncryptedData enc_data; + krb5_error_code ret; + krb5_crypto crypto; + krb5_data ts_data; + PA_ENC_TS_ENC p; + size_t len; + Key *pa_key; + char *str; + + ret = decode_EncryptedData(pa->padata_value.data, + pa->padata_value.length, + &enc_data, + &len); + if (ret) { + ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; + _kdc_r_log(r, 5, "Failed to decode PA-DATA -- %s", + r->client_name); + goto out; + } + + ret = hdb_enctype2key(r->context, &r->client->entry, NULL, + enc_data.etype, &pa_key); + if(ret){ + char *estr; + _kdc_set_e_text(r, "No key matching entype"); + ret = KRB5KDC_ERR_ETYPE_NOSUPP; + if(krb5_enctype_to_string(r->context, enc_data.etype, &estr)) + estr = NULL; + if(estr == NULL) + _kdc_r_log(r, 5, + "No client key matching pa-data (%d) -- %s", + enc_data.etype, r->client_name); + else + _kdc_r_log(r, 5, + "No client key matching pa-data (%s) -- %s", + estr, r->client_name); + free(estr); + free_EncryptedData(&enc_data); + goto out; + } + + try_next_key: + ret = krb5_crypto_init(r->context, &pa_key->key, 0, &crypto); + if (ret) { + const char *msg = krb5_get_error_message(r->context, ret); + _kdc_r_log(r, 0, "krb5_crypto_init failed: %s", msg); + krb5_free_error_message(r->context, msg); + free_EncryptedData(&enc_data); + goto out; + } + + ret = krb5_decrypt_EncryptedData (r->context, + crypto, + KRB5_KU_PA_ENC_TIMESTAMP, + &enc_data, + &ts_data); + krb5_crypto_destroy(r->context, crypto); + /* + * Since the user might have several keys with the same + * enctype but with diffrent salting, we need to try all + * the keys with the same enctype. + */ + if(ret){ + krb5_error_code ret2; + const char *msg = krb5_get_error_message(r->context, ret); + + ret2 = krb5_enctype_to_string(r->context, + pa_key->key.keytype, &str); + if (ret2) + str = NULL; + _kdc_r_log(r, 5, "Failed to decrypt PA-DATA -- %s " + "(enctype %s) error %s", + r->client_name, str ? str : "unknown enctype", msg); + krb5_free_error_message(r->context, msg); + free(str); + + if(hdb_next_enctype2key(r->context, &r->client->entry, NULL, + enc_data.etype, &pa_key) == 0) + goto try_next_key; + + free_EncryptedData(&enc_data); + + if (r->clientdb->hdb_auth_status) + r->clientdb->hdb_auth_status(r->context, r->clientdb, r->client, + HDB_AUTH_WRONG_PASSWORD); + + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + free_EncryptedData(&enc_data); + ret = decode_PA_ENC_TS_ENC(ts_data.data, + ts_data.length, + &p, + &len); + krb5_data_free(&ts_data); + if(ret){ + ret = KRB5KDC_ERR_PREAUTH_FAILED; + _kdc_r_log(r, 5, "Failed to decode PA-ENC-TS_ENC -- %s", + r->client_name); + goto out; + } + if (labs(kdc_time - p.patimestamp) > r->context->max_skew) { + char client_time[100]; + + krb5_format_time(r->context, p.patimestamp, + client_time, sizeof(client_time), TRUE); + + ret = KRB5KRB_AP_ERR_SKEW; + _kdc_r_log(r, 0, "Too large time skew, " + "client time %s is out by %u > %u seconds -- %s", + client_time, + (unsigned)labs(kdc_time - p.patimestamp), + r->context->max_skew, + r->client_name); + + /* + * The following is needed to make windows clients to + * retry using the timestamp in the error message, if + * there is a e_text, they become unhappy. + */ + r->e_text = NULL; + free_PA_ENC_TS_ENC(&p); + goto out; + } + free_PA_ENC_TS_ENC(&p); + + set_salt_padata(&r->outpadata, pa_key->salt); + + ret = krb5_copy_keyblock_contents(r->context, &pa_key->key, &r->reply_key); + if (ret) + return ret; + + ret = krb5_enctype_to_string(r->context, pa_key->key.keytype, &str); + if (ret) + str = NULL; + _kdc_r_log(r, 2, "ENC-TS Pre-authentication succeeded -- %s using %s", + r->client_name, str ? str : "unknown enctype"); + free(str); + + ret = 0; + + out: + + return ret; +} + +struct kdc_patypes { + int type; + char *name; + unsigned int flags; +#define PA_ANNOUNCE 1 +#define PA_REQ_FAST 2 /* only use inside fast */ + krb5_error_code (*validate)(kdc_request_t, const PA_DATA *pa); +}; + +static const struct kdc_patypes pat[] = { +#ifdef PKINIT + { + KRB5_PADATA_PK_AS_REQ, "PK-INIT(ietf)", PA_ANNOUNCE, + pa_pkinit_validate + }, + { + KRB5_PADATA_PK_AS_REQ_WIN, "PK-INIT(win2k)", PA_ANNOUNCE, + pa_pkinit_validate + }, + { + KRB5_PADATA_PKINIT_KX, "Anonymous PK-INIT", PA_ANNOUNCE, + NULL + }, +#else + { KRB5_PADATA_PK_AS_REQ, "PK-INIT(ietf)", 0, NULL }, + { KRB5_PADATA_PK_AS_REQ_WIN, "PK-INIT(win2k)", 0, NULL }, + { KRB5_PADATA_PKINIT_KX, "Anonymous PK-INIT", 0, NULL }, +#endif + { KRB5_PADATA_PA_PK_OCSP_RESPONSE , "OCSP", 0, NULL }, + { + KRB5_PADATA_ENC_TIMESTAMP , "ENC-TS", + PA_ANNOUNCE, + pa_enc_ts_validate + }, + { + KRB5_PADATA_ENCRYPTED_CHALLENGE , "ENC-CHAL", + PA_ANNOUNCE | PA_REQ_FAST, + pa_enc_chal_validate + }, + { KRB5_PADATA_REQ_ENC_PA_REP , "REQ-ENC-PA-REP", 0, NULL }, + { KRB5_PADATA_FX_FAST, "FX-FAST", PA_ANNOUNCE, NULL }, + { KRB5_PADATA_FX_ERROR, "FX-ERROR", 0, NULL }, + { KRB5_PADATA_FX_COOKIE, "FX-COOKIE", 0, NULL } +}; + static void log_patypes(krb5_context context, krb5_kdc_configuration *config, @@ -278,27 +816,18 @@ { struct rk_strpool *p = NULL; char *str; - size_t i; - - for (i = 0; i < padata->len; i++) { - switch(padata->val[i].padata_type) { - case KRB5_PADATA_PK_AS_REQ: - p = rk_strpoolprintf(p, "PK-INIT(ietf)"); - break; - case KRB5_PADATA_PK_AS_REQ_WIN: - p = rk_strpoolprintf(p, "PK-INIT(win2k)"); - break; - case KRB5_PADATA_PA_PK_OCSP_RESPONSE: - p = rk_strpoolprintf(p, "OCSP"); - break; - case KRB5_PADATA_ENC_TIMESTAMP: - p = rk_strpoolprintf(p, "encrypted-timestamp"); - break; - default: - p = rk_strpoolprintf(p, "%d", padata->val[i].padata_type); - break; + size_t n, m; + + for (n = 0; n < padata->len; n++) { + for (m = 0; m < sizeof(pat) / sizeof(pat[0]); m++) { + if (padata->val[n].padata_type == pat[m].type) { + p = rk_strpoolprintf(p, "%s", pat[m].name); + break; + } } - if (p && i + 1 < padata->len) + if (m == sizeof(pat) / sizeof(pat[0])) + p = rk_strpoolprintf(p, "%d", padata->val[n].padata_type); + if (p && n + 1 < padata->len) p = rk_strpoolprintf(p, ", "); if (p == NULL) { kdc_log(context, config, 0, "out of memory"); @@ -317,11 +846,11 @@ * */ - krb5_error_code _kdc_encode_reply(krb5_context context, krb5_kdc_configuration *config, - KDC_REP *rep, const EncTicketPart *et, EncKDCRepPart *ek, + krb5_crypto armor_crypto, uint32_t nonce, + KDC_REP *rep, EncTicketPart *et, EncKDCRepPart *ek, krb5_enctype etype, int skvno, const EncryptionKey *skey, int ckvno, const EncryptionKey *reply_key, @@ -342,20 +871,15 @@ krb5_free_error_message(context, msg); return ret; } - if(buf_size != len) { - free(buf); - kdc_log(context, config, 0, "Internal error in ASN.1 encoder"); - *e_text = "KDC internal error"; - return KRB5KRB_ERR_GENERIC; - } + if(buf_size != len) + krb5_abortx(context, "Internal error in ASN.1 encoder"); ret = krb5_crypto_init(context, skey, etype, &crypto); if (ret) { - const char *msg; - free(buf); - msg = krb5_get_error_message(context, ret); + const char *msg = krb5_get_error_message(context, ret); kdc_log(context, config, 0, "krb5_crypto_init failed: %s", msg); krb5_free_error_message(context, msg); + free(buf); return ret; } @@ -375,6 +899,69 @@ return ret; } + if (armor_crypto) { + krb5_data data; + krb5_keyblock *strengthen_key = NULL; + KrbFastFinished finished; + + kdc_log(context, config, 0, "FAST armor protection"); + + memset(&finished, 0, sizeof(finished)); + krb5_data_zero(&data); + + finished.timestamp = kdc_time; + finished.usec = 0; + finished.crealm = et->crealm; + finished.cname = et->cname; + + ASN1_MALLOC_ENCODE(Ticket, data.data, data.length, + &rep->ticket, &len, ret); + if (ret) + return ret; + if (data.length != len) + krb5_abortx(context, "internal asn.1 error"); + + ret = krb5_create_checksum(context, armor_crypto, + KRB5_KU_FAST_FINISHED, 0, + data.data, data.length, + &finished.ticket_checksum); + krb5_data_free(&data); + if (ret) + return ret; + + ret = _kdc_fast_mk_response(context, armor_crypto, + rep->padata, strengthen_key, &finished, + nonce, &data); + free_Checksum(&finished.ticket_checksum); + if (ret) + return ret; + + if (rep->padata) { + free_METHOD_DATA(rep->padata); + } else { + rep->padata = calloc(1, sizeof(*(rep->padata))); + if (rep->padata == NULL) { + krb5_data_free(&data); + return ENOMEM; + } + } + + ret = krb5_padata_add(context, rep->padata, + KRB5_PADATA_FX_FAST, + data.data, data.length); + if (ret) + return ret; + + /* + * Hide client name of privacy reasons + */ + if (1 /* r->fast_options.hide_client_names */) { + rep->crealm[0] = '\0'; + free_PrincipalName(&rep->cname); + rep->cname.name_type = 0; + } + } + if(rep->msg_type == krb_as_rep && !config->encode_as_rep_as_tgs_rep) ASN1_MALLOC_ENCODE(EncASRepPart, buf, buf_size, ek, &len, ret); else @@ -559,13 +1146,35 @@ * */ -extern int _krb5_AES_string_to_default_iterator; +extern int _krb5_AES_SHA1_string_to_default_iterator; +extern int _krb5_AES_SHA2_string_to_default_iterator; static krb5_error_code -make_etype_info2_entry(ETYPE_INFO2_ENTRY *ent, Key *key) +make_s2kparams(int value, size_t len, krb5_data **ps2kparams) { - ent->etype = key->key.keytype; - if(key->salt) { + krb5_data *s2kparams; + krb5_error_code ret; + + ALLOC(s2kparams); + if (s2kparams == NULL) + return ENOMEM; + ret = krb5_data_alloc(s2kparams, len); + if (ret) { + free(s2kparams); + return ret; + } + _krb5_put_int(s2kparams->data, value, len); + *ps2kparams = s2kparams; + return 0; +} + +static krb5_error_code +make_etype_info2_entry(ETYPE_INFO2_ENTRY *ent, Key *key) +{ + krb5_error_code ret; + + ent->etype = key->key.keytype; + if(key->salt) { ALLOC(ent->salt); if (ent->salt == NULL) return ENOMEM; @@ -585,44 +1194,28 @@ switch (key->key.keytype) { case ETYPE_AES128_CTS_HMAC_SHA1_96: case ETYPE_AES256_CTS_HMAC_SHA1_96: - ALLOC(ent->s2kparams); - if (ent->s2kparams == NULL) - return ENOMEM; - ent->s2kparams->length = 4; - ent->s2kparams->data = malloc(ent->s2kparams->length); - if (ent->s2kparams->data == NULL) { - free(ent->s2kparams); - ent->s2kparams = NULL; - return ENOMEM; - } - _krb5_put_int(ent->s2kparams->data, - _krb5_AES_string_to_default_iterator, - ent->s2kparams->length); + ret = make_s2kparams(_krb5_AES_SHA1_string_to_default_iterator, + 4, &ent->s2kparams); + break; + case KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128: + case KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192: + ret = make_s2kparams(_krb5_AES_SHA2_string_to_default_iterator, + 4, &ent->s2kparams); break; case ETYPE_DES_CBC_CRC: case ETYPE_DES_CBC_MD4: case ETYPE_DES_CBC_MD5: /* Check if this was a AFS3 salted key */ - if(key->salt && key->salt->type == hdb_afs3_salt){ - ALLOC(ent->s2kparams); - if (ent->s2kparams == NULL) - return ENOMEM; - ent->s2kparams->length = 1; - ent->s2kparams->data = malloc(ent->s2kparams->length); - if (ent->s2kparams->data == NULL) { - free(ent->s2kparams); - ent->s2kparams = NULL; - return ENOMEM; - } - _krb5_put_int(ent->s2kparams->data, - 1, - ent->s2kparams->length); - } + if(key->salt && key->salt->type == hdb_afs3_salt) + ret = make_s2kparams(1, 1, &ent->s2kparams); + else + ret = 0; break; default: + ret = 0; break; } - return 0; + return ret; } /* @@ -788,6 +1381,13 @@ return KRB5KDC_ERR_NAME_EXP; } + if (client->flags.require_pwchange && + (server_ex == NULL || !server_ex->entry.flags.change_pw)) { + kdc_log(context, config, 0, + "Client's key must be changed -- %s", client_name); + return KRB5KDC_ERR_KEY_EXPIRED; + } + if (client->pw_end && *client->pw_end < kdc_time && (server_ex == NULL || !server_ex->entry.flags.change_pw)) { char pwend_str[100]; @@ -908,6 +1508,24 @@ return result; } +/* + * + */ +krb5_error_code +_kdc_check_anon_policy (krb5_context context, + krb5_kdc_configuration *config, + hdb_entry_ex *client, + hdb_entry_ex *server) +{ + if (!config->allow_anonymous){ + kdc_log(context, config, 0, + "Request for anonymous ticket denied by local policy"); + return KRB5KDC_ERR_POLICY; + } + + return 0; +} + /* * */ @@ -937,15 +1555,109 @@ return TRUE; } -krb5_boolean -_kdc_is_anonymous(krb5_context context, krb5_principal principal) +/* + * + */ + +static krb5_error_code +generate_pac(kdc_request_t r, Key *skey) { - if (principal->name.name_type != KRB5_NT_WELLKNOWN || - principal->name.name_string.len != 2 || - strcmp(principal->name.name_string.val[0], KRB5_WELLKNOWN_NAME) != 0 || - strcmp(principal->name.name_string.val[1], KRB5_ANON_NAME) != 0) + krb5_error_code ret; + krb5_pac p = NULL; + krb5_data data; + + ret = _kdc_pac_generate(r->context, r->client, &p); + if (ret) { + _kdc_r_log(r, 0, "PAC generation failed for -- %s", + r->client_name); + return ret; + } + if (p == NULL) return 0; - return 1; + + ret = _krb5_pac_sign(r->context, p, r->et.authtime, + r->client->entry.principal, + &skey->key, /* Server key */ + &skey->key, /* FIXME: should be krbtgt key */ + &data); + krb5_pac_free(r->context, p); + if (ret) { + _kdc_r_log(r, 0, "PAC signing failed for -- %s", + r->client_name); + return ret; + } + + ret = _kdc_tkt_add_if_relevant_ad(r->context, &r->et, + KRB5_AUTHDATA_WIN2K_PAC, + &data); + krb5_data_free(&data); + + return ret; +} + +/* + * + */ + +krb5_boolean +_kdc_is_anonymous(krb5_context context, krb5_const_principal principal) +{ + return krb5_principal_is_anonymous(context, principal, KRB5_ANON_MATCH_ANY); +} + +static int +require_preauth_p(kdc_request_t r) +{ + return r->config->require_preauth + || r->client->entry.flags.require_preauth + || r->server->entry.flags.require_preauth; +} + + +/* + * + */ + +static krb5_error_code +add_enc_pa_rep(kdc_request_t r) +{ + krb5_error_code ret; + krb5_crypto crypto; + Checksum checksum; + krb5_data cdata; + size_t len; + + ret = krb5_crypto_init(r->context, &r->reply_key, 0, &crypto); + if (ret) + return ret; + + ret = krb5_create_checksum(r->context, crypto, + KRB5_KU_AS_REQ, 0, + r->request.data, r->request.length, + &checksum); + krb5_crypto_destroy(r->context, crypto); + if (ret) + return ret; + + ASN1_MALLOC_ENCODE(Checksum, cdata.data, cdata.length, + &checksum, &len, ret); + free_Checksum(&checksum); + if (ret) + return ret; + heim_assert(cdata.length == len, "ASN.1 internal error"); + + if (r->ek.encrypted_pa_data == NULL) { + ALLOC(r->ek.encrypted_pa_data); + if (r->ek.encrypted_pa_data == NULL) + return ENOMEM; + } + ret = krb5_padata_add(r->context, r->ek.encrypted_pa_data, + KRB5_PADATA_REQ_ENC_PA_REP, cdata.data, cdata.length); + if (ret) + return ret; + + return krb5_padata_add(r->context, r->ek.encrypted_pa_data, + KRB5_PADATA_FX_FAST, NULL, 0); } /* @@ -953,57 +1665,55 @@ */ krb5_error_code -_kdc_as_rep(krb5_context context, - krb5_kdc_configuration *config, - KDC_REQ *req, - const krb5_data *req_buffer, +_kdc_as_rep(kdc_request_t r, krb5_data *reply, const char *from, struct sockaddr *from_addr, int datagram_reply) { - KDC_REQ_BODY *b = &req->req_body; + krb5_context context = r->context; + krb5_kdc_configuration *config = r->config; + KDC_REQ *req = &r->req; + KDC_REQ_BODY *b = NULL; AS_REP rep; - KDCOptions f = b->kdc_options; - hdb_entry_ex *client = NULL, *server = NULL; - HDB *clientdb; - krb5_enctype setype, sessionetype; - krb5_data e_data; - EncTicketPart et; - EncKDCRepPart ek; - krb5_principal client_princ = NULL, server_princ = NULL; - char *client_name = NULL, *server_name = NULL; + KDCOptions f; + krb5_enctype setype; krb5_error_code ret = 0; - const char *e_text = NULL; - krb5_crypto crypto; - Key *ckey, *skey; - EncryptionKey *reply_key = NULL, session_key; - int flags = HDB_F_FOR_AS_REQ; -#ifdef PKINIT - pk_client_params *pkp = NULL; -#endif + Key *skey; + int found_pa = 0; + int i, flags = HDB_F_FOR_AS_REQ; + METHOD_DATA error_method; + const PA_DATA *pa; memset(&rep, 0, sizeof(rep)); - memset(&session_key, 0, sizeof(session_key)); - krb5_data_zero(&e_data); + error_method.len = 0; + error_method.val = NULL; - ALLOC(rep.padata); - rep.padata->len = 0; - rep.padata->val = NULL; + /* + * Look for FAST armor and unwrap + */ + ret = _kdc_fast_unwrap_request(r); + if (ret) { + _kdc_r_log(r, 0, "FAST unwrap request from %s failed: %d", from, ret); + goto out; + } + + b = &req->req_body; + f = b->kdc_options; if (f.canonicalize) flags |= HDB_F_CANON; if(b->sname == NULL){ ret = KRB5KRB_ERR_GENERIC; - e_text = "No server in request"; + _kdc_set_e_text(r, "No server in request"); } else{ ret = _krb5_principalname2krb5_principal (context, - &server_princ, + &r->server_princ, *(b->sname), b->realm); if (ret == 0) - ret = krb5_unparse_name(context, server_princ, &server_name); + ret = krb5_unparse_name(context, r->server_princ, &r->server_name); } if (ret) { kdc_log(context, config, 0, @@ -1012,16 +1722,16 @@ } if(b->cname == NULL){ ret = KRB5KRB_ERR_GENERIC; - e_text = "No client in request"; + _kdc_set_e_text(r, "No client in request"); } else { ret = _krb5_principalname2krb5_principal (context, - &client_princ, + &r->client_princ, *(b->cname), b->realm); if (ret) goto out; - ret = krb5_unparse_name(context, client_princ, &client_name); + ret = krb5_unparse_name(context, r->client_princ, &r->client_name); } if (ret) { kdc_log(context, config, 0, @@ -1030,23 +1740,16 @@ } kdc_log(context, config, 0, "AS-REQ %s from %s for %s", - client_name, from, server_name); + r->client_name, from, r->server_name); /* * */ - if (_kdc_is_anonymous(context, client_princ)) { - if (!b->kdc_options.request_anonymous) { - kdc_log(context, config, 0, "Anonymous ticket w/o anonymous flag"); - ret = KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN; - goto out; - } - } else if (b->kdc_options.request_anonymous) { - kdc_log(context, config, 0, - "Request for a anonymous ticket with non " - "anonymous client name: %s", client_name); - ret = KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN; + if (_kdc_is_anonymous(context, r->client_princ) && + !_kdc_is_anon_request(&r->req)) { + kdc_log(context, config, 0, "Anonymous client w/o anonymous flag"); + ret = KRB5KDC_ERR_BADOPTION; goto out; } @@ -1054,36 +1757,60 @@ * */ - ret = _kdc_db_fetch(context, config, client_princ, + ret = _kdc_db_fetch(context, config, r->client_princ, HDB_F_GET_CLIENT | flags, NULL, - &clientdb, &client); + &r->clientdb, &r->client); if(ret == HDB_ERR_NOT_FOUND_HERE) { - kdc_log(context, config, 5, "client %s does not have secrets at this KDC, need to proxy", client_name); + kdc_log(context, config, 5, "client %s does not have secrets at this KDC, need to proxy", + r->client_name); + goto out; + } else if (ret == HDB_ERR_WRONG_REALM) { + char *fixed_client_name = NULL; + + ret = krb5_unparse_name(context, r->client->entry.principal, + &fixed_client_name); + if (ret) { + goto out; + } + + kdc_log(context, config, 0, "WRONG_REALM - %s -> %s", + r->client_name, fixed_client_name); + free(fixed_client_name); + + ret = _kdc_fast_mk_error(context, r, + &error_method, + r->armor_crypto, + &req->req_body, + KRB5_KDC_ERR_WRONG_REALM, + NULL, + r->server_princ, + NULL, + &r->client->entry.principal->realm, + NULL, NULL, + reply); goto out; } else if(ret){ const char *msg = krb5_get_error_message(context, ret); - kdc_log(context, config, 0, "UNKNOWN -- %s: %s", client_name, msg); + kdc_log(context, config, 0, "UNKNOWN -- %s: %s", r->client_name, msg); krb5_free_error_message(context, msg); ret = KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN; goto out; } - ret = _kdc_db_fetch(context, config, server_princ, + ret = _kdc_db_fetch(context, config, r->server_princ, HDB_F_GET_SERVER|HDB_F_GET_KRBTGT | flags, - NULL, NULL, &server); + NULL, NULL, &r->server); if(ret == HDB_ERR_NOT_FOUND_HERE) { - kdc_log(context, config, 5, "target %s does not have secrets at this KDC, need to proxy", server_name); + kdc_log(context, config, 5, "target %s does not have secrets at this KDC, need to proxy", + r->server_name); goto out; } else if(ret){ const char *msg = krb5_get_error_message(context, ret); - kdc_log(context, config, 0, "UNKNOWN -- %s: %s", server_name, msg); + kdc_log(context, config, 0, "UNKNOWN -- %s: %s", r->server_name, msg); krb5_free_error_message(context, msg); ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; goto out; } - memset(&et, 0, sizeof(et)); - memset(&ek, 0, sizeof(ek)); - /* * Select a session enctype from the list of the crypto system * supported enctypes that is supported by the client and is one of @@ -1094,310 +1821,75 @@ * enctype that an older version of a KDC in the same realm can't * decrypt. */ + ret = _kdc_find_etype(context, - krb5_principal_is_krbtgt(context, server_princ) ? + krb5_principal_is_krbtgt(context, r->server_princ) ? config->tgt_use_strongest_session_key : config->svc_use_strongest_session_key, FALSE, - client, b->etype.val, b->etype.len, &sessionetype, + r->client, b->etype.val, b->etype.len, &r->sessionetype, NULL); if (ret) { kdc_log(context, config, 0, "Client (%s) from %s has no common enctypes with KDC " "to use for the session key", - client_name, from); + r->client_name, from); goto out; } - /* - * But if the KDC admin is paranoid and doesn't want to have "not - * the best" enctypes on the krbtgt, lets save the best pick from - * the client list and hope that that will work for any other - * KDCs. - */ /* * Pre-auth processing */ if(req->padata){ - int i; - const PA_DATA *pa; - int found_pa = 0; + unsigned int n; log_patypes(context, config, req->padata); -#ifdef PKINIT - kdc_log(context, config, 5, - "Looking for PKINIT pa-data -- %s", client_name); + /* Check if preauth matching */ - e_text = "No PKINIT PA found"; + for (n = 0; !found_pa && n < sizeof(pat) / sizeof(pat[0]); n++) { + if (pat[n].validate == NULL) + continue; + if (r->armor_crypto == NULL && (pat[n].flags & PA_REQ_FAST)) + continue; - i = 0; - pa = _kdc_find_padata(req, &i, KRB5_PADATA_PK_AS_REQ); - if (pa == NULL) { + kdc_log(context, config, 5, + "Looking for %s pa-data -- %s", pat[n].name, r->client_name); i = 0; - pa = _kdc_find_padata(req, &i, KRB5_PADATA_PK_AS_REQ_WIN); - } - if (pa) { - char *client_cert = NULL; - - ret = _kdc_pk_rd_padata(context, config, req, pa, client, &pkp); - if (ret) { - ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; - kdc_log(context, config, 5, - "Failed to decode PKINIT PA-DATA -- %s", - client_name); - goto ts_enc; - } - if (ret == 0 && pkp == NULL) - goto ts_enc; - - ret = _kdc_pk_check_client(context, - config, - clientdb, - client, - pkp, - &client_cert); - if (ret) { - e_text = "PKINIT certificate not allowed to " - "impersonate principal"; - _kdc_pk_free_client_param(context, pkp); - - kdc_log(context, config, 0, "%s", e_text); - pkp = NULL; - goto out; + pa = _kdc_find_padata(req, &i, pat[n].type); + if (pa) { + ret = pat[n].validate(r, pa); + if (ret != 0) { + goto out; + } + kdc_log(context, config, 0, + "%s pre-authentication succeeded -- %s", + pat[n].name, r->client_name); + found_pa = 1; + r->et.flags.pre_authent = 1; } - - found_pa = 1; - et.flags.pre_authent = 1; - kdc_log(context, config, 0, - "PKINIT pre-authentication succeeded -- %s using %s", - client_name, client_cert); - free(client_cert); - if (pkp) - goto preauth_done; } - ts_enc: -#endif - kdc_log(context, config, 5, "Looking for ENC-TS pa-data -- %s", - client_name); - - i = 0; - e_text = "No ENC-TS found"; - while((pa = _kdc_find_padata(req, &i, KRB5_PADATA_ENC_TIMESTAMP))){ - krb5_data ts_data; - PA_ENC_TS_ENC p; - size_t len; - EncryptedData enc_data; - Key *pa_key; - char *str; - - found_pa = 1; - - if (b->kdc_options.request_anonymous) { - ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; - kdc_log(context, config, 0, "ENC-TS doesn't support anon"); - goto out; - } - - ret = decode_EncryptedData(pa->padata_value.data, - pa->padata_value.length, - &enc_data, - &len); - if (ret) { - ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; - kdc_log(context, config, 5, "Failed to decode PA-DATA -- %s", - client_name); - goto out; - } - - ret = hdb_enctype2key(context, &client->entry, - enc_data.etype, &pa_key); - if(ret){ - char *estr; - e_text = "No key matches pa-data"; - ret = KRB5KDC_ERR_ETYPE_NOSUPP; - if(krb5_enctype_to_string(context, enc_data.etype, &estr)) - estr = NULL; - if(estr == NULL) - kdc_log(context, config, 5, - "No client key matching pa-data (%d) -- %s", - enc_data.etype, client_name); - else - kdc_log(context, config, 5, - "No client key matching pa-data (%s) -- %s", - estr, client_name); - free(estr); - free_EncryptedData(&enc_data); - - continue; - } + } - try_next_key: - ret = krb5_crypto_init(context, &pa_key->key, 0, &crypto); - if (ret) { - const char *msg = krb5_get_error_message(context, ret); - kdc_log(context, config, 0, "krb5_crypto_init failed: %s", msg); - krb5_free_error_message(context, msg); - free_EncryptedData(&enc_data); - continue; - } + if (found_pa == 0) { + Key *ckey = NULL; + size_t n; - ret = krb5_decrypt_EncryptedData (context, - crypto, - KRB5_KU_PA_ENC_TIMESTAMP, - &enc_data, - &ts_data); - krb5_crypto_destroy(context, crypto); - /* - * Since the user might have several keys with the same - * enctype but with diffrent salting, we need to try all - * the keys with the same enctype. - */ - if(ret){ - krb5_error_code ret2; - const char *msg = krb5_get_error_message(context, ret); - - ret2 = krb5_enctype_to_string(context, - pa_key->key.keytype, &str); - if (ret2) - str = NULL; - kdc_log(context, config, 5, - "Failed to decrypt PA-DATA -- %s " - "(enctype %s) error %s", - client_name, str ? str : "unknown enctype", msg); - krb5_free_error_message(context, msg); - free(str); - - if(hdb_next_enctype2key(context, &client->entry, - enc_data.etype, &pa_key) == 0) - goto try_next_key; - e_text = "Failed to decrypt PA-DATA"; - - free_EncryptedData(&enc_data); - - if (clientdb->hdb_auth_status) - (clientdb->hdb_auth_status)(context, clientdb, client, HDB_AUTH_WRONG_PASSWORD); - - ret = KRB5KDC_ERR_PREAUTH_FAILED; - continue; - } - free_EncryptedData(&enc_data); - ret = decode_PA_ENC_TS_ENC(ts_data.data, - ts_data.length, - &p, - &len); - krb5_data_free(&ts_data); - if(ret){ - e_text = "Failed to decode PA-ENC-TS-ENC"; - ret = KRB5KDC_ERR_PREAUTH_FAILED; - kdc_log(context, config, - 5, "Failed to decode PA-ENC-TS_ENC -- %s", - client_name); + for (n = 0; n < sizeof(pat) / sizeof(pat[0]); n++) { + if ((pat[n].flags & PA_ANNOUNCE) == 0) continue; - } - free_PA_ENC_TS_ENC(&p); - if (abs(kdc_time - p.patimestamp) > context->max_skew) { - char client_time[100]; - - krb5_format_time(context, p.patimestamp, - client_time, sizeof(client_time), TRUE); - - ret = KRB5KRB_AP_ERR_SKEW; - kdc_log(context, config, 0, - "Too large time skew, " - "client time %s is out by %u > %u seconds -- %s", - client_time, - (unsigned)abs(kdc_time - p.patimestamp), - context->max_skew, - client_name); - - /* - * The following is needed to make windows clients to - * retry using the timestamp in the error message, if - * there is a e_text, they become unhappy. - */ - e_text = NULL; - goto out; - } - et.flags.pre_authent = 1; - - set_salt_padata(rep.padata, pa_key->salt); - - reply_key = &pa_key->key; - - ret = krb5_enctype_to_string(context, pa_key->key.keytype, &str); + ret = krb5_padata_add(context, &error_method, + pat[n].type, NULL, 0); if (ret) - str = NULL; - - kdc_log(context, config, 2, - "ENC-TS Pre-authentication succeeded -- %s using %s", - client_name, str ? str : "unknown enctype"); - free(str); - break; - } -#ifdef PKINIT - preauth_done: -#endif - if(found_pa == 0 && config->require_preauth) - goto use_pa; - /* We come here if we found a pa-enc-timestamp, but if there - was some problem with it, other than too large skew */ - if(found_pa && et.flags.pre_authent == 0){ - kdc_log(context, config, 0, "%s -- %s", e_text, client_name); - e_text = NULL; - goto out; - } - }else if (config->require_preauth - || b->kdc_options.request_anonymous /* hack to force anon */ - || client->entry.flags.require_preauth - || server->entry.flags.require_preauth) { - METHOD_DATA method_data; - PA_DATA *pa; - unsigned char *buf; - size_t len; - - use_pa: - method_data.len = 0; - method_data.val = NULL; - - ret = realloc_method_data(&method_data); - if (ret) { - free_METHOD_DATA(&method_data); - goto out; - } - pa = &method_data.val[method_data.len-1]; - pa->padata_type = KRB5_PADATA_ENC_TIMESTAMP; - pa->padata_value.length = 0; - pa->padata_value.data = NULL; - -#ifdef PKINIT - ret = realloc_method_data(&method_data); - if (ret) { - free_METHOD_DATA(&method_data); - goto out; - } - pa = &method_data.val[method_data.len-1]; - pa->padata_type = KRB5_PADATA_PK_AS_REQ; - pa->padata_value.length = 0; - pa->padata_value.data = NULL; - - ret = realloc_method_data(&method_data); - if (ret) { - free_METHOD_DATA(&method_data); - goto out; + goto out; } - pa = &method_data.val[method_data.len-1]; - pa->padata_type = KRB5_PADATA_PK_AS_REQ_WIN; - pa->padata_value.length = 0; - pa->padata_value.data = NULL; -#endif /* * If there is a client key, send ETYPE_INFO{,2} */ ret = _kdc_find_etype(context, config->preauth_use_strongest_session_key, TRUE, - client, b->etype.val, b->etype.len, NULL, &ckey); + r->client, b->etype.val, b->etype.len, NULL, &ckey); if (ret == 0) { /* @@ -1414,83 +1906,108 @@ if (older_enctype(ckey->key.keytype)) { ret = get_pa_etype_info(context, config, - &method_data, ckey); - if (ret) { - free_METHOD_DATA(&method_data); + &error_method, ckey); + if (ret) goto out; - } } ret = get_pa_etype_info2(context, config, - &method_data, ckey); - if (ret) { - free_METHOD_DATA(&method_data); + &error_method, ckey); + if (ret) goto out; - } } - ASN1_MALLOC_ENCODE(METHOD_DATA, buf, len, &method_data, &len, ret); - free_METHOD_DATA(&method_data); - - e_data.data = buf; - e_data.length = len; - e_text ="Need to use PA-ENC-TIMESTAMP/PA-PK-AS-REQ", - - ret = KRB5KDC_ERR_PREAUTH_REQUIRED; + /* + * send requre preauth is its required or anon is requested, + * anon is today only allowed via preauth mechanisms. + */ + if (require_preauth_p(r) || _kdc_is_anon_request(&r->req)) { + ret = KRB5KDC_ERR_PREAUTH_REQUIRED; + _kdc_set_e_text(r, "Need to use PA-ENC-TIMESTAMP/PA-PK-AS-REQ"); + goto out; + } - kdc_log(context, config, 0, - "No preauth found, returning PREAUTH-REQUIRED -- %s", - client_name); - goto out; + if (ckey == NULL) { + ret = KRB5KDC_ERR_CLIENT_NOTYET; + _kdc_set_e_text(r, "Doesn't have a client key available"); + goto out; + } + krb5_free_keyblock_contents(r->context, &r->reply_key); + ret = krb5_copy_keyblock_contents(r->context, &ckey->key, &r->reply_key); + if (ret) + goto out; } - if (clientdb->hdb_auth_status) - (clientdb->hdb_auth_status)(context, clientdb, client, - HDB_AUTH_SUCCESS); + if (r->clientdb->hdb_auth_status) { + r->clientdb->hdb_auth_status(context, r->clientdb, r->client, + HDB_AUTH_SUCCESS); + } /* * Verify flags after the user been required to prove its identity * with in a preauth mech. */ - ret = _kdc_check_access(context, config, client, client_name, - server, server_name, - req, &e_data); + ret = _kdc_check_access(context, config, r->client, r->client_name, + r->server, r->server_name, + req, &error_method); if(ret) goto out; + if (_kdc_is_anon_request(&r->req)) { + ret = _kdc_check_anon_policy(context, config, r->client, r->server); + if (ret) { + _kdc_set_e_text(r, "Anonymous ticket requests are disabled"); + goto out; + } + + r->et.flags.anonymous = 1; + } + /* - * Selelct the best encryption type for the KDC with out regard to + * Select the best encryption type for the KDC with out regard to * the client since the client never needs to read that data. */ ret = _kdc_get_preferred_key(context, config, - server, server_name, + r->server, r->server_name, &setype, &skey); if(ret) goto out; - if(f.renew || f.validate || f.proxy || f.forwarded || f.enc_tkt_in_skey - || (f.request_anonymous && !config->allow_anonymous)) { + if(f.renew || f.validate || f.proxy || f.forwarded || f.enc_tkt_in_skey) { ret = KRB5KDC_ERR_BADOPTION; - e_text = "Bad KDC options"; - kdc_log(context, config, 0, "Bad KDC options -- %s", client_name); + _kdc_set_e_text(r, "Bad KDC options"); goto out; } + /* + * Build reply + */ + rep.pvno = 5; rep.msg_type = krb_as_rep; - ret = copy_Realm(&client->entry.principal->realm, &rep.crealm); + if (!config->historical_anon_realm && + _kdc_is_anonymous(context, r->client_princ)) { + Realm anon_realm = KRB5_ANON_REALM; + ret = copy_Realm(&anon_realm, &rep.crealm); + } else + ret = copy_Realm(&r->client->entry.principal->realm, &rep.crealm); if (ret) goto out; - ret = _krb5_principal2principalname(&rep.cname, client->entry.principal); + if (r->et.flags.anonymous) + ret = _kdc_make_anonymous_principalname(&rep.cname); + else + ret = _krb5_principal2principalname(&rep.cname, r->client->entry.principal); if (ret) goto out; rep.ticket.tkt_vno = 5; - copy_Realm(&server->entry.principal->realm, &rep.ticket.realm); + ret = copy_Realm(&r->server->entry.principal->realm, &rep.ticket.realm); + if (ret) + goto out; _krb5_principal2principalname(&rep.ticket.sname, - server->entry.principal); + r->server->entry.principal); /* java 1.6 expects the name to be the same type, lets allow that * uncomplicated name-types. */ #define CNT(sp,t) (((sp)->sname->name_type) == KRB5_NT_##t) @@ -1498,77 +2015,69 @@ rep.ticket.sname.name_type = b->sname->name_type; #undef CNT - et.flags.initial = 1; - if(client->entry.flags.forwardable && server->entry.flags.forwardable) - et.flags.forwardable = f.forwardable; + r->et.flags.initial = 1; + if(r->client->entry.flags.forwardable && r->server->entry.flags.forwardable) + r->et.flags.forwardable = f.forwardable; else if (f.forwardable) { - e_text = "Ticket may not be forwardable"; + _kdc_set_e_text(r, "Ticket may not be forwardable"); ret = KRB5KDC_ERR_POLICY; - kdc_log(context, config, 0, - "Ticket may not be forwardable -- %s", client_name); goto out; } - if(client->entry.flags.proxiable && server->entry.flags.proxiable) - et.flags.proxiable = f.proxiable; + if(r->client->entry.flags.proxiable && r->server->entry.flags.proxiable) + r->et.flags.proxiable = f.proxiable; else if (f.proxiable) { - e_text = "Ticket may not be proxiable"; + _kdc_set_e_text(r, "Ticket may not be proxiable"); ret = KRB5KDC_ERR_POLICY; - kdc_log(context, config, 0, - "Ticket may not be proxiable -- %s", client_name); goto out; } - if(client->entry.flags.postdate && server->entry.flags.postdate) - et.flags.may_postdate = f.allow_postdate; + if(r->client->entry.flags.postdate && r->server->entry.flags.postdate) + r->et.flags.may_postdate = f.allow_postdate; else if (f.allow_postdate){ - e_text = "Ticket may not be postdate"; + _kdc_set_e_text(r, "Ticket may not be postdate"); ret = KRB5KDC_ERR_POLICY; - kdc_log(context, config, 0, - "Ticket may not be postdatable -- %s", client_name); goto out; } /* check for valid set of addresses */ if(!_kdc_check_addresses(context, config, b->addresses, from_addr)) { - e_text = "Bad address list in requested"; + _kdc_set_e_text(r, "Bad address list in requested"); ret = KRB5KRB_AP_ERR_BADADDR; - kdc_log(context, config, 0, - "Bad address list requested -- %s", client_name); goto out; } - ret = copy_PrincipalName(&rep.cname, &et.cname); + ret = copy_PrincipalName(&rep.cname, &r->et.cname); if (ret) goto out; - ret = copy_Realm(&rep.crealm, &et.crealm); + ret = copy_Realm(&rep.crealm, &r->et.crealm); if (ret) goto out; { time_t start; time_t t; - - start = et.authtime = kdc_time; + + start = r->et.authtime = kdc_time; if(f.postdated && req->req_body.from){ - ALLOC(et.starttime); - start = *et.starttime = *req->req_body.from; - et.flags.invalid = 1; - et.flags.postdated = 1; /* XXX ??? */ + ALLOC(r->et.starttime); + start = *r->et.starttime = *req->req_body.from; + r->et.flags.invalid = 1; + r->et.flags.postdated = 1; /* XXX ??? */ } _kdc_fix_time(&b->till); t = *b->till; /* be careful not overflowing */ - if(client->entry.max_life) - t = start + min(t - start, *client->entry.max_life); - if(server->entry.max_life) - t = start + min(t - start, *server->entry.max_life); + if(r->client->entry.max_life) + t = start + min(t - start, *r->client->entry.max_life); + if(r->server->entry.max_life) + t = start + min(t - start, *r->server->entry.max_life); #if 0 t = min(t, start + realm->max_life); #endif - et.endtime = t; - if(f.renewable_ok && et.endtime < *b->till){ + r->et.endtime = t; + if(f.renewable_ok && r->et.endtime < *b->till){ f.renewable = 1; if(b->rtime == NULL){ ALLOC(b->rtime); @@ -1581,29 +2090,26 @@ t = *b->rtime; if(t == 0) t = MAX_TIME; - if(client->entry.max_renew) - t = start + min(t - start, *client->entry.max_renew); - if(server->entry.max_renew) - t = start + min(t - start, *server->entry.max_renew); + if(r->client->entry.max_renew) + t = start + min(t - start, *r->client->entry.max_renew); + if(r->server->entry.max_renew) + t = start + min(t - start, *r->server->entry.max_renew); #if 0 t = min(t, start + realm->max_renew); #endif - ALLOC(et.renew_till); - *et.renew_till = t; - et.flags.renewable = 1; + ALLOC(r->et.renew_till); + *r->et.renew_till = t; + r->et.flags.renewable = 1; } } - if (f.request_anonymous) - et.flags.anonymous = 1; - if(b->addresses){ - ALLOC(et.caddr); - copy_HostAddresses(b->addresses, et.caddr); + ALLOC(r->et.caddr); + copy_HostAddresses(b->addresses, r->et.caddr); } - et.transited.tr_type = DOMAIN_X500_COMPRESS; - krb5_data_zero(&et.transited.contents); + r->et.transited.tr_type = DOMAIN_X500_COMPRESS; + krb5_data_zero(&r->et.transited.contents); /* The MIT ASN.1 library (obviously) doesn't tell lengths encoded * as 0 and as 0x80 (meaning indefinite length) apart, and is thus @@ -1614,246 +2120,233 @@ * If there's a pw_end or valid_end we will use that, * otherwise just a dummy lr. */ - ek.last_req.val = malloc(2 * sizeof(*ek.last_req.val)); - if (ek.last_req.val == NULL) { + r->ek.last_req.val = malloc(2 * sizeof(*r->ek.last_req.val)); + if (r->ek.last_req.val == NULL) { ret = ENOMEM; goto out; } - ek.last_req.len = 0; - if (client->entry.pw_end + r->ek.last_req.len = 0; + if (r->client->entry.pw_end && (config->kdc_warn_pwexpire == 0 - || kdc_time + config->kdc_warn_pwexpire >= *client->entry.pw_end)) { - ek.last_req.val[ek.last_req.len].lr_type = LR_PW_EXPTIME; - ek.last_req.val[ek.last_req.len].lr_value = *client->entry.pw_end; - ++ek.last_req.len; - } - if (client->entry.valid_end) { - ek.last_req.val[ek.last_req.len].lr_type = LR_ACCT_EXPTIME; - ek.last_req.val[ek.last_req.len].lr_value = *client->entry.valid_end; - ++ek.last_req.len; - } - if (ek.last_req.len == 0) { - ek.last_req.val[ek.last_req.len].lr_type = LR_NONE; - ek.last_req.val[ek.last_req.len].lr_value = 0; - ++ek.last_req.len; - } - ek.nonce = b->nonce; - if (client->entry.valid_end || client->entry.pw_end) { - ALLOC(ek.key_expiration); - if (client->entry.valid_end) { - if (client->entry.pw_end) - *ek.key_expiration = min(*client->entry.valid_end, - *client->entry.pw_end); + || kdc_time + config->kdc_warn_pwexpire >= *r->client->entry.pw_end)) { + r->ek.last_req.val[r->ek.last_req.len].lr_type = LR_PW_EXPTIME; + r->ek.last_req.val[r->ek.last_req.len].lr_value = *r->client->entry.pw_end; + ++r->ek.last_req.len; + } + if (r->client->entry.valid_end) { + r->ek.last_req.val[r->ek.last_req.len].lr_type = LR_ACCT_EXPTIME; + r->ek.last_req.val[r->ek.last_req.len].lr_value = *r->client->entry.valid_end; + ++r->ek.last_req.len; + } + if (r->ek.last_req.len == 0) { + r->ek.last_req.val[r->ek.last_req.len].lr_type = LR_NONE; + r->ek.last_req.val[r->ek.last_req.len].lr_value = 0; + ++r->ek.last_req.len; + } + r->ek.nonce = b->nonce; + if (r->client->entry.valid_end || r->client->entry.pw_end) { + ALLOC(r->ek.key_expiration); + if (r->client->entry.valid_end) { + if (r->client->entry.pw_end) + *r->ek.key_expiration = min(*r->client->entry.valid_end, + *r->client->entry.pw_end); else - *ek.key_expiration = *client->entry.valid_end; + *r->ek.key_expiration = *r->client->entry.valid_end; } else - *ek.key_expiration = *client->entry.pw_end; + *r->ek.key_expiration = *r->client->entry.pw_end; } else - ek.key_expiration = NULL; - ek.flags = et.flags; - ek.authtime = et.authtime; - if (et.starttime) { - ALLOC(ek.starttime); - *ek.starttime = *et.starttime; - } - ek.endtime = et.endtime; - if (et.renew_till) { - ALLOC(ek.renew_till); - *ek.renew_till = *et.renew_till; - } - copy_Realm(&rep.ticket.realm, &ek.srealm); - copy_PrincipalName(&rep.ticket.sname, &ek.sname); - if(et.caddr){ - ALLOC(ek.caddr); - copy_HostAddresses(et.caddr, ek.caddr); - } - -#if PKINIT - if (pkp) { - e_text = "Failed to build PK-INIT reply"; - ret = _kdc_pk_mk_pa_reply(context, config, pkp, client, - sessionetype, req, req_buffer, - &reply_key, &et.key, rep.padata); - if (ret) - goto out; - ret = _kdc_add_inital_verified_cas(context, - config, - pkp, - &et); - if (ret) - goto out; + r->ek.key_expiration = NULL; + r->ek.flags = r->et.flags; + r->ek.authtime = r->et.authtime; + if (r->et.starttime) { + ALLOC(r->ek.starttime); + *r->ek.starttime = *r->et.starttime; + } + r->ek.endtime = r->et.endtime; + if (r->et.renew_till) { + ALLOC(r->ek.renew_till); + *r->ek.renew_till = *r->et.renew_till; + } + ret = copy_Realm(&rep.ticket.realm, &r->ek.srealm); + if (ret) + goto out; + ret = copy_PrincipalName(&rep.ticket.sname, &r->ek.sname); + if (ret) + goto out; + if(r->et.caddr){ + ALLOC(r->ek.caddr); + copy_HostAddresses(r->et.caddr, r->ek.caddr); + } - } else -#endif - { - ret = krb5_generate_random_keyblock(context, sessionetype, &et.key); + /* + * Check and session and reply keys + */ + + if (r->session_key.keytype == ETYPE_NULL) { + ret = krb5_generate_random_keyblock(context, r->sessionetype, &r->session_key); if (ret) goto out; } - if (reply_key == NULL) { - e_text = "Client have no reply key"; + if (r->reply_key.keytype == ETYPE_NULL) { + _kdc_set_e_text(r, "Client have no reply key"); ret = KRB5KDC_ERR_CLIENT_NOTYET; goto out; } - ret = copy_EncryptionKey(&et.key, &ek.key); + ret = copy_EncryptionKey(&r->session_key, &r->et.key); if (ret) goto out; - /* Add signing of alias referral */ - if (f.canonicalize) { - PA_ClientCanonicalized canon; - krb5_data data; - PA_DATA pa; - krb5_crypto cryptox; - size_t len = 0; - - memset(&canon, 0, sizeof(canon)); + ret = copy_EncryptionKey(&r->session_key, &r->ek.key); + if (ret) + goto out; - canon.names.requested_name = *b->cname; - canon.names.mapped_name = client->entry.principal->name; + if (r->outpadata.len) { - ASN1_MALLOC_ENCODE(PA_ClientCanonicalizedNames, data.data, data.length, - &canon.names, &len, ret); - if (ret) - goto out; - if (data.length != len) - krb5_abortx(context, "internal asn.1 error"); - - /* sign using "returned session key" */ - ret = krb5_crypto_init(context, &et.key, 0, &cryptox); - if (ret) { - free(data.data); + ALLOC(rep.padata); + if (rep.padata == NULL) { + ret = ENOMEM; goto out; } - - ret = krb5_create_checksum(context, cryptox, - KRB5_KU_CANONICALIZED_NAMES, 0, - data.data, data.length, - &canon.canon_checksum); - free(data.data); - krb5_crypto_destroy(context, cryptox); + ret = copy_METHOD_DATA(&r->outpadata, rep.padata); if (ret) goto out; + } + + /* Add the PAC */ + if (send_pac_p(context, req) && !r->et.flags.anonymous) { + generate_pac(r, skey); + } + + _kdc_log_timestamp(context, config, "AS-REQ", r->et.authtime, r->et.starttime, + r->et.endtime, r->et.renew_till); + + { + krb5_principal client_principal; - ASN1_MALLOC_ENCODE(PA_ClientCanonicalized, data.data, data.length, - &canon, &len, ret); - free_Checksum(&canon.canon_checksum); + ret = _krb5_principalname2krb5_principal(context, &client_principal, + rep.cname, rep.crealm); if (ret) goto out; - if (data.length != len) - krb5_abortx(context, "internal asn.1 error"); - pa.padata_type = KRB5_PADATA_CLIENT_CANONICALIZED; - pa.padata_value = data; - ret = add_METHOD_DATA(rep.padata, &pa); - free(data.data); + /* do this as the last thing since this signs the EncTicketPart */ + ret = _kdc_add_KRB5SignedPath(context, + config, + r->server, + setype, + client_principal, + NULL, + NULL, + &r->et); + krb5_free_principal(context, client_principal); if (ret) goto out; } - if (rep.padata->len == 0) { - free(rep.padata); - rep.padata = NULL; - } + log_as_req(context, config, r->reply_key.keytype, setype, b); - /* Add the PAC */ - if (send_pac_p(context, req)) { - krb5_pac p = NULL; - krb5_data data; + /* + * We always say we support FAST/enc-pa-rep + */ - ret = _kdc_pac_generate(context, client, &p); + r->et.flags.enc_pa_rep = r->ek.flags.enc_pa_rep = 1; + + /* + * Add REQ_ENC_PA_REP if client supports it + */ + + i = 0; + pa = _kdc_find_padata(req, &i, KRB5_PADATA_REQ_ENC_PA_REP); + if (pa) { + + ret = add_enc_pa_rep(r); if (ret) { - kdc_log(context, config, 0, "PAC generation failed for -- %s", - client_name); + const char *msg = krb5_get_error_message(r->context, ret); + _kdc_r_log(r, 0, "add_enc_pa_rep failed: %s: %d", msg, ret); + krb5_free_error_message(r->context, msg); goto out; } - if (p != NULL) { - ret = _krb5_pac_sign(context, p, et.authtime, - client->entry.principal, - &skey->key, /* Server key */ - &skey->key, /* FIXME: should be krbtgt key */ - &data); - krb5_pac_free(context, p); - if (ret) { - kdc_log(context, config, 0, "PAC signing failed for -- %s", - client_name); - goto out; - } - - ret = _kdc_tkt_add_if_relevant_ad(context, &et, - KRB5_AUTHDATA_WIN2K_PAC, - &data); - krb5_data_free(&data); - if (ret) - goto out; - } } - _kdc_log_timestamp(context, config, "AS-REQ", et.authtime, et.starttime, - et.endtime, et.renew_till); - - /* do this as the last thing since this signs the EncTicketPart */ - ret = _kdc_add_KRB5SignedPath(context, - config, - server, - setype, - client->entry.principal, - NULL, - NULL, - &et); - if (ret) - goto out; - - log_as_req(context, config, reply_key->keytype, setype, b); + /* + * + */ ret = _kdc_encode_reply(context, config, - &rep, &et, &ek, setype, server->entry.kvno, - &skey->key, client->entry.kvno, - reply_key, 0, &e_text, reply); - free_EncTicketPart(&et); - free_EncKDCRepPart(&ek); + r->armor_crypto, req->req_body.nonce, + &rep, &r->et, &r->ek, setype, r->server->entry.kvno, + &skey->key, r->client->entry.kvno, + &r->reply_key, 0, &r->e_text, reply); if (ret) goto out; - /* */ + /* + * Check if message too large + */ if (datagram_reply && reply->length > config->max_datagram_reply_length) { krb5_data_free(reply); ret = KRB5KRB_ERR_RESPONSE_TOO_BIG; - e_text = "Reply packet too large"; + _kdc_set_e_text(r, "Reply packet too large"); } out: free_AS_REP(&rep); - if(ret != 0 && ret != HDB_ERR_NOT_FOUND_HERE){ - krb5_mk_error(context, - ret, - e_text, - (e_data.data ? &e_data : NULL), - client_princ, - server_princ, - NULL, - NULL, - reply); - ret = 0; + + /* + * In case of a non proxy error, build an error message. + */ + if (ret != 0 && ret != HDB_ERR_NOT_FOUND_HERE && reply->length == 0) { + ret = _kdc_fast_mk_error(context, r, + &error_method, + r->armor_crypto, + &req->req_body, + ret, r->e_text, + r->server_princ, + r->client_princ ? + &r->client_princ->name : NULL, + r->client_princ ? + &r->client_princ->realm : NULL, + NULL, NULL, + reply); + if (ret) + goto out2; } -#ifdef PKINIT - if (pkp) - _kdc_pk_free_client_param(context, pkp); -#endif - if (e_data.data) - free(e_data.data); - if (client_princ) - krb5_free_principal(context, client_princ); - free(client_name); - if (server_princ) - krb5_free_principal(context, server_princ); - free(server_name); - if(client) - _kdc_free_ent(context, client); - if(server) - _kdc_free_ent(context, server); +out2: + free_EncTicketPart(&r->et); + free_EncKDCRepPart(&r->ek); + free_KDCFastState(&r->fast); + + if (error_method.len) + free_METHOD_DATA(&error_method); + if (r->outpadata.len) + free_METHOD_DATA(&r->outpadata); + if (r->client_princ) { + krb5_free_principal(context, r->client_princ); + r->client_princ = NULL; + } + if (r->client_name) { + free(r->client_name); + r->client_name = NULL; + } + if (r->server_princ){ + krb5_free_principal(context, r->server_princ); + r->server_princ = NULL; + } + if (r->server_name) { + free(r->server_name); + r->server_name = NULL; + } + if (r->client) + _kdc_free_ent(context, r->client); + if (r->server) + _kdc_free_ent(context, r->server); + if (r->armor_crypto) { + krb5_crypto_destroy(r->context, r->armor_crypto); + r->armor_crypto = NULL; + } + krb5_free_keyblock_contents(r->context, &r->reply_key); + krb5_free_keyblock_contents(r->context, &r->session_key); return ret; } diff --git a/crypto/heimdal/kdc/krb5tgs.c b/crypto/heimdal/kdc/krb5tgs.c --- a/crypto/heimdal/kdc/krb5tgs.c +++ b/crypto/heimdal/kdc/krb5tgs.c @@ -104,7 +104,7 @@ krb5_kdc_configuration *config, hdb_entry_ex *krbtgt, krb5_enctype enctype, - krb5_principal client, + krb5_const_principal client, krb5_const_principal server, krb5_principals principals, EncTicketPart *tkt) @@ -124,7 +124,7 @@ { KRB5SignedPathData spd; - spd.client = client; + spd.client = rk_UNCONST(client); spd.authtime = tkt->authtime; spd.delegated = principals; spd.method_data = NULL; @@ -139,7 +139,7 @@ { Key *key; - ret = hdb_enctype2key(context, &krbtgt->entry, enctype, &key); + ret = hdb_enctype2key(context, &krbtgt->entry, NULL, enctype, &key); if (ret == 0) ret = krb5_crypto_init(context, &key->key, 0, &crypto); if (ret) { @@ -226,7 +226,8 @@ { Key *key; - ret = hdb_enctype2key(context, &krbtgt->entry, sp.etype, &key); + ret = hdb_enctype2key(context, &krbtgt->entry, NULL, /* XXX use correct kvno! */ + sp.etype, &key); if (ret == 0) ret = krb5_crypto_init(context, &key->key, 0, &crypto); if (ret) { @@ -284,7 +285,6 @@ hdb_entry_ex *server, hdb_entry_ex *krbtgt, const EncryptionKey *server_check_key, - const EncryptionKey *krbtgt_check_key, const EncryptionKey *server_sign_key, const EncryptionKey *krbtgt_sign_key, EncTicketPart *tkt, @@ -330,7 +330,7 @@ ret = krb5_pac_verify(context, pac, tkt->authtime, client_principal, - server_check_key, krbtgt_check_key); + server_check_key, NULL); if (ret) { krb5_pac_free(context, pac); return ret; @@ -366,6 +366,24 @@ return 0; } +static krb5_boolean +is_anon_tgs_request_p(const KDC_REQ_BODY *b, + const EncTicketPart *tgt) +{ + KDCOptions f = b->kdc_options; + + /* + * Versions of Heimdal from 1.0 to 7.6, inclusive, send both the + * request-anonymous and cname-in-addl-tkt flags for constrained + * delegation requests. A true anonymous TGS request will only + * have the request-anonymous flag set. (A corollary of this is + * that it is not possible to support anonymous constrained + * delegation requests, although they would be of limited utility.) + */ + return tgt->flags.anonymous || + (f.request_anonymous && !f.cname_in_addl_tkt && !b->additional_tickets); +} + /* * */ @@ -373,7 +391,10 @@ static krb5_error_code check_tgs_flags(krb5_context context, krb5_kdc_configuration *config, - KDC_REQ_BODY *b, const EncTicketPart *tgt, EncTicketPart *et) + KDC_REQ_BODY *b, + krb5_const_principal tgt_name, + const EncTicketPart *tgt, + EncTicketPart *et) { KDCOptions f = b->kdc_options; @@ -487,14 +508,25 @@ et->endtime = min(*et->renew_till, et->endtime); } -#if 0 - /* checks for excess flags */ - if(f.request_anonymous && !config->allow_anonymous){ + /* + * RFC 8062 section 3 defines an anonymous ticket as one containing + * the anonymous principal and the anonymous ticket flag. + */ + if (tgt->flags.anonymous && + !_kdc_is_anonymous(context, tgt_name)) { kdc_log(context, config, 0, - "Request for anonymous ticket"); + "Anonymous ticket flag set without anonymous principal"); return KRB5KDC_ERR_BADOPTION; } -#endif + + /* + * RFC 8062 section 4.2 states that if the TGT is anonymous, the + * anonymous KDC option SHOULD be set, but it is not required. + * Treat an anonymous TGT as if the anonymous flag was set. + */ + if (is_anon_tgs_request_p(b, tgt)) + et->flags.anonymous = 1; + return 0; } @@ -655,8 +687,12 @@ "Decoding transited encoding"); return ret; } + + /* + * If the realm of the presented tgt is neither the client nor the server + * realm, it is a transit realm and must be added to transited set. + */ if(strcmp(client_realm, tgt_realm) && strcmp(server_realm, tgt_realm)) { - /* not us, so add the previous realm to transited set */ if (num_realms + 1 > UINT_MAX/sizeof(*realms)) { ret = ERANGE; goto free_realms; @@ -737,6 +773,7 @@ const char *server_name, hdb_entry_ex *client, krb5_principal client_principal, + const char *tgt_realm, hdb_entry_ex *krbtgt, krb5_enctype krbtgt_etype, krb5_principals spp, @@ -765,7 +802,7 @@ ALLOC(et.starttime); *et.starttime = kdc_time; - ret = check_tgs_flags(context, config, b, tgt, &et); + ret = check_tgs_flags(context, config, b, tgt_name, tgt, &et); if(ret) goto out; @@ -798,24 +835,33 @@ &tgt->transited, &et, krb5_principal_get_realm(context, client_principal), krb5_principal_get_realm(context, server->entry.principal), - krb5_principal_get_realm(context, krbtgt->entry.principal)); + tgt_realm); if(ret) goto out; - copy_Realm(&server_principal->realm, &rep.ticket.realm); + ret = copy_Realm(&server_principal->realm, &rep.ticket.realm); + if (ret) + goto out; _krb5_principal2principalname(&rep.ticket.sname, server_principal); - copy_Realm(&tgt_name->realm, &rep.crealm); -/* - if (f.request_anonymous) - _kdc_make_anonymous_principalname (&rep.cname); - else */ + ret = copy_Realm(&tgt_name->realm, &rep.crealm); + if (ret) + goto out; - copy_PrincipalName(&tgt_name->name, &rep.cname); + /* + * RFC 8062 states "if the ticket in the TGS request is an anonymous + * one, the client and client realm are copied from that ticket". So + * whilst the TGT flag check below is superfluous, it is included in + * order to follow the specification to its letter. + */ + if (et.flags.anonymous && !tgt->flags.anonymous) + _kdc_make_anonymous_principalname(&rep.cname); + else + ret = copy_PrincipalName(&tgt_name->name, &rep.cname); + if (ret) + goto out; rep.ticket.tkt_vno = 5; ek.caddr = et.caddr; - if(et.caddr == NULL) - et.caddr = tgt->caddr; { time_t life; @@ -836,12 +882,12 @@ } if(et.renew_till){ time_t renew; - renew = *et.renew_till - et.authtime; + renew = *et.renew_till - *et.starttime; if(client && client->entry.max_renew) renew = min(renew, *client->entry.max_renew); if(server->entry.max_renew) renew = min(renew, *server->entry.max_renew); - *et.renew_till = et.authtime + renew; + *et.renew_till = *et.starttime + renew; } if(et.renew_till){ @@ -864,10 +910,21 @@ et.flags.pre_authent = tgt->flags.pre_authent; et.flags.hw_authent = tgt->flags.hw_authent; - et.flags.anonymous = tgt->flags.anonymous; et.flags.ok_as_delegate = server->entry.flags.ok_as_delegate; - if(rspac->length) { + /* See MS-KILE 3.3.5.1 */ + if (!server->entry.flags.forwardable) + et.flags.forwardable = 0; + if (!server->entry.flags.proxiable) + et.flags.proxiable = 0; + + /* + * For anonymous tickets, we should filter out positive authorization data + * that could reveal the client's identity, and return a policy error for + * restrictive authorization data. Policy for unknown authorization types + * is implementation dependent. + */ + if (rspac->length && !et.flags.anonymous) { /* * No not need to filter out the any PAC from the * auth_data since it's signed by the KDC. @@ -917,17 +974,17 @@ ret = krb5_copy_keyblock_contents(context, sessionkey, &et.key); if (ret) goto out; - et.crealm = tgt_name->realm; - et.cname = tgt_name->name; + et.crealm = rep.crealm; + et.cname = rep.cname; ek.key = et.key; /* MIT must have at least one last_req */ - ek.last_req.len = 1; ek.last_req.val = calloc(1, sizeof(*ek.last_req.val)); if (ek.last_req.val == NULL) { ret = ENOMEM; goto out; } + ek.last_req.len = 1; /* set after alloc to avoid null deref on cleanup */ ek.nonce = b->nonce; ek.flags = et.flags; ek.authtime = et.authtime; @@ -969,10 +1026,10 @@ goto out; } - if (krb5_enctype_valid(context, et.key.keytype) != 0 - && _kdc_is_weak_exception(server->entry.principal, et.key.keytype)) + if (krb5_enctype_valid(context, serverkey->keytype) != 0 + && _kdc_is_weak_exception(server->entry.principal, serverkey->keytype)) { - krb5_enctype_enable(context, et.key.keytype); + krb5_enctype_enable(context, serverkey->keytype); is_weak = 1; } @@ -987,13 +1044,13 @@ CAST session key. Should the DES3 etype be added to the etype list, even if we don't want a session key with DES3? */ - ret = _kdc_encode_reply(context, config, - &rep, &et, &ek, et.key.keytype, + ret = _kdc_encode_reply(context, config, NULL, 0, + &rep, &et, &ek, serverkey->keytype, kvno, serverkey, 0, replykey, rk_is_subkey, e_text, reply); if (is_weak) - krb5_enctype_disable(context, et.key.keytype); + krb5_enctype_disable(context, serverkey->keytype); out: free_TGS_REP(&rep); @@ -1092,23 +1149,6 @@ return ret; } -/* - * - */ - -static const char * -find_rpath(krb5_context context, Realm crealm, Realm srealm) -{ - const char *new_realm = krb5_config_get_string(context, - NULL, - "capaths", - crealm, - srealm, - NULL); - return new_realm; -} - - static krb5_boolean need_referral(krb5_context context, krb5_kdc_configuration *config, const KDCOptions * const options, krb5_principal server, @@ -1121,7 +1161,23 @@ if (server->name.name_string.len == 1) name = server->name.name_string.val[0]; - else if (server->name.name_string.len > 1) + else if (server->name.name_string.len == 3) { + /* + This is used to give referrals for the + E3514235-4B06-11D1-AB04-00C04FC2DCD2/NTDSGUID/DNSDOMAIN + SPN form, which is used for inter-domain communication in AD + */ + name = server->name.name_string.val[2]; + kdc_log(context, config, 0, "Giving 3 part referral for %s", name); + *realms = malloc(sizeof(char *)*2); + if (*realms == NULL) { + krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); + return FALSE; + } + (*realms)[0] = strdup(name); + (*realms)[1] = NULL; + return TRUE; + } else if (server->name.name_string.len > 1) name = server->name.name_string.val[1]; else return FALSE; @@ -1156,6 +1212,10 @@ krb5_flags ap_req_options; krb5_flags verify_ap_req_flags; krb5_crypto crypto; + krb5uint32 krbtgt_kvno; /* kvno used for the PA-TGS-REQ AP-REQ Ticket */ + krb5uint32 krbtgt_kvno_try; + int kvno_search_tries = 4; /* number of kvnos to try when tkt_vno == 0 */ + const Keys *krbtgt_keys;/* keyset for TGT tkt_vno */ Key *tkey; krb5_keyblock *subkey = NULL; unsigned usage; @@ -1186,59 +1246,78 @@ ap_req.ticket.sname, ap_req.ticket.realm); - ret = _kdc_db_fetch(context, config, princ, HDB_F_GET_KRBTGT, ap_req.ticket.enc_part.kvno, NULL, krbtgt); + krbtgt_kvno = ap_req.ticket.enc_part.kvno ? *ap_req.ticket.enc_part.kvno : 0; + ret = _kdc_db_fetch(context, config, princ, HDB_F_GET_KRBTGT, + &krbtgt_kvno, NULL, krbtgt); - if(ret == HDB_ERR_NOT_FOUND_HERE) { + if (ret == HDB_ERR_NOT_FOUND_HERE) { + /* XXX Factor out this unparsing of the same princ all over */ char *p; ret = krb5_unparse_name(context, princ, &p); if (ret != 0) p = failed; krb5_free_principal(context, princ); - kdc_log(context, config, 5, "Ticket-granting ticket account %s does not have secrets at this KDC, need to proxy", p); + kdc_log(context, config, 5, + "Ticket-granting ticket account %s does not have secrets at " + "this KDC, need to proxy", p); if (ret == 0) free(p); ret = HDB_ERR_NOT_FOUND_HERE; goto out; - } else if(ret){ - const char *msg = krb5_get_error_message(context, ret); + } else if (ret == HDB_ERR_KVNO_NOT_FOUND) { char *p; ret = krb5_unparse_name(context, princ, &p); if (ret != 0) p = failed; krb5_free_principal(context, princ); - kdc_log(context, config, 0, - "Ticket-granting ticket not found in database: %s", msg); - krb5_free_error_message(context, msg); + kdc_log(context, config, 5, + "Ticket-granting ticket account %s does not have keys for " + "kvno %d at this KDC", p, krbtgt_kvno); if (ret == 0) free(p); - ret = KRB5KRB_AP_ERR_NOT_US; + ret = HDB_ERR_KVNO_NOT_FOUND; goto out; - } - - if(ap_req.ticket.enc_part.kvno && - *ap_req.ticket.enc_part.kvno != (*krbtgt)->entry.kvno){ + } else if (ret == HDB_ERR_NO_MKEY) { char *p; - - ret = krb5_unparse_name (context, princ, &p); + ret = krb5_unparse_name(context, princ, &p); + if (ret != 0) + p = failed; krb5_free_principal(context, princ); + kdc_log(context, config, 5, + "Missing master key for decrypting keys for ticket-granting " + "ticket account %s with kvno %d at this KDC", p, krbtgt_kvno); + if (ret == 0) + free(p); + ret = HDB_ERR_KVNO_NOT_FOUND; + goto out; + } else if (ret) { + const char *msg = krb5_get_error_message(context, ret); + char *p; + ret = krb5_unparse_name(context, princ, &p); if (ret != 0) p = failed; + krb5_free_principal(context, princ); kdc_log(context, config, 0, - "Ticket kvno = %d, DB kvno = %d (%s)", - *ap_req.ticket.enc_part.kvno, - (*krbtgt)->entry.kvno, - p); + "Ticket-granting ticket not found in database: %s", msg); + krb5_free_error_message(context, msg); if (ret == 0) - free (p); - ret = KRB5KRB_AP_ERR_BADKEYVER; + free(p); + ret = KRB5KRB_AP_ERR_NOT_US; goto out; } + krbtgt_kvno_try = krbtgt_kvno ? krbtgt_kvno : (*krbtgt)->entry.kvno; *krbtgt_etype = ap_req.ticket.enc_part.etype; - ret = hdb_enctype2key(context, &(*krbtgt)->entry, +next_kvno: + krbtgt_keys = hdb_kvno2keys(context, &(*krbtgt)->entry, krbtgt_kvno_try); + ret = hdb_enctype2key(context, &(*krbtgt)->entry, krbtgt_keys, ap_req.ticket.enc_part.etype, &tkey); - if(ret){ + if (ret && krbtgt_kvno == 0 && kvno_search_tries > 0) { + kvno_search_tries--; + krbtgt_kvno_try--; + goto next_kvno; + } else if (ret) { char *str = NULL, *p = NULL; krb5_enctype_to_string(context, ap_req.ticket.enc_part.etype, &str); @@ -1267,6 +1346,11 @@ &ap_req_options, ticket, KRB5_KU_TGS_REQ_AUTH); + if (ret == KRB5KRB_AP_ERR_BAD_INTEGRITY && kvno_search_tries > 0) { + kvno_search_tries--; + krbtgt_kvno_try--; + goto next_kvno; + } krb5_free_principal(context, princ); if(ret) { @@ -1481,10 +1565,10 @@ AuthorizationData **auth_data, const struct sockaddr *from_addr) { - krb5_error_code ret; + krb5_error_code ret, ret2; krb5_principal cp = NULL, sp = NULL, rsp = NULL, tp = NULL, dp = NULL; - krb5_principal krbtgt_principal = NULL; - char *spn = NULL, *cpn = NULL, *tpn = NULL, *dpn = NULL; + krb5_principal krbtgt_out_principal = NULL; + char *spn = NULL, *cpn = NULL, *tpn = NULL, *dpn = NULL, *krbtgt_out_n = NULL; hdb_entry_ex *server = NULL, *client = NULL, *s4u2self_impersonated_client = NULL; HDB *clientdb, *s4u2self_impersonated_clientdb; krb5_realm ref_realm = NULL; @@ -1494,6 +1578,12 @@ krb5_keyblock sessionkey; krb5_kvno kvno; krb5_data rspac; + const char *tgt_realm = /* Realm of TGT issuer */ + krb5_principal_get_realm(context, krbtgt->entry.principal); + const char *our_realm = /* Realm of this KDC */ + krb5_principal_get_comp_string(context, krbtgt->entry.principal, 1); + char **capath = NULL; + size_t num_capath = 0; hdb_entry_ex *krbtgt_out = NULL; @@ -1501,7 +1591,6 @@ PrincipalName *s; Realm r; - int nloop = 0; EncTicketPart adtkt; char opt_str[128]; int signedpath = 0; @@ -1528,6 +1617,8 @@ hdb_entry_ex *uu; krb5_principal p; Key *uukey; + krb5uint32 second_kvno = 0; + krb5uint32 *kvno_ptr = NULL; if(b->additional_tickets == NULL || b->additional_tickets->len == 0){ @@ -1544,8 +1635,12 @@ goto out; } _krb5_principalname2krb5_principal(context, &p, t->sname, t->realm); + if(t->enc_part.kvno){ + second_kvno = *t->enc_part.kvno; + kvno_ptr = &second_kvno; + } ret = _kdc_db_fetch(context, config, p, - HDB_F_GET_KRBTGT, t->enc_part.kvno, + HDB_F_GET_KRBTGT, kvno_ptr, NULL, &uu); krb5_free_principal(context, p); if(ret){ @@ -1553,7 +1648,7 @@ ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; goto out; } - ret = hdb_enctype2key(context, &uu->entry, + ret = hdb_enctype2key(context, &uu->entry, NULL, t->enc_part.etype, &uukey); if(ret){ _kdc_free_ent(context, uu); @@ -1571,6 +1666,10 @@ s = &adtkt.cname; r = adtkt.crealm; + } else if (s == NULL) { + ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; + kdc_log(context, config, 0, "No server in request"); + goto out; } _krb5_principalname2krb5_principal(context, &sp, *s, r); @@ -1600,51 +1699,92 @@ ret = _kdc_db_fetch(context, config, sp, HDB_F_GET_SERVER | flags, NULL, NULL, &server); - if(ret == HDB_ERR_NOT_FOUND_HERE) { + if (ret == HDB_ERR_NOT_FOUND_HERE) { kdc_log(context, config, 5, "target %s does not have secrets at this KDC, need to proxy", sp); goto out; - } else if(ret){ + } else if (ret == HDB_ERR_WRONG_REALM) { + free(ref_realm); + ref_realm = strdup(server->entry.principal->realm); + if (ref_realm == NULL) { + ret = krb5_enomem(context); + goto out; + } + + kdc_log(context, config, 5, + "Returning a referral to realm %s for " + "server %s.", + ref_realm, spn); + krb5_free_principal(context, sp); + sp = NULL; + ret = krb5_make_principal(context, &sp, r, KRB5_TGS_NAME, + ref_realm, NULL); + if (ret) + goto out; + free(spn); + spn = NULL; + ret = krb5_unparse_name(context, sp, &spn); + if (ret) + goto out; + + goto server_lookup; + } else if (ret) { const char *new_rlm, *msg; Realm req_rlm; krb5_realm *realms; if ((req_rlm = get_krbtgt_realm(&sp->name)) != NULL) { - if(nloop++ < 2) { - new_rlm = find_rpath(context, tgt->crealm, req_rlm); - if(new_rlm) { - kdc_log(context, config, 5, "krbtgt for realm %s " - "not found, trying %s", - req_rlm, new_rlm); - krb5_free_principal(context, sp); - free(spn); - krb5_make_principal(context, &sp, r, - KRB5_TGS_NAME, new_rlm, NULL); - ret = krb5_unparse_name(context, sp, &spn); - if (ret) - goto out; - - if (ref_realm) - free(ref_realm); - ref_realm = strdup(new_rlm); - goto server_lookup; - } - } - } else if(need_referral(context, config, &b->kdc_options, sp, &realms)) { + if (capath == NULL) { + /* With referalls, hierarchical capaths are always enabled */ + ret2 = _krb5_find_capath(context, tgt->crealm, our_realm, + req_rlm, TRUE, &capath, &num_capath); + if (ret2) { + ret = ret2; + goto out; + } + } + new_rlm = num_capath > 0 ? capath[--num_capath] : NULL; + if (new_rlm) { + kdc_log(context, config, 5, "krbtgt from %s via %s for " + "realm %s not found, trying %s", tgt->crealm, + our_realm, req_rlm, new_rlm); + + free(ref_realm); + ref_realm = strdup(new_rlm); + if (ref_realm == NULL) { + ret = krb5_enomem(context); + goto out; + } + + krb5_free_principal(context, sp); + sp = NULL; + krb5_make_principal(context, &sp, r, + KRB5_TGS_NAME, ref_realm, NULL); + free(spn); + spn = NULL; + ret = krb5_unparse_name(context, sp, &spn); + if (ret) + goto out; + goto server_lookup; + } + } else if (need_referral(context, config, &b->kdc_options, sp, &realms)) { if (strcmp(realms[0], sp->realm) != 0) { kdc_log(context, config, 5, "Returning a referral to realm %s for " "server %s that was not found", realms[0], spn); krb5_free_principal(context, sp); - free(spn); + sp = NULL; krb5_make_principal(context, &sp, r, KRB5_TGS_NAME, realms[0], NULL); + free(spn); + spn = NULL; ret = krb5_unparse_name(context, sp, &spn); - if (ret) + if (ret) { + krb5_free_host_realm(context, realms); goto out; + } - if (ref_realm) - free(ref_realm); + free(ref_realm); ref_realm = strdup(realms[0]); krb5_free_host_realm(context, realms); @@ -1702,15 +1842,21 @@ krb5_principal_is_krbtgt(context, sp) ? config->tgt_use_strongest_session_key : config->svc_use_strongest_session_key, FALSE, - server, b->etype.val, b->etype.len, NULL, - &skey); + server, b->etype.val, b->etype.len, &etype, + NULL); if(ret) { kdc_log(context, config, 0, "Server (%s) has no support for etypes", spn); goto out; } + ret = _kdc_get_preferred_key(context, config, server, spn, + NULL, &skey); + if(ret) { + kdc_log(context, config, 0, + "Server (%s) has no supported etypes", spn); + goto out; + } ekey = &skey->key; - etype = skey->key.keytype; kvno = server->entry.kvno; } @@ -1729,7 +1875,7 @@ * Validate authoriation data */ - ret = hdb_enctype2key(context, &krbtgt->entry, + ret = hdb_enctype2key(context, &krbtgt->entry, NULL, /* XXX use the right kvno! */ krbtgt_etype, &tkey_check); if(ret) { kdc_log(context, config, 0, @@ -1737,46 +1883,53 @@ goto out; } - /* Now refetch the primary krbtgt, and get the current kvno (the + /* + * Now refetch the primary krbtgt, and get the current kvno (the * sign check may have been on an old kvno, and the server may - * have been an incoming trust) */ - ret = krb5_make_principal(context, &krbtgt_principal, - krb5_principal_get_comp_string(context, - krbtgt->entry.principal, - 1), - KRB5_TGS_NAME, - krb5_principal_get_comp_string(context, - krbtgt->entry.principal, - 1), NULL); - if(ret) { - kdc_log(context, config, 0, - "Failed to generate krbtgt principal"); - goto out; + * have been an incoming trust) + */ + + ret = krb5_make_principal(context, + &krbtgt_out_principal, + our_realm, + KRB5_TGS_NAME, + our_realm, + NULL); + if (ret) { + kdc_log(context, config, 0, + "Failed to make krbtgt principal name object for " + "authz-data signatures"); + goto out; + } + ret = krb5_unparse_name(context, krbtgt_out_principal, &krbtgt_out_n); + if (ret) { + kdc_log(context, config, 0, + "Failed to make krbtgt principal name object for " + "authz-data signatures"); + goto out; } - ret = _kdc_db_fetch(context, config, krbtgt_principal, HDB_F_GET_KRBTGT, NULL, NULL, &krbtgt_out); - krb5_free_principal(context, krbtgt_principal); + ret = _kdc_db_fetch(context, config, krbtgt_out_principal, + HDB_F_GET_KRBTGT, NULL, NULL, &krbtgt_out); if (ret) { - krb5_error_code ret2; - char *ktpn, *ktpn2; + char *ktpn = NULL; ret = krb5_unparse_name(context, krbtgt->entry.principal, &ktpn); - ret2 = krb5_unparse_name(context, krbtgt_principal, &ktpn2); kdc_log(context, config, 0, - "Request with wrong krbtgt: %s, %s not found in our database", - (ret == 0) ? ktpn : "", (ret2 == 0) ? ktpn2 : ""); - if(ret == 0) - free(ktpn); - if(ret2 == 0) - free(ktpn2); + "No such principal %s (needed for authz-data signature keys) " + "while processing TGS-REQ for service %s with krbtg %s", + krbtgt_out_n, spn, (ret == 0) ? ktpn : ""); + free(ktpn); ret = KRB5KRB_AP_ERR_NOT_US; goto out; } - /* The first realm is the realm of the service, the second is + /* + * The first realm is the realm of the service, the second is * krbtgt//@REALM component of the krbtgt DN the request was * encrypted to. The redirection via the krbtgt_out entry allows * the DB to possibly correct the case of the realm (Samba4 does - * this) before the strcmp() */ + * this) before the strcmp() + */ if (strcmp(krb5_principal_get_realm(context, server->entry.principal), krb5_principal_get_realm(context, krbtgt_out->entry.principal)) != 0) { char *ktpn; @@ -1787,10 +1940,18 @@ if(ret == 0) free(ktpn); ret = KRB5KRB_AP_ERR_NOT_US; + goto out; } - ret = hdb_enctype2key(context, &krbtgt_out->entry, - krbtgt_etype, &tkey_sign); + ret = _kdc_get_preferred_key(context, config, krbtgt_out, krbtgt_out_n, + NULL, &tkey_sign); + if (ret) { + kdc_log(context, config, 0, + "Failed to find key for krbtgt PAC signature"); + goto out; + } + ret = hdb_enctype2key(context, &krbtgt_out->entry, NULL, + tkey_sign->key.keytype, &tkey_sign); if(ret) { kdc_log(context, config, 0, "Failed to find key for krbtgt PAC signature"); @@ -1829,7 +1990,7 @@ ret = check_PAC(context, config, cp, NULL, client, server, krbtgt, - &tkey_check->key, &tkey_check->key, + &tkey_check->key, ekey, &tkey_sign->key, tgt, &rspac, &signedpath); if (ret) { @@ -1885,6 +2046,13 @@ goto out; } + if (!krb5_checksum_is_keyed(context, self.cksum.cksumtype)) { + free_PA_S4U2Self(&self); + kdc_log(context, config, 0, "Reject PA-S4U2Self with unkeyed checksum"); + ret = KRB5KRB_AP_ERR_INAPP_CKSUM; + goto out; + } + ret = _krb5_s4u2self_to_checksumdata(context, &self, &datack); if (ret) goto out; @@ -1899,12 +2067,29 @@ goto out; } - ret = krb5_verify_checksum(context, - crypto, - KRB5_KU_OTHER_CKSUM, - datack.data, - datack.length, - &self.cksum); + /* Allow HMAC_MD5 checksum with any key type */ + if (self.cksum.cksumtype == CKSUMTYPE_HMAC_MD5) { + unsigned char csdata[16]; + Checksum cs; + + cs.checksum.length = sizeof(csdata); + cs.checksum.data = &csdata; + + ret = _krb5_HMAC_MD5_checksum(context, &crypto->key, + datack.data, datack.length, + KRB5_KU_OTHER_CKSUM, &cs); + if (ret == 0 && + krb5_data_ct_cmp(&cs.checksum, &self.cksum.checksum) != 0) + ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; + } + else { + ret = krb5_verify_checksum(context, + crypto, + KRB5_KU_OTHER_CKSUM, + datack.data, + datack.length, + &self.cksum); + } krb5_data_free(&datack); krb5_crypto_destroy(context, crypto); if (ret) { @@ -1950,6 +2135,9 @@ goto out; } + /* Ignore require_pwchange and pw_end attributes (as Windows does), + * since S4U2Self is not password authentication. */ + s4u2self_impersonated_client->entry.flags.require_pwchange = FALSE; free(s4u2self_impersonated_client->entry.pw_end); s4u2self_impersonated_client->entry.pw_end = NULL; @@ -2020,6 +2208,7 @@ if (client != NULL && b->additional_tickets != NULL && b->additional_tickets->len != 0 + && b->kdc_options.cname_in_addl_tkt && b->kdc_options.enc_tkt_in_skey == 0) { int ad_signedpath = 0; @@ -2041,6 +2230,8 @@ t = &b->additional_tickets->val[0]; ret = hdb_enctype2key(context, &client->entry, + hdb_kvno2keys(context, &client->entry, + t->enc_part.kvno ? * t->enc_part.kvno : 0), t->enc_part.etype, &clientkey); if(ret){ ret = KRB5KDC_ERR_ETYPE_NOSUPP; /* XXX */ @@ -2111,7 +2302,7 @@ */ ret = check_PAC(context, config, tp, dp, client, server, krbtgt, - &clientkey->key, &tkey_check->key, + &clientkey->key, ekey, &tkey_sign->key, &adtkt, &rspac, &ad_signedpath); if (ret) { @@ -2186,6 +2377,13 @@ goto out; } + /* check local and per-principal anonymous ticket issuance policy */ + if (is_anon_tgs_request_p(b, tgt)) { + ret = _kdc_check_anon_policy(context, config, client, server); + if (ret) + goto out; + } + /* * If this is an referral, add server referral data to the * auth_data reply . @@ -2240,8 +2438,9 @@ spn, client, cp, + tgt_realm, krbtgt_out, - krbtgt_etype, + tkey_sign->key.keytype, spp, &rspac, &enc_pa_data, @@ -2253,8 +2452,9 @@ free(tpn); free(spn); free(cpn); - if (dpn) - free(dpn); + free(dpn); + free(krbtgt_out_n); + _krb5_free_capath(context, capath); krb5_data_free(&rspac); krb5_free_keyblock_contents(context, &sessionkey); @@ -2269,14 +2469,11 @@ if (tp && tp != cp) krb5_free_principal(context, tp); - if (cp) - krb5_free_principal(context, cp); - if (dp) - krb5_free_principal(context, dp); - if (sp) - krb5_free_principal(context, sp); - if (ref_realm) - free(ref_realm); + krb5_free_principal(context, cp); + krb5_free_principal(context, dp); + krb5_free_principal(context, sp); + krb5_free_principal(context, krbtgt_out_principal); + free(ref_realm); free_METHOD_DATA(&enc_pa_data); free_EncTicketPart(&adtkt); @@ -2349,6 +2546,13 @@ goto out; } + { + const PA_DATA *pa = _kdc_find_padata(req, &i, KRB5_PADATA_FX_FAST); + if (pa) + kdc_log(context, config, 10, "Got TGS FAST request"); + } + + ret = tgs_build_reply(context, config, req, @@ -2379,17 +2583,23 @@ out: if (replykey) krb5_free_keyblock(context, replykey); + if(ret && ret != HDB_ERR_NOT_FOUND_HERE && data->data == NULL){ - krb5_mk_error(context, - ret, - NULL, - NULL, - NULL, - NULL, - csec, - cusec, - data); - ret = 0; + /* XXX add fast wrapping on the error */ + METHOD_DATA error_method = { 0, NULL }; + + + kdc_log(context, config, 10, "tgs-req: sending error: %d to client", ret); + ret = _kdc_fast_mk_error(context, NULL, + &error_method, + NULL, + NULL, + ret, NULL, + NULL, + NULL, NULL, + csec, cusec, + data); + free_METHOD_DATA(&error_method); } free(csec); free(cusec); diff --git a/crypto/heimdal/kdc/kstash-version.rc b/crypto/heimdal/kdc/kstash-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/kstash-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "KDC Master Password Stash Tool" +#define RC_FILE_ORIG_0409 "kstash.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kdc/kstash.c b/crypto/heimdal/kdc/kstash.c --- a/crypto/heimdal/kdc/kstash.c +++ b/crypto/heimdal/kdc/kstash.c @@ -64,8 +64,9 @@ int main(int argc, char **argv) { - char buf[1024]; + char buf[1024+1]; krb5_error_code ret; + int aret; krb5_enctype enctype; @@ -84,8 +85,11 @@ krb5_errx(context, 1, "random-key and master-key-fd " "is mutual exclusive"); - if (keyfile == NULL) - asprintf(&keyfile, "%s/m-key", hdb_db_dir(context)); + if (keyfile == NULL) { + aret = asprintf(&keyfile, "%s/m-key", hdb_db_dir(context)); + if (aret == -1) + krb5_errx(context, 1, "out of memory"); + } ret = krb5_string_to_enctype(context, enctype_str, &enctype); if(ret) @@ -113,14 +117,15 @@ } else { if(master_key_fd != -1) { ssize_t n; - n = read(master_key_fd, buf, sizeof(buf)); + n = read(master_key_fd, buf, sizeof(buf)-1); if(n <= 0) krb5_err(context, 1, errno, "failed to read passphrase"); buf[n] = '\0'; buf[strcspn(buf, "\r\n")] = '\0'; } else { - if(UI_UTIL_read_pw_string(buf, sizeof(buf), "Master key: ", 1)) + if(UI_UTIL_read_pw_string(buf, sizeof(buf), "Master key: ", + UI_UTIL_FLAG_VERIFY)) exit(1); } krb5_string_to_key_salt(context, enctype, buf, salt, &key); @@ -134,9 +139,20 @@ } { - char *new, *old; - asprintf(&old, "%s.old", keyfile); - asprintf(&new, "%s.new", keyfile); + char *new = NULL, *old = NULL; + + aret = asprintf(&old, "%s.old", keyfile); + if (aret == -1) { + old = NULL; + ret = ENOMEM; + goto out; + } + aret = asprintf(&new, "%s.new", keyfile); + if (aret == -1) { + new = NULL; + ret = ENOMEM; + goto out; + } if(unlink(new) < 0 && errno != ENOENT) { ret = errno; goto out; diff --git a/crypto/heimdal/kdc/kstash.cat8 b/crypto/heimdal/kdc/kstash.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/kstash.cat8 @@ -0,0 +1,42 @@ +KSTASH(8) BSD System Manager's Manual KSTASH(8) + +NAME + kstash -- store the KDC master password in a file + +SYNOPSIS + kstash [-e string | --enctype=string] [-k file | --key-file=file] + [--convert-file] [--random-key] [--master-key-fd=fd] + [--random-key] [-h | --help] [--version] + +DESCRIPTION + kstash reads the Kerberos master key and stores it in a file that will be + used by the KDC. + + Supported options: + + -e string, --enctype=string + the encryption type to use, defaults to DES3-CBC-SHA1. + + -k file, --key-file=file + the name of the master key file. + + --convert-file + don't ask for a new master key, just read an old master key file, + and write it back in the new keyfile format. + + --random-key + generate a random master key. + + --master-key-fd=fd + filedescriptor to read passphrase from, if not specified the + passphrase will be read from the terminal. + +FILES + /var/heimdal/m-key is the default keyfile if no other keyfile is speci- + fied. The format of a Heimdal master key is the same as a keytab, so + ktutil list can be used to list the content of the file. + +SEE ALSO + kdc(8) + +HEIMDAL April 10, 2007 HEIMDAL diff --git a/crypto/heimdal/kdc/kx509.c b/crypto/heimdal/kdc/kx509.c --- a/crypto/heimdal/kdc/kx509.c +++ b/crypto/heimdal/kdc/kx509.c @@ -64,7 +64,7 @@ krb5_keyblock *key) { unsigned char digest[SHA_DIGEST_LENGTH]; - HMAC_CTX *ctx; + HMAC_CTX ctx; if (req->pk_hash.length != sizeof(digest)) { krb5_set_error_message(context, KRB5KDC_ERR_PREAUTH_FAILED, @@ -73,21 +73,16 @@ return KRB5KDC_ERR_PREAUTH_FAILED; } - ctx = HMAC_CTX_new(); - if (ctx == NULL) { - krb5_set_error_message(context, ENOMEM, - "HMAC context malloc failed"); - return ENOMEM; - } - HMAC_Init_ex(ctx, + HMAC_CTX_init(&ctx); + HMAC_Init_ex(&ctx, key->keyvalue.data, key->keyvalue.length, EVP_sha1(), NULL); - if (sizeof(digest) != HMAC_size(ctx)) + if (sizeof(digest) != HMAC_size(&ctx)) krb5_abortx(context, "runtime error, hmac buffer wrong size in kx509"); - HMAC_Update(ctx, version_2_0, sizeof(version_2_0)); - HMAC_Update(ctx, req->pk_key.data, req->pk_key.length); - HMAC_Final(ctx, digest, 0); - HMAC_CTX_free(ctx); + HMAC_Update(&ctx, version_2_0, sizeof(version_2_0)); + HMAC_Update(&ctx, req->pk_key.data, req->pk_key.length); + HMAC_Final(&ctx, digest, 0); + HMAC_CTX_cleanup(&ctx); if (memcmp(req->pk_hash.data, digest, sizeof(digest)) != 0) { krb5_set_error_message(context, KRB5KDC_ERR_PREAUTH_FAILED, @@ -103,40 +98,35 @@ Kx509Response *rep) { krb5_error_code ret; - HMAC_CTX *ctx; + HMAC_CTX ctx; - ctx = HMAC_CTX_new(); - if (ctx == NULL) { - krb5_set_error_message(context, ENOMEM, - "HMAC context malloc failed"); - return ENOMEM; - } + HMAC_CTX_init(&ctx); - HMAC_Init_ex(ctx, key->keyvalue.data, key->keyvalue.length, + HMAC_Init_ex(&ctx, key->keyvalue.data, key->keyvalue.length, EVP_sha1(), NULL); - ret = krb5_data_alloc(rep->hash, HMAC_size(ctx)); + ret = krb5_data_alloc(rep->hash, HMAC_size(&ctx)); if (ret) { - HMAC_CTX_free(ctx); + HMAC_CTX_cleanup(&ctx); krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } - HMAC_Update(ctx, version_2_0, sizeof(version_2_0)); + HMAC_Update(&ctx, version_2_0, sizeof(version_2_0)); if (rep->error_code) { int32_t t = *rep->error_code; do { unsigned char p = (t & 0xff); - HMAC_Update(ctx, &p, 1); + HMAC_Update(&ctx, &p, 1); t >>= 8; } while (t); } if (rep->certificate) - HMAC_Update(ctx, rep->certificate->data, rep->certificate->length); + HMAC_Update(&ctx, rep->certificate->data, rep->certificate->length); if (rep->e_text) - HMAC_Update(ctx, (unsigned char *)*rep->e_text, strlen(*rep->e_text)); + HMAC_Update(&ctx, (unsigned char *)*rep->e_text, strlen(*rep->e_text)); - HMAC_Final(ctx, rep->hash->data, 0); - HMAC_CTX_free(ctx); + HMAC_Final(&ctx, rep->hash->data, 0); + HMAC_CTX_cleanup(&ctx); return 0; } @@ -153,22 +143,54 @@ krb5_principal principal, krb5_data *certificate) { + char *name = NULL; + const char *kx509_ca; hx509_ca_tbs tbs = NULL; hx509_env env = NULL; hx509_cert cert = NULL; hx509_cert signer = NULL; + krb5_boolean def_bool; int ret; - if (krb5_principal_get_comp_string(context, principal, 1) != NULL) { - kdc_log(context, config, 0, "Principal is not a user"); - return EINVAL; - } + ret = krb5_unparse_name_flags(context, principal, + KRB5_PRINCIPAL_UNPARSE_NO_REALM, + &name); + if (ret) + goto out; + + ret = hx509_env_add(context->hx509ctx, &env, "principal-name-without-realm", + name); + krb5_xfree(name); + name = NULL; + if (ret) + goto out; + + /* + * Include the realm in the principal-name env var; the template + * might not use $principal-name-realm after all. + */ + ret = krb5_unparse_name(context, principal, &name); + if (ret) + goto out; ret = hx509_env_add(context->hx509ctx, &env, "principal-name", - krb5_principal_get_comp_string(context, principal, 0)); + name); if (ret) goto out; + ret = hx509_env_add(context->hx509ctx, &env, "principal-name-realm", + krb5_principal_get_realm(context, principal)); + if (ret) + goto out; + + /* Pick an issuer based on the crealm if we can */ + kx509_ca = krb5_config_get_string(context, NULL, "kdc", + krb5_principal_get_realm(context, + principal), + "kx509_ca", NULL); + if (kx509_ca == NULL) + kx509_ca = config->kx509_ca; + { hx509_certs certs; hx509_query *q; @@ -253,6 +275,19 @@ goto out; } + def_bool = krb5_config_get_bool_default(context, NULL, TRUE, "kdc", + "kx509_include_pkinit_san", + NULL); + if (krb5_config_get_bool_default(context, NULL, def_bool, "kdc", + krb5_principal_get_realm(context, + principal), + "kx509_include_pkinit_san", + NULL)) { + ret = hx509_ca_tbs_add_san_pkinit(context->hx509ctx, tbs, name); + if (ret) + goto out; + } + hx509_ca_tbs_set_notAfter(context->hx509ctx, tbs, endtime); hx509_ca_tbs_subject_expand(context->hx509ctx, tbs, env); @@ -270,8 +305,13 @@ if (ret) goto out; + /* cleanup on success */ + krb5_xfree(name); + return 0; out: + if (name) + krb5_xfree(name); if (env) hx509_env_free(&env); if (tbs) @@ -282,6 +322,53 @@ return ret; } +krb5_error_code +kdc_kx509_verify_service_principal(krb5_context context, + const char *cname, + krb5_principal sprincipal) +{ + krb5_error_code ret, aret; + krb5_boolean bret; + krb5_principal principal = NULL; + char *expected = NULL; + char localhost[MAXHOSTNAMELEN]; + + ret = gethostname(localhost, sizeof(localhost) - 1); + if (ret != 0) { + ret = errno; + krb5_set_error_message(context, ret, + N_("Failed to get local hostname", "")); + return ret; + } + localhost[sizeof(localhost) - 1] = '\0'; + + ret = krb5_make_principal(context, &principal, "", "kca_service", + localhost, NULL); + if (ret) + goto out; + + bret = krb5_principal_compare_any_realm(context, sprincipal, principal); + if (bret == TRUE) + goto out; /* found a match */ + + ret = KRB5KDC_ERR_SERVER_NOMATCH; + + aret = krb5_unparse_name(context, sprincipal, &expected); + if (aret) + goto out; + + krb5_set_error_message(context, ret, + "User %s used wrong Kx509 service " + "principal, expected: %s", + cname, expected); + + out: + krb5_xfree(expected); + krb5_free_principal(context, principal); + + return ret; +} + /* * */ @@ -302,6 +389,7 @@ Kx509Response rep; size_t size; krb5_keyblock *key = NULL; + krb5_boolean def_bool; krb5_data_zero(reply); memset(&rep, 0, sizeof(rep)); @@ -314,7 +402,7 @@ kdc_log(context, config, 0, "Kx509 request from %s", from); - ret = krb5_kt_resolve(context, "HDB:", &id); + ret = krb5_kt_resolve(context, "HDBGET:", &id); if (ret) { kdc_log(context, config, 0, "Can't open database for digest"); goto out; @@ -334,48 +422,29 @@ if (ret) goto out; + def_bool = krb5_config_get_bool_default(context, NULL, TRUE, "kdc", + "require_initial_kca_tickets", + NULL); + if (!ticket->ticket.flags.initial && + krb5_config_get_bool_default(context, NULL, def_bool, "kdc", + krb5_principal_get_realm(context, + cprincipal), + "require_initial_kca_tickets", NULL)) { + ret = KRB5KDC_ERR_POLICY; + goto out; + } + ret = krb5_unparse_name(context, cprincipal, &cname); if (ret) goto out; - /* verify server principal */ - - ret = krb5_sname_to_principal(context, NULL, "kca_service", - KRB5_NT_UNKNOWN, &sprincipal); + ret = krb5_ticket_get_server(context, ticket, &sprincipal); if (ret) goto out; - { - krb5_principal principal = NULL; - - ret = krb5_ticket_get_server(context, ticket, &principal); - if (ret) - goto out; - - ret = krb5_principal_compare(context, sprincipal, principal); - krb5_free_principal(context, principal); - if (ret != TRUE) { - char *expected, *used; - - ret = krb5_unparse_name(context, sprincipal, &expected); - if (ret) - goto out; - ret = krb5_unparse_name(context, principal, &used); - if (ret) { - krb5_xfree(expected); - goto out; - } - - ret = KRB5KDC_ERR_SERVER_NOMATCH; - krb5_set_error_message(context, ret, - "User %s used wrong Kx509 service " - "principal, expected: %s, used %s", - cname, expected, used); - krb5_xfree(expected); - krb5_xfree(used); - goto out; - } - } + ret = kdc_kx509_verify_service_principal(context, cname, sprincipal); + if (ret) + goto out; ret = krb5_auth_con_getkey(context, ac, &key); if (ret == 0 && key == NULL) @@ -391,15 +460,15 @@ /* Verify that the key is encoded RSA key */ { - RSAPublicKey key; - size_t size; + RSAPublicKey rsapkey; + size_t rsapkeysize; ret = decode_RSAPublicKey(req->pk_key.data, req->pk_key.length, - &key, &size); + &rsapkey, &rsapkeysize); if (ret) goto out; - free_RSAPublicKey(&key); - if (size != req->pk_key.length) { + free_RSAPublicKey(&rsapkey); + if (rsapkeysize != req->pk_key.length) { ret = ASN1_EXTRA_DATA; goto out; } diff --git a/crypto/heimdal/kdc/libkdc-exports.def b/crypto/heimdal/kdc/libkdc-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/libkdc-exports.def @@ -0,0 +1,14 @@ +EXPORTS + kdc_log + kdc_log_msg + kdc_log_msg_va + kdc_openlog + krb5_kdc_windc_init + krb5_kdc_get_config + krb5_kdc_pkinit_config + krb5_kdc_set_dbinfo + krb5_kdc_process_krb5_request + krb5_kdc_process_request + krb5_kdc_save_request + krb5_kdc_update_time + krb5_kdc_pk_initialize diff --git a/crypto/heimdal/kdc/libkdc-version.rc b/crypto/heimdal/kdc/libkdc-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/libkdc-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_DLL +#define RC_FILE_DESC_0409 "Heimdal KDC Library" +#define RC_FILE_ORIG_0409 "libkdc.dll" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kdc/log.c b/crypto/heimdal/kdc/log.c --- a/crypto/heimdal/kdc/log.c +++ b/crypto/heimdal/kdc/log.c @@ -53,7 +53,7 @@ char *ss; if (asprintf(&ss, "0-1/FILE:%s/%s", hdb_db_dir(context), KDC_LOG_FILE) < 0) - err(1, NULL); + err(1, "out of memory"); krb5_addlog_dest(context, config->logf, ss); free(ss); } diff --git a/crypto/heimdal/kdc/main.c b/crypto/heimdal/kdc/main.c --- a/crypto/heimdal/kdc/main.c +++ b/crypto/heimdal/kdc/main.c @@ -44,9 +44,14 @@ sig_atomic_t exit_flag = 0; -#ifdef SUPPORT_DETACH int detach_from_console = -1; -#endif +int daemon_child = -1; +int do_bonjour = -1; + +static RETSIGTYPE +sigchld(int sig) +{ +} static RETSIGTYPE sigterm(int sig) @@ -68,8 +73,12 @@ if ((runas_string || chroot_string) && geteuid() != 0) errx(1, "no running as root, can't switch user/chroot"); - if (chroot_string && chroot(chroot_string) != 0) - errx(1, "chroot(%s)", "chroot_string failed"); + if (chroot_string) { + if (chroot(chroot_string)) + err(1, "chroot(%s) failed", chroot_string); + if (chdir("/")) + err(1, "chdir(/) after chroot failed"); + } if (runas_string) { struct passwd *pw; @@ -101,13 +110,13 @@ #endif } - int main(int argc, char **argv) { krb5_error_code ret; krb5_context context; krb5_kdc_configuration *config; + int optidx = 0; setprogname(argv[0]); @@ -117,11 +126,11 @@ else if (ret) errx (1, "krb5_init_context failed: %d", ret); - ret = krb5_kt_register(context, &hdb_kt_ops); + ret = krb5_kt_register(context, &hdb_get_kt_ops); if (ret) errx (1, "krb5_kt_register(HDB) failed: %d", ret); - config = configure(context, argc, argv); + config = configure(context, argc, argv, &optidx); #ifdef HAVE_SIGACTION { @@ -137,6 +146,11 @@ sigaction(SIGXCPU, &sa, NULL); #endif +#ifdef SIGCHLD + sa.sa_handler = sigchld; + sigaction(SIGCHLD, &sa, NULL); +#endif + sa.sa_handler = SIG_IGN; #ifdef SIGPIPE sigaction(SIGPIPE, &sa, NULL); @@ -145,6 +159,9 @@ #else signal(SIGINT, sigterm); signal(SIGTERM, sigterm); +#ifdef SIGCHLD + signal(SIGCHLD, sigchld); +#endif #ifdef SIGXCPU signal(SIGXCPU, sigterm); #endif @@ -152,18 +169,11 @@ signal(SIGPIPE, SIG_IGN); #endif #endif -#ifdef SUPPORT_DETACH - if (detach_from_console) - daemon(0, 0); -#endif -#ifdef __APPLE__ - bonjour_announce(context, config); -#endif - pidfile(NULL); + rk_pidfile(NULL); switch_environment(); - loop(context, config); + start_kdc(context, config, argv[0]); krb5_free_context(context); return 0; } diff --git a/crypto/heimdal/kdc/misc.c b/crypto/heimdal/kdc/misc.c --- a/crypto/heimdal/kdc/misc.c +++ b/crypto/heimdal/kdc/misc.c @@ -33,6 +33,22 @@ #include "kdc_locl.h" +static int +name_type_ok(krb5_context context, + krb5_kdc_configuration *config, + krb5_const_principal principal) +{ + int nt = krb5_principal_get_type(context, principal); + + if (!krb5_principal_is_krbtgt(context, principal)) + return 1; + if (nt == KRB5_NT_SRV_INST || nt == KRB5_NT_UNKNOWN) + return 1; + if (config->strict_nametypes == 0) + return 1; + return 0; +} + struct timeval _kdc_now; krb5_error_code @@ -44,45 +60,45 @@ HDB **db, hdb_entry_ex **h) { - hdb_entry_ex *ent; + hdb_entry_ex *ent = NULL; krb5_error_code ret = HDB_ERR_NOENTRY; int i; unsigned kvno = 0; + krb5_principal enterprise_principal = NULL; + krb5_const_principal princ; - if (kvno_ptr) { - kvno = *kvno_ptr; - flags |= HDB_F_KVNO_SPECIFIED; - } + *h = NULL; + + if (!name_type_ok(context, config, principal)) + goto out2; - ent = calloc (1, sizeof (*ent)); - if (ent == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; + if (kvno_ptr != NULL && *kvno_ptr != 0) { + kvno = *kvno_ptr; + flags |= HDB_F_KVNO_SPECIFIED; + } else { + flags |= HDB_F_ALL_KVNOS; } - for(i = 0; i < config->num_db; i++) { - krb5_principal enterprise_principal = NULL; - if (!(config->db[i]->hdb_capability_flags & HDB_CAP_F_HANDLE_ENTERPRISE_PRINCIPAL) - && principal->name.name_type == KRB5_NT_ENTERPRISE_PRINCIPAL) { - if (principal->name.name_string.len != 1) { - ret = KRB5_PARSE_MALFORMED; - krb5_set_error_message(context, ret, - "malformed request: " - "enterprise name with %d name components", - principal->name.name_string.len); - free(ent); - return ret; - } - ret = krb5_parse_name(context, principal->name.name_string.val[0], - &enterprise_principal); - if (ret) { - free(ent); - return ret; - } - - principal = enterprise_principal; - } + ent = calloc(1, sizeof (*ent)); + if (ent == NULL) + return krb5_enomem(context); + + if (principal->name.name_type == KRB5_NT_ENTERPRISE_PRINCIPAL) { + if (principal->name.name_string.len != 1) { + ret = KRB5_PARSE_MALFORMED; + krb5_set_error_message(context, ret, + "malformed request: " + "enterprise name with %d name components", + principal->name.name_string.len); + goto out; + } + ret = krb5_parse_name(context, principal->name.name_string.val[0], + &enterprise_principal); + if (ret) + goto out; + } + for (i = 0; i < config->num_db; i++) { ret = config->db[i]->hdb_open(context, config->db[i], O_RDONLY, 0); if (ret) { const char *msg = krb5_get_error_message(context, ret); @@ -91,26 +107,56 @@ continue; } + princ = principal; + if (!(config->db[i]->hdb_capability_flags & HDB_CAP_F_HANDLE_ENTERPRISE_PRINCIPAL) && enterprise_principal) + princ = enterprise_principal; + ret = config->db[i]->hdb_fetch_kvno(context, config->db[i], - principal, + princ, flags | HDB_F_DECRYPT, kvno, ent); - - krb5_free_principal(context, enterprise_principal); - config->db[i]->hdb_close(context, config->db[i]); - if(ret == 0) { + + switch (ret) { + case HDB_ERR_WRONG_REALM: + /* + * the ent->entry.principal just contains hints for the client + * to retry. This is important for enterprise principal routing + * between trusts. + */ + /* fall through */ + case 0: if (db) *db = config->db[i]; *h = ent; - return 0; + ent = NULL; + goto out; + + case HDB_ERR_NOENTRY: + /* Check the other databases */ + continue; + + default: + /* + * This is really important, because errors like + * HDB_ERR_NOT_FOUND_HERE (used to indicate to Samba that + * the RODC on which this code is running does not have + * the key we need, and so a proxy to the KDC is required) + * have specific meaning, and need to be propogated up. + */ + goto out; } } + +out2: + if (ret == HDB_ERR_NOENTRY) { + krb5_set_error_message(context, ret, "no such entry found in hdb"); + } +out: + krb5_free_principal(context, enterprise_principal); free(ent); - krb5_set_error_message(context, ret, - "no such entry found in hdb"); return ret; } @@ -140,10 +186,11 @@ if (config->use_strongest_server_key) { const krb5_enctype *p = krb5_kerberos_enctypes(context); - for (i = 0; p[i] != ETYPE_NULL; i++) { - if (krb5_enctype_valid(context, p[i]) != 0) + for (i = 0; p[i] != (krb5_enctype)ETYPE_NULL; i++) { + if (krb5_enctype_valid(context, p[i]) != 0 && + !_kdc_is_weak_exception(h->entry.principal, p[i])) continue; - ret = hdb_enctype2key(context, &h->entry, p[i], key); + ret = hdb_enctype2key(context, &h->entry, NULL, p[i], key); if (ret != 0) continue; if (enctype != NULL) @@ -154,11 +201,11 @@ *key = NULL; for (i = 0; i < h->entry.keys.len; i++) { - if (krb5_enctype_valid(context, h->entry.keys.val[i].key.keytype) - != 0) + if (krb5_enctype_valid(context, h->entry.keys.val[i].key.keytype) != 0 && + !_kdc_is_weak_exception(h->entry.principal, h->entry.keys.val[i].key.keytype)) continue; - ret = hdb_enctype2key(context, &h->entry, - h->entry.keys.val[i].key.keytype, key); + ret = hdb_enctype2key(context, &h->entry, NULL, + h->entry.keys.val[i].key.keytype, key); if (ret != 0) continue; if (enctype != NULL) diff --git a/crypto/heimdal/kdc/mit_dump.c b/crypto/heimdal/kdc/mit_dump.c --- a/crypto/heimdal/kdc/mit_dump.c +++ b/crypto/heimdal/kdc/mit_dump.c @@ -33,6 +33,17 @@ #include "hprop.h" +extern krb5_error_code _hdb_mdb_value2entry(krb5_context context, + krb5_data *data, + krb5_kvno target_kvno, + hdb_entry *entry); + +extern int _hdb_mit_dump2mitdb_entry(krb5_context context, + char *line, + krb5_storage *sp); + + + /* can have any number of princ stanzas. format is as follows (only \n indicates newlines) @@ -74,19 +85,6 @@ */ -static int -hex_to_octet_string(const char *ptr, krb5_data *data) -{ - size_t i; - unsigned int v; - for(i = 0; i < data->length; i++) { - if(sscanf(ptr + 2 * i, "%02x", &v) != 1) - return -1; - ((unsigned char*)data->data)[i] = v; - } - return 2 * i; -} - static char * nexttoken(char **p) { @@ -97,321 +95,133 @@ return q; } -static size_t -getdata(char **p, unsigned char *buf, size_t len) -{ - size_t i; - int v; - char *q = nexttoken(p); - i = 0; - while(*q && i < len) { - if(sscanf(q, "%02x", &v) != 1) - break; - buf[i++] = v; - q += 2; - } - return i; -} - -static int -getint(char **p) -{ - int val; - char *q = nexttoken(p); - sscanf(q, "%d", &val); - return val; -} - #include -static void -attr_to_flags(unsigned attr, HDBFlags *flags) -{ - flags->postdate = !(attr & KRB5_KDB_DISALLOW_POSTDATED); - flags->forwardable = !(attr & KRB5_KDB_DISALLOW_FORWARDABLE); - flags->initial = !!(attr & KRB5_KDB_DISALLOW_TGT_BASED); - flags->renewable = !(attr & KRB5_KDB_DISALLOW_RENEWABLE); - flags->proxiable = !(attr & KRB5_KDB_DISALLOW_PROXIABLE); - /* DUP_SKEY */ - flags->invalid = !!(attr & KRB5_KDB_DISALLOW_ALL_TIX); - flags->require_preauth = !!(attr & KRB5_KDB_REQUIRES_PRE_AUTH); - flags->require_hwauth = !!(attr & KRB5_KDB_REQUIRES_HW_AUTH); - flags->server = !(attr & KRB5_KDB_DISALLOW_SVR); - flags->change_pw = !!(attr & KRB5_KDB_PWCHANGE_SERVICE); - flags->client = 1; /* XXX */ -} - -#define KRB5_KDB_SALTTYPE_NORMAL 0 -#define KRB5_KDB_SALTTYPE_V4 1 -#define KRB5_KDB_SALTTYPE_NOREALM 2 -#define KRB5_KDB_SALTTYPE_ONLYREALM 3 -#define KRB5_KDB_SALTTYPE_SPECIAL 4 -#define KRB5_KDB_SALTTYPE_AFS3 5 - -static krb5_error_code -fix_salt(krb5_context context, hdb_entry *ent, int key_num) +/* XXX: Principal names with '\n' cannot be dumped or loaded */ +static int +my_fgetln(FILE *f, char **bufp, size_t *szp, size_t *lenp) { - krb5_error_code ret; - Salt *salt = ent->keys.val[key_num].salt; - /* fix salt type */ - switch((int)salt->type) { - case KRB5_KDB_SALTTYPE_NORMAL: - salt->type = KRB5_PADATA_PW_SALT; - break; - case KRB5_KDB_SALTTYPE_V4: - krb5_data_free(&salt->salt); - salt->type = KRB5_PADATA_PW_SALT; - break; - case KRB5_KDB_SALTTYPE_NOREALM: - { - size_t len; - size_t i; - char *p; - - len = 0; - for (i = 0; i < ent->principal->name.name_string.len; ++i) - len += strlen(ent->principal->name.name_string.val[i]); - ret = krb5_data_alloc (&salt->salt, len); - if (ret) - return ret; - p = salt->salt.data; - for (i = 0; i < ent->principal->name.name_string.len; ++i) { - memcpy (p, - ent->principal->name.name_string.val[i], - strlen(ent->principal->name.name_string.val[i])); - p += strlen(ent->principal->name.name_string.val[i]); - } - - salt->type = KRB5_PADATA_PW_SALT; - break; + size_t len; + size_t sz = *szp; + char *buf = *bufp; + char *p, *n; + + if (!buf) { + buf = malloc(sz ? sz : 8192); + if (!buf) + return ENOMEM; + if (!sz) + sz = 8192; } - case KRB5_KDB_SALTTYPE_ONLYREALM: - krb5_data_free(&salt->salt); - ret = krb5_data_copy(&salt->salt, - ent->principal->realm, - strlen(ent->principal->realm)); - if(ret) - return ret; - salt->type = KRB5_PADATA_PW_SALT; - break; - case KRB5_KDB_SALTTYPE_SPECIAL: - salt->type = KRB5_PADATA_PW_SALT; - break; - case KRB5_KDB_SALTTYPE_AFS3: - krb5_data_free(&salt->salt); - ret = krb5_data_copy(&salt->salt, - ent->principal->realm, - strlen(ent->principal->realm)); - if(ret) - return ret; - salt->type = KRB5_PADATA_AFS3_SALT; - break; - default: - abort(); + + len = 0; + while ((p = fgets(&buf[len], sz-len, f)) != NULL) { + len += strlen(&buf[len]); + if (buf[len-1] == '\n') + break; + if (feof(f)) + break; + if (sz > SIZE_MAX/2 || + (n = realloc(buf, sz += 1 + (sz >> 1))) == NULL) { + free(buf); + *bufp = NULL; + *szp = 0; + *lenp = 0; + return ENOMEM; + } + buf = n; } - return 0; + *bufp = buf; + *szp = sz; + *lenp = len; + return 0; /* *len == 0 || no EOL -> EOF */ } int mit_prop_dump(void *arg, const char *file) { krb5_error_code ret; - char line [2048]; - FILE *f; + size_t line_bufsz = 0; + size_t line_len = 0; + char *line = NULL; int lineno = 0; + FILE *f; struct hdb_entry_ex ent; - struct prop_data *pd = arg; + krb5_storage *sp = NULL; + krb5_data kdb_ent; + memset(&ent, 0, sizeof (ent)); f = fopen(file, "r"); - if(f == NULL) + if (f == NULL) return errno; - while(fgets(line, sizeof(line), f)) { - char *p = line, *q; - - int i; - - int num_tl_data; - int num_key_data; - int high_kvno; - int attributes; - - int tmp; - - lineno++; - - memset(&ent, 0, sizeof(ent)); - - q = nexttoken(&p); - if(strcmp(q, "kdb5_util") == 0) { + ret = ENOMEM; + sp = krb5_storage_emem(); + if (!sp) + goto out; + while ((ret = my_fgetln(f, &line, &line_bufsz, &line_len)) == 0 && + line_len > 0) { + char *p = line; + char *q; + + lineno++; + if(strncmp(line, "kdb5_util", strlen("kdb5_util")) == 0) { int major; + q = nexttoken(&p); + if (strcmp(q, "kdb5_util")) + errx(1, "line %d: unknown version", lineno); q = nexttoken(&p); /* load_dump */ - if(strcmp(q, "load_dump")) + if (strcmp(q, "load_dump")) errx(1, "line %d: unknown version", lineno); q = nexttoken(&p); /* load_dump */ - if(strcmp(q, "version")) + if (strcmp(q, "version")) errx(1, "line %d: unknown version", lineno); q = nexttoken(&p); /* x.0 */ - if(sscanf(q, "%d", &major) != 1) + if (sscanf(q, "%d", &major) != 1) errx(1, "line %d: unknown version", lineno); - if(major != 4 && major != 5 && major != 6) + if (major != 4 && major != 5 && major != 6) errx(1, "unknown dump file format, got %d, expected 4-6", major); continue; - } else if(strcmp(q, "policy") == 0) { + } else if(strncmp(p, "policy", strlen("policy")) == 0) { + warnx("line: %d: ignoring policy (not supported)", lineno); continue; - } else if(strcmp(q, "princ") != 0) { + } else if(strncmp(p, "princ", strlen("princ")) != 0) { warnx("line %d: not a principal", lineno); continue; } - tmp = getint(&p); - if(tmp != 38) { - warnx("line %d: bad base length %d != 38", lineno, tmp); - continue; - } - nexttoken(&p); /* length of principal */ - num_tl_data = getint(&p); /* number of tl-data */ - num_key_data = getint(&p); /* number of key-data */ - getint(&p); /* length of extra data */ - q = nexttoken(&p); /* principal name */ - krb5_parse_name(pd->context, q, &ent.entry.principal); - attributes = getint(&p); /* attributes */ - attr_to_flags(attributes, &ent.entry.flags); - tmp = getint(&p); /* max life */ - if(tmp != 0) { - ALLOC(ent.entry.max_life); - *ent.entry.max_life = tmp; - } - tmp = getint(&p); /* max renewable life */ - if(tmp != 0) { - ALLOC(ent.entry.max_renew); - *ent.entry.max_renew = tmp; - } - tmp = getint(&p); /* expiration */ - if(tmp != 0 && tmp != 2145830400) { - ALLOC(ent.entry.valid_end); - *ent.entry.valid_end = tmp; - } - tmp = getint(&p); /* pw expiration */ - if(tmp != 0) { - ALLOC(ent.entry.pw_end); - *ent.entry.pw_end = tmp; - } - nexttoken(&p); /* last auth */ - nexttoken(&p); /* last failed auth */ - nexttoken(&p); /* fail auth count */ - for(i = 0; i < num_tl_data; i++) { - unsigned long val; - int tl_type, tl_length; - unsigned char *buf; - krb5_principal princ; - - tl_type = getint(&p); /* data type */ - tl_length = getint(&p); /* data length */ - -#define mit_KRB5_TL_LAST_PWD_CHANGE 1 -#define mit_KRB5_TL_MOD_PRINC 2 - switch(tl_type) { - case mit_KRB5_TL_LAST_PWD_CHANGE: - buf = malloc(tl_length); - if (buf == NULL) - errx(ENOMEM, "malloc"); - getdata(&p, buf, tl_length); /* data itself */ - val = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); - free(buf); - ALLOC(ent.entry.extensions); - ALLOC_SEQ(ent.entry.extensions, 1); - ent.entry.extensions->val[0].mandatory = 0; - ent.entry.extensions->val[0].data.element - = choice_HDB_extension_data_last_pw_change; - ent.entry.extensions->val[0].data.u.last_pw_change = val; - break; - case mit_KRB5_TL_MOD_PRINC: - buf = malloc(tl_length); - if (buf == NULL) - errx(ENOMEM, "malloc"); - getdata(&p, buf, tl_length); /* data itself */ - val = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24); - ret = krb5_parse_name(pd->context, (char *)buf + 4, &princ); - if (ret) - krb5_err(pd->context, 1, ret, - "parse_name: %s", (char *)buf + 4); - free(buf); - ALLOC(ent.entry.modified_by); - ent.entry.modified_by->time = val; - ent.entry.modified_by->principal = princ; - break; - default: - nexttoken(&p); - break; - } - } - ALLOC_SEQ(&ent.entry.keys, num_key_data); - high_kvno = -1; - for(i = 0; i < num_key_data; i++) { - int key_versions; - int kvno; - key_versions = getint(&p); /* key data version */ - kvno = getint(&p); - - /* - * An MIT dump file may contain multiple sets of keys with - * different kvnos. Since the Heimdal database can only represent - * one kvno per principal, we only want the highest set. Assume - * that set will be given first, and discard all keys with lower - * kvnos. - */ - if (kvno > high_kvno && high_kvno != -1) - errx(1, "line %d: high kvno keys given after low kvno keys", - lineno); - else if (kvno < high_kvno) { - nexttoken(&p); /* key type */ - nexttoken(&p); /* key length */ - nexttoken(&p); /* key */ - if (key_versions > 1) { - nexttoken(&p); /* salt type */ - nexttoken(&p); /* salt length */ - nexttoken(&p); /* salt */ - } - ent.entry.keys.len--; - continue; - } - ent.entry.kvno = kvno; - high_kvno = kvno; - ALLOC(ent.entry.keys.val[i].mkvno); - *ent.entry.keys.val[i].mkvno = 1; - - /* key version 0 -- actual key */ - ent.entry.keys.val[i].key.keytype = getint(&p); /* key type */ - tmp = getint(&p); /* key length */ - /* the first two bytes of the key is the key length -- - skip it */ - krb5_data_alloc(&ent.entry.keys.val[i].key.keyvalue, tmp - 2); - q = nexttoken(&p); /* key itself */ - hex_to_octet_string(q + 4, &ent.entry.keys.val[i].key.keyvalue); - - if(key_versions > 1) { - /* key version 1 -- optional salt */ - ALLOC(ent.entry.keys.val[i].salt); - ent.entry.keys.val[i].salt->type = getint(&p); /* salt type */ - tmp = getint(&p); /* salt length */ - if(tmp > 0) { - krb5_data_alloc(&ent.entry.keys.val[i].salt->salt, tmp - 2); - q = nexttoken(&p); /* salt itself */ - hex_to_octet_string(q + 4, - &ent.entry.keys.val[i].salt->salt); - } else { - ent.entry.keys.val[i].salt->salt.length = 0; - ent.entry.keys.val[i].salt->salt.data = NULL; - getint(&p); /* -1, if no data. */ - } - fix_salt(pd->context, &ent.entry, i); - } - } - nexttoken(&p); /* extra data */ - v5_prop(pd->context, NULL, &ent, arg); + krb5_storage_truncate(sp, 0); + ret = _hdb_mit_dump2mitdb_entry(pd->context, line, sp); + if (ret) { + if (ret > 0) + warn("line: %d: failed to parse; ignoring", lineno); + else + warnx("line: %d: failed to parse; ignoring", lineno); + continue; + } + ret = krb5_storage_to_data(sp, &kdb_ent); + if (ret) break; + ret = _hdb_mdb_value2entry(pd->context, &kdb_ent, 0, &ent.entry); + krb5_data_free(&kdb_ent); + if (ret) { + warnx("line: %d: failed to store; ignoring", lineno); + continue; + } + ret = v5_prop(pd->context, NULL, &ent, arg); + hdb_free_entry(pd->context, &ent); + if (ret) break; } + +out: fclose(f); - return 0; + free(line); + if (sp) + krb5_storage_free(sp); + if (ret && ret == ENOMEM) + errx(1, "out of memory"); + if (ret) + errx(1, "line %d: problem parsing dump line", lineno); + return ret; } + diff --git a/crypto/heimdal/kdc/pkinit-ec.c b/crypto/heimdal/kdc/pkinit-ec.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/pkinit-ec.c @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifdef PKINIT + +/* + * As with the other *-ec.c files in Heimdal, this is a bit of a hack. + * + * The idea is to use OpenSSL for EC because hcrypto doesn't have the + * required functionality at this time. To do this we segregate + * EC-using code into separate source files and then we arrange for them + * to get the OpenSSL headers and not the conflicting hcrypto ones. + * + * Because of auto-generated *-private.h headers, we end up needing to + * make sure various types are defined before we include them, thus the + * strange header include order here. + */ + +#ifdef HAVE_HCRYPTO_W_OPENSSL +#include +#include +#include +#include +#define HEIM_NO_CRYPTO_HDRS +#endif /* HAVE_HCRYPTO_W_OPENSSL */ + +#define NO_HCRYPTO_POLLUTION + +#include "kdc_locl.h" +#include +#include +#include +#include +#include + +#include + +#ifdef HAVE_HCRYPTO_W_OPENSSL +static void +free_client_ec_param(krb5_context context, + EC_KEY *ec_key_pk, + EC_KEY *ec_key_key) +{ + if (ec_key_pk != NULL) + EC_KEY_free(ec_key_pk); + if (ec_key_key != NULL) + EC_KEY_free(ec_key_key); +} +#endif + +void +_kdc_pk_free_client_ec_param(krb5_context context, + void *ec_key_pk, + void *ec_key_key) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + free_client_ec_param(context, ec_key_pk, ec_key_key); +#endif +} + +#ifdef HAVE_HCRYPTO_W_OPENSSL +static krb5_error_code +generate_ecdh_keyblock(krb5_context context, + EC_KEY *ec_key_pk, /* the client's public key */ + EC_KEY **ec_key_key, /* the KDC's ephemeral private */ + unsigned char **dh_gen_key, /* shared secret */ + size_t *dh_gen_keylen) +{ + const EC_GROUP *group; + EC_KEY *ephemeral; + krb5_keyblock key; + krb5_error_code ret; + unsigned char *p; + size_t size; + int len; + + *dh_gen_key = NULL; + *dh_gen_keylen = 0; + *ec_key_key = NULL; + + memset(&key, 0, sizeof(key)); + + if (ec_key_pk == NULL) { + ret = KRB5KRB_ERR_GENERIC; + krb5_set_error_message(context, ret, "public_key"); + return ret; + } + + group = EC_KEY_get0_group(ec_key_pk); + if (group == NULL) { + ret = KRB5KRB_ERR_GENERIC; + krb5_set_error_message(context, ret, "failed to get the group of " + "the client's public key"); + return ret; + } + + ephemeral = EC_KEY_new(); + if (ephemeral == NULL) + return krb5_enomem(context); + + EC_KEY_set_group(ephemeral, group); + + if (EC_KEY_generate_key(ephemeral) != 1) { + EC_KEY_free(ephemeral); + return krb5_enomem(context); + } + + size = (EC_GROUP_get_degree(group) + 7) / 8; + p = malloc(size); + if (p == NULL) { + EC_KEY_free(ephemeral); + return krb5_enomem(context); + } + + len = ECDH_compute_key(p, size, + EC_KEY_get0_public_key(ec_key_pk), + ephemeral, NULL); + if (len <= 0) { + free(p); + EC_KEY_free(ephemeral); + ret = KRB5KRB_ERR_GENERIC; + krb5_set_error_message(context, ret, "Failed to compute ECDH " + "public shared secret"); + return ret; + } + + *ec_key_key = ephemeral; + *dh_gen_key = p; + *dh_gen_keylen = len; + + return 0; +} +#endif /* HAVE_HCRYPTO_W_OPENSSL */ + +krb5_error_code +_kdc_generate_ecdh_keyblock(krb5_context context, + void *ec_key_pk, /* the client's public key */ + void **ec_key_key, /* the KDC's ephemeral private */ + unsigned char **dh_gen_key, /* shared secret */ + size_t *dh_gen_keylen) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + return generate_ecdh_keyblock(context, ec_key_pk, + (EC_KEY **)ec_key_key, + dh_gen_key, dh_gen_keylen); +#else + return ENOTSUP; +#endif /* HAVE_HCRYPTO_W_OPENSSL */ +} + +#ifdef HAVE_HCRYPTO_W_OPENSSL +static krb5_error_code +get_ecdh_param(krb5_context context, + krb5_kdc_configuration *config, + SubjectPublicKeyInfo *dh_key_info, + EC_KEY **out) +{ + ECParameters ecp; + EC_KEY *public = NULL; + krb5_error_code ret; + const unsigned char *p; + size_t len; + int nid; + + if (dh_key_info->algorithm.parameters == NULL) { + krb5_set_error_message(context, KRB5_BADMSGTYPE, + "PKINIT missing algorithm parameter " + "in clientPublicValue"); + return KRB5_BADMSGTYPE; + } + + memset(&ecp, 0, sizeof(ecp)); + + ret = decode_ECParameters(dh_key_info->algorithm.parameters->data, + dh_key_info->algorithm.parameters->length, &ecp, &len); + if (ret) + goto out; + + if (ecp.element != choice_ECParameters_namedCurve) { + ret = KRB5_BADMSGTYPE; + goto out; + } + + if (der_heim_oid_cmp(&ecp.u.namedCurve, &asn1_oid_id_ec_group_secp256r1) == 0) + nid = NID_X9_62_prime256v1; + else { + ret = KRB5_BADMSGTYPE; + goto out; + } + + /* XXX verify group is ok */ + + public = EC_KEY_new_by_curve_name(nid); + + p = dh_key_info->subjectPublicKey.data; + len = dh_key_info->subjectPublicKey.length / 8; + if (o2i_ECPublicKey(&public, &p, len) == NULL) { + ret = KRB5_BADMSGTYPE; + krb5_set_error_message(context, ret, + "PKINIT failed to decode ECDH key"); + goto out; + } + *out = public; + public = NULL; + + out: + if (public) + EC_KEY_free(public); + free_ECParameters(&ecp); + return ret; +} +#endif /* HAVE_HCRYPTO_W_OPENSSL */ + +krb5_error_code +_kdc_get_ecdh_param(krb5_context context, + krb5_kdc_configuration *config, + SubjectPublicKeyInfo *dh_key_info, + void **out) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + return get_ecdh_param(context, config, dh_key_info, (EC_KEY **)out); +#else + return ENOTSUP; +#endif /* HAVE_HCRYPTO_W_OPENSSL */ +} + + +/* + * + */ + +#ifdef HAVE_HCRYPTO_W_OPENSSL +static krb5_error_code +serialize_ecdh_key(krb5_context context, + EC_KEY *key, + unsigned char **out, + size_t *out_len) +{ + krb5_error_code ret = 0; + unsigned char *p; + int len; + + *out = NULL; + *out_len = 0; + + len = i2o_ECPublicKey(key, NULL); + if (len <= 0) + return EOVERFLOW; + + *out = malloc(len); + if (*out == NULL) + return krb5_enomem(context); + + p = *out; + len = i2o_ECPublicKey(key, &p); + if (len <= 0) { + free(*out); + *out = NULL; + ret = EINVAL; /* XXX Better error please */ + krb5_set_error_message(context, ret, + "PKINIT failed to encode ECDH key"); + return ret; + } + + *out_len = len * 8; + return ret; +} +#endif + +krb5_error_code +_kdc_serialize_ecdh_key(krb5_context context, + void *key, + unsigned char **out, + size_t *out_len) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + return serialize_ecdh_key(context, key, out, out_len); +#else + return ENOTSUP; +#endif +} + +#endif diff --git a/crypto/heimdal/kdc/pkinit.c b/crypto/heimdal/kdc/pkinit.c --- a/crypto/heimdal/kdc/pkinit.c +++ b/crypto/heimdal/kdc/pkinit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003 - 2008 Kungliga Tekniska Högskolan + * Copyright (c) 2003 - 2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -47,18 +47,16 @@ struct pk_client_params { enum krb5_pk_type type; - enum { USE_RSA, USE_DH, USE_ECDH } keyex; + enum keyex_enum keyex; union { struct { BIGNUM *public_key; DH *key; } dh; -#ifdef HAVE_OPENSSL struct { - EC_KEY *public_key; - EC_KEY *key; + void *public_key; + void *key; } ecdh; -#endif } u; hx509_cert cert; unsigned nonce; @@ -101,7 +99,7 @@ krb5_timeofday (context, &now); /* XXX cusec */ - if (a->ctime == 0 || abs(a->ctime - now) > context->max_skew) { + if (a->ctime == 0 || labs(a->ctime - now) > context->max_skew) { krb5_clear_error_message(context); return KRB5KRB_AP_ERR_SKEW; } @@ -123,7 +121,7 @@ krb5_timeofday (context, &now); /* XXX cusec */ - if (a->ctime == 0 || abs(a->ctime - now) > context->max_skew) { + if (a->ctime == 0 || labs(a->ctime - now) > context->max_skew) { krb5_clear_error_message(context); return KRB5KRB_AP_ERR_SKEW; } @@ -181,14 +179,9 @@ if (cp->u.dh.public_key) BN_free(cp->u.dh.public_key); } -#ifdef HAVE_OPENSSL - if (cp->keyex == USE_ECDH) { - if (cp->u.ecdh.key) - EC_KEY_free(cp->u.ecdh.key); - if (cp->u.ecdh.public_key) - EC_KEY_free(cp->u.ecdh.public_key); - } -#endif + if (cp->keyex == USE_ECDH) + _kdc_pk_free_client_ec_param(context, cp->u.ecdh.key, + cp->u.ecdh.public_key); krb5_free_keyblock_contents(context, &cp->reply_key); if (cp->dh_group_name) free(cp->dh_group_name); @@ -216,7 +209,7 @@ if (client_params->u.dh.public_key == NULL) { ret = KRB5KRB_ERR_GENERIC; - krb5_set_error_message(context, ret, "public_key"); + krb5_set_error_message(context, ret, "missing DH public_key"); goto out; } @@ -248,43 +241,18 @@ memmove(dh_gen_key + size, dh_gen_key, dh_gen_keylen); memset(dh_gen_key, 0, size); } - -#ifdef HAVE_OPENSSL } else if (client_params->keyex == USE_ECDH) { - if (client_params->u.ecdh.public_key == NULL) { ret = KRB5KRB_ERR_GENERIC; - krb5_set_error_message(context, ret, "public_key"); - goto out; - } - - client_params->u.ecdh.key = EC_KEY_new(); - if (client_params->u.ecdh.key == NULL) { - ret = ENOMEM; + krb5_set_error_message(context, ret, "missing ECDH public_key"); goto out; } - EC_KEY_set_group(client_params->u.ecdh.key, - EC_KEY_get0_group(client_params->u.ecdh.public_key)); - - if (EC_KEY_generate_key(client_params->u.ecdh.key) != 1) { - ret = ENOMEM; - goto out; - } - - size = (EC_GROUP_get_degree(EC_KEY_get0_group(client_params->u.ecdh.key)) + 7) / 8; - dh_gen_key = malloc(size); - if (dh_gen_key == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); - goto out; - } - - dh_gen_keylen = ECDH_compute_key(dh_gen_key, size, - EC_KEY_get0_public_key(client_params->u.ecdh.public_key), - client_params->u.ecdh.key, NULL); - -#endif /* HAVE_OPENSSL */ + ret = _kdc_generate_ecdh_keyblock(context, + client_params->u.ecdh.public_key, + &client_params->u.ecdh.key, + &dh_gen_key, &dh_gen_keylen); + if (ret) + goto out; } else { ret = KRB5KRB_ERR_GENERIC; krb5_set_error_message(context, ret, @@ -330,7 +298,6 @@ { DomainParameters dhparam; DH *dh = NULL; - BIGNUM *p, *q, *g; krb5_error_code ret; memset(&dhparam, 0, sizeof(dhparam)); @@ -361,7 +328,7 @@ } ret = _krb5_dh_group_ok(context, config->pkinit_dh_min_bits, - &dhparam.p, &dhparam.g, &dhparam.q, moduli, + &dhparam.p, &dhparam.g, dhparam.q, moduli, &client_params->dh_group_name); if (ret) { /* XXX send back proposal of better group */ @@ -375,20 +342,17 @@ goto out; } ret = KRB5_BADMSGTYPE; - p = integer_to_BN(context, "DH prime", &dhparam.p); - g = integer_to_BN(context, "DH base", &dhparam.g); - q = integer_to_BN(context, "DH p-1 factor", &dhparam.q); - if (p == NULL || g == NULL || q == NULL) { - BN_free(p); - BN_free(g); - BN_free(q); + dh->p = integer_to_BN(context, "DH prime", &dhparam.p); + if (dh->p == NULL) goto out; - } - if (DH_set0_pqg(dh, p, g, q) != 1) { - BN_free(p); - BN_free(g); - BN_free(q); + dh->g = integer_to_BN(context, "DH base", &dhparam.g); + if (dh->g == NULL) goto out; + + if (dhparam.q) { + dh->q = integer_to_BN(context, "DH p-1 factor", dhparam.q); + if (dh->g == NULL) + goto out; } { @@ -425,71 +389,6 @@ return ret; } -#ifdef HAVE_OPENSSL - -static krb5_error_code -get_ecdh_param(krb5_context context, - krb5_kdc_configuration *config, - SubjectPublicKeyInfo *dh_key_info, - pk_client_params *client_params) -{ - ECParameters ecp; - EC_KEY *public = NULL; - krb5_error_code ret; - const unsigned char *p; - size_t len; - int nid; - - if (dh_key_info->algorithm.parameters == NULL) { - krb5_set_error_message(context, KRB5_BADMSGTYPE, - "PKINIT missing algorithm parameter " - "in clientPublicValue"); - return KRB5_BADMSGTYPE; - } - - memset(&ecp, 0, sizeof(ecp)); - - ret = decode_ECParameters(dh_key_info->algorithm.parameters->data, - dh_key_info->algorithm.parameters->length, &ecp, &len); - if (ret) - goto out; - - if (ecp.element != choice_ECParameters_namedCurve) { - ret = KRB5_BADMSGTYPE; - goto out; - } - - if (der_heim_oid_cmp(&ecp.u.namedCurve, &asn1_oid_id_ec_group_secp256r1) == 0) - nid = NID_X9_62_prime256v1; - else { - ret = KRB5_BADMSGTYPE; - goto out; - } - - /* XXX verify group is ok */ - - public = EC_KEY_new_by_curve_name(nid); - - p = dh_key_info->subjectPublicKey.data; - len = dh_key_info->subjectPublicKey.length / 8; - if (o2i_ECPublicKey(&public, &p, len) == NULL) { - ret = KRB5_BADMSGTYPE; - krb5_set_error_message(context, ret, - "PKINIT failed to decode ECDH key"); - goto out; - } - client_params->u.ecdh.public_key = public; - public = NULL; - - out: - if (public) - EC_KEY_free(public); - free_ECParameters(&ecp); - return ret; -} - -#endif /* HAVE_OPENSSL */ - krb5_error_code _kdc_pk_rd_padata(krb5_context context, krb5_kdc_configuration *config, @@ -546,11 +445,11 @@ unsigned int i; for (i = 0; i < pc->len; i++) { - ret = hx509_cert_init_data(context->hx509ctx, - pc->val[i].cert.data, - pc->val[i].cert.length, - &cert); - if (ret) + cert = hx509_cert_init_data(context->hx509ctx, + pc->val[i].cert.data, + pc->val[i].cert.length, + NULL); + if (cert == NULL) continue; hx509_certs_add(context->hx509ctx, trust_anchors, cert); hx509_cert_free(cert); @@ -576,7 +475,7 @@ type = "PK-INIT-Win2k"; - if (req->req_body.kdc_options.request_anonymous) { + if (_kdc_is_anonymous(context, client->entry.principal)) { ret = KRB5_KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED; krb5_set_error_message(context, ret, "Anon not supported in RSA mode"); @@ -722,7 +621,8 @@ hx509_certs signer_certs; int flags = HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH; /* BTMM */ - if (req->req_body.kdc_options.request_anonymous) + if (_kdc_is_anonymous(context, client->entry.principal) + || (config->historical_anon_realm && _kdc_is_anon_request(req))) flags |= HX509_CMS_VS_ALLOW_ZERO_SIGNER; ret = hx509_cms_verify_signed(context->hx509ctx, @@ -807,7 +707,7 @@ goto out; } - if (req->req_body.kdc_options.request_anonymous && + if (_kdc_is_anonymous(context, client->entry.principal) && ap.clientPublicValue == NULL) { free_AuthPack(&ap); ret = KRB5_KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED; @@ -832,12 +732,11 @@ cp->keyex = USE_DH; ret = get_dh_param(context, config, ap.clientPublicValue, cp); -#ifdef HAVE_OPENSSL } else if (der_heim_oid_cmp(&ap.clientPublicValue->algorithm.algorithm, &asn1_oid_id_ecPublicKey) == 0) { cp->keyex = USE_ECDH; - ret = get_ecdh_param(context, config, - ap.clientPublicValue, cp); -#endif /* HAVE_OPENSSL */ + ret = _kdc_get_ecdh_param(context, config, + ap.clientPublicValue, + &cp->u.ecdh.public_key); } else { ret = KRB5_BADMSGTYPE; krb5_set_error_message(context, ret, "PKINIT unknown DH mechanism"); @@ -901,7 +800,7 @@ */ static krb5_error_code -BN_to_integer(krb5_context context, const BIGNUM *bn, heim_integer *integer) +BN_to_integer(krb5_context context, BIGNUM *bn, heim_integer *integer) { integer->length = BN_num_bytes(bn); integer->data = malloc(integer->length); @@ -1118,11 +1017,9 @@ if (cp->keyex == USE_DH) { DH *kdc_dh = cp->u.dh.key; - const BIGNUM *pub_key; heim_integer i; - DH_get0_key(kdc_dh, &pub_key, NULL); - ret = BN_to_integer(context, pub_key, &i); + ret = BN_to_integer(context, kdc_dh->pub_key, &i); if (ret) return ret; @@ -1139,26 +1036,13 @@ dh_info.subjectPublicKey.length = buf.length * 8; dh_info.subjectPublicKey.data = buf.data; krb5_data_zero(&buf); -#ifdef HAVE_OPENSSL } else if (cp->keyex == USE_ECDH) { - unsigned char *p; - int len; - - len = i2o_ECPublicKey(cp->u.ecdh.key, NULL); - if (len <= 0) - abort(); - - p = malloc(len); - if (p == NULL) - abort(); - - dh_info.subjectPublicKey.length = len * 8; - dh_info.subjectPublicKey.data = p; - - len = i2o_ECPublicKey(cp->u.ecdh.key, &p); - if (len <= 0) - abort(); -#endif + unsigned char *p; + ret = _kdc_serialize_ecdh_key(context, cp->u.ecdh.key, &p, + &dh_info.subjectPublicKey.length); + dh_info.subjectPublicKey.data = p; + if (ret) + goto out; } else krb5_abortx(context, "no keyex selected ?"); @@ -1245,7 +1129,7 @@ krb5_enctype sessionetype, const KDC_REQ *req, const krb5_data *req_buffer, - krb5_keyblock **reply_key, + krb5_keyblock *reply_key, krb5_keyblock *sessionkey, METHOD_DATA *md) { @@ -1334,9 +1218,7 @@ switch (cp->keyex) { case USE_DH: type = "dh"; break; -#ifdef HAVE_OPENSSL case USE_ECDH: type = "ecdh"; break; -#endif default: krb5_abortx(context, "unknown keyex"); break; } @@ -1375,16 +1257,86 @@ if (rep.u.encKeyPack.length != size) krb5_abortx(context, "Internal ASN.1 encoder error"); - /* XXX KRB-FX-CF2 */ - ret = krb5_generate_random_keyblock(context, sessionetype, - sessionkey); - if (ret) { - free_PA_PK_AS_REP(&rep); - goto out; + /* generate the session key using the method from RFC6112 */ + { + krb5_keyblock kdc_contribution_key; + krb5_crypto reply_crypto; + krb5_crypto kdccont_crypto; + krb5_data p1 = { strlen("PKINIT"), "PKINIT"}; + krb5_data p2 = { strlen("KEYEXCHANGE"), "KEYEXCHANGE"}; + void *kckdata; + size_t kcklen; + EncryptedData kx; + void *kxdata; + size_t kxlen; + + ret = krb5_generate_random_keyblock(context, sessionetype, + &kdc_contribution_key); + if (ret) { + free_PA_PK_AS_REP(&rep); + goto out; + } + ret = krb5_crypto_init(context, &cp->reply_key, enctype, &reply_crypto); + if (ret) { + krb5_free_keyblock_contents(context, &kdc_contribution_key); + free_PA_PK_AS_REP(&rep); + goto out; + } + ret = krb5_crypto_init(context, &kdc_contribution_key, sessionetype, &kdccont_crypto); + if (ret) { + krb5_crypto_destroy(context, reply_crypto); + krb5_free_keyblock_contents(context, &kdc_contribution_key); + free_PA_PK_AS_REP(&rep); + goto out; + } + /* KRB-FX-CF2 */ + ret = krb5_crypto_fx_cf2(context, kdccont_crypto, reply_crypto, + &p1, &p2, sessionetype, sessionkey); + krb5_crypto_destroy(context, kdccont_crypto); + if (ret) { + krb5_crypto_destroy(context, reply_crypto); + krb5_free_keyblock_contents(context, &kdc_contribution_key); + free_PA_PK_AS_REP(&rep); + goto out; + } + ASN1_MALLOC_ENCODE(EncryptionKey, kckdata, kcklen, + &kdc_contribution_key, &size, ret); + krb5_free_keyblock_contents(context, &kdc_contribution_key); + if (ret) { + krb5_set_error_message(context, ret, "encoding of PKINIT-KX Key failed %d", ret); + krb5_crypto_destroy(context, reply_crypto); + free_PA_PK_AS_REP(&rep); + goto out; + } + if (kcklen != size) + krb5_abortx(context, "Internal ASN.1 encoder error"); + ret = krb5_encrypt_EncryptedData(context, reply_crypto, KRB5_KU_PA_PKINIT_KX, + kckdata, kcklen, 0, &kx); + krb5_crypto_destroy(context, reply_crypto); + free(kckdata); + if (ret) { + free_PA_PK_AS_REP(&rep); + goto out; + } + ASN1_MALLOC_ENCODE(EncryptedData, kxdata, kxlen, + &kx, &size, ret); + free_EncryptedData(&kx); + if (ret) { + krb5_set_error_message(context, ret, "encoding of PKINIT-KX failed %d", ret); + free_PA_PK_AS_REP(&rep); + goto out; + } + if (kxlen != size) + krb5_abortx(context, "Internal ASN.1 encoder error"); + /* Add PA-PKINIT-KX */ + ret = krb5_padata_add(context, md, KRB5_PADATA_PKINIT_KX, kxdata, kxlen); + if (ret) { + krb5_set_error_message(context, ret, + "Failed adding PKINIT-KX %d", ret); + free(buf); + goto out; + } } - - /* XXX Add PA-PKINIT-KX */ - } #define use_btmm_with_enckey 0 @@ -1571,7 +1523,7 @@ hx509_cert_free(kdc_cert); if (ret == 0) - *reply_key = &cp->reply_key; + ret = krb5_copy_keyblock_contents(context, &cp->reply_key, reply_key); return ret; } @@ -1616,6 +1568,7 @@ return KRB5_KDC_ERR_CLIENT_NAME_MISMATCH; } + memset(&principal, 0, sizeof (principal)); principal.name = kn.principalName; principal.realm = kn.realm; @@ -1661,6 +1614,7 @@ if (list.len != 1) { kdc_log(context, config, 0, "More then one PK-INIT MS UPN SAN"); + ret = KRB5_KDC_ERR_CLIENT_NAME_MISMATCH; goto out; } @@ -1721,8 +1675,11 @@ size_t i; if (cp->cert == NULL) { + if (!_kdc_is_anonymous(context, client->entry.principal) + && !config->historical_anon_realm) + return KRB5KDC_ERR_BADOPTION; - *subject_name = strdup("anonymous client client"); + *subject_name = strdup(""); if (*subject_name == NULL) return ENOMEM; return 0; @@ -1749,11 +1706,11 @@ size_t j; for (j = 0; j < pc->len; j++) { - ret = hx509_cert_init_data(context->hx509ctx, - pc->val[j].cert.data, - pc->val[j].cert.length, - &cert); - if (ret) + cert = hx509_cert_init_data(context->hx509ctx, + pc->val[j].cert.data, + pc->val[j].cert.length, + NULL); + if (cert == NULL) continue; ret = hx509_cert_cmp(cert, cp->cert); hx509_cert_free(cert); @@ -2042,7 +1999,14 @@ "pkinit_mappings_file", NULL); if (file == NULL) { - asprintf(&fn, "%s/pki-mapping", hdb_db_dir(context)); + int aret; + + aret = asprintf(&fn, "%s/pki-mapping", hdb_db_dir(context)); + if (aret == -1) { + krb5_warnx(context, "PKINIT: out of memory"); + return ENOMEM; + } + file = fn; } diff --git a/crypto/heimdal/kdc/process.c b/crypto/heimdal/kdc/process.c --- a/crypto/heimdal/kdc/process.c +++ b/crypto/heimdal/kdc/process.c @@ -57,19 +57,25 @@ int datagram_reply, int *claim) { + struct kdc_request_desc r; krb5_error_code ret; - KDC_REQ req; size_t len; - ret = decode_AS_REQ(req_buffer->data, req_buffer->length, &req, &len); + memset(&r, 0, sizeof(r)); + + ret = decode_AS_REQ(req_buffer->data, req_buffer->length, &r.req, &len); if (ret) return ret; + r.context = context; + r.config = config; + r.request.data = req_buffer->data; + r.request.length = req_buffer->length; + *claim = 1; - ret = _kdc_as_rep(context, config, &req, req_buffer, - reply, from, addr, datagram_reply); - free_AS_REQ(&req); + ret = _kdc_as_rep(&r, reply, from, addr, datagram_reply); + free_AS_REQ(&r.req); return ret; } @@ -193,6 +199,7 @@ unsigned int i; krb5_data req_buffer; int claim = 0; + heim_auto_release_t pool = heim_auto_release_create(); req_buffer.data = buf; req_buffer.length = len; @@ -204,10 +211,14 @@ if (claim) { if (services[i].flags & KS_NO_LENGTH) *prependlength = 0; + + heim_release(pool); return ret; } } + heim_release(pool); + return -1; } diff --git a/crypto/heimdal/kdc/string2key-version.rc b/crypto/heimdal/kdc/string2key-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/string2key-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Password to Key Mapper" +#define RC_FILE_ORIG_0409 "string2key.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kdc/string2key.c b/crypto/heimdal/kdc/string2key.c --- a/crypto/heimdal/kdc/string2key.c +++ b/crypto/heimdal/kdc/string2key.c @@ -128,9 +128,9 @@ if(ret) krb5_err(context, 1, ret, "krb5_string_to_enctype"); - if((etype != ETYPE_DES_CBC_CRC && - etype != ETYPE_DES_CBC_MD4 && - etype != ETYPE_DES_CBC_MD5) && + if((etype != (krb5_enctype)ETYPE_DES_CBC_CRC && + etype != (krb5_enctype)ETYPE_DES_CBC_MD4 && + etype != (krb5_enctype)ETYPE_DES_CBC_MD5) && (afs || version4)) { if(!version5) { etype = ETYPE_DES_CBC_CRC; @@ -163,8 +163,13 @@ } if(version5){ - krb5_parse_name(context, principal, &princ); - krb5_get_pw_salt(context, princ, &salt); + ret = krb5_parse_name(context, principal, &princ); + if (ret) + krb5_err(context, 1, ret, "failed to unparse name: %s", principal); + ret = krb5_get_pw_salt(context, princ, &salt); + if (ret) + krb5_err(context, 1, ret, "failed to get salt for %s", principal); + tokey(context, etype, password, salt, "Kerberos 5 (%s)"); krb5_free_salt(context, salt); } diff --git a/crypto/heimdal/kdc/string2key.cat8 b/crypto/heimdal/kdc/string2key.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kdc/string2key.cat8 @@ -0,0 +1,42 @@ +STRING2KEY(8) BSD System Manager's Manual STRING2KEY(8) + +NAME + string2key -- map a password into a key + +SYNOPSIS + string2key [-5 | --version5] [-4 | --version4] [-a | --afs] [-c cell | + --cell=cell] [-w password | --password=password] [-p principal + | --principal=principal] [-k string | --keytype=string] + password + +DESCRIPTION + string2key performs the string-to-key function. This is useful when you + want to handle the raw key instead of the password. Supported options: + + -5, --version5 + Output Kerberos v5 string-to-key + + -4, --version4 + Output Kerberos v4 string-to-key + + -a, --afs + Output AFS string-to-key + + -c cell, --cell=cell + AFS cell to use + + -w password, --password=password + Password to use + + -p principal, --principal=principal + Kerberos v5 principal to use + + -k string, --keytype=string + Keytype + + --version + print version + + --help + +HEIMDAL March 4, 2000 HEIMDAL diff --git a/crypto/heimdal/kdc/windc.c b/crypto/heimdal/kdc/windc.c --- a/crypto/heimdal/kdc/windc.c +++ b/crypto/heimdal/kdc/windc.c @@ -33,40 +33,41 @@ #include "kdc_locl.h" -static krb5plugin_windc_ftable *windcft; -static void *windcctx; +static int have_plugin = 0; /* * Pick the first WINDC module that we find. */ +static krb5_error_code KRB5_LIB_CALL +load(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + have_plugin = 1; + return KRB5_PLUGIN_NO_HANDLE; +} + krb5_error_code krb5_kdc_windc_init(krb5_context context) { - struct krb5_plugin *list = NULL, *e; - krb5_error_code ret; - - ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, "windc", &list); - if(ret != 0 || list == NULL) - return 0; - - for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { + (void)_krb5_plugin_run_f(context, "krb5", "windc", + KRB5_WINDC_PLUGIN_MINOR, 0, NULL, load); + return 0; +} - windcft = _krb5_plugin_get_symbol(e); - if (windcft->minor_version < KRB5_WINDC_PLUGIN_MINOR) - continue; +struct generate_uc { + hdb_entry_ex *client; + krb5_pac *pac; +}; - (*windcft->init)(context, &windcctx); - break; - } - _krb5_plugin_free(list); - if (e == NULL) { - krb5_set_error_message(context, ENOENT, "Did not find any WINDC plugin"); - windcft = NULL; - return ENOENT; - } +static krb5_error_code KRB5_LIB_CALL +generate(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + krb5plugin_windc_ftable *ft = (krb5plugin_windc_ftable *)plug; + struct generate_uc *uc = (struct generate_uc *)userctx; - return 0; + if (ft->pac_generate == NULL) + return KRB5_PLUGIN_NO_HANDLE; + return ft->pac_generate((void *)plug, context, uc->client, uc->pac); } @@ -75,10 +76,46 @@ hdb_entry_ex *client, krb5_pac *pac) { - *pac = NULL; - if (windcft == NULL) + struct generate_uc uc; + + if (!have_plugin) return 0; - return (windcft->pac_generate)(windcctx, context, client, pac); + + uc.client = client; + uc.pac = pac; + + (void)_krb5_plugin_run_f(context, "krb5", "windc", + KRB5_WINDC_PLUGIN_MINOR, 0, &uc, generate); + return 0; +} + +struct verify_uc { + krb5_principal client_principal; + krb5_principal delegated_proxy_principal; + hdb_entry_ex *client; + hdb_entry_ex *server; + hdb_entry_ex *krbtgt; + krb5_pac *pac; + int *verified; +}; + +static krb5_error_code KRB5_LIB_CALL +verify(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + krb5plugin_windc_ftable *ft = (krb5plugin_windc_ftable *)plug; + struct verify_uc *uc = (struct verify_uc *)userctx; + krb5_error_code ret; + + if (ft->pac_verify == NULL) + return KRB5_PLUGIN_NO_HANDLE; + ret = ft->pac_verify((void *)plug, context, + uc->client_principal, + uc->delegated_proxy_principal, + uc->client, uc->server, uc->krbtgt, uc->pac); + if (ret == 0) + (*uc->verified) = 1; + + return 0; } krb5_error_code @@ -91,37 +128,77 @@ krb5_pac *pac, int *verified) { - krb5_error_code ret; + struct verify_uc uc; - if (windcft == NULL) + if (!have_plugin) return 0; - ret = windcft->pac_verify(windcctx, context, - client_principal, - delegated_proxy_principal, - client, server, krbtgt, pac); - if (ret == 0) - *verified = 1; - return ret; + uc.client_principal = client_principal; + uc.delegated_proxy_principal = delegated_proxy_principal; + uc.client = client; + uc.server = server; + uc.krbtgt = krbtgt; + uc.pac = pac; + uc.verified = verified; + + (void)_krb5_plugin_run_f(context, "krb5", "windc", + KRB5_WINDC_PLUGIN_MINOR, 0, &uc, verify); + return 0; +} + +struct check_uc { + krb5_kdc_configuration *config; + hdb_entry_ex *client_ex; + const char *client_name; + hdb_entry_ex *server_ex; + const char *server_name; + KDC_REQ *req; + METHOD_DATA *method_data; +}; + +static krb5_error_code KRB5_LIB_CALL +check(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + krb5plugin_windc_ftable *ft = (krb5plugin_windc_ftable *)plug; + struct check_uc *uc = (struct check_uc *)userctx; + + if (ft->client_access == NULL) + return KRB5_PLUGIN_NO_HANDLE; + return ft->client_access((void *)plug, context, uc->config, + uc->client_ex, uc->client_name, + uc->server_ex, uc->server_name, + uc->req, uc->method_data); } + krb5_error_code _kdc_check_access(krb5_context context, krb5_kdc_configuration *config, hdb_entry_ex *client_ex, const char *client_name, hdb_entry_ex *server_ex, const char *server_name, KDC_REQ *req, - krb5_data *e_data) + METHOD_DATA *method_data) { - if (windcft == NULL) - return kdc_check_flags(context, config, - client_ex, client_name, - server_ex, server_name, - req->msg_type == krb_as_req); - - return (windcft->client_access)(windcctx, - context, config, - client_ex, client_name, - server_ex, server_name, - req, e_data); + krb5_error_code ret = KRB5_PLUGIN_NO_HANDLE; + struct check_uc uc; + + if (have_plugin) { + uc.config = config; + uc.client_ex = client_ex; + uc.client_name = client_name; + uc.server_ex = server_ex; + uc.server_name = server_name; + uc.req = req; + uc.method_data = method_data; + + ret = _krb5_plugin_run_f(context, "krb5", "windc", + KRB5_WINDC_PLUGIN_MINOR, 0, &uc, check); + } + + if (ret == KRB5_PLUGIN_NO_HANDLE) + return kdc_check_flags(context, config, + client_ex, client_name, + server_ex, server_name, + req->msg_type == krb_as_req); + return ret; } diff --git a/crypto/heimdal/kdc/windc_plugin.h b/crypto/heimdal/kdc/windc_plugin.h --- a/crypto/heimdal/kdc/windc_plugin.h +++ b/crypto/heimdal/kdc/windc_plugin.h @@ -52,11 +52,11 @@ struct hdb_entry_ex; typedef krb5_error_code -(*krb5plugin_windc_pac_generate)(void *, krb5_context, +(KRB5_CALLCONV *krb5plugin_windc_pac_generate)(void *, krb5_context, struct hdb_entry_ex *, krb5_pac *); typedef krb5_error_code -(*krb5plugin_windc_pac_verify)(void *, krb5_context, +(KRB5_CALLCONV *krb5plugin_windc_pac_verify)(void *, krb5_context, const krb5_principal, /* new ticket client */ const krb5_principal, /* delegation proxy */ struct hdb_entry_ex *,/* client */ @@ -65,12 +65,12 @@ krb5_pac *); typedef krb5_error_code -(*krb5plugin_windc_client_access)( +(KRB5_CALLCONV *krb5plugin_windc_client_access)( void *, krb5_context, krb5_kdc_configuration *config, - hdb_entry_ex *, const char *, - hdb_entry_ex *, const char *, - KDC_REQ *, krb5_data *); + hdb_entry_ex *, const char *, + hdb_entry_ex *, const char *, + KDC_REQ *, METHOD_DATA *); #define KRB5_WINDC_PLUGIN_MINOR 6 @@ -78,8 +78,8 @@ typedef struct krb5plugin_windc_ftable { int minor_version; - krb5_error_code (*init)(krb5_context, void **); - void (*fini)(void *); + krb5_error_code (KRB5_CALLCONV *init)(krb5_context, void **); + void (KRB5_CALLCONV *fini)(void *); krb5plugin_windc_pac_generate pac_generate; krb5plugin_windc_pac_verify pac_verify; krb5plugin_windc_client_access client_access; diff --git a/crypto/heimdal/kpasswd/Makefile.am b/crypto/heimdal/kpasswd/Makefile.am --- a/crypto/heimdal/kpasswd/Makefile.am +++ b/crypto/heimdal/kpasswd/Makefile.am @@ -2,8 +2,6 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_hcrypto) - man_MANS = kpasswd.1 kpasswdd.8 bin_PROGRAMS = kpasswd @@ -22,7 +20,7 @@ $(LDADD) \ $(LIB_pidfile) \ $(LIB_dlopen) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) LDADD = $(top_builddir)/lib/krb5/libkrb5.la \ $(LIB_hcrypto) \ diff --git a/crypto/heimdal/kpasswd/Makefile.in b/crypto/heimdal/kpasswd/Makefile.in --- a/crypto/heimdal/kpasswd/Makefile.in +++ b/crypto/heimdal/kpasswd/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,9 +94,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common bin_PROGRAMS = kpasswd$(EXEEXT) libexec_PROGRAMS = kpasswdd$(EXEEXT) noinst_PROGRAMS = kpasswd-generator$(EXEEXT) @@ -50,7 +101,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -61,8 +111,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -75,6 +124,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -94,6 +144,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -108,6 +159,10 @@ kpasswd_DEPENDENCIES = $(top_builddir)/lib/krb5/libkrb5.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = kpasswd_generator_SOURCES = kpasswd-generator.c kpasswd_generator_OBJECTS = kpasswd-generator.$(OBJEXT) kpasswd_generator_LDADD = $(LDADD) @@ -122,22 +177,51 @@ kpasswdd_DEPENDENCIES = $(top_builddir)/lib/kadm5/libkadm5srv.la \ $(top_builddir)/lib/hdb/libhdb.la $(am__DEPENDENCIES_2) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/kpasswd-generator.Po \ + ./$(DEPDIR)/kpasswd.Po ./$(DEPDIR)/kpasswdd.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(kpasswd_SOURCES) kpasswd-generator.c $(kpasswdd_SOURCES) DIST_SOURCES = $(kpasswd_SOURCES) kpasswd-generator.c \ $(kpasswdd_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/||"`;; \ @@ -159,16 +243,42 @@ 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 man8dir = $(mandir)/man8 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -183,16 +293,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -202,17 +315,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -231,12 +346,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -245,6 +357,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -261,10 +374,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -272,6 +383,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -286,12 +398,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -308,10 +423,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -322,13 +443,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -352,6 +467,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -375,9 +492,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -387,29 +509,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_hcrypto) +AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; man_MANS = kpasswd.1 kpasswdd.8 kpasswd_SOURCES = kpasswd.c kpasswd_locl.h kpasswdd_SOURCES = kpasswdd.c kpasswd_locl.h @@ -419,7 +549,7 @@ $(LDADD) \ $(LIB_pidfile) \ $(LIB_dlopen) \ - $(DBLIB) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) LDADD = $(top_builddir)/lib/krb5/libkrb5.la \ $(LIB_hcrypto) \ @@ -430,7 +560,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -443,15 +573,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kpasswd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign kpasswd/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -463,14 +593,19 @@ $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -491,7 +626,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -506,14 +642,19 @@ rm -f $$list install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -534,7 +675,8 @@ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files @@ -556,15 +698,18 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -kpasswd$(EXEEXT): $(kpasswd_OBJECTS) $(kpasswd_DEPENDENCIES) + +kpasswd$(EXEEXT): $(kpasswd_OBJECTS) $(kpasswd_DEPENDENCIES) $(EXTRA_kpasswd_DEPENDENCIES) @rm -f kpasswd$(EXEEXT) - $(LINK) $(kpasswd_OBJECTS) $(kpasswd_LDADD) $(LIBS) -kpasswd-generator$(EXEEXT): $(kpasswd_generator_OBJECTS) $(kpasswd_generator_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kpasswd_OBJECTS) $(kpasswd_LDADD) $(LIBS) + +kpasswd-generator$(EXEEXT): $(kpasswd_generator_OBJECTS) $(kpasswd_generator_DEPENDENCIES) $(EXTRA_kpasswd_generator_DEPENDENCIES) @rm -f kpasswd-generator$(EXEEXT) - $(LINK) $(kpasswd_generator_OBJECTS) $(kpasswd_generator_LDADD) $(LIBS) -kpasswdd$(EXEEXT): $(kpasswdd_OBJECTS) $(kpasswdd_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kpasswd_generator_OBJECTS) $(kpasswd_generator_LDADD) $(LIBS) + +kpasswdd$(EXEEXT): $(kpasswdd_OBJECTS) $(kpasswdd_DEPENDENCIES) $(EXTRA_kpasswdd_DEPENDENCIES) @rm -f kpasswdd$(EXEEXT) - $(LINK) $(kpasswdd_OBJECTS) $(kpasswdd_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(kpasswdd_OBJECTS) $(kpasswdd_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -572,30 +717,36 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpasswd-generator.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpasswd.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpasswdd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpasswd-generator.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpasswd.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kpasswdd.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -604,11 +755,18 @@ -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -637,16 +795,21 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -675,30 +838,17 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -710,15 +860,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -727,24 +873,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -795,10 +945,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -816,7 +971,9 @@ clean-libtool clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/kpasswd-generator.Po + -rm -f ./$(DEPDIR)/kpasswd.Po + -rm -f ./$(DEPDIR)/kpasswdd.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -840,9 +997,9 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libexecPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libexecPROGRAMS + install-html: install-html-am install-html-am: @@ -864,7 +1021,9 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/kpasswd-generator.Po + -rm -f ./$(DEPDIR)/kpasswd.Po + -rm -f ./$(DEPDIR)/kpasswdd.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -887,42 +1046,56 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 uninstall-man8 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libexecPROGRAMS \ - clean-libtool clean-noinstPROGRAMS ctags dist-hook distclean \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libexecPROGRAMS clean-libtool clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am \ install-libexecPROGRAMS install-man install-man1 install-man8 \ 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 \ + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-hook uninstall-libexecPROGRAMS \ uninstall-man uninstall-man1 uninstall-man8 +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -930,7 +1103,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -975,11 +1148,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -987,6 +1169,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1029,6 +1213,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1042,13 +1239,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/kpasswd/NTMakefile b/crypto/heimdal/kpasswd/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kpasswd/NTMakefile @@ -0,0 +1,51 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=kpasswd + +!include ../windows/NTMakefile.w32 + +BINPROGRAMS=\ + $(BINDIR)\kpasswd.exe + +KPASSWDLIBS=\ + $(LIBROKEN) \ + $(LIBHEIMDAL) \ + $(LIBVERS) + +$(BINDIR)\kpasswd.exe: $(OBJ)\kpasswd.obj $(KPASSWDLIBS) + $(EXECONLINK) + $(EXEPREP) + +all:: $(BINPROGRAMS) + +clean:: + -$(RM) $(BINPROGRAMS) diff --git a/crypto/heimdal/kpasswd/kpasswd-generator.c b/crypto/heimdal/kpasswd/kpasswd-generator.c --- a/crypto/heimdal/kpasswd/kpasswd-generator.c +++ b/crypto/heimdal/kpasswd/kpasswd-generator.c @@ -36,24 +36,24 @@ RCSID("$Id$"); static unsigned -read_words (const char *filename, char ***ret_w) +read_words(const char *filename, char ***ret_w) { unsigned n, alloc; FILE *f; char buf[256]; char **w = NULL; - f = fopen (filename, "r"); + f = fopen(filename, "r"); if (f == NULL) - err (1, "cannot open %s", filename); + err(1, "cannot open %s", filename); alloc = n = 0; - while (fgets (buf, sizeof(buf), f) != NULL) { + while (fgets(buf, sizeof(buf), f) != NULL) { buf[strcspn(buf, "\r\n")] = '\0'; if (n >= alloc) { alloc += 16; - w = erealloc (w, alloc * sizeof(char **)); + w = erealloc(w, alloc * sizeof(char *)); } - w[n++] = estrdup (buf); + w[n++] = estrdup(buf); } *ret_w = w; if (n == 0) @@ -63,30 +63,30 @@ } static int -nop_prompter (krb5_context context, - void *data, - const char *name, - const char *banner, - int num_prompts, - krb5_prompt prompts[]) +nop_prompter(krb5_context context, + void *data, + const char *name, + const char *banner, + int num_prompts, + krb5_prompt prompts[]) { return 0; } static void -generate_requests (const char *filename, unsigned nreq) +generate_requests(const char *filename, unsigned nreq) { krb5_context context; krb5_error_code ret; int i; char **words; - unsigned nwords; + unsigned nwords, k; - ret = krb5_init_context (&context); + ret = krb5_init_context(&context); if (ret) errx (1, "krb5_init_context failed: %d", ret); - nwords = read_words (filename, &words); + nwords = read_words(filename, &words); for (i = 0; i < nreq; ++i) { char *name = words[rand() % nwords]; @@ -96,29 +96,34 @@ int result_code; krb5_data result_code_string, result_string; char *old_pwd, *new_pwd; + int aret; - krb5_get_init_creds_opt_alloc (context, &opt); + krb5_get_init_creds_opt_alloc(context, &opt); krb5_get_init_creds_opt_set_tkt_life (opt, 300); krb5_get_init_creds_opt_set_forwardable (opt, FALSE); krb5_get_init_creds_opt_set_proxiable (opt, FALSE); - ret = krb5_parse_name (context, name, &principal); + ret = krb5_parse_name(context, name, &principal); if (ret) - krb5_err (context, 1, ret, "krb5_parse_name %s", name); - - asprintf (&old_pwd, "%s", name); - asprintf (&new_pwd, "%s2", name); - - ret = krb5_get_init_creds_password (context, - &cred, - principal, - old_pwd, - nop_prompter, - NULL, - 0, - "kadmin/changepw", - opt); - if( ret == KRB5KRB_AP_ERR_BAD_INTEGRITY + krb5_err(context, 1, ret, "krb5_parse_name %s", name); + + aret = asprintf(&old_pwd, "%s", name); + if (aret == -1) + krb5_errx(context, 1, "out of memory"); + aret = asprintf(&new_pwd, "%s2", name); + if (aret == -1) + krb5_errx(context, 1, "out of memory"); + + ret = krb5_get_init_creds_password(context, + &cred, + principal, + old_pwd, + nop_prompter, + NULL, + 0, + "kadmin/changepw", + opt); + if (ret == KRB5KRB_AP_ERR_BAD_INTEGRITY || ret == KRB5KRB_AP_ERR_MODIFIED) { char *tmp; @@ -126,66 +131,70 @@ new_pwd = old_pwd; old_pwd = tmp; - ret = krb5_get_init_creds_password (context, - &cred, - principal, - old_pwd, - nop_prompter, - NULL, - 0, - "kadmin/changepw", - opt); + ret = krb5_get_init_creds_password(context, + &cred, + principal, + old_pwd, + nop_prompter, + NULL, + 0, + "kadmin/changepw", + opt); } if (ret) - krb5_err (context, 1, ret, "krb5_get_init_creds_password"); + krb5_err(context, 1, ret, "krb5_get_init_creds_password"); - krb5_free_principal (context, principal); + krb5_free_principal(context, principal); - ret = krb5_set_password (context, - &cred, - new_pwd, - NULL, - &result_code, - &result_code_string, - &result_string); + ret = krb5_set_password(context, + &cred, + new_pwd, + NULL, + &result_code, + &result_code_string, + &result_string); if (ret) - krb5_err (context, 1, ret, "krb5_change_password"); + krb5_err(context, 1, ret, "krb5_change_password"); - free (old_pwd); - free (new_pwd); - krb5_free_cred_contents (context, &cred); + free(old_pwd); + free(new_pwd); + krb5_free_cred_contents(context, &cred); krb5_get_init_creds_opt_free(context, opt); } + + for (k = 0; k < nwords; k++) + free(words[k]); + free(words); } static int version_flag = 0; static int help_flag = 0; static struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; static void -usage (int ret) +usage(int ret) { - arg_printusage (args, - sizeof(args)/sizeof(*args), - NULL, - "file [number]"); + arg_printusage(args, + sizeof(args)/sizeof(*args), + NULL, + "file [number]"); exit (ret); } int main(int argc, char **argv) { - int optind = 0; + int optidx = 0; int nreq; char *end; setprogname(argv[0]); - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) usage (0); @@ -193,15 +202,15 @@ print_version(NULL); return 0; } - argc -= optind; - argv += optind; + argc -= optidx; + argv += optidx; if (argc != 2) usage (1); srand (0); - nreq = strtol (argv[1], &end, 0); + nreq = strtol(argv[1], &end, 0); if (argv[1] == end || *end != '\0') usage (1); - generate_requests (argv[0], nreq); + generate_requests(argv[0], nreq); return 0; } diff --git a/crypto/heimdal/kpasswd/kpasswd.c b/crypto/heimdal/kpasswd/kpasswd.c --- a/crypto/heimdal/kpasswd/kpasswd.c +++ b/crypto/heimdal/kpasswd/kpasswd.c @@ -64,25 +64,27 @@ krb5_error_code ret; char pwbuf[BUFSIZ]; char *msg, *name; + int aret; krb5_data_zero (&result_code_string); krb5_data_zero (&result_string); name = msg = NULL; if (principal == NULL) - asprintf(&msg, "New password: "); + aret = asprintf(&msg, "New password: "); else { ret = krb5_unparse_name(context, principal, &name); if (ret) krb5_err(context, 1, ret, "krb5_unparse_name"); - asprintf(&msg, "New password for %s: ", name); + aret = asprintf(&msg, "New password for %s: ", name); } - if (msg == NULL) + if (aret == -1 || msg == NULL) krb5_errx (context, 1, "out of memory"); - ret = UI_UTIL_read_pw_string (pwbuf, sizeof(pwbuf), msg, 1); + ret = UI_UTIL_read_pw_string (pwbuf, sizeof(pwbuf), msg, + UI_UTIL_FLAG_VERIFY); free(msg); if (name) free(name); diff --git a/crypto/heimdal/kpasswd/kpasswd.cat1 b/crypto/heimdal/kpasswd/kpasswd.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kpasswd/kpasswd.cat1 @@ -0,0 +1,31 @@ +KPASSWD(1) BSD General Commands Manual KPASSWD(1) + +NAME + kpasswd -- Kerberos 5 password changing program + +SYNOPSIS + kpasswd [--admin-principal=principal] [-c cache | --cache=cache] + [principal ...] + +DESCRIPTION + kpasswd is the client for changing passwords. + + If administrator principal is given that principal is used to change the + password. + + Multiple passwords for different users can be changed at the same time, + then the administrator principal will be used. If the administrator + isn't specified on the command prompt, the principal of the default cre- + dential cache will be used. + + If a credential cache is given, the --admin-principal flag is ignored and + use the default name of the credential cache is used instead. + +DIAGNOSTICS + If the password quality check fails or some other error occurs, an expla- + nation is printed. + +SEE ALSO + kpasswdd(8) + +HEIMDAL January 5, 2005 HEIMDAL diff --git a/crypto/heimdal/kpasswd/kpasswd_locl.h b/crypto/heimdal/kpasswd/kpasswd_locl.h --- a/crypto/heimdal/kpasswd/kpasswd_locl.h +++ b/crypto/heimdal/kpasswd/kpasswd_locl.h @@ -40,6 +40,8 @@ #include #endif +#include + #include #include #include @@ -96,7 +98,6 @@ #include #endif #include -#include #include #include #include "crypto-headers.h" /* for des_read_pw_string */ diff --git a/crypto/heimdal/kpasswd/kpasswdd.c b/crypto/heimdal/kpasswd/kpasswdd.c --- a/crypto/heimdal/kpasswd/kpasswdd.c +++ b/crypto/heimdal/kpasswd/kpasswdd.c @@ -123,21 +123,26 @@ uint16_t result_code, const char *expl) { - char *str; - krb5_data_zero (data); - - data->length = asprintf (&str, - "%c%c%s", - (result_code >> 8) & 0xFF, - result_code & 0xFF, - expl); + krb5_error_code ret; + krb5_storage *sp; + + sp = krb5_storage_emem(); + if (sp == NULL) goto out; + ret = krb5_store_uint16(sp, result_code); + if (ret) goto out; + ret = krb5_store_stringz(sp, expl); + if (ret) goto out; + ret = krb5_storage_to_data(sp, data); + if (ret) goto out; + krb5_storage_free(sp); - if (str == NULL) { - krb5_warnx (context, "Out of memory generating error reply"); - return 1; - } - data->data = str; return 0; + out: + if (sp) + krb5_storage_free(sp); + + krb5_warnx (context, "Out of memory generating error reply"); + return 1; } static void @@ -293,6 +298,7 @@ if (chpw.targname) { krb5_principal_data princ; + memset(&princ, 0, sizeof (princ)); princ.name = *chpw.targname; princ.realm = *chpw.targrealm; if (princ.realm == NULL) { @@ -401,7 +407,7 @@ tmp = pwd_data->data; tmp[pwd_data->length - 1] = '\0'; - ret = kadm5_s_chpass_principal_cond (kadm5_handle, principal, tmp); + ret = kadm5_s_chpass_principal_cond (kadm5_handle, principal, 1, tmp); krb5_free_data (context, pwd_data); pwd_data = NULL; if (ret) { @@ -430,7 +436,6 @@ static int verify (krb5_auth_context *auth_context, - krb5_realm *realms, krb5_keytab keytab, krb5_ticket **ticket, krb5_data *out_data, @@ -446,7 +451,9 @@ uint16_t pkt_len, pkt_ver, ap_req_len; krb5_data ap_req_data; krb5_data krb_priv_data; - krb5_realm *r; + krb5_const_realm client_realm; + krb5_principal sprinc; + int same; /* * Only send an error reply if the request passes basic length @@ -495,47 +502,40 @@ return 1; } - /* verify realm and principal */ - for (r = realms; *r != NULL; r++) { - krb5_principal principal; - krb5_boolean same; - - ret = krb5_make_principal (context, - &principal, - *r, - "kadmin", - "changepw", - NULL); - if (ret) - krb5_err (context, 1, ret, "krb5_make_principal"); - - same = krb5_principal_compare(context, principal, (*ticket)->server); - krb5_free_principal(context, principal); - if (same == TRUE) - break; - } - if (*r == NULL) { - char *str; - krb5_unparse_name(context, (*ticket)->server, &str); - krb5_warnx (context, "client used not valid principal %s", str); - free(str); - reply_error (NULL, s, sa, sa_size, ret, 1, - "Bad request"); + if (!(*ticket)->ticket.flags.initial) { + krb5_warnx(context, "initial flag not set"); + reply_error((*ticket)->server->realm, s, sa, sa_size, ret, 1, + "Bad request"); goto out; } - if (strcmp((*ticket)->server->realm, (*ticket)->client->realm) != 0) { - krb5_warnx (context, "server realm (%s) not same a client realm (%s)", - (*ticket)->server->realm, (*ticket)->client->realm); - reply_error ((*ticket)->server->realm, s, sa, sa_size, ret, 1, - "Bad request"); - goto out; - } + /* + * The service principal must be kadmin/changepw@CLIENT-REALM, there + * is no reason to require the KDC's default realm(s) to be the same + * as the realm(s) it serves. The only potential issue is when a KDC + * is a master for realm A and a slave for realm B, in which case it + * should not accept requests to change passwords for realm B, these + * should be sent to realm B's master. This same issue is present in + * the checks that only accepted local realms, there is no new risk. + */ - if (!(*ticket)->ticket.flags.initial) { - krb5_warnx (context, "initial flag not set"); - reply_error ((*ticket)->server->realm, s, sa, sa_size, ret, 1, - "Bad request"); + client_realm = krb5_principal_get_realm(context, (*ticket)->client); + ret = krb5_make_principal(context, &sprinc, client_realm, + "kadmin", "changepw", NULL); + if (ret) + goto out; + same = krb5_principal_compare(context, sprinc, (*ticket)->server); + krb5_free_principal(context, sprinc); + + if (!same) { + char *sname; + + if (krb5_unparse_name(context, (*ticket)->server, &sname) != 0) + sname = NULL; + krb5_warnx(context, "Invalid kpasswd service principal %s", + sname ? sname : ""); + free(sname); + reply_error(NULL, s, sa, sa_size, ret, 1, "Bad request"); goto out; } krb_priv_data.data = msg + 6 + ap_req_len; @@ -576,8 +576,7 @@ } static void -process (krb5_realm *realms, - krb5_keytab keytab, +process (krb5_keytab keytab, int s, krb5_address *this_addr, struct sockaddr *sa, @@ -616,7 +615,7 @@ goto out; } - if (verify (&auth_context, realms, keytab, &ticket, &out_data, + if (verify (&auth_context, keytab, &ticket, &out_data, &version, s, sa, sa_size, msg, len, &other_addr) == 0) { /* @@ -647,74 +646,109 @@ krb5_auth_con_free(context, auth_context); } +static const char *check_library = NULL; +static const char *check_function = NULL; +static getarg_strings policy_libraries = { 0, NULL }; +static char sHDB[] = "HDBGET:"; +static char *keytab_str = sHDB; +static char *realm_str; +static int version_flag; +static int help_flag; +static int detach_from_console; +static int daemon_child = -1; +static char *port_str; +static char *config_file; + +struct getargs args[] = { +#ifdef HAVE_DLOPEN + { "check-library", 0, arg_string, &check_library, + "library to load password check function from", "library" }, + { "check-function", 0, arg_string, &check_function, + "password check function to load", "function" }, + { "policy-libraries", 0, arg_strings, &policy_libraries, + "password check function to load", "function" }, +#endif + { "addresses", 0, arg_strings, &addresses_str, + "addresses to listen on", "list of addresses" }, + { "detach", 0, arg_flag, &detach_from_console, + "detach from console", NULL }, + { "daemon-child", 0 , arg_integer, &daemon_child, + "private argument, do not use", NULL }, + { "keytab", 'k', arg_string, &keytab_str, + "keytab to get authentication key from", "kspec" }, + { "config-file", 'c', arg_string, &config_file, NULL, NULL }, + { "realm", 'r', arg_string, &realm_str, "default realm", "realm" }, + { "port", 'p', arg_string, &port_str, "port", NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } +}; +int num_args = sizeof(args) / sizeof(args[0]); + static int -doit (krb5_keytab keytab, int port) +doit(krb5_keytab keytab, int port) { krb5_error_code ret; int *sockets; int maxfd; - krb5_realm *realms; krb5_addresses addrs; unsigned n, i; fd_set real_fdset; struct sockaddr_storage __ss; struct sockaddr *sa = (struct sockaddr *)&__ss; - ret = krb5_get_default_realms(context, &realms); - if (ret) - krb5_err (context, 1, ret, "krb5_get_default_realms"); - if (explicit_addresses.len) { addrs = explicit_addresses; } else { - ret = krb5_get_all_server_addrs (context, &addrs); + ret = krb5_get_all_server_addrs(context, &addrs); if (ret) - krb5_err (context, 1, ret, "krb5_get_all_server_addrs"); + krb5_err(context, 1, ret, "krb5_get_all_server_addrs"); } n = addrs.len; - sockets = malloc (n * sizeof(*sockets)); + sockets = malloc(n * sizeof(*sockets)); if (sockets == NULL) - krb5_errx (context, 1, "out of memory"); + krb5_errx(context, 1, "out of memory"); maxfd = -1; FD_ZERO(&real_fdset); for (i = 0; i < n; ++i) { krb5_socklen_t sa_size = sizeof(__ss); - krb5_addr2sockaddr (context, &addrs.val[i], sa, &sa_size, port); + krb5_addr2sockaddr(context, &addrs.val[i], sa, &sa_size, port); - sockets[i] = socket (sa->sa_family, SOCK_DGRAM, 0); + sockets[i] = socket(__ss.ss_family, SOCK_DGRAM, 0); if (sockets[i] < 0) - krb5_err (context, 1, errno, "socket"); - if (bind (sockets[i], sa, sa_size) < 0) { + krb5_err(context, 1, errno, "socket"); + if (bind(sockets[i], sa, sa_size) < 0) { char str[128]; size_t len; int save_errno = errno; - ret = krb5_print_address (&addrs.val[i], str, sizeof(str), &len); + ret = krb5_print_address(&addrs.val[i], str, sizeof(str), &len); if (ret) strlcpy(str, "unknown address", sizeof(str)); - krb5_warn (context, save_errno, "bind(%s)", str); + krb5_warn(context, save_errno, "bind(%s)", str); continue; } - maxfd = max (maxfd, sockets[i]); + maxfd = max(maxfd, sockets[i]); if (maxfd >= FD_SETSIZE) - krb5_errx (context, 1, "fd too large"); + krb5_errx(context, 1, "fd too large"); FD_SET(sockets[i], &real_fdset); } if (maxfd == -1) - krb5_errx (context, 1, "No sockets!"); + krb5_errx(context, 1, "No sockets!"); - while(exit_flag == 0) { + roken_detach_finish(NULL, daemon_child); + + while (exit_flag == 0) { krb5_ssize_t retx; fd_set fdset = real_fdset; - retx = select (maxfd + 1, &fdset, NULL, NULL, NULL); + retx = select(maxfd + 1, &fdset, NULL, NULL, NULL); if (retx < 0) { if (errno == EINTR) continue; else - krb5_err (context, 1, errno, "select"); + krb5_err(context, 1, errno, "select"); } for (i = 0; i < n; ++i) if (FD_ISSET(sockets[i], &fdset)) { @@ -724,13 +758,13 @@ retx = recvfrom(sockets[i], buf, sizeof(buf), 0, sa, &addrlen); if (retx < 0) { - if(errno == EINTR) + if (errno == EINTR) break; else - krb5_err (context, 1, errno, "recvfrom"); + krb5_err(context, 1, errno, "recvfrom"); } - process (realms, keytab, sockets[i], + process(keytab, sockets[i], &addrs.val[i], sa, addrlen, buf, retx); @@ -741,9 +775,8 @@ close(sockets[i]); free(sockets); - krb5_free_addresses (context, &addrs); - krb5_free_host_realm (context, realms); - krb5_free_context (context); + krb5_free_addresses(context, &addrs); + krb5_free_context(context); return 0; } @@ -753,58 +786,31 @@ exit_flag = 1; } -static const char *check_library = NULL; -static const char *check_function = NULL; -static getarg_strings policy_libraries = { 0, NULL }; -static char sHDB[] = "HDB:"; -static char *keytab_str = sHDB; -static char *realm_str; -static int version_flag; -static int help_flag; -static char *port_str; -static char *config_file; - -struct getargs args[] = { -#ifdef HAVE_DLOPEN - { "check-library", 0, arg_string, &check_library, - "library to load password check function from", "library" }, - { "check-function", 0, arg_string, &check_function, - "password check function to load", "function" }, - { "policy-libraries", 0, arg_strings, &policy_libraries, - "password check function to load", "function" }, -#endif - { "addresses", 0, arg_strings, &addresses_str, - "addresses to listen on", "list of addresses" }, - { "keytab", 'k', arg_string, &keytab_str, - "keytab to get authentication key from", "kspec" }, - { "config-file", 'c', arg_string, &config_file, NULL, NULL }, - { "realm", 'r', arg_string, &realm_str, "default realm", "realm" }, - { "port", 'p', arg_string, &port_str, "port", NULL }, - { "version", 0, arg_flag, &version_flag, NULL, NULL }, - { "help", 0, arg_flag, &help_flag, NULL, NULL } -}; -int num_args = sizeof(args) / sizeof(args[0]); - int -main (int argc, char **argv) +main(int argc, char **argv) { krb5_keytab keytab; krb5_error_code ret; char **files; int port, i; + int aret; krb5_program_setup(&context, argc, argv, args, num_args, NULL); - if(help_flag) + if (help_flag) krb5_std_usage(0, args, num_args); - if(version_flag) { + + if (version_flag) { print_version(NULL); exit(0); } + if (detach_from_console > 0 && daemon_child == -1) + roken_detach_prep(argc, argv, "--daemon-child"); + if (config_file == NULL) { - asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); - if (config_file == NULL) + aret = asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); + if (aret == -1) errx(1, "out of memory"); } @@ -817,37 +823,37 @@ if (ret) krb5_err(context, 1, ret, "reading configuration files"); - if(realm_str) + if (realm_str) krb5_set_default_realm(context, realm_str); - krb5_openlog (context, "kpasswdd", &log_facility); + krb5_openlog(context, "kpasswdd", &log_facility); krb5_set_warn_dest(context, log_facility); if (port_str != NULL) { - struct servent *s = roken_getservbyname (port_str, "udp"); + struct servent *s = roken_getservbyname(port_str, "udp"); if (s != NULL) port = s->s_port; else { char *ptr; - port = strtol (port_str, &ptr, 10); + port = strtol(port_str, &ptr, 10); if (port == 0 && ptr == port_str) - krb5_errx (context, 1, "bad port `%s'", port_str); + krb5_errx(context, 1, "bad port `%s'", port_str); port = htons(port); } } else - port = krb5_getportbyname (context, "kpasswd", "udp", KPASSWD_PORT); + port = krb5_getportbyname(context, "kpasswd", "udp", KPASSWD_PORT); - ret = krb5_kt_register(context, &hdb_kt_ops); - if(ret) + ret = krb5_kt_register(context, &hdb_get_kt_ops); + if (ret) krb5_err(context, 1, ret, "krb5_kt_register"); ret = krb5_kt_resolve(context, keytab_str, &keytab); - if(ret) + if (ret) krb5_err(context, 1, ret, "%s", keytab_str); - kadm5_setup_passwd_quality_check (context, check_library, check_function); + kadm5_setup_passwd_quality_check(context, check_library, check_function); for (i = 0; i < policy_libraries.num_strings; i++) { ret = kadm5_add_passwd_quality_verifier(context, @@ -866,16 +872,16 @@ int j; for (j = 0; j < addresses_str.num_strings; ++j) - add_one_address (addresses_str.strings[j], j == 0); - free_getarg_strings (&addresses_str); + add_one_address(addresses_str.strings[j], j == 0); + free_getarg_strings(&addresses_str); } else { - char **foo = krb5_config_get_strings (context, NULL, + char **foo = krb5_config_get_strings(context, NULL, "kdc", "addresses", NULL); if (foo != NULL) { - add_one_address (*foo++, TRUE); + add_one_address(*foo++, TRUE); while (*foo) - add_one_address (*foo++, FALSE); + add_one_address(*foo++, FALSE); } } @@ -895,7 +901,7 @@ signal(SIGTERM, sigterm); #endif - pidfile(NULL); + rk_pidfile(NULL); - return doit (keytab, port); + return doit(keytab, port); } diff --git a/crypto/heimdal/kpasswd/kpasswdd.cat8 b/crypto/heimdal/kpasswd/kpasswdd.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kpasswd/kpasswdd.cat8 @@ -0,0 +1,58 @@ +KPASSWDD(8) BSD System Manager's Manual KPASSWDD(8) + +NAME + kpasswdd -- Kerberos 5 password changing server + +SYNOPSIS + kpasswdd [--addresses=address] [--check-library=library] + [--check-function=function] [-k kspec | --keytab=kspec] [-r + realm | --realm=realm] [-p string | --port=string] [--version] + [--help] + +DESCRIPTION + kpasswdd serves request for password changes. It listens on UDP port 464 + (service kpasswd) and processes requests when they arrive. It changes the + database directly and should thus only run on the master KDC. + + Supported options: + + --addresses=address + For each till the argument is given, add the address to what + kpasswdd should listen too. + + --check-library=library + If your system has support for dynamic loading of shared li- + braries, you can use an external function to check password qual- + ity. This option specifies which library to load. + + --check-function=function + This is the function to call in the loaded library. The function + should look like this: + + const char * passwd_check(krb5_context context, krb5_principal + principal, krb5_data *password) + + context is an initialized context; principal is the one who tries + to change passwords, and password is the new password. Note that + the password (in password->data) is not zero terminated. + + -k kspec, --keytab=kspec + Keytab to get authentication key from. + + -r realm, --realm=realm + Default realm. + + -p string, --port=string + Port to listen on (default service kpasswd - 464). + +DIAGNOSTICS + If an error occurs, the error message is returned to the user and/or + logged to syslog. + +BUGS + The default password quality checks are too basic. + +SEE ALSO + kpasswd(1), kdc(8) + +HEIMDAL April 19, 1999 HEIMDAL diff --git a/crypto/heimdal/krb5.conf b/crypto/heimdal/krb5.conf --- a/crypto/heimdal/krb5.conf +++ b/crypto/heimdal/krb5.conf @@ -1,16 +1,6 @@ [libdefaults] - default_realm = MY.REALM + default_realm = MY.REALM clockskew = 300 - v4_instance_resolve = false - v4_name_convert = { - host = { - rcmd = host - ftp = ftp - } - plain = { - something = something-else - } - } [realms] MY.REALM = { diff --git a/crypto/heimdal/kuser/Makefile.am b/crypto/heimdal/kuser/Makefile.am --- a/crypto/heimdal/kuser/Makefile.am +++ b/crypto/heimdal/kuser/Makefile.am @@ -2,7 +2,11 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_hcrypto) -I$(srcdir)/../lib/krb5 \ +if !NO_AFS +afs_lib = $(LIB_kafs) +endif + +AM_CPPFLAGS += -I$(srcdir)/../lib/krb5 \ $(INCLUDE_libintl) \ -DHEIMDAL_LOCALEDIR='"$(localedir)"' @@ -15,13 +19,13 @@ kgetcred.1 \ kimpersonate.8 -bin_PROGRAMS = kinit kdestroy kgetcred kcc +bin_PROGRAMS = kinit kdestroy kgetcred heimtools libexec_PROGRAMS = kdigest kimpersonate noinst_PROGRAMS = kverify kdecode_ticket generate-requests kinit_LDADD = \ - $(LIB_kafs) \ + $(afs_lib) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/ntlm/libheimntlm.la \ $(LIB_hcrypto) \ @@ -33,15 +37,15 @@ kimpersonate_LDADD = $(kinit_LDADD) -kcc_LDADD = \ +heimtools_LDADD = \ $(top_builddir)/lib/sl/libsl.la \ $(kinit_LDADD) \ $(LIB_readline) -dist_kcc_SOURCES = kcc.c klist.c kswitch.c copy_cred_cache.c -nodist_kcc_SOURCES = kcc-commands.c +dist_heimtools_SOURCES = heimtools.c klist.c kswitch.c copy_cred_cache.c +nodist_heimtools_SOURCES = heimtools-commands.c -$(kcc_OBJECTS): kcc-commands.h +$(heimtools_OBJECTS): heimtools-commands.h dist_kdigest_SOURCES = kdigest.c nodist_kdigest_SOURCES = kdigest-commands.c @@ -58,13 +62,13 @@ CLEANFILES = \ kdigest-commands.h kdigest-commands.c \ - kcc-commands.h kcc-commands.c + heimtools-commands.h heimtools-commands.c kdigest-commands.c kdigest-commands.h: kdigest-commands.in $(SLC) $(srcdir)/kdigest-commands.in -kcc-commands.c kcc-commands.h: kcc-commands.in - $(SLC) $(srcdir)/kcc-commands.in +heimtools-commands.c heimtools-commands.h: heimtools-commands.in + $(SLC) $(srcdir)/heimtools-commands.in LDADD = \ $(top_builddir)/lib/krb5/libkrb5.la \ @@ -73,16 +77,19 @@ $(LIB_roken) EXTRA_DIST = NTMakefile $(man_MANS) \ - kcc-version.rc \ + heimtools-version.rc \ + kcpytkt.c \ + kdeltkt.c \ + kvno.c \ kdestroy-version.rc \ kdigest-version.rc \ kgetcred-version.rc \ kimpersonate-version.rc \ kinit-version.rc \ - kuser_locl.h kcc-commands.in kdigest-commands.in copy_cred_cache.1 + kuser_locl.h heimtools-commands.in kdigest-commands.in copy_cred_cache.1 # make sure install-exec-hook doesn't have any commands in Makefile.am.common install-exec-hook: - (cd $(DESTDIR)$(bindir) && rm -f klist && $(LN_S) kcc klist) - (cd $(DESTDIR)$(bindir) && rm -f kswitch && $(LN_S) kcc kswitch) + (cd $(DESTDIR)$(bindir) && rm -f klist && $(LN_S) heimtools klist) + (cd $(DESTDIR)$(bindir) && rm -f kswitch && $(LN_S) heimtools kswitch) diff --git a/crypto/heimdal/kuser/Makefile.in b/crypto/heimdal/kuser/Makefile.in --- a/crypto/heimdal/kuser/Makefile.in +++ b/crypto/heimdal/kuser/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,11 +94,8 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common bin_PROGRAMS = kinit$(EXEEXT) kdestroy$(EXEEXT) kgetcred$(EXEEXT) \ - kcc$(EXEEXT) + heimtools$(EXEEXT) libexec_PROGRAMS = kdigest$(EXEEXT) kimpersonate$(EXEEXT) noinst_PROGRAMS = kverify$(EXEEXT) kdecode_ticket$(EXEEXT) \ generate-requests$(EXEEXT) @@ -52,7 +103,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -63,8 +113,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -77,6 +126,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -96,6 +146,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -110,19 +161,26 @@ generate_requests_DEPENDENCIES = $(top_builddir)/lib/krb5/libkrb5.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ $(am__DEPENDENCIES_1) -dist_kcc_OBJECTS = kcc.$(OBJEXT) klist.$(OBJEXT) kswitch.$(OBJEXT) \ - copy_cred_cache.$(OBJEXT) -nodist_kcc_OBJECTS = kcc-commands.$(OBJEXT) -kcc_OBJECTS = $(dist_kcc_OBJECTS) $(nodist_kcc_OBJECTS) -am__DEPENDENCIES_2 = $(top_builddir)/lib/kafs/libkafs.la \ - $(am__DEPENDENCIES_1) -am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +dist_heimtools_OBJECTS = heimtools.$(OBJEXT) klist.$(OBJEXT) \ + kswitch.$(OBJEXT) copy_cred_cache.$(OBJEXT) +nodist_heimtools_OBJECTS = heimtools-commands.$(OBJEXT) +heimtools_OBJECTS = $(dist_heimtools_OBJECTS) \ + $(nodist_heimtools_OBJECTS) +@NO_AFS_FALSE@am__DEPENDENCIES_2 = \ +@NO_AFS_FALSE@ $(top_builddir)/lib/kafs/libkafs.la \ +@NO_AFS_FALSE@ $(am__DEPENDENCIES_1) +@NO_AFS_FALSE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) +am__DEPENDENCIES_4 = $(am__DEPENDENCIES_3) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/ntlm/libheimntlm.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) -kcc_DEPENDENCIES = $(top_builddir)/lib/sl/libsl.la \ - $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_1) +heimtools_DEPENDENCIES = $(top_builddir)/lib/sl/libsl.la \ + $(am__DEPENDENCIES_4) $(am__DEPENDENCIES_1) kdecode_ticket_SOURCES = kdecode_ticket.c kdecode_ticket_OBJECTS = kdecode_ticket.$(OBJEXT) kdecode_ticket_LDADD = $(LDADD) @@ -131,7 +189,7 @@ $(am__DEPENDENCIES_1) kdestroy_SOURCES = kdestroy.c kdestroy_OBJECTS = kdestroy.$(OBJEXT) -kdestroy_DEPENDENCIES = $(am__DEPENDENCIES_3) +kdestroy_DEPENDENCIES = $(am__DEPENDENCIES_4) dist_kdigest_OBJECTS = kdigest.$(OBJEXT) nodist_kdigest_OBJECTS = kdigest-commands.$(OBJEXT) kdigest_OBJECTS = $(dist_kdigest_OBJECTS) $(nodist_kdigest_OBJECTS) @@ -147,10 +205,10 @@ $(am__DEPENDENCIES_1) kimpersonate_SOURCES = kimpersonate.c kimpersonate_OBJECTS = kimpersonate.$(OBJEXT) -kimpersonate_DEPENDENCIES = $(am__DEPENDENCIES_3) +kimpersonate_DEPENDENCIES = $(am__DEPENDENCIES_4) kinit_SOURCES = kinit.c kinit_OBJECTS = kinit.$(OBJEXT) -kinit_DEPENDENCIES = $(am__DEPENDENCIES_2) \ +kinit_DEPENDENCIES = $(am__DEPENDENCIES_3) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/ntlm/libheimntlm.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ @@ -161,25 +219,59 @@ kverify_DEPENDENCIES = $(top_builddir)/lib/krb5/libkrb5.la \ $(am__DEPENDENCIES_1) $(top_builddir)/lib/asn1/libasn1.la \ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/copy_cred_cache.Po \ + ./$(DEPDIR)/generate-requests.Po \ + ./$(DEPDIR)/heimtools-commands.Po ./$(DEPDIR)/heimtools.Po \ + ./$(DEPDIR)/kdecode_ticket.Po ./$(DEPDIR)/kdestroy.Po \ + ./$(DEPDIR)/kdigest-commands.Po ./$(DEPDIR)/kdigest.Po \ + ./$(DEPDIR)/kgetcred.Po ./$(DEPDIR)/kimpersonate.Po \ + ./$(DEPDIR)/kinit.Po ./$(DEPDIR)/klist.Po \ + ./$(DEPDIR)/kswitch.Po ./$(DEPDIR)/kverify.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ -SOURCES = generate-requests.c $(dist_kcc_SOURCES) \ - $(nodist_kcc_SOURCES) kdecode_ticket.c kdestroy.c \ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = generate-requests.c $(dist_heimtools_SOURCES) \ + $(nodist_heimtools_SOURCES) kdecode_ticket.c kdestroy.c \ $(dist_kdigest_SOURCES) $(nodist_kdigest_SOURCES) kgetcred.c \ kimpersonate.c kinit.c kverify.c -DIST_SOURCES = generate-requests.c $(dist_kcc_SOURCES) \ +DIST_SOURCES = generate-requests.c $(dist_heimtools_SOURCES) \ kdecode_ticket.c kdestroy.c $(dist_kdigest_SOURCES) kgetcred.c \ kimpersonate.c kinit.c kverify.c +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/||"`;; \ @@ -201,16 +293,42 @@ 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 man8dir = $(mandir)/man8 MANS = $(man_MANS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -225,16 +343,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -244,17 +365,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -273,12 +396,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -287,6 +407,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -303,10 +424,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -314,6 +433,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -328,12 +448,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -350,10 +473,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -364,13 +493,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -394,6 +517,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -417,9 +542,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -429,31 +559,39 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_hcrypto) \ - -I$(srcdir)/../lib/krb5 $(INCLUDE_libintl) \ - -DHEIMDAL_LOCALEDIR='"$(localedir)"' +AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/../lib/krb5 \ + $(INCLUDE_libintl) -DHEIMDAL_LOCALEDIR='"$(localedir)"' @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +@NO_AFS_FALSE@afs_lib = $(LIB_kafs) man_MANS = \ kinit.1 \ klist.1 \ @@ -464,7 +602,7 @@ kimpersonate.8 kinit_LDADD = \ - $(LIB_kafs) \ + $(afs_lib) \ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/ntlm/libheimntlm.la \ $(LIB_hcrypto) \ @@ -474,13 +612,13 @@ kdestroy_LDADD = $(kinit_LDADD) kimpersonate_LDADD = $(kinit_LDADD) -kcc_LDADD = \ +heimtools_LDADD = \ $(top_builddir)/lib/sl/libsl.la \ $(kinit_LDADD) \ $(LIB_readline) -dist_kcc_SOURCES = kcc.c klist.c kswitch.c copy_cred_cache.c -nodist_kcc_SOURCES = kcc-commands.c +dist_heimtools_SOURCES = heimtools.c klist.c kswitch.c copy_cred_cache.c +nodist_heimtools_SOURCES = heimtools-commands.c dist_kdigest_SOURCES = kdigest.c nodist_kdigest_SOURCES = kdigest-commands.c kdigest_LDADD = \ @@ -493,7 +631,7 @@ CLEANFILES = \ kdigest-commands.h kdigest-commands.c \ - kcc-commands.h kcc-commands.c + heimtools-commands.h heimtools-commands.c LDADD = \ $(top_builddir)/lib/krb5/libkrb5.la \ @@ -502,18 +640,21 @@ $(LIB_roken) EXTRA_DIST = NTMakefile $(man_MANS) \ - kcc-version.rc \ + heimtools-version.rc \ + kcpytkt.c \ + kdeltkt.c \ + kvno.c \ kdestroy-version.rc \ kdigest-version.rc \ kgetcred-version.rc \ kimpersonate-version.rc \ kinit-version.rc \ - kuser_locl.h kcc-commands.in kdigest-commands.in copy_cred_cache.1 + kuser_locl.h heimtools-commands.in kdigest-commands.in copy_cred_cache.1 all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -526,15 +667,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign kuser/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign kuser/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -546,14 +687,19 @@ $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -574,7 +720,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -589,14 +736,19 @@ rm -f $$list install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -617,7 +769,8 @@ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files @@ -639,33 +792,42 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -generate-requests$(EXEEXT): $(generate_requests_OBJECTS) $(generate_requests_DEPENDENCIES) + +generate-requests$(EXEEXT): $(generate_requests_OBJECTS) $(generate_requests_DEPENDENCIES) $(EXTRA_generate_requests_DEPENDENCIES) @rm -f generate-requests$(EXEEXT) - $(LINK) $(generate_requests_OBJECTS) $(generate_requests_LDADD) $(LIBS) -kcc$(EXEEXT): $(kcc_OBJECTS) $(kcc_DEPENDENCIES) - @rm -f kcc$(EXEEXT) - $(LINK) $(kcc_OBJECTS) $(kcc_LDADD) $(LIBS) -kdecode_ticket$(EXEEXT): $(kdecode_ticket_OBJECTS) $(kdecode_ticket_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(generate_requests_OBJECTS) $(generate_requests_LDADD) $(LIBS) + +heimtools$(EXEEXT): $(heimtools_OBJECTS) $(heimtools_DEPENDENCIES) $(EXTRA_heimtools_DEPENDENCIES) + @rm -f heimtools$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(heimtools_OBJECTS) $(heimtools_LDADD) $(LIBS) + +kdecode_ticket$(EXEEXT): $(kdecode_ticket_OBJECTS) $(kdecode_ticket_DEPENDENCIES) $(EXTRA_kdecode_ticket_DEPENDENCIES) @rm -f kdecode_ticket$(EXEEXT) - $(LINK) $(kdecode_ticket_OBJECTS) $(kdecode_ticket_LDADD) $(LIBS) -kdestroy$(EXEEXT): $(kdestroy_OBJECTS) $(kdestroy_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kdecode_ticket_OBJECTS) $(kdecode_ticket_LDADD) $(LIBS) + +kdestroy$(EXEEXT): $(kdestroy_OBJECTS) $(kdestroy_DEPENDENCIES) $(EXTRA_kdestroy_DEPENDENCIES) @rm -f kdestroy$(EXEEXT) - $(LINK) $(kdestroy_OBJECTS) $(kdestroy_LDADD) $(LIBS) -kdigest$(EXEEXT): $(kdigest_OBJECTS) $(kdigest_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kdestroy_OBJECTS) $(kdestroy_LDADD) $(LIBS) + +kdigest$(EXEEXT): $(kdigest_OBJECTS) $(kdigest_DEPENDENCIES) $(EXTRA_kdigest_DEPENDENCIES) @rm -f kdigest$(EXEEXT) - $(LINK) $(kdigest_OBJECTS) $(kdigest_LDADD) $(LIBS) -kgetcred$(EXEEXT): $(kgetcred_OBJECTS) $(kgetcred_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kdigest_OBJECTS) $(kdigest_LDADD) $(LIBS) + +kgetcred$(EXEEXT): $(kgetcred_OBJECTS) $(kgetcred_DEPENDENCIES) $(EXTRA_kgetcred_DEPENDENCIES) @rm -f kgetcred$(EXEEXT) - $(LINK) $(kgetcred_OBJECTS) $(kgetcred_LDADD) $(LIBS) -kimpersonate$(EXEEXT): $(kimpersonate_OBJECTS) $(kimpersonate_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kgetcred_OBJECTS) $(kgetcred_LDADD) $(LIBS) + +kimpersonate$(EXEEXT): $(kimpersonate_OBJECTS) $(kimpersonate_DEPENDENCIES) $(EXTRA_kimpersonate_DEPENDENCIES) @rm -f kimpersonate$(EXEEXT) - $(LINK) $(kimpersonate_OBJECTS) $(kimpersonate_LDADD) $(LIBS) -kinit$(EXEEXT): $(kinit_OBJECTS) $(kinit_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kimpersonate_OBJECTS) $(kimpersonate_LDADD) $(LIBS) + +kinit$(EXEEXT): $(kinit_OBJECTS) $(kinit_DEPENDENCIES) $(EXTRA_kinit_DEPENDENCIES) @rm -f kinit$(EXEEXT) - $(LINK) $(kinit_OBJECTS) $(kinit_LDADD) $(LIBS) -kverify$(EXEEXT): $(kverify_OBJECTS) $(kverify_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(kinit_OBJECTS) $(kinit_LDADD) $(LIBS) + +kverify$(EXEEXT): $(kverify_OBJECTS) $(kverify_DEPENDENCIES) $(EXTRA_kverify_DEPENDENCIES) @rm -f kverify$(EXEEXT) - $(LINK) $(kverify_OBJECTS) $(kverify_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(kverify_OBJECTS) $(kverify_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -673,41 +835,47 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy_cred_cache.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate-requests.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kcc-commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kcc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdecode_ticket.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdestroy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdigest-commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdigest.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kgetcred.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kimpersonate.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kinit.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/klist.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kswitch.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kverify.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copy_cred_cache.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generate-requests.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heimtools-commands.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heimtools.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdecode_ticket.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdestroy.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdigest-commands.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kdigest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kgetcred.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kimpersonate.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kinit.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/klist.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kswitch.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kverify.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -716,11 +884,18 @@ -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -749,16 +924,21 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -787,30 +967,17 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } - -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) + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -822,15 +989,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -839,24 +1002,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -907,10 +1074,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -929,7 +1101,20 @@ clean-libtool clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/copy_cred_cache.Po + -rm -f ./$(DEPDIR)/generate-requests.Po + -rm -f ./$(DEPDIR)/heimtools-commands.Po + -rm -f ./$(DEPDIR)/heimtools.Po + -rm -f ./$(DEPDIR)/kdecode_ticket.Po + -rm -f ./$(DEPDIR)/kdestroy.Po + -rm -f ./$(DEPDIR)/kdigest-commands.Po + -rm -f ./$(DEPDIR)/kdigest.Po + -rm -f ./$(DEPDIR)/kgetcred.Po + -rm -f ./$(DEPDIR)/kimpersonate.Po + -rm -f ./$(DEPDIR)/kinit.Po + -rm -f ./$(DEPDIR)/klist.Po + -rm -f ./$(DEPDIR)/kswitch.Po + -rm -f ./$(DEPDIR)/kverify.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -953,7 +1138,8 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libexecPROGRAMS +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libexecPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-exec-hook install-html: install-html-am @@ -977,7 +1163,20 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/copy_cred_cache.Po + -rm -f ./$(DEPDIR)/generate-requests.Po + -rm -f ./$(DEPDIR)/heimtools-commands.Po + -rm -f ./$(DEPDIR)/heimtools.Po + -rm -f ./$(DEPDIR)/kdecode_ticket.Po + -rm -f ./$(DEPDIR)/kdestroy.Po + -rm -f ./$(DEPDIR)/kdigest-commands.Po + -rm -f ./$(DEPDIR)/kdigest.Po + -rm -f ./$(DEPDIR)/kgetcred.Po + -rm -f ./$(DEPDIR)/kimpersonate.Po + -rm -f ./$(DEPDIR)/kinit.Po + -rm -f ./$(DEPDIR)/klist.Po + -rm -f ./$(DEPDIR)/kswitch.Po + -rm -f ./$(DEPDIR)/kverify.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1003,39 +1202,55 @@ .MAKE: check-am install-am install-data-am install-exec-am \ install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libexecPROGRAMS \ - clean-libtool clean-noinstPROGRAMS ctags dist-hook distclean \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-binPROGRAMS clean-generic \ + clean-libexecPROGRAMS clean-libtool clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ - install-html-am install-info install-info-am \ - install-libexecPROGRAMS install-man install-man1 install-man8 \ - 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-hook uninstall-libexecPROGRAMS \ - uninstall-man uninstall-man1 uninstall-man8 + install-exec install-exec-am install-exec-hook \ + install-exec-local install-html install-html-am install-info \ + install-info-am install-libexecPROGRAMS install-man \ + install-man1 install-man8 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 tags-am uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-hook uninstall-libexecPROGRAMS uninstall-man \ + uninstall-man1 uninstall-man8 + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1043,7 +1258,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1088,11 +1303,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1100,6 +1324,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1142,6 +1368,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1155,13 +1394,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1192,20 +1431,20 @@ fi ; \ done -$(kcc_OBJECTS): kcc-commands.h +$(heimtools_OBJECTS): heimtools-commands.h $(kdigest_OBJECTS): kdigest-commands.h kdigest-commands.c kdigest-commands.h: kdigest-commands.in $(SLC) $(srcdir)/kdigest-commands.in -kcc-commands.c kcc-commands.h: kcc-commands.in - $(SLC) $(srcdir)/kcc-commands.in +heimtools-commands.c heimtools-commands.h: heimtools-commands.in + $(SLC) $(srcdir)/heimtools-commands.in # make sure install-exec-hook doesn't have any commands in Makefile.am.common install-exec-hook: - (cd $(DESTDIR)$(bindir) && rm -f klist && $(LN_S) kcc klist) - (cd $(DESTDIR)$(bindir) && rm -f kswitch && $(LN_S) kcc kswitch) + (cd $(DESTDIR)$(bindir) && rm -f klist && $(LN_S) heimtools klist) + (cd $(DESTDIR)$(bindir) && rm -f kswitch && $(LN_S) heimtools kswitch) # 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. diff --git a/crypto/heimdal/kuser/NTMakefile b/crypto/heimdal/kuser/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/NTMakefile @@ -0,0 +1,135 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=kuser + +intcflags=-I$(OBJ) + +!include ../windows/NTMakefile.w32 + +BINPROGRAMS=\ + $(BINDIR)\kinit.exe \ + $(BINDIR)\heimtools.exe \ + $(BINDIR)\kdestroy.exe \ + $(BINDIR)\kgetcred.exe \ + $(BINDIR)\kvno.exe \ + $(BINDIR)\kcpytkt.exe \ + $(BINDIR)\kdeltkt.exe + +LIBEXECPROGRAMS=\ + $(LIBEXECDIR)\kdigest.exe \ + $(LIBEXECDIR)\kimpersonate.exe + +NOINSTPROGRAMS=\ + $(OBJ)\kverify.exe \ + $(OBJ)\kdecode_ticket.exe \ + $(OBJ)\generate-requests.exe + + +BINLIBS=\ + $(LIBHEIMDAL) \ + $(LIBHEIMNTLM) \ +!if !defined(NO_AFS) + $(LIBKAFS) \ +!endif + $(LIBROKEN) \ + $(LIBVERS) + +all:: $(BINPROGRAMS) $(LIBEXECPROGRAMS) + +clean:: + -$(RM) $(BINPROGRAMS:.exe=.*) $(LIBEXECPROGRAMS:.exe=.*) + + +$(BINDIR)\kinit.exe: $(OBJ)\kinit.obj $(BINLIBS) $(OBJ)\kinit-version.res + $(EXECONLINK) + $(EXEPREP) + +HEIMTOOLS_OBJS = \ + $(OBJ)\heimtools-commands.obj \ + $(OBJ)\heimtools.obj \ + $(OBJ)\kswitch.obj \ + $(OBJ)\klist.obj \ + $(OBJ)\copy_cred_cache.obj + +HEIMTOOLSLIBS=\ + $(BINLIBS) \ + $(LIBSL) + +$(BINDIR)\heimtools.exe: $(HEIMTOOLS_OBJS) $(HEIMTOOLSLIBS) $(OBJ)\heimtools-version.res + $(EXECONLINK) + $(EXEPREP) + + +$(BINDIR)\kdestroy.exe: $(OBJ)\kdestroy.obj $(BINLIBS) $(OBJ)\kdestroy-version.res + $(EXECONLINK) + $(EXEPREP) + + +$(BINDIR)\kgetcred.exe: $(OBJ)\kgetcred.obj $(BINLIBS) $(OBJ)\kgetcred-version.res + $(EXECONLINK) + $(EXEPREP) + + +$(LIBEXECDIR)\kdigest.exe: $(OBJ)\kdigest-commands.obj $(OBJ)\kdigest.obj $(BINLIBS) $(LIBSL) $(OBJ)\kdigest-version.res + $(EXECONLINK) + $(EXEPREP) + +$(OBJ)\kdigest.obj: kdigest.c + $(C2OBJ) -I$(OBJ) + +$(OBJ)\kdigest-commands.c $(OBJ)\kdigest-commands.h: kdigest-commands.in + cd $(OBJ) + $(CP) $(SRCDIR)\kdigest-commands.in $(OBJ) + $(BINDIR)\slc.exe kdigest-commands.in + cd $(SRCDIR) + +$(OBJ)\heimtools-commands.c $(OBJ)\heimtools-commands.h: heimtools-commands.in + cd $(OBJ) + $(CP) $(SRCDIR)\heimtools-commands.in $(OBJ) + $(BINDIR)\slc.exe heimtools-commands.in + cd $(SRCDIR) + +$(LIBEXECDIR)\kimpersonate.exe: $(OBJ)\kimpersonate.obj $(BINLIBS) $(OBJ)\kimpersonate-version.res + $(EXECONLINK) + $(EXEPREP) + +$(BINDIR)\kvno.exe: $(OBJ)\kvno.obj $(BINLIBS) + $(EXECONLINK) + $(EXEPREP) + +$(BINDIR)\kcpytkt.exe: $(OBJ)\kcpytkt.obj $(BINLIBS) + $(EXECONLINK) + $(EXEPREP) + +$(BINDIR)\kdeltkt.exe: $(OBJ)\kdeltkt.obj $(BINLIBS) + $(EXECONLINK) + $(EXEPREP) diff --git a/crypto/heimdal/kuser/copy_cred_cache.c b/crypto/heimdal/kuser/copy_cred_cache.c --- a/crypto/heimdal/kuser/copy_cred_cache.c +++ b/crypto/heimdal/kuser/copy_cred_cache.c @@ -35,7 +35,7 @@ #include #include #include -#include "kcc-commands.h" +#include "heimtools-commands.h" static int32_t bitswap32(int32_t b) @@ -92,72 +92,73 @@ memset(&ctx, 0, sizeof(ctx)); if (opt->service_string) { - ret = krb5_parse_name(kcc_context, opt->service_string, &ctx.mcreds.server); + ret = krb5_parse_name(heimtools_context, opt->service_string, &ctx.mcreds.server); if (ret) - krb5_err(kcc_context, 1, ret, "%s", opt->service_string); + krb5_err(heimtools_context, 1, ret, "%s", opt->service_string); } if (opt->enctype_string) { krb5_enctype enctype; - ret = krb5_string_to_enctype(kcc_context, opt->enctype_string, &enctype); + ret = krb5_string_to_enctype(heimtools_context, opt->enctype_string, &enctype); if (ret) - krb5_err(kcc_context, 1, ret, "%s", opt->enctype_string); + krb5_err(heimtools_context, 1, ret, "%s", opt->enctype_string); ctx.whichfields |= KRB5_TC_MATCH_KEYTYPE; ctx.mcreds.session.keytype = enctype; } if (opt->flags_string) { - parse_ticket_flags(kcc_context, opt->flags_string, &ctx.mcreds.flags); + parse_ticket_flags(heimtools_context, opt->flags_string, &ctx.mcreds.flags); ctx.whichfields |= KRB5_TC_MATCH_FLAGS; } if (opt->valid_for_string) { time_t t = parse_time(opt->valid_for_string, "s"); if(t < 0) errx(1, "unknown time \"%s\"", opt->valid_for_string); - ctx.mcreds.times.endtime = time(NULL) + t; + krb5_timeofday(heimtools_context, &ctx.mcreds.times.endtime); + ctx.mcreds.times.endtime += t; ctx.whichfields |= KRB5_TC_MATCH_TIMES; } if (opt->fcache_version_integer) - krb5_set_fcache_version(kcc_context, opt->fcache_version_integer); + krb5_set_fcache_version(heimtools_context, opt->fcache_version_integer); if (argc == 1) { - from_name = krb5_cc_default_name(kcc_context); + from_name = krb5_cc_default_name(heimtools_context); to_name = argv[0]; } else { from_name = argv[0]; to_name = argv[1]; } - ret = krb5_cc_resolve(kcc_context, from_name, &from_ccache); + ret = krb5_cc_resolve(heimtools_context, from_name, &from_ccache); if (ret) - krb5_err(kcc_context, 1, ret, "%s", from_name); + krb5_err(heimtools_context, 1, ret, "%s", from_name); if (opt->krbtgt_only_flag) { krb5_principal client; - ret = krb5_cc_get_principal(kcc_context, from_ccache, &client); + ret = krb5_cc_get_principal(heimtools_context, from_ccache, &client); if (ret) - krb5_err(kcc_context, 1, ret, "getting default principal"); - ret = krb5_make_principal(kcc_context, &ctx.mcreds.server, - krb5_principal_get_realm(kcc_context, client), + krb5_err(heimtools_context, 1, ret, "getting default principal"); + ret = krb5_make_principal(heimtools_context, &ctx.mcreds.server, + krb5_principal_get_realm(heimtools_context, client), KRB5_TGS_NAME, - krb5_principal_get_realm(kcc_context, client), + krb5_principal_get_realm(heimtools_context, client), NULL); if (ret) - krb5_err(kcc_context, 1, ret, "constructing krbtgt principal"); - krb5_free_principal(kcc_context, client); + krb5_err(heimtools_context, 1, ret, "constructing krbtgt principal"); + krb5_free_principal(heimtools_context, client); } - ret = krb5_cc_resolve(kcc_context, to_name, &to_ccache); + ret = krb5_cc_resolve(heimtools_context, to_name, &to_ccache); if (ret) - krb5_err(kcc_context, 1, ret, "%s", to_name); + krb5_err(heimtools_context, 1, ret, "%s", to_name); - ret = krb5_cc_copy_match_f(kcc_context, from_ccache, to_ccache, + ret = krb5_cc_copy_match_f(heimtools_context, from_ccache, to_ccache, matchfunc, &ctx, &matched); if (ret) - krb5_err(kcc_context, 1, ret, "copying cred cache"); + krb5_err(heimtools_context, 1, ret, "copying cred cache"); - krb5_cc_close(kcc_context, from_ccache); + krb5_cc_close(heimtools_context, from_ccache); if(matched == 0) - krb5_cc_destroy(kcc_context, to_ccache); + krb5_cc_destroy(heimtools_context, to_ccache); else - krb5_cc_close(kcc_context, to_ccache); + krb5_cc_close(heimtools_context, to_ccache); return matched == 0; } diff --git a/crypto/heimdal/kuser/generate-requests.c b/crypto/heimdal/kuser/generate-requests.c --- a/crypto/heimdal/kuser/generate-requests.c +++ b/crypto/heimdal/kuser/generate-requests.c @@ -92,14 +92,15 @@ krb5_free_cred_contents (context, &cred); krb5_free_principal(context, client); } + free(words); } static int version_flag = 0; static int help_flag = 0; static struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; static void diff --git a/crypto/heimdal/kuser/heimtools-commands.in b/crypto/heimdal/kuser/heimtools-commands.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/heimtools-commands.in @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +command = { + name = "klist" + name = "list" + help = "List kerberos tickets" + option = { + long = "cache" + short = "c" + type = "string" + help = "credential cache to list" + } + option = { + name = "flags" + short = "f" + type = "flag" + help = "list flags" + } + option = { + long = "test" + short = "t" + type = "flag" + help = "test for having tickets" + } + option = { + name = "s" + short = "s" + type = "flag" + } + option = { + long = "tokens" + short = "T" + type = "flag" + help = "display AFS tokens" + } + option = { + long = "v5" + short = "5" + type = "flag" + default = "1" + help = "display v5 credential tokens" + } + option = { + long = "all-content" + short = "A" + type = "flag" + help = "List all caches with their content" + } + option = { + long = "list-all" + short = "l" + type = "flag" + help = "List all caches" + } + option = { + long = "json" + type = "flag" + help = "JSON formated output" + } + option = { + long = "verbose" + short = "v" + type = "flag" + help = "Verbose output" + } + option = { + long = "version" + type = "flag" + help = "version" + } + option = { + name = "a" + short = "a" + type = "flag" + } + option = { + name = "n" + short = "n" + type = "flag" + } + option = { + long = "hidden" + type = "flag" + help = "Verbose output" + } +} +command = { + name = "kgetcred" + help = "Acquire a Kerberos ticket" + option = { + long = "enctype" + short = "e" + type = "string" + argument = "enctype" + help = "Encryption type to use" + } + option = { + long = "cache" + short = "c" + type = "string" + argument = "cachename" + help = "Credentials cache" + } +} +command = { + name = "kswitch" + name = "switch" + help = "Switch default kerberos cache" + option = { + long = "type" + short = "t" + type = "string" + help = "type of credential cache" + } + option = { + long = "cache" + short = "c" + type = "string" + help = "name of credential cache" + } + option = { + long = "principal" + short = "p" + type = "string" + help = "name of principal" + } + option = { + long = "interactive" + short = "i" + type = "flag" + help = "interactive selection" + } +}; +command = { + name = "kvno" + help = "Acquire a Kerberos ticket" + option = { + long = "enctype" + short = "e" + type = "string" + argument = "enctype" + help = "Encryption type to use" + } + option = { + long = "cache" + short = "c" + type = "string" + argument = "cachename" + help = "Credentials cache" + } + option = { + long = "keytab" + short = "k" + type = "string" + argument = "keytabname" + help = "Keytab to use" + } + option = { + long = "server" + short = "S" + type = "string" + argument = "principal" + help = "Server to get ticket for" + } + option = { + long = "quiet" + short = "q" + type = "flag" + help = "Quiet" + } +} +command = { + name = "copy_cred_cache" + option = { + long = "krbtgt-only" + type = "flag" + help = "only copy local krbtgt" + } + option = { + long = "service" + type = "string" + help = "limit to this service" + argument = "service" + } + option = { + long = "enctype" + type = "string" + help = "limit to this enctype" + argument = "enctype" + } + option = { + long = "flags" + type = "string" + help = "limit to these flags" + } + option = { + long = "valid-for" + type = "string" + help = "limit to creds valid for at least this long" + argument = "time" + } + option = { + long = "fcache-version" + type = "integer" + help = "file cache version to create" + } + min_args = "1" + max_args = "2" + help = "Copies credential caches" +} +command = { + name = "help" + name = "?" + argument = "[command]" + min_args = "0" + max_args = "1" + help = "Help! I need somebody." +} diff --git a/crypto/heimdal/kuser/heimtools-version.rc b/crypto/heimdal/kuser/heimtools-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/heimtools-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Ticket tool" +#define RC_FILE_ORIG_0409 "heimtools.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kuser/heimtools.c b/crypto/heimdal/kuser/heimtools.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/heimtools.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "kuser_locl.h" +#include +#include "heimtools-commands.h" + +krb5_context heimtools_context; +static int version_flag; +static int help_flag; + +static struct getargs args[] = { + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } +}; + +static void +usage(int ret) +{ + arg_printusage_i18n(args, + sizeof(args)/sizeof(*args), + N_("Usage: ", ""), + NULL, + "command ..", + getarg_i18n); + exit (ret); +} + +int +help(void *opt, int argc, char **argv) +{ + sl_slc_help(commands, argc, argv); + return 0; +} + +int +kgetcred(struct kgetcred_options *opt, int argc, char **argv) +{ + return 0; +} + +/* + * Wrapper for command line compatiblity + */ + +int +kvno(struct kvno_options *opt, int argc, char **argv) +{ + struct kgetcred_options k; + memset(&k, 0, sizeof(k)); + + k.cache_string = opt->cache_string; + k.enctype_string = opt->enctype_string; + + return kgetcred(&k, argc, argv); +} + +static int +command_alias(const char *name) +{ + const char *aliases[] = { + "kinit", "klist", "kswitch", "kgetcred", "kvno", "kdeltkt", + "kdestroy", "kcpytkt", NULL + }, **p = aliases; + + while (*p && strcmp(name, *p) != 0) + p++; + return *p != NULL; +} + + +int +main(int argc, char **argv) +{ + krb5_error_code ret; + int optidx = 0; + int exit_status = 0; + + setprogname (argv[0]); + + setlocale (LC_ALL, ""); + bindtextdomain ("heimdal_kuser", HEIMDAL_LOCALEDIR); + textdomain("heimdal_kuser"); + + ret = krb5_init_context(&heimtools_context); + if (ret == KRB5_CONFIG_BADFORMAT) + errx (1, "krb5_init_context failed to parse configuration file"); + else if (ret) + errx(1, "krb5_init_context failed: %d", ret); + + /* + * Support linking of heimtools to commands + */ + + if (!command_alias(getprogname())) { + + if (argc == 1) { + sl_slc_help(commands, 0, NULL); + return 1; + } + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if(version_flag) { + print_version(NULL); + exit(0); + } + + } else { + argv[0] = rk_UNCONST(getprogname()); + } + + argc -= optidx; + argv += optidx; + + if (argc != 0) { + ret = sl_command(commands, argc, argv); + if(ret == -1) + sl_did_you_mean(commands, argv[0]); + else if (ret == -2) + ret = 0; + if(ret != 0) + exit_status = 1; + } else { + sl_slc_help(commands, argc, argv); + exit_status = 1; + } + + krb5_free_context(heimtools_context); + return exit_status; +} diff --git a/crypto/heimdal/kuser/kcc-commands.in b/crypto/heimdal/kuser/kcc-commands.in deleted file mode 100644 --- a/crypto/heimdal/kuser/kcc-commands.in +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -command = { - name = "klist" - name = "list" - help = "List kerberos tickets" - option = { - long = "cache" - short = "c" - type = "string" - help = "credential cache to list" - } - option = { - name = "flags" - short = "f" - type = "flag" - help = "list flags" - } - option = { - long = "test" - short = "t" - type = "flag" - help = "test for having tickets" - } - option = { - name = "s" - short = "s" - type = "flag" - } - option = { - long = "tokens" - short = "T" - type = "flag" - help = "display AFS tokens" - } - option = { - long = "v5" - short = "5" - type = "flag" - default = "1" - help = "display v5 credential tokens" - } - option = { - long = "all-content" - short = "A" - type = "flag" - help = "List all caches with their content" - } - option = { - long = "list-all" - short = "l" - type = "flag" - help = "List all caches" - } - option = { - long = "verbose" - short = "v" - type = "flag" - help = "Verbose output" - } - option = { - name = "a" - short = "a" - type = "flag" - } - option = { - name = "n" - short = "n" - type = "flag" - } - option = { - long = "hidden" - type = "flag" - help = "Verbose output" - } -} -command = { - name = "kgetcred" - help = "Acquire a Kerberos ticket" - option = { - long = "enctype" - short = "e" - type = "string" - argument = "enctype" - help = "Encryption type to use" - } - option = { - long = "cache" - short = "c" - type = "string" - argument = "cachename" - help = "Credentials cache" - } -} -command = { - name = "kswitch" - name = "switch" - help = "Switch default kerberos cache" - option = { - long = "type" - short = "t" - type = "string" - help = "type of credential cache" - } - option = { - long = "cache" - short = "c" - type = "string" - help = "name of credential cache" - } - option = { - long = "principal" - short = "p" - type = "string" - help = "name of principal" - } - option = { - long = "interactive" - short = "i" - type = "flag" - help = "interactive selection" - } -}; -command = { - name = "kvno" - help = "Acquire a Kerberos ticket" - option = { - long = "enctype" - short = "e" - type = "string" - argument = "enctype" - help = "Encryption type to use" - } - option = { - long = "cache" - short = "c" - type = "string" - argument = "cachename" - help = "Credentials cache" - } - option = { - long = "keytab" - short = "k" - type = "string" - argument = "keytabname" - help = "Keytab to use" - } - option = { - long = "server" - short = "S" - type = "string" - argument = "principal" - help = "Server to get ticket for" - } - option = { - long = "quiet" - short = "q" - type = "flag" - help = "Quiet" - } -} -command = { - name = "copy_cred_cache" - option = { - long = "krbtgt-only" - type = "flag" - help = "only copy local krbtgt" - } - option = { - long = "service" - type = "string" - help = "limit to this service" - argument = "service" - } - option = { - long = "enctype" - type = "string" - help = "limit to this enctype" - argument = "enctype" - } - option = { - long = "flags" - type = "string" - help = "limit to these flags" - } - option = { - long = "valid-for" - type = "string" - help = "limit to creds valid for at least this long" - argument = "time" - } - option = { - long = "fcache-version" - type = "integer" - help = "file cache version to create" - } - min_args = "1" - max_args = "2" - help = "Copies credential caches" -} -command = { - name = "help" - name = "?" - argument = "[command]" - min_args = "0" - max_args = "1" - help = "Help! I need somebody." -} diff --git a/crypto/heimdal/kuser/kcc.c b/crypto/heimdal/kuser/kcc.c deleted file mode 100644 --- a/crypto/heimdal/kuser/kcc.c +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (c) 2010 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "kuser_locl.h" -#include -#include "kcc-commands.h" - -krb5_context kcc_context; -static int version_flag; -static int help_flag; - -static struct getargs args[] = { - { "version", 0, arg_flag, &version_flag, NULL, NULL }, - { "help", 0, arg_flag, &help_flag, NULL, NULL } -}; - -static void -usage(int ret) -{ - arg_printusage_i18n(args, - sizeof(args)/sizeof(*args), - N_("Usage: ", ""), - NULL, - "command ..", - getarg_i18n); - exit (ret); -} - -int -help(void *opt, int argc, char **argv) -{ - sl_slc_help(commands, argc, argv); - return 0; -} - -int -kgetcred(struct kgetcred_options *opt, int argc, char **argv) -{ - return 0; -} - -/* - * Wrapper for command line compatiblity - */ - -int -kvno(struct kvno_options *opt, int argc, char **argv) -{ - struct kgetcred_options k; - memset(&k, 0, sizeof(k)); - - k.cache_string = opt->cache_string; - k.enctype_string = opt->enctype_string; - - return kgetcred(&k, argc, argv); -} - -static int -command_alias(const char *name) -{ - const char *aliases[] = { - "kinit", "klist", "kswitch", "kgetcred", "kvno", "kdeltkt", - "kdestroy", "kcpytkt", NULL - }, **p = aliases; - - while (*p && strcmp(name, *p) != 0) - p++; - return *p != NULL; -} - - -int -main(int argc, char **argv) -{ - krb5_error_code ret; - int optidx = 0; - int exit_status = 0; - - setprogname (argv[0]); - - setlocale (LC_ALL, ""); - bindtextdomain ("heimdal_kuser", HEIMDAL_LOCALEDIR); - textdomain("heimdal_kuser"); - - ret = krb5_init_context(&kcc_context); - if (ret == KRB5_CONFIG_BADFORMAT) - errx (1, "krb5_init_context failed to parse configuration file"); - else if (ret) - errx(1, "krb5_init_context failed: %d", ret); - - /* - * Support linking of kcc to commands - */ - - if (!command_alias(getprogname())) { - - if (argc == 1) { - sl_slc_help(commands, 0, NULL); - return 1; - } - - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) - usage(1); - - if (help_flag) - usage (0); - - if(version_flag) { - print_version(NULL); - exit(0); - } - - } else { - argv[0] = rk_UNCONST(getprogname()); - } - - argc -= optidx; - argv += optidx; - - if (argc != 0) { - ret = sl_command(commands, argc, argv); - if(ret == -1) - krb5_warnx(kcc_context, "unrecognized command: %s", argv[0]); - else if (ret == -2) - ret = 0; - if(ret != 0) - exit_status = 1; - } else { - sl_slc_help(commands, argc, argv); - exit_status = 1; - } - - krb5_free_context(kcc_context); - return exit_status; -} diff --git a/crypto/heimdal/kuser/kcpytkt.c b/crypto/heimdal/kuser/kcpytkt.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kcpytkt.c @@ -0,0 +1,178 @@ + +#include "kuser_locl.h" + +static char *etypestr = 0; +static char *fromccachestr = 0; +static char *flagstr = 0; +static int exp_ok = 0; +static int quiet_flag = 0; +static int version_flag = 0; +static int help_flag = 0; + +struct getargs args[] = { + { "cache", 'c', arg_string, &fromccachestr, + "Credentials cache", "cachename" }, + { "enctype", 'e', arg_string, &etypestr, + "Encryption type", "enctype" }, + { "flags", 'f', arg_string, &flagstr, + "Flags", "flags" }, + { "expired-ok", 'E', arg_flag, &exp_ok, + "Keep expired tickets" }, + { "quiet", 'q', arg_flag, &quiet_flag, "Quiet" }, + { "version", 0, arg_flag, &version_flag }, + { "help", 0, arg_flag, &help_flag } +}; + +static void +usage(int ret) +{ + arg_printusage(args, sizeof(args)/sizeof(args[0]), + "Usage: ", "dest_ccache service1 [service2 ...]"); + exit (ret); +} + +static void do_kcpytkt (int argc, char *argv[], char *fromccachestr, char *etypestr, int flags); + +int main(int argc, char *argv[]) +{ + int optidx; + int flags = 0; + + setprogname(argv[0]); + + if (getarg(args, sizeof(args)/sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage(0); + + if (version_flag) { + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + if (argc < 2) + usage(1); + + if (flagstr) + flags = atoi(flagstr); + + do_kcpytkt(argc, argv, fromccachestr, etypestr, flags); + + return 0; +} + +static void do_kcpytkt (int count, char *names[], + char *fromccachestr, char *etypestr, int flags) +{ + krb5_context context; + krb5_error_code ret; + int i, errors; + krb5_enctype etype; + krb5_ccache fromccache; + krb5_ccache destccache; + krb5_principal me; + krb5_creds in_creds, out_creds; + int retflags; + char *princ; + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_context failed: %d", ret); + + if (etypestr) { + ret = krb5_string_to_enctype(context, etypestr, &etype); + if (ret) + krb5_err(context, 1, ret, "Can't convert enctype %s", etypestr); + retflags = KRB5_TC_MATCH_SRV_NAMEONLY | KRB5_TC_MATCH_KEYTYPE; + } else { + etype = 0; + retflags = KRB5_TC_MATCH_SRV_NAMEONLY; + } + + if (fromccachestr) + ret = krb5_cc_resolve(context, fromccachestr, &fromccache); + else + ret = krb5_cc_default(context, &fromccache); + if (ret) + krb5_err(context, 1, ret, "Can't resolve credentials cache"); + + ret = krb5_cc_get_principal(context, fromccache, &me); + if (ret) + krb5_err(context, 1, ret, "Can't query client principal name"); + + ret = krb5_cc_resolve(context, names[0], &destccache); + if (ret) + krb5_err(context, 1, ret, "Can't resolve destination cache"); + + errors = 0; + + for (i = 1; i < count; i++) { + memset(&in_creds, 0, sizeof(in_creds)); + + in_creds.client = me; + + ret = krb5_parse_name(context, names[i], &in_creds.server); + if (ret) { + if (!quiet_flag) + krb5_warn(context, ret, "Parse error for %s", names[i]); + errors++; + continue; + } + + ret = krb5_unparse_name(context, in_creds.server, &princ); + if (ret) { + krb5_warn(context, ret, "Unparse error for %s", names[i]); + errors++; + continue; + } + + in_creds.session.keytype = etype; + + if (!exp_ok) { + krb5_timeofday(context, &in_creds.times.endtime); + retflags |= KRB5_TC_MATCH_TIMES; + } + + ret = krb5_cc_retrieve_cred(context, fromccache, retflags, + &in_creds, &out_creds); + if (ret) { + krb5_warn(context, ret, "Can't retrieve credentials for %s", princ); + + krb5_free_unparsed_name(context, princ); + + errors++; + continue; + } + + ret = krb5_cc_store_cred(context, destccache, &out_creds); + + krb5_free_principal(context, in_creds.server); + + if (ret) { + krb5_warn(context, ret, "Can't store credentials for %s", princ); + + krb5_free_cred_contents(context, &out_creds); + krb5_free_unparsed_name(context, princ); + + errors++; + continue; + } + + krb5_free_unparsed_name(context, princ); + krb5_free_cred_contents(context, &out_creds); + } + + krb5_free_principal(context, me); + krb5_cc_close(context, fromccache); + krb5_cc_close(context, destccache); + krb5_free_context(context); + + if (errors) + exit(1); + + exit(0); +} diff --git a/crypto/heimdal/kuser/kdecode_ticket.c b/crypto/heimdal/kuser/kdecode_ticket.c --- a/crypto/heimdal/kuser/kdecode_ticket.c +++ b/crypto/heimdal/kuser/kdecode_ticket.c @@ -79,8 +79,8 @@ struct getargs args[] = { { "enctype", 'e', arg_string, &etype_str, "encryption type to use", "enctype"}, - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; static void diff --git a/crypto/heimdal/kuser/kdeltkt.c b/crypto/heimdal/kuser/kdeltkt.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kdeltkt.c @@ -0,0 +1,172 @@ + +#include "kuser_locl.h" + +static char *etypestr = 0; +static char *ccachestr = 0; +static char *flagstr = 0; +static int exp_only = 0; +static int quiet_flag = 0; +static int help_flag = 0; +static int version_flag = 0; + +struct getargs args[] = { + { "cache", 'c', arg_string, &ccachestr, + "Credentials cache", "cachename" }, + { "enctype", 'e', arg_string, &etypestr, + "Encryption type", "enctype" }, + { "flags", 'f', arg_string, &flagstr, + "Flags", "flags" }, + { "expired-only", 'E', arg_flag, &exp_only, + "Delete only expired tickets" }, + { "quiet", 'q', arg_flag, &quiet_flag, "Quiet" }, + { "version", 0, arg_flag, &version_flag }, + { "help", 0, arg_flag, &help_flag } +}; + +static void +usage(int ret) +{ + arg_printusage(args, sizeof(args)/sizeof(args[0]), + "Usage: ", "service1 [service2 ...]"); + exit(ret); +} + +static void do_kdeltkt (int argc, char *argv[], char *ccachestr, char *etypestr, int flags); + +int main(int argc, char *argv[]) +{ + int optidx = 0; + int flags = 0; + + setprogname(argv[0]); + + if (getarg(args, sizeof(args)/sizeof(args[0]), argc, argv, &optidx)) + usage (1); + + if (help_flag) + usage(0); + + if (version_flag) { + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + if (argc < 1) + usage (1); + + if (flagstr) + flags = atoi(flagstr); + + do_kdeltkt(argc, argv, ccachestr, etypestr, flags); + + return 0; +} + +static void do_kdeltkt (int count, char *names[], + char *ccachestr, char *etypestr, int flags) +{ + krb5_context context; + krb5_error_code ret; + int i, errors; + krb5_enctype etype; + krb5_ccache ccache; + krb5_principal me; + krb5_creds in_creds, out_creds; + int retflags; + char *princ; + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_context failed: %d", ret); + + if (etypestr) { + ret = krb5_string_to_enctype(context, etypestr, &etype); + if (ret) + krb5_err(context, 1, ret, "Can't convert enctype %s", etypestr); + retflags = KRB5_TC_MATCH_SRV_NAMEONLY | KRB5_TC_MATCH_KEYTYPE; + } else { + etype = 0; + retflags = KRB5_TC_MATCH_SRV_NAMEONLY; + } + + if (ccachestr) + ret = krb5_cc_resolve(context, ccachestr, &ccache); + else + ret = krb5_cc_default(context, &ccache); + if (ret) + krb5_err(context, 1, ret, "Can't open credentials cache"); + + ret = krb5_cc_get_principal(context, ccache, &me); + if (ret) + krb5_err(context, 1, ret, "Can't get client principal"); + + errors = 0; + + for (i = 0; i < count; i++) { + memset(&in_creds, 0, sizeof(in_creds)); + + in_creds.client = me; + + ret = krb5_parse_name(context, names[i], &in_creds.server); + if (ret) { + if (!quiet_flag) + krb5_warn(context, ret, "Can't parse principal name %s", names[i]); + errors++; + continue; + } + + ret = krb5_unparse_name(context, in_creds.server, &princ); + if (ret) { + krb5_warn(context, ret, "Can't unparse principal name %s", names[i]); + errors++; + continue; + } + + in_creds.session.keytype = etype; + + if (exp_only) { + krb5_timeofday(context, &in_creds.times.endtime); + retflags |= KRB5_TC_MATCH_TIMES; + } + + ret = krb5_cc_retrieve_cred(context, ccache, retflags, + &in_creds, &out_creds); + if (ret) { + krb5_warn(context, ret, "Can't retrieve credentials for %s", princ); + + krb5_free_unparsed_name(context, princ); + + errors++; + continue; + } + + ret = krb5_cc_remove_cred(context, ccache, flags, &out_creds); + + krb5_free_principal(context, in_creds.server); + + if (ret) { + krb5_warn(context, ret, "Can't remove credentials for %s", princ); + + krb5_free_cred_contents(context, &out_creds); + krb5_free_unparsed_name(context, princ); + + errors++; + continue; + } + + krb5_free_unparsed_name(context, princ); + krb5_free_cred_contents(context, &out_creds); + } + + krb5_free_principal(context, me); + krb5_cc_close(context, ccache); + krb5_free_context(context); + + if (errors) + exit(1); + + exit(0); +} diff --git a/crypto/heimdal/kuser/kdestroy-version.rc b/crypto/heimdal/kuser/kdestroy-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kdestroy-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Destroy Kerberos Tickets" +#define RC_FILE_ORIG_0409 "kdestroy.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kuser/kdestroy.cat1 b/crypto/heimdal/kuser/kdestroy.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kdestroy.cat1 @@ -0,0 +1,36 @@ +KDESTROY(1) BSD General Commands Manual KDESTROY(1) + +NAME + kdestroy -- remove one credential or destroy the current ticket file + +SYNOPSIS + kdestroy [-c cachefile] [--credential=principal] [--cache=cachefile] + [-A | --all] [--no-unlog] [--no-delete-v4] [--version] [--help] + +DESCRIPTION + kdestroy removes one credential or the current set of tickets. + + Supported options: + + -credential=principal + remove principal from the credential cache if it exists. + + -c cachefile + + -cache=cachefile + The cache file to remove. + + -A + + --all remove all credential caches. + + --no-unlog + Do not remove AFS tokens. + + --no-delete-v4 + Do not remove v4 tickets. + +SEE ALSO + kinit(1), klist(1) + +HEIMDAL April 27, 2006 HEIMDAL diff --git a/crypto/heimdal/kuser/kdigest-version.rc b/crypto/heimdal/kuser/kdigest-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kdigest-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "KDC Digest Interface Tool" +#define RC_FILE_ORIG_0409 "kdigest.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kuser/kdigest.8 b/crypto/heimdal/kuser/kdigest.8 --- a/crypto/heimdal/kuser/kdigest.8 +++ b/crypto/heimdal/kuser/kdigest.8 @@ -245,6 +245,7 @@ .Xc Kerberos realm to communicate with .El +.El .\".Sh ENVIRONMENT .\".Sh FILES .\".Sh EXAMPLES diff --git a/crypto/heimdal/kuser/kdigest.c b/crypto/heimdal/kuser/kdigest.c --- a/crypto/heimdal/kuser/kdigest.c +++ b/crypto/heimdal/kuser/kdigest.c @@ -458,9 +458,9 @@ * */ - ret = krb5_ntlm_init_get_challange(context, ntlm, &challenge); + ret = krb5_ntlm_init_get_challenge(context, ntlm, &challenge); if (ret) - krb5_err(context, 1, ret, "krb5_ntlm_init_get_challange"); + krb5_err(context, 1, ret, "krb5_ntlm_init_get_challenge"); if (challenge.length != sizeof(type2.challenge)) krb5_errx(context, 1, "ntlm challenge have wrong length"); @@ -485,7 +485,7 @@ * */ - base64_encode(data.data, data.length, &s); + rk_base64_encode(data.data, data.length, &s); free(data.data); printf("type2=%s\n", s); free(s); @@ -498,7 +498,7 @@ if (ret) krb5_err(context, 1, ret, "krb5_ntlm_init_get_opaque"); - base64_encode(opaque.data, opaque.length, &s); + rk_base64_encode(opaque.data, opaque.length, &s); krb5_data_free(&opaque); printf("opaque=%s\n", s); free(s); diff --git a/crypto/heimdal/kuser/kdigest.cat8 b/crypto/heimdal/kuser/kdigest.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kdigest.cat8 @@ -0,0 +1,132 @@ +KDIGEST(8) BSD System Manager's Manual KDIGEST(8) + +NAME + kdigest -- userland tool to access digest interface in the KDC + +SYNOPSIS + kdigest [--ccache=string] [--version] [--help] command [arguments] + +DESCRIPTION + Supported options: + + --ccache=string + credential cache + + --version + print version + + --help + + Available commands are: + + digest-probe [--realm=string] [-h | --help] + + --realm=string + Kerberos realm to communicate with + + digest-server-init [--type=string] [--kerberos-realm=realm] + [--digest=digest-type] [--cb-type=type] [--cb-value=value] + [--hostname=hostname] [--realm=string] + + --type=string + digest type + + --kerberos-realm=realm + + --digest=digest-type + digest type to use in the algorithm + + --cb-type=type + type of channel bindings + + --cb-value=value + value of channel bindings + + --hostname=hostname + hostname of the server + + --realm=string + Kerberos realm to communicate with + + digest-server-request [--type=string] [--kerberos-realm=realm] + [--username=name] [--server-nonce=nonce] + [--server-identifier=nonce] [--client-nonce=nonce] + [--client-response=response] [--opaque=string] + [--authentication-name=name] [--realm=realm] [--method=method] + [--uri=uri] [--nounce-count=count] [--qop=qop] [--ccache=ccache] + + --type=string + digest type + + --kerberos-realm=realm + + --username=name + digest type + + --server-nonce=nonce + + --server-identifier=nonce + + --client-nonce=nonce + + --client-response=response + + --opaque=string + + --authentication-name=name + + --realm=realm + + --method=method + + --uri=uri + + --nounce-count=count + + --qop=qop + + --ccache=ccache + Where the the credential cache is created when the KDC + returns tickets + + digest-client-request [--type=string] [--username=name] + [--password=password] [--server-nonce=nonce] + [--server-identifier=nonce] [--client-nonce=nonce] + [--opaque=string] [--realm=realm] [--method=method] [--uri=uri] + [--nounce-count=count] [--qop=qop] + + --type=string + digest type + + --username=name + digest type + + --password=password + + --server-nonce=nonce + + --server-identifier=nonce + + --client-nonce=nonce + + --opaque=string + + --realm=realm + + --method=method + + --uri=uri + + --nounce-count=count + + --qop=qop + + ntlm-server-init [--version=integer] [--kerberos-realm=string] + + --version=integer + ntlm version + + --kerberos-realm=string + Kerberos realm to communicate with + +HEIMDAL September 25, 2008 HEIMDAL diff --git a/crypto/heimdal/kuser/kgetcred-version.rc b/crypto/heimdal/kuser/kgetcred-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kgetcred-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Get Kerberos Ticket For Service" +#define RC_FILE_ORIG_0409 "kgetcred.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kuser/kgetcred.1 b/crypto/heimdal/kuser/kgetcred.1 --- a/crypto/heimdal/kuser/kgetcred.1 +++ b/crypto/heimdal/kuser/kgetcred.1 @@ -40,6 +40,7 @@ .Sh SYNOPSIS .Nm .Op Fl Fl canonicalize +.Op Fl Fl canonical .Oo Fl c cache \*(Ba Xo .Fl Fl cache= Ns Ar cache .Xc @@ -48,30 +49,126 @@ .Fl Fl enctype= Ns Ar enctype .Xc .Oc +.Op Fl Fl debug +.Oo Fl H \*(Ba Xo +.Fl Fl hostbased +.Xc +.Oc +.Op Fl Fl name-type= Ns Ar name-type .Op Fl Fl no-transit-check +.Op Fl Fl no-store +.Op Fl Fl cached-only +.Op Fl n \*(Ba Fl Fl anonymous .Op Fl Fl version .Op Fl Fl help +.Ar principal +.Nm +.Op options +.Fl Fl hostbased +.Ar principal +.Nm +.Op options +.Fl Fl hostbased .Ar service +.Ar hostname +.Ar [extra-components] .Sh DESCRIPTION .Nm -obtains a ticket for a service. +obtains a ticket for the given service principal. Usually tickets for services are obtained automatically when needed but sometimes for some odd reason you want to obtain a particular ticket or of a special type. .Pp +If +.Fl Fl hostbased +is given then the given service principal name will be canonicalized +(see below). +.Pp +The third form constructs a host-based principal from the given service +name and hostname. The service name "host" is used if the given +.Ar service +name in the third usage is the empty string. +.Pp +For host-based names, the local host's hostname is used if the given +.Ar hostname +is the empty string or if the +.Ar principal +has a single component. +.Pp +Any additional components will be included, even for host-based service +principal names, but there are no defaults nor local canonicalization +rules for additional components. +.Pp +Local name canonicalization rules are applied unless the +.Fl Fl canonical +option is given. Currently local name canonicalization rules are +supported only for host-based principal names' hostname component. +.Pp +The principal's realm name may be canonicalized by following Kerberos +referrals from the client principal's home realm if the +.Fl Fl canonicalize +option is given or if the local name canonicalization rules are +configured to use referrals. +.Pp Supported options: .Bl -tag -width Ds .It Fl Fl canonicalize -requests that the KDC canonicalize the principal. +requests that the KDC canonicalize the principal. Currently this only +canonicalizes the realm by chasing referrals from the user's start +realm, but in the future this may also enable the KDC to canonicalize +the complete principal name. +.It Fl Fl canonical +turns off local canonicalization of the principal name. +.It Fl Fl name-type= Ns Ar name-type +the name-type to use when parsing the principal name. +.It Fl Fl hostbased +is short for +.Fl Fl name-type=srv_hst . .It Fl c Ar cache , Fl Fl cache= Ns Ar cache the credential cache to use. +.It Fl Fl delegation-credential-cache= Ns Ar cache +the credential cache to use for delegation. .It Fl e Ar enctype , Fl Fl enctype= Ns Ar enctype encryption type to use. .It Fl Fl no-transit-check requests that the KDC doesn't do transit checking. +.It Fl Fl no-store +do not store tickets in the ccache. +.It Fl Fl cached-only +do not talk the TGS, search only the ccache. +.It Fl Fl anonymous +obtain an anonymous service ticket. +.It Fl Fl forwardable +.It Fl Fl debug +enables debug output to stderr. .It Fl Fl version .It Fl Fl help .El +.Pp +If the +.Fl Fl canonical +option is used, then no further canonicalization should be done locally +by the client (for example, DNS), but if +.Fl Fl canonicalize +is used, then the client will ask that the KDC canonicalize the name. +.Pp +If the +.Fl Fl canonicalize +option is used with +.Fl Fl hostbased +a host-based name-type, and +.Fl Fl canonical +is not used, then the hostname will be canonicalized according to the +name canonicalization rules in +.Va krb5.conf . +.Pp +GSS-API initiator applications with host-based services will get the +same behavior as using the +.Fl Fl canonicalize +.Fl Fl hostbased +options here. .Sh SEE ALSO .Xr kinit 1 , -.Xr klist 1 +.Xr klist 1 , +.Xr krb5.conf 5 , +.Xr krb5_openlog 3 diff --git a/crypto/heimdal/kuser/kgetcred.c b/crypto/heimdal/kuser/kgetcred.c --- a/crypto/heimdal/kuser/kgetcred.c +++ b/crypto/heimdal/kuser/kgetcred.c @@ -40,8 +40,14 @@ static int transit_flag = 1; static int forwardable_flag; static int canonicalize_flag; +static int is_hostbased_flag; +static int is_canonical_flag; static char *impersonate_str; static char *nametype_str; +static int store_flag = 1; +static int cached_only_flag; +static int anonymous_flag; +static int debug_flag; static int version_flag; static int help_flag; @@ -53,26 +59,38 @@ { "delegation-credential-cache",0,arg_string, &delegation_cred_str, NP_("where to find the ticket use for delegation", ""), "cache"}, { "canonicalize", 0, arg_flag, &canonicalize_flag, - NP_("canonicalize the principal", ""), NULL }, - { "forwardable", 0, arg_flag, &forwardable_flag, + NP_("canonicalize the principal (chase referrals)", ""), NULL }, + { "canonical", 0, arg_flag, &is_canonical_flag, + NP_("the name components are canonical", ""), NULL }, + { "forwardable", 0, arg_flag, &forwardable_flag, NP_("forwardable ticket requested", ""), NULL}, { "transit-check", 0, arg_negative_flag, &transit_flag, NULL, NULL }, { "enctype", 'e', arg_string, &etype_str, NP_("encryption type to use", ""), "enctype"}, { "impersonate", 0, arg_string, &impersonate_str, NP_("client to impersonate", ""), "principal"}, - { "name-type", 0, arg_string, &nametype_str, NULL, NULL }, + { "name-type", 0, arg_string, &nametype_str, + NP_("Kerberos name type", ""), NULL }, + { "hostbased", 'H', arg_flag, &is_hostbased_flag, + NP_("indicate that the name is a host-based service name", ""), NULL }, + { "store", 0, arg_negative_flag, &store_flag, + NP_("don't store the tickets obtained in the cache", ""), NULL }, + { "cached-only", 0, arg_flag, &cached_only_flag, + NP_("don't talk to the KDC, just search the cache", ""), NULL }, + { "anonymous", 'n', arg_flag, &anonymous_flag, + NP_("request an anonymous ticket", ""), NULL }, + { "debug", 0, arg_flag, &debug_flag, NULL, NULL }, { "version", 0, arg_flag, &version_flag, NULL, NULL }, { "help", 0, arg_flag, &help_flag, NULL, NULL } }; static void -usage (int ret) +usage(int ret) { - arg_printusage (args, - sizeof(args)/sizeof(*args), - NULL, - "service"); + arg_printusage(args, + sizeof(args)/sizeof(*args), + NULL, + "service"); exit (ret); } @@ -84,23 +102,24 @@ krb5_ccache cache; krb5_creds *out; int optidx = 0; + int32_t nametype = KRB5_NT_UNKNOWN; krb5_get_creds_opt opt; - krb5_principal server; - krb5_principal impersonate = NULL; + krb5_principal server = NULL; + krb5_principal impersonate; - setprogname (argv[0]); + setprogname(argv[0]); - ret = krb5_init_context (&context); + ret = krb5_init_context(&context); if (ret) errx(1, "krb5_init_context failed: %d", ret); - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) usage (0); - if(version_flag) { + if (version_flag) { print_version(NULL); exit(0); } @@ -108,39 +127,43 @@ argc -= optidx; argv += optidx; - if (argc != 1) - usage (1); + if (debug_flag) { + ret = krb5_set_debug_dest(context, getprogname(), "STDERR"); + if (ret) + krb5_warn(context, ret, "krb5_set_debug_dest"); + } - if(cache_str) { + if (cache_str) { ret = krb5_cc_resolve(context, cache_str, &cache); if (ret) - krb5_err (context, 1, ret, "%s", cache_str); + krb5_err(context, 1, ret, "%s", cache_str); } else { ret = krb5_cc_default (context, &cache); if (ret) - krb5_err (context, 1, ret, "krb5_cc_resolve"); + krb5_err(context, 1, ret, "krb5_cc_resolve"); } ret = krb5_get_creds_opt_alloc(context, &opt); if (ret) - krb5_err (context, 1, ret, "krb5_get_creds_opt_alloc"); + krb5_err(context, 1, ret, "krb5_get_creds_opt_alloc"); if (etype_str) { krb5_enctype enctype; ret = krb5_string_to_enctype(context, etype_str, &enctype); if (ret) - krb5_errx (context, 1, N_("unrecognized enctype: %s", ""), - etype_str); + krb5_errx(context, 1, N_("unrecognized enctype: %s", ""), + etype_str); krb5_get_creds_opt_set_enctype(context, opt, enctype); } if (impersonate_str) { ret = krb5_parse_name(context, impersonate_str, &impersonate); if (ret) - krb5_err (context, 1, ret, "krb5_parse_name %s", impersonate_str); + krb5_err(context, 1, ret, "krb5_parse_name %s", impersonate_str); krb5_get_creds_opt_set_impersonate(context, opt, impersonate); krb5_get_creds_opt_add_options(context, opt, KRB5_GC_NO_STORE); + krb5_free_principal(context, impersonate); } if (out_cache_str) @@ -152,6 +175,12 @@ krb5_get_creds_opt_add_options(context, opt, KRB5_GC_NO_TRANSIT_CHECK); if (canonicalize_flag) krb5_get_creds_opt_add_options(context, opt, KRB5_GC_CANONICALIZE); + if (!store_flag) + krb5_get_creds_opt_add_options(context, opt, KRB5_GC_NO_STORE); + if (cached_only_flag) + krb5_get_creds_opt_add_options(context, opt, KRB5_GC_CACHED); + if (anonymous_flag) + krb5_get_creds_opt_add_options(context, opt, KRB5_GC_ANONYMOUS); if (delegation_cred_str) { krb5_ccache id; @@ -161,68 +190,175 @@ krb5_cc_clear_mcred(&mc); ret = krb5_cc_get_principal(context, cache, &mc.server); if (ret) - krb5_err (context, 1, ret, "krb5_cc_get_principal"); + krb5_err(context, 1, ret, "krb5_cc_get_principal"); ret = krb5_cc_resolve(context, delegation_cred_str, &id); if(ret) - krb5_err (context, 1, ret, "krb5_cc_resolve"); + krb5_err(context, 1, ret, "krb5_cc_resolve"); ret = krb5_cc_retrieve_cred(context, id, 0, &mc, &c); if(ret) - krb5_err (context, 1, ret, "krb5_cc_retrieve_cred"); + krb5_err(context, 1, ret, "krb5_cc_retrieve_cred"); ret = decode_Ticket(c.ticket.data, c.ticket.length, &ticket, NULL); if (ret) { krb5_clear_error_message(context); - krb5_err (context, 1, ret, "decode_Ticket"); + krb5_err(context, 1, ret, "decode_Ticket"); } krb5_free_cred_contents(context, &c); ret = krb5_get_creds_opt_set_ticket(context, opt, &ticket); if(ret) - krb5_err (context, 1, ret, "krb5_get_creds_opt_set_ticket"); + krb5_err(context, 1, ret, "krb5_get_creds_opt_set_ticket"); free_Ticket(&ticket); - krb5_cc_close (context, id); + krb5_cc_close(context, id); krb5_free_principal(context, mc.server); krb5_get_creds_opt_add_options(context, opt, KRB5_GC_CONSTRAINED_DELEGATION); } - ret = krb5_parse_name(context, argv[0], &server); - if (ret) - krb5_err (context, 1, ret, "krb5_parse_name %s", argv[0]); - - if (nametype_str) { - int32_t nametype; + if (nametype_str != NULL) { + ret = krb5_parse_nametype(context, nametype_str, &nametype); + if (ret) + krb5_err(context, 1, ret, "krb5_parse_nametype"); + } - ret = krb5_parse_nametype(context, nametype_str, &nametype); + if (nametype == KRB5_NT_SRV_HST || + nametype == KRB5_NT_SRV_HST_NEEDS_CANON) + is_hostbased_flag = 1; + + if (is_hostbased_flag) { + const char *sname = NULL; + const char *hname = NULL; + + if (nametype_str != NULL && + nametype != KRB5_NT_SRV_HST && + nametype != KRB5_NT_SRV_HST_NEEDS_CANON) + krb5_errx(context, 1, "--hostbased not compatible with " + "non-hostbased --name-type"); + + if (is_canonical_flag) + nametype = KRB5_NT_SRV_HST; + else + nametype = KRB5_NT_SRV_HST_NEEDS_CANON; + + /* + * Host-based service names can have more than one component. + * + * RFC5179 did not, but should have, assign a Kerberos name-type + * corresponding to GSS_C_NT_DOMAINBASED. But it's basically a + * host-based service name type with one additional component. + * + * So that's how we're treating host-based service names here: + * two or more components. + */ + + if (argc == 0) { + usage(1); + } else if (argc == 1) { + krb5_principal server2; + + /* + * In this case the one argument is a principal name, not the + * service name. + * + * We parse the argument as a principal name, extract the service + * and hostname components, use krb5_sname_to_principal(), then + * extract the service and hostname components from that. + */ + + ret = krb5_parse_name(context, argv[0], &server); + if (ret) + krb5_err(context, 1, ret, "krb5_parse_name %s", argv[0]); + sname = krb5_principal_get_comp_string(context, server, 0); + + /* + * If a single-component principal name is given, then we'll + * default the hostname, as krb5_principal_get_comp_string() + * returns NULL in this case. + */ + hname = krb5_principal_get_comp_string(context, server, 1); + + ret = krb5_sname_to_principal(context, hname, sname, + KRB5_NT_SRV_HST, &server2); + if (ret) + krb5_err(context, 1, ret, "krb5_sname_to_principal %s %s", + sname, hname); + sname = krb5_principal_get_comp_string(context, server2, 0); + hname = krb5_principal_get_comp_string(context, server2, 1); + + /* + * Modify the original with the new sname/hname. This way we + * retain any additional principal name components from the given + * principal name. + * + * The name-type is set further below. + */ + ret = krb5_principal_set_comp_string(context, server, 0, sname); + if (ret) + krb5_err(context, 1, ret, "krb5_principal_set_comp_string %s", argv[0]); + ret = krb5_principal_set_comp_string(context, server, 1, hname); + if (ret) + krb5_err(context, 1, ret, "krb5_principal_set_comp_string %s", argv[0]); + krb5_free_principal(context, server2); + } else { + size_t i; + + /* + * In this case the arguments are principal name components. + * + * The service and hostname components can be defaulted by passing + * empty strings. + */ + sname = argv[0]; + if (*sname == '\0') + sname = NULL; + hname = argv[1]; + if (hname == NULL || *hname == '\0') + hname = NULL; + ret = krb5_sname_to_principal(context, hname, sname, + KRB5_NT_SRV_HST, &server); + if (ret) + krb5_err(context, 1, ret, "krb5_sname_to_principal"); + + for (i = 2; i < argc; i++) { + ret = krb5_principal_set_comp_string(context, server, i, argv[i]); + if (ret) + krb5_err(context, 1, ret, "krb5_principal_set_comp_string"); + } + } + } else if (argc == 1) { + ret = krb5_parse_name(context, argv[0], &server); if (ret) - krb5_err(context, 1, ret, "krb5_parse_nametype"); - - server->name.name_type = (NAME_TYPE)nametype; + krb5_err(context, 1, ret, "krb5_parse_name %s", argv[0]); + } else { + usage(1); } + if (nametype != KRB5_NT_UNKNOWN) + server->name.name_type = (NAME_TYPE)nametype; + ret = krb5_get_creds(context, opt, cache, server, &out); if (ret) - krb5_err (context, 1, ret, "krb5_get_creds"); + krb5_err(context, 1, ret, "krb5_get_creds"); if (out_cache_str) { krb5_ccache id; ret = krb5_cc_resolve(context, out_cache_str, &id); if(ret) - krb5_err (context, 1, ret, "krb5_cc_resolve"); + krb5_err(context, 1, ret, "krb5_cc_resolve"); ret = krb5_cc_initialize(context, id, out->client); if(ret) - krb5_err (context, 1, ret, "krb5_cc_initialize"); + krb5_err(context, 1, ret, "krb5_cc_initialize"); ret = krb5_cc_store_cred(context, id, out); if(ret) - krb5_err (context, 1, ret, "krb5_cc_store_cred"); - krb5_cc_close (context, id); + krb5_err(context, 1, ret, "krb5_cc_store_cred"); + krb5_cc_close(context, id); } krb5_free_creds(context, out); diff --git a/crypto/heimdal/kuser/kgetcred.cat1 b/crypto/heimdal/kuser/kgetcred.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kgetcred.cat1 @@ -0,0 +1,106 @@ +KGETCRED(1) BSD General Commands Manual KGETCRED(1) + +NAME + kgetcred -- get a ticket for a particular service + +SYNOPSIS + kgetcred [--canonicalize] [--canonical] [-c -cache | --cache=cache] [-e + enctype | --enctype=enctype] [--debug] [-H | --hostbased] + [--name-type=name-type] [--no-transit-check] [--no-store] + [--cached-only] [-n | --anonymous] [--version] [--help] + principal + kgetcred [options] --hostbased principal + kgetcred [options] --hostbased service hostname [extra-components] + +DESCRIPTION + kgetcred obtains a ticket for the given service principal. Usually tick- + ets for services are obtained automatically when needed but sometimes for + some odd reason you want to obtain a particular ticket or of a special + type. + + If --hostbased is given then the given service principal name will be + canonicalized (see below). + + The third form constructs a host-based principal from the given service + name and hostname. The service name "host" is used if the given service + name in the third usage is the empty string. + + For host-based names, the local host's hostname is used if the given + hostname is the empty string or if the principal has a single component. + + Any additional components will be included, even for host-based service + principal names, but there are no defaults nor local canonicalization + rules for additional components. + + Local name canonicalization rules are applied unless the --canonical op- + tion is given. Currently local name canonicalization rules are supported + only for host-based principal names' hostname component. + + The principal's realm name may be canonicalized by following Kerberos re- + ferrals from the client principal's home realm if the --canonicalize op- + tion is given or if the local name canonicalization rules are configured + to use referrals. + + Supported options: + + --canonicalize + requests that the KDC canonicalize the principal. Currently this + only canonicalizes the realm by chasing referrals from the user's + start realm, but in the future this may also enable the KDC to + canonicalize the complete principal name. + + --canonical + turns off local canonicalization of the principal name. + + --name-type=name-type + the name-type to use when parsing the principal name. + + --hostbased + is short for --name-type=srv_hst. + + -c cache, --cache=cache + the credential cache to use. + + --delegation-credential-cache=cache + the credential cache to use for delegation. + + -e enctype, --enctype=enctype + encryption type to use. + + --no-transit-check + requests that the KDC doesn't do transit checking. + + --no-store + do not store tickets in the ccache. + + --cached-only + do not talk the TGS, search only the ccache. + + --anonymous + obtain an anonymous service ticket. + + --forwardable + + --debug + enables debug output to stderr. + + --version + + --help + + If the --canonical option is used, then no further canonicalization + should be done locally by the client (for example, DNS), but if + --canonicalize is used, then the client will ask that the KDC canonical- + ize the name. + + If the --canonicalize option is used with --hostbased a host-based name- + type, and --canonical is not used, then the hostname will be canonical- + ized according to the name canonicalization rules in krb5.conf. + + GSS-API initiator applications with host-based services will get the same + behavior as using the --canonicalize --hostbased options here. + +SEE ALSO + kinit(1), klist(1), krb5.conf(5), krb5_openlog(3) + +HEIMDAL March 12, 2004 HEIMDAL diff --git a/crypto/heimdal/kuser/kimpersonate-version.rc b/crypto/heimdal/kuser/kimpersonate-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kimpersonate-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Impersonate a Kerberos Principal" +#define RC_FILE_ORIG_0409 "kimpersonate.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kuser/kimpersonate.8 b/crypto/heimdal/kuser/kimpersonate.8 --- a/crypto/heimdal/kuser/kimpersonate.8 +++ b/crypto/heimdal/kuser/kimpersonate.8 @@ -33,19 +33,23 @@ .\" .Dd September 18, 2006 .Dt KIMPERSONATE 8 -.Os Heimdal +.Os .Sh NAME .Nm kimpersonate -.Nd impersonate a user when there exist a srvtab, keyfile or KeyFile +.Nd impersonate a user when there exist a keyfile or KeyFile .Sh SYNOPSIS .Nm +.Op Fl s Ar string \*(Ba Fl Fl ccache= Ns Ar string .Op Fl s Ar string \*(Ba Fl Fl server= Ns Ar string .Op Fl c Ar string \*(Ba Fl Fl client= Ns Ar string .Op Fl k Ar string \*(Ba Fl Fl keytab= Ns Ar string .Op Fl 5 | Fl Fl krb5 +.Op Fl A | Fl Fl add +.Op Fl R | Fl Fl referral .Op Fl e Ar integer \*(Ba Fl Fl expire-time= Ns Ar integer .Op Fl a Ar string \*(Ba Fl Fl client-address= Ns Ar string .Op Fl t Ar string \*(Ba Fl Fl enc-type= Ns Ar string +.Op Fl Fl session-enc-type= Ns Ar string .Op Fl f Ar string \*(Ba Fl Fl ticket-flags= Ns Ar string .Op Fl Fl verbose .Op Fl Fl version @@ -53,11 +57,13 @@ .Sh DESCRIPTION The .Nm -program creates a "fake" ticket using the service-key of the service. -The service key can be read from a Kerberos 5 keytab, AFS KeyFile or -(if compiled with support for Kerberos 4) a Kerberos 4 srvtab. +program creates a "fake" ticket using the service-key of the service and +stores it in the given (or default) ccache. This is useful for testing. +The service key can be read from a Kerberos 5 keytab or AFS KeyFile. Supported options: .Bl -tag -width Ds +.It Fl Fl ccache= Ns Ar string +ccache into which to store the ticket .It Fl s Ar string Ns , Fl Fl server= Ns Ar string name of server principal .It Fl c Ar string Ns , Fl Fl client= Ns Ar string @@ -66,12 +72,20 @@ name of keytab file .It Fl 5 Ns , Fl Fl krb5 create a Kerberos 5 ticket +.It Fl A Ns , Fl Fl add +don't re-initialize the ccache, instead add the ticket to an existing +ccache. +.It Fl R Ns , Fl Fl referral +simulate a referrals-based KDC client by storing two entries, one with +the empty realm for the service principal name. .It Fl e Ar integer Ns , Fl Fl expire-time= Ns Ar integer lifetime of ticket in seconds .It Fl a Ar string Ns , Fl Fl client-address= Ns Ar string address of client .It Fl t Ar string Ns , Fl Fl enc-type= Ns Ar string -encryption type +encryption type (defaults to "aes256-cts-hmac-sha1-96") +.It Fl Fl session-enc-type= Ns Ar string +session encryption type (defaults to enc-type or "des-cbc-crc" for afs service tickets) .It Fl f Ar string Ns , Fl Fl ticket-flags= Ns Ar string ticket flags for krb5 ticket .It Fl Fl verbose @@ -83,7 +97,6 @@ .Sh FILES Uses .Pa /etc/krb5.keytab, -.Pa /etc/srvtab and .Pa /usr/afs/etc/KeyFile when available and the @@ -100,6 +113,16 @@ will create a Kerberos 5 ticket for lha@E.KTH.SE for the host hummel.e.kth.se if there exists a keytab entry for it in .Pa /etc/krb5.keytab . +.Pp +In combination with the +.Nm ktutil +command, this is useful for testing. For example, +.Pp +.Nm ktutil +-k tkt add -p host/foo.test@TEST -V2 -e aes256-cts-hmac-sha1-96 -r +.Pp +.Nm +--cache=tcc -s host/foo.test@TEST -c jdoe@TEST -k tkt --referral .Sh SEE ALSO .Xr kinit 1 , .Xr klist 1 diff --git a/crypto/heimdal/kuser/kimpersonate.c b/crypto/heimdal/kuser/kimpersonate.c --- a/crypto/heimdal/kuser/kimpersonate.c +++ b/crypto/heimdal/kuser/kimpersonate.c @@ -45,24 +45,24 @@ static TicketFlags ticket_flags; static char *keytab_file = NULL; static char *enctype_string = NULL; +static char *session_enctype_string = NULL; static int expiration_time = 3600; static struct getarg_strings client_addresses; static int version_flag = 0; static int help_flag = 0; static int use_krb5 = 1; +static int add_to_ccache = 0; +static int use_referral_realm = 0; -static const char *enc_type = "des-cbc-md5"; - -/* - * - */ +static const char *enc_type = "aes256-cts-hmac-sha1-96"; +static const char *session_enc_type = NULL; static void -encode_ticket (krb5_context context, - EncryptionKey *skey, - krb5_enctype etype, - int skvno, - krb5_creds *cred) +encode_ticket(krb5_context context, + EncryptionKey *skey, + krb5_enctype etype, + int skvno, + krb5_creds *cred) { size_t len, size; char *buf; @@ -72,8 +72,8 @@ EncTicketPart et; Ticket ticket; - memset (&enc_part, 0, sizeof(enc_part)); - memset (&ticket, 0, sizeof(ticket)); + memset(&enc_part, 0, sizeof(enc_part)); + memset(&ticket, 0, sizeof(ticket)); /* * Set up `enc_part' @@ -82,7 +82,9 @@ et.flags = cred->flags.b; et.key = cred->session; et.crealm = cred->client->realm; - copy_PrincipalName(&cred->client->name, &et.cname); + ret = copy_PrincipalName(&cred->client->name, &et.cname); + if (ret) + krb5_err(context, 1, ret, "copy_PrincipalName"); { krb5_data empty_string; @@ -108,7 +110,7 @@ ret = krb5_crypto_init(context, skey, etype, &crypto); if (ret) krb5_err(context, 1, ret, "krb5_crypto_init"); - ret = krb5_encrypt_EncryptedData (context, + ret = krb5_encrypt_EncryptedData(context, crypto, KRB5_KU_TICKET, buf, @@ -127,11 +129,13 @@ ticket.tkt_vno = 5; ticket.realm = cred->server->realm; - copy_PrincipalName(&cred->server->name, &ticket.sname); + ret = copy_PrincipalName(&cred->server->name, &ticket.sname); + if (ret) + krb5_err(context, 1, ret, "copy_PrincipalName"); ASN1_MALLOC_ENCODE(Ticket, buf, len, &ticket, &size, ret); if(ret) - krb5_err (context, 1, ret, "encode_Ticket"); + krb5_err(context, 1, ret, "encode_Ticket"); krb5_data_copy(&cred->ticket, buf, len); free(buf); @@ -142,36 +146,39 @@ */ static int -create_krb5_tickets (krb5_context context, krb5_keytab kt) +create_krb5_tickets(krb5_context context, krb5_keytab kt) { krb5_error_code ret; krb5_keytab_entry entry; krb5_creds cred; krb5_enctype etype; + krb5_enctype session_etype; krb5_ccache ccache; - memset (&cred, 0, sizeof(cred)); + memset(&cred, 0, sizeof(cred)); - ret = krb5_string_to_enctype (context, enc_type, &etype); + ret = krb5_string_to_enctype(context, enc_type, &etype); + if (ret) + krb5_err (context, 1, ret, "krb5_string_to_enctype (enc-type)"); + ret = krb5_string_to_enctype(context, session_enc_type, &session_etype); if (ret) - krb5_err (context, 1, ret, "krb5_string_to_enctype"); - ret = krb5_kt_get_entry (context, kt, server_principal, - 0, etype, &entry); + krb5_err (context, 1, ret, "krb5_string_to_enctype (session-enc-type)"); + ret = krb5_kt_get_entry(context, kt, server_principal, 0, etype, &entry); if (ret) - krb5_err (context, 1, ret, "krb5_kt_get_entry"); + krb5_err(context, 1, ret, "krb5_kt_get_entry (perhaps use different --enc-type)"); /* * setup cred */ - ret = krb5_copy_principal (context, client_principal, &cred.client); + ret = krb5_copy_principal(context, client_principal, &cred.client); if (ret) - krb5_err (context, 1, ret, "krb5_copy_principal"); - ret = krb5_copy_principal (context, server_principal, &cred.server); + krb5_err(context, 1, ret, "krb5_copy_principal"); + ret = krb5_copy_principal(context, server_principal, &cred.server); if (ret) - krb5_err (context, 1, ret, "krb5_copy_principal"); - krb5_generate_random_keyblock(context, etype, &cred.session); + krb5_err(context, 1, ret, "krb5_copy_principal"); + krb5_generate_random_keyblock(context, session_etype, &cred.session); cred.times.authtime = time(NULL); cred.times.starttime = time(NULL); @@ -179,9 +186,9 @@ cred.times.renew_till = 0; krb5_data_zero(&cred.second_ticket); - ret = krb5_get_all_client_addrs (context, &cred.addresses); + ret = krb5_get_all_client_addrs(context, &cred.addresses); if (ret) - krb5_err (context, 1, ret, "krb5_get_all_client_addrs"); + krb5_err(context, 1, ret, "krb5_get_all_client_addrs"); cred.flags.b = ticket_flags; @@ -189,7 +196,8 @@ * Encode encrypted part of ticket */ - encode_ticket (context, &entry.keyblock, etype, entry.vno, &cred); + encode_ticket(context, &entry.keyblock, etype, entry.vno, &cred); + krb5_kt_free_entry(context, &entry); /* * Write to cc @@ -198,23 +206,59 @@ if (ccache_str) { ret = krb5_cc_resolve(context, ccache_str, &ccache); if (ret) - krb5_err (context, 1, ret, "krb5_cc_resolve"); + krb5_err(context, 1, ret, "krb5_cc_resolve"); } else { - ret = krb5_cc_default (context, &ccache); + ret = krb5_cc_default(context, &ccache); if (ret) - krb5_err (context, 1, ret, "krb5_cc_default"); + krb5_err(context, 1, ret, "krb5_cc_default"); } - ret = krb5_cc_initialize (context, ccache, cred.client); - if (ret) - krb5_err (context, 1, ret, "krb5_cc_initialize"); + if (add_to_ccache) { + krb5_principal def_princ; + + /* + * Force fcache to read the ccache header, otherwise the store + * will fail. + */ + ret = krb5_cc_get_principal(context, ccache, &def_princ); + if (ret) { + krb5_warn(context, ret, + "Given ccache appears not to exist; initializing it"); + ret = krb5_cc_initialize(context, ccache, cred.client); + if (ret) + krb5_err(context, 1, ret, "krb5_cc_initialize"); + } + krb5_free_principal(context, def_princ); + } else { + ret = krb5_cc_initialize(context, ccache, cred.client); + if (ret) + krb5_err(context, 1, ret, "krb5_cc_initialize"); + } - ret = krb5_cc_store_cred (context, ccache, &cred); + if (use_referral_realm && + strcmp(krb5_principal_get_realm(context, cred.server), "") != 0) { + krb5_free_principal(context, cred.server); + ret = krb5_copy_principal(context, server_principal, &cred.server); + if (ret) + krb5_err(context, 1, ret, "krb5_copy_principal"); + ret = krb5_principal_set_realm(context, cred.server, ""); + if (ret) + krb5_err(context, 1, ret, "krb5_principal_set_realm"); + ret = krb5_cc_store_cred(context, ccache, &cred); + if (ret) + krb5_err(context, 1, ret, "krb5_cc_store_cred"); + + krb5_free_principal(context, cred.server); + ret = krb5_copy_principal(context, server_principal, &cred.server); + if (ret) + krb5_err(context, 1, ret, "krb5_copy_principal"); + } + ret = krb5_cc_store_cred(context, ccache, &cred); if (ret) - krb5_err (context, 1, ret, "krb5_cc_store_cred"); + krb5_err(context, 1, ret, "krb5_cc_store_cred"); - krb5_free_cred_contents (context, &cred); - krb5_cc_close (context, ccache); + krb5_free_cred_contents(context, &cred); + krb5_cc_close(context, ccache); return 0; } @@ -224,28 +268,34 @@ */ static void -setup_env (krb5_context context, krb5_keytab *kt) +setup_env(krb5_context context, krb5_keytab *kt) { krb5_error_code ret; if (keytab_file) - ret = krb5_kt_resolve (context, keytab_file, kt); + ret = krb5_kt_resolve(context, keytab_file, kt); else - ret = krb5_kt_default (context, kt); + ret = krb5_kt_default(context, kt); if (ret) - krb5_err (context, 1, ret, "resolving keytab"); + krb5_err(context, 1, ret, "resolving keytab"); if (client_principal_str == NULL) - krb5_errx (context, 1, "missing client principal"); - ret = krb5_parse_name (context, client_principal_str, &client_principal); + krb5_errx(context, 1, "missing client principal"); + ret = krb5_parse_name(context, client_principal_str, &client_principal); if (ret) - krb5_err (context, 1, ret, "resolvning client name"); + krb5_err(context, 1, ret, "resolvning client name"); if (server_principal_str == NULL) - krb5_errx (context, 1, "missing server principal"); - ret = krb5_parse_name (context, server_principal_str, &server_principal); + krb5_errx(context, 1, "missing server principal"); + ret = krb5_parse_name(context, server_principal_str, &server_principal); if (ret) - krb5_err (context, 1, ret, "resolvning client name"); + krb5_err(context, 1, ret, "resolvning server name"); + + /* If no session-enc-type specified on command line and this is an afs */ + /* service ticket, change default of session_enc_type to DES. */ + if (session_enctype_string == NULL + && strcmp("afs", *server_principal->name.name_string.val) == 0) + session_enc_type = "des-cbc-crc"; if (ticket_flags_str) { int ticket_flags_int; @@ -253,12 +303,12 @@ ticket_flags_int = parse_flags(ticket_flags_str, asn1_TicketFlags_units(), 0); if (ticket_flags_int <= 0) { - krb5_warnx (context, "bad ticket flags: `%s'", ticket_flags_str); - print_flags_table (asn1_TicketFlags_units(), stderr); - exit (1); + krb5_warnx(context, "bad ticket flags: `%s'", ticket_flags_str); + print_flags_table(asn1_TicketFlags_units(), stderr); + exit(1); } if (ticket_flags_int) - ticket_flags = int2TicketFlags (ticket_flags_int); + ticket_flags = int2TicketFlags(ticket_flags_int); } } @@ -277,11 +327,17 @@ "name of keytab file", NULL }, { "krb5", '5', arg_flag, &use_krb5, "create a kerberos 5 ticket", NULL }, + { "add", 'A', arg_flag, &add_to_ccache, + "add to ccache without re-initializing it", NULL }, + { "referral", 'R', arg_flag, &use_referral_realm, + "store an additional entry for the service with the empty realm", NULL }, { "expire-time", 'e', arg_integer, &expiration_time, "lifetime of ticket in seconds", NULL }, { "client-addresses", 'a', arg_strings, &client_addresses, "addresses of client", NULL }, - { "enc-type", 't', arg_string, &enctype_string, + { "enc-type", 't', arg_string, &enctype_string, + "encryption type", NULL }, + { "session-enc-type", 0, arg_string,&session_enctype_string, "encryption type", NULL }, { "ticket-flags", 'f', arg_string, &ticket_flags_str, "ticket flags for krb5 ticket", NULL }, @@ -292,26 +348,26 @@ }; static void -usage (int ret) +usage(int ret) { - arg_printusage (args, - sizeof(args) / sizeof(args[0]), - NULL, - ""); - exit (ret); + arg_printusage(args, + sizeof(args) / sizeof(args[0]), + NULL, + ""); + exit(ret); } int -main (int argc, char **argv) +main(int argc, char **argv) { int optidx = 0; krb5_error_code ret; krb5_context context; krb5_keytab kt; - setprogname (argv[0]); + setprogname(argv[0]); - ret = krb5_init_context (&context); + ret = krb5_init_context(&context); if (ret) errx(1, "krb5_init_context failed: %u", ret); @@ -328,6 +384,10 @@ if (enctype_string) enc_type = enctype_string; + if (session_enctype_string) + session_enc_type = session_enctype_string; + else + session_enc_type = enc_type; setup_env(context, &kt); diff --git a/crypto/heimdal/kuser/kimpersonate.cat8 b/crypto/heimdal/kuser/kimpersonate.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kimpersonate.cat8 @@ -0,0 +1,93 @@ +KIMPERSONATE(8) BSD System Manager's Manual KIMPERSONATE(8) + +NAME + kimpersonate -- impersonate a user when there exist a keyfile or KeyFile + +SYNOPSIS + kimpersonate [-s string | --ccache=string] [-s string | --server=string] + [-c string | --client=string] [-k string | --keytab=string] + [-5 | --krb5] [-A | --add] [-R | --referral] + [-e integer | --expire-time=integer] + [-a string | --client-address=string] + [-t string | --enc-type=string] [--session-enc-type=string] + [-f string | --ticket-flags=string] [--verbose] [--version] + [--help] + +DESCRIPTION + The kimpersonate program creates a "fake" ticket using the service-key of + the service and stores it in the given (or default) ccache. This is use- + ful for testing. The service key can be read from a Kerberos 5 keytab or + AFS KeyFile. Supported options: + + --ccache=string + ccache into which to store the ticket + + -s string, --server=string + name of server principal + + -c string, --client=string + name of client principal + + -k string, --keytab=string + name of keytab file + + -5, --krb5 + create a Kerberos 5 ticket + + -A, --add + don't re-initialize the ccache, instead add the ticket to an ex- + isting ccache. + + -R, --referral + simulate a referrals-based KDC client by storing two entries, one + with the empty realm for the service principal name. + + -e integer, --expire-time=integer + lifetime of ticket in seconds + + -a string, --client-address=string + address of client + + -t string, --enc-type=string + encryption type (defaults to "aes256-cts-hmac-sha1-96") + + --session-enc-type=string + session encryption type (defaults to enc-type or "des-cbc-crc" + for afs service tickets) + + -f string, --ticket-flags=string + ticket flags for krb5 ticket + + --verbose + Verbose output + + --version + Print version + + --help + +FILES + Uses /etc/krb5.keytab, and /usr/afs/etc/KeyFile when available and the -k + option is used with an appropriate prefix. + +EXAMPLES + kimpersonate can be used in samba root preexec option or for debugging. + kimpersonate -s host/hummel.e.kth.se@E.KTH.SE -c lha@E.KTH.SE -5 will + create a Kerberos 5 ticket for lha@E.KTH.SE for the host hummel.e.kth.se + if there exists a keytab entry for it in /etc/krb5.keytab. + + In combination with the ktutil command, this is useful for testing. For + example, + + ktutil -k tkt add -p host/foo.test@TEST -V2 -e aes256-cts-hmac-sha1-96 -r + + kimpersonate --cache=tcc -s host/foo.test@TEST -c jdoe@TEST -k tkt --re- + ferral + +SEE ALSO + kinit(1), klist(1) + +AUTHORS + Love Hornquist Astrand + +BSD September 18, 2006 BSD diff --git a/crypto/heimdal/kuser/kinit-version.rc b/crypto/heimdal/kuser/kinit-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kinit-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Acquire Initial Kerberos Tickets" +#define RC_FILE_ORIG_0409 "kinit.exe" + +#include "../windows/version.rc" diff --git a/crypto/heimdal/kuser/kinit.1 b/crypto/heimdal/kuser/kinit.1 --- a/crypto/heimdal/kuser/kinit.1 +++ b/crypto/heimdal/kuser/kinit.1 @@ -44,7 +44,8 @@ .Fl Fl cache= Ns Ar cachename .Xc .Oc -.Op Fl f | Fl Fl no-forwardable +.Op Fl f | Fl Fl forwardable +.Op Fl F | Fl Fl no-forwardable .Oo Fl t Ar keytabname \*(Ba Xo .Fl Fl keytab= Ns Ar keytabname .Xc @@ -81,7 +82,7 @@ .Op Fl Fl password-file= Ns Ar filename .Op Fl Fl fcache-version= Ns Ar version-number .Op Fl A | Fl Fl no-addresses -.Op Fl Fl anonymous +.Op Fl n | Fl Fl anonymous .Op Fl Fl enterprise .Op Fl Fl version .Op Fl Fl help @@ -99,9 +100,10 @@ .It Fl c Ar cachename Fl Fl cache= Ns Ar cachename The credentials cache to put the acquired ticket in, if other than default. -.It Fl f Fl Fl no-forwardable -Get ticket that can be forwarded to another host, or if the negative -flags use, don't get a forwardable flag. +.It Fl f Fl Fl forwardable +Obtain a ticket than can be forwarded to another host. +.It Fl F Fl Fl no-forwardable +Do not obtain a forwardable ticket. .It Fl t Ar keytabname , Fl Fl keytab= Ns Ar keytabname Don't ask for a password, but instead get the key from the specified keytab. @@ -163,10 +165,22 @@ .Xr krb5.conf 5 . .It Fl A , Fl Fl no-addresses Request a ticket with no addresses. -.It Fl Fl anonymous -Request an anonymous ticket (which means that the ticket will be -issued to an anonymous principal, typically -.Dq anonymous@REALM ) . +.It Fl n , Fl Fl anonymous +Request an anonymous ticket. +With the default (false) setting of the +.Ar historical_anon_pkinit +configuration parameter, if the principal is specified as @REALM, then +anonymous PKINIT will be used to acquire an unauthenticated anonymous ticket +and both the client name and (with fully RFC-comformant KDCs) realm in the +returned ticket will be anonymized. +Otherwise, authentication proceeds as normal and the anonymous ticket will have +only the client name anonymized. +With +.Ar historical_anon_pkinit +set to +.Li true , +the principal is interpreted as a realm even without an at-sign prefix, and it +is not possible to obtain authenticated anonymized tickets. .It Fl Fl enterprise Parse principal as a enterprise (KRB5-NT-ENTERPRISE) name. Enterprise names are email like principals that are stored in the name part of @@ -210,8 +224,6 @@ .Pa krb5.conf , the default being .Pa /etc/krb5.conf . -.It Ev KRBTKFILE -Specifies the Kerberos 4 ticket file to store version 4 tickets in. .El .\".Sh FILES .\".Sh EXAMPLES diff --git a/crypto/heimdal/kuser/kinit.c b/crypto/heimdal/kuser/kinit.c --- a/crypto/heimdal/kuser/kinit.c +++ b/crypto/heimdal/kuser/kinit.c @@ -43,6 +43,10 @@ #include "heimntlm.h" #endif +#ifndef SIGINFO +#define SIGINFO SIGUSR1 +#endif + int forwardable_flag = -1; int proxiable_flag = -1; int renewable_flag = -1; @@ -63,6 +67,7 @@ struct getarg_strings etype_str; int use_keytab = 0; char *keytab_str = NULL; +static krb5_keytab kt = NULL; int do_afslog = -1; int fcache_version; char *password_file = NULL; @@ -74,6 +79,7 @@ static int canonicalize_flag = 0; static int enterprise_flag = 0; static int ok_as_delegate_flag = 0; +static char *fast_armor_cache_string = NULL; static int use_referrals_flag = 0; static int windows_flag = 0; #ifndef NO_NTLM @@ -101,7 +107,7 @@ { "cache", 'c', arg_string, &cred_cache, NP_("credentials cache", ""), "cachename" }, - { "forwardable", 0, arg_negative_flag, &forwardable_flag, + { "forwardable", 'F', arg_negative_flag, &forwardable_flag, NP_("get tickets not forwardable", ""), NULL }, { NULL, 'f', arg_flag, &forwardable_flag, @@ -149,7 +155,7 @@ { "extra-addresses",'a', arg_strings, &extra_addresses, NP_("include these extra addresses", ""), "addresses" }, - { "anonymous", 0, arg_flag, &anonymous_flag, + { "anonymous", 'n', arg_flag, &anonymous_flag, NP_("request an anonymous ticket", ""), NULL }, { "request-pac", 0, arg_flag, &pac_flag, @@ -187,6 +193,9 @@ { "ok-as-delegate", 0, arg_flag, &ok_as_delegate_flag, NP_("honor ok-as-delegate on tickets", ""), NULL }, + { "fast-armor-cache", 0, arg_string, &fast_armor_cache_string, + NP_("use this credential cache as FAST armor cache", ""), "cache" }, + { "use-referrals", 0, arg_flag, &use_referrals_flag, NP_("only use referrals, no dns canalisation", ""), NULL }, @@ -197,16 +206,15 @@ { "help", 0, arg_flag, &help_flag, NULL, NULL } }; +static char * +get_default_realm(krb5_context context); + static void -usage (int ret) +usage(int ret) { - arg_printusage_i18n (args, - sizeof(args)/sizeof(*args), - N_("Usage: ", ""), - NULL, - "[principal [command]]", - getarg_i18n); - exit (ret); + arg_printusage_i18n(args, sizeof(args)/sizeof(*args), N_("Usage: ", ""), + NULL, "[principal [command]]", getarg_i18n); + exit(ret); } static krb5_error_code @@ -216,7 +224,7 @@ krb5_principal *princ) { krb5_const_realm realm; - if(server) + if (server) return krb5_parse_name(context, server, princ); realm = krb5_principal_get_realm(context, client); @@ -224,7 +232,82 @@ KRB5_TGS_NAME, realm, NULL); } -static int +static krb5_error_code +copy_configs(krb5_context context, + krb5_ccache dst, + krb5_ccache src, + krb5_principal start_ticket_server) +{ + krb5_error_code ret; + const char *cfg_names[] = {"realm-config", "FriendlyName", "anon_pkinit_realm", NULL}; + const char *cfg_names_w_pname[] = {"fast_avail", NULL}; + krb5_data cfg_data; + size_t i; + + for (i = 0; cfg_names[i]; i++) { + ret = krb5_cc_get_config(context, src, NULL, cfg_names[i], &cfg_data); + if (ret == KRB5_CC_NOTFOUND || ret == KRB5_CC_END) { + continue; + } else if (ret) { + krb5_warn(context, ret, "krb5_cc_get_config"); + return ret; + } + ret = krb5_cc_set_config(context, dst, NULL, cfg_names[i], &cfg_data); + if (ret) + krb5_warn(context, ret, "krb5_cc_set_config"); + } + for (i = 0; start_ticket_server && cfg_names_w_pname[i]; i++) { + ret = krb5_cc_get_config(context, src, start_ticket_server, + cfg_names_w_pname[i], &cfg_data); + if (ret == KRB5_CC_NOTFOUND || ret == KRB5_CC_END) { + continue; + } else if (ret) { + krb5_warn(context, ret, "krb5_cc_get_config"); + return ret; + } + ret = krb5_cc_set_config(context, dst, start_ticket_server, + cfg_names_w_pname[i], &cfg_data); + if (ret && ret != KRB5_CC_NOTFOUND) + krb5_warn(context, ret, "krb5_cc_set_config"); + } + /* + * We don't copy cc configs for any other principals though (mostly + * those are per-target time offsets and the like, so it's bad to + * lose them, but hardly the end of the world, and as they may not + * expire anyways, it's good to let them go). + */ + return 0; +} + +static krb5_error_code +get_anon_pkinit_tgs_name(krb5_context context, + krb5_ccache ccache, + krb5_principal *tgs_name) +{ + krb5_error_code ret; + krb5_data data; + char *realm; + + ret = krb5_cc_get_config(context, ccache, NULL, "anon_pkinit_realm", &data); + if (ret == 0) + realm = strndup(data.data, data.length); + else + realm = get_default_realm(context); + + krb5_data_free(&data); + + if (realm == NULL) + return krb5_enomem(context); + + ret = krb5_make_principal(context, tgs_name, realm, + KRB5_TGS_NAME, realm, NULL); + + free(realm); + + return ret; +} + +static krb5_error_code renew_validate(krb5_context context, int renew, int validate, @@ -233,18 +316,25 @@ krb5_deltat life) { krb5_error_code ret; + krb5_ccache tempccache = NULL; krb5_creds in, *out = NULL; krb5_kdc_flags flags; memset(&in, 0, sizeof(in)); ret = krb5_cc_get_principal(context, cache, &in.client); - if(ret) { + if (ret) { krb5_warn(context, ret, "krb5_cc_get_principal"); return ret; } - ret = get_server(context, in.client, server, &in.server); - if(ret) { + + if (server == NULL && + krb5_principal_is_anonymous(context, in.client, + KRB5_ANON_MATCH_UNAUTHENTICATED)) + ret = get_anon_pkinit_tgs_name(context, cache, &in.server); + else + ret = get_server(context, in.client, server, &in.server); + if (ret) { krb5_warn(context, ret, "get_server"); goto out; } @@ -273,11 +363,11 @@ if (anonymous_flag) flags.b.request_anonymous = anonymous_flag; - if(life) + if (life) in.times.endtime = time(NULL) + life; if (out) { - krb5_free_creds (context, out); + krb5_free_creds(context, out); out = NULL; } @@ -289,32 +379,50 @@ NULL, &in, &out); - if(ret) { + if (ret) { krb5_warn(context, ret, "krb5_get_kdc_cred"); goto out; } - ret = krb5_cc_initialize(context, cache, in.client); - if(ret) { - krb5_free_creds (context, out); - krb5_warn(context, ret, "krb5_cc_initialize"); + + ret = krb5_cc_new_unique(context, krb5_cc_get_type(context, cache), + NULL, &tempccache); + if (ret) { + krb5_warn(context, ret, "krb5_cc_new_unique"); goto out; } - ret = krb5_cc_store_cred(context, cache, out); - if(ret == 0 && server == NULL) { - /* only do this if it's a general renew-my-tgt request */ -#ifndef NO_AFS - if(do_afslog && k_hasafs()) - krb5_afslog(context, cache, NULL, NULL); -#endif + ret = krb5_cc_initialize(context, tempccache, in.client); + if (ret) { + krb5_warn(context, ret, "krb5_cc_initialize"); + goto out; } - krb5_free_creds (context, out); - if(ret) { + ret = krb5_cc_store_cred(context, tempccache, out); + if (ret) { krb5_warn(context, ret, "krb5_cc_store_cred"); goto out; } + + /* + * We want to preserve cc configs as some are security-relevant, and + * anyways it's the friendly thing to do. + */ + ret = copy_configs(context, tempccache, cache, out->server); + if (ret) + goto out; + + ret = krb5_cc_move(context, tempccache, cache); + if (ret) { + krb5_warn(context, ret, "krb5_cc_move"); + goto out; + } + tempccache = NULL; + out: + if (tempccache) + krb5_cc_destroy(context, tempccache); + if (out) + krb5_free_creds(context, out); krb5_free_cred_contents(context, &in); return ret; } @@ -328,13 +436,23 @@ krb5_error_code ret; krb5_data data; char *name; + int aret; - asprintf(&name, "ntlm-key-%s", domain); - if (name == NULL) { - krb5_clear_error_message(context); - return ENOMEM; + ret = krb5_cc_get_config(context, id, NULL, "default-ntlm-domain", &data); + if (ret == 0) { + krb5_data_free(&data); + } else { + data.length = strlen(domain); + data.data = rk_UNCONST(domain); + ret = krb5_cc_set_config(context, id, NULL, "default-ntlm-domain", &data); + if (ret != 0) + return ret; } + aret = asprintf(&name, "ntlm-key-%s", domain); + if (aret == -1 || name == NULL) + return krb5_enomem(context); + data.length = buf->length; data.data = buf->data; @@ -349,23 +467,29 @@ krb5_principal principal, krb5_ccache ccache, krb5_deltat ticket_life, - int interactive) + int interactive, + int anonymous_pkinit) { krb5_error_code ret; - krb5_get_init_creds_opt *opt; krb5_creds cred; char passwd[256]; krb5_deltat start_time = 0; krb5_deltat renew = 0; const char *renewstr = NULL; krb5_enctype *enctype = NULL; - krb5_ccache tempccache; + krb5_ccache tempccache = NULL; + krb5_init_creds_context ctx = NULL; + krb5_get_init_creds_opt *opt = NULL; + krb5_prompter_fct prompter = krb5_prompter_posix; #ifndef NO_NTLM struct ntlm_buf ntlmkey; memset(&ntlmkey, 0, sizeof(ntlmkey)); #endif passwd[0] = '\0'; + if (!interactive) + prompter = NULL; + if (password_file) { FILE *f; @@ -373,14 +497,18 @@ f = stdin; else f = fopen(password_file, "r"); - if (f == NULL) - krb5_errx(context, 1, "Failed to open the password file %s", - password_file); - - if (fgets(passwd, sizeof(passwd), f) == NULL) - krb5_errx(context, 1, - N_("Failed to read password from file %s", ""), - password_file); + if (f == NULL) { + krb5_warnx(context, "Failed to open the password file %s", + password_file); + return errno; + } + + if (fgets(passwd, sizeof(passwd), f) == NULL) { + krb5_warnx(context, N_("Failed to read password from file %s", ""), + password_file); + fclose(f); + return EINVAL; /* XXX Need a better error */ + } if (f != stdin) fclose(f); passwd[strcspn(passwd, "\n")] = '\0'; @@ -416,19 +544,21 @@ memset(&cred, 0, sizeof(cred)); - ret = krb5_get_init_creds_opt_alloc (context, &opt); - if (ret) - krb5_err(context, 1, ret, "krb5_get_init_creds_opt_alloc"); + ret = krb5_get_init_creds_opt_alloc(context, &opt); + if (ret) { + krb5_warn(context, ret, "krb5_get_init_creds_opt_alloc"); + goto out; + } krb5_get_init_creds_opt_set_default_flags(context, "kinit", krb5_principal_get_realm(context, principal), opt); - if(forwardable_flag != -1) - krb5_get_init_creds_opt_set_forwardable (opt, forwardable_flag); - if(proxiable_flag != -1) - krb5_get_init_creds_opt_set_proxiable (opt, proxiable_flag); - if(anonymous_flag) - krb5_get_init_creds_opt_set_anonymous (opt, anonymous_flag); + if (forwardable_flag != -1) + krb5_get_init_creds_opt_set_forwardable(opt, forwardable_flag); + if (proxiable_flag != -1) + krb5_get_init_creds_opt_set_proxiable(opt, proxiable_flag); + if (anonymous_flag) + krb5_get_init_creds_opt_set_anonymous(opt, anonymous_flag); if (pac_flag != -1) krb5_get_init_creds_opt_set_pac_request(context, opt, pac_flag ? TRUE : FALSE); @@ -436,20 +566,22 @@ krb5_get_init_creds_opt_set_canonicalize(context, opt, TRUE); if (pk_enterprise_flag || enterprise_flag || canonicalize_flag || windows_flag) krb5_get_init_creds_opt_set_win2k(context, opt, TRUE); - if (pk_user_id || ent_user_id || anonymous_flag) { + if (pk_user_id || ent_user_id || anonymous_pkinit) { ret = krb5_get_init_creds_opt_set_pkinit(context, opt, principal, pk_user_id, pk_x509_anchors, NULL, NULL, - pk_use_enckey ? 2 : 0 | - anonymous_flag ? 4 : 0, - krb5_prompter_posix, + pk_use_enckey ? KRB5_GIC_OPT_PKINIT_USE_ENCKEY : 0 | + anonymous_pkinit ? KRB5_GIC_OPT_PKINIT_ANONYMOUS : 0, + prompter, NULL, passwd); - if (ret) - krb5_err(context, 1, ret, "krb5_get_init_creds_opt_set_pkinit"); + if (ret) { + krb5_warn(context, ret, "krb5_get_init_creds_opt_set_pkinit"); + goto out; + } if (ent_user_id) krb5_get_init_creds_opt_set_pkinit_user_certs(context, opt, ent_user_id); } @@ -459,108 +591,131 @@ addrs_flag ? FALSE : TRUE); if (renew_life == NULL && renewable_flag) - renewstr = "1 month"; + renewstr = "6 months"; if (renew_life) renewstr = renew_life; if (renewstr) { - renew = parse_time (renewstr, "s"); + renew = parse_time(renewstr, "s"); if (renew < 0) - errx (1, "unparsable time: %s", renewstr); + errx(1, "unparsable time: %s", renewstr); - krb5_get_init_creds_opt_set_renew_life (opt, renew); + krb5_get_init_creds_opt_set_renew_life(opt, renew); } - if(ticket_life != 0) - krb5_get_init_creds_opt_set_tkt_life (opt, ticket_life); + if (ticket_life != 0) + krb5_get_init_creds_opt_set_tkt_life(opt, ticket_life); - if(start_str) { - int tmp = parse_time (start_str, "s"); + if (start_str) { + int tmp = parse_time(start_str, "s"); if (tmp < 0) - errx (1, N_("unparsable time: %s", ""), start_str); + errx(1, N_("unparsable time: %s", ""), start_str); start_time = tmp; } - if(etype_str.num_strings) { + if (etype_str.num_strings) { int i; enctype = malloc(etype_str.num_strings * sizeof(*enctype)); - if(enctype == NULL) + if (enctype == NULL) errx(1, "out of memory"); for(i = 0; i < etype_str.num_strings; i++) { ret = krb5_string_to_enctype(context, etype_str.strings[i], &enctype[i]); - if(ret) + if (ret) errx(1, "unrecognized enctype: %s", etype_str.strings[i]); } krb5_get_init_creds_opt_set_etype_list(opt, enctype, etype_str.num_strings); } - if(use_keytab || keytab_str) { - krb5_keytab kt; - if(keytab_str) - ret = krb5_kt_resolve(context, keytab_str, &kt); - else - ret = krb5_kt_default(context, &kt); - if (ret) - krb5_err (context, 1, ret, "resolving keytab"); - ret = krb5_get_init_creds_keytab (context, - &cred, - principal, - kt, - start_time, - server_str, - opt); - krb5_kt_close(context, kt); - } else if (pk_user_id || ent_user_id || anonymous_flag) { - ret = krb5_get_init_creds_password (context, - &cred, - principal, - passwd, - krb5_prompter_posix, - NULL, - start_time, - server_str, - opt); - } else if (!interactive) { - krb5_warnx(context, "Not interactive, failed to get initial ticket"); + ret = krb5_init_creds_init(context, principal, prompter, NULL, start_time, opt, &ctx); + if (ret) { + krb5_warn(context, ret, "krb5_init_creds_init"); + goto out; + } + + if (server_str) { + ret = krb5_init_creds_set_service(context, ctx, server_str); + if (ret) { + krb5_warn(context, ret, "krb5_init_creds_set_service"); + goto out; + } + } + + if (fast_armor_cache_string) { + krb5_ccache fastid; + + ret = krb5_cc_resolve(context, fast_armor_cache_string, &fastid); + if (ret) { + krb5_warn(context, ret, "krb5_cc_resolve(FAST cache)"); + goto out; + } + + ret = krb5_init_creds_set_fast_ccache(context, ctx, fastid); + if (ret) { + krb5_warn(context, ret, "krb5_init_creds_set_fast_ccache"); + goto out; + } + } + + if (use_keytab || keytab_str) { + ret = krb5_init_creds_set_keytab(context, ctx, kt); + if (ret) { + krb5_warn(context, ret, "krb5_init_creds_set_keytab"); + goto out; + } + } else if (pk_user_id || ent_user_id || + krb5_principal_is_anonymous(context, principal, KRB5_ANON_MATCH_ANY)) { + /* nop */; + } else if (!interactive && passwd[0] == '\0') { + static int already_warned = 0; + + if (!already_warned) + krb5_warnx(context, "Not interactive, failed to get " + "initial ticket"); krb5_get_init_creds_opt_free(context, opt); + already_warned = 1; return 0; } else { if (passwd[0] == '\0') { char *p, *prompt; + int aret = 0; - krb5_unparse_name (context, principal, &p); - asprintf (&prompt, N_("%s's Password: ", ""), p); - free (p); + ret = krb5_unparse_name(context, principal, &p); + if (ret) + errx(1, "failed to generate passwd prompt: not enough memory"); + + aret = asprintf(&prompt, N_("%s's Password: ", ""), p); + free(p); + if (aret == -1) + errx(1, "failed to generate passwd prompt: not enough memory"); if (UI_UTIL_read_pw_string(passwd, sizeof(passwd)-1, prompt, 0)){ memset(passwd, 0, sizeof(passwd)); - exit(1); + errx(1, "failed to read password"); } - free (prompt); + free(prompt); } - - ret = krb5_get_init_creds_password (context, - &cred, - principal, - passwd, - krb5_prompter_posix, - NULL, - start_time, - server_str, - opt); + if (passwd[0]) { + ret = krb5_init_creds_set_password(context, ctx, passwd); + if (ret) { + krb5_warn(context, ret, "krb5_init_creds_set_password"); + goto out; + } + } } - krb5_get_init_creds_opt_free(context, opt); + + ret = krb5_init_creds_get(context, ctx); + #ifndef NO_NTLM if (ntlm_domain && passwd[0]) heim_ntlm_nt_key(passwd, &ntlmkey); #endif - memset(passwd, 0, sizeof(passwd)); + memset_s(passwd, sizeof(passwd), 0, sizeof(passwd)); switch(ret){ case 0: @@ -570,25 +725,38 @@ case KRB5KRB_AP_ERR_BAD_INTEGRITY: case KRB5KRB_AP_ERR_MODIFIED: case KRB5KDC_ERR_PREAUTH_FAILED: - krb5_errx(context, 1, N_("Password incorrect", "")); - break; + case KRB5_GET_IN_TKT_LOOP: + krb5_warnx(context, N_("Password incorrect", "")); + goto out; case KRB5KRB_AP_ERR_V4_REPLY: - krb5_errx(context, 1, N_("Looks like a Kerberos 4 reply", "")); - break; + krb5_warnx(context, N_("Looks like a Kerberos 4 reply", "")); + goto out; + case KRB5KDC_ERR_KEY_EXPIRED: + krb5_warnx(context, N_("Password expired", "")); + goto out; default: - krb5_err(context, 1, ret, "krb5_get_init_creds"); + krb5_warn(context, ret, "krb5_get_init_creds"); + goto out; + } + + krb5_process_last_request(context, opt, ctx); + + ret = krb5_init_creds_get_creds(context, ctx, &cred); + if (ret) { + krb5_warn(context, ret, "krb5_init_creds_get_creds"); + goto out; } - if(ticket_life != 0) { - if(abs(cred.times.endtime - cred.times.starttime - ticket_life) > 30) { + if (ticket_life != 0) { + if (labs(cred.times.endtime - cred.times.starttime - ticket_life) > 30) { char life[64]; unparse_time_approx(cred.times.endtime - cred.times.starttime, life, sizeof(life)); krb5_warnx(context, N_("NOTICE: ticket lifetime is %s", ""), life); } } - if(renew_life) { - if(abs(cred.times.renew_till - cred.times.starttime - renew) > 30) { + if (renew_life) { + if (labs(cred.times.renew_till - cred.times.starttime - renew) > 30) { char life[64]; unparse_time_approx(cred.times.renew_till - cred.times.starttime, life, sizeof(life)); @@ -597,25 +765,30 @@ life); } } + krb5_free_cred_contents(context, &cred); ret = krb5_cc_new_unique(context, krb5_cc_get_type(context, ccache), NULL, &tempccache); - if (ret) - krb5_err (context, 1, ret, "krb5_cc_new_unique"); - - ret = krb5_cc_initialize (context, tempccache, cred.client); - if (ret) - krb5_err (context, 1, ret, "krb5_cc_initialize"); + if (ret) { + krb5_warn(context, ret, "krb5_cc_new_unique"); + goto out; + } - ret = krb5_cc_store_cred (context, tempccache, &cred); - if (ret) - krb5_err (context, 1, ret, "krb5_cc_store_cred"); + ret = krb5_init_creds_store(context, ctx, tempccache); + if (ret) { + krb5_warn(context, ret, "krb5_init_creds_store"); + goto out; + } - krb5_free_cred_contents (context, &cred); + krb5_init_creds_free(context, ctx); + ctx = NULL; ret = krb5_cc_move(context, tempccache, ccache); - if (ret) - krb5_err (context, 1, ret, "krb5_cc_move"); + if (ret) { + krb5_warn(context, ret, "krb5_cc_move"); + goto out; + } + tempccache = NULL; if (switch_cache_flags) krb5_cc_switch(context, ccache); @@ -640,30 +813,49 @@ krb5_cc_set_config(context, ccache, NULL, "realm-config", &data); } + if (anonymous_pkinit) { + krb5_data data; + + data.length = strlen(principal->realm); + data.data = principal->realm; + + krb5_cc_set_config(context, ccache, NULL, "anon_pkinit_realm", &data); + } + +out: + krb5_get_init_creds_opt_free(context, opt); + if (ctx) + krb5_init_creds_free(context, ctx); + if (tempccache) + krb5_cc_destroy(context, tempccache); if (enctype) free(enctype); - return 0; + return ret; } static time_t -ticket_lifetime(krb5_context context, krb5_ccache cache, - krb5_principal client, const char *server) +ticket_lifetime(krb5_context context, krb5_ccache cache, krb5_principal client, + const char *server, time_t *renew) { krb5_creds in_cred, *cred; krb5_error_code ret; time_t timeout; + time_t curtime; memset(&in_cred, 0, sizeof(in_cred)); + if (renew != NULL) + *renew = 0; + ret = krb5_cc_get_principal(context, cache, &in_cred.client); - if(ret) { + if (ret) { krb5_warn(context, ret, "krb5_cc_get_principal"); return 0; } ret = get_server(context, in_cred.client, server, &in_cred.server); - if(ret) { + if (ret) { krb5_free_principal(context, in_cred.client); krb5_warn(context, ret, "get_server"); return 0; @@ -673,84 +865,434 @@ cache, &in_cred, &cred); krb5_free_principal(context, in_cred.client); krb5_free_principal(context, in_cred.server); - if(ret) { + if (ret) { krb5_warn(context, ret, "krb5_get_credentials"); return 0; } - timeout = cred->times.endtime - cred->times.starttime; + curtime = time(NULL); + timeout = cred->times.endtime - curtime; if (timeout < 0) timeout = 0; + if (renew) { + *renew = cred->times.renew_till - curtime; + if (*renew < 0) + *renew = 0; + } krb5_free_creds(context, cred); return timeout; } +static time_t expire; + +static char siginfo_msg[1024] = "No credentials\n"; + +static void +update_siginfo_msg(time_t exp, const char *srv) +{ + /* Note that exp is relative time */ + memset(siginfo_msg, 0, sizeof(siginfo_msg)); + memcpy(&siginfo_msg, "Updating...\n", sizeof("Updating...\n")); + if (exp) { + if (srv == NULL) { + snprintf(siginfo_msg, sizeof(siginfo_msg), + N_("kinit: TGT expires in %llu seconds\n", ""), + (unsigned long long)expire); + } else { + snprintf(siginfo_msg, sizeof(siginfo_msg), + N_("kinit: Ticket for %s expired\n", ""), srv); + } + return; + } + + /* Expired creds */ + if (srv == NULL) { + snprintf(siginfo_msg, sizeof(siginfo_msg), + N_("kinit: TGT expired\n", "")); + } else { + snprintf(siginfo_msg, sizeof(siginfo_msg), + N_("kinit: Ticket for %s expired\n", ""), srv); + } +} + +#ifdef HAVE_SIGACTION +static void +handle_siginfo(int sig) +{ + struct iovec iov[2]; + + iov[0].iov_base = rk_UNCONST(siginfo_msg); + iov[0].iov_len = strlen(siginfo_msg); + iov[1].iov_base = "\n"; + iov[1].iov_len = 1; + + writev(STDERR_FILENO, iov, sizeof(iov)/sizeof(iov[0])); +} +#endif + struct renew_ctx { krb5_context context; krb5_ccache ccache; krb5_principal principal; krb5_deltat ticket_life; + krb5_deltat timeout; }; static time_t renew_func(void *ptr) { - struct renew_ctx *ctx = ptr; krb5_error_code ret; - time_t expire; - int new_tickets = 0; + struct renew_ctx *ctx = ptr; + time_t renew_expire; + static time_t exp_delay = 1; - if (renewable_flag) { - ret = renew_validate(ctx->context, renewable_flag, validate_flag, - ctx->ccache, server_str, ctx->ticket_life); - if (ret) - new_tickets = 1; - } else - new_tickets = 1; + /* + * NOTE: We count on the ccache implementation to notice changes to the + * actual ccache filesystem/whatever objects. There should be no ccache + * types for which this is not the case, but it might not hurt to + * re-krb5_cc_resolve() after each successful renew_validate()/ + * get_new_tickets() call. + */ - if (new_tickets) - get_new_tickets(ctx->context, ctx->principal, - ctx->ccache, ctx->ticket_life, 0); + expire = ticket_lifetime(ctx->context, ctx->ccache, ctx->principal, + server_str, &renew_expire); + + /* + * When a keytab is available to obtain new tickets, if we are within + * half of the original ticket lifetime of the renew limit, get a new + * TGT instead of renewing the existing TGT. Note, ctx->ticket_life + * is zero by default (without a '-l' option) and cannot be used to + * set the time scale on which we decide whether we're "close to the + * renew limit". + */ + if (use_keytab || keytab_str) + expire += ctx->timeout; + if (renew_expire > expire) { + ret = renew_validate(ctx->context, 1, validate_flag, ctx->ccache, + server_str, ctx->ticket_life); + } else { + ret = get_new_tickets(ctx->context, ctx->principal, ctx->ccache, + ctx->ticket_life, 0, 0); + } + expire = ticket_lifetime(ctx->context, ctx->ccache, ctx->principal, + server_str, &renew_expire); #ifndef NO_AFS - if(do_afslog && k_hasafs()) + if (ret == 0 && server_str == NULL && do_afslog && k_hasafs()) krb5_afslog(ctx->context, ctx->ccache, NULL, NULL); #endif - expire = ticket_lifetime(ctx->context, ctx->ccache, ctx->principal, - server_str) / 2; - return expire + 1; + update_siginfo_msg(expire, server_str); + + /* + * If our tickets have expired and we been able to either renew them + * or obtain new tickets, then we still call this function but we use + * an exponential backoff. This should take care of the case where + * we are using stored credentials but the KDC has been unavailable + * for some reason... + */ + + if (expire < 1) { + /* + * We can't ask to keep spamming stderr but not syslog, so we warn + * only once. + */ + if (exp_delay == 1) { + krb5_warnx(ctx->context, N_("NOTICE: Could not renew/refresh " + "tickets", "")); + } + if (exp_delay < 7200) + exp_delay += exp_delay / 2 + 1; + return exp_delay; + } + exp_delay = 1; + + return expire / 2 + 1; +} + +static void +set_princ_realm(krb5_context context, + krb5_principal principal, + const char *realm) +{ + krb5_error_code ret; + + if ((ret = krb5_principal_set_realm(context, principal, realm)) != 0) + krb5_err(context, 1, ret, "krb5_principal_set_realm"); +} + +static void +parse_name_realm(krb5_context context, + const char *name, + int flags, + const char *realm, + krb5_principal *princ) +{ + krb5_error_code ret; + + if (realm) + flags |= KRB5_PRINCIPAL_PARSE_NO_DEF_REALM; + if ((ret = krb5_parse_name_flags(context, name, flags, princ)) != 0) + krb5_err(context, 1, ret, "krb5_parse_name_flags"); + if (realm && krb5_principal_get_realm(context, *princ) == NULL) + set_princ_realm(context, *princ, realm); +} + +static char * +get_default_realm(krb5_context context) +{ + char *realm; + krb5_error_code ret; + + if ((ret = krb5_get_default_realm(context, &realm)) != 0) + krb5_err(context, 1, ret, "krb5_get_default_realm"); + return realm; +} + +static void +get_default_principal(krb5_context context, krb5_principal *princ) +{ + krb5_error_code ret; + + if ((ret = krb5_get_default_principal(context, princ)) != 0) + krb5_err(context, 1, ret, "krb5_get_default_principal"); +} + +static char * +get_user_realm(krb5_context context) +{ + krb5_error_code ret; + char *user_realm = NULL; + + /* + * If memory allocation fails, we don't try to use the wrong realm, + * that will trigger misleading error messages complicate support. + */ + krb5_appdefault_string(context, "kinit", NULL, "user_realm", "", + &user_realm); + if (user_realm == NULL) { + ret = krb5_enomem(context); + krb5_err(context, 1, ret, "krb5_appdefault_string"); + } + + if (*user_realm == 0) { + free(user_realm); + user_realm = NULL; + } + + return user_realm; +} + +static void +get_princ(krb5_context context, krb5_principal *principal, const char *name) +{ + krb5_error_code ret; + krb5_principal tmp; + int parseflags = 0; + char *user_realm; + + if (name == NULL) { + krb5_ccache ccache; + + /* If credential cache provides a client principal, use that. */ + if (krb5_cc_default(context, &ccache) == 0) { + ret = krb5_cc_get_principal(context, ccache, principal); + krb5_cc_close(context, ccache); + if (ret == 0) + return; + } + } + + user_realm = get_user_realm(context); + + if (name) { + if (canonicalize_flag || enterprise_flag) + parseflags |= KRB5_PRINCIPAL_PARSE_ENTERPRISE; + + parse_name_realm(context, name, parseflags, user_realm, &tmp); + + if (user_realm && krb5_principal_get_num_comp(context, tmp) > 1) { + /* Principal is instance qualified, reparse with default realm. */ + krb5_free_principal(context, tmp); + parse_name_realm(context, name, parseflags, NULL, principal); + } else { + *principal = tmp; + } + } else { + get_default_principal(context, principal); + if (user_realm) + set_princ_realm(context, *principal, user_realm); + } + + if (user_realm) + free(user_realm); +} + +static void +get_princ_kt(krb5_context context, + krb5_principal *principal, + char *name) +{ + krb5_error_code ret; + krb5_principal tmp; + krb5_ccache ccache; + krb5_kt_cursor cursor; + krb5_keytab_entry entry; + char *def_realm; + + if (name == NULL) { + /* + * If the credential cache exists and specifies a client principal, + * use that. + */ + if (krb5_cc_default(context, &ccache) == 0) { + ret = krb5_cc_get_principal(context, ccache, principal); + krb5_cc_close(context, ccache); + if (ret == 0) + return; + } + } + + if (name) { + /* If the principal specifies an explicit realm, just use that. */ + int parseflags = KRB5_PRINCIPAL_PARSE_NO_DEF_REALM; + + parse_name_realm(context, name, parseflags, NULL, &tmp); + if (krb5_principal_get_realm(context, tmp) != NULL) { + *principal = tmp; + return; + } + } else { + /* Otherwise, search keytab for bare name of the default principal. */ + get_default_principal(context, &tmp); + set_princ_realm(context, tmp, NULL); + } + + def_realm = get_default_realm(context); + + ret = krb5_kt_start_seq_get(context, kt, &cursor); + if (ret) + krb5_err(context, 1, ret, "krb5_kt_start_seq_get"); + + while (ret == 0 && + krb5_kt_next_entry(context, kt, &entry, &cursor) == 0) { + const char *realm; + + if (!krb5_principal_compare_any_realm(context, tmp, entry.principal)) + continue; + if (*principal && + krb5_principal_compare(context, *principal, entry.principal)) + continue; + /* The default realm takes precedence */ + realm = krb5_principal_get_realm(context, entry.principal); + if (*principal && strcmp(def_realm, realm) == 0) { + krb5_free_principal(context, *principal); + ret = krb5_copy_principal(context, entry.principal, principal); + break; + } + if (!*principal) + ret = krb5_copy_principal(context, entry.principal, principal); + } + if (ret != 0 || (ret = krb5_kt_end_seq_get(context, kt, &cursor)) != 0) + krb5_err(context, 1, ret, "get_princ_kt"); + if (!*principal) { + if (name) + parse_name_realm(context, name, 0, NULL, principal); + else + krb5_err(context, 1, KRB5_CC_NOTFOUND, "get_princ_kt"); + } + + krb5_free_principal(context, tmp); + free(def_realm); +} + +static krb5_error_code +get_switched_ccache(krb5_context context, + const char * type, + krb5_principal principal, + krb5_ccache *ccache) +{ + krb5_error_code ret; + +#ifdef _WIN32 + if (strcmp(type, "API") == 0) { + /* + * Windows stores the default ccache name in the + * registry which is shared across multiple logon + * sessions for the same user. The API credential + * cache provides a unique name space per logon + * session. Therefore there is no need to generate + * a unique ccache name. Instead use the principal + * name. This provides a friendlier user experience. + */ + char * unparsed_name; + char * cred_cache; + + ret = krb5_unparse_name(context, principal, + &unparsed_name); + if (ret) + krb5_err(context, 1, ret, + N_("unparsing principal name", "")); + + ret = asprintf(&cred_cache, "API:%s", unparsed_name); + krb5_free_unparsed_name(context, unparsed_name); + if (ret == -1 || cred_cache == NULL) + krb5_err(context, 1, ret, + N_("building credential cache name", "")); + + ret = krb5_cc_resolve(context, cred_cache, ccache); + free(cred_cache); + } else if (strcmp(type, "MSLSA") == 0) { + /* + * The Windows MSLSA cache when it is writeable + * stores tickets for multiple client principals + * in a single credential cache. + */ + ret = krb5_cc_resolve(context, "MSLSA:", ccache); + } else { + ret = krb5_cc_new_unique(context, type, NULL, ccache); + } +#else /* !_WIN32 */ + ret = krb5_cc_new_unique(context, type, NULL, ccache); +#endif /* _WIN32 */ + + return ret; } int -main (int argc, char **argv) +main(int argc, char **argv) { krb5_error_code ret; krb5_context context; krb5_ccache ccache; - krb5_principal principal; + krb5_principal principal = NULL; int optidx = 0; krb5_deltat ticket_life = 0; - int parseflags = 0; +#ifdef HAVE_SIGACTION + struct sigaction sa; +#endif + krb5_boolean unique_ccache = FALSE; + krb5_boolean historical_anon_pkinit = FALSE; + int anonymous_pkinit = FALSE; - setprogname (argv[0]); + setprogname(argv[0]); - setlocale (LC_ALL, ""); - bindtextdomain ("heimdal_kuser", HEIMDAL_LOCALEDIR); + setlocale(LC_ALL, ""); + bindtextdomain("heimdal_kuser", HEIMDAL_LOCALEDIR); textdomain("heimdal_kuser"); - ret = krb5_init_context (&context); + ret = krb5_init_context(&context); if (ret == KRB5_CONFIG_BADFORMAT) - errx (1, "krb5_init_context failed to parse configuration file"); + errx(1, "krb5_init_context failed to parse configuration file"); else if (ret) errx(1, "krb5_init_context failed: %d", ret); - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) - usage (0); + usage(0); - if(version_flag) { + if (version_flag) { print_version(NULL); exit(0); } @@ -758,8 +1300,21 @@ argc -= optidx; argv += optidx; - if (canonicalize_flag || enterprise_flag) - parseflags |= KRB5_PRINCIPAL_PARSE_ENTERPRISE; + krb5_appdefault_boolean(context, "kinit", NULL, "historical_anon_pkinit", + FALSE, &historical_anon_pkinit); + + /* + * Open the keytab now, we use the keytab to determine the principal's + * realm when the requested principal has no realm. + */ + if (use_keytab || keytab_str) { + if (keytab_str) + ret = krb5_kt_resolve(context, keytab_str, &kt); + else + ret = krb5_kt_default(context, &kt); + if (ret) + krb5_err(context, 1, ret, "resolving keytab"); + } if (pk_enterprise_flag) { ret = krb5_pk_enterprise_cert(context, pk_user_id, @@ -770,60 +1325,66 @@ pk_user_id = NULL; - } else if (anonymous_flag) { + } else if (anonymous_flag && argc && argv[0][0] == '@') { + /* If principal argument as @REALM, try anonymous PKINIT */ - ret = krb5_make_principal(context, &principal, argv[0], + ret = krb5_make_principal(context, &principal, &argv[0][1], KRB5_WELLKNOWN_NAME, KRB5_ANON_NAME, NULL); if (ret) krb5_err(context, 1, ret, "krb5_make_principal"); krb5_principal_set_type(context, principal, KRB5_NT_WELLKNOWN); + anonymous_pkinit = TRUE; + } else if (anonymous_flag && historical_anon_pkinit) { + char *realm = argc == 0 ? get_default_realm(context) : + argv[0][0] == '@' ? &argv[0][1] : argv[0]; + ret = krb5_make_principal(context, &principal, realm, + KRB5_WELLKNOWN_NAME, KRB5_ANON_NAME, NULL); + if (ret) + krb5_err(context, 1, ret, "krb5_make_principal"); + krb5_principal_set_type(context, principal, KRB5_NT_WELLKNOWN); + anonymous_pkinit = TRUE; + } else if (use_keytab || keytab_str) { + get_princ_kt(context, &principal, argv[0]); } else { - if (argv[0]) { - ret = krb5_parse_name_flags (context, argv[0], parseflags, - &principal); - if (ret) - krb5_err (context, 1, ret, "krb5_parse_name"); - } else { - ret = krb5_get_default_principal (context, &principal); - if (ret) - krb5_err (context, 1, ret, "krb5_get_default_principal"); - } + get_princ(context, &principal, argv[0]); } - if(fcache_version) + if (fcache_version) krb5_set_fcache_version(context, fcache_version); - if(renewable_flag == -1) + if (renewable_flag == -1) /* this seems somewhat pointless, but whatever */ krb5_appdefault_boolean(context, "kinit", krb5_principal_get_realm(context, principal), "renewable", FALSE, &renewable_flag); - if(do_afslog == -1) + if (do_afslog == -1) krb5_appdefault_boolean(context, "kinit", krb5_principal_get_realm(context, principal), "afslog", TRUE, &do_afslog); - if(cred_cache) + if (cred_cache) ret = krb5_cc_resolve(context, cred_cache, &ccache); else { - if(argc > 1) { + if (argc > 1) { char s[1024]; ret = krb5_cc_new_unique(context, NULL, NULL, &ccache); - if(ret) + if (ret) krb5_err(context, 1, ret, "creating cred cache"); snprintf(s, sizeof(s), "%s:%s", krb5_cc_get_type(context, ccache), krb5_cc_get_name(context, ccache)); setenv("KRB5CCNAME", s, 1); + unique_ccache = TRUE; } else { ret = krb5_cc_cache_match(context, principal, &ccache); if (ret) { const char *type; - ret = krb5_cc_default (context, &ccache); + ret = krb5_cc_default(context, &ccache); if (ret) - krb5_err (context, 1, ret, N_("resolving credentials cache", "")); + krb5_err(context, 1, ret, + N_("resolving credentials cache", "")); /* * Check if the type support switching, and we do, @@ -833,28 +1394,31 @@ type = krb5_cc_get_type(context, ccache); if (krb5_cc_support_switch(context, type)) { krb5_cc_close(context, ccache); - ret = krb5_cc_new_unique(context, type, NULL, &ccache); + ret = get_switched_ccache(context, type, principal, + &ccache); + if (ret == 0) + unique_ccache = TRUE; } } } } if (ret) - krb5_err (context, 1, ret, N_("resolving credentials cache", "")); + krb5_err(context, 1, ret, N_("resolving credentials cache", "")); #ifndef NO_AFS - if(argc > 1 && k_hasafs ()) + if (argc > 1 && k_hasafs()) k_setpag(); #endif if (lifetime) { - int tmp = parse_time (lifetime, "s"); + int tmp = parse_time(lifetime, "s"); if (tmp < 0) - errx (1, N_("unparsable time: %s", ""), lifetime); + errx(1, N_("unparsable time: %s", ""), lifetime); ticket_life = tmp; } - if(addrs_flag == 0 && extra_addresses.num_strings > 0) + if (addrs_flag == 0 && extra_addresses.num_strings > 0) krb5_errx(context, 1, N_("specifying both extra addresses and " "no addresses makes no sense", "")); @@ -873,48 +1437,75 @@ free_getarg_strings(&extra_addresses); } - if(renew_flag || validate_flag) { + if (renew_flag || validate_flag) { ret = renew_validate(context, renew_flag, validate_flag, ccache, server_str, ticket_life); + +#ifndef NO_AFS + if (ret == 0 && server_str == NULL && do_afslog && k_hasafs()) + krb5_afslog(context, ccache, NULL, NULL); +#endif + + if (unique_ccache) + krb5_cc_destroy(context, ccache); exit(ret != 0); } - get_new_tickets(context, principal, ccache, ticket_life, 1); + ret = get_new_tickets(context, principal, ccache, ticket_life, + 1, anonymous_pkinit); + if (ret) { + if (unique_ccache) + krb5_cc_destroy(context, ccache); + exit(1); + } #ifndef NO_AFS - if(do_afslog && k_hasafs()) + if (ret == 0 && server_str == NULL && do_afslog && k_hasafs()) krb5_afslog(context, ccache, NULL, NULL); #endif - if(argc > 1) { + + if (argc > 1) { struct renew_ctx ctx; time_t timeout; - timeout = ticket_lifetime(context, ccache, principal, server_str) / 2; + timeout = ticket_lifetime(context, ccache, principal, + server_str, NULL) / 2; ctx.context = context; ctx.ccache = ccache; ctx.principal = principal; ctx.ticket_life = ticket_life; + ctx.timeout = timeout; + +#ifdef HAVE_SIGACTION + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_handler = handle_siginfo; + + sigaction(SIGINFO, &sa, NULL); +#endif ret = simple_execvp_timed(argv[1], argv+1, renew_func, &ctx, timeout); #define EX_NOEXEC 126 #define EX_NOTFOUND 127 - if(ret == EX_NOEXEC) + if (ret == EX_NOEXEC) krb5_warnx(context, N_("permission denied: %s", ""), argv[1]); - else if(ret == EX_NOTFOUND) + else if (ret == EX_NOTFOUND) krb5_warnx(context, N_("command not found: %s", ""), argv[1]); krb5_cc_destroy(context, ccache); #ifndef NO_AFS - if(k_hasafs()) + if (k_hasafs()) k_unlog(); #endif } else { - krb5_cc_close (context, ccache); + krb5_cc_close(context, ccache); ret = 0; } krb5_free_principal(context, principal); - krb5_free_context (context); + if (kt) + krb5_kt_close(context, kt); + krb5_free_context(context); return ret; } diff --git a/crypto/heimdal/kuser/kinit.cat1 b/crypto/heimdal/kuser/kinit.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kinit.cat1 @@ -0,0 +1,136 @@ +KINIT(1) BSD General Commands Manual KINIT(1) + +NAME + kinit -- acquire initial tickets + +SYNOPSIS + kinit [--afslog] [-c cachename | --cache=cachename] [-f | --forwardable] + [-F | --no-forwardable] [-t keytabname | --keytab=keytabname] [-l + time | --lifetime=time] [-p | --proxiable] [-R | --renew] + [--renewable] [-r time | --renewable-life=time] [-S principal | + --server=principal] [-s time | --start-time=time] + [-k | --use-keytab] [-v | --validate] [-e enctypes | + --enctypes=enctypes] [-a addresses | --extra-addresses=addresses] + [--password-file=filename] [--fcache-version=version-number] + [-A | --no-addresses] [-n | --anonymous] [--enterprise] [--version] + [--help] [principal [command]] + +DESCRIPTION + kinit is used to authenticate to the Kerberos server as principal, or if + none is given, a system generated default (typically your login name at + the default realm), and acquire a ticket granting ticket that can later + be used to obtain tickets for other services. + + Supported options: + + -c cachename --cache=cachename + The credentials cache to put the acquired ticket in, if other + than default. + + -f --forwardable + Obtain a ticket than can be forwarded to another host. + + -F --no-forwardable + Do not obtain a forwardable ticket. + + -t keytabname, --keytab=keytabname + Don't ask for a password, but instead get the key from the speci- + fied keytab. + + -l time, --lifetime=time + Specifies the lifetime of the ticket. The argument can either be + in seconds, or a more human readable string like `1h'. + + -p, --proxiable + Request tickets with the proxiable flag set. + + -R, --renew + Try to renew ticket. The ticket must have the `renewable' flag + set, and must not be expired. + + --renewable + The same as --renewable-life, with an infinite time. + + -r time, --renewable-life=time + The max renewable ticket life. + + -S principal, --server=principal + Get a ticket for a service other than krbtgt/LOCAL.REALM. + + -s time, --start-time=time + Obtain a ticket that starts to be valid time (which can really be + a generic time specification, like `1h') seconds into the future. + + -k, --use-keytab + The same as --keytab, but with the default keytab name (normally + FILE:/etc/krb5.keytab). + + -v, --validate + Try to validate an invalid ticket. + + -e, --enctypes=enctypes + Request tickets with this particular enctype. + + --password-file=filename + read the password from the first line of filename. If the + filename is STDIN, the password will be read from the standard + input. + + --fcache-version=version-number + Create a credentials cache of version version-number. + + -a, --extra-addresses=enctypes + Adds a set of addresses that will, in addition to the systems lo- + cal addresses, be put in the ticket. This can be useful if all + addresses a client can use can't be automatically figured out. + One such example is if the client is behind a firewall. Also + settable via libdefaults/extra_addresses in krb5.conf(5). + + -A, --no-addresses + Request a ticket with no addresses. + + -n, --anonymous + Request an anonymous ticket. With the default (false) setting of + the historical_anon_pkinit configuration parameter, if the prin- + cipal is specified as @REALM, then anonymous PKINIT will be used + to acquire an unauthenticated anonymous ticket and both the + client name and (with fully RFC-comformant KDCs) realm in the re- + turned ticket will be anonymized. Otherwise, authentication pro- + ceeds as normal and the anonymous ticket will have only the + client name anonymized. With historical_anon_pkinit set to true, + the principal is interpreted as a realm even without an at-sign + prefix, and it is not possible to obtain authenticated anonymized + tickets. + + --enterprise + Parse principal as a enterprise (KRB5-NT-ENTERPRISE) name. Enter- + prise names are email like principals that are stored in the name + part of the principal, and since there are two @ characters the + parser needs to know that the first is not a realm. An example + of an enterprise name is "lha@e.kth.se@KTH.SE", and this option + is usually used with canonicalize so that the principal returned + from the KDC will typically be the real principal name. + + --afslog + Gets AFS tickets, converts them to version 4 format, and stores + them in the kernel. Only useful if you have AFS. + + The forwardable, proxiable, ticket_life, and renewable_life options can + be set to a default value from the appdefaults section in krb5.conf, see + krb5_appdefault(3). + + If a command is given, kinit will set up new credentials caches, and AFS + PAG, and then run the given command. When it finishes the credentials + will be removed. + +ENVIRONMENT + KRB5CCNAME + Specifies the default credentials cache. + + KRB5_CONFIG + The file name of krb5.conf, the default being /etc/krb5.conf. + +SEE ALSO + kdestroy(1), klist(1), krb5_appdefault(3), krb5.conf(5) + +HEIMDAL April 25, 2006 HEIMDAL diff --git a/crypto/heimdal/kuser/klist.c b/crypto/heimdal/kuser/klist.c --- a/crypto/heimdal/kuser/klist.c +++ b/crypto/heimdal/kuser/klist.c @@ -34,9 +34,8 @@ */ #include "kuser_locl.h" -#include "rtbl.h" #include "parse_units.h" -#include "kcc-commands.h" +#include "heimtools-commands.h" static char* printable_time_internal(time_t t, int x) @@ -123,6 +122,12 @@ *sp++ = 'A'; if(cred->flags.b.hw_authent) *sp++ = 'H'; + if(cred->flags.b.transited_policy_checked) + *sp++ = 'T'; + if(cred->flags.b.ok_as_delegate) + *sp++ = 'O'; + if(cred->flags.b.anonymous) + *sp++ = 'a'; *sp = '\0'; rtbl_add_column_entry(ct, COL_FLAGS, s); } @@ -130,13 +135,18 @@ } static void -print_cred_verbose(krb5_context context, krb5_creds *cred) +print_cred_verbose(krb5_context context, krb5_creds *cred, int do_json) { size_t j; char *str; krb5_error_code ret; krb5_timestamp sec; + if (do_json) { /* XXX support more json formating later */ + printf("{ \"verbose-supported\" : false }"); + return; + } + krb5_timeofday (context, &sec); ret = krb5_unparse_name(context, cred->server, &str); @@ -150,8 +160,8 @@ exit(1); printf(N_("Client: %s\n", ""), str); free (str); - - { + + if (!krb5_is_config_principal(context, cred->client)) { Ticket t; size_t len; char *s; @@ -220,7 +230,7 @@ } /* - * Print all tickets in `ccache' on stdout, verbosily iff do_verbose. + * Print all tickets in `ccache' on stdout, verbosely if do_verbose. */ static void @@ -229,10 +239,11 @@ krb5_principal principal, int do_verbose, int do_flags, - int do_hidden) + int do_hidden, + int do_json) { + char *str, *name, *fullname; krb5_error_code ret; - char *str, *name; krb5_cc_cursor cursor; krb5_creds creds; krb5_deltat sec; @@ -243,48 +254,52 @@ if (ret) krb5_err (context, 1, ret, "krb5_unparse_name"); - printf ("%17s: %s:%s\n", - N_("Credentials cache", ""), - krb5_cc_get_type(context, ccache), - krb5_cc_get_name(context, ccache)); - printf ("%17s: %s\n", N_("Principal", ""), str); - - ret = krb5_cc_get_friendly_name(context, ccache, &name); - if (ret == 0) { - if (strcmp(name, str) != 0) - printf ("%17s: %s\n", N_("Friendly name", ""), name); - free(name); - } - free (str); - - if(do_verbose) { - printf ("%17s: %d\n", N_("Cache version", ""), - krb5_cc_get_version(context, ccache)); - } else { - krb5_cc_set_flags(context, ccache, KRB5_TC_NOTICKET); - } - - ret = krb5_cc_get_kdc_offset(context, ccache, &sec); - - if (ret == 0 && do_verbose && sec != 0) { - char buf[BUFSIZ]; - int val; - int sig; + ret = krb5_cc_get_full_name(context, ccache, &fullname); + if (ret) + krb5_err (context, 1, ret, "krb5_cc_get_full_name"); - val = sec; - sig = 1; - if (val < 0) { - sig = -1; - val = -val; + if (!do_json) { + printf ("%17s: %s\n", N_("Credentials cache", ""), fullname); + printf ("%17s: %s\n", N_("Principal", ""), str); + + ret = krb5_cc_get_friendly_name(context, ccache, &name); + if (ret == 0) { + if (strcmp(name, str) != 0) + printf ("%17s: %s\n", N_("Friendly name", ""), name); + free(name); } + + if(do_verbose) { + printf ("%17s: %d\n", N_("Cache version", ""), + krb5_cc_get_version(context, ccache)); + } else { + krb5_cc_set_flags(context, ccache, KRB5_TC_NOTICKET); + } + + ret = krb5_cc_get_kdc_offset(context, ccache, &sec); + + if (ret == 0 && do_verbose && sec != 0) { + char buf[BUFSIZ]; + int val; + int sig; + + val = (int)sec; + sig = 1; + if (val < 0) { + sig = -1; + val = -val; + } + + unparse_time (val, buf, sizeof(buf)); - unparse_time (val, buf, sizeof(buf)); - - printf ("%17s: %s%s\n", N_("KDC time offset", ""), - sig == -1 ? "-" : "", buf); + printf ("%17s: %s%s\n", N_("KDC time offset", ""), + sig == -1 ? "-" : "", buf); + } + printf("\n"); + } else { + printf ("{ \"cache\" : \"%s\", \"principal\" : \"%s\", ", fullname, str); } - - printf("\n"); + free(str); ret = krb5_cc_start_seq_get (context, ccache, &cursor); if (ret) @@ -298,7 +313,13 @@ rtbl_add_column(ct, COL_FLAGS, 0); rtbl_add_column(ct, COL_PRINCIPAL, 0); rtbl_set_separator(ct, " "); + if (do_json) { + rtbl_set_flags(ct, RTBL_JSON); + printf("\"tickets\" : "); + } } + if (do_verbose && do_json) + printf("\"tickets\" : ["); while ((ret = krb5_cc_next_cred (context, ccache, &cursor, @@ -306,7 +327,7 @@ if (!do_hidden && krb5_is_config_principal(context, creds.server)) { ; }else if(do_verbose){ - print_cred_verbose(context, &creds); + print_cred_verbose(context, &creds, do_json); }else{ print_cred(context, &creds, ct, do_flags); } @@ -321,6 +342,11 @@ rtbl_format(ct, stdout); rtbl_destroy(ct); } + if (do_json) { + if (do_verbose) + printf("]"); + printf("}"); + } } /* @@ -329,43 +355,21 @@ */ static int -check_for_tgt (krb5_context context, - krb5_ccache ccache, - krb5_principal principal, - time_t *expiration) +check_expiration(krb5_context context, + krb5_ccache ccache, + time_t *expiration) { krb5_error_code ret; - krb5_creds pattern; - krb5_creds creds; - krb5_const_realm client_realm; - int expired; - - krb5_cc_clear_mcred(&pattern); - - client_realm = krb5_principal_get_realm(context, principal); - - ret = krb5_make_principal (context, &pattern.server, - client_realm, KRB5_TGS_NAME, client_realm, NULL); - if (ret) - krb5_err (context, 1, ret, "krb5_make_principal"); - pattern.client = principal; - - ret = krb5_cc_retrieve_cred (context, ccache, 0, &pattern, &creds); - krb5_free_principal (context, pattern.server); - if (ret) { - if (ret == KRB5_CC_END) - return 1; - krb5_err (context, 1, ret, "krb5_cc_retrieve_cred"); - } + time_t t; - expired = time(NULL) > creds.times.endtime; + ret = krb5_cc_get_lifetime(context, ccache, &t); + if (ret || t == 0) + return 1; if (expiration) - *expiration = creds.times.endtime; - - krb5_free_cred_contents (context, &creds); + *expiration = time(NULL) + t; - return expired; + return 0; } /* @@ -405,7 +409,7 @@ continue; t[min(parms.out_size,sizeof(t)-1)] = 0; memcpy(&size_secret_tok, r, sizeof(size_secret_tok)); - /* dont bother about the secret token */ + /* don't bother about the secret token */ r += size_secret_tok + sizeof(size_secret_tok); if (parms.out_size < (r - t) + sizeof(size_public_tok)) continue; @@ -415,7 +419,7 @@ continue; memcpy(&ct, r, size_public_tok); r += size_public_tok; - /* there is a int32_t with length of cellname, but we dont read it */ + /* there is a int32_t with length of cellname, but we don't read it */ r += sizeof(int32_t); cell = r; @@ -448,7 +452,8 @@ static int display_v5_ccache (krb5_context context, krb5_ccache ccache, int do_test, int do_verbose, - int do_flags, int do_hidden) + int do_flags, int do_hidden, + int do_json) { krb5_error_code ret; krb5_principal principal; @@ -457,6 +462,10 @@ ret = krb5_cc_get_principal (context, ccache, &principal); if (ret) { + if (do_json) { + printf("{}"); + return 0; + } if(ret == ENOENT) { if (!do_test) krb5_warnx(context, N_("No ticket file: %s", ""), @@ -466,10 +475,10 @@ krb5_err (context, 1, ret, "krb5_cc_get_principal"); } if (do_test) - exit_status = check_for_tgt (context, ccache, principal, NULL); + exit_status = check_expiration(context, ccache, NULL); else print_tickets (context, ccache, principal, do_verbose, - do_flags, do_hidden); + do_flags, do_hidden, do_json); ret = krb5_cc_close (context, ccache); if (ret) @@ -485,9 +494,9 @@ */ static int -list_caches(krb5_context context) +list_caches(krb5_context context, struct klist_options *opt) { - krb5_cc_cache_cursor cursor; + krb5_cccol_cursor cursor; const char *cdef_name; char *def_name; krb5_error_code ret; @@ -499,51 +508,55 @@ krb5_errx(context, 1, "krb5_cc_default_name"); def_name = strdup(cdef_name); - ret = krb5_cc_cache_get_first (context, NULL, &cursor); - if (ret == KRB5_CC_NOSUPP) + ret = krb5_cccol_cursor_new(context, &cursor); + if (ret == KRB5_CC_NOSUPP) { + free(def_name); return 0; + } else if (ret) krb5_err (context, 1, ret, "krb5_cc_cache_get_first"); ct = rtbl_create(); + rtbl_add_column(ct, COL_DEFCACHE, 0); rtbl_add_column(ct, COL_NAME, 0); rtbl_add_column(ct, COL_CACHENAME, 0); rtbl_add_column(ct, COL_EXPIRES, 0); rtbl_add_column(ct, COL_DEFCACHE, 0); rtbl_set_prefix(ct, " "); - rtbl_set_column_prefix(ct, COL_NAME, ""); + rtbl_set_column_prefix(ct, COL_DEFCACHE, ""); + rtbl_set_column_prefix(ct, COL_NAME, " "); + if (opt->json_flag) + rtbl_set_flags(ct, RTBL_JSON); - while (krb5_cc_cache_next (context, cursor, &id) == 0) { - krb5_principal principal = NULL; + while (krb5_cccol_cursor_next(context, cursor, &id) == 0) { int expired = 0; char *name; time_t t; - ret = krb5_cc_get_principal(context, id, &principal); - if (ret) - continue; - - expired = check_for_tgt (context, id, principal, &t); + expired = check_expiration(context, id, &t); ret = krb5_cc_get_friendly_name(context, id, &name); if (ret == 0) { const char *str; char *fname; + rtbl_add_column_entry(ct, COL_NAME, name); - rtbl_add_column_entry(ct, COL_CACHENAME, - krb5_cc_get_name(context, id)); + free(name); + if (expired) str = N_(">>> Expired <<<", ""); else str = printable_time(t); rtbl_add_column_entry(ct, COL_EXPIRES, str); - free(name); ret = krb5_cc_get_full_name(context, id, &fname); if (ret) krb5_err (context, 1, ret, "krb5_cc_get_full_name"); - if (strcmp(fname, def_name) == 0) + rtbl_add_column_entry(ct, COL_CACHENAME, fname); + if (opt->json_flag) + ; + else if (strcmp(fname, def_name) == 0) rtbl_add_column_entry(ct, COL_DEFCACHE, "*"); else rtbl_add_column_entry(ct, COL_DEFCACHE, ""); @@ -551,16 +564,17 @@ krb5_xfree(fname); } krb5_cc_close(context, id); - - krb5_free_principal(context, principal); } - krb5_cc_cache_end_seq_get(context, cursor); + krb5_cccol_cursor_free(context, &cursor); free(def_name); rtbl_format(ct, stdout); rtbl_destroy(ct); + if (opt->json_flag) + printf("\n"); + return 0; } @@ -582,8 +596,13 @@ opt->test_flag || opt->s_flag; + if(opt->version_flag) { + print_version(NULL); + exit(0); + } + if (opt->list_all_flag) { - exit_status = list_caches(kcc_context); + exit_status = list_caches(heimtools_context, opt); return exit_status; } @@ -592,33 +611,42 @@ if (opt->all_content_flag) { krb5_cc_cache_cursor cursor; + int first = 1; - ret = krb5_cc_cache_get_first(kcc_context, NULL, &cursor); + ret = krb5_cc_cache_get_first(heimtools_context, NULL, &cursor); if (ret) - krb5_err(kcc_context, 1, ret, "krb5_cc_cache_get_first"); + krb5_err(heimtools_context, 1, ret, "krb5_cc_cache_get_first"); + if (opt->json_flag) + printf("["); + while (krb5_cc_cache_next(heimtools_context, cursor, &id) == 0) { + if (opt->json_flag && !first) + printf(","); - while (krb5_cc_cache_next(kcc_context, cursor, &id) == 0) { - exit_status |= display_v5_ccache(kcc_context, id, do_test, + exit_status |= display_v5_ccache(heimtools_context, id, do_test, do_verbose, opt->flags_flag, - opt->hidden_flag); - printf("\n\n"); - } - krb5_cc_cache_end_seq_get(kcc_context, cursor); + opt->hidden_flag, opt->json_flag); + if (!opt->json_flag) + printf("\n\n"); + first = 0; + } + krb5_cc_cache_end_seq_get(heimtools_context, cursor); + if (opt->json_flag) + printf("]"); } else { if(opt->cache_string) { - ret = krb5_cc_resolve(kcc_context, opt->cache_string, &id); + ret = krb5_cc_resolve(heimtools_context, opt->cache_string, &id); if (ret) - krb5_err(kcc_context, 1, ret, "%s", opt->cache_string); + krb5_err(heimtools_context, 1, ret, "%s", opt->cache_string); } else { - ret = krb5_cc_default(kcc_context, &id); + ret = krb5_cc_default(heimtools_context, &id); if (ret) - krb5_err(kcc_context, 1, ret, "krb5_cc_resolve"); + krb5_err(heimtools_context, 1, ret, "krb5_cc_resolve"); } - exit_status = display_v5_ccache(kcc_context, id, do_test, + exit_status = display_v5_ccache(heimtools_context, id, do_test, do_verbose, opt->flags_flag, - opt->hidden_flag); + opt->hidden_flag, opt->json_flag); } } diff --git a/crypto/heimdal/kuser/klist.cat1 b/crypto/heimdal/kuser/klist.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/klist.cat1 @@ -0,0 +1,89 @@ +KLIST(1) BSD General Commands Manual KLIST(1) + +NAME + klist -- list Kerberos credentials + +SYNOPSIS + klist [-c cache | --cache=cache] [-s | -t | --test] [-T | --tokens] + [-5 | --v5] [-v | --verbose] [-l | --list-caches] [-f] [--version] + [--help] + +DESCRIPTION + klist reads and displays the current tickets in the credential cache + (also known as the ticket file). + + Options supported: + + -c cache, --cache=cache + credential cache to list + + -s, -t, --test + Test for there being an active and valid TGT for the local realm + of the user in the credential cache. + + -T, --tokens + display AFS tokens + + -5, --v5 + display v5 cred cache (this is the default) + + -f Include ticket flags in short form, each character stands for a + specific flag, as follows: + F forwardable + f forwarded + P proxiable + p proxied + D postdate-able + d postdated + R renewable + I initial + i invalid + A pre-authenticated + H hardware authenticated + + This information is also output with the --verbose option, but in + a more verbose way. + + -v, --verbose + Verbose output. Include all possible information: + + Server + the principal the ticket is for + + Ticket etype + the encryption type used in the ticket, followed by + the key version of the ticket, if it is available + + Session key + the encryption type of the session key, if it's dif- + ferent from the encryption type of the ticket + + Auth time + the time the authentication exchange took place + + Start time + the time that this ticket is valid from (only printed + if it's different from the auth time) + + End time + when the ticket expires, if it has already expired + this is also noted + + Renew till + the maximum possible end time of any ticket derived + from this one + + Ticket flags + the flags set on the ticket + + Addresses + the set of addresses from which this ticket is valid + + -l, --list-caches + List the credential caches for the current users, not all cache + types supports listing multiple caches. + +SEE ALSO + kdestroy(1), kinit(1) + +HEIMDAL October 6, 2005 HEIMDAL diff --git a/crypto/heimdal/kuser/kswitch.1 b/crypto/heimdal/kuser/kswitch.1 --- a/crypto/heimdal/kuser/kswitch.1 +++ b/crypto/heimdal/kuser/kswitch.1 @@ -29,9 +29,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd Augusti 25, 2009 -.Dt KSWITCH SECTION -.Os OPERATING_SYSTEM +.Dd August 25, 2009 +.Dt KSWITCH 1 +.Os HEIMDAL .Sh NAME .Nm kswitch .Nd switch between default credential caches diff --git a/crypto/heimdal/kuser/kswitch.c b/crypto/heimdal/kuser/kswitch.c --- a/crypto/heimdal/kuser/kswitch.c +++ b/crypto/heimdal/kuser/kswitch.c @@ -32,7 +32,7 @@ */ #include "kuser_locl.h" -#include "kcc-commands.h" +#include "heimtools-commands.h" #ifdef HAVE_READLINE char *readline(const char *prompt); @@ -63,7 +63,7 @@ krb5_ccache id = NULL; if (opt->cache_string && opt->principal_string) - krb5_errx(kcc_context, 1, + krb5_errx(heimtools_context, 1, N_("Both --cache and --principal given, choose one", "")); if (opt->interactive_flag) { @@ -81,33 +81,35 @@ rtbl_add_column_by_id(ct, 2, "Type", 0); rtbl_set_column_affix_by_id(ct, 2, " ", ""); - ret = krb5_cc_cache_get_first(kcc_context, NULL, &cursor); + ret = krb5_cc_cache_get_first(heimtools_context, NULL, &cursor); if (ret) - krb5_err(kcc_context, 1, ret, "krb5_cc_cache_get_first"); + krb5_err(heimtools_context, 1, ret, "krb5_cc_cache_get_first"); - while (krb5_cc_cache_next(kcc_context, cursor, &id) == 0) { + while (krb5_cc_cache_next(heimtools_context, cursor, &id) == 0) { krb5_principal p = NULL; char num[10]; - ret = krb5_cc_get_principal(kcc_context, id, &p); - if (ret == 0) - ret = krb5_unparse_name(kcc_context, p, &name); - if (ret) + ret = krb5_cc_get_principal(heimtools_context, id, &p); + if (ret == 0) + ret = krb5_unparse_name(heimtools_context, p, &name); + if (ret) { + krb5_cc_close(heimtools_context, id); continue; + } - krb5_free_principal(kcc_context, p); + krb5_free_principal(heimtools_context, p); snprintf(num, sizeof(num), "%d", (int)(len + 1)); rtbl_add_column_entry_by_id(ct, 0, num); rtbl_add_column_entry_by_id(ct, 1, name); - rtbl_add_column_entry_by_id(ct, 2, krb5_cc_get_type(kcc_context, id)); + rtbl_add_column_entry_by_id(ct, 2, krb5_cc_get_type(heimtools_context, id)); free(name); ids = erealloc(ids, (len + 1) * sizeof(ids[0])); ids[len] = id; len++; } - krb5_cc_cache_end_seq_get(kcc_context, cursor); + krb5_cc_cache_end_seq_get(heimtools_context, cursor); rtbl_format(ct, stdout); rtbl_destroy(ct); @@ -116,58 +118,62 @@ if (name) { i = atoi(name); if (i == 0) - krb5_errx(kcc_context, 1, "Cache number '%s' is invalid", name); + krb5_errx(heimtools_context, 1, "Cache number '%s' is invalid", name); if (i > len) - krb5_errx(kcc_context, 1, "Cache number '%s' is too large", name); + krb5_errx(heimtools_context, 1, "Cache number '%s' is too large", name); id = ids[i - 1]; ids[i - 1] = NULL; + free(name); } else - krb5_errx(kcc_context, 1, "No cache selected"); + krb5_errx(heimtools_context, 1, "No cache selected"); for (i = 0; i < len; i++) if (ids[i]) - krb5_cc_close(kcc_context, ids[i]); - + krb5_cc_close(heimtools_context, ids[i]); + free(ids); } else if (opt->principal_string) { krb5_principal p; - ret = krb5_parse_name(kcc_context, opt->principal_string, &p); + ret = krb5_parse_name(heimtools_context, opt->principal_string, &p); if (ret) - krb5_err(kcc_context, 1, ret, "krb5_parse_name: %s", + krb5_err(heimtools_context, 1, ret, "krb5_parse_name: %s", opt->principal_string); - ret = krb5_cc_cache_match(kcc_context, p, &id); + ret = krb5_cc_cache_match(heimtools_context, p, &id); if (ret) - krb5_err(kcc_context, 1, ret, + krb5_err(heimtools_context, 1, ret, N_("Did not find principal: %s", ""), opt->principal_string); - krb5_free_principal(kcc_context, p); + krb5_free_principal(heimtools_context, p); } else if (opt->cache_string) { const krb5_cc_ops *ops; char *str; + int aret; - ops = krb5_cc_get_prefix_ops(kcc_context, opt->type_string); + ops = krb5_cc_get_prefix_ops(heimtools_context, opt->type_string); if (ops == NULL) - krb5_err(kcc_context, 1, 0, "krb5_cc_get_prefix_ops"); + krb5_err(heimtools_context, 1, 0, "krb5_cc_get_prefix_ops"); - asprintf(&str, "%s:%s", ops->prefix, opt->cache_string); - if (str == NULL) - krb5_errx(kcc_context, 1, N_("out of memory", "")); + aret = asprintf(&str, "%s:%s", ops->prefix, opt->cache_string); + if (aret == -1) + krb5_errx(heimtools_context, 1, N_("out of memory", "")); - ret = krb5_cc_resolve(kcc_context, str, &id); + ret = krb5_cc_resolve(heimtools_context, str, &id); if (ret) - krb5_err(kcc_context, 1, ret, "krb5_cc_resolve: %s", str); + krb5_err(heimtools_context, 1, ret, "krb5_cc_resolve: %s", str); free(str); } else { - krb5_errx(kcc_context, 1, "missing option for kswitch"); + krb5_errx(heimtools_context, 1, "missing option for kswitch"); } - ret = krb5_cc_switch(kcc_context, id); + ret = krb5_cc_switch(heimtools_context, id); if (ret) - krb5_err(kcc_context, 1, ret, "krb5_cc_switch"); + krb5_err(heimtools_context, 1, ret, "krb5_cc_switch"); + + krb5_cc_close(heimtools_context, id); return 0; } diff --git a/crypto/heimdal/kuser/kswitch.cat1 b/crypto/heimdal/kuser/kswitch.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kswitch.cat1 @@ -0,0 +1,31 @@ +KSWITCH(1) BSD General Commands Manual KSWITCH(1) + +NAME + kswitch -- switch between default credential caches + +SYNOPSIS + kswitch [-t type | --type=type] [-c cache | --cache=cache] [-p principal + | --principal=principal] [-i | --interactive] [--version] + [--help] + +DESCRIPTION + Supported options: + + -t type, --type=type + type of credential cache + + -c cache, --cache=cache + name of credential cache to switch to + + -p principal, --principal=principal + name of principal to switch to + + -i, --interactive + interactive switching between credentials. + + --version + print version + + --help + +HEIMDAL August 25, 2009 HEIMDAL diff --git a/crypto/heimdal/kuser/kuser_locl.h b/crypto/heimdal/kuser/kuser_locl.h --- a/crypto/heimdal/kuser/kuser_locl.h +++ b/crypto/heimdal/kuser/kuser_locl.h @@ -103,6 +103,6 @@ #define textdomain(package) #endif -extern krb5_context kcc_context; +extern krb5_context heimtools_context; #endif /* __KUSER_LOCL_H__ */ diff --git a/crypto/heimdal/kuser/kverify.c b/crypto/heimdal/kuser/kverify.c --- a/crypto/heimdal/kuser/kverify.c +++ b/crypto/heimdal/kuser/kverify.c @@ -37,8 +37,8 @@ static int version_flag = 0; static struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; static void diff --git a/crypto/heimdal/kuser/kvno.c b/crypto/heimdal/kuser/kvno.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/kuser/kvno.c @@ -0,0 +1,278 @@ +/* + * Copyright (C) 1998 by the FundsXpress, INC. + * + * All rights reserved. + * + * Export of this software from the United States of America may require + * a specific license from the United States Government. It is the + * responsibility of any person or organization contemplating export to + * obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + * distribute this software and its documentation for any purpose and + * without fee is hereby granted, provided that the above copyright + * notice appear in all copies and that both that copyright notice and + * this permission notice appear in supporting documentation, and that + * the name of FundsXpress. not be used in advertising or publicity pertaining + * to distribution of the software without specific, written prior + * permission. FundsXpress makes no representations about the suitability of + * this software for any purpose. It is provided "as is" without express + * or implied warranty. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "kuser_locl.h" + +static char *etype_str = NULL; +static char *ccache_name = NULL; +static char *keytab_name = NULL; +static char *sname = NULL; + +static int version_flag = 0; +static int help_flag = 0; +static int quiet_flag = 0; + +static void do_v5_kvno (int argc, char *argv[], + char *ccache_name, char *etype_str, char *keytab_name, + char *sname); + +struct getargs args[] = { + { "enctype", 'e', arg_string, &etype_str, + NP_("Encryption type to use", ""), "enctype" }, + { "cache", 'c', arg_string, &ccache_name, + NP_("Credentials cache", ""), "cachename" }, + { "keytab", 'k', arg_string, &keytab_name, + NP_("Keytab to use", ""), "keytabname" }, + { "server", 'S', arg_string, &sname, + NP_("Server to get ticket for", ""), "principal" }, + { "quiet", 'q', arg_flag, &quiet_flag, + NP_("Quiet", "") }, + { "version", 0, arg_flag, &version_flag }, + { "help", 0, arg_flag, &help_flag } +}; + +static void +usage(int ret) +{ + arg_printusage_i18n (args, sizeof(args)/sizeof(*args), + N_("Usage: ", ""), NULL, + "principal1 [principal2 ...]", + getarg_i18n); + exit (ret); +} + +int main(int argc, char *argv[]) +{ + int optidx = 0; + + setprogname (argv[0]); + + setlocale(LC_ALL, ""); + bindtextdomain ("heimdal_kuser", HEIMDAL_LOCALEDIR); + textdomain("heimdal_kuser"); + + if (getarg(args, sizeof(args)/sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if (version_flag) { + print_version(NULL); + exit (0); + } + + argc -= optidx; + argv += optidx; + + do_v5_kvno(argc, argv, ccache_name, etype_str, keytab_name, sname); + + return 0; +} + +static void do_v5_kvno (int count, char *names[], + char * ccache_name, char *etype_str, char *keytab_name, + char *sname) +{ + krb5_error_code ret; + krb5_context context = 0; + int i, errors; + krb5_enctype etype; + krb5_ccache ccache; + krb5_principal me; + krb5_creds in_creds, *out_creds = NULL; + Ticket ticket; + size_t len; + char *princ = NULL; + krb5_keytab keytab = NULL; + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_context failed: %d", ret); + + if (etype_str) { + ret = krb5_string_to_enctype(context, etype_str, &etype); + if (ret) + krb5_err(context, 1, ret, "Failed to convert encryption type %s", etype_str); + } else { + etype = 0; + } + + if (ccache_name) + ret = krb5_cc_resolve(context, ccache_name, &ccache); + else + ret = krb5_cc_default(context, &ccache); + if (ret) + krb5_err(context, 1, ret, "Failed to open credentials cache %s", + (ccache_name) ? ccache_name : "(Default)"); + + if (keytab_name) { + ret = krb5_kt_resolve(context, keytab_name, &keytab); + if (ret) + krb5_err(context, 1, ret, "Can't resolve keytab %s", keytab_name); + } + + ret = krb5_cc_get_principal(context, ccache, &me); + if (ret) + krb5_err(context, 1, ret, "krb5_cc_get_principal"); + + errors = 0; + + for (i = 0; i < count; i++) { + memset(&in_creds, 0, sizeof(in_creds)); + memset(&ticket, 0, sizeof(ticket)); + + in_creds.client = me; + + if (sname != NULL) { + ret = krb5_sname_to_principal(context, names[i], + sname, KRB5_NT_SRV_HST, + &in_creds.server); + } else { + ret = krb5_parse_name(context, names[i], &in_creds.server); + } + if (ret) { + if (!quiet_flag) + krb5_warn(context, ret, "Couldn't parse principal name %s", names[i]); + errors++; + continue; + } + + ret = krb5_unparse_name(context, in_creds.server, &princ); + if (ret) { + krb5_warn(context, ret, "Couldn't format parsed principal name for '%s'", + names[i]); + errors++; + goto next; + } + + in_creds.session.keytype = etype; + + ret = krb5_get_credentials(context, 0, ccache, &in_creds, &out_creds); + + if (ret) { + krb5_warn(context, ret, "Couldn't get credentials for %s", princ); + errors++; + goto next; + } + + ret = decode_Ticket(out_creds->ticket.data, out_creds->ticket.length, + &ticket, &len); + if (ret) { + krb5_err(context, 1, ret, "Can't decode ticket for %s", princ); + errors++; + goto next; + continue; + } + + if (keytab) { + krb5_keytab_entry kte; + krb5_crypto crypto; + krb5_data dec_data; + EncTicketPart decr_part; + + ret = krb5_kt_get_entry(context, keytab, in_creds.server, + (ticket.enc_part.kvno != NULL)? + *ticket.enc_part.kvno : 0, + ticket.enc_part.etype, + &kte); + if (ret) { + krb5_warn(context, ret, "Can't decrypt ticket for %s", princ); + if (!quiet_flag) + printf("%s: kvno = %d, keytab entry invalid", princ, + (ticket.enc_part.kvno != NULL)? + *ticket.enc_part.kvno : 0); + errors ++; + goto next; + } + + ret = krb5_crypto_init(context, &kte.keyblock, 0, &crypto); + if (ret) { + krb5_warn(context, ret, "krb5_crypto_init"); + errors ++; + krb5_kt_free_entry(context, &kte); + goto next; + } + + ret = krb5_decrypt_EncryptedData (context, crypto, KRB5_KU_TICKET, + &ticket.enc_part, &dec_data); + krb5_crypto_destroy(context, crypto); + krb5_kt_free_entry(context, &kte); + + if (ret) { + krb5_warn(context, ret, "krb5_decrypt_EncryptedData"); + errors ++; + goto next; + } + + ret = decode_EncTicketPart(dec_data.data, dec_data.length, + &decr_part, &len); + krb5_data_free(&dec_data); + if (ret) { + krb5_warn(context, ret, "decode_EncTicketPart"); + errors ++; + goto next; + } + + if (!quiet_flag) + printf("%s: kvno = %d, keytab entry valid\n", princ, + (ticket.enc_part.kvno != NULL)? + *ticket.enc_part.kvno : 0); + + free_EncTicketPart(&decr_part); + } else { + if (!quiet_flag) + printf("%s: kvno = %d\n", princ, + (ticket.enc_part.kvno != NULL)? *ticket.enc_part.kvno : 0); + } + + next: + if (out_creds) { + krb5_free_creds(context, out_creds); + out_creds = NULL; + } + + if (princ) { + krb5_free_unparsed_name(context, princ); + princ = NULL; + } + + krb5_free_principal(context, in_creds.server); + + free_Ticket(&ticket); + } + + if (keytab) + krb5_kt_close(context, keytab); + krb5_free_principal(context, me); + krb5_cc_close(context, ccache); + krb5_free_context(context); + + if (errors) + exit(1); + + exit(0); +} diff --git a/crypto/heimdal/lib/Makefile.am b/crypto/heimdal/lib/Makefile.am --- a/crypto/heimdal/lib/Makefile.am +++ b/crypto/heimdal/lib/Makefile.am @@ -14,15 +14,19 @@ if COM_ERR dir_com_err = com_err endif -if !HAVE_OPENSSL -dir_hcrypto = hcrypto -endif if !SQLITE3 dir_sqlite = sqlite endif +if MAINTAINER_MODE +dir_sqlite = sqlite +endif +if !NO_AFS +dir_afs = kafs +endif SUBDIRS = \ roken \ + base \ vers \ $(dir_editline) \ $(dir_com_err) \ @@ -30,12 +34,12 @@ wind \ asn1 \ $(dir_sqlite) \ - $(dir_hcrypto) \ + hcrypto \ ipc \ hx509 \ krb5 \ ntlm \ - kafs \ + $(dir_afs) \ gssapi \ hdb \ kadm5 \ diff --git a/crypto/heimdal/lib/Makefile.in b/crypto/heimdal/lib/Makefile.in --- a/crypto/heimdal/lib/Makefile.in +++ b/crypto/heimdal/lib/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -21,6 +20,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -39,14 +93,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common subdir = lib ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -57,8 +107,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -71,6 +120,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -90,28 +140,68 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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 +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-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 = roken vers libedit com_err sl wind asn1 sqlite hcrypto \ - ipc hx509 krb5 ntlm kafs gssapi hdb kadm5 otp kdfs +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = roken base vers libedit com_err sl wind asn1 sqlite \ + hcrypto ipc hx509 krb5 ntlm kafs gssapi hdb kadm5 otp kdfs +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ @@ -141,7 +231,9 @@ ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -156,16 +248,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -175,17 +270,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -204,12 +301,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -218,6 +312,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -234,10 +329,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -245,6 +338,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -259,12 +353,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -281,10 +378,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -295,13 +398,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -325,6 +422,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -348,9 +447,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -360,37 +464,47 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; @LIBEDIT_TRUE@dir_editline = libedit @OTP_TRUE@dir_otp = otp @DCE_TRUE@dir_dce = kdfs @COM_ERR_TRUE@dir_com_err = com_err -@HAVE_OPENSSL_FALSE@dir_hcrypto = hcrypto +@MAINTAINER_MODE_TRUE@dir_sqlite = sqlite @SQLITE3_FALSE@dir_sqlite = sqlite +@NO_AFS_FALSE@dir_afs = kafs SUBDIRS = \ roken \ + base \ vers \ $(dir_editline) \ $(dir_com_err) \ @@ -398,12 +512,12 @@ wind \ asn1 \ $(dir_sqlite) \ - $(dir_hcrypto) \ + hcrypto \ ipc \ hx509 \ krb5 \ ntlm \ - kafs \ + $(dir_afs) \ gssapi \ hdb \ kadm5 \ @@ -414,7 +528,7 @@ all: all-recursive .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -427,15 +541,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -453,22 +567,25 @@ -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): - @fail= failcom='exit 1'; \ - for f in x $$MAKEFLAGS; do \ - case $$f in \ - *=* | --[!k]*);; \ - *k*) failcom='fail=yes';; \ - esac; \ - done; \ +# 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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ + 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; \ @@ -483,57 +600,12 @@ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" -$(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; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - rev=''; for subdir in $$list; do \ - if test "$$subdir" = "."; then :; else \ - rev="$$subdir $$rev"; \ - fi; \ - done; \ - rev="$$rev ."; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || eval $$failcom; \ - done && 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 +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags -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) +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ @@ -549,12 +621,7 @@ 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -566,15 +633,11 @@ $$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; }; }'`; \ +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -583,11 +646,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -619,13 +699,10 @@ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ - test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || 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; \ @@ -664,10 +741,15 @@ installcheck: installcheck-recursive install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -706,9 +788,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-recursive install-html-am: @@ -748,40 +829,53 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ - ctags-recursive install-am install-data-am install-exec-am \ - install-strip tags-recursive uninstall-am - -.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ - all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool ctags ctags-recursive dist-hook \ - 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-data-hook \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook 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 \ +.MAKE: $(am__recursive_targets) check-am install-am install-data-am \ + install-strip uninstall-am + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + check check-am check-local clean clean-generic clean-libtool \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook 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 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-hook + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -789,7 +883,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -834,11 +928,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -846,6 +949,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -888,6 +993,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -901,13 +1019,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/lib/NTMakefile b/crypto/heimdal/lib/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/NTMakefile @@ -0,0 +1,79 @@ +######################################################################## +# +# Copyright (c) 2009-2016, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + + +!ifdef OTP +dir_otp = otp +!endif +!ifdef DCE +dir_dce = kdfs +!endif + +# Third party plugins must be added to the assembly +# Permit third party assembly scripts + +!if exist(..\thirdparty\plugin\NTMakefile) +plugin=..\thirdparty\plugin +!endif + +!if exist(..\thirdparty\assembly\NTMakefile) +assembly=..\thirdparty\assembly +!else +assembly=..\packages\windows\assembly +!endif + +SUBDIRS = roken base vers com_err sl wind asn1 sqlite \ + hcrypto hx509 krb5 heimdal ntlm kafs gssapi hdb \ + kadm5 $(dir_otp) $(dir_dce) $(plugin) $(assembly) + +!include ../windows/NTMakefile.w32 + +# We can't build some of the lib tools until after we have LIBHEIMDAL. +# So we build tools in a separate build step: + +all:: all-tools + +all-tools:: asn1-tools hx509-tools krb5-tools kadm5-tools gss-tools + +asn1-tools: + @( cd asn1 && $(RMAKE) all-tools && cd .. ) || exit /b 1 + +hx509-tools: + @( cd hx509 && $(RMAKE) all-tools && cd .. ) || exit /b 1 + +krb5-tools: + @( cd krb5 && $(RMAKE) all-tools && cd .. ) || exit /b 1 + +kadm5-tools: + @( cd kadm5 && $(RMAKE) all-tools && cd .. ) || exit /b 1 + +gss-tools: + @( cd gssapi && $(RMAKE) all-tools && cd ..) || exit /b 1 diff --git a/crypto/heimdal/lib/asn1/Makefile.am b/crypto/heimdal/lib/asn1/Makefile.am --- a/crypto/heimdal/lib/asn1/Makefile.am +++ b/crypto/heimdal/lib/asn1/Makefile.am @@ -4,6 +4,8 @@ YFLAGS = -d -t +AM_CPPFLAGS += $(ROKEN_RENAME) + lib_LTLIBRARIES = libasn1.la libasn1_la_LDFLAGS = -version-info 8:0:0 @@ -37,6 +39,7 @@ gen_files_pkcs12 = asn1_pkcs12_asn1.x gen_files_pkcs8 = asn1_pkcs8_asn1.x gen_files_pkcs9 = asn1_pkcs9_asn1.x +gen_files_test_template = test_template_asn1-template.x gen_files_test = asn1_test_asn1.x gen_files_digest = asn1_digest_asn1.x gen_files_kx509 = asn1_kx509_asn1.x @@ -53,7 +56,7 @@ check_der_SOURCES = check-der.c check-common.c check-common.h check_template_SOURCES = check-template.c check-common.c check-common.h -nodist_check_template_SOURCES = $(gen_files_test:.x=.c) +nodist_check_template_SOURCES = $(gen_files_test_template) dist_check_gen_SOURCES = check-gen.c check-common.c check-common.h nodist_check_gen_SOURCES = $(gen_files_test:.x=.c) @@ -94,8 +97,10 @@ der_copy.c \ der_cmp.c \ der_format.c \ + fuzzer.c \ heim_asn1.h \ extra.c \ + roken_rename.h \ template.c \ timegm.c @@ -134,7 +139,9 @@ $(gen_files_pkcs12) \ $(gen_files_digest) \ $(gen_files_kx509) \ - $(gen_files_test) $(nodist_check_gen_SOURCES) \ + $(gen_files_test) \ + $(gen_files_test_template) \ + $(nodist_check_gen_SOURCES) \ asn1_err.c asn1_err.h \ rfc2459_asn1_files rfc2459_asn1*.h* \ cms_asn1_files cms_asn1*.h* \ @@ -145,9 +152,12 @@ pkcs12_asn1_files pkcs12_asn1*.h* \ digest_asn1_files digest_asn1*.h* \ kx509_asn1_files kx509_asn1*.h* \ - test_asn1_files test_asn1*.h* + test_asn1_files test_asn1*.h* \ + test_template_asn1* \ + asn1_*.x -dist_include_HEADERS = der.h heim_asn1.h der-protos.h der-private.h +dist_include_HEADERS = der.h heim_asn1.h +dist_include_HEADERS += $(srcdir)/der-protos.h $(srcdir)/der-private.h dist_include_HEADERS += asn1-common.h nodist_include_HEADERS = asn1_err.h @@ -170,6 +180,7 @@ priv_headers += pkcs12_asn1-priv.h priv_headers += digest_asn1-priv.h priv_headers += kx509_asn1-priv.h +priv_headers += test_template_asn1.h test_template_asn1-priv.h priv_headers += test_asn1.h test_asn1-priv.h @@ -193,6 +204,7 @@ $(gen_files_rfc2459) rfc2459_asn1.hx rfc2459_asn1-priv.hx: rfc2459_asn1_files $(gen_files_cms) cms_asn1.hx cms_asn1-priv.hx: cms_asn1_files $(gen_files_test) test_asn1.hx test_asn1-priv.hx: test_asn1_files +$(gen_files_test_template) test_template_asn1.hx test_template_asn1-priv.hx: test_template_asn1_files rfc2459_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/rfc2459.asn1 $(ASN1_COMPILE) --one-code-file --preserve-binary=TBSCertificate --preserve-binary=TBSCRLCertList --preserve-binary=Name --sequence=GeneralNames --sequence=Extensions --sequence=CRLDistributionPoints $(srcdir)/rfc2459.asn1 rfc2459_asn1 || (rm -f rfc2459_asn1_files ; exit 1) @@ -221,12 +233,16 @@ kx509_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/kx509.asn1 $(ASN1_COMPILE) --one-code-file $(srcdir)/kx509.asn1 kx509_asn1 || (rm -f kx509_asn1_files ; exit 1) +test_template_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1 + $(ASN1_COMPILE) --template --sequence=TESTSeqOf $(srcdir)/test.asn1 test_template_asn1 || (rm -f test_template_asn1_files ; exit 1) + test_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1 $(ASN1_COMPILE) --one-code-file --sequence=TESTSeqOf $(srcdir)/test.asn1 test_asn1 || (rm -f test_asn1_files ; exit 1) EXTRA_DIST = \ NTMakefile \ + README.template \ asn1_compile-version.rc \ libasn1-exports.def \ cms.asn1 \ @@ -247,8 +263,19 @@ test.gen \ version-script.map -$(srcdir)/der-protos.h: +DER_PROTOS = $(srcdir)/der-protos.h $(srcdir)/der-private.h + +ALL_OBJECTS = $(libasn1_la_OBJECTS) +ALL_OBJECTS += $(libasn1base_la_OBJECTS) +ALL_OBJECTS += $(asn1_print_OBJECTS) +ALL_OBJECTS += $(asn1_compile_OBJECTS) +ALL_OBJECTS += $(asn1_gen_OBJECTS) +ALL_OBJECTS += $(check_template_OBJECTS) + +$(ALL_OBJECTS): $(DER_PROTOS) asn1_err.h + +$(srcdir)/der-protos.h: $(dist_libasn1base_la_SOURCES) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -o der-protos.h $(dist_libasn1base_la_SOURCES) || rm -f der-protos.h -$(srcdir)/der-private.h: +$(srcdir)/der-private.h: $(dist_libasn1base_la_SOURCES) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p der-private.h $(dist_libasn1base_la_SOURCES) || rm -f der-private.h diff --git a/crypto/heimdal/lib/asn1/Makefile.in b/crypto/heimdal/lib/asn1/Makefile.in --- a/crypto/heimdal/lib/asn1/Makefile.in +++ b/crypto/heimdal/lib/asn1/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,10 +96,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(dist_include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog asn1parse.c \ - asn1parse.h lex.c @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map noinst_PROGRAMS = asn1_gen$(EXEEXT) libexec_heimdal_PROGRAMS = asn1_compile$(EXEEXT) asn1_print$(EXEEXT) @@ -56,7 +106,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -67,8 +116,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -81,6 +129,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -100,10 +149,19 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = check-der$(EXEEXT) check-gen$(EXEEXT) \ + check-timegm$(EXEEXT) check-ber$(EXEEXT) \ + check-template$(EXEEXT) +am__installdirs = "$(DESTDIR)$(libexec_heimdaldir)" \ + "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" \ + "$(DESTDIR)$(includedir)" +PROGRAMS = $(libexec_heimdal_PROGRAMS) $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -125,9 +183,12 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" \ - "$(DESTDIR)$(libexec_heimdaldir)" "$(DESTDIR)$(includedir)" \ - "$(DESTDIR)$(includedir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libasn1_la_DEPENDENCIES = libasn1base.la $(am__DEPENDENCIES_1) @@ -145,20 +206,20 @@ $(am__objects_7) $(am__objects_8) $(am__objects_9) nodist_libasn1_la_OBJECTS = $(am__objects_10) libasn1_la_OBJECTS = $(nodist_libasn1_la_OBJECTS) -libasn1_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libasn1_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libasn1_la_LDFLAGS) $(LDFLAGS) -o $@ libasn1base_la_LIBADD = dist_libasn1base_la_OBJECTS = der.lo der_get.lo der_put.lo der_free.lo \ - der_length.lo der_copy.lo der_cmp.lo der_format.lo extra.lo \ - template.lo timegm.lo + der_length.lo der_copy.lo der_cmp.lo der_format.lo fuzzer.lo \ + extra.lo template.lo timegm.lo nodist_libasn1base_la_OBJECTS = asn1_err.lo libasn1base_la_OBJECTS = $(dist_libasn1base_la_OBJECTS) \ $(nodist_libasn1base_la_OBJECTS) -am__EXEEXT_1 = check-der$(EXEEXT) check-gen$(EXEEXT) \ - check-timegm$(EXEEXT) check-ber$(EXEEXT) \ - check-template$(EXEEXT) -PROGRAMS = $(libexec_heimdal_PROGRAMS) $(noinst_PROGRAMS) am_asn1_compile_OBJECTS = asn1parse.$(OBJEXT) gen.$(OBJEXT) \ gen_copy.$(OBJEXT) gen_decode.$(OBJEXT) gen_encode.$(OBJEXT) \ gen_free.$(OBJEXT) gen_glue.$(OBJEXT) gen_length.$(OBJEXT) \ @@ -189,34 +250,93 @@ check_gen_DEPENDENCIES = libasn1.la $(am__DEPENDENCIES_1) am_check_template_OBJECTS = check-template.$(OBJEXT) \ check-common.$(OBJEXT) -nodist_check_template_OBJECTS = $(am__objects_11) +am__objects_12 = test_template_asn1-template.$(OBJEXT) +nodist_check_template_OBJECTS = $(am__objects_12) check_template_OBJECTS = $(am_check_template_OBJECTS) \ $(nodist_check_template_OBJECTS) check_template_DEPENDENCIES = $(am__DEPENDENCIES_2) check_timegm_SOURCES = check-timegm.c check_timegm_OBJECTS = check-timegm.$(OBJEXT) check_timegm_DEPENDENCIES = $(am__DEPENDENCIES_2) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/asn1_cms_asn1.Plo \ + ./$(DEPDIR)/asn1_digest_asn1.Plo ./$(DEPDIR)/asn1_err.Plo \ + ./$(DEPDIR)/asn1_gen.Po ./$(DEPDIR)/asn1_krb5_asn1.Plo \ + ./$(DEPDIR)/asn1_kx509_asn1.Plo \ + ./$(DEPDIR)/asn1_pkcs12_asn1.Plo \ + ./$(DEPDIR)/asn1_pkcs8_asn1.Plo \ + ./$(DEPDIR)/asn1_pkcs9_asn1.Plo \ + ./$(DEPDIR)/asn1_pkinit_asn1.Plo ./$(DEPDIR)/asn1_print.Po \ + ./$(DEPDIR)/asn1_rfc2459_asn1.Plo \ + ./$(DEPDIR)/asn1_test_asn1.Po ./$(DEPDIR)/asn1parse.Po \ + ./$(DEPDIR)/check-ber.Po ./$(DEPDIR)/check-common.Po \ + ./$(DEPDIR)/check-der.Po ./$(DEPDIR)/check-gen.Po \ + ./$(DEPDIR)/check-template.Po ./$(DEPDIR)/check-timegm.Po \ + ./$(DEPDIR)/der.Plo ./$(DEPDIR)/der_cmp.Plo \ + ./$(DEPDIR)/der_copy.Plo ./$(DEPDIR)/der_format.Plo \ + ./$(DEPDIR)/der_free.Plo ./$(DEPDIR)/der_get.Plo \ + ./$(DEPDIR)/der_length.Plo ./$(DEPDIR)/der_put.Plo \ + ./$(DEPDIR)/extra.Plo ./$(DEPDIR)/fuzzer.Plo \ + ./$(DEPDIR)/gen.Po ./$(DEPDIR)/gen_copy.Po \ + ./$(DEPDIR)/gen_decode.Po ./$(DEPDIR)/gen_encode.Po \ + ./$(DEPDIR)/gen_free.Po ./$(DEPDIR)/gen_glue.Po \ + ./$(DEPDIR)/gen_length.Po ./$(DEPDIR)/gen_seq.Po \ + ./$(DEPDIR)/gen_template.Po ./$(DEPDIR)/hash.Po \ + ./$(DEPDIR)/lex.Po ./$(DEPDIR)/main.Po ./$(DEPDIR)/symbol.Po \ + ./$(DEPDIR)/template.Plo \ + ./$(DEPDIR)/test_template_asn1-template.Po \ + ./$(DEPDIR)/timegm.Plo 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) +AM_V_LEX = $(am__v_LEX_@AM_V@) +am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) +am__v_LEX_0 = @echo " LEX " $@; +am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ + -e s/c++$$/h++/ -e s/c$$/h/ +YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) +AM_V_YACC = $(am__v_YACC_@AM_V@) +am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) +am__v_YACC_0 = @echo " YACC " $@; +am__v_YACC_1 = SOURCES = $(nodist_libasn1_la_SOURCES) $(dist_libasn1base_la_SOURCES) \ $(nodist_libasn1base_la_SOURCES) $(asn1_compile_SOURCES) \ $(asn1_gen_SOURCES) $(asn1_print_SOURCES) check-ber.c \ @@ -227,16 +347,219 @@ $(asn1_gen_SOURCES) $(asn1_print_SOURCES) check-ber.c \ $(check_der_SOURCES) $(dist_check_gen_SOURCES) \ $(check_template_SOURCES) check-timegm.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac HEADERS = $(dist_include_HEADERS) $(nodist_include_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver $(top_srcdir)/ylwrap ChangeLog \ + asn1parse.c asn1parse.h lex.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -251,16 +574,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -270,17 +596,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -299,12 +627,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -313,6 +638,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -329,10 +655,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -340,6 +664,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -354,12 +679,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -376,10 +704,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -390,13 +724,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = -d -t abs_builddir = @abs_builddir@ @@ -420,6 +748,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -443,9 +773,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -455,29 +790,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) +AM_CPPFLAGS = $(INCLUDES_roken) $(ROKEN_RENAME) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; lib_LTLIBRARIES = libasn1.la libasn1_la_LDFLAGS = -version-info 8:0:0 $(am__append_1) noinst_LTLIBRARIES = libasn1base.la @@ -504,6 +847,7 @@ gen_files_pkcs12 = asn1_pkcs12_asn1.x gen_files_pkcs8 = asn1_pkcs8_asn1.x gen_files_pkcs9 = asn1_pkcs9_asn1.x +gen_files_test_template = test_template_asn1-template.x gen_files_test = asn1_test_asn1.x gen_files_digest = asn1_digest_asn1.x gen_files_kx509 = asn1_kx509_asn1.x @@ -511,7 +855,7 @@ asn1_print_SOURCES = asn1_print.c check_der_SOURCES = check-der.c check-common.c check-common.h check_template_SOURCES = check-template.c check-common.c check-common.h -nodist_check_template_SOURCES = $(gen_files_test:.x=.c) +nodist_check_template_SOURCES = $(gen_files_test_template) dist_check_gen_SOURCES = check-gen.c check-common.c check-common.h nodist_check_gen_SOURCES = $(gen_files_test:.x=.c) build_HEADERZ = asn1-template.h @@ -549,8 +893,10 @@ der_copy.c \ der_cmp.c \ der_format.c \ + fuzzer.c \ heim_asn1.h \ extra.c \ + roken_rename.h \ template.c \ timegm.c @@ -586,7 +932,9 @@ $(gen_files_pkcs12) \ $(gen_files_digest) \ $(gen_files_kx509) \ - $(gen_files_test) $(nodist_check_gen_SOURCES) \ + $(gen_files_test) \ + $(gen_files_test_template) \ + $(nodist_check_gen_SOURCES) \ asn1_err.c asn1_err.h \ rfc2459_asn1_files rfc2459_asn1*.h* \ cms_asn1_files cms_asn1*.h* \ @@ -597,19 +945,23 @@ pkcs12_asn1_files pkcs12_asn1*.h* \ digest_asn1_files digest_asn1*.h* \ kx509_asn1_files kx509_asn1*.h* \ - test_asn1_files test_asn1*.h* + test_asn1_files test_asn1*.h* \ + test_template_asn1* \ + asn1_*.x -dist_include_HEADERS = der.h heim_asn1.h der-protos.h der-private.h \ - asn1-common.h +dist_include_HEADERS = der.h heim_asn1.h $(srcdir)/der-protos.h \ + $(srcdir)/der-private.h asn1-common.h nodist_include_HEADERS = asn1_err.h krb5_asn1.h pkinit_asn1.h \ cms_asn1.h rfc2459_asn1.h pkcs8_asn1.h pkcs9_asn1.h \ pkcs12_asn1.h digest_asn1.h kx509_asn1.h priv_headers = krb5_asn1-priv.h pkinit_asn1-priv.h cms_asn1-priv.h \ rfc2459_asn1-priv.h pkcs8_asn1-priv.h pkcs9_asn1-priv.h \ pkcs12_asn1-priv.h digest_asn1-priv.h kx509_asn1-priv.h \ - test_asn1.h test_asn1-priv.h + test_template_asn1.h test_template_asn1-priv.h test_asn1.h \ + test_asn1-priv.h EXTRA_DIST = \ NTMakefile \ + README.template \ asn1_compile-version.rc \ libasn1-exports.def \ cms.asn1 \ @@ -630,11 +982,15 @@ test.gen \ version-script.map +DER_PROTOS = $(srcdir)/der-protos.h $(srcdir)/der-private.h +ALL_OBJECTS = $(libasn1_la_OBJECTS) $(libasn1base_la_OBJECTS) \ + $(asn1_print_OBJECTS) $(asn1_compile_OBJECTS) \ + $(asn1_gen_OBJECTS) $(check_template_OBJECTS) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .l .lo .o .obj .y +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .l .lo .log .o .obj .test .test$(EXEEXT) .trs .y $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -647,15 +1003,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/asn1/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/asn1/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -665,50 +1021,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libasn1.la: $(libasn1_la_OBJECTS) $(libasn1_la_DEPENDENCIES) - $(libasn1_la_LINK) -rpath $(libdir) $(libasn1_la_OBJECTS) $(libasn1_la_LIBADD) $(LIBS) -libasn1base.la: $(libasn1base_la_OBJECTS) $(libasn1base_la_DEPENDENCIES) - $(LINK) $(libasn1base_la_OBJECTS) $(libasn1base_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ @@ -720,14 +1032,19 @@ rm -f $$list install-libexec_heimdalPROGRAMS: $(libexec_heimdal_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexec_heimdaldir)" || $(MKDIR_P) "$(DESTDIR)$(libexec_heimdaldir)" @list='$(libexec_heimdal_PROGRAMS)'; test -n "$(libexec_heimdaldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexec_heimdaldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexec_heimdaldir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -748,7 +1065,8 @@ @list='$(libexec_heimdal_PROGRAMS)'; test -n "$(libexec_heimdaldir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexec_heimdaldir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexec_heimdaldir)" && rm -f $$files @@ -770,30 +1088,90 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -asn1_compile$(EXEEXT): $(asn1_compile_OBJECTS) $(asn1_compile_DEPENDENCIES) + +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}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_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}; \ + } + +libasn1.la: $(libasn1_la_OBJECTS) $(libasn1_la_DEPENDENCIES) $(EXTRA_libasn1_la_DEPENDENCIES) + $(AM_V_CCLD)$(libasn1_la_LINK) -rpath $(libdir) $(libasn1_la_OBJECTS) $(libasn1_la_LIBADD) $(LIBS) + +libasn1base.la: $(libasn1base_la_OBJECTS) $(libasn1base_la_DEPENDENCIES) $(EXTRA_libasn1base_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libasn1base_la_OBJECTS) $(libasn1base_la_LIBADD) $(LIBS) + +asn1_compile$(EXEEXT): $(asn1_compile_OBJECTS) $(asn1_compile_DEPENDENCIES) $(EXTRA_asn1_compile_DEPENDENCIES) @rm -f asn1_compile$(EXEEXT) - $(LINK) $(asn1_compile_OBJECTS) $(asn1_compile_LDADD) $(LIBS) -asn1_gen$(EXEEXT): $(asn1_gen_OBJECTS) $(asn1_gen_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(asn1_compile_OBJECTS) $(asn1_compile_LDADD) $(LIBS) + +asn1_gen$(EXEEXT): $(asn1_gen_OBJECTS) $(asn1_gen_DEPENDENCIES) $(EXTRA_asn1_gen_DEPENDENCIES) @rm -f asn1_gen$(EXEEXT) - $(LINK) $(asn1_gen_OBJECTS) $(asn1_gen_LDADD) $(LIBS) -asn1_print$(EXEEXT): $(asn1_print_OBJECTS) $(asn1_print_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(asn1_gen_OBJECTS) $(asn1_gen_LDADD) $(LIBS) + +asn1_print$(EXEEXT): $(asn1_print_OBJECTS) $(asn1_print_DEPENDENCIES) $(EXTRA_asn1_print_DEPENDENCIES) @rm -f asn1_print$(EXEEXT) - $(LINK) $(asn1_print_OBJECTS) $(asn1_print_LDADD) $(LIBS) -check-ber$(EXEEXT): $(check_ber_OBJECTS) $(check_ber_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(asn1_print_OBJECTS) $(asn1_print_LDADD) $(LIBS) + +check-ber$(EXEEXT): $(check_ber_OBJECTS) $(check_ber_DEPENDENCIES) $(EXTRA_check_ber_DEPENDENCIES) @rm -f check-ber$(EXEEXT) - $(LINK) $(check_ber_OBJECTS) $(check_ber_LDADD) $(LIBS) -check-der$(EXEEXT): $(check_der_OBJECTS) $(check_der_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(check_ber_OBJECTS) $(check_ber_LDADD) $(LIBS) + +check-der$(EXEEXT): $(check_der_OBJECTS) $(check_der_DEPENDENCIES) $(EXTRA_check_der_DEPENDENCIES) @rm -f check-der$(EXEEXT) - $(LINK) $(check_der_OBJECTS) $(check_der_LDADD) $(LIBS) -check-gen$(EXEEXT): $(check_gen_OBJECTS) $(check_gen_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(check_der_OBJECTS) $(check_der_LDADD) $(LIBS) + +check-gen$(EXEEXT): $(check_gen_OBJECTS) $(check_gen_DEPENDENCIES) $(EXTRA_check_gen_DEPENDENCIES) @rm -f check-gen$(EXEEXT) - $(LINK) $(check_gen_OBJECTS) $(check_gen_LDADD) $(LIBS) -check-template$(EXEEXT): $(check_template_OBJECTS) $(check_template_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(check_gen_OBJECTS) $(check_gen_LDADD) $(LIBS) + +check-template$(EXEEXT): $(check_template_OBJECTS) $(check_template_DEPENDENCIES) $(EXTRA_check_template_DEPENDENCIES) @rm -f check-template$(EXEEXT) - $(LINK) $(check_template_OBJECTS) $(check_template_LDADD) $(LIBS) -check-timegm$(EXEEXT): $(check_timegm_OBJECTS) $(check_timegm_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(check_template_OBJECTS) $(check_template_LDADD) $(LIBS) + +check-timegm$(EXEEXT): $(check_timegm_OBJECTS) $(check_timegm_DEPENDENCIES) $(EXTRA_check_timegm_DEPENDENCIES) @rm -f check-timegm$(EXEEXT) - $(LINK) $(check_timegm_OBJECTS) $(check_timegm_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(check_timegm_OBJECTS) $(check_timegm_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -801,77 +1179,85 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_cms_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_digest_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_gen.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_krb5_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_kx509_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkcs12_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkcs8_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkcs9_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkinit_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_print.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_rfc2459_asn1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_test_asn1.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1parse.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-der.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-gen.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-template.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-timegm.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_cmp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_copy.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_format.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_free.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_get.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_length.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_put.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extra.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_copy.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_decode.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_encode.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_free.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_glue.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_length.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_seq.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_template.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symbol.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/template.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timegm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_cms_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_digest_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_gen.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_krb5_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_kx509_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkcs12_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkcs8_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkcs9_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_pkinit_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_print.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_rfc2459_asn1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_test_asn1.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1parse.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-ber.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-der.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-gen.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-template.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/check-timegm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_cmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_copy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_format.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_free.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_get.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_length.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/der_put.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extra.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fuzzer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_copy.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_decode.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_encode.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_free.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_glue.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_length.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_seq.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gen_template.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symbol.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/template.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_template_asn1-template.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timegm.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .l.c: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) + $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo @@ -880,8 +1266,11 @@ -rm -rf .libs _libs install-dist_includeHEADERS: $(dist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(dist_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"; \ @@ -895,13 +1284,14 @@ @$(NORMAL_UNINSTALL) @list='$(dist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -915,30 +1305,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -950,15 +1327,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -967,103 +1340,219 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + color_start= color_end=; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-der.log: check-der$(EXEEXT) + @p='check-der$(EXEEXT)'; \ + b='check-der'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-gen.log: check-gen$(EXEEXT) + @p='check-gen$(EXEEXT)'; \ + b='check-gen'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-timegm.log: check-timegm$(EXEEXT) + @p='check-timegm$(EXEEXT)'; \ + b='check-timegm'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-ber.log: check-ber$(EXEEXT) + @p='check-ber$(EXEEXT)'; \ + b='check-ber'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-template.log: check-template$(EXEEXT) + @p='check-template$(EXEEXT)'; \ + b='check-template'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -1101,14 +1590,19 @@ $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local +install-checkPROGRAMS: install-libLTLIBRARIES + +install-libexecheimdalPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexec_heimdaldir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(libexec_heimdaldir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -1117,11 +1611,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -1144,7 +1646,52 @@ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_cms_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_digest_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_err.Plo + -rm -f ./$(DEPDIR)/asn1_gen.Po + -rm -f ./$(DEPDIR)/asn1_krb5_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_kx509_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkcs12_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkcs8_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkcs9_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkinit_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_print.Po + -rm -f ./$(DEPDIR)/asn1_rfc2459_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_test_asn1.Po + -rm -f ./$(DEPDIR)/asn1parse.Po + -rm -f ./$(DEPDIR)/check-ber.Po + -rm -f ./$(DEPDIR)/check-common.Po + -rm -f ./$(DEPDIR)/check-der.Po + -rm -f ./$(DEPDIR)/check-gen.Po + -rm -f ./$(DEPDIR)/check-template.Po + -rm -f ./$(DEPDIR)/check-timegm.Po + -rm -f ./$(DEPDIR)/der.Plo + -rm -f ./$(DEPDIR)/der_cmp.Plo + -rm -f ./$(DEPDIR)/der_copy.Plo + -rm -f ./$(DEPDIR)/der_format.Plo + -rm -f ./$(DEPDIR)/der_free.Plo + -rm -f ./$(DEPDIR)/der_get.Plo + -rm -f ./$(DEPDIR)/der_length.Plo + -rm -f ./$(DEPDIR)/der_put.Plo + -rm -f ./$(DEPDIR)/extra.Plo + -rm -f ./$(DEPDIR)/fuzzer.Plo + -rm -f ./$(DEPDIR)/gen.Po + -rm -f ./$(DEPDIR)/gen_copy.Po + -rm -f ./$(DEPDIR)/gen_decode.Po + -rm -f ./$(DEPDIR)/gen_encode.Po + -rm -f ./$(DEPDIR)/gen_free.Po + -rm -f ./$(DEPDIR)/gen_glue.Po + -rm -f ./$(DEPDIR)/gen_length.Po + -rm -f ./$(DEPDIR)/gen_seq.Po + -rm -f ./$(DEPDIR)/gen_template.Po + -rm -f ./$(DEPDIR)/hash.Po + -rm -f ./$(DEPDIR)/lex.Po + -rm -f ./$(DEPDIR)/main.Po + -rm -f ./$(DEPDIR)/symbol.Po + -rm -f ./$(DEPDIR)/template.Plo + -rm -f ./$(DEPDIR)/test_template_asn1-template.Po + -rm -f ./$(DEPDIR)/timegm.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1169,10 +1716,9 @@ install-dvi-am: -install-exec-am: install-libLTLIBRARIES \ +install-exec-am: install-exec-local install-libLTLIBRARIES \ install-libexec_heimdalPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook + install-html: install-html-am install-html-am: @@ -1194,7 +1740,52 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_cms_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_digest_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_err.Plo + -rm -f ./$(DEPDIR)/asn1_gen.Po + -rm -f ./$(DEPDIR)/asn1_krb5_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_kx509_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkcs12_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkcs8_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkcs9_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_pkinit_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_print.Po + -rm -f ./$(DEPDIR)/asn1_rfc2459_asn1.Plo + -rm -f ./$(DEPDIR)/asn1_test_asn1.Po + -rm -f ./$(DEPDIR)/asn1parse.Po + -rm -f ./$(DEPDIR)/check-ber.Po + -rm -f ./$(DEPDIR)/check-common.Po + -rm -f ./$(DEPDIR)/check-der.Po + -rm -f ./$(DEPDIR)/check-gen.Po + -rm -f ./$(DEPDIR)/check-template.Po + -rm -f ./$(DEPDIR)/check-timegm.Po + -rm -f ./$(DEPDIR)/der.Plo + -rm -f ./$(DEPDIR)/der_cmp.Plo + -rm -f ./$(DEPDIR)/der_copy.Plo + -rm -f ./$(DEPDIR)/der_format.Plo + -rm -f ./$(DEPDIR)/der_free.Plo + -rm -f ./$(DEPDIR)/der_get.Plo + -rm -f ./$(DEPDIR)/der_length.Plo + -rm -f ./$(DEPDIR)/der_put.Plo + -rm -f ./$(DEPDIR)/extra.Plo + -rm -f ./$(DEPDIR)/fuzzer.Plo + -rm -f ./$(DEPDIR)/gen.Po + -rm -f ./$(DEPDIR)/gen_copy.Po + -rm -f ./$(DEPDIR)/gen_decode.Po + -rm -f ./$(DEPDIR)/gen_encode.Po + -rm -f ./$(DEPDIR)/gen_free.Po + -rm -f ./$(DEPDIR)/gen_glue.Po + -rm -f ./$(DEPDIR)/gen_length.Po + -rm -f ./$(DEPDIR)/gen_seq.Po + -rm -f ./$(DEPDIR)/gen_template.Po + -rm -f ./$(DEPDIR)/hash.Po + -rm -f ./$(DEPDIR)/lex.Po + -rm -f ./$(DEPDIR)/main.Po + -rm -f ./$(DEPDIR)/symbol.Po + -rm -f ./$(DEPDIR)/template.Plo + -rm -f ./$(DEPDIR)/test_template_asn1-template.Po + -rm -f ./$(DEPDIR)/timegm.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1217,45 +1808,60 @@ @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: all check check-am install install-am install-data-am \ - install-exec-am install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-checkPROGRAMS clean-generic \ - clean-libLTLIBRARIES clean-libexec_heimdalPROGRAMS \ - clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ - ctags dist-hook 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-data-hook install-dist_includeHEADERS \ - install-dvi install-dvi-am install-exec install-exec-am \ - install-exec-hook install-html install-html-am install-info \ - install-info-am install-libLTLIBRARIES \ - install-libexec_heimdalPROGRAMS install-man \ - install-nodist_includeHEADERS install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ + install-exec install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-checkPROGRAMS \ + clean-generic clean-libLTLIBRARIES \ + clean-libexec_heimdalPROGRAMS clean-libtool \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscopelist-am \ + ctags ctags-am dist-hook 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-data-hook \ + install-dist_includeHEADERS install-dvi install-dvi-am \ + install-exec install-exec-am install-exec-local install-html \ + install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-libexec_heimdalPROGRAMS \ + install-man install-nodist_includeHEADERS 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-dist_includeHEADERS \ - uninstall-hook uninstall-libLTLIBRARIES \ - uninstall-libexec_heimdalPROGRAMS \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-dist_includeHEADERS uninstall-hook \ + uninstall-libLTLIBRARIES uninstall-libexec_heimdalPROGRAMS \ uninstall-nodist_includeHEADERS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1263,7 +1869,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1308,11 +1914,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1320,6 +1935,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1362,6 +1979,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1375,13 +2005,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1431,6 +2061,7 @@ $(gen_files_rfc2459) rfc2459_asn1.hx rfc2459_asn1-priv.hx: rfc2459_asn1_files $(gen_files_cms) cms_asn1.hx cms_asn1-priv.hx: cms_asn1_files $(gen_files_test) test_asn1.hx test_asn1-priv.hx: test_asn1_files +$(gen_files_test_template) test_template_asn1.hx test_template_asn1-priv.hx: test_template_asn1_files rfc2459_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/rfc2459.asn1 $(ASN1_COMPILE) --one-code-file --preserve-binary=TBSCertificate --preserve-binary=TBSCRLCertList --preserve-binary=Name --sequence=GeneralNames --sequence=Extensions --sequence=CRLDistributionPoints $(srcdir)/rfc2459.asn1 rfc2459_asn1 || (rm -f rfc2459_asn1_files ; exit 1) @@ -1459,13 +2090,18 @@ kx509_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/kx509.asn1 $(ASN1_COMPILE) --one-code-file $(srcdir)/kx509.asn1 kx509_asn1 || (rm -f kx509_asn1_files ; exit 1) +test_template_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1 + $(ASN1_COMPILE) --template --sequence=TESTSeqOf $(srcdir)/test.asn1 test_template_asn1 || (rm -f test_template_asn1_files ; exit 1) + test_asn1_files: asn1_compile$(EXEEXT) $(srcdir)/test.asn1 $(ASN1_COMPILE) --one-code-file --sequence=TESTSeqOf $(srcdir)/test.asn1 test_asn1 || (rm -f test_asn1_files ; exit 1) -$(srcdir)/der-protos.h: +$(ALL_OBJECTS): $(DER_PROTOS) asn1_err.h + +$(srcdir)/der-protos.h: $(dist_libasn1base_la_SOURCES) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -o der-protos.h $(dist_libasn1base_la_SOURCES) || rm -f der-protos.h -$(srcdir)/der-private.h: +$(srcdir)/der-private.h: $(dist_libasn1base_la_SOURCES) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p der-private.h $(dist_libasn1base_la_SOURCES) || rm -f der-private.h # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/crypto/heimdal/lib/asn1/NTMakefile b/crypto/heimdal/lib/asn1/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/NTMakefile @@ -0,0 +1,356 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\asn1 + +intcflags=-I$(SRCDIR) -I$(OBJ) -DROKEN_RENAME + +!include ../../windows/NTMakefile.w32 + +gen_files_krb5 = $(OBJ)\asn1_krb5_asn1.x + +gen_files_cms = $(OBJ)\asn1_cms_asn1.x + +gen_files_rfc2459 = $(OBJ)\asn1_rfc2459_asn1.x + +gen_files_pkinit = $(OBJ)\asn1_pkinit_asn1.x + +gen_files_pkcs12 = $(OBJ)\asn1_pkcs12_asn1.x + +gen_files_pkcs8 = $(OBJ)\asn1_pkcs8_asn1.x + +gen_files_pkcs9 = $(OBJ)\asn1_pkcs9_asn1.x + +gen_files_test = $(OBJ)\asn1_test_asn1.x + +gen_files_digest = $(OBJ)\asn1_digest_asn1.x + +gen_files_kx509 = $(OBJ)\asn1_kx509_asn1.x + +ASN1_BINARIES = \ + $(LIBEXECDIR)\asn1_compile.exe + +$(BINDIR)\asn1_compile.exe: \ + $(OBJ)\asn1parse.obj \ + $(OBJ)\gen.obj \ + $(OBJ)\gen_copy.obj \ + $(OBJ)\gen_decode.obj \ + $(OBJ)\gen_encode.obj \ + $(OBJ)\gen_free.obj \ + $(OBJ)\gen_glue.obj \ + $(OBJ)\gen_length.obj \ + $(OBJ)\gen_seq.obj \ + $(OBJ)\gen_template.obj \ + $(OBJ)\hash.obj \ + $(OBJ)\lex.obj \ + $(OBJ)\main.obj \ + $(OBJ)\symbol.obj \ + $(OBJ)\asn1_compile-version.res + $(EXECONLINK) $(LIBROKEN) $(LIBVERS) + $(EXEPREP_NOHEIM) + +$(OBJ)\lex.c: lex.l $(OBJ)\asn1parse.h + $(LEX) -o$@ lex.l + +$(OBJ)\lex.obj: $(OBJ)\lex.c + $(C2OBJ) -DYY_NO_UNISTD_H + +$(OBJ)\asn1parse.c $(OBJ)\asn1parse.h: asn1parse.y + $(YACC) -o $(OBJ)\asn1parse.c --defines=$(OBJ)\asn1parse.h $** + +$(OBJ)\asn1_err.c $(OBJ)\asn1_err.h: asn1_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\asn1_err.et + cd $(SRCDIR) + +$(BINDIR)\asn1_print.exe: $(OBJ)\asn1_print.obj $(LIBHEIMDAL) + $(EXECONLINK) $(LIBVERS) $(LIBROKEN) $(LIBCOMERR) + $(EXEPREP) + +$(BINDIR)\asn1_gen.exe: $(OBJ)\asn1_gen.obj $(LIBHEIMDAL) + $(EXECONLINK) $(LIBVERS) $(LIBROKEN) + $(EXEPREP) + +LIBASN1_OBJS= \ + $(OBJ)\der.obj \ + $(OBJ)\der_get.obj \ + $(OBJ)\der_put.obj \ + $(OBJ)\der_free.obj \ + $(OBJ)\der_length.obj \ + $(OBJ)\der_copy.obj \ + $(OBJ)\der_cmp.obj \ + $(OBJ)\der_format.obj \ + $(OBJ)\extra.obj \ + $(OBJ)\timegm.obj \ + $(gen_files_rfc2459:.x=.obj) \ + $(gen_files_cms:.x=.obj) \ + $(gen_files_krb5:.x=.obj) \ + $(gen_files_pkinit:.x=.obj) \ + $(gen_files_pkcs8:.x=.obj) \ + $(gen_files_pkcs9:.x=.obj) \ + $(gen_files_pkcs12:.x=.obj) \ + $(gen_files_digest:.x=.obj) \ + $(gen_files_kx509:.x=.obj) \ + $(OBJ)\asn1_err.obj + +$(LIBASN1): $(LIBASN1_OBJS) + $(LIBCON_C) -out:$@ @<< +$(**: = +) +<< + +clean:: + -$(RM) $(LIBASN1) + +# +# Generate list of exports +# +# This target is only used during development to generate a list of +# symbols that are exported from all the object files in LIBASN1_OBJS. +# +exports-list.txt: $(LIBASN1_OBJS) + $(PERL) ..\..\cf\w32-list-externs-from-objs.pl -q -u @<< > $@ +$(**: = +) +<< + +$(gen_files_krb5:.x=.c) : $$(@R).x + +$(gen_files_pkinit:.x=.c) : $$(@R).x + +$(gen_files_pkcs8:.x=.c) : $$(@R).x + +$(gen_files_pkcs9:.x=.c) : $$(@R).x + +$(gen_files_pkcs12:.x=.c) : $$(@R).x + +$(gen_files_digest:.x=.c) : $$(@R).x + +$(gen_files_kx509:.x=.c) : $$(@R).x + +$(gen_files_rfc2459:.x=.c) : $$(@R).x + +$(gen_files_cms:.x=.c) : $$(@R).x + +$(gen_files_test:.x=.c) : $$(@R).x + +$(gen_files_krb5) $(OBJ)\krb5_asn1.hx: $(BINDIR)\asn1_compile.exe krb5.asn1 krb5.opt + cd $(OBJ) + $(BINDIR)\asn1_compile.exe \ + --one-code-file \ + --option-file=$(SRCDIR)\krb5.opt \ + $(SRCDIR)\krb5.asn1 krb5_asn1 \ + || ($(RM) $(OBJ)\krb5_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_pkinit) $(OBJ)\pkinit_asn1.hx: $(BINDIR)\asn1_compile.exe pkinit.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe --one-code-file $(SRCDIR)\pkinit.asn1 pkinit_asn1 \ + || ($(RM) $(OBJ)\pkinit_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_pkcs8) $(OBJ)\pkcs8_asn1.hx: $(BINDIR)\asn1_compile.exe pkcs8.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe --one-code-file $(SRCDIR)\pkcs8.asn1 pkcs8_asn1 \ + || ($(RM) $(OBJ)\pkcs8_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_pkcs9) $(OBJ)\pkcs9_asn1.hx: $(BINDIR)\asn1_compile.exe pkcs9.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe --one-code-file $(SRCDIR)\pkcs9.asn1 pkcs9_asn1 \ + || ($(RM) $(OBJ)\pkcs9_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_pkcs12) $(OBJ)\pkcs12_asn1.hx: $(BINDIR)\asn1_compile.exe pkcs12.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe --one-code-file $(SRCDIR)\pkcs12.asn1 pkcs12_asn1 \ + || ($(RM) $(OBJ)\pkcs12_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_digest) $(OBJ)\digest_asn1.hx: $(BINDIR)\asn1_compile.exe digest.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe --one-code-file $(SRCDIR)\digest.asn1 digest_asn1 \ + || ($(RM) $(OBJ)\digest_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_kx509) $(OBJ)\kx509_asn1.hx: $(BINDIR)\asn1_compile.exe kx509.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe --one-code-file $(SRCDIR)\kx509.asn1 kx509_asn1 \ + || ($(RM) $(OBJ)\kx509_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_rfc2459) $(OBJ)\rfc2459_asn1.hx: $(BINDIR)\asn1_compile.exe rfc2459.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe \ + --one-code-file \ + --preserve-binary=TBSCertificate \ + --preserve-binary=TBSCRLCertList \ + --preserve-binary=Name \ + --sequence=GeneralNames \ + --sequence=Extensions \ + --sequence=CRLDistributionPoints \ + $(SRCDIR)\rfc2459.asn1 rfc2459_asn1 \ + || ($(RM) $(OBJ)\rfc2459_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_cms) $(OBJ)\cms_asn1.hx: $(BINDIR)\asn1_compile.exe cms.asn1 cms.opt + cd $(OBJ) + $(BINDIR)\asn1_compile.exe \ + --one-code-file --option-file=$(SRCDIR)\cms.opt \ + $(SRCDIR)\cms.asn1 cms_asn1 \ + || ($(RM) $(OBJ)\cms_asn1.h ; exit /b 1) + cd $(SRCDIR) + +$(gen_files_test) $(OBJ)\test_asn1.hx: $(BINDIR)\asn1_compile.exe test.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe \ + --one-code-file --sequence=TESTSeqOf \ + $(SRCDIR)\test.asn1 test_asn1 \ + || ($(RM) $(OBJ)\test_asn1.h ; exit /b 1) + cd $(SRCDIR) + +INCFILES= \ + $(INCDIR)\der.h \ + $(INCDIR)\heim_asn1.h \ + $(INCDIR)\der-protos.h \ + $(INCDIR)\der-private.h \ + $(INCDIR)\asn1-common.h \ + $(INCDIR)\asn1-template.h \ + $(OBJ)\asn1_err.h + +$(INCDIR)\der-protos.h: $(OBJ)\der-protos.h + +GENINCFILES= \ + $(INCDIR)\asn1_err.h \ + $(INCDIR)\cms_asn1.h \ + $(INCDIR)\digest_asn1.h \ + $(INCDIR)\krb5_asn1.h \ + $(INCDIR)\kx509_asn1.h \ + $(INCDIR)\pkcs12_asn1.h \ + $(INCDIR)\pkcs8_asn1.h \ + $(INCDIR)\pkcs9_asn1.h \ + $(INCDIR)\pkinit_asn1.h \ + $(INCDIR)\rfc2459_asn1.h \ + $(OBJ)\krb5_asn1-priv.h \ + $(OBJ)\pkinit_asn1-priv.h \ + $(OBJ)\cms_asn1-priv.h \ + $(OBJ)\rfc2459_asn1-priv.h \ + $(OBJ)\pkcs8_asn1-priv.h \ + $(OBJ)\pkcs9_asn1-priv.h \ + $(OBJ)\pkcs12_asn1-priv.h \ + $(OBJ)\digest_asn1-priv.h \ + $(OBJ)\kx509_asn1-priv.h \ + $(OBJ)\test_asn1.h \ + $(OBJ)\test_asn1-priv.h + +libasn1_SOURCES= \ + der_locl.h \ + der.c \ + der.h \ + der_get.c \ + der_put.c \ + der_free.c \ + der_length.c \ + der_copy.c \ + der_cmp.c \ + der_format.c \ + heim_asn1.h \ + extra.c \ + timegm.c + +$(OBJ)\der-protos.h: $(libasn1_SOURCES) + $(PERL) ..\..\cf\make-proto.pl -q -P remove -o $(OBJ)\der-protos.h $(libasn1_SOURCES) || $(RM) $(OBJ)\der-protos.h + +$(OBJ)\der-private.h: $(libasn1_SOURCES) + $(PERL) ..\..\cf\make-proto.pl -q -P remove -p $(OBJ)\der-private.h $(libasn1_SOURCES) || $(RM) $(OBJ)\der-private.h + +clean:: + -$(RM) $(INCDIR)\der-protos.h + +all:: $(INCFILES) $(GENINCFILES) $(ASN1_BINARIES) $(LIBASN1) + +all-tools:: $(LIBEXECDIR)\asn1_print.exe $(BINDIR)\asn1_gen.exe + +clean:: + -$(RM) $(INCFILES) + -$(RM) $(GENINCFILES) + -$(RM) $(ASN1_BINARIES:.exe=.*) + -$(RM) $(LIBASN1) + -$(RM) $(LIBEXECDIR)\asn1_print.* + -$(RM) $(LIBEXECDIR)\asn1_gen.* + +TEST_BINARIES=\ + $(OBJ)\check-der.exe \ + $(OBJ)\check-gen.exe \ + $(OBJ)\check-timegm.exe \ + $(OBJ)\check-ber.exe \ + $(OBJ)\check-template.exe \ + +test-binaries: $(TEST_BINARIES) + +test-run: + cd $(OBJ) + -check-der.exe + -check-gen.exe + -check-timegm.exe + -check-ber.exe + -check-template.exe + cd $(SRC) + +test:: test-binaries test-run + +clean:: + -$(RM) $(TEST_BINARIES:.exe=*) + +$(OBJ)\check-ber.exe: $(OBJ)\check-ber.obj \ + $(LIBHEIMDAL) $(LIBROKEN) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\check-der.exe: $(OBJ)\check-der.obj $(OBJ)\check-common.obj \ + $(LIBHEIMDAL) $(LIBROKEN) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\check-gen.exe: $(OBJ)\check-gen.obj $(OBJ)\check-common.obj \ + $(LIBHEIMDAL) $(LIBROKEN) $(gen_files_test:.x=.obj) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\check-timegm.exe: $(OBJ)\check-timegm.obj \ + $(LIBHEIMDAL) $(LIBROKEN) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\check-template.exe: $(OBJ)\check-template.obj $(OBJ)\check-common.obj \ + $(LIBHEIMDAL) $(LIBROKEN) $(gen_files_test:.x=.obj) + $(EXECONLINK) + $(EXEPREP_NODIST) diff --git a/crypto/heimdal/lib/asn1/README.template b/crypto/heimdal/lib/asn1/README.template new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/README.template @@ -0,0 +1,131 @@ +#!/bin/sh + +size .libs/libasn1.dylib +size .libs/libasn1base.a | awk '{sum += $1} END {print sum}' | sed 's/^/TEXT baselib: /' +size .libs/asn1_*.o | awk '{sum += $1} END {print sum}' | sed 's/^/generated code stubs: /' +size *_asn1-template.o | awk '{sum += $1} END {print sum}' | sed 's/^/TEXT stubs: /' + +exit 0 + +Notes about the template parser: + +- assumption: code is large, tables smaller + +- how to generate template based stubs: + + make check asn1_compile_FLAGS=--template > log + +- pretty much the same as the generate code, except uses tables instead of code + +TODO: + - Make hdb work + + - Fuzzing tests + + - Performance testing + + - ASN1_MALLOC_ENCODE() as a function, replaces encode_ and length_ + + - Fix SIZE constraits + + - Compact types that only contain on entry to not having a header. + + +SIZE - Futher down is later generations of the template parser + + code: + ================== + __TEXT __DATA __OBJC others dec hex + 462848 12288 0 323584 798720 c3000 (O2) + + trivial types: + ================== + __TEXT __DATA __OBJC others dec hex + 446464 12288 0 323584 782336 bf000 (O2) + + OPTIONAL + ================== + __TEXT __DATA __OBJC others dec hex + 425984 16384 0 323584 765952 bb000 (O2) + + SEQ OF + ================== + __TEXT __DATA __OBJC others dec hex + 368640 32768 0 327680 729088 b2000 (O2) + 348160 32768 0 327680 708608 ad000 (Os) + + BOOLEAN + ================== + 339968 32768 0 327680 700416 ab000 (Os) + + TYPE_EXTERNAL: + ================== + 331776 32768 0 327680 692224 a9000 (Os) + + SET OF + ================== + 327680 32768 0 327680 688128 a8000 (Os) + + TYPE_EXTERNAL everywhere + ================== + __TEXT __DATA __OBJC others dec hex + 167936 69632 0 327680 565248 8a000 (Os) + + TAG uses ->ptr (header and trailer) + ================== + 229376 102400 0 421888 753664 b8000 (O0) + + TAG uses ->ptr (header only) + ================== + 221184 77824 0 421888 720896 b0000 (O0) + + BER support for octet string (not working) + ================== + 180224 73728 0 417792 671744 a4000 (O2) + + CHOICE and BIT STRING missign + ================== + __TEXT __DATA __OBJC others dec hex + 172032 73728 0 417792 663552 a2000 (Os) + + No accessor functions to global variable + ================== + __TEXT __DATA __OBJC others dec hex + 159744 73728 0 393216 626688 99000 (Os) + + All types tables (except choice) (id still objects) + ================== + __TEXT __DATA __OBJC others dec hex + 167936 77824 0 421888 667648 a3000 + base lib: 22820 + + __TEXT __DATA __OBJC others dec hex + ================== + 167936 77824 0 421888 667648 a3000 (Os) + baselib: 22820 + generated code stubs: 41472 + TEXT stubs: 112560 + + All types, id still objects + ================== + __TEXT __DATA __OBJC others dec hex + 155648 81920 0 430080 667648 a3000 (Os) + TEXT baselib: 23166 + generated code stubs: 20796 + TEXT stubs: 119891 + + All types, id still objects, dup compression + ================== + __TEXT __DATA __OBJC others dec hex + 143360 65536 0 376832 585728 8f000 (Os) + TEXT baselib: 23166 + generated code stubs: 20796 + TEXT stubs: 107147 + + All types, dup compression, id vars + ================== + __TEXT __DATA __OBJC others dec hex + 131072 65536 0 352256 548864 86000 + TEXT baselib: 23166 + generated code stubs: 7536 + TEXT stubs: 107147 diff --git a/crypto/heimdal/lib/asn1/asn1-common.h b/crypto/heimdal/lib/asn1/asn1-common.h --- a/crypto/heimdal/lib/asn1/asn1-common.h +++ b/crypto/heimdal/lib/asn1/asn1-common.h @@ -7,21 +7,26 @@ #ifndef __asn1_common_definitions__ #define __asn1_common_definitions__ +#ifndef __HEIM_BASE_DATA__ +#define __HEIM_BASE_DATA__ 1 +struct heim_base_data { + size_t length; + void *data; +}; +#endif + typedef struct heim_integer { size_t length; void *data; int negative; } heim_integer; -typedef struct heim_octet_string { - size_t length; - void *data; -} heim_octet_string; +typedef struct heim_base_data heim_octet_string; typedef char *heim_general_string; typedef char *heim_utf8_string; -typedef struct heim_octet_string heim_printable_string; -typedef struct heim_octet_string heim_ia5_string; +typedef struct heim_base_data heim_printable_string; +typedef struct heim_base_data heim_ia5_string; typedef struct heim_bmp_string { size_t length; @@ -45,8 +50,8 @@ void *data; } heim_bit_string; -typedef struct heim_octet_string heim_any; -typedef struct heim_octet_string heim_any_set; +typedef struct heim_base_data heim_any; +typedef struct heim_base_data heim_any_set; #define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R) \ do { \ diff --git a/crypto/heimdal/lib/asn1/asn1-template.h b/crypto/heimdal/lib/asn1/asn1-template.h index 107706ce834081e4b75601dbb4f9f9ba5e424015..3c0400a4c706fd0225f3fbc8fc0533cd92957efe GIT binary patch literal 5481 zc$~#pZExa868;>1MM)#w+AKptGOwGxk&J1ewZ>*`Gnw4!z{Rn^tyZqAzxXo8upp0a3hUw}5%q4WOzTX+eV7Z-2fmvyp; zqeTe5_?$%f=MaW}Eb`B3942I_x#?3F15ffID%OR7bdJdBeUirM;;98*kxoC~r|}Yp zk76bgy-j9D9D|%MhfL%mdk`~{lWLr1MU*Ca%_nr`Js7K1EO4@E`#A7oePK($kTN;6;g5+C1Lgi^E6xLEqIKIdq^|+OxFdmEYn#ukES7Uv>?m`tVFhq zibBj_m8B2S3pM#%!EX)=ps1jIsiOHuq(y4Gpeyvr$JrCZZHlRJ0HgT8eCwrprTLaL!6z zHojoAvo-qnzi|gtpe55RovxQ6DZVFh_;TNS@A%N34XBt1L3eS7J&fhNcnKUPi^0s4~m*N+kY}d*C^J|Hg0`;CSph zA9;`UpnHo-6xp87{fW=OuzO%Sw(s)p#CKc|e*4Yv(By|7NF}$PeGBZ<*kzsvjthJ= zwm32&wQJZuXI=~GOl#8P_MipG0=DCW#YfynnD4Y`Mj|@21g8%p=9)u%HM-p5{;hPV z&wZPw>*IU|j1AZ4=EO2w7*E`><4HD(tj9gmGWdw~+JH{r#K1l>+XruGSXM1kgc%B&fb z3lFnr`ova2;;fiYzY;9iY+&&LvrU_rd6WOi{M`nC$OD{P57oh?;IQLPi|Ab){t5!nR0JOwiblIH4!9`~-NCVF)Ofjh_POT_Dw2){(UIf3Yo z*r>}~iFtbhV-6kML=y6D3#nrImND2R?qYs~MnW99rwmJ?I;T*w*_qszsLNyXVd?^3 z!~W%YEy{Ka1^St$Z4;}*zd_R!LWiG!#`01kLMuT>3J9y~b#7^=ebF%-4Il8~gCzJH z;A$O!iL!?6C~W5tYYa;0ml86kzr*M(W^086uA`(_6SWr>RCB~gGpC1QMY}%m-Mv9u6AN>G76s%9p_6#{YH6?z8 zoSQ&aCT^iU(_ufLPb#+dLrc^#%i?2?dq)hr{lM*;o!6ZUW!PxoQ3ekZvd;yZJ_o-y zs54O}uPy^Ta~9Y8f^0C6Rh08i3YR^^U6$G^WA1fQ>yX}KEpkU>4JYf6=2P>;G&#Rck7SCVV; zuw7S_(LwoC>N0EeP)lC=zNw)AkGEwRZB~YIfm17c74$*TfcF%yhJLxIGn^!y0#P;~WX1zm66@_OI<{DN&2NyhqZRL*XGyhpB z?b?b1#_I!gcQihbO>B;5EbqvSV|?}Lw0WSxBMm<$pZNWE2f{KS{twm*d`xK-Zq_6+ zxm|u3XV-BoX4sX$c_oiNvzX659a!0uQGf?k_f{?T7rb2I1^H;T?{%U8Z!61x?lJu9 zy3*3Rcz6sPJHX?r<7ztH7_&mFG}_+SF|}D(ge}#xbo>PF?P^Us-i&lI(gA)fn_cCT zfSh&89oe^O@aQJ*S@#0>6op(~Tk-Oq2thZ^yC-=~T!=(uA^ilfZOnPGzEd~c@`jg* zFpi&SYhgyic*oZUFG|!s`bqtu5N7hGj5o%YnAHcQYu^)v{8@o+p<#q>;M!y%-7kw& z?Lw(8ry+&3gh%>`V;Zl?-H=#h_rU9~D9_I5Q6rFRNt&QYSD-b{RH~1DbDD78ESl%7 z4M?RFg>W@AmOqj?{AheeU1}{`ys9|7WjiRq>a- hsnN^tvE(nw%8%!NS;fziesAJVayMRxWERaEe*#(hSe5_) literal 4065 zc$~FY+j81S5PddZ(N(G1fJ-3==k9E(gcx8dLSi+e*xnbd0s~fANR%X;crU-b&)Yo` z26M^o%laXbx=)|(KGQQyUYS(O5jnk0vm{$Q7$C}QdUu;8OMLyNW-4v9 zDa=X|(D@3;RiW~GH6uH@CRtv_Sz7GXgvGoEYqd%gCY!c@#Nex0T$FkIbxlMNr88I; z3gQ%sY@JV)wtS7#D1U%?mM;qfzQyG&WVwE3>ylWO*({#N(}*|>h;juhl`rG6R5MuR z*?m02m-03$@gIdeNs@hw(*;bkbQbFlh=t;os{BxwX14dLD@d@qtZ6nw@VY3mqcXyB zi8%V2-IJ@ud(i!>`jSLpE%#f*438QCNB~ByE z(NQT>?l7Z#+!S-C~^Ijl5U%+p_Spq|zKPQ*odhQLd>xs{V0M7?Lo;VztklMFg z$(b;a&US)6cZUWb3%H&HhmW~LnDh+FNJNK`;0<8Re0zkSR*ySe-spk`T)LEQfcY$# zSia}-y-tzqNuxc6MOr;av*}FO zXrKGcmekSq%|_+0J_k>v39~u9uxp0RSpJPs(+c)WfFN`dTi+U6Lu{}4FT&um*n!W+ zR5D5-g5IXsq387lQ6arx{ugdDaS4tmv}S=|1}2e~PLC`o7`pMj7YMGUqhq&==N#3u(s-TXMhd8sK5tc^}lc`z6Rqc z2wsnkHy|bv*rQr~+6ylmjhA?&7O4rPTCNg25DIO57SGd}nnM^$y^xZHqcChdLtC7x zeKV1i(c**Nj-7V9+o4Z=B$~88p?p~Bz1r=f^8)aoD)c$feTCm|VV*>b>ib>0ePKej zdaP{~;i>RQY?_Z$W<|A5=>+)?T$|D@GxR3m*b<-5&YGR?^G@~G+5^a&3DW@c2Y`@W z;}E$7>z;yHLrrsW!jF4bREb`lK;X{t1{(4DBtq7RHzyFiF&p=ouQ6{=VC<2Hn@B_6 zJwkRd1IHR}h3m|Z&}fLK_mt&mlz9rJ4?CMnjp`oDhth?ziRYIP2B~eJp>@`5J__4{ zKcU&I5H0xl5yz`C5xO#%+CbP=YoA-kHNUs8ohClu(v6X0qcfQfPsYgSnE5Ni!< z==T~jr@zDQ9OgDl4P3`*xhnIpY@y-BCwzUvI$~Cz`5XLk_%2>g6^cijWhEUpD@_Y&1whIw3J0n&%ZYn!=f)TW70T1+CK}UZi+; znchY@oEtU0QL}Bn;ke_*^9_DzJ(J z=zh6$m3_))e#=ljF87?3!caZ-omF2@J@%bcn!al9JL>MBeml(wkDEmPugs84A489K(Jam4sI zq`fm_{?>Y62wcI3F6(bCc(q`@<%Dz}!MoL?-LoZ=KeW;KV}c);N5|-ZixTN`k_RvcH#D(MXT21hkf=u&taCk(>UMJOfrW_ Vc6|`#29Bc_u<;E4lM>Gx{{Sopnt1>K diff --git a/crypto/heimdal/lib/asn1/asn1_compile-version.rc b/crypto/heimdal/lib/asn1/asn1_compile-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/asn1_compile-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "ASN.1 Compiler" +#define RC_FILE_ORIG_0409 "asn1_compile.exe" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/asn1/asn1_gen.c b/crypto/heimdal/lib/asn1/asn1_gen.c --- a/crypto/heimdal/lib/asn1/asn1_gen.c +++ b/crypto/heimdal/lib/asn1/asn1_gen.c @@ -150,8 +150,8 @@ static int version_flag; static int help_flag; struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; int num_args = sizeof(args) / sizeof(args[0]); diff --git a/crypto/heimdal/lib/asn1/asn1_print.c b/crypto/heimdal/lib/asn1/asn1_print.c --- a/crypto/heimdal/lib/asn1/asn1_print.c +++ b/crypto/heimdal/lib/asn1/asn1_print.c @@ -174,14 +174,14 @@ printf ("(length %lu), ", (unsigned long)length); if (inner_flag) { - Der_class class; - Der_type type; - unsigned int tag; + Der_class class2; + Der_type type2; + unsigned int tag2; ret = der_get_tag(str.data, str.length, - &class, &type, &tag, &sz); + &class2, &type2, &tag2, &sz); if (ret || sz > str.length || - type != CONS || tag != UT_Sequence) + type2 != CONS || tag2 != UT_Sequence) goto just_an_octet_string; printf("{\n"); @@ -315,10 +315,11 @@ static int version_flag; static int help_flag; struct getargs args[] = { - { "indent", 0, arg_negative_flag, &indent_flag }, - { "inner", 0, arg_flag, &inner_flag, "try to parse inner structures of OCTET STRING" }, - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "indent", 0, arg_negative_flag, &indent_flag, NULL, NULL }, + { "inner", 0, arg_flag, &inner_flag, + "try to parse inner structures of OCTET STRING", NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; int num_args = sizeof(args) / sizeof(args[0]); diff --git a/crypto/heimdal/lib/asn1/asn1parse.h b/crypto/heimdal/lib/asn1/asn1parse.h --- a/crypto/heimdal/lib/asn1/asn1parse.h +++ b/crypto/heimdal/lib/asn1/asn1parse.h @@ -1,14 +1,14 @@ -/* A Bison parser, made by GNU Bison 2.3. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ -/* Skeleton interface for Bison's Yacc-like parsers in C +/* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. - This program is free software; you can redistribute it and/or modify + 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. + 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 @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -33,102 +31,124 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -/* Tokens. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_YY_ASN_PARSE_H_INCLUDED +# define YY_YY_ASN_PARSE_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif +#if YYDEBUG +extern int yydebug; +#endif + +/* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - kw_ABSENT = 258, - kw_ABSTRACT_SYNTAX = 259, - kw_ALL = 260, - kw_APPLICATION = 261, - kw_AUTOMATIC = 262, - kw_BEGIN = 263, - kw_BIT = 264, - kw_BMPString = 265, - kw_BOOLEAN = 266, - kw_BY = 267, - kw_CHARACTER = 268, - kw_CHOICE = 269, - kw_CLASS = 270, - kw_COMPONENT = 271, - kw_COMPONENTS = 272, - kw_CONSTRAINED = 273, - kw_CONTAINING = 274, - kw_DEFAULT = 275, - kw_DEFINITIONS = 276, - kw_EMBEDDED = 277, - kw_ENCODED = 278, - kw_END = 279, - kw_ENUMERATED = 280, - kw_EXCEPT = 281, - kw_EXPLICIT = 282, - kw_EXPORTS = 283, - kw_EXTENSIBILITY = 284, - kw_EXTERNAL = 285, - kw_FALSE = 286, - kw_FROM = 287, - kw_GeneralString = 288, - kw_GeneralizedTime = 289, - kw_GraphicString = 290, - kw_IA5String = 291, - kw_IDENTIFIER = 292, - kw_IMPLICIT = 293, - kw_IMPLIED = 294, - kw_IMPORTS = 295, - kw_INCLUDES = 296, - kw_INSTANCE = 297, - kw_INTEGER = 298, - kw_INTERSECTION = 299, - kw_ISO646String = 300, - kw_MAX = 301, - kw_MIN = 302, - kw_MINUS_INFINITY = 303, - kw_NULL = 304, - kw_NumericString = 305, - kw_OBJECT = 306, - kw_OCTET = 307, - kw_OF = 308, - kw_OPTIONAL = 309, - kw_ObjectDescriptor = 310, - kw_PATTERN = 311, - kw_PDV = 312, - kw_PLUS_INFINITY = 313, - kw_PRESENT = 314, - kw_PRIVATE = 315, - kw_PrintableString = 316, - kw_REAL = 317, - kw_RELATIVE_OID = 318, - kw_SEQUENCE = 319, - kw_SET = 320, - kw_SIZE = 321, - kw_STRING = 322, - kw_SYNTAX = 323, - kw_T61String = 324, - kw_TAGS = 325, - kw_TRUE = 326, - kw_TYPE_IDENTIFIER = 327, - kw_TeletexString = 328, - kw_UNION = 329, - kw_UNIQUE = 330, - kw_UNIVERSAL = 331, - kw_UTCTime = 332, - kw_UTF8String = 333, - kw_UniversalString = 334, - kw_VideotexString = 335, - kw_VisibleString = 336, - kw_WITH = 337, - RANGE = 338, - EEQUAL = 339, - ELLIPSIS = 340, - IDENTIFIER = 341, - referencename = 342, - STRING = 343, - NUMBER = 344 - }; + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + kw_ABSENT = 258, /* kw_ABSENT */ + kw_ABSTRACT_SYNTAX = 259, /* kw_ABSTRACT_SYNTAX */ + kw_ALL = 260, /* kw_ALL */ + kw_APPLICATION = 261, /* kw_APPLICATION */ + kw_AUTOMATIC = 262, /* kw_AUTOMATIC */ + kw_BEGIN = 263, /* kw_BEGIN */ + kw_BIT = 264, /* kw_BIT */ + kw_BMPString = 265, /* kw_BMPString */ + kw_BOOLEAN = 266, /* kw_BOOLEAN */ + kw_BY = 267, /* kw_BY */ + kw_CHARACTER = 268, /* kw_CHARACTER */ + kw_CHOICE = 269, /* kw_CHOICE */ + kw_CLASS = 270, /* kw_CLASS */ + kw_COMPONENT = 271, /* kw_COMPONENT */ + kw_COMPONENTS = 272, /* kw_COMPONENTS */ + kw_CONSTRAINED = 273, /* kw_CONSTRAINED */ + kw_CONTAINING = 274, /* kw_CONTAINING */ + kw_DEFAULT = 275, /* kw_DEFAULT */ + kw_DEFINITIONS = 276, /* kw_DEFINITIONS */ + kw_EMBEDDED = 277, /* kw_EMBEDDED */ + kw_ENCODED = 278, /* kw_ENCODED */ + kw_END = 279, /* kw_END */ + kw_ENUMERATED = 280, /* kw_ENUMERATED */ + kw_EXCEPT = 281, /* kw_EXCEPT */ + kw_EXPLICIT = 282, /* kw_EXPLICIT */ + kw_EXPORTS = 283, /* kw_EXPORTS */ + kw_EXTENSIBILITY = 284, /* kw_EXTENSIBILITY */ + kw_EXTERNAL = 285, /* kw_EXTERNAL */ + kw_FALSE = 286, /* kw_FALSE */ + kw_FROM = 287, /* kw_FROM */ + kw_GeneralString = 288, /* kw_GeneralString */ + kw_GeneralizedTime = 289, /* kw_GeneralizedTime */ + kw_GraphicString = 290, /* kw_GraphicString */ + kw_IA5String = 291, /* kw_IA5String */ + kw_IDENTIFIER = 292, /* kw_IDENTIFIER */ + kw_IMPLICIT = 293, /* kw_IMPLICIT */ + kw_IMPLIED = 294, /* kw_IMPLIED */ + kw_IMPORTS = 295, /* kw_IMPORTS */ + kw_INCLUDES = 296, /* kw_INCLUDES */ + kw_INSTANCE = 297, /* kw_INSTANCE */ + kw_INTEGER = 298, /* kw_INTEGER */ + kw_INTERSECTION = 299, /* kw_INTERSECTION */ + kw_ISO646String = 300, /* kw_ISO646String */ + kw_MAX = 301, /* kw_MAX */ + kw_MIN = 302, /* kw_MIN */ + kw_MINUS_INFINITY = 303, /* kw_MINUS_INFINITY */ + kw_NULL = 304, /* kw_NULL */ + kw_NumericString = 305, /* kw_NumericString */ + kw_OBJECT = 306, /* kw_OBJECT */ + kw_OCTET = 307, /* kw_OCTET */ + kw_OF = 308, /* kw_OF */ + kw_OPTIONAL = 309, /* kw_OPTIONAL */ + kw_ObjectDescriptor = 310, /* kw_ObjectDescriptor */ + kw_PATTERN = 311, /* kw_PATTERN */ + kw_PDV = 312, /* kw_PDV */ + kw_PLUS_INFINITY = 313, /* kw_PLUS_INFINITY */ + kw_PRESENT = 314, /* kw_PRESENT */ + kw_PRIVATE = 315, /* kw_PRIVATE */ + kw_PrintableString = 316, /* kw_PrintableString */ + kw_REAL = 317, /* kw_REAL */ + kw_RELATIVE_OID = 318, /* kw_RELATIVE_OID */ + kw_SEQUENCE = 319, /* kw_SEQUENCE */ + kw_SET = 320, /* kw_SET */ + kw_SIZE = 321, /* kw_SIZE */ + kw_STRING = 322, /* kw_STRING */ + kw_SYNTAX = 323, /* kw_SYNTAX */ + kw_T61String = 324, /* kw_T61String */ + kw_TAGS = 325, /* kw_TAGS */ + kw_TRUE = 326, /* kw_TRUE */ + kw_TYPE_IDENTIFIER = 327, /* kw_TYPE_IDENTIFIER */ + kw_TeletexString = 328, /* kw_TeletexString */ + kw_UNION = 329, /* kw_UNION */ + kw_UNIQUE = 330, /* kw_UNIQUE */ + kw_UNIVERSAL = 331, /* kw_UNIVERSAL */ + kw_UTCTime = 332, /* kw_UTCTime */ + kw_UTF8String = 333, /* kw_UTF8String */ + kw_UniversalString = 334, /* kw_UniversalString */ + kw_VideotexString = 335, /* kw_VideotexString */ + kw_VisibleString = 336, /* kw_VisibleString */ + kw_WITH = 337, /* kw_WITH */ + RANGE = 338, /* RANGE */ + EEQUAL = 339, /* EEQUAL */ + ELLIPSIS = 340, /* ELLIPSIS */ + IDENTIFIER = 341, /* IDENTIFIER */ + referencename = 342, /* referencename */ + STRING = 343, /* STRING */ + NUMBER = 344 /* NUMBER */ + }; + typedef enum yytokentype yytoken_kind_t; #endif -/* Tokens. */ +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 #define kw_ABSENT 258 #define kw_ABSTRACT_SYNTAX 259 #define kw_ALL 260 @@ -217,14 +237,13 @@ #define STRING 343 #define NUMBER 344 - - - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 71 "asn1parse.y" +union YYSTYPE { - int constant; +#line 72 "asn1parse.y" + + int64_t constant; struct value *value; struct range *range; char *name; @@ -236,14 +255,20 @@ struct tagtype tag; struct memhead *members; struct constraint_spec *constraint_spec; -} -/* Line 1529 of yacc.c. */ -#line 242 "asn1parse.h" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 + +#line 260 "asn1parse.h" + +}; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 #endif + extern YYSTYPE yylval; + +int yyparse (void); + + +#endif /* !YY_YY_ASN_PARSE_H_INCLUDED */ diff --git a/crypto/heimdal/lib/asn1/asn1parse.c b/crypto/heimdal/lib/asn1/asn1parse.c --- a/crypto/heimdal/lib/asn1/asn1parse.c +++ b/crypto/heimdal/lib/asn1/asn1parse.c @@ -1,14 +1,14 @@ -/* A Bison parser, made by GNU Bison 2.3. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ -/* Skeleton implementation for Bison's Yacc-like parsers in C +/* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. - This program is free software; you can redistribute it and/or modify + 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. + 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 @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -36,6 +34,10 @@ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. @@ -43,11 +45,11 @@ define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ -/* Identify Bison output. */ -#define YYBISON 1 +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 -/* Bison version. */ -#define YYBISON_VERSION "2.3" +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -55,107 +57,189 @@ /* Pure parsers. */ #define YYPURE 0 -/* Using locations. */ -#define YYLSP_NEEDED 0 +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + + + +/* First part of user prologue. */ +#line 38 "asn1parse.y" + + +#include + +#include +#include +#include +#include +#include "symbol.h" +#include "lex.h" +#include "gen_locl.h" +#include "der.h" + +static Type *new_type (Typetype t); +static struct constraint_spec *new_constraint_spec(enum ctype); +static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype); +void yyerror (const char *); +static struct objid *new_objid(const char *label, int value); +static void add_oid_to_tail(struct objid *, struct objid *); +static void fix_labels(Symbol *s); + +struct string_list { + char *string; + struct string_list *next; +}; + +static int default_tag_env = TE_EXPLICIT; +/* Declarations for Bison */ +#define YYMALLOC malloc +#define YYFREE free + + +#line 105 "asn1parse.c" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif +/* Use api.header.include to #include this header + instead of duplicating it here. */ +#ifndef YY_YY_ASN_PARSE_H_INCLUDED +# define YY_YY_ASN_PARSE_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif +#if YYDEBUG +extern int yydebug; +#endif -/* Tokens. */ +/* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - kw_ABSENT = 258, - kw_ABSTRACT_SYNTAX = 259, - kw_ALL = 260, - kw_APPLICATION = 261, - kw_AUTOMATIC = 262, - kw_BEGIN = 263, - kw_BIT = 264, - kw_BMPString = 265, - kw_BOOLEAN = 266, - kw_BY = 267, - kw_CHARACTER = 268, - kw_CHOICE = 269, - kw_CLASS = 270, - kw_COMPONENT = 271, - kw_COMPONENTS = 272, - kw_CONSTRAINED = 273, - kw_CONTAINING = 274, - kw_DEFAULT = 275, - kw_DEFINITIONS = 276, - kw_EMBEDDED = 277, - kw_ENCODED = 278, - kw_END = 279, - kw_ENUMERATED = 280, - kw_EXCEPT = 281, - kw_EXPLICIT = 282, - kw_EXPORTS = 283, - kw_EXTENSIBILITY = 284, - kw_EXTERNAL = 285, - kw_FALSE = 286, - kw_FROM = 287, - kw_GeneralString = 288, - kw_GeneralizedTime = 289, - kw_GraphicString = 290, - kw_IA5String = 291, - kw_IDENTIFIER = 292, - kw_IMPLICIT = 293, - kw_IMPLIED = 294, - kw_IMPORTS = 295, - kw_INCLUDES = 296, - kw_INSTANCE = 297, - kw_INTEGER = 298, - kw_INTERSECTION = 299, - kw_ISO646String = 300, - kw_MAX = 301, - kw_MIN = 302, - kw_MINUS_INFINITY = 303, - kw_NULL = 304, - kw_NumericString = 305, - kw_OBJECT = 306, - kw_OCTET = 307, - kw_OF = 308, - kw_OPTIONAL = 309, - kw_ObjectDescriptor = 310, - kw_PATTERN = 311, - kw_PDV = 312, - kw_PLUS_INFINITY = 313, - kw_PRESENT = 314, - kw_PRIVATE = 315, - kw_PrintableString = 316, - kw_REAL = 317, - kw_RELATIVE_OID = 318, - kw_SEQUENCE = 319, - kw_SET = 320, - kw_SIZE = 321, - kw_STRING = 322, - kw_SYNTAX = 323, - kw_T61String = 324, - kw_TAGS = 325, - kw_TRUE = 326, - kw_TYPE_IDENTIFIER = 327, - kw_TeletexString = 328, - kw_UNION = 329, - kw_UNIQUE = 330, - kw_UNIVERSAL = 331, - kw_UTCTime = 332, - kw_UTF8String = 333, - kw_UniversalString = 334, - kw_VideotexString = 335, - kw_VisibleString = 336, - kw_WITH = 337, - RANGE = 338, - EEQUAL = 339, - ELLIPSIS = 340, - IDENTIFIER = 341, - referencename = 342, - STRING = 343, - NUMBER = 344 - }; + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + kw_ABSENT = 258, /* kw_ABSENT */ + kw_ABSTRACT_SYNTAX = 259, /* kw_ABSTRACT_SYNTAX */ + kw_ALL = 260, /* kw_ALL */ + kw_APPLICATION = 261, /* kw_APPLICATION */ + kw_AUTOMATIC = 262, /* kw_AUTOMATIC */ + kw_BEGIN = 263, /* kw_BEGIN */ + kw_BIT = 264, /* kw_BIT */ + kw_BMPString = 265, /* kw_BMPString */ + kw_BOOLEAN = 266, /* kw_BOOLEAN */ + kw_BY = 267, /* kw_BY */ + kw_CHARACTER = 268, /* kw_CHARACTER */ + kw_CHOICE = 269, /* kw_CHOICE */ + kw_CLASS = 270, /* kw_CLASS */ + kw_COMPONENT = 271, /* kw_COMPONENT */ + kw_COMPONENTS = 272, /* kw_COMPONENTS */ + kw_CONSTRAINED = 273, /* kw_CONSTRAINED */ + kw_CONTAINING = 274, /* kw_CONTAINING */ + kw_DEFAULT = 275, /* kw_DEFAULT */ + kw_DEFINITIONS = 276, /* kw_DEFINITIONS */ + kw_EMBEDDED = 277, /* kw_EMBEDDED */ + kw_ENCODED = 278, /* kw_ENCODED */ + kw_END = 279, /* kw_END */ + kw_ENUMERATED = 280, /* kw_ENUMERATED */ + kw_EXCEPT = 281, /* kw_EXCEPT */ + kw_EXPLICIT = 282, /* kw_EXPLICIT */ + kw_EXPORTS = 283, /* kw_EXPORTS */ + kw_EXTENSIBILITY = 284, /* kw_EXTENSIBILITY */ + kw_EXTERNAL = 285, /* kw_EXTERNAL */ + kw_FALSE = 286, /* kw_FALSE */ + kw_FROM = 287, /* kw_FROM */ + kw_GeneralString = 288, /* kw_GeneralString */ + kw_GeneralizedTime = 289, /* kw_GeneralizedTime */ + kw_GraphicString = 290, /* kw_GraphicString */ + kw_IA5String = 291, /* kw_IA5String */ + kw_IDENTIFIER = 292, /* kw_IDENTIFIER */ + kw_IMPLICIT = 293, /* kw_IMPLICIT */ + kw_IMPLIED = 294, /* kw_IMPLIED */ + kw_IMPORTS = 295, /* kw_IMPORTS */ + kw_INCLUDES = 296, /* kw_INCLUDES */ + kw_INSTANCE = 297, /* kw_INSTANCE */ + kw_INTEGER = 298, /* kw_INTEGER */ + kw_INTERSECTION = 299, /* kw_INTERSECTION */ + kw_ISO646String = 300, /* kw_ISO646String */ + kw_MAX = 301, /* kw_MAX */ + kw_MIN = 302, /* kw_MIN */ + kw_MINUS_INFINITY = 303, /* kw_MINUS_INFINITY */ + kw_NULL = 304, /* kw_NULL */ + kw_NumericString = 305, /* kw_NumericString */ + kw_OBJECT = 306, /* kw_OBJECT */ + kw_OCTET = 307, /* kw_OCTET */ + kw_OF = 308, /* kw_OF */ + kw_OPTIONAL = 309, /* kw_OPTIONAL */ + kw_ObjectDescriptor = 310, /* kw_ObjectDescriptor */ + kw_PATTERN = 311, /* kw_PATTERN */ + kw_PDV = 312, /* kw_PDV */ + kw_PLUS_INFINITY = 313, /* kw_PLUS_INFINITY */ + kw_PRESENT = 314, /* kw_PRESENT */ + kw_PRIVATE = 315, /* kw_PRIVATE */ + kw_PrintableString = 316, /* kw_PrintableString */ + kw_REAL = 317, /* kw_REAL */ + kw_RELATIVE_OID = 318, /* kw_RELATIVE_OID */ + kw_SEQUENCE = 319, /* kw_SEQUENCE */ + kw_SET = 320, /* kw_SET */ + kw_SIZE = 321, /* kw_SIZE */ + kw_STRING = 322, /* kw_STRING */ + kw_SYNTAX = 323, /* kw_SYNTAX */ + kw_T61String = 324, /* kw_T61String */ + kw_TAGS = 325, /* kw_TAGS */ + kw_TRUE = 326, /* kw_TRUE */ + kw_TYPE_IDENTIFIER = 327, /* kw_TYPE_IDENTIFIER */ + kw_TeletexString = 328, /* kw_TeletexString */ + kw_UNION = 329, /* kw_UNION */ + kw_UNIQUE = 330, /* kw_UNIQUE */ + kw_UNIVERSAL = 331, /* kw_UNIVERSAL */ + kw_UTCTime = 332, /* kw_UTCTime */ + kw_UTF8String = 333, /* kw_UTF8String */ + kw_UniversalString = 334, /* kw_UniversalString */ + kw_VideotexString = 335, /* kw_VideotexString */ + kw_VisibleString = 336, /* kw_VisibleString */ + kw_WITH = 337, /* kw_WITH */ + RANGE = 338, /* RANGE */ + EEQUAL = 339, /* EEQUAL */ + ELLIPSIS = 340, /* ELLIPSIS */ + IDENTIFIER = 341, /* IDENTIFIER */ + referencename = 342, /* referencename */ + STRING = 343, /* STRING */ + NUMBER = 344 /* NUMBER */ + }; + typedef enum yytokentype yytoken_kind_t; #endif -/* Tokens. */ +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 #define kw_ABSENT 258 #define kw_ABSTRACT_SYNTAX 259 #define kw_ALL 260 @@ -244,67 +328,13 @@ #define STRING 343 #define NUMBER 344 - - - -/* Copy the first part of user declarations. */ -#line 38 "asn1parse.y" - - -#include - -#include -#include -#include -#include "symbol.h" -#include "lex.h" -#include "gen_locl.h" -#include "der.h" - -RCSID("$Id$"); - -static Type *new_type (Typetype t); -static struct constraint_spec *new_constraint_spec(enum ctype); -static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype); -void yyerror (const char *); -static struct objid *new_objid(const char *label, int value); -static void add_oid_to_tail(struct objid *, struct objid *); -static void fix_labels(Symbol *s); - -struct string_list { - char *string; - struct string_list *next; -}; - -/* Declarations for Bison */ -#define YYMALLOC malloc -#define YYFREE free - - - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 1 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 71 "asn1parse.y" +union YYSTYPE { - int constant; +#line 72 "asn1parse.y" + + int64_t constant; struct value *value; struct range *range; char *name; @@ -316,52 +346,285 @@ struct tagtype tag; struct memhead *members; struct constraint_spec *constraint_spec; -} -/* Line 193 of yacc.c. */ -#line 322 "asn1parse.c" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 + +#line 351 "asn1parse.c" + +}; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 #endif +extern YYSTYPE yylval; + + +int yyparse (void); + + +#endif /* !YY_YY_ASN_PARSE_H_INCLUDED */ +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_kw_ABSENT = 3, /* kw_ABSENT */ + YYSYMBOL_kw_ABSTRACT_SYNTAX = 4, /* kw_ABSTRACT_SYNTAX */ + YYSYMBOL_kw_ALL = 5, /* kw_ALL */ + YYSYMBOL_kw_APPLICATION = 6, /* kw_APPLICATION */ + YYSYMBOL_kw_AUTOMATIC = 7, /* kw_AUTOMATIC */ + YYSYMBOL_kw_BEGIN = 8, /* kw_BEGIN */ + YYSYMBOL_kw_BIT = 9, /* kw_BIT */ + YYSYMBOL_kw_BMPString = 10, /* kw_BMPString */ + YYSYMBOL_kw_BOOLEAN = 11, /* kw_BOOLEAN */ + YYSYMBOL_kw_BY = 12, /* kw_BY */ + YYSYMBOL_kw_CHARACTER = 13, /* kw_CHARACTER */ + YYSYMBOL_kw_CHOICE = 14, /* kw_CHOICE */ + YYSYMBOL_kw_CLASS = 15, /* kw_CLASS */ + YYSYMBOL_kw_COMPONENT = 16, /* kw_COMPONENT */ + YYSYMBOL_kw_COMPONENTS = 17, /* kw_COMPONENTS */ + YYSYMBOL_kw_CONSTRAINED = 18, /* kw_CONSTRAINED */ + YYSYMBOL_kw_CONTAINING = 19, /* kw_CONTAINING */ + YYSYMBOL_kw_DEFAULT = 20, /* kw_DEFAULT */ + YYSYMBOL_kw_DEFINITIONS = 21, /* kw_DEFINITIONS */ + YYSYMBOL_kw_EMBEDDED = 22, /* kw_EMBEDDED */ + YYSYMBOL_kw_ENCODED = 23, /* kw_ENCODED */ + YYSYMBOL_kw_END = 24, /* kw_END */ + YYSYMBOL_kw_ENUMERATED = 25, /* kw_ENUMERATED */ + YYSYMBOL_kw_EXCEPT = 26, /* kw_EXCEPT */ + YYSYMBOL_kw_EXPLICIT = 27, /* kw_EXPLICIT */ + YYSYMBOL_kw_EXPORTS = 28, /* kw_EXPORTS */ + YYSYMBOL_kw_EXTENSIBILITY = 29, /* kw_EXTENSIBILITY */ + YYSYMBOL_kw_EXTERNAL = 30, /* kw_EXTERNAL */ + YYSYMBOL_kw_FALSE = 31, /* kw_FALSE */ + YYSYMBOL_kw_FROM = 32, /* kw_FROM */ + YYSYMBOL_kw_GeneralString = 33, /* kw_GeneralString */ + YYSYMBOL_kw_GeneralizedTime = 34, /* kw_GeneralizedTime */ + YYSYMBOL_kw_GraphicString = 35, /* kw_GraphicString */ + YYSYMBOL_kw_IA5String = 36, /* kw_IA5String */ + YYSYMBOL_kw_IDENTIFIER = 37, /* kw_IDENTIFIER */ + YYSYMBOL_kw_IMPLICIT = 38, /* kw_IMPLICIT */ + YYSYMBOL_kw_IMPLIED = 39, /* kw_IMPLIED */ + YYSYMBOL_kw_IMPORTS = 40, /* kw_IMPORTS */ + YYSYMBOL_kw_INCLUDES = 41, /* kw_INCLUDES */ + YYSYMBOL_kw_INSTANCE = 42, /* kw_INSTANCE */ + YYSYMBOL_kw_INTEGER = 43, /* kw_INTEGER */ + YYSYMBOL_kw_INTERSECTION = 44, /* kw_INTERSECTION */ + YYSYMBOL_kw_ISO646String = 45, /* kw_ISO646String */ + YYSYMBOL_kw_MAX = 46, /* kw_MAX */ + YYSYMBOL_kw_MIN = 47, /* kw_MIN */ + YYSYMBOL_kw_MINUS_INFINITY = 48, /* kw_MINUS_INFINITY */ + YYSYMBOL_kw_NULL = 49, /* kw_NULL */ + YYSYMBOL_kw_NumericString = 50, /* kw_NumericString */ + YYSYMBOL_kw_OBJECT = 51, /* kw_OBJECT */ + YYSYMBOL_kw_OCTET = 52, /* kw_OCTET */ + YYSYMBOL_kw_OF = 53, /* kw_OF */ + YYSYMBOL_kw_OPTIONAL = 54, /* kw_OPTIONAL */ + YYSYMBOL_kw_ObjectDescriptor = 55, /* kw_ObjectDescriptor */ + YYSYMBOL_kw_PATTERN = 56, /* kw_PATTERN */ + YYSYMBOL_kw_PDV = 57, /* kw_PDV */ + YYSYMBOL_kw_PLUS_INFINITY = 58, /* kw_PLUS_INFINITY */ + YYSYMBOL_kw_PRESENT = 59, /* kw_PRESENT */ + YYSYMBOL_kw_PRIVATE = 60, /* kw_PRIVATE */ + YYSYMBOL_kw_PrintableString = 61, /* kw_PrintableString */ + YYSYMBOL_kw_REAL = 62, /* kw_REAL */ + YYSYMBOL_kw_RELATIVE_OID = 63, /* kw_RELATIVE_OID */ + YYSYMBOL_kw_SEQUENCE = 64, /* kw_SEQUENCE */ + YYSYMBOL_kw_SET = 65, /* kw_SET */ + YYSYMBOL_kw_SIZE = 66, /* kw_SIZE */ + YYSYMBOL_kw_STRING = 67, /* kw_STRING */ + YYSYMBOL_kw_SYNTAX = 68, /* kw_SYNTAX */ + YYSYMBOL_kw_T61String = 69, /* kw_T61String */ + YYSYMBOL_kw_TAGS = 70, /* kw_TAGS */ + YYSYMBOL_kw_TRUE = 71, /* kw_TRUE */ + YYSYMBOL_kw_TYPE_IDENTIFIER = 72, /* kw_TYPE_IDENTIFIER */ + YYSYMBOL_kw_TeletexString = 73, /* kw_TeletexString */ + YYSYMBOL_kw_UNION = 74, /* kw_UNION */ + YYSYMBOL_kw_UNIQUE = 75, /* kw_UNIQUE */ + YYSYMBOL_kw_UNIVERSAL = 76, /* kw_UNIVERSAL */ + YYSYMBOL_kw_UTCTime = 77, /* kw_UTCTime */ + YYSYMBOL_kw_UTF8String = 78, /* kw_UTF8String */ + YYSYMBOL_kw_UniversalString = 79, /* kw_UniversalString */ + YYSYMBOL_kw_VideotexString = 80, /* kw_VideotexString */ + YYSYMBOL_kw_VisibleString = 81, /* kw_VisibleString */ + YYSYMBOL_kw_WITH = 82, /* kw_WITH */ + YYSYMBOL_RANGE = 83, /* RANGE */ + YYSYMBOL_EEQUAL = 84, /* EEQUAL */ + YYSYMBOL_ELLIPSIS = 85, /* ELLIPSIS */ + YYSYMBOL_IDENTIFIER = 86, /* IDENTIFIER */ + YYSYMBOL_referencename = 87, /* referencename */ + YYSYMBOL_STRING = 88, /* STRING */ + YYSYMBOL_NUMBER = 89, /* NUMBER */ + YYSYMBOL_90_ = 90, /* ';' */ + YYSYMBOL_91_ = 91, /* ',' */ + YYSYMBOL_92_ = 92, /* '(' */ + YYSYMBOL_93_ = 93, /* ')' */ + YYSYMBOL_94_ = 94, /* '{' */ + YYSYMBOL_95_ = 95, /* '}' */ + YYSYMBOL_96_ = 96, /* '[' */ + YYSYMBOL_97_ = 97, /* ']' */ + YYSYMBOL_YYACCEPT = 98, /* $accept */ + YYSYMBOL_ModuleDefinition = 99, /* ModuleDefinition */ + YYSYMBOL_TagDefault = 100, /* TagDefault */ + YYSYMBOL_ExtensionDefault = 101, /* ExtensionDefault */ + YYSYMBOL_ModuleBody = 102, /* ModuleBody */ + YYSYMBOL_Imports = 103, /* Imports */ + YYSYMBOL_SymbolsImported = 104, /* SymbolsImported */ + YYSYMBOL_SymbolsFromModuleList = 105, /* SymbolsFromModuleList */ + YYSYMBOL_SymbolsFromModule = 106, /* SymbolsFromModule */ + YYSYMBOL_Exports = 107, /* Exports */ + YYSYMBOL_AssignmentList = 108, /* AssignmentList */ + YYSYMBOL_Assignment = 109, /* Assignment */ + YYSYMBOL_referencenames = 110, /* referencenames */ + YYSYMBOL_TypeAssignment = 111, /* TypeAssignment */ + YYSYMBOL_Type = 112, /* Type */ + YYSYMBOL_BuiltinType = 113, /* BuiltinType */ + YYSYMBOL_BooleanType = 114, /* BooleanType */ + YYSYMBOL_range = 115, /* range */ + YYSYMBOL_IntegerType = 116, /* IntegerType */ + YYSYMBOL_NamedNumberList = 117, /* NamedNumberList */ + YYSYMBOL_NamedNumber = 118, /* NamedNumber */ + YYSYMBOL_EnumeratedType = 119, /* EnumeratedType */ + YYSYMBOL_Enumerations = 120, /* Enumerations */ + YYSYMBOL_BitStringType = 121, /* BitStringType */ + YYSYMBOL_ObjectIdentifierType = 122, /* ObjectIdentifierType */ + YYSYMBOL_OctetStringType = 123, /* OctetStringType */ + YYSYMBOL_NullType = 124, /* NullType */ + YYSYMBOL_size = 125, /* size */ + YYSYMBOL_SequenceType = 126, /* SequenceType */ + YYSYMBOL_SequenceOfType = 127, /* SequenceOfType */ + YYSYMBOL_SetType = 128, /* SetType */ + YYSYMBOL_SetOfType = 129, /* SetOfType */ + YYSYMBOL_ChoiceType = 130, /* ChoiceType */ + YYSYMBOL_ReferencedType = 131, /* ReferencedType */ + YYSYMBOL_DefinedType = 132, /* DefinedType */ + YYSYMBOL_UsefulType = 133, /* UsefulType */ + YYSYMBOL_ConstrainedType = 134, /* ConstrainedType */ + YYSYMBOL_Constraint = 135, /* Constraint */ + YYSYMBOL_ConstraintSpec = 136, /* ConstraintSpec */ + YYSYMBOL_GeneralConstraint = 137, /* GeneralConstraint */ + YYSYMBOL_ContentsConstraint = 138, /* ContentsConstraint */ + YYSYMBOL_UserDefinedConstraint = 139, /* UserDefinedConstraint */ + YYSYMBOL_TaggedType = 140, /* TaggedType */ + YYSYMBOL_Tag = 141, /* Tag */ + YYSYMBOL_Class = 142, /* Class */ + YYSYMBOL_tagenv = 143, /* tagenv */ + YYSYMBOL_ValueAssignment = 144, /* ValueAssignment */ + YYSYMBOL_CharacterStringType = 145, /* CharacterStringType */ + YYSYMBOL_RestrictedCharactedStringType = 146, /* RestrictedCharactedStringType */ + YYSYMBOL_ComponentTypeList = 147, /* ComponentTypeList */ + YYSYMBOL_NamedType = 148, /* NamedType */ + YYSYMBOL_ComponentType = 149, /* ComponentType */ + YYSYMBOL_NamedBitList = 150, /* NamedBitList */ + YYSYMBOL_NamedBit = 151, /* NamedBit */ + YYSYMBOL_objid_opt = 152, /* objid_opt */ + YYSYMBOL_objid = 153, /* objid */ + YYSYMBOL_objid_list = 154, /* objid_list */ + YYSYMBOL_objid_element = 155, /* objid_element */ + YYSYMBOL_Value = 156, /* Value */ + YYSYMBOL_BuiltinValue = 157, /* BuiltinValue */ + YYSYMBOL_ReferencedValue = 158, /* ReferencedValue */ + YYSYMBOL_DefinedValue = 159, /* DefinedValue */ + YYSYMBOL_Valuereference = 160, /* Valuereference */ + YYSYMBOL_CharacterStringValue = 161, /* CharacterStringValue */ + YYSYMBOL_BooleanValue = 162, /* BooleanValue */ + YYSYMBOL_IntegerValue = 163, /* IntegerValue */ + YYSYMBOL_SignedNumber = 164, /* SignedNumber */ + YYSYMBOL_NullValue = 165, /* NullValue */ + YYSYMBOL_ObjectIdentifierValue = 166 /* ObjectIdentifierValue */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; -/* Copy the second part of user declarations. */ -/* Line 216 of yacc.c. */ -#line 335 "asn1parse.c" #ifdef short # undef short #endif -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif #endif -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; #else -typedef short int yytype_int8; +typedef short yytype_int16; +#endif + +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 #endif -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; #else -typedef unsigned short int yytype_uint16; +typedef short yytype_uint8; #endif -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; #else -typedef short int yytype_int16; +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif #endif #ifndef YYSIZE_T @@ -369,55 +632,106 @@ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else -# define YYSIZE_T unsigned int +# define YYSIZE_T unsigned # endif #endif -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_uint8 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ -# define YY_(msgid) msgid +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) +# define YY_USE(E) ((void) (E)) #else -# define YYUSE(e) /* empty */ +# define YY_USE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") #else -static int -YYID (i) - int i; +# define YY_INITIAL_VALUE(Value) Value #endif -{ - return i; -} +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ #endif -#if ! defined yyoverflow || YYERROR_VERBOSE +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -434,11 +748,11 @@ # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # endif @@ -446,8 +760,8 @@ # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -461,88 +775,89 @@ # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif -# if (defined __cplusplus && ! defined _STDLIB_H \ +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - +#endif /* !defined yyoverflow */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { - yytype_int16 yyss; - YYSTYPE yyvs; - }; + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; /* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif +# define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) #endif +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + /* YYFINAL -- State number of the termination state. */ #define YYFINAL 6 /* YYLAST -- Last index in YYTABLE. */ @@ -554,18 +869,23 @@ #define YYNNTS 69 /* YYNRULES -- Number of rules. */ #define YYNRULES 140 -/* YYNRULES -- Number of states. */ +/* YYNSTATES -- Number of states. */ #define YYNSTATES 220 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 +/* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 344 -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -605,108 +925,49 @@ }; #if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint16 yyprhs[] = +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int16 yyrline[] = { - 0, 0, 3, 13, 16, 19, 22, 23, 26, 27, - 31, 32, 36, 37, 39, 40, 42, 45, 50, 54, - 57, 58, 60, 63, 65, 67, 71, 73, 77, 79, - 81, 83, 85, 87, 89, 91, 93, 95, 97, 99, - 101, 103, 105, 107, 109, 111, 113, 119, 125, 131, - 135, 137, 140, 145, 147, 151, 155, 160, 165, 167, - 170, 176, 179, 183, 185, 186, 189, 194, 198, 203, - 208, 212, 216, 221, 223, 225, 227, 229, 231, 234, - 238, 240, 242, 244, 247, 251, 257, 262, 266, 271, - 272, 274, 276, 278, 279, 281, 283, 288, 290, 292, - 294, 296, 298, 300, 302, 304, 306, 308, 312, 316, - 319, 321, 324, 328, 330, 334, 339, 341, 342, 346, - 347, 350, 355, 357, 359, 361, 363, 365, 367, 369, - 371, 373, 375, 377, 379, 381, 383, 385, 387, 389, - 391 + 0, 240, 240, 247, 249, 251, 253, 256, 258, 261, + 262, 265, 266, 269, 270, 273, 274, 277, 289, 295, + 296, 299, 300, 303, 304, 307, 313, 321, 331, 332, + 333, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 352, 359, 369, 377, 385, + 396, 401, 407, 415, 421, 426, 430, 443, 451, 454, + 461, 469, 475, 489, 497, 498, 503, 509, 517, 532, + 538, 546, 554, 561, 562, 565, 576, 581, 588, 604, + 610, 613, 614, 617, 623, 631, 641, 647, 665, 674, + 677, 681, 685, 692, 695, 699, 706, 717, 720, 725, + 730, 735, 740, 745, 750, 755, 763, 769, 774, 785, + 796, 802, 808, 816, 822, 829, 842, 843, 846, 853, + 856, 867, 871, 882, 888, 889, 892, 893, 894, 895, + 896, 899, 902, 905, 916, 924, 930, 938, 946, 949, + 954 }; +#endif -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int16 yyrhs[] = -{ - 99, 0, -1, 86, 152, 21, 100, 101, 84, 8, - 102, 24, -1, 27, 70, -1, 38, 70, -1, 7, - 70, -1, -1, 29, 39, -1, -1, 107, 103, 108, - -1, -1, 40, 104, 90, -1, -1, 105, -1, -1, - 106, -1, 105, 106, -1, 110, 32, 86, 152, -1, - 28, 110, 90, -1, 28, 5, -1, -1, 109, -1, - 109, 108, -1, 111, -1, 144, -1, 86, 91, 110, - -1, 86, -1, 86, 84, 112, -1, 113, -1, 131, - -1, 134, -1, 121, -1, 114, -1, 145, -1, 130, - -1, 119, -1, 116, -1, 124, -1, 122, -1, 123, - -1, 126, -1, 127, -1, 128, -1, 129, -1, 140, - -1, 11, -1, 92, 156, 83, 156, 93, -1, 92, - 156, 83, 46, 93, -1, 92, 47, 83, 156, 93, - -1, 92, 156, 93, -1, 43, -1, 43, 115, -1, - 43, 94, 117, 95, -1, 118, -1, 117, 91, 118, - -1, 117, 91, 85, -1, 86, 92, 164, 93, -1, - 25, 94, 120, 95, -1, 117, -1, 9, 67, -1, - 9, 67, 94, 150, 95, -1, 51, 37, -1, 52, - 67, 125, -1, 49, -1, -1, 66, 115, -1, 64, - 94, 147, 95, -1, 64, 94, 95, -1, 64, 125, - 53, 112, -1, 65, 94, 147, 95, -1, 65, 94, - 95, -1, 65, 53, 112, -1, 14, 94, 147, 95, - -1, 132, -1, 133, -1, 86, -1, 34, -1, 77, - -1, 112, 135, -1, 92, 136, 93, -1, 137, -1, - 138, -1, 139, -1, 19, 112, -1, 23, 12, 156, - -1, 19, 112, 23, 12, 156, -1, 18, 12, 94, - 95, -1, 141, 143, 112, -1, 96, 142, 89, 97, - -1, -1, 76, -1, 6, -1, 60, -1, -1, 27, - -1, 38, -1, 86, 112, 84, 156, -1, 146, -1, - 33, -1, 73, -1, 78, -1, 61, -1, 81, -1, - 36, -1, 10, -1, 79, -1, 149, -1, 147, 91, - 149, -1, 147, 91, 85, -1, 86, 112, -1, 148, - -1, 148, 54, -1, 148, 20, 156, -1, 151, -1, - 150, 91, 151, -1, 86, 92, 89, 93, -1, 153, - -1, -1, 94, 154, 95, -1, -1, 155, 154, -1, - 86, 92, 89, 93, -1, 86, -1, 89, -1, 157, - -1, 158, -1, 162, -1, 161, -1, 163, -1, 166, - -1, 165, -1, 159, -1, 160, -1, 86, -1, 88, - -1, 71, -1, 31, -1, 164, -1, 89, -1, 49, - -1, 153, -1 -}; +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 239, 239, 246, 247, 249, 251, 254, 256, 259, - 260, 263, 264, 267, 268, 271, 272, 275, 287, 293, - 294, 297, 298, 301, 302, 305, 311, 319, 329, 330, - 331, 334, 335, 336, 337, 338, 339, 340, 341, 342, - 343, 344, 345, 346, 347, 350, 357, 367, 375, 383, - 394, 399, 405, 413, 419, 424, 428, 441, 449, 452, - 459, 467, 473, 482, 490, 491, 496, 502, 510, 519, - 525, 533, 541, 548, 549, 552, 563, 568, 575, 591, - 597, 600, 601, 604, 610, 618, 628, 634, 647, 656, - 659, 663, 667, 674, 677, 681, 688, 699, 702, 707, - 712, 717, 722, 727, 732, 737, 745, 751, 756, 767, - 778, 784, 790, 798, 804, 811, 824, 825, 828, 835, - 838, 849, 853, 864, 870, 871, 874, 875, 876, 877, - 878, 881, 884, 887, 898, 906, 912, 920, 928, 931, - 936 -}; -#endif +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "kw_ABSENT", "kw_ABSTRACT_SYNTAX", - "kw_ALL", "kw_APPLICATION", "kw_AUTOMATIC", "kw_BEGIN", "kw_BIT", - "kw_BMPString", "kw_BOOLEAN", "kw_BY", "kw_CHARACTER", "kw_CHOICE", - "kw_CLASS", "kw_COMPONENT", "kw_COMPONENTS", "kw_CONSTRAINED", - "kw_CONTAINING", "kw_DEFAULT", "kw_DEFINITIONS", "kw_EMBEDDED", - "kw_ENCODED", "kw_END", "kw_ENUMERATED", "kw_EXCEPT", "kw_EXPLICIT", - "kw_EXPORTS", "kw_EXTENSIBILITY", "kw_EXTERNAL", "kw_FALSE", "kw_FROM", - "kw_GeneralString", "kw_GeneralizedTime", "kw_GraphicString", - "kw_IA5String", "kw_IDENTIFIER", "kw_IMPLICIT", "kw_IMPLIED", - "kw_IMPORTS", "kw_INCLUDES", "kw_INSTANCE", "kw_INTEGER", + "\"end of file\"", "error", "\"invalid token\"", "kw_ABSENT", + "kw_ABSTRACT_SYNTAX", "kw_ALL", "kw_APPLICATION", "kw_AUTOMATIC", + "kw_BEGIN", "kw_BIT", "kw_BMPString", "kw_BOOLEAN", "kw_BY", + "kw_CHARACTER", "kw_CHOICE", "kw_CLASS", "kw_COMPONENT", "kw_COMPONENTS", + "kw_CONSTRAINED", "kw_CONTAINING", "kw_DEFAULT", "kw_DEFINITIONS", + "kw_EMBEDDED", "kw_ENCODED", "kw_END", "kw_ENUMERATED", "kw_EXCEPT", + "kw_EXPLICIT", "kw_EXPORTS", "kw_EXTENSIBILITY", "kw_EXTERNAL", + "kw_FALSE", "kw_FROM", "kw_GeneralString", "kw_GeneralizedTime", + "kw_GraphicString", "kw_IA5String", "kw_IDENTIFIER", "kw_IMPLICIT", + "kw_IMPLIED", "kw_IMPORTS", "kw_INCLUDES", "kw_INSTANCE", "kw_INTEGER", "kw_INTERSECTION", "kw_ISO646String", "kw_MAX", "kw_MIN", "kw_MINUS_INFINITY", "kw_NULL", "kw_NumericString", "kw_OBJECT", "kw_OCTET", "kw_OF", "kw_OPTIONAL", "kw_ObjectDescriptor", "kw_PATTERN", @@ -735,112 +996,28 @@ "objid_list", "objid_element", "Value", "BuiltinValue", "ReferencedValue", "DefinedValue", "Valuereference", "CharacterStringValue", "BooleanValue", "IntegerValue", "SignedNumber", - "NullValue", "ObjectIdentifierValue", 0 + "NullValue", "ObjectIdentifierValue", YY_NULLPTR }; -#endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) { - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, - 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, - 59, 44, 40, 41, 123, 125, 91, 93 -}; -# endif + return yytname[yysymbol]; +} +#endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 98, 99, 100, 100, 100, 100, 101, 101, 102, - 102, 103, 103, 104, 104, 105, 105, 106, 107, 107, - 107, 108, 108, 109, 109, 110, 110, 111, 112, 112, - 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 113, 113, 113, 113, 114, 115, 115, 115, 115, - 116, 116, 116, 117, 117, 117, 118, 119, 120, 121, - 121, 122, 123, 124, 125, 125, 126, 126, 127, 128, - 128, 129, 130, 131, 131, 132, 133, 133, 134, 135, - 136, 137, 137, 138, 138, 138, 139, 140, 141, 142, - 142, 142, 142, 143, 143, 143, 144, 145, 146, 146, - 146, 146, 146, 146, 146, 146, 147, 147, 147, 148, - 149, 149, 149, 150, 150, 151, 152, 152, 153, 154, - 154, 155, 155, 155, 156, 156, 157, 157, 157, 157, - 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, - 166 -}; +#define YYPACT_NINF (-119) -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 9, 2, 2, 2, 0, 2, 0, 3, - 0, 3, 0, 1, 0, 1, 2, 4, 3, 2, - 0, 1, 2, 1, 1, 3, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 5, 5, 5, 3, - 1, 2, 4, 1, 3, 3, 4, 4, 1, 2, - 5, 2, 3, 1, 0, 2, 4, 3, 4, 4, - 3, 3, 4, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 1, 2, 3, 5, 4, 3, 4, 0, - 1, 1, 1, 0, 1, 1, 4, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, - 1, 2, 3, 1, 3, 4, 1, 0, 3, 0, - 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1 -}; +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 0, 117, 0, 119, 0, 116, 1, 122, 123, 0, - 119, 6, 0, 118, 120, 0, 0, 0, 8, 0, - 5, 3, 4, 0, 0, 121, 7, 0, 20, 0, - 0, 12, 19, 26, 0, 2, 14, 0, 0, 18, - 0, 13, 15, 0, 0, 9, 21, 23, 24, 25, - 11, 16, 0, 0, 104, 45, 0, 0, 98, 76, - 103, 50, 63, 0, 0, 101, 64, 0, 99, 77, - 100, 105, 102, 0, 75, 89, 0, 28, 32, 36, - 35, 31, 38, 39, 37, 40, 41, 42, 43, 34, - 29, 73, 74, 30, 44, 93, 33, 97, 22, 117, - 59, 0, 0, 0, 0, 51, 61, 64, 0, 0, - 0, 0, 0, 27, 91, 92, 90, 0, 0, 0, - 78, 94, 95, 0, 17, 0, 0, 0, 110, 106, - 0, 58, 53, 0, 136, 0, 139, 135, 133, 134, - 138, 140, 0, 124, 125, 131, 132, 127, 126, 128, - 137, 130, 129, 0, 62, 65, 67, 0, 0, 71, - 70, 0, 0, 96, 0, 0, 0, 0, 80, 81, - 82, 87, 0, 0, 113, 109, 0, 72, 0, 111, - 0, 0, 57, 0, 0, 49, 52, 66, 68, 69, - 88, 0, 83, 0, 79, 0, 0, 60, 108, 107, - 112, 0, 55, 54, 0, 0, 0, 0, 0, 84, - 0, 114, 56, 48, 47, 46, 86, 0, 115, 85 -}; +#define YYTABLE_NINF (-11) -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 2, 18, 24, 30, 37, 40, 41, 42, 31, - 45, 46, 43, 47, 76, 77, 78, 105, 79, 131, - 132, 80, 133, 81, 82, 83, 84, 110, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 120, 167, 168, - 169, 170, 94, 95, 117, 123, 48, 96, 97, 127, - 128, 129, 173, 174, 4, 141, 9, 10, 142, 143, - 144, 145, 146, 147, 148, 149, 150, 151, 152 -}; +#define yytable_value_is_error(Yyn) \ + 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -119 static const yytype_int16 yypact[] = { -43, -56, 47, -65, 29, -119, -119, -31, -119, -25, @@ -867,6 +1044,35 @@ 99, -119, -119, -119, -119, -119, -119, 40, -119, -119 }; +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 0, 117, 0, 119, 0, 116, 1, 122, 123, 0, + 119, 6, 0, 118, 120, 0, 0, 0, 8, 0, + 5, 3, 4, 0, 0, 121, 7, 0, 20, 0, + 0, 12, 19, 26, 0, 2, 14, 0, 0, 18, + 0, 13, 15, 0, 0, 9, 21, 23, 24, 25, + 11, 16, 0, 0, 104, 45, 0, 0, 98, 76, + 103, 50, 63, 0, 0, 101, 64, 0, 99, 77, + 100, 105, 102, 0, 75, 89, 0, 28, 32, 36, + 35, 31, 38, 39, 37, 40, 41, 42, 43, 34, + 29, 73, 74, 30, 44, 93, 33, 97, 22, 117, + 59, 0, 0, 0, 0, 51, 61, 64, 0, 0, + 0, 0, 0, 27, 91, 92, 90, 0, 0, 0, + 78, 94, 95, 0, 17, 0, 0, 0, 110, 106, + 0, 58, 53, 0, 136, 0, 139, 135, 133, 134, + 138, 140, 0, 124, 125, 131, 132, 127, 126, 128, + 137, 130, 129, 0, 62, 65, 67, 0, 0, 71, + 70, 0, 0, 96, 0, 0, 0, 0, 80, 81, + 82, 87, 0, 0, 113, 109, 0, 72, 0, 111, + 0, 0, 57, 0, 0, 49, 52, 66, 68, 69, + 88, 0, 83, 0, 79, 0, 0, 60, 108, 107, + 112, 0, 55, 54, 0, 0, 0, 0, 0, 84, + 0, 114, 56, 48, 47, 46, 86, 0, 115, 85 +}; + /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { @@ -879,11 +1085,21 @@ -119, -119, -119, -119, -119, -119, 22, -119, -119 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -11 +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_uint8 yydefgoto[] = +{ + 0, 2, 18, 24, 30, 37, 40, 41, 42, 31, + 45, 46, 43, 47, 76, 77, 78, 105, 79, 131, + 132, 80, 133, 81, 82, 83, 84, 110, 85, 86, + 87, 88, 89, 90, 91, 92, 93, 120, 167, 168, + 169, 170, 94, 95, 117, 123, 48, 96, 97, 127, + 128, 129, 173, 174, 4, 141, 9, 10, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, 152 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { 163, 113, 5, 32, 208, 111, 108, 178, 114, 121, @@ -934,8 +1150,8 @@ 99, 196, 180, 96 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ static const yytype_uint8 yystos[] = { 0, 86, 99, 94, 152, 153, 0, 86, 89, 154, @@ -962,95 +1178,81 @@ 89, 151, 93, 93, 93, 93, 95, 12, 93, 156 }; -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ - -#define YYFAIL goto yyerrlab +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_uint8 yyr1[] = +{ + 0, 98, 99, 100, 100, 100, 100, 101, 101, 102, + 102, 103, 103, 104, 104, 105, 105, 106, 107, 107, + 107, 108, 108, 109, 109, 110, 110, 111, 112, 112, + 112, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 114, 115, 115, 115, 115, + 116, 116, 116, 117, 117, 117, 118, 119, 120, 121, + 121, 122, 123, 124, 125, 125, 126, 126, 127, 128, + 128, 129, 130, 131, 131, 132, 133, 133, 134, 135, + 136, 137, 137, 138, 138, 138, 139, 140, 141, 142, + 142, 142, 142, 143, 143, 143, 144, 145, 146, 146, + 146, 146, 146, 146, 146, 146, 147, 147, 147, 148, + 149, 149, 149, 150, 150, 151, 152, 152, 153, 154, + 154, 155, 155, 155, 156, 156, 157, 157, 157, 157, + 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, + 166 +}; -#define YYRECOVERING() (!!yyerrstatus) +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 9, 2, 2, 2, 0, 2, 0, 3, + 0, 3, 0, 1, 0, 1, 2, 4, 3, 2, + 0, 1, 2, 1, 1, 3, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 5, 5, 5, 3, + 1, 2, 4, 1, 3, 3, 4, 4, 1, 2, + 5, 2, 3, 1, 0, 2, 4, 3, 4, 4, + 3, 3, 4, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 2, 3, 5, 4, 3, 4, 0, + 1, 1, 1, 0, 1, 1, 4, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 3, 2, + 1, 2, 3, 1, 3, 4, 1, 0, 3, 0, + 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1 +}; -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif +enum { YYENOMEM = -2 }; -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab -/* YYLEX -- calling `yylex' with the right arguments. */ +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif /* Enable debugging if requested. */ #if YYDEBUG @@ -1060,80 +1262,58 @@ # define YYFPRINTF fprintf # endif -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { + FILE *yyoutput = yyo; + YY_USE (yyoutput); if (!yyvaluep) return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); + yy_symbol_value_print (yyo, yykind, yyvaluep); + YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. @@ -1141,80 +1321,68 @@ | TOP (included). | `------------------------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule) { + int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)]); + YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule); \ +} while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -1229,478 +1397,219 @@ # define YYMAXDEPTH 10000 #endif - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - if (! yyres) - return yystrlen (yystr); - return yystpcpy (yyres, yystr) - yyres; -} -# endif -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep) { - YYUSE (yyvaluep); - + YY_USE (yyvaluep); if (!yymsg) yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } - - -/* Prevent warnings from -Wmissing-prototypes. */ - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - -/* The look-ahead symbol. */ +/* Lookahead token kind. */ int yychar; -/* The semantic value of the look-ahead symbol. */ +/* The semantic value of the lookahead symbol. */ YYSTYPE yylval; - /* Number of syntax errors so far. */ int yynerrs; + /*----------. | yyparse. | `----------*/ -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) int yyparse (void) -#else -int -yyparse () - -#endif -#endif { - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - YYSIZE_T yystacksize = YYINITDEPTH; + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss; - yyvsp = yyvs; + yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; + /*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | +| yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ - yynewstate: +yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; - yysetstate: - *yyssp = yystate; + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else { /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + YYPTRDIFF_T yysize = yyssp - yyss + 1; -#ifdef yyoverflow +# if defined yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else +# else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif -#endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; goto yybackup; + /*-----------. | yybackup. | `-----------*/ yybackup: - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ + lookahead token if we need one and don't already have one. */ - /* First try to decide what to do without reference to look-ahead token. */ + /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yypact_value_is_default (yyn)) goto yydefault; - /* Not known => get a look-ahead token if don't already have one. */ + /* Not known => get a lookahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (); } if (yychar <= YYEOF) { - yychar = yytoken = YYEOF; + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } else { yytoken = YYTRANSLATE (yychar); @@ -1715,30 +1624,26 @@ yyn = yytable[yyn]; if (yyn <= 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; + if (yytable_value_is_error (yyn)) + goto yyerrlab; yyn = -yyn; goto yyreduce; } - if (yyn == YYFINAL) - YYACCEPT; - /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; - /* Shift the look-ahead token. */ + /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + /* Discard the shifted token. */ + yychar = YYEMPTY; goto yynewstate; @@ -1753,14 +1658,14 @@ /*-----------------------------. -| yyreduce -- Do a reduction. | +| yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. + '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -1773,353 +1678,409 @@ YY_REDUCE_PRINT (yyn); switch (yyn) { - case 2: -#line 241 "asn1parse.y" - { + case 2: /* ModuleDefinition: IDENTIFIER objid_opt kw_DEFINITIONS TagDefault ExtensionDefault EEQUAL kw_BEGIN ModuleBody kw_END */ +#line 242 "asn1parse.y" + { checkundefined(); } +#line 1687 "asn1parse.c" break; - case 4: + case 3: /* TagDefault: kw_EXPLICIT kw_TAGS */ #line 248 "asn1parse.y" - { lex_error_message("implicit tagging is not supported"); } + { default_tag_env = TE_EXPLICIT; } +#line 1693 "asn1parse.c" break; - case 5: + case 4: /* TagDefault: kw_IMPLICIT kw_TAGS */ #line 250 "asn1parse.y" - { lex_error_message("automatic tagging is not supported"); } + { default_tag_env = TE_IMPLICIT; } +#line 1699 "asn1parse.c" break; - case 7: -#line 255 "asn1parse.y" - { lex_error_message("no extensibility options supported"); } + case 5: /* TagDefault: kw_AUTOMATIC kw_TAGS */ +#line 252 "asn1parse.y" + { lex_error_message("automatic tagging is not supported"); } +#line 1705 "asn1parse.c" break; - case 17: -#line 276 "asn1parse.y" - { + case 7: /* ExtensionDefault: kw_EXTENSIBILITY kw_IMPLIED */ +#line 257 "asn1parse.y" + { lex_error_message("no extensibility options supported"); } +#line 1711 "asn1parse.c" + break; + + case 17: /* SymbolsFromModule: referencenames kw_FROM IDENTIFIER objid_opt */ +#line 278 "asn1parse.y" + { struct string_list *sl; - for(sl = (yyvsp[(1) - (4)].sl); sl != NULL; sl = sl->next) { + for(sl = (yyvsp[-3].sl); sl != NULL; sl = sl->next) { Symbol *s = addsym(sl->string); s->stype = Stype; gen_template_import(s); } - add_import((yyvsp[(3) - (4)].name)); + add_import((yyvsp[-1].name)); } +#line 1725 "asn1parse.c" break; - case 18: -#line 288 "asn1parse.y" - { + case 18: /* Exports: kw_EXPORTS referencenames ';' */ +#line 290 "asn1parse.y" + { struct string_list *sl; - for(sl = (yyvsp[(2) - (3)].sl); sl != NULL; sl = sl->next) + for(sl = (yyvsp[-1].sl); sl != NULL; sl = sl->next) add_export(sl->string); } +#line 1735 "asn1parse.c" break; - case 25: -#line 306 "asn1parse.y" - { + case 25: /* referencenames: IDENTIFIER ',' referencenames */ +#line 308 "asn1parse.y" + { (yyval.sl) = emalloc(sizeof(*(yyval.sl))); - (yyval.sl)->string = (yyvsp[(1) - (3)].name); - (yyval.sl)->next = (yyvsp[(3) - (3)].sl); + (yyval.sl)->string = (yyvsp[-2].name); + (yyval.sl)->next = (yyvsp[0].sl); } +#line 1745 "asn1parse.c" break; - case 26: -#line 312 "asn1parse.y" - { + case 26: /* referencenames: IDENTIFIER */ +#line 314 "asn1parse.y" + { (yyval.sl) = emalloc(sizeof(*(yyval.sl))); - (yyval.sl)->string = (yyvsp[(1) - (1)].name); + (yyval.sl)->string = (yyvsp[0].name); (yyval.sl)->next = NULL; } +#line 1755 "asn1parse.c" break; - case 27: -#line 320 "asn1parse.y" - { - Symbol *s = addsym ((yyvsp[(1) - (3)].name)); + case 27: /* TypeAssignment: IDENTIFIER EEQUAL Type */ +#line 322 "asn1parse.y" + { + Symbol *s = addsym ((yyvsp[-2].name)); s->stype = Stype; - s->type = (yyvsp[(3) - (3)].type); + s->type = (yyvsp[0].type); fix_labels(s); generate_type (s); } +#line 1767 "asn1parse.c" break; - case 45: -#line 351 "asn1parse.y" - { + case 45: /* BooleanType: kw_BOOLEAN */ +#line 353 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_Boolean, TE_EXPLICIT, new_type(TBoolean)); } +#line 1776 "asn1parse.c" break; - case 46: -#line 358 "asn1parse.y" - { - if((yyvsp[(2) - (5)].value)->type != integervalue) + case 46: /* range: '(' Value RANGE Value ')' */ +#line 360 "asn1parse.y" + { + if((yyvsp[-3].value)->type != integervalue) lex_error_message("Non-integer used in first part of range"); - if((yyvsp[(2) - (5)].value)->type != integervalue) + if((yyvsp[-3].value)->type != integervalue) lex_error_message("Non-integer in second part of range"); (yyval.range) = ecalloc(1, sizeof(*(yyval.range))); - (yyval.range)->min = (yyvsp[(2) - (5)].value)->u.integervalue; - (yyval.range)->max = (yyvsp[(4) - (5)].value)->u.integervalue; + (yyval.range)->min = (yyvsp[-3].value)->u.integervalue; + (yyval.range)->max = (yyvsp[-1].value)->u.integervalue; } +#line 1790 "asn1parse.c" break; - case 47: -#line 368 "asn1parse.y" - { - if((yyvsp[(2) - (5)].value)->type != integervalue) + case 47: /* range: '(' Value RANGE kw_MAX ')' */ +#line 370 "asn1parse.y" + { + if((yyvsp[-3].value)->type != integervalue) lex_error_message("Non-integer in first part of range"); (yyval.range) = ecalloc(1, sizeof(*(yyval.range))); - (yyval.range)->min = (yyvsp[(2) - (5)].value)->u.integervalue; - (yyval.range)->max = (yyvsp[(2) - (5)].value)->u.integervalue - 1; + (yyval.range)->min = (yyvsp[-3].value)->u.integervalue; + (yyval.range)->max = INT_MAX; } +#line 1802 "asn1parse.c" break; - case 48: -#line 376 "asn1parse.y" - { - if((yyvsp[(4) - (5)].value)->type != integervalue) + case 48: /* range: '(' kw_MIN RANGE Value ')' */ +#line 378 "asn1parse.y" + { + if((yyvsp[-1].value)->type != integervalue) lex_error_message("Non-integer in second part of range"); (yyval.range) = ecalloc(1, sizeof(*(yyval.range))); - (yyval.range)->min = (yyvsp[(4) - (5)].value)->u.integervalue + 2; - (yyval.range)->max = (yyvsp[(4) - (5)].value)->u.integervalue; + (yyval.range)->min = INT_MIN; + (yyval.range)->max = (yyvsp[-1].value)->u.integervalue; } +#line 1814 "asn1parse.c" break; - case 49: -#line 384 "asn1parse.y" - { - if((yyvsp[(2) - (3)].value)->type != integervalue) + case 49: /* range: '(' Value ')' */ +#line 386 "asn1parse.y" + { + if((yyvsp[-1].value)->type != integervalue) lex_error_message("Non-integer used in limit"); (yyval.range) = ecalloc(1, sizeof(*(yyval.range))); - (yyval.range)->min = (yyvsp[(2) - (3)].value)->u.integervalue; - (yyval.range)->max = (yyvsp[(2) - (3)].value)->u.integervalue; + (yyval.range)->min = (yyvsp[-1].value)->u.integervalue; + (yyval.range)->max = (yyvsp[-1].value)->u.integervalue; } +#line 1826 "asn1parse.c" break; - case 50: -#line 395 "asn1parse.y" - { + case 50: /* IntegerType: kw_INTEGER */ +#line 397 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, new_type(TInteger)); } +#line 1835 "asn1parse.c" break; - case 51: -#line 400 "asn1parse.y" - { + case 51: /* IntegerType: kw_INTEGER range */ +#line 402 "asn1parse.y" + { (yyval.type) = new_type(TInteger); - (yyval.type)->range = (yyvsp[(2) - (2)].range); + (yyval.type)->range = (yyvsp[0].range); (yyval.type) = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, (yyval.type)); } +#line 1845 "asn1parse.c" break; - case 52: -#line 406 "asn1parse.y" - { + case 52: /* IntegerType: kw_INTEGER '{' NamedNumberList '}' */ +#line 408 "asn1parse.y" + { (yyval.type) = new_type(TInteger); - (yyval.type)->members = (yyvsp[(3) - (4)].members); + (yyval.type)->members = (yyvsp[-1].members); (yyval.type) = new_tag(ASN1_C_UNIV, UT_Integer, TE_EXPLICIT, (yyval.type)); } +#line 1855 "asn1parse.c" break; - case 53: -#line 414 "asn1parse.y" - { + case 53: /* NamedNumberList: NamedNumber */ +#line 416 "asn1parse.y" + { (yyval.members) = emalloc(sizeof(*(yyval.members))); ASN1_TAILQ_INIT((yyval.members)); - ASN1_TAILQ_INSERT_HEAD((yyval.members), (yyvsp[(1) - (1)].member), members); + ASN1_TAILQ_INSERT_HEAD((yyval.members), (yyvsp[0].member), members); } +#line 1865 "asn1parse.c" break; - case 54: -#line 420 "asn1parse.y" - { - ASN1_TAILQ_INSERT_TAIL((yyvsp[(1) - (3)].members), (yyvsp[(3) - (3)].member), members); - (yyval.members) = (yyvsp[(1) - (3)].members); + case 54: /* NamedNumberList: NamedNumberList ',' NamedNumber */ +#line 422 "asn1parse.y" + { + ASN1_TAILQ_INSERT_TAIL((yyvsp[-2].members), (yyvsp[0].member), members); + (yyval.members) = (yyvsp[-2].members); } +#line 1874 "asn1parse.c" break; - case 55: -#line 425 "asn1parse.y" - { (yyval.members) = (yyvsp[(1) - (3)].members); } + case 55: /* NamedNumberList: NamedNumberList ',' ELLIPSIS */ +#line 427 "asn1parse.y" + { (yyval.members) = (yyvsp[-2].members); } +#line 1880 "asn1parse.c" break; - case 56: -#line 429 "asn1parse.y" - { + case 56: /* NamedNumber: IDENTIFIER '(' SignedNumber ')' */ +#line 431 "asn1parse.y" + { (yyval.member) = emalloc(sizeof(*(yyval.member))); - (yyval.member)->name = (yyvsp[(1) - (4)].name); - (yyval.member)->gen_name = estrdup((yyvsp[(1) - (4)].name)); + (yyval.member)->name = (yyvsp[-3].name); + (yyval.member)->gen_name = estrdup((yyvsp[-3].name)); output_name ((yyval.member)->gen_name); - (yyval.member)->val = (yyvsp[(3) - (4)].constant); + (yyval.member)->val = (yyvsp[-1].constant); (yyval.member)->optional = 0; (yyval.member)->ellipsis = 0; (yyval.member)->type = NULL; } +#line 1895 "asn1parse.c" break; - case 57: -#line 442 "asn1parse.y" - { + case 57: /* EnumeratedType: kw_ENUMERATED '{' Enumerations '}' */ +#line 444 "asn1parse.y" + { (yyval.type) = new_type(TInteger); - (yyval.type)->members = (yyvsp[(3) - (4)].members); + (yyval.type)->members = (yyvsp[-1].members); (yyval.type) = new_tag(ASN1_C_UNIV, UT_Enumerated, TE_EXPLICIT, (yyval.type)); } +#line 1905 "asn1parse.c" break; - case 59: -#line 453 "asn1parse.y" - { + case 59: /* BitStringType: kw_BIT kw_STRING */ +#line 455 "asn1parse.y" + { (yyval.type) = new_type(TBitString); (yyval.type)->members = emalloc(sizeof(*(yyval.type)->members)); ASN1_TAILQ_INIT((yyval.type)->members); (yyval.type) = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, (yyval.type)); } +#line 1916 "asn1parse.c" break; - case 60: -#line 460 "asn1parse.y" - { + case 60: /* BitStringType: kw_BIT kw_STRING '{' NamedBitList '}' */ +#line 462 "asn1parse.y" + { (yyval.type) = new_type(TBitString); - (yyval.type)->members = (yyvsp[(4) - (5)].members); + (yyval.type)->members = (yyvsp[-1].members); (yyval.type) = new_tag(ASN1_C_UNIV, UT_BitString, TE_EXPLICIT, (yyval.type)); } +#line 1926 "asn1parse.c" break; - case 61: -#line 468 "asn1parse.y" - { + case 61: /* ObjectIdentifierType: kw_OBJECT kw_IDENTIFIER */ +#line 470 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_OID, TE_EXPLICIT, new_type(TOID)); } +#line 1935 "asn1parse.c" break; - case 62: -#line 474 "asn1parse.y" - { + case 62: /* OctetStringType: kw_OCTET kw_STRING size */ +#line 476 "asn1parse.y" + { Type *t = new_type(TOctetString); - t->range = (yyvsp[(3) - (3)].range); + t->range = (yyvsp[0].range); + if (t->range) { + if (t->range->min < 0) + lex_error_message("can't use a negative SIZE range " + "length for OCTET STRING"); + } (yyval.type) = new_tag(ASN1_C_UNIV, UT_OctetString, TE_EXPLICIT, t); } +#line 1951 "asn1parse.c" break; - case 63: -#line 483 "asn1parse.y" - { + case 63: /* NullType: kw_NULL */ +#line 490 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_Null, TE_EXPLICIT, new_type(TNull)); } +#line 1960 "asn1parse.c" break; - case 64: -#line 490 "asn1parse.y" - { (yyval.range) = NULL; } + case 64: /* size: %empty */ +#line 497 "asn1parse.y" + { (yyval.range) = NULL; } +#line 1966 "asn1parse.c" break; - case 65: -#line 492 "asn1parse.y" - { (yyval.range) = (yyvsp[(2) - (2)].range); } + case 65: /* size: kw_SIZE range */ +#line 499 "asn1parse.y" + { (yyval.range) = (yyvsp[0].range); } +#line 1972 "asn1parse.c" break; - case 66: -#line 497 "asn1parse.y" - { + case 66: /* SequenceType: kw_SEQUENCE '{' ComponentTypeList '}' */ +#line 504 "asn1parse.y" + { (yyval.type) = new_type(TSequence); - (yyval.type)->members = (yyvsp[(3) - (4)].members); - (yyval.type) = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, (yyval.type)); + (yyval.type)->members = (yyvsp[-1].members); + (yyval.type) = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, (yyval.type)); } +#line 1982 "asn1parse.c" break; - case 67: -#line 503 "asn1parse.y" - { + case 67: /* SequenceType: kw_SEQUENCE '{' '}' */ +#line 510 "asn1parse.y" + { (yyval.type) = new_type(TSequence); (yyval.type)->members = NULL; - (yyval.type) = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, (yyval.type)); + (yyval.type) = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, (yyval.type)); } +#line 1992 "asn1parse.c" break; - case 68: -#line 511 "asn1parse.y" - { + case 68: /* SequenceOfType: kw_SEQUENCE size kw_OF Type */ +#line 518 "asn1parse.y" + { (yyval.type) = new_type(TSequenceOf); - (yyval.type)->range = (yyvsp[(2) - (4)].range); - (yyval.type)->subtype = (yyvsp[(4) - (4)].type); - (yyval.type) = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, (yyval.type)); + (yyval.type)->range = (yyvsp[-2].range); + if ((yyval.type)->range) { + if ((yyval.type)->range->min < 0) + lex_error_message("can't use a negative SIZE range " + "length for SEQUENCE OF"); + } + + (yyval.type)->subtype = (yyvsp[0].type); + (yyval.type) = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, (yyval.type)); } +#line 2009 "asn1parse.c" break; - case 69: -#line 520 "asn1parse.y" - { + case 69: /* SetType: kw_SET '{' ComponentTypeList '}' */ +#line 533 "asn1parse.y" + { (yyval.type) = new_type(TSet); - (yyval.type)->members = (yyvsp[(3) - (4)].members); - (yyval.type) = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, (yyval.type)); + (yyval.type)->members = (yyvsp[-1].members); + (yyval.type) = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, (yyval.type)); } +#line 2019 "asn1parse.c" break; - case 70: -#line 526 "asn1parse.y" - { + case 70: /* SetType: kw_SET '{' '}' */ +#line 539 "asn1parse.y" + { (yyval.type) = new_type(TSet); (yyval.type)->members = NULL; - (yyval.type) = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, (yyval.type)); + (yyval.type) = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, (yyval.type)); } +#line 2029 "asn1parse.c" break; - case 71: -#line 534 "asn1parse.y" - { + case 71: /* SetOfType: kw_SET kw_OF Type */ +#line 547 "asn1parse.y" + { (yyval.type) = new_type(TSetOf); - (yyval.type)->subtype = (yyvsp[(3) - (3)].type); - (yyval.type) = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, (yyval.type)); + (yyval.type)->subtype = (yyvsp[0].type); + (yyval.type) = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, (yyval.type)); } +#line 2039 "asn1parse.c" break; - case 72: -#line 542 "asn1parse.y" - { + case 72: /* ChoiceType: kw_CHOICE '{' ComponentTypeList '}' */ +#line 555 "asn1parse.y" + { (yyval.type) = new_type(TChoice); - (yyval.type)->members = (yyvsp[(3) - (4)].members); + (yyval.type)->members = (yyvsp[-1].members); } +#line 2048 "asn1parse.c" break; - case 75: -#line 553 "asn1parse.y" - { - Symbol *s = addsym((yyvsp[(1) - (1)].name)); + case 75: /* DefinedType: IDENTIFIER */ +#line 566 "asn1parse.y" + { + Symbol *s = addsym((yyvsp[0].name)); (yyval.type) = new_type(TType); if(s->stype != Stype && s->stype != SUndefined) - lex_error_message ("%s is not a type\n", (yyvsp[(1) - (1)].name)); + lex_error_message ("%s is not a type\n", (yyvsp[0].name)); else (yyval.type)->symbol = s; } +#line 2061 "asn1parse.c" break; - case 76: -#line 564 "asn1parse.y" - { + case 76: /* UsefulType: kw_GeneralizedTime */ +#line 577 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_GeneralizedTime, TE_EXPLICIT, new_type(TGeneralizedTime)); } +#line 2070 "asn1parse.c" break; - case 77: -#line 569 "asn1parse.y" - { + case 77: /* UsefulType: kw_UTCTime */ +#line 582 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_UTCTime, TE_EXPLICIT, new_type(TUTCTime)); } +#line 2079 "asn1parse.c" break; - case 78: -#line 576 "asn1parse.y" - { + case 78: /* ConstrainedType: Type Constraint */ +#line 589 "asn1parse.y" + { /* if (Constraint.type == contentConstrant) { assert(Constraint.u.constraint.type == octetstring|bitstring-w/o-NamedBitList); // remember to check type reference too if (Constraint.u.constraint.type) { @@ -2131,342 +2092,386 @@ } */ } +#line 2096 "asn1parse.c" break; - case 79: -#line 592 "asn1parse.y" - { - (yyval.constraint_spec) = (yyvsp[(2) - (3)].constraint_spec); + case 79: /* Constraint: '(' ConstraintSpec ')' */ +#line 605 "asn1parse.y" + { + (yyval.constraint_spec) = (yyvsp[-1].constraint_spec); } +#line 2104 "asn1parse.c" break; - case 83: -#line 605 "asn1parse.y" - { + case 83: /* ContentsConstraint: kw_CONTAINING Type */ +#line 618 "asn1parse.y" + { (yyval.constraint_spec) = new_constraint_spec(CT_CONTENTS); - (yyval.constraint_spec)->u.content.type = (yyvsp[(2) - (2)].type); + (yyval.constraint_spec)->u.content.type = (yyvsp[0].type); (yyval.constraint_spec)->u.content.encoding = NULL; } +#line 2114 "asn1parse.c" break; - case 84: -#line 611 "asn1parse.y" - { - if ((yyvsp[(3) - (3)].value)->type != objectidentifiervalue) + case 84: /* ContentsConstraint: kw_ENCODED kw_BY Value */ +#line 624 "asn1parse.y" + { + if ((yyvsp[0].value)->type != objectidentifiervalue) lex_error_message("Non-OID used in ENCODED BY constraint"); (yyval.constraint_spec) = new_constraint_spec(CT_CONTENTS); (yyval.constraint_spec)->u.content.type = NULL; - (yyval.constraint_spec)->u.content.encoding = (yyvsp[(3) - (3)].value); + (yyval.constraint_spec)->u.content.encoding = (yyvsp[0].value); } +#line 2126 "asn1parse.c" break; - case 85: -#line 619 "asn1parse.y" - { - if ((yyvsp[(5) - (5)].value)->type != objectidentifiervalue) + case 85: /* ContentsConstraint: kw_CONTAINING Type kw_ENCODED kw_BY Value */ +#line 632 "asn1parse.y" + { + if ((yyvsp[0].value)->type != objectidentifiervalue) lex_error_message("Non-OID used in ENCODED BY constraint"); (yyval.constraint_spec) = new_constraint_spec(CT_CONTENTS); - (yyval.constraint_spec)->u.content.type = (yyvsp[(2) - (5)].type); - (yyval.constraint_spec)->u.content.encoding = (yyvsp[(5) - (5)].value); + (yyval.constraint_spec)->u.content.type = (yyvsp[-3].type); + (yyval.constraint_spec)->u.content.encoding = (yyvsp[0].value); } +#line 2138 "asn1parse.c" break; - case 86: -#line 629 "asn1parse.y" - { + case 86: /* UserDefinedConstraint: kw_CONSTRAINED kw_BY '{' '}' */ +#line 642 "asn1parse.y" + { (yyval.constraint_spec) = new_constraint_spec(CT_USER); } +#line 2146 "asn1parse.c" break; - case 87: -#line 635 "asn1parse.y" - { + case 87: /* TaggedType: Tag tagenv Type */ +#line 648 "asn1parse.y" + { (yyval.type) = new_type(TTag); - (yyval.type)->tag = (yyvsp[(1) - (3)].tag); - (yyval.type)->tag.tagenv = (yyvsp[(2) - (3)].constant); - if((yyvsp[(3) - (3)].type)->type == TTag && (yyvsp[(2) - (3)].constant) == TE_IMPLICIT) { - (yyval.type)->subtype = (yyvsp[(3) - (3)].type)->subtype; - free((yyvsp[(3) - (3)].type)); - } else - (yyval.type)->subtype = (yyvsp[(3) - (3)].type); + (yyval.type)->tag = (yyvsp[-2].tag); + (yyval.type)->tag.tagenv = (yyvsp[-1].constant); + if (template_flag) { + (yyval.type)->subtype = (yyvsp[0].type); + } else { + if((yyvsp[0].type)->type == TTag && (yyvsp[-1].constant) == TE_IMPLICIT) { + (yyval.type)->subtype = (yyvsp[0].type)->subtype; + free((yyvsp[0].type)); + } else { + (yyval.type)->subtype = (yyvsp[0].type); + } + } } +#line 2166 "asn1parse.c" break; - case 88: -#line 648 "asn1parse.y" - { - (yyval.tag).tagclass = (yyvsp[(2) - (4)].constant); - (yyval.tag).tagvalue = (yyvsp[(3) - (4)].constant); - (yyval.tag).tagenv = TE_EXPLICIT; + case 88: /* Tag: '[' Class NUMBER ']' */ +#line 666 "asn1parse.y" + { + (yyval.tag).tagclass = (yyvsp[-2].constant); + (yyval.tag).tagvalue = (yyvsp[-1].constant); + (yyval.tag).tagenv = default_tag_env; } +#line 2176 "asn1parse.c" break; - case 89: -#line 656 "asn1parse.y" - { + case 89: /* Class: %empty */ +#line 674 "asn1parse.y" + { (yyval.constant) = ASN1_C_CONTEXT; } +#line 2184 "asn1parse.c" break; - case 90: -#line 660 "asn1parse.y" - { + case 90: /* Class: kw_UNIVERSAL */ +#line 678 "asn1parse.y" + { (yyval.constant) = ASN1_C_UNIV; } +#line 2192 "asn1parse.c" break; - case 91: -#line 664 "asn1parse.y" - { + case 91: /* Class: kw_APPLICATION */ +#line 682 "asn1parse.y" + { (yyval.constant) = ASN1_C_APPL; } +#line 2200 "asn1parse.c" break; - case 92: -#line 668 "asn1parse.y" - { + case 92: /* Class: kw_PRIVATE */ +#line 686 "asn1parse.y" + { (yyval.constant) = ASN1_C_PRIVATE; } +#line 2208 "asn1parse.c" break; - case 93: -#line 674 "asn1parse.y" - { - (yyval.constant) = TE_EXPLICIT; + case 93: /* tagenv: %empty */ +#line 692 "asn1parse.y" + { + (yyval.constant) = default_tag_env; } +#line 2216 "asn1parse.c" break; - case 94: -#line 678 "asn1parse.y" - { - (yyval.constant) = TE_EXPLICIT; + case 94: /* tagenv: kw_EXPLICIT */ +#line 696 "asn1parse.y" + { + (yyval.constant) = default_tag_env; } +#line 2224 "asn1parse.c" break; - case 95: -#line 682 "asn1parse.y" - { + case 95: /* tagenv: kw_IMPLICIT */ +#line 700 "asn1parse.y" + { (yyval.constant) = TE_IMPLICIT; } +#line 2232 "asn1parse.c" break; - case 96: -#line 689 "asn1parse.y" - { + case 96: /* ValueAssignment: IDENTIFIER Type EEQUAL Value */ +#line 707 "asn1parse.y" + { Symbol *s; - s = addsym ((yyvsp[(1) - (4)].name)); + s = addsym ((yyvsp[-3].name)); s->stype = SValue; - s->value = (yyvsp[(4) - (4)].value); + s->value = (yyvsp[0].value); generate_constant (s); } +#line 2245 "asn1parse.c" break; - case 98: -#line 703 "asn1parse.y" - { + case 98: /* RestrictedCharactedStringType: kw_GeneralString */ +#line 721 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_GeneralString, TE_EXPLICIT, new_type(TGeneralString)); } +#line 2254 "asn1parse.c" break; - case 99: -#line 708 "asn1parse.y" - { + case 99: /* RestrictedCharactedStringType: kw_TeletexString */ +#line 726 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_TeletexString, TE_EXPLICIT, new_type(TTeletexString)); } +#line 2263 "asn1parse.c" break; - case 100: -#line 713 "asn1parse.y" - { + case 100: /* RestrictedCharactedStringType: kw_UTF8String */ +#line 731 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_UTF8String, TE_EXPLICIT, new_type(TUTF8String)); } +#line 2272 "asn1parse.c" break; - case 101: -#line 718 "asn1parse.y" - { + case 101: /* RestrictedCharactedStringType: kw_PrintableString */ +#line 736 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_PrintableString, TE_EXPLICIT, new_type(TPrintableString)); } +#line 2281 "asn1parse.c" break; - case 102: -#line 723 "asn1parse.y" - { + case 102: /* RestrictedCharactedStringType: kw_VisibleString */ +#line 741 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_VisibleString, TE_EXPLICIT, new_type(TVisibleString)); } +#line 2290 "asn1parse.c" break; - case 103: -#line 728 "asn1parse.y" - { + case 103: /* RestrictedCharactedStringType: kw_IA5String */ +#line 746 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_IA5String, TE_EXPLICIT, new_type(TIA5String)); } +#line 2299 "asn1parse.c" break; - case 104: -#line 733 "asn1parse.y" - { + case 104: /* RestrictedCharactedStringType: kw_BMPString */ +#line 751 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_BMPString, TE_EXPLICIT, new_type(TBMPString)); } +#line 2308 "asn1parse.c" break; - case 105: -#line 738 "asn1parse.y" - { + case 105: /* RestrictedCharactedStringType: kw_UniversalString */ +#line 756 "asn1parse.y" + { (yyval.type) = new_tag(ASN1_C_UNIV, UT_UniversalString, TE_EXPLICIT, new_type(TUniversalString)); } +#line 2317 "asn1parse.c" break; - case 106: -#line 746 "asn1parse.y" - { + case 106: /* ComponentTypeList: ComponentType */ +#line 764 "asn1parse.y" + { (yyval.members) = emalloc(sizeof(*(yyval.members))); ASN1_TAILQ_INIT((yyval.members)); - ASN1_TAILQ_INSERT_HEAD((yyval.members), (yyvsp[(1) - (1)].member), members); + ASN1_TAILQ_INSERT_HEAD((yyval.members), (yyvsp[0].member), members); } +#line 2327 "asn1parse.c" break; - case 107: -#line 752 "asn1parse.y" - { - ASN1_TAILQ_INSERT_TAIL((yyvsp[(1) - (3)].members), (yyvsp[(3) - (3)].member), members); - (yyval.members) = (yyvsp[(1) - (3)].members); + case 107: /* ComponentTypeList: ComponentTypeList ',' ComponentType */ +#line 770 "asn1parse.y" + { + ASN1_TAILQ_INSERT_TAIL((yyvsp[-2].members), (yyvsp[0].member), members); + (yyval.members) = (yyvsp[-2].members); } +#line 2336 "asn1parse.c" break; - case 108: -#line 757 "asn1parse.y" - { + case 108: /* ComponentTypeList: ComponentTypeList ',' ELLIPSIS */ +#line 775 "asn1parse.y" + { struct member *m = ecalloc(1, sizeof(*m)); m->name = estrdup("..."); m->gen_name = estrdup("asn1_ellipsis"); m->ellipsis = 1; - ASN1_TAILQ_INSERT_TAIL((yyvsp[(1) - (3)].members), m, members); - (yyval.members) = (yyvsp[(1) - (3)].members); + ASN1_TAILQ_INSERT_TAIL((yyvsp[-2].members), m, members); + (yyval.members) = (yyvsp[-2].members); } +#line 2349 "asn1parse.c" break; - case 109: -#line 768 "asn1parse.y" - { + case 109: /* NamedType: IDENTIFIER Type */ +#line 786 "asn1parse.y" + { (yyval.member) = emalloc(sizeof(*(yyval.member))); - (yyval.member)->name = (yyvsp[(1) - (2)].name); - (yyval.member)->gen_name = estrdup((yyvsp[(1) - (2)].name)); + (yyval.member)->name = (yyvsp[-1].name); + (yyval.member)->gen_name = estrdup((yyvsp[-1].name)); output_name ((yyval.member)->gen_name); - (yyval.member)->type = (yyvsp[(2) - (2)].type); + (yyval.member)->type = (yyvsp[0].type); (yyval.member)->ellipsis = 0; } +#line 2362 "asn1parse.c" break; - case 110: -#line 779 "asn1parse.y" - { - (yyval.member) = (yyvsp[(1) - (1)].member); + case 110: /* ComponentType: NamedType */ +#line 797 "asn1parse.y" + { + (yyval.member) = (yyvsp[0].member); (yyval.member)->optional = 0; (yyval.member)->defval = NULL; } +#line 2372 "asn1parse.c" break; - case 111: -#line 785 "asn1parse.y" - { - (yyval.member) = (yyvsp[(1) - (2)].member); + case 111: /* ComponentType: NamedType kw_OPTIONAL */ +#line 803 "asn1parse.y" + { + (yyval.member) = (yyvsp[-1].member); (yyval.member)->optional = 1; (yyval.member)->defval = NULL; } +#line 2382 "asn1parse.c" break; - case 112: -#line 791 "asn1parse.y" - { - (yyval.member) = (yyvsp[(1) - (3)].member); + case 112: /* ComponentType: NamedType kw_DEFAULT Value */ +#line 809 "asn1parse.y" + { + (yyval.member) = (yyvsp[-2].member); (yyval.member)->optional = 0; - (yyval.member)->defval = (yyvsp[(3) - (3)].value); + (yyval.member)->defval = (yyvsp[0].value); } +#line 2392 "asn1parse.c" break; - case 113: -#line 799 "asn1parse.y" - { + case 113: /* NamedBitList: NamedBit */ +#line 817 "asn1parse.y" + { (yyval.members) = emalloc(sizeof(*(yyval.members))); ASN1_TAILQ_INIT((yyval.members)); - ASN1_TAILQ_INSERT_HEAD((yyval.members), (yyvsp[(1) - (1)].member), members); + ASN1_TAILQ_INSERT_HEAD((yyval.members), (yyvsp[0].member), members); } +#line 2402 "asn1parse.c" break; - case 114: -#line 805 "asn1parse.y" - { - ASN1_TAILQ_INSERT_TAIL((yyvsp[(1) - (3)].members), (yyvsp[(3) - (3)].member), members); - (yyval.members) = (yyvsp[(1) - (3)].members); + case 114: /* NamedBitList: NamedBitList ',' NamedBit */ +#line 823 "asn1parse.y" + { + ASN1_TAILQ_INSERT_TAIL((yyvsp[-2].members), (yyvsp[0].member), members); + (yyval.members) = (yyvsp[-2].members); } +#line 2411 "asn1parse.c" break; - case 115: -#line 812 "asn1parse.y" - { + case 115: /* NamedBit: IDENTIFIER '(' NUMBER ')' */ +#line 830 "asn1parse.y" + { (yyval.member) = emalloc(sizeof(*(yyval.member))); - (yyval.member)->name = (yyvsp[(1) - (4)].name); - (yyval.member)->gen_name = estrdup((yyvsp[(1) - (4)].name)); + (yyval.member)->name = (yyvsp[-3].name); + (yyval.member)->gen_name = estrdup((yyvsp[-3].name)); output_name ((yyval.member)->gen_name); - (yyval.member)->val = (yyvsp[(3) - (4)].constant); + (yyval.member)->val = (yyvsp[-1].constant); (yyval.member)->optional = 0; (yyval.member)->ellipsis = 0; (yyval.member)->type = NULL; } +#line 2426 "asn1parse.c" break; - case 117: -#line 825 "asn1parse.y" - { (yyval.objid) = NULL; } + case 117: /* objid_opt: %empty */ +#line 843 "asn1parse.y" + { (yyval.objid) = NULL; } +#line 2432 "asn1parse.c" break; - case 118: -#line 829 "asn1parse.y" - { - (yyval.objid) = (yyvsp[(2) - (3)].objid); + case 118: /* objid: '{' objid_list '}' */ +#line 847 "asn1parse.y" + { + (yyval.objid) = (yyvsp[-1].objid); } +#line 2440 "asn1parse.c" break; - case 119: -#line 835 "asn1parse.y" - { + case 119: /* objid_list: %empty */ +#line 853 "asn1parse.y" + { (yyval.objid) = NULL; } +#line 2448 "asn1parse.c" break; - case 120: -#line 839 "asn1parse.y" - { - if ((yyvsp[(2) - (2)].objid)) { - (yyval.objid) = (yyvsp[(2) - (2)].objid); - add_oid_to_tail((yyvsp[(2) - (2)].objid), (yyvsp[(1) - (2)].objid)); + case 120: /* objid_list: objid_element objid_list */ +#line 857 "asn1parse.y" + { + if ((yyvsp[0].objid)) { + (yyval.objid) = (yyvsp[0].objid); + add_oid_to_tail((yyvsp[0].objid), (yyvsp[-1].objid)); } else { - (yyval.objid) = (yyvsp[(1) - (2)].objid); + (yyval.objid) = (yyvsp[-1].objid); } } +#line 2461 "asn1parse.c" break; - case 121: -#line 850 "asn1parse.y" - { - (yyval.objid) = new_objid((yyvsp[(1) - (4)].name), (yyvsp[(3) - (4)].constant)); + case 121: /* objid_element: IDENTIFIER '(' NUMBER ')' */ +#line 868 "asn1parse.y" + { + (yyval.objid) = new_objid((yyvsp[-3].name), (yyvsp[-1].constant)); } +#line 2469 "asn1parse.c" break; - case 122: -#line 854 "asn1parse.y" - { - Symbol *s = addsym((yyvsp[(1) - (1)].name)); + case 122: /* objid_element: IDENTIFIER */ +#line 872 "asn1parse.y" + { + Symbol *s = addsym((yyvsp[0].name)); if(s->stype != SValue || s->value->type != objectidentifiervalue) { lex_error_message("%s is not an object identifier\n", @@ -2475,174 +2480,158 @@ } (yyval.objid) = s->value->u.objectidentifiervalue; } +#line 2484 "asn1parse.c" break; - case 123: -#line 865 "asn1parse.y" - { - (yyval.objid) = new_objid(NULL, (yyvsp[(1) - (1)].constant)); + case 123: /* objid_element: NUMBER */ +#line 883 "asn1parse.y" + { + (yyval.objid) = new_objid(NULL, (yyvsp[0].constant)); } +#line 2492 "asn1parse.c" break; - case 133: -#line 888 "asn1parse.y" - { - Symbol *s = addsym((yyvsp[(1) - (1)].name)); + case 133: /* Valuereference: IDENTIFIER */ +#line 906 "asn1parse.y" + { + Symbol *s = addsym((yyvsp[0].name)); if(s->stype != SValue) lex_error_message ("%s is not a value\n", s->name); else (yyval.value) = s->value; } +#line 2505 "asn1parse.c" break; - case 134: -#line 899 "asn1parse.y" - { + case 134: /* CharacterStringValue: STRING */ +#line 917 "asn1parse.y" + { (yyval.value) = emalloc(sizeof(*(yyval.value))); (yyval.value)->type = stringvalue; - (yyval.value)->u.stringvalue = (yyvsp[(1) - (1)].name); + (yyval.value)->u.stringvalue = (yyvsp[0].name); } +#line 2515 "asn1parse.c" break; - case 135: -#line 907 "asn1parse.y" - { + case 135: /* BooleanValue: kw_TRUE */ +#line 925 "asn1parse.y" + { (yyval.value) = emalloc(sizeof(*(yyval.value))); (yyval.value)->type = booleanvalue; (yyval.value)->u.booleanvalue = 0; } +#line 2525 "asn1parse.c" break; - case 136: -#line 913 "asn1parse.y" - { + case 136: /* BooleanValue: kw_FALSE */ +#line 931 "asn1parse.y" + { (yyval.value) = emalloc(sizeof(*(yyval.value))); (yyval.value)->type = booleanvalue; (yyval.value)->u.booleanvalue = 0; } +#line 2535 "asn1parse.c" break; - case 137: -#line 921 "asn1parse.y" - { + case 137: /* IntegerValue: SignedNumber */ +#line 939 "asn1parse.y" + { (yyval.value) = emalloc(sizeof(*(yyval.value))); (yyval.value)->type = integervalue; - (yyval.value)->u.integervalue = (yyvsp[(1) - (1)].constant); + (yyval.value)->u.integervalue = (yyvsp[0].constant); } +#line 2545 "asn1parse.c" break; - case 139: -#line 932 "asn1parse.y" - { + case 139: /* NullValue: kw_NULL */ +#line 950 "asn1parse.y" + { } +#line 2552 "asn1parse.c" break; - case 140: -#line 937 "asn1parse.y" - { + case 140: /* ObjectIdentifierValue: objid */ +#line 955 "asn1parse.y" + { (yyval.value) = emalloc(sizeof(*(yyval.value))); (yyval.value)->type = objectidentifiervalue; - (yyval.value)->u.objectidentifiervalue = (yyvsp[(1) - (1)].objid); + (yyval.value)->u.objectidentifiervalue = (yyvsp[0].objid); } +#line 2562 "asn1parse.c" break; -/* Line 1267 of yacc.c. */ -#line 2553 "asn1parse.c" +#line 2566 "asn1parse.c" + default: break; } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; - YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state + /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } goto yynewstate; -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; -#if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif } - - if (yyerrstatus == 3) { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } } - /* Else will try to reuse look-ahead token after shifting the error + /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; @@ -2651,14 +2640,13 @@ | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -2671,42 +2659,42 @@ | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ + /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yydestruct ("Error: popping", - yystos[yystate], yyvsp); + YY_ACCESSING_SYMBOL (yystate), yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } - if (yyn == YYFINAL) - YYACCEPT; - + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; @@ -2717,53 +2705,57 @@ `-------------------------------------*/ yyacceptlab: yyresult = 0; - goto yyreturn; + goto yyreturnlab; + /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; - goto yyreturn; + goto yyreturnlab; -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; - /* Fall through. */ -#endif + goto yyreturnlab; + -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} + return yyresult; +} -#line 944 "asn1parse.y" +#line 962 "asn1parse.y" void @@ -2810,11 +2802,14 @@ o->next = tail; } +static unsigned long idcounter; + static Type * new_type (Typetype tt) { Type *t = ecalloc(1, sizeof(*t)); t->type = tt; + t->id = idcounter++; return t; } @@ -2858,4 +2853,3 @@ fix_labels2(s->type, p); free(p); } - diff --git a/crypto/heimdal/lib/asn1/asn1parse.y b/crypto/heimdal/lib/asn1/asn1parse.y --- a/crypto/heimdal/lib/asn1/asn1parse.y +++ b/crypto/heimdal/lib/asn1/asn1parse.y @@ -41,14 +41,13 @@ #include #include +#include #include #include "symbol.h" #include "lex.h" #include "gen_locl.h" #include "der.h" -RCSID("$Id$"); - static Type *new_type (Typetype t); static struct constraint_spec *new_constraint_spec(enum ctype); static Type *new_tag(int tagclass, int tagvalue, int tagenv, Type *oldtype); @@ -62,6 +61,8 @@ struct string_list *next; }; +static int default_tag_env = TE_EXPLICIT; + /* Declarations for Bison */ #define YYMALLOC malloc #define YYFREE free @@ -69,7 +70,7 @@ %} %union { - int constant; + int64_t constant; struct value *value; struct range *range; char *name; @@ -243,9 +244,10 @@ } ; -TagDefault : kw_EXPLICIT kw_TAGS +TagDefault : kw_EXPLICIT kw_TAGS + { default_tag_env = TE_EXPLICIT; } | kw_IMPLICIT kw_TAGS - { lex_error_message("implicit tagging is not supported"); } + { default_tag_env = TE_IMPLICIT; } | kw_AUTOMATIC kw_TAGS { lex_error_message("automatic tagging is not supported"); } | /* empty */ @@ -370,14 +372,14 @@ lex_error_message("Non-integer in first part of range"); $$ = ecalloc(1, sizeof(*$$)); $$->min = $2->u.integervalue; - $$->max = $2->u.integervalue - 1; + $$->max = INT_MAX; } | '(' kw_MIN RANGE Value ')' { if($4->type != integervalue) lex_error_message("Non-integer in second part of range"); $$ = ecalloc(1, sizeof(*$$)); - $$->min = $4->u.integervalue + 2; + $$->min = INT_MIN; $$->max = $4->u.integervalue; } | '(' Value ')' @@ -474,6 +476,11 @@ { Type *t = new_type(TOctetString); t->range = $3; + if (t->range) { + if (t->range->min < 0) + lex_error_message("can't use a negative SIZE range " + "length for OCTET STRING"); + } $$ = new_tag(ASN1_C_UNIV, UT_OctetString, TE_EXPLICIT, t); } @@ -497,13 +504,13 @@ { $$ = new_type(TSequence); $$->members = $3; - $$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$); + $$ = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, $$); } | kw_SEQUENCE '{' '}' { $$ = new_type(TSequence); $$->members = NULL; - $$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$); + $$ = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, $$); } ; @@ -511,8 +518,14 @@ { $$ = new_type(TSequenceOf); $$->range = $2; + if ($$->range) { + if ($$->range->min < 0) + lex_error_message("can't use a negative SIZE range " + "length for SEQUENCE OF"); + } + $$->subtype = $4; - $$ = new_tag(ASN1_C_UNIV, UT_Sequence, TE_EXPLICIT, $$); + $$ = new_tag(ASN1_C_UNIV, UT_Sequence, default_tag_env, $$); } ; @@ -520,13 +533,13 @@ { $$ = new_type(TSet); $$->members = $3; - $$ = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, $$); + $$ = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, $$); } | kw_SET '{' '}' { $$ = new_type(TSet); $$->members = NULL; - $$ = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, $$); + $$ = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, $$); } ; @@ -534,7 +547,7 @@ { $$ = new_type(TSetOf); $$->subtype = $3; - $$ = new_tag(ASN1_C_UNIV, UT_Set, TE_EXPLICIT, $$); + $$ = new_tag(ASN1_C_UNIV, UT_Set, default_tag_env, $$); } ; @@ -636,11 +649,16 @@ $$ = new_type(TTag); $$->tag = $1; $$->tag.tagenv = $2; - if($3->type == TTag && $2 == TE_IMPLICIT) { + if (template_flag) { + $$->subtype = $3; + } else { + if($3->type == TTag && $2 == TE_IMPLICIT) { $$->subtype = $3->subtype; free($3); - } else + } else { $$->subtype = $3; + } + } } ; @@ -648,7 +666,7 @@ { $$.tagclass = $2; $$.tagvalue = $3; - $$.tagenv = TE_EXPLICIT; + $$.tagenv = default_tag_env; } ; @@ -672,11 +690,11 @@ tagenv : /* */ { - $$ = TE_EXPLICIT; + $$ = default_tag_env; } | kw_EXPLICIT { - $$ = TE_EXPLICIT; + $$ = default_tag_env; } | kw_IMPLICIT { @@ -987,11 +1005,14 @@ o->next = tail; } +static unsigned long idcounter; + static Type * new_type (Typetype tt) { Type *t = ecalloc(1, sizeof(*t)); t->type = tt; + t->id = idcounter++; return t; } diff --git a/crypto/heimdal/lib/asn1/check-ber.c b/crypto/heimdal/lib/asn1/check-ber.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/check-ber.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + + +RCSID("$Id$"); + +static const unsigned char *contentdata = (unsigned char *) + "\x30\x80\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x07\x02\xa0\x80\x30" + "\x80\x02\x01\x03\x31\x0b\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05" + "\x00\x30\x80\x06\x07\x2b\x06\x01\x05\x02\x03\x01\xa0\x80\x24\x80" + "\x04\x40\x30\x3e\xa0\x3c\x30\x3a\xa0\x05\x02\x03\x0e\x03\x86\xa1" + "\x11\x18\x0f\x32\x30\x30\x38\x31\x32\x31\x33\x31\x39\x34\x35\x34" + "\x32\x5a\xa2\x06\x02\x04\xba\xbd\x97\x8a\xa3\x16\x04\x14\x41\x28" + "\x79\xa8\xd0\xe4\xb1\x0f\xb1\xfc\xa6\x0b\x4d\x2b\x85\x3d\xd9\x17" + "\x3f\xdc\x00\x00\x00\x00\x00\x00\xa0\x82\x0b\x6c\x30\x82\x05\x57" + "\x30\x82\x04\x3f\xa0\x03\x02\x01\x02\x02\x03\x47\x3d\x05\x30\x0d" + "\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05\x05\x00\x30\x81\x86" + "\x31\x0b\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31\x1d\x30" + "\x1b\x06\x03\x55\x04\x0a\x13\x14\x41\x70\x70\x6c\x65\x20\x43\x6f" + "\x6d\x70\x75\x74\x65\x72\x2c\x20\x49\x6e\x63\x2e\x31\x2d\x30\x2b" + "\x06\x03\x55\x04\x0b\x13\x24\x41\x70\x70\x6c\x65\x20\x43\x6f\x6d" + "\x70\x75\x74\x65\x72\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74" + "\x65\x20\x41\x75\x74\x68\x6f\x72\x69\x74\x79\x31\x29\x30\x27\x06" + "\x03\x55\x04\x03\x13\x20\x41\x70\x70\x6c\x65\x20\x2e\x4d\x61\x63" + "\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74" + "\x68\x6f\x72\x69\x74\x79\x30\x1e\x17\x0d\x30\x38\x31\x30\x30\x31" + "\x30\x38\x30\x36\x33\x33\x5a\x17\x0d\x30\x39\x31\x30\x30\x32\x30" + "\x38\x30\x36\x33\x33\x5a\x30\x71\x31\x0b\x30\x09\x06\x03\x55\x04" + "\x06\x13\x02\x55\x53\x31\x13\x30\x11\x06\x03\x55\x04\x0a\x13\x0a" + "\x41\x70\x70\x6c\x65\x20\x49\x6e\x63\x2e\x31\x0f\x30\x0d\x06\x03" + "\x55\x04\x0b\x13\x06\x6d\x65\x2e\x63\x6f\x6d\x31\x15\x30\x13\x06" + "\x03\x55\x04\x03\x13\x0c\x62\x69\x74\x63\x6f\x6c\x6c\x65\x63\x74" + "\x6f\x72\x31\x25\x30\x23\x06\x03\x55\x04\x0d\x13\x1c\x4d\x6f\x62" + "\x69\x6c\x65\x4d\x65\x20\x53\x68\x61\x72\x69\x6e\x67\x20\x43\x65" + "\x72\x74\x69\x66\x69\x63\x61\x74\x65\x30\x81\xa3\x30\x0d\x06\x09" + "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x91\x00\x30" + "\x81\x8d\x02\x81\x81\x00\xe1\x15\xd8\xfa\xe9\xc2\xb7\x2e\xf0\xd9" + "\xbe\xdb\x0c\xd8\xcb\xf3\x88\x13\xd7\x22\xf8\x4d\xf4\xb6\x31\x17" + "\xe5\x92\x42\xef\x15\xe4\x5f\x12\x58\x3d\x8d\x0b\xa4\x03\x76\xe0" + "\xd0\xf2\x46\xb4\x4b\x14\x78\x23\x1c\x38\xb0\x99\xff\x36\x6f\x0e" + "\x26\xdf\x76\xd0\x01\x03\x7a\xd9\xcd\x1c\x92\xa6\x10\x5e\xed\x8a" + "\xb0\xfe\x9b\x8c\x96\xb0\x91\x9f\x97\xd0\xf4\x9c\x81\x8e\xbf\xb5" + "\x41\x24\x81\xb0\x1b\xb3\x8c\xd3\x92\x5c\xfd\x2b\x04\x61\xc3\x21" + "\x6c\xa9\xe4\xa0\xfe\xa5\x1c\x76\xfd\xda\x3b\x81\x7c\xa0\x5c\x2c" + "\xf6\x8f\x6e\x74\x52\x35\x02\x07\x01\x00\x01\x00\x01\x00\x01\xa3" + "\x82\x02\x60\x30\x82\x02\x5c\x30\x0c\x06\x03\x55\x1d\x13\x01\x01" + "\xff\x04\x02\x30\x00\x30\x0e\x06\x03\x55\x1d\x0f\x01\x01\xff\x04" + "\x04\x03\x02\x03\x88\x30\x28\x06\x03\x55\x1d\x25\x04\x21\x30\x1f" + "\x06\x08\x2b\x06\x01\x05\x05\x07\x03\x02\x06\x0a\x2a\x86\x48\x86" + "\xf7\x63\x64\x03\x02\x01\x06\x07\x2b\x06\x01\x05\x02\x03\x04\x30" + "\x1d\x06\x03\x55\x1d\x0e\x04\x16\x04\x14\x11\xb3\x15\xb5\xab\x31" + "\xbb\xa5\x48\xee\xd6\x33\xd2\x86\xc3\x0b\x2a\x4c\x5e\x94\x30\x1f" + "\x06\x03\x55\x1d\x23\x04\x18\x30\x16\x80\x14\x7a\x7d\x90\xb1\x30" + "\x59\x08\x92\x91\xf9\x53\xb9\x71\x1d\x35\x33\x67\x34\x8b\xd5\x30" + "\x81\xa5\x06\x08\x2b\x06\x01\x05\x05\x07\x01\x01\x04\x81\x98\x30" + "\x81\x95\x30\x27\x06\x08\x2b\x06\x01\x05\x05\x07\x30\x01\x86\x1b" + "\x68\x74\x74\x70\x3a\x2f\x2f\x63\x65\x72\x74\x69\x6e\x66\x6f\x2e" + "\x6d\x65\x2e\x63\x6f\x6d\x2f\x6f\x63\x73\x70\x30\x44\x06\x08\x2b" + "\x06\x01\x05\x05\x07\x30\x02\x86\x38\x68\x74\x74\x70\x3a\x2f\x2f" + "\x77\x77\x77\x2e\x61\x70\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\x65" + "\x72\x74\x69\x66\x69\x63\x61\x74\x65\x61\x75\x74\x68\x6f\x72\x69" + "\x74\x79\x2f\x63\x61\x73\x69\x67\x6e\x65\x72\x73\x2e\x68\x74\x6d" + "\x6c\x30\x24\x06\x03\x55\x1d\x12\x86\x1d\x68\x74\x74\x70\x3a\x2f" + "\x2f\x63\x65\x72\x74\x69\x6e\x66\x6f\x2e\x6d\x65\x2e\x63\x6f\x6d" + "\x2f\x43\x41\x2e\x63\x65\x72\x30\x82\x01\x28\x06\x03\x55\x1d\x20" + "\x04\x82\x01\x1f\x30\x82\x01\x1b\x30\x82\x01\x17\x06\x09\x2a\x86" + "\x48\x86\xf7\x63\x64\x05\x02\x30\x82\x01\x08\x30\x40\x06\x08\x2b" + "\x06\x01\x05\x05\x07\x02\x01\x16\x34\x68\x74\x74\x70\x3a\x2f\x2f" + "\x77\x77\x77\x2e\x61\x70\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\x65" + "\x72\x74\x69\x66\x69\x63\x61\x74\x65\x61\x75\x74\x68\x6f\x72\x69" + "\x74\x79\x2f\x74\x65\x72\x6d\x73\x2e\x68\x74\x6d\x6c\x30\x81\xc3" + "\x06\x08\x2b\x06\x01\x05\x05\x07\x02\x02\x30\x81\xb6\x1a\x81\xb3" + "\x52\x65\x6c\x69\x61\x6e\x63\x65\x20\x6f\x6e\x20\x74\x68\x69\x73" + "\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x62\x79\x20" + "\x61\x6e\x79\x20\x70\x61\x72\x74\x79\x20\x61\x73\x73\x75\x6d\x65" + "\x73\x20\x61\x63\x63\x65\x70\x74\x61\x6e\x63\x65\x20\x6f\x66\x20" + "\x74\x68\x65\x20\x74\x68\x65\x6e\x20\x61\x70\x70\x6c\x69\x63\x61" + "\x62\x6c\x65\x20\x73\x74\x61\x6e\x64\x61\x72\x64\x20\x74\x65\x72" + "\x6d\x73\x20\x61\x6e\x64\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e" + "\x73\x20\x6f\x66\x20\x75\x73\x65\x2c\x20\x63\x65\x72\x74\x69\x66" + "\x69\x63\x61\x74\x65\x20\x70\x6f\x6c\x69\x63\x79\x20\x61\x6e\x64" + "\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x20\x70" + "\x72\x61\x63\x74\x69\x63\x65\x20\x73\x74\x61\x74\x65\x6d\x65\x6e" + "\x74\x73\x2e\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05" + "\x05\x00\x03\x82\x01\x01\x00\x39\xb1\x81\xbe\x55\xf1\xb1\xe4\x16" + "\x5d\x7c\x5b\x6a\xe8\xcf\xee\xaa\x87\x91\x81\xf2\x57\x0d\x32\x6c" + "\xc6\x47\xdc\x71\x70\xfa\x7c\x47\x84\x7f\xa5\x69\x1b\x4c\x52\x98" + "\x7f\xc8\x1f\x62\x06\x83\xae\x0a\xef\x55\x29\x35\xb3\xa0\x04\x88" + "\xa6\x45\x0a\xd0\xd7\x4e\x5c\x63\x3e\xe7\xb2\x28\x85\xd3\x01\x56" + "\x2b\x89\xb5\x60\x9a\xa5\x9d\x85\x0d\x76\x9e\xe1\x4a\x54\x8b\x6f" + "\xad\xc4\xc2\x43\x2f\x18\xaa\x18\x1a\x64\x2f\x2e\xe3\xc9\xb8\xa8" + "\xdd\xba\x53\xc4\x18\xcf\x4e\x30\xbf\x06\xa7\xdb\x12\x34\x24\x5c" + "\x71\x60\x2a\xd2\x93\xef\x54\x83\x4e\x5d\xc5\x5f\x00\x8d\x02\x85" + "\xe5\x17\x68\x46\xfa\xd4\x45\x96\x71\xf7\x93\x58\x4d\x83\x6b\x01" + "\xcb\xdb\x7d\x61\x67\x69\xbe\xf1\x4c\x4b\xe2\x3e\xf6\x4e\x62\x77" + "\x26\x86\xc4\x3b\x96\x38\x27\x0b\x02\x0d\x07\xc9\x95\x53\x6d\x03" + "\xff\x61\xfb\x67\x7f\x8a\x2e\x2f\xc5\xff\x5a\xf9\x53\xd8\xb3\xae" + "\xf1\x05\x27\x92\x79\x22\xd5\x55\x6e\xd6\xbf\xdb\x9d\xad\xbf\xbf" + "\x7d\x15\xd8\x1c\x3d\x63\x86\xf1\xf1\x78\xfe\xfb\x62\x06\x8c\xf4" + "\x0f\xa8\x91\xa8\x7c\xef\x51\x96\x09\x52\x68\xec\x09\xdd\xb9\x9a" + "\x62\x49\xac\xbe\x20\x20\x9b\x30\x82\x06\x0d\x30\x82\x04\xf5\xa0" + "\x03\x02\x01\x02\x02\x01\x0f\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7" + "\x0d\x01\x01\x05\x05\x00\x30\x81\x86\x31\x0b\x30\x09\x06\x03\x55" + "\x04\x06\x13\x02\x55\x53\x31\x1d\x30\x1b\x06\x03\x55\x04\x0a\x13" + "\x14\x41\x70\x70\x6c\x65\x20\x43\x6f\x6d\x70\x75\x74\x65\x72\x2c" + "\x20\x49\x6e\x63\x2e\x31\x2d\x30\x2b\x06\x03\x55\x04\x0b\x13\x24" + "\x41\x70\x70\x6c\x65\x20\x43\x6f\x6d\x70\x75\x74\x65\x72\x20\x43" + "\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6f" + "\x72\x69\x74\x79\x31\x29\x30\x27\x06\x03\x55\x04\x03\x13\x20\x41" + "\x70\x70\x6c\x65\x20\x52\x6f\x6f\x74\x20\x43\x65\x72\x74\x69\x66" + "\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6f\x72\x69\x74\x79\x30" + "\x1e\x17\x0d\x30\x35\x30\x32\x31\x30\x32\x30\x33\x38\x32\x37\x5a" + "\x17\x0d\x31\x31\x31\x31\x31\x30\x32\x30\x33\x38\x32\x37\x5a\x30" + "\x81\x86\x31\x0b\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55\x53\x31" + "\x1d\x30\x1b\x06\x03\x55\x04\x0a\x13\x14\x41\x70\x70\x6c\x65\x20" + "\x43\x6f\x6d\x70\x75\x74\x65\x72\x2c\x20\x49\x6e\x63\x2e\x31\x2d" + "\x30\x2b\x06\x03\x55\x04\x0b\x13\x24\x41\x70\x70\x6c\x65\x20\x43" + "\x6f\x6d\x70\x75\x74\x65\x72\x20\x43\x65\x72\x74\x69\x66\x69\x63" + "\x61\x74\x65\x20\x41\x75\x74\x68\x6f\x72\x69\x74\x79\x31\x29\x30" + "\x27\x06\x03\x55\x04\x03\x13\x20\x41\x70\x70\x6c\x65\x20\x2e\x4d" + "\x61\x63\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41" + "\x75\x74\x68\x6f\x72\x69\x74\x79\x30\x82\x01\x22\x30\x0d\x06\x09" + "\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x00" + "\x30\x82\x01\x0a\x02\x82\x01\x01\x00\xbb\x73\x84\xb0\x48\x36\x64" + "\xf8\x1f\xa2\x57\x89\xb6\xe2\x71\x3c\x36\x5e\x56\xeb\xdb\x96\x16" + "\x23\x1c\x81\xd0\x14\x2d\xd6\xf0\x4b\x22\x9b\x3f\xb7\x7a\x2c\xa2" + "\xf0\x69\x48\x33\xb7\x9e\xef\x68\xe7\xbc\x30\x07\x73\xbc\x61\xb0" + "\x01\x51\xef\x44\xdf\xdb\x45\x04\x96\x80\x2c\x7b\xe8\x93\x1f\x89" + "\x92\x60\x21\xcd\x34\x55\x00\x66\x31\x03\x01\x01\x44\x25\x94\x0b" + "\x42\x78\xca\x5a\x05\x1e\x77\x73\x24\x75\x6a\xc8\x45\x9c\xef\x2b" + "\x2a\x51\x29\x8f\xeb\x7e\x62\xd7\xfa\xcd\x32\xfd\x31\xe8\xcd\xde" + "\xab\x0d\xb5\xb4\x56\xc2\x68\x51\x09\x0c\x29\xe5\x38\x7b\x50\x68" + "\xbe\x00\x87\x8c\x56\xef\xd3\x1b\xa3\xc9\x6e\xa6\x74\x43\xeb\x83" + "\xd4\x63\x5f\x13\x79\x1e\xf8\x85\xbf\xbf\x73\x69\x36\xc5\x56\x12" + "\x6c\xe4\xee\xaf\x86\xab\x65\xb6\x04\xf0\x5a\x63\x2d\xa3\x31\x6c" + "\xe8\x48\x10\x65\xc0\x74\x45\x0d\x97\x58\x90\x3d\x91\x83\x14\xf2" + "\x6f\xba\xad\x2f\x6c\x41\x6e\x3c\xb7\x8f\x72\x4a\x1d\xf0\xb7\x1a" + "\xc0\xf0\x72\x0b\x3d\x9d\x7a\x8b\x4d\xb0\x33\xb7\x5f\x83\xef\x08" + "\x5b\x5f\x35\x35\x3b\x52\xdf\x30\xb1\x00\x6c\xa6\x3a\x86\xc4\xf4" + "\x7c\xe1\x79\x74\x5f\x0b\x35\xb8\xe1\x02\x03\x01\x00\x01\xa3\x82" + "\x02\x82\x30\x82\x02\x7e\x30\x0e\x06\x03\x55\x1d\x0f\x01\x01\xff" + "\x04\x04\x03\x02\x01\x86\x30\x0f\x06\x03\x55\x1d\x13\x01\x01\xff" + "\x04\x05\x30\x03\x01\x01\xff\x30\x1d\x06\x03\x55\x1d\x0e\x04\x16" + "\x04\x14\x7a\x7d\x90\xb1\x30\x59\x08\x92\x91\xf9\x53\xb9\x71\x1d" + "\x35\x33\x67\x34\x8b\xd5\x30\x1f\x06\x03\x55\x1d\x23\x04\x18\x30" + "\x16\x80\x14\x2b\xd0\x69\x47\x94\x76\x09\xfe\xf4\x6b\x8d\x2e\x40" + "\xa6\xf7\x47\x4d\x7f\x08\x5e\x30\x82\x01\x28\x06\x03\x55\x1d\x20" + "\x04\x82\x01\x1f\x30\x82\x01\x1b\x30\x82\x01\x17\x06\x09\x2a\x86" + "\x48\x86\xf7\x63\x64\x05\x02\x30\x82\x01\x08\x30\x40\x06\x08\x2b" + "\x06\x01\x05\x05\x07\x02\x01\x16\x34\x68\x74\x74\x70\x3a\x2f\x2f" + "\x77\x77\x77\x2e\x61\x70\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\x65" + "\x72\x74\x69\x66\x69\x63\x61\x74\x65\x61\x75\x74\x68\x6f\x72\x69" + "\x74\x79\x2f\x74\x65\x72\x6d\x73\x2e\x68\x74\x6d\x6c\x30\x81\xc3" + "\x06\x08\x2b\x06\x01\x05\x05\x07\x02\x02\x30\x81\xb6\x1a\x81\xb3" + "\x52\x65\x6c\x69\x61\x6e\x63\x65\x20\x6f\x6e\x20\x74\x68\x69\x73" + "\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x62\x79\x20" + "\x61\x6e\x79\x20\x70\x61\x72\x74\x79\x20\x61\x73\x73\x75\x6d\x65" + "\x73\x20\x61\x63\x63\x65\x70\x74\x61\x6e\x63\x65\x20\x6f\x66\x20" + "\x74\x68\x65\x20\x74\x68\x65\x6e\x20\x61\x70\x70\x6c\x69\x63\x61" + "\x62\x6c\x65\x20\x73\x74\x61\x6e\x64\x61\x72\x64\x20\x74\x65\x72" + "\x6d\x73\x20\x61\x6e\x64\x20\x63\x6f\x6e\x64\x69\x74\x69\x6f\x6e" + "\x73\x20\x6f\x66\x20\x75\x73\x65\x2c\x20\x63\x65\x72\x74\x69\x66" + "\x69\x63\x61\x74\x65\x20\x70\x6f\x6c\x69\x63\x79\x20\x61\x6e\x64" + "\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x69\x6f\x6e\x20\x70" + "\x72\x61\x63\x74\x69\x63\x65\x20\x73\x74\x61\x74\x65\x6d\x65\x6e" + "\x74\x73\x2e\x30\x43\x06\x03\x55\x1d\x1f\x04\x3c\x30\x3a\x30\x38" + "\xa0\x36\xa0\x34\x86\x32\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77" + "\x2e\x61\x70\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\x65\x72\x74\x69" + "\x66\x69\x63\x61\x74\x65\x61\x75\x74\x68\x6f\x72\x69\x74\x79\x2f" + "\x72\x6f\x6f\x74\x2e\x63\x72\x6c\x30\x81\xa9\x06\x08\x2b\x06\x01" + "\x05\x05\x07\x01\x01\x04\x81\x9c\x30\x81\x99\x30\x44\x06\x08\x2b" + "\x06\x01\x05\x05\x07\x30\x02\x86\x38\x68\x74\x74\x70\x3a\x2f\x2f" + "\x77\x77\x77\x2e\x61\x70\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x63\x65" + "\x72\x74\x69\x66\x69\x63\x61\x74\x65\x61\x75\x74\x68\x6f\x72\x69" + "\x74\x79\x2f\x63\x61\x73\x69\x67\x6e\x65\x72\x73\x2e\x68\x74\x6d" + "\x6c\x30\x51\x06\x03\x55\x1d\x12\x86\x4a\x68\x74\x74\x70\x3a\x2f" + "\x2f\x77\x77\x77\x2e\x61\x70\x70\x6c\x65\x2e\x63\x6f\x6d\x2f\x63" + "\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x61\x75\x74\x68\x6f\x72" + "\x69\x74\x79\x2f\x41\x70\x70\x6c\x65\x43\x6f\x6d\x70\x75\x74\x65" + "\x72\x52\x6f\x6f\x74\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65" + "\x2e\x63\x65\x72\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01" + "\x05\x05\x00\x03\x82\x01\x01\x00\x16\x06\xe5\x56\x65\x44\x7d\xd0" + "\xaa\x99\x29\xe5\xc6\x97\x0b\x02\x43\x25\x88\x8c\x42\xba\xfb\xd6" + "\x5b\xb7\x20\x10\x69\x04\x4e\x91\x81\x08\xec\xf5\x23\x1f\xd2\x6d" + "\x3f\x35\xae\xdb\xff\xb8\xc9\x2b\x4b\x28\x73\xc4\x26\x03\xe1\x92" + "\x5e\xb2\x84\x0d\xa7\x13\xc6\x34\x54\xf1\x49\x1f\xa9\x47\x88\xb1" + "\x40\x9b\xd3\x61\x93\x5b\xcf\xc7\x53\xe7\x9f\x54\x7b\x30\xc6\xb8" + "\x3a\x89\x6f\x06\x09\x45\xa1\x94\x98\xbe\x8b\xea\x25\x7d\x91\x89" + "\xf9\x27\x62\xb9\x5f\x2d\xea\xa9\xe7\x96\x5c\xbe\xe5\x84\x6d\xe8" + "\x50\x27\xb4\xb1\xea\x9f\xf7\x92\x0d\x54\x86\xf0\x37\x31\x47\x0d" + "\x54\xde\x91\xe8\x78\xe8\x61\x27\x7c\xc3\xea\xd0\xfc\x21\xa1\x08" + "\xc8\xe5\x01\x0e\x15\xf5\x61\x60\xce\xff\xbd\x44\xd6\x8a\x1b\x67" + "\xf8\x1f\x82\xe2\xa6\xb3\xfc\x3a\xc7\x30\xae\x93\x89\x29\x2e\x81" + "\x43\x0c\x9b\xd5\x18\xa6\x74\x66\x7d\x1c\x79\xe6\x22\xef\xba\xf8" + "\x23\xb3\xd3\x50\x76\x20\xde\x7a\x93\x91\x40\xcd\x16\xad\x82\x6a" + "\xe6\xe7\x25\xf5\xb3\xbb\x36\x61\x38\x8f\xaf\x36\x5f\x4b\xae\xc1" + "\xc6\x89\x99\xb1\xb1\xd9\xf1\xa3\x51\x50\xa1\x00\x3d\xdd\x16\x89" + "\xcf\x35\x05\x62\xa0\x8b\x48\x0a\x31\x82\x01\x35\x30\x82\x01\x31" + "\x02\x01\x01\x30\x81\x8e\x30\x81\x86\x31\x0b\x30\x09\x06\x03\x55" + "\x04\x06\x13\x02\x55\x53\x31\x1d\x30\x1b\x06\x03\x55\x04\x0a\x13" + "\x14\x41\x70\x70\x6c\x65\x20\x43\x6f\x6d\x70\x75\x74\x65\x72\x2c" + "\x20\x49\x6e\x63\x2e\x31\x2d\x30\x2b\x06\x03\x55\x04\x0b\x13\x24" + "\x41\x70\x70\x6c\x65\x20\x43\x6f\x6d\x70\x75\x74\x65\x72\x20\x43" + "\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6f" + "\x72\x69\x74\x79\x31\x29\x30\x27\x06\x03\x55\x04\x03\x13\x20\x41" + "\x70\x70\x6c\x65\x20\x2e\x4d\x61\x63\x20\x43\x65\x72\x74\x69\x66" + "\x69\x63\x61\x74\x65\x20\x41\x75\x74\x68\x6f\x72\x69\x74\x79\x02" + "\x03\x47\x3d\x05\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x30" + "\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81" + "\x80\x6d\xba\xa5\x44\x89\x98\x2d\x5e\xc4\xf6\xc0\x1e\x36\x70\x63" + "\x43\xf6\x61\x3c\x0b\x43\x32\x50\x54\x95\x1e\x51\x41\x17\xd2\x7f" + "\x47\x00\x21\x92\x61\xbf\x42\x63\xa4\xc8\x3a\x7f\x8d\x36\xea\xf1" + "\x2d\x9f\x0c\x30\xbc\xe1\x5e\x16\xea\xcc\x01\xdf\xbd\x6b\xc8\xc3" + "\xad\x12\x0e\x6a\x4d\xd5\xad\x15\x41\xcd\xde\xb9\xf9\xf5\xf2\xdc" + "\x65\xaf\x61\x28\x68\x40\x52\x59\xf8\xb8\xa6\xec\xce\xed\x5e\x16" + "\x7b\xbd\x72\x5e\x6a\x6e\x8b\x29\xb2\x97\x22\xe9\x99\xa3\xd6\xa9" + "\x0e\xb3\x5e\xd3\x18\x24\x06\x20\x78\xc8\xa7\xa8\xe7\x76\x3a\x8a" + "\x19\x00\x00\x00\x00\x00\x00"; + +static size_t contentlen = 3367; + + +static int +test_ber(void) +{ + ContentInfo ci; + size_t size; + int ret; + + ret = decode_ContentInfo(contentdata, contentlen, &ci, &size); + if (ret) + return 1; + + return 0; +} + +int +main(int argc, char **argv) +{ + int ret = 0; + + ret += test_ber(); + + return ret; +} diff --git a/crypto/heimdal/lib/asn1/check-common.h b/crypto/heimdal/lib/asn1/check-common.h --- a/crypto/heimdal/lib/asn1/check-common.h +++ b/crypto/heimdal/lib/asn1/check-common.h @@ -33,29 +33,47 @@ * SUCH DAMAGE. */ +#define IF_OPT_COMPARE(ac,bc,e) \ + if (((ac)->e == NULL && (bc)->e != NULL) || (((ac)->e != NULL && (bc)->e == NULL))) return 1; \ + if ((ac)->e) +#define COMPARE_OPT_STRING(ac,bc,e) \ + do { if (strcmp(*(ac)->e, *(bc)->e) != 0) return 1; } while(0) +#define COMPARE_OPT_OCTET_STRING(ac,bc,e) \ + do { if ((ac)->e->length != (bc)->e->length || memcmp((ac)->e->data, (bc)->e->data, (ac)->e->length) != 0) return 1; } while(0) +#define COMPARE_STRING(ac,bc,e) \ + do { if (strcmp((ac)->e, (bc)->e) != 0) return 1; } while(0) +#define COMPARE_INTEGER(ac,bc,e) \ + do { if ((ac)->e != (bc)->e) return 1; } while(0) +#define COMPARE_OPT_INTEGER(ac,bc,e) \ + do { if (*(ac)->e != *(bc)->e) return 1; } while(0) +#define COMPARE_MEM(ac,bc,e,len) \ + do { if (memcmp((ac)->e, (bc)->e,len) != 0) return 1; } while(0) +#define COMPARE_OCTET_STRING(ac,bc,e) \ + do { if ((ac)->e.length != (bc)->e.length || memcmp((ac)->e.data, (bc)->e.data, (ac)->e.length) != 0) return 1; } while(0) + struct test_case { void *val; - int byte_len; + ssize_t byte_len; const char *bytes; char *name; }; typedef int (ASN1CALL *generic_encode)(unsigned char *, size_t, void *, size_t *); -typedef int (ASN1CALL *generic_length)(void *); +typedef size_t (ASN1CALL *generic_length)(void *); typedef int (ASN1CALL *generic_decode)(unsigned char *, size_t, void *, size_t *); -typedef int (ASN1CALL *generic_free)(void *); +typedef void (ASN1CALL *generic_free)(void *); typedef int (ASN1CALL *generic_copy)(const void *, void *); int -generic_test (const struct test_case *tests, - unsigned ntests, - size_t data_size, - int (ASN1CALL *encode)(unsigned char *, size_t, void *, size_t *), - int (ASN1CALL *length)(void *), - int (ASN1CALL *decode)(unsigned char *, size_t, void *, size_t *), - int (ASN1CALL *free_data)(void *), - int (*cmp)(void *a, void *b), - int (ASN1CALL *copy)(const void *a, void *b)); +generic_test (const struct test_case *, + unsigned, + size_t, + generic_encode, + generic_length, + generic_decode, + generic_free, + int (*)(void *a, void *b), + generic_copy); int generic_decode_fail(const struct test_case *tests, diff --git a/crypto/heimdal/lib/asn1/check-common.c b/crypto/heimdal/lib/asn1/check-common.c --- a/crypto/heimdal/lib/asn1/check-common.c +++ b/crypto/heimdal/lib/asn1/check-common.c @@ -33,9 +33,7 @@ * SUCH DAMAGE. */ -#ifdef HAVE_CONFIG_H #include -#endif #ifdef HAVE_SYS_MMAN_H #include #endif @@ -47,8 +45,6 @@ #include "asn1-common.h" #include "check-common.h" -RCSID("$Id$"); - struct map_page { void *start; size_t size; @@ -196,12 +192,12 @@ generic_test (const struct test_case *tests, unsigned ntests, size_t data_size, - int (ASN1CALL *encode)(unsigned char *, size_t, void *, size_t *), - int (ASN1CALL *length)(void *), - int (ASN1CALL *decode)(unsigned char *, size_t, void *, size_t *), - int (ASN1CALL *free_data)(void *), + generic_encode encode, + generic_length length, + generic_decode decode, + generic_free free_data, int (*cmp)(void *a, void *b), - int (ASN1CALL *copy)(const void *from, void *to)) + generic_copy copy) { unsigned char *buf, *buf2; int i; diff --git a/crypto/heimdal/lib/asn1/check-der.c b/crypto/heimdal/lib/asn1/check-der.c --- a/crypto/heimdal/lib/asn1/check-der.c +++ b/crypto/heimdal/lib/asn1/check-der.c @@ -58,20 +58,21 @@ test_integer (void) { struct test_case tests[] = { - {NULL, 1, "\x00"}, - {NULL, 1, "\x7f"}, - {NULL, 2, "\x00\x80"}, - {NULL, 2, "\x01\x00"}, - {NULL, 1, "\x80"}, - {NULL, 2, "\xff\x7f"}, - {NULL, 1, "\xff"}, - {NULL, 2, "\xff\x01"}, - {NULL, 2, "\x00\xff"}, - {NULL, 4, "\x7f\xff\xff\xff"} + {NULL, 1, "\x00", NULL }, + {NULL, 1, "\x7f", NULL }, + {NULL, 2, "\x00\x80", NULL }, + {NULL, 2, "\x01\x00", NULL }, + {NULL, 1, "\x80", NULL }, + {NULL, 2, "\xff\x7f", NULL }, + {NULL, 1, "\xff", NULL }, + {NULL, 2, "\xff\x01", NULL }, + {NULL, 2, "\x00\xff", NULL }, + {NULL, 2, "\xfe\x01", NULL }, + {NULL, 4, "\x7f\xff\xff\xff", NULL } }; int values[] = {0, 127, 128, 256, -128, -129, -1, -255, 255, - 0x7fffffff}; + -511, 0x7fffffff}; int i, ret; int ntests = sizeof(tests) / sizeof(*tests); @@ -153,16 +154,16 @@ static int test_integer_more (void) { - int i, n1, n2, n3, n4, n5, n6; + int64_t i, n1, n2, n3, n4, n5, n6; n2 = 0; for (i = 0; i < (sizeof(int) * 8); i++) { - n1 = 0x01 << i; + n1 = 0x01LL << i; n2 = n2 | n1; n3 = ~n1; n4 = ~n2; - n5 = (-1) & ~(0x3f << i); - n6 = (-1) & ~(0x7f << i); + n5 = (-1LL) & ~(0x3fLL << i); + n6 = (-1LL) & ~(0x7fLL << i); test_one_int(n1); test_one_int(n2); @@ -184,14 +185,14 @@ test_unsigned (void) { struct test_case tests[] = { - {NULL, 1, "\x00"}, - {NULL, 1, "\x7f"}, - {NULL, 2, "\x00\x80"}, - {NULL, 2, "\x01\x00"}, - {NULL, 2, "\x02\x00"}, - {NULL, 3, "\x00\x80\x00"}, - {NULL, 5, "\x00\x80\x00\x00\x00"}, - {NULL, 4, "\x7f\xff\xff\xff"} + {NULL, 1, "\x00", NULL }, + {NULL, 1, "\x7f", NULL }, + {NULL, 2, "\x00\x80", NULL }, + {NULL, 2, "\x01\x00", NULL }, + {NULL, 2, "\x02\x00", NULL }, + {NULL, 3, "\x00\x80\x00", NULL }, + {NULL, 5, "\x00\x80\x00\x00\x00", NULL }, + {NULL, 4, "\x7f\xff\xff\xff", NULL } }; unsigned int values[] = {0, 127, 128, 256, 512, 32768, @@ -222,13 +223,7 @@ static int cmp_octet_string (void *a, void *b) { - heim_octet_string *oa = (heim_octet_string *)a; - heim_octet_string *ob = (heim_octet_string *)b; - - if (oa->length != ob->length) - return ob->length - oa->length; - - return (memcmp (oa->data, ob->data, oa->length)); + return der_heim_octet_string_cmp(a, b); } static int @@ -237,7 +232,7 @@ heim_octet_string s1 = {8, "\x01\x23\x45\x67\x89\xab\xcd\xef"}; struct test_case tests[] = { - {NULL, 8, "\x01\x23\x45\x67\x89\xab\xcd\xef"} + {NULL, 8, "\x01\x23\x45\x67\x89\xab\xcd\xef", NULL } }; int ntests = sizeof(tests) / sizeof(*tests); int ret; @@ -278,8 +273,8 @@ heim_bmp_string s2 = { 2, bmp_d2 }; struct test_case tests[] = { - {NULL, 2, "\x00\x20"}, - {NULL, 4, "\x00\x20\x00\x20"} + {NULL, 2, "\x00\x20", NULL }, + {NULL, 4, "\x00\x20\x00\x20", NULL } }; int ntests = sizeof(tests) / sizeof(*tests); int ret; @@ -326,8 +321,8 @@ heim_universal_string s2 = { 2, universal_d2 }; struct test_case tests[] = { - {NULL, 4, "\x00\x00\x00\x20"}, - {NULL, 8, "\x00\x00\x00\x20\x00\x00\x00\x20"} + {NULL, 4, "\x00\x00\x00\x20", NULL }, + {NULL, 8, "\x00\x00\x00\x20\x00\x00\x00\x20", NULL } }; int ntests = sizeof(tests) / sizeof(*tests); int ret; @@ -370,7 +365,7 @@ char *s1 = "Test User 1"; struct test_case tests[] = { - {NULL, 11, "\x54\x65\x73\x74\x20\x55\x73\x65\x72\x20\x31"} + {NULL, 11, "\x54\x65\x73\x74\x20\x55\x73\x65\x72\x20\x31", NULL } }; int ret, ntests = sizeof(tests) / sizeof(*tests); @@ -397,15 +392,15 @@ time_t *ta = (time_t *)a; time_t *tb = (time_t *)b; - return *tb - *ta; + return (int)(*tb - *ta); } static int test_generalized_time (void) { struct test_case tests[] = { - {NULL, 15, "19700101000000Z"}, - {NULL, 15, "19851106210627Z"} + {NULL, 15, "19700101000000Z", NULL }, + {NULL, 15, "19851106210627Z", NULL } }; time_t values[] = {0, 500159187}; int i, ret; @@ -446,10 +441,10 @@ test_oid (void) { struct test_case tests[] = { - {NULL, 2, "\x29\x01"}, - {NULL, 1, "\x29"}, - {NULL, 2, "\xff\x01"}, - {NULL, 1, "\xff"} + {NULL, 2, "\x29\x01", NULL }, + {NULL, 1, "\x29", NULL }, + {NULL, 2, "\xff\x01", NULL }, + {NULL, 1, "\xff", NULL } }; heim_oid values[] = { { 3, oid_comp1 }, @@ -490,7 +485,7 @@ test_bit_string (void) { struct test_case tests[] = { - {NULL, 1, "\x00"} + {NULL, 1, "\x00", NULL } }; heim_bit_string values[] = { { 0, "" } @@ -528,23 +523,27 @@ test_heim_integer (void) { struct test_case tests[] = { - {NULL, 2, "\xfe\x01"}, - {NULL, 2, "\xef\x01"}, - {NULL, 3, "\xff\x00\xff"}, - {NULL, 3, "\xff\x01\x00"}, - {NULL, 1, "\x00"}, - {NULL, 1, "\x01"}, - {NULL, 2, "\x00\x80"} + {NULL, 1, "\xff", NULL }, + {NULL, 2, "\xff\x01", NULL }, + {NULL, 2, "\xfe\x01", NULL }, + {NULL, 2, "\xef\x01", NULL }, + {NULL, 3, "\xff\x00\xff", NULL }, + {NULL, 3, "\xff\x01\x00", NULL }, + {NULL, 1, "\x00", NULL }, + {NULL, 1, "\x01", NULL }, + {NULL, 2, "\x00\x80", NULL }, }; heim_integer values[] = { + { 1, "\x01", 1 }, + { 1, "\xff", 1 }, { 2, "\x01\xff", 1 }, { 2, "\x10\xff", 1 }, { 2, "\xff\x01", 1 }, { 2, "\xff\x00", 1 }, { 0, "", 0 }, { 1, "\x01", 0 }, - { 1, "\x80", 0 } + { 1, "\x80", 0 }, }; int i, ret; int ntests = sizeof(tests) / sizeof(tests[0]); @@ -592,8 +591,8 @@ test_boolean (void) { struct test_case tests[] = { - {NULL, 1, "\xff"}, - {NULL, 1, "\x00"} + {NULL, 1, "\xff", NULL }, + {NULL, 1, "\x00", NULL } }; int values[] = { 1, 0 }; @@ -1075,6 +1074,104 @@ return 0; } +struct randomcheck { + asn1_type_decode decoder; + asn1_type_release release; + size_t typesize; + size_t inputsize; +} randomcheck[] = { +#define el(name, type, maxlen) { \ + (asn1_type_decode)der_get_##name, \ + (asn1_type_release)der_free_##name, \ + sizeof(type), \ + maxlen \ + } + el(integer, int, 6), + el(heim_integer, heim_integer, 12), + el(integer, int, 6), + el(unsigned, unsigned, 6), + el(general_string, heim_general_string, 12), + el(octet_string, heim_octet_string, 12), + { (asn1_type_decode)der_get_octet_string_ber, + (asn1_type_release)der_free_octet_string, + sizeof(heim_octet_string), 20 }, + el(generalized_time, time_t, 20), + el(utctime, time_t, 20), + el(bit_string, heim_bit_string, 10), + el(oid, heim_oid, 10), + { NULL, NULL, 0, 0 } +#undef el +}; + +static void +asn1rand(uint8_t *randbytes, size_t len) +{ + while (len) { + *randbytes++ = rk_random(); + len--; + } +} + +static int +check_random(void) +{ + struct randomcheck *r = randomcheck; + uint8_t *input; + void *type; + size_t size, insize; + int ret; + + while (r->decoder) { + type = emalloc(r->typesize); + memset(type, 0, r->typesize); + + input = emalloc(r->inputsize); + + /* try all zero first */ + memset(input, 0, r->inputsize); + + ret = r->decoder(input, r->inputsize, type, &size); + if (ret) + r->release(type); + + /* try all one first */ + memset(input, 0xff, r->inputsize); + ret = r->decoder(input, r->inputsize, type, &size); + if (ret) + r->release(type); + + /* try 0x41 too */ + memset(input, 0x41, r->inputsize); + ret = r->decoder(input, r->inputsize, type, &size); + if (ret) + r->release(type); + + /* random */ + asn1rand(input, r->inputsize); + ret = r->decoder(input, r->inputsize, type, &size); + if (ret) + r->release(type); + + /* let make buffer smaller */ + insize = r->inputsize; + do { + insize--; + asn1rand(input, insize); + + ret = r->decoder(input, insize, type, &size); + if (ret == 0) + r->release(type); + } while(insize > 0); + + free(type); + + r++; + } + return 0; +} + + + int main(int argc, char **argv) { @@ -1110,6 +1207,7 @@ ret += test_misc_cmp(); ret += corner_generalized_time(); ret += corner_tag(); + ret += check_random(); return ret; } diff --git a/crypto/heimdal/lib/asn1/check-gen.c b/crypto/heimdal/lib/asn1/check-gen.c --- a/crypto/heimdal/lib/asn1/check-gen.c +++ b/crypto/heimdal/lib/asn1/check-gen.c @@ -33,9 +33,7 @@ * SUCH DAMAGE. */ -#ifdef HAVE_CONFIG_H #include -#endif #include #include #include @@ -48,32 +46,15 @@ #include #include #include +#include #include "check-common.h" -RCSID("$Id$"); - static char *lha_principal[] = { "lha" }; static char *lharoot_princ[] = { "lha", "root" }; static char *datan_princ[] = { "host", "nutcracker.e.kth.se" }; static char *nada_tgt_principal[] = { "krbtgt", "NADA.KTH.SE" }; - -#define IF_OPT_COMPARE(ac,bc,e) \ - if (((ac)->e == NULL && (bc)->e != NULL) || (((ac)->e != NULL && (bc)->e == NULL))) return 1; if ((ab)->e) -#define COMPARE_OPT_STRING(ac,bc,e) \ - do { if (strcmp(*(ac)->e, *(bc)->e) != 0) return 1; } while(0) -#define COMPARE_OPT_OCTECT_STRING(ac,bc,e) \ - do { if ((ac)->e->length != (bc)->e->length || memcmp((ac)->e->data, (bc)->e->data, (ac)->e->length) != 0) return 1; } while(0) -#define COMPARE_STRING(ac,bc,e) \ - do { if (strcmp((ac)->e, (bc)->e) != 0) return 1; } while(0) -#define COMPARE_INTEGER(ac,bc,e) \ - do { if ((ac)->e != (bc)->e) return 1; } while(0) -#define COMPARE_OPT_INTEGER(ac,bc,e) \ - do { if (*(ac)->e != *(bc)->e) return 1; } while(0) -#define COMPARE_MEM(ac,bc,e,len) \ - do { if (memcmp((ac)->e, (bc)->e,len) != 0) return 1; } while(0) - static int cmp_principal (void *a, void *b) { @@ -98,18 +79,21 @@ struct test_case tests[] = { { NULL, 29, "\x30\x1b\xa0\x10\x30\x0e\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b" - "\x03\x6c\x68\x61\xa1\x07\x1b\x05\x53\x55\x2e\x53\x45" + "\x03\x6c\x68\x61\xa1\x07\x1b\x05\x53\x55\x2e\x53\x45", + NULL }, { NULL, 35, "\x30\x21\xa0\x16\x30\x14\xa0\x03\x02\x01\x01\xa1\x0d\x30\x0b\x1b" "\x03\x6c\x68\x61\x1b\x04\x72\x6f\x6f\x74\xa1\x07\x1b\x05\x53\x55" - "\x2e\x53\x45" + "\x2e\x53\x45", + NULL }, { NULL, 54, "\x30\x34\xa0\x26\x30\x24\xa0\x03\x02\x01\x03\xa1\x1d\x30\x1b\x1b" "\x04\x68\x6f\x73\x74\x1b\x13\x6e\x75\x74\x63\x72\x61\x63\x6b\x65" "\x72\x2e\x65\x2e\x6b\x74\x68\x2e\x73\x65\xa1\x0a\x1b\x08\x45\x2e" - "\x4b\x54\x48\x2e\x53\x45" + "\x4b\x54\x48\x2e\x53\x45", + NULL } }; @@ -171,7 +155,8 @@ "\x45\x2e\x4b\x54\x48\x2e\x53\x45\xa2\x10\x30\x0e\xa0" "\x03\x02\x01\x01\xa1\x07\x30\x05\x1b\x03\x6c\x68\x61" "\xa4\x03\x02\x01\x0a\xa5\x11\x18\x0f\x31\x39\x37\x30" - "\x30\x31\x30\x31\x30\x30\x30\x31\x33\x39\x5a" + "\x30\x31\x30\x31\x30\x30\x30\x31\x33\x39\x5a", + NULL }, { NULL, 67, "\x62\x41\x30\x3f\xa0\x03\x02\x01\x05\xa1\x07\x1b\x05" @@ -179,7 +164,8 @@ "\x01\xa1\x0d\x30\x0b\x1b\x03\x6c\x68\x61\x1b\x04\x72" "\x6f\x6f\x74\xa4\x04\x02\x02\x01\x24\xa5\x11\x18\x0f" "\x31\x39\x37\x30\x30\x31\x30\x31\x30\x30\x31\x36\x33" - "\x39\x5a" + "\x39\x5a", + NULL } }; @@ -251,7 +237,7 @@ COMPARE_OPT_STRING(aa,ab,e_text); } IF_OPT_COMPARE(aa,ab,e_data) { - /* COMPARE_OPT_OCTECT_STRING(aa,ab,e_data); */ + /* COMPARE_OPT_OCTET_STRING(aa,ab,e_data); */ } return 0; @@ -532,7 +518,7 @@ "time 1" }, { NULL, 17, "\x18\x0f\x32\x30\x30\x39\x30\x35\x32\x34\x30\x32\x30\x32\x34\x30" - "\x5a" + "\x5a", "time 2" } }; @@ -668,6 +654,91 @@ return 0; } +struct { + const char *sd; + size_t len; +} signeddata[] = { + { + "\x30\x80\x02\x01\x03\x31\x0b\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a" + "\x05\x00\x30\x80\x06\x07\x2b\x06\x01\x05\x02\x03\x03\xa0\x80\x24" + "\x80\x04\x50\x30\x4e\xa0\x2b\x30\x29\xa0\x03\x02\x01\x12\xa1\x22" + "\x04\x20\x78\xf4\x86\x31\xc6\xc2\xc9\xcb\xef\x0c\xd7\x3a\x2a\xcd" + "\x8c\x13\x34\x83\xb1\x5c\xa8\xbe\xbf\x2f\xea\xd2\xbb\xd8\x8c\x18" + "\x47\x01\xa1\x1f\x30\x1d\xa0\x03\x02\x01\x0c\xa1\x16\x04\x14\xa6" + "\x2c\x52\xb2\x80\x98\x30\x40\xbc\x5f\xb0\x77\x2d\x8a\xd7\xa1\xda" + "\x3c\xc5\x62\x00\x00\x00\x00\x00\x00\xa0\x82\x02\x09\x30\x82\x02" + "\x05\x30\x82\x01\x6e\xa0\x03\x02\x01\x02\x02\x04\x49\x75\x57\xbf" + "\x30\x0b\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05\x30\x3b\x31" + "\x1f\x30\x1d\x06\x03\x55\x04\x03\x0c\x16\x63\x6f\x6d\x2e\x61\x70" + "\x70\x6c\x65\x2e\x6b\x65\x72\x62\x65\x72\x6f\x73\x2e\x6b\x64\x63" + "\x31\x18\x30\x16\x06\x03\x55\x04\x0a\x0c\x0f\x53\x79\x73\x74\x65" + "\x6d\x20\x49\x64\x65\x6e\x74\x69\x74\x79\x30\x1e\x17\x0d\x30\x39" + "\x31\x32\x30\x34\x30\x30\x32\x30\x32\x34\x5a\x17\x0d\x32\x39\x31" + "\x31\x32\x39\x30\x30\x32\x30\x32\x34\x5a\x30\x3b\x31\x1f\x30\x1d" + "\x06\x03\x55\x04\x03\x0c\x16\x63\x6f\x6d\x2e\x61\x70\x70\x6c\x65" + "\x2e\x6b\x65\x72\x62\x65\x72\x6f\x73\x2e\x6b\x64\x63\x31\x18\x30" + "\x16\x06\x03\x55\x04\x0a\x0c\x0f\x53\x79\x73\x74\x65\x6d\x20\x49" + "\x64\x65\x6e\x74\x69\x74\x79\x30\x81\x9f\x30\x0d\x06\x09\x2a\x86" + "\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x81\x8d\x00\x30\x81\x89" + "\x02\x81\x81\x00\xb2\xc5\x4b\x34\xe3\x93\x99\xbb\xaa\xd1\x70\x62" + "\x6c\x9c\xcc\xa6\xbc\x47\xc3\x23\xff\x15\xb9\x11\x27\x0a\xf8\x55" + "\x4c\xb2\x43\x34\x75\xad\x55\xbb\xb9\x8a\xd0\x25\x64\xa4\x8c\x82" + "\x74\x5d\x89\x52\xe2\x76\x75\x08\x67\xb5\x9c\x9c\x69\x86\x0c\x6d" + "\x79\xf7\xa0\xbe\x42\x8f\x90\x46\x0c\x18\xf4\x7a\x56\x17\xa4\x65" + "\x00\x3a\x5e\x3e\xbf\xbc\xf5\xe2\x2c\x26\x03\x52\xdd\xd4\x85\x3f" + "\x03\xd7\x0c\x45\x7f\xff\xdd\x1e\x70\x6c\x9f\xb0\x8c\xd0\x33\xad" + "\x92\x54\x17\x9d\x88\x89\x1a\xee\xef\xf7\x96\x3e\x68\xc3\xd1\x60" + "\x47\x86\x80\x5d\x02\x03\x01\x00\x01\xa3\x18\x30\x16\x30\x14\x06" + "\x03\x55\x1d\x25\x04\x0d\x30\x0b\x06\x09\x2a\x86\x48\x86\xf7\x63" + "\x64\x04\x04\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x05" + "\x05\x00\x03\x81\x81\x00\x9b\xbb\xaa\x63\x66\xd8\x70\x84\x3e\xf6" + "\xa1\x3b\xf3\xe6\xd7\x3d\xfc\x4f\xc9\x45\xaa\x31\x43\x8d\xb5\x72" + "\xe4\x34\x95\x7b\x6e\x5f\xe5\xc8\x5e\xaf\x12\x08\x6d\xd7\x25\x76" + "\x40\xd5\xdc\x83\x7f\x2f\x74\xd1\x63\xc0\x7c\x26\x4d\x53\x10\xe7" + "\xfa\xcc\xf2\x60\x41\x63\xdf\x56\xd6\xd9\xc0\xb4\xd0\x73\x99\x54" + "\x40\xad\x90\x79\x2d\xd2\x5e\xcb\x13\x22\x2b\xd0\x76\xef\x8a\x48" + "\xfd\xb2\x6e\xca\x04\x4e\x91\x3f\xb4\x63\xad\x22\x3a\xf7\x20\x9c" + "\x4c\x0e\x47\x78\xe5\x2a\x85\x0e\x90\x7a\xce\x46\xe6\x15\x02\xb0" + "\x83\xe7\xac\xfa\x92\xf8\x31\x81\xe8\x30\x81\xe5\x02\x01\x01\x30" + "\x43\x30\x3b\x31\x1f\x30\x1d\x06\x03\x55\x04\x03\x0c\x16\x63\x6f" + "\x6d\x2e\x61\x70\x70\x6c\x65\x2e\x6b\x65\x72\x62\x65\x72\x6f\x73" + "\x2e\x6b\x64\x63\x31\x18\x30\x16\x06\x03\x55\x04\x0a\x0c\x0f\x53" + "\x79\x73\x74\x65\x6d\x20\x49\x64\x65\x6e\x74\x69\x74\x79\x02\x04" + "\x49\x75\x57\xbf\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x30" + "\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x04\x81" + "\x80\x50\x2c\x69\xe1\xd2\xc4\xd1\xcc\xdc\xe0\xe9\x8a\x6b\x6a\x97" + "\x1b\xb4\xe0\xa8\x20\xbe\x09\x6d\xe1\x55\x5f\x07\x70\x94\x2e\x14" + "\xed\x4e\xb1\x69\x75\x40\xbb\x99\x87\xed\x23\x50\x27\x5f\xaa\xc4" + "\x84\x60\x06\xfe\x45\xfd\x7e\x1b\x18\xe0\x0b\x77\x35\x2a\xb2\xf2" + "\xe0\x88\x31\xad\x82\x31\x4a\xbc\x6d\x71\x62\xe6\x4d\x33\xb4\x09" + "\x6e\x3f\x14\x12\xf2\x89\x29\x31\x84\x60\x2b\xa8\x2d\xe6\xca\x2f" + "\x03\x3d\xd4\x69\x89\xb3\x98\xfd\xac\x63\x14\xaf\x6a\x52\x2a\xac" + "\xe3\x8e\xfa\x21\x41\x8f\xcc\x04\x2d\x52\xee\x49\x54\x0d\x58\x51" + "\x77\x00\x00", + 883 + } +}; + +static int +test_SignedData(void) +{ + SignedData sd; + size_t size, i; + int ret; + + for (i = 0; i < sizeof(signeddata) / sizeof(signeddata[0]); i++) { + + ret = decode_SignedData((unsigned char *)signeddata[i].sd, + signeddata[i].len, &sd, &size); + if (ret) + return ret; + + free_SignedData(&sd); + } + + return 0; +} + static int cmp_TESTLargeTag (void *a, void *b) @@ -764,6 +835,132 @@ return failed; } +static int +check_tag_length64(void) +{ + struct test_data td[] = { + { 1, 3, 3, "\x02\x01\x00"}, + { 1, 7, 7, "\x02\x05\x01\xff\xff\xff\xff"}, + { 1, 7, 7, "\x02\x05\x02\x00\x00\x00\x00"}, + { 1, 9, 9, "\x02\x07\x7f\xff\xff\xff\xff\xff\xff"}, + { 1, 10, 10, "\x02\x08\x00\x80\x00\x00\x00\x00\x00\x00"}, + { 1, 10, 10, "\x02\x08\x7f\xff\xff\xff\xff\xff\xff\xff"}, + { 1, 11, 11, "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff"}, + { 0, 3, 0, "\x02\x02\x00"}, + { 0, 3, 0, "\x02\x7f\x7f"}, + { 0, 4, 0, "\x02\x03\x00\x80"}, + { 0, 4, 0, "\x02\x7f\x01\x00"}, + { 0, 5, 0, "\x02\xff\x7f\x02\x00"} + }; + size_t sz; + TESTuint64 values[] = {0, 8589934591LL, 8589934592LL, + 36028797018963967LL, 36028797018963968LL, + 9223372036854775807LL, 18446744073709551615ULL, + 0, 127, 128, 256, 512 }; + TESTuint64 u; + int i, ret, failed = 0; + void *buf; + + if (sizeof(TESTuint64) != sizeof(uint64_t)) { + ret += 1; + printf("sizeof(TESTuint64) %d != sizeof(uint64_t) %d\n", + (int)sizeof(TESTuint64), (int)sizeof(uint64_t)); + } + + for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { + struct map_page *page; + + buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page); + + ret = decode_TESTuint64(buf, td[i].len, &u, &sz); + if (ret) { + if (td[i].ok) { + printf("failed with tag len test %d\n", i); + printf("ret = %d\n", ret); + failed = 1; + } + } else { + if (td[i].ok == 0) { + printf("failed with success for tag len test %d\n", i); + failed = 1; + } + if (td[i].expected_len != sz) { + printf("wrong expected size for tag test %d\n", i); + printf("sz = %lu\n", (unsigned long)sz); + failed = 1; + } + if (values[i] != u) { + printf("wrong value for tag test %d\n", i); + printf("Expected value: %llu\nActual value: %llu\n", + (unsigned long long)values[i], (unsigned long long)u); + failed = 1; + } + } + map_free(page, "test", "decode"); + } + return failed; +} + +static int +check_tag_length64s(void) +{ + struct test_data td[] = { + { 1, 3, 3, "\x02\x01\x00"}, + { 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x01"}, + { 1, 7, 7, "\x02\x05\xfe\x00\x00\x00\x00"}, + { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"}, + { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x00"}, + { 1, 10, 10, "\x02\x08\x80\x00\x00\x00\x00\x00\x00\x01"}, + { 1, 9, 9, "\x02\x07\x80\x00\x00\x00\x00\x00\x01"}, + { 0, 3, 0, "\x02\x02\x00"}, + { 0, 3, 0, "\x02\x7f\x7f"}, + { 0, 4, 0, "\x02\x03\x00\x80"}, + { 0, 4, 0, "\x02\x7f\x01\x00"}, + { 0, 5, 0, "\x02\xff\x7f\x02\x00"} + }; + size_t sz; + TESTint64 values[] = {0, -8589934591LL, -8589934592LL, + -36028797018963967LL, -36028797018963968LL, + -9223372036854775807LL, -36028797018963967LL, + 0, 127, 128, 256, 512 }; + TESTint64 u; + int i, ret, failed = 0; + void *buf; + + for (i = 0; i < sizeof(td)/sizeof(td[0]); i++) { + struct map_page *page; + + buf = map_alloc(OVERRUN, td[i].data, td[i].len, &page); + + ret = decode_TESTint64(buf, td[i].len, &u, &sz); + if (ret) { + if (td[i].ok) { + printf("failed with tag len test %d\n", i); + printf("ret = %d\n", ret); + failed = 1; + } + } else { + if (td[i].ok == 0) { + printf("failed with success for tag len test %d\n", i); + failed = 1; + } + if (td[i].expected_len != sz) { + printf("wrong expected size for tag test %d\n", i); + printf("sz = %lu\n", (unsigned long)sz); + failed = 1; + } + if (values[i] != u) { + printf("wrong value for tag test %d\n", i); + printf("Expected value: %lld\nActual value: %lld\n", + (long long)values[i], (long long)u); + failed = 1; + } + } + map_free(page, "test", "decode"); + } + return failed; +} + static int cmp_TESTChoice (void *a, void *b) { @@ -818,6 +1015,7 @@ return ret; } +#ifdef IMPLICIT_TAGGING_WORKS static int cmp_TESTImplicit (void *a, void *b) { @@ -829,27 +1027,30 @@ COMPARE_INTEGER(aa,ab,ti3); return 0; } +#endif /* UNIV CONS Sequence 14 CONTEXT PRIM 0 1 00 CONTEXT CONS 1 6 - CONTEXT CONS 127 3 - UNIV PRIM Integer 1 02 + CONTEXT CONS 127 3 + UNIV PRIM Integer 1 02 CONTEXT PRIM 2 1 03 */ static int test_implicit (void) { + int ret = 0; +#ifdef IMPLICIT_TAGGING_WORKS struct test_case tests[] = { - { NULL, 16, - "\x30\x0e\x80\x01\x00\xa1\x06\xbf" - "\x7f\x03\x02\x01\x02\x82\x01\x03", + { NULL, 18, + "\x30\x10\x80\x01\x00\xa1\x06\xbf" + "\x7f\x03\x02\x01\x02\xa2\x03\x84\x01\x03", "implicit 1" } }; - int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + int ntests = sizeof(tests) / sizeof(*tests); TESTImplicit c0; memset(&c0, 0, sizeof(c0)); @@ -866,7 +1067,6 @@ cmp_TESTImplicit, (generic_copy)copy_TESTImplicit); -#ifdef IMPLICIT_TAGGING_WORKS ret += generic_test (tests, ntests, sizeof(TESTImplicit2), (generic_encode)encode_TESTImplicit2, (generic_length)length_TESTImplicit2, @@ -892,7 +1092,7 @@ COMPARE_INTEGER(aa,ab,three); IF_OPT_COMPARE(aa,ab,tagless2) { - COMPARE_OPT_OCTECT_STRING(aa, ab, tagless2); + COMPARE_OPT_OCTET_STRING(aa, ab, tagless2); } return 0; @@ -1059,7 +1259,7 @@ {NULL, 0, "", "empty buffer"}, {NULL, 7, "\x30\x05\xa1\x03\x02\x02\x01", "one too short" }, - {NULL, 7, "\x30\x04\xa1\x03\x02\x02\x01" + {NULL, 7, "\x30\x04\xa1\x03\x02\x02\x01", "two too short" }, {NULL, 7, "\x30\x03\xa1\x03\x02\x02\x01", "three too short" }, @@ -1094,7 +1294,7 @@ {NULL, 0, "", "empty buffer"}, {NULL, 24, "\x30\x16\xa0\x03\x02\x01\x01\xa1\x08\x30\x06\xbf\x7f\x03\x02\x01\x01" - "\x02\x01\x01\xa2\x03\x02\x01\x01" + "\x02\x01\x01\xa2\x03\x02\x01\x01", "missing one byte from the end, internal length ok"}, {NULL, 25, "\x30\x18\xa0\x03\x02\x01\x01\xa1\x08\x30\x06\xbf\x7f\x03\x02\x01\x01" @@ -1128,11 +1328,35 @@ (generic_decode)decode_TESTChoice1); } +static int +check_fail_Ticket(void) +{ + char buf[100]; + size_t i; + int ret; + struct test_case test; + Ticket ticket; + + for (i = 0; i < sizeof(buf); i++) { + memset(buf, 0, sizeof(buf)); + memset(&ticket, 0, sizeof(ticket)); + test.val = &ticket; + test.byte_len = i; + test.bytes = buf; + test.name = "zero life"; + ret = generic_decode_fail(&test, 1, sizeof(Ticket), + (generic_decode)decode_Ticket); + if (ret) + return ret; + } + return 0; +} + static int check_seq(void) { TESTSeqOf seq; - TESTInteger i; + TESTInteger i = 0; int ret; seq.val = NULL; @@ -1276,6 +1500,276 @@ return 0; } +#ifdef IMPLICIT_TAGGING_WORKS +static int +cmp_TESTSeqOf4(void *a, void *b) +{ + TESTSeqOf4 *aa = a; + TESTSeqOf4 *ab = b; + int i; + + IF_OPT_COMPARE(aa, ab, b1) { + COMPARE_INTEGER(aa->b1, ab->b1, len); + for (i = 0; i < aa->b1->len; ++i) { + COMPARE_INTEGER(aa->b1->val+i, ab->b1->val+i, u1); + COMPARE_INTEGER(aa->b1->val+i, ab->b1->val+i, u2); + COMPARE_OCTET_STRING(aa->b1->val+i, ab->b1->val+i, s1); + COMPARE_OCTET_STRING(aa->b1->val+i, ab->b1->val+i, s2); + } + } + IF_OPT_COMPARE(aa, ab, b2) { + COMPARE_INTEGER(aa->b2, ab->b2, len); + for (i = 0; i < aa->b2->len; ++i) { + COMPARE_INTEGER(aa->b2->val+i, ab->b2->val+i, u1); + COMPARE_INTEGER(aa->b2->val+i, ab->b2->val+i, u2); + COMPARE_INTEGER(aa->b2->val+i, ab->b2->val+i, u3); + COMPARE_OCTET_STRING(aa->b2->val+i, ab->b2->val+i, s1); + COMPARE_OCTET_STRING(aa->b2->val+i, ab->b2->val+i, s2); + COMPARE_OCTET_STRING(aa->b2->val+i, ab->b2->val+i, s3); + } + } + IF_OPT_COMPARE(aa, ab, b3) { + COMPARE_INTEGER(aa->b3, ab->b3, len); + for (i = 0; i < aa->b3->len; ++i) { + COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u1); + COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u2); + COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u3); + COMPARE_INTEGER(aa->b3->val+i, ab->b3->val+i, u4); + COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s1); + COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s2); + COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s3); + COMPARE_OCTET_STRING(aa->b3->val+i, ab->b3->val+i, s4); + } + } + return 0; +} +#endif /* IMPLICIT_TAGGING_WORKS */ + +static int +test_seq4 (void) +{ + int ret = 0; +#ifdef IMPLICIT_TAGGING_WORKS + struct test_case tests[] = { + { NULL, 2, + "\x30\x00", + "seq4 0" }, + { NULL, 4, + "\x30\x02" "\xa1\x00", + "seq4 1" }, + { NULL, 8, + "\x30\x06" "\xa0\x02\x30\x00" "\xa1\x00", + "seq4 2" }, + { NULL, 2 + (2 + 0x18) + (2 + 0x27) + (2 + 0x31), + "\x30\x76" /* 2 SEQ */ + "\xa0\x18\x30\x16" /* 4 [0] SEQ */ + "\x30\x14" /* 2 SEQ */ + "\x04\x00" /* 2 OCTET-STRING */ + "\x04\x02\x01\x02" /* 4 OCTET-STRING */ + "\x02\x01\x01" /* 3 INT */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" + /* 11 INT */ + "\xa1\x27" /* 2 [1] IMPL SEQ */ + "\x30\x25" /* 2 SEQ */ + "\x02\x01\x01" /* 3 INT */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" + /* 11 INT */ + "\x02\x09\x00\x80\x00\x00\x00\x00\x00\x00\x00" + /* 11 INT */ + "\x04\x00" /* 2 OCTET-STRING */ + "\x04\x02\x01\x02" /* 4 OCTET-STRING */ + "\x04\x04\x00\x01\x02\x03" /* 6 OCTET-STRING */ + "\xa2\x31" /* 2 [2] IMPL SEQ */ + "\x30\x2f" /* 2 SEQ */ + "\x04\x00" /* 2 OCTET-STRING */ + "\x02\x01\x01" /* 3 INT */ + "\x04\x02\x01\x02" /* 4 OCTET-STRING */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" + /* 11 INT */ + "\x04\x04\x00\x01\x02\x03" /* 6 OCTET-STRING */ + "\x02\x09\x00\x80\x00\x00\x00\x00\x00\x00\x00" + /* 11 INT */ + "\x04\x01\x00" /* 3 OCTET-STRING */ + "\x02\x05\x01\x00\x00\x00\x00", /* 7 INT */ + "seq4 3" }, + }; + + int ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOf4 c[4]; + struct TESTSeqOf4_b1 b1[4]; + struct TESTSeqOf4_b2 b2[4]; + struct TESTSeqOf4_b3 b3[4]; + struct TESTSeqOf4_b1_val b1val[4]; + struct TESTSeqOf4_b2_val b2val[4]; + struct TESTSeqOf4_b3_val b3val[4]; + + c[0].b1 = NULL; + c[0].b2 = NULL; + c[0].b3 = NULL; + tests[0].val = &c[0]; + + b2[1].len = 0; + b2[1].val = NULL; + c[1].b1 = NULL; + c[1].b2 = &b2[1]; + c[1].b3 = NULL; + tests[1].val = &c[1]; + + b1[2].len = 0; + b1[2].val = NULL; + b2[2].len = 0; + b2[2].val = NULL; + c[2].b1 = &b1[2]; + c[2].b2 = &b2[2]; + c[2].b3 = NULL; + tests[2].val = &c[2]; + + b1val[3].s1.data = ""; + b1val[3].s1.length = 0; + b1val[3].u1 = 1LL; + b1val[3].s2.data = "\x01\x02"; + b1val[3].s2.length = 2; + b1val[3].u2 = -1LL; + + b2val[3].s1.data = ""; + b2val[3].s1.length = 0; + b2val[3].u1 = 1LL; + b2val[3].s2.data = "\x01\x02"; + b2val[3].s2.length = 2; + b2val[3].u2 = -1LL; + b2val[3].s3.data = "\x00\x01\x02\x03"; + b2val[3].s3.length = 4; + b2val[3].u3 = 1LL<<63; + + b3val[3].s1.data = ""; + b3val[3].s1.length = 0; + b3val[3].u1 = 1LL; + b3val[3].s2.data = "\x01\x02"; + b3val[3].s2.length = 2; + b3val[3].u2 = -1LL; + b3val[3].s3.data = "\x00\x01\x02\x03"; + b3val[3].s3.length = 4; + b3val[3].u3 = 1LL<<63; + b3val[3].s4.data = "\x00"; + b3val[3].s4.length = 1; + b3val[3].u4 = 1LL<<32; + + b1[3].len = 1; + b1[3].val = &b1val[3]; + b2[3].len = 1; + b2[3].val = &b2val[3]; + b3[3].len = 1; + b3[3].val = &b3val[3]; + c[3].b1 = &b1[3]; + c[3].b2 = &b2[3]; + c[3].b3 = &b3[3]; + tests[3].val = &c[3]; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOf4), + (generic_encode)encode_TESTSeqOf4, + (generic_length)length_TESTSeqOf4, + (generic_decode)decode_TESTSeqOf4, + (generic_free)free_TESTSeqOf4, + cmp_TESTSeqOf4, + (generic_copy)copy_TESTSeqOf4); +#endif /* IMPLICIT_TAGGING_WORKS */ + return ret; +} + +static int +cmp_test_seqof5 (void *a, void *b) +{ + TESTSeqOf5 *aval = a; + TESTSeqOf5 *bval = b; + + IF_OPT_COMPARE(aval, bval, outer) { + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u0); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s0); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u1); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s1); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u2); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s2); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u3); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s3); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u4); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s4); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u5); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s5); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u6); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s6); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u7); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s7); + } + return 0; +} + +static int +test_seqof5(void) +{ + struct test_case tests[] = { + { NULL, 2, "\x30\x00", "seq5 0" }, + { NULL, 126, + "\x30\x7c" /* SEQ */ + "\x30\x7a" /* SEQ */ + "\x30\x78" /* SEQ */ + "\x02\x01\x01" /* INT 1 */ + "\x04\x06\x01\x01\x01\x01\x01\x01" /* "\0x1"x6 */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfe" /* INT ~1 */ + "\x04\x06\x02\x02\x02\x02\x02\x02" /* "\x02"x6 */ + "\x02\x01\x02" /* INT 2 */ + "\x04\x06\x03\x03\x03\x03\x03\x03" /* "\x03"x6 */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfd" /* INT ~2 */ + "\x04\x06\x04\x04\x04\x04\x04\x04" /* ... */ + "\x02\x01\x03" + "\x04\x06\x05\x05\x05\x05\x05\x05" + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfc" + "\x04\x06\x06\x06\x06\x06\x06\x06" + "\x02\x01\x04" + "\x04\x06\x07\x07\x07\x07\x07\x07" + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfb" + "\x04\x06\x08\x08\x08\x08\x08\x08", + "seq5 1" }, + }; + + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOf5 c[2]; + struct TESTSeqOf5_outer outer; + struct TESTSeqOf5_outer_inner inner; + TESTuint64 u[8]; + heim_octet_string s[8]; + int i; + + c[0].outer = NULL; + tests[0].val = &c[0]; + + for (i = 0; i < 8; ++i) { + u[i] = (i&1) == 0 ? i/2+1 : ~(i/2+1); + s[i].data = memset(malloc(s[i].length = 6), i+1, 6); + } + + inner.u0 = u[0]; inner.u1 = u[1]; inner.u2 = u[2]; inner.u3 = u[3]; + inner.u4 = u[4]; inner.u5 = u[5]; inner.u6 = u[6]; inner.u7 = u[7]; + inner.s0 = s[0]; inner.s1 = s[1]; inner.s2 = s[2]; inner.s3 = s[3]; + inner.s4 = s[4]; inner.s5 = s[5]; inner.s6 = s[6]; inner.s7 = s[7]; + + outer.inner = inner; + c[1].outer = &outer; + tests[1].val = &c[1]; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOf5), + (generic_encode)encode_TESTSeqOf5, + (generic_length)length_TESTSeqOf5, + (generic_decode)decode_TESTSeqOf5, + (generic_free)free_TESTSeqOf5, + cmp_test_seqof5, + NULL); + + for (i = 0; i < 8; ++i) + free(s[i].data); + + return ret; +} + int main(int argc, char **argv) { @@ -1291,21 +1785,28 @@ ret += test_cert(); ret += check_tag_length(); + ret += check_tag_length64(); + ret += check_tag_length64s(); ret += test_large_tag(); ret += test_choice(); ret += test_implicit(); + ret += test_taglessalloc(); ret += test_optional(); ret += check_fail_largetag(); ret += check_fail_sequence(); ret += check_fail_choice(); + ret += check_fail_Ticket(); ret += check_seq(); ret += check_seq_of_size(); + ret += test_SignedData(); ret += check_TESTMechTypeList(); + ret += test_seq4(); + ret += test_seqof5(); return ret; } diff --git a/crypto/heimdal/lib/asn1/check-template.c b/crypto/heimdal/lib/asn1/check-template.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/check-template.c @@ -0,0 +1,519 @@ +/* + * Copyright (c) 1999 - 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "check-common.h" +#include "der_locl.h" + +static int +cmp_dummy (void *a, void *b) +{ + return 0; +} + +static int +test_uint64(void) +{ + struct test_case tests[] = { + { NULL, 3, "\x02\x01\x00", "uint64 0" }, + { NULL, 7, "\x02\x05\x01\xff\xff\xff\xff", "uint64 1" }, + { NULL, 7, "\x02\x05\x02\x00\x00\x00\x00", "uint64 2" }, + { NULL, 9, "\x02\x07\x7f\xff\xff\xff\xff\xff\xff", "uint64 3" }, + { NULL, 10, "\x02\x08\x00\x80\x00\x00\x00\x00\x00\x00", "uint64 4" }, + { NULL, 10, "\x02\x08\x7f\xff\xff\xff\xff\xff\xff\xff", "uint64 5" }, + { NULL, 11, "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff", "uint64 6" } + }; + + size_t i; + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTuint64 values[] = { 0, 8589934591LL, 8589934592LL, + 36028797018963967LL, 36028797018963968LL, + 9223372036854775807LL, 18446744073709551615ULL }; + + for (i = 0; i < ntests; i++) + tests[i].val = &values[i]; + + if (sizeof(TESTuint64) != sizeof(uint64_t)) { + ret += 1; + printf("sizeof(TESTuint64) %d != sizeof(uint64_t) %d\n", + (int)sizeof(TESTuint64), (int)sizeof(uint64_t)); + } + + ret += generic_test (tests, ntests, sizeof(TESTuint64), + (generic_encode)encode_TESTuint64, + (generic_length)length_TESTuint64, + (generic_decode)decode_TESTuint64, + (generic_free)free_TESTuint64, + cmp_dummy, + NULL); + return ret; +} + +static int +test_seqofseq(void) +{ + struct test_case tests[] = { + { NULL, 2, + "\x30\x00", + "seqofseq 0" }, + { NULL, 9, + "\x30\x07\x30\x05\xa0\x03\x02\x01\x00", + "seqofseq 1" }, + { NULL, 16, + "\x30\x0e\x30\x05\xa0\x03\x02\x01\x00\x30\x05\xa0\x03\x02\x01\x01", + "seqofseq 2" } + }; + + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOfSeq c0, c1, c2; + struct TESTSeqOfSeq_val i[2]; + + i[0].zero = 0; + i[1].zero = 1; + + c0.len = 0; + c0.val = NULL; + tests[0].val = &c0; + + c1.len = 1; + c1.val = i; + tests[1].val = &c1; + + c2.len = 2; + c2.val = i; + tests[2].val = &c2; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOfSeq), + (generic_encode)encode_TESTSeqOfSeq, + (generic_length)length_TESTSeqOfSeq, + (generic_decode)decode_TESTSeqOfSeq, + (generic_free)free_TESTSeqOfSeq, + cmp_dummy, + NULL); + return ret; +} + +static int +test_seqofseq2(void) +{ + struct test_case tests[] = { + { NULL, 2, + "\x30\x00", + "seqofseq2 0" }, + { NULL, 11, + "\x30\x09\x30\x07\xa0\x05\x1b\x03\x65\x74\x74", + "seqofseq2 1" }, + { NULL, 21, + "\x30\x13\x30\x07\xa0\x05\x1b\x03\x65\x74\x74\x30\x08\xa0" + "\x06\x1b\x04\x74\x76\x61\x61", + "seqofseq2 2" } + }; + + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOfSeq2 c0, c1, c2; + struct TESTSeqOfSeq2_val i[2]; + + i[0].string = "ett"; + i[1].string = "tvaa"; + + c0.len = 0; + c0.val = NULL; + tests[0].val = &c0; + + c1.len = 1; + c1.val = i; + tests[1].val = &c1; + + c2.len = 2; + c2.val = i; + tests[2].val = &c2; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOfSeq2), + (generic_encode)encode_TESTSeqOfSeq2, + (generic_length)length_TESTSeqOfSeq2, + (generic_decode)decode_TESTSeqOfSeq2, + (generic_free)free_TESTSeqOfSeq2, + cmp_dummy, + NULL); + return ret; +} + +static int +test_seqof2(void) +{ + struct test_case tests[] = { + { NULL, 4, + "\x30\x02\x30\x00", + "seqof2 1" }, + { NULL, 9, + "\x30\x07\x30\x05\x1b\x03\x66\x6f\x6f", + "seqof2 2" }, + { NULL, 14, + "\x30\x0c\x30\x0a\x1b\x03\x66\x6f\x6f\x1b\x03\x62\x61\x72", + "seqof2 3" } + }; + + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOf2 c0, c1, c2; + heim_general_string i[2]; + + i[0] = "foo"; + i[1] = "bar"; + + c0.strings.val = NULL; + c0.strings.len = 0; + tests[0].val = &c0; + + c1.strings.len = 1; + c1.strings.val = i; + tests[1].val = &c1; + + c2.strings.len = 2; + c2.strings.val = i; + tests[2].val = &c2; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOf2), + (generic_encode)encode_TESTSeqOf2, + (generic_length)length_TESTSeqOf2, + (generic_decode)decode_TESTSeqOf2, + (generic_free)free_TESTSeqOf2, + cmp_dummy, + NULL); + return ret; +} + +static int +test_seqof3(void) +{ + struct test_case tests[] = { + { NULL, 2, + "\x30\x00", + "seqof3 0" }, + { NULL, 4, + "\x30\x02\x30\x00", + "seqof3 1" }, + { NULL, 9, + "\x30\x07\x30\x05\x1b\x03\x66\x6f\x6f", + "seqof3 2" }, + { NULL, 14, + "\x30\x0c\x30\x0a\x1b\x03\x66\x6f\x6f\x1b\x03\x62\x61\x72", + "seqof3 3" } + }; + + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOf3 c0, c1, c2, c3; + struct TESTSeqOf3_strings s1, s2, s3; + heim_general_string i[2]; + + i[0] = "foo"; + i[1] = "bar"; + + c0.strings = NULL; + tests[0].val = &c0; + + s1.val = NULL; + s1.len = 0; + c1.strings = &s1; + tests[1].val = &c1; + + s2.len = 1; + s2.val = i; + c2.strings = &s2; + tests[2].val = &c2; + + s3.len = 2; + s3.val = i; + c3.strings = &s3; + tests[3].val = &c3; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOf3), + (generic_encode)encode_TESTSeqOf3, + (generic_length)length_TESTSeqOf3, + (generic_decode)decode_TESTSeqOf3, + (generic_free)free_TESTSeqOf3, + cmp_dummy, + NULL); + return ret; +} + + +static int +test_seqof4(void) +{ + struct test_case tests[] = { + { NULL, 2, + "\x30\x00", + "seq4 0" }, + { NULL, 4, + "\x30\x02" "\xa1\x00", + "seq4 1" }, + { NULL, 8, + "\x30\x06" "\xa0\x02\x30\x00" "\xa1\x00", + "seq4 2" }, + { NULL, 2 + (2 + 0x18) + (2 + 0x27) + (2 + 0x31), + "\x30\x76" /* 2 SEQ */ + "\xa0\x18\x30\x16" /* 4 [0] SEQ */ + "\x30\x14" /* 2 SEQ */ + "\x04\x00" /* 2 OCTET-STRING */ + "\x04\x02\x01\x02" /* 4 OCTET-STRING */ + "\x02\x01\x01" /* 3 INT */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" + /* 11 INT */ + "\xa1\x27" /* 2 [1] IMPL SEQ */ + "\x30\x25" /* 2 SEQ */ + "\x02\x01\x01" /* 3 INT */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" + /* 11 INT */ + "\x02\x09\x00\x80\x00\x00\x00\x00\x00\x00\x00" + /* 11 INT */ + "\x04\x00" /* 2 OCTET-STRING */ + "\x04\x02\x01\x02" /* 4 OCTET-STRING */ + "\x04\x04\x00\x01\x02\x03" /* 6 OCTET-STRING */ + "\xa2\x31" /* 2 [2] IMPL SEQ */ + "\x30\x2f" /* 2 SEQ */ + "\x04\x00" /* 2 OCTET-STRING */ + "\x02\x01\x01" /* 3 INT */ + "\x04\x02\x01\x02" /* 4 OCTET-STRING */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xff" + /* 11 INT */ + "\x04\x04\x00\x01\x02\x03" /* 6 OCTET-STRING */ + "\x02\x09\x00\x80\x00\x00\x00\x00\x00\x00\x00" + /* 11 INT */ + "\x04\x01\x00" /* 3 OCTET-STRING */ + "\x02\x05\x01\x00\x00\x00\x00", /* 7 INT */ + "seq4 3" }, + }; + + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOf4 c[4]; + struct TESTSeqOf4_b1 b1[4]; + struct TESTSeqOf4_b2 b2[4]; + struct TESTSeqOf4_b3 b3[4]; + struct TESTSeqOf4_b1_val b1val[4]; + struct TESTSeqOf4_b2_val b2val[4]; + struct TESTSeqOf4_b3_val b3val[4]; + + c[0].b1 = NULL; + c[0].b2 = NULL; + c[0].b3 = NULL; + tests[0].val = &c[0]; + + b2[1].len = 0; + b2[1].val = NULL; + c[1].b1 = NULL; + c[1].b2 = &b2[1]; + c[1].b3 = NULL; + tests[1].val = &c[1]; + + b1[2].len = 0; + b1[2].val = NULL; + b2[2].len = 0; + b2[2].val = NULL; + c[2].b1 = &b1[2]; + c[2].b2 = &b2[2]; + c[2].b3 = NULL; + tests[2].val = &c[2]; + + b1val[3].s1.data = ""; + b1val[3].s1.length = 0; + b1val[3].u1 = 1LL; + b1val[3].s2.data = "\x01\x02"; + b1val[3].s2.length = 2; + b1val[3].u2 = -1LL; + + b2val[3].s1.data = ""; + b2val[3].s1.length = 0; + b2val[3].u1 = 1LL; + b2val[3].s2.data = "\x01\x02"; + b2val[3].s2.length = 2; + b2val[3].u2 = -1LL; + b2val[3].s3.data = "\x00\x01\x02\x03"; + b2val[3].s3.length = 4; + b2val[3].u3 = 1ULL<<63; + + b3val[3].s1.data = ""; + b3val[3].s1.length = 0; + b3val[3].u1 = 1LL; + b3val[3].s2.data = "\x01\x02"; + b3val[3].s2.length = 2; + b3val[3].u2 = -1LL; + b3val[3].s3.data = "\x00\x01\x02\x03"; + b3val[3].s3.length = 4; + b3val[3].u3 = 1ULL<<63; + b3val[3].s4.data = "\x00"; + b3val[3].s4.length = 1; + b3val[3].u4 = 1LL<<32; + + b1[3].len = 1; + b1[3].val = &b1val[3]; + b2[3].len = 1; + b2[3].val = &b2val[3]; + b3[3].len = 1; + b3[3].val = &b3val[3]; + c[3].b1 = &b1[3]; + c[3].b2 = &b2[3]; + c[3].b3 = &b3[3]; + tests[3].val = &c[3]; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOf4), + (generic_encode)encode_TESTSeqOf4, + (generic_length)length_TESTSeqOf4, + (generic_decode)decode_TESTSeqOf4, + (generic_free)free_TESTSeqOf4, + cmp_dummy, + NULL); + return ret; +} + +static int +cmp_test_seqof5 (void *a, void *b) +{ + TESTSeqOf5 *aval = a; + TESTSeqOf5 *bval = b; + + IF_OPT_COMPARE(aval, bval, outer) { + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u0); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s0); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u1); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s1); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u2); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s2); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u3); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s3); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u4); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s4); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u5); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s5); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u6); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s6); + COMPARE_INTEGER(&aval->outer->inner, &bval->outer->inner, u7); + COMPARE_OCTET_STRING(&aval->outer->inner, &bval->outer->inner, s7); + } + return 0; +} + +static int +test_seqof5(void) +{ + struct test_case tests[] = { + { NULL, 2, "\x30\x00", "seq5 0" }, + { NULL, 126, + "\x30\x7c" /* SEQ */ + "\x30\x7a" /* SEQ */ + "\x30\x78" /* SEQ */ + "\x02\x01\x01" /* INT 1 */ + "\x04\x06\x01\x01\x01\x01\x01\x01" /* "\0x1"x6 */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfe" /* INT ~1 */ + "\x04\x06\x02\x02\x02\x02\x02\x02" /* "\x02"x6 */ + "\x02\x01\x02" /* INT 2 */ + "\x04\x06\x03\x03\x03\x03\x03\x03" /* "\x03"x6 */ + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfd" /* INT ~2 */ + "\x04\x06\x04\x04\x04\x04\x04\x04" /* ... */ + "\x02\x01\x03" + "\x04\x06\x05\x05\x05\x05\x05\x05" + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfc" + "\x04\x06\x06\x06\x06\x06\x06\x06" + "\x02\x01\x04" + "\x04\x06\x07\x07\x07\x07\x07\x07" + "\x02\x09\x00\xff\xff\xff\xff\xff\xff\xff\xfb" + "\x04\x06\x08\x08\x08\x08\x08\x08", + "seq5 1" }, + }; + + int ret = 0, ntests = sizeof(tests) / sizeof(*tests); + TESTSeqOf5 c[2]; + struct TESTSeqOf5_outer outer; + struct TESTSeqOf5_outer_inner inner; + TESTuint64 u[8]; + heim_octet_string s[8]; + int i; + + c[0].outer = NULL; + tests[0].val = &c[0]; + + for (i = 0; i < 8; ++i) { + u[i] = (i&1) == 0 ? i/2+1 : ~(i/2+1); + s[i].data = memset(malloc(s[i].length = 6), i+1, 6); + } + + inner.u0 = u[0]; inner.u1 = u[1]; inner.u2 = u[2]; inner.u3 = u[3]; + inner.u4 = u[4]; inner.u5 = u[5]; inner.u6 = u[6]; inner.u7 = u[7]; + inner.s0 = s[0]; inner.s1 = s[1]; inner.s2 = s[2]; inner.s3 = s[3]; + inner.s4 = s[4]; inner.s5 = s[5]; inner.s6 = s[6]; inner.s7 = s[7]; + + outer.inner = inner; + c[1].outer = &outer; + tests[1].val = &c[1]; + + ret += generic_test (tests, ntests, sizeof(TESTSeqOf5), + (generic_encode)encode_TESTSeqOf5, + (generic_length)length_TESTSeqOf5, + (generic_decode)decode_TESTSeqOf5, + (generic_free)free_TESTSeqOf5, + cmp_test_seqof5, + NULL); + + for (i = 0; i < 8; ++i) + free(s[i].data); + + return ret; +} + +int +main(int argc, char **argv) +{ + int ret = 0; + + ret += test_uint64(); + ret += test_seqofseq(); + ret += test_seqofseq2(); + ret += test_seqof2(); + ret += test_seqof3(); + ret += test_seqof4(); + ret += test_seqof5(); + + return ret; +} diff --git a/crypto/heimdal/lib/asn1/der-private.h b/crypto/heimdal/lib/asn1/der-private.h --- a/crypto/heimdal/lib/asn1/der-private.h +++ b/crypto/heimdal/lib/asn1/der-private.h @@ -4,6 +4,20 @@ #include +int +_asn1_bmember_isset_bit ( + const void */*data*/, + unsigned int /*bit*/, + size_t /*size*/); + +void +_asn1_bmember_put_bit ( + unsigned char */*p*/, + const void */*data*/, + unsigned int /*bit*/, + size_t /*size*/, + unsigned int */*bitset*/); + int _asn1_copy ( const struct asn1_template */*t*/, @@ -42,16 +56,37 @@ const void */*data*/, size_t */*size*/); +int +_asn1_encode_fuzzer ( + const struct asn1_template */*t*/, + unsigned char */*p*/, + size_t /*len*/, + const void */*data*/, + size_t */*size*/); + void _asn1_free ( const struct asn1_template */*t*/, void */*data*/); +void +_asn1_free_top ( + const struct asn1_template */*t*/, + void */*data*/); + size_t _asn1_length ( const struct asn1_template */*t*/, const void */*data*/); +size_t +_asn1_length_fuzzer ( + const struct asn1_template */*t*/, + const void */*data*/); + +size_t +_asn1_sizeofType (const struct asn1_template */*t*/); + struct tm * _der_gmtime ( time_t /*t*/, @@ -70,9 +105,15 @@ size_t _heim_len_int (int /*val*/); +size_t +_heim_len_int64 (int64_t /*val*/); + size_t _heim_len_unsigned (unsigned /*val*/); +size_t +_heim_len_unsigned64 (uint64_t /*val*/); + int _heim_time2generalizedtime ( time_t /*t*/, diff --git a/crypto/heimdal/lib/asn1/der-protos.h b/crypto/heimdal/lib/asn1/der-protos.h --- a/crypto/heimdal/lib/asn1/der-protos.h +++ b/crypto/heimdal/lib/asn1/der-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __der_protos_h__ #define __der_protos_h__ +#ifndef DOXY #include @@ -8,6 +9,18 @@ extern "C" { #endif +int +asn1_fuzzer_done (void); + +int +asn1_fuzzer_method (const char */*mode*/); + +void +asn1_fuzzer_next (void); + +void +asn1_fuzzer_reset (void); + int copy_heim_any ( const heim_any */*from*/, @@ -67,6 +80,11 @@ const int */*from*/, int */*to*/); +int +der_copy_integer64 ( + const int64_t */*from*/, + int64_t */*to*/); + int der_copy_octet_string ( const heim_octet_string */*from*/, @@ -92,6 +110,11 @@ const unsigned */*from*/, unsigned */*to*/); +int +der_copy_unsigned64 ( + const uint64_t */*from*/, + uint64_t */*to*/); + int der_copy_utctime ( const time_t */*from*/, @@ -128,6 +151,9 @@ void der_free_integer (int */*i*/); +void +der_free_integer64 (int64_t */*i*/); + void der_free_octet_string (heim_octet_string */*k*/); @@ -143,6 +169,9 @@ void der_free_unsigned (unsigned */*u*/); +void +der_free_unsigned64 (uint64_t */*u*/); + void der_free_utctime (time_t */*t*/); @@ -214,6 +243,13 @@ int */*ret*/, size_t */*size*/); +int +der_get_integer64 ( + const unsigned char */*p*/, + size_t /*len*/, + int64_t */*ret*/, + size_t */*size*/); + int der_get_length ( const unsigned char */*p*/, @@ -253,7 +289,7 @@ der_get_tag ( const unsigned char */*p*/, size_t /*len*/, - Der_class */*class*/, + Der_class */*cls*/, Der_type */*type*/, unsigned int */*tag*/, size_t */*size*/); @@ -284,6 +320,13 @@ unsigned */*ret*/, size_t */*size*/); +int +der_get_unsigned64 ( + const unsigned char */*p*/, + size_t /*len*/, + uint64_t */*ret*/, + size_t */*size*/); + int der_get_utctime ( const unsigned char */*p*/, @@ -367,6 +410,9 @@ size_t der_length_integer (const int */*data*/); +size_t +der_length_integer64 (const int64_t */*data*/); + size_t der_length_len (size_t /*len*/); @@ -388,6 +434,9 @@ size_t der_length_unsigned (const unsigned */*data*/); +size_t +der_length_unsigned64 (const uint64_t */*data*/); + size_t der_length_utctime (const time_t */*t*/); @@ -401,7 +450,7 @@ der_match_tag ( const unsigned char */*p*/, size_t /*len*/, - Der_class /*class*/, + Der_class /*cls*/, Der_type /*type*/, unsigned int /*tag*/, size_t */*size*/); @@ -410,7 +459,7 @@ der_match_tag2 ( const unsigned char */*p*/, size_t /*len*/, - Der_class /*class*/, + Der_class /*cls*/, Der_type */*type*/, unsigned int /*tag*/, size_t */*size*/); @@ -419,7 +468,7 @@ der_match_tag_and_length ( const unsigned char */*p*/, size_t /*len*/, - Der_class /*class*/, + Der_class /*cls*/, Der_type */*type*/, unsigned int /*tag*/, size_t */*length_ret*/, @@ -508,6 +557,13 @@ const int */*v*/, size_t */*size*/); +int +der_put_integer64 ( + unsigned char */*p*/, + size_t /*len*/, + const int64_t */*v*/, + size_t */*size*/); + int der_put_length ( unsigned char */*p*/, @@ -569,6 +625,13 @@ const unsigned */*v*/, size_t */*size*/); +int +der_put_unsigned64 ( + unsigned char */*p*/, + size_t /*len*/, + const uint64_t */*v*/, + size_t */*size*/); + int der_put_utctime ( unsigned char */*p*/, @@ -625,4 +688,5 @@ } #endif +#endif /* DOXY */ #endif /* __der_protos_h__ */ diff --git a/crypto/heimdal/lib/asn1/der.h b/crypto/heimdal/lib/asn1/der.h --- a/crypto/heimdal/lib/asn1/der.h +++ b/crypto/heimdal/lib/asn1/der.h @@ -36,6 +36,8 @@ #ifndef __DER_H__ #define __DER_H__ +#include + typedef enum { ASN1_C_UNIV = 0, ASN1_C_APPL = 1, diff --git a/crypto/heimdal/lib/asn1/der_cmp.c b/crypto/heimdal/lib/asn1/der_cmp.c --- a/crypto/heimdal/lib/asn1/der_cmp.c +++ b/crypto/heimdal/lib/asn1/der_cmp.c @@ -37,7 +37,7 @@ der_heim_oid_cmp(const heim_oid *p, const heim_oid *q) { if (p->length != q->length) - return p->length - q->length; + return (int)(p->length - q->length); return memcmp(p->components, q->components, p->length * sizeof(*p->components)); @@ -48,7 +48,7 @@ const heim_octet_string *q) { if (p->length != q->length) - return p->length - q->length; + return (int)(p->length - q->length); return memcmp(p->data, q->data, p->length); } @@ -70,12 +70,16 @@ der_heim_bit_string_cmp(const heim_bit_string *p, const heim_bit_string *q) { - int i, r1, r2; + int r1, r2; + size_t i; if (p->length != q->length) - return p->length - q->length; - i = memcmp(p->data, q->data, p->length / 8); - if (i) - return i; + return (int)(p->length - q->length); + if (q->length) + i = memcmp(p->data, q->data, p->length / 8); + else + i = 0; + if (i != 0) + return (int)i; if ((p->length % 8) == 0) return 0; i = (p->length / 8); @@ -94,7 +98,7 @@ if (p->negative != q->negative) return q->negative - p->negative; if (p->length != q->length) - return p->length - q->length; + return (int)(p->length - q->length); return memcmp(p->data, q->data, p->length); } @@ -102,7 +106,7 @@ der_heim_bmp_string_cmp(const heim_bmp_string *p, const heim_bmp_string *q) { if (p->length != q->length) - return p->length - q->length; + return (int)(p->length - q->length); return memcmp(p->data, q->data, q->length * sizeof(q->data[0])); } @@ -111,6 +115,6 @@ const heim_universal_string *q) { if (p->length != q->length) - return p->length - q->length; + return (int)(p->length - q->length); return memcmp(p->data, q->data, q->length * sizeof(q->data[0])); } diff --git a/crypto/heimdal/lib/asn1/der_copy.c b/crypto/heimdal/lib/asn1/der_copy.c --- a/crypto/heimdal/lib/asn1/der_copy.c +++ b/crypto/heimdal/lib/asn1/der_copy.c @@ -54,6 +54,13 @@ return 0; } +int +der_copy_integer64 (const int64_t *from, int64_t *to) +{ + *to = *from; + return 0; +} + int der_copy_unsigned (const unsigned *from, unsigned *to) { @@ -61,6 +68,13 @@ return 0; } +int +der_copy_unsigned64 (const uint64_t *from, uint64_t *to) +{ + *to = *from; + return 0; +} + int der_copy_generalized_time (const time_t *from, time_t *to) { diff --git a/crypto/heimdal/lib/asn1/der_format.c b/crypto/heimdal/lib/asn1/der_format.c --- a/crypto/heimdal/lib/asn1/der_format.c +++ b/crypto/heimdal/lib/asn1/der_format.c @@ -163,7 +163,7 @@ free(s); return EINVAL; } - data->components[data->length++] = l; + data->components[data->length++] = (unsigned int)l; } free(s); return 0; diff --git a/crypto/heimdal/lib/asn1/der_free.c b/crypto/heimdal/lib/asn1/der_free.c --- a/crypto/heimdal/lib/asn1/der_free.c +++ b/crypto/heimdal/lib/asn1/der_free.c @@ -50,12 +50,24 @@ *i = 0; } +void +der_free_integer64 (int64_t *i) +{ + *i = 0; +} + void der_free_unsigned (unsigned *u) { *u = 0; } +void +der_free_unsigned64 (uint64_t *u) +{ + *u = 0; +} + void der_free_generalized_time(time_t *t) { diff --git a/crypto/heimdal/lib/asn1/der_get.c b/crypto/heimdal/lib/asn1/der_get.c --- a/crypto/heimdal/lib/asn1/der_get.c +++ b/crypto/heimdal/lib/asn1/der_get.c @@ -48,9 +48,28 @@ unsigned val = 0; size_t oldlen = len; - if (len == sizeof(unsigned) + 1 && p[0] == 0) + if (len == sizeof(val) + 1 && p[0] == 0) ; - else if (len > sizeof(unsigned)) + else if (len > sizeof(val)) + return ASN1_OVERRUN; + + while (len--) + val = val * 256 + *p++; + *ret = val; + if(size) *size = oldlen; + return 0; +} + +int +der_get_unsigned64 (const unsigned char *p, size_t len, + uint64_t *ret, size_t *size) +{ + uint64_t val = 0; + size_t oldlen = len; + + if (len == sizeof(val) + 1 && p[0] == 0) + ; + else if (len > sizeof(val)) return ASN1_OVERRUN; while (len--) @@ -67,9 +86,12 @@ int val = 0; size_t oldlen = len; - if (len > sizeof(int)) + if (len == sizeof(val) + 1 && (p[0] == 0 || p[0] == 0xff)) + ; + else if (len > sizeof(val)) return ASN1_OVERRUN; + /* We assume we're on a twos-complement platform */ if (len > 0) { val = (signed char)*p++; while (--len) @@ -80,6 +102,28 @@ return 0; } +int +der_get_integer64 (const unsigned char *p, size_t len, + int64_t *ret, size_t *size) +{ + int64_t val = 0; + size_t oldlen = len; + + if (len > sizeof(val)) + return ASN1_OVERRUN; + + /* We assume we're on a twos-complement platform */ + if (len > 0) { + val = (signed char)*p++; + while (--len) + val = val * 256 + *p++; + } + *ret = val; + if(size) *size = oldlen; + return 0; +} + + int der_get_length (const unsigned char *p, size_t len, size_t *val, size_t *size) @@ -143,18 +187,22 @@ */ while ((size_t)(p1 - p) < len && *p1 == '\0') p1++; - if ((size_t)(p1 - p) != len) + if ((size_t)(p1 - p) != len) { + *str = NULL; return ASN1_BAD_CHARACTER; + } } - if (len > len + 1) + if (len == SIZE_MAX) { + *str = NULL; return ASN1_BAD_LENGTH; + } - s = malloc (len + 1); + *str = s = malloc (len + 1); if (s == NULL) return ENOMEM; memcpy (s, p, len); s[len] = '\0'; - *str = s; + if(size) *size = len; return 0; } @@ -166,14 +214,23 @@ return der_get_general_string(p, len, str, size); } +#define gen_data_zero(_data) \ + do { (_data)->length = 0; (_data)->data = NULL; } while(0) + int der_get_printable_string(const unsigned char *p, size_t len, heim_printable_string *str, size_t *size) { + if (len == SIZE_MAX) { + gen_data_zero(str); + return ASN1_BAD_LENGTH; + } str->length = len; str->data = malloc(len + 1); - if (str->data == NULL) + if (str->data == NULL) { + gen_data_zero(str); return ENOMEM; + } memcpy(str->data, p, len); ((char *)str->data)[len] = '\0'; if(size) *size = len; @@ -193,14 +250,20 @@ { size_t i; - if (len & 1) + if (len & 1) { + gen_data_zero(data); return ASN1_BAD_FORMAT; + } data->length = len / 2; - if (data->length > UINT_MAX/sizeof(data->data[0])) + if (data->length > UINT_MAX/sizeof(data->data[0])) { + gen_data_zero(data); return ERANGE; + } data->data = malloc(data->length * sizeof(data->data[0])); - if (data->data == NULL && data->length != 0) + if (data->data == NULL && data->length != 0) { + gen_data_zero(data); return ENOMEM; + } for (i = 0; i < data->length; i++) { data->data[i] = (p[0] << 8) | p[1]; @@ -208,8 +271,7 @@ /* check for NUL in the middle of the string */ if (data->data[i] == 0 && i != (data->length - 1)) { free(data->data); - data->data = NULL; - data->length = 0; + gen_data_zero(data); return ASN1_BAD_CHARACTER; } } @@ -224,14 +286,20 @@ { size_t i; - if (len & 3) + if (len & 3) { + gen_data_zero(data); return ASN1_BAD_FORMAT; + } data->length = len / 4; - if (data->length > UINT_MAX/sizeof(data->data[0])) + if (data->length > UINT_MAX/sizeof(data->data[0])) { + gen_data_zero(data); return ERANGE; + } data->data = malloc(data->length * sizeof(data->data[0])); - if (data->data == NULL && data->length != 0) + if (data->data == NULL && data->length != 0) { + gen_data_zero(data); return ENOMEM; + } for (i = 0; i < data->length; i++) { data->data[i] = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]; @@ -239,8 +307,7 @@ /* check for NUL in the middle of the string */ if (data->data[i] == 0 && i != (data->length - 1)) { free(data->data); - data->data = NULL; - data->length = 0; + gen_data_zero(data); return ASN1_BAD_CHARACTER; } } @@ -274,7 +341,7 @@ { int e; Der_type type; - Der_class class; + Der_class cls; unsigned int tag, depth = 0; size_t l, datalen, oldlen = len; @@ -282,9 +349,9 @@ data->data = NULL; while (len) { - e = der_get_tag (p, len, &class, &type, &tag, &l); + e = der_get_tag (p, len, &cls, &type, &tag, &l); if (e) goto out; - if (class != ASN1_C_UNIV) { + if (cls != ASN1_C_UNIV) { e = ASN1_BAD_ID; goto out; } @@ -353,13 +420,45 @@ if (p[0] & 0x80) { unsigned char *q; int carry = 1; - data->negative = 1; + + /* + * A negative number. It's going to be a twos complement byte array. + * We're going to leave the positive value in `data->data', but set the + * `data->negative' flag. That means we need to negate the + * twos-complement integer received. + */ + data->negative = 1; data->length = len; if (p[0] == 0xff) { + if (data->length == 1) { + /* One byte of all ones == -1 */ + q = data->data = malloc(1); + *q = 1; + data->length = 1; + if (size) + *size = 1; + return 0; + } + p++; data->length--; + + /* + * We could check if the next byte's high bit is set, which would + * be an error ("illegal padding" in OpenSSL). However, this would + * mean failing to accept certificates made by certain CAs that + * would read 8 bytes of RNG into a buffer, slap on length 8, then + * slap on the tag [UNIVERSAL INTEGER], and make that the + * serialNumber field's encoding, which then fails to parse in + * around 1 in 256 certificates. + * + * So let's not. + * + * if (p[0] & 0x80) + * return ASN1_PARSE_ERROR; // or a new error code + */ } data->data = malloc(data->length); if (data->data == NULL) { @@ -368,9 +467,17 @@ *size = 0; return ENOMEM; } + + /* + * Note that if `data->length' were zero, this would be UB because we + * underflow if data->length is zero even though we wouldn't actually + * dereference the byte before data->data. Thus we check above for + * that. + */ q = &((unsigned char*)data->data)[data->length - 1]; p += data->length - 1; while (q >= (unsigned char*)data->data) { + /* *p XOR 0xff -> ~*p; we're dealing with twos complement */ *q = *p ^ 0xff; if (carry) carry = !++*q; @@ -430,7 +537,7 @@ char *times; int e; - if (len > len + 1 || len == 0) + if (len == SIZE_MAX || len == 0) return ASN1_BAD_LENGTH; times = malloc(len + 1); @@ -468,7 +575,7 @@ if (len < 1) return ASN1_OVERRUN; - if (len > len + 1) + if (len == SIZE_MAX) return ASN1_BAD_LENGTH; if (len + 1 > UINT_MAX/sizeof(data->components[0])) @@ -508,13 +615,13 @@ int der_get_tag (const unsigned char *p, size_t len, - Der_class *class, Der_type *type, + Der_class *cls, Der_type *type, unsigned int *tag, size_t *size) { size_t ret = 0; if (len < 1) return ASN1_OVERRUN; - *class = (Der_class)(((*p) >> 6) & 0x03); + *cls = (Der_class)(((*p) >> 6) & 0x03); *type = (Der_type)(((*p) >> 5) & 0x01); *tag = (*p) & 0x1f; p++; len--; ret++; @@ -540,13 +647,13 @@ int der_match_tag (const unsigned char *p, size_t len, - Der_class class, Der_type type, + Der_class cls, Der_type type, unsigned int tag, size_t *size) { Der_type thistype; int e; - e = der_match_tag2(p, len, class, &thistype, tag, size); + e = der_match_tag2(p, len, cls, &thistype, tag, size); if (e) return e; if (thistype != type) return ASN1_BAD_ID; return 0; @@ -554,7 +661,7 @@ int der_match_tag2 (const unsigned char *p, size_t len, - Der_class class, Der_type *type, + Der_class cls, Der_type *type, unsigned int tag, size_t *size) { size_t l; @@ -564,7 +671,7 @@ e = der_get_tag (p, len, &thisclass, type, &thistag, &l); if (e) return e; - if (class != thisclass) + if (cls != thisclass) return ASN1_BAD_ID; if(tag > thistag) return ASN1_MISPLACED_FIELD; @@ -576,13 +683,13 @@ int der_match_tag_and_length (const unsigned char *p, size_t len, - Der_class class, Der_type *type, unsigned int tag, + Der_class cls, Der_type *type, unsigned int tag, size_t *length_ret, size_t *size) { size_t l, ret = 0; int e; - e = der_match_tag2 (p, len, class, type, tag, &l); + e = der_match_tag2 (p, len, cls, type, tag, &l); if (e) return e; p += l; len -= l; @@ -633,14 +740,19 @@ * any of them will cause a interger overrun */ if ((len - 1) >> (sizeof(len) * 8 - 3)) return ASN1_OVERRUN; - data->length = (len - 1) * 8; - data->data = malloc(len - 1); - if (data->data == NULL && (len - 1) != 0) - return ENOMEM; - /* copy data is there is data to copy */ - if (len - 1 != 0) { - memcpy (data->data, p + 1, len - 1); - data->length -= p[0]; + /* + * If there is data to copy, do that now. + */ + if (len - 1 > 0) { + data->length = (len - 1) * 8; + data->data = malloc(len - 1); + if (data->data == NULL) + return ENOMEM; + memcpy (data->data, p + 1, len - 1); + data->length -= p[0]; + } else { + data->data = NULL; + data->length = 0; } if(size) *size = len; return 0; diff --git a/crypto/heimdal/lib/asn1/der_length.c b/crypto/heimdal/lib/asn1/der_length.c --- a/crypto/heimdal/lib/asn1/der_length.c +++ b/crypto/heimdal/lib/asn1/der_length.c @@ -55,6 +55,24 @@ return ret; } +size_t +_heim_len_unsigned64 (uint64_t val) +{ + size_t ret = 0; + int last_val_gt_128; + + do { + ++ret; + last_val_gt_128 = (val >= 128); + val /= 256; + } while (val); + + if(last_val_gt_128) + ret++; + + return ret; +} + size_t _heim_len_int (int val) { @@ -82,6 +100,33 @@ return ret; } +size_t +_heim_len_int64 (int64_t val) +{ + unsigned char q; + size_t ret = 0; + + if (val >= 0) { + do { + q = val % 256; + ret++; + val /= 256; + } while(val); + if(q >= 128) + ret++; + } else { + val = ~val; + do { + q = ~(val % 256); + ret++; + val /= 256; + } while(val); + if(q < 128) + ret++; + } + return ret; +} + static size_t len_oid (const heim_oid *oid) { @@ -134,12 +179,24 @@ return _heim_len_int (*data); } +size_t +der_length_integer64 (const int64_t *data) +{ + return _heim_len_int64 (*data); +} + size_t der_length_unsigned (const unsigned *data) { return _heim_len_unsigned(*data); } +size_t +der_length_unsigned64 (const uint64_t *data) +{ + return _heim_len_unsigned64(*data); +} + size_t der_length_enumerated (const unsigned *data) { @@ -199,7 +256,9 @@ { if (k->length == 0) return 1; - if (k->negative) + if (k->negative && k->length == 1 && ((unsigned char *)k->data)[0] == 1) + return 1; + else if (k->negative) return k->length + (((~(((unsigned char *)k->data)[0])) & 0x80) ? 0 : 1); else return k->length + ((((unsigned char *)k->data)[0] & 0x80) ? 1 : 0); diff --git a/crypto/heimdal/lib/asn1/der_put.c b/crypto/heimdal/lib/asn1/der_put.c --- a/crypto/heimdal/lib/asn1/der_put.c +++ b/crypto/heimdal/lib/asn1/der_put.c @@ -75,6 +75,38 @@ } } +int +der_put_unsigned64 (unsigned char *p, size_t len, const uint64_t *v, size_t *size) +{ + unsigned char *base = p; + uint64_t val = *v; + + if (val) { + while (len > 0 && val) { + *p-- = val % 256; + val /= 256; + --len; + } + if (val != 0) + return ASN1_OVERFLOW; + else { + if(p[1] >= 128) { + if(len < 1) + return ASN1_OVERFLOW; + *p-- = 0; + } + *size = base - p; + return 0; + } + } else if (len < 1) + return ASN1_OVERFLOW; + else { + *p = 0; + *size = 1; + return 0; + } +} + int der_put_integer (unsigned char *p, size_t len, const int *v, size_t *size) { @@ -115,6 +147,46 @@ return 0; } +int +der_put_integer64 (unsigned char *p, size_t len, const int64_t *v, size_t *size) +{ + unsigned char *base = p; + int64_t val = *v; + + if(val >= 0) { + do { + if(len < 1) + return ASN1_OVERFLOW; + *p-- = val % 256; + len--; + val /= 256; + } while(val); + if(p[1] >= 128) { + if(len < 1) + return ASN1_OVERFLOW; + *p-- = 0; + len--; + } + } else { + val = ~val; + do { + if(len < 1) + return ASN1_OVERFLOW; + *p-- = ~(val % 256); + len--; + val /= 256; + } while(val); + if(p[1] < 128) { + if(len < 1) + return ASN1_OVERFLOW; + *p-- = 0xff; + len--; + } + } + *size = base - p; + return 0; +} + int der_put_length (unsigned char *p, size_t len, size_t val, size_t *size) @@ -241,7 +313,8 @@ if (len < data->length) return ASN1_OVERFLOW; p -= data->length; - memcpy (p+1, data->data, data->length); + if (data->length) + memcpy(p+1, data->data, data->length); *size = data->length; return 0; } @@ -267,20 +340,32 @@ len -= data->length; if (data->negative) { - int i, carry; - for (i = data->length - 1, carry = 1; i >= 0; i--) { - *p = buf[i] ^ 0xff; - if (carry) - carry = !++*p; - p--; - } - if (p[1] < 128) { - if (len < 1) - return ASN1_OVERFLOW; - *p-- = 0xff; - len--; - hibitset = 1; - } + ssize_t i; + int carry; + + /* + * We represent the parsed integer as a positive value with a + * negativity flag. But we need to put it on the wire as the shortest + * twos-complement byte sequence possible. So we're going to negate + * the number as go. + */ + if (data->length == 1 && *(unsigned char *)data->data == 1) { + *(p--) = 0xff; + } else { + for (i = data->length - 1, carry = 1; i >= 0; i--) { + *p = buf[i] ^ 0xff; + if (carry) + carry = !++*p; + p--; + } + if (p[1] < 128) { + if (len < 1) + return ASN1_OVERFLOW; + *p-- = 0xff; + len--; + hibitset = 1; + } + } } else { p -= data->length; memcpy(p + 1, buf, data->length); @@ -343,7 +428,7 @@ const heim_oid *data, size_t *size) { unsigned char *base = p; - int n; + size_t n; for (n = data->length - 1; n >= 2; --n) { unsigned u = data->components[n]; @@ -429,12 +514,14 @@ struct tm tm; const size_t len = gtimep ? 15 : 13; + s->data = NULL; + s->length = 0; + if (_der_gmtime(t, &tm) == NULL) + return ASN1_BAD_TIMEFORMAT; s->data = malloc(len + 1); if (s->data == NULL) return ENOMEM; s->length = len; - if (_der_gmtime(t, &tm) == NULL) - return ASN1_BAD_TIMEFORMAT; if (gtimep) snprintf (s->data, len + 1, "%04d%02d%02d%02d%02d%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, @@ -468,12 +555,12 @@ int _heim_der_set_sort(const void *a1, const void *a2) { - const struct heim_octet_string *s1 = a1, *s2 = a2; + const heim_octet_string *s1 = a1, *s2 = a2; int ret; ret = memcmp(s1->data, s2->data, s1->length < s2->length ? s1->length : s2->length); if(ret) return ret; - return s1->length - s2->length; + return (int)(s1->length - s2->length); } diff --git a/crypto/heimdal/lib/asn1/digest.asn1 b/crypto/heimdal/lib/asn1/digest.asn1 --- a/crypto/heimdal/lib/asn1/digest.asn1 +++ b/crypto/heimdal/lib/asn1/digest.asn1 @@ -24,7 +24,7 @@ } DigestInitReply ::= SEQUENCE { - nonce UTF8String, -- service nonce/challange + nonce UTF8String, -- service nonce/challenge opaque UTF8String, -- server state identifier [0] UTF8String OPTIONAL } @@ -78,7 +78,7 @@ flags [0] INTEGER (0..4294967295), opaque [1] OCTET STRING, targetname [2] UTF8String, - challange [3] OCTET STRING, + challenge [3] OCTET STRING, targetinfo [4] OCTET STRING OPTIONAL } diff --git a/crypto/heimdal/lib/asn1/fuzzer.c b/crypto/heimdal/lib/asn1/fuzzer.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/fuzzer.c @@ -0,0 +1,742 @@ +/* + * Copyright (c) 2009 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 - 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "der_locl.h" +#include + +enum trigger_method { FOFF, FRANDOM, FLINEAR, FLINEAR_SIZE }; + +#ifdef ASN1_FUZZER +static enum trigger_method method = FOFF; + +/* FLINEAR */ +static unsigned long fnum, fcur, fsize; +#endif + +int +asn1_fuzzer_method(const char *mode) +{ +#ifdef ASN1_FUZZER + if (mode == NULL || strcasecmp(mode, "off") == 0) { + method = FOFF; + } else if (strcasecmp(mode, "random") == 0) { + method = FRANDOM; + } else if (strcasecmp(mode, "linear") == 0) { + method = FLINEAR; + } else if (strcasecmp(mode, "linear-size") == 0) { + method = FLINEAR_SIZE; + } else + return 1; + return 0; +#else + return 1; +#endif +} + +void +asn1_fuzzer_reset(void) +{ +#ifdef ASN1_FUZZER + fcur = 0; + fsize = 0; + fnum = 0; +#endif +} + +void +asn1_fuzzer_next(void) +{ +#ifdef ASN1_FUZZER + fcur = 0; + fsize = 0; + fnum++; +#endif +} + +int +asn1_fuzzer_done(void) +{ +#ifndef ASN1_FUZZER + abort(); +#else + /* since code paths */ + return (fnum > 10000); +#endif +} + +#ifdef ASN1_FUZZER + +static int +fuzzer_trigger(unsigned int chance) +{ + switch(method) { + case FOFF: + return 0; + case FRANDOM: + if ((rk_random() % chance) != 1) + return 0; + return 1; + case FLINEAR: + if (fnum == fcur++) + return 1; + return 0; + case FLINEAR_SIZE: + return 0; + } + return 0; +} + +static int +fuzzer_size_trigger(unsigned long *cur) +{ + if (method != FLINEAR_SIZE) + return 0; + if (fnum == (*cur)++) + return 1; + return 0; +} + +static size_t +fuzzer_length_len (size_t len) +{ + if (fuzzer_size_trigger(&fsize)) { + len = 0; + } else if (fuzzer_size_trigger(&fsize)) { + len = 129; + } else if (fuzzer_size_trigger(&fsize)) { + len = 0xffff; + } + + if (len < 128) + return 1; + else { + int ret = 0; + do { + ++ret; + len /= 256; + } while (len); + return ret + 1; + } +} + +static int +fuzzer_put_length (unsigned char *p, size_t len, size_t val, size_t *size) +{ + if (len < 1) + return ASN1_OVERFLOW; + + if (fuzzer_size_trigger(&fcur)) { + val = 0; + } else if (fuzzer_size_trigger(&fcur)) { + val = 129; + } else if (fuzzer_size_trigger(&fcur)) { + val = 0xffff; + } + + if (val < 128) { + *p = val; + *size = 1; + } else { + size_t l = 0; + + while(val > 0) { + if(len < 2) + return ASN1_OVERFLOW; + *p-- = val % 256; + val /= 256; + len--; + l++; + } + *p = 0x80 | l; + if(size) + *size = l + 1; + } + return 0; +} + +static int +fuzzer_put_tag (unsigned char *p, size_t len, Der_class class, Der_type type, + unsigned int tag, size_t *size) +{ + unsigned fcont = 0; + + if (tag <= 30) { + if (len < 1) + return ASN1_OVERFLOW; + if (fuzzer_trigger(100)) + *p = MAKE_TAG(class, type, 0x1f); + else + *p = MAKE_TAG(class, type, tag); + *size = 1; + } else { + size_t ret = 0; + unsigned int continuation = 0; + + do { + if (len < 1) + return ASN1_OVERFLOW; + *p-- = tag % 128 | continuation; + len--; + ret++; + tag /= 128; + continuation = 0x80; + } while(tag > 0); + if (len < 1) + return ASN1_OVERFLOW; + if (fuzzer_trigger(100)) + *p-- = MAKE_TAG(class, type, 0); + else + *p-- = MAKE_TAG(class, type, 0x1f); + ret++; + *size = ret; + } + return 0; +} + +static int +fuzzer_put_length_and_tag (unsigned char *p, size_t len, size_t len_val, + Der_class class, Der_type type, + unsigned int tag, size_t *size) +{ + size_t ret = 0; + size_t l; + int e; + + e = fuzzer_put_length (p, len, len_val, &l); + if(e) + return e; + p -= l; + len -= l; + ret += l; + e = fuzzer_put_tag (p, len, class, type, tag, &l); + if(e) + return e; + + ret += l; + *size = ret; + return 0; +} + +static int +fuzzer_put_general_string (unsigned char *p, size_t len, + const heim_general_string *str, size_t *size) +{ + size_t slen = strlen(*str); + + if (len < slen) + return ASN1_OVERFLOW; + p -= slen; + if (slen >= 2 && fuzzer_trigger(100)) { + memcpy(p+1, *str, slen); + memcpy(p+1, "%s", 2); + } else if (slen >= 2 && fuzzer_trigger(100)) { + memcpy(p+1, *str, slen); + memcpy(p+1, "%n", 2); + } else if (slen >= 4 && fuzzer_trigger(100)) { + memcpy(p+1, *str, slen); + memcpy(p+1, "%10n", 4); + } else if (slen >= 10 && fuzzer_trigger(100)) { + memcpy(p+1, *str, slen); + memcpy(p+1, "%n%n%n%n%n", 10); + } else if (slen >= 10 && fuzzer_trigger(100)) { + memcpy(p+1, *str, slen); + memcpy(p+1, "%n%p%s%d%x", 10); + } else if (slen >= 7 && fuzzer_trigger(100)) { + memcpy(p+1, *str, slen); + memcpy(p+1, "%.1024d", 7); + } else if (slen >= 7 && fuzzer_trigger(100)) { + memcpy(p+1, *str, slen); + memcpy(p+1, "%.2049d", 7); + } else if (fuzzer_trigger(100)) { + memset(p+1, 0, slen); + } else if (fuzzer_trigger(100)) { + memset(p+1, 0xff, slen); + } else if (fuzzer_trigger(100)) { + memset(p+1, 'A', slen); + } else { + memcpy(p+1, *str, slen); + } + *size = slen; + return 0; +} + + +struct asn1_type_func fuzzerprim[A1T_NUM_ENTRY] = { +#define fuzel(name, type) { \ + (asn1_type_encode)fuzzer_put_##name, \ + (asn1_type_decode)der_get_##name, \ + (asn1_type_length)der_length_##name, \ + (asn1_type_copy)der_copy_##name, \ + (asn1_type_release)der_free_##name, \ + sizeof(type) \ + } +#define el(name, type) { \ + (asn1_type_encode)der_put_##name, \ + (asn1_type_decode)der_get_##name, \ + (asn1_type_length)der_length_##name, \ + (asn1_type_copy)der_copy_##name, \ + (asn1_type_release)der_free_##name, \ + sizeof(type) \ + } +#define elber(name, type) { \ + (asn1_type_encode)der_put_##name, \ + (asn1_type_decode)der_get_##name##_ber, \ + (asn1_type_length)der_length_##name, \ + (asn1_type_copy)der_copy_##name, \ + (asn1_type_release)der_free_##name, \ + sizeof(type) \ + } + el(integer, int), + el(integer64, int64_t), + el(heim_integer, heim_integer), + el(integer, int), + el(unsigned, unsigned), + el(uninteger64, uint64_t), + fuzel(general_string, heim_general_string), + el(octet_string, heim_octet_string), + elber(octet_string, heim_octet_string), + el(ia5_string, heim_ia5_string), + el(bmp_string, heim_bmp_string), + el(universal_string, heim_universal_string), + el(printable_string, heim_printable_string), + el(visible_string, heim_visible_string), + el(utf8string, heim_utf8_string), + el(generalized_time, time_t), + el(utctime, time_t), + el(bit_string, heim_bit_string), + { (asn1_type_encode)der_put_boolean, (asn1_type_decode)der_get_boolean, + (asn1_type_length)der_length_boolean, (asn1_type_copy)der_copy_integer, + (asn1_type_release)der_free_integer, sizeof(int) + }, + el(oid, heim_oid), + el(general_string, heim_general_string), +#undef fuzel +#undef el +#undef elber +}; + + + +int +_asn1_encode_fuzzer(const struct asn1_template *t, + unsigned char *p, size_t len, + const void *data, size_t *size) +{ + size_t elements = A1_HEADER_LEN(t); + int ret = 0; + size_t oldlen = len; + + t += A1_HEADER_LEN(t); + + while (elements) { + switch (t->tt & A1_OP_MASK) { + case A1_OP_TYPE: + case A1_OP_TYPE_EXTERN: { + size_t newsize; + const void *el = DPOC(data, t->offset); + + if (t->tt & A1_FLAG_OPTIONAL) { + void **pel = (void **)el; + if (*pel == NULL) + break; + el = *pel; + } + + if ((t->tt & A1_OP_MASK) == A1_OP_TYPE) { + ret = _asn1_encode_fuzzer(t->ptr, p, len, el, &newsize); + } else { + const struct asn1_type_func *f = t->ptr; + ret = (f->encode)(p, len, el, &newsize); + } + + if (ret) + return ret; + p -= newsize; len -= newsize; + + break; + } + case A1_OP_TAG: { + const void *olddata = data; + size_t l, datalen; + + data = DPOC(data, t->offset); + + if (t->tt & A1_FLAG_OPTIONAL) { + void **el = (void **)data; + if (*el == NULL) { + data = olddata; + break; + } + data = *el; + } + + ret = _asn1_encode_fuzzer(t->ptr, p, len, data, &datalen); + if (ret) + return ret; + + len -= datalen; p -= datalen; + + ret = fuzzer_put_length_and_tag(p, len, datalen, + A1_TAG_CLASS(t->tt), + A1_TAG_TYPE(t->tt), + A1_TAG_TAG(t->tt), &l); + if (ret) + return ret; + + p -= l; len -= l; + + data = olddata; + + break; + } + case A1_OP_PARSE: { + unsigned int type = A1_PARSE_TYPE(t->tt); + size_t newsize; + const void *el = DPOC(data, t->offset); + + if (type > sizeof(fuzzerprim)/sizeof(fuzzerprim[0])) { + ABORT_ON_ERROR(); + return ASN1_PARSE_ERROR; + } + + ret = (fuzzerprim[type].encode)(p, len, el, &newsize); + if (ret) + return ret; + p -= newsize; len -= newsize; + + break; + } + case A1_OP_SETOF: { + const struct template_of *el = DPOC(data, t->offset); + size_t ellen = _asn1_sizeofType(t->ptr); + heim_octet_string *val; + unsigned char *elptr = el->val; + size_t i, totallen; + + if (el->len == 0) + break; + + if (el->len > UINT_MAX/sizeof(val[0])) + return ERANGE; + + val = malloc(sizeof(val[0]) * el->len); + if (val == NULL) + return ENOMEM; + + for(totallen = 0, i = 0; i < el->len; i++) { + unsigned char *next; + size_t l; + + val[i].length = _asn1_length(t->ptr, elptr); + val[i].data = malloc(val[i].length); + + ret = _asn1_encode_fuzzer(t->ptr, DPO(val[i].data, val[i].length - 1), + val[i].length, elptr, &l); + if (ret) + break; + + next = elptr + ellen; + if (next < elptr) { + ret = ASN1_OVERFLOW; + break; + } + elptr = next; + totallen += val[i].length; + } + if (ret == 0 && totallen > len) + ret = ASN1_OVERFLOW; + if (ret) { + do { + free(val[i].data); + } while(i-- > 0); + free(val); + return ret; + } + + len -= totallen; + + qsort(val, el->len, sizeof(val[0]), _heim_der_set_sort); + + i = el->len - 1; + do { + p -= val[i].length; + memcpy(p + 1, val[i].data, val[i].length); + free(val[i].data); + } while(i-- > 0); + free(val); + + break; + + } + case A1_OP_SEQOF: { + struct template_of *el = DPO(data, t->offset); + size_t ellen = _asn1_sizeofType(t->ptr); + size_t newsize; + unsigned int i; + unsigned char *elptr = el->val; + + if (el->len == 0) + break; + + elptr += ellen * (el->len - 1); + + for (i = 0; i < el->len; i++) { + ret = _asn1_encode_fuzzer(t->ptr, p, len, + elptr, + &newsize); + if (ret) + return ret; + p -= newsize; len -= newsize; + elptr -= ellen; + } + + break; + } + case A1_OP_BMEMBER: { + const struct asn1_template *bmember = t->ptr; + size_t size = bmember->offset; + size_t elements = A1_HEADER_LEN(bmember); + size_t pos; + unsigned char c = 0; + unsigned int bitset = 0; + int rfc1510 = (bmember->tt & A1_HBF_RFC1510); + + bmember += elements; + + if (rfc1510) + pos = 31; + else + pos = bmember->offset; + + while (elements && len) { + while (bmember->offset / 8 < pos / 8) { + if (rfc1510 || bitset || c) { + if (len < 1) + return ASN1_OVERFLOW; + *p-- = c; len--; + } + c = 0; + pos -= 8; + } + _asn1_bmember_put_bit(&c, data, bmember->offset, size, &bitset); + elements--; bmember--; + } + if (rfc1510 || bitset) { + if (len < 1) + return ASN1_OVERFLOW; + *p-- = c; len--; + } + + if (len < 1) + return ASN1_OVERFLOW; + if (rfc1510 || bitset == 0) + *p-- = 0; + else + *p-- = bitset - 1; + + len--; + + break; + } + case A1_OP_CHOICE: { + const struct asn1_template *choice = t->ptr; + const unsigned int *element = DPOC(data, choice->offset); + size_t datalen; + const void *el; + + if (*element > A1_HEADER_LEN(choice)) { + printf("element: %d\n", *element); + return ASN1_PARSE_ERROR; + } + + if (*element == 0) { + ret += der_put_octet_string(p, len, + DPOC(data, choice->tt), &datalen); + } else { + choice += *element; + el = DPOC(data, choice->offset); + ret = _asn1_encode_fuzzer(choice->ptr, p, len, el, &datalen); + if (ret) + return ret; + } + len -= datalen; p -= datalen; + + break; + } + default: + ABORT_ON_ERROR(); + } + t--; + elements--; + } + + if (fuzzer_trigger(1000)) { + memset(p + 1, 0, oldlen - len); + } else if (fuzzer_trigger(1000)) { + memset(p + 1, 0x41, oldlen - len); + } else if (fuzzer_trigger(1000)) { + memset(p + 1, 0xff, oldlen - len); + } + + if (size) + *size = oldlen - len; + + return 0; +} + +size_t +_asn1_length_fuzzer(const struct asn1_template *t, const void *data) +{ + size_t elements = A1_HEADER_LEN(t); + size_t ret = 0; + + t += A1_HEADER_LEN(t); + + while (elements) { + switch (t->tt & A1_OP_MASK) { + case A1_OP_TYPE: + case A1_OP_TYPE_EXTERN: { + const void *el = DPOC(data, t->offset); + + if (t->tt & A1_FLAG_OPTIONAL) { + void **pel = (void **)el; + if (*pel == NULL) + break; + el = *pel; + } + + if ((t->tt & A1_OP_MASK) == A1_OP_TYPE) { + ret += _asn1_length(t->ptr, el); + } else { + const struct asn1_type_func *f = t->ptr; + ret += (f->length)(el); + } + break; + } + case A1_OP_TAG: { + size_t datalen; + const void *olddata = data; + + data = DPO(data, t->offset); + + if (t->tt & A1_FLAG_OPTIONAL) { + void **el = (void **)data; + if (*el == NULL) { + data = olddata; + break; + } + data = *el; + } + datalen = _asn1_length(t->ptr, data); + ret += der_length_tag(A1_TAG_TAG(t->tt)) + fuzzer_length_len(datalen); + ret += datalen; + data = olddata; + break; + } + case A1_OP_PARSE: { + unsigned int type = A1_PARSE_TYPE(t->tt); + const void *el = DPOC(data, t->offset); + + if (type >= sizeof(asn1_template_prim)/sizeof(asn1_template_prim[0])) { + ABORT_ON_ERROR(); + break; + } + ret += (asn1_template_prim[type].length)(el); + break; + } + case A1_OP_SETOF: + case A1_OP_SEQOF: { + const struct template_of *el = DPOC(data, t->offset); + size_t ellen = _asn1_sizeofType(t->ptr); + const unsigned char *element = el->val; + unsigned int i; + + for (i = 0; i < el->len; i++) { + ret += _asn1_length(t->ptr, element); + element += ellen; + } + + break; + } + case A1_OP_BMEMBER: { + const struct asn1_template *bmember = t->ptr; + size_t size = bmember->offset; + size_t elements = A1_HEADER_LEN(bmember); + int rfc1510 = (bmember->tt & A1_HBF_RFC1510); + + if (rfc1510) { + ret += 5; + } else { + + ret += 1; + + bmember += elements; + + while (elements) { + if (_asn1_bmember_isset_bit(data, bmember->offset, size)) { + ret += (bmember->offset / 8) + 1; + break; + } + elements--; bmember--; + } + } + break; + } + case A1_OP_CHOICE: { + const struct asn1_template *choice = t->ptr; + const unsigned int *element = DPOC(data, choice->offset); + + if (*element > A1_HEADER_LEN(choice)) + break; + + if (*element == 0) { + ret += der_length_octet_string(DPOC(data, choice->tt)); + } else { + choice += *element; + ret += _asn1_length(choice->ptr, DPOC(data, choice->offset)); + } + break; + } + default: + ABORT_ON_ERROR(); + break; + } + elements--; + t--; + } + return ret; +} + +#endif /* ASN1_FUZZER */ diff --git a/crypto/heimdal/lib/asn1/gen.c b/crypto/heimdal/lib/asn1/gen.c --- a/crypto/heimdal/lib/asn1/gen.c +++ b/crypto/heimdal/lib/asn1/gen.c @@ -148,7 +148,7 @@ fn = NULL; /* template file */ - if (asprintf(&template, "%s-template.c", headerbase) < 0 || template == NULL) + if (asprintf(&template, "%s-template.x", headerbase) < 0 || template == NULL) errx(1, "malloc"); fprintf (headerfile, "/* Generated from %s */\n" @@ -163,17 +163,21 @@ fprintf (headerfile, "#ifndef __asn1_common_definitions__\n" "#define __asn1_common_definitions__\n\n"); + fprintf (headerfile, + "#ifndef __HEIM_BASE_DATA__\n" + "#define __HEIM_BASE_DATA__ 1\n" + "struct heim_base_data {\n" + " size_t length;\n" + " void *data;\n" + "};\n" + "typedef struct heim_base_data heim_octet_string;\n" + "#endif\n\n"); fprintf (headerfile, "typedef struct heim_integer {\n" " size_t length;\n" " void *data;\n" " int negative;\n" "} heim_integer;\n\n"); - fprintf (headerfile, - "typedef struct heim_octet_string {\n" - " size_t length;\n" - " void *data;\n" - "} heim_octet_string;\n\n"); fprintf (headerfile, "typedef char *heim_general_string;\n\n" ); @@ -181,10 +185,10 @@ "typedef char *heim_utf8_string;\n\n" ); fprintf (headerfile, - "typedef struct heim_octet_string heim_printable_string;\n\n" + "typedef struct heim_base_data heim_printable_string;\n\n" ); fprintf (headerfile, - "typedef struct heim_octet_string heim_ia5_string;\n\n" + "typedef struct heim_base_data heim_ia5_string;\n\n" ); fprintf (headerfile, "typedef struct heim_bmp_string {\n" @@ -210,8 +214,8 @@ " void *data;\n" "} heim_bit_string;\n\n"); fprintf (headerfile, - "typedef struct heim_octet_string heim_any;\n" - "typedef struct heim_octet_string heim_any_set;\n\n"); + "typedef struct heim_base_data heim_any;\n" + "typedef struct heim_base_data heim_any_set;\n\n"); fputs("#define ASN1_MALLOC_ENCODE(T, B, BL, S, L, R) \\\n" " do { \\\n" " (BL) = length_##T((S)); \\\n" @@ -265,14 +269,14 @@ "#include \n" "#include \n" "#include \n" - "#include \n", - filename); + "#include <%s>\n", + filename, + type_file_string); fprintf (templatefile, "#include <%s>\n" "#include <%s>\n" "#include \n" - "#include \n" "#include \n", header, privheader); @@ -290,9 +294,10 @@ fclose (privheaderfile); if (templatefile) fclose (templatefile); - if (logfile) + if (logfile) { fprintf (logfile, "\n"); fclose (logfile); + } } void @@ -303,7 +308,8 @@ fprintf(codefile, "if((%s = strdup(\"%s\")) == NULL)\nreturn ENOMEM;\n", var, val->u.stringvalue); break; case integervalue: - fprintf(codefile, "%s = %d;\n", var, val->u.integervalue); + fprintf(codefile, "%s = %lld;\n", + var, (long long)val->u.integervalue); break; case booleanvalue: if(val->u.booleanvalue) @@ -324,7 +330,8 @@ fprintf(codefile, "if(strcmp(%s, \"%s\") != 0)\n", var, val->u.stringvalue); break; case integervalue: - fprintf(codefile, "if(%s != %d)\n", var, val->u.integervalue); + fprintf(codefile, "if(%s != %lld)\n", + var, (long long)val->u.integervalue); break; case booleanvalue: if(val->u.booleanvalue) @@ -350,7 +357,8 @@ codefile = fopen (filename, "w"); if (codefile == NULL) err (1, "fopen %s", filename); - fprintf(logfile, "%s ", filename); + if (logfile) + fprintf(logfile, "%s ", filename); free(filename); filename = NULL; fprintf (codefile, @@ -363,19 +371,22 @@ "#include \n" "#include \n" "#include \n" - "#include \n", - orig_filename); + "#include <%s>\n", + orig_filename, + type_file_string); fprintf (codefile, - "#include <%s>\n" - "#include <%s>\n", + "#include \"%s\"\n" + "#include \"%s\"\n", header, privheader); fprintf (codefile, "#include \n" "#include \n" - "#include \n" - "#include \n" - "#include \n\n"); + "#include \n\n"); + + if (parse_units_flag) + fprintf (codefile, + "#include \n\n"); } @@ -397,8 +408,9 @@ case booleanvalue: break; case integervalue: - fprintf (headerfile, "enum { %s = %d };\n\n", - s->gen_name, s->value->u.integervalue); + fprintf (headerfile, "enum { %s = %lld };\n\n", + s->gen_name, + (long long)s->value->u.integervalue); break; case nullvalue: break; @@ -406,7 +418,7 @@ break; case objectidentifiervalue: { struct objid *o, **list; - unsigned int i, len; + size_t i, len; char *gen_upper; if (!one_code_file) @@ -433,16 +445,16 @@ o->label ? o->label : "label-less", o->value); } - fprintf (codefile, "static unsigned oid_%s_variable_num[%d] = {", - s->gen_name, len); + fprintf (codefile, "static unsigned oid_%s_variable_num[%lu] = {", + s->gen_name, (unsigned long)len); for (i = len ; i > 0; i--) { fprintf(codefile, "%d%s ", list[i - 1]->value, i > 1 ? "," : ""); } fprintf(codefile, "};\n"); fprintf (codefile, "const heim_oid asn1_oid_%s = " - "{ %d, oid_%s_variable_num };\n\n", - s->gen_name, len, s->gen_name); + "{ %lu, oid_%s_variable_num };\n\n", + s->gen_name, (unsigned long)len, s->gen_name); free(list); @@ -540,8 +552,9 @@ if(t->members == NULL) { fprintf (headerfile, "INTEGER"); if (t->range) - fprintf (headerfile, " (%d..%d)", - t->range->min, t->range->max); + fprintf (headerfile, " (%lld..%lld)", + (long long)t->range->min, + (long long)t->range->max); } else { Member *m; fprintf (headerfile, "INTEGER {\n"); @@ -582,7 +595,7 @@ case TSet: case TSequence: { Member *m; - int max_width = 0; + size_t max_width = 0; if(t->type == TChoice) fprintf(headerfile, "CHOICE {\n"); @@ -597,13 +610,13 @@ max_width += 3; if(max_width < 16) max_width = 16; ASN1_TAILQ_FOREACH(m, t->members, members) { - int width = max_width; + size_t width = max_width; space(level + 1); if (m->ellipsis) { fprintf (headerfile, "..."); } else { width -= fprintf(headerfile, "%s", m->name); - fprintf(headerfile, "%*s", width, ""); + fprintf(headerfile, "%*s", (int)width, ""); define_asn1(level + 1, m->type); if(m->optional) fprintf(headerfile, " OPTIONAL"); @@ -723,15 +736,17 @@ fprintf (headerfile, "} %s;\n", name); } else if (t->range == NULL) { fprintf (headerfile, "heim_integer %s;\n", name); - } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) { + } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { + fprintf (headerfile, "int64_t %s;\n", name); + } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { + fprintf (headerfile, "uint64_t %s;\n", name); + } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { fprintf (headerfile, "int %s;\n", name); - } else if (t->range->min == 0 && t->range->max == UINT_MAX) { - fprintf (headerfile, "unsigned int %s;\n", name); - } else if (t->range->min == 0 && t->range->max == INT_MAX) { + } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { fprintf (headerfile, "unsigned int %s;\n", name); } else - errx(1, "%s: unsupported range %d -> %d", - name, t->range->min, t->range->max); + errx(1, "%s: unsupported range %lld -> %lld", + name, (long long)t->range->min, (long long)t->range->max); break; case TBoolean: space(level); @@ -744,7 +759,7 @@ case TBitString: { Member *m; Type i; - struct range range = { 0, INT_MAX }; + struct range range = { 0, UINT_MAX }; i.type = TInteger; i.range = ⦥ @@ -843,7 +858,7 @@ case TSetOf: case TSequenceOf: { Type i; - struct range range = { 0, INT_MAX }; + struct range range = { 0, UINT_MAX }; getnewbasename(&newbasename, typedefp, basename, name); @@ -888,7 +903,7 @@ fprintf(headerfile, "heim_octet_string _save;\n"); } space(level + 1); - fprintf (headerfile, "enum {\n"); + fprintf (headerfile, "enum %s_enum {\n", newbasename); m = have_ellipsis(t); if (m) { space(level + 2); diff --git a/crypto/heimdal/lib/asn1/gen_copy.c b/crypto/heimdal/lib/asn1/gen_copy.c --- a/crypto/heimdal/lib/asn1/gen_copy.c +++ b/crypto/heimdal/lib/asn1/gen_copy.c @@ -62,6 +62,7 @@ copy_primitive ("heim_integer", from, to); break; } + /* fallthrough */ case TBoolean: case TEnumerated : fprintf(codefile, "*(%s) = *(%s);\n", to, from); diff --git a/crypto/heimdal/lib/asn1/gen_decode.c b/crypto/heimdal/lib/asn1/gen_decode.c --- a/crypto/heimdal/lib/asn1/gen_decode.c +++ b/crypto/heimdal/lib/asn1/gen_decode.c @@ -189,22 +189,22 @@ { if (r->min == r->max + 2 || r->min < r->max) fprintf (codefile, - "if ((%s)->%s > %d) {\n" + "if ((%s)->%s > %lld) {\n" "e = ASN1_MAX_CONSTRAINT; %s;\n" "}\n", - name, length, r->max, forwstr); - if (r->min - 1 == r->max || r->min < r->max) + name, length, (long long)r->max, forwstr); + if ((r->min - 1 == r->max || r->min < r->max) && r->min > 0) fprintf (codefile, - "if ((%s)->%s < %d) {\n" + "if ((%s)->%s < %lld) {\n" "e = ASN1_MIN_CONSTRAINT; %s;\n" "}\n", - name, length, r->min, forwstr); + name, length, (long long)r->min, forwstr); if (r->max == r->min) fprintf (codefile, - "if ((%s)->%s != %d) {\n" + "if ((%s)->%s != %lld) {\n" "e = ASN1_EXACT_CONSTRAINT; %s;\n" "}\n", - name, length, r->min, forwstr); + name, length, (long long)r->min, forwstr); } static int @@ -242,6 +242,14 @@ } case TInteger: if(t->members) { + /* + * This will produce a worning, how its hard to fix since: + * if its enum to an NameType, we can add appriate + * type-cast. If its not though, we have to figure out if + * there is negative enum enum and use appropriate + * signness and size on the intertype we cast the result + * too. + */ fprintf(codefile, "{\n" "int enumint;\n"); @@ -252,15 +260,17 @@ name); } else if (t->range == NULL) { decode_primitive ("heim_integer", name, forwstr); - } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) { + } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { + decode_primitive ("integer64", name, forwstr); + } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { + decode_primitive ("unsigned64", name, forwstr); + } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { decode_primitive ("integer", name, forwstr); - } else if (t->range->min == 0 && t->range->max == UINT_MAX) { - decode_primitive ("unsigned", name, forwstr); - } else if (t->range->min == 0 && t->range->max == INT_MAX) { + } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { decode_primitive ("unsigned", name, forwstr); } else - errx(1, "%s: unsupported range %d -> %d", - name, t->range->min, t->range->max); + errx(1, "%s: unsupported range %lld -> %lld", + name, (long long)t->range->min, (long long)t->range->max); break; case TBoolean: decode_primitive ("boolean", name, forwstr); diff --git a/crypto/heimdal/lib/asn1/gen_encode.c b/crypto/heimdal/lib/asn1/gen_encode.c --- a/crypto/heimdal/lib/asn1/gen_encode.c +++ b/crypto/heimdal/lib/asn1/gen_encode.c @@ -33,8 +33,6 @@ #include "gen_locl.h" -RCSID("$Id$"); - static void encode_primitive (const char *typename, const char *name) { @@ -50,7 +48,7 @@ { const char *cn[] = { "ASN1_C_UNIV", "ASN1_C_APPL", "ASN1_C_CONTEXT", "ASN1_C_PRIV" }; - if(class < ASN1_C_UNIV || class > ASN1_C_PRIVATE) + if ((int)class >= sizeof(cn) / sizeof(cn[0])) return "???"; return cn[class]; } @@ -129,15 +127,18 @@ fprintf(codefile, "}\n;"); } else if (t->range == NULL) { encode_primitive ("heim_integer", name); - } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) { + } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { + encode_primitive ("integer64", name); + } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { + encode_primitive ("unsigned64", name); + } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { encode_primitive ("integer", name); - } else if (t->range->min == 0 && t->range->max == UINT_MAX) { - encode_primitive ("unsigned", name); - } else if (t->range->min == 0 && t->range->max == INT_MAX) { + } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { encode_primitive ("unsigned", name); } else - errx(1, "%s: unsupported range %d -> %d", - name, t->range->min, t->range->max); + errx(1, "%s: unsupported range %lld -> %lld", + name, (long long)t->range->min, (long long)t->range->max); + constructed = 0; break; case TBoolean: @@ -287,7 +288,7 @@ fprintf(codefile, "{\n" - "struct heim_octet_string *val;\n" + "heim_octet_string *val;\n" "size_t elen = 0, totallen = 0;\n" "int eret = 0;\n"); diff --git a/crypto/heimdal/lib/asn1/gen_free.c b/crypto/heimdal/lib/asn1/gen_free.c --- a/crypto/heimdal/lib/asn1/gen_free.c +++ b/crypto/heimdal/lib/asn1/gen_free.c @@ -56,11 +56,19 @@ free_primitive ("heim_integer", name); break; } + /* fallthrough */ case TBoolean: case TEnumerated : case TNull: case TGeneralizedTime: case TUTCTime: + /* + * This doesn't do much, but it leaves zeros where garbage might + * otherwise have been found. Gets us closer to having the equivalent + * of a memset()-to-zero data structure after calling the free + * functions. + */ + fprintf(codefile, "*%s = 0;\n", name); break; case TBitString: if (ASN1_TAILQ_EMPTY(t->members)) diff --git a/crypto/heimdal/lib/asn1/gen_glue.c b/crypto/heimdal/lib/asn1/gen_glue.c --- a/crypto/heimdal/lib/asn1/gen_glue.c +++ b/crypto/heimdal/lib/asn1/gen_glue.c @@ -147,7 +147,8 @@ if (!ASN1_TAILQ_EMPTY(t->members)) { generate_2int (t, gen_name); generate_int2 (t, gen_name); - generate_units (t, gen_name); + if (parse_units_flag) + generate_units (t, gen_name); } break; default : diff --git a/crypto/heimdal/lib/asn1/gen_length.c b/crypto/heimdal/lib/asn1/gen_length.c --- a/crypto/heimdal/lib/asn1/gen_length.c +++ b/crypto/heimdal/lib/asn1/gen_length.c @@ -80,16 +80,17 @@ fprintf(codefile, "}\n"); } else if (t->range == NULL) { length_primitive ("heim_integer", name, variable); - } else if (t->range->min == INT_MIN && t->range->max == INT_MAX) { + } else if (t->range->min < INT_MIN && t->range->max <= INT64_MAX) { + length_primitive ("integer64", name, variable); + } else if (t->range->min >= 0 && t->range->max > UINT_MAX) { + length_primitive ("unsigned64", name, variable); + } else if (t->range->min >= INT_MIN && t->range->max <= INT_MAX) { length_primitive ("integer", name, variable); - } else if (t->range->min == 0 && t->range->max == UINT_MAX) { - length_primitive ("unsigned", name, variable); - } else if (t->range->min == 0 && t->range->max == INT_MAX) { + } else if (t->range->min >= 0 && t->range->max <= UINT_MAX) { length_primitive ("unsigned", name, variable); } else - errx(1, "%s: unsupported range %d -> %d", - name, t->range->min, t->range->max); - + errx(1, "%s: unsupported range %lld -> %lld", + name, (long long)t->range->min, (long long)t->range->max); break; case TBoolean: fprintf (codefile, "%s += 1;\n", variable); @@ -188,14 +189,15 @@ fprintf (codefile, "{\n" "size_t %s_oldret = %s;\n" - "int i;\n" + "unsigned int n_%s;\n" "%s = 0;\n", - tmpstr, variable, variable); + tmpstr, variable, tmpstr, variable); - fprintf (codefile, "for(i = (%s)->len - 1; i >= 0; --i){\n", name); + fprintf (codefile, "for(n_%s = (%s)->len; n_%s > 0; --n_%s){\n", + tmpstr, name, tmpstr, tmpstr); fprintf (codefile, "size_t %s_for_oldret = %s;\n" "%s = 0;\n", tmpstr, variable, variable); - if (asprintf (&n, "&(%s)->val[i]", name) < 0 || n == NULL) + if (asprintf (&n, "&(%s)->val[n_%s - 1]", name, tmpstr) < 0 || n == NULL) errx(1, "malloc"); if (asprintf (&sname, "%s_S_Of", tmpstr) < 0 || sname == NULL) errx(1, "malloc"); diff --git a/crypto/heimdal/lib/asn1/gen_locl.h b/crypto/heimdal/lib/asn1/gen_locl.h --- a/crypto/heimdal/lib/asn1/gen_locl.h +++ b/crypto/heimdal/lib/asn1/gen_locl.h @@ -92,10 +92,13 @@ extern FILE *privheaderfile, *headerfile, *codefile, *logfile, *templatefile; +extern const char *fuzzer_string; extern int support_ber; extern int template_flag; extern int rfc1510_bitstring; extern int one_code_file; +extern int parse_units_flag; +extern char *type_file_string; extern int error_flag; diff --git a/crypto/heimdal/lib/asn1/gen_template.c b/crypto/heimdal/lib/asn1/gen_template.c index edd68e12238009d796c30f2fa77667a507b4291b..d469201e554d4243f3cb98a3046a7173f2968b12 GIT binary patch literal 25346 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 a^EFTN4X29%vDo530KikQwu;#=t^Wg`d@L6L literal 22737 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 E0frY1tpET3 diff --git a/crypto/heimdal/lib/asn1/krb5.asn1 b/crypto/heimdal/lib/asn1/krb5.asn1 --- a/crypto/heimdal/lib/asn1/krb5.asn1 +++ b/crypto/heimdal/lib/asn1/krb5.asn1 @@ -63,6 +63,8 @@ PA-ServerReferralData, PA-SvrReferralData, PADATA-TYPE, + PA-FX-FAST-REQUEST, + PA-FX-FAST-REPLY, Principal, PrincipalName, Principals, @@ -72,7 +74,20 @@ Ticket, TicketFlags, TransitedEncoding, - TypedData + TypedData, + KrbFastResponse, + KrbFastFinished, + KrbFastReq, + KrbFastArmor, + KrbFastArmoredReq, + KDCFastState, + KDCFastCookie, + KDC-PROXY-MESSAGE, + KERB-TIMES, + KERB-CRED, + KERB-TGS-REQ-IN, + KERB-TGS-REQ-OUT, + KERB-ARMOR-SERVICE-REPLY ; NAME-TYPE ::= INTEGER { @@ -86,10 +101,15 @@ KRB5_NT_SMTP_NAME(7), -- Name in form of SMTP email name KRB5_NT_ENTERPRISE_PRINCIPAL(10), -- Windows 2000 UPN KRB5_NT_WELLKNOWN(11), -- Wellknown + KRB5_NT_SRV_HST_DOMAIN(12), -- Domain based service with host name as instance (RFC5179) KRB5_NT_ENT_PRINCIPAL_AND_ID(-130), -- Windows 2000 UPN and SID KRB5_NT_MS_PRINCIPAL(-128), -- NT 4 style name KRB5_NT_MS_PRINCIPAL_AND_ID(-129), -- NT style name and SID - KRB5_NT_NTLM(-1200) -- NTLM name, realm is domain + KRB5_NT_NTLM(-1200), -- NTLM name, realm is domain + KRB5_NT_X509_GENERAL_NAME(-1201), -- x509 general name (base64 encoded) + KRB5_NT_GSS_HOSTBASED_SERVICE(-1202), -- not used; remove + KRB5_NT_CACHE_UUID(-1203), -- name is actually a uuid pointing to ccache, use client name in cache + KRB5_NT_SRV_HST_NEEDS_CANON (-195894762) -- Internal: indicates that name canonicalization is needed } -- message types @@ -142,6 +162,7 @@ KRB5-PADATA-SAM-CHALLENGE2(30), -- (kenh@pobox.com) KRB5-PADATA-SAM-RESPONSE2(31), -- (kenh@pobox.com) KRB5-PA-EXTRA-TGT(41), -- Reserved extra TGT + KRB5-PADATA-FX-FAST-ARMOR(71), -- fast armor KRB5-PADATA-TD-KRB-PRINCIPAL(102), -- PrincipalName KRB5-PADATA-PK-TD-TRUSTED-CERTIFIERS(104), -- PKINIT KRB5-PADATA-PK-TD-CERTIFICATE-INDEX(105), -- PKINIT @@ -157,7 +178,6 @@ -- tell KDC that is supports -- the asCheckSum in the -- PK-AS-REP - KRB5-PADATA-CLIENT-CANONICALIZED(133), -- referals KRB5-PADATA-FX-COOKIE(133), -- krb-wg-preauth-framework KRB5-PADATA-AUTHENTICATION-SET(134), -- krb-wg-preauth-framework KRB5-PADATA-AUTH-SET-SELECTED(135), -- krb-wg-preauth-framework @@ -214,6 +234,8 @@ CKSUMTYPE_SHA1(14), CKSUMTYPE_HMAC_SHA1_96_AES_128(15), CKSUMTYPE_HMAC_SHA1_96_AES_256(16), + CKSUMTYPE_HMAC_SHA256_128_AES128(19), + CKSUMTYPE_HMAC_SHA384_192_AES256(20), CKSUMTYPE_GSSAPI(0x8003), CKSUMTYPE_HMAC_MD5(-138), -- unofficial microsoft number CKSUMTYPE_HMAC_MD5_ENC(-1138) -- even more unofficial @@ -233,6 +255,8 @@ KRB5_ENCTYPE_DES3_CBC_SHA1(16), -- with key derivation KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96(17), KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96(18), + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128(19), + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192(20), KRB5_ENCTYPE_ARCFOUR_HMAC_MD5(23), KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56(24), KRB5_ENCTYPE_ENCTYPE_PK_CROSS(48), @@ -319,8 +343,8 @@ hw-authent(11), transited-policy-checked(12), ok-as-delegate(13), - anonymous(14), - enc-pa-rep(15) + enc-pa-rep(15), + anonymous(16) } KDCOptions ::= BIT STRING { @@ -332,9 +356,9 @@ allow-postdate(5), postdated(6), renewable(8), - request-anonymous(14), + cname-in-addl-tkt(14), -- ms extension canonicalize(15), - constrained-delegation(16), -- ms extension + request-anonymous(16), disable-transited-check(26), renewable-ok(27), enc-tkt-in-skey(28), @@ -361,7 +385,7 @@ EncryptedData ::= SEQUENCE { etype[0] ENCTYPE, -- EncryptionType - kvno[1] krb5uint32 OPTIONAL, + kvno[1] krb5int32 OPTIONAL, cipher[2] OCTET STRING -- ciphertext } @@ -732,16 +756,6 @@ method_data[3] METHOD-DATA OPTIONAL } -PA-ClientCanonicalizedNames ::= SEQUENCE{ - requested-name [0] PrincipalName, - mapped-name [1] PrincipalName -} - -PA-ClientCanonicalized ::= SEQUENCE { - names [0] PA-ClientCanonicalizedNames, - canon-checksum [1] Checksum -} - AD-LoginAlias ::= SEQUENCE { -- ad-type number TBD -- login-alias [0] PrincipalName, checksum [1] Checksum @@ -766,12 +780,12 @@ FastOptions ::= BIT STRING { reserved(0), hide-client-names(1), - kdc-follow--referrals(16) + kdc-follow-referrals(16) } KrbFastReq ::= SEQUENCE { fast-options [0] FastOptions, - padata [1] SEQUENCE OF PA-DATA, + padata [1] METHOD-DATA, req-body [2] KDC-REQ-BODY, ... } @@ -798,15 +812,15 @@ usec [1] krb5int32, crealm [2] Realm, cname [3] PrincipalName, - checksum [4] Checksum, - ticket-checksum [5] Checksum, + ticket-checksum [4] Checksum, ... } KrbFastResponse ::= SEQUENCE { - padata [0] SEQUENCE OF PA-DATA, - rep-key [1] EncryptionKey OPTIONAL, - finished [2] KrbFastFinished OPTIONAL, + padata [0] METHOD-DATA, + strengthen-key [1] EncryptionKey OPTIONAL, + finished [2] KrbFastFinished OPTIONAL, + nonce [3] krb5uint32, ... } @@ -820,6 +834,89 @@ ... } +KDCFastFlags ::= BIT STRING { + use_reply_key(0), + reply_key_used(1), + reply_key_replaced(2), + kdc_verfied(3) +} + +-- KDCFastState is stored in FX_COOKIE +KDCFastState ::= SEQUENCE { + flags [0] KDCFastFlags, + expiration [1] GeneralizedTime, + fast-state [2] METHOD-DATA, + expected-pa-types [3] SEQUENCE OF PADATA-TYPE OPTIONAL +} + +KDCFastCookie ::= SEQUENCE { + version [0] UTF8String, + cookie [1] EncryptedData +} + +KDC-PROXY-MESSAGE ::= SEQUENCE { + kerb-message [0] OCTET STRING, + target-domain [1] Realm OPTIONAL, + dclocator-hint [2] INTEGER OPTIONAL +} + +-- these messages are used in the GSSCred communication and is not part of Kerberos propper + +KERB-TIMES ::= SEQUENCE { + authtime [0] KerberosTime, + starttime [1] KerberosTime, + endtime [2] KerberosTime, + renew_till [3] KerberosTime +} + +KERB-CRED ::= SEQUENCE { + client [0] Principal, + server [1] Principal, + keyblock [2] EncryptionKey, + times [3] KERB-TIMES, + ticket [4] OCTET STRING, + authdata [5] OCTET STRING, + addresses [6] HostAddresses, + flags [7] TicketFlags +} + +KERB-TGS-REQ-IN ::= SEQUENCE { + cache [0] OCTET STRING SIZE (16), + addrs [1] HostAddresses, + flags [2] krb5uint32, + imp [3] Principal OPTIONAL, + ticket [4] OCTET STRING OPTIONAL, + in_cred [5] KERB-CRED, + krbtgt [6] KERB-CRED, + padata [7] METHOD-DATA +} + +KERB-TGS-REQ-OUT ::= SEQUENCE { + subkey [0] EncryptionKey OPTIONAL, + t [1] TGS-REQ +} + + + +KERB-TGS-REP-IN ::= SEQUENCE { + cache [0] OCTET STRING SIZE (16), + subkey [1] EncryptionKey OPTIONAL, + in_cred [2] KERB-CRED, + t [3] TGS-REP +} + +KERB-TGS-REP-OUT ::= SEQUENCE { + cache [0] OCTET STRING SIZE (16), + cred [1] KERB-CRED, + subkey [2] EncryptionKey +} + +KERB-ARMOR-SERVICE-REPLY ::= SEQUENCE { + armor [0] KrbFastArmor, + armor-key [1] EncryptionKey +} + + END -- etags -r '/\([A-Za-z][-A-Za-z0-9]*\).*::=/\1/' k5.asn1 diff --git a/crypto/heimdal/lib/asn1/lex.c b/crypto/heimdal/lib/asn1/lex.c --- a/crypto/heimdal/lib/asn1/lex.c +++ b/crypto/heimdal/lib/asn1/lex.c @@ -1,5 +1,5 @@ -#line 3 "lex.c" +#line 2 "lex.c" #define YY_INT_ALIGNED short int @@ -7,8 +7,8 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -53,7 +53,6 @@ typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; -#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -84,63 +83,61 @@ #define UINT32_MAX (4294967295U) #endif -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) +#endif /* ! C99 */ -#define YY_USE_CONST +#endif /* ! FLEXINT_H */ -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ +/* begin standard C++ headers. */ -#ifdef YY_USE_CONST +/* TODO: this is always defined, so inline it */ #define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) #else -#define yyconst +#define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * - /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START - /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - +#define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else #define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -157,15 +154,16 @@ typedef size_t yy_size_t; #endif -extern yy_size_t yyleng; +extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ @@ -180,7 +178,6 @@ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) - #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE @@ -195,12 +192,12 @@ /* Size of input buffer in bytes, not including room for EOB * characters. */ - yy_size_t yy_buf_size; + int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - yy_size_t yy_n_chars; + int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to @@ -223,7 +220,7 @@ int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -251,7 +248,7 @@ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general @@ -262,7 +259,6 @@ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) - /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ @@ -270,11 +266,11 @@ /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; -static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ -yy_size_t yyleng; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; /* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; +static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ @@ -283,82 +279,78 @@ */ static int yy_did_buffer_switch_on_eof; -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( YY_BUFFER_STATE b ); +void yy_flush_buffer ( YY_BUFFER_STATE b ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state ( void ); -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); - -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); #define yy_new_buffer yy_create_buffer - #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } - #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } - #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ +typedef flex_uint8_t YY_CHAR; -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; - int yylineno = 1; extern char *yytext; +#ifdef yytext_ptr +#undef yytext_ptr +#endif #define yytext_ptr yytext -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ + yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; - #define YY_NUM_RULES 95 #define YY_END_OF_BUFFER 96 /* This struct is not used in this scanner, @@ -368,7 +360,7 @@ flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[568] = +static const flex_int16_t yy_accept[568] = { 0, 0, 0, 96, 94, 90, 91, 87, 81, 81, 94, 94, 88, 88, 94, 89, 89, 89, 89, 89, 89, @@ -434,7 +426,7 @@ 32, 89, 59, 70, 77, 53, 0 } ; -static yyconst flex_int32_t yy_ec[256] = +static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -466,7 +458,7 @@ 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[70] = +static const YY_CHAR yy_meta[70] = { 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, @@ -477,7 +469,7 @@ 2, 2, 2, 2, 2, 2, 2, 2, 2 } ; -static yyconst flex_int16_t yy_base[570] = +static const flex_int16_t yy_base[570] = { 0, 0, 0, 636, 637, 637, 637, 637, 637, 63, 627, 628, 70, 77, 616, 74, 72, 76, 609, 65, 81, @@ -543,7 +535,7 @@ 0, 101, 0, 0, 0, 0, 637, 223, 69 } ; -static yyconst flex_int16_t yy_def[570] = +static const flex_int16_t yy_def[570] = { 0, 567, 1, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 567, 568, 568, 568, 568, 568, 568, @@ -609,7 +601,7 @@ 568, 568, 568, 568, 568, 568, 0, 567, 567 } ; -static yyconst flex_int16_t yy_nxt[707] = +static const flex_int16_t yy_nxt[707] = { 0, 4, 5, 6, 7, 8, 4, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 14, 4, 15, 16, @@ -691,7 +683,7 @@ 567, 567, 567, 567, 567, 567 } ; -static yyconst flex_int16_t yy_chk[707] = +static const flex_int16_t yy_chk[707] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -790,7 +782,7 @@ #line 1 "lex.l" #line 2 "lex.l" /* - * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan + * Copyright (c) 1997 - 2017 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -830,6 +822,7 @@ #include #include #include +#include #include #ifdef HAVE_UNISTD_H #include @@ -846,8 +839,9 @@ static void unterminated(const char *, unsigned); +#line 842 "lex.c" /* This is for broken old lexes (solaris 10 and hpux) */ -#line 851 "lex.c" +#line 844 "lex.c" #define INITIAL 0 @@ -863,36 +857,36 @@ #define YY_EXTRA_TYPE void * #endif -static int yy_init_globals (void ); +static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy (void ); +int yylex_destroy ( void ); -int yyget_debug (void ); +int yyget_debug ( void ); -void yyset_debug (int debug_flag ); +void yyset_debug ( int debug_flag ); -YY_EXTRA_TYPE yyget_extra (void ); +YY_EXTRA_TYPE yyget_extra ( void ); -void yyset_extra (YY_EXTRA_TYPE user_defined ); +void yyset_extra ( YY_EXTRA_TYPE user_defined ); -FILE *yyget_in (void ); +FILE *yyget_in ( void ); -void yyset_in (FILE * in_str ); +void yyset_in ( FILE * _in_str ); -FILE *yyget_out (void ); +FILE *yyget_out ( void ); -void yyset_out (FILE * out_str ); +void yyset_out ( FILE * _out_str ); -yy_size_t yyget_leng (void ); + int yyget_leng ( void ); -char *yyget_text (void ); +char *yyget_text ( void ); -int yyget_lineno (void ); +int yyget_lineno ( void ); -void yyset_lineno (int line_number ); +void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -900,35 +894,43 @@ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap (void ); +extern "C" int yywrap ( void ); #else -extern int yywrap (void ); +extern int yywrap ( void ); #endif #endif - static void yyunput (int c,char *buf_ptr ); +#ifndef YY_NO_UNPUT + + static void yyunput ( int c, char *buf_ptr ); +#endif + #ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); +static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); +static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT - #ifdef __cplusplus -static int yyinput (void ); +static int yyinput ( void ); #else -static int input (void ); +static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else #define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -936,7 +938,7 @@ /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO fwrite( yytext, yyleng, 1, yyout ) +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -947,7 +949,7 @@ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - yy_size_t n; \ + int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -960,7 +962,7 @@ else \ { \ errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -1015,7 +1017,7 @@ /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK break; +#define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ @@ -1025,14 +1027,10 @@ */ YY_DECL { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; -#line 68 "lex.l" - -#line 1035 "lex.c" - if ( !(yy_init) ) { (yy_init) = 1; @@ -1053,13 +1051,18 @@ if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_load_buffer_state( ); + yy_load_buffer_state( ); } - while ( 1 ) /* loops until end-of-file is reached */ + { +#line 69 "lex.l" + +#line 1063 "lex.c" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); @@ -1075,7 +1078,7 @@ yy_match: do { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -1085,9 +1088,9 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 568 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 637 ); @@ -1116,427 +1119,427 @@ case 1: YY_RULE_SETUP -#line 69 "lex.l" +#line 70 "lex.l" { return kw_ABSENT; } YY_BREAK case 2: YY_RULE_SETUP -#line 70 "lex.l" +#line 71 "lex.l" { return kw_ABSTRACT_SYNTAX; } YY_BREAK case 3: YY_RULE_SETUP -#line 71 "lex.l" +#line 72 "lex.l" { return kw_ALL; } YY_BREAK case 4: YY_RULE_SETUP -#line 72 "lex.l" +#line 73 "lex.l" { return kw_APPLICATION; } YY_BREAK case 5: YY_RULE_SETUP -#line 73 "lex.l" +#line 74 "lex.l" { return kw_AUTOMATIC; } YY_BREAK case 6: YY_RULE_SETUP -#line 74 "lex.l" +#line 75 "lex.l" { return kw_BEGIN; } YY_BREAK case 7: YY_RULE_SETUP -#line 75 "lex.l" +#line 76 "lex.l" { return kw_BIT; } YY_BREAK case 8: YY_RULE_SETUP -#line 76 "lex.l" +#line 77 "lex.l" { return kw_BMPString; } YY_BREAK case 9: YY_RULE_SETUP -#line 77 "lex.l" +#line 78 "lex.l" { return kw_BOOLEAN; } YY_BREAK case 10: YY_RULE_SETUP -#line 78 "lex.l" +#line 79 "lex.l" { return kw_BY; } YY_BREAK case 11: YY_RULE_SETUP -#line 79 "lex.l" +#line 80 "lex.l" { return kw_CHARACTER; } YY_BREAK case 12: YY_RULE_SETUP -#line 80 "lex.l" +#line 81 "lex.l" { return kw_CHOICE; } YY_BREAK case 13: YY_RULE_SETUP -#line 81 "lex.l" +#line 82 "lex.l" { return kw_CLASS; } YY_BREAK case 14: YY_RULE_SETUP -#line 82 "lex.l" +#line 83 "lex.l" { return kw_COMPONENT; } YY_BREAK case 15: YY_RULE_SETUP -#line 83 "lex.l" +#line 84 "lex.l" { return kw_COMPONENTS; } YY_BREAK case 16: YY_RULE_SETUP -#line 84 "lex.l" +#line 85 "lex.l" { return kw_CONSTRAINED; } YY_BREAK case 17: YY_RULE_SETUP -#line 85 "lex.l" +#line 86 "lex.l" { return kw_CONTAINING; } YY_BREAK case 18: YY_RULE_SETUP -#line 86 "lex.l" +#line 87 "lex.l" { return kw_DEFAULT; } YY_BREAK case 19: YY_RULE_SETUP -#line 87 "lex.l" +#line 88 "lex.l" { return kw_DEFINITIONS; } YY_BREAK case 20: YY_RULE_SETUP -#line 88 "lex.l" +#line 89 "lex.l" { return kw_EMBEDDED; } YY_BREAK case 21: YY_RULE_SETUP -#line 89 "lex.l" +#line 90 "lex.l" { return kw_ENCODED; } YY_BREAK case 22: YY_RULE_SETUP -#line 90 "lex.l" +#line 91 "lex.l" { return kw_END; } YY_BREAK case 23: YY_RULE_SETUP -#line 91 "lex.l" +#line 92 "lex.l" { return kw_ENUMERATED; } YY_BREAK case 24: YY_RULE_SETUP -#line 92 "lex.l" +#line 93 "lex.l" { return kw_EXCEPT; } YY_BREAK case 25: YY_RULE_SETUP -#line 93 "lex.l" +#line 94 "lex.l" { return kw_EXPLICIT; } YY_BREAK case 26: YY_RULE_SETUP -#line 94 "lex.l" +#line 95 "lex.l" { return kw_EXPORTS; } YY_BREAK case 27: YY_RULE_SETUP -#line 95 "lex.l" +#line 96 "lex.l" { return kw_EXTENSIBILITY; } YY_BREAK case 28: YY_RULE_SETUP -#line 96 "lex.l" +#line 97 "lex.l" { return kw_EXTERNAL; } YY_BREAK case 29: YY_RULE_SETUP -#line 97 "lex.l" +#line 98 "lex.l" { return kw_FALSE; } YY_BREAK case 30: YY_RULE_SETUP -#line 98 "lex.l" +#line 99 "lex.l" { return kw_FROM; } YY_BREAK case 31: YY_RULE_SETUP -#line 99 "lex.l" +#line 100 "lex.l" { return kw_GeneralString; } YY_BREAK case 32: YY_RULE_SETUP -#line 100 "lex.l" +#line 101 "lex.l" { return kw_GeneralizedTime; } YY_BREAK case 33: YY_RULE_SETUP -#line 101 "lex.l" +#line 102 "lex.l" { return kw_GraphicString; } YY_BREAK case 34: YY_RULE_SETUP -#line 102 "lex.l" +#line 103 "lex.l" { return kw_IA5String; } YY_BREAK case 35: YY_RULE_SETUP -#line 103 "lex.l" +#line 104 "lex.l" { return kw_IDENTIFIER; } YY_BREAK case 36: YY_RULE_SETUP -#line 104 "lex.l" +#line 105 "lex.l" { return kw_IMPLICIT; } YY_BREAK case 37: YY_RULE_SETUP -#line 105 "lex.l" +#line 106 "lex.l" { return kw_IMPLIED; } YY_BREAK case 38: YY_RULE_SETUP -#line 106 "lex.l" +#line 107 "lex.l" { return kw_IMPORTS; } YY_BREAK case 39: YY_RULE_SETUP -#line 107 "lex.l" +#line 108 "lex.l" { return kw_INCLUDES; } YY_BREAK case 40: YY_RULE_SETUP -#line 108 "lex.l" +#line 109 "lex.l" { return kw_INSTANCE; } YY_BREAK case 41: YY_RULE_SETUP -#line 109 "lex.l" +#line 110 "lex.l" { return kw_INTEGER; } YY_BREAK case 42: YY_RULE_SETUP -#line 110 "lex.l" +#line 111 "lex.l" { return kw_INTERSECTION; } YY_BREAK case 43: YY_RULE_SETUP -#line 111 "lex.l" +#line 112 "lex.l" { return kw_ISO646String; } YY_BREAK case 44: YY_RULE_SETUP -#line 112 "lex.l" +#line 113 "lex.l" { return kw_MAX; } YY_BREAK case 45: YY_RULE_SETUP -#line 113 "lex.l" +#line 114 "lex.l" { return kw_MIN; } YY_BREAK case 46: YY_RULE_SETUP -#line 114 "lex.l" +#line 115 "lex.l" { return kw_MINUS_INFINITY; } YY_BREAK case 47: YY_RULE_SETUP -#line 115 "lex.l" +#line 116 "lex.l" { return kw_NULL; } YY_BREAK case 48: YY_RULE_SETUP -#line 116 "lex.l" +#line 117 "lex.l" { return kw_NumericString; } YY_BREAK case 49: YY_RULE_SETUP -#line 117 "lex.l" +#line 118 "lex.l" { return kw_OBJECT; } YY_BREAK case 50: YY_RULE_SETUP -#line 118 "lex.l" +#line 119 "lex.l" { return kw_OCTET; } YY_BREAK case 51: YY_RULE_SETUP -#line 119 "lex.l" +#line 120 "lex.l" { return kw_OF; } YY_BREAK case 52: YY_RULE_SETUP -#line 120 "lex.l" +#line 121 "lex.l" { return kw_OPTIONAL; } YY_BREAK case 53: YY_RULE_SETUP -#line 121 "lex.l" +#line 122 "lex.l" { return kw_ObjectDescriptor; } YY_BREAK case 54: YY_RULE_SETUP -#line 122 "lex.l" +#line 123 "lex.l" { return kw_PATTERN; } YY_BREAK case 55: YY_RULE_SETUP -#line 123 "lex.l" +#line 124 "lex.l" { return kw_PDV; } YY_BREAK case 56: YY_RULE_SETUP -#line 124 "lex.l" +#line 125 "lex.l" { return kw_PLUS_INFINITY; } YY_BREAK case 57: YY_RULE_SETUP -#line 125 "lex.l" +#line 126 "lex.l" { return kw_PRESENT; } YY_BREAK case 58: YY_RULE_SETUP -#line 126 "lex.l" +#line 127 "lex.l" { return kw_PRIVATE; } YY_BREAK case 59: YY_RULE_SETUP -#line 127 "lex.l" +#line 128 "lex.l" { return kw_PrintableString; } YY_BREAK case 60: YY_RULE_SETUP -#line 128 "lex.l" +#line 129 "lex.l" { return kw_REAL; } YY_BREAK case 61: YY_RULE_SETUP -#line 129 "lex.l" +#line 130 "lex.l" { return kw_RELATIVE_OID; } YY_BREAK case 62: YY_RULE_SETUP -#line 130 "lex.l" +#line 131 "lex.l" { return kw_SEQUENCE; } YY_BREAK case 63: YY_RULE_SETUP -#line 131 "lex.l" +#line 132 "lex.l" { return kw_SET; } YY_BREAK case 64: YY_RULE_SETUP -#line 132 "lex.l" +#line 133 "lex.l" { return kw_SIZE; } YY_BREAK case 65: YY_RULE_SETUP -#line 133 "lex.l" +#line 134 "lex.l" { return kw_STRING; } YY_BREAK case 66: YY_RULE_SETUP -#line 134 "lex.l" +#line 135 "lex.l" { return kw_SYNTAX; } YY_BREAK case 67: YY_RULE_SETUP -#line 135 "lex.l" +#line 136 "lex.l" { return kw_T61String; } YY_BREAK case 68: YY_RULE_SETUP -#line 136 "lex.l" +#line 137 "lex.l" { return kw_TAGS; } YY_BREAK case 69: YY_RULE_SETUP -#line 137 "lex.l" +#line 138 "lex.l" { return kw_TRUE; } YY_BREAK case 70: YY_RULE_SETUP -#line 138 "lex.l" +#line 139 "lex.l" { return kw_TYPE_IDENTIFIER; } YY_BREAK case 71: YY_RULE_SETUP -#line 139 "lex.l" +#line 140 "lex.l" { return kw_TeletexString; } YY_BREAK case 72: YY_RULE_SETUP -#line 140 "lex.l" +#line 141 "lex.l" { return kw_UNION; } YY_BREAK case 73: YY_RULE_SETUP -#line 141 "lex.l" +#line 142 "lex.l" { return kw_UNIQUE; } YY_BREAK case 74: YY_RULE_SETUP -#line 142 "lex.l" +#line 143 "lex.l" { return kw_UNIVERSAL; } YY_BREAK case 75: YY_RULE_SETUP -#line 143 "lex.l" +#line 144 "lex.l" { return kw_UTCTime; } YY_BREAK case 76: YY_RULE_SETUP -#line 144 "lex.l" +#line 145 "lex.l" { return kw_UTF8String; } YY_BREAK case 77: YY_RULE_SETUP -#line 145 "lex.l" +#line 146 "lex.l" { return kw_UniversalString; } YY_BREAK case 78: YY_RULE_SETUP -#line 146 "lex.l" +#line 147 "lex.l" { return kw_VideotexString; } YY_BREAK case 79: YY_RULE_SETUP -#line 147 "lex.l" +#line 148 "lex.l" { return kw_VisibleString; } YY_BREAK case 80: YY_RULE_SETUP -#line 148 "lex.l" +#line 149 "lex.l" { return kw_WITH; } YY_BREAK case 81: YY_RULE_SETUP -#line 149 "lex.l" +#line 150 "lex.l" { return *yytext; } YY_BREAK case 82: YY_RULE_SETUP -#line 150 "lex.l" +#line 151 "lex.l" { return *yytext; } YY_BREAK case 83: YY_RULE_SETUP -#line 151 "lex.l" +#line 152 "lex.l" { return *yytext; } YY_BREAK case 84: YY_RULE_SETUP -#line 152 "lex.l" +#line 153 "lex.l" { return EEQUAL; } YY_BREAK case 85: YY_RULE_SETUP -#line 153 "lex.l" +#line 154 "lex.l" { int c, start_lineno = lineno; int f = 0; @@ -1559,7 +1562,7 @@ YY_BREAK case 86: YY_RULE_SETUP -#line 172 "lex.l" +#line 173 "lex.l" { int c, start_lineno = lineno; int level = 1; @@ -1603,7 +1606,7 @@ YY_BREAK case 87: YY_RULE_SETUP -#line 212 "lex.l" +#line 213 "lex.l" { int start_lineno = lineno; int c; @@ -1651,9 +1654,9 @@ YY_BREAK case 88: YY_RULE_SETUP -#line 257 "lex.l" +#line 258 "lex.l" { char *e, *y = yytext; - yylval.constant = strtol((const char *)yytext, + yylval.constant = strtoll((const char *)yytext, &e, 0); if(e == y) lex_error_message("malformed constant (%s)", yytext); @@ -1663,7 +1666,7 @@ YY_BREAK case 89: YY_RULE_SETUP -#line 265 "lex.l" +#line 266 "lex.l" { yylval.name = estrdup ((const char *)yytext); return IDENTIFIER; @@ -1671,36 +1674,36 @@ YY_BREAK case 90: YY_RULE_SETUP -#line 269 "lex.l" +#line 270 "lex.l" ; YY_BREAK case 91: /* rule 91 can match eol */ YY_RULE_SETUP -#line 270 "lex.l" +#line 271 "lex.l" { ++lineno; } YY_BREAK case 92: YY_RULE_SETUP -#line 271 "lex.l" +#line 272 "lex.l" { return ELLIPSIS; } YY_BREAK case 93: YY_RULE_SETUP -#line 272 "lex.l" +#line 273 "lex.l" { return RANGE; } YY_BREAK case 94: YY_RULE_SETUP -#line 273 "lex.l" +#line 274 "lex.l" { lex_error_message("Ignoring char(%c)\n", *yytext); } YY_BREAK case 95: YY_RULE_SETUP -#line 274 "lex.l" +#line 275 "lex.l" ECHO; YY_BREAK -#line 1704 "lex.c" +#line 1706 "lex.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1778,7 +1781,7 @@ { (yy_did_buffer_switch_on_eof) = 0; - if ( yywrap( ) ) + if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -1831,6 +1834,7 @@ "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer @@ -1842,9 +1846,9 @@ */ static int yy_get_next_buffer (void) { - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) @@ -1873,7 +1877,7 @@ /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -1886,21 +1890,21 @@ else { - yy_size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { - yy_size_t new_size = b->yy_buf_size * 2; + int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; @@ -1909,11 +1913,12 @@ b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; + b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -1941,7 +1946,7 @@ if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); + yyrestart( yyin ); } else @@ -1955,12 +1960,15 @@ else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; @@ -1976,14 +1984,14 @@ static yy_state_type yy_get_previous_state (void) { - register yy_state_type yy_current_state; - register char *yy_cp; + yy_state_type yy_current_state; + char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -1993,9 +2001,9 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 568 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; @@ -2008,10 +2016,10 @@ */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); - register YY_CHAR yy_c = 1; + YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -2021,17 +2029,19 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 568 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 567); - return yy_is_jam ? 0 : yy_current_state; + return yy_is_jam ? 0 : yy_current_state; } - static void yyunput (int c, register char * yy_bp ) +#ifndef YY_NO_UNPUT + + static void yyunput (int c, char * yy_bp ) { - register char *yy_cp; + char *yy_cp; yy_cp = (yy_c_buf_p); @@ -2041,10 +2051,10 @@ if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) { /* need to shift things up to make room */ /* +2 for EOB chars. */ - register yy_size_t number_to_move = (yy_n_chars) + 2; - register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + int number_to_move = (yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; - register char *source = + char *source = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) @@ -2053,7 +2063,7 @@ yy_cp += (int) (dest - source); yy_bp += (int) (dest - source); YY_CURRENT_BUFFER_LVALUE->yy_n_chars = - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); @@ -2066,6 +2076,8 @@ (yy_c_buf_p) = yy_cp; } +#endif + #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) @@ -2090,7 +2102,7 @@ else { /* need more input */ - yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) @@ -2107,13 +2119,13 @@ */ /* Reset buffer status. */ - yyrestart(yyin ); + yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap( ) ) + if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) @@ -2151,11 +2163,11 @@ if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); + yy_init_buffer( YY_CURRENT_BUFFER, input_file ); + yy_load_buffer_state( ); } /** Switch to a different input buffer. @@ -2183,7 +2195,7 @@ } YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); + yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag @@ -2211,7 +2223,7 @@ { YY_BUFFER_STATE b; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -2220,13 +2232,13 @@ /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; - yy_init_buffer(b,file ); + yy_init_buffer( b, file ); return b; } @@ -2245,15 +2257,11 @@ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); + yyfree( (void *) b->yy_ch_buf ); - yyfree((void *) b ); + yyfree( (void *) b ); } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. @@ -2263,7 +2271,7 @@ { int oerrno = errno; - yy_flush_buffer(b ); + yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; @@ -2306,7 +2314,7 @@ b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); + yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes @@ -2337,7 +2345,7 @@ YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } @@ -2356,7 +2364,7 @@ --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } @@ -2374,15 +2382,15 @@ * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; @@ -2391,7 +2399,7 @@ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; + yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc @@ -2411,7 +2419,7 @@ * @param base the character buffer * @param size the size in bytes of the character buffer * - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { @@ -2421,23 +2429,23 @@ base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return 0; + return NULL; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = 0; + b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer(b ); + yy_switch_to_buffer( b ); return b; } @@ -2450,28 +2458,29 @@ * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +YY_BUFFER_STATE yy_scan_string (const char * yystr ) { - return yy_scan_bytes(yystr,strlen(yystr) ); + return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; - yy_size_t n, i; + yy_size_t n; + int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); @@ -2480,7 +2489,7 @@ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer(buf,n ); + b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); @@ -2496,9 +2505,9 @@ #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) +static void yynoreturn yy_fatal_error (const char* msg ) { - (void) fprintf( stderr, "%s\n", msg ); + fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } @@ -2526,7 +2535,7 @@ */ int yyget_lineno (void) { - + return yylineno; } @@ -2549,7 +2558,7 @@ /** Get the length of the current token. * */ -yy_size_t yyget_leng (void) +int yyget_leng (void) { return yyleng; } @@ -2564,29 +2573,29 @@ } /** Set the current line number. - * @param line_number + * @param _line_number line number * */ -void yyset_lineno (int line_number ) +void yyset_lineno (int _line_number ) { - yylineno = line_number; + yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. - * @param in_str A readable stream. + * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ -void yyset_in (FILE * in_str ) +void yyset_in (FILE * _in_str ) { - yyin = in_str ; + yyin = _in_str ; } -void yyset_out (FILE * out_str ) +void yyset_out (FILE * _out_str ) { - yyout = out_str ; + yyout = _out_str ; } int yyget_debug (void) @@ -2594,9 +2603,9 @@ return yy_flex_debug; } -void yyset_debug (int bdebug ) +void yyset_debug (int _bdebug ) { - yy_flex_debug = bdebug ; + yy_flex_debug = _bdebug ; } static int yy_init_globals (void) @@ -2605,10 +2614,10 @@ * This function is called from yylex_destroy(), so don't allocate here. */ - (yy_buffer_stack) = 0; + (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; + (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; @@ -2617,8 +2626,8 @@ yyin = stdin; yyout = stdout; #else - yyin = (FILE *) 0; - yyout = (FILE *) 0; + yyin = NULL; + yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by @@ -2633,7 +2642,7 @@ /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); + yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } @@ -2654,18 +2663,19 @@ */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +static void yy_flex_strncpy (char* s1, const char * s2, int n ) { - register int i; + + int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) +static int yy_flex_strlen (const char * s ) { - register int n; + int n; for ( n = 0; s[n]; ++n ) ; @@ -2675,11 +2685,12 @@ void *yyalloc (yy_size_t size ) { - return (void *) malloc( size ); + return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { + /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter @@ -2687,27 +2698,24 @@ * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return (void *) realloc( (char *) ptr, size ); + return realloc(ptr, size); } void yyfree (void * ptr ) { - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" -#line 274 "lex.l" - +#line 275 "lex.l" -#ifndef yywrap /* XXX */ int yywrap () { return 1; } -#endif void lex_error_message (const char *format, ...) diff --git a/crypto/heimdal/lib/asn1/lex.l b/crypto/heimdal/lib/asn1/lex.l --- a/crypto/heimdal/lib/asn1/lex.l +++ b/crypto/heimdal/lib/asn1/lex.l @@ -1,6 +1,6 @@ %{ /* - * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan + * Copyright (c) 1997 - 2017 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -40,6 +40,7 @@ #include #include #include +#include #include #ifdef HAVE_UNISTD_H #include @@ -255,7 +256,7 @@ } -?0x[0-9A-Fa-f]+|-?[0-9]+ { char *e, *y = yytext; - yylval.constant = strtol((const char *)yytext, + yylval.constant = strtoll((const char *)yytext, &e, 0); if(e == y) lex_error_message("malformed constant (%s)", yytext); @@ -273,13 +274,11 @@ . { lex_error_message("Ignoring char(%c)\n", *yytext); } %% -#ifndef yywrap /* XXX */ int yywrap () { return 1; } -#endif void lex_error_message (const char *format, ...) diff --git a/crypto/heimdal/lib/asn1/libasn1-exports.def b/crypto/heimdal/lib/asn1/libasn1-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/libasn1-exports.def @@ -0,0 +1,1594 @@ +EXPORTS + APOptions2int + DigestTypes2int + DistributionPointReasonFlags2int + FastOptions2int + KDCOptions2int + KeyUsage2int + SAMFlags2int + TicketFlags2int + _der_timegm + _der_gmtime + _heim_der_set_sort + _heim_fix_dce + _heim_len_int + _heim_len_unsigned + _heim_time2generalizedtime + add_AuthorizationData + add_CRLDistributionPoints + add_DigestAlgorithmIdentifiers + add_ETYPE_INFO + add_ETYPE_INFO2 + add_Extensions + add_GeneralNames + add_METHOD_DATA + add_Principals + asn1_APOptions_units + asn1_DigestTypes_units + asn1_DistributionPointReasonFlags_units + asn1_FastOptions_units + asn1_KDCOptions_units + asn1_KeyUsage_units + asn1_SAMFlags_units + asn1_TicketFlags_units + asn1_oid_id_Userid DATA + asn1_oid_id_aes_128_cbc DATA + asn1_oid_id_aes_192_cbc DATA + asn1_oid_id_aes_256_cbc DATA + asn1_oid_id_at_commonName DATA + asn1_oid_id_at_countryName DATA + asn1_oid_id_at_generationQualifier DATA + asn1_oid_id_at_givenName DATA + asn1_oid_id_at_initials DATA + asn1_oid_id_at_localityName DATA + asn1_oid_id_at_name DATA + asn1_oid_id_at_organizationName DATA + asn1_oid_id_at_organizationalUnitName DATA + asn1_oid_id_at_pseudonym DATA + asn1_oid_id_at_serialNumber DATA + asn1_oid_id_at_stateOrProvinceName DATA + asn1_oid_id_at_streetAddress DATA + asn1_oid_id_at_surname DATA + asn1_oid_id_dhpublicnumber DATA + asn1_oid_id_domainComponent DATA + asn1_oid_id_dsa DATA + asn1_oid_id_dsa_with_sha1 DATA + asn1_oid_id_ecDH DATA + asn1_oid_id_ecMQV DATA + asn1_oid_id_ecPublicKey DATA + asn1_oid_id_ec_group_secp160r1 DATA + asn1_oid_id_ec_group_secp160r2 DATA + asn1_oid_id_ec_group_secp224r1 DATA + asn1_oid_id_ec_group_secp256r1 DATA + asn1_oid_id_ec_group_secp384r1 DATA + asn1_oid_id_ec_group_secp521r1 DATA + asn1_oid_id_ecdsa_with_SHA1 DATA + asn1_oid_id_ecdsa_with_SHA224 DATA + asn1_oid_id_ecdsa_with_SHA256 DATA + asn1_oid_id_ecdsa_with_SHA384 DATA + asn1_oid_id_ecdsa_with_SHA512 DATA + asn1_oid_id_heim_rsa_pkcs1_x509 DATA + asn1_oid_id_ms_cert_enroll_domaincontroller DATA + asn1_oid_id_ms_client_authentication DATA + asn1_oid_id_netscape DATA + asn1_oid_id_netscape_cert_comment DATA + asn1_oid_id_nistAlgorithm DATA + asn1_oid_id_nist_aes_algs DATA + asn1_oid_id_nist_sha_algs DATA + asn1_oid_id_pbeWithSHAAnd128BitRC2_CBC DATA + asn1_oid_id_pbeWithSHAAnd128BitRC4 DATA + asn1_oid_id_pbeWithSHAAnd2_KeyTripleDES_CBC DATA + asn1_oid_id_pbeWithSHAAnd3_KeyTripleDES_CBC DATA + asn1_oid_id_pbeWithSHAAnd40BitRC4 DATA + asn1_oid_id_pbewithSHAAnd40BitRC2_CBC DATA + asn1_oid_id_pkauthdata DATA + asn1_oid_id_pkcs12_bagtypes DATA + asn1_oid_id_pkcs12_certBag DATA + asn1_oid_id_pkcs12_crlBag DATA + asn1_oid_id_pkcs12_keyBag DATA + asn1_oid_id_pkcs12_pkcs8ShroudedKeyBag DATA + asn1_oid_id_pkcs12_safeContentsBag DATA + asn1_oid_id_pkcs12_secretBag DATA + asn1_oid_id_pkcs1_md2WithRSAEncryption DATA + asn1_oid_id_pkcs1_md5WithRSAEncryption DATA + asn1_oid_id_pkcs1_rsaEncryption DATA + asn1_oid_id_pkcs1_sha1WithRSAEncryption DATA + asn1_oid_id_pkcs1_sha256WithRSAEncryption DATA + asn1_oid_id_pkcs1_sha384WithRSAEncryption DATA + asn1_oid_id_pkcs1_sha512WithRSAEncryption DATA + asn1_oid_id_pkcs2_md2 DATA + asn1_oid_id_pkcs2_md4 DATA + asn1_oid_id_pkcs2_md5 DATA + asn1_oid_id_pkcs3_des_ede3_cbc DATA + asn1_oid_id_pkcs3_rc2_cbc DATA + asn1_oid_id_pkcs3_rc4 DATA + asn1_oid_id_pkcs7 DATA + asn1_oid_id_pkcs7_data DATA + asn1_oid_id_pkcs7_digestedData DATA + asn1_oid_id_pkcs7_encryptedData DATA + asn1_oid_id_pkcs7_envelopedData DATA + asn1_oid_id_pkcs7_signedAndEnvelopedData DATA + asn1_oid_id_pkcs7_signedData DATA + asn1_oid_id_pkcs9_contentType DATA + asn1_oid_id_pkcs9_countersignature DATA + asn1_oid_id_pkcs9_emailAddress DATA + asn1_oid_id_pkcs9_messageDigest DATA + asn1_oid_id_pkcs9_signingTime DATA + asn1_oid_id_pkcs_1 DATA + asn1_oid_id_pkcs_12 DATA + asn1_oid_id_pkcs_12PbeIds DATA + asn1_oid_id_pkcs_2 DATA + asn1_oid_id_pkcs_3 DATA + asn1_oid_id_pkcs_9 DATA + asn1_oid_id_pkcs_9_at_certTypes DATA + asn1_oid_id_pkcs_9_at_certTypes_x509 DATA + asn1_oid_id_pkcs_9_at_friendlyName DATA + asn1_oid_id_pkcs_9_at_localKeyId DATA + asn1_oid_id_pkdhkeydata DATA + asn1_oid_id_pkekuoid DATA + asn1_oid_id_pkinit DATA + asn1_oid_id_pkinit_kdf DATA + asn1_oid_id_pkinit_kdf_ah_sha1 DATA + asn1_oid_id_pkinit_kdf_ah_sha256 DATA + asn1_oid_id_pkinit_kdf_ah_sha512 DATA + asn1_oid_id_pkinit_ms_eku DATA + asn1_oid_id_pkinit_ms_san DATA + asn1_oid_id_pkinit_san DATA + asn1_oid_id_pkix DATA + asn1_oid_id_pkix_kp DATA + asn1_oid_id_pkix_kp_OCSPSigning DATA + asn1_oid_id_pkix_kp_clientAuth DATA + asn1_oid_id_pkix_kp_emailProtection DATA + asn1_oid_id_pkix_kp_serverAuth DATA + asn1_oid_id_pkix_kp_timeStamping DATA + asn1_oid_id_pkix_on DATA + asn1_oid_id_pkix_on_dnsSRV DATA + asn1_oid_id_pkix_on_xmppAddr DATA + asn1_oid_id_pkix_pe DATA + asn1_oid_id_pkix_pe_authorityInfoAccess DATA + asn1_oid_id_pkix_pe_proxyCertInfo DATA + asn1_oid_id_pkix_ppl DATA + asn1_oid_id_pkix_ppl_anyLanguage DATA + asn1_oid_id_pkix_ppl_independent DATA + asn1_oid_id_pkix_ppl_inheritAll DATA + asn1_oid_id_pkkdcekuoid DATA + asn1_oid_id_pkrkeydata DATA + asn1_oid_id_rsa_digestAlgorithm DATA + asn1_oid_id_rsa_digest_md2 DATA + asn1_oid_id_rsa_digest_md4 DATA + asn1_oid_id_rsa_digest_md5 DATA + asn1_oid_id_rsadsi_des_ede3_cbc DATA + asn1_oid_id_rsadsi_encalg DATA + asn1_oid_id_rsadsi_rc2_cbc DATA + asn1_oid_id_secsig_sha_1 DATA + asn1_oid_id_secsig_sha_1WithRSAEncryption DATA + asn1_oid_id_sha224 DATA + asn1_oid_id_sha256 DATA + asn1_oid_id_sha384 DATA + asn1_oid_id_sha512 DATA + asn1_oid_id_uspkicommon_card_id DATA + asn1_oid_id_uspkicommon_piv_interim DATA + asn1_oid_id_x509_ce DATA + asn1_oid_id_x509_ce_authorityKeyIdentifier DATA + asn1_oid_id_x509_ce_basicConstraints DATA + asn1_oid_id_x509_ce_cRLDistributionPoints DATA + asn1_oid_id_x509_ce_cRLNumber DATA + asn1_oid_id_x509_ce_cRLReason DATA + asn1_oid_id_x509_ce_certificateIssuer DATA + asn1_oid_id_x509_ce_certificatePolicies DATA + asn1_oid_id_x509_ce_deltaCRLIndicator DATA + asn1_oid_id_x509_ce_extKeyUsage DATA + asn1_oid_id_x509_ce_freshestCRL DATA + asn1_oid_id_x509_ce_holdInstructionCode DATA + asn1_oid_id_x509_ce_inhibitAnyPolicy DATA + asn1_oid_id_x509_ce_invalidityDate DATA + asn1_oid_id_x509_ce_issuerAltName DATA + asn1_oid_id_x509_ce_issuingDistributionPoint DATA + asn1_oid_id_x509_ce_keyUsage DATA + asn1_oid_id_x509_ce_nameConstraints DATA + asn1_oid_id_x509_ce_policyConstraints DATA + asn1_oid_id_x509_ce_policyMappings DATA + asn1_oid_id_x509_ce_privateKeyUsagePeriod DATA + asn1_oid_id_x509_ce_subjectAltName DATA + asn1_oid_id_x509_ce_subjectDirectoryAttributes DATA + asn1_oid_id_x509_ce_subjectKeyIdentifier DATA + asn1_oid_id_x520_at DATA + asn1_oid_id_x9_57 DATA + copy_AD_AND_OR + copy_AD_IF_RELEVANT + copy_AD_INITIAL_VERIFIED_CAS + copy_AD_KDCIssued + copy_AD_LoginAlias + copy_AD_MANDATORY_FOR_KDC + copy_APOptions + copy_AP_REP + copy_AP_REQ + copy_AS_REP + copy_AS_REQ + copy_AUTHDATA_TYPE + copy_AccessDescription + copy_AlgorithmIdentifier + copy_Attribute + copy_AttributeType + copy_AttributeTypeAndValue + copy_AttributeValue + copy_AuthPack + copy_AuthPack_Win2k + copy_Authenticator + copy_AuthorityInfoAccessSyntax + copy_AuthorityKeyIdentifier + copy_AuthorizationData + copy_AuthorizationDataElement + copy_BaseDistance + copy_BasicConstraints + copy_CKSUMTYPE + copy_CMSAttributes + copy_CMSCBCParameter + copy_CMSEncryptedData + copy_CMSIdentifier + copy_CMSRC2CBCParameter + copy_CMSVersion + copy_CRLCertificateList + copy_CRLDistributionPoints + copy_CRLReason + copy_Certificate + copy_CertificateList + copy_CertificateRevocationLists + copy_CertificateSerialNumber + copy_CertificateSet + copy_Certificates + copy_ChangePasswdDataMS + copy_Checksum + copy_ContentEncryptionAlgorithmIdentifier + copy_ContentInfo + copy_ContentType + copy_DHNonce + copy_DHParameter + copy_DHPublicKey + copy_DHRepInfo + copy_DSAParams + copy_DSAPublicKey + copy_DSASigValue + copy_DigestAlgorithmIdentifier + copy_DigestAlgorithmIdentifiers + copy_DigestError + copy_DigestInfo + copy_DigestInit + copy_DigestInitReply + copy_DigestREP + copy_DigestREQ + copy_DigestRepInner + copy_DigestReqInner + copy_DigestRequest + copy_DigestResponse + copy_DigestTypes + copy_DirectoryString + copy_DistributionPoint + copy_DistributionPointName + copy_DistributionPointReasonFlags + copy_DomainParameters + copy_ECDSA_Sig_Value + copy_ECParameters + copy_ECPoint + copy_ENCTYPE + copy_ETYPE_INFO + copy_ETYPE_INFO2 + copy_ETYPE_INFO2_ENTRY + copy_ETYPE_INFO_ENTRY + copy_EncAPRepPart + copy_EncASRepPart + copy_EncKDCRepPart + copy_EncKrbCredPart + copy_EncKrbPrivPart + copy_EncTGSRepPart + copy_EncTicketPart + copy_EncapsulatedContentInfo + copy_EncryptedContent + copy_EncryptedContentInfo + copy_EncryptedData + copy_EncryptedKey + copy_EncryptionKey + copy_EnvelopedData + copy_EtypeList + copy_ExtKeyUsage + copy_Extension + copy_Extensions + copy_ExternalPrincipalIdentifier + copy_ExternalPrincipalIdentifiers + copy_FastOptions + copy_GeneralName + copy_GeneralNames + copy_GeneralSubtree + copy_GeneralSubtrees + copy_HostAddress + copy_HostAddresses + copy_IssuerAndSerialNumber + copy_KDCDHKeyInfo + copy_KDCDHKeyInfo_Win2k + copy_KDCFastCookie + copy_KDCFastState + copy_KDCOptions + copy_KDC_REP + copy_KDC_REQ + copy_KDC_REQ_BODY + copy_KDFAlgorithmId + copy_KRB5PrincipalName + copy_KRB5SignedPath + copy_KRB5SignedPathData + copy_KRB_CRED + copy_KRB_ERROR + copy_KRB_PRIV + copy_KRB_SAFE + copy_KRB_SAFE_BODY + copy_KX509_ERROR_CODE + copy_KerberosString + copy_KerberosTime + copy_KeyEncryptionAlgorithmIdentifier + copy_KeyIdentifier + copy_KeyTransRecipientInfo + copy_KeyUsage + copy_KrbCredInfo + copy_KrbFastArmor + copy_KrbFastArmoredRep + copy_KrbFastArmoredReq + copy_KrbFastFinished + copy_KrbFastReq + copy_KrbFastResponse + copy_Kx509Request + copy_Kx509Response + copy_LR_TYPE + copy_LastReq + copy_MESSAGE_TYPE + copy_METHOD_DATA + copy_MS_UPN_SAN + copy_MessageDigest + copy_NAME_TYPE + copy_NTLMInit + copy_NTLMInitReply + copy_NTLMReply + copy_NTLMRequest + copy_NTLMRequest2 + copy_NTLMResponse + copy_Name + copy_NameConstraints + copy_OriginatorInfo + copy_OtherName + copy_PADATA_TYPE + copy_PA_DATA + copy_PA_ENC_SAM_RESPONSE_ENC + copy_PA_ENC_TS_ENC + copy_PA_FX_FAST_REPLY + copy_PA_FX_FAST_REQUEST + copy_PA_PAC_REQUEST + copy_PA_PK_AS_REP + copy_PA_PK_AS_REP_BTMM + copy_PA_PK_AS_REP_Win2k + copy_PA_PK_AS_REQ + copy_PA_PK_AS_REQ_Win2k + copy_PA_S4U2Self + copy_PA_SAM_CHALLENGE_2 + copy_PA_SAM_CHALLENGE_2_BODY + copy_PA_SAM_REDIRECT + copy_PA_SAM_RESPONSE_2 + copy_PA_SAM_TYPE + copy_PA_SERVER_REFERRAL_DATA + copy_PA_ServerReferralData + copy_PA_SvrReferralData + copy_PKAuthenticator + copy_PKAuthenticator_Win2k + copy_PKCS12_Attribute + copy_PKCS12_Attributes + copy_PKCS12_AuthenticatedSafe + copy_PKCS12_CertBag + copy_PKCS12_MacData + copy_PKCS12_OctetString + copy_PKCS12_PBEParams + copy_PKCS12_PFX + copy_PKCS12_SafeBag + copy_PKCS12_SafeContents + copy_PKCS8Attributes + copy_PKCS8EncryptedData + copy_PKCS8EncryptedPrivateKeyInfo + copy_PKCS8PrivateKey + copy_PKCS8PrivateKeyAlgorithmIdentifier + copy_PKCS8PrivateKeyInfo + copy_PKCS9_BMPString + copy_PKCS9_friendlyName + copy_PKIXXmppAddr + copy_PROV_SRV_LOCATION + copy_PkinitSP80056AOtherInfo + copy_PkinitSuppPubInfo + copy_Principal + copy_PrincipalName + copy_Principals + copy_ProxyCertInfo + copy_ProxyPolicy + copy_RDNSequence + copy_RSAPrivateKey + copy_RSAPublicKey + copy_Realm + copy_RecipientIdentifier + copy_RecipientInfo + copy_RecipientInfos + copy_RelativeDistinguishedName + copy_ReplyKeyPack + copy_ReplyKeyPack_Win2k + copy_SAMFlags + copy_SignatureAlgorithmIdentifier + copy_SignatureValue + copy_SignedData + copy_SignerIdentifier + copy_SignerInfo + copy_SignerInfos + copy_SubjectKeyIdentifier + copy_SubjectPublicKeyInfo + copy_TBSCRLCertList + copy_TBSCertificate + copy_TD_DH_PARAMETERS + copy_TD_INVALID_CERTIFICATES + copy_TD_TRUSTED_CERTIFIERS + copy_TGS_REP + copy_TGS_REQ + copy_TYPED_DATA + copy_Ticket + copy_TicketFlags + copy_Time + copy_TransitedEncoding + copy_TrustedCA + copy_TrustedCA_Win2k + copy_TypedData + copy_UniqueIdentifier + copy_UnprotectedAttributes + copy_ValidationParms + copy_Validity + copy_Version + copy_heim_any + copy_heim_any_set + copy_krb5int32 + copy_krb5uint32 + decode_AD_AND_OR + decode_AD_IF_RELEVANT + decode_AD_INITIAL_VERIFIED_CAS + decode_AD_KDCIssued + decode_AD_LoginAlias + decode_AD_MANDATORY_FOR_KDC + decode_APOptions + decode_AP_REP + decode_AP_REQ + decode_AS_REP + decode_AS_REQ + decode_AUTHDATA_TYPE + decode_AccessDescription + decode_AlgorithmIdentifier + decode_Attribute + decode_AttributeType + decode_AttributeTypeAndValue + decode_AttributeValue + decode_AuthPack + decode_AuthPack_Win2k + decode_Authenticator + decode_AuthorityInfoAccessSyntax + decode_AuthorityKeyIdentifier + decode_AuthorizationData + decode_AuthorizationDataElement + decode_BaseDistance + decode_BasicConstraints + decode_CKSUMTYPE + decode_CMSAttributes + decode_CMSCBCParameter + decode_CMSEncryptedData + decode_CMSIdentifier + decode_CMSRC2CBCParameter + decode_CMSVersion + decode_CRLCertificateList + decode_CRLDistributionPoints + decode_CRLReason + decode_Certificate + decode_CertificateList + decode_CertificateRevocationLists + decode_CertificateSerialNumber + decode_CertificateSet + decode_Certificates + decode_ChangePasswdDataMS + decode_Checksum + decode_ContentEncryptionAlgorithmIdentifier + decode_ContentInfo + decode_ContentType + decode_DHNonce + decode_DHParameter + decode_DHPublicKey + decode_DHRepInfo + decode_DSAParams + decode_DSAPublicKey + decode_DSASigValue + decode_DigestAlgorithmIdentifier + decode_DigestAlgorithmIdentifiers + decode_DigestError + decode_DigestInfo + decode_DigestInit + decode_DigestInitReply + decode_DigestREP + decode_DigestREQ + decode_DigestRepInner + decode_DigestReqInner + decode_DigestRequest + decode_DigestResponse + decode_DigestTypes + decode_DirectoryString + decode_DistributionPoint + decode_DistributionPointName + decode_DistributionPointReasonFlags + decode_DomainParameters + decode_ECDSA_Sig_Value + decode_ECParameters + decode_ECPoint + decode_ENCTYPE + decode_ETYPE_INFO + decode_ETYPE_INFO2 + decode_ETYPE_INFO2_ENTRY + decode_ETYPE_INFO_ENTRY + decode_EncAPRepPart + decode_EncASRepPart + decode_EncKDCRepPart + decode_EncKrbCredPart + decode_EncKrbPrivPart + decode_EncTGSRepPart + decode_EncTicketPart + decode_EncapsulatedContentInfo + decode_EncryptedContent + decode_EncryptedContentInfo + decode_EncryptedData + decode_EncryptedKey + decode_EncryptionKey + decode_EnvelopedData + decode_EtypeList + decode_ExtKeyUsage + decode_Extension + decode_Extensions + decode_ExternalPrincipalIdentifier + decode_ExternalPrincipalIdentifiers + decode_FastOptions + decode_GeneralName + decode_GeneralNames + decode_GeneralSubtree + decode_GeneralSubtrees + decode_HostAddress + decode_HostAddresses + decode_IssuerAndSerialNumber + decode_KDCDHKeyInfo + decode_KDCDHKeyInfo_Win2k + decode_KDCFastCookie + decode_KDCFastState + decode_KDCOptions + decode_KDC_REP + decode_KDC_REQ + decode_KDC_REQ_BODY + decode_KDFAlgorithmId + decode_KRB5PrincipalName + decode_KRB5SignedPath + decode_KRB5SignedPathData + decode_KRB_CRED + decode_KRB_ERROR + decode_KRB_PRIV + decode_KRB_SAFE + decode_KRB_SAFE_BODY + decode_KX509_ERROR_CODE + decode_KerberosString + decode_KerberosTime + decode_KeyEncryptionAlgorithmIdentifier + decode_KeyIdentifier + decode_KeyTransRecipientInfo + decode_KeyUsage + decode_KrbCredInfo + decode_KrbFastArmor + decode_KrbFastArmoredRep + decode_KrbFastArmoredReq + decode_KrbFastFinished + decode_KrbFastReq + decode_KrbFastResponse + decode_Kx509Request + decode_Kx509Response + decode_LR_TYPE + decode_LastReq + decode_MESSAGE_TYPE + decode_METHOD_DATA + decode_MS_UPN_SAN + decode_MessageDigest + decode_NAME_TYPE + decode_NTLMInit + decode_NTLMInitReply + decode_NTLMReply + decode_NTLMRequest + decode_NTLMRequest2 + decode_NTLMResponse + decode_Name + decode_NameConstraints + decode_OriginatorInfo + decode_OtherName + decode_PADATA_TYPE + decode_PA_DATA + decode_PA_ENC_SAM_RESPONSE_ENC + decode_PA_ENC_TS_ENC + decode_PA_FX_FAST_REPLY + decode_PA_FX_FAST_REQUEST + decode_PA_PAC_REQUEST + decode_PA_PK_AS_REP + decode_PA_PK_AS_REP_BTMM + decode_PA_PK_AS_REP_Win2k + decode_PA_PK_AS_REQ + decode_PA_PK_AS_REQ_Win2k + decode_PA_S4U2Self + decode_PA_SAM_CHALLENGE_2 + decode_PA_SAM_CHALLENGE_2_BODY + decode_PA_SAM_REDIRECT + decode_PA_SAM_RESPONSE_2 + decode_PA_SAM_TYPE + decode_PA_SERVER_REFERRAL_DATA + decode_PA_ServerReferralData + decode_PA_SvrReferralData + decode_PKAuthenticator + decode_PKAuthenticator_Win2k + decode_PKCS12_Attribute + decode_PKCS12_Attributes + decode_PKCS12_AuthenticatedSafe + decode_PKCS12_CertBag + decode_PKCS12_MacData + decode_PKCS12_OctetString + decode_PKCS12_PBEParams + decode_PKCS12_PFX + decode_PKCS12_SafeBag + decode_PKCS12_SafeContents + decode_PKCS8Attributes + decode_PKCS8EncryptedData + decode_PKCS8EncryptedPrivateKeyInfo + decode_PKCS8PrivateKey + decode_PKCS8PrivateKeyAlgorithmIdentifier + decode_PKCS8PrivateKeyInfo + decode_PKCS9_BMPString + decode_PKCS9_friendlyName + decode_PKIXXmppAddr + decode_PROV_SRV_LOCATION + decode_PkinitSP80056AOtherInfo + decode_PkinitSuppPubInfo + decode_Principal + decode_PrincipalName + decode_Principals + decode_ProxyCertInfo + decode_ProxyPolicy + decode_RDNSequence + decode_RSAPrivateKey + decode_RSAPublicKey + decode_Realm + decode_RecipientIdentifier + decode_RecipientInfo + decode_RecipientInfos + decode_RelativeDistinguishedName + decode_ReplyKeyPack + decode_ReplyKeyPack_Win2k + decode_SAMFlags + decode_SignatureAlgorithmIdentifier + decode_SignatureValue + decode_SignedData + decode_SignerIdentifier + decode_SignerInfo + decode_SignerInfos + decode_SubjectKeyIdentifier + decode_SubjectPublicKeyInfo + decode_TBSCRLCertList + decode_TBSCertificate + decode_TD_DH_PARAMETERS + decode_TD_INVALID_CERTIFICATES + decode_TD_TRUSTED_CERTIFIERS + decode_TGS_REP + decode_TGS_REQ + decode_TYPED_DATA + decode_Ticket + decode_TicketFlags + decode_Time + decode_TransitedEncoding + decode_TrustedCA + decode_TrustedCA_Win2k + decode_TypedData + decode_UniqueIdentifier + decode_UnprotectedAttributes + decode_ValidationParms + decode_Validity + decode_Version + decode_heim_any + decode_heim_any_set + decode_krb5int32 + decode_krb5uint32 + der_copy_bit_string + der_copy_bmp_string + der_copy_general_string + der_copy_generalized_time + der_copy_heim_integer + der_copy_ia5_string + der_copy_integer + der_copy_integer64 + der_copy_octet_string + der_copy_oid + der_copy_printable_string + der_copy_universal_string + der_copy_unsigned + der_copy_unsigned64 + der_copy_utctime + der_copy_utf8string + der_copy_visible_string + der_free_bit_string + der_free_bmp_string + der_free_general_string + der_free_generalized_time + der_free_heim_integer + der_free_ia5_string + der_free_integer + der_free_integer64 + der_free_octet_string + der_free_oid + der_free_printable_string + der_free_universal_string + der_free_unsigned + der_free_unsigned64 + der_free_utctime + der_free_utf8string + der_free_visible_string + der_get_bit_string + der_get_bmp_string + der_get_boolean + der_get_class_name + der_get_class_num + der_get_general_string + der_get_generalized_time + der_get_heim_integer + der_get_ia5_string + der_get_integer + der_get_integer64 + der_get_length + der_get_octet_string + der_get_octet_string_ber + der_get_oid + der_get_printable_string + der_get_tag + der_get_tag_name + der_get_tag_num + der_get_type_name + der_get_type_num + der_get_universal_string + der_get_unsigned + der_get_unsigned64 + der_get_utctime + der_get_utf8string + der_get_visible_string + der_heim_bit_string_cmp + der_heim_bmp_string_cmp + der_heim_integer_cmp + der_heim_octet_string_cmp + der_heim_oid_cmp + der_heim_universal_string_cmp + der_ia5_string_cmp + der_length_bit_string + der_length_bmp_string + der_length_boolean + der_length_enumerated + der_length_general_string + der_length_generalized_time + der_length_heim_integer + der_length_ia5_string + der_length_integer + der_length_integer64 + der_length_len + der_length_octet_string + der_length_oid + der_length_printable_string + der_length_tag + der_length_universal_string + der_length_unsigned + der_length_unsigned64 + der_length_utctime + der_length_utf8string + der_length_visible_string + der_match_tag + der_match_tag2 + der_match_tag_and_length + der_parse_heim_oid + der_parse_hex_heim_integer + der_print_heim_oid + der_print_hex_heim_integer + der_printable_string_cmp + der_put_bit_string + der_put_bmp_string + der_put_boolean + der_put_general_string + der_put_generalized_time + der_put_heim_integer + der_put_ia5_string + der_put_integer + der_put_integer64 + der_put_length + der_put_length_and_tag + der_put_octet_string + der_put_oid + der_put_printable_string + der_put_tag + der_put_universal_string + der_put_unsigned + der_put_unsigned64 + der_put_utctime + der_put_utf8string + der_put_visible_string + encode_AD_AND_OR + encode_AD_IF_RELEVANT + encode_AD_INITIAL_VERIFIED_CAS + encode_AD_KDCIssued + encode_AD_LoginAlias + encode_AD_MANDATORY_FOR_KDC + encode_APOptions + encode_AP_REP + encode_AP_REQ + encode_AS_REP + encode_AS_REQ + encode_AUTHDATA_TYPE + encode_AccessDescription + encode_AlgorithmIdentifier + encode_Attribute + encode_AttributeType + encode_AttributeTypeAndValue + encode_AttributeValue + encode_AuthPack + encode_AuthPack_Win2k + encode_Authenticator + encode_AuthorityInfoAccessSyntax + encode_AuthorityKeyIdentifier + encode_AuthorizationData + encode_AuthorizationDataElement + encode_BaseDistance + encode_BasicConstraints + encode_CKSUMTYPE + encode_CMSAttributes + encode_CMSCBCParameter + encode_CMSEncryptedData + encode_CMSIdentifier + encode_CMSRC2CBCParameter + encode_CMSVersion + encode_CRLCertificateList + encode_CRLDistributionPoints + encode_CRLReason + encode_Certificate + encode_CertificateList + encode_CertificateRevocationLists + encode_CertificateSerialNumber + encode_CertificateSet + encode_Certificates + encode_ChangePasswdDataMS + encode_Checksum + encode_ContentEncryptionAlgorithmIdentifier + encode_ContentInfo + encode_ContentType + encode_DHNonce + encode_DHParameter + encode_DHPublicKey + encode_DHRepInfo + encode_DSAParams + encode_DSAPublicKey + encode_DSASigValue + encode_DigestAlgorithmIdentifier + encode_DigestAlgorithmIdentifiers + encode_DigestError + encode_DigestInfo + encode_DigestInit + encode_DigestInitReply + encode_DigestREP + encode_DigestREQ + encode_DigestRepInner + encode_DigestReqInner + encode_DigestRequest + encode_DigestResponse + encode_DigestTypes + encode_DirectoryString + encode_DistributionPoint + encode_DistributionPointName + encode_DistributionPointReasonFlags + encode_DomainParameters + encode_ECDSA_Sig_Value + encode_ECParameters + encode_ECPoint + encode_ENCTYPE + encode_ETYPE_INFO + encode_ETYPE_INFO2 + encode_ETYPE_INFO2_ENTRY + encode_ETYPE_INFO_ENTRY + encode_EncAPRepPart + encode_EncASRepPart + encode_EncKDCRepPart + encode_EncKrbCredPart + encode_EncKrbPrivPart + encode_EncTGSRepPart + encode_EncTicketPart + encode_EncapsulatedContentInfo + encode_EncryptedContent + encode_EncryptedContentInfo + encode_EncryptedData + encode_EncryptedKey + encode_EncryptionKey + encode_EnvelopedData + encode_EtypeList + encode_ExtKeyUsage + encode_Extension + encode_Extensions + encode_ExternalPrincipalIdentifier + encode_ExternalPrincipalIdentifiers + encode_FastOptions + encode_GeneralName + encode_GeneralNames + encode_GeneralSubtree + encode_GeneralSubtrees + encode_HostAddress + encode_HostAddresses + encode_IssuerAndSerialNumber + encode_KDCDHKeyInfo + encode_KDCDHKeyInfo_Win2k + encode_KDCFastCookie + encode_KDCFastState + encode_KDCOptions + encode_KDC_REP + encode_KDC_REQ + encode_KDC_REQ_BODY + encode_KDFAlgorithmId + encode_KRB5PrincipalName + encode_KRB5SignedPath + encode_KRB5SignedPathData + encode_KRB_CRED + encode_KRB_ERROR + encode_KRB_PRIV + encode_KRB_SAFE + encode_KRB_SAFE_BODY + encode_KX509_ERROR_CODE + encode_KerberosString + encode_KerberosTime + encode_KeyEncryptionAlgorithmIdentifier + encode_KeyIdentifier + encode_KeyTransRecipientInfo + encode_KeyUsage + encode_KrbCredInfo + encode_KrbFastArmor + encode_KrbFastArmoredRep + encode_KrbFastArmoredReq + encode_KrbFastFinished + encode_KrbFastReq + encode_KrbFastResponse + encode_Kx509Request + encode_Kx509Response + encode_LR_TYPE + encode_LastReq + encode_MESSAGE_TYPE + encode_METHOD_DATA + encode_MS_UPN_SAN + encode_MessageDigest + encode_NAME_TYPE + encode_NTLMInit + encode_NTLMInitReply + encode_NTLMReply + encode_NTLMRequest + encode_NTLMRequest2 + encode_NTLMResponse + encode_Name + encode_NameConstraints + encode_OriginatorInfo + encode_OtherName + encode_PADATA_TYPE + encode_PA_DATA + encode_PA_ENC_SAM_RESPONSE_ENC + encode_PA_ENC_TS_ENC + encode_PA_FX_FAST_REPLY + encode_PA_FX_FAST_REQUEST + encode_PA_PAC_REQUEST + encode_PA_PK_AS_REP + encode_PA_PK_AS_REP_BTMM + encode_PA_PK_AS_REP_Win2k + encode_PA_PK_AS_REQ + encode_PA_PK_AS_REQ_Win2k + encode_PA_S4U2Self + encode_PA_SAM_CHALLENGE_2 + encode_PA_SAM_CHALLENGE_2_BODY + encode_PA_SAM_REDIRECT + encode_PA_SAM_RESPONSE_2 + encode_PA_SAM_TYPE + encode_PA_SERVER_REFERRAL_DATA + encode_PA_ServerReferralData + encode_PA_SvrReferralData + encode_PKAuthenticator + encode_PKAuthenticator_Win2k + encode_PKCS12_Attribute + encode_PKCS12_Attributes + encode_PKCS12_AuthenticatedSafe + encode_PKCS12_CertBag + encode_PKCS12_MacData + encode_PKCS12_OctetString + encode_PKCS12_PBEParams + encode_PKCS12_PFX + encode_PKCS12_SafeBag + encode_PKCS12_SafeContents + encode_PKCS8Attributes + encode_PKCS8EncryptedData + encode_PKCS8EncryptedPrivateKeyInfo + encode_PKCS8PrivateKey + encode_PKCS8PrivateKeyAlgorithmIdentifier + encode_PKCS8PrivateKeyInfo + encode_PKCS9_BMPString + encode_PKCS9_friendlyName + encode_PKIXXmppAddr + encode_PROV_SRV_LOCATION + encode_PkinitSP80056AOtherInfo + encode_PkinitSuppPubInfo + encode_Principal + encode_PrincipalName + encode_Principals + encode_ProxyCertInfo + encode_ProxyPolicy + encode_RDNSequence + encode_RSAPrivateKey + encode_RSAPublicKey + encode_Realm + encode_RecipientIdentifier + encode_RecipientInfo + encode_RecipientInfos + encode_RelativeDistinguishedName + encode_ReplyKeyPack + encode_ReplyKeyPack_Win2k + encode_SAMFlags + encode_SignatureAlgorithmIdentifier + encode_SignatureValue + encode_SignedData + encode_SignerIdentifier + encode_SignerInfo + encode_SignerInfos + encode_SubjectKeyIdentifier + encode_SubjectPublicKeyInfo + encode_TBSCRLCertList + encode_TBSCertificate + encode_TD_DH_PARAMETERS + encode_TD_INVALID_CERTIFICATES + encode_TD_TRUSTED_CERTIFIERS + encode_TGS_REP + encode_TGS_REQ + encode_TYPED_DATA + encode_Ticket + encode_TicketFlags + encode_Time + encode_TransitedEncoding + encode_TrustedCA + encode_TrustedCA_Win2k + encode_TypedData + encode_UniqueIdentifier + encode_UnprotectedAttributes + encode_ValidationParms + encode_Validity + encode_Version + encode_heim_any + encode_heim_any_set + encode_krb5int32 + encode_krb5uint32 + free_AD_AND_OR + free_AD_IF_RELEVANT + free_AD_INITIAL_VERIFIED_CAS + free_AD_KDCIssued + free_AD_LoginAlias + free_AD_MANDATORY_FOR_KDC + free_APOptions + free_AP_REP + free_AP_REQ + free_AS_REP + free_AS_REQ + free_AUTHDATA_TYPE + free_AccessDescription + free_AlgorithmIdentifier + free_Attribute + free_AttributeType + free_AttributeTypeAndValue + free_AttributeValue + free_AuthPack + free_AuthPack_Win2k + free_Authenticator + free_AuthorityInfoAccessSyntax + free_AuthorityKeyIdentifier + free_AuthorizationData + free_AuthorizationDataElement + free_BaseDistance + free_BasicConstraints + free_CKSUMTYPE + free_CMSAttributes + free_CMSCBCParameter + free_CMSEncryptedData + free_CMSIdentifier + free_CMSRC2CBCParameter + free_CMSVersion + free_CRLCertificateList + free_CRLDistributionPoints + free_CRLReason + free_Certificate + free_CertificateList + free_CertificateRevocationLists + free_CertificateSerialNumber + free_CertificateSet + free_Certificates + free_ChangePasswdDataMS + free_Checksum + free_ContentEncryptionAlgorithmIdentifier + free_ContentInfo + free_ContentType + free_DHNonce + free_DHParameter + free_DHPublicKey + free_DHRepInfo + free_DSAParams + free_DSAPublicKey + free_DSASigValue + free_DigestAlgorithmIdentifier + free_DigestAlgorithmIdentifiers + free_DigestError + free_DigestInfo + free_DigestInit + free_DigestInitReply + free_DigestREP + free_DigestREQ + free_DigestRepInner + free_DigestReqInner + free_DigestRequest + free_DigestResponse + free_DigestTypes + free_DirectoryString + free_DistributionPoint + free_DistributionPointName + free_DistributionPointReasonFlags + free_DomainParameters + free_ECDSA_Sig_Value + free_ECParameters + free_ECPoint + free_ENCTYPE + free_ETYPE_INFO + free_ETYPE_INFO2 + free_ETYPE_INFO2_ENTRY + free_ETYPE_INFO_ENTRY + free_EncAPRepPart + free_EncASRepPart + free_EncKDCRepPart + free_EncKrbCredPart + free_EncKrbPrivPart + free_EncTGSRepPart + free_EncTicketPart + free_EncapsulatedContentInfo + free_EncryptedContent + free_EncryptedContentInfo + free_EncryptedData + free_EncryptedKey + free_EncryptionKey + free_EnvelopedData + free_EtypeList + free_ExtKeyUsage + free_Extension + free_Extensions + free_ExternalPrincipalIdentifier + free_ExternalPrincipalIdentifiers + free_FastOptions + free_GeneralName + free_GeneralNames + free_GeneralSubtree + free_GeneralSubtrees + free_HostAddress + free_HostAddresses + free_IssuerAndSerialNumber + free_KDCDHKeyInfo + free_KDCDHKeyInfo_Win2k + free_KDCFastCookie + free_KDCFastState + free_KDCOptions + free_KDC_REP + free_KDC_REQ + free_KDC_REQ_BODY + free_KDFAlgorithmId + free_KRB5PrincipalName + free_KRB5SignedPath + free_KRB5SignedPathData + free_KRB_CRED + free_KRB_ERROR + free_KRB_PRIV + free_KRB_SAFE + free_KRB_SAFE_BODY + free_KX509_ERROR_CODE + free_KerberosString + free_KerberosTime + free_KeyEncryptionAlgorithmIdentifier + free_KeyIdentifier + free_KeyTransRecipientInfo + free_KeyUsage + free_KrbCredInfo + free_KrbFastArmor + free_KrbFastArmoredRep + free_KrbFastArmoredReq + free_KrbFastFinished + free_KrbFastReq + free_KrbFastResponse + free_Kx509Request + free_Kx509Response + free_LR_TYPE + free_LastReq + free_MESSAGE_TYPE + free_METHOD_DATA + free_MS_UPN_SAN + free_MessageDigest + free_NAME_TYPE + free_NTLMInit + free_NTLMInitReply + free_NTLMReply + free_NTLMRequest + free_NTLMRequest2 + free_NTLMResponse + free_Name + free_NameConstraints + free_OriginatorInfo + free_OtherName + free_PADATA_TYPE + free_PA_DATA + free_PA_ENC_SAM_RESPONSE_ENC + free_PA_ENC_TS_ENC + free_PA_FX_FAST_REPLY + free_PA_FX_FAST_REQUEST + free_PA_PAC_REQUEST + free_PA_PK_AS_REP + free_PA_PK_AS_REP_BTMM + free_PA_PK_AS_REP_Win2k + free_PA_PK_AS_REQ + free_PA_PK_AS_REQ_Win2k + free_PA_S4U2Self + free_PA_SAM_CHALLENGE_2 + free_PA_SAM_CHALLENGE_2_BODY + free_PA_SAM_REDIRECT + free_PA_SAM_RESPONSE_2 + free_PA_SAM_TYPE + free_PA_SERVER_REFERRAL_DATA + free_PA_ServerReferralData + free_PA_SvrReferralData + free_PKAuthenticator + free_PKAuthenticator_Win2k + free_PKCS12_Attribute + free_PKCS12_Attributes + free_PKCS12_AuthenticatedSafe + free_PKCS12_CertBag + free_PKCS12_MacData + free_PKCS12_OctetString + free_PKCS12_PBEParams + free_PKCS12_PFX + free_PKCS12_SafeBag + free_PKCS12_SafeContents + free_PKCS8Attributes + free_PKCS8EncryptedData + free_PKCS8EncryptedPrivateKeyInfo + free_PKCS8PrivateKey + free_PKCS8PrivateKeyAlgorithmIdentifier + free_PKCS8PrivateKeyInfo + free_PKCS9_BMPString + free_PKCS9_friendlyName + free_PKIXXmppAddr + free_PROV_SRV_LOCATION + free_PkinitSP80056AOtherInfo + free_PkinitSuppPubInfo + free_Principal + free_PrincipalName + free_Principals + free_ProxyCertInfo + free_ProxyPolicy + free_RDNSequence + free_RSAPrivateKey + free_RSAPublicKey + free_Realm + free_RecipientIdentifier + free_RecipientInfo + free_RecipientInfos + free_RelativeDistinguishedName + free_ReplyKeyPack + free_ReplyKeyPack_Win2k + free_SAMFlags + free_SignatureAlgorithmIdentifier + free_SignatureValue + free_SignedData + free_SignerIdentifier + free_SignerInfo + free_SignerInfos + free_SubjectKeyIdentifier + free_SubjectPublicKeyInfo + free_TBSCRLCertList + free_TBSCertificate + free_TD_DH_PARAMETERS + free_TD_INVALID_CERTIFICATES + free_TD_TRUSTED_CERTIFIERS + free_TGS_REP + free_TGS_REQ + free_TYPED_DATA + free_Ticket + free_TicketFlags + free_Time + free_TransitedEncoding + free_TrustedCA + free_TrustedCA_Win2k + free_TypedData + free_UniqueIdentifier + free_UnprotectedAttributes + free_ValidationParms + free_Validity + free_Version + free_heim_any + free_heim_any_set + free_krb5int32 + free_krb5uint32 + heim_any_cmp + initialize_asn1_error_table + initialize_asn1_error_table_r + int2APOptions + int2DigestTypes + int2DistributionPointReasonFlags + int2FastOptions + int2KDCOptions + int2KeyUsage + int2SAMFlags + int2TicketFlags + length_AD_AND_OR + length_AD_IF_RELEVANT + length_AD_INITIAL_VERIFIED_CAS + length_AD_KDCIssued + length_AD_LoginAlias + length_AD_MANDATORY_FOR_KDC + length_APOptions + length_AP_REP + length_AP_REQ + length_AS_REP + length_AS_REQ + length_AUTHDATA_TYPE + length_AccessDescription + length_AlgorithmIdentifier + length_Attribute + length_AttributeType + length_AttributeTypeAndValue + length_AttributeValue + length_AuthPack + length_AuthPack_Win2k + length_Authenticator + length_AuthorityInfoAccessSyntax + length_AuthorityKeyIdentifier + length_AuthorizationData + length_AuthorizationDataElement + length_BaseDistance + length_BasicConstraints + length_CKSUMTYPE + length_CMSAttributes + length_CMSCBCParameter + length_CMSEncryptedData + length_CMSIdentifier + length_CMSRC2CBCParameter + length_CMSVersion + length_CRLCertificateList + length_CRLDistributionPoints + length_CRLReason + length_Certificate + length_CertificateList + length_CertificateRevocationLists + length_CertificateSerialNumber + length_CertificateSet + length_Certificates + length_ChangePasswdDataMS + length_Checksum + length_ContentEncryptionAlgorithmIdentifier + length_ContentInfo + length_ContentType + length_DHNonce + length_DHParameter + length_DHPublicKey + length_DHRepInfo + length_DSAParams + length_DSAPublicKey + length_DSASigValue + length_DigestAlgorithmIdentifier + length_DigestAlgorithmIdentifiers + length_DigestError + length_DigestInfo + length_DigestInit + length_DigestInitReply + length_DigestREP + length_DigestREQ + length_DigestRepInner + length_DigestReqInner + length_DigestRequest + length_DigestResponse + length_DigestTypes + length_DirectoryString + length_DistributionPoint + length_DistributionPointName + length_DistributionPointReasonFlags + length_DomainParameters + length_ECDSA_Sig_Value + length_ECParameters + length_ECPoint + length_ENCTYPE + length_ETYPE_INFO + length_ETYPE_INFO2 + length_ETYPE_INFO2_ENTRY + length_ETYPE_INFO_ENTRY + length_EncAPRepPart + length_EncASRepPart + length_EncKDCRepPart + length_EncKrbCredPart + length_EncKrbPrivPart + length_EncTGSRepPart + length_EncTicketPart + length_EncapsulatedContentInfo + length_EncryptedContent + length_EncryptedContentInfo + length_EncryptedData + length_EncryptedKey + length_EncryptionKey + length_EnvelopedData + length_EtypeList + length_ExtKeyUsage + length_Extension + length_Extensions + length_ExternalPrincipalIdentifier + length_ExternalPrincipalIdentifiers + length_FastOptions + length_GeneralName + length_GeneralNames + length_GeneralSubtree + length_GeneralSubtrees + length_HostAddress + length_HostAddresses + length_IssuerAndSerialNumber + length_KDCDHKeyInfo + length_KDCDHKeyInfo_Win2k + length_KDCFastCookie + length_KDCFastState + length_KDCOptions + length_KDC_REP + length_KDC_REQ + length_KDC_REQ_BODY + length_KDFAlgorithmId + length_KRB5PrincipalName + length_KRB5SignedPath + length_KRB5SignedPathData + length_KRB_CRED + length_KRB_ERROR + length_KRB_PRIV + length_KRB_SAFE + length_KRB_SAFE_BODY + length_KX509_ERROR_CODE + length_KerberosString + length_KerberosTime + length_KeyEncryptionAlgorithmIdentifier + length_KeyIdentifier + length_KeyTransRecipientInfo + length_KeyUsage + length_KrbCredInfo + length_KrbFastArmor + length_KrbFastArmoredRep + length_KrbFastArmoredReq + length_KrbFastFinished + length_KrbFastReq + length_KrbFastResponse + length_Kx509Request + length_Kx509Response + length_LR_TYPE + length_LastReq + length_MESSAGE_TYPE + length_METHOD_DATA + length_MS_UPN_SAN + length_MessageDigest + length_NAME_TYPE + length_NTLMInit + length_NTLMInitReply + length_NTLMReply + length_NTLMRequest + length_NTLMRequest2 + length_NTLMResponse + length_Name + length_NameConstraints + length_OriginatorInfo + length_OtherName + length_PADATA_TYPE + length_PA_DATA + length_PA_ENC_SAM_RESPONSE_ENC + length_PA_ENC_TS_ENC + length_PA_FX_FAST_REPLY + length_PA_FX_FAST_REQUEST + length_PA_PAC_REQUEST + length_PA_PK_AS_REP + length_PA_PK_AS_REP_BTMM + length_PA_PK_AS_REP_Win2k + length_PA_PK_AS_REQ + length_PA_PK_AS_REQ_Win2k + length_PA_S4U2Self + length_PA_SAM_CHALLENGE_2 + length_PA_SAM_CHALLENGE_2_BODY + length_PA_SAM_REDIRECT + length_PA_SAM_RESPONSE_2 + length_PA_SAM_TYPE + length_PA_SERVER_REFERRAL_DATA + length_PA_ServerReferralData + length_PA_SvrReferralData + length_PKAuthenticator + length_PKAuthenticator_Win2k + length_PKCS12_Attribute + length_PKCS12_Attributes + length_PKCS12_AuthenticatedSafe + length_PKCS12_CertBag + length_PKCS12_MacData + length_PKCS12_OctetString + length_PKCS12_PBEParams + length_PKCS12_PFX + length_PKCS12_SafeBag + length_PKCS12_SafeContents + length_PKCS8Attributes + length_PKCS8EncryptedData + length_PKCS8EncryptedPrivateKeyInfo + length_PKCS8PrivateKey + length_PKCS8PrivateKeyAlgorithmIdentifier + length_PKCS8PrivateKeyInfo + length_PKCS9_BMPString + length_PKCS9_friendlyName + length_PKIXXmppAddr + length_PROV_SRV_LOCATION + length_PkinitSP80056AOtherInfo + length_PkinitSuppPubInfo + length_Principal + length_PrincipalName + length_Principals + length_ProxyCertInfo + length_ProxyPolicy + length_RDNSequence + length_RSAPrivateKey + length_RSAPublicKey + length_Realm + length_RecipientIdentifier + length_RecipientInfo + length_RecipientInfos + length_RelativeDistinguishedName + length_ReplyKeyPack + length_ReplyKeyPack_Win2k + length_SAMFlags + length_SignatureAlgorithmIdentifier + length_SignatureValue + length_SignedData + length_SignerIdentifier + length_SignerInfo + length_SignerInfos + length_SubjectKeyIdentifier + length_SubjectPublicKeyInfo + length_TBSCRLCertList + length_TBSCertificate + length_TD_DH_PARAMETERS + length_TD_INVALID_CERTIFICATES + length_TD_TRUSTED_CERTIFIERS + length_TGS_REP + length_TGS_REQ + length_TYPED_DATA + length_Ticket + length_TicketFlags + length_Time + length_TransitedEncoding + length_TrustedCA + length_TrustedCA_Win2k + length_TypedData + length_UniqueIdentifier + length_UnprotectedAttributes + length_ValidationParms + length_Validity + length_Version + length_heim_any + length_heim_any_set + length_krb5int32 + length_krb5uint32 + remove_AuthorizationData + remove_CRLDistributionPoints + remove_DigestAlgorithmIdentifiers + remove_ETYPE_INFO + remove_ETYPE_INFO2 + remove_Extensions + remove_GeneralNames + remove_METHOD_DATA + remove_Principals diff --git a/crypto/heimdal/lib/asn1/main.c b/crypto/heimdal/lib/asn1/main.c --- a/crypto/heimdal/lib/asn1/main.c +++ b/crypto/heimdal/lib/asn1/main.c @@ -35,8 +35,6 @@ #include #include "lex.h" -RCSID("$Id$"); - extern FILE *yyin; static getarg_strings preserve; @@ -62,24 +60,31 @@ return 0; } +const char *fuzzer_string = ""; +int fuzzer_flag; int support_ber; int template_flag; int rfc1510_bitstring; int one_code_file; char *option_file; +int parse_units_flag = 1; +char *type_file_string = "krb5-types.h"; int version_flag; int help_flag; struct getargs args[] = { - { "template", 0, arg_flag, &template_flag }, - { "encode-rfc1510-bit-string", 0, arg_flag, &rfc1510_bitstring }, - { "decode-dce-ber", 0, arg_flag, &support_ber }, - { "support-ber", 0, arg_flag, &support_ber }, - { "preserve-binary", 0, arg_strings, &preserve }, - { "sequence", 0, arg_strings, &seq }, - { "one-code-file", 0, arg_flag, &one_code_file }, - { "option-file", 0, arg_string, &option_file }, - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "fuzzer", 0, arg_flag, &fuzzer_flag, NULL, NULL }, + { "template", 0, arg_flag, &template_flag, NULL, NULL }, + { "encode-rfc1510-bit-string", 0, arg_flag, &rfc1510_bitstring, NULL, NULL }, + { "decode-dce-ber", 0, arg_flag, &support_ber, NULL, NULL }, + { "support-ber", 0, arg_flag, &support_ber, NULL, NULL }, + { "preserve-binary", 0, arg_strings, &preserve, NULL, NULL }, + { "sequence", 0, arg_strings, &seq, NULL, NULL }, + { "one-code-file", 0, arg_flag, &one_code_file, NULL, NULL }, + { "option-file", 0, arg_string, &option_file, NULL, NULL }, + { "parse-units", 0, arg_negative_flag, &parse_units_flag, NULL, NULL }, + { "type-file", 0, arg_string, &type_file_string, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; int num_args = sizeof(args) / sizeof(args[0]); @@ -100,7 +105,7 @@ const char *name = NULL; int optidx = 0; char **arg = NULL; - size_t len = 0, i; + int len = 0, i; setprogname(argv[0]); if(getarg(args, num_args, argc, argv, &optidx)) @@ -180,6 +185,16 @@ } } + if (fuzzer_flag) { + if (!template_flag) { + printf("can't do fuzzer w/o --template"); + exit(1); + } +#ifdef ASN1_FUZZER + fuzzer_string = "_fuzzer"; +#endif + } + init_generate (file, name); diff --git a/crypto/heimdal/lib/asn1/pkinit.asn1 b/crypto/heimdal/lib/asn1/pkinit.asn1 --- a/crypto/heimdal/lib/asn1/pkinit.asn1 +++ b/crypto/heimdal/lib/asn1/pkinit.asn1 @@ -17,6 +17,8 @@ id-pkekuoid OBJECT IDENTIFIER ::= { id-pkinit 4 } id-pkkdcekuoid OBJECT IDENTIFIER ::= { id-pkinit 5 } +id-apple-system-id OBJECT IDENTIFIER ::= { 1 2 840 113635 100 4 4 } + id-pkinit-kdf OBJECT IDENTIFIER ::= { id-pkinit 6 } id-pkinit-kdf-ah-sha1 OBJECT IDENTIFIER ::= { id-pkinit-kdf 1 } id-pkinit-kdf-ah-sha256 OBJECT IDENTIFIER ::= { id-pkinit-kdf 2 } diff --git a/crypto/heimdal/lib/asn1/rfc2459.asn1 b/crypto/heimdal/lib/asn1/rfc2459.asn1 --- a/crypto/heimdal/lib/asn1/rfc2459.asn1 +++ b/crypto/heimdal/lib/asn1/rfc2459.asn1 @@ -88,10 +88,22 @@ iso(1) identified-organization(3) certicom(132) schemes(1) ecmqv(13) } +id-ecdsa-with-SHA512 OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) + ecdsa-with-SHA2(3) 4 } + +id-ecdsa-with-SHA384 OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) + ecdsa-with-SHA2(3) 3 } + id-ecdsa-with-SHA256 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) ecdsa-with-SHA2(3) 2 } +id-ecdsa-with-SHA224 OBJECT IDENTIFIER ::= { + iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) + ecdsa-with-SHA2(3) 1 } + id-ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } @@ -107,6 +119,15 @@ id-ec-group-secp160r2 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) certicom(132) 0 30 } +id-ec-group-secp224r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) 0 33 } + +id-ec-group-secp384r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) 0 34 } + +id-ec-group-secp521r1 OBJECT IDENTIFIER ::= { + iso(1) identified-organization(3) certicom(132) 0 35 } + -- DSA id-x9-57 OBJECT IDENTIFIER ::= { @@ -128,6 +149,8 @@ id-at-streetAddress OBJECT IDENTIFIER ::= { id-x520-at 9 } id-at-organizationName OBJECT IDENTIFIER ::= { id-x520-at 10 } id-at-organizationalUnitName OBJECT IDENTIFIER ::= { id-x520-at 11 } +id-at-title OBJECT IDENTIFIER ::= { id-x520-at 12 } +id-at-description OBJECT IDENTIFIER ::= { id-x520-at 13 } id-at-name OBJECT IDENTIFIER ::= { id-x520-at 41 } id-at-givenName OBJECT IDENTIFIER ::= { id-x520-at 42 } id-at-initials OBJECT IDENTIFIER ::= { id-x520-at 43 } @@ -239,7 +262,7 @@ DomainParameters ::= SEQUENCE { p INTEGER, -- odd prime, p=jq +1 g INTEGER, -- generator, g - q INTEGER, -- factor of p-1 + q INTEGER OPTIONAL, -- factor of p-1 j INTEGER OPTIONAL, -- subgroup factor validationParms ValidationParms OPTIONAL -- ValidationParms } diff --git a/crypto/heimdal/lib/asn1/roken_rename.h b/crypto/heimdal/lib/asn1/roken_rename.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/asn1/roken_rename.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 1998 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef __roken_rename_h__ +#define __roken_rename_h__ + +#ifndef HAVE_STRTOLL +#define strtoll rk_strtoll +#endif +#ifndef HAVE_STRTOULL +#define strtoull rk_strtoull +#endif + +#endif /* __roken_rename_h__ */ diff --git a/crypto/heimdal/lib/asn1/symbol.h b/crypto/heimdal/lib/asn1/symbol.h --- a/crypto/heimdal/lib/asn1/symbol.h +++ b/crypto/heimdal/lib/asn1/symbol.h @@ -78,7 +78,7 @@ } type; union { int booleanvalue; - int integervalue; + int64_t integervalue; char *stringvalue; struct objid *objectidentifiervalue; } u; @@ -109,8 +109,12 @@ }; struct range { - int min; - int max; + /* + * We can't represent unsigned 64-bit ranges because max might be + * negative... + */ + int64_t min; + int64_t max; }; enum ctype { CT_CONTENTS, CT_USER } ; @@ -125,6 +129,7 @@ struct tagtype tag; struct range *range; struct constraint_spec *constraint; + unsigned long id; }; typedef struct type Type; diff --git a/crypto/heimdal/lib/asn1/symbol.c b/crypto/heimdal/lib/asn1/symbol.c --- a/crypto/heimdal/lib/asn1/symbol.c +++ b/crypto/heimdal/lib/asn1/symbol.c @@ -78,7 +78,7 @@ key.name = name; s = (Symbol *) hashtabsearch(htab, (void *) &key); if (s == NULL) { - s = (Symbol *) emalloc(sizeof(*s)); + s = (Symbol *) ecalloc(1, sizeof(*s)); s->name = name; s->gen_name = estrdup(name); output_name(s->gen_name); diff --git a/crypto/heimdal/lib/asn1/template.c b/crypto/heimdal/lib/asn1/template.c --- a/crypto/heimdal/lib/asn1/template.c +++ b/crypto/heimdal/lib/asn1/template.c @@ -3,7 +3,7 @@ * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * - * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * Portions Copyright (c) 2009 - 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -36,17 +36,7 @@ #include "der_locl.h" #include -#if 0 -#define ABORT_ON_ERROR() abort() -#else -#define ABORT_ON_ERROR() do { } while(0) -#endif - -#define DPOC(data,offset) ((const void *)(((const unsigned char *)data) + offset)) -#define DPO(data,offset) ((void *)(((unsigned char *)data) + offset)) - - -static struct asn1_type_func prim[] = { +struct asn1_type_func asn1_template_prim[A1T_NUM_ENTRY] = { #define el(name, type) { \ (asn1_type_encode)der_put_##name, \ (asn1_type_decode)der_get_##name, \ @@ -66,7 +56,9 @@ el(integer, int), el(heim_integer, heim_integer), el(integer, int), + el(integer64, int64_t), el(unsigned, unsigned), + el(unsigned64, uint64_t), el(general_string, heim_general_string), el(octet_string, heim_octet_string), elber(octet_string, heim_octet_string), @@ -89,8 +81,8 @@ #undef elber }; -static size_t -sizeofType(const struct asn1_template *t) +size_t +_asn1_sizeofType(const struct asn1_template *t) { return t->offset; } @@ -106,8 +98,8 @@ */ static void -bmember_get_bit(const unsigned char *p, void *data, - unsigned int bit, size_t size) +_asn1_bmember_get_bit(const unsigned char *p, void *data, + unsigned int bit, size_t size) { unsigned int localbit = bit % 8; if ((*p >> (7 - localbit)) & 1) { @@ -119,8 +111,8 @@ } } -static int -bmember_isset_bit(const void *data, unsigned int bit, size_t size) +int +_asn1_bmember_isset_bit(const void *data, unsigned int bit, size_t size) { #ifdef WORDS_BIGENDIAN if ((*(unsigned int *)data) & (1 << ((size * 8) - bit - 1))) @@ -133,13 +125,13 @@ #endif } -static void -bmember_put_bit(unsigned char *p, const void *data, unsigned int bit, - size_t size, unsigned int *bitset) +void +_asn1_bmember_put_bit(unsigned char *p, const void *data, unsigned int bit, + size_t size, unsigned int *bitset) { unsigned int localbit = bit % 8; - if (bmember_isset_bit(data, bit, size)) { + if (_asn1_bmember_isset_bit(data, bit, size)) { *p |= (1 << (7 - localbit)); if (*bitset == 0) *bitset = (7 - localbit) + 1; @@ -166,19 +158,19 @@ switch (t->tt & A1_OP_MASK) { case A1_OP_TYPE: case A1_OP_TYPE_EXTERN: { - size_t newsize, size; + size_t newsize, elsize; void *el = DPO(data, t->offset); void **pel = (void **)el; if ((t->tt & A1_OP_MASK) == A1_OP_TYPE) { - size = sizeofType(t->ptr); + elsize = _asn1_sizeofType(t->ptr); } else { const struct asn1_type_func *f = t->ptr; - size = f->size; + elsize = f->size; } if (t->tt & A1_FLAG_OPTIONAL) { - *pel = calloc(1, size); + *pel = calloc(1, elsize); if (*pel == NULL) return ENOMEM; el = *pel; @@ -250,7 +242,7 @@ if (t->tt & A1_FLAG_OPTIONAL) { void **el = (void **)data; - size_t ellen = sizeofType(t->ptr); + size_t ellen = _asn1_sizeofType(t->ptr); *el = calloc(1, ellen); if (*el == NULL) @@ -262,8 +254,13 @@ if (ret) return ret; - if (newsize != datalen) + if (is_indefinite) { + /* If we use indefinite encoding, the newsize is the datasize. */ + datalen = newsize; + } else if (newsize != datalen) { + /* Check for hidden data that might be after the real tag */ return ASN1_EXTRA_DATA; + } len -= datalen; p += datalen; @@ -300,12 +297,12 @@ if (flags & A1_PF_INDEFINTE) type++; - if (type >= sizeof(prim)/sizeof(prim[0])) { + if (type >= sizeof(asn1_template_prim)/sizeof(asn1_template_prim[0])) { ABORT_ON_ERROR(); return ASN1_PARSE_ERROR; } - ret = (prim[type].decode)(p, len, el, &newsize); + ret = (asn1_template_prim[type].decode)(p, len, el, &newsize); if (ret) return ret; p += newsize; len -= newsize; @@ -316,7 +313,7 @@ case A1_OP_SEQOF: { struct template_of *el = DPO(data, t->offset); size_t newsize; - size_t ellen = sizeofType(t->ptr); + size_t ellen = _asn1_sizeofType(t->ptr); size_t vallength = 0; while (len > 0) { @@ -345,19 +342,19 @@ } case A1_OP_BMEMBER: { const struct asn1_template *bmember = t->ptr; - size_t size = bmember->offset; - size_t elements = A1_HEADER_LEN(bmember); + size_t bsize = bmember->offset; + size_t belements = A1_HEADER_LEN(bmember); size_t pos = 0; bmember++; - memset(data, 0, size); + memset(data, 0, bsize); if (len < 1) return ASN1_OVERRUN; p++; len--; - while (elements && len) { + while (belements && len) { while (bmember->offset / 8 > pos / 8) { if (len < 1) break; @@ -365,8 +362,8 @@ pos += 8; } if (len) { - bmember_get_bit(p, data, bmember->offset, size); - elements--; bmember++; + _asn1_bmember_get_bit(p, data, bmember->offset, bsize); + belements--; bmember++; } } len = 0; @@ -378,6 +375,9 @@ size_t datalen; unsigned int i; + /* provide a saner value as default, we should have a NO element value */ + *element = 1; + for (i = 1; i < A1_HEADER_LEN(choice) + 1; i++) { /* should match first tag instead, store it in choice.tt */ ret = _asn1_decode(choice[i].ptr, 0, p, len, @@ -513,12 +513,12 @@ size_t newsize; const void *el = DPOC(data, t->offset); - if (type > sizeof(prim)/sizeof(prim[0])) { + if (type >= sizeof(asn1_template_prim)/sizeof(asn1_template_prim[0])) { ABORT_ON_ERROR(); return ASN1_PARSE_ERROR; } - ret = (prim[type].encode)(p, len, el, &newsize); + ret = (asn1_template_prim[type].encode)(p, len, el, &newsize); if (ret) return ret; p -= newsize; len -= newsize; @@ -527,8 +527,8 @@ } case A1_OP_SETOF: { const struct template_of *el = DPOC(data, t->offset); - size_t ellen = sizeofType(t->ptr); - struct heim_octet_string *val; + size_t ellen = _asn1_sizeofType(t->ptr); + heim_octet_string *val; unsigned char *elptr = el->val; size_t i, totallen; @@ -538,7 +538,7 @@ if (el->len > UINT_MAX/sizeof(val[0])) return ERANGE; - val = malloc(sizeof(val[0]) * el->len); + val = calloc(el->len, sizeof(val[0])); if (val == NULL) return ENOMEM; @@ -547,7 +547,13 @@ size_t l; val[i].length = _asn1_length(t->ptr, elptr); - val[i].data = malloc(val[i].length); + if (val[i].length) { + val[i].data = malloc(val[i].length); + if (val[i].data == NULL) { + ret = ENOMEM; + break; + } + } ret = _asn1_encode(t->ptr, DPO(val[i].data, val[i].length - 1), val[i].length, elptr, &l); @@ -565,9 +571,8 @@ if (ret == 0 && totallen > len) ret = ASN1_OVERFLOW; if (ret) { - do { + for (i = 0; i < el->len; i++) free(val[i].data); - } while(i-- > 0); free(val); return ret; } @@ -589,7 +594,7 @@ } case A1_OP_SEQOF: { struct template_of *el = DPO(data, t->offset); - size_t ellen = sizeofType(t->ptr); + size_t ellen = _asn1_sizeofType(t->ptr); size_t newsize; unsigned int i; unsigned char *elptr = el->val; @@ -613,21 +618,21 @@ } case A1_OP_BMEMBER: { const struct asn1_template *bmember = t->ptr; - size_t size = bmember->offset; - size_t elements = A1_HEADER_LEN(bmember); + size_t bsize = bmember->offset; + size_t belements = A1_HEADER_LEN(bmember); size_t pos; unsigned char c = 0; unsigned int bitset = 0; int rfc1510 = (bmember->tt & A1_HBF_RFC1510); - bmember += elements; + bmember += belements; if (rfc1510) pos = 31; else pos = bmember->offset; - while (elements && len) { + while (belements && len) { while (bmember->offset / 8 < pos / 8) { if (rfc1510 || bitset || c) { if (len < 1) @@ -637,8 +642,8 @@ c = 0; pos -= 8; } - bmember_put_bit(&c, data, bmember->offset, size, &bitset); - elements--; bmember--; + _asn1_bmember_put_bit(&c, data, bmember->offset, bsize, &bitset); + belements--; bmember--; } if (rfc1510 || bitset) { if (len < 1) @@ -747,17 +752,17 @@ unsigned int type = A1_PARSE_TYPE(t->tt); const void *el = DPOC(data, t->offset); - if (type > sizeof(prim)/sizeof(prim[0])) { + if (type >= sizeof(asn1_template_prim)/sizeof(asn1_template_prim[0])) { ABORT_ON_ERROR(); break; } - ret += (prim[type].length)(el); + ret += (asn1_template_prim[type].length)(el); break; } case A1_OP_SETOF: case A1_OP_SEQOF: { const struct template_of *el = DPOC(data, t->offset); - size_t ellen = sizeofType(t->ptr); + size_t ellen = _asn1_sizeofType(t->ptr); const unsigned char *element = el->val; unsigned int i; @@ -771,7 +776,7 @@ case A1_OP_BMEMBER: { const struct asn1_template *bmember = t->ptr; size_t size = bmember->offset; - size_t elements = A1_HEADER_LEN(bmember); + size_t belements = A1_HEADER_LEN(bmember); int rfc1510 = (bmember->tt & A1_HBF_RFC1510); if (rfc1510) { @@ -780,14 +785,14 @@ ret += 1; - bmember += elements; + bmember += belements; - while (elements) { - if (bmember_isset_bit(data, bmember->offset, size)) { + while (belements) { + if (_asn1_bmember_isset_bit(data, bmember->offset, size)) { ret += (bmember->offset / 8) + 1; break; } - elements--; bmember--; + belements--; bmember--; } } break; @@ -855,11 +860,11 @@ unsigned int type = A1_PARSE_TYPE(t->tt); void *el = DPO(data, t->offset); - if (type > sizeof(prim)/sizeof(prim[0])) { + if (type >= sizeof(asn1_template_prim)/sizeof(asn1_template_prim[0])) { ABORT_ON_ERROR(); break; } - (prim[type].release)(el); + (asn1_template_prim[type].release)(el); break; } case A1_OP_TAG: { @@ -882,7 +887,7 @@ case A1_OP_SETOF: case A1_OP_SEQOF: { struct template_of *el = DPO(data, t->offset); - size_t ellen = sizeofType(t->ptr); + size_t ellen = _asn1_sizeofType(t->ptr); unsigned char *element = el->val; unsigned int i; @@ -947,7 +952,7 @@ size_t size; if ((t->tt & A1_OP_MASK) == A1_OP_TYPE) { - size = sizeofType(t->ptr); + size = _asn1_sizeofType(t->ptr); } else { const struct asn1_type_func *f = t->ptr; size = f->size; @@ -985,11 +990,11 @@ const void *fel = DPOC(from, t->offset); void *tel = DPO(to, t->offset); - if (type > sizeof(prim)/sizeof(prim[0])) { + if (type >= sizeof(asn1_template_prim)/sizeof(asn1_template_prim[0])) { ABORT_ON_ERROR(); return ASN1_PARSE_ERROR; } - ret = (prim[type].copy)(fel, tel); + ret = (asn1_template_prim[type].copy)(fel, tel); if (ret) return ret; break; @@ -1012,14 +1017,14 @@ } from = *fel; - to = *tel = calloc(1, sizeofType(t->ptr)); + to = *tel = calloc(1, _asn1_sizeofType(t->ptr)); if (to == NULL) return ENOMEM; } ret = _asn1_copy(t->ptr, from, to); if (ret) { - if (t->tt & A1_FLAG_OPTIONAL) { + if (tel) { free(*tel); *tel = NULL; } @@ -1035,7 +1040,7 @@ case A1_OP_SEQOF: { const struct template_of *fel = DPOC(from, t->offset); struct template_of *tel = DPO(to, t->offset); - size_t ellen = sizeofType(t->ptr); + size_t ellen = _asn1_sizeofType(t->ptr); unsigned int i; tel->val = calloc(fel->len, ellen); @@ -1097,10 +1102,8 @@ int ret; memset(data, 0, t->offset); ret = _asn1_decode(t, flags, p, len, data, size); - if (ret) { - _asn1_free(t, data); - memset(data, 0, t->offset); - } + if (ret) + _asn1_free_top(t, data); return ret; } @@ -1111,9 +1114,15 @@ int ret; memset(to, 0, t->offset); ret = _asn1_copy(t, from, to); - if (ret) { - _asn1_free(t, to); - memset(to, 0, t->offset); - } + if (ret) + _asn1_free_top(t, to); + return ret; } + +void +_asn1_free_top(const struct asn1_template *t, void *data) +{ + _asn1_free(t, data); + memset(data, 0, t->offset); +} diff --git a/crypto/heimdal/lib/asn1/test.asn1 b/crypto/heimdal/lib/asn1/test.asn1 --- a/crypto/heimdal/lib/asn1/test.asn1 +++ b/crypto/heimdal/lib/asn1/test.asn1 @@ -7,6 +7,8 @@ IMPORTS heim_any FROM heim; TESTuint32 ::= INTEGER (0..4294967295) +TESTuint64 ::= INTEGER(0..18446744073709551615) +TESTint64 ::= INTEGER(-9223372036854775808..9223372036854775807) TESTLargeTag ::= SEQUENCE { foo[127] INTEGER (-2147483648..2147483647), @@ -46,7 +48,7 @@ TESTImplicit2 ::= SEQUENCE { ti1[0] IMPLICIT TESTInteger, - ti2[1] IMPLICIT TESTLargeTag, +-- ti2[1] IMPLICIT TESTLargeTag, this is disabled since the IMPLICT encoder does't get the types right when stepping inside an structure -- ti3[2] IMPLICIT TESTInteger3 } @@ -96,7 +98,7 @@ TESTSeqSizeOf1 ::= SEQUENCE SIZE (2) OF TESTInteger TESTSeqSizeOf2 ::= SEQUENCE SIZE (1..2) OF TESTInteger TESTSeqSizeOf3 ::= SEQUENCE SIZE (1..MAX) OF TESTInteger -TESTSeqSizeOf4 ::= SEQUENCE SIZE (MIN..2) OF TESTInteger +TESTSeqSizeOf4 ::= SEQUENCE SIZE (0..2) OF TESTInteger TESTOSSize1 ::= OCTET STRING SIZE (1..2) @@ -121,6 +123,60 @@ strings SEQUENCE OF GeneralString OPTIONAL } +-- Larger/more complex to increase odds of out-of-bounds +-- read/writes if miscoded + +TESTSeqOf4 ::= SEQUENCE { + b1 [0] SEQUENCE OF SEQUENCE { + s1 OCTET STRING, + s2 OCTET STRING, + u1 TESTuint64, + u2 TESTuint64 + } OPTIONAL, + b2 [1] IMPLICIT SEQUENCE OF SEQUENCE { + u1 TESTuint64, + u2 TESTuint64, + u3 TESTuint64, + s1 OCTET STRING, + s2 OCTET STRING, + s3 OCTET STRING + } OPTIONAL, + b3 [2] IMPLICIT SEQUENCE OF SEQUENCE { + s1 OCTET STRING, + u1 TESTuint64, + s2 OCTET STRING, + u2 TESTuint64, + s3 OCTET STRING, + u3 TESTuint64, + s4 OCTET STRING, + u4 TESTuint64 + } OPTIONAL +} + +TESTSeqOf5 ::= SEQUENCE { + outer SEQUENCE { + inner SEQUENCE { + u0 TESTuint64, + s0 OCTET STRING, + u1 TESTuint64, + s1 OCTET STRING, + u2 TESTuint64, + s2 OCTET STRING, + u3 TESTuint64, + s3 OCTET STRING, + u4 TESTuint64, + s4 OCTET STRING, + u5 TESTuint64, + s5 OCTET STRING, + u6 TESTuint64, + s6 OCTET STRING, + u7 TESTuint64, + s7 OCTET STRING + } + } + OPTIONAL +} + TESTPreserve ::= SEQUENCE { zero [0] TESTInteger, one [1] TESTInteger diff --git a/crypto/heimdal/lib/asn1/timegm.c b/crypto/heimdal/lib/asn1/timegm.c --- a/crypto/heimdal/lib/asn1/timegm.c +++ b/crypto/heimdal/lib/asn1/timegm.c @@ -102,7 +102,7 @@ tm->tm_sec = secday % 60; tm->tm_min = (secday % 3600) / 60; - tm->tm_hour = secday / 3600; + tm->tm_hour = (int)(secday / 3600); /* * Refuse to calculate time ~ 2000 years into the future, this is @@ -130,7 +130,7 @@ days -= daysinmonth; tm->tm_mon++; } - tm->tm_mday = days + 1; + tm->tm_mday = (int)(days + 1); return tm; } diff --git a/crypto/heimdal/lib/base/Makefile.am b/crypto/heimdal/lib/base/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/Makefile.am @@ -0,0 +1,66 @@ + +include $(top_srcdir)/Makefile.am.common + +if do_roken_rename +ES = base64.c +endif + +IMPLEMENT_TLS= +if MAINTAINER_MODE +IMPLEMENT_TLS += dll.c +AM_CPPFLAGS += -DHEIM_BASE_MAINTAINER +endif + +AM_CPPFLAGS += $(ROKEN_RENAME) + +lib_LTLIBRARIES = libheimbase.la +check_PROGRAMS = test_base + +test_base_CFLAGS = -Wno-string-concatenation + +libheimbase_la_LDFLAGS = -version-info 1:0:0 + +TESTS = test_base + +if versionscript +libheimbase_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map +endif + +libheimbase_la_LIBADD = $(PTHREAD_LIBADD) + +include_HEADERS = heimbase.h + +dist_libheimbase_la_SOURCES = \ + array.c \ + baselocl.h \ + bsearch.c \ + bool.c \ + data.c \ + db.c \ + dict.c \ + $(IMPLEMENT_TLS) \ + error.c \ + heimbase.c \ + heimbasepriv.h \ + heimqueue.h \ + json.c \ + null.c \ + number.c \ + roken_rename.h \ + string.c + +nodist_libheimbase_la_SOURCES = $(ES) + +# install these? + +libheimbase_la_DEPENDENCIES = version-script.map + +test_base_LDADD = libheimbase.la $(LIB_roken) + +CLEANFILES = base64.c test_db.json + +EXTRA_DIST = NTMakefile version-script.map + +base64.c: + rm -f base64.c + $(LN_S) $(srcdir)/../roken/base64.c . diff --git a/crypto/heimdal/lib/base/Makefile.in b/crypto/heimdal/lib/base/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/Makefile.in @@ -0,0 +1,1567 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@MAINTAINER_MODE_TRUE@am__append_1 = dll.c +@MAINTAINER_MODE_TRUE@am__append_2 = -DHEIM_BASE_MAINTAINER +check_PROGRAMS = test_base$(EXEEXT) +TESTS = test_base$(EXEEXT) +@versionscript_TRUE@am__append_3 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map +subdir = lib/base +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +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) +am__DEPENDENCIES_1 = +am__dist_libheimbase_la_SOURCES_DIST = array.c baselocl.h bsearch.c \ + bool.c data.c db.c dict.c dll.c error.c heimbase.c \ + heimbasepriv.h heimqueue.h json.c null.c number.c \ + roken_rename.h string.c +@MAINTAINER_MODE_TRUE@am__objects_1 = dll.lo +am__objects_2 = $(am__objects_1) +dist_libheimbase_la_OBJECTS = array.lo bsearch.lo bool.lo data.lo \ + db.lo dict.lo $(am__objects_2) error.lo heimbase.lo json.lo \ + null.lo number.lo string.lo +@do_roken_rename_TRUE@am__objects_3 = base64.lo +nodist_libheimbase_la_OBJECTS = $(am__objects_3) +libheimbase_la_OBJECTS = $(dist_libheimbase_la_OBJECTS) \ + $(nodist_libheimbase_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libheimbase_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libheimbase_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +test_base_SOURCES = test_base.c +test_base_OBJECTS = test_base-test_base.$(OBJEXT) +test_base_DEPENDENCIES = libheimbase.la $(am__DEPENDENCIES_1) +test_base_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(test_base_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/array.Plo ./$(DEPDIR)/base64.Plo \ + ./$(DEPDIR)/bool.Plo ./$(DEPDIR)/bsearch.Plo \ + ./$(DEPDIR)/data.Plo ./$(DEPDIR)/db.Plo ./$(DEPDIR)/dict.Plo \ + ./$(DEPDIR)/dll.Plo ./$(DEPDIR)/error.Plo \ + ./$(DEPDIR)/heimbase.Plo ./$(DEPDIR)/json.Plo \ + ./$(DEPDIR)/null.Plo ./$(DEPDIR)/number.Plo \ + ./$(DEPDIR)/string.Plo ./$(DEPDIR)/test_base-test_base.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(dist_libheimbase_la_SOURCES) \ + $(nodist_libheimbase_la_SOURCES) test_base.c +DIST_SOURCES = $(am__dist_libheimbase_la_SOURCES_DIST) test_base.c +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) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) $(am__append_2) $(ROKEN_RENAME) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +@do_roken_rename_TRUE@ES = base64.c +IMPLEMENT_TLS = $(am__append_1) +lib_LTLIBRARIES = libheimbase.la +test_base_CFLAGS = -Wno-string-concatenation +libheimbase_la_LDFLAGS = -version-info 1:0:0 $(am__append_3) +libheimbase_la_LIBADD = $(PTHREAD_LIBADD) +include_HEADERS = heimbase.h +dist_libheimbase_la_SOURCES = \ + array.c \ + baselocl.h \ + bsearch.c \ + bool.c \ + data.c \ + db.c \ + dict.c \ + $(IMPLEMENT_TLS) \ + error.c \ + heimbase.c \ + heimbasepriv.h \ + heimqueue.h \ + json.c \ + null.c \ + number.c \ + roken_rename.h \ + string.c + +nodist_libheimbase_la_SOURCES = $(ES) + +# install these? +libheimbase_la_DEPENDENCIES = version-script.map +test_base_LDADD = libheimbase.la $(LIB_roken) +CLEANFILES = base64.c test_db.json +EXTRA_DIST = NTMakefile version-script.map +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 lib/base/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign lib/base/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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-checkPROGRAMS: + @list='$(check_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 + +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}; \ + } + +libheimbase.la: $(libheimbase_la_OBJECTS) $(libheimbase_la_DEPENDENCIES) $(EXTRA_libheimbase_la_DEPENDENCIES) + $(AM_V_CCLD)$(libheimbase_la_LINK) -rpath $(libdir) $(libheimbase_la_OBJECTS) $(libheimbase_la_LIBADD) $(LIBS) + +test_base$(EXEEXT): $(test_base_OBJECTS) $(test_base_DEPENDENCIES) $(EXTRA_test_base_DEPENDENCIES) + @rm -f test_base$(EXEEXT) + $(AM_V_CCLD)$(test_base_LINK) $(test_base_OBJECTS) $(test_base_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/array.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bool.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsearch.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/db.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dict.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dll.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heimbase.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/null.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/number.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_base-test_base.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +test_base-test_base.o: test_base.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_base_CFLAGS) $(CFLAGS) -MT test_base-test_base.o -MD -MP -MF $(DEPDIR)/test_base-test_base.Tpo -c -o test_base-test_base.o `test -f 'test_base.c' || echo '$(srcdir)/'`test_base.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_base-test_base.Tpo $(DEPDIR)/test_base-test_base.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test_base.c' object='test_base-test_base.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_base_CFLAGS) $(CFLAGS) -c -o test_base-test_base.o `test -f 'test_base.c' || echo '$(srcdir)/'`test_base.c + +test_base-test_base.obj: test_base.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_base_CFLAGS) $(CFLAGS) -MT test_base-test_base.obj -MD -MP -MF $(DEPDIR)/test_base-test_base.Tpo -c -o test_base-test_base.obj `if test -f 'test_base.c'; then $(CYGPATH_W) 'test_base.c'; else $(CYGPATH_W) '$(srcdir)/test_base.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/test_base-test_base.Tpo $(DEPDIR)/test_base-test_base.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='test_base.c' object='test_base-test_base.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(test_base_CFLAGS) $(CFLAGS) -c -o test_base-test_base.obj `if test -f 'test_base.c'; then $(CYGPATH_W) 'test_base.c'; else $(CYGPATH_W) '$(srcdir)/test_base.c'; fi` + +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: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test_base.log: test_base$(EXEEXT) + @p='test_base$(EXEEXT)'; \ + b='test_base'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local +install-checkPROGRAMS: install-libLTLIBRARIES + +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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/array.Plo + -rm -f ./$(DEPDIR)/base64.Plo + -rm -f ./$(DEPDIR)/bool.Plo + -rm -f ./$(DEPDIR)/bsearch.Plo + -rm -f ./$(DEPDIR)/data.Plo + -rm -f ./$(DEPDIR)/db.Plo + -rm -f ./$(DEPDIR)/dict.Plo + -rm -f ./$(DEPDIR)/dll.Plo + -rm -f ./$(DEPDIR)/error.Plo + -rm -f ./$(DEPDIR)/heimbase.Plo + -rm -f ./$(DEPDIR)/json.Plo + -rm -f ./$(DEPDIR)/null.Plo + -rm -f ./$(DEPDIR)/number.Plo + -rm -f ./$(DEPDIR)/string.Plo + -rm -f ./$(DEPDIR)/test_base-test_base.Po + -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 + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local 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 -f ./$(DEPDIR)/array.Plo + -rm -f ./$(DEPDIR)/base64.Plo + -rm -f ./$(DEPDIR)/bool.Plo + -rm -f ./$(DEPDIR)/bsearch.Plo + -rm -f ./$(DEPDIR)/data.Plo + -rm -f ./$(DEPDIR)/db.Plo + -rm -f ./$(DEPDIR)/dict.Plo + -rm -f ./$(DEPDIR)/dll.Plo + -rm -f ./$(DEPDIR)/error.Plo + -rm -f ./$(DEPDIR)/heimbase.Plo + -rm -f ./$(DEPDIR)/json.Plo + -rm -f ./$(DEPDIR)/null.Plo + -rm -f ./$(DEPDIR)/number.Plo + -rm -f ./$(DEPDIR)/string.Plo + -rm -f ./$(DEPDIR)/test_base-test_base.Po + -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 + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-checkPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ + ctags ctags-am dist-hook 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-data-hook install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-local \ + 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 recheck tags tags-am \ + uninstall uninstall-am uninstall-hook uninstall-includeHEADERS \ + uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +base64.c: + rm -f base64.c + $(LN_S) $(srcdir)/../roken/base64.c . + +# 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: diff --git a/crypto/heimdal/lib/base/NTMakefile b/crypto/heimdal/lib/base/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/NTMakefile @@ -0,0 +1,82 @@ +######################################################################## +# +# Copyright (c) 2010, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\base + +intcflags=-I$(SRCDIR) -I$(OBJ) + +!include ../../windows/NTMakefile.w32 + +INCFILES=$(INCDIR)\heimbase.h + +test_binaries = $(OBJ)\test_base.exe + +libheimbase_OBJS = \ + $(OBJ)\array.obj \ + $(OBJ)\bool.obj \ + $(OBJ)\bsearch.obj \ + $(OBJ)\data.obj \ + $(OBJ)\db.obj \ + $(OBJ)\dict.obj \ + $(OBJ)\dll.obj \ + $(OBJ)\error.obj \ + $(OBJ)\heimbase.obj \ + $(OBJ)\json.obj \ + $(OBJ)\null.obj \ + $(OBJ)\number.obj \ + $(OBJ)\string.obj + +$(LIBHEIMBASE): $(libheimbase_OBJS) + $(LIBCON_C) -OUT:$@ $(LIBROKEN) @<< +$(libheimbase_OBJS: = +) +<< + +test:: test-binaries test-run + +test-run: + cd $(OBJ) + -test_base.exe + cd $(SRCDIR) + +all:: $(INCFILES) $(LIBHEIMBASE) + +clean:: + -$(RM) $(INCFILES) + +test-binaries: $(test_binaries) + +$(test_binaries): $$(@R).obj $(LIBHEIMBASE) $(LIBVERS) $(LIBROKEN) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(test_binaries:.exe=.obj): $$(@B).c + $(C2OBJ_C) -Fo$@ -Fd$(@D)\ $** -DBlah diff --git a/crypto/heimdal/lib/base/array.c b/crypto/heimdal/lib/base/array.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/array.c @@ -0,0 +1,478 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" + +/* + * + */ + +struct heim_array_data { + size_t len; + heim_object_t *val; + size_t allocated_len; + heim_object_t *allocated; +}; + +static void +array_dealloc(heim_object_t ptr) +{ + heim_array_t array = ptr; + size_t n; + for (n = 0; n < array->len; n++) + heim_release(array->val[n]); + free(array->allocated); +} + +struct heim_type_data array_object = { + HEIM_TID_ARRAY, + "dict-object", + NULL, + array_dealloc, + NULL, + NULL, + NULL, + NULL +}; + +/** + * Allocate an array + * + * @return A new allocated array, free with heim_release() + */ + +heim_array_t +heim_array_create(void) +{ + heim_array_t array; + + array = _heim_alloc_object(&array_object, sizeof(*array)); + if (array == NULL) + return NULL; + + array->allocated = NULL; + array->allocated_len = 0; + array->val = NULL; + array->len = 0; + + return array; +} + +/** + * Get type id of an dict + * + * @return the type id + */ + +heim_tid_t +heim_array_get_type_id(void) +{ + return HEIM_TID_ARRAY; +} + +/** + * Append object to array + * + * @param array array to add too + * @param object the object to add + * + * @return zero if added, errno otherwise + */ + +int +heim_array_append_value(heim_array_t array, heim_object_t object) +{ + heim_object_t *ptr; + size_t leading = array->val - array->allocated; /* unused leading slots */ + size_t trailing = array->allocated_len - array->len - leading; + size_t new_len; + + if (trailing > 0) { + /* We have pre-allocated space; use it */ + array->val[array->len++] = heim_retain(object); + return 0; + } + + if (leading > (array->len + 1)) { + /* + * We must have appending to, and deleting at index 0 from this + * array a lot; don't want to grow forever! + */ + (void) memmove(&array->allocated[0], &array->val[0], + array->len * sizeof(array->val[0])); + array->val = array->allocated; + + /* We have pre-allocated space; use it */ + array->val[array->len++] = heim_retain(object); + return 0; + } + + /* Pre-allocate extra .5 times number of used slots */ + new_len = leading + array->len + 1 + (array->len >> 1); + ptr = realloc(array->allocated, new_len * sizeof(array->val[0])); + if (ptr == NULL) + return ENOMEM; + array->allocated = ptr; + array->allocated_len = new_len; + array->val = &ptr[leading]; + array->val[array->len++] = heim_retain(object); + + return 0; +} + +/* + * Internal function to insert at index 0, taking care to optimize the + * case where we're always inserting at index 0, particularly the case + * where we insert at index 0 and delete from the right end. + */ +static int +heim_array_prepend_value(heim_array_t array, heim_object_t object) +{ + heim_object_t *ptr; + size_t leading = array->val - array->allocated; /* unused leading slots */ + size_t trailing = array->allocated_len - array->len - leading; + size_t new_len; + + if (leading > 0) { + /* We have pre-allocated space; use it */ + array->val--; + array->val[0] = heim_retain(object); + array->len++; + return 0; + } + if (trailing > (array->len + 1)) { + /* + * We must have prepending to, and deleting at index + * array->len - 1 from this array a lot; don't want to grow + * forever! + */ + (void) memmove(&array->allocated[array->len], &array->val[0], + array->len * sizeof(array->val[0])); + array->val = &array->allocated[array->len]; + + /* We have pre-allocated space; use it */ + array->val--; + array->val[0] = heim_retain(object); + array->len++; + return 0; + } + /* Pre-allocate extra .5 times number of used slots */ + new_len = array->len + 1 + trailing + (array->len >> 1); + ptr = realloc(array->allocated, new_len * sizeof(array->val[0])); + if (ptr == NULL) + return ENOMEM; + (void) memmove(&ptr[1], &ptr[0], array->len * sizeof (array->val[0])); + array->allocated = ptr; + array->allocated_len = new_len; + array->val = &ptr[0]; + array->val[0] = heim_retain(object); + array->len++; + + return 0; +} + +/** + * Insert an object at a given index in an array + * + * @param array array to add too + * @param idx index where to add element (-1 == append, -2 next to last, ...) + * @param object the object to add + * + * @return zero if added, errno otherwise + */ + +int +heim_array_insert_value(heim_array_t array, size_t idx, heim_object_t object) +{ + int ret; + + if (idx == 0) + return heim_array_prepend_value(array, object); + else if (idx > array->len) + heim_abort("index too large"); + + /* + * We cheat: append this element then rotate elements around so we + * have this new element at the desired location, unless we're truly + * appending the new element. This means reusing array growth in + * heim_array_append_value() instead of duplicating that here. + */ + ret = heim_array_append_value(array, object); + if (ret != 0 || idx == (array->len - 1)) + return ret; + /* + * Shift to the right by one all the elements after idx, then set + * [idx] to the new object. + */ + (void) memmove(&array->val[idx + 1], &array->val[idx], + (array->len - idx - 1) * sizeof(array->val[0])); + array->val[idx] = heim_retain(object); + + return 0; +} + +/** + * Iterate over all objects in array + * + * @param array array to iterate over + * @param ctx context passed to fn + * @param fn function to call on each object + */ + +void +heim_array_iterate_f(heim_array_t array, void *ctx, heim_array_iterator_f_t fn) +{ + size_t n; + int stop = 0; + for (n = 0; n < array->len; n++) { + fn(array->val[n], ctx, &stop); + if (stop) + return; + } +} + +#ifdef __BLOCKS__ +/** + * Iterate over all objects in array + * + * @param array array to iterate over + * @param fn block to call on each object + */ + +void +heim_array_iterate(heim_array_t array, void (^fn)(heim_object_t, int *)) +{ + size_t n; + int stop = 0; + for (n = 0; n < array->len; n++) { + fn(array->val[n], &stop); + if (stop) + return; + } +} +#endif + +/** + * Iterate over all objects in array, backwards + * + * @param array array to iterate over + * @param ctx context passed to fn + * @param fn function to call on each object + */ + +void +heim_array_iterate_reverse_f(heim_array_t array, void *ctx, heim_array_iterator_f_t fn) +{ + size_t n; + int stop = 0; + + for (n = array->len; n > 0; n--) { + fn(array->val[n - 1], ctx, &stop); + if (stop) + return; + } +} + +#ifdef __BLOCKS__ +/** + * Iterate over all objects in array, backwards + * + * @param array array to iterate over + * @param fn block to call on each object + */ + +void +heim_array_iterate_reverse(heim_array_t array, void (^fn)(heim_object_t, int *)) +{ + size_t n; + int stop = 0; + for (n = array->len; n > 0; n--) { + fn(array->val[n - 1], &stop); + if (stop) + return; + } +} +#endif + +/** + * Get length of array + * + * @param array array to get length of + * + * @return length of array + */ + +size_t +heim_array_get_length(heim_array_t array) +{ + return array->len; +} + +/** + * Get value of element at array index + * + * @param array array copy object from + * @param idx index of object, 0 based, must be smaller then + * heim_array_get_length() + * + * @return a not-retained copy of the object + */ + +heim_object_t +heim_array_get_value(heim_array_t array, size_t idx) +{ + if (idx >= array->len) + heim_abort("index too large"); + return array->val[idx]; +} + +/** + * Get value of element at array index + * + * @param array array copy object from + * @param idx index of object, 0 based, must be smaller then + * heim_array_get_length() + * + * @return a retained copy of the object + */ + +heim_object_t +heim_array_copy_value(heim_array_t array, size_t idx) +{ + if (idx >= array->len) + heim_abort("index too large"); + return heim_retain(array->val[idx]); +} + +/** + * Set value at array index + * + * @param array array copy object from + * @param idx index of object, 0 based, must be smaller then + * heim_array_get_length() + * @param value value to set + * + */ + +void +heim_array_set_value(heim_array_t array, size_t idx, heim_object_t value) +{ + if (idx >= array->len) + heim_abort("index too large"); + heim_release(array->val[idx]); + array->val[idx] = heim_retain(value); +} + +/** + * Delete value at idx + * + * @param array the array to modify + * @param idx the key to delete + */ + +void +heim_array_delete_value(heim_array_t array, size_t idx) +{ + heim_object_t obj; + if (idx >= array->len) + heim_abort("index too large"); + obj = array->val[idx]; + + array->len--; + + /* + * Deleting the first or last elements is cheap, as we leave + * allocated space for opportunistic reuse later; no realloc(), no + * memmove(). All others require a memmove(). + * + * If we ever need to optimize deletion of non-last/ non-first + * element we can use a tagged object type to signify "deleted + * value" so we can leave holes in the array, avoid memmove()s on + * delete, and opportunistically re-use those holes on insert. + */ + if (idx == 0) + array->val++; + else if (idx < array->len) + (void) memmove(&array->val[idx], &array->val[idx + 1], + (array->len - idx) * sizeof(array->val[0])); + + heim_release(obj); +} + +/** + * Filter out entres of array when function return true + * + * @param array the array to modify + * @param fn filter function + */ + +void +heim_array_filter_f(heim_array_t array, void *ctx, heim_array_filter_f_t fn) +{ + size_t n = 0; + + while (n < array->len) { + if (fn(array->val[n], ctx)) { + heim_array_delete_value(array, n); + } else { + n++; + } + } +} + +#ifdef __BLOCKS__ + +/** + * Filter out entres of array when block return true + * + * @param array the array to modify + * @param block filter block + */ + +void +heim_array_filter(heim_array_t array, int (^block)(heim_object_t)) +{ + size_t n = 0; + + while (n < array->len) { + if (block(array->val[n])) { + heim_array_delete_value(array, n); + } else { + n++; + } + } +} + +#endif /* __BLOCKS__ */ diff --git a/crypto/heimdal/lib/base/baselocl.h b/crypto/heimdal/lib/base/baselocl.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/baselocl.h @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2010 - 2011 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" + +#include + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#define HEIMDAL_TEXTDOMAIN "heimdal_krb5" + +#ifdef LIBINTL +#include +#define N_(x,y) dgettext(HEIMDAL_TEXTDOMAIN, x) +#else +#define N_(x,y) (x) +#define bindtextdomain(package, localedir) +#endif + +#include "heimqueue.h" +#include "heim_threads.h" +#include "heimbase.h" +#include "heimbasepriv.h" + +#ifdef HAVE_DISPATCH_DISPATCH_H +#include +#endif + +#if defined(__GNUC__) && defined(HAVE___SYNC_ADD_AND_FETCH) + +#define heim_base_atomic_inc(x) __sync_add_and_fetch((x), 1) +#define heim_base_atomic_dec(x) __sync_sub_and_fetch((x), 1) +#define heim_base_atomic_type unsigned int +#define heim_base_atomic_max UINT_MAX + +#ifndef __has_builtin +#define __has_builtin(x) 0 +#endif + +#if __has_builtin(__sync_swap) +#define heim_base_exchange_pointer(t,v) __sync_swap((t), (v)) +#else +#define heim_base_exchange_pointer(t,v) __sync_lock_test_and_set((t), (v)) +#endif + +#elif defined(__sun) + +#include + +#define heim_base_atomic_inc(x) atomic_inc_uint_nv((volatile uint_t *)(x)) +#define heim_base_atomic_dec(x) atomic_dec_uint_nv((volatile uint_t *)(x)) +#define heim_base_atomic_type uint_t +#define heim_base_atomic_max UINT_MAX + +#define heim_base_exchange_pointer(t,v) atomic_swap_ptr((volatile void *)(t), (void *)(v)) + +#elif defined(_AIX) + +#include + +#define heim_base_atomic_inc(x) (fetch_and_add((atomic_p)(x)) + 1) +#define heim_base_atomic_dec(x) (fetch_and_add((atomic_p)(x)) - 1) +#define heim_base_atomic_type unsigned int +#define heim_base_atomic_max UINT_MAX + +static inline void * +heim_base_exchange_pointer(void *p, void *newval) +{ + void *val = *(void **)p; + + while (!compare_and_swaplp((atomic_l)p, (long *)&val, (long)newval)) + ; + + return val; +} + +#elif defined(_WIN32) + +#define heim_base_atomic_inc(x) InterlockedIncrement(x) +#define heim_base_atomic_dec(x) InterlockedDecrement(x) +#define heim_base_atomic_type LONG +#define heim_base_atomic_max MAXLONG + +#define heim_base_exchange_pointer(t,v) InterlockedExchangePointer((t),(v)) + +#else + +#define HEIM_BASE_NEED_ATOMIC_MUTEX 1 +extern HEIMDAL_MUTEX _heim_base_mutex; + +#define heim_base_atomic_type unsigned int + +static inline heim_base_atomic_type +heim_base_atomic_inc(heim_base_atomic_type *x) +{ + heim_base_atomic_type t; + HEIMDAL_MUTEX_lock(&_heim_base_mutex); + t = ++(*x); + HEIMDAL_MUTEX_unlock(&_heim_base_mutex); + return t; +} + +static inline heim_base_atomic_type +heim_base_atomic_dec(heim_base_atomic_type *x) +{ + heim_base_atomic_type t; + HEIMDAL_MUTEX_lock(&_heim_base_mutex); + t = --(*x); + HEIMDAL_MUTEX_unlock(&_heim_base_mutex); + return t; +} + +#define heim_base_atomic_max UINT_MAX + +#endif + +/* tagged strings/object/XXX */ +#define heim_base_is_tagged(x) (((uintptr_t)(x)) & 0x3) + +#define heim_base_is_tagged_object(x) ((((uintptr_t)(x)) & 0x3) == 1) +#define heim_base_make_tagged_object(x, tid) \ + ((heim_object_t)((((uintptr_t)(x)) << 5) | ((tid) << 2) | 0x1)) +#define heim_base_tagged_object_tid(x) ((((uintptr_t)(x)) & 0x1f) >> 2) +#define heim_base_tagged_object_value(x) (((uintptr_t)(x)) >> 5) + +/* + * + */ + +#undef HEIMDAL_NORETURN_ATTRIBUTE +#define HEIMDAL_NORETURN_ATTRIBUTE +#undef HEIMDAL_PRINTF_ATTRIBUTE +#define HEIMDAL_PRINTF_ATTRIBUTE(x) diff --git a/crypto/heimdal/lib/base/bool.c b/crypto/heimdal/lib/base/bool.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/bool.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" + +struct heim_type_data _heim_bool_object = { + HEIM_TID_BOOL, + "bool-object", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +heim_bool_t +heim_bool_create(int val) +{ + return heim_base_make_tagged_object(!!val, HEIM_TID_BOOL); +} + +int +heim_bool_val(heim_bool_t ptr) +{ + return heim_base_tagged_object_value(ptr); +} diff --git a/crypto/heimdal/lib/base/bsearch.c b/crypto/heimdal/lib/base/bsearch.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/bsearch.c @@ -0,0 +1,888 @@ +/* + * Copyright (c) 2011, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "baselocl.h" + +#include +#include +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +#include +#endif +#include +#include + +/* + * This file contains functions for binary searching flat text in memory + * and in text files where each line is a [variable length] record. + * Each record has a key and an optional value separated from the key by + * unquoted whitespace. Whitespace in the key, and leading whitespace + * for the value, can be quoted with backslashes (but CR and LF must be + * quoted in such a way that they don't appear in the quoted result). + * + * Binary searching a tree are normally a dead simple algorithm. It + * turns out that binary searching flat text with *variable* length + * records is... tricky. There's no indexes to record beginning bytes, + * thus any index selected during the search is likely to fall in the + * middle of a record. When deciding to search a left sub-tree one + * might fail to find the last record in that sub-tree on account of the + * right boundary falling in the middle of it -- the chosen solution to + * this makes left sub-tree searches slightly less efficient than right + * sub-tree searches. + * + * If binary searching flat text in memory is tricky, using block-wise + * I/O instead is trickier! But it's necessary in order to support + * large files (which we either can't or wouldn't want to read or map + * into memory). Each block we read has to be large enough that the + * largest record can fit in it. And each block might start and/or end + * in the middle of a record. Here it is the right sub-tree searches + * that are less efficient than left sub-tree searches. + * + * bsearch_common() contains the common text block binary search code. + * + * _bsearch_text() is the interface for searching in-core text. + * _bsearch_file() is the interface for block-wise searching files. + */ + +struct bsearch_file_handle { + int fd; /* file descriptor */ + char *cache; /* cache bytes */ + char *page; /* one double-size page worth of bytes */ + size_t file_sz; /* file size */ + size_t cache_sz; /* cache size */ + size_t page_sz; /* page size */ +}; + +/* Find a new-line */ +static const char * +find_line(const char *buf, size_t i, size_t right) +{ + if (i == 0) + return &buf[i]; + for (; i < right; i++) { + if (buf[i] == '\n') { + if ((i + 1) < right) + return &buf[i + 1]; + return NULL; + } + } + return NULL; +} + +/* + * Common routine for binary searching text in core. + * + * Perform a binary search of a char array containing a block from a + * text file where each line is a record (LF and CRLF supported). Each + * record consists of a key followed by an optional value separated from + * the key by whitespace. Whitespace can be quoted with backslashes. + * It's the caller's responsibility to encode/decode keys/values if + * quoting is desired; newlines should be encoded such that a newline + * does not appear in the result. + * + * All output arguments are optional. + * + * Returns 0 if key is found, -1 if not found, or an error code such as + * ENOMEM in case of error. + * + * Inputs: + * + * @buf String to search + * @sz Size of string to search + * @key Key string to search for + * @buf_is_start True if the buffer starts with a record, false if it + * starts in the middle of a record or if the caller + * doesn't know. + * + * Outputs: + * + * @value Location to store a copy of the value (caller must free) + * @location Record location if found else the location where the + * record should be inserted (index into @buf) + * @cmp Set to less than or greater than 0 to indicate that a + * key not found would have fit in an earlier or later + * part of a file. Callers should use this to decide + * whether to read a block to the left or to the right and + * search that. + * @loops Location to store a count of bisections required for + * search (useful for confirming logarithmic performance) + */ +static int +bsearch_common(const char *buf, size_t sz, const char *key, + int buf_is_start, char **value, size_t *location, + int *cmp, size_t *loops) +{ + const char *linep; + size_t key_start, key_len; /* key string in buf */ + size_t val_start, val_len; /* value string in buf */ + int key_cmp = -1; + size_t k; + size_t l; /* left side of buffer for binary search */ + size_t r; /* right side of buffer for binary search */ + size_t rmax; /* right side of buffer for binary search */ + size_t i; /* index into buffer, typically in the middle of l and r */ + size_t loop_count = 0; + int ret = -1; + + if (value) + *value = NULL; + if (cmp) + *cmp = 0; + if (loops) + *loops = 0; + + /* Binary search; file should be sorted */ + for (l = 0, r = rmax = sz, i = sz >> 1; i >= l && i < rmax; loop_count++) { + heim_assert(i < sz, "invalid aname2lname db index"); + + /* buf[i] is likely in the middle of a line; find the next line */ + linep = find_line(buf, i, rmax); + k = linep ? linep - buf : i; + if (linep == NULL || k >= rmax) { + /* + * No new line found to the right; search to the left then + * but don't change rmax (this isn't optimal, but it's + * simple). + */ + if (i == l) + break; + r = i; + i = l + ((r - l) >> 1); + continue; + } + i = k; + heim_assert(i >= l && i < rmax, "invalid aname2lname db index"); + + /* Got a line; check it */ + + /* Search for and split on unquoted whitespace */ + val_start = 0; + for (key_start = i, key_len = 0, val_len = 0, k = i; k < rmax; k++) { + if (buf[k] == '\\') { + k++; + continue; + } + if (buf[k] == '\r' || buf[k] == '\n') { + /* We now know where the key ends, and there's no value */ + key_len = k - i; + break; + } + if (!isspace((unsigned char)buf[k])) + continue; + + while (k < rmax && isspace((unsigned char)buf[k])) { + key_len = k - i; + k++; + } + if (k < rmax) + val_start = k; + /* Find end of value */ + for (; k < rmax && buf[k] != '\0'; k++) { + if (buf[k] == '\r' || buf[k] == '\n') { + val_len = k - val_start; + break; + } + } + break; + } + + /* + * The following logic is for dealing with partial buffers, + * which we use for block-wise binary searches of large files + */ + if (key_start == 0 && !buf_is_start) { + /* + * We're at the beginning of a block that might have started + * in the middle of a record whose "key" might well compare + * as greater than the key we're looking for, so we don't + * bother comparing -- we know key_cmp must be -1 here. + */ + key_cmp = -1; + break; + } + if ((val_len && buf[val_start + val_len] != '\n') || + (!val_len && buf[key_start + key_len] != '\n')) { + /* + * We're at the end of a block that ends in the middle of a + * record whose "key" might well compare as less than the + * key we're looking for, so we don't bother comparing -- we + * know key_cmp must be >= 0 but we can't tell. Our caller + * will end up reading a double-size block to handle this. + */ + key_cmp = 1; + break; + } + + key_cmp = strncmp(key, &buf[key_start], key_len); + if (key_cmp == 0 && strlen(key) != key_len) + key_cmp = 1; + if (key_cmp < 0) { + /* search left */ + r = rmax = (linep - buf); + i = l + ((r - l) >> 1); + if (location) + *location = key_start; + } else if (key_cmp > 0) { + /* search right */ + if (l == i) + break; /* not found */ + l = i; + i = l + ((r - l) >> 1); + if (location) + *location = val_start + val_len; + } else { + /* match! */ + if (location) + *location = key_start; + ret = 0; + if (val_len && value) { + /* Avoid strndup() so we don't need libroken here yet */ + if ((*value = malloc(val_len + 1))) { + (void) memcpy(*value, &buf[val_start], val_len); + (*value)[val_len] = '\0'; + } else { + ret = errno; + } + } + break; + } + } + + if (cmp) + *cmp = key_cmp; + if (loops) + *loops = loop_count; + + return ret; +} + +/* + * Binary search a char array containing sorted text records separated + * by new-lines (or CRLF). Each record consists of a key and an + * optional value following the key, separated from the key by unquoted + * whitespace. + * + * All output arguments are optional. + * + * Returns 0 if key is found, -1 if not found, or an error code such as + * ENOMEM in case of error. + * + * Inputs: + * + * @buf Char array pointer + * @buf_sz Size of buf + * @key Key to search for + * + * Outputs: + * + * @value Location where to put the value, if any (caller must free) + * @location Record location if found else the location where the record + * should be inserted (index into @buf) + * @loops Location where to put a number of loops (or comparisons) + * needed for the search (useful for benchmarking) + */ +int +_bsearch_text(const char *buf, size_t buf_sz, const char *key, + char **value, size_t *location, size_t *loops) +{ + return bsearch_common(buf, buf_sz, key, 1, value, location, NULL, loops); +} + +#define MAX_BLOCK_SIZE (1024 * 1024) +#define DEFAULT_MAX_FILE_SIZE (1024 * 1024) +/* + * Open a file for binary searching. The file will be read in entirely + * if it is smaller than @max_sz, else a cache of @max_sz bytes will be + * allocated. + * + * Returns 0 on success, else an error number or -1 if the file is empty. + * + * Inputs: + * + * @fname Name of file to open + * @max_sz Maximum size of cache to allocate, in bytes (if zero, default) + * @page_sz Page size (must be a power of two, larger than 256, smaller + * than 1MB; if zero use default) + * + * Outputs: + * + * @bfh Handle for use with _bsearch_file() and _bsearch_file_close() + * @reads Number of reads performed + */ +int +_bsearch_file_open(const char *fname, size_t max_sz, size_t page_sz, + bsearch_file_handle *bfh, size_t *reads) +{ + bsearch_file_handle new_bfh = NULL; + struct stat st; + size_t i; + int fd; + int ret; + + *bfh = NULL; + + if (reads) + *reads = 0; + + fd = open(fname, O_RDONLY); + if (fd == -1) + return errno; + + if (fstat(fd, &st) == -1) { + ret = errno; + goto err; + } + + if (st.st_size == 0) { + ret = -1; /* no data -> no binary search */ + goto err; + } + + /* Validate / default arguments */ + if (max_sz == 0) + max_sz = DEFAULT_MAX_FILE_SIZE; + for (i = page_sz; i; i >>= 1) { + /* Make sure page_sz is a power of two */ + if ((i % 2) && (i >> 1)) { + page_sz = 0; + break; + } + } + if (page_sz == 0) +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE + page_sz = st.st_blksize; +#else + page_sz = 4096; +#endif + for (i = page_sz; i; i >>= 1) { + /* Make sure page_sz is a power of two */ + if ((i % 2) && (i >> 1)) { + /* Can't happen! Filesystems always use powers of two! */ + page_sz = 4096; + break; + } + } + if (page_sz > MAX_BLOCK_SIZE) + page_sz = MAX_BLOCK_SIZE; + + new_bfh = calloc(1, sizeof (*new_bfh)); + if (new_bfh == NULL) { + ret = ENOMEM; + goto err; + } + + new_bfh->fd = fd; + new_bfh->page_sz = page_sz; + new_bfh->file_sz = st.st_size; + + if (max_sz >= st.st_size) { + /* Whole-file method */ + new_bfh->cache = malloc(st.st_size + 1); + if (new_bfh->cache) { + new_bfh->cache[st.st_size] = '\0'; + new_bfh->cache_sz = st.st_size; + ret = read(fd, new_bfh->cache, st.st_size); + if (ret < 0) { + ret = errno; + goto err; + } + if (ret != st.st_size) { + ret = EIO; /* XXX ??? */ + goto err; + } + if (reads) + *reads = 1; + (void) close(fd); + new_bfh->fd = -1; + *bfh = new_bfh; + return 0; + } + } + + /* Block-size method, or above malloc() failed */ + new_bfh->page = malloc(new_bfh->page_sz << 1); + if (new_bfh->page == NULL) { + /* Can't even allocate a single double-size page! */ + ret = ENOMEM; + goto err; + } + + new_bfh->cache_sz = max_sz < st.st_size ? max_sz : st.st_size; + new_bfh->cache = malloc(new_bfh->cache_sz); + *bfh = new_bfh; + + /* + * malloc() may have failed because we were asking for a lot of + * memory, but we may still be able to operate without a cache, + * so let's not fail. + */ + if (new_bfh->cache == NULL) { + new_bfh->cache_sz = 0; + return 0; + } + + /* Initialize cache */ + for (i = 0; i < new_bfh->cache_sz; i += new_bfh->page_sz) + new_bfh->cache[i] = '\0'; + return 0; + +err: + (void) close(fd); + if (new_bfh) { + free(new_bfh->page); + free(new_bfh->cache); + free(new_bfh); + } + return ret; +} + +/* + * Indicate whether the given binary search file handle will be searched + * with block-wise method. + */ +void +_bsearch_file_info(bsearch_file_handle bfh, + size_t *page_sz, size_t *max_sz, int *blockwise) +{ + if (page_sz) + *page_sz = bfh->page_sz; + if (max_sz) + *max_sz = bfh->cache_sz; + if (blockwise) + *blockwise = (bfh->file_sz != bfh->cache_sz); +} + +/* + * Close the given binary file search handle. + * + * Inputs: + * + * @bfh Pointer to variable containing handle to close. + */ +void +_bsearch_file_close(bsearch_file_handle *bfh) +{ + if (!*bfh) + return; + if ((*bfh)->fd >= 0) + (void) close((*bfh)->fd); + if ((*bfh)->page) + free((*bfh)->page); + if ((*bfh)->cache) + free((*bfh)->cache); + free(*bfh); + *bfh = NULL; +} + +/* + * Private function to get a page from a cache. The cache is a char + * array of 2^n - 1 double-size page worth of bytes, where n is the + * number of tree levels that the cache stores. The cache can be + * smaller than n implies. + * + * The page may or may not be valid. If the first byte of it is NUL + * then it's not valid, else it is. + * + * Returns 1 if page is in cache and valid, 0 if the cache is too small + * or the page is invalid. The page address is output in @buf if the + * cache is large enough to contain it regardless of whether the page is + * valid. + * + * Inputs: + * + * @bfh Binary search file handle + * @level Level in the tree that we want a page for + * @page_idx Page number in the given level (0..2^level - 1) + * + * Outputs: + * + * @buf Set to address of page if the cache is large enough + */ +static int +get_page_from_cache(bsearch_file_handle bfh, size_t level, size_t page_idx, + char **buf) +{ + size_t idx = 0; + size_t page_sz; + + page_sz = bfh->page_sz << 1; /* we use double-size pages in the cache */ + + *buf = NULL; + + /* + * Compute index into cache. The cache is basically an array of + * double-size pages. The first (zeroth) double-size page in the + * cache will be the middle page of the file -- the root of the + * tree. The next two double-size pages will be the left and right + * pages of the second level in the tree. The next four double-size + * pages will be the four pages at the next level. And so on for as + * many pages as fit in the cache. + * + * The page index is the number of the page at the given level. We + * then compute (2^level - 1 + page index) * 2page size, check that + * we have that in the cache, check that the page has been read (it + * doesn't start with NUL). + */ + if (level) + idx = (1 << level) - 1 + page_idx; + if (((idx + 1) * page_sz * 2) > bfh->cache_sz) + return 0; + + *buf = &bfh->cache[idx * page_sz * 2]; + if (bfh->cache[idx * page_sz * 2] == '\0') + return 0; /* cache[idx] == NUL -> page not loaded in cache */ + return 1; +} + +/* + * Private function to read a page of @page_sz from @fd at offset @off + * into @buf, outputing the number of bytes read, which will be the same + * as @page_sz unless the page being read is the last page, in which + * case the number of remaining bytes in the file will be output. + * + * Returns 0 on success or an errno value otherwise (EIO if reads are + * short). + * + * Inputs: + * + * @bfh Binary search file handle + * @level Level in the binary search tree that we're at + * @page_idx Page "index" at the @level of the tree that we want + * @page Actual page number that we want + * want_double Whether we need a page or double page read + * + * Outputs: + * + * @buf Page read or cached + * @bytes Bytes read (may be less than page or double page size in + * the case of the last page, of course) + */ +static int +read_page(bsearch_file_handle bfh, size_t level, size_t page_idx, size_t page, + int want_double, const char **buf, size_t *bytes) +{ + int ret; + off_t off; + size_t expected; + size_t wanted; + char *page_buf; + + /* Figure out where we're reading and how much */ + off = page * bfh->page_sz; + if (off < 0) + return EOVERFLOW; + + wanted = bfh->page_sz << want_double; + expected = ((bfh->file_sz - off) > wanted) ? wanted : bfh->file_sz - off; + + if (get_page_from_cache(bfh, level, page_idx, &page_buf)) { + *buf = page_buf; + *bytes = expected; + return 0; /* found in cache */ + } + + + *bytes = 0; + *buf = NULL; + + /* OK, we have to read a page or double-size page */ + + if (page_buf) + want_double = 1; /* we'll be caching; we cache double-size pages */ + else + page_buf = bfh->page; /* we won't cache this page */ + + wanted = bfh->page_sz << want_double; + expected = ((bfh->file_sz - off) > wanted) ? wanted : bfh->file_sz - off; + +#ifdef HAVE_PREAD + ret = pread(bfh->fd, page_buf, expected, off); +#else + if (lseek(bfh->fd, off, SEEK_SET) == (off_t)-1) + return errno; + ret = read(bfh->fd, page_buf, expected); +#endif + if (ret < 0) + return errno; + + if (ret != expected) + return EIO; /* XXX ??? */ + + *buf = page_buf; + *bytes = expected; + return 0; +} + +/* + * Perform a binary search of a file where each line is a record (LF and + * CRLF supported). Each record consists of a key followed by an + * optional value separated from the key by whitespace. Whitespace can + * be quoted with backslashes. It's the caller's responsibility to + * encode/decode keys/values if quoting is desired; newlines should be + * encoded such that a newline does not appear in the result. + * + * The search is done with block-wise I/O (i.e., the whole file is not + * read into memory). + * + * All output arguments are optional. + * + * Returns 0 if key is found, -1 if not found, or an error code such as + * ENOMEM in case of error. + * + * NOTE: We could improve this by not freeing the buffer, instead + * requiring that the caller provide it. Further, we could cache + * the top N levels of [double-size] pages (2^N - 1 pages), which + * should speed up most searches by reducing the number of reads + * by N. + * + * Inputs: + * + * @fd File descriptor (file to search) + * @page_sz Page size (if zero then the file's st_blksize will be used) + * @key Key string to search for + * + * Outputs: + * + * @value Location to store a copy of the value (caller must free) + * @location Record location if found else the location where the + * record should be inserted (index into @buf) + * @loops Location to store a count of bisections required for + * search (useful for confirming logarithmic performance) + * @reads Location to store a count of pages read during search + * (useful for confirming logarithmic performance) + */ +int +_bsearch_file(bsearch_file_handle bfh, const char *key, + char **value, size_t *location, size_t *loops, size_t *reads) +{ + int ret; + const char *buf; + size_t buf_sz; + size_t page, l, r; + size_t my_reads = 0; + size_t my_loops_total = 0; + size_t my_loops; + size_t level; /* level in the tree */ + size_t page_idx = 0; /* page number in the tree level */ + size_t buf_location; + int cmp; + int buf_ends_in_eol = 0; + int buf_is_start = 0; + + if (reads) + *reads = 0; + if (value) + *value = NULL; + if (loops) + *loops = 0; + + /* If whole file is in memory then search that and we're done */ + if (bfh->file_sz == bfh->cache_sz) + return _bsearch_text(bfh->cache, bfh->cache_sz, key, value, location, loops); + + /* Else block-wise binary search */ + + l = 0; + r = (bfh->file_sz / bfh->page_sz) + 1; + for (level = 0, page = r >> 1; page >= l && page < r ; level++) { + ret = read_page(bfh, level, page_idx, page, 0, &buf, &buf_sz); + if (ret != 0) + return ret; + my_reads++; + if (buf[buf_sz - 1] == '\r' || buf[buf_sz - 1] == '\n') + buf_ends_in_eol = 1; + else + buf_ends_in_eol = 0; + + buf_is_start = page == 0 ? 1 : 0; + ret = bsearch_common(buf, (size_t)buf_sz, key, buf_is_start, + value, &buf_location, &cmp, &my_loops); + if (ret > 0) + return ret; + /* Found or no we update stats */ + my_loops_total += my_loops; + if (loops) + *loops = my_loops_total; + if (reads) + *reads = my_reads; + if (location) + *location = page * bfh->page_sz + buf_location; + if (ret == 0) + return 0; /* found! */ + /* Not found */ + if (cmp < 0) { + /* Search left */ + page_idx <<= 1; + r = page; + page = l + ((r - l) >> 1); + continue; + } else { + /* + * Search right, but first search the current and next + * blocks in case that the record we're looking for either + * straddles the boundary between this and the next record, + * or in case the record starts exactly at the next page. + */ + heim_assert(cmp > 0, "cmp > 0"); + + if (!buf_ends_in_eol || page == l || page == (r - 1)) { + ret = read_page(bfh, level, page_idx, page, 1, &buf, &buf_sz); + if (ret != 0) + return ret; + my_reads++; + + buf_is_start = page == l ? 1 : 0; + + ret = bsearch_common(buf, (size_t)buf_sz, key, buf_is_start, + value, &buf_location, &cmp, &my_loops); + if (ret > 0) + return ret; + my_loops_total += my_loops; + if (loops) + *loops = my_loops_total; + if (reads) + *reads = my_reads; + if (location) + *location = page * bfh->page_sz + buf_location; + if (ret == 0) + return 0; + } + + /* Oh well, search right */ + if (l == page && r == (l + 1)) + break; + page_idx = (page_idx << 1) + 1; + l = page; + page = l + ((r - l) >> 1); + continue; + } + } + return -1; +} + + +static int +stdb_open(void *plug, const char *dbtype, const char *dbname, + heim_dict_t options, void **db, heim_error_t *error) +{ + bsearch_file_handle bfh; + char *p; + int ret; + + if (error) + *error = NULL; + if (dbname == NULL || *dbname == '\0') { + if (error) + *error = heim_error_create(EINVAL, + N_("DB name required for sorted-text DB " + "plugin", "")); + return EINVAL; + } + p = strrchr(dbname, '.'); + if (p == NULL || strcmp(p, ".txt") != 0) { + if (error) + *error = heim_error_create(ENOTSUP, + N_("Text file (name ending in .txt) " + "required for sorted-text DB plugin", + "")); + return ENOTSUP; + } + + ret = _bsearch_file_open(dbname, 0, 0, &bfh, NULL); + if (ret) + return ret; + + *db = bfh; + return 0; +} + +static int +stdb_close(void *db, heim_error_t *error) +{ + bsearch_file_handle bfh = db; + + if (error) + *error = NULL; + _bsearch_file_close(&bfh); + return 0; +} + +static heim_data_t +stdb_copy_value(void *db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + bsearch_file_handle bfh = db; + const char *k; + char *v = NULL; + heim_data_t value; + int ret; + + if (error) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + if (table != HSTR("")) + return NULL; + + if (heim_get_tid(key) == HEIM_TID_STRING) + k = heim_string_get_utf8((heim_string_t)key); + else + k = (const char *)heim_data_get_ptr(key); + ret = _bsearch_file(bfh, k, &v, NULL, NULL, NULL); + if (ret == 0 && v == NULL) + ret = -1; /* Quiet lint */ + if (ret != 0) { + if (ret > 0 && error) + *error = heim_error_create(ret, "%s", strerror(ret)); + return NULL; + } + value = heim_data_create(v, strlen(v)); + free(v); + /* XXX Handle ENOMEM */ + return value; +} + +struct heim_db_type heim_sorted_text_file_dbtype = { + 1, stdb_open, NULL, stdb_close, NULL, NULL, NULL, NULL, NULL, NULL, + stdb_copy_value, NULL, NULL, NULL +}; diff --git a/crypto/heimdal/lib/base/data.c b/crypto/heimdal/lib/base/data.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/data.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2011 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" +#include + +static void +data_dealloc(void *ptr) +{ + heim_data_t d = ptr; + heim_octet_string *os = (heim_octet_string *)d; + heim_data_free_f_t *deallocp; + heim_data_free_f_t dealloc; + + if (os->data == NULL) + return; + + /* Possible string ref */ + deallocp = _heim_get_isaextra(os, 0); + dealloc = *deallocp; + if (dealloc != NULL) + dealloc(os->data); +} + +static int +data_cmp(void *a, void *b) +{ + heim_octet_string *osa = a, *osb = b; + if (osa->length != osb->length) + return osa->length - osb->length; + return memcmp(osa->data, osb->data, osa->length); +} + +static unsigned long +data_hash(void *ptr) +{ + heim_octet_string *os = ptr; + const unsigned char *s = os->data; + + if (os->length < 4) + return os->length; + return s[0] | (s[1] << 8) | + (s[os->length - 2] << 16) | (s[os->length - 1] << 24); +} + +struct heim_type_data _heim_data_object = { + HEIM_TID_DATA, + "data-object", + NULL, + data_dealloc, + NULL, + data_cmp, + data_hash, + NULL +}; + +/** + * Create a data object + * + * @param string the string to create, must be an utf8 string + * + * @return string object + */ + +heim_data_t +heim_data_create(const void *data, size_t length) +{ + heim_octet_string *os; + + os = _heim_alloc_object(&_heim_data_object, sizeof(*os) + length); + if (os) { + os->data = (uint8_t *)os + sizeof(*os); + os->length = length; + memcpy(os->data, data, length); + } + return (heim_data_t)os; +} + +heim_data_t +heim_data_ref_create(const void *data, size_t length, + heim_data_free_f_t dealloc) +{ + heim_octet_string *os; + heim_data_free_f_t *deallocp; + + os = _heim_alloc_object(&_heim_data_object, sizeof(*os) + length); + if (os) { + os->data = (void *)data; + os->length = length; + deallocp = _heim_get_isaextra(os, 0); + *deallocp = dealloc; + } + return (heim_data_t)os; +} + + +/** + * Return the type ID of data objects + * + * @return type id of data objects + */ + +heim_tid_t +heim_data_get_type_id(void) +{ + return HEIM_TID_DATA; +} + +/** + * Get the data value of the content. + * + * @param data the data object to get the value from + * + * @return a heim_octet_string + */ + +const heim_octet_string * +heim_data_get_data(heim_data_t data) +{ + /* Note that this works for data and data_ref objects */ + return (const heim_octet_string *)data; +} + +const void * +heim_data_get_ptr(heim_data_t data) +{ + /* Note that this works for data and data_ref objects */ + return ((const heim_octet_string *)data)->data; +} + +size_t heim_data_get_length(heim_data_t data) +{ + /* Note that this works for data and data_ref objects */ + return ((const heim_octet_string *)data)->length; +} diff --git a/crypto/heimdal/lib/base/db.c b/crypto/heimdal/lib/base/db.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/db.c @@ -0,0 +1,1727 @@ +/* + * Copyright (c) 2011, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * This is a pluggable simple DB abstraction, with a simple get/set/ + * delete key/value pair interface. + * + * Plugins may provide any of the following optional features: + * + * - tables -- multiple attribute/value tables in one DB + * - locking + * - transactions (i.e., allow any heim_object_t as key or value) + * - transcoding of values + * + * Stackable plugins that provide missing optional features are + * possible. + * + * Any plugin that provides locking will also provide transactions, but + * those transactions will not be atomic in the face of failures (a + * memory-based rollback log is used). + */ + +#include +#include +#include +#include +#include +#include +#ifdef WIN32 +#include +#else +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include "baselocl.h" +#include + +#define HEIM_ENOMEM(ep) \ + (((ep) && !*(ep)) ? \ + heim_error_get_code((*(ep) = heim_error_create_enomem())) : ENOMEM) + +#define HEIM_ERROR_HELPER(ep, ec, args) \ + (((ep) && !*(ep)) ? \ + heim_error_get_code((*(ep) = heim_error_create args)) : (ec)) + +#define HEIM_ERROR(ep, ec, args) \ + (ec == ENOMEM) ? HEIM_ENOMEM(ep) : HEIM_ERROR_HELPER(ep, ec, args); + +static heim_string_t to_base64(heim_data_t, heim_error_t *); +static heim_data_t from_base64(heim_string_t, heim_error_t *); + +static int open_file(const char *, int , int, int *, heim_error_t *); +static int read_json(const char *, heim_object_t *, heim_error_t *); +static struct heim_db_type json_dbt; + +static void db_dealloc(void *ptr); + +struct heim_type_data db_object = { + HEIM_TID_DB, + "db-object", + NULL, + db_dealloc, + NULL, + NULL, + NULL, + NULL +}; + + +static heim_base_once_t db_plugin_init_once = HEIM_BASE_ONCE_INIT; + +static heim_dict_t db_plugins; + +typedef struct db_plugin { + heim_string_t name; + heim_db_plug_open_f_t openf; + heim_db_plug_clone_f_t clonef; + heim_db_plug_close_f_t closef; + heim_db_plug_lock_f_t lockf; + heim_db_plug_unlock_f_t unlockf; + heim_db_plug_sync_f_t syncf; + heim_db_plug_begin_f_t beginf; + heim_db_plug_commit_f_t commitf; + heim_db_plug_rollback_f_t rollbackf; + heim_db_plug_copy_value_f_t copyf; + heim_db_plug_set_value_f_t setf; + heim_db_plug_del_key_f_t delf; + heim_db_plug_iter_f_t iterf; + void *data; +} db_plugin_desc, *db_plugin; + +struct heim_db_data { + db_plugin plug; + heim_string_t dbtype; + heim_string_t dbname; + heim_dict_t options; + void *db_data; + heim_data_t to_release; + heim_error_t error; + int ret; + unsigned int in_transaction:1; + unsigned int ro:1; + unsigned int ro_tx:1; + heim_dict_t set_keys; + heim_dict_t del_keys; + heim_string_t current_table; +}; + +static int +db_do_log_actions(heim_db_t db, heim_error_t *error); +static int +db_replay_log(heim_db_t db, heim_error_t *error); + +static HEIMDAL_MUTEX db_type_mutex = HEIMDAL_MUTEX_INITIALIZER; + +static void +db_init_plugins_once(void *arg) +{ + db_plugins = heim_retain(arg); +} + +static void +plugin_dealloc(void *arg) +{ + db_plugin plug = arg; + + heim_release(plug->name); +} + +/** heim_db_register + * @brief Registers a DB type for use with heim_db_create(). + * + * @param dbtype Name of DB type + * @param data Private data argument to the dbtype's openf method + * @param plugin Structure with DB type methods (function pointers) + * + * Backends that provide begin/commit/rollback methods must provide ACID + * semantics. + * + * The registered DB type will have ACID semantics for backends that do + * not provide begin/commit/rollback methods but do provide lock/unlock + * and rdjournal/wrjournal methods (using a replay log journalling + * scheme). + * + * If the registered DB type does not natively provide read vs. write + * transaction isolation but does provide a lock method then the DB will + * provide read/write transaction isolation. + * + * @return ENOMEM on failure, else 0. + * + * @addtogroup heimbase + */ +int +heim_db_register(const char *dbtype, + void *data, + struct heim_db_type *plugin) +{ + heim_dict_t plugins; + heim_string_t s; + db_plugin plug, plug2; + int ret = 0; + + if ((plugin->beginf != NULL && plugin->commitf == NULL) || + (plugin->beginf != NULL && plugin->rollbackf == NULL) || + (plugin->lockf != NULL && plugin->unlockf == NULL) || + plugin->copyf == NULL) + heim_abort("Invalid DB plugin; make sure methods are paired"); + + /* Initialize */ + plugins = heim_dict_create(11); + if (plugins == NULL) + return ENOMEM; + heim_base_once_f(&db_plugin_init_once, plugins, db_init_plugins_once); + heim_release(plugins); + heim_assert(db_plugins != NULL, "heim_db plugin table initialized"); + + s = heim_string_create(dbtype); + if (s == NULL) + return ENOMEM; + + plug = heim_alloc(sizeof (*plug), "db_plug", plugin_dealloc); + if (plug == NULL) { + heim_release(s); + return ENOMEM; + } + + plug->name = heim_retain(s); + plug->openf = plugin->openf; + plug->clonef = plugin->clonef; + plug->closef = plugin->closef; + plug->lockf = plugin->lockf; + plug->unlockf = plugin->unlockf; + plug->syncf = plugin->syncf; + plug->beginf = plugin->beginf; + plug->commitf = plugin->commitf; + plug->rollbackf = plugin->rollbackf; + plug->copyf = plugin->copyf; + plug->setf = plugin->setf; + plug->delf = plugin->delf; + plug->iterf = plugin->iterf; + plug->data = data; + + HEIMDAL_MUTEX_lock(&db_type_mutex); + plug2 = heim_dict_get_value(db_plugins, s); + if (plug2 == NULL) + ret = heim_dict_set_value(db_plugins, s, plug); + HEIMDAL_MUTEX_unlock(&db_type_mutex); + heim_release(plug); + heim_release(s); + + return ret; +} + +static void +db_dealloc(void *arg) +{ + heim_db_t db = arg; + heim_assert(!db->in_transaction, + "rollback or commit heim_db_t before releasing it"); + if (db->db_data) + (void) db->plug->closef(db->db_data, NULL); + heim_release(db->to_release); + heim_release(db->dbtype); + heim_release(db->dbname); + heim_release(db->options); + heim_release(db->set_keys); + heim_release(db->del_keys); + heim_release(db->error); +} + +struct dbtype_iter { + heim_db_t db; + const char *dbname; + heim_dict_t options; + heim_error_t *error; +}; + +/* + * Helper to create a DB handle with the first registered DB type that + * can open the given DB. This is useful when the app doesn't know the + * DB type a priori. This assumes that DB types can "taste" DBs, either + * from the filename extension or from the actual file contents. + */ +static void +dbtype_iter2create_f(heim_object_t dbtype, heim_object_t junk, void *arg) +{ + struct dbtype_iter *iter_ctx = arg; + + if (iter_ctx->db != NULL) + return; + iter_ctx->db = heim_db_create(heim_string_get_utf8(dbtype), + iter_ctx->dbname, iter_ctx->options, + iter_ctx->error); +} + +/** + * Open a database of the given dbtype. + * + * Database type names can be composed of one or more pseudo-DB types + * and one concrete DB type joined with a '+' between each. For + * example: "transaction+bdb" might be a Berkeley DB with a layer above + * that provides transactions. + * + * Options may be provided via a dict (an associative array). Existing + * options include: + * + * - "create", with any value (create if DB doesn't exist) + * - "exclusive", with any value (exclusive create) + * - "truncate", with any value (truncate the DB) + * - "read-only", with any value (disallow writes) + * - "sync", with any value (make transactions durable) + * - "journal-name", with a string value naming a journal file name + * + * @param dbtype Name of DB type + * @param dbname Name of DB (likely a file path) + * @param options Options dict + * @param db Output open DB handle + * @param error Output error object + * + * @return a DB handle + * + * @addtogroup heimbase + */ +heim_db_t +heim_db_create(const char *dbtype, const char *dbname, + heim_dict_t options, heim_error_t *error) +{ + heim_string_t s; + char *p; + db_plugin plug; + heim_db_t db; + int ret = 0; + + if (options == NULL) { + options = heim_dict_create(11); + if (options == NULL) { + if (error) + *error = heim_error_create_enomem(); + return NULL; + } + } else { + (void) heim_retain(options); + } + + if (db_plugins == NULL) { + heim_release(options); + return NULL; + } + + if (dbtype == NULL || *dbtype == '\0') { + struct dbtype_iter iter_ctx = { NULL, dbname, options, error}; + + /* Try all dbtypes */ + heim_dict_iterate_f(db_plugins, &iter_ctx, dbtype_iter2create_f); + heim_release(options); + return iter_ctx.db; + } else if (strstr(dbtype, "json")) { + (void) heim_db_register(dbtype, NULL, &json_dbt); + } + + /* + * Allow for dbtypes that are composed from pseudo-dbtypes chained + * to a real DB type with '+'. For example a pseudo-dbtype might + * add locking, transactions, transcoding of values, ... + */ + p = strchr(dbtype, '+'); + if (p != NULL) + s = heim_string_create_with_bytes(dbtype, p - dbtype); + else + s = heim_string_create(dbtype); + if (s == NULL) { + heim_release(options); + return NULL; + } + + HEIMDAL_MUTEX_lock(&db_type_mutex); + plug = heim_dict_get_value(db_plugins, s); + HEIMDAL_MUTEX_unlock(&db_type_mutex); + heim_release(s); + if (plug == NULL) { + if (error) + *error = heim_error_create(ENOENT, + N_("Heimdal DB plugin not found: %s", ""), + dbtype); + heim_release(options); + return NULL; + } + + db = _heim_alloc_object(&db_object, sizeof(*db)); + if (db == NULL) { + heim_release(options); + return NULL; + } + + db->in_transaction = 0; + db->ro_tx = 0; + db->set_keys = NULL; + db->del_keys = NULL; + db->plug = plug; + db->options = options; + + ret = plug->openf(plug->data, dbtype, dbname, options, &db->db_data, error); + if (ret) { + heim_release(db); + if (error && *error == NULL) + *error = heim_error_create(ENOENT, + N_("Heimdal DB could not be opened: %s", ""), + dbname); + return NULL; + } + + ret = db_replay_log(db, error); + if (ret) { + heim_release(db); + return NULL; + } + + if (plug->clonef == NULL) { + db->dbtype = heim_string_create(dbtype); + db->dbname = heim_string_create(dbname); + + if (!db->dbtype || ! db->dbname) { + heim_release(db); + if (error) + *error = heim_error_create_enomem(); + return NULL; + } + } + + return db; +} + +/** + * Clone (duplicate) an open DB handle. + * + * This is useful for multi-threaded applications. Applications must + * synchronize access to any given DB handle. + * + * Returns EBUSY if there is an open transaction for the input db. + * + * @param db Open DB handle + * @param error Output error object + * + * @return a DB handle + * + * @addtogroup heimbase + */ +heim_db_t +heim_db_clone(heim_db_t db, heim_error_t *error) +{ + heim_db_t result; + int ret; + + if (heim_get_tid(db) != HEIM_TID_DB) + heim_abort("Expected a database"); + if (db->in_transaction) + heim_abort("DB handle is busy"); + + if (db->plug->clonef == NULL) { + return heim_db_create(heim_string_get_utf8(db->dbtype), + heim_string_get_utf8(db->dbname), + db->options, error); + } + + result = _heim_alloc_object(&db_object, sizeof(*result)); + if (result == NULL) { + if (error) + *error = heim_error_create_enomem(); + return NULL; + } + + result->set_keys = NULL; + result->del_keys = NULL; + ret = db->plug->clonef(db->db_data, &result->db_data, error); + if (ret) { + heim_release(result); + if (error && !*error) + *error = heim_error_create(ENOENT, + N_("Could not re-open DB while cloning", "")); + return NULL; + } + db->db_data = NULL; + return result; +} + +/** + * Open a transaction on the given db. + * + * @param db Open DB handle + * @param error Output error object + * + * @return 0 on success, system error otherwise + * + * @addtogroup heimbase + */ +int +heim_db_begin(heim_db_t db, int read_only, heim_error_t *error) +{ + int ret; + + if (heim_get_tid(db) != HEIM_TID_DB) + return EINVAL; + + if (db->in_transaction && (read_only || !db->ro_tx || (!read_only && !db->ro_tx))) + heim_abort("DB already in transaction"); + + if (db->plug->setf == NULL || db->plug->delf == NULL) + return EINVAL; + + if (db->plug->beginf) { + ret = db->plug->beginf(db->db_data, read_only, error); + if (ret) + return ret; + } else if (!db->in_transaction) { + /* Try to emulate transactions */ + + if (db->plug->lockf == NULL) + return EINVAL; /* can't lock? -> no transactions */ + + /* Assume unlock provides sync/durability */ + ret = db->plug->lockf(db->db_data, read_only, error); + if (ret) + return ret; + + ret = db_replay_log(db, error); + if (ret) { + ret = db->plug->unlockf(db->db_data, error); + return ret; + } + + db->set_keys = heim_dict_create(11); + if (db->set_keys == NULL) + return ENOMEM; + db->del_keys = heim_dict_create(11); + if (db->del_keys == NULL) { + heim_release(db->set_keys); + db->set_keys = NULL; + return ENOMEM; + } + } else { + heim_assert(read_only == 0, "Internal error"); + ret = db->plug->lockf(db->db_data, 0, error); + if (ret) + return ret; + } + db->in_transaction = 1; + db->ro_tx = !!read_only; + return 0; +} + +/** + * Commit an open transaction on the given db. + * + * @param db Open DB handle + * @param error Output error object + * + * @return 0 on success, system error otherwise + * + * @addtogroup heimbase + */ +int +heim_db_commit(heim_db_t db, heim_error_t *error) +{ + int ret, ret2; + heim_string_t journal_fname = NULL; + + if (heim_get_tid(db) != HEIM_TID_DB) + return EINVAL; + if (!db->in_transaction) + return 0; + if (db->plug->commitf == NULL && db->plug->lockf == NULL) + return EINVAL; + + if (db->plug->commitf != NULL) { + ret = db->plug->commitf(db->db_data, error); + if (ret) + (void) db->plug->rollbackf(db->db_data, error); + + db->in_transaction = 0; + db->ro_tx = 0; + return ret; + } + + if (db->ro_tx) { + ret = 0; + goto done; + } + + if (db->options == NULL) + journal_fname = heim_dict_get_value(db->options, HSTR("journal-filename")); + + if (journal_fname != NULL) { + heim_array_t a; + heim_string_t journal_contents; + size_t len, bytes; + int save_errno; + + /* Create contents for replay log */ + ret = ENOMEM; + a = heim_array_create(); + if (a == NULL) + goto err; + ret = heim_array_append_value(a, db->set_keys); + if (ret) { + heim_release(a); + goto err; + } + ret = heim_array_append_value(a, db->del_keys); + if (ret) { + heim_release(a); + goto err; + } + journal_contents = heim_json_copy_serialize(a, 0, error); + heim_release(a); + + /* Write replay log */ + if (journal_fname != NULL) { + int fd; + + ret = open_file(heim_string_get_utf8(journal_fname), 1, 0, &fd, error); + if (ret) { + heim_release(journal_contents); + goto err; + } + len = strlen(heim_string_get_utf8(journal_contents)); + bytes = write(fd, heim_string_get_utf8(journal_contents), len); + save_errno = errno; + heim_release(journal_contents); + ret = close(fd); + if (bytes != len) { + /* Truncate replay log */ + (void) open_file(heim_string_get_utf8(journal_fname), 1, 0, NULL, error); + ret = save_errno; + goto err; + } + if (ret) + goto err; + } + } + + /* Apply logged actions */ + ret = db_do_log_actions(db, error); + if (ret) + return ret; + + if (db->plug->syncf != NULL) { + /* fsync() or whatever */ + ret = db->plug->syncf(db->db_data, error); + if (ret) + return ret; + } + + /* Truncate replay log and we're done */ + if (journal_fname != NULL) { + int fd; + + ret2 = open_file(heim_string_get_utf8(journal_fname), 1, 0, &fd, error); + if (ret2 == 0) + (void) close(fd); + } + + /* + * Clean up; if we failed to remore the replay log that's OK, we'll + * handle that again in heim_db_commit() + */ +done: + heim_release(db->set_keys); + heim_release(db->del_keys); + db->set_keys = NULL; + db->del_keys = NULL; + db->in_transaction = 0; + db->ro_tx = 0; + + ret2 = db->plug->unlockf(db->db_data, error); + if (ret == 0) + ret = ret2; + + return ret; + +err: + return HEIM_ERROR(error, ret, + (ret, N_("Error while committing transaction: %s", ""), + strerror(ret))); +} + +/** + * Rollback an open transaction on the given db. + * + * @param db Open DB handle + * @param error Output error object + * + * @return 0 on success, system error otherwise + * + * @addtogroup heimbase + */ +int +heim_db_rollback(heim_db_t db, heim_error_t *error) +{ + int ret = 0; + + if (heim_get_tid(db) != HEIM_TID_DB) + return EINVAL; + if (!db->in_transaction) + return 0; + + if (db->plug->rollbackf != NULL) + ret = db->plug->rollbackf(db->db_data, error); + else if (db->plug->unlockf != NULL) + ret = db->plug->unlockf(db->db_data, error); + + heim_release(db->set_keys); + heim_release(db->del_keys); + db->set_keys = NULL; + db->del_keys = NULL; + db->in_transaction = 0; + db->ro_tx = 0; + + return ret; +} + +/** + * Get type ID of heim_db_t objects. + * + * @addtogroup heimbase + */ +heim_tid_t +heim_db_get_type_id(void) +{ + return HEIM_TID_DB; +} + +heim_data_t +_heim_db_get_value(heim_db_t db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + heim_release(db->to_release); + db->to_release = heim_db_copy_value(db, table, key, error); + return db->to_release; +} + +/** + * Lookup a key's value in the DB. + * + * Returns 0 on success, -1 if the key does not exist in the DB, or a + * system error number on failure. + * + * @param db Open DB handle + * @param key Key + * @param error Output error object + * + * @return the value (retained), if there is one for the given key + * + * @addtogroup heimbase + */ +heim_data_t +heim_db_copy_value(heim_db_t db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + heim_object_t v; + heim_data_t result; + + if (heim_get_tid(db) != HEIM_TID_DB) + return NULL; + + if (error != NULL) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + if (db->in_transaction) { + heim_string_t key64; + + key64 = to_base64(key, error); + if (key64 == NULL) { + if (error) + *error = heim_error_create_enomem(); + return NULL; + } + + v = heim_path_copy(db->set_keys, error, table, key64, NULL); + if (v != NULL) { + heim_release(key64); + return v; + } + v = heim_path_copy(db->del_keys, error, table, key64, NULL); /* can't be NULL */ + heim_release(key64); + if (v != NULL) + return NULL; + } + + result = db->plug->copyf(db->db_data, table, key, error); + + return result; +} + +/** + * Set a key's value in the DB. + * + * @param db Open DB handle + * @param key Key + * @param value Value (if NULL the key will be deleted, but empty is OK) + * @param error Output error object + * + * @return 0 on success, system error otherwise + * + * @addtogroup heimbase + */ +int +heim_db_set_value(heim_db_t db, heim_string_t table, + heim_data_t key, heim_data_t value, heim_error_t *error) +{ + heim_string_t key64 = NULL; + int ret; + + if (error != NULL) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + if (value == NULL) + /* Use heim_null_t instead of NULL */ + return heim_db_delete_key(db, table, key, error); + + if (heim_get_tid(db) != HEIM_TID_DB) + return EINVAL; + + if (heim_get_tid(key) != HEIM_TID_DATA) + return HEIM_ERROR(error, EINVAL, + (EINVAL, N_("DB keys must be data", ""))); + + if (db->plug->setf == NULL) + return EBADF; + + if (!db->in_transaction) { + ret = heim_db_begin(db, 0, error); + if (ret) + goto err; + heim_assert(db->in_transaction, "Internal error"); + ret = heim_db_set_value(db, table, key, value, error); + if (ret) { + (void) heim_db_rollback(db, NULL); + return ret; + } + return heim_db_commit(db, error); + } + + /* Transaction emulation */ + heim_assert(db->set_keys != NULL, "Internal error"); + key64 = to_base64(key, error); + if (key64 == NULL) + return HEIM_ENOMEM(error); + + if (db->ro_tx) { + ret = heim_db_begin(db, 0, error); + if (ret) + goto err; + } + ret = heim_path_create(db->set_keys, 29, value, error, table, key64, NULL); + if (ret) + goto err; + heim_path_delete(db->del_keys, error, table, key64, NULL); + heim_release(key64); + + return 0; + +err: + heim_release(key64); + return HEIM_ERROR(error, ret, + (ret, N_("Could not set a dict value while while " + "setting a DB value", ""))); +} + +/** + * Delete a key and its value from the DB + * + * + * @param db Open DB handle + * @param key Key + * @param error Output error object + * + * @return 0 on success, system error otherwise + * + * @addtogroup heimbase + */ +int +heim_db_delete_key(heim_db_t db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + heim_string_t key64 = NULL; + int ret; + + if (error != NULL) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + if (heim_get_tid(db) != HEIM_TID_DB) + return EINVAL; + + if (db->plug->delf == NULL) + return EBADF; + + if (!db->in_transaction) { + ret = heim_db_begin(db, 0, error); + if (ret) + goto err; + heim_assert(db->in_transaction, "Internal error"); + ret = heim_db_delete_key(db, table, key, error); + if (ret) { + (void) heim_db_rollback(db, NULL); + return ret; + } + return heim_db_commit(db, error); + } + + /* Transaction emulation */ + heim_assert(db->set_keys != NULL, "Internal error"); + key64 = to_base64(key, error); + if (key64 == NULL) + return HEIM_ENOMEM(error); + if (db->ro_tx) { + ret = heim_db_begin(db, 0, error); + if (ret) + goto err; + } + ret = heim_path_create(db->del_keys, 29, heim_number_create(1), error, table, key64, NULL); + if (ret) + goto err; + heim_path_delete(db->set_keys, error, table, key64, NULL); + heim_release(key64); + + return 0; + +err: + heim_release(key64); + return HEIM_ERROR(error, ret, + (ret, N_("Could not set a dict value while while " + "deleting a DB value", ""))); +} + +/** + * Iterate a callback function over keys and values from a DB. + * + * @param db Open DB handle + * @param iter_data Callback function's private data + * @param iter_f Callback function, called once per-key/value pair + * @param error Output error object + * + * @addtogroup heimbase + */ +void +heim_db_iterate_f(heim_db_t db, heim_string_t table, void *iter_data, + heim_db_iterator_f_t iter_f, heim_error_t *error) +{ + if (error != NULL) + *error = NULL; + + if (heim_get_tid(db) != HEIM_TID_DB) + return; + + if (!db->in_transaction) + db->plug->iterf(db->db_data, table, iter_data, iter_f, error); +} + +static void +db_replay_log_table_set_keys_iter(heim_object_t key, heim_object_t value, + void *arg) +{ + heim_db_t db = arg; + heim_data_t k, v; + + if (db->ret) + return; + + k = from_base64((heim_string_t)key, &db->error); + if (k == NULL) { + db->ret = ENOMEM; + return; + } + v = (heim_data_t)value; + + db->ret = db->plug->setf(db->db_data, db->current_table, k, v, &db->error); + heim_release(k); +} + +static void +db_replay_log_table_del_keys_iter(heim_object_t key, heim_object_t value, + void *arg) +{ + heim_db_t db = arg; + heim_data_t k; + + if (db->ret) { + db->ret = ENOMEM; + return; + } + + k = from_base64((heim_string_t)key, &db->error); + if (k == NULL) + return; + + db->ret = db->plug->delf(db->db_data, db->current_table, k, &db->error); + heim_release(k); +} + +static void +db_replay_log_set_keys_iter(heim_object_t table, heim_object_t table_dict, + void *arg) +{ + heim_db_t db = arg; + + if (db->ret) + return; + + db->current_table = table; + heim_dict_iterate_f(table_dict, db, db_replay_log_table_set_keys_iter); +} + +static void +db_replay_log_del_keys_iter(heim_object_t table, heim_object_t table_dict, + void *arg) +{ + heim_db_t db = arg; + + if (db->ret) + return; + + db->current_table = table; + heim_dict_iterate_f(table_dict, db, db_replay_log_table_del_keys_iter); +} + +static int +db_do_log_actions(heim_db_t db, heim_error_t *error) +{ + int ret; + + if (error) + *error = NULL; + + db->ret = 0; + db->error = NULL; + if (db->set_keys != NULL) + heim_dict_iterate_f(db->set_keys, db, db_replay_log_set_keys_iter); + if (db->del_keys != NULL) + heim_dict_iterate_f(db->del_keys, db, db_replay_log_del_keys_iter); + + ret = db->ret; + db->ret = 0; + if (error && db->error) { + *error = db->error; + db->error = NULL; + } else { + heim_release(db->error); + db->error = NULL; + } + return ret; +} + +static int +db_replay_log(heim_db_t db, heim_error_t *error) +{ + int ret; + heim_string_t journal_fname = NULL; + heim_object_t journal; + size_t len; + + heim_assert(!db->in_transaction, "DB transaction not open"); + heim_assert(db->set_keys == NULL && db->set_keys == NULL, "DB transaction not open"); + + if (error) + *error = NULL; + + if (db->options == NULL) + return 0; + + journal_fname = heim_dict_get_value(db->options, HSTR("journal-filename")); + if (journal_fname == NULL) + return 0; + + ret = read_json(heim_string_get_utf8(journal_fname), &journal, error); + if (ret == ENOENT) { + heim_release(journal_fname); + return 0; + } + if (ret == 0 && journal == NULL) { + heim_release(journal_fname); + return 0; + } + if (ret != 0) { + heim_release(journal_fname); + return ret; + } + + if (heim_get_tid(journal) != HEIM_TID_ARRAY) { + heim_release(journal_fname); + return HEIM_ERROR(error, EINVAL, + (ret, N_("Invalid journal contents; delete journal", + ""))); + } + + len = heim_array_get_length(journal); + + if (len > 0) + db->set_keys = heim_array_get_value(journal, 0); + if (len > 1) + db->del_keys = heim_array_get_value(journal, 1); + ret = db_do_log_actions(db, error); + if (ret) { + heim_release(journal_fname); + return ret; + } + + /* Truncate replay log and we're done */ + ret = open_file(heim_string_get_utf8(journal_fname), 1, 0, NULL, error); + heim_release(journal_fname); + if (ret) + return ret; + heim_release(db->set_keys); + heim_release(db->del_keys); + db->set_keys = NULL; + db->del_keys = NULL; + + return 0; +} + +static +heim_string_t to_base64(heim_data_t data, heim_error_t *error) +{ + char *b64 = NULL; + heim_string_t s = NULL; + const heim_octet_string *d; + int ret; + + d = heim_data_get_data(data); + ret = rk_base64_encode(d->data, d->length, &b64); + if (ret < 0 || b64 == NULL) + goto enomem; + s = heim_string_ref_create(b64, free); + if (s == NULL) + goto enomem; + return s; + +enomem: + free(b64); + if (error) + *error = heim_error_create_enomem(); + return NULL; +} + +static +heim_data_t from_base64(heim_string_t s, heim_error_t *error) +{ + void *buf; + size_t len; + heim_data_t d; + + buf = malloc(strlen(heim_string_get_utf8(s))); + if (buf == NULL) + goto enomem; + + len = rk_base64_decode(heim_string_get_utf8(s), buf); + d = heim_data_ref_create(buf, len, free); + if (d == NULL) + goto enomem; + return d; + +enomem: + free(buf); + if (error) + *error = heim_error_create_enomem(); + return NULL; +} + + +static int +open_file(const char *dbname, int for_write, int excl, int *fd_out, heim_error_t *error) +{ +#ifdef WIN32 + HANDLE hFile; + int ret = 0; + + if (fd_out) + *fd_out = -1; + + if (for_write) + hFile = CreateFile(dbname, GENERIC_WRITE | GENERIC_READ, 0, + NULL, /* we'll close as soon as we read */ + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + else + hFile = CreateFile(dbname, GENERIC_READ, FILE_SHARE_READ, + NULL, /* we'll close as soon as we read */ + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) { + ret = GetLastError(); + _set_errno(ret); /* CreateFile() does not set errno */ + goto err; + } + if (fd_out == NULL) { + (void) CloseHandle(hFile); + return 0; + } + + *fd_out = _open_osfhandle((intptr_t) hFile, 0); + if (*fd_out < 0) { + ret = errno; + (void) CloseHandle(hFile); + goto err; + } + + /* No need to lock given share deny mode */ + return 0; + +err: + if (error != NULL) { + char *s = NULL; + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + 0, ret, 0, (LPTSTR) &s, 0, NULL); + *error = heim_error_create(ret, N_("Could not open JSON file %s: %s", ""), + dbname, s ? s : ""); + LocalFree(s); + } + return ret; +#else + int ret = 0; + int fd; + + if (fd_out) + *fd_out = -1; + + if (for_write && excl) + fd = open(dbname, O_CREAT | O_EXCL | O_WRONLY, 0600); + else if (for_write) + fd = open(dbname, O_CREAT | O_TRUNC | O_WRONLY, 0600); + else + fd = open(dbname, O_RDONLY); + if (fd < 0) { + if (error != NULL) + *error = heim_error_create(ret, N_("Could not open JSON file %s: %s", ""), + dbname, strerror(errno)); + return errno; + } + + if (fd_out == NULL) { + (void) close(fd); + return 0; + } + + ret = flock(fd, for_write ? LOCK_EX : LOCK_SH); + if (ret == -1) { + /* Note that we if O_EXCL we're leaving the [lock] file around */ + (void) close(fd); + return HEIM_ERROR(error, errno, + (errno, N_("Could not lock JSON file %s: %s", ""), + dbname, strerror(errno))); + } + + *fd_out = fd; + + return 0; +#endif +} + +static int +read_json(const char *dbname, heim_object_t *out, heim_error_t *error) +{ + struct stat st; + char *str = NULL; + int ret; + int fd = -1; + ssize_t bytes; + + *out = NULL; + ret = open_file(dbname, 0, 0, &fd, error); + if (ret) + return ret; + + ret = fstat(fd, &st); + if (ret == -1) { + (void) close(fd); + return HEIM_ERROR(error, errno, + (ret, N_("Could not stat JSON DB %s: %s", ""), + dbname, strerror(errno))); + } + + if (st.st_size == 0) { + (void) close(fd); + return 0; + } + + str = malloc(st.st_size + 1); + if (str == NULL) { + (void) close(fd); + return HEIM_ENOMEM(error); + } + + bytes = read(fd, str, st.st_size); + (void) close(fd); + if (bytes != st.st_size) { + free(str); + if (bytes >= 0) + errno = EINVAL; /* ?? */ + return HEIM_ERROR(error, errno, + (ret, N_("Could not read JSON DB %s: %s", ""), + dbname, strerror(errno))); + } + str[st.st_size] = '\0'; + *out = heim_json_create(str, 10, 0, error); + free(str); + if (*out == NULL) + return (error && *error) ? heim_error_get_code(*error) : EINVAL; + return 0; +} + +typedef struct json_db { + heim_dict_t dict; + heim_string_t dbname; + heim_string_t bkpname; + int fd; + time_t last_read_time; + unsigned int read_only:1; + unsigned int locked:1; + unsigned int locked_needs_unlink:1; +} *json_db_t; + +static int +json_db_open(void *plug, const char *dbtype, const char *dbname, + heim_dict_t options, void **db, heim_error_t *error) +{ + json_db_t jsondb; + heim_dict_t contents = NULL; + heim_string_t dbname_s = NULL; + heim_string_t bkpname_s = NULL; + + if (error) + *error = NULL; + if (dbtype && *dbtype && strcmp(dbtype, "json")) + return HEIM_ERROR(error, EINVAL, (EINVAL, N_("Wrong DB type", ""))); + if (dbname && *dbname && strcmp(dbname, "MEMORY") != 0) { + char *ext = strrchr(dbname, '.'); + char *bkpname; + size_t len; + int ret; + + if (ext == NULL || strcmp(ext, ".json") != 0) + return HEIM_ERROR(error, EINVAL, + (EINVAL, N_("JSON DB files must end in .json", + ""))); + + if (options) { + heim_object_t vc, ve, vt; + + vc = heim_dict_get_value(options, HSTR("create")); + ve = heim_dict_get_value(options, HSTR("exclusive")); + vt = heim_dict_get_value(options, HSTR("truncate")); + if (vc && vt) { + ret = open_file(dbname, 1, ve ? 1 : 0, NULL, error); + if (ret) + return ret; + } else if (vc || ve || vt) { + return HEIM_ERROR(error, EINVAL, + (EINVAL, N_("Invalid JSON DB open options", + ""))); + } + /* + * We don't want cloned handles to truncate the DB, eh? + * + * We should really just create a copy of the options dict + * rather than modify the caller's! But for that it'd be + * nicer to have copy utilities in heimbase, something like + * this: + * + * heim_object_t heim_copy(heim_object_t src, int depth, + * heim_error_t *error); + * + * so that options = heim_copy(options, 1); means copy the + * dict but nothing else (whereas depth == 0 would mean + * heim_retain(), and depth > 1 would be copy that many + * levels). + */ + heim_dict_delete_key(options, HSTR("create")); + heim_dict_delete_key(options, HSTR("exclusive")); + heim_dict_delete_key(options, HSTR("truncate")); + } + dbname_s = heim_string_create(dbname); + if (dbname_s == NULL) + return HEIM_ENOMEM(error); + + len = snprintf(NULL, 0, "%s~", dbname); + bkpname = malloc(len + 2); + if (bkpname == NULL) { + heim_release(dbname_s); + return HEIM_ENOMEM(error); + } + (void) snprintf(bkpname, len + 1, "%s~", dbname); + bkpname_s = heim_string_create(bkpname); + free(bkpname); + if (bkpname_s == NULL) { + heim_release(dbname_s); + return HEIM_ENOMEM(error); + } + + ret = read_json(dbname, (heim_object_t *)&contents, error); + if (ret) { + heim_release(bkpname_s); + heim_release(dbname_s); + return ret; + } + + if (contents != NULL && heim_get_tid(contents) != HEIM_TID_DICT) { + heim_release(bkpname_s); + heim_release(dbname_s); + return HEIM_ERROR(error, EINVAL, + (EINVAL, N_("JSON DB contents not valid JSON", + ""))); + } + } + + jsondb = heim_alloc(sizeof (*jsondb), "json_db", NULL); + if (jsondb == NULL) { + heim_release(contents); + heim_release(dbname_s); + heim_release(bkpname_s); + return ENOMEM; + } + + jsondb->last_read_time = time(NULL); + jsondb->fd = -1; + jsondb->dbname = dbname_s; + jsondb->bkpname = bkpname_s; + jsondb->read_only = 0; + + if (contents != NULL) + jsondb->dict = contents; + else { + jsondb->dict = heim_dict_create(29); + if (jsondb->dict == NULL) { + heim_release(jsondb); + return ENOMEM; + } + } + + *db = jsondb; + return 0; +} + +static int +json_db_close(void *db, heim_error_t *error) +{ + json_db_t jsondb = db; + + if (error) + *error = NULL; + if (jsondb->fd > -1) + (void) close(jsondb->fd); + jsondb->fd = -1; + heim_release(jsondb->dbname); + heim_release(jsondb->bkpname); + heim_release(jsondb->dict); + heim_release(jsondb); + return 0; +} + +static int +json_db_lock(void *db, int read_only, heim_error_t *error) +{ + json_db_t jsondb = db; + int ret; + + heim_assert(jsondb->fd == -1 || (jsondb->read_only && !read_only), + "DB locks are not recursive"); + + jsondb->read_only = read_only ? 1 : 0; + if (jsondb->fd > -1) + return 0; + + ret = open_file(heim_string_get_utf8(jsondb->bkpname), 1, 1, &jsondb->fd, error); + if (ret == 0) { + jsondb->locked_needs_unlink = 1; + jsondb->locked = 1; + } + return ret; +} + +static int +json_db_unlock(void *db, heim_error_t *error) +{ + json_db_t jsondb = db; + int ret = 0; + + heim_assert(jsondb->locked, "DB not locked when unlock attempted"); + if (jsondb->fd > -1) + ret = close(jsondb->fd); + jsondb->fd = -1; + jsondb->read_only = 0; + jsondb->locked = 0; + if (jsondb->locked_needs_unlink) + unlink(heim_string_get_utf8(jsondb->bkpname)); + jsondb->locked_needs_unlink = 0; + return ret; +} + +static int +json_db_sync(void *db, heim_error_t *error) +{ + json_db_t jsondb = db; + size_t len, bytes; + heim_error_t e; + heim_string_t json; + const char *json_text = NULL; + int ret = 0; + int fd = -1; +#ifdef WIN32 + int tries = 3; +#endif + + heim_assert(jsondb->fd > -1, "DB not locked when sync attempted"); + + json = heim_json_copy_serialize(jsondb->dict, 0, &e); + if (json == NULL) { + if (error) + *error = e; + else + heim_release(e); + return heim_error_get_code(e); + } + + json_text = heim_string_get_utf8(json); + len = strlen(json_text); + errno = 0; + +#ifdef WIN32 + while (tries--) { + ret = open_file(heim_string_get_utf8(jsondb->dbname), 1, 0, &fd, error); + if (ret == 0) + break; + sleep(1); + } + if (ret) { + heim_release(json); + return ret; + } +#else + fd = jsondb->fd; +#endif /* WIN32 */ + + bytes = write(fd, json_text, len); + heim_release(json); + if (bytes != len) + return errno ? errno : EIO; + ret = fsync(fd); + if (ret) + return ret; + +#ifdef WIN32 + ret = close(fd); + if (ret) + return GetLastError(); +#else + ret = rename(heim_string_get_utf8(jsondb->bkpname), heim_string_get_utf8(jsondb->dbname)); + if (ret == 0) { + jsondb->locked_needs_unlink = 0; + return 0; + } +#endif /* WIN32 */ + + return errno; +} + +static heim_data_t +json_db_copy_value(void *db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + json_db_t jsondb = db; + heim_string_t key_string; + const heim_octet_string *key_data = heim_data_get_data(key); + struct stat st; + heim_data_t result; + + if (error) + *error = NULL; + + if (strnlen(key_data->data, key_data->length) != key_data->length) { + HEIM_ERROR(error, EINVAL, + (EINVAL, N_("JSON DB requires keys that are actually " + "strings", ""))); + return NULL; + } + + if (stat(heim_string_get_utf8(jsondb->dbname), &st) == -1) { + HEIM_ERROR(error, errno, + (errno, N_("Could not stat JSON DB file", ""))); + return NULL; + } + + if (st.st_mtime > jsondb->last_read_time || + st.st_ctime > jsondb->last_read_time) { + heim_dict_t contents = NULL; + int ret; + + /* Ignore file is gone (ENOENT) */ + ret = read_json(heim_string_get_utf8(jsondb->dbname), + (heim_object_t *)&contents, error); + if (ret) + return NULL; + if (contents == NULL) + contents = heim_dict_create(29); + heim_release(jsondb->dict); + jsondb->dict = contents; + jsondb->last_read_time = time(NULL); + } + + key_string = heim_string_create_with_bytes(key_data->data, + key_data->length); + if (key_string == NULL) { + (void) HEIM_ENOMEM(error); + return NULL; + } + + result = heim_path_copy(jsondb->dict, error, table, key_string, NULL); + heim_release(key_string); + return result; +} + +static int +json_db_set_value(void *db, heim_string_t table, + heim_data_t key, heim_data_t value, heim_error_t *error) +{ + json_db_t jsondb = db; + heim_string_t key_string; + const heim_octet_string *key_data = heim_data_get_data(key); + int ret; + + if (error) + *error = NULL; + + if (strnlen(key_data->data, key_data->length) != key_data->length) + return HEIM_ERROR(error, EINVAL, + (EINVAL, + N_("JSON DB requires keys that are actually strings", + ""))); + + key_string = heim_string_create_with_bytes(key_data->data, + key_data->length); + if (key_string == NULL) + return HEIM_ENOMEM(error); + + if (table == NULL) + table = HSTR(""); + + ret = heim_path_create(jsondb->dict, 29, value, error, table, key_string, NULL); + heim_release(key_string); + return ret; +} + +static int +json_db_del_key(void *db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + json_db_t jsondb = db; + heim_string_t key_string; + const heim_octet_string *key_data = heim_data_get_data(key); + + if (error) + *error = NULL; + + if (strnlen(key_data->data, key_data->length) != key_data->length) + return HEIM_ERROR(error, EINVAL, + (EINVAL, + N_("JSON DB requires keys that are actually strings", + ""))); + + key_string = heim_string_create_with_bytes(key_data->data, + key_data->length); + if (key_string == NULL) + return HEIM_ENOMEM(error); + + if (table == NULL) + table = HSTR(""); + + heim_path_delete(jsondb->dict, error, table, key_string, NULL); + heim_release(key_string); + return 0; +} + +struct json_db_iter_ctx { + heim_db_iterator_f_t iter_f; + void *iter_ctx; +}; + +static void json_db_iter_f(heim_object_t key, heim_object_t value, void *arg) +{ + struct json_db_iter_ctx *ctx = arg; + const char *key_string; + heim_data_t key_data; + + key_string = heim_string_get_utf8((heim_string_t)key); + key_data = heim_data_ref_create(key_string, strlen(key_string), NULL); + ctx->iter_f(key_data, (heim_object_t)value, ctx->iter_ctx); + heim_release(key_data); +} + +static void +json_db_iter(void *db, heim_string_t table, void *iter_data, + heim_db_iterator_f_t iter_f, heim_error_t *error) +{ + json_db_t jsondb = db; + struct json_db_iter_ctx ctx; + heim_dict_t table_dict; + + if (error) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + table_dict = heim_dict_get_value(jsondb->dict, table); + if (table_dict == NULL) + return; + + ctx.iter_ctx = iter_data; + ctx.iter_f = iter_f; + + heim_dict_iterate_f(table_dict, &ctx, json_db_iter_f); +} + +static struct heim_db_type json_dbt = { + 1, json_db_open, NULL, json_db_close, + json_db_lock, json_db_unlock, json_db_sync, + NULL, NULL, NULL, + json_db_copy_value, json_db_set_value, + json_db_del_key, json_db_iter +}; + diff --git a/crypto/heimdal/lib/base/dict.c b/crypto/heimdal/lib/base/dict.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/dict.c @@ -0,0 +1,303 @@ +/* + * Copyright (c) 2002, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" + +struct hashentry { + struct hashentry **prev; + struct hashentry *next; + heim_object_t key; + heim_object_t value; +}; + +struct heim_dict_data { + size_t size; + struct hashentry **tab; +}; + +static void +dict_dealloc(void *ptr) +{ + heim_dict_t dict = ptr; + struct hashentry **h, *g, *i; + + for (h = dict->tab; h < &dict->tab[dict->size]; ++h) { + for (g = h[0]; g; g = i) { + i = g->next; + heim_release(g->key); + heim_release(g->value); + free(g); + } + } + free(dict->tab); +} + +struct heim_type_data dict_object = { + HEIM_TID_DICT, + "dict-object", + NULL, + dict_dealloc, + NULL, + NULL, + NULL, + NULL +}; + +static size_t +isprime(size_t p) +{ + size_t q, i; + + for(i = 2 ; i < p; i++) { + q = p / i; + + if (i * q == p) + return 0; + if (i * i > p) + return 1; + } + return 1; +} + +static size_t +findprime(size_t p) +{ + if (p % 2 == 0) + p++; + + while (isprime(p) == 0) + p += 2; + + return p; +} + +/** + * Allocate an array + * + * @return A new allocated array, free with heim_release() + */ + +heim_dict_t +heim_dict_create(size_t size) +{ + heim_dict_t dict; + + dict = _heim_alloc_object(&dict_object, sizeof(*dict)); + + dict->size = findprime(size); + if (dict->size == 0) { + heim_release(dict); + return NULL; + } + + dict->tab = calloc(dict->size, sizeof(dict->tab[0])); + if (dict->tab == NULL) { + dict->size = 0; + heim_release(dict); + return NULL; + } + + return dict; +} + +/** + * Get type id of an dict + * + * @return the type id + */ + +heim_tid_t +heim_dict_get_type_id(void) +{ + return HEIM_TID_DICT; +} + +/* Intern search function */ + +static struct hashentry * +_search(heim_dict_t dict, heim_object_t ptr) +{ + unsigned long v = heim_get_hash(ptr); + struct hashentry *p; + + for (p = dict->tab[v % dict->size]; p != NULL; p = p->next) + if (heim_cmp(ptr, p->key) == 0) + return p; + + return NULL; +} + +/** + * Search for element in hash table + * + * @value dict the dict to search in + * @value key the key to search for + * + * @return a not-retained copy of the value for key or NULL if not found + */ + +heim_object_t +heim_dict_get_value(heim_dict_t dict, heim_object_t key) +{ + struct hashentry *p; + p = _search(dict, key); + if (p == NULL) + return NULL; + + return p->value; +} + +/** + * Search for element in hash table + * + * @value dict the dict to search in + * @value key the key to search for + * + * @return a retained copy of the value for key or NULL if not found + */ + +heim_object_t +heim_dict_copy_value(heim_dict_t dict, heim_object_t key) +{ + struct hashentry *p; + p = _search(dict, key); + if (p == NULL) + return NULL; + + return heim_retain(p->value); +} + +/** + * Add key and value to dict + * + * @value dict the dict to add too + * @value key the key to add + * @value value the value to add + * + * @return 0 if added, errno if not + */ + +int +heim_dict_set_value(heim_dict_t dict, heim_object_t key, heim_object_t value) +{ + struct hashentry **tabptr, *h; + + h = _search(dict, key); + if (h) { + heim_release(h->value); + h->value = heim_retain(value); + } else { + unsigned long v; + + h = malloc(sizeof(*h)); + if (h == NULL) + return ENOMEM; + + h->key = heim_retain(key); + h->value = heim_retain(value); + + v = heim_get_hash(key); + + tabptr = &dict->tab[v % dict->size]; + h->next = *tabptr; + *tabptr = h; + h->prev = tabptr; + if (h->next) + h->next->prev = &h->next; + } + + return 0; +} + +/** + * Delete element with key key + * + * @value dict the dict to delete from + * @value key the key to delete + */ + +void +heim_dict_delete_key(heim_dict_t dict, heim_object_t key) +{ + struct hashentry *h = _search(dict, key); + + if (h == NULL) + return; + + heim_release(h->key); + heim_release(h->value); + + if ((*(h->prev) = h->next) != NULL) + h->next->prev = h->prev; + + free(h); +} + +/** + * Do something for each element + * + * @value dict the dict to interate over + * @value func the function to search for + * @value arg argument to func + */ + +void +heim_dict_iterate_f(heim_dict_t dict, void *arg, heim_dict_iterator_f_t func) +{ + struct hashentry **h, *g; + + for (h = dict->tab; h < &dict->tab[dict->size]; ++h) + for (g = *h; g; g = g->next) + func(g->key, g->value, arg); +} + +#ifdef __BLOCKS__ +/** + * Do something for each element + * + * @value dict the dict to interate over + * @value func the function to search for + */ + +void +heim_dict_iterate(heim_dict_t dict, void (^func)(heim_object_t, heim_object_t)) +{ + struct hashentry **h, *g; + + for (h = dict->tab; h < &dict->tab[dict->size]; ++h) + for (g = *h; g; g = g->next) + func(g->key, g->value); +} +#endif diff --git a/crypto/heimdal/lib/base/dll.c b/crypto/heimdal/lib/base/dll.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/dll.c @@ -0,0 +1,325 @@ +/*********************************************************************** + * Copyright (c) 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +/* + * This is an implementation of thread-specific storage with + * destructors. WIN32 doesn't quite have this. Instead it has + * DllMain(), an entry point in every DLL that gets called to notify the + * DLL of thread/process "attach"/"detach" events. + * + * We use __thread (or __declspec(thread)) for the thread-local itself + * and DllMain() DLL_THREAD_DETACH events to drive destruction of + * thread-local values. + * + * When building in maintainer mode on non-Windows pthread systems this + * uses a single pthread key instead to implement multiple keys. This + * keeps the code from rotting when modified by non-Windows developers. + */ + +#include "baselocl.h" + +#ifdef WIN32 +#include +#endif + +#ifdef HEIM_WIN32_TLS +#include +#include +#include + +#ifndef WIN32 +#include +#endif + +/* Logical array of keys that grows lock-lessly */ +typedef struct tls_keys tls_keys; +struct tls_keys { + void (**keys_dtors)(void *); /* array of destructors */ + size_t keys_start_idx; /* index of first destructor */ + size_t keys_num; + tls_keys *keys_next; +}; + +/* + * Well, not quite locklessly. We need synchronization primitives to do + * this locklessly. An atomic CAS will do. + */ +static HEIMDAL_MUTEX tls_key_defs_lock = HEIMDAL_MUTEX_INITIALIZER; +static tls_keys *tls_key_defs; + +/* Logical array of values (per-thread; no locking needed here) */ +struct tls_values { + void **values; /* realloc()ed */ + size_t values_num; +}; + +static HEIMDAL_THREAD_LOCAL struct tls_values values; + +static char dead_key[1]; +static void no_dtor(void *d) { (void)d; } + +void +heim_w32_service_thread_detach(void *unused) +{ + tls_keys *key_defs; + void (*dtor)(void*); + size_t i; + + HEIMDAL_MUTEX_lock(&tls_key_defs_lock); + key_defs = tls_key_defs; + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + + if (key_defs == NULL) + return; + + for (i = 0; i < values.values_num; i++) { + assert(i >= key_defs->keys_start_idx); + if (i >= key_defs->keys_start_idx + key_defs->keys_num) { + HEIMDAL_MUTEX_lock(&tls_key_defs_lock); + key_defs = key_defs->keys_next; + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + + assert(key_defs != NULL); + assert(i >= key_defs->keys_start_idx); + assert(i < key_defs->keys_start_idx + key_defs->keys_num); + } + dtor = key_defs->keys_dtors[i - key_defs->keys_start_idx]; + if (values.values[i] != NULL && dtor != NULL && dtor != no_dtor) + dtor(values.values[i]); + values.values[i] = NULL; + } +} + +#if !defined(WIN32) +static pthread_key_t pt_key; +pthread_once_t pt_once = PTHREAD_ONCE_INIT; + +static void +atexit_del_tls_for_thread(void) +{ + heim_w32_service_thread_detach(NULL); +} + +static void +create_pt_key(void) +{ + int ret; + + /* The main thread may not execute TLS destructors */ + atexit(atexit_del_tls_for_thread); + ret = pthread_key_create(&pt_key, heim_w32_service_thread_detach); + if (ret != 0) + err(1, "pthread_key_create() failed"); +} + +#endif + +int +heim_w32_key_create(HEIM_PRIV_thread_key *key, void (*dtor)(void *)) +{ + tls_keys *key_defs, *new_key_defs; + size_t i, k; + int ret = ENOMEM; + +#if !defined(WIN32) + (void) pthread_once(&pt_once, create_pt_key); + (void) pthread_setspecific(pt_key, dead_key); +#endif + + HEIMDAL_MUTEX_lock(&tls_key_defs_lock); + if (tls_key_defs == NULL) { + /* First key */ + new_key_defs = calloc(1, sizeof(*new_key_defs)); + if (new_key_defs == NULL) { + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + return ENOMEM; + } + new_key_defs->keys_num = 8; + new_key_defs->keys_dtors = calloc(new_key_defs->keys_num, + sizeof(*new_key_defs->keys_dtors)); + if (new_key_defs->keys_dtors == NULL) { + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + free(new_key_defs); + return ENOMEM; + } + tls_key_defs = new_key_defs; + new_key_defs->keys_dtors[0] = dtor; + for (i = 1; i < new_key_defs->keys_num; i++) + new_key_defs->keys_dtors[i] = NULL; + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + return 0; + } + + for (key_defs = tls_key_defs; + key_defs != NULL; + key_defs = key_defs->keys_next) { + k = key_defs->keys_start_idx; + for (i = 0; i < key_defs->keys_num; i++, k++) { + if (key_defs->keys_dtors[i] == NULL) { + /* Found free slot; use it */ + key_defs->keys_dtors[i] = dtor; + *key = k; + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + return 0; + } + } + if (key_defs->keys_next != NULL) + continue; + + /* Grow the registration array */ + /* XXX DRY */ + new_key_defs = calloc(1, sizeof(*new_key_defs)); + if (new_key_defs == NULL) + break; + + new_key_defs->keys_dtors = + calloc(key_defs->keys_num + key_defs->keys_num / 2, + sizeof(*new_key_defs->keys_dtors)); + if (new_key_defs->keys_dtors == NULL) { + free(new_key_defs); + break; + } + new_key_defs->keys_start_idx = key_defs->keys_start_idx + + key_defs->keys_num; + new_key_defs->keys_num = key_defs->keys_num + key_defs->keys_num / 2; + new_key_defs->keys_dtors[i] = dtor; + for (i = 1; i < new_key_defs->keys_num; i++) + new_key_defs->keys_dtors[i] = NULL; + key_defs->keys_next = new_key_defs; + ret = 0; + break; + } + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + return ret; +} + +static void +key_lookup(HEIM_PRIV_thread_key key, tls_keys **kd, + size_t *dtor_idx, void (**dtor)(void *)) +{ + tls_keys *key_defs; + + if (kd != NULL) + *kd = NULL; + if (dtor_idx != NULL) + *dtor_idx = 0; + if (dtor != NULL) + *dtor = NULL; + + HEIMDAL_MUTEX_lock(&tls_key_defs_lock); + key_defs = tls_key_defs; + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + + while (key_defs != NULL) { + if (key >= key_defs->keys_start_idx && + key < key_defs->keys_start_idx + key_defs->keys_num) { + if (kd != NULL) + *kd = key_defs; + if (dtor_idx != NULL) + *dtor_idx = key - key_defs->keys_start_idx; + if (dtor != NULL) + *dtor = key_defs->keys_dtors[key - key_defs->keys_start_idx]; + return; + } + + HEIMDAL_MUTEX_lock(&tls_key_defs_lock); + key_defs = key_defs->keys_next; + HEIMDAL_MUTEX_unlock(&tls_key_defs_lock); + assert(key_defs != NULL); + assert(key >= key_defs->keys_start_idx); + } +} + +int +heim_w32_delete_key(HEIM_PRIV_thread_key key) +{ + tls_keys *key_defs; + size_t dtor_idx; + + key_lookup(key, &key_defs, &dtor_idx, NULL); + if (key_defs == NULL) + return EINVAL; + key_defs->keys_dtors[dtor_idx] = no_dtor; + return 0; +} + +int +heim_w32_setspecific(HEIM_PRIV_thread_key key, void *value) +{ + void **new_values; + size_t new_num; + void (*dtor)(void *); + size_t i; + +#if !defined(WIN32) + (void) pthread_setspecific(pt_key, dead_key); +#endif + + key_lookup(key, NULL, NULL, &dtor); + if (dtor == NULL) + return EINVAL; + + if (key >= values.values_num) { + if (values.values_num == 0) { + values.values = NULL; + new_num = 8; + } else { + new_num = (values.values_num + values.values_num / 2); + } + new_values = realloc(values.values, sizeof(void *) * new_num); + if (new_values == NULL) + return ENOMEM; + for (i = values.values_num; i < new_num; i++) + new_values[i] = NULL; + values.values = new_values; + values.values_num = new_num; + } + + assert(key < values.values_num); + + if (values.values[key] != NULL && dtor != NULL && dtor != no_dtor) + dtor(values.values[key]); + + values.values[key] = value; + return 0; +} + +void * +heim_w32_getspecific(HEIM_PRIV_thread_key key) +{ + if (key >= values.values_num) + return NULL; + return values.values[key]; +} + +#else +static char dummy; +#endif /* HEIM_WIN32_TLS */ diff --git a/crypto/heimdal/lib/base/error.c b/crypto/heimdal/lib/base/error.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/error.c @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" + +struct heim_error { + int error_code; + heim_string_t msg; + struct heim_error *next; +}; + +static void +error_dealloc(void *ptr) +{ + struct heim_error *p = ptr; + heim_release(p->msg); + heim_release(p->next); +} + +static int +error_cmp(void *a, void *b) +{ + struct heim_error *ap = a, *bp = b; + if (ap->error_code == bp->error_code) + return 0; + return heim_cmp(ap->msg, bp->msg); +} + +static unsigned long +error_hash(void *ptr) +{ + struct heim_error *p = ptr; + return p->error_code; +} + +struct heim_type_data _heim_error_object = { + HEIM_TID_ERROR, + "error-object", + NULL, + error_dealloc, + NULL, + error_cmp, + error_hash, + NULL +}; + +heim_error_t +heim_error_create_enomem(void) +{ + /* This is an immediate object; see heim_number_create() */ + return (heim_error_t)heim_number_create(ENOMEM); +} + + +void +heim_error_create_opt(heim_error_t *error, int error_code, const char *fmt, ...) +{ + if (error) { + va_list ap; + va_start(ap, fmt); + *error = heim_error_createv(error_code, fmt, ap); + va_end(ap); + } +} + +heim_error_t +heim_error_create(int error_code, const char *fmt, ...) +{ + heim_error_t e; + va_list ap; + + va_start(ap, fmt); + e = heim_error_createv(error_code, fmt, ap); + va_end(ap); + + return e; +} + +heim_error_t +heim_error_createv(int error_code, const char *fmt, va_list ap) +{ + heim_error_t e; + char *str; + int len; + int save_errno = errno; + + str = malloc(1024); + errno = save_errno; + if (str == NULL) + return heim_error_create_enomem(); + len = vsnprintf(str, 1024, fmt, ap); + errno = save_errno; + if (len < 0) { + free(str); + return NULL; /* XXX We should have a special heim_error_t for this */ + } + + e = _heim_alloc_object(&_heim_error_object, sizeof(struct heim_error)); + if (e) { + e->msg = heim_string_create(str); + e->error_code = error_code; + } + free(str); + + errno = save_errno; + return e; +} + +heim_string_t +heim_error_copy_string(heim_error_t error) +{ + if (heim_get_tid(error) != HEIM_TID_ERROR) { + if (heim_get_tid(error) == heim_number_get_type_id()) + return __heim_string_constant(strerror(heim_number_get_int((heim_number_t)error))); + heim_abort("invalid heim_error_t"); + } + /* XXX concat all strings */ + return heim_retain(error->msg); +} + +int +heim_error_get_code(heim_error_t error) +{ + if (error == NULL) + return -1; + if (heim_get_tid(error) != HEIM_TID_ERROR) { + if (heim_get_tid(error) == heim_number_get_type_id()) + return heim_number_get_int((heim_number_t)error); + heim_abort("invalid heim_error_t"); + } + return error->error_code; +} + +heim_error_t +heim_error_append(heim_error_t top, heim_error_t append) +{ + if (heim_get_tid(top) != HEIM_TID_ERROR) { + if (heim_get_tid(top) == heim_number_get_type_id()) + return top; + heim_abort("invalid heim_error_t"); + } + if (top->next) + heim_release(top->next); + top->next = heim_retain(append); + return top; +} diff --git a/crypto/heimdal/lib/base/heimbase.h b/crypto/heimdal/lib/base/heimbase.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/heimbase.h @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef HEIM_BASE_H +#define HEIM_BASE_H 1 + +#include +#if !defined(WIN32) && !defined(HAVE_DISPATCH_DISPATCH_H) && defined(ENABLE_PTHREAD_SUPPORT) +#include +#endif +#include +#include +#ifdef HAVE_STDBOOL_H +#include +#else +#ifndef false +#define false 0 +#endif +#ifndef true +#define true 1 +#endif +#endif + +#define HEIM_BASE_API_VERSION 20130210 + +typedef void * heim_object_t; +typedef unsigned int heim_tid_t; +typedef heim_object_t heim_bool_t; +typedef heim_object_t heim_null_t; +#ifdef WIN32 +typedef LONG heim_base_once_t; +#define HEIM_BASE_ONCE_INIT 0 +#elif defined(HAVE_DISPATCH_DISPATCH_H) +typedef long heim_base_once_t; /* XXX arch dependant */ +#define HEIM_BASE_ONCE_INIT 0 +#elif defined(ENABLE_PTHREAD_SUPPORT) +typedef pthread_once_t heim_base_once_t; +#define HEIM_BASE_ONCE_INIT PTHREAD_ONCE_INIT +#else +typedef long heim_base_once_t; /* XXX arch dependant */ +#define HEIM_BASE_ONCE_INIT 0 +#endif + +#if !defined(__has_extension) +#define __has_extension(x) 0 +#endif + +#define HEIM_REQUIRE_GNUC(m,n,p) \ + (((__GNUC__ * 10000) + (__GNUC_MINOR__ * 100) + __GNUC_PATCHLEVEL__) >= \ + (((m) * 10000) + ((n) * 100) + (p))) + + +#if __has_extension(__builtin_expect) || HEIM_REQUIRE_GNUC(3,0,0) +#define heim_builtin_expect(_op,_res) __builtin_expect(_op,_res) +#else +#define heim_builtin_expect(_op,_res) (_op) +#endif + + +void * heim_retain(heim_object_t); +void heim_release(heim_object_t); + +void heim_show(heim_object_t); + +typedef void (*heim_type_dealloc)(void *); + +void * +heim_alloc(size_t size, const char *name, heim_type_dealloc dealloc); + +heim_tid_t +heim_get_tid(heim_object_t object); + +int +heim_cmp(heim_object_t a, heim_object_t b); + +unsigned long +heim_get_hash(heim_object_t ptr); + +void +heim_base_once_f(heim_base_once_t *, void *, void (*)(void *)); + +void +heim_abort(const char *fmt, ...) + HEIMDAL_NORETURN_ATTRIBUTE + HEIMDAL_PRINTF_ATTRIBUTE((__printf__, 1, 2)); + +void +heim_abortv(const char *fmt, va_list ap) + HEIMDAL_NORETURN_ATTRIBUTE + HEIMDAL_PRINTF_ATTRIBUTE((__printf__, 1, 0)); + +#define heim_assert(e,t) \ + (heim_builtin_expect(!(e), 0) ? heim_abort(t ":" #e) : (void)0) + +/* + * + */ + +heim_null_t +heim_null_create(void); + +heim_bool_t +heim_bool_create(int); + +int +heim_bool_val(heim_bool_t); + +/* + * Array + */ + +typedef struct heim_array_data *heim_array_t; + +heim_array_t heim_array_create(void); +heim_tid_t heim_array_get_type_id(void); + +typedef void (*heim_array_iterator_f_t)(heim_object_t, void *, int *); +typedef int (*heim_array_filter_f_t)(heim_object_t, void *); + +int heim_array_append_value(heim_array_t, heim_object_t); +int heim_array_insert_value(heim_array_t, size_t idx, heim_object_t); +void heim_array_iterate_f(heim_array_t, void *, heim_array_iterator_f_t); +void heim_array_iterate_reverse_f(heim_array_t, void *, heim_array_iterator_f_t); +#ifdef __BLOCKS__ +void heim_array_iterate(heim_array_t, void (^)(heim_object_t, int *)); +void heim_array_iterate_reverse(heim_array_t, void (^)(heim_object_t, int *)); +#endif +size_t heim_array_get_length(heim_array_t); +heim_object_t + heim_array_get_value(heim_array_t, size_t); +heim_object_t + heim_array_copy_value(heim_array_t, size_t); +void heim_array_set_value(heim_array_t, size_t, heim_object_t); +void heim_array_delete_value(heim_array_t, size_t); +void heim_array_filter_f(heim_array_t, void *, heim_array_filter_f_t); +#ifdef __BLOCKS__ +void heim_array_filter(heim_array_t, int (^)(heim_object_t)); +#endif + +/* + * Dict + */ + +typedef struct heim_dict_data *heim_dict_t; + +heim_dict_t heim_dict_create(size_t size); +heim_tid_t heim_dict_get_type_id(void); + +typedef void (*heim_dict_iterator_f_t)(heim_object_t, heim_object_t, void *); + +int heim_dict_set_value(heim_dict_t, heim_object_t, heim_object_t); +void heim_dict_iterate_f(heim_dict_t, void *, heim_dict_iterator_f_t); +#ifdef __BLOCKS__ +void heim_dict_iterate(heim_dict_t, void (^)(heim_object_t, heim_object_t)); +#endif + +heim_object_t + heim_dict_get_value(heim_dict_t, heim_object_t); +heim_object_t + heim_dict_copy_value(heim_dict_t, heim_object_t); +void heim_dict_delete_key(heim_dict_t, heim_object_t); + +/* + * String + */ + +typedef struct heim_string_data *heim_string_t; +typedef void (*heim_string_free_f_t)(void *); + +heim_string_t heim_string_create(const char *); +heim_string_t heim_string_ref_create(const char *, heim_string_free_f_t); +heim_string_t heim_string_create_with_bytes(const void *, size_t); +heim_string_t heim_string_ref_create_with_bytes(const void *, size_t, + heim_string_free_f_t); +heim_string_t heim_string_create_with_format(const char *, ...); +heim_tid_t heim_string_get_type_id(void); +const char * heim_string_get_utf8(heim_string_t); + +#define HSTR(_str) (__heim_string_constant("" _str "")) +heim_string_t __heim_string_constant(const char *); + +/* + * Errors + */ + +typedef struct heim_error * heim_error_t; + +heim_error_t heim_error_create_enomem(void); + +heim_error_t heim_error_create(int, const char *, ...) + HEIMDAL_PRINTF_ATTRIBUTE((__printf__, 2, 3)); + +void heim_error_create_opt(heim_error_t *error, int error_code, const char *fmt, ...) + HEIMDAL_PRINTF_ATTRIBUTE((__printf__, 3, 4)); + +heim_error_t heim_error_createv(int, const char *, va_list) + HEIMDAL_PRINTF_ATTRIBUTE((__printf__, 2, 0)); + +heim_string_t heim_error_copy_string(heim_error_t); +int heim_error_get_code(heim_error_t); + +heim_error_t heim_error_append(heim_error_t, heim_error_t); + +/* + * Path + */ + +heim_object_t heim_path_get(heim_object_t ptr, heim_error_t *error, ...); +heim_object_t heim_path_copy(heim_object_t ptr, heim_error_t *error, ...); +heim_object_t heim_path_vget(heim_object_t ptr, heim_error_t *error, + va_list ap); +heim_object_t heim_path_vcopy(heim_object_t ptr, heim_error_t *error, + va_list ap); + +int heim_path_vcreate(heim_object_t ptr, size_t size, heim_object_t leaf, + heim_error_t *error, va_list ap); +int heim_path_create(heim_object_t ptr, size_t size, heim_object_t leaf, + heim_error_t *error, ...); + +void heim_path_vdelete(heim_object_t ptr, heim_error_t *error, va_list ap); +void heim_path_delete(heim_object_t ptr, heim_error_t *error, ...); + +/* + * Data (octet strings) + */ + +#ifndef __HEIM_BASE_DATA__ +#define __HEIM_BASE_DATA__ +struct heim_base_data { + size_t length; + void *data; +}; +typedef struct heim_base_data heim_octet_string; +#endif + +typedef struct heim_base_data * heim_data_t; +typedef void (*heim_data_free_f_t)(void *); + +heim_data_t heim_data_create(const void *, size_t); +heim_data_t heim_data_ref_create(const void *, size_t, heim_data_free_f_t); +heim_tid_t heim_data_get_type_id(void); +const heim_octet_string * + heim_data_get_data(heim_data_t); +const void * heim_data_get_ptr(heim_data_t); +size_t heim_data_get_length(heim_data_t); + +/* + * DB + */ + +typedef struct heim_db_data *heim_db_t; + +typedef void (*heim_db_iterator_f_t)(heim_data_t, heim_data_t, void *); + +typedef int (*heim_db_plug_open_f_t)(void *, const char *, const char *, + heim_dict_t, void **, heim_error_t *); +typedef int (*heim_db_plug_clone_f_t)(void *, void **, heim_error_t *); +typedef int (*heim_db_plug_close_f_t)(void *, heim_error_t *); +typedef int (*heim_db_plug_lock_f_t)(void *, int, heim_error_t *); +typedef int (*heim_db_plug_unlock_f_t)(void *, heim_error_t *); +typedef int (*heim_db_plug_sync_f_t)(void *, heim_error_t *); +typedef int (*heim_db_plug_begin_f_t)(void *, int, heim_error_t *); +typedef int (*heim_db_plug_commit_f_t)(void *, heim_error_t *); +typedef int (*heim_db_plug_rollback_f_t)(void *, heim_error_t *); +typedef heim_data_t (*heim_db_plug_copy_value_f_t)(void *, heim_string_t, + heim_data_t, + heim_error_t *); +typedef int (*heim_db_plug_set_value_f_t)(void *, heim_string_t, heim_data_t, + heim_data_t, heim_error_t *); +typedef int (*heim_db_plug_del_key_f_t)(void *, heim_string_t, heim_data_t, + heim_error_t *); +typedef void (*heim_db_plug_iter_f_t)(void *, heim_string_t, void *, + heim_db_iterator_f_t, heim_error_t *); + +struct heim_db_type { + int version; + heim_db_plug_open_f_t openf; + heim_db_plug_clone_f_t clonef; + heim_db_plug_close_f_t closef; + heim_db_plug_lock_f_t lockf; + heim_db_plug_unlock_f_t unlockf; + heim_db_plug_sync_f_t syncf; + heim_db_plug_begin_f_t beginf; + heim_db_plug_commit_f_t commitf; + heim_db_plug_rollback_f_t rollbackf; + heim_db_plug_copy_value_f_t copyf; + heim_db_plug_set_value_f_t setf; + heim_db_plug_del_key_f_t delf; + heim_db_plug_iter_f_t iterf; +}; + +extern struct heim_db_type heim_sorted_text_file_dbtype; + +#define HEIM_DB_TYPE_VERSION_01 1 + +int heim_db_register(const char *dbtype, + void *data, + struct heim_db_type *plugin); + +heim_db_t heim_db_create(const char *dbtype, const char *dbname, + heim_dict_t options, heim_error_t *error); +heim_db_t heim_db_clone(heim_db_t, heim_error_t *); +int heim_db_begin(heim_db_t, int, heim_error_t *); +int heim_db_commit(heim_db_t, heim_error_t *); +int heim_db_rollback(heim_db_t, heim_error_t *); +heim_tid_t heim_db_get_type_id(void); + +int heim_db_set_value(heim_db_t, heim_string_t, heim_data_t, heim_data_t, + heim_error_t *); +heim_data_t heim_db_copy_value(heim_db_t, heim_string_t, heim_data_t, + heim_error_t *); +int heim_db_delete_key(heim_db_t, heim_string_t, heim_data_t, + heim_error_t *); +void heim_db_iterate_f(heim_db_t, heim_string_t, void *, + heim_db_iterator_f_t, heim_error_t *); +#ifdef __BLOCKS__ +void heim_db_iterate(heim_db_t, heim_string_t, + void (^)(heim_data_t, heim_data_t), heim_error_t *); +#endif + + +/* + * Number + */ + +typedef struct heim_number_data *heim_number_t; + +heim_number_t heim_number_create(int); +heim_tid_t heim_number_get_type_id(void); +int heim_number_get_int(heim_number_t); + +/* + * + */ + +typedef struct heim_auto_release * heim_auto_release_t; + +heim_auto_release_t heim_auto_release_create(void); +void heim_auto_release_drain(heim_auto_release_t); +heim_object_t heim_auto_release(heim_object_t); + +/* + * JSON + */ +typedef enum heim_json_flags { + HEIM_JSON_F_NO_C_NULL = 1, + HEIM_JSON_F_STRICT_STRINGS = 2, + HEIM_JSON_F_NO_DATA = 4, + HEIM_JSON_F_NO_DATA_DICT = 8, + HEIM_JSON_F_STRICT_DICT = 16, + HEIM_JSON_F_STRICT = 31, + HEIM_JSON_F_CNULL2JSNULL = 32, + HEIM_JSON_F_TRY_DECODE_DATA = 64, + HEIM_JSON_F_ONE_LINE = 128 +} heim_json_flags_t; + +heim_object_t heim_json_create(const char *, size_t, heim_json_flags_t, + heim_error_t *); +heim_object_t heim_json_create_with_bytes(const void *, size_t, size_t, + heim_json_flags_t, + heim_error_t *); +heim_string_t heim_json_copy_serialize(heim_object_t, heim_json_flags_t, + heim_error_t *); + + +/* + * Debug + */ + +heim_string_t +heim_description(heim_object_t ptr); + +/* + * Binary search. + * + * Note: these are private until integrated into the heimbase object system. + */ +typedef struct bsearch_file_handle *bsearch_file_handle; +int _bsearch_text(const char *buf, size_t buf_sz, const char *key, + char **value, size_t *location, size_t *loops); +int _bsearch_file_open(const char *fname, size_t max_sz, size_t page_sz, + bsearch_file_handle *bfh, size_t *reads); +int _bsearch_file(bsearch_file_handle bfh, const char *key, char **value, + size_t *location, size_t *loops, size_t *reads); +void _bsearch_file_info(bsearch_file_handle bfh, size_t *page_sz, + size_t *max_sz, int *blockwise); +void _bsearch_file_close(bsearch_file_handle *bfh); + +/* + * Thread-specific keys + */ + +int heim_w32_key_create(unsigned long *, void (*)(void *)); +int heim_w32_delete_key(unsigned long); +int heim_w32_setspecific(unsigned long, void *); +void *heim_w32_getspecific(unsigned long); +void heim_w32_service_thread_detach(void *); + +#endif /* HEIM_BASE_H */ diff --git a/crypto/heimdal/lib/base/heimbase.c b/crypto/heimdal/lib/base/heimbase.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/heimbase.c @@ -0,0 +1,1087 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" +#include + +static heim_base_atomic_type tidglobal = HEIM_TID_USER; + +struct heim_base { + heim_type_t isa; + heim_base_atomic_type ref_cnt; + HEIM_TAILQ_ENTRY(heim_base) autorel; + heim_auto_release_t autorelpool; + uintptr_t isaextra[3]; +}; + +/* specialized version of base */ +struct heim_base_mem { + heim_type_t isa; + heim_base_atomic_type ref_cnt; + HEIM_TAILQ_ENTRY(heim_base) autorel; + heim_auto_release_t autorelpool; + const char *name; + void (*dealloc)(void *); + uintptr_t isaextra[1]; +}; + +#define PTR2BASE(ptr) (((struct heim_base *)ptr) - 1) +#define BASE2PTR(ptr) ((void *)(((struct heim_base *)ptr) + 1)) + +#ifdef HEIM_BASE_NEED_ATOMIC_MUTEX +HEIMDAL_MUTEX _heim_base_mutex = HEIMDAL_MUTEX_INITIALIZER; +#endif + +/* + * Auto release structure + */ + +struct heim_auto_release { + HEIM_TAILQ_HEAD(, heim_base) pool; + HEIMDAL_MUTEX pool_mutex; + struct heim_auto_release *parent; +}; + + +/** + * Retain object (i.e., take a reference) + * + * @param object to be released, NULL is ok + * + * @return the same object as passed in + */ + +void * +heim_retain(void *ptr) +{ + struct heim_base *p; + + if (ptr == NULL || heim_base_is_tagged(ptr)) + return ptr; + + p = PTR2BASE(ptr); + if (p->ref_cnt == heim_base_atomic_max) + return ptr; + + if ((heim_base_atomic_inc(&p->ref_cnt) - 1) == 0) + heim_abort("resurection"); + return ptr; +} + +/** + * Release object, free if reference count reaches zero + * + * @param object to be released + */ + +void +heim_release(void *ptr) +{ + heim_base_atomic_type old; + struct heim_base *p; + + if (ptr == NULL || heim_base_is_tagged(ptr)) + return; + + p = PTR2BASE(ptr); + if (p->ref_cnt == heim_base_atomic_max) + return; + + old = heim_base_atomic_dec(&p->ref_cnt) + 1; + + if (old > 1) + return; + + if (old == 1) { + heim_auto_release_t ar = p->autorelpool; + /* remove from autorel pool list */ + if (ar) { + p->autorelpool = NULL; + HEIMDAL_MUTEX_lock(&ar->pool_mutex); + HEIM_TAILQ_REMOVE(&ar->pool, p, autorel); + HEIMDAL_MUTEX_unlock(&ar->pool_mutex); + } + if (p->isa->dealloc) + p->isa->dealloc(ptr); + free(p); + } else + heim_abort("over release"); +} + +/** + * If used require wrapped in autorelease pool + */ + +heim_string_t +heim_description(heim_object_t ptr) +{ + struct heim_base *p = PTR2BASE(ptr); + if (p->isa->desc == NULL) + return heim_auto_release(heim_string_ref_create(p->isa->name, NULL)); + return heim_auto_release(p->isa->desc(ptr)); +} + + +void +_heim_make_permanent(heim_object_t ptr) +{ + struct heim_base *p = PTR2BASE(ptr); + p->ref_cnt = heim_base_atomic_max; +} + + +static heim_type_t tagged_isa[9] = { + &_heim_number_object, + &_heim_null_object, + &_heim_bool_object, + + NULL, + NULL, + NULL, + + NULL, + NULL, + NULL +}; + +heim_type_t +_heim_get_isa(heim_object_t ptr) +{ + struct heim_base *p; + if (heim_base_is_tagged(ptr)) { + if (heim_base_is_tagged_object(ptr)) + return tagged_isa[heim_base_tagged_object_tid(ptr)]; + heim_abort("not a supported tagged type"); + } + p = PTR2BASE(ptr); + return p->isa; +} + +/** + * Get type ID of object + * + * @param object object to get type id of + * + * @return type id of object + */ + +heim_tid_t +heim_get_tid(heim_object_t ptr) +{ + heim_type_t isa = _heim_get_isa(ptr); + return isa->tid; +} + +/** + * Get hash value of object + * + * @param object object to get hash value for + * + * @return a hash value + */ + +unsigned long +heim_get_hash(heim_object_t ptr) +{ + heim_type_t isa = _heim_get_isa(ptr); + if (isa->hash) + return isa->hash(ptr); + return (unsigned long)ptr; +} + +/** + * Compare two objects, returns 0 if equal, can use used for qsort() + * and friends. + * + * @param a first object to compare + * @param b first object to compare + * + * @return 0 if objects are equal + */ + +int +heim_cmp(heim_object_t a, heim_object_t b) +{ + heim_tid_t ta, tb; + heim_type_t isa; + + ta = heim_get_tid(a); + tb = heim_get_tid(b); + + if (ta != tb) + return ta - tb; + + isa = _heim_get_isa(a); + + if (isa->cmp) + return isa->cmp(a, b); + + return (uintptr_t)a - (uintptr_t)b; +} + +/* + * Private - allocates an memory object + */ + +static void +memory_dealloc(void *ptr) +{ + if (ptr) { + struct heim_base_mem *p = (struct heim_base_mem *)PTR2BASE(ptr); + + if (p->dealloc) + p->dealloc(ptr); + } +} + +struct heim_type_data memory_object = { + HEIM_TID_MEMORY, + "memory-object", + NULL, + memory_dealloc, + NULL, + NULL, + NULL, + NULL +}; + +/** + * Allocate memory for an object of anonymous type + * + * @param size size of object to be allocated + * @param name name of ad-hoc type + * @param dealloc destructor function + * + * Objects allocated with this interface do not serialize. + * + * @return allocated object + */ + +void * +heim_alloc(size_t size, const char *name, heim_type_dealloc dealloc) +{ + /* XXX use posix_memalign */ + + struct heim_base_mem *p = calloc(1, size + sizeof(*p)); + if (p == NULL) + return NULL; + p->isa = &memory_object; + p->ref_cnt = 1; + p->name = name; + p->dealloc = dealloc; + return BASE2PTR(p); +} + +heim_type_t +_heim_create_type(const char *name, + heim_type_init init, + heim_type_dealloc dealloc, + heim_type_copy copy, + heim_type_cmp cmp, + heim_type_hash hash, + heim_type_description desc) +{ + heim_type_t type; + + type = calloc(1, sizeof(*type)); + if (type == NULL) + return NULL; + + type->tid = heim_base_atomic_inc(&tidglobal); + type->name = name; + type->init = init; + type->dealloc = dealloc; + type->copy = copy; + type->cmp = cmp; + type->hash = hash; + type->desc = desc; + + return type; +} + +heim_object_t +_heim_alloc_object(heim_type_t type, size_t size) +{ + /* XXX should use posix_memalign */ + struct heim_base *p = calloc(1, size + sizeof(*p)); + if (p == NULL) + return NULL; + p->isa = type; + p->ref_cnt = 1; + + return BASE2PTR(p); +} + +void * +_heim_get_isaextra(heim_object_t ptr, size_t idx) +{ + struct heim_base *p = (struct heim_base *)PTR2BASE(ptr); + + heim_assert(ptr != NULL, "internal error"); + if (p->isa == &memory_object) + return NULL; + heim_assert(idx < 3, "invalid private heim_base extra data index"); + return &p->isaextra[idx]; +} + +heim_tid_t +_heim_type_get_tid(heim_type_t type) +{ + return type->tid; +} + +#if !defined(WIN32) && !defined(HAVE_DISPATCH_DISPATCH_H) && defined(ENABLE_PTHREAD_SUPPORT) +static pthread_once_t once_arg_key_once = PTHREAD_ONCE_INIT; +static pthread_key_t once_arg_key; + +static void +once_arg_key_once_init(void) +{ + errno = pthread_key_create(&once_arg_key, NULL); + if (errno != 0) { + fprintf(stderr, + "Error: pthread_key_create() failed, cannot continue: %s\n", + strerror(errno)); + abort(); + } +} + +struct once_callback { + void (*fn)(void *); + void *data; +}; + +static void +once_callback_caller(void) +{ + struct once_callback *once_callback = pthread_getspecific(once_arg_key); + + if (once_callback == NULL) { + fprintf(stderr, "Error: pthread_once() calls callback on " + "different thread?! Cannot continue.\n"); + abort(); + } + once_callback->fn(once_callback->data); +} +#endif + +/** + * Call func once and only once + * + * @param once pointer to a heim_base_once_t + * @param ctx context passed to func + * @param func function to be called + */ + +void +heim_base_once_f(heim_base_once_t *once, void *ctx, void (*func)(void *)) +{ +#if defined(WIN32) + /* + * With a libroken wrapper for some CAS function and a libroken yield() + * wrapper we could make this the default implementation when we have + * neither Grand Central nor POSX threads. + * + * We could also adapt the double-checked lock pattern with CAS + * providing the necessary memory barriers in the absence of + * portable explicit memory barrier APIs. + */ + /* + * We use CAS operations in large part to provide implied memory + * barriers. + * + * State 0 means that func() has never executed. + * State 1 means that func() is executing. + * State 2 means that func() has completed execution. + */ + if (InterlockedCompareExchange(once, 1L, 0L) == 0L) { + /* State is now 1 */ + (*func)(ctx); + (void)InterlockedExchange(once, 2L); + /* State is now 2 */ + } else { + /* + * The InterlockedCompareExchange is being used to fetch + * the current state under a full memory barrier. As long + * as the current state is 1 continue to spin. + */ + while (InterlockedCompareExchange(once, 2L, 0L) == 1L) + SwitchToThread(); + } +#elif defined(HAVE_DISPATCH_DISPATCH_H) + dispatch_once_f(once, ctx, func); +#elif defined(ENABLE_PTHREAD_SUPPORT) + struct once_callback once_callback; + + once_callback.fn = func; + once_callback.data = ctx; + + errno = pthread_once(&once_arg_key_once, once_arg_key_once_init); + if (errno != 0) { + fprintf(stderr, "Error: pthread_once() failed, cannot continue: %s\n", + strerror(errno)); + abort(); + } + errno = pthread_setspecific(once_arg_key, &once_callback); + if (errno != 0) { + fprintf(stderr, + "Error: pthread_setspecific() failed, cannot continue: %s\n", + strerror(errno)); + abort(); + } + errno = pthread_once(once, once_callback_caller); + if (errno != 0) { + fprintf(stderr, "Error: pthread_once() failed, cannot continue: %s\n", + strerror(errno)); + abort(); + } +#else + static HEIMDAL_MUTEX mutex = HEIMDAL_MUTEX_INITIALIZER; + HEIMDAL_MUTEX_lock(&mutex); + if (*once == 0) { + *once = 1; + HEIMDAL_MUTEX_unlock(&mutex); + func(ctx); + HEIMDAL_MUTEX_lock(&mutex); + *once = 2; + HEIMDAL_MUTEX_unlock(&mutex); + } else if (*once == 2) { + HEIMDAL_MUTEX_unlock(&mutex); + } else { + HEIMDAL_MUTEX_unlock(&mutex); + while (1) { + struct timeval tv = { 0, 1000 }; + select(0, NULL, NULL, NULL, &tv); + HEIMDAL_MUTEX_lock(&mutex); + if (*once == 2) + break; + HEIMDAL_MUTEX_unlock(&mutex); + } + HEIMDAL_MUTEX_unlock(&mutex); + } +#endif +} + +/** + * Abort and log the failure (using syslog) + */ + +void +heim_abort(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + heim_abortv(fmt, ap); + va_end(ap); +} + +/** + * Abort and log the failure (using syslog) + */ + +void +heim_abortv(const char *fmt, va_list ap) +{ + static char str[1024]; + + vsnprintf(str, sizeof(str), fmt, ap); + syslog(LOG_ERR, "heim_abort: %s", str); + abort(); +} + +/* + * + */ + +static int ar_created = 0; +static HEIMDAL_thread_key ar_key; + +struct ar_tls { + struct heim_auto_release *head; + struct heim_auto_release *current; + HEIMDAL_MUTEX tls_mutex; +}; + +static void +ar_tls_delete(void *ptr) +{ + struct ar_tls *tls = ptr; + heim_auto_release_t next = NULL; + + if (tls == NULL) + return; + for (; tls->current != NULL; tls->current = next) { + next = tls->current->parent; + heim_release(tls->current); + } + free(tls); +} + +static void +init_ar_tls(void *ptr) +{ + int ret; + HEIMDAL_key_create(&ar_key, ar_tls_delete, ret); + if (ret == 0) + ar_created = 1; +} + +static struct ar_tls * +autorel_tls(void) +{ + static heim_base_once_t once = HEIM_BASE_ONCE_INIT; + struct ar_tls *arp; + int ret; + + heim_base_once_f(&once, NULL, init_ar_tls); + if (!ar_created) + return NULL; + + arp = HEIMDAL_getspecific(ar_key); + if (arp == NULL) { + + arp = calloc(1, sizeof(*arp)); + if (arp == NULL) + return NULL; + HEIMDAL_setspecific(ar_key, arp, ret); + if (ret) { + free(arp); + return NULL; + } + } + return arp; + +} + +static void +autorel_dealloc(void *ptr) +{ + heim_auto_release_t ar = ptr; + struct ar_tls *tls; + + tls = autorel_tls(); + if (tls == NULL) + heim_abort("autorelease pool released on thread w/o autorelease inited"); + + heim_auto_release_drain(ar); + + if (!HEIM_TAILQ_EMPTY(&ar->pool)) + heim_abort("pool not empty after draining"); + + HEIMDAL_MUTEX_lock(&tls->tls_mutex); + if (tls->current != ptr) + heim_abort("autorelease not releaseing top pool"); + + tls->current = ar->parent; + HEIMDAL_MUTEX_unlock(&tls->tls_mutex); +} + +static int +autorel_cmp(void *a, void *b) +{ + return (a == b); +} + +static unsigned long +autorel_hash(void *ptr) +{ + return (unsigned long)ptr; +} + + +static struct heim_type_data _heim_autorel_object = { + HEIM_TID_AUTORELEASE, + "autorelease-pool", + NULL, + autorel_dealloc, + NULL, + autorel_cmp, + autorel_hash, + NULL +}; + +/** + * Create thread-specific object auto-release pool + * + * Objects placed on the per-thread auto-release pool (with + * heim_auto_release()) can be released in one fell swoop by calling + * heim_auto_release_drain(). + */ + +heim_auto_release_t +heim_auto_release_create(void) +{ + struct ar_tls *tls = autorel_tls(); + heim_auto_release_t ar; + + if (tls == NULL) + heim_abort("Failed to create/get autorelease head"); + + ar = _heim_alloc_object(&_heim_autorel_object, sizeof(struct heim_auto_release)); + if (ar) { + HEIMDAL_MUTEX_lock(&tls->tls_mutex); + if (tls->head == NULL) + tls->head = ar; + ar->parent = tls->current; + tls->current = ar; + HEIMDAL_MUTEX_unlock(&tls->tls_mutex); + } + + return ar; +} + +/** + * Place the current object on the thread's auto-release pool + * + * @param ptr object + */ + +heim_object_t +heim_auto_release(heim_object_t ptr) +{ + struct heim_base *p; + struct ar_tls *tls; + heim_auto_release_t ar; + + if (ptr == NULL || heim_base_is_tagged(ptr)) + return ptr; + + p = PTR2BASE(ptr); + tls = autorel_tls(); + + /* drop from old pool */ + if ((ar = p->autorelpool) != NULL) { + HEIMDAL_MUTEX_lock(&ar->pool_mutex); + HEIM_TAILQ_REMOVE(&ar->pool, p, autorel); + p->autorelpool = NULL; + HEIMDAL_MUTEX_unlock(&ar->pool_mutex); + } + + if (tls == NULL || (ar = tls->current) == NULL) + heim_abort("no auto relase pool in place, would leak"); + + HEIMDAL_MUTEX_lock(&ar->pool_mutex); + HEIM_TAILQ_INSERT_HEAD(&ar->pool, p, autorel); + p->autorelpool = ar; + HEIMDAL_MUTEX_unlock(&ar->pool_mutex); + + return ptr; +} + +/** + * Release all objects on the given auto-release pool + */ + +void +heim_auto_release_drain(heim_auto_release_t autorel) +{ + heim_object_t obj; + + /* release all elements on the tail queue */ + + HEIMDAL_MUTEX_lock(&autorel->pool_mutex); + while(!HEIM_TAILQ_EMPTY(&autorel->pool)) { + obj = HEIM_TAILQ_FIRST(&autorel->pool); + HEIMDAL_MUTEX_unlock(&autorel->pool_mutex); + heim_release(BASE2PTR(obj)); + HEIMDAL_MUTEX_lock(&autorel->pool_mutex); + } + HEIMDAL_MUTEX_unlock(&autorel->pool_mutex); +} + +/* + * Helper for heim_path_vget() and heim_path_delete(). On success + * outputs the node named by the path and the parent node and key + * (useful for heim_path_delete()). + */ + +static heim_object_t +heim_path_vget2(heim_object_t ptr, heim_object_t *parent, heim_object_t *key, + heim_error_t *error, va_list ap) +{ + heim_object_t path_element; + heim_object_t node, next_node; + heim_tid_t node_type; + + *parent = NULL; + *key = NULL; + if (ptr == NULL) + return NULL; + + for (node = ptr; node != NULL; ) { + path_element = va_arg(ap, heim_object_t); + if (path_element == NULL) { + *parent = node; + *key = path_element; + return node; + } + + node_type = heim_get_tid(node); + switch (node_type) { + case HEIM_TID_ARRAY: + case HEIM_TID_DICT: + case HEIM_TID_DB: + break; + default: + if (node == ptr) + heim_abort("heim_path_get() only operates on container types"); + return NULL; + } + + if (node_type == HEIM_TID_DICT) { + next_node = heim_dict_get_value(node, path_element); + } else if (node_type == HEIM_TID_DB) { + next_node = _heim_db_get_value(node, NULL, path_element, NULL); + } else if (node_type == HEIM_TID_ARRAY) { + int idx = -1; + + if (heim_get_tid(path_element) == HEIM_TID_NUMBER) + idx = heim_number_get_int(path_element); + if (idx < 0) { + if (error) + *error = heim_error_create(EINVAL, + "heim_path_get() path elements " + "for array nodes must be " + "numeric and positive"); + return NULL; + } + next_node = heim_array_get_value(node, idx); + } else { + if (error) + *error = heim_error_create(EINVAL, + "heim_path_get() node in path " + "not a container type"); + return NULL; + } + node = next_node; + } + return NULL; +} + +/** + * Get a node in a heim_object tree by path + * + * @param ptr tree + * @param error error (output) + * @param ap NULL-terminated va_list of heim_object_ts that form a path + * + * @return object (not retained) if found + * + * @addtogroup heimbase + */ + +heim_object_t +heim_path_vget(heim_object_t ptr, heim_error_t *error, va_list ap) +{ + heim_object_t p, k; + + return heim_path_vget2(ptr, &p, &k, error, ap); +} + +/** + * Get a node in a tree by path, with retained reference + * + * @param ptr tree + * @param error error (output) + * @param ap NULL-terminated va_list of heim_object_ts that form a path + * + * @return retained object if found + * + * @addtogroup heimbase + */ + +heim_object_t +heim_path_vcopy(heim_object_t ptr, heim_error_t *error, va_list ap) +{ + heim_object_t p, k; + + return heim_retain(heim_path_vget2(ptr, &p, &k, error, ap)); +} + +/** + * Get a node in a tree by path + * + * @param ptr tree + * @param error error (output) + * @param ... NULL-terminated va_list of heim_object_ts that form a path + * + * @return object (not retained) if found + * + * @addtogroup heimbase + */ + +heim_object_t +heim_path_get(heim_object_t ptr, heim_error_t *error, ...) +{ + heim_object_t o; + heim_object_t p, k; + va_list ap; + + if (ptr == NULL) + return NULL; + + va_start(ap, error); + o = heim_path_vget2(ptr, &p, &k, error, ap); + va_end(ap); + return o; +} + +/** + * Get a node in a tree by path, with retained reference + * + * @param ptr tree + * @param error error (output) + * @param ... NULL-terminated va_list of heim_object_ts that form a path + * + * @return retained object if found + * + * @addtogroup heimbase + */ + +heim_object_t +heim_path_copy(heim_object_t ptr, heim_error_t *error, ...) +{ + heim_object_t o; + heim_object_t p, k; + va_list ap; + + if (ptr == NULL) + return NULL; + + va_start(ap, error); + o = heim_retain(heim_path_vget2(ptr, &p, &k, error, ap)); + va_end(ap); + return o; +} + +/** + * Create a path in a heim_object_t tree + * + * @param ptr the tree + * @param size the size of the heim_dict_t nodes to be created + * @param leaf leaf node to be added, if any + * @param error error (output) + * @param ap NULL-terminated of path component objects + * + * Create a path of heim_dict_t interior nodes in a given heim_object_t + * tree, as necessary, and set/replace a leaf, if given (if leaf is NULL + * then the leaf is not deleted). + * + * @return 0 on success, else a system error + * + * @addtogroup heimbase + */ + +int +heim_path_vcreate(heim_object_t ptr, size_t size, heim_object_t leaf, + heim_error_t *error, va_list ap) +{ + heim_object_t path_element = va_arg(ap, heim_object_t); + heim_object_t next_path_element = NULL; + heim_object_t node = ptr; + heim_object_t next_node = NULL; + heim_tid_t node_type; + int ret = 0; + + if (ptr == NULL) + heim_abort("heim_path_vcreate() does not create root nodes"); + + while (path_element != NULL) { + next_path_element = va_arg(ap, heim_object_t); + node_type = heim_get_tid(node); + + if (node_type == HEIM_TID_DICT) { + next_node = heim_dict_get_value(node, path_element); + } else if (node_type == HEIM_TID_ARRAY) { + int idx = -1; + + if (heim_get_tid(path_element) == HEIM_TID_NUMBER) + idx = heim_number_get_int(path_element); + if (idx < 0) { + if (error) + *error = heim_error_create(EINVAL, + "heim_path() path elements for " + "array nodes must be numeric " + "and positive"); + return EINVAL; + } + if (idx < heim_array_get_length(node)) + next_node = heim_array_get_value(node, idx); + else + next_node = NULL; + } else if (node_type == HEIM_TID_DB && next_path_element != NULL) { + if (error) + *error = heim_error_create(EINVAL, "Interior node is a DB"); + return EINVAL; + } + + if (next_path_element == NULL) + break; + + /* Create missing interior node */ + if (next_node == NULL) { + next_node = heim_dict_create(size); /* no arrays or DBs, just dicts */ + if (next_node == NULL) { + ret = ENOMEM; + goto err; + } + + if (node_type == HEIM_TID_DICT) { + ret = heim_dict_set_value(node, path_element, next_node); + } else if (node_type == HEIM_TID_ARRAY && + heim_number_get_int(path_element) <= heim_array_get_length(node)) { + ret = heim_array_insert_value(node, + heim_number_get_int(path_element), + next_node); + } else { + ret = EINVAL; + if (error) + *error = heim_error_create(ret, "Node in path not a " + "container"); + } + heim_release(next_node); + if (ret) + goto err; + } + + path_element = next_path_element; + node = next_node; + next_node = NULL; + } + + if (path_element == NULL) + goto err; + + /* Add the leaf */ + if (leaf != NULL) { + if (node_type == HEIM_TID_DICT) + ret = heim_dict_set_value(node, path_element, leaf); + else + ret = heim_array_insert_value(node, + heim_number_get_int(path_element), + leaf); + } + return ret; + +err: + if (error && !*error) { + if (ret == ENOMEM) + *error = heim_error_create_enomem(); + else + *error = heim_error_create(ret, "Could not set " + "dict value"); + } + return ret; +} + +/** + * Create a path in a heim_object_t tree + * + * @param ptr the tree + * @param size the size of the heim_dict_t nodes to be created + * @param leaf leaf node to be added, if any + * @param error error (output) + * @param ... NULL-terminated list of path component objects + * + * Create a path of heim_dict_t interior nodes in a given heim_object_t + * tree, as necessary, and set/replace a leaf, if given (if leaf is NULL + * then the leaf is not deleted). + * + * @return 0 on success, else a system error + * + * @addtogroup heimbase + */ + +int +heim_path_create(heim_object_t ptr, size_t size, heim_object_t leaf, + heim_error_t *error, ...) +{ + va_list ap; + int ret; + + va_start(ap, error); + ret = heim_path_vcreate(ptr, size, leaf, error, ap); + va_end(ap); + return ret; +} + +/** + * Delete leaf node named by a path in a heim_object_t tree + * + * @param ptr the tree + * @param error error (output) + * @param ap NULL-terminated list of path component objects + * + * @addtogroup heimbase + */ + +void +heim_path_vdelete(heim_object_t ptr, heim_error_t *error, va_list ap) +{ + heim_object_t parent, key, child; + + child = heim_path_vget2(ptr, &parent, &key, error, ap); + if (child != NULL) { + if (heim_get_tid(parent) == HEIM_TID_DICT) + heim_dict_delete_key(parent, key); + else if (heim_get_tid(parent) == HEIM_TID_DB) + heim_db_delete_key(parent, NULL, key, error); + else if (heim_get_tid(parent) == HEIM_TID_ARRAY) + heim_array_delete_value(parent, heim_number_get_int(key)); + heim_release(child); + } +} + +/** + * Delete leaf node named by a path in a heim_object_t tree + * + * @param ptr the tree + * @param error error (output) + * @param ap NULL-terminated list of path component objects + * + * @addtogroup heimbase + */ + +void +heim_path_delete(heim_object_t ptr, heim_error_t *error, ...) +{ + va_list ap; + + va_start(ap, error); + heim_path_vdelete(ptr, error, ap); + va_end(ap); + return; +} + diff --git a/crypto/heimdal/lib/base/heimbasepriv.h b/crypto/heimdal/lib/base/heimbasepriv.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/heimbasepriv.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(HEIM_BASE_MAINTAINER) && defined(ENABLE_PTHREAD_SUPPORT) +#define HEIM_WIN32_TLS +#elif defined(WIN32) +#define HEIM_WIN32_TLS +#endif + +typedef void (*heim_type_init)(void *); +typedef heim_object_t (*heim_type_copy)(void *); +typedef int (*heim_type_cmp)(void *, void *); +typedef unsigned long (*heim_type_hash)(void *); +typedef heim_string_t (*heim_type_description)(void *); + +typedef struct heim_type_data *heim_type_t; + +enum { + HEIM_TID_NUMBER = 0, + HEIM_TID_NULL = 1, + HEIM_TID_BOOL = 2, + HEIM_TID_TAGGED_UNUSED2 = 3, /* reserved for tagged object types */ + HEIM_TID_TAGGED_UNUSED3 = 4, /* reserved for tagged object types */ + HEIM_TID_TAGGED_UNUSED4 = 5, /* reserved for tagged object types */ + HEIM_TID_TAGGED_UNUSED5 = 6, /* reserved for tagged object types */ + HEIM_TID_TAGGED_UNUSED6 = 7, /* reserved for tagged object types */ + HEIM_TID_MEMORY = 128, + HEIM_TID_ARRAY = 129, + HEIM_TID_DICT = 130, + HEIM_TID_STRING = 131, + HEIM_TID_AUTORELEASE = 132, + HEIM_TID_ERROR = 133, + HEIM_TID_DATA = 134, + HEIM_TID_DB = 135, + HEIM_TID_USER = 255 + +}; + +struct heim_type_data { + heim_tid_t tid; + const char *name; + heim_type_init init; + heim_type_dealloc dealloc; + heim_type_copy copy; + heim_type_cmp cmp; + heim_type_hash hash; + heim_type_description desc; +}; + +heim_type_t _heim_get_isa(heim_object_t); + +heim_type_t +_heim_create_type(const char *name, + heim_type_init init, + heim_type_dealloc dealloc, + heim_type_copy copy, + heim_type_cmp cmp, + heim_type_hash hash, + heim_type_description desc); + +heim_object_t +_heim_alloc_object(heim_type_t type, size_t size); + +void * +_heim_get_isaextra(heim_object_t o, size_t idx); + +heim_tid_t +_heim_type_get_tid(heim_type_t type); + +void +_heim_make_permanent(heim_object_t ptr); + +heim_data_t +_heim_db_get_value(heim_db_t, heim_string_t, heim_data_t, heim_error_t *); + + +/* tagged tid */ +extern struct heim_type_data _heim_null_object; +extern struct heim_type_data _heim_bool_object; +extern struct heim_type_data _heim_number_object; +extern struct heim_type_data _heim_string_object; diff --git a/crypto/heimdal/base/heimqueue.h b/crypto/heimdal/lib/base/heimqueue.h rename from crypto/heimdal/base/heimqueue.h rename to crypto/heimdal/lib/base/heimqueue.h diff --git a/crypto/heimdal/lib/base/json.c b/crypto/heimdal/lib/base/json.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/json.c @@ -0,0 +1,811 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" +#include +#include + +static heim_base_once_t heim_json_once = HEIM_BASE_ONCE_INIT; +static heim_string_t heim_tid_data_uuid_key = NULL; +static const char base64_chars[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static void +json_init_once(void *arg) +{ + heim_tid_data_uuid_key = __heim_string_constant("heimdal-type-data-76d7fca2-d0da-4b20-a126-1a10f8a0eae6"); +} + +struct twojson { + void *ctx; + void (*out)(void *, const char *); + size_t indent; + heim_json_flags_t flags; + int ret; + int first; +}; + +struct heim_strbuf { + char *str; + size_t len; + size_t alloced; + int enomem; + heim_json_flags_t flags; +}; + +static int +base2json(heim_object_t, struct twojson *); + +static void +indent(struct twojson *j) +{ + size_t i = j->indent; + if (j->flags & HEIM_JSON_F_ONE_LINE) + return; + while (i--) + j->out(j->ctx, "\t"); +} + +static void +array2json(heim_object_t value, void *ctx, int *stop) +{ + struct twojson *j = ctx; + if (j->ret) + return; + if (j->first) { + j->first = 0; + } else { + j->out(j->ctx, NULL); /* eat previous '\n' if possible */ + j->out(j->ctx, ",\n"); + } + j->ret = base2json(value, j); +} + +static void +dict2json(heim_object_t key, heim_object_t value, void *ctx) +{ + struct twojson *j = ctx; + if (j->ret) + return; + if (j->first) { + j->first = 0; + } else { + j->out(j->ctx, NULL); /* eat previous '\n' if possible */ + j->out(j->ctx, ",\n"); + } + j->ret = base2json(key, j); + if (j->ret) + return; + j->out(j->ctx, " : \n"); + j->indent++; + j->ret = base2json(value, j); + if (j->ret) + return; + j->indent--; +} + +static int +base2json(heim_object_t obj, struct twojson *j) +{ + heim_tid_t type; + int first = 0; + + if (obj == NULL) { + if (j->flags & HEIM_JSON_F_CNULL2JSNULL) { + obj = heim_null_create(); + } else if (j->flags & HEIM_JSON_F_NO_C_NULL) { + return EINVAL; + } else { + indent(j); + j->out(j->ctx, "\n"); /* This is NOT valid JSON! */ + return 0; + } + } + + type = heim_get_tid(obj); + switch (type) { + case HEIM_TID_ARRAY: + indent(j); + j->out(j->ctx, "[\n"); + j->indent++; + first = j->first; + j->first = 1; + heim_array_iterate_f(obj, j, array2json); + j->indent--; + if (!j->first) + j->out(j->ctx, "\n"); + indent(j); + j->out(j->ctx, "]\n"); + j->first = first; + break; + + case HEIM_TID_DICT: + indent(j); + j->out(j->ctx, "{\n"); + j->indent++; + first = j->first; + j->first = 1; + heim_dict_iterate_f(obj, j, dict2json); + j->indent--; + if (!j->first) + j->out(j->ctx, "\n"); + indent(j); + j->out(j->ctx, "}\n"); + j->first = first; + break; + + case HEIM_TID_STRING: + indent(j); + j->out(j->ctx, "\""); + j->out(j->ctx, heim_string_get_utf8(obj)); + j->out(j->ctx, "\""); + break; + + case HEIM_TID_DATA: { + heim_dict_t d; + heim_string_t v; + const heim_octet_string *data; + char *b64 = NULL; + int ret; + + if (j->flags & HEIM_JSON_F_NO_DATA) + return EINVAL; /* JSON doesn't do binary */ + + data = heim_data_get_data(obj); + ret = rk_base64_encode(data->data, data->length, &b64); + if (ret < 0 || b64 == NULL) + return ENOMEM; + + if (j->flags & HEIM_JSON_F_NO_DATA_DICT) { + indent(j); + j->out(j->ctx, "\""); + j->out(j->ctx, b64); /* base64-encode; hope there's no aliasing */ + j->out(j->ctx, "\""); + free(b64); + } else { + /* + * JSON has no way to represent binary data, therefore the + * following is a Heimdal-specific convention. + * + * We encode binary data as a dict with a single very magic + * key with a base64-encoded value. The magic key includes + * a uuid, so we're not likely to alias accidentally. + */ + d = heim_dict_create(2); + if (d == NULL) { + free(b64); + return ENOMEM; + } + v = heim_string_ref_create(b64, free); + if (v == NULL) { + free(b64); + heim_release(d); + return ENOMEM; + } + ret = heim_dict_set_value(d, heim_tid_data_uuid_key, v); + heim_release(v); + if (ret) { + heim_release(d); + return ENOMEM; + } + ret = base2json(d, j); + heim_release(d); + if (ret) + return ret; + } + break; + } + + case HEIM_TID_NUMBER: { + char num[32]; + indent(j); + snprintf(num, sizeof (num), "%d", heim_number_get_int(obj)); + j->out(j->ctx, num); + break; + } + case HEIM_TID_NULL: + indent(j); + j->out(j->ctx, "null"); + break; + case HEIM_TID_BOOL: + indent(j); + j->out(j->ctx, heim_bool_val(obj) ? "true" : "false"); + break; + default: + return 1; + } + return 0; +} + +static int +heim_base2json(heim_object_t obj, void *ctx, heim_json_flags_t flags, + void (*out)(void *, const char *)) +{ + struct twojson j; + + if (flags & HEIM_JSON_F_STRICT_STRINGS) + return ENOTSUP; /* Sorry, not yet! */ + + heim_base_once_f(&heim_json_once, NULL, json_init_once); + + j.indent = 0; + j.ctx = ctx; + j.out = out; + j.flags = flags; + j.ret = 0; + j.first = 1; + + return base2json(obj, &j); +} + + +/* + * + */ + +struct parse_ctx { + unsigned long lineno; + const uint8_t *p; + const uint8_t *pstart; + const uint8_t *pend; + heim_error_t error; + size_t depth; + heim_json_flags_t flags; +}; + + +static heim_object_t +parse_value(struct parse_ctx *ctx); + +/* + * This function eats whitespace, but, critically, it also succeeds + * only if there's anything left to parse. + */ +static int +white_spaces(struct parse_ctx *ctx) +{ + while (ctx->p < ctx->pend) { + uint8_t c = *ctx->p; + if (c == ' ' || c == '\t' || c == '\r') { + + } else if (c == '\n') { + ctx->lineno++; + } else + return 0; + (ctx->p)++; + } + return -1; +} + +static int +is_number(uint8_t n) +{ + return ('0' <= n && n <= '9'); +} + +static heim_number_t +parse_number(struct parse_ctx *ctx) +{ + int number = 0, neg = 1; + + if (ctx->p >= ctx->pend) + return NULL; + + if (*ctx->p == '-') { + if (ctx->p + 1 >= ctx->pend) + return NULL; + neg = -1; + ctx->p += 1; + } + + while (ctx->p < ctx->pend) { + if (is_number(*ctx->p)) { + number = (number * 10) + (*ctx->p - '0'); + } else { + break; + } + ctx->p += 1; + } + + return heim_number_create(number * neg); +} + +static heim_string_t +parse_string(struct parse_ctx *ctx) +{ + const uint8_t *start; + int quote = 0; + + if (ctx->flags & HEIM_JSON_F_STRICT_STRINGS) { + ctx->error = heim_error_create(EINVAL, "Strict JSON string encoding " + "not yet supported"); + return NULL; + } + + if (*ctx->p != '"') { + ctx->error = heim_error_create(EINVAL, "Expected a JSON string but " + "found something else at line %lu", + ctx->lineno); + return NULL; + } + start = ++ctx->p; + + while (ctx->p < ctx->pend) { + if (*ctx->p == '\n') { + ctx->lineno++; + } else if (*ctx->p == '\\') { + if (ctx->p + 1 == ctx->pend) + goto out; + ctx->p++; + quote = 1; + } else if (*ctx->p == '"') { + heim_object_t o; + + if (quote) { + char *p0, *p; + p = p0 = malloc(ctx->p - start); + if (p == NULL) + goto out; + while (start < ctx->p) { + if (*start == '\\') { + start++; + /* XXX validate quoted char */ + } + *p++ = *start++; + } + o = heim_string_create_with_bytes(p0, p - p0); + free(p0); + } else { + o = heim_string_create_with_bytes(start, ctx->p - start); + if (o == NULL) { + ctx->error = heim_error_create_enomem(); + return NULL; + } + + /* If we can decode as base64, then let's */ + if (ctx->flags & HEIM_JSON_F_TRY_DECODE_DATA) { + void *buf; + size_t len; + const char *s; + + s = heim_string_get_utf8(o); + len = strlen(s); + + if (len >= 4 && strspn(s, base64_chars) >= len - 2) { + buf = malloc(len); + if (buf == NULL) { + heim_release(o); + ctx->error = heim_error_create_enomem(); + return NULL; + } + len = rk_base64_decode(s, buf); + if (len == -1) { + free(buf); + return o; + } + heim_release(o); + o = heim_data_ref_create(buf, len, free); + } + } + } + ctx->p += 1; + + return o; + } + ctx->p += 1; + } + out: + ctx->error = heim_error_create(EINVAL, "ran out of string"); + return NULL; +} + +static int +parse_pair(heim_dict_t dict, struct parse_ctx *ctx) +{ + heim_string_t key; + heim_object_t value; + + if (white_spaces(ctx)) + return -1; + + if (*ctx->p == '}') { + ctx->p++; + return 0; + } + + if (ctx->flags & HEIM_JSON_F_STRICT_DICT) + /* JSON allows only string keys */ + key = parse_string(ctx); + else + /* heim_dict_t allows any heim_object_t as key */ + key = parse_value(ctx); + if (key == NULL) + /* Even heim_dict_t does not allow C NULLs as keys though! */ + return -1; + + if (white_spaces(ctx)) { + heim_release(key); + return -1; + } + + if (*ctx->p != ':') { + heim_release(key); + return -1; + } + + ctx->p += 1; /* safe because we call white_spaces() next */ + + if (white_spaces(ctx)) { + heim_release(key); + return -1; + } + + value = parse_value(ctx); + if (value == NULL && + (ctx->error != NULL || (ctx->flags & HEIM_JSON_F_NO_C_NULL))) { + if (ctx->error == NULL) + ctx->error = heim_error_create(EINVAL, "Invalid JSON encoding"); + heim_release(key); + return -1; + } + heim_dict_set_value(dict, key, value); + heim_release(key); + heim_release(value); + + if (white_spaces(ctx)) + return -1; + + if (*ctx->p == '}') { + /* + * Return 1 but don't consume the '}' so we can count the one + * pair in a one-pair dict + */ + return 1; + } else if (*ctx->p == ',') { + ctx->p++; + return 1; + } + return -1; +} + +static heim_dict_t +parse_dict(struct parse_ctx *ctx) +{ + heim_dict_t dict; + size_t count = 0; + int ret; + + heim_assert(*ctx->p == '{', "string doesn't start with {"); + + dict = heim_dict_create(11); + if (dict == NULL) { + ctx->error = heim_error_create_enomem(); + return NULL; + } + + ctx->p += 1; /* safe because parse_pair() calls white_spaces() first */ + + while ((ret = parse_pair(dict, ctx)) > 0) + count++; + if (ret < 0) { + heim_release(dict); + return NULL; + } + if (count == 1 && !(ctx->flags & HEIM_JSON_F_NO_DATA_DICT)) { + heim_object_t v = heim_dict_copy_value(dict, heim_tid_data_uuid_key); + + /* + * Binary data encoded as a dict with a single magic key with + * base64-encoded value? Decode as heim_data_t. + */ + if (v != NULL && heim_get_tid(v) == HEIM_TID_STRING) { + void *buf; + size_t len; + + buf = malloc(strlen(heim_string_get_utf8(v))); + if (buf == NULL) { + heim_release(dict); + heim_release(v); + ctx->error = heim_error_create_enomem(); + return NULL; + } + len = rk_base64_decode(heim_string_get_utf8(v), buf); + heim_release(v); + if (len == -1) { + free(buf); + return dict; /* assume aliasing accident */ + } + heim_release(dict); + return (heim_dict_t)heim_data_ref_create(buf, len, free); + } + } + return dict; +} + +static int +parse_item(heim_array_t array, struct parse_ctx *ctx) +{ + heim_object_t value; + + if (white_spaces(ctx)) + return -1; + + if (*ctx->p == ']') { + ctx->p++; /* safe because parse_value() calls white_spaces() first */ + return 0; + } + + value = parse_value(ctx); + if (value == NULL && + (ctx->error || (ctx->flags & HEIM_JSON_F_NO_C_NULL))) + return -1; + + heim_array_append_value(array, value); + heim_release(value); + + if (white_spaces(ctx)) + return -1; + + if (*ctx->p == ']') { + ctx->p++; + return 0; + } else if (*ctx->p == ',') { + ctx->p++; + return 1; + } + return -1; +} + +static heim_array_t +parse_array(struct parse_ctx *ctx) +{ + heim_array_t array = heim_array_create(); + int ret; + + heim_assert(*ctx->p == '[', "array doesn't start with ["); + ctx->p += 1; + + while ((ret = parse_item(array, ctx)) > 0) + ; + if (ret < 0) { + heim_release(array); + return NULL; + } + return array; +} + +static heim_object_t +parse_value(struct parse_ctx *ctx) +{ + size_t len; + heim_object_t o; + + if (white_spaces(ctx)) + return NULL; + + if (*ctx->p == '"') { + return parse_string(ctx); + } else if (*ctx->p == '{') { + if (ctx->depth-- == 1) { + ctx->error = heim_error_create(EINVAL, "JSON object too deep"); + return NULL; + } + o = parse_dict(ctx); + ctx->depth++; + return o; + } else if (*ctx->p == '[') { + if (ctx->depth-- == 1) { + ctx->error = heim_error_create(EINVAL, "JSON object too deep"); + return NULL; + } + o = parse_array(ctx); + ctx->depth++; + return o; + } else if (is_number(*ctx->p) || *ctx->p == '-') { + return parse_number(ctx); + } + + len = ctx->pend - ctx->p; + + if ((ctx->flags & HEIM_JSON_F_NO_C_NULL) == 0 && + len >= 6 && memcmp(ctx->p, "", 6) == 0) { + ctx->p += 6; + return heim_null_create(); + } else if (len >= 4 && memcmp(ctx->p, "null", 4) == 0) { + ctx->p += 4; + return heim_null_create(); + } else if (len >= 4 && strncasecmp((char *)ctx->p, "true", 4) == 0) { + ctx->p += 4; + return heim_bool_create(1); + } else if (len >= 5 && strncasecmp((char *)ctx->p, "false", 5) == 0) { + ctx->p += 5; + return heim_bool_create(0); + } + + ctx->error = heim_error_create(EINVAL, "unknown char %c at %lu line %lu", + (char)*ctx->p, + (unsigned long)(ctx->p - ctx->pstart), + ctx->lineno); + return NULL; +} + + +heim_object_t +heim_json_create(const char *string, size_t max_depth, heim_json_flags_t flags, + heim_error_t *error) +{ + return heim_json_create_with_bytes(string, strlen(string), max_depth, flags, + error); +} + +heim_object_t +heim_json_create_with_bytes(const void *data, size_t length, size_t max_depth, + heim_json_flags_t flags, heim_error_t *error) +{ + struct parse_ctx ctx; + heim_object_t o; + + heim_base_once_f(&heim_json_once, NULL, json_init_once); + + ctx.lineno = 1; + ctx.p = data; + ctx.pstart = data; + ctx.pend = ((uint8_t *)data) + length; + ctx.error = NULL; + ctx.flags = flags; + ctx.depth = max_depth; + + o = parse_value(&ctx); + + if (o == NULL && error) { + *error = ctx.error; + } else if (ctx.error) { + heim_release(ctx.error); + } + + return o; +} + + +static void +show_printf(void *ctx, const char *str) +{ + if (str == NULL) + return; + fprintf(ctx, "%s", str); +} + +/** + * Dump a heimbase object to stderr (useful from the debugger!) + * + * @param obj object to dump using JSON or JSON-like format + * + * @addtogroup heimbase + */ +void +heim_show(heim_object_t obj) +{ + heim_base2json(obj, stderr, HEIM_JSON_F_NO_DATA_DICT, show_printf); +} + +static void +strbuf_add(void *ctx, const char *str) +{ + struct heim_strbuf *strbuf = ctx; + size_t len; + + if (strbuf->enomem) + return; + + if (str == NULL) { + /* + * Eat the last '\n'; this is used when formatting dict pairs + * and array items so that the ',' separating them is never + * preceded by a '\n'. + */ + if (strbuf->len > 0 && strbuf->str[strbuf->len - 1] == '\n') + strbuf->len--; + return; + } + + len = strlen(str); + if ((len + 1) > (strbuf->alloced - strbuf->len)) { + size_t new_len = strbuf->alloced + (strbuf->alloced >> 2) + len + 1; + char *s; + + s = realloc(strbuf->str, new_len); + if (s == NULL) { + strbuf->enomem = 1; + return; + } + strbuf->str = s; + strbuf->alloced = new_len; + } + /* +1 so we copy the NUL */ + (void) memcpy(strbuf->str + strbuf->len, str, len + 1); + strbuf->len += len; + if (strbuf->str[strbuf->len - 1] == '\n' && + strbuf->flags & HEIM_JSON_F_ONE_LINE) + strbuf->len--; +} + +#define STRBUF_INIT_SZ 64 + +heim_string_t +heim_json_copy_serialize(heim_object_t obj, heim_json_flags_t flags, heim_error_t *error) +{ + heim_string_t str; + struct heim_strbuf strbuf; + int ret; + + if (error) + *error = NULL; + + memset(&strbuf, 0, sizeof (strbuf)); + strbuf.str = malloc(STRBUF_INIT_SZ); + if (strbuf.str == NULL) { + if (error) + *error = heim_error_create_enomem(); + return NULL; + } + strbuf.len = 0; + strbuf.alloced = STRBUF_INIT_SZ; + strbuf.str[0] = '\0'; + strbuf.flags = flags; + + ret = heim_base2json(obj, &strbuf, flags, strbuf_add); + if (ret || strbuf.enomem) { + if (error) { + if (strbuf.enomem || ret == ENOMEM) + *error = heim_error_create_enomem(); + else + *error = heim_error_create(1, "Impossible to JSON-encode " + "object"); + } + free(strbuf.str); + return NULL; + } + if (flags & HEIM_JSON_F_ONE_LINE) { + strbuf.flags &= ~HEIM_JSON_F_ONE_LINE; + strbuf_add(&strbuf, "\n"); + } + str = heim_string_ref_create(strbuf.str, free); + if (str == NULL) { + if (error) + *error = heim_error_create_enomem(); + free(strbuf.str); + } + return str; +} diff --git a/crypto/heimdal/lib/base/null.c b/crypto/heimdal/lib/base/null.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/null.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" + +struct heim_type_data _heim_null_object = { + HEIM_TID_NULL, + "null-object", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL +}; + +heim_null_t +heim_null_create(void) +{ + return heim_base_make_tagged_object(0, HEIM_TID_NULL); +} diff --git a/crypto/heimdal/lib/base/number.c b/crypto/heimdal/lib/base/number.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/number.c @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" + +static void +number_dealloc(void *ptr) +{ +} + +static int +number_cmp(void *a, void *b) +{ + int na, nb; + + if (heim_base_is_tagged_object(a)) + na = heim_base_tagged_object_value(a); + else + na = *(int *)a; + + if (heim_base_is_tagged_object(b)) + nb = heim_base_tagged_object_value(b); + else + nb = *(int *)b; + + return na - nb; +} + +static unsigned long +number_hash(void *ptr) +{ + if (heim_base_is_tagged_object(ptr)) + return heim_base_tagged_object_value(ptr); + return (unsigned long)*(int *)ptr; +} + +struct heim_type_data _heim_number_object = { + HEIM_TID_NUMBER, + "number-object", + NULL, + number_dealloc, + NULL, + number_cmp, + number_hash, + NULL +}; + +/** + * Create a number object + * + * @param the number to contain in the object + * + * @return a number object + */ + +heim_number_t +heim_number_create(int number) +{ + heim_number_t n; + + if (number < 0xffffff && number >= 0) + return heim_base_make_tagged_object(number, HEIM_TID_NUMBER); + + n = _heim_alloc_object(&_heim_number_object, sizeof(int)); + if (n) + *((int *)n) = number; + return n; +} + +/** + * Return the type ID of number objects + * + * @return type id of number objects + */ + +heim_tid_t +heim_number_get_type_id(void) +{ + return HEIM_TID_NUMBER; +} + +/** + * Get the int value of the content + * + * @param number the number object to get the value from + * + * @return an int + */ + +int +heim_number_get_int(heim_number_t number) +{ + if (heim_base_is_tagged_object(number)) + return heim_base_tagged_object_value(number); + return *(int *)number; +} diff --git a/crypto/heimdal/lib/base/roken_rename.h b/crypto/heimdal/lib/base/roken_rename.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/roken_rename.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 1998 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef __heimbase_roken_rename_h__ +#define __heimbase_roken_rename_h__ + +#ifndef HAVE_VSNPRINTF +#define rk_vsnprintf heimbase_vsnprintf +#endif +#ifndef HAVE_ASPRINTF +#define rk_asprintf heimbase_asprintf +#endif +#ifndef HAVE_ASNPRINTF +#define rk_asnprintf heimbase_asnprintf +#endif +#ifndef HAVE_VASPRINTF +#define rk_vasprintf heimbase_vasprintf +#endif +#ifndef HAVE_VASNPRINTF +#define rk_vasnprintf heimbase_vasnprintf +#endif +#ifndef HAVE_STRDUP +#define rk_strdup heimbase_strdup +#endif +#ifndef HAVE_STRNDUP +#define rk_strndup heimbase_strndup +#endif + +#endif /* __heimbase_roken_rename_h__ */ diff --git a/crypto/heimdal/lib/base/string.c b/crypto/heimdal/lib/base/string.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/string.c @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "baselocl.h" +#include + +static void +string_dealloc(void *ptr) +{ + heim_string_t s = ptr; + heim_string_free_f_t *deallocp; + heim_string_free_f_t dealloc; + + if (*(const char *)ptr != '\0') + return; + + /* Possible string ref */ + deallocp = _heim_get_isaextra(s, 0); + dealloc = *deallocp; + if (dealloc != NULL) { + char **strp = _heim_get_isaextra(s, 1); + dealloc(*strp); + } +} + +static int +string_cmp(void *a, void *b) +{ + if (*(char *)a == '\0') { + char **strp = _heim_get_isaextra(a, 1); + + if (*strp != NULL) + a = *strp; /* a is a string ref */ + } + if (*(char *)b == '\0') { + char **strp = _heim_get_isaextra(b, 1); + + if (*strp != NULL) + b = *strp; /* b is a string ref */ + } + return strcmp(a, b); +} + +static unsigned long +string_hash(void *ptr) +{ + const char *s = ptr; + unsigned long n; + + for (n = 0; *s; ++s) + n += *s; + return n; +} + +struct heim_type_data _heim_string_object = { + HEIM_TID_STRING, + "string-object", + NULL, + string_dealloc, + NULL, + string_cmp, + string_hash, + NULL +}; + +/** + * Create a string object + * + * @param string the string to create, must be an utf8 string + * + * @return string object + */ + +heim_string_t +heim_string_create(const char *string) +{ + return heim_string_create_with_bytes(string, strlen(string)); +} + +/** + * Create a string object without copying the source. + * + * @param string the string to referenced, must be UTF-8 + * @param dealloc the function to use to release the referece to the string + * + * @return string object + */ + +heim_string_t +heim_string_ref_create(const char *string, heim_string_free_f_t dealloc) +{ + heim_string_t s; + heim_string_free_f_t *deallocp; + + s = _heim_alloc_object(&_heim_string_object, 1); + if (s) { + const char **strp; + + ((char *)s)[0] = '\0'; + deallocp = _heim_get_isaextra(s, 0); + *deallocp = dealloc; + strp = _heim_get_isaextra(s, 1); + *strp = string; + } + return s; +} + +/** + * Create a string object + * + * @param string the string to create, must be an utf8 string + * @param len the length of the string + * + * @return string object + */ + +heim_string_t +heim_string_create_with_bytes(const void *data, size_t len) +{ + heim_string_t s; + + s = _heim_alloc_object(&_heim_string_object, len + 1); + if (s) { + memcpy(s, data, len); + ((char *)s)[len] = '\0'; + } + return s; +} + +/** + * Create a string object using a format string + * + * @param fmt format string + * @param ... + * + * @return string object + */ + +heim_string_t +heim_string_create_with_format(const char *fmt, ...) +{ + heim_string_t s; + char *str = NULL; + va_list ap; + int ret; + + va_start(ap, fmt); + ret = vasprintf(&str, fmt, ap); + va_end(ap); + if (ret < 0 || str == NULL) + return NULL; + + s = heim_string_ref_create(str, string_dealloc); + if (s == NULL) + free(str); + return s; +} + +/** + * Return the type ID of string objects + * + * @return type id of string objects + */ + +heim_tid_t +heim_string_get_type_id(void) +{ + return HEIM_TID_STRING; +} + +/** + * Get the string value of the content. + * + * @param string the string object to get the value from + * + * @return a utf8 string + */ + +const char * +heim_string_get_utf8(heim_string_t string) +{ + if (*(const char *)string == '\0') { + const char **strp; + + /* String ref */ + strp = _heim_get_isaextra(string, 1); + if (*strp != NULL) + return *strp; + } + return (const char *)string; +} + +/* + * + */ + +static void +init_string(void *ptr) +{ + heim_dict_t *dict = ptr; + *dict = heim_dict_create(101); + heim_assert(*dict != NULL, "__heim_string_constant"); +} + +heim_string_t +__heim_string_constant(const char *_str) +{ + static HEIMDAL_MUTEX mutex = HEIMDAL_MUTEX_INITIALIZER; + static heim_base_once_t once; + static heim_dict_t dict = NULL; + heim_string_t s, s2; + + heim_base_once_f(&once, &dict, init_string); + s = heim_string_create(_str); + + HEIMDAL_MUTEX_lock(&mutex); + s2 = heim_dict_get_value(dict, s); + if (s2) { + heim_release(s); + s = s2; + } else { + _heim_make_permanent(s); + heim_dict_set_value(dict, s, s); + } + HEIMDAL_MUTEX_unlock(&mutex); + + return s; +} diff --git a/crypto/heimdal/lib/base/test_base.c b/crypto/heimdal/lib/base/test_base.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/test_base.c @@ -0,0 +1,961 @@ +/* + * Copyright (c) 2010-2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * This is a test of libheimbase functionality. If you make any changes + * to libheimbase or to this test you should run it under valgrind with + * the following options: + * + * -v --track-fds=yes --num-callers=30 --leak-check=full + * + * and make sure that there are no leaks that don't have + * __heim_string_constant() or heim_db_register() in their stack trace. + */ + +#include +#include +#include +#include +#include +#include +#include +#ifndef WIN32 +#include +#endif +#ifdef HAVE_IO_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#include + +#include "baselocl.h" + +static void +memory_free(heim_object_t obj) +{ +} + +static int +test_memory(void) +{ + void *ptr; + + ptr = heim_alloc(10, "memory", memory_free); + + heim_retain(ptr); + heim_release(ptr); + + heim_retain(ptr); + heim_release(ptr); + + heim_release(ptr); + + ptr = heim_alloc(10, "memory", NULL); + heim_release(ptr); + + return 0; +} + +static int +test_mutex(void) +{ + HEIMDAL_MUTEX m = HEIMDAL_MUTEX_INITIALIZER; + + HEIMDAL_MUTEX_lock(&m); + HEIMDAL_MUTEX_unlock(&m); + HEIMDAL_MUTEX_destroy(&m); + + HEIMDAL_MUTEX_init(&m); + HEIMDAL_MUTEX_lock(&m); + HEIMDAL_MUTEX_unlock(&m); + HEIMDAL_MUTEX_destroy(&m); + + return 0; +} + +static int +test_rwlock(void) +{ + HEIMDAL_RWLOCK l = HEIMDAL_RWLOCK_INITIALIZER; + + HEIMDAL_RWLOCK_rdlock(&l); + HEIMDAL_RWLOCK_unlock(&l); + HEIMDAL_RWLOCK_wrlock(&l); + HEIMDAL_RWLOCK_unlock(&l); + if (HEIMDAL_RWLOCK_trywrlock(&l) != 0) + err(1, "HEIMDAL_RWLOCK_trywrlock() failed with lock not held"); + HEIMDAL_RWLOCK_unlock(&l); + if (HEIMDAL_RWLOCK_tryrdlock(&l)) + err(1, "HEIMDAL_RWLOCK_tryrdlock() failed with lock not held"); + HEIMDAL_RWLOCK_unlock(&l); + HEIMDAL_RWLOCK_destroy(&l); + + HEIMDAL_RWLOCK_init(&l); + HEIMDAL_RWLOCK_rdlock(&l); + HEIMDAL_RWLOCK_unlock(&l); + HEIMDAL_RWLOCK_wrlock(&l); + HEIMDAL_RWLOCK_unlock(&l); + if (HEIMDAL_RWLOCK_trywrlock(&l)) + err(1, "HEIMDAL_RWLOCK_trywrlock() failed with lock not held"); + HEIMDAL_RWLOCK_unlock(&l); + if (HEIMDAL_RWLOCK_tryrdlock(&l)) + err(1, "HEIMDAL_RWLOCK_tryrdlock() failed with lock not held"); + HEIMDAL_RWLOCK_unlock(&l); + HEIMDAL_RWLOCK_destroy(&l); + + return 0; +} + +static int +test_dict(void) +{ + heim_dict_t dict; + heim_number_t a1 = heim_number_create(1); + heim_string_t a2 = heim_string_create("hejsan"); + heim_number_t a3 = heim_number_create(3); + heim_string_t a4 = heim_string_create("foosan"); + + dict = heim_dict_create(10); + + heim_dict_set_value(dict, a1, a2); + heim_dict_set_value(dict, a3, a4); + + heim_dict_delete_key(dict, a3); + heim_dict_delete_key(dict, a1); + + heim_release(a1); + heim_release(a2); + heim_release(a3); + heim_release(a4); + + heim_release(dict); + + return 0; +} + +static int +test_auto_release(void) +{ + heim_auto_release_t ar1, ar2; + heim_number_t n1; + heim_string_t s1; + + ar1 = heim_auto_release_create(); + + s1 = heim_string_create("hejsan"); + heim_auto_release(s1); + + n1 = heim_number_create(1); + heim_auto_release(n1); + + ar2 = heim_auto_release_create(); + + n1 = heim_number_create(1); + heim_auto_release(n1); + + heim_release(ar2); + heim_release(ar1); + + return 0; +} + +static int +test_string(void) +{ + heim_string_t s1, s2; + const char *string = "hejsan"; + + s1 = heim_string_create(string); + s2 = heim_string_create(string); + + if (heim_cmp(s1, s2) != 0) { + printf("the same string is not the same\n"); + exit(1); + } + + heim_release(s1); + heim_release(s2); + + return 0; +} + +static int +test_error(void) +{ + heim_error_t e; + heim_string_t s; + + e = heim_error_create(10, "foo: %s", "bar"); + heim_assert(heim_error_get_code(e) == 10, "error_code != 10"); + + s = heim_error_copy_string(e); + heim_assert(strcmp(heim_string_get_utf8(s), "foo: bar") == 0, "msg wrong"); + + heim_release(s); + heim_release(e); + + return 0; +} + +static int +test_json(void) +{ + static char *j[] = { + "{ \"k1\" : \"s1\", \"k2\" : \"s2\" }", + "{ \"k1\" : [\"s1\", \"s2\", \"s3\"], \"k2\" : \"s3\" }", + "{ \"k1\" : {\"k2\":\"s1\",\"k3\":\"s2\",\"k4\":\"s3\"}, \"k5\" : \"s4\" }", + "[ \"v1\", \"v2\", [\"v3\",\"v4\",[\"v 5\",\" v 7 \"]], -123456789, " + "null, true, false, 123456789, \"\"]", + " -1" + }; + char *s; + size_t i, k; + heim_object_t o, o2; + heim_string_t k1 = heim_string_create("k1"); + + o = heim_json_create("\"string\"", 10, 0, NULL); + heim_assert(o != NULL, "string"); + heim_assert(heim_get_tid(o) == heim_string_get_type_id(), "string-tid"); + heim_assert(strcmp("string", heim_string_get_utf8(o)) == 0, "wrong string"); + heim_release(o); + + o = heim_json_create(" \"foo\\\"bar\" ]", 10, 0, NULL); + heim_assert(o != NULL, "string"); + heim_assert(heim_get_tid(o) == heim_string_get_type_id(), "string-tid"); + heim_assert(strcmp("foo\"bar", heim_string_get_utf8(o)) == 0, "wrong string"); + heim_release(o); + + o = heim_json_create(" { \"key\" : \"value\" }", 10, 0, NULL); + heim_assert(o != NULL, "dict"); + heim_assert(heim_get_tid(o) == heim_dict_get_type_id(), "dict-tid"); + heim_release(o); + + o = heim_json_create("{ { \"k1\" : \"s1\", \"k2\" : \"s2\" } : \"s3\", " + "{ \"k3\" : \"s4\" } : -1 }", 10, 0, NULL); + heim_assert(o != NULL, "dict"); + heim_assert(heim_get_tid(o) == heim_dict_get_type_id(), "dict-tid"); + heim_release(o); + + o = heim_json_create("{ { \"k1\" : \"s1\", \"k2\" : \"s2\" } : \"s3\", " + "{ \"k3\" : \"s4\" } : -1 }", 10, + HEIM_JSON_F_STRICT_DICT, NULL); + heim_assert(o == NULL, "dict"); + + o = heim_json_create(" { \"k1\" : \"s1\", \"k2\" : \"s2\" }", 10, 0, NULL); + heim_assert(o != NULL, "dict"); + heim_assert(heim_get_tid(o) == heim_dict_get_type_id(), "dict-tid"); + o2 = heim_dict_copy_value(o, k1); + heim_assert(heim_get_tid(o2) == heim_string_get_type_id(), "string-tid"); + heim_release(o2); + heim_release(o); + + o = heim_json_create(" { \"k1\" : { \"k2\" : \"s2\" } }", 10, 0, NULL); + heim_assert(o != NULL, "dict"); + heim_assert(heim_get_tid(o) == heim_dict_get_type_id(), "dict-tid"); + o2 = heim_dict_copy_value(o, k1); + heim_assert(heim_get_tid(o2) == heim_dict_get_type_id(), "dict-tid"); + heim_release(o2); + heim_release(o); + + o = heim_json_create("{ \"k1\" : 1 }", 10, 0, NULL); + heim_assert(o != NULL, "array"); + heim_assert(heim_get_tid(o) == heim_dict_get_type_id(), "dict-tid"); + o2 = heim_dict_copy_value(o, k1); + heim_assert(heim_get_tid(o2) == heim_number_get_type_id(), "number-tid"); + heim_release(o2); + heim_release(o); + + o = heim_json_create("-10", 10, 0, NULL); + heim_assert(o != NULL, "number"); + heim_assert(heim_get_tid(o) == heim_number_get_type_id(), "number-tid"); + heim_release(o); + + o = heim_json_create("99", 10, 0, NULL); + heim_assert(o != NULL, "number"); + heim_assert(heim_get_tid(o) == heim_number_get_type_id(), "number-tid"); + heim_release(o); + + o = heim_json_create(" [ 1 ]", 10, 0, NULL); + heim_assert(o != NULL, "array"); + heim_assert(heim_get_tid(o) == heim_array_get_type_id(), "array-tid"); + heim_release(o); + + o = heim_json_create(" [ -1 ]", 10, 0, NULL); + heim_assert(o != NULL, "array"); + heim_assert(heim_get_tid(o) == heim_array_get_type_id(), "array-tid"); + heim_release(o); + + for (i = 0; i < (sizeof (j) / sizeof (j[0])); i++) { + o = heim_json_create(j[i], 10, 0, NULL); + if (o == NULL) { + fprintf(stderr, "Failed to parse this JSON: %s\n", j[i]); + return 1; + } + heim_release(o); + /* Simple fuzz test */ + for (k = strlen(j[i]) - 1; k > 0; k--) { + o = heim_json_create_with_bytes(j[i], k, 10, 0, NULL); + if (o != NULL) { + fprintf(stderr, "Invalid JSON parsed: %.*s\n", (int)k, j[i]); + return EINVAL; + } + } + /* Again, but this time make it so valgrind can find invalid accesses */ + for (k = strlen(j[i]) - 1; k > 0; k--) { + s = strndup(j[i], k); + if (s == NULL) + return ENOMEM; + o = heim_json_create(s, 10, 0, NULL); + free(s); + if (o != NULL) { + fprintf(stderr, "Invalid JSON parsed: %s\n", j[i]); + return EINVAL; + } + } + /* Again, but with no NUL termination */ + for (k = strlen(j[i]) - 1; k > 0; k--) { + s = malloc(k); + if (s == NULL) + return ENOMEM; + memcpy(s, j[i], k); + o = heim_json_create_with_bytes(s, k, 10, 0, NULL); + free(s); + if (o != NULL) { + fprintf(stderr, "Invalid JSON parsed: %s\n", j[i]); + return EINVAL; + } + } + } + + heim_release(k1); + + return 0; +} + +static int +test_path(void) +{ + heim_dict_t dict = heim_dict_create(11); + heim_string_t p1 = heim_string_create("abc"); + heim_string_t p2a = heim_string_create("def"); + heim_string_t p2b = heim_string_create("DEF"); + heim_number_t p3 = heim_number_create(0); + heim_string_t p4a = heim_string_create("ghi"); + heim_string_t p4b = heim_string_create("GHI"); + heim_array_t a = heim_array_create(); + heim_number_t l1 = heim_number_create(42); + heim_number_t l2 = heim_number_create(813); + heim_number_t l3 = heim_number_create(1234); + heim_string_t k1 = heim_string_create("k1"); + heim_string_t k2 = heim_string_create("k2"); + heim_string_t k3 = heim_string_create("k3"); + heim_string_t k2_1 = heim_string_create("k2-1"); + heim_string_t k2_2 = heim_string_create("k2-2"); + heim_string_t k2_3 = heim_string_create("k2-3"); + heim_string_t k2_4 = heim_string_create("k2-4"); + heim_string_t k2_5 = heim_string_create("k2-5"); + heim_string_t k2_5_1 = heim_string_create("k2-5-1"); + heim_object_t o; + heim_object_t neg_num; + int ret; + + if (!dict || !p1 || !p2a || !p2b || !p4a || !p4b) + return ENOMEM; + + ret = heim_path_create(dict, 11, a, NULL, p1, p2a, NULL); + heim_release(a); + if (ret) + return ret; + ret = heim_path_create(dict, 11, l3, NULL, p1, p2b, NULL); + if (ret) + return ret; + o = heim_path_get(dict, NULL, p1, p2b, NULL); + if (o != l3) + return 1; + ret = heim_path_create(dict, 11, NULL, NULL, p1, p2a, p3, NULL); + if (ret) + return ret; + ret = heim_path_create(dict, 11, l1, NULL, p1, p2a, p3, p4a, NULL); + if (ret) + return ret; + ret = heim_path_create(dict, 11, l2, NULL, p1, p2a, p3, p4b, NULL); + if (ret) + return ret; + + o = heim_path_get(dict, NULL, p1, p2a, p3, p4a, NULL); + if (o != l1) + return 1; + o = heim_path_get(dict, NULL, p1, p2a, p3, p4b, NULL); + if (o != l2) + return 1; + + heim_release(dict); + + /* Test that JSON parsing works right by using heim_path_get() */ + dict = heim_json_create("{\"k1\":1," + "\"k2\":{\"k2-1\":21," + "\"k2-2\":null," + "\"k2-3\":true," + "\"k2-4\":false," + "\"k2-5\":[1,2,3,{\"k2-5-1\":-1},-2]}," + "\"k3\":[true,false,0,42]}", 10, 0, NULL); + heim_assert(dict != NULL, "dict"); + o = heim_path_get(dict, NULL, k1, NULL); + if (heim_cmp(o, heim_number_create(1))) return 1; + o = heim_path_get(dict, NULL, k2, NULL); + if (heim_get_tid(o) != heim_dict_get_type_id()) return 1; + o = heim_path_get(dict, NULL, k2, k2_1, NULL); + if (heim_cmp(o, heim_number_create(21))) return 1; + o = heim_path_get(dict, NULL, k2, k2_2, NULL); + if (heim_cmp(o, heim_null_create())) return 1; + o = heim_path_get(dict, NULL, k2, k2_3, NULL); + if (heim_cmp(o, heim_bool_create(1))) return 1; + o = heim_path_get(dict, NULL, k2, k2_4, NULL); + if (heim_cmp(o, heim_bool_create(0))) return 1; + o = heim_path_get(dict, NULL, k2, k2_5, NULL); + if (heim_get_tid(o) != heim_array_get_type_id()) return 1; + o = heim_path_get(dict, NULL, k2, k2_5, heim_number_create(0), NULL); + if (heim_cmp(o, heim_number_create(1))) return 1; + o = heim_path_get(dict, NULL, k2, k2_5, heim_number_create(1), NULL); + if (heim_cmp(o, heim_number_create(2))) return 1; + o = heim_path_get(dict, NULL, k2, k2_5, heim_number_create(3), k2_5_1, NULL); + if (heim_cmp(o, neg_num = heim_number_create(-1))) return 1; + heim_release(neg_num); + o = heim_path_get(dict, NULL, k2, k2_5, heim_number_create(4), NULL); + if (heim_cmp(o, neg_num = heim_number_create(-2))) return 1; + heim_release(neg_num); + o = heim_path_get(dict, NULL, k3, heim_number_create(3), NULL); + if (heim_cmp(o, heim_number_create(42))) return 1; + + heim_release(dict); + heim_release(p1); + heim_release(p2a); + heim_release(p2b); + heim_release(p4a); + heim_release(p4b); + heim_release(k1); + heim_release(k2); + heim_release(k3); + heim_release(k2_1); + heim_release(k2_2); + heim_release(k2_3); + heim_release(k2_4); + heim_release(k2_5); + heim_release(k2_5_1); + + return 0; +} + +typedef struct dict_db { + heim_dict_t dict; + int locked; +} *dict_db_t; + +static int +dict_db_open(void *plug, const char *dbtype, const char *dbname, + heim_dict_t options, void **db, heim_error_t *error) +{ + dict_db_t dictdb; + heim_dict_t contents = NULL; + + if (error) + *error = NULL; + if (dbtype && *dbtype && strcmp(dbtype, "dictdb")) + return EINVAL; + if (dbname && *dbname && strcmp(dbname, "MEMORY") != 0) + return EINVAL; + dictdb = heim_alloc(sizeof (*dictdb), "dict_db", NULL); + if (dictdb == NULL) + return ENOMEM; + + if (contents != NULL) + dictdb->dict = contents; + else { + dictdb->dict = heim_dict_create(29); + if (dictdb->dict == NULL) { + heim_release(dictdb); + return ENOMEM; + } + } + + *db = dictdb; + return 0; +} + +static int +dict_db_close(void *db, heim_error_t *error) +{ + dict_db_t dictdb = db; + + if (error) + *error = NULL; + heim_release(dictdb->dict); + heim_release(dictdb); + return 0; +} + +static int +dict_db_lock(void *db, int read_only, heim_error_t *error) +{ + dict_db_t dictdb = db; + + if (error) + *error = NULL; + if (dictdb->locked) + return EWOULDBLOCK; + dictdb->locked = 1; + return 0; +} + +static int +dict_db_unlock(void *db, heim_error_t *error) +{ + dict_db_t dictdb = db; + + if (error) + *error = NULL; + dictdb->locked = 0; + return 0; +} + +static heim_data_t +dict_db_copy_value(void *db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + dict_db_t dictdb = db; + + if (error) + *error = NULL; + + return heim_retain(heim_path_get(dictdb->dict, error, table, key, NULL)); +} + +static int +dict_db_set_value(void *db, heim_string_t table, + heim_data_t key, heim_data_t value, heim_error_t *error) +{ + dict_db_t dictdb = db; + + if (error) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + return heim_path_create(dictdb->dict, 29, value, error, table, key, NULL); +} + +static int +dict_db_del_key(void *db, heim_string_t table, heim_data_t key, + heim_error_t *error) +{ + dict_db_t dictdb = db; + + if (error) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + heim_path_delete(dictdb->dict, error, table, key, NULL); + return 0; +} + +struct dict_db_iter_ctx { + heim_db_iterator_f_t iter_f; + void *iter_ctx; +}; + +static void dict_db_iter_f(heim_object_t key, heim_object_t value, void *arg) +{ + struct dict_db_iter_ctx *ctx = arg; + + ctx->iter_f((heim_object_t)key, (heim_object_t)value, ctx->iter_ctx); +} + +static void +dict_db_iter(void *db, heim_string_t table, void *iter_data, + heim_db_iterator_f_t iter_f, heim_error_t *error) +{ + dict_db_t dictdb = db; + struct dict_db_iter_ctx ctx; + heim_dict_t table_dict; + + if (error) + *error = NULL; + + if (table == NULL) + table = HSTR(""); + + table_dict = heim_dict_copy_value(dictdb->dict, table); + if (table_dict == NULL) + return; + + ctx.iter_ctx = iter_data; + ctx.iter_f = iter_f; + + heim_dict_iterate_f(table_dict, &ctx, dict_db_iter_f); + heim_release(table_dict); +} + +static void +test_db_iter(heim_data_t k, heim_data_t v, void *arg) +{ + int *ret = arg; + const void *kptr, *vptr; + size_t klen, vlen; + + heim_assert(heim_get_tid(k) == heim_data_get_type_id(), "..."); + + kptr = heim_data_get_ptr(k); + klen = heim_data_get_length(k); + vptr = heim_data_get_ptr(v); + vlen = heim_data_get_length(v); + + if (klen == strlen("msg") && !strncmp(kptr, "msg", strlen("msg")) && + vlen == strlen("abc") && !strncmp(vptr, "abc", strlen("abc"))) + *ret &= ~(1); + else if (klen == strlen("msg2") && + !strncmp(kptr, "msg2", strlen("msg2")) && + vlen == strlen("FooBar") && !strncmp(vptr, "FooBar", strlen("FooBar"))) + *ret &= ~(2); + else + *ret |= 4; +} + +static struct heim_db_type dbt = { + 1, dict_db_open, NULL, dict_db_close, + dict_db_lock, dict_db_unlock, NULL, NULL, NULL, NULL, + dict_db_copy_value, dict_db_set_value, + dict_db_del_key, dict_db_iter +}; + +static int +test_db(const char *dbtype, const char *dbname) +{ + heim_data_t k1, k2, v, v1, v2, v3; + heim_db_t db; + int ret; + + if (dbtype == NULL) { + ret = heim_db_register("dictdb", NULL, &dbt); + heim_assert(!ret, "..."); + db = heim_db_create("dictdb", "foo", NULL, NULL); + heim_assert(!db, "..."); + db = heim_db_create("foobar", "MEMORY", NULL, NULL); + heim_assert(!db, "..."); + db = heim_db_create("dictdb", "MEMORY", NULL, NULL); + heim_assert(db, "..."); + } else { + heim_dict_t options; + + options = heim_dict_create(11); + if (options == NULL) return ENOMEM; + if (heim_dict_set_value(options, HSTR("journal-filename"), + HSTR("json-journal"))) + return ENOMEM; + if (heim_dict_set_value(options, HSTR("create"), heim_null_create())) + return ENOMEM; + if (heim_dict_set_value(options, HSTR("truncate"), heim_null_create())) + return ENOMEM; + db = heim_db_create(dbtype, dbname, options, NULL); + heim_assert(db, "..."); + heim_release(options); + } + + k1 = heim_data_create("msg", strlen("msg")); + k2 = heim_data_create("msg2", strlen("msg2")); + v1 = heim_data_create("Hello world!", strlen("Hello world!")); + v2 = heim_data_create("FooBar", strlen("FooBar")); + v3 = heim_data_create("abc", strlen("abc")); + + ret = heim_db_set_value(db, NULL, k1, v1, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v && !heim_cmp(v, v1), "..."); + heim_release(v); + + ret = heim_db_set_value(db, NULL, k2, v2, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k2, NULL); + heim_assert(v && !heim_cmp(v, v2), "..."); + heim_release(v); + + ret = heim_db_set_value(db, NULL, k1, v3, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v && !heim_cmp(v, v3), "..."); + heim_release(v); + + ret = 3; + heim_db_iterate_f(db, NULL, &ret, test_db_iter, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_begin(db, 0, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_commit(db, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_begin(db, 0, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_rollback(db, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_begin(db, 0, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_set_value(db, NULL, k1, v1, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v && !heim_cmp(v, v1), "..."); + heim_release(v); + + ret = heim_db_rollback(db, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v && !heim_cmp(v, v3), "..."); + heim_release(v); + + ret = heim_db_begin(db, 0, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_set_value(db, NULL, k1, v1, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v && !heim_cmp(v, v1), "..."); + heim_release(v); + + ret = heim_db_commit(db, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v && !heim_cmp(v, v1), "..."); + heim_release(v); + + ret = heim_db_begin(db, 0, NULL); + heim_assert(!ret, "..."); + + ret = heim_db_delete_key(db, NULL, k1, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v == NULL, "..."); + heim_release(v); + + ret = heim_db_rollback(db, NULL); + heim_assert(!ret, "..."); + + v = heim_db_copy_value(db, NULL, k1, NULL); + heim_assert(v && !heim_cmp(v, v1), "..."); + heim_release(v); + + if (dbtype != NULL) { + heim_data_t k3 = heim_data_create("value-is-a-dict", strlen("value-is-a-dict")); + heim_dict_t vdict = heim_dict_create(11); + heim_db_t db2; + + heim_assert(k3 && vdict, "..."); + ret = heim_dict_set_value(vdict, HSTR("vdict-k1"), heim_number_create(11)); + heim_assert(!ret, "..."); + ret = heim_dict_set_value(vdict, HSTR("vdict-k2"), heim_null_create()); + heim_assert(!ret, "..."); + ret = heim_dict_set_value(vdict, HSTR("vdict-k3"), HSTR("a value")); + heim_assert(!ret, "..."); + ret = heim_db_set_value(db, NULL, k3, (heim_data_t)vdict, NULL); + heim_assert(!ret, "..."); + + heim_release(vdict); + + db2 = heim_db_create(dbtype, dbname, NULL, NULL); + heim_assert(db2, "..."); + + vdict = (heim_dict_t)heim_db_copy_value(db2, NULL, k3, NULL); + heim_release(db2); + heim_release(k3); + heim_assert(vdict, "..."); + heim_assert(heim_get_tid(vdict) == heim_dict_get_type_id(), "..."); + + v = heim_dict_copy_value(vdict, HSTR("vdict-k1")); + heim_assert(v && !heim_cmp(v, heim_number_create(11)), "..."); + heim_release(v); + + v = heim_dict_copy_value(vdict, HSTR("vdict-k2")); + heim_assert(v && !heim_cmp(v, heim_null_create()), "..."); + heim_release(v); + + v = heim_dict_copy_value(vdict, HSTR("vdict-k3")); + heim_assert(v && !heim_cmp(v, HSTR("a value")), "..."); + heim_release(v); + + heim_release(vdict); + } + + heim_release(db); + heim_release(k1); + heim_release(k2); + heim_release(v1); + heim_release(v2); + heim_release(v3); + + return 0; +} + +struct test_array_iter_ctx { + char buf[256]; +}; + +static void test_array_iter(heim_object_t elt, void *arg, int *stop) +{ + struct test_array_iter_ctx *iter_ctx = arg; + + strcat(iter_ctx->buf, heim_string_get_utf8((heim_string_t)elt)); +} + +static int +test_array() +{ + struct test_array_iter_ctx iter_ctx; + heim_string_t s1 = heim_string_create("abc"); + heim_string_t s2 = heim_string_create("def"); + heim_string_t s3 = heim_string_create("ghi"); + heim_string_t s4 = heim_string_create("jkl"); + heim_string_t s5 = heim_string_create("mno"); + heim_string_t s6 = heim_string_create("pqr"); + heim_array_t a = heim_array_create(); + + if (!s1 || !s2 || !s3 || !s4 || !s5 || !s6 || !a) + return ENOMEM; + + heim_array_append_value(a, s4); + heim_array_append_value(a, s5); + heim_array_insert_value(a, 0, s3); + heim_array_insert_value(a, 0, s2); + heim_array_append_value(a, s6); + heim_array_insert_value(a, 0, s1); + + iter_ctx.buf[0] = '\0'; + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "abcdefghijklmnopqr") != 0) + return 1; + + iter_ctx.buf[0] = '\0'; + heim_array_delete_value(a, 2); + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "abcdefjklmnopqr") != 0) + return 1; + + iter_ctx.buf[0] = '\0'; + heim_array_delete_value(a, 2); + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "abcdefmnopqr") != 0) + return 1; + + iter_ctx.buf[0] = '\0'; + heim_array_delete_value(a, 0); + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "defmnopqr") != 0) + return 1; + + iter_ctx.buf[0] = '\0'; + heim_array_delete_value(a, 2); + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "defmno") != 0) + return 1; + + heim_array_insert_value(a, 0, s1); + iter_ctx.buf[0] = '\0'; + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "abcdefmno") != 0) + return 1; + + heim_array_insert_value(a, 0, s2); + iter_ctx.buf[0] = '\0'; + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "defabcdefmno") != 0) + return 1; + + heim_array_append_value(a, s3); + iter_ctx.buf[0] = '\0'; + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "defabcdefmnoghi") != 0) + return 1; + + heim_array_append_value(a, s6); + iter_ctx.buf[0] = '\0'; + heim_array_iterate_f(a, &iter_ctx, test_array_iter); + if (strcmp(iter_ctx.buf, "defabcdefmnoghipqr") != 0) + return 1; + + heim_release(s1); + heim_release(s2); + heim_release(s3); + heim_release(s4); + heim_release(s5); + heim_release(s6); + heim_release(a); + + return 0; +} + +int +main(int argc, char **argv) +{ + int res = 0; + + res |= test_memory(); + res |= test_mutex(); + res |= test_rwlock(); + res |= test_dict(); + res |= test_auto_release(); + res |= test_string(); + res |= test_error(); + res |= test_json(); + res |= test_path(); + res |= test_db(NULL, NULL); + res |= test_db("json", argc > 1 ? argv[1] : "test_db.json"); + res |= test_array(); + + return res ? 1 : 0; +} diff --git a/crypto/heimdal/lib/base/version-script.map b/crypto/heimdal/lib/base/version-script.map new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/base/version-script.map @@ -0,0 +1,94 @@ + +HEIMDAL_BASE_1.0 { + global: + _bsearch_file; + _bsearch_file_close; + _bsearch_file_info; + _bsearch_file_open; + _bsearch_text; + __heim_string_constant; + DllMain; + heim_abort; + heim_abortv; + heim_alloc; + heim_array_append_value; + heim_array_copy_value; + heim_array_create; + heim_array_delete_value; + heim_array_filter_f; + heim_array_get_length; + heim_array_get_type_id; + heim_array_get_value; + heim_array_iterate_f; + heim_array_iterate_reverse_f; + heim_array_insert_value; + heim_array_set_value; + heim_auto_release; + heim_auto_release_create; + heim_auto_release_drain; + heim_base_once_f; + heim_bool_create; + heim_bool_val; + heim_cmp; + heim_data_create; + heim_data_ref_create; + heim_data_get_data; + heim_data_get_length; + heim_data_get_ptr; + heim_data_get_type_id; + heim_data_ref_get_type_id; + heim_db_begin; + heim_db_clone; + heim_db_commit; + heim_db_copy_value; + heim_db_delete_key; + heim_db_get_type_id; + heim_db_iterate_f; + heim_db_create; + heim_db_register; + heim_db_rollback; + heim_db_set_value; + heim_dict_copy_value; + heim_dict_create; + heim_dict_delete_key; + heim_dict_get_type_id; + heim_dict_get_value; + heim_dict_iterate_f; + heim_dict_set_value; + heim_error_append; + heim_error_copy_string; + heim_error_create_opt; + heim_error_create; + heim_error_createv; + heim_error_create_enomem; + heim_error_get_code; + heim_get_hash; + heim_get_tid; + heim_json_create; + heim_json_create_with_bytes; + heim_json_copy_serialize; + heim_null_create; + heim_number_create; + heim_number_get_int; + heim_number_get_type_id; + heim_path_create; + heim_path_delete; + heim_path_get; + heim_path_copy; + heim_path_vcreate; + heim_path_vdelete; + heim_path_vget; + heim_path_vcopy; + heim_release; + heim_retain; + heim_show; + heim_sorted_text_file_dbtype; + heim_string_create; + heim_string_create_with_bytes; + heim_string_create_with_format; + heim_string_get_type_id; + heim_string_get_utf8; + heim_string_ref_create; + local: + *; +}; diff --git a/crypto/heimdal/lib/com_err/Makefile.am b/crypto/heimdal/lib/com_err/Makefile.am --- a/crypto/heimdal/lib/com_err/Makefile.am +++ b/crypto/heimdal/lib/com_err/Makefile.am @@ -13,7 +13,7 @@ libcom_err_la_LIBADD = $(LIB_libintl) -bin_PROGRAMS = compile_et +noinst_PROGRAMS = compile_et include_HEADERS = com_err.h com_right.h @@ -42,6 +42,7 @@ EXTRA_DIST = \ NTMakefile \ + com_err.3 \ compile_et-version.rc \ libcom_err-version.rc \ libcom_err-exports.def \ diff --git a/crypto/heimdal/lib/com_err/Makefile.in b/crypto/heimdal/lib/com_err/Makefile.in --- a/crypto/heimdal/lib/com_err/Makefile.in +++ b/crypto/heimdal/lib/com_err/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,17 +96,12 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog lex.c parse.c \ - parse.h @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map -bin_PROGRAMS = compile_et$(EXEEXT) +noinst_PROGRAMS = compile_et$(EXEEXT) subdir = lib/com_err ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -63,8 +112,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -77,6 +125,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -96,10 +145,13 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -121,8 +173,13 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(includedir)" +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) am__DEPENDENCIES_1 = dist_libcom_err_la_OBJECTS = libcom_err_la-error.lo \ @@ -132,47 +189,112 @@ @do_roken_rename_TRUE@ libcom_err_la-strlcpy.lo libcom_err_la_OBJECTS = $(dist_libcom_err_la_OBJECTS) \ $(nodist_libcom_err_la_OBJECTS) -libcom_err_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libcom_err_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libcom_err_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(bin_PROGRAMS) am_compile_et_OBJECTS = compile_et.$(OBJEXT) parse.$(OBJEXT) \ lex.$(OBJEXT) compile_et_OBJECTS = $(am_compile_et_OBJECTS) compile_et_DEPENDENCIES = libcom_err.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/compile_et.Po ./$(DEPDIR)/lex.Po \ + ./$(DEPDIR)/libcom_err_la-com_err.Plo \ + ./$(DEPDIR)/libcom_err_la-error.Plo \ + ./$(DEPDIR)/libcom_err_la-snprintf.Plo \ + ./$(DEPDIR)/libcom_err_la-strlcpy.Plo ./$(DEPDIR)/parse.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) +AM_V_LEX = $(am__v_LEX_@AM_V@) +am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) +am__v_LEX_0 = @echo " LEX " $@; +am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ + -e s/c++$$/h++/ -e s/c$$/h/ +YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) +AM_V_YACC = $(am__v_YACC_@AM_V@) +am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) +am__v_YACC_0 = @echo " YACC " $@; +am__v_YACC_1 = SOURCES = $(dist_libcom_err_la_SOURCES) \ $(nodist_libcom_err_la_SOURCES) $(compile_et_SOURCES) DIST_SOURCES = $(dist_libcom_err_la_SOURCES) $(compile_et_SOURCES) +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) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/ylwrap ChangeLog lex.c parse.c parse.h DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -187,16 +309,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -206,17 +331,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -235,12 +362,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -249,6 +373,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -265,10 +390,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -276,6 +399,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -290,12 +414,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -312,10 +439,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -326,13 +459,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = -d abs_builddir = @abs_builddir@ @@ -356,6 +483,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -379,9 +508,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -391,29 +525,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; lib_LTLIBRARIES = libcom_err.la libcom_err_la_LDFLAGS = -version-info 2:3:1 $(am__append_1) libcom_err_la_LIBADD = $(LIB_libintl) @@ -430,6 +572,7 @@ EXTRA_DIST = \ NTMakefile \ + com_err.3 \ compile_et-version.rc \ libcom_err-version.rc \ libcom_err-exports.def \ @@ -438,7 +581,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .l .lo .o .obj .y +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .l .lo .o .obj .y $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -451,15 +594,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/com_err/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/com_err/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -469,9 +612,18 @@ $(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 + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -479,6 +631,8 @@ 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)"; \ } @@ -494,65 +648,24 @@ clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libcom_err.la: $(libcom_err_la_OBJECTS) $(libcom_err_la_DEPENDENCIES) - $(libcom_err_la_LINK) -rpath $(libdir) $(libcom_err_la_OBJECTS) $(libcom_err_la_LIBADD) $(LIBS) -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - 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 + @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}; \ + } + +libcom_err.la: $(libcom_err_la_OBJECTS) $(libcom_err_la_DEPENDENCIES) $(EXTRA_libcom_err_la_DEPENDENCIES) + $(AM_V_CCLD)$(libcom_err_la_LINK) -rpath $(libdir) $(libcom_err_la_OBJECTS) $(libcom_err_la_LIBADD) $(LIBS) parse.h: parse.c - @if test ! -f $@; then \ - rm -f parse.c; \ - $(MAKE) $(AM_MAKEFLAGS) parse.c; \ - else :; fi -compile_et$(EXEEXT): $(compile_et_OBJECTS) $(compile_et_DEPENDENCIES) + @if test ! -f $@; then rm -f parse.c; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) parse.c; else :; fi + +compile_et$(EXEEXT): $(compile_et_OBJECTS) $(compile_et_DEPENDENCIES) $(EXTRA_compile_et_DEPENDENCIES) @rm -f compile_et$(EXEEXT) - $(LINK) $(compile_et_OBJECTS) $(compile_et_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(compile_et_OBJECTS) $(compile_et_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -560,68 +673,74 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compile_et.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-com_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-error.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-snprintf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-strlcpy.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compile_et.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lex.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-com_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-snprintf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcom_err_la-strlcpy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libcom_err_la-error.lo: error.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-error.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-error.Tpo -c -o libcom_err_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcom_err_la-error.Tpo $(DEPDIR)/libcom_err_la-error.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='libcom_err_la-error.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-error.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-error.Tpo -c -o libcom_err_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcom_err_la-error.Tpo $(DEPDIR)/libcom_err_la-error.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error.c' object='libcom_err_la-error.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c libcom_err_la-com_err.lo: com_err.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-com_err.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-com_err.Tpo -c -o libcom_err_la-com_err.lo `test -f 'com_err.c' || echo '$(srcdir)/'`com_err.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcom_err_la-com_err.Tpo $(DEPDIR)/libcom_err_la-com_err.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='com_err.c' object='libcom_err_la-com_err.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-com_err.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-com_err.Tpo -c -o libcom_err_la-com_err.lo `test -f 'com_err.c' || echo '$(srcdir)/'`com_err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcom_err_la-com_err.Tpo $(DEPDIR)/libcom_err_la-com_err.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='com_err.c' object='libcom_err_la-com_err.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-com_err.lo `test -f 'com_err.c' || echo '$(srcdir)/'`com_err.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-com_err.lo `test -f 'com_err.c' || echo '$(srcdir)/'`com_err.c libcom_err_la-snprintf.lo: snprintf.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-snprintf.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-snprintf.Tpo -c -o libcom_err_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcom_err_la-snprintf.Tpo $(DEPDIR)/libcom_err_la-snprintf.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='snprintf.c' object='libcom_err_la-snprintf.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-snprintf.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-snprintf.Tpo -c -o libcom_err_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcom_err_la-snprintf.Tpo $(DEPDIR)/libcom_err_la-snprintf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='snprintf.c' object='libcom_err_la-snprintf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c libcom_err_la-strlcpy.lo: strlcpy.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-strlcpy.Tpo -c -o libcom_err_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcom_err_la-strlcpy.Tpo $(DEPDIR)/libcom_err_la-strlcpy.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strlcpy.c' object='libcom_err_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libcom_err_la-strlcpy.lo -MD -MP -MF $(DEPDIR)/libcom_err_la-strlcpy.Tpo -c -o libcom_err_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libcom_err_la-strlcpy.Tpo $(DEPDIR)/libcom_err_la-strlcpy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strlcpy.c' object='libcom_err_la-strlcpy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libcom_err_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libcom_err_la-strlcpy.lo `test -f 'strlcpy.c' || echo '$(srcdir)/'`strlcpy.c .l.c: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) + $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo @@ -630,8 +749,11 @@ -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @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"; \ @@ -645,30 +767,17 @@ @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -680,15 +789,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -697,11 +802,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -737,11 +859,9 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-local check: check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local -install-binPROGRAMS: install-libLTLIBRARIES - +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -754,10 +874,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -774,11 +899,17 @@ -rm -f parse.h clean: clean-am -clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool mostlyclean-am +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/compile_et.Po + -rm -f ./$(DEPDIR)/lex.Po + -rm -f ./$(DEPDIR)/libcom_err_la-com_err.Plo + -rm -f ./$(DEPDIR)/libcom_err_la-error.Plo + -rm -f ./$(DEPDIR)/libcom_err_la-snprintf.Plo + -rm -f ./$(DEPDIR)/libcom_err_la-strlcpy.Plo + -rm -f ./$(DEPDIR)/parse.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -802,9 +933,8 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -826,7 +956,13 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/compile_et.Po + -rm -f ./$(DEPDIR)/lex.Po + -rm -f ./$(DEPDIR)/libcom_err_la-com_err.Plo + -rm -f ./$(DEPDIR)/libcom_err_la-error.Plo + -rm -f ./$(DEPDIR)/libcom_err_la-snprintf.Plo + -rm -f ./$(DEPDIR)/libcom_err_la-strlcpy.Plo + -rm -f ./$(DEPDIR)/parse.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -843,46 +979,58 @@ ps-am: -uninstall-am: uninstall-binPROGRAMS uninstall-includeHEADERS \ - uninstall-libLTLIBRARIES +uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libtool ctags dist-hook distclean distclean-compile \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook 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-binPROGRAMS \ - uninstall-hook uninstall-includeHEADERS \ + install-data install-data-am install-data-hook install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-local \ + 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 tags-am uninstall \ + uninstall-am uninstall-hook uninstall-includeHEADERS \ uninstall-libLTLIBRARIES +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -890,7 +1038,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -935,11 +1083,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -947,6 +1104,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -989,6 +1148,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1002,13 +1174,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/lib/com_err/NTMakefile b/crypto/heimdal/lib/com_err/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/com_err/NTMakefile @@ -0,0 +1,91 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR = lib\com_err + +intcflags=-DBUILD_KRB5_LIB + +!include ../../windows/NTMakefile.w32 + +INCFILES=$(INCDIR)\com_err.h $(INCDIR)\com_right.h + +libcomerr_OBJs=$(OBJ)\error.obj $(OBJ)\com_err.obj + +COMERRDLL=$(BINDIR)\com_err.dll + +!ifdef STATICLIBS + +$(LIBCOMERR): $(libcomerr_OBJs) + $(LIBCON) + +!else + +$(LIBCOMERR): $(COMERRDLL) + +$(COMERRDLL): $(libcomerr_OBJs) $(OBJ)\libcom_err-version.res + $(DLLGUILINK_C) -out:$(COMERRDLL) -implib:$(LIBCOMERR) $** \ + $(LIBROKEN) \ + -def:libcom_err-exports.def + $(DLLPREP_NODIST) + +!endif + +$(BINDIR)\compile_et.exe: $(OBJ)\parse.obj $(OBJ)\lex.obj $(OBJ)\compile_et.obj $(OBJ)\compile_et-version.res + $(EXECONLINK) $(LIBROKEN) $(LIBVERS) + $(EXEPREP_NOHEIM) + +$(OBJ)\parse.obj: $(OBJ)\parse.c + $(C2OBJ) -I$(SRC)\$(RELDIR) + +$(OBJ)\lex.obj: $(OBJ)\lex.c + $(C2OBJ) -I$(SRC)\$(RELDIR) -DYY_NO_UNISTD_H + +$(OBJ)\compile_et.obj: compile_et.c + $(C2OBJ) -I$(OBJ) + +$(OBJ)\parse.c: parse.y + $(YACC) -o $@ --defines=$(OBJ)\parse.h parse.y + +$(OBJ)\lex.c: lex.l + $(LEX) -o$@ lex.l + +all:: $(INCFILES) $(LIBCOMERR) $(BINDIR)\compile_et.exe + +clean:: + -$(RM) $(LIBCOMERR) + -$(RM) $(INCFILES) + -$(RM) $(COMERRDLL:.dll=.*) + -$(RM) $(BINDIR)\compile_et.* + +test-exports: + $(PERL) ..\..\cf\w32-check-exported-symbols.pl --vs version-script.map --def libcom_err-exports.def + +test:: test-exports diff --git a/crypto/heimdal/lib/com_err/com_err.h b/crypto/heimdal/lib/com_err/com_err.h --- a/crypto/heimdal/lib/com_err/com_err.h +++ b/crypto/heimdal/lib/com_err/com_err.h @@ -55,11 +55,11 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL com_err_va (const char *, long, const char *, va_list) - __attribute__((format(printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); KRB5_LIB_FUNCTION void KRB5_LIB_CALL com_err (const char *, long, const char *, ...) - __attribute__((format(printf, 3, 4))); + __attribute__ ((__format__ (__printf__, 3, 4))); KRB5_LIB_FUNCTION errf KRB5_LIB_CALL set_com_err_hook (errf); diff --git a/crypto/heimdal/lib/com_err/com_err.3 b/crypto/heimdal/lib/com_err/com_err.3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/com_err/com_err.3 @@ -0,0 +1,246 @@ +.\" Copyright (c) 2005 Kungliga Tekniska Högskolan +.\" (Royal Institute of Technology, Stockholm, Sweden). +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" 3. Neither the name of the Institute nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.\" This manpage was contributed by Gregory McGarry. +.\" +.Dd July 7, 2005 +.Dt COM_ERR 3 +.Os +.Sh NAME +.Nm com_err , +.Nm com_err_va , +.Nm error_message , +.Nm error_table_name , +.Nm init_error_table , +.Nm set_com_err_hook , +.Nm reset_com_err_hook , +.Nm add_to_error_table , +.Nm initialize_error_table_r +.Nm free_error_table , +.Nm com_right +.Nd common error display library +.Sh LIBRARY +Common Error Library (libcom_err, -lcom_err) +.Sh SYNOPSIS +.Fd #include +.Fd #include +.Fd #include +.Fd #include \&"XXX_err.h\&" +.Pp +typedef void (*errf)(const char *, long, const char *, ...); +.Ft void +.Fn com_err "const char *whoami" "long code" "const char *format" "..." +.Ft void +.Fn com_err_va "const char *whoami" "long code" "const char *format" "..." +.Ft const char * +.Fn error_message "long code" +.Ft const char * +.Fn error_table_name "int num" +.Ft int +.Fn init_error_table "const char **msgs" "long base" "int count" +.Ft errf +.Fn set_com_err_hook "errf func" +.Ft errf +.Fn reset_com_err_hook "" +.Ft void +.Fn add_to_error_table "struct et_list *new_table" +.Ft void +.Fn initialize_error_table_r "struct et_list **et_list" "const char **msgs" "int base" "long count" +.Ft void +.Fn free_error_table "struct et_list *" +.Ft const char * +.Fn com_right "struct et_list *list" long code" +.Sh DESCRIPTION +The +.Nm +library provides a common error-reporting mechanism for defining and +accessing error codes and descriptions for application software +packages. Error descriptions are defined in a table and error codes +are used to index the table. The error table, the descriptions and +the error codes are generated using +.Xr compile_et 1 . +.Pp +The error table is registered with the +.Nm +library by calling its initialisation function defined in its header +file. The initialisation function is generally defined as +.Fn initialize__error_table , +where +.Em name +is the name of the error table. +.Pp +If a thread-safe version of the library is needed +.Fn initialize__error_table_r +that internally calls +.Fn initialize_error_table_r +instead be used. +.Pp +Any variable which is to contain an error code should be declared +.Em _error_number +where +.Em name +is the name of the error table. +.Sh FUNCTIONS +The following functions are available to the application developer: +.Bl -tag -width compact +.It Fn com_err "whoami" "code" "format" "..." +Displays an error message on standard error composed of the +.Fa whoami +string, which should specify the program name, followed by an error +message generated from +.Fa code , +and a string produced using the +.Xr printf 3 +.Fa format +string and any following arguments. If +.Fa format +is NULL, the formatted message will not be +printed. The argument +.Fa format +may not be omitted. +.It Fn com_err_va "whoami" "code" "format" "va_list args" +This routine provides an interface, equivalent to +.Fn com_err , +which may be used by higher-level variadic functions (functions which +accept variable numbers of arguments). +.It Fn error_message "code" +Returns the character string error message associated with +.Fa code . +If +.Fa code +is associated with an unknown error table, or if +.Fa code +is associated with a known error table but is not in the table, a +string of the form `Unknown code XXXX NN' is returned, where XXXX is +the error table name produced by reversing the compaction performed on +the error table number implied by that error code, and NN is the +offset from that base value. +.Pp +Although this routine is available for use when needed, its use should +be left to circumstances which render +.Fn com_err +unusable. +.Pp +.Fn com_right +returns the error string just like +.Fa com_err +but in a thread-safe way. +.Pp +.It Fn error_table_name "num" +Convert a machine-independent error table number +.Fa num +into an error table name. +.It Fn init_error_table "msgs" "base" "count" +Initialise the internal error table with the array of character string +error messages in +.Fa msgs +of length +.Fa count . +The error codes are assigned incrementally from +.Fa base . +This function is useful for using the error-reporting mechanism with +custom error tables that have not been generated with +.Xr compile_et 1 . +Although this routine is available for use when needed, its use should +be restricted. +.Pp +.Fn initialize_error_table_r +initialize the +.Fa et_list +in the same way as +.Fn init_error_table , +but in a thread-safe way. +.Pp +.It Fn set_com_err_hook "func" +Provides a hook into the +.Nm +library to allow the routine +.Fa func +to be dynamically substituted for +.Fn com_err . +After +.Fn set_com_err_hook + has been called, calls to +.Fn com_err +will turn into calls to the new hook routine. This function is +intended to be used in daemons to use a routine which calls +.Xr syslog 3 , +or in a window system application to pop up a dialogue box. +.It Fn reset_com_err_hook "" +Turns off the hook set in +.Fn set_com_err_hook . +.It Fn add_to_error_table "new_table" +Add the error table, its messages strings and error codes in +.Fa new_table +to the internal error table. +.El +.Sh EXAMPLES +The following is an example using the table defined in +.Xr compile_et 1 : +.Pp +.Bd -literal + #include + #include + #include + + #include "test_err.h" + + void + hook(const char *whoami, long code, + const char *format, va_list args) + { + char buffer[BUFSIZ]; + static int initialized = 0; + + if (!initialized) { + openlog(whoami, LOG_NOWAIT, LOG_DAEMON); + initialized = 1; + } + vsprintf(buffer, format, args); + syslog(LOG_ERR, "%s %s", error_message(code), buffer); + } + + int + main(int argc, char *argv[]) + { + char *whoami = argv[0]; + + initialize_test_error_table(); + com_err(whoami, TEST_INVAL, "before hook"); + set_com_err_hook(hook); + com_err(whoami, TEST_IO, "after hook"); + return (0); + } +.Ed +.Sh SEE ALSO +.Xr compile_et 1 diff --git a/crypto/heimdal/lib/com_err/com_err.c b/crypto/heimdal/lib/com_err/com_err.c --- a/crypto/heimdal/lib/com_err/com_err.c +++ b/crypto/heimdal/lib/com_err/com_err.c @@ -70,7 +70,7 @@ static void KRB5_CALLCONV default_proc (const char *whoami, long code, const char *fmt, va_list args) - __attribute__((__format__(__printf__, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); static void KRB5_CALLCONV default_proc (const char *whoami, long code, const char *fmt, va_list args) diff --git a/crypto/heimdal/lib/com_err/com_right.h b/crypto/heimdal/lib/com_err/com_right.h --- a/crypto/heimdal/lib/com_err/com_right.h +++ b/crypto/heimdal/lib/com_err/com_right.h @@ -58,6 +58,7 @@ #ifdef __STDC__ #include +#include #endif struct error_table { diff --git a/crypto/heimdal/lib/com_err/compile_et-version.rc b/crypto/heimdal/lib/com_err/compile_et-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/com_err/compile_et-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Error Table Compiler" +#define RC_FILE_ORIG_0409 "compile_et.exe" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/com_err/compile_et.c b/crypto/heimdal/lib/com_err/compile_et.c --- a/crypto/heimdal/lib/com_err/compile_et.c +++ b/crypto/heimdal/lib/com_err/compile_et.c @@ -45,7 +45,7 @@ int numerror; extern FILE *yyin; -extern void yyparse(void); +int yyparse(void); long base_id; int number; @@ -56,7 +56,8 @@ char Basename[128]; #ifdef YYDEBUG -extern int yydebug = 1; +extern int yydebug; +int yydebug = 1; #endif char *filename; @@ -186,8 +187,8 @@ int version_flag; int help_flag; struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; int num_args = sizeof(args) / sizeof(args[0]); diff --git a/crypto/heimdal/lib/com_err/error.c b/crypto/heimdal/lib/com_err/error.c --- a/crypto/heimdal/lib/com_err/error.c +++ b/crypto/heimdal/lib/com_err/error.c @@ -65,7 +65,7 @@ const char *msg = p->table->msgs[code - p->table->base]; #ifdef LIBINTL char domain[12 + 20]; - snprintf(domain, sizeof(domain), "heim_com_err%d", p->table->base); + snprintf(domain, sizeof(domain), "heim_com_err%ld", p->table->base); #endif strlcpy(str, dgettext(domain, msg), len); return str; diff --git a/crypto/heimdal/lib/com_err/lex.h b/crypto/heimdal/lib/com_err/lex.h --- a/crypto/heimdal/lib/com_err/lex.h +++ b/crypto/heimdal/lib/com_err/lex.h @@ -34,6 +34,6 @@ /* $Id$ */ void _lex_error_message (const char *, ...) -__attribute__ ((format (printf, 1, 2))); +__attribute__ ((__format__ (__printf__, 1, 2))); int yylex(void); diff --git a/crypto/heimdal/lib/com_err/lex.c b/crypto/heimdal/lib/com_err/lex.c --- a/crypto/heimdal/lib/com_err/lex.c +++ b/crypto/heimdal/lib/com_err/lex.c @@ -1,5 +1,5 @@ -#line 3 "lex.c" +#line 2 "lex.c" #define YY_INT_ALIGNED short int @@ -7,8 +7,8 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -53,7 +53,6 @@ typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; -#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -84,63 +83,61 @@ #define UINT32_MAX (4294967295U) #endif -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) +#endif /* ! C99 */ -#define YY_USE_CONST +#endif /* ! FLEXINT_H */ -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ +/* begin standard C++ headers. */ -#ifdef YY_USE_CONST +/* TODO: this is always defined, so inline it */ #define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) #else -#define yyconst +#define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * - /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START - /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - +#define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else #define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -157,15 +154,16 @@ typedef size_t yy_size_t; #endif -extern yy_size_t yyleng; +extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ @@ -180,7 +178,6 @@ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) - #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE @@ -195,12 +192,12 @@ /* Size of input buffer in bytes, not including room for EOB * characters. */ - yy_size_t yy_buf_size; + int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - yy_size_t yy_n_chars; + int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to @@ -223,7 +220,7 @@ int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -251,7 +248,7 @@ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general @@ -262,7 +259,6 @@ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) - /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ @@ -270,11 +266,11 @@ /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; -static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ -yy_size_t yyleng; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; /* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; +static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ @@ -283,82 +279,78 @@ */ static int yy_did_buffer_switch_on_eof; -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); - -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( YY_BUFFER_STATE b ); +void yy_flush_buffer ( YY_BUFFER_STATE b ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state ( void ); -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); #define yy_new_buffer yy_create_buffer - #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } - #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } - #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ +typedef flex_uint8_t YY_CHAR; -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; - int yylineno = 1; extern char *yytext; +#ifdef yytext_ptr +#undef yytext_ptr +#endif #define yytext_ptr yytext -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ + yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; - #define YY_NUM_RULES 16 #define YY_END_OF_BUFFER 17 /* This struct is not used in this scanner, @@ -368,7 +360,7 @@ flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[46] = +static const flex_int16_t yy_accept[46] = { 0, 0, 0, 17, 15, 11, 12, 13, 10, 9, 14, 14, 14, 14, 10, 9, 14, 3, 14, 14, 1, @@ -377,7 +369,7 @@ 14, 4, 14, 2, 0 } ; -static yyconst flex_int32_t yy_ec[256] = +static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -409,14 +401,14 @@ 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[23] = +static const YY_CHAR yy_meta[23] = { 0, 1, 1, 2, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } ; -static yyconst flex_int16_t yy_base[48] = +static const flex_int16_t yy_base[48] = { 0, 0, 0, 56, 57, 57, 57, 57, 0, 49, 0, 12, 13, 34, 0, 47, 0, 0, 40, 31, 0, @@ -425,7 +417,7 @@ 12, 0, 14, 0, 57, 34, 23 } ; -static yyconst flex_int16_t yy_def[48] = +static const flex_int16_t yy_def[48] = { 0, 45, 1, 45, 45, 45, 45, 45, 46, 47, 47, 47, 47, 47, 46, 47, 47, 47, 47, 47, 47, @@ -434,7 +426,7 @@ 47, 47, 47, 47, 0, 45, 45 } ; -static yyconst flex_int16_t yy_nxt[80] = +static const flex_int16_t yy_nxt[80] = { 0, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 10, 10, 11, 10, 12, 10, 10, 10, 13, 10, @@ -446,7 +438,7 @@ 45, 45, 45, 45, 45, 45, 45, 45, 45 } ; -static yyconst flex_int16_t yy_chk[80] = +static const flex_int16_t yy_chk[80] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -475,7 +467,7 @@ #line 1 "lex.l" #line 2 "lex.l" /* - * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan + * Copyright (c) 1998 - 2017 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -526,7 +518,8 @@ #undef ECHO -#line 530 "lex.c" +#line 521 "lex.c" +#line 522 "lex.c" #define INITIAL 0 @@ -542,36 +535,36 @@ #define YY_EXTRA_TYPE void * #endif -static int yy_init_globals (void ); +static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy (void ); +int yylex_destroy ( void ); -int yyget_debug (void ); +int yyget_debug ( void ); -void yyset_debug (int debug_flag ); +void yyset_debug ( int debug_flag ); -YY_EXTRA_TYPE yyget_extra (void ); +YY_EXTRA_TYPE yyget_extra ( void ); -void yyset_extra (YY_EXTRA_TYPE user_defined ); +void yyset_extra ( YY_EXTRA_TYPE user_defined ); -FILE *yyget_in (void ); +FILE *yyget_in ( void ); -void yyset_in (FILE * in_str ); +void yyset_in ( FILE * _in_str ); -FILE *yyget_out (void ); +FILE *yyget_out ( void ); -void yyset_out (FILE * out_str ); +void yyset_out ( FILE * _out_str ); -yy_size_t yyget_leng (void ); + int yyget_leng ( void ); -char *yyget_text (void ); +char *yyget_text ( void ); -int yyget_lineno (void ); +int yyget_lineno ( void ); -void yyset_lineno (int line_number ); +void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -579,33 +572,41 @@ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap (void ); +extern "C" int yywrap ( void ); #else -extern int yywrap (void ); +extern int yywrap ( void ); #endif #endif +#ifndef YY_NO_UNPUT + +#endif + #ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); +static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); +static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT - #ifdef __cplusplus -static int yyinput (void ); +static int yyinput ( void ); #else -static int input (void ); +static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else #define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -613,7 +614,7 @@ /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO fwrite( yytext, yyleng, 1, yyout ) +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -624,7 +625,7 @@ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - yy_size_t n; \ + int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -637,7 +638,7 @@ else \ { \ errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -692,7 +693,7 @@ /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK break; +#define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ @@ -702,14 +703,10 @@ */ YY_DECL { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; -#line 58 "lex.l" - -#line 712 "lex.c" - if ( !(yy_init) ) { (yy_init) = 1; @@ -730,13 +727,18 @@ if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_load_buffer_state( ); + yy_load_buffer_state( ); } - while ( 1 ) /* loops until end-of-file is reached */ + { +#line 58 "lex.l" + +#line 739 "lex.c" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); @@ -752,7 +754,7 @@ yy_match: do { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -762,9 +764,9 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 46 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 57 ); @@ -872,7 +874,7 @@ #line 74 "lex.l" ECHO; YY_BREAK -#line 876 "lex.c" +#line 877 "lex.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -950,7 +952,7 @@ { (yy_did_buffer_switch_on_eof) = 0; - if ( yywrap( ) ) + if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -1003,6 +1005,7 @@ "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer @@ -1014,9 +1017,9 @@ */ static int yy_get_next_buffer (void) { - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) @@ -1045,7 +1048,7 @@ /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -1058,21 +1061,21 @@ else { - yy_size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { - yy_size_t new_size = b->yy_buf_size * 2; + int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; @@ -1081,11 +1084,12 @@ b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; + b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -1113,7 +1117,7 @@ if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); + yyrestart( yyin ); } else @@ -1127,12 +1131,15 @@ else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; @@ -1148,14 +1155,14 @@ static yy_state_type yy_get_previous_state (void) { - register yy_state_type yy_current_state; - register char *yy_cp; + yy_state_type yy_current_state; + char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -1165,9 +1172,9 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 46 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; @@ -1180,10 +1187,10 @@ */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); - register YY_CHAR yy_c = 1; + YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -1193,14 +1200,18 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 46 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 45); - return yy_is_jam ? 0 : yy_current_state; + return yy_is_jam ? 0 : yy_current_state; } +#ifndef YY_NO_UNPUT + +#endif + #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) @@ -1225,7 +1236,7 @@ else { /* need more input */ - yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) @@ -1242,13 +1253,13 @@ */ /* Reset buffer status. */ - yyrestart(yyin ); + yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap( ) ) + if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) @@ -1286,11 +1297,11 @@ if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); + yy_init_buffer( YY_CURRENT_BUFFER, input_file ); + yy_load_buffer_state( ); } /** Switch to a different input buffer. @@ -1318,7 +1329,7 @@ } YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); + yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag @@ -1346,7 +1357,7 @@ { YY_BUFFER_STATE b; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -1355,13 +1366,13 @@ /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; - yy_init_buffer(b,file ); + yy_init_buffer( b, file ); return b; } @@ -1380,15 +1391,11 @@ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); + yyfree( (void *) b->yy_ch_buf ); - yyfree((void *) b ); + yyfree( (void *) b ); } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. @@ -1398,7 +1405,7 @@ { int oerrno = errno; - yy_flush_buffer(b ); + yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; @@ -1441,7 +1448,7 @@ b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); + yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes @@ -1472,7 +1479,7 @@ YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } @@ -1491,7 +1498,7 @@ --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } @@ -1509,15 +1516,15 @@ * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; @@ -1526,7 +1533,7 @@ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; + yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc @@ -1546,7 +1553,7 @@ * @param base the character buffer * @param size the size in bytes of the character buffer * - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { @@ -1556,23 +1563,23 @@ base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return 0; + return NULL; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = 0; + b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer(b ); + yy_switch_to_buffer( b ); return b; } @@ -1585,28 +1592,29 @@ * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +YY_BUFFER_STATE yy_scan_string (const char * yystr ) { - return yy_scan_bytes(yystr,strlen(yystr) ); + return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; - yy_size_t n, i; + yy_size_t n; + int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); @@ -1615,7 +1623,7 @@ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer(buf,n ); + b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); @@ -1631,9 +1639,9 @@ #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) +static void yynoreturn yy_fatal_error (const char* msg ) { - (void) fprintf( stderr, "%s\n", msg ); + fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } @@ -1661,7 +1669,7 @@ */ int yyget_lineno (void) { - + return yylineno; } @@ -1684,7 +1692,7 @@ /** Get the length of the current token. * */ -yy_size_t yyget_leng (void) +int yyget_leng (void) { return yyleng; } @@ -1699,29 +1707,29 @@ } /** Set the current line number. - * @param line_number + * @param _line_number line number * */ -void yyset_lineno (int line_number ) +void yyset_lineno (int _line_number ) { - yylineno = line_number; + yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. - * @param in_str A readable stream. + * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ -void yyset_in (FILE * in_str ) +void yyset_in (FILE * _in_str ) { - yyin = in_str ; + yyin = _in_str ; } -void yyset_out (FILE * out_str ) +void yyset_out (FILE * _out_str ) { - yyout = out_str ; + yyout = _out_str ; } int yyget_debug (void) @@ -1729,9 +1737,9 @@ return yy_flex_debug; } -void yyset_debug (int bdebug ) +void yyset_debug (int _bdebug ) { - yy_flex_debug = bdebug ; + yy_flex_debug = _bdebug ; } static int yy_init_globals (void) @@ -1740,10 +1748,10 @@ * This function is called from yylex_destroy(), so don't allocate here. */ - (yy_buffer_stack) = 0; + (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; + (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; @@ -1752,8 +1760,8 @@ yyin = stdin; yyout = stdout; #else - yyin = (FILE *) 0; - yyout = (FILE *) 0; + yyin = NULL; + yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by @@ -1768,7 +1776,7 @@ /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); + yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } @@ -1789,18 +1797,19 @@ */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +static void yy_flex_strncpy (char* s1, const char * s2, int n ) { - register int i; + + int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) +static int yy_flex_strlen (const char * s ) { - register int n; + int n; for ( n = 0; s[n]; ++n ) ; @@ -1810,11 +1819,12 @@ void *yyalloc (yy_size_t size ) { - return (void *) malloc( size ); + return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { + /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter @@ -1822,12 +1832,12 @@ * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return (void *) realloc( (char *) ptr, size ); + return realloc(ptr, size); } void yyfree (void * ptr ) { - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" @@ -1835,14 +1845,11 @@ #line 74 "lex.l" - -#ifndef yywrap /* XXX */ int yywrap () { return 1; } -#endif static int getstring(void) diff --git a/crypto/heimdal/lib/com_err/lex.l b/crypto/heimdal/lib/com_err/lex.l --- a/crypto/heimdal/lib/com_err/lex.l +++ b/crypto/heimdal/lib/com_err/lex.l @@ -1,6 +1,6 @@ %{ /* - * Copyright (c) 1998 - 2000 Kungliga Tekniska Högskolan + * Copyright (c) 1998 - 2017 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -73,13 +73,11 @@ . { return *yytext; } %% -#ifndef yywrap /* XXX */ int yywrap () { return 1; } -#endif static int getstring(void) diff --git a/crypto/heimdal/lib/com_err/libcom_err-exports.def b/crypto/heimdal/lib/com_err/libcom_err-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/com_err/libcom_err-exports.def @@ -0,0 +1,14 @@ +EXPORTS + com_right + com_right_r + free_error_table + initialize_error_table_r + add_to_error_table + com_err + com_err_va + error_message + error_table_name + init_error_table + reset_com_err_hook + set_com_err_hook + _et_list DATA diff --git a/crypto/heimdal/lib/com_err/libcom_err-version.rc b/crypto/heimdal/lib/com_err/libcom_err-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/com_err/libcom_err-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_DLL +#define RC_FILE_DESC_0409 "Common Error Library" +#define RC_FILE_ORIG_0409 "com_err.dll" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/com_err/parse.h b/crypto/heimdal/lib/com_err/parse.h --- a/crypto/heimdal/lib/com_err/parse.h +++ b/crypto/heimdal/lib/com_err/parse.h @@ -1,14 +1,14 @@ -/* A Bison parser, made by GNU Bison 2.3. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ -/* Skeleton interface for Bison's Yacc-like parsers in C +/* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. - This program is free software; you can redistribute it and/or modify + 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. + 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 @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -33,23 +31,45 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -/* Tokens. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_YY_PARSE_H_INCLUDED +# define YY_YY_PARSE_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int yydebug; +#endif + +/* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - ET = 258, - INDEX = 259, - PREFIX = 260, - EC = 261, - ID = 262, - END = 263, - STRING = 264, - NUMBER = 265 - }; + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + ET = 258, /* ET */ + INDEX = 259, /* INDEX */ + PREFIX = 260, /* PREFIX */ + EC = 261, /* EC */ + ID = 262, /* ID */ + END = 263, /* END */ + STRING = 264, /* STRING */ + NUMBER = 265 /* NUMBER */ + }; + typedef enum yytokentype yytoken_kind_t; #endif -/* Tokens. */ +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 #define ET 258 #define INDEX 259 #define PREFIX 260 @@ -59,23 +79,28 @@ #define STRING 264 #define NUMBER 265 - - - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 54 "parse.y" +union YYSTYPE { +#line 54 "parse.y" + char *string; int number; -} -/* Line 1529 of yacc.c. */ -#line 74 "parse.h" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 + +#line 92 "parse.h" + +}; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 #endif + extern YYSTYPE yylval; + +int yyparse (void); + + +#endif /* !YY_YY_PARSE_H_INCLUDED */ diff --git a/crypto/heimdal/lib/com_err/parse.c b/crypto/heimdal/lib/com_err/parse.c --- a/crypto/heimdal/lib/com_err/parse.c +++ b/crypto/heimdal/lib/com_err/parse.c @@ -1,14 +1,14 @@ -/* A Bison parser, made by GNU Bison 2.3. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ -/* Skeleton implementation for Bison's Yacc-like parsers in C +/* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. - This program is free software; you can redistribute it and/or modify + 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. + 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 @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -36,6 +34,10 @@ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. @@ -43,11 +45,11 @@ define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ -/* Identify Bison output. */ -#define YYBISON 1 +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 -/* Bison version. */ -#define YYBISON_VERSION "2.3" +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -55,41 +57,16 @@ /* Pure parsers. */ #define YYPURE 0 -/* Using locations. */ -#define YYLSP_NEEDED 0 - - +/* Push parsers. */ +#define YYPUSH 0 -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - ET = 258, - INDEX = 259, - PREFIX = 260, - EC = 261, - ID = 262, - END = 263, - STRING = 264, - NUMBER = 265 - }; -#endif -/* Tokens. */ -#define ET 258 -#define INDEX 259 -#define PREFIX 260 -#define EC 261 -#define ID 262 -#define END 263 -#define STRING 264 -#define NUMBER 265 +/* Pull parsers. */ +#define YYPULL 1 -/* Copy the first part of user declarations. */ +/* First part of user prologue. */ #line 1 "parse.y" /* @@ -143,77 +120,214 @@ #define YYFREE free +#line 124 "parse.c" -/* Enabling traces. */ +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +/* Use api.header.include to #include this header + instead of duplicating it here. */ +#ifndef YY_YY_PARSE_H_INCLUDED +# define YY_YY_PARSE_H_INCLUDED +/* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 +#if YYDEBUG +extern int yydebug; #endif -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + ET = 258, /* ET */ + INDEX = 259, /* INDEX */ + PREFIX = 260, /* PREFIX */ + EC = 261, /* EC */ + ID = 262, /* ID */ + END = 263, /* END */ + STRING = 264, /* STRING */ + NUMBER = 265 /* NUMBER */ + }; + typedef enum yytokentype yytoken_kind_t; #endif +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 +#define ET 258 +#define INDEX 259 +#define PREFIX 260 +#define EC 261 +#define ID 262 +#define END 263 +#define STRING 264 +#define NUMBER 265 +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 54 "parse.y" +union YYSTYPE { +#line 54 "parse.y" + char *string; int number; -} -/* Line 193 of yacc.c. */ -#line 174 "parse.c" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 + +#line 202 "parse.c" + +}; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 #endif +extern YYSTYPE yylval; + + +int yyparse (void); + + +#endif /* !YY_YY_PARSE_H_INCLUDED */ +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_ET = 3, /* ET */ + YYSYMBOL_INDEX = 4, /* INDEX */ + YYSYMBOL_PREFIX = 5, /* PREFIX */ + YYSYMBOL_EC = 6, /* EC */ + YYSYMBOL_ID = 7, /* ID */ + YYSYMBOL_END = 8, /* END */ + YYSYMBOL_STRING = 9, /* STRING */ + YYSYMBOL_NUMBER = 10, /* NUMBER */ + YYSYMBOL_11_ = 11, /* ',' */ + YYSYMBOL_YYACCEPT = 12, /* $accept */ + YYSYMBOL_file = 13, /* file */ + YYSYMBOL_header = 14, /* header */ + YYSYMBOL_id = 15, /* id */ + YYSYMBOL_et = 16, /* et */ + YYSYMBOL_statements = 17, /* statements */ + YYSYMBOL_statement = 18 /* statement */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; -/* Copy the second part of user declarations. */ -/* Line 216 of yacc.c. */ -#line 187 "parse.c" #ifdef short # undef short #endif -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif #endif -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; #else -typedef short int yytype_int8; +typedef short yytype_int16; #endif -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; #else -typedef unsigned short int yytype_uint16; +typedef short yytype_uint8; #endif -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; #else -typedef short int yytype_int16; +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif #endif #ifndef YYSIZE_T @@ -221,55 +335,106 @@ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else -# define YYSIZE_T unsigned int +# define YYSIZE_T unsigned # endif #endif -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int8 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ -# define YY_(msgid) msgid +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) +# define YY_USE(E) ((void) (E)) #else -# define YYUSE(e) /* empty */ +# define YY_USE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") #else -static int -YYID (i) - int i; +# define YY_INITIAL_VALUE(Value) Value #endif -{ - return i; -} +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END #endif -#if ! defined yyoverflow || YYERROR_VERBOSE + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -286,11 +451,11 @@ # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # endif @@ -298,8 +463,8 @@ # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -313,88 +478,89 @@ # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif -# if (defined __cplusplus && ! defined _STDLIB_H \ +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - +#endif /* !defined yyoverflow */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { - yytype_int16 yyss; - YYSTYPE yyvs; - }; + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; /* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif +# define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) #endif +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + /* YYFINAL -- State number of the termination state. */ #define YYFINAL 9 /* YYLAST -- Last index in YYTABLE. */ @@ -406,18 +572,23 @@ #define YYNNTS 7 /* YYNRULES -- Number of rules. */ #define YYNRULES 15 -/* YYNRULES -- Number of states. */ +/* YYNSTATES -- Number of states. */ #define YYNSTATES 24 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 +/* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 265 -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -449,25 +620,7 @@ }; #if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 4, 7, 10, 12, 15, 18, 22, - 24, 27, 30, 33, 35, 40 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 13, 0, -1, -1, 14, 17, -1, 15, 16, -1, - 16, -1, 7, 9, -1, 3, 9, -1, 3, 9, - 9, -1, 18, -1, 17, 18, -1, 4, 10, -1, - 5, 9, -1, 5, -1, 6, 9, 11, 9, -1, - 8, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { 0, 65, 65, 66, 69, 70, 73, 79, 85, 94, @@ -475,60 +628,42 @@ }; #endif -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "ET", "INDEX", "PREFIX", "EC", "ID", - "END", "STRING", "NUMBER", "','", "$accept", "file", "header", "id", - "et", "statements", "statement", 0 + "\"end of file\"", "error", "\"invalid token\"", "ET", "INDEX", + "PREFIX", "EC", "ID", "END", "STRING", "NUMBER", "','", "$accept", + "file", "header", "id", "et", "statements", "statement", YY_NULLPTR }; -#endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) { - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 44 -}; -# endif + return yytname[yysymbol]; +} +#endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 12, 13, 13, 14, 14, 15, 16, 16, 17, - 17, 18, 18, 18, 18, 18 -}; +#define YYPACT_NINF (-5) -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 0, 2, 2, 1, 2, 2, 3, 1, - 2, 2, 2, 1, 4, 1 -}; +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 2, 0, 0, 0, 0, 0, 5, 7, 6, 1, - 0, 13, 0, 15, 3, 9, 4, 8, 11, 12, - 0, 10, 0, 14 -}; +#define YYTABLE_NINF (-1) -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 3, 4, 5, 6, 14, 15 -}; +#define yytable_value_is_error(Yyn) \ + 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -5 static const yytype_int8 yypact[] = { 0, -3, -1, 5, -4, 6, -5, 1, -5, -5, @@ -536,18 +671,32 @@ 3, -5, 8, -5 }; +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int8 yydefact[] = +{ + 2, 0, 0, 0, 0, 0, 5, 7, 6, 1, + 0, 13, 0, 15, 3, 9, 4, 8, 11, 12, + 0, 10, 0, 14 +}; + /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -5, -5, -5, -5, 10, -5, 9 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 -static const yytype_uint8 yytable[] = +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + 0, 3, 4, 5, 6, 14, 15 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int8 yytable[] = { 10, 11, 12, 1, 13, 9, 7, 2, 8, 1, 17, 0, 18, 19, 22, 16, 20, 23, 0, 0, @@ -561,104 +710,64 @@ -1, -1, -1, 14 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ +static const yytype_int8 yystos[] = { 0, 3, 7, 13, 14, 15, 16, 9, 9, 0, 4, 5, 6, 8, 17, 18, 16, 9, 10, 9, 9, 18, 11, 9 }; -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr1[] = +{ + 0, 12, 13, 13, 14, 14, 15, 16, 16, 17, + 17, 18, 18, 18, 18, 18 +}; -#define YYFAIL goto yyerrlab +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 0, 2, 2, 1, 2, 2, 3, 1, + 2, 2, 2, 1, 4, 1 +}; -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif +enum { YYENOMEM = -2 }; +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif +#define YYRECOVERING() (!!yyerrstatus) -/* YYLEX -- calling `yylex' with the right arguments. */ +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif /* Enable debugging if requested. */ #if YYDEBUG @@ -668,80 +777,58 @@ # define YYFPRINTF fprintf # endif -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { + FILE *yyoutput = yyo; + YY_USE (yyoutput); if (!yyvaluep) return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); + yy_symbol_value_print (yyo, yykind, yyvaluep); + YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. @@ -749,80 +836,68 @@ | TOP (included). | `------------------------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule) { + int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)]); + YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule); \ +} while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -837,478 +912,219 @@ # define YYMAXDEPTH 10000 #endif - -#if YYERROR_VERBOSE -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep) { - YYUSE (yyvaluep); - + YY_USE (yyvaluep); if (!yymsg) yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } - -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - - -/* The look-ahead symbol. */ +/* Lookahead token kind. */ int yychar; -/* The semantic value of the look-ahead symbol. */ +/* The semantic value of the lookahead symbol. */ YYSTYPE yylval; - /* Number of syntax errors so far. */ int yynerrs; + /*----------. | yyparse. | `----------*/ -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) int yyparse (void) -#else -int -yyparse () - -#endif -#endif { - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - YYSIZE_T yystacksize = YYINITDEPTH; - + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss; - yyvsp = yyvs; + yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; + /*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | +| yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ - yynewstate: +yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; - yysetstate: - *yyssp = yystate; + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else { /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + YYPTRDIFF_T yysize = yyssp - yyss + 1; -#ifdef yyoverflow +# if defined yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else +# else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif -#endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; goto yybackup; + /*-----------. | yybackup. | `-----------*/ yybackup: - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ + lookahead token if we need one and don't already have one. */ - /* First try to decide what to do without reference to look-ahead token. */ + /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yypact_value_is_default (yyn)) goto yydefault; - /* Not known => get a look-ahead token if don't already have one. */ + /* Not known => get a lookahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (); } if (yychar <= YYEOF) { - yychar = yytoken = YYEOF; + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } else { yytoken = YYTRANSLATE (yychar); @@ -1323,30 +1139,26 @@ yyn = yytable[yyn]; if (yyn <= 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; + if (yytable_value_is_error (yyn)) + goto yyerrlab; yyn = -yyn; goto yyreduce; } - if (yyn == YYFINAL) - YYACCEPT; - /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; - /* Shift the look-ahead token. */ + /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + /* Discard the shifted token. */ + yychar = YYEMPTY; goto yynewstate; @@ -1361,14 +1173,14 @@ /*-----------------------------. -| yyreduce -- Do a reduction. | +| yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. + '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -1381,63 +1193,69 @@ YY_REDUCE_PRINT (yyn); switch (yyn) { - case 6: + case 6: /* id: ID STRING */ #line 74 "parse.y" - { - id_str = (yyvsp[(2) - (2)].string); + { + id_str = (yyvsp[0].string); } +#line 1202 "parse.c" break; - case 7: + case 7: /* et: ET STRING */ #line 80 "parse.y" - { - base_id = name2number((yyvsp[(2) - (2)].string)); - strlcpy(name, (yyvsp[(2) - (2)].string), sizeof(name)); - free((yyvsp[(2) - (2)].string)); + { + base_id = name2number((yyvsp[0].string)); + strlcpy(name, (yyvsp[0].string), sizeof(name)); + free((yyvsp[0].string)); } +#line 1212 "parse.c" break; - case 8: + case 8: /* et: ET STRING STRING */ #line 86 "parse.y" - { - base_id = name2number((yyvsp[(2) - (3)].string)); - strlcpy(name, (yyvsp[(3) - (3)].string), sizeof(name)); - free((yyvsp[(2) - (3)].string)); - free((yyvsp[(3) - (3)].string)); + { + base_id = name2number((yyvsp[-1].string)); + strlcpy(name, (yyvsp[0].string), sizeof(name)); + free((yyvsp[-1].string)); + free((yyvsp[0].string)); } +#line 1223 "parse.c" break; - case 11: + case 11: /* statement: INDEX NUMBER */ #line 99 "parse.y" - { - number = (yyvsp[(2) - (2)].number); + { + number = (yyvsp[0].number); } +#line 1231 "parse.c" break; - case 12: + case 12: /* statement: PREFIX STRING */ #line 103 "parse.y" - { + { free(prefix); - asprintf (&prefix, "%s_", (yyvsp[(2) - (2)].string)); + asprintf (&prefix, "%s_", (yyvsp[0].string)); if (prefix == NULL) errx(1, "malloc"); - free((yyvsp[(2) - (2)].string)); + free((yyvsp[0].string)); } +#line 1243 "parse.c" break; - case 13: + case 13: /* statement: PREFIX */ #line 111 "parse.y" - { + { prefix = realloc(prefix, 1); if (prefix == NULL) errx(1, "malloc"); *prefix = '\0'; } +#line 1254 "parse.c" break; - case 14: + case 14: /* statement: EC STRING ',' STRING */ #line 118 "parse.y" - { + { struct error_code *ec = malloc(sizeof(*ec)); if (ec == NULL) @@ -1446,121 +1264,98 @@ ec->next = NULL; ec->number = number; if(prefix && *prefix != '\0') { - asprintf (&ec->name, "%s%s", prefix, (yyvsp[(2) - (4)].string)); + asprintf (&ec->name, "%s%s", prefix, (yyvsp[-2].string)); if (ec->name == NULL) errx(1, "malloc"); - free((yyvsp[(2) - (4)].string)); + free((yyvsp[-2].string)); } else - ec->name = (yyvsp[(2) - (4)].string); - ec->string = (yyvsp[(4) - (4)].string); + ec->name = (yyvsp[-2].string); + ec->string = (yyvsp[0].string); APPEND(codes, ec); number++; } +#line 1278 "parse.c" break; - case 15: + case 15: /* statement: END */ #line 138 "parse.y" - { + { YYACCEPT; } +#line 1286 "parse.c" break; -/* Line 1267 of yacc.c. */ -#line 1471 "parse.c" +#line 1290 "parse.c" + default: break; } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; - YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state + /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } goto yynewstate; -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; -#if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif } - - if (yyerrstatus == 3) { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } } - /* Else will try to reuse look-ahead token after shifting the error + /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; @@ -1569,14 +1364,13 @@ | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -1589,42 +1383,42 @@ | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ + /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yydestruct ("Error: popping", - yystos[yystate], yyvsp); + YY_ACCESSING_SYMBOL (yystate), yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } - if (yyn == YYFINAL) - YYACCEPT; - + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; @@ -1635,51 +1429,55 @@ `-------------------------------------*/ yyacceptlab: yyresult = 0; - goto yyreturn; + goto yyreturnlab; + /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; - goto yyreturn; + goto yyreturnlab; -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; - /* Fall through. */ -#endif + goto yyreturnlab; + -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} + return yyresult; +} #line 143 "parse.y" @@ -1714,4 +1512,3 @@ { _lex_error_message ("%s\n", s); } - diff --git a/crypto/heimdal/lib/gssapi/Makefile.am b/crypto/heimdal/lib/gssapi/Makefile.am --- a/crypto/heimdal/lib/gssapi/Makefile.am +++ b/crypto/heimdal/lib/gssapi/Makefile.am @@ -12,9 +12,7 @@ -I$(srcdir)/ntlm \ -I$(srcdir)/krb5 \ -I$(srcdir)/spnego \ - $(INCLUDE_libintl) \ - $(INCLUDE_hcrypto) \ - $(INCLUDE_krb4) + $(INCLUDE_libintl) lib_LTLIBRARIES = libgssapi.la @@ -46,7 +44,7 @@ krb5/external.c \ krb5/get_mic.c \ krb5/gsskrb5_locl.h \ - krb5/gsskrb5-private.h \ + $(srcdir)/krb5/gsskrb5-private.h \ krb5/import_name.c \ krb5/import_sec_context.c \ krb5/indicate_mechs.c \ @@ -165,7 +163,7 @@ spnego/external.c \ spnego/init_sec_context.c \ spnego/spnego_locl.h \ - spnego/spnego-private.h + $(srcdir)/spnego/spnego-private.h ntlmsrc = \ ntlm/accept_sec_context.c \ @@ -184,7 +182,6 @@ ntlm/export_sec_context.c \ ntlm/external.c \ ntlm/ntlm.h \ - ntlm/ntlm-private.h \ ntlm/import_name.c \ ntlm/import_sec_context.c \ ntlm/indicate_mechs.c \ @@ -200,7 +197,7 @@ ntlm/release_name.c \ ntlm/kdc.c -$(srcdir)/ntlm/ntlm-private.h: +$(srcdir)/ntlm/ntlm-private.h: $(ntlmsrc) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p ntlm/ntlm-private.h $(ntlmsrc) || rm -f ntlm/ntlm-private.h dist_libgssapi_la_SOURCES = \ @@ -235,9 +232,9 @@ include_HEADERS = gssapi.h noinst_HEADERS = \ gssapi_mech.h \ - ntlm/ntlm-private.h \ - spnego/spnego-private.h \ - krb5/gsskrb5-private.h + $(srcdir)/ntlm/ntlm-private.h \ + $(srcdir)/spnego/spnego-private.h \ + $(srcdir)/krb5/gsskrb5-private.h nobase_include_HEADERS = \ gssapi/gssapi.h \ @@ -274,10 +271,13 @@ BUILT_SOURCES = $(spnego_files:.x=.c) $(gssapi_files:.x=.c) +$(libgssapi_la_OBJECTS): gkrb5_err.h +gkrb5_err.h: $(srcdir)/krb5/gkrb5_err.et + CLEANFILES = $(BUILT_SOURCES) \ gkrb5_err.h gkrb5_err.c \ - $(spnego_files) spnego_asn1*.h* spnego_asn1_files spnego_asn1-template.c \ - $(gssapi_files) gssapi_asn1*.h* gssapi_asn1_files gssapi_asn1-template.c \ + $(spnego_files) spnego_asn1*.h* spnego_asn1_files spnego_asn1-template.[cx] \ + $(gssapi_files) gssapi_asn1*.h* gssapi_asn1_files gssapi_asn1-template.[cx] \ gss-commands.h gss-commands.c $(spnego_files) spnego_asn1.hx spnego_asn1-priv.hx: spnego_asn1_files @@ -304,12 +304,14 @@ check_PROGRAMS = test_acquire_cred $(TESTS) bin_PROGRAMS = gsstool -noinst_PROGRAMS = test_cred test_kcred test_context test_ntlm +noinst_PROGRAMS = test_cred test_kcred test_context test_ntlm test_add_store_cred test_context_SOURCES = test_context.c test_common.c test_common.h test_ntlm_SOURCES = test_ntlm.c test_common.c test_common.h test_acquire_cred_SOURCES = test_acquire_cred.c test_common.c test_common.h +test_add_store_cred_SOURCES = test_add_store_cred.c + test_ntlm_LDADD = \ $(top_builddir)/lib/ntlm/libheimntlm.la \ $(LDADD) @@ -339,6 +341,13 @@ libgssapi-version.rc \ libgssapi-exports.def \ $(man_MANS) \ + gen-oid.pl \ + gssapi/gssapi_netlogon.h \ + krb5/test_acquire_cred.c \ + krb5/test_cred.c \ + krb5/test_kcred.c \ + krb5/test_oid.c \ + oid.txt \ krb5/gkrb5_err.et \ mech/gssapi.asn1 \ spnego/spnego.asn1 \ diff --git a/crypto/heimdal/lib/gssapi/Makefile.in b/crypto/heimdal/lib/gssapi/Makefile.in --- a/crypto/heimdal/lib/gssapi/Makefile.in +++ b/crypto/heimdal/lib/gssapi/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,21 +96,17 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(include_HEADERS) $(nobase_include_HEADERS) \ - $(noinst_HEADERS) $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map TESTS = test_oid$(EXEEXT) test_names$(EXEEXT) test_cfx$(EXEEXT) check_PROGRAMS = test_acquire_cred$(EXEEXT) $(am__EXEEXT_1) bin_PROGRAMS = gsstool$(EXEEXT) noinst_PROGRAMS = test_cred$(EXEEXT) test_kcred$(EXEEXT) \ - test_context$(EXEEXT) test_ntlm$(EXEEXT) + test_context$(EXEEXT) test_ntlm$(EXEEXT) \ + test_add_store_cred$(EXEEXT) subdir = lib/gssapi ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -67,8 +117,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -81,6 +130,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -100,10 +150,18 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(nobase_include_HEADERS) $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" \ + "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" \ + "$(DESTDIR)$(gssapidir)" +am__EXEEXT_1 = test_oid$(EXEEXT) test_names$(EXEEXT) test_cfx$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -125,10 +183,12 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" \ - "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" \ - "$(DESTDIR)$(gssapidir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = am__dirstamp = $(am__leading_dot)dirstamp @@ -222,11 +282,13 @@ nodist_libgssapi_la_OBJECTS = gkrb5_err.lo $(am__objects_7) libgssapi_la_OBJECTS = $(dist_libgssapi_la_OBJECTS) \ $(nodist_libgssapi_la_OBJECTS) -libgssapi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libgssapi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libgssapi_la_LDFLAGS) $(LDFLAGS) -o $@ -am__EXEEXT_1 = test_oid$(EXEEXT) test_names$(EXEEXT) test_cfx$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) dist_gsstool_OBJECTS = gsstool.$(OBJEXT) nodist_gsstool_OBJECTS = gss-commands.$(OBJEXT) gsstool_OBJECTS = $(dist_gsstool_OBJECTS) $(nodist_gsstool_OBJECTS) @@ -239,6 +301,11 @@ test_acquire_cred_LDADD = $(LDADD) test_acquire_cred_DEPENDENCIES = libgssapi.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) +am_test_add_store_cred_OBJECTS = test_add_store_cred.$(OBJEXT) +test_add_store_cred_OBJECTS = $(am_test_add_store_cred_OBJECTS) +test_add_store_cred_LDADD = $(LDADD) +test_add_store_cred_DEPENDENCIES = libgssapi.la \ + $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) am_test_cfx_OBJECTS = krb5/test_cfx.$(OBJEXT) test_cfx_OBJECTS = $(am_test_cfx_OBJECTS) test_cfx_LDADD = $(LDADD) @@ -275,41 +342,411 @@ test_oid_LDADD = $(LDADD) test_oid_DEPENDENCIES = libgssapi.la \ $(top_builddir)/lib/krb5/libkrb5.la $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/asn1_ContextFlags.Plo \ + ./$(DEPDIR)/asn1_GSSAPIContextToken.Plo \ + ./$(DEPDIR)/asn1_MechType.Plo \ + ./$(DEPDIR)/asn1_MechTypeList.Plo \ + ./$(DEPDIR)/asn1_NegHints.Plo \ + ./$(DEPDIR)/asn1_NegTokenInit.Plo \ + ./$(DEPDIR)/asn1_NegTokenInitWin.Plo \ + ./$(DEPDIR)/asn1_NegTokenResp.Plo \ + ./$(DEPDIR)/asn1_NegotiationToken.Plo \ + ./$(DEPDIR)/asn1_NegotiationTokenWin.Plo \ + ./$(DEPDIR)/gkrb5_err.Plo ./$(DEPDIR)/gss-commands.Po \ + ./$(DEPDIR)/gsstool.Po ./$(DEPDIR)/test_acquire_cred.Po \ + ./$(DEPDIR)/test_add_store_cred.Po ./$(DEPDIR)/test_common.Po \ + ./$(DEPDIR)/test_context.Po ./$(DEPDIR)/test_cred.Po \ + ./$(DEPDIR)/test_kcred.Po ./$(DEPDIR)/test_names.Po \ + ./$(DEPDIR)/test_ntlm.Po ./$(DEPDIR)/test_oid.Po \ + krb5/$(DEPDIR)/8003.Plo krb5/$(DEPDIR)/accept_sec_context.Plo \ + krb5/$(DEPDIR)/acquire_cred.Plo krb5/$(DEPDIR)/add_cred.Plo \ + krb5/$(DEPDIR)/address_to_krb5addr.Plo krb5/$(DEPDIR)/aeap.Plo \ + krb5/$(DEPDIR)/arcfour.Plo \ + krb5/$(DEPDIR)/authorize_localname.Plo \ + krb5/$(DEPDIR)/canonicalize_name.Plo \ + krb5/$(DEPDIR)/ccache_name.Plo krb5/$(DEPDIR)/cfx.Plo \ + krb5/$(DEPDIR)/compare_name.Plo krb5/$(DEPDIR)/compat.Plo \ + krb5/$(DEPDIR)/context_time.Plo krb5/$(DEPDIR)/copy_ccache.Plo \ + krb5/$(DEPDIR)/creds.Plo krb5/$(DEPDIR)/decapsulate.Plo \ + krb5/$(DEPDIR)/delete_sec_context.Plo \ + krb5/$(DEPDIR)/display_name.Plo \ + krb5/$(DEPDIR)/display_status.Plo \ + krb5/$(DEPDIR)/duplicate_name.Plo \ + krb5/$(DEPDIR)/encapsulate.Plo krb5/$(DEPDIR)/export_name.Plo \ + krb5/$(DEPDIR)/export_sec_context.Plo \ + krb5/$(DEPDIR)/external.Plo krb5/$(DEPDIR)/get_mic.Plo \ + krb5/$(DEPDIR)/import_name.Plo \ + krb5/$(DEPDIR)/import_sec_context.Plo \ + krb5/$(DEPDIR)/indicate_mechs.Plo krb5/$(DEPDIR)/init.Plo \ + krb5/$(DEPDIR)/init_sec_context.Plo \ + krb5/$(DEPDIR)/inquire_context.Plo \ + krb5/$(DEPDIR)/inquire_cred.Plo \ + krb5/$(DEPDIR)/inquire_cred_by_mech.Plo \ + krb5/$(DEPDIR)/inquire_cred_by_oid.Plo \ + krb5/$(DEPDIR)/inquire_mechs_for_name.Plo \ + krb5/$(DEPDIR)/inquire_names_for_mech.Plo \ + krb5/$(DEPDIR)/inquire_sec_context_by_oid.Plo \ + krb5/$(DEPDIR)/pname_to_uid.Plo krb5/$(DEPDIR)/prf.Plo \ + krb5/$(DEPDIR)/process_context_token.Plo \ + krb5/$(DEPDIR)/release_buffer.Plo \ + krb5/$(DEPDIR)/release_cred.Plo \ + krb5/$(DEPDIR)/release_name.Plo krb5/$(DEPDIR)/sequence.Plo \ + krb5/$(DEPDIR)/set_cred_option.Plo \ + krb5/$(DEPDIR)/set_sec_context_option.Plo \ + krb5/$(DEPDIR)/store_cred.Plo krb5/$(DEPDIR)/test_cfx.Po \ + krb5/$(DEPDIR)/ticket_flags.Plo krb5/$(DEPDIR)/unwrap.Plo \ + krb5/$(DEPDIR)/verify_mic.Plo krb5/$(DEPDIR)/wrap.Plo \ + mech/$(DEPDIR)/context.Plo mech/$(DEPDIR)/doxygen.Plo \ + mech/$(DEPDIR)/gss_accept_sec_context.Plo \ + mech/$(DEPDIR)/gss_acquire_cred.Plo \ + mech/$(DEPDIR)/gss_acquire_cred_ext.Plo \ + mech/$(DEPDIR)/gss_acquire_cred_with_password.Plo \ + mech/$(DEPDIR)/gss_add_cred.Plo \ + mech/$(DEPDIR)/gss_add_cred_with_password.Plo \ + mech/$(DEPDIR)/gss_add_oid_set_member.Plo \ + mech/$(DEPDIR)/gss_aeap.Plo \ + mech/$(DEPDIR)/gss_authorize_localname.Plo \ + mech/$(DEPDIR)/gss_buffer_set.Plo \ + mech/$(DEPDIR)/gss_canonicalize_name.Plo \ + mech/$(DEPDIR)/gss_compare_name.Plo \ + mech/$(DEPDIR)/gss_context_time.Plo \ + mech/$(DEPDIR)/gss_create_empty_oid_set.Plo \ + mech/$(DEPDIR)/gss_cred.Plo \ + mech/$(DEPDIR)/gss_decapsulate_token.Plo \ + mech/$(DEPDIR)/gss_delete_name_attribute.Plo \ + mech/$(DEPDIR)/gss_delete_sec_context.Plo \ + mech/$(DEPDIR)/gss_display_name.Plo \ + mech/$(DEPDIR)/gss_display_name_ext.Plo \ + mech/$(DEPDIR)/gss_display_status.Plo \ + mech/$(DEPDIR)/gss_duplicate_name.Plo \ + mech/$(DEPDIR)/gss_duplicate_oid.Plo \ + mech/$(DEPDIR)/gss_encapsulate_token.Plo \ + mech/$(DEPDIR)/gss_export_name.Plo \ + mech/$(DEPDIR)/gss_export_name_composite.Plo \ + mech/$(DEPDIR)/gss_export_sec_context.Plo \ + mech/$(DEPDIR)/gss_get_mic.Plo \ + mech/$(DEPDIR)/gss_get_name_attribute.Plo \ + mech/$(DEPDIR)/gss_import_name.Plo \ + mech/$(DEPDIR)/gss_import_sec_context.Plo \ + mech/$(DEPDIR)/gss_indicate_mechs.Plo \ + mech/$(DEPDIR)/gss_init_sec_context.Plo \ + mech/$(DEPDIR)/gss_inquire_context.Plo \ + mech/$(DEPDIR)/gss_inquire_cred.Plo \ + mech/$(DEPDIR)/gss_inquire_cred_by_mech.Plo \ + mech/$(DEPDIR)/gss_inquire_cred_by_oid.Plo \ + mech/$(DEPDIR)/gss_inquire_mechs_for_name.Plo \ + mech/$(DEPDIR)/gss_inquire_name.Plo \ + mech/$(DEPDIR)/gss_inquire_names_for_mech.Plo \ + mech/$(DEPDIR)/gss_inquire_sec_context_by_oid.Plo \ + mech/$(DEPDIR)/gss_krb5.Plo mech/$(DEPDIR)/gss_mech_switch.Plo \ + mech/$(DEPDIR)/gss_mo.Plo mech/$(DEPDIR)/gss_names.Plo \ + mech/$(DEPDIR)/gss_oid.Plo mech/$(DEPDIR)/gss_oid_equal.Plo \ + mech/$(DEPDIR)/gss_oid_to_str.Plo \ + mech/$(DEPDIR)/gss_pname_to_uid.Plo \ + mech/$(DEPDIR)/gss_process_context_token.Plo \ + mech/$(DEPDIR)/gss_pseudo_random.Plo \ + mech/$(DEPDIR)/gss_release_buffer.Plo \ + mech/$(DEPDIR)/gss_release_cred.Plo \ + mech/$(DEPDIR)/gss_release_name.Plo \ + mech/$(DEPDIR)/gss_release_oid.Plo \ + mech/$(DEPDIR)/gss_release_oid_set.Plo \ + mech/$(DEPDIR)/gss_seal.Plo \ + mech/$(DEPDIR)/gss_set_cred_option.Plo \ + mech/$(DEPDIR)/gss_set_name_attribute.Plo \ + mech/$(DEPDIR)/gss_set_sec_context_option.Plo \ + mech/$(DEPDIR)/gss_sign.Plo mech/$(DEPDIR)/gss_store_cred.Plo \ + mech/$(DEPDIR)/gss_test_oid_set_member.Plo \ + mech/$(DEPDIR)/gss_unseal.Plo mech/$(DEPDIR)/gss_unwrap.Plo \ + mech/$(DEPDIR)/gss_utils.Plo mech/$(DEPDIR)/gss_verify.Plo \ + mech/$(DEPDIR)/gss_verify_mic.Plo mech/$(DEPDIR)/gss_wrap.Plo \ + mech/$(DEPDIR)/gss_wrap_size_limit.Plo \ + ntlm/$(DEPDIR)/accept_sec_context.Plo \ + ntlm/$(DEPDIR)/acquire_cred.Plo ntlm/$(DEPDIR)/add_cred.Plo \ + ntlm/$(DEPDIR)/canonicalize_name.Plo \ + ntlm/$(DEPDIR)/compare_name.Plo \ + ntlm/$(DEPDIR)/context_time.Plo ntlm/$(DEPDIR)/creds.Plo \ + ntlm/$(DEPDIR)/crypto.Plo \ + ntlm/$(DEPDIR)/delete_sec_context.Plo \ + ntlm/$(DEPDIR)/display_name.Plo \ + ntlm/$(DEPDIR)/display_status.Plo \ + ntlm/$(DEPDIR)/duplicate_name.Plo \ + ntlm/$(DEPDIR)/export_name.Plo \ + ntlm/$(DEPDIR)/export_sec_context.Plo \ + ntlm/$(DEPDIR)/external.Plo ntlm/$(DEPDIR)/import_name.Plo \ + ntlm/$(DEPDIR)/import_sec_context.Plo \ + ntlm/$(DEPDIR)/indicate_mechs.Plo \ + ntlm/$(DEPDIR)/init_sec_context.Plo \ + ntlm/$(DEPDIR)/inquire_context.Plo \ + ntlm/$(DEPDIR)/inquire_cred_by_mech.Plo \ + ntlm/$(DEPDIR)/inquire_mechs_for_name.Plo \ + ntlm/$(DEPDIR)/inquire_names_for_mech.Plo \ + ntlm/$(DEPDIR)/inquire_sec_context_by_oid.Plo \ + ntlm/$(DEPDIR)/iter_cred.Plo ntlm/$(DEPDIR)/kdc.Plo \ + ntlm/$(DEPDIR)/process_context_token.Plo \ + ntlm/$(DEPDIR)/release_cred.Plo \ + ntlm/$(DEPDIR)/release_name.Plo \ + spnego/$(DEPDIR)/accept_sec_context.Plo \ + spnego/$(DEPDIR)/compat.Plo spnego/$(DEPDIR)/context_stubs.Plo \ + spnego/$(DEPDIR)/cred_stubs.Plo spnego/$(DEPDIR)/external.Plo \ + spnego/$(DEPDIR)/init_sec_context.Plo 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(dist_libgssapi_la_SOURCES) $(nodist_libgssapi_la_SOURCES) \ $(dist_gsstool_SOURCES) $(nodist_gsstool_SOURCES) \ - $(test_acquire_cred_SOURCES) $(test_cfx_SOURCES) \ - $(test_context_SOURCES) test_cred.c test_kcred.c test_names.c \ - $(test_ntlm_SOURCES) test_oid.c + $(test_acquire_cred_SOURCES) $(test_add_store_cred_SOURCES) \ + $(test_cfx_SOURCES) $(test_context_SOURCES) test_cred.c \ + test_kcred.c test_names.c $(test_ntlm_SOURCES) test_oid.c DIST_SOURCES = $(dist_libgssapi_la_SOURCES) $(dist_gsstool_SOURCES) \ - $(test_acquire_cred_SOURCES) $(test_cfx_SOURCES) \ - $(test_context_SOURCES) test_cred.c test_kcred.c test_names.c \ - $(test_ntlm_SOURCES) test_oid.c + $(test_acquire_cred_SOURCES) $(test_add_store_cred_SOURCES) \ + $(test_cfx_SOURCES) $(test_context_SOURCES) test_cred.c \ + test_kcred.c test_names.c $(test_ntlm_SOURCES) test_oid.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac man3dir = $(mandir)/man3 man5dir = $(mandir)/man5 MANS = $(man_MANS) HEADERS = $(include_HEADERS) $(nobase_include_HEADERS) \ $(nodist_gssapi_HEADERS) $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -324,16 +761,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -343,17 +783,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -372,12 +814,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -386,6 +825,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -402,10 +842,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -413,6 +851,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -427,12 +866,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -449,10 +891,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -463,13 +911,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -493,6 +935,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -516,9 +960,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -528,32 +977,39 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) -I$(srcdir)/../krb5 -I$(srcdir) \ -I$(srcdir)/gssapi -I$(srcdir)/mech -I$(srcdir)/ntlm \ - -I$(srcdir)/krb5 -I$(srcdir)/spnego $(INCLUDE_libintl) \ - $(INCLUDE_hcrypto) $(INCLUDE_krb4) + -I$(srcdir)/krb5 -I$(srcdir)/spnego $(INCLUDE_libintl) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; AUTOMAKE_OPTIONS = subdir-objects lib_LTLIBRARIES = libgssapi.la krb5src = \ @@ -584,7 +1040,7 @@ krb5/external.c \ krb5/get_mic.c \ krb5/gsskrb5_locl.h \ - krb5/gsskrb5-private.h \ + $(srcdir)/krb5/gsskrb5-private.h \ krb5/import_name.c \ krb5/import_sec_context.c \ krb5/indicate_mechs.c \ @@ -703,7 +1159,7 @@ spnego/external.c \ spnego/init_sec_context.c \ spnego/spnego_locl.h \ - spnego/spnego-private.h + $(srcdir)/spnego/spnego-private.h ntlmsrc = \ ntlm/accept_sec_context.c \ @@ -722,7 +1178,6 @@ ntlm/export_sec_context.c \ ntlm/external.c \ ntlm/ntlm.h \ - ntlm/ntlm-private.h \ ntlm/import_name.c \ ntlm/import_sec_context.c \ ntlm/indicate_mechs.c \ @@ -763,9 +1218,9 @@ include_HEADERS = gssapi.h noinst_HEADERS = \ gssapi_mech.h \ - ntlm/ntlm-private.h \ - spnego/spnego-private.h \ - krb5/gsskrb5-private.h + $(srcdir)/ntlm/ntlm-private.h \ + $(srcdir)/spnego/spnego-private.h \ + $(srcdir)/krb5/gsskrb5-private.h nobase_include_HEADERS = \ gssapi/gssapi.h \ @@ -796,8 +1251,8 @@ BUILT_SOURCES = $(spnego_files:.x=.c) $(gssapi_files:.x=.c) CLEANFILES = $(BUILT_SOURCES) \ gkrb5_err.h gkrb5_err.c \ - $(spnego_files) spnego_asn1*.h* spnego_asn1_files spnego_asn1-template.c \ - $(gssapi_files) gssapi_asn1*.h* gssapi_asn1_files gssapi_asn1-template.c \ + $(spnego_files) spnego_asn1*.h* spnego_asn1_files spnego_asn1-template.[cx] \ + $(gssapi_files) gssapi_asn1*.h* gssapi_asn1_files gssapi_asn1-template.[cx] \ gss-commands.h gss-commands.c # test_sequence @@ -805,6 +1260,7 @@ test_context_SOURCES = test_context.c test_common.c test_common.h test_ntlm_SOURCES = test_ntlm.c test_common.c test_common.h test_acquire_cred_SOURCES = test_acquire_cred.c test_common.c test_common.h +test_add_store_cred_SOURCES = test_add_store_cred.c test_ntlm_LDADD = \ $(top_builddir)/lib/ntlm/libheimntlm.la \ $(LDADD) @@ -828,6 +1284,13 @@ libgssapi-version.rc \ libgssapi-exports.def \ $(man_MANS) \ + gen-oid.pl \ + gssapi/gssapi_netlogon.h \ + krb5/test_acquire_cred.c \ + krb5/test_cred.c \ + krb5/test_kcred.c \ + krb5/test_oid.c \ + oid.txt \ krb5/gkrb5_err.et \ mech/gssapi.asn1 \ spnego/spnego.asn1 \ @@ -839,7 +1302,7 @@ $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -852,15 +1315,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/gssapi/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/gssapi/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -870,9 +1333,76 @@ $(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 + +clean-checkPROGRAMS: + @list='$(check_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 + +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 + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -880,6 +1410,8 @@ 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)"; \ } @@ -895,12 +1427,14 @@ clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done + @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}; \ + } krb5/$(am__dirstamp): @$(MKDIR_P) krb5 @: > krb5/$(am__dirstamp) @@ -1211,629 +1745,278 @@ spnego/$(DEPDIR)/$(am__dirstamp) spnego/init_sec_context.lo: spnego/$(am__dirstamp) \ spnego/$(DEPDIR)/$(am__dirstamp) -libgssapi.la: $(libgssapi_la_OBJECTS) $(libgssapi_la_DEPENDENCIES) - $(libgssapi_la_LINK) -rpath $(libdir) $(libgssapi_la_OBJECTS) $(libgssapi_la_LIBADD) $(LIBS) -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" - @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ - 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 -clean-checkPROGRAMS: - @list='$(check_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 +libgssapi.la: $(libgssapi_la_OBJECTS) $(libgssapi_la_DEPENDENCIES) $(EXTRA_libgssapi_la_DEPENDENCIES) + $(AM_V_CCLD)$(libgssapi_la_LINK) -rpath $(libdir) $(libgssapi_la_OBJECTS) $(libgssapi_la_LIBADD) $(LIBS) -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 -gsstool$(EXEEXT): $(gsstool_OBJECTS) $(gsstool_DEPENDENCIES) +gsstool$(EXEEXT): $(gsstool_OBJECTS) $(gsstool_DEPENDENCIES) $(EXTRA_gsstool_DEPENDENCIES) @rm -f gsstool$(EXEEXT) - $(LINK) $(gsstool_OBJECTS) $(gsstool_LDADD) $(LIBS) -test_acquire_cred$(EXEEXT): $(test_acquire_cred_OBJECTS) $(test_acquire_cred_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(gsstool_OBJECTS) $(gsstool_LDADD) $(LIBS) + +test_acquire_cred$(EXEEXT): $(test_acquire_cred_OBJECTS) $(test_acquire_cred_DEPENDENCIES) $(EXTRA_test_acquire_cred_DEPENDENCIES) @rm -f test_acquire_cred$(EXEEXT) - $(LINK) $(test_acquire_cred_OBJECTS) $(test_acquire_cred_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_acquire_cred_OBJECTS) $(test_acquire_cred_LDADD) $(LIBS) + +test_add_store_cred$(EXEEXT): $(test_add_store_cred_OBJECTS) $(test_add_store_cred_DEPENDENCIES) $(EXTRA_test_add_store_cred_DEPENDENCIES) + @rm -f test_add_store_cred$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_add_store_cred_OBJECTS) $(test_add_store_cred_LDADD) $(LIBS) krb5/test_cfx.$(OBJEXT): krb5/$(am__dirstamp) \ krb5/$(DEPDIR)/$(am__dirstamp) -test_cfx$(EXEEXT): $(test_cfx_OBJECTS) $(test_cfx_DEPENDENCIES) + +test_cfx$(EXEEXT): $(test_cfx_OBJECTS) $(test_cfx_DEPENDENCIES) $(EXTRA_test_cfx_DEPENDENCIES) @rm -f test_cfx$(EXEEXT) - $(LINK) $(test_cfx_OBJECTS) $(test_cfx_LDADD) $(LIBS) -test_context$(EXEEXT): $(test_context_OBJECTS) $(test_context_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_cfx_OBJECTS) $(test_cfx_LDADD) $(LIBS) + +test_context$(EXEEXT): $(test_context_OBJECTS) $(test_context_DEPENDENCIES) $(EXTRA_test_context_DEPENDENCIES) @rm -f test_context$(EXEEXT) - $(LINK) $(test_context_OBJECTS) $(test_context_LDADD) $(LIBS) -test_cred$(EXEEXT): $(test_cred_OBJECTS) $(test_cred_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_context_OBJECTS) $(test_context_LDADD) $(LIBS) + +test_cred$(EXEEXT): $(test_cred_OBJECTS) $(test_cred_DEPENDENCIES) $(EXTRA_test_cred_DEPENDENCIES) @rm -f test_cred$(EXEEXT) - $(LINK) $(test_cred_OBJECTS) $(test_cred_LDADD) $(LIBS) -test_kcred$(EXEEXT): $(test_kcred_OBJECTS) $(test_kcred_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_cred_OBJECTS) $(test_cred_LDADD) $(LIBS) + +test_kcred$(EXEEXT): $(test_kcred_OBJECTS) $(test_kcred_DEPENDENCIES) $(EXTRA_test_kcred_DEPENDENCIES) @rm -f test_kcred$(EXEEXT) - $(LINK) $(test_kcred_OBJECTS) $(test_kcred_LDADD) $(LIBS) -test_names$(EXEEXT): $(test_names_OBJECTS) $(test_names_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_kcred_OBJECTS) $(test_kcred_LDADD) $(LIBS) + +test_names$(EXEEXT): $(test_names_OBJECTS) $(test_names_DEPENDENCIES) $(EXTRA_test_names_DEPENDENCIES) @rm -f test_names$(EXEEXT) - $(LINK) $(test_names_OBJECTS) $(test_names_LDADD) $(LIBS) -test_ntlm$(EXEEXT): $(test_ntlm_OBJECTS) $(test_ntlm_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_names_OBJECTS) $(test_names_LDADD) $(LIBS) + +test_ntlm$(EXEEXT): $(test_ntlm_OBJECTS) $(test_ntlm_DEPENDENCIES) $(EXTRA_test_ntlm_DEPENDENCIES) @rm -f test_ntlm$(EXEEXT) - $(LINK) $(test_ntlm_OBJECTS) $(test_ntlm_LDADD) $(LIBS) -test_oid$(EXEEXT): $(test_oid_OBJECTS) $(test_oid_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_ntlm_OBJECTS) $(test_ntlm_LDADD) $(LIBS) + +test_oid$(EXEEXT): $(test_oid_OBJECTS) $(test_oid_DEPENDENCIES) $(EXTRA_test_oid_DEPENDENCIES) @rm -f test_oid$(EXEEXT) - $(LINK) $(test_oid_OBJECTS) $(test_oid_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_oid_OBJECTS) $(test_oid_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) - -rm -f krb5/8003.$(OBJEXT) - -rm -f krb5/8003.lo - -rm -f krb5/accept_sec_context.$(OBJEXT) - -rm -f krb5/accept_sec_context.lo - -rm -f krb5/acquire_cred.$(OBJEXT) - -rm -f krb5/acquire_cred.lo - -rm -f krb5/add_cred.$(OBJEXT) - -rm -f krb5/add_cred.lo - -rm -f krb5/address_to_krb5addr.$(OBJEXT) - -rm -f krb5/address_to_krb5addr.lo - -rm -f krb5/aeap.$(OBJEXT) - -rm -f krb5/aeap.lo - -rm -f krb5/arcfour.$(OBJEXT) - -rm -f krb5/arcfour.lo - -rm -f krb5/authorize_localname.$(OBJEXT) - -rm -f krb5/authorize_localname.lo - -rm -f krb5/canonicalize_name.$(OBJEXT) - -rm -f krb5/canonicalize_name.lo - -rm -f krb5/ccache_name.$(OBJEXT) - -rm -f krb5/ccache_name.lo - -rm -f krb5/cfx.$(OBJEXT) - -rm -f krb5/cfx.lo - -rm -f krb5/compare_name.$(OBJEXT) - -rm -f krb5/compare_name.lo - -rm -f krb5/compat.$(OBJEXT) - -rm -f krb5/compat.lo - -rm -f krb5/context_time.$(OBJEXT) - -rm -f krb5/context_time.lo - -rm -f krb5/copy_ccache.$(OBJEXT) - -rm -f krb5/copy_ccache.lo - -rm -f krb5/creds.$(OBJEXT) - -rm -f krb5/creds.lo - -rm -f krb5/decapsulate.$(OBJEXT) - -rm -f krb5/decapsulate.lo - -rm -f krb5/delete_sec_context.$(OBJEXT) - -rm -f krb5/delete_sec_context.lo - -rm -f krb5/display_name.$(OBJEXT) - -rm -f krb5/display_name.lo - -rm -f krb5/display_status.$(OBJEXT) - -rm -f krb5/display_status.lo - -rm -f krb5/duplicate_name.$(OBJEXT) - -rm -f krb5/duplicate_name.lo - -rm -f krb5/encapsulate.$(OBJEXT) - -rm -f krb5/encapsulate.lo - -rm -f krb5/export_name.$(OBJEXT) - -rm -f krb5/export_name.lo - -rm -f krb5/export_sec_context.$(OBJEXT) - -rm -f krb5/export_sec_context.lo - -rm -f krb5/external.$(OBJEXT) - -rm -f krb5/external.lo - -rm -f krb5/get_mic.$(OBJEXT) - -rm -f krb5/get_mic.lo - -rm -f krb5/import_name.$(OBJEXT) - -rm -f krb5/import_name.lo - -rm -f krb5/import_sec_context.$(OBJEXT) - -rm -f krb5/import_sec_context.lo - -rm -f krb5/indicate_mechs.$(OBJEXT) - -rm -f krb5/indicate_mechs.lo - -rm -f krb5/init.$(OBJEXT) - -rm -f krb5/init.lo - -rm -f krb5/init_sec_context.$(OBJEXT) - -rm -f krb5/init_sec_context.lo - -rm -f krb5/inquire_context.$(OBJEXT) - -rm -f krb5/inquire_context.lo - -rm -f krb5/inquire_cred.$(OBJEXT) - -rm -f krb5/inquire_cred.lo - -rm -f krb5/inquire_cred_by_mech.$(OBJEXT) - -rm -f krb5/inquire_cred_by_mech.lo - -rm -f krb5/inquire_cred_by_oid.$(OBJEXT) - -rm -f krb5/inquire_cred_by_oid.lo - -rm -f krb5/inquire_mechs_for_name.$(OBJEXT) - -rm -f krb5/inquire_mechs_for_name.lo - -rm -f krb5/inquire_names_for_mech.$(OBJEXT) - -rm -f krb5/inquire_names_for_mech.lo - -rm -f krb5/inquire_sec_context_by_oid.$(OBJEXT) - -rm -f krb5/inquire_sec_context_by_oid.lo - -rm -f krb5/pname_to_uid.$(OBJEXT) - -rm -f krb5/pname_to_uid.lo - -rm -f krb5/prf.$(OBJEXT) - -rm -f krb5/prf.lo - -rm -f krb5/process_context_token.$(OBJEXT) - -rm -f krb5/process_context_token.lo - -rm -f krb5/release_buffer.$(OBJEXT) - -rm -f krb5/release_buffer.lo - -rm -f krb5/release_cred.$(OBJEXT) - -rm -f krb5/release_cred.lo - -rm -f krb5/release_name.$(OBJEXT) - -rm -f krb5/release_name.lo - -rm -f krb5/sequence.$(OBJEXT) - -rm -f krb5/sequence.lo - -rm -f krb5/set_cred_option.$(OBJEXT) - -rm -f krb5/set_cred_option.lo - -rm -f krb5/set_sec_context_option.$(OBJEXT) - -rm -f krb5/set_sec_context_option.lo - -rm -f krb5/store_cred.$(OBJEXT) - -rm -f krb5/store_cred.lo - -rm -f krb5/test_cfx.$(OBJEXT) - -rm -f krb5/ticket_flags.$(OBJEXT) - -rm -f krb5/ticket_flags.lo - -rm -f krb5/unwrap.$(OBJEXT) - -rm -f krb5/unwrap.lo - -rm -f krb5/verify_mic.$(OBJEXT) - -rm -f krb5/verify_mic.lo - -rm -f krb5/wrap.$(OBJEXT) - -rm -f krb5/wrap.lo - -rm -f mech/context.$(OBJEXT) - -rm -f mech/context.lo - -rm -f mech/doxygen.$(OBJEXT) - -rm -f mech/doxygen.lo - -rm -f mech/gss_accept_sec_context.$(OBJEXT) - -rm -f mech/gss_accept_sec_context.lo - -rm -f mech/gss_acquire_cred.$(OBJEXT) - -rm -f mech/gss_acquire_cred.lo - -rm -f mech/gss_acquire_cred_ext.$(OBJEXT) - -rm -f mech/gss_acquire_cred_ext.lo - -rm -f mech/gss_acquire_cred_with_password.$(OBJEXT) - -rm -f mech/gss_acquire_cred_with_password.lo - -rm -f mech/gss_add_cred.$(OBJEXT) - -rm -f mech/gss_add_cred.lo - -rm -f mech/gss_add_cred_with_password.$(OBJEXT) - -rm -f mech/gss_add_cred_with_password.lo - -rm -f mech/gss_add_oid_set_member.$(OBJEXT) - -rm -f mech/gss_add_oid_set_member.lo - -rm -f mech/gss_aeap.$(OBJEXT) - -rm -f mech/gss_aeap.lo - -rm -f mech/gss_authorize_localname.$(OBJEXT) - -rm -f mech/gss_authorize_localname.lo - -rm -f mech/gss_buffer_set.$(OBJEXT) - -rm -f mech/gss_buffer_set.lo - -rm -f mech/gss_canonicalize_name.$(OBJEXT) - -rm -f mech/gss_canonicalize_name.lo - -rm -f mech/gss_compare_name.$(OBJEXT) - -rm -f mech/gss_compare_name.lo - -rm -f mech/gss_context_time.$(OBJEXT) - -rm -f mech/gss_context_time.lo - -rm -f mech/gss_create_empty_oid_set.$(OBJEXT) - -rm -f mech/gss_create_empty_oid_set.lo - -rm -f mech/gss_cred.$(OBJEXT) - -rm -f mech/gss_cred.lo - -rm -f mech/gss_decapsulate_token.$(OBJEXT) - -rm -f mech/gss_decapsulate_token.lo - -rm -f mech/gss_delete_name_attribute.$(OBJEXT) - -rm -f mech/gss_delete_name_attribute.lo - -rm -f mech/gss_delete_sec_context.$(OBJEXT) - -rm -f mech/gss_delete_sec_context.lo - -rm -f mech/gss_display_name.$(OBJEXT) - -rm -f mech/gss_display_name.lo - -rm -f mech/gss_display_name_ext.$(OBJEXT) - -rm -f mech/gss_display_name_ext.lo - -rm -f mech/gss_display_status.$(OBJEXT) - -rm -f mech/gss_display_status.lo - -rm -f mech/gss_duplicate_name.$(OBJEXT) - -rm -f mech/gss_duplicate_name.lo - -rm -f mech/gss_duplicate_oid.$(OBJEXT) - -rm -f mech/gss_duplicate_oid.lo - -rm -f mech/gss_encapsulate_token.$(OBJEXT) - -rm -f mech/gss_encapsulate_token.lo - -rm -f mech/gss_export_name.$(OBJEXT) - -rm -f mech/gss_export_name.lo - -rm -f mech/gss_export_name_composite.$(OBJEXT) - -rm -f mech/gss_export_name_composite.lo - -rm -f mech/gss_export_sec_context.$(OBJEXT) - -rm -f mech/gss_export_sec_context.lo - -rm -f mech/gss_get_mic.$(OBJEXT) - -rm -f mech/gss_get_mic.lo - -rm -f mech/gss_get_name_attribute.$(OBJEXT) - -rm -f mech/gss_get_name_attribute.lo - -rm -f mech/gss_import_name.$(OBJEXT) - -rm -f mech/gss_import_name.lo - -rm -f mech/gss_import_sec_context.$(OBJEXT) - -rm -f mech/gss_import_sec_context.lo - -rm -f mech/gss_indicate_mechs.$(OBJEXT) - -rm -f mech/gss_indicate_mechs.lo - -rm -f mech/gss_init_sec_context.$(OBJEXT) - -rm -f mech/gss_init_sec_context.lo - -rm -f mech/gss_inquire_context.$(OBJEXT) - -rm -f mech/gss_inquire_context.lo - -rm -f mech/gss_inquire_cred.$(OBJEXT) - -rm -f mech/gss_inquire_cred.lo - -rm -f mech/gss_inquire_cred_by_mech.$(OBJEXT) - -rm -f mech/gss_inquire_cred_by_mech.lo - -rm -f mech/gss_inquire_cred_by_oid.$(OBJEXT) - -rm -f mech/gss_inquire_cred_by_oid.lo - -rm -f mech/gss_inquire_mechs_for_name.$(OBJEXT) - -rm -f mech/gss_inquire_mechs_for_name.lo - -rm -f mech/gss_inquire_name.$(OBJEXT) - -rm -f mech/gss_inquire_name.lo - -rm -f mech/gss_inquire_names_for_mech.$(OBJEXT) - -rm -f mech/gss_inquire_names_for_mech.lo - -rm -f mech/gss_inquire_sec_context_by_oid.$(OBJEXT) - -rm -f mech/gss_inquire_sec_context_by_oid.lo - -rm -f mech/gss_krb5.$(OBJEXT) - -rm -f mech/gss_krb5.lo - -rm -f mech/gss_mech_switch.$(OBJEXT) - -rm -f mech/gss_mech_switch.lo - -rm -f mech/gss_mo.$(OBJEXT) - -rm -f mech/gss_mo.lo - -rm -f mech/gss_names.$(OBJEXT) - -rm -f mech/gss_names.lo - -rm -f mech/gss_oid.$(OBJEXT) - -rm -f mech/gss_oid.lo - -rm -f mech/gss_oid_equal.$(OBJEXT) - -rm -f mech/gss_oid_equal.lo - -rm -f mech/gss_oid_to_str.$(OBJEXT) - -rm -f mech/gss_oid_to_str.lo - -rm -f mech/gss_pname_to_uid.$(OBJEXT) - -rm -f mech/gss_pname_to_uid.lo - -rm -f mech/gss_process_context_token.$(OBJEXT) - -rm -f mech/gss_process_context_token.lo - -rm -f mech/gss_pseudo_random.$(OBJEXT) - -rm -f mech/gss_pseudo_random.lo - -rm -f mech/gss_release_buffer.$(OBJEXT) - -rm -f mech/gss_release_buffer.lo - -rm -f mech/gss_release_cred.$(OBJEXT) - -rm -f mech/gss_release_cred.lo - -rm -f mech/gss_release_name.$(OBJEXT) - -rm -f mech/gss_release_name.lo - -rm -f mech/gss_release_oid.$(OBJEXT) - -rm -f mech/gss_release_oid.lo - -rm -f mech/gss_release_oid_set.$(OBJEXT) - -rm -f mech/gss_release_oid_set.lo - -rm -f mech/gss_seal.$(OBJEXT) - -rm -f mech/gss_seal.lo - -rm -f mech/gss_set_cred_option.$(OBJEXT) - -rm -f mech/gss_set_cred_option.lo - -rm -f mech/gss_set_name_attribute.$(OBJEXT) - -rm -f mech/gss_set_name_attribute.lo - -rm -f mech/gss_set_sec_context_option.$(OBJEXT) - -rm -f mech/gss_set_sec_context_option.lo - -rm -f mech/gss_sign.$(OBJEXT) - -rm -f mech/gss_sign.lo - -rm -f mech/gss_store_cred.$(OBJEXT) - -rm -f mech/gss_store_cred.lo - -rm -f mech/gss_test_oid_set_member.$(OBJEXT) - -rm -f mech/gss_test_oid_set_member.lo - -rm -f mech/gss_unseal.$(OBJEXT) - -rm -f mech/gss_unseal.lo - -rm -f mech/gss_unwrap.$(OBJEXT) - -rm -f mech/gss_unwrap.lo - -rm -f mech/gss_utils.$(OBJEXT) - -rm -f mech/gss_utils.lo - -rm -f mech/gss_verify.$(OBJEXT) - -rm -f mech/gss_verify.lo - -rm -f mech/gss_verify_mic.$(OBJEXT) - -rm -f mech/gss_verify_mic.lo - -rm -f mech/gss_wrap.$(OBJEXT) - -rm -f mech/gss_wrap.lo - -rm -f mech/gss_wrap_size_limit.$(OBJEXT) - -rm -f mech/gss_wrap_size_limit.lo - -rm -f ntlm/accept_sec_context.$(OBJEXT) - -rm -f ntlm/accept_sec_context.lo - -rm -f ntlm/acquire_cred.$(OBJEXT) - -rm -f ntlm/acquire_cred.lo - -rm -f ntlm/add_cred.$(OBJEXT) - -rm -f ntlm/add_cred.lo - -rm -f ntlm/canonicalize_name.$(OBJEXT) - -rm -f ntlm/canonicalize_name.lo - -rm -f ntlm/compare_name.$(OBJEXT) - -rm -f ntlm/compare_name.lo - -rm -f ntlm/context_time.$(OBJEXT) - -rm -f ntlm/context_time.lo - -rm -f ntlm/creds.$(OBJEXT) - -rm -f ntlm/creds.lo - -rm -f ntlm/crypto.$(OBJEXT) - -rm -f ntlm/crypto.lo - -rm -f ntlm/delete_sec_context.$(OBJEXT) - -rm -f ntlm/delete_sec_context.lo - -rm -f ntlm/display_name.$(OBJEXT) - -rm -f ntlm/display_name.lo - -rm -f ntlm/display_status.$(OBJEXT) - -rm -f ntlm/display_status.lo - -rm -f ntlm/duplicate_name.$(OBJEXT) - -rm -f ntlm/duplicate_name.lo - -rm -f ntlm/export_name.$(OBJEXT) - -rm -f ntlm/export_name.lo - -rm -f ntlm/export_sec_context.$(OBJEXT) - -rm -f ntlm/export_sec_context.lo - -rm -f ntlm/external.$(OBJEXT) - -rm -f ntlm/external.lo - -rm -f ntlm/import_name.$(OBJEXT) - -rm -f ntlm/import_name.lo - -rm -f ntlm/import_sec_context.$(OBJEXT) - -rm -f ntlm/import_sec_context.lo - -rm -f ntlm/indicate_mechs.$(OBJEXT) - -rm -f ntlm/indicate_mechs.lo - -rm -f ntlm/init_sec_context.$(OBJEXT) - -rm -f ntlm/init_sec_context.lo - -rm -f ntlm/inquire_context.$(OBJEXT) - -rm -f ntlm/inquire_context.lo - -rm -f ntlm/inquire_cred_by_mech.$(OBJEXT) - -rm -f ntlm/inquire_cred_by_mech.lo - -rm -f ntlm/inquire_mechs_for_name.$(OBJEXT) - -rm -f ntlm/inquire_mechs_for_name.lo - -rm -f ntlm/inquire_names_for_mech.$(OBJEXT) - -rm -f ntlm/inquire_names_for_mech.lo - -rm -f ntlm/inquire_sec_context_by_oid.$(OBJEXT) - -rm -f ntlm/inquire_sec_context_by_oid.lo - -rm -f ntlm/iter_cred.$(OBJEXT) - -rm -f ntlm/iter_cred.lo - -rm -f ntlm/kdc.$(OBJEXT) - -rm -f ntlm/kdc.lo - -rm -f ntlm/process_context_token.$(OBJEXT) - -rm -f ntlm/process_context_token.lo - -rm -f ntlm/release_cred.$(OBJEXT) - -rm -f ntlm/release_cred.lo - -rm -f ntlm/release_name.$(OBJEXT) - -rm -f ntlm/release_name.lo - -rm -f spnego/accept_sec_context.$(OBJEXT) - -rm -f spnego/accept_sec_context.lo - -rm -f spnego/compat.$(OBJEXT) - -rm -f spnego/compat.lo - -rm -f spnego/context_stubs.$(OBJEXT) - -rm -f spnego/context_stubs.lo - -rm -f spnego/cred_stubs.$(OBJEXT) - -rm -f spnego/cred_stubs.lo - -rm -f spnego/external.$(OBJEXT) - -rm -f spnego/external.lo - -rm -f spnego/init_sec_context.$(OBJEXT) - -rm -f spnego/init_sec_context.lo + -rm -f krb5/*.$(OBJEXT) + -rm -f krb5/*.lo + -rm -f mech/*.$(OBJEXT) + -rm -f mech/*.lo + -rm -f ntlm/*.$(OBJEXT) + -rm -f ntlm/*.lo + -rm -f spnego/*.$(OBJEXT) + -rm -f spnego/*.lo distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_ContextFlags.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_GSSAPIContextToken.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_MechType.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_MechTypeList.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegHints.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegTokenInit.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegTokenInitWin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegTokenResp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegotiationToken.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegotiationTokenWin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gkrb5_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gss-commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsstool.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acquire_cred.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_context.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cred.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_kcred.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_names.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ntlm.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_oid.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/8003.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/accept_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/acquire_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/add_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/address_to_krb5addr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/aeap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/arcfour.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/authorize_localname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/canonicalize_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/ccache_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/cfx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/compare_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/compat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/context_time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/copy_ccache.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/creds.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/decapsulate.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/delete_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/display_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/display_status.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/duplicate_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/encapsulate.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/export_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/export_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/external.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/get_mic.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/import_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/import_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/indicate_mechs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/init.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/init_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_cred_by_mech.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_cred_by_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_mechs_for_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_names_for_mech.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_sec_context_by_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/pname_to_uid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/prf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/process_context_token.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/release_buffer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/release_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/release_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/sequence.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/set_cred_option.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/set_sec_context_option.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/store_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/test_cfx.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/ticket_flags.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/unwrap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/verify_mic.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/wrap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/doxygen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_accept_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_acquire_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_acquire_cred_ext.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_acquire_cred_with_password.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_add_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_add_cred_with_password.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_add_oid_set_member.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_aeap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_authorize_localname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_buffer_set.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_canonicalize_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_compare_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_context_time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_create_empty_oid_set.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_decapsulate_token.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_delete_name_attribute.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_delete_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_display_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_display_name_ext.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_display_status.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_duplicate_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_duplicate_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_encapsulate_token.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_export_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_export_name_composite.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_export_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_get_mic.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_get_name_attribute.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_import_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_import_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_indicate_mechs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_init_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_cred_by_mech.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_cred_by_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_mechs_for_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_names_for_mech.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_sec_context_by_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_krb5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_mech_switch.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_mo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_names.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_oid_equal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_oid_to_str.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_pname_to_uid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_process_context_token.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_pseudo_random.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_buffer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_oid_set.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_seal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_set_cred_option.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_set_name_attribute.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_set_sec_context_option.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_sign.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_store_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_test_oid_set_member.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_unseal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_unwrap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_utils.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_verify.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_verify_mic.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_wrap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_wrap_size_limit.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/accept_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/acquire_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/add_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/canonicalize_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/compare_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/context_time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/creds.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/crypto.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/delete_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/display_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/display_status.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/duplicate_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/export_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/export_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/external.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/import_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/import_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/indicate_mechs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/init_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_cred_by_mech.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_mechs_for_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_names_for_mech.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_sec_context_by_oid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/iter_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/kdc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/process_context_token.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/release_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/release_name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/accept_sec_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/compat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/context_stubs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/cred_stubs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/external.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/init_sec_context.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_ContextFlags.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_GSSAPIContextToken.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_MechType.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_MechTypeList.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegHints.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegTokenInit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegTokenInitWin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegTokenResp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegotiationToken.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_NegotiationTokenWin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gkrb5_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gss-commands.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gsstool.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acquire_cred.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_add_store_cred.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_context.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cred.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_kcred.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_names.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ntlm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_oid.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/8003.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/accept_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/acquire_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/add_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/address_to_krb5addr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/aeap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/arcfour.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/authorize_localname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/canonicalize_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/ccache_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/cfx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/compare_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/compat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/context_time.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/copy_ccache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/creds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/decapsulate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/delete_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/display_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/display_status.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/duplicate_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/encapsulate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/export_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/export_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/external.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/get_mic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/import_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/import_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/indicate_mechs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/init.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/init_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_cred_by_mech.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_cred_by_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_mechs_for_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_names_for_mech.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/inquire_sec_context_by_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/pname_to_uid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/prf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/process_context_token.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/release_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/release_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/release_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/sequence.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/set_cred_option.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/set_sec_context_option.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/store_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/test_cfx.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/ticket_flags.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/unwrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/verify_mic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@krb5/$(DEPDIR)/wrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/doxygen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_accept_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_acquire_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_acquire_cred_ext.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_acquire_cred_with_password.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_add_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_add_cred_with_password.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_add_oid_set_member.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_aeap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_authorize_localname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_buffer_set.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_canonicalize_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_compare_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_context_time.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_create_empty_oid_set.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_decapsulate_token.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_delete_name_attribute.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_delete_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_display_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_display_name_ext.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_display_status.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_duplicate_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_duplicate_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_encapsulate_token.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_export_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_export_name_composite.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_export_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_get_mic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_get_name_attribute.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_import_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_import_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_indicate_mechs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_init_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_cred_by_mech.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_cred_by_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_mechs_for_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_names_for_mech.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_inquire_sec_context_by_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_krb5.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_mech_switch.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_mo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_names.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_oid_equal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_oid_to_str.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_pname_to_uid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_process_context_token.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_pseudo_random.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_buffer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_release_oid_set.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_seal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_set_cred_option.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_set_name_attribute.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_set_sec_context_option.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_sign.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_store_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_test_oid_set_member.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_unseal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_unwrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_utils.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_verify.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_verify_mic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_wrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@mech/$(DEPDIR)/gss_wrap_size_limit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/accept_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/acquire_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/add_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/canonicalize_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/compare_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/context_time.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/creds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/crypto.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/delete_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/display_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/display_status.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/duplicate_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/export_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/export_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/external.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/import_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/import_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/indicate_mechs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/init_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_cred_by_mech.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_mechs_for_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_names_for_mech.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/inquire_sec_context_by_oid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/iter_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/kdc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/process_context_token.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/release_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@ntlm/$(DEPDIR)/release_name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/accept_sec_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/compat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/context_stubs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/cred_stubs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/external.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@spnego/$(DEPDIR)/init_sec_context.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .c.o: -@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: -@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: -@am__fastdepCC_TRUE@ depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -1846,11 +2029,18 @@ -rm -rf spnego/.libs spnego/_libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" - @list=''; test -n "$(man3dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -1879,16 +2069,21 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) install-man5: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" - @list=''; test -n "$(man5dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man5dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man5dir)" || 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 '/\.5[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -1917,13 +2112,14 @@ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man5dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @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"; \ @@ -1937,20 +2133,21 @@ @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nobase_includeHEADERS: $(nobase_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ + fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ - echo "$(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'"; \ + echo " $(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(includedir)/$$dir"; }; \ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(includedir)/$$dir'"; \ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(includedir)/$$dir" || exit $$?; }; \ @@ -1960,13 +2157,14 @@ @$(NORMAL_UNINSTALL) @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_gssapiHEADERS: $(nodist_gssapi_HEADERS) @$(NORMAL_INSTALL) - test -z "$(gssapidir)" || $(MKDIR_P) "$(DESTDIR)$(gssapidir)" @list='$(nodist_gssapi_HEADERS)'; test -n "$(gssapidir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(gssapidir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(gssapidir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -1980,30 +2178,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_gssapi_HEADERS)'; test -n "$(gssapidir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(gssapidir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(gssapidir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(gssapidir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -2015,15 +2200,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -2032,116 +2213,205 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + color_start= color_end=; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -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 + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test_oid.log: test_oid$(EXEEXT) + @p='test_oid$(EXEEXT)'; \ + b='test_oid'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_names.log: test_names$(EXEEXT) + @p='test_names$(EXEEXT)'; \ + b='test_names'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_cfx.log: test_cfx$(EXEEXT) + @p='test_cfx$(EXEEXT)'; \ + b='test_cfx'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -2179,17 +2449,20 @@ $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS) \ +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(HEADERS) \ all-local install-binPROGRAMS: install-libLTLIBRARIES +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(gssapidir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(gssapidir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -2198,11 +2471,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -2230,7 +2511,188 @@ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) krb5/$(DEPDIR) mech/$(DEPDIR) ntlm/$(DEPDIR) spnego/$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_ContextFlags.Plo + -rm -f ./$(DEPDIR)/asn1_GSSAPIContextToken.Plo + -rm -f ./$(DEPDIR)/asn1_MechType.Plo + -rm -f ./$(DEPDIR)/asn1_MechTypeList.Plo + -rm -f ./$(DEPDIR)/asn1_NegHints.Plo + -rm -f ./$(DEPDIR)/asn1_NegTokenInit.Plo + -rm -f ./$(DEPDIR)/asn1_NegTokenInitWin.Plo + -rm -f ./$(DEPDIR)/asn1_NegTokenResp.Plo + -rm -f ./$(DEPDIR)/asn1_NegotiationToken.Plo + -rm -f ./$(DEPDIR)/asn1_NegotiationTokenWin.Plo + -rm -f ./$(DEPDIR)/gkrb5_err.Plo + -rm -f ./$(DEPDIR)/gss-commands.Po + -rm -f ./$(DEPDIR)/gsstool.Po + -rm -f ./$(DEPDIR)/test_acquire_cred.Po + -rm -f ./$(DEPDIR)/test_add_store_cred.Po + -rm -f ./$(DEPDIR)/test_common.Po + -rm -f ./$(DEPDIR)/test_context.Po + -rm -f ./$(DEPDIR)/test_cred.Po + -rm -f ./$(DEPDIR)/test_kcred.Po + -rm -f ./$(DEPDIR)/test_names.Po + -rm -f ./$(DEPDIR)/test_ntlm.Po + -rm -f ./$(DEPDIR)/test_oid.Po + -rm -f krb5/$(DEPDIR)/8003.Plo + -rm -f krb5/$(DEPDIR)/accept_sec_context.Plo + -rm -f krb5/$(DEPDIR)/acquire_cred.Plo + -rm -f krb5/$(DEPDIR)/add_cred.Plo + -rm -f krb5/$(DEPDIR)/address_to_krb5addr.Plo + -rm -f krb5/$(DEPDIR)/aeap.Plo + -rm -f krb5/$(DEPDIR)/arcfour.Plo + -rm -f krb5/$(DEPDIR)/authorize_localname.Plo + -rm -f krb5/$(DEPDIR)/canonicalize_name.Plo + -rm -f krb5/$(DEPDIR)/ccache_name.Plo + -rm -f krb5/$(DEPDIR)/cfx.Plo + -rm -f krb5/$(DEPDIR)/compare_name.Plo + -rm -f krb5/$(DEPDIR)/compat.Plo + -rm -f krb5/$(DEPDIR)/context_time.Plo + -rm -f krb5/$(DEPDIR)/copy_ccache.Plo + -rm -f krb5/$(DEPDIR)/creds.Plo + -rm -f krb5/$(DEPDIR)/decapsulate.Plo + -rm -f krb5/$(DEPDIR)/delete_sec_context.Plo + -rm -f krb5/$(DEPDIR)/display_name.Plo + -rm -f krb5/$(DEPDIR)/display_status.Plo + -rm -f krb5/$(DEPDIR)/duplicate_name.Plo + -rm -f krb5/$(DEPDIR)/encapsulate.Plo + -rm -f krb5/$(DEPDIR)/export_name.Plo + -rm -f krb5/$(DEPDIR)/export_sec_context.Plo + -rm -f krb5/$(DEPDIR)/external.Plo + -rm -f krb5/$(DEPDIR)/get_mic.Plo + -rm -f krb5/$(DEPDIR)/import_name.Plo + -rm -f krb5/$(DEPDIR)/import_sec_context.Plo + -rm -f krb5/$(DEPDIR)/indicate_mechs.Plo + -rm -f krb5/$(DEPDIR)/init.Plo + -rm -f krb5/$(DEPDIR)/init_sec_context.Plo + -rm -f krb5/$(DEPDIR)/inquire_context.Plo + -rm -f krb5/$(DEPDIR)/inquire_cred.Plo + -rm -f krb5/$(DEPDIR)/inquire_cred_by_mech.Plo + -rm -f krb5/$(DEPDIR)/inquire_cred_by_oid.Plo + -rm -f krb5/$(DEPDIR)/inquire_mechs_for_name.Plo + -rm -f krb5/$(DEPDIR)/inquire_names_for_mech.Plo + -rm -f krb5/$(DEPDIR)/inquire_sec_context_by_oid.Plo + -rm -f krb5/$(DEPDIR)/pname_to_uid.Plo + -rm -f krb5/$(DEPDIR)/prf.Plo + -rm -f krb5/$(DEPDIR)/process_context_token.Plo + -rm -f krb5/$(DEPDIR)/release_buffer.Plo + -rm -f krb5/$(DEPDIR)/release_cred.Plo + -rm -f krb5/$(DEPDIR)/release_name.Plo + -rm -f krb5/$(DEPDIR)/sequence.Plo + -rm -f krb5/$(DEPDIR)/set_cred_option.Plo + -rm -f krb5/$(DEPDIR)/set_sec_context_option.Plo + -rm -f krb5/$(DEPDIR)/store_cred.Plo + -rm -f krb5/$(DEPDIR)/test_cfx.Po + -rm -f krb5/$(DEPDIR)/ticket_flags.Plo + -rm -f krb5/$(DEPDIR)/unwrap.Plo + -rm -f krb5/$(DEPDIR)/verify_mic.Plo + -rm -f krb5/$(DEPDIR)/wrap.Plo + -rm -f mech/$(DEPDIR)/context.Plo + -rm -f mech/$(DEPDIR)/doxygen.Plo + -rm -f mech/$(DEPDIR)/gss_accept_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_acquire_cred.Plo + -rm -f mech/$(DEPDIR)/gss_acquire_cred_ext.Plo + -rm -f mech/$(DEPDIR)/gss_acquire_cred_with_password.Plo + -rm -f mech/$(DEPDIR)/gss_add_cred.Plo + -rm -f mech/$(DEPDIR)/gss_add_cred_with_password.Plo + -rm -f mech/$(DEPDIR)/gss_add_oid_set_member.Plo + -rm -f mech/$(DEPDIR)/gss_aeap.Plo + -rm -f mech/$(DEPDIR)/gss_authorize_localname.Plo + -rm -f mech/$(DEPDIR)/gss_buffer_set.Plo + -rm -f mech/$(DEPDIR)/gss_canonicalize_name.Plo + -rm -f mech/$(DEPDIR)/gss_compare_name.Plo + -rm -f mech/$(DEPDIR)/gss_context_time.Plo + -rm -f mech/$(DEPDIR)/gss_create_empty_oid_set.Plo + -rm -f mech/$(DEPDIR)/gss_cred.Plo + -rm -f mech/$(DEPDIR)/gss_decapsulate_token.Plo + -rm -f mech/$(DEPDIR)/gss_delete_name_attribute.Plo + -rm -f mech/$(DEPDIR)/gss_delete_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_display_name.Plo + -rm -f mech/$(DEPDIR)/gss_display_name_ext.Plo + -rm -f mech/$(DEPDIR)/gss_display_status.Plo + -rm -f mech/$(DEPDIR)/gss_duplicate_name.Plo + -rm -f mech/$(DEPDIR)/gss_duplicate_oid.Plo + -rm -f mech/$(DEPDIR)/gss_encapsulate_token.Plo + -rm -f mech/$(DEPDIR)/gss_export_name.Plo + -rm -f mech/$(DEPDIR)/gss_export_name_composite.Plo + -rm -f mech/$(DEPDIR)/gss_export_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_get_mic.Plo + -rm -f mech/$(DEPDIR)/gss_get_name_attribute.Plo + -rm -f mech/$(DEPDIR)/gss_import_name.Plo + -rm -f mech/$(DEPDIR)/gss_import_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_indicate_mechs.Plo + -rm -f mech/$(DEPDIR)/gss_init_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_context.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_cred.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_cred_by_mech.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_cred_by_oid.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_mechs_for_name.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_name.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_names_for_mech.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_sec_context_by_oid.Plo + -rm -f mech/$(DEPDIR)/gss_krb5.Plo + -rm -f mech/$(DEPDIR)/gss_mech_switch.Plo + -rm -f mech/$(DEPDIR)/gss_mo.Plo + -rm -f mech/$(DEPDIR)/gss_names.Plo + -rm -f mech/$(DEPDIR)/gss_oid.Plo + -rm -f mech/$(DEPDIR)/gss_oid_equal.Plo + -rm -f mech/$(DEPDIR)/gss_oid_to_str.Plo + -rm -f mech/$(DEPDIR)/gss_pname_to_uid.Plo + -rm -f mech/$(DEPDIR)/gss_process_context_token.Plo + -rm -f mech/$(DEPDIR)/gss_pseudo_random.Plo + -rm -f mech/$(DEPDIR)/gss_release_buffer.Plo + -rm -f mech/$(DEPDIR)/gss_release_cred.Plo + -rm -f mech/$(DEPDIR)/gss_release_name.Plo + -rm -f mech/$(DEPDIR)/gss_release_oid.Plo + -rm -f mech/$(DEPDIR)/gss_release_oid_set.Plo + -rm -f mech/$(DEPDIR)/gss_seal.Plo + -rm -f mech/$(DEPDIR)/gss_set_cred_option.Plo + -rm -f mech/$(DEPDIR)/gss_set_name_attribute.Plo + -rm -f mech/$(DEPDIR)/gss_set_sec_context_option.Plo + -rm -f mech/$(DEPDIR)/gss_sign.Plo + -rm -f mech/$(DEPDIR)/gss_store_cred.Plo + -rm -f mech/$(DEPDIR)/gss_test_oid_set_member.Plo + -rm -f mech/$(DEPDIR)/gss_unseal.Plo + -rm -f mech/$(DEPDIR)/gss_unwrap.Plo + -rm -f mech/$(DEPDIR)/gss_utils.Plo + -rm -f mech/$(DEPDIR)/gss_verify.Plo + -rm -f mech/$(DEPDIR)/gss_verify_mic.Plo + -rm -f mech/$(DEPDIR)/gss_wrap.Plo + -rm -f mech/$(DEPDIR)/gss_wrap_size_limit.Plo + -rm -f ntlm/$(DEPDIR)/accept_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/acquire_cred.Plo + -rm -f ntlm/$(DEPDIR)/add_cred.Plo + -rm -f ntlm/$(DEPDIR)/canonicalize_name.Plo + -rm -f ntlm/$(DEPDIR)/compare_name.Plo + -rm -f ntlm/$(DEPDIR)/context_time.Plo + -rm -f ntlm/$(DEPDIR)/creds.Plo + -rm -f ntlm/$(DEPDIR)/crypto.Plo + -rm -f ntlm/$(DEPDIR)/delete_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/display_name.Plo + -rm -f ntlm/$(DEPDIR)/display_status.Plo + -rm -f ntlm/$(DEPDIR)/duplicate_name.Plo + -rm -f ntlm/$(DEPDIR)/export_name.Plo + -rm -f ntlm/$(DEPDIR)/export_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/external.Plo + -rm -f ntlm/$(DEPDIR)/import_name.Plo + -rm -f ntlm/$(DEPDIR)/import_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/indicate_mechs.Plo + -rm -f ntlm/$(DEPDIR)/init_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/inquire_context.Plo + -rm -f ntlm/$(DEPDIR)/inquire_cred_by_mech.Plo + -rm -f ntlm/$(DEPDIR)/inquire_mechs_for_name.Plo + -rm -f ntlm/$(DEPDIR)/inquire_names_for_mech.Plo + -rm -f ntlm/$(DEPDIR)/inquire_sec_context_by_oid.Plo + -rm -f ntlm/$(DEPDIR)/iter_cred.Plo + -rm -f ntlm/$(DEPDIR)/kdc.Plo + -rm -f ntlm/$(DEPDIR)/process_context_token.Plo + -rm -f ntlm/$(DEPDIR)/release_cred.Plo + -rm -f ntlm/$(DEPDIR)/release_name.Plo + -rm -f spnego/$(DEPDIR)/accept_sec_context.Plo + -rm -f spnego/$(DEPDIR)/compat.Plo + -rm -f spnego/$(DEPDIR)/context_stubs.Plo + -rm -f spnego/$(DEPDIR)/cred_stubs.Plo + -rm -f spnego/$(DEPDIR)/external.Plo + -rm -f spnego/$(DEPDIR)/init_sec_context.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -2255,9 +2717,9 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -2279,7 +2741,188 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) krb5/$(DEPDIR) mech/$(DEPDIR) ntlm/$(DEPDIR) spnego/$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_ContextFlags.Plo + -rm -f ./$(DEPDIR)/asn1_GSSAPIContextToken.Plo + -rm -f ./$(DEPDIR)/asn1_MechType.Plo + -rm -f ./$(DEPDIR)/asn1_MechTypeList.Plo + -rm -f ./$(DEPDIR)/asn1_NegHints.Plo + -rm -f ./$(DEPDIR)/asn1_NegTokenInit.Plo + -rm -f ./$(DEPDIR)/asn1_NegTokenInitWin.Plo + -rm -f ./$(DEPDIR)/asn1_NegTokenResp.Plo + -rm -f ./$(DEPDIR)/asn1_NegotiationToken.Plo + -rm -f ./$(DEPDIR)/asn1_NegotiationTokenWin.Plo + -rm -f ./$(DEPDIR)/gkrb5_err.Plo + -rm -f ./$(DEPDIR)/gss-commands.Po + -rm -f ./$(DEPDIR)/gsstool.Po + -rm -f ./$(DEPDIR)/test_acquire_cred.Po + -rm -f ./$(DEPDIR)/test_add_store_cred.Po + -rm -f ./$(DEPDIR)/test_common.Po + -rm -f ./$(DEPDIR)/test_context.Po + -rm -f ./$(DEPDIR)/test_cred.Po + -rm -f ./$(DEPDIR)/test_kcred.Po + -rm -f ./$(DEPDIR)/test_names.Po + -rm -f ./$(DEPDIR)/test_ntlm.Po + -rm -f ./$(DEPDIR)/test_oid.Po + -rm -f krb5/$(DEPDIR)/8003.Plo + -rm -f krb5/$(DEPDIR)/accept_sec_context.Plo + -rm -f krb5/$(DEPDIR)/acquire_cred.Plo + -rm -f krb5/$(DEPDIR)/add_cred.Plo + -rm -f krb5/$(DEPDIR)/address_to_krb5addr.Plo + -rm -f krb5/$(DEPDIR)/aeap.Plo + -rm -f krb5/$(DEPDIR)/arcfour.Plo + -rm -f krb5/$(DEPDIR)/authorize_localname.Plo + -rm -f krb5/$(DEPDIR)/canonicalize_name.Plo + -rm -f krb5/$(DEPDIR)/ccache_name.Plo + -rm -f krb5/$(DEPDIR)/cfx.Plo + -rm -f krb5/$(DEPDIR)/compare_name.Plo + -rm -f krb5/$(DEPDIR)/compat.Plo + -rm -f krb5/$(DEPDIR)/context_time.Plo + -rm -f krb5/$(DEPDIR)/copy_ccache.Plo + -rm -f krb5/$(DEPDIR)/creds.Plo + -rm -f krb5/$(DEPDIR)/decapsulate.Plo + -rm -f krb5/$(DEPDIR)/delete_sec_context.Plo + -rm -f krb5/$(DEPDIR)/display_name.Plo + -rm -f krb5/$(DEPDIR)/display_status.Plo + -rm -f krb5/$(DEPDIR)/duplicate_name.Plo + -rm -f krb5/$(DEPDIR)/encapsulate.Plo + -rm -f krb5/$(DEPDIR)/export_name.Plo + -rm -f krb5/$(DEPDIR)/export_sec_context.Plo + -rm -f krb5/$(DEPDIR)/external.Plo + -rm -f krb5/$(DEPDIR)/get_mic.Plo + -rm -f krb5/$(DEPDIR)/import_name.Plo + -rm -f krb5/$(DEPDIR)/import_sec_context.Plo + -rm -f krb5/$(DEPDIR)/indicate_mechs.Plo + -rm -f krb5/$(DEPDIR)/init.Plo + -rm -f krb5/$(DEPDIR)/init_sec_context.Plo + -rm -f krb5/$(DEPDIR)/inquire_context.Plo + -rm -f krb5/$(DEPDIR)/inquire_cred.Plo + -rm -f krb5/$(DEPDIR)/inquire_cred_by_mech.Plo + -rm -f krb5/$(DEPDIR)/inquire_cred_by_oid.Plo + -rm -f krb5/$(DEPDIR)/inquire_mechs_for_name.Plo + -rm -f krb5/$(DEPDIR)/inquire_names_for_mech.Plo + -rm -f krb5/$(DEPDIR)/inquire_sec_context_by_oid.Plo + -rm -f krb5/$(DEPDIR)/pname_to_uid.Plo + -rm -f krb5/$(DEPDIR)/prf.Plo + -rm -f krb5/$(DEPDIR)/process_context_token.Plo + -rm -f krb5/$(DEPDIR)/release_buffer.Plo + -rm -f krb5/$(DEPDIR)/release_cred.Plo + -rm -f krb5/$(DEPDIR)/release_name.Plo + -rm -f krb5/$(DEPDIR)/sequence.Plo + -rm -f krb5/$(DEPDIR)/set_cred_option.Plo + -rm -f krb5/$(DEPDIR)/set_sec_context_option.Plo + -rm -f krb5/$(DEPDIR)/store_cred.Plo + -rm -f krb5/$(DEPDIR)/test_cfx.Po + -rm -f krb5/$(DEPDIR)/ticket_flags.Plo + -rm -f krb5/$(DEPDIR)/unwrap.Plo + -rm -f krb5/$(DEPDIR)/verify_mic.Plo + -rm -f krb5/$(DEPDIR)/wrap.Plo + -rm -f mech/$(DEPDIR)/context.Plo + -rm -f mech/$(DEPDIR)/doxygen.Plo + -rm -f mech/$(DEPDIR)/gss_accept_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_acquire_cred.Plo + -rm -f mech/$(DEPDIR)/gss_acquire_cred_ext.Plo + -rm -f mech/$(DEPDIR)/gss_acquire_cred_with_password.Plo + -rm -f mech/$(DEPDIR)/gss_add_cred.Plo + -rm -f mech/$(DEPDIR)/gss_add_cred_with_password.Plo + -rm -f mech/$(DEPDIR)/gss_add_oid_set_member.Plo + -rm -f mech/$(DEPDIR)/gss_aeap.Plo + -rm -f mech/$(DEPDIR)/gss_authorize_localname.Plo + -rm -f mech/$(DEPDIR)/gss_buffer_set.Plo + -rm -f mech/$(DEPDIR)/gss_canonicalize_name.Plo + -rm -f mech/$(DEPDIR)/gss_compare_name.Plo + -rm -f mech/$(DEPDIR)/gss_context_time.Plo + -rm -f mech/$(DEPDIR)/gss_create_empty_oid_set.Plo + -rm -f mech/$(DEPDIR)/gss_cred.Plo + -rm -f mech/$(DEPDIR)/gss_decapsulate_token.Plo + -rm -f mech/$(DEPDIR)/gss_delete_name_attribute.Plo + -rm -f mech/$(DEPDIR)/gss_delete_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_display_name.Plo + -rm -f mech/$(DEPDIR)/gss_display_name_ext.Plo + -rm -f mech/$(DEPDIR)/gss_display_status.Plo + -rm -f mech/$(DEPDIR)/gss_duplicate_name.Plo + -rm -f mech/$(DEPDIR)/gss_duplicate_oid.Plo + -rm -f mech/$(DEPDIR)/gss_encapsulate_token.Plo + -rm -f mech/$(DEPDIR)/gss_export_name.Plo + -rm -f mech/$(DEPDIR)/gss_export_name_composite.Plo + -rm -f mech/$(DEPDIR)/gss_export_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_get_mic.Plo + -rm -f mech/$(DEPDIR)/gss_get_name_attribute.Plo + -rm -f mech/$(DEPDIR)/gss_import_name.Plo + -rm -f mech/$(DEPDIR)/gss_import_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_indicate_mechs.Plo + -rm -f mech/$(DEPDIR)/gss_init_sec_context.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_context.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_cred.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_cred_by_mech.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_cred_by_oid.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_mechs_for_name.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_name.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_names_for_mech.Plo + -rm -f mech/$(DEPDIR)/gss_inquire_sec_context_by_oid.Plo + -rm -f mech/$(DEPDIR)/gss_krb5.Plo + -rm -f mech/$(DEPDIR)/gss_mech_switch.Plo + -rm -f mech/$(DEPDIR)/gss_mo.Plo + -rm -f mech/$(DEPDIR)/gss_names.Plo + -rm -f mech/$(DEPDIR)/gss_oid.Plo + -rm -f mech/$(DEPDIR)/gss_oid_equal.Plo + -rm -f mech/$(DEPDIR)/gss_oid_to_str.Plo + -rm -f mech/$(DEPDIR)/gss_pname_to_uid.Plo + -rm -f mech/$(DEPDIR)/gss_process_context_token.Plo + -rm -f mech/$(DEPDIR)/gss_pseudo_random.Plo + -rm -f mech/$(DEPDIR)/gss_release_buffer.Plo + -rm -f mech/$(DEPDIR)/gss_release_cred.Plo + -rm -f mech/$(DEPDIR)/gss_release_name.Plo + -rm -f mech/$(DEPDIR)/gss_release_oid.Plo + -rm -f mech/$(DEPDIR)/gss_release_oid_set.Plo + -rm -f mech/$(DEPDIR)/gss_seal.Plo + -rm -f mech/$(DEPDIR)/gss_set_cred_option.Plo + -rm -f mech/$(DEPDIR)/gss_set_name_attribute.Plo + -rm -f mech/$(DEPDIR)/gss_set_sec_context_option.Plo + -rm -f mech/$(DEPDIR)/gss_sign.Plo + -rm -f mech/$(DEPDIR)/gss_store_cred.Plo + -rm -f mech/$(DEPDIR)/gss_test_oid_set_member.Plo + -rm -f mech/$(DEPDIR)/gss_unseal.Plo + -rm -f mech/$(DEPDIR)/gss_unwrap.Plo + -rm -f mech/$(DEPDIR)/gss_utils.Plo + -rm -f mech/$(DEPDIR)/gss_verify.Plo + -rm -f mech/$(DEPDIR)/gss_verify_mic.Plo + -rm -f mech/$(DEPDIR)/gss_wrap.Plo + -rm -f mech/$(DEPDIR)/gss_wrap_size_limit.Plo + -rm -f ntlm/$(DEPDIR)/accept_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/acquire_cred.Plo + -rm -f ntlm/$(DEPDIR)/add_cred.Plo + -rm -f ntlm/$(DEPDIR)/canonicalize_name.Plo + -rm -f ntlm/$(DEPDIR)/compare_name.Plo + -rm -f ntlm/$(DEPDIR)/context_time.Plo + -rm -f ntlm/$(DEPDIR)/creds.Plo + -rm -f ntlm/$(DEPDIR)/crypto.Plo + -rm -f ntlm/$(DEPDIR)/delete_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/display_name.Plo + -rm -f ntlm/$(DEPDIR)/display_status.Plo + -rm -f ntlm/$(DEPDIR)/duplicate_name.Plo + -rm -f ntlm/$(DEPDIR)/export_name.Plo + -rm -f ntlm/$(DEPDIR)/export_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/external.Plo + -rm -f ntlm/$(DEPDIR)/import_name.Plo + -rm -f ntlm/$(DEPDIR)/import_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/indicate_mechs.Plo + -rm -f ntlm/$(DEPDIR)/init_sec_context.Plo + -rm -f ntlm/$(DEPDIR)/inquire_context.Plo + -rm -f ntlm/$(DEPDIR)/inquire_cred_by_mech.Plo + -rm -f ntlm/$(DEPDIR)/inquire_mechs_for_name.Plo + -rm -f ntlm/$(DEPDIR)/inquire_names_for_mech.Plo + -rm -f ntlm/$(DEPDIR)/inquire_sec_context_by_oid.Plo + -rm -f ntlm/$(DEPDIR)/iter_cred.Plo + -rm -f ntlm/$(DEPDIR)/kdc.Plo + -rm -f ntlm/$(DEPDIR)/process_context_token.Plo + -rm -f ntlm/$(DEPDIR)/release_cred.Plo + -rm -f ntlm/$(DEPDIR)/release_name.Plo + -rm -f spnego/$(DEPDIR)/accept_sec_context.Plo + -rm -f spnego/$(DEPDIR)/compat.Plo + -rm -f spnego/$(DEPDIR)/context_stubs.Plo + -rm -f spnego/$(DEPDIR)/cred_stubs.Plo + -rm -f spnego/$(DEPDIR)/external.Plo + -rm -f spnego/$(DEPDIR)/init_sec_context.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -2304,17 +2947,18 @@ uninstall-man: uninstall-man3 uninstall-man5 .MAKE: all check check-am install install-am install-data-am \ - install-exec-am install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-binPROGRAMS clean-checkPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool \ - clean-noinstPROGRAMS ctags dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + install-exec install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ install-html-am install-includeHEADERS install-info \ install-info-am install-libLTLIBRARIES install-man \ install-man3 install-man5 install-nobase_includeHEADERS \ @@ -2323,27 +2967,41 @@ 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-hook uninstall-includeHEADERS \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-hook uninstall-includeHEADERS \ uninstall-libLTLIBRARIES uninstall-man uninstall-man3 \ uninstall-man5 uninstall-nobase_includeHEADERS \ uninstall-nodist_gssapiHEADERS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -2351,7 +3009,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -2396,11 +3054,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -2408,6 +3075,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -2450,6 +3119,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -2463,13 +3145,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -2500,7 +3182,7 @@ fi ; \ done -$(srcdir)/ntlm/ntlm-private.h: +$(srcdir)/ntlm/ntlm-private.h: $(ntlmsrc) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p ntlm/ntlm-private.h $(ntlmsrc) || rm -f ntlm/ntlm-private.h $(libgssapi_la_OBJECTS): $(BUILTHEADERS) @@ -2508,6 +3190,9 @@ $(libgssapi_la_OBJECTS): $(srcdir)/version-script.map +$(libgssapi_la_OBJECTS): gkrb5_err.h +gkrb5_err.h: $(srcdir)/krb5/gkrb5_err.et + $(spnego_files) spnego_asn1.hx spnego_asn1-priv.hx: spnego_asn1_files $(gssapi_files) gssapi_asn1.hx gssapi_asn1-priv.hx: gssapi_asn1_files diff --git a/crypto/heimdal/lib/gssapi/NTMakefile b/crypto/heimdal/lib/gssapi/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/NTMakefile @@ -0,0 +1,640 @@ +######################################################################## +# +# Copyright (c) 2009-2011, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\gssapi + +!include ../../windows/NTMakefile.w32 + +krb5src = \ + krb5/8003.c \ + krb5/accept_sec_context.c \ + krb5/acquire_cred.c \ + krb5/add_cred.c \ + krb5/address_to_krb5addr.c \ + krb5/aeap.c \ + krb5/arcfour.c \ + krb5/authorize_localname.c \ + krb5/canonicalize_name.c \ + krb5/creds.c \ + krb5/ccache_name.c \ + krb5/cfx.c \ + krb5/cfx.h \ + krb5/compare_name.c \ + krb5/compat.c \ + krb5/context_time.c \ + krb5/copy_ccache.c \ + krb5/decapsulate.c \ + krb5/delete_sec_context.c \ + krb5/display_name.c \ + krb5/display_status.c \ + krb5/duplicate_name.c \ + krb5/encapsulate.c \ + krb5/export_name.c \ + krb5/export_sec_context.c \ + krb5/external.c \ + krb5/get_mic.c \ + krb5/gsskrb5_locl.h \ + krb5/import_name.c \ + krb5/import_sec_context.c \ + krb5/indicate_mechs.c \ + krb5/init.c \ + krb5/init_sec_context.c \ + krb5/inquire_context.c \ + krb5/inquire_cred.c \ + krb5/inquire_cred_by_mech.c \ + krb5/inquire_cred_by_oid.c \ + krb5/inquire_mechs_for_name.c \ + krb5/inquire_names_for_mech.c \ + krb5/inquire_sec_context_by_oid.c \ + krb5/pname_to_uid.c \ + krb5/process_context_token.c \ + krb5/prf.c \ + krb5/release_buffer.c \ + krb5/release_cred.c \ + krb5/release_name.c \ + krb5/sequence.c \ + krb5/store_cred.c \ + krb5/set_cred_option.c \ + krb5/set_sec_context_option.c \ + krb5/ticket_flags.c \ + krb5/unwrap.c \ + krb5/verify_mic.c \ + krb5/wrap.c + +mechsrc = \ + mech/context.h \ + mech/context.c \ + mech/cred.h \ + mech/gss_accept_sec_context.c \ + mech/gss_acquire_cred.c \ + mech/gss_acquire_cred_ext.c \ + mech/gss_acquire_cred_with_password.c \ + mech/gss_add_cred.c \ + mech/gss_add_cred_with_password.c \ + mech/gss_add_oid_set_member.c \ + mech/gss_aeap.c \ + mech/gss_authorize_localname.c \ + mech/gss_buffer_set.c \ + mech/gss_canonicalize_name.c \ + mech/gss_compare_name.c \ + mech/gss_context_time.c \ + mech/gss_create_empty_oid_set.c \ + mech/gss_cred.c \ + mech/gss_decapsulate_token.c \ + mech/gss_delete_name_attribute.c \ + mech/gss_delete_sec_context.c \ + mech/gss_display_name.c \ + mech/gss_display_name_ext.c \ + mech/gss_display_status.c \ + mech/gss_duplicate_name.c \ + mech/gss_duplicate_oid.c \ + mech/gss_encapsulate_token.c \ + mech/gss_export_name.c \ + mech/gss_export_name_composite.c \ + mech/gss_export_sec_context.c \ + mech/gss_get_mic.c \ + mech/gss_get_name_attribute.c \ + mech/gss_import_name.c \ + mech/gss_import_sec_context.c \ + mech/gss_indicate_mechs.c \ + mech/gss_init_sec_context.c \ + mech/gss_inquire_context.c \ + mech/gss_inquire_cred.c \ + mech/gss_inquire_cred_by_mech.c \ + mech/gss_inquire_cred_by_oid.c \ + mech/gss_inquire_mechs_for_name.c \ + mech/gss_inquire_name.c \ + mech/gss_inquire_names_for_mech.c \ + mech/gss_krb5.c \ + mech/gss_mech_switch.c \ + mech/gss_mo.c \ + mech/gss_names.c \ + mech/gss_oid.c \ + mech/gss_oid_equal.c \ + mech/gss_oid_to_str.c \ + mech/gss_pname_to_uid.c \ + mech/gss_process_context_token.c \ + mech/gss_pseudo_random.c \ + mech/gss_release_buffer.c \ + mech/gss_release_cred.c \ + mech/gss_release_name.c \ + mech/gss_release_oid.c \ + mech/gss_release_oid_set.c \ + mech/gss_seal.c \ + mech/gss_set_cred_option.c \ + mech/gss_set_name_attribute.c \ + mech/gss_set_sec_context_option.c \ + mech/gss_sign.c \ + mech/gss_store_cred.c \ + mech/gss_test_oid_set_member.c \ + mech/gss_unseal.c \ + mech/gss_unwrap.c \ + mech/gss_utils.c \ + mech/gss_verify.c \ + mech/gss_verify_mic.c \ + mech/gss_wrap.c \ + mech/gss_wrap_size_limit.c \ + mech/gss_inquire_sec_context_by_oid.c \ + mech/mech_switch.h \ + mech/mechqueue.h \ + mech/mech_locl.h \ + mech/name.h \ + mech/utils.h + +spnegosrc = \ + spnego/accept_sec_context.c \ + spnego/compat.c \ + spnego/context_stubs.c \ + spnego/cred_stubs.c \ + spnego/external.c \ + spnego/init_sec_context.c \ + spnego/spnego_locl.h + +ntlmsrc = \ + ntlm/accept_sec_context.c \ + ntlm/acquire_cred.c \ + ntlm/add_cred.c \ + ntlm/canonicalize_name.c \ + ntlm/compare_name.c \ + ntlm/context_time.c \ + ntlm/creds.c \ + ntlm/crypto.c \ + ntlm/delete_sec_context.c \ + ntlm/display_name.c \ + ntlm/display_status.c \ + ntlm/duplicate_name.c \ + ntlm/export_name.c \ + ntlm/export_sec_context.c \ + ntlm/external.c \ + ntlm/ntlm.h \ + ntlm/import_name.c \ + ntlm/import_sec_context.c \ + ntlm/indicate_mechs.c \ + ntlm/init_sec_context.c \ + ntlm/inquire_context.c \ + ntlm/inquire_cred_by_mech.c \ + ntlm/inquire_mechs_for_name.c \ + ntlm/inquire_names_for_mech.c \ + ntlm/inquire_sec_context_by_oid.c \ + ntlm/iter_cred.c \ + ntlm/process_context_token.c \ + ntlm/release_cred.c \ + ntlm/release_name.c \ + ntlm/kdc.c + +$(OBJ)\ntlm\ntlm-private.h: $(ntlmsrc) + $(PERL) ../../cf/make-proto.pl -q -P remove -p $@ $(ntlmsrc) + +$(OBJ)\krb5\gsskrb5-private.h: $(krb5src) + $(PERL) ../../cf/make-proto.pl -q -P remove -p $@ $(krb5src) + +$(OBJ)\spnego\spnego-private.h: $(spnegosrc) + $(PERL) ../../cf/make-proto.pl -q -P remove -p $@ $(spnegosrc) + +gssapi_files = $(OBJ)\gssapi\asn1_gssapi_asn1.x + +spnego_files = $(OBJ)\spnego\asn1_spnego_asn1.x + +$(gssapi_files:.x=.c): $$(@R).x + +$(spnego_files:.x=.c): $$(@R).x + +$(gssapi_files) $(OBJ)\gssapi\gssapi_asn1.hx $(OBJ)\gssapi\gssapi_asn1-priv.hx: \ +$(BINDIR)\asn1_compile.exe mech\gssapi.asn1 + cd $(OBJ)\gssapi + $(BINDIR)\asn1_compile.exe --one-code-file $(SRCDIR)\mech\gssapi.asn1 gssapi_asn1 \ + || ( $(RM) $(OBJ)\gssapi\gssapi_asn1.h ; exit /b 1 ) + cd $(SRCDIR) + +$(spnego_files) $(OBJ)\spnego\spnego_asn1.hx $(OBJ)\spnego\spnego_asn1-priv.hx: \ +$(BINDIR)\asn1_compile.exe spnego\spnego.asn1 + cd $(OBJ)\spnego + $(BINDIR)\asn1_compile --one-code-file --sequence=MechTypeList \ + $(SRCDIR)\spnego\spnego.asn1 spnego_asn1 \ + || ( $(RM) $(OBJ)\spnego\spnego_asn1.h ; exit /b 1 ) + cd $(SRCDIR) + +$(OBJ)\gkrb5_err.c $(OBJ)\gkrb5_err.h: krb5\gkrb5_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\krb5\gkrb5_err.et + cd $(SRCDIR) + +INCFILES= \ + $(INCDIR)\gssapi.h \ + $(INCDIR)\gssapi\gssapi.h \ + $(INCDIR)\gssapi\gssapi_krb5.h \ + $(INCDIR)\gssapi\gssapi_oid.h \ + $(INCDIR)\gssapi\gssapi_ntlm.h \ + $(INCDIR)\gssapi\gssapi_spnego.h \ + $(INCDIR)\gssapi\gkrb5_err.h \ + $(OBJ)\ntlm\ntlm-private.h \ + $(OBJ)\spnego\spnego-private.h \ + $(OBJ)\krb5\gsskrb5-private.h \ + $(OBJ)\gkrb5_err.h \ + $(OBJ)\gssapi\gssapi_asn1.h \ + $(OBJ)\gssapi\gssapi_asn1-priv.h \ + $(OBJ)\spnego\spnego_asn1.h \ + $(OBJ)\spnego\spnego_asn1-priv.h + +all:: $(INCFILES) + +libgssapi_OBJs = \ + $(OBJ)\krb5/8003.obj \ + $(OBJ)\krb5/accept_sec_context.obj \ + $(OBJ)\krb5/acquire_cred.obj \ + $(OBJ)\krb5/add_cred.obj \ + $(OBJ)\krb5/address_to_krb5addr.obj \ + $(OBJ)\krb5/authorize_localname.obj \ + $(OBJ)\krb5/aeap.obj \ + $(OBJ)\krb5/arcfour.obj \ + $(OBJ)\krb5/canonicalize_name.obj \ + $(OBJ)\krb5/creds.obj \ + $(OBJ)\krb5/ccache_name.obj \ + $(OBJ)\krb5/cfx.obj \ + $(OBJ)\krb5/compare_name.obj \ + $(OBJ)\krb5/compat.obj \ + $(OBJ)\krb5/context_time.obj \ + $(OBJ)\krb5/copy_ccache.obj \ + $(OBJ)\krb5/decapsulate.obj \ + $(OBJ)\krb5/delete_sec_context.obj \ + $(OBJ)\krb5/display_name.obj \ + $(OBJ)\krb5/display_status.obj \ + $(OBJ)\krb5/duplicate_name.obj \ + $(OBJ)\krb5/encapsulate.obj \ + $(OBJ)\krb5/export_name.obj \ + $(OBJ)\krb5/export_sec_context.obj \ + $(OBJ)\krb5/external.obj \ + $(OBJ)\krb5/get_mic.obj \ + $(OBJ)\krb5/import_name.obj \ + $(OBJ)\krb5/import_sec_context.obj \ + $(OBJ)\krb5/indicate_mechs.obj \ + $(OBJ)\krb5/init.obj \ + $(OBJ)\krb5/init_sec_context.obj \ + $(OBJ)\krb5/inquire_context.obj \ + $(OBJ)\krb5/inquire_cred.obj \ + $(OBJ)\krb5/inquire_cred_by_mech.obj \ + $(OBJ)\krb5/inquire_cred_by_oid.obj \ + $(OBJ)\krb5/inquire_mechs_for_name.obj \ + $(OBJ)\krb5/inquire_names_for_mech.obj \ + $(OBJ)\krb5/inquire_sec_context_by_oid.obj \ + $(OBJ)\krb5/pname_to_uid.obj \ + $(OBJ)\krb5/process_context_token.obj \ + $(OBJ)\krb5/prf.obj \ + $(OBJ)\krb5/release_buffer.obj \ + $(OBJ)\krb5/release_cred.obj \ + $(OBJ)\krb5/release_name.obj \ + $(OBJ)\krb5/sequence.obj \ + $(OBJ)\krb5/store_cred.obj \ + $(OBJ)\krb5/set_cred_option.obj \ + $(OBJ)\krb5/set_sec_context_option.obj \ + $(OBJ)\krb5/ticket_flags.obj \ + $(OBJ)\krb5/unwrap.obj \ + $(OBJ)\krb5/verify_mic.obj \ + $(OBJ)\krb5/wrap.obj \ + $(OBJ)\mech/context.obj \ + $(OBJ)\mech/gss_accept_sec_context.obj \ + $(OBJ)\mech/gss_acquire_cred.obj \ + $(OBJ)\mech/gss_acquire_cred_ext.obj \ + $(OBJ)\mech/gss_acquire_cred_with_password.obj \ + $(OBJ)\mech/gss_add_cred.obj \ + $(OBJ)\mech/gss_add_cred_with_password.obj \ + $(OBJ)\mech/gss_add_oid_set_member.obj \ + $(OBJ)\mech/gss_aeap.obj \ + $(OBJ)\mech/gss_authorize_localname.obj \ + $(OBJ)\mech/gss_buffer_set.obj \ + $(OBJ)\mech/gss_canonicalize_name.obj \ + $(OBJ)\mech/gss_compare_name.obj \ + $(OBJ)\mech/gss_context_time.obj \ + $(OBJ)\mech/gss_create_empty_oid_set.obj \ + $(OBJ)\mech/gss_cred.obj \ + $(OBJ)\mech/gss_decapsulate_token.obj \ + $(OBJ)\mech/gss_delete_name_attribute.obj \ + $(OBJ)\mech/gss_delete_sec_context.obj \ + $(OBJ)\mech/gss_display_name.obj \ + $(OBJ)\mech/gss_display_name_ext.obj \ + $(OBJ)\mech/gss_display_status.obj \ + $(OBJ)\mech/gss_duplicate_name.obj \ + $(OBJ)\mech/gss_duplicate_oid.obj \ + $(OBJ)\mech/gss_encapsulate_token.obj \ + $(OBJ)\mech/gss_export_name.obj \ + $(OBJ)\mech/gss_export_name_composite.obj \ + $(OBJ)\mech/gss_export_sec_context.obj \ + $(OBJ)\mech/gss_get_mic.obj \ + $(OBJ)\mech/gss_get_name_attribute.obj \ + $(OBJ)\mech/gss_import_name.obj \ + $(OBJ)\mech/gss_import_sec_context.obj \ + $(OBJ)\mech/gss_indicate_mechs.obj \ + $(OBJ)\mech/gss_init_sec_context.obj \ + $(OBJ)\mech/gss_inquire_context.obj \ + $(OBJ)\mech/gss_inquire_cred.obj \ + $(OBJ)\mech/gss_inquire_cred_by_mech.obj \ + $(OBJ)\mech/gss_inquire_cred_by_oid.obj \ + $(OBJ)\mech/gss_inquire_mechs_for_name.obj \ + $(OBJ)\mech/gss_inquire_name.obj \ + $(OBJ)\mech/gss_inquire_names_for_mech.obj \ + $(OBJ)\mech/gss_krb5.obj \ + $(OBJ)\mech/gss_mech_switch.obj \ + $(OBJ)\mech/gss_mo.obj \ + $(OBJ)\mech/gss_names.obj \ + $(OBJ)\mech/gss_oid.obj \ + $(OBJ)\mech/gss_oid_equal.obj \ + $(OBJ)\mech/gss_oid_to_str.obj \ + $(OBJ)\mech/gss_pname_to_uid.obj \ + $(OBJ)\mech/gss_process_context_token.obj \ + $(OBJ)\mech/gss_pseudo_random.obj \ + $(OBJ)\mech/gss_release_buffer.obj \ + $(OBJ)\mech/gss_release_cred.obj \ + $(OBJ)\mech/gss_release_name.obj \ + $(OBJ)\mech/gss_release_oid.obj \ + $(OBJ)\mech/gss_release_oid_set.obj \ + $(OBJ)\mech/gss_seal.obj \ + $(OBJ)\mech/gss_set_cred_option.obj \ + $(OBJ)\mech/gss_set_name_attribute.obj \ + $(OBJ)\mech/gss_set_sec_context_option.obj \ + $(OBJ)\mech/gss_sign.obj \ + $(OBJ)\mech/gss_store_cred.obj \ + $(OBJ)\mech/gss_test_oid_set_member.obj \ + $(OBJ)\mech/gss_unseal.obj \ + $(OBJ)\mech/gss_unwrap.obj \ + $(OBJ)\mech/gss_utils.obj \ + $(OBJ)\mech/gss_verify.obj \ + $(OBJ)\mech/gss_verify_mic.obj \ + $(OBJ)\mech/gss_wrap.obj \ + $(OBJ)\mech/gss_wrap_size_limit.obj \ + $(OBJ)\mech/gss_inquire_sec_context_by_oid.obj \ + $(OBJ)\spnego/accept_sec_context.obj \ + $(OBJ)\spnego/compat.obj \ + $(OBJ)\spnego/context_stubs.obj \ + $(OBJ)\spnego/cred_stubs.obj \ + $(OBJ)\spnego/external.obj \ + $(OBJ)\spnego/init_sec_context.obj \ + $(OBJ)\ntlm/accept_sec_context.obj \ + $(OBJ)\ntlm/acquire_cred.obj \ + $(OBJ)\ntlm/add_cred.obj \ + $(OBJ)\ntlm/canonicalize_name.obj \ + $(OBJ)\ntlm/compare_name.obj \ + $(OBJ)\ntlm/context_time.obj \ + $(OBJ)\ntlm/creds.obj \ + $(OBJ)\ntlm/crypto.obj \ + $(OBJ)\ntlm/delete_sec_context.obj \ + $(OBJ)\ntlm/display_name.obj \ + $(OBJ)\ntlm/display_status.obj \ + $(OBJ)\ntlm/duplicate_name.obj \ + $(OBJ)\ntlm/export_name.obj \ + $(OBJ)\ntlm/export_sec_context.obj \ + $(OBJ)\ntlm/external.obj \ + $(OBJ)\ntlm/import_name.obj \ + $(OBJ)\ntlm/import_sec_context.obj \ + $(OBJ)\ntlm/indicate_mechs.obj \ + $(OBJ)\ntlm/init_sec_context.obj \ + $(OBJ)\ntlm/inquire_context.obj \ + $(OBJ)\ntlm/inquire_cred_by_mech.obj \ + $(OBJ)\ntlm/inquire_mechs_for_name.obj \ + $(OBJ)\ntlm/inquire_names_for_mech.obj \ + $(OBJ)\ntlm/inquire_sec_context_by_oid.obj \ + $(OBJ)\ntlm/iter_cred.obj \ + $(OBJ)\ntlm/process_context_token.obj \ + $(OBJ)\ntlm/release_cred.obj \ + $(OBJ)\ntlm/release_name.obj \ + $(OBJ)\ntlm/kdc.obj \ + $(OBJ)\gkrb5_err.obj \ + $(spnego_files:.x=.obj) \ + $(gssapi_files:.x=.obj) + +GCOPTS=-I$(SRCDIR) -I$(OBJ) -Igssapi -DBUILD_GSSAPI_LIB + +{$(OBJ)\krb5}.c{$(OBJ)\krb5}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\krb5\ -Fd$(OBJ)\krb5\ -I$(OBJ)\krb5 $(GCOPTS) + +{krb5}.c{$(OBJ)\krb5}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\krb5\ -Fd$(OBJ)\krb5\ -I$(OBJ)\krb5 $(GCOPTS) -DASN1_LIB + +{$(OBJ)\mech}.c{$(OBJ)\mech}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\mech\ -Fd$(OBJ)\mech\ -I$(OBJ)\mech $(GCOPTS) + +{mech}.c{$(OBJ)\mech}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\mech\ -Fd$(OBJ)\mech\ -I$(OBJ)\mech -I$(OBJ)\gssapi $(GCOPTS) -DASN1_LIB + +{$(OBJ)\ntlm}.c{$(OBJ)\ntlm}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\ntlm\ -Fd$(OBJ)\ntlm\ -I$(OBJ)\ntlm $(GCOPTS) + +{ntlm}.c{$(OBJ)\ntlm}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\ntlm\ -Fd$(OBJ)\ntlm\ -I$(OBJ)\ntlm $(GCOPTS) -DASN1_LIB + +{$(OBJ)\spnego}.c{$(OBJ)\spnego}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\spnego\ -Fd$(OBJ)\spnego\ -I$(OBJ)\spnego $(GCOPTS) + +{spnego}.c{$(OBJ)\spnego}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\spnego\ -Fd$(OBJ)\spnego\ -I$(OBJ)\spnego -Imech $(GCOPTS) -DASN1_LIB + +{$(OBJ)\gssapi}.c{$(OBJ)\gssapi}.obj:: + $(C2OBJ_NP) -Fo$(OBJ)\gssapi\ -Fd$(OBJ)\gssapi\ -I$(OBJ)\gssapi $(GCOPTS) + +{$(OBJ)}.c{$(OBJ)}.obj:: + $(C2OBJ_P) $(GCOPTS) + +{$(OBJ)\spnego}.x{$(OBJ)\spnego}.c: + $(CP) $** $@ + +{$(OBJ)\gssapi}.x{$(OBJ)\gssapi}.c: + $(CP) $** $@ + +{gssapi}.h{$(INCDIR)\gssapi}.h: + $(CP) $** $@ + +{$(OBJ)}.h{$(INCDIR)\gssapi}.h: + $(CP) $** $@ + +{$(OBJ)\gssapi}.hx{$(OBJ)\gssapi}.h: + $(CP) $** $@ + +{$(OBJ)\spnego}.hx{$(OBJ)\spnego}.h: + $(CP) $** $@ + +LIBGSSAPI_LIBS=\ + $(LIBHEIMBASE) \ + $(LIBROKEN) \ + $(LIBHEIMDAL) \ + $(LIBHEIMNTLM) \ + $(LIBCOMERR) + +LIBGSSAPI_SDKLIBS=\ + $(PTHREAD_LIB) + +!ifndef STATICLIBS + +RES=$(OBJ)\libgssapi-version.res + +$(BINDIR)\gssapi.dll: $(libgssapi_OBJs) $(RES) + $(DLLGUILINK_C) -implib:$(LIBGSSAPI) \ + -out:$(BINDIR)\gssapi.dll \ + -def:libgssapi-exports.def \ + $(LIBGSSAPI_LIBS) $(RES) $(LIBGSSAPI_SDKLIBS) @<< +$(libgssapi_OBJs: = +) +<< + $(DLLPREP_NODIST) + +$(LIBGSSAPI): $(BINDIR)\gssapi.dll + +clean:: + -$(RM) $(BINDIR)\gssapi.* + +!else + +$(LIBGSSAPI): $(libgssapi_OBJs) + $(LIBCON_C) -OUT:$@ $(LIBGSSAPI_LIBS) $(LIBGSSAPI_SDKLIBS) @<< +$(libgssapi_OBJs: = +) +<< + +!endif + +all:: $(LIBGSSAPI) + +clean:: + -$(RM) $(LIBGSSAPI) + +prep:: mkdirs-gss + +mkdirs-gss: +!if !exist($(OBJ)\ntlm) + $(MKDIR) $(OBJ)\ntlm +!endif +!if !exist($(OBJ)\krb5) + $(MKDIR) $(OBJ)\krb5 +!endif +!if !exist($(OBJ)\spnego) + $(MKDIR) $(OBJ)\spnego +!endif +!if !exist($(OBJ)\mech) + $(MKDIR) $(OBJ)\mech +!endif +!if !exist($(OBJ)\gssapi) + $(MKDIR) $(OBJ)\gssapi +!endif + +clean:: + -$(RM) $(OBJ)\ntlm\*.* + -$(RM) $(OBJ)\krb5\*.* + -$(RM) $(OBJ)\spnego\*.* + -$(RM) $(OBJ)\mech\*.* + -$(RM) $(OBJ)\gssapi\*.* + +all-tools:: $(BINDIR)\gsstool.exe + +$(BINDIR)\gsstool.exe: $(OBJ)\gsstool.obj $(OBJ)\gss-commands.obj $(LIBGSSAPI) $(LIBROKEN) $(LIBSL) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP) + +$(OBJ)\gss-commands.c $(OBJ)\gss-commands.h: gss-commands.in + cd $(OBJ) + $(CP) $(SRCDIR)\gss-commands.in gss-commands.in + $(BINDIR)\slc.exe gss-commands.in + cd $(SRCDIR) + +!ifdef ELISP +# This macro invocation is used to update the libgssapi_OBJs +# definition below (generate-obj-macro is defined in maint.el): + +(generate-obj-macro "libgssapi_OBJs" + (concat "\t$(OBJ)\\gkrb5_err.obj \\\n" + "\t$(spnego_files:.x=.obj) \\\n" + "\t$(gssapi_files:.x=.obj)") + "krb5src" "mechsrc" "spnegosrc" "ntlmsrc") +!endif + +test-exports: + $(PERL) ..\..\cf\w32-check-exported-symbols.pl --vs version-script.map --def libgssapi-exports.def + +test:: test-exports + + +TEST_BINARIES=\ + $(OBJ)\test_oid.exe \ + $(OBJ)\test_names.exe \ + $(OBJ)\test_cfx.exe \ + $(OBJ)\test_acquire_cred.exe \ + $(OBJ)\test_cred.exe \ + $(OBJ)\test_kcred.exe \ + $(OBJ)\test_context.exe \ + $(OBJ)\test_ntlm.exe + +$(OBJ)\test_oid.exe: $(OBJ)\test_oid.obj $(LIBGSSAPI) $(LIBROKEN) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_names.exe: $(OBJ)\test_names.obj $(LIBGSSAPI) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_cfx.exe: $(OBJ)\krb5\test_cfx.obj $(LIBHEIMDAL) $(LIBGSSAPI) $(LIBROKEN) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_acquire_cred.exe: $(OBJ)\test_acquire_cred.obj $(OBJ)\test_common.obj \ + $(LIBGSSAPI) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_cred.exe: $(OBJ)\test_cred.obj $(LIBGSSAPI) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_kcred.exe: $(OBJ)\test_kcred.obj $(LIBGSSAPI) $(LIBHEIMDAL) \ + $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_context.exe: $(OBJ)\test_context.obj $(OBJ)\test_common.obj \ + $(LIBGSSAPI) $(LIBHEIMDAL) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_ntlm.exe: $(OBJ)\test_ntlm.obj $(OBJ)\test_common.obj \ + $(LIBGSSAPI) $(LIBHEIMNTLM) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +{}.c{$(OBJ)}.obj:: + $(C2OBJ_P) -I$(OBJ)\krb5 -I$(OBJ) -I$(SRCDIR) -I$(SRCDIR)\gssapi + +test-binaries: $(LIBGSSAPI) $(TEST_BINARIES) + +run-test: + cd $(OBJ) + -test_oid + -test_names + -test_cfx + -test_kcred + cd $(SRCDIR) + +test:: test-binaries run-test diff --git a/crypto/heimdal/lib/gssapi/gen-oid.pl b/crypto/heimdal/lib/gssapi/gen-oid.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/gen-oid.pl @@ -0,0 +1,141 @@ +#!/usr/bin/perl +# +# Copyright (c) 2010 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +use Getopt::Std; + +my $output; +my $CFILE, $HFILE; +my $onlybase; +my $header = 0; + +getopts('b:h') || die "USAGE: ./gen-oid [-b BASE] [-h HEADER]"; + +if($opt_b) { + $onlybase = $opt_b; +} + +$header = 1 if ($opt_h); + +printf "/* Generated file */\n"; +if ($header) { + printf "#ifndef GSSAPI_GSSAPI_OID\n"; + printf "#define GSSAPI_GSSAPI_OID 1\n\n"; +} else { + printf "#include \"mech_locl.h\"\n\n"; +} + +my %tables; +my %types; + +while(<>) { + + if (/^\w*#(.*)/) { + my $comment = $1; + + if ($header) { + printf("$comment\n"); + } + + } elsif (/^oid\s+([\w\.]+)\s+(\w+)\s+([\w\.]+)/) { + my ($base, $name, $oid) = ($1, $2, $3); + + next if (defined $onlybase and $onlybase ne $base); + + my $store = "__" . lc($name) . "_oid_desc"; + + # encode oid + + my @array = split(/\./, $oid); + my $length = 0; + my $data = ""; + + my $num; + + $n = $#array; + while ($n > 1) { + $num = $array[$n]; + + my $p = int($num % 128); + $data = sprintf("\\x%02x", $p) . $data; + + $num = int($num / 128); + + $length += 1; + + while ($num > 0) { + $p = int($num % 128) + 128; + $num = int($num / 128); + $data = sprintf("\\x%02x", $p) . $data; + $length += 1; + } + $n--; + } + $num = int($array[0] * 40 + $array[1]); + + $data = sprintf("\\x%x", $num) . $data; + $length += 1; + + if ($header) { + printf "extern GSSAPI_LIB_VARIABLE gss_OID_desc $store;\n"; + printf "#define $name (&$store)\n\n"; + } else { + printf "/* $name - $oid */\n"; + printf "gss_OID_desc GSSAPI_LIB_VARIABLE $store = { $length, rk_UNCONST(\"$data\") };\n\n"; + } + } elsif (/^desc\s+([\w]+)\s+(\w+)\s+(\"[^\"]*\")\s+(\"[^\"]*\")/) { + my ($type, $oid, $short, $long) = ($1, $2, $3, $4); + my $object = { type=> $type, oid => $oid, short => $short, long => $long }; + + $tables{$oid} = \$object; + $types{$type} = 1; + } + +} + +foreach my $k (sort keys %types) { + if (!$header) { + print "struct _gss_oid_name_table _gss_ont_" . $k . "[] = {\n"; + foreach my $m (sort {$$a->{oid} cmp $$b->{oid}} values %tables) { + if ($$m->{type} eq $k) { + printf " { %s, \"%s\", %s, %s },\n", $$m->{oid}, $$m->{oid}, $$m->{short}, $$m->{long}; + } + } + printf " { NULL, NULL, NULL, NULL }\n"; + printf "};\n\n"; + + } +} + +if ($header) { + printf "#endif /* GSSAPI_GSSAPI_OID */\n"; +} diff --git a/crypto/heimdal/lib/gssapi/gss-commands.in b/crypto/heimdal/lib/gssapi/gss-commands.in --- a/crypto/heimdal/lib/gssapi/gss-commands.in +++ b/crypto/heimdal/lib/gssapi/gss-commands.in @@ -33,10 +33,12 @@ /* $Id$ */ command = { + name = "mechanisms" name = "supported-mechanisms" help = "Print the supported mechanisms" } command = { + name = "attributes" name = "attrs-for-mech" help = "Print the attributes for mechs" option = { diff --git a/crypto/heimdal/lib/gssapi/gss_acquire_cred.3 b/crypto/heimdal/lib/gssapi/gss_acquire_cred.3 --- a/crypto/heimdal/lib/gssapi/gss_acquire_cred.3 +++ b/crypto/heimdal/lib/gssapi/gss_acquire_cred.3 @@ -91,7 +91,7 @@ .Fo gss_accept_sec_context .Fa "OM_uint32 * minor_status" .Fa "gss_ctx_id_t * context_handle" -.Fa "const gss_cred_id_t acceptor_cred_handle" +.Fa "gss_const_cred_id_t acceptor_cred_handle" .Fa "const gss_buffer_t input_token_buffer" .Fa "const gss_channel_bindings_t input_chan_bindings" .Fa "gss_name_t * src_name" @@ -105,7 +105,7 @@ .Ft OM_uint32 .Fo gss_acquire_cred .Fa "OM_uint32 * minor_status" -.Fa "const gss_name_t desired_name" +.Fa "gss_const_name_t desired_name" .Fa "OM_uint32 time_req" .Fa "const gss_OID_set desired_mechs" .Fa "gss_cred_usage_t cred_usage" @@ -116,8 +116,8 @@ .Ft OM_uint32 .Fo gss_add_cred .Fa "OM_uint32 *minor_status" -.Fa "const gss_cred_id_t input_cred_handle" -.Fa "const gss_name_t desired_name" +.Fa "gss_const_cred_id_t input_cred_handle" +.Fa "gss_const_name_t desired_name" .Fa "const gss_OID desired_mech" .Fa "gss_cred_usage_t cred_usage" .Fa "OM_uint32 initiator_time_req" @@ -136,21 +136,21 @@ .Ft OM_uint32 .Fo gss_canonicalize_name .Fa "OM_uint32 * minor_status" -.Fa "const gss_name_t input_name" +.Fa "gss_const_name_t input_name" .Fa "const gss_OID mech_type" .Fa "gss_name_t * output_name" .Fc .Ft OM_uint32 .Fo gss_compare_name .Fa "OM_uint32 * minor_status" -.Fa "const gss_name_t name1" -.Fa "const gss_name_t name2" +.Fa "gss_const_name_t name1" +.Fa "gss_const_name_t name2" .Fa "int * name_equal" .Fc .Ft OM_uint32 .Fo gss_context_time .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "OM_uint32 * time_rec" .Fc .Ft OM_uint32 @@ -167,7 +167,7 @@ .Ft OM_uint32 .Fo gss_display_name .Fa "OM_uint32 * minor_status" -.Fa "const gss_name_t input_name" +.Fa "gss_const_name_t input_name" .Fa "gss_buffer_t output_name_buffer" .Fa "gss_OID * output_name_type" .Fc @@ -183,13 +183,13 @@ .Ft OM_uint32 .Fo gss_duplicate_name .Fa "OM_uint32 * minor_status" -.Fa "const gss_name_t src_name" +.Fa "gss_const_name_t src_name" .Fa "gss_name_t * dest_name" .Fc .Ft OM_uint32 .Fo gss_export_name .Fa "OM_uint32 * minor_status" -.Fa "const gss_name_t input_name" +.Fa "gss_const_name_t input_name" .Fa "gss_buffer_t exported_name" .Fc .Ft OM_uint32 @@ -201,7 +201,7 @@ .Ft OM_uint32 .Fo gss_get_mic .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "gss_qop_t qop_req" .Fa "const gss_buffer_t message_buffer" .Fa "gss_buffer_t message_token" @@ -227,9 +227,9 @@ .Ft OM_uint32 .Fo gss_init_sec_context .Fa "OM_uint32 * minor_status" -.Fa "const gss_cred_id_t initiator_cred_handle" +.Fa "gss_const_cred_id_t initiator_cred_handle" .Fa "gss_ctx_id_t * context_handle" -.Fa "const gss_name_t target_name" +.Fa "gss_const_name_t target_name" .Fa "const gss_OID mech_type" .Fa "OM_uint32 req_flags" .Fa "OM_uint32 time_req" @@ -243,7 +243,7 @@ .Ft OM_uint32 .Fo gss_inquire_context .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "gss_name_t * src_name" .Fa "gss_name_t * targ_name" .Fa "OM_uint32 * lifetime_rec" @@ -255,7 +255,7 @@ .Ft OM_uint32 .Fo gss_inquire_cred .Fa "OM_uint32 * minor_status" -.Fa "const gss_cred_id_t cred_handle" +.Fa "gss_const_cred_id_t cred_handle" .Fa "gss_name_t * name" .Fa "OM_uint32 * lifetime" .Fa "gss_cred_usage_t * cred_usage" @@ -264,7 +264,7 @@ .Ft OM_uint32 .Fo gss_inquire_cred_by_mech .Fa "OM_uint32 * minor_status" -.Fa "const gss_cred_id_t cred_handle" +.Fa "gss_const_cred_id_t cred_handle" .Fa "const gss_OID mech_type" .Fa "gss_name_t * name" .Fa "OM_uint32 * initiator_lifetime" @@ -274,7 +274,7 @@ .Ft OM_uint32 .Fo gss_inquire_mechs_for_name .Fa "OM_uint32 * minor_status" -.Fa "const gss_name_t input_name" +.Fa "gss_const_name_t input_name" .Fa "gss_OID_set * mech_types" .Fc .Ft OM_uint32 @@ -336,7 +336,7 @@ .Ft OM_uint32 .Fo gss_process_context_token .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "const gss_buffer_t token_buffer" .Fc .Ft OM_uint32 @@ -396,7 +396,7 @@ .Ft OM_uint32 .Fo gss_unwrap .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "const gss_buffer_t input_message_buffer" .Fa "gss_buffer_t output_message_buffer" .Fa "int * conf_state" @@ -413,7 +413,7 @@ .Ft OM_uint32 .Fo gss_verify_mic .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "const gss_buffer_t message_buffer" .Fa "const gss_buffer_t token_buffer" .Fa "gss_qop_t * qop_state" @@ -421,7 +421,7 @@ .Ft OM_uint32 .Fo gss_wrap .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "int conf_req_flag" .Fa "gss_qop_t qop_req" .Fa "const gss_buffer_t input_message_buffer" @@ -431,7 +431,7 @@ .Ft OM_uint32 .Fo gss_wrap_size_limit .Fa "OM_uint32 * minor_status" -.Fa "const gss_ctx_id_t context_handle" +.Fa "gss_const_ctx_id_t context_handle" .Fa "int conf_req_flag" .Fa "gss_qop_t qop_req" .Fa "OM_uint32 req_output_size" @@ -554,7 +554,7 @@ implementation supports. When compare the imported name of .Dv GSS_C_NO_OID -it may match serveral mechanism names (MN). +it may match several mechanism names (MN). .Pp The resulting name from .Fn gss_display_name @@ -584,7 +584,7 @@ .Fa lifetime_rec argument is set to .Dv GSS_C_INDEFINITE -(dont expire) or the number of seconds that the context is still valid. +(don't expire) or the number of seconds that the context is still valid. A value of 0 means that the context is expired. .Fa mech_type argument should be considered readonly and must not be released. diff --git a/crypto/heimdal/lib/gssapi/gss_acquire_cred.cat3 b/crypto/heimdal/lib/gssapi/gss_acquire_cred.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/gss_acquire_cred.cat3 @@ -0,0 +1,405 @@ +GSS_ACQUIRE_CRED(3) BSD Library Functions Manual GSS_ACQUIRE_CRED(3) + +NAME + gss_accept_sec_context, gss_acquire_cred, gss_add_cred, + gss_add_oid_set_member, gss_canonicalize_name, gss_compare_name, + gss_context_time, gss_create_empty_oid_set, gss_delete_sec_context, + gss_display_name, gss_display_status, gss_duplicate_name, + gss_export_name, gss_export_sec_context, gss_get_mic, gss_import_name, + gss_import_sec_context, gss_indicate_mechs, gss_init_sec_context, + gss_inquire_context, gss_inquire_cred, gss_inquire_cred_by_mech, + gss_inquire_mechs_for_name, gss_inquire_names_for_mech, + gss_krb5_ccache_name, gss_krb5_compat_des3_mic, gss_krb5_copy_ccache, + gss_krb5_import_cred gsskrb5_extract_authz_data_from_sec_context, + gsskrb5_register_acceptor_identity, gss_krb5_import_ccache, + gss_krb5_get_tkt_flags, gss_process_context_token, gss_release_buffer, + gss_release_cred, gss_release_name, gss_release_oid_set, gss_seal, + gss_sign, gss_test_oid_set_member, gss_unseal, gss_unwrap, gss_verify, + gss_verify_mic, gss_wrap, gss_wrap_size_limit -- Generic Security Service + Application Program Interface library + +LIBRARY + GSS-API library (libgssapi, -lgssapi) + +SYNOPSIS + #include  + + OM_uint32 + gss_accept_sec_context(OM_uint32 * minor_status, + gss_ctx_id_t * context_handle, + gss_const_cred_id_t acceptor_cred_handle, + const gss_buffer_t input_token_buffer, + const gss_channel_bindings_t input_chan_bindings, + gss_name_t * src_name, gss_OID * mech_type, + gss_buffer_t output_token, OM_uint32 * ret_flags, + OM_uint32 * time_rec, gss_cred_id_t * delegated_cred_handle); + + OM_uint32 + gss_acquire_cred(OM_uint32 * minor_status, gss_const_name_t desired_name, + OM_uint32 time_req, const gss_OID_set desired_mechs, + gss_cred_usage_t cred_usage, gss_cred_id_t * output_cred_handle, + gss_OID_set * actual_mechs, OM_uint32 * time_rec); + + OM_uint32 + gss_add_cred(OM_uint32 *minor_status, + gss_const_cred_id_t input_cred_handle, gss_const_name_t desired_name, + const gss_OID desired_mech, gss_cred_usage_t cred_usage, + OM_uint32 initiator_time_req, OM_uint32 acceptor_time_req, + gss_cred_id_t *output_cred_handle, gss_OID_set *actual_mechs, + OM_uint32 *initiator_time_rec, OM_uint32 *acceptor_time_rec); + + OM_uint32 + gss_add_oid_set_member(OM_uint32 * minor_status, + const gss_OID member_oid, gss_OID_set * oid_set); + + OM_uint32 + gss_canonicalize_name(OM_uint32 * minor_status, + gss_const_name_t input_name, const gss_OID mech_type, + gss_name_t * output_name); + + OM_uint32 + gss_compare_name(OM_uint32 * minor_status, gss_const_name_t name1, + gss_const_name_t name2, int * name_equal); + + OM_uint32 + gss_context_time(OM_uint32 * minor_status, + gss_const_ctx_id_t context_handle, OM_uint32 * time_rec); + + OM_uint32 + gss_create_empty_oid_set(OM_uint32 * minor_status, + gss_OID_set * oid_set); + + OM_uint32 + gss_delete_sec_context(OM_uint32 * minor_status, + gss_ctx_id_t * context_handle, gss_buffer_t output_token); + + OM_uint32 + gss_display_name(OM_uint32 * minor_status, gss_const_name_t input_name, + gss_buffer_t output_name_buffer, gss_OID * output_name_type); + + OM_uint32 + gss_display_status(OM_uint32 *minor_status, OM_uint32 status_value, + int status_type, const gss_OID mech_type, OM_uint32 *message_context, + gss_buffer_t status_string); + + OM_uint32 + gss_duplicate_name(OM_uint32 * minor_status, gss_const_name_t src_name, + gss_name_t * dest_name); + + OM_uint32 + gss_export_name(OM_uint32 * minor_status, gss_const_name_t input_name, + gss_buffer_t exported_name); + + OM_uint32 + gss_export_sec_context(OM_uint32 * minor_status, + gss_ctx_id_t * context_handle, gss_buffer_t interprocess_token); + + OM_uint32 + gss_get_mic(OM_uint32 * minor_status, gss_const_ctx_id_t context_handle, + gss_qop_t qop_req, const gss_buffer_t message_buffer, + gss_buffer_t message_token); + + OM_uint32 + gss_import_name(OM_uint32 * minor_status, + const gss_buffer_t input_name_buffer, const gss_OID input_name_type, + gss_name_t * output_name); + + OM_uint32 + gss_import_sec_context(OM_uint32 * minor_status, + const gss_buffer_t interprocess_token, + gss_ctx_id_t * context_handle); + + OM_uint32 + gss_indicate_mechs(OM_uint32 * minor_status, gss_OID_set * mech_set); + + OM_uint32 + gss_init_sec_context(OM_uint32 * minor_status, + gss_const_cred_id_t initiator_cred_handle, + gss_ctx_id_t * context_handle, gss_const_name_t target_name, + const gss_OID mech_type, OM_uint32 req_flags, OM_uint32 time_req, + const gss_channel_bindings_t input_chan_bindings, + const gss_buffer_t input_token, gss_OID * actual_mech_type, + gss_buffer_t output_token, OM_uint32 * ret_flags, + OM_uint32 * time_rec); + + OM_uint32 + gss_inquire_context(OM_uint32 * minor_status, + gss_const_ctx_id_t context_handle, gss_name_t * src_name, + gss_name_t * targ_name, OM_uint32 * lifetime_rec, + gss_OID * mech_type, OM_uint32 * ctx_flags, int * locally_initiated, + int * open_context); + + OM_uint32 + gss_inquire_cred(OM_uint32 * minor_status, + gss_const_cred_id_t cred_handle, gss_name_t * name, + OM_uint32 * lifetime, gss_cred_usage_t * cred_usage, + gss_OID_set * mechanisms); + + OM_uint32 + gss_inquire_cred_by_mech(OM_uint32 * minor_status, + gss_const_cred_id_t cred_handle, const gss_OID mech_type, + gss_name_t * name, OM_uint32 * initiator_lifetime, + OM_uint32 * acceptor_lifetime, gss_cred_usage_t * cred_usage); + + OM_uint32 + gss_inquire_mechs_for_name(OM_uint32 * minor_status, + gss_const_name_t input_name, gss_OID_set * mech_types); + + OM_uint32 + gss_inquire_names_for_mech(OM_uint32 * minor_status, + const gss_OID mechanism, gss_OID_set * name_types); + + OM_uint32 + gss_krb5_ccache_name(OM_uint32 *minor, const char *name, + const char **old_name); + + OM_uint32 + gss_krb5_copy_ccache(OM_uint32 *minor, gss_cred_id_t cred, + krb5_ccache out); + + OM_uint32 + gss_krb5_import_cred(OM_uint32 *minor_status, krb5_ccache id, + krb5_principal keytab_principal, krb5_keytab keytab, + gss_cred_id_t *cred); + + OM_uint32 + gss_krb5_compat_des3_mic(OM_uint32 * minor_status, + gss_ctx_id_t context_handle, int onoff); + + OM_uint32 + gsskrb5_extract_authz_data_from_sec_context(OM_uint32 *minor_status, + gss_ctx_id_t context_handle, int ad_type, gss_buffer_t ad_data); + + OM_uint32 + gsskrb5_register_acceptor_identity(const char *identity); + + OM_uint32 + gss_krb5_import_cache(OM_uint32 *minor, krb5_ccache id, + krb5_keytab keytab, gss_cred_id_t *cred); + + OM_uint32 + gss_krb5_get_tkt_flags(OM_uint32 *minor_status, + gss_ctx_id_t context_handle, OM_uint32 *tkt_flags); + + OM_uint32 + gss_process_context_token(OM_uint32 * minor_status, + gss_const_ctx_id_t context_handle, const gss_buffer_t token_buffer); + + OM_uint32 + gss_release_buffer(OM_uint32 * minor_status, gss_buffer_t buffer); + + OM_uint32 + gss_release_cred(OM_uint32 * minor_status, gss_cred_id_t * cred_handle); + + OM_uint32 + gss_release_name(OM_uint32 * minor_status, gss_name_t * input_name); + + OM_uint32 + gss_release_oid_set(OM_uint32 * minor_status, gss_OID_set * set); + + OM_uint32 + gss_seal(OM_uint32 * minor_status, gss_ctx_id_t context_handle, + int conf_req_flag, int qop_req, gss_buffer_t input_message_buffer, + int * conf_state, gss_buffer_t output_message_buffer); + + OM_uint32 + gss_sign(OM_uint32 * minor_status, gss_ctx_id_t context_handle, + int qop_req, gss_buffer_t message_buffer, + gss_buffer_t message_token); + + OM_uint32 + gss_test_oid_set_member(OM_uint32 * minor_status, const gss_OID member, + const gss_OID_set set, int * present); + + OM_uint32 + gss_unseal(OM_uint32 * minor_status, gss_ctx_id_t context_handle, + gss_buffer_t input_message_buffer, + gss_buffer_t output_message_buffer, int * conf_state, + int * qop_state); + + OM_uint32 + gss_unwrap(OM_uint32 * minor_status, gss_const_ctx_id_t context_handle, + const gss_buffer_t input_message_buffer, + gss_buffer_t output_message_buffer, int * conf_state, + gss_qop_t * qop_state); + + OM_uint32 + gss_verify(OM_uint32 * minor_status, gss_ctx_id_t context_handle, + gss_buffer_t message_buffer, gss_buffer_t token_buffer, + int * qop_state); + + OM_uint32 + gss_verify_mic(OM_uint32 * minor_status, + gss_const_ctx_id_t context_handle, const gss_buffer_t message_buffer, + const gss_buffer_t token_buffer, gss_qop_t * qop_state); + + OM_uint32 + gss_wrap(OM_uint32 * minor_status, gss_const_ctx_id_t context_handle, + int conf_req_flag, gss_qop_t qop_req, + const gss_buffer_t input_message_buffer, int * conf_state, + gss_buffer_t output_message_buffer); + + OM_uint32 + gss_wrap_size_limit(OM_uint32 * minor_status, + gss_const_ctx_id_t context_handle, int conf_req_flag, + gss_qop_t qop_req, OM_uint32 req_output_size, + OM_uint32 * max_input_size); + +DESCRIPTION + Generic Security Service API (GSS-API) version 2, and its C binding, is + described in RFC2743 and RFC2744. Version 1 (deprecated) of the C bind- + ing is described in RFC1509. + + Heimdals GSS-API implementation supports the following mechanisms + + +o GSS_KRB5_MECHANISM + + +o GSS_SPNEGO_MECHANISM + + GSS-API have generic name types that all mechanism are supposed to imple- + ment (if possible): + + +o GSS_C_NT_USER_NAME + + +o GSS_C_NT_MACHINE_UID_NAME + + +o GSS_C_NT_STRING_UID_NAME + + +o GSS_C_NT_HOSTBASED_SERVICE + + +o GSS_C_NT_ANONYMOUS + + +o GSS_C_NT_EXPORT_NAME + + GSS-API implementations that supports Kerberos 5 have some additional + name types: + + +o GSS_KRB5_NT_PRINCIPAL_NAME + + +o GSS_KRB5_NT_USER_NAME + + +o GSS_KRB5_NT_MACHINE_UID_NAME + + +o GSS_KRB5_NT_STRING_UID_NAME + + In GSS-API, names have two forms, internal names and contiguous string + names. + + +o Internal name and mechanism name + + Internal names are implementation specific representation of a GSS- + API name. Mechanism names special form of internal names corresponds + to one and only one mechanism. + + In GSS-API an internal name is stored in a gss_name_t. + + +o Contiguous string name and exported name + + Contiguous string names are gssapi names stored in a OCTET STRING + that together with a name type identifier (OID) uniquely specifies a + gss-name. A special form of the contiguous string name is the ex- + ported name that have a OID embedded in the string to make it unique. + Exported name have the nametype GSS_C_NT_EXPORT_NAME. + + In GSS-API an contiguous string name is stored in a gss_buffer_t. + + Exported names also have the property that they are specified by the + mechanism itself and compatible between different GSS-API implementa- + tions. + +ACCESS CONTROL + There are two ways of comparing GSS-API names, either comparing two in- + ternal names with each other or two contiguous string names with either + other. + + To compare two internal names with each other, import (if needed) the + names with gss_import_name() into the GSS-API implementation and the com- + pare the imported name with gss_compare_name(). + + Importing names can be slow, so when its possible to store exported names + in the access control list, comparing contiguous string name might be + better. + + when comparing contiguous string name, first export them into a + GSS_C_NT_EXPORT_NAME name with gss_export_name() and then compare with + memcmp(3). + + Note that there are might be a difference between the two methods of com- + paring names. The first (using gss_compare_name()) will compare to + (unauthenticated) names are the same. The second will compare if a mech- + anism will authenticate them as the same principal. + + For example, if gss_import_name() name was used with GSS_C_NO_OID the de- + fault syntax is used for all mechanism the GSS-API implementation sup- + ports. When compare the imported name of GSS_C_NO_OID it may match sev- + eral mechanism names (MN). + + The resulting name from gss_display_name() must not be used for acccess + control. + +FUNCTIONS + gss_display_name() takes the gss name in input_name and puts a printable + form in output_name_buffer. output_name_buffer should be freed when done + using gss_release_buffer(). output_name_type can either be NULL or a + pointer to a gss_OID and will in the latter case contain the OID type of + the name. The name must only be used for printing. If access control is + needed, see section ACCESS CONTROL. + + gss_inquire_context() returns information about the context. Information + is available even after the context have expired. lifetime_rec argument + is set to GSS_C_INDEFINITE (don't expire) or the number of seconds that + the context is still valid. A value of 0 means that the context is ex- + pired. mech_type argument should be considered readonly and must not be + released. src_name and dest_name() are both mechanims names and must be + released with gss_release_name() when no longer used. + + gss_context_time will return the amount of time (in seconds) of the con- + text is still valid. If its expired time_rec will be set to 0 and + GSS_S_CONTEXT_EXPIRED returned. + + gss_sign(), gss_verify(), gss_seal(), and gss_unseal() are part of the + GSS-API V1 interface and are obsolete. The functions should not be used + for new applications. They are provided so that version 1 applications + can link against the library. + +EXTENSIONS + gss_krb5_ccache_name() sets the internal kerberos 5 credential cache name + to name. The old name is returned in old_name, and must not be freed. + The data allocated for old_name is free upon next call to + gss_krb5_ccache_name(). This function is not threadsafe if old_name ar- + gument is used. + + gss_krb5_copy_ccache() will extract the krb5 credentials that are trans- + ferred from the initiator to the acceptor when using token delegation in + the Kerberos mechanism. The acceptor receives the delegated token in the + last argument to gss_accept_sec_context(). + + gss_krb5_import_cred() will import the krb5 credentials (both keytab + and/or credential cache) into gss credential so it can be used withing + GSS-API. The ccache is copied by reference and thus shared, so if the + credential is destroyed with krb5_cc_destroy, all users of thep + gss_cred_id_t returned by gss_krb5_import_ccache() will fail. + + gsskrb5_register_acceptor_identity() sets the Kerberos 5 filebased keytab + that the acceptor will use. The identifier is the file name. + + gsskrb5_extract_authz_data_from_sec_context() extracts the Kerberos au- + thorizationdata that may be stored within the context. Tha caller must + free the returned buffer ad_data with gss_release_buffer() upon success. + + gss_krb5_get_tkt_flags() return the ticket flags for the kerberos ticket + receive when authenticating the initiator. Only valid on the acceptor + context. + + gss_krb5_compat_des3_mic() turns on or off the compatibility with older + version of Heimdal using des3 get and verify mic, this is way to program- + matically set the [gssapi]broken_des3_mic and [gssapi]correct_des3_mic + flags (see COMPATIBILITY section in gssapi(3)). If the CPP symbol + GSS_C_KRB5_COMPAT_DES3_MIC is present, gss_krb5_compat_des3_mic() exists. + gss_krb5_compat_des3_mic() will be removed in a later version of the GSS- + API library. + +SEE ALSO + gssapi(3), krb5(3), krb5_ccache(3), kerberos(8) + +HEIMDAL October 26, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/gssapi/gssapi.cat3 b/crypto/heimdal/lib/gssapi/gssapi.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/gssapi.cat3 @@ -0,0 +1,114 @@ +GSSAPI(3) BSD Library Functions Manual GSSAPI(3) + +NAME + gssapi -- Generic Security Service Application Program Interface library + +LIBRARY + GSS-API Library (libgssapi, -lgssapi) + +DESCRIPTION + The Generic Security Service Application Program Interface (GSS-API) pro- + vides security services to callers in a generic fashion, supportable with + a range of underlying mechanisms and technologies and hence allowing + source-level portability of applications to different environments. + + The GSS-API implementation in Heimdal implements the Kerberos 5 and the + SPNEGO GSS-API security mechanisms. + +LIST OF FUNCTIONS + These functions constitute the gssapi library, libgssapi. Declarations + for these functions may be obtained from the include file gssapi.h. + Name/Page + gss_accept_sec_context(3) + gss_acquire_cred(3) + gss_add_cred(3) + gss_add_oid_set_member(3) + gss_canonicalize_name(3) + gss_compare_name(3) + gss_context_time(3) + gss_create_empty_oid_set(3) + gss_delete_sec_context(3) + gss_display_name(3) + gss_display_status(3) + gss_duplicate_name(3) + gss_export_name(3) + gss_export_sec_context(3) + gss_get_mic(3) + gss_import_name(3) + gss_import_sec_context(3) + gss_indicate_mechs(3) + gss_init_sec_context(3) + gss_inquire_context(3) + gss_inquire_cred(3) + gss_inquire_cred_by_mech(3) + gss_inquire_mechs_for_name(3) + gss_inquire_names_for_mech(3) + gss_krb5_ccache_name(3) + gss_krb5_compat_des3_mic(3) + gss_krb5_copy_ccache(3) + gss_krb5_extract_authz_data_from_sec_context(3) + gss_krb5_import_ccache(3) + gss_process_context_token(3) + gss_release_buffer(3) + gss_release_cred(3) + gss_release_name(3) + gss_release_oid_set(3) + gss_seal(3) + gss_sign(3) + gss_test_oid_set_member(3) + gss_unseal(3) + gss_unwrap(3) + gss_verify(3) + gss_verify_mic(3) + gss_wrap(3) + gss_wrap_size_limit(3) + +COMPATIBILITY + The Heimdal GSS-API implementation had a bug in releases before 0.6 that + made it fail to inter-operate when using DES3 with other GSS-API imple- + mentations when using gss_get_mic() / gss_verify_mic(). It is possible + to modify the behavior of the generator of the MIC with the krb5.conf + configuration file so that old clients/servers will still work. + + New clients/servers will try both the old and new MIC in Heimdal 0.6. In + 0.7 it will check only if configured - the compatibility code will be re- + moved in 0.8. + + Heimdal 0.6 still generates by default the broken GSS-API DES3 mic, this + will change in 0.7 to generate correct des3 mic. + + To turn on compatibility with older clients and servers, change the + [gssapi] broken_des3_mic in krb5.conf that contains a list of globbing + expressions that will be matched against the server name. To turn off + generation of the old (incompatible) mic of the MIC use [gssapi] + correct_des3_mic. + + If a match for a entry is in both [gssapi] correct_des3_mic and [gssapi] + broken_des3_mic, the later will override. + + This config option modifies behaviour for both clients and servers. + + Microsoft implemented SPNEGO to Windows2000, however, they managed to get + it wrong, their implementation didn't fill in the MechListMIC in the re- + ply token with the right content. There is a work around for this prob- + lem, but not all implementation support it. + + Heimdal defaults to correct SPNEGO when the the kerberos implementation + uses CFX, or when it is configured by the user. To turn on compatibility + with peers, use option [gssapi] require_mechlist_mic. + +EXAMPLES + [gssapi] + broken_des3_mic = cvs/*@SU.SE + broken_des3_mic = host/*@E.KTH.SE + correct_des3_mic = host/*@SU.SE + require_mechlist_mic = host/*@SU.SE + +BUGS + All of 0.5.x versions of heimdal had broken token delegations in the + client side, the server side was correct. + +SEE ALSO + krb5(3), krb5.conf(5), kerberos(8) + +BSD April 20, 2005 BSD diff --git a/crypto/heimdal/lib/gssapi/gssapi/gssapi.h b/crypto/heimdal/lib/gssapi/gssapi/gssapi.h --- a/crypto/heimdal/lib/gssapi/gssapi/gssapi.h +++ b/crypto/heimdal/lib/gssapi/gssapi/gssapi.h @@ -95,7 +95,7 @@ struct gss_ctx_id_t_desc_struct; typedef struct gss_ctx_id_t_desc_struct *gss_ctx_id_t; -typedef const struct gss_ctx_id_t_desc_struct gss_const_ctx_id_t; +typedef const struct gss_ctx_id_t_desc_struct *gss_const_ctx_id_t; typedef struct gss_OID_desc_struct { OM_uint32 length; @@ -470,7 +470,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_acquire_cred (OM_uint32 * /*minor_status*/, - const gss_name_t /*desired_name*/, + gss_const_name_t /*desired_name*/, OM_uint32 /*time_req*/, const gss_OID_set /*desired_mechs*/, gss_cred_usage_t /*cred_usage*/, @@ -486,9 +486,9 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_init_sec_context (OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*initiator_cred_handle*/, + gss_const_cred_id_t /*initiator_cred_handle*/, gss_ctx_id_t * /*context_handle*/, - const gss_name_t /*target_name*/, + gss_const_name_t /*target_name*/, const gss_OID /*mech_type*/, OM_uint32 /*req_flags*/, OM_uint32 /*time_req*/, @@ -503,7 +503,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_accept_sec_context (OM_uint32 * /*minor_status*/, gss_ctx_id_t * /*context_handle*/, - const gss_cred_id_t /*acceptor_cred_handle*/, + gss_const_cred_id_t /*acceptor_cred_handle*/, const gss_buffer_t /*input_token_buffer*/, const gss_channel_bindings_t /*input_chan_bindings*/, gss_name_t * /*src_name*/, @@ -516,7 +516,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_process_context_token (OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*token_buffer*/ ); @@ -528,13 +528,13 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_context_time (OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, OM_uint32 * /*time_rec*/ ); GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_get_mic (OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*message_buffer*/, gss_buffer_t /*message_token*/ @@ -542,7 +542,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_verify_mic (OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*message_buffer*/, const gss_buffer_t /*token_buffer*/, gss_qop_t * /*qop_state*/ @@ -550,7 +550,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap (OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*input_message_buffer*/, @@ -560,7 +560,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_unwrap (OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*input_message_buffer*/, gss_buffer_t /*output_message_buffer*/, int * /*conf_state*/, @@ -583,14 +583,14 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_compare_name (OM_uint32 * /*minor_status*/, - const gss_name_t /*name1*/, - const gss_name_t /*name2*/, + gss_const_name_t /*name1*/, + gss_const_name_t /*name2*/, int * /*name_equal*/ ); GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_display_name (OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t /*output_name_buffer*/, gss_OID * /*output_name_type*/ ); @@ -604,7 +604,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_export_name (OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t /*exported_name*/ ); @@ -625,7 +625,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_cred (OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, gss_name_t * /*name*/, OM_uint32 * /*lifetime*/, gss_cred_usage_t * /*cred_usage*/, @@ -634,7 +634,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_context ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_name_t * /*src_name*/, gss_name_t * /*targ_name*/, OM_uint32 * /*lifetime_rec*/, @@ -646,7 +646,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_wrap_size_limit ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, OM_uint32 /*req_output_size*/, @@ -655,8 +655,8 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_cred ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*input_cred_handle*/, - const gss_name_t /*desired_name*/, + gss_const_cred_id_t /*input_cred_handle*/, + gss_const_name_t /*desired_name*/, const gss_OID /*desired_mech*/, gss_cred_usage_t /*cred_usage*/, OM_uint32 /*initiator_time_req*/, @@ -669,7 +669,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_cred_by_mech ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, const gss_OID /*mech_type*/, gss_name_t * /*name*/, OM_uint32 * /*initiator_lifetime*/, @@ -715,20 +715,20 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_mechs_for_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_OID_set * /*mech_types*/ ); GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_canonicalize_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, const gss_OID /*mech_type*/, gss_name_t * /*output_name*/ ); GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_duplicate_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*src_name*/, + gss_const_name_t /*src_name*/, gss_name_t * /*dest_name*/ ); @@ -754,7 +754,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_sec_context_by_oid( OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_OID desired_object, gss_buffer_set_t *data_set ); @@ -792,7 +792,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_cred_by_oid(OM_uint32 *minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID desired_object, gss_buffer_set_t *data_set); @@ -844,7 +844,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_context_query_attributes(OM_uint32 * /* minor_status */, - const gss_ctx_id_t /* context_handle */, + gss_const_ctx_id_t /* context_handle */, const gss_OID /* attribute */, void * /*data*/, size_t /* len */); @@ -934,6 +934,13 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_release_iov_buffer(OM_uint32 *, gss_iov_buffer_desc *, int); +GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL +gss_wrap_aead(OM_uint32 *, gss_ctx_id_t, int, gss_qop_t, + gss_buffer_t, gss_buffer_t, int *, gss_buffer_t); + +GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL +gss_unwrap_aead(OM_uint32 *, gss_ctx_id_t, gss_buffer_t, + gss_buffer_t, gss_buffer_t, int *, gss_qop_t *); GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_export_cred(OM_uint32 * /* minor_status */, @@ -1004,7 +1011,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_acquire_cred_with_password (OM_uint32 * /*minor_status*/, - const gss_name_t /*desired_name*/, + gss_const_name_t /*desired_name*/, const gss_buffer_t /*password*/, OM_uint32 /*time_req*/, const gss_OID_set /*desired_mechs*/, @@ -1016,8 +1023,8 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_cred_with_password ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*input_cred_handle*/, - const gss_name_t /*desired_name*/, + gss_const_cred_id_t /*input_cred_handle*/, + gss_const_name_t /*desired_name*/, const gss_OID /*desired_mech*/, const gss_buffer_t /*password*/, gss_cred_usage_t /*cred_usage*/, @@ -1029,21 +1036,28 @@ OM_uint32 * /*acceptor_time_rec*/ ); +GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL +gss_localname( + OM_uint32 *minor, + gss_const_name_t name, + const gss_OID mech_type, + gss_buffer_t localname); + GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_pname_to_uid( OM_uint32 *minor, - const gss_name_t name, + gss_const_name_t name, const gss_OID mech_type, uid_t *uidOut); GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_authorize_localname( OM_uint32 *minor, - const gss_name_t name, - const gss_name_t user); + gss_const_name_t name, + gss_const_name_t user); GSSAPI_LIB_FUNCTION int GSSAPI_LIB_CALL -gss_userok(const gss_name_t name, +gss_userok(gss_const_name_t name, const char *user); extern GSSAPI_LIB_VARIABLE gss_buffer_desc __gss_c_attr_local_login_user; diff --git a/crypto/heimdal/lib/gssapi/gssapi/gssapi_krb5.h b/crypto/heimdal/lib/gssapi/gssapi/gssapi_krb5.h --- a/crypto/heimdal/lib/gssapi/gssapi/gssapi_krb5.h +++ b/crypto/heimdal/lib/gssapi/gssapi/gssapi_krb5.h @@ -36,7 +36,8 @@ #ifndef GSSAPI_KRB5_H_ #define GSSAPI_KRB5_H_ -#include +#include +#include GSSAPI_CPP_START @@ -60,9 +61,6 @@ #define GSS_KRB5_NT_MACHINE_UID_NAME (&__gss_c_nt_machine_uid_name_oid_desc) #define GSS_KRB5_NT_STRING_UID_NAME (&__gss_c_nt_string_uid_name_oid_desc) -extern gss_OID_desc GSSAPI_LIB_VARIABLE __gss_krb5_mechanism_oid_desc; -#define GSS_KRB5_MECHANISM (&__gss_krb5_mechanism_oid_desc) - /* for compatibility with MIT api */ #define gss_mech_krb5 GSS_KRB5_MECHANISM diff --git a/crypto/heimdal/lib/gssapi/gssapi/gssapi_netlogon.h b/crypto/heimdal/lib/gssapi/gssapi/gssapi_netlogon.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/gssapi/gssapi_netlogon.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006 - 2009 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef GSSAPI_NETLOGON_H_ +#define GSSAPI_NETLOGON_H_ + +#include + +GSSAPI_CPP_START + +extern GSSAPI_LIB_VARIABLE gss_OID GSS_NETLOGON_MECHANISM; +extern GSSAPI_LIB_VARIABLE gss_OID GSS_NETLOGON_NT_NETBIOS_DNS_NAME; +extern GSSAPI_LIB_VARIABLE gss_OID GSS_NETLOGON_SET_SESSION_KEY_X; +extern GSSAPI_LIB_VARIABLE gss_OID GSS_NETLOGON_SET_SIGN_ALGORITHM_X; + +GSSAPI_CPP_END + +#endif /* GSSAPI_NETLOGON_H_ */ diff --git a/crypto/heimdal/lib/gssapi/gssapi_mech.h b/crypto/heimdal/lib/gssapi/gssapi_mech.h --- a/crypto/heimdal/lib/gssapi/gssapi_mech.h +++ b/crypto/heimdal/lib/gssapi/gssapi_mech.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ + * $FreeBSD: src/lib/libgssapi/mech_switch.h,v 1.1 2005/12/29 14:40:20 dfr Exp $ */ #ifndef GSSAPI_MECH_H @@ -33,7 +33,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_acquire_cred_t (OM_uint32 *, /* minor_status */ - const gss_name_t, /* desired_name */ + gss_const_name_t, /* desired_name */ OM_uint32, /* time_req */ const gss_OID_set, /* desired_mechs */ gss_cred_usage_t, /* cred_usage */ @@ -49,9 +49,9 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_init_sec_context_t (OM_uint32 *, /* minor_status */ - const gss_cred_id_t, /* initiator_cred_handle */ + gss_const_cred_id_t, /* initiator_cred_handle */ gss_ctx_id_t *, /* context_handle */ - const gss_name_t, /* target_name */ + gss_const_name_t, /* target_name */ const gss_OID, /* mech_type */ OM_uint32, /* req_flags */ OM_uint32, /* time_req */ @@ -67,7 +67,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_accept_sec_context_t (OM_uint32 *, /* minor_status */ gss_ctx_id_t *, /* context_handle */ - const gss_cred_id_t, /* acceptor_cred_handle */ + gss_const_cred_id_t, /* acceptor_cred_handle */ const gss_buffer_t, /* input_token_buffer */ const gss_channel_bindings_t, /* input_chan_bindings */ @@ -81,7 +81,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_process_context_token_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ const gss_buffer_t /* token_buffer */ ); @@ -93,13 +93,13 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_context_time_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ OM_uint32 * /* time_rec */ ); typedef OM_uint32 GSSAPI_CALLCONV _gss_get_mic_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ gss_qop_t, /* qop_req */ const gss_buffer_t, /* message_buffer */ gss_buffer_t /* message_token */ @@ -107,7 +107,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_verify_mic_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ const gss_buffer_t, /* message_buffer */ const gss_buffer_t, /* token_buffer */ gss_qop_t * /* qop_state */ @@ -115,7 +115,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_wrap_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ int, /* conf_req_flag */ gss_qop_t, /* qop_req */ const gss_buffer_t, /* input_message_buffer */ @@ -125,7 +125,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_unwrap_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ const gss_buffer_t, /* input_message_buffer */ gss_buffer_t, /* output_message_buffer */ int *, /* conf_state */ @@ -148,14 +148,14 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_compare_name_t (OM_uint32 *, /* minor_status */ - const gss_name_t, /* name1 */ - const gss_name_t, /* name2 */ + gss_const_name_t, /* name1 */ + gss_const_name_t, /* name2 */ int * /* name_equal */ ); typedef OM_uint32 GSSAPI_CALLCONV _gss_display_name_t (OM_uint32 *, /* minor_status */ - const gss_name_t, /* input_name */ + gss_const_name_t, /* input_name */ gss_buffer_t, /* output_name_buffer */ gss_OID * /* output_name_type */ ); @@ -169,7 +169,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_export_name_t (OM_uint32 *, /* minor_status */ - const gss_name_t, /* input_name */ + gss_const_name_t, /* input_name */ gss_buffer_t /* exported_name */ ); @@ -180,7 +180,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_inquire_cred_t (OM_uint32 *, /* minor_status */ - const gss_cred_id_t, /* cred_handle */ + gss_const_cred_id_t, /* cred_handle */ gss_name_t *, /* name */ OM_uint32 *, /* lifetime */ gss_cred_usage_t *, /* cred_usage */ @@ -189,7 +189,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_inquire_context_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ gss_name_t *, /* src_name */ gss_name_t *, /* targ_name */ OM_uint32 *, /* lifetime_rec */ @@ -201,7 +201,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_wrap_size_limit_t (OM_uint32 *, /* minor_status */ - const gss_ctx_id_t, /* context_handle */ + gss_const_ctx_id_t, /* context_handle */ int, /* conf_req_flag */ gss_qop_t, /* qop_req */ OM_uint32, /* req_output_size */ @@ -210,8 +210,8 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_add_cred_t ( OM_uint32 *, /* minor_status */ - const gss_cred_id_t, /* input_cred_handle */ - const gss_name_t, /* desired_name */ + gss_const_cred_id_t, /* input_cred_handle */ + gss_const_name_t, /* desired_name */ const gss_OID, /* desired_mech */ gss_cred_usage_t, /* cred_usage */ OM_uint32, /* initiator_time_req */ @@ -224,7 +224,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_inquire_cred_by_mech_t ( OM_uint32 *, /* minor_status */ - const gss_cred_id_t, /* cred_handle */ + gss_const_cred_id_t, /* cred_handle */ const gss_OID, /* mech_type */ gss_name_t *, /* name */ OM_uint32 *, /* initiator_lifetime */ @@ -252,33 +252,33 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_inquire_mechs_for_name_t ( OM_uint32 *, /* minor_status */ - const gss_name_t, /* input_name */ + gss_const_name_t, /* input_name */ gss_OID_set * /* mech_types */ ); typedef OM_uint32 GSSAPI_CALLCONV _gss_canonicalize_name_t ( OM_uint32 *, /* minor_status */ - const gss_name_t, /* input_name */ + gss_const_name_t, /* input_name */ const gss_OID, /* mech_type */ gss_name_t * /* output_name */ ); typedef OM_uint32 GSSAPI_CALLCONV _gss_duplicate_name_t ( OM_uint32 *, /* minor_status */ - const gss_name_t, /* src_name */ + gss_const_name_t, /* src_name */ gss_name_t * /* dest_name */ ); typedef OM_uint32 GSSAPI_CALLCONV _gss_inquire_sec_context_by_oid ( OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_OID desired_object, gss_buffer_set_t *data_set ); typedef OM_uint32 GSSAPI_CALLCONV _gss_inquire_cred_by_oid ( OM_uint32 *minor_status, - const gss_cred_id_t cred, + gss_const_cred_id_t cred, const gss_OID desired_object, gss_buffer_set_t *data_set ); @@ -356,7 +356,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_acquire_cred_ext_t(OM_uint32 * /*minor_status */, - const gss_name_t /* desired_name */, + gss_const_name_t /* desired_name */, gss_const_OID /* credential_type */, const void * /* credential_data */, OM_uint32 /* time_req */, @@ -460,16 +460,16 @@ int (*set)(gss_const_OID, gss_mo_desc *, int, gss_buffer_t); }; -typedef OM_uint32 GSSAPI_CALLCONV _gss_pname_to_uid_t ( +typedef OM_uint32 GSSAPI_CALLCONV _gss_localname_t ( OM_uint32 *, /* minor_status */ - const gss_name_t, /* name */ + gss_const_name_t, /* name */ const gss_OID, /* mech_type */ - uid_t * /* uidOut */ + gss_buffer_t /* localname */ ); typedef OM_uint32 GSSAPI_CALLCONV _gss_authorize_localname_t ( OM_uint32 *, /* minor_status */ - const gss_name_t, /* name */ + gss_const_name_t, /* name */ gss_const_buffer_t, /* user */ gss_const_OID /* user_name_type */ ); @@ -536,7 +536,7 @@ _gss_cred_label_set_t *gm_cred_label_set; gss_mo_desc *gm_mo; size_t gm_mo_num; - _gss_pname_to_uid_t *gm_pname_to_uid; + _gss_localname_t *gm_localname; _gss_authorize_localname_t *gm_authorize_localname; _gss_display_name_ext_t *gm_display_name_ext; _gss_inquire_name_t *gm_inquire_name; @@ -582,7 +582,7 @@ OM_uint32 _gss_acquire_cred_ext (OM_uint32 * /*minor_status*/, - const gss_name_t /*desired_name*/, + gss_const_name_t /*desired_name*/, gss_const_OID /*credential_type*/, const void * /*credential_data*/, OM_uint32 /*time_req*/, diff --git a/crypto/heimdal/lib/gssapi/gsstool.c b/crypto/heimdal/lib/gssapi/gsstool.c --- a/crypto/heimdal/lib/gssapi/gsstool.c +++ b/crypto/heimdal/lib/gssapi/gsstool.c @@ -72,7 +72,7 @@ #define COL_SASL "SASL" int -supported_mechanisms(void *argptr, int argc, char **argv) +mechanisms(void *argptr, int argc, char **argv) { OM_uint32 maj_stat, min_stat; gss_OID_set mechs; @@ -184,7 +184,7 @@ int -attrs_for_mech(struct attrs_for_mech_options *opt, int argc, char **argv) +attributes(struct attributes_options *opt, int argc, char **argv) { gss_OID_set mech_attr = NULL, known_mech_attrs = NULL; gss_OID mech = GSS_C_NO_OID; @@ -229,9 +229,10 @@ int main(int argc, char **argv) { - int optidx = 0; + int exit_status = 0, ret, optidx = 0; setprogname(argv[0]); + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); @@ -246,10 +247,18 @@ argc -= optidx; argv += optidx; - if (argc == 0) { - help(NULL, argc, argv); - return 1; + if (argc != 0) { + ret = sl_command(commands, argc, argv); + if(ret == -1) + sl_did_you_mean(commands, argv[0]); + else if (ret == -2) + ret = 0; + if(ret != 0) + exit_status = 1; + } else { + sl_slc_help(commands, argc, argv); + exit_status = 1; } - return sl_command (commands, argc, argv); + return exit_status; } diff --git a/crypto/heimdal/lib/gssapi/krb5/8003.c b/crypto/heimdal/lib/gssapi/krb5/8003.c --- a/crypto/heimdal/lib/gssapi/krb5/8003.c +++ b/crypto/heimdal/lib/gssapi/krb5/8003.c @@ -157,7 +157,7 @@ *p++ = (fwd_data->length >> 8) & 0xFF; /* Dlgth */ memcpy(p, (unsigned char *) fwd_data->data, fwd_data->length); - p += fwd_data->length; + /* p += fwd_data->length; */ /* commented out to quiet warning */ } return GSS_S_COMPLETE; diff --git a/crypto/heimdal/lib/gssapi/krb5/accept_sec_context.c b/crypto/heimdal/lib/gssapi/krb5/accept_sec_context.c --- a/crypto/heimdal/lib/gssapi/krb5/accept_sec_context.c +++ b/crypto/heimdal/lib/gssapi/krb5/accept_sec_context.c @@ -104,7 +104,6 @@ void _gsskrb5i_is_cfx(krb5_context context, gsskrb5_ctx ctx, int acceptor) { - krb5_error_code ret; krb5_keyblock *key; if (acceptor) { @@ -144,7 +143,8 @@ } if (ctx->crypto) krb5_crypto_destroy(context, ctx->crypto); - ret = krb5_crypto_init(context, key, 0, &ctx->crypto); + /* XXX We really shouldn't ignore this; will come back to this */ + (void) krb5_crypto_init(context, key, 0, &ctx->crypto); } @@ -164,12 +164,13 @@ /* XXX Create a new delegated_cred_handle? */ if (delegated_cred_handle == NULL) { - kret = krb5_cc_default (context, &ccache); - } else { - *delegated_cred_handle = NULL; - kret = krb5_cc_new_unique (context, krb5_cc_type_memory, - NULL, &ccache); + ret = GSS_S_COMPLETE; + goto out; } + + *delegated_cred_handle = NULL; + kret = krb5_cc_new_unique (context, krb5_cc_type_memory, + NULL, &ccache); if (kret) { ctx->flags &= ~GSS_C_DELEG_FLAG; goto out; @@ -270,7 +271,7 @@ ctx, context, delegated_cred_handle); - if (ret) + if (ret != GSS_S_COMPLETE) return ret; } else { /* Well, looks like it wasn't there after all */ @@ -347,7 +348,7 @@ gsskrb5_acceptor_start(OM_uint32 * minor_status, gsskrb5_ctx ctx, krb5_context context, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token_buffer, const gss_channel_bindings_t input_chan_bindings, gss_name_t * src_name, @@ -363,6 +364,7 @@ krb5_flags ap_options; krb5_keytab keytab = NULL; int is_cfx = 0; + int close_kt = 0; const gsskrb5_cred acceptor_cred = (gsskrb5_cred)acceptor_cred_handle; /* @@ -384,8 +386,20 @@ * We need to get our keytab */ if (acceptor_cred == NULL) { - if (_gsskrb5_keytab != NULL) - keytab = _gsskrb5_keytab; + HEIMDAL_MUTEX_lock(&gssapi_keytab_mutex); + if (_gsskrb5_keytab != NULL) { + char *name = NULL; + kret = krb5_kt_get_full_name(context, _gsskrb5_keytab, &name); + if (kret == 0) { + kret = krb5_kt_resolve(context, name, &keytab); + krb5_xfree(name); + } + if (kret == 0) + close_kt = 1; + else + keytab = NULL; + } + HEIMDAL_MUTEX_unlock(&gssapi_keytab_mutex); } else if (acceptor_cred->keytab != NULL) { keytab = acceptor_cred->keytab; } @@ -408,6 +422,8 @@ if (kret) { if (in) krb5_rd_req_in_ctx_free(context, in); + if (close_kt) + krb5_kt_close(context, keytab); *minor_status = kret; return GSS_S_FAILURE; } @@ -418,6 +434,8 @@ server, in, &out); krb5_rd_req_in_ctx_free(context, in); + if (close_kt) + krb5_kt_close(context, keytab); if (kret == KRB5KRB_AP_ERR_SKEW || kret == KRB5KRB_AP_ERR_TKT_NYV) { /* * No reply in non-MUTUAL mode, but we don't know that its @@ -444,7 +462,7 @@ if (kret == 0) kret = krb5_rd_req_out_get_keyblock(context, out, &ctx->service_keyblock); - ctx->lifetime = ctx->ticket->ticket.endtime; + ctx->endtime = ctx->ticket->ticket.endtime; krb5_rd_req_out_ctx_free(context, out); if (kret) { @@ -465,6 +483,7 @@ if (kret) { ret = GSS_S_FAILURE; *minor_status = kret; + return ret; } kret = krb5_copy_principal(context, @@ -511,62 +530,61 @@ return ret; } - if (authenticator->cksum == NULL) { - krb5_free_authenticator(context, &authenticator); - *minor_status = 0; - return GSS_S_BAD_BINDINGS; - } - - if (authenticator->cksum->cksumtype == CKSUMTYPE_GSSAPI) { + if (authenticator->cksum != NULL + && authenticator->cksum->cksumtype == CKSUMTYPE_GSSAPI) { ret = _gsskrb5_verify_8003_checksum(minor_status, input_chan_bindings, authenticator->cksum, &ctx->flags, &ctx->fwd_data); - krb5_free_authenticator(context, &authenticator); if (ret) { + krb5_free_authenticator(context, &authenticator); return ret; } } else { - krb5_crypto crypto; - - kret = krb5_crypto_init(context, - ctx->auth_context->keyblock, - 0, &crypto); - if(kret) { - krb5_free_authenticator(context, &authenticator); - - ret = GSS_S_FAILURE; - *minor_status = kret; - return ret; + if (authenticator->cksum != NULL) { + krb5_crypto crypto; + + kret = krb5_crypto_init(context, + ctx->auth_context->keyblock, + 0, &crypto); + if (kret) { + krb5_free_authenticator(context, &authenticator); + ret = GSS_S_FAILURE; + *minor_status = kret; + return ret; + } + + /* + * Windows accepts Samba3's use of a kerberos, rather than + * GSSAPI checksum here + */ + + kret = krb5_verify_checksum(context, + crypto, KRB5_KU_AP_REQ_AUTH_CKSUM, NULL, 0, + authenticator->cksum); + krb5_crypto_destroy(context, crypto); + + if (kret) { + krb5_free_authenticator(context, &authenticator); + ret = GSS_S_BAD_SIG; + *minor_status = kret; + return ret; + } } /* - * Windows accepts Samba3's use of a kerberos, rather than - * GSSAPI checksum here + * If there is no checksum or a kerberos checksum (which Windows + * and Samba accept), we use the ap_options to guess the mutual + * flag. */ - kret = krb5_verify_checksum(context, - crypto, KRB5_KU_AP_REQ_AUTH_CKSUM, NULL, 0, - authenticator->cksum); - krb5_free_authenticator(context, &authenticator); - krb5_crypto_destroy(context, crypto); - - if(kret) { - ret = GSS_S_BAD_SIG; - *minor_status = kret; - return ret; - } - - /* - * Samba style get some flags (but not DCE-STYLE), use - * ap_options to guess the mutual flag. - */ - ctx->flags = GSS_C_REPLAY_FLAG | GSS_C_SEQUENCE_FLAG; + ctx->flags = GSS_C_REPLAY_FLAG | GSS_C_SEQUENCE_FLAG; if (ap_options & AP_OPTS_MUTUAL_REQUIRED) ctx->flags |= GSS_C_MUTUAL_FLAG; - } + } + krb5_free_authenticator(context, &authenticator); } if(ctx->flags & GSS_C_MUTUAL_FLAG) { @@ -594,8 +612,8 @@ rkey); if (kret == 0) use_subkey = 1; - krb5_free_keyblock(context, rkey); } + krb5_free_keyblock(context, rkey); } if (use_subkey) { ctx->more_flags |= ACCEPTOR_SUBKEY; @@ -631,7 +649,7 @@ /* Remember the flags */ - ctx->lifetime = ctx->ticket->ticket.endtime; + ctx->endtime = ctx->ticket->ticket.endtime; ctx->more_flags |= OPEN; if (mech_type) @@ -640,7 +658,7 @@ if (time_rec) { ret = _gsskrb5_lifetime_left(minor_status, context, - ctx->lifetime, + ctx->endtime, time_rec); if (ret) { return ret; @@ -676,7 +694,7 @@ acceptor_wait_for_dcestyle(OM_uint32 * minor_status, gsskrb5_ctx ctx, krb5_context context, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token_buffer, const gss_channel_bindings_t input_chan_bindings, gss_name_t * src_name, @@ -758,7 +776,7 @@ ret = _gsskrb5_lifetime_left(minor_status, context, - ctx->lifetime, + ctx->endtime, &lifetime_rec); if (ret) { return ret; @@ -839,7 +857,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_accept_sec_context(OM_uint32 * minor_status, gss_ctx_id_t * context_handle, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token_buffer, const gss_channel_bindings_t input_chan_bindings, gss_name_t * src_name, diff --git a/crypto/heimdal/lib/gssapi/krb5/acquire_cred.c b/crypto/heimdal/lib/gssapi/krb5/acquire_cred.c --- a/crypto/heimdal/lib/gssapi/krb5/acquire_cred.c +++ b/crypto/heimdal/lib/gssapi/krb5/acquire_cred.c @@ -40,37 +40,16 @@ krb5_principal principal, OM_uint32 *lifetime) { - krb5_creds in_cred, out_cred; - krb5_const_realm realm; krb5_error_code kret; + time_t left; - memset(&in_cred, 0, sizeof(in_cred)); - in_cred.client = principal; - - realm = krb5_principal_get_realm(context, principal); - if (realm == NULL) { - _gsskrb5_clear_status (); - *minor_status = KRB5_PRINC_NOMATCH; /* XXX */ - return GSS_S_FAILURE; - } - - kret = krb5_make_principal(context, &in_cred.server, - realm, KRB5_TGS_NAME, realm, NULL); - if (kret) { - *minor_status = kret; - return GSS_S_FAILURE; - } - - kret = krb5_cc_retrieve_cred(context, id, 0, &in_cred, &out_cred); - krb5_free_principal(context, in_cred.server); + kret = krb5_cc_get_lifetime(context, id, &left); if (kret) { - *minor_status = 0; - *lifetime = 0; - return GSS_S_COMPLETE; + *minor_status = kret; + return GSS_S_FAILURE; } - *lifetime = out_cred.times.endtime; - krb5_free_cred_contents(context, &out_cred); + *lifetime = left; return GSS_S_COMPLETE; } @@ -101,146 +80,287 @@ return (kret); } -static OM_uint32 acquire_initiator_cred - (OM_uint32 * minor_status, - krb5_context context, - gss_const_OID credential_type, - const void *credential_data, - const gss_name_t desired_name, - OM_uint32 time_req, - gss_const_OID desired_mech, - gss_cred_usage_t cred_usage, - gsskrb5_cred handle - ) +/* + * This function produces a cred with a MEMORY ccache containing a TGT + * acquired with a password. + */ +static OM_uint32 +acquire_cred_with_password(OM_uint32 *minor_status, + krb5_context context, + const char *password, + OM_uint32 time_req, + gss_const_OID desired_mech, + gss_cred_usage_t cred_usage, + gsskrb5_cred handle) { - OM_uint32 ret; + OM_uint32 ret = GSS_S_FAILURE; krb5_creds cred; - krb5_principal def_princ; krb5_get_init_creds_opt *opt; - krb5_ccache ccache; - krb5_keytab keytab; + krb5_ccache ccache = NULL; krb5_error_code kret; + time_t now; + OM_uint32 left; + const char *realm; + + if (cred_usage == GSS_C_ACCEPT) { + /* + * TODO: Here we should eventually support user2user (when we get + * support for that via an extension to the mechanism + * allowing for more than two security context tokens), + * and/or new unique MEMORY keytabs (we have MEMORY keytab + * support, but we don't have a keytab equivalent of + * krb5_cc_new_unique()). Either way, for now we can't + * support this. + */ + *minor_status = ENOTSUP; /* XXX Better error? */ + return GSS_S_FAILURE; + } + + memset(&cred, 0, sizeof(cred)); + + if (handle->principal == NULL) { + kret = krb5_get_default_principal(context, &handle->principal); + if (kret) + goto end; + } + kret = krb5_get_init_creds_opt_alloc(context, &opt); + if (kret) + goto end; + + realm = krb5_principal_get_realm(context, handle->principal); + + krb5_get_init_creds_opt_set_default_flags(context, "gss_krb5", realm, opt); + + /* + * Get the current time before the AS exchange so we don't + * accidentally end up returning a value that puts advertised + * expiration past the real expiration. + * + * We need to do this because krb5_cc_get_lifetime() returns a + * relative time that we need to add to the current time. We ought + * to have a version of krb5_cc_get_lifetime() that returns absolute + * time... + */ + krb5_timeofday(context, &now); + + kret = krb5_get_init_creds_password(context, &cred, handle->principal, + password, NULL, NULL, 0, NULL, opt); + krb5_get_init_creds_opt_free(context, opt); + if (kret) + goto end; + + kret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, &ccache); + if (kret) + goto end; - keytab = NULL; + kret = krb5_cc_initialize(context, ccache, cred.client); + if (kret) + goto end; + + kret = krb5_cc_store_cred(context, ccache, &cred); + if (kret) + goto end; + + handle->cred_flags |= GSS_CF_DESTROY_CRED_ON_RELEASE; + + ret = __gsskrb5_ccache_lifetime(minor_status, context, ccache, + handle->principal, &left); + if (ret != GSS_S_COMPLETE) + goto end; + handle->endtime = now + left; + handle->ccache = ccache; ccache = NULL; - def_princ = NULL; - ret = GSS_S_FAILURE; + ret = GSS_S_COMPLETE; + kret = 0; + +end: + if (ccache != NULL) + krb5_cc_destroy(context, ccache); + if (cred.client != NULL) + krb5_free_cred_contents(context, &cred); + if (ret != GSS_S_COMPLETE && kret != 0) + *minor_status = kret; + return (ret); +} + +/* + * Acquires an initiator credential from a ccache or using a keytab. + */ +static OM_uint32 +acquire_initiator_cred(OM_uint32 *minor_status, + krb5_context context, + OM_uint32 time_req, + gss_const_OID desired_mech, + gss_cred_usage_t cred_usage, + gsskrb5_cred handle) +{ + OM_uint32 ret = GSS_S_FAILURE; + krb5_creds cred; + krb5_get_init_creds_opt *opt; + krb5_principal def_princ = NULL; + krb5_ccache def_ccache = NULL; + krb5_ccache ccache = NULL; /* we may store into this ccache */ + krb5_keytab keytab = NULL; + krb5_error_code kret = 0; + OM_uint32 left; + time_t lifetime = 0; + time_t now; + memset(&cred, 0, sizeof(cred)); /* - * If we have a preferred principal, lets try to find it in all - * caches, otherwise, fall back to default cache, ignore all - * errors while searching. + * Get current time early so we can set handle->endtime to a value that + * cannot accidentally be past the real endtime. We need a variant of + * krb5_cc_get_lifetime() that returns absolute endtime. */ + krb5_timeofday(context, &now); - if (credential_type != GSS_C_NO_OID && - !gss_oid_equal(credential_type, GSS_C_CRED_PASSWORD)) { - kret = KRB5_NOCREDS_SUPPLIED; /* XXX */ - goto end; - } + /* + * First look for a ccache that has the desired_name (which may be + * the default credential name). + * + * If we don't have an unexpired credential, acquire one with a + * keytab. + * + * If we acquire one with a keytab, save it in the ccache we found + * with the expired credential, if any. + * + * If we don't have any such ccache, then use a MEMORY ccache. + */ - if (handle->principal) { - kret = krb5_cc_cache_match (context, - handle->principal, - &ccache); + if (handle->principal != NULL) { + /* + * Not default credential case. See if we can find a ccache in + * the cccol for the desired_name. + */ + kret = krb5_cc_cache_match(context, + handle->principal, + &ccache); if (kret == 0) { - ret = GSS_S_COMPLETE; - goto found; + kret = krb5_cc_get_lifetime(context, ccache, &lifetime); + if (kret == 0) { + if (lifetime > 0) + goto found; + else + goto try_keytab; + } } + /* + * Fall through. We shouldn't find this in the default ccache + * either, but we'll give it a try, then we'll try using a keytab. + */ } - if (ccache == NULL) { - kret = krb5_cc_default(context, &ccache); - if (kret) - goto end; - } - kret = krb5_cc_get_principal(context, ccache, &def_princ); - if (kret != 0) { - /* we'll try to use a keytab below */ - krb5_cc_close(context, ccache); - def_princ = NULL; - kret = 0; - } else if (handle->principal == NULL) { - kret = krb5_copy_principal(context, def_princ, &handle->principal); - if (kret) - goto end; - } else if (handle->principal != NULL && - krb5_principal_compare(context, handle->principal, - def_princ) == FALSE) { - krb5_free_principal(context, def_princ); - def_princ = NULL; - krb5_cc_close(context, ccache); - ccache = NULL; + /* + * Either desired_name was GSS_C_NO_NAME (default cred) or + * krb5_cc_cache_match() failed (or found expired). + */ + kret = krb5_cc_default(context, &def_ccache); + if (kret != 0) + goto try_keytab; + kret = krb5_cc_get_lifetime(context, def_ccache, &lifetime); + if (kret != 0) + lifetime = 0; + kret = krb5_cc_get_principal(context, def_ccache, &def_princ); + if (kret != 0) + goto try_keytab; + /* + * Have a default ccache; see if it matches desired_name. + */ + if (handle->principal == NULL || + krb5_principal_compare(context, handle->principal, + def_princ) == TRUE) { + /* + * It matches. + * + * If we end up trying a keytab then we can write the result to + * the default ccache. + */ + if (handle->principal == NULL) { + kret = krb5_copy_principal(context, def_princ, &handle->principal); + if (kret) + goto end; + } + if (ccache != NULL) + krb5_cc_close(context, ccache); + ccache = def_ccache; + def_ccache = NULL; + if (lifetime > 0) + goto found; + /* else we fall through and try using a keytab */ } - if (def_princ == NULL) { - /* We have no existing credentials cache, - * so attempt to get a TGT using a keytab. - */ - if (handle->principal == NULL) { - kret = krb5_get_default_principal(context, &handle->principal); - if (kret) - goto end; - } - kret = krb5_get_init_creds_opt_alloc(context, &opt); - if (kret) - goto end; - if (credential_type != GSS_C_NO_OID && - gss_oid_equal(credential_type, GSS_C_CRED_PASSWORD)) { - gss_buffer_t password = (gss_buffer_t)credential_data; - - /* XXX are we requiring password to be NUL terminated? */ - - kret = krb5_get_init_creds_password(context, &cred, - handle->principal, - password->value, - NULL, NULL, 0, NULL, opt); - } else { - kret = get_keytab(context, &keytab); - if (kret) { - krb5_get_init_creds_opt_free(context, opt); - goto end; - } - kret = krb5_get_init_creds_keytab(context, &cred, - handle->principal, keytab, - 0, NULL, opt); - } - krb5_get_init_creds_opt_free(context, opt); - if (kret) - goto end; - kret = krb5_cc_new_unique(context, krb5_cc_type_memory, - NULL, &ccache); - if (kret) - goto end; - kret = krb5_cc_initialize(context, ccache, cred.client); - if (kret) { - krb5_cc_destroy(context, ccache); - goto end; - } - kret = krb5_cc_store_cred(context, ccache, &cred); - if (kret) { - krb5_cc_destroy(context, ccache); - goto end; - } - handle->lifetime = cred.times.endtime; - handle->cred_flags |= GSS_CF_DESTROY_CRED_ON_RELEASE; - } else { - ret = __gsskrb5_ccache_lifetime(minor_status, - context, - ccache, - handle->principal, - &handle->lifetime); - if (ret != GSS_S_COMPLETE) { - krb5_cc_close(context, ccache); - goto end; - } - kret = 0; +try_keytab: + if (handle->principal == NULL) { + /* We need to know what client principal to use */ + kret = krb5_get_default_principal(context, &handle->principal); + if (kret) + goto end; } - found: + kret = get_keytab(context, &keytab); + if (kret) + goto end; + + kret = krb5_get_init_creds_opt_alloc(context, &opt); + if (kret) + goto end; + krb5_timeofday(context, &now); + kret = krb5_get_init_creds_keytab(context, &cred, handle->principal, + keytab, 0, NULL, opt); + krb5_get_init_creds_opt_free(context, opt); + if (kret) + goto end; + + /* + * We got a credential with a keytab. Save it if we can. + */ + if (ccache == NULL) { + /* + * There's no ccache we can overwrite with the credentials we acquired + * with a keytab. We'll use a MEMORY ccache then. + * + * Note that an application that falls into this repeatedly will do an + * AS exchange every time it acquires a credential handle. Hopefully + * this doesn't happen much. A workaround is to kinit -k once so that + * we always re-initialize the matched/default ccache here. I.e., once + * there's a FILE/DIR ccache, we'll keep it frash automatically if we + * have a keytab, but if there's no FILE/DIR ccache, then we'll + * get a fresh credential *every* time we're asked. + */ + kret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, &ccache); + if (kret) + goto end; + handle->cred_flags |= GSS_CF_DESTROY_CRED_ON_RELEASE; + } /* else we'll re-initialize whichever ccache we matched above */ + + kret = krb5_cc_initialize(context, ccache, cred.client); + if (kret) + goto end; + kret = krb5_cc_store_cred(context, ccache, &cred); + if (kret) + goto end; + +found: + assert(handle->principal != NULL); + ret = __gsskrb5_ccache_lifetime(minor_status, context, ccache, + handle->principal, &left); + if (ret != GSS_S_COMPLETE) + goto end; + handle->endtime = now + left; handle->ccache = ccache; + ccache = NULL; ret = GSS_S_COMPLETE; + kret = 0; end: + if (ccache != NULL) { + if ((handle->cred_flags & GSS_CF_DESTROY_CRED_ON_RELEASE) != 0) + krb5_cc_destroy(context, ccache); + else + krb5_cc_close(context, ccache); + } + if (def_ccache != NULL) + krb5_cc_close(context, def_ccache); if (cred.client != NULL) krb5_free_cred_contents(context, &cred); if (def_princ != NULL) @@ -252,28 +372,19 @@ return (ret); } -static OM_uint32 acquire_acceptor_cred - (OM_uint32 * minor_status, - krb5_context context, - gss_const_OID credential_type, - const void *credential_data, - const gss_name_t desired_name, - OM_uint32 time_req, - gss_const_OID desired_mech, - gss_cred_usage_t cred_usage, - gsskrb5_cred handle - ) +static OM_uint32 +acquire_acceptor_cred(OM_uint32 * minor_status, + krb5_context context, + OM_uint32 time_req, + gss_const_OID desired_mech, + gss_cred_usage_t cred_usage, + gsskrb5_cred handle) { OM_uint32 ret; krb5_error_code kret; ret = GSS_S_FAILURE; - if (credential_type != GSS_C_NO_OID) { - kret = EINVAL; - goto end; - } - kret = get_keytab(context, &handle->keytab); if (kret) goto end; @@ -318,7 +429,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_acquire_cred (OM_uint32 * minor_status, - const gss_name_t desired_name, + gss_const_name_t desired_name, OM_uint32 time_req, const gss_OID_set desired_mechs, gss_cred_usage_t cred_usage, @@ -366,7 +477,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_acquire_cred_ext (OM_uint32 * minor_status, - const gss_name_t desired_name, + gss_const_name_t desired_name, gss_const_OID credential_type, const void *credential_data, OM_uint32 time_req, @@ -381,25 +492,26 @@ cred_usage &= GSS_C_OPTION_MASK; - if (cred_usage != GSS_C_ACCEPT && cred_usage != GSS_C_INITIATE && cred_usage != GSS_C_BOTH) { + if (cred_usage != GSS_C_ACCEPT && cred_usage != GSS_C_INITIATE && + cred_usage != GSS_C_BOTH) { *minor_status = GSS_KRB5_S_G_BAD_USAGE; return GSS_S_FAILURE; } GSSAPI_KRB5_INIT(&context); - *output_cred_handle = NULL; + *output_cred_handle = GSS_C_NO_CREDENTIAL; handle = calloc(1, sizeof(*handle)); if (handle == NULL) { *minor_status = ENOMEM; - return (GSS_S_FAILURE); + return GSS_S_FAILURE; } HEIMDAL_MUTEX_init(&handle->cred_id_mutex); if (desired_name != GSS_C_NO_NAME) { - ret = _gsskrb5_canon_name(minor_status, context, 1, NULL, + ret = _gsskrb5_canon_name(minor_status, context, desired_name, &handle->principal); if (ret) { HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); @@ -407,29 +519,75 @@ return ret; } } - if (cred_usage == GSS_C_INITIATE || cred_usage == GSS_C_BOTH) { - ret = acquire_initiator_cred(minor_status, context, - credential_type, credential_data, - desired_name, time_req, - desired_mech, cred_usage, handle); - if (ret != GSS_S_COMPLETE) { - HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); - krb5_free_principal(context, handle->principal); - free(handle); - return (ret); - } - } - if (cred_usage == GSS_C_ACCEPT || cred_usage == GSS_C_BOTH) { - ret = acquire_acceptor_cred(minor_status, context, - credential_type, credential_data, - desired_name, time_req, - desired_mech, cred_usage, handle); - if (ret != GSS_S_COMPLETE) { - HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); - krb5_free_principal(context, handle->principal); - free(handle); - return (ret); - } + + if (credential_type != GSS_C_NO_OID && + gss_oid_equal(credential_type, GSS_C_CRED_PASSWORD)) { + /* Acquire a cred with a password */ + gss_const_buffer_t pwbuf = credential_data; + char *pw; + + if (pwbuf == NULL) { + HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); + free(handle); + *minor_status = KRB5_NOCREDS_SUPPLIED; /* see below */ + return GSS_S_CALL_INACCESSIBLE_READ; + } + + /* NUL-terminate the password, if it wasn't already */ + pw = strndup(pwbuf->value, pwbuf->length); + if (pw == NULL) { + HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); + free(handle); + *minor_status = krb5_enomem(context); + return GSS_S_CALL_INACCESSIBLE_READ; + } + ret = acquire_cred_with_password(minor_status, context, pw, time_req, + desired_mech, cred_usage, handle); + free(pw); + if (ret != GSS_S_COMPLETE) { + HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); + krb5_free_principal(context, handle->principal); + free(handle); + return (ret); + } + } else if (credential_type != GSS_C_NO_OID) { + /* + * _gss_acquire_cred_ext() called with something other than a password. + * + * Not supported. + * + * _gss_acquire_cred_ext() is not a supported public interface, so + * we don't have to try too hard as to minor status codes here. + */ + HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); + free(handle); + *minor_status = ENOTSUP; + return GSS_S_FAILURE; + } else { + /* + * Acquire a credential from the background credential store (ccache, + * keytab). + */ + if (cred_usage == GSS_C_INITIATE || cred_usage == GSS_C_BOTH) { + ret = acquire_initiator_cred(minor_status, context, time_req, + desired_mech, cred_usage, handle); + if (ret != GSS_S_COMPLETE) { + HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); + krb5_free_principal(context, handle->principal); + free(handle); + return (ret); + } + } + if (cred_usage == GSS_C_ACCEPT || cred_usage == GSS_C_BOTH) { + ret = acquire_acceptor_cred(minor_status, context, time_req, + desired_mech, cred_usage, handle); + if (ret != GSS_S_COMPLETE) { + HEIMDAL_MUTEX_destroy(&handle->cred_id_mutex); + krb5_free_principal(context, handle->principal); + free(handle); + return (ret); + } + } } ret = gss_create_empty_oid_set(minor_status, &handle->mechanisms); if (ret == GSS_S_COMPLETE) diff --git a/crypto/heimdal/lib/gssapi/krb5/add_cred.c b/crypto/heimdal/lib/gssapi/krb5/add_cred.c --- a/crypto/heimdal/lib/gssapi/krb5/add_cred.c +++ b/crypto/heimdal/lib/gssapi/krb5/add_cred.c @@ -35,8 +35,8 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_add_cred ( OM_uint32 *minor_status, - const gss_cred_id_t input_cred_handle, - const gss_name_t desired_name, + gss_const_cred_id_t input_cred_handle, + gss_const_name_t desired_name, const gss_OID desired_mech, gss_cred_usage_t cred_usage, OM_uint32 initiator_time_req, @@ -47,7 +47,7 @@ OM_uint32 *acceptor_time_rec) { krb5_context context; - OM_uint32 ret, lifetime; + OM_uint32 major, lifetime; gsskrb5_cred cred, handle; krb5_const_principal dname; @@ -55,99 +55,120 @@ cred = (gsskrb5_cred)input_cred_handle; dname = (krb5_const_principal)desired_name; + if (cred == NULL && output_cred_handle == NULL) { + *minor_status = EINVAL; + return GSS_S_CALL_INACCESSIBLE_WRITE; + } + GSSAPI_KRB5_INIT (&context); - if (gss_oid_equal(desired_mech, GSS_KRB5_MECHANISM) == 0) { + if (desired_mech != GSS_C_NO_OID && + gss_oid_equal(desired_mech, GSS_KRB5_MECHANISM) == 0) { *minor_status = 0; return GSS_S_BAD_MECH; } - if (cred == NULL && output_cred_handle == NULL) { - *minor_status = 0; - return GSS_S_NO_CRED; - } - - if (cred == NULL) { /* XXX standard conformance failure */ - *minor_status = 0; - return GSS_S_NO_CRED; - } + if (cred == NULL) { + /* + * Acquire a credential; output_cred_handle can't be NULL, see above. + */ + heim_assert(output_cred_handle != NULL, + "internal error in _gsskrb5_add_cred()"); + + major = _gsskrb5_acquire_cred(minor_status, desired_name, + min(initiator_time_req, + acceptor_time_req), + GSS_C_NO_OID_SET, + cred_usage, + output_cred_handle, + actual_mechs, &lifetime); + if (major != GSS_S_COMPLETE) + goto failure; + + } else { + /* + * Check that we're done or copy input to output if + * output_cred_handle != NULL. + */ - /* check if requested output usage is compatible with output usage */ - if (output_cred_handle != NULL) { HEIMDAL_MUTEX_lock(&cred->cred_id_mutex); + + /* Check if requested output usage is compatible with output usage */ if (cred->usage != cred_usage && cred->usage != GSS_C_BOTH) { HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); *minor_status = GSS_KRB5_S_G_BAD_USAGE; return(GSS_S_FAILURE); } - } - - /* check that we have the same name */ - if (dname != NULL && - krb5_principal_compare(context, dname, - cred->principal) != FALSE) { - if (output_cred_handle) - HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); - *minor_status = 0; - return GSS_S_BAD_NAME; - } - /* make a copy */ - if (output_cred_handle) { - krb5_error_code kret; + /* Check that we have the same name */ + if (dname != NULL && + krb5_principal_compare(context, dname, + cred->principal) != FALSE) { + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + *minor_status = 0; + return GSS_S_BAD_NAME; + } + + if (output_cred_handle == NULL) { + /* + * This case is basically useless as we implement a single + * mechanism here, so we can't add elements to the + * input_cred_handle. + */ + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + *minor_status = 0; + return GSS_S_COMPLETE; + } + + /* + * Copy input to output -- this works as if we were a + * GSS_Duplicate_cred() for one mechanism element. + */ handle = calloc(1, sizeof(*handle)); if (handle == NULL) { - HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + if (cred != NULL) + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); *minor_status = ENOMEM; return (GSS_S_FAILURE); } handle->usage = cred_usage; - handle->lifetime = cred->lifetime; + handle->endtime = cred->endtime; handle->principal = NULL; handle->keytab = NULL; handle->ccache = NULL; handle->mechanisms = NULL; HEIMDAL_MUTEX_init(&handle->cred_id_mutex); - ret = GSS_S_FAILURE; + major = GSS_S_FAILURE; - kret = krb5_copy_principal(context, cred->principal, - &handle->principal); - if (kret) { + *minor_status = krb5_copy_principal(context, cred->principal, + &handle->principal); + if (*minor_status) { HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); free(handle); - *minor_status = kret; return GSS_S_FAILURE; } if (cred->keytab) { char *name = NULL; - ret = GSS_S_FAILURE; - - kret = krb5_kt_get_full_name(context, cred->keytab, &name); - if (kret) { - *minor_status = kret; + *minor_status = krb5_kt_get_full_name(context, cred->keytab, + &name); + if (*minor_status) goto failure; - } - kret = krb5_kt_resolve(context, name, - &handle->keytab); + *minor_status = krb5_kt_resolve(context, name, &handle->keytab); krb5_xfree(name); - if (kret){ - *minor_status = kret; + if (*minor_status) goto failure; - } } if (cred->ccache) { const char *type, *name; char *type_name = NULL; - ret = GSS_S_FAILURE; - type = krb5_cc_get_type(context, cred->ccache); if (type == NULL){ *minor_status = ENOMEM; @@ -155,19 +176,15 @@ } if (strcmp(type, "MEMORY") == 0) { - ret = krb5_cc_new_unique(context, type, - NULL, &handle->ccache); - if (ret) { - *minor_status = ret; + *minor_status = krb5_cc_new_unique(context, type, + NULL, &handle->ccache); + if (*minor_status) goto failure; - } - ret = krb5_cc_copy_cache(context, cred->ccache, - handle->ccache); - if (ret) { - *minor_status = ret; + *minor_status = krb5_cc_copy_cache(context, cred->ccache, + handle->ccache); + if (*minor_status) goto failure; - } } else { name = krb5_cc_get_name(context, cred->ccache); @@ -176,52 +193,47 @@ goto failure; } - kret = asprintf(&type_name, "%s:%s", type, name); - if (kret < 0 || type_name == NULL) { + if (asprintf(&type_name, "%s:%s", type, name) == -1 || + type_name == NULL) { *minor_status = ENOMEM; goto failure; } - kret = krb5_cc_resolve(context, type_name, - &handle->ccache); + *minor_status = krb5_cc_resolve(context, type_name, + &handle->ccache); free(type_name); - if (kret) { - *minor_status = kret; + if (*minor_status) goto failure; - } } } - ret = gss_create_empty_oid_set(minor_status, &handle->mechanisms); - if (ret) + major = gss_create_empty_oid_set(minor_status, &handle->mechanisms); + if (major != GSS_S_COMPLETE) goto failure; - ret = gss_add_oid_set_member(minor_status, GSS_KRB5_MECHANISM, - &handle->mechanisms); - if (ret) + major = gss_add_oid_set_member(minor_status, GSS_KRB5_MECHANISM, + &handle->mechanisms); + if (major != GSS_S_COMPLETE) goto failure; - } - HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); - ret = _gsskrb5_inquire_cred(minor_status, (gss_cred_id_t)cred, - NULL, &lifetime, NULL, actual_mechs); - if (ret) - goto failure; + major = _gsskrb5_inquire_cred(minor_status, (gss_cred_id_t)cred, + NULL, &lifetime, NULL, actual_mechs); + if (major != GSS_S_COMPLETE) + goto failure; + + *output_cred_handle = (gss_cred_id_t)handle; + } if (initiator_time_rec) *initiator_time_rec = lifetime; if (acceptor_time_rec) *acceptor_time_rec = lifetime; - if (output_cred_handle) { - *output_cred_handle = (gss_cred_id_t)handle; - } - *minor_status = 0; - return ret; - - failure: + return major; +failure: if (handle) { if (handle->principal) krb5_free_principal(context, handle->principal); @@ -233,7 +245,7 @@ gss_release_oid_set(NULL, &handle->mechanisms); free(handle); } - if (output_cred_handle) + if (cred && output_cred_handle) HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); - return ret; + return major; } diff --git a/crypto/heimdal/lib/gssapi/krb5/aeap.c b/crypto/heimdal/lib/gssapi/krb5/aeap.c --- a/crypto/heimdal/lib/gssapi/krb5/aeap.c +++ b/crypto/heimdal/lib/gssapi/krb5/aeap.c @@ -35,7 +35,6 @@ #include -#if 0 OM_uint32 GSSAPI_CALLCONV _gk_wrap_iov(OM_uint32 * minor_status, gss_ctx_id_t context_handle, @@ -45,17 +44,43 @@ gss_iov_buffer_desc *iov, int iov_count) { - const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; - krb5_context context; + const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; + krb5_context context; + OM_uint32 ret; + krb5_keyblock *key; + krb5_keytype keytype; + + GSSAPI_KRB5_INIT (&context); + + if (ctx->more_flags & IS_CFX) + return _gssapi_wrap_cfx_iov(minor_status, ctx, context, + conf_req_flag, conf_state, + iov, iov_count); + + HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); + ret = _gsskrb5i_get_token_key(ctx, context, &key); + HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); + if (ret) { + *minor_status = ret; + return GSS_S_FAILURE; + } + krb5_enctype_to_keytype(context, key->keytype, &keytype); - GSSAPI_KRB5_INIT (&context); + switch (keytype) { + case KEYTYPE_ARCFOUR: + case KEYTYPE_ARCFOUR_56: + ret = _gssapi_wrap_iov_arcfour(minor_status, ctx, context, + conf_req_flag, conf_state, + iov, iov_count, key); + break; - if (ctx->more_flags & IS_CFX) - return _gssapi_wrap_cfx_iov(minor_status, ctx, context, - conf_req_flag, conf_state, - iov, iov_count); + default: + ret = GSS_S_FAILURE; + break; + } - return GSS_S_FAILURE; + krb5_free_keyblock(context, key); + return ret; } OM_uint32 GSSAPI_CALLCONV @@ -68,6 +93,9 @@ { const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; krb5_context context; + OM_uint32 ret; + krb5_keytype keytype; + krb5_keyblock *key; GSSAPI_KRB5_INIT (&context); @@ -75,9 +103,31 @@ return _gssapi_unwrap_cfx_iov(minor_status, ctx, context, conf_state, qop_state, iov, iov_count); - return GSS_S_FAILURE; + HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); + ret = _gsskrb5i_get_token_key(ctx, context, &key); + HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); + if (ret) { + *minor_status = ret; + return GSS_S_FAILURE; + } + krb5_enctype_to_keytype(context, key->keytype, &keytype); + + switch (keytype) { + case KEYTYPE_ARCFOUR: + case KEYTYPE_ARCFOUR_56: + ret = _gssapi_unwrap_iov_arcfour(minor_status, ctx, context, + conf_state, qop_state, + iov, iov_count, key); + break; + + default: + ret = GSS_S_FAILURE; + break; + } + + krb5_free_keyblock(context, key); + return ret; } -#endif OM_uint32 GSSAPI_CALLCONV _gk_wrap_iov_length(OM_uint32 * minor_status, @@ -90,6 +140,9 @@ { const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; krb5_context context; + OM_uint32 ret; + krb5_keytype keytype; + krb5_keyblock *key; GSSAPI_KRB5_INIT (&context); @@ -98,5 +151,28 @@ conf_req_flag, qop_req, conf_state, iov, iov_count); - return GSS_S_FAILURE; + HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); + ret = _gsskrb5i_get_token_key(ctx, context, &key); + HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); + if (ret) { + *minor_status = ret; + return GSS_S_FAILURE; + } + krb5_enctype_to_keytype(context, key->keytype, &keytype); + + switch (keytype) { + case KEYTYPE_ARCFOUR: + case KEYTYPE_ARCFOUR_56: + ret = _gssapi_wrap_iov_length_arcfour(minor_status, ctx, context, + conf_req_flag, qop_req, conf_state, + iov, iov_count); + break; + + default: + ret = GSS_S_FAILURE; + break; + } + + krb5_free_keyblock(context, key); + return ret; } diff --git a/crypto/heimdal/lib/gssapi/krb5/arcfour.c b/crypto/heimdal/lib/gssapi/krb5/arcfour.c --- a/crypto/heimdal/lib/gssapi/krb5/arcfour.c +++ b/crypto/heimdal/lib/gssapi/krb5/arcfour.c @@ -69,7 +69,7 @@ static krb5_error_code arcfour_mic_key(krb5_context context, krb5_keyblock *key, - void *cksum_data, size_t cksum_size, + const void *cksum_data, size_t cksum_size, void *key6_data, size_t key6_size) { krb5_error_code ret; @@ -86,7 +86,7 @@ cksum_k5.checksum.data = k5_data; cksum_k5.checksum.length = sizeof(k5_data); - if (key->keytype == ENCTYPE_ARCFOUR_HMAC_MD5_56) { + if (key->keytype == KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56) { char L40[14] = "fortybits"; memcpy(L40 + 10, T, sizeof(T)); @@ -100,7 +100,7 @@ if (ret) return ret; - key5.keytype = ENCTYPE_ARCFOUR_HMAC_MD5; + key5.keytype = KRB5_ENCTYPE_ARCFOUR_HMAC_MD5; key5.keyvalue = cksum_k5.checksum; cksum_k6.checksum.data = key6_data; @@ -112,30 +112,73 @@ static krb5_error_code -arcfour_mic_cksum(krb5_context context, - krb5_keyblock *key, unsigned usage, - u_char *sgn_cksum, size_t sgn_cksum_sz, - const u_char *v1, size_t l1, - const void *v2, size_t l2, - const void *v3, size_t l3) +arcfour_mic_cksum_iov(krb5_context context, + krb5_keyblock *key, unsigned usage, + u_char *sgn_cksum, size_t sgn_cksum_sz, + const u_char *v1, size_t l1, + const void *v2, size_t l2, + const gss_iov_buffer_desc *iov, + int iov_count, + const gss_iov_buffer_desc *padding) { Checksum CKSUM; u_char *ptr; size_t len; + size_t ofs = 0; + int i; krb5_crypto crypto; krb5_error_code ret; assert(sgn_cksum_sz == 8); - len = l1 + l2 + l3; + len = l1 + l2; + + for (i=0; i < iov_count; i++) { + switch (GSS_IOV_BUFFER_TYPE(iov[i].type)) { + case GSS_IOV_BUFFER_TYPE_DATA: + case GSS_IOV_BUFFER_TYPE_SIGN_ONLY: + break; + default: + continue; + } + + len += iov[i].buffer.length; + } + + if (padding) { + len += padding->buffer.length; + } ptr = malloc(len); if (ptr == NULL) return ENOMEM; - memcpy(ptr, v1, l1); - memcpy(ptr + l1, v2, l2); - memcpy(ptr + l1 + l2, v3, l3); + memcpy(ptr + ofs, v1, l1); + ofs += l1; + memcpy(ptr + ofs, v2, l2); + ofs += l2; + + for (i=0; i < iov_count; i++) { + switch (GSS_IOV_BUFFER_TYPE(iov[i].type)) { + case GSS_IOV_BUFFER_TYPE_DATA: + case GSS_IOV_BUFFER_TYPE_SIGN_ONLY: + break; + default: + continue; + } + + memcpy(ptr + ofs, + iov[i].buffer.value, + iov[i].buffer.length); + ofs += iov[i].buffer.length; + } + + if (padding) { + memcpy(ptr + ofs, + padding->buffer.value, + padding->buffer.length); + /* ofs += padding->buffer.length; */ + } ret = krb5_crypto_init(context, key, 0, &crypto); if (ret) { @@ -149,6 +192,7 @@ 0, ptr, len, &CKSUM); + memset(ptr, 0, len); free(ptr); if (ret == 0) { memcpy(sgn_cksum, CKSUM.checksum.data, sgn_cksum_sz); @@ -159,6 +203,26 @@ return ret; } +static krb5_error_code +arcfour_mic_cksum(krb5_context context, + krb5_keyblock *key, unsigned usage, + u_char *sgn_cksum, size_t sgn_cksum_sz, + const u_char *v1, size_t l1, + const void *v2, size_t l2, + const void *v3, size_t l3) +{ + gss_iov_buffer_desc iov; + + iov.type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY; + iov.buffer.value = rk_UNCONST(v3); + iov.buffer.length = l3; + + return arcfour_mic_cksum_iov(context, key, usage, + sgn_cksum, sgn_cksum_sz, + v1, l1, v2, l2, + &iov, 1, NULL); +} + OM_uint32 _gssapi_get_mic_arcfour(OM_uint32 * minor_status, @@ -173,7 +237,7 @@ int32_t seq_number; size_t len, total_len; u_char k6_data[16], *p0, *p; - EVP_CIPHER_CTX *rc4_key; + EVP_CIPHER_CTX rc4_key; _gsskrb5_encap_length (22, &len, &total_len, GSS_KRB5_MECHANISM); @@ -235,18 +299,12 @@ memset (p + 4, (context_handle->more_flags & LOCAL) ? 0 : 0xff, 4); - rc4_key = EVP_CIPHER_CTX_new(); - if (rc4_key == NULL) { - _gsskrb5_release_buffer(minor_status, message_token); - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - - EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(rc4_key, p, p, 8); - EVP_CIPHER_CTX_free(rc4_key); + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(&rc4_key, p, p, 8); + EVP_CIPHER_CTX_cleanup(&rc4_key); - memset(k6_data, 0, sizeof(k6_data)); + memset_s(k6_data, sizeof(k6_data), 0, sizeof(k6_data)); *minor_status = 0; return GSS_S_COMPLETE; @@ -307,23 +365,19 @@ return GSS_S_FAILURE; } - cmp = (ct_memcmp(cksum_data, p + 8, 8) != 0); + cmp = (ct_memcmp(cksum_data, p + 8, 8) == 0); if (cmp) { *minor_status = 0; return GSS_S_BAD_MIC; } { - EVP_CIPHER_CTX *rc4_key; + EVP_CIPHER_CTX rc4_key; - rc4_key = EVP_CIPHER_CTX_new(); - if (rc4_key == NULL) { - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, (void *)k6_data, NULL, 0); - EVP_Cipher(rc4_key, SND_SEQ, p, 8); - EVP_CIPHER_CTX_free(rc4_key); + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, (void *)k6_data, NULL, 0); + EVP_Cipher(&rc4_key, SND_SEQ, p, 8); + EVP_CIPHER_CTX_cleanup(&rc4_key); memset(k6_data, 0, sizeof(k6_data)); } @@ -335,7 +389,7 @@ else cmp = (ct_memcmp(&SND_SEQ[4], "\x00\x00\x00\x00", 4) != 0); - memset(SND_SEQ, 0, sizeof(SND_SEQ)); + memset_s(SND_SEQ, sizeof(SND_SEQ), 0, sizeof(SND_SEQ)); if (cmp != 0) { *minor_status = 0; return GSS_S_BAD_MIC; @@ -462,7 +516,7 @@ ret = arcfour_mic_key(context, &Klocal, p0 + 8, 4, /* SND_SEQ */ k6_data, sizeof(k6_data)); - memset(Klocaldata, 0, sizeof(Klocaldata)); + memset_s(Klocaldata, sizeof(Klocaldata), 0, sizeof(Klocaldata)); if (ret) { _gsskrb5_release_buffer(minor_status, output_message_buffer); *minor_status = ret; @@ -471,17 +525,12 @@ if(conf_req_flag) { - EVP_CIPHER_CTX *rc4_key; + EVP_CIPHER_CTX rc4_key; - rc4_key = EVP_CIPHER_CTX_new(); - if (rc4_key == NULL) { - _gsskrb5_release_buffer(minor_status, output_message_buffer); - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(rc4_key, p0 + 24, p0 + 24, 8 + datalen); - EVP_CIPHER_CTX_free(rc4_key); + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(&rc4_key, p0 + 24, p0 + 24, 8 + datalen); + EVP_CIPHER_CTX_cleanup(&rc4_key); } memset(k6_data, 0, sizeof(k6_data)); @@ -495,18 +544,13 @@ } { - EVP_CIPHER_CTX *rc4_key; + EVP_CIPHER_CTX rc4_key; - rc4_key = EVP_CIPHER_CTX_new(); - if (rc4_key == NULL) { - _gsskrb5_release_buffer(minor_status, output_message_buffer); - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(rc4_key, p0 + 8, p0 + 8 /* SND_SEQ */, 8); - EVP_CIPHER_CTX_free(rc4_key); - memset(k6_data, 0, sizeof(k6_data)); + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(&rc4_key, p0 + 8, p0 + 8 /* SND_SEQ */, 8); + EVP_CIPHER_CTX_cleanup(&rc4_key); + memset_s(k6_data, sizeof(k6_data), 0, sizeof(k6_data)); } if (conf_state) @@ -600,17 +644,13 @@ } { - EVP_CIPHER_CTX *rc4_key; + EVP_CIPHER_CTX rc4_key; - rc4_key = EVP_CIPHER_CTX_new(); - if (rc4_key == NULL) { - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(rc4_key, SND_SEQ, p0 + 8, 8); - EVP_CIPHER_CTX_free(rc4_key); - memset(k6_data, 0, sizeof(k6_data)); + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(&rc4_key, SND_SEQ, p0 + 8, 8); + EVP_CIPHER_CTX_cleanup(&rc4_key); + memset_s(k6_data, sizeof(k6_data), 0, sizeof(k6_data)); } _gsskrb5_decode_be_om_uint32(SND_SEQ, &seq_number); @@ -638,7 +678,7 @@ ret = arcfour_mic_key(context, &Klocal, SND_SEQ, 4, k6_data, sizeof(k6_data)); - memset(Klocaldata, 0, sizeof(Klocaldata)); + memset_s(Klocaldata, sizeof(Klocaldata), 0, sizeof(Klocaldata)); if (ret) { *minor_status = ret; return GSS_S_FAILURE; @@ -652,18 +692,13 @@ output_message_buffer->length = datalen; if(conf_flag) { - EVP_CIPHER_CTX *rc4_key; + EVP_CIPHER_CTX rc4_key; - rc4_key = EVP_CIPHER_CTX_new(); - if (rc4_key == NULL) { - _gsskrb5_release_buffer(minor_status, output_message_buffer); - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - EVP_CipherInit_ex(rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); - EVP_Cipher(rc4_key, Confounder, p0 + 24, 8); - EVP_Cipher(rc4_key, output_message_buffer->value, p0 + GSS_ARCFOUR_WRAP_TOKEN_SIZE, datalen); - EVP_CIPHER_CTX_free(rc4_key); + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(&rc4_key, Confounder, p0 + 24, 8); + EVP_Cipher(&rc4_key, output_message_buffer->value, p0 + GSS_ARCFOUR_WRAP_TOKEN_SIZE, datalen); + EVP_CIPHER_CTX_cleanup(&rc4_key); } else { memcpy(Confounder, p0 + 24, 8); /* Confounder */ memcpy(output_message_buffer->value, @@ -695,7 +730,7 @@ return GSS_S_FAILURE; } - cmp = (ct_memcmp(cksum_data, p0 + 16, 8) != 0); /* SGN_CKSUM */ + cmp = (ct_memcmp(cksum_data, p0 + 16, 8) == 0); /* SGN_CKSUM */ if (cmp) { _gsskrb5_release_buffer(minor_status, output_message_buffer); *minor_status = 0; @@ -789,3 +824,565 @@ return GSS_S_COMPLETE; } + +OM_uint32 +_gssapi_wrap_iov_length_arcfour(OM_uint32 *minor_status, + gsskrb5_ctx ctx, + krb5_context context, + int conf_req_flag, + gss_qop_t qop_req, + int *conf_state, + gss_iov_buffer_desc *iov, + int iov_count) +{ + OM_uint32 major_status; + size_t data_len = 0; + int i; + gss_iov_buffer_desc *header = NULL; + gss_iov_buffer_desc *padding = NULL; + gss_iov_buffer_desc *trailer = NULL; + + *minor_status = 0; + + for (i = 0; i < iov_count; i++) { + switch(GSS_IOV_BUFFER_TYPE(iov[i].type)) { + case GSS_IOV_BUFFER_TYPE_EMPTY: + break; + case GSS_IOV_BUFFER_TYPE_DATA: + data_len += iov[i].buffer.length; + break; + case GSS_IOV_BUFFER_TYPE_HEADER: + if (header != NULL) { + *minor_status = EINVAL; + return GSS_S_FAILURE; + } + header = &iov[i]; + break; + case GSS_IOV_BUFFER_TYPE_TRAILER: + if (trailer != NULL) { + *minor_status = EINVAL; + return GSS_S_FAILURE; + } + trailer = &iov[i]; + break; + case GSS_IOV_BUFFER_TYPE_PADDING: + if (padding != NULL) { + *minor_status = EINVAL; + return GSS_S_FAILURE; + } + padding = &iov[i]; + break; + case GSS_IOV_BUFFER_TYPE_SIGN_ONLY: + break; + default: + *minor_status = EINVAL; + return GSS_S_FAILURE; + } + } + + if (header == NULL) { + *minor_status = EINVAL; + return GSS_S_FAILURE; + } + + major_status = _gk_verify_buffers(minor_status, ctx, header, + padding, trailer, FALSE); + if (major_status != GSS_S_COMPLETE) { + return major_status; + } + + if (IS_DCE_STYLE(ctx)) { + size_t len = GSS_ARCFOUR_WRAP_TOKEN_SIZE; + size_t total_len; + _gssapi_encap_length(len, &len, &total_len, GSS_KRB5_MECHANISM); + header->buffer.length = total_len; + } else { + size_t len; + size_t total_len; + if (padding) { + data_len += 1; /* padding */ + } + len = data_len + GSS_ARCFOUR_WRAP_TOKEN_SIZE; + _gssapi_encap_length(len, &len, &total_len, GSS_KRB5_MECHANISM); + header->buffer.length = total_len - data_len; + } + + if (trailer) { + trailer->buffer.length = 0; + } + + if (padding) { + padding->buffer.length = 1; + } + + return GSS_S_COMPLETE; +} + +OM_uint32 +_gssapi_wrap_iov_arcfour(OM_uint32 *minor_status, + gsskrb5_ctx ctx, + krb5_context context, + int conf_req_flag, + int *conf_state, + gss_iov_buffer_desc *iov, + int iov_count, + krb5_keyblock *key) +{ + OM_uint32 major_status, junk; + gss_iov_buffer_desc *header, *padding, *trailer; + krb5_error_code kret; + int32_t seq_number; + u_char Klocaldata[16], k6_data[16], *p, *p0; + size_t make_len = 0; + size_t header_len = 0; + size_t data_len = 0; + krb5_keyblock Klocal; + int i; + + header = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_HEADER); + padding = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_PADDING); + trailer = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_TRAILER); + + major_status = _gk_verify_buffers(minor_status, ctx, header, + padding, trailer, FALSE); + if (major_status != GSS_S_COMPLETE) { + return major_status; + } + + for (i = 0; i < iov_count; i++) { + switch (GSS_IOV_BUFFER_TYPE(iov[i].type)) { + case GSS_IOV_BUFFER_TYPE_DATA: + break; + default: + continue; + } + + data_len += iov[i].buffer.length; + } + + if (padding) { + data_len += 1; + } + + if (IS_DCE_STYLE(ctx)) { + size_t unwrapped_len; + unwrapped_len = GSS_ARCFOUR_WRAP_TOKEN_SIZE; + _gssapi_encap_length(unwrapped_len, + &make_len, + &header_len, + GSS_KRB5_MECHANISM); + } else { + size_t unwrapped_len; + unwrapped_len = GSS_ARCFOUR_WRAP_TOKEN_SIZE + data_len; + _gssapi_encap_length(unwrapped_len, + &make_len, + &header_len, + GSS_KRB5_MECHANISM); + header_len -= data_len; + } + + if (GSS_IOV_BUFFER_FLAGS(header->type) & GSS_IOV_BUFFER_FLAG_ALLOCATE) { + major_status = _gk_allocate_buffer(minor_status, header, + header_len); + if (major_status != GSS_S_COMPLETE) + goto failure; + } else if (header->buffer.length < header_len) { + *minor_status = KRB5_BAD_MSIZE; + major_status = GSS_S_FAILURE; + goto failure; + } else { + header->buffer.length = header_len; + } + + if (padding) { + if (GSS_IOV_BUFFER_FLAGS(padding->type) & GSS_IOV_BUFFER_FLAG_ALLOCATE) { + major_status = _gk_allocate_buffer(minor_status, padding, 1); + if (major_status != GSS_S_COMPLETE) + goto failure; + } else if (padding->buffer.length < 1) { + *minor_status = KRB5_BAD_MSIZE; + major_status = GSS_S_FAILURE; + goto failure; + } else { + padding->buffer.length = 1; + } + memset(padding->buffer.value, 1, 1); + } + + if (trailer) { + trailer->buffer.length = 0; + trailer->buffer.value = NULL; + } + + p0 = _gssapi_make_mech_header(header->buffer.value, + make_len, + GSS_KRB5_MECHANISM); + p = p0; + + *p++ = 0x02; /* TOK_ID */ + *p++ = 0x01; + *p++ = 0x11; /* SGN_ALG */ + *p++ = 0x00; + if (conf_req_flag) { + *p++ = 0x10; /* SEAL_ALG */ + *p++ = 0x00; + } else { + *p++ = 0xff; /* SEAL_ALG */ + *p++ = 0xff; + } + *p++ = 0xff; /* Filler */ + *p++ = 0xff; + + p = NULL; + + HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); + krb5_auth_con_getlocalseqnumber(context, + ctx->auth_context, + &seq_number); + _gsskrb5_encode_be_om_uint32(seq_number, p0 + 8); + + krb5_auth_con_setlocalseqnumber(context, + ctx->auth_context, + ++seq_number); + HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); + + memset(p0 + 8 + 4, + (ctx->more_flags & LOCAL) ? 0 : 0xff, + 4); + + krb5_generate_random_block(p0 + 24, 8); /* fill in Confounder */ + + /* Sign Data */ + kret = arcfour_mic_cksum_iov(context, + key, KRB5_KU_USAGE_SEAL, + p0 + 16, 8, /* SGN_CKSUM */ + p0, 8, /* TOK_ID, SGN_ALG, SEAL_ALG, Filler */ + p0 + 24, 8, /* Confounder */ + iov, iov_count, /* Data + SignOnly */ + padding); /* padding */ + if (kret) { + *minor_status = kret; + major_status = GSS_S_FAILURE; + goto failure; + } + + Klocal.keytype = key->keytype; + Klocal.keyvalue.data = Klocaldata; + Klocal.keyvalue.length = sizeof(Klocaldata); + + for (i = 0; i < 16; i++) { + Klocaldata[i] = ((u_char *)key->keyvalue.data)[i] ^ 0xF0; + } + kret = arcfour_mic_key(context, &Klocal, + p0 + 8, 4, /* SND_SEQ */ + k6_data, sizeof(k6_data)); + memset_s(Klocaldata, sizeof(Klocaldata), 0, sizeof(Klocaldata)); + if (kret) { + *minor_status = kret; + major_status = GSS_S_FAILURE; + goto failure; + } + + if (conf_req_flag) { + EVP_CIPHER_CTX rc4_key; + + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + + /* Confounder */ + EVP_Cipher(&rc4_key, p0 + 24, p0 + 24, 8); + + /* Seal Data */ + for (i=0; i < iov_count; i++) { + switch (GSS_IOV_BUFFER_TYPE(iov[i].type)) { + case GSS_IOV_BUFFER_TYPE_DATA: + break; + default: + continue; + } + + EVP_Cipher(&rc4_key, iov[i].buffer.value, + iov[i].buffer.value, iov[i].buffer.length); + } + + /* Padding */ + if (padding) { + EVP_Cipher(&rc4_key, padding->buffer.value, + padding->buffer.value, padding->buffer.length); + } + + EVP_CIPHER_CTX_cleanup(&rc4_key); + } + memset(k6_data, 0, sizeof(k6_data)); + + kret = arcfour_mic_key(context, key, + p0 + 16, 8, /* SGN_CKSUM */ + k6_data, sizeof(k6_data)); + if (kret) { + *minor_status = kret; + major_status = GSS_S_FAILURE; + return major_status; + } + + { + EVP_CIPHER_CTX rc4_key; + + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(&rc4_key, p0 + 8, p0 + 8, 8); /* SND_SEQ */ + EVP_CIPHER_CTX_cleanup(&rc4_key); + + memset(k6_data, 0, sizeof(k6_data)); + } + + if (conf_state) + *conf_state = conf_req_flag; + + *minor_status = 0; + return GSS_S_COMPLETE; + +failure: + + gss_release_iov_buffer(&junk, iov, iov_count); + + return major_status; +} + +OM_uint32 +_gssapi_unwrap_iov_arcfour(OM_uint32 *minor_status, + gsskrb5_ctx ctx, + krb5_context context, + int *pconf_state, + gss_qop_t *pqop_state, + gss_iov_buffer_desc *iov, + int iov_count, + krb5_keyblock *key) +{ + OM_uint32 major_status; + gss_iov_buffer_desc *header, *padding, *trailer; + krb5_keyblock Klocal; + uint8_t Klocaldata[16]; + uint8_t k6_data[16], snd_seq[8], Confounder[8]; + uint8_t cksum_data[8]; + uint8_t *_p = NULL; + const uint8_t *p, *p0; + size_t verify_len = 0; + uint32_t seq_number; + size_t hlen = 0; + int conf_state; + int cmp; + size_t i; + krb5_error_code kret; + OM_uint32 ret; + + if (pconf_state != NULL) { + *pconf_state = 0; + } + if (pqop_state != NULL) { + *pqop_state = 0; + } + + header = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_HEADER); + padding = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_PADDING); + trailer = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_TRAILER); + + /* Check if the packet is correct */ + major_status = _gk_verify_buffers(minor_status, + ctx, + header, + padding, + trailer, + FALSE); /* behaves as stream cipher */ + if (major_status != GSS_S_COMPLETE) { + return major_status; + } + + if (padding != NULL && padding->buffer.length != 1) { + *minor_status = EINVAL; + return GSS_S_FAILURE; + } + + verify_len = header->buffer.length; + + if (!IS_DCE_STYLE(context)) { + for (i = 0; i < iov_count; i++) { + /* length in header also includes data and padding */ + if (GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_DATA) + verify_len += iov[i].buffer.length; + } + + if (padding) + verify_len += padding->buffer.length; + } + + _p = header->buffer.value; + + ret = _gssapi_verify_mech_header(&_p, + verify_len, + GSS_KRB5_MECHANISM); + if (ret) { + return ret; + } + p0 = _p; + + /* length of mech header */ + hlen = (p0 - (uint8_t *)header->buffer.value); + hlen += GSS_ARCFOUR_WRAP_TOKEN_SIZE; + + if (hlen > header->buffer.length) { + return GSS_S_BAD_MECH; + } + + p = p0; + + if (memcmp(p, "\x02\x01", 2) != 0) + return GSS_S_BAD_SIG; + p += 2; + if (memcmp(p, "\x11\x00", 2) != 0) /* SGN_ALG = HMAC MD5 ARCFOUR */ + return GSS_S_BAD_SIG; + p += 2; + + if (memcmp (p, "\x10\x00", 2) == 0) + conf_state = 1; + else if (memcmp (p, "\xff\xff", 2) == 0) + conf_state = 0; + else + return GSS_S_BAD_SIG; + + p += 2; + if (memcmp (p, "\xff\xff", 2) != 0) + return GSS_S_BAD_MIC; + p = NULL; + + kret = arcfour_mic_key(context, + key, + p0 + 16, /* SGN_CKSUM */ + 8, /* SGN_CKSUM_LEN */ + k6_data, + sizeof(k6_data)); + if (kret) { + *minor_status = kret; + return GSS_S_FAILURE; + } + + { + EVP_CIPHER_CTX rc4_key; + + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + EVP_Cipher(&rc4_key, snd_seq, p0 + 8, 8); /* SND_SEQ */ + EVP_CIPHER_CTX_cleanup(&rc4_key); + + memset(k6_data, 0, sizeof(k6_data)); + } + + _gsskrb5_decode_be_om_uint32(snd_seq, &seq_number); + + if (ctx->more_flags & LOCAL) { + cmp = (ct_memcmp(&snd_seq[4], "\xff\xff\xff\xff", 4) != 0); + } else { + cmp = (ct_memcmp(&snd_seq[4], "\x00\x00\x00\x00", 4) != 0); + } + if (cmp != 0) { + *minor_status = 0; + return GSS_S_BAD_MIC; + } + + /* keyblock */ + Klocal.keytype = key->keytype; + Klocal.keyvalue.data = Klocaldata; + Klocal.keyvalue.length = sizeof(Klocaldata); + + for (i = 0; i < 16; i++) { + Klocaldata[i] = ((u_char *)key->keyvalue.data)[i] ^ 0xF0; + } + + kret = arcfour_mic_key(context, + &Klocal, + snd_seq, + 4, + k6_data, sizeof(k6_data)); + memset_s(Klocaldata, sizeof(Klocaldata), 0, sizeof(Klocaldata)); + if (kret) { + *minor_status = kret; + return GSS_S_FAILURE; + } + + if (conf_state == 1) { + EVP_CIPHER_CTX rc4_key; + + EVP_CIPHER_CTX_init(&rc4_key); + EVP_CipherInit_ex(&rc4_key, EVP_rc4(), NULL, k6_data, NULL, 1); + + /* Confounder */ + EVP_Cipher(&rc4_key, Confounder, p0 + 24, 8); + + /* Data */ + for (i = 0; i < iov_count; i++) { + switch (GSS_IOV_BUFFER_TYPE(iov[i].type)) { + case GSS_IOV_BUFFER_TYPE_DATA: + break; + default: + continue; + } + + EVP_Cipher(&rc4_key, iov[i].buffer.value, + iov[i].buffer.value, iov[i].buffer.length); + } + + /* Padding */ + if (padding) { + EVP_Cipher(&rc4_key, padding->buffer.value, + padding->buffer.value, padding->buffer.length); + } + + EVP_CIPHER_CTX_cleanup(&rc4_key); + } else { + /* Confounder */ + memcpy(Confounder, p0 + 24, 8); + } + memset(k6_data, 0, sizeof(k6_data)); + + /* Prepare the buffer for signing */ + kret = arcfour_mic_cksum_iov(context, + key, KRB5_KU_USAGE_SEAL, + cksum_data, sizeof(cksum_data), + p0, 8, + Confounder, sizeof(Confounder), + iov, iov_count, + padding); + if (kret) { + *minor_status = kret; + return GSS_S_FAILURE; + } + + cmp = memcmp(cksum_data, p0 + 16, 8); /* SGN_CKSUM */ + if (cmp != 0) { + *minor_status = 0; + return GSS_S_BAD_MIC; + } + + if (padding) { + size_t plen; + + ret = _gssapi_verify_pad(&padding->buffer, 1, &plen); + if (ret) { + *minor_status = 0; + return ret; + } + } + + HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); + ret = _gssapi_msg_order_check(ctx->order, seq_number); + HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); + if (ret != 0) { + return ret; + } + + if (pconf_state) { + *pconf_state = conf_state; + } + + *minor_status = 0; + return GSS_S_COMPLETE; +} diff --git a/crypto/heimdal/lib/gssapi/krb5/authorize_localname.c b/crypto/heimdal/lib/gssapi/krb5/authorize_localname.c --- a/crypto/heimdal/lib/gssapi/krb5/authorize_localname.c +++ b/crypto/heimdal/lib/gssapi/krb5/authorize_localname.c @@ -34,7 +34,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_authorize_localname(OM_uint32 *minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_const_buffer_t user_name, gss_const_OID user_name_type) { diff --git a/crypto/heimdal/lib/gssapi/krb5/canonicalize_name.c b/crypto/heimdal/lib/gssapi/krb5/canonicalize_name.c --- a/crypto/heimdal/lib/gssapi/krb5/canonicalize_name.c +++ b/crypto/heimdal/lib/gssapi/krb5/canonicalize_name.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_canonicalize_name ( OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, const gss_OID mech_type, gss_name_t * output_name ) @@ -48,7 +48,7 @@ GSSAPI_KRB5_INIT (&context); - ret = _gsskrb5_canon_name(minor_status, context, 1, NULL, input_name, &name); + ret = _gsskrb5_canon_name(minor_status, context, input_name, &name); if (ret) return ret; diff --git a/crypto/heimdal/lib/gssapi/krb5/cfx.c b/crypto/heimdal/lib/gssapi/krb5/cfx.c --- a/crypto/heimdal/lib/gssapi/krb5/cfx.c +++ b/crypto/heimdal/lib/gssapi/krb5/cfx.c @@ -206,11 +206,36 @@ _gk_find_buffer(gss_iov_buffer_desc *iov, int iov_count, OM_uint32 type) { int i; + gss_iov_buffer_t iovp = GSS_C_NO_IOV_BUFFER; - for (i = 0; i < iov_count; i++) - if (type == GSS_IOV_BUFFER_TYPE(iov[i].type)) - return &iov[i]; - return NULL; + if (iov == GSS_C_NO_IOV_BUFFER) + return GSS_C_NO_IOV_BUFFER; + + /* + * This function is used to find header, padding or trailer buffers + * which are singletons; return NULL if multiple instances are found. + */ + for (i = 0; i < iov_count; i++) { + if (type == GSS_IOV_BUFFER_TYPE(iov[i].type)) { + if (iovp == GSS_C_NO_IOV_BUFFER) + iovp = &iov[i]; + else + return GSS_C_NO_IOV_BUFFER; + } + } + + /* + * For compatibility with SSPI, an empty padding buffer is treated + * equivalent to an absent padding buffer (unless the caller is + * requesting that a padding buffer be allocated). + */ + if (iovp && + iovp->buffer.length == 0 && + type == GSS_IOV_BUFFER_TYPE_PADDING && + (GSS_IOV_BUFFER_FLAGS(iovp->type) & GSS_IOV_BUFFER_FLAG_ALLOCATE) == 0) + iovp = NULL; + + return iovp; } OM_uint32 @@ -239,7 +264,8 @@ const gsskrb5_ctx ctx, const gss_iov_buffer_desc *header, const gss_iov_buffer_desc *padding, - const gss_iov_buffer_desc *trailer) + const gss_iov_buffer_desc *trailer, + int block_cipher) { if (header == NULL) { *minor_status = EINVAL; @@ -260,9 +286,12 @@ } } else { /* - * In non-DCE style mode we require having a padding buffer + * In non-DCE style mode we require having a padding buffer for + * encryption types that do not behave as stream ciphers. This + * check is superfluous for now, as only RC4 and RFC4121 enctypes + * are presently implemented for the IOV APIs; be defensive. */ - if (padding == NULL) { + if (block_cipher && padding == NULL) { *minor_status = EINVAL; return GSS_S_FAILURE; } @@ -272,7 +301,6 @@ return GSS_S_COMPLETE; } -#if 0 OM_uint32 _gssapi_wrap_cfx_iov(OM_uint32 *minor_status, gsskrb5_ctx ctx, @@ -307,7 +335,8 @@ trailer = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_TRAILER); - major_status = _gk_verify_buffers(minor_status, ctx, header, padding, trailer); + major_status = _gk_verify_buffers(minor_status, ctx, header, + padding, trailer, FALSE); if (major_status != GSS_S_COMPLETE) { return major_status; } @@ -392,7 +421,6 @@ if (IS_DCE_STYLE(ctx)) rrc -= ec; gsshsize += gsstsize; - gsstsize = 0; } else if (GSS_IOV_BUFFER_FLAGS(trailer->type) & GSS_IOV_BUFFER_FLAG_ALLOCATE) { major_status = _gk_allocate_buffer(minor_status, trailer, gsstsize); if (major_status) @@ -638,7 +666,6 @@ return major_status; } -#endif /* This is slowpath */ static OM_uint32 @@ -685,6 +712,7 @@ if (iov[i].buffer.length <= skip) { skip -= iov[i].buffer.length; } else { + /* copy back to original buffer */ memcpy(((uint8_t *)iov[i].buffer.value) + skip, q, iov[i].buffer.length - skip); q += iov[i].buffer.length - skip; skip = 0; @@ -699,17 +727,17 @@ GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_PADDING || GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_TRAILER) { - memcpy(q, iov[i].buffer.value, min(iov[i].buffer.length, skip)); + memcpy(iov[i].buffer.value, q, min(iov[i].buffer.length, skip)); if (iov[i].buffer.length > skip) break; skip -= iov[i].buffer.length; q += iov[i].buffer.length; } } + free(p); return GSS_S_COMPLETE; } -#if 0 OM_uint32 _gssapi_unwrap_cfx_iov(OM_uint32 *minor_status, @@ -749,7 +777,8 @@ trailer = _gk_find_buffer(iov, iov_count, GSS_IOV_BUFFER_TYPE_TRAILER); - major_status = _gk_verify_buffers(minor_status, ctx, header, padding, trailer); + major_status = _gk_verify_buffers(minor_status, ctx, header, + padding, trailer, FALSE); if (major_status != GSS_S_COMPLETE) { return major_status; } @@ -933,7 +962,6 @@ } gsshsize += gsstsize; - gsstsize = 0; } else if (trailer->buffer.length != gsstsize) { major_status = GSS_S_DEFECTIVE_TOKEN; goto failure; @@ -1011,7 +1039,6 @@ return major_status; } -#endif OM_uint32 _gssapi_wrap_iov_length_cfx(OM_uint32 *minor_status, @@ -1073,7 +1100,8 @@ } } - major_status = _gk_verify_buffers(minor_status, ctx, header, padding, trailer); + major_status = _gk_verify_buffers(minor_status, ctx, header, + padding, trailer, FALSE); if (major_status != GSS_S_COMPLETE) { return major_status; } diff --git a/crypto/heimdal/lib/gssapi/krb5/compare_name.c b/crypto/heimdal/lib/gssapi/krb5/compare_name.c --- a/crypto/heimdal/lib/gssapi/krb5/compare_name.c +++ b/crypto/heimdal/lib/gssapi/krb5/compare_name.c @@ -35,8 +35,8 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_compare_name (OM_uint32 * minor_status, - const gss_name_t name1, - const gss_name_t name2, + gss_const_name_t name1, + gss_const_name_t name2, int * name_equal ) { diff --git a/crypto/heimdal/lib/gssapi/krb5/context_time.c b/crypto/heimdal/lib/gssapi/krb5/context_time.c --- a/crypto/heimdal/lib/gssapi/krb5/context_time.c +++ b/crypto/heimdal/lib/gssapi/krb5/context_time.c @@ -36,27 +36,28 @@ OM_uint32 _gsskrb5_lifetime_left(OM_uint32 *minor_status, krb5_context context, - OM_uint32 lifetime, + OM_uint32 endtime, OM_uint32 *lifetime_rec) { - krb5_timestamp timeret; + krb5_timestamp now; krb5_error_code kret; - if (lifetime == 0) { + if (endtime == 0) { *lifetime_rec = GSS_C_INDEFINITE; return GSS_S_COMPLETE; } - kret = krb5_timeofday(context, &timeret); + kret = krb5_timeofday(context, &now); if (kret) { + *lifetime_rec = 0; *minor_status = kret; return GSS_S_FAILURE; } - if (lifetime < timeret) + if (endtime < now) *lifetime_rec = 0; else - *lifetime_rec = lifetime - timeret; + *lifetime_rec = endtime - now; return GSS_S_COMPLETE; } @@ -64,23 +65,23 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_context_time (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, OM_uint32 * time_rec ) { krb5_context context; - OM_uint32 lifetime; + OM_uint32 endtime; OM_uint32 major_status; const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; GSSAPI_KRB5_INIT (&context); HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); - lifetime = ctx->lifetime; + endtime = ctx->endtime; HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); major_status = _gsskrb5_lifetime_left(minor_status, context, - lifetime, time_rec); + endtime, time_rec); if (major_status != GSS_S_COMPLETE) return major_status; diff --git a/crypto/heimdal/lib/gssapi/krb5/copy_ccache.c b/crypto/heimdal/lib/gssapi/krb5/copy_ccache.c --- a/crypto/heimdal/lib/gssapi/krb5/copy_ccache.c +++ b/crypto/heimdal/lib/gssapi/krb5/copy_ccache.c @@ -89,6 +89,8 @@ handle->usage = 0; if (id) { + time_t now; + OM_uint32 left; char *str; handle->usage |= GSS_C_INITIATE; @@ -116,17 +118,18 @@ } } + krb5_timeofday(context, &now); ret = __gsskrb5_ccache_lifetime(minor_status, context, id, handle->principal, - &handle->lifetime); + &left); if (ret != GSS_S_COMPLETE) { krb5_free_principal(context, handle->principal); free(handle); return ret; } - + handle->endtime = now + left; kret = krb5_cc_get_full_name(context, id, &str); if (kret) diff --git a/crypto/heimdal/lib/gssapi/krb5/creds.c b/crypto/heimdal/lib/gssapi/krb5/creds.c --- a/crypto/heimdal/lib/gssapi/krb5/creds.c +++ b/crypto/heimdal/lib/gssapi/krb5/creds.c @@ -62,6 +62,9 @@ type = krb5_cc_get_type(context, handle->ccache); if (strcmp(type, "MEMORY") == 0) { krb5_creds *creds; + krb5_data config_start_realm; + char *start_realm; + ret = krb5_store_uint32(sp, 0); if (ret) { krb5_storage_free(sp); @@ -69,9 +72,25 @@ return GSS_S_FAILURE; } - ret = _krb5_get_krbtgt(context, handle->ccache, - handle->principal->realm, - &creds); + ret = krb5_cc_get_config(context, handle->ccache, NULL, "start_realm", + &config_start_realm); + if (ret == 0) { + start_realm = strndup(config_start_realm.data, + config_start_realm.length); + krb5_data_free(&config_start_realm); + } else { + start_realm = strdup(krb5_principal_get_realm(context, + handle->principal)); + } + if (start_realm == NULL) { + *minor_status = krb5_enomem(context); + krb5_storage_free(sp); + return GSS_S_FAILURE; + } + + ret = _krb5_get_krbtgt(context, handle->ccache, start_realm, &creds); + free(start_realm); + start_realm = NULL; if (ret) { krb5_storage_free(sp); *minor_status = ret; @@ -210,6 +229,10 @@ ret = krb5_cc_store_cred(context, id, &creds); krb5_free_cred_contents(context, &creds); + if (ret) { + *minor_status = ret; + return GSS_S_FAILURE; + } flags |= GSS_CF_DESTROY_CRED_ON_RELEASE; diff --git a/crypto/heimdal/lib/gssapi/krb5/decapsulate.c b/crypto/heimdal/lib/gssapi/krb5/decapsulate.c --- a/crypto/heimdal/lib/gssapi/krb5/decapsulate.c +++ b/crypto/heimdal/lib/gssapi/krb5/decapsulate.c @@ -196,6 +196,9 @@ size_t padlength; int i; + if (wrapped_token->length < 1) + return GSS_S_BAD_MECH; + pad = (u_char *)wrapped_token->value + wrapped_token->length; padlength = pad[-1]; diff --git a/crypto/heimdal/lib/gssapi/krb5/delete_sec_context.c b/crypto/heimdal/lib/gssapi/krb5/delete_sec_context.c --- a/crypto/heimdal/lib/gssapi/krb5/delete_sec_context.c +++ b/crypto/heimdal/lib/gssapi/krb5/delete_sec_context.c @@ -75,6 +75,8 @@ krb5_data_free(&ctx->fwd_data); if (ctx->crypto) krb5_crypto_destroy(context, ctx->crypto); + if (ctx->ccache && (ctx->more_flags & CLOSE_CCACHE)) + krb5_cc_close(context, ctx->ccache); HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); HEIMDAL_MUTEX_destroy(&ctx->ctx_id_mutex); diff --git a/crypto/heimdal/lib/gssapi/krb5/display_name.c b/crypto/heimdal/lib/gssapi/krb5/display_name.c --- a/crypto/heimdal/lib/gssapi/krb5/display_name.c +++ b/crypto/heimdal/lib/gssapi/krb5/display_name.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_display_name (OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t output_name_buffer, gss_OID * output_name_type ) diff --git a/crypto/heimdal/lib/gssapi/krb5/display_status.c b/crypto/heimdal/lib/gssapi/krb5/display_status.c --- a/crypto/heimdal/lib/gssapi/krb5/display_status.c +++ b/crypto/heimdal/lib/gssapi/krb5/display_status.c @@ -64,8 +64,7 @@ "Incorrect channel bindings were supplied", "An invalid status code was supplied", "A token had an invalid MIC", - "No credentials were supplied, " - "or the credentials were unavailable or inaccessible.", + "No credentials were supplied, or the credentials were unavailable or inaccessible.", "No context has been established", "A token was invalid", "A credential was invalid", diff --git a/crypto/heimdal/lib/gssapi/krb5/duplicate_name.c b/crypto/heimdal/lib/gssapi/krb5/duplicate_name.c --- a/crypto/heimdal/lib/gssapi/krb5/duplicate_name.c +++ b/crypto/heimdal/lib/gssapi/krb5/duplicate_name.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_duplicate_name ( OM_uint32 * minor_status, - const gss_name_t src_name, + gss_const_name_t src_name, gss_name_t * dest_name ) { diff --git a/crypto/heimdal/lib/gssapi/krb5/export_name.c b/crypto/heimdal/lib/gssapi/krb5/export_name.c --- a/crypto/heimdal/lib/gssapi/krb5/export_name.c +++ b/crypto/heimdal/lib/gssapi/krb5/export_name.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_export_name (OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t exported_name ) { diff --git a/crypto/heimdal/lib/gssapi/krb5/export_sec_context.c b/crypto/heimdal/lib/gssapi/krb5/export_sec_context.c --- a/crypto/heimdal/lib/gssapi/krb5/export_sec_context.c +++ b/crypto/heimdal/lib/gssapi/krb5/export_sec_context.c @@ -34,9 +34,9 @@ #include "gsskrb5_locl.h" OM_uint32 GSSAPI_CALLCONV -_gsskrb5_export_sec_context ( - OM_uint32 * minor_status, - gss_ctx_id_t * context_handle, +_gsskrb5_export_sec_context( + OM_uint32 *minor_status, + gss_ctx_id_t *context_handle, gss_buffer_t interprocess_token ) { @@ -204,7 +204,11 @@ *minor_status = kret; goto failure; } - kret = krb5_store_int32 (sp, ctx->lifetime); + /* + * XXX We should put a 64-bit int here, but we don't have a + * krb5_store_int64() yet. + */ + kret = krb5_store_int32 (sp, ctx->endtime); if (kret) { *minor_status = kret; goto failure; diff --git a/crypto/heimdal/lib/gssapi/krb5/external.c b/crypto/heimdal/lib/gssapi/krb5/external.c --- a/crypto/heimdal/lib/gssapi/krb5/external.c +++ b/crypto/heimdal/lib/gssapi/krb5/external.c @@ -175,7 +175,6 @@ * Context for krb5 calls. */ -#if 0 static gss_mo_desc krb5_mo[] = { { GSS_C_MA_SASL_MECH_NAME, @@ -203,70 +202,133 @@ }, { GSS_C_MA_MECH_CONCRETE, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_ITOK_FRAMED, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_AUTH_INIT, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_AUTH_TARG, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_AUTH_INIT_ANON, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_DELEG_CRED, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_INTEG_PROT, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_CONF_PROT, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_MIC, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_WRAP, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_PROT_READY, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_REPLAY_DET, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_OOS_DET, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_CBINDINGS, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_PFS, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_CTX_TRANS, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL } }; -#endif /* * @@ -311,15 +373,9 @@ _gsskrb5_set_sec_context_option, _gsskrb5_set_cred_option, _gsskrb5_pseudo_random, -#if 0 _gk_wrap_iov, _gk_unwrap_iov, _gk_wrap_iov_length, -#else - NULL, - NULL, - NULL, -#endif _gsskrb5_store_cred, _gsskrb5_export_cred, _gsskrb5_import_cred, @@ -330,14 +386,9 @@ NULL, NULL, NULL, -#if 0 krb5_mo, sizeof(krb5_mo) / sizeof(krb5_mo[0]), -#else - NULL, - 0, -#endif - _gsskrb5_pname_to_uid, + _gsskrb5_localname, _gsskrb5_authorize_localname, NULL, NULL, diff --git a/crypto/heimdal/lib/gssapi/krb5/get_mic.c b/crypto/heimdal/lib/gssapi/krb5/get_mic.c --- a/crypto/heimdal/lib/gssapi/krb5/get_mic.c +++ b/crypto/heimdal/lib/gssapi/krb5/get_mic.c @@ -50,7 +50,7 @@ EVP_MD_CTX *md5; u_char hash[16]; DES_key_schedule schedule; - EVP_CIPHER_CTX *des_ctx; + EVP_CIPHER_CTX des_ctx; DES_cblock deskey; DES_cblock zero; int32_t seq_number; @@ -96,17 +96,6 @@ &schedule, &zero); memcpy (p - 8, hash, 8); /* SGN_CKSUM */ - des_ctx = EVP_CIPHER_CTX_new(); - if (des_ctx == NULL) { - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); - free (message_token->value); - message_token->value = NULL; - message_token->length = 0; - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); /* sequence number */ krb5_auth_con_getlocalseqnumber (context, @@ -122,17 +111,18 @@ (ctx->more_flags & LOCAL) ? 0 : 0xFF, 4); - EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); - EVP_Cipher(des_ctx, p, p, 8); - EVP_CIPHER_CTX_free(des_ctx); + EVP_CIPHER_CTX_init(&des_ctx); + EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); + EVP_Cipher(&des_ctx, p, p, 8); + EVP_CIPHER_CTX_cleanup(&des_ctx); krb5_auth_con_setlocalseqnumber (context, ctx->auth_context, ++seq_number); HEIMDAL_MUTEX_unlock(&ctx->ctx_id_mutex); - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); + memset_s(deskey, sizeof(deskey), 0, sizeof(deskey)); + memset_s(&schedule, sizeof(schedule), 0, sizeof(schedule)); *minor_status = 0; return GSS_S_COMPLETE; @@ -285,7 +275,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_get_mic (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_qop_t qop_req, const gss_buffer_t message_buffer, gss_buffer_t message_token @@ -295,7 +285,6 @@ const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; krb5_keyblock *key; OM_uint32 ret; - krb5_keytype keytype; GSSAPI_KRB5_INIT (&context); @@ -310,10 +299,11 @@ *minor_status = ret; return GSS_S_FAILURE; } - krb5_enctype_to_keytype (context, key->keytype, &keytype); - switch (keytype) { - case KEYTYPE_DES : + switch (key->keytype) { + case KRB5_ENCTYPE_DES_CBC_CRC : + case KRB5_ENCTYPE_DES_CBC_MD4 : + case KRB5_ENCTYPE_DES_CBC_MD5 : #ifdef HEIM_WEAK_CRYPTO ret = mic_des (minor_status, ctx, context, qop_req, message_buffer, message_token, key); @@ -321,12 +311,13 @@ ret = GSS_S_FAILURE; #endif break; - case KEYTYPE_DES3 : + case KRB5_ENCTYPE_DES3_CBC_MD5 : + case KRB5_ENCTYPE_DES3_CBC_SHA1 : ret = mic_des3 (minor_status, ctx, context, qop_req, message_buffer, message_token, key); break; - case KEYTYPE_ARCFOUR: - case KEYTYPE_ARCFOUR_56: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56: ret = _gssapi_get_mic_arcfour (minor_status, ctx, context, qop_req, message_buffer, message_token, key); break; diff --git a/crypto/heimdal/lib/gssapi/krb5/gsskrb5-private.h b/crypto/heimdal/lib/gssapi/krb5/gsskrb5-private.h --- a/crypto/heimdal/lib/gssapi/krb5/gsskrb5-private.h +++ b/crypto/heimdal/lib/gssapi/krb5/gsskrb5-private.h @@ -42,7 +42,8 @@ const gsskrb5_ctx /*ctx*/, const gss_iov_buffer_desc */*header*/, const gss_iov_buffer_desc */*padding*/, - const gss_iov_buffer_desc */*trailer*/); + const gss_iov_buffer_desc */*trailer*/, + int /*block_cipher*/); OM_uint32 GSSAPI_CALLCONV _gk_wrap_iov ( @@ -178,6 +179,17 @@ gss_iov_buffer_desc */*iov*/, int /*iov_count*/); +OM_uint32 +_gssapi_unwrap_iov_arcfour ( + OM_uint32 */*minor_status*/, + gsskrb5_ctx /*ctx*/, + krb5_context /*context*/, + int */*pconf_state*/, + gss_qop_t */*pqop_state*/, + gss_iov_buffer_desc */*iov*/, + int /*iov_count*/, + krb5_keyblock */*key*/); + OM_uint32 _gssapi_verify_mech_header ( u_char **/*str*/, @@ -242,6 +254,28 @@ gss_iov_buffer_desc */*iov*/, int /*iov_count*/); +OM_uint32 +_gssapi_wrap_iov_arcfour ( + OM_uint32 */*minor_status*/, + gsskrb5_ctx /*ctx*/, + krb5_context /*context*/, + int /*conf_req_flag*/, + int */*conf_state*/, + gss_iov_buffer_desc */*iov*/, + int /*iov_count*/, + krb5_keyblock */*key*/); + +OM_uint32 +_gssapi_wrap_iov_length_arcfour ( + OM_uint32 */*minor_status*/, + gsskrb5_ctx /*ctx*/, + krb5_context /*context*/, + int /*conf_req_flag*/, + gss_qop_t /*qop_req*/, + int */*conf_state*/, + gss_iov_buffer_desc */*iov*/, + int /*iov_count*/); + OM_uint32 _gssapi_wrap_iov_length_cfx ( OM_uint32 */*minor_status*/, @@ -278,7 +312,7 @@ _gsskrb5_accept_sec_context ( OM_uint32 * /*minor_status*/, gss_ctx_id_t * /*context_handle*/, - const gss_cred_id_t /*acceptor_cred_handle*/, + gss_const_cred_id_t /*acceptor_cred_handle*/, const gss_buffer_t /*input_token_buffer*/, const gss_channel_bindings_t /*input_chan_bindings*/, gss_name_t * /*src_name*/, @@ -291,7 +325,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_acquire_cred ( OM_uint32 * /*minor_status*/, - const gss_name_t /*desired_name*/, + gss_const_name_t /*desired_name*/, OM_uint32 /*time_req*/, const gss_OID_set /*desired_mechs*/, gss_cred_usage_t /*cred_usage*/, @@ -302,7 +336,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_acquire_cred_ext ( OM_uint32 * /*minor_status*/, - const gss_name_t /*desired_name*/, + gss_const_name_t /*desired_name*/, gss_const_OID /*credential_type*/, const void */*credential_data*/, OM_uint32 /*time_req*/, @@ -313,8 +347,8 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_add_cred ( OM_uint32 */*minor_status*/, - const gss_cred_id_t /*input_cred_handle*/, - const gss_name_t /*desired_name*/, + gss_const_cred_id_t /*input_cred_handle*/, + gss_const_name_t /*desired_name*/, const gss_OID /*desired_mech*/, gss_cred_usage_t /*cred_usage*/, OM_uint32 /*initiator_time_req*/, @@ -327,7 +361,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_authorize_localname ( OM_uint32 */*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_const_buffer_t /*user_name*/, gss_const_OID /*user_name_type*/); @@ -335,15 +369,13 @@ _gsskrb5_canon_name ( OM_uint32 */*minor_status*/, krb5_context /*context*/, - int /*use_dns*/, - krb5_const_principal /*sourcename*/, - gss_name_t /*targetname*/, + gss_const_name_t /*targetname*/, krb5_principal */*out*/); OM_uint32 GSSAPI_CALLCONV _gsskrb5_canonicalize_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, const gss_OID /*mech_type*/, gss_name_t * output_name ); @@ -353,14 +385,14 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_compare_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*name1*/, - const gss_name_t /*name2*/, + gss_const_name_t /*name1*/, + gss_const_name_t /*name2*/, int * name_equal ); OM_uint32 GSSAPI_CALLCONV _gsskrb5_context_time ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, OM_uint32 * time_rec ); OM_uint32 @@ -406,7 +438,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_display_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t /*output_name_buffer*/, gss_OID * output_name_type ); @@ -422,7 +454,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_duplicate_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*src_name*/, + gss_const_name_t /*src_name*/, gss_name_t * dest_name ); void @@ -459,13 +491,13 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_export_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t exported_name ); OM_uint32 GSSAPI_CALLCONV _gsskrb5_export_sec_context ( - OM_uint32 * /*minor_status*/, - gss_ctx_id_t * /*context_handle*/, + OM_uint32 */*minor_status*/, + gss_ctx_id_t */*context_handle*/, gss_buffer_t interprocess_token ); ssize_t @@ -477,7 +509,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_get_mic ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*message_buffer*/, gss_buffer_t message_token ); @@ -518,9 +550,9 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_init_sec_context ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, gss_ctx_id_t * /*context_handle*/, - const gss_name_t /*target_name*/, + gss_const_name_t /*target_name*/, const gss_OID /*mech_type*/, OM_uint32 /*req_flags*/, OM_uint32 /*time_req*/, @@ -534,7 +566,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_context ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_name_t * /*src_name*/, gss_name_t * /*targ_name*/, OM_uint32 * /*lifetime_rec*/, @@ -546,7 +578,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_cred ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, gss_name_t * /*output_name*/, OM_uint32 * /*lifetime*/, gss_cred_usage_t * /*cred_usage*/, @@ -555,7 +587,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_cred_by_mech ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, const gss_OID /*mech_type*/, gss_name_t * /*name*/, OM_uint32 * /*initiator_lifetime*/, @@ -565,14 +597,14 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_cred_by_oid ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, const gss_OID /*desired_object*/, gss_buffer_set_t */*data_set*/); OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_mechs_for_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_OID_set * mech_types ); OM_uint32 GSSAPI_CALLCONV @@ -584,7 +616,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_sec_context_by_oid ( OM_uint32 */*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_OID /*desired_object*/, gss_buffer_set_t */*data_set*/); @@ -606,9 +638,16 @@ _gsskrb5_lifetime_left ( OM_uint32 */*minor_status*/, krb5_context /*context*/, - OM_uint32 /*lifetime*/, + OM_uint32 /*endtime*/, OM_uint32 */*lifetime_rec*/); +OM_uint32 GSSAPI_CALLCONV +_gsskrb5_localname ( + OM_uint32 */*minor_status*/, + gss_const_name_t /*pname*/, + const gss_OID /*mech_type*/, + gss_buffer_t /*localname*/); + void * _gsskrb5_make_header ( void */*ptr*/, @@ -616,17 +655,10 @@ const void */*type*/, const gss_OID /*mech*/); -OM_uint32 GSSAPI_CALLCONV -_gsskrb5_pname_to_uid ( - OM_uint32 */*minor_status*/, - const gss_name_t /*pname*/, - const gss_OID /*mech_type*/, - uid_t */*uidp*/); - OM_uint32 GSSAPI_CALLCONV _gsskrb5_process_context_token ( OM_uint32 */*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t token_buffer ); OM_uint32 GSSAPI_CALLCONV @@ -692,7 +724,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_unwrap ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*input_message_buffer*/, gss_buffer_t /*output_message_buffer*/, int * /*conf_state*/, @@ -716,7 +748,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_verify_mic ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*message_buffer*/, const gss_buffer_t /*token_buffer*/, gss_qop_t * qop_state ); @@ -734,7 +766,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_wrap ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*input_message_buffer*/, @@ -744,7 +776,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_wrap_size_limit ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, OM_uint32 /*req_output_size*/, diff --git a/crypto/heimdal/lib/gssapi/krb5/gsskrb5_locl.h b/crypto/heimdal/lib/gssapi/krb5/gsskrb5_locl.h --- a/crypto/heimdal/lib/gssapi/krb5/gsskrb5_locl.h +++ b/crypto/heimdal/lib/gssapi/krb5/gsskrb5_locl.h @@ -81,7 +81,7 @@ krb5_creds *kcred; krb5_ccache ccache; struct krb5_ticket *ticket; - OM_uint32 lifetime; + time_t endtime; HEIMDAL_MUTEX ctx_id_mutex; struct gss_msg_order *order; krb5_keyblock *service_keyblock; @@ -95,7 +95,7 @@ #define GSS_CF_DESTROY_CRED_ON_RELEASE 1 #define GSS_CF_NO_CI_FLAGS 2 struct krb5_keytab_data *keytab; - OM_uint32 lifetime; + time_t endtime; gss_cred_usage_t usage; gss_OID_set mechanisms; struct krb5_ccache_data *ccache; @@ -134,7 +134,4 @@ #define SC_LOCAL_SUBKEY 0x08 #define SC_REMOTE_SUBKEY 0x10 -/* type to signal that that dns canon maybe should be done */ -#define MAGIC_HOSTBASED_NAME_TYPE 4711 - #endif diff --git a/crypto/heimdal/lib/gssapi/krb5/import_name.c b/crypto/heimdal/lib/gssapi/krb5/import_name.c --- a/crypto/heimdal/lib/gssapi/krb5/import_name.c +++ b/crypto/heimdal/lib/gssapi/krb5/import_name.c @@ -83,26 +83,21 @@ OM_uint32 _gsskrb5_canon_name(OM_uint32 *minor_status, krb5_context context, - int use_dns, krb5_const_principal sourcename, gss_name_t targetname, - krb5_principal *out) + gss_const_name_t targetname, krb5_principal *out) { - krb5_principal p = (krb5_principal)targetname; + krb5_const_principal p = (krb5_const_principal)targetname; krb5_error_code ret; char *hostname = NULL, *service; + int type; + const char *comp; *minor_status = 0; /* If its not a hostname */ - if (krb5_principal_get_type(context, p) != MAGIC_HOSTBASED_NAME_TYPE) { - ret = krb5_copy_principal(context, p, out); - } else if (!use_dns) { - ret = krb5_copy_principal(context, p, out); - if (ret) - goto out; - krb5_principal_set_type(context, *out, KRB5_NT_SRV_HST); - if (sourcename) - ret = krb5_principal_set_realm(context, *out, sourcename->realm); - } else { + type = krb5_principal_get_type(context, p); + comp = krb5_principal_get_comp_string(context, p, 0); + if (type == KRB5_NT_SRV_HST || type == KRB5_NT_SRV_HST_NEEDS_CANON || + (type == KRB5_NT_UNKNOWN && comp != NULL && strcmp(comp, "host") == 0)) { if (p->name.name_string.len == 0) return GSS_S_BAD_NAME; else if (p->name.name_string.len > 1) @@ -115,9 +110,10 @@ service, KRB5_NT_SRV_HST, out); + } else { + ret = krb5_copy_principal(context, p, out); } - out: if (ret) { *minor_status = ret; return GSS_S_FAILURE; @@ -128,10 +124,10 @@ static OM_uint32 -import_hostbased_name (OM_uint32 *minor_status, - krb5_context context, - const gss_buffer_t input_name_buffer, - gss_name_t *output_name) +import_hostbased_name(OM_uint32 *minor_status, + krb5_context context, + const gss_buffer_t input_name_buffer, + gss_name_t *output_name) { krb5_principal princ = NULL; krb5_error_code kerr; @@ -153,7 +149,7 @@ host = p + 1; } - kerr = krb5_make_principal(context, &princ, NULL, tmp, host, NULL); + kerr = krb5_make_principal(context, &princ, "", tmp, host, NULL); free (tmp); *minor_status = kerr; if (kerr == KRB5_PARSE_ILLCHAR || kerr == KRB5_PARSE_MALFORMED) @@ -161,7 +157,7 @@ else if (kerr) return GSS_S_FAILURE; - krb5_principal_set_type(context, princ, MAGIC_HOSTBASED_NAME_TYPE); + krb5_principal_set_type(context, princ, KRB5_NT_SRV_HST); *output_name = (gss_name_t)princ; return 0; diff --git a/crypto/heimdal/lib/gssapi/krb5/import_sec_context.c b/crypto/heimdal/lib/gssapi/krb5/import_sec_context.c --- a/crypto/heimdal/lib/gssapi/krb5/import_sec_context.c +++ b/crypto/heimdal/lib/gssapi/krb5/import_sec_context.c @@ -192,9 +192,13 @@ if (krb5_ret_int32 (sp, &tmp)) goto failure; ctx->more_flags = tmp; + /* + * XXX endtime should be a 64-bit int, but we don't have + * krb5_ret_int64() yet. + */ if (krb5_ret_int32 (sp, &tmp)) goto failure; - ctx->lifetime = tmp; + ctx->endtime = tmp; ret = _gssapi_msg_order_import(minor_status, sp, &ctx->order); if (ret) diff --git a/crypto/heimdal/lib/gssapi/krb5/init_sec_context.c b/crypto/heimdal/lib/gssapi/krb5/init_sec_context.c --- a/crypto/heimdal/lib/gssapi/krb5/init_sec_context.c +++ b/crypto/heimdal/lib/gssapi/krb5/init_sec_context.c @@ -128,7 +128,7 @@ ctx->service_keyblock = NULL; ctx->ticket = NULL; krb5_data_zero(&ctx->fwd_data); - ctx->lifetime = GSS_C_INDEFINITE; + ctx->endtime = 0; ctx->order = NULL; ctx->crypto = NULL; HEIMDAL_MUTEX_init(&ctx->ctx_id_mutex); @@ -137,6 +137,7 @@ if (kret) { *minor_status = kret; HEIMDAL_MUTEX_destroy(&ctx->ctx_id_mutex); + free(ctx); return GSS_S_FAILURE; } @@ -145,6 +146,7 @@ *minor_status = kret; krb5_auth_con_free(context, ctx->auth_context); HEIMDAL_MUTEX_destroy(&ctx->ctx_id_mutex); + free(ctx); return GSS_S_FAILURE; } @@ -156,7 +158,7 @@ krb5_auth_con_free(context, ctx->deleg_auth_context); HEIMDAL_MUTEX_destroy(&ctx->ctx_id_mutex); - + free(ctx); return GSS_S_BAD_BINDINGS; } @@ -168,7 +170,7 @@ krb5_auth_con_free(context, ctx->deleg_auth_context); HEIMDAL_MUTEX_destroy(&ctx->ctx_id_mutex); - + free(ctx); return GSS_S_BAD_BINDINGS; } @@ -204,8 +206,7 @@ krb5_context context, krb5_ccache ccache, gsskrb5_ctx ctx, - const gss_name_t target_name, - int use_dns, + gss_const_name_t target_name, OM_uint32 time_req, OM_uint32 * time_rec) { @@ -223,8 +224,8 @@ ctx->kcred = NULL; } - ret = _gsskrb5_canon_name(minor_status, context, use_dns, - ctx->source, target_name, &ctx->target); + ret = _gsskrb5_canon_name(minor_status, context, target_name, + &ctx->target); if (ret) return ret; @@ -253,10 +254,10 @@ return GSS_S_FAILURE; } - ctx->lifetime = ctx->kcred->times.endtime; + ctx->endtime = ctx->kcred->times.endtime; ret = _gsskrb5_lifetime_left(minor_status, context, - ctx->lifetime, &lifetime_rec); + ctx->endtime, &lifetime_rec); if (ret) return ret; if (lifetime_rec == 0) { @@ -344,8 +345,7 @@ fwd_flags.forwarded = 1; fwd_flags.forwardable = 1; - if ( /*target_name->name.name_type != KRB5_NT_SRV_HST ||*/ - name->name.name_string.len < 2) + if (name->name.name_string.len < 2) goto out; kret = krb5_get_forwarded_creds(context, @@ -378,7 +378,7 @@ gsskrb5_cred cred, gsskrb5_ctx ctx, krb5_context context, - gss_name_t name, + gss_const_name_t name, const gss_OID mech_type, OM_uint32 req_flags, OM_uint32 time_req, @@ -391,12 +391,9 @@ { OM_uint32 ret = GSS_S_FAILURE; krb5_error_code kret; - krb5_data outbuf; krb5_data fwd_data; OM_uint32 lifetime_rec; - int allow_dns = 1; - krb5_data_zero(&outbuf); krb5_data_zero(&fwd_data); *minor_status = 0; @@ -425,44 +422,17 @@ /* * This is hideous glue for (NFS) clients that wants to limit the * available enctypes to what it can support (encryption in - * kernel). If there is no enctypes selected for this credential, - * reset it to the default set of enctypes. + * kernel). */ - { - krb5_enctype *enctypes = NULL; + if (cred && cred->enctypes) + krb5_set_default_in_tkt_etypes(context, cred->enctypes); - if (cred && cred->enctypes) - enctypes = cred->enctypes; - krb5_set_default_in_tkt_etypes(context, enctypes); - } - - /* canon name if needed for client + target realm */ - kret = krb5_cc_get_config(context, ctx->ccache, NULL, - "realm-config", &outbuf); - if (kret == 0) { - /* XXX 2 is no server canon */ - if (outbuf.length < 1 || ((((unsigned char *)outbuf.data)[0]) & 2)) - allow_dns = 0; - krb5_data_free(&outbuf); - } - - /* - * First we try w/o dns, hope that the KDC have register alias - * (and referrals if cross realm) for this principal. If that - * fails and if we are allowed to using this realm try again with - * DNS canonicalizion. - */ ret = gsskrb5_get_creds(minor_status, context, ctx->ccache, - ctx, name, 0, time_req, - time_rec); - if (ret && allow_dns) - ret = gsskrb5_get_creds(minor_status, context, ctx->ccache, - ctx, name, 1, time_req, - time_rec); + ctx, name, time_req, time_rec); if (ret) goto failure; - ctx->lifetime = ctx->kcred->times.endtime; + ctx->endtime = ctx->kcred->times.endtime; ret = _gss_DES3_get_mic_compat(minor_status, ctx, context); if (ret) @@ -470,7 +440,7 @@ ret = _gsskrb5_lifetime_left(minor_status, context, - ctx->lifetime, + ctx->endtime, &lifetime_rec); if (ret) goto failure; @@ -630,7 +600,19 @@ if (ret == 0) { if (timedata.length == 4) { const u_char *p = timedata.data; - offset = (p[0] <<24) | (p[1] << 16) | (p[2] << 8) | (p[3] << 0); + if (p[0] < 128) { + offset = (p[0] <<24) | (p[1] << 16) | (p[2] << 8) | (p[3] << 0); + } else { + /* + * (p[0] << 24), if p[0] > 127 -> offset is negative, but *p is + * positive, so this is overflow -- overflow we want, but UBSAN + * flags it. + * + * NOTE: We assume the platform is a twos-complement platform. + */ + offset = INT32_MIN; + offset |= ((p[0] & 0x7f) <<24) | (p[1] << 16) | (p[2] << 8) | (p[3] << 0); + } } krb5_data_free(&timedata); } @@ -817,14 +799,11 @@ repl); *minor_status = 0; - if (time_rec) { - ret = _gsskrb5_lifetime_left(minor_status, - context, - ctx->lifetime, - time_rec); - } else { - ret = GSS_S_COMPLETE; - } + if (time_rec) + _gsskrb5_lifetime_left(minor_status, + context, + ctx->endtime, + time_rec); if (ret_flags) *ret_flags = ctx->flags; @@ -865,9 +844,9 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_init_sec_context (OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, gss_ctx_id_t * context_handle, - const gss_name_t target_name, + gss_const_name_t target_name, const gss_OID mech_type, OM_uint32 req_flags, OM_uint32 time_req, @@ -954,7 +933,7 @@ time_rec); if (ret != GSS_S_COMPLETE) break; - /* FALL THOUGH */ + /* FALLTHROUGH */ case INITIATOR_RESTART: ret = init_auth_restart(minor_status, cred, diff --git a/crypto/heimdal/lib/gssapi/krb5/inquire_context.c b/crypto/heimdal/lib/gssapi/krb5/inquire_context.c --- a/crypto/heimdal/lib/gssapi/krb5/inquire_context.c +++ b/crypto/heimdal/lib/gssapi/krb5/inquire_context.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_context ( OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_name_t * src_name, gss_name_t * targ_name, OM_uint32 * lifetime_rec, @@ -76,7 +76,7 @@ if (lifetime_rec) { ret = _gsskrb5_lifetime_left(minor_status, context, - ctx->lifetime, + ctx->endtime, lifetime_rec); if (ret) goto failed; diff --git a/crypto/heimdal/lib/gssapi/krb5/inquire_cred.c b/crypto/heimdal/lib/gssapi/krb5/inquire_cred.c --- a/crypto/heimdal/lib/gssapi/krb5/inquire_cred.c +++ b/crypto/heimdal/lib/gssapi/krb5/inquire_cred.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_cred (OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, gss_name_t * output_name, OM_uint32 * lifetime, gss_cred_usage_t * cred_usage, @@ -45,136 +45,179 @@ krb5_context context; gss_cred_id_t aqcred_init = GSS_C_NO_CREDENTIAL; gss_cred_id_t aqcred_accept = GSS_C_NO_CREDENTIAL; - gsskrb5_cred acred = NULL, icred = NULL; + gsskrb5_cred cred = (gsskrb5_cred)cred_handle; + gss_OID_set amechs = GSS_C_NO_OID_SET; + gss_OID_set imechs = GSS_C_NO_OID_SET; + OM_uint32 junk; + OM_uint32 aminor; OM_uint32 ret; + OM_uint32 aret; + OM_uint32 alife = GSS_C_INDEFINITE; + OM_uint32 ilife = GSS_C_INDEFINITE; + + /* + * XXX This function is more complex than it has to be. It should call + * _gsskrb5_inquire_cred_by_mech() twice and merge the results in the + * cred_handle == GSS_C_NO_CREDENTIAL case, but since + * _gsskrb5_inquire_cred_by_mech() is implemented in terms of this + * function, first we must fix _gsskrb5_inquire_cred_by_mech(). + */ *minor_status = 0; if (output_name) - *output_name = NULL; + *output_name = GSS_C_NO_NAME; + if (cred_usage) + *cred_usage = GSS_C_BOTH; /* There's no NONE */ if (mechanisms) - *mechanisms = GSS_C_NO_OID_SET; + *mechanisms = GSS_C_NO_OID_SET; GSSAPI_KRB5_INIT (&context); if (cred_handle == GSS_C_NO_CREDENTIAL) { - ret = _gsskrb5_acquire_cred(minor_status, - GSS_C_NO_NAME, - GSS_C_INDEFINITE, - GSS_C_NO_OID_SET, - GSS_C_ACCEPT, - &aqcred_accept, - NULL, - NULL); - if (ret == GSS_S_COMPLETE) - acred = (gsskrb5_cred)aqcred_accept; - - ret = _gsskrb5_acquire_cred(minor_status, - GSS_C_NO_NAME, - GSS_C_INDEFINITE, - GSS_C_NO_OID_SET, - GSS_C_INITIATE, - &aqcred_init, - NULL, - NULL); - if (ret == GSS_S_COMPLETE) - icred = (gsskrb5_cred)aqcred_init; - - if (icred == NULL && acred == NULL) { - *minor_status = 0; - return GSS_S_NO_CRED; - } - } else - acred = (gsskrb5_cred)cred_handle; + /* + * From here to the end of this if we should refactor into a separate + * function. + */ + /* Get the info for the default ACCEPT credential */ + aret = _gsskrb5_acquire_cred(&aminor, + GSS_C_NO_NAME, + GSS_C_INDEFINITE, + GSS_C_NO_OID_SET, + GSS_C_ACCEPT, + &aqcred_accept, + NULL, + NULL); + if (aret == GSS_S_COMPLETE) { + aret = _gsskrb5_inquire_cred(&aminor, + aqcred_accept, + output_name, + &alife, + NULL, + &amechs); + (void) _gsskrb5_release_cred(&junk, &aqcred_accept); + if (aret == GSS_S_COMPLETE) { + output_name = NULL; /* Can't merge names; output only one */ + if (cred_usage) + *cred_usage = GSS_C_ACCEPT; + if (lifetime) + *lifetime = alife; + if (mechanisms) { + *mechanisms = amechs; + amechs = GSS_C_NO_OID_SET; + } + (void) gss_release_oid_set(&junk, &amechs); + } else if (aret != GSS_S_NO_CRED) { + *minor_status = aminor; + return aret; + } else { + alife = GSS_C_INDEFINITE; + } + } + + /* Get the info for the default INITIATE credential */ + ret = _gsskrb5_acquire_cred(minor_status, + GSS_C_NO_NAME, + GSS_C_INDEFINITE, + GSS_C_NO_OID_SET, + GSS_C_INITIATE, + &aqcred_init, + NULL, + NULL); + if (ret == GSS_S_COMPLETE) { + ret = _gsskrb5_inquire_cred(minor_status, + aqcred_init, + output_name, + &ilife, + NULL, + &imechs); + (void) _gsskrb5_release_cred(&junk, &aqcred_init); + if (ret == GSS_S_COMPLETE) { + /* + * Merge results for INITIATE with ACCEPT if we had ACCEPT and + * for those outputs that are desired. + */ + if (cred_usage) { + *cred_usage = (*cred_usage == GSS_C_ACCEPT) ? + GSS_C_BOTH : GSS_C_INITIATE; + } + if (lifetime) + *lifetime = min(alife, ilife); + if (mechanisms) { + /* + * This is just one mechanism (IAKERB and such would live + * elsewhere). imechs will be equal to amechs, though not + * ==. + */ + if (aret != GSS_S_COMPLETE) { + *mechanisms = imechs; + imechs = GSS_C_NO_OID_SET; + } + } + (void) gss_release_oid_set(&junk, &amechs); + } else if (ret != GSS_S_NO_CRED) { + *minor_status = aminor; + return aret; + } + } + + if (aret != GSS_S_COMPLETE && ret != GSS_S_COMPLETE) { + *minor_status = aminor; + return aret; + } + *minor_status = 0; /* Even though 0 is not specified to be special */ + return GSS_S_COMPLETE; + } - if (acred) - HEIMDAL_MUTEX_lock(&acred->cred_id_mutex); - if (icred) - HEIMDAL_MUTEX_lock(&icred->cred_id_mutex); + HEIMDAL_MUTEX_lock(&cred->cred_id_mutex); if (output_name != NULL) { - if (icred && icred->principal != NULL) { - gss_name_t name; - - if (acred && acred->principal) - name = (gss_name_t)acred->principal; - else - name = (gss_name_t)icred->principal; - + if (cred->principal != NULL) { + gss_name_t name = (gss_name_t)cred->principal; ret = _gsskrb5_duplicate_name(minor_status, name, output_name); if (ret) - goto out; - } else if (acred && acred->usage == GSS_C_ACCEPT) { - krb5_principal princ; - *minor_status = krb5_sname_to_principal(context, NULL, - NULL, KRB5_NT_SRV_HST, - &princ); - if (*minor_status) { - ret = GSS_S_FAILURE; - goto out; - } - *output_name = (gss_name_t)princ; - } else { - krb5_principal princ; - *minor_status = krb5_get_default_principal(context, - &princ); - if (*minor_status) { - ret = GSS_S_FAILURE; - goto out; - } - *output_name = (gss_name_t)princ; - } + goto out; + } else if (cred->usage == GSS_C_ACCEPT) { + /* + * Keytab case, princ may not be set (yet, ever, whatever). + * + * We used to unconditionally output the krb5_sname_to_principal() + * of the host service for the hostname, but we didn't know if we + * had keytab entries for it, so it was incorrect. We can't be + * breaking anything in tree by outputting GSS_C_NO_NAME, but we + * might be breaking other callers. + */ + *output_name = GSS_C_NO_NAME; + } else { + /* This shouldn't happen */ + *minor_status = KRB5_NOCREDS_SUPPLIED; /* XXX */ + ret = GSS_S_NO_CRED; + goto out; + } } if (lifetime != NULL) { - OM_uint32 alife = GSS_C_INDEFINITE, ilife = GSS_C_INDEFINITE; - - if (acred) alife = acred->lifetime; - if (icred) ilife = icred->lifetime; - - ret = _gsskrb5_lifetime_left(minor_status, - context, - min(alife,ilife), - lifetime); - if (ret) - goto out; - } - if (cred_usage != NULL) { - if (acred && icred) - *cred_usage = GSS_C_BOTH; - else if (acred) - *cred_usage = GSS_C_ACCEPT; - else if (icred) - *cred_usage = GSS_C_INITIATE; - else - abort(); + ret = _gsskrb5_lifetime_left(minor_status, + context, + cred->endtime, + lifetime); + if (ret) + goto out; } - + if (cred_usage != NULL) + *cred_usage = cred->usage; if (mechanisms != NULL) { ret = gss_create_empty_oid_set(minor_status, mechanisms); if (ret) - goto out; - if (acred) - ret = gss_add_oid_set_member(minor_status, - &acred->mechanisms->elements[0], - mechanisms); - if (ret == GSS_S_COMPLETE && icred) - ret = gss_add_oid_set_member(minor_status, - &icred->mechanisms->elements[0], - mechanisms); + goto out; + ret = gss_add_oid_set_member(minor_status, + &cred->mechanisms->elements[0], + mechanisms); if (ret) - goto out; + goto out; } ret = GSS_S_COMPLETE; -out: - if (acred) - HEIMDAL_MUTEX_unlock(&acred->cred_id_mutex); - if (icred) - HEIMDAL_MUTEX_unlock(&icred->cred_id_mutex); - - if (aqcred_init != GSS_C_NO_CREDENTIAL) - ret = _gsskrb5_release_cred(minor_status, &aqcred_init); - if (aqcred_accept != GSS_C_NO_CREDENTIAL) - ret = _gsskrb5_release_cred(minor_status, &aqcred_accept); +out: + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); return ret; } diff --git a/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_mech.c b/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_mech.c --- a/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_mech.c +++ b/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_mech.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_cred_by_mech ( OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID mech_type, gss_name_t * name, OM_uint32 * initiator_lifetime, @@ -47,6 +47,10 @@ OM_uint32 maj_stat; OM_uint32 lifetime; + /* + * XXX This is busted. _gsskrb5_inquire_cred() should be implemented in + * terms of _gsskrb5_inquire_cred_by_mech(), NOT the other way around. + */ maj_stat = _gsskrb5_inquire_cred (minor_status, cred_handle, name, &lifetime, &usage, NULL); diff --git a/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_oid.c b/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_oid.c --- a/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_oid.c +++ b/crypto/heimdal/lib/gssapi/krb5/inquire_cred_by_oid.c @@ -34,7 +34,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_cred_by_oid (OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { diff --git a/crypto/heimdal/lib/gssapi/krb5/inquire_mechs_for_name.c b/crypto/heimdal/lib/gssapi/krb5/inquire_mechs_for_name.c --- a/crypto/heimdal/lib/gssapi/krb5/inquire_mechs_for_name.c +++ b/crypto/heimdal/lib/gssapi/krb5/inquire_mechs_for_name.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_mechs_for_name ( OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_OID_set * mech_types ) { diff --git a/crypto/heimdal/lib/gssapi/krb5/inquire_sec_context_by_oid.c b/crypto/heimdal/lib/gssapi/krb5/inquire_sec_context_by_oid.c --- a/crypto/heimdal/lib/gssapi/krb5/inquire_sec_context_by_oid.c +++ b/crypto/heimdal/lib/gssapi/krb5/inquire_sec_context_by_oid.c @@ -149,7 +149,6 @@ } ret = krb5_store_keyblock(sp, *key); - krb5_free_keyblock (context, key); if (ret) goto out; @@ -169,6 +168,7 @@ } out: + krb5_free_keyblock(context, key); krb5_data_free(&data); if (sp) krb5_storage_free(sp); @@ -333,7 +333,8 @@ if (ret) goto out; ret = krb5_store_int32(sp, (context_handle->more_flags & LOCAL) ? 1 : 0); if (ret) goto out; - ret = krb5_store_int32(sp, context_handle->lifetime); + /* XXX need krb5_store_int64() */ + ret = krb5_store_int32(sp, context_handle->endtime); if (ret) goto out; krb5_auth_con_getlocalseqnumber (context, context_handle->auth_context, @@ -529,7 +530,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_inquire_sec_context_by_oid (OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { diff --git a/crypto/heimdal/lib/gssapi/krb5/pname_to_uid.c b/crypto/heimdal/lib/gssapi/krb5/pname_to_uid.c --- a/crypto/heimdal/lib/gssapi/krb5/pname_to_uid.c +++ b/crypto/heimdal/lib/gssapi/krb5/pname_to_uid.c @@ -33,53 +33,38 @@ #include "gsskrb5_locl.h" OM_uint32 GSSAPI_CALLCONV -_gsskrb5_pname_to_uid(OM_uint32 *minor_status, - const gss_name_t pname, - const gss_OID mech_type, - uid_t *uidp) +_gsskrb5_localname(OM_uint32 *minor_status, + gss_const_name_t pname, + const gss_OID mech_type, + gss_buffer_t localname) { -#ifdef NO_LOCALNAME - *minor_status = KRB5_NO_LOCALNAME; - return GSS_S_FAILURE; -#else krb5_error_code ret; krb5_context context; krb5_const_principal princ = (krb5_const_principal)pname; - char localname[256]; -#ifdef POSIX_GETPWNAM_R - char pwbuf[2048]; - struct passwd pw, *pwd; -#else - struct passwd *pwd; -#endif + char lnamebuf[256]; GSSAPI_KRB5_INIT(&context); *minor_status = 0; ret = krb5_aname_to_localname(context, princ, - sizeof(localname), localname); + sizeof(lnamebuf), lnamebuf); if (ret != 0) { *minor_status = ret; return GSS_S_FAILURE; } -#ifdef POSIX_GETPWNAM_R - if (getpwnam_r(localname, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) { - *minor_status = KRB5_NO_LOCALNAME; - return GSS_S_FAILURE; - } -#else - pwd = getpwnam(localname); -#endif + localname->length = strlen(lnamebuf); - if (pwd == NULL) { - *minor_status = KRB5_NO_LOCALNAME; + localname->value = malloc(localname->length + 1); + if (localname->value == NULL) { + localname->length = 0; + *minor_status = ENOMEM; return GSS_S_FAILURE; } - *uidp = pwd->pw_uid; + memcpy(localname->value, lnamebuf, localname->length + 1); + *minor_status = 0; return GSS_S_COMPLETE; -#endif /* NO_LOCALNAME */ } diff --git a/crypto/heimdal/lib/gssapi/krb5/process_context_token.c b/crypto/heimdal/lib/gssapi/krb5/process_context_token.c --- a/crypto/heimdal/lib/gssapi/krb5/process_context_token.c +++ b/crypto/heimdal/lib/gssapi/krb5/process_context_token.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_process_context_token ( OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t token_buffer ) { diff --git a/crypto/heimdal/lib/gssapi/krb5/set_sec_context_option.c b/crypto/heimdal/lib/gssapi/krb5/set_sec_context_option.c --- a/crypto/heimdal/lib/gssapi/krb5/set_sec_context_option.c +++ b/crypto/heimdal/lib/gssapi/krb5/set_sec_context_option.c @@ -178,23 +178,9 @@ } else if (gss_oid_equal(desired_object, GSS_KRB5_SEND_TO_KDC_X)) { - if (value == NULL || value->length == 0) { - krb5_set_send_to_kdc_func(context, NULL, NULL); - } else { - struct gsskrb5_send_to_kdc c; - - if (value->length != sizeof(c)) { - *minor_status = EINVAL; - return GSS_S_FAILURE; - } - memcpy(&c, value->value, sizeof(c)); - krb5_set_send_to_kdc_func(context, - (krb5_send_to_kdc_func)c.func, - c.ptr); - } + *minor_status = EINVAL; + return GSS_S_FAILURE; - *minor_status = 0; - return GSS_S_COMPLETE; } else if (gss_oid_equal(desired_object, GSS_KRB5_CCACHE_NAME_X)) { char *str; diff --git a/crypto/heimdal/lib/gssapi/krb5/store_cred.c b/crypto/heimdal/lib/gssapi/krb5/store_cred.c --- a/crypto/heimdal/lib/gssapi/krb5/store_cred.c +++ b/crypto/heimdal/lib/gssapi/krb5/store_cred.c @@ -46,8 +46,11 @@ krb5_context context; krb5_error_code ret; gsskrb5_cred cred; - krb5_ccache id; - int destroy = 0; + krb5_ccache id = NULL; + krb5_ccache def_ccache = NULL; + const char *def_type = NULL; + time_t exp_current; + time_t exp_new; *minor_status = 0; @@ -56,7 +59,8 @@ return GSS_S_FAILURE; } - if (gss_oid_equal(desired_mech, GSS_KRB5_MECHANISM) == 0) + if (desired_mech != GSS_C_NO_OID && + gss_oid_equal(desired_mech, GSS_KRB5_MECHANISM) == 0) return GSS_S_BAD_MECH; cred = (gsskrb5_cred)input_cred_handle; @@ -69,48 +73,87 @@ if (cred->usage != cred_usage && cred->usage != GSS_C_BOTH) { HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); *minor_status = GSS_KRB5_S_G_BAD_USAGE; - return(GSS_S_FAILURE); + return GSS_S_FAILURE; + } + + ret = krb5_cc_get_lifetime(context, cred->ccache, &exp_new); + if (ret) { + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + *minor_status = ret; + return GSS_S_NO_CRED; } if (cred->principal == NULL) { HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); *minor_status = GSS_KRB5_S_KG_TGT_MISSING; - return(GSS_S_FAILURE); + return GSS_S_FAILURE; } - /* write out cred to credential cache */ + ret = krb5_cc_default(context, &def_ccache); + if (ret == 0) { + def_type = krb5_cc_get_type(context, def_ccache); + krb5_cc_close(context, def_ccache); + } + def_ccache = NULL; + /* write out cred to credential cache */ ret = krb5_cc_cache_match(context, cred->principal, &id); if (ret) { - ret = krb5_cc_new_unique(context, NULL, NULL, &id); - if (ret) { - HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); - *minor_status = ret; - return(GSS_S_FAILURE); - } - destroy = 1; + if (default_cred) { + ret = krb5_cc_default(context, &id); + if (ret) { + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + *minor_status = ret; + return GSS_S_FAILURE; + } + } else { + if (def_type == NULL || + !krb5_cc_support_switch(context, def_type)) { + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + *minor_status = 0; /* XXX */ + return GSS_S_NO_CRED; /* XXX */ + } + ret = krb5_cc_new_unique(context, def_type, NULL, &id); + if (ret) { + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + *minor_status = ret; + return GSS_S_FAILURE; + } + overwrite_cred = 1; + } + } + + if (!overwrite_cred) { + /* If current creds are expired or near it, overwrite */ + ret = krb5_cc_get_lifetime(context, id, &exp_current); + if (ret != 0 || exp_new > exp_current) + overwrite_cred = 1; + } + + if (!overwrite_cred) { + /* Nothing to do */ + krb5_cc_close(context, id); + HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); + *minor_status = 0; + return GSS_S_DUPLICATE_ELEMENT; } ret = krb5_cc_initialize(context, id, cred->principal); if (ret == 0) ret = krb5_cc_copy_match_f(context, cred->ccache, id, NULL, NULL, NULL); if (ret) { - if (destroy) - krb5_cc_destroy(context, id); - else - krb5_cc_close(context, id); + krb5_cc_close(context, id); HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); *minor_status = ret; return(GSS_S_FAILURE); } - if (default_cred) + if (default_cred && def_type != NULL && + krb5_cc_support_switch(context, def_type)) krb5_cc_switch(context, id); krb5_cc_close(context, id); - HEIMDAL_MUTEX_unlock(&cred->cred_id_mutex); - *minor_status = 0; return GSS_S_COMPLETE; } diff --git a/crypto/heimdal/lib/gssapi/krb5/test_acquire_cred.c b/crypto/heimdal/lib/gssapi/krb5/test_acquire_cred.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/krb5/test_acquire_cred.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2003-2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gsskrb5_locl.h" +#include + +static void +print_time(OM_uint32 time_rec) +{ + if (time_rec == GSS_C_INDEFINITE) { + printf("cred never expire\n"); + } else { + time_t t = time_rec + time(NULL); + printf("expiration time: %s", ctime(&t)); + } +} + +static void +test_add(gss_cred_id_t cred_handle) +{ + OM_uint32 major_status, minor_status; + gss_cred_id_t copy_cred; + OM_uint32 time_rec; + + major_status = gss_add_cred (&minor_status, + cred_handle, + GSS_C_NO_NAME, + GSS_KRB5_MECHANISM, + GSS_C_INITIATE, + 0, + 0, + ©_cred, + NULL, + &time_rec, + NULL); + + if (GSS_ERROR(major_status)) + errx(1, "add_cred failed"); + + print_time(time_rec); + + major_status = gss_release_cred(&minor_status, + ©_cred); + if (GSS_ERROR(major_status)) + errx(1, "release_cred failed"); +} + +static void +copy_cred(void) +{ + OM_uint32 major_status, minor_status; + gss_cred_id_t cred_handle; + OM_uint32 time_rec; + + major_status = gss_acquire_cred(&minor_status, + GSS_C_NO_NAME, + 0, + NULL, + GSS_C_INITIATE, + &cred_handle, + NULL, + &time_rec); + if (GSS_ERROR(major_status)) + errx(1, "acquire_cred failed"); + + print_time(time_rec); + + test_add(cred_handle); + test_add(cred_handle); + test_add(cred_handle); + + major_status = gss_release_cred(&minor_status, + &cred_handle); + if (GSS_ERROR(major_status)) + errx(1, "release_cred failed"); +} + +static void +acquire_cred_service(const char *service) +{ + OM_uint32 major_status, minor_status; + gss_cred_id_t cred_handle; + OM_uint32 time_rec; + gss_buffer_desc name_buffer; + gss_name_t name; + + name_buffer.value = rk_UNCONST(service); + name_buffer.length = strlen(service); + + major_status = gss_import_name(&minor_status, + &name_buffer, + GSS_C_NT_HOSTBASED_SERVICE, + &name); + if (GSS_ERROR(major_status)) + errx(1, "import_name failed"); + + + major_status = gss_acquire_cred(&minor_status, + name, + 0, + NULL, + GSS_C_ACCEPT, + &cred_handle, + NULL, + &time_rec); + if (GSS_ERROR(major_status)) + errx(1, "acquire_cred failed"); + + print_time(time_rec); + + major_status = gss_release_cred(&minor_status, + &cred_handle); + if (GSS_ERROR(major_status)) + errx(1, "release_cred failed"); + + + major_status = gss_release_name(&minor_status, + &name); + if (GSS_ERROR(major_status)) + errx(1, "release_name failed"); + +} + +int +main(int argc, char **argv) +{ + copy_cred(); + + acquire_cred_service("host@xen2-heimdal-linux.lab.it.su.se"); + + return 0; +} diff --git a/crypto/heimdal/lib/gssapi/krb5/test_cfx.c b/crypto/heimdal/lib/gssapi/krb5/test_cfx.c --- a/crypto/heimdal/lib/gssapi/krb5/test_cfx.c +++ b/crypto/heimdal/lib/gssapi/krb5/test_cfx.c @@ -148,7 +148,7 @@ errx(1, "krb5_context_init: %d", ret); ret = krb5_generate_random_keyblock(context, - ENCTYPE_AES256_CTS_HMAC_SHA1_96, + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96, &keyblock); if (ret) krb5_err(context, 1, ret, "krb5_generate_random_keyblock"); diff --git a/crypto/heimdal/lib/gssapi/krb5/test_cred.c b/crypto/heimdal/lib/gssapi/krb5/test_cred.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/krb5/test_cred.c @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2003-2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gsskrb5_locl.h" +#include +#include + +static void +gss_print_errors (int min_stat) +{ + OM_uint32 new_stat; + OM_uint32 msg_ctx = 0; + gss_buffer_desc status_string; + OM_uint32 ret; + + do { + ret = gss_display_status (&new_stat, + min_stat, + GSS_C_MECH_CODE, + GSS_C_NO_OID, + &msg_ctx, + &status_string); + fprintf (stderr, "%.*s\n", (int)status_string.length, + (char *)status_string.value); + gss_release_buffer (&new_stat, &status_string); + } while (!GSS_ERROR(ret) && msg_ctx != 0); +} + +static void +gss_err(int exitval, int status, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vwarnx (fmt, args); + gss_print_errors (status); + va_end(args); + exit (exitval); +} + +static void +acquire_release_loop(gss_name_t name, int counter, gss_cred_usage_t usage) +{ + OM_uint32 maj_stat, min_stat; + gss_cred_id_t cred; + int i; + + for (i = 0; i < counter; i++) { + maj_stat = gss_acquire_cred(&min_stat, name, + GSS_C_INDEFINITE, + GSS_C_NO_OID_SET, + usage, + &cred, + NULL, + NULL); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "aquire %d %d != GSS_S_COMPLETE", + i, (int)maj_stat); + + maj_stat = gss_release_cred(&min_stat, &cred); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "release %d %d != GSS_S_COMPLETE", + i, (int)maj_stat); + } +} + + +static void +acquire_add_release_add(gss_name_t name, gss_cred_usage_t usage) +{ + OM_uint32 maj_stat, min_stat; + gss_cred_id_t cred, cred2, cred3; + + maj_stat = gss_acquire_cred(&min_stat, name, + GSS_C_INDEFINITE, + GSS_C_NO_OID_SET, + usage, + &cred, + NULL, + NULL); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "aquire %d != GSS_S_COMPLETE", (int)maj_stat); + + maj_stat = gss_add_cred(&min_stat, + cred, + GSS_C_NO_NAME, + GSS_KRB5_MECHANISM, + usage, + GSS_C_INDEFINITE, + GSS_C_INDEFINITE, + &cred2, + NULL, + NULL, + NULL); + + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "add_cred %d != GSS_S_COMPLETE", (int)maj_stat); + + maj_stat = gss_release_cred(&min_stat, &cred); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "release %d != GSS_S_COMPLETE", (int)maj_stat); + + maj_stat = gss_add_cred(&min_stat, + cred2, + GSS_C_NO_NAME, + GSS_KRB5_MECHANISM, + GSS_C_BOTH, + GSS_C_INDEFINITE, + GSS_C_INDEFINITE, + &cred3, + NULL, + NULL, + NULL); + + maj_stat = gss_release_cred(&min_stat, &cred2); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "release 2 %d != GSS_S_COMPLETE", (int)maj_stat); + + maj_stat = gss_release_cred(&min_stat, &cred3); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "release 2 %d != GSS_S_COMPLETE", (int)maj_stat); +} + +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"version", 0, arg_flag, &version_flag, "print version", NULL }, + {"help", 0, arg_flag, &help_flag, NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, sizeof(args)/sizeof(*args), + NULL, "service@host"); + exit (ret); +} + + +int +main(int argc, char **argv) +{ + struct gss_buffer_desc_struct name_buffer; + OM_uint32 maj_stat, min_stat; + gss_name_t name; + int optidx = 0; + + setprogname(argv[0]); + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + if (argc < 1) + errx(1, "argc < 1"); + + name_buffer.value = argv[0]; + name_buffer.length = strlen(argv[0]); + + maj_stat = gss_import_name(&min_stat, &name_buffer, + GSS_C_NT_HOSTBASED_SERVICE, + &name); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "import name error"); + + acquire_release_loop(name, 100, GSS_C_ACCEPT); + acquire_release_loop(name, 100, GSS_C_INITIATE); + acquire_release_loop(name, 100, GSS_C_BOTH); + + acquire_add_release_add(name, GSS_C_ACCEPT); + acquire_add_release_add(name, GSS_C_INITIATE); + acquire_add_release_add(name, GSS_C_BOTH); + + gss_release_name(&min_stat, &name); + + return 0; +} diff --git a/crypto/heimdal/lib/gssapi/krb5/test_kcred.c b/crypto/heimdal/lib/gssapi/krb5/test_kcred.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/krb5/test_kcred.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2003-2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gsskrb5_locl.h" +#include +#include + +static int version_flag = 0; +static int help_flag = 0; + +static void +copy_import(void) +{ + gss_cred_id_t cred1, cred2; + OM_uint32 maj_stat, min_stat; + gss_name_t name1, name2; + OM_uint32 lifetime1, lifetime2; + gss_cred_usage_t usage1, usage2; + gss_OID_set mechs1, mechs2; + krb5_ccache id; + krb5_error_code ret; + krb5_context context; + int equal; + + maj_stat = gss_acquire_cred(&min_stat, GSS_C_NO_NAME, GSS_C_INDEFINITE, + GSS_C_NO_OID_SET, GSS_C_INITIATE, + &cred1, NULL, NULL); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_acquire_cred"); + + maj_stat = gss_inquire_cred(&min_stat, cred1, &name1, &lifetime1, + &usage1, &mechs1); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_inquire_cred"); + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_context"); + + ret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, &id); + if (ret) + krb5_err(context, 1, ret, "krb5_cc_new_unique"); + + maj_stat = gss_krb5_copy_ccache(&min_stat, context, cred1, id); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_krb5_copy_ccache"); + + maj_stat = gss_krb5_import_cred(&min_stat, id, NULL, NULL, &cred2); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_krb5_import_cred"); + + maj_stat = gss_inquire_cred(&min_stat, cred2, &name2, &lifetime2, + &usage2, &mechs2); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_inquire_cred 2"); + + maj_stat = gss_compare_name(&min_stat, name1, name2, &equal); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_compare_name"); + if (!equal) + errx(1, "names not equal"); + + if (lifetime1 != lifetime1) + errx(1, "lifetime not equal"); + + if (usage1 != usage1) + errx(1, "usage not equal"); + + gss_release_cred(&min_stat, &cred1); + gss_release_cred(&min_stat, &cred2); + + gss_release_name(&min_stat, &name1); + gss_release_name(&min_stat, &name2); + +#if 0 + compare(mechs1, mechs2); +#endif + + gss_release_oid_set(&min_stat, &mechs1); + gss_release_oid_set(&min_stat, &mechs2); + + krb5_cc_destroy(context, id); + krb5_free_context(context); +} + +static struct getargs args[] = { + {"version", 0, arg_flag, &version_flag, "print version", NULL }, + {"help", 0, arg_flag, &help_flag, NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, sizeof(args)/sizeof(*args), + NULL, ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + int optidx = 0; + + setprogname(argv[0]); + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + copy_import(); + + return 0; +} diff --git a/crypto/heimdal/lib/gssapi/krb5/test_oid.c b/crypto/heimdal/lib/gssapi/krb5/test_oid.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/krb5/test_oid.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "gsskrb5_locl.h" + +int +main(int argc, char **argv) +{ + OM_uint32 minor_status, maj_stat; + gss_buffer_desc data; + int ret; + + maj_stat = gss_oid_to_str(&minor_status, GSS_KRB5_MECHANISM, &data); + if (GSS_ERROR(maj_stat)) + errx(1, "gss_oid_to_str failed"); + ret = strncmp(data.value, "1 2 840 113554 1 2 2", data.length); + gss_release_buffer(&maj_stat, &data); + if (ret) + return 1; + return 0; +} diff --git a/crypto/heimdal/lib/gssapi/krb5/unwrap.c b/crypto/heimdal/lib/gssapi/krb5/unwrap.c --- a/crypto/heimdal/lib/gssapi/krb5/unwrap.c +++ b/crypto/heimdal/lib/gssapi/krb5/unwrap.c @@ -50,7 +50,7 @@ size_t len; EVP_MD_CTX *md5; u_char hash[16]; - EVP_CIPHER_CTX *des_ctx; + EVP_CIPHER_CTX des_ctx; DES_key_schedule schedule; DES_cblock deskey; DES_cblock zero; @@ -111,17 +111,12 @@ deskey[i] ^= 0xf0; - des_ctx = EVP_CIPHER_CTX_new(); - if (des_ctx == NULL) { - memset (deskey, 0, sizeof(deskey)); - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, deskey, zero, 0); - EVP_Cipher(des_ctx, p, p, input_message_buffer->length - len); - EVP_CIPHER_CTX_free(des_ctx); + EVP_CIPHER_CTX_init(&des_ctx); + EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, deskey, zero, 0); + EVP_Cipher(&des_ctx, p, p, input_message_buffer->length - len); + EVP_CIPHER_CTX_cleanup(&des_ctx); - memset (deskey, 0, sizeof(deskey)); + memset (&schedule, 0, sizeof(schedule)); } if (IS_DCE_STYLE(context_handle)) { @@ -147,29 +142,19 @@ DES_set_key_unchecked (&deskey, &schedule); DES_cbc_cksum ((void *)hash, (void *)hash, sizeof(hash), &schedule, &zero); - if (ct_memcmp (p - 8, hash, 8) != 0) { - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); + if (ct_memcmp (p - 8, hash, 8) != 0) return GSS_S_BAD_MIC; - } /* verify sequence number */ - des_ctx = EVP_CIPHER_CTX_new(); - if (des_ctx == NULL) { - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - HEIMDAL_MUTEX_lock(&context_handle->ctx_id_mutex); p -= 16; - EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); - EVP_Cipher(des_ctx, p, p, 8); - EVP_CIPHER_CTX_free(des_ctx); + EVP_CIPHER_CTX_init(&des_ctx); + EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); + EVP_Cipher(&des_ctx, p, p, 8); + EVP_CIPHER_CTX_cleanup(&des_ctx); memset (deskey, 0, sizeof(deskey)); memset (&schedule, 0, sizeof(schedule)); @@ -413,7 +398,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_unwrap (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t input_message_buffer, gss_buffer_t output_message_buffer, int * conf_state, @@ -423,7 +408,6 @@ krb5_keyblock *key; krb5_context context; OM_uint32 ret; - krb5_keytype keytype; gsskrb5_ctx ctx = (gsskrb5_ctx) context_handle; output_message_buffer->value = NULL; @@ -445,12 +429,13 @@ *minor_status = ret; return GSS_S_FAILURE; } - krb5_enctype_to_keytype (context, key->keytype, &keytype); *minor_status = 0; - switch (keytype) { - case KEYTYPE_DES : + switch (key->keytype) { + case KRB5_ENCTYPE_DES_CBC_CRC : + case KRB5_ENCTYPE_DES_CBC_MD4 : + case KRB5_ENCTYPE_DES_CBC_MD5 : #ifdef HEIM_WEAK_CRYPTO ret = unwrap_des (minor_status, ctx, input_message_buffer, output_message_buffer, @@ -459,13 +444,14 @@ ret = GSS_S_FAILURE; #endif break; - case KEYTYPE_DES3 : + case KRB5_ENCTYPE_DES3_CBC_MD5 : + case KRB5_ENCTYPE_DES3_CBC_SHA1 : ret = unwrap_des3 (minor_status, ctx, context, input_message_buffer, output_message_buffer, conf_state, qop_state, key); break; - case KEYTYPE_ARCFOUR: - case KEYTYPE_ARCFOUR_56: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56: ret = _gssapi_unwrap_arcfour (minor_status, ctx, context, input_message_buffer, output_message_buffer, conf_state, qop_state, key); diff --git a/crypto/heimdal/lib/gssapi/krb5/verify_mic.c b/crypto/heimdal/lib/gssapi/krb5/verify_mic.c --- a/crypto/heimdal/lib/gssapi/krb5/verify_mic.c +++ b/crypto/heimdal/lib/gssapi/krb5/verify_mic.c @@ -51,7 +51,7 @@ EVP_MD_CTX *md5; u_char hash[16], *seq; DES_key_schedule schedule; - EVP_CIPHER_CTX *des_ctx; + EVP_CIPHER_CTX des_ctx; DES_cblock zero; DES_cblock deskey; uint32_t seq_number; @@ -89,31 +89,24 @@ DES_cbc_cksum ((void *)hash, (void *)hash, sizeof(hash), &schedule, &zero); if (ct_memcmp (p - 8, hash, 8) != 0) { - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); + memset_s(deskey, sizeof(deskey), 0, sizeof(deskey)); + memset_s(&schedule, sizeof(schedule), 0, sizeof(schedule)); return GSS_S_BAD_MIC; } /* verify sequence number */ - des_ctx = EVP_CIPHER_CTX_new(); - if (des_ctx == NULL) { - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - HEIMDAL_MUTEX_lock(&context_handle->ctx_id_mutex); p -= 16; - EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); - EVP_Cipher(des_ctx, p, p, 8); - EVP_CIPHER_CTX_free(des_ctx); + EVP_CIPHER_CTX_init(&des_ctx); + EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); + EVP_Cipher(&des_ctx, p, p, 8); + EVP_CIPHER_CTX_cleanup(&des_ctx); - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); + memset_s(deskey, sizeof(deskey), 0, sizeof(deskey)); + memset_s(&schedule, sizeof(schedule), 0, sizeof(schedule)); seq = p; _gsskrb5_decode_om_uint32(seq, &seq_number); @@ -261,15 +254,11 @@ krb5_crypto_destroy (context, crypto); ret = krb5_crypto_init(context, key, ETYPE_DES3_CBC_SHA1, &crypto); - if (ret){ - *minor_status = ret; - return GSS_S_FAILURE; - } - - ret = krb5_verify_checksum (context, crypto, - KRB5_KU_USAGE_SIGN, - tmp, message_buffer->length + 8, - &csum); + if (ret == 0) + ret = krb5_verify_checksum(context, crypto, + KRB5_KU_USAGE_SIGN, + tmp, message_buffer->length + 8, + &csum); free (tmp); if (ret) { krb5_crypto_destroy (context, crypto); @@ -296,7 +285,6 @@ { krb5_keyblock *key; OM_uint32 ret; - krb5_keytype keytype; if (ctx->more_flags & IS_CFX) return _gssapi_verify_mic_cfx (minor_status, ctx, @@ -311,9 +299,11 @@ return GSS_S_FAILURE; } *minor_status = 0; - krb5_enctype_to_keytype (context, key->keytype, &keytype); - switch (keytype) { - case KEYTYPE_DES : + + switch (key->keytype) { + case KRB5_ENCTYPE_DES_CBC_CRC : + case KRB5_ENCTYPE_DES_CBC_MD4 : + case KRB5_ENCTYPE_DES_CBC_MD5 : #ifdef HEIM_WEAK_CRYPTO ret = verify_mic_des (minor_status, ctx, context, message_buffer, token_buffer, qop_state, key, @@ -322,13 +312,14 @@ ret = GSS_S_FAILURE; #endif break; - case KEYTYPE_DES3 : + case KRB5_ENCTYPE_DES3_CBC_MD5 : + case KRB5_ENCTYPE_DES3_CBC_SHA1 : ret = verify_mic_des3 (minor_status, ctx, context, message_buffer, token_buffer, qop_state, key, type); break; - case KEYTYPE_ARCFOUR : - case KEYTYPE_ARCFOUR_56 : + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56: ret = _gssapi_verify_mic_arcfour (minor_status, ctx, context, message_buffer, token_buffer, @@ -345,7 +336,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_verify_mic (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t message_buffer, const gss_buffer_t token_buffer, gss_qop_t * qop_state diff --git a/crypto/heimdal/lib/gssapi/krb5/wrap.c b/crypto/heimdal/lib/gssapi/krb5/wrap.c --- a/crypto/heimdal/lib/gssapi/krb5/wrap.c +++ b/crypto/heimdal/lib/gssapi/krb5/wrap.c @@ -137,7 +137,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_wrap_size_limit ( OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, OM_uint32 req_output_size, @@ -147,7 +147,6 @@ krb5_context context; krb5_keyblock *key; OM_uint32 ret; - krb5_keytype keytype; const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; GSSAPI_KRB5_INIT (&context); @@ -164,23 +163,25 @@ *minor_status = ret; return GSS_S_FAILURE; } - krb5_enctype_to_keytype (context, key->keytype, &keytype); - switch (keytype) { - case KEYTYPE_DES : + switch (key->keytype) { + case KRB5_ENCTYPE_DES_CBC_CRC : + case KRB5_ENCTYPE_DES_CBC_MD4 : + case KRB5_ENCTYPE_DES_CBC_MD5 : #ifdef HEIM_WEAK_CRYPTO ret = sub_wrap_size(req_output_size, max_input_size, 8, 22); #else ret = GSS_S_FAILURE; #endif break; - case ENCTYPE_ARCFOUR_HMAC_MD5: - case ENCTYPE_ARCFOUR_HMAC_MD5_56: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56: ret = _gssapi_wrap_size_arcfour(minor_status, ctx, context, conf_req_flag, qop_req, req_output_size, max_input_size, key); break; - case KEYTYPE_DES3 : + case KRB5_ENCTYPE_DES3_CBC_MD5 : + case KRB5_ENCTYPE_DES3_CBC_SHA1 : ret = sub_wrap_size(req_output_size, max_input_size, 8, 34); break; default : @@ -211,7 +212,7 @@ EVP_MD_CTX *md5; u_char hash[16]; DES_key_schedule schedule; - EVP_CIPHER_CTX *des_ctx; + EVP_CIPHER_CTX des_ctx; DES_cblock deskey; DES_cblock zero; size_t i; @@ -283,17 +284,6 @@ &schedule, &zero); memcpy (p - 8, hash, 8); - des_ctx = EVP_CIPHER_CTX_new(); - if (des_ctx == NULL) { - memset (deskey, 0, sizeof(deskey)); - memset (&schedule, 0, sizeof(schedule)); - free(output_message_buffer->value); - output_message_buffer->value = NULL; - output_message_buffer->length = 0; - *minor_status = ENOMEM; - return GSS_S_FAILURE; - } - /* sequence number */ HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); krb5_auth_con_getlocalseqnumber (context, @@ -309,8 +299,10 @@ (ctx->more_flags & LOCAL) ? 0 : 0xFF, 4); - EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); - EVP_Cipher(des_ctx, p, p, 8); + EVP_CIPHER_CTX_init(&des_ctx); + EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, p + 8, 1); + EVP_Cipher(&des_ctx, p, p, 8); + EVP_CIPHER_CTX_cleanup(&des_ctx); krb5_auth_con_setlocalseqnumber (context, ctx->auth_context, @@ -326,11 +318,11 @@ for (i = 0; i < sizeof(deskey); ++i) deskey[i] ^= 0xf0; - EVP_CIPHER_CTX_reset(des_ctx); - EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, deskey, zero, 1); - EVP_Cipher(des_ctx, p, p, datalen); + EVP_CIPHER_CTX_init(&des_ctx); + EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, deskey, zero, 1); + EVP_Cipher(&des_ctx, p, p, datalen); + EVP_CIPHER_CTX_cleanup(&des_ctx); } - EVP_CIPHER_CTX_free(des_ctx); memset (deskey, 0, sizeof(deskey)); memset (&schedule, 0, sizeof(schedule)); @@ -536,7 +528,7 @@ OM_uint32 GSSAPI_CALLCONV _gsskrb5_wrap (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, @@ -547,7 +539,6 @@ krb5_context context; krb5_keyblock *key; OM_uint32 ret; - krb5_keytype keytype; const gsskrb5_ctx ctx = (const gsskrb5_ctx) context_handle; output_message_buffer->value = NULL; @@ -567,10 +558,11 @@ *minor_status = ret; return GSS_S_FAILURE; } - krb5_enctype_to_keytype (context, key->keytype, &keytype); - switch (keytype) { - case KEYTYPE_DES : + switch (key->keytype) { + case KRB5_ENCTYPE_DES_CBC_CRC : + case KRB5_ENCTYPE_DES_CBC_MD4 : + case KRB5_ENCTYPE_DES_CBC_MD5 : #ifdef HEIM_WEAK_CRYPTO ret = wrap_des (minor_status, ctx, context, conf_req_flag, qop_req, input_message_buffer, conf_state, @@ -579,13 +571,14 @@ ret = GSS_S_FAILURE; #endif break; - case KEYTYPE_DES3 : + case KRB5_ENCTYPE_DES3_CBC_MD5 : + case KRB5_ENCTYPE_DES3_CBC_SHA1 : ret = wrap_des3 (minor_status, ctx, context, conf_req_flag, qop_req, input_message_buffer, conf_state, output_message_buffer, key); break; - case KEYTYPE_ARCFOUR: - case KEYTYPE_ARCFOUR_56: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5: + case KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56: ret = _gssapi_wrap_arcfour (minor_status, ctx, context, conf_req_flag, qop_req, input_message_buffer, conf_state, output_message_buffer, key); diff --git a/crypto/heimdal/lib/gssapi/libgssapi-exports.def b/crypto/heimdal/lib/gssapi/libgssapi-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/libgssapi-exports.def @@ -0,0 +1,192 @@ +EXPORTS + __gss_c_nt_anonymous_oid_desc DATA + __gss_c_nt_export_name_oid_desc DATA + __gss_c_nt_hostbased_service_oid_desc DATA + __gss_c_nt_hostbased_service_x_oid_desc DATA + __gss_c_nt_machine_uid_name_oid_desc DATA + __gss_c_nt_string_uid_name_oid_desc DATA + __gss_c_nt_user_name_oid_desc DATA + __gss_krb5_nt_principal_name_oid_desc DATA + __gss_c_attr_stream_sizes_oid_desc DATA + __gss_c_attr_local_login_user DATA + __gss_c_cred_certificate_oid_desc DATA + __gss_c_cred_password_oid_desc DATA + gss_accept_sec_context + gss_acquire_cred + gss_acquire_cred_with_password + gss_add_buffer_set_member + gss_add_cred + gss_add_cred_with_password + gss_add_oid_set_member + gss_authorize_localname + gss_canonicalize_name + gss_compare_name + gss_context_query_attributes + gss_context_time + gss_create_empty_buffer_set + gss_create_empty_oid_set + gss_decapsulate_token + gss_delete_name_attribute + gss_delete_sec_context + gss_display_mech_attr + gss_display_name + gss_display_name_ext + gss_display_status + gss_duplicate_name + gss_duplicate_oid + gss_encapsulate_token + gss_export_cred + gss_export_name + gss_export_name_composite + gss_export_sec_context + gss_get_mic + gss_get_name_attribute + gss_import_cred + gss_import_name + gss_import_sec_context + gss_indicate_mechs + gss_indicate_mechs_by_attrs + gss_init_sec_context + gss_inquire_attrs_for_mech + gss_inquire_context + gss_inquire_cred + gss_inquire_cred_by_mech + gss_inquire_cred_by_oid + gss_inquire_mech_for_saslname + gss_inquire_mechs_for_name + gss_inquire_name + gss_inquire_names_for_mech + gss_inquire_saslname_for_mech + gss_inquire_sec_context_by_oid ;! + gss_krb5_ccache_name + gss_krb5_copy_ccache + gss_krb5_export_lucid_sec_context + gss_krb5_free_lucid_sec_context + gss_krb5_get_tkt_flags + gss_krb5_import_cred + gss_krb5_set_allowable_enctypes + gss_localname + gss_mg_collect_error + gss_mo_get + gss_mo_set + gss_mo_list + gss_mo_name + gss_name_to_oid + gss_oid_to_name + gss_oid_equal + gss_oid_to_str + gss_pname_to_uid + gss_process_context_token + gss_pseudo_random + gss_release_buffer + gss_release_buffer_set + gss_release_cred + gss_release_iov_buffer + gss_release_name + gss_release_oid + gss_release_oid_set + gss_seal + gss_set_cred_option + gss_set_name_attribute + gss_set_sec_context_option + gss_sign + gss_store_cred + gss_test_oid_set_member + gss_unseal + gss_unwrap + gss_unwrap_aead + gss_unwrap_iov + gss_userok + gss_verify + gss_verify_mic + gss_wrap + gss_wrap_aead + gss_wrap_iov + gss_wrap_iov_length + gss_wrap_size_limit + gsskrb5_extract_authtime_from_sec_context + gsskrb5_extract_authz_data_from_sec_context + gsskrb5_extract_service_keyblock + gsskrb5_get_initiator_subkey + gsskrb5_get_subkey + gsskrb5_get_time_offset + gsskrb5_register_acceptor_identity + gsskrb5_set_default_realm + gsskrb5_set_dns_canonicalize + gsskrb5_set_send_to_kdc + gsskrb5_set_time_offset + krb5_gss_register_acceptor_identity + +; _gsskrb5cfx_ are really internal symbols, but export +; then now to make testing easier. + _gsskrb5cfx_wrap_length_cfx + _gssapi_wrap_size_cfx + + initialize_gk5_error_table_r ;! + + __gss_krb5_copy_ccache_x_oid_desc DATA + __gss_krb5_get_tkt_flags_x_oid_desc DATA + __gss_krb5_extract_authz_data_from_sec_context_x_oid_desc DATA + __gss_krb5_compat_des3_mic_x_oid_desc DATA + __gss_krb5_register_acceptor_identity_x_oid_desc DATA + __gss_krb5_export_lucid_context_x_oid_desc DATA + __gss_krb5_export_lucid_context_v1_x_oid_desc DATA + __gss_krb5_set_dns_canonicalize_x_oid_desc DATA + __gss_krb5_get_subkey_x_oid_desc DATA + __gss_krb5_get_initiator_subkey_x_oid_desc DATA + __gss_krb5_get_acceptor_subkey_x_oid_desc DATA + __gss_krb5_send_to_kdc_x_oid_desc DATA + __gss_krb5_get_authtime_x_oid_desc DATA + __gss_krb5_get_service_keyblock_x_oid_desc DATA + __gss_krb5_set_allowable_enctypes_x_oid_desc DATA + __gss_krb5_set_default_realm_x_oid_desc DATA + __gss_krb5_ccache_name_x_oid_desc DATA + __gss_krb5_set_time_offset_x_oid_desc DATA + __gss_krb5_get_time_offset_x_oid_desc DATA + __gss_krb5_plugin_register_x_oid_desc DATA + __gss_ntlm_get_session_key_x_oid_desc DATA + __gss_c_nt_ntlm_oid_desc DATA + __gss_c_nt_dn_oid_desc DATA + __gss_krb5_nt_principal_name_referral_oid_desc DATA + __gss_c_ntlm_avguest_oid_desc DATA + __gss_c_ntlm_v1_oid_desc DATA + __gss_c_ntlm_v2_oid_desc DATA + __gss_c_ntlm_session_key_oid_desc DATA + __gss_c_ntlm_force_v1_oid_desc DATA + __gss_krb5_cred_no_ci_flags_x_oid_desc DATA + __gss_krb5_import_cred_x_oid_desc DATA + __gss_c_ma_sasl_mech_name_oid_desc DATA + __gss_c_ma_mech_name_oid_desc DATA + __gss_c_ma_mech_description_oid_desc DATA + __gss_sasl_digest_md5_mechanism_oid_desc DATA + __gss_krb5_mechanism_oid_desc DATA + __gss_ntlm_mechanism_oid_desc DATA + __gss_spnego_mechanism_oid_desc DATA + __gss_c_peer_has_updated_spnego_oid_desc DATA + __gss_c_ma_mech_concrete_oid_desc DATA + __gss_c_ma_mech_pseudo_oid_desc DATA + __gss_c_ma_mech_composite_oid_desc DATA + __gss_c_ma_mech_nego_oid_desc DATA + __gss_c_ma_mech_glue_oid_desc DATA + __gss_c_ma_not_mech_oid_desc DATA + __gss_c_ma_deprecated_oid_desc DATA + __gss_c_ma_not_dflt_mech_oid_desc DATA + __gss_c_ma_itok_framed_oid_desc DATA + __gss_c_ma_auth_init_oid_desc DATA + __gss_c_ma_auth_targ_oid_desc DATA + __gss_c_ma_auth_init_init_oid_desc DATA + __gss_c_ma_auth_targ_init_oid_desc DATA + __gss_c_ma_auth_init_anon_oid_desc DATA + __gss_c_ma_auth_targ_anon_oid_desc DATA + __gss_c_ma_deleg_cred_oid_desc DATA + __gss_c_ma_integ_prot_oid_desc DATA + __gss_c_ma_conf_prot_oid_desc DATA + __gss_c_ma_mic_oid_desc DATA + __gss_c_ma_wrap_oid_desc DATA + __gss_c_ma_prot_ready_oid_desc DATA + __gss_c_ma_replay_det_oid_desc DATA + __gss_c_ma_oos_det_oid_desc DATA + __gss_c_ma_cbindings_oid_desc DATA + __gss_c_ma_pfs_oid_desc DATA + __gss_c_ma_compress_oid_desc DATA + __gss_c_ma_ctx_trans_oid_desc DATA diff --git a/crypto/heimdal/lib/gssapi/libgssapi-version.rc b/crypto/heimdal/lib/gssapi/libgssapi-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/libgssapi-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_DLL +#define RC_FILE_DESC_0409 "Generic Security Service Application Program Interface library" +#define RC_FILE_ORIG_0409 "gssapi.dll" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/gssapi/mech/compat.h b/crypto/heimdal/lib/gssapi/mech/compat.h --- a/crypto/heimdal/lib/gssapi/mech/compat.h +++ b/crypto/heimdal/lib/gssapi/mech/compat.h @@ -53,7 +53,7 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_acquire_cred_with_password_t (OM_uint32 *, /* minor_status */ - const gss_name_t, /* desired_name */ + gss_const_name_t, /* desired_name */ const gss_buffer_t, /* password */ OM_uint32, /* time_req */ const gss_OID_set, /* desired_mechs */ @@ -65,8 +65,8 @@ typedef OM_uint32 GSSAPI_CALLCONV _gss_add_cred_with_password_t ( OM_uint32 *, /* minor_status */ - const gss_cred_id_t, /* input_cred_handle */ - const gss_name_t, /* desired_name */ + gss_const_cred_id_t, /* input_cred_handle */ + gss_const_name_t, /* desired_name */ const gss_OID, /* desired_mech */ const gss_buffer_t, /* password */ gss_cred_usage_t, /* cred_usage */ diff --git a/crypto/heimdal/lib/gssapi/mech/doxygen.c b/crypto/heimdal/lib/gssapi/mech/doxygen.c --- a/crypto/heimdal/lib/gssapi/mech/doxygen.c +++ b/crypto/heimdal/lib/gssapi/mech/doxygen.c @@ -39,13 +39,12 @@ * - SPNEGO * - NTLM * - * See @ref gssapi_mechs for more describtion about these mechanisms. - * - * The project web page: http://www.h5l.org/ + * @sa * * - @ref gssapi_services_intro * - @ref gssapi_mechs * - @ref gssapi_api_INvsMN + * - The project web page: http://www.h5l.org/ */ /** @@ -105,28 +104,30 @@ * @page internalVSmechname Internal names and mechanism names * @section gssapi_api_INvsMN Name forms * - * There are two forms of name in GSS-API, Internal form and - * Contiguous string ("flat") form. gss_export_name() and + * There are two name representations in GSS-API: Internal form and + * Contiguous string ("flat") form. Functions gss_export_name() and * gss_import_name() can be used to convert between the two forms. * * - The contiguous string form is described by an oid specificing the * type and an octet string. A special form of the contiguous * string form is the exported name object. The exported name * defined for each mechanism, is something that can be stored and - * complared later. The exported name is what should be used for + * compared later. The exported name is what should be used for * ACLs comparisons. * - * - The Internal form + * - The Internal form is opaque to the application programmer and + * is implementation-dependent. * - * There is also special form of the Internal Name (IN), and that is + * - There is also a special form of the Internal Name (IN), and that is * the Mechanism Name (MN). In the mechanism name all the generic * information is stripped of and only contain the information for * one mechanism. In GSS-API some function return MN and some * require MN as input. Each of these function is marked up as such. * - * - * Describe relationship between import_name, canonicalize_name, - * export_name and friends. + * @FIXME Describe relationship between import_name, canonicalize_name, + * export_name and friends. Also, update for RFC2743 language + * ("contiguous" and "flat" are gone, leaving just "exported name + * token", "internal", and "MN"). */ /** @defgroup gssapi Heimdal GSS-API functions */ diff --git a/crypto/heimdal/lib/gssapi/mech/gss_accept_sec_context.c b/crypto/heimdal/lib/gssapi/mech/gss_accept_sec_context.c --- a/crypto/heimdal/lib/gssapi/mech/gss_accept_sec_context.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_accept_sec_context.c @@ -144,7 +144,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_accept_sec_context(OM_uint32 *minor_status, gss_ctx_id_t *context_handle, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token, const gss_channel_bindings_t input_chan_bindings, gss_name_t *src_name, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred.c b/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred.c --- a/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_acquire_cred(OM_uint32 *minor_status, - const gss_name_t desired_name, + gss_const_name_t desired_name, OM_uint32 time_req, const gss_OID_set desired_mechs, gss_cred_usage_t cred_usage, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_ext.c b/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_ext.c --- a/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_ext.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_ext.c @@ -100,13 +100,22 @@ mc= NULL; } - *output_cred_handle = mc; + if (major_status != GSS_S_COMPLETE) + free(mc); + else + *output_cred_handle = mc; return major_status; } +/** + * This function is not a public interface and is deprecated anyways, do + * not use. Use gss_acquire_cred_with_password() instead for now. + * + * @deprecated + */ OM_uint32 _gss_acquire_cred_ext(OM_uint32 *minor_status, - const gss_name_t desired_name, + gss_const_name_t desired_name, gss_const_OID credential_type, const void *credential_data, OM_uint32 time_req, @@ -152,7 +161,6 @@ for (i = 0; i < mechs->count; i++) { struct _gss_mechanism_name *mn = NULL; struct _gss_mechanism_cred *mc = NULL; - gss_name_t desired_mech_name = GSS_C_NO_NAME; m = __gss_get_mechanism(&mechs->elements[i]); if (!m) @@ -163,16 +171,17 @@ &mechs->elements[i], &mn); if (major_status != GSS_S_COMPLETE) continue; - - desired_mech_name = mn->gmn_name; } major_status = _gss_acquire_mech_cred(minor_status, m, mn, credential_type, credential_data, time_req, desired_mech, cred_usage, &mc); - if (GSS_ERROR(major_status)) + if (GSS_ERROR(major_status)) { + if (mechs->count == 1) + _gss_mg_error(m, major_status, *minor_status); continue; + } HEIM_SLIST_INSERT_HEAD(&cred->gc_mc, mc, gmc_link); } @@ -183,7 +192,8 @@ */ if (!HEIM_SLIST_FIRST(&cred->gc_mc)) { free(cred); - *minor_status = 0; + if (mechs->count > 1) + *minor_status = 0; return GSS_S_NO_CRED; } diff --git a/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_with_password.c b/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_with_password.c --- a/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_with_password.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_acquire_cred_with_password.c @@ -34,7 +34,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_acquire_cred_with_password(OM_uint32 *minor_status, - const gss_name_t desired_name, + gss_const_name_t desired_name, const gss_buffer_t password, OM_uint32 time_req, const gss_OID_set desired_mechs, @@ -93,7 +93,8 @@ if (!HEIM_SLIST_FIRST(&new_cred->gc_mc)) { free(new_cred); - *minor_status = 0; + if (desired_mechs->count > 1) + *minor_status = 0; return GSS_S_NO_CRED; } diff --git a/crypto/heimdal/lib/gssapi/mech/gss_add_cred.c b/crypto/heimdal/lib/gssapi/mech/gss_add_cred.c --- a/crypto/heimdal/lib/gssapi/mech/gss_add_cred.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_add_cred.c @@ -72,8 +72,8 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_cred(OM_uint32 *minor_status, - const gss_cred_id_t input_cred_handle, - const gss_name_t desired_name, + gss_const_cred_id_t input_cred_handle, + gss_const_name_t desired_name, const gss_OID desired_mech, gss_cred_usage_t cred_usage, OM_uint32 initiator_time_req, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_add_cred_with_password.c b/crypto/heimdal/lib/gssapi/mech/gss_add_cred_with_password.c --- a/crypto/heimdal/lib/gssapi/mech/gss_add_cred_with_password.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_add_cred_with_password.c @@ -30,8 +30,8 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_add_cred_with_password(OM_uint32 *minor_status, - const gss_cred_id_t input_cred_handle, - const gss_name_t desired_name, + gss_const_cred_id_t input_cred_handle, + gss_const_name_t desired_name, const gss_OID desired_mech, const gss_buffer_t password, gss_cred_usage_t cred_usage, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_aeap.c b/crypto/heimdal/lib/gssapi/mech/gss_aeap.c --- a/crypto/heimdal/lib/gssapi/mech/gss_aeap.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_aeap.c @@ -199,7 +199,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_context_query_attributes(OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_OID attribute, void *data, size_t len) @@ -214,3 +214,121 @@ return GSS_S_FAILURE; } + +/* + * AEAD wrap API for a single piece of associated data, for compatibility + * with MIT and as specified by draft-howard-gssapi-aead-00.txt. + * + * @ingroup gssapi + */ +GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL +gss_wrap_aead(OM_uint32 *minor_status, + gss_ctx_id_t context_handle, + int conf_req_flag, + gss_qop_t qop_req, + gss_buffer_t input_assoc_buffer, + gss_buffer_t input_payload_buffer, + int *conf_state, + gss_buffer_t output_message_buffer) +{ + OM_uint32 major_status, tmp, flags = 0; + gss_iov_buffer_desc iov[5]; + size_t i; + unsigned char *p; + + memset(iov, 0, sizeof(iov)); + + iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER; + + iov[1].type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY; + if (input_assoc_buffer) + iov[1].buffer = *input_assoc_buffer; + + iov[2].type = GSS_IOV_BUFFER_TYPE_DATA; + if (input_payload_buffer) + iov[2].buffer.length = input_payload_buffer->length; + + gss_inquire_context(minor_status, context_handle, NULL, NULL, + NULL, NULL, &flags, NULL, NULL); + + /* krb5 mech rejects padding/trailer if DCE-style is set */ + iov[3].type = (flags & GSS_C_DCE_STYLE) ? GSS_IOV_BUFFER_TYPE_EMPTY + : GSS_IOV_BUFFER_TYPE_PADDING; + iov[4].type = (flags & GSS_C_DCE_STYLE) ? GSS_IOV_BUFFER_TYPE_EMPTY + : GSS_IOV_BUFFER_TYPE_TRAILER; + + major_status = gss_wrap_iov_length(minor_status, context_handle, + conf_req_flag, qop_req, conf_state, + iov, 5); + if (GSS_ERROR(major_status)) + return major_status; + + for (i = 0, output_message_buffer->length = 0; i < 5; i++) { + if (GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_SIGN_ONLY) + continue; + + output_message_buffer->length += iov[i].buffer.length; + } + + output_message_buffer->value = malloc(output_message_buffer->length); + if (output_message_buffer->value == NULL) { + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + + for (i = 0, p = output_message_buffer->value; i < 5; i++) { + if (GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_SIGN_ONLY) + continue; + else if (GSS_IOV_BUFFER_TYPE(iov[i].type) == GSS_IOV_BUFFER_TYPE_DATA) + memcpy(p, input_payload_buffer->value, input_payload_buffer->length); + + iov[i].buffer.value = p; + p += iov[i].buffer.length; + } + + major_status = gss_wrap_iov(minor_status, context_handle, conf_req_flag, + qop_req, conf_state, iov, 5); + if (GSS_ERROR(major_status)) + gss_release_buffer(&tmp, output_message_buffer); + + return major_status; +} + +/* + * AEAD unwrap for a single piece of associated data, for compatibility + * with MIT and as specified by draft-howard-gssapi-aead-00.txt. + * + * @ingroup gssapi + */ +GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL +gss_unwrap_aead(OM_uint32 *minor_status, + gss_ctx_id_t context_handle, + gss_buffer_t input_message_buffer, + gss_buffer_t input_assoc_buffer, + gss_buffer_t output_payload_buffer, + int *conf_state, + gss_qop_t *qop_state) +{ + OM_uint32 major_status, tmp; + gss_iov_buffer_desc iov[3]; + + memset(iov, 0, sizeof(iov)); + + iov[0].type = GSS_IOV_BUFFER_TYPE_STREAM; + iov[0].buffer = *input_message_buffer; + + iov[1].type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY; + if (input_assoc_buffer) + iov[1].buffer = *input_assoc_buffer; + + iov[2].type = GSS_IOV_BUFFER_TYPE_DATA | GSS_IOV_BUFFER_FLAG_ALLOCATE; + + major_status = gss_unwrap_iov(minor_status, context_handle, conf_state, + qop_state, iov, 3); + if (GSS_ERROR(major_status)) + gss_release_iov_buffer(&tmp, &iov[2], 1); + else + *output_payload_buffer = iov[2].buffer; + + return major_status; +} diff --git a/crypto/heimdal/lib/gssapi/mech/gss_authorize_localname.c b/crypto/heimdal/lib/gssapi/mech/gss_authorize_localname.c --- a/crypto/heimdal/lib/gssapi/mech/gss_authorize_localname.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_authorize_localname.c @@ -114,8 +114,8 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_authorize_localname(OM_uint32 *minor_status, - const gss_name_t gss_name, - const gss_name_t gss_user) + gss_const_name_t gss_name, + gss_const_name_t gss_user) { OM_uint32 major_status; @@ -164,7 +164,7 @@ } GSSAPI_LIB_FUNCTION int GSSAPI_LIB_CALL -gss_userok(const gss_name_t name, +gss_userok(gss_const_name_t name, const char *user) { OM_uint32 major_status, minor_status; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_canonicalize_name.c b/crypto/heimdal/lib/gssapi/mech/gss_canonicalize_name.c --- a/crypto/heimdal/lib/gssapi/mech/gss_canonicalize_name.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_canonicalize_name.c @@ -54,7 +54,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_canonicalize_name(OM_uint32 *minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, const gss_OID mech_type, gss_name_t *output_name) { diff --git a/crypto/heimdal/lib/gssapi/mech/gss_compare_name.c b/crypto/heimdal/lib/gssapi/mech/gss_compare_name.c --- a/crypto/heimdal/lib/gssapi/mech/gss_compare_name.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_compare_name.c @@ -30,8 +30,8 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_compare_name(OM_uint32 *minor_status, - const gss_name_t name1_arg, - const gss_name_t name2_arg, + gss_const_name_t name1_arg, + gss_const_name_t name2_arg, int *name_equal) { struct _gss_name *name1 = (struct _gss_name *) name1_arg; @@ -47,7 +47,7 @@ if (!gss_oid_equal(&name1->gn_type, &name2->gn_type)) { *name_equal = 0; } else if (name1->gn_value.length != name2->gn_value.length || - memcmp(name1->gn_value.value, name1->gn_value.value, + memcmp(name1->gn_value.value, name2->gn_value.value, name1->gn_value.length)) { *name_equal = 0; } diff --git a/crypto/heimdal/lib/gssapi/mech/gss_context_time.c b/crypto/heimdal/lib/gssapi/mech/gss_context_time.c --- a/crypto/heimdal/lib/gssapi/mech/gss_context_time.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_context_time.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_context_time(OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, OM_uint32 *time_rec) { struct _gss_context *ctx = (struct _gss_context *) context_handle; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_delete_sec_context.c b/crypto/heimdal/lib/gssapi/mech/gss_delete_sec_context.c --- a/crypto/heimdal/lib/gssapi/mech/gss_delete_sec_context.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_delete_sec_context.c @@ -33,7 +33,7 @@ gss_ctx_id_t *context_handle, gss_buffer_t output_token) { - OM_uint32 major_status; + OM_uint32 major_status = GSS_S_COMPLETE; struct _gss_context *ctx = (struct _gss_context *) *context_handle; if (output_token) @@ -53,5 +53,5 @@ *context_handle = GSS_C_NO_CONTEXT; } - return (GSS_S_COMPLETE); + return (major_status); } diff --git a/crypto/heimdal/lib/gssapi/mech/gss_display_name.c b/crypto/heimdal/lib/gssapi/mech/gss_display_name.c --- a/crypto/heimdal/lib/gssapi/mech/gss_display_name.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_display_name.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_display_name(OM_uint32 *minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t output_name_buffer, gss_OID *output_name_type) { diff --git a/crypto/heimdal/lib/gssapi/mech/gss_display_status.c b/crypto/heimdal/lib/gssapi/mech/gss_display_status.c --- a/crypto/heimdal/lib/gssapi/mech/gss_display_status.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_display_status.c @@ -133,25 +133,43 @@ return msgs[v]; } - +/** + * Convert a GSS-API status code to text + * + * @param minor_status minor status code + * @param status_value status value to convert + * @param status_type One of: + * GSS_C_GSS_CODE - status_value is a GSS status code, + * GSS_C_MECH_CODE - status_value is a mechanism status code + * @param mech_type underlying mechanism. Use GSS_C_NO_OID to obtain the + * system default. + * @param message_context state information to extract further messages from the + * status_value + * @param status_string the allocated text representation. Release with + * gss_release_buffer() + * + * @returns a gss_error code. + * + * @ingroup gssapi + */ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_display_status(OM_uint32 *minor_status, OM_uint32 status_value, int status_type, const gss_OID mech_type, - OM_uint32 *message_content, + OM_uint32 *message_context, gss_buffer_t status_string) { OM_uint32 major_status; _mg_buffer_zero(status_string); - *message_content = 0; + *message_context = 0; major_status = _gss_mg_get_error(mech_type, status_type, status_value, status_string); if (major_status == GSS_S_COMPLETE) { - *message_content = 0; + *message_context = 0; *minor_status = 0; return GSS_S_COMPLETE; } diff --git a/crypto/heimdal/lib/gssapi/mech/gss_duplicate_name.c b/crypto/heimdal/lib/gssapi/mech/gss_duplicate_name.c --- a/crypto/heimdal/lib/gssapi/mech/gss_duplicate_name.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_duplicate_name.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_duplicate_name(OM_uint32 *minor_status, - const gss_name_t src_name, + gss_const_name_t src_name, gss_name_t *dest_name) { OM_uint32 major_status; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_export_name.c b/crypto/heimdal/lib/gssapi/mech/gss_export_name.c --- a/crypto/heimdal/lib/gssapi/mech/gss_export_name.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_export_name.c @@ -28,9 +28,23 @@ #include "mech_locl.h" +/** + * Convert a GGS-API name from internal form to contiguous string. + * + * @sa gss_import_name(), @ref internalVSmechname. + * + * @param minor_status minor status code + * @param input_name input name in internal name form + * @param exported_name output name in contiguos string form + * + * @returns a gss_error code, see gss_display_status() about printing + * the error code. + * + * @ingroup gssapi + */ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_export_name(OM_uint32 *minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t exported_name) { struct _gss_name *name = (struct _gss_name *) input_name; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_get_mic.c b/crypto/heimdal/lib/gssapi/mech/gss_get_mic.c --- a/crypto/heimdal/lib/gssapi/mech/gss_get_mic.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_get_mic.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_get_mic(OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_qop_t qop_req, const gss_buffer_t message_buffer, gss_buffer_t message_token) diff --git a/crypto/heimdal/lib/gssapi/mech/gss_import_name.c b/crypto/heimdal/lib/gssapi/mech/gss_import_name.c --- a/crypto/heimdal/lib/gssapi/mech/gss_import_name.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_import_name.c @@ -149,7 +149,7 @@ } /** - * Import a name internal or mechanism name + * Convert a GGS-API name from contiguous string to internal form. * * Type of name and their format: * - GSS_C_NO_OID @@ -159,12 +159,12 @@ * - GSS_C_NT_ANONYMOUS * - GSS_KRB5_NT_PRINCIPAL_NAME * - * For more information about @ref internalVSmechname. + * @sa gss_export_name(), @ref internalVSmechname. * - * @param minor_status minor status code - * @param input_name_buffer import name buffer - * @param input_name_type type of the import name buffer - * @param output_name the resulting type, release with + * @param minor_status minor status code + * @param input_name_buffer import name buffer + * @param input_name_type type of the import name buffer + * @param output_name the resulting type, release with * gss_release_name(), independent of input_name * * @returns a gss_error code, see gss_display_status() about printing diff --git a/crypto/heimdal/lib/gssapi/mech/gss_indicate_mechs.c b/crypto/heimdal/lib/gssapi/mech/gss_indicate_mechs.c --- a/crypto/heimdal/lib/gssapi/mech/gss_indicate_mechs.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_indicate_mechs.c @@ -43,6 +43,7 @@ if (major_status) return (major_status); + /* XXX We ignore ENOMEM from gss_add_oid_set_member() */ HEIM_SLIST_FOREACH(m, &_gss_mechs, gm_link) { if (m->gm_mech.gm_indicate_mechs) { major_status = m->gm_mech.gm_indicate_mechs( @@ -50,11 +51,11 @@ if (major_status) continue; for (i = 0; i < set->count; i++) - major_status = gss_add_oid_set_member( + gss_add_oid_set_member( minor_status, &set->elements[i], mech_set); gss_release_oid_set(minor_status, &set); } else { - major_status = gss_add_oid_set_member( + gss_add_oid_set_member( minor_status, &m->gm_mech_oid, mech_set); } } diff --git a/crypto/heimdal/lib/gssapi/mech/gss_init_sec_context.c b/crypto/heimdal/lib/gssapi/mech/gss_init_sec_context.c --- a/crypto/heimdal/lib/gssapi/mech/gss_init_sec_context.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_init_sec_context.c @@ -29,7 +29,7 @@ #include "mech_locl.h" static gss_cred_id_t -_gss_mech_cred_find(gss_cred_id_t cred_handle, gss_OID mech_type) +_gss_mech_cred_find(gss_const_cred_id_t cred_handle, gss_OID mech_type) { struct _gss_cred *cred = (struct _gss_cred *)cred_handle; struct _gss_mechanism_cred *mc; @@ -107,9 +107,9 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_init_sec_context(OM_uint32 * minor_status, - const gss_cred_id_t initiator_cred_handle, + gss_const_cred_id_t initiator_cred_handle, gss_ctx_id_t * context_handle, - const gss_name_t target_name, + gss_const_name_t target_name, const gss_OID input_mech_type, OM_uint32 req_flags, OM_uint32 time_req, @@ -125,7 +125,7 @@ struct _gss_name *name = (struct _gss_name *) target_name; struct _gss_mechanism_name *mn; struct _gss_context *ctx = (struct _gss_context *) *context_handle; - gss_cred_id_t cred_handle; + gss_const_cred_id_t cred_handle; int allocated_ctx; gss_OID mech_type = input_mech_type; @@ -172,7 +172,7 @@ major_status = _gss_find_mn(minor_status, name, mech_type, &mn); if (major_status != GSS_S_COMPLETE) { if (allocated_ctx) - free(ctx); + free(ctx); return major_status; } @@ -184,6 +184,13 @@ else cred_handle = _gss_mech_cred_find(initiator_cred_handle, mech_type); + if (initiator_cred_handle != GSS_C_NO_CREDENTIAL && + cred_handle == NULL) { + if (allocated_ctx) + free(ctx); + return GSS_S_NO_CRED; + } + major_status = m->gm_init_sec_context(minor_status, cred_handle, &ctx->gc_ctx, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_inquire_context.c b/crypto/heimdal/lib/gssapi/mech/gss_inquire_context.c --- a/crypto/heimdal/lib/gssapi/mech/gss_inquire_context.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_inquire_context.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_context(OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_name_t *src_name, gss_name_t *targ_name, OM_uint32 *lifetime_rec, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred.c b/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred.c --- a/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred.c @@ -44,7 +44,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_cred(OM_uint32 *minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, gss_name_t *name_ret, OM_uint32 *lifetime, gss_cred_usage_t *cred_usage, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c b/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c --- a/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_mech.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_cred_by_mech(OM_uint32 *minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID mech_type, gss_name_t *cred_name, OM_uint32 *initiator_lifetime, diff --git a/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c b/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c --- a/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_inquire_cred_by_oid.c @@ -34,7 +34,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_cred_by_oid (OM_uint32 *minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { diff --git a/crypto/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c b/crypto/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c --- a/crypto/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_inquire_mechs_for_name.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_mechs_for_name(OM_uint32 *minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_OID_set *mech_types) { OM_uint32 major_status; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c b/crypto/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c --- a/crypto/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_inquire_sec_context_by_oid.c @@ -34,7 +34,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_inquire_sec_context_by_oid (OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { diff --git a/crypto/heimdal/lib/gssapi/mech/gss_mech_switch.c b/crypto/heimdal/lib/gssapi/mech/gss_mech_switch.c --- a/crypto/heimdal/lib/gssapi/mech/gss_mech_switch.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_mech_switch.c @@ -317,6 +317,8 @@ goto bad; m->gm_so = so; + m->gm_mech_oid = mech_oid; + m->gm_mech.gm_name = strdup(name); m->gm_mech.gm_mech_oid = mech_oid; m->gm_mech.gm_flags = 0; m->gm_mech.gm_compat = calloc(1, sizeof(struct gss_mech_compat_desc_struct)); @@ -383,7 +385,7 @@ OPTSYM(set_name_attribute); OPTSYM(delete_name_attribute); OPTSYM(export_name_composite); - OPTSYM(pname_to_uid); + OPTSYM(localname); OPTSPISYM(authorize_localname); mi = dlsym(so, "gss_mo_init"); @@ -416,6 +418,7 @@ if (m != NULL) { free(m->gm_mech.gm_compat); free(m->gm_mech.gm_mech_oid.elements); + free((char *)m->gm_mech.gm_name); free(m); } dlclose(so); diff --git a/crypto/heimdal/lib/gssapi/mech/gss_mo.c b/crypto/heimdal/lib/gssapi/mech/gss_mo.c --- a/crypto/heimdal/lib/gssapi/mech/gss_mo.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_mo.c @@ -203,6 +203,7 @@ EVP_DigestUpdate(ctx, hdr, 2); EVP_DigestUpdate(ctx, mech->elements, mech->length); EVP_DigestFinal_ex(ctx, hash, NULL); + EVP_MD_CTX_destroy(ctx); memcpy(p, "GS2-", 4); p += 4; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_oid.c b/crypto/heimdal/lib/gssapi/mech/gss_oid.c --- a/crypto/heimdal/lib/gssapi/mech/gss_oid.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_oid.c @@ -104,10 +104,10 @@ gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ma_mech_description_oid_desc = { 6, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x66") }; /* GSS_C_CRED_PASSWORD - 1.2.752.43.13.200 */ -gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_cred_password_oid_desc = { 7, "\x2a\x85\x70\x2b\x0d\x81\x48" }; +gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_cred_password_oid_desc = { 7, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x81\x48") }; /* GSS_C_CRED_CERTIFICATE - 1.2.752.43.13.201 */ -gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_cred_certificate_oid_desc = { 7, "\x2a\x85\x70\x2b\x0d\x81\x49" }; +gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_cred_certificate_oid_desc = { 7, rk_UNCONST("\x2a\x85\x70\x2b\x0d\x81\x49") }; /* GSS_SASL_DIGEST_MD5_MECHANISM - 1.2.752.43.14.1 */ gss_OID_desc GSSAPI_LIB_VARIABLE __gss_sasl_digest_md5_mechanism_oid_desc = { 6, rk_UNCONST("\x2a\x85\x70\x2b\x0e\x01") }; @@ -139,8 +139,8 @@ /* GSS_SPNEGO_MECHANISM - 1.3.6.1.5.5.2 */ gss_OID_desc GSSAPI_LIB_VARIABLE __gss_spnego_mechanism_oid_desc = { 6, rk_UNCONST("\x2b\x06\x01\x05\x05\x02") }; -/* GSS_C_PEER_HAS_UPDATED_SPNEGO - 1.3.6.1.4.1.9513.19.5 */ -gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_peer_has_updated_spnego_oid_desc = { 9, rk_UNCONST("\x2b\x06\x01\x04\x01\xca\x29\x13\x05") }; +/* GSS_C_PEER_HAS_UPDATED_SPNEGO - 1.3.6.1.4.1.5322.19.5 */ +gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_peer_has_updated_spnego_oid_desc = { 9, rk_UNCONST("\x2b\x06\x01\x04\x01\xa9\x4a\x13\x05") }; /* GSS_C_MA_MECH_CONCRETE - 1.3.6.1.5.5.13.1 */ gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ma_mech_concrete_oid_desc = { 7, rk_UNCONST("\x2b\x06\x01\x05\x05\x0d\x01") }; @@ -224,43 +224,43 @@ gss_OID_desc GSSAPI_LIB_VARIABLE __gss_c_ma_ctx_trans_oid_desc = { 7, rk_UNCONST("\x2b\x06\x01\x05\x05\x0d\x1b") }; struct _gss_oid_name_table _gss_ont_ma[] = { - { GSS_C_MA_COMPRESS, "GSS_C_MA_COMPRESS", "compress", "" }, + { GSS_C_MA_AUTH_INIT, "GSS_C_MA_AUTH_INIT", "auth-init-princ", "" }, + { GSS_C_MA_AUTH_INIT_ANON, "GSS_C_MA_AUTH_INIT_ANON", "auth-init-princ-anon", "" }, + { GSS_C_MA_AUTH_INIT_INIT, "GSS_C_MA_AUTH_INIT_INIT", "auth-init-princ-initial", "" }, + { GSS_C_MA_AUTH_TARG, "GSS_C_MA_AUTH_TARG", "auth-targ-princ", "" }, + { GSS_C_MA_AUTH_TARG_ANON, "GSS_C_MA_AUTH_TARG_ANON", "auth-targ-princ-anon", "" }, { GSS_C_MA_AUTH_TARG_INIT, "GSS_C_MA_AUTH_TARG_INIT", "auth-targ-princ-initial", "" }, { GSS_C_MA_CBINDINGS, "GSS_C_MA_CBINDINGS", "channel-bindings", "" }, - { GSS_C_MA_WRAP, "GSS_C_MA_WRAP", "wrap", "" }, + { GSS_C_MA_COMPRESS, "GSS_C_MA_COMPRESS", "compress", "" }, + { GSS_C_MA_CONF_PROT, "GSS_C_MA_CONF_PROT", "conf-prot", "" }, + { GSS_C_MA_CTX_TRANS, "GSS_C_MA_CTX_TRANS", "context-transfer", "" }, + { GSS_C_MA_DELEG_CRED, "GSS_C_MA_DELEG_CRED", "deleg-cred", "" }, + { GSS_C_MA_DEPRECATED, "GSS_C_MA_DEPRECATED", "mech-deprecated", "" }, + { GSS_C_MA_INTEG_PROT, "GSS_C_MA_INTEG_PROT", "integ-prot", "" }, { GSS_C_MA_ITOK_FRAMED, "GSS_C_MA_ITOK_FRAMED", "initial-is-framed", "" }, - { GSS_C_MA_MECH_NEGO, "GSS_C_MA_MECH_NEGO", "mech-negotiation-mech", "" }, { GSS_C_MA_MECH_COMPOSITE, "GSS_C_MA_MECH_COMPOSITE", "composite-mech", "" }, - { GSS_C_MA_REPLAY_DET, "GSS_C_MA_REPLAY_DET", "replay-detection", "" }, - { GSS_C_MA_AUTH_INIT_ANON, "GSS_C_MA_AUTH_INIT_ANON", "auth-init-princ-anon", "" }, - { GSS_C_MA_PROT_READY, "GSS_C_MA_PROT_READY", "prot-ready", "" }, - { GSS_C_MA_AUTH_INIT, "GSS_C_MA_AUTH_INIT", "auth-init-princ", "" }, - { GSS_C_MA_PFS, "GSS_C_MA_PFS", "pfs", "" }, - { GSS_C_MA_CONF_PROT, "GSS_C_MA_CONF_PROT", "conf-prot", "" }, - { GSS_C_MA_MECH_PSEUDO, "GSS_C_MA_MECH_PSEUDO", "pseudo-mech", "" }, - { GSS_C_MA_AUTH_TARG, "GSS_C_MA_AUTH_TARG", "auth-targ-princ", "" }, + { GSS_C_MA_MECH_CONCRETE, "GSS_C_MA_MECH_CONCRETE", "concrete-mech", "Indicates that a mech is neither a pseudo-mechanism nor a composite mechanism" }, + { GSS_C_MA_MECH_DESCRIPTION, "GSS_C_MA_MECH_DESCRIPTION", "Mech description", "The long description of the mechanism" }, + { GSS_C_MA_MECH_GLUE, "GSS_C_MA_MECH_GLUE", "mech-glue", "" }, { GSS_C_MA_MECH_NAME, "GSS_C_MA_MECH_NAME", "GSS mech name", "The name of the GSS-API mechanism" }, - { GSS_C_MA_NOT_MECH, "GSS_C_MA_NOT_MECH", "not-mech", "" }, + { GSS_C_MA_MECH_NEGO, "GSS_C_MA_MECH_NEGO", "mech-negotiation-mech", "" }, + { GSS_C_MA_MECH_PSEUDO, "GSS_C_MA_MECH_PSEUDO", "pseudo-mech", "" }, { GSS_C_MA_MIC, "GSS_C_MA_MIC", "mic", "" }, - { GSS_C_MA_DEPRECATED, "GSS_C_MA_DEPRECATED", "mech-deprecated", "" }, - { GSS_C_MA_MECH_GLUE, "GSS_C_MA_MECH_GLUE", "mech-glue", "" }, - { GSS_C_MA_DELEG_CRED, "GSS_C_MA_DELEG_CRED", "deleg-cred", "" }, { GSS_C_MA_NOT_DFLT_MECH, "GSS_C_MA_NOT_DFLT_MECH", "mech-not-default", "" }, - { GSS_C_MA_AUTH_TARG_ANON, "GSS_C_MA_AUTH_TARG_ANON", "auth-targ-princ-anon", "" }, - { GSS_C_MA_INTEG_PROT, "GSS_C_MA_INTEG_PROT", "integ-prot", "" }, - { GSS_C_MA_CTX_TRANS, "GSS_C_MA_CTX_TRANS", "context-transfer", "" }, - { GSS_C_MA_MECH_DESCRIPTION, "GSS_C_MA_MECH_DESCRIPTION", "Mech description", "The long description of the mechanism" }, + { GSS_C_MA_NOT_MECH, "GSS_C_MA_NOT_MECH", "not-mech", "" }, { GSS_C_MA_OOS_DET, "GSS_C_MA_OOS_DET", "oos-detection", "" }, - { GSS_C_MA_AUTH_INIT_INIT, "GSS_C_MA_AUTH_INIT_INIT", "auth-init-princ-initial", "" }, - { GSS_C_MA_MECH_CONCRETE, "GSS_C_MA_MECH_CONCRETE", "concrete-mech", "Indicates that a mech is neither a pseudo-mechanism nor a composite mechanism" }, + { GSS_C_MA_PFS, "GSS_C_MA_PFS", "pfs", "" }, + { GSS_C_MA_PROT_READY, "GSS_C_MA_PROT_READY", "prot-ready", "" }, + { GSS_C_MA_REPLAY_DET, "GSS_C_MA_REPLAY_DET", "replay-detection", "" }, { GSS_C_MA_SASL_MECH_NAME, "GSS_C_MA_SASL_MECH_NAME", "SASL mechanism name", "The name of the SASL mechanism" }, - { NULL } + { GSS_C_MA_WRAP, "GSS_C_MA_WRAP", "wrap", "" }, + { NULL, NULL, NULL, NULL } }; struct _gss_oid_name_table _gss_ont_mech[] = { { GSS_KRB5_MECHANISM, "GSS_KRB5_MECHANISM", "Kerberos 5", "Heimdal Kerberos 5 mechanism" }, - { GSS_SPNEGO_MECHANISM, "GSS_SPNEGO_MECHANISM", "SPNEGO", "Heimdal SPNEGO mechanism" }, { GSS_NTLM_MECHANISM, "GSS_NTLM_MECHANISM", "NTLM", "Heimdal NTLM mechanism" }, - { NULL } + { GSS_SPNEGO_MECHANISM, "GSS_SPNEGO_MECHANISM", "SPNEGO", "Heimdal SPNEGO mechanism" }, + { NULL, NULL, NULL, NULL } }; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_pname_to_uid.c b/crypto/heimdal/lib/gssapi/mech/gss_pname_to_uid.c --- a/crypto/heimdal/lib/gssapi/mech/gss_pname_to_uid.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_pname_to_uid.c @@ -33,21 +33,21 @@ #include "mech_locl.h" static OM_uint32 -mech_pname_to_uid(OM_uint32 *minor_status, - struct _gss_mechanism_name *mn, - uid_t *uidp) +mech_localname(OM_uint32 *minor_status, + struct _gss_mechanism_name *mn, + gss_buffer_t localname) { OM_uint32 major_status = GSS_S_UNAVAILABLE; *minor_status = 0; - if (mn->gmn_mech->gm_pname_to_uid == NULL) + if (mn->gmn_mech->gm_localname == NULL) return GSS_S_UNAVAILABLE; - major_status = mn->gmn_mech->gm_pname_to_uid(minor_status, - mn->gmn_name, - mn->gmn_mech_oid, - uidp); + major_status = mn->gmn_mech->gm_localname(minor_status, + mn->gmn_name, + mn->gmn_mech_oid, + localname); if (GSS_ERROR(major_status)) _gss_mg_error(mn->gmn_mech, major_status, *minor_status); @@ -55,86 +55,55 @@ } static OM_uint32 -attr_pname_to_uid(OM_uint32 *minor_status, - struct _gss_mechanism_name *mn, - uid_t *uidp) +attr_localname(OM_uint32 *minor_status, + struct _gss_mechanism_name *mn, + gss_buffer_t localname) { -#ifdef NO_LOCALNAME - return GSS_S_UNAVAILABLE; -#else OM_uint32 major_status = GSS_S_UNAVAILABLE; OM_uint32 tmpMinor; + gss_buffer_desc value = GSS_C_EMPTY_BUFFER; + gss_buffer_desc display_value = GSS_C_EMPTY_BUFFER; + int authenticated = 0, complete = 0; int more = -1; *minor_status = 0; + localname->length = 0; + localname->value = NULL; + if (mn->gmn_mech->gm_get_name_attribute == NULL) return GSS_S_UNAVAILABLE; - while (more != 0) { - gss_buffer_desc value; - gss_buffer_desc display_value; - int authenticated = 0, complete = 0; -#ifdef POSIX_GETPWNAM_R - char pwbuf[2048]; - struct passwd pw, *pwd; -#else - struct passwd *pwd; -#endif - char *localname; - - major_status = mn->gmn_mech->gm_get_name_attribute(minor_status, - mn->gmn_name, - GSS_C_ATTR_LOCAL_LOGIN_USER, - &authenticated, - &complete, - &value, - &display_value, - &more); - if (GSS_ERROR(major_status)) { - _gss_mg_error(mn->gmn_mech, major_status, *minor_status); - break; - } - - localname = malloc(value.length + 1); - if (localname == NULL) { - major_status = GSS_S_FAILURE; - *minor_status = ENOMEM; - break; - } - - memcpy(localname, value.value, value.length); - localname[value.length] = '\0'; - -#ifdef POSIX_GETPWNAM_R - if (getpwnam_r(localname, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) - pwd = NULL; -#else - pwd = getpwnam(localname); -#endif + major_status = mn->gmn_mech->gm_get_name_attribute(minor_status, + mn->gmn_name, + GSS_C_ATTR_LOCAL_LOGIN_USER, + &authenticated, + &complete, + &value, + &display_value, + &more); + if (GSS_ERROR(major_status)) { + _gss_mg_error(mn->gmn_mech, major_status, *minor_status); + return major_status; + } - free(localname); + if (authenticated) { + *localname = value; + } else { + major_status = GSS_S_UNAVAILABLE; gss_release_buffer(&tmpMinor, &value); - gss_release_buffer(&tmpMinor, &display_value); - - if (pwd != NULL) { - *uidp = pwd->pw_uid; - major_status = GSS_S_COMPLETE; - *minor_status = 0; - break; - } else - major_status = GSS_S_UNAVAILABLE; } + gss_release_buffer(&tmpMinor, &display_value); + return major_status; -#endif /* NO_LOCALNAME */ } GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL -gss_pname_to_uid(OM_uint32 *minor_status, - const gss_name_t pname, - const gss_OID mech_type, - uid_t *uidp) +gss_localname(OM_uint32 *minor_status, + gss_const_name_t pname, + const gss_OID mech_type, + gss_buffer_t localname) { OM_uint32 major_status = GSS_S_UNAVAILABLE; struct _gss_name *name = (struct _gss_name *) pname; @@ -147,14 +116,14 @@ if (GSS_ERROR(major_status)) return major_status; - major_status = mech_pname_to_uid(minor_status, mn, uidp); + major_status = mech_localname(minor_status, mn, localname); if (major_status != GSS_S_COMPLETE) - major_status = attr_pname_to_uid(minor_status, mn, uidp); + major_status = attr_localname(minor_status, mn, localname); } else { HEIM_SLIST_FOREACH(mn, &name->gn_mn, gmn_link) { - major_status = mech_pname_to_uid(minor_status, mn, uidp); + major_status = mech_localname(minor_status, mn, localname); if (major_status != GSS_S_COMPLETE) - major_status = attr_pname_to_uid(minor_status, mn, uidp); + major_status = attr_localname(minor_status, mn, localname); if (major_status != GSS_S_UNAVAILABLE) break; } @@ -165,3 +134,64 @@ return major_status; } + + +GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL +gss_pname_to_uid(OM_uint32 *minor_status, + gss_const_name_t pname, + const gss_OID mech_type, + uid_t *uidp) +{ +#ifdef NO_LOCALNAME + return GSS_S_UNAVAILABLE; +#else + OM_uint32 major, tmpMinor; + gss_buffer_desc localname = GSS_C_EMPTY_BUFFER; + char *szLocalname; +#ifdef POSIX_GETPWNAM_R + char pwbuf[2048]; + struct passwd pw, *pwd; +#else + struct passwd *pwd; +#endif + + major = gss_localname(minor_status, pname, mech_type, &localname); + if (GSS_ERROR(major)) + return major; + if (localname.length == 0) { + *minor_status = KRB5_NO_LOCALNAME; + return GSS_S_FAILURE; + } + + szLocalname = malloc(localname.length + 1); + if (szLocalname == NULL) { + gss_release_buffer(&tmpMinor, &localname); + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + + memcpy(szLocalname, localname.value, localname.length); + szLocalname[localname.length] = '\0'; + +#ifdef POSIX_GETPWNAM_R + if (getpwnam_r(szLocalname, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) + pwd = NULL; +#else + pwd = getpwnam(szLocalname); +#endif + + gss_release_buffer(&tmpMinor, &localname); + free(szLocalname); + + *minor_status = 0; + + if (pwd != NULL) { + *uidp = pwd->pw_uid; + major = GSS_S_COMPLETE; + } else { + major = GSS_S_UNAVAILABLE; + } + + return major; +#endif +} diff --git a/crypto/heimdal/lib/gssapi/mech/gss_process_context_token.c b/crypto/heimdal/lib/gssapi/mech/gss_process_context_token.c --- a/crypto/heimdal/lib/gssapi/mech/gss_process_context_token.c +++ b/crypto/heimdal/lib/gssapi/mech/gss_process_context_token.c @@ -30,7 +30,7 @@ GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL gss_process_context_token(OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t token_buffer) { struct _gss_context *ctx = (struct _gss_context *) context_handle; diff --git a/crypto/heimdal/lib/gssapi/mech/gss_store_cred.c b/crypto/heimdal/lib/gssapi/mech/gss_store_cred.c index 4d2bfdec8b1a5c1f907cde911d9772ba9016d8fd..a92611570eb63488e10df5be0c9433e5bba2a553 GIT binary patch literal 3532 zc$~FY-*cNr5Pmj)#U`C`B!}8*^3;0V8HA8^Qv@m?JANV*@hJp~Y&O4CI!_)MDr=sP{^0uDoe8DSMd&bLNBZ z&Vp;hvjEpi&%I((YYLMaJj5->4_L4YEHIoYn649eY_bYm&xcQ+3?E(IyrCm?ahw~l zJ}y1W_rdjmEtWPzB!u=1Ct#MZBb;fkrp&q20a3tl1F+eG1!xwyIz=R)Lr-vLu&_LH zj<3dq*(|tGgk~&oDBKL=8L%|GfSD`X@L;*}maebRD6=W^P1|4#YkCSu0t16}WjO)( zbHla=nIhI+q7w^A8WUTgsYsaUlzEmJP)56ziOL~A8|TT=G8rwbj}|6lcsF_r>sx=W z&Z;6+xP%u2k^!kMQ1B=R_|aZbL@@EZ}P zMVy}Az1Fl#-#3;lwAmz_tsIkN0(TMCBCkHYhu*1)ouqA~3?<%f9>yh4MmxjqImrZ0 z2DFK)TI$+SyG?%N5sD zkP_V49dg7$T++;Fl6c87;p?bQtASk`GnBmQvgRqL;oFLnyp+pH@3pZWYhN|8#Yv2F z5W>!bS=`v{63wE|h>ukc{cvV58!zF|(?1eo6bQl7hYez~Y#CX+7 zZn`)>%IW9dH*rXBn=B4fk>4w# zNHN+9RsRsH$jfzvKSMGkpT+2brgVhaHk3MH;M+II=)8Bwd!n_st`d38TctX+`d6<@ z&m>{#ZXO?hx25M52}qjpzv?I*9XAmbSKQV2uJL%h=h}(U>3}n7H1e6v!9QNS(o*s(aL6za_UN+D6KMWocD@u~C$&hGv%gfO*UCSZ;!cpzVaFOKS+rOpsGKpb}_uBkvclmlF2Cs2H_zPF)Kf=J- m38WEzD%O!mYy7JMzlH;|XJ%7N=45}U(MUP)>lmDCPujnVJ1R*4 literal 3195 zc$~FXO>^5e5Ivi}Vw=t+l81HNdV~395j)Y^y}-nLAa))e~&WDz8m=RLwnUSESh-Oy0^G1C9YSH$BnF1oYi~# z^|lf4SjM35{TaAY=~N0S;#~I@jrYw~l>1e^7YZ8+nRjSqRrkE|_zCVL^${v5K^7^l zNopA+lb49pxrEs%vcztL4K8$!)a9mm#7^k3`X+;VClhKhOjXo-6*X7UwOL({lmtsI zKzNJb#_}29cxgaFS6zFIpRkr3Lq+<-G-BAo4nbM9W5fGFU40XTfc0}Km1lPVI>aVB^RSTWyT z;;S{|4i9cMp#=|ID!0IT7OX8l;CAR(KCDB3?Fo%W%H~|yj>T7Oeg;Sa3j@1mZUACw zInIGn#Cj%l#*m~nb2OT+ghJ=sXLdk}_9GjeLw*k4Cu?SN8n6!x#aRBW*~1FbRMd_Pxt>pa9-gzOin##!$$`6|b6M3j|Dc6R^D zFs_8K);x0fELw!FO*VnIidt1P@87{_)y7UTwsjrVc)DejR5G3H1Bd4{S9mjEOx(1! zX`J-alt&qnN~1>4sAAVP-P}FiR+)SuxUJ)@r1<^YJ__#|ye=u$<8wWe%34t%3EamW zbHt0dqC2A#@x91YZsIm;4&wTnQ7xN6wag@4zP&l=_q3djUc2b2@!6nQyovE1glNd= zLg5l7$1Brg122w1$cPw!Iplp(o^&yLp?UnL34gZ5!-b(&)CMNw9fZqEa6`wL8YlQ^ zZL5MhA`;QU;tn3zi*HE>24MW5C(t47Q(o}lqT@#*@s}1a7YY3 z8z-n5VS6+2;~2?&*E~ffHYe`sGXqRG1h_Cxv`dKb!)0ID_V5;D0h@OF-m}7xPVLu@ z&XVy}Bpfb+2(MXY*~>|unDCl3{q);5iRf*cCsC$~2Tc?y#yh3=F~SX#)h5QD6FHL4 z6U@L+T0*rQrNJ2Z@&$5QADz{aY5nPGRME;IcYJnq>F(P-_(ayozuGvPyzYQCC7d;% zojNk-TN`x-onyh1eYF$xqW6DtNO5}L{GhQvefW$og6GHm_)t^$v-7Lvn{eEA-`&x{ z3v!{tUWjY?tx;an$$7Cu4!c0h{. +AUTHORS + This manual page was written by Doug Rabson <dfr@FreeBSD.org>. BSD November 14, 2005 BSD diff --git a/crypto/heimdal/lib/gssapi/ntlm/accept_sec_context.c b/crypto/heimdal/lib/gssapi/ntlm/accept_sec_context.c --- a/crypto/heimdal/lib/gssapi/ntlm/accept_sec_context.c +++ b/crypto/heimdal/lib/gssapi/ntlm/accept_sec_context.c @@ -68,7 +68,7 @@ _gss_ntlm_accept_sec_context (OM_uint32 * minor_status, gss_ctx_id_t * context_handle, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token_buffer, const gss_channel_bindings_t input_chan_bindings, gss_name_t * src_name, diff --git a/crypto/heimdal/lib/gssapi/ntlm/acquire_cred.c b/crypto/heimdal/lib/gssapi/ntlm/acquire_cred.c --- a/crypto/heimdal/lib/gssapi/ntlm/acquire_cred.c +++ b/crypto/heimdal/lib/gssapi/ntlm/acquire_cred.c @@ -33,18 +33,18 @@ #include "ntlm.h" -OM_uint32 GSSAPI_CALLCONV _gss_ntlm_acquire_cred - (OM_uint32 * min_stat, - const gss_name_t desired_name, - OM_uint32 time_req, - const gss_OID_set desired_mechs, - gss_cred_usage_t cred_usage, - gss_cred_id_t * output_cred_handle, - gss_OID_set * actual_mechs, - OM_uint32 * time_rec - ) +OM_uint32 GSSAPI_CALLCONV +_gss_ntlm_acquire_cred(OM_uint32 *min_stat, + gss_const_name_t desired_name, + OM_uint32 time_req, + const gss_OID_set desired_mechs, + gss_cred_usage_t cred_usage, + gss_cred_id_t *output_cred_handle, + gss_OID_set *actual_mechs, + OM_uint32 *time_rec) { ntlm_name name = (ntlm_name) desired_name; + const char *domain = NULL; OM_uint32 maj_stat; ntlm_ctx ctx; @@ -55,17 +55,14 @@ if (time_rec) *time_rec = GSS_C_INDEFINITE; - if (desired_name == NULL) - return GSS_S_NO_CRED; - if (cred_usage == GSS_C_BOTH || cred_usage == GSS_C_ACCEPT) { maj_stat = _gss_ntlm_allocate_ctx(min_stat, &ctx); if (maj_stat != GSS_S_COMPLETE) return maj_stat; - maj_stat = (*ctx->server->nsi_probe)(min_stat, ctx->ictx, - name->domain); + domain = name != NULL ? name->domain : NULL; + maj_stat = (*ctx->server->nsi_probe)(min_stat, ctx->ictx, domain); { gss_ctx_id_t context = (gss_ctx_id_t)ctx; OM_uint32 junk; @@ -79,7 +76,7 @@ *min_stat = _gss_ntlm_get_user_cred(name, &cred); if (*min_stat) - return GSS_S_FAILURE; + return GSS_S_NO_CRED; cred->usage = cred_usage; *output_cred_handle = (gss_cred_id_t)cred; diff --git a/crypto/heimdal/lib/gssapi/ntlm/add_cred.c b/crypto/heimdal/lib/gssapi/ntlm/add_cred.c --- a/crypto/heimdal/lib/gssapi/ntlm/add_cred.c +++ b/crypto/heimdal/lib/gssapi/ntlm/add_cred.c @@ -35,8 +35,8 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_add_cred ( OM_uint32 *minor_status, - const gss_cred_id_t input_cred_handle, - const gss_name_t desired_name, + gss_const_cred_id_t input_cred_handle, + gss_const_name_t desired_name, const gss_OID desired_mech, gss_cred_usage_t cred_usage, OM_uint32 initiator_time_req, diff --git a/crypto/heimdal/lib/gssapi/ntlm/canonicalize_name.c b/crypto/heimdal/lib/gssapi/ntlm/canonicalize_name.c --- a/crypto/heimdal/lib/gssapi/ntlm/canonicalize_name.c +++ b/crypto/heimdal/lib/gssapi/ntlm/canonicalize_name.c @@ -36,7 +36,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_canonicalize_name ( OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, const gss_OID mech_type, gss_name_t * output_name ) diff --git a/crypto/heimdal/lib/gssapi/ntlm/compare_name.c b/crypto/heimdal/lib/gssapi/ntlm/compare_name.c --- a/crypto/heimdal/lib/gssapi/ntlm/compare_name.c +++ b/crypto/heimdal/lib/gssapi/ntlm/compare_name.c @@ -35,8 +35,8 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_compare_name (OM_uint32 * minor_status, - const gss_name_t name1, - const gss_name_t name2, + gss_const_name_t name1, + gss_const_name_t name2, int * name_equal ) { diff --git a/crypto/heimdal/lib/gssapi/ntlm/context_time.c b/crypto/heimdal/lib/gssapi/ntlm/context_time.c --- a/crypto/heimdal/lib/gssapi/ntlm/context_time.c +++ b/crypto/heimdal/lib/gssapi/ntlm/context_time.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_context_time (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, OM_uint32 * time_rec ) { diff --git a/crypto/heimdal/lib/gssapi/ntlm/creds.c b/crypto/heimdal/lib/gssapi/ntlm/creds.c --- a/crypto/heimdal/lib/gssapi/ntlm/creds.c +++ b/crypto/heimdal/lib/gssapi/ntlm/creds.c @@ -38,7 +38,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_cred (OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, gss_name_t * name, OM_uint32 * lifetime, gss_cred_usage_t * cred_usage, @@ -60,8 +60,11 @@ n->domain = strdup(c->domain); } if (n == NULL || n->user == NULL || n->domain == NULL) { - if (n) + if (n) { free(n->user); + free(n->domain); + free(n); + } *minor_status = ENOMEM; return GSS_S_FAILURE; } diff --git a/crypto/heimdal/lib/gssapi/ntlm/crypto.c b/crypto/heimdal/lib/gssapi/ntlm/crypto.c --- a/crypto/heimdal/lib/gssapi/ntlm/crypto.c +++ b/crypto/heimdal/lib/gssapi/ntlm/crypto.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006 Kungliga Tekniska Högskolan + * Copyright (c) 2006-2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -32,11 +32,17 @@ */ #include "ntlm.h" - -uint32_t -_krb5_crc_update (const char *p, size_t len, uint32_t res); -void -_krb5_crc_init_table(void); +struct hx509_certs_data; +struct krb5_pk_identity; +struct krb5_pk_cert; +struct ContentInfo; +struct AlgorithmIdentifier; +struct _krb5_krb_auth_data; +struct krb5_dh_moduli; +struct _krb5_key_data; +struct _krb5_encryption_type; +struct _krb5_key_type; +#include "krb5_locl.h" /* * @@ -148,18 +154,16 @@ { unsigned char hmac[16]; unsigned int hmaclen; - HMAC_CTX *c; + HMAC_CTX c; - c = HMAC_CTX_new(); - if (c == NULL) - return GSS_S_FAILURE; - HMAC_Init_ex(c, signkey, 16, EVP_md5(), NULL); + HMAC_CTX_init(&c); + HMAC_Init_ex(&c, signkey, 16, EVP_md5(), NULL); encode_le_uint32(seq, hmac); - HMAC_Update(c, hmac, 4); - HMAC_Update(c, in->value, in->length); - HMAC_Final(c, hmac, &hmaclen); - HMAC_CTX_free(c); + HMAC_Update(&c, hmac, 4); + HMAC_Update(&c, in->value, in->length); + HMAC_Final(&c, hmac, &hmaclen); + HMAC_CTX_cleanup(&c); encode_le_uint32(1, &out[0]); if (sealkey) @@ -265,7 +269,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_get_mic (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_qop_t qop_req, const gss_buffer_t message_buffer, gss_buffer_t message_token @@ -340,7 +344,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_verify_mic (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t message_buffer, const gss_buffer_t token_buffer, gss_qop_t * qop_state @@ -426,7 +430,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_wrap_size_limit ( OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, OM_uint32 req_output_size, @@ -457,7 +461,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_wrap (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, @@ -528,7 +532,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_unwrap (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t input_message_buffer, gss_buffer_t output_message_buffer, int * conf_state, diff --git a/crypto/heimdal/lib/gssapi/ntlm/display_name.c b/crypto/heimdal/lib/gssapi/ntlm/display_name.c --- a/crypto/heimdal/lib/gssapi/ntlm/display_name.c +++ b/crypto/heimdal/lib/gssapi/ntlm/display_name.c @@ -36,7 +36,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_display_name (OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t output_name_buffer, gss_OID * output_name_type ) diff --git a/crypto/heimdal/lib/gssapi/ntlm/duplicate_name.c b/crypto/heimdal/lib/gssapi/ntlm/duplicate_name.c --- a/crypto/heimdal/lib/gssapi/ntlm/duplicate_name.c +++ b/crypto/heimdal/lib/gssapi/ntlm/duplicate_name.c @@ -36,7 +36,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_duplicate_name ( OM_uint32 * minor_status, - const gss_name_t src_name, + gss_const_name_t src_name, gss_name_t * dest_name ) { diff --git a/crypto/heimdal/lib/gssapi/ntlm/export_name.c b/crypto/heimdal/lib/gssapi/ntlm/export_name.c --- a/crypto/heimdal/lib/gssapi/ntlm/export_name.c +++ b/crypto/heimdal/lib/gssapi/ntlm/export_name.c @@ -36,7 +36,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_export_name (OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t exported_name ) { diff --git a/crypto/heimdal/lib/gssapi/ntlm/external.c b/crypto/heimdal/lib/gssapi/ntlm/external.c --- a/crypto/heimdal/lib/gssapi/ntlm/external.c +++ b/crypto/heimdal/lib/gssapi/ntlm/external.c @@ -33,7 +33,6 @@ #include "ntlm.h" -#if 0 static gss_mo_desc ntlm_mo[] = { { GSS_C_MA_SASL_MECH_NAME, @@ -61,8 +60,6 @@ } }; -#endif - static gssapi_mech_interface_desc ntlm_mech = { GMI_VERSION, "ntlm", @@ -115,13 +112,11 @@ NULL, NULL, NULL, -#if 0 ntlm_mo, sizeof(ntlm_mo) / sizeof(ntlm_mo[0]), -#else NULL, - 0, -#endif + NULL, + NULL, NULL, NULL, NULL, diff --git a/crypto/heimdal/lib/gssapi/ntlm/init_sec_context.c b/crypto/heimdal/lib/gssapi/ntlm/init_sec_context.c --- a/crypto/heimdal/lib/gssapi/ntlm/init_sec_context.c +++ b/crypto/heimdal/lib/gssapi/ntlm/init_sec_context.c @@ -35,11 +35,13 @@ static int from_file(const char *fn, const char *target_domain, - char **username, struct ntlm_buf *key) + char **domainp, char **usernamep, struct ntlm_buf *key) { char *str, buf[1024]; FILE *f; + *domainp = NULL; + f = fopen(fn, "r"); if (f == NULL) return ENOENT; @@ -52,41 +54,53 @@ continue; str = NULL; d = strtok_r(buf, ":", &str); - if (!d) - continue; - if (d && strcasecmp(target_domain, d) != 0) + free(*domainp); + *domainp = NULL; + if (!d) + continue; + if (d && target_domain != NULL && strcasecmp(target_domain, d) != 0) continue; + *domainp = strdup(d); + if (*domainp == NULL) + return ENOMEM; u = strtok_r(NULL, ":", &str); p = strtok_r(NULL, ":", &str); if (u == NULL || p == NULL) continue; - *username = strdup(u); + *usernamep = strdup(u); + if (*usernamep == NULL) + return ENOMEM; heim_ntlm_nt_key(p, key); - memset(buf, 0, sizeof(buf)); + memset_s(buf, sizeof(buf), 0, sizeof(buf)); fclose(f); return 0; } - memset(buf, 0, sizeof(buf)); + memset_s(buf, sizeof(buf), 0, sizeof(buf)); fclose(f); return ENOENT; } static int get_user_file(const ntlm_name target_name, - char **username, struct ntlm_buf *key) + char **domainp, char **usernamep, struct ntlm_buf *key) { + const char *domain; const char *fn; + *domainp = NULL; + if (issuid()) return ENOENT; + domain = target_name != NULL ? target_name->domain : NULL; + fn = getenv("NTLM_USER_FILE"); if (fn == NULL) return ENOENT; - if (from_file(fn, target_name->domain, username, key) == 0) + if (from_file(fn, domain, domainp, usernamep, key) == 0) return 0; return ENOENT; @@ -97,7 +111,7 @@ */ static int -get_user_ccache(const ntlm_name name, char **username, struct ntlm_buf *key) +get_user_ccache(const ntlm_name name, char **domainp, char **usernamep, struct ntlm_buf *key) { krb5_context context = NULL; krb5_principal client; @@ -105,8 +119,10 @@ krb5_error_code ret; char *confname; krb5_data data; + int aret; - *username = NULL; + *domainp = NULL; + *usernamep = NULL; krb5_data_zero(&data); key->length = 0; key->data = NULL; @@ -125,22 +141,40 @@ ret = krb5_unparse_name_flags(context, client, KRB5_PRINCIPAL_UNPARSE_NO_REALM, - username); + usernamep); krb5_free_principal(context, client); if (ret) goto out; - asprintf(&confname, "ntlm-key-%s", name->domain); - if (confname == NULL) { - krb5_clear_error_message(context); - ret = ENOMEM; + if (name != NULL) { + *domainp = strdup(name->domain); + } else { + krb5_data data_domain; + + krb5_data_zero(&data_domain); + ret = krb5_cc_get_config(context, id, NULL, "default-ntlm-domain", + &data_domain); + if (ret) + goto out; + + *domainp = strndup(data_domain.data, data_domain.length); + krb5_data_free(&data_domain); + } + + if (*domainp == NULL) { + ret = krb5_enomem(context); goto out; } - ret = krb5_cc_get_config(context, id, NULL, - confname, &data); - if (ret) + aret = asprintf(&confname, "ntlm-key-%s", *domainp); + if (aret == -1) { + ret = krb5_enomem(context); goto out; + } + + ret = krb5_cc_get_config(context, id, NULL, confname, &data); + if (ret) + goto out; key->data = malloc(data.length); if (key->data == NULL) { @@ -171,15 +205,16 @@ if (cred == NULL) return ENOMEM; - ret = get_user_file(target_name, &cred->username, &cred->key); + ret = get_user_file(target_name, + &cred->domain, &cred->username, &cred->key); if (ret) - ret = get_user_ccache(target_name, &cred->username, &cred->key); + ret = get_user_ccache(target_name, + &cred->domain, &cred->username, &cred->key); if (ret) { free(cred); return ret; } - cred->domain = strdup(target_name->domain); *rcred = cred; return ret; @@ -218,9 +253,9 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_init_sec_context (OM_uint32 * minor_status, - const gss_cred_id_t initiator_cred_handle, + gss_const_cred_id_t initiator_cred_handle, gss_ctx_id_t * context_handle, - const gss_name_t target_name, + gss_const_name_t target_name, const gss_OID mech_type, OM_uint32 req_flags, OM_uint32 time_req, @@ -433,7 +468,7 @@ ret = heim_ntlm_build_ntlm1_master(ntlmv2, sizeof(ntlmv2), &sessionkey, &type3.sessionkey); - memset(ntlmv2, 0, sizeof(ntlmv2)); + memset_s(ntlmv2, sizeof(ntlmv2), 0, sizeof(ntlmv2)); if (ret) { _gss_ntlm_delete_sec_context(minor_status, context_handle, NULL); @@ -474,7 +509,7 @@ - ret = heim_ntlm_encode_type3(&type3, &data); + ret = heim_ntlm_encode_type3(&type3, &data, NULL); free(type3.sessionkey.data); if (type3.lm.data) free(type3.lm.data); diff --git a/crypto/heimdal/lib/gssapi/ntlm/inquire_context.c b/crypto/heimdal/lib/gssapi/ntlm/inquire_context.c --- a/crypto/heimdal/lib/gssapi/ntlm/inquire_context.c +++ b/crypto/heimdal/lib/gssapi/ntlm/inquire_context.c @@ -36,7 +36,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_context ( OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_name_t * src_name, gss_name_t * targ_name, OM_uint32 * lifetime_rec, diff --git a/crypto/heimdal/lib/gssapi/ntlm/inquire_cred_by_mech.c b/crypto/heimdal/lib/gssapi/ntlm/inquire_cred_by_mech.c --- a/crypto/heimdal/lib/gssapi/ntlm/inquire_cred_by_mech.c +++ b/crypto/heimdal/lib/gssapi/ntlm/inquire_cred_by_mech.c @@ -36,7 +36,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_cred_by_mech ( OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID mech_type, gss_name_t * name, OM_uint32 * initiator_lifetime, diff --git a/crypto/heimdal/lib/gssapi/ntlm/inquire_mechs_for_name.c b/crypto/heimdal/lib/gssapi/ntlm/inquire_mechs_for_name.c --- a/crypto/heimdal/lib/gssapi/ntlm/inquire_mechs_for_name.c +++ b/crypto/heimdal/lib/gssapi/ntlm/inquire_mechs_for_name.c @@ -36,7 +36,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_mechs_for_name ( OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_OID_set * mech_types ) { diff --git a/crypto/heimdal/lib/gssapi/ntlm/inquire_sec_context_by_oid.c b/crypto/heimdal/lib/gssapi/ntlm/inquire_sec_context_by_oid.c index ee791b15adf2e77237c28519f0f0be05c0ca4371..c40bf492f52ba788a11b46b4e338ac42ce05e009 GIT binary patch literal 3000 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 BpzZ(w diff --git a/crypto/heimdal/lib/gssapi/ntlm/kdc.c b/crypto/heimdal/lib/gssapi/ntlm/kdc.c --- a/crypto/heimdal/lib/gssapi/ntlm/kdc.c +++ b/crypto/heimdal/lib/gssapi/ntlm/kdc.c @@ -251,7 +251,7 @@ struct ntlmkrb5 *c = ctx; krb5_error_code ret; struct ntlm_type2 type2; - krb5_data challange; + krb5_data challenge; struct ntlm_buf data; krb5_data ti; @@ -293,18 +293,18 @@ } *ret_flags = type2.flags; - ret = krb5_ntlm_init_get_challange(c->context, c->ntlm, &challange); + ret = krb5_ntlm_init_get_challenge(c->context, c->ntlm, &challenge); if (ret) { *minor_status = ret; return GSS_S_FAILURE; } - if (challange.length != sizeof(type2.challenge)) { + if (challenge.length != sizeof(type2.challenge)) { *minor_status = EINVAL; return GSS_S_FAILURE; } - memcpy(type2.challenge, challange.data, sizeof(type2.challenge)); - krb5_data_free(&challange); + memcpy(type2.challenge, challenge.data, sizeof(type2.challenge)); + krb5_data_free(&challenge); ret = krb5_ntlm_init_get_targetname(c->context, c->ntlm, &type2.targetname); diff --git a/crypto/heimdal/lib/gssapi/ntlm/ntlm-private.h b/crypto/heimdal/lib/gssapi/ntlm/ntlm-private.h --- a/crypto/heimdal/lib/gssapi/ntlm/ntlm-private.h +++ b/crypto/heimdal/lib/gssapi/ntlm/ntlm-private.h @@ -11,7 +11,7 @@ _gss_ntlm_accept_sec_context ( OM_uint32 * /*minor_status*/, gss_ctx_id_t * /*context_handle*/, - const gss_cred_id_t /*acceptor_cred_handle*/, + gss_const_cred_id_t /*acceptor_cred_handle*/, const gss_buffer_t /*input_token_buffer*/, const gss_channel_bindings_t /*input_chan_bindings*/, gss_name_t * /*src_name*/, @@ -23,20 +23,20 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_acquire_cred ( - OM_uint32 * /*min_stat*/, - const gss_name_t /*desired_name*/, + OM_uint32 */*min_stat*/, + gss_const_name_t /*desired_name*/, OM_uint32 /*time_req*/, const gss_OID_set /*desired_mechs*/, gss_cred_usage_t /*cred_usage*/, - gss_cred_id_t * /*output_cred_handle*/, - gss_OID_set * /*actual_mechs*/, - OM_uint32 * time_rec ); + gss_cred_id_t */*output_cred_handle*/, + gss_OID_set */*actual_mechs*/, + OM_uint32 */*time_rec*/); OM_uint32 GSSAPI_CALLCONV _gss_ntlm_add_cred ( OM_uint32 */*minor_status*/, - const gss_cred_id_t /*input_cred_handle*/, - const gss_name_t /*desired_name*/, + gss_const_cred_id_t /*input_cred_handle*/, + gss_const_name_t /*desired_name*/, const gss_OID /*desired_mech*/, gss_cred_usage_t /*cred_usage*/, OM_uint32 /*initiator_time_req*/, @@ -54,21 +54,21 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_canonicalize_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, const gss_OID /*mech_type*/, gss_name_t * output_name ); OM_uint32 GSSAPI_CALLCONV _gss_ntlm_compare_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*name1*/, - const gss_name_t /*name2*/, + gss_const_name_t /*name1*/, + gss_const_name_t /*name2*/, int * name_equal ); OM_uint32 GSSAPI_CALLCONV _gss_ntlm_context_time ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, OM_uint32 * time_rec ); OM_uint32 GSSAPI_CALLCONV @@ -85,7 +85,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_display_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t /*output_name_buffer*/, gss_OID * output_name_type ); @@ -101,13 +101,13 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_duplicate_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*src_name*/, + gss_const_name_t /*src_name*/, gss_name_t * dest_name ); OM_uint32 GSSAPI_CALLCONV _gss_ntlm_export_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t exported_name ); OM_uint32 GSSAPI_CALLCONV @@ -119,7 +119,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_get_mic ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*message_buffer*/, gss_buffer_t message_token ); @@ -150,9 +150,9 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_init_sec_context ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*initiator_cred_handle*/, + gss_const_cred_id_t /*initiator_cred_handle*/, gss_ctx_id_t * /*context_handle*/, - const gss_name_t /*target_name*/, + gss_const_name_t /*target_name*/, const gss_OID /*mech_type*/, OM_uint32 /*req_flags*/, OM_uint32 /*time_req*/, @@ -166,7 +166,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_context ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_name_t * /*src_name*/, gss_name_t * /*targ_name*/, OM_uint32 * /*lifetime_rec*/, @@ -178,7 +178,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_cred ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, gss_name_t * /*name*/, OM_uint32 * /*lifetime*/, gss_cred_usage_t * /*cred_usage*/, @@ -187,7 +187,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_cred_by_mech ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, const gss_OID /*mech_type*/, gss_name_t * /*name*/, OM_uint32 * /*initiator_lifetime*/, @@ -197,7 +197,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_mechs_for_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_OID_set * mech_types ); OM_uint32 GSSAPI_CALLCONV @@ -209,7 +209,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_inquire_sec_context_by_oid ( OM_uint32 */*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_OID /*desired_object*/, gss_buffer_set_t */*data_set*/); @@ -222,7 +222,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_process_context_token ( OM_uint32 */*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t token_buffer ); OM_uint32 GSSAPI_CALLCONV @@ -246,7 +246,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_unwrap ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*input_message_buffer*/, gss_buffer_t /*output_message_buffer*/, int * /*conf_state*/, @@ -255,7 +255,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_verify_mic ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*message_buffer*/, const gss_buffer_t /*token_buffer*/, gss_qop_t * qop_state ); @@ -263,7 +263,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_wrap ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*input_message_buffer*/, @@ -273,7 +273,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_wrap_size_limit ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, OM_uint32 /*req_output_size*/, diff --git a/crypto/heimdal/lib/gssapi/ntlm/process_context_token.c b/crypto/heimdal/lib/gssapi/ntlm/process_context_token.c --- a/crypto/heimdal/lib/gssapi/ntlm/process_context_token.c +++ b/crypto/heimdal/lib/gssapi/ntlm/process_context_token.c @@ -35,7 +35,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_ntlm_process_context_token ( OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t token_buffer ) { diff --git a/crypto/heimdal/lib/gssapi/oid.txt b/crypto/heimdal/lib/gssapi/oid.txt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/oid.txt @@ -0,0 +1,142 @@ +# /* contact Love Hörnquist Åstrand for new oid arcs */ + +# /* +# * 1.2.752.43.13 Heimdal GSS-API Extentions +# */ + +oid base GSS_KRB5_COPY_CCACHE_X 1.2.752.43.13.1 +oid base GSS_KRB5_GET_TKT_FLAGS_X 1.2.752.43.13.2 +oid base GSS_KRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT_X 1.2.752.43.13.3 +oid base GSS_KRB5_COMPAT_DES3_MIC_X 1.2.752.43.13.4 +oid base GSS_KRB5_REGISTER_ACCEPTOR_IDENTITY_X 1.2.752.43.13.5 +oid base GSS_KRB5_EXPORT_LUCID_CONTEXT_X 1.2.752.43.13.6 +oid base GSS_KRB5_EXPORT_LUCID_CONTEXT_V1_X 1.2.752.43.13.6.1 +oid base GSS_KRB5_SET_DNS_CANONICALIZE_X 1.2.752.43.13.7 +oid base GSS_KRB5_GET_SUBKEY_X 1.2.752.43.13.8 +oid base GSS_KRB5_GET_INITIATOR_SUBKEY_X 1.2.752.43.13.9 +oid base GSS_KRB5_GET_ACCEPTOR_SUBKEY_X 1.2.752.43.13.10 +oid base GSS_KRB5_SEND_TO_KDC_X 1.2.752.43.13.11 +oid base GSS_KRB5_GET_AUTHTIME_X 1.2.752.43.13.12 +oid base GSS_KRB5_GET_SERVICE_KEYBLOCK_X 1.2.752.43.13.13 +oid base GSS_KRB5_SET_ALLOWABLE_ENCTYPES_X 1.2.752.43.13.14 +oid base GSS_KRB5_SET_DEFAULT_REALM_X 1.2.752.43.13.15 +oid base GSS_KRB5_CCACHE_NAME_X 1.2.752.43.13.16 +oid base GSS_KRB5_SET_TIME_OFFSET_X 1.2.752.43.13.17 +oid base GSS_KRB5_GET_TIME_OFFSET_X 1.2.752.43.13.18 +oid base GSS_KRB5_PLUGIN_REGISTER_X 1.2.752.43.13.19 +oid base GSS_NTLM_GET_SESSION_KEY_X 1.2.752.43.13.20 +oid base GSS_C_NT_NTLM 1.2.752.43.13.21 +oid base GSS_C_NT_DN 1.2.752.43.13.22 +oid base GSS_KRB5_NT_PRINCIPAL_NAME_REFERRAL 1.2.752.43.13.23 +oid base GSS_C_NTLM_AVGUEST 1.2.752.43.13.24 +oid base GSS_C_NTLM_V1 1.2.752.43.13.25 +oid base GSS_C_NTLM_V2 1.2.752.43.13.26 +oid base GSS_C_NTLM_SESSION_KEY 1.2.752.43.13.27 +oid base GSS_C_NTLM_FORCE_V1 1.2.752.43.13.28 +oid base GSS_KRB5_CRED_NO_CI_FLAGS_X 1.2.752.43.13.29 +oid base GSS_KRB5_IMPORT_CRED_X 1.2.752.43.13.30 + +# /* glue for gss_inquire_saslname_for_mech */ +oid base GSS_C_MA_SASL_MECH_NAME 1.2.752.43.13.100 +oid base GSS_C_MA_MECH_NAME 1.2.752.43.13.101 +oid base GSS_C_MA_MECH_DESCRIPTION 1.2.752.43.13.102 + +# /* credential types */ +oid base GSS_C_CRED_PASSWORD 1.2.752.43.13.200 +oid base GSS_C_CRED_CERTIFICATE 1.2.752.43.13.201 + +#/* Heimdal mechanisms - 1.2.752.43.14 */ + +oid base GSS_SASL_DIGEST_MD5_MECHANISM 1.2.752.43.14.1 +oid base GSS_NETLOGON_MECHANISM 1.2.752.43.14.2 +oid base GSS_NETLOGON_SET_SESSION_KEY_X 1.2.752.43.14.3 +oid base GSS_NETLOGON_SET_SIGN_ALGORITHM_X 1.2.752.43.14.4 +oid base GSS_NETLOGON_NT_NETBIOS_DNS_NAME 1.2.752.43.14.5 + +#/* GSS_KRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT_X.128 */ +oid base GSS_C_INQ_WIN2K_PAC_X 1.2.752.43.13.3.128 +oid base GSS_C_INQ_SSPI_SESSION_KEY 1.2.840.113554.1.2.2.5.5 + +#/* +# * "Standard" mechs +# */ + +oid base GSS_KRB5_MECHANISM 1.2.840.113554.1.2.2 +oid base GSS_NTLM_MECHANISM 1.3.6.1.4.1.311.2.2.10 +oid base GSS_SPNEGO_MECHANISM 1.3.6.1.5.5.2 + +# /* From Luke Howard */ + +oid base GSS_C_PEER_HAS_UPDATED_SPNEGO 1.3.6.1.4.1.5322.19.5 + +#/* +# * OID mappings with name and short description and and slightly longer description +# */ + +desc mech GSS_KRB5_MECHANISM "Kerberos 5" "Heimdal Kerberos 5 mechanism" +desc mech GSS_NTLM_MECHANISM "NTLM" "Heimdal NTLM mechanism" +desc mech GSS_SPNEGO_MECHANISM "SPNEGO" "Heimdal SPNEGO mechanism" + +desc ma GSS_C_MA_MECH_NAME "GSS mech name" "The name of the GSS-API mechanism" +desc ma GSS_C_MA_SASL_MECH_NAME "SASL mechanism name" "The name of the SASL mechanism" +desc ma GSS_C_MA_MECH_DESCRIPTION "Mech description" "The long description of the mechanism" + +#/* +# * RFC5587 +# */ + +oid base GSS_C_MA_MECH_CONCRETE 1.3.6.1.5.5.13.1 +oid base GSS_C_MA_MECH_PSEUDO 1.3.6.1.5.5.13.2 +oid base GSS_C_MA_MECH_COMPOSITE 1.3.6.1.5.5.13.3 +oid base GSS_C_MA_MECH_NEGO 1.3.6.1.5.5.13.4 +oid base GSS_C_MA_MECH_GLUE 1.3.6.1.5.5.13.5 +oid base GSS_C_MA_NOT_MECH 1.3.6.1.5.5.13.6 +oid base GSS_C_MA_DEPRECATED 1.3.6.1.5.5.13.7 +oid base GSS_C_MA_NOT_DFLT_MECH 1.3.6.1.5.5.13.8 +oid base GSS_C_MA_ITOK_FRAMED 1.3.6.1.5.5.13.9 +oid base GSS_C_MA_AUTH_INIT 1.3.6.1.5.5.13.10 +oid base GSS_C_MA_AUTH_TARG 1.3.6.1.5.5.13.11 +oid base GSS_C_MA_AUTH_INIT_INIT 1.3.6.1.5.5.13.12 +oid base GSS_C_MA_AUTH_TARG_INIT 1.3.6.1.5.5.13.13 +oid base GSS_C_MA_AUTH_INIT_ANON 1.3.6.1.5.5.13.14 +oid base GSS_C_MA_AUTH_TARG_ANON 1.3.6.1.5.5.13.15 +oid base GSS_C_MA_DELEG_CRED 1.3.6.1.5.5.13.16 +oid base GSS_C_MA_INTEG_PROT 1.3.6.1.5.5.13.17 +oid base GSS_C_MA_CONF_PROT 1.3.6.1.5.5.13.18 +oid base GSS_C_MA_MIC 1.3.6.1.5.5.13.19 +oid base GSS_C_MA_WRAP 1.3.6.1.5.5.13.20 +oid base GSS_C_MA_PROT_READY 1.3.6.1.5.5.13.21 +oid base GSS_C_MA_REPLAY_DET 1.3.6.1.5.5.13.22 +oid base GSS_C_MA_OOS_DET 1.3.6.1.5.5.13.23 +oid base GSS_C_MA_CBINDINGS 1.3.6.1.5.5.13.24 +oid base GSS_C_MA_PFS 1.3.6.1.5.5.13.25 +oid base GSS_C_MA_COMPRESS 1.3.6.1.5.5.13.26 +oid base GSS_C_MA_CTX_TRANS 1.3.6.1.5.5.13.27 + +desc ma GSS_C_MA_MECH_CONCRETE "concrete-mech" "Indicates that a mech is neither a pseudo-mechanism nor a composite mechanism" +desc ma GSS_C_MA_MECH_PSEUDO "pseudo-mech" "" +desc ma GSS_C_MA_MECH_COMPOSITE "composite-mech" "" +desc ma GSS_C_MA_MECH_NEGO "mech-negotiation-mech" "" +desc ma GSS_C_MA_MECH_GLUE "mech-glue" "" +desc ma GSS_C_MA_NOT_MECH "not-mech" "" +desc ma GSS_C_MA_DEPRECATED "mech-deprecated" "" +desc ma GSS_C_MA_NOT_DFLT_MECH "mech-not-default" "" +desc ma GSS_C_MA_ITOK_FRAMED "initial-is-framed" "" +desc ma GSS_C_MA_AUTH_INIT "auth-init-princ" "" +desc ma GSS_C_MA_AUTH_TARG "auth-targ-princ" "" +desc ma GSS_C_MA_AUTH_INIT_INIT "auth-init-princ-initial" "" +desc ma GSS_C_MA_AUTH_TARG_INIT "auth-targ-princ-initial" "" +desc ma GSS_C_MA_AUTH_INIT_ANON "auth-init-princ-anon" "" +desc ma GSS_C_MA_AUTH_TARG_ANON "auth-targ-princ-anon" "" +desc ma GSS_C_MA_DELEG_CRED "deleg-cred" "" +desc ma GSS_C_MA_INTEG_PROT "integ-prot" "" +desc ma GSS_C_MA_CONF_PROT "conf-prot" "" +desc ma GSS_C_MA_MIC "mic" "" +desc ma GSS_C_MA_WRAP "wrap" "" +desc ma GSS_C_MA_PROT_READY "prot-ready" "" +desc ma GSS_C_MA_REPLAY_DET "replay-detection" "" +desc ma GSS_C_MA_OOS_DET "oos-detection" "" +desc ma GSS_C_MA_CBINDINGS "channel-bindings" "" +desc ma GSS_C_MA_PFS "pfs" "" +desc ma GSS_C_MA_COMPRESS "compress" "" +desc ma GSS_C_MA_CTX_TRANS "context-transfer" "" diff --git a/crypto/heimdal/lib/gssapi/spnego/accept_sec_context.c b/crypto/heimdal/lib/gssapi/spnego/accept_sec_context.c --- a/crypto/heimdal/lib/gssapi/spnego/accept_sec_context.c +++ b/crypto/heimdal/lib/gssapi/spnego/accept_sec_context.c @@ -470,7 +470,7 @@ acceptor_start (OM_uint32 * minor_status, gss_ctx_id_t * context_handle, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token_buffer, const gss_channel_bindings_t input_chan_bindings, gss_name_t * src_name, @@ -689,7 +689,7 @@ acceptor_continue (OM_uint32 * minor_status, gss_ctx_id_t * context_handle, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token_buffer, const gss_channel_bindings_t input_chan_bindings, gss_name_t * src_name, @@ -876,7 +876,7 @@ _gss_spnego_accept_sec_context (OM_uint32 * minor_status, gss_ctx_id_t * context_handle, - const gss_cred_id_t acceptor_cred_handle, + gss_const_cred_id_t acceptor_cred_handle, const gss_buffer_t input_token_buffer, const gss_channel_bindings_t input_chan_bindings, gss_name_t * src_name, diff --git a/crypto/heimdal/lib/gssapi/spnego/compat.c b/crypto/heimdal/lib/gssapi/spnego/compat.c --- a/crypto/heimdal/lib/gssapi/spnego/compat.c +++ b/crypto/heimdal/lib/gssapi/spnego/compat.c @@ -234,7 +234,7 @@ gss_name_t target_name, OM_uint32 (*func)(gss_name_t, gss_OID), int includeMSCompatOID, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, MechTypeList *mechtypelist, gss_OID *preferred_mech) { diff --git a/crypto/heimdal/lib/gssapi/spnego/context_stubs.c b/crypto/heimdal/lib/gssapi/spnego/context_stubs.c --- a/crypto/heimdal/lib/gssapi/spnego/context_stubs.c +++ b/crypto/heimdal/lib/gssapi/spnego/context_stubs.c @@ -68,18 +68,18 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_process_context_token (OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t token_buffer ) { - gss_ctx_id_t context ; + gss_ctx_id_t context; gssspnego_ctx ctx; OM_uint32 ret; if (context_handle == GSS_C_NO_CONTEXT) return GSS_S_NO_CONTEXT; - context = context_handle; + context = (gss_ctx_id_t)context_handle; ctx = (gssspnego_ctx)context_handle; HEIMDAL_MUTEX_lock(&ctx->ctx_id_mutex); @@ -121,7 +121,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_context_time (OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, OM_uint32 *time_rec ) { @@ -145,7 +145,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_get_mic (OM_uint32 *minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_qop_t qop_req, const gss_buffer_t message_buffer, gss_buffer_t message_token @@ -171,7 +171,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_verify_mic (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t message_buffer, const gss_buffer_t token_buffer, gss_qop_t * qop_state @@ -200,7 +200,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, const gss_buffer_t input_message_buffer, @@ -233,7 +233,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_unwrap (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_buffer_t input_message_buffer, gss_buffer_t output_message_buffer, int * conf_state, @@ -264,8 +264,8 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_compare_name (OM_uint32 *minor_status, - const gss_name_t name1, - const gss_name_t name2, + gss_const_name_t name1, + gss_const_name_t name2, int * name_equal ) { @@ -288,7 +288,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_display_name (OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t output_name_buffer, gss_OID * output_name_type ) @@ -342,7 +342,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_name (OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_buffer_t exported_name ) { @@ -382,7 +382,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_context ( OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_name_t * src_name, gss_name_t * targ_name, OM_uint32 * lifetime_rec, @@ -449,7 +449,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap_size_limit ( OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, int conf_req_flag, gss_qop_t qop_req, OM_uint32 req_output_size, @@ -531,6 +531,7 @@ gss_ctx_id_t context; gssspnego_ctx ctx; + *context_handle = GSS_C_NO_CONTEXT; ret = _gss_spnego_alloc_sec_context(minor_status, &context); if (ret != GSS_S_COMPLETE) { return ret; @@ -543,7 +544,7 @@ interprocess_token, &ctx->negotiated_ctx_id); if (ret != GSS_S_COMPLETE) { - _gss_spnego_internal_delete_sec_context(&minor, context_handle, GSS_C_NO_BUFFER); + _gss_spnego_internal_delete_sec_context(&minor, &context, GSS_C_NO_BUFFER); return ret; } @@ -602,7 +603,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_mechs_for_name ( OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, gss_OID_set * mech_types ) { @@ -623,7 +624,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_canonicalize_name ( OM_uint32 * minor_status, - const gss_name_t input_name, + gss_const_name_t input_name, const gss_OID mech_type, gss_name_t * output_name ) @@ -634,14 +635,13 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_duplicate_name ( OM_uint32 * minor_status, - const gss_name_t src_name, + gss_const_name_t src_name, gss_name_t * dest_name ) { return gss_duplicate_name(minor_status, src_name, dest_name); } -#if 0 OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap_iov(OM_uint32 * minor_status, gss_ctx_id_t context_handle, @@ -705,12 +705,10 @@ iov, iov_count); } -#endif - #if 0 OM_uint32 GSSAPI_CALLCONV _gss_spnego_complete_auth_token (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, gss_buffer_t input_message_buffer) { gssspnego_ctx ctx; @@ -735,7 +733,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_sec_context_by_oid (OM_uint32 * minor_status, - const gss_ctx_id_t context_handle, + gss_const_ctx_id_t context_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { diff --git a/crypto/heimdal/lib/gssapi/spnego/cred_stubs.c b/crypto/heimdal/lib/gssapi/spnego/cred_stubs.c --- a/crypto/heimdal/lib/gssapi/spnego/cred_stubs.c +++ b/crypto/heimdal/lib/gssapi/spnego/cred_stubs.c @@ -56,7 +56,7 @@ */ OM_uint32 GSSAPI_CALLCONV _gss_spnego_acquire_cred (OM_uint32 *minor_status, - const gss_name_t desired_name, + gss_const_name_t desired_name, OM_uint32 time_req, const gss_OID_set desired_mechs, gss_cred_usage_t cred_usage, @@ -129,7 +129,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_cred (OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, gss_name_t * name, OM_uint32 * lifetime, gss_cred_usage_t * cred_usage, @@ -171,7 +171,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_cred_by_mech ( OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID mech_type, gss_name_t * name, OM_uint32 * initiator_lifetime, @@ -216,7 +216,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_cred_by_oid (OM_uint32 * minor_status, - const gss_cred_id_t cred_handle, + gss_const_cred_id_t cred_handle, const gss_OID desired_object, gss_buffer_set_t *data_set) { @@ -252,7 +252,6 @@ value); } -#if 0 OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_cred (OM_uint32 *minor_status, @@ -270,4 +269,3 @@ return gss_import_cred(minor_status, value, cred_handle); } -#endif diff --git a/crypto/heimdal/lib/gssapi/spnego/external.c b/crypto/heimdal/lib/gssapi/spnego/external.c --- a/crypto/heimdal/lib/gssapi/spnego/external.c +++ b/crypto/heimdal/lib/gssapi/spnego/external.c @@ -39,7 +39,6 @@ * negotiation token is identified by the Object Identifier * iso.org.dod.internet.security.mechanism.snego (1.3.6.1.5.5.2). */ -#if 0 static gss_mo_desc spnego_mo[] = { { GSS_C_MA_SASL_MECH_NAME, @@ -67,14 +66,21 @@ }, { GSS_C_MA_MECH_NEGO, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL }, { GSS_C_MA_MECH_PSEUDO, - GSS_MO_MA + GSS_MO_MA, + NULL, + NULL, + NULL, + NULL } }; -#endif static gssapi_mech_interface_desc spnego_mech = { GMI_VERSION, @@ -86,7 +92,7 @@ _gss_spnego_init_sec_context, _gss_spnego_accept_sec_context, _gss_spnego_process_context_token, - _gss_spnego_internal_delete_sec_context, + _gss_spnego_delete_sec_context, _gss_spnego_context_time, _gss_spnego_get_mic, _gss_spnego_verify_mic, @@ -115,23 +121,12 @@ _gss_spnego_set_sec_context_option, _gss_spnego_set_cred_option, _gss_spnego_pseudo_random, -#if 0 _gss_spnego_wrap_iov, _gss_spnego_unwrap_iov, _gss_spnego_wrap_iov_length, -#else - NULL, - NULL, NULL, -#endif - NULL, -#if 0 _gss_spnego_export_cred, _gss_spnego_import_cred, -#else - NULL, - NULL, -#endif NULL, NULL, NULL, @@ -139,13 +134,11 @@ NULL, NULL, NULL, -#if 0 spnego_mo, sizeof(spnego_mo) / sizeof(spnego_mo[0]), -#else NULL, - 0, -#endif + NULL, + NULL, NULL, NULL, NULL, diff --git a/crypto/heimdal/lib/gssapi/spnego/init_sec_context.c b/crypto/heimdal/lib/gssapi/spnego/init_sec_context.c --- a/crypto/heimdal/lib/gssapi/spnego/init_sec_context.c +++ b/crypto/heimdal/lib/gssapi/spnego/init_sec_context.c @@ -177,9 +177,9 @@ static OM_uint32 spnego_initial (OM_uint32 * minor_status, - gss_cred_id_t cred, + gss_const_cred_id_t cred, gss_ctx_id_t * context_handle, - const gss_name_t target_name, + gss_const_name_t target_name, const gss_OID mech_type, OM_uint32 req_flags, OM_uint32 time_req, @@ -374,9 +374,9 @@ static OM_uint32 spnego_reply (OM_uint32 * minor_status, - const gss_cred_id_t cred, + gss_const_cred_id_t cred, gss_ctx_id_t * context_handle, - const gss_name_t target_name, + gss_const_name_t target_name, const gss_OID mech_type, OM_uint32 req_flags, OM_uint32 time_req, @@ -614,9 +614,9 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_init_sec_context (OM_uint32 * minor_status, - const gss_cred_id_t initiator_cred_handle, + gss_const_cred_id_t initiator_cred_handle, gss_ctx_id_t * context_handle, - const gss_name_t target_name, + gss_const_name_t target_name, const gss_OID mech_type, OM_uint32 req_flags, OM_uint32 time_req, diff --git a/crypto/heimdal/lib/gssapi/spnego/spnego-private.h b/crypto/heimdal/lib/gssapi/spnego/spnego-private.h --- a/crypto/heimdal/lib/gssapi/spnego/spnego-private.h +++ b/crypto/heimdal/lib/gssapi/spnego/spnego-private.h @@ -11,7 +11,7 @@ _gss_spnego_accept_sec_context ( OM_uint32 * /*minor_status*/, gss_ctx_id_t * /*context_handle*/, - const gss_cred_id_t /*acceptor_cred_handle*/, + gss_const_cred_id_t /*acceptor_cred_handle*/, const gss_buffer_t /*input_token_buffer*/, const gss_channel_bindings_t /*input_chan_bindings*/, gss_name_t * /*src_name*/, @@ -24,7 +24,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_acquire_cred ( OM_uint32 */*minor_status*/, - const gss_name_t /*desired_name*/, + gss_const_name_t /*desired_name*/, OM_uint32 /*time_req*/, const gss_OID_set /*desired_mechs*/, gss_cred_usage_t /*cred_usage*/, @@ -40,21 +40,21 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_canonicalize_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, const gss_OID /*mech_type*/, gss_name_t * output_name ); OM_uint32 GSSAPI_CALLCONV _gss_spnego_compare_name ( OM_uint32 */*minor_status*/, - const gss_name_t /*name1*/, - const gss_name_t /*name2*/, + gss_const_name_t /*name1*/, + gss_const_name_t /*name2*/, int * name_equal ); OM_uint32 GSSAPI_CALLCONV _gss_spnego_context_time ( OM_uint32 */*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, OM_uint32 *time_rec ); OM_uint32 GSSAPI_CALLCONV @@ -66,14 +66,14 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_display_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t /*output_name_buffer*/, gss_OID * output_name_type ); OM_uint32 GSSAPI_CALLCONV _gss_spnego_duplicate_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*src_name*/, + gss_const_name_t /*src_name*/, gss_name_t * dest_name ); OM_uint32 GSSAPI_CALLCONV @@ -85,7 +85,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_export_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_buffer_t exported_name ); OM_uint32 GSSAPI_CALLCONV @@ -97,7 +97,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_get_mic ( OM_uint32 */*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*message_buffer*/, gss_buffer_t message_token ); @@ -127,16 +127,16 @@ gss_name_t /*target_name*/, OM_uint32 (*/*func*/)(gss_name_t, gss_OID), int /*includeMSCompatOID*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, MechTypeList */*mechtypelist*/, gss_OID */*preferred_mech*/); OM_uint32 GSSAPI_CALLCONV _gss_spnego_init_sec_context ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*initiator_cred_handle*/, + gss_const_cred_id_t /*initiator_cred_handle*/, gss_ctx_id_t * /*context_handle*/, - const gss_name_t /*target_name*/, + gss_const_name_t /*target_name*/, const gss_OID /*mech_type*/, OM_uint32 /*req_flags*/, OM_uint32 /*time_req*/, @@ -150,7 +150,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_context ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, gss_name_t * /*src_name*/, gss_name_t * /*targ_name*/, OM_uint32 * /*lifetime_rec*/, @@ -162,7 +162,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_cred ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, gss_name_t * /*name*/, OM_uint32 * /*lifetime*/, gss_cred_usage_t * /*cred_usage*/, @@ -171,7 +171,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_cred_by_mech ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, const gss_OID /*mech_type*/, gss_name_t * /*name*/, OM_uint32 * /*initiator_lifetime*/, @@ -181,14 +181,14 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_cred_by_oid ( OM_uint32 * /*minor_status*/, - const gss_cred_id_t /*cred_handle*/, + gss_const_cred_id_t /*cred_handle*/, const gss_OID /*desired_object*/, gss_buffer_set_t */*data_set*/); OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_mechs_for_name ( OM_uint32 * /*minor_status*/, - const gss_name_t /*input_name*/, + gss_const_name_t /*input_name*/, gss_OID_set * mech_types ); OM_uint32 GSSAPI_CALLCONV @@ -200,7 +200,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_inquire_sec_context_by_oid ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_OID /*desired_object*/, gss_buffer_set_t */*data_set*/); @@ -213,7 +213,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_process_context_token ( OM_uint32 */*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t token_buffer ); OM_uint32 GSSAPI_CALLCONV @@ -258,7 +258,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_unwrap ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*input_message_buffer*/, gss_buffer_t /*output_message_buffer*/, int * /*conf_state*/, @@ -276,7 +276,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_verify_mic ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, const gss_buffer_t /*message_buffer*/, const gss_buffer_t /*token_buffer*/, gss_qop_t * qop_state ); @@ -284,7 +284,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, const gss_buffer_t /*input_message_buffer*/, @@ -314,7 +314,7 @@ OM_uint32 GSSAPI_CALLCONV _gss_spnego_wrap_size_limit ( OM_uint32 * /*minor_status*/, - const gss_ctx_id_t /*context_handle*/, + gss_const_ctx_id_t /*context_handle*/, int /*conf_req_flag*/, gss_qop_t /*qop_req*/, OM_uint32 /*req_output_size*/, diff --git a/crypto/heimdal/lib/gssapi/test_add_store_cred.c b/crypto/heimdal/lib/gssapi/test_add_store_cred.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/gssapi/test_add_store_cred.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2015 Cryptonector LLC. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. The name Cryptonector LLC may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +static void +print_gss_err(OM_uint32 stat, int status_type, gss_OID mech) +{ + gss_buffer_desc str; + OM_uint32 maj; + OM_uint32 min; + OM_uint32 msg_ctx = 0; + int first = 1; + + do { + maj = gss_display_status(&min, stat, status_type, mech, &msg_ctx, + &str); + if (maj != GSS_S_COMPLETE) { + fprintf(stderr, "Error displaying GSS %s error (%lu): %lu, %lu", + status_type == GSS_C_GSS_CODE ? "major" : "minor", + (unsigned long)stat, (unsigned long)maj, + (unsigned long)min); + return; + } + if (first) { + fprintf(stderr, "GSS %s error: %.*s\n", + status_type == GSS_C_GSS_CODE ? "major" : "minor", + (int)str.length, (char *)str.value); + first = 0; + } else { + fprintf(stderr, "\t%.*s\n", (int)str.length, (char *)str.value); + } + gss_release_buffer(&min, &str); + } while (msg_ctx != 0); +} + +static void +print_gss_errs(OM_uint32 major, OM_uint32 minor, gss_OID mech) +{ + print_gss_err(major, GSS_C_GSS_CODE, GSS_C_NO_OID); + print_gss_err(major, GSS_C_MECH_CODE, mech); +} + +static void +gss_err(int exitval, OM_uint32 major, OM_uint32 minor, gss_OID mech, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vwarnx(fmt, args); + va_end(args); + print_gss_errs(major, minor, mech); + exit(exitval); +} + +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"version", 0, arg_flag, &version_flag, "print version", NULL }, + {"help", 0, arg_flag, &help_flag, NULL, NULL } +}; + +static void +usage(int ret) +{ + arg_printusage(args, sizeof(args)/sizeof(*args), + NULL, "from_ccache to_ccache"); + exit(ret); +} + +int +main(int argc, char **argv) +{ + OM_uint32 major, minor; + gss_cred_id_t from_cred = GSS_C_NO_CREDENTIAL; + gss_cred_id_t to_cred = GSS_C_NO_CREDENTIAL; + gss_cred_id_t cred = GSS_C_NO_CREDENTIAL; + char *from_env; + char *to_env; + int optidx = 0; + + setprogname(argv[0]); + if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if (version_flag){ + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + if (argc < 2) + errx(1, "required arguments missing"); + if (argc > 2) + errx(1, "too many arguments"); + + if (asprintf(&from_env, "KRB5CCNAME=%s", argv[0]) == -1 || from_env == NULL) + err(1, "out of memory"); + if (asprintf(&to_env, "KRB5CCNAME=%s", argv[1]) == -1 || to_env == NULL) + err(1, "out of memory"); + + putenv(from_env); + major = gss_add_cred(&minor, GSS_C_NO_CREDENTIAL, GSS_C_NO_NAME, + GSS_KRB5_MECHANISM, GSS_C_INITIATE, GSS_C_INDEFINITE, + GSS_C_INDEFINITE, &from_cred, NULL, NULL, NULL); + if (major != GSS_S_COMPLETE) + gss_err(1, major, minor, GSS_KRB5_MECHANISM, + "failed to acquire creds from %s", argv[0]); + + putenv(to_env); + major = gss_store_cred(&minor, from_cred, GSS_C_INITIATE, + GSS_KRB5_MECHANISM, 1, 1, NULL, NULL); + if (major != GSS_S_COMPLETE) + gss_err(1, major, minor, GSS_KRB5_MECHANISM, + "failed to store creds into %s", argv[1]); + + (void) gss_release_cred(&minor, &from_cred); + (void) gss_release_cred(&minor, &to_cred); + + major = gss_add_cred(&minor, GSS_C_NO_CREDENTIAL, GSS_C_NO_NAME, + GSS_KRB5_MECHANISM, GSS_C_INITIATE, GSS_C_INDEFINITE, + GSS_C_INDEFINITE, &cred, NULL, NULL, NULL); + if (major != GSS_S_COMPLETE) + gss_err(1, major, minor, GSS_KRB5_MECHANISM, + "failed to acquire creds from %s", argv[1]); + (void) gss_release_cred(&minor, &cred); + putenv("KRB5CCNAME"); + free(from_env); + free(to_env); + + return 0; +} diff --git a/crypto/heimdal/lib/gssapi/test_common.c b/crypto/heimdal/lib/gssapi/test_common.c --- a/crypto/heimdal/lib/gssapi/test_common.c +++ b/crypto/heimdal/lib/gssapi/test_common.c @@ -38,7 +38,7 @@ char * gssapi_err(OM_uint32 maj_stat, OM_uint32 min_stat, gss_OID mech) { - OM_uint32 disp_min_stat, disp_maj_stat; + OM_uint32 disp_min_stat; gss_buffer_desc maj_error_message; gss_buffer_desc min_error_message; OM_uint32 msg_ctx = 0; @@ -50,12 +50,10 @@ min_error_message.length = 0; min_error_message.value = NULL; - disp_maj_stat = gss_display_status(&disp_min_stat, maj_stat, - GSS_C_GSS_CODE, - mech, &msg_ctx, &maj_error_message); - disp_maj_stat = gss_display_status(&disp_min_stat, min_stat, - GSS_C_MECH_CODE, - mech, &msg_ctx, &min_error_message); + (void) gss_display_status(&disp_min_stat, maj_stat, GSS_C_GSS_CODE, + mech, &msg_ctx, &maj_error_message); + (void) gss_display_status(&disp_min_stat, min_stat, GSS_C_MECH_CODE, + mech, &msg_ctx, &min_error_message); if (asprintf(&ret, "gss-code: %lu %.*s -- mech-code: %lu %.*s", (unsigned long)maj_stat, (int)maj_error_message.length, diff --git a/crypto/heimdal/lib/gssapi/test_context.c b/crypto/heimdal/lib/gssapi/test_context.c --- a/crypto/heimdal/lib/gssapi/test_context.c +++ b/crypto/heimdal/lib/gssapi/test_context.c @@ -42,6 +42,7 @@ static char *type_string; static char *mech_string; +static char *mechs_string; static char *ret_mech_string; static char *client_name; static char *client_password; @@ -50,6 +51,7 @@ static int dce_style_flag = 0; static int wrapunwrap_flag = 0; static int iov_flag = 0; +static int aead_flag = 0; static int getverifymic_flag = 0; static int deleg_flag = 0; static int policy_deleg_flag = 0; @@ -90,17 +92,49 @@ static gss_OID string_to_oid(const char *name) { - int i; + size_t i; for (i = 0; i < sizeof(o2n)/sizeof(o2n[0]); i++) if (strcasecmp(name, o2n[i].name) == 0) return o2n[i].oid; errx(1, "name '%s' not unknown", name); } +static void +string_to_oids(gss_OID_set *oidsetp, gss_OID_set oidset, + gss_OID_desc *oidarray, size_t oidarray_len, + char *names) +{ + char *name; + char *s; + + if (names[0] == '\0') { + *oidsetp = GSS_C_NO_OID_SET; + return; + } + + oidset->elements = &oidarray[0]; + if (strcasecmp(names, "all") == 0) { + if (sizeof(o2n)/sizeof(o2n[0]) > oidarray_len) + errx(1, "internal error: oidarray must be enlarged"); + for (oidset->count = 0; oidset->count < oidarray_len; oidset->count++) + oidset->elements[oidset->count] = *o2n[oidset->count].oid; + } else { + for (oidset->count = 0, name = strtok_r(names, ", ", &s); + name != NULL; + oidset->count++, name = strtok_r(NULL, ", ", &s)) { + if (oidset->count >= oidarray_len) + errx(1, "too many mech names given"); + oidset->elements[oidset->count] = *string_to_oid(name); + } + oidset->count = oidset->count; + } + *oidsetp = oidset; +} + static const char * oid_to_string(const gss_OID oid) { - int i; + size_t i; for (i = 0; i < sizeof(o2n)/sizeof(o2n[0]); i++) if (gss_oid_equal(oid, o2n[i].oid)) return o2n[i].name; @@ -315,7 +349,7 @@ memset(iov, 0, sizeof(iov)); - iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER | GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATE; + iov[0].type = GSS_IOV_BUFFER_TYPE_HEADER | GSS_IOV_BUFFER_FLAG_ALLOCATE; if (header.length != 0) { iov[1].type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY; @@ -341,7 +375,7 @@ if (dce_style_flag) { iov[4].type = GSS_IOV_BUFFER_TYPE_EMPTY; } else { - iov[4].type = GSS_IOV_BUFFER_TYPE_PADDING | GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATE; + iov[4].type = GSS_IOV_BUFFER_TYPE_PADDING | GSS_IOV_BUFFER_FLAG_ALLOCATE; } iov[4].buffer.length = 0; iov[4].buffer.value = 0; @@ -350,7 +384,7 @@ } else if (flags & USE_HEADER_ONLY) { iov[5].type = GSS_IOV_BUFFER_TYPE_EMPTY; } else { - iov[5].type = GSS_IOV_BUFFER_TYPE_TRAILER | GSS_IOV_BUFFER_TYPE_FLAG_ALLOCATE; + iov[5].type = GSS_IOV_BUFFER_TYPE_TRAILER | GSS_IOV_BUFFER_FLAG_ALLOCATE; } iov[5].buffer.length = 0; iov[5].buffer.value = 0; @@ -370,17 +404,29 @@ token.data = emalloc(token.length); p = token.data; - memcpy(p, iov[0].buffer.value, iov[0].buffer.length); + + if (iov[0].buffer.length) + memcpy(p, iov[0].buffer.value, iov[0].buffer.length); p += iov[0].buffer.length; - memcpy(p, iov[1].buffer.value, iov[1].buffer.length); + + if (iov[1].buffer.length) + memcpy(p, iov[1].buffer.value, iov[1].buffer.length); p += iov[1].buffer.length; - memcpy(p, iov[2].buffer.value, iov[2].buffer.length); + + if (iov[2].buffer.length) + memcpy(p, iov[2].buffer.value, iov[2].buffer.length); p += iov[2].buffer.length; - memcpy(p, iov[3].buffer.value, iov[3].buffer.length); + + if (iov[3].buffer.length) + memcpy(p, iov[3].buffer.value, iov[3].buffer.length); p += iov[3].buffer.length; - memcpy(p, iov[4].buffer.value, iov[4].buffer.length); + + if (iov[4].buffer.length) + memcpy(p, iov[4].buffer.value, iov[4].buffer.length); p += iov[4].buffer.length; - memcpy(p, iov[5].buffer.value, iov[5].buffer.length); + + if (iov[5].buffer.length) + memcpy(p, iov[5].buffer.value, iov[5].buffer.length); p += iov[5].buffer.length; assert(p - ((unsigned char *)token.data) == token.length); @@ -411,10 +457,65 @@ if (conf_state2 != conf_state) errx(1, "conf state wrong for iov: %x", flags); + gss_release_iov_buffer(&min_stat, iov, iov_len); free(token.data); } +static void +wrapunwrap_aead(gss_ctx_id_t cctx, gss_ctx_id_t sctx, int flags, gss_OID mechoid) +{ + gss_buffer_desc token, assoc, message = GSS_C_EMPTY_BUFFER; + gss_buffer_desc output; + OM_uint32 min_stat, maj_stat; + gss_qop_t qop_state; + int conf_state, conf_state2; + char assoc_data[9] = "ABCheader"; + char token_data[16] = "0123456789abcdef"; + + if (flags & USE_SIGN_ONLY) { + assoc.value = assoc_data; + assoc.length = 9; + } else { + assoc.value = NULL; + assoc.length = 0; + } + + token.value = token_data; + token.length = 16; + + maj_stat = gss_wrap_aead(&min_stat, cctx, dce_style_flag || flags & USE_CONF, + GSS_C_QOP_DEFAULT, &assoc, &token, + &conf_state, &message); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_wrap_aead failed"); + + if ((flags & (USE_SIGN_ONLY|FORCE_IOV)) == 0) { + maj_stat = gss_unwrap(&min_stat, sctx, &message, + &output, &conf_state2, &qop_state); + + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_unwrap from gss_wrap_aead failed: %s", + gssapi_err(maj_stat, min_stat, mechoid)); + } else { + maj_stat = gss_unwrap_aead(&min_stat, sctx, &message, &assoc, + &output, &conf_state2, &qop_state); + if (maj_stat != GSS_S_COMPLETE) + errx(1, "gss_unwrap_aead failed: %x %s", flags, + gssapi_err(maj_stat, min_stat, mechoid)); + } + + if (output.length != token.length) + errx(1, "plaintext length wrong for aead"); + else if (memcmp(output.value, token.value, token.length) != 0) + errx(1, "plaintext wrong for aead"); + if (conf_state2 != conf_state) + errx(1, "conf state wrong for aead: %x", flags); + + gss_release_buffer(&min_stat, &message); + gss_release_buffer(&min_stat, &output); +} + static void getverifymic(gss_ctx_id_t cctx, gss_ctx_id_t sctx, gss_OID mechoid) { @@ -461,7 +562,8 @@ static struct getargs args[] = { {"name-type",0, arg_string, &type_string, "type of name", NULL }, - {"mech-type",0, arg_string, &mech_string, "type of mech", NULL }, + {"mech-type",0, arg_string, &mech_string, "mech type (name)", NULL }, + {"mech-types",0, arg_string, &mechs_string, "mech types (names)", NULL }, {"ret-mech-type",0, arg_string, &ret_mech_string, "type of return mech", NULL }, {"dns-canonicalize",0,arg_negative_flag, &dns_canon_flag, @@ -473,6 +575,7 @@ {"dce-style",0, arg_flag, &dce_style_flag, "dce-style", NULL }, {"wrapunwrap",0, arg_flag, &wrapunwrap_flag, "wrap/unwrap", NULL }, {"iov", 0, arg_flag, &iov_flag, "wrap/unwrap iov", NULL }, + {"aead", 0, arg_flag, &aead_flag, "wrap/unwrap aead", NULL }, {"getverifymic",0, arg_flag, &getverifymic_flag, "get and verify mic", NULL }, {"delegate",0, arg_flag, &deleg_flag, "delegate credential", NULL }, @@ -501,7 +604,7 @@ int main(int argc, char **argv) { - int optind = 0; + int optidx = 0; OM_uint32 min_stat, maj_stat; gss_ctx_id_t cctx, sctx; void *ctx; @@ -509,6 +612,9 @@ gss_cred_id_t client_cred = GSS_C_NO_CREDENTIAL, deleg_cred = GSS_C_NO_CREDENTIAL; gss_name_t cname = GSS_C_NO_NAME; gss_buffer_desc credential_data = GSS_C_EMPTY_BUFFER; + gss_OID_desc oids[4]; + gss_OID_set_desc mechoid_descs; + gss_OID_set mechoids = GSS_C_NO_OID_SET; setprogname(argv[0]); @@ -519,7 +625,7 @@ cctx = sctx = GSS_C_NO_CONTEXT; - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) @@ -530,8 +636,8 @@ exit(0); } - argc -= optind; - argv += optind; + argc -= optidx; + argv += optidx; if (argc != 1) usage(1); @@ -546,13 +652,44 @@ else if (strcmp(type_string, "krb5-principal-name") == 0) nameoid = GSS_KRB5_NT_PRINCIPAL_NAME; else - errx(1, "%s not suppported", type_string); + errx(1, "%s not supported", type_string); if (mech_string == NULL) mechoid = GSS_KRB5_MECHANISM; else mechoid = string_to_oid(mech_string); + if (mechs_string == NULL) { + /* + * We ought to be able to use the OID set of the one mechanism + * OID given. But there's some breakage that conspires to make + * that fail though it should succeed: + * + * - the NTLM gss_acquire_cred() refuses to work with + * desired_name == GSS_C_NO_NAME + * - gss_acquire_cred() with desired_mechs == GSS_C_NO_OID_SET + * does work here because we happen to have Kerberos + * credentials in check-ntlm, and the subsequent + * gss_init_sec_context() call finds no cred element for NTLM + * but plows on anyways, surprisingly enough, and then the + * NTLM gss_init_sec_context() just works. + * + * In summary, there's some breakage in gss_init_sec_context() + * and some breakage in NTLM that conspires against us here. + * + * We work around this in check-ntlm and check-spnego by adding + * --client-name=user1@${R} to the invocations of this test + * program that require it. + */ + oids[0] = *mechoid; + mechoid_descs.elements = &oids[0]; + mechoid_descs.count = 1; + mechoids = &mechoid_descs; + } else { + string_to_oids(&mechoids, &mechoid_descs, + oids, sizeof(oids)/sizeof(oids[0]), mechs_string); + } + if (gsskrb5_acceptor_identity) { maj_stat = gsskrb5_register_acceptor_identity(gsskrb5_acceptor_identity); if (maj_stat) @@ -582,19 +719,24 @@ cname, &credential_data, GSS_C_INDEFINITE, - GSS_C_NO_OID_SET, + mechoids, GSS_C_INITIATE, &client_cred, NULL, NULL); - if (GSS_ERROR(maj_stat)) + if (GSS_ERROR(maj_stat)) { + if (mechoids != GSS_C_NO_OID_SET && mechoids->count == 1) + mechoid = &mechoids->elements[0]; + else + mechoid = GSS_C_NO_OID; errx(1, "gss_acquire_cred_with_password: %s", - gssapi_err(maj_stat, min_stat, GSS_C_NO_OID)); + gssapi_err(maj_stat, min_stat, mechoid)); + } } else { maj_stat = gss_acquire_cred(&min_stat, cname, GSS_C_INDEFINITE, - GSS_C_NO_OID_SET, + mechoids, GSS_C_INITIATE, &client_cred, NULL, @@ -644,7 +786,7 @@ /* XXX should be actual_mech */ if (gss_oid_equal(mechoid, GSS_KRB5_MECHANISM)) { - time_t time; + time_t sc_time; gss_buffer_desc authz_data; gss_buffer_desc in, out1, out2; krb5_keyblock *keyblock, *keyblock2; @@ -685,15 +827,15 @@ maj_stat = gsskrb5_extract_authtime_from_sec_context(&min_stat, sctx, - &time); + &sc_time); if (maj_stat != GSS_S_COMPLETE) errx(1, "gsskrb5_extract_authtime_from_sec_context failed: %s", gssapi_err(maj_stat, min_stat, actual_mech)); - if (time > now) + if (sc_time > now) errx(1, "gsskrb5_extract_authtime_from_sec_context failed: " "time authtime is before now: %ld %ld", - (long)time, (long)now); + (long)sc_time, (long)now); maj_stat = gsskrb5_extract_service_keyblock(&min_stat, sctx, @@ -801,7 +943,7 @@ if (out1.length != out2.length) errx(1, "prf len mismatch"); - if (memcmp(out1.value, out2.value, out1.length) != 0) + if (out1.length && memcmp(out1.value, out2.value, out1.length) != 0) errx(1, "prf data mismatch"); gss_release_buffer(&min_stat, &out1); @@ -811,7 +953,7 @@ if (out1.length != out2.length) errx(1, "prf len mismatch"); - if (memcmp(out1.value, out2.value, out1.length) != 0) + if (out1.length && memcmp(out1.value, out2.value, out1.length) != 0) errx(1, "prf data mismatch"); gss_release_buffer(&min_stat, &out1); @@ -880,6 +1022,29 @@ wrapunwrap_iov(cctx, sctx, USE_CONF|USE_HEADER_ONLY|FORCE_IOV, actual_mech); } + if (aead_flag) { + wrapunwrap_aead(cctx, sctx, 0, actual_mech); + wrapunwrap_aead(cctx, sctx, USE_CONF, actual_mech); + + wrapunwrap_aead(cctx, sctx, FORCE_IOV, actual_mech); + wrapunwrap_aead(cctx, sctx, USE_CONF|FORCE_IOV, actual_mech); + + wrapunwrap_aead(cctx, sctx, USE_SIGN_ONLY|FORCE_IOV, actual_mech); + wrapunwrap_aead(cctx, sctx, USE_CONF|USE_SIGN_ONLY|FORCE_IOV, actual_mech); + + wrapunwrap_aead(cctx, sctx, 0, actual_mech); + wrapunwrap_aead(cctx, sctx, FORCE_IOV, actual_mech); + + wrapunwrap_aead(cctx, sctx, USE_CONF, actual_mech); + wrapunwrap_aead(cctx, sctx, USE_CONF|FORCE_IOV, actual_mech); + + wrapunwrap_aead(cctx, sctx, USE_SIGN_ONLY, actual_mech); + wrapunwrap_aead(cctx, sctx, USE_SIGN_ONLY|FORCE_IOV, actual_mech); + + wrapunwrap_aead(cctx, sctx, USE_CONF|USE_SIGN_ONLY, actual_mech); + wrapunwrap_aead(cctx, sctx, USE_CONF|USE_SIGN_ONLY|FORCE_IOV, actual_mech); + } + if (getverifymic_flag) { getverifymic(cctx, sctx, actual_mech); getverifymic(cctx, sctx, actual_mech); @@ -905,6 +1070,13 @@ gss_release_cred(&min_stat, &cred2); +#if 0 + /* + * XXX We can't do this. Delegated credentials only work with + * the actual_mech. We could gss_store_cred the delegated + * credentials *then* gss_add/acquire_cred() with SPNEGO, then + * we could try loop() with those credentials. + */ /* try again using SPNEGO */ if (verbose_flag) printf("checking spnego on delegated cred\n"); @@ -915,6 +1087,7 @@ gss_delete_sec_context(&min_stat, &sctx, NULL); gss_release_cred(&min_stat, &cred2); +#endif /* check export/import */ if (ei_flag) { @@ -943,6 +1116,8 @@ gss_delete_sec_context(&min_stat, &cctx, NULL); gss_delete_sec_context(&min_stat, &sctx, NULL); +#if 0 + /* XXX See above */ /* try again using SPNEGO */ if (verbose_flag) printf("checking SPNEGO on export/imported cred\n"); @@ -953,6 +1128,7 @@ gss_delete_sec_context(&min_stat, &cctx, NULL); gss_delete_sec_context(&min_stat, &sctx, NULL); +#endif gss_release_cred(&min_stat, &cred2); diff --git a/crypto/heimdal/lib/gssapi/test_cred.c b/crypto/heimdal/lib/gssapi/test_cred.c --- a/crypto/heimdal/lib/gssapi/test_cred.c +++ b/crypto/heimdal/lib/gssapi/test_cred.c @@ -154,6 +154,8 @@ NULL, NULL, NULL); + if (maj_stat != GSS_S_COMPLETE) + gss_err(1, min_stat, "add_cred 2 %d != GSS_S_COMPLETE", (int)maj_stat); maj_stat = gss_release_cred(&min_stat, &cred2); if (maj_stat != GSS_S_COMPLETE) @@ -161,7 +163,7 @@ maj_stat = gss_release_cred(&min_stat, &cred3); if (maj_stat != GSS_S_COMPLETE) - gss_err(1, min_stat, "release 2 %d != GSS_S_COMPLETE", (int)maj_stat); + gss_err(1, min_stat, "release 3 %d != GSS_S_COMPLETE", (int)maj_stat); } static int version_flag = 0; diff --git a/crypto/heimdal/lib/gssapi/test_ntlm.c b/crypto/heimdal/lib/gssapi/test_ntlm.c --- a/crypto/heimdal/lib/gssapi/test_ntlm.c +++ b/crypto/heimdal/lib/gssapi/test_ntlm.c @@ -131,7 +131,7 @@ free(key.data); } - ret = heim_ntlm_encode_type3(&type3, &data); + ret = heim_ntlm_encode_type3(&type3, &data, NULL); if (ret) errx(1, "heim_ntlm_encode_type3"); @@ -260,7 +260,7 @@ } } - ret = heim_ntlm_encode_type3(&type3, &data); + ret = heim_ntlm_encode_type3(&type3, &data, NULL); if (ret) errx(1, "heim_ntlm_encode_type3"); @@ -309,11 +309,11 @@ int main(int argc, char **argv) { - int ret = 0, optind = 0; + int ret = 0, optidx = 0; setprogname(argv[0]); - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) @@ -324,8 +324,8 @@ exit(0); } - argc -= optind; - argv += optind; + argc -= optidx; + argv += optidx; ret += test_libntlm_v1(0); ret += test_libntlm_v1(NTLM_NEG_KEYEX); @@ -333,5 +333,5 @@ ret += test_libntlm_v2(0); ret += test_libntlm_v2(NTLM_NEG_KEYEX); - return 0; + return ret; } diff --git a/crypto/heimdal/lib/gssapi/version-script.map b/crypto/heimdal/lib/gssapi/version-script.map --- a/crypto/heimdal/lib/gssapi/version-script.map +++ b/crypto/heimdal/lib/gssapi/version-script.map @@ -65,6 +65,7 @@ gss_krb5_get_tkt_flags; gss_krb5_import_cred; gss_krb5_set_allowable_enctypes; + gss_localname; gss_mg_collect_error; gss_oid_equal; gss_oid_to_str; @@ -87,11 +88,13 @@ gss_test_oid_set_member; gss_unseal; gss_unwrap; + gss_unwrap_aead; gss_unwrap_iov; gss_userok; gss_verify; gss_verify_mic; gss_wrap; + gss_wrap_aead; gss_wrap_iov; gss_wrap_iov_length; gss_wrap_size_limit; diff --git a/crypto/heimdal/lib/hcrypto/ChangeLog b/crypto/heimdal/lib/hcrypto/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/ChangeLog @@ -0,0 +1,1227 @@ +2008-06-26 Love Hörnquist Åstrand + + * ui.c: Send newline from use to stderr, just like the + prompt. From Ted Percival. + +2008-05-20 Love Hörnquist Åstrand + + * rand-fortuna.c: If we forked, force a reseed again. Add the pid + as part of the reseed(). + +2008-04-29 Björn Sandell + + * des.h: Add DES_set_key_unchecked + + * version-script.map: Export DES_set_key_unchecked + +2008-04-29 Love Hörnquist Åstrand + + * evp.c: EVP_MD_CTX_init already implemented. + +2008-04-28 Love Hörnquist Åstrand + + * evp.[ch]: deprecate functions that are needed for exported + EVP_MD_CTX. + + * evp.h: Internalize hc_EVP_MD_CTX. + + * evp.c: Internalize hc_EVP_MD_CTX. + + * mdtest.c: Use EVP_MD_CTX_create()/EVP_MD_CTX_destroy(). + + * test_cipher.c: unbreak des-test + + * evp.c: Fixup key parity before going ahead and using the key. + + * evp.c: use DES_set_key_unchecked(). + + * des.c: Remove inifinite loop in DES_set_key(). + +2008-04-27 Love Hörnquist Åstrand + + * des.c: Document missing functions, add DES_check_key_parity(). + + * des.h: Add DES_check_key_parity, deprecate DES_set_key. + + * version-script.map: Export DES_check_key_parity. + + * des.h: DES_set_odd_parity "returns" void. + + * rand.c: Drop const warnings. + + * des.h: Sort options. + +2008-04-18 Love Hörnquist Åstrand + + * pkcs5.c: Document PKCS5_PBKDF2_HMAC_SHA1. + + * des.c: DES is withdrawn. + + * des.c: Document using doxygen. + + * des.c: History of DES. + + * doxygen.c: History of hcrypto. + + * test_rand.c: do a head vs tail test on the random buffer. + + * test_crypto.in: Use --file to test_rand. + + * rand.c: Document, implement RAND_set_rand_engine(). + + * doxygen.c: Add reference to DES, more quick links. + + * rnd_keys.c: Reimplement using RAND_ interface. + + * des.h: Undeprecate DES_new_random_key. + + * des.c: Add documentation. + +2008-04-15 Love Hörnquist Åstrand + + * camellia-ntt.h: Move the typedef u to camellia-ntt.h header + file. Use u32 to define KEY_TABLE_TYPE, avoids warning on + platfors where u32 is not unsigned int. + + * camellia-ntt.c: Move the typedef u to camellia-ntt.h + header file. + + * camellia.h: Drop need to camellia-ntt.h by including some more + defines. + +2008-04-11 Love Hörnquist Åstrand + + * rnd_keys.c: deprecated. + + * des.h: c++ wrappers + deprecated. + + * aes.h: c++ wrappers + + * des.h: c++ wrappers + deprecated + + * rnd_keys.c: Use matching prototypes, prompted by bug report by + David Rosenstrauch. + +2008-03-19 Love Hörnquist Åstrand + + * camellia.h: Drop unused defined that originates from aes. + +2008-01-11 Love Hörnquist Åstrand + + * Makefile.am: Add extra files missing from dist. + +2007-12-30 Love Hörnquist Åstrand + + * rsa.c: ENGINE_get_default_RSA can return NULL. + + * dh.c: more doxygen. + +2007-12-28 Love Hörnquist Åstrand + + * evp.c: Add last of the doxygen documentation for functions in + this module. + + * evp.c: complete the EVP_MD functions doxygen. + +2007-12-11 Love Hörnquist Åstrand + + * version-script.map: export RSA_gmp_method. + + * doxygen.c: More documentation. + + * rsa.h: add RSA_gmp_method + + * rsa-gmp.c: RSA implementation written using GMP. + + * test_dh.c: Test of DH by Matthias Koenig. + +2007-12-09 Love Hörnquist Åstrand + + * bn.h (BN_is_negative): make argument const. + +2007-12-07 Love Hörnquist Åstrand + + * rand.c: Can't call getpwuid(getuid()) at all since that causes + recursive lookups. Pointed out by Hai Zaar. + +2007-08-16 Love Hörnquist Åstrand + + * test_cipher.c: Use test from camellia samples. + + * version-script.map: Export camellia. + + * test_cipher.c: Make camellia-128-cbc tests pass. + +2007-08-07 Love Hörnquist Åstrand + + * test_cipher.c: Sprinkle EVP cipher names. + +2007-07-30 David Love + + * camellia-ntt.c: Include + +2007-07-24 Love Hörnquist Åstrand + + * Add Camellia. + +2007-07-10 Love Hörnquist Åstrand + + * Makefile.am: New library version. + +2007-06-30 Love Hörnquist Åstrand + + * hmac.c (HMAC_Init_ex): also zero out key material on re-init. + +2007-06-20 Love Hörnquist Åstrand + + * rand.c: Default to fortuna due to weired /dev/*random that + failes to deliver random data for us in hi load situations. + + * rand-fortuna.c: Reseed the random generator now and then from + external sources. + +2007-06-19 Love Hörnquist Åstrand + + * rand-egd.c: Avoid stoping unrelated memory. + +2007-06-18 Love Hörnquist Åstrand + + * rand-fortuna.c: Use /etc/shadow, not /dev/shadow, pointed out by + Andrew Bartlett + + * Makefile.am: add rand-timer.c + + * rand-fortuna.c: Fall back to gattering data from timer and + secret files, this is really the last resort. + + * rand-timer.c: Pick up timing diffrences in the timeing info from + realtime timer, only in use as a last resort. + + * version-script.map: Add hc_RAND_timer_method. + +2007-06-10 Love Hörnquist Åstrand + + * test_bn.c: Add . + + * test_crypto.in: Test for random device before running the tests. + + * test_engine_dso.c: Test for random device. + + * test_bn.c (test_BN_rand): skip this test if there is no random + device + +2007-06-07 Love Hörnquist Åstrand + + * Makefile.am: Include more ui.[ch] in libbctest. + + * version-script.map: Unexport _hc_DES_ipfp_test now there is a + separate test lib. + + * Makefile.am: Build library libhctest.la for testing and link + with that when testing. + + * version-script.map: export _hc_DES_ipfp_test + +2007-06-03 Love Hörnquist Åstrand + + * imath: new update from Michael Fromberger + + * test_imath.c: Try to find ABR in mp_int_mul. + + * engine.c: Don't try to load gmp module. + +2007-06-02 Love Hörnquist Åstrand + + * test_bn.c: Plug memory leak. + +2007-05-31 Love Hörnquist Åstrand + + * imath/imath.[ch]: New snapshot for Michael Fromberger, lets see if + this corrupts memory less. + +2007-05-30 Love Hörnquist Åstrand + + * version-script.map: Don't prefix all symbols with _ + +2007-05-10 Love Hörnquist Åstrand + + * test_pkcs12.c: test the difference between "" and NULL password. + + * test_pkcs12.c: one more pkcs12-pbe-s2k check + +2007-04-20 Love Hörnquist Åstrand + + * Add version-script + + * test_crypto.in: try generate a couple of rsa keys of + diffrent (random) sizes, spelling. + + * test_rsa.c: try generate a couple of rsa keys of + diffrent (random) sizes. + +2007-04-19 Love Hörnquist Åstrand + + * mdtest.c: stop leaking memory + + * test_imath.c: fix warnings, make test into function. + + * test_imath.c: shortest program causing the problem. + + * test_imath.c: basic imath test + +2007-04-18 Love Hörnquist Åstrand + + * test_cipher.c (test_cipher): avoid leaking memory + +2007-04-17 Love Hörnquist Åstrand + + * rsa.c: plug memory leak + +2007-04-16 Love Hörnquist Åstrand + + * Makefile.am: CLEANFILES += test.file + +2007-04-15 Love Hörnquist Åstrand + + * Makefile.am: Add randi.h. + +2007-04-11 Love Hörnquist Åstrand + + * rsa.c: spelling. + +2007-02-01 Love Hörnquist Åstrand + + * rand.c: Name the random file ~/.rnd, this is the same as + OpenSSL. + +2007-01-31 Love Hörnquist Åstrand + + * rand-egd.c: Make get_bytes static. + + * rand.c (RAND_write_file): default to failure. + +2007-01-30 Love Hörnquist Åstrand + + * rand.c: Implement RAND_file_name. + + * test_rand.c: test RAND_file_name(). + + * rand.c: Provide dummy implementation of RAND_file_name. + + * rand.h: add RAND_file_name + +2007-01-21 Love Hörnquist Åstrand + + * Makefile.am: clean more files + + * rand-egd.c: access private functions though the RAND_METHOD + switch, move global egd function to rand-egd.c + + * rand-fortuna.c: access private functions though the RAND_METHOD + switch + + * rand-unix.c: unexport private functions. + + * randi.h: Unexport internal functions. + + * rand.c: access private functions though the RAND_METHOD switch, + don't truncate the seed-file, move global egd function to + rand-egd.c + + * test_crypto.in: add basic random tests + + * rand-egd.c: SGI cc doesn' like return void_returning_function(); + in a void returning function. + +2007-01-20 Love Hörnquist Åstrand + + * test_rand.c: Allow select rand method. + + * rand-unix.c: expose _hc_rand_unix_status + + * randi.h: expose _hc_rand_unix_status and the internal + RAND_METHODs + + * rand.c: Implement RAND_load_file and RAND_write_file. Select + UNIX random device if available, otherwise use Fortuna. + + * Add EGD/PRNGD support + +2007-01-17 Love Hörnquist Åstrand + + * fortuna: Add fortuna based on Marko Kreen's pgcrypt, no enabled yet + +2007-01-11 Love Hörnquist Åstrand + + * test_rsa.c: if RAND is unhappy, don't run the tests. + + * test_engine_dso.c: if RAND is unhappy, don't run the tests. + + * imath/imath.c: Update to imath-1.8 from Michael Fromberger + + Fixed a bug in s_udiv() affecting the computation of quotient + digits. Thanks to Love Åstrand for isolating this bug. Also in + this release, defining USELLONG=Y or USELLONG=N on the command + line for make will switch support for the "long long" data type on + or off without having to edit the Makefile. The default is still + to permit use of "long long", even though the type is not standard + ANSI C90. + + * imath/imath.c (s_udiv): Allocate one more for q, remove debug + printfs + +2007-01-10 Love Hörnquist Åstrand + + * imath/imath.c (s_udiv): make a copy of a and b before we start + to make sure there is something un-tainted to print in cause of + failure. XXX remove this delta + (s_embar): make static + +2007-01-09 Love Hörnquist Åstrand + + * rsa.c: Correct the test if the rsa is a complete RSA private + key. + +2007-01-08 Love Hörnquist Åstrand + + * imath/imath.c: More verbose debugging in case of assertion + failure. XXX temporary for AIX problem. + +2007-01-06 Love Hörnquist Åstrand + + * rsa-imath.c: Fix a silly typo, and with that enable CRT since + now it works. + + * rsa-imath.c: With this crt works, but something is wrong in the + key generation, so keep it turned off for now. + + * test_rsa.c: Allow testing effect of key-blinding + + * test_rsa.c: Add timing info to rsa keygen. + + * rsa-imath.c: don't include + +2007-01-05 Love Hörnquist Åstrand + + * imath: prune off stuff we dont use + + * imath/import.sh: Prune off stuff we don't use from imathsource + + * Makefile.am: Prune off stuff we don't use from imathsource + + * rsa-imath.c: Use mp_int_exptmod directly. + + * imath/iprime.c: Use a larger table of small primes, cut down + genenration in best cases to half compared to using a small table. + + * rsa.h: add RSA_FLAG_NO_BLINDING + + * rsa-imath.c: Add keyblinding, add a commented out CRT based RSA. + + * rsa.c: Add iqmp. + +2007-01-04 Love Hörnquist Åstrand + + * rsa.c: add missing ; + + * rsa.c: Add i2d_RSAPrivateKey. + + * rsa.h: Add i2d_RSAPrivateKey. + + * test_rsa.c: test RSA_generate_key_ex + + * rsa-imath.c: Add imath_rsa_generate_key. + +2006-12-31 Love Hörnquist Åstrand + + * rsa.c: add RSA_generate_key_ex + + * rsa.h: add RSA_generate_key_ex + +2006-12-07 Love Hörnquist Åstrand + + * Makefile.am: CLEANFILES += test_crypto + +2006-12-06 Love Hörnquist Åstrand + + * Makefile.am: Add rsakey.der to EXTRA_DIST. + +2006-12-05 Love Hörnquist Åstrand + + * Makefile.am: Add test_crypto.in to EXTRA_DIST. + + * test_crypto.in: Add more spaces to allow sh to parse this + + * test_rsa.c: Explain what the fixed "sha1" checksum test tries to + test. + + * test_crypto.in: test rsa, dh and engine code + +2006-12-04 Love Hörnquist Åstrand + + * Makefile.am: rsa and crypto engine test cases + + * test_rsa.c: Make faster and less verbose + + * rsakey.der: test rsa key + + * test_rsa.c: Test rsa operations + + * rsa-imath.c: Fix the rsa-decrypt failed case that been hauting + me for a while. + +2006-12-02 Love Hörnquist Åstrand + + * rsa-imath.c: Use mp_int_to_binary to encode bignums + + * rsa-imath.c: Check if header is there + +2006-11-27 Love Hörnquist Åstrand + + * rsa-imath.c: Return -1 for failure. + + * rsa-imath.c: Its ok with smaller signatures. + + * rsa-imath.c: Split error codes for now + +2006-10-22 Love Hörnquist Åstrand + + * rsa.c: Try to not leak memory. + +2006-10-21 Love Hörnquist Åstrand + + * rand-unix.c (unix_bytes): read until the other side give us all + or fail. + + * imath: import imath-1.7, fixes buffer overrun problems + + * rsa.c (RSA_free): free the whole key + + * test_engine_dso.c: Add more dh tests. + +2006-10-20 Love Hörnquist Åstrand + + * imath/imath.c: Allocate more bits. + + * dh-imath.c (dh_compute_key): fix signness test + + * dh-imath.c: Try harder to generate a good keypair. + + * dh-imath.c: Return -1 dh_compute_key on failure, pointed out by + Olga Kornievskaia. + +2006-10-19 Love Hörnquist Åstrand + + * Makefile.am: Add hash.h and des-tables.h. + + * dh.c (DH_compute_key): return -1 on bad public key. + + * rsa.c: remove stray ; + + * engine.c: Does function typecasts instead of void * type-casts. + + * evp.c: Does function typecasts instead of void * type-casts. + +2006-10-16 Love Hörnquist Åstrand + + * Makefile.am: add rand-unix.c + + * rand.c: Move out rand-unix functions from the core lib. + + * rand-unix.c: Move out rand-unix functions from the core lib. + +2006-10-15 Love Hörnquist Åstrand + + * hmac.c (HMAC_CTX_cleanup): destroy the EVP_MD_CTX, so it will be + freed. + +2006-10-14 Love Hörnquist Åstrand + + * bn.c: Drop heim_any.h, prefix der primitives with der_ + + * rsa.c: Drop heim_any.h. + +2006-10-11 Love Hörnquist Åstrand + + * rsa.c (RSA_free): Call the meth->finish before releasing the + engine. + +2006-10-06 Love Hörnquist Åstrand + + * imath/imath.c: Cast argument to ctype(3) functions to (unsigned + char). + + * imath/imrat.c: Cast argument to ctype(3) functions to (unsigned + char). + +2006-09-22 Love Hörnquist Åstrand + + * ui.c (read_string): Try to not call signaction for signal 0 and + use NSIG if it exists to determin how many signals there exists, + also, only restore those signalhandlers that we got out. + + Bug reported by and patch tested by Harald Barth. + +2006-09-15 Love Hörnquist Åstrand + + * rsa-imath.c: Add commeted out test that exponent is > 3 + +2006-05-13 Love Hörnquist Åstrand + + * bn.c (BN_rand): avoid shadowing. + +2006-05-12 Love Hörnquist Åstrand + + * rsa-imath.c: Fix the last one of the asserts. + +2006-05-08 Love Hörnquist Åstrand + + * rand.c (get_device_fd): use /dev/urandom first. + + * rctest.c: Less "pointer targets in passing argument differ in + signedness" warnings. + + * rc2test.c: Less "pointer targets in passing argument differ in + signedness" warnings. + +2006-05-07 Love Hörnquist Åstrand + + * rsa-imath.c: Fix a off by one. + + * test_engine_dso.c: print the lengths when they don't match. + + * engine.c (ENGINE_load_builtin_engines): use RSA_imath_method for + the building engine. + + * rsa.h: expose RSA_imath_method + + * rsa.c (RSA_check_key): Do sign/verify instead. + + * dsa.c: rename the DSA_METHOD + + * dh.c: rename the DH_METHOD + + * dh-imath.c: rename the DH_METHOD + + * rsa.c: Default to use rsa-imath. + + * Makefile.am: Add rsa-imath.c to libhcrypto + + * rsa-imath.c: Add RSA support using imath. + +2006-05-06 Love Hörnquist Åstrand + + * imath: Add imath-1.1.9 + + * dh.h: Expose DH_imath_method. + + * Makefile.am: Add imath source, add test_engine_dso to TESTS. + + * engine.c: Lets say we have RSA_null_method(), not really + useable, but still. + + * test_engine_dso.c: If there are no arguments, use the internal + engine. + + * engine.h: Cpp rename some ENGINE symbols. + + * engine.c (ENGINE_load_builtin_engines): Load the internal + engine. + + * dh.c: Default to use DH-imath. + + * dh.c (DH_check_pubkey): describe what the function do + +2006-05-05 Love Hörnquist Åstrand + + * dh.c (DH_compute_key): check return status value from + DH_check_pubkey + + * Rename u_intXX_t to uintXX_t + +2006-04-24 Love Hörnquist Åstrand + + * pkcs5.c: include + + * evp.c: Sprinkel some assertions. + + * des.c: Move assertion and add another restriction, used as hint + to beam that its ok + +2006-04-23 Love Hörnquist Åstrand + + * rsa.c (RSA_check_key): don't do any checking if there is no + private key + + * engine.c (add_engine): reassign engines variable after realloc + +2006-04-21 Love Hörnquist Åstrand + + * evp.h: Add EVP_get_cipherbyname, unbreak EVP_BytesToKey + + * evp.h: Add prototype for EVP_BytesToKey + + * evp.c: Add stub for EVP_BytesToKey + +2006-04-20 Love Hörnquist Åstrand + + * dh.h: Add cpp-rename for DH_check_pubkey + +2006-04-17 Love Hörnquist Åstrand + + * rand.h: Add more RAND functions. + + * rand.c: Split out unix /dev/random to a RAND_METHOD + + * engine.h: add RAND support + + * engine.c: add RAND support + + * evp.h: s/rc4_64/rc2_64/ + + * rand.c: Add RAND_METHOD and some associated functions. + + * rand.h: Add RAND_METHOD and some associated functions. + + * test_bn.c: Test BN_rand + +2006-04-16 Love Hörnquist Åstrand + + * engine.c (ENGINE_by_dso): less printf + + * rsa.h (i2d_RSAPublicKey): fix prototype + + * rsa.c (i2d_RSAPublicKey): fix prototype + +2006-04-15 Love Hörnquist Åstrand + + * evp.h: Add EVP_rc2_64_cbc + + * evp.c: Add EVP_rc2_64_cbc + + * evp.h: Add SHA-256 symbols. + + * evp.c: Add SHA-256. + + * sha.h: Add SHA-256 symbols. + + * mdtest.c: Test SHA-256. + + * sha256.c: Inital (naive) SHA-256 implementation. + +2006-04-14 Love Hörnquist Åstrand + + * des.c (DES_cfb64_encrypt): add asserts that the *num pointers is + >= 0, because if it is, its a programmer error. + +2006-04-09 Love Hörnquist Åstrand + + * rc2.c (RC2_set_key): abort on erroneous input (len <= 0) size + that will case out out bound indexing, and its invalid input. + + * rsa.c: Make compile again. + +2006-04-03 Love Hörnquist Åstrand + + * rsa.c: Implement i2d_RSAPublicKey + + * rsa.h: Add i2d_RSAPublicKey + +2006-03-07 Love Hörnquist Åstrand + + * Makefile.am: EVP interface depends on dlopen, add it to LIBFLAGS + +2006-02-28 Love Hörnquist Åstrand + + * Makefile.am: Add pkcs5 files. + + * test_pkcs5.c: Testcases for pkcs5 pbe2. + + * pkcs5.c (PKCS5_PBKDF2_HMAC_SHA1): new function. + + * hmac.c: Digest key when it exceeds block size, not when it + exceeds the size of the output block. + +2006-02-16 Love Hörnquist Åstrand + + * rand.c (RAND_bytes): Don't abort() on failure, return error. + + * bn.c (BN_rand): check return value from RAND_bytes + +2006-01-18 Love Hörnquist Åstrand + + * dh.c (DH_compute_key): check public key + + * dh.h: Add DH_check_pubkey and defines it uses. + + * dh.c (DH_check_pubkey): New function. + + * bn.c: Remove unused fragment. + + * test_bn.c: Compare numbers with BN_cmp(). + +2006-01-17 David Love + + * bn.c: Include . + +2006-01-13 Love Hörnquist Åstrand + + * *.h: use #include + + * Makefile.am: provide a symlink so the directory hcrypto/ seems + to exists + + * engine.h: Expose dsa symbols + + * Makefile.am: Rename library to hcrypto and install headerfiles + in hcrypto/. + + * test_pkcs12.c: Test for PKCS12_key_gen. + + * hmac.h: Drop HMAC_CTX_create and HMAC_CTX_destroy. + + * engine.c (ENGINE_add_conf_module): Also load DH + + * dh.h: Reorder includes to avoid compile errors, provide + DH_new_method(). + + * dh.c: Indent. + + * bn.c: BN_get_negative was really named BN_is_negative, a comment + confused me. + + * bn.h: BN_get_negative was really named BN_is_negative, a comment + confused me. + + * pkcs12.h: Add PKCS12_key_gen(). + + * pkcs12.c: Add PKCS12_key_gen(). + + * Makefile.am: Add test_cipher, test_pkcs12, add pkcs12.[ch]. + + * evp.c: Rename rc2_40_cbc internal variable to something better. + Unbreak des-ede3-cbc. + +2006-01-11 Love Hörnquist Åstrand + + * test_bn.c: Test BN_uadd. + + * bn.c (BN_rand): don't leak memory on failure, catch malloc(0) + case + + * bn.c (BN_rand): clear the bits above the bits that user + requested. + (BN_uadd): new function. + + * bn.h (BN_uadd): new function. + +2006-01-10 Love Hörnquist Åstrand + + * evp.c (EVP_CIPHER_CTX_cleanup): clean up less aggressively + + * Makefile.am (check_PROGRAMS): add test_hmac + + * test_hmac.c: Simple regression test for HMAC. + + * hmac.c: Make hmac work. + + * evp.c: return the right blocksize for digests. + +2006-01-09 Love Hörnquist Åstrand + + * test_engine_dso.c: Add test for DH. + + * dh.c: Add DH_new_method, add ENGINE refcounting. + + * engine.[ch]: Add ENGINE_set_default_DH and ENGINE_get_default_DH + + * test_engine_dso.c: Add test for RSA encryption. + +2006-01-08 Love Hörnquist Åstrand + + * test_engine_dso.c: Add test for RSA. + + * implement enough glue to support OpenSSLs EVP, RSA, DSA, DH, + HMAC, RAND and ENGINE interfaces for use in hx509. rename all + symbols to start with hc_ to avoid clobbering namespaces. contains + no RSA/DH/DSA code, just glue to support using dynamic + ENGINE. hx509 supports this via pkcs11 and there is a gmp ENGINE + module supporting RSA. Also contains a MD2 digest for completion. + +2005-07-20 Love Hörnquist Åstrand + + * des.c,des.h,rnd_keys.c: change unsigned char * to void * + +2005-06-30 Love Hörnquist Åstrand + + * rnd_keys.c: const poision for unwriteable strings + +2005-06-19 Love Hörnquist Åstrand + + * des.c,aes.c,rc2.c: Rename parameter, as encrypt shadows a + global, from Andrew Bartlett + +2005-06-02 Love Hörnquist Åstrand + + * rnd_keys.c: Include for srandom/random. + +2005-05-29 Love Hörnquist Åstrand + + * des.c (DES_cbc_cksum): init u to make sure it have a value in + case of the empty in data + + * destest.c: add test for the empty password "" + +2005-05-27 Love Hörnquist Åstrand + + * rctest.c (cipher3): used unsigned char to avoid problems with + platforms using "signed char" + +2005-05-13 Love Hörnquist Åstrand + + * rc2.c: use unsigned char to avoid signess warning + + * des.c: use unsigned char to avoid signess warning + + * aes.c (AES_cbc_encrypt): use unsigned char to avoid signess + warning + +2005-05-03 Dave Love + + * mdtest.c: Fix typo for HAVE_STDLIB_H. + +2005-05-03 Love Hörnquist Åstrand + + * rnd_keys.c: Enabled to build on cygwin, based on patch from + David Love + +2005-05-02 Dave Love + + * mdtest.c: Include . + +2005-04-30 Love Hörnquist Åstrand + + * ui.c: Include . + (UI_UTIL_read_pw_string): make the prompt argument const. + + * des.h (UI_UTIL_read_pw_string): make the prompt argument const + + * ui.c (UI_UTIL_read_pw_string): remove unused variable plen + + * des.c: replace with + +2005-04-29 Dave Love + + * Makefile.am: Add LIB_roken. + +2005-04-27 Dave Love + + * sha.c: Include hash.h first. + + * md4.c: Include hash.h first. + + * md5.c: Include hash.h first. + + * hash.h: Include krb5-types.h + +2005-04-26 Dave Love + + * mdtest.c: Maybe include stdlib.h + +2005-04-10 Love Hörnquist Åstrand + + * sha.h,md5.h, md4.h: don't include bit types, the user must do + that #ifdef wrap + + * aes.h: #ifdef wrap + +2005-03-23 Love Hörnquist Åstrand + + * des.h: fix prototype for DES_random_key + + * rnd_keys.c: fix prototype for DES_random_key + + * des.[ch]: provide compatibility function DES_key_sched, same as + DES_set_key + +2005-03-20 Love Hörnquist Åstrand + + * destest.c: include config.h and protect some headers + + * rnd_keys.c: move to after include so the + C99 integer types exists + +2005-03-14 Love Hörnquist Åstrand + + * des.c: add DES_set_key_checked + + * des.h: add DES_set_key_checked + +2005-03-01 Love Hörnquist Åstrand + + * des-tables.h: Add the missing file + +2005-02-23 Love Hörnquist Åstrand + + * ui.c: remove dependency on asprintf + + * Makefile.am: make destest only once + + * Replace the eay DES code with key scheule setup code by me and DES + s-box and p permutation from Richard Outerbridge implemtation (in + public domain). The DES modes are implemented by me. ui.c code are + from appl/login. + + The implementation is about 3 times slower then Eric for encryption, + and about the same speed for key setup. + + +2004-08-10 Love Hörnquist Åstrand + + * rnd_keys.c (DES_rand_data): also try /dev/arandom + +2004-06-02 Love Hörnquist Åstrand + + * rnd_keys.c: don't include krb4 headers + + * rijndael-alg-fst.c: don't include krb4 headers + + * aes.c: don't include krb4 headers + + * aes.h: define AES_{EN,DE}CRYPT; remove #ifdefs, this is an + installed file + +2004-04-25 Love Hörnquist Åstrand + + * rc2.c: handle non blocksized cbc messages + + * aes.[ch]: add AES_cbc_encrypt + +2004-04-24 Love Hörnquist Åstrand + + * rc2test.c: test vectors from RFC2268 + + * rc2.c (RC2_set_key): rewrite the mask calculation + + * rc2.c (RC2_set_key): handle keys where effective bits are + diffrent from keylength + +2004-04-23 Love Hörnquist Åstrand + + * rc2.c: rc2 implementation + + * rc2.h: rc2 implementation + + * rc2test.c: rc2 implementation + + * Makefile.am: rc2 implementation + +2004-03-25 Love Hörnquist Åstrand + + * Makefile.am: new arcfour implementation + + * rc4.c: implemented from description in + draft-kaukonen-cipher-arcfour-03.txt + + * rc4.h: replace with new implementation + + * rc4_enc.c rc4_skey.c: remove + + * rctest.c: test for arcfour + +2003-12-07 Love Hörnquist Åstrand + + * rnd_keys.c: uninitialized variable, from Panasas Inc + +2003-09-03 Love Hörnquist Åstrand + + * md4.c (MD4_Final): make the function threadsafe by removing + static on the local variable zeros + + * md5.c (MD5_Final): make the function threadsafe by removing + static on the local variable zeros + + * switch to the DES_ api, dont provide any compat glue + +2003-08-27 Love Hörnquist Åstrand + + * sha.c: make the function threadsafe by removing static on the + local variable zeros + +2003-07-23 Love Hörnquist Åstrand + + * rijndael-alg-fst.h,rijndael-alg-fst.c,aes.c,aes.h: + Makefile.am: add AES support + +2003-03-19 Love Hörnquist Åstrand + + * des.1: sunOS -> SunOS, from jmc + +2003-03-19 Love Hörnquist Åstrand + + * des.1: spelling, from + +2002-08-28 Johan Danielsson + + * read_pwd.c: move NeXT SGTTY stuff here + +2001-05-17 Assar Westerlund + + * Makefile.am: bump version to 3:1:0 + +2001-05-11 Assar Westerlund + + * str2key.c (des_string_to_key, des_string_to_2keys): avoid weak + keys + +2001-02-16 Assar Westerlund + + * set_key.c: correct weak keys and update comment + +2001-02-14 Assar Westerlund + + * set_key.c: correct the two last weak keys in accordance with + FIPS 74. noted by + +2001-01-30 Assar Westerlund + + * Makefile.am (libdes_la_LDFLAGS): bump version to 3:0:0 + +2000-10-19 Assar Westerlund + + * Makefile.in (LIBSRC, LIBOBJ): add rc4* and enc_{read,write} + files so that this library contains the same things as libdes in + Heimdal + +2000-08-16 Assar Westerlund + + * Makefile.am: bump version to 2:1:0 + +2000-08-03 Johan Danielsson + + * enc_writ.c: BSIZE -> des_BSIZE to avoid conflicts with AIX + jfs/fsparam.h + + * enc_read.c: BSIZE -> des_BSIZE to avoid conflicts with AIX + jfs/fsparam.h + + * des_locl.h: BSIZE -> des_BSIZE to avoid conflicts with AIX + jfs/fsparam.h + +2000-02-07 Assar Westerlund + + * Makefile.am: set version to 2:0:0 + +2000-01-26 Assar Westerlund + + * mdtest.c: update to pseudo-standard APIs for md4,md5,sha. + * md4.c, md4.h, md5.c, md5.h, sha.c, sha.h: move to the + pseudo-standard APIs + +1999-12-06 Assar Westerlund + + * Makefile.am: set version to 1:0:1 + +1999-11-29 Assar Westerlund + + * fcrypt.c (crypt_md5): add trailing $ + +1999-11-13 Assar Westerlund + + * Makefile.am (include_HEADERS): add rc4.h + (libdes_la_SOURCES): add rc4_skey.c + +1999-10-28 Assar Westerlund + + * md5crypt_test.c: change the test case. apparently we should not + include $ after the salt. also make it print more useful stuff + when failing. + +1999-10-20 Assar Westerlund + + * Makefile.am: bump version to 0:2:0 + +1999-09-21 Johan Danielsson + + * des.h: make this work with mips 64-bit abi + +1999-08-14 Johan Danielsson + + * fcrypt.c (crypt_md5): don't use snprintf + +1999-08-13 Assar Westerlund + + * Makefile.am: add md5crypt_test + + * Makefile.in: add md5crypt_test + + * md5crypt_test.c: test md5 crypt + + * fcrypt.c: always enable md5 crypt + +1999-07-26 Johan Danielsson + + * Makefile.am: bump version number (changes to md*, sha) + +1999-06-15 Assar Westerlund + + * sha.c (swap_u_int32_t): add _CRAY + +Sat Apr 10 23:02:30 1999 Johan Danielsson + + * destest.c: fixes for crays + +Thu Apr 1 11:26:38 1999 Johan Danielsson + + * Makefile.am: noinst_PROGRAMS -> check_PROGRAMS; add TESTS; don't + build rpw, and speed + +Mon Mar 22 20:16:26 1999 Johan Danielsson + + * Makefile.am: hash.h + + * sha.c: use hash.h; fixes for crays + + * md5.c: use hash.h; fixes for crays + + * md4.c: use hash.h; fixes for crays + + * hash.h: common stuff from md4, md5, and sha1 + +Sat Mar 20 00:16:53 1999 Assar Westerlund + + * rnd_keys.c (des_rand_data): move declaration to get rid of + warning + +Thu Mar 18 11:22:28 1999 Johan Danielsson + + * Makefile.am: include Makefile.am.common + +Mon Mar 15 17:36:41 1999 Johan Danielsson + + * rnd_keys.c (des_rand_data): if not using setitimer, block + SIGCHLD around fork(), also make sure we get the status of the + child process + (fake_signal): emulate signal using sigaction + +Tue Jan 12 05:06:54 1999 Assar Westerlund + + * des.h: sparcv9 is also 64 bits, use `unsigned int' instead of + `unsigned long' + +Sun Nov 22 10:40:09 1998 Assar Westerlund + + * Makefile.in (WFLAGS): set + +Mon May 25 05:24:56 1998 Assar Westerlund + + * Makefile.in (clean): try to remove shared library debris + +Sun Apr 19 09:50:53 1998 Assar Westerlund + + * Makefile.in: add symlink magic for linux + +Sun Nov 9 07:14:45 1997 Assar Westerlund + + * mdtest.c: print out old and new string + diff --git a/crypto/heimdal/lib/hcrypto/DESperate.txt b/crypto/heimdal/lib/hcrypto/DESperate.txt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/DESperate.txt @@ -0,0 +1,108 @@ +The hunt for getting a DES with plain BSD license w/o advertisement clause +========================================================================== + +$Id$ + +This all feels very silly given that DES is about 30 years old and now +is deprecated. + +Helpful documents on the way: + +Schider's crypto wasn't that useful since it only told how to do DES, +not how to do des fast or how to not use DES. I find this to be a +common thread in the book, it explain each tool in great detail, but +not its limitations. + +Dag Arne Osvik: Efficient Implementation of the Data Encryption Standard + +Some threads on sci.crypto was also useful. + +PC1 transformations +=================== + + +Getting the PC1 bit mangling working was hard, I never got it to work. + +Printning out the bit usage made me realize a lookup table could be +used since only 12 bits are used from the first half and 16 from the +second. + +01110000 01110000 01110000 01110000 01111000 01111000 01111000 01111000 +00001111 00001111 00001111 00001111 00000111 00000111 00000111 00000111 + +The pattern is getting more obvious if it's printed out where the bits +are coming from. + + 8 16 24 - - - - - + 7 15 23 - - - - - + 6 14 22 - - - - - + 5 13 21 - - - - - + 4 12 20 28 - - - - + 3 11 19 27 - - - - + 2 10 18 26 - - - - + 1 9 17 25 - - - - + + - - - 60 56 48 40 - + - - - 59 55 47 39 - + - - - 58 54 46 38 - + - - - 57 53 45 37 - + - - - - 52 44 36 - + - - - - 51 43 35 - + - - - - 50 42 34 - + - - - - 49 41 33 - + +Only 3 bits-table is needed for the first half and 4 bits for the +second half because they are on diffrent shift offsets. + +So to get the bitpattern bit-pattern + +gen_pattern("pc1_c_3", 7, [ 5, 13, 21 ], 0, 0x1000000); +gen_pattern("pc1_c_4", 15, [ 1, 9, 17, 25 ], 0, 0x1000000); +gen_pattern("pc1_d_3", 7, [ 49, 41, 33 ], 32, 0x1000000); +gen_pattern("pc1_d_4", 15, [ 57, 53, 45, 37 ], 32, 0x1000000); + +PC2 transformations +=================== + +PC2 is also a table lookup, since it's a 24 bit field, I use 4 6-bit +lookup tables. Printing the reverse of the PC2 table reveal that some +of the bits are not used, namely (9, 18, 22, 25) from c and (7, 10, +15, 26) from d. + +pc2 from c +---------- + + 5 24 7 16 6 10 20 +18 - 12 3 15 23 1 + 9 19 2 - 14 22 11 + - 13 4 - 17 21 8 + +pc2 from d +---------- + +51 35 31 52 39 45 - +50 32 - 43 36 29 48 + - 41 38 47 33 40 42 +49 37 30 46 - 34 44 + +So we generate tables for that too. + +gen_pattern("pc2_c_1", 63, [ 5, 24, 7, 16, 6, 10 ], 0, 0x800000); +gen_pattern("pc2_c_2", 63, [ 20, 18, 12, 3, 15, 23 ], 0, 0x800000); +gen_pattern("pc2_c_3", 63, [ 1, 9, 19, 2, 14, 22 ], 0, 0x800000); +gen_pattern("pc2_c_4", 63, [ 11, 13, 4, 17, 21, 8 ], 0, 0x800000); + +gen_pattern("pc2_d_1", 63, [ 51, 35, 31, 52, 39, 45 ], 28, 0x800000); +gen_pattern("pc2_d_2", 63, [ 50, 32, 43, 36, 29, 48 ], 28, 0x800000); +gen_pattern("pc2_d_3", 63, [ 41, 38, 47, 33, 40, 42 ], 28, 0x800000); +gen_pattern("pc2_d_4", 63, [ 49, 37, 30, 46, 34, 44 ], 28, 0x800000); + + +SBOX transformations +==================== + +The SBOX transformations are 6 bit to 4 bit transformations. + +Here I grew tired and used Richard Outerbridge SBOXes. Thank you +Richard. + diff --git a/crypto/heimdal/lib/hcrypto/Makefile.am b/crypto/heimdal/lib/hcrypto/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/Makefile.am @@ -0,0 +1,359 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +AUTOMAKE_OPTIONS = subdir-objects + +if HAVE_HCRYPTO_W_OPENSSL +AM_CPPFLAGS += $(INCLUDE_openssl_crypto) +endif + +AM_CPPFLAGS += -I$(top_srcdir)/lib/hx509 \ + -I$(srcdir)/libtommath -DUSE_HCRYPTO_LTM=1 + +lib_LTLIBRARIES = libhcrypto.la +check_LTLIBRARIES = libhctest.la + +libhcrypto_la_LDFLAGS = -version-info 5:0:1 +libhcrypto_la_LIBADD = \ + $(top_builddir)/lib/asn1/libasn1.la \ + $(LIB_dlopen) \ + $(LIB_heimbase) \ + $(LIBADD_roken) + +if HAVE_HCRYPTO_W_OPENSSL +libhcrypto_la_LIBADD += $(LIB_openssl_crypto) +endif + +hcryptoincludedir = $(includedir)/hcrypto +buildhcryptoinclude = $(buildinclude)/hcrypto + +hcryptoinclude_HEADERS = \ + aes.h \ + bn.h \ + des.h \ + dh.h \ + dsa.h \ + ec.h \ + ecdh.h \ + ecdsa.h \ + engine.h \ + evp.h \ + evp-hcrypto.h \ + evp-cc.h \ + evp-openssl.h \ + evp-pkcs11.h \ + hmac.h \ + md4.h \ + md5.h \ + pkcs12.h \ + rand.h \ + rc2.h \ + rc4.h \ + rsa.h \ + sha.h \ + ui.h \ + undef.h + +install-build-headers:: $(hcryptoinclude_HEADERS) + @foo='$(hcryptoinclude_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildhcryptoinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo "cp $$file $(buildhcryptoinclude)/$$f";\ + cp $$file $(buildhcryptoinclude)/$$f; \ + fi ; \ + done + +PROGRAM_TESTS = \ + destest \ + mdtest \ + rc2test \ + rctest \ + test_bn \ + test_bulk \ + test_cipher \ + test_engine_dso \ + test_hmac \ + test_pkcs12 \ + test_pkcs5 + +libhctest_la_SOURCES = \ + des-tables.h \ + des.c \ + des.h \ + ui.c \ + ui.h + +destest_LDADD = libhctest.la $(LIB_roken) + +SCRIPT_TESTS = \ + test_crypto + +noinst_PROGRAMS = test_rand + +check_PROGRAMS = $(PROGRAM_TESTS) test_rsa test_dh example_evp_cipher +check_SCRIPTS = $(SCRIPT_TESTS) + +TESTS = $(PROGRAM_TESTS) $(SCRIPT_TESTS) + +LDADD = $(lib_LTLIBRARIES) $(LIB_roken) $(LIB_openssl_crypto) +test_rand_LDADD = $(LDADD) -lm + +libhcrypto_la_SOURCES = \ + $(ltmsources) \ + aes.c \ + aes.h \ + bn.c \ + bn.h \ + common.c \ + common.h \ + camellia.h \ + camellia.c \ + camellia-ntt.c \ + camellia-ntt.h \ + des-tables.h \ + des.c \ + des.h \ + dh.c \ + dh.h \ + dh-ltm.c \ + dsa.c \ + dsa.h \ + doxygen.c \ + evp.c \ + evp.h \ + evp-hcrypto.c \ + evp-cc.c \ + evp-openssl.c \ + evp-pkcs11.c \ + engine.c \ + engine.h \ + hash.h \ + hmac.c \ + hmac.h \ + md4.c \ + md4.h \ + md5.c \ + md5.h \ + pkcs5.c \ + pkcs12.c \ + rand-fortuna.c \ + rand-timer.c \ + rand-unix.c \ + rand.c \ + rand.h \ + randi.h \ + rc2.c \ + rc2.h \ + rc4.c \ + rc4.h \ + rijndael-alg-fst.c \ + rijndael-alg-fst.h \ + rnd_keys.c \ + rsa.c \ + rsa-gmp.c \ + rsa-ltm.c \ + rsa.h \ + sha.c \ + sha.h \ + sha256.c \ + sha512.c \ + validate.c \ + ui.c \ + ui.h \ + undef.h + +ltmsources = \ + libtommath/tommath.h \ + libtommath/tommath_class.h \ + libtommath/tommath_superclass.h \ + libtommath/bncore.c \ + libtommath/bn_mp_init.c \ + libtommath/bn_mp_clear.c \ + libtommath/bn_mp_exch.c \ + libtommath/bn_mp_grow.c \ + libtommath/bn_mp_shrink.c \ + libtommath/bn_mp_clamp.c \ + libtommath/bn_mp_zero.c \ + libtommath/bn_mp_zero_multi.c \ + libtommath/bn_mp_set.c \ + libtommath/bn_mp_set_int.c \ + libtommath/bn_mp_init_size.c \ + libtommath/bn_mp_copy.c \ + libtommath/bn_mp_init_copy.c \ + libtommath/bn_mp_abs.c \ + libtommath/bn_mp_neg.c \ + libtommath/bn_mp_cmp_mag.c \ + libtommath/bn_mp_cmp.c \ + libtommath/bn_mp_cmp_d.c \ + libtommath/bn_mp_rshd.c \ + libtommath/bn_mp_lshd.c \ + libtommath/bn_mp_mod_2d.c \ + libtommath/bn_mp_div_2d.c \ + libtommath/bn_mp_mul_2d.c \ + libtommath/bn_mp_div_2.c \ + libtommath/bn_mp_mul_2.c \ + libtommath/bn_s_mp_add.c \ + libtommath/bn_s_mp_sub.c \ + libtommath/bn_fast_s_mp_mul_digs.c \ + libtommath/bn_s_mp_mul_digs.c \ + libtommath/bn_fast_s_mp_mul_high_digs.c \ + libtommath/bn_s_mp_mul_high_digs.c \ + libtommath/bn_fast_s_mp_sqr.c \ + libtommath/bn_s_mp_sqr.c \ + libtommath/bn_mp_add.c \ + libtommath/bn_mp_sub.c \ + libtommath/bn_mp_karatsuba_mul.c \ + libtommath/bn_mp_mul.c \ + libtommath/bn_mp_karatsuba_sqr.c \ + libtommath/bn_mp_sqr.c \ + libtommath/bn_mp_div.c \ + libtommath/bn_mp_mod.c \ + libtommath/bn_mp_add_d.c \ + libtommath/bn_mp_sub_d.c \ + libtommath/bn_mp_mul_d.c \ + libtommath/bn_mp_div_d.c \ + libtommath/bn_mp_mod_d.c \ + libtommath/bn_mp_expt_d.c \ + libtommath/bn_mp_addmod.c \ + libtommath/bn_mp_submod.c \ + libtommath/bn_mp_mulmod.c \ + libtommath/bn_mp_sqrmod.c \ + libtommath/bn_mp_gcd.c \ + libtommath/bn_mp_lcm.c \ + libtommath/bn_fast_mp_invmod.c \ + libtommath/bn_mp_invmod.c \ + libtommath/bn_mp_reduce.c \ + libtommath/bn_mp_montgomery_setup.c \ + libtommath/bn_fast_mp_montgomery_reduce.c \ + libtommath/bn_mp_montgomery_reduce.c \ + libtommath/bn_mp_exptmod_fast.c \ + libtommath/bn_mp_exptmod.c \ + libtommath/bn_mp_2expt.c \ + libtommath/bn_mp_n_root.c \ + libtommath/bn_mp_jacobi.c \ + libtommath/bn_reverse.c \ + libtommath/bn_mp_count_bits.c \ + libtommath/bn_mp_read_unsigned_bin.c \ + libtommath/bn_mp_read_signed_bin.c \ + libtommath/bn_mp_to_unsigned_bin.c \ + libtommath/bn_mp_to_signed_bin.c \ + libtommath/bn_mp_unsigned_bin_size.c \ + libtommath/bn_mp_signed_bin_size.c \ + libtommath/bn_mp_xor.c \ + libtommath/bn_mp_and.c \ + libtommath/bn_mp_or.c \ + libtommath/bn_mp_rand.c \ + libtommath/bn_mp_montgomery_calc_normalization.c \ + libtommath/bn_mp_prime_is_divisible.c \ + libtommath/bn_prime_tab.c \ + libtommath/bn_mp_prime_fermat.c \ + libtommath/bn_mp_prime_miller_rabin.c \ + libtommath/bn_mp_prime_is_prime.c \ + libtommath/bn_mp_prime_next_prime.c \ + libtommath/bn_mp_find_prime.c \ + libtommath/bn_mp_dr_reduce.c \ + libtommath/bn_mp_dr_is_modulus.c \ + libtommath/bn_mp_dr_setup.c \ + libtommath/bn_mp_reduce_setup.c \ + libtommath/bn_mp_toom_mul.c \ + libtommath/bn_mp_toom_sqr.c \ + libtommath/bn_mp_div_3.c \ + libtommath/bn_s_mp_exptmod.c \ + libtommath/bn_mp_reduce_2k.c \ + libtommath/bn_mp_reduce_is_2k.c \ + libtommath/bn_mp_reduce_2k_setup.c \ + libtommath/bn_mp_reduce_2k_l.c \ + libtommath/bn_mp_reduce_is_2k_l.c \ + libtommath/bn_mp_reduce_2k_setup_l.c \ + libtommath/bn_mp_radix_smap.c \ + libtommath/bn_mp_read_radix.c \ + libtommath/bn_mp_toradix.c \ + libtommath/bn_mp_radix_size.c \ + libtommath/bn_mp_fread.c \ + libtommath/bn_mp_fwrite.c \ + libtommath/bn_mp_cnt_lsb.c \ + libtommath/bn_error.c \ + libtommath/bn_mp_init_multi.c \ + libtommath/bn_mp_clear_multi.c \ + libtommath/bn_mp_exteuclid.c \ + libtommath/bn_mp_toradix_n.c \ + libtommath/bn_mp_prime_random_ex.c \ + libtommath/bn_mp_get_int.c \ + libtommath/bn_mp_sqrt.c \ + libtommath/bn_mp_is_square.c \ + libtommath/bn_mp_init_set.c \ + libtommath/bn_mp_init_set_int.c \ + libtommath/bn_mp_invmod_slow.c \ + libtommath/bn_mp_prime_rabin_miller_trials.c \ + libtommath/bn_mp_to_signed_bin_n.c \ + libtommath/bn_mp_to_unsigned_bin_n.c + + +$(libhcrypto_la_OBJECTS) $(test_rand_OBJECTS): hcrypto-link + +libhcrypto_la_CPPFLAGS = -DBUILD_HCRYPTO_LIB $(AM_CPPFLAGS) + +if versionscript +libhcrypto_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map +endif +$(libhcrypto_la_OBJECTS): $(srcdir)/version-script.map + + +hcrypto-link: + $(LN_S) $(srcdir)/../hcrypto hcrypto + touch hcrypto-link + +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' -e 's,[@]exeext[@],$(exeext),g' + +test_crypto: test_crypto.in Makefile + $(do_subst) < $(srcdir)/test_crypto.in > test_crypto.tmp + chmod +x test_crypto.tmp + mv test_crypto.tmp test_crypto + +CLEANFILES = \ + crypto-test \ + crypto-test2 \ + error \ + hcrypto \ + hcrypto-link \ + test.file \ + test_crypto \ + test-out* \ + test_crypto.tmp \ + test_crypto.tmp + +EXTRA_DIST = \ + NTMakefile \ + DESperate.txt \ + passwd_dialog.rc \ + libhcrypto-exports.def \ + dh-tfm.c \ + ec.h \ + ecdh.h \ + ecdsa.h \ + evp-crypt.c \ + evp-w32.c \ + evp-w32.h \ + evp-wincng.c \ + evp-wincng.h \ + gen-des.pl \ + md5crypt_test.c \ + passwd_dialog.aps \ + passwd_dialog.clw \ + passwd_dialog.rc \ + passwd_dialog.res \ + passwd_dlg.c \ + passwd_dlg.h \ + rand-w32.c \ + resource.h \ + rsa-tfm.c \ + rsakey.der \ + rsakey2048.der \ + rsakey4096.der \ + test_crypto.in \ + version-script.map diff --git a/crypto/heimdal/lib/hcrypto/Makefile.in b/crypto/heimdal/lib/hcrypto/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/Makefile.in @@ -0,0 +1,4280 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@HAVE_HCRYPTO_W_OPENSSL_TRUE@am__append_1 = $(INCLUDE_openssl_crypto) +@HAVE_HCRYPTO_W_OPENSSL_TRUE@am__append_2 = $(LIB_openssl_crypto) +noinst_PROGRAMS = test_rand$(EXEEXT) +check_PROGRAMS = $(am__EXEEXT_1) test_rsa$(EXEEXT) test_dh$(EXEEXT) \ + example_evp_cipher$(EXEEXT) +TESTS = $(am__EXEEXT_1) $(SCRIPT_TESTS) +@versionscript_TRUE@am__append_3 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map +subdir = lib/hcrypto +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(hcryptoinclude_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = destest$(EXEEXT) mdtest$(EXEEXT) rc2test$(EXEEXT) \ + rctest$(EXEEXT) test_bn$(EXEEXT) test_bulk$(EXEEXT) \ + test_cipher$(EXEEXT) test_engine_dso$(EXEEXT) \ + test_hmac$(EXEEXT) test_pkcs12$(EXEEXT) test_pkcs5$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) +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)$(hcryptoincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +@HAVE_HCRYPTO_W_OPENSSL_TRUE@am__DEPENDENCIES_2 = \ +@HAVE_HCRYPTO_W_OPENSSL_TRUE@ $(am__DEPENDENCIES_1) +libhcrypto_la_DEPENDENCIES = $(top_builddir)/lib/asn1/libasn1.la \ + $(am__DEPENDENCIES_1) $(LIB_heimbase) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_2) +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_1 = libtommath/libhcrypto_la-bncore.lo \ + libtommath/libhcrypto_la-bn_mp_init.lo \ + libtommath/libhcrypto_la-bn_mp_clear.lo \ + libtommath/libhcrypto_la-bn_mp_exch.lo \ + libtommath/libhcrypto_la-bn_mp_grow.lo \ + libtommath/libhcrypto_la-bn_mp_shrink.lo \ + libtommath/libhcrypto_la-bn_mp_clamp.lo \ + libtommath/libhcrypto_la-bn_mp_zero.lo \ + libtommath/libhcrypto_la-bn_mp_zero_multi.lo \ + libtommath/libhcrypto_la-bn_mp_set.lo \ + libtommath/libhcrypto_la-bn_mp_set_int.lo \ + libtommath/libhcrypto_la-bn_mp_init_size.lo \ + libtommath/libhcrypto_la-bn_mp_copy.lo \ + libtommath/libhcrypto_la-bn_mp_init_copy.lo \ + libtommath/libhcrypto_la-bn_mp_abs.lo \ + libtommath/libhcrypto_la-bn_mp_neg.lo \ + libtommath/libhcrypto_la-bn_mp_cmp_mag.lo \ + libtommath/libhcrypto_la-bn_mp_cmp.lo \ + libtommath/libhcrypto_la-bn_mp_cmp_d.lo \ + libtommath/libhcrypto_la-bn_mp_rshd.lo \ + libtommath/libhcrypto_la-bn_mp_lshd.lo \ + libtommath/libhcrypto_la-bn_mp_mod_2d.lo \ + libtommath/libhcrypto_la-bn_mp_div_2d.lo \ + libtommath/libhcrypto_la-bn_mp_mul_2d.lo \ + libtommath/libhcrypto_la-bn_mp_div_2.lo \ + libtommath/libhcrypto_la-bn_mp_mul_2.lo \ + libtommath/libhcrypto_la-bn_s_mp_add.lo \ + libtommath/libhcrypto_la-bn_s_mp_sub.lo \ + libtommath/libhcrypto_la-bn_fast_s_mp_mul_digs.lo \ + libtommath/libhcrypto_la-bn_s_mp_mul_digs.lo \ + libtommath/libhcrypto_la-bn_fast_s_mp_mul_high_digs.lo \ + libtommath/libhcrypto_la-bn_s_mp_mul_high_digs.lo \ + libtommath/libhcrypto_la-bn_fast_s_mp_sqr.lo \ + libtommath/libhcrypto_la-bn_s_mp_sqr.lo \ + libtommath/libhcrypto_la-bn_mp_add.lo \ + libtommath/libhcrypto_la-bn_mp_sub.lo \ + libtommath/libhcrypto_la-bn_mp_karatsuba_mul.lo \ + libtommath/libhcrypto_la-bn_mp_mul.lo \ + libtommath/libhcrypto_la-bn_mp_karatsuba_sqr.lo \ + libtommath/libhcrypto_la-bn_mp_sqr.lo \ + libtommath/libhcrypto_la-bn_mp_div.lo \ + libtommath/libhcrypto_la-bn_mp_mod.lo \ + libtommath/libhcrypto_la-bn_mp_add_d.lo \ + libtommath/libhcrypto_la-bn_mp_sub_d.lo \ + libtommath/libhcrypto_la-bn_mp_mul_d.lo \ + libtommath/libhcrypto_la-bn_mp_div_d.lo \ + libtommath/libhcrypto_la-bn_mp_mod_d.lo \ + libtommath/libhcrypto_la-bn_mp_expt_d.lo \ + libtommath/libhcrypto_la-bn_mp_addmod.lo \ + libtommath/libhcrypto_la-bn_mp_submod.lo \ + libtommath/libhcrypto_la-bn_mp_mulmod.lo \ + libtommath/libhcrypto_la-bn_mp_sqrmod.lo \ + libtommath/libhcrypto_la-bn_mp_gcd.lo \ + libtommath/libhcrypto_la-bn_mp_lcm.lo \ + libtommath/libhcrypto_la-bn_fast_mp_invmod.lo \ + libtommath/libhcrypto_la-bn_mp_invmod.lo \ + libtommath/libhcrypto_la-bn_mp_reduce.lo \ + libtommath/libhcrypto_la-bn_mp_montgomery_setup.lo \ + libtommath/libhcrypto_la-bn_fast_mp_montgomery_reduce.lo \ + libtommath/libhcrypto_la-bn_mp_montgomery_reduce.lo \ + libtommath/libhcrypto_la-bn_mp_exptmod_fast.lo \ + libtommath/libhcrypto_la-bn_mp_exptmod.lo \ + libtommath/libhcrypto_la-bn_mp_2expt.lo \ + libtommath/libhcrypto_la-bn_mp_n_root.lo \ + libtommath/libhcrypto_la-bn_mp_jacobi.lo \ + libtommath/libhcrypto_la-bn_reverse.lo \ + libtommath/libhcrypto_la-bn_mp_count_bits.lo \ + libtommath/libhcrypto_la-bn_mp_read_unsigned_bin.lo \ + libtommath/libhcrypto_la-bn_mp_read_signed_bin.lo \ + libtommath/libhcrypto_la-bn_mp_to_unsigned_bin.lo \ + libtommath/libhcrypto_la-bn_mp_to_signed_bin.lo \ + libtommath/libhcrypto_la-bn_mp_unsigned_bin_size.lo \ + libtommath/libhcrypto_la-bn_mp_signed_bin_size.lo \ + libtommath/libhcrypto_la-bn_mp_xor.lo \ + libtommath/libhcrypto_la-bn_mp_and.lo \ + libtommath/libhcrypto_la-bn_mp_or.lo \ + libtommath/libhcrypto_la-bn_mp_rand.lo \ + libtommath/libhcrypto_la-bn_mp_montgomery_calc_normalization.lo \ + libtommath/libhcrypto_la-bn_mp_prime_is_divisible.lo \ + libtommath/libhcrypto_la-bn_prime_tab.lo \ + libtommath/libhcrypto_la-bn_mp_prime_fermat.lo \ + libtommath/libhcrypto_la-bn_mp_prime_miller_rabin.lo \ + libtommath/libhcrypto_la-bn_mp_prime_is_prime.lo \ + libtommath/libhcrypto_la-bn_mp_prime_next_prime.lo \ + libtommath/libhcrypto_la-bn_mp_find_prime.lo \ + libtommath/libhcrypto_la-bn_mp_dr_reduce.lo \ + libtommath/libhcrypto_la-bn_mp_dr_is_modulus.lo \ + libtommath/libhcrypto_la-bn_mp_dr_setup.lo \ + libtommath/libhcrypto_la-bn_mp_reduce_setup.lo \ + libtommath/libhcrypto_la-bn_mp_toom_mul.lo \ + libtommath/libhcrypto_la-bn_mp_toom_sqr.lo \ + libtommath/libhcrypto_la-bn_mp_div_3.lo \ + libtommath/libhcrypto_la-bn_s_mp_exptmod.lo \ + libtommath/libhcrypto_la-bn_mp_reduce_2k.lo \ + libtommath/libhcrypto_la-bn_mp_reduce_is_2k.lo \ + libtommath/libhcrypto_la-bn_mp_reduce_2k_setup.lo \ + libtommath/libhcrypto_la-bn_mp_reduce_2k_l.lo \ + libtommath/libhcrypto_la-bn_mp_reduce_is_2k_l.lo \ + libtommath/libhcrypto_la-bn_mp_reduce_2k_setup_l.lo \ + libtommath/libhcrypto_la-bn_mp_radix_smap.lo \ + libtommath/libhcrypto_la-bn_mp_read_radix.lo \ + libtommath/libhcrypto_la-bn_mp_toradix.lo \ + libtommath/libhcrypto_la-bn_mp_radix_size.lo \ + libtommath/libhcrypto_la-bn_mp_fread.lo \ + libtommath/libhcrypto_la-bn_mp_fwrite.lo \ + libtommath/libhcrypto_la-bn_mp_cnt_lsb.lo \ + libtommath/libhcrypto_la-bn_error.lo \ + libtommath/libhcrypto_la-bn_mp_init_multi.lo \ + libtommath/libhcrypto_la-bn_mp_clear_multi.lo \ + libtommath/libhcrypto_la-bn_mp_exteuclid.lo \ + libtommath/libhcrypto_la-bn_mp_toradix_n.lo \ + libtommath/libhcrypto_la-bn_mp_prime_random_ex.lo \ + libtommath/libhcrypto_la-bn_mp_get_int.lo \ + libtommath/libhcrypto_la-bn_mp_sqrt.lo \ + libtommath/libhcrypto_la-bn_mp_is_square.lo \ + libtommath/libhcrypto_la-bn_mp_init_set.lo \ + libtommath/libhcrypto_la-bn_mp_init_set_int.lo \ + libtommath/libhcrypto_la-bn_mp_invmod_slow.lo \ + libtommath/libhcrypto_la-bn_mp_prime_rabin_miller_trials.lo \ + libtommath/libhcrypto_la-bn_mp_to_signed_bin_n.lo \ + libtommath/libhcrypto_la-bn_mp_to_unsigned_bin_n.lo +am_libhcrypto_la_OBJECTS = $(am__objects_1) libhcrypto_la-aes.lo \ + libhcrypto_la-bn.lo libhcrypto_la-common.lo \ + libhcrypto_la-camellia.lo libhcrypto_la-camellia-ntt.lo \ + libhcrypto_la-des.lo libhcrypto_la-dh.lo \ + libhcrypto_la-dh-ltm.lo libhcrypto_la-dsa.lo \ + libhcrypto_la-doxygen.lo libhcrypto_la-evp.lo \ + libhcrypto_la-evp-hcrypto.lo libhcrypto_la-evp-cc.lo \ + libhcrypto_la-evp-openssl.lo libhcrypto_la-evp-pkcs11.lo \ + libhcrypto_la-engine.lo libhcrypto_la-hmac.lo \ + libhcrypto_la-md4.lo libhcrypto_la-md5.lo \ + libhcrypto_la-pkcs5.lo libhcrypto_la-pkcs12.lo \ + libhcrypto_la-rand-fortuna.lo libhcrypto_la-rand-timer.lo \ + libhcrypto_la-rand-unix.lo libhcrypto_la-rand.lo \ + libhcrypto_la-rc2.lo libhcrypto_la-rc4.lo \ + libhcrypto_la-rijndael-alg-fst.lo libhcrypto_la-rnd_keys.lo \ + libhcrypto_la-rsa.lo libhcrypto_la-rsa-gmp.lo \ + libhcrypto_la-rsa-ltm.lo libhcrypto_la-sha.lo \ + libhcrypto_la-sha256.lo libhcrypto_la-sha512.lo \ + libhcrypto_la-validate.lo libhcrypto_la-ui.lo +libhcrypto_la_OBJECTS = $(am_libhcrypto_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libhcrypto_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libhcrypto_la_LDFLAGS) $(LDFLAGS) -o $@ +libhctest_la_LIBADD = +am_libhctest_la_OBJECTS = des.lo ui.lo +libhctest_la_OBJECTS = $(am_libhctest_la_OBJECTS) +destest_SOURCES = destest.c +destest_OBJECTS = destest.$(OBJEXT) +destest_DEPENDENCIES = libhctest.la $(am__DEPENDENCIES_1) +example_evp_cipher_SOURCES = example_evp_cipher.c +example_evp_cipher_OBJECTS = example_evp_cipher.$(OBJEXT) +example_evp_cipher_LDADD = $(LDADD) +example_evp_cipher_DEPENDENCIES = $(lib_LTLIBRARIES) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +mdtest_SOURCES = mdtest.c +mdtest_OBJECTS = mdtest.$(OBJEXT) +mdtest_LDADD = $(LDADD) +mdtest_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +rc2test_SOURCES = rc2test.c +rc2test_OBJECTS = rc2test.$(OBJEXT) +rc2test_LDADD = $(LDADD) +rc2test_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +rctest_SOURCES = rctest.c +rctest_OBJECTS = rctest.$(OBJEXT) +rctest_LDADD = $(LDADD) +rctest_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_bn_SOURCES = test_bn.c +test_bn_OBJECTS = test_bn.$(OBJEXT) +test_bn_LDADD = $(LDADD) +test_bn_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_bulk_SOURCES = test_bulk.c +test_bulk_OBJECTS = test_bulk.$(OBJEXT) +test_bulk_LDADD = $(LDADD) +test_bulk_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_cipher_SOURCES = test_cipher.c +test_cipher_OBJECTS = test_cipher.$(OBJEXT) +test_cipher_LDADD = $(LDADD) +test_cipher_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_dh_SOURCES = test_dh.c +test_dh_OBJECTS = test_dh.$(OBJEXT) +test_dh_LDADD = $(LDADD) +test_dh_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_engine_dso_SOURCES = test_engine_dso.c +test_engine_dso_OBJECTS = test_engine_dso.$(OBJEXT) +test_engine_dso_LDADD = $(LDADD) +test_engine_dso_DEPENDENCIES = $(lib_LTLIBRARIES) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +test_hmac_SOURCES = test_hmac.c +test_hmac_OBJECTS = test_hmac.$(OBJEXT) +test_hmac_LDADD = $(LDADD) +test_hmac_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_pkcs12_SOURCES = test_pkcs12.c +test_pkcs12_OBJECTS = test_pkcs12.$(OBJEXT) +test_pkcs12_LDADD = $(LDADD) +test_pkcs12_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_pkcs5_SOURCES = test_pkcs5.c +test_pkcs5_OBJECTS = test_pkcs5.$(OBJEXT) +test_pkcs5_LDADD = $(LDADD) +test_pkcs5_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_rand_SOURCES = test_rand.c +test_rand_OBJECTS = test_rand.$(OBJEXT) +am__DEPENDENCIES_3 = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +test_rand_DEPENDENCIES = $(am__DEPENDENCIES_3) +test_rsa_SOURCES = test_rsa.c +test_rsa_OBJECTS = test_rsa.$(OBJEXT) +test_rsa_LDADD = $(LDADD) +test_rsa_DEPENDENCIES = $(lib_LTLIBRARIES) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/des.Plo ./$(DEPDIR)/destest.Po \ + ./$(DEPDIR)/example_evp_cipher.Po \ + ./$(DEPDIR)/libhcrypto_la-aes.Plo \ + ./$(DEPDIR)/libhcrypto_la-bn.Plo \ + ./$(DEPDIR)/libhcrypto_la-camellia-ntt.Plo \ + ./$(DEPDIR)/libhcrypto_la-camellia.Plo \ + ./$(DEPDIR)/libhcrypto_la-common.Plo \ + ./$(DEPDIR)/libhcrypto_la-des.Plo \ + ./$(DEPDIR)/libhcrypto_la-dh-ltm.Plo \ + ./$(DEPDIR)/libhcrypto_la-dh.Plo \ + ./$(DEPDIR)/libhcrypto_la-doxygen.Plo \ + ./$(DEPDIR)/libhcrypto_la-dsa.Plo \ + ./$(DEPDIR)/libhcrypto_la-engine.Plo \ + ./$(DEPDIR)/libhcrypto_la-evp-cc.Plo \ + ./$(DEPDIR)/libhcrypto_la-evp-hcrypto.Plo \ + ./$(DEPDIR)/libhcrypto_la-evp-openssl.Plo \ + ./$(DEPDIR)/libhcrypto_la-evp-pkcs11.Plo \ + ./$(DEPDIR)/libhcrypto_la-evp.Plo \ + ./$(DEPDIR)/libhcrypto_la-hmac.Plo \ + ./$(DEPDIR)/libhcrypto_la-md4.Plo \ + ./$(DEPDIR)/libhcrypto_la-md5.Plo \ + ./$(DEPDIR)/libhcrypto_la-pkcs12.Plo \ + ./$(DEPDIR)/libhcrypto_la-pkcs5.Plo \ + ./$(DEPDIR)/libhcrypto_la-rand-fortuna.Plo \ + ./$(DEPDIR)/libhcrypto_la-rand-timer.Plo \ + ./$(DEPDIR)/libhcrypto_la-rand-unix.Plo \ + ./$(DEPDIR)/libhcrypto_la-rand.Plo \ + ./$(DEPDIR)/libhcrypto_la-rc2.Plo \ + ./$(DEPDIR)/libhcrypto_la-rc4.Plo \ + ./$(DEPDIR)/libhcrypto_la-rijndael-alg-fst.Plo \ + ./$(DEPDIR)/libhcrypto_la-rnd_keys.Plo \ + ./$(DEPDIR)/libhcrypto_la-rsa-gmp.Plo \ + ./$(DEPDIR)/libhcrypto_la-rsa-ltm.Plo \ + ./$(DEPDIR)/libhcrypto_la-rsa.Plo \ + ./$(DEPDIR)/libhcrypto_la-sha.Plo \ + ./$(DEPDIR)/libhcrypto_la-sha256.Plo \ + ./$(DEPDIR)/libhcrypto_la-sha512.Plo \ + ./$(DEPDIR)/libhcrypto_la-ui.Plo \ + ./$(DEPDIR)/libhcrypto_la-validate.Plo ./$(DEPDIR)/mdtest.Po \ + ./$(DEPDIR)/rc2test.Po ./$(DEPDIR)/rctest.Po \ + ./$(DEPDIR)/test_bn.Po ./$(DEPDIR)/test_bulk.Po \ + ./$(DEPDIR)/test_cipher.Po ./$(DEPDIR)/test_dh.Po \ + ./$(DEPDIR)/test_engine_dso.Po ./$(DEPDIR)/test_hmac.Po \ + ./$(DEPDIR)/test_pkcs12.Po ./$(DEPDIR)/test_pkcs5.Po \ + ./$(DEPDIR)/test_rand.Po ./$(DEPDIR)/test_rsa.Po \ + ./$(DEPDIR)/ui.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_error.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_invmod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_montgomery_reduce.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_digs.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_high_digs.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_sqr.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_2expt.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_abs.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add_d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_addmod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_and.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clamp.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear_multi.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_mag.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cnt_lsb.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_copy.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_count_bits.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_3.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_is_modulus.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_reduce.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_setup.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exch.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_expt_d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod_fast.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exteuclid.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_find_prime.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fread.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fwrite.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_gcd.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_get_int.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_grow.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_copy.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_multi.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set_int.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_size.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod_slow.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_is_square.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_jacobi.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_mul.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_sqr.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lcm.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lshd.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_2d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_calc_normalization.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_reduce.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_setup.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mulmod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_n_root.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_neg.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_or.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_fermat.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_divisible.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_prime.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_miller_rabin.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_next_prime.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_rabin_miller_trials.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_random_ex.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_size.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_smap.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rand.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_radix.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_signed_bin.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_unsigned_bin.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_l.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup_l.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k_l.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_setup.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rshd.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set_int.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_shrink.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_signed_bin_size.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqr.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrmod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrt.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub_d.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_submod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin_n.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin_n.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_mul.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_sqr.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix_n.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_unsigned_bin_size.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_xor.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero_multi.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_prime_tab.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_reverse.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_add.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_exptmod.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_digs.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_high_digs.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sqr.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sub.Plo \ + libtommath/$(DEPDIR)/libhcrypto_la-bncore.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libhcrypto_la_SOURCES) $(libhctest_la_SOURCES) destest.c \ + example_evp_cipher.c mdtest.c rc2test.c rctest.c test_bn.c \ + test_bulk.c test_cipher.c test_dh.c test_engine_dso.c \ + test_hmac.c test_pkcs12.c test_pkcs5.c test_rand.c test_rsa.c +DIST_SOURCES = $(libhcrypto_la_SOURCES) $(libhctest_la_SOURCES) \ + destest.c example_evp_cipher.c mdtest.c rc2test.c rctest.c \ + test_bn.c test_bulk.c test_cipher.c test_dh.c \ + test_engine_dso.c test_hmac.c test_pkcs12.c test_pkcs5.c \ + test_rand.c test_rsa.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(hcryptoinclude_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver ChangeLog +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) $(am__append_1) \ + -I$(top_srcdir)/lib/hx509 -I$(srcdir)/libtommath \ + -DUSE_HCRYPTO_LTM=1 +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +AUTOMAKE_OPTIONS = subdir-objects +lib_LTLIBRARIES = libhcrypto.la +check_LTLIBRARIES = libhctest.la +libhcrypto_la_LDFLAGS = -version-info 5:0:1 $(am__append_3) +libhcrypto_la_LIBADD = $(top_builddir)/lib/asn1/libasn1.la \ + $(LIB_dlopen) $(LIB_heimbase) $(LIBADD_roken) $(am__append_2) +hcryptoincludedir = $(includedir)/hcrypto +buildhcryptoinclude = $(buildinclude)/hcrypto +hcryptoinclude_HEADERS = \ + aes.h \ + bn.h \ + des.h \ + dh.h \ + dsa.h \ + ec.h \ + ecdh.h \ + ecdsa.h \ + engine.h \ + evp.h \ + evp-hcrypto.h \ + evp-cc.h \ + evp-openssl.h \ + evp-pkcs11.h \ + hmac.h \ + md4.h \ + md5.h \ + pkcs12.h \ + rand.h \ + rc2.h \ + rc4.h \ + rsa.h \ + sha.h \ + ui.h \ + undef.h + +PROGRAM_TESTS = \ + destest \ + mdtest \ + rc2test \ + rctest \ + test_bn \ + test_bulk \ + test_cipher \ + test_engine_dso \ + test_hmac \ + test_pkcs12 \ + test_pkcs5 + +libhctest_la_SOURCES = \ + des-tables.h \ + des.c \ + des.h \ + ui.c \ + ui.h + +destest_LDADD = libhctest.la $(LIB_roken) +SCRIPT_TESTS = \ + test_crypto + +check_SCRIPTS = $(SCRIPT_TESTS) +LDADD = $(lib_LTLIBRARIES) $(LIB_roken) $(LIB_openssl_crypto) +test_rand_LDADD = $(LDADD) -lm +libhcrypto_la_SOURCES = \ + $(ltmsources) \ + aes.c \ + aes.h \ + bn.c \ + bn.h \ + common.c \ + common.h \ + camellia.h \ + camellia.c \ + camellia-ntt.c \ + camellia-ntt.h \ + des-tables.h \ + des.c \ + des.h \ + dh.c \ + dh.h \ + dh-ltm.c \ + dsa.c \ + dsa.h \ + doxygen.c \ + evp.c \ + evp.h \ + evp-hcrypto.c \ + evp-cc.c \ + evp-openssl.c \ + evp-pkcs11.c \ + engine.c \ + engine.h \ + hash.h \ + hmac.c \ + hmac.h \ + md4.c \ + md4.h \ + md5.c \ + md5.h \ + pkcs5.c \ + pkcs12.c \ + rand-fortuna.c \ + rand-timer.c \ + rand-unix.c \ + rand.c \ + rand.h \ + randi.h \ + rc2.c \ + rc2.h \ + rc4.c \ + rc4.h \ + rijndael-alg-fst.c \ + rijndael-alg-fst.h \ + rnd_keys.c \ + rsa.c \ + rsa-gmp.c \ + rsa-ltm.c \ + rsa.h \ + sha.c \ + sha.h \ + sha256.c \ + sha512.c \ + validate.c \ + ui.c \ + ui.h \ + undef.h + +ltmsources = \ + libtommath/tommath.h \ + libtommath/tommath_class.h \ + libtommath/tommath_superclass.h \ + libtommath/bncore.c \ + libtommath/bn_mp_init.c \ + libtommath/bn_mp_clear.c \ + libtommath/bn_mp_exch.c \ + libtommath/bn_mp_grow.c \ + libtommath/bn_mp_shrink.c \ + libtommath/bn_mp_clamp.c \ + libtommath/bn_mp_zero.c \ + libtommath/bn_mp_zero_multi.c \ + libtommath/bn_mp_set.c \ + libtommath/bn_mp_set_int.c \ + libtommath/bn_mp_init_size.c \ + libtommath/bn_mp_copy.c \ + libtommath/bn_mp_init_copy.c \ + libtommath/bn_mp_abs.c \ + libtommath/bn_mp_neg.c \ + libtommath/bn_mp_cmp_mag.c \ + libtommath/bn_mp_cmp.c \ + libtommath/bn_mp_cmp_d.c \ + libtommath/bn_mp_rshd.c \ + libtommath/bn_mp_lshd.c \ + libtommath/bn_mp_mod_2d.c \ + libtommath/bn_mp_div_2d.c \ + libtommath/bn_mp_mul_2d.c \ + libtommath/bn_mp_div_2.c \ + libtommath/bn_mp_mul_2.c \ + libtommath/bn_s_mp_add.c \ + libtommath/bn_s_mp_sub.c \ + libtommath/bn_fast_s_mp_mul_digs.c \ + libtommath/bn_s_mp_mul_digs.c \ + libtommath/bn_fast_s_mp_mul_high_digs.c \ + libtommath/bn_s_mp_mul_high_digs.c \ + libtommath/bn_fast_s_mp_sqr.c \ + libtommath/bn_s_mp_sqr.c \ + libtommath/bn_mp_add.c \ + libtommath/bn_mp_sub.c \ + libtommath/bn_mp_karatsuba_mul.c \ + libtommath/bn_mp_mul.c \ + libtommath/bn_mp_karatsuba_sqr.c \ + libtommath/bn_mp_sqr.c \ + libtommath/bn_mp_div.c \ + libtommath/bn_mp_mod.c \ + libtommath/bn_mp_add_d.c \ + libtommath/bn_mp_sub_d.c \ + libtommath/bn_mp_mul_d.c \ + libtommath/bn_mp_div_d.c \ + libtommath/bn_mp_mod_d.c \ + libtommath/bn_mp_expt_d.c \ + libtommath/bn_mp_addmod.c \ + libtommath/bn_mp_submod.c \ + libtommath/bn_mp_mulmod.c \ + libtommath/bn_mp_sqrmod.c \ + libtommath/bn_mp_gcd.c \ + libtommath/bn_mp_lcm.c \ + libtommath/bn_fast_mp_invmod.c \ + libtommath/bn_mp_invmod.c \ + libtommath/bn_mp_reduce.c \ + libtommath/bn_mp_montgomery_setup.c \ + libtommath/bn_fast_mp_montgomery_reduce.c \ + libtommath/bn_mp_montgomery_reduce.c \ + libtommath/bn_mp_exptmod_fast.c \ + libtommath/bn_mp_exptmod.c \ + libtommath/bn_mp_2expt.c \ + libtommath/bn_mp_n_root.c \ + libtommath/bn_mp_jacobi.c \ + libtommath/bn_reverse.c \ + libtommath/bn_mp_count_bits.c \ + libtommath/bn_mp_read_unsigned_bin.c \ + libtommath/bn_mp_read_signed_bin.c \ + libtommath/bn_mp_to_unsigned_bin.c \ + libtommath/bn_mp_to_signed_bin.c \ + libtommath/bn_mp_unsigned_bin_size.c \ + libtommath/bn_mp_signed_bin_size.c \ + libtommath/bn_mp_xor.c \ + libtommath/bn_mp_and.c \ + libtommath/bn_mp_or.c \ + libtommath/bn_mp_rand.c \ + libtommath/bn_mp_montgomery_calc_normalization.c \ + libtommath/bn_mp_prime_is_divisible.c \ + libtommath/bn_prime_tab.c \ + libtommath/bn_mp_prime_fermat.c \ + libtommath/bn_mp_prime_miller_rabin.c \ + libtommath/bn_mp_prime_is_prime.c \ + libtommath/bn_mp_prime_next_prime.c \ + libtommath/bn_mp_find_prime.c \ + libtommath/bn_mp_dr_reduce.c \ + libtommath/bn_mp_dr_is_modulus.c \ + libtommath/bn_mp_dr_setup.c \ + libtommath/bn_mp_reduce_setup.c \ + libtommath/bn_mp_toom_mul.c \ + libtommath/bn_mp_toom_sqr.c \ + libtommath/bn_mp_div_3.c \ + libtommath/bn_s_mp_exptmod.c \ + libtommath/bn_mp_reduce_2k.c \ + libtommath/bn_mp_reduce_is_2k.c \ + libtommath/bn_mp_reduce_2k_setup.c \ + libtommath/bn_mp_reduce_2k_l.c \ + libtommath/bn_mp_reduce_is_2k_l.c \ + libtommath/bn_mp_reduce_2k_setup_l.c \ + libtommath/bn_mp_radix_smap.c \ + libtommath/bn_mp_read_radix.c \ + libtommath/bn_mp_toradix.c \ + libtommath/bn_mp_radix_size.c \ + libtommath/bn_mp_fread.c \ + libtommath/bn_mp_fwrite.c \ + libtommath/bn_mp_cnt_lsb.c \ + libtommath/bn_error.c \ + libtommath/bn_mp_init_multi.c \ + libtommath/bn_mp_clear_multi.c \ + libtommath/bn_mp_exteuclid.c \ + libtommath/bn_mp_toradix_n.c \ + libtommath/bn_mp_prime_random_ex.c \ + libtommath/bn_mp_get_int.c \ + libtommath/bn_mp_sqrt.c \ + libtommath/bn_mp_is_square.c \ + libtommath/bn_mp_init_set.c \ + libtommath/bn_mp_init_set_int.c \ + libtommath/bn_mp_invmod_slow.c \ + libtommath/bn_mp_prime_rabin_miller_trials.c \ + libtommath/bn_mp_to_signed_bin_n.c \ + libtommath/bn_mp_to_unsigned_bin_n.c + +libhcrypto_la_CPPFLAGS = -DBUILD_HCRYPTO_LIB $(AM_CPPFLAGS) +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' -e 's,[@]exeext[@],$(exeext),g' +CLEANFILES = \ + crypto-test \ + crypto-test2 \ + error \ + hcrypto \ + hcrypto-link \ + test.file \ + test_crypto \ + test-out* \ + test_crypto.tmp \ + test_crypto.tmp + +EXTRA_DIST = \ + NTMakefile \ + DESperate.txt \ + passwd_dialog.rc \ + libhcrypto-exports.def \ + dh-tfm.c \ + ec.h \ + ecdh.h \ + ecdsa.h \ + evp-crypt.c \ + evp-w32.c \ + evp-w32.h \ + evp-wincng.c \ + evp-wincng.h \ + gen-des.pl \ + md5crypt_test.c \ + passwd_dialog.aps \ + passwd_dialog.clw \ + passwd_dialog.rc \ + passwd_dialog.res \ + passwd_dlg.c \ + passwd_dlg.h \ + rand-w32.c \ + resource.h \ + rsa-tfm.c \ + rsakey.der \ + rsakey2048.der \ + rsakey4096.der \ + test_crypto.in \ + version-script.map + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 lib/hcrypto/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign lib/hcrypto/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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-checkPROGRAMS: + @list='$(check_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 + +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 + +clean-checkLTLIBRARIES: + -test -z "$(check_LTLIBRARIES)" || rm -f $(check_LTLIBRARIES) + @list='$(check_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}; \ + } + +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}; \ + } +libtommath/$(am__dirstamp): + @$(MKDIR_P) libtommath + @: > libtommath/$(am__dirstamp) +libtommath/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) libtommath/$(DEPDIR) + @: > libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bncore.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_init.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_clear.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_exch.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_grow.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_shrink.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_clamp.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_zero.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_zero_multi.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_set.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_set_int.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_init_size.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_copy.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_init_copy.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_abs.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_neg.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_cmp_mag.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_cmp.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_cmp_d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_rshd.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_lshd.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mod_2d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_div_2d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mul_2d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_div_2.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mul_2.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_s_mp_add.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_s_mp_sub.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_fast_s_mp_mul_digs.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_s_mp_mul_digs.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_fast_s_mp_mul_high_digs.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_s_mp_mul_high_digs.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_fast_s_mp_sqr.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_s_mp_sqr.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_add.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_sub.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_karatsuba_mul.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mul.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_karatsuba_sqr.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_sqr.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_div.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mod.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_add_d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_sub_d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mul_d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_div_d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mod_d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_expt_d.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_addmod.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_submod.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_mulmod.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_sqrmod.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_gcd.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_lcm.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_fast_mp_invmod.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_invmod.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_montgomery_setup.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_fast_mp_montgomery_reduce.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_montgomery_reduce.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_exptmod_fast.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_exptmod.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_2expt.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_n_root.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_jacobi.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_reverse.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_count_bits.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_read_unsigned_bin.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_read_signed_bin.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_to_unsigned_bin.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_to_signed_bin.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_unsigned_bin_size.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_signed_bin_size.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_xor.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_and.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_or.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_rand.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_montgomery_calc_normalization.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_prime_is_divisible.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_prime_tab.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_prime_fermat.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_prime_miller_rabin.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_prime_is_prime.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_prime_next_prime.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_find_prime.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_dr_reduce.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_dr_is_modulus.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_dr_setup.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce_setup.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_toom_mul.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_toom_sqr.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_div_3.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_s_mp_exptmod.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce_2k.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce_is_2k.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce_2k_setup.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce_2k_l.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce_is_2k_l.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_reduce_2k_setup_l.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_radix_smap.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_read_radix.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_toradix.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_radix_size.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_fread.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_fwrite.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_cnt_lsb.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_error.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_init_multi.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_clear_multi.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_exteuclid.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_toradix_n.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_prime_random_ex.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_get_int.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_sqrt.lo: libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_is_square.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_init_set.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_init_set_int.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_invmod_slow.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_prime_rabin_miller_trials.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_to_signed_bin_n.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) +libtommath/libhcrypto_la-bn_mp_to_unsigned_bin_n.lo: \ + libtommath/$(am__dirstamp) \ + libtommath/$(DEPDIR)/$(am__dirstamp) + +libhcrypto.la: $(libhcrypto_la_OBJECTS) $(libhcrypto_la_DEPENDENCIES) $(EXTRA_libhcrypto_la_DEPENDENCIES) + $(AM_V_CCLD)$(libhcrypto_la_LINK) -rpath $(libdir) $(libhcrypto_la_OBJECTS) $(libhcrypto_la_LIBADD) $(LIBS) + +libhctest.la: $(libhctest_la_OBJECTS) $(libhctest_la_DEPENDENCIES) $(EXTRA_libhctest_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libhctest_la_OBJECTS) $(libhctest_la_LIBADD) $(LIBS) + +destest$(EXEEXT): $(destest_OBJECTS) $(destest_DEPENDENCIES) $(EXTRA_destest_DEPENDENCIES) + @rm -f destest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(destest_OBJECTS) $(destest_LDADD) $(LIBS) + +example_evp_cipher$(EXEEXT): $(example_evp_cipher_OBJECTS) $(example_evp_cipher_DEPENDENCIES) $(EXTRA_example_evp_cipher_DEPENDENCIES) + @rm -f example_evp_cipher$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(example_evp_cipher_OBJECTS) $(example_evp_cipher_LDADD) $(LIBS) + +mdtest$(EXEEXT): $(mdtest_OBJECTS) $(mdtest_DEPENDENCIES) $(EXTRA_mdtest_DEPENDENCIES) + @rm -f mdtest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(mdtest_OBJECTS) $(mdtest_LDADD) $(LIBS) + +rc2test$(EXEEXT): $(rc2test_OBJECTS) $(rc2test_DEPENDENCIES) $(EXTRA_rc2test_DEPENDENCIES) + @rm -f rc2test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(rc2test_OBJECTS) $(rc2test_LDADD) $(LIBS) + +rctest$(EXEEXT): $(rctest_OBJECTS) $(rctest_DEPENDENCIES) $(EXTRA_rctest_DEPENDENCIES) + @rm -f rctest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(rctest_OBJECTS) $(rctest_LDADD) $(LIBS) + +test_bn$(EXEEXT): $(test_bn_OBJECTS) $(test_bn_DEPENDENCIES) $(EXTRA_test_bn_DEPENDENCIES) + @rm -f test_bn$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_bn_OBJECTS) $(test_bn_LDADD) $(LIBS) + +test_bulk$(EXEEXT): $(test_bulk_OBJECTS) $(test_bulk_DEPENDENCIES) $(EXTRA_test_bulk_DEPENDENCIES) + @rm -f test_bulk$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_bulk_OBJECTS) $(test_bulk_LDADD) $(LIBS) + +test_cipher$(EXEEXT): $(test_cipher_OBJECTS) $(test_cipher_DEPENDENCIES) $(EXTRA_test_cipher_DEPENDENCIES) + @rm -f test_cipher$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_cipher_OBJECTS) $(test_cipher_LDADD) $(LIBS) + +test_dh$(EXEEXT): $(test_dh_OBJECTS) $(test_dh_DEPENDENCIES) $(EXTRA_test_dh_DEPENDENCIES) + @rm -f test_dh$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_dh_OBJECTS) $(test_dh_LDADD) $(LIBS) + +test_engine_dso$(EXEEXT): $(test_engine_dso_OBJECTS) $(test_engine_dso_DEPENDENCIES) $(EXTRA_test_engine_dso_DEPENDENCIES) + @rm -f test_engine_dso$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_engine_dso_OBJECTS) $(test_engine_dso_LDADD) $(LIBS) + +test_hmac$(EXEEXT): $(test_hmac_OBJECTS) $(test_hmac_DEPENDENCIES) $(EXTRA_test_hmac_DEPENDENCIES) + @rm -f test_hmac$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_hmac_OBJECTS) $(test_hmac_LDADD) $(LIBS) + +test_pkcs12$(EXEEXT): $(test_pkcs12_OBJECTS) $(test_pkcs12_DEPENDENCIES) $(EXTRA_test_pkcs12_DEPENDENCIES) + @rm -f test_pkcs12$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_pkcs12_OBJECTS) $(test_pkcs12_LDADD) $(LIBS) + +test_pkcs5$(EXEEXT): $(test_pkcs5_OBJECTS) $(test_pkcs5_DEPENDENCIES) $(EXTRA_test_pkcs5_DEPENDENCIES) + @rm -f test_pkcs5$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_pkcs5_OBJECTS) $(test_pkcs5_LDADD) $(LIBS) + +test_rand$(EXEEXT): $(test_rand_OBJECTS) $(test_rand_DEPENDENCIES) $(EXTRA_test_rand_DEPENDENCIES) + @rm -f test_rand$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_rand_OBJECTS) $(test_rand_LDADD) $(LIBS) + +test_rsa$(EXEEXT): $(test_rsa_OBJECTS) $(test_rsa_DEPENDENCIES) $(EXTRA_test_rsa_DEPENDENCIES) + @rm -f test_rsa$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_rsa_OBJECTS) $(test_rsa_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f libtommath/*.$(OBJEXT) + -rm -f libtommath/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/des.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/destest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/example_evp_cipher.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-aes.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-bn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-camellia-ntt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-camellia.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-des.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-dh-ltm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-dh.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-doxygen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-dsa.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-engine.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-evp-cc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-evp-hcrypto.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-evp-openssl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-evp-pkcs11.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-evp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-hmac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-md4.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-md5.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-pkcs12.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-pkcs5.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rand-fortuna.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rand-timer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rand-unix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rc2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rc4.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rijndael-alg-fst.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rnd_keys.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rsa-gmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rsa-ltm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-rsa.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-sha.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-sha256.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-sha512.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-ui.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhcrypto_la-validate.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mdtest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rc2test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rctest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bn.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_bulk.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cipher.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dh.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_engine_dso.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hmac.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pkcs12.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pkcs5.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rand.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rsa.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_invmod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_montgomery_reduce.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_digs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_high_digs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_sqr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_2expt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_abs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add_d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_addmod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_and.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clamp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear_multi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_mag.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cnt_lsb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_copy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_count_bits.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_is_modulus.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_reduce.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_setup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exch.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_expt_d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod_fast.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exteuclid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_find_prime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fread.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fwrite.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_gcd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_get_int.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_grow.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_copy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_multi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set_int.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_size.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod_slow.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_is_square.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_jacobi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_mul.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_sqr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lshd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_2d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_calc_normalization.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_reduce.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_setup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mulmod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_n_root.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_neg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_or.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_fermat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_divisible.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_prime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_miller_rabin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_next_prime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_rabin_miller_trials.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_random_ex.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_size.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_smap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_radix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_signed_bin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_unsigned_bin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_l.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup_l.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k_l.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_setup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rshd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set_int.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_shrink.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_signed_bin_size.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrmod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub_d.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_submod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin_n.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin_n.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_mul.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_sqr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix_n.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_unsigned_bin_size.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_xor.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero_multi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_prime_tab.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_reverse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_add.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_exptmod.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_digs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_high_digs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sqr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sub.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@libtommath/$(DEPDIR)/libhcrypto_la-bncore.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libtommath/libhcrypto_la-bncore.lo: libtommath/bncore.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bncore.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bncore.Tpo -c -o libtommath/libhcrypto_la-bncore.lo `test -f 'libtommath/bncore.c' || echo '$(srcdir)/'`libtommath/bncore.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bncore.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bncore.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bncore.c' object='libtommath/libhcrypto_la-bncore.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bncore.lo `test -f 'libtommath/bncore.c' || echo '$(srcdir)/'`libtommath/bncore.c + +libtommath/libhcrypto_la-bn_mp_init.lo: libtommath/bn_mp_init.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_init.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init.Tpo -c -o libtommath/libhcrypto_la-bn_mp_init.lo `test -f 'libtommath/bn_mp_init.c' || echo '$(srcdir)/'`libtommath/bn_mp_init.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_init.c' object='libtommath/libhcrypto_la-bn_mp_init.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_init.lo `test -f 'libtommath/bn_mp_init.c' || echo '$(srcdir)/'`libtommath/bn_mp_init.c + +libtommath/libhcrypto_la-bn_mp_clear.lo: libtommath/bn_mp_clear.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_clear.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear.Tpo -c -o libtommath/libhcrypto_la-bn_mp_clear.lo `test -f 'libtommath/bn_mp_clear.c' || echo '$(srcdir)/'`libtommath/bn_mp_clear.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_clear.c' object='libtommath/libhcrypto_la-bn_mp_clear.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_clear.lo `test -f 'libtommath/bn_mp_clear.c' || echo '$(srcdir)/'`libtommath/bn_mp_clear.c + +libtommath/libhcrypto_la-bn_mp_exch.lo: libtommath/bn_mp_exch.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_exch.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exch.Tpo -c -o libtommath/libhcrypto_la-bn_mp_exch.lo `test -f 'libtommath/bn_mp_exch.c' || echo '$(srcdir)/'`libtommath/bn_mp_exch.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exch.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exch.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_exch.c' object='libtommath/libhcrypto_la-bn_mp_exch.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_exch.lo `test -f 'libtommath/bn_mp_exch.c' || echo '$(srcdir)/'`libtommath/bn_mp_exch.c + +libtommath/libhcrypto_la-bn_mp_grow.lo: libtommath/bn_mp_grow.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_grow.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_grow.Tpo -c -o libtommath/libhcrypto_la-bn_mp_grow.lo `test -f 'libtommath/bn_mp_grow.c' || echo '$(srcdir)/'`libtommath/bn_mp_grow.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_grow.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_grow.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_grow.c' object='libtommath/libhcrypto_la-bn_mp_grow.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_grow.lo `test -f 'libtommath/bn_mp_grow.c' || echo '$(srcdir)/'`libtommath/bn_mp_grow.c + +libtommath/libhcrypto_la-bn_mp_shrink.lo: libtommath/bn_mp_shrink.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_shrink.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_shrink.Tpo -c -o libtommath/libhcrypto_la-bn_mp_shrink.lo `test -f 'libtommath/bn_mp_shrink.c' || echo '$(srcdir)/'`libtommath/bn_mp_shrink.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_shrink.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_shrink.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_shrink.c' object='libtommath/libhcrypto_la-bn_mp_shrink.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_shrink.lo `test -f 'libtommath/bn_mp_shrink.c' || echo '$(srcdir)/'`libtommath/bn_mp_shrink.c + +libtommath/libhcrypto_la-bn_mp_clamp.lo: libtommath/bn_mp_clamp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_clamp.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clamp.Tpo -c -o libtommath/libhcrypto_la-bn_mp_clamp.lo `test -f 'libtommath/bn_mp_clamp.c' || echo '$(srcdir)/'`libtommath/bn_mp_clamp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clamp.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clamp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_clamp.c' object='libtommath/libhcrypto_la-bn_mp_clamp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_clamp.lo `test -f 'libtommath/bn_mp_clamp.c' || echo '$(srcdir)/'`libtommath/bn_mp_clamp.c + +libtommath/libhcrypto_la-bn_mp_zero.lo: libtommath/bn_mp_zero.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_zero.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero.Tpo -c -o libtommath/libhcrypto_la-bn_mp_zero.lo `test -f 'libtommath/bn_mp_zero.c' || echo '$(srcdir)/'`libtommath/bn_mp_zero.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_zero.c' object='libtommath/libhcrypto_la-bn_mp_zero.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_zero.lo `test -f 'libtommath/bn_mp_zero.c' || echo '$(srcdir)/'`libtommath/bn_mp_zero.c + +libtommath/libhcrypto_la-bn_mp_zero_multi.lo: libtommath/bn_mp_zero_multi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_zero_multi.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero_multi.Tpo -c -o libtommath/libhcrypto_la-bn_mp_zero_multi.lo `test -f 'libtommath/bn_mp_zero_multi.c' || echo '$(srcdir)/'`libtommath/bn_mp_zero_multi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero_multi.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero_multi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_zero_multi.c' object='libtommath/libhcrypto_la-bn_mp_zero_multi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_zero_multi.lo `test -f 'libtommath/bn_mp_zero_multi.c' || echo '$(srcdir)/'`libtommath/bn_mp_zero_multi.c + +libtommath/libhcrypto_la-bn_mp_set.lo: libtommath/bn_mp_set.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_set.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set.Tpo -c -o libtommath/libhcrypto_la-bn_mp_set.lo `test -f 'libtommath/bn_mp_set.c' || echo '$(srcdir)/'`libtommath/bn_mp_set.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_set.c' object='libtommath/libhcrypto_la-bn_mp_set.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_set.lo `test -f 'libtommath/bn_mp_set.c' || echo '$(srcdir)/'`libtommath/bn_mp_set.c + +libtommath/libhcrypto_la-bn_mp_set_int.lo: libtommath/bn_mp_set_int.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_set_int.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set_int.Tpo -c -o libtommath/libhcrypto_la-bn_mp_set_int.lo `test -f 'libtommath/bn_mp_set_int.c' || echo '$(srcdir)/'`libtommath/bn_mp_set_int.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set_int.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set_int.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_set_int.c' object='libtommath/libhcrypto_la-bn_mp_set_int.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_set_int.lo `test -f 'libtommath/bn_mp_set_int.c' || echo '$(srcdir)/'`libtommath/bn_mp_set_int.c + +libtommath/libhcrypto_la-bn_mp_init_size.lo: libtommath/bn_mp_init_size.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_init_size.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_size.Tpo -c -o libtommath/libhcrypto_la-bn_mp_init_size.lo `test -f 'libtommath/bn_mp_init_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_size.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_size.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_size.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_init_size.c' object='libtommath/libhcrypto_la-bn_mp_init_size.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_init_size.lo `test -f 'libtommath/bn_mp_init_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_size.c + +libtommath/libhcrypto_la-bn_mp_copy.lo: libtommath/bn_mp_copy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_copy.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_copy.Tpo -c -o libtommath/libhcrypto_la-bn_mp_copy.lo `test -f 'libtommath/bn_mp_copy.c' || echo '$(srcdir)/'`libtommath/bn_mp_copy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_copy.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_copy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_copy.c' object='libtommath/libhcrypto_la-bn_mp_copy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_copy.lo `test -f 'libtommath/bn_mp_copy.c' || echo '$(srcdir)/'`libtommath/bn_mp_copy.c + +libtommath/libhcrypto_la-bn_mp_init_copy.lo: libtommath/bn_mp_init_copy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_init_copy.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_copy.Tpo -c -o libtommath/libhcrypto_la-bn_mp_init_copy.lo `test -f 'libtommath/bn_mp_init_copy.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_copy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_copy.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_copy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_init_copy.c' object='libtommath/libhcrypto_la-bn_mp_init_copy.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_init_copy.lo `test -f 'libtommath/bn_mp_init_copy.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_copy.c + +libtommath/libhcrypto_la-bn_mp_abs.lo: libtommath/bn_mp_abs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_abs.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_abs.Tpo -c -o libtommath/libhcrypto_la-bn_mp_abs.lo `test -f 'libtommath/bn_mp_abs.c' || echo '$(srcdir)/'`libtommath/bn_mp_abs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_abs.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_abs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_abs.c' object='libtommath/libhcrypto_la-bn_mp_abs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_abs.lo `test -f 'libtommath/bn_mp_abs.c' || echo '$(srcdir)/'`libtommath/bn_mp_abs.c + +libtommath/libhcrypto_la-bn_mp_neg.lo: libtommath/bn_mp_neg.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_neg.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_neg.Tpo -c -o libtommath/libhcrypto_la-bn_mp_neg.lo `test -f 'libtommath/bn_mp_neg.c' || echo '$(srcdir)/'`libtommath/bn_mp_neg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_neg.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_neg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_neg.c' object='libtommath/libhcrypto_la-bn_mp_neg.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_neg.lo `test -f 'libtommath/bn_mp_neg.c' || echo '$(srcdir)/'`libtommath/bn_mp_neg.c + +libtommath/libhcrypto_la-bn_mp_cmp_mag.lo: libtommath/bn_mp_cmp_mag.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_cmp_mag.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_mag.Tpo -c -o libtommath/libhcrypto_la-bn_mp_cmp_mag.lo `test -f 'libtommath/bn_mp_cmp_mag.c' || echo '$(srcdir)/'`libtommath/bn_mp_cmp_mag.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_mag.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_mag.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_cmp_mag.c' object='libtommath/libhcrypto_la-bn_mp_cmp_mag.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_cmp_mag.lo `test -f 'libtommath/bn_mp_cmp_mag.c' || echo '$(srcdir)/'`libtommath/bn_mp_cmp_mag.c + +libtommath/libhcrypto_la-bn_mp_cmp.lo: libtommath/bn_mp_cmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_cmp.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp.Tpo -c -o libtommath/libhcrypto_la-bn_mp_cmp.lo `test -f 'libtommath/bn_mp_cmp.c' || echo '$(srcdir)/'`libtommath/bn_mp_cmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_cmp.c' object='libtommath/libhcrypto_la-bn_mp_cmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_cmp.lo `test -f 'libtommath/bn_mp_cmp.c' || echo '$(srcdir)/'`libtommath/bn_mp_cmp.c + +libtommath/libhcrypto_la-bn_mp_cmp_d.lo: libtommath/bn_mp_cmp_d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_cmp_d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_cmp_d.lo `test -f 'libtommath/bn_mp_cmp_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_cmp_d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_cmp_d.c' object='libtommath/libhcrypto_la-bn_mp_cmp_d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_cmp_d.lo `test -f 'libtommath/bn_mp_cmp_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_cmp_d.c + +libtommath/libhcrypto_la-bn_mp_rshd.lo: libtommath/bn_mp_rshd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_rshd.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rshd.Tpo -c -o libtommath/libhcrypto_la-bn_mp_rshd.lo `test -f 'libtommath/bn_mp_rshd.c' || echo '$(srcdir)/'`libtommath/bn_mp_rshd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rshd.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rshd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_rshd.c' object='libtommath/libhcrypto_la-bn_mp_rshd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_rshd.lo `test -f 'libtommath/bn_mp_rshd.c' || echo '$(srcdir)/'`libtommath/bn_mp_rshd.c + +libtommath/libhcrypto_la-bn_mp_lshd.lo: libtommath/bn_mp_lshd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_lshd.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lshd.Tpo -c -o libtommath/libhcrypto_la-bn_mp_lshd.lo `test -f 'libtommath/bn_mp_lshd.c' || echo '$(srcdir)/'`libtommath/bn_mp_lshd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lshd.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lshd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_lshd.c' object='libtommath/libhcrypto_la-bn_mp_lshd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_lshd.lo `test -f 'libtommath/bn_mp_lshd.c' || echo '$(srcdir)/'`libtommath/bn_mp_lshd.c + +libtommath/libhcrypto_la-bn_mp_mod_2d.lo: libtommath/bn_mp_mod_2d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mod_2d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_2d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mod_2d.lo `test -f 'libtommath/bn_mp_mod_2d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mod_2d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_2d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_2d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mod_2d.c' object='libtommath/libhcrypto_la-bn_mp_mod_2d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mod_2d.lo `test -f 'libtommath/bn_mp_mod_2d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mod_2d.c + +libtommath/libhcrypto_la-bn_mp_div_2d.lo: libtommath/bn_mp_div_2d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_div_2d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_div_2d.lo `test -f 'libtommath/bn_mp_div_2d.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_2d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_div_2d.c' object='libtommath/libhcrypto_la-bn_mp_div_2d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_div_2d.lo `test -f 'libtommath/bn_mp_div_2d.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_2d.c + +libtommath/libhcrypto_la-bn_mp_mul_2d.lo: libtommath/bn_mp_mul_2d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mul_2d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mul_2d.lo `test -f 'libtommath/bn_mp_mul_2d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul_2d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mul_2d.c' object='libtommath/libhcrypto_la-bn_mp_mul_2d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mul_2d.lo `test -f 'libtommath/bn_mp_mul_2d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul_2d.c + +libtommath/libhcrypto_la-bn_mp_div_2.lo: libtommath/bn_mp_div_2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_div_2.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2.Tpo -c -o libtommath/libhcrypto_la-bn_mp_div_2.lo `test -f 'libtommath/bn_mp_div_2.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_div_2.c' object='libtommath/libhcrypto_la-bn_mp_div_2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_div_2.lo `test -f 'libtommath/bn_mp_div_2.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_2.c + +libtommath/libhcrypto_la-bn_mp_mul_2.lo: libtommath/bn_mp_mul_2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mul_2.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mul_2.lo `test -f 'libtommath/bn_mp_mul_2.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul_2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mul_2.c' object='libtommath/libhcrypto_la-bn_mp_mul_2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mul_2.lo `test -f 'libtommath/bn_mp_mul_2.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul_2.c + +libtommath/libhcrypto_la-bn_s_mp_add.lo: libtommath/bn_s_mp_add.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_s_mp_add.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_add.Tpo -c -o libtommath/libhcrypto_la-bn_s_mp_add.lo `test -f 'libtommath/bn_s_mp_add.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_add.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_add.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_add.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_s_mp_add.c' object='libtommath/libhcrypto_la-bn_s_mp_add.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_s_mp_add.lo `test -f 'libtommath/bn_s_mp_add.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_add.c + +libtommath/libhcrypto_la-bn_s_mp_sub.lo: libtommath/bn_s_mp_sub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_s_mp_sub.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sub.Tpo -c -o libtommath/libhcrypto_la-bn_s_mp_sub.lo `test -f 'libtommath/bn_s_mp_sub.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_sub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sub.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_s_mp_sub.c' object='libtommath/libhcrypto_la-bn_s_mp_sub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_s_mp_sub.lo `test -f 'libtommath/bn_s_mp_sub.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_sub.c + +libtommath/libhcrypto_la-bn_fast_s_mp_mul_digs.lo: libtommath/bn_fast_s_mp_mul_digs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_fast_s_mp_mul_digs.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_digs.Tpo -c -o libtommath/libhcrypto_la-bn_fast_s_mp_mul_digs.lo `test -f 'libtommath/bn_fast_s_mp_mul_digs.c' || echo '$(srcdir)/'`libtommath/bn_fast_s_mp_mul_digs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_digs.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_digs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_fast_s_mp_mul_digs.c' object='libtommath/libhcrypto_la-bn_fast_s_mp_mul_digs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_fast_s_mp_mul_digs.lo `test -f 'libtommath/bn_fast_s_mp_mul_digs.c' || echo '$(srcdir)/'`libtommath/bn_fast_s_mp_mul_digs.c + +libtommath/libhcrypto_la-bn_s_mp_mul_digs.lo: libtommath/bn_s_mp_mul_digs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_s_mp_mul_digs.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_digs.Tpo -c -o libtommath/libhcrypto_la-bn_s_mp_mul_digs.lo `test -f 'libtommath/bn_s_mp_mul_digs.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_mul_digs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_digs.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_digs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_s_mp_mul_digs.c' object='libtommath/libhcrypto_la-bn_s_mp_mul_digs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_s_mp_mul_digs.lo `test -f 'libtommath/bn_s_mp_mul_digs.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_mul_digs.c + +libtommath/libhcrypto_la-bn_fast_s_mp_mul_high_digs.lo: libtommath/bn_fast_s_mp_mul_high_digs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_fast_s_mp_mul_high_digs.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_high_digs.Tpo -c -o libtommath/libhcrypto_la-bn_fast_s_mp_mul_high_digs.lo `test -f 'libtommath/bn_fast_s_mp_mul_high_digs.c' || echo '$(srcdir)/'`libtommath/bn_fast_s_mp_mul_high_digs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_high_digs.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_high_digs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_fast_s_mp_mul_high_digs.c' object='libtommath/libhcrypto_la-bn_fast_s_mp_mul_high_digs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_fast_s_mp_mul_high_digs.lo `test -f 'libtommath/bn_fast_s_mp_mul_high_digs.c' || echo '$(srcdir)/'`libtommath/bn_fast_s_mp_mul_high_digs.c + +libtommath/libhcrypto_la-bn_s_mp_mul_high_digs.lo: libtommath/bn_s_mp_mul_high_digs.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_s_mp_mul_high_digs.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_high_digs.Tpo -c -o libtommath/libhcrypto_la-bn_s_mp_mul_high_digs.lo `test -f 'libtommath/bn_s_mp_mul_high_digs.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_mul_high_digs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_high_digs.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_high_digs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_s_mp_mul_high_digs.c' object='libtommath/libhcrypto_la-bn_s_mp_mul_high_digs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_s_mp_mul_high_digs.lo `test -f 'libtommath/bn_s_mp_mul_high_digs.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_mul_high_digs.c + +libtommath/libhcrypto_la-bn_fast_s_mp_sqr.lo: libtommath/bn_fast_s_mp_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_fast_s_mp_sqr.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_sqr.Tpo -c -o libtommath/libhcrypto_la-bn_fast_s_mp_sqr.lo `test -f 'libtommath/bn_fast_s_mp_sqr.c' || echo '$(srcdir)/'`libtommath/bn_fast_s_mp_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_sqr.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_sqr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_fast_s_mp_sqr.c' object='libtommath/libhcrypto_la-bn_fast_s_mp_sqr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_fast_s_mp_sqr.lo `test -f 'libtommath/bn_fast_s_mp_sqr.c' || echo '$(srcdir)/'`libtommath/bn_fast_s_mp_sqr.c + +libtommath/libhcrypto_la-bn_s_mp_sqr.lo: libtommath/bn_s_mp_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_s_mp_sqr.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sqr.Tpo -c -o libtommath/libhcrypto_la-bn_s_mp_sqr.lo `test -f 'libtommath/bn_s_mp_sqr.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sqr.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sqr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_s_mp_sqr.c' object='libtommath/libhcrypto_la-bn_s_mp_sqr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_s_mp_sqr.lo `test -f 'libtommath/bn_s_mp_sqr.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_sqr.c + +libtommath/libhcrypto_la-bn_mp_add.lo: libtommath/bn_mp_add.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_add.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add.Tpo -c -o libtommath/libhcrypto_la-bn_mp_add.lo `test -f 'libtommath/bn_mp_add.c' || echo '$(srcdir)/'`libtommath/bn_mp_add.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_add.c' object='libtommath/libhcrypto_la-bn_mp_add.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_add.lo `test -f 'libtommath/bn_mp_add.c' || echo '$(srcdir)/'`libtommath/bn_mp_add.c + +libtommath/libhcrypto_la-bn_mp_sub.lo: libtommath/bn_mp_sub.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_sub.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub.Tpo -c -o libtommath/libhcrypto_la-bn_mp_sub.lo `test -f 'libtommath/bn_mp_sub.c' || echo '$(srcdir)/'`libtommath/bn_mp_sub.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_sub.c' object='libtommath/libhcrypto_la-bn_mp_sub.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_sub.lo `test -f 'libtommath/bn_mp_sub.c' || echo '$(srcdir)/'`libtommath/bn_mp_sub.c + +libtommath/libhcrypto_la-bn_mp_karatsuba_mul.lo: libtommath/bn_mp_karatsuba_mul.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_karatsuba_mul.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_mul.Tpo -c -o libtommath/libhcrypto_la-bn_mp_karatsuba_mul.lo `test -f 'libtommath/bn_mp_karatsuba_mul.c' || echo '$(srcdir)/'`libtommath/bn_mp_karatsuba_mul.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_mul.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_mul.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_karatsuba_mul.c' object='libtommath/libhcrypto_la-bn_mp_karatsuba_mul.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_karatsuba_mul.lo `test -f 'libtommath/bn_mp_karatsuba_mul.c' || echo '$(srcdir)/'`libtommath/bn_mp_karatsuba_mul.c + +libtommath/libhcrypto_la-bn_mp_mul.lo: libtommath/bn_mp_mul.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mul.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mul.lo `test -f 'libtommath/bn_mp_mul.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mul.c' object='libtommath/libhcrypto_la-bn_mp_mul.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mul.lo `test -f 'libtommath/bn_mp_mul.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul.c + +libtommath/libhcrypto_la-bn_mp_karatsuba_sqr.lo: libtommath/bn_mp_karatsuba_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_karatsuba_sqr.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_sqr.Tpo -c -o libtommath/libhcrypto_la-bn_mp_karatsuba_sqr.lo `test -f 'libtommath/bn_mp_karatsuba_sqr.c' || echo '$(srcdir)/'`libtommath/bn_mp_karatsuba_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_sqr.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_sqr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_karatsuba_sqr.c' object='libtommath/libhcrypto_la-bn_mp_karatsuba_sqr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_karatsuba_sqr.lo `test -f 'libtommath/bn_mp_karatsuba_sqr.c' || echo '$(srcdir)/'`libtommath/bn_mp_karatsuba_sqr.c + +libtommath/libhcrypto_la-bn_mp_sqr.lo: libtommath/bn_mp_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_sqr.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqr.Tpo -c -o libtommath/libhcrypto_la-bn_mp_sqr.lo `test -f 'libtommath/bn_mp_sqr.c' || echo '$(srcdir)/'`libtommath/bn_mp_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqr.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_sqr.c' object='libtommath/libhcrypto_la-bn_mp_sqr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_sqr.lo `test -f 'libtommath/bn_mp_sqr.c' || echo '$(srcdir)/'`libtommath/bn_mp_sqr.c + +libtommath/libhcrypto_la-bn_mp_div.lo: libtommath/bn_mp_div.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_div.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div.Tpo -c -o libtommath/libhcrypto_la-bn_mp_div.lo `test -f 'libtommath/bn_mp_div.c' || echo '$(srcdir)/'`libtommath/bn_mp_div.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_div.c' object='libtommath/libhcrypto_la-bn_mp_div.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_div.lo `test -f 'libtommath/bn_mp_div.c' || echo '$(srcdir)/'`libtommath/bn_mp_div.c + +libtommath/libhcrypto_la-bn_mp_mod.lo: libtommath/bn_mp_mod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mod.lo `test -f 'libtommath/bn_mp_mod.c' || echo '$(srcdir)/'`libtommath/bn_mp_mod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mod.c' object='libtommath/libhcrypto_la-bn_mp_mod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mod.lo `test -f 'libtommath/bn_mp_mod.c' || echo '$(srcdir)/'`libtommath/bn_mp_mod.c + +libtommath/libhcrypto_la-bn_mp_add_d.lo: libtommath/bn_mp_add_d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_add_d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add_d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_add_d.lo `test -f 'libtommath/bn_mp_add_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_add_d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add_d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add_d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_add_d.c' object='libtommath/libhcrypto_la-bn_mp_add_d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_add_d.lo `test -f 'libtommath/bn_mp_add_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_add_d.c + +libtommath/libhcrypto_la-bn_mp_sub_d.lo: libtommath/bn_mp_sub_d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_sub_d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub_d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_sub_d.lo `test -f 'libtommath/bn_mp_sub_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_sub_d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub_d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub_d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_sub_d.c' object='libtommath/libhcrypto_la-bn_mp_sub_d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_sub_d.lo `test -f 'libtommath/bn_mp_sub_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_sub_d.c + +libtommath/libhcrypto_la-bn_mp_mul_d.lo: libtommath/bn_mp_mul_d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mul_d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mul_d.lo `test -f 'libtommath/bn_mp_mul_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul_d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mul_d.c' object='libtommath/libhcrypto_la-bn_mp_mul_d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mul_d.lo `test -f 'libtommath/bn_mp_mul_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mul_d.c + +libtommath/libhcrypto_la-bn_mp_div_d.lo: libtommath/bn_mp_div_d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_div_d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_div_d.lo `test -f 'libtommath/bn_mp_div_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_div_d.c' object='libtommath/libhcrypto_la-bn_mp_div_d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_div_d.lo `test -f 'libtommath/bn_mp_div_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_d.c + +libtommath/libhcrypto_la-bn_mp_mod_d.lo: libtommath/bn_mp_mod_d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mod_d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mod_d.lo `test -f 'libtommath/bn_mp_mod_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mod_d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mod_d.c' object='libtommath/libhcrypto_la-bn_mp_mod_d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mod_d.lo `test -f 'libtommath/bn_mp_mod_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_mod_d.c + +libtommath/libhcrypto_la-bn_mp_expt_d.lo: libtommath/bn_mp_expt_d.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_expt_d.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_expt_d.Tpo -c -o libtommath/libhcrypto_la-bn_mp_expt_d.lo `test -f 'libtommath/bn_mp_expt_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_expt_d.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_expt_d.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_expt_d.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_expt_d.c' object='libtommath/libhcrypto_la-bn_mp_expt_d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_expt_d.lo `test -f 'libtommath/bn_mp_expt_d.c' || echo '$(srcdir)/'`libtommath/bn_mp_expt_d.c + +libtommath/libhcrypto_la-bn_mp_addmod.lo: libtommath/bn_mp_addmod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_addmod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_addmod.Tpo -c -o libtommath/libhcrypto_la-bn_mp_addmod.lo `test -f 'libtommath/bn_mp_addmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_addmod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_addmod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_addmod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_addmod.c' object='libtommath/libhcrypto_la-bn_mp_addmod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_addmod.lo `test -f 'libtommath/bn_mp_addmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_addmod.c + +libtommath/libhcrypto_la-bn_mp_submod.lo: libtommath/bn_mp_submod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_submod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_submod.Tpo -c -o libtommath/libhcrypto_la-bn_mp_submod.lo `test -f 'libtommath/bn_mp_submod.c' || echo '$(srcdir)/'`libtommath/bn_mp_submod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_submod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_submod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_submod.c' object='libtommath/libhcrypto_la-bn_mp_submod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_submod.lo `test -f 'libtommath/bn_mp_submod.c' || echo '$(srcdir)/'`libtommath/bn_mp_submod.c + +libtommath/libhcrypto_la-bn_mp_mulmod.lo: libtommath/bn_mp_mulmod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_mulmod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mulmod.Tpo -c -o libtommath/libhcrypto_la-bn_mp_mulmod.lo `test -f 'libtommath/bn_mp_mulmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_mulmod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mulmod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mulmod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_mulmod.c' object='libtommath/libhcrypto_la-bn_mp_mulmod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_mulmod.lo `test -f 'libtommath/bn_mp_mulmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_mulmod.c + +libtommath/libhcrypto_la-bn_mp_sqrmod.lo: libtommath/bn_mp_sqrmod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_sqrmod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrmod.Tpo -c -o libtommath/libhcrypto_la-bn_mp_sqrmod.lo `test -f 'libtommath/bn_mp_sqrmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_sqrmod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrmod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrmod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_sqrmod.c' object='libtommath/libhcrypto_la-bn_mp_sqrmod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_sqrmod.lo `test -f 'libtommath/bn_mp_sqrmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_sqrmod.c + +libtommath/libhcrypto_la-bn_mp_gcd.lo: libtommath/bn_mp_gcd.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_gcd.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_gcd.Tpo -c -o libtommath/libhcrypto_la-bn_mp_gcd.lo `test -f 'libtommath/bn_mp_gcd.c' || echo '$(srcdir)/'`libtommath/bn_mp_gcd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_gcd.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_gcd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_gcd.c' object='libtommath/libhcrypto_la-bn_mp_gcd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_gcd.lo `test -f 'libtommath/bn_mp_gcd.c' || echo '$(srcdir)/'`libtommath/bn_mp_gcd.c + +libtommath/libhcrypto_la-bn_mp_lcm.lo: libtommath/bn_mp_lcm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_lcm.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lcm.Tpo -c -o libtommath/libhcrypto_la-bn_mp_lcm.lo `test -f 'libtommath/bn_mp_lcm.c' || echo '$(srcdir)/'`libtommath/bn_mp_lcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lcm.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_lcm.c' object='libtommath/libhcrypto_la-bn_mp_lcm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_lcm.lo `test -f 'libtommath/bn_mp_lcm.c' || echo '$(srcdir)/'`libtommath/bn_mp_lcm.c + +libtommath/libhcrypto_la-bn_fast_mp_invmod.lo: libtommath/bn_fast_mp_invmod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_fast_mp_invmod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_invmod.Tpo -c -o libtommath/libhcrypto_la-bn_fast_mp_invmod.lo `test -f 'libtommath/bn_fast_mp_invmod.c' || echo '$(srcdir)/'`libtommath/bn_fast_mp_invmod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_invmod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_invmod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_fast_mp_invmod.c' object='libtommath/libhcrypto_la-bn_fast_mp_invmod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_fast_mp_invmod.lo `test -f 'libtommath/bn_fast_mp_invmod.c' || echo '$(srcdir)/'`libtommath/bn_fast_mp_invmod.c + +libtommath/libhcrypto_la-bn_mp_invmod.lo: libtommath/bn_mp_invmod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_invmod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod.Tpo -c -o libtommath/libhcrypto_la-bn_mp_invmod.lo `test -f 'libtommath/bn_mp_invmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_invmod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_invmod.c' object='libtommath/libhcrypto_la-bn_mp_invmod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_invmod.lo `test -f 'libtommath/bn_mp_invmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_invmod.c + +libtommath/libhcrypto_la-bn_mp_reduce.lo: libtommath/bn_mp_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce.lo `test -f 'libtommath/bn_mp_reduce.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce.c' object='libtommath/libhcrypto_la-bn_mp_reduce.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce.lo `test -f 'libtommath/bn_mp_reduce.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce.c + +libtommath/libhcrypto_la-bn_mp_montgomery_setup.lo: libtommath/bn_mp_montgomery_setup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_montgomery_setup.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_setup.Tpo -c -o libtommath/libhcrypto_la-bn_mp_montgomery_setup.lo `test -f 'libtommath/bn_mp_montgomery_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_montgomery_setup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_setup.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_setup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_montgomery_setup.c' object='libtommath/libhcrypto_la-bn_mp_montgomery_setup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_montgomery_setup.lo `test -f 'libtommath/bn_mp_montgomery_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_montgomery_setup.c + +libtommath/libhcrypto_la-bn_fast_mp_montgomery_reduce.lo: libtommath/bn_fast_mp_montgomery_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_fast_mp_montgomery_reduce.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_montgomery_reduce.Tpo -c -o libtommath/libhcrypto_la-bn_fast_mp_montgomery_reduce.lo `test -f 'libtommath/bn_fast_mp_montgomery_reduce.c' || echo '$(srcdir)/'`libtommath/bn_fast_mp_montgomery_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_montgomery_reduce.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_montgomery_reduce.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_fast_mp_montgomery_reduce.c' object='libtommath/libhcrypto_la-bn_fast_mp_montgomery_reduce.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_fast_mp_montgomery_reduce.lo `test -f 'libtommath/bn_fast_mp_montgomery_reduce.c' || echo '$(srcdir)/'`libtommath/bn_fast_mp_montgomery_reduce.c + +libtommath/libhcrypto_la-bn_mp_montgomery_reduce.lo: libtommath/bn_mp_montgomery_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_montgomery_reduce.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_reduce.Tpo -c -o libtommath/libhcrypto_la-bn_mp_montgomery_reduce.lo `test -f 'libtommath/bn_mp_montgomery_reduce.c' || echo '$(srcdir)/'`libtommath/bn_mp_montgomery_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_reduce.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_reduce.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_montgomery_reduce.c' object='libtommath/libhcrypto_la-bn_mp_montgomery_reduce.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_montgomery_reduce.lo `test -f 'libtommath/bn_mp_montgomery_reduce.c' || echo '$(srcdir)/'`libtommath/bn_mp_montgomery_reduce.c + +libtommath/libhcrypto_la-bn_mp_exptmod_fast.lo: libtommath/bn_mp_exptmod_fast.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_exptmod_fast.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod_fast.Tpo -c -o libtommath/libhcrypto_la-bn_mp_exptmod_fast.lo `test -f 'libtommath/bn_mp_exptmod_fast.c' || echo '$(srcdir)/'`libtommath/bn_mp_exptmod_fast.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod_fast.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod_fast.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_exptmod_fast.c' object='libtommath/libhcrypto_la-bn_mp_exptmod_fast.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_exptmod_fast.lo `test -f 'libtommath/bn_mp_exptmod_fast.c' || echo '$(srcdir)/'`libtommath/bn_mp_exptmod_fast.c + +libtommath/libhcrypto_la-bn_mp_exptmod.lo: libtommath/bn_mp_exptmod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_exptmod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod.Tpo -c -o libtommath/libhcrypto_la-bn_mp_exptmod.lo `test -f 'libtommath/bn_mp_exptmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_exptmod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_exptmod.c' object='libtommath/libhcrypto_la-bn_mp_exptmod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_exptmod.lo `test -f 'libtommath/bn_mp_exptmod.c' || echo '$(srcdir)/'`libtommath/bn_mp_exptmod.c + +libtommath/libhcrypto_la-bn_mp_2expt.lo: libtommath/bn_mp_2expt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_2expt.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_2expt.Tpo -c -o libtommath/libhcrypto_la-bn_mp_2expt.lo `test -f 'libtommath/bn_mp_2expt.c' || echo '$(srcdir)/'`libtommath/bn_mp_2expt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_2expt.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_2expt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_2expt.c' object='libtommath/libhcrypto_la-bn_mp_2expt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_2expt.lo `test -f 'libtommath/bn_mp_2expt.c' || echo '$(srcdir)/'`libtommath/bn_mp_2expt.c + +libtommath/libhcrypto_la-bn_mp_n_root.lo: libtommath/bn_mp_n_root.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_n_root.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_n_root.Tpo -c -o libtommath/libhcrypto_la-bn_mp_n_root.lo `test -f 'libtommath/bn_mp_n_root.c' || echo '$(srcdir)/'`libtommath/bn_mp_n_root.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_n_root.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_n_root.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_n_root.c' object='libtommath/libhcrypto_la-bn_mp_n_root.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_n_root.lo `test -f 'libtommath/bn_mp_n_root.c' || echo '$(srcdir)/'`libtommath/bn_mp_n_root.c + +libtommath/libhcrypto_la-bn_mp_jacobi.lo: libtommath/bn_mp_jacobi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_jacobi.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_jacobi.Tpo -c -o libtommath/libhcrypto_la-bn_mp_jacobi.lo `test -f 'libtommath/bn_mp_jacobi.c' || echo '$(srcdir)/'`libtommath/bn_mp_jacobi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_jacobi.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_jacobi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_jacobi.c' object='libtommath/libhcrypto_la-bn_mp_jacobi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_jacobi.lo `test -f 'libtommath/bn_mp_jacobi.c' || echo '$(srcdir)/'`libtommath/bn_mp_jacobi.c + +libtommath/libhcrypto_la-bn_reverse.lo: libtommath/bn_reverse.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_reverse.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_reverse.Tpo -c -o libtommath/libhcrypto_la-bn_reverse.lo `test -f 'libtommath/bn_reverse.c' || echo '$(srcdir)/'`libtommath/bn_reverse.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_reverse.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_reverse.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_reverse.c' object='libtommath/libhcrypto_la-bn_reverse.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_reverse.lo `test -f 'libtommath/bn_reverse.c' || echo '$(srcdir)/'`libtommath/bn_reverse.c + +libtommath/libhcrypto_la-bn_mp_count_bits.lo: libtommath/bn_mp_count_bits.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_count_bits.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_count_bits.Tpo -c -o libtommath/libhcrypto_la-bn_mp_count_bits.lo `test -f 'libtommath/bn_mp_count_bits.c' || echo '$(srcdir)/'`libtommath/bn_mp_count_bits.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_count_bits.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_count_bits.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_count_bits.c' object='libtommath/libhcrypto_la-bn_mp_count_bits.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_count_bits.lo `test -f 'libtommath/bn_mp_count_bits.c' || echo '$(srcdir)/'`libtommath/bn_mp_count_bits.c + +libtommath/libhcrypto_la-bn_mp_read_unsigned_bin.lo: libtommath/bn_mp_read_unsigned_bin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_read_unsigned_bin.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_unsigned_bin.Tpo -c -o libtommath/libhcrypto_la-bn_mp_read_unsigned_bin.lo `test -f 'libtommath/bn_mp_read_unsigned_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_read_unsigned_bin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_unsigned_bin.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_unsigned_bin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_read_unsigned_bin.c' object='libtommath/libhcrypto_la-bn_mp_read_unsigned_bin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_read_unsigned_bin.lo `test -f 'libtommath/bn_mp_read_unsigned_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_read_unsigned_bin.c + +libtommath/libhcrypto_la-bn_mp_read_signed_bin.lo: libtommath/bn_mp_read_signed_bin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_read_signed_bin.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_signed_bin.Tpo -c -o libtommath/libhcrypto_la-bn_mp_read_signed_bin.lo `test -f 'libtommath/bn_mp_read_signed_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_read_signed_bin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_signed_bin.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_signed_bin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_read_signed_bin.c' object='libtommath/libhcrypto_la-bn_mp_read_signed_bin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_read_signed_bin.lo `test -f 'libtommath/bn_mp_read_signed_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_read_signed_bin.c + +libtommath/libhcrypto_la-bn_mp_to_unsigned_bin.lo: libtommath/bn_mp_to_unsigned_bin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_to_unsigned_bin.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin.Tpo -c -o libtommath/libhcrypto_la-bn_mp_to_unsigned_bin.lo `test -f 'libtommath/bn_mp_to_unsigned_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_unsigned_bin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_to_unsigned_bin.c' object='libtommath/libhcrypto_la-bn_mp_to_unsigned_bin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_to_unsigned_bin.lo `test -f 'libtommath/bn_mp_to_unsigned_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_unsigned_bin.c + +libtommath/libhcrypto_la-bn_mp_to_signed_bin.lo: libtommath/bn_mp_to_signed_bin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_to_signed_bin.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin.Tpo -c -o libtommath/libhcrypto_la-bn_mp_to_signed_bin.lo `test -f 'libtommath/bn_mp_to_signed_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_signed_bin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_to_signed_bin.c' object='libtommath/libhcrypto_la-bn_mp_to_signed_bin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_to_signed_bin.lo `test -f 'libtommath/bn_mp_to_signed_bin.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_signed_bin.c + +libtommath/libhcrypto_la-bn_mp_unsigned_bin_size.lo: libtommath/bn_mp_unsigned_bin_size.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_unsigned_bin_size.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_unsigned_bin_size.Tpo -c -o libtommath/libhcrypto_la-bn_mp_unsigned_bin_size.lo `test -f 'libtommath/bn_mp_unsigned_bin_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_unsigned_bin_size.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_unsigned_bin_size.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_unsigned_bin_size.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_unsigned_bin_size.c' object='libtommath/libhcrypto_la-bn_mp_unsigned_bin_size.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_unsigned_bin_size.lo `test -f 'libtommath/bn_mp_unsigned_bin_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_unsigned_bin_size.c + +libtommath/libhcrypto_la-bn_mp_signed_bin_size.lo: libtommath/bn_mp_signed_bin_size.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_signed_bin_size.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_signed_bin_size.Tpo -c -o libtommath/libhcrypto_la-bn_mp_signed_bin_size.lo `test -f 'libtommath/bn_mp_signed_bin_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_signed_bin_size.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_signed_bin_size.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_signed_bin_size.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_signed_bin_size.c' object='libtommath/libhcrypto_la-bn_mp_signed_bin_size.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_signed_bin_size.lo `test -f 'libtommath/bn_mp_signed_bin_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_signed_bin_size.c + +libtommath/libhcrypto_la-bn_mp_xor.lo: libtommath/bn_mp_xor.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_xor.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_xor.Tpo -c -o libtommath/libhcrypto_la-bn_mp_xor.lo `test -f 'libtommath/bn_mp_xor.c' || echo '$(srcdir)/'`libtommath/bn_mp_xor.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_xor.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_xor.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_xor.c' object='libtommath/libhcrypto_la-bn_mp_xor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_xor.lo `test -f 'libtommath/bn_mp_xor.c' || echo '$(srcdir)/'`libtommath/bn_mp_xor.c + +libtommath/libhcrypto_la-bn_mp_and.lo: libtommath/bn_mp_and.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_and.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_and.Tpo -c -o libtommath/libhcrypto_la-bn_mp_and.lo `test -f 'libtommath/bn_mp_and.c' || echo '$(srcdir)/'`libtommath/bn_mp_and.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_and.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_and.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_and.c' object='libtommath/libhcrypto_la-bn_mp_and.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_and.lo `test -f 'libtommath/bn_mp_and.c' || echo '$(srcdir)/'`libtommath/bn_mp_and.c + +libtommath/libhcrypto_la-bn_mp_or.lo: libtommath/bn_mp_or.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_or.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_or.Tpo -c -o libtommath/libhcrypto_la-bn_mp_or.lo `test -f 'libtommath/bn_mp_or.c' || echo '$(srcdir)/'`libtommath/bn_mp_or.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_or.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_or.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_or.c' object='libtommath/libhcrypto_la-bn_mp_or.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_or.lo `test -f 'libtommath/bn_mp_or.c' || echo '$(srcdir)/'`libtommath/bn_mp_or.c + +libtommath/libhcrypto_la-bn_mp_rand.lo: libtommath/bn_mp_rand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_rand.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rand.Tpo -c -o libtommath/libhcrypto_la-bn_mp_rand.lo `test -f 'libtommath/bn_mp_rand.c' || echo '$(srcdir)/'`libtommath/bn_mp_rand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rand.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_rand.c' object='libtommath/libhcrypto_la-bn_mp_rand.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_rand.lo `test -f 'libtommath/bn_mp_rand.c' || echo '$(srcdir)/'`libtommath/bn_mp_rand.c + +libtommath/libhcrypto_la-bn_mp_montgomery_calc_normalization.lo: libtommath/bn_mp_montgomery_calc_normalization.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_montgomery_calc_normalization.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_calc_normalization.Tpo -c -o libtommath/libhcrypto_la-bn_mp_montgomery_calc_normalization.lo `test -f 'libtommath/bn_mp_montgomery_calc_normalization.c' || echo '$(srcdir)/'`libtommath/bn_mp_montgomery_calc_normalization.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_calc_normalization.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_calc_normalization.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_montgomery_calc_normalization.c' object='libtommath/libhcrypto_la-bn_mp_montgomery_calc_normalization.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_montgomery_calc_normalization.lo `test -f 'libtommath/bn_mp_montgomery_calc_normalization.c' || echo '$(srcdir)/'`libtommath/bn_mp_montgomery_calc_normalization.c + +libtommath/libhcrypto_la-bn_mp_prime_is_divisible.lo: libtommath/bn_mp_prime_is_divisible.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_prime_is_divisible.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_divisible.Tpo -c -o libtommath/libhcrypto_la-bn_mp_prime_is_divisible.lo `test -f 'libtommath/bn_mp_prime_is_divisible.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_is_divisible.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_divisible.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_divisible.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_prime_is_divisible.c' object='libtommath/libhcrypto_la-bn_mp_prime_is_divisible.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_prime_is_divisible.lo `test -f 'libtommath/bn_mp_prime_is_divisible.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_is_divisible.c + +libtommath/libhcrypto_la-bn_prime_tab.lo: libtommath/bn_prime_tab.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_prime_tab.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_prime_tab.Tpo -c -o libtommath/libhcrypto_la-bn_prime_tab.lo `test -f 'libtommath/bn_prime_tab.c' || echo '$(srcdir)/'`libtommath/bn_prime_tab.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_prime_tab.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_prime_tab.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_prime_tab.c' object='libtommath/libhcrypto_la-bn_prime_tab.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_prime_tab.lo `test -f 'libtommath/bn_prime_tab.c' || echo '$(srcdir)/'`libtommath/bn_prime_tab.c + +libtommath/libhcrypto_la-bn_mp_prime_fermat.lo: libtommath/bn_mp_prime_fermat.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_prime_fermat.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_fermat.Tpo -c -o libtommath/libhcrypto_la-bn_mp_prime_fermat.lo `test -f 'libtommath/bn_mp_prime_fermat.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_fermat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_fermat.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_fermat.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_prime_fermat.c' object='libtommath/libhcrypto_la-bn_mp_prime_fermat.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_prime_fermat.lo `test -f 'libtommath/bn_mp_prime_fermat.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_fermat.c + +libtommath/libhcrypto_la-bn_mp_prime_miller_rabin.lo: libtommath/bn_mp_prime_miller_rabin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_prime_miller_rabin.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_miller_rabin.Tpo -c -o libtommath/libhcrypto_la-bn_mp_prime_miller_rabin.lo `test -f 'libtommath/bn_mp_prime_miller_rabin.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_miller_rabin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_miller_rabin.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_miller_rabin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_prime_miller_rabin.c' object='libtommath/libhcrypto_la-bn_mp_prime_miller_rabin.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_prime_miller_rabin.lo `test -f 'libtommath/bn_mp_prime_miller_rabin.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_miller_rabin.c + +libtommath/libhcrypto_la-bn_mp_prime_is_prime.lo: libtommath/bn_mp_prime_is_prime.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_prime_is_prime.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_prime.Tpo -c -o libtommath/libhcrypto_la-bn_mp_prime_is_prime.lo `test -f 'libtommath/bn_mp_prime_is_prime.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_is_prime.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_prime.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_prime.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_prime_is_prime.c' object='libtommath/libhcrypto_la-bn_mp_prime_is_prime.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_prime_is_prime.lo `test -f 'libtommath/bn_mp_prime_is_prime.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_is_prime.c + +libtommath/libhcrypto_la-bn_mp_prime_next_prime.lo: libtommath/bn_mp_prime_next_prime.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_prime_next_prime.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_next_prime.Tpo -c -o libtommath/libhcrypto_la-bn_mp_prime_next_prime.lo `test -f 'libtommath/bn_mp_prime_next_prime.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_next_prime.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_next_prime.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_next_prime.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_prime_next_prime.c' object='libtommath/libhcrypto_la-bn_mp_prime_next_prime.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_prime_next_prime.lo `test -f 'libtommath/bn_mp_prime_next_prime.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_next_prime.c + +libtommath/libhcrypto_la-bn_mp_find_prime.lo: libtommath/bn_mp_find_prime.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_find_prime.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_find_prime.Tpo -c -o libtommath/libhcrypto_la-bn_mp_find_prime.lo `test -f 'libtommath/bn_mp_find_prime.c' || echo '$(srcdir)/'`libtommath/bn_mp_find_prime.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_find_prime.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_find_prime.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_find_prime.c' object='libtommath/libhcrypto_la-bn_mp_find_prime.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_find_prime.lo `test -f 'libtommath/bn_mp_find_prime.c' || echo '$(srcdir)/'`libtommath/bn_mp_find_prime.c + +libtommath/libhcrypto_la-bn_mp_dr_reduce.lo: libtommath/bn_mp_dr_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_dr_reduce.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_reduce.Tpo -c -o libtommath/libhcrypto_la-bn_mp_dr_reduce.lo `test -f 'libtommath/bn_mp_dr_reduce.c' || echo '$(srcdir)/'`libtommath/bn_mp_dr_reduce.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_reduce.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_reduce.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_dr_reduce.c' object='libtommath/libhcrypto_la-bn_mp_dr_reduce.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_dr_reduce.lo `test -f 'libtommath/bn_mp_dr_reduce.c' || echo '$(srcdir)/'`libtommath/bn_mp_dr_reduce.c + +libtommath/libhcrypto_la-bn_mp_dr_is_modulus.lo: libtommath/bn_mp_dr_is_modulus.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_dr_is_modulus.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_is_modulus.Tpo -c -o libtommath/libhcrypto_la-bn_mp_dr_is_modulus.lo `test -f 'libtommath/bn_mp_dr_is_modulus.c' || echo '$(srcdir)/'`libtommath/bn_mp_dr_is_modulus.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_is_modulus.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_is_modulus.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_dr_is_modulus.c' object='libtommath/libhcrypto_la-bn_mp_dr_is_modulus.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_dr_is_modulus.lo `test -f 'libtommath/bn_mp_dr_is_modulus.c' || echo '$(srcdir)/'`libtommath/bn_mp_dr_is_modulus.c + +libtommath/libhcrypto_la-bn_mp_dr_setup.lo: libtommath/bn_mp_dr_setup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_dr_setup.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_setup.Tpo -c -o libtommath/libhcrypto_la-bn_mp_dr_setup.lo `test -f 'libtommath/bn_mp_dr_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_dr_setup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_setup.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_setup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_dr_setup.c' object='libtommath/libhcrypto_la-bn_mp_dr_setup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_dr_setup.lo `test -f 'libtommath/bn_mp_dr_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_dr_setup.c + +libtommath/libhcrypto_la-bn_mp_reduce_setup.lo: libtommath/bn_mp_reduce_setup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce_setup.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_setup.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce_setup.lo `test -f 'libtommath/bn_mp_reduce_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_setup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_setup.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_setup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce_setup.c' object='libtommath/libhcrypto_la-bn_mp_reduce_setup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce_setup.lo `test -f 'libtommath/bn_mp_reduce_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_setup.c + +libtommath/libhcrypto_la-bn_mp_toom_mul.lo: libtommath/bn_mp_toom_mul.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_toom_mul.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_mul.Tpo -c -o libtommath/libhcrypto_la-bn_mp_toom_mul.lo `test -f 'libtommath/bn_mp_toom_mul.c' || echo '$(srcdir)/'`libtommath/bn_mp_toom_mul.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_mul.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_mul.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_toom_mul.c' object='libtommath/libhcrypto_la-bn_mp_toom_mul.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_toom_mul.lo `test -f 'libtommath/bn_mp_toom_mul.c' || echo '$(srcdir)/'`libtommath/bn_mp_toom_mul.c + +libtommath/libhcrypto_la-bn_mp_toom_sqr.lo: libtommath/bn_mp_toom_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_toom_sqr.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_sqr.Tpo -c -o libtommath/libhcrypto_la-bn_mp_toom_sqr.lo `test -f 'libtommath/bn_mp_toom_sqr.c' || echo '$(srcdir)/'`libtommath/bn_mp_toom_sqr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_sqr.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_sqr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_toom_sqr.c' object='libtommath/libhcrypto_la-bn_mp_toom_sqr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_toom_sqr.lo `test -f 'libtommath/bn_mp_toom_sqr.c' || echo '$(srcdir)/'`libtommath/bn_mp_toom_sqr.c + +libtommath/libhcrypto_la-bn_mp_div_3.lo: libtommath/bn_mp_div_3.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_div_3.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_3.Tpo -c -o libtommath/libhcrypto_la-bn_mp_div_3.lo `test -f 'libtommath/bn_mp_div_3.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_3.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_div_3.c' object='libtommath/libhcrypto_la-bn_mp_div_3.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_div_3.lo `test -f 'libtommath/bn_mp_div_3.c' || echo '$(srcdir)/'`libtommath/bn_mp_div_3.c + +libtommath/libhcrypto_la-bn_s_mp_exptmod.lo: libtommath/bn_s_mp_exptmod.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_s_mp_exptmod.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_exptmod.Tpo -c -o libtommath/libhcrypto_la-bn_s_mp_exptmod.lo `test -f 'libtommath/bn_s_mp_exptmod.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_exptmod.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_exptmod.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_exptmod.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_s_mp_exptmod.c' object='libtommath/libhcrypto_la-bn_s_mp_exptmod.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_s_mp_exptmod.lo `test -f 'libtommath/bn_s_mp_exptmod.c' || echo '$(srcdir)/'`libtommath/bn_s_mp_exptmod.c + +libtommath/libhcrypto_la-bn_mp_reduce_2k.lo: libtommath/bn_mp_reduce_2k.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce_2k.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k.lo `test -f 'libtommath/bn_mp_reduce_2k.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce_2k.c' object='libtommath/libhcrypto_la-bn_mp_reduce_2k.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k.lo `test -f 'libtommath/bn_mp_reduce_2k.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k.c + +libtommath/libhcrypto_la-bn_mp_reduce_is_2k.lo: libtommath/bn_mp_reduce_is_2k.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce_is_2k.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce_is_2k.lo `test -f 'libtommath/bn_mp_reduce_is_2k.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_is_2k.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce_is_2k.c' object='libtommath/libhcrypto_la-bn_mp_reduce_is_2k.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce_is_2k.lo `test -f 'libtommath/bn_mp_reduce_is_2k.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_is_2k.c + +libtommath/libhcrypto_la-bn_mp_reduce_2k_setup.lo: libtommath/bn_mp_reduce_2k_setup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce_2k_setup.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k_setup.lo `test -f 'libtommath/bn_mp_reduce_2k_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k_setup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce_2k_setup.c' object='libtommath/libhcrypto_la-bn_mp_reduce_2k_setup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k_setup.lo `test -f 'libtommath/bn_mp_reduce_2k_setup.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k_setup.c + +libtommath/libhcrypto_la-bn_mp_reduce_2k_l.lo: libtommath/bn_mp_reduce_2k_l.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce_2k_l.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_l.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k_l.lo `test -f 'libtommath/bn_mp_reduce_2k_l.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k_l.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_l.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_l.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce_2k_l.c' object='libtommath/libhcrypto_la-bn_mp_reduce_2k_l.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k_l.lo `test -f 'libtommath/bn_mp_reduce_2k_l.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k_l.c + +libtommath/libhcrypto_la-bn_mp_reduce_is_2k_l.lo: libtommath/bn_mp_reduce_is_2k_l.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce_is_2k_l.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k_l.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce_is_2k_l.lo `test -f 'libtommath/bn_mp_reduce_is_2k_l.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_is_2k_l.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k_l.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k_l.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce_is_2k_l.c' object='libtommath/libhcrypto_la-bn_mp_reduce_is_2k_l.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce_is_2k_l.lo `test -f 'libtommath/bn_mp_reduce_is_2k_l.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_is_2k_l.c + +libtommath/libhcrypto_la-bn_mp_reduce_2k_setup_l.lo: libtommath/bn_mp_reduce_2k_setup_l.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_reduce_2k_setup_l.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup_l.Tpo -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k_setup_l.lo `test -f 'libtommath/bn_mp_reduce_2k_setup_l.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k_setup_l.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup_l.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup_l.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_reduce_2k_setup_l.c' object='libtommath/libhcrypto_la-bn_mp_reduce_2k_setup_l.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_reduce_2k_setup_l.lo `test -f 'libtommath/bn_mp_reduce_2k_setup_l.c' || echo '$(srcdir)/'`libtommath/bn_mp_reduce_2k_setup_l.c + +libtommath/libhcrypto_la-bn_mp_radix_smap.lo: libtommath/bn_mp_radix_smap.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_radix_smap.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_smap.Tpo -c -o libtommath/libhcrypto_la-bn_mp_radix_smap.lo `test -f 'libtommath/bn_mp_radix_smap.c' || echo '$(srcdir)/'`libtommath/bn_mp_radix_smap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_smap.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_smap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_radix_smap.c' object='libtommath/libhcrypto_la-bn_mp_radix_smap.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_radix_smap.lo `test -f 'libtommath/bn_mp_radix_smap.c' || echo '$(srcdir)/'`libtommath/bn_mp_radix_smap.c + +libtommath/libhcrypto_la-bn_mp_read_radix.lo: libtommath/bn_mp_read_radix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_read_radix.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_radix.Tpo -c -o libtommath/libhcrypto_la-bn_mp_read_radix.lo `test -f 'libtommath/bn_mp_read_radix.c' || echo '$(srcdir)/'`libtommath/bn_mp_read_radix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_radix.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_radix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_read_radix.c' object='libtommath/libhcrypto_la-bn_mp_read_radix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_read_radix.lo `test -f 'libtommath/bn_mp_read_radix.c' || echo '$(srcdir)/'`libtommath/bn_mp_read_radix.c + +libtommath/libhcrypto_la-bn_mp_toradix.lo: libtommath/bn_mp_toradix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_toradix.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix.Tpo -c -o libtommath/libhcrypto_la-bn_mp_toradix.lo `test -f 'libtommath/bn_mp_toradix.c' || echo '$(srcdir)/'`libtommath/bn_mp_toradix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_toradix.c' object='libtommath/libhcrypto_la-bn_mp_toradix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_toradix.lo `test -f 'libtommath/bn_mp_toradix.c' || echo '$(srcdir)/'`libtommath/bn_mp_toradix.c + +libtommath/libhcrypto_la-bn_mp_radix_size.lo: libtommath/bn_mp_radix_size.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_radix_size.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_size.Tpo -c -o libtommath/libhcrypto_la-bn_mp_radix_size.lo `test -f 'libtommath/bn_mp_radix_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_radix_size.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_size.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_size.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_radix_size.c' object='libtommath/libhcrypto_la-bn_mp_radix_size.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_radix_size.lo `test -f 'libtommath/bn_mp_radix_size.c' || echo '$(srcdir)/'`libtommath/bn_mp_radix_size.c + +libtommath/libhcrypto_la-bn_mp_fread.lo: libtommath/bn_mp_fread.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_fread.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fread.Tpo -c -o libtommath/libhcrypto_la-bn_mp_fread.lo `test -f 'libtommath/bn_mp_fread.c' || echo '$(srcdir)/'`libtommath/bn_mp_fread.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fread.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fread.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_fread.c' object='libtommath/libhcrypto_la-bn_mp_fread.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_fread.lo `test -f 'libtommath/bn_mp_fread.c' || echo '$(srcdir)/'`libtommath/bn_mp_fread.c + +libtommath/libhcrypto_la-bn_mp_fwrite.lo: libtommath/bn_mp_fwrite.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_fwrite.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fwrite.Tpo -c -o libtommath/libhcrypto_la-bn_mp_fwrite.lo `test -f 'libtommath/bn_mp_fwrite.c' || echo '$(srcdir)/'`libtommath/bn_mp_fwrite.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fwrite.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fwrite.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_fwrite.c' object='libtommath/libhcrypto_la-bn_mp_fwrite.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_fwrite.lo `test -f 'libtommath/bn_mp_fwrite.c' || echo '$(srcdir)/'`libtommath/bn_mp_fwrite.c + +libtommath/libhcrypto_la-bn_mp_cnt_lsb.lo: libtommath/bn_mp_cnt_lsb.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_cnt_lsb.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cnt_lsb.Tpo -c -o libtommath/libhcrypto_la-bn_mp_cnt_lsb.lo `test -f 'libtommath/bn_mp_cnt_lsb.c' || echo '$(srcdir)/'`libtommath/bn_mp_cnt_lsb.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cnt_lsb.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cnt_lsb.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_cnt_lsb.c' object='libtommath/libhcrypto_la-bn_mp_cnt_lsb.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_cnt_lsb.lo `test -f 'libtommath/bn_mp_cnt_lsb.c' || echo '$(srcdir)/'`libtommath/bn_mp_cnt_lsb.c + +libtommath/libhcrypto_la-bn_error.lo: libtommath/bn_error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_error.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_error.Tpo -c -o libtommath/libhcrypto_la-bn_error.lo `test -f 'libtommath/bn_error.c' || echo '$(srcdir)/'`libtommath/bn_error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_error.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_error.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_error.c' object='libtommath/libhcrypto_la-bn_error.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_error.lo `test -f 'libtommath/bn_error.c' || echo '$(srcdir)/'`libtommath/bn_error.c + +libtommath/libhcrypto_la-bn_mp_init_multi.lo: libtommath/bn_mp_init_multi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_init_multi.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_multi.Tpo -c -o libtommath/libhcrypto_la-bn_mp_init_multi.lo `test -f 'libtommath/bn_mp_init_multi.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_multi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_multi.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_multi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_init_multi.c' object='libtommath/libhcrypto_la-bn_mp_init_multi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_init_multi.lo `test -f 'libtommath/bn_mp_init_multi.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_multi.c + +libtommath/libhcrypto_la-bn_mp_clear_multi.lo: libtommath/bn_mp_clear_multi.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_clear_multi.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear_multi.Tpo -c -o libtommath/libhcrypto_la-bn_mp_clear_multi.lo `test -f 'libtommath/bn_mp_clear_multi.c' || echo '$(srcdir)/'`libtommath/bn_mp_clear_multi.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear_multi.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear_multi.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_clear_multi.c' object='libtommath/libhcrypto_la-bn_mp_clear_multi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_clear_multi.lo `test -f 'libtommath/bn_mp_clear_multi.c' || echo '$(srcdir)/'`libtommath/bn_mp_clear_multi.c + +libtommath/libhcrypto_la-bn_mp_exteuclid.lo: libtommath/bn_mp_exteuclid.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_exteuclid.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exteuclid.Tpo -c -o libtommath/libhcrypto_la-bn_mp_exteuclid.lo `test -f 'libtommath/bn_mp_exteuclid.c' || echo '$(srcdir)/'`libtommath/bn_mp_exteuclid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exteuclid.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exteuclid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_exteuclid.c' object='libtommath/libhcrypto_la-bn_mp_exteuclid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_exteuclid.lo `test -f 'libtommath/bn_mp_exteuclid.c' || echo '$(srcdir)/'`libtommath/bn_mp_exteuclid.c + +libtommath/libhcrypto_la-bn_mp_toradix_n.lo: libtommath/bn_mp_toradix_n.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_toradix_n.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix_n.Tpo -c -o libtommath/libhcrypto_la-bn_mp_toradix_n.lo `test -f 'libtommath/bn_mp_toradix_n.c' || echo '$(srcdir)/'`libtommath/bn_mp_toradix_n.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix_n.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix_n.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_toradix_n.c' object='libtommath/libhcrypto_la-bn_mp_toradix_n.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_toradix_n.lo `test -f 'libtommath/bn_mp_toradix_n.c' || echo '$(srcdir)/'`libtommath/bn_mp_toradix_n.c + +libtommath/libhcrypto_la-bn_mp_prime_random_ex.lo: libtommath/bn_mp_prime_random_ex.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_prime_random_ex.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_random_ex.Tpo -c -o libtommath/libhcrypto_la-bn_mp_prime_random_ex.lo `test -f 'libtommath/bn_mp_prime_random_ex.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_random_ex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_random_ex.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_random_ex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_prime_random_ex.c' object='libtommath/libhcrypto_la-bn_mp_prime_random_ex.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_prime_random_ex.lo `test -f 'libtommath/bn_mp_prime_random_ex.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_random_ex.c + +libtommath/libhcrypto_la-bn_mp_get_int.lo: libtommath/bn_mp_get_int.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_get_int.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_get_int.Tpo -c -o libtommath/libhcrypto_la-bn_mp_get_int.lo `test -f 'libtommath/bn_mp_get_int.c' || echo '$(srcdir)/'`libtommath/bn_mp_get_int.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_get_int.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_get_int.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_get_int.c' object='libtommath/libhcrypto_la-bn_mp_get_int.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_get_int.lo `test -f 'libtommath/bn_mp_get_int.c' || echo '$(srcdir)/'`libtommath/bn_mp_get_int.c + +libtommath/libhcrypto_la-bn_mp_sqrt.lo: libtommath/bn_mp_sqrt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_sqrt.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrt.Tpo -c -o libtommath/libhcrypto_la-bn_mp_sqrt.lo `test -f 'libtommath/bn_mp_sqrt.c' || echo '$(srcdir)/'`libtommath/bn_mp_sqrt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrt.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_sqrt.c' object='libtommath/libhcrypto_la-bn_mp_sqrt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_sqrt.lo `test -f 'libtommath/bn_mp_sqrt.c' || echo '$(srcdir)/'`libtommath/bn_mp_sqrt.c + +libtommath/libhcrypto_la-bn_mp_is_square.lo: libtommath/bn_mp_is_square.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_is_square.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_is_square.Tpo -c -o libtommath/libhcrypto_la-bn_mp_is_square.lo `test -f 'libtommath/bn_mp_is_square.c' || echo '$(srcdir)/'`libtommath/bn_mp_is_square.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_is_square.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_is_square.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_is_square.c' object='libtommath/libhcrypto_la-bn_mp_is_square.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_is_square.lo `test -f 'libtommath/bn_mp_is_square.c' || echo '$(srcdir)/'`libtommath/bn_mp_is_square.c + +libtommath/libhcrypto_la-bn_mp_init_set.lo: libtommath/bn_mp_init_set.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_init_set.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set.Tpo -c -o libtommath/libhcrypto_la-bn_mp_init_set.lo `test -f 'libtommath/bn_mp_init_set.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_set.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_init_set.c' object='libtommath/libhcrypto_la-bn_mp_init_set.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_init_set.lo `test -f 'libtommath/bn_mp_init_set.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_set.c + +libtommath/libhcrypto_la-bn_mp_init_set_int.lo: libtommath/bn_mp_init_set_int.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_init_set_int.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set_int.Tpo -c -o libtommath/libhcrypto_la-bn_mp_init_set_int.lo `test -f 'libtommath/bn_mp_init_set_int.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_set_int.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set_int.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set_int.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_init_set_int.c' object='libtommath/libhcrypto_la-bn_mp_init_set_int.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_init_set_int.lo `test -f 'libtommath/bn_mp_init_set_int.c' || echo '$(srcdir)/'`libtommath/bn_mp_init_set_int.c + +libtommath/libhcrypto_la-bn_mp_invmod_slow.lo: libtommath/bn_mp_invmod_slow.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_invmod_slow.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod_slow.Tpo -c -o libtommath/libhcrypto_la-bn_mp_invmod_slow.lo `test -f 'libtommath/bn_mp_invmod_slow.c' || echo '$(srcdir)/'`libtommath/bn_mp_invmod_slow.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod_slow.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod_slow.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_invmod_slow.c' object='libtommath/libhcrypto_la-bn_mp_invmod_slow.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_invmod_slow.lo `test -f 'libtommath/bn_mp_invmod_slow.c' || echo '$(srcdir)/'`libtommath/bn_mp_invmod_slow.c + +libtommath/libhcrypto_la-bn_mp_prime_rabin_miller_trials.lo: libtommath/bn_mp_prime_rabin_miller_trials.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_prime_rabin_miller_trials.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_rabin_miller_trials.Tpo -c -o libtommath/libhcrypto_la-bn_mp_prime_rabin_miller_trials.lo `test -f 'libtommath/bn_mp_prime_rabin_miller_trials.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_rabin_miller_trials.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_rabin_miller_trials.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_rabin_miller_trials.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_prime_rabin_miller_trials.c' object='libtommath/libhcrypto_la-bn_mp_prime_rabin_miller_trials.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_prime_rabin_miller_trials.lo `test -f 'libtommath/bn_mp_prime_rabin_miller_trials.c' || echo '$(srcdir)/'`libtommath/bn_mp_prime_rabin_miller_trials.c + +libtommath/libhcrypto_la-bn_mp_to_signed_bin_n.lo: libtommath/bn_mp_to_signed_bin_n.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_to_signed_bin_n.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin_n.Tpo -c -o libtommath/libhcrypto_la-bn_mp_to_signed_bin_n.lo `test -f 'libtommath/bn_mp_to_signed_bin_n.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_signed_bin_n.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin_n.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin_n.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_to_signed_bin_n.c' object='libtommath/libhcrypto_la-bn_mp_to_signed_bin_n.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_to_signed_bin_n.lo `test -f 'libtommath/bn_mp_to_signed_bin_n.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_signed_bin_n.c + +libtommath/libhcrypto_la-bn_mp_to_unsigned_bin_n.lo: libtommath/bn_mp_to_unsigned_bin_n.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libtommath/libhcrypto_la-bn_mp_to_unsigned_bin_n.lo -MD -MP -MF libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin_n.Tpo -c -o libtommath/libhcrypto_la-bn_mp_to_unsigned_bin_n.lo `test -f 'libtommath/bn_mp_to_unsigned_bin_n.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_unsigned_bin_n.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin_n.Tpo libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin_n.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='libtommath/bn_mp_to_unsigned_bin_n.c' object='libtommath/libhcrypto_la-bn_mp_to_unsigned_bin_n.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libtommath/libhcrypto_la-bn_mp_to_unsigned_bin_n.lo `test -f 'libtommath/bn_mp_to_unsigned_bin_n.c' || echo '$(srcdir)/'`libtommath/bn_mp_to_unsigned_bin_n.c + +libhcrypto_la-aes.lo: aes.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-aes.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-aes.Tpo -c -o libhcrypto_la-aes.lo `test -f 'aes.c' || echo '$(srcdir)/'`aes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-aes.Tpo $(DEPDIR)/libhcrypto_la-aes.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aes.c' object='libhcrypto_la-aes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-aes.lo `test -f 'aes.c' || echo '$(srcdir)/'`aes.c + +libhcrypto_la-bn.lo: bn.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-bn.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-bn.Tpo -c -o libhcrypto_la-bn.lo `test -f 'bn.c' || echo '$(srcdir)/'`bn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-bn.Tpo $(DEPDIR)/libhcrypto_la-bn.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bn.c' object='libhcrypto_la-bn.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-bn.lo `test -f 'bn.c' || echo '$(srcdir)/'`bn.c + +libhcrypto_la-common.lo: common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-common.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-common.Tpo -c -o libhcrypto_la-common.lo `test -f 'common.c' || echo '$(srcdir)/'`common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-common.Tpo $(DEPDIR)/libhcrypto_la-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common.c' object='libhcrypto_la-common.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-common.lo `test -f 'common.c' || echo '$(srcdir)/'`common.c + +libhcrypto_la-camellia.lo: camellia.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-camellia.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-camellia.Tpo -c -o libhcrypto_la-camellia.lo `test -f 'camellia.c' || echo '$(srcdir)/'`camellia.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-camellia.Tpo $(DEPDIR)/libhcrypto_la-camellia.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='camellia.c' object='libhcrypto_la-camellia.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-camellia.lo `test -f 'camellia.c' || echo '$(srcdir)/'`camellia.c + +libhcrypto_la-camellia-ntt.lo: camellia-ntt.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-camellia-ntt.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-camellia-ntt.Tpo -c -o libhcrypto_la-camellia-ntt.lo `test -f 'camellia-ntt.c' || echo '$(srcdir)/'`camellia-ntt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-camellia-ntt.Tpo $(DEPDIR)/libhcrypto_la-camellia-ntt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='camellia-ntt.c' object='libhcrypto_la-camellia-ntt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-camellia-ntt.lo `test -f 'camellia-ntt.c' || echo '$(srcdir)/'`camellia-ntt.c + +libhcrypto_la-des.lo: des.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-des.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-des.Tpo -c -o libhcrypto_la-des.lo `test -f 'des.c' || echo '$(srcdir)/'`des.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-des.Tpo $(DEPDIR)/libhcrypto_la-des.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='des.c' object='libhcrypto_la-des.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-des.lo `test -f 'des.c' || echo '$(srcdir)/'`des.c + +libhcrypto_la-dh.lo: dh.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-dh.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-dh.Tpo -c -o libhcrypto_la-dh.lo `test -f 'dh.c' || echo '$(srcdir)/'`dh.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-dh.Tpo $(DEPDIR)/libhcrypto_la-dh.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dh.c' object='libhcrypto_la-dh.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-dh.lo `test -f 'dh.c' || echo '$(srcdir)/'`dh.c + +libhcrypto_la-dh-ltm.lo: dh-ltm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-dh-ltm.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-dh-ltm.Tpo -c -o libhcrypto_la-dh-ltm.lo `test -f 'dh-ltm.c' || echo '$(srcdir)/'`dh-ltm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-dh-ltm.Tpo $(DEPDIR)/libhcrypto_la-dh-ltm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dh-ltm.c' object='libhcrypto_la-dh-ltm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-dh-ltm.lo `test -f 'dh-ltm.c' || echo '$(srcdir)/'`dh-ltm.c + +libhcrypto_la-dsa.lo: dsa.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-dsa.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-dsa.Tpo -c -o libhcrypto_la-dsa.lo `test -f 'dsa.c' || echo '$(srcdir)/'`dsa.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-dsa.Tpo $(DEPDIR)/libhcrypto_la-dsa.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dsa.c' object='libhcrypto_la-dsa.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-dsa.lo `test -f 'dsa.c' || echo '$(srcdir)/'`dsa.c + +libhcrypto_la-doxygen.lo: doxygen.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-doxygen.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-doxygen.Tpo -c -o libhcrypto_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-doxygen.Tpo $(DEPDIR)/libhcrypto_la-doxygen.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='doxygen.c' object='libhcrypto_la-doxygen.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c + +libhcrypto_la-evp.lo: evp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-evp.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-evp.Tpo -c -o libhcrypto_la-evp.lo `test -f 'evp.c' || echo '$(srcdir)/'`evp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-evp.Tpo $(DEPDIR)/libhcrypto_la-evp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='evp.c' object='libhcrypto_la-evp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-evp.lo `test -f 'evp.c' || echo '$(srcdir)/'`evp.c + +libhcrypto_la-evp-hcrypto.lo: evp-hcrypto.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-evp-hcrypto.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-evp-hcrypto.Tpo -c -o libhcrypto_la-evp-hcrypto.lo `test -f 'evp-hcrypto.c' || echo '$(srcdir)/'`evp-hcrypto.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-evp-hcrypto.Tpo $(DEPDIR)/libhcrypto_la-evp-hcrypto.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='evp-hcrypto.c' object='libhcrypto_la-evp-hcrypto.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-evp-hcrypto.lo `test -f 'evp-hcrypto.c' || echo '$(srcdir)/'`evp-hcrypto.c + +libhcrypto_la-evp-cc.lo: evp-cc.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-evp-cc.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-evp-cc.Tpo -c -o libhcrypto_la-evp-cc.lo `test -f 'evp-cc.c' || echo '$(srcdir)/'`evp-cc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-evp-cc.Tpo $(DEPDIR)/libhcrypto_la-evp-cc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='evp-cc.c' object='libhcrypto_la-evp-cc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-evp-cc.lo `test -f 'evp-cc.c' || echo '$(srcdir)/'`evp-cc.c + +libhcrypto_la-evp-openssl.lo: evp-openssl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-evp-openssl.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-evp-openssl.Tpo -c -o libhcrypto_la-evp-openssl.lo `test -f 'evp-openssl.c' || echo '$(srcdir)/'`evp-openssl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-evp-openssl.Tpo $(DEPDIR)/libhcrypto_la-evp-openssl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='evp-openssl.c' object='libhcrypto_la-evp-openssl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-evp-openssl.lo `test -f 'evp-openssl.c' || echo '$(srcdir)/'`evp-openssl.c + +libhcrypto_la-evp-pkcs11.lo: evp-pkcs11.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-evp-pkcs11.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-evp-pkcs11.Tpo -c -o libhcrypto_la-evp-pkcs11.lo `test -f 'evp-pkcs11.c' || echo '$(srcdir)/'`evp-pkcs11.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-evp-pkcs11.Tpo $(DEPDIR)/libhcrypto_la-evp-pkcs11.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='evp-pkcs11.c' object='libhcrypto_la-evp-pkcs11.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-evp-pkcs11.lo `test -f 'evp-pkcs11.c' || echo '$(srcdir)/'`evp-pkcs11.c + +libhcrypto_la-engine.lo: engine.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-engine.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-engine.Tpo -c -o libhcrypto_la-engine.lo `test -f 'engine.c' || echo '$(srcdir)/'`engine.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-engine.Tpo $(DEPDIR)/libhcrypto_la-engine.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='engine.c' object='libhcrypto_la-engine.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-engine.lo `test -f 'engine.c' || echo '$(srcdir)/'`engine.c + +libhcrypto_la-hmac.lo: hmac.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-hmac.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-hmac.Tpo -c -o libhcrypto_la-hmac.lo `test -f 'hmac.c' || echo '$(srcdir)/'`hmac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-hmac.Tpo $(DEPDIR)/libhcrypto_la-hmac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hmac.c' object='libhcrypto_la-hmac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-hmac.lo `test -f 'hmac.c' || echo '$(srcdir)/'`hmac.c + +libhcrypto_la-md4.lo: md4.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-md4.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-md4.Tpo -c -o libhcrypto_la-md4.lo `test -f 'md4.c' || echo '$(srcdir)/'`md4.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-md4.Tpo $(DEPDIR)/libhcrypto_la-md4.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='md4.c' object='libhcrypto_la-md4.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-md4.lo `test -f 'md4.c' || echo '$(srcdir)/'`md4.c + +libhcrypto_la-md5.lo: md5.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-md5.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-md5.Tpo -c -o libhcrypto_la-md5.lo `test -f 'md5.c' || echo '$(srcdir)/'`md5.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-md5.Tpo $(DEPDIR)/libhcrypto_la-md5.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='md5.c' object='libhcrypto_la-md5.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-md5.lo `test -f 'md5.c' || echo '$(srcdir)/'`md5.c + +libhcrypto_la-pkcs5.lo: pkcs5.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-pkcs5.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-pkcs5.Tpo -c -o libhcrypto_la-pkcs5.lo `test -f 'pkcs5.c' || echo '$(srcdir)/'`pkcs5.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-pkcs5.Tpo $(DEPDIR)/libhcrypto_la-pkcs5.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pkcs5.c' object='libhcrypto_la-pkcs5.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-pkcs5.lo `test -f 'pkcs5.c' || echo '$(srcdir)/'`pkcs5.c + +libhcrypto_la-pkcs12.lo: pkcs12.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-pkcs12.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-pkcs12.Tpo -c -o libhcrypto_la-pkcs12.lo `test -f 'pkcs12.c' || echo '$(srcdir)/'`pkcs12.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-pkcs12.Tpo $(DEPDIR)/libhcrypto_la-pkcs12.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pkcs12.c' object='libhcrypto_la-pkcs12.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-pkcs12.lo `test -f 'pkcs12.c' || echo '$(srcdir)/'`pkcs12.c + +libhcrypto_la-rand-fortuna.lo: rand-fortuna.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rand-fortuna.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rand-fortuna.Tpo -c -o libhcrypto_la-rand-fortuna.lo `test -f 'rand-fortuna.c' || echo '$(srcdir)/'`rand-fortuna.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rand-fortuna.Tpo $(DEPDIR)/libhcrypto_la-rand-fortuna.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rand-fortuna.c' object='libhcrypto_la-rand-fortuna.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rand-fortuna.lo `test -f 'rand-fortuna.c' || echo '$(srcdir)/'`rand-fortuna.c + +libhcrypto_la-rand-timer.lo: rand-timer.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rand-timer.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rand-timer.Tpo -c -o libhcrypto_la-rand-timer.lo `test -f 'rand-timer.c' || echo '$(srcdir)/'`rand-timer.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rand-timer.Tpo $(DEPDIR)/libhcrypto_la-rand-timer.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rand-timer.c' object='libhcrypto_la-rand-timer.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rand-timer.lo `test -f 'rand-timer.c' || echo '$(srcdir)/'`rand-timer.c + +libhcrypto_la-rand-unix.lo: rand-unix.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rand-unix.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rand-unix.Tpo -c -o libhcrypto_la-rand-unix.lo `test -f 'rand-unix.c' || echo '$(srcdir)/'`rand-unix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rand-unix.Tpo $(DEPDIR)/libhcrypto_la-rand-unix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rand-unix.c' object='libhcrypto_la-rand-unix.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rand-unix.lo `test -f 'rand-unix.c' || echo '$(srcdir)/'`rand-unix.c + +libhcrypto_la-rand.lo: rand.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rand.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rand.Tpo -c -o libhcrypto_la-rand.lo `test -f 'rand.c' || echo '$(srcdir)/'`rand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rand.Tpo $(DEPDIR)/libhcrypto_la-rand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rand.c' object='libhcrypto_la-rand.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rand.lo `test -f 'rand.c' || echo '$(srcdir)/'`rand.c + +libhcrypto_la-rc2.lo: rc2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rc2.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rc2.Tpo -c -o libhcrypto_la-rc2.lo `test -f 'rc2.c' || echo '$(srcdir)/'`rc2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rc2.Tpo $(DEPDIR)/libhcrypto_la-rc2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rc2.c' object='libhcrypto_la-rc2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rc2.lo `test -f 'rc2.c' || echo '$(srcdir)/'`rc2.c + +libhcrypto_la-rc4.lo: rc4.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rc4.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rc4.Tpo -c -o libhcrypto_la-rc4.lo `test -f 'rc4.c' || echo '$(srcdir)/'`rc4.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rc4.Tpo $(DEPDIR)/libhcrypto_la-rc4.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rc4.c' object='libhcrypto_la-rc4.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rc4.lo `test -f 'rc4.c' || echo '$(srcdir)/'`rc4.c + +libhcrypto_la-rijndael-alg-fst.lo: rijndael-alg-fst.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rijndael-alg-fst.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rijndael-alg-fst.Tpo -c -o libhcrypto_la-rijndael-alg-fst.lo `test -f 'rijndael-alg-fst.c' || echo '$(srcdir)/'`rijndael-alg-fst.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rijndael-alg-fst.Tpo $(DEPDIR)/libhcrypto_la-rijndael-alg-fst.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rijndael-alg-fst.c' object='libhcrypto_la-rijndael-alg-fst.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rijndael-alg-fst.lo `test -f 'rijndael-alg-fst.c' || echo '$(srcdir)/'`rijndael-alg-fst.c + +libhcrypto_la-rnd_keys.lo: rnd_keys.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rnd_keys.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rnd_keys.Tpo -c -o libhcrypto_la-rnd_keys.lo `test -f 'rnd_keys.c' || echo '$(srcdir)/'`rnd_keys.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rnd_keys.Tpo $(DEPDIR)/libhcrypto_la-rnd_keys.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rnd_keys.c' object='libhcrypto_la-rnd_keys.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rnd_keys.lo `test -f 'rnd_keys.c' || echo '$(srcdir)/'`rnd_keys.c + +libhcrypto_la-rsa.lo: rsa.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rsa.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rsa.Tpo -c -o libhcrypto_la-rsa.lo `test -f 'rsa.c' || echo '$(srcdir)/'`rsa.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rsa.Tpo $(DEPDIR)/libhcrypto_la-rsa.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rsa.c' object='libhcrypto_la-rsa.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rsa.lo `test -f 'rsa.c' || echo '$(srcdir)/'`rsa.c + +libhcrypto_la-rsa-gmp.lo: rsa-gmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rsa-gmp.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rsa-gmp.Tpo -c -o libhcrypto_la-rsa-gmp.lo `test -f 'rsa-gmp.c' || echo '$(srcdir)/'`rsa-gmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rsa-gmp.Tpo $(DEPDIR)/libhcrypto_la-rsa-gmp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rsa-gmp.c' object='libhcrypto_la-rsa-gmp.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rsa-gmp.lo `test -f 'rsa-gmp.c' || echo '$(srcdir)/'`rsa-gmp.c + +libhcrypto_la-rsa-ltm.lo: rsa-ltm.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-rsa-ltm.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-rsa-ltm.Tpo -c -o libhcrypto_la-rsa-ltm.lo `test -f 'rsa-ltm.c' || echo '$(srcdir)/'`rsa-ltm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-rsa-ltm.Tpo $(DEPDIR)/libhcrypto_la-rsa-ltm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rsa-ltm.c' object='libhcrypto_la-rsa-ltm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-rsa-ltm.lo `test -f 'rsa-ltm.c' || echo '$(srcdir)/'`rsa-ltm.c + +libhcrypto_la-sha.lo: sha.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-sha.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-sha.Tpo -c -o libhcrypto_la-sha.lo `test -f 'sha.c' || echo '$(srcdir)/'`sha.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-sha.Tpo $(DEPDIR)/libhcrypto_la-sha.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha.c' object='libhcrypto_la-sha.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-sha.lo `test -f 'sha.c' || echo '$(srcdir)/'`sha.c + +libhcrypto_la-sha256.lo: sha256.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-sha256.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-sha256.Tpo -c -o libhcrypto_la-sha256.lo `test -f 'sha256.c' || echo '$(srcdir)/'`sha256.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-sha256.Tpo $(DEPDIR)/libhcrypto_la-sha256.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha256.c' object='libhcrypto_la-sha256.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-sha256.lo `test -f 'sha256.c' || echo '$(srcdir)/'`sha256.c + +libhcrypto_la-sha512.lo: sha512.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-sha512.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-sha512.Tpo -c -o libhcrypto_la-sha512.lo `test -f 'sha512.c' || echo '$(srcdir)/'`sha512.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-sha512.Tpo $(DEPDIR)/libhcrypto_la-sha512.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sha512.c' object='libhcrypto_la-sha512.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-sha512.lo `test -f 'sha512.c' || echo '$(srcdir)/'`sha512.c + +libhcrypto_la-validate.lo: validate.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-validate.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-validate.Tpo -c -o libhcrypto_la-validate.lo `test -f 'validate.c' || echo '$(srcdir)/'`validate.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-validate.Tpo $(DEPDIR)/libhcrypto_la-validate.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='validate.c' object='libhcrypto_la-validate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-validate.lo `test -f 'validate.c' || echo '$(srcdir)/'`validate.c + +libhcrypto_la-ui.lo: ui.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhcrypto_la-ui.lo -MD -MP -MF $(DEPDIR)/libhcrypto_la-ui.Tpo -c -o libhcrypto_la-ui.lo `test -f 'ui.c' || echo '$(srcdir)/'`ui.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhcrypto_la-ui.Tpo $(DEPDIR)/libhcrypto_la-ui.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ui.c' object='libhcrypto_la-ui.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhcrypto_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhcrypto_la-ui.lo `test -f 'ui.c' || echo '$(srcdir)/'`ui.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf libtommath/.libs libtommath/_libs +install-hcryptoincludeHEADERS: $(hcryptoinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(hcryptoinclude_HEADERS)'; test -n "$(hcryptoincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(hcryptoincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(hcryptoincludedir)" || 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)$(hcryptoincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(hcryptoincludedir)" || exit $$?; \ + done + +uninstall-hcryptoincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(hcryptoinclude_HEADERS)'; test -n "$(hcryptoincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(hcryptoincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) $(check_LTLIBRARIES) $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) $(check_LTLIBRARIES) $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +destest.log: destest$(EXEEXT) + @p='destest$(EXEEXT)'; \ + b='destest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +mdtest.log: mdtest$(EXEEXT) + @p='mdtest$(EXEEXT)'; \ + b='mdtest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +rc2test.log: rc2test$(EXEEXT) + @p='rc2test$(EXEEXT)'; \ + b='rc2test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +rctest.log: rctest$(EXEEXT) + @p='rctest$(EXEEXT)'; \ + b='rctest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_bn.log: test_bn$(EXEEXT) + @p='test_bn$(EXEEXT)'; \ + b='test_bn'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_bulk.log: test_bulk$(EXEEXT) + @p='test_bulk$(EXEEXT)'; \ + b='test_bulk'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_cipher.log: test_cipher$(EXEEXT) + @p='test_cipher$(EXEEXT)'; \ + b='test_cipher'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_engine_dso.log: test_engine_dso$(EXEEXT) + @p='test_engine_dso$(EXEEXT)'; \ + b='test_engine_dso'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_hmac.log: test_hmac$(EXEEXT) + @p='test_hmac$(EXEEXT)'; \ + b='test_hmac'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_pkcs12.log: test_pkcs12$(EXEEXT) + @p='test_pkcs12$(EXEEXT)'; \ + b='test_pkcs12'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_pkcs5.log: test_pkcs5$(EXEEXT) + @p='test_pkcs5$(EXEEXT)'; \ + b='test_pkcs5'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_crypto.log: test_crypto + @p='test_crypto'; \ + b='test_crypto'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_LTLIBRARIES) \ + $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local +install-checkPROGRAMS: install-libLTLIBRARIES + +install-checkLTLIBRARIES: install-libLTLIBRARIES + +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(hcryptoincludedir)"; 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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) + -rm -f libtommath/$(DEPDIR)/$(am__dirstamp) + -rm -f libtommath/$(am__dirstamp) + +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-checkLTLIBRARIES clean-checkPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/des.Plo + -rm -f ./$(DEPDIR)/destest.Po + -rm -f ./$(DEPDIR)/example_evp_cipher.Po + -rm -f ./$(DEPDIR)/libhcrypto_la-aes.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-bn.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-camellia-ntt.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-camellia.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-common.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-des.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-dh-ltm.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-dh.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-doxygen.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-dsa.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-engine.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-cc.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-hcrypto.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-openssl.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-pkcs11.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-hmac.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-md4.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-md5.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-pkcs12.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-pkcs5.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand-fortuna.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand-timer.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand-unix.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rc2.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rc4.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rijndael-alg-fst.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rnd_keys.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rsa-gmp.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rsa-ltm.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rsa.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-sha.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-sha256.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-sha512.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-ui.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-validate.Plo + -rm -f ./$(DEPDIR)/mdtest.Po + -rm -f ./$(DEPDIR)/rc2test.Po + -rm -f ./$(DEPDIR)/rctest.Po + -rm -f ./$(DEPDIR)/test_bn.Po + -rm -f ./$(DEPDIR)/test_bulk.Po + -rm -f ./$(DEPDIR)/test_cipher.Po + -rm -f ./$(DEPDIR)/test_dh.Po + -rm -f ./$(DEPDIR)/test_engine_dso.Po + -rm -f ./$(DEPDIR)/test_hmac.Po + -rm -f ./$(DEPDIR)/test_pkcs12.Po + -rm -f ./$(DEPDIR)/test_pkcs5.Po + -rm -f ./$(DEPDIR)/test_rand.Po + -rm -f ./$(DEPDIR)/test_rsa.Po + -rm -f ./$(DEPDIR)/ui.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_error.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_invmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_montgomery_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_high_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_2expt.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_abs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_addmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_and.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clamp.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear_multi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_mag.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cnt_lsb.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_copy.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_count_bits.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_3.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_is_modulus.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exch.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_expt_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod_fast.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exteuclid.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_find_prime.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fread.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fwrite.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_gcd.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_get_int.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_grow.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_copy.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_multi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set_int.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod_slow.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_is_square.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_jacobi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_mul.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lcm.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lshd.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_2d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_calc_normalization.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mulmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_n_root.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_neg.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_or.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_fermat.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_divisible.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_prime.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_miller_rabin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_next_prime.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_rabin_miller_trials.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_random_ex.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_smap.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rand.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_radix.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_signed_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_unsigned_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_l.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup_l.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k_l.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rshd.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set_int.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_shrink.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_signed_bin_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrt.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_submod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin_n.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin_n.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_mul.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix_n.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_unsigned_bin_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_xor.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero_multi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_prime_tab.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_reverse.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_add.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_exptmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_high_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sub.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bncore.Plo + -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-hcryptoincludeHEADERS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local 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 -f ./$(DEPDIR)/des.Plo + -rm -f ./$(DEPDIR)/destest.Po + -rm -f ./$(DEPDIR)/example_evp_cipher.Po + -rm -f ./$(DEPDIR)/libhcrypto_la-aes.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-bn.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-camellia-ntt.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-camellia.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-common.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-des.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-dh-ltm.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-dh.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-doxygen.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-dsa.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-engine.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-cc.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-hcrypto.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-openssl.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp-pkcs11.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-evp.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-hmac.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-md4.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-md5.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-pkcs12.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-pkcs5.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand-fortuna.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand-timer.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand-unix.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rand.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rc2.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rc4.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rijndael-alg-fst.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rnd_keys.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rsa-gmp.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rsa-ltm.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-rsa.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-sha.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-sha256.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-sha512.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-ui.Plo + -rm -f ./$(DEPDIR)/libhcrypto_la-validate.Plo + -rm -f ./$(DEPDIR)/mdtest.Po + -rm -f ./$(DEPDIR)/rc2test.Po + -rm -f ./$(DEPDIR)/rctest.Po + -rm -f ./$(DEPDIR)/test_bn.Po + -rm -f ./$(DEPDIR)/test_bulk.Po + -rm -f ./$(DEPDIR)/test_cipher.Po + -rm -f ./$(DEPDIR)/test_dh.Po + -rm -f ./$(DEPDIR)/test_engine_dso.Po + -rm -f ./$(DEPDIR)/test_hmac.Po + -rm -f ./$(DEPDIR)/test_pkcs12.Po + -rm -f ./$(DEPDIR)/test_pkcs5.Po + -rm -f ./$(DEPDIR)/test_rand.Po + -rm -f ./$(DEPDIR)/test_rsa.Po + -rm -f ./$(DEPDIR)/ui.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_error.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_invmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_mp_montgomery_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_mul_high_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_fast_s_mp_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_2expt.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_abs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_add_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_addmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_and.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clamp.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_clear_multi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cmp_mag.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_cnt_lsb.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_copy.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_count_bits.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_2d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_3.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_div_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_is_modulus.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_dr_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exch.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_expt_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exptmod_fast.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_exteuclid.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_find_prime.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fread.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_fwrite.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_gcd.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_get_int.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_grow.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_copy.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_multi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_set_int.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_init_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_invmod_slow.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_is_square.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_jacobi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_mul.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_karatsuba_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lcm.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_lshd.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_2d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mod_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_calc_normalization.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_montgomery_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_2d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mul_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_mulmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_n_root.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_neg.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_or.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_fermat.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_divisible.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_is_prime.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_miller_rabin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_next_prime.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_rabin_miller_trials.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_prime_random_ex.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_radix_smap.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rand.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_radix.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_signed_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_read_unsigned_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_l.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_2k_setup_l.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_is_2k_l.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_reduce_setup.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_rshd.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_set_int.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_shrink.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_signed_bin_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sqrt.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_sub_d.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_submod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_signed_bin_n.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_to_unsigned_bin_n.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_mul.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toom_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_toradix_n.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_unsigned_bin_size.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_xor.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_mp_zero_multi.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_prime_tab.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_reverse.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_add.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_exptmod.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_mul_high_digs.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sqr.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bn_s_mp_sub.Plo + -rm -f libtommath/$(DEPDIR)/libhcrypto_la-bncore.Plo + -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-hcryptoincludeHEADERS uninstall-libLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-checkLTLIBRARIES \ + clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-local \ + install-hcryptoincludeHEADERS install-html install-html-am \ + 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 recheck tags tags-am \ + uninstall uninstall-am uninstall-hcryptoincludeHEADERS \ + uninstall-hook uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +install-build-headers:: $(hcryptoinclude_HEADERS) + @foo='$(hcryptoinclude_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildhcryptoinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo "cp $$file $(buildhcryptoinclude)/$$f";\ + cp $$file $(buildhcryptoinclude)/$$f; \ + fi ; \ + done + +$(libhcrypto_la_OBJECTS) $(test_rand_OBJECTS): hcrypto-link +$(libhcrypto_la_OBJECTS): $(srcdir)/version-script.map + +hcrypto-link: + $(LN_S) $(srcdir)/../hcrypto hcrypto + touch hcrypto-link + +test_crypto: test_crypto.in Makefile + $(do_subst) < $(srcdir)/test_crypto.in > test_crypto.tmp + chmod +x test_crypto.tmp + mv test_crypto.tmp test_crypto + +# 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: diff --git a/crypto/heimdal/lib/hcrypto/NTMakefile b/crypto/heimdal/lib/hcrypto/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/NTMakefile @@ -0,0 +1,271 @@ +######################################################################## +# +# Copyright (c) 2009-2016, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +SUBDIRS=libtommath + +RELDIR=lib\hcrypto + +!include ../../windows/NTMakefile.w32 + +HCRYPTOINCLUDEDIR = $(INCDIR)\hcrypto + +HEIMBASEDIR = $(SRC)\lib\base + +HX509DIR = $(SRC)\lib\hx509 + +!ifdef INCLUDE_openssl_crypto +openssl_inc=-I$(INCLUDE_openssl_crypto) +!endif + +intcflags=-DKRB5 -DASN1_LIB -I$(HCRYPTOINCLUDEDIR) -DUSE_HCRYPTO_LTM=1 \ + -I$(HX509DIR) $(openssl_inc) + +# Do dependencies first + +all:: subdirs + +clean:: clean-subdirs + +test:: test-subdirs + +# Include files + +INCFILES= \ + $(HCRYPTOINCLUDEDIR)\aes.h \ + $(HCRYPTOINCLUDEDIR)\bn.h \ + $(HCRYPTOINCLUDEDIR)\des.h \ + $(HCRYPTOINCLUDEDIR)\dh.h \ + $(HCRYPTOINCLUDEDIR)\dsa.h \ + $(HCRYPTOINCLUDEDIR)\ec.h \ + $(HCRYPTOINCLUDEDIR)\ecdh.h \ + $(HCRYPTOINCLUDEDIR)\ecdsa.h \ + $(HCRYPTOINCLUDEDIR)\engine.h \ + $(HCRYPTOINCLUDEDIR)\evp.h \ + $(HCRYPTOINCLUDEDIR)\evp-hcrypto.h \ + $(HCRYPTOINCLUDEDIR)\evp-cc.h \ + $(HCRYPTOINCLUDEDIR)\evp-openssl.h \ + $(HCRYPTOINCLUDEDIR)\evp-pkcs11.h \ + $(HCRYPTOINCLUDEDIR)\evp-wincng.h \ + $(HCRYPTOINCLUDEDIR)\evp-w32.h \ + $(HCRYPTOINCLUDEDIR)\hmac.h \ + $(HCRYPTOINCLUDEDIR)\md4.h \ + $(HCRYPTOINCLUDEDIR)\md5.h \ + $(HCRYPTOINCLUDEDIR)\pkcs12.h \ + $(HCRYPTOINCLUDEDIR)\rand.h \ + $(HCRYPTOINCLUDEDIR)\randi.h \ + $(HCRYPTOINCLUDEDIR)\rc2.h \ + $(HCRYPTOINCLUDEDIR)\rc4.h \ + $(HCRYPTOINCLUDEDIR)\rsa.h \ + $(HCRYPTOINCLUDEDIR)\sha.h \ + $(HCRYPTOINCLUDEDIR)\ui.h \ + $(HCRYPTOINCLUDEDIR)\undef.h + +mkincdir: +!if !exist($(HCRYPTOINCLUDEDIR)) + $(MKDIR) $(HCRYPTOINCLUDEDIR) +!endif + +{}.h{$(HCRYPTOINCLUDEDIR)}.h: + $(CP) $** $@ + +all:: mkincdir + +all:: $(INCFILES) + +# libhcrypto + +libhcrypto_OBJs = \ + $(OBJ)\aes.obj \ + $(OBJ)\bn.obj \ + $(OBJ)\camellia.obj \ + $(OBJ)\camellia-ntt.obj \ + $(OBJ)\common.obj \ + $(OBJ)\des.obj \ + $(OBJ)\dh.obj \ + $(OBJ)\dh-ltm.obj \ + $(OBJ)\dh-tfm.obj \ + $(OBJ)\dsa.obj \ + $(OBJ)\evp.obj \ + $(OBJ)\evp-hcrypto.obj \ + $(OBJ)\evp-cc.obj \ + $(OBJ)\evp-openssl.obj \ + $(OBJ)\evp-pkcs11.obj \ + $(OBJ)\evp-wincng.obj \ + $(OBJ)\evp-w32.obj \ + $(OBJ)\engine.obj \ + $(OBJ)\hmac.obj \ + $(OBJ)\md4.obj \ + $(OBJ)\md5.obj \ + $(OBJ)\pkcs5.obj \ + $(OBJ)\pkcs12.obj \ + $(OBJ)\rand-w32.obj \ + $(OBJ)\rand.obj \ + $(OBJ)\rc2.obj \ + $(OBJ)\rc4.obj \ + $(OBJ)\rijndael-alg-fst.obj \ + $(OBJ)\rnd_keys.obj \ + $(OBJ)\rsa.obj \ + $(OBJ)\rsa-gmp.obj \ + $(OBJ)\rsa-ltm.obj \ + $(OBJ)\rsa-tfm.obj \ + $(OBJ)\sha.obj \ + $(OBJ)\sha256.obj \ + $(OBJ)\sha512.obj \ + $(OBJ)\ui.obj \ + $(OBJ)\validate.obj + +$(LIBHCRYPTO): $(libhcrypto_OBJs) + $(LIBCON) + +all:: $(LIBHCRYPTO) + +clean:: + -$(RM) $(LIBHCRYPTO) + +# Tests + +TESTLIB=$(OBJ)\libhctest.lib + +$(TESTLIB): \ + $(OBJ)\des.obj \ + $(OBJ)\ui.obj + $(LIBCON) + +test-binaries: \ + $(OBJ)\destest.exe \ + $(OBJ)\example_evp_cipher.exe \ + $(OBJ)\mdtest.exe \ + $(OBJ)\rc2test.exe \ + $(OBJ)\rctest.exe \ + $(OBJ)\test_bn.exe \ + $(OBJ)\test_bulk.exe \ + $(OBJ)\test_cipher.exe \ + $(OBJ)\test_engine_dso.exe \ + $(OBJ)\test_hmac.exe \ + $(OBJ)\test_pkcs5.exe \ + $(OBJ)\test_pkcs12.exe \ + $(OBJ)\test_rsa.exe \ + $(OBJ)\test_dh.exe \ + $(OBJ)\test_rand.exe \ + $(OBJ)\test_crypto.sh + +$(OBJ)\destest.exe: $(OBJ)\destest.obj $(TESTLIB) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\example_evp_cipher.exe: $(OBJ)\example_evp_cipher.obj $(TESTLIB) $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\mdtest.exe: $(OBJ)\mdtest.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) $(OBJ)\sha512.obj + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\rc2test.exe: $(OBJ)\rc2test.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\rctest.exe: $(OBJ)\rctest.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_bn.exe: $(OBJ)\test_bn.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_bulk.exe: $(OBJ)\test_bulk.obj $(TESTLIB) $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_cipher.exe: $(OBJ)\test_cipher.obj $(TESTLIB) $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_engine_dso.exe: $(OBJ)\test_engine_dso.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_hmac.exe: $(OBJ)\test_hmac.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_pkcs5.exe: $(OBJ)\test_pkcs5.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_pkcs12.exe: $(OBJ)\test_pkcs12.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_rsa.exe: $(OBJ)\test_rsa.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_dh.exe: $(OBJ)\test_dh.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_rand.exe: $(OBJ)\test_rand.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHEIMBASE) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +SRCDIR2=$(SRCDIR:\=\\\\) + +$(OBJ)\test_crypto.sh: test_crypto.in NTMakefile + $(SED) -e "s,[@]srcdir[@],$(SRCDIR2),g" -e "s,[@]exeext[@],.exe,g" -e "s,\r,," < test_crypto.in > $@ || $(RM) $@ + +test-run: + cd $(OBJ) +!ifdef SH + -$(SH) test_crypto.sh +!endif + -destest.exe + -mdtest.exe + -rc2test.exe + -rctest.exe + -test_bn.exe + -test_bulk.exe --provider=hcrypto + -test_bulk.exe --provider=w32crypto + -test_cipher.exe + -test_engine_dso.exe + -test_hmac.exe + -test_pkcs5.exe + -test_pkcs12.exe + -test_rsa.exe + -test_dh.exe + cd $(SRCDIR) + +test:: $(TESTLIB) test-binaries test-run + +test-exports: + $(PERL) ..\..\cf\w32-check-exported-symbols.pl --vs version-script.map --def libhcrypto-exports.def + +test:: test-exports diff --git a/crypto/heimdal/lib/hcrypto/aes.h b/crypto/heimdal/lib/hcrypto/aes.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/aes.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2003-2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_AES_H +#define HEIM_AES_H 1 + +/* symbol renaming */ +#define AES_set_encrypt_key hc_AES_set_encrypt_key +#define AES_set_decrypt_key hc_AES_decrypt_key +#define AES_encrypt hc_AES_encrypt +#define AES_decrypt hc_AES_decrypt +#define AES_cbc_encrypt hc_AES_cbc_encrypt +#define AES_cfb8_encrypt hc_AES_cfb8_encrypt + +/* + * + */ + +#define AES_BLOCK_SIZE 16 +#define AES_MAXNR 14 + +#define AES_ENCRYPT 1 +#define AES_DECRYPT 0 + +typedef struct aes_key { + uint32_t key[(AES_MAXNR+1)*4]; + int rounds; +} AES_KEY; + +#ifdef __cplusplus +extern "C" { +#endif + +int AES_set_encrypt_key(const unsigned char *, const int, AES_KEY *); +int AES_set_decrypt_key(const unsigned char *, const int, AES_KEY *); + +void AES_encrypt(const unsigned char *, unsigned char *, const AES_KEY *); +void AES_decrypt(const unsigned char *, unsigned char *, const AES_KEY *); + +void AES_cbc_encrypt(const unsigned char *, unsigned char *, + unsigned long, const AES_KEY *, + unsigned char *, int); +void AES_cfb8_encrypt(const unsigned char *, unsigned char *, + unsigned long, const AES_KEY *, + unsigned char *, int); + +#ifdef __cplusplus +} +#endif + +#endif /* HEIM_AES_H */ diff --git a/crypto/heimdal/lib/hcrypto/aes.c b/crypto/heimdal/lib/hcrypto/aes.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/aes.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2003 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifdef KRB5 +#include +#endif + +#include "rijndael-alg-fst.h" +#include "aes.h" + +int +AES_set_encrypt_key(const unsigned char *userkey, const int bits, AES_KEY *key) +{ + key->rounds = rijndaelKeySetupEnc(key->key, userkey, bits); + if (key->rounds == 0) + return -1; + return 0; +} + +int +AES_set_decrypt_key(const unsigned char *userkey, const int bits, AES_KEY *key) +{ + key->rounds = rijndaelKeySetupDec(key->key, userkey, bits); + if (key->rounds == 0) + return -1; + return 0; +} + +void +AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) +{ + rijndaelEncrypt(key->key, key->rounds, in, out); +} + +void +AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) +{ + rijndaelDecrypt(key->key, key->rounds, in, out); +} + +void +AES_cbc_encrypt(const unsigned char *in, unsigned char *out, + unsigned long size, const AES_KEY *key, + unsigned char *iv, int forward_encrypt) +{ + unsigned char tmp[AES_BLOCK_SIZE]; + int i; + + if (forward_encrypt) { + while (size >= AES_BLOCK_SIZE) { + for (i = 0; i < AES_BLOCK_SIZE; i++) + tmp[i] = in[i] ^ iv[i]; + AES_encrypt(tmp, out, key); + memcpy(iv, out, AES_BLOCK_SIZE); + size -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (size) { + for (i = 0; i < size; i++) + tmp[i] = in[i] ^ iv[i]; + for (i = size; i < AES_BLOCK_SIZE; i++) + tmp[i] = iv[i]; + AES_encrypt(tmp, out, key); + memcpy(iv, out, AES_BLOCK_SIZE); + } + } else { + while (size >= AES_BLOCK_SIZE) { + memcpy(tmp, in, AES_BLOCK_SIZE); + AES_decrypt(tmp, out, key); + for (i = 0; i < AES_BLOCK_SIZE; i++) + out[i] ^= iv[i]; + memcpy(iv, tmp, AES_BLOCK_SIZE); + size -= AES_BLOCK_SIZE; + in += AES_BLOCK_SIZE; + out += AES_BLOCK_SIZE; + } + if (size) { + memcpy(tmp, in, AES_BLOCK_SIZE); + AES_decrypt(tmp, out, key); + for (i = 0; i < size; i++) + out[i] ^= iv[i]; + memcpy(iv, tmp, AES_BLOCK_SIZE); + } + } +} + +void +AES_cfb8_encrypt(const unsigned char *in, unsigned char *out, + unsigned long size, const AES_KEY *key, + unsigned char *iv, int forward_encrypt) +{ + int i; + + for (i = 0; i < size; i++) { + unsigned char tmp[AES_BLOCK_SIZE + 1]; + + memcpy(tmp, iv, AES_BLOCK_SIZE); + AES_encrypt(iv, iv, key); + if (!forward_encrypt) { + tmp[AES_BLOCK_SIZE] = in[i]; + } + out[i] = in[i] ^ iv[0]; + if (forward_encrypt) { + tmp[AES_BLOCK_SIZE] = out[i]; + } + memcpy(iv, &tmp[1], AES_BLOCK_SIZE); + } +} diff --git a/crypto/heimdal/lib/hcrypto/bn.h b/crypto/heimdal/lib/hcrypto/bn.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/bn.h @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2006-2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * $Id$ + */ + +#ifndef _HEIM_BN_H +#define _HEIM_BN_H 1 + +/* symbol renaming */ +#define BN_GENCB_call hc_BN_GENCB_call +#define BN_GENCB_set hc_BN_GENCB_set +#define BN_bin2bn hc_BN_bin2bn +#define BN_bn2bin hc_BN_bn2bin +#define BN_bn2hex hc_BN_bn2hex +#define BN_clear hc_BN_clear +#define BN_clear_bit hc_BN_clear_bit +#define BN_clear_free hc_BN_clear_free +#define BN_cmp hc_BN_cmp +#define BN_dup hc_BN_dup +#define BN_free hc_BN_free +#define BN_is_negative hc_BN_is_negative +#define BN_get_word hc_BN_get_word +#define BN_hex2bn hc_BN_hex2bn +#define BN_is_bit_set hc_BN_is_bit_set +#define BN_new hc_BN_new +#define BN_num_bits hc_BN_num_bits +#define BN_num_bytes hc_BN_num_bytes +#define BN_rand hc_BN_rand +#define BN_set_bit hc_BN_set_bit +#define BN_set_negative hc_BN_set_negative +#define BN_set_word hc_BN_set_word +#define BN_uadd hc_BN_uadd +#define BN_CTX_new hc_BN_CTX_new +#define BN_CTX_free hc_BN_CTX_free +#define BN_CTX_get hc_BN_CTX_get +#define BN_CTX_start hc_BN_CTX_start +#define BN_CTX_end hc_BN_CTX_end + +#define BIGNUM hc_BIGNUM +#define BN_GENCB hc_BN_GENCB +#define BN_CTX hc_BN_CTX +#define BN_BLINDING hc_BN_BLINDING +#define BN_MONT_CTX hc_BN_MONT_CTX + + +/* + * + */ + +typedef struct BIGNUM BIGNUM; +typedef struct BN_GENCB BN_GENCB; +typedef struct BN_CTX BN_CTX; +typedef struct BN_MONT_CTX BN_MONT_CTX; +typedef struct BN_BLINDING BN_BLINDING; + +struct BN_GENCB { + unsigned int ver; + void *arg; + union { + int (*cb_2)(int, int, BN_GENCB *); + } cb; +}; + +/* + * + */ + +BIGNUM *BN_new(void); +void BN_free(BIGNUM *); +void BN_clear_free(BIGNUM *); +void BN_clear(BIGNUM *); +BIGNUM *BN_dup(const BIGNUM *); + +int BN_num_bits(const BIGNUM *); +int BN_num_bytes(const BIGNUM *); + +int BN_cmp(const BIGNUM *, const BIGNUM *); + +void BN_set_negative(BIGNUM *, int); +int BN_is_negative(const BIGNUM *); + +int BN_is_bit_set(const BIGNUM *, int); +int BN_set_bit(BIGNUM *, int); +int BN_clear_bit(BIGNUM *, int); + +int BN_set_word(BIGNUM *, unsigned long); +unsigned long BN_get_word(const BIGNUM *); + +BIGNUM *BN_bin2bn(const void *,int len,BIGNUM *); +int BN_bn2bin(const BIGNUM *, void *); +int BN_hex2bn(BIGNUM **, const char *); +char * BN_bn2hex(const BIGNUM *); + +int BN_uadd(BIGNUM *, const BIGNUM *, const BIGNUM *); + +int BN_rand(BIGNUM *, int, int, int); + +void BN_GENCB_set(BN_GENCB *, int (*)(int, int, BN_GENCB *), void *); +int BN_GENCB_call(BN_GENCB *, int, int); + +BN_CTX *BN_CTX_new(void); +void BN_CTX_free(BN_CTX *); +BIGNUM *BN_CTX_get(BN_CTX *); +void BN_CTX_start(BN_CTX *); +void BN_CTX_end(BN_CTX *); + +#endif diff --git a/crypto/heimdal/lib/hcrypto/bn.c b/crypto/heimdal/lib/hcrypto/bn.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/bn.c @@ -0,0 +1,526 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include /* XXX */ +#include + +#include +#include +#include + +BIGNUM * +BN_new(void) +{ + heim_integer *hi; + hi = calloc(1, sizeof(*hi)); + return (BIGNUM *)hi; +} + +void +BN_free(BIGNUM *bn) +{ + BN_clear(bn); + free(bn); +} + +void +BN_clear(BIGNUM *bn) +{ + heim_integer *hi = (heim_integer *)bn; + if (hi->data) { + memset(hi->data, 0, hi->length); + free(hi->data); + } + memset(hi, 0, sizeof(*hi)); +} + +void +BN_clear_free(BIGNUM *bn) +{ + BN_free(bn); +} + +BIGNUM * +BN_dup(const BIGNUM *bn) +{ + BIGNUM *b = BN_new(); + if (der_copy_heim_integer((const heim_integer *)bn, (heim_integer *)b)) { + BN_free(b); + return NULL; + } + return b; +} + +/* + * If the caller really want to know the number of bits used, subtract + * one from the length, multiply by 8, and then lookup in the table + * how many bits the hightest byte uses. + */ +int +BN_num_bits(const BIGNUM *bn) +{ + static unsigned char num2bits[256] = { + 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4, 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + }; + const heim_integer *i = (const void *)bn; + if (i->length == 0) + return 0; + return (i->length - 1) * 8 + num2bits[((unsigned char *)i->data)[0]]; +} + +int +BN_num_bytes(const BIGNUM *bn) +{ + return ((const heim_integer *)bn)->length; +} + +/* + * Ignore negative flag. + */ + +BIGNUM * +BN_bin2bn(const void *s, int len, BIGNUM *bn) +{ + heim_integer *hi = (void *)bn; + + if (len < 0) + return NULL; + + if (hi == NULL) { + hi = (heim_integer *)BN_new(); + if (hi == NULL) + return NULL; + } + if (hi->data) + BN_clear((BIGNUM *)hi); + hi->negative = 0; + hi->data = malloc(len); + if (hi->data == NULL && len != 0) { + if (bn == NULL) + BN_free((BIGNUM *)hi); + return NULL; + } + hi->length = len; + if (len) + memcpy(hi->data, s, len); + return (BIGNUM *)hi; +} + +int +BN_bn2bin(const BIGNUM *bn, void *to) +{ + const heim_integer *hi = (const void *)bn; + memcpy(to, hi->data, hi->length); + return hi->length; +} + +int +BN_hex2bn(BIGNUM **bnp, const char *in) +{ + int negative; + ssize_t ret; + size_t len; + void *data; + + len = strlen(in); + data = malloc(len); + if (data == NULL) + return 0; + + if (*in == '-') { + negative = 1; + in++; + } else + negative = 0; + + ret = hex_decode(in, data, len); + if (ret < 0) { + free(data); + return 0; + } + + *bnp = BN_bin2bn(data, ret, NULL); + free(data); + if (*bnp == NULL) + return 0; + BN_set_negative(*bnp, negative); + return 1; +} + +char * +BN_bn2hex(const BIGNUM *bn) +{ + ssize_t ret; + size_t len; + void *data; + char *str; + + len = BN_num_bytes(bn); + data = malloc(len); + if (data == NULL) + return 0; + + len = BN_bn2bin(bn, data); + + ret = hex_encode(data, len, &str); + free(data); + if (ret < 0) + return 0; + + return str; +} + +int +BN_cmp(const BIGNUM *bn1, const BIGNUM *bn2) +{ + return der_heim_integer_cmp((const heim_integer *)bn1, + (const heim_integer *)bn2); +} + +void +BN_set_negative(BIGNUM *bn, int flag) +{ + ((heim_integer *)bn)->negative = (flag ? 1 : 0); +} + +int +BN_is_negative(const BIGNUM *bn) +{ + return ((const heim_integer *)bn)->negative ? 1 : 0; +} + +static const unsigned char is_set[8] = { 1, 2, 4, 8, 16, 32, 64, 128 }; + +int +BN_is_bit_set(const BIGNUM *bn, int bit) +{ + heim_integer *hi = (heim_integer *)bn; + unsigned char *p = hi->data; + + if ((bit / 8) >= hi->length || hi->length == 0) + return 0; + + return p[hi->length - 1 - (bit / 8)] & is_set[bit % 8]; +} + +int +BN_set_bit(BIGNUM *bn, int bit) +{ + heim_integer *hi = (heim_integer *)bn; + unsigned char *p; + + if ((bit / 8) > hi->length || hi->length == 0) { + size_t len = bit == 0 ? 1 : (bit + 7) / 8; + void *d = realloc(hi->data, len); + if (d == NULL) + return 0; + hi->data = d; + p = hi->data; + memset(&p[hi->length], 0, len); + hi->length = len; + } else + p = hi->data; + + p[hi->length - 1 - (bit / 8)] |= is_set[bit % 8]; + return 1; +} + +int +BN_clear_bit(BIGNUM *bn, int bit) +{ + heim_integer *hi = (heim_integer *)bn; + unsigned char *p = hi->data; + + if ((bit / 8) > hi->length || hi->length == 0) + return 0; + + p[hi->length - 1 - (bit / 8)] &= (unsigned char)(~(is_set[bit % 8])); + + return 1; +} + +int +BN_set_word(BIGNUM *bn, unsigned long num) +{ + unsigned char p[sizeof(num)]; + unsigned long num2; + int i, len; + + for (num2 = num, i = 0; num2 > 0; i++) + num2 = num2 >> 8; + + len = i; + for (; i > 0; i--) { + p[i - 1] = (num & 0xff); + num = num >> 8; + } + + bn = BN_bin2bn(p, len, bn); + return bn != NULL; +} + +unsigned long +BN_get_word(const BIGNUM *bn) +{ + heim_integer *hi = (heim_integer *)bn; + unsigned long num = 0; + int i; + + if (hi->negative || hi->length > sizeof(num)) + return ULONG_MAX; + + for (i = 0; i < hi->length; i++) + num = ((unsigned char *)hi->data)[i] | (num << 8); + return num; +} + +int +BN_rand(BIGNUM *bn, int bits, int top, int bottom) +{ + size_t len = (bits + 7) / 8; + heim_integer *i = (heim_integer *)bn; + + BN_clear(bn); + + i->negative = 0; + i->data = malloc(len); + if (i->data == NULL && len != 0) + return 0; + i->length = len; + + if (RAND_bytes(i->data, i->length) != 1) { + free(i->data); + i->data = NULL; + return 0; + } + + { + size_t j = len * 8; + while(j > bits) { + BN_clear_bit(bn, j - 1); + j--; + } + } + + if (top == -1) { + ; + } else if (top == 0 && bits > 0) { + BN_set_bit(bn, bits - 1); + } else if (top == 1 && bits > 1) { + BN_set_bit(bn, bits - 1); + BN_set_bit(bn, bits - 2); + } else { + BN_clear(bn); + return 0; + } + + if (bottom && bits > 0) + BN_set_bit(bn, 0); + + return 1; +} + +/* + * + */ + +int +BN_uadd(BIGNUM *res, const BIGNUM *a, const BIGNUM *b) +{ + const heim_integer *ai = (const heim_integer *)a; + const heim_integer *bi = (const heim_integer *)b; + const unsigned char *ap, *bp; + unsigned char *cp; + heim_integer ci; + int carry = 0; + ssize_t len; + + if (ai->negative && bi->negative) + return 0; + if (ai->length < bi->length) { + const heim_integer *si = bi; + bi = ai; ai = si; + } + + ci.negative = 0; + ci.length = ai->length + 1; + ci.data = malloc(ci.length); + if (ci.data == NULL) + return 0; + + ap = &((const unsigned char *)ai->data)[ai->length - 1]; + bp = &((const unsigned char *)bi->data)[bi->length - 1]; + cp = &((unsigned char *)ci.data)[ci.length - 1]; + + for (len = bi->length; len > 0; len--) { + carry = *ap + *bp + carry; + *cp = carry & 0xff; + carry = (carry & ~0xff) ? 1 : 0; + ap--; bp--; cp--; + } + for (len = ai->length - bi->length; len > 0; len--) { + carry = *ap + carry; + *cp = carry & 0xff; + carry = (carry & ~0xff) ? 1 : 0; + ap--; cp--; + } + if (!carry) + memmove(cp, cp + 1, --ci.length); + else + *cp = carry; + + BN_clear(res); + *((heim_integer *)res) = ci; + + return 1; +} + + +/* + * Callback when doing slow generation of numbers, like primes. + */ + +void +BN_GENCB_set(BN_GENCB *gencb, int (*cb_2)(int, int, BN_GENCB *), void *ctx) +{ + gencb->ver = 2; + gencb->cb.cb_2 = cb_2; + gencb->arg = ctx; +} + +int +BN_GENCB_call(BN_GENCB *cb, int a, int b) +{ + if (cb == NULL || cb->cb.cb_2 == NULL) + return 1; + return cb->cb.cb_2(a, b, cb); +} + +/* + * + */ + +struct BN_CTX { + struct { + BIGNUM **val; + size_t used; + size_t len; + } bn; + struct { + size_t *val; + size_t used; + size_t len; + } stack; +}; + +BN_CTX * +BN_CTX_new(void) +{ + struct BN_CTX *c; + c = calloc(1, sizeof(*c)); + return c; +} + +void +BN_CTX_free(BN_CTX *c) +{ + size_t i; + for (i = 0; i < c->bn.len; i++) + BN_free(c->bn.val[i]); + free(c->bn.val); + free(c->stack.val); +} + +BIGNUM * +BN_CTX_get(BN_CTX *c) +{ + if (c->bn.used == c->bn.len) { + void *ptr; + size_t i; + c->bn.len += 16; + ptr = realloc(c->bn.val, c->bn.len * sizeof(c->bn.val[0])); + if (ptr == NULL) + return NULL; + c->bn.val = ptr; + for (i = c->bn.used; i < c->bn.len; i++) { + c->bn.val[i] = BN_new(); + if (c->bn.val[i] == NULL) { + c->bn.len = i; + return NULL; + } + } + } + return c->bn.val[c->bn.used++]; +} + +void +BN_CTX_start(BN_CTX *c) +{ + if (c->stack.used == c->stack.len) { + void *ptr; + c->stack.len += 16; + ptr = realloc(c->stack.val, c->stack.len * sizeof(c->stack.val[0])); + if (ptr == NULL) + abort(); + c->stack.val = ptr; + } + c->stack.val[c->stack.used++] = c->bn.used; +} + +void +BN_CTX_end(BN_CTX *c) +{ + const size_t prev = c->stack.val[c->stack.used - 1]; + size_t i; + + if (c->stack.used == 0) + abort(); + + for (i = prev; i < c->bn.used; i++) + BN_clear(c->bn.val[i]); + + c->stack.used--; + c->bn.used = prev; +} + diff --git a/crypto/heimdal/lib/hcrypto/camellia-ntt.h b/crypto/heimdal/lib/hcrypto/camellia-ntt.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/camellia-ntt.h @@ -0,0 +1,65 @@ +/* camellia.h ver 1.2.0 + * + * Copyright (c) 2006,2007 + * NTT (Nippon Telegraph and Telephone Corporation) . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer as + * the first lines of this file unmodified. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY NTT ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NTT BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef HEADER_CAMELLIA_H +#define HEADER_CAMELLIA_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define CAMELLIA_BLOCK_SIZE 16 +#define CAMELLIA_TABLE_BYTE_LEN 272 +#define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +/* u32 must be 32bit word */ +typedef uint32_t u32; +typedef unsigned char u8; + +typedef u32 KEY_TABLE_TYPE[CAMELLIA_TABLE_WORD_LEN]; + + +void Camellia_Ekeygen(const int keyBitLength, + const unsigned char *rawKey, + KEY_TABLE_TYPE keyTable); + +void Camellia_EncryptBlock(const int keyBitLength, + const unsigned char *plaintext, + const KEY_TABLE_TYPE keyTable, + unsigned char *cipherText); + +void Camellia_DecryptBlock(const int keyBitLength, + const unsigned char *cipherText, + const KEY_TABLE_TYPE keyTable, + unsigned char *plaintext); + + +#ifdef __cplusplus +} +#endif + +#endif /* HEADER_CAMELLIA_H */ diff --git a/crypto/heimdal/lib/hcrypto/camellia-ntt.c b/crypto/heimdal/lib/hcrypto/camellia-ntt.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/camellia-ntt.c @@ -0,0 +1,1465 @@ +/* camellia.c ver 1.2.0 + * + * Copyright (c) 2006,2007 + * NTT (Nippon Telegraph and Telephone Corporation) . All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer as + * the first lines of this file unmodified. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY NTT ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NTT BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Algorithm Specification + * http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html + */ + +#include +#include + +#include +#include "camellia-ntt.h" + +/* key constants */ + +#define CAMELLIA_SIGMA1L (0xA09E667FL) +#define CAMELLIA_SIGMA1R (0x3BCC908BL) +#define CAMELLIA_SIGMA2L (0xB67AE858L) +#define CAMELLIA_SIGMA2R (0x4CAA73B2L) +#define CAMELLIA_SIGMA3L (0xC6EF372FL) +#define CAMELLIA_SIGMA3R (0xE94F82BEL) +#define CAMELLIA_SIGMA4L (0x54FF53A5L) +#define CAMELLIA_SIGMA4R (0xF1D36F1CL) +#define CAMELLIA_SIGMA5L (0x10E527FAL) +#define CAMELLIA_SIGMA5R (0xDE682D1DL) +#define CAMELLIA_SIGMA6L (0xB05688C2L) +#define CAMELLIA_SIGMA6R (0xB3E6C1FDL) + +/* + * macros + */ + + +#if defined(_MSC_VER) + +# define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) +# define GETU32(p) SWAP(*((u32 *)(p))) +# define PUTU32(ct, st) {*((u32 *)(ct)) = SWAP((st));} + +#else /* not MS-VC */ + +# define GETU32(pt) \ + (((u32)(pt)[0] << 24) \ + ^ ((u32)(pt)[1] << 16) \ + ^ ((u32)(pt)[2] << 8) \ + ^ ((u32)(pt)[3])) + +# define PUTU32(ct, st) { \ + (ct)[0] = (u8)((st) >> 24); \ + (ct)[1] = (u8)((st) >> 16); \ + (ct)[2] = (u8)((st) >> 8); \ + (ct)[3] = (u8)(st); } + +#endif + +#define CamelliaSubkeyL(INDEX) (subkey[(INDEX)*2]) +#define CamelliaSubkeyR(INDEX) (subkey[(INDEX)*2 + 1]) + +/* rotation right shift 1byte */ +#define CAMELLIA_RR8(x) (((x) >> 8) + ((x) << 24)) +/* rotation left shift 1bit */ +#define CAMELLIA_RL1(x) (((x) << 1) + ((x) >> 31)) +/* rotation left shift 1byte */ +#define CAMELLIA_RL8(x) (((x) << 8) + ((x) >> 24)) + +#define CAMELLIA_ROLDQ(ll, lr, rl, rr, w0, w1, bits) \ + do { \ + w0 = ll; \ + ll = (ll << bits) + (lr >> (32 - bits)); \ + lr = (lr << bits) + (rl >> (32 - bits)); \ + rl = (rl << bits) + (rr >> (32 - bits)); \ + rr = (rr << bits) + (w0 >> (32 - bits)); \ + } while(0) + +#define CAMELLIA_ROLDQo32(ll, lr, rl, rr, w0, w1, bits) \ + do { \ + w0 = ll; \ + w1 = lr; \ + ll = (lr << (bits - 32)) + (rl >> (64 - bits)); \ + lr = (rl << (bits - 32)) + (rr >> (64 - bits)); \ + rl = (rr << (bits - 32)) + (w0 >> (64 - bits)); \ + rr = (w0 << (bits - 32)) + (w1 >> (64 - bits)); \ + } while(0) + +#define CAMELLIA_SP1110(INDEX) (camellia_sp1110[(INDEX)]) +#define CAMELLIA_SP0222(INDEX) (camellia_sp0222[(INDEX)]) +#define CAMELLIA_SP3033(INDEX) (camellia_sp3033[(INDEX)]) +#define CAMELLIA_SP4404(INDEX) (camellia_sp4404[(INDEX)]) + +#define CAMELLIA_F(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ + do { \ + il = xl ^ kl; \ + ir = xr ^ kr; \ + t0 = il >> 16; \ + t1 = ir >> 16; \ + yl = CAMELLIA_SP1110(ir & 0xff) \ + ^ CAMELLIA_SP0222((t1 >> 8) & 0xff) \ + ^ CAMELLIA_SP3033(t1 & 0xff) \ + ^ CAMELLIA_SP4404((ir >> 8) & 0xff); \ + yr = CAMELLIA_SP1110((t0 >> 8) & 0xff) \ + ^ CAMELLIA_SP0222(t0 & 0xff) \ + ^ CAMELLIA_SP3033((il >> 8) & 0xff) \ + ^ CAMELLIA_SP4404(il & 0xff); \ + yl ^= yr; \ + yr = CAMELLIA_RR8(yr); \ + yr ^= yl; \ + } while(0) + + +/* + * for speed up + * + */ +#define CAMELLIA_FLS(ll, lr, rl, rr, kll, klr, krl, krr, t0, t1, t2, t3) \ + do { \ + t0 = kll; \ + t0 &= ll; \ + lr ^= CAMELLIA_RL1(t0); \ + t1 = klr; \ + t1 |= lr; \ + ll ^= t1; \ + \ + t2 = krr; \ + t2 |= rr; \ + rl ^= t2; \ + t3 = krl; \ + t3 &= rl; \ + rr ^= CAMELLIA_RL1(t3); \ + } while(0) + +#define CAMELLIA_ROUNDSM(xl, xr, kl, kr, yl, yr, il, ir, t0, t1) \ + do { \ + ir = CAMELLIA_SP1110(xr & 0xff) \ + ^ CAMELLIA_SP0222((xr >> 24) & 0xff) \ + ^ CAMELLIA_SP3033((xr >> 16) & 0xff) \ + ^ CAMELLIA_SP4404((xr >> 8) & 0xff); \ + il = CAMELLIA_SP1110((xl >> 24) & 0xff) \ + ^ CAMELLIA_SP0222((xl >> 16) & 0xff) \ + ^ CAMELLIA_SP3033((xl >> 8) & 0xff) \ + ^ CAMELLIA_SP4404(xl & 0xff); \ + il ^= kl; \ + ir ^= kr; \ + ir ^= il; \ + il = CAMELLIA_RR8(il); \ + il ^= ir; \ + yl ^= ir; \ + yr ^= il; \ + } while(0) + + +static const u32 camellia_sp1110[256] = { + 0x70707000,0x82828200,0x2c2c2c00,0xececec00, + 0xb3b3b300,0x27272700,0xc0c0c000,0xe5e5e500, + 0xe4e4e400,0x85858500,0x57575700,0x35353500, + 0xeaeaea00,0x0c0c0c00,0xaeaeae00,0x41414100, + 0x23232300,0xefefef00,0x6b6b6b00,0x93939300, + 0x45454500,0x19191900,0xa5a5a500,0x21212100, + 0xededed00,0x0e0e0e00,0x4f4f4f00,0x4e4e4e00, + 0x1d1d1d00,0x65656500,0x92929200,0xbdbdbd00, + 0x86868600,0xb8b8b800,0xafafaf00,0x8f8f8f00, + 0x7c7c7c00,0xebebeb00,0x1f1f1f00,0xcecece00, + 0x3e3e3e00,0x30303000,0xdcdcdc00,0x5f5f5f00, + 0x5e5e5e00,0xc5c5c500,0x0b0b0b00,0x1a1a1a00, + 0xa6a6a600,0xe1e1e100,0x39393900,0xcacaca00, + 0xd5d5d500,0x47474700,0x5d5d5d00,0x3d3d3d00, + 0xd9d9d900,0x01010100,0x5a5a5a00,0xd6d6d600, + 0x51515100,0x56565600,0x6c6c6c00,0x4d4d4d00, + 0x8b8b8b00,0x0d0d0d00,0x9a9a9a00,0x66666600, + 0xfbfbfb00,0xcccccc00,0xb0b0b000,0x2d2d2d00, + 0x74747400,0x12121200,0x2b2b2b00,0x20202000, + 0xf0f0f000,0xb1b1b100,0x84848400,0x99999900, + 0xdfdfdf00,0x4c4c4c00,0xcbcbcb00,0xc2c2c200, + 0x34343400,0x7e7e7e00,0x76767600,0x05050500, + 0x6d6d6d00,0xb7b7b700,0xa9a9a900,0x31313100, + 0xd1d1d100,0x17171700,0x04040400,0xd7d7d700, + 0x14141400,0x58585800,0x3a3a3a00,0x61616100, + 0xdedede00,0x1b1b1b00,0x11111100,0x1c1c1c00, + 0x32323200,0x0f0f0f00,0x9c9c9c00,0x16161600, + 0x53535300,0x18181800,0xf2f2f200,0x22222200, + 0xfefefe00,0x44444400,0xcfcfcf00,0xb2b2b200, + 0xc3c3c300,0xb5b5b500,0x7a7a7a00,0x91919100, + 0x24242400,0x08080800,0xe8e8e800,0xa8a8a800, + 0x60606000,0xfcfcfc00,0x69696900,0x50505000, + 0xaaaaaa00,0xd0d0d000,0xa0a0a000,0x7d7d7d00, + 0xa1a1a100,0x89898900,0x62626200,0x97979700, + 0x54545400,0x5b5b5b00,0x1e1e1e00,0x95959500, + 0xe0e0e000,0xffffff00,0x64646400,0xd2d2d200, + 0x10101000,0xc4c4c400,0x00000000,0x48484800, + 0xa3a3a300,0xf7f7f700,0x75757500,0xdbdbdb00, + 0x8a8a8a00,0x03030300,0xe6e6e600,0xdadada00, + 0x09090900,0x3f3f3f00,0xdddddd00,0x94949400, + 0x87878700,0x5c5c5c00,0x83838300,0x02020200, + 0xcdcdcd00,0x4a4a4a00,0x90909000,0x33333300, + 0x73737300,0x67676700,0xf6f6f600,0xf3f3f300, + 0x9d9d9d00,0x7f7f7f00,0xbfbfbf00,0xe2e2e200, + 0x52525200,0x9b9b9b00,0xd8d8d800,0x26262600, + 0xc8c8c800,0x37373700,0xc6c6c600,0x3b3b3b00, + 0x81818100,0x96969600,0x6f6f6f00,0x4b4b4b00, + 0x13131300,0xbebebe00,0x63636300,0x2e2e2e00, + 0xe9e9e900,0x79797900,0xa7a7a700,0x8c8c8c00, + 0x9f9f9f00,0x6e6e6e00,0xbcbcbc00,0x8e8e8e00, + 0x29292900,0xf5f5f500,0xf9f9f900,0xb6b6b600, + 0x2f2f2f00,0xfdfdfd00,0xb4b4b400,0x59595900, + 0x78787800,0x98989800,0x06060600,0x6a6a6a00, + 0xe7e7e700,0x46464600,0x71717100,0xbababa00, + 0xd4d4d400,0x25252500,0xababab00,0x42424200, + 0x88888800,0xa2a2a200,0x8d8d8d00,0xfafafa00, + 0x72727200,0x07070700,0xb9b9b900,0x55555500, + 0xf8f8f800,0xeeeeee00,0xacacac00,0x0a0a0a00, + 0x36363600,0x49494900,0x2a2a2a00,0x68686800, + 0x3c3c3c00,0x38383800,0xf1f1f100,0xa4a4a400, + 0x40404000,0x28282800,0xd3d3d300,0x7b7b7b00, + 0xbbbbbb00,0xc9c9c900,0x43434300,0xc1c1c100, + 0x15151500,0xe3e3e300,0xadadad00,0xf4f4f400, + 0x77777700,0xc7c7c700,0x80808000,0x9e9e9e00, +}; + +static const u32 camellia_sp0222[256] = { + 0x00e0e0e0,0x00050505,0x00585858,0x00d9d9d9, + 0x00676767,0x004e4e4e,0x00818181,0x00cbcbcb, + 0x00c9c9c9,0x000b0b0b,0x00aeaeae,0x006a6a6a, + 0x00d5d5d5,0x00181818,0x005d5d5d,0x00828282, + 0x00464646,0x00dfdfdf,0x00d6d6d6,0x00272727, + 0x008a8a8a,0x00323232,0x004b4b4b,0x00424242, + 0x00dbdbdb,0x001c1c1c,0x009e9e9e,0x009c9c9c, + 0x003a3a3a,0x00cacaca,0x00252525,0x007b7b7b, + 0x000d0d0d,0x00717171,0x005f5f5f,0x001f1f1f, + 0x00f8f8f8,0x00d7d7d7,0x003e3e3e,0x009d9d9d, + 0x007c7c7c,0x00606060,0x00b9b9b9,0x00bebebe, + 0x00bcbcbc,0x008b8b8b,0x00161616,0x00343434, + 0x004d4d4d,0x00c3c3c3,0x00727272,0x00959595, + 0x00ababab,0x008e8e8e,0x00bababa,0x007a7a7a, + 0x00b3b3b3,0x00020202,0x00b4b4b4,0x00adadad, + 0x00a2a2a2,0x00acacac,0x00d8d8d8,0x009a9a9a, + 0x00171717,0x001a1a1a,0x00353535,0x00cccccc, + 0x00f7f7f7,0x00999999,0x00616161,0x005a5a5a, + 0x00e8e8e8,0x00242424,0x00565656,0x00404040, + 0x00e1e1e1,0x00636363,0x00090909,0x00333333, + 0x00bfbfbf,0x00989898,0x00979797,0x00858585, + 0x00686868,0x00fcfcfc,0x00ececec,0x000a0a0a, + 0x00dadada,0x006f6f6f,0x00535353,0x00626262, + 0x00a3a3a3,0x002e2e2e,0x00080808,0x00afafaf, + 0x00282828,0x00b0b0b0,0x00747474,0x00c2c2c2, + 0x00bdbdbd,0x00363636,0x00222222,0x00383838, + 0x00646464,0x001e1e1e,0x00393939,0x002c2c2c, + 0x00a6a6a6,0x00303030,0x00e5e5e5,0x00444444, + 0x00fdfdfd,0x00888888,0x009f9f9f,0x00656565, + 0x00878787,0x006b6b6b,0x00f4f4f4,0x00232323, + 0x00484848,0x00101010,0x00d1d1d1,0x00515151, + 0x00c0c0c0,0x00f9f9f9,0x00d2d2d2,0x00a0a0a0, + 0x00555555,0x00a1a1a1,0x00414141,0x00fafafa, + 0x00434343,0x00131313,0x00c4c4c4,0x002f2f2f, + 0x00a8a8a8,0x00b6b6b6,0x003c3c3c,0x002b2b2b, + 0x00c1c1c1,0x00ffffff,0x00c8c8c8,0x00a5a5a5, + 0x00202020,0x00898989,0x00000000,0x00909090, + 0x00474747,0x00efefef,0x00eaeaea,0x00b7b7b7, + 0x00151515,0x00060606,0x00cdcdcd,0x00b5b5b5, + 0x00121212,0x007e7e7e,0x00bbbbbb,0x00292929, + 0x000f0f0f,0x00b8b8b8,0x00070707,0x00040404, + 0x009b9b9b,0x00949494,0x00212121,0x00666666, + 0x00e6e6e6,0x00cecece,0x00ededed,0x00e7e7e7, + 0x003b3b3b,0x00fefefe,0x007f7f7f,0x00c5c5c5, + 0x00a4a4a4,0x00373737,0x00b1b1b1,0x004c4c4c, + 0x00919191,0x006e6e6e,0x008d8d8d,0x00767676, + 0x00030303,0x002d2d2d,0x00dedede,0x00969696, + 0x00262626,0x007d7d7d,0x00c6c6c6,0x005c5c5c, + 0x00d3d3d3,0x00f2f2f2,0x004f4f4f,0x00191919, + 0x003f3f3f,0x00dcdcdc,0x00797979,0x001d1d1d, + 0x00525252,0x00ebebeb,0x00f3f3f3,0x006d6d6d, + 0x005e5e5e,0x00fbfbfb,0x00696969,0x00b2b2b2, + 0x00f0f0f0,0x00313131,0x000c0c0c,0x00d4d4d4, + 0x00cfcfcf,0x008c8c8c,0x00e2e2e2,0x00757575, + 0x00a9a9a9,0x004a4a4a,0x00575757,0x00848484, + 0x00111111,0x00454545,0x001b1b1b,0x00f5f5f5, + 0x00e4e4e4,0x000e0e0e,0x00737373,0x00aaaaaa, + 0x00f1f1f1,0x00dddddd,0x00595959,0x00141414, + 0x006c6c6c,0x00929292,0x00545454,0x00d0d0d0, + 0x00787878,0x00707070,0x00e3e3e3,0x00494949, + 0x00808080,0x00505050,0x00a7a7a7,0x00f6f6f6, + 0x00777777,0x00939393,0x00868686,0x00838383, + 0x002a2a2a,0x00c7c7c7,0x005b5b5b,0x00e9e9e9, + 0x00eeeeee,0x008f8f8f,0x00010101,0x003d3d3d, +}; + +static const u32 camellia_sp3033[256] = { + 0x38003838,0x41004141,0x16001616,0x76007676, + 0xd900d9d9,0x93009393,0x60006060,0xf200f2f2, + 0x72007272,0xc200c2c2,0xab00abab,0x9a009a9a, + 0x75007575,0x06000606,0x57005757,0xa000a0a0, + 0x91009191,0xf700f7f7,0xb500b5b5,0xc900c9c9, + 0xa200a2a2,0x8c008c8c,0xd200d2d2,0x90009090, + 0xf600f6f6,0x07000707,0xa700a7a7,0x27002727, + 0x8e008e8e,0xb200b2b2,0x49004949,0xde00dede, + 0x43004343,0x5c005c5c,0xd700d7d7,0xc700c7c7, + 0x3e003e3e,0xf500f5f5,0x8f008f8f,0x67006767, + 0x1f001f1f,0x18001818,0x6e006e6e,0xaf00afaf, + 0x2f002f2f,0xe200e2e2,0x85008585,0x0d000d0d, + 0x53005353,0xf000f0f0,0x9c009c9c,0x65006565, + 0xea00eaea,0xa300a3a3,0xae00aeae,0x9e009e9e, + 0xec00ecec,0x80008080,0x2d002d2d,0x6b006b6b, + 0xa800a8a8,0x2b002b2b,0x36003636,0xa600a6a6, + 0xc500c5c5,0x86008686,0x4d004d4d,0x33003333, + 0xfd00fdfd,0x66006666,0x58005858,0x96009696, + 0x3a003a3a,0x09000909,0x95009595,0x10001010, + 0x78007878,0xd800d8d8,0x42004242,0xcc00cccc, + 0xef00efef,0x26002626,0xe500e5e5,0x61006161, + 0x1a001a1a,0x3f003f3f,0x3b003b3b,0x82008282, + 0xb600b6b6,0xdb00dbdb,0xd400d4d4,0x98009898, + 0xe800e8e8,0x8b008b8b,0x02000202,0xeb00ebeb, + 0x0a000a0a,0x2c002c2c,0x1d001d1d,0xb000b0b0, + 0x6f006f6f,0x8d008d8d,0x88008888,0x0e000e0e, + 0x19001919,0x87008787,0x4e004e4e,0x0b000b0b, + 0xa900a9a9,0x0c000c0c,0x79007979,0x11001111, + 0x7f007f7f,0x22002222,0xe700e7e7,0x59005959, + 0xe100e1e1,0xda00dada,0x3d003d3d,0xc800c8c8, + 0x12001212,0x04000404,0x74007474,0x54005454, + 0x30003030,0x7e007e7e,0xb400b4b4,0x28002828, + 0x55005555,0x68006868,0x50005050,0xbe00bebe, + 0xd000d0d0,0xc400c4c4,0x31003131,0xcb00cbcb, + 0x2a002a2a,0xad00adad,0x0f000f0f,0xca00caca, + 0x70007070,0xff00ffff,0x32003232,0x69006969, + 0x08000808,0x62006262,0x00000000,0x24002424, + 0xd100d1d1,0xfb00fbfb,0xba00baba,0xed00eded, + 0x45004545,0x81008181,0x73007373,0x6d006d6d, + 0x84008484,0x9f009f9f,0xee00eeee,0x4a004a4a, + 0xc300c3c3,0x2e002e2e,0xc100c1c1,0x01000101, + 0xe600e6e6,0x25002525,0x48004848,0x99009999, + 0xb900b9b9,0xb300b3b3,0x7b007b7b,0xf900f9f9, + 0xce00cece,0xbf00bfbf,0xdf00dfdf,0x71007171, + 0x29002929,0xcd00cdcd,0x6c006c6c,0x13001313, + 0x64006464,0x9b009b9b,0x63006363,0x9d009d9d, + 0xc000c0c0,0x4b004b4b,0xb700b7b7,0xa500a5a5, + 0x89008989,0x5f005f5f,0xb100b1b1,0x17001717, + 0xf400f4f4,0xbc00bcbc,0xd300d3d3,0x46004646, + 0xcf00cfcf,0x37003737,0x5e005e5e,0x47004747, + 0x94009494,0xfa00fafa,0xfc00fcfc,0x5b005b5b, + 0x97009797,0xfe00fefe,0x5a005a5a,0xac00acac, + 0x3c003c3c,0x4c004c4c,0x03000303,0x35003535, + 0xf300f3f3,0x23002323,0xb800b8b8,0x5d005d5d, + 0x6a006a6a,0x92009292,0xd500d5d5,0x21002121, + 0x44004444,0x51005151,0xc600c6c6,0x7d007d7d, + 0x39003939,0x83008383,0xdc00dcdc,0xaa00aaaa, + 0x7c007c7c,0x77007777,0x56005656,0x05000505, + 0x1b001b1b,0xa400a4a4,0x15001515,0x34003434, + 0x1e001e1e,0x1c001c1c,0xf800f8f8,0x52005252, + 0x20002020,0x14001414,0xe900e9e9,0xbd00bdbd, + 0xdd00dddd,0xe400e4e4,0xa100a1a1,0xe000e0e0, + 0x8a008a8a,0xf100f1f1,0xd600d6d6,0x7a007a7a, + 0xbb00bbbb,0xe300e3e3,0x40004040,0x4f004f4f, +}; + +static const u32 camellia_sp4404[256] = { + 0x70700070,0x2c2c002c,0xb3b300b3,0xc0c000c0, + 0xe4e400e4,0x57570057,0xeaea00ea,0xaeae00ae, + 0x23230023,0x6b6b006b,0x45450045,0xa5a500a5, + 0xeded00ed,0x4f4f004f,0x1d1d001d,0x92920092, + 0x86860086,0xafaf00af,0x7c7c007c,0x1f1f001f, + 0x3e3e003e,0xdcdc00dc,0x5e5e005e,0x0b0b000b, + 0xa6a600a6,0x39390039,0xd5d500d5,0x5d5d005d, + 0xd9d900d9,0x5a5a005a,0x51510051,0x6c6c006c, + 0x8b8b008b,0x9a9a009a,0xfbfb00fb,0xb0b000b0, + 0x74740074,0x2b2b002b,0xf0f000f0,0x84840084, + 0xdfdf00df,0xcbcb00cb,0x34340034,0x76760076, + 0x6d6d006d,0xa9a900a9,0xd1d100d1,0x04040004, + 0x14140014,0x3a3a003a,0xdede00de,0x11110011, + 0x32320032,0x9c9c009c,0x53530053,0xf2f200f2, + 0xfefe00fe,0xcfcf00cf,0xc3c300c3,0x7a7a007a, + 0x24240024,0xe8e800e8,0x60600060,0x69690069, + 0xaaaa00aa,0xa0a000a0,0xa1a100a1,0x62620062, + 0x54540054,0x1e1e001e,0xe0e000e0,0x64640064, + 0x10100010,0x00000000,0xa3a300a3,0x75750075, + 0x8a8a008a,0xe6e600e6,0x09090009,0xdddd00dd, + 0x87870087,0x83830083,0xcdcd00cd,0x90900090, + 0x73730073,0xf6f600f6,0x9d9d009d,0xbfbf00bf, + 0x52520052,0xd8d800d8,0xc8c800c8,0xc6c600c6, + 0x81810081,0x6f6f006f,0x13130013,0x63630063, + 0xe9e900e9,0xa7a700a7,0x9f9f009f,0xbcbc00bc, + 0x29290029,0xf9f900f9,0x2f2f002f,0xb4b400b4, + 0x78780078,0x06060006,0xe7e700e7,0x71710071, + 0xd4d400d4,0xabab00ab,0x88880088,0x8d8d008d, + 0x72720072,0xb9b900b9,0xf8f800f8,0xacac00ac, + 0x36360036,0x2a2a002a,0x3c3c003c,0xf1f100f1, + 0x40400040,0xd3d300d3,0xbbbb00bb,0x43430043, + 0x15150015,0xadad00ad,0x77770077,0x80800080, + 0x82820082,0xecec00ec,0x27270027,0xe5e500e5, + 0x85850085,0x35350035,0x0c0c000c,0x41410041, + 0xefef00ef,0x93930093,0x19190019,0x21210021, + 0x0e0e000e,0x4e4e004e,0x65650065,0xbdbd00bd, + 0xb8b800b8,0x8f8f008f,0xebeb00eb,0xcece00ce, + 0x30300030,0x5f5f005f,0xc5c500c5,0x1a1a001a, + 0xe1e100e1,0xcaca00ca,0x47470047,0x3d3d003d, + 0x01010001,0xd6d600d6,0x56560056,0x4d4d004d, + 0x0d0d000d,0x66660066,0xcccc00cc,0x2d2d002d, + 0x12120012,0x20200020,0xb1b100b1,0x99990099, + 0x4c4c004c,0xc2c200c2,0x7e7e007e,0x05050005, + 0xb7b700b7,0x31310031,0x17170017,0xd7d700d7, + 0x58580058,0x61610061,0x1b1b001b,0x1c1c001c, + 0x0f0f000f,0x16160016,0x18180018,0x22220022, + 0x44440044,0xb2b200b2,0xb5b500b5,0x91910091, + 0x08080008,0xa8a800a8,0xfcfc00fc,0x50500050, + 0xd0d000d0,0x7d7d007d,0x89890089,0x97970097, + 0x5b5b005b,0x95950095,0xffff00ff,0xd2d200d2, + 0xc4c400c4,0x48480048,0xf7f700f7,0xdbdb00db, + 0x03030003,0xdada00da,0x3f3f003f,0x94940094, + 0x5c5c005c,0x02020002,0x4a4a004a,0x33330033, + 0x67670067,0xf3f300f3,0x7f7f007f,0xe2e200e2, + 0x9b9b009b,0x26260026,0x37370037,0x3b3b003b, + 0x96960096,0x4b4b004b,0xbebe00be,0x2e2e002e, + 0x79790079,0x8c8c008c,0x6e6e006e,0x8e8e008e, + 0xf5f500f5,0xb6b600b6,0xfdfd00fd,0x59590059, + 0x98980098,0x6a6a006a,0x46460046,0xbaba00ba, + 0x25250025,0x42420042,0xa2a200a2,0xfafa00fa, + 0x07070007,0x55550055,0xeeee00ee,0x0a0a000a, + 0x49490049,0x68680068,0x38380038,0xa4a400a4, + 0x28280028,0x7b7b007b,0xc9c900c9,0xc1c100c1, + 0xe3e300e3,0xf4f400f4,0xc7c700c7,0x9e9e009e, +}; + + +/** + * Stuff related to the Camellia key schedule + */ +#define subl(x) subL[(x)] +#define subr(x) subR[(x)] + +static void camellia_setup128(const unsigned char *key, u32 *subkey) +{ + u32 kll, klr, krl, krr; + u32 il, ir, t0, t1, w0, w1; + u32 kw4l, kw4r, dw, tl, tr; + u32 subL[26]; + u32 subR[26]; + + /** + * k == kll || klr || krl || krr (|| is concatination) + */ + kll = GETU32(key ); + klr = GETU32(key + 4); + krl = GETU32(key + 8); + krr = GETU32(key + 12); + /** + * generate KL dependent subkeys + */ + subl(0) = kll; subr(0) = klr; + subl(1) = krl; subr(1) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(4) = kll; subr(4) = klr; + subl(5) = krl; subr(5) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30); + subl(10) = kll; subr(10) = klr; + subl(11) = krl; subr(11) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(13) = krl; subr(13) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); + subl(16) = kll; subr(16) = klr; + subl(17) = krl; subr(17) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); + subl(18) = kll; subr(18) = klr; + subl(19) = krl; subr(19) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); + subl(22) = kll; subr(22) = klr; + subl(23) = krl; subr(23) = krr; + + /* generate KA */ + kll = subl(0); klr = subr(0); + krl = subl(1); krr = subr(1); + CAMELLIA_F(kll, klr, + CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, + w0, w1, il, ir, t0, t1); + krl ^= w0; krr ^= w1; + CAMELLIA_F(krl, krr, + CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, + kll, klr, il, ir, t0, t1); + CAMELLIA_F(kll, klr, + CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, + krl, krr, il, ir, t0, t1); + krl ^= w0; krr ^= w1; + CAMELLIA_F(krl, krr, + CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, + w0, w1, il, ir, t0, t1); + kll ^= w0; klr ^= w1; + + /* generate KA dependent subkeys */ + subl(2) = kll; subr(2) = klr; + subl(3) = krl; subr(3) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(6) = kll; subr(6) = klr; + subl(7) = krl; subr(7) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(8) = kll; subr(8) = klr; + subl(9) = krl; subr(9) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(12) = kll; subr(12) = klr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(14) = kll; subr(14) = klr; + subl(15) = krl; subr(15) = krr; + CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34); + subl(20) = kll; subr(20) = klr; + subl(21) = krl; subr(21) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); + subl(24) = kll; subr(24) = klr; + subl(25) = krl; subr(25) = krr; + + + /* absorb kw2 to other subkeys */ + subl(3) ^= subl(1); subr(3) ^= subr(1); + subl(5) ^= subl(1); subr(5) ^= subr(1); + subl(7) ^= subl(1); subr(7) ^= subr(1); + subl(1) ^= subr(1) & ~subr(9); + dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw); + subl(11) ^= subl(1); subr(11) ^= subr(1); + subl(13) ^= subl(1); subr(13) ^= subr(1); + subl(15) ^= subl(1); subr(15) ^= subr(1); + subl(1) ^= subr(1) & ~subr(17); + dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw); + subl(19) ^= subl(1); subr(19) ^= subr(1); + subl(21) ^= subl(1); subr(21) ^= subr(1); + subl(23) ^= subl(1); subr(23) ^= subr(1); + subl(24) ^= subl(1); subr(24) ^= subr(1); + + /* absorb kw4 to other subkeys */ + kw4l = subl(25); kw4r = subr(25); + subl(22) ^= kw4l; subr(22) ^= kw4r; + subl(20) ^= kw4l; subr(20) ^= kw4r; + subl(18) ^= kw4l; subr(18) ^= kw4r; + kw4l ^= kw4r & ~subr(16); + dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw); + subl(14) ^= kw4l; subr(14) ^= kw4r; + subl(12) ^= kw4l; subr(12) ^= kw4r; + subl(10) ^= kw4l; subr(10) ^= kw4r; + kw4l ^= kw4r & ~subr(8); + dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw); + subl(6) ^= kw4l; subr(6) ^= kw4r; + subl(4) ^= kw4l; subr(4) ^= kw4r; + subl(2) ^= kw4l; subr(2) ^= kw4r; + subl(0) ^= kw4l; subr(0) ^= kw4r; + + /* key XOR is end of F-function */ + CamelliaSubkeyL(0) = subl(0) ^ subl(2); + CamelliaSubkeyR(0) = subr(0) ^ subr(2); + CamelliaSubkeyL(2) = subl(3); + CamelliaSubkeyR(2) = subr(3); + CamelliaSubkeyL(3) = subl(2) ^ subl(4); + CamelliaSubkeyR(3) = subr(2) ^ subr(4); + CamelliaSubkeyL(4) = subl(3) ^ subl(5); + CamelliaSubkeyR(4) = subr(3) ^ subr(5); + CamelliaSubkeyL(5) = subl(4) ^ subl(6); + CamelliaSubkeyR(5) = subr(4) ^ subr(6); + CamelliaSubkeyL(6) = subl(5) ^ subl(7); + CamelliaSubkeyR(6) = subr(5) ^ subr(7); + tl = subl(10) ^ (subr(10) & ~subr(8)); + dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(7) = subl(6) ^ tl; + CamelliaSubkeyR(7) = subr(6) ^ tr; + CamelliaSubkeyL(8) = subl(8); + CamelliaSubkeyR(8) = subr(8); + CamelliaSubkeyL(9) = subl(9); + CamelliaSubkeyR(9) = subr(9); + tl = subl(7) ^ (subr(7) & ~subr(9)); + dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(10) = tl ^ subl(11); + CamelliaSubkeyR(10) = tr ^ subr(11); + CamelliaSubkeyL(11) = subl(10) ^ subl(12); + CamelliaSubkeyR(11) = subr(10) ^ subr(12); + CamelliaSubkeyL(12) = subl(11) ^ subl(13); + CamelliaSubkeyR(12) = subr(11) ^ subr(13); + CamelliaSubkeyL(13) = subl(12) ^ subl(14); + CamelliaSubkeyR(13) = subr(12) ^ subr(14); + CamelliaSubkeyL(14) = subl(13) ^ subl(15); + CamelliaSubkeyR(14) = subr(13) ^ subr(15); + tl = subl(18) ^ (subr(18) & ~subr(16)); + dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(15) = subl(14) ^ tl; + CamelliaSubkeyR(15) = subr(14) ^ tr; + CamelliaSubkeyL(16) = subl(16); + CamelliaSubkeyR(16) = subr(16); + CamelliaSubkeyL(17) = subl(17); + CamelliaSubkeyR(17) = subr(17); + tl = subl(15) ^ (subr(15) & ~subr(17)); + dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(18) = tl ^ subl(19); + CamelliaSubkeyR(18) = tr ^ subr(19); + CamelliaSubkeyL(19) = subl(18) ^ subl(20); + CamelliaSubkeyR(19) = subr(18) ^ subr(20); + CamelliaSubkeyL(20) = subl(19) ^ subl(21); + CamelliaSubkeyR(20) = subr(19) ^ subr(21); + CamelliaSubkeyL(21) = subl(20) ^ subl(22); + CamelliaSubkeyR(21) = subr(20) ^ subr(22); + CamelliaSubkeyL(22) = subl(21) ^ subl(23); + CamelliaSubkeyR(22) = subr(21) ^ subr(23); + CamelliaSubkeyL(23) = subl(22); + CamelliaSubkeyR(23) = subr(22); + CamelliaSubkeyL(24) = subl(24) ^ subl(23); + CamelliaSubkeyR(24) = subr(24) ^ subr(23); + + /* apply the inverse of the last half of P-function */ + dw = CamelliaSubkeyL(2) ^ CamelliaSubkeyR(2), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(2) = CamelliaSubkeyL(2) ^ dw, CamelliaSubkeyL(2) = dw; + dw = CamelliaSubkeyL(3) ^ CamelliaSubkeyR(3), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(3) = CamelliaSubkeyL(3) ^ dw, CamelliaSubkeyL(3) = dw; + dw = CamelliaSubkeyL(4) ^ CamelliaSubkeyR(4), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(4) = CamelliaSubkeyL(4) ^ dw, CamelliaSubkeyL(4) = dw; + dw = CamelliaSubkeyL(5) ^ CamelliaSubkeyR(5), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(5) = CamelliaSubkeyL(5) ^ dw, CamelliaSubkeyL(5) = dw; + dw = CamelliaSubkeyL(6) ^ CamelliaSubkeyR(6), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(6) = CamelliaSubkeyL(6) ^ dw, CamelliaSubkeyL(6) = dw; + dw = CamelliaSubkeyL(7) ^ CamelliaSubkeyR(7), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(7) = CamelliaSubkeyL(7) ^ dw, CamelliaSubkeyL(7) = dw; + dw = CamelliaSubkeyL(10) ^ CamelliaSubkeyR(10), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(10) = CamelliaSubkeyL(10) ^ dw, CamelliaSubkeyL(10) = dw; + dw = CamelliaSubkeyL(11) ^ CamelliaSubkeyR(11), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(11) = CamelliaSubkeyL(11) ^ dw, CamelliaSubkeyL(11) = dw; + dw = CamelliaSubkeyL(12) ^ CamelliaSubkeyR(12), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(12) = CamelliaSubkeyL(12) ^ dw, CamelliaSubkeyL(12) = dw; + dw = CamelliaSubkeyL(13) ^ CamelliaSubkeyR(13), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(13) = CamelliaSubkeyL(13) ^ dw, CamelliaSubkeyL(13) = dw; + dw = CamelliaSubkeyL(14) ^ CamelliaSubkeyR(14), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(14) = CamelliaSubkeyL(14) ^ dw, CamelliaSubkeyL(14) = dw; + dw = CamelliaSubkeyL(15) ^ CamelliaSubkeyR(15), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(15) = CamelliaSubkeyL(15) ^ dw, CamelliaSubkeyL(15) = dw; + dw = CamelliaSubkeyL(18) ^ CamelliaSubkeyR(18), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(18) = CamelliaSubkeyL(18) ^ dw, CamelliaSubkeyL(18) = dw; + dw = CamelliaSubkeyL(19) ^ CamelliaSubkeyR(19), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(19) = CamelliaSubkeyL(19) ^ dw, CamelliaSubkeyL(19) = dw; + dw = CamelliaSubkeyL(20) ^ CamelliaSubkeyR(20), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(20) = CamelliaSubkeyL(20) ^ dw, CamelliaSubkeyL(20) = dw; + dw = CamelliaSubkeyL(21) ^ CamelliaSubkeyR(21), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(21) = CamelliaSubkeyL(21) ^ dw, CamelliaSubkeyL(21) = dw; + dw = CamelliaSubkeyL(22) ^ CamelliaSubkeyR(22), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(22) = CamelliaSubkeyL(22) ^ dw, CamelliaSubkeyL(22) = dw; + dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw; + + return; +} + +static void camellia_setup256(const unsigned char *key, u32 *subkey) +{ + u32 kll,klr,krl,krr; /* left half of key */ + u32 krll,krlr,krrl,krrr; /* right half of key */ + u32 il, ir, t0, t1, w0, w1; /* temporary variables */ + u32 kw4l, kw4r, dw, tl, tr; + u32 subL[34]; + u32 subR[34]; + + /** + * key = (kll || klr || krl || krr || krll || krlr || krrl || krrr) + * (|| is concatination) + */ + + kll = GETU32(key ); + klr = GETU32(key + 4); + krl = GETU32(key + 8); + krr = GETU32(key + 12); + krll = GETU32(key + 16); + krlr = GETU32(key + 20); + krrl = GETU32(key + 24); + krrr = GETU32(key + 28); + + /* generate KL dependent subkeys */ + subl(0) = kll; subr(0) = klr; + subl(1) = krl; subr(1) = krr; + CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 45); + subl(12) = kll; subr(12) = klr; + subl(13) = krl; subr(13) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(16) = kll; subr(16) = klr; + subl(17) = krl; subr(17) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 17); + subl(22) = kll; subr(22) = klr; + subl(23) = krl; subr(23) = krr; + CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 34); + subl(30) = kll; subr(30) = klr; + subl(31) = krl; subr(31) = krr; + + /* generate KR dependent subkeys */ + CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); + subl(4) = krll; subr(4) = krlr; + subl(5) = krrl; subr(5) = krrr; + CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 15); + subl(8) = krll; subr(8) = krlr; + subl(9) = krrl; subr(9) = krrr; + CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); + subl(18) = krll; subr(18) = krlr; + subl(19) = krrl; subr(19) = krrr; + CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); + subl(26) = krll; subr(26) = krlr; + subl(27) = krrl; subr(27) = krrr; + CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 34); + + /* generate KA */ + kll = subl(0) ^ krll; klr = subr(0) ^ krlr; + krl = subl(1) ^ krrl; krr = subr(1) ^ krrr; + CAMELLIA_F(kll, klr, + CAMELLIA_SIGMA1L, CAMELLIA_SIGMA1R, + w0, w1, il, ir, t0, t1); + krl ^= w0; krr ^= w1; + CAMELLIA_F(krl, krr, + CAMELLIA_SIGMA2L, CAMELLIA_SIGMA2R, + kll, klr, il, ir, t0, t1); + kll ^= krll; klr ^= krlr; + CAMELLIA_F(kll, klr, + CAMELLIA_SIGMA3L, CAMELLIA_SIGMA3R, + krl, krr, il, ir, t0, t1); + krl ^= w0 ^ krrl; krr ^= w1 ^ krrr; + CAMELLIA_F(krl, krr, + CAMELLIA_SIGMA4L, CAMELLIA_SIGMA4R, + w0, w1, il, ir, t0, t1); + kll ^= w0; klr ^= w1; + + /* generate KB */ + krll ^= kll; krlr ^= klr; + krrl ^= krl; krrr ^= krr; + CAMELLIA_F(krll, krlr, + CAMELLIA_SIGMA5L, CAMELLIA_SIGMA5R, + w0, w1, il, ir, t0, t1); + krrl ^= w0; krrr ^= w1; + CAMELLIA_F(krrl, krrr, + CAMELLIA_SIGMA6L, CAMELLIA_SIGMA6R, + w0, w1, il, ir, t0, t1); + krll ^= w0; krlr ^= w1; + + /* generate KA dependent subkeys */ + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 15); + subl(6) = kll; subr(6) = klr; + subl(7) = krl; subr(7) = krr; + CAMELLIA_ROLDQ(kll, klr, krl, krr, w0, w1, 30); + subl(14) = kll; subr(14) = klr; + subl(15) = krl; subr(15) = krr; + subl(24) = klr; subr(24) = krl; + subl(25) = krr; subr(25) = kll; + CAMELLIA_ROLDQo32(kll, klr, krl, krr, w0, w1, 49); + subl(28) = kll; subr(28) = klr; + subl(29) = krl; subr(29) = krr; + + /* generate KB dependent subkeys */ + subl(2) = krll; subr(2) = krlr; + subl(3) = krrl; subr(3) = krrr; + CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); + subl(10) = krll; subr(10) = krlr; + subl(11) = krrl; subr(11) = krrr; + CAMELLIA_ROLDQ(krll, krlr, krrl, krrr, w0, w1, 30); + subl(20) = krll; subr(20) = krlr; + subl(21) = krrl; subr(21) = krrr; + CAMELLIA_ROLDQo32(krll, krlr, krrl, krrr, w0, w1, 51); + subl(32) = krll; subr(32) = krlr; + subl(33) = krrl; subr(33) = krrr; + + /* absorb kw2 to other subkeys */ + subl(3) ^= subl(1); subr(3) ^= subr(1); + subl(5) ^= subl(1); subr(5) ^= subr(1); + subl(7) ^= subl(1); subr(7) ^= subr(1); + subl(1) ^= subr(1) & ~subr(9); + dw = subl(1) & subl(9), subr(1) ^= CAMELLIA_RL1(dw); + subl(11) ^= subl(1); subr(11) ^= subr(1); + subl(13) ^= subl(1); subr(13) ^= subr(1); + subl(15) ^= subl(1); subr(15) ^= subr(1); + subl(1) ^= subr(1) & ~subr(17); + dw = subl(1) & subl(17), subr(1) ^= CAMELLIA_RL1(dw); + subl(19) ^= subl(1); subr(19) ^= subr(1); + subl(21) ^= subl(1); subr(21) ^= subr(1); + subl(23) ^= subl(1); subr(23) ^= subr(1); + subl(1) ^= subr(1) & ~subr(25); + dw = subl(1) & subl(25), subr(1) ^= CAMELLIA_RL1(dw); + subl(27) ^= subl(1); subr(27) ^= subr(1); + subl(29) ^= subl(1); subr(29) ^= subr(1); + subl(31) ^= subl(1); subr(31) ^= subr(1); + subl(32) ^= subl(1); subr(32) ^= subr(1); + + /* absorb kw4 to other subkeys */ + kw4l = subl(33); kw4r = subr(33); + subl(30) ^= kw4l; subr(30) ^= kw4r; + subl(28) ^= kw4l; subr(28) ^= kw4r; + subl(26) ^= kw4l; subr(26) ^= kw4r; + kw4l ^= kw4r & ~subr(24); + dw = kw4l & subl(24), kw4r ^= CAMELLIA_RL1(dw); + subl(22) ^= kw4l; subr(22) ^= kw4r; + subl(20) ^= kw4l; subr(20) ^= kw4r; + subl(18) ^= kw4l; subr(18) ^= kw4r; + kw4l ^= kw4r & ~subr(16); + dw = kw4l & subl(16), kw4r ^= CAMELLIA_RL1(dw); + subl(14) ^= kw4l; subr(14) ^= kw4r; + subl(12) ^= kw4l; subr(12) ^= kw4r; + subl(10) ^= kw4l; subr(10) ^= kw4r; + kw4l ^= kw4r & ~subr(8); + dw = kw4l & subl(8), kw4r ^= CAMELLIA_RL1(dw); + subl(6) ^= kw4l; subr(6) ^= kw4r; + subl(4) ^= kw4l; subr(4) ^= kw4r; + subl(2) ^= kw4l; subr(2) ^= kw4r; + subl(0) ^= kw4l; subr(0) ^= kw4r; + + /* key XOR is end of F-function */ + CamelliaSubkeyL(0) = subl(0) ^ subl(2); + CamelliaSubkeyR(0) = subr(0) ^ subr(2); + CamelliaSubkeyL(2) = subl(3); + CamelliaSubkeyR(2) = subr(3); + CamelliaSubkeyL(3) = subl(2) ^ subl(4); + CamelliaSubkeyR(3) = subr(2) ^ subr(4); + CamelliaSubkeyL(4) = subl(3) ^ subl(5); + CamelliaSubkeyR(4) = subr(3) ^ subr(5); + CamelliaSubkeyL(5) = subl(4) ^ subl(6); + CamelliaSubkeyR(5) = subr(4) ^ subr(6); + CamelliaSubkeyL(6) = subl(5) ^ subl(7); + CamelliaSubkeyR(6) = subr(5) ^ subr(7); + tl = subl(10) ^ (subr(10) & ~subr(8)); + dw = tl & subl(8), tr = subr(10) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(7) = subl(6) ^ tl; + CamelliaSubkeyR(7) = subr(6) ^ tr; + CamelliaSubkeyL(8) = subl(8); + CamelliaSubkeyR(8) = subr(8); + CamelliaSubkeyL(9) = subl(9); + CamelliaSubkeyR(9) = subr(9); + tl = subl(7) ^ (subr(7) & ~subr(9)); + dw = tl & subl(9), tr = subr(7) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(10) = tl ^ subl(11); + CamelliaSubkeyR(10) = tr ^ subr(11); + CamelliaSubkeyL(11) = subl(10) ^ subl(12); + CamelliaSubkeyR(11) = subr(10) ^ subr(12); + CamelliaSubkeyL(12) = subl(11) ^ subl(13); + CamelliaSubkeyR(12) = subr(11) ^ subr(13); + CamelliaSubkeyL(13) = subl(12) ^ subl(14); + CamelliaSubkeyR(13) = subr(12) ^ subr(14); + CamelliaSubkeyL(14) = subl(13) ^ subl(15); + CamelliaSubkeyR(14) = subr(13) ^ subr(15); + tl = subl(18) ^ (subr(18) & ~subr(16)); + dw = tl & subl(16), tr = subr(18) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(15) = subl(14) ^ tl; + CamelliaSubkeyR(15) = subr(14) ^ tr; + CamelliaSubkeyL(16) = subl(16); + CamelliaSubkeyR(16) = subr(16); + CamelliaSubkeyL(17) = subl(17); + CamelliaSubkeyR(17) = subr(17); + tl = subl(15) ^ (subr(15) & ~subr(17)); + dw = tl & subl(17), tr = subr(15) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(18) = tl ^ subl(19); + CamelliaSubkeyR(18) = tr ^ subr(19); + CamelliaSubkeyL(19) = subl(18) ^ subl(20); + CamelliaSubkeyR(19) = subr(18) ^ subr(20); + CamelliaSubkeyL(20) = subl(19) ^ subl(21); + CamelliaSubkeyR(20) = subr(19) ^ subr(21); + CamelliaSubkeyL(21) = subl(20) ^ subl(22); + CamelliaSubkeyR(21) = subr(20) ^ subr(22); + CamelliaSubkeyL(22) = subl(21) ^ subl(23); + CamelliaSubkeyR(22) = subr(21) ^ subr(23); + tl = subl(26) ^ (subr(26) & ~subr(24)); + dw = tl & subl(24), tr = subr(26) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(23) = subl(22) ^ tl; + CamelliaSubkeyR(23) = subr(22) ^ tr; + CamelliaSubkeyL(24) = subl(24); + CamelliaSubkeyR(24) = subr(24); + CamelliaSubkeyL(25) = subl(25); + CamelliaSubkeyR(25) = subr(25); + tl = subl(23) ^ (subr(23) & ~subr(25)); + dw = tl & subl(25), tr = subr(23) ^ CAMELLIA_RL1(dw); + CamelliaSubkeyL(26) = tl ^ subl(27); + CamelliaSubkeyR(26) = tr ^ subr(27); + CamelliaSubkeyL(27) = subl(26) ^ subl(28); + CamelliaSubkeyR(27) = subr(26) ^ subr(28); + CamelliaSubkeyL(28) = subl(27) ^ subl(29); + CamelliaSubkeyR(28) = subr(27) ^ subr(29); + CamelliaSubkeyL(29) = subl(28) ^ subl(30); + CamelliaSubkeyR(29) = subr(28) ^ subr(30); + CamelliaSubkeyL(30) = subl(29) ^ subl(31); + CamelliaSubkeyR(30) = subr(29) ^ subr(31); + CamelliaSubkeyL(31) = subl(30); + CamelliaSubkeyR(31) = subr(30); + CamelliaSubkeyL(32) = subl(32) ^ subl(31); + CamelliaSubkeyR(32) = subr(32) ^ subr(31); + + /* apply the inverse of the last half of P-function */ + dw = CamelliaSubkeyL(2) ^ CamelliaSubkeyR(2), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(2) = CamelliaSubkeyL(2) ^ dw, CamelliaSubkeyL(2) = dw; + dw = CamelliaSubkeyL(3) ^ CamelliaSubkeyR(3), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(3) = CamelliaSubkeyL(3) ^ dw, CamelliaSubkeyL(3) = dw; + dw = CamelliaSubkeyL(4) ^ CamelliaSubkeyR(4), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(4) = CamelliaSubkeyL(4) ^ dw, CamelliaSubkeyL(4) = dw; + dw = CamelliaSubkeyL(5) ^ CamelliaSubkeyR(5), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(5) = CamelliaSubkeyL(5) ^ dw, CamelliaSubkeyL(5) = dw; + dw = CamelliaSubkeyL(6) ^ CamelliaSubkeyR(6), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(6) = CamelliaSubkeyL(6) ^ dw, CamelliaSubkeyL(6) = dw; + dw = CamelliaSubkeyL(7) ^ CamelliaSubkeyR(7), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(7) = CamelliaSubkeyL(7) ^ dw, CamelliaSubkeyL(7) = dw; + dw = CamelliaSubkeyL(10) ^ CamelliaSubkeyR(10), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(10) = CamelliaSubkeyL(10) ^ dw, CamelliaSubkeyL(10) = dw; + dw = CamelliaSubkeyL(11) ^ CamelliaSubkeyR(11), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(11) = CamelliaSubkeyL(11) ^ dw, CamelliaSubkeyL(11) = dw; + dw = CamelliaSubkeyL(12) ^ CamelliaSubkeyR(12), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(12) = CamelliaSubkeyL(12) ^ dw, CamelliaSubkeyL(12) = dw; + dw = CamelliaSubkeyL(13) ^ CamelliaSubkeyR(13), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(13) = CamelliaSubkeyL(13) ^ dw, CamelliaSubkeyL(13) = dw; + dw = CamelliaSubkeyL(14) ^ CamelliaSubkeyR(14), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(14) = CamelliaSubkeyL(14) ^ dw, CamelliaSubkeyL(14) = dw; + dw = CamelliaSubkeyL(15) ^ CamelliaSubkeyR(15), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(15) = CamelliaSubkeyL(15) ^ dw, CamelliaSubkeyL(15) = dw; + dw = CamelliaSubkeyL(18) ^ CamelliaSubkeyR(18), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(18) = CamelliaSubkeyL(18) ^ dw, CamelliaSubkeyL(18) = dw; + dw = CamelliaSubkeyL(19) ^ CamelliaSubkeyR(19), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(19) = CamelliaSubkeyL(19) ^ dw, CamelliaSubkeyL(19) = dw; + dw = CamelliaSubkeyL(20) ^ CamelliaSubkeyR(20), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(20) = CamelliaSubkeyL(20) ^ dw, CamelliaSubkeyL(20) = dw; + dw = CamelliaSubkeyL(21) ^ CamelliaSubkeyR(21), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(21) = CamelliaSubkeyL(21) ^ dw, CamelliaSubkeyL(21) = dw; + dw = CamelliaSubkeyL(22) ^ CamelliaSubkeyR(22), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(22) = CamelliaSubkeyL(22) ^ dw, CamelliaSubkeyL(22) = dw; + dw = CamelliaSubkeyL(23) ^ CamelliaSubkeyR(23), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(23) = CamelliaSubkeyL(23) ^ dw, CamelliaSubkeyL(23) = dw; + dw = CamelliaSubkeyL(26) ^ CamelliaSubkeyR(26), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(26) = CamelliaSubkeyL(26) ^ dw, CamelliaSubkeyL(26) = dw; + dw = CamelliaSubkeyL(27) ^ CamelliaSubkeyR(27), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(27) = CamelliaSubkeyL(27) ^ dw, CamelliaSubkeyL(27) = dw; + dw = CamelliaSubkeyL(28) ^ CamelliaSubkeyR(28), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(28) = CamelliaSubkeyL(28) ^ dw, CamelliaSubkeyL(28) = dw; + dw = CamelliaSubkeyL(29) ^ CamelliaSubkeyR(29), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(29) = CamelliaSubkeyL(29) ^ dw, CamelliaSubkeyL(29) = dw; + dw = CamelliaSubkeyL(30) ^ CamelliaSubkeyR(30), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(30) = CamelliaSubkeyL(30) ^ dw, CamelliaSubkeyL(30) = dw; + dw = CamelliaSubkeyL(31) ^ CamelliaSubkeyR(31), dw = CAMELLIA_RL8(dw); + CamelliaSubkeyR(31) = CamelliaSubkeyL(31) ^ dw,CamelliaSubkeyL(31) = dw; + + return; +} + +static void camellia_setup192(const unsigned char *key, u32 *subkey) +{ + unsigned char kk[32]; + u32 krll, krlr, krrl,krrr; + + memcpy(kk, key, 24); + memcpy((unsigned char *)&krll, key+16,4); + memcpy((unsigned char *)&krlr, key+20,4); + krrl = ~krll; + krrr = ~krlr; + memcpy(kk+24, (unsigned char *)&krrl, 4); + memcpy(kk+28, (unsigned char *)&krrr, 4); + camellia_setup256(kk, subkey); + return; +} + + +/** + * Stuff related to camellia encryption/decryption + * + * "io" must be 4byte aligned and big-endian data. + */ +static void camellia_encrypt128(const u32 *subkey, u32 *io) +{ + u32 il, ir, t0, t1; + + /* pre whitening but absorb kw2*/ + io[0] ^= CamelliaSubkeyL(0); + io[1] ^= CamelliaSubkeyR(0); + /* main iteration */ + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(2),CamelliaSubkeyR(2), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(3),CamelliaSubkeyR(3), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(4),CamelliaSubkeyR(4), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(5),CamelliaSubkeyR(5), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(6),CamelliaSubkeyR(6), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(7),CamelliaSubkeyR(7), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(8),CamelliaSubkeyR(8), + CamelliaSubkeyL(9),CamelliaSubkeyR(9), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(10),CamelliaSubkeyR(10), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(11),CamelliaSubkeyR(11), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(12),CamelliaSubkeyR(12), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(13),CamelliaSubkeyR(13), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(14),CamelliaSubkeyR(14), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(15),CamelliaSubkeyR(15), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(16),CamelliaSubkeyR(16), + CamelliaSubkeyL(17),CamelliaSubkeyR(17), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(18),CamelliaSubkeyR(18), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(19),CamelliaSubkeyR(19), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(20),CamelliaSubkeyR(20), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(21),CamelliaSubkeyR(21), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(22),CamelliaSubkeyR(22), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(23),CamelliaSubkeyR(23), + io[0],io[1],il,ir,t0,t1); + + /* post whitening but kw4 */ + io[2] ^= CamelliaSubkeyL(24); + io[3] ^= CamelliaSubkeyR(24); + + t0 = io[0]; + t1 = io[1]; + io[0] = io[2]; + io[1] = io[3]; + io[2] = t0; + io[3] = t1; + + return; +} + +static void camellia_decrypt128(const u32 *subkey, u32 *io) +{ + u32 il,ir,t0,t1; /* temporary valiables */ + + /* pre whitening but absorb kw2*/ + io[0] ^= CamelliaSubkeyL(24); + io[1] ^= CamelliaSubkeyR(24); + + /* main iteration */ + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(23),CamelliaSubkeyR(23), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(22),CamelliaSubkeyR(22), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(21),CamelliaSubkeyR(21), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(20),CamelliaSubkeyR(20), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(19),CamelliaSubkeyR(19), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(18),CamelliaSubkeyR(18), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(17),CamelliaSubkeyR(17), + CamelliaSubkeyL(16),CamelliaSubkeyR(16), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(15),CamelliaSubkeyR(15), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(14),CamelliaSubkeyR(14), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(13),CamelliaSubkeyR(13), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(12),CamelliaSubkeyR(12), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(11),CamelliaSubkeyR(11), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(10),CamelliaSubkeyR(10), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(9),CamelliaSubkeyR(9), + CamelliaSubkeyL(8),CamelliaSubkeyR(8), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(7),CamelliaSubkeyR(7), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(6),CamelliaSubkeyR(6), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(5),CamelliaSubkeyR(5), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(4),CamelliaSubkeyR(4), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(3),CamelliaSubkeyR(3), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(2),CamelliaSubkeyR(2), + io[0],io[1],il,ir,t0,t1); + + /* post whitening but kw4 */ + io[2] ^= CamelliaSubkeyL(0); + io[3] ^= CamelliaSubkeyR(0); + + t0 = io[0]; + t1 = io[1]; + io[0] = io[2]; + io[1] = io[3]; + io[2] = t0; + io[3] = t1; + + return; +} + +/** + * stuff for 192 and 256bit encryption/decryption + */ +static void camellia_encrypt256(const u32 *subkey, u32 *io) +{ + u32 il,ir,t0,t1; /* temporary valiables */ + + /* pre whitening but absorb kw2*/ + io[0] ^= CamelliaSubkeyL(0); + io[1] ^= CamelliaSubkeyR(0); + + /* main iteration */ + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(2),CamelliaSubkeyR(2), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(3),CamelliaSubkeyR(3), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(4),CamelliaSubkeyR(4), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(5),CamelliaSubkeyR(5), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(6),CamelliaSubkeyR(6), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(7),CamelliaSubkeyR(7), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(8),CamelliaSubkeyR(8), + CamelliaSubkeyL(9),CamelliaSubkeyR(9), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(10),CamelliaSubkeyR(10), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(11),CamelliaSubkeyR(11), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(12),CamelliaSubkeyR(12), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(13),CamelliaSubkeyR(13), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(14),CamelliaSubkeyR(14), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(15),CamelliaSubkeyR(15), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(16),CamelliaSubkeyR(16), + CamelliaSubkeyL(17),CamelliaSubkeyR(17), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(18),CamelliaSubkeyR(18), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(19),CamelliaSubkeyR(19), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(20),CamelliaSubkeyR(20), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(21),CamelliaSubkeyR(21), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(22),CamelliaSubkeyR(22), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(23),CamelliaSubkeyR(23), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(24),CamelliaSubkeyR(24), + CamelliaSubkeyL(25),CamelliaSubkeyR(25), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(26),CamelliaSubkeyR(26), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(27),CamelliaSubkeyR(27), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(28),CamelliaSubkeyR(28), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(29),CamelliaSubkeyR(29), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(30),CamelliaSubkeyR(30), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(31),CamelliaSubkeyR(31), + io[0],io[1],il,ir,t0,t1); + + /* post whitening but kw4 */ + io[2] ^= CamelliaSubkeyL(32); + io[3] ^= CamelliaSubkeyR(32); + + t0 = io[0]; + t1 = io[1]; + io[0] = io[2]; + io[1] = io[3]; + io[2] = t0; + io[3] = t1; + + return; +} + +static void camellia_decrypt256(const u32 *subkey, u32 *io) +{ + u32 il,ir,t0,t1; /* temporary valiables */ + + /* pre whitening but absorb kw2*/ + io[0] ^= CamelliaSubkeyL(32); + io[1] ^= CamelliaSubkeyR(32); + + /* main iteration */ + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(31),CamelliaSubkeyR(31), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(30),CamelliaSubkeyR(30), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(29),CamelliaSubkeyR(29), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(28),CamelliaSubkeyR(28), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(27),CamelliaSubkeyR(27), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(26),CamelliaSubkeyR(26), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(25),CamelliaSubkeyR(25), + CamelliaSubkeyL(24),CamelliaSubkeyR(24), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(23),CamelliaSubkeyR(23), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(22),CamelliaSubkeyR(22), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(21),CamelliaSubkeyR(21), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(20),CamelliaSubkeyR(20), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(19),CamelliaSubkeyR(19), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(18),CamelliaSubkeyR(18), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(17),CamelliaSubkeyR(17), + CamelliaSubkeyL(16),CamelliaSubkeyR(16), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(15),CamelliaSubkeyR(15), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(14),CamelliaSubkeyR(14), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(13),CamelliaSubkeyR(13), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(12),CamelliaSubkeyR(12), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(11),CamelliaSubkeyR(11), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(10),CamelliaSubkeyR(10), + io[0],io[1],il,ir,t0,t1); + + CAMELLIA_FLS(io[0],io[1],io[2],io[3], + CamelliaSubkeyL(9),CamelliaSubkeyR(9), + CamelliaSubkeyL(8),CamelliaSubkeyR(8), + t0,t1,il,ir); + + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(7),CamelliaSubkeyR(7), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(6),CamelliaSubkeyR(6), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(5),CamelliaSubkeyR(5), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(4),CamelliaSubkeyR(4), + io[0],io[1],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[0],io[1], + CamelliaSubkeyL(3),CamelliaSubkeyR(3), + io[2],io[3],il,ir,t0,t1); + CAMELLIA_ROUNDSM(io[2],io[3], + CamelliaSubkeyL(2),CamelliaSubkeyR(2), + io[0],io[1],il,ir,t0,t1); + + /* post whitening but kw4 */ + io[2] ^= CamelliaSubkeyL(0); + io[3] ^= CamelliaSubkeyR(0); + + t0 = io[0]; + t1 = io[1]; + io[0] = io[2]; + io[1] = io[3]; + io[2] = t0; + io[3] = t1; + + return; +} + +/*** + * + * API for compatibility + */ + +void Camellia_Ekeygen(const int keyBitLength, + const unsigned char *rawKey, + KEY_TABLE_TYPE keyTable) +{ + switch(keyBitLength) { + case 128: + camellia_setup128(rawKey, keyTable); + break; + case 192: + camellia_setup192(rawKey, keyTable); + break; + case 256: + camellia_setup256(rawKey, keyTable); + break; + default: + break; + } +} + + +void Camellia_EncryptBlock(const int keyBitLength, + const unsigned char *plaintext, + const KEY_TABLE_TYPE keyTable, + unsigned char *ciphertext) +{ + u32 tmp[4]; + + tmp[0] = GETU32(plaintext); + tmp[1] = GETU32(plaintext + 4); + tmp[2] = GETU32(plaintext + 8); + tmp[3] = GETU32(plaintext + 12); + + switch (keyBitLength) { + case 128: + camellia_encrypt128(keyTable, tmp); + break; + case 192: + /* fall through */ + case 256: + camellia_encrypt256(keyTable, tmp); + break; + default: + break; + } + + PUTU32(ciphertext, tmp[0]); + PUTU32(ciphertext + 4, tmp[1]); + PUTU32(ciphertext + 8, tmp[2]); + PUTU32(ciphertext + 12, tmp[3]); +} + +void Camellia_DecryptBlock(const int keyBitLength, + const unsigned char *ciphertext, + const KEY_TABLE_TYPE keyTable, + unsigned char *plaintext) +{ + u32 tmp[4]; + + tmp[0] = GETU32(ciphertext); + tmp[1] = GETU32(ciphertext + 4); + tmp[2] = GETU32(ciphertext + 8); + tmp[3] = GETU32(ciphertext + 12); + + switch (keyBitLength) { + case 128: + camellia_decrypt128(keyTable, tmp); + break; + case 192: + /* fall through */ + case 256: + camellia_decrypt256(keyTable, tmp); + break; + default: + break; + } + PUTU32(plaintext, tmp[0]); + PUTU32(plaintext + 4, tmp[1]); + PUTU32(plaintext + 8, tmp[2]); + PUTU32(plaintext + 12, tmp[3]); +} diff --git a/crypto/heimdal/lib/hcrypto/camellia.h b/crypto/heimdal/lib/hcrypto/camellia.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/camellia.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_CAMELLIA_H +#define HEIM_CAMELLIA_H 1 + +/* symbol renaming */ +#define CAMELLIA_set_key hc_CAMELLIA_set_encrypt_key +#define CAMELLIA_encrypt hc_CAMELLIA_encrypt +#define CAMELLIA_decrypt hc_CAMELLIA_decrypt +#define CAMELLIA_cbc_encrypt hc_CAMELLIA_cbc_encrypt + +/* + * + */ + +#define CAMELLIA_BLOCK_SIZE 16 +#define CAMELLIA_TABLE_BYTE_LEN 272 +#define CAMELLIA_TABLE_WORD_LEN (CAMELLIA_TABLE_BYTE_LEN / 4) + +#define CAMELLIA_ENCRYPT 1 +#define CAMELLIA_DECRYPT 0 + +typedef struct camellia_key { + unsigned int bits; + uint32_t key[CAMELLIA_TABLE_WORD_LEN]; +} CAMELLIA_KEY; + +int CAMELLIA_set_key(const unsigned char *, const int, CAMELLIA_KEY *); + +void CAMELLIA_encrypt(const unsigned char *, unsigned char *, + const CAMELLIA_KEY *); +void CAMELLIA_decrypt(const unsigned char *, unsigned char *, + const CAMELLIA_KEY *); + +void CAMELLIA_cbc_encrypt(const unsigned char *, unsigned char *, + unsigned long, const CAMELLIA_KEY *, + unsigned char *, int); + +#endif /* HEIM_CAMELLIA_H */ diff --git a/crypto/heimdal/lib/hcrypto/camellia.c b/crypto/heimdal/lib/hcrypto/camellia.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/camellia.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifdef KRB5 +#include +#endif + +#include "camellia-ntt.h" +#include "camellia.h" + +int +CAMELLIA_set_key(const unsigned char *userkey, + const int bits, CAMELLIA_KEY *key) +{ + key->bits = bits; + Camellia_Ekeygen(bits, userkey, key->key); + return 1; +} + +void +CAMELLIA_encrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key) +{ + Camellia_EncryptBlock(key->bits, in, key->key, out); + +} + +void +CAMELLIA_decrypt(const unsigned char *in, unsigned char *out, + const CAMELLIA_KEY *key) +{ + Camellia_DecryptBlock(key->bits, in, key->key, out); +} + +void +CAMELLIA_cbc_encrypt(const unsigned char *in, unsigned char *out, + unsigned long size, const CAMELLIA_KEY *key, + unsigned char *iv, int mode_encrypt) +{ + unsigned char tmp[CAMELLIA_BLOCK_SIZE]; + int i; + + if (mode_encrypt) { + while (size >= CAMELLIA_BLOCK_SIZE) { + for (i = 0; i < CAMELLIA_BLOCK_SIZE; i++) + tmp[i] = in[i] ^ iv[i]; + CAMELLIA_encrypt(tmp, out, key); + memcpy(iv, out, CAMELLIA_BLOCK_SIZE); + size -= CAMELLIA_BLOCK_SIZE; + in += CAMELLIA_BLOCK_SIZE; + out += CAMELLIA_BLOCK_SIZE; + } + if (size) { + for (i = 0; i < size; i++) + tmp[i] = in[i] ^ iv[i]; + for (i = size; i < CAMELLIA_BLOCK_SIZE; i++) + tmp[i] = iv[i]; + CAMELLIA_encrypt(tmp, out, key); + memcpy(iv, out, CAMELLIA_BLOCK_SIZE); + } + } else { + while (size >= CAMELLIA_BLOCK_SIZE) { + memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); + CAMELLIA_decrypt(tmp, out, key); + for (i = 0; i < CAMELLIA_BLOCK_SIZE; i++) + out[i] ^= iv[i]; + memcpy(iv, tmp, CAMELLIA_BLOCK_SIZE); + size -= CAMELLIA_BLOCK_SIZE; + in += CAMELLIA_BLOCK_SIZE; + out += CAMELLIA_BLOCK_SIZE; + } + if (size) { + memcpy(tmp, in, CAMELLIA_BLOCK_SIZE); + CAMELLIA_decrypt(tmp, out, key); + for (i = 0; i < size; i++) + out[i] ^= iv[i]; + memcpy(iv, tmp, CAMELLIA_BLOCK_SIZE); + } + } +} diff --git a/crypto/heimdal/lib/hcrypto/common.h b/crypto/heimdal/lib/hcrypto/common.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/common.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef HCRYPTO_COMMON_H +#define HCRYPTO_COMMON_H 1 + +int +_hc_BN_to_integer(BIGNUM *, heim_integer *); + +BIGNUM * +_hc_integer_to_BN(const heim_integer *i, BIGNUM *bn); + +#endif /* HCRYPTO_COMMON_H */ diff --git a/crypto/heimdal/lib/hcrypto/common.c b/crypto/heimdal/lib/hcrypto/common.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/common.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include +#include + + +#include "common.h" + +int +_hc_BN_to_integer(BIGNUM *bn, heim_integer *integer) +{ + integer->length = BN_num_bytes(bn); + integer->data = malloc(integer->length); + if (integer->data == NULL) + return ENOMEM; + BN_bn2bin(bn, integer->data); + integer->negative = BN_is_negative(bn); + return 0; +} + +BIGNUM * +_hc_integer_to_BN(const heim_integer *i, BIGNUM *bn) +{ + bn = BN_bin2bn(i->data, i->length, bn); + if (bn) + BN_set_negative(bn, i->negative); + return bn; +} diff --git a/crypto/heimdal/lib/hcrypto/des-tables.h b/crypto/heimdal/lib/hcrypto/des-tables.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/des-tables.h @@ -0,0 +1,196 @@ +/* GENERATE FILE from gen-des.pl, do not edit */ + +/* pc1_c_3 bit pattern 5 13 21 */ +static int pc1_c_3[8] = { + 0x00000000, 0x00000010, 0x00001000, 0x00001010, + 0x00100000, 0x00100010, 0x00101000, 0x00101010 +}; +/* pc1_c_4 bit pattern 1 9 17 25 */ +static int pc1_c_4[16] = { + 0x00000000, 0x00000001, 0x00000100, 0x00000101, + 0x00010000, 0x00010001, 0x00010100, 0x00010101, + 0x01000000, 0x01000001, 0x01000100, 0x01000101, + 0x01010000, 0x01010001, 0x01010100, 0x01010101 +}; +/* pc1_d_3 bit pattern 49 41 33 */ +static int pc1_d_3[8] = { + 0x00000000, 0x01000000, 0x00010000, 0x01010000, + 0x00000100, 0x01000100, 0x00010100, 0x01010100 +}; +/* pc1_d_4 bit pattern 57 53 45 37 */ +static int pc1_d_4[16] = { + 0x00000000, 0x00100000, 0x00001000, 0x00101000, + 0x00000010, 0x00100010, 0x00001010, 0x00101010, + 0x00000001, 0x00100001, 0x00001001, 0x00101001, + 0x00000011, 0x00100011, 0x00001011, 0x00101011 +}; +/* pc2_c_1 bit pattern 5 24 7 16 6 10 */ +static int pc2_c_1[64] = { + 0x00000000, 0x00004000, 0x00040000, 0x00044000, + 0x00000100, 0x00004100, 0x00040100, 0x00044100, + 0x00020000, 0x00024000, 0x00060000, 0x00064000, + 0x00020100, 0x00024100, 0x00060100, 0x00064100, + 0x00000001, 0x00004001, 0x00040001, 0x00044001, + 0x00000101, 0x00004101, 0x00040101, 0x00044101, + 0x00020001, 0x00024001, 0x00060001, 0x00064001, + 0x00020101, 0x00024101, 0x00060101, 0x00064101, + 0x00080000, 0x00084000, 0x000c0000, 0x000c4000, + 0x00080100, 0x00084100, 0x000c0100, 0x000c4100, + 0x000a0000, 0x000a4000, 0x000e0000, 0x000e4000, + 0x000a0100, 0x000a4100, 0x000e0100, 0x000e4100, + 0x00080001, 0x00084001, 0x000c0001, 0x000c4001, + 0x00080101, 0x00084101, 0x000c0101, 0x000c4101, + 0x000a0001, 0x000a4001, 0x000e0001, 0x000e4001, + 0x000a0101, 0x000a4101, 0x000e0101, 0x000e4101 +}; +/* pc2_c_2 bit pattern 20 18 12 3 15 23 */ +static int pc2_c_2[64] = { + 0x00000000, 0x00000002, 0x00000200, 0x00000202, + 0x00200000, 0x00200002, 0x00200200, 0x00200202, + 0x00001000, 0x00001002, 0x00001200, 0x00001202, + 0x00201000, 0x00201002, 0x00201200, 0x00201202, + 0x00000040, 0x00000042, 0x00000240, 0x00000242, + 0x00200040, 0x00200042, 0x00200240, 0x00200242, + 0x00001040, 0x00001042, 0x00001240, 0x00001242, + 0x00201040, 0x00201042, 0x00201240, 0x00201242, + 0x00000010, 0x00000012, 0x00000210, 0x00000212, + 0x00200010, 0x00200012, 0x00200210, 0x00200212, + 0x00001010, 0x00001012, 0x00001210, 0x00001212, + 0x00201010, 0x00201012, 0x00201210, 0x00201212, + 0x00000050, 0x00000052, 0x00000250, 0x00000252, + 0x00200050, 0x00200052, 0x00200250, 0x00200252, + 0x00001050, 0x00001052, 0x00001250, 0x00001252, + 0x00201050, 0x00201052, 0x00201250, 0x00201252 +}; +/* pc2_c_3 bit pattern 1 9 19 2 14 22 */ +static int pc2_c_3[64] = { + 0x00000000, 0x00000004, 0x00000400, 0x00000404, + 0x00400000, 0x00400004, 0x00400400, 0x00400404, + 0x00000020, 0x00000024, 0x00000420, 0x00000424, + 0x00400020, 0x00400024, 0x00400420, 0x00400424, + 0x00008000, 0x00008004, 0x00008400, 0x00008404, + 0x00408000, 0x00408004, 0x00408400, 0x00408404, + 0x00008020, 0x00008024, 0x00008420, 0x00008424, + 0x00408020, 0x00408024, 0x00408420, 0x00408424, + 0x00800000, 0x00800004, 0x00800400, 0x00800404, + 0x00c00000, 0x00c00004, 0x00c00400, 0x00c00404, + 0x00800020, 0x00800024, 0x00800420, 0x00800424, + 0x00c00020, 0x00c00024, 0x00c00420, 0x00c00424, + 0x00808000, 0x00808004, 0x00808400, 0x00808404, + 0x00c08000, 0x00c08004, 0x00c08400, 0x00c08404, + 0x00808020, 0x00808024, 0x00808420, 0x00808424, + 0x00c08020, 0x00c08024, 0x00c08420, 0x00c08424 +}; +/* pc2_c_4 bit pattern 11 13 4 17 21 8 */ +static int pc2_c_4[64] = { + 0x00000000, 0x00010000, 0x00000008, 0x00010008, + 0x00000080, 0x00010080, 0x00000088, 0x00010088, + 0x00100000, 0x00110000, 0x00100008, 0x00110008, + 0x00100080, 0x00110080, 0x00100088, 0x00110088, + 0x00000800, 0x00010800, 0x00000808, 0x00010808, + 0x00000880, 0x00010880, 0x00000888, 0x00010888, + 0x00100800, 0x00110800, 0x00100808, 0x00110808, + 0x00100880, 0x00110880, 0x00100888, 0x00110888, + 0x00002000, 0x00012000, 0x00002008, 0x00012008, + 0x00002080, 0x00012080, 0x00002088, 0x00012088, + 0x00102000, 0x00112000, 0x00102008, 0x00112008, + 0x00102080, 0x00112080, 0x00102088, 0x00112088, + 0x00002800, 0x00012800, 0x00002808, 0x00012808, + 0x00002880, 0x00012880, 0x00002888, 0x00012888, + 0x00102800, 0x00112800, 0x00102808, 0x00112808, + 0x00102880, 0x00112880, 0x00102888, 0x00112888 +}; +/* pc2_d_1 bit pattern 51 35 31 52 39 45 */ +static int pc2_d_1[64] = { + 0x00000000, 0x00000080, 0x00002000, 0x00002080, + 0x00000001, 0x00000081, 0x00002001, 0x00002081, + 0x00200000, 0x00200080, 0x00202000, 0x00202080, + 0x00200001, 0x00200081, 0x00202001, 0x00202081, + 0x00020000, 0x00020080, 0x00022000, 0x00022080, + 0x00020001, 0x00020081, 0x00022001, 0x00022081, + 0x00220000, 0x00220080, 0x00222000, 0x00222080, + 0x00220001, 0x00220081, 0x00222001, 0x00222081, + 0x00000002, 0x00000082, 0x00002002, 0x00002082, + 0x00000003, 0x00000083, 0x00002003, 0x00002083, + 0x00200002, 0x00200082, 0x00202002, 0x00202082, + 0x00200003, 0x00200083, 0x00202003, 0x00202083, + 0x00020002, 0x00020082, 0x00022002, 0x00022082, + 0x00020003, 0x00020083, 0x00022003, 0x00022083, + 0x00220002, 0x00220082, 0x00222002, 0x00222082, + 0x00220003, 0x00220083, 0x00222003, 0x00222083 +}; +/* pc2_d_2 bit pattern 50 32 43 36 29 48 */ +static int pc2_d_2[64] = { + 0x00000000, 0x00000010, 0x00800000, 0x00800010, + 0x00010000, 0x00010010, 0x00810000, 0x00810010, + 0x00000200, 0x00000210, 0x00800200, 0x00800210, + 0x00010200, 0x00010210, 0x00810200, 0x00810210, + 0x00100000, 0x00100010, 0x00900000, 0x00900010, + 0x00110000, 0x00110010, 0x00910000, 0x00910010, + 0x00100200, 0x00100210, 0x00900200, 0x00900210, + 0x00110200, 0x00110210, 0x00910200, 0x00910210, + 0x00000004, 0x00000014, 0x00800004, 0x00800014, + 0x00010004, 0x00010014, 0x00810004, 0x00810014, + 0x00000204, 0x00000214, 0x00800204, 0x00800214, + 0x00010204, 0x00010214, 0x00810204, 0x00810214, + 0x00100004, 0x00100014, 0x00900004, 0x00900014, + 0x00110004, 0x00110014, 0x00910004, 0x00910014, + 0x00100204, 0x00100214, 0x00900204, 0x00900214, + 0x00110204, 0x00110214, 0x00910204, 0x00910214 +}; +/* pc2_d_3 bit pattern 41 38 47 33 40 42 */ +static int pc2_d_3[64] = { + 0x00000000, 0x00000400, 0x00001000, 0x00001400, + 0x00080000, 0x00080400, 0x00081000, 0x00081400, + 0x00000020, 0x00000420, 0x00001020, 0x00001420, + 0x00080020, 0x00080420, 0x00081020, 0x00081420, + 0x00004000, 0x00004400, 0x00005000, 0x00005400, + 0x00084000, 0x00084400, 0x00085000, 0x00085400, + 0x00004020, 0x00004420, 0x00005020, 0x00005420, + 0x00084020, 0x00084420, 0x00085020, 0x00085420, + 0x00000800, 0x00000c00, 0x00001800, 0x00001c00, + 0x00080800, 0x00080c00, 0x00081800, 0x00081c00, + 0x00000820, 0x00000c20, 0x00001820, 0x00001c20, + 0x00080820, 0x00080c20, 0x00081820, 0x00081c20, + 0x00004800, 0x00004c00, 0x00005800, 0x00005c00, + 0x00084800, 0x00084c00, 0x00085800, 0x00085c00, + 0x00004820, 0x00004c20, 0x00005820, 0x00005c20, + 0x00084820, 0x00084c20, 0x00085820, 0x00085c20 +}; +/* pc2_d_4 bit pattern 49 37 30 46 34 44 */ +static int pc2_d_4[64] = { + 0x00000000, 0x00000100, 0x00040000, 0x00040100, + 0x00000040, 0x00000140, 0x00040040, 0x00040140, + 0x00400000, 0x00400100, 0x00440000, 0x00440100, + 0x00400040, 0x00400140, 0x00440040, 0x00440140, + 0x00008000, 0x00008100, 0x00048000, 0x00048100, + 0x00008040, 0x00008140, 0x00048040, 0x00048140, + 0x00408000, 0x00408100, 0x00448000, 0x00448100, + 0x00408040, 0x00408140, 0x00448040, 0x00448140, + 0x00000008, 0x00000108, 0x00040008, 0x00040108, + 0x00000048, 0x00000148, 0x00040048, 0x00040148, + 0x00400008, 0x00400108, 0x00440008, 0x00440108, + 0x00400048, 0x00400148, 0x00440048, 0x00440148, + 0x00008008, 0x00008108, 0x00048008, 0x00048108, + 0x00008048, 0x00008148, 0x00048048, 0x00048148, + 0x00408008, 0x00408108, 0x00448008, 0x00448108, + 0x00408048, 0x00408148, 0x00448048, 0x00448148 +}; +static unsigned char odd_parity[256] = { + 1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14, + 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31, + 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47, + 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62, + 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79, + 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94, + 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110, +112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127, +128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143, +145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158, +161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174, +176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191, +193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206, +208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223, +224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239, +241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254, + }; diff --git a/crypto/heimdal/lib/hcrypto/des.h b/crypto/heimdal/lib/hcrypto/des.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/des.h @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef _DESperate_H +#define _DESperate_H 1 + +/* symbol renaming */ +#define _DES_ipfp_test _hc_DES_ipfp_test +#define DES_cbc_cksum hc_DES_cbc_cksum +#define DES_cbc_encrypt hc_DES_cbc_encrypt +#define DES_cfb64_encrypt hc_DES_cfb64_encrypt +#define DES_check_key_parity hc_DES_check_key_parity +#define DES_ecb3_encrypt hc_DES_ecb3_encrypt +#define DES_ecb_encrypt hc_DES_ecb_encrypt +#define DES_ede3_cbc_encrypt hc_DES_ede3_cbc_encrypt +#define DES_encrypt hc_DES_encrypt +#define DES_generate_random_block hc_DES_generate_random_block +#define DES_init_random_number_generator hc_DES_init_random_number_generator +#define DES_is_weak_key hc_DES_is_weak_key +#define DES_key_sched hc_DES_key_sched +#define DES_new_random_key hc_DES_new_random_key +#define DES_pcbc_encrypt hc_DES_pcbc_encrypt +#define DES_rand_data hc_DES_rand_data +#define DES_random_key hc_DES_random_key +#define DES_read_password hc_DES_read_password +#define DES_set_key hc_DES_set_key +#define DES_set_key_checked hc_DES_set_key_checked +#define DES_set_key_unchecked hc_DES_set_key_unchecked +#define DES_set_key_sched hc_DES_set_key_sched +#define DES_set_odd_parity hc_DES_set_odd_parity +#define DES_set_random_generator_seed hc_DES_set_random_generator_seed +#define DES_set_sequence_number hc_DES_set_sequence_number +#define DES_string_to_key hc_DES_string_to_key + +/* + * + */ + +#define DES_CBLOCK_LEN 8 +#define DES_KEY_SZ 8 + +#define DES_ENCRYPT 1 +#define DES_DECRYPT 0 + +typedef unsigned char DES_cblock[DES_CBLOCK_LEN]; +typedef struct DES_key_schedule +{ + uint32_t ks[32]; +} DES_key_schedule; + +/* + * + */ + +#ifndef HC_DEPRECATED +#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 ))) +#define HC_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) && (_MSC_VER>1200) +#define HC_DEPRECATED __declspec(deprecated) +#else +#define HC_DEPRECATED +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +void DES_set_odd_parity(DES_cblock *); +int DES_check_key_parity(DES_cblock *); +int DES_is_weak_key(DES_cblock *); +int HC_DEPRECATED DES_set_key(DES_cblock *, DES_key_schedule *); +int DES_set_key_checked(DES_cblock *, DES_key_schedule *); +int DES_set_key_unchecked(DES_cblock *, DES_key_schedule *); +int DES_key_sched(DES_cblock *, DES_key_schedule *); +void DES_string_to_key(const char *, DES_cblock *); +int DES_read_password(DES_cblock *, char *, int); + +void HC_DEPRECATED DES_rand_data(void *, int); +void HC_DEPRECATED DES_set_random_generator_seed(DES_cblock *); +void HC_DEPRECATED DES_generate_random_block(DES_cblock *); +void HC_DEPRECATED DES_set_sequence_number(void *); +void HC_DEPRECATED DES_init_random_number_generator(DES_cblock *); +void HC_DEPRECATED DES_random_key(DES_cblock *); +int HC_DEPRECATED DES_new_random_key(DES_cblock *); + + +void DES_encrypt(uint32_t [2], DES_key_schedule *, int); +void DES_ecb_encrypt(DES_cblock *, DES_cblock *, DES_key_schedule *, int); +void DES_ecb3_encrypt(DES_cblock *,DES_cblock *, DES_key_schedule *, + DES_key_schedule *, DES_key_schedule *, int); +void DES_pcbc_encrypt(const void *, void *, long, + DES_key_schedule *, DES_cblock *, int); +void DES_cbc_encrypt(const void *, void *, long, + DES_key_schedule *, DES_cblock *, int); +void DES_ede3_cbc_encrypt(const void *, void *, long, + DES_key_schedule *, DES_key_schedule *, + DES_key_schedule *, DES_cblock *, int); +void DES_cfb64_encrypt(const void *, void *, long, + DES_key_schedule *, DES_cblock *, int *, int); + + +uint32_t DES_cbc_cksum(const void *, DES_cblock *, + long, DES_key_schedule *, DES_cblock *); + + +void _DES_ipfp_test(void); + +#ifdef __cplusplus +} +#endif + + +#endif /* _DESperate_H */ diff --git a/crypto/heimdal/lib/hcrypto/des.c b/crypto/heimdal/lib/hcrypto/des.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/des.c @@ -0,0 +1,1179 @@ +/* + * Copyright (c) 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/** + * @page page_des DES - Data Encryption Standard crypto interface + * + * See the library functions here: @ref hcrypto_des + * + * DES was created by IBM, modififed by NSA and then adopted by NBS + * (now NIST) and published ad FIPS PUB 46 (updated by FIPS 46-1). + * + * Since the 19th May 2005 DES was withdrawn by NIST and should no + * longer be used. See @ref page_evp for replacement encryption + * algorithms and interfaces. + * + * Read more the iteresting history of DES on Wikipedia + * http://www.wikipedia.org/wiki/Data_Encryption_Standard . + * + * @section des_keygen DES key generation + * + * To generate a DES key safely you have to use the code-snippet + * below. This is because the DES_random_key() can fail with an + * abort() in case of and failure to start the random generator. + * + * There is a replacement function DES_new_random_key(), however that + * function does not exists in OpenSSL. + * + * @code + * DES_cblock key; + * do { + * if (RAND_rand(&key, sizeof(key)) != 1) + * goto failure; + * DES_set_odd_parity(key); + * } while (DES_is_weak_key(&key)); + * @endcode + * + * @section des_impl DES implementation history + * + * There was no complete BSD licensed, fast, GPL compatible + * implementation of DES, so Love wrote the part that was missing, + * fast key schedule setup and adapted the interface to the orignal + * libdes. + * + * The document that got me started for real was "Efficient + * Implementation of the Data Encryption Standard" by Dag Arne Osvik. + * I never got to the PC1 transformation was working, instead I used + * table-lookup was used for all key schedule setup. The document was + * very useful since it de-mystified other implementations for me. + * + * The core DES function (SBOX + P transformation) is from Richard + * Outerbridge public domain DES implementation. My sanity is saved + * thanks to his work. Thank you Richard. + */ + +#include +#include + +#define HC_DEPRECATED +#include +#include + +#include "des.h" +#include "ui.h" + +static void desx(uint32_t [2], DES_key_schedule *, int); +static void IP(uint32_t [2]); +static void FP(uint32_t [2]); + +#include "des-tables.h" + +#define ROTATE_LEFT28(x,one) \ + if (one) { \ + x = ( ((x)<<(1)) & 0xffffffe) | ((x) >> 27); \ + } else { \ + x = ( ((x)<<(2)) & 0xffffffc) | ((x) >> 26); \ + } + +/** + * Set the parity of the key block, used to generate a des key from a + * random key. See @ref des_keygen. + * + * @param key key to fixup the parity for. + * @ingroup hcrypto_des + */ + +void +DES_set_odd_parity(DES_cblock *key) +{ + unsigned int i; + for (i = 0; i < DES_CBLOCK_LEN; i++) + (*key)[i] = odd_parity[(*key)[i]]; +} + +/** + * Check if the key have correct parity. + * + * @param key key to check the parity. + * @return 1 on success, 0 on failure. + * @ingroup hcrypto_des + */ + +int HC_DEPRECATED +DES_check_key_parity(DES_cblock *key) +{ + unsigned int i; + + for (i = 0; i < DES_CBLOCK_LEN; i++) + if ((*key)[i] != odd_parity[(*key)[i]]) + return 0; + return 1; +} + +/* + * + */ + +/* FIPS 74 */ +static DES_cblock weak_keys[] = { + {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, /* weak keys */ + {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE}, + {0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E}, + {0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1}, + {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE}, /* semi-weak keys */ + {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01}, + {0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1}, + {0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E}, + {0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1}, + {0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01}, + {0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE}, + {0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E}, + {0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E}, + {0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01}, + {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE}, + {0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1} +}; + +/** + * Checks if the key is any of the weaks keys that makes DES attacks + * trival. + * + * @param key key to check. + * + * @return 1 if the key is weak, 0 otherwise. + * @ingroup hcrypto_des + */ + +int +DES_is_weak_key(DES_cblock *key) +{ + int weak = 0; + int i; + + for (i = 0; i < sizeof(weak_keys)/sizeof(weak_keys[0]); i++) + weak ^= (ct_memcmp(weak_keys[i], key, DES_CBLOCK_LEN) == 0); + + return !!weak; +} + +/** + * Setup a des key schedule from a key. Deprecated function, use + * DES_set_key_unchecked() or DES_set_key_checked() instead. + * + * @param key a key to initialize the key schedule with. + * @param ks a key schedule to initialize. + * + * @return 0 on success + * @ingroup hcrypto_des + */ + +int HC_DEPRECATED +DES_set_key(DES_cblock *key, DES_key_schedule *ks) +{ + return DES_set_key_checked(key, ks); +} + +/** + * Setup a des key schedule from a key. The key is no longer needed + * after this transaction and can cleared. + * + * Does NOT check that the key is weak for or have wrong parity. + * + * @param key a key to initialize the key schedule with. + * @param ks a key schedule to initialize. + * + * @return 0 on success + * @ingroup hcrypto_des + */ + +int +DES_set_key_unchecked(DES_cblock *key, DES_key_schedule *ks) +{ + uint32_t t1, t2; + uint32_t c, d; + int shifts[16] = { 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1 }; + uint32_t *k = &ks->ks[0]; + int i; + + t1 = (uint32_t)(*key)[0] << 24 | (*key)[1] << 16 | (*key)[2] << 8 | (*key)[3]; + t2 = (uint32_t)(*key)[4] << 24 | (*key)[5] << 16 | (*key)[6] << 8 | (*key)[7]; + + c = (pc1_c_3[(t1 >> (5 )) & 0x7] << 3) + | (pc1_c_3[(t1 >> (5 + 8 )) & 0x7] << 2) + | (pc1_c_3[(t1 >> (5 + 8 + 8 )) & 0x7] << 1) + | (pc1_c_3[(t1 >> (5 + 8 + 8 + 8)) & 0x7] << 0) + | (pc1_c_4[(t2 >> (4 )) & 0xf] << 3) + | (pc1_c_4[(t2 >> (4 + 8 )) & 0xf] << 2) + | (pc1_c_4[(t2 >> (4 + 8 + 8 )) & 0xf] << 1) + | (pc1_c_4[(t2 >> (4 + 8 + 8 + 8)) & 0xf] << 0); + + + d = (pc1_d_3[(t2 >> (1 )) & 0x7] << 3) + | (pc1_d_3[(t2 >> (1 + 8 )) & 0x7] << 2) + | (pc1_d_3[(t2 >> (1 + 8 + 8 )) & 0x7] << 1) + | (pc1_d_3[(t2 >> (1 + 8 + 8 + 8)) & 0x7] << 0) + | (pc1_d_4[(t1 >> (1 )) & 0xf] << 3) + | (pc1_d_4[(t1 >> (1 + 8 )) & 0xf] << 2) + | (pc1_d_4[(t1 >> (1 + 8 + 8 )) & 0xf] << 1) + | (pc1_d_4[(t1 >> (1 + 8 + 8 + 8)) & 0xf] << 0); + + for (i = 0; i < 16; i++) { + uint32_t kc, kd; + + ROTATE_LEFT28(c, shifts[i]); + ROTATE_LEFT28(d, shifts[i]); + + kc = pc2_c_1[(c >> 22) & 0x3f] | + pc2_c_2[((c >> 16) & 0x30) | ((c >> 15) & 0xf)] | + pc2_c_3[((c >> 9 ) & 0x3c) | ((c >> 8 ) & 0x3)] | + pc2_c_4[((c >> 2 ) & 0x20) | ((c >> 1) & 0x18) | (c & 0x7)]; + kd = pc2_d_1[(d >> 22) & 0x3f] | + pc2_d_2[((d >> 15) & 0x30) | ((d >> 14) & 0xf)] | + pc2_d_3[ (d >> 7 ) & 0x3f] | + pc2_d_4[((d >> 1 ) & 0x3c) | ((d ) & 0x3)]; + + /* Change to byte order used by the S boxes */ + *k = (kc & 0x00fc0000L) << 6; + *k |= (kc & 0x00000fc0L) << 10; + *k |= (kd & 0x00fc0000L) >> 10; + *k++ |= (kd & 0x00000fc0L) >> 6; + *k = (kc & 0x0003f000L) << 12; + *k |= (kc & 0x0000003fL) << 16; + *k |= (kd & 0x0003f000L) >> 4; + *k++ |= (kd & 0x0000003fL); + } + + return 0; +} + +/** + * Just like DES_set_key_unchecked() except checking that the key is + * not weak for or have correct parity. + * + * @param key a key to initialize the key schedule with. + * @param ks a key schedule to initialize. + * + * @return 0 on success, -1 on invalid parity, -2 on weak key. + * @ingroup hcrypto_des + */ + +int +DES_set_key_checked(DES_cblock *key, DES_key_schedule *ks) +{ + if (!DES_check_key_parity(key)) { + memset(ks, 0, sizeof(*ks)); + return -1; + } + if (DES_is_weak_key(key)) { + memset(ks, 0, sizeof(*ks)); + return -2; + } + return DES_set_key_unchecked(key, ks); +} + +/** + * Compatibility function for eay libdes, works just like + * DES_set_key_checked(). + * + * @param key a key to initialize the key schedule with. + * @param ks a key schedule to initialize. + * + * @return 0 on success, -1 on invalid parity, -2 on weak key. + * @ingroup hcrypto_des + */ + +int +DES_key_sched(DES_cblock *key, DES_key_schedule *ks) +{ + return DES_set_key_checked(key, ks); +} + +/* + * + */ + +static void +load(const unsigned char *b, uint32_t v[2]) +{ + v[0] = (uint32_t)b[0] << 24U; + v[0] |= b[1] << 16U; + v[0] |= b[2] << 8U; + v[0] |= b[3] << 0U; + v[1] = (uint32_t)b[4] << 24U; + v[1] |= b[5] << 16U; + v[1] |= b[6] << 8U; + v[1] |= b[7] << 0U; +} + +static void +store(const uint32_t v[2], unsigned char *b) +{ + b[0] = (v[0] >> 24) & 0xffU; + b[1] = (v[0] >> 16) & 0xffU; + b[2] = (v[0] >> 8) & 0xffU; + b[3] = (v[0] >> 0) & 0xffU; + b[4] = (v[1] >> 24) & 0xffU; + b[5] = (v[1] >> 16) & 0xffU; + b[6] = (v[1] >> 8) & 0xffU; + b[7] = (v[1] >> 0) & 0xffU; +} + +/** + * Encrypt/decrypt a block using DES. Also called ECB mode + * + * @param u data to encrypt + * @param ks key schedule to use + * @param encp if non zero, encrypt. if zero, decrypt. + * + * @ingroup hcrypto_des + */ + +void +DES_encrypt(uint32_t u[2], DES_key_schedule *ks, int encp) +{ + IP(u); + desx(u, ks, encp); + FP(u); +} + +/** + * Encrypt/decrypt a block using DES. + * + * @param input data to encrypt + * @param output data to encrypt + * @param ks key schedule to use + * @param encp if non zero, encrypt. if zero, decrypt. + * + * @ingroup hcrypto_des + */ + +void +DES_ecb_encrypt(DES_cblock *input, DES_cblock *output, + DES_key_schedule *ks, int encp) +{ + uint32_t u[2]; + load(*input, u); + DES_encrypt(u, ks, encp); + store(u, *output); +} + +/** + * Encrypt/decrypt a block using DES in Chain Block Cipher mode (cbc). + * + * The IV must always be diffrent for diffrent input data blocks. + * + * @param in data to encrypt + * @param out data to encrypt + * @param length length of data + * @param ks key schedule to use + * @param iv initial vector to use + * @param encp if non zero, encrypt. if zero, decrypt. + * + * @ingroup hcrypto_des + */ + +void +DES_cbc_encrypt(const void *in, void *out, long length, + DES_key_schedule *ks, DES_cblock *iv, int encp) +{ + const unsigned char *input = in; + unsigned char *output = out; + uint32_t u[2]; + uint32_t uiv[2]; + + load(*iv, uiv); + + if (encp) { + while (length >= DES_CBLOCK_LEN) { + load(input, u); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + DES_encrypt(u, ks, 1); + uiv[0] = u[0]; uiv[1] = u[1]; + store(u, output); + + length -= DES_CBLOCK_LEN; + input += DES_CBLOCK_LEN; + output += DES_CBLOCK_LEN; + } + if (length) { + unsigned char tmp[DES_CBLOCK_LEN]; + memcpy(tmp, input, length); + memset(tmp + length, 0, DES_CBLOCK_LEN - length); + load(tmp, u); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + DES_encrypt(u, ks, 1); + store(u, output); + } + } else { + uint32_t t[2]; + while (length >= DES_CBLOCK_LEN) { + load(input, u); + t[0] = u[0]; t[1] = u[1]; + DES_encrypt(u, ks, 0); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + store(u, output); + uiv[0] = t[0]; uiv[1] = t[1]; + + length -= DES_CBLOCK_LEN; + input += DES_CBLOCK_LEN; + output += DES_CBLOCK_LEN; + } + if (length) { + unsigned char tmp[DES_CBLOCK_LEN]; + memcpy(tmp, input, length); + memset(tmp + length, 0, DES_CBLOCK_LEN - length); + load(tmp, u); + DES_encrypt(u, ks, 0); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + store(u, output); + } + } + uiv[0] = 0; u[0] = 0; uiv[1] = 0; u[1] = 0; +} + +/** + * Encrypt/decrypt a block using DES in Propagating Cipher Block + * Chaining mode. This mode is only used for Kerberos 4, and it should + * stay that way. + * + * The IV must always be diffrent for diffrent input data blocks. + * + * @param in data to encrypt + * @param out data to encrypt + * @param length length of data + * @param ks key schedule to use + * @param iv initial vector to use + * @param encp if non zero, encrypt. if zero, decrypt. + * + * @ingroup hcrypto_des + */ + +void +DES_pcbc_encrypt(const void *in, void *out, long length, + DES_key_schedule *ks, DES_cblock *iv, int encp) +{ + const unsigned char *input = in; + unsigned char *output = out; + uint32_t u[2]; + uint32_t uiv[2]; + + load(*iv, uiv); + + if (encp) { + uint32_t t[2]; + while (length >= DES_CBLOCK_LEN) { + load(input, u); + t[0] = u[0]; t[1] = u[1]; + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + DES_encrypt(u, ks, 1); + uiv[0] = u[0] ^ t[0]; uiv[1] = u[1] ^ t[1]; + store(u, output); + + length -= DES_CBLOCK_LEN; + input += DES_CBLOCK_LEN; + output += DES_CBLOCK_LEN; + } + if (length) { + unsigned char tmp[DES_CBLOCK_LEN]; + memcpy(tmp, input, length); + memset(tmp + length, 0, DES_CBLOCK_LEN - length); + load(tmp, u); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + DES_encrypt(u, ks, 1); + store(u, output); + } + } else { + uint32_t t[2]; + while (length >= DES_CBLOCK_LEN) { + load(input, u); + t[0] = u[0]; t[1] = u[1]; + DES_encrypt(u, ks, 0); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + store(u, output); + uiv[0] = t[0] ^ u[0]; uiv[1] = t[1] ^ u[1]; + + length -= DES_CBLOCK_LEN; + input += DES_CBLOCK_LEN; + output += DES_CBLOCK_LEN; + } + if (length) { + unsigned char tmp[DES_CBLOCK_LEN]; + memcpy(tmp, input, length); + memset(tmp + length, 0, DES_CBLOCK_LEN - length); + load(tmp, u); + DES_encrypt(u, ks, 0); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + } + } + uiv[0] = 0; u[0] = 0; uiv[1] = 0; u[1] = 0; +} + +/* + * + */ + +static void +_des3_encrypt(uint32_t u[2], DES_key_schedule *ks1, DES_key_schedule *ks2, + DES_key_schedule *ks3, int encp) +{ + IP(u); + if (encp) { + desx(u, ks1, 1); /* IP + FP cancel out each other */ + desx(u, ks2, 0); + desx(u, ks3, 1); + } else { + desx(u, ks3, 0); + desx(u, ks2, 1); + desx(u, ks1, 0); + } + FP(u); +} + +/** + * Encrypt/decrypt a block using triple DES using EDE mode, + * encrypt/decrypt/encrypt. + * + * @param input data to encrypt + * @param output data to encrypt + * @param ks1 key schedule to use + * @param ks2 key schedule to use + * @param ks3 key schedule to use + * @param encp if non zero, encrypt. if zero, decrypt. + * + * @ingroup hcrypto_des + */ + +void +DES_ecb3_encrypt(DES_cblock *input, + DES_cblock *output, + DES_key_schedule *ks1, + DES_key_schedule *ks2, + DES_key_schedule *ks3, + int encp) +{ + uint32_t u[2]; + load(*input, u); + _des3_encrypt(u, ks1, ks2, ks3, encp); + store(u, *output); + return; +} + +/** + * Encrypt/decrypt using Triple DES in Chain Block Cipher mode (cbc). + * + * The IV must always be diffrent for diffrent input data blocks. + * + * @param in data to encrypt + * @param out data to encrypt + * @param length length of data + * @param ks1 key schedule to use + * @param ks2 key schedule to use + * @param ks3 key schedule to use + * @param iv initial vector to use + * @param encp if non zero, encrypt. if zero, decrypt. + * + * @ingroup hcrypto_des + */ + +void +DES_ede3_cbc_encrypt(const void *in, void *out, + long length, DES_key_schedule *ks1, + DES_key_schedule *ks2, DES_key_schedule *ks3, + DES_cblock *iv, int encp) +{ + const unsigned char *input = in; + unsigned char *output = out; + uint32_t u[2]; + uint32_t uiv[2]; + + load(*iv, uiv); + + if (encp) { + while (length >= DES_CBLOCK_LEN) { + load(input, u); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + _des3_encrypt(u, ks1, ks2, ks3, 1); + uiv[0] = u[0]; uiv[1] = u[1]; + store(u, output); + + length -= DES_CBLOCK_LEN; + input += DES_CBLOCK_LEN; + output += DES_CBLOCK_LEN; + } + if (length) { + unsigned char tmp[DES_CBLOCK_LEN]; + memcpy(tmp, input, length); + memset(tmp + length, 0, DES_CBLOCK_LEN - length); + load(tmp, u); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + _des3_encrypt(u, ks1, ks2, ks3, 1); + store(u, output); + } + } else { + uint32_t t[2]; + while (length >= DES_CBLOCK_LEN) { + load(input, u); + t[0] = u[0]; t[1] = u[1]; + _des3_encrypt(u, ks1, ks2, ks3, 0); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + store(u, output); + uiv[0] = t[0]; uiv[1] = t[1]; + + length -= DES_CBLOCK_LEN; + input += DES_CBLOCK_LEN; + output += DES_CBLOCK_LEN; + } + if (length) { + unsigned char tmp[DES_CBLOCK_LEN]; + memcpy(tmp, input, length); + memset(tmp + length, 0, DES_CBLOCK_LEN - length); + load(tmp, u); + _des3_encrypt(u, ks1, ks2, ks3, 0); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + store(u, output); + } + } + store(uiv, *iv); + uiv[0] = 0; u[0] = 0; uiv[1] = 0; u[1] = 0; +} + +/** + * Encrypt/decrypt using DES in cipher feedback mode with 64 bit + * feedback. + * + * The IV must always be diffrent for diffrent input data blocks. + * + * @param in data to encrypt + * @param out data to encrypt + * @param length length of data + * @param ks key schedule to use + * @param iv initial vector to use + * @param num offset into in cipher block encryption/decryption stop last time. + * @param encp if non zero, encrypt. if zero, decrypt. + * + * @ingroup hcrypto_des + */ + +void +DES_cfb64_encrypt(const void *in, void *out, + long length, DES_key_schedule *ks, DES_cblock *iv, + int *num, int encp) +{ + const unsigned char *input = in; + unsigned char *output = out; + unsigned char tmp[DES_CBLOCK_LEN]; + uint32_t uiv[2]; + + load(*iv, uiv); + + assert(*num >= 0 && *num < DES_CBLOCK_LEN); + + if (encp) { + int i = *num; + + while (length > 0) { + if (i == 0) + DES_encrypt(uiv, ks, 1); + store(uiv, tmp); + for (; i < DES_CBLOCK_LEN && i < length; i++) { + output[i] = tmp[i] ^ input[i]; + } + if (i == DES_CBLOCK_LEN) + load(output, uiv); + output += i; + input += i; + length -= i; + if (i == DES_CBLOCK_LEN) + i = 0; + } + store(uiv, *iv); + *num = i; + } else { + int i = *num; + unsigned char c; + + while (length > 0) { + if (i == 0) { + DES_encrypt(uiv, ks, 1); + store(uiv, tmp); + } + for (; i < DES_CBLOCK_LEN && i < length; i++) { + c = input[i]; + output[i] = tmp[i] ^ input[i]; + (*iv)[i] = c; + } + output += i; + input += i; + length -= i; + if (i == DES_CBLOCK_LEN) { + i = 0; + load(*iv, uiv); + } + } + store(uiv, *iv); + *num = i; + } +} + +/** + * Crete a checksum using DES in CBC encryption mode. This mode is + * only used for Kerberos 4, and it should stay that way. + * + * The IV must always be diffrent for diffrent input data blocks. + * + * @param in data to checksum + * @param output the checksum + * @param length length of data + * @param ks key schedule to use + * @param iv initial vector to use + * + * @ingroup hcrypto_des + */ + +uint32_t +DES_cbc_cksum(const void *in, DES_cblock *output, + long length, DES_key_schedule *ks, DES_cblock *iv) +{ + const unsigned char *input = in; + uint32_t uiv[2]; + uint32_t u[2] = { 0, 0 }; + + load(*iv, uiv); + + while (length >= DES_CBLOCK_LEN) { + load(input, u); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + DES_encrypt(u, ks, 1); + uiv[0] = u[0]; uiv[1] = u[1]; + + length -= DES_CBLOCK_LEN; + input += DES_CBLOCK_LEN; + } + if (length) { + unsigned char tmp[DES_CBLOCK_LEN]; + memcpy(tmp, input, length); + memset(tmp + length, 0, DES_CBLOCK_LEN - length); + load(tmp, u); + u[0] ^= uiv[0]; u[1] ^= uiv[1]; + DES_encrypt(u, ks, 1); + } + if (output) + store(u, *output); + + uiv[0] = 0; u[0] = 0; uiv[1] = 0; + return u[1]; +} + +/* + * + */ + +static unsigned char +bitswap8(unsigned char b) +{ + unsigned char r = 0; + int i; + for (i = 0; i < 8; i++) { + r = r << 1 | (b & 1); + b = b >> 1; + } + return r; +} + +/** + * Convert a string to a DES key. Use something like + * PKCS5_PBKDF2_HMAC_SHA1() to create key from passwords. + * + * @param str The string to convert to a key + * @param key the resulting key + * + * @ingroup hcrypto_des + */ + +void +DES_string_to_key(const char *str, DES_cblock *key) +{ + const unsigned char *s; + unsigned char *k; + DES_key_schedule ks; + size_t i, len; + + memset(key, 0, sizeof(*key)); + k = *key; + s = (const unsigned char *)str; + + len = strlen(str); + for (i = 0; i < len; i++) { + if ((i % 16) < 8) + k[i % 8] ^= s[i] << 1; + else + k[7 - (i % 8)] ^= bitswap8(s[i]); + } + DES_set_odd_parity(key); + if (DES_is_weak_key(key)) + k[7] ^= 0xF0; + DES_set_key(key, &ks); + DES_cbc_cksum(s, key, len, &ks, key); + memset(&ks, 0, sizeof(ks)); + DES_set_odd_parity(key); + if (DES_is_weak_key(key)) + k[7] ^= 0xF0; +} + +/** + * Read password from prompt and create a DES key. Internal uses + * DES_string_to_key(). Really, go use a really string2key function + * like PKCS5_PBKDF2_HMAC_SHA1(). + * + * @param key key to convert to + * @param prompt prompt to display user + * @param verify prompt twice. + * + * @return 1 on success, non 1 on failure. + */ + +int +DES_read_password(DES_cblock *key, char *prompt, int verify) +{ + char buf[512]; + int ret; + + ret = UI_UTIL_read_pw_string(buf, sizeof(buf) - 1, prompt, verify); + if (ret == 1) + DES_string_to_key(buf, key); + return ret; +} + +/* + * + */ + + +void +_DES_ipfp_test(void) +{ + DES_cblock k = "\x01\x02\x04\x08\x10\x20\x40\x80", k2; + uint32_t u[2] = { 1, 0 }; + IP(u); + FP(u); + IP(u); + FP(u); + if (u[0] != 1 || u[1] != 0) + abort(); + + load(k, u); + store(u, k2); + if (memcmp(k, k2, 8) != 0) + abort(); +} + +/* D3DES (V5.09) - + * + * A portable, public domain, version of the Data Encryption Standard. + * + * Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge. + * Thanks to: Dan Hoey for his excellent Initial and Inverse permutation + * code; Jim Gillogly & Phil Karn for the DES key schedule code; Dennis + * Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau, + * for humouring me on. + * + * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge. + * (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992. + */ + +static uint32_t SP1[64] = { + 0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L, + 0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L, + 0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L, + 0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L, + 0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L, + 0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L, + 0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L, + 0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L, + 0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L, + 0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L, + 0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L, + 0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L, + 0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L, + 0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L, + 0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L, + 0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L }; + +static uint32_t SP2[64] = { + 0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L, + 0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L, + 0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L, + 0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L, + 0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L, + 0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L, + 0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L, + 0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L, + 0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L, + 0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L, + 0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L, + 0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L, + 0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L, + 0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L, + 0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L, + 0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L }; + +static uint32_t SP3[64] = { + 0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L, + 0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L, + 0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L, + 0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L, + 0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L, + 0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L, + 0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L, + 0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L, + 0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L, + 0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L, + 0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L, + 0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L, + 0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L, + 0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L, + 0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L, + 0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L }; + +static uint32_t SP4[64] = { + 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, + 0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L, + 0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L, + 0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L, + 0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L, + 0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L, + 0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L, + 0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L, + 0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L, + 0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L, + 0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L, + 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, + 0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L, + 0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L, + 0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L, + 0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L }; + +static uint32_t SP5[64] = { + 0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L, + 0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L, + 0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L, + 0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L, + 0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L, + 0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L, + 0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L, + 0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L, + 0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L, + 0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L, + 0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L, + 0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L, + 0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L, + 0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L, + 0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L, + 0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L }; + +static uint32_t SP6[64] = { + 0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L, + 0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L, + 0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L, + 0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L, + 0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L, + 0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L, + 0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L, + 0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L, + 0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L, + 0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L, + 0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L, + 0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L, + 0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L, + 0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L, + 0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L, + 0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L }; + +static uint32_t SP7[64] = { + 0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L, + 0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L, + 0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L, + 0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L, + 0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L, + 0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L, + 0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L, + 0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L, + 0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L, + 0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L, + 0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L, + 0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L, + 0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L, + 0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L, + 0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L, + 0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L }; + +static uint32_t SP8[64] = { + 0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L, + 0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L, + 0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L, + 0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L, + 0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L, + 0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L, + 0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L, + 0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L, + 0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L, + 0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L, + 0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L, + 0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L, + 0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L, + 0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L, + 0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L, + 0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L }; + +static void +IP(uint32_t v[2]) +{ + uint32_t work; + + work = ((v[0] >> 4) ^ v[1]) & 0x0f0f0f0fL; + v[1] ^= work; + v[0] ^= (work << 4); + work = ((v[0] >> 16) ^ v[1]) & 0x0000ffffL; + v[1] ^= work; + v[0] ^= (work << 16); + work = ((v[1] >> 2) ^ v[0]) & 0x33333333L; + v[0] ^= work; + v[1] ^= (work << 2); + work = ((v[1] >> 8) ^ v[0]) & 0x00ff00ffL; + v[0] ^= work; + v[1] ^= (work << 8); + v[1] = ((v[1] << 1) | ((v[1] >> 31) & 1L)) & 0xffffffffL; + work = (v[0] ^ v[1]) & 0xaaaaaaaaL; + v[0] ^= work; + v[1] ^= work; + v[0] = ((v[0] << 1) | ((v[0] >> 31) & 1L)) & 0xffffffffL; +} + +static void +FP(uint32_t v[2]) +{ + uint32_t work; + + v[0] = (v[0] << 31) | (v[0] >> 1); + work = (v[1] ^ v[0]) & 0xaaaaaaaaL; + v[1] ^= work; + v[0] ^= work; + v[1] = (v[1] << 31) | (v[1] >> 1); + work = ((v[1] >> 8) ^ v[0]) & 0x00ff00ffL; + v[0] ^= work; + v[1] ^= (work << 8); + work = ((v[1] >> 2) ^ v[0]) & 0x33333333L; + v[0] ^= work; + v[1] ^= (work << 2); + work = ((v[0] >> 16) ^ v[1]) & 0x0000ffffL; + v[1] ^= work; + v[0] ^= (work << 16); + work = ((v[0] >> 4) ^ v[1]) & 0x0f0f0f0fL; + v[1] ^= work; + v[0] ^= (work << 4); +} + +static void +desx(uint32_t block[2], DES_key_schedule *ks, int encp) +{ + uint32_t *keys; + uint32_t fval, work, right, left; + int round; + + left = block[0]; + right = block[1]; + + if (encp) { + keys = &ks->ks[0]; + + for( round = 0; round < 8; round++ ) { + work = (right << 28) | (right >> 4); + work ^= *keys++; + fval = SP7[ work & 0x3fL]; + fval |= SP5[(work >> 8) & 0x3fL]; + fval |= SP3[(work >> 16) & 0x3fL]; + fval |= SP1[(work >> 24) & 0x3fL]; + work = right ^ *keys++; + fval |= SP8[ work & 0x3fL]; + fval |= SP6[(work >> 8) & 0x3fL]; + fval |= SP4[(work >> 16) & 0x3fL]; + fval |= SP2[(work >> 24) & 0x3fL]; + left ^= fval; + work = (left << 28) | (left >> 4); + work ^= *keys++; + fval = SP7[ work & 0x3fL]; + fval |= SP5[(work >> 8) & 0x3fL]; + fval |= SP3[(work >> 16) & 0x3fL]; + fval |= SP1[(work >> 24) & 0x3fL]; + work = left ^ *keys++; + fval |= SP8[ work & 0x3fL]; + fval |= SP6[(work >> 8) & 0x3fL]; + fval |= SP4[(work >> 16) & 0x3fL]; + fval |= SP2[(work >> 24) & 0x3fL]; + right ^= fval; + } + } else { + keys = &ks->ks[30]; + + for( round = 0; round < 8; round++ ) { + work = (right << 28) | (right >> 4); + work ^= *keys++; + fval = SP7[ work & 0x3fL]; + fval |= SP5[(work >> 8) & 0x3fL]; + fval |= SP3[(work >> 16) & 0x3fL]; + fval |= SP1[(work >> 24) & 0x3fL]; + work = right ^ *keys++; + fval |= SP8[ work & 0x3fL]; + fval |= SP6[(work >> 8) & 0x3fL]; + fval |= SP4[(work >> 16) & 0x3fL]; + fval |= SP2[(work >> 24) & 0x3fL]; + left ^= fval; + work = (left << 28) | (left >> 4); + keys -= 4; + work ^= *keys++; + fval = SP7[ work & 0x3fL]; + fval |= SP5[(work >> 8) & 0x3fL]; + fval |= SP3[(work >> 16) & 0x3fL]; + fval |= SP1[(work >> 24) & 0x3fL]; + work = left ^ *keys++; + fval |= SP8[ work & 0x3fL]; + fval |= SP6[(work >> 8) & 0x3fL]; + fval |= SP4[(work >> 16) & 0x3fL]; + fval |= SP2[(work >> 24) & 0x3fL]; + right ^= fval; + keys -= 4; + } + } + block[0] = right; + block[1] = left; +} diff --git a/crypto/heimdal/lib/hcrypto/destest.c b/crypto/heimdal/lib/hcrypto/destest.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/destest.c @@ -0,0 +1,621 @@ +/* + * Copyright (c) 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifdef KRB5 +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#include + +#include "des.h" + +static void +ecb_test(char key[8], char in[8], char out[8]) +{ + unsigned char k[8], indata[8], outdata[8], outdata2[8], ansdata[8]; + DES_key_schedule s; + + memcpy(k, key, 8); + memcpy(indata, in, 8); + memcpy(ansdata, out, 8); + DES_set_odd_parity(&k); + DES_set_key_unchecked(&k, &s); + DES_ecb_encrypt(&indata, &outdata, &s, 1); + if (memcmp(outdata, ansdata, sizeof(ansdata)) != 0) + errx(1, "des: encrypt"); + DES_ecb_encrypt(&outdata, &outdata2, &s, 0); + if (memcmp(indata, outdata2, sizeof(outdata2)) != 0) + errx(1, "des: decrypt"); +} + +static void +ebc3_test(char key1[8], char key2[8], char key3[8], char in[8], char out[8]) +{ + unsigned char k1[8], k2[8], k3[8], + indata[8], outdata[8], outdata2[8], ansdata[8]; + DES_key_schedule s1, s2, s3; + + memcpy(k1, key1, 8); + memcpy(k2, key2, 8); + memcpy(k3, key3, 8); + memcpy(indata, in, 8); + memcpy(ansdata, out, 8); + DES_set_odd_parity(&k1); + DES_set_odd_parity(&k2); + DES_set_odd_parity(&k3); + DES_set_key_unchecked(&k1, &s1); + DES_set_key_unchecked(&k2, &s2); + DES_set_key_unchecked(&k3, &s3); + DES_ecb3_encrypt(&indata, &outdata, &s1, &s2, &s3, 1); + if (memcmp(outdata, ansdata, sizeof(ansdata)) != 0) + errx(1, "des3: encrypt"); + DES_ecb3_encrypt(&outdata, &outdata2, &s1, &s2, &s3, 0); + if (memcmp(indata, outdata2, sizeof(outdata2)) != 0) + errx(1, "des3: decrypt"); +} + +static void +cbc_test(char key1[8], char iv[8], char in[24], char out[24]) +{ + unsigned char k1[8], + indata[24], outdata[24], outdata2[24], ansdata[24]; + DES_key_schedule s1; + DES_cblock ivdata; + + memcpy(k1, key1, 8); + memcpy(ivdata, iv, 8); + memcpy(indata, in, 24); + memcpy(ansdata, out, 24); + DES_set_odd_parity(&k1); + DES_set_key_unchecked(&k1, &s1); + DES_cbc_encrypt(indata, outdata, 24, &s1, &ivdata, 1); + if (memcmp(outdata, ansdata, sizeof(ansdata)) != 0) + errx(1, "cbc: encrypt"); + DES_cbc_encrypt(outdata, outdata2, 24, &s1, &ivdata, 0); + if (memcmp(indata, outdata2, sizeof(outdata2)) != 0) + errx(1, "cbc: decrypt"); +} + +static void +cfb64_test(char key1[8], char iv[8], char in[23], char out[23]) +{ + unsigned char k1[8], + indata[23], outdata[23], outdata2[23], ansdata[23]; + DES_key_schedule s1; + DES_cblock ivdata; + int num; + + memcpy(k1, key1, 8); + memcpy(indata, in, 23); + memcpy(ansdata, out, 23); + DES_set_odd_parity(&k1); + DES_set_key_unchecked(&k1, &s1); + num = 0; + memcpy(ivdata, iv, 8); + DES_cfb64_encrypt(indata, outdata, 23, &s1, &ivdata, &num, 1); + if (memcmp(outdata, ansdata, sizeof(ansdata)) != 0) + errx(1, "cfb64: encrypt"); + num = 0; + memcpy(ivdata, iv, 8); + DES_cfb64_encrypt(outdata, outdata2, 23, &s1, &ivdata, &num, 0); + if (memcmp(indata, outdata2, sizeof(outdata2)) != 0) + errx(1, "cfb64: decrypt"); +} + +static void +cbc3_test(char key1[8], char key2[8], char key3[8], + char iv[8], char in[24], char out[24]) +{ + unsigned char k1[8], k2[8], k3[8], + indata[24], outdata[24], outdata2[24], ansdata[24]; + DES_key_schedule s1, s2, s3; + DES_cblock ivdata, ivec_copy; + + memcpy(k1, key1, 8); + memcpy(k2, key2, 8); + memcpy(k3, key3, 8); + memcpy(ivdata, iv, 8); + memcpy(indata, in, 24); + memcpy(ansdata, out, 24); + DES_set_odd_parity(&k1); + DES_set_odd_parity(&k2); + DES_set_odd_parity(&k3); + DES_set_key_unchecked(&k1, &s1); + DES_set_key_unchecked(&k2, &s2); + DES_set_key_unchecked(&k3, &s3); + memcpy(&ivec_copy, &ivdata, sizeof(ivec_copy)); + DES_ede3_cbc_encrypt(indata, outdata, 24, + &s1, &s2, &s3, &ivec_copy, 1); + if (memcmp(outdata, ansdata, sizeof(ansdata)) != 0) + errx(1, "cbc3: encrypt"); + memcpy(&ivec_copy, &ivdata, sizeof(ivec_copy)); + DES_ede3_cbc_encrypt(outdata, outdata2, 24, + &s1, &s2, &s3, &ivec_copy, 0); + if (memcmp(indata, outdata2, sizeof(outdata2)) != 0) + errx(1, "cbc3: decrypt"); +} + + +static void +pcbc_test(char key1[8], char iv[8], char in[24], char out[24]) +{ + unsigned char k1[8], + indata[24], outdata[24], outdata2[24], ansdata[24]; + DES_key_schedule s1; + DES_cblock ivdata; + + memcpy(k1, key1, 8); + memcpy(ivdata, iv, 8); + memcpy(indata, in, 24); + memcpy(ansdata, out, 24); + DES_set_odd_parity(&k1); + DES_set_key_unchecked(&k1, &s1); + DES_pcbc_encrypt(indata, outdata, 24, &s1, &ivdata, 1); + if (memcmp(outdata, ansdata, sizeof(ansdata)) != 0) + errx(1, "pcbc: encrypt"); + DES_pcbc_encrypt(outdata, outdata2, 24, &s1, &ivdata, 0); + if (memcmp(indata, outdata2, sizeof(outdata2)) != 0) + errx(1, "pcbc: decrypt"); +} + +static void +cbc_cksum(char key1[8], char iv[8], char *in, size_t len, + uint32_t ret, char out[8]) +{ + unsigned char k1[8], indata[24], ansdata[8]; + DES_key_schedule s1; + DES_cblock ivdata, outdata; + uint32_t r; + + memcpy(k1, key1, 8); + memcpy(ivdata, iv, 8); + memcpy(indata, in, len); + memcpy(ansdata, out, 8); + DES_set_odd_parity(&k1); + DES_set_key_unchecked(&k1, &s1); + r = DES_cbc_cksum(indata, &outdata, len, &s1, &ivdata); + if (ret != r) + errx(1, "cbc_cksum: cksum error"); + if (memcmp(outdata, ansdata, sizeof(ansdata)) != 0) + errx(1, "cbc_cksum: checksum"); +} + +static void +s2k(char *password, const char *salt, char akey[8]) +{ + DES_cblock k; + size_t l = strlen(password) + strlen(salt); + char *pw = malloc(l + 1); + strcpy(pw, password); + strcat(pw, salt); + + DES_string_to_key(pw, &k); + if (memcmp(akey, &k, 8) != 0) + errx(1, "key wrong for '%s'", pw); + free(pw); +} + +static void +weak_test(int is_weak, const char akey[8]) +{ + DES_cblock key; + memcpy(&key, akey, sizeof(key)); + if (DES_is_weak_key(&key) != is_weak) + errx(1, "weakness is wrong"); +} + +/* + * + */ + +int +main(int argc, char **argv) +{ + _DES_ipfp_test(); + + ecb_test("\x31\x16\xe3\x57\x97\xa8\x68\xe5", + "\xbb\xe4\x48\x6e\xdf\x9a\x05\x4f", + "\xa8\x82\xa0\x15\x76\xeb\xfd\xc7"); + ecb_test("\xfe\x4a\x19\xa1\x45\xa7\xb9\xd0", + "\x2a\x67\x3c\x07\x59\x4d\xde\xb8", + "\x9d\x61\xd5\x1c\xd7\xd0\xd3\x8b"); + ecb_test("\xbf\x13\x25\xec\xa4\xbc\x1a\x54", + "\x16\xa5\xd9\x30\x0f\x55\x20\x71", + "\x04\x44\x6c\xe0\x32\x32\x78\xd2"); + + ebc3_test("\x7c\x2f\x79\xd5\xb5\x37\x01\xcb", + "\xb9\xbc\x86\xea\x04\x45\xab\x2c", + "\x19\x1c\xcd\x83\x8a\x29\x97\x3e", + "\x87\x03\x59\xdd\xf4\xc6\xeb\xb7", + "\xcc\x72\x66\x85\xed\xa2\xee\x09"); + ebc3_test("\x10\x34\x32\x4c\xc4\x9b\x57\x5b", + "\xb0\x6e\xb6\x26\xd6\x52\x2c\x15", + "\xa7\x64\xf8\x20\xc1\x89\x73\xc1", + "\x37\xa4\xad\x4d\x76\xee\x7c\x02", + "\xdf\xb9\x2b\x99\x59\x71\xc4\x89"); + ebc3_test("\xf8\xa7\xfd\xe6\x6d\x73\x34\x26", + "\x4c\xbf\x40\x5d\x5d\xf4\x31\xef", + "\x04\xdf\xf2\x58\xd0\x5e\x54\x68", + "\x44\x2a\xa2\x19\xbd\x0a\x2b\x61", + "\x17\x26\x39\xd5\xd5\xd9\x40\x71"); + ebc3_test("\x13\x5e\x23\x07\x2c\x16\x0d\x25", + "\x64\x6d\x2f\xe0\x68\xa8\x16\x75", + "\x7c\x7c\x19\x64\xbc\xae\xe0\x0e", + "\x7b\x8c\x76\x76\xb0\x95\x7f\xed", + "\xe2\x6e\x05\x1d\xdc\x74\xc1\xb7"); + ebc3_test("\xbc\x92\x32\xb6\x68\x0d\x73\x19", + "\x70\xef\x98\x19\xe9\xec\x04\x1c", + "\x02\x4c\x75\x08\xce\xc4\x34\x16", + "\x73\xab\x28\x69\x6a\x20\x2f\x99", + "\x3b\xb1\x2d\xb6\x21\x0a\x44\xca"); + ebc3_test("\x01\x98\x16\xea\x85\xd5\x3b\x8a", + "\x73\x23\xb5\x49\xd9\x10\x5b\xea", + "\xb6\xc4\xce\xc4\x89\x92\x0e\x15", + "\xd9\x35\xcf\x21\x47\x7b\xdf\xb5", + "\xa1\x71\x57\x1f\x1e\x84\x08\xac"); + ebc3_test("\x58\x6d\xbc\x04\x70\x4f\xe6\x3e", + "\xcd\x76\x26\x01\xae\xce\x0b\xe5", + "\xf2\x4f\x64\x16\x8f\x0d\x4f\x6b", + "\xa7\x0d\xa0\x56\xa0\x8b\x2a\x77", + "\xe5\x12\x9b\x8a\x92\xc8\xdd\xe1"); + ebc3_test("\x40\xd6\xad\x43\x52\x23\xa7\xcd", + "\x04\x19\xae\x94\xce\x46\x31\xd3", + "\x45\x6e\x3b\xb5\x4f\x37\x5e\x9d", + "\xbd\xb0\x60\x75\x91\x02\x48\xf4", + "\xb5\xa1\xe6\x4b\x4e\xa3\x8c\x4b"); + ebc3_test("\x91\xab\x80\x9b\x97\xf4\x58\x5e", + "\xc2\x68\x46\x61\x9e\x04\xa1\x29", + "\xc7\xe5\x5b\x32\xcb\x43\xc8\xa4", + "\x31\x38\x90\x1c\xc8\x78\x12\x50", + "\xf8\x65\xae\xa1\xdf\x4e\xbf\xa8"); + + cbc_test("\x57\x98\x7a\x8a\x29\x7c\xc1\xad", + "\xe1\x28\x69\x58\xd6\x91\x9f\x4e", + "\xa0\x11\x1a\xdd\xeb\x62\xb8\x9e\x28\x08\x6e\x0b\x6d\x6d\x57\x31\x1b\x4c\x82\x4c\xc3\x19\xe0\x93", + "\x42\xa5\x2f\x26\xbb\x92\x3a\x6b\x64\xe0\x3b\x1a\x33\x5a\x9c\x2b\xc8\xd9\x41\x37\x8d\x3e\x58\xbf"); + cbc_test("\x23\xd6\xec\x86\x86\x4f\x02\xcd", + "\xfe\x8e\xa4\x07\x35\x41\x14\x99", + "\xe3\xc2\x5d\x6e\x81\xae\xa0\xe8\xc8\xdd\xd2\x0d\xf4\x26\x90\x10\xca\x8c\x07\x58\xb2\x17\xcc\x1a", + "\x97\xb9\xbc\xa6\xd1\x98\xc1\x7f\x4b\xac\x61\x8a\x16\xec\x1f\xee\x28\x6f\xe8\x25\xf0\x41\xbc\xde"); + cbc_test("\x07\xe5\xc8\x52\xba\x3d\xef\xcd", + "\xa9\x21\x3e\x84\x44\x7c\xce\x1a", + "\xfc\x03\x72\x30\xb0\xcb\xe8\x99\x21\x54\x4d\xfa\x86\xdd\x99\xe1\x96\xe7\x7c\xb5\xbd\x5b\x6f\xd0", + "\x27\x76\x66\x62\x1f\xcf\x48\xdb\x15\x11\x73\x8b\xe0\xc9\xbd\x2b\x40\xae\x0c\x35\xeb\x93\xa3\x1c"); + cbc_test("\xef\x2f\x07\xd6\x2f\x70\x4f\x68", + "\x16\x1e\xaf\x87\x3a\x83\x9f\x33", + "\xb8\x4c\xb3\xbf\xfa\x5d\xa9\xc7\x1c\x15\x8d\x39\xf2\x29\xf5\x5a\x3d\x21\x0d\x61\x05\xaa\x48\x92", + "\x51\x85\x2f\xad\x67\xb6\x0a\x15\xb8\x73\x15\xf1\x79\x9d\xed\xf5\x6c\x11\x22\xe5\x48\x51\xab\xae"); + cbc_test("\xd0\x2c\x68\xc1\xe6\xb0\x76\x98", + "\xc7\x4f\x31\xa9\x5d\xd5\x5b\xcc", + "\x9d\x4b\x2a\x54\x60\xf1\xb0\x10\x34\x87\xdc\x25\xa5\x80\x6c\x4d\x0c\x7f\x53\x37\x58\x42\xc7\x26", + "\x79\xc5\xf0\x21\x0d\x7a\x38\xc0\x66\x9a\x07\x2f\xa4\x9c\x1f\xbb\x66\x4d\x6c\x86\x5b\x47\x44\x60"); + cbc_test("\xd6\xe3\x75\x92\xb0\x8f\x45\x70", + "\xdc\xc6\xab\x3e\xf2\x7e\x13\xd6", + "\x38\x57\x27\x0a\xef\x74\x94\x82\x92\xfa\x28\xed\xff\x24\x1e\x0e\x8f\xaa\x9e\x24\x2f\x41\x65\x78", + "\x1d\xcc\x07\x55\xe8\xea\xd1\x08\x55\x11\x72\xfe\xdb\xdf\xa0\xc9\xb6\x3a\x2e\xdf\xf0\x67\xd3\xf4"); + cbc_test("\xb3\xbc\xb5\x61\x04\xda\x1a\x34", + "\x8e\x4e\xa5\x8a\xeb\x6a\xea\xbb", + "\x72\x73\x51\xe0\x58\xc5\x2e\xe1\x64\x10\x05\x59\x64\x70\x3f\xbe\x43\xa2\xed\x7a\x5d\x1b\x9c\xc7", + "\xa6\xb2\xf2\xea\x96\x62\xfb\x2f\x2a\x6a\xa1\x2f\x8e\xe1\x12\xd2\xe4\x82\x4c\xc1\x00\x74\x9c\x8f"); + cbc_test("\x8f\xdf\x01\x89\xfe\x13\x9b\x2c", + "\x66\x18\xf8\x80\xa1\x3b\x1b\x91", + "\x32\xdb\xae\xa7\x3b\x77\xb2\x6e\xcc\xa5\xa1\x2e\x15\x19\x49\x83\x2f\xfb\x94\xcc\xd1\xa1\x4b\x02", + "\x47\x31\xca\x04\x4d\x1a\x24\x39\xda\x71\xc5\xb8\x7f\xea\x79\xf5\x43\xa6\x53\x15\x78\x84\x34\x75"); + cbc_test("\xe5\x34\xb6\x75\x68\x07\x70\x85", + "\x73\x98\x29\xf7\x7a\xe7\xe7\xb7", + "\x9c\x9e\x4c\xa6\x62\x21\xc4\x15\x47\x43\xd5\xf2\x3a\xf3\xfd\xb5\x53\xa7\x16\x9e\xa6\x4f\x0d\xac", + "\x81\x2d\xa4\x99\x60\xbf\x9c\xf4\x46\x1d\xee\xc6\xb0\xe1\x4a\x29\xea\xfd\xce\x4b\xa1\x45\x93\x7b"); + + cbc3_test("\x61\xcb\x8c\xb0\x32\x2a\xc2\x5d", + "\x98\xe3\x49\xc1\x0d\xb5\x67\xce", + "\xf2\x43\x10\x61\x85\x6b\xa7\x15", + "\x65\xf5\x8f\x1a\x2b\x33\xf2\xb5", + "\x8c\x06\xe0\x60\x68\x25\x9c\x95\x81\x46\xda\x41\x9d\xa8\x9c\x49\x2f\xee\x33\x35\x95\x11\xbd\xa0", + "\x93\x27\xed\xc7\x35\xb9\xe5\x3c\x7b\x10\x3e\x39\x01\x41\x61\x04\xe7\xf2\xd9\x63\x96\xca\x57\xf1"); + cbc3_test("\x15\x61\x6b\x76\xae\x0e\x98\x01", + "\x76\xce\x9d\x94\xa7\xe3\x73\xa4", + "\x19\xd9\x15\x98\x9b\xba\x83\x40", + "\x60\xef\xc2\xc6\xa2\x40\x01\xc7", + "\x8b\x4d\xf4\x37\xad\x1c\xc2\x4e\xcc\xc4\x4b\x17\x67\xf7\xfa\xec\xf8\x94\x6f\x7a\x84\x56\x81\x09", + "\x68\xdf\x82\xcb\xd9\xcd\x3d\xca\x12\x0e\x2e\x39\xba\xf7\x5a\x8c\x41\xbd\x6f\x9d\x85\xfe\x1b\x1d"); + cbc3_test("\xd5\x2a\x4f\xa4\x13\x9e\x73\x15", + "\x6d\x75\xa8\x15\x07\xd3\x7c\x79", + "\xd5\xe0\xa7\x91\xf8\xf2\x9d\xcd", + "\x4c\xdb\x56\xb8\x6f\x0e\x2a\x59", + "\xbe\x64\x20\x24\x7d\x2b\x6b\xf4\xd9\xc0\xa0\x9b\x8d\x88\x6e\x50\x6f\xf8\xb6\x4a\x7e\x52\x52\x93", + "\x01\x83\x75\x7b\xd6\x03\xff\xd8\xe9\x6d\x6c\x92\x24\x25\x35\xfa\x43\x4c\x40\xff\xec\xb0\x8b\x50"); + cbc3_test("\x02\xad\x13\x31\xd5\xd6\xef\x7c", + "\x86\x3e\x02\xce\x94\x97\x37\xba", + "\x01\x07\x20\x04\xf8\x92\xb6\xb3", + "\x26\x79\x1b\xef\x90\x54\xd6\xc1", + "\x55\xee\xea\x81\x42\x8b\xbf\xfb\x6c\x14\xec\xbd\xba\x55\x0d\xc4\xd2\xd6\xf0\xea\xd1\x03\xde\x5b", + "\x69\x49\xc5\x48\x4f\xda\x03\x90\x84\xef\x86\xd2\x98\xa7\xae\xfa\x17\x35\x7e\x06\xbd\xd3\x51\x0b"); + cbc3_test("\x3d\x9b\xae\x5b\x7f\x91\x85\xe0", + "\xdf\x07\xb3\xdf\x97\x0b\x43\x80", + "\xe3\x46\x58\xd9\x68\x79\xb3\xae", + "\xd4\x27\xee\x5d\x73\xb1\x82\xf5", + "\x44\x86\x9a\xa6\x79\x2d\x9e\x94\x11\x6c\x7b\xc6\xe8\xef\x63\x95\x71\xc6\x62\x20\x43\x87\xaf\x65", + "\xc2\xf5\xbc\x91\xc5\x7c\x69\xb2\x05\xcc\x28\x92\xc1\x96\x5a\xc2\xcb\x0c\x71\xc7\x51\x7d\x0c\xcc"); + cbc3_test("\x43\x8c\x23\x92\xd5\x92\x67\xfb", + "\x5b\x5e\xb0\x31\x1c\x9d\x5d\x10", + "\x8a\xa2\x16\x64\xd6\xa4\xc4\x5b", + "\x06\xc5\xdd\xa3\x4a\x2b\x37\xb7", + "\x99\xd5\x76\xee\x7c\x4d\xcc\x18\x39\x78\x16\x7c\xcc\x1a\x0a\x27\xdb\xf1\x5f\xe1\x87\x86\xb7\x2c", + "\x91\xbe\xaf\x79\xd0\x14\x7c\x05\x60\x1c\x7e\xd6\x22\x15\xac\xed\xf3\x78\xa5\xc7\x52\xa0\x60\x49"); + cbc3_test("\x80\xc2\x86\x7a\x51\x45\x29\x1c", + "\xc7\xfd\xad\xd0\x7c\x4a\xd0\x3e", + "\xe6\x89\x98\xfe\x01\x67\x20\x89", + "\x5c\x23\xe4\x26\x82\x27\xad\xeb", + "\xa1\x38\x4e\xf1\x07\x1a\xdd\x25\x47\xe6\xda\x9d\xa9\xfe\x98\x55\x05\x95\x75\xc2\x59\x18\xcf\xf1", + "\x36\x58\xea\xc5\xf8\x41\xa7\x49\xe8\x22\x75\xfe\xb6\x8b\xdd\x0d\xf0\x66\x42\xe6\x84\x23\x29\xff"); + cbc3_test("\xbc\x68\x54\x85\x2c\xc1\xe0\x07", + "\x7c\x6e\x34\x04\x6b\x91\xc4\x54", + "\x9d\xa4\xda\xa1\xda\x6d\xdc\xd3", + "\x1c\x3d\xa9\x41\xa2\xe5\xff\x8a", + "\x0a\x58\xff\x5a\xec\xc1\x7e\x94\x24\xf4\x4f\xdc\x5b\x29\xe2\x78\x62\x8a\xd2\xe2\xd7\x45\x54\x17", + "\x80\x68\xa6\xed\x87\x40\xd5\x32\xd2\xb8\x32\x61\x35\xae\xae\xf7\x14\x1f\x98\xdb\xba\x21\x4f\x9f"); + cbc3_test("\xa1\x2a\x7a\x67\xfe\xea\xd3\xe3", + "\x70\xe5\xd5\x4c\xf1\xce\x4c\x26", + "\x75\x4c\x85\x16\xb5\xc8\x07\xe9", + "\x4c\xa4\xb5\xdd\x86\x86\x70\x5a", + "\x0d\x07\xfd\x23\xc1\x1d\x65\xd8\xb2\x79\xb8\xa3\xc5\x8e\x47\xbe\x0f\xed\x7b\x15\x43\xe9\x7c\x5e", + "\xde\x17\xfe\x05\x43\x80\x85\xd0\x9c\x60\xe0\xbe\x8d\xa2\x65\x0e\x63\x02\x72\xb6\xf3\x7d\xda\x90"); + + + pcbc_test("\xe3\xf2\xb0\x26\x7c\x4a\x94\x80", + "\x40\x08\x4c\x44\xa3\xb5\xf7\x97", + "\xe7\xbd\x54\xa1\xbb\x48\x67\xcd\xe0\xee\xff\x8d\x3d\x25\x2b\xf0\x61\x48\xbe\xf2\x63\x5d\xce\x4a", + "\xf5\xe9\x48\xdc\xb8\x61\x39\xa9\x90\x27\xec\x09\x23\x50\xe0\xa9\x78\xb2\x1c\x29\x3c\xa7\x6c\x88"); + pcbc_test("\xfd\x54\x2a\x5b\x97\xa4\x5b\x52", + "\x37\x36\x6e\x22\x7e\x66\x08\x8c", + "\xe4\x2d\x81\x88\x86\xb2\x44\x55\x80\x3d\x3c\xbd\x42\x9f\x5d\xdb\x4b\x63\x23\x1c\x31\x13\xa6\x0f", + "\x9c\x9f\x65\x05\x79\x91\x71\x96\x82\x2a\xc0\xe5\xa0\x6f\x71\xab\x68\x32\xd4\xd7\x5e\x38\x38\xf6"); + pcbc_test("\x25\x91\x08\xe5\x57\x85\xb6\x20", + "\x47\x6e\xbe\x9f\xb9\x6b\x55\xe9", + "\x44\xfd\xdd\x42\x07\x99\xf0\x8f\xdb\xa5\x14\x1e\x76\x07\x90\x5b\x29\x10\x21\xb9\x7e\xac\xc7\x77", + "\x88\x4f\xdc\x6e\x37\x5e\x4e\xac\x8d\x3f\x9d\xd1\x82\x51\x65\xf5\xf9\x08\xa7\xac\x01\x61\x19\x85"); + pcbc_test("\x6d\x43\xc7\x9d\x6b\x97\x64\x40", + "\x56\xfb\xcb\xb3\x97\xb5\x70\x13", + "\x54\x67\xa9\x42\x86\x85\x81\x8f\xb4\x72\xa2\x5f\x2d\x90\xbb\x5c\xb5\xb9\x9b\x71\x8f\x2b\xae\x05", + "\x2c\xd1\x63\x6f\x11\x1d\x5e\x40\x8c\x47\x49\x12\x31\x48\xb7\x12\x4c\xc1\x6a\xaf\x0e\x33\x11\xe1"); + pcbc_test("\x3b\xa2\xbc\xd5\x5d\x9d\xdf\x73", + "\x43\xb7\x26\x71\xce\x6d\x97\xac", + "\x4e\xf6\x7d\xd7\xfc\x6b\x35\x54\xae\xc9\xfe\xf7\xb7\x1e\x47\xa5\x61\x44\x50\xb3\xe4\xe8\x7d\xdc", + "\x4d\xda\xbd\xad\xc4\xde\xdc\xf4\xfc\xbd\xfc\xa7\xbd\xe4\x7e\x73\x28\xc5\x5c\xd0\x9a\x35\x39\xa6"); + pcbc_test("\x46\x9e\xda\xdf\x0d\x97\x8a\xd3", + "\x6c\x9f\xdf\xc0\x48\x3b\xa5\x17", + "\xb9\xd8\x99\x61\x67\xf3\xec\xa9\xc1\x29\xa3\x8b\x63\xe2\xc2\x28\xaf\x56\x2d\x39\x1d\xeb\x7c\xbc", + "\x70\x5d\xd4\x54\x90\xb9\x6c\x0c\x93\x96\x6a\x4a\x4e\xb8\x80\xce\xb3\xcd\x64\xa7\x6c\xb2\xe4\xc9"); + pcbc_test("\x31\x89\x51\x38\x2f\x97\xfe\xef", + "\x17\xdc\xf8\xde\xcc\x8f\x40\x3e", + "\xef\xcf\xe9\x9e\x11\xd8\x35\xdf\x58\x11\xd0\x0a\x68\xce\xe1\x6b\xb5\xca\x68\x47\xb7\xb9\x9a\x34", + "\x3a\x93\x47\x3c\x1b\xa9\xeb\x88\x13\xfd\x1b\xd8\x76\xb5\xd3\xe2\xb8\x83\x10\x56\x68\xab\xe1\x28"); + pcbc_test("\xba\x1c\x70\x94\x62\x10\x19\xda", + "\x7a\x8b\xc0\x9e\x00\xbb\x7e\xcb", + "\x30\x74\x6b\xa6\xd6\x07\xae\x44\xd6\x5c\xe6\x18\x97\x90\xaa\x08\xcb\xa8\xf4\x8b\xea\x8b\x4f\xe6", + "\x0a\x77\x24\x7c\xcd\xf8\x06\x01\x20\x02\x14\x33\xd6\xf4\x4e\x89\xc0\x38\x65\x44\x6b\x9c\x92\x16"); + pcbc_test("\xfe\x97\xf2\x6d\x8f\x0d\x86\x94", + "\x30\x8a\x7d\x9b\xf4\x28\x6e\x84", + "\x82\xb0\x9b\x42\xf6\xdc\x38\x41\x41\x03\x60\x28\x7f\x90\x08\x8b\x6c\x55\xe7\x76\xcd\xa7\xae\xbc", + "\x35\x0b\xf1\xc0\x56\x64\x6f\x7b\x3e\x1f\xd1\x90\xbd\xda\x10\xb1\xd1\x49\xc6\x62\x5f\xf9\x6c\xf9"); + + + cbc_cksum("\x58\x83\x67\xfb\xdf\x51\x7c\xfd", + "\x46\x0a\xa5\x94\x6b\xd6\xaa\x91", + "\x15\x0b\x16\x3a\x56\x79\x33\xdf\x6e\xa0\xd9\x54\x14\x7b\x37\xa9\xb1\x15\xe1\x28\xfe\x35\xe9\x34", + 24, + 0x16466788, + "\xa7\xbd\x2a\x1b\x16\x46\x67\x88"); + cbc_cksum("\xf1\xe0\x91\x1c\xfe\x10\xe5\xb5", + "\x9c\xc6\x7d\xf3\x3e\x58\x40\x06", + "\x9c\x90\x88\xfe\x9c\x38\xc0\xd5\xaa\xc6\xf2\xc2\x7d\x00\xf6\x5f\xbd\x87\x25\xbe\x41\x64\x9f\xb7", + 24, + 0xd8a127cc, + "\x93\x5d\x75\x62\xd8\xa1\x27\xcc"); + cbc_cksum("\x20\xbf\xdc\xd5\x5b\x9d\xc8\x79", + "\x68\xdc\xe2\xfa\x18\xb3\xa9\xe0", + "\xef\xba\xc4\x8b\x78\xc2\x02\xc2\x74\x71\x9f\xfa\x4b\xa2\x8a\xe5\xfb\x82\x3d\x48\xcf\x28\x08\x42", + 24, + 0x45236285, + "\xc0\xb9\x2c\x86\x45\x23\x62\x85"); + cbc_cksum("\x31\x6d\xa8\xc2\x43\x16\x64\xea", + "\x7b\x5e\x9f\x7c\xb8\xa3\xbd\x89", + "\x8a\xd4\xe4\x77\xbb\x45\x17\x3d\xd2\xef\xe6\xb9\x65\x8b\xb3\xa9\x28\xef\xd7\x0c\xa8\x47\x5d\xb8", + 24, + 0x3f021cb2, + "\x10\x94\x4c\x2f\x3f\x02\x1c\xb2"); + cbc_cksum("\xd5\x75\x51\x8f\xc8\x97\x1a\xc4", + "\xbc\x7a\x70\x58\xae\x29\x60\x3a", + "\x8d\x2c\x70\xdb\x53\xda\x0f\x50\xd9\xb5\x81\x18\x26\x66\x84\xda\xf6\x32\xa0\xe5\xf9\x09\xfd\x35", + 24, + 0x2f64dd4f, + "\x89\xe4\x70\x0d\x2f\x64\xdd\x4f"); + cbc_cksum("\xda\x6e\x32\x80\x20\xbc\x67\x54", + "\xf4\x93\x86\x43\x29\x57\x6e\xec", + "\xfe\xd8\xfe\xad\x4e\x05\xd8\xb8\x9b\x9f\xaa\xa5\x90\x6d\xcb\xff\x40\xab\xc5\x25\x2b\xda\xa7\x09", + 24, + 0x6281ce23, + "\xa1\x88\xc2\x3d\x62\x81\xce\x23"); + cbc_cksum("\xb6\xc7\x75\x8a\xfb\xd3\xf8\xad", + "\xf1\x4f\xd7\x39\x4b\xec\xa3\x99", + "\x31\xd0\x45\x9d\x62\xe3\x49\xbb\x58\xc2\x58\xbe\x13\x51\x1e\x3f\x54\xe5\x31\x7d\xd0\x94\x57\x7a", + 24, + 0x09c7ee4e, + "\x2f\x40\xb3\xd2\x09\xc7\xee\x4e"); + cbc_cksum("\xa8\x4f\x16\xf4\x89\x3d\xf7\xec", + "\x04\x78\xbc\xd3\x4f\x32\xfd\x46", + "\xe5\x44\x30\x5e\x55\xa3\x08\xe9\xcd\xd1\xbe\x63\x66\x26\x27\x62\xc3\x4f\x2a\x50\x69\x21\x24\xde", + 24, + 0xdf3357c7, + "\xa8\x6e\x80\x3b\xdf\x33\x57\xc7"); + cbc_cksum("\xd6\x4f\x40\xef\x8a\x2a\xf1\x20", + "\xd5\x40\xe7\x86\x36\x26\x79\xc9", + "\xcc\x74\x2b\x78\xca\x47\xb0\xd3\xe6\x72\x42\x76\xee\x80\xb0\xe5\x78\x12\x3b\x4e\x76\x91\xda\x1a", + 24, + 0x14a5029a, + "\x33\xd2\xb5\x8a\x14\xa5\x02\x9a"); + + cbc_cksum("\xfb\x89\xa1\x9d\xa7\xec\xc1\x5e", + "\x9c\x7f\x47\xd0\x79\x5d\x4b\x97", + "\xb6\x8b\x48\xe0\x01\x78\xec\x50\x7f\xf1\xfd\xd2\x87\x76\xba\x4b\x9c\x5c\xc7\x25", + 20, + 0xa1471604, + "\x39\x5b\x7d\xb1\xa1\x47\x16\x04"); + cbc_cksum("\x70\xb3\xc4\x0b\x5b\x4f\x98\xe5", + "\x86\xc0\x05\x1a\xd5\x8f\x78\x2c", + "\xef\x01\x7b\xd8\xff\x68\x5d\x66\xb6\xbe\xd8\xf5\xb9\xed\x4e\xec\xe3\x3c\x12\xc5", + 20, + 0xc4b74f9a, + "\x2b\x07\xe3\x90\xc4\xb7\x4f\x9a"); + cbc_cksum("\xfe\x04\xcb\xfe\xef\x34\xe9\x58", + "\xd9\x28\xae\xc0\x2c\xd3\xf6\xb0", + "\x24\x25\x9b\x67\xda\x76\xa6\x64\x6f\x31\x94\x18\x2e\x06\x71\x82\xaf\xbd\x86\x63", + 20, + 0xbd7c84e6, + "\x70\x3e\x91\xf5\xbd\x7c\x84\xe6"); + cbc_cksum("\x10\xc2\x70\x94\x9b\x16\x20\x1c", + "\x62\xed\x5a\x48\x6c\xf3\x51\xa0", + "\x90\x3e\x06\xc1\x63\x6a\x1f\x1a\xfe\x9d\x74\xb6\x13\xde\x62\xd2\x6f\x19\x37\x25", + 20, + 0x26761f96, + "\x8b\x6a\x9c\x85\x26\x76\x1f\x96"); + cbc_cksum("\x61\x32\x7c\x7f\x31\xc7\x98\xe6", + "\xd9\xba\x0d\x9d\x9e\xa3\xcc\x66", + "\x98\x8f\xc6\x5a\x54\x04\x63\xd9\x53\x86\x5d\x75\x53\x48\xcc\xa3\x00\x7a\x12\xe5", + 20, + 0xf0f6ad33, + "\x6a\xfb\xed\xd3\xf0\xf6\xad\x33"); + cbc_cksum("\x85\xdf\x01\x2c\xab\x3b\xec\x13", + "\xc6\x44\x87\x5b\x78\x2a\x74\x92", + "\x8b\xf5\x0d\xff\x5c\xb3\xc1\xcd\x9e\xf7\xb8\x8e\x3b\xf8\x61\x4d\x26\x6a\x7b\xe8", + 20, + 0x7acfe214, + "\x52\xb7\x05\xe9\x7a\xcf\xe2\x14"); + cbc_cksum("\x49\xdf\xb0\x16\x7f\xec\x10\x52", + "\x09\xa3\x36\x8f\xe9\xe0\x06\x19", + "\x3a\x0f\x66\xf7\x7a\x47\x34\xe4\xaa\x09\x36\x90\xe9\x90\x19\xff\x99\x94\x92\x04", + 20, + 0x9a3a59bb, + "\xd3\xe2\xce\xfc\x9a\x3a\x59\xbb"); + cbc_cksum("\x5b\xbf\x4c\xc8\xce\xf4\x51\x1a", + "\x7c\xee\xc0\x5a\x20\x2b\x10\x22", + "\x05\x1d\xec\xdb\x30\x73\xf2\x21\xbf\x64\xe0\x5f\xdf\x02\x79\xe9\x47\xf2\x9c\x4e", + 20, + 0xaf9d3602, + "\xaa\xf3\xa2\x5a\xaf\x9d\x36\x02"); + cbc_cksum("\xad\xda\xa2\x19\x6d\x37\xda\x67", + "\xb2\x10\x0f\xd5\xda\xdd\x17\xfc", + "\x44\x02\x6b\xd6\xd4\x8c\x42\x58\x8b\x59\x35\xce\xd7\x04\x6b\x35\xa6\x5f\x28\x97", + 20, + 0xd112a978, + "\xb2\x5f\x6a\x07\xd1\x12\xa9\x78"); + + + s2k("potatoe", "WHITEHOUSE.GOVdanny", + "\xdf\x3d\x32\xa7\x4f\xd9\x2a\x01"); + s2k("password", "ATHENA.MIT.EDUraeburn", + "\xCB\xC2\x2F\xAE\x23\x52\x98\xE3"); + s2k("\xf0\x9d\x84\x9e", "EXAMPLE.COMpianist", + "\x4f\xfb\x26\xba\xb0\xcd\x94\x13"); + s2k("NNNN6666", "FFFFAAAA", + "\xc4\xbf\x6b\x25\xad\xf7\xa4\xf8"); + s2k("", "", + "\x01\x01\x01\x01\x01\x01\x01\xf1"); + + cfb64_test("\x45\xc2\x0b\x01\x40\x08\x13\x8a", + "\x9a\xef\xf4\x37\x41\x69\x0b\xd6", + "\x5d\x12\x5d\xf5\xae\x1d\xc6\x47\x21\xd3\x16\xba\x45\x0e\x9d\x4c\x00\xfd\xf8\x64\xca\x69\x67", + "\xff\x99\x06\xd8\xe9\xbc\xae\x7e\xde\x49\x7b\x34\x5d\xa0\x74\x61\x9b\x6f\x70\x38\x40\x40\xba"); + cfb64_test("\xdc\xe9\x51\xc4\x0b\xad\x85\xa8", + "\xf5\x56\x6c\xef\x42\xed\x9f\xa8", + "\x7d\xe5\xeb\x04\x5c\xaf\x8c\x5b\xf4\x88\xba\x4a\x99\x6a\x3a\x79\xc0\x88\x01\x05\xac\x98\x3c", + "\x53\x87\x11\xc4\xa6\xf3\x1e\x67\x56\xfc\x8c\x63\xf0\x2e\xd9\x0e\x4a\x86\x8e\x5b\xa7\xde\xcf"); + cfb64_test("\x25\xf7\xa7\x0e\x85\x4f\x5b\xb6", + "\x83\xae\x73\x03\xea\xeb\x82\x05", + "\x1b\x80\x23\xdc\x61\x23\xa7\xde\x80\xf6\xec\xb1\xc1\x6d\x3e\x59\x1f\x76\x6d\xdf\xfa\x42\xc7", + "\xe2\xf7\x8d\x2f\x86\xce\x1f\xfc\xdb\x82\xb9\xb5\x9c\xa9\xf4\x9c\x2b\x3f\x34\x6c\x83\xf7\x7e"); + cfb64_test("\xab\xd5\xd3\x68\xf1\x2c\x0e\x0d", + "\x8a\xea\xe8\xc0\xad\xb9\x51\x83", + "\x3d\xcb\x7d\xcf\x57\xa6\xf6\x16\x4f\x34\xb6\x5f\xc2\xa9\xf0\xec\x90\xc5\x43\xa0\x19\xfc\x3f", + "\xe9\x2c\x22\x20\xd4\x27\x90\x89\x40\x08\x4a\x23\x4d\x41\x05\x67\xe1\xde\xf5\x0b\x8b\x96\xb1"); + cfb64_test("\x92\x38\xd3\xfd\x61\x83\x92\x0e", + "\x25\xb6\x34\x51\x6d\x6a\x35\xa2", + "\x98\x55\xab\x2a\xa2\x9e\xcf\xf4\x92\xdf\xb4\xc6\xc1\x34\x55\xf6\x13\x85\x4c\x50\xdc\x82\x1e", + "\x87\x96\x47\xa6\xcd\xff\xda\xd2\xad\x88\xaa\x25\xbd\xcd\x72\x61\x37\x14\x42\x14\xc7\x4b\x7f"); + cfb64_test("\xf4\xcb\x97\xad\xef\x7f\x80\xb0", + "\xfc\xa0\x7d\xb6\x75\xb8\x48\xea", + "\xc2\x1e\x16\x2b\xb7\xcf\xc6\xa0\x4b\x76\x75\x61\x49\x66\x0d\xce\xd2\x12\xf2\x98\x07\x2f\xac", + "\xe2\x20\xbf\x29\x5b\x34\x20\x2a\x2e\x99\xa5\x50\x97\x1b\x4b\x18\xb4\xd6\x87\x35\x7b\x5f\x43"); + cfb64_test("\x3b\x1c\x15\xec\xb9\x5e\xe0\xda", + "\x7d\x94\x23\x76\x96\x72\x62\xf4", + "\x5d\x83\xdb\x76\x52\x46\xa7\x84\x0a\x71\x2c\x09\x40\xbd\x3d\x75\x73\x28\x0b\x22\x07\x6f\x8a", + "\xf1\x01\x8f\xe2\x32\x35\xe6\x06\xcf\xbb\xe4\x15\x9e\x4e\xf0\xe8\x2e\xcd\xac\xbf\xa6\xc2\xec"); + cfb64_test("\xc2\xcd\x76\x79\x7f\x51\xce\x86", + "\x38\xcf\x55\x7d\x0c\xd5\x35\xfe", + "\xc7\xe5\xe8\x1d\x19\x09\x9f\xd5\xdb\x89\x26\xc1\xf1\xc1\x18\x50\xcf\x8b\xf2\xe1\x87\xeb\xe6", + "\xd4\x5d\xca\x30\xb9\x41\xfa\x36\x83\xfc\x40\x2d\xd2\xe8\x94\x38\x49\xc8\xa3\x35\xb7\x5d\x9c"); + cfb64_test("\x67\xfd\xc4\x31\x45\x40\xf7\xea", + "\xb9\x29\xe6\x78\xdd\x1a\x13\x84", + "\x12\x9b\xe5\xb3\xdd\x42\x6f\x45\x86\x97\x25\x87\x05\xee\x7e\x57\x8f\x22\x79\xb3\x22\xa2\x95", + "\x38\xef\x49\xbc\xdd\xbb\x6b\x73\xc0\xd7\xa6\x70\xe0\x1b\xde\x8d\xe6\xb4\xc6\x69\xca\x5e\x1e"); + + weak_test(1, "\x01\x01\x01\x01\x01\x01\x01\x01"); /* weak keys */ + weak_test(1, "\x01\x01\x01\x01\x01\x01\x01\x01"); + weak_test(1, "\xFE\xFE\xFE\xFE\xFE\xFE\xFE\xFE"); + weak_test(1, "\x1F\x1F\x1F\x1F\x0E\x0E\x0E\x0E"); + weak_test(1, "\xE0\xE0\xE0\xE0\xF1\xF1\xF1\xF1"); + weak_test(1, "\x01\xFE\x01\xFE\x01\xFE\x01\xFE"); /* semi-weak keys */ + weak_test(1, "\xFE\x01\xFE\x01\xFE\x01\xFE\x01"); + weak_test(1, "\x1F\xE0\x1F\xE0\x0E\xF1\x0E\xF1"); + weak_test(1, "\xE0\x1F\xE0\x1F\xF1\x0E\xF1\x0E"); + weak_test(1, "\x01\xE0\x01\xE0\x01\xF1\x01\xF1"); + weak_test(1, "\xE0\x01\xE0\x01\xF1\x01\xF1\x01"); + weak_test(1, "\x1F\xFE\x1F\xFE\x0E\xFE\x0E\xFE"); + weak_test(1, "\xFE\x1F\xFE\x1F\xFE\x0E\xFE\x0E"); + weak_test(1, "\x01\x1F\x01\x1F\x01\x0E\x01\x0E"); + weak_test(1, "\x1F\x01\x1F\x01\x0E\x01\x0E\x01"); + weak_test(1, "\xE0\xFE\xE0\xFE\xF1\xFE\xF1\xFE"); + weak_test(1, "\xFE\xE0\xFE\xE0\xFE\xF1\xFE\xF1"); + + weak_test(0, "\x01\x01\x01\x01\x01\x01\x01\x02"); + weak_test(0, "\xFF\xE0\xFE\xE0\xFE\xF1\xFE\xF1"); + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/dh-ltm.c b/crypto/heimdal/lib/hcrypto/dh-ltm.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/dh-ltm.c @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include + +#include + +#include "tommath.h" + +static void +BN2mpz(mp_int *s, const BIGNUM *bn) +{ + size_t len; + void *p; + + len = BN_num_bytes(bn); + p = malloc(len); + BN_bn2bin(bn, p); + mp_read_unsigned_bin(s, p, len); + free(p); +} + + +static BIGNUM * +mpz2BN(mp_int *s) +{ + size_t size; + BIGNUM *bn; + void *p; + + size = mp_unsigned_bin_size(s); + p = malloc(size); + if (p == NULL && size != 0) + return NULL; + mp_to_unsigned_bin(s, p); + + bn = BN_bin2bn(p, size, NULL); + free(p); + return bn; +} + +/* + * + */ + +#define DH_NUM_TRIES 10 + +static int +ltm_dh_generate_key(DH *dh) +{ + mp_int pub, priv_key, g, p; + int have_private_key = (dh->priv_key != NULL); + int codes, times = 0; + int res; + + if (dh->p == NULL || dh->g == NULL) + return 0; + + while (times++ < DH_NUM_TRIES) { + if (!have_private_key) { + size_t bits = BN_num_bits(dh->p); + + if (dh->priv_key) + BN_free(dh->priv_key); + + dh->priv_key = BN_new(); + if (dh->priv_key == NULL) + return 0; + if (!BN_rand(dh->priv_key, bits - 1, 0, 0)) { + BN_clear_free(dh->priv_key); + dh->priv_key = NULL; + return 0; + } + } + if (dh->pub_key) { + BN_free(dh->pub_key); + dh->pub_key = NULL; + } + + mp_init_multi(&pub, &priv_key, &g, &p, NULL); + + BN2mpz(&priv_key, dh->priv_key); + BN2mpz(&g, dh->g); + BN2mpz(&p, dh->p); + + res = mp_exptmod(&g, &priv_key, &p, &pub); + + mp_clear_multi(&priv_key, &g, &p, NULL); + if (res != 0) + continue; + + dh->pub_key = mpz2BN(&pub); + mp_clear(&pub); + if (dh->pub_key == NULL) + return 0; + + if (DH_check_pubkey(dh, dh->pub_key, &codes) && codes == 0) + break; + if (have_private_key) + return 0; + } + + if (times >= DH_NUM_TRIES) { + if (!have_private_key && dh->priv_key) { + BN_free(dh->priv_key); + dh->priv_key = NULL; + } + if (dh->pub_key) { + BN_free(dh->pub_key); + dh->pub_key = NULL; + } + return 0; + } + + return 1; +} + +static int +ltm_dh_compute_key(unsigned char *shared, const BIGNUM * pub, DH *dh) +{ + mp_int s, priv_key, p, peer_pub; + int ret; + + if (dh->pub_key == NULL || dh->g == NULL || dh->priv_key == NULL) + return -1; + + mp_init_multi(&s, &priv_key, &p, &peer_pub, NULL); + BN2mpz(&p, dh->p); + BN2mpz(&peer_pub, pub); + + /* check if peers pubkey is reasonable */ + if (mp_isneg(&peer_pub) + || mp_cmp(&peer_pub, &p) >= 0 + || mp_cmp_d(&peer_pub, 1) <= 0) + { + ret = -1; + goto out; + } + + BN2mpz(&priv_key, dh->priv_key); + + ret = mp_exptmod(&peer_pub, &priv_key, &p, &s); + + if (ret != 0) { + ret = -1; + goto out; + } + + ret = mp_unsigned_bin_size(&s); + mp_to_unsigned_bin(&s, shared); + + out: + mp_clear_multi(&s, &priv_key, &p, &peer_pub, NULL); + + return ret; +} + +static int +ltm_dh_generate_params(DH *dh, int a, int b, BN_GENCB *callback) +{ + /* groups should already be known, we don't care about this */ + return 0; +} + +static int +ltm_dh_init(DH *dh) +{ + return 1; +} + +static int +ltm_dh_finish(DH *dh) +{ + return 1; +} + + +/* + * + */ + +const DH_METHOD _hc_dh_ltm_method = { + "hcrypto ltm DH", + ltm_dh_generate_key, + ltm_dh_compute_key, + NULL, + ltm_dh_init, + ltm_dh_finish, + 0, + NULL, + ltm_dh_generate_params +}; + +/** + * DH implementation using libtommath. + * + * @return the DH_METHOD for the DH implementation using libtommath. + * + * @ingroup hcrypto_dh + */ + +const DH_METHOD * +DH_ltm_method(void) +{ + return &_hc_dh_ltm_method; +} diff --git a/crypto/heimdal/lib/hcrypto/dh-tfm.c b/crypto/heimdal/lib/hcrypto/dh-tfm.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/dh-tfm.c @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +#ifdef USE_HCRYPTO_TFM + +#include "tfm.h" + +static void +BN2mpz(fp_int *s, const BIGNUM *bn) +{ + size_t len; + void *p; + + len = BN_num_bytes(bn); + p = malloc(len); + BN_bn2bin(bn, p); + fp_read_unsigned_bin(s, p, len); + free(p); +} + + +static BIGNUM * +mpz2BN(fp_int *s) +{ + size_t size; + BIGNUM *bn; + void *p; + + size = fp_unsigned_bin_size(s); + p = malloc(size); + if (p == NULL && size != 0) + return NULL; + fp_to_unsigned_bin(s, p); + + bn = BN_bin2bn(p, size, NULL); + free(p); + return bn; +} + +/* + * + */ + +#define DH_NUM_TRIES 10 + +static int +tfm_dh_generate_key(DH *dh) +{ + fp_int pub, priv_key, g, p; + int have_private_key = (dh->priv_key != NULL); + int codes, times = 0; + int res; + + if (dh->p == NULL || dh->g == NULL) + return 0; + + while (times++ < DH_NUM_TRIES) { + if (!have_private_key) { + size_t bits = BN_num_bits(dh->p); + + if (dh->priv_key) + BN_free(dh->priv_key); + + dh->priv_key = BN_new(); + if (dh->priv_key == NULL) + return 0; + if (!BN_rand(dh->priv_key, bits - 1, 0, 0)) { + BN_clear_free(dh->priv_key); + dh->priv_key = NULL; + return 0; + } + } + if (dh->pub_key) + BN_free(dh->pub_key); + + fp_init_multi(&pub, &priv_key, &g, &p, NULL); + + BN2mpz(&priv_key, dh->priv_key); + BN2mpz(&g, dh->g); + BN2mpz(&p, dh->p); + + res = fp_exptmod(&g, &priv_key, &p, &pub); + + fp_zero(&priv_key); + fp_zero(&g); + fp_zero(&p); + if (res != 0) + continue; + + dh->pub_key = mpz2BN(&pub); + fp_zero(&pub); + if (dh->pub_key == NULL) + return 0; + + if (DH_check_pubkey(dh, dh->pub_key, &codes) && codes == 0) + break; + if (have_private_key) + return 0; + } + + if (times >= DH_NUM_TRIES) { + if (!have_private_key && dh->priv_key) { + BN_free(dh->priv_key); + dh->priv_key = NULL; + } + if (dh->pub_key) { + BN_free(dh->pub_key); + dh->pub_key = NULL; + } + return 0; + } + + return 1; +} + +static int +tfm_dh_compute_key(unsigned char *shared, const BIGNUM * pub, DH *dh) +{ + fp_int s, priv_key, p, peer_pub; + size_t size = 0; + int ret; + + if (dh->pub_key == NULL || dh->g == NULL || dh->priv_key == NULL) + return -1; + + fp_init(&p); + BN2mpz(&p, dh->p); + + fp_init(&peer_pub); + BN2mpz(&peer_pub, pub); + + /* check if peers pubkey is reasonable */ + if (fp_isneg(&peer_pub) + || fp_cmp(&peer_pub, &p) >= 0 + || fp_cmp_d(&peer_pub, 1) <= 0) + { + fp_zero(&p); + fp_zero(&peer_pub); + return -1; + } + + fp_init(&priv_key); + BN2mpz(&priv_key, dh->priv_key); + + fp_init(&s); + + ret = fp_exptmod(&peer_pub, &priv_key, &p, &s); + + fp_zero(&p); + fp_zero(&peer_pub); + fp_zero(&priv_key); + + if (ret != 0) + return -1; + + size = fp_unsigned_bin_size(&s); + fp_to_unsigned_bin(&s, shared); + fp_zero(&s); + + return size; +} + +static int +tfm_dh_generate_params(DH *dh, int a, int b, BN_GENCB *callback) +{ + /* groups should already be known, we don't care about this */ + return 0; +} + +static int +tfm_dh_init(DH *dh) +{ + return 1; +} + +static int +tfm_dh_finish(DH *dh) +{ + return 1; +} + + +/* + * + */ + +const DH_METHOD _hc_dh_tfm_method = { + "hcrypto tfm DH", + tfm_dh_generate_key, + tfm_dh_compute_key, + NULL, + tfm_dh_init, + tfm_dh_finish, + 0, + NULL, + tfm_dh_generate_params +}; + +/** + * DH implementation using tfm. + * + * @return the DH_METHOD for the DH implementation using tfm. + * + * @ingroup hcrypto_dh + */ + +const DH_METHOD * +DH_tfm_method(void) +{ + return &_hc_dh_tfm_method; +} + +#endif diff --git a/crypto/heimdal/lib/hcrypto/dh.h b/crypto/heimdal/lib/hcrypto/dh.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/dh.h @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * $Id$ + */ + +#ifndef _HEIM_DH_H +#define _HEIM_DH_H 1 + +/* symbol renaming */ +#define DH hc_DH +#define DH_METHOD hc_DH_METHOD +#define DH_null_method hc_DH_null_method +#define DH_tfm_method hc_DH_tfm_method +#define DH_ltm_method hc_DH_ltm_method +#define DH_new hc_DH_new +#define DH_new_method hc_DH_new_method +#define DH_free hc_DH_free +#define DH_up_ref hc_DH_up_ref +#define DH_size hc_DH_size +#define DH_set_default_method hc_DH_set_default_method +#define DH_get_default_method hc_DH_get_default_method +#define DH_set_method hc_DH_set_method +#define DH_get_method hc_DH_get_method +#define DH_set_ex_data hc_DH_set_ex_data +#define DH_get_ex_data hc_DH_get_ex_data +#define DH_generate_parameters_ex hc_DH_generate_parameters_ex +#define DH_check_pubkey hc_DH_check_pubkey +#define DH_generate_key hc_DH_generate_key +#define DH_compute_key hc_DH_compute_key +#define i2d_DHparams hc_i2d_DHparams + +/* + * + */ + +typedef struct DH DH; +typedef struct DH_METHOD DH_METHOD; + +#include +#include + +struct DH_METHOD { + const char *name; + int (*generate_key)(DH *); + int (*compute_key)(unsigned char *,const BIGNUM *,DH *); + int (*bn_mod_exp)(const DH *, BIGNUM *, const BIGNUM *, + const BIGNUM *, const BIGNUM *, BN_CTX *, + BN_MONT_CTX *); + int (*init)(DH *); + int (*finish)(DH *); + int flags; + void *app_data; + int (*generate_params)(DH *, int, int, BN_GENCB *); +}; + +struct DH { + int pad; + int version; + BIGNUM *p; + BIGNUM *g; + long length; + BIGNUM *pub_key; + BIGNUM *priv_key; + int flags; + void *method_mont_p; + BIGNUM *q; + BIGNUM *j; + void *seed; + int seedlen; + BIGNUM *counter; + int references; + struct CRYPTO_EX_DATA { + void *sk; + int dummy; + } ex_data; + const DH_METHOD *meth; + ENGINE *engine; +}; + +/* DH_check_pubkey return codes in `codes' argument. */ +#define DH_CHECK_PUBKEY_TOO_SMALL 1 +#define DH_CHECK_PUBKEY_TOO_LARGE 2 + +/* + * + */ + +const DH_METHOD *DH_null_method(void); +const DH_METHOD *DH_tfm_method(void); +const DH_METHOD *DH_ltm_method(void); + +DH * DH_new(void); +DH * DH_new_method(ENGINE *); +void DH_free(DH *); +int DH_up_ref(DH *); + +int DH_size(const DH *); + + +void DH_set_default_method(const DH_METHOD *); +const DH_METHOD * + DH_get_default_method(void); +int DH_set_method(DH *, const DH_METHOD *); + +int DH_set_ex_data(DH *, int, void *); +void * DH_get_ex_data(DH *, int); + +int DH_generate_parameters_ex(DH *, int, int, BN_GENCB *); +int DH_check_pubkey(const DH *, const BIGNUM *, int *); +int DH_generate_key(DH *); +int DH_compute_key(unsigned char *,const BIGNUM *,DH *); + +int i2d_DHparams(DH *, unsigned char **); + +#endif /* _HEIM_DH_H */ + diff --git a/crypto/heimdal/lib/hcrypto/dh.c b/crypto/heimdal/lib/hcrypto/dh.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/dh.c @@ -0,0 +1,551 @@ +/* + * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include + +#include +#include + +#include + +/** + * @page page_dh DH - Diffie-Hellman key exchange + * + * Diffie-Hellman key exchange is a protocol that allows two parties + * to establish a shared secret key. + * + * Include and example how to use DH_new() and friends here. + * + * See the library functions here: @ref hcrypto_dh + */ + +/** + * Create a new DH object using DH_new_method(NULL), see DH_new_method(). + * + * @return a newly allocated DH object. + * + * @ingroup hcrypto_dh + */ + +DH * +DH_new(void) +{ + return DH_new_method(NULL); +} + +/** + * Create a new DH object from the given engine, if the NULL is used, + * the default engine is used. Free the DH object with DH_free(). + * + * @param engine The engine to use to allocate the DH object. + * + * @return a newly allocated DH object. + * + * @ingroup hcrypto_dh + */ + +DH * +DH_new_method(ENGINE *engine) +{ + DH *dh; + + dh = calloc(1, sizeof(*dh)); + if (dh == NULL) + return NULL; + + dh->references = 1; + + if (engine) { + ENGINE_up_ref(engine); + dh->engine = engine; + } else { + dh->engine = ENGINE_get_default_DH(); + } + + if (dh->engine) { + dh->meth = ENGINE_get_DH(dh->engine); + if (dh->meth == NULL) { + ENGINE_finish(engine); + free(dh); + return 0; + } + } + + if (dh->meth == NULL) + dh->meth = DH_get_default_method(); + + (*dh->meth->init)(dh); + + return dh; +} + +/** + * Free a DH object and release related resources, like ENGINE, that + * the object was using. + * + * @param dh object to be freed. + * + * @ingroup hcrypto_dh + */ + +void +DH_free(DH *dh) +{ + if (dh->references <= 0) + abort(); + + if (--dh->references > 0) + return; + + (*dh->meth->finish)(dh); + + if (dh->engine) + ENGINE_finish(dh->engine); + +#define free_if(f) if (f) { BN_free(f); } + free_if(dh->p); + free_if(dh->g); + free_if(dh->pub_key); + free_if(dh->priv_key); + free_if(dh->q); + free_if(dh->j); + free_if(dh->counter); +#undef free_if + + memset(dh, 0, sizeof(*dh)); + free(dh); +} + +/** + * Add a reference to the DH object. The object should be free with + * DH_free() to drop the reference. + * + * @param dh the object to increase the reference count too. + * + * @return the updated reference count, can't safely be used except + * for debug printing. + * + * @ingroup hcrypto_dh + */ + +int +DH_up_ref(DH *dh) +{ + return ++dh->references; +} + +/** + * The maximum output size of the DH_compute_key() function. + * + * @param dh The DH object to get the size from. + * + * @return the maximum size in bytes of the out data. + * + * @ingroup hcrypto_dh + */ + +int +DH_size(const DH *dh) +{ + return BN_num_bytes(dh->p); +} + +/** + * Set the data index idx in the DH object to data. + * + * @param dh DH object. + * @param idx index to set the data for. + * @param data data to store for the index idx. + * + * @return 1 on success. + * + * @ingroup hcrypto_dh + */ + +int +DH_set_ex_data(DH *dh, int idx, void *data) +{ + dh->ex_data.sk = data; + return 1; +} + +/** + * Get the data for index idx in the DH object. + * + * @param dh DH object. + * @param idx index to get the data for. + * + * @return the object store in index idx + * + * @ingroup hcrypto_dh + */ + +void * +DH_get_ex_data(DH *dh, int idx) +{ + return dh->ex_data.sk; +} + +/** + * Generate DH parameters for the DH object give parameters. + * + * @param dh The DH object to generate parameters for. + * @param prime_len length of the prime + * @param generator generator, g + * @param cb Callback parameters to show progress, can be NULL. + * + * @return the maximum size in bytes of the out data. + * + * @ingroup hcrypto_dh + */ + +int +DH_generate_parameters_ex(DH *dh, int prime_len, int generator, BN_GENCB *cb) +{ + if (dh->meth->generate_params) + return dh->meth->generate_params(dh, prime_len, generator, cb); + return 0; +} + +/** + * Check that the public key is sane. + * + * @param dh the local peer DH parameters. + * @param pub_key the remote peer public key parameters. + * @param codes return that the failures of the pub_key are. + * + * @return 1 on success, 0 on failure and *codes is set the the + * combined fail check for the public key + * + * @ingroup hcrypto_dh + */ + +int +DH_check_pubkey(const DH *dh, const BIGNUM *pub_key, int *codes) +{ + BIGNUM *bn = NULL, *sum = NULL; + int ret = 0; + + *codes = 0; + + /** + * Checks that the function performs are: + * - pub_key is not negative + */ + + if (BN_is_negative(pub_key)) + goto out; + + /** + * - pub_key > 1 and pub_key < p - 1, + * to avoid small subgroups attack. + */ + + bn = BN_new(); + if (bn == NULL) + goto out; + + if (!BN_set_word(bn, 1)) + goto out; + + if (BN_cmp(bn, pub_key) >= 0) + *codes |= DH_CHECK_PUBKEY_TOO_SMALL; + + sum = BN_new(); + if (sum == NULL) + goto out; + + BN_uadd(sum, pub_key, bn); + + if (BN_cmp(sum, dh->p) >= 0) + *codes |= DH_CHECK_PUBKEY_TOO_LARGE; + + /** + * - if g == 2, pub_key have more then one bit set, + * if bits set is 1, log_2(pub_key) is trival + */ + + if (!BN_set_word(bn, 2)) + goto out; + + if (BN_cmp(bn, dh->g) == 0) { + unsigned i, n = BN_num_bits(pub_key); + unsigned bits = 0; + + for (i = 0; i < n; i++) + if (BN_is_bit_set(pub_key, i)) + bits++; + + if (bits < 2) { + *codes |= DH_CHECK_PUBKEY_TOO_SMALL; + goto out; + } + } + + ret = 1; +out: + if (bn) + BN_free(bn); + if (sum) + BN_free(sum); + + return ret; +} + +/** + * Generate a new DH private-public key pair. The dh parameter must be + * allocted first with DH_new(). dh->p and dp->g must be set. + * + * @param dh dh parameter. + * + * @return 1 on success. + * + * @ingroup hcrypto_dh + */ + +int +DH_generate_key(DH *dh) +{ + return dh->meth->generate_key(dh); +} + +/** + * Complute the shared secret key. + * + * @param shared_key the resulting shared key, need to be at least + * DH_size() large. + * @param peer_pub_key the peer's public key. + * @param dh the dh key pair. + * + * @return 1 on success. + * + * @ingroup hcrypto_dh + */ + +int +DH_compute_key(unsigned char *shared_key, + const BIGNUM *peer_pub_key, DH *dh) +{ + int codes; + + /** + * Checks that the pubkey passed in is valid using + * DH_check_pubkey(). + */ + + if (!DH_check_pubkey(dh, peer_pub_key, &codes) || codes != 0) + return -1; + + return dh->meth->compute_key(shared_key, peer_pub_key, dh); +} + +/** + * Set a new method for the DH keypair. + * + * @param dh dh parameter. + * @param method the new method for the DH parameter. + * + * @return 1 on success. + * + * @ingroup hcrypto_dh + */ + +int +DH_set_method(DH *dh, const DH_METHOD *method) +{ + (*dh->meth->finish)(dh); + if (dh->engine) { + ENGINE_finish(dh->engine); + dh->engine = NULL; + } + dh->meth = method; + (*dh->meth->init)(dh); + return 1; +} + +/* + * + */ + +static int +dh_null_generate_key(DH *dh) +{ + return 0; +} + +static int +dh_null_compute_key(unsigned char *shared,const BIGNUM *pub, DH *dh) +{ + return 0; +} + +static int +dh_null_init(DH *dh) +{ + return 1; +} + +static int +dh_null_finish(DH *dh) +{ + return 1; +} + +static int +dh_null_generate_params(DH *dh, int prime_num, int len, BN_GENCB *cb) +{ + return 0; +} + +static const DH_METHOD dh_null_method = { + "hcrypto null DH", + dh_null_generate_key, + dh_null_compute_key, + NULL, + dh_null_init, + dh_null_finish, + 0, + NULL, + dh_null_generate_params +}; + +extern const DH_METHOD _hc_dh_ltm_method; +static const DH_METHOD *dh_default_method = &_hc_dh_ltm_method; + +/** + * Return the dummy DH implementation. + * + * @return pointer to a DH_METHOD. + * + * @ingroup hcrypto_dh + */ + +const DH_METHOD * +DH_null_method(void) +{ + return &dh_null_method; +} + +/** + * Set the default DH implementation. + * + * @param meth pointer to a DH_METHOD. + * + * @ingroup hcrypto_dh + */ + +void +DH_set_default_method(const DH_METHOD *meth) +{ + dh_default_method = meth; +} + +/** + * Return the default DH implementation. + * + * @return pointer to a DH_METHOD. + * + * @ingroup hcrypto_dh + */ + +const DH_METHOD * +DH_get_default_method(void) +{ + return dh_default_method; +} + +/* + * + */ + +static int +bn2heim_int(BIGNUM *bn, heim_integer *integer) +{ + integer->length = BN_num_bytes(bn); + integer->data = malloc(integer->length); + if (integer->data == NULL) { + integer->length = 0; + return ENOMEM; + } + BN_bn2bin(bn, integer->data); + integer->negative = BN_is_negative(bn); + return 0; +} + +/** + * + */ + +int +i2d_DHparams(DH *dh, unsigned char **pp) +{ + DHParameter data; + size_t size; + int ret; + + memset(&data, 0, sizeof(data)); + + if (bn2heim_int(dh->p, &data.prime) || + bn2heim_int(dh->g, &data.base)) + { + free_DHParameter(&data); + return -1; + } + + if (pp == NULL) { + size = length_DHParameter(&data); + free_DHParameter(&data); + } else { + void *p; + size_t len; + + ASN1_MALLOC_ENCODE(DHParameter, p, len, &data, &size, ret); + free_DHParameter(&data); + if (ret) + return -1; + if (len != size) { + abort(); + return -1; + } + + memcpy(*pp, p, size); + free(p); + + *pp += size; + } + + return size; +} diff --git a/crypto/heimdal/lib/hcrypto/doxygen.c b/crypto/heimdal/lib/hcrypto/doxygen.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/doxygen.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/** + * + */ + +/*! @mainpage Heimdal crypto library + * + * @section intro Introduction + * + * Heimdal libhcrypto library is a implementation many crypto + * algorithms, among others: AES, SHA, DES, RSA, Camellia and many + * help function. + * + * hcrypto provies a OpenSSL compatible interface libcrypto interface + * and is licensed under a 3 clause BSD license (GPL compatible). + * + * The project web page: http://www.h5l.org/ + * + * Sections of this manual: + * + * - @subpage page_evp, @ref hcrypto_evp + * - @subpage page_rand, @ref hcrypto_rand + * - @subpage page_dh, @ref hcrypto_dh + * - @subpage page_rsa, @ref hcrypto_rsa + * - @ref hcrypto_misc + * + * Older interfaces that you should not use: + * + * - @subpage page_des, @ref hcrypto_des + * + * @subsection control_functions Control functions + * + * Functions controlling general behavior, like adding algorithms, are + * documented in this module: @ref hcrypto_core . + * + * @subsection return_values Return values + * + * Return values are diffrent in this module to be compatible with + * OpenSSL interface. The diffrence is that on success 1 is returned + * instead of the customary 0. + + * @subsection History + * + * Eric Young implemented DES in the library libdes, that grew into + * libcrypto in the ssleay package. ssleay went into recession and + * then got picked up by the OpenSSL (htp://www.openssl.org/) + * project. + * + * libhcrypto is an independent implementation with no code decended + * from ssleay/openssl. Both includes some common imported code, for + * example the AES implementation. + */ + +/** @defgroup hcrypto_dh Diffie-Hellman functions + * See the @ref page_dh for description and examples. + */ +/** @defgroup hcrypto_rsa RSA functions + * See the @ref page_rsa for description and examples. + */ +/** @defgroup hcrypto_evp EVP generic crypto functions + * See the @ref page_evp for description and examples. + */ +/** @defgroup hcrypto_rand RAND crypto functions + * See the @ref page_rand for description and examples. + */ +/** @defgroup hcrypto_des DES crypto functions + * See the @ref page_des for description and examples. + */ +/** @defgroup hcrypto_core hcrypto function controlling behavior */ +/** @defgroup hcrypto_misc hcrypto miscellaneous functions */ diff --git a/crypto/heimdal/lib/hcrypto/dsa.h b/crypto/heimdal/lib/hcrypto/dsa.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/dsa.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * $Id$ + */ + +#ifndef _HEIM_DSA_H +#define _HEIM_DSA_H 1 + +#include + +/* symbol renaming */ +#define DSA hc_DSA +#define DSA_METHOD hc_DSA_METHOD +#define DSA_null_method hc_DSA_null_method +#define DSA_new hc_DSA_new +#define DSA_free hc_DSA_free +#define DSA_up_ref hc_DSA_up_ref +#define DSA_set_default_method hc_DSA_set_default_method +#define DSA_get_default_method hc_DSA_get_default_method +#define DSA_set_method hc_DSA_set_method +#define DSA_get_method hc_DSA_get_method +#define DSA_set_app_data hc_DSA_set_app_data +#define DSA_get_app_data hc_DSA_get_app_data +#define DSA_size hc_DSA_size +#define DSA_verify hc_DSA_verify + +/* + * + */ + + +typedef struct DSA DSA; +typedef struct DSA_METHOD DSA_METHOD; +typedef struct DSA_SIG DSA_SIG; + +struct DSA_SIG { + BIGNUM *r; + BIGNUM *s; +}; + +struct DSA_METHOD { + const char *name; + DSA_SIG * (*dsa_do_sign)(const unsigned char *, int, DSA *); + int (*dsa_sign_setup)(DSA *, BN_CTX *, BIGNUM **, BIGNUM **); + int (*dsa_do_verify)(const unsigned char *, int, DSA_SIG *, DSA *); + int (*dsa_mod_exp)(DSA *, BIGNUM *, BIGNUM *, BIGNUM *, + BIGNUM *, BIGNUM *, BIGNUM *, BN_CTX *, + BN_MONT_CTX *); + int (*bn_mod_exp)(DSA *, BIGNUM *, BIGNUM *, const BIGNUM *, + const BIGNUM *, BN_CTX *, + BN_MONT_CTX *); + int (*init)(DSA *); + int (*finish)(DSA *); + int flags; + void *app_data; +}; + +struct DSA { + int pad; + long version; + int write_params; + BIGNUM *p; + BIGNUM *q; + BIGNUM *g; + + BIGNUM *pub_key; + BIGNUM *priv_key; + + BIGNUM *kinv; + BIGNUM *r; + int flags; + void *method_mont_p; + int references; + struct dsa_CRYPTO_EX_DATA { + void *sk; + int dummy; + } ex_data; + const DSA_METHOD *meth; + void *engine; +}; + +/* + * + */ + +const DSA_METHOD *DSA_null_method(void); + +/* + * + */ + +DSA * DSA_new(void); +void DSA_free(DSA *); +int DSA_up_ref(DSA *); + +void DSA_set_default_method(const DSA_METHOD *); +const DSA_METHOD * DSA_get_default_method(void); + +const DSA_METHOD * DSA_get_method(const DSA *); +int DSA_set_method(DSA *, const DSA_METHOD *); + +void DSA_set_app_data(DSA *, void *arg); +void * DSA_get_app_data(DSA *); + +int DSA_size(const DSA *); + +int DSA_verify(int, const unsigned char *, int, + const unsigned char *, int, DSA *); + +#endif /* _HEIM_DSA_H */ diff --git a/crypto/heimdal/lib/hcrypto/dsa.c b/crypto/heimdal/lib/hcrypto/dsa.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/dsa.c @@ -0,0 +1,127 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +/* + * + */ + +DSA * +DSA_new(void) +{ + DSA *dsa = calloc(1, sizeof(*dsa)); + dsa->meth = rk_UNCONST(DSA_get_default_method()); + dsa->references = 1; + return dsa; +} + +void +DSA_free(DSA *dsa) +{ + if (dsa->references <= 0) + abort(); + + if (--dsa->references > 0) + return; + + (*dsa->meth->finish)(dsa); + +#define free_if(f) if (f) { BN_free(f); } + free_if(dsa->p); + free_if(dsa->q); + free_if(dsa->g); + free_if(dsa->pub_key); + free_if(dsa->priv_key); + free_if(dsa->kinv); + free_if(dsa->r); +#undef free_if + + memset(dsa, 0, sizeof(*dsa)); + free(dsa); + +} + +int +DSA_up_ref(DSA *dsa) +{ + return ++dsa->references; +} + +/* + * + */ + +static const DSA_METHOD dsa_null_method = { + "hcrypto null DSA", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL +}; + +const DSA_METHOD * +DSA_null_method(void) +{ + return &dsa_null_method; +} + + +const DSA_METHOD *dsa_default_mech = &dsa_null_method; + +void +DSA_set_default_method(const DSA_METHOD *mech) +{ + dsa_default_mech = mech; +} + +const DSA_METHOD * +DSA_get_default_method(void) +{ + return dsa_default_mech; +} + +int +DSA_verify(int type, const unsigned char * digest, int digest_len, + const unsigned char *sig, int sig_len, DSA *dsa) +{ + return -1; +} diff --git a/crypto/heimdal/lib/hcrypto/ec.h b/crypto/heimdal/lib/hcrypto/ec.h new file mode 100644 index 0000000000000000000000000000000000000000..726deec6169f0aacc4048543807d485eeb4e43d7 GIT binary patch literal 3135 zc$~FXU2p0}5Pj!YjC3C^iQFVNl`6Hjs$|RtRu^pQkL2>?8he3N%x>h5MD&OExif16 z#&FfA<{_+iX3m^BdsuUSJAhko^xM9Wn{5Td^adUu9)A7l@!`ua@U2#xTy7Ew#jBF# zYXZ}MHs!0%6Gdf1U+{l9bgnmh3xZ0guUnn(aQPuJp>FP|%+7N# z-AX7#DT;TI(LRNIk;$?uQaDIQ0lr!h1pq2l@xne>ta`0@FA-$=)!#J zx+0XF&g5FA31L`}6awBvv6EFLGI%TWyUcJ=ZIcTB3B<{B{UOx`QmrycMJ1t7-A+`$ zwbZ`c_1Kj(Zc8iG879|dg%ec?(k0+zrQa#kYD*yar*tJ#VPS?WAxAudIdwJ@p3}mn zX`aZPC=N0`UUI>n9bFDwaN4X!e*X_0Xa;SOGM&~tp{nF?boY2F8si1*l1daZ$;*@c z=GX|hJH}zYpYOmG(v(t)N_NIuv_6?l=~L94g+xOk^9D^9Wy@=q>|rIyM>vTFp)!mK zvJ8^hX+&yN!s-lJq8nk2fku&1ud5GqLW|X!49Yi=lEtu8lJ^QSmuhTQmYqq$DGwm< zp28Q~XMpR4?>+M|8^dUcLELhKkcUyoz;?&rcy8$PQ51T90Dt{u2Uzm?Glk3-$6W&Z zzVKNPfae3BFJ>H(5Zbrhkh8!-IA<1(xjV4{QNZ;=nDIFeF)j2g>PSGBmEb+WocYca zAMFvJ@o;GfJ@L?`c2C&PhK22i+=*tk4~xiOc!5Eq$;LczW;UO*@f{!uYz*v~xgi8o zdp7G$idbiZju?`(M>B(FI^m#W?lUK(iB2mAl|z0ryiXR);k01i84hFnORI$q*q;$5 zVUW8u--H`cyvNz2ybuzIl>KS&11(!``e8ODEsO}Na3lG>09vTlQfj6CB?4_A8GUL;6 zA-87PF|cJ075Ed_<7ZCf+hnvtz+2mRPlOai&a_pZz6+v*Jj54-c`NvB7VoWOs}RN zy2kx_WiLYZRcT)1YyS6bTI}B{eZNw7+dr=C3$?)(6dP3gH$k4qR~)`z4xVm4zFvto z#y%{5n9*4Gw)6OPFsM~2HwxcgxmKIO6`u}|4Q_8R|MWDt@aV8*Y7(WY2A8hvpy8Fu zCvG%1D>rt+@5c@XWYBZz5&agGwctoR-6jQYT2RWrMO>Xhv=lGgIP8efA=`|jMA4q# z*+B1FW{0G8E6g!?F3S(T14C>BN@jhuqwkN97M!bo$Ub?$cPyO&j*cJV&zkaRACuPX i9CZJI-LKRU@#_}vP(BBzvQPN4Nv`4kwsTqIrT#D4=h!9y literal 0 Hc$@g5i5IwJd#Q=L)+Ypl7?Wx_OfGp855m|CYDp{YribUH)B+`)R1nv*-xihrg zINn1~&B3AO-Y0d9Jy-QFp%Ypkrc#x{0y2tYVnJ#TH(;_+40%8YKPEo>U_gL>#xueuji zQ=C${s&(%={j_)58YoQ-`(A-I(A#}iDIa;#rtA)|wq4r?@T%PwZ0G;my(5&?)_Se0 zk}v`&I|Vz{wc0sV!>+S0y2gXsmJWXu;xvtY)n)^gHMORuo=~W-RqnSFwJ$eU?0S-W zqE*=%i}$@lMXp4;1YADZ7fPLMB@p~G*6B(GSfP7p5RYKqCVPeNY2nbSDRry5vrS)r z=7KXXd^vMLwe=qP{XcZzDD;F>+iKq`@V2LpRxsRS_#ljKS%V!abOVMsEZ zBp%IALZLCwStLo(+bKflkY9q|lLd=79oTnpe)wAm;Bm$)M^bg#^);*#k19H@DT&rsLL398T=dek;=9^ zeBW2k>HynnbsZyMQ#E`10RO(Ny2H-dTUFg`{}>Fkaf9pf;fvKZj05QPUuxxo!G{m@ x(ZKH>i&pn+NvW%6Dmiuy$M^AcG(6_7fUcflJQ{r)AUXWr=r!Dq-)TfY{sFK5Me_gv literal 0 Hc$@f&q5Isk~VgMgv8-$&tr!++Yid>I^=8`0yFN4rbHnO$k!n8{OZRF#mJY z-`l1%lyREdUD*IPz0+=R3hWvqtF5t(-RuGo&Q|wZ+q8ImQnfN?7nBw@4fsMmbgEa~ zqpHbHu3Xi+cb&c)oVEr^Q^U|J&<1)tbd~a!J8jBt2W#84eE?6|ZNYZ_-wuvYT3hS2 zu1dlPpzIVpsIJw{sTv+S`>1O?xNYh1M=D79jSf1_<>zd z?T)l6TVwFhJM74nNSA=iJNrnkQC0%M$5^K;6<~z!p+P)?IaKx?zNUpmtESYg>Rx2} z^p*?OJksTb3wB!%$nXE51N%ltq}os-hLcR870r(Q=vnn)UrrCvwgOh-@Zr!kht~ zmw9&0V-~}7g-$f3LULJ124NaQl%+D~(?VvsfbZW!fhq6blgocN=?d7lWzK|vEC;?= zCLECvIuBFHnFtUrN{X1LR{EHxSHTD?*dGN3p_9+GI0A5=As0)u(Uaaxyv5Yg4N=%o$(YvM3he?R;{A7H!lkBYd3vZQq+7 z@w;5_U|ZcDzyA=_>y0^t(A%4UXLTI#tcaAUngK8G-?mk^dvNwrRTtaeClhVltKz3< z2 +#include +#include +#include + +#define OPENSSL_DYNAMIC_VERSION (unsigned long)0x00020000 + +typedef int (*openssl_bind_engine)(ENGINE *, const char *, const void *); +typedef unsigned long (*openssl_v_check)(unsigned long); + +ENGINE * + ENGINE_new(void); +int ENGINE_free(ENGINE *); +void ENGINE_add_conf_module(void); +void ENGINE_load_builtin_engines(void); +ENGINE *ENGINE_by_id(const char *); +ENGINE *ENGINE_by_dso(const char *, const char *); +int ENGINE_finish(ENGINE *); +int ENGINE_up_ref(ENGINE *); +int ENGINE_set_id(ENGINE *, const char *); +int ENGINE_set_name(ENGINE *, const char *); +int ENGINE_set_RSA(ENGINE *, const RSA_METHOD *); +int ENGINE_set_DH(ENGINE *, const DH_METHOD *); +int ENGINE_set_destroy_function(ENGINE *, void (*)(ENGINE *)); + +const char * ENGINE_get_id(const ENGINE *); +const char * ENGINE_get_name(const ENGINE *); +const RSA_METHOD * ENGINE_get_RSA(const ENGINE *); +const DH_METHOD * ENGINE_get_DH(const ENGINE *); +const RAND_METHOD * ENGINE_get_RAND(const ENGINE *); + +int ENGINE_set_default_RSA(ENGINE *); +ENGINE * ENGINE_get_default_RSA(void); +int ENGINE_set_default_DH(ENGINE *); +ENGINE * ENGINE_get_default_DH(void); + + +#endif /* _HEIM_ENGINE_H */ diff --git a/crypto/heimdal/lib/hcrypto/engine.c b/crypto/heimdal/lib/hcrypto/engine.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/engine.c @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +#ifdef HAVE_DLFCN_H +#include +#ifndef RTLD_NOW +#define RTLD_NOW 0 +#endif +#endif + +struct hc_engine { + int references; + char *name; + char *id; + void (*destroy)(ENGINE *); + const RSA_METHOD *rsa; + const DH_METHOD *dh; + const RAND_METHOD *rand; +}; + +ENGINE * +ENGINE_new(void) +{ + ENGINE *engine; + + engine = calloc(1, sizeof(*engine)); + engine->references = 1; + + return engine; +} + +int +ENGINE_free(ENGINE *engine) +{ + return ENGINE_finish(engine); +} + +int +ENGINE_finish(ENGINE *engine) +{ + if (engine->references-- <= 0) + abort(); + if (engine->references > 0) + return 1; + + if (engine->name) + free(engine->name); + if (engine->id) + free(engine->id); + if(engine->destroy) + (*engine->destroy)(engine); + + memset(engine, 0, sizeof(*engine)); + engine->references = -1; + + + free(engine); + return 1; +} + +int +ENGINE_up_ref(ENGINE *engine) +{ + if (engine->references < 0) + abort(); + engine->references++; + return 1; +} + +int +ENGINE_set_id(ENGINE *engine, const char *id) +{ + engine->id = strdup(id); + return (engine->id == NULL) ? 0 : 1; +} + +int +ENGINE_set_name(ENGINE *engine, const char *name) +{ + engine->name = strdup(name); + return (engine->name == NULL) ? 0 : 1; +} + +int +ENGINE_set_RSA(ENGINE *engine, const RSA_METHOD *method) +{ + engine->rsa = method; + return 1; +} + +int +ENGINE_set_DH(ENGINE *engine, const DH_METHOD *method) +{ + engine->dh = method; + return 1; +} + +int +ENGINE_set_destroy_function(ENGINE *e, void (*destroy)(ENGINE *)) +{ + e->destroy = destroy; + return 1; +} + +const char * +ENGINE_get_id(const ENGINE *engine) +{ + return engine->id; +} + +const char * +ENGINE_get_name(const ENGINE *engine) +{ + return engine->name; +} + +const RSA_METHOD * +ENGINE_get_RSA(const ENGINE *engine) +{ + return engine->rsa; +} + +const DH_METHOD * +ENGINE_get_DH(const ENGINE *engine) +{ + return engine->dh; +} + +const RAND_METHOD * +ENGINE_get_RAND(const ENGINE *engine) +{ + return engine->rand; +} + +/* + * + */ + +#define SG_default_engine(type) \ +static ENGINE *type##_engine; \ +int \ +ENGINE_set_default_##type(ENGINE *engine) \ +{ \ + if (type##_engine) \ + ENGINE_finish(type##_engine); \ + type##_engine = engine; \ + if (type##_engine) \ + ENGINE_up_ref(type##_engine); \ + return 1; \ +} \ +ENGINE * \ +ENGINE_get_default_##type(void) \ +{ \ + if (type##_engine) \ + ENGINE_up_ref(type##_engine); \ + return type##_engine; \ +} + +SG_default_engine(RSA) +SG_default_engine(DH) + +#undef SG_default_engine + +/* + * + */ + +static ENGINE **engines; +static unsigned int num_engines; + +static int +add_engine(ENGINE *engine) +{ + ENGINE **d, *dup; + + dup = ENGINE_by_id(engine->id); + if (dup) + return 0; + + d = realloc(engines, (num_engines + 1) * sizeof(*engines)); + if (d == NULL) + return 1; + engines = d; + engines[num_engines++] = engine; + + return 1; +} + +void +ENGINE_load_builtin_engines(void) +{ + ENGINE *engine; + int ret; + + engine = ENGINE_new(); + if (engine == NULL) + return; + + ENGINE_set_id(engine, "builtin"); + ENGINE_set_name(engine, + "Heimdal crypto builtin (ltm) engine version " PACKAGE_VERSION); + ENGINE_set_RSA(engine, RSA_ltm_method()); + ENGINE_set_DH(engine, DH_ltm_method()); + + ret = add_engine(engine); + if (ret != 1) + ENGINE_finish(engine); + +#ifdef USE_HCRYPTO_TFM + /* + * TFM + */ + + engine = ENGINE_new(); + if (engine == NULL) + return; + + ENGINE_set_id(engine, "tfm"); + ENGINE_set_name(engine, + "Heimdal crypto tfm engine version " PACKAGE_VERSION); + ENGINE_set_RSA(engine, RSA_tfm_method()); + ENGINE_set_DH(engine, DH_tfm_method()); + + ret = add_engine(engine); + if (ret != 1) + ENGINE_finish(engine); +#endif /* USE_HCRYPTO_TFM */ + +#ifdef USE_HCRYPTO_LTM + /* + * ltm + */ + + engine = ENGINE_new(); + if (engine == NULL) + return; + + ENGINE_set_id(engine, "ltm"); + ENGINE_set_name(engine, + "Heimdal crypto ltm engine version " PACKAGE_VERSION); + ENGINE_set_RSA(engine, RSA_ltm_method()); + ENGINE_set_DH(engine, DH_ltm_method()); + + ret = add_engine(engine); + if (ret != 1) + ENGINE_finish(engine); +#endif + +#ifdef HAVE_GMP + /* + * gmp + */ + + engine = ENGINE_new(); + if (engine == NULL) + return; + + ENGINE_set_id(engine, "gmp"); + ENGINE_set_name(engine, + "Heimdal crypto gmp engine version " PACKAGE_VERSION); + ENGINE_set_RSA(engine, RSA_gmp_method()); + + ret = add_engine(engine); + if (ret != 1) + ENGINE_finish(engine); +#endif +} + +ENGINE * +ENGINE_by_dso(const char *path, const char *id) +{ +#ifdef HAVE_DLOPEN + ENGINE *engine; + void *handle; + int ret; + + engine = calloc(1, sizeof(*engine)); + if (engine == NULL) + return NULL; + + handle = dlopen(path, RTLD_NOW); + if (handle == NULL) { + /* printf("error: %s\n", dlerror()); */ + free(engine); + return NULL; + } + + { + unsigned long version; + openssl_v_check v_check; + + v_check = (openssl_v_check)dlsym(handle, "v_check"); + if (v_check == NULL) { + dlclose(handle); + free(engine); + return NULL; + } + + version = (*v_check)(OPENSSL_DYNAMIC_VERSION); + if (version == 0) { + dlclose(handle); + free(engine); + return NULL; + } + } + + { + openssl_bind_engine bind_engine; + + bind_engine = (openssl_bind_engine)dlsym(handle, "bind_engine"); + if (bind_engine == NULL) { + dlclose(handle); + free(engine); + return NULL; + } + + ret = (*bind_engine)(engine, id, NULL); /* XXX fix third arg */ + if (ret != 1) { + dlclose(handle); + free(engine); + return NULL; + } + } + + ENGINE_up_ref(engine); + + ret = add_engine(engine); + if (ret != 1) { + dlclose(handle); + ENGINE_finish(engine); + return NULL; + } + + return engine; +#else + return NULL; +#endif +} + +ENGINE * +ENGINE_by_id(const char *id) +{ + int i; + + for (i = 0; i < num_engines; i++) { + if (strcmp(id, engines[i]->id) == 0) { + ENGINE_up_ref(engines[i]); + return engines[i]; + } + } + return NULL; +} + +void +ENGINE_add_conf_module(void) +{ +} diff --git a/crypto/heimdal/lib/hcrypto/evp-cc.h b/crypto/heimdal/lib/hcrypto/evp-cc.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-cc.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2009 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_EVP_CC_H +#define HEIM_EVP_CC_H 1 + +/* symbol renaming */ +#define EVP_cc_md4 hc_EVP_cc_md4 +#define EVP_cc_md5 hc_EVP_cc_md5 +#define EVP_cc_sha1 hc_EVP_cc_sha1 +#define EVP_cc_sha256 hc_EVP_cc_sha256 +#define EVP_cc_sha384 hc_EVP_cc_sha384 +#define EVP_cc_sha512 hc_EVP_cc_sha512 +#define EVP_cc_des_cbc hc_EVP_cc_des_cbc +#define EVP_cc_des_ede3_cbc hc_EVP_cc_des_ede3_cbc +#define EVP_cc_aes_128_cbc hc_EVP_cc_aes_128_cbc +#define EVP_cc_aes_192_cbc hc_EVP_cc_aes_192_cbc +#define EVP_cc_aes_256_cbc hc_EVP_cc_aes_256_cbc +#define EVP_cc_aes_128_cfb8 hc_EVP_cc_aes_128_cfb8 +#define EVP_cc_aes_192_cfb8 hc_EVP_cc_aes_192_cfb8 +#define EVP_cc_aes_256_cfb8 hc_EVP_cc_aes_256_cfb8 +#define EVP_cc_rc4 hc_EVP_cc_rc4 +#define EVP_cc_rc4_40 hc_EVP_cc_rc4_40 +#define EVP_cc_rc2_40_cbc hc_EVP_cc_rc2_40_cbc +#define EVP_cc_rc2_64_cbc hc_EVP_cc_rc2_64_cbc +#define EVP_cc_rc2_cbc hc_EVP_cc_rc2_cbc +#define EVP_cc_camellia_128_cbc hc_EVP_cc_camellia_128_cbc +#define EVP_cc_camellia_192_cbc hc_EVP_cc_camellia_192_cbc +#define EVP_cc_camellia_256_cbc hc_EVP_cc_camellia_256_cbc + +/* + * + */ + +HC_CPP_BEGIN + +const EVP_MD * EVP_cc_md4(void); +const EVP_MD * EVP_cc_md5(void); +const EVP_MD * EVP_cc_sha1(void); +const EVP_MD * EVP_cc_sha256(void); +const EVP_MD * EVP_cc_sha384(void); +const EVP_MD * EVP_cc_sha512(void); + +const EVP_CIPHER * EVP_cc_rc2_cbc(void); +const EVP_CIPHER * EVP_cc_rc2_40_cbc(void); +const EVP_CIPHER * EVP_cc_rc2_64_cbc(void); + +const EVP_CIPHER * EVP_cc_rc4(void); +const EVP_CIPHER * EVP_cc_rc4_40(void); + +const EVP_CIPHER * EVP_cc_des_cbc(void); +const EVP_CIPHER * EVP_cc_des_ede3_cbc(void); + +const EVP_CIPHER * EVP_cc_aes_128_cbc(void); +const EVP_CIPHER * EVP_cc_aes_192_cbc(void); +const EVP_CIPHER * EVP_cc_aes_256_cbc(void); + +const EVP_CIPHER * EVP_cc_aes_128_cfb8(void); +const EVP_CIPHER * EVP_cc_aes_192_cfb8(void); +const EVP_CIPHER * EVP_cc_aes_256_cfb8(void); + +const EVP_CIPHER * EVP_cc_camellia_128_cbc(void); +const EVP_CIPHER * EVP_cc_camellia_192_cbc(void); +const EVP_CIPHER * EVP_cc_camellia_256_cbc(void); + +HC_CPP_END + +#endif /* HEIM_EVP_CC_H */ diff --git a/crypto/heimdal/lib/hcrypto/evp-cc.c b/crypto/heimdal/lib/hcrypto/evp-cc.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-cc.c @@ -0,0 +1,917 @@ +/* + * Copyright (c) 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* CommonCrypto provider */ + +#ifdef __APPLE__ + +#include +#include + +#include + +#ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H +#include +#endif +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H +#include +#endif + +#include +#include +#include + +/* + * + */ + +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + +struct cc_key { + CCCryptorRef href; +}; + +static int +cc_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + struct cc_key *cc = ctx->cipher_data; + CCCryptorStatus ret; + size_t moved; + + memcpy(out, in, size); + + ret = CCCryptorUpdate(cc->href, in, size, out, size, &moved); + if (ret) + return 0; + + if (moved != size) + return 0; + + return 1; +} + +static int +cc_cleanup(EVP_CIPHER_CTX *ctx) +{ + struct cc_key *cc = ctx->cipher_data; + if (cc->href) + CCCryptorRelease(cc->href); + return 1; +} + +static int +init_cc_key(int encp, unsigned long flags, + CCAlgorithm alg, const void *key, size_t keylen, + const void *iv, CCCryptorRef *ref) +{ + CCOperation op = encp ? kCCEncrypt : kCCDecrypt; + CCMode mode; + CCModeOptions options = 0; + CCCryptorStatus ret; + + if (*ref) { + if (key == NULL && iv) { + CCCryptorReset(*ref, iv); + return 1; + } + CCCryptorRelease(*ref); + } + + if (key) { + switch (flags & EVP_CIPH_MODE) { + case EVP_CIPH_STREAM_CIPHER: + mode = kCCModeRC4; + break; + case EVP_CIPH_CFB8_MODE: + mode = kCCModeCFB8; + break; + default: + mode = kCCModeCBC; + break; + } + + ret = CCCryptorCreateWithMode(op, mode, alg, ccNoPadding, + iv, key, keylen, NULL, 0, 0, + options, ref); + if (ret) + return 0; + } + + return 1; +} + +static int +cc_des_ede3_cbc_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct cc_key *cc = ctx->cipher_data; + return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithm3DES, + key, kCCKeySize3DES, iv, &cc->href); +} + +#endif /* HAVE_COMMONCRYPTO_COMMONCRYPTOR_H */ + +/** + * The triple DES cipher type (Apple CommonCrypto provider) + * + * @return the DES-EDE3-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_des_ede3_cbc(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER des_ede3_cbc = { + 0, + 8, + 24, + 8, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_des_ede3_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &des_ede3_cbc; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_des_ede3_cbc(); +#else + return NULL; +#endif +} + +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H +/* + * + */ + +static int +cc_des_cbc_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct cc_key *cc = ctx->cipher_data; + return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmDES, + key, kCCBlockSizeDES, iv, &cc->href); +} +#endif + +/** + * The DES cipher type (Apple CommonCrypto provider) + * + * @return the DES-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_des_cbc(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER des_ede3_cbc = { + 0, + kCCBlockSizeDES, + kCCBlockSizeDES, + kCCBlockSizeDES, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_des_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &des_ede3_cbc; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_des_cbc(); +#else + return NULL; +#endif +} + +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H +/* + * + */ + +static int +cc_aes_cbc_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct cc_key *cc = ctx->cipher_data; + return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmAES128, + key, ctx->cipher->key_len, iv, &cc->href); +} +#endif + +/** + * The AES-128 cipher type (Apple CommonCrypto provider) + * + * @return the AES-128-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_aes_128_cbc(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER c = { + 0, + kCCBlockSizeAES128, + kCCKeySizeAES128, + kCCBlockSizeAES128, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_aes_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &c; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_aes_128_cbc(); +#else + return NULL; +#endif +} + +/** + * The AES-192 cipher type (Apple CommonCrypto provider) + * + * @return the AES-192-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_aes_192_cbc(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER c = { + 0, + kCCBlockSizeAES128, + kCCKeySizeAES192, + kCCBlockSizeAES128, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_aes_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &c; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_aes_192_cbc(); +#else + return NULL; +#endif +} + +/** + * The AES-256 cipher type (Apple CommonCrypto provider) + * + * @return the AES-256-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_aes_256_cbc(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER c = { + 0, + kCCBlockSizeAES128, + kCCKeySizeAES256, + kCCBlockSizeAES128, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_aes_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &c; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_aes_256_cbc(); +#else + return NULL; +#endif +} + +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H +/* + * + */ + +static int +cc_aes_cfb8_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct cc_key *cc = ctx->cipher_data; + return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmAES128, + key, ctx->cipher->key_len, NULL, &cc->href); +} +#endif + +/** + * The AES-128 CFB8 cipher type (Apple CommonCrypto provider) + * + * @return the AES-128-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_aes_128_cfb8(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER c = { + 0, + 1, + kCCKeySizeAES128, + kCCBlockSizeAES128, + EVP_CIPH_CFB8_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_aes_cfb8_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &c; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_aes_128_cfb8(); +#else + return NULL; +#endif +} + +/** + * The AES-192 CFB8 cipher type (Apple CommonCrypto provider) + * + * @return the AES-192-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_aes_192_cfb8(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER c = { + 0, + 1, + kCCKeySizeAES192, + kCCBlockSizeAES128, + EVP_CIPH_CFB8_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_aes_cfb8_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &c; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_aes_192_cfb8(); +#else + return NULL; +#endif +} + +/** + * The AES-256 CFB8 cipher type (Apple CommonCrypto provider) + * + * @return the AES-256-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_aes_256_cfb8(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER c = { + 0, + kCCBlockSizeAES128, + kCCKeySizeAES256, + kCCBlockSizeAES128, + EVP_CIPH_CFB8_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_aes_cfb8_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &c; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_aes_256_cfb8(); +#else + return NULL; +#endif +} + +/* + * + */ + +#ifdef COMMONCRYPTO_SUPPORTS_RC2 +static int +cc_rc2_cbc_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct cc_key *cc = ctx->cipher_data; + return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmRC2, + key, ctx->cipher->key_len, iv, &cc->href); +} +#endif + +/** + * The RC2 cipher type - common crypto + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + + +const EVP_CIPHER * +EVP_cc_rc2_cbc(void) +{ +#ifdef COMMONCRYPTO_SUPPORTS_RC2 + static const EVP_CIPHER rc2_cbc = { + 0, + kCCBlockSizeRC2, + 16, + kCCBlockSizeRC2, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_rc2_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &rc2_cbc; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_rc2_cbc(); +#else + return NULL; +#endif +} + +/** + * The RC2-40 cipher type - common crypto + * + * @return the RC2-40 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + + +const EVP_CIPHER * +EVP_cc_rc2_40_cbc(void) +{ +#ifdef COMMONCRYPTO_SUPPORTS_RC2 + static const EVP_CIPHER rc2_40_cbc = { + 0, + kCCBlockSizeRC2, + 5, + kCCBlockSizeRC2, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_rc2_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &rc2_40_cbc; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_rc2_40_cbc(); +#else + return NULL; +#endif +} + + +/** + * The RC2-64 cipher type - common crypto + * + * @return the RC2-64 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + + +const EVP_CIPHER * +EVP_cc_rc2_64_cbc(void) +{ +#ifdef COMMONCRYPTO_SUPPORTS_RC2 + static const EVP_CIPHER rc2_64_cbc = { + 0, + kCCBlockSizeRC2, + 8, + kCCBlockSizeRC2, + EVP_CIPH_CBC_MODE|EVP_CIPH_ALWAYS_CALL_INIT, + cc_rc2_cbc_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &rc2_64_cbc; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_rc2_64_cbc(); +#else + return NULL; +#endif +} + + +/** + * The CommonCrypto md4 provider + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_cc_md4(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H + static const struct hc_evp_md md4 = { + CC_MD4_DIGEST_LENGTH, + CC_MD4_BLOCK_BYTES, + sizeof(CC_MD4_CTX), + (hc_evp_md_init)CC_MD4_Init, + (hc_evp_md_update)CC_MD4_Update, + (hc_evp_md_final)CC_MD4_Final, + (hc_evp_md_cleanup)NULL + }; + return &md4; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_md4(); +#else + return NULL; +#endif +} + +/** + * The CommonCrypto md5 provider + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_cc_md5(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H + static const struct hc_evp_md md5 = { + CC_MD5_DIGEST_LENGTH, + CC_MD5_BLOCK_BYTES, + sizeof(CC_MD5_CTX), + (hc_evp_md_init)CC_MD5_Init, + (hc_evp_md_update)CC_MD5_Update, + (hc_evp_md_final)CC_MD5_Final, + (hc_evp_md_cleanup)NULL + }; + return &md5; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_md5(); +#else + return NULL; +#endif +} + +/** + * The CommonCrypto sha1 provider + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_cc_sha1(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H + static const struct hc_evp_md sha1 = { + CC_SHA1_DIGEST_LENGTH, + CC_SHA1_BLOCK_BYTES, + sizeof(CC_SHA1_CTX), + (hc_evp_md_init)CC_SHA1_Init, + (hc_evp_md_update)CC_SHA1_Update, + (hc_evp_md_final)CC_SHA1_Final, + (hc_evp_md_cleanup)NULL + }; + return &sha1; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_sha1(); +#else + return NULL; +#endif +} + +/** + * The CommonCrypto sha256 provider + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_cc_sha256(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H + static const struct hc_evp_md sha256 = { + CC_SHA256_DIGEST_LENGTH, + CC_SHA256_BLOCK_BYTES, + sizeof(CC_SHA256_CTX), + (hc_evp_md_init)CC_SHA256_Init, + (hc_evp_md_update)CC_SHA256_Update, + (hc_evp_md_final)CC_SHA256_Final, + (hc_evp_md_cleanup)NULL + }; + return &sha256; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_sha256(); +#else + return NULL; +#endif +} + +/** + * The CommonCrypto sha384 provider + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_cc_sha384(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H + static const struct hc_evp_md sha384 = { + CC_SHA384_DIGEST_LENGTH, + CC_SHA384_BLOCK_BYTES, + sizeof(CC_SHA512_CTX), + (hc_evp_md_init)CC_SHA384_Init, + (hc_evp_md_update)CC_SHA384_Update, + (hc_evp_md_final)CC_SHA384_Final, + (hc_evp_md_cleanup)NULL + }; + return &sha384; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_sha384(); +#else + return NULL; +#endif +} + +/** + * The CommonCrypto sha512 provider + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_cc_sha512(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONDIGEST_H + static const struct hc_evp_md sha512 = { + CC_SHA512_DIGEST_LENGTH, + CC_SHA512_BLOCK_BYTES, + sizeof(CC_SHA512_CTX), + (hc_evp_md_init)CC_SHA512_Init, + (hc_evp_md_update)CC_SHA512_Update, + (hc_evp_md_final)CC_SHA512_Final, + (hc_evp_md_cleanup)NULL + }; + return &sha512; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_sha512(); +#else + return NULL; +#endif +} + +/** + * The Camellia-128 cipher type - CommonCrypto + * + * @return the Camellia-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_camellia_128_cbc(void) +{ +#if HCRYPTO_FALLBACK + return EVP_hcrypto_camellia_128_cbc(); +#else + return NULL; +#endif +} + +/** + * The Camellia-198 cipher type - CommonCrypto + * + * @return the Camellia-198 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_camellia_192_cbc(void) +{ +#if HCRYPTO_FALLBACK + return EVP_hcrypto_camellia_192_cbc(); +#else + return NULL; +#endif +} + +/** + * The Camellia-256 cipher type - CommonCrypto + * + * @return the Camellia-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_camellia_256_cbc(void) +{ +#if HCRYPTO_FALLBACK + return EVP_hcrypto_camellia_256_cbc(); +#else + return NULL; +#endif +} + +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + +/* + * + */ + +static int +cc_rc4_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct cc_key *cc = ctx->cipher_data; + return init_cc_key(encp, ctx->cipher->flags, kCCAlgorithmRC4, + key, ctx->key_len, iv, &cc->href); +} + +#endif + +/** + + * The RC4 cipher type (Apple CommonCrypto provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_rc4(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER rc4 = { + 0, + 1, + 16, + 0, + EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH, + cc_rc4_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &rc4; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_rc4(); +#else + return NULL; +#endif +} + + +/** + * The RC4-40 cipher type (Apple CommonCrypto provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_cc_rc4_40(void) +{ +#ifdef HAVE_COMMONCRYPTO_COMMONCRYPTOR_H + static const EVP_CIPHER rc4_40 = { + 0, + 1, + 5, + 0, + EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH, + cc_rc4_init, + cc_do_cipher, + cc_cleanup, + sizeof(struct cc_key), + NULL, + NULL, + NULL, + NULL + }; + return &rc4_40; +#elif HCRYPTO_FALLBACK + return EVP_hcrypto_rc4_40(); +#else + return NULL; +#endif +} + +#endif /* __APPLE__ */ + diff --git a/crypto/heimdal/lib/hcrypto/evp-crypt.c b/crypto/heimdal/lib/hcrypto/evp-crypt.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-crypt.c @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Windows crypto provider plugin, sample */ + +#include +#include + +#define HC_DEPRECATED + +#include + +#include + +#include + + +static HCRYPTPROV hCryptProv = NULL; + +/* + * + */ + +struct generic_key { + HCRYPTKEY *hKey; +}; + +static int +generic_cbc_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + struct generic_key *gk = ctx->cipher_data; + BOOL bResult; + DWORD length = size; + + bResult = CryptSetKeyParam(gk->hKey, KP_IV, ctx->iv, 0); + _ASSERT(bResult); + + memcpy(out, in, size); + + if (ctx->encrypt) + bResult = CryptEncrypt(gk->hKey, 0, TRUE, 0, out, &length, size); + else + bResult = CryptDecrypt(gk->hKey, 0, TRUE, 0, out, &length); + _ASSERT(bResult); + + return 1; +} + +static int +generic_cleanup(EVP_CIPHER_CTX *ctx) +{ + struct generic_key *gk = ctx->cipher_data; + CryptDestroyKey(gk->hKey); + gk->hKey = NULL; + return 1; +} + +static HCRYPTKEY +import_key(int alg, const unsigned char *key, size_t keylen) +{ + struct { + BLOBHEADER hdr; + DWORD len; + BYTE key[1]; + } *key_blob; + size_t bloblen = sizeof(*key_blob) - 1 + keylen; + + key_blob = malloc(bloblen); + + key_blob->hdr.bType = PLAINTEXTKEYBLOB; + key_blob->hdr.bVersion = CUR_BLOB_VERSION; + key_blob->hdr.reserved = 0; + key_blob->hdr.aiKeyAlg = alg; + key_blob->len = 24; + memcpy(key_blob->key, key, keylen); + + bResult = CryptImportKey(hCryptProv, + (void *)key_blob, bloblen, 0, 0, + &gk->hKey); + free(key_blob); + _ASSERT(bResult); + + return hKey; +} + +static int +crypto_des_ede3_cbc_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct generic_key *gk = ctx->cipher_data; + DWORD paramData; + + gk->hKey = import_key(CALG_3DES, + key->key->keyvalue.data, + key->key->keyvalue.len); + + return 1; +} + +/** + * The triple DES cipher type (Micrsoft crypt provider) + * + * @return the DES-EDE3-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_wincrypt_des_ede3_cbc(void) +{ + static const EVP_CIPHER des_ede3_cbc = { + 0, + 8, + 24, + 8, + EVP_CIPH_CBC_MODE, + crypto_des_ede3_cbc_init, + generic_cbc_do_cipher, + generic_cleanup, + sizeof(struct generic_key), + NULL, + NULL, + NULL, + NULL + }; + return &des_ede3_cbc; +} + +/* + * + */ + +struct generic_hash { + HCRYPTHASH hHash; +}; + +static void +crypto_md5_init(struct generic_hash *m); +{ + BOOL bResult; + bResult = CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &m->hHash); + _ASSERT(bResult); +} + +static void +generic_hash_update (struct generic_hash *m, const void *p, size_t len) +{ + BOOL bResult; + bResult = CryptHashData(m->hHash, data, ( DWORD )len, 0 ); + _ASSERT(bResult); +} + +static void +generic_hash_final (void *res, struct generic_hash *m); +{ + DWORD length; + BOOL bResult; + bResult = CryptGetHashParam(m->hHash, HP_HASHVAL, res, &length, 0) + _ASSERT(bResult); +} + +static void +generic_hash_cleanup(struct generic_hash *m) +{ + CryptDestroyHash(m->hHash); + m->hHash = NULL; +} + +const EVP_MD * +EVP_wincrypt_md5(void) +{ + static const struct hc_evp_md md5 = { + 16, + 64, + sizeof(struct generic_hash), + (hc_evp_md_init)crypto_md5_init, + (hc_evp_md_update)generic_hash_update, + (hc_evp_md_final)generic_hash_final, + (hc_evp_md_cleanup)generic_hash_cleanup + }; + return &md5; +} diff --git a/crypto/heimdal/lib/hcrypto/evp-hcrypto.h b/crypto/heimdal/lib/hcrypto/evp-hcrypto.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-hcrypto.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2009 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_EVP_HCRYPTO_H +#define HEIM_EVP_HCRYPTO_H 1 + +/* symbol renaming */ +#define EVP_hcrypto_md4 hc_EVP_hcrypto_md4 +#define EVP_hcrypto_md5 hc_EVP_hcrypto_md5 +#define EVP_hcrypto_sha1 hc_EVP_hcrypto_sha1 +#define EVP_hcrypto_sha256 hc_EVP_hcrypto_sha256 +#define EVP_hcrypto_sha384 hc_EVP_hcrypto_sha384 +#define EVP_hcrypto_sha512 hc_EVP_hcrypto_sha512 +#define EVP_hcrypto_des_cbc hc_EVP_hcrypto_des_cbc +#define EVP_hcrypto_des_ede3_cbc hc_EVP_hcrypto_des_ede3_cbc +#define EVP_hcrypto_aes_128_cbc hc_EVP_hcrypto_aes_128_cbc +#define EVP_hcrypto_aes_192_cbc hc_EVP_hcrypto_aes_192_cbc +#define EVP_hcrypto_aes_256_cbc hc_EVP_hcrypto_aes_256_cbc +#define EVP_hcrypto_aes_128_cfb8 hc_EVP_hcrypto_aes_128_cfb8 +#define EVP_hcrypto_aes_192_cfb8 hc_EVP_hcrypto_aes_192_cfb8 +#define EVP_hcrypto_aes_256_cfb8 hc_EVP_hcrypto_aes_256_cfb8 +#define EVP_hcrypto_rc4 hc_EVP_hcrypto_rc4 +#define EVP_hcrypto_rc4_40 hc_EVP_hcrypto_rc4_40 +#define EVP_hcrypto_rc2_40_cbc hc_EVP_hcrypto_rc2_40_cbc +#define EVP_hcrypto_rc2_64_cbc hc_EVP_hcrypto_rc2_64_cbc +#define EVP_hcrypto_rc2_cbc hc_EVP_hcrypto_rc2_cbc +#define EVP_hcrypto_camellia_128_cbc hc_EVP_hcrypto_camellia_128_cbc +#define EVP_hcrypto_camellia_192_cbc hc_EVP_hcrypto_camellia_192_cbc +#define EVP_hcrypto_camellia_256_cbc hc_EVP_hcrypto_camellia_256_cbc + +/* + * + */ + +HC_CPP_BEGIN + +const EVP_MD * EVP_hcrypto_md4(void); +const EVP_MD * EVP_hcrypto_md5(void); +const EVP_MD * EVP_hcrypto_sha1(void); +const EVP_MD * EVP_hcrypto_sha256(void); +const EVP_MD * EVP_hcrypto_sha384(void); +const EVP_MD * EVP_hcrypto_sha512(void); + +const EVP_CIPHER * EVP_hcrypto_rc4(void); +const EVP_CIPHER * EVP_hcrypto_rc4_40(void); + +const EVP_CIPHER * EVP_hcrypto_rc2_cbc(void); +const EVP_CIPHER * EVP_hcrypto_rc2_40_cbc(void); +const EVP_CIPHER * EVP_hcrypto_rc2_64_cbc(void); + +const EVP_CIPHER * EVP_hcrypto_des_cbc(void); +const EVP_CIPHER * EVP_hcrypto_des_ede3_cbc(void); + +const EVP_CIPHER * EVP_hcrypto_aes_128_cbc(void); +const EVP_CIPHER * EVP_hcrypto_aes_192_cbc(void); +const EVP_CIPHER * EVP_hcrypto_aes_256_cbc(void); + +const EVP_CIPHER * EVP_hcrypto_aes_128_cfb8(void); +const EVP_CIPHER * EVP_hcrypto_aes_192_cfb8(void); +const EVP_CIPHER * EVP_hcrypto_aes_256_cfb8(void); + +const EVP_CIPHER * EVP_hcrypto_camellia_128_cbc(void); +const EVP_CIPHER * EVP_hcrypto_camellia_192_cbc(void); +const EVP_CIPHER * EVP_hcrypto_camellia_256_cbc(void); + + +HC_CPP_END + +#endif /* HEIM_EVP_HCRYPTO_H */ diff --git a/crypto/heimdal/lib/hcrypto/evp-hcrypto.c b/crypto/heimdal/lib/hcrypto/evp-hcrypto.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-hcrypto.c @@ -0,0 +1,831 @@ +/* + * Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#define HC_DEPRECATED + +#include + +#include +#include + +#include + +#include +#include "camellia.h" +#include + +#include +#include + +#include +#include +#include + +/* + * + */ + +static int +aes_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + AES_KEY *k = ctx->cipher_data; + if (ctx->encrypt || EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_CFB8_MODE) + AES_set_encrypt_key(key, ctx->cipher->key_len * 8, k); + else + AES_set_decrypt_key(key, ctx->cipher->key_len * 8, k); + return 1; +} + +static int +aes_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + AES_KEY *k = ctx->cipher_data; + if (EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_CFB8_MODE) + AES_cfb8_encrypt(in, out, size, k, ctx->iv, ctx->encrypt); + else + AES_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt); + return 1; +} + +/** + * The AES-128 cipher type (hcrypto) + * + * @return the AES-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_aes_128_cbc(void) +{ + static const EVP_CIPHER aes_128_cbc = { + 0, + 16, + 16, + 16, + EVP_CIPH_CBC_MODE, + aes_init, + aes_do_cipher, + NULL, + sizeof(AES_KEY), + NULL, + NULL, + NULL, + NULL + }; + + return &aes_128_cbc; +} + +/** + * The AES-192 cipher type (hcrypto) + * + * @return the AES-192 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_aes_192_cbc(void) +{ + static const EVP_CIPHER aes_192_cbc = { + 0, + 16, + 24, + 16, + EVP_CIPH_CBC_MODE, + aes_init, + aes_do_cipher, + NULL, + sizeof(AES_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &aes_192_cbc; +} + +/** + * The AES-256 cipher type (hcrypto) + * + * @return the AES-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_aes_256_cbc(void) +{ + static const EVP_CIPHER aes_256_cbc = { + 0, + 16, + 32, + 16, + EVP_CIPH_CBC_MODE, + aes_init, + aes_do_cipher, + NULL, + sizeof(AES_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &aes_256_cbc; +} + +/** + * The AES-128 CFB8 cipher type (hcrypto) + * + * @return the AES-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_aes_128_cfb8(void) +{ + static const EVP_CIPHER aes_128_cfb8 = { + 0, + 1, + 16, + 16, + EVP_CIPH_CFB8_MODE, + aes_init, + aes_do_cipher, + NULL, + sizeof(AES_KEY), + NULL, + NULL, + NULL, + NULL + }; + + return &aes_128_cfb8; +} + +/** + * The AES-192 CFB8 cipher type (hcrypto) + * + * @return the AES-192 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_aes_192_cfb8(void) +{ + static const EVP_CIPHER aes_192_cfb8 = { + 0, + 1, + 24, + 16, + EVP_CIPH_CFB8_MODE, + aes_init, + aes_do_cipher, + NULL, + sizeof(AES_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &aes_192_cfb8; +} + +/** + * The AES-256 CFB8 cipher type (hcrypto) + * + * @return the AES-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_aes_256_cfb8(void) +{ + static const EVP_CIPHER aes_256_cfb8 = { + 0, + 1, + 32, + 16, + EVP_CIPH_CFB8_MODE, + aes_init, + aes_do_cipher, + NULL, + sizeof(AES_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &aes_256_cfb8; +} + +/** + * The message digest SHA256 - hcrypto + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_hcrypto_sha256(void) +{ + static const struct hc_evp_md sha256 = { + 32, + 64, + sizeof(SHA256_CTX), + (hc_evp_md_init)SHA256_Init, + (hc_evp_md_update)SHA256_Update, + (hc_evp_md_final)SHA256_Final, + NULL + }; + return &sha256; +} + +/** + * The message digest SHA384 - hcrypto + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_hcrypto_sha384(void) +{ + static const struct hc_evp_md sha384 = { + 48, + 128, + sizeof(SHA384_CTX), + (hc_evp_md_init)SHA384_Init, + (hc_evp_md_update)SHA384_Update, + (hc_evp_md_final)SHA384_Final, + NULL + }; + return &sha384; +} + +/** + * The message digest SHA512 - hcrypto + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_hcrypto_sha512(void) +{ + static const struct hc_evp_md sha512 = { + 64, + 128, + sizeof(SHA512_CTX), + (hc_evp_md_init)SHA512_Init, + (hc_evp_md_update)SHA512_Update, + (hc_evp_md_final)SHA512_Final, + NULL + }; + return &sha512; +} + +/** + * The message digest SHA1 - hcrypto + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_hcrypto_sha1(void) +{ + static const struct hc_evp_md sha1 = { + 20, + 64, + sizeof(SHA_CTX), + (hc_evp_md_init)SHA1_Init, + (hc_evp_md_update)SHA1_Update, + (hc_evp_md_final)SHA1_Final, + NULL + }; + return &sha1; +} + +/** + * The message digest MD5 - hcrypto + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_hcrypto_md5(void) +{ + static const struct hc_evp_md md5 = { + 16, + 64, + sizeof(MD5_CTX), + (hc_evp_md_init)MD5_Init, + (hc_evp_md_update)MD5_Update, + (hc_evp_md_final)MD5_Final, + NULL + }; + return &md5; +} + +/** + * The message digest MD4 - hcrypto + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_hcrypto_md4(void) +{ + static const struct hc_evp_md md4 = { + 16, + 64, + sizeof(MD4_CTX), + (hc_evp_md_init)MD4_Init, + (hc_evp_md_update)MD4_Update, + (hc_evp_md_final)MD4_Final, + NULL + }; + return &md4; +} + + +/* + * + */ + +static int +des_cbc_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + DES_key_schedule *k = ctx->cipher_data; + DES_cblock deskey; + memcpy(&deskey, key, sizeof(deskey)); + DES_set_key_unchecked(&deskey, k); + return 1; +} + +static int +des_cbc_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + DES_key_schedule *k = ctx->cipher_data; + DES_cbc_encrypt(in, out, size, + k, (DES_cblock *)ctx->iv, ctx->encrypt); + return 1; +} + +/** + * The DES cipher type + * + * @return the DES-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_des_cbc(void) +{ + static const EVP_CIPHER des_cbc = { + 0, + 8, + 8, + 8, + EVP_CIPH_CBC_MODE, + des_cbc_init, + des_cbc_do_cipher, + NULL, + sizeof(DES_key_schedule), + NULL, + NULL, + NULL, + NULL + }; + return &des_cbc; +} + +/* + * + */ + +struct des_ede3_cbc { + DES_key_schedule ks[3]; +}; + +static int +des_ede3_cbc_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct des_ede3_cbc *k = ctx->cipher_data; + DES_cblock deskey; + + memcpy(&deskey, key, sizeof(deskey)); + DES_set_odd_parity(&deskey); + DES_set_key_unchecked(&deskey, &k->ks[0]); + + memcpy(&deskey, key + 8, sizeof(deskey)); + DES_set_odd_parity(&deskey); + DES_set_key_unchecked(&deskey, &k->ks[1]); + + memcpy(&deskey, key + 16, sizeof(deskey)); + DES_set_odd_parity(&deskey); + DES_set_key_unchecked(&deskey, &k->ks[2]); + + return 1; +} + +static int +des_ede3_cbc_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + struct des_ede3_cbc *k = ctx->cipher_data; + DES_ede3_cbc_encrypt(in, out, size, + &k->ks[0], &k->ks[1], &k->ks[2], + (DES_cblock *)ctx->iv, ctx->encrypt); + return 1; +} + +/** + * The triple DES cipher type - hcrypto + * + * @return the DES-EDE3-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_des_ede3_cbc(void) +{ + static const EVP_CIPHER des_ede3_cbc = { + 0, + 8, + 24, + 8, + EVP_CIPH_CBC_MODE, + des_ede3_cbc_init, + des_ede3_cbc_do_cipher, + NULL, + sizeof(struct des_ede3_cbc), + NULL, + NULL, + NULL, + NULL + }; + return &des_ede3_cbc; +} + +/* + * + */ + +struct rc2_cbc { + unsigned int maximum_effective_key; + RC2_KEY key; +}; + +static int +rc2_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + struct rc2_cbc *k = ctx->cipher_data; + k->maximum_effective_key = EVP_CIPHER_CTX_key_length(ctx) * 8; + RC2_set_key(&k->key, + EVP_CIPHER_CTX_key_length(ctx), + key, + k->maximum_effective_key); + return 1; +} + +static int +rc2_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + struct rc2_cbc *k = ctx->cipher_data; + RC2_cbc_encrypt(in, out, size, &k->key, ctx->iv, ctx->encrypt); + return 1; +} + +/** + * The RC2 cipher type - hcrypto + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_rc2_cbc(void) +{ + static const EVP_CIPHER rc2_cbc = { + 0, + RC2_BLOCK_SIZE, + RC2_KEY_LENGTH, + RC2_BLOCK_SIZE, + EVP_CIPH_CBC_MODE|EVP_CIPH_VARIABLE_LENGTH, + rc2_init, + rc2_do_cipher, + NULL, + sizeof(struct rc2_cbc), + NULL, + NULL, + NULL, + NULL + }; + return &rc2_cbc; +} + +/** + * The RC2-40 cipher type + * + * @return the RC2-40 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_rc2_40_cbc(void) +{ + static const EVP_CIPHER rc2_40_cbc = { + 0, + RC2_BLOCK_SIZE, + 5, + RC2_BLOCK_SIZE, + EVP_CIPH_CBC_MODE, + rc2_init, + rc2_do_cipher, + NULL, + sizeof(struct rc2_cbc), + NULL, + NULL, + NULL, + NULL + }; + return &rc2_40_cbc; +} + +/** + * The RC2-64 cipher type + * + * @return the RC2-64 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_rc2_64_cbc(void) +{ + static const EVP_CIPHER rc2_64_cbc = { + 0, + RC2_BLOCK_SIZE, + 8, + RC2_BLOCK_SIZE, + EVP_CIPH_CBC_MODE, + rc2_init, + rc2_do_cipher, + NULL, + sizeof(struct rc2_cbc), + NULL, + NULL, + NULL, + NULL + }; + return &rc2_64_cbc; +} + +static int +camellia_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + CAMELLIA_KEY *k = ctx->cipher_data; + k->bits = ctx->cipher->key_len * 8; + CAMELLIA_set_key(key, ctx->cipher->key_len * 8, k); + return 1; +} + +static int +camellia_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + CAMELLIA_KEY *k = ctx->cipher_data; + CAMELLIA_cbc_encrypt(in, out, size, k, ctx->iv, ctx->encrypt); + return 1; +} + +/** + * The Camellia-128 cipher type - hcrypto + * + * @return the Camellia-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_camellia_128_cbc(void) +{ + static const EVP_CIPHER cipher = { + 0, + 16, + 16, + 16, + EVP_CIPH_CBC_MODE, + camellia_init, + camellia_do_cipher, + NULL, + sizeof(CAMELLIA_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &cipher; +} + +/** + * The Camellia-198 cipher type - hcrypto + * + * @return the Camellia-198 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_camellia_192_cbc(void) +{ + static const EVP_CIPHER cipher = { + 0, + 16, + 24, + 16, + EVP_CIPH_CBC_MODE, + camellia_init, + camellia_do_cipher, + NULL, + sizeof(CAMELLIA_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &cipher; +} + +/** + * The Camellia-256 cipher type - hcrypto + * + * @return the Camellia-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_hcrypto_camellia_256_cbc(void) +{ + static const EVP_CIPHER cipher = { + 0, + 16, + 32, + 16, + EVP_CIPH_CBC_MODE, + camellia_init, + camellia_do_cipher, + NULL, + sizeof(CAMELLIA_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &cipher; +} + +static int +rc4_init(EVP_CIPHER_CTX *ctx, + const unsigned char *key, + const unsigned char *iv, + int enc) +{ + RC4_KEY *k = ctx->cipher_data; + RC4_set_key(k, ctx->key_len, key); + return 1; +} + +static int +rc4_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + RC4_KEY *k = ctx->cipher_data; + RC4(k, size, in, out); + return 1; +} + +const EVP_CIPHER * +EVP_hcrypto_rc4(void) +{ + static const EVP_CIPHER rc4 = { + 0, + 1, + 16, + 0, + EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH, + rc4_init, + rc4_do_cipher, + NULL, + sizeof(RC4_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &rc4; +} + + +const EVP_CIPHER * +EVP_hcrypto_rc4_40(void) +{ + static const EVP_CIPHER rc4_40 = { + 0, + 1, + 5, + 0, + EVP_CIPH_STREAM_CIPHER|EVP_CIPH_VARIABLE_LENGTH, + rc4_init, + rc4_do_cipher, + NULL, + sizeof(RC4_KEY), + NULL, + NULL, + NULL, + NULL + }; + return &rc4_40; +} diff --git a/crypto/heimdal/lib/hcrypto/evp-openssl.h b/crypto/heimdal/lib/hcrypto/evp-openssl.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-openssl.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2009-2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_EVP_OSSL_H +#define HEIM_EVP_OSSL_H 1 + +/* symbol renaming */ +#define EVP_ossl_md4 hc_EVP_ossl_md4 +#define EVP_ossl_md5 hc_EVP_ossl_md5 +#define EVP_ossl_sha1 hc_EVP_ossl_sha1 +#define EVP_ossl_sha256 hc_EVP_ossl_sha256 +#define EVP_ossl_sha384 hc_EVP_ossl_sha384 +#define EVP_ossl_sha512 hc_EVP_ossl_sha512 +#define EVP_ossl_des_cbc hc_EVP_ossl_des_cbc +#define EVP_ossl_des_ede3_cbc hc_EVP_ossl_des_ede3_cbc +#define EVP_ossl_aes_128_cbc hc_EVP_ossl_aes_128_cbc +#define EVP_ossl_aes_192_cbc hc_EVP_ossl_aes_192_cbc +#define EVP_ossl_aes_256_cbc hc_EVP_ossl_aes_256_cbc +#define EVP_ossl_aes_128_cfb8 hc_EVP_ossl_aes_128_cfb8 +#define EVP_ossl_aes_192_cfb8 hc_EVP_ossl_aes_192_cfb8 +#define EVP_ossl_aes_256_cfb8 hc_EVP_ossl_aes_256_cfb8 +#define EVP_ossl_rc4 hc_EVP_ossl_rc4 +#define EVP_ossl_rc4_40 hc_EVP_ossl_rc4_40 +#define EVP_ossl_rc2_40_cbc hc_EVP_ossl_rc2_40_cbc +#define EVP_ossl_rc2_64_cbc hc_EVP_ossl_rc2_64_cbc +#define EVP_ossl_rc2_cbc hc_EVP_ossl_rc2_cbc +#define EVP_ossl_camellia_128_cbc hc_EVP_ossl_camellia_128_cbc +#define EVP_ossl_camellia_192_cbc hc_EVP_ossl_camellia_192_cbc +#define EVP_ossl_camellia_256_cbc hc_EVP_ossl_camellia_256_cbc + +/* + * + */ + +HC_CPP_BEGIN + +const hc_EVP_MD * hc_EVP_ossl_md4(void); +const hc_EVP_MD * hc_EVP_ossl_md5(void); +const hc_EVP_MD * hc_EVP_ossl_sha1(void); +const hc_EVP_MD * hc_EVP_ossl_sha256(void); +const hc_EVP_MD * hc_EVP_ossl_sha384(void); +const hc_EVP_MD * hc_EVP_ossl_sha512(void); + +const hc_EVP_CIPHER * hc_EVP_ossl_rc2_cbc(void); +const hc_EVP_CIPHER * hc_EVP_ossl_rc2_40_cbc(void); +const hc_EVP_CIPHER * hc_EVP_ossl_rc2_64_cbc(void); + +const hc_EVP_CIPHER * hc_EVP_ossl_rc4(void); +const hc_EVP_CIPHER * hc_EVP_ossl_rc4_40(void); + +const hc_EVP_CIPHER * hc_EVP_ossl_des_cbc(void); +const hc_EVP_CIPHER * hc_EVP_ossl_des_ede3_cbc(void); + +const hc_EVP_CIPHER * hc_EVP_ossl_aes_128_cbc(void); +const hc_EVP_CIPHER * hc_EVP_ossl_aes_192_cbc(void); +const hc_EVP_CIPHER * hc_EVP_ossl_aes_256_cbc(void); + +const hc_EVP_CIPHER * hc_EVP_ossl_aes_128_cfb8(void); +const hc_EVP_CIPHER * hc_EVP_ossl_aes_192_cfb8(void); +const hc_EVP_CIPHER * hc_EVP_ossl_aes_256_cfb8(void); + +const hc_EVP_CIPHER * hc_EVP_ossl_camellia_128_cbc(void); +const hc_EVP_CIPHER * hc_EVP_ossl_camellia_192_cbc(void); +const hc_EVP_CIPHER * hc_EVP_ossl_camellia_256_cbc(void); + +HC_CPP_END + +#endif /* HEIM_EVP_OSSL_H */ diff --git a/crypto/heimdal/lib/hcrypto/evp-openssl.c b/crypto/heimdal/lib/hcrypto/evp-openssl.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-openssl.c @@ -0,0 +1,635 @@ +/* + * Copyright (c) 2016, Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* OpenSSL provider */ + +#include "config.h" +#include +#include + +#include +#include + +#ifdef HAVE_HCRYPTO_W_OPENSSL + +/* + * This is the OpenSSL 1.x backend for hcrypto. It has been tested with + * OpenSSL 1.0.1f and OpenSSL 1.1.0-pre3-dev. + * + * NOTE: In order for this to work with OpenSSL 1.1.x and up, it is + * critical to use opaque OpenSSL type accessors everywhere / + * never use knowledge of opaque OpenSSL type internals. + */ + +#include + +/* + * This being an OpenSSL backend for hcrypto... we need to be able to + * refer to types and objects (functions) from both, OpenSSL and + * hcrypto. + * + * The hcrypto API is *very* similar to the OpenSSL 1.0.x API, with the + * same type and symbol names in many cases, except that the hcrypto + * names are prefixed with hc_*. hcrypto has convenience macros that + * provide OpenSSL aliases for the hcrypto interfaces, and hcrypto + * applications are expected to use the OpenSSL names. + * + * Since here we must be able to refer to types and objects from both + * OpenSSL and from hcrypto, we disable the hcrypto renaming for the + * rest of this file. These #undefs could be collected into an + * for the purpose of permitting other applications to + * use both, hcrypto and OpenSSL in the same source files (provided that + * such applications refer to hcrypto types and objects by their proper + * hc_-prefixed names). + */ +#include + +/* Now it's safe to include OpenSSL headers */ +#include + +#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) +#define EVP_MD_CTX_new EVP_MD_CTX_create +#define EVP_MD_CTX_free EVP_MD_CTX_destroy +#endif + +/* A HEIM_BASE_ONCE argument struct for per-EVP one-time initialization */ +struct once_init_cipher_ctx { + const hc_EVP_CIPHER **hc_memoizep; + hc_EVP_CIPHER *hc_memoize; + const hc_EVP_CIPHER *fallback; + unsigned long flags; + int nid; +}; + +/* Our wrapper for OpenSSL EVP_CIPHER_CTXs */ +struct ossl_cipher_ctx { + EVP_CIPHER_CTX *ossl_cipher_ctx; /* OpenSSL cipher ctx */ + const EVP_CIPHER *ossl_cipher; /* OpenSSL cipher */ + int initialized; +}; + +/* + * Our hc_EVP_CIPHER init() method; wraps around OpenSSL + * EVP_CipherInit_ex(). + * + * This is very similar to the init() function pointer in an OpenSSL + * EVP_CIPHER, but a) we can't access them in 1.1, and b) the method + * invocation protocols in hcrypto and OpenSSL are similar but not the + * same, thus we must have this wrapper. + */ +static int +cipher_ctx_init(hc_EVP_CIPHER_CTX *ctx, const unsigned char *key, + const unsigned char *iv, int enc) +{ + struct ossl_cipher_ctx *ossl_ctx = ctx->cipher_data; /* EVP_CIPHER_CTX wrapper */ + const EVP_CIPHER *c; + + assert(ossl_ctx != NULL); + assert(ctx->cipher != NULL); + assert(ctx->cipher->app_data != NULL); + + /* + * Here be dragons. + * + * We need to make sure that the OpenSSL EVP_CipherInit_ex() is + * called with cipher!=NULL just once per EVP_CIPHER_CTX, otherwise + * state in the OpenSSL EVP_CIPHER_CTX will get cleaned up and then + * we'll segfault. + * + * hcrypto applications can re-initialize an (hc_)EVP_CIPHER_CTX as + * usual by calling (hc)EVP_CipherInit_ex() with a non-NULL cipher + * argument, and that will cause cipher_cleanup() (below) to be + * called. + */ + c = ossl_ctx->ossl_cipher = ctx->cipher->app_data; /* OpenSSL's EVP_CIPHER * */ + if (!ossl_ctx->initialized) { + ossl_ctx->ossl_cipher_ctx = EVP_CIPHER_CTX_new(); + if (ossl_ctx->ossl_cipher_ctx == NULL) + return 0; + /* + * So we always call EVP_CipherInit_ex() with c!=NULL, but other + * things NULL... + */ + if (!EVP_CipherInit_ex(ossl_ctx->ossl_cipher_ctx, c, NULL, NULL, NULL, enc)) + return 0; + ossl_ctx->initialized = 1; + } + + /* ...and from here on always call EVP_CipherInit_ex() with c=NULL */ + if ((ctx->cipher->flags & hc_EVP_CIPH_VARIABLE_LENGTH) && + ctx->key_len > 0) + EVP_CIPHER_CTX_set_key_length(ossl_ctx->ossl_cipher_ctx, ctx->key_len); + + return EVP_CipherInit_ex(ossl_ctx->ossl_cipher_ctx, NULL, NULL, key, iv, enc); +} + +static int +cipher_do_cipher(hc_EVP_CIPHER_CTX *ctx, unsigned char *out, + const unsigned char *in, unsigned int len) +{ + struct ossl_cipher_ctx *ossl_ctx = ctx->cipher_data; + + assert(ossl_ctx != NULL); + return EVP_Cipher(ossl_ctx->ossl_cipher_ctx, out, in, len); +} + +static int +cipher_cleanup(hc_EVP_CIPHER_CTX *ctx) +{ + struct ossl_cipher_ctx *ossl_ctx = ctx->cipher_data; + + if (ossl_ctx == NULL || !ossl_ctx->initialized) + return 1; + + if (ossl_ctx->ossl_cipher_ctx != NULL) + EVP_CIPHER_CTX_free(ossl_ctx->ossl_cipher_ctx); + + ossl_ctx->ossl_cipher_ctx = NULL; + ossl_ctx->ossl_cipher = NULL; + ossl_ctx->initialized = 0; + return 1; +} + +static int +cipher_ctrl(hc_EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr) +{ + struct ossl_cipher_ctx *ossl_ctx = ctx->cipher_data; + + assert(ossl_ctx != NULL); + return EVP_CIPHER_CTX_ctrl(ossl_ctx->ossl_cipher_ctx, type, arg, ptr); +} + + +static void +get_EVP_CIPHER_once_cb(void *d) +{ + struct once_init_cipher_ctx *arg = d; + const EVP_CIPHER *ossl_evp; + hc_EVP_CIPHER *hc_evp; + + hc_evp = arg->hc_memoize; + + /* + * We lookup EVP_CIPHER *s by NID so that we don't fail to find a + * symbol such as EVP_aes...() when libcrypto changes after build + * time (e.g., updates, LD_LIBRARY_PATH/LD_PRELOAD). + */ + ossl_evp = EVP_get_cipherbynid(arg->nid); + if (ossl_evp == NULL) { + (void) memset(hc_evp, 0, sizeof(*hc_evp)); +#if HCRYPTO_FALLBACK + *arg->hc_memoizep = arg->fallback; +#endif + return; + } + + /* Build the hc_EVP_CIPHER */ + hc_evp->nid = EVP_CIPHER_nid(ossl_evp); /* We would an hcrypto NIDs if we had them */ + hc_evp->block_size = EVP_CIPHER_block_size(ossl_evp); + hc_evp->key_len = EVP_CIPHER_key_length(ossl_evp); + hc_evp->iv_len = EVP_CIPHER_iv_length(ossl_evp); + + /* + * We force hc_EVP_CipherInit_ex to always call our init() function, + * otherwise we don't get a chance to call EVP_CipherInit_ex() + * correctly. + */ + hc_evp->flags = hc_EVP_CIPH_ALWAYS_CALL_INIT | arg->flags; + + /* Our cipher context */ + hc_evp->ctx_size = sizeof(struct ossl_cipher_ctx); + + /* Our wrappers */ + hc_evp->init = cipher_ctx_init; + hc_evp->do_cipher = cipher_do_cipher; + hc_evp->cleanup = cipher_cleanup; + hc_evp->set_asn1_parameters = NULL; + hc_evp->get_asn1_parameters = NULL; + hc_evp->ctrl = cipher_ctrl; + + /* Our link to the OpenSSL EVP_CIPHER */ + hc_evp->app_data = (void *)ossl_evp; + + /* Finally, set the static hc_EVP_CIPHER * to the one we just built */ + *arg->hc_memoizep = hc_evp; +} + +static const hc_EVP_CIPHER * +get_EVP_CIPHER(heim_base_once_t *once, hc_EVP_CIPHER *hc_memoize, + const hc_EVP_CIPHER **hc_memoizep, + const hc_EVP_CIPHER *fallback, + unsigned long flags, int nid) +{ + struct once_init_cipher_ctx arg; + + arg.flags = flags; + arg.hc_memoizep = hc_memoizep; + arg.hc_memoize = hc_memoize; + arg.fallback = fallback; + arg.nid = nid; + heim_base_once_f(once, &arg, get_EVP_CIPHER_once_cb); + return *hc_memoizep; /* May be NULL */ +} + +#define OSSL_CIPHER_ALGORITHM(name, flags) \ + extern const hc_EVP_CIPHER *hc_EVP_hcrypto_##name(void); \ + const hc_EVP_CIPHER *hc_EVP_ossl_##name(void) \ + { \ + static hc_EVP_CIPHER ossl_##name##_st; \ + static const hc_EVP_CIPHER *ossl_##name; \ + static heim_base_once_t once = HEIM_BASE_ONCE_INIT; \ + return get_EVP_CIPHER(&once, &ossl_##name##_st, &ossl_##name, \ + hc_EVP_hcrypto_##name(), \ + flags, NID_##name); \ + } + +/* As above, but for EVP_MDs */ + +struct ossl_md_ctx { + EVP_MD_CTX *ossl_md_ctx; /* OpenSSL md ctx */ + const EVP_MD *ossl_md; /* OpenSSL md */ + int initialized; +}; + +static int +ossl_md_init(struct ossl_md_ctx *ctx, const EVP_MD *md) +{ + if (ctx->initialized) + EVP_MD_CTX_free(ctx->ossl_md_ctx); + ctx->initialized = 0; + + ctx->ossl_md = md; + ctx->ossl_md_ctx = EVP_MD_CTX_new(); + if (!EVP_DigestInit(ctx->ossl_md_ctx, md)) { + EVP_MD_CTX_free(ctx->ossl_md_ctx); + ctx->ossl_md_ctx = NULL; + ctx->ossl_md = NULL; + return 0; + } + ctx->initialized = 1; + return 1; +} + +static int +ossl_md_update(hc_EVP_MD_CTX *d, const void *data, size_t count) +{ + struct ossl_md_ctx *ctx = (void *)d; + + return EVP_DigestUpdate(ctx->ossl_md_ctx, data, count); +} + +static int +ossl_md_final(void *md_data, hc_EVP_MD_CTX *d) +{ + struct ossl_md_ctx *ctx = (void *)d; + + return EVP_DigestFinal(ctx->ossl_md_ctx, md_data, NULL); +} + +static int +ossl_md_cleanup(hc_EVP_MD_CTX *d) +{ + struct ossl_md_ctx *ctx = (void *)d; + + if (!ctx->initialized) + return 1; + EVP_MD_CTX_free(ctx->ossl_md_ctx); + ctx->ossl_md = NULL; + ctx->initialized = 0; + + return 1; +} + +struct once_init_md_ctx { + const EVP_MD **ossl_memoizep; + const hc_EVP_MD **hc_memoizep; + hc_EVP_MD *hc_memoize; + const hc_EVP_MD *fallback; + hc_evp_md_init md_init; + int nid; +}; + +static void +get_EVP_MD_once_cb(void *d) +{ + struct once_init_md_ctx *arg = d; + const EVP_MD *ossl_evp; + hc_EVP_MD *hc_evp; + + hc_evp = arg->hc_memoize; + *arg->ossl_memoizep = ossl_evp = EVP_get_digestbynid(arg->nid); + + if (ossl_evp == NULL) { + (void) memset(hc_evp, 0, sizeof(*hc_evp)); +#if HCRYPTO_FALLBACK + *arg->hc_memoizep = arg->fallback; +#endif + return; + } + + /* Build the hc_EVP_MD */ + hc_evp->block_size = EVP_MD_block_size(ossl_evp); + hc_evp->hash_size = EVP_MD_size(ossl_evp); + hc_evp->ctx_size = sizeof(struct ossl_md_ctx); + hc_evp->init = arg->md_init; + hc_evp->update = ossl_md_update; + hc_evp->final = ossl_md_final; + hc_evp->cleanup = ossl_md_cleanup; + + *arg->hc_memoizep = hc_evp; +} + +static const hc_EVP_MD * +get_EVP_MD(heim_base_once_t *once, hc_EVP_MD *hc_memoize, + const hc_EVP_MD **hc_memoizep, const EVP_MD **ossl_memoizep, + const hc_EVP_MD *fallback, + hc_evp_md_init md_init, int nid) +{ + struct once_init_md_ctx ctx; + + ctx.ossl_memoizep = ossl_memoizep; + ctx.hc_memoizep = hc_memoizep; + ctx.hc_memoize = hc_memoize; + ctx.fallback = fallback; + ctx.md_init = md_init; + ctx.nid = nid; + heim_base_once_f(once, &ctx, get_EVP_MD_once_cb); + return *hc_memoizep; /* May be NULL */ +} + +#define OSSL_MD_ALGORITHM(name) \ + extern const hc_EVP_MD *hc_EVP_hcrypto_##name(void); \ + static const EVP_MD *ossl_EVP_##name; \ + static const hc_EVP_MD *ossl_##name; \ + static int ossl_init_##name(hc_EVP_MD_CTX *d) \ + { \ + return ossl_md_init((void *)d, ossl_EVP_##name); \ + } \ + const hc_EVP_MD *hc_EVP_ossl_##name(void) \ + { \ + static hc_EVP_MD ossl_##name##_st; \ + static heim_base_once_t once = HEIM_BASE_ONCE_INIT; \ + return get_EVP_MD(&once, &ossl_##name##_st, &ossl_##name, \ + &ossl_EVP_##name, hc_EVP_hcrypto_##name(), \ + ossl_init_##name, NID_##name); \ + } + +#else /* HAVE_HCRYPTO_W_OPENSSL */ + +#include "evp-hcrypto.h" + +#define OSSL_CIPHER_ALGORITHM(name, flags) \ + extern const hc_EVP_CIPHER *hc_EVP_ossl_##name(void); \ + const hc_EVP_CIPHER *hc_EVP_ossl_##name(void) \ + { \ + return hc_EVP_hcrypto_##name(); \ + } + +#define OSSL_MD_ALGORITHM(name) \ + extern const hc_EVP_MD *hc_EVP_ossl_##name(void); \ + const hc_EVP_MD *hc_EVP_ossl_##name(void) \ + { \ + return hc_EVP_hcrypto_##name(); \ + } + +#endif /* HAVE_HCRYPTO_W_OPENSSL */ + +/** + * The triple DES cipher type (OpenSSL provider) + * + * @return the DES-EDE3-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(des_ede3_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The DES cipher type (OpenSSL provider) + * + * @return the DES-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(des_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The AES-128 cipher type (OpenSSL provider) + * + * @return the AES-128-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(aes_128_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The AES-192 cipher type (OpenSSL provider) + * + * @return the AES-192-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(aes_192_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The AES-256 cipher type (OpenSSL provider) + * + * @return the AES-256-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(aes_256_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The AES-128 CFB8 cipher type (OpenSSL provider) + * + * @return the AES-128-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(aes_128_cfb8, hc_EVP_CIPH_CFB8_MODE) + +/** + * The AES-192 CFB8 cipher type (OpenSSL provider) + * + * @return the AES-192-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(aes_192_cfb8, hc_EVP_CIPH_CFB8_MODE) + +/** + * The AES-256 CFB8 cipher type (OpenSSL provider) + * + * @return the AES-256-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(aes_256_cfb8, hc_EVP_CIPH_CFB8_MODE) + +/* + * RC2 is only needed for tests of PKCS#12 support, which currently uses + * the RC2 PBE. So no RC2 -> tests fail. + */ + +/** + * The RC2 cipher type - OpenSSL + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(rc2_cbc, + hc_EVP_CIPH_CBC_MODE | + hc_EVP_CIPH_VARIABLE_LENGTH) + +/** + * The RC2-40 cipher type - OpenSSL + * + * @return the RC2-40 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(rc2_40_cbc, + hc_EVP_CIPH_CBC_MODE) + +/** + * The RC2-64 cipher type - OpenSSL + * + * @return the RC2-64 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(rc2_64_cbc, + hc_EVP_CIPH_CBC_MODE | + hc_EVP_CIPH_VARIABLE_LENGTH) + +/** + * The Camellia-128 cipher type - OpenSSL + * + * @return the Camellia-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(camellia_128_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The Camellia-198 cipher type - OpenSSL + * + * @return the Camellia-198 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(camellia_192_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The Camellia-256 cipher type - OpenSSL + * + * @return the Camellia-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(camellia_256_cbc, hc_EVP_CIPH_CBC_MODE) + +/** + * The RC4 cipher type (OpenSSL provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(rc4, + hc_EVP_CIPH_STREAM_CIPHER | + hc_EVP_CIPH_VARIABLE_LENGTH) + +/** + * The RC4-40 cipher type (OpenSSL provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_CIPHER_ALGORITHM(rc4_40, + hc_EVP_CIPH_STREAM_CIPHER | + hc_EVP_CIPH_VARIABLE_LENGTH) + +/** + * The MD4 hash algorithm (OpenSSL provider) + * + * @return the MD4 EVP_MD pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_MD_ALGORITHM(md4) + +/** + * The MD5 hash algorithm (OpenSSL provider) + * + * @return the MD5 EVP_MD pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_MD_ALGORITHM(md5) + +/** + * The SHA-1 hash algorithm (OpenSSL provider) + * + * @return the SHA-1 EVP_MD pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_MD_ALGORITHM(sha1) + +/** + * The SHA-256 hash algorithm (OpenSSL provider) + * + * @return the SHA-256 EVP_MD pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_MD_ALGORITHM(sha256) + +/** + * The SHA-384 hash algorithm (OpenSSL provider) + * + * @return the SHA-384 EVP_MD pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_MD_ALGORITHM(sha384) + +/** + * The SHA-512 hash algorithm (OpenSSL provider) + * + * @return the SHA-512 EVP_MD pointer. + * + * @ingroup hcrypto_evp + */ +OSSL_MD_ALGORITHM(sha512) diff --git a/crypto/heimdal/lib/hcrypto/evp-pkcs11.h b/crypto/heimdal/lib/hcrypto/evp-pkcs11.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-pkcs11.h @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2015, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_EVP_PKCS11_H +#define HEIM_EVP_PKCS11_H 1 + +/* symbol renaming */ + +#define EVP_pkcs11_md4() hc_EVP_pkcs11_md4() +#define EVP_pkcs11_md5() hc_EVP_pkcs11_md5() +#define EVP_pkcs11_sha1() hc_EVP_pkcs11_sha1() +#define EVP_pkcs11_sha256() hc_EVP_pkcs11_sha256() +#define EVP_pkcs11_sha384() hc_EVP_pkcs11_sha384() +#define EVP_pkcs11_sha512() hc_EVP_pkcs11_sha512() +#define EVP_pkcs11_des_cbc() hc_EVP_pkcs11_des_cbc() +#define EVP_pkcs11_des_ede3_cbc() hc_EVP_pkcs11_des_ede3_cbc() +#define EVP_pkcs11_aes_128_cbc() hc_EVP_pkcs11_aes_128_cbc() +#define EVP_pkcs11_aes_192_cbc() hc_EVP_pkcs11_aes_192_cbc() +#define EVP_pkcs11_aes_256_cbc() hc_EVP_pkcs11_aes_256_cbc() +#define EVP_pkcs11_aes_128_cfb8() hc_EVP_pkcs11_aes_128_cfb8() +#define EVP_pkcs11_aes_192_cfb8() hc_EVP_pkcs11_aes_192_cfb8() +#define EVP_pkcs11_aes_256_cfb8() hc_EVP_pkcs11_aes_256_cfb8() +#define EVP_pkcs11_rc4() hc_EVP_pkcs11_rc4() +#define EVP_pkcs11_rc4_40() hc_EVP_pkcs11_rc4_40() +#define EVP_pkcs11_rc2_40_cbc() hc_EVP_pkcs11_rc2_40_cbc() +#define EVP_pkcs11_rc2_64_cbc() hc_EVP_pkcs11_rc2_64_cbc() +#define EVP_pkcs11_rc2_cbc() hc_EVP_pkcs11_rc2_cbc() +#define EVP_pkcs11_camellia_128_cbc() hc_EVP_pkcs11_camellia_128_cbc() +#define EVP_pkcs11_camellia_192_cbc() hc_EVP_pkcs11_camellia_192_cbc() +#define EVP_pkcs11_camellia_256_cbc() hc_EVP_pkcs11_camellia_256_cbc() + +#define EVP_pkcs11_hcrypto_md4() hc_EVP_pkcs11_hcrypto_md4() +#define EVP_pkcs11_hcrypto_md5() hc_EVP_pkcs11_hcrypto_md5() +#define EVP_pkcs11_hcrypto_sha1() hc_EVP_pkcs11_hcrypto_sha1() +#define EVP_pkcs11_hcrypto_sha256() hc_EVP_pkcs11_hcrypto_sha256() +#define EVP_pkcs11_hcrypto_sha384() hc_EVP_pkcs11_hcrypto_sha384() +#define EVP_pkcs11_hcrypto_sha512() hc_EVP_pkcs11_hcrypto_sha512() +#define EVP_pkcs11_hcrypto_des_cbc() hc_EVP_pkcs11_hcrypto_des_cbc() +#define EVP_pkcs11_hcrypto_des_ede3_cbc() hc_EVP_pkcs11_hcrypto_des_ede3_cbc() +#define EVP_pkcs11_hcrypto_aes_128_cbc() hc_EVP_pkcs11_hcrypto_aes_128_cbc() +#define EVP_pkcs11_hcrypto_aes_192_cbc() hc_EVP_pkcs11_hcrypto_aes_192_cbc() +#define EVP_pkcs11_hcrypto_aes_256_cbc() hc_EVP_pkcs11_hcrypto_aes_256_cbc() +#define EVP_pkcs11_hcrypto_aes_128_cfb8() hc_EVP_pkcs11_hcrypto_aes_128_cfb8() +#define EVP_pkcs11_hcrypto_aes_192_cfb8() hc_EVP_pkcs11_hcrypto_aes_192_cfb8() +#define EVP_pkcs11_hcrypto_aes_256_cfb8() hc_EVP_pkcs11_hcrypto_aes_256_cfb8() +#define EVP_pkcs11_hcrypto_rc4() hc_EVP_pkcs11_hcrypto_rc4() +#define EVP_pkcs11_hcrypto_rc4_40() hc_EVP_pkcs11_hcrypto_rc4_40() +#define EVP_pkcs11_hcrypto_rc2_40_cbc() hc_EVP_pkcs11_hcrypto_rc2_40_cbc() +#define EVP_pkcs11_hcrypto_rc2_64_cbc() hc_EVP_pkcs11_hcrypto_rc2_64_cbc() +#define EVP_pkcs11_hcrypto_rc2_cbc() hc_EVP_pkcs11_hcrypto_rc2_cbc() +#define EVP_pkcs11_hcrypto_camellia_128_cbc() hc_EVP_pkcs11_hcrypto_camellia_128_cbc() +#define EVP_pkcs11_hcrypto_camellia_192_cbc() hc_EVP_pkcs11_hcrypto_camellia_192_cbc() +#define EVP_pkcs11_hcrypto_camellia_256_cbc() hc_EVP_pkcs11_hcrypto_camellia_256_cbc() + +HC_CPP_BEGIN + +/* + * Strict PKCS#11 implementations (these will return NULL if the underlying + * PKCS#11 implementation does not implement the cipher or hash). + */ +const EVP_MD * hc_EVP_pkcs11_md4(void); +const EVP_MD * hc_EVP_pkcs11_md5(void); +const EVP_MD * hc_EVP_pkcs11_sha1(void); +const EVP_MD * hc_EVP_pkcs11_sha256(void); +const EVP_MD * hc_EVP_pkcs11_sha384(void); +const EVP_MD * hc_EVP_pkcs11_sha512(void); + +const EVP_CIPHER * hc_EVP_pkcs11_rc2_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_rc2_40_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_rc2_64_cbc(void); + +const EVP_CIPHER * hc_EVP_pkcs11_rc4(void); +const EVP_CIPHER * hc_EVP_pkcs11_rc4_40(void); + +const EVP_CIPHER * hc_EVP_pkcs11_des_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_des_ede3_cbc(void); + +const EVP_CIPHER * hc_EVP_pkcs11_aes_128_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_aes_192_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_aes_256_cbc(void); + +const EVP_CIPHER * hc_EVP_pkcs11_aes_128_cfb8(void); +const EVP_CIPHER * hc_EVP_pkcs11_aes_192_cfb8(void); +const EVP_CIPHER * hc_EVP_pkcs11_aes_256_cfb8(void); + +const EVP_CIPHER * hc_EVP_pkcs11_camellia_128_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_camellia_192_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_camellia_256_cbc(void); + +/* + * PKCS#11 implementations with fallback to hcrypto. + */ +const EVP_MD * hc_EVP_pkcs11_hcrypto_md4(void); +const EVP_MD * hc_EVP_pkcs11_hcrypto_md5(void); +const EVP_MD * hc_EVP_pkcs11_hcrypto_sha1(void); +const EVP_MD * hc_EVP_pkcs11_hcrypto_sha256(void); +const EVP_MD * hc_EVP_pkcs11_hcrypto_sha384(void); +const EVP_MD * hc_EVP_pkcs11_hcrypto_sha512(void); + +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_rc2_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_rc2_40_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_rc2_64_cbc(void); + +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_rc4(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_rc4_40(void); + +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_des_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_des_ede3_cbc(void); + +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_aes_128_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_aes_192_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_aes_256_cbc(void); + +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_aes_128_cfb8(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_aes_192_cfb8(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_aes_256_cfb8(void); + +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_camellia_128_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_camellia_192_cbc(void); +const EVP_CIPHER * hc_EVP_pkcs11_hcrypto_camellia_256_cbc(void); + +HC_CPP_END + +#endif /* HEIM_EVP_PKCS11_H */ diff --git a/crypto/heimdal/lib/hcrypto/evp-pkcs11.c b/crypto/heimdal/lib/hcrypto/evp-pkcs11.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-pkcs11.c @@ -0,0 +1,846 @@ +/* + * Copyright (c) 2015-2016, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* PKCS#11 provider */ + +#include +#include +#include +#ifdef HAVE_DLFCN_H +#include +#ifndef RTLD_LAZY +#define RTLD_LAZY 0 +#endif +#ifndef RTLD_LOCAL +#define RTLD_LOCAL 0 +#endif +#ifndef RTLD_GROUP +#define RTLD_GROUP 0 +#endif +#ifndef RTLD_NODELETE +#define RTLD_NODELETE 0 +#endif +#else +#error PKCS11 support requires dlfcn.h +#endif + +#include + +#include +#include +#include + +#include + +#if __sun && !defined(PKCS11_MODULE_PATH) +# ifdef _LP64 +# define PKCS11_MODULE_PATH "/usr/lib/64/libpkcs11.so" +# else +# define PKCS11_MODULE_PATH "/usr/lib/libpkcs11.so" +# endif +#elif defined(__linux__) +/* + * XXX We should have an autoconf check for OpenCryptoki and such + * things. However, there's no AC_CHECK_OBJECT(), and we'd have to + * write one. Today I'm feeling lazy. Another possibility would be to + * have a symlink from the libdir we'll install into, and then we could + * dlopen() that on all platforms. + * + * XXX Also, we should pick an appropriate shared object based on 32- vs + * 64-bits. + */ +# define PKCS11_MODULE_PATH "/usr/lib/pkcs11/PKCS11_API.so" +#endif + +static CK_FUNCTION_LIST_PTR p11_module; + +static int +p11_cleanup(EVP_CIPHER_CTX *ctx); + +struct pkcs11_cipher_ctx { + CK_SESSION_HANDLE hSession; + CK_OBJECT_HANDLE hSecret; +}; + +struct pkcs11_md_ctx { + CK_SESSION_HANDLE hSession; +}; + +static void *pkcs11_module_handle; + +static CK_RV +p11_module_load(CK_FUNCTION_LIST_PTR_PTR ppFunctionList) +{ + CK_RV rv; + CK_RV (*C_GetFunctionList_fn)(CK_FUNCTION_LIST_PTR_PTR); + + *ppFunctionList = NULL; + + if (!issuid()) { + char *pkcs11ModulePath = getenv("PKCS11_MODULE_PATH"); + if (pkcs11ModulePath != NULL) { + pkcs11_module_handle = + dlopen(pkcs11ModulePath, + RTLD_LAZY | RTLD_LOCAL | RTLD_GROUP | RTLD_NODELETE); + if (pkcs11_module_handle == NULL) + fprintf(stderr, "p11_module_load(%s): %s\n", pkcs11ModulePath, dlerror()); + } + } +#ifdef PKCS11_MODULE_PATH + if (pkcs11_module_handle == NULL) { + pkcs11_module_handle = + dlopen(PKCS11_MODULE_PATH, + RTLD_LAZY | RTLD_LOCAL | RTLD_GROUP | RTLD_NODELETE); + if (pkcs11_module_handle == NULL) + fprintf(stderr, "p11_module_load(%s): %s\n", PKCS11_MODULE_PATH, dlerror()); + } +#endif + if (pkcs11_module_handle == NULL) + return CKR_LIBRARY_LOAD_FAILED; + + C_GetFunctionList_fn = (CK_RV (*)(CK_FUNCTION_LIST_PTR_PTR)) + dlsym(pkcs11_module_handle, "C_GetFunctionList"); + if (C_GetFunctionList_fn == NULL) { + dlclose(pkcs11_module_handle); + return CKR_LIBRARY_LOAD_FAILED; + } + + rv = C_GetFunctionList_fn(ppFunctionList); + if (rv != CKR_OK) { + dlclose(pkcs11_module_handle); + return rv; + } + + return CKR_OK; +} + +static void +p11_module_load_once(void *context) +{ + p11_module_load((CK_FUNCTION_LIST_PTR_PTR)context); +} + +static CK_RV +p11_module_init(void) +{ + static heim_base_once_t once = HEIM_BASE_ONCE_INIT; + CK_RV rv; + + heim_base_once_f(&once, &p11_module, p11_module_load_once); + + if (p11_module == NULL) + return CKR_LIBRARY_LOAD_FAILED; + + /* + * Call C_Initialize() on every call, because it will be invalid after fork(). + * Caching the initialization status using a once control and invalidating it + * on fork provided no measurable performance benefit on Solaris 11. Other + * approaches would not be thread-safe or would involve more intrusive code + * changes, such as exposing heimbase's atomics. + */ + rv = p11_module->C_Initialize(NULL); + if (rv == CKR_CRYPTOKI_ALREADY_INITIALIZED) + rv = CKR_OK; + + return rv; +} + +static CK_RV +p11_session_init(CK_MECHANISM_TYPE mechanismType, + CK_SESSION_HANDLE_PTR phSession, + CK_FLAGS *pFlags) +{ + CK_RV rv; + CK_ULONG i, ulSlotCount = 0; + CK_SLOT_ID_PTR pSlotList = NULL; + CK_MECHANISM_INFO info; + + if (phSession != NULL) + *phSession = CK_INVALID_HANDLE; + + *pFlags = 0; + + rv = p11_module_init(); + if (rv != CKR_OK) + goto cleanup; + + assert(p11_module != NULL); + + rv = p11_module->C_GetSlotList(CK_FALSE, NULL, &ulSlotCount); + if (rv != CKR_OK) + goto cleanup; + + pSlotList = (CK_SLOT_ID_PTR)calloc(ulSlotCount, sizeof(CK_SLOT_ID)); + if (pSlotList == NULL) { + rv = CKR_HOST_MEMORY; + goto cleanup; + } + + rv = p11_module->C_GetSlotList(CK_FALSE, pSlotList, &ulSlotCount); + if (rv != CKR_OK) + goto cleanup; + + /* + * Note that this approach of using the first slot that supports the desired + * mechanism may not always be what the user wants (for example it may prefer + * software to hardware crypto). We're going to assume that this code will be + * principally used on Solaris (which has a meta-slot provider that sorts by + * hardware first) or in situations where the user can configure the slots in + * order of provider preference. In the future we should make this configurable. + */ + for (i = 0; i < ulSlotCount; i++) { + rv = p11_module->C_GetMechanismInfo(pSlotList[i], mechanismType, &info); + if (rv == CKR_OK) { + *pFlags = info.flags; + break; + } + } + + if (i == ulSlotCount) { + rv = CKR_MECHANISM_INVALID; + goto cleanup; + } + + if (phSession != NULL) { + rv = p11_module->C_OpenSession(pSlotList[i], CKF_SERIAL_SESSION, NULL, NULL, phSession); + if (rv != CKR_OK) + goto cleanup; + } + +cleanup: + free(pSlotList); + + return rv; +} + +static int +p11_mech_available_p(CK_MECHANISM_TYPE mechanismType, CK_FLAGS reqFlags) +{ + CK_RV rv; + CK_FLAGS flags; + + rv = p11_session_init(mechanismType, NULL, &flags); + if (rv != CKR_OK) + return 0; + + return (flags & reqFlags) == reqFlags; +} + +static CK_KEY_TYPE +p11_key_type_for_mech(CK_MECHANISM_TYPE mechanismType) +{ + CK_KEY_TYPE keyType = 0; + + switch (mechanismType) { + case CKM_RC2_CBC: + keyType = CKK_RC2; + break; + case CKM_RC4: + keyType = CKK_RC4; + break; + case CKM_DES_CBC: + keyType = CKK_DES; + break; + case CKM_DES3_CBC: + keyType = CKK_DES3; + break; + case CKM_AES_CBC: + case CKM_AES_CFB8: + keyType = CKK_AES; + break; + case CKM_CAMELLIA_CBC: + keyType = CKK_CAMELLIA; + break; + default: + assert(0 && "Unknown PKCS#11 mechanism type"); + break; + } + + return keyType; +} + +static int +p11_key_init(EVP_CIPHER_CTX *ctx, + const unsigned char *key, + const unsigned char *iv, + int encp) +{ + CK_RV rv; + CK_BBOOL bFalse = CK_FALSE; + CK_BBOOL bTrue = CK_TRUE; + CK_MECHANISM_TYPE mechanismType = (CK_MECHANISM_TYPE)ctx->cipher->app_data; + CK_KEY_TYPE keyType = p11_key_type_for_mech(mechanismType); + CK_OBJECT_CLASS objectClass = CKO_SECRET_KEY; + CK_ATTRIBUTE_TYPE op = encp ? CKA_ENCRYPT : CKA_DECRYPT; + CK_ATTRIBUTE attributes[] = { + { CKA_EXTRACTABLE, &bFalse, sizeof(bFalse) }, + { CKA_CLASS, &objectClass, sizeof(objectClass) }, + { CKA_KEY_TYPE, &keyType, sizeof(keyType) }, + { CKA_TOKEN, &bFalse, sizeof(bFalse) }, + { CKA_PRIVATE, &bFalse, sizeof(bFalse) }, + { CKA_SENSITIVE, &bTrue, sizeof(bTrue) }, + { CKA_VALUE, (void *)key, ctx->key_len }, + { op, &bTrue, sizeof(bTrue) } + }; + CK_MECHANISM mechanism = { + mechanismType, + ctx->cipher->iv_len ? ctx->iv : NULL, + ctx->cipher->iv_len + }; + struct pkcs11_cipher_ctx *p11ctx = (struct pkcs11_cipher_ctx *)ctx->cipher_data; + CK_FLAGS flags; + + rv = CKR_OK; + + if (p11ctx->hSession != CK_INVALID_HANDLE && key != NULL) + p11_cleanup(ctx); /* refresh session with new key */ + + if (p11ctx->hSession == CK_INVALID_HANDLE) { + rv = p11_session_init(mechanismType, &p11ctx->hSession, &flags); + if (rv != CKR_OK) + goto cleanup; + + if ((flags & (CKF_ENCRYPT|CKF_DECRYPT)) != (CKF_ENCRYPT|CKF_DECRYPT)) { + rv = CKR_MECHANISM_INVALID; + goto cleanup; + } + } + + if (key != NULL) { + assert(p11_module != NULL); + assert(p11ctx->hSecret == CK_INVALID_HANDLE); + + rv = p11_module->C_CreateObject(p11ctx->hSession, attributes, + sizeof(attributes) / sizeof(attributes[0]), + &p11ctx->hSecret); + if (rv != CKR_OK) + goto cleanup; + } + + if (p11ctx->hSecret != CK_INVALID_HANDLE) { + if (op == CKA_ENCRYPT) + rv = p11_module->C_EncryptInit(p11ctx->hSession, &mechanism, p11ctx->hSecret); + else + rv = p11_module->C_DecryptInit(p11ctx->hSession, &mechanism, p11ctx->hSecret); + if (rv != CKR_OK) + goto cleanup; + } + +cleanup: + if (rv != CKR_OK) + p11_cleanup(ctx); + + return rv == CKR_OK; +} + +static int +p11_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + struct pkcs11_cipher_ctx *p11ctx = (struct pkcs11_cipher_ctx *)ctx->cipher_data; + CK_RV rv; + CK_ULONG ulCipherTextLen = size; + + assert(p11_module != NULL); + assert(EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_STREAM_CIPHER || + (size % ctx->cipher->block_size) == 0); + + if (ctx->encrypt) + rv = p11_module->C_EncryptUpdate(p11ctx->hSession, (unsigned char *)in, size, out, &ulCipherTextLen); + else + rv = p11_module->C_DecryptUpdate(p11ctx->hSession, (unsigned char *)in, size, out, &ulCipherTextLen); + + return rv == CKR_OK; +} + +static int +p11_cleanup(EVP_CIPHER_CTX *ctx) +{ + struct pkcs11_cipher_ctx *p11ctx = (struct pkcs11_cipher_ctx *)ctx->cipher_data; + + if (p11ctx->hSecret != CK_INVALID_HANDLE) { + p11_module->C_DestroyObject(p11ctx->hSession, p11ctx->hSecret); + p11ctx->hSecret = CK_INVALID_HANDLE; + } + if (p11ctx->hSession != CK_INVALID_HANDLE) { + p11_module->C_CloseSession(p11ctx->hSession); + p11ctx->hSession = CK_INVALID_HANDLE; + } + + return 1; +} + +static int +p11_md_cleanup(EVP_MD_CTX *ctx); + +static int +p11_md_hash_init(CK_MECHANISM_TYPE mechanismType, EVP_MD_CTX *ctx) +{ + struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx; + CK_RV rv; + CK_FLAGS flags; + CK_MECHANISM mechanism = { mechanismType, NULL, 0 }; + + if (p11ctx->hSession != CK_INVALID_HANDLE) + p11_md_cleanup(ctx); + + rv = p11_session_init(mechanismType, &p11ctx->hSession, &flags); + if (rv != CKR_OK) + goto cleanup; + + if ((flags & CKF_DIGEST) != CKF_DIGEST) { + rv = CKR_MECHANISM_INVALID; + goto cleanup; + } + + assert(p11_module != NULL); + + rv = p11_module->C_DigestInit(p11ctx->hSession, &mechanism); + + cleanup: + return rv == CKR_OK; +} + +static int +p11_md_update(EVP_MD_CTX *ctx, const void *data, size_t length) +{ + struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx; + CK_RV rv; + + assert(p11_module != NULL); + assert(data != NULL || length == 0); + + rv = p11_module->C_DigestUpdate(p11ctx->hSession, + data ? (CK_BYTE_PTR)data : (CK_BYTE_PTR)"", + length); + + return rv == CKR_OK; +} + +static int +p11_md_final(void *digest, EVP_MD_CTX *ctx) +{ + struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx; + CK_RV rv; + CK_ULONG digestLen = 0; + + assert(p11_module != NULL); + + rv = p11_module->C_DigestFinal(p11ctx->hSession, NULL, &digestLen); + if (rv == CKR_OK) + rv = p11_module->C_DigestFinal(p11ctx->hSession, digest, &digestLen); + + return rv == CKR_OK; +} + +static int +p11_md_cleanup(EVP_MD_CTX *ctx) +{ + struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx; + CK_RV rv; + + assert(p11_module != NULL); + + rv = p11_module->C_CloseSession(p11ctx->hSession); + if (rv == CKR_OK) + p11ctx->hSession = CK_INVALID_HANDLE; + + return rv == CKR_OK; +} + +#define PKCS11_CIPHER_ALGORITHM(name, mechanismType, block_size, \ + key_len, iv_len, flags) \ + \ + static EVP_CIPHER \ + pkcs11_##name = { \ + 0, \ + block_size, \ + key_len, \ + iv_len, \ + (flags) | EVP_CIPH_ALWAYS_CALL_INIT, \ + p11_key_init, \ + p11_do_cipher, \ + p11_cleanup, \ + sizeof(struct pkcs11_cipher_ctx), \ + NULL, \ + NULL, \ + NULL, \ + (void *)mechanismType \ + }; \ + \ + const EVP_CIPHER * \ + hc_EVP_pkcs11_##name(void) \ + { \ + if (p11_mech_available_p(mechanismType, CKF_ENCRYPT|CKF_DECRYPT)) \ + return &pkcs11_##name; \ + else \ + return NULL; \ + } \ + \ + static void \ + pkcs11_hcrypto_##name##_init_once(void *context) \ + { \ + const EVP_CIPHER *cipher; \ + \ + cipher = hc_EVP_pkcs11_ ##name(); \ + if (cipher == NULL && HCRYPTO_FALLBACK) \ + cipher = hc_EVP_hcrypto_ ##name(); \ + \ + *((const EVP_CIPHER **)context) = cipher; \ + } \ + \ + const EVP_CIPHER * \ + hc_EVP_pkcs11_hcrypto_##name(void) \ + { \ + static const EVP_CIPHER *__cipher; \ + static heim_base_once_t __init = HEIM_BASE_ONCE_INIT; \ + \ + heim_base_once_f(&__init, &__cipher, \ + pkcs11_hcrypto_##name##_init_once); \ + \ + return __cipher; \ + } + +#define PKCS11_MD_ALGORITHM(name, mechanismType, hash_size, block_size) \ + \ + static int p11_##name##_init(EVP_MD_CTX *ctx) \ + { \ + return p11_md_hash_init(mechanismType, ctx); \ + } \ + \ + const EVP_MD * \ + hc_EVP_pkcs11_##name(void) \ + { \ + static struct hc_evp_md name = { \ + hash_size, \ + block_size, \ + sizeof(struct pkcs11_md_ctx), \ + p11_##name##_init, \ + p11_md_update, \ + p11_md_final, \ + p11_md_cleanup \ + }; \ + \ + if (p11_mech_available_p(mechanismType, CKF_DIGEST)) \ + return &name; \ + else \ + return NULL; \ + } \ + \ + static void \ + pkcs11_hcrypto_##name##_init_once(void *context) \ + { \ + const EVP_MD *md; \ + \ + md = hc_EVP_pkcs11_ ##name(); \ + if (md == NULL && HCRYPTO_FALLBACK) \ + md = hc_EVP_hcrypto_ ##name(); \ + \ + *((const EVP_MD **)context) = md; \ + } \ + \ + const EVP_MD * \ + hc_EVP_pkcs11_hcrypto_##name(void) \ + { \ + static const EVP_MD *__md; \ + static heim_base_once_t __init = HEIM_BASE_ONCE_INIT; \ + \ + heim_base_once_f(&__init, &__md, \ + pkcs11_hcrypto_##name##_init_once); \ + \ + return __md; \ + } + +#define PKCS11_MD_ALGORITHM_UNAVAILABLE(name) \ + \ + const EVP_MD * \ + hc_EVP_pkcs11_##name(void) \ + { \ + return NULL; \ + } \ + \ + const EVP_MD * \ + hc_EVP_pkcs11_hcrypto_##name(void) \ + { \ + return hc_EVP_hcrypto_ ##name(); \ + } + +/** + * The triple DES cipher type (PKCS#11 provider) + * + * @return the DES-EDE3-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(des_ede3_cbc, + CKM_DES3_CBC, + 8, + 24, + 8, + EVP_CIPH_CBC_MODE) + +/** + * The DES cipher type (PKCS#11 provider) + * + * @return the DES-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(des_cbc, + CKM_DES_CBC, + 8, + 8, + 8, + EVP_CIPH_CBC_MODE) + +/** + * The AES-128 cipher type (PKCS#11 provider) + * + * @return the AES-128-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(aes_128_cbc, + CKM_AES_CBC, + 16, + 16, + 16, + EVP_CIPH_CBC_MODE) + +/** + * The AES-192 cipher type (PKCS#11 provider) + * + * @return the AES-192-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(aes_192_cbc, + CKM_AES_CBC, + 16, + 24, + 16, + EVP_CIPH_CBC_MODE) + +/** + * The AES-256 cipher type (PKCS#11 provider) + * + * @return the AES-256-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(aes_256_cbc, + CKM_AES_CBC, + 16, + 32, + 16, + EVP_CIPH_CBC_MODE) + +/** + * The AES-128 CFB8 cipher type (PKCS#11 provider) + * + * @return the AES-128-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(aes_128_cfb8, + CKM_AES_CFB8, + 16, + 16, + 16, + EVP_CIPH_CFB8_MODE) + +/** + * The AES-192 CFB8 cipher type (PKCS#11 provider) + * + * @return the AES-192-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(aes_192_cfb8, + CKM_AES_CFB8, + 16, + 24, + 16, + EVP_CIPH_CFB8_MODE) + +/** + * The AES-256 CFB8 cipher type (PKCS#11 provider) + * + * @return the AES-256-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(aes_256_cfb8, + CKM_AES_CFB8, + 16, + 32, + 16, + EVP_CIPH_CFB8_MODE) + +/** + * The RC2 cipher type - PKCS#11 + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(rc2_cbc, + CKM_RC2_CBC, + 8, + 16, + 8, + EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH) + +/** + * The RC2-40 cipher type - PKCS#11 + * + * @return the RC2-40 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(rc2_40_cbc, + CKM_RC2_CBC, + 8, + 5, + 8, + EVP_CIPH_CBC_MODE) + +/** + * The RC2-64 cipher type - PKCS#11 + * + * @return the RC2-64 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(rc2_64_cbc, + CKM_RC2_CBC, + 8, + 8, + 8, + EVP_CIPH_CBC_MODE) + +/** + * The Camellia-128 cipher type - PKCS#11 + * + * @return the Camellia-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(camellia_128_cbc, + CKM_CAMELLIA_CBC, + 16, + 16, + 16, + EVP_CIPH_CBC_MODE) + +/** + * The Camellia-198 cipher type - PKCS#11 + * + * @return the Camellia-198 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(camellia_192_cbc, + CKM_CAMELLIA_CBC, + 16, + 24, + 16, + EVP_CIPH_CBC_MODE) + +/** + * The Camellia-256 cipher type - PKCS#11 + * + * @return the Camellia-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(camellia_256_cbc, + CKM_CAMELLIA_CBC, + 16, + 32, + 16, + EVP_CIPH_CBC_MODE) + +/** + * The RC4 cipher type (PKCS#11 provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(rc4, + CKM_RC4, + 1, + 16, + 0, + EVP_CIPH_STREAM_CIPHER | EVP_CIPH_VARIABLE_LENGTH) + +/** + * The RC4-40 cipher type (PKCS#11 provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +PKCS11_CIPHER_ALGORITHM(rc4_40, + CKM_RC4, + 1, + 5, + 0, + EVP_CIPH_STREAM_CIPHER | EVP_CIPH_VARIABLE_LENGTH) + +#ifdef CKM_MD4 /* non-standard extension */ +PKCS11_MD_ALGORITHM(md4, CKM_MD4, 16, 64) +#else +PKCS11_MD_ALGORITHM_UNAVAILABLE(md4) +#endif +PKCS11_MD_ALGORITHM(md5, CKM_MD5, 16, 64) +PKCS11_MD_ALGORITHM(sha1, CKM_SHA_1, 20, 64) +PKCS11_MD_ALGORITHM(sha256, CKM_SHA256, 32, 64) +PKCS11_MD_ALGORITHM(sha384, CKM_SHA384, 48, 128) +PKCS11_MD_ALGORITHM(sha512, CKM_SHA512, 64, 128) diff --git a/crypto/heimdal/lib/hcrypto/evp-w32.h b/crypto/heimdal/lib/hcrypto/evp-w32.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-w32.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2015, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_EVP_W32_H +#define HEIM_EVP_W32_H 1 + +/* symbol renaming */ +#define EVP_w32crypto_md4() hc_EVP_w32crypto_md4() +#define EVP_w32crypto_md5() hc_EVP_w32crypto_md5() +#define EVP_w32crypto_sha1() hc_EVP_w32crypto_sha1() +#define EVP_w32crypto_sha256() hc_EVP_w32crypto_sha256() +#define EVP_w32crypto_sha384() hc_EVP_w32crypto_sha384() +#define EVP_w32crypto_sha512() hc_EVP_w32crypto_sha512() +#define EVP_w32crypto_des_cbc() hc_EVP_w32crypto_des_cbc() +#define EVP_w32crypto_des_ede3_cbc() hc_EVP_w32crypto_des_ede3_cbc() +#define EVP_w32crypto_aes_128_cbc() hc_EVP_w32crypto_aes_128_cbc() +#define EVP_w32crypto_aes_192_cbc() hc_EVP_w32crypto_aes_192_cbc() +#define EVP_w32crypto_aes_256_cbc() hc_EVP_w32crypto_aes_256_cbc() +#define EVP_w32crypto_aes_128_cfb8() hc_EVP_w32crypto_aes_128_cfb8() +#define EVP_w32crypto_aes_192_cfb8() hc_EVP_w32crypto_aes_192_cfb8() +#define EVP_w32crypto_aes_256_cfb8() hc_EVP_w32crypto_aes_256_cfb8() +#define EVP_w32crypto_rc4() hc_EVP_w32crypto_rc4() +#define EVP_w32crypto_rc4_40() hc_EVP_w32crypto_rc4_40() +#define EVP_w32crypto_rc2_40_cbc() hc_EVP_w32crypto_rc2_40_cbc() +#define EVP_w32crypto_rc2_64_cbc() hc_EVP_w32crypto_rc2_64_cbc() +#define EVP_w32crypto_rc2_cbc() hc_EVP_w32crypto_rc2_cbc() +#define EVP_w32crypto_camellia_128_cbc() hc_EVP_w32crypto_camellia_128_cbc() +#define EVP_w32crypto_camellia_192_cbc() hc_EVP_w32crypto_camellia_192_cbc() +#define EVP_w32crypto_camellia_256_cbc() hc_EVP_w32crypto_camellia_256_cbc() + +/* + * This provider dynamically selects between Windows CNG (if running + * on Vista or above) or the inbuilt provider (if running on XP). + */ + +HC_CPP_BEGIN + +const EVP_MD * hc_EVP_w32crypto_md4(void); +const EVP_MD * hc_EVP_w32crypto_md5(void); +const EVP_MD * hc_EVP_w32crypto_sha1(void); +const EVP_MD * hc_EVP_w32crypto_sha256(void); +const EVP_MD * hc_EVP_w32crypto_sha384(void); +const EVP_MD * hc_EVP_w32crypto_sha512(void); + +const EVP_CIPHER * hc_EVP_w32crypto_des_cbc(void); +const EVP_CIPHER * hc_EVP_w32crypto_des_ede3_cbc(void); + +const EVP_CIPHER * hc_EVP_w32crypto_aes_128_cbc(void); +const EVP_CIPHER * hc_EVP_w32crypto_aes_192_cbc(void); +const EVP_CIPHER * hc_EVP_w32crypto_aes_256_cbc(void); + +const EVP_CIPHER * hc_EVP_w32crypto_aes_128_cfb8(void); +const EVP_CIPHER * hc_EVP_w32crypto_aes_192_cfb8(void); +const EVP_CIPHER * hc_EVP_w32crypto_aes_256_cfb8(void); + +const EVP_CIPHER * hc_EVP_w32crypto_rc4(void); +const EVP_CIPHER * hc_EVP_w32crypto_rc4_40(void); + +const EVP_CIPHER * hc_EVP_w32crypto_rc2_cbc(void); +const EVP_CIPHER * hc_EVP_w32crypto_rc2_40_cbc(void); +const EVP_CIPHER * hc_EVP_w32crypto_rc2_64_cbc(void); + +const EVP_CIPHER * hc_EVP_w32crypto_camellia_128_cbc(void); +const EVP_CIPHER * hc_EVP_w32crypto_camellia_192_cbc(void); +const EVP_CIPHER * hc_EVP_w32crypto_camellia_256_cbc(void); + +HC_CPP_END + +#endif /* HEIM_EVP_W32_H */ diff --git a/crypto/heimdal/lib/hcrypto/evp-w32.c b/crypto/heimdal/lib/hcrypto/evp-w32.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-w32.c @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2015, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Windows fallback provider: decides whether to use hcrypto or + * wincng depending on whether bcrypt.dll is available (i.e. it + * is runtime compatible back to XP, but will use the native + * crypto APIs from Vista onwards). + */ + +#include +#include + +#include + +#include +#include +#include + +#include + +static LONG wincng_available = -1; + +static __inline int +wincng_check_availability(void) +{ + if (wincng_available == -1) { + char szBCryptDllPath[MAX_PATH]; + UINT cbBCryptDllPath; + + cbBCryptDllPath = GetSystemDirectory(szBCryptDllPath, + sizeof(szBCryptDllPath)); + if (cbBCryptDllPath > 0 && + cbBCryptDllPath < sizeof(szBCryptDllPath) && + strncat_s(szBCryptDllPath, + sizeof(szBCryptDllPath), "\\bcrypt.dll", 11) == 0) { + HANDLE hBCryptDll = LoadLibrary(szBCryptDllPath); + + InterlockedCompareExchangeRelease(&wincng_available, + !!hBCryptDll, -1); + if (hBCryptDll) + FreeLibrary(hBCryptDll); + } + } + + return wincng_available == 1; +} + +BOOL WINAPI +_hc_w32crypto_DllMain(HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_DETACH) { + /* + * Don't bother cleaning up on process exit, only on + * FreeLibrary() (in which case lpvReserved will be NULL). + */ + if (lpvReserved == NULL) + _hc_wincng_cleanup(); + } + + return TRUE; +} + +#define EVP_W32CRYPTO_PROVIDER(type, name) \ + \ + const type *hc_EVP_w32crypto_ ##name (void) \ + { \ + if (wincng_check_availability()) \ + return hc_EVP_wincng_ ##name (); \ + else if (HCRYPTO_FALLBACK) \ + return hc_EVP_hcrypto_ ##name (); \ + else \ + return NULL; \ + } + +#define EVP_W32CRYPTO_PROVIDER_CNG_UNAVAILABLE(type, name) \ + \ + const type *hc_EVP_w32crypto_ ##name (void) \ + { \ + return hc_EVP_hcrypto_ ##name (); \ + } + +EVP_W32CRYPTO_PROVIDER(EVP_MD, md4) +EVP_W32CRYPTO_PROVIDER(EVP_MD, md5) +EVP_W32CRYPTO_PROVIDER(EVP_MD, sha1) +EVP_W32CRYPTO_PROVIDER(EVP_MD, sha256) +EVP_W32CRYPTO_PROVIDER(EVP_MD, sha384) +EVP_W32CRYPTO_PROVIDER(EVP_MD, sha512) + +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, rc2_cbc) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, rc2_40_cbc) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, rc2_64_cbc) + +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, rc4) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, rc4_40) + +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, des_cbc) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, des_ede3_cbc) + +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, aes_128_cbc) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, aes_192_cbc) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, aes_256_cbc) + +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, aes_128_cfb8) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, aes_192_cfb8) +EVP_W32CRYPTO_PROVIDER(EVP_CIPHER, aes_256_cfb8) + +EVP_W32CRYPTO_PROVIDER_CNG_UNAVAILABLE(EVP_CIPHER, camellia_128_cbc) +EVP_W32CRYPTO_PROVIDER_CNG_UNAVAILABLE(EVP_CIPHER, camellia_192_cbc) +EVP_W32CRYPTO_PROVIDER_CNG_UNAVAILABLE(EVP_CIPHER, camellia_256_cbc) diff --git a/crypto/heimdal/lib/hcrypto/evp-wincng.h b/crypto/heimdal/lib/hcrypto/evp-wincng.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-wincng.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2015, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_EVP_WINCNG_H +#define HEIM_EVP_WINCNG_H 1 + +/* symbol renaming */ +#define EVP_wincng_md4() EVP_wincng_md4() +#define EVP_wincng_md5() EVP_wincng_md5() +#define EVP_wincng_sha1() EVP_wincng_sha1() +#define EVP_wincng_sha256() EVP_wincng_sha256() +#define EVP_wincng_sha384() EVP_wincng_sha384() +#define EVP_wincng_sha512() EVP_wincng_sha512() +#define EVP_wincng_des_cbc() EVP_wincng_des_cbc() +#define EVP_wincng_des_ede3_cbc() EVP_wincng_des_ede3_cbc() +#define EVP_wincng_aes_128_cbc() EVP_wincng_aes_128_cbc() +#define EVP_wincng_aes_192_cbc() EVP_wincng_aes_192_cbc() +#define EVP_wincng_aes_256_cbc() EVP_wincng_aes_256_cbc() +#define EVP_wincng_aes_128_cfb8() EVP_wincng_aes_128_cfb8() +#define EVP_wincng_aes_192_cfb8() EVP_wincng_aes_192_cfb8() +#define EVP_wincng_aes_256_cfb8() EVP_wincng_aes_256_cfb8() +#define EVP_wincng_rc4() EVP_wincng_rc4() +#define EVP_wincng_rc4_40() EVP_wincng_rc4_40() +#define EVP_wincng_rc2_40_cbc() EVP_wincng_rc2_40_cbc() +#define EVP_wincng_rc2_64_cbc() EVP_wincng_rc2_64_cbc() +#define EVP_wincng_rc2_cbc() EVP_wincng_rc2_cbc() +#define EVP_wincng_camellia_128_cbc() EVP_wincng_camellia_128_cbc() +#define EVP_wincng_camellia_192_cbc() EVP_wincng_camellia_192_cbc() +#define EVP_wincng_camellia_256_cbc() EVP_wincng_camellia_256_cbc() + +/* + * + */ + +HC_CPP_BEGIN + +const EVP_MD * hc_EVP_wincng_md4(void); +const EVP_MD * hc_EVP_wincng_md5(void); +const EVP_MD * hc_EVP_wincng_sha1(void); +const EVP_MD * hc_EVP_wincng_sha256(void); +const EVP_MD * hc_EVP_wincng_sha384(void); +const EVP_MD * hc_EVP_wincng_sha512(void); + +const EVP_CIPHER * hc_EVP_wincng_rc2_cbc(void); +const EVP_CIPHER * hc_EVP_wincng_rc2_40_cbc(void); +const EVP_CIPHER * hc_EVP_wincng_rc2_64_cbc(void); + +const EVP_CIPHER * hc_EVP_wincng_rc4(void); +const EVP_CIPHER * hc_EVP_wincng_rc4_40(void); + +const EVP_CIPHER * hc_EVP_wincng_des_cbc(void); +const EVP_CIPHER * hc_EVP_wincng_des_ede3_cbc(void); + +const EVP_CIPHER * hc_EVP_wincng_aes_128_cbc(void); +const EVP_CIPHER * hc_EVP_wincng_aes_192_cbc(void); +const EVP_CIPHER * hc_EVP_wincng_aes_256_cbc(void); + +const EVP_CIPHER * hc_EVP_wincng_aes_128_cfb8(void); +const EVP_CIPHER * hc_EVP_wincng_aes_192_cfb8(void); +const EVP_CIPHER * hc_EVP_wincng_aes_256_cfb8(void); + +void _hc_wincng_cleanup(void); + +HC_CPP_END + +#endif /* HEIM_EVP_WINCNG_H */ diff --git a/crypto/heimdal/lib/hcrypto/evp-wincng.c b/crypto/heimdal/lib/hcrypto/evp-wincng.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp-wincng.c @@ -0,0 +1,713 @@ +/* + * Copyright (c) 2015, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* Windows CNG provider */ + +#include +#include +#include + +#include +#include + +#include + +/* + * CNG cipher provider + */ + +struct wincng_key { + BCRYPT_KEY_HANDLE hKey; + UCHAR rgbKeyObject[1]; +}; + +#define WINCNG_KEY_OBJECT_SIZE(ctx) \ + ((ctx)->cipher->ctx_size - sizeof(struct wincng_key) + 1) + +static int +wincng_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + struct wincng_key *cng = ctx->cipher_data; + NTSTATUS status; + ULONG cbResult; + + assert(EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_STREAM_CIPHER || + (size % ctx->cipher->block_size) == 0); + + if (ctx->encrypt) { + status = BCryptEncrypt(cng->hKey, + (PUCHAR)in, + size, + NULL, /* pPaddingInfo */ + ctx->cipher->iv_len ? ctx->iv : NULL, + ctx->cipher->iv_len, + out, + size, + &cbResult, + 0); + } else { + status = BCryptDecrypt(cng->hKey, + (PUCHAR)in, + size, + NULL, /* pPaddingInfo */ + ctx->cipher->iv_len ? ctx->iv : NULL, + ctx->cipher->iv_len, + out, + size, + &cbResult, + 0); + } + + return BCRYPT_SUCCESS(status) && cbResult == size; +} + +static int +wincng_cleanup(EVP_CIPHER_CTX *ctx) +{ + struct wincng_key *cng = ctx->cipher_data; + + if (cng->hKey) + BCryptDestroyKey(cng->hKey); + SecureZeroMemory(cng->rgbKeyObject, WINCNG_KEY_OBJECT_SIZE(ctx)); + + return 1; +} + +static int +wincng_cipher_algorithm_init(EVP_CIPHER *cipher, + LPWSTR pszAlgId) +{ + BCRYPT_ALG_HANDLE hAlgorithm = NULL; + NTSTATUS status; + LPCWSTR pszChainingMode; + ULONG cbKeyObject, cbChainingMode, cbData; + + if (cipher->app_data) + return 1; + + status = BCryptOpenAlgorithmProvider(&hAlgorithm, + pszAlgId, + NULL, + 0); + if (!BCRYPT_SUCCESS(status)) + return 0; + + status = BCryptGetProperty(hAlgorithm, + BCRYPT_OBJECT_LENGTH, + (PUCHAR)&cbKeyObject, + sizeof(ULONG), + &cbData, + 0); + if (!BCRYPT_SUCCESS(status)) { + BCryptCloseAlgorithmProvider(hAlgorithm, 0); + return 0; + } + + cipher->ctx_size = sizeof(struct wincng_key) + cbKeyObject - 1; + + switch (cipher->flags & EVP_CIPH_MODE) { + case EVP_CIPH_CBC_MODE: + pszChainingMode = BCRYPT_CHAIN_MODE_CBC; + cbChainingMode = sizeof(BCRYPT_CHAIN_MODE_CBC); + break; + case EVP_CIPH_CFB8_MODE: + pszChainingMode = BCRYPT_CHAIN_MODE_CFB; + cbChainingMode = sizeof(BCRYPT_CHAIN_MODE_CFB); + break; + default: + pszChainingMode = NULL; + cbChainingMode = 0; + break; + } + + if (cbChainingMode) { + status = BCryptSetProperty(hAlgorithm, + BCRYPT_CHAINING_MODE, + (PUCHAR)pszChainingMode, + cbChainingMode, + 0); + if (!BCRYPT_SUCCESS(status)) { + BCryptCloseAlgorithmProvider(hAlgorithm, 0); + return 0; + } + } + + if (wcscmp(pszAlgId, BCRYPT_RC2_ALGORITHM) == 0) { + ULONG cbEffectiveKeyLength = EVP_CIPHER_key_length(cipher) * 8; + + status = BCryptSetProperty(hAlgorithm, + BCRYPT_EFFECTIVE_KEY_LENGTH, + (PUCHAR)&cbEffectiveKeyLength, + sizeof(cbEffectiveKeyLength), + 0); + if (!BCRYPT_SUCCESS(status)) { + BCryptCloseAlgorithmProvider(hAlgorithm, 0); + return 0; + } + } + + InterlockedCompareExchangePointerRelease(&cipher->app_data, + hAlgorithm, NULL); + return 1; +} + +static int +wincng_key_init(EVP_CIPHER_CTX *ctx, + const unsigned char *key, + const unsigned char *iv, + int encp) +{ + struct wincng_key *cng = ctx->cipher_data; + NTSTATUS status; + + assert(cng != NULL); + assert(ctx->cipher != NULL); + + if (ctx->cipher->app_data == NULL) + return 0; + + if (cng->hKey) { + BCryptDestroyKey(cng->hKey); /* allow reinitialization */ + cng->hKey = (BCRYPT_KEY_HANDLE)0; + } + + /* + * Note: ctx->key_len not EVP_CIPHER_CTX_key_length() for + * variable length key support. + */ + status = BCryptGenerateSymmetricKey(ctx->cipher->app_data, + &cng->hKey, + cng->rgbKeyObject, + WINCNG_KEY_OBJECT_SIZE(ctx), + (PUCHAR)key, + ctx->key_len, + 0); + + return BCRYPT_SUCCESS(status); +} + +#define WINCNG_CIPHER_ALGORITHM(name, alg_id, block_size, key_len, \ + iv_len, flags) \ + \ + static EVP_CIPHER \ + wincng_##name = { \ + 0, \ + block_size, \ + key_len, \ + iv_len, \ + flags, \ + wincng_key_init, \ + wincng_do_cipher, \ + wincng_cleanup, \ + 0, \ + NULL, \ + NULL, \ + NULL, \ + NULL \ + }; \ + \ + const EVP_CIPHER * \ + hc_EVP_wincng_##name(void) \ + { \ + wincng_cipher_algorithm_init(&wincng_##name, alg_id); \ + return wincng_##name.app_data ? &wincng_##name : NULL; \ + } + +#define WINCNG_CIPHER_ALGORITHM_CLEANUP(name) do { \ + if (wincng_##name.app_data) { \ + BCryptCloseAlgorithmProvider(wincng_##name.app_data, 0); \ + wincng_##name.app_data = NULL; \ + } \ + } while (0) + +#define WINCNG_CIPHER_ALGORITHM_UNAVAILABLE(name) \ + \ + const EVP_CIPHER * \ + hc_EVP_wincng_##name(void) \ + { \ + return NULL; \ + } + +/** + * The triple DES cipher type (Windows CNG provider) + * + * @return the DES-EDE3-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(des_ede3_cbc, + BCRYPT_3DES_ALGORITHM, + 8, + 24, + 8, + EVP_CIPH_CBC_MODE); + +/** + * The DES cipher type (Windows CNG provider) + * + * @return the DES-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(des_cbc, + BCRYPT_DES_ALGORITHM, + 8, + 8, + 8, + EVP_CIPH_CBC_MODE); + +/** + * The AES-128 cipher type (Windows CNG provider) + * + * @return the AES-128-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(aes_128_cbc, + BCRYPT_AES_ALGORITHM, + 16, + 16, + 16, + EVP_CIPH_CBC_MODE); + +/** + * The AES-192 cipher type (Windows CNG provider) + * + * @return the AES-192-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(aes_192_cbc, + BCRYPT_AES_ALGORITHM, + 16, + 24, + 16, + EVP_CIPH_CBC_MODE); + +/** + * The AES-256 cipher type (Windows CNG provider) + * + * @return the AES-256-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(aes_256_cbc, + BCRYPT_AES_ALGORITHM, + 16, + 32, + 16, + EVP_CIPH_CBC_MODE); + +/** + * The AES-128 CFB8 cipher type (Windows CNG provider) + * + * @return the AES-128-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(aes_128_cfb8, + BCRYPT_AES_ALGORITHM, + 16, + 16, + 16, + EVP_CIPH_CFB8_MODE); + +/** + * The AES-192 CFB8 cipher type (Windows CNG provider) + * + * @return the AES-192-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(aes_192_cfb8, + BCRYPT_AES_ALGORITHM, + 16, + 24, + 16, + EVP_CIPH_CFB8_MODE); + +/** + * The AES-256 CFB8 cipher type (Windows CNG provider) + * + * @return the AES-256-CFB8 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(aes_256_cfb8, + BCRYPT_AES_ALGORITHM, + 16, + 32, + 16, + EVP_CIPH_CFB8_MODE); + +/** + * The RC2 cipher type - Windows CNG + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(rc2_cbc, + BCRYPT_RC2_ALGORITHM, + 8, + 16, + 8, + EVP_CIPH_CBC_MODE); + +/** + * The RC2-40 cipher type - Windows CNG + * + * @return the RC2-40 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(rc2_40_cbc, + BCRYPT_RC2_ALGORITHM, + 8, + 5, + 8, + EVP_CIPH_CBC_MODE); + +/** + * The RC2-64 cipher type - Windows CNG + * + * @return the RC2-64 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(rc2_64_cbc, + BCRYPT_RC2_ALGORITHM, + 8, + 8, + 8, + EVP_CIPH_CBC_MODE); + +/** + * The Camellia-128 cipher type - CommonCrypto + * + * @return the Camellia-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM_UNAVAILABLE(camellia_128_cbc); + +/** + * The Camellia-198 cipher type - CommonCrypto + * + * @return the Camellia-198 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM_UNAVAILABLE(camellia_192_cbc); + +/** + * The Camellia-256 cipher type - CommonCrypto + * + * @return the Camellia-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM_UNAVAILABLE(camellia_256_cbc); + +/** + * The RC4 cipher type (Windows CNG provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(rc4, + BCRYPT_RC4_ALGORITHM, + 1, + 16, + 0, + EVP_CIPH_STREAM_CIPHER | EVP_CIPH_VARIABLE_LENGTH); + +/** + * The RC4-40 cipher type (Windows CNG provider) + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +WINCNG_CIPHER_ALGORITHM(rc4_40, + BCRYPT_RC4_ALGORITHM, + 1, + 5, + 0, + EVP_CIPH_STREAM_CIPHER | EVP_CIPH_VARIABLE_LENGTH); + +static void +wincng_cipher_algorithm_cleanup(void) +{ + WINCNG_CIPHER_ALGORITHM_CLEANUP(des_ede3_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(des_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(aes_128_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(aes_192_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(aes_256_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(aes_128_cfb8); + WINCNG_CIPHER_ALGORITHM_CLEANUP(aes_192_cfb8); + WINCNG_CIPHER_ALGORITHM_CLEANUP(aes_256_cfb8); + WINCNG_CIPHER_ALGORITHM_CLEANUP(rc2_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(rc2_40_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(rc2_64_cbc); + WINCNG_CIPHER_ALGORITHM_CLEANUP(rc4); + WINCNG_CIPHER_ALGORITHM_CLEANUP(rc4_40); +} + +/* + * CNG digest provider + */ + +struct wincng_md_ctx { + BCRYPT_HASH_HANDLE hHash; + ULONG cbHashObject; + UCHAR rgbHashObject[1]; +}; + +static BCRYPT_ALG_HANDLE +wincng_md_algorithm_init(EVP_MD *md, + LPCWSTR pszAlgId) +{ + BCRYPT_ALG_HANDLE hAlgorithm; + NTSTATUS status; + ULONG cbHashObject, cbData; + ULONG cbHash = 0, cbBlock = 0; + + status = BCryptOpenAlgorithmProvider(&hAlgorithm, + pszAlgId, + NULL, + 0); + if (!BCRYPT_SUCCESS(status)) + return NULL; + + status = BCryptGetProperty(hAlgorithm, + BCRYPT_HASH_LENGTH, + (PUCHAR)&cbHash, + sizeof(ULONG), + &cbData, + 0); + if (!BCRYPT_SUCCESS(status)) { + BCryptCloseAlgorithmProvider(hAlgorithm, 0); + return NULL; + } + + status = BCryptGetProperty(hAlgorithm, + BCRYPT_HASH_BLOCK_LENGTH, + (PUCHAR)&cbBlock, + sizeof(ULONG), + &cbData, + 0); + if (!BCRYPT_SUCCESS(status)) { + BCryptCloseAlgorithmProvider(hAlgorithm, 0); + return NULL; + } + + status = BCryptGetProperty(hAlgorithm, + BCRYPT_OBJECT_LENGTH, + (PUCHAR)&cbHashObject, + sizeof(ULONG), + &cbData, + 0); + if (!BCRYPT_SUCCESS(status)) { + BCryptCloseAlgorithmProvider(hAlgorithm, 0); + return NULL; + } + + md->hash_size = cbHash; + md->block_size = cbBlock; + md->ctx_size = sizeof(struct wincng_md_ctx) + cbHashObject - 1; + + return hAlgorithm; +} + +static int +wincng_md_hash_init(BCRYPT_ALG_HANDLE hAlgorithm, + EVP_MD_CTX *ctx) +{ + struct wincng_md_ctx *cng = (struct wincng_md_ctx *)ctx; + NTSTATUS status; + ULONG cbData; + + if (cng->hHash) { + BCryptDestroyHash(cng->hHash); /* allow reinitialization */ + cng->hHash = (BCRYPT_HASH_HANDLE)0; + } + + status = BCryptGetProperty(hAlgorithm, + BCRYPT_OBJECT_LENGTH, + (PUCHAR)&cng->cbHashObject, + sizeof(ULONG), + &cbData, + 0); + if (!BCRYPT_SUCCESS(status)) + return 0; + + status = BCryptCreateHash(hAlgorithm, + &cng->hHash, + cng->rgbHashObject, + cng->cbHashObject, + NULL, + 0, + 0); + + return BCRYPT_SUCCESS(status); +} + +static int +wincng_md_update(EVP_MD_CTX *ctx, + const void *data, + size_t length) +{ + struct wincng_md_ctx *cng = (struct wincng_md_ctx *)ctx; + NTSTATUS status; + + status = BCryptHashData(cng->hHash, (PUCHAR)data, length, 0); + + return BCRYPT_SUCCESS(status); +} + +static int +wincng_md_final(void *digest, + EVP_MD_CTX *ctx) +{ + struct wincng_md_ctx *cng = (struct wincng_md_ctx *)ctx; + NTSTATUS status; + ULONG cbHash, cbData; + + status = BCryptGetProperty(cng->hHash, + BCRYPT_HASH_LENGTH, + (PUCHAR)&cbHash, + sizeof(DWORD), + &cbData, + 0); + if (!BCRYPT_SUCCESS(status)) + return 0; + + status = BCryptFinishHash(cng->hHash, + digest, + cbHash, + 0); + + return BCRYPT_SUCCESS(status); +} + +static int +wincng_md_cleanup(EVP_MD_CTX *ctx) +{ + struct wincng_md_ctx *cng = (struct wincng_md_ctx *)ctx; + + if (cng->hHash) + BCryptDestroyHash(cng->hHash); + SecureZeroMemory(cng->rgbHashObject, cng->cbHashObject); + + return 1; +} + +#define WINCNG_MD_ALGORITHM(name, alg_id) \ + \ + static BCRYPT_ALG_HANDLE wincng_hAlgorithm_##name; \ + \ + static int wincng_##name##_init(EVP_MD_CTX *ctx) \ + { \ + return wincng_md_hash_init(wincng_hAlgorithm_##name, ctx); \ + } \ + \ + const EVP_MD * \ + hc_EVP_wincng_##name(void) \ + { \ + static struct hc_evp_md name = { \ + 0, \ + 0, \ + 0, \ + wincng_##name##_init, \ + wincng_md_update, \ + wincng_md_final, \ + wincng_md_cleanup \ + }; \ + \ + if (wincng_hAlgorithm_##name == NULL) { \ + BCRYPT_ALG_HANDLE hAlgorithm = \ + wincng_md_algorithm_init(&name, alg_id); \ + InterlockedCompareExchangePointerRelease( \ + &wincng_hAlgorithm_##name, hAlgorithm, NULL); \ + } \ + return wincng_hAlgorithm_##name ? &name : NULL; \ + } + +#define WINCNG_MD_ALGORITHM_CLEANUP(name) do { \ + if (wincng_hAlgorithm_##name) { \ + BCryptCloseAlgorithmProvider(wincng_hAlgorithm_##name, 0); \ + wincng_hAlgorithm_##name = NULL; \ + } \ + } while (0) + +WINCNG_MD_ALGORITHM(md4, BCRYPT_MD4_ALGORITHM); +WINCNG_MD_ALGORITHM(md5, BCRYPT_MD5_ALGORITHM); +WINCNG_MD_ALGORITHM(sha1, BCRYPT_SHA1_ALGORITHM); +WINCNG_MD_ALGORITHM(sha256, BCRYPT_SHA256_ALGORITHM); +WINCNG_MD_ALGORITHM(sha384, BCRYPT_SHA384_ALGORITHM); +WINCNG_MD_ALGORITHM(sha512, BCRYPT_SHA512_ALGORITHM); + +static void +wincng_md_algorithm_cleanup(void) +{ + WINCNG_MD_ALGORITHM_CLEANUP(md4); + WINCNG_MD_ALGORITHM_CLEANUP(md5); + WINCNG_MD_ALGORITHM_CLEANUP(sha1); + WINCNG_MD_ALGORITHM_CLEANUP(sha256); + WINCNG_MD_ALGORITHM_CLEANUP(sha384); + WINCNG_MD_ALGORITHM_CLEANUP(sha512); +} + +void _hc_wincng_cleanup(void) +{ + wincng_md_algorithm_cleanup(); + wincng_cipher_algorithm_cleanup(); +} diff --git a/crypto/heimdal/lib/hcrypto/evp.h b/crypto/heimdal/lib/hcrypto/evp.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp.h @@ -0,0 +1,359 @@ +/* + * Copyright (c) 2005 - 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_EVP_H +#define HEIM_EVP_H 1 + +#include + +/* symbol renaming */ +#define EVP_CIPHER_CTX_block_size hc_EVP_CIPHER_CTX_block_size +#define EVP_CIPHER_CTX_cipher hc_EVP_CIPHER_CTX_cipher +#define EVP_CIPHER_CTX_cleanup hc_EVP_CIPHER_CTX_cleanup +#define EVP_CIPHER_CTX_flags hc_EVP_CIPHER_CTX_flags +#define EVP_CIPHER_CTX_get_app_data hc_EVP_CIPHER_CTX_get_app_data +#define EVP_CIPHER_CTX_init hc_EVP_CIPHER_CTX_init +#define EVP_CIPHER_CTX_iv_length hc_EVP_CIPHER_CTX_iv_length +#define EVP_CIPHER_CTX_key_length hc_EVP_CIPHER_CTX_key_length +#define EVP_CIPHER_CTX_mode hc_EVP_CIPHER_CTX_mode +#define EVP_CIPHER_CTX_set_app_data hc_EVP_CIPHER_CTX_set_app_data +#define EVP_CIPHER_CTX_set_key_length hc_EVP_CIPHER_CTX_set_key_length +#define EVP_CIPHER_CTX_set_padding hc_EVP_CIPHER_CTX_set_padding +#define EVP_CIPHER_block_size hc_EVP_CIPHER_block_size +#define EVP_CIPHER_iv_length hc_EVP_CIPHER_iv_length +#define EVP_CIPHER_key_length hc_EVP_CIPHER_key_length +#define EVP_Cipher hc_EVP_Cipher +#define EVP_CipherInit_ex hc_EVP_CipherInit_ex +#define EVP_CipherUpdate hc_EVP_CipherUpdate +#define EVP_CipherFinal_ex hc_EVP_CipherFinal_ex +#define EVP_Digest hc_EVP_Digest +#define EVP_DigestFinal_ex hc_EVP_DigestFinal_ex +#define EVP_DigestInit_ex hc_EVP_DigestInit_ex +#define EVP_DigestUpdate hc_EVP_DigestUpdate +#define EVP_MD_CTX_block_size hc_EVP_MD_CTX_block_size +#define EVP_MD_CTX_cleanup hc_EVP_MD_CTX_cleanup +#define EVP_MD_CTX_create hc_EVP_MD_CTX_create +#define EVP_MD_CTX_init hc_EVP_MD_CTX_init +#define EVP_MD_CTX_destroy hc_EVP_MD_CTX_destroy +#define EVP_MD_CTX_md hc_EVP_MD_CTX_md +#define EVP_MD_CTX_size hc_EVP_MD_CTX_size +#define EVP_MD_block_size hc_EVP_MD_block_size +#define EVP_MD_size hc_EVP_MD_size +#define EVP_aes_128_cbc hc_EVP_aes_128_cbc +#define EVP_aes_192_cbc hc_EVP_aes_192_cbc +#define EVP_aes_256_cbc hc_EVP_aes_256_cbc +#define EVP_aes_128_cfb8 hc_EVP_aes_128_cfb8 +#define EVP_aes_192_cfb8 hc_EVP_aes_192_cfb8 +#define EVP_aes_256_cfb8 hc_EVP_aes_256_cfb8 + +#define EVP_des_cbc hc_EVP_des_cbc +#define EVP_des_ede3_cbc hc_EVP_des_ede3_cbc +#define EVP_enc_null hc_EVP_enc_null +#define EVP_md4 hc_EVP_md4 +#define EVP_md5 hc_EVP_md5 +#define EVP_md_null hc_EVP_md_null +#define EVP_rc2_40_cbc hc_EVP_rc2_40_cbc +#define EVP_rc2_64_cbc hc_EVP_rc2_64_cbc +#define EVP_rc2_cbc hc_EVP_rc2_cbc +#define EVP_rc4 hc_EVP_rc4 +#define EVP_rc4_40 hc_EVP_rc4_40 +#define EVP_camellia_128_cbc hc_EVP_camellia_128_cbc +#define EVP_camellia_192_cbc hc_EVP_camellia_192_cbc +#define EVP_camellia_256_cbc hc_EVP_camellia_256_cbc +#define EVP_sha hc_EVP_sha +#define EVP_sha1 hc_EVP_sha1 +#define EVP_sha256 hc_EVP_sha256 +#define EVP_sha384 hc_EVP_sha384 +#define EVP_sha512 hc_EVP_sha512 +#define PKCS5_PBKDF2_HMAC hc_PKCS5_PBKDF2_HMAC +#define PKCS5_PBKDF2_HMAC_SHA1 hc_PKCS5_PBKDF2_HMAC_SHA1 +#define EVP_BytesToKey hc_EVP_BytesToKey +#define EVP_get_cipherbyname hc_EVP_get_cipherbyname +#define OpenSSL_add_all_algorithms hc_OpenSSL_add_all_algorithms +#define OpenSSL_add_all_algorithms_conf hc_OpenSSL_add_all_algorithms_conf +#define OpenSSL_add_all_algorithms_noconf hc_OpenSSL_add_all_algorithms_noconf +#define EVP_CIPHER_CTX_ctrl hc_EVP_CIPHER_CTX_ctrl +#define EVP_CIPHER_CTX_rand_key hc_EVP_CIPHER_CTX_rand_key +#define hcrypto_validate hc_hcrypto_validate + +/* Type name renaming */ +#define EVP_MD_CTX hc_EVP_MD_CTX +#define EVP_PKEY hc_EVP_PKEY +#define EVP_MD hc_EVP_MD +#define EVP_CIPHER hc_EVP_CIPHER +#define EVP_CIPHER_CTX hc_EVP_CIPHER_CTX + +/* Constant renaming */ +#define EVP_CIPH_STREAM_CIPHER hc_EVP_CIPH_STREAM_CIPHER +#define EVP_CIPH_CBC_MODE hc_EVP_CIPH_CBC_MODE +#define EVP_CIPH_CFB8_MODE hc_EVP_CIPH_CFB8_MODE +#define EVP_CIPH_MODE hc_EVP_CIPH_MODE +#define EVP_CIPH_CTRL_INIT hc_EVP_CIPH_CTRL_INIT + +#define EVP_CIPH_VARIABLE_LENGTH hc_EVP_CIPH_VARIABLE_LENGTH +#define EVP_CIPH_ALWAYS_CALL_INIT hc_EVP_CIPH_ALWAYS_CALL_INIT +#define EVP_CIPH_RAND_KEY hc_EVP_CIPH_RAND_KEY + +#define EVP_CTRL_INIT hc_EVP_CTRL_INIT + + +/* + * + */ + +typedef struct hc_EVP_MD_CTX EVP_MD_CTX; +typedef struct hc_evp_pkey EVP_PKEY; +typedef struct hc_evp_md EVP_MD; +typedef struct hc_CIPHER EVP_CIPHER; +typedef struct hc_CIPHER_CTX EVP_CIPHER_CTX; + +#define EVP_MAX_IV_LENGTH 16 +#define EVP_MAX_BLOCK_LENGTH 32 + +#define EVP_MAX_MD_SIZE 64 + +struct hc_CIPHER { + int nid; + int block_size; + int key_len; + int iv_len; + unsigned long flags; + /* The lowest 3 bits is used as integer field for the mode the + * cipher is used in (use EVP_CIPHER.._mode() to extract the + * mode). The rest of the flag field is a bitfield. + */ +#define hc_EVP_CIPH_STREAM_CIPHER 0 +#define hc_EVP_CIPH_CBC_MODE 2 +#define hc_EVP_CIPH_CFB8_MODE 4 +#define hc_EVP_CIPH_MODE 0x7 +#define hc_EVP_CIPH_CTRL_INIT 0x40 + +#define hc_EVP_CTRL_INIT 0x0 + +#define hc_EVP_CIPH_VARIABLE_LENGTH 0x008 /* variable key length */ +#define hc_EVP_CIPH_ALWAYS_CALL_INIT 0x020 /* backend maintains own cipherstate */ +#define hc_EVP_CIPH_RAND_KEY 0x200 + + int (*init)(EVP_CIPHER_CTX*,const unsigned char*,const unsigned char*,int); + int (*do_cipher)(EVP_CIPHER_CTX *, unsigned char *, + const unsigned char *, unsigned int); + int (*cleanup)(EVP_CIPHER_CTX *); + int ctx_size; + int (*set_asn1_parameters)(void); + int (*get_asn1_parameters)(void); + int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); +#define EVP_CTRL_RAND_KEY 0x6 + + void *app_data; +}; + +struct hc_CIPHER_CTX { + const EVP_CIPHER *cipher; + ENGINE *engine; + int encrypt; + int buf_len; /* bytes stored in buf for EVP_CipherUpdate */ + unsigned char oiv[EVP_MAX_IV_LENGTH]; + unsigned char iv[EVP_MAX_IV_LENGTH]; + unsigned char buf[EVP_MAX_BLOCK_LENGTH]; + int num; + void *app_data; + int key_len; + unsigned long flags; + void *cipher_data; + int final_used; + int block_mask; + unsigned char final[EVP_MAX_BLOCK_LENGTH]; +}; + +/* + * LIES. It's not an EVP_MD_CTX that gets passed to these functions + * here in hcrypto, but an object of ctx_size. + */ +typedef int (*hc_evp_md_init)(EVP_MD_CTX *); +typedef int (*hc_evp_md_update)(EVP_MD_CTX *,const void *, size_t); +typedef int (*hc_evp_md_final)(void *, EVP_MD_CTX *); +typedef int (*hc_evp_md_cleanup)(EVP_MD_CTX *); + +struct hc_evp_md { + int hash_size; + int block_size; + int ctx_size; + hc_evp_md_init init; + hc_evp_md_update update; + hc_evp_md_final final; + hc_evp_md_cleanup cleanup; +}; + +#if !defined(__GNUC__) && !defined(__attribute__) +#define __attribute__(x) +#endif + +#ifndef HC_DEPRECATED +#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 ))) +#define HC_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) && (_MSC_VER>1200) +#define HC_DEPRECATED __declspec(deprecated) +#else +#define HC_DEPRECATED +#endif +#endif + +#ifndef HC_DEPRECATED_CRYPTO +#define HC_DEPRECATED_CRYPTO HC_DEPRECATED +#endif + +#ifdef __cplusplus +#define HC_CPP_BEGIN extern "C" { +#define HC_CPP_END } +#else +#define HC_CPP_BEGIN +#define HC_CPP_END +#endif + +HC_CPP_BEGIN + +/* + * Avaible crypto algs + */ + +const EVP_MD *EVP_md_null(void); +HC_DEPRECATED_CRYPTO const EVP_MD *EVP_md4(void); +HC_DEPRECATED_CRYPTO const EVP_MD *EVP_md5(void); +const EVP_MD *EVP_sha(void); +const EVP_MD *EVP_sha1(void); +const EVP_MD *EVP_sha256(void); +const EVP_MD *EVP_sha384(void); +const EVP_MD *EVP_sha512(void); + +const EVP_CIPHER * EVP_aes_128_cbc(void); +const EVP_CIPHER * EVP_aes_192_cbc(void); +const EVP_CIPHER * EVP_aes_256_cbc(void); +const EVP_CIPHER * EVP_aes_128_cfb8(void); +const EVP_CIPHER * EVP_aes_192_cfb8(void); +const EVP_CIPHER * EVP_aes_256_cfb8(void); +HC_DEPRECATED_CRYPTO const EVP_CIPHER * EVP_des_cbc(void); +const EVP_CIPHER * EVP_des_ede3_cbc(void); +const EVP_CIPHER * EVP_enc_null(void); +HC_DEPRECATED_CRYPTO const EVP_CIPHER * EVP_rc2_40_cbc(void); +HC_DEPRECATED_CRYPTO const EVP_CIPHER * EVP_rc2_64_cbc(void); +HC_DEPRECATED_CRYPTO const EVP_CIPHER * EVP_rc2_cbc(void); +const EVP_CIPHER * EVP_rc4(void); +HC_DEPRECATED_CRYPTO const EVP_CIPHER * EVP_rc4_40(void); +const EVP_CIPHER * EVP_camellia_128_cbc(void); +const EVP_CIPHER * EVP_camellia_192_cbc(void); +const EVP_CIPHER * EVP_camellia_256_cbc(void); + +size_t EVP_MD_size(const EVP_MD *); +size_t EVP_MD_block_size(const EVP_MD *); + +const EVP_MD * + EVP_MD_CTX_md(EVP_MD_CTX *); +size_t EVP_MD_CTX_size(EVP_MD_CTX *); +size_t EVP_MD_CTX_block_size(EVP_MD_CTX *); + +EVP_MD_CTX * + EVP_MD_CTX_create(void); +void HC_DEPRECATED EVP_MD_CTX_init(EVP_MD_CTX *); +void EVP_MD_CTX_destroy(EVP_MD_CTX *); +int HC_DEPRECATED EVP_MD_CTX_cleanup(EVP_MD_CTX *); + +int EVP_DigestInit_ex(EVP_MD_CTX *, const EVP_MD *, ENGINE *); +int EVP_DigestUpdate(EVP_MD_CTX *,const void *, size_t); +int EVP_DigestFinal_ex(EVP_MD_CTX *, void *, unsigned int *); +int EVP_Digest(const void *, size_t, void *, unsigned int *, + const EVP_MD *, ENGINE *); +/* + * + */ + +const EVP_CIPHER * + EVP_get_cipherbyname(const char *); + +size_t EVP_CIPHER_block_size(const EVP_CIPHER *); +size_t EVP_CIPHER_key_length(const EVP_CIPHER *); +size_t EVP_CIPHER_iv_length(const EVP_CIPHER *); + +void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *); +int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *); +int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *, int); +int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *, int); +unsigned long + EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *); +int EVP_CIPHER_CTX_mode(const EVP_CIPHER_CTX *); + +const EVP_CIPHER * + EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *); +size_t EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *); +size_t EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *); +size_t EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *); +void * EVP_CIPHER_CTX_get_app_data(EVP_CIPHER_CTX *); +void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *, void *); + +int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *, int, int, void *); +int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *, void *); + + +int EVP_CipherInit_ex(EVP_CIPHER_CTX *,const EVP_CIPHER *, ENGINE *, + const void *, const void *, int); +int EVP_CipherUpdate(EVP_CIPHER_CTX *, void *, int *, void *, size_t); +int EVP_CipherFinal_ex(EVP_CIPHER_CTX *, void *, int *); + +int EVP_Cipher(EVP_CIPHER_CTX *,void *,const void *,size_t); + +int PKCS5_PBKDF2_HMAC(const void *, size_t, const void *, size_t, + unsigned long, const EVP_MD *, size_t, void *); + +int PKCS5_PBKDF2_HMAC_SHA1(const void *, size_t, const void *, size_t, + unsigned long, size_t, void *); + +int EVP_BytesToKey(const EVP_CIPHER *, const EVP_MD *, + const void *, const void *, size_t, + unsigned int, void *, void *); + + +/* + * + */ + +void OpenSSL_add_all_algorithms(void); +void OpenSSL_add_all_algorithms_conf(void); +void OpenSSL_add_all_algorithms_noconf(void); + +void +hcrypto_validate(void); + +HC_CPP_END + +#endif /* HEIM_EVP_H */ diff --git a/crypto/heimdal/lib/hcrypto/evp.c b/crypto/heimdal/lib/hcrypto/evp.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/evp.c @@ -0,0 +1,1506 @@ +/* + * Copyright (c) 2006 - 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif +#include + +#define HC_DEPRECATED +#define HC_DEPRECATED_CRYPTO + +#include + +#include +#include +#include +#if defined(_WIN32) +#include +#endif +#include +#include + +#include + +#ifndef HCRYPTO_DEF_PROVIDER +# ifdef __APPLE__ +# define HCRYPTO_DEF_PROVIDER cc +# elif __sun +# define HCRYPTO_DEF_PROVIDER pkcs11_hcrypto +# elif HAVE_HCRYPTO_W_OPENSSL +# define HCRYPTO_DEF_PROVIDER ossl +# else +# define HCRYPTO_DEF_PROVIDER hcrypto +# endif +#endif + +#define HC_CONCAT4(x,y,z,aa) x ## y ## z ## aa + + +#define EVP_DEF_OP(_prov,_op) HC_CONCAT4(EVP_,_prov,_,_op)() + +/** + * @page page_evp EVP - generic crypto interface + * + * See the library functions here: @ref hcrypto_evp + * + * @section evp_cipher EVP Cipher + * + * The use of EVP_CipherInit_ex() and EVP_Cipher() is pretty easy to + * understand forward, then EVP_CipherUpdate() and + * EVP_CipherFinal_ex() really needs an example to explain @ref + * example_evp_cipher.c . + * + * @example example_evp_cipher.c + * + * This is an example how to use EVP_CipherInit_ex(), + * EVP_CipherUpdate() and EVP_CipherFinal_ex(). + */ + +struct hc_EVP_MD_CTX { + const EVP_MD *md; + ENGINE *engine; + void *ptr; +}; + + +/** + * Return the output size of the message digest function. + * + * @param md the evp message + * + * @return size output size of the message digest function. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_MD_size(const EVP_MD *md) +{ + return md->hash_size; +} + +/** + * Return the blocksize of the message digest function. + * + * @param md the evp message + * + * @return size size of the message digest block size + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_MD_block_size(const EVP_MD *md) +{ + return md->block_size; +} + +/** + * Allocate a messsage digest context object. Free with + * EVP_MD_CTX_destroy(). + * + * @return a newly allocated message digest context object. + * + * @ingroup hcrypto_evp + */ + +EVP_MD_CTX * +EVP_MD_CTX_create(void) +{ + return calloc(1, sizeof(EVP_MD_CTX)); +} + +/** + * Initiate a messsage digest context object. Deallocate with + * EVP_MD_CTX_cleanup(). Please use EVP_MD_CTX_create() instead. + * + * @param ctx variable to initiate. + * + * @ingroup hcrypto_evp + */ + +void +EVP_MD_CTX_init(EVP_MD_CTX *ctx) HC_DEPRECATED +{ + memset(ctx, 0, sizeof(*ctx)); +} + +/** + * Free a messsage digest context object. + * + * @param ctx context to free. + * + * @ingroup hcrypto_evp + */ + +void +EVP_MD_CTX_destroy(EVP_MD_CTX *ctx) +{ + EVP_MD_CTX_cleanup(ctx); + free(ctx); +} + +/** + * Free the resources used by the EVP_MD context. + * + * @param ctx the context to free the resources from. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx) HC_DEPRECATED +{ + if (ctx->md && ctx->md->cleanup) { + int ret = (ctx->md->cleanup)(ctx->ptr); + if (!ret) + return ret; + } else if (ctx->md) { + memset(ctx->ptr, 0, ctx->md->ctx_size); + } + ctx->md = NULL; + ctx->engine = NULL; + free(ctx->ptr); + memset(ctx, 0, sizeof(*ctx)); + return 1; +} + +/** + * Get the EVP_MD use for a specified context. + * + * @param ctx the EVP_MD context to get the EVP_MD for. + * + * @return the EVP_MD used for the context. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_MD_CTX_md(EVP_MD_CTX *ctx) +{ + return ctx->md; +} + +/** + * Return the output size of the message digest function. + * + * @param ctx the evp message digest context + * + * @return size output size of the message digest function. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_MD_CTX_size(EVP_MD_CTX *ctx) +{ + return EVP_MD_size(ctx->md); +} + +/** + * Return the blocksize of the message digest function. + * + * @param ctx the evp message digest context + * + * @return size size of the message digest block size + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_MD_CTX_block_size(EVP_MD_CTX *ctx) +{ + return EVP_MD_block_size(ctx->md); +} + +/** + * Init a EVP_MD_CTX for use a specific message digest and engine. + * + * @param ctx the message digest context to init. + * @param md the message digest to use. + * @param engine the engine to use, NULL to use the default engine. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *md, ENGINE *engine) +{ + if (ctx->md != md || ctx->engine != engine) { + EVP_MD_CTX_cleanup(ctx); + ctx->md = md; + ctx->engine = engine; + if (md == NULL) + return 0; + + ctx->ptr = calloc(1, md->ctx_size); + if (ctx->ptr == NULL) + return 0; + } + if (ctx->md == 0) + return 0; + return (ctx->md->init)(ctx->ptr); +} + +/** + * Update the digest with some data. + * + * @param ctx the context to update + * @param data the data to update the context with + * @param size length of data + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t size) +{ + (ctx->md->update)(ctx->ptr, data, size); + return 1; +} + +/** + * Complete the message digest. + * + * @param ctx the context to complete. + * @param hash the output of the message digest function. At least + * EVP_MD_size(). + * @param size the output size of hash. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_DigestFinal_ex(EVP_MD_CTX *ctx, void *hash, unsigned int *size) +{ + (ctx->md->final)(hash, ctx->ptr); + if (size) + *size = ctx->md->hash_size; + return 1; +} + +/** + * Do the whole EVP_MD_CTX_create(), EVP_DigestInit_ex(), + * EVP_DigestUpdate(), EVP_DigestFinal_ex(), EVP_MD_CTX_destroy() + * dance in one call. + * + * @param data the data to update the context with + * @param dsize length of data + * @param hash output data of at least EVP_MD_size() length. + * @param hsize output length of hash. + * @param md message digest to use + * @param engine engine to use, NULL for default engine. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_Digest(const void *data, size_t dsize, void *hash, unsigned int *hsize, + const EVP_MD *md, ENGINE *engine) +{ + EVP_MD_CTX *ctx; + int ret; + + ctx = EVP_MD_CTX_create(); + if (ctx == NULL) + return 0; + ret = EVP_DigestInit_ex(ctx, md, engine); + if (ret != 1) { + EVP_MD_CTX_destroy(ctx); + return ret; + } + ret = EVP_DigestUpdate(ctx, data, dsize); + if (ret != 1) { + EVP_MD_CTX_destroy(ctx); + return ret; + } + ret = EVP_DigestFinal_ex(ctx, hash, hsize); + EVP_MD_CTX_destroy(ctx); + return ret; +} + +/** + * The message digest SHA256 + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_sha256(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, sha256); +} + +/** + * The message digest SHA384 + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_sha384(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, sha384); +} + +/** + * The message digest SHA512 + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_sha512(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, sha512); +} + +/** + * The message digest SHA1 + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_sha1(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, sha1); +} + +/** + * The message digest SHA1 + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_sha(void) HC_DEPRECATED + +{ + hcrypto_validate(); + return EVP_sha1(); +} + +/** + * The message digest MD5 + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_md5(void) HC_DEPRECATED_CRYPTO +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, md5); +} + +/** + * The message digest MD4 + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_md4(void) HC_DEPRECATED_CRYPTO +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, md4); +} + +/* + * + */ + +static int +null_Init (void *m) +{ + return -1; +} +static int +null_Update (void *m, const void * data, size_t size) +{ + return -1; +} +static int +null_Final(void *res, void *m) +{ + return -1; +} + +/** + * The null message digest + * + * @return the message digest type. + * + * @ingroup hcrypto_evp + */ + +const EVP_MD * +EVP_md_null(void) +{ + static const struct hc_evp_md null = { + 0, + 0, + 0, + (hc_evp_md_init)null_Init, + (hc_evp_md_update)null_Update, + (hc_evp_md_final)null_Final, + NULL + }; + return &null; +} + +/** + * Return the block size of the cipher. + * + * @param c cipher to get the block size from. + * + * @return the block size of the cipher. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_CIPHER_block_size(const EVP_CIPHER *c) +{ + return c->block_size; +} + +/** + * Return the key size of the cipher. + * + * @param c cipher to get the key size from. + * + * @return the key size of the cipher. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_CIPHER_key_length(const EVP_CIPHER *c) +{ + return c->key_len; +} + +/** + * Return the IV size of the cipher. + * + * @param c cipher to get the IV size from. + * + * @return the IV size of the cipher. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_CIPHER_iv_length(const EVP_CIPHER *c) +{ + return c->iv_len; +} + +/** + * Initiate a EVP_CIPHER_CTX context. Clean up with + * EVP_CIPHER_CTX_cleanup(). + * + * @param c the cipher initiate. + * + * @ingroup hcrypto_evp + */ + +void +EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *c) +{ + memset(c, 0, sizeof(*c)); +} + +/** + * Clean up the EVP_CIPHER_CTX context. + * + * @param c the cipher to clean up. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c) +{ + if (c->cipher && c->cipher->cleanup) { + int ret = c->cipher->cleanup(c); + if (!ret) + return ret; + } + if (c->cipher_data) { + if (c->cipher) + memset(c->cipher_data, 0, c->cipher->ctx_size); + free(c->cipher_data); + c->cipher_data = NULL; + } + return 1; +} + +/** + * If the cipher type supports it, change the key length + * + * @param c the cipher context to change the key length for + * @param length new key length + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int length) +{ + if ((c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH) && length > 0) { + c->key_len = length; + return 1; + } + return 0; +} + +#if 0 +int +EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad) +{ + return 0; +} +#endif + +/** + * Return the EVP_CIPHER for a EVP_CIPHER_CTX context. + * + * @param ctx the context to get the cipher type from. + * + * @return the EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_CIPHER_CTX_cipher(EVP_CIPHER_CTX *ctx) +{ + return ctx->cipher; +} + +/** + * Return the block size of the cipher context. + * + * @param ctx cipher context to get the block size from. + * + * @return the block size of the cipher context. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx) +{ + return EVP_CIPHER_block_size(ctx->cipher); +} + +/** + * Return the key size of the cipher context. + * + * @param ctx cipher context to get the key size from. + * + * @return the key size of the cipher context. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx) +{ + return EVP_CIPHER_key_length(ctx->cipher); +} + +/** + * Return the IV size of the cipher context. + * + * @param ctx cipher context to get the IV size from. + * + * @return the IV size of the cipher context. + * + * @ingroup hcrypto_evp + */ + +size_t +EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx) +{ + return EVP_CIPHER_iv_length(ctx->cipher); +} + +/** + * Get the flags for an EVP_CIPHER_CTX context. + * + * @param ctx the EVP_CIPHER_CTX to get the flags from + * + * @return the flags for an EVP_CIPHER_CTX. + * + * @ingroup hcrypto_evp + */ + +unsigned long +EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx) +{ + return ctx->cipher->flags; +} + +/** + * Get the mode for an EVP_CIPHER_CTX context. + * + * @param ctx the EVP_CIPHER_CTX to get the mode from + * + * @return the mode for an EVP_CIPHER_CTX. + * + * @ingroup hcrypto_evp + */ + +int +EVP_CIPHER_CTX_mode(const EVP_CIPHER_CTX *ctx) +{ + return EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_MODE; +} + +/** + * Get the app data for an EVP_CIPHER_CTX context. + * + * @param ctx the EVP_CIPHER_CTX to get the app data from + * + * @return the app data for an EVP_CIPHER_CTX. + * + * @ingroup hcrypto_evp + */ + +void * +EVP_CIPHER_CTX_get_app_data(EVP_CIPHER_CTX *ctx) +{ + return ctx->app_data; +} + +/** + * Set the app data for an EVP_CIPHER_CTX context. + * + * @param ctx the EVP_CIPHER_CTX to set the app data for + * @param data the app data to set for an EVP_CIPHER_CTX. + * + * @ingroup hcrypto_evp + */ + +void +EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data) +{ + ctx->app_data = data; +} + +/** + * Initiate the EVP_CIPHER_CTX context to encrypt or decrypt data. + * Clean up with EVP_CIPHER_CTX_cleanup(). + * + * @param ctx context to initiate + * @param c cipher to use. + * @param engine crypto engine to use, NULL to select default. + * @param key the crypto key to use, NULL will use the previous value. + * @param iv the IV to use, NULL will use the previous value. + * @param encp non zero will encrypt, -1 use the previous value. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *c, ENGINE *engine, + const void *key, const void *iv, int encp) +{ + ctx->buf_len = 0; + + if (encp == -1) + encp = ctx->encrypt; + else + ctx->encrypt = (encp ? 1 : 0); + + if (c && (c != ctx->cipher)) { + EVP_CIPHER_CTX_cleanup(ctx); + ctx->cipher = c; + ctx->key_len = c->key_len; + + ctx->cipher_data = calloc(1, c->ctx_size); + if (ctx->cipher_data == NULL && c->ctx_size != 0) + return 0; + + /* assume block size is a multiple of 2 */ + ctx->block_mask = EVP_CIPHER_block_size(c) - 1; + + if ((ctx->cipher->flags & EVP_CIPH_CTRL_INIT) && + !EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL)) + return 0; + + } else if (ctx->cipher == NULL) { + /* reuse of cipher, but not any cipher ever set! */ + return 0; + } + + switch (EVP_CIPHER_CTX_mode(ctx)) { + case EVP_CIPH_CBC_MODE: + + assert(EVP_CIPHER_CTX_iv_length(ctx) <= sizeof(ctx->iv)); + + if (iv) + memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx)); + memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx)); + break; + + case EVP_CIPH_STREAM_CIPHER: + break; + case EVP_CIPH_CFB8_MODE: + if (iv) + memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx)); + break; + + default: + return 0; + } + + if (key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) + return ctx->cipher->init(ctx, key, iv, encp); + + return 1; +} + +/** + * Encipher/decipher partial data + * + * @param ctx the cipher context. + * @param out output data from the operation. + * @param outlen output length + * @param in input data to the operation. + * @param inlen length of data. + * + * The output buffer length should at least be EVP_CIPHER_block_size() + * byte longer then the input length. + * + * See @ref evp_cipher for an example how to use this function. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, void *out, int *outlen, + void *in, size_t inlen) +{ + int ret, left, blocksize; + + *outlen = 0; + + /** + * If there in no spare bytes in the left from last Update and the + * input length is on the block boundery, the EVP_CipherUpdate() + * function can take a shortcut (and preformance gain) and + * directly encrypt the data, otherwise we hav to fix it up and + * store extra it the EVP_CIPHER_CTX. + */ + if (ctx->buf_len == 0 && (inlen & ctx->block_mask) == 0) { + ret = (*ctx->cipher->do_cipher)(ctx, out, in, inlen); + if (ret == 1) + *outlen = inlen; + else + *outlen = 0; + return ret; + } + + + blocksize = EVP_CIPHER_CTX_block_size(ctx); + left = blocksize - ctx->buf_len; + assert(left > 0); + + if (ctx->buf_len) { + + /* if total buffer is smaller then input, store locally */ + if (inlen < left) { + memcpy(ctx->buf + ctx->buf_len, in, inlen); + ctx->buf_len += inlen; + return 1; + } + + /* fill in local buffer and encrypt */ + memcpy(ctx->buf + ctx->buf_len, in, left); + ret = (*ctx->cipher->do_cipher)(ctx, out, ctx->buf, blocksize); + memset(ctx->buf, 0, blocksize); + if (ret != 1) + return ret; + + *outlen += blocksize; + inlen -= left; + in = ((unsigned char *)in) + left; + out = ((unsigned char *)out) + blocksize; + ctx->buf_len = 0; + } + + if (inlen) { + ctx->buf_len = (inlen & ctx->block_mask); + inlen &= ~ctx->block_mask; + + ret = (*ctx->cipher->do_cipher)(ctx, out, in, inlen); + if (ret != 1) + return ret; + + *outlen += inlen; + + in = ((unsigned char *)in) + inlen; + memcpy(ctx->buf, in, ctx->buf_len); + } + + return 1; +} + +/** + * Encipher/decipher final data + * + * @param ctx the cipher context. + * @param out output data from the operation. + * @param outlen output length + * + * The input length needs to be at least EVP_CIPHER_block_size() bytes + * long. + * + * See @ref evp_cipher for an example how to use this function. + * + * @return 1 on success. + * + * @ingroup hcrypto_evp + */ + +int +EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, void *out, int *outlen) +{ + *outlen = 0; + + if (ctx->buf_len) { + int ret, left, blocksize; + + blocksize = EVP_CIPHER_CTX_block_size(ctx); + + left = blocksize - ctx->buf_len; + assert(left > 0); + + /* zero fill local buffer */ + memset(ctx->buf + ctx->buf_len, 0, left); + ret = (*ctx->cipher->do_cipher)(ctx, out, ctx->buf, blocksize); + memset(ctx->buf, 0, blocksize); + if (ret != 1) + return ret; + + *outlen += blocksize; + } + + return 1; +} + +/** + * Encipher/decipher data + * + * @param ctx the cipher context. + * @param out out data from the operation. + * @param in in data to the operation. + * @param size length of data. + * + * @return 1 on success. + */ + +int +EVP_Cipher(EVP_CIPHER_CTX *ctx, void *out, const void *in,size_t size) +{ + return ctx->cipher->do_cipher(ctx, out, in, size); +} + +/* + * + */ + +static int +enc_null_init(EVP_CIPHER_CTX *ctx, + const unsigned char * key, + const unsigned char * iv, + int encp) +{ + return 1; +} + +static int +enc_null_do_cipher(EVP_CIPHER_CTX *ctx, + unsigned char *out, + const unsigned char *in, + unsigned int size) +{ + memmove(out, in, size); + return 1; +} + +static int +enc_null_cleanup(EVP_CIPHER_CTX *ctx) +{ + return 1; +} + +/** + * The NULL cipher type, does no encryption/decryption. + * + * @return the null EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_enc_null(void) +{ + static const EVP_CIPHER enc_null = { + 0, + 0, + 0, + 0, + EVP_CIPH_CBC_MODE, + enc_null_init, + enc_null_do_cipher, + enc_null_cleanup, + 0, + NULL, + NULL, + NULL, + NULL + }; + return &enc_null; +} + +/** + * The RC2 cipher type + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_rc2_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, rc2_cbc); +} + +/** + * The RC2 cipher type + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_rc2_40_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, rc2_40_cbc); +} + +/** + * The RC2 cipher type + * + * @return the RC2 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_rc2_64_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, rc2_64_cbc); +} + +/** + * The RC4 cipher type + * + * @return the RC4 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_rc4(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, rc4); +} + +/** + * The RC4-40 cipher type + * + * @return the RC4-40 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_rc4_40(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, rc4_40); +} + +/** + * The DES cipher type + * + * @return the DES-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_des_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, des_cbc); +} + +/** + * The triple DES cipher type + * + * @return the DES-EDE3-CBC EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_des_ede3_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, des_ede3_cbc); +} + +/** + * The AES-128 cipher type + * + * @return the AES-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_aes_128_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, aes_128_cbc); +} + +/** + * The AES-192 cipher type + * + * @return the AES-192 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_aes_192_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, aes_192_cbc); +} + +/** + * The AES-256 cipher type + * + * @return the AES-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_aes_256_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, aes_256_cbc); +} + +/** + * The AES-128 cipher type + * + * @return the AES-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_aes_128_cfb8(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, aes_128_cfb8); +} + +/** + * The AES-192 cipher type + * + * @return the AES-192 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_aes_192_cfb8(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, aes_192_cfb8); +} + +/** + * The AES-256 cipher type + * + * @return the AES-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_aes_256_cfb8(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, aes_256_cfb8); +} + +/** + * The Camellia-128 cipher type + * + * @return the Camellia-128 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_camellia_128_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, camellia_128_cbc); +} + +/** + * The Camellia-198 cipher type + * + * @return the Camellia-198 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_camellia_192_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, camellia_192_cbc); +} + +/** + * The Camellia-256 cipher type + * + * @return the Camellia-256 EVP_CIPHER pointer. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_camellia_256_cbc(void) +{ + hcrypto_validate(); + return EVP_DEF_OP(HCRYPTO_DEF_PROVIDER, camellia_256_cbc); +} + +/* + * + */ + +static const struct cipher_name { + const char *name; + const EVP_CIPHER *(*func)(void); +} cipher_name[] = { + { "des-ede3-cbc", EVP_des_ede3_cbc }, + { "aes-128-cbc", EVP_aes_128_cbc }, + { "aes-192-cbc", EVP_aes_192_cbc }, + { "aes-256-cbc", EVP_aes_256_cbc }, + { "aes-128-cfb8", EVP_aes_128_cfb8 }, + { "aes-192-cfb8", EVP_aes_192_cfb8 }, + { "aes-256-cfb8", EVP_aes_256_cfb8 }, + { "camellia-128-cbc", EVP_camellia_128_cbc }, + { "camellia-192-cbc", EVP_camellia_192_cbc }, + { "camellia-256-cbc", EVP_camellia_256_cbc } +}; + +/** + * Get the cipher type using their name. + * + * @param name the name of the cipher. + * + * @return the selected EVP_CIPHER pointer or NULL if not found. + * + * @ingroup hcrypto_evp + */ + +const EVP_CIPHER * +EVP_get_cipherbyname(const char *name) +{ + int i; + for (i = 0; i < sizeof(cipher_name)/sizeof(cipher_name[0]); i++) { + if (strcasecmp(cipher_name[i].name, name) == 0) + return (*cipher_name[i].func)(); + } + return NULL; +} + + +/* + * + */ + +#ifndef min +#define min(a,b) (((a)>(b))?(b):(a)) +#endif + +/** + * Provides a legancy string to key function, used in PEM files. + * + * New protocols should use new string to key functions like NIST + * SP56-800A or PKCS#5 v2.0 (see PKCS5_PBKDF2_HMAC_SHA1()). + * + * @param type type of cipher to use + * @param md message digest to use + * @param salt salt salt string, should be an binary 8 byte buffer. + * @param data the password/input key string. + * @param datalen length of data parameter. + * @param count iteration counter. + * @param keydata output keydata, needs to of the size EVP_CIPHER_key_length(). + * @param ivdata output ivdata, needs to of the size EVP_CIPHER_block_size(). + * + * @return the size of derived key. + * + * @ingroup hcrypto_evp + */ + +int +EVP_BytesToKey(const EVP_CIPHER *type, + const EVP_MD *md, + const void *salt, + const void *data, size_t datalen, + unsigned int count, + void *keydata, + void *ivdata) +{ + unsigned int ivlen, keylen; + int first = 0; + unsigned int mds = 0, i; + unsigned char *key = keydata; + unsigned char *iv = ivdata; + unsigned char *buf; + EVP_MD_CTX c; + + keylen = EVP_CIPHER_key_length(type); + ivlen = EVP_CIPHER_iv_length(type); + + if (data == NULL) + return keylen; + + buf = malloc(EVP_MD_size(md)); + if (buf == NULL) + return -1; + + EVP_MD_CTX_init(&c); + + first = 1; + while (1) { + EVP_DigestInit_ex(&c, md, NULL); + if (!first) + EVP_DigestUpdate(&c, buf, mds); + first = 0; + EVP_DigestUpdate(&c,data,datalen); + +#define PKCS5_SALT_LEN 8 + + if (salt) + EVP_DigestUpdate(&c, salt, PKCS5_SALT_LEN); + + EVP_DigestFinal_ex(&c, buf, &mds); + assert(mds == EVP_MD_size(md)); + + for (i = 1; i < count; i++) { + EVP_DigestInit_ex(&c, md, NULL); + EVP_DigestUpdate(&c, buf, mds); + EVP_DigestFinal_ex(&c, buf, &mds); + assert(mds == EVP_MD_size(md)); + } + + i = 0; + if (keylen) { + size_t sz = min(keylen, mds); + if (key) { + memcpy(key, buf, sz); + key += sz; + } + keylen -= sz; + i += sz; + } + if (ivlen && mds > i) { + size_t sz = min(ivlen, (mds - i)); + if (iv) { + memcpy(iv, &buf[i], sz); + iv += sz; + } + ivlen -= sz; + } + if (keylen == 0 && ivlen == 0) + break; + } + + EVP_MD_CTX_cleanup(&c); + free(buf); + + return EVP_CIPHER_key_length(type); +} + +/** + * Generate a random key for the specificed EVP_CIPHER. + * + * @param ctx EVP_CIPHER_CTX type to build the key for. + * @param key return key, must be at least EVP_CIPHER_key_length() byte long. + * + * @return 1 for success, 0 for failure. + * + * @ingroup hcrypto_core + */ + +int +EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, void *key) +{ + if (ctx->cipher->flags & EVP_CIPH_RAND_KEY) + return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key); + if (RAND_bytes(key, ctx->key_len) != 1) + return 0; + return 1; +} + +/** + * Perform a operation on a ctx + * + * @param ctx context to perform operation on. + * @param type type of operation. + * @param arg argument to operation. + * @param data addition data to operation. + + * @return 1 for success, 0 for failure. + * + * @ingroup hcrypto_core + */ + +int +EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *data) +{ + if (ctx->cipher == NULL || ctx->cipher->ctrl == NULL) + return 0; + return (*ctx->cipher->ctrl)(ctx, type, arg, data); +} + +/** + * Add all algorithms to the crypto core. + * + * @ingroup hcrypto_core + */ + +void +OpenSSL_add_all_algorithms(void) +{ + return; +} + +/** + * Add all algorithms to the crypto core using configuration file. + * + * @ingroup hcrypto_core + */ + +void +OpenSSL_add_all_algorithms_conf(void) +{ + return; +} + +/** + * Add all algorithms to the crypto core, but don't use the + * configuration file. + * + * @ingroup hcrypto_core + */ + +void +OpenSSL_add_all_algorithms_noconf(void) +{ + return; +} diff --git a/crypto/heimdal/lib/hcrypto/example_evp_cipher.c b/crypto/heimdal/lib/hcrypto/example_evp_cipher.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/example_evp_cipher.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include /* should really be stdint.h */ +#include +#include +#ifdef __APPLE__ +#include +#endif +#ifdef _WIN32 +#include +#endif + +#include +#include + +/* key and initial vector */ +static char key[16] = + "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4" + "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4"; +static char ivec[16] = + "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4" + "\xaa\xbb\x45\xd4\xaa\xbb\x45\xd4"; + +static void +usage(int exit_code) __attribute__((noreturn)); + +static void +usage(int exit_code) +{ + printf("usage: %s in out [pkcs11 | cc | w32]\n", getprogname()); + exit(exit_code); +} + + +int +main(int argc, char **argv) +{ + int encryptp = 1; + const char *ifn = NULL, *ofn = NULL; + FILE *in, *out; + void *ibuf, *obuf; + int ilen, olen; + size_t block_size = 0; + const EVP_CIPHER *c = EVP_aes_128_cbc(); + EVP_CIPHER_CTX ctx; + int ret; + + setprogname(argv[0]); + + if (argc == 2) { + if (strcmp(argv[1], "--version") == 0) { + printf("version"); + exit(0); + } + if (strcmp(argv[1], "--help") == 0) + usage(0); + usage(1); + } else if (argc == 4 || argc == 5) { + block_size = atoi(argv[1]); + if (block_size == 0) + errx(1, "invalid blocksize %s", argv[1]); + ifn = argv[2]; + ofn = argv[3]; + if (argc == 5) { + if (strcmp(argv[4], "pkcs11") == 0) + c = hc_EVP_pkcs11_aes_128_cbc(); +#ifdef __APPLE__ + else if (strcmp(argv[4], "cc") == 0) + c = hc_EVP_cc_aes_128_cbc(); +#endif +#ifdef _WIN32 + else if (strcmp(argv[4], "w32") == 0) + c = hc_EVP_w32crypto_aes_128_cbc(); +#endif + else + usage(1); + } + } else + usage(1); + + in = fopen(ifn, "r"); + if (in == NULL) + errx(1, "failed to open input file"); + out = fopen(ofn, "w+"); + if (out == NULL) + errx(1, "failed to open output file"); + + /* Check that key and ivec are long enough */ + assert(EVP_CIPHER_key_length(c) <= sizeof(key)); + assert(EVP_CIPHER_iv_length(c) <= sizeof(ivec)); + + /* + * Allocate buffer, the output buffer is at least + * EVP_CIPHER_block_size() longer + */ + ibuf = malloc(block_size); + obuf = malloc(block_size + EVP_CIPHER_block_size(c)); + + /* + * Init the memory used for EVP_CIPHER_CTX and set the key and + * ivec. + */ + EVP_CIPHER_CTX_init(&ctx); + EVP_CipherInit_ex(&ctx, c, NULL, key, ivec, encryptp); + + /* read in buffer */ + while ((ilen = fread(ibuf, 1, block_size, in)) > 0) { + /* encrypto/decrypt */ + ret = EVP_CipherUpdate(&ctx, obuf, &olen, ibuf, ilen); + if (ret != 1) { + EVP_CIPHER_CTX_cleanup(&ctx); + errx(1, "EVP_CipherUpdate failed"); + } + /* write out to output file */ + fwrite(obuf, 1, olen, out); + } + /* done reading */ + fclose(in); + + /* clear up any last bytes left in the output buffer */ + ret = EVP_CipherFinal_ex(&ctx, obuf, &olen); + EVP_CIPHER_CTX_cleanup(&ctx); + if (ret != 1) + errx(1, "EVP_CipherFinal_ex failed"); + + /* write the last bytes out and close */ + fwrite(obuf, 1, olen, out); + fclose(out); + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/gen-des.pl b/crypto/heimdal/lib/hcrypto/gen-des.pl new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/gen-des.pl @@ -0,0 +1,217 @@ +#!/usr/pkg/bin/perl +# +# $Id$ + +use strict; + +print "/* GENERATE FILE from gen-des.pl, do not edit */\n\n"; + +my $gen = 1; + +sub gen_pattern +{ + my $n = shift; + my $r = shift; + my $a = shift; + my $o = shift; + my $s = shift; + print "/* $n bit pattern "; + foreach my $k (@$a) { + print "$k "; + } + print "*/\n"; + print "static int $n\[", $r + 1, "\] = {\n "; + foreach my $i (0..$r) { + my $j = 0; + my $b = 1; + foreach my $k (reverse @$a) { + if ($i & $b) { + $j |= ($s >>($k - $o - 1)); + } + $b = $b << 1; + } + printf "0x%08x", $j; + print ", " if ($i != $r); + if (($i % 4) == 3) { + print "\n"; + print " " if ($i != $r); + } + } + print "};\n"; +} + +if ($gen) { + gen_pattern("pc1_c_3", 7, [ 5, 13, 21 ], 0, 0x1000000); + gen_pattern("pc1_c_4", 15, [ 1, 9, 17, 25 ], 0, 0x1000000); + gen_pattern("pc1_d_3", 7, [ 49, 41, 33 ], 32, 0x1000000); + gen_pattern("pc1_d_4", 15, [ 57, 53, 45, 37 ], 32, 0x1000000); + + gen_pattern("pc2_c_1", 63, [ 5, 24, 7, 16, 6, 10 ], 0, 0x800000); + gen_pattern("pc2_c_2", 63, [ 20, 18, 12, 3, 15, 23 ], 0, 0x800000); + gen_pattern("pc2_c_3", 63, [ 1, 9, 19, 2, 14, 22 ], 0, 0x800000); + gen_pattern("pc2_c_4", 63, [ 11, 13, 4, 17, 21, 8 ], 0, 0x800000); + + gen_pattern("pc2_d_1", 63, [ 51, 35, 31, 52, 39, 45 ], 28, 0x800000); + gen_pattern("pc2_d_2", 63, [ 50, 32, 43, 36, 29, 48 ], 28, 0x800000); + gen_pattern("pc2_d_3", 63, [ 41, 38, 47, 33, 40, 42 ], 28, 0x800000); + gen_pattern("pc2_d_4", 63, [ 49, 37, 30, 46, 34, 44 ], 28, 0x800000); +} + +sub +pbox_mutation +{ + my $n = shift; + my $res = 0; + + my @pbox = ( + 16, 7, 20, 21, + 29, 12, 28, 17, + 1, 15, 23, 26, + 5, 18, 31, 10, + 2, 8, 24, 14, + 32, 27, 3, 9, + 19, 13, 30, 6, + 22, 11, 4, 25 + ); + + foreach my $i (0..31) { + if ($n & (1 << ($pbox[$i] - 1))) { +# print "$i ", ($pbox[$i] - 1), "\n"; + $res |= 1 << $i; + } + } + + return $res; +} + + +my @S1 = ( + 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, + 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, + 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, + 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, + ); +my @S2 = ( + 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, + 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, + 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, + 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, + ); +my @S3 = ( + 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, + 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, + 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, + 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, + ); +my @S4 = ( + 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, + 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, + 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, + 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, + ); +my @S5 = ( + 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, + 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, + 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, + 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, + ); +my @S6 = ( + 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, + 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, + 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, + 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, + ); +my @S7 = ( + 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, + 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, + 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, + 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, + ); + +my @S8 = ( + 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, + 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, + 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, + 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11, + ); + +my @SBox = ( \@S1, \@S2, \@S3, \@S4, \@S5, \@S6, \@S7, \@S8 ); + +sub +one_num_in_one_sbox +{ + my $i = shift; + my $n = shift; + my $r = shift; + + my $index = (($n & 1) << 4) | (($n & 0x20)) | + (($n >> 1) & 0x1) << 0 | + (($n >> 2) & 0x1) << 1 | + (($n >> 3) & 0x1) << 2 | + (($n >> 4) & 0x1) << 3; + + die "argh" if ($index > 63 || $index < 0); + + my $S = $SBox[$i - 1]; + my $val = $$S[$index]; + + my $res = $val << (($i - 1) * 4); + + my $p = &pbox_mutation($res); + + print " $r "; + +# $p = ($p >> $r) | ($p << (32 - $r - 1)); + + printf "0x%08x", $p; + print ", " if ($n != 63 or 1); + if (($n % 4) == 3) { + print " /* $i */" if ($n == 3); + print "\n"; + print "\t" if ($n != 63); + } +} + +sub +one_sbox +{ + my $i = shift; + my $s = 0; + +# print "static uint32_t sbox". $i ."[] = {\n\t"; + print "\t"; + foreach my $n (0..63) { + one_num_in_one_sbox($i, $n, $s); + } + print "\n"; +# print "};\n"; +} + +if ($gen and 0) { + foreach my $sbox (7, 1, 3, 5, 4, 6, 8, 2) { + one_sbox($sbox, 1); + } +} + +#my $num = 1; +#printf "pbox: %d -> 0x%08x\n", $num, pbox_mutation($num); +#$num = 0xc000000; +#printf "pbox: 0x%08x -> 0x%08x\n", $num, pbox_mutation($num); + +print "static unsigned char odd_parity[256] = { \n"; +foreach my $i (0..255) { + my $num = 0; + foreach my $b (1..7) { + $num++ if (($i >> $b) & 1); + } + my $t; + if (($num & 1) == 0) { + $t = $i | 1; + } else { + $t = 0xfe & $i; + } + printf "%3d,", $t; + printf "\n" if (($i % 16) == 15); + +}; +print " };\n"; diff --git a/crypto/heimdal/lib/hcrypto/hash.h b/crypto/heimdal/lib/hcrypto/hash.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/hash.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +/* $Id$ */ + +/* stuff in common between md4, md5, and sha1 */ + +#ifndef __hash_h__ +#define __hash_h__ + +#ifdef KRB5 +#include +#endif + +#ifndef min +#define min(a,b) (((a)>(b))?(b):(a)) +#endif + +/* Vector Crays doesn't have a good 32-bit type, or more precisely, + int32_t as defined by isn't 32 bits, and we don't + want to depend in being able to redefine this type. To cope with + this we have to clamp the result in some places to [0,2^32); no + need to do this on other machines. Did I say this was a mess? + */ + +#ifdef _CRAY +#define CRAYFIX(X) ((X) & 0xffffffff) +#else +#define CRAYFIX(X) (X) +#endif + +static inline uint32_t +cshift (uint32_t x, unsigned int n) +{ + x = CRAYFIX(x); + return CRAYFIX((x << n) | (x >> (32 - n))); +} + +static inline uint64_t +cshift64 (uint64_t x, unsigned int n) +{ + return ((uint64_t)x << (uint64_t)n) | ((uint64_t)x >> ((uint64_t)64 - (uint64_t)n)); +} + +#endif /* __hash_h__ */ diff --git a/crypto/heimdal/lib/hcrypto/hmac.h b/crypto/heimdal/lib/hcrypto/hmac.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/hmac.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_HMAC_H +#define HEIM_HMAC_H 1 + +#include + +/* symbol renaming */ +#define HMAC_CTX_init hc_HMAC_CTX_init +#define HMAC_CTX_cleanup hc_HMAC_CTX_cleanup +#define HMAC_size hc_HMAC_size +#define HMAC_Init_ex hc_HMAC_Init_ex +#define HMAC_Update hc_HMAC_Update +#define HMAC_Final hc_HMAC_Final +#define HMAC hc_HMAC + +/* + * + */ + +#define HMAC_MAX_MD_CBLOCK 64 + +typedef struct hc_HMAC_CTX HMAC_CTX; + +struct hc_HMAC_CTX { + const EVP_MD *md; + ENGINE *engine; + EVP_MD_CTX *ctx; + size_t key_length; + void *opad; + void *ipad; + void *buf; +}; + + +void HMAC_CTX_init(HMAC_CTX *); +void HMAC_CTX_cleanup(HMAC_CTX *ctx); + +size_t HMAC_size(const HMAC_CTX *ctx); + +void HMAC_Init_ex(HMAC_CTX *, const void *, size_t, + const EVP_MD *, ENGINE *); +void HMAC_Update(HMAC_CTX *ctx, const void *data, size_t len); +void HMAC_Final(HMAC_CTX *ctx, void *md, unsigned int *len); + +void * HMAC(const EVP_MD *evp_md, const void *key, size_t key_len, + const void *data, size_t n, void *md, unsigned int *md_len); + +#endif /* HEIM_HMAC_H */ diff --git a/crypto/heimdal/lib/hcrypto/hmac.c b/crypto/heimdal/lib/hcrypto/hmac.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/hmac.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +void +HMAC_CTX_init(HMAC_CTX *ctx) +{ + memset(ctx, 0, sizeof(*ctx)); +} + +void +HMAC_CTX_cleanup(HMAC_CTX *ctx) +{ + if (ctx->buf) { + memset(ctx->buf, 0, ctx->key_length); + free(ctx->buf); + ctx->buf = NULL; + } + if (ctx->opad) { + memset(ctx->opad, 0, EVP_MD_block_size(ctx->md)); + free(ctx->opad); + ctx->opad = NULL; + } + if (ctx->ipad) { + memset(ctx->ipad, 0, EVP_MD_block_size(ctx->md)); + free(ctx->ipad); + ctx->ipad = NULL; + } + if (ctx->ctx) { + EVP_MD_CTX_destroy(ctx->ctx); + ctx->ctx = NULL; + } +} + +size_t +HMAC_size(const HMAC_CTX *ctx) +{ + return EVP_MD_size(ctx->md); +} + +void +HMAC_Init_ex(HMAC_CTX *ctx, + const void *key, + size_t keylen, + const EVP_MD *md, + ENGINE *engine) +{ + unsigned char *p; + size_t i; + + if (ctx->md != md) { + ctx->md = md; + if (ctx->buf) { + memset(ctx->buf, 0, ctx->key_length); + free (ctx->buf); + } + ctx->key_length = EVP_MD_size(ctx->md); + ctx->buf = malloc(ctx->key_length); + } +#if 0 + ctx->engine = engine; +#endif + + if (keylen > EVP_MD_block_size(ctx->md)) { + EVP_Digest(key, keylen, ctx->buf, NULL, ctx->md, engine); + key = ctx->buf; + keylen = EVP_MD_size(ctx->md); + } + + if (ctx->opad) { + memset(ctx->opad, 0, ctx->key_length); + free(ctx->opad); + } + if (ctx->ipad) { + memset(ctx->ipad, 0, ctx->key_length); + free(ctx->ipad); + } + + ctx->opad = malloc(EVP_MD_block_size(ctx->md)); + ctx->ipad = malloc(EVP_MD_block_size(ctx->md)); + memset(ctx->ipad, 0x36, EVP_MD_block_size(ctx->md)); + memset(ctx->opad, 0x5c, EVP_MD_block_size(ctx->md)); + + for (i = 0, p = ctx->ipad; i < keylen; i++) + p[i] ^= ((const unsigned char *)key)[i]; + for (i = 0, p = ctx->opad; i < keylen; i++) + p[i] ^= ((const unsigned char *)key)[i]; + + if (ctx->ctx == NULL) + ctx->ctx = EVP_MD_CTX_create(); + + EVP_DigestInit_ex(ctx->ctx, ctx->md, ctx->engine); + EVP_DigestUpdate(ctx->ctx, ctx->ipad, EVP_MD_block_size(ctx->md)); +} + +void +HMAC_Update(HMAC_CTX *ctx, const void *data, size_t len) +{ + EVP_DigestUpdate(ctx->ctx, data, len); +} + +void +HMAC_Final(HMAC_CTX *ctx, void *md, unsigned int *len) +{ + EVP_DigestFinal_ex(ctx->ctx, ctx->buf, NULL); + + EVP_DigestInit_ex(ctx->ctx, ctx->md, ctx->engine); + EVP_DigestUpdate(ctx->ctx, ctx->opad, EVP_MD_block_size(ctx->md)); + EVP_DigestUpdate(ctx->ctx, ctx->buf, ctx->key_length); + EVP_DigestFinal_ex(ctx->ctx, md, len); +} + +void * +HMAC(const EVP_MD *md, + const void *key, size_t key_size, + const void *data, size_t data_size, + void *hash, unsigned int *hash_len) +{ + HMAC_CTX ctx; + + HMAC_CTX_init(&ctx); + HMAC_Init_ex(&ctx, key, key_size, md, NULL); + HMAC_Update(&ctx, data, data_size); + HMAC_Final(&ctx, hash, hash_len); + HMAC_CTX_cleanup(&ctx); + return hash; +} diff --git a/crypto/heimdal/lib/hcrypto/libhcrypto-exports.def b/crypto/heimdal/lib/hcrypto/libhcrypto-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libhcrypto-exports.def @@ -0,0 +1,342 @@ +EXPORTS + hc_AES_cbc_encrypt + hc_AES_cfb8_encrypt + hc_AES_decrypt + hc_AES_decrypt_key + hc_BN_CTX_end + hc_BN_CTX_free + hc_BN_CTX_get + hc_BN_CTX_new + hc_BN_CTX_start + hc_AES_encrypt + hc_AES_set_encrypt_key + hc_BN_GENCB_call + hc_BN_GENCB_set + hc_BN_bin2bn + hc_BN_bn2bin + hc_BN_bn2hex + hc_BN_clear + hc_BN_clear_bit + hc_BN_clear_free + hc_BN_cmp + hc_BN_dup + hc_BN_free + hc_BN_get_word + hc_BN_hex2bn + hc_BN_is_bit_set + hc_BN_is_negative + hc_BN_new + hc_BN_num_bits + hc_BN_num_bytes + hc_BN_rand + hc_BN_set_bit + hc_BN_set_negative + hc_BN_set_word + hc_BN_uadd + hc_DES_cbc_cksum + hc_DES_cbc_encrypt + hc_DES_cfb64_encrypt + hc_DES_check_key_parity + hc_DES_ecb3_encrypt + hc_DES_ecb_encrypt + hc_DES_ede3_cbc_encrypt + hc_DES_encrypt + hc_DES_generate_random_block + hc_DES_init_random_number_generator + hc_DES_is_weak_key + hc_DES_key_sched +;! hc_DES_mem_rand8 + hc_DES_new_random_key + hc_DES_pcbc_encrypt + hc_DES_rand_data + hc_DES_rand_data_key + hc_DES_random_key + hc_DES_read_password + hc_DES_set_key + hc_DES_set_key_checked + hc_DES_set_key_unchecked + hc_DES_set_odd_parity + hc_DES_set_random_generator_seed + hc_DES_set_sequence_number + hc_DES_string_to_key + hc_DH_check_pubkey + hc_DH_compute_key + hc_DH_free + hc_DH_generate_key + hc_DH_generate_parameters_ex + hc_DH_get_default_method + hc_DH_get_ex_data + hc_DH_ltm_method +;! hc_DH_gmp_method + hc_DH_new + hc_DH_new_method + hc_DH_null_method + hc_DH_set_default_method + hc_DH_set_ex_data + hc_DH_set_method + hc_DH_size + hc_DH_up_ref + hc_DSA_free + hc_DSA_get_default_method + hc_DSA_new + hc_DSA_null_method + hc_DSA_set_default_method + hc_DSA_up_ref + hc_DSA_verify + hc_ENGINE_add_conf_module + hc_ENGINE_by_dso + hc_ENGINE_by_id + hc_ENGINE_finish + hc_ENGINE_free + hc_ENGINE_get_DH + hc_ENGINE_get_RAND + hc_ENGINE_get_RSA + hc_ENGINE_get_default_DH + hc_ENGINE_get_default_RSA + hc_ENGINE_get_id + hc_ENGINE_get_name + hc_ENGINE_load_builtin_engines + hc_ENGINE_new + hc_ENGINE_set_DH + hc_ENGINE_set_RSA + hc_ENGINE_set_default_DH + hc_ENGINE_set_default_RSA + hc_ENGINE_set_destroy_function + hc_ENGINE_set_id + hc_ENGINE_set_name + hc_ENGINE_up_ref + hc_EVP_BytesToKey + hc_EVP_CIPHER_CTX_block_size + hc_EVP_CIPHER_CTX_cipher + hc_EVP_CIPHER_CTX_cleanup + hc_EVP_CIPHER_CTX_flags + hc_EVP_CIPHER_CTX_get_app_data + hc_EVP_CIPHER_CTX_init + hc_EVP_CIPHER_CTX_iv_length + hc_EVP_CIPHER_CTX_key_length + hc_EVP_CIPHER_CTX_mode + hc_EVP_CIPHER_CTX_set_app_data + hc_EVP_CIPHER_block_size + hc_EVP_CIPHER_iv_length + hc_EVP_CIPHER_key_length + hc_EVP_Cipher + hc_EVP_CipherInit_ex + hc_EVP_Digest + hc_EVP_DigestFinal_ex + hc_EVP_DigestInit_ex + hc_EVP_DigestUpdate + hc_EVP_MD_CTX_block_size + hc_EVP_MD_CTX_cleanup + hc_EVP_MD_CTX_create + hc_EVP_MD_CTX_destroy + hc_EVP_MD_CTX_init + hc_EVP_MD_CTX_md + hc_EVP_MD_CTX_size + hc_EVP_MD_block_size + hc_EVP_MD_size + hc_EVP_aes_128_cbc + hc_EVP_aes_128_cfb8 + hc_EVP_aes_192_cbc + hc_EVP_aes_192_cfb8 + hc_EVP_aes_256_cbc + hc_EVP_aes_256_cfb8 + hc_EVP_des_cbc + hc_EVP_des_ede3_cbc + hc_EVP_camellia_128_cbc + hc_EVP_camellia_192_cbc + hc_EVP_camellia_256_cbc + hc_EVP_enc_null + hc_EVP_get_cipherbyname + hc_EVP_md4 + hc_EVP_md5 + hc_EVP_md_null + hc_EVP_rc2_40_cbc + hc_EVP_rc2_64_cbc + hc_EVP_rc2_cbc + hc_EVP_rc4 + hc_EVP_rc4_40 + hc_EVP_sha + hc_EVP_sha1 + hc_EVP_sha256 + hc_EVP_sha384 + hc_EVP_sha512 + +;! hc_EVP_cc_md4 +;! hc_EVP_cc_md5 +;! hc_EVP_cc_sha1 +;! hc_EVP_cc_sha256 +;! hc_EVP_cc_sha384 +;! hc_EVP_cc_sha512 +;! hc_EVP_cc_des_ede3_cbc +;! hc_EVP_cc_aes_128_cbc +;! hc_EVP_cc_aes_192_cbc +;! hc_EVP_cc_aes_256_cbc +;! hc_EVP_cc_aes_128_cfb8 +;! hc_EVP_cc_aes_192_cfb8 +;! hc_EVP_cc_aes_256_cfb8 + + hc_EVP_ossl_md4 + hc_EVP_ossl_md5 + hc_EVP_ossl_sha1 + hc_EVP_ossl_sha256 + hc_EVP_ossl_sha384 + hc_EVP_ossl_sha512 + hc_EVP_ossl_des_ede3_cbc + hc_EVP_ossl_aes_128_cbc + hc_EVP_ossl_aes_192_cbc + hc_EVP_ossl_aes_256_cbc + hc_EVP_ossl_aes_128_cfb8 + hc_EVP_ossl_aes_192_cfb8 + hc_EVP_ossl_aes_256_cfb8 + hc_EVP_ossl_rc2_cbc + hc_EVP_ossl_rc2_40_cbc + hc_EVP_ossl_rc4 + hc_EVP_ossl_rc4_40 + + hc_EVP_pkcs11_md4 + hc_EVP_pkcs11_md5 + hc_EVP_pkcs11_sha1 + hc_EVP_pkcs11_sha256 + hc_EVP_pkcs11_des_ede3_cbc + hc_EVP_pkcs11_aes_128_cbc + hc_EVP_pkcs11_aes_192_cbc + hc_EVP_pkcs11_aes_256_cbc + hc_EVP_pkcs11_aes_128_cfb8 + hc_EVP_pkcs11_aes_192_cfb8 + hc_EVP_pkcs11_aes_256_cfb8 + hc_EVP_pkcs11_rc2_40_cbc + hc_EVP_pkcs11_rc2_64_cbc + hc_EVP_pkcs11_rc2_cbc + hc_EVP_pkcs11_rc4 + hc_EVP_pkcs11_rc4_40 + + hc_EVP_w32crypto_md4 ;! + hc_EVP_w32crypto_md5 ;! + hc_EVP_w32crypto_sha1 ;! + hc_EVP_w32crypto_sha256 ;! + hc_EVP_w32crypto_sha384 ;! + hc_EVP_w32crypto_sha512 ;! + hc_EVP_w32crypto_des_ede3_cbc ;! + hc_EVP_w32crypto_aes_128_cbc ;! + hc_EVP_w32crypto_aes_192_cbc ;! + hc_EVP_w32crypto_aes_256_cbc ;! + hc_EVP_w32crypto_rc2_40_cbc ;! + hc_EVP_w32crypto_rc2_cbc ;! + hc_EVP_w32crypto_rc4 ;! + hc_EVP_w32crypto_rc4_40 ;! + + hc_EVP_w32crypto_aes_128_cfb8 ;! + hc_EVP_w32crypto_aes_192_cfb8 ;! + hc_EVP_w32crypto_aes_256_cfb8 ;! + + hc_EVP_hcrypto_md4 + hc_EVP_hcrypto_md5 + hc_EVP_hcrypto_sha1 + hc_EVP_hcrypto_sha256 + hc_EVP_hcrypto_sha384 + hc_EVP_hcrypto_sha512 + hc_EVP_hcrypto_des_ede3_cbc + hc_EVP_hcrypto_aes_128_cbc + hc_EVP_hcrypto_aes_192_cbc + hc_EVP_hcrypto_aes_256_cbc + hc_EVP_hcrypto_rc4 + hc_EVP_hcrypto_rc4_40 + + hc_EVP_hcrypto_aes_128_cfb8 + hc_EVP_hcrypto_aes_192_cfb8 + hc_EVP_hcrypto_aes_256_cfb8 + +;! hc_EVP_hcrypto_aes_128_cts +;! hc_EVP_hcrypto_aes_192_cts +;! hc_EVP_hcrypto_aes_256_cts + + hc_HMAC + hc_HMAC_CTX_cleanup + hc_HMAC_CTX_init + hc_HMAC_Final + hc_HMAC_Init_ex + hc_HMAC_Update + hc_HMAC_size + hc_MD4_Final + hc_MD4_Init + hc_MD4_Update + hc_MD5_Final + hc_MD5_Init + hc_MD5_Update + hc_OpenSSL_add_all_algorithms + hc_OpenSSL_add_all_algorithms_conf + hc_OpenSSL_add_all_algorithms_noconf + hc_PKCS12_key_gen + hc_PKCS5_PBKDF2_HMAC + hc_PKCS5_PBKDF2_HMAC_SHA1 + hc_RAND_add + hc_RAND_bytes + hc_RAND_cleanup + hc_RAND_file_name +;! hc_RAND_fortuna_method + hc_RAND_get_rand_method + hc_RAND_load_file + hc_RAND_pseudo_bytes + hc_RAND_seed + hc_RAND_set_rand_engine + hc_RAND_set_rand_method + hc_RAND_status +;! hc_RAND_unix_method +;! hc_RAND_timer_method + hc_RAND_w32crypto_method ;! + hc_RAND_write_file + hc_RC2_cbc_encrypt + hc_RC2_decryptc + hc_RC2_encryptc + hc_RC2_set_key + hc_RC4 + hc_RC4_set_key + hc_RSA_check_key + hc_RSA_free + hc_RSA_generate_key_ex + hc_RSA_get_app_data + hc_RSA_get_default_method + hc_RSA_get_method + hc_RSA_new + hc_RSA_new_method + hc_RSA_null_method + hc_RSA_private_decrypt + hc_RSA_private_encrypt + hc_RSA_public_decrypt + hc_RSA_public_encrypt + hc_RSA_set_app_data + hc_RSA_set_default_method + hc_RSA_set_method + hc_RSA_sign + hc_RSA_size + hc_RSA_up_ref + hc_RSA_verify + hc_SHA1_Final + hc_SHA1_Init + hc_SHA1_Update + hc_SHA256_Final + hc_SHA256_Init + hc_SHA256_Update + hc_SHA384_Final + hc_SHA384_Init + hc_SHA384_Update + hc_SHA512_Final + hc_SHA512_Init + hc_SHA512_Update + hc_UI_UTIL_read_pw_string + hc_i2d_DHparams + hc_d2i_RSAPrivateKey + hc_i2d_RSAPrivateKey + hc_i2d_RSAPublicKey + hc_d2i_RSAPublicKey + hc_EVP_CIPHER_CTX_ctrl + hc_EVP_CIPHER_CTX_rand_key + hc_EVP_CIPHER_CTX_set_key_length + hc_EVP_hcrypto_rc2_cbc + hc_EVP_hcrypto_rc2_40_cbc + hc_EVP_hcrypto_camellia_128_cbc + hc_EVP_CipherUpdate + hc_EVP_CipherFinal_ex + + hc_hcrypto_validate + diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_error.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_error.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_error.c @@ -0,0 +1,47 @@ +#include +#ifdef BN_ERROR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +static const struct { + int code; + const char *msg; +} msgs[] = { + { MP_OKAY, "Successful" }, + { MP_MEM, "Out of heap" }, + { MP_VAL, "Value out of range" } +}; + +/* return a char * string for a given code */ +const char *mp_error_to_string(int code) +{ + int x; + + /* scan the lookup table for the given message */ + for (x = 0; x < (int)(sizeof(msgs) / sizeof(msgs[0])); x++) { + if (msgs[x].code == code) { + return msgs[x].msg; + } + } + + /* generic reply for invalid code */ + return "Invalid error code"; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_error.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_mp_invmod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_mp_invmod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_mp_invmod.c @@ -0,0 +1,148 @@ +#include +#ifdef BN_FAST_MP_INVMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes the modular inverse via binary extended euclidean algorithm, + * that is c = 1/a mod b + * + * Based on slow invmod except this is optimized for the case where b is + * odd as per HAC Note 14.64 on pp. 610 + */ +int fast_mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, B, D; + int res, neg; + + /* 2. [modified] b must be odd */ + if (mp_iseven (b) == 1) { + return MP_VAL; + } + + /* init all our temps */ + if ((res = mp_init_multi(&x, &y, &u, &v, &B, &D, NULL)) != MP_OKAY) { + return res; + } + + /* x == modulus, y == value to invert */ + if ((res = mp_copy (b, &x)) != MP_OKAY) { + goto LBL_ERR; + } + + /* we need y = |a| */ + if ((res = mp_mod (a, b, &y)) != MP_OKAY) { + goto LBL_ERR; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto LBL_ERR; + } + mp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto LBL_ERR; + } + /* 4.2 if B is odd then */ + if (mp_isodd (&B) == 1) { + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* B = B/2 */ + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto LBL_ERR; + } + /* 5.2 if D is odd then */ + if (mp_isodd (&D) == 1) { + /* D = (D-x)/2 */ + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* D = D/2 */ + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } else { + /* v - v - u, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) { + goto top; + } + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto LBL_ERR; + } + + /* b is now the inverse */ + neg = a->sign; + while (D.sign == MP_NEG) { + if ((res = mp_add (&D, b, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + mp_exch (&D, c); + c->sign = neg; + res = MP_OKAY; + +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &B, &D, NULL); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_fast_mp_invmod.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_mp_montgomery_reduce.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_mp_montgomery_reduce.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_mp_montgomery_reduce.c @@ -0,0 +1,172 @@ +#include +#ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes xR**-1 == x (mod N) via Montgomery Reduction + * + * This is an optimized implementation of montgomery_reduce + * which uses the comba method to quickly calculate the columns of the + * reduction. + * + * Based on Algorithm 14.32 on pp.601 of HAC. +*/ +int fast_mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) +{ + int ix, res, olduse; + mp_word W[MP_WARRAY]; + + /* get old used count */ + olduse = x->used; + + /* grow a as required */ + if (x->alloc < n->used + 1) { + if ((res = mp_grow (x, n->used + 1)) != MP_OKAY) { + return res; + } + } + + /* first we have to get the digits of the input into + * an array of double precision words W[...] + */ + { + register mp_word *_W; + register mp_digit *tmpx; + + /* alias for the W[] array */ + _W = W; + + /* alias for the digits of x*/ + tmpx = x->dp; + + /* copy the digits of a into W[0..a->used-1] */ + for (ix = 0; ix < x->used; ix++) { + *_W++ = *tmpx++; + } + + /* zero the high words of W[a->used..m->used*2] */ + for (; ix < n->used * 2 + 1; ix++) { + *_W++ = 0; + } + } + + /* now we proceed to zero successive digits + * from the least significant upwards + */ + for (ix = 0; ix < n->used; ix++) { + /* mu = ai * m' mod b + * + * We avoid a double precision multiplication (which isn't required) + * by casting the value down to a mp_digit. Note this requires + * that W[ix-1] have the carry cleared (see after the inner loop) + */ + register mp_digit mu; + mu = (mp_digit) (((W[ix] & MP_MASK) * rho) & MP_MASK); + + /* a = a + mu * m * b**i + * + * This is computed in place and on the fly. The multiplication + * by b**i is handled by offseting which columns the results + * are added to. + * + * Note the comba method normally doesn't handle carries in the + * inner loop In this case we fix the carry from the previous + * column since the Montgomery reduction requires digits of the + * result (so far) [see above] to work. This is + * handled by fixing up one carry after the inner loop. The + * carry fixups are done in order so after these loops the + * first m->used words of W[] have the carries fixed + */ + { + register int iy; + register mp_digit *tmpn; + register mp_word *_W; + + /* alias for the digits of the modulus */ + tmpn = n->dp; + + /* Alias for the columns set by an offset of ix */ + _W = W + ix; + + /* inner loop */ + for (iy = 0; iy < n->used; iy++) { + *_W++ += ((mp_word)mu) * ((mp_word)*tmpn++); + } + } + + /* now fix carry for next digit, W[ix+1] */ + W[ix + 1] += W[ix] >> ((mp_word) DIGIT_BIT); + } + + /* now we have to propagate the carries and + * shift the words downward [all those least + * significant digits we zeroed]. + */ + { + register mp_digit *tmpx; + register mp_word *_W, *_W1; + + /* nox fix rest of carries */ + + /* alias for current word */ + _W1 = W + ix; + + /* alias for next word, where the carry goes */ + _W = W + ++ix; + + for (; ix <= n->used * 2 + 1; ix++) { + *_W++ += *_W1++ >> ((mp_word) DIGIT_BIT); + } + + /* copy out, A = A/b**n + * + * The result is A/b**n but instead of converting from an + * array of mp_word to mp_digit than calling mp_rshd + * we just copy them in the right order + */ + + /* alias for destination word */ + tmpx = x->dp; + + /* alias for shifted double precision result */ + _W = W + n->used; + + for (ix = 0; ix < n->used + 1; ix++) { + *tmpx++ = (mp_digit)(*_W++ & ((mp_word) MP_MASK)); + } + + /* zero oldused digits, if the input a was larger than + * m->used+1 we'll have to clear the digits + */ + for (; ix < olduse; ix++) { + *tmpx++ = 0; + } + } + + /* set the max used and clamp */ + x->used = n->used + 1; + mp_clamp (x); + + /* if A >= m then A = A - m */ + if (mp_cmp_mag (x, n) != MP_LT) { + return s_mp_sub (x, n, x); + } + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_fast_mp_montgomery_reduce.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_mul_digs.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_mul_digs.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_mul_digs.c @@ -0,0 +1,107 @@ +#include +#ifdef BN_FAST_S_MP_MUL_DIGS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* Fast (comba) multiplier + * + * This is the fast column-array [comba] multiplier. It is + * designed to compute the columns of the product first + * then handle the carries afterwards. This has the effect + * of making the nested loops that compute the columns very + * simple and schedulable on super-scalar processors. + * + * This has been modified to produce a variable number of + * digits of output so if say only a half-product is required + * you don't have to compute the upper half (a feature + * required for fast Barrett reduction). + * + * Based on Algorithm 14.12 on pp.595 of HAC. + * + */ +int fast_s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int olduse, res, pa, ix, iz; + mp_digit W[MP_WARRAY]; + register mp_word _W; + + /* grow the destination as required */ + if (c->alloc < digs) { + if ((res = mp_grow (c, digs)) != MP_OKAY) { + return res; + } + } + + /* number of output digits to produce */ + pa = MIN(digs, a->used + b->used); + + /* clear the carry */ + _W = 0; + for (ix = 0; ix < pa; ix++) { + int tx, ty; + int iy; + mp_digit *tmpx, *tmpy; + + /* get offsets into the two bignums */ + ty = MIN(b->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = a->dp + tx; + tmpy = b->dp + ty; + + /* this is the number of times the loop will iterrate, essentially + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(a->used-tx, ty+1); + + /* execute loop */ + for (iz = 0; iz < iy; ++iz) { + _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); + + } + + /* store term */ + W[ix] = ((mp_digit)_W) & MP_MASK; + + /* make next carry */ + _W = _W >> ((mp_word)DIGIT_BIT); + } + + /* setup dest */ + olduse = c->used; + c->used = pa; + + { + register mp_digit *tmpc; + tmpc = c->dp; + for (ix = 0; ix < pa+1; ix++) { + /* now extract the previous digit [below the carry] */ + *tmpc++ = W[ix]; + } + + /* clear unused digits [that existed in the old copy of c] */ + for (; ix < olduse; ix++) { + *tmpc++ = 0; + } + } + mp_clamp (c); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_fast_s_mp_mul_digs.c,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_mul_high_digs.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_mul_high_digs.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_mul_high_digs.c @@ -0,0 +1,98 @@ +#include +#ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* this is a modified version of fast_s_mul_digs that only produces + * output digits *above* digs. See the comments for fast_s_mul_digs + * to see how it works. + * + * This is used in the Barrett reduction since for one of the multiplications + * only the higher digits were needed. This essentially halves the work. + * + * Based on Algorithm 14.12 on pp.595 of HAC. + */ +int fast_s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + int olduse, res, pa, ix, iz; + mp_digit W[MP_WARRAY]; + mp_word _W; + + /* grow the destination as required */ + pa = a->used + b->used; + if (c->alloc < pa) { + if ((res = mp_grow (c, pa)) != MP_OKAY) { + return res; + } + } + + /* number of output digits to produce */ + pa = a->used + b->used; + _W = 0; + for (ix = digs; ix < pa; ix++) { + int tx, ty, iy; + mp_digit *tmpx, *tmpy; + + /* get offsets into the two bignums */ + ty = MIN(b->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = a->dp + tx; + tmpy = b->dp + ty; + + /* this is the number of times the loop will iterrate, essentially its + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(a->used-tx, ty+1); + + /* execute loop */ + for (iz = 0; iz < iy; iz++) { + _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); + } + + /* store term */ + W[ix] = ((mp_digit)_W) & MP_MASK; + + /* make next carry */ + _W = _W >> ((mp_word)DIGIT_BIT); + } + + /* setup dest */ + olduse = c->used; + c->used = pa; + + { + register mp_digit *tmpc; + + tmpc = c->dp + digs; + for (ix = digs; ix < pa; ix++) { + /* now extract the previous digit [below the carry] */ + *tmpc++ = W[ix]; + } + + /* clear unused digits [that existed in the old copy of c] */ + for (; ix < olduse; ix++) { + *tmpc++ = 0; + } + } + mp_clamp (c); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_fast_s_mp_mul_high_digs.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_sqr.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_sqr.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_fast_s_mp_sqr.c @@ -0,0 +1,114 @@ +#include +#ifdef BN_FAST_S_MP_SQR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* the jist of squaring... + * you do like mult except the offset of the tmpx [one that + * starts closer to zero] can't equal the offset of tmpy. + * So basically you set up iy like before then you min it with + * (ty-tx) so that it never happens. You double all those + * you add in the inner loop + +After that loop you do the squares and add them in. +*/ + +int fast_s_mp_sqr (mp_int * a, mp_int * b) +{ + int olduse, res, pa, ix, iz; + mp_digit W[MP_WARRAY], *tmpx; + mp_word W1; + + /* grow the destination as required */ + pa = a->used + a->used; + if (b->alloc < pa) { + if ((res = mp_grow (b, pa)) != MP_OKAY) { + return res; + } + } + + /* number of output digits to produce */ + W1 = 0; + for (ix = 0; ix < pa; ix++) { + int tx, ty, iy; + mp_word _W; + mp_digit *tmpy; + + /* clear counter */ + _W = 0; + + /* get offsets into the two bignums */ + ty = MIN(a->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = a->dp + tx; + tmpy = a->dp + ty; + + /* this is the number of times the loop will iterrate, essentially + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(a->used-tx, ty+1); + + /* now for squaring tx can never equal ty + * we halve the distance since they approach at a rate of 2x + * and we have to round because odd cases need to be executed + */ + iy = MIN(iy, (ty-tx+1)>>1); + + /* execute loop */ + for (iz = 0; iz < iy; iz++) { + _W += ((mp_word)*tmpx++)*((mp_word)*tmpy--); + } + + /* double the inner product and add carry */ + _W = _W + _W + W1; + + /* even columns have the square term in them */ + if ((ix&1) == 0) { + _W += ((mp_word)a->dp[ix>>1])*((mp_word)a->dp[ix>>1]); + } + + /* store it */ + W[ix] = (mp_digit)(_W & MP_MASK); + + /* make next carry */ + W1 = _W >> ((mp_word)DIGIT_BIT); + } + + /* setup dest */ + olduse = b->used; + b->used = a->used+a->used; + + { + mp_digit *tmpb; + tmpb = b->dp; + for (ix = 0; ix < pa; ix++) { + *tmpb++ = W[ix] & MP_MASK; + } + + /* clear unused digits [that existed in the old copy of c] */ + for (; ix < olduse; ix++) { + *tmpb++ = 0; + } + } + mp_clamp (b); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_fast_s_mp_sqr.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_2expt.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_2expt.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_2expt.c @@ -0,0 +1,48 @@ +#include +#ifdef BN_MP_2EXPT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes a = 2**b + * + * Simple algorithm which zeroes the int, grows it then just sets one bit + * as required. + */ +int +mp_2expt (mp_int * a, int b) +{ + int res; + + /* zero a as per default */ + mp_zero (a); + + /* grow a to accomodate the single bit */ + if ((res = mp_grow (a, b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + + /* set the used count of where the bit will go */ + a->used = b / DIGIT_BIT + 1; + + /* put the single bit in its place */ + a->dp[b / DIGIT_BIT] = ((mp_digit)1) << (b % DIGIT_BIT); + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_2expt.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_abs.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_abs.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_abs.c @@ -0,0 +1,43 @@ +#include +#ifdef BN_MP_ABS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* b = |a| + * + * Simple function copies the input and fixes the sign to positive + */ +int +mp_abs (mp_int * a, mp_int * b) +{ + int res; + + /* copy a to b */ + if (a != b) { + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + } + + /* force the sign of b to positive */ + b->sign = MP_ZPOS; + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_abs.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_add.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_add.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_add.c @@ -0,0 +1,53 @@ +#include +#ifdef BN_MP_ADD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* high level addition (handles signs) */ +int mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + /* get sign of both inputs */ + sa = a->sign; + sb = b->sign; + + /* handle two cases, not four */ + if (sa == sb) { + /* both positive or both negative */ + /* add their magnitudes, copy the sign */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* one positive, the other negative */ + /* subtract the one with the greater magnitude from */ + /* the one of the lesser magnitude. The result gets */ + /* the sign of the one with the greater magnitude. */ + if (mp_cmp_mag (a, b) == MP_LT) { + c->sign = sb; + res = s_mp_sub (b, a, c); + } else { + c->sign = sa; + res = s_mp_sub (a, b, c); + } + } + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_add.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_add_d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_add_d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_add_d.c @@ -0,0 +1,112 @@ +#include +#ifdef BN_MP_ADD_D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* single digit addition */ +int +mp_add_d (mp_int * a, mp_digit b, mp_int * c) +{ + int res, ix, oldused; + mp_digit *tmpa, *tmpc, mu; + + /* grow c as required */ + if (c->alloc < a->used + 1) { + if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { + return res; + } + } + + /* if a is negative and |a| >= b, call c = |a| - b */ + if (a->sign == MP_NEG && (a->used > 1 || a->dp[0] >= b)) { + /* temporarily fix sign of a */ + a->sign = MP_ZPOS; + + /* c = |a| - b */ + res = mp_sub_d(a, b, c); + + /* fix sign */ + a->sign = c->sign = MP_NEG; + + /* clamp */ + mp_clamp(c); + + return res; + } + + /* old number of used digits in c */ + oldused = c->used; + + /* sign always positive */ + c->sign = MP_ZPOS; + + /* source alias */ + tmpa = a->dp; + + /* destination alias */ + tmpc = c->dp; + + /* if a is positive */ + if (a->sign == MP_ZPOS) { + /* add digit, after this we're propagating + * the carry. + */ + *tmpc = *tmpa++ + b; + mu = *tmpc >> DIGIT_BIT; + *tmpc++ &= MP_MASK; + + /* now handle rest of the digits */ + for (ix = 1; ix < a->used; ix++) { + *tmpc = *tmpa++ + mu; + mu = *tmpc >> DIGIT_BIT; + *tmpc++ &= MP_MASK; + } + /* set final carry */ + ix++; + *tmpc++ = mu; + + /* setup size */ + c->used = a->used + 1; + } else { + /* a was negative and |a| < b */ + c->used = 1; + + /* the result is a single digit */ + if (a->used == 1) { + *tmpc++ = b - a->dp[0]; + } else { + *tmpc++ = b; + } + + /* setup count so the clearing of oldused + * can fall through correctly + */ + ix = 1; + } + + /* now zero to oldused */ + while (ix++ < oldused) { + *tmpc++ = 0; + } + mp_clamp(c); + + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_add_d.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_addmod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_addmod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_addmod.c @@ -0,0 +1,41 @@ +#include +#ifdef BN_MP_ADDMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* d = a + b (mod c) */ +int +mp_addmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_add (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_addmod.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_and.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_and.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_and.c @@ -0,0 +1,57 @@ +#include +#ifdef BN_MP_AND_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* AND two ints together */ +int +mp_and (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] &= x->dp[ix]; + } + + /* zero digits above the last from the smallest mp_int */ + for (; ix < t.used; ix++) { + t.dp[ix] = 0; + } + + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_and.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clamp.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clamp.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clamp.c @@ -0,0 +1,44 @@ +#include +#ifdef BN_MP_CLAMP_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* trim unused digits + * + * This is used to ensure that leading zero digits are + * trimed and the leading "used" digit will be non-zero + * Typically very fast. Also fixes the sign if there + * are no more leading digits + */ +void +mp_clamp (mp_int * a) +{ + /* decrease used while the most significant digit is + * zero. + */ + while (a->used > 0 && a->dp[a->used - 1] == 0) { + --(a->used); + } + + /* reset the sign flag if used == 0 */ + if (a->used == 0) { + a->sign = MP_ZPOS; + } +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_clamp.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clear.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clear.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clear.c @@ -0,0 +1,44 @@ +#include +#ifdef BN_MP_CLEAR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* clear one (frees) */ +void +mp_clear (mp_int * a) +{ + int i; + + /* only do anything if a hasn't been freed previously */ + if (a->dp != NULL) { + /* first zero the digits */ + for (i = 0; i < a->used; i++) { + a->dp[i] = 0; + } + + /* free ram */ + XFREE(a->dp); + + /* reset members to make debugging easier */ + a->dp = NULL; + a->alloc = a->used = 0; + a->sign = MP_ZPOS; + } +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_clear.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clear_multi.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clear_multi.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_clear_multi.c @@ -0,0 +1,34 @@ +#include +#ifdef BN_MP_CLEAR_MULTI_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ +#include + +void mp_clear_multi(mp_int *mp, ...) +{ + mp_int* next_mp = mp; + va_list args; + va_start(args, mp); + while (next_mp != NULL) { + mp_clear(next_mp); + next_mp = va_arg(args, mp_int*); + } + va_end(args); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_clear_multi.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp.c @@ -0,0 +1,43 @@ +#include +#ifdef BN_MP_CMP_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* compare two ints (signed)*/ +int +mp_cmp (mp_int * a, mp_int * b) +{ + /* compare based on sign */ + if (a->sign != b->sign) { + if (a->sign == MP_NEG) { + return MP_LT; + } else { + return MP_GT; + } + } + + /* compare digits */ + if (a->sign == MP_NEG) { + /* if negative compare opposite direction */ + return mp_cmp_mag(b, a); + } else { + return mp_cmp_mag(a, b); + } +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_cmp.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp_d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp_d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp_d.c @@ -0,0 +1,44 @@ +#include +#ifdef BN_MP_CMP_D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* compare a digit */ +int mp_cmp_d(mp_int * a, mp_digit b) +{ + /* compare based on sign */ + if (a->sign == MP_NEG) { + return MP_LT; + } + + /* compare based on magnitude */ + if (a->used > 1) { + return MP_GT; + } + + /* compare the only digit of a to b */ + if (a->dp[0] > b) { + return MP_GT; + } else if (a->dp[0] < b) { + return MP_LT; + } else { + return MP_EQ; + } +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_cmp_d.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp_mag.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp_mag.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cmp_mag.c @@ -0,0 +1,55 @@ +#include +#ifdef BN_MP_CMP_MAG_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* compare maginitude of two ints (unsigned) */ +int mp_cmp_mag (mp_int * a, mp_int * b) +{ + int n; + mp_digit *tmpa, *tmpb; + + /* compare based on # of non-zero digits */ + if (a->used > b->used) { + return MP_GT; + } + + if (a->used < b->used) { + return MP_LT; + } + + /* alias for a */ + tmpa = a->dp + (a->used - 1); + + /* alias for b */ + tmpb = b->dp + (a->used - 1); + + /* compare based on digits */ + for (n = 0; n < a->used; ++n, --tmpa, --tmpb) { + if (*tmpa > *tmpb) { + return MP_GT; + } + + if (*tmpa < *tmpb) { + return MP_LT; + } + } + return MP_EQ; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_cmp_mag.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cnt_lsb.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cnt_lsb.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_cnt_lsb.c @@ -0,0 +1,53 @@ +#include +#ifdef BN_MP_CNT_LSB_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +static const int lnz[16] = { + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 +}; + +/* Counts the number of lsbs which are zero before the first zero bit */ +int mp_cnt_lsb(mp_int *a) +{ + int x; + mp_digit q, qq; + + /* easy out */ + if (mp_iszero(a) == 1) { + return 0; + } + + /* scan lower digits until non-zero */ + for (x = 0; x < a->used && a->dp[x] == 0; x++); + q = a->dp[x]; + x *= DIGIT_BIT; + + /* now scan this digit until a 1 is found */ + if ((q & 1) == 0) { + do { + qq = q & 15; + x += lnz[qq]; + q >>= 4; + } while (qq == 0); + } + return x; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_cnt_lsb.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_copy.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_copy.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_copy.c @@ -0,0 +1,68 @@ +#include +#ifdef BN_MP_COPY_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* copy, b = a */ +int +mp_copy (mp_int * a, mp_int * b) +{ + int res, n; + + /* if dst == src do nothing */ + if (a == b) { + return MP_OKAY; + } + + /* grow dest */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + /* zero b and copy the parameters over */ + { + register mp_digit *tmpa, *tmpb; + + /* pointer aliases */ + + /* source */ + tmpa = a->dp; + + /* destination */ + tmpb = b->dp; + + /* copy all the digits */ + for (n = 0; n < a->used; n++) { + *tmpb++ = *tmpa++; + } + + /* clear high digits */ + for (; n < b->used; n++) { + *tmpb++ = 0; + } + } + + /* copy used count and sign */ + b->used = a->used; + b->sign = a->sign; + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_copy.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_count_bits.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_count_bits.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_count_bits.c @@ -0,0 +1,45 @@ +#include +#ifdef BN_MP_COUNT_BITS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* returns the number of bits in an int */ +int +mp_count_bits (mp_int * a) +{ + int r; + mp_digit q; + + /* shortcut */ + if (a->used == 0) { + return 0; + } + + /* get number of digits and add that */ + r = (a->used - 1) * DIGIT_BIT; + + /* take the last digit and count the bits in it */ + q = a->dp[a->used - 1]; + while (q > ((mp_digit) 0)) { + ++r; + q >>= ((mp_digit) 1); + } + return r; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_count_bits.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div.c @@ -0,0 +1,292 @@ +#include +#ifdef BN_MP_DIV_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +#ifdef BN_MP_DIV_SMALL + +/* slower bit-bang division... also smaller */ +int mp_div(mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int ta, tb, tq, q; + int res, n, n2; + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + /* init our temps */ + if ((res = mp_init_multi(&ta, &tb, &tq, &q, NULL) != MP_OKAY)) { + return res; + } + + + mp_set(&tq, 1); + n = mp_count_bits(a) - mp_count_bits(b); + if (((res = mp_abs(a, &ta)) != MP_OKAY) || + ((res = mp_abs(b, &tb)) != MP_OKAY) || + ((res = mp_mul_2d(&tb, n, &tb)) != MP_OKAY) || + ((res = mp_mul_2d(&tq, n, &tq)) != MP_OKAY)) { + goto LBL_ERR; + } + + while (n-- >= 0) { + if (mp_cmp(&tb, &ta) != MP_GT) { + if (((res = mp_sub(&ta, &tb, &ta)) != MP_OKAY) || + ((res = mp_add(&q, &tq, &q)) != MP_OKAY)) { + goto LBL_ERR; + } + } + if (((res = mp_div_2d(&tb, 1, &tb, NULL)) != MP_OKAY) || + ((res = mp_div_2d(&tq, 1, &tq, NULL)) != MP_OKAY)) { + goto LBL_ERR; + } + } + + /* now q == quotient and ta == remainder */ + n = a->sign; + n2 = (a->sign == b->sign ? MP_ZPOS : MP_NEG); + if (c != NULL) { + mp_exch(c, &q); + c->sign = (mp_iszero(c) == MP_YES) ? MP_ZPOS : n2; + } + if (d != NULL) { + mp_exch(d, &ta); + d->sign = (mp_iszero(d) == MP_YES) ? MP_ZPOS : n; + } +LBL_ERR: + mp_clear_multi(&ta, &tb, &tq, &q, NULL); + return res; +} + +#else + +/* integer signed division. + * c*b + d == a [e.g. a/b, c=quotient, d=remainder] + * HAC pp.598 Algorithm 14.20 + * + * Note that the description in HAC is horribly + * incomplete. For example, it doesn't consider + * the case where digits are removed from 'x' in + * the inner loop. It also doesn't consider the + * case that y has fewer than three digits, etc.. + * + * The overall algorithm is as described as + * 14.20 from HAC but fixed to treat these cases. +*/ +int mp_div (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + mp_int q, x, y, t1, t2; + int res, n, t, i, norm, neg; + + /* is divisor zero ? */ + if (mp_iszero (b) == 1) { + return MP_VAL; + } + + /* if a < b then q=0, r = a */ + if (mp_cmp_mag (a, b) == MP_LT) { + if (d != NULL) { + res = mp_copy (a, d); + } else { + res = MP_OKAY; + } + if (c != NULL) { + mp_zero (c); + } + return res; + } + + if ((res = mp_init_size (&q, a->used + 2)) != MP_OKAY) { + return res; + } + q.used = a->used + 2; + + if ((res = mp_init (&t1)) != MP_OKAY) { + goto LBL_Q; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto LBL_T1; + } + + if ((res = mp_init_copy (&x, a)) != MP_OKAY) { + goto LBL_T2; + } + + if ((res = mp_init_copy (&y, b)) != MP_OKAY) { + goto LBL_X; + } + + /* fix the sign */ + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + x.sign = y.sign = MP_ZPOS; + + /* normalize both x and y, ensure that y >= b/2, [b == 2**DIGIT_BIT] */ + norm = mp_count_bits(&y) % DIGIT_BIT; + if (norm < (int)(DIGIT_BIT-1)) { + norm = (DIGIT_BIT-1) - norm; + if ((res = mp_mul_2d (&x, norm, &x)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_mul_2d (&y, norm, &y)) != MP_OKAY) { + goto LBL_Y; + } + } else { + norm = 0; + } + + /* note hac does 0 based, so if used==5 then its 0,1,2,3,4, e.g. use 4 */ + n = x.used - 1; + t = y.used - 1; + + /* while (x >= y*b**n-t) do { q[n-t] += 1; x -= y*b**{n-t} } */ + if ((res = mp_lshd (&y, n - t)) != MP_OKAY) { /* y = y*b**{n-t} */ + goto LBL_Y; + } + + while (mp_cmp (&x, &y) != MP_LT) { + ++(q.dp[n - t]); + if ((res = mp_sub (&x, &y, &x)) != MP_OKAY) { + goto LBL_Y; + } + } + + /* reset y by shifting it back down */ + mp_rshd (&y, n - t); + + /* step 3. for i from n down to (t + 1) */ + for (i = n; i >= (t + 1); i--) { + if (i > x.used) { + continue; + } + + /* step 3.1 if xi == yt then set q{i-t-1} to b-1, + * otherwise set q{i-t-1} to (xi*b + x{i-1})/yt */ + if (x.dp[i] == y.dp[t]) { + q.dp[i - t - 1] = ((((mp_digit)1) << DIGIT_BIT) - 1); + } else { + mp_word tmp; + tmp = ((mp_word) x.dp[i]) << ((mp_word) DIGIT_BIT); + tmp |= ((mp_word) x.dp[i - 1]); + tmp /= ((mp_word) y.dp[t]); + if (tmp > (mp_word) MP_MASK) + tmp = MP_MASK; + q.dp[i - t - 1] = (mp_digit) (tmp & (mp_word) (MP_MASK)); + } + + /* while (q{i-t-1} * (yt * b + y{t-1})) > + xi * b**2 + xi-1 * b + xi-2 + + do q{i-t-1} -= 1; + */ + q.dp[i - t - 1] = (q.dp[i - t - 1] + 1) & MP_MASK; + do { + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1) & MP_MASK; + + /* find left hand */ + mp_zero (&t1); + t1.dp[0] = (t - 1 < 0) ? 0 : y.dp[t - 1]; + t1.dp[1] = y.dp[t]; + t1.used = 2; + if ((res = mp_mul_d (&t1, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto LBL_Y; + } + + /* find right hand */ + t2.dp[0] = (i - 2 < 0) ? 0 : x.dp[i - 2]; + t2.dp[1] = (i - 1 < 0) ? 0 : x.dp[i - 1]; + t2.dp[2] = x.dp[i]; + t2.used = 3; + } while (mp_cmp_mag(&t1, &t2) == MP_GT); + + /* step 3.3 x = x - q{i-t-1} * y * b**{i-t-1} */ + if ((res = mp_mul_d (&y, q.dp[i - t - 1], &t1)) != MP_OKAY) { + goto LBL_Y; + } + + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto LBL_Y; + } + + if ((res = mp_sub (&x, &t1, &x)) != MP_OKAY) { + goto LBL_Y; + } + + /* if x < 0 then { x = x + y*b**{i-t-1}; q{i-t-1} -= 1; } */ + if (x.sign == MP_NEG) { + if ((res = mp_copy (&y, &t1)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_lshd (&t1, i - t - 1)) != MP_OKAY) { + goto LBL_Y; + } + if ((res = mp_add (&x, &t1, &x)) != MP_OKAY) { + goto LBL_Y; + } + + q.dp[i - t - 1] = (q.dp[i - t - 1] - 1UL) & MP_MASK; + } + } + + /* now q is the quotient and x is the remainder + * [which we have to normalize] + */ + + /* get sign before writing to c */ + x.sign = x.used == 0 ? MP_ZPOS : a->sign; + + if (c != NULL) { + mp_clamp (&q); + mp_exch (&q, c); + c->sign = neg; + } + + if (d != NULL) { + mp_div_2d (&x, norm, &x, NULL); + mp_exch (&x, d); + } + + res = MP_OKAY; + +LBL_Y:mp_clear (&y); +LBL_X:mp_clear (&x); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); +LBL_Q:mp_clear (&q); + return res; +} + +#endif + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_div.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_2.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_2.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_2.c @@ -0,0 +1,68 @@ +#include +#ifdef BN_MP_DIV_2_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* b = a/2 */ +int mp_div_2(mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* copy */ + if (b->alloc < a->used) { + if ((res = mp_grow (b, a->used)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* source alias */ + tmpa = a->dp + b->used - 1; + + /* dest alias */ + tmpb = b->dp + b->used - 1; + + /* carry */ + r = 0; + for (x = b->used - 1; x >= 0; x--) { + /* get the carry for the next iteration */ + rr = *tmpa & 1; + + /* shift the current digit, add in carry and store */ + *tmpb-- = (*tmpa-- >> 1) | (r << (DIGIT_BIT - 1)); + + /* forward carry to next iteration */ + r = rr; + } + + /* zero excess digits */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + mp_clamp (b); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_div_2.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_2d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_2d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_2d.c @@ -0,0 +1,97 @@ +#include +#ifdef BN_MP_DIV_2D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* shift right by a certain bit count (store quotient in c, optional remainder in d) */ +int mp_div_2d (mp_int * a, int b, mp_int * c, mp_int * d) +{ + mp_digit D, r, rr; + int x, res; + mp_int t; + + + /* if the shift count is <= 0 then we do no work */ + if (b <= 0) { + res = mp_copy (a, c); + if (d != NULL) { + mp_zero (d); + } + return res; + } + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + /* get the remainder */ + if (d != NULL) { + if ((res = mp_mod_2d (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + mp_rshd (c, b / DIGIT_BIT); + } + + /* shift any bit count < DIGIT_BIT */ + D = (mp_digit) (b % DIGIT_BIT); + if (D != 0) { + register mp_digit *tmpc, mask, shift; + + /* mask */ + mask = (((mp_digit)1) << D) - 1; + + /* shift for lsb */ + shift = DIGIT_BIT - D; + + /* alias */ + tmpc = c->dp + (c->used - 1); + + /* carry */ + r = 0; + for (x = c->used - 1; x >= 0; x--) { + /* get the lower bits of this word in a temp */ + rr = *tmpc & mask; + + /* shift the current word and mix in the carry bits from the previous word */ + *tmpc = (*tmpc >> D) | (r << shift); + --tmpc; + + /* set the carry to the carry bits of the current word found above */ + r = rr; + } + } + mp_clamp (c); + if (d != NULL) { + mp_exch (&t, d); + } + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_div_2d.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_3.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_3.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_3.c @@ -0,0 +1,79 @@ +#include +#ifdef BN_MP_DIV_3_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* divide by three (based on routine from MPI and the GMP manual) */ +int +mp_div_3 (mp_int * a, mp_int *c, mp_digit * d) +{ + mp_int q; + mp_word w, t; + mp_digit b; + int res, ix; + + /* b = 2**DIGIT_BIT / 3 */ + b = (((mp_word)1) << ((mp_word)DIGIT_BIT)) / ((mp_word)3); + + if ((res = mp_init_size(&q, a->used)) != MP_OKAY) { + return res; + } + + q.used = a->used; + q.sign = a->sign; + w = 0; + for (ix = a->used - 1; ix >= 0; ix--) { + w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); + + if (w >= 3) { + /* multiply w by [1/3] */ + t = (w * ((mp_word)b)) >> ((mp_word)DIGIT_BIT); + + /* now subtract 3 * [w/3] from w, to get the remainder */ + w -= t+t+t; + + /* fixup the remainder as required since + * the optimization is not exact. + */ + while (w >= 3) { + t += 1; + w -= 3; + } + } else { + t = 0; + } + q.dp[ix] = (mp_digit)t; + } + + /* [optional] store the remainder */ + if (d != NULL) { + *d = (mp_digit)w; + } + + /* [optional] store the quotient */ + if (c != NULL) { + mp_clamp(&q); + mp_exch(&q, c); + } + mp_clear(&q); + + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_div_3.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_div_d.c @@ -0,0 +1,115 @@ +#include +#ifdef BN_MP_DIV_D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +static int s_is_power_of_two(mp_digit b, int *p) +{ + int x; + + /* fast return if no power of two */ + if ((b==0) || (b & (b-1))) { + return 0; + } + + for (x = 0; x < DIGIT_BIT; x++) { + if (b == (((mp_digit)1)<dp[0] & ((((mp_digit)1)<used)) != MP_OKAY) { + return res; + } + + q.used = a->used; + q.sign = a->sign; + w = 0; + for (ix = a->used - 1; ix >= 0; ix--) { + w = (w << ((mp_word)DIGIT_BIT)) | ((mp_word)a->dp[ix]); + + if (w >= b) { + t = (mp_digit)(w / b); + w -= ((mp_word)t) * ((mp_word)b); + } else { + t = 0; + } + q.dp[ix] = (mp_digit)t; + } + + if (d != NULL) { + *d = (mp_digit)w; + } + + if (c != NULL) { + mp_clamp(&q); + mp_exch(&q, c); + } + mp_clear(&q); + + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_div_d.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2007/01/09 04:44:32 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_is_modulus.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_is_modulus.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_is_modulus.c @@ -0,0 +1,43 @@ +#include +#ifdef BN_MP_DR_IS_MODULUS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* determines if a number is a valid DR modulus */ +int mp_dr_is_modulus(mp_int *a) +{ + int ix; + + /* must be at least two digits */ + if (a->used < 2) { + return 0; + } + + /* must be of the form b**k - a [a <= b] so all + * but the first digit must be equal to -1 (mod b). + */ + for (ix = 1; ix < a->used; ix++) { + if (a->dp[ix] != MP_MASK) { + return 0; + } + } + return 1; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_dr_is_modulus.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_reduce.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_reduce.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_reduce.c @@ -0,0 +1,94 @@ +#include +#ifdef BN_MP_DR_REDUCE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* reduce "x" in place modulo "n" using the Diminished Radix algorithm. + * + * Based on algorithm from the paper + * + * "Generating Efficient Primes for Discrete Log Cryptosystems" + * Chae Hoon Lim, Pil Joong Lee, + * POSTECH Information Research Laboratories + * + * The modulus must be of a special format [see manual] + * + * Has been modified to use algorithm 7.10 from the LTM book instead + * + * Input x must be in the range 0 <= x <= (n-1)**2 + */ +int +mp_dr_reduce (mp_int * x, mp_int * n, mp_digit k) +{ + int err, i, m; + mp_word r; + mp_digit mu, *tmpx1, *tmpx2; + + /* m = digits in modulus */ + m = n->used; + + /* ensure that "x" has at least 2m digits */ + if (x->alloc < m + m) { + if ((err = mp_grow (x, m + m)) != MP_OKAY) { + return err; + } + } + +/* top of loop, this is where the code resumes if + * another reduction pass is required. + */ +top: + /* aliases for digits */ + /* alias for lower half of x */ + tmpx1 = x->dp; + + /* alias for upper half of x, or x/B**m */ + tmpx2 = x->dp + m; + + /* set carry to zero */ + mu = 0; + + /* compute (x mod B**m) + k * [x/B**m] inline and inplace */ + for (i = 0; i < m; i++) { + r = ((mp_word)*tmpx2++) * ((mp_word)k) + *tmpx1 + mu; + *tmpx1++ = (mp_digit)(r & MP_MASK); + mu = (mp_digit)(r >> ((mp_word)DIGIT_BIT)); + } + + /* set final carry */ + *tmpx1++ = mu; + + /* zero words above m */ + for (i = m + 1; i < x->used; i++) { + *tmpx1++ = 0; + } + + /* clamp, sub and return */ + mp_clamp (x); + + /* if x >= n then subtract and reduce again + * Each successive "recursion" makes the input smaller and smaller. + */ + if (mp_cmp_mag (x, n) != MP_LT) { + s_mp_sub(x, n, x); + goto top; + } + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_dr_reduce.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_setup.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_setup.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_dr_setup.c @@ -0,0 +1,32 @@ +#include +#ifdef BN_MP_DR_SETUP_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* determines the setup value */ +void mp_dr_setup(mp_int *a, mp_digit *d) +{ + /* the casts are required if DIGIT_BIT is one less than + * the number of bits in a mp_digit [e.g. DIGIT_BIT==31] + */ + *d = (mp_digit)((((mp_word)1) << ((mp_word)DIGIT_BIT)) - + ((mp_word)a->dp[0])); +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_dr_setup.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exch.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exch.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exch.c @@ -0,0 +1,34 @@ +#include +#ifdef BN_MP_EXCH_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* swap the elements of two integers, for cases where you can't simply swap the + * mp_int pointers around + */ +void +mp_exch (mp_int * a, mp_int * b) +{ + mp_int t; + + t = *a; + *a = *b; + *b = t; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_exch.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_expt_d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_expt_d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_expt_d.c @@ -0,0 +1,57 @@ +#include +#ifdef BN_MP_EXPT_D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* calculate c = a**b using a square-multiply algorithm */ +int mp_expt_d (mp_int * a, mp_digit b, mp_int * c) +{ + int res, x; + mp_int g; + + if ((res = mp_init_copy (&g, a)) != MP_OKAY) { + return res; + } + + /* set initial result */ + mp_set (c, 1); + + for (x = 0; x < (int) DIGIT_BIT; x++) { + /* square */ + if ((res = mp_sqr (c, c)) != MP_OKAY) { + mp_clear (&g); + return res; + } + + /* if the bit is set multiply */ + if ((b & (mp_digit) (((mp_digit)1) << (DIGIT_BIT - 1))) != 0) { + if ((res = mp_mul (c, &g, c)) != MP_OKAY) { + mp_clear (&g); + return res; + } + } + + /* shift to next bit */ + b <<= 1; + } + + mp_clear (&g); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_expt_d.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exptmod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exptmod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exptmod.c @@ -0,0 +1,112 @@ +#include +#ifdef BN_MP_EXPTMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + + +/* this is a shell function that calls either the normal or Montgomery + * exptmod functions. Originally the call to the montgomery code was + * embedded in the normal function but that wasted alot of stack space + * for nothing (since 99% of the time the Montgomery code would be called) + */ +int mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y) +{ + int dr; + + /* modulus P must be positive */ + if (P->sign == MP_NEG) { + return MP_VAL; + } + + /* if exponent X is negative we have to recurse */ + if (X->sign == MP_NEG) { +#ifdef BN_MP_INVMOD_C + mp_int tmpG, tmpX; + int err; + + /* first compute 1/G mod P */ + if ((err = mp_init(&tmpG)) != MP_OKAY) { + return err; + } + if ((err = mp_invmod(G, P, &tmpG)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + + /* now get |X| */ + if ((err = mp_init(&tmpX)) != MP_OKAY) { + mp_clear(&tmpG); + return err; + } + if ((err = mp_abs(X, &tmpX)) != MP_OKAY) { + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; + } + + /* and now compute (1/G)**|X| instead of G**X [X < 0] */ + err = mp_exptmod(&tmpG, &tmpX, P, Y); + mp_clear_multi(&tmpG, &tmpX, NULL); + return err; +#else + /* no invmod */ + return MP_VAL; +#endif + } + +/* modified diminished radix reduction */ +#if defined(BN_MP_REDUCE_IS_2K_L_C) && defined(BN_MP_REDUCE_2K_L_C) && defined(BN_S_MP_EXPTMOD_C) + if (mp_reduce_is_2k_l(P) == MP_YES) { + return s_mp_exptmod(G, X, P, Y, 1); + } +#endif + +#ifdef BN_MP_DR_IS_MODULUS_C + /* is it a DR modulus? */ + dr = mp_dr_is_modulus(P); +#else + /* default to no */ + dr = 0; +#endif + +#ifdef BN_MP_REDUCE_IS_2K_C + /* if not, is it a unrestricted DR modulus? */ + if (dr == 0) { + dr = mp_reduce_is_2k(P) << 1; + } +#endif + + /* if the modulus is odd or dr != 0 use the montgomery method */ +#ifdef BN_MP_EXPTMOD_FAST_C + if (mp_isodd (P) == 1 || dr != 0) { + return mp_exptmod_fast (G, X, P, Y, dr); + } else { +#endif +#ifdef BN_S_MP_EXPTMOD_C + /* otherwise use the generic Barrett reduction technique */ + return s_mp_exptmod (G, X, P, Y, 0); +#else + /* no exptmod for evens */ + return MP_VAL; +#endif +#ifdef BN_MP_EXPTMOD_FAST_C + } +#endif +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_exptmod.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exptmod_fast.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exptmod_fast.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exptmod_fast.c @@ -0,0 +1,321 @@ +#include +#ifdef BN_MP_EXPTMOD_FAST_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes Y == G**X mod P, HAC pp.616, Algorithm 14.85 + * + * Uses a left-to-right k-ary sliding window to compute the modular exponentiation. + * The value of k changes based on the size of the exponent. + * + * Uses Montgomery or Diminished Radix reduction [whichever appropriate] + */ + +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + +int mp_exptmod_fast (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[TAB_SIZE], res; + mp_digit buf, mp; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + + /* use a pointer to the reduction algorithm. This allows us to use + * one of many reduction algorithms without modding the guts of + * the code with if statements everywhere. + */ + int (*redux)(mp_int*,mp_int*,mp_digit); + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* determine and setup reduction code */ + if (redmode == 0) { +#ifdef BN_MP_MONTGOMERY_SETUP_C + /* now setup montgomery */ + if ((err = mp_montgomery_setup (P, &mp)) != MP_OKAY) { + goto LBL_M; + } +#else + err = MP_VAL; + goto LBL_M; +#endif + + /* automatically pick the comba one if available (saves quite a few calls/ifs) */ +#ifdef BN_FAST_MP_MONTGOMERY_REDUCE_C + if (((P->used * 2 + 1) < MP_WARRAY) && + P->used < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + redux = fast_mp_montgomery_reduce; + } else +#endif + { +#ifdef BN_MP_MONTGOMERY_REDUCE_C + /* use slower baseline Montgomery method */ + redux = mp_montgomery_reduce; +#else + err = MP_VAL; + goto LBL_M; +#endif + } + } else if (redmode == 1) { +#if defined(BN_MP_DR_SETUP_C) && defined(BN_MP_DR_REDUCE_C) + /* setup DR reduction for moduli of the form B**k - b */ + mp_dr_setup(P, &mp); + redux = mp_dr_reduce; +#else + err = MP_VAL; + goto LBL_M; +#endif + } else { +#if defined(BN_MP_REDUCE_2K_SETUP_C) && defined(BN_MP_REDUCE_2K_C) + /* setup DR reduction for moduli of the form 2**k - b */ + if ((err = mp_reduce_2k_setup(P, &mp)) != MP_OKAY) { + goto LBL_M; + } + redux = mp_reduce_2k; +#else + err = MP_VAL; + goto LBL_M; +#endif + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto LBL_M; + } + + /* create M table + * + + * + * The first half of the table is not computed though accept for M[0] and M[1] + */ + + if (redmode == 0) { +#ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C + /* now we need R mod m */ + if ((err = mp_montgomery_calc_normalization (&res, P)) != MP_OKAY) { + goto LBL_RES; + } +#else + err = MP_VAL; + goto LBL_RES; +#endif + + /* now set M[1] to G * R mod m */ + if ((err = mp_mulmod (G, &res, P, &M[1])) != MP_OKAY) { + goto LBL_RES; + } + } else { + mp_set(&res, 1); + if ((err = mp_mod(G, P, &M[1])) != MP_OKAY) { + goto LBL_RES; + } + } + + /* compute the value at M[1<<(winsize-1)] by squaring M[1] (winsize-1) times */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_RES; + } + + for (x = 0; x < (winsize - 1); x++) { + if ((err = mp_sqr (&M[1 << (winsize - 1)], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&M[1 << (winsize - 1)], P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* create upper table */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&M[x], P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits so break */ + if (digidx == -1) { + break; + } + /* read next digit and reset bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int)DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (mp_digit)(buf >> (DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) { + continue; + } + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + + /* get next bit of the window */ + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + } + } + + if (redmode == 0) { + /* fixup result if Montgomery reduction is used + * recall that any value in a Montgomery system is + * actually multiplied by R mod n. So we have + * to reduce one more time to cancel out the factor + * of R. + */ + if ((err = redux(&res, P, mp)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* swap res with Y */ + mp_exch (&res, Y); + err = MP_OKAY; +LBL_RES:mp_clear (&res); +LBL_M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} +#endif + + +/* $Source: /cvs/libtom/libtommath/bn_mp_exptmod_fast.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exteuclid.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exteuclid.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_exteuclid.c @@ -0,0 +1,82 @@ +#include +#ifdef BN_MP_EXTEUCLID_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* Extended euclidean algorithm of (a, b) produces + a*u1 + b*u2 = u3 + */ +int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) +{ + mp_int u1,u2,u3,v1,v2,v3,t1,t2,t3,q,tmp; + int err; + + if ((err = mp_init_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL)) != MP_OKAY) { + return err; + } + + /* initialize, (u1,u2,u3) = (1,0,a) */ + mp_set(&u1, 1); + if ((err = mp_copy(a, &u3)) != MP_OKAY) { goto _ERR; } + + /* initialize, (v1,v2,v3) = (0,1,b) */ + mp_set(&v2, 1); + if ((err = mp_copy(b, &v3)) != MP_OKAY) { goto _ERR; } + + /* loop while v3 != 0 */ + while (mp_iszero(&v3) == MP_NO) { + /* q = u3/v3 */ + if ((err = mp_div(&u3, &v3, &q, NULL)) != MP_OKAY) { goto _ERR; } + + /* (t1,t2,t3) = (u1,u2,u3) - (v1,v2,v3)q */ + if ((err = mp_mul(&v1, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u1, &tmp, &t1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_mul(&v2, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u2, &tmp, &t2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_mul(&v3, &q, &tmp)) != MP_OKAY) { goto _ERR; } + if ((err = mp_sub(&u3, &tmp, &t3)) != MP_OKAY) { goto _ERR; } + + /* (u1,u2,u3) = (v1,v2,v3) */ + if ((err = mp_copy(&v1, &u1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&v2, &u2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&v3, &u3)) != MP_OKAY) { goto _ERR; } + + /* (v1,v2,v3) = (t1,t2,t3) */ + if ((err = mp_copy(&t1, &v1)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&t2, &v2)) != MP_OKAY) { goto _ERR; } + if ((err = mp_copy(&t3, &v3)) != MP_OKAY) { goto _ERR; } + } + + /* make sure U3 >= 0 */ + if (u3.sign == MP_NEG) { + mp_neg(&u1, &u1); + mp_neg(&u2, &u2); + mp_neg(&u3, &u3); + } + + /* copy result out */ + if (U1 != NULL) { mp_exch(U1, &u1); } + if (U2 != NULL) { mp_exch(U2, &u2); } + if (U3 != NULL) { mp_exch(U3, &u3); } + + err = MP_OKAY; +_ERR: mp_clear_multi(&u1, &u2, &u3, &v1, &v2, &v3, &t1, &t2, &t3, &q, &tmp, NULL); + return err; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_exteuclid.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_find_prime.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_find_prime.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_find_prime.c @@ -0,0 +1,36 @@ +/* TomsFastMath, a fast ISO C bignum library. + * + * This project is public domain and free for all purposes. + * + * Love Hornquist Astrand + */ +#include +#ifdef BN_MP_FIND_PRIME_C +int mp_find_prime(mp_int *a, int t) +{ + int res = MP_NO; + + /* valid value of t? */ + if (t <= 0 || t > PRIME_SIZE) { + return MP_VAL; + } + + if (mp_iseven(a)) + mp_add_d(a, 1, a); + + do { + if (mp_prime_is_prime(a, t, &res) != 0) { + res = MP_VAL; + break; + } + + if (res == MP_NO) { + mp_add_d(a, 2, a); + continue; + } + + } while (res != MP_YES); + + return res; +} +#endif diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_fread.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_fread.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_fread.c @@ -0,0 +1,67 @@ +#include +#ifdef BN_MP_FREAD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* read a bigint from a file stream in ASCII */ +int mp_fread(mp_int *a, int radix, FILE *stream) +{ + int err, ch, neg, y; + + /* clear a */ + mp_zero(a); + + /* if first digit is - then set negative */ + ch = fgetc(stream); + if (ch == '-') { + neg = MP_NEG; + ch = fgetc(stream); + } else { + neg = MP_ZPOS; + } + + for (;;) { + /* find y in the radix map */ + for (y = 0; y < radix; y++) { + if (mp_s_rmap[y] == ch) { + break; + } + } + if (y == radix) { + break; + } + + /* shift up and add */ + if ((err = mp_mul_d(a, radix, a)) != MP_OKAY) { + return err; + } + if ((err = mp_add_d(a, y, a)) != MP_OKAY) { + return err; + } + + ch = fgetc(stream); + } + if (mp_cmp_d(a, 0) != MP_EQ) { + a->sign = neg; + } + + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_fread.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_fwrite.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_fwrite.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_fwrite.c @@ -0,0 +1,52 @@ +#include +#ifdef BN_MP_FWRITE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +int mp_fwrite(mp_int *a, int radix, FILE *stream) +{ + char *buf; + int err, len, x; + + if ((err = mp_radix_size(a, radix, &len)) != MP_OKAY) { + return err; + } + + buf = OPT_CAST(char) XMALLOC (len); + if (buf == NULL) { + return MP_MEM; + } + + if ((err = mp_toradix(a, buf, radix)) != MP_OKAY) { + XFREE (buf); + return err; + } + + for (x = 0; x < len; x++) { + if (fputc(buf[x], stream) == EOF) { + XFREE (buf); + return MP_VAL; + } + } + + XFREE (buf); + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_fwrite.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_gcd.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_gcd.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_gcd.c @@ -0,0 +1,105 @@ +#include +#ifdef BN_MP_GCD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* Greatest Common Divisor using the binary method */ +int mp_gcd (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int u, v; + int k, u_lsb, v_lsb, res; + + /* either zero than gcd is the largest */ + if (mp_iszero (a) == MP_YES) { + return mp_abs (b, c); + } + if (mp_iszero (b) == MP_YES) { + return mp_abs (a, c); + } + + /* get copies of a and b we can modify */ + if ((res = mp_init_copy (&u, a)) != MP_OKAY) { + return res; + } + + if ((res = mp_init_copy (&v, b)) != MP_OKAY) { + goto LBL_U; + } + + /* must be positive for the remainder of the algorithm */ + u.sign = v.sign = MP_ZPOS; + + /* B1. Find the common power of two for u and v */ + u_lsb = mp_cnt_lsb(&u); + v_lsb = mp_cnt_lsb(&v); + k = MIN(u_lsb, v_lsb); + + if (k > 0) { + /* divide the power of two out */ + if ((res = mp_div_2d(&u, k, &u, NULL)) != MP_OKAY) { + goto LBL_V; + } + + if ((res = mp_div_2d(&v, k, &v, NULL)) != MP_OKAY) { + goto LBL_V; + } + } + + /* divide any remaining factors of two out */ + if (u_lsb != k) { + if ((res = mp_div_2d(&u, u_lsb - k, &u, NULL)) != MP_OKAY) { + goto LBL_V; + } + } + + if (v_lsb != k) { + if ((res = mp_div_2d(&v, v_lsb - k, &v, NULL)) != MP_OKAY) { + goto LBL_V; + } + } + + while (mp_iszero(&v) == 0) { + /* make sure v is the largest */ + if (mp_cmp_mag(&u, &v) == MP_GT) { + /* swap u and v to make sure v is >= u */ + mp_exch(&u, &v); + } + + /* subtract smallest from largest */ + if ((res = s_mp_sub(&v, &u, &v)) != MP_OKAY) { + goto LBL_V; + } + + /* Divide out all factors of two */ + if ((res = mp_div_2d(&v, mp_cnt_lsb(&v), &v, NULL)) != MP_OKAY) { + goto LBL_V; + } + } + + /* multiply by 2**k which we divided out at the beginning */ + if ((res = mp_mul_2d (&u, k, c)) != MP_OKAY) { + goto LBL_V; + } + c->sign = MP_ZPOS; + res = MP_OKAY; +LBL_V:mp_clear (&u); +LBL_U:mp_clear (&v); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_gcd.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_get_int.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_get_int.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_get_int.c @@ -0,0 +1,45 @@ +#include +#ifdef BN_MP_GET_INT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* get the lower 32-bits of an mp_int */ +unsigned long mp_get_int(mp_int * a) +{ + int i; + unsigned long res; + + if (a->used == 0) { + return 0; + } + + /* get number of digits of the lsb we have to read */ + i = MIN(a->used,(int)((sizeof(unsigned long)*CHAR_BIT+DIGIT_BIT-1)/DIGIT_BIT))-1; + + /* get most significant digit of result */ + res = DIGIT(a,i); + + while (--i >= 0) { + res = (res << DIGIT_BIT) | DIGIT(a,i); + } + + /* force result to 32-bits always so it is consistent on non 32-bit platforms */ + return res & 0xFFFFFFFFUL; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_get_int.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_grow.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_grow.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_grow.c @@ -0,0 +1,57 @@ +#include +#ifdef BN_MP_GROW_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* grow as required */ +int mp_grow (mp_int * a, int size) +{ + int i; + mp_digit *tmp; + + /* if the alloc size is smaller alloc more ram */ + if (a->alloc < size) { + /* ensure there are always at least MP_PREC digits extra on top */ + size += (MP_PREC * 2) - (size % MP_PREC); + + /* reallocate the array a->dp + * + * We store the return in a temporary variable + * in case the operation failed we don't want + * to overwrite the dp member of a. + */ + tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * size); + if (tmp == NULL) { + /* reallocation failed but "a" is still valid [can be freed] */ + return MP_MEM; + } + + /* reallocation succeeded so set a->dp */ + a->dp = tmp; + + /* zero excess digits */ + i = a->alloc; + a->alloc = size; + for (; i < a->alloc; i++) { + a->dp[i] = 0; + } + } + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_grow.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init.c @@ -0,0 +1,46 @@ +#include +#ifdef BN_MP_INIT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* init a new mp_int */ +int mp_init (mp_int * a) +{ + int i; + + /* allocate memory required and clear it */ + a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * MP_PREC); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the digits to zero */ + for (i = 0; i < MP_PREC; i++) { + a->dp[i] = 0; + } + + /* set the used to zero, allocated digits to the default precision + * and sign to positive */ + a->used = 0; + a->alloc = MP_PREC; + a->sign = MP_ZPOS; + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_init.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_copy.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_copy.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_copy.c @@ -0,0 +1,32 @@ +#include +#ifdef BN_MP_INIT_COPY_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* creates "a" then copies b into it */ +int mp_init_copy (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_init (a)) != MP_OKAY) { + return res; + } + return mp_copy (b, a); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_init_copy.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_multi.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_multi.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_multi.c @@ -0,0 +1,59 @@ +#include +#ifdef BN_MP_INIT_MULTI_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ +#include + +int mp_init_multi(mp_int *mp, ...) +{ + mp_err res = MP_OKAY; /* Assume ok until proven otherwise */ + int n = 0; /* Number of ok inits */ + mp_int* cur_arg = mp; + va_list args; + + va_start(args, mp); /* init args to next argument from caller */ + while (cur_arg != NULL) { + if (mp_init(cur_arg) != MP_OKAY) { + /* Oops - error! Back-track and mp_clear what we already + succeeded in init-ing, then return error. + */ + va_list clean_args; + + /* end the current list */ + va_end(args); + + /* now start cleaning up */ + cur_arg = mp; + va_start(clean_args, mp); + while (n--) { + mp_clear(cur_arg); + cur_arg = va_arg(clean_args, mp_int*); + } + va_end(clean_args); + res = MP_MEM; + break; + } + n++; + cur_arg = va_arg(args, mp_int*); + } + va_end(args); + return res; /* Assumed ok, if error flagged above. */ +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_init_multi.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_set.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_set.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_set.c @@ -0,0 +1,32 @@ +#include +#ifdef BN_MP_INIT_SET_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* initialize and set a digit */ +int mp_init_set (mp_int * a, mp_digit b) +{ + int err; + if ((err = mp_init(a)) != MP_OKAY) { + return err; + } + mp_set(a, b); + return err; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_init_set.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_set_int.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_set_int.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_set_int.c @@ -0,0 +1,31 @@ +#include +#ifdef BN_MP_INIT_SET_INT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* initialize and set a digit */ +int mp_init_set_int (mp_int * a, unsigned long b) +{ + int err; + if ((err = mp_init(a)) != MP_OKAY) { + return err; + } + return mp_set_int(a, b); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_init_set_int.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_size.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_size.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_init_size.c @@ -0,0 +1,48 @@ +#include +#ifdef BN_MP_INIT_SIZE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* init an mp_init for a given size */ +int mp_init_size (mp_int * a, int size) +{ + int x; + + /* pad size so there are always extra digits */ + size += (MP_PREC * 2) - (size % MP_PREC); + + /* alloc mem */ + a->dp = OPT_CAST(mp_digit) XMALLOC (sizeof (mp_digit) * size); + if (a->dp == NULL) { + return MP_MEM; + } + + /* set the members */ + a->used = 0; + a->alloc = size; + a->sign = MP_ZPOS; + + /* zero the digits */ + for (x = 0; x < size; x++) { + a->dp[x] = 0; + } + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_init_size.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_invmod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_invmod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_invmod.c @@ -0,0 +1,43 @@ +#include +#ifdef BN_MP_INVMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* hac 14.61, pp608 */ +int mp_invmod (mp_int * a, mp_int * b, mp_int * c) +{ + /* b cannot be negative */ + if (b->sign == MP_NEG || mp_iszero(b) == 1) { + return MP_VAL; + } + +#ifdef BN_FAST_MP_INVMOD_C + /* if the modulus is odd we can use a faster routine instead */ + if (mp_isodd (b) == 1) { + return fast_mp_invmod (a, b, c); + } +#endif + +#ifdef BN_MP_INVMOD_SLOW_C + return mp_invmod_slow(a, b, c); +#else + return MP_VAL; +#endif +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_invmod.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_invmod_slow.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_invmod_slow.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_invmod_slow.c @@ -0,0 +1,175 @@ +#include +#ifdef BN_MP_INVMOD_SLOW_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* hac 14.61, pp608 */ +int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x, y, u, v, A, B, C, D; + int res; + + /* b cannot be negative */ + if (b->sign == MP_NEG || mp_iszero(b) == 1) { + return MP_VAL; + } + + /* init temps */ + if ((res = mp_init_multi(&x, &y, &u, &v, + &A, &B, &C, &D, NULL)) != MP_OKAY) { + return res; + } + + /* x = a, y = b */ + if ((res = mp_mod(a, b, &x)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_copy (b, &y)) != MP_OKAY) { + goto LBL_ERR; + } + + /* 2. [modified] if x,y are both even then return an error! */ + if (mp_iseven (&x) == 1 && mp_iseven (&y) == 1) { + res = MP_VAL; + goto LBL_ERR; + } + + /* 3. u=x, v=y, A=1, B=0, C=0,D=1 */ + if ((res = mp_copy (&x, &u)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_copy (&y, &v)) != MP_OKAY) { + goto LBL_ERR; + } + mp_set (&A, 1); + mp_set (&D, 1); + +top: + /* 4. while u is even do */ + while (mp_iseven (&u) == 1) { + /* 4.1 u = u/2 */ + if ((res = mp_div_2 (&u, &u)) != MP_OKAY) { + goto LBL_ERR; + } + /* 4.2 if A or B is odd then */ + if (mp_isodd (&A) == 1 || mp_isodd (&B) == 1) { + /* A = (A+y)/2, B = (B-x)/2 */ + if ((res = mp_add (&A, &y, &A)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_sub (&B, &x, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* A = A/2, B = B/2 */ + if ((res = mp_div_2 (&A, &A)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_div_2 (&B, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 5. while v is even do */ + while (mp_iseven (&v) == 1) { + /* 5.1 v = v/2 */ + if ((res = mp_div_2 (&v, &v)) != MP_OKAY) { + goto LBL_ERR; + } + /* 5.2 if C or D is odd then */ + if (mp_isodd (&C) == 1 || mp_isodd (&D) == 1) { + /* C = (C+y)/2, D = (D-x)/2 */ + if ((res = mp_add (&C, &y, &C)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_sub (&D, &x, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + /* C = C/2, D = D/2 */ + if ((res = mp_div_2 (&C, &C)) != MP_OKAY) { + goto LBL_ERR; + } + if ((res = mp_div_2 (&D, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* 6. if u >= v then */ + if (mp_cmp (&u, &v) != MP_LT) { + /* u = u - v, A = A - C, B = B - D */ + if ((res = mp_sub (&u, &v, &u)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&A, &C, &A)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&B, &D, &B)) != MP_OKAY) { + goto LBL_ERR; + } + } else { + /* v - v - u, C = C - A, D = D - B */ + if ((res = mp_sub (&v, &u, &v)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&C, &A, &C)) != MP_OKAY) { + goto LBL_ERR; + } + + if ((res = mp_sub (&D, &B, &D)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* if not zero goto step 4 */ + if (mp_iszero (&u) == 0) + goto top; + + /* now a = C, b = D, gcd == g*v */ + + /* if v != 1 then there is no inverse */ + if (mp_cmp_d (&v, 1) != MP_EQ) { + res = MP_VAL; + goto LBL_ERR; + } + + /* if its too low */ + while (mp_cmp_d(&C, 0) == MP_LT) { + if ((res = mp_add(&C, b, &C)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* too big */ + while (mp_cmp_mag(&C, b) != MP_LT) { + if ((res = mp_sub(&C, b, &C)) != MP_OKAY) { + goto LBL_ERR; + } + } + + /* C is now the inverse */ + mp_exch (&C, c); + res = MP_OKAY; +LBL_ERR:mp_clear_multi (&x, &y, &u, &v, &A, &B, &C, &D, NULL); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_invmod_slow.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_is_square.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_is_square.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_is_square.c @@ -0,0 +1,109 @@ +#include +#ifdef BN_MP_IS_SQUARE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* Check if remainders are possible squares - fast exclude non-squares */ +static const char rem_128[128] = { + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 +}; + +static const char rem_105[105] = { + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, + 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 +}; + +/* Store non-zero to ret if arg is square, and zero if not */ +int mp_is_square(mp_int *arg,int *ret) +{ + int res; + mp_digit c; + mp_int t; + unsigned long r; + + /* Default to Non-square :) */ + *ret = MP_NO; + + if (arg->sign == MP_NEG) { + return MP_VAL; + } + + /* digits used? (TSD) */ + if (arg->used == 0) { + return MP_OKAY; + } + + /* First check mod 128 (suppose that DIGIT_BIT is at least 7) */ + if (rem_128[127 & DIGIT(arg,0)] == 1) { + return MP_OKAY; + } + + /* Next check mod 105 (3*5*7) */ + if ((res = mp_mod_d(arg,105,&c)) != MP_OKAY) { + return res; + } + if (rem_105[c] == 1) { + return MP_OKAY; + } + + + if ((res = mp_init_set_int(&t,11L*13L*17L*19L*23L*29L*31L)) != MP_OKAY) { + return res; + } + if ((res = mp_mod(arg,&t,&t)) != MP_OKAY) { + goto ERR; + } + r = mp_get_int(&t); + /* Check for other prime modules, note it's not an ERROR but we must + * free "t" so the easiest way is to goto ERR. We know that res + * is already equal to MP_OKAY from the mp_mod call + */ + if ( (1L<<(r%11)) & 0x5C4L ) goto ERR; + if ( (1L<<(r%13)) & 0x9E4L ) goto ERR; + if ( (1L<<(r%17)) & 0x5CE8L ) goto ERR; + if ( (1L<<(r%19)) & 0x4F50CL ) goto ERR; + if ( (1L<<(r%23)) & 0x7ACCA0L ) goto ERR; + if ( (1L<<(r%29)) & 0xC2EDD0CL ) goto ERR; + if ( (1L<<(r%31)) & 0x6DE2B848L ) goto ERR; + + /* Final check - is sqr(sqrt(arg)) == arg ? */ + if ((res = mp_sqrt(arg,&t)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sqr(&t,&t)) != MP_OKAY) { + goto ERR; + } + + *ret = (mp_cmp_mag(&t,arg) == MP_EQ) ? MP_YES : MP_NO; +ERR:mp_clear(&t); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_is_square.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_jacobi.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_jacobi.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_jacobi.c @@ -0,0 +1,105 @@ +#include +#ifdef BN_MP_JACOBI_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes the jacobi c = (a | n) (or Legendre if n is prime) + * HAC pp. 73 Algorithm 2.149 + */ +int mp_jacobi (mp_int * a, mp_int * p, int *c) +{ + mp_int a1, p1; + int k, s, r, res; + mp_digit residue; + + /* if p <= 0 return MP_VAL */ + if (mp_cmp_d(p, 0) != MP_GT) { + return MP_VAL; + } + + /* step 1. if a == 0, return 0 */ + if (mp_iszero (a) == 1) { + *c = 0; + return MP_OKAY; + } + + /* step 2. if a == 1, return 1 */ + if (mp_cmp_d (a, 1) == MP_EQ) { + *c = 1; + return MP_OKAY; + } + + /* default */ + s = 0; + + /* step 3. write a = a1 * 2**k */ + if ((res = mp_init_copy (&a1, a)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&p1)) != MP_OKAY) { + goto LBL_A1; + } + + /* divide out larger power of two */ + k = mp_cnt_lsb(&a1); + if ((res = mp_div_2d(&a1, k, &a1, NULL)) != MP_OKAY) { + goto LBL_P1; + } + + /* step 4. if e is even set s=1 */ + if ((k & 1) == 0) { + s = 1; + } else { + /* else set s=1 if p = 1/7 (mod 8) or s=-1 if p = 3/5 (mod 8) */ + residue = p->dp[0] & 7; + + if (residue == 1 || residue == 7) { + s = 1; + } else if (residue == 3 || residue == 5) { + s = -1; + } + } + + /* step 5. if p == 3 (mod 4) *and* a1 == 3 (mod 4) then s = -s */ + if ( ((p->dp[0] & 3) == 3) && ((a1.dp[0] & 3) == 3)) { + s = -s; + } + + /* if a1 == 1 we're done */ + if (mp_cmp_d (&a1, 1) == MP_EQ) { + *c = s; + } else { + /* n1 = n mod a1 */ + if ((res = mp_mod (p, &a1, &p1)) != MP_OKAY) { + goto LBL_P1; + } + if ((res = mp_jacobi (&p1, &a1, &r)) != MP_OKAY) { + goto LBL_P1; + } + *c = s * r; + } + + /* done */ + res = MP_OKAY; +LBL_P1:mp_clear (&p1); +LBL_A1:mp_clear (&a1); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_jacobi.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_karatsuba_mul.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_karatsuba_mul.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_karatsuba_mul.c @@ -0,0 +1,167 @@ +#include +#ifdef BN_MP_KARATSUBA_MUL_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* c = |a| * |b| using Karatsuba Multiplication using + * three half size multiplications + * + * Let B represent the radix [e.g. 2**DIGIT_BIT] and + * let n represent half of the number of digits in + * the min(a,b) + * + * a = a1 * B**n + a0 + * b = b1 * B**n + b0 + * + * Then, a * b => + a1b1 * B**2n + ((a1 + a0)(b1 + b0) - (a0b0 + a1b1)) * B + a0b0 + * + * Note that a1b1 and a0b0 are used twice and only need to be + * computed once. So in total three half size (half # of + * digit) multiplications are performed, a0b0, a1b1 and + * (a1+b1)(a0+b0) + * + * Note that a multiplication of half the digits requires + * 1/4th the number of single precision multiplications so in + * total after one call 25% of the single precision multiplications + * are saved. Note also that the call to mp_mul can end up back + * in this function if the a0, a1, b0, or b1 are above the threshold. + * This is known as divide-and-conquer and leads to the famous + * O(N**lg(3)) or O(N**1.584) work which is asymptopically lower than + * the standard O(N**2) that the baseline/comba methods use. + * Generally though the overhead of this method doesn't pay off + * until a certain size (N ~ 80) is reached. + */ +int mp_karatsuba_mul (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int x0, x1, y0, y1, t1, x0y0, x1y1; + int B, err; + + /* default the return code to an error */ + err = MP_MEM; + + /* min # of digits */ + B = MIN (a->used, b->used); + + /* now divide in two */ + B = B >> 1; + + /* init copy all the temps */ + if (mp_init_size (&x0, B) != MP_OKAY) + goto ERR; + if (mp_init_size (&x1, a->used - B) != MP_OKAY) + goto X0; + if (mp_init_size (&y0, B) != MP_OKAY) + goto X1; + if (mp_init_size (&y1, b->used - B) != MP_OKAY) + goto Y0; + + /* init temps */ + if (mp_init_size (&t1, B * 2) != MP_OKAY) + goto Y1; + if (mp_init_size (&x0y0, B * 2) != MP_OKAY) + goto T1; + if (mp_init_size (&x1y1, B * 2) != MP_OKAY) + goto X0Y0; + + /* now shift the digits */ + x0.used = y0.used = B; + x1.used = a->used - B; + y1.used = b->used - B; + + { + register int x; + register mp_digit *tmpa, *tmpb, *tmpx, *tmpy; + + /* we copy the digits directly instead of using higher level functions + * since we also need to shift the digits + */ + tmpa = a->dp; + tmpb = b->dp; + + tmpx = x0.dp; + tmpy = y0.dp; + for (x = 0; x < B; x++) { + *tmpx++ = *tmpa++; + *tmpy++ = *tmpb++; + } + + tmpx = x1.dp; + for (x = B; x < a->used; x++) { + *tmpx++ = *tmpa++; + } + + tmpy = y1.dp; + for (x = B; x < b->used; x++) { + *tmpy++ = *tmpb++; + } + } + + /* only need to clamp the lower words since by definition the + * upper words x1/y1 must have a known number of digits + */ + mp_clamp (&x0); + mp_clamp (&y0); + + /* now calc the products x0y0 and x1y1 */ + /* after this x0 is no longer required, free temp [x0==t2]! */ + if (mp_mul (&x0, &y0, &x0y0) != MP_OKAY) + goto X1Y1; /* x0y0 = x0*y0 */ + if (mp_mul (&x1, &y1, &x1y1) != MP_OKAY) + goto X1Y1; /* x1y1 = x1*y1 */ + + /* now calc x1+x0 and y1+y0 */ + if (s_mp_add (&x1, &x0, &t1) != MP_OKAY) + goto X1Y1; /* t1 = x1 - x0 */ + if (s_mp_add (&y1, &y0, &x0) != MP_OKAY) + goto X1Y1; /* t2 = y1 - y0 */ + if (mp_mul (&t1, &x0, &t1) != MP_OKAY) + goto X1Y1; /* t1 = (x1 + x0) * (y1 + y0) */ + + /* add x0y0 */ + if (mp_add (&x0y0, &x1y1, &x0) != MP_OKAY) + goto X1Y1; /* t2 = x0y0 + x1y1 */ + if (s_mp_sub (&t1, &x0, &t1) != MP_OKAY) + goto X1Y1; /* t1 = (x1+x0)*(y1+y0) - (x1y1 + x0y0) */ + + /* shift by B */ + if (mp_lshd (&t1, B) != MP_OKAY) + goto X1Y1; /* t1 = (x0y0 + x1y1 - (x1-x0)*(y1-y0))< +#ifdef BN_MP_KARATSUBA_SQR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* Karatsuba squaring, computes b = a*a using three + * half size squarings + * + * See comments of karatsuba_mul for details. It + * is essentially the same algorithm but merely + * tuned to perform recursive squarings. + */ +int mp_karatsuba_sqr (mp_int * a, mp_int * b) +{ + mp_int x0, x1, t1, t2, x0x0, x1x1; + int B, err; + + err = MP_MEM; + + /* min # of digits */ + B = a->used; + + /* now divide in two */ + B = B >> 1; + + /* init copy all the temps */ + if (mp_init_size (&x0, B) != MP_OKAY) + goto ERR; + if (mp_init_size (&x1, a->used - B) != MP_OKAY) + goto X0; + + /* init temps */ + if (mp_init_size (&t1, a->used * 2) != MP_OKAY) + goto X1; + if (mp_init_size (&t2, a->used * 2) != MP_OKAY) + goto T1; + if (mp_init_size (&x0x0, B * 2) != MP_OKAY) + goto T2; + if (mp_init_size (&x1x1, (a->used - B) * 2) != MP_OKAY) + goto X0X0; + + { + register int x; + register mp_digit *dst, *src; + + src = a->dp; + + /* now shift the digits */ + dst = x0.dp; + for (x = 0; x < B; x++) { + *dst++ = *src++; + } + + dst = x1.dp; + for (x = B; x < a->used; x++) { + *dst++ = *src++; + } + } + + x0.used = B; + x1.used = a->used - B; + + mp_clamp (&x0); + + /* now calc the products x0*x0 and x1*x1 */ + if (mp_sqr (&x0, &x0x0) != MP_OKAY) + goto X1X1; /* x0x0 = x0*x0 */ + if (mp_sqr (&x1, &x1x1) != MP_OKAY) + goto X1X1; /* x1x1 = x1*x1 */ + + /* now calc (x1+x0)**2 */ + if (s_mp_add (&x1, &x0, &t1) != MP_OKAY) + goto X1X1; /* t1 = x1 - x0 */ + if (mp_sqr (&t1, &t1) != MP_OKAY) + goto X1X1; /* t1 = (x1 - x0) * (x1 - x0) */ + + /* add x0y0 */ + if (s_mp_add (&x0x0, &x1x1, &t2) != MP_OKAY) + goto X1X1; /* t2 = x0x0 + x1x1 */ + if (s_mp_sub (&t1, &t2, &t1) != MP_OKAY) + goto X1X1; /* t1 = (x1+x0)**2 - (x0x0 + x1x1) */ + + /* shift by B */ + if (mp_lshd (&t1, B) != MP_OKAY) + goto X1X1; /* t1 = (x0x0 + x1x1 - (x1-x0)*(x1-x0))< +#ifdef BN_MP_LCM_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes least common multiple as |a*b|/(a, b) */ +int mp_lcm (mp_int * a, mp_int * b, mp_int * c) +{ + int res; + mp_int t1, t2; + + + if ((res = mp_init_multi (&t1, &t2, NULL)) != MP_OKAY) { + return res; + } + + /* t1 = get the GCD of the two inputs */ + if ((res = mp_gcd (a, b, &t1)) != MP_OKAY) { + goto LBL_T; + } + + /* divide the smallest by the GCD */ + if (mp_cmp_mag(a, b) == MP_LT) { + /* store quotient in t2 such that t2 * b is the LCM */ + if ((res = mp_div(a, &t1, &t2, NULL)) != MP_OKAY) { + goto LBL_T; + } + res = mp_mul(b, &t2, c); + } else { + /* store quotient in t2 such that t2 * a is the LCM */ + if ((res = mp_div(b, &t1, &t2, NULL)) != MP_OKAY) { + goto LBL_T; + } + res = mp_mul(a, &t2, c); + } + + /* fix the sign to positive */ + c->sign = MP_ZPOS; + +LBL_T: + mp_clear_multi (&t1, &t2, NULL); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_lcm.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_lshd.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_lshd.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_lshd.c @@ -0,0 +1,67 @@ +#include +#ifdef BN_MP_LSHD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* shift left a certain amount of digits */ +int mp_lshd (mp_int * a, int b) +{ + int x, res; + + /* if its less than zero return */ + if (b <= 0) { + return MP_OKAY; + } + + /* grow to fit the new digits */ + if (a->alloc < a->used + b) { + if ((res = mp_grow (a, a->used + b)) != MP_OKAY) { + return res; + } + } + + { + register mp_digit *top, *bottom; + + /* increment the used by the shift amount then copy upwards */ + a->used += b; + + /* top */ + top = a->dp + a->used - 1; + + /* base */ + bottom = a->dp + a->used - 1 - b; + + /* much like mp_rshd this is implemented using a sliding window + * except the window goes the otherway around. Copying from + * the bottom to the top. see bn_mp_rshd.c for more info. + */ + for (x = a->used - 1; x >= b; x--) { + *top-- = *bottom--; + } + + /* zero the lower digits */ + top = a->dp; + for (x = 0; x < b; x++) { + *top++ = 0; + } + } + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_lshd.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod.c @@ -0,0 +1,48 @@ +#include +#ifdef BN_MP_MOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* c = a mod b, 0 <= c < b if b > 0, b < c <= 0 if b < 0 */ +int +mp_mod (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int t; + int res; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_div (a, b, NULL, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + + if (mp_iszero(&t) || t.sign == b->sign) { + res = MP_OKAY; + mp_exch (&t, c); + } else { + res = mp_add (b, &t, c); + } + + mp_clear (&t); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mod.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod_2d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod_2d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod_2d.c @@ -0,0 +1,55 @@ +#include +#ifdef BN_MP_MOD_2D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* calc a value mod 2**b */ +int +mp_mod_2d (mp_int * a, int b, mp_int * c) +{ + int x, res; + + /* if b is <= 0 then zero the int */ + if (b <= 0) { + mp_zero (c); + return MP_OKAY; + } + + /* if the modulus is larger than the value than return */ + if (b >= (int) (a->used * DIGIT_BIT)) { + res = mp_copy (a, c); + return res; + } + + /* copy */ + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + + /* zero digits above the last digit of the modulus */ + for (x = (b / DIGIT_BIT) + ((b % DIGIT_BIT) == 0 ? 0 : 1); x < c->used; x++) { + c->dp[x] = 0; + } + /* clear the digit that is not completely outside/inside the modulus */ + c->dp[b / DIGIT_BIT] &= + (mp_digit) ((((mp_digit) 1) << (((mp_digit) b) % DIGIT_BIT)) - ((mp_digit) 1)); + mp_clamp (c); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mod_2d.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod_d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod_d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mod_d.c @@ -0,0 +1,27 @@ +#include +#ifdef BN_MP_MOD_D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +int +mp_mod_d (mp_int * a, mp_digit b, mp_digit * c) +{ + return mp_div_d(a, b, NULL, c); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mod_d.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_calc_normalization.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_calc_normalization.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_calc_normalization.c @@ -0,0 +1,59 @@ +#include +#ifdef BN_MP_MONTGOMERY_CALC_NORMALIZATION_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* + * shifts with subtractions when the result is greater than b. + * + * The method is slightly modified to shift B unconditionally upto just under + * the leading bit of b. This saves alot of multiple precision shifting. + */ +int mp_montgomery_calc_normalization (mp_int * a, mp_int * b) +{ + int x, bits, res; + + /* how many bits of last digit does b use */ + bits = mp_count_bits (b) % DIGIT_BIT; + + if (b->used > 1) { + if ((res = mp_2expt (a, (b->used - 1) * DIGIT_BIT + bits - 1)) != MP_OKAY) { + return res; + } + } else { + mp_set(a, 1); + bits = 1; + } + + + /* now compute C = A * B mod b */ + for (x = bits - 1; x < (int)DIGIT_BIT; x++) { + if ((res = mp_mul_2 (a, a)) != MP_OKAY) { + return res; + } + if (mp_cmp_mag (a, b) != MP_LT) { + if ((res = s_mp_sub (a, b, a)) != MP_OKAY) { + return res; + } + } + } + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_montgomery_calc_normalization.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_reduce.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_reduce.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_reduce.c @@ -0,0 +1,118 @@ +#include +#ifdef BN_MP_MONTGOMERY_REDUCE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes xR**-1 == x (mod N) via Montgomery Reduction */ +int +mp_montgomery_reduce (mp_int * x, mp_int * n, mp_digit rho) +{ + int ix, res, digs; + mp_digit mu; + + /* can the fast reduction [comba] method be used? + * + * Note that unlike in mul you're safely allowed *less* + * than the available columns [255 per default] since carries + * are fixed up in the inner loop. + */ + digs = n->used * 2 + 1; + if ((digs < MP_WARRAY) && + n->used < + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_mp_montgomery_reduce (x, n, rho); + } + + /* grow the input as required */ + if (x->alloc < digs) { + if ((res = mp_grow (x, digs)) != MP_OKAY) { + return res; + } + } + x->used = digs; + + for (ix = 0; ix < n->used; ix++) { + /* mu = ai * rho mod b + * + * The value of rho must be precalculated via + * montgomery_setup() such that + * it equals -1/n0 mod b this allows the + * following inner loop to reduce the + * input one digit at a time + */ + mu = (mp_digit) (((mp_word)x->dp[ix]) * ((mp_word)rho) & MP_MASK); + + /* a = a + mu * m * b**i */ + { + register int iy; + register mp_digit *tmpn, *tmpx, u; + register mp_word r; + + /* alias for digits of the modulus */ + tmpn = n->dp; + + /* alias for the digits of x [the input] */ + tmpx = x->dp + ix; + + /* set the carry to zero */ + u = 0; + + /* Multiply and add in place */ + for (iy = 0; iy < n->used; iy++) { + /* compute product and sum */ + r = ((mp_word)mu) * ((mp_word)*tmpn++) + + ((mp_word) u) + ((mp_word) * tmpx); + + /* get carry */ + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + + /* fix digit */ + *tmpx++ = (mp_digit)(r & ((mp_word) MP_MASK)); + } + /* At this point the ix'th digit of x should be zero */ + + + /* propagate carries upwards as required*/ + while (u) { + *tmpx += u; + u = *tmpx >> DIGIT_BIT; + *tmpx++ &= MP_MASK; + } + } + } + + /* at this point the n.used'th least + * significant digits of x are all zero + * which means we can shift x to the + * right by n.used digits and the + * residue is unchanged. + */ + + /* x = x/b**n.used */ + mp_clamp(x); + mp_rshd (x, n->used); + + /* if x >= n then x = x - n */ + if (mp_cmp_mag (x, n) != MP_LT) { + return s_mp_sub (x, n, x); + } + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_montgomery_reduce.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_setup.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_setup.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_montgomery_setup.c @@ -0,0 +1,59 @@ +#include +#ifdef BN_MP_MONTGOMERY_SETUP_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* setups the montgomery reduction stuff */ +int +mp_montgomery_setup (mp_int * n, mp_digit * rho) +{ + mp_digit x, b; + +/* fast inversion mod 2**k + * + * Based on the fact that + * + * XA = 1 (mod 2**n) => (X(2-XA)) A = 1 (mod 2**2n) + * => 2*X*A - X*X*A*A = 1 + * => 2*(1) - (1) = 1 + */ + b = n->dp[0]; + + if ((b & 1) == 0) { + return MP_VAL; + } + + x = (((b + 2) & 4) << 1) + b; /* here x*a==1 mod 2**4 */ + x *= 2 - b * x; /* here x*a==1 mod 2**8 */ +#if !defined(MP_8BIT) + x *= 2 - b * x; /* here x*a==1 mod 2**16 */ +#endif +#if defined(MP_64BIT) || !(defined(MP_8BIT) || defined(MP_16BIT)) + x *= 2 - b * x; /* here x*a==1 mod 2**32 */ +#endif +#ifdef MP_64BIT + x *= 2 - b * x; /* here x*a==1 mod 2**64 */ +#endif + + /* rho = -1/m mod b */ + *rho = (unsigned long)(((mp_word)1 << ((mp_word) DIGIT_BIT)) - x) & MP_MASK; + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_montgomery_setup.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul.c @@ -0,0 +1,66 @@ +#include +#ifdef BN_MP_MUL_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* high level multiplication (handles sign) */ +int mp_mul (mp_int * a, mp_int * b, mp_int * c) +{ + int res, neg; + neg = (a->sign == b->sign) ? MP_ZPOS : MP_NEG; + + /* use Toom-Cook? */ +#ifdef BN_MP_TOOM_MUL_C + if (MIN (a->used, b->used) >= TOOM_MUL_CUTOFF) { + res = mp_toom_mul(a, b, c); + } else +#endif +#ifdef BN_MP_KARATSUBA_MUL_C + /* use Karatsuba? */ + if (MIN (a->used, b->used) >= KARATSUBA_MUL_CUTOFF) { + res = mp_karatsuba_mul (a, b, c); + } else +#endif + { + /* can we use the fast multiplier? + * + * The fast multiplier can be used if the output will + * have less than MP_WARRAY digits and the number of + * digits won't affect carry propagation + */ + int digs = a->used + b->used + 1; + +#ifdef BN_FAST_S_MP_MUL_DIGS_C + if ((digs < MP_WARRAY) && + MIN(a->used, b->used) <= + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + res = fast_s_mp_mul_digs (a, b, c, digs); + } else +#endif +#ifdef BN_S_MP_MUL_DIGS_C + res = s_mp_mul (a, b, c); /* uses s_mp_mul_digs */ +#else + res = MP_VAL; +#endif + + } + c->sign = (c->used > 0) ? neg : MP_ZPOS; + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mul.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_2.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_2.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_2.c @@ -0,0 +1,82 @@ +#include +#ifdef BN_MP_MUL_2_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* b = a*2 */ +int mp_mul_2(mp_int * a, mp_int * b) +{ + int x, res, oldused; + + /* grow to accomodate result */ + if (b->alloc < a->used + 1) { + if ((res = mp_grow (b, a->used + 1)) != MP_OKAY) { + return res; + } + } + + oldused = b->used; + b->used = a->used; + + { + register mp_digit r, rr, *tmpa, *tmpb; + + /* alias for source */ + tmpa = a->dp; + + /* alias for dest */ + tmpb = b->dp; + + /* carry */ + r = 0; + for (x = 0; x < a->used; x++) { + + /* get what will be the *next* carry bit from the + * MSB of the current digit + */ + rr = *tmpa >> ((mp_digit)(DIGIT_BIT - 1)); + + /* now shift up this digit, add in the carry [from the previous] */ + *tmpb++ = ((*tmpa++ << ((mp_digit)1)) | r) & MP_MASK; + + /* copy the carry that would be from the source + * digit into the next iteration + */ + r = rr; + } + + /* new leading digit? */ + if (r != 0) { + /* add a MSB which is always 1 at this point */ + *tmpb = 1; + ++(b->used); + } + + /* now zero any excess digits on the destination + * that we didn't write to + */ + tmpb = b->dp + b->used; + for (x = b->used; x < oldused; x++) { + *tmpb++ = 0; + } + } + b->sign = a->sign; + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mul_2.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_2d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_2d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_2d.c @@ -0,0 +1,85 @@ +#include +#ifdef BN_MP_MUL_2D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* shift left by a certain bit count */ +int mp_mul_2d (mp_int * a, int b, mp_int * c) +{ + mp_digit d; + int res; + + /* copy */ + if (a != c) { + if ((res = mp_copy (a, c)) != MP_OKAY) { + return res; + } + } + + if (c->alloc < (int)(c->used + b/DIGIT_BIT + 1)) { + if ((res = mp_grow (c, c->used + b / DIGIT_BIT + 1)) != MP_OKAY) { + return res; + } + } + + /* shift by as many digits in the bit count */ + if (b >= (int)DIGIT_BIT) { + if ((res = mp_lshd (c, b / DIGIT_BIT)) != MP_OKAY) { + return res; + } + } + + /* shift any bit count < DIGIT_BIT */ + d = (mp_digit) (b % DIGIT_BIT); + if (d != 0) { + register mp_digit *tmpc, shift, mask, r, rr; + register int x; + + /* bitmask for carries */ + mask = (((mp_digit)1) << d) - 1; + + /* shift for msbs */ + shift = DIGIT_BIT - d; + + /* alias */ + tmpc = c->dp; + + /* carry */ + r = 0; + for (x = 0; x < c->used; x++) { + /* get the higher bits of the current word */ + rr = (*tmpc >> shift) & mask; + + /* shift the current word and OR in the carry */ + *tmpc = ((*tmpc << d) | r) & MP_MASK; + ++tmpc; + + /* set the carry to the carry bits of the current word */ + r = rr; + } + + /* set final carry */ + if (r != 0) { + c->dp[(c->used)++] = r; + } + } + mp_clamp (c); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mul_2d.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mul_d.c @@ -0,0 +1,79 @@ +#include +#ifdef BN_MP_MUL_D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* multiply by a digit */ +int +mp_mul_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_digit u, *tmpa, *tmpc; + mp_word r; + int ix, res, olduse; + + /* make sure c is big enough to hold a*b */ + if (c->alloc < a->used + 1) { + if ((res = mp_grow (c, a->used + 1)) != MP_OKAY) { + return res; + } + } + + /* get the original destinations used count */ + olduse = c->used; + + /* set the sign */ + c->sign = a->sign; + + /* alias for a->dp [source] */ + tmpa = a->dp; + + /* alias for c->dp [dest] */ + tmpc = c->dp; + + /* zero carry */ + u = 0; + + /* compute columns */ + for (ix = 0; ix < a->used; ix++) { + /* compute product and carry sum for this term */ + r = ((mp_word) u) + ((mp_word)*tmpa++) * ((mp_word)b); + + /* mask off higher bits to get a single digit */ + *tmpc++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* send carry into next iteration */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + + /* store final carry [if any] and increment ix offset */ + *tmpc++ = u; + ++ix; + + /* now zero digits above the top */ + while (ix++ < olduse) { + *tmpc++ = 0; + } + + /* set used count */ + c->used = a->used + 1; + mp_clamp(c); + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mul_d.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mulmod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mulmod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_mulmod.c @@ -0,0 +1,40 @@ +#include +#ifdef BN_MP_MULMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* d = a * b (mod c) */ +int mp_mulmod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_mul (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_mulmod.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_n_root.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_n_root.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_n_root.c @@ -0,0 +1,132 @@ +#include +#ifdef BN_MP_N_ROOT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* find the n'th root of an integer + * + * Result found such that (c)**b <= a and (c+1)**b > a + * + * This algorithm uses Newton's approximation + * x[i+1] = x[i] - f(x[i])/f'(x[i]) + * which will find the root in log(N) time where + * each step involves a fair bit. This is not meant to + * find huge roots [square and cube, etc]. + */ +int mp_n_root (mp_int * a, mp_digit b, mp_int * c) +{ + mp_int t1, t2, t3; + int res, neg; + + /* input must be positive if b is even */ + if ((b & 1) == 0 && a->sign == MP_NEG) { + return MP_VAL; + } + + if ((res = mp_init (&t1)) != MP_OKAY) { + return res; + } + + if ((res = mp_init (&t2)) != MP_OKAY) { + goto LBL_T1; + } + + if ((res = mp_init (&t3)) != MP_OKAY) { + goto LBL_T2; + } + + /* if a is negative fudge the sign but keep track */ + neg = a->sign; + a->sign = MP_ZPOS; + + /* t2 = 2 */ + mp_set (&t2, 2); + + do { + /* t1 = t2 */ + if ((res = mp_copy (&t2, &t1)) != MP_OKAY) { + goto LBL_T3; + } + + /* t2 = t1 - ((t1**b - a) / (b * t1**(b-1))) */ + + /* t3 = t1**(b-1) */ + if ((res = mp_expt_d (&t1, b - 1, &t3)) != MP_OKAY) { + goto LBL_T3; + } + + /* numerator */ + /* t2 = t1**b */ + if ((res = mp_mul (&t3, &t1, &t2)) != MP_OKAY) { + goto LBL_T3; + } + + /* t2 = t1**b - a */ + if ((res = mp_sub (&t2, a, &t2)) != MP_OKAY) { + goto LBL_T3; + } + + /* denominator */ + /* t3 = t1**(b-1) * b */ + if ((res = mp_mul_d (&t3, b, &t3)) != MP_OKAY) { + goto LBL_T3; + } + + /* t3 = (t1**b - a)/(b * t1**(b-1)) */ + if ((res = mp_div (&t2, &t3, &t3, NULL)) != MP_OKAY) { + goto LBL_T3; + } + + if ((res = mp_sub (&t1, &t3, &t2)) != MP_OKAY) { + goto LBL_T3; + } + } while (mp_cmp (&t1, &t2) != MP_EQ); + + /* result can be off by a few so check */ + for (;;) { + if ((res = mp_expt_d (&t1, b, &t2)) != MP_OKAY) { + goto LBL_T3; + } + + if (mp_cmp (&t2, a) == MP_GT) { + if ((res = mp_sub_d (&t1, 1, &t1)) != MP_OKAY) { + goto LBL_T3; + } + } else { + break; + } + } + + /* reset the sign of a first */ + a->sign = neg; + + /* set the result */ + mp_exch (&t1, c); + + /* set the sign of the result */ + c->sign = neg; + + res = MP_OKAY; + +LBL_T3:mp_clear (&t3); +LBL_T2:mp_clear (&t2); +LBL_T1:mp_clear (&t1); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_n_root.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_neg.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_neg.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_neg.c @@ -0,0 +1,40 @@ +#include +#ifdef BN_MP_NEG_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* b = -a */ +int mp_neg (mp_int * a, mp_int * b) +{ + int res; + if (a != b) { + if ((res = mp_copy (a, b)) != MP_OKAY) { + return res; + } + } + + if (mp_iszero(b) != MP_YES) { + b->sign = (a->sign == MP_ZPOS) ? MP_NEG : MP_ZPOS; + } else { + b->sign = MP_ZPOS; + } + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_neg.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_or.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_or.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_or.c @@ -0,0 +1,50 @@ +#include +#ifdef BN_MP_OR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* OR two ints together */ +int mp_or (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] |= x->dp[ix]; + } + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_or.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_fermat.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_fermat.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_fermat.c @@ -0,0 +1,62 @@ +#include +#ifdef BN_MP_PRIME_FERMAT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* performs one Fermat test. + * + * If "a" were prime then b**a == b (mod a) since the order of + * the multiplicative sub-group would be phi(a) = a-1. That means + * it would be the same as b**(a mod (a-1)) == b**1 == b (mod a). + * + * Sets result to 1 if the congruence holds, or zero otherwise. + */ +int mp_prime_fermat (mp_int * a, mp_int * b, int *result) +{ + mp_int t; + int err; + + /* default to composite */ + *result = MP_NO; + + /* ensure b > 1 */ + if (mp_cmp_d(b, 1) != MP_GT) { + return MP_VAL; + } + + /* init t */ + if ((err = mp_init (&t)) != MP_OKAY) { + return err; + } + + /* compute t = b**a mod a */ + if ((err = mp_exptmod (b, a, a, &t)) != MP_OKAY) { + goto LBL_T; + } + + /* is it equal to b? */ + if (mp_cmp (&t, b) == MP_EQ) { + *result = MP_YES; + } + + err = MP_OKAY; +LBL_T:mp_clear (&t); + return err; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_prime_fermat.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_is_divisible.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_is_divisible.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_is_divisible.c @@ -0,0 +1,50 @@ +#include +#ifdef BN_MP_PRIME_IS_DIVISIBLE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* determines if an integers is divisible by one + * of the first PRIME_SIZE primes or not + * + * sets result to 0 if not, 1 if yes + */ +int mp_prime_is_divisible (mp_int * a, int *result) +{ + int err, ix; + mp_digit res; + + /* default to not */ + *result = MP_NO; + + for (ix = 0; ix < PRIME_SIZE; ix++) { + /* what is a mod LBL_prime_tab[ix] */ + if ((err = mp_mod_d (a, ltm_prime_tab[ix], &res)) != MP_OKAY) { + return err; + } + + /* is the residue zero? */ + if (res == 0) { + *result = MP_YES; + return MP_OKAY; + } + } + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_prime_is_divisible.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_is_prime.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_is_prime.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_is_prime.c @@ -0,0 +1,83 @@ +#include +#ifdef BN_MP_PRIME_IS_PRIME_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* performs a variable number of rounds of Miller-Rabin + * + * Probability of error after t rounds is no more than + + * + * Sets result to 1 if probably prime, 0 otherwise + */ +int mp_prime_is_prime (mp_int * a, int t, int *result) +{ + mp_int b; + int ix, err, res; + + /* default to no */ + *result = MP_NO; + + /* valid value of t? */ + if (t <= 0 || t > PRIME_SIZE) { + return MP_VAL; + } + + /* is the input equal to one of the primes in the table? */ + for (ix = 0; ix < PRIME_SIZE; ix++) { + if (mp_cmp_d(a, ltm_prime_tab[ix]) == MP_EQ) { + *result = 1; + return MP_OKAY; + } + } + + /* first perform trial division */ + if ((err = mp_prime_is_divisible (a, &res)) != MP_OKAY) { + return err; + } + + /* return if it was trivially divisible */ + if (res == MP_YES) { + return MP_OKAY; + } + + /* now perform the miller-rabin rounds */ + if ((err = mp_init (&b)) != MP_OKAY) { + return err; + } + + for (ix = 0; ix < t; ix++) { + /* set the prime */ + mp_set (&b, ltm_prime_tab[ix]); + + if ((err = mp_prime_miller_rabin (a, &b, &res)) != MP_OKAY) { + goto LBL_B; + } + + if (res == MP_NO) { + goto LBL_B; + } + } + + /* passed the test */ + *result = MP_YES; +LBL_B:mp_clear (&b); + return err; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_prime_is_prime.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_miller_rabin.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_miller_rabin.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_miller_rabin.c @@ -0,0 +1,103 @@ +#include +#ifdef BN_MP_PRIME_MILLER_RABIN_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* Miller-Rabin test of "a" to the base of "b" as described in + * HAC pp. 139 Algorithm 4.24 + * + * Sets result to 0 if definitely composite or 1 if probably prime. + * Randomly the chance of error is no more than 1/4 and often + * very much lower. + */ +int mp_prime_miller_rabin (mp_int * a, mp_int * b, int *result) +{ + mp_int n1, y, r; + int s, j, err; + + /* default */ + *result = MP_NO; + + /* ensure b > 1 */ + if (mp_cmp_d(b, 1) != MP_GT) { + return MP_VAL; + } + + /* get n1 = a - 1 */ + if ((err = mp_init_copy (&n1, a)) != MP_OKAY) { + return err; + } + if ((err = mp_sub_d (&n1, 1, &n1)) != MP_OKAY) { + goto LBL_N1; + } + + /* set 2**s * r = n1 */ + if ((err = mp_init_copy (&r, &n1)) != MP_OKAY) { + goto LBL_N1; + } + + /* count the number of least significant bits + * which are zero + */ + s = mp_cnt_lsb(&r); + + /* now divide n - 1 by 2**s */ + if ((err = mp_div_2d (&r, s, &r, NULL)) != MP_OKAY) { + goto LBL_R; + } + + /* compute y = b**r mod a */ + if ((err = mp_init (&y)) != MP_OKAY) { + goto LBL_R; + } + if ((err = mp_exptmod (b, &r, a, &y)) != MP_OKAY) { + goto LBL_Y; + } + + /* if y != 1 and y != n1 do */ + if (mp_cmp_d (&y, 1) != MP_EQ && mp_cmp (&y, &n1) != MP_EQ) { + j = 1; + /* while j <= s-1 and y != n1 */ + while ((j <= (s - 1)) && mp_cmp (&y, &n1) != MP_EQ) { + if ((err = mp_sqrmod (&y, a, &y)) != MP_OKAY) { + goto LBL_Y; + } + + /* if y == 1 then composite */ + if (mp_cmp_d (&y, 1) == MP_EQ) { + goto LBL_Y; + } + + ++j; + } + + /* if y != n1 then composite */ + if (mp_cmp (&y, &n1) != MP_EQ) { + goto LBL_Y; + } + } + + /* probably prime now */ + *result = MP_YES; +LBL_Y:mp_clear (&y); +LBL_R:mp_clear (&r); +LBL_N1:mp_clear (&n1); + return err; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_prime_miller_rabin.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_next_prime.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_next_prime.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_next_prime.c @@ -0,0 +1,170 @@ +#include +#ifdef BN_MP_PRIME_NEXT_PRIME_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + * + * bbs_style = 1 means the prime must be congruent to 3 mod 4 + */ +int mp_prime_next_prime(mp_int *a, int t, int bbs_style) +{ + int err, res = MP_NO, x, y; + mp_digit res_tab[PRIME_SIZE], step, kstep; + mp_int b; + + /* ensure t is valid */ + if (t <= 0 || t > PRIME_SIZE) { + return MP_VAL; + } + + /* force positive */ + a->sign = MP_ZPOS; + + /* simple algo if a is less than the largest prime in the table */ + if (mp_cmp_d(a, ltm_prime_tab[PRIME_SIZE-1]) == MP_LT) { + /* find which prime it is bigger than */ + for (x = PRIME_SIZE - 2; x >= 0; x--) { + if (mp_cmp_d(a, ltm_prime_tab[x]) != MP_LT) { + if (bbs_style == 1) { + /* ok we found a prime smaller or + * equal [so the next is larger] + * + * however, the prime must be + * congruent to 3 mod 4 + */ + if ((ltm_prime_tab[x + 1] & 3) != 3) { + /* scan upwards for a prime congruent to 3 mod 4 */ + for (y = x + 1; y < PRIME_SIZE; y++) { + if ((ltm_prime_tab[y] & 3) == 3) { + mp_set(a, ltm_prime_tab[y]); + return MP_OKAY; + } + } + } + } else { + mp_set(a, ltm_prime_tab[x + 1]); + return MP_OKAY; + } + } + } + /* at this point a maybe 1 */ + if (mp_cmp_d(a, 1) == MP_EQ) { + mp_set(a, 2); + return MP_OKAY; + } + /* fall through to the sieve */ + } + + /* generate a prime congruent to 3 mod 4 or 1/3 mod 4? */ + if (bbs_style == 1) { + kstep = 4; + } else { + kstep = 2; + } + + /* at this point we will use a combination of a sieve and Miller-Rabin */ + + if (bbs_style == 1) { + /* if a mod 4 != 3 subtract the correct value to make it so */ + if ((a->dp[0] & 3) != 3) { + if ((err = mp_sub_d(a, (a->dp[0] & 3) + 1, a)) != MP_OKAY) { return err; }; + } + } else { + if (mp_iseven(a) == 1) { + /* force odd */ + if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { + return err; + } + } + } + + /* generate the restable */ + for (x = 1; x < PRIME_SIZE; x++) { + if ((err = mp_mod_d(a, ltm_prime_tab[x], res_tab + x)) != MP_OKAY) { + return err; + } + } + + /* init temp used for Miller-Rabin Testing */ + if ((err = mp_init(&b)) != MP_OKAY) { + return err; + } + + for (;;) { + /* skip to the next non-trivially divisible candidate */ + step = 0; + do { + /* y == 1 if any residue was zero [e.g. cannot be prime] */ + y = 0; + + /* increase step to next candidate */ + step += kstep; + + /* compute the new residue without using division */ + for (x = 1; x < PRIME_SIZE; x++) { + /* add the step to each residue */ + res_tab[x] += kstep; + + /* subtract the modulus [instead of using division] */ + if (res_tab[x] >= ltm_prime_tab[x]) { + res_tab[x] -= ltm_prime_tab[x]; + } + + /* set flag if zero */ + if (res_tab[x] == 0) { + y = 1; + } + } + } while (y == 1 && step < ((((mp_digit)1)<= ((((mp_digit)1)< +#ifdef BN_MP_PRIME_RABIN_MILLER_TRIALS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + + +static const struct { + int k, t; +} sizes[] = { +{ 128, 28 }, +{ 256, 16 }, +{ 384, 10 }, +{ 512, 7 }, +{ 640, 6 }, +{ 768, 5 }, +{ 896, 4 }, +{ 1024, 4 } +}; + +/* returns # of RM trials required for a given bit size */ +int mp_prime_rabin_miller_trials(int size) +{ + int x; + + for (x = 0; x < (int)(sizeof(sizes)/(sizeof(sizes[0]))); x++) { + if (sizes[x].k == size) { + return sizes[x].t; + } else if (sizes[x].k > size) { + return (x == 0) ? sizes[0].t : sizes[x - 1].t; + } + } + return sizes[x-1].t + 1; +} + + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_prime_rabin_miller_trials.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_random_ex.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_random_ex.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_prime_random_ex.c @@ -0,0 +1,125 @@ +#include +#ifdef BN_MP_PRIME_RANDOM_EX_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* makes a truly random prime of a given size (bits), + * + * Flags are as follows: + * + * LTM_PRIME_BBS - make prime congruent to 3 mod 4 + * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) + * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero + * LTM_PRIME_2MSB_ON - make the 2nd highest bit one + * + * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can + * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself + * so it can be NULL + * + */ + +/* This is possibly the mother of all prime generation functions, muahahahahaha! */ +int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat) +{ + unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; + int res, err, bsize, maskOR_msb_offset; + + /* sanity check the input */ + if (size <= 1 || t <= 0) { + return MP_VAL; + } + + /* LTM_PRIME_SAFE implies LTM_PRIME_BBS */ + if (flags & LTM_PRIME_SAFE) { + flags |= LTM_PRIME_BBS; + } + + /* calc the byte size */ + bsize = (size>>3) + ((size&7)?1:0); + + /* we need a buffer of bsize bytes */ + tmp = OPT_CAST(unsigned char) XMALLOC(bsize); + if (tmp == NULL) { + return MP_MEM; + } + + /* calc the maskAND value for the MSbyte*/ + maskAND = ((size&7) == 0) ? 0xFF : (0xFF >> (8 - (size & 7))); + + /* calc the maskOR_msb */ + maskOR_msb = 0; + maskOR_msb_offset = ((size & 7) == 1) ? 1 : 0; + if (flags & LTM_PRIME_2MSB_ON) { + maskOR_msb |= 0x80 >> ((9 - size) & 7); + } + + /* get the maskOR_lsb */ + maskOR_lsb = 1; + if (flags & LTM_PRIME_BBS) { + maskOR_lsb |= 3; + } + + do { + /* read the bytes */ + if (cb(tmp, bsize, dat) != bsize) { + err = MP_VAL; + goto error; + } + + /* work over the MSbyte */ + tmp[0] &= maskAND; + tmp[0] |= 1 << ((size - 1) & 7); + + /* mix in the maskORs */ + tmp[maskOR_msb_offset] |= maskOR_msb; + tmp[bsize-1] |= maskOR_lsb; + + /* read it in */ + if ((err = mp_read_unsigned_bin(a, tmp, bsize)) != MP_OKAY) { goto error; } + + /* is it prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } + if (res == MP_NO) { + continue; + } + + if (flags & LTM_PRIME_SAFE) { + /* see if (a-1)/2 is prime */ + if ((err = mp_sub_d(a, 1, a)) != MP_OKAY) { goto error; } + if ((err = mp_div_2(a, a)) != MP_OKAY) { goto error; } + + /* is it prime? */ + if ((err = mp_prime_is_prime(a, t, &res)) != MP_OKAY) { goto error; } + } + } while (res == MP_NO); + + if (flags & LTM_PRIME_SAFE) { + /* restore a to the original value */ + if ((err = mp_mul_2(a, a)) != MP_OKAY) { goto error; } + if ((err = mp_add_d(a, 1, a)) != MP_OKAY) { goto error; } + } + + err = MP_OKAY; +error: + XFREE(tmp); + return err; +} + + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_prime_random_ex.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_radix_size.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_radix_size.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_radix_size.c @@ -0,0 +1,78 @@ +#include +#ifdef BN_MP_RADIX_SIZE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* returns size of ASCII reprensentation */ +int mp_radix_size (mp_int * a, int radix, int *size) +{ + int res, digs; + mp_int t; + mp_digit d; + + *size = 0; + + /* special case for binary */ + if (radix == 2) { + *size = mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1; + return MP_OKAY; + } + + /* make sure the radix is in range */ + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + if (mp_iszero(a) == MP_YES) { + *size = 2; + return MP_OKAY; + } + + /* digs is the digit count */ + digs = 0; + + /* if it's negative add one for the sign */ + if (a->sign == MP_NEG) { + ++digs; + } + + /* init a copy of the input */ + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + /* force temp to positive */ + t.sign = MP_ZPOS; + + /* fetch out all of the digits */ + while (mp_iszero (&t) == MP_NO) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + ++digs; + } + mp_clear (&t); + + /* return digs + 1, the 1 is for the NULL byte that would be required. */ + *size = digs + 1; + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_radix_size.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_radix_smap.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_radix_smap.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_radix_smap.c @@ -0,0 +1,24 @@ +#include +#ifdef BN_MP_RADIX_SMAP_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* chars used in radix conversions */ +const char *mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_radix_smap.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_rand.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_rand.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_rand.c @@ -0,0 +1,55 @@ +#include +#ifdef BN_MP_RAND_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* makes a pseudo-random int of a given size */ +int +mp_rand (mp_int * a, int digits) +{ + int res; + mp_digit d; + + mp_zero (a); + if (digits <= 0) { + return MP_OKAY; + } + + /* first place a random non-zero digit */ + do { + d = ((mp_digit) labs (rand ())) & MP_MASK; + } while (d == 0); + + if ((res = mp_add_d (a, d, a)) != MP_OKAY) { + return res; + } + + while (--digits > 0) { + if ((res = mp_lshd (a, 1)) != MP_OKAY) { + return res; + } + + if ((res = mp_add_d (a, ((mp_digit) labs (rand ())), a)) != MP_OKAY) { + return res; + } + } + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_rand.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_radix.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_radix.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_radix.c @@ -0,0 +1,85 @@ +#include +#ifdef BN_MP_READ_RADIX_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* read a string [ASCII] in a given radix */ +int mp_read_radix (mp_int * a, const char *str, int radix) +{ + int y, res, neg; + char ch; + + /* zero the digit bignum */ + mp_zero(a); + + /* make sure the radix is ok */ + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + /* if the leading digit is a + * minus set the sign to negative. + */ + if (*str == '-') { + ++str; + neg = MP_NEG; + } else { + neg = MP_ZPOS; + } + + /* set the integer to the default of zero */ + mp_zero (a); + + /* process each digit of the string */ + while (*str) { + /* if the radix < 36 the conversion is case insensitive + * this allows numbers like 1AB and 1ab to represent the same value + * [e.g. in hex] + */ + ch = (char) ((radix < 36) ? toupper (*str) : *str); + for (y = 0; y < 64; y++) { + if (ch == mp_s_rmap[y]) { + break; + } + } + + /* if the char was found in the map + * and is less than the given radix add it + * to the number, otherwise exit the loop. + */ + if (y < radix) { + if ((res = mp_mul_d (a, (mp_digit) radix, a)) != MP_OKAY) { + return res; + } + if ((res = mp_add_d (a, (mp_digit) y, a)) != MP_OKAY) { + return res; + } + } else { + break; + } + ++str; + } + + /* set the sign only if a != 0 */ + if (mp_iszero(a) != 1) { + a->sign = neg; + } + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_read_radix.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_signed_bin.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_signed_bin.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_signed_bin.c @@ -0,0 +1,41 @@ +#include +#ifdef BN_MP_READ_SIGNED_BIN_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* read signed bin, big endian, first byte is 0==positive or 1==negative */ +int mp_read_signed_bin (mp_int * a, const unsigned char *b, int c) +{ + int res; + + /* read magnitude */ + if ((res = mp_read_unsigned_bin (a, b + 1, c - 1)) != MP_OKAY) { + return res; + } + + /* first byte is 0 for positive, non-zero for negative */ + if (b[0] == 0) { + a->sign = MP_ZPOS; + } else { + a->sign = MP_NEG; + } + + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_read_signed_bin.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_unsigned_bin.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_unsigned_bin.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_read_unsigned_bin.c @@ -0,0 +1,55 @@ +#include +#ifdef BN_MP_READ_UNSIGNED_BIN_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* reads a unsigned char array, assumes the msb is stored first [big endian] */ +int mp_read_unsigned_bin (mp_int * a, const unsigned char *b, int c) +{ + int res; + + /* make sure there are at least two digits */ + if (a->alloc < 2) { + if ((res = mp_grow(a, 2)) != MP_OKAY) { + return res; + } + } + + /* zero the int */ + mp_zero (a); + + /* read the bytes in */ + while (c-- > 0) { + if ((res = mp_mul_2d (a, 8, a)) != MP_OKAY) { + return res; + } + +#ifndef MP_8BIT + a->dp[0] |= *b++; + a->used += 1; +#else + a->dp[0] = (*b & MP_MASK); + a->dp[1] |= ((*b++ >> 7U) & 1); + a->used += 2; +#endif + } + mp_clamp (a); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_read_unsigned_bin.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce.c @@ -0,0 +1,100 @@ +#include +#ifdef BN_MP_REDUCE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* reduces x mod m, assumes 0 < x < m**2, mu is + * precomputed via mp_reduce_setup. + * From HAC pp.604 Algorithm 14.42 + */ +int mp_reduce (mp_int * x, mp_int * m, mp_int * mu) +{ + mp_int q; + int res, um = m->used; + + /* q = x */ + if ((res = mp_init_copy (&q, x)) != MP_OKAY) { + return res; + } + + /* q1 = x / b**(k-1) */ + mp_rshd (&q, um - 1); + + /* according to HAC this optimization is ok */ + if (((unsigned long) um) > (((mp_digit)1) << (DIGIT_BIT - 1))) { + if ((res = mp_mul (&q, mu, &q)) != MP_OKAY) { + goto CLEANUP; + } + } else { +#ifdef BN_S_MP_MUL_HIGH_DIGS_C + if ((res = s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { + goto CLEANUP; + } +#elif defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) + if ((res = fast_s_mp_mul_high_digs (&q, mu, &q, um)) != MP_OKAY) { + goto CLEANUP; + } +#else + { + res = MP_VAL; + goto CLEANUP; + } +#endif + } + + /* q3 = q2 / b**(k+1) */ + mp_rshd (&q, um + 1); + + /* x = x mod b**(k+1), quick (no division) */ + if ((res = mp_mod_2d (x, DIGIT_BIT * (um + 1), x)) != MP_OKAY) { + goto CLEANUP; + } + + /* q = q * m mod b**(k+1), quick (no division) */ + if ((res = s_mp_mul_digs (&q, m, &q, um + 1)) != MP_OKAY) { + goto CLEANUP; + } + + /* x = x - q */ + if ((res = mp_sub (x, &q, x)) != MP_OKAY) { + goto CLEANUP; + } + + /* If x < 0, add b**(k+1) to it */ + if (mp_cmp_d (x, 0) == MP_LT) { + mp_set (&q, 1); + if ((res = mp_lshd (&q, um + 1)) != MP_OKAY) + goto CLEANUP; + if ((res = mp_add (x, &q, x)) != MP_OKAY) + goto CLEANUP; + } + + /* Back off if it's too big */ + while (mp_cmp (x, m) != MP_LT) { + if ((res = s_mp_sub (x, m, x)) != MP_OKAY) { + goto CLEANUP; + } + } + +CLEANUP: + mp_clear (&q); + + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k.c @@ -0,0 +1,61 @@ +#include +#ifdef BN_MP_REDUCE_2K_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* reduces a modulo n where n is of the form 2**p - d */ +int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d) +{ + mp_int q; + int p, res; + + if ((res = mp_init(&q)) != MP_OKAY) { + return res; + } + + p = mp_count_bits(n); +top: + /* q = a/2**p, a = a mod 2**p */ + if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { + goto ERR; + } + + if (d != 1) { + /* q = q * d */ + if ((res = mp_mul_d(&q, d, &q)) != MP_OKAY) { + goto ERR; + } + } + + /* a = a + q */ + if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { + goto ERR; + } + + if (mp_cmp_mag(a, n) != MP_LT) { + s_mp_sub(a, n, a); + goto top; + } + +ERR: + mp_clear(&q); + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce_2k.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_l.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_l.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_l.c @@ -0,0 +1,62 @@ +#include +#ifdef BN_MP_REDUCE_2K_L_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* reduces a modulo n where n is of the form 2**p - d + This differs from reduce_2k since "d" can be larger + than a single digit. +*/ +int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d) +{ + mp_int q; + int p, res; + + if ((res = mp_init(&q)) != MP_OKAY) { + return res; + } + + p = mp_count_bits(n); +top: + /* q = a/2**p, a = a mod 2**p */ + if ((res = mp_div_2d(a, p, &q, a)) != MP_OKAY) { + goto ERR; + } + + /* q = q * d */ + if ((res = mp_mul(&q, d, &q)) != MP_OKAY) { + goto ERR; + } + + /* a = a + q */ + if ((res = s_mp_add(a, &q, a)) != MP_OKAY) { + goto ERR; + } + + if (mp_cmp_mag(a, n) != MP_LT) { + s_mp_sub(a, n, a); + goto top; + } + +ERR: + mp_clear(&q); + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce_2k_l.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_setup.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_setup.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_setup.c @@ -0,0 +1,47 @@ +#include +#ifdef BN_MP_REDUCE_2K_SETUP_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* determines the setup value */ +int mp_reduce_2k_setup(mp_int *a, mp_digit *d) +{ + int res, p; + mp_int tmp; + + if ((res = mp_init(&tmp)) != MP_OKAY) { + return res; + } + + p = mp_count_bits(a); + if ((res = mp_2expt(&tmp, p)) != MP_OKAY) { + mp_clear(&tmp); + return res; + } + + if ((res = s_mp_sub(&tmp, a, &tmp)) != MP_OKAY) { + mp_clear(&tmp); + return res; + } + + *d = tmp.dp[0]; + mp_clear(&tmp); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce_2k_setup.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_setup_l.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_setup_l.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_2k_setup_l.c @@ -0,0 +1,44 @@ +#include +#ifdef BN_MP_REDUCE_2K_SETUP_L_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* determines the setup value */ +int mp_reduce_2k_setup_l(mp_int *a, mp_int *d) +{ + int res; + mp_int tmp; + + if ((res = mp_init(&tmp)) != MP_OKAY) { + return res; + } + + if ((res = mp_2expt(&tmp, mp_count_bits(a))) != MP_OKAY) { + goto ERR; + } + + if ((res = s_mp_sub(&tmp, a, d)) != MP_OKAY) { + goto ERR; + } + +ERR: + mp_clear(&tmp); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce_2k_setup_l.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_is_2k.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_is_2k.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_is_2k.c @@ -0,0 +1,52 @@ +#include +#ifdef BN_MP_REDUCE_IS_2K_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* determines if mp_reduce_2k can be used */ +int mp_reduce_is_2k(mp_int *a) +{ + int ix, iy, iw; + mp_digit iz; + + if (a->used == 0) { + return MP_NO; + } else if (a->used == 1) { + return MP_YES; + } else if (a->used > 1) { + iy = mp_count_bits(a); + iz = 1; + iw = 1; + + /* Test every bit from the second digit up, must be 1 */ + for (ix = DIGIT_BIT; ix < iy; ix++) { + if ((a->dp[iw] & iz) == 0) { + return MP_NO; + } + iz <<= 1; + if (iz > (mp_digit)MP_MASK) { + ++iw; + iz = 1; + } + } + } + return MP_YES; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce_is_2k.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_is_2k_l.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_is_2k_l.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_is_2k_l.c @@ -0,0 +1,44 @@ +#include +#ifdef BN_MP_REDUCE_IS_2K_L_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* determines if reduce_2k_l can be used */ +int mp_reduce_is_2k_l(mp_int *a) +{ + int ix, iy; + + if (a->used == 0) { + return MP_NO; + } else if (a->used == 1) { + return MP_YES; + } else if (a->used > 1) { + /* if more than half of the digits are -1 we're sold */ + for (iy = ix = 0; ix < a->used; ix++) { + if (a->dp[ix] == MP_MASK) { + ++iy; + } + } + return (iy >= (a->used/2)) ? MP_YES : MP_NO; + + } + return MP_NO; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce_is_2k_l.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_setup.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_setup.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_reduce_setup.c @@ -0,0 +1,34 @@ +#include +#ifdef BN_MP_REDUCE_SETUP_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* pre-calculate the value required for Barrett reduction + * For a given modulus "b" it calulates the value required in "a" + */ +int mp_reduce_setup (mp_int * a, mp_int * b) +{ + int res; + + if ((res = mp_2expt (a, b->used * 2 * DIGIT_BIT)) != MP_OKAY) { + return res; + } + return mp_div (a, b, a, NULL); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_reduce_setup.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_rshd.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_rshd.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_rshd.c @@ -0,0 +1,72 @@ +#include +#ifdef BN_MP_RSHD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* shift right a certain amount of digits */ +void mp_rshd (mp_int * a, int b) +{ + int x; + + /* if b <= 0 then ignore it */ + if (b <= 0) { + return; + } + + /* if b > used then simply zero it and return */ + if (a->used <= b) { + mp_zero (a); + return; + } + + { + register mp_digit *bottom, *top; + + /* shift the digits down */ + + /* bottom */ + bottom = a->dp; + + /* top [offset into digits] */ + top = a->dp + b; + + /* this is implemented as a sliding window where + * the window is b-digits long and digits from + * the top of the window are copied to the bottom + * + * e.g. + + b-2 | b-1 | b0 | b1 | b2 | ... | bb | ----> + /\ | ----> + \-------------------/ ----> + */ + for (x = 0; x < (a->used - b); x++) { + *bottom++ = *top++; + } + + /* zero the top digits */ + for (; x < a->used; x++) { + *bottom++ = 0; + } + } + + /* remove excess digits */ + a->used -= b; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_rshd.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_set.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_set.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_set.c @@ -0,0 +1,29 @@ +#include +#ifdef BN_MP_SET_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* set to a digit */ +void mp_set (mp_int * a, mp_digit b) +{ + mp_zero (a); + a->dp[0] = b & MP_MASK; + a->used = (a->dp[0] != 0) ? 1 : 0; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_set.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_set_int.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_set_int.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_set_int.c @@ -0,0 +1,48 @@ +#include +#ifdef BN_MP_SET_INT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* set a 32-bit const */ +int mp_set_int (mp_int * a, unsigned long b) +{ + int x, res; + + mp_zero (a); + + /* set four bits at a time */ + for (x = 0; x < 8; x++) { + /* shift the number up four bits */ + if ((res = mp_mul_2d (a, 4, a)) != MP_OKAY) { + return res; + } + + /* OR in the top four bits of the source */ + a->dp[0] |= (b >> 28) & 15; + + /* shift the source up to the next four bits */ + b <<= 4; + + /* ensure that digits are not clamped off */ + a->used += 1; + } + mp_clamp (a); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_set_int.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_shrink.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_shrink.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_shrink.c @@ -0,0 +1,40 @@ +#include +#ifdef BN_MP_SHRINK_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* shrink a bignum */ +int mp_shrink (mp_int * a) +{ + mp_digit *tmp; + int used = 1; + + if(a->used > 0) + used = a->used; + + if (a->alloc != used) { + if ((tmp = OPT_CAST(mp_digit) XREALLOC (a->dp, sizeof (mp_digit) * used)) == NULL) { + return MP_MEM; + } + a->dp = tmp; + a->alloc = used; + } + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_shrink.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_signed_bin_size.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_signed_bin_size.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_signed_bin_size.c @@ -0,0 +1,27 @@ +#include +#ifdef BN_MP_SIGNED_BIN_SIZE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* get the size for an signed equivalent */ +int mp_signed_bin_size (mp_int * a) +{ + return 1 + mp_unsigned_bin_size (a); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_signed_bin_size.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqr.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqr.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqr.c @@ -0,0 +1,58 @@ +#include +#ifdef BN_MP_SQR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* computes b = a*a */ +int +mp_sqr (mp_int * a, mp_int * b) +{ + int res; + +#ifdef BN_MP_TOOM_SQR_C + /* use Toom-Cook? */ + if (a->used >= TOOM_SQR_CUTOFF) { + res = mp_toom_sqr(a, b); + /* Karatsuba? */ + } else +#endif +#ifdef BN_MP_KARATSUBA_SQR_C +if (a->used >= KARATSUBA_SQR_CUTOFF) { + res = mp_karatsuba_sqr (a, b); + } else +#endif + { +#ifdef BN_FAST_S_MP_SQR_C + /* can we use the fast comba multiplier? */ + if ((a->used * 2 + 1) < MP_WARRAY && + a->used < + (1 << (sizeof(mp_word) * CHAR_BIT - 2*DIGIT_BIT - 1))) { + res = fast_s_mp_sqr (a, b); + } else +#endif +#ifdef BN_S_MP_SQR_C + res = s_mp_sqr (a, b); +#else + res = MP_VAL; +#endif + } + b->sign = MP_ZPOS; + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_sqr.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqrmod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqrmod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqrmod.c @@ -0,0 +1,41 @@ +#include +#ifdef BN_MP_SQRMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* c = a * a (mod b) */ +int +mp_sqrmod (mp_int * a, mp_int * b, mp_int * c) +{ + int res; + mp_int t; + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_sqr (a, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, b, c); + mp_clear (&t); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_sqrmod.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqrt.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqrt.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sqrt.c @@ -0,0 +1,81 @@ +#include +#ifdef BN_MP_SQRT_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* this function is less generic than mp_n_root, simpler and faster */ +int mp_sqrt(mp_int *arg, mp_int *ret) +{ + int res; + mp_int t1,t2; + + /* must be positive */ + if (arg->sign == MP_NEG) { + return MP_VAL; + } + + /* easy out */ + if (mp_iszero(arg) == MP_YES) { + mp_zero(ret); + return MP_OKAY; + } + + if ((res = mp_init_copy(&t1, arg)) != MP_OKAY) { + return res; + } + + if ((res = mp_init(&t2)) != MP_OKAY) { + goto E2; + } + + /* First approx. (not very bad for large arg) */ + mp_rshd (&t1,t1.used/2); + + /* t1 > 0 */ + if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { + goto E1; + } + if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { + goto E1; + } + if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { + goto E1; + } + /* And now t1 > sqrt(arg) */ + do { + if ((res = mp_div(arg,&t1,&t2,NULL)) != MP_OKAY) { + goto E1; + } + if ((res = mp_add(&t1,&t2,&t1)) != MP_OKAY) { + goto E1; + } + if ((res = mp_div_2(&t1,&t1)) != MP_OKAY) { + goto E1; + } + /* t1 >= sqrt(arg) >= t2 at this point */ + } while (mp_cmp_mag(&t1,&t2) == MP_GT); + + mp_exch(&t1,ret); + +E1: mp_clear(&t2); +E2: mp_clear(&t1); + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_sqrt.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sub.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sub.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sub.c @@ -0,0 +1,59 @@ +#include +#ifdef BN_MP_SUB_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* high level subtraction (handles signs) */ +int +mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int sa, sb, res; + + sa = a->sign; + sb = b->sign; + + if (sa != sb) { + /* subtract a negative from a positive, OR */ + /* subtract a positive from a negative. */ + /* In either case, ADD their magnitudes, */ + /* and use the sign of the first number. */ + c->sign = sa; + res = s_mp_add (a, b, c); + } else { + /* subtract a positive from a positive, OR */ + /* subtract a negative from a negative. */ + /* First, take the difference between their */ + /* magnitudes, then... */ + if (mp_cmp_mag (a, b) != MP_LT) { + /* Copy the sign from the first */ + c->sign = sa; + /* The first has a larger or equal magnitude */ + res = s_mp_sub (a, b, c); + } else { + /* The result has the *opposite* sign from */ + /* the first number. */ + c->sign = (sa == MP_ZPOS) ? MP_NEG : MP_ZPOS; + /* The second has a larger magnitude */ + res = s_mp_sub (b, a, c); + } + } + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_sub.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sub_d.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sub_d.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_sub_d.c @@ -0,0 +1,93 @@ +#include +#ifdef BN_MP_SUB_D_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* single digit subtraction */ +int +mp_sub_d (mp_int * a, mp_digit b, mp_int * c) +{ + mp_digit *tmpa, *tmpc, mu; + int res, ix, oldused; + + /* grow c as required */ + if (c->alloc < a->used + 1) { + if ((res = mp_grow(c, a->used + 1)) != MP_OKAY) { + return res; + } + } + + /* if a is negative just do an unsigned + * addition [with fudged signs] + */ + if (a->sign == MP_NEG) { + a->sign = MP_ZPOS; + res = mp_add_d(a, b, c); + a->sign = c->sign = MP_NEG; + + /* clamp */ + mp_clamp(c); + + return res; + } + + /* setup regs */ + oldused = c->used; + tmpa = a->dp; + tmpc = c->dp; + + /* if a <= b simply fix the single digit */ + if ((a->used == 1 && a->dp[0] <= b) || a->used == 0) { + if (a->used == 1) { + *tmpc++ = b - *tmpa; + } else { + *tmpc++ = b; + } + ix = 1; + + /* negative/1digit */ + c->sign = MP_NEG; + c->used = 1; + } else { + /* positive/size */ + c->sign = MP_ZPOS; + c->used = a->used; + + /* subtract first digit */ + *tmpc = *tmpa++ - b; + mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); + *tmpc++ &= MP_MASK; + + /* handle rest of the digits */ + for (ix = 1; ix < a->used; ix++) { + *tmpc = *tmpa++ - mu; + mu = *tmpc >> (sizeof(mp_digit) * CHAR_BIT - 1); + *tmpc++ &= MP_MASK; + } + } + + /* zero excess digits */ + while (ix++ < oldused) { + *tmpc++ = 0; + } + mp_clamp(c); + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_sub_d.c,v $ */ +/* $Revision: 1.6 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_submod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_submod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_submod.c @@ -0,0 +1,42 @@ +#include +#ifdef BN_MP_SUBMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* d = a - b (mod c) */ +int +mp_submod (mp_int * a, mp_int * b, mp_int * c, mp_int * d) +{ + int res; + mp_int t; + + + if ((res = mp_init (&t)) != MP_OKAY) { + return res; + } + + if ((res = mp_sub (a, b, &t)) != MP_OKAY) { + mp_clear (&t); + return res; + } + res = mp_mod (&t, c, d); + mp_clear (&t); + return res; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_submod.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_signed_bin.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_signed_bin.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_signed_bin.c @@ -0,0 +1,33 @@ +#include +#ifdef BN_MP_TO_SIGNED_BIN_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* store in signed [big endian] format */ +int mp_to_signed_bin (mp_int * a, unsigned char *b) +{ + int res; + + if ((res = mp_to_unsigned_bin (a, b + 1)) != MP_OKAY) { + return res; + } + b[0] = (unsigned char) ((a->sign == MP_ZPOS) ? 0 : 1); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_to_signed_bin.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_signed_bin_n.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_signed_bin_n.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_signed_bin_n.c @@ -0,0 +1,31 @@ +#include +#ifdef BN_MP_TO_SIGNED_BIN_N_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* store in signed [big endian] format */ +int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen) +{ + if (*outlen < (unsigned long)mp_signed_bin_size(a)) { + return MP_VAL; + } + *outlen = mp_signed_bin_size(a); + return mp_to_signed_bin(a, b); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_to_signed_bin_n.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_unsigned_bin.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_unsigned_bin.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_unsigned_bin.c @@ -0,0 +1,48 @@ +#include +#ifdef BN_MP_TO_UNSIGNED_BIN_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* store in unsigned [big endian] format */ +int mp_to_unsigned_bin (mp_int * a, unsigned char *b) +{ + int x, res; + mp_int t; + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + x = 0; + while (mp_iszero (&t) == 0) { +#ifndef MP_8BIT + b[x++] = (unsigned char) (t.dp[0] & 255); +#else + b[x++] = (unsigned char) (t.dp[0] | ((t.dp[1] & 0x01) << 7)); +#endif + if ((res = mp_div_2d (&t, 8, &t, NULL)) != MP_OKAY) { + mp_clear (&t); + return res; + } + } + bn_reverse (b, x); + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_to_unsigned_bin.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_unsigned_bin_n.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_unsigned_bin_n.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_to_unsigned_bin_n.c @@ -0,0 +1,31 @@ +#include +#ifdef BN_MP_TO_UNSIGNED_BIN_N_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* store in unsigned [big endian] format */ +int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen) +{ + if (*outlen < (unsigned long)mp_unsigned_bin_size(a)) { + return MP_VAL; + } + *outlen = mp_unsigned_bin_size(a); + return mp_to_unsigned_bin(a, b); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_to_unsigned_bin_n.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toom_mul.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toom_mul.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toom_mul.c @@ -0,0 +1,284 @@ +#include +#ifdef BN_MP_TOOM_MUL_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* multiplication using the Toom-Cook 3-way algorithm + * + * Much more complicated than Karatsuba but has a lower + * asymptotic running time of O(N**1.464). This algorithm is + * only particularly useful on VERY large inputs + * (we're talking 1000s of digits here...). +*/ +int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c) +{ + mp_int w0, w1, w2, w3, w4, tmp1, tmp2, a0, a1, a2, b0, b1, b2; + int res, B; + + /* init temps */ + if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, + &a0, &a1, &a2, &b0, &b1, + &b2, &tmp1, &tmp2, NULL)) != MP_OKAY) { + return res; + } + + /* B */ + B = MIN(a->used, b->used) / 3; + + /* a = a2 * B**2 + a1 * B + a0 */ + if ((res = mp_mod_2d(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_copy(a, &a1)) != MP_OKAY) { + goto ERR; + } + mp_rshd(&a1, B); + mp_mod_2d(&a1, DIGIT_BIT * B, &a1); + + if ((res = mp_copy(a, &a2)) != MP_OKAY) { + goto ERR; + } + mp_rshd(&a2, B*2); + + /* b = b2 * B**2 + b1 * B + b0 */ + if ((res = mp_mod_2d(b, DIGIT_BIT * B, &b0)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_copy(b, &b1)) != MP_OKAY) { + goto ERR; + } + mp_rshd(&b1, B); + mp_mod_2d(&b1, DIGIT_BIT * B, &b1); + + if ((res = mp_copy(b, &b2)) != MP_OKAY) { + goto ERR; + } + mp_rshd(&b2, B*2); + + /* w0 = a0*b0 */ + if ((res = mp_mul(&a0, &b0, &w0)) != MP_OKAY) { + goto ERR; + } + + /* w4 = a2 * b2 */ + if ((res = mp_mul(&a2, &b2, &w4)) != MP_OKAY) { + goto ERR; + } + + /* w1 = (a2 + 2(a1 + 2a0))(b2 + 2(b1 + 2b0)) */ + if ((res = mp_mul_2(&a0, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_mul_2(&b0, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_mul_2(&tmp2, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp2, &b2, &tmp2)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_mul(&tmp1, &tmp2, &w1)) != MP_OKAY) { + goto ERR; + } + + /* w3 = (a0 + 2(a1 + 2a2))(b0 + 2(b1 + 2b2)) */ + if ((res = mp_mul_2(&a2, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_mul_2(&b2, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp2, &b1, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_mul_2(&tmp2, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_mul(&tmp1, &tmp2, &w3)) != MP_OKAY) { + goto ERR; + } + + + /* w2 = (a2 + a1 + a0)(b2 + b1 + b0) */ + if ((res = mp_add(&a2, &a1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&b2, &b1, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp2, &b0, &tmp2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_mul(&tmp1, &tmp2, &w2)) != MP_OKAY) { + goto ERR; + } + + /* now solve the matrix + + 0 0 0 0 1 + 1 2 4 8 16 + 1 1 1 1 1 + 16 8 4 2 1 + 1 0 0 0 0 + + using 12 subtractions, 4 shifts, + 2 small divisions and 1 small multiplication + */ + + /* r1 - r4 */ + if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - r0 */ + if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) { + goto ERR; + } + /* r1/2 */ + if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3/2 */ + if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) { + goto ERR; + } + /* r2 - r0 - r4 */ + if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) { + goto ERR; + } + /* r1 - r2 */ + if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - r2 */ + if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { + goto ERR; + } + /* r1 - 8r0 */ + if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - 8r4 */ + if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) { + goto ERR; + } + /* 3r2 - r1 - r3 */ + if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) { + goto ERR; + } + /* r1 - r2 */ + if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - r2 */ + if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { + goto ERR; + } + /* r1/3 */ + if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) { + goto ERR; + } + /* r3/3 */ + if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) { + goto ERR; + } + + /* at this point shift W[n] by B*n */ + if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_add(&w0, &w1, c)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, c, c)) != MP_OKAY) { + goto ERR; + } + +ERR: + mp_clear_multi(&w0, &w1, &w2, &w3, &w4, + &a0, &a1, &a2, &b0, &b1, + &b2, &tmp1, &tmp2, NULL); + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_toom_mul.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toom_sqr.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toom_sqr.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toom_sqr.c @@ -0,0 +1,226 @@ +#include +#ifdef BN_MP_TOOM_SQR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* squaring using Toom-Cook 3-way algorithm */ +int +mp_toom_sqr(mp_int *a, mp_int *b) +{ + mp_int w0, w1, w2, w3, w4, tmp1, a0, a1, a2; + int res, B; + + /* init temps */ + if ((res = mp_init_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL)) != MP_OKAY) { + return res; + } + + /* B */ + B = a->used / 3; + + /* a = a2 * B**2 + a1 * B + a0 */ + if ((res = mp_mod_2d(a, DIGIT_BIT * B, &a0)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_copy(a, &a1)) != MP_OKAY) { + goto ERR; + } + mp_rshd(&a1, B); + mp_mod_2d(&a1, DIGIT_BIT * B, &a1); + + if ((res = mp_copy(a, &a2)) != MP_OKAY) { + goto ERR; + } + mp_rshd(&a2, B*2); + + /* w0 = a0*a0 */ + if ((res = mp_sqr(&a0, &w0)) != MP_OKAY) { + goto ERR; + } + + /* w4 = a2 * a2 */ + if ((res = mp_sqr(&a2, &w4)) != MP_OKAY) { + goto ERR; + } + + /* w1 = (a2 + 2(a1 + 2a0))**2 */ + if ((res = mp_mul_2(&a0, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a2, &tmp1)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_sqr(&tmp1, &w1)) != MP_OKAY) { + goto ERR; + } + + /* w3 = (a0 + 2(a1 + 2a2))**2 */ + if ((res = mp_mul_2(&a2, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_mul_2(&tmp1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_sqr(&tmp1, &w3)) != MP_OKAY) { + goto ERR; + } + + + /* w2 = (a2 + a1 + a0)**2 */ + if ((res = mp_add(&a2, &a1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, &a0, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sqr(&tmp1, &w2)) != MP_OKAY) { + goto ERR; + } + + /* now solve the matrix + + 0 0 0 0 1 + 1 2 4 8 16 + 1 1 1 1 1 + 16 8 4 2 1 + 1 0 0 0 0 + + using 12 subtractions, 4 shifts, 2 small divisions and 1 small multiplication. + */ + + /* r1 - r4 */ + if ((res = mp_sub(&w1, &w4, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - r0 */ + if ((res = mp_sub(&w3, &w0, &w3)) != MP_OKAY) { + goto ERR; + } + /* r1/2 */ + if ((res = mp_div_2(&w1, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3/2 */ + if ((res = mp_div_2(&w3, &w3)) != MP_OKAY) { + goto ERR; + } + /* r2 - r0 - r4 */ + if ((res = mp_sub(&w2, &w0, &w2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w2, &w4, &w2)) != MP_OKAY) { + goto ERR; + } + /* r1 - r2 */ + if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - r2 */ + if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { + goto ERR; + } + /* r1 - 8r0 */ + if ((res = mp_mul_2d(&w0, 3, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w1, &tmp1, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - 8r4 */ + if ((res = mp_mul_2d(&w4, 3, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w3, &tmp1, &w3)) != MP_OKAY) { + goto ERR; + } + /* 3r2 - r1 - r3 */ + if ((res = mp_mul_d(&w2, 3, &w2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w2, &w1, &w2)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_sub(&w2, &w3, &w2)) != MP_OKAY) { + goto ERR; + } + /* r1 - r2 */ + if ((res = mp_sub(&w1, &w2, &w1)) != MP_OKAY) { + goto ERR; + } + /* r3 - r2 */ + if ((res = mp_sub(&w3, &w2, &w3)) != MP_OKAY) { + goto ERR; + } + /* r1/3 */ + if ((res = mp_div_3(&w1, &w1, NULL)) != MP_OKAY) { + goto ERR; + } + /* r3/3 */ + if ((res = mp_div_3(&w3, &w3, NULL)) != MP_OKAY) { + goto ERR; + } + + /* at this point shift W[n] by B*n */ + if ((res = mp_lshd(&w1, 1*B)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_lshd(&w2, 2*B)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_lshd(&w3, 3*B)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_lshd(&w4, 4*B)) != MP_OKAY) { + goto ERR; + } + + if ((res = mp_add(&w0, &w1, b)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&w2, &w3, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&w4, &tmp1, &tmp1)) != MP_OKAY) { + goto ERR; + } + if ((res = mp_add(&tmp1, b, b)) != MP_OKAY) { + goto ERR; + } + +ERR: + mp_clear_multi(&w0, &w1, &w2, &w3, &w4, &a0, &a1, &a2, &tmp1, NULL); + return res; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_toom_sqr.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toradix.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toradix.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toradix.c @@ -0,0 +1,75 @@ +#include +#ifdef BN_MP_TORADIX_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* stores a bignum as a ASCII string in a given radix (2..64) */ +int mp_toradix (mp_int * a, char *str, int radix) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + /* check range of the radix */ + if (radix < 2 || radix > 64) { + return MP_VAL; + } + + /* quick out if its zero */ + if (mp_iszero(a) == 1) { + *str++ = '0'; + *str = '\0'; + return MP_OKAY; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + /* if it is negative output a - */ + if (t.sign == MP_NEG) { + ++_s; + *str++ = '-'; + t.sign = MP_ZPOS; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = mp_s_rmap[d]; + ++digs; + } + + /* reverse the digits of the string. In this case _s points + * to the first digit [exluding the sign] of the number] + */ + bn_reverse ((unsigned char *)_s, digs); + + /* append a NULL so the string is properly terminated */ + *str = '\0'; + + mp_clear (&t); + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_toradix.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toradix_n.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toradix_n.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_toradix_n.c @@ -0,0 +1,88 @@ +#include +#ifdef BN_MP_TORADIX_N_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* stores a bignum as a ASCII string in a given radix (2..64) + * + * Stores upto maxlen-1 chars and always a NULL byte + */ +int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen) +{ + int res, digs; + mp_int t; + mp_digit d; + char *_s = str; + + /* check range of the maxlen, radix */ + if (maxlen < 2 || radix < 2 || radix > 64) { + return MP_VAL; + } + + /* quick out if its zero */ + if (mp_iszero(a) == MP_YES) { + *str++ = '0'; + *str = '\0'; + return MP_OKAY; + } + + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + + /* if it is negative output a - */ + if (t.sign == MP_NEG) { + /* we have to reverse our digits later... but not the - sign!! */ + ++_s; + + /* store the flag and mark the number as positive */ + *str++ = '-'; + t.sign = MP_ZPOS; + + /* subtract a char */ + --maxlen; + } + + digs = 0; + while (mp_iszero (&t) == 0) { + if (--maxlen < 1) { + /* no more room */ + break; + } + if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { + mp_clear (&t); + return res; + } + *str++ = mp_s_rmap[d]; + ++digs; + } + + /* reverse the digits of the string. In this case _s points + * to the first digit [exluding the sign] of the number + */ + bn_reverse ((unsigned char *)_s, digs); + + /* append a NULL so the string is properly terminated */ + *str = '\0'; + + mp_clear (&t); + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_toradix_n.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_unsigned_bin_size.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_unsigned_bin_size.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_unsigned_bin_size.c @@ -0,0 +1,28 @@ +#include +#ifdef BN_MP_UNSIGNED_BIN_SIZE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* get the size for an unsigned equivalent */ +int mp_unsigned_bin_size (mp_int * a) +{ + int size = mp_count_bits (a); + return (size / 8 + ((size & 7) != 0 ? 1 : 0)); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_unsigned_bin_size.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_xor.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_xor.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_xor.c @@ -0,0 +1,51 @@ +#include +#ifdef BN_MP_XOR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* XOR two ints together */ +int +mp_xor (mp_int * a, mp_int * b, mp_int * c) +{ + int res, ix, px; + mp_int t, *x; + + if (a->used > b->used) { + if ((res = mp_init_copy (&t, a)) != MP_OKAY) { + return res; + } + px = b->used; + x = b; + } else { + if ((res = mp_init_copy (&t, b)) != MP_OKAY) { + return res; + } + px = a->used; + x = a; + } + + for (ix = 0; ix < px; ix++) { + t.dp[ix] ^= x->dp[ix]; + } + mp_clamp (&t); + mp_exch (c, &t); + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_xor.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_zero.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_zero.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_zero.c @@ -0,0 +1,36 @@ +#include +#ifdef BN_MP_ZERO_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* set to zero */ +void mp_zero (mp_int * a) +{ + int n; + mp_digit *tmp; + + a->sign = MP_ZPOS; + a->used = 0; + + tmp = a->dp; + for (n = 0; n < a->alloc; n++) { + *tmp++ = 0; + } +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_zero.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_zero_multi.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_zero_multi.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_mp_zero_multi.c @@ -0,0 +1,35 @@ +#include +#ifdef BN_MP_ZERO_MULTI_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ +#include + +/* set to zero */ +void mp_zero_multi (mp_int * mp, ...) +{ + mp_int* next_mp = mp; + va_list args; + va_start(args, mp); + while (next_mp != NULL) { + mp_zero(next_mp); + next_mp = va_arg(args, mp_int*); + } + va_end(args); +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_mp_zero.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_prime_tab.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_prime_tab.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_prime_tab.c @@ -0,0 +1,61 @@ +#include +#ifdef BN_PRIME_TAB_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ +const mp_digit ltm_prime_tab[] = { + 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, + 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, + 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, + 0x0061, 0x0065, 0x0067, 0x006B, 0x006D, 0x0071, 0x007F, +#ifndef MP_8BIT + 0x0083, + 0x0089, 0x008B, 0x0095, 0x0097, 0x009D, 0x00A3, 0x00A7, 0x00AD, + 0x00B3, 0x00B5, 0x00BF, 0x00C1, 0x00C5, 0x00C7, 0x00D3, 0x00DF, + 0x00E3, 0x00E5, 0x00E9, 0x00EF, 0x00F1, 0x00FB, 0x0101, 0x0107, + 0x010D, 0x010F, 0x0115, 0x0119, 0x011B, 0x0125, 0x0133, 0x0137, + + 0x0139, 0x013D, 0x014B, 0x0151, 0x015B, 0x015D, 0x0161, 0x0167, + 0x016F, 0x0175, 0x017B, 0x017F, 0x0185, 0x018D, 0x0191, 0x0199, + 0x01A3, 0x01A5, 0x01AF, 0x01B1, 0x01B7, 0x01BB, 0x01C1, 0x01C9, + 0x01CD, 0x01CF, 0x01D3, 0x01DF, 0x01E7, 0x01EB, 0x01F3, 0x01F7, + 0x01FD, 0x0209, 0x020B, 0x021D, 0x0223, 0x022D, 0x0233, 0x0239, + 0x023B, 0x0241, 0x024B, 0x0251, 0x0257, 0x0259, 0x025F, 0x0265, + 0x0269, 0x026B, 0x0277, 0x0281, 0x0283, 0x0287, 0x028D, 0x0293, + 0x0295, 0x02A1, 0x02A5, 0x02AB, 0x02B3, 0x02BD, 0x02C5, 0x02CF, + + 0x02D7, 0x02DD, 0x02E3, 0x02E7, 0x02EF, 0x02F5, 0x02F9, 0x0301, + 0x0305, 0x0313, 0x031D, 0x0329, 0x032B, 0x0335, 0x0337, 0x033B, + 0x033D, 0x0347, 0x0355, 0x0359, 0x035B, 0x035F, 0x036D, 0x0371, + 0x0373, 0x0377, 0x038B, 0x038F, 0x0397, 0x03A1, 0x03A9, 0x03AD, + 0x03B3, 0x03B9, 0x03C7, 0x03CB, 0x03D1, 0x03D7, 0x03DF, 0x03E5, + 0x03F1, 0x03F5, 0x03FB, 0x03FD, 0x0407, 0x0409, 0x040F, 0x0419, + 0x041B, 0x0425, 0x0427, 0x042D, 0x043F, 0x0443, 0x0445, 0x0449, + 0x044F, 0x0455, 0x045D, 0x0463, 0x0469, 0x047F, 0x0481, 0x048B, + + 0x0493, 0x049D, 0x04A3, 0x04A9, 0x04B1, 0x04BD, 0x04C1, 0x04C7, + 0x04CD, 0x04CF, 0x04D5, 0x04E1, 0x04EB, 0x04FD, 0x04FF, 0x0503, + 0x0509, 0x050B, 0x0511, 0x0515, 0x0517, 0x051B, 0x0527, 0x0529, + 0x052F, 0x0551, 0x0557, 0x055D, 0x0565, 0x0577, 0x0581, 0x058F, + 0x0593, 0x0595, 0x0599, 0x059F, 0x05A7, 0x05AB, 0x05AD, 0x05B3, + 0x05BF, 0x05C9, 0x05CB, 0x05CF, 0x05D1, 0x05D5, 0x05DB, 0x05E7, + 0x05F3, 0x05FB, 0x0607, 0x060D, 0x0611, 0x0617, 0x061F, 0x0623, + 0x062B, 0x062F, 0x063D, 0x0641, 0x0647, 0x0649, 0x064D, 0x0653 +#endif +}; +#endif + +/* $Source: /cvs/libtom/libtommath/bn_prime_tab.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_reverse.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_reverse.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_reverse.c @@ -0,0 +1,39 @@ +#include +#ifdef BN_REVERSE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* reverse an array, used for radix code */ +void +bn_reverse (unsigned char *s, int len) +{ + int ix, iy; + unsigned char t; + + ix = 0; + iy = len - 1; + while (ix < iy) { + t = s[ix]; + s[ix] = s[iy]; + s[iy] = t; + ++ix; + --iy; + } +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_reverse.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_add.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_add.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_add.c @@ -0,0 +1,109 @@ +#include +#ifdef BN_S_MP_ADD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* low level addition, based on HAC pp.594, Algorithm 14.7 */ +int +s_mp_add (mp_int * a, mp_int * b, mp_int * c) +{ + mp_int *x; + int olduse, res, min, max; + + /* find sizes, we let |a| <= |b| which means we have to sort + * them. "x" will point to the input with the most digits + */ + if (a->used > b->used) { + min = b->used; + max = a->used; + x = a; + } else { + min = a->used; + max = b->used; + x = b; + } + + /* init result */ + if (c->alloc < max + 1) { + if ((res = mp_grow (c, max + 1)) != MP_OKAY) { + return res; + } + } + + /* get old used digit count and set new one */ + olduse = c->used; + c->used = max + 1; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + + /* first input */ + tmpa = a->dp; + + /* second input */ + tmpb = b->dp; + + /* destination */ + tmpc = c->dp; + + /* zero the carry */ + u = 0; + for (i = 0; i < min; i++) { + /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ + *tmpc = *tmpa++ + *tmpb++ + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, that is in A+B + * if A or B has more digits add those in + */ + if (min != max) { + for (; i < max; i++) { + /* T[i] = X[i] + U */ + *tmpc = x->dp[i] + u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)DIGIT_BIT); + + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } + } + + /* add carry */ + *tmpc++ = u; + + /* clear digits above oldused */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_s_mp_add.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_exptmod.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_exptmod.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_exptmod.c @@ -0,0 +1,252 @@ +#include +#ifdef BN_S_MP_EXPTMOD_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ +#ifdef MP_LOW_MEM + #define TAB_SIZE 32 +#else + #define TAB_SIZE 256 +#endif + +int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int redmode) +{ + mp_int M[TAB_SIZE], res, mu; + mp_digit buf; + int err, bitbuf, bitcpy, bitcnt, mode, digidx, x, y, winsize; + int (*redux)(mp_int*,mp_int*,mp_int*); + + /* find window size */ + x = mp_count_bits (X); + if (x <= 7) { + winsize = 2; + } else if (x <= 36) { + winsize = 3; + } else if (x <= 140) { + winsize = 4; + } else if (x <= 450) { + winsize = 5; + } else if (x <= 1303) { + winsize = 6; + } else if (x <= 3529) { + winsize = 7; + } else { + winsize = 8; + } + +#ifdef MP_LOW_MEM + if (winsize > 5) { + winsize = 5; + } +#endif + + /* init M array */ + /* init first cell */ + if ((err = mp_init(&M[1])) != MP_OKAY) { + return err; + } + + /* now init the second half of the array */ + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + if ((err = mp_init(&M[x])) != MP_OKAY) { + for (y = 1<<(winsize-1); y < x; y++) { + mp_clear (&M[y]); + } + mp_clear(&M[1]); + return err; + } + } + + /* create mu, used for Barrett reduction */ + if ((err = mp_init (&mu)) != MP_OKAY) { + goto LBL_M; + } + + if (redmode == 0) { + if ((err = mp_reduce_setup (&mu, P)) != MP_OKAY) { + goto LBL_MU; + } + redux = mp_reduce; + } else { + if ((err = mp_reduce_2k_setup_l (P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + redux = mp_reduce_2k_l; + } + + /* create M table + * + * The M table contains powers of the base, + * e.g. M[x] = G**x mod P + * + * The first half of the table is not + * computed though accept for M[0] and M[1] + */ + if ((err = mp_mod (G, P, &M[1])) != MP_OKAY) { + goto LBL_MU; + } + + /* compute the value at M[1<<(winsize-1)] by squaring + * M[1] (winsize-1) times + */ + if ((err = mp_copy (&M[1], &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_MU; + } + + for (x = 0; x < (winsize - 1); x++) { + /* square it */ + if ((err = mp_sqr (&M[1 << (winsize - 1)], + &M[1 << (winsize - 1)])) != MP_OKAY) { + goto LBL_MU; + } + + /* reduce modulo P */ + if ((err = redux (&M[1 << (winsize - 1)], P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + } + + /* create upper table, that is M[x] = M[x-1] * M[1] (mod P) + * for x = (2**(winsize - 1) + 1) to (2**winsize - 1) + */ + for (x = (1 << (winsize - 1)) + 1; x < (1 << winsize); x++) { + if ((err = mp_mul (&M[x - 1], &M[1], &M[x])) != MP_OKAY) { + goto LBL_MU; + } + if ((err = redux (&M[x], P, &mu)) != MP_OKAY) { + goto LBL_MU; + } + } + + /* setup result */ + if ((err = mp_init (&res)) != MP_OKAY) { + goto LBL_MU; + } + mp_set (&res, 1); + + /* set initial mode and bit cnt */ + mode = 0; + bitcnt = 1; + buf = 0; + digidx = X->used - 1; + bitcpy = 0; + bitbuf = 0; + + for (;;) { + /* grab next digit as required */ + if (--bitcnt == 0) { + /* if digidx == -1 we are out of digits */ + if (digidx == -1) { + break; + } + /* read next digit and reset the bitcnt */ + buf = X->dp[digidx--]; + bitcnt = (int) DIGIT_BIT; + } + + /* grab the next msb from the exponent */ + y = (buf >> (mp_digit)(DIGIT_BIT - 1)) & 1; + buf <<= (mp_digit)1; + + /* if the bit is zero and mode == 0 then we ignore it + * These represent the leading zero bits before the first 1 bit + * in the exponent. Technically this opt is not required but it + * does lower the # of trivial squaring/reductions used + */ + if (mode == 0 && y == 0) { + continue; + } + + /* if the bit is zero and mode == 1 then we square */ + if (mode == 1 && y == 0) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + continue; + } + + /* else we add it to the window */ + bitbuf |= (y << (winsize - ++bitcpy)); + mode = 2; + + if (bitcpy == winsize) { + /* ok window is filled so square as required and multiply */ + /* square first */ + for (x = 0; x < winsize; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + } + + /* then multiply */ + if ((err = mp_mul (&res, &M[bitbuf], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + + /* empty window and reset */ + bitcpy = 0; + bitbuf = 0; + mode = 1; + } + } + + /* if bits remain then square/multiply */ + if (mode == 2 && bitcpy > 0) { + /* square then multiply if the bit is set */ + for (x = 0; x < bitcpy; x++) { + if ((err = mp_sqr (&res, &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + + bitbuf <<= 1; + if ((bitbuf & (1 << winsize)) != 0) { + /* then multiply */ + if ((err = mp_mul (&res, &M[1], &res)) != MP_OKAY) { + goto LBL_RES; + } + if ((err = redux (&res, P, &mu)) != MP_OKAY) { + goto LBL_RES; + } + } + } + } + + mp_exch (&res, Y); + err = MP_OKAY; +LBL_RES:mp_clear (&res); +LBL_MU:mp_clear (&mu); +LBL_M: + mp_clear(&M[1]); + for (x = 1<<(winsize-1); x < (1 << winsize); x++) { + mp_clear (&M[x]); + } + return err; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_s_mp_exptmod.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_mul_digs.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_mul_digs.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_mul_digs.c @@ -0,0 +1,90 @@ +#include +#ifdef BN_S_MP_MUL_DIGS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* multiplies |a| * |b| and only computes upto digs digits of result + * HAC pp. 595, Algorithm 14.12 Modified so you can control how + * many digits of output are created. + */ +int s_mp_mul_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + /* can we use the fast multiplier? */ + if (((digs) < MP_WARRAY) && + MIN (a->used, b->used) < + (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_digs (a, b, c, digs); + } + + if ((res = mp_init_size (&t, digs)) != MP_OKAY) { + return res; + } + t.used = digs; + + /* compute the digits of the product directly */ + pa = a->used; + for (ix = 0; ix < pa; ix++) { + /* set the carry to zero */ + u = 0; + + /* limit ourselves to making digs digits of output */ + pb = MIN (b->used, digs - ix); + + /* setup some aliases */ + /* copy of the digit from a used within the nested loop */ + tmpx = a->dp[ix]; + + /* an alias for the destination shifted ix places */ + tmpt = t.dp + ix; + + /* an alias for the digits of b */ + tmpy = b->dp; + + /* compute the columns of the output and propagate the carry */ + for (iy = 0; iy < pb; iy++) { + /* compute the column as a mp_word */ + r = ((mp_word)*tmpt) + + ((mp_word)tmpx) * ((mp_word)*tmpy++) + + ((mp_word) u); + + /* the new column is the lower part of the result */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry word from the result */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + /* set carry if it is placed below digs */ + if (ix + iy < digs) { + *tmpt = u; + } + } + + mp_clamp (&t); + mp_exch (&t, c); + + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_s_mp_mul_digs.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_mul_high_digs.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_mul_high_digs.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_mul_high_digs.c @@ -0,0 +1,81 @@ +#include +#ifdef BN_S_MP_MUL_HIGH_DIGS_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* multiplies |a| * |b| and does not compute the lower digs digits + * [meant to get the higher part of the product] + */ +int +s_mp_mul_high_digs (mp_int * a, mp_int * b, mp_int * c, int digs) +{ + mp_int t; + int res, pa, pb, ix, iy; + mp_digit u; + mp_word r; + mp_digit tmpx, *tmpt, *tmpy; + + /* can we use the fast multiplier? */ +#ifdef BN_FAST_S_MP_MUL_HIGH_DIGS_C + if (((a->used + b->used + 1) < MP_WARRAY) + && MIN (a->used, b->used) < (1 << ((CHAR_BIT * sizeof (mp_word)) - (2 * DIGIT_BIT)))) { + return fast_s_mp_mul_high_digs (a, b, c, digs); + } +#endif + + if ((res = mp_init_size (&t, a->used + b->used + 1)) != MP_OKAY) { + return res; + } + t.used = a->used + b->used + 1; + + pa = a->used; + pb = b->used; + for (ix = 0; ix < pa; ix++) { + /* clear the carry */ + u = 0; + + /* left hand side of A[ix] * B[iy] */ + tmpx = a->dp[ix]; + + /* alias to the address of where the digits will be stored */ + tmpt = &(t.dp[digs]); + + /* alias for where to read the right hand side from */ + tmpy = b->dp + (digs - ix); + + for (iy = digs - ix; iy < pb; iy++) { + /* calculate the double precision result */ + r = ((mp_word)*tmpt) + + ((mp_word)tmpx) * ((mp_word)*tmpy++) + + ((mp_word) u); + + /* get the lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* carry the carry */ + u = (mp_digit) (r >> ((mp_word) DIGIT_BIT)); + } + *tmpt = u; + } + mp_clamp (&t); + mp_exch (&t, c); + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_s_mp_mul_high_digs.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_sqr.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_sqr.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_sqr.c @@ -0,0 +1,84 @@ +#include +#ifdef BN_S_MP_SQR_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* low level squaring, b = a*a, HAC pp.596-597, Algorithm 14.16 */ +int s_mp_sqr (mp_int * a, mp_int * b) +{ + mp_int t; + int res, ix, iy, pa; + mp_word r; + mp_digit u, tmpx, *tmpt; + + pa = a->used; + if ((res = mp_init_size (&t, 2*pa + 1)) != MP_OKAY) { + return res; + } + + /* default used is maximum possible size */ + t.used = 2*pa + 1; + + for (ix = 0; ix < pa; ix++) { + /* first calculate the digit at 2*ix */ + /* calculate double precision result */ + r = ((mp_word) t.dp[2*ix]) + + ((mp_word)a->dp[ix])*((mp_word)a->dp[ix]); + + /* store lower part in result */ + t.dp[ix+ix] = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get the carry */ + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + + /* left hand side of A[ix] * A[iy] */ + tmpx = a->dp[ix]; + + /* alias for where to store the results */ + tmpt = t.dp + (2*ix + 1); + + for (iy = ix + 1; iy < pa; iy++) { + /* first calculate the product */ + r = ((mp_word)tmpx) * ((mp_word)a->dp[iy]); + + /* now calculate the double precision result, note we use + * addition instead of *2 since it's easier to optimize + */ + r = ((mp_word) *tmpt) + r + r + ((mp_word) u); + + /* store lower part */ + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + + /* get carry */ + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + } + /* propagate upwards */ + while (u != ((mp_digit) 0)) { + r = ((mp_word) *tmpt) + ((mp_word) u); + *tmpt++ = (mp_digit) (r & ((mp_word) MP_MASK)); + u = (mp_digit)(r >> ((mp_word) DIGIT_BIT)); + } + } + + mp_clamp (&t); + mp_exch (&t, b); + mp_clear (&t); + return MP_OKAY; +} +#endif + +/* $Source: /cvs/libtom/libtommath/bn_s_mp_sqr.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_sub.c b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_sub.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bn_s_mp_sub.c @@ -0,0 +1,89 @@ +#include +#ifdef BN_S_MP_SUB_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* low level subtraction (assumes |a| > |b|), HAC pp.595 Algorithm 14.9 */ +int +s_mp_sub (mp_int * a, mp_int * b, mp_int * c) +{ + int olduse, res, min, max; + + /* find sizes */ + min = b->used; + max = a->used; + + /* init result */ + if (c->alloc < max) { + if ((res = mp_grow (c, max)) != MP_OKAY) { + return res; + } + } + olduse = c->used; + c->used = max; + + { + register mp_digit u, *tmpa, *tmpb, *tmpc; + register int i; + + /* alias for digit pointers */ + tmpa = a->dp; + tmpb = b->dp; + tmpc = c->dp; + + /* set carry to zero */ + u = 0; + for (i = 0; i < min; i++) { + /* T[i] = A[i] - B[i] - U */ + *tmpc = *tmpa++ - *tmpb++ - u; + + /* U = carry bit of T[i] + * Note this saves performing an AND operation since + * if a carry does occur it will propagate all the way to the + * MSB. As a result a single shift is enough to get the carry + */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* now copy higher words if any, e.g. if A has more digits than B */ + for (; i < max; i++) { + /* T[i] = A[i] - U */ + *tmpc = *tmpa++ - u; + + /* U = carry bit of T[i] */ + u = *tmpc >> ((mp_digit)(CHAR_BIT * sizeof (mp_digit) - 1)); + + /* Clear carry from T[i] */ + *tmpc++ &= MP_MASK; + } + + /* clear digits above used (since we may not have grown result above) */ + for (i = c->used; i < olduse; i++) { + *tmpc++ = 0; + } + } + + mp_clamp (c); + return MP_OKAY; +} + +#endif + +/* $Source: /cvs/libtom/libtommath/bn_s_mp_sub.c,v $ */ +/* $Revision: 1.4 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/bncore.c b/crypto/heimdal/lib/hcrypto/libtommath/bncore.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/bncore.c @@ -0,0 +1,36 @@ +#include +#ifdef BNCORE_C +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://libtom.org + */ + +/* Known optimal configurations + + CPU /Compiler /MUL CUTOFF/SQR CUTOFF +------------------------------------------------------------- + Intel P4 Northwood /GCC v3.4.1 / 88/ 128/LTM 0.32 ;-) + AMD Athlon64 /GCC v3.4.4 / 80/ 120/LTM 0.35 + +*/ + +int KARATSUBA_MUL_CUTOFF = 80, /* Min. number of digits before Karatsuba multiplication is used. */ + KARATSUBA_SQR_CUTOFF = 120, /* Min. number of digits before Karatsuba squaring is used. */ + + TOOM_MUL_CUTOFF = 350, /* no optimal values of these are known yet so set em high */ + TOOM_SQR_CUTOFF = 400; +#endif + +/* $Source: /cvs/libtom/libtommath/bncore.c,v $ */ +/* $Revision: 1.5 $ */ +/* $Date: 2006/12/28 01:25:13 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/tommath.h b/crypto/heimdal/lib/hcrypto/libtommath/tommath.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/tommath.h @@ -0,0 +1,590 @@ +/* LibTomMath, multiple-precision integer library -- Tom St Denis + * + * LibTomMath is a library that provides multiple-precision + * integer arithmetic as well as number theoretic functionality. + * + * The library was designed directly after the MPI library by + * Michael Fromberger but has been written from scratch with + * additional optimizations in place. + * + * The library is free for all purposes without any express + * guarantee it works. + * + * Tom St Denis, tomstdenis@gmail.com, http://math.libtomcrypt.com + */ +#ifndef BN_H_ +#define BN_H_ + +#include +#include +#include +#include +#include + +#include + +#ifndef MIN + #define MIN(x,y) ((x)<(y)?(x):(y)) +#endif + +#ifndef MAX + #define MAX(x,y) ((x)>(y)?(x):(y)) +#endif + +#ifdef __cplusplus +extern "C" { + +/* C++ compilers don't like assigning void * to mp_digit * */ +#define OPT_CAST(x) (x *) + +#else + +/* C on the other hand doesn't care */ +#define OPT_CAST(x) + +#endif + + +/* detect 64-bit mode if possible */ +#if defined(__x86_64__) && !defined(__ILP32__) + #if !(defined(MP_64BIT) && defined(MP_16BIT) && defined(MP_8BIT)) + #define MP_64BIT + #endif +#endif + +/* some default configurations. + * + * A "mp_digit" must be able to hold DIGIT_BIT + 1 bits + * A "mp_word" must be able to hold 2*DIGIT_BIT + 1 bits + * + * At the very least a mp_digit must be able to hold 7 bits + * [any size beyond that is ok provided it doesn't overflow the data type] + */ +#ifdef MP_8BIT + typedef unsigned char mp_digit; + typedef unsigned short mp_word; +#elif defined(MP_16BIT) + typedef unsigned short mp_digit; + typedef unsigned long mp_word; +#elif defined(MP_64BIT) + /* for GCC only on supported platforms */ +#ifndef CRYPT + typedef unsigned long long ulong64; + typedef signed long long long64; +#endif + + typedef unsigned long mp_digit; + typedef unsigned long mp_word __attribute__ ((mode(TI))); + + #define DIGIT_BIT 60 +#else + /* this is the default case, 28-bit digits */ + + /* this is to make porting into LibTomCrypt easier :-) */ +#ifndef CRYPT + #if defined(_MSC_VER) || defined(__BORLANDC__) + typedef unsigned __int64 ulong64; + typedef signed __int64 long64; + #else + typedef unsigned long long ulong64; + typedef signed long long long64; + #endif +#endif + + typedef unsigned long mp_digit; + typedef ulong64 mp_word; + +#ifdef MP_31BIT + /* this is an extension that uses 31-bit digits */ + #define DIGIT_BIT 31 +#else + /* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */ + #define DIGIT_BIT 28 + #define MP_28BIT +#endif +#endif + +/* define heap macros */ +#ifndef CRYPT + /* default to libc stuff */ + #ifndef XMALLOC + #define XMALLOC malloc + #define XFREE free + #define XREALLOC realloc + #define XCALLOC calloc + #else + /* prototypes for our heap functions */ + extern void *XMALLOC(size_t n); + extern void *XREALLOC(void *p, size_t n); + extern void *XCALLOC(size_t n, size_t s); + extern void XFREE(void *p); + #endif +#endif + + +/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */ +#ifndef DIGIT_BIT + #define DIGIT_BIT ((int)((CHAR_BIT * sizeof(mp_digit) - 1))) /* bits per digit */ +#endif + +#define MP_DIGIT_BIT DIGIT_BIT +#define MP_MASK ((((mp_digit)1)<<((mp_digit)DIGIT_BIT))-((mp_digit)1)) +#define MP_DIGIT_MAX MP_MASK + +/* equalities */ +#define MP_LT -1 /* less than */ +#define MP_EQ 0 /* equal to */ +#define MP_GT 1 /* greater than */ + +#define MP_ZPOS 0 /* positive integer */ +#define MP_NEG 1 /* negative */ + +#define MP_OKAY 0 /* ok result */ +#define MP_MEM -2 /* out of mem */ +#define MP_VAL -3 /* invalid input */ +#define MP_RANGE MP_VAL + +#define MP_YES 1 /* yes response */ +#define MP_NO 0 /* no response */ + +/* Primality generation flags */ +#define LTM_PRIME_BBS 0x0001 /* BBS style prime */ +#define LTM_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ +#define LTM_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ + +typedef int mp_err; + +/* you'll have to tune these... */ +extern int KARATSUBA_MUL_CUTOFF, + KARATSUBA_SQR_CUTOFF, + TOOM_MUL_CUTOFF, + TOOM_SQR_CUTOFF; + +/* define this to use lower memory usage routines (exptmods mostly) */ +/* #define MP_LOW_MEM */ + +/* default precision */ +#ifndef MP_PREC + #ifndef MP_LOW_MEM + #define MP_PREC 32 /* default digits of precision */ + #else + #define MP_PREC 8 /* default digits of precision */ + #endif +#endif + +/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ +#define MP_WARRAY (1 << (sizeof(mp_word) * CHAR_BIT - 2 * DIGIT_BIT + 1)) + +/* the infamous mp_int structure */ +typedef struct { + int used, alloc, sign; + mp_digit *dp; +} mp_int; + +/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */ +typedef int ltm_prime_callback(unsigned char *dst, int len, void *dat); + + +#define USED(m) ((m)->used) +#define DIGIT(m,k) ((m)->dp[(k)]) +#define SIGN(m) ((m)->sign) + +/* error code to const char* string */ +const char *mp_error_to_string(int code); + +/* ---> init and deinit bignum functions <--- */ +/* init a bignum */ +int mp_init(mp_int *a); + +/* free a bignum */ +void mp_clear(mp_int *a); + +/* init a null terminated series of arguments */ +int mp_init_multi(mp_int *mp, ...); + +/* clear a null terminated series of arguments */ +void mp_clear_multi(mp_int *mp, ...); + +/* exchange two ints */ +void mp_exch(mp_int *a, mp_int *b); + +/* shrink ram required for a bignum */ +int mp_shrink(mp_int *a); + +/* grow an int to a given size */ +int mp_grow(mp_int *a, int size); + +/* init to a given number of digits */ +int mp_init_size(mp_int *a, int size); + +/* ---> Basic Manipulations <--- */ +#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) +#define mp_iseven(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) +#define mp_isodd(a) (((a)->used > 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) +#define mp_isneg(a) (((a)->sign) ? MP_YES : MP_NO) + +/* set to zero */ +void mp_zero(mp_int *a); + +/* set to zero, multi */ +void mp_zero_multi(mp_int *a, ...); + +/* set to a digit */ +void mp_set(mp_int *a, mp_digit b); + +/* set a 32-bit const */ +int mp_set_int(mp_int *a, unsigned long b); + +/* get a 32-bit value */ +unsigned long mp_get_int(mp_int * a); + +/* initialize and set a digit */ +int mp_init_set (mp_int * a, mp_digit b); + +/* initialize and set 32-bit value */ +int mp_init_set_int (mp_int * a, unsigned long b); + +/* copy, b = a */ +int mp_copy(mp_int *a, mp_int *b); + +/* inits and copies, a = b */ +int mp_init_copy(mp_int *a, mp_int *b); + +/* trim unused digits */ +void mp_clamp(mp_int *a); + +/* ---> digit manipulation <--- */ + +/* right shift by "b" digits */ +void mp_rshd(mp_int *a, int b); + +/* left shift by "b" digits */ +int mp_lshd(mp_int *a, int b); + +/* c = a / 2**b */ +int mp_div_2d(mp_int *a, int b, mp_int *c, mp_int *d); + +/* b = a/2 */ +int mp_div_2(mp_int *a, mp_int *b); + +/* c = a * 2**b */ +int mp_mul_2d(mp_int *a, int b, mp_int *c); + +/* b = a*2 */ +int mp_mul_2(mp_int *a, mp_int *b); + +/* c = a mod 2**d */ +int mp_mod_2d(mp_int *a, int b, mp_int *c); + +/* computes a = 2**b */ +int mp_2expt(mp_int *a, int b); + +/* Counts the number of lsbs which are zero before the first zero bit */ +int mp_cnt_lsb(mp_int *a); + +/* I Love Earth! */ + +/* makes a pseudo-random int of a given size */ +int mp_rand(mp_int *a, int digits); + +/* ---> binary operations <--- */ +/* c = a XOR b */ +int mp_xor(mp_int *a, mp_int *b, mp_int *c); + +/* c = a OR b */ +int mp_or(mp_int *a, mp_int *b, mp_int *c); + +/* c = a AND b */ +int mp_and(mp_int *a, mp_int *b, mp_int *c); + +/* ---> Basic arithmetic <--- */ + +/* b = -a */ +int mp_neg(mp_int *a, mp_int *b); + +/* b = |a| */ +int mp_abs(mp_int *a, mp_int *b); + +/* compare a to b */ +int mp_cmp(mp_int *a, mp_int *b); + +/* compare |a| to |b| */ +int mp_cmp_mag(mp_int *a, mp_int *b); + +/* c = a + b */ +int mp_add(mp_int *a, mp_int *b, mp_int *c); + +/* c = a - b */ +int mp_sub(mp_int *a, mp_int *b, mp_int *c); + +/* c = a * b */ +int mp_mul(mp_int *a, mp_int *b, mp_int *c); + +/* b = a*a */ +int mp_sqr(mp_int *a, mp_int *b); + +/* a/b => cb + d == a */ +int mp_div(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* c = a mod b, 0 <= c < b */ +int mp_mod(mp_int *a, mp_int *b, mp_int *c); + +/* ---> single digit functions <--- */ + +/* compare against a single digit */ +int mp_cmp_d(mp_int *a, mp_digit b); + +/* c = a + b */ +int mp_add_d(mp_int *a, mp_digit b, mp_int *c); + +/* c = a - b */ +int mp_sub_d(mp_int *a, mp_digit b, mp_int *c); + +/* c = a * b */ +int mp_mul_d(mp_int *a, mp_digit b, mp_int *c); + +/* a/b => cb + d == a */ +int mp_div_d(mp_int *a, mp_digit b, mp_int *c, mp_digit *d); + +/* a/3 => 3c + d == a */ +int mp_div_3(mp_int *a, mp_int *c, mp_digit *d); + +/* c = a**b */ +int mp_expt_d(mp_int *a, mp_digit b, mp_int *c); + +/* c = a mod b, 0 <= c < b */ +int mp_mod_d(mp_int *a, mp_digit b, mp_digit *c); + +/* ---> number theory <--- */ + +/* d = a + b (mod c) */ +int mp_addmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* d = a - b (mod c) */ +int mp_submod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* d = a * b (mod c) */ +int mp_mulmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* c = a * a (mod b) */ +int mp_sqrmod(mp_int *a, mp_int *b, mp_int *c); + +/* c = 1/a (mod b) */ +int mp_invmod(mp_int *a, mp_int *b, mp_int *c); + +/* c = (a, b) */ +int mp_gcd(mp_int *a, mp_int *b, mp_int *c); + +/* produces value such that U1*a + U2*b = U3 */ +int mp_exteuclid(mp_int *a, mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3); + +/* c = [a, b] or (a*b)/(a, b) */ +int mp_lcm(mp_int *a, mp_int *b, mp_int *c); + +/* finds one of the b'th root of a, such that |c|**b <= |a| + * + * returns error if a < 0 and b is even + */ +int mp_n_root(mp_int *a, mp_digit b, mp_int *c); + +/* special sqrt algo */ +int mp_sqrt(mp_int *arg, mp_int *ret); + +/* is number a square? */ +int mp_is_square(mp_int *arg, int *ret); + +/* computes the jacobi c = (a | n) (or Legendre if b is prime) */ +int mp_jacobi(mp_int *a, mp_int *n, int *c); + +/* used to setup the Barrett reduction for a given modulus b */ +int mp_reduce_setup(mp_int *a, mp_int *b); + +/* Barrett Reduction, computes a (mod b) with a precomputed value c + * + * Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely + * compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code]. + */ +int mp_reduce(mp_int *a, mp_int *b, mp_int *c); + +/* setups the montgomery reduction */ +int mp_montgomery_setup(mp_int *a, mp_digit *mp); + +/* computes a = B**n mod b without division or multiplication useful for + * normalizing numbers in a Montgomery system. + */ +int mp_montgomery_calc_normalization(mp_int *a, mp_int *b); + +/* computes x/R == x (mod N) via Montgomery Reduction */ +int mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); + +/* returns 1 if a is a valid DR modulus */ +int mp_dr_is_modulus(mp_int *a); + +/* sets the value of "d" required for mp_dr_reduce */ +void mp_dr_setup(mp_int *a, mp_digit *d); + +/* reduces a modulo b using the Diminished Radix method */ +int mp_dr_reduce(mp_int *a, mp_int *b, mp_digit mp); + +/* returns true if a can be reduced with mp_reduce_2k */ +int mp_reduce_is_2k(mp_int *a); + +/* determines k value for 2k reduction */ +int mp_reduce_2k_setup(mp_int *a, mp_digit *d); + +/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ +int mp_reduce_2k(mp_int *a, mp_int *n, mp_digit d); + +/* returns true if a can be reduced with mp_reduce_2k_l */ +int mp_reduce_is_2k_l(mp_int *a); + +/* determines k value for 2k reduction */ +int mp_reduce_2k_setup_l(mp_int *a, mp_int *d); + +/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ +int mp_reduce_2k_l(mp_int *a, mp_int *n, mp_int *d); + +/* d = a**b (mod c) */ +int mp_exptmod(mp_int *a, mp_int *b, mp_int *c, mp_int *d); + +/* ---> Primes <--- */ + +/* number of primes */ +#ifdef MP_8BIT + #define PRIME_SIZE 31 +#else + #define PRIME_SIZE 256 +#endif + +/* table of first PRIME_SIZE primes */ +extern const mp_digit ltm_prime_tab[]; + +/* result=1 if a is divisible by one of the first PRIME_SIZE primes */ +int mp_prime_is_divisible(mp_int *a, int *result); + +/* performs one Fermat test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_fermat(mp_int *a, mp_int *b, int *result); + +/* performs one Miller-Rabin test of "a" using base "b". + * Sets result to 0 if composite or 1 if probable prime + */ +int mp_prime_miller_rabin(mp_int *a, mp_int *b, int *result); + +/* This gives [for a given bit size] the number of trials required + * such that Miller-Rabin gives a prob of failure lower than 2^-96 + */ +int mp_prime_rabin_miller_trials(int size); + +/* performs t rounds of Miller-Rabin on "a" using the first + * t prime bases. Also performs an initial sieve of trial + * division. Determines if "a" is prime with probability + * of error no more than (1/4)**t. + * + * Sets result to 1 if probably prime, 0 otherwise + */ +int mp_prime_is_prime(mp_int *a, int t, int *result); + +/* finds the next prime after the number "a" using "t" trials + * of Miller-Rabin. + * + * bbs_style = 1 means the prime must be congruent to 3 mod 4 + */ +int mp_prime_next_prime(mp_int *a, int t, int bbs_style); + +/* makes a truly random prime of a given size (bytes), + * call with bbs = 1 if you want it to be congruent to 3 mod 4 + * + * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can + * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself + * so it can be NULL + * + * The prime generated will be larger than 2^(8*size). + */ +#define mp_prime_random(a, t, size, bbs, cb, dat) mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?LTM_PRIME_BBS:0, cb, dat) + +/* makes a truly random prime of a given size (bits), + * + * Flags are as follows: + * + * LTM_PRIME_BBS - make prime congruent to 3 mod 4 + * LTM_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies LTM_PRIME_BBS) + * LTM_PRIME_2MSB_OFF - make the 2nd highest bit zero + * LTM_PRIME_2MSB_ON - make the 2nd highest bit one + * + * You have to supply a callback which fills in a buffer with random bytes. "dat" is a parameter you can + * have passed to the callback (e.g. a state or something). This function doesn't use "dat" itself + * so it can be NULL + * + */ +int mp_prime_random_ex(mp_int *a, int t, int size, int flags, ltm_prime_callback cb, void *dat); + +int mp_find_prime(mp_int *a, int t); + +/* ---> radix conversion <--- */ +int mp_count_bits(mp_int *a); + +int mp_unsigned_bin_size(mp_int *a); +int mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c); +int mp_to_unsigned_bin(mp_int *a, unsigned char *b); +int mp_to_unsigned_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen); + +int mp_signed_bin_size(mp_int *a); +int mp_read_signed_bin(mp_int *a, const unsigned char *b, int c); +int mp_to_signed_bin(mp_int *a, unsigned char *b); +int mp_to_signed_bin_n (mp_int * a, unsigned char *b, unsigned long *outlen); + +int mp_read_radix(mp_int *a, const char *str, int radix); +int mp_toradix(mp_int *a, char *str, int radix); +int mp_toradix_n(mp_int * a, char *str, int radix, int maxlen); +int mp_radix_size(mp_int *a, int radix, int *size); + +int mp_fread(mp_int *a, int radix, FILE *stream); +int mp_fwrite(mp_int *a, int radix, FILE *stream); + +#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) +#define mp_raw_size(mp) mp_signed_bin_size(mp) +#define mp_toraw(mp, str) mp_to_signed_bin((mp), (str)) +#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len)) +#define mp_mag_size(mp) mp_unsigned_bin_size(mp) +#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str)) + +#define mp_tobinary(M, S) mp_toradix((M), (S), 2) +#define mp_tooctal(M, S) mp_toradix((M), (S), 8) +#define mp_todecimal(M, S) mp_toradix((M), (S), 10) +#define mp_tohex(M, S) mp_toradix((M), (S), 16) + +/* lowlevel functions, do not call! */ +int s_mp_add(mp_int *a, mp_int *b, mp_int *c); +int s_mp_sub(mp_int *a, mp_int *b, mp_int *c); +#define s_mp_mul(a, b, c) s_mp_mul_digs(a, b, c, (a)->used + (b)->used + 1) +int fast_s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +int s_mp_mul_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +int fast_s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +int s_mp_mul_high_digs(mp_int *a, mp_int *b, mp_int *c, int digs); +int fast_s_mp_sqr(mp_int *a, mp_int *b); +int s_mp_sqr(mp_int *a, mp_int *b); +int mp_karatsuba_mul(mp_int *a, mp_int *b, mp_int *c); +int mp_toom_mul(mp_int *a, mp_int *b, mp_int *c); +int mp_karatsuba_sqr(mp_int *a, mp_int *b); +int mp_toom_sqr(mp_int *a, mp_int *b); +int fast_mp_invmod(mp_int *a, mp_int *b, mp_int *c); +int mp_invmod_slow (mp_int * a, mp_int * b, mp_int * c); +int fast_mp_montgomery_reduce(mp_int *a, mp_int *m, mp_digit mp); +int mp_exptmod_fast(mp_int *G, mp_int *X, mp_int *P, mp_int *Y, int mode); +int s_mp_exptmod (mp_int * G, mp_int * X, mp_int * P, mp_int * Y, int mode); +void bn_reverse(unsigned char *s, int len); + +extern const char *mp_s_rmap; + +#ifdef __cplusplus + } +#endif + +#endif + + +/* $Source: /cvs/libtom/libtommath/tommath.h,v $ */ +/* $Revision: 1.8 $ */ +/* $Date: 2006/03/31 14:18:44 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/tommath_class.h b/crypto/heimdal/lib/hcrypto/libtommath/tommath_class.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/tommath_class.h @@ -0,0 +1,1002 @@ +#if !(defined(LTM1) && defined(LTM2) && defined(LTM3)) +#if defined(LTM2) +#define LTM3 +#endif +#if defined(LTM1) +#define LTM2 +#endif +#define LTM1 + +#if defined(LTM_ALL) +#define BN_ERROR_C +#define BN_FAST_MP_INVMOD_C +#define BN_FAST_MP_MONTGOMERY_REDUCE_C +#define BN_FAST_S_MP_MUL_DIGS_C +#define BN_FAST_S_MP_MUL_HIGH_DIGS_C +#define BN_FAST_S_MP_SQR_C +#define BN_MP_2EXPT_C +#define BN_MP_ABS_C +#define BN_MP_ADD_C +#define BN_MP_ADD_D_C +#define BN_MP_ADDMOD_C +#define BN_MP_AND_C +#define BN_MP_CLAMP_C +#define BN_MP_CLEAR_C +#define BN_MP_CLEAR_MULTI_C +#define BN_MP_CMP_C +#define BN_MP_CMP_D_C +#define BN_MP_CMP_MAG_C +#define BN_MP_CNT_LSB_C +#define BN_MP_COPY_C +#define BN_MP_COUNT_BITS_C +#define BN_MP_DIV_C +#define BN_MP_DIV_2_C +#define BN_MP_DIV_2D_C +#define BN_MP_DIV_3_C +#define BN_MP_DIV_D_C +#define BN_MP_DR_IS_MODULUS_C +#define BN_MP_DR_REDUCE_C +#define BN_MP_DR_SETUP_C +#define BN_MP_EXCH_C +#define BN_MP_EXPT_D_C +#define BN_MP_EXPTMOD_C +#define BN_MP_EXPTMOD_FAST_C +#define BN_MP_EXTEUCLID_C +#define BN_MP_FIND_PRIME_C +#define BN_MP_FREAD_C +#define BN_MP_FWRITE_C +#define BN_MP_GCD_C +#define BN_MP_GET_INT_C +#define BN_MP_GROW_C +#define BN_MP_INIT_C +#define BN_MP_INIT_COPY_C +#define BN_MP_INIT_MULTI_C +#define BN_MP_INIT_SET_C +#define BN_MP_INIT_SET_INT_C +#define BN_MP_INIT_SIZE_C +#define BN_MP_INVMOD_C +#define BN_MP_INVMOD_SLOW_C +#define BN_MP_ISPRIME_C +#define BN_MP_IS_SQUARE_C +#define BN_MP_JACOBI_C +#define BN_MP_KARATSUBA_MUL_C +#define BN_MP_KARATSUBA_SQR_C +#define BN_MP_LCM_C +#define BN_MP_LSHD_C +#define BN_MP_MOD_C +#define BN_MP_MOD_2D_C +#define BN_MP_MOD_D_C +#define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C +#define BN_MP_MONTGOMERY_REDUCE_C +#define BN_MP_MONTGOMERY_SETUP_C +#define BN_MP_MUL_C +#define BN_MP_MUL_2_C +#define BN_MP_MUL_2D_C +#define BN_MP_MUL_D_C +#define BN_MP_MULMOD_C +#define BN_MP_N_ROOT_C +#define BN_MP_NEG_C +#define BN_MP_OR_C +#define BN_MP_PRIME_FERMAT_C +#define BN_MP_PRIME_IS_DIVISIBLE_C +#define BN_MP_PRIME_IS_PRIME_C +#define BN_MP_PRIME_MILLER_RABIN_C +#define BN_MP_PRIME_NEXT_PRIME_C +#define BN_MP_PRIME_RABIN_MILLER_TRIALS_C +#define BN_MP_PRIME_RANDOM_EX_C +#define BN_MP_RADIX_SIZE_C +#define BN_MP_RADIX_SMAP_C +#define BN_MP_RAND_C +#define BN_MP_READ_RADIX_C +#define BN_MP_READ_SIGNED_BIN_C +#define BN_MP_READ_UNSIGNED_BIN_C +#define BN_MP_REDUCE_C +#define BN_MP_REDUCE_2K_C +#define BN_MP_REDUCE_2K_L_C +#define BN_MP_REDUCE_2K_SETUP_C +#define BN_MP_REDUCE_2K_SETUP_L_C +#define BN_MP_REDUCE_IS_2K_C +#define BN_MP_REDUCE_IS_2K_L_C +#define BN_MP_REDUCE_SETUP_C +#define BN_MP_RSHD_C +#define BN_MP_SET_C +#define BN_MP_SET_INT_C +#define BN_MP_SHRINK_C +#define BN_MP_SIGNED_BIN_SIZE_C +#define BN_MP_SQR_C +#define BN_MP_SQRMOD_C +#define BN_MP_SQRT_C +#define BN_MP_SUB_C +#define BN_MP_SUB_D_C +#define BN_MP_SUBMOD_C +#define BN_MP_TO_SIGNED_BIN_C +#define BN_MP_TO_SIGNED_BIN_N_C +#define BN_MP_TO_UNSIGNED_BIN_C +#define BN_MP_TO_UNSIGNED_BIN_N_C +#define BN_MP_TOOM_MUL_C +#define BN_MP_TOOM_SQR_C +#define BN_MP_TORADIX_C +#define BN_MP_TORADIX_N_C +#define BN_MP_UNSIGNED_BIN_SIZE_C +#define BN_MP_XOR_C +#define BN_MP_ZERO_C +#define BN_MP_ZERO_MULTI_C +#define BN_PRIME_TAB_C +#define BN_REVERSE_C +#define BN_S_MP_ADD_C +#define BN_S_MP_EXPTMOD_C +#define BN_S_MP_MUL_DIGS_C +#define BN_S_MP_MUL_HIGH_DIGS_C +#define BN_S_MP_SQR_C +#define BN_S_MP_SUB_C +#define BNCORE_C +#endif + +#if defined(BN_ERROR_C) + #define BN_MP_ERROR_TO_STRING_C +#endif + +#if defined(BN_FAST_MP_INVMOD_C) + #define BN_MP_ISEVEN_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_COPY_C + #define BN_MP_MOD_C + #define BN_MP_SET_C + #define BN_MP_DIV_2_C + #define BN_MP_ISODD_C + #define BN_MP_SUB_C + #define BN_MP_CMP_C + #define BN_MP_ISZERO_C + #define BN_MP_CMP_D_C + #define BN_MP_ADD_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_FAST_MP_MONTGOMERY_REDUCE_C) + #define BN_MP_GROW_C + #define BN_MP_RSHD_C + #define BN_MP_CLAMP_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_FAST_S_MP_MUL_DIGS_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_FAST_S_MP_MUL_HIGH_DIGS_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_FAST_S_MP_SQR_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_2EXPT_C) + #define BN_MP_ZERO_C + #define BN_MP_GROW_C +#endif + +#if defined(BN_MP_ABS_C) + #define BN_MP_COPY_C +#endif + +#if defined(BN_MP_ADD_C) + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_ADD_D_C) + #define BN_MP_GROW_C + #define BN_MP_SUB_D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_ADDMOD_C) + #define BN_MP_INIT_C + #define BN_MP_ADD_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_AND_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_CLAMP_C) +#endif + +#if defined(BN_MP_CLEAR_C) +#endif + +#if defined(BN_MP_CLEAR_MULTI_C) + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_CMP_C) + #define BN_MP_CMP_MAG_C +#endif + +#if defined(BN_MP_CMP_D_C) +#endif + +#if defined(BN_MP_CMP_MAG_C) +#endif + +#if defined(BN_MP_CNT_LSB_C) + #define BN_MP_ISZERO_C +#endif + +#if defined(BN_MP_COPY_C) + #define BN_MP_GROW_C +#endif + +#if defined(BN_MP_COUNT_BITS_C) +#endif + +#if defined(BN_MP_DIV_C) + #define BN_MP_ISZERO_C + #define BN_MP_CMP_MAG_C + #define BN_MP_COPY_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_SET_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_ABS_C + #define BN_MP_MUL_2D_C + #define BN_MP_CMP_C + #define BN_MP_SUB_C + #define BN_MP_ADD_C + #define BN_MP_DIV_2D_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_INIT_C + #define BN_MP_INIT_COPY_C + #define BN_MP_LSHD_C + #define BN_MP_RSHD_C + #define BN_MP_MUL_D_C + #define BN_MP_CLAMP_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_DIV_2_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_DIV_2D_C) + #define BN_MP_COPY_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_C + #define BN_MP_MOD_2D_C + #define BN_MP_CLEAR_C + #define BN_MP_RSHD_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_MP_DIV_3_C) + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_DIV_D_C) + #define BN_MP_ISZERO_C + #define BN_MP_COPY_C + #define BN_MP_DIV_2D_C + #define BN_MP_DIV_3_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_DR_IS_MODULUS_C) +#endif + +#if defined(BN_MP_DR_REDUCE_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_DR_SETUP_C) +#endif + +#if defined(BN_MP_EXCH_C) +#endif + +#if defined(BN_MP_EXPT_D_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_SET_C + #define BN_MP_SQR_C + #define BN_MP_CLEAR_C + #define BN_MP_MUL_C +#endif + +#if defined(BN_MP_EXPTMOD_C) + #define BN_MP_INIT_C + #define BN_MP_INVMOD_C + #define BN_MP_CLEAR_C + #define BN_MP_ABS_C + #define BN_MP_CLEAR_MULTI_C + #define BN_MP_REDUCE_IS_2K_L_C + #define BN_S_MP_EXPTMOD_C + #define BN_MP_DR_IS_MODULUS_C + #define BN_MP_REDUCE_IS_2K_C + #define BN_MP_ISODD_C + #define BN_MP_EXPTMOD_FAST_C +#endif + +#if defined(BN_MP_EXPTMOD_FAST_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_INIT_C + #define BN_MP_CLEAR_C + #define BN_MP_MONTGOMERY_SETUP_C + #define BN_FAST_MP_MONTGOMERY_REDUCE_C + #define BN_MP_MONTGOMERY_REDUCE_C + #define BN_MP_DR_SETUP_C + #define BN_MP_DR_REDUCE_C + #define BN_MP_REDUCE_2K_SETUP_C + #define BN_MP_REDUCE_2K_C + #define BN_MP_MONTGOMERY_CALC_NORMALIZATION_C + #define BN_MP_MULMOD_C + #define BN_MP_SET_C + #define BN_MP_MOD_C + #define BN_MP_COPY_C + #define BN_MP_SQR_C + #define BN_MP_MUL_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_MP_EXTEUCLID_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_SET_C + #define BN_MP_COPY_C + #define BN_MP_ISZERO_C + #define BN_MP_DIV_C + #define BN_MP_MUL_C + #define BN_MP_SUB_C + #define BN_MP_NEG_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_FREAD_C) + #define BN_MP_ZERO_C + #define BN_MP_S_RMAP_C + #define BN_MP_MUL_D_C + #define BN_MP_ADD_D_C + #define BN_MP_CMP_D_C +#endif + +#if defined(BN_MP_FWRITE_C) + #define BN_MP_RADIX_SIZE_C + #define BN_MP_TORADIX_C +#endif + +#if defined(BN_MP_GCD_C) + #define BN_MP_ISZERO_C + #define BN_MP_ABS_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_CNT_LSB_C + #define BN_MP_DIV_2D_C + #define BN_MP_CMP_MAG_C + #define BN_MP_EXCH_C + #define BN_S_MP_SUB_C + #define BN_MP_MUL_2D_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_GET_INT_C) +#endif + +#if defined(BN_MP_GROW_C) +#endif + +#if defined(BN_MP_INIT_C) +#endif + +#if defined(BN_MP_INIT_COPY_C) + #define BN_MP_COPY_C +#endif + +#if defined(BN_MP_INIT_MULTI_C) + #define BN_MP_ERR_C + #define BN_MP_INIT_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_INIT_SET_C) + #define BN_MP_INIT_C + #define BN_MP_SET_C +#endif + +#if defined(BN_MP_INIT_SET_INT_C) + #define BN_MP_INIT_C + #define BN_MP_SET_INT_C +#endif + +#if defined(BN_MP_INIT_SIZE_C) + #define BN_MP_INIT_C +#endif + +#if defined(BN_MP_INVMOD_C) + #define BN_MP_ISZERO_C + #define BN_MP_ISODD_C + #define BN_FAST_MP_INVMOD_C + #define BN_MP_INVMOD_SLOW_C +#endif + +#if defined(BN_MP_INVMOD_SLOW_C) + #define BN_MP_ISZERO_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_MOD_C + #define BN_MP_COPY_C + #define BN_MP_ISEVEN_C + #define BN_MP_SET_C + #define BN_MP_DIV_2_C + #define BN_MP_ISODD_C + #define BN_MP_ADD_C + #define BN_MP_SUB_C + #define BN_MP_CMP_C + #define BN_MP_CMP_D_C + #define BN_MP_CMP_MAG_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_IS_SQUARE_C) + #define BN_MP_MOD_D_C + #define BN_MP_INIT_SET_INT_C + #define BN_MP_MOD_C + #define BN_MP_GET_INT_C + #define BN_MP_SQRT_C + #define BN_MP_SQR_C + #define BN_MP_CMP_MAG_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_JACOBI_C) + #define BN_MP_CMP_D_C + #define BN_MP_ISZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_CNT_LSB_C + #define BN_MP_DIV_2D_C + #define BN_MP_MOD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_KARATSUBA_MUL_C) + #define BN_MP_MUL_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_SUB_C + #define BN_MP_ADD_C + #define BN_MP_LSHD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_KARATSUBA_SQR_C) + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_SQR_C + #define BN_MP_SUB_C + #define BN_S_MP_ADD_C + #define BN_MP_LSHD_C + #define BN_MP_ADD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_LCM_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_GCD_C + #define BN_MP_CMP_MAG_C + #define BN_MP_DIV_C + #define BN_MP_MUL_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_LSHD_C) + #define BN_MP_GROW_C + #define BN_MP_RSHD_C +#endif + +#if defined(BN_MP_MOD_C) + #define BN_MP_INIT_C + #define BN_MP_DIV_C + #define BN_MP_CLEAR_C + #define BN_MP_ADD_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_MP_MOD_2D_C) + #define BN_MP_ZERO_C + #define BN_MP_COPY_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_MOD_D_C) + #define BN_MP_DIV_D_C +#endif + +#if defined(BN_MP_MONTGOMERY_CALC_NORMALIZATION_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_2EXPT_C + #define BN_MP_SET_C + #define BN_MP_MUL_2_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_MONTGOMERY_REDUCE_C) + #define BN_FAST_MP_MONTGOMERY_REDUCE_C + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C + #define BN_MP_RSHD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_MONTGOMERY_SETUP_C) +#endif + +#if defined(BN_MP_MUL_C) + #define BN_MP_TOOM_MUL_C + #define BN_MP_KARATSUBA_MUL_C + #define BN_FAST_S_MP_MUL_DIGS_C + #define BN_S_MP_MUL_C + #define BN_S_MP_MUL_DIGS_C +#endif + +#if defined(BN_MP_MUL_2_C) + #define BN_MP_GROW_C +#endif + +#if defined(BN_MP_MUL_2D_C) + #define BN_MP_COPY_C + #define BN_MP_GROW_C + #define BN_MP_LSHD_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_MUL_D_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_MULMOD_C) + #define BN_MP_INIT_C + #define BN_MP_MUL_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_N_ROOT_C) + #define BN_MP_INIT_C + #define BN_MP_SET_C + #define BN_MP_COPY_C + #define BN_MP_EXPT_D_C + #define BN_MP_MUL_C + #define BN_MP_SUB_C + #define BN_MP_MUL_D_C + #define BN_MP_DIV_C + #define BN_MP_CMP_C + #define BN_MP_SUB_D_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_NEG_C) + #define BN_MP_COPY_C + #define BN_MP_ISZERO_C +#endif + +#if defined(BN_MP_OR_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_FERMAT_C) + #define BN_MP_CMP_D_C + #define BN_MP_INIT_C + #define BN_MP_EXPTMOD_C + #define BN_MP_CMP_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_IS_DIVISIBLE_C) + #define BN_MP_MOD_D_C +#endif + +#if defined(BN_MP_PRIME_IS_PRIME_C) + #define BN_MP_CMP_D_C + #define BN_MP_PRIME_IS_DIVISIBLE_C + #define BN_MP_INIT_C + #define BN_MP_SET_C + #define BN_MP_PRIME_MILLER_RABIN_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_MILLER_RABIN_C) + #define BN_MP_CMP_D_C + #define BN_MP_INIT_COPY_C + #define BN_MP_SUB_D_C + #define BN_MP_CNT_LSB_C + #define BN_MP_DIV_2D_C + #define BN_MP_EXPTMOD_C + #define BN_MP_CMP_C + #define BN_MP_SQRMOD_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_NEXT_PRIME_C) + #define BN_MP_CMP_D_C + #define BN_MP_SET_C + #define BN_MP_SUB_D_C + #define BN_MP_ISEVEN_C + #define BN_MP_MOD_D_C + #define BN_MP_INIT_C + #define BN_MP_ADD_D_C + #define BN_MP_PRIME_MILLER_RABIN_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_PRIME_RABIN_MILLER_TRIALS_C) +#endif + +#if defined(BN_MP_PRIME_RANDOM_EX_C) + #define BN_MP_READ_UNSIGNED_BIN_C + #define BN_MP_PRIME_IS_PRIME_C + #define BN_MP_SUB_D_C + #define BN_MP_DIV_2_C + #define BN_MP_MUL_2_C + #define BN_MP_ADD_D_C +#endif + +#if defined(BN_MP_RADIX_SIZE_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_INIT_COPY_C + #define BN_MP_ISZERO_C + #define BN_MP_DIV_D_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_RADIX_SMAP_C) + #define BN_MP_S_RMAP_C +#endif + +#if defined(BN_MP_RAND_C) + #define BN_MP_ZERO_C + #define BN_MP_ADD_D_C + #define BN_MP_LSHD_C +#endif + +#if defined(BN_MP_READ_RADIX_C) + #define BN_MP_ZERO_C + #define BN_MP_S_RMAP_C + #define BN_MP_RADIX_SMAP_C + #define BN_MP_MUL_D_C + #define BN_MP_ADD_D_C + #define BN_MP_ISZERO_C +#endif + +#if defined(BN_MP_READ_SIGNED_BIN_C) + #define BN_MP_READ_UNSIGNED_BIN_C +#endif + +#if defined(BN_MP_READ_UNSIGNED_BIN_C) + #define BN_MP_GROW_C + #define BN_MP_ZERO_C + #define BN_MP_MUL_2D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_REDUCE_C) + #define BN_MP_REDUCE_SETUP_C + #define BN_MP_INIT_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_MUL_C + #define BN_S_MP_MUL_HIGH_DIGS_C + #define BN_FAST_S_MP_MUL_HIGH_DIGS_C + #define BN_MP_MOD_2D_C + #define BN_S_MP_MUL_DIGS_C + #define BN_MP_SUB_C + #define BN_MP_CMP_D_C + #define BN_MP_SET_C + #define BN_MP_LSHD_C + #define BN_MP_ADD_C + #define BN_MP_CMP_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_2K_C) + #define BN_MP_INIT_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_DIV_2D_C + #define BN_MP_MUL_D_C + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_2K_L_C) + #define BN_MP_INIT_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_DIV_2D_C + #define BN_MP_MUL_C + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_2K_SETUP_C) + #define BN_MP_INIT_C + #define BN_MP_COUNT_BITS_C + #define BN_MP_2EXPT_C + #define BN_MP_CLEAR_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_REDUCE_2K_SETUP_L_C) + #define BN_MP_INIT_C + #define BN_MP_2EXPT_C + #define BN_MP_COUNT_BITS_C + #define BN_S_MP_SUB_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_REDUCE_IS_2K_C) + #define BN_MP_REDUCE_2K_C + #define BN_MP_COUNT_BITS_C +#endif + +#if defined(BN_MP_REDUCE_IS_2K_L_C) +#endif + +#if defined(BN_MP_REDUCE_SETUP_C) + #define BN_MP_2EXPT_C + #define BN_MP_DIV_C +#endif + +#if defined(BN_MP_RSHD_C) + #define BN_MP_ZERO_C +#endif + +#if defined(BN_MP_SET_C) + #define BN_MP_ZERO_C +#endif + +#if defined(BN_MP_SET_INT_C) + #define BN_MP_ZERO_C + #define BN_MP_MUL_2D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_SHRINK_C) +#endif + +#if defined(BN_MP_SIGNED_BIN_SIZE_C) + #define BN_MP_UNSIGNED_BIN_SIZE_C +#endif + +#if defined(BN_MP_SQR_C) + #define BN_MP_TOOM_SQR_C + #define BN_MP_KARATSUBA_SQR_C + #define BN_FAST_S_MP_SQR_C + #define BN_S_MP_SQR_C +#endif + +#if defined(BN_MP_SQRMOD_C) + #define BN_MP_INIT_C + #define BN_MP_SQR_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_SQRT_C) + #define BN_MP_N_ROOT_C + #define BN_MP_ISZERO_C + #define BN_MP_ZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_DIV_C + #define BN_MP_ADD_C + #define BN_MP_DIV_2_C + #define BN_MP_CMP_MAG_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_SUB_C) + #define BN_S_MP_ADD_C + #define BN_MP_CMP_MAG_C + #define BN_S_MP_SUB_C +#endif + +#if defined(BN_MP_SUB_D_C) + #define BN_MP_GROW_C + #define BN_MP_ADD_D_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_MP_SUBMOD_C) + #define BN_MP_INIT_C + #define BN_MP_SUB_C + #define BN_MP_CLEAR_C + #define BN_MP_MOD_C +#endif + +#if defined(BN_MP_TO_SIGNED_BIN_C) + #define BN_MP_TO_UNSIGNED_BIN_C +#endif + +#if defined(BN_MP_TO_SIGNED_BIN_N_C) + #define BN_MP_SIGNED_BIN_SIZE_C + #define BN_MP_TO_SIGNED_BIN_C +#endif + +#if defined(BN_MP_TO_UNSIGNED_BIN_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_ISZERO_C + #define BN_MP_DIV_2D_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_TO_UNSIGNED_BIN_N_C) + #define BN_MP_UNSIGNED_BIN_SIZE_C + #define BN_MP_TO_UNSIGNED_BIN_C +#endif + +#if defined(BN_MP_TOOM_MUL_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_MOD_2D_C + #define BN_MP_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_MUL_C + #define BN_MP_MUL_2_C + #define BN_MP_ADD_C + #define BN_MP_SUB_C + #define BN_MP_DIV_2_C + #define BN_MP_MUL_2D_C + #define BN_MP_MUL_D_C + #define BN_MP_DIV_3_C + #define BN_MP_LSHD_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_TOOM_SQR_C) + #define BN_MP_INIT_MULTI_C + #define BN_MP_MOD_2D_C + #define BN_MP_COPY_C + #define BN_MP_RSHD_C + #define BN_MP_SQR_C + #define BN_MP_MUL_2_C + #define BN_MP_ADD_C + #define BN_MP_SUB_C + #define BN_MP_DIV_2_C + #define BN_MP_MUL_2D_C + #define BN_MP_MUL_D_C + #define BN_MP_DIV_3_C + #define BN_MP_LSHD_C + #define BN_MP_CLEAR_MULTI_C +#endif + +#if defined(BN_MP_TORADIX_C) + #define BN_MP_ISZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_DIV_D_C + #define BN_MP_CLEAR_C + #define BN_MP_S_RMAP_C +#endif + +#if defined(BN_MP_TORADIX_N_C) + #define BN_MP_ISZERO_C + #define BN_MP_INIT_COPY_C + #define BN_MP_DIV_D_C + #define BN_MP_CLEAR_C + #define BN_MP_S_RMAP_C +#endif + +#if defined(BN_MP_UNSIGNED_BIN_SIZE_C) + #define BN_MP_COUNT_BITS_C +#endif + +#if defined(BN_MP_XOR_C) + #define BN_MP_INIT_COPY_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_MP_ZERO_C) +#endif + +#if defined(BN_PRIME_TAB_C) +#endif + +#if defined(BN_REVERSE_C) +#endif + +#if defined(BN_S_MP_ADD_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BN_S_MP_EXPTMOD_C) + #define BN_MP_COUNT_BITS_C + #define BN_MP_INIT_C + #define BN_MP_CLEAR_C + #define BN_MP_REDUCE_SETUP_C + #define BN_MP_REDUCE_C + #define BN_MP_REDUCE_2K_SETUP_L_C + #define BN_MP_REDUCE_2K_L_C + #define BN_MP_MOD_C + #define BN_MP_COPY_C + #define BN_MP_SQR_C + #define BN_MP_MUL_C + #define BN_MP_SET_C + #define BN_MP_EXCH_C +#endif + +#if defined(BN_S_MP_MUL_DIGS_C) + #define BN_FAST_S_MP_MUL_DIGS_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_S_MP_MUL_HIGH_DIGS_C) + #define BN_FAST_S_MP_MUL_HIGH_DIGS_C + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_S_MP_SQR_C) + #define BN_MP_INIT_SIZE_C + #define BN_MP_CLAMP_C + #define BN_MP_EXCH_C + #define BN_MP_CLEAR_C +#endif + +#if defined(BN_S_MP_SUB_C) + #define BN_MP_GROW_C + #define BN_MP_CLAMP_C +#endif + +#if defined(BNCORE_C) +#endif + +#ifdef LTM3 +#define LTM_LAST +#endif +#include +#include +#else +#define LTM_LAST +#endif + +/* $Source: /cvs/libtom/libtommath/tommath_class.h,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/07/28 11:59:32 $ */ diff --git a/crypto/heimdal/lib/hcrypto/libtommath/tommath_superclass.h b/crypto/heimdal/lib/hcrypto/libtommath/tommath_superclass.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/libtommath/tommath_superclass.h @@ -0,0 +1,76 @@ +/* super class file for PK algos */ + +/* default ... include all MPI */ +#define LTM_ALL + +/* RSA only (does not support DH/DSA/ECC) */ +/* #define SC_RSA_1 */ + +/* For reference.... On an Athlon64 optimizing for speed... + + LTM's mpi.o with all functions [striped] is 142KiB in size. + +*/ + +/* Works for RSA only, mpi.o is 68KiB */ +#ifdef SC_RSA_1 + #define BN_MP_SHRINK_C + #define BN_MP_LCM_C + #define BN_MP_PRIME_RANDOM_EX_C + #define BN_MP_INVMOD_C + #define BN_MP_GCD_C + #define BN_MP_MOD_C + #define BN_MP_MULMOD_C + #define BN_MP_ADDMOD_C + #define BN_MP_EXPTMOD_C + #define BN_MP_SET_INT_C + #define BN_MP_INIT_MULTI_C + #define BN_MP_CLEAR_MULTI_C + #define BN_MP_UNSIGNED_BIN_SIZE_C + #define BN_MP_TO_UNSIGNED_BIN_C + #define BN_MP_MOD_D_C + #define BN_MP_PRIME_RABIN_MILLER_TRIALS_C + #define BN_REVERSE_C + #define BN_PRIME_TAB_C + + /* other modifiers */ + #define BN_MP_DIV_SMALL /* Slower division, not critical */ + + /* here we are on the last pass so we turn things off. The functions classes are still there + * but we remove them specifically from the build. This also invokes tweaks in functions + * like removing support for even moduli, etc... + */ +#ifdef LTM_LAST + #undef BN_MP_TOOM_MUL_C + #undef BN_MP_TOOM_SQR_C + #undef BN_MP_KARATSUBA_MUL_C + #undef BN_MP_KARATSUBA_SQR_C + #undef BN_MP_REDUCE_C + #undef BN_MP_REDUCE_SETUP_C + #undef BN_MP_DR_IS_MODULUS_C + #undef BN_MP_DR_SETUP_C + #undef BN_MP_DR_REDUCE_C + #undef BN_MP_REDUCE_IS_2K_C + #undef BN_MP_REDUCE_2K_SETUP_C + #undef BN_MP_REDUCE_2K_C + #undef BN_S_MP_EXPTMOD_C + #undef BN_MP_DIV_3_C + #undef BN_S_MP_MUL_HIGH_DIGS_C + #undef BN_FAST_S_MP_MUL_HIGH_DIGS_C + #undef BN_FAST_MP_INVMOD_C + + /* To safely undefine these you have to make sure your RSA key won't exceed the Comba threshold + * which is roughly 255 digits [7140 bits for 32-bit machines, 15300 bits for 64-bit machines] + * which means roughly speaking you can handle upto 2536-bit RSA keys with these defined without + * trouble. + */ + #undef BN_S_MP_MUL_DIGS_C + #undef BN_S_MP_SQR_C + #undef BN_MP_MONTGOMERY_REDUCE_C +#endif + +#endif + +/* $Source: /cvs/libtom/libtommath/tommath_superclass.h,v $ */ +/* $Revision: 1.3 $ */ +/* $Date: 2005/05/14 13:29:17 $ */ diff --git a/crypto/heimdal/lib/hcrypto/md4.h b/crypto/heimdal/lib/hcrypto/md4.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/md4.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_MD4_H +#define HEIM_MD4_H 1 + +/* symbol renaming */ +#define MD4_Init hc_MD4_Init +#define MD4_Update hc_MD4_Update +#define MD4_Final hc_MD4_Final + +/* + * + */ + +#define MD4_DIGEST_LENGTH 16 + +struct md4 { + unsigned int sz[2]; + uint32_t counter[4]; + unsigned char save[64]; +}; + +typedef struct md4 MD4_CTX; + +int MD4_Init (struct md4 *m); +int MD4_Update (struct md4 *m, const void *p, size_t len); +int MD4_Final (void *res, struct md4 *m); + +#endif /* HEIM_MD4_H */ diff --git a/crypto/heimdal/lib/hcrypto/md4.c b/crypto/heimdal/lib/hcrypto/md4.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/md4.c @@ -0,0 +1,250 @@ +/* + * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include "hash.h" +#include "md4.h" + +#define A m->counter[0] +#define B m->counter[1] +#define C m->counter[2] +#define D m->counter[3] +#define X data + +int +MD4_Init (struct md4 *m) +{ + m->sz[0] = 0; + m->sz[1] = 0; + D = 0x10325476; + C = 0x98badcfe; + B = 0xefcdab89; + A = 0x67452301; + return 1; +} + +#define F(x,y,z) CRAYFIX((x & y) | (~x & z)) +#define G(x,y,z) ((x & y) | (x & z) | (y & z)) +#define H(x,y,z) (x ^ y ^ z) + +#define DOIT(a,b,c,d,k,s,i,OP) \ +a = cshift(a + OP(b,c,d) + X[k] + i, s) + +#define DO1(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,F) +#define DO2(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,G) +#define DO3(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,H) + +static inline void +calc (struct md4 *m, uint32_t *data) +{ + uint32_t AA, BB, CC, DD; + + AA = A; + BB = B; + CC = C; + DD = D; + + /* Round 1 */ + + DO1(A,B,C,D,0,3,0); + DO1(D,A,B,C,1,7,0); + DO1(C,D,A,B,2,11,0); + DO1(B,C,D,A,3,19,0); + + DO1(A,B,C,D,4,3,0); + DO1(D,A,B,C,5,7,0); + DO1(C,D,A,B,6,11,0); + DO1(B,C,D,A,7,19,0); + + DO1(A,B,C,D,8,3,0); + DO1(D,A,B,C,9,7,0); + DO1(C,D,A,B,10,11,0); + DO1(B,C,D,A,11,19,0); + + DO1(A,B,C,D,12,3,0); + DO1(D,A,B,C,13,7,0); + DO1(C,D,A,B,14,11,0); + DO1(B,C,D,A,15,19,0); + + /* Round 2 */ + + DO2(A,B,C,D,0,3,0x5A827999); + DO2(D,A,B,C,4,5,0x5A827999); + DO2(C,D,A,B,8,9,0x5A827999); + DO2(B,C,D,A,12,13,0x5A827999); + + DO2(A,B,C,D,1,3,0x5A827999); + DO2(D,A,B,C,5,5,0x5A827999); + DO2(C,D,A,B,9,9,0x5A827999); + DO2(B,C,D,A,13,13,0x5A827999); + + DO2(A,B,C,D,2,3,0x5A827999); + DO2(D,A,B,C,6,5,0x5A827999); + DO2(C,D,A,B,10,9,0x5A827999); + DO2(B,C,D,A,14,13,0x5A827999); + + DO2(A,B,C,D,3,3,0x5A827999); + DO2(D,A,B,C,7,5,0x5A827999); + DO2(C,D,A,B,11,9,0x5A827999); + DO2(B,C,D,A,15,13,0x5A827999); + + /* Round 3 */ + + DO3(A,B,C,D,0,3,0x6ED9EBA1); + DO3(D,A,B,C,8,9,0x6ED9EBA1); + DO3(C,D,A,B,4,11,0x6ED9EBA1); + DO3(B,C,D,A,12,15,0x6ED9EBA1); + + DO3(A,B,C,D,2,3,0x6ED9EBA1); + DO3(D,A,B,C,10,9,0x6ED9EBA1); + DO3(C,D,A,B,6,11,0x6ED9EBA1); + DO3(B,C,D,A,14,15,0x6ED9EBA1); + + DO3(A,B,C,D,1,3,0x6ED9EBA1); + DO3(D,A,B,C,9,9,0x6ED9EBA1); + DO3(C,D,A,B,5,11,0x6ED9EBA1); + DO3(B,C,D,A,13,15,0x6ED9EBA1); + + DO3(A,B,C,D,3,3,0x6ED9EBA1); + DO3(D,A,B,C,11,9,0x6ED9EBA1); + DO3(C,D,A,B,7,11,0x6ED9EBA1); + DO3(B,C,D,A,15,15,0x6ED9EBA1); + + A += AA; + B += BB; + C += CC; + D += DD; +} + +/* + * From `Performance analysis of MD5' by Joseph D. Touch + */ + +#if defined(WORDS_BIGENDIAN) +static inline uint32_t +swap_uint32_t (uint32_t t) +{ + uint32_t temp1, temp2; + + temp1 = cshift(t, 16); + temp2 = temp1 >> 8; + temp1 &= 0x00ff00ff; + temp2 &= 0x00ff00ff; + temp1 <<= 8; + return temp1 | temp2; +} +#endif + +struct x32{ + unsigned int a:32; + unsigned int b:32; +}; + +int +MD4_Update (struct md4 *m, const void *v, size_t len) +{ + const unsigned char *p = v; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 64; + while(len > 0) { + size_t l = min(len, 64 - offset); + memcpy(m->save + offset, p, l); + offset += l; + p += l; + len -= l; + if(offset == 64) { +#if defined(WORDS_BIGENDIAN) + int i; + uint32_t current[16]; + struct x32 *us = (struct x32*)m->save; + for(i = 0; i < 8; i++){ + current[2*i+0] = swap_uint32_t(us[i].a); + current[2*i+1] = swap_uint32_t(us[i].b); + } + calc(m, current); +#else + calc(m, (uint32_t*)m->save); +#endif + offset = 0; + } + } + return 1; +} + +int +MD4_Final (void *res, struct md4 *m) +{ + unsigned char zeros[72]; + unsigned offset = (m->sz[0] / 8) % 64; + unsigned int dstart = (120 - offset - 1) % 64 + 1; + + *zeros = 0x80; + memset (zeros + 1, 0, sizeof(zeros) - 1); + zeros[dstart+0] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+1] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+2] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+3] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+4] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+5] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+6] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+7] = (m->sz[1] >> 24) & 0xff; + MD4_Update (m, zeros, dstart + 8); + { + int i; + unsigned char *r = (unsigned char *)res; + + for (i = 0; i < 4; ++i) { + r[4*i] = m->counter[i] & 0xFF; + r[4*i+1] = (m->counter[i] >> 8) & 0xFF; + r[4*i+2] = (m->counter[i] >> 16) & 0xFF; + r[4*i+3] = (m->counter[i] >> 24) & 0xFF; + } + } +#if 0 + { + int i; + uint32_t *r = (uint32_t *)res; + + for (i = 0; i < 4; ++i) + r[i] = swap_uint32_t (m->counter[i]); + } +#endif + return 1; +} diff --git a/crypto/heimdal/lib/hcrypto/md5.h b/crypto/heimdal/lib/hcrypto/md5.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/md5.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIM_MD5_H +#define HEIM_MD5_H 1 + +/* symbol renaming */ +#define MD5_Init hc_MD5_Init +#define MD5_Update hc_MD5_Update +#define MD5_Final hc_MD5_Final + +/* + * + */ + +#define MD5_DIGEST_LENGTH 16 + +struct md5 { + unsigned int sz[2]; + uint32_t counter[4]; + unsigned char save[64]; +}; + +typedef struct md5 MD5_CTX; + +int MD5_Init (struct md5 *m); +int MD5_Update (struct md5 *m, const void *p, size_t len); +int MD5_Final (void *res, struct md5 *m); /* uint32_t res[4] */ + +#endif /* HEIM_MD5_H */ diff --git a/crypto/heimdal/lib/hcrypto/md5.c b/crypto/heimdal/lib/hcrypto/md5.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/md5.c @@ -0,0 +1,274 @@ +/* + * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include "hash.h" +#include "md5.h" + +#define A m->counter[0] +#define B m->counter[1] +#define C m->counter[2] +#define D m->counter[3] +#define X data + +int +MD5_Init (struct md5 *m) +{ + m->sz[0] = 0; + m->sz[1] = 0; + D = 0x10325476; + C = 0x98badcfe; + B = 0xefcdab89; + A = 0x67452301; + return 1; +} + +#define F(x,y,z) CRAYFIX((x & y) | (~x & z)) +#define G(x,y,z) CRAYFIX((x & z) | (y & ~z)) +#define H(x,y,z) (x ^ y ^ z) +#define I(x,y,z) CRAYFIX(y ^ (x | ~z)) + +#define DOIT(a,b,c,d,k,s,i,OP) \ +a = b + cshift(a + OP(b,c,d) + X[k] + (i), s) + +#define DO1(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,F) +#define DO2(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,G) +#define DO3(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,H) +#define DO4(a,b,c,d,k,s,i) DOIT(a,b,c,d,k,s,i,I) + +static inline void +calc (struct md5 *m, uint32_t *data) +{ + uint32_t AA, BB, CC, DD; + + AA = A; + BB = B; + CC = C; + DD = D; + + /* Round 1 */ + + DO1(A,B,C,D,0,7,0xd76aa478); + DO1(D,A,B,C,1,12,0xe8c7b756); + DO1(C,D,A,B,2,17,0x242070db); + DO1(B,C,D,A,3,22,0xc1bdceee); + + DO1(A,B,C,D,4,7,0xf57c0faf); + DO1(D,A,B,C,5,12,0x4787c62a); + DO1(C,D,A,B,6,17,0xa8304613); + DO1(B,C,D,A,7,22,0xfd469501); + + DO1(A,B,C,D,8,7,0x698098d8); + DO1(D,A,B,C,9,12,0x8b44f7af); + DO1(C,D,A,B,10,17,0xffff5bb1); + DO1(B,C,D,A,11,22,0x895cd7be); + + DO1(A,B,C,D,12,7,0x6b901122); + DO1(D,A,B,C,13,12,0xfd987193); + DO1(C,D,A,B,14,17,0xa679438e); + DO1(B,C,D,A,15,22,0x49b40821); + + /* Round 2 */ + + DO2(A,B,C,D,1,5,0xf61e2562); + DO2(D,A,B,C,6,9,0xc040b340); + DO2(C,D,A,B,11,14,0x265e5a51); + DO2(B,C,D,A,0,20,0xe9b6c7aa); + + DO2(A,B,C,D,5,5,0xd62f105d); + DO2(D,A,B,C,10,9,0x2441453); + DO2(C,D,A,B,15,14,0xd8a1e681); + DO2(B,C,D,A,4,20,0xe7d3fbc8); + + DO2(A,B,C,D,9,5,0x21e1cde6); + DO2(D,A,B,C,14,9,0xc33707d6); + DO2(C,D,A,B,3,14,0xf4d50d87); + DO2(B,C,D,A,8,20,0x455a14ed); + + DO2(A,B,C,D,13,5,0xa9e3e905); + DO2(D,A,B,C,2,9,0xfcefa3f8); + DO2(C,D,A,B,7,14,0x676f02d9); + DO2(B,C,D,A,12,20,0x8d2a4c8a); + + /* Round 3 */ + + DO3(A,B,C,D,5,4,0xfffa3942); + DO3(D,A,B,C,8,11,0x8771f681); + DO3(C,D,A,B,11,16,0x6d9d6122); + DO3(B,C,D,A,14,23,0xfde5380c); + + DO3(A,B,C,D,1,4,0xa4beea44); + DO3(D,A,B,C,4,11,0x4bdecfa9); + DO3(C,D,A,B,7,16,0xf6bb4b60); + DO3(B,C,D,A,10,23,0xbebfbc70); + + DO3(A,B,C,D,13,4,0x289b7ec6); + DO3(D,A,B,C,0,11,0xeaa127fa); + DO3(C,D,A,B,3,16,0xd4ef3085); + DO3(B,C,D,A,6,23,0x4881d05); + + DO3(A,B,C,D,9,4,0xd9d4d039); + DO3(D,A,B,C,12,11,0xe6db99e5); + DO3(C,D,A,B,15,16,0x1fa27cf8); + DO3(B,C,D,A,2,23,0xc4ac5665); + + /* Round 4 */ + + DO4(A,B,C,D,0,6,0xf4292244); + DO4(D,A,B,C,7,10,0x432aff97); + DO4(C,D,A,B,14,15,0xab9423a7); + DO4(B,C,D,A,5,21,0xfc93a039); + + DO4(A,B,C,D,12,6,0x655b59c3); + DO4(D,A,B,C,3,10,0x8f0ccc92); + DO4(C,D,A,B,10,15,0xffeff47d); + DO4(B,C,D,A,1,21,0x85845dd1); + + DO4(A,B,C,D,8,6,0x6fa87e4f); + DO4(D,A,B,C,15,10,0xfe2ce6e0); + DO4(C,D,A,B,6,15,0xa3014314); + DO4(B,C,D,A,13,21,0x4e0811a1); + + DO4(A,B,C,D,4,6,0xf7537e82); + DO4(D,A,B,C,11,10,0xbd3af235); + DO4(C,D,A,B,2,15,0x2ad7d2bb); + DO4(B,C,D,A,9,21,0xeb86d391); + + A += AA; + B += BB; + C += CC; + D += DD; +} + +/* + * From `Performance analysis of MD5' by Joseph D. Touch + */ + +#if defined(WORDS_BIGENDIAN) +static inline uint32_t +swap_uint32_t (uint32_t t) +{ + uint32_t temp1, temp2; + + temp1 = cshift(t, 16); + temp2 = temp1 >> 8; + temp1 &= 0x00ff00ff; + temp2 &= 0x00ff00ff; + temp1 <<= 8; + return temp1 | temp2; +} +#endif + +struct x32{ + unsigned int a:32; + unsigned int b:32; +}; + +int +MD5_Update (struct md5 *m, const void *v, size_t len) +{ + const unsigned char *p = v; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 64; + while(len > 0){ + size_t l = min(len, 64 - offset); + memcpy(m->save + offset, p, l); + offset += l; + p += l; + len -= l; + if(offset == 64){ +#if defined(WORDS_BIGENDIAN) + int i; + uint32_t swapped[16]; + struct x32 *us = (struct x32*)m->save; + for(i = 0; i < 8; i++){ + swapped[2*i+0] = swap_uint32_t(us[i].a); + swapped[2*i+1] = swap_uint32_t(us[i].b); + } + calc(m, swapped); +#else + calc(m, (uint32_t*)m->save); +#endif + offset = 0; + } + } + return 1; +} + +int +MD5_Final (void *res, struct md5 *m) +{ + unsigned char zeros[72]; + unsigned offset = (m->sz[0] / 8) % 64; + unsigned int dstart = (120 - offset - 1) % 64 + 1; + + *zeros = 0x80; + memset (zeros + 1, 0, sizeof(zeros) - 1); + zeros[dstart+0] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+1] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+2] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+3] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+4] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+5] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+6] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+7] = (m->sz[1] >> 24) & 0xff; + MD5_Update (m, zeros, dstart + 8); + { + int i; + unsigned char *r = (unsigned char *)res; + + for (i = 0; i < 4; ++i) { + r[4*i] = m->counter[i] & 0xFF; + r[4*i+1] = (m->counter[i] >> 8) & 0xFF; + r[4*i+2] = (m->counter[i] >> 16) & 0xFF; + r[4*i+3] = (m->counter[i] >> 24) & 0xFF; + } + } +#if 0 + { + int i; + uint32_t *r = (uint32_t *)res; + + for (i = 0; i < 4; ++i) + r[i] = swap_uint32_t (m->counter[i]); + } +#endif + return 1; +} diff --git a/crypto/heimdal/lib/hcrypto/md5crypt_test.c b/crypto/heimdal/lib/hcrypto/md5crypt_test.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/md5crypt_test.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +struct test { + const char *str; + const char *salt; + const char *result; +} tests[] = { + {"Hello world!", "$1$saltstring", "$1$saltstri$YMyguxXMBpd2TEZ.vS/3q1"}, + {NULL, NULL, NULL} +}; + +static int +do_test (void) +{ + struct test *t; + int res = 0; + + for (t = tests; t->str != NULL; ++t) { + const char *c; + + c = crypt (t->str, t->salt); + + if (strcmp (c, t->result) != 0) { + res = 1; + printf ("should have been: \"%s\"\n", t->result); + printf ("result was: \"%s\"\n", c); + } + } + if (res) + printf ("failed\n"); + else + printf ("success\n"); + return res; +} + +int +main (void) +{ + return do_test (); +} diff --git a/crypto/heimdal/lib/hcrypto/mdtest.c b/crypto/heimdal/lib/hcrypto/mdtest.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/mdtest.c @@ -0,0 +1,320 @@ +/* + * Copyright (c) 1995 - 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#define HC_DEPRECATED_CRYPTO + +#ifdef KRB5 +#include +#endif +#include +#include +#include +#include + +#define ONE_MILLION_A "one million a's" + +struct hash_foo { + const char *name; + size_t psize; + size_t hsize; + int (*init)(void*); + int (*update)(void*, const void*, size_t); + int (*final)(void*, void*); + const EVP_MD * (*evp)(void); +} md4 = { + "MD4", + sizeof(MD4_CTX), + 16, + (int (*)(void*))MD4_Init, + (int (*)(void*,const void*, size_t))MD4_Update, + (int (*)(void*, void*))MD4_Final, + EVP_md4 +}, md5 = { + "MD5", + sizeof(MD5_CTX), + 16, + (int (*)(void*))MD5_Init, + (int (*)(void*,const void*, size_t))MD5_Update, + (int (*)(void*, void*))MD5_Final, + EVP_md5 +}, sha1 = { + "SHA-1", + sizeof(struct sha), + 20, + (int (*)(void*))SHA1_Init, + (int (*)(void*,const void*, size_t))SHA1_Update, + (int (*)(void*, void*))SHA1_Final, + EVP_sha1 +}; +struct hash_foo sha256 = { + "SHA-256", + sizeof(SHA256_CTX), + 32, + (int (*)(void*))SHA256_Init, + (int (*)(void*,const void*, size_t))SHA256_Update, + (int (*)(void*, void*))SHA256_Final, + EVP_sha256 +}; +struct hash_foo sha384 = { + "SHA-384", + sizeof(SHA384_CTX), + 48, + (int (*)(void*))SHA384_Init, + (int (*)(void*,const void*, size_t))SHA384_Update, + (int (*)(void*, void*))SHA384_Final, + EVP_sha384 +}; +struct hash_foo sha512 = { + "SHA-512", + sizeof(SHA512_CTX), + 64, + (int (*)(void*))SHA512_Init, + (int (*)(void*,const void*, size_t))SHA512_Update, + (int (*)(void*, void*))SHA512_Final, + EVP_sha512 +}; + +struct test { + char *str; + unsigned char hash[64]; +}; + +struct test md4_tests[] = { + {"", + {0x31, 0xd6, 0xcf, 0xe0, 0xd1, 0x6a, 0xe9, 0x31, 0xb7, 0x3c, 0x59, + 0xd7, 0xe0, 0xc0, 0x89, 0xc0}}, + {"a", + {0xbd, 0xe5, 0x2c, 0xb3, 0x1d, 0xe3, 0x3e, 0x46, 0x24, 0x5e, 0x05, + 0xfb, 0xdb, 0xd6, 0xfb, 0x24}}, + {"abc", + {0xa4, 0x48, 0x01, 0x7a, 0xaf, 0x21, 0xd8, 0x52, 0x5f, 0xc1, 0x0a, 0xe8, 0x7a, 0xa6, 0x72, 0x9d}}, + {"message digest", + {0xd9, 0x13, 0x0a, 0x81, 0x64, 0x54, 0x9f, 0xe8, 0x18, 0x87, 0x48, 0x06, 0xe1, 0xc7, 0x01, 0x4b}}, + {"abcdefghijklmnopqrstuvwxyz", {0xd7, 0x9e, 0x1c, 0x30, 0x8a, 0xa5, 0xbb, 0xcd, 0xee, 0xa8, 0xed, 0x63, 0xdf, 0x41, 0x2d, 0xa9, }}, + {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + {0x04, 0x3f, 0x85, 0x82, 0xf2, 0x41, 0xdb, 0x35, 0x1c, 0xe6, 0x27, 0xe1, 0x53, 0xe7, 0xf0, 0xe4}}, + {"12345678901234567890123456789012345678901234567890123456789012345678901234567890", + {0xe3, 0x3b, 0x4d, 0xdc, 0x9c, 0x38, 0xf2, 0x19, 0x9c, 0x3e, 0x7b, 0x16, 0x4f, 0xcc, 0x05, 0x36, }}, + {NULL, { 0x0 }}}; + +struct test md5_tests[] = { + {"", {0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04, 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e}}, + {"a", {0x0c, 0xc1, 0x75, 0xb9, 0xc0, 0xf1, 0xb6, 0xa8, 0x31, 0xc3, 0x99, 0xe2, 0x69, 0x77, 0x26, 0x61}}, + {"abc", {0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72}}, + {"message digest", {0xf9, 0x6b, 0x69, 0x7d, 0x7c, 0xb7, 0x93, 0x8d, 0x52, 0x5a, 0x2f, 0x31, 0xaa, 0xf1, 0x61, 0xd0}}, + {"abcdefghijklmnopqrstuvwxyz", {0xc3, 0xfc, 0xd3, 0xd7, 0x61, 0x92, 0xe4, 0x00, 0x7d, 0xfb, 0x49, 0x6c, 0xca, 0x67, 0xe1, 0x3b}}, + {"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", {0xd1, 0x74, 0xab, 0x98, 0xd2, 0x77, 0xd9, 0xf5, 0xa5, 0x61, 0x1c, 0x2c, 0x9f, 0x41, 0x9d, 0x9f}}, + {"12345678901234567890123456789012345678901234567890123456789012345678901234567890", {0x57, 0xed, 0xf4, 0xa2, 0x2b, 0xe3, 0xc9, 0x55, 0xac, 0x49, 0xda, 0x2e, 0x21, 0x07, 0xb6, 0x7a}}, + {NULL, { 0x0 }}}; + +struct test sha1_tests[] = { + { "abc", + {0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, + 0xBA, 0x3E, 0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, + 0x9C, 0xD0, 0xD8, 0x9D}}, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + {0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, + 0xBA, 0xAE, 0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, + 0xE5, 0x46, 0x70, 0xF1}}, + { ONE_MILLION_A, + {0x34, 0xaa, 0x97, 0x3c, 0xd4, 0xc4, 0xda, 0xa4, + 0xf6, 0x1e, 0xeb, 0x2b, 0xdb, 0xad, 0x27, 0x31, + 0x65, 0x34, 0x01, 0x6f}}, + { NULL, { 0 } } +}; + +struct test sha256_tests[] = { + { "abc", + { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, + 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, + 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, + 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad }}, + { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", + { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, + 0xe5, 0xc0, 0x26, 0x93, 0x0c, 0x3e, 0x60, 0x39, + 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff, 0x21, 0x67, + 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 }}, + { ONE_MILLION_A, + {0xcd,0xc7,0x6e,0x5c, 0x99,0x14,0xfb,0x92, + 0x81,0xa1,0xc7,0xe2, 0x84,0xd7,0x3e,0x67, + 0xf1,0x80,0x9a,0x48, 0xa4,0x97,0x20,0x0e, + 0x04,0x6d,0x39,0xcc, 0xc7,0x11,0x2c,0xd0 }}, + { NULL, { 0 } } +}; + +struct test sha384_tests[] = { + { "abc", + { 0xcb,0x00,0x75,0x3f,0x45,0xa3,0x5e,0x8b, + 0xb5,0xa0,0x3d,0x69,0x9a,0xc6,0x50,0x07, + 0x27,0x2c,0x32,0xab,0x0e,0xde,0xd1,0x63, + 0x1a,0x8b,0x60,0x5a,0x43,0xff,0x5b,0xed, + 0x80,0x86,0x07,0x2b,0xa1,0xe7,0xcc,0x23, + 0x58,0xba,0xec,0xa1,0x34,0xc8,0x25,0xa7}}, + { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno" + "ijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", + { 0x09,0x33,0x0c,0x33,0xf7,0x11,0x47,0xe8, + 0x3d,0x19,0x2f,0xc7,0x82,0xcd,0x1b,0x47, + 0x53,0x11,0x1b,0x17,0x3b,0x3b,0x05,0xd2, + 0x2f,0xa0,0x80,0x86,0xe3,0xb0,0xf7,0x12, + 0xfc,0xc7,0xc7,0x1a,0x55,0x7e,0x2d,0xb9, + 0x66,0xc3,0xe9,0xfa,0x91,0x74,0x60,0x39}}, + { ONE_MILLION_A, + { 0x9d,0x0e,0x18,0x09,0x71,0x64,0x74,0xcb, + 0x08,0x6e,0x83,0x4e,0x31,0x0a,0x4a,0x1c, + 0xed,0x14,0x9e,0x9c,0x00,0xf2,0x48,0x52, + 0x79,0x72,0xce,0xc5,0x70,0x4c,0x2a,0x5b, + 0x07,0xb8,0xb3,0xdc,0x38,0xec,0xc4,0xeb, + 0xae,0x97,0xdd,0xd8,0x7f,0x3d,0x89,0x85}}, + {NULL, { 0 }} +}; + +struct test sha512_tests[] = { + { "abc", + { 0xdd,0xaf,0x35,0xa1,0x93,0x61,0x7a,0xba, + 0xcc,0x41,0x73,0x49,0xae,0x20,0x41,0x31, + 0x12,0xe6,0xfa,0x4e,0x89,0xa9,0x7e,0xa2, + 0x0a,0x9e,0xee,0xe6,0x4b,0x55,0xd3,0x9a, + 0x21,0x92,0x99,0x2a,0x27,0x4f,0xc1,0xa8, + 0x36,0xba,0x3c,0x23,0xa3,0xfe,0xeb,0xbd, + 0x45,0x4d,0x44,0x23,0x64,0x3c,0xe8,0x0e, + 0x2a,0x9a,0xc9,0x4f,0xa5,0x4c,0xa4,0x9f }}, + { "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno" + "ijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", + { 0x8e,0x95,0x9b,0x75,0xda,0xe3,0x13,0xda, + 0x8c,0xf4,0xf7,0x28,0x14,0xfc,0x14,0x3f, + 0x8f,0x77,0x79,0xc6,0xeb,0x9f,0x7f,0xa1, + 0x72,0x99,0xae,0xad,0xb6,0x88,0x90,0x18, + 0x50,0x1d,0x28,0x9e,0x49,0x00,0xf7,0xe4, + 0x33,0x1b,0x99,0xde,0xc4,0xb5,0x43,0x3a, + 0xc7,0xd3,0x29,0xee,0xb6,0xdd,0x26,0x54, + 0x5e,0x96,0xe5,0x5b,0x87,0x4b,0xe9,0x09 }}, + { ONE_MILLION_A, + { 0xe7,0x18,0x48,0x3d,0x0c,0xe7,0x69,0x64, + 0x4e,0x2e,0x42,0xc7,0xbc,0x15,0xb4,0x63, + 0x8e,0x1f,0x98,0xb1,0x3b,0x20,0x44,0x28, + 0x56,0x32,0xa8,0x03,0xaf,0xa9,0x73,0xeb, + 0xde,0x0f,0xf2,0x44,0x87,0x7e,0xa6,0x0a, + 0x4c,0xb0,0x43,0x2c,0xe5,0x77,0xc3,0x1b, + 0xeb,0x00,0x9c,0x5c,0x2c,0x49,0xaa,0x2e, + 0x4e,0xad,0xb2,0x17,0xad,0x8c,0xc0,0x9b }}, + { NULL, { 0 } } +}; + +static int +hash_test (struct hash_foo *hash, struct test *tests) +{ + struct test *t; + EVP_MD_CTX *ectx; + unsigned int esize; + void *ctx = malloc(hash->psize); + unsigned char *res = malloc(hash->hsize); + + printf ("%s... ", hash->name); + for (t = tests; t->str; ++t) { + char buf[1000]; + + ectx = EVP_MD_CTX_create(); + if (hash->evp() == NULL) { + printf("unavailable\n"); + continue; + } + EVP_DigestInit_ex(ectx, hash->evp(), NULL); + + (*hash->init)(ctx); + if(strcmp(t->str, ONE_MILLION_A) == 0) { + int i; + memset(buf, 'a', sizeof(buf)); + for(i = 0; i < 1000; i++) { + (*hash->update)(ctx, buf, sizeof(buf)); + EVP_DigestUpdate(ectx, buf, sizeof(buf)); + } + } else { + (*hash->update)(ctx, (unsigned char *)t->str, strlen(t->str)); + EVP_DigestUpdate(ectx, t->str, strlen(t->str)); + } + + (*hash->final) (res, ctx); + if (memcmp (res, t->hash, hash->hsize) != 0) { + int i; + + printf ("%s(\"%s\") failed\n", hash->name, t->str); + printf("should be: "); + for(i = 0; i < hash->hsize; ++i) { + if(i > 0 && (i % 16) == 0) + printf("\n "); + printf("%02x ", t->hash[i]); + } + printf("\nresult was: "); + for(i = 0; i < hash->hsize; ++i) { + if(i > 0 && (i % 16) == 0) + printf("\n "); + printf("%02x ", res[i]); + } + printf("\n"); + return 1; + } + + EVP_DigestFinal_ex(ectx, res, &esize); + EVP_MD_CTX_destroy(ectx); + + if (hash->hsize != esize) { + printf("EVP %s returned wrong hash size\n", hash->name); + return 1; + } + + if (memcmp (res, t->hash, hash->hsize) != 0) { + printf("EVP %s failed here old function where successful!\n", + hash->name); + return 1; + } + } + free(ctx); + free(res); + printf ("success\n"); + return 0; +} + +int +main (void) +{ + return + hash_test(&md4, md4_tests) + + hash_test(&md5, md5_tests) + + hash_test(&sha1, sha1_tests) + + hash_test(&sha256, sha256_tests) + + hash_test(&sha384, sha384_tests) + + hash_test(&sha512, sha512_tests); +} diff --git a/crypto/heimdal/lib/hcrypto/passwd_dialog.aps b/crypto/heimdal/lib/hcrypto/passwd_dialog.aps new file mode 100644 index 0000000000000000000000000000000000000000..c90d03091846baf1064a65df23ac1596764cdc4a GIT binary patch literal 30428 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 literal 0 Hc$@`*HNBMj+Qs)X3!q(~HUKz6rM|Iq!*vk6UL z`*PK(J%`A6-k5o2JoaEPPnTs;6{{K$|G~3j!%JZGHc1Ou^PHD)%@ZhjRcy;8hiX}- zoBBi<43wiZUuN5cgZjihxlA)1wu#%A6u<|vtf3tQSx=ElmUgOZ!=WZn*Nl;d z*^Wnj)F_KIc_F)+gh3#_4xrMRsu4tIQf+jmo#{fWk?e^{Nh{8mJd@Iv=~~#)4E?OH z;&k1TDqhCpibI-LysTlG3#jbYO0f|XEms`Mc8l;at(HP8qCGkBd!J) zd#X?Dt3BDc81ESY^`1*ls7TlRiGH?|mXOJRy8*=z(LRgo^@u+M>`qs1&^CH~`V}-g zC(Ny`?n+_!F2zHqKeT%Fw!F>N9e;1`^j+p&(tHQH%~24|P3u!2UGTC>i@bqzA({^M zndmQ3Q=aXjDQ=h&2e$+;G+q1*1w5ak&rSQ}-Z8kUA4D?^8D`$T!AUp}}j)-6z zg3Ggt_o=$m!m}e&NgL_9K5}-1;Ksv(G;EjRL}@8P@c{e8q1FskR+nkMo~9Wm`KnM~ z*h#IRKGMhf=)0~S7(FpL7N!$o(b$~aUh^`KvnMxSx9sqB zoLR-@p-k6zwUpg2;BPR-<8$~!PM4y={O4Gyu$KyVWElCurIRGfUeWN%BH1qMC;x?Q znDO#E7dOwhHF_xN+F0vBB==u;Zu7s0%eShe{X$TRGd7FcY{|M588C*r-s_$H?fs?M l#C_WHYuCqa@=go+Upn-^T%}L@SLqMGH+P}Ui~5C*`VZ9673cr} literal 0 Hc$@)H;{X347y~fERAj<-iKFD=o0*HnP>|$^N(*X>L48=fL&XCVg z#E=3sp^%}JAr;831j=$S_%Z|o#e#vV@_?#9ERb9#LmF7O0z+c}h?ZjzW2j}|V|dB@ z|9>OgIgC&_T?Qkd93#+G4GjJa-UtVS +#include + +#ifdef WIN32 /* Visual C++ 4.0 (Windows95/NT) */ +#include "passwd_dlg.h" +#include "Resource.h" +#define passwdBufSZ 64 + +char passwd[passwdBufSZ]; + +BOOL CALLBACK +pwd_dialog_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_COMMAND: + switch(wParam) + { + case IDOK: + if(!GetDlgItemText(hwndDlg,IDC_PASSWD_EDIT, passwd, passwdBufSZ)) + EndDialog(hwndDlg, IDCANCEL); + case IDCANCEL: + EndDialog(hwndDlg, wParam); + return TRUE; + } + } + return FALSE; +} + + +/* return 0 if ok, 1 otherwise */ +int +pwd_dialog(char *buf, int size) +{ + int i; + HWND wnd = GetActiveWindow(); + HANDLE hInst = GetModuleHandle("des"); + switch(DialogBox(hInst,MAKEINTRESOURCE(IDD_PASSWD_DIALOG),wnd,pwd_dialog_proc)) + { + case IDOK: + strlcpy(buf, passwd, size); + memset (passwd, 0, sizeof(passwd)); + return 0; + case IDCANCEL: + default: + memset (passwd, 0, sizeof(passwd)); + return 1; + } +} + +#endif /* WIN32 */ diff --git a/crypto/heimdal/lib/hcrypto/pkcs12.h b/crypto/heimdal/lib/hcrypto/pkcs12.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/pkcs12.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * $Id$ + */ + +#ifndef _HEIM_PKCS12_H +#define _HEIM_PKCS12_H 1 + +/* symbol renaming */ +#define PKCS12_key_gen hc_PKCS12_key_gen + +/* + * + */ + +#include + +#define PKCS12_KEY_ID 1 +#define PKCS12_IV_ID 2 + +int PKCS12_key_gen(const void *, size_t, const void *, + size_t, int, int, size_t, void *, const EVP_MD *); + + +#endif /* _HEIM_PKCS12_H */ diff --git a/crypto/heimdal/lib/hcrypto/pkcs12.c b/crypto/heimdal/lib/hcrypto/pkcs12.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/pkcs12.c @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include + +int +PKCS12_key_gen(const void *key, size_t keylen, + const void *salt, size_t saltlen, + int id, int iteration, size_t outkeysize, + void *out, const EVP_MD *md) +{ + unsigned char *v, *I, hash[EVP_MAX_MD_SIZE]; + unsigned int size, size_I = 0; + unsigned char idc = id; + EVP_MD_CTX *ctx; + unsigned char *outp = out; + int i, vlen; + + /** + * The argument key is pointing to an utf16 string, and thus + * keylen that is no a multiple of 2 is invalid. + */ + if (keylen & 1) + return 0; + + ctx = EVP_MD_CTX_create(); + if (ctx == NULL) + return 0; + + vlen = EVP_MD_block_size(md); + v = malloc(vlen + 1); + if (v == NULL) { + EVP_MD_CTX_destroy(ctx); + return 0; + } + + I = calloc(1, vlen * 2); + if (I == NULL) { + EVP_MD_CTX_destroy(ctx); + free(v); + return 0; + } + + if (salt && saltlen > 0) { + for (i = 0; i < vlen; i++) + I[i] = ((unsigned char*)salt)[i % saltlen]; + size_I += vlen; + } + /* + * There is a diffrence between the no password string and the + * empty string, in the empty string the UTF16 NUL terminator is + * included into the string. + */ + if (key) { + for (i = 0; i < vlen / 2; i++) { + I[(i * 2) + size_I] = 0; + I[(i * 2) + size_I + 1] = ((unsigned char*)key)[i % (keylen + 1)]; + } + size_I += vlen; + } + + while (1) { + BIGNUM *bnB, *bnOne; + + if (!EVP_DigestInit_ex(ctx, md, NULL)) { + EVP_MD_CTX_destroy(ctx); + free(I); + free(v); + return 0; + } + for (i = 0; i < vlen; i++) + EVP_DigestUpdate(ctx, &idc, 1); + EVP_DigestUpdate(ctx, I, size_I); + EVP_DigestFinal_ex(ctx, hash, &size); + + for (i = 1; i < iteration; i++) + EVP_Digest(hash, size, hash, &size, md, NULL); + + memcpy(outp, hash, min(outkeysize, size)); + if (outkeysize < size) + break; + outkeysize -= size; + outp += size; + + for (i = 0; i < vlen; i++) + v[i] = hash[i % size]; + + bnB = BN_bin2bn(v, vlen, NULL); + bnOne = BN_new(); + BN_set_word(bnOne, 1); + + BN_uadd(bnB, bnB, bnOne); + + for (i = 0; i < vlen * 2; i += vlen) { + BIGNUM *bnI; + int j; + + bnI = BN_bin2bn(I + i, vlen, NULL); + + BN_uadd(bnI, bnI, bnB); + + j = BN_num_bytes(bnI); + if (j > vlen) { + assert(j == vlen + 1); + BN_bn2bin(bnI, v); + memcpy(I + i, v + 1, vlen); + } else { + memset(I + i, 0, vlen - j); + BN_bn2bin(bnI, I + i + vlen - j); + } + BN_free(bnI); + } + BN_free(bnB); + BN_free(bnOne); + size_I = vlen * 2; + } + + EVP_MD_CTX_destroy(ctx); + free(I); + free(v); + + return 1; +} diff --git a/crypto/heimdal/lib/hcrypto/pkcs5.c b/crypto/heimdal/lib/hcrypto/pkcs5.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/pkcs5.c @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifdef KRB5 +#include +#endif + +#include +#include + +/** + * As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key. + * + * @param password Password. + * @param password_len Length of password. + * @param salt Salt + * @param salt_len Length of salt. + * @param iter iteration counter. + * @param md the digest function. + * @param keylen the output key length. + * @param key the output key. + * + * @return 1 on success, non 1 on failure. + * + * @ingroup hcrypto_misc + */ + +int +PKCS5_PBKDF2_HMAC(const void * password, size_t password_len, + const void * salt, size_t salt_len, + unsigned long iter, + const EVP_MD *md, + size_t keylen, void *key) +{ + size_t datalen, leftofkey, checksumsize; + char *data, *tmpcksum; + uint32_t keypart; + unsigned long i; + int j; + char *p; + unsigned int hmacsize; + + if (md == NULL) + return 0; + + checksumsize = EVP_MD_size(md); + datalen = salt_len + 4; + + tmpcksum = malloc(checksumsize + datalen); + if (tmpcksum == NULL) + return 0; + + data = &tmpcksum[checksumsize]; + + if (salt_len) + memcpy(data, salt, salt_len); + + keypart = 1; + leftofkey = keylen; + p = key; + + while (leftofkey) { + int len; + + if (leftofkey > checksumsize) + len = checksumsize; + else + len = leftofkey; + + data[datalen - 4] = (keypart >> 24) & 0xff; + data[datalen - 3] = (keypart >> 16) & 0xff; + data[datalen - 2] = (keypart >> 8) & 0xff; + data[datalen - 1] = (keypart) & 0xff; + + HMAC(md, password, password_len, data, datalen, + tmpcksum, &hmacsize); + + memcpy(p, tmpcksum, len); + for (i = 1; i < iter; i++) { + HMAC(md, password, password_len, tmpcksum, checksumsize, + tmpcksum, &hmacsize); + + for (j = 0; j < len; j++) + p[j] ^= tmpcksum[j]; + } + + p += len; + leftofkey -= len; + keypart++; + } + + free(tmpcksum); + + return 1; +} + +/** + * As descriped in PKCS5, convert a password, salt, and iteration counter into a crypto key. + * + * @param password Password. + * @param password_len Length of password. + * @param salt Salt + * @param salt_len Length of salt. + * @param iter iteration counter. + * @param keylen the output key length. + * @param key the output key. + * + * @return 1 on success, non 1 on failure. + * + * @ingroup hcrypto_misc + */ +int +PKCS5_PBKDF2_HMAC_SHA1(const void * password, size_t password_len, + const void * salt, size_t salt_len, + unsigned long iter, + size_t keylen, void *key) +{ + return PKCS5_PBKDF2_HMAC(password, password_len, salt, salt_len, iter, + EVP_sha1(), keylen, key); +} diff --git a/crypto/heimdal/lib/hcrypto/rand-fortuna.c b/crypto/heimdal/lib/hcrypto/rand-fortuna.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rand-fortuna.c @@ -0,0 +1,649 @@ +/* + * fortuna.c + * Fortuna-like PRNG. + * + * Copyright (c) 2005 Marko Kreen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $PostgreSQL: pgsql/contrib/pgcrypto/fortuna.c,v 1.8 2006/10/04 00:29:46 momjian Exp $ + */ + +#include +#include +#include +#include + +#ifdef KRB5 +#include +#endif + +#include "randi.h" +#include "aes.h" +#include "sha.h" + +/* + * Why Fortuna-like: There does not seem to be any definitive reference + * on Fortuna in the net. Instead this implementation is based on + * following references: + * + * http://en.wikipedia.org/wiki/Fortuna_(PRNG) + * - Wikipedia article + * http://jlcooke.ca/random/ + * - Jean-Luc Cooke Fortuna-based /dev/random driver for Linux. + */ + +/* + * There is some confusion about whether and how to carry forward + * the state of the pools. Seems like original Fortuna does not + * do it, resetting hash after each request. I guess expecting + * feeding to happen more often that requesting. This is absolutely + * unsuitable for pgcrypto, as nothing asynchronous happens here. + * + * J.L. Cooke fixed this by feeding previous hash to new re-initialized + * hash context. + * + * Fortuna predecessor Yarrow requires ability to query intermediate + * 'final result' from hash, without affecting it. + * + * This implementation uses the Yarrow method - asking intermediate + * results, but continuing with old state. + */ + + +/* + * Algorithm parameters + */ + +#define NUM_POOLS 32 + +/* in microseconds */ +#define RESEED_INTERVAL 100000 /* 0.1 sec */ + +/* for one big request, reseed after this many bytes */ +#define RESEED_BYTES (1024*1024) + +/* + * Skip reseed if pool 0 has less than this many + * bytes added since last reseed. + */ +#define POOL0_FILL (256/8) + +/* + * Algorithm constants + */ + +/* Both cipher key size and hash result size */ +#define BLOCK 32 + +/* cipher block size */ +#define CIPH_BLOCK 16 + +/* for internal wrappers */ +#define MD_CTX SHA256_CTX +#define CIPH_CTX AES_KEY + +struct fortuna_state +{ + unsigned char counter[CIPH_BLOCK]; + unsigned char result[CIPH_BLOCK]; + unsigned char key[BLOCK]; + MD_CTX pool[NUM_POOLS]; + CIPH_CTX ciph; + unsigned reseed_count; + struct timeval last_reseed_time; + unsigned pool0_bytes; + unsigned rnd_pos; + int tricks_done; + pid_t pid; +}; +typedef struct fortuna_state FState; + + +/* + * Use our own wrappers here. + * - Need to get intermediate result from digest, without affecting it. + * - Need re-set key on a cipher context. + * - Algorithms are guaranteed to exist. + * - No memory allocations. + */ + +static void +ciph_init(CIPH_CTX * ctx, const unsigned char *key, int klen) +{ + AES_set_encrypt_key(key, klen * 8, ctx); +} + +static void +ciph_encrypt(CIPH_CTX * ctx, const unsigned char *in, unsigned char *out) +{ + AES_encrypt(in, out, ctx); +} + +static void +md_init(MD_CTX * ctx) +{ + SHA256_Init(ctx); +} + +static void +md_update(MD_CTX * ctx, const unsigned char *data, int len) +{ + SHA256_Update(ctx, data, len); +} + +static void +md_result(MD_CTX * ctx, unsigned char *dst) +{ + SHA256_CTX tmp; + + memcpy(&tmp, ctx, sizeof(*ctx)); + SHA256_Final(dst, &tmp); + memset_s(&tmp, sizeof(tmp), 0, sizeof(tmp)); +} + +/* + * initialize state + */ +static void +init_state(FState * st) +{ + int i; + + memset(st, 0, sizeof(*st)); + for (i = 0; i < NUM_POOLS; i++) + md_init(&st->pool[i]); + st->pid = getpid(); +} + +/* + * Endianess does not matter. + * It just needs to change without repeating. + */ +static void +inc_counter(FState * st) +{ + uint32_t *val = (uint32_t *) st->counter; + + if (++val[0]) + return; + if (++val[1]) + return; + if (++val[2]) + return; + ++val[3]; +} + +/* + * This is called 'cipher in counter mode'. + */ +static void +encrypt_counter(FState * st, unsigned char *dst) +{ + ciph_encrypt(&st->ciph, st->counter, dst); + inc_counter(st); +} + + +/* + * The time between reseed must be at least RESEED_INTERVAL + * microseconds. + */ +static int +enough_time_passed(FState * st) +{ + int ok; + struct timeval tv; + struct timeval *last = &st->last_reseed_time; + + gettimeofday(&tv, NULL); + + /* check how much time has passed */ + ok = 0; + if (tv.tv_sec > last->tv_sec + 1) + ok = 1; + else if (tv.tv_sec == last->tv_sec + 1) + { + if (1000000 + tv.tv_usec - last->tv_usec >= RESEED_INTERVAL) + ok = 1; + } + else if (tv.tv_usec - last->tv_usec >= RESEED_INTERVAL) + ok = 1; + + /* reseed will happen, update last_reseed_time */ + if (ok) + memcpy(last, &tv, sizeof(tv)); + + memset_s(&tv, sizeof(tv), 0, sizeof(tv)); + + return ok; +} + +/* + * generate new key from all the pools + */ +static void +reseed(FState * st) +{ + unsigned k; + unsigned n; + MD_CTX key_md; + unsigned char buf[BLOCK]; + + /* set pool as empty */ + st->pool0_bytes = 0; + + /* + * Both #0 and #1 reseed would use only pool 0. Just skip #0 then. + */ + n = ++st->reseed_count; + + /* + * The goal: use k-th pool only 1/(2^k) of the time. + */ + md_init(&key_md); + for (k = 0; k < NUM_POOLS; k++) + { + md_result(&st->pool[k], buf); + md_update(&key_md, buf, BLOCK); + + if (n & 1 || !n) + break; + n >>= 1; + } + + /* add old key into mix too */ + md_update(&key_md, st->key, BLOCK); + + /* add pid to make output diverse after fork() */ + md_update(&key_md, (const unsigned char *)&st->pid, sizeof(st->pid)); + + /* now we have new key */ + md_result(&key_md, st->key); + + /* use new key */ + ciph_init(&st->ciph, st->key, BLOCK); + + memset_s(&key_md, sizeof(key_md), 0, sizeof(key_md)); + memset_s(buf, sizeof(buf), 0, sizeof(buf)); +} + +/* + * Pick a random pool. This uses key bytes as random source. + */ +static unsigned +get_rand_pool(FState * st) +{ + unsigned rnd; + + /* + * This slightly prefers lower pools - thats OK. + */ + rnd = st->key[st->rnd_pos] % NUM_POOLS; + + st->rnd_pos++; + if (st->rnd_pos >= BLOCK) + st->rnd_pos = 0; + + return rnd; +} + +/* + * update pools + */ +static void +add_entropy(FState * st, const unsigned char *data, unsigned len) +{ + unsigned pos; + unsigned char hash[BLOCK]; + MD_CTX md; + + /* hash given data */ + md_init(&md); + md_update(&md, data, len); + md_result(&md, hash); + + /* + * Make sure the pool 0 is initialized, then update randomly. + */ + if (st->reseed_count == 0) + pos = 0; + else + pos = get_rand_pool(st); + md_update(&st->pool[pos], hash, BLOCK); + + if (pos == 0) + st->pool0_bytes += len; + + memset_s(hash, sizeof(hash), 0, sizeof(hash)); + memset_s(&md, sizeof(hash), 0, sizeof(md)); +} + +/* + * Just take 2 next blocks as new key + */ +static void +rekey(FState * st) +{ + encrypt_counter(st, st->key); + encrypt_counter(st, st->key + CIPH_BLOCK); + ciph_init(&st->ciph, st->key, BLOCK); +} + +/* + * Hide public constants. (counter, pools > 0) + * + * This can also be viewed as spreading the startup + * entropy over all of the components. + */ +static void +startup_tricks(FState * st) +{ + int i; + unsigned char buf[BLOCK]; + + /* Use next block as counter. */ + encrypt_counter(st, st->counter); + + /* Now shuffle pools, excluding #0 */ + for (i = 1; i < NUM_POOLS; i++) + { + encrypt_counter(st, buf); + encrypt_counter(st, buf + CIPH_BLOCK); + md_update(&st->pool[i], buf, BLOCK); + } + memset_s(buf, sizeof(buf), 0, sizeof(buf)); + + /* Hide the key. */ + rekey(st); + + /* This can be done only once. */ + st->tricks_done = 1; +} + +static void +extract_data(FState * st, unsigned count, unsigned char *dst) +{ + unsigned n; + unsigned block_nr = 0; + pid_t pid = getpid(); + + /* Should we reseed? */ + if (st->pool0_bytes >= POOL0_FILL || st->reseed_count == 0) + if (enough_time_passed(st)) + reseed(st); + + /* Do some randomization on first call */ + if (!st->tricks_done) + startup_tricks(st); + + /* If we forked, force a reseed again */ + if (pid != st->pid) { + st->pid = pid; + reseed(st); + } + + while (count > 0) + { + /* produce bytes */ + encrypt_counter(st, st->result); + + /* copy result */ + if (count > CIPH_BLOCK) + n = CIPH_BLOCK; + else + n = count; + memcpy(dst, st->result, n); + dst += n; + count -= n; + + /* must not give out too many bytes with one key */ + block_nr++; + if (block_nr > (RESEED_BYTES / CIPH_BLOCK)) + { + rekey(st); + block_nr = 0; + } + } + /* Set new key for next request. */ + rekey(st); +} + +/* + * public interface + */ + +static FState main_state; +static int init_done; +static int have_entropy; +#define FORTUNA_RESEED_BYTE 10000 +static unsigned resend_bytes; + +/* + * This mutex protects all of the above static elements from concurrent + * access by multiple threads + */ +static HEIMDAL_MUTEX fortuna_mutex = HEIMDAL_MUTEX_INITIALIZER; + +/* + * Try our best to do an inital seed + */ +#define INIT_BYTES 128 + +/* + * fortuna_mutex must be held across calls to this function + */ + +static int +fortuna_reseed(void) +{ + int entropy_p = 0; + + if (!init_done) + abort(); + +#ifndef NO_RAND_UNIX_METHOD + { + unsigned char buf[INIT_BYTES]; + if ((*hc_rand_unix_method.bytes)(buf, sizeof(buf)) == 1) { + add_entropy(&main_state, buf, sizeof(buf)); + entropy_p = 1; + memset_s(buf, sizeof(buf), 0, sizeof(buf)); + } + } +#endif +#ifdef HAVE_ARC4RANDOM + { + uint32_t buf[INIT_BYTES / sizeof(uint32_t)]; + int i; + + for (i = 0; i < sizeof(buf)/sizeof(buf[0]); i++) + buf[i] = arc4random(); + add_entropy(&main_state, (void *)buf, sizeof(buf)); + entropy_p = 1; + } +#endif + /* + * Fall back to gattering data from timer and secret files, this + * is really the last resort. + */ + if (!entropy_p) { + /* to save stackspace */ + union { + unsigned char buf[INIT_BYTES]; + unsigned char shad[1001]; + } u; + int fd; + + /* add timer info */ + if ((*hc_rand_timer_method.bytes)(u.buf, sizeof(u.buf)) == 1) + add_entropy(&main_state, u.buf, sizeof(u.buf)); + /* add /etc/shadow */ + fd = open("/etc/shadow", O_RDONLY, 0); + if (fd >= 0) { + ssize_t n; + rk_cloexec(fd); + /* add_entropy will hash the buf */ + while ((n = read(fd, (char *)u.shad, sizeof(u.shad))) > 0) + add_entropy(&main_state, u.shad, sizeof(u.shad)); + close(fd); + } + + memset_s(&u, sizeof(u), 0, sizeof(u)); + + entropy_p = 1; /* sure about this ? */ + } + { + pid_t pid = getpid(); + add_entropy(&main_state, (void *)&pid, sizeof(pid)); + } + { + struct timeval tv; + gettimeofday(&tv, NULL); + add_entropy(&main_state, (void *)&tv, sizeof(tv)); + } +#ifdef HAVE_GETUID + { + uid_t u = getuid(); + add_entropy(&main_state, (void *)&u, sizeof(u)); + } +#endif + return entropy_p; +} + +/* + * fortuna_mutex must be held by callers of this function + */ +static int +fortuna_init(void) +{ + if (!init_done) + { + init_state(&main_state); + init_done = 1; + } + if (!have_entropy) + have_entropy = fortuna_reseed(); + return (init_done && have_entropy); +} + + + +static void +fortuna_seed(const void *indata, int size) +{ + HEIMDAL_MUTEX_lock(&fortuna_mutex); + + fortuna_init(); + add_entropy(&main_state, indata, size); + if (size >= INIT_BYTES) + have_entropy = 1; + + HEIMDAL_MUTEX_unlock(&fortuna_mutex); +} + +static int +fortuna_bytes(unsigned char *outdata, int size) +{ + int ret = 0; + + HEIMDAL_MUTEX_lock(&fortuna_mutex); + + if (!fortuna_init()) + goto out; + + resend_bytes += size; + if (resend_bytes > FORTUNA_RESEED_BYTE || resend_bytes < size) { + resend_bytes = 0; + fortuna_reseed(); + } + extract_data(&main_state, size, outdata); + ret = 1; + +out: + HEIMDAL_MUTEX_unlock(&fortuna_mutex); + + return ret; +} + +static void +fortuna_cleanup(void) +{ + HEIMDAL_MUTEX_lock(&fortuna_mutex); + + init_done = 0; + have_entropy = 0; + memset_s(&main_state, sizeof(main_state), 0, sizeof(main_state)); + + HEIMDAL_MUTEX_unlock(&fortuna_mutex); +} + +static void +fortuna_add(const void *indata, int size, double entropi) +{ + fortuna_seed(indata, size); +} + +static int +fortuna_pseudorand(unsigned char *outdata, int size) +{ + return fortuna_bytes(outdata, size); +} + +static int +fortuna_status(void) +{ + int result; + + HEIMDAL_MUTEX_lock(&fortuna_mutex); + result = fortuna_init(); + HEIMDAL_MUTEX_unlock(&fortuna_mutex); + + return result ? 1 : 0; +} + +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) +const RAND_METHOD hc_rand_fortuna_method = { + .seed = fortuna_seed, + .bytes = fortuna_bytes, + .cleanup = fortuna_cleanup, + .add = fortuna_add, + .pseudorand = fortuna_pseudorand, + .status = fortuna_status +}; +#else +const RAND_METHOD hc_rand_fortuna_method = { + fortuna_seed, + fortuna_bytes, + fortuna_cleanup, + fortuna_add, + fortuna_pseudorand, + fortuna_status +}; +#endif + +const RAND_METHOD * +RAND_fortuna_method(void) +{ + return &hc_rand_fortuna_method; +} diff --git a/crypto/heimdal/lib/hcrypto/rand-timer.c b/crypto/heimdal/lib/hcrypto/rand-timer.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rand-timer.c @@ -0,0 +1,210 @@ +/* + * Copyright (c) 1995, 1996, 1997, 1999, 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +#include "randi.h" + +#ifndef WIN32 /* don't bother with this on windows */ + +static volatile int counter; +static volatile unsigned char *gdata; /* Global data */ +static volatile int igdata; /* Index into global data */ +static int gsize; + +static +RETSIGTYPE +sigALRM(int sig) +{ + if (igdata < gsize) + gdata[igdata++] ^= counter & 0xff; + +#ifndef HAVE_SIGACTION + signal(SIGALRM, sigALRM); /* Reinstall SysV signal handler */ +#endif + SIGRETURN(0); +} + +#ifndef HAVE_SETITIMER +static void +pacemaker(struct timeval *tv) +{ + fd_set fds; + pid_t pid; + pid = getppid(); + while(1){ + FD_ZERO(&fds); + FD_SET(0, &fds); + select(1, &fds, NULL, NULL, tv); + kill(pid, SIGALRM); + } +} +#endif + +#ifdef HAVE_SIGACTION +/* XXX ugly hack, should perhaps use function from roken */ +static RETSIGTYPE +(*fake_signal(int sig, RETSIGTYPE (*f)(int)))(int) +{ + struct sigaction sa, osa; + sa.sa_handler = f; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + sigaction(sig, &sa, &osa); + return osa.sa_handler; +} +#define signal(S, F) fake_signal((S), (F)) +#endif + +#endif /* WIN32*/ + +/* + * + */ + +static void +timer_seed(const void *indata, int size) +{ +} + +static int +timer_bytes(unsigned char *outdata, int size) +{ +#ifdef WIN32 + return 0; +#else /* WIN32 */ + struct itimerval tv, otv; + RETSIGTYPE (*osa)(int); + int i, j; +#ifndef HAVE_SETITIMER + RETSIGTYPE (*ochld)(int); + pid_t pid; +#endif + + gdata = outdata; + gsize = size; + igdata = 0; + + osa = signal(SIGALRM, sigALRM); + + /* Start timer */ + tv.it_value.tv_sec = 0; + tv.it_value.tv_usec = 10 * 1000; /* 10 ms */ + tv.it_interval = tv.it_value; +#ifdef HAVE_SETITIMER + setitimer(ITIMER_REAL, &tv, &otv); +#else + ochld = signal(SIGCHLD, SIG_IGN); + pid = fork(); + if(pid == -1){ + signal(SIGCHLD, ochld != SIG_ERR ? ochld : SIG_DFL); + des_not_rand_data(data, size); + return; + } + if(pid == 0) + pacemaker(&tv.it_interval); +#endif + + for(i = 0; i < 4; i++) { + for (igdata = 0; igdata < size;) /* igdata++ in sigALRM */ + counter++; + for (j = 0; j < size; j++) /* Only use 2 bits each lap */ + gdata[j] = (gdata[j]>>2) | (gdata[j]<<6); + } +#ifdef HAVE_SETITIMER + setitimer(ITIMER_REAL, &otv, 0); +#else + kill(pid, SIGKILL); + while(waitpid(pid, NULL, 0) != pid); + signal(SIGCHLD, ochld != SIG_ERR ? ochld : SIG_DFL); +#endif + signal(SIGALRM, osa != SIG_ERR ? osa : SIG_DFL); + + return 1; +#endif +} + +static void +timer_cleanup(void) +{ +} + +static void +timer_add(const void *indata, int size, double entropi) +{ +} + +static int +timer_pseudorand(unsigned char *outdata, int size) +{ + return timer_bytes(outdata, size); +} + +static int +timer_status(void) +{ +#ifdef WIN32 + return 0; +#else + return 1; +#endif +} + +#if defined(__GNUC__) || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901) +const RAND_METHOD hc_rand_timer_method = { + .seed = timer_seed, + .bytes = timer_bytes, + .cleanup = timer_cleanup, + .add = timer_add, + .pseudorand = timer_pseudorand, + .status = timer_status +}; +#else +const RAND_METHOD hc_rand_timer_method = { + timer_seed, + timer_bytes, + timer_cleanup, + timer_add, + timer_pseudorand, + timer_status +}; +#endif + +const RAND_METHOD * +RAND_timer_method(void) +{ + return &hc_rand_timer_method; +} diff --git a/crypto/heimdal/lib/hcrypto/rand-unix.c b/crypto/heimdal/lib/hcrypto/rand-unix.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rand-unix.c @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include + +#include "randi.h" + +/* + * Unix /dev/random + */ + +int +_hc_unix_device_fd(int flags, const char **fn) +{ + static const char *rnd_devices[] = { + "/dev/urandom", + "/dev/random", + "/dev/srandom", + "/dev/arandom", + NULL + }; + const char **p; + + for(p = rnd_devices; *p; p++) { + int fd = open(*p, flags | O_NDELAY); + if(fd >= 0) { + if (fn) + *fn = *p; + rk_cloexec(fd); + return fd; + } + } + return -1; +} + +static void +unix_seed(const void *p, int size) +{ + const unsigned char *indata = p; + ssize_t count; + int fd; + + if (size < 0) + return; + else if (size == 0) + return; + + fd = _hc_unix_device_fd(O_RDONLY, NULL); + if (fd < 0) + return; + + while (size > 0) { + count = write(fd, indata, size); + if (count < 0 && errno == EINTR) + continue; + else if (count <= 0) { + close(fd); + return; + } + indata += count; + size -= count; + } + close(fd); +} + + +static int +unix_bytes(unsigned char *outdata, int size) +{ + ssize_t count; + int fd; + + if (size < 0) + return 0; + else if (size == 0) + return 1; + + fd = _hc_unix_device_fd(O_RDONLY, NULL); + if (fd < 0) + return 0; + + while (size > 0) { + count = read(fd, outdata, size); + if (count < 0 && errno == EINTR) + continue; + else if (count <= 0) { + close(fd); + return 0; + } + outdata += count; + size -= count; + } + close(fd); + + return 1; +} + +static void +unix_cleanup(void) +{ +} + +static void +unix_add(const void *indata, int size, double entropi) +{ + unix_seed(indata, size); +} + +static int +unix_pseudorand(unsigned char *outdata, int size) +{ + return unix_bytes(outdata, size); +} + +static int +unix_status(void) +{ + int fd; + + fd = _hc_unix_device_fd(O_RDONLY, NULL); + if (fd < 0) + return 0; + close(fd); + + return 1; +} + +const RAND_METHOD hc_rand_unix_method = { + unix_seed, + unix_bytes, + unix_cleanup, + unix_add, + unix_pseudorand, + unix_status +}; + +const RAND_METHOD * +RAND_unix_method(void) +{ + return &hc_rand_unix_method; +} diff --git a/crypto/heimdal/lib/hcrypto/rand-w32.c b/crypto/heimdal/lib/hcrypto/rand-w32.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rand-w32.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +#include +#include + +#include "randi.h" + +volatile static HCRYPTPROV g_cryptprovider = NULL; + +static HCRYPTPROV +_hc_CryptProvider(void) +{ + BOOL rv; + HCRYPTPROV cryptprovider = NULL; + + if (g_cryptprovider != NULL) + goto out; + + rv = CryptAcquireContext(&cryptprovider, NULL, + MS_ENHANCED_PROV, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT); + + if (GetLastError() == NTE_BAD_KEYSET) { + rv = CryptAcquireContext(&cryptprovider, NULL, + MS_ENHANCED_PROV, PROV_RSA_FULL, + CRYPT_NEWKEYSET); + } + + if (rv) { + /* try the default provider */ + rv = CryptAcquireContext(&cryptprovider, NULL, 0, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT); + + if (GetLastError() == NTE_BAD_KEYSET) { + rv = CryptAcquireContext(&cryptprovider, NULL, + MS_ENHANCED_PROV, PROV_RSA_FULL, + CRYPT_NEWKEYSET); + } + } + + if (rv) { + /* try just a default random number generator */ + rv = CryptAcquireContext(&cryptprovider, NULL, 0, PROV_RNG, + CRYPT_VERIFYCONTEXT); + } + + if (rv == 0 && + InterlockedCompareExchangePointer((PVOID *) &g_cryptprovider, + (PVOID) cryptprovider, NULL) != 0) { + + CryptReleaseContext(cryptprovider, 0); + } + +out: + return g_cryptprovider; +} + +/* + * + */ + + +static void +w32crypto_seed(const void *indata, int size) +{ +} + + +static int +w32crypto_bytes(unsigned char *outdata, int size) +{ + if (CryptGenRandom(_hc_CryptProvider(), size, outdata)) + return 1; + return 0; +} + +static void +w32crypto_cleanup(void) +{ + HCRYPTPROV cryptprovider; + + if (InterlockedCompareExchangePointer((PVOID *) &cryptprovider, + 0, (PVOID) g_cryptprovider) == 0) { + CryptReleaseContext(cryptprovider, 0); + } +} + +static void +w32crypto_add(const void *indata, int size, double entropi) +{ +} + +static int +w32crypto_status(void) +{ + if (_hc_CryptProvider() == 0) + return 0; + return 1; +} + +const RAND_METHOD hc_rand_w32crypto_method = { + w32crypto_seed, + w32crypto_bytes, + w32crypto_cleanup, + w32crypto_add, + w32crypto_bytes, + w32crypto_status +}; + +const RAND_METHOD * +RAND_w32crypto_method(void) +{ + return &hc_rand_w32crypto_method; +} diff --git a/crypto/heimdal/lib/hcrypto/rand.h b/crypto/heimdal/lib/hcrypto/rand.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rand.h @@ -0,0 +1,105 @@ + +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * $Id$ + */ + +#ifndef _HEIM_RAND_H +#define _HEIM_RAND_H 1 + +#define RAND_METHOD hc_RAND_METHOD + +typedef struct RAND_METHOD RAND_METHOD; + +#include + +/* symbol renaming */ +#define RAND_bytes hc_RAND_bytes +#define RAND_pseudo_bytes hc_RAND_pseudo_bytes +#define RAND_seed hc_RAND_seed +#define RAND_cleanup hc_RAND_cleanup +#define RAND_add hc_RAND_add +#define RAND_set_rand_method hc_RAND_set_rand_method +#define RAND_get_rand_method hc_RAND_get_rand_method +#define RAND_set_rand_engine hc_RAND_set_rand_engine +#define RAND_file_name hc_RAND_file_name +#define RAND_load_file hc_RAND_load_file +#define RAND_write_file hc_RAND_write_file +#define RAND_status hc_RAND_status +#define RAND_fortuna_method hc_RAND_fortuna_method +#define RAND_unix_method hc_RAND_unix_method +#define RAND_w32crypto_method hc_RAND_w32crypto_method + +/* + * + */ + +struct RAND_METHOD +{ + void (*seed)(const void *, int); + int (*bytes)(unsigned char *, int); + void (*cleanup)(void); + void (*add)(const void *, int, double); + int (*pseudorand)(unsigned char *, int); + int (*status)(void); +}; + +/* + * + */ + +int RAND_bytes(void *, size_t num); +int RAND_pseudo_bytes(void *, size_t); +void RAND_seed(const void *, size_t); +void RAND_cleanup(void); +void RAND_add(const void *, size_t, double); + +int RAND_set_rand_method(const RAND_METHOD *); +const RAND_METHOD * + RAND_get_rand_method(void); +int RAND_set_rand_engine(ENGINE *); + +const char * + RAND_file_name(char *, size_t); +int RAND_load_file(const char *, size_t); +int RAND_write_file(const char *); +int RAND_status(void); + + +const RAND_METHOD * RAND_fortuna_method(void); +const RAND_METHOD * RAND_unix_method(void); +const RAND_METHOD * RAND_w32crypto_method(void); + +#endif /* _HEIM_RAND_H */ diff --git a/crypto/heimdal/lib/hcrypto/rand.c b/crypto/heimdal/lib/hcrypto/rand.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rand.c @@ -0,0 +1,404 @@ +/* + * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#ifdef _WIN32 +#include +#endif + +/** + * @page page_rand RAND - random number + * + * See the library functions here: @ref hcrypto_rand + */ + +static const RAND_METHOD *selected_meth = NULL; +static ENGINE *selected_engine = NULL; + +static void +init_method(void) +{ + if (selected_meth != NULL) + return; +#if defined(_WIN32) + selected_meth = &hc_rand_w32crypto_method; +#elif defined(__APPLE__) + selected_meth = &hc_rand_unix_method; +#else + selected_meth = &hc_rand_fortuna_method; +#endif +} + +/** + * Seed that random number generator. Secret material can securely be + * feed into the function, they will never be returned. + * + * @param indata seed data + * @param size length seed data + * + * @ingroup hcrypto_rand + */ + +void +RAND_seed(const void *indata, size_t size) +{ + init_method(); + (*selected_meth->seed)(indata, size); +} + +/** + * Get a random block from the random generator, can be used for key material. + * + * @param outdata random data + * @param size length random data + * + * @return 1 on success, 0 on failure. + * + * @ingroup hcrypto_rand + */ +int +RAND_bytes(void *outdata, size_t size) +{ + if (size == 0) + return 1; + init_method(); + return (*selected_meth->bytes)(outdata, size); +} + +/** + * Reset and free memory used by the random generator. + * + * @ingroup hcrypto_rand + */ + +void +RAND_cleanup(void) +{ + const RAND_METHOD *meth = selected_meth; + ENGINE *engine = selected_engine; + + selected_meth = NULL; + selected_engine = NULL; + + if (meth) + (*meth->cleanup)(); + if (engine) + ENGINE_finish(engine); +} + +/** + * Seed that random number generator. Secret material can securely be + * feed into the function, they will never be returned. + * + * @param indata the input data. + * @param size size of in data. + * @param entropi entropi in data. + * + * + * @ingroup hcrypto_rand + */ + +void +RAND_add(const void *indata, size_t size, double entropi) +{ + init_method(); + (*selected_meth->add)(indata, size, entropi); +} + +/** + * Get a random block from the random generator, should NOT be used for key material. + * + * @param outdata random data + * @param size length random data + * + * @return 1 on success, 0 on failure. + * + * @ingroup hcrypto_rand + */ + +int +RAND_pseudo_bytes(void *outdata, size_t size) +{ + init_method(); + return (*selected_meth->pseudorand)(outdata, size); +} + +/** + * Return status of the random generator + * + * @return 1 if the random generator can deliver random data. + * + * @ingroup hcrypto_rand + */ + +int +RAND_status(void) +{ + init_method(); + return (*selected_meth->status)(); +} + +/** + * Set the default random method. + * + * @param meth set the new default method. + * + * @return 1 on success. + * + * @ingroup hcrypto_rand + */ + +int +RAND_set_rand_method(const RAND_METHOD *meth) +{ + const RAND_METHOD *old = selected_meth; + selected_meth = meth; + if (old) + (*old->cleanup)(); + if (selected_engine) { + ENGINE_finish(selected_engine); + selected_engine = NULL; + } + return 1; +} + +/** + * Get the default random method. + * + * @return Returns a RAND_METHOD + * + * @ingroup hcrypto_rand + */ + +const RAND_METHOD * +RAND_get_rand_method(void) +{ + init_method(); + return selected_meth; +} + +/** + * Set the default random method from engine. + * + * @param engine use engine, if NULL is passed it, old method and engine is cleared. + * + * @return 1 on success, 0 on failure. + * + * @ingroup hcrypto_rand + */ + +int +RAND_set_rand_engine(ENGINE *engine) +{ + const RAND_METHOD *meth, *old = selected_meth; + + if (engine) { + ENGINE_up_ref(engine); + meth = ENGINE_get_RAND(engine); + if (meth == NULL) { + ENGINE_finish(engine); + return 0; + } + } else { + meth = NULL; + } + + if (old) + (*old->cleanup)(); + + if (selected_engine) + ENGINE_finish(selected_engine); + + selected_engine = engine; + selected_meth = meth; + + return 1; +} + +#define RAND_FILE_SIZE 1024 + +/** + * Load a a file and feed it into RAND_seed(). + * + * @param filename name of file to read. + * @param size minimum size to read. + * + * @return Returns the number of seed bytes loaded (0 indicates failure) + * + * @ingroup hcrypto_rand + */ + +int +RAND_load_file(const char *filename, size_t size) +{ + unsigned char buf[128]; + size_t len; + ssize_t slen; + int fd; + + fd = open(filename, O_RDONLY | O_BINARY, 0600); + if (fd < 0) + return 0; + rk_cloexec(fd); + len = 0; + while(len < size) { + slen = read(fd, buf, sizeof(buf)); + if (slen <= 0) + break; + RAND_seed(buf, slen); + len += slen; + } + close(fd); + + return len ? 1 : 0; +} + +/** + * Write of random numbers to a file to store for later initiation with RAND_load_file(). + * + * @param filename name of file to write. + * + * @return 1 on success and non-one on failure. + * @ingroup hcrypto_rand + */ + +int +RAND_write_file(const char *filename) +{ + unsigned char buf[128]; + size_t len; + int res = 0, fd; + + fd = open(filename, O_WRONLY | O_CREAT | O_BINARY, 0600); + if (fd < 0) + return 0; + rk_cloexec(fd); + + len = 0; + while(len < RAND_FILE_SIZE) { + res = RAND_bytes(buf, sizeof(buf)); + if (res != 1) + break; + if (write(fd, buf, sizeof(buf)) != sizeof(buf)) { + res = 0; + break; + } + len += sizeof(buf); + } + + close(fd); + + return res; +} + +/** + * Return the default random state filename for a user to use for + * RAND_load_file(), and RAND_write_file(). + * + * @param filename buffer to hold file name. + * @param size size of buffer filename. + * + * @return the buffer filename or NULL on failure. + * + * @ingroup hcrypto_rand + */ + +const char * +RAND_file_name(char *filename, size_t size) +{ + const char *e = NULL; + int pathp = 0, ret; + + if (!issuid()) { + e = getenv("RANDFILE"); + if (e == NULL) + e = getenv("HOME"); + if (e) + pathp = 1; + } + +#ifndef _WIN32 + /* + * Here we really want to call getpwuid(getuid()) but this will + * cause recursive lookups if the nss library uses + * gssapi/krb5/hcrypto to authenticate to the ldap servers. + * + * So at least return the unix /dev/random if we have one + */ + if (e == NULL) { + int fd; + + fd = _hc_unix_device_fd(O_RDONLY, &e); + if (fd >= 0) + close(fd); + } +#else /* Win32 */ + + if (e == NULL) { + char profile[MAX_PATH]; + + if (SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, + SHGFP_TYPE_CURRENT, profile) == S_OK) { + ret = snprintf(filename, size, "%s\\.rnd", profile); + + if (ret > 0 && ret < size) + return filename; + } + } + +#endif + + if (e == NULL) + return NULL; + + if (pathp) + ret = snprintf(filename, size, "%s/.rnd", e); + else + ret = snprintf(filename, size, "%s", e); + + if (ret <= 0 || ret >= size) + return NULL; + + return filename; +} diff --git a/crypto/heimdal/lib/hcrypto/randi.h b/crypto/heimdal/lib/hcrypto/randi.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/randi.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * $Id$ + */ + +#ifndef _HEIM_RANDI_H +#define _HEIM_RANDI_H 1 + +extern const RAND_METHOD hc_rand_fortuna_method; +extern const RAND_METHOD hc_rand_unix_method; +extern const RAND_METHOD hc_rand_timer_method; +extern const RAND_METHOD hc_rand_w32crypto_method; + +const RAND_METHOD * RAND_timer_method(void); +int _hc_unix_device_fd(int, const char **); + +#endif /* _HEIM_RANDI_H */ diff --git a/crypto/heimdal/lib/hcrypto/rc2.h b/crypto/heimdal/lib/hcrypto/rc2.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rc2.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +/* symbol renaming */ +#define RC2_set_key hc_RC2_set_key +#define RC2_encryptc hc_RC2_encryptc +#define RC2_decryptc hc_RC2_decryptc +#define RC2_cbc_encrypt hc_RC2_cbc_encrypt + +/* + * + */ + +#define RC2_ENCRYPT 1 +#define RC2_DECRYPT 0 + +#define RC2_BLOCK_SIZE 8 +#define RC2_BLOCK RC2_BLOCK_SIZE +#define RC2_KEY_LENGTH 16 + +typedef struct rc2_key { + unsigned int data[64]; +} RC2_KEY; + +#ifdef __cplusplus +extern "C" { +#endif + +void RC2_set_key(RC2_KEY *, int, const unsigned char *,int); + +void RC2_encryptc(unsigned char *, unsigned char *, const RC2_KEY *); +void RC2_decryptc(unsigned char *, unsigned char *, const RC2_KEY *); + +void RC2_cbc_encrypt(const unsigned char *, unsigned char *, long, + RC2_KEY *, unsigned char *, int); + +#ifdef __cplusplus +} +#endif diff --git a/crypto/heimdal/lib/hcrypto/rc2.c b/crypto/heimdal/lib/hcrypto/rc2.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rc2.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include "rc2.h" + +/* + * Implemented from Peter Gutmann's "Specification for Ron Rivests Cipher No.2" + * rfc2268 and "On the Design and Security of RC2" was also useful. + */ + +static unsigned int Sbox[256] = { + 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, + 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, + 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, + 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, + 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, + 0x61, 0x45, 0x6d, 0x8d, 0x09, 0x81, 0x7d, 0x32, + 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0x0b, + 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, + 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, + 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, + 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, + 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, + 0x6f, 0xbf, 0x0e, 0xda, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x03, + 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, + 0x06, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, + 0x08, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, + 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, + 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, + 0x4b, 0x9f, 0xd0, 0x5e, 0x04, 0x18, 0xa4, 0xec, + 0xc2, 0xe0, 0x41, 0x6e, 0x0f, 0x51, 0xcb, 0xcc, + 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, + 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, + 0xfc, 0x02, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, + 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, + 0x05, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, + 0xd3, 0x00, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, + 0x63, 0x16, 0x01, 0x3f, 0x58, 0xe2, 0x89, 0xa9, + 0x0d, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, + 0xbb, 0x48, 0x0c, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, + 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, + 0x0a, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad +}; + +void +RC2_set_key(RC2_KEY *key, int len, const unsigned char *data, int bits) +{ + unsigned char k[128]; + int j, T8, TM; + + if (len <= 0) + abort(); + if (len > 128) + len = 128; + if (bits <= 0 || bits > 1024) + bits = 1024; + + for (j = 0; j < len; j++) + k[j] = data[j]; + for (; j < 128; j++) + k[j] = Sbox[(k[j - len] + k[j - 1]) & 0xff]; + + T8 = (bits + 7) / 8; + j = (8*T8 - bits); + TM = 0xff >> j; + + k[128 - T8] = Sbox[k[128 - T8] & TM]; + + for (j = 127 - T8; j >= 0; j--) + k[j] = Sbox[k[j + 1] ^ k[j + T8]]; + + for (j = 0; j < 64; j++) + key->data[j] = k[(j * 2) + 0] | (k[(j * 2) + 1] << 8); + memset(k, 0, sizeof(k)); +} + +#define ROT16L(w,n) ((w<>(16-n))) +#define ROT16R(w,n) ((w>>n)|(w<<(16-n))) + +void +RC2_encryptc(unsigned char *in, unsigned char *out, const RC2_KEY *key) +{ + int i, j; + int w0, w1, w2, w3; + int t0, t1, t2, t3; + + w0 = in[0] | (in[1] << 8); + w1 = in[2] | (in[3] << 8); + w2 = in[4] | (in[5] << 8); + w3 = in[6] | (in[7] << 8); + + for (i = 0; i < 16; i++) { + j = i * 4; + t0 = (w0 + (w1 & ~w3) + (w2 & w3) + key->data[j + 0]) & 0xffff; + w0 = ROT16L(t0, 1); + t1 = (w1 + (w2 & ~w0) + (w3 & w0) + key->data[j + 1]) & 0xffff; + w1 = ROT16L(t1, 2); + t2 = (w2 + (w3 & ~w1) + (w0 & w1) + key->data[j + 2]) & 0xffff; + w2 = ROT16L(t2, 3); + t3 = (w3 + (w0 & ~w2) + (w1 & w2) + key->data[j + 3]) & 0xffff; + w3 = ROT16L(t3, 5); + if(i == 4 || i == 10) { + w0 += key->data[w3 & 63]; + w1 += key->data[w0 & 63]; + w2 += key->data[w1 & 63]; + w3 += key->data[w2 & 63]; + } + } + + out[0] = w0 & 0xff; + out[1] = (w0 >> 8) & 0xff; + out[2] = w1 & 0xff; + out[3] = (w1 >> 8) & 0xff; + out[4] = w2 & 0xff; + out[5] = (w2 >> 8) & 0xff; + out[6] = w3 & 0xff; + out[7] = (w3 >> 8) & 0xff; +} + +void +RC2_decryptc(unsigned char *in, unsigned char *out, const RC2_KEY *key) +{ + int i, j; + int w0, w1, w2, w3; + int t0, t1, t2, t3; + + w0 = in[0] | (in[1] << 8); + w1 = in[2] | (in[3] << 8); + w2 = in[4] | (in[5] << 8); + w3 = in[6] | (in[7] << 8); + + for (i = 15; i >= 0; i--) { + j = i * 4; + + if(i == 4 || i == 10) { + w3 = (w3 - key->data[w2 & 63]) & 0xffff; + w2 = (w2 - key->data[w1 & 63]) & 0xffff; + w1 = (w1 - key->data[w0 & 63]) & 0xffff; + w0 = (w0 - key->data[w3 & 63]) & 0xffff; + } + + t3 = ROT16R(w3, 5); + w3 = (t3 - (w0 & ~w2) - (w1 & w2) - key->data[j + 3]) & 0xffff; + t2 = ROT16R(w2, 3); + w2 = (t2 - (w3 & ~w1) - (w0 & w1) - key->data[j + 2]) & 0xffff; + t1 = ROT16R(w1, 2); + w1 = (t1 - (w2 & ~w0) - (w3 & w0) - key->data[j + 1]) & 0xffff; + t0 = ROT16R(w0, 1); + w0 = (t0 - (w1 & ~w3) - (w2 & w3) - key->data[j + 0]) & 0xffff; + + } + out[0] = w0 & 0xff; + out[1] = (w0 >> 8) & 0xff; + out[2] = w1 & 0xff; + out[3] = (w1 >> 8) & 0xff; + out[4] = w2 & 0xff; + out[5] = (w2 >> 8) & 0xff; + out[6] = w3 & 0xff; + out[7] = (w3 >> 8) & 0xff; +} + +void +RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long size, + RC2_KEY *key, unsigned char *iv, int forward_encrypt) +{ + unsigned char tmp[RC2_BLOCK_SIZE]; + int i; + + if (forward_encrypt) { + while (size >= RC2_BLOCK_SIZE) { + for (i = 0; i < RC2_BLOCK_SIZE; i++) + tmp[i] = in[i] ^ iv[i]; + RC2_encryptc(tmp, out, key); + memcpy(iv, out, RC2_BLOCK_SIZE); + size -= RC2_BLOCK_SIZE; + in += RC2_BLOCK_SIZE; + out += RC2_BLOCK_SIZE; + } + if (size) { + for (i = 0; i < size; i++) + tmp[i] = in[i] ^ iv[i]; + for (i = size; i < RC2_BLOCK_SIZE; i++) + tmp[i] = iv[i]; + RC2_encryptc(tmp, out, key); + memcpy(iv, out, RC2_BLOCK_SIZE); + } + } else { + while (size >= RC2_BLOCK_SIZE) { + memcpy(tmp, in, RC2_BLOCK_SIZE); + RC2_decryptc(tmp, out, key); + for (i = 0; i < RC2_BLOCK_SIZE; i++) + out[i] ^= iv[i]; + memcpy(iv, tmp, RC2_BLOCK_SIZE); + size -= RC2_BLOCK_SIZE; + in += RC2_BLOCK_SIZE; + out += RC2_BLOCK_SIZE; + } + if (size) { + memcpy(tmp, in, RC2_BLOCK_SIZE); + RC2_decryptc(tmp, out, key); + for (i = 0; i < size; i++) + out[i] ^= iv[i]; + memcpy(iv, tmp, RC2_BLOCK_SIZE); + } + } +} diff --git a/crypto/heimdal/lib/hcrypto/rc2test.c b/crypto/heimdal/lib/hcrypto/rc2test.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rc2test.c @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include + +struct { + const void *key; + const int keylen; + const int bitsize; + const void *plain; + const void *cipher; +} tests[] = { + { + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + 0, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x1C\x19\x8A\x83\x8D\xF0\x28\xB7" + }, + { + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x01", + 16, + 0, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x21\x82\x9C\x78\xA9\xF9\xC0\x74" + }, + { + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + 0, + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", + "\x13\xDB\x35\x17\xD3\x21\x86\x9E" + }, + { + "\x00\x01\x02\x03\x04\x05\x06\x07" + "\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", + 16, + 0, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x50\xDC\x01\x62\xBD\x75\x7F\x31" + }, + { + "\x00\x00\x00\x00\x00\x00\x00\x00", + 8, + 63, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\xeb\xb7\x73\xf9\x93\x27\x8e\xff" + }, + { + "\xff\xff\xff\xff\xff\xff\xff\xff", + 8, + 64, + "\xff\xff\xff\xff\xff\xff\xff\xff", + "\x27\x8b\x27\xe4\x2e\x2f\x0d\x49" + }, + { + "\x88", + 1, + 64, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x61\xa8\xa2\x44\xad\xac\xcc\xf0" + } +}; + +const unsigned char cbc_key[16] = +"\x00\x00\x00\x00\x00\x00\x00\x00" +"\x00\x00\x00\x00\x00\x00\x00\x00"; +const char cbc_iv[8] = +"\x01\x01\x01\x01\x01\x01\x01\x01"; +const unsigned char cbc_in_data[32] = +"\x20\x20\x20\x20\x20\x20\x20\x20" +"\x20\x20\x20\x20\x20\x20\x20\x20" +"\x20\x20\x20\x20\x20\x20\x20\x20" +"\x20\x20\x20\x20\x20\x20\x20\x20"; + +const char out_iv[8] = "\x00\x78\x1b\x6\xff\xb9\xfa\xe"; + +const char cbc_out_data[32] = +"\xb4\x3f\x89\x15\x69\x68\xda\x79" +"\x29\xab\x5f\x78\xc5\xba\x15\x82" +"\x80\x89\x57\x1b\xbe\x57\x2f\xdc" +"\x00\x78\x1b\x06\xff\xb9\xfa\x0e"; + +int +main(int argc, char **argv) +{ + RC2_KEY key; + unsigned char t[8]; + unsigned char out[40]; + int i; + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) { + RC2_set_key(&key, tests[i].keylen, tests[i].key, tests[i].bitsize); + + memcpy(t, tests[i].plain, 8); + RC2_encryptc(t, t, &key); + if (memcmp(t, tests[i].cipher, 8) != 0) { + printf("encrypt %d\n", i); + exit(1); + } + RC2_decryptc(t, t, &key); + if (memcmp(t, tests[i].plain, 8) != 0) { + printf("decrypt: %d\n", i); + exit(1); + } + } + + /* cbc test */ + + RC2_set_key(&key, 16, cbc_key, 0); + memcpy(t, cbc_iv, 8); + RC2_cbc_encrypt(cbc_in_data, out, 32, &key, t, 1); + + if (memcmp(out_iv, t, 8) != 0) + abort(); + + if (memcmp(out, cbc_out_data, 32) != 0) { + printf("cbc test encrypt\n"); + exit(1); + } + + memcpy(t, cbc_iv, 8); + RC2_cbc_encrypt(out, out, 32, &key, t, 0); + + if (memcmp(cbc_in_data, out, 32) != 0) { + printf("cbc test decrypt \n"); + exit(1); + } + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/rc4.h b/crypto/heimdal/lib/hcrypto/rc4.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rc4.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +/* symbol renaming */ +#define RC4_set_key hc_RC4_set_key +#define RC4 hc_RC4 + +typedef struct rc4_key { + unsigned int x, y; + unsigned int state[256]; +} RC4_KEY; + +void RC4_set_key(RC4_KEY *, const int, const unsigned char *); +void RC4(RC4_KEY *, const int, const unsigned char *, unsigned char *); diff --git a/crypto/heimdal/lib/hcrypto/rc4.c b/crypto/heimdal/lib/hcrypto/rc4.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rc4.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* implemented from description in draft-kaukonen-cipher-arcfour-03.txt */ + +#include +#include + +#include + +#define SWAP(k,x,y) \ +{ unsigned int _t; \ + _t = k->state[x]; \ + k->state[x] = k->state[y]; \ + k->state[y] = _t; \ +} + +void +RC4_set_key(RC4_KEY *key, const int len, const unsigned char *data) +{ + int i, j; + + for (i = 0; i < 256; i++) + key->state[i] = i; + for (i = 0, j = 0; i < 256; i++) { + j = (j + key->state[i] + data[i % len]) % 256; + SWAP(key, i, j); + } + key->x = key->y = 0; +} + +void +RC4(RC4_KEY *key, const int len, const unsigned char *in, unsigned char *out) +{ + int i, t; + unsigned x, y; + + x = key->x; + y = key->y; + for (i = 0; i < len; i++) { + x = (x + 1) % 256; + y = (y + key->state[x]) % 256; + SWAP(key, x, y); + t = (key->state[x] + key->state[y]) % 256; + *out++ = key->state[t] ^ *in++; + } + key->x = x; + key->y = y; +} diff --git a/crypto/heimdal/lib/hcrypto/rctest.c b/crypto/heimdal/lib/hcrypto/rctest.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rctest.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +static unsigned char plain1[8] = + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static unsigned char key1[8] = + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; +static unsigned char cipher1[8] = + { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 }; + +static unsigned char plain2[5] = + { 0xdc, 0xee, 0x4c, 0xf9, 0x2c }; +static unsigned char key2[5] = + { 0x61, 0x8a, 0x63, 0xd2, 0xfb }; +static unsigned char cipher2[5] = + { 0xf1, 0x38, 0x29, 0xc9, 0xde }; + +static unsigned char plain3[] = + { + 0x52, 0x75, 0x69, 0x73, 0x6c, 0x69, 0x6e, 0x6e, + 0x75, 0x6e, 0x20, 0x6c, 0x61, 0x75, 0x6c, 0x75, + 0x20, 0x6b, 0x6f, 0x72, 0x76, 0x69, 0x73, 0x73, + 0x73, 0x61, 0x6e, 0x69, 0x2c, 0x20, 0x74, 0xe4, + 0x68, 0x6b, 0xe4, 0x70, 0xe4, 0x69, 0x64, 0x65, + 0x6e, 0x20, 0x70, 0xe4, 0xe4, 0x6c, 0x6c, 0xe4, + 0x20, 0x74, 0xe4, 0x79, 0x73, 0x69, 0x6b, 0x75, + 0x75, 0x2e, 0x20, 0x4b, 0x65, 0x73, 0xe4, 0x79, + 0xf6, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, + 0x6e, 0x69, 0x20, 0x6f, 0x6d, 0x61, 0x6e, 0x61, + 0x6e, 0x69, 0x2c, 0x20, 0x6b, 0x61, 0x73, 0x6b, + 0x69, 0x73, 0x61, 0x76, 0x75, 0x75, 0x6e, 0x20, + 0x6c, 0x61, 0x61, 0x6b, 0x73, 0x6f, 0x74, 0x20, + 0x76, 0x65, 0x72, 0x68, 0x6f, 0x75, 0x75, 0x2e, + 0x20, 0x45, 0x6e, 0x20, 0x6d, 0x61, 0x20, 0x69, + 0x6c, 0x6f, 0x69, 0x74, 0x73, 0x65, 0x2c, 0x20, + 0x73, 0x75, 0x72, 0x65, 0x20, 0x68, 0x75, 0x6f, + 0x6b, 0x61, 0x61, 0x2c, 0x20, 0x6d, 0x75, 0x74, + 0x74, 0x61, 0x20, 0x6d, 0x65, 0x74, 0x73, 0xe4, + 0x6e, 0x20, 0x74, 0x75, 0x6d, 0x6d, 0x75, 0x75, + 0x73, 0x20, 0x6d, 0x75, 0x6c, 0x6c, 0x65, 0x20, + 0x74, 0x75, 0x6f, 0x6b, 0x61, 0x61, 0x2e, 0x20, + 0x50, 0x75, 0x75, 0x6e, 0x74, 0x6f, 0x20, 0x70, + 0x69, 0x6c, 0x76, 0x65, 0x6e, 0x2c, 0x20, 0x6d, + 0x69, 0x20, 0x68, 0x75, 0x6b, 0x6b, 0x75, 0x75, + 0x2c, 0x20, 0x73, 0x69, 0x69, 0x6e, 0x74, 0x6f, + 0x20, 0x76, 0x61, 0x72, 0x61, 0x6e, 0x20, 0x74, + 0x75, 0x75, 0x6c, 0x69, 0x73, 0x65, 0x6e, 0x2c, + 0x20, 0x6d, 0x69, 0x20, 0x6e, 0x75, 0x6b, 0x6b, + 0x75, 0x75, 0x2e, 0x20, 0x54, 0x75, 0x6f, 0x6b, + 0x73, 0x75, 0x74, 0x20, 0x76, 0x61, 0x6e, 0x61, + 0x6d, 0x6f, 0x6e, 0x20, 0x6a, 0x61, 0x20, 0x76, + 0x61, 0x72, 0x6a, 0x6f, 0x74, 0x20, 0x76, 0x65, + 0x65, 0x6e, 0x2c, 0x20, 0x6e, 0x69, 0x69, 0x73, + 0x74, 0xe4, 0x20, 0x73, 0x79, 0x64, 0xe4, 0x6d, + 0x65, 0x6e, 0x69, 0x20, 0x6c, 0x61, 0x75, 0x6c, + 0x75, 0x6e, 0x20, 0x74, 0x65, 0x65, 0x6e, 0x2e, + 0x20, 0x2d, 0x20, 0x45, 0x69, 0x6e, 0x6f, 0x20, + 0x4c, 0x65, 0x69, 0x6e, 0x6f }; + +static unsigned char key3[16] = + { 0x29, 0x04, 0x19, 0x72, 0xfb, 0x42, 0xba, 0x5f, + 0xc7, 0x12, 0x77, 0x12, 0xf1, 0x38, 0x29, 0xc9 }; + +const unsigned char cipher3[] = + { 0x35, 0x81, 0x86, 0x99, 0x90, 0x01, 0xe6, 0xb5, + 0xda, 0xf0, 0x5e, 0xce, 0xeb, 0x7e, 0xee, 0x21, + 0xe0, 0x68, 0x9c, 0x1f, 0x00, 0xee, 0xa8, 0x1f, + 0x7d, 0xd2, 0xca, 0xae, 0xe1, 0xd2, 0x76, 0x3e, + 0x68, 0xaf, 0x0e, 0xad, 0x33, 0xd6, 0x6c, 0x26, + 0x8b, 0xc9, 0x46, 0xc4, 0x84, 0xfb, 0xe9, 0x4c, + 0x5f, 0x5e, 0x0b, 0x86, 0xa5, 0x92, 0x79, 0xe4, + 0xf8, 0x24, 0xe7, 0xa6, 0x40, 0xbd, 0x22, 0x32, + 0x10, 0xb0, 0xa6, 0x11, 0x60, 0xb7, 0xbc, 0xe9, + 0x86, 0xea, 0x65, 0x68, 0x80, 0x03, 0x59, 0x6b, + 0x63, 0x0a, 0x6b, 0x90, 0xf8, 0xe0, 0xca, 0xf6, + 0x91, 0x2a, 0x98, 0xeb, 0x87, 0x21, 0x76, 0xe8, + 0x3c, 0x20, 0x2c, 0xaa, 0x64, 0x16, 0x6d, 0x2c, + 0xce, 0x57, 0xff, 0x1b, 0xca, 0x57, 0xb2, 0x13, + 0xf0, 0xed, 0x1a, 0xa7, 0x2f, 0xb8, 0xea, 0x52, + 0xb0, 0xbe, 0x01, 0xcd, 0x1e, 0x41, 0x28, 0x67, + 0x72, 0x0b, 0x32, 0x6e, 0xb3, 0x89, 0xd0, 0x11, + 0xbd, 0x70, 0xd8, 0xaf, 0x03, 0x5f, 0xb0, 0xd8, + 0x58, 0x9d, 0xbc, 0xe3, 0xc6, 0x66, 0xf5, 0xea, + 0x8d, 0x4c, 0x79, 0x54, 0xc5, 0x0c, 0x3f, 0x34, + 0x0b, 0x04, 0x67, 0xf8, 0x1b, 0x42, 0x59, 0x61, + 0xc1, 0x18, 0x43, 0x07, 0x4d, 0xf6, 0x20, 0xf2, + 0x08, 0x40, 0x4b, 0x39, 0x4c, 0xf9, 0xd3, 0x7f, + 0xf5, 0x4b, 0x5f, 0x1a, 0xd8, 0xf6, 0xea, 0x7d, + 0xa3, 0xc5, 0x61, 0xdf, 0xa7, 0x28, 0x1f, 0x96, + 0x44, 0x63, 0xd2, 0xcc, 0x35, 0xa4, 0xd1, 0xb0, + 0x34, 0x90, 0xde, 0xc5, 0x1b, 0x07, 0x11, 0xfb, + 0xd6, 0xf5, 0x5f, 0x79, 0x23, 0x4d, 0x5b, 0x7c, + 0x76, 0x66, 0x22, 0xa6, 0x6d, 0xe9, 0x2b, 0xe9, + 0x96, 0x46, 0x1d, 0x5e, 0x4d, 0xc8, 0x78, 0xef, + 0x9b, 0xca, 0x03, 0x05, 0x21, 0xe8, 0x35, 0x1e, + 0x4b, 0xae, 0xd2, 0xfd, 0x04, 0xf9, 0x46, 0x73, + 0x68, 0xc4, 0xad, 0x6a, 0xc1, 0x86, 0xd0, 0x82, + 0x45, 0xb2, 0x63, 0xa2, 0x66, 0x6d, 0x1f, 0x6c, + 0x54, 0x20, 0xf1, 0x59, 0x9d, 0xfd, 0x9f, 0x43, + 0x89, 0x21, 0xc2, 0xf5, 0xa4, 0x63, 0x93, 0x8c, + 0xe0, 0x98, 0x22, 0x65, 0xee, 0xf7, 0x01, 0x79, + 0xbc, 0x55, 0x3f, 0x33, 0x9e, 0xb1, 0xa4, 0xc1, + 0xaf, 0x5f, 0x6a, 0x54, 0x7f }; + +int +main (void) +{ + unsigned char buf[1024]; + RC4_KEY key; + + RC4_set_key(&key, 8, key1); + RC4(&key, 8, plain1, buf); + if (memcmp(buf, cipher1, 8) != 0) + return 1; + + RC4_set_key(&key, 5, key2); + RC4(&key, 5, plain2, buf); + if (memcmp(buf, cipher2, 5) != 0) + return 1; + + RC4_set_key(&key, 16, key3); + RC4(&key, 309, plain3, buf); + if (memcmp(buf, cipher3, 309) != 0) + return 1; + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/resource.h b/crypto/heimdal/lib/hcrypto/resource.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/resource.h @@ -0,0 +1,18 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by passwd_dialog.rc +// +#define IDD_PASSWD_DIALOG 101 +#define IDC_EDIT1 1000 +#define IDC_PASSWD_EDIT 1001 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1002 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/crypto/heimdal/lib/hcrypto/rijndael-alg-fst.h b/crypto/heimdal/lib/hcrypto/rijndael-alg-fst.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rijndael-alg-fst.h @@ -0,0 +1,46 @@ +/* $NetBSD: rijndael-alg-fst.h,v 1.2 2000/10/02 17:19:15 itojun Exp $ */ +/* $KAME: rijndael-alg-fst.h,v 1.5 2003/07/15 10:47:16 itojun Exp $ */ +/** + * rijndael-alg-fst.h + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __RIJNDAEL_ALG_FST_H +#define __RIJNDAEL_ALG_FST_H + +/* symbol renaming */ +#define rijndaelKeySetupEnc _hc_rijndaelKeySetupEnc +#define rijndaelKeySetupDec _hc_rijndaelKeySetupDec +#define rijndaelEncrypt _hc_rijndaelEncrypt +#define rijndaelDecrypt _hc_rijndaelDecrypt + +#define RIJNDAEL_MAXKC (256/32) +#define RIJNDAEL_MAXKB (256/8) +#define RIJNDAEL_MAXNR 14 + +int rijndaelKeySetupEnc(uint32_t rk[/*4*(Nr + 1)*/], const uint8_t cipherKey[], int keyBits); +int rijndaelKeySetupDec(uint32_t rk[/*4*(Nr + 1)*/], const uint8_t cipherKey[], int keyBits); +void rijndaelEncrypt(const uint32_t rk[/*4*(Nr + 1)*/], int Nr, const uint8_t pt[16], uint8_t ct[16]); +void rijndaelDecrypt(const uint32_t rk[/*4*(Nr + 1)*/], int Nr, const uint8_t ct[16], uint8_t pt[16]); + +#endif /* __RIJNDAEL_ALG_FST_H */ diff --git a/crypto/heimdal/lib/hcrypto/rijndael-alg-fst.c b/crypto/heimdal/lib/hcrypto/rijndael-alg-fst.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rijndael-alg-fst.c @@ -0,0 +1,1223 @@ +/* $NetBSD: rijndael-alg-fst.c,v 1.5 2001/11/13 01:40:10 lukem Exp $ */ +/* $KAME: rijndael-alg-fst.c,v 1.10 2003/07/15 10:47:16 itojun Exp $ */ +/** + * rijndael-alg-fst.c + * + * @version 3.0 (December 2000) + * + * Optimised ANSI C code for the Rijndael cipher (now AES) + * + * @author Vincent Rijmen + * @author Antoon Bosselaers + * @author Paulo Barreto + * + * This code is hereby placed in the public domain. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* "$NetBSD: rijndael-alg-fst.c,v 1.5 2001/11/13 01:40:10 lukem Exp $" */ + +#include +#include + +#ifdef KRB5 +#include +#endif + +#include "rijndael-alg-fst.h" + +/* +Te0[x] = S [x].[02, 01, 01, 03]; +Te1[x] = S [x].[03, 02, 01, 01]; +Te2[x] = S [x].[01, 03, 02, 01]; +Te3[x] = S [x].[01, 01, 03, 02]; +Te4[x] = S [x].[01, 01, 01, 01]; + +Td0[x] = Si[x].[0e, 09, 0d, 0b]; +Td1[x] = Si[x].[0b, 0e, 09, 0d]; +Td2[x] = Si[x].[0d, 0b, 0e, 09]; +Td3[x] = Si[x].[09, 0d, 0b, 0e]; +Td4[x] = Si[x].[01, 01, 01, 01]; +*/ + +static const uint32_t Te0[256] = { + 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, + 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, + 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, + 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, + 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, + 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, + 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, + 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, + 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, + 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, + 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, + 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, + 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, + 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, + 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, + 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, + 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, + 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, + 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, + 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, + 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, + 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, + 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, + 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, + 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, + 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, + 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, + 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, + 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, + 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, + 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, + 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, + 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, + 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, + 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, + 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, + 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, + 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, + 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, + 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, + 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, + 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, + 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, + 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, + 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, + 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, + 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, + 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, + 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, + 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, + 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, + 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, + 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, + 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, + 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, + 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, + 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, + 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, + 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, + 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, + 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, + 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, + 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, + 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, +}; +static const uint32_t Te1[256] = { + 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, + 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, + 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, + 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, + 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, + 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, + 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, + 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, + 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, + 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, + 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, + 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, + 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, + 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, + 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, + 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, + 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, + 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, + 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, + 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, + 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, + 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, + 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, + 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, + 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, + 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, + 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, + 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, + 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, + 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, + 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, + 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, + 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, + 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, + 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, + 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, + 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, + 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, + 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, + 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, + 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, + 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, + 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, + 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, + 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, + 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, + 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, + 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, + 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, + 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, + 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, + 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, + 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, + 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, + 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, + 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, + 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, + 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, + 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, + 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, + 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, + 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, + 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, + 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, +}; +static const uint32_t Te2[256] = { + 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, + 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, + 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, + 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, + 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, + 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, + 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, + 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, + 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, + 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, + 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, + 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, + 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, + 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, + 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, + 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, + 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, + 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, + 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, + 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, + 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, + 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, + 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, + 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, + 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, + 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, + 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, + 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, + 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, + 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, + 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, + 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, + 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, + 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, + 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, + 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, + 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, + 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, + 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, + 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, + 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, + 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, + 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, + 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, + 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, + 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, + 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, + 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, + 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, + 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, + 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, + 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, + 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, + 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, + 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, + 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, + 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, + 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, + 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, + 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, + 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, + 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, + 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, + 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, +}; +static const uint32_t Te3[256] = { + + 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, + 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, + 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, + 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, + 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, + 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, + 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, + 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, + 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, + 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, + 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, + 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, + 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, + 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, + 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, + 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, + 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, + 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, + 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, + 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, + 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, + 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, + 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, + 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, + 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, + 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, + 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, + 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, + 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, + 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, + 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, + 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, + 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, + 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, + 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, + 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, + 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, + 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, + 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, + 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, + 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, + 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, + 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, + 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, + 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, + 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, + 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, + 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, + 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, + 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, + 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, + 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, + 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, + 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, + 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, + 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, + 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, + 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, + 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, + 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, + 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, + 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, + 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, + 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, +}; +static const uint32_t Te4[256] = { + 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, + 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, + 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, + 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, + 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, + 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, + 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, + 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, + 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, + 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, + 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, + 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, + 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, + 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, + 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, + 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, + 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, + 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, + 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, + 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, + 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, + 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, + 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, + 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, + 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, + 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, + 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, + 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, + 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, + 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, + 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, + 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, + 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, + 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, + 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, + 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, + 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, + 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, + 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, + 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, + 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, + 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, + 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, + 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, + 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, + 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, + 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, + 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, + 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, + 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, + 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, + 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, + 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, + 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, + 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, + 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, + 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, + 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, + 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, + 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, + 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, + 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, + 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, + 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, +}; +static const uint32_t Td0[256] = { + 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, + 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, + 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, + 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, + 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, + 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, + 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, + 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, + 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, + 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, + 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, + 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, + 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, + 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, + 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, + 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, + 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, + 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, + 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, + 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, + 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, + 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, + 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, + 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, + 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, + 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, + 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, + 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, + 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, + 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, + 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, + 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, + 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, + 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, + 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, + 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, + 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, + 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, + 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, + 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, + 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, + 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, + 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, + 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, + 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, + 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, + 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, + 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, + 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, + 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, + 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, + 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, + 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, + 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, + 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, + 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, + 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, + 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, + 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, + 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, + 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, + 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, + 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, + 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, +}; +static const uint32_t Td1[256] = { + 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, + 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, + 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, + 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, + 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, + 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, + 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, + 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, + 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, + 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, + 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, + 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, + 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, + 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, + 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, + 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, + 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, + 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, + 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, + 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, + 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, + 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, + 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, + 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, + 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, + 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, + 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, + 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, + 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, + 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, + 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, + 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, + 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, + 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, + 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, + 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, + 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, + 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, + 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, + 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, + 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, + 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, + 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, + 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, + 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, + 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, + 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, + 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, + 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, + 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, + 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, + 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, + 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, + 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, + 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, + 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, + 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, + 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, + 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, + 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, + 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, + 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, + 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, + 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, +}; +static const uint32_t Td2[256] = { + 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, + 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, + 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, + 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, + 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, + 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, + 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, + 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, + 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, + 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, + 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, + 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, + 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, + 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, + 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, + 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, + 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, + 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, + 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, + 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, + + 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, + 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, + 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, + 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, + 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, + 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, + 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, + 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, + 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, + 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, + 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, + 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, + 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, + 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, + 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, + 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, + 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, + 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, + 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, + 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, + 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, + 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, + 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, + 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, + 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, + 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, + 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, + 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, + 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, + 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, + 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, + 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, + 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, + 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, + 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, + 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, + 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, + 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, + 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, + 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, + 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, + 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, + 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, + 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, +}; +static const uint32_t Td3[256] = { + 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, + 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, + 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, + 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, + 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, + 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, + 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, + 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, + 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, + 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, + 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, + 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, + 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, + 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, + 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, + 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, + 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, + 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, + 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, + 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, + 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, + 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, + 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, + 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, + 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, + 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, + 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, + 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, + 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, + 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, + 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, + 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, + 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, + 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, + 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, + 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, + 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, + 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, + 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, + 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, + 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, + 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, + 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, + 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, + 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, + 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, + 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, + 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, + 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, + 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, + 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, + 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, + 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, + 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, + 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, + 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, + 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, + 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, + 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, + 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, + 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, + 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, + 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, + 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, +}; +static const uint32_t Td4[256] = { + 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, + 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, + 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, + 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, + 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, + 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, + 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, + 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, + 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, + 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, + 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, + 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, + 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, + 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, + 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, + 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, + 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, + 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, + 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, + 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, + 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, + 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, + 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, + 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, + 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, + 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, + 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, + 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, + 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, + 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, + 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, + 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, + 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, + 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, + 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, + 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, + 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, + 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, + 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, + 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, + 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, + 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, + 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, + 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, + 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, + 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, + 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, + 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, + 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, + 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, + 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, + 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, + 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, + 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, + 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, + 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, + 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, + 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, + 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, + 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, + 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, + 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, + 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, + 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, +}; +static const uint32_t rcon[] = { + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ +}; + +#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00) + +#ifdef _MSC_VER +#define GETU32(p) SWAP(*((uint32_t *)(p))) +#define PUTU32(ct, st) { *((uint32_t *)(ct)) = SWAP((st)); } +#else +#define GETU32(pt) (((uint32_t)(pt)[0] << 24) ^ ((uint32_t)(pt)[1] << 16) ^ ((uint32_t)(pt)[2] << 8) ^ ((uint32_t)(pt)[3])) +#define PUTU32(ct, st) { (ct)[0] = (uint8_t)((st) >> 24); (ct)[1] = (uint8_t)((st) >> 16); (ct)[2] = (uint8_t)((st) >> 8); (ct)[3] = (uint8_t)(st); } +#endif + +/** + * Expand the cipher key into the encryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ +int rijndaelKeySetupEnc(uint32_t rk[/*4*(Nr + 1)*/], const uint8_t cipherKey[], int keyBits) { + int i = 0; + uint32_t temp; + + rk[0] = GETU32(cipherKey ); + rk[1] = GETU32(cipherKey + 4); + rk[2] = GETU32(cipherKey + 8); + rk[3] = GETU32(cipherKey + 12); + if (keyBits == 128) { + for (;;) { + temp = rk[3]; + rk[4] = rk[0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[5] = rk[1] ^ rk[4]; + rk[6] = rk[2] ^ rk[5]; + rk[7] = rk[3] ^ rk[6]; + if (++i == 10) { + return 10; + } + rk += 4; + } + } + rk[4] = GETU32(cipherKey + 16); + rk[5] = GETU32(cipherKey + 20); + if (keyBits == 192) { + for (;;) { + temp = rk[ 5]; + rk[ 6] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 7] = rk[ 1] ^ rk[ 6]; + rk[ 8] = rk[ 2] ^ rk[ 7]; + rk[ 9] = rk[ 3] ^ rk[ 8]; + if (++i == 8) { + return 12; + } + rk[10] = rk[ 4] ^ rk[ 9]; + rk[11] = rk[ 5] ^ rk[10]; + rk += 6; + } + } + rk[6] = GETU32(cipherKey + 24); + rk[7] = GETU32(cipherKey + 28); + if (keyBits == 256) { + for (;;) { + temp = rk[ 7]; + rk[ 8] = rk[ 0] ^ + (Te4[(temp >> 16) & 0xff] & 0xff000000) ^ + (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^ + (Te4[(temp ) & 0xff] & 0x0000ff00) ^ + (Te4[(temp >> 24) ] & 0x000000ff) ^ + rcon[i]; + rk[ 9] = rk[ 1] ^ rk[ 8]; + rk[10] = rk[ 2] ^ rk[ 9]; + rk[11] = rk[ 3] ^ rk[10]; + if (++i == 7) { + return 14; + } + temp = rk[11]; + rk[12] = rk[ 4] ^ + (Te4[(temp >> 24) ] & 0xff000000) ^ + (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(temp ) & 0xff] & 0x000000ff); + rk[13] = rk[ 5] ^ rk[12]; + rk[14] = rk[ 6] ^ rk[13]; + rk[15] = rk[ 7] ^ rk[14]; + + rk += 8; + } + } + return 0; +} + +/** + * Expand the cipher key into the decryption key schedule. + * + * @return the number of rounds for the given cipher key size. + */ +int rijndaelKeySetupDec(uint32_t rk[/*4*(Nr + 1)*/], const uint8_t cipherKey[], int keyBits) { + int Nr, i, j; + uint32_t temp; + + /* expand the cipher key: */ + Nr = rijndaelKeySetupEnc(rk, cipherKey, keyBits); + /* invert the order of the round keys: */ + for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) { + temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; + temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; + temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; + temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; + } + /* apply the inverse MixColumn transform to all round keys but the first and the last: */ + for (i = 1; i < Nr; i++) { + rk += 4; + rk[0] = + Td0[Te4[(rk[0] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[0] ) & 0xff] & 0xff]; + rk[1] = + Td0[Te4[(rk[1] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[1] ) & 0xff] & 0xff]; + rk[2] = + Td0[Te4[(rk[2] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[2] ) & 0xff] & 0xff]; + rk[3] = + Td0[Te4[(rk[3] >> 24) ] & 0xff] ^ + Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^ + Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^ + Td3[Te4[(rk[3] ) & 0xff] & 0xff]; + } + return Nr; +} + +void rijndaelEncrypt(const uint32_t rk[/*4*(Nr + 1)*/], int Nr, const uint8_t pt[16], uint8_t ct[16]) { + uint32_t s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(pt ) ^ rk[0]; + s1 = GETU32(pt + 4) ^ rk[1]; + s2 = GETU32(pt + 8) ^ rk[2]; + s3 = GETU32(pt + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48]; + s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49]; + s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50]; + s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52]; + t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53]; + t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54]; + t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55]; + } + } + rk += Nr << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = + Te0[(s0 >> 24) ] ^ + Te1[(s1 >> 16) & 0xff] ^ + Te2[(s2 >> 8) & 0xff] ^ + Te3[(s3 ) & 0xff] ^ + rk[4]; + t1 = + Te0[(s1 >> 24) ] ^ + Te1[(s2 >> 16) & 0xff] ^ + Te2[(s3 >> 8) & 0xff] ^ + Te3[(s0 ) & 0xff] ^ + rk[5]; + t2 = + Te0[(s2 >> 24) ] ^ + Te1[(s3 >> 16) & 0xff] ^ + Te2[(s0 >> 8) & 0xff] ^ + Te3[(s1 ) & 0xff] ^ + rk[6]; + t3 = + Te0[(s3 >> 24) ] ^ + Te1[(s0 >> 16) & 0xff] ^ + Te2[(s1 >> 8) & 0xff] ^ + Te3[(s2 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Te0[(t0 >> 24) ] ^ + Te1[(t1 >> 16) & 0xff] ^ + Te2[(t2 >> 8) & 0xff] ^ + Te3[(t3 ) & 0xff] ^ + rk[0]; + s1 = + Te0[(t1 >> 24) ] ^ + Te1[(t2 >> 16) & 0xff] ^ + Te2[(t3 >> 8) & 0xff] ^ + Te3[(t0 ) & 0xff] ^ + rk[1]; + s2 = + Te0[(t2 >> 24) ] ^ + Te1[(t3 >> 16) & 0xff] ^ + Te2[(t0 >> 8) & 0xff] ^ + Te3[(t1 ) & 0xff] ^ + rk[2]; + s3 = + Te0[(t3 >> 24) ] ^ + Te1[(t0 >> 16) & 0xff] ^ + Te2[(t1 >> 8) & 0xff] ^ + Te3[(t2 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Te4[(t0 >> 24) ] & 0xff000000) ^ + (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(ct , s0); + s1 = + (Te4[(t1 >> 24) ] & 0xff000000) ^ + (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(ct + 4, s1); + s2 = + (Te4[(t2 >> 24) ] & 0xff000000) ^ + (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(ct + 8, s2); + s3 = + (Te4[(t3 >> 24) ] & 0xff000000) ^ + (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Te4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(ct + 12, s3); +} + +void rijndaelDecrypt(const uint32_t rk[/*4*(Nr + 1)*/], int Nr, const uint8_t ct[16], uint8_t pt[16]) { + uint32_t s0, s1, s2, s3, t0, t1, t2, t3; +#ifndef FULL_UNROLL + int r; +#endif /* ?FULL_UNROLL */ + + /* + * map byte array block to cipher state + * and add initial round key: + */ + s0 = GETU32(ct ) ^ rk[0]; + s1 = GETU32(ct + 4) ^ rk[1]; + s2 = GETU32(ct + 8) ^ rk[2]; + s3 = GETU32(ct + 12) ^ rk[3]; +#ifdef FULL_UNROLL + /* round 1: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7]; + /* round 2: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11]; + /* round 3: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15]; + /* round 4: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19]; + /* round 5: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23]; + /* round 6: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27]; + /* round 7: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31]; + /* round 8: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35]; + /* round 9: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39]; + if (Nr > 10) { + /* round 10: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43]; + /* round 11: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47]; + if (Nr > 12) { + /* round 12: */ + s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48]; + s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49]; + s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50]; + s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51]; + /* round 13: */ + t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52]; + t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53]; + t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54]; + t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55]; + } + } + rk += Nr << 2; +#else /* !FULL_UNROLL */ + /* + * Nr - 1 full rounds: + */ + r = Nr >> 1; + for (;;) { + t0 = + Td0[(s0 >> 24) ] ^ + Td1[(s3 >> 16) & 0xff] ^ + Td2[(s2 >> 8) & 0xff] ^ + Td3[(s1 ) & 0xff] ^ + rk[4]; + t1 = + Td0[(s1 >> 24) ] ^ + Td1[(s0 >> 16) & 0xff] ^ + Td2[(s3 >> 8) & 0xff] ^ + Td3[(s2 ) & 0xff] ^ + rk[5]; + t2 = + Td0[(s2 >> 24) ] ^ + Td1[(s1 >> 16) & 0xff] ^ + Td2[(s0 >> 8) & 0xff] ^ + Td3[(s3 ) & 0xff] ^ + rk[6]; + t3 = + Td0[(s3 >> 24) ] ^ + Td1[(s2 >> 16) & 0xff] ^ + Td2[(s1 >> 8) & 0xff] ^ + Td3[(s0 ) & 0xff] ^ + rk[7]; + + rk += 8; + if (--r == 0) { + break; + } + + s0 = + Td0[(t0 >> 24) ] ^ + Td1[(t3 >> 16) & 0xff] ^ + Td2[(t2 >> 8) & 0xff] ^ + Td3[(t1 ) & 0xff] ^ + rk[0]; + s1 = + Td0[(t1 >> 24) ] ^ + Td1[(t0 >> 16) & 0xff] ^ + Td2[(t3 >> 8) & 0xff] ^ + Td3[(t2 ) & 0xff] ^ + rk[1]; + s2 = + Td0[(t2 >> 24) ] ^ + Td1[(t1 >> 16) & 0xff] ^ + Td2[(t0 >> 8) & 0xff] ^ + Td3[(t3 ) & 0xff] ^ + rk[2]; + s3 = + Td0[(t3 >> 24) ] ^ + Td1[(t2 >> 16) & 0xff] ^ + Td2[(t1 >> 8) & 0xff] ^ + Td3[(t0 ) & 0xff] ^ + rk[3]; + } +#endif /* ?FULL_UNROLL */ + /* + * apply last round and + * map cipher state to byte array block: + */ + s0 = + (Td4[(t0 >> 24) ] & 0xff000000) ^ + (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t1 ) & 0xff] & 0x000000ff) ^ + rk[0]; + PUTU32(pt , s0); + s1 = + (Td4[(t1 >> 24) ] & 0xff000000) ^ + (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t2 ) & 0xff] & 0x000000ff) ^ + rk[1]; + PUTU32(pt + 4, s1); + s2 = + (Td4[(t2 >> 24) ] & 0xff000000) ^ + (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t3 ) & 0xff] & 0x000000ff) ^ + rk[2]; + PUTU32(pt + 8, s2); + s3 = + (Td4[(t3 >> 24) ] & 0xff000000) ^ + (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ + (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ + (Td4[(t0 ) & 0xff] & 0x000000ff) ^ + rk[3]; + PUTU32(pt + 12, s3); +} diff --git a/crypto/heimdal/lib/hcrypto/rnd_keys.c b/crypto/heimdal/lib/hcrypto/rnd_keys.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rnd_keys.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 1995, 1996, 1997, 1999 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#define HC_DEPRECATED + +#ifdef KRB5 +#include +#endif + +#include +#include + +#undef __attribute__ +#define __attribute__(X) + +void HC_DEPRECATED +DES_rand_data(void *outdata, int size) +{ + RAND_bytes(outdata, size); +} + +void HC_DEPRECATED +DES_generate_random_block(DES_cblock *block) +{ + RAND_bytes(block, sizeof(*block)); +} + +#define DES_rand_data_key hc_DES_rand_data_key + +void HC_DEPRECATED +DES_rand_data_key(DES_cblock *key); + +/* + * Generate a random DES key. + */ + +void HC_DEPRECATED +DES_rand_data_key(DES_cblock *key) +{ + DES_new_random_key(key); +} + +void HC_DEPRECATED +DES_set_sequence_number(void *ll) +{ +} + +void HC_DEPRECATED +DES_set_random_generator_seed(DES_cblock *seed) +{ + RAND_seed(seed, sizeof(*seed)); +} + +/** + * Generate a random des key using a random block, fixup parity and + * skip weak keys. + * + * @param key is set to a random key. + * + * @return 0 on success, non zero on random number generator failure. + * + * @ingroup hcrypto_des + */ + +int HC_DEPRECATED +DES_new_random_key(DES_cblock *key) +{ + do { + if (RAND_bytes(key, sizeof(*key)) != 1) + return 1; + DES_set_odd_parity(key); + } while(DES_is_weak_key(key)); + + return(0); +} + +/** + * Seed the random number generator. Deprecated, use @ref page_rand + * + * @param seed a seed to seed that random number generate with. + * + * @ingroup hcrypto_des + */ + +void HC_DEPRECATED +DES_init_random_number_generator(DES_cblock *seed) +{ + RAND_seed(seed, sizeof(*seed)); +} + +/** + * Generate a random key, deprecated since it doesn't return an error + * code, use DES_new_random_key(). + * + * @param key is set to a random key. + * + * @ingroup hcrypto_des + */ + +void HC_DEPRECATED +DES_random_key(DES_cblock *key) +{ + if (DES_new_random_key(key)) + abort(); +} diff --git a/crypto/heimdal/lib/hcrypto/rsa-gmp.c b/crypto/heimdal/lib/hcrypto/rsa-gmp.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rsa-gmp.c @@ -0,0 +1,584 @@ +/* + * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#ifdef HAVE_GMP + +#include + +static void +BN2mpz(mpz_t s, const BIGNUM *bn) +{ + size_t len; + void *p; + + len = BN_num_bytes(bn); + p = malloc(len); + BN_bn2bin(bn, p); + mpz_init(s); + mpz_import(s, len, 1, 1, 1, 0, p); + + free(p); +} + + +static BIGNUM * +mpz2BN(mpz_t s) +{ + size_t size; + BIGNUM *bn; + void *p; + + mpz_export(NULL, &size, 1, 1, 1, 0, s); + p = malloc(size); + if (p == NULL && size != 0) + return NULL; + mpz_export(p, &size, 1, 1, 1, 0, s); + bn = BN_bin2bn(p, size, NULL); + free(p); + return bn; +} + +static int +rsa_private_calculate(mpz_t in, mpz_t p, mpz_t q, + mpz_t dmp1, mpz_t dmq1, mpz_t iqmp, + mpz_t out) +{ + mpz_t vp, vq, u; + mpz_init(vp); mpz_init(vq); mpz_init(u); + + /* vq = c ^ (d mod (q - 1)) mod q */ + /* vp = c ^ (d mod (p - 1)) mod p */ + mpz_fdiv_r(vp, in, p); + mpz_powm(vp, vp, dmp1, p); + mpz_fdiv_r(vq, in, q); + mpz_powm(vq, vq, dmq1, q); + + /* C2 = 1/q mod p (iqmp) */ + /* u = (vp - vq)C2 mod p. */ + mpz_sub(u, vp, vq); +#if 0 + if (mp_int_compare_zero(&u) < 0) + mp_int_add(&u, p, &u); +#endif + mpz_mul(u, iqmp, u); + mpz_fdiv_r(u, u, p); + + /* c ^ d mod n = vq + u q */ + mpz_mul(u, q, u); + mpz_add(out, u, vq); + + mpz_clear(vp); + mpz_clear(vq); + mpz_clear(u); + + return 0; +} + +/* + * + */ + +static int +gmp_rsa_public_encrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p, *p0; + size_t size, padlen; + mpz_t enc, dec, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + size = RSA_size(rsa); + + if (size < RSA_PKCS1_PADDING_SIZE || size - RSA_PKCS1_PADDING_SIZE < flen) + return -2; + + BN2mpz(n, rsa->n); + BN2mpz(e, rsa->e); + + p = p0 = malloc(size - 1); + if (p0 == NULL) { + mpz_clear(e); + mpz_clear(n); + return -3; + } + + padlen = size - flen - 3; + assert(padlen >= 8); + + *p++ = 2; + if (RAND_bytes(p, padlen) != 1) { + mpz_clear(e); + mpz_clear(n); + free(p0); + return -4; + } + while(padlen) { + if (*p == 0) + *p = 1; + padlen--; + p++; + } + *p++ = 0; + memcpy(p, from, flen); + p += flen; + assert((p - p0) == size - 1); + + mpz_init(enc); + mpz_init(dec); + mpz_import(dec, size - 1, 1, 1, 1, 0, p0); + free(p0); + + mpz_powm(enc, dec, e, n); + + mpz_clear(dec); + mpz_clear(e); + mpz_clear(n); + { + size_t ssize; + mpz_export(to, &ssize, 1, 1, 1, 0, enc); + assert(size >= ssize); + size = ssize; + } + mpz_clear(enc); + + return size; +} + +static int +gmp_rsa_public_decrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p; + size_t size; + mpz_t s, us, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + if (flen > RSA_size(rsa)) + return -2; + + BN2mpz(n, rsa->n); + BN2mpz(e, rsa->e); + +#if 0 + /* Check that the exponent is larger then 3 */ + if (mp_int_compare_value(&e, 3) <= 0) { + mp_int_clear(&n); + mp_int_clear(&e); + return -3; + } +#endif + + mpz_init(s); + mpz_init(us); + mpz_import(s, flen, 1, 1, 1, 0, rk_UNCONST(from)); + + if (mpz_cmp(s, n) >= 0) { + mpz_clear(n); + mpz_clear(e); + return -4; + } + + mpz_powm(us, s, e, n); + + mpz_clear(s); + mpz_clear(n); + mpz_clear(e); + + p = to; + + mpz_export(p, &size, 1, 1, 1, 0, us); + assert(size <= RSA_size(rsa)); + + mpz_clear(us); + + /* head zero was skipped by mp_int_to_unsigned */ + if (*p == 0) + return -6; + if (*p != 1) + return -7; + size--; p++; + while (size && *p == 0xff) { + size--; p++; + } + if (size == 0 || *p != 0) + return -8; + size--; p++; + + memmove(to, p, size); + + return size; +} + +static int +gmp_rsa_private_encrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p, *p0; + size_t size; + mpz_t in, out, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + size = RSA_size(rsa); + + if (size < RSA_PKCS1_PADDING_SIZE || size - RSA_PKCS1_PADDING_SIZE < flen) + return -2; + + p0 = p = malloc(size); + *p++ = 0; + *p++ = 1; + memset(p, 0xff, size - flen - 3); + p += size - flen - 3; + *p++ = 0; + memcpy(p, from, flen); + p += flen; + assert((p - p0) == size); + + BN2mpz(n, rsa->n); + BN2mpz(e, rsa->e); + + mpz_init(in); + mpz_init(out); + mpz_import(in, size, 1, 1, 1, 0, p0); + free(p0); + +#if 0 + if(mp_int_compare_zero(&in) < 0 || + mp_int_compare(&in, &n) >= 0) { + size = 0; + goto out; + } +#endif + + if (rsa->p && rsa->q && rsa->dmp1 && rsa->dmq1 && rsa->iqmp) { + mpz_t p, q, dmp1, dmq1, iqmp; + + BN2mpz(p, rsa->p); + BN2mpz(q, rsa->q); + BN2mpz(dmp1, rsa->dmp1); + BN2mpz(dmq1, rsa->dmq1); + BN2mpz(iqmp, rsa->iqmp); + + rsa_private_calculate(in, p, q, dmp1, dmq1, iqmp, out); + + mpz_clear(p); + mpz_clear(q); + mpz_clear(dmp1); + mpz_clear(dmq1); + mpz_clear(iqmp); + } else { + mpz_t d; + + BN2mpz(d, rsa->d); + mpz_powm(out, in, d, n); + mpz_clear(d); + } + + { + size_t ssize; + mpz_export(to, &ssize, 1, 1, 1, 0, out); + assert(size >= ssize); + size = ssize; + } + + mpz_clear(e); + mpz_clear(n); + mpz_clear(in); + mpz_clear(out); + + return size; +} + +static int +gmp_rsa_private_decrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *ptr; + size_t size; + mpz_t in, out, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + size = RSA_size(rsa); + if (flen > size) + return -2; + + mpz_init(in); + mpz_init(out); + + BN2mpz(n, rsa->n); + BN2mpz(e, rsa->e); + + mpz_import(in, flen, 1, 1, 1, 0, from); + + if(mpz_cmp_ui(in, 0) < 0 || + mpz_cmp(in, n) >= 0) { + size = 0; + goto out; + } + + if (rsa->p && rsa->q && rsa->dmp1 && rsa->dmq1 && rsa->iqmp) { + mpz_t p, q, dmp1, dmq1, iqmp; + + BN2mpz(p, rsa->p); + BN2mpz(q, rsa->q); + BN2mpz(dmp1, rsa->dmp1); + BN2mpz(dmq1, rsa->dmq1); + BN2mpz(iqmp, rsa->iqmp); + + rsa_private_calculate(in, p, q, dmp1, dmq1, iqmp, out); + + mpz_clear(p); + mpz_clear(q); + mpz_clear(dmp1); + mpz_clear(dmq1); + mpz_clear(iqmp); + } else { + mpz_t d; + +#if 0 + if(mp_int_compare_zero(&in) < 0 || + mp_int_compare(&in, &n) >= 0) + return MP_RANGE; +#endif + + BN2mpz(d, rsa->d); + mpz_powm(out, in, d, n); + mpz_clear(d); + } + + ptr = to; + { + size_t ssize; + mpz_export(ptr, &ssize, 1, 1, 1, 0, out); + assert(size >= ssize); + size = ssize; + } + + /* head zero was skipped by mp_int_to_unsigned */ + if (*ptr != 2) + return -3; + size--; ptr++; + while (size && *ptr != 0) { + size--; ptr++; + } + if (size == 0) + return -4; + size--; ptr++; + + memmove(to, ptr, size); + +out: + mpz_clear(e); + mpz_clear(n); + mpz_clear(in); + mpz_clear(out); + + return size; +} + +static int +random_num(mpz_t num, size_t len) +{ + unsigned char *p; + + len = (len + 7) / 8; + p = malloc(len); + if (p == NULL) + return 1; + if (RAND_bytes(p, len) != 1) { + free(p); + return 1; + } + mpz_import(num, len, 1, 1, 1, 0, p); + free(p); + return 0; +} + + +static int +gmp_rsa_generate_key(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) +{ + mpz_t el, p, q, n, d, dmp1, dmq1, iqmp, t1, t2, t3; + int counter, ret; + + if (bits < 789) + return -1; + + ret = -1; + + mpz_init(el); + mpz_init(p); + mpz_init(q); + mpz_init(n); + mpz_init(d); + mpz_init(dmp1); + mpz_init(dmq1); + mpz_init(iqmp); + mpz_init(t1); + mpz_init(t2); + mpz_init(t3); + + BN2mpz(el, e); + + /* generate p and q so that p != q and bits(pq) ~ bits */ + + counter = 0; + do { + BN_GENCB_call(cb, 2, counter++); + random_num(p, bits / 2 + 1); + mpz_nextprime(p, p); + + mpz_sub_ui(t1, p, 1); + mpz_gcd(t2, t1, el); + } while(mpz_cmp_ui(t2, 1) != 0); + + BN_GENCB_call(cb, 3, 0); + + counter = 0; + do { + BN_GENCB_call(cb, 2, counter++); + random_num(q, bits / 2 + 1); + mpz_nextprime(q, q); + + mpz_sub_ui(t1, q, 1); + mpz_gcd(t2, t1, el); + } while(mpz_cmp_ui(t2, 1) != 0); + + /* make p > q */ + if (mpz_cmp(p, q) < 0) + mpz_swap(p, q); + + BN_GENCB_call(cb, 3, 1); + + /* calculate n, n = p * q */ + mpz_mul(n, p, q); + + /* calculate d, d = 1/e mod (p - 1)(q - 1) */ + mpz_sub_ui(t1, p, 1); + mpz_sub_ui(t2, q, 1); + mpz_mul(t3, t1, t2); + mpz_invert(d, el, t3); + + /* calculate dmp1 dmp1 = d mod (p-1) */ + mpz_mod(dmp1, d, t1); + /* calculate dmq1 dmq1 = d mod (q-1) */ + mpz_mod(dmq1, d, t2); + /* calculate iqmp iqmp = 1/q mod p */ + mpz_invert(iqmp, q, p); + + /* fill in RSA key */ + + rsa->e = mpz2BN(el); + rsa->p = mpz2BN(p); + rsa->q = mpz2BN(q); + rsa->n = mpz2BN(n); + rsa->d = mpz2BN(d); + rsa->dmp1 = mpz2BN(dmp1); + rsa->dmq1 = mpz2BN(dmq1); + rsa->iqmp = mpz2BN(iqmp); + + ret = 1; + + mpz_clear(el); + mpz_clear(p); + mpz_clear(q); + mpz_clear(n); + mpz_clear(d); + mpz_clear(dmp1); + mpz_clear(dmq1); + mpz_clear(iqmp); + mpz_clear(t1); + mpz_clear(t2); + mpz_clear(t3); + + return ret; +} + +static int +gmp_rsa_init(RSA *rsa) +{ + return 1; +} + +static int +gmp_rsa_finish(RSA *rsa) +{ + return 1; +} + +const RSA_METHOD hc_rsa_gmp_method = { + "hcrypto GMP RSA", + gmp_rsa_public_encrypt, + gmp_rsa_public_decrypt, + gmp_rsa_private_encrypt, + gmp_rsa_private_decrypt, + NULL, + NULL, + gmp_rsa_init, + gmp_rsa_finish, + 0, + NULL, + NULL, + NULL, + gmp_rsa_generate_key +}; + +#endif /* HAVE_GMP */ + +/** + * RSA implementation using Gnu Multipresistion Library. + */ + +const RSA_METHOD * +RSA_gmp_method(void) +{ +#ifdef HAVE_GMP + return &hc_rsa_gmp_method; +#else + return NULL; +#endif +} diff --git a/crypto/heimdal/lib/hcrypto/rsa-ltm.c b/crypto/heimdal/lib/hcrypto/rsa-ltm.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rsa-ltm.c @@ -0,0 +1,640 @@ +/* + * Copyright (c) 2006 - 2007, 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#include "tommath.h" + +static int +random_num(mp_int *num, size_t len) +{ + unsigned char *p; + + len = (len + 7) / 8; + p = malloc(len); + if (p == NULL) + return 1; + if (RAND_bytes(p, len) != 1) { + free(p); + return 1; + } + mp_read_unsigned_bin(num, p, len); + free(p); + return 0; +} + +static void +BN2mpz(mp_int *s, const BIGNUM *bn) +{ + size_t len; + void *p; + + len = BN_num_bytes(bn); + p = malloc(len); + BN_bn2bin(bn, p); + mp_read_unsigned_bin(s, p, len); + free(p); +} + +static void +setup_blind(mp_int *n, mp_int *b, mp_int *bi) +{ + random_num(b, mp_count_bits(n)); + mp_mod(b, n, b); + mp_invmod(b, n, bi); +} + +static void +blind(mp_int *in, mp_int *b, mp_int *e, mp_int *n) +{ + mp_int t1; + mp_init(&t1); + /* in' = (in * b^e) mod n */ + mp_exptmod(b, e, n, &t1); + mp_mul(&t1, in, in); + mp_mod(in, n, in); + mp_clear(&t1); +} + +static void +unblind(mp_int *out, mp_int *bi, mp_int *n) +{ + /* out' = (out * 1/b) mod n */ + mp_mul(out, bi, out); + mp_mod(out, n, out); +} + +static int +ltm_rsa_private_calculate(mp_int * in, mp_int * p, mp_int * q, + mp_int * dmp1, mp_int * dmq1, mp_int * iqmp, + mp_int * out) +{ + mp_int vp, vq, u; + + mp_init_multi(&vp, &vq, &u, NULL); + + /* vq = c ^ (d mod (q - 1)) mod q */ + /* vp = c ^ (d mod (p - 1)) mod p */ + mp_mod(in, p, &u); + mp_exptmod(&u, dmp1, p, &vp); + mp_mod(in, q, &u); + mp_exptmod(&u, dmq1, q, &vq); + + /* C2 = 1/q mod p (iqmp) */ + /* u = (vp - vq)C2 mod p. */ + mp_sub(&vp, &vq, &u); + if (mp_isneg(&u)) + mp_add(&u, p, &u); + mp_mul(&u, iqmp, &u); + mp_mod(&u, p, &u); + + /* c ^ d mod n = vq + u q */ + mp_mul(&u, q, &u); + mp_add(&u, &vq, out); + + mp_clear_multi(&vp, &vq, &u, NULL); + + return 0; +} + +/* + * + */ + +static int +ltm_rsa_public_encrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p, *p0; + int res; + size_t size, padlen; + mp_int enc, dec, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + mp_init_multi(&n, &e, &enc, &dec, NULL); + + size = RSA_size(rsa); + + if (size < RSA_PKCS1_PADDING_SIZE || size - RSA_PKCS1_PADDING_SIZE < flen) { + mp_clear_multi(&n, &e, &enc, &dec, NULL); + return -2; + } + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + + if (mp_cmp_d(&e, 3) == MP_LT) { + mp_clear_multi(&e, &n, &enc, &dec, NULL); + return -2; + } + + p = p0 = malloc(size - 1); + if (p0 == NULL) { + mp_clear_multi(&e, &n, &enc, &dec, NULL); + return -3; + } + + padlen = size - flen - 3; + + *p++ = 2; + if (RAND_bytes(p, padlen) != 1) { + mp_clear_multi(&e, &n, &enc, &dec, NULL); + free(p0); + return -4; + } + while(padlen) { + if (*p == 0) + *p = 1; + padlen--; + p++; + } + *p++ = 0; + memcpy(p, from, flen); + p += flen; + assert((p - p0) == size - 1); + + mp_read_unsigned_bin(&dec, p0, size - 1); + free(p0); + + res = mp_exptmod(&dec, &e, &n, &enc); + + mp_clear_multi(&dec, &e, &n, NULL); + + if (res != 0) { + mp_clear(&enc); + return -4; + } + + { + size_t ssize; + ssize = mp_unsigned_bin_size(&enc); + assert(size >= ssize); + mp_to_unsigned_bin(&enc, to); + size = ssize; + } + mp_clear(&enc); + + return size; +} + +static int +ltm_rsa_public_decrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p; + int res; + size_t size; + mp_int s, us, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + if (flen > RSA_size(rsa)) + return -2; + + mp_init_multi(&e, &n, &s, &us, NULL); + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + + if (mp_cmp_d(&e, 3) == MP_LT) { + mp_clear_multi(&e, &n, &s, &us, NULL); + return -3; + } + + mp_read_unsigned_bin(&s, rk_UNCONST(from), flen); + + if (mp_cmp(&s, &n) >= 0) { + mp_clear_multi(&e, &n, &s, &us, NULL); + return -4; + } + + res = mp_exptmod(&s, &e, &n, &us); + + mp_clear_multi(&e, &n, &s, NULL); + + if (res != 0) { + mp_clear(&us); + return -5; + } + p = to; + + + size = mp_unsigned_bin_size(&us); + assert(size <= RSA_size(rsa)); + mp_to_unsigned_bin(&us, p); + + mp_clear(&us); + + /* head zero was skipped by mp_to_unsigned_bin */ + if (*p == 0) + return -6; + if (*p != 1) + return -7; + size--; p++; + while (size && *p == 0xff) { + size--; p++; + } + if (size == 0 || *p != 0) + return -8; + size--; p++; + + memmove(to, p, size); + + return size; +} + +static int +ltm_rsa_private_encrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *ptr, *ptr0; + int res; + int size; + mp_int in, out, n, e; + mp_int bi, b; + int blinding = (rsa->flags & RSA_FLAG_NO_BLINDING) == 0; + int do_unblind = 0; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + mp_init_multi(&e, &n, &in, &out, &b, &bi, NULL); + + size = RSA_size(rsa); + + if (size < RSA_PKCS1_PADDING_SIZE || size - RSA_PKCS1_PADDING_SIZE < flen) + return -2; + + ptr0 = ptr = malloc(size); + *ptr++ = 0; + *ptr++ = 1; + memset(ptr, 0xff, size - flen - 3); + ptr += size - flen - 3; + *ptr++ = 0; + memcpy(ptr, from, flen); + ptr += flen; + assert((ptr - ptr0) == size); + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + + if (mp_cmp_d(&e, 3) == MP_LT) { + size = -3; + goto out; + } + + mp_read_unsigned_bin(&in, ptr0, size); + free(ptr0); + + if(mp_isneg(&in) || mp_cmp(&in, &n) >= 0) { + size = -3; + goto out; + } + + if (blinding) { + setup_blind(&n, &b, &bi); + blind(&in, &b, &e, &n); + do_unblind = 1; + } + + if (rsa->p && rsa->q && rsa->dmp1 && rsa->dmq1 && rsa->iqmp) { + mp_int p, q, dmp1, dmq1, iqmp; + + mp_init_multi(&p, &q, &dmp1, &dmq1, &iqmp, NULL); + + BN2mpz(&p, rsa->p); + BN2mpz(&q, rsa->q); + BN2mpz(&dmp1, rsa->dmp1); + BN2mpz(&dmq1, rsa->dmq1); + BN2mpz(&iqmp, rsa->iqmp); + + res = ltm_rsa_private_calculate(&in, &p, &q, &dmp1, &dmq1, &iqmp, &out); + + mp_clear_multi(&p, &q, &dmp1, &dmq1, &iqmp, NULL); + + if (res != 0) { + size = -4; + goto out; + } + } else { + mp_int d; + + BN2mpz(&d, rsa->d); + res = mp_exptmod(&in, &d, &n, &out); + mp_clear(&d); + if (res != 0) { + size = -5; + goto out; + } + } + + if (do_unblind) + unblind(&out, &bi, &n); + + if (size > 0) { + size_t ssize; + ssize = mp_unsigned_bin_size(&out); + assert(size >= ssize); + mp_to_unsigned_bin(&out, to); + size = ssize; + } + + out: + mp_clear_multi(&e, &n, &in, &out, &b, &bi, NULL); + + return size; +} + +static int +ltm_rsa_private_decrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *ptr; + int res, size; + mp_int in, out, n, e, b, bi; + int blinding = (rsa->flags & RSA_FLAG_NO_BLINDING) == 0; + int do_unblind = 0; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + size = RSA_size(rsa); + if (flen > size) + return -2; + + mp_init_multi(&in, &n, &e, &out, &b, &bi, NULL); + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + + if (mp_cmp_d(&e, 3) == MP_LT) { + size = -2; + goto out; + } + + mp_read_unsigned_bin(&in, rk_UNCONST(from), flen); + + if(mp_isneg(&in) || mp_cmp(&in, &n) >= 0) { + size = -2; + goto out; + } + + if (blinding) { + setup_blind(&n, &b, &bi); + blind(&in, &b, &e, &n); + do_unblind = 1; + } + + if (rsa->p && rsa->q && rsa->dmp1 && rsa->dmq1 && rsa->iqmp) { + mp_int p, q, dmp1, dmq1, iqmp; + + mp_init_multi(&p, &q, &dmp1, &dmq1, &iqmp, NULL); + + BN2mpz(&p, rsa->p); + BN2mpz(&q, rsa->q); + BN2mpz(&dmp1, rsa->dmp1); + BN2mpz(&dmq1, rsa->dmq1); + BN2mpz(&iqmp, rsa->iqmp); + + res = ltm_rsa_private_calculate(&in, &p, &q, &dmp1, &dmq1, &iqmp, &out); + + mp_clear_multi(&p, &q, &dmp1, &dmq1, &iqmp, NULL); + + if (res != 0) { + size = -3; + goto out; + } + + } else { + mp_int d; + + if(mp_isneg(&in) || mp_cmp(&in, &n) >= 0) + return -4; + + BN2mpz(&d, rsa->d); + res = mp_exptmod(&in, &d, &n, &out); + mp_clear(&d); + if (res != 0) { + size = -5; + goto out; + } + } + + if (do_unblind) + unblind(&out, &bi, &n); + + ptr = to; + { + size_t ssize; + ssize = mp_unsigned_bin_size(&out); + assert(size >= ssize); + mp_to_unsigned_bin(&out, ptr); + size = ssize; + } + + /* head zero was skipped by mp_int_to_unsigned */ + if (*ptr != 2) { + size = -6; + goto out; + } + size--; ptr++; + while (size && *ptr != 0) { + size--; ptr++; + } + if (size == 0) + return -7; + size--; ptr++; + + memmove(to, ptr, size); + + out: + mp_clear_multi(&e, &n, &in, &out, &b, &bi, NULL); + + return size; +} + +static BIGNUM * +mpz2BN(mp_int *s) +{ + size_t size; + BIGNUM *bn; + void *p; + + size = mp_unsigned_bin_size(s); + p = malloc(size); + if (p == NULL && size != 0) + return NULL; + + mp_to_unsigned_bin(s, p); + + bn = BN_bin2bn(p, size, NULL); + free(p); + return bn; +} + +#define CHECK(f, v) if ((f) != (v)) { goto out; } + +static int +ltm_rsa_generate_key(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) +{ + mp_int el, p, q, n, d, dmp1, dmq1, iqmp, t1, t2, t3; + int counter, ret, bitsp; + + if (bits < 789) + return -1; + + bitsp = (bits + 1) / 2; + + ret = -1; + + mp_init_multi(&el, &p, &q, &n, &d, + &dmp1, &dmq1, &iqmp, + &t1, &t2, &t3, NULL); + + BN2mpz(&el, e); + + /* generate p and q so that p != q and bits(pq) ~ bits */ + counter = 0; + do { + BN_GENCB_call(cb, 2, counter++); + CHECK(random_num(&p, bitsp), 0); + CHECK(mp_find_prime(&p,128), MP_YES); + + mp_sub_d(&p, 1, &t1); + mp_gcd(&t1, &el, &t2); + } while(mp_cmp_d(&t2, 1) != 0); + + BN_GENCB_call(cb, 3, 0); + + counter = 0; + do { + BN_GENCB_call(cb, 2, counter++); + CHECK(random_num(&q, bits - bitsp), 0); + CHECK(mp_find_prime(&q,128), MP_YES); + + if (mp_cmp(&p, &q) == 0) /* don't let p and q be the same */ + continue; + + mp_sub_d(&q, 1, &t1); + mp_gcd(&t1, &el, &t2); + } while(mp_cmp_d(&t2, 1) != 0); + + /* make p > q */ + if (mp_cmp(&p, &q) < 0) { + mp_int c; + c = p; + p = q; + q = c; + } + + BN_GENCB_call(cb, 3, 1); + + /* calculate n, n = p * q */ + mp_mul(&p, &q, &n); + + /* calculate d, d = 1/e mod (p - 1)(q - 1) */ + mp_sub_d(&p, 1, &t1); + mp_sub_d(&q, 1, &t2); + mp_mul(&t1, &t2, &t3); + mp_invmod(&el, &t3, &d); + + /* calculate dmp1 dmp1 = d mod (p-1) */ + mp_mod(&d, &t1, &dmp1); + /* calculate dmq1 dmq1 = d mod (q-1) */ + mp_mod(&d, &t2, &dmq1); + /* calculate iqmp iqmp = 1/q mod p */ + mp_invmod(&q, &p, &iqmp); + + /* fill in RSA key */ + + rsa->e = mpz2BN(&el); + rsa->p = mpz2BN(&p); + rsa->q = mpz2BN(&q); + rsa->n = mpz2BN(&n); + rsa->d = mpz2BN(&d); + rsa->dmp1 = mpz2BN(&dmp1); + rsa->dmq1 = mpz2BN(&dmq1); + rsa->iqmp = mpz2BN(&iqmp); + + ret = 1; + +out: + mp_clear_multi(&el, &p, &q, &n, &d, + &dmp1, &dmq1, &iqmp, + &t1, &t2, &t3, NULL); + + return ret; +} + +static int +ltm_rsa_init(RSA *rsa) +{ + return 1; +} + +static int +ltm_rsa_finish(RSA *rsa) +{ + return 1; +} + +const RSA_METHOD hc_rsa_ltm_method = { + "hcrypto ltm RSA", + ltm_rsa_public_encrypt, + ltm_rsa_public_decrypt, + ltm_rsa_private_encrypt, + ltm_rsa_private_decrypt, + NULL, + NULL, + ltm_rsa_init, + ltm_rsa_finish, + 0, + NULL, + NULL, + NULL, + ltm_rsa_generate_key +}; + +const RSA_METHOD * +RSA_ltm_method(void) +{ + return &hc_rsa_ltm_method; +} diff --git a/crypto/heimdal/lib/hcrypto/rsa-tfm.c b/crypto/heimdal/lib/hcrypto/rsa-tfm.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rsa-tfm.c @@ -0,0 +1,573 @@ +/* + * Copyright (c) 2006 - 2007, 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#ifdef USE_HCRYPTO_TFM + +#include "tfm.h" + +static void +BN2mpz(fp_int *s, const BIGNUM *bn) +{ + size_t len; + void *p; + + fp_init(s); + + len = BN_num_bytes(bn); + p = malloc(len); + BN_bn2bin(bn, p); + fp_read_unsigned_bin(s, p, len); + free(p); +} + +static int +tfm_rsa_private_calculate(fp_int * in, fp_int * p, fp_int * q, + fp_int * dmp1, fp_int * dmq1, fp_int * iqmp, + fp_int * out) +{ + fp_int vp, vq, u; + + fp_init_multi(&vp, &vq, &u, NULL); + + /* vq = c ^ (d mod (q - 1)) mod q */ + /* vp = c ^ (d mod (p - 1)) mod p */ + fp_mod(in, p, &u); + fp_exptmod(&u, dmp1, p, &vp); + fp_mod(in, q, &u); + fp_exptmod(&u, dmq1, q, &vq); + + /* C2 = 1/q mod p (iqmp) */ + /* u = (vp - vq)C2 mod p. */ + fp_sub(&vp, &vq, &u); + if (fp_isneg(&u)) + fp_add(&u, p, &u); + fp_mul(&u, iqmp, &u); + fp_mod(&u, p, &u); + + /* c ^ d mod n = vq + u q */ + fp_mul(&u, q, &u); + fp_add(&u, &vq, out); + + fp_zero_multi(&vp, &vq, &u, NULL); + + return 0; +} + +/* + * + */ + +static int +tfm_rsa_public_encrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p, *p0; + int res; + size_t size, padlen; + fp_int enc, dec, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + size = RSA_size(rsa); + + if (size < RSA_PKCS1_PADDING_SIZE || size - RSA_PKCS1_PADDING_SIZE < flen) + return -2; + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + + p = p0 = malloc(size - 1); + if (p0 == NULL) { + fp_zero_multi(&e, &n, NULL); + return -3; + } + + padlen = size - flen - 3; + + *p++ = 2; + if (RAND_bytes(p, padlen) != 1) { + fp_zero_multi(&e, &n, NULL); + free(p0); + return -4; + } + while(padlen) { + if (*p == 0) + *p = 1; + padlen--; + p++; + } + *p++ = 0; + memcpy(p, from, flen); + p += flen; + assert((p - p0) == size - 1); + + fp_init_multi(&enc, &dec, NULL); + fp_read_unsigned_bin(&dec, p0, size - 1); + free(p0); + + res = fp_exptmod(&dec, &e, &n, &enc); + + fp_zero_multi(&dec, &e, &n, NULL); + + if (res != 0) + return -4; + + { + size_t ssize; + ssize = fp_unsigned_bin_size(&enc); + assert(size >= ssize); + fp_to_unsigned_bin(&enc, to); + size = ssize; + } + fp_zero(&enc); + + return size; +} + +static int +tfm_rsa_public_decrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p; + int res; + size_t size; + fp_int s, us, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + if (flen > RSA_size(rsa)) + return -2; + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + +#if 0 + /* Check that the exponent is larger then 3 */ + if (mp_int_compare_value(&e, 3) <= 0) { + fp_zero_multi(&e, &n, NULL); + return -3; + } +#endif + + fp_init_multi(&s, &us, NULL); + fp_read_unsigned_bin(&s, rk_UNCONST(from), flen); + + if (fp_cmp(&s, &n) >= 0) { + fp_zero_multi(&e, &n, NULL); + return -4; + } + + res = fp_exptmod(&s, &e, &n, &us); + + fp_zero_multi(&s, &e, &n, NULL); + + if (res != 0) + return -5; + p = to; + + + size = fp_unsigned_bin_size(&us); + assert(size <= RSA_size(rsa)); + fp_to_unsigned_bin(&us, p); + + fp_zero(&us); + + /* head zero was skipped by fp_to_unsigned_bin */ + if (*p == 0) + return -6; + if (*p != 1) + return -7; + size--; p++; + while (size && *p == 0xff) { + size--; p++; + } + if (size == 0 || *p != 0) + return -8; + size--; p++; + + memmove(to, p, size); + + return size; +} + +static int +tfm_rsa_private_encrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *p, *p0; + int res; + int size; + fp_int in, out, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + size = RSA_size(rsa); + + if (size < RSA_PKCS1_PADDING_SIZE || size - RSA_PKCS1_PADDING_SIZE < flen) + return -2; + + p0 = p = malloc(size); + *p++ = 0; + *p++ = 1; + memset(p, 0xff, size - flen - 3); + p += size - flen - 3; + *p++ = 0; + memcpy(p, from, flen); + p += flen; + assert((p - p0) == size); + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + + fp_init_multi(&in, &out, NULL); + fp_read_unsigned_bin(&in, p0, size); + free(p0); + + if(fp_isneg(&in) || fp_cmp(&in, &n) >= 0) { + size = -3; + goto out; + } + + if (rsa->p && rsa->q && rsa->dmp1 && rsa->dmq1 && rsa->iqmp) { + fp_int p, q, dmp1, dmq1, iqmp; + + BN2mpz(&p, rsa->p); + BN2mpz(&q, rsa->q); + BN2mpz(&dmp1, rsa->dmp1); + BN2mpz(&dmq1, rsa->dmq1); + BN2mpz(&iqmp, rsa->iqmp); + + res = tfm_rsa_private_calculate(&in, &p, &q, &dmp1, &dmq1, &iqmp, &out); + + fp_zero_multi(&p, &q, &dmp1, &dmq1, &iqmp, NULL); + + if (res != 0) { + size = -4; + goto out; + } + } else { + fp_int d; + + BN2mpz(&d, rsa->d); + res = fp_exptmod(&in, &d, &n, &out); + fp_zero(&d); + if (res != 0) { + size = -5; + goto out; + } + } + + if (size > 0) { + size_t ssize; + ssize = fp_unsigned_bin_size(&out); + assert(size >= ssize); + fp_to_unsigned_bin(&out, to); + size = ssize; + } + + out: + fp_zero_multi(&e, &n, &in, &out, NULL); + + return size; +} + +static int +tfm_rsa_private_decrypt(int flen, const unsigned char* from, + unsigned char* to, RSA* rsa, int padding) +{ + unsigned char *ptr; + int res; + int size; + fp_int in, out, n, e; + + if (padding != RSA_PKCS1_PADDING) + return -1; + + size = RSA_size(rsa); + if (flen > size) + return -2; + + fp_init_multi(&in, &out, NULL); + + BN2mpz(&n, rsa->n); + BN2mpz(&e, rsa->e); + + fp_read_unsigned_bin(&in, rk_UNCONST(from), flen); + + if(fp_isneg(&in) || fp_cmp(&in, &n) >= 0) { + size = -2; + goto out; + } + + if (rsa->p && rsa->q && rsa->dmp1 && rsa->dmq1 && rsa->iqmp) { + fp_int p, q, dmp1, dmq1, iqmp; + + BN2mpz(&p, rsa->p); + BN2mpz(&q, rsa->q); + BN2mpz(&dmp1, rsa->dmp1); + BN2mpz(&dmq1, rsa->dmq1); + BN2mpz(&iqmp, rsa->iqmp); + + res = tfm_rsa_private_calculate(&in, &p, &q, &dmp1, &dmq1, &iqmp, &out); + + fp_zero_multi(&p, &q, &dmp1, &dmq1, &iqmp, NULL); + + if (res != 0) { + size = -3; + goto out; + } + + } else { + fp_int d; + + if(fp_isneg(&in) || fp_cmp(&in, &n) >= 0) + return -4; + + BN2mpz(&d, rsa->d); + res = fp_exptmod(&in, &d, &n, &out); + fp_zero(&d); + if (res != 0) { + size = -5; + goto out; + } + } + + ptr = to; + { + size_t ssize; + ssize = fp_unsigned_bin_size(&out); + assert(size >= ssize); + fp_to_unsigned_bin(&out, ptr); + size = ssize; + } + + /* head zero was skipped by mp_int_to_unsigned */ + if (*ptr != 2) { + size = -6; + goto out; + } + size--; ptr++; + while (size && *ptr != 0) { + size--; ptr++; + } + if (size == 0) + return -7; + size--; ptr++; + + memmove(to, ptr, size); + + out: + fp_zero_multi(&e, &n, &in, &out, NULL); + + return size; +} + +static BIGNUM * +mpz2BN(fp_int *s) +{ + size_t size; + BIGNUM *bn; + void *p; + + size = fp_unsigned_bin_size(s); + p = malloc(size); + if (p == NULL && size != 0) + return NULL; + + fp_to_unsigned_bin(s, p); + + bn = BN_bin2bn(p, size, NULL); + free(p); + return bn; +} + +static int +random_num(fp_int *num, size_t len) +{ + unsigned char *p; + + len = (len + 7) / 8; + p = malloc(len); + if (p == NULL) + return 1; + if (RAND_bytes(p, len) != 1) { + free(p); + return 1; + } + fp_read_unsigned_bin(num, p, len); + free(p); + return 0; +} + +#define CHECK(f, v) if ((f) != (v)) { goto out; } + +static int +tfm_rsa_generate_key(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) +{ + fp_int el, p, q, n, d, dmp1, dmq1, iqmp, t1, t2, t3; + int counter, ret, bitsp; + + if (bits < 789) + return -1; + + bitsp = (bits + 1) / 2; + + ret = -1; + + fp_init_multi(&el, &p, &q, &n, &n, &d, &dmp1, &dmq1, &iqmp, &t1, &t2, &t3, NULL); + + BN2mpz(&el, e); + + /* generate p and q so that p != q and bits(pq) ~ bits */ + counter = 0; + do { + BN_GENCB_call(cb, 2, counter++); + CHECK(random_num(&p, bitsp), 0); + CHECK(fp_find_prime(&p), FP_YES); + + fp_sub_d(&p, 1, &t1); + fp_gcd(&t1, &el, &t2); + } while(fp_cmp_d(&t2, 1) != 0); + + BN_GENCB_call(cb, 3, 0); + + counter = 0; + do { + BN_GENCB_call(cb, 2, counter++); + CHECK(random_num(&q, bits - bitsp), 0); + CHECK(fp_find_prime(&q), FP_YES); + + if (fp_cmp(&p, &q) == 0) /* don't let p and q be the same */ + continue; + + fp_sub_d(&q, 1, &t1); + fp_gcd(&t1, &el, &t2); + } while(fp_cmp_d(&t2, 1) != 0); + + /* make p > q */ + if (fp_cmp(&p, &q) < 0) { + fp_int c; + fp_copy(&p, &c); + fp_copy(&q, &p); + fp_copy(&c, &q); + } + + BN_GENCB_call(cb, 3, 1); + + /* calculate n, n = p * q */ + fp_mul(&p, &q, &n); + + /* calculate d, d = 1/e mod (p - 1)(q - 1) */ + fp_sub_d(&p, 1, &t1); + fp_sub_d(&q, 1, &t2); + fp_mul(&t1, &t2, &t3); + fp_invmod(&el, &t3, &d); + + /* calculate dmp1 dmp1 = d mod (p-1) */ + fp_mod(&d, &t1, &dmp1); + /* calculate dmq1 dmq1 = d mod (q-1) */ + fp_mod(&d, &t2, &dmq1); + /* calculate iqmp iqmp = 1/q mod p */ + fp_invmod(&q, &p, &iqmp); + + /* fill in RSA key */ + + rsa->e = mpz2BN(&el); + rsa->p = mpz2BN(&p); + rsa->q = mpz2BN(&q); + rsa->n = mpz2BN(&n); + rsa->d = mpz2BN(&d); + rsa->dmp1 = mpz2BN(&dmp1); + rsa->dmq1 = mpz2BN(&dmq1); + rsa->iqmp = mpz2BN(&iqmp); + + ret = 1; + +out: + fp_zero_multi(&el, &p, &q, &n, &d, &dmp1, + &dmq1, &iqmp, &t1, &t2, &t3, NULL); + + return ret; +} + +static int +tfm_rsa_init(RSA *rsa) +{ + return 1; +} + +static int +tfm_rsa_finish(RSA *rsa) +{ + return 1; +} + +const RSA_METHOD hc_rsa_tfm_method = { + "hcrypto tfm RSA", + tfm_rsa_public_encrypt, + tfm_rsa_public_decrypt, + tfm_rsa_private_encrypt, + tfm_rsa_private_decrypt, + NULL, + NULL, + tfm_rsa_init, + tfm_rsa_finish, + 0, + NULL, + NULL, + NULL, + tfm_rsa_generate_key +}; + +#endif + +const RSA_METHOD * +RSA_tfm_method(void) +{ +#ifdef USE_HCRYPTO_TFM + return &hc_rsa_tfm_method; +#else + return NULL; +#endif +} + diff --git a/crypto/heimdal/lib/hcrypto/rsa.h b/crypto/heimdal/lib/hcrypto/rsa.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rsa.h @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2006-2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + * $Id$ + */ + +#ifndef _HEIM_RSA_H +#define _HEIM_RSA_H 1 + +/* symbol renaming */ +#define RSA_null_method hc_RSA_null_method +#define RSA_ltm_method hc_RSA_ltm_method +#define RSA_gmp_method hc_RSA_gmp_method +#define RSA_tfm_method hc_RSA_tfm_method +#define RSA_new hc_RSA_new +#define RSA_new_method hc_RSA_new_method +#define RSA_free hc_RSA_free +#define RSA_up_ref hc_RSA_up_ref +#define RSA_set_default_method hc_RSA_set_default_method +#define RSA_get_default_method hc_RSA_get_default_method +#define RSA_set_method hc_RSA_set_method +#define RSA_get_method hc_RSA_get_method +#define RSA_set_app_data hc_RSA_set_app_data +#define RSA_get_app_data hc_RSA_get_app_data +#define RSA_check_key hc_RSA_check_key +#define RSA_size hc_RSA_size +#define RSA_public_encrypt hc_RSA_public_encrypt +#define RSA_public_decrypt hc_RSA_public_decrypt +#define RSA_private_encrypt hc_RSA_private_encrypt +#define RSA_private_decrypt hc_RSA_private_decrypt +#define RSA_sign hc_RSA_sign +#define RSA_verify hc_RSA_verify +#define RSA_generate_key_ex hc_RSA_generate_key_ex +#define d2i_RSAPrivateKey hc_d2i_RSAPrivateKey +#define i2d_RSAPrivateKey hc_i2d_RSAPrivateKey +#define i2d_RSAPublicKey hc_i2d_RSAPublicKey +#define d2i_RSAPublicKey hc_d2i_RSAPublicKey + +#define RSA hc_RSA +#define RSA_METHOD hc_RSA_METHOD + +/* + * + */ + +typedef struct RSA RSA; +typedef struct RSA_METHOD RSA_METHOD; + +#include +#include + +struct RSA_METHOD { + const char *name; + int (*rsa_pub_enc)(int,const unsigned char *, unsigned char *, RSA *,int); + int (*rsa_pub_dec)(int,const unsigned char *, unsigned char *, RSA *,int); + int (*rsa_priv_enc)(int,const unsigned char *, unsigned char *, RSA *,int); + int (*rsa_priv_dec)(int,const unsigned char *, unsigned char *, RSA *,int); + void *rsa_mod_exp; + void *bn_mod_exp; + int (*init)(RSA *rsa); + int (*finish)(RSA *rsa); + int flags; + char *app_data; + int (*rsa_sign)(int, const unsigned char *, unsigned int, + unsigned char *, unsigned int *, const RSA *); + int (*rsa_verify)(int, const unsigned char *, unsigned int, + unsigned char *, unsigned int, const RSA *); + int (*rsa_keygen)(RSA *, int, BIGNUM *, BN_GENCB *); +}; + +struct RSA { + int pad; + long version; + const RSA_METHOD *meth; + void *engine; + BIGNUM *n; + BIGNUM *e; + BIGNUM *d; + BIGNUM *p; + BIGNUM *q; + BIGNUM *dmp1; + BIGNUM *dmq1; + BIGNUM *iqmp; + struct rsa_CRYPTO_EX_DATA { + void *sk; + int dummy; + } ex_data; + int references; + int flags; + void *_method_mod_n; + void *_method_mod_p; + void *_method_mod_q; + + char *bignum_data; + void *blinding; + void *mt_blinding; +}; + +#define RSA_FLAG_NO_BLINDING 0x0080 + +#define RSA_PKCS1_PADDING 1 +#define RSA_PKCS1_OAEP_PADDING 4 +#define RSA_PKCS1_PADDING_SIZE 11 + +/* + * + */ + +const RSA_METHOD *RSA_null_method(void); +const RSA_METHOD *RSA_gmp_method(void); +const RSA_METHOD *RSA_tfm_method(void); +const RSA_METHOD *RSA_ltm_method(void); + +/* + * + */ + +RSA * RSA_new(void); +RSA * RSA_new_method(ENGINE *); +void RSA_free(RSA *); +int RSA_up_ref(RSA *); + +void RSA_set_default_method(const RSA_METHOD *); +const RSA_METHOD * RSA_get_default_method(void); + +const RSA_METHOD * RSA_get_method(const RSA *); +int RSA_set_method(RSA *, const RSA_METHOD *); + +int RSA_set_app_data(RSA *, void *arg); +void * RSA_get_app_data(const RSA *); + +int RSA_check_key(const RSA *); +int RSA_size(const RSA *); + +int RSA_public_encrypt(int,const unsigned char*,unsigned char*,RSA *,int); +int RSA_private_encrypt(int,const unsigned char*,unsigned char*,RSA *,int); +int RSA_public_decrypt(int,const unsigned char*,unsigned char*,RSA *,int); +int RSA_private_decrypt(int,const unsigned char*,unsigned char*,RSA *,int); + +int RSA_sign(int, const unsigned char *, unsigned int, + unsigned char *, unsigned int *, RSA *); +int RSA_verify(int, const unsigned char *, unsigned int, + unsigned char *, unsigned int, RSA *); + +int RSA_generate_key_ex(RSA *, int, BIGNUM *, BN_GENCB *); + +RSA * d2i_RSAPrivateKey(RSA *, const unsigned char **, size_t); +int i2d_RSAPrivateKey(RSA *, unsigned char **); + +int i2d_RSAPublicKey(RSA *, unsigned char **); +RSA * d2i_RSAPublicKey(RSA *, const unsigned char **, size_t); + +#endif /* _HEIM_RSA_H */ diff --git a/crypto/heimdal/lib/hcrypto/rsa.c b/crypto/heimdal/lib/hcrypto/rsa.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/rsa.c @@ -0,0 +1,703 @@ +/* + * Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include + +#include + +#include "common.h" + +/** + * @page page_rsa RSA - public-key cryptography + * + * RSA is named by its inventors (Ron Rivest, Adi Shamir, and Leonard + * Adleman) (published in 1977), patented expired in 21 September 2000. + * + * + * Speed for RSA in seconds + * no key blinding + * 1000 iteration, + * same rsa keys (1024 and 2048) + * operation performed each eteration sign, verify, encrypt, decrypt on a random bit pattern + * + * name 1024 2048 4098 + * ================================= + * gmp: 0.73 6.60 44.80 + * tfm: 2.45 -- -- + * ltm: 3.79 20.74 105.41 (default in hcrypto) + * openssl: 4.04 11.90 82.59 + * cdsa: 15.89 102.89 721.40 + * imath: 40.62 -- -- + * + * See the library functions here: @ref hcrypto_rsa + */ + +/** + * Same as RSA_new_method() using NULL as engine. + * + * @return a newly allocated RSA object. Free with RSA_free(). + * + * @ingroup hcrypto_rsa + */ + +RSA * +RSA_new(void) +{ + return RSA_new_method(NULL); +} + +/** + * Allocate a new RSA object using the engine, if NULL is specified as + * the engine, use the default RSA engine as returned by + * ENGINE_get_default_RSA(). + * + * @param engine Specific what ENGINE RSA provider should be used. + * + * @return a newly allocated RSA object. Free with RSA_free(). + * + * @ingroup hcrypto_rsa + */ + +RSA * +RSA_new_method(ENGINE *engine) +{ + RSA *rsa; + + rsa = calloc(1, sizeof(*rsa)); + if (rsa == NULL) + return NULL; + + rsa->references = 1; + + if (engine) { + ENGINE_up_ref(engine); + rsa->engine = engine; + } else { + rsa->engine = ENGINE_get_default_RSA(); + } + + if (rsa->engine) { + rsa->meth = ENGINE_get_RSA(rsa->engine); + if (rsa->meth == NULL) { + ENGINE_finish(engine); + free(rsa); + return 0; + } + } + + if (rsa->meth == NULL) + rsa->meth = rk_UNCONST(RSA_get_default_method()); + + (*rsa->meth->init)(rsa); + + return rsa; +} + +/** + * Free an allocation RSA object. + * + * @param rsa the RSA object to free. + * @ingroup hcrypto_rsa + */ + +void +RSA_free(RSA *rsa) +{ + if (rsa->references <= 0) + abort(); + + if (--rsa->references > 0) + return; + + (*rsa->meth->finish)(rsa); + + if (rsa->engine) + ENGINE_finish(rsa->engine); + +#define free_if(f) if (f) { BN_free(f); } + free_if(rsa->n); + free_if(rsa->e); + free_if(rsa->d); + free_if(rsa->p); + free_if(rsa->q); + free_if(rsa->dmp1); + free_if(rsa->dmq1); + free_if(rsa->iqmp); +#undef free_if + + memset(rsa, 0, sizeof(*rsa)); + free(rsa); +} + +/** + * Add an extra reference to the RSA object. The object should be free + * with RSA_free() to drop the reference. + * + * @param rsa the object to add reference counting too. + * + * @return the current reference count, can't safely be used except + * for debug printing. + * + * @ingroup hcrypto_rsa + */ + +int +RSA_up_ref(RSA *rsa) +{ + return ++rsa->references; +} + +/** + * Return the RSA_METHOD used for this RSA object. + * + * @param rsa the object to get the method from. + * + * @return the method used for this RSA object. + * + * @ingroup hcrypto_rsa + */ + +const RSA_METHOD * +RSA_get_method(const RSA *rsa) +{ + return rsa->meth; +} + +/** + * Set a new method for the RSA keypair. + * + * @param rsa rsa parameter. + * @param method the new method for the RSA parameter. + * + * @return 1 on success. + * + * @ingroup hcrypto_rsa + */ + +int +RSA_set_method(RSA *rsa, const RSA_METHOD *method) +{ + (*rsa->meth->finish)(rsa); + + if (rsa->engine) { + ENGINE_finish(rsa->engine); + rsa->engine = NULL; + } + + rsa->meth = method; + (*rsa->meth->init)(rsa); + return 1; +} + +/** + * Set the application data for the RSA object. + * + * @param rsa the rsa object to set the parameter for + * @param arg the data object to store + * + * @return 1 on success. + * + * @ingroup hcrypto_rsa + */ + +int +RSA_set_app_data(RSA *rsa, void *arg) +{ + rsa->ex_data.sk = arg; + return 1; +} + +/** + * Get the application data for the RSA object. + * + * @param rsa the rsa object to get the parameter for + * + * @return the data object + * + * @ingroup hcrypto_rsa + */ + +void * +RSA_get_app_data(const RSA *rsa) +{ + return rsa->ex_data.sk; +} + +int +RSA_check_key(const RSA *key) +{ + static const unsigned char inbuf[] = "hello, world!"; + RSA *rsa = rk_UNCONST(key); + void *buffer; + int ret; + + /* + * XXX I have no clue how to implement this w/o a bignum library. + * Well, when we have a RSA key pair, we can try to encrypt/sign + * and then decrypt/verify. + */ + + if ((rsa->d == NULL || rsa->n == NULL) && + (rsa->p == NULL || rsa->q || rsa->dmp1 == NULL || rsa->dmq1 == NULL || rsa->iqmp == NULL)) + return 0; + + buffer = malloc(RSA_size(rsa)); + if (buffer == NULL) + return 0; + + ret = RSA_private_encrypt(sizeof(inbuf), inbuf, buffer, + rsa, RSA_PKCS1_PADDING); + if (ret == -1) { + free(buffer); + return 0; + } + + ret = RSA_public_decrypt(ret, buffer, buffer, + rsa, RSA_PKCS1_PADDING); + if (ret == -1) { + free(buffer); + return 0; + } + + if (ret == sizeof(inbuf) && ct_memcmp(buffer, inbuf, sizeof(inbuf)) == 0) { + free(buffer); + return 1; + } + free(buffer); + return 0; +} + +int +RSA_size(const RSA *rsa) +{ + return BN_num_bytes(rsa->n); +} + +#define RSAFUNC(name, body) \ +int \ +name(int flen,const unsigned char* f, unsigned char* t, RSA* r, int p){\ + return body; \ +} + +RSAFUNC(RSA_public_encrypt, (r)->meth->rsa_pub_enc(flen, f, t, r, p)) +RSAFUNC(RSA_public_decrypt, (r)->meth->rsa_pub_dec(flen, f, t, r, p)) +RSAFUNC(RSA_private_encrypt, (r)->meth->rsa_priv_enc(flen, f, t, r, p)) +RSAFUNC(RSA_private_decrypt, (r)->meth->rsa_priv_dec(flen, f, t, r, p)) + +static const heim_octet_string null_entry_oid = { 2, rk_UNCONST("\x05\x00") }; + +static const unsigned sha1_oid_tree[] = { 1, 3, 14, 3, 2, 26 }; +static const AlgorithmIdentifier _signature_sha1_data = { + { 6, rk_UNCONST(sha1_oid_tree) }, rk_UNCONST(&null_entry_oid) +}; +static const unsigned sha256_oid_tree[] = { 2, 16, 840, 1, 101, 3, 4, 2, 1 }; +static const AlgorithmIdentifier _signature_sha256_data = { + { 9, rk_UNCONST(sha256_oid_tree) }, rk_UNCONST(&null_entry_oid) +}; +static const unsigned md5_oid_tree[] = { 1, 2, 840, 113549, 2, 5 }; +static const AlgorithmIdentifier _signature_md5_data = { + { 6, rk_UNCONST(md5_oid_tree) }, rk_UNCONST(&null_entry_oid) +}; + + +int +RSA_sign(int type, const unsigned char *from, unsigned int flen, + unsigned char *to, unsigned int *tlen, RSA *rsa) +{ + if (rsa->meth->rsa_sign) + return rsa->meth->rsa_sign(type, from, flen, to, tlen, rsa); + + if (rsa->meth->rsa_priv_enc) { + heim_octet_string indata; + DigestInfo di; + size_t size; + int ret; + + memset(&di, 0, sizeof(di)); + + if (type == NID_sha1) { + di.digestAlgorithm = _signature_sha1_data; + } else if (type == NID_md5) { + di.digestAlgorithm = _signature_md5_data; + } else if (type == NID_sha256) { + di.digestAlgorithm = _signature_sha256_data; + } else + return -1; + + di.digest.data = rk_UNCONST(from); + di.digest.length = flen; + + ASN1_MALLOC_ENCODE(DigestInfo, + indata.data, + indata.length, + &di, + &size, + ret); + if (ret) + return ret; + if (indata.length != size) + abort(); + + ret = rsa->meth->rsa_priv_enc(indata.length, indata.data, to, + rsa, RSA_PKCS1_PADDING); + free(indata.data); + if (ret > 0) { + *tlen = ret; + ret = 1; + } else + ret = 0; + + return ret; + } + + return 0; +} + +int +RSA_verify(int type, const unsigned char *from, unsigned int flen, + unsigned char *sigbuf, unsigned int siglen, RSA *rsa) +{ + if (rsa->meth->rsa_verify) + return rsa->meth->rsa_verify(type, from, flen, sigbuf, siglen, rsa); + + if (rsa->meth->rsa_pub_dec) { + const AlgorithmIdentifier *digest_alg; + void *data; + DigestInfo di; + size_t size; + int ret, ret2; + + data = malloc(RSA_size(rsa)); + if (data == NULL) + return -1; + + memset(&di, 0, sizeof(di)); + + ret = rsa->meth->rsa_pub_dec(siglen, sigbuf, data, rsa, RSA_PKCS1_PADDING); + if (ret <= 0) { + free(data); + return -2; + } + + ret2 = decode_DigestInfo(data, ret, &di, &size); + free(data); + if (ret2 != 0) + return -3; + if (ret != size) { + free_DigestInfo(&di); + return -4; + } + + if (flen != di.digest.length || memcmp(di.digest.data, from, flen) != 0) { + free_DigestInfo(&di); + return -5; + } + + if (type == NID_sha1) { + digest_alg = &_signature_sha1_data; + } else if (type == NID_md5) { + digest_alg = &_signature_md5_data; + } else if (type == NID_sha256) { + digest_alg = &_signature_sha256_data; + } else { + free_DigestInfo(&di); + return -1; + } + + ret = der_heim_oid_cmp(&digest_alg->algorithm, + &di.digestAlgorithm.algorithm); + free_DigestInfo(&di); + + if (ret != 0) + return 0; + return 1; + } + + return 0; +} + +/* + * A NULL RSA_METHOD that returns failure for all operations. This is + * used as the default RSA method if we don't have any native + * support. + */ + +static RSAFUNC(null_rsa_public_encrypt, -1) +static RSAFUNC(null_rsa_public_decrypt, -1) +static RSAFUNC(null_rsa_private_encrypt, -1) +static RSAFUNC(null_rsa_private_decrypt, -1) + +/* + * + */ + +int +RSA_generate_key_ex(RSA *r, int bits, BIGNUM *e, BN_GENCB *cb) +{ + if (r->meth->rsa_keygen) + return (*r->meth->rsa_keygen)(r, bits, e, cb); + return 0; +} + + +/* + * + */ + +static int +null_rsa_init(RSA *rsa) +{ + return 1; +} + +static int +null_rsa_finish(RSA *rsa) +{ + return 1; +} + +static const RSA_METHOD rsa_null_method = { + "hcrypto null RSA", + null_rsa_public_encrypt, + null_rsa_public_decrypt, + null_rsa_private_encrypt, + null_rsa_private_decrypt, + NULL, + NULL, + null_rsa_init, + null_rsa_finish, + 0, + NULL, + NULL, + NULL, + NULL +}; + +const RSA_METHOD * +RSA_null_method(void) +{ + return &rsa_null_method; +} + +extern const RSA_METHOD hc_rsa_gmp_method; +extern const RSA_METHOD hc_rsa_tfm_method; +extern const RSA_METHOD hc_rsa_ltm_method; +static const RSA_METHOD *default_rsa_method = &hc_rsa_ltm_method; + + +const RSA_METHOD * +RSA_get_default_method(void) +{ + return default_rsa_method; +} + +void +RSA_set_default_method(const RSA_METHOD *meth) +{ + default_rsa_method = meth; +} + +/* + * + */ + +RSA * +d2i_RSAPrivateKey(RSA *rsa, const unsigned char **pp, size_t len) +{ + RSAPrivateKey data; + RSA *k = rsa; + size_t size; + int ret; + + ret = decode_RSAPrivateKey(*pp, len, &data, &size); + if (ret) + return NULL; + + *pp += size; + + if (k == NULL) { + k = RSA_new(); + if (k == NULL) { + free_RSAPrivateKey(&data); + return NULL; + } + } + + k->n = _hc_integer_to_BN(&data.modulus, NULL); + k->e = _hc_integer_to_BN(&data.publicExponent, NULL); + k->d = _hc_integer_to_BN(&data.privateExponent, NULL); + k->p = _hc_integer_to_BN(&data.prime1, NULL); + k->q = _hc_integer_to_BN(&data.prime2, NULL); + k->dmp1 = _hc_integer_to_BN(&data.exponent1, NULL); + k->dmq1 = _hc_integer_to_BN(&data.exponent2, NULL); + k->iqmp = _hc_integer_to_BN(&data.coefficient, NULL); + free_RSAPrivateKey(&data); + + if (k->n == NULL || k->e == NULL || k->d == NULL || k->p == NULL || + k->q == NULL || k->dmp1 == NULL || k->dmq1 == NULL || k->iqmp == NULL) + { + RSA_free(k); + return NULL; + } + + return k; +} + +int +i2d_RSAPrivateKey(RSA *rsa, unsigned char **pp) +{ + RSAPrivateKey data; + size_t size; + int ret; + + if (rsa->n == NULL || rsa->e == NULL || rsa->d == NULL || rsa->p == NULL || + rsa->q == NULL || rsa->dmp1 == NULL || rsa->dmq1 == NULL || + rsa->iqmp == NULL) + return -1; + + memset(&data, 0, sizeof(data)); + + ret = _hc_BN_to_integer(rsa->n, &data.modulus); + ret |= _hc_BN_to_integer(rsa->e, &data.publicExponent); + ret |= _hc_BN_to_integer(rsa->d, &data.privateExponent); + ret |= _hc_BN_to_integer(rsa->p, &data.prime1); + ret |= _hc_BN_to_integer(rsa->q, &data.prime2); + ret |= _hc_BN_to_integer(rsa->dmp1, &data.exponent1); + ret |= _hc_BN_to_integer(rsa->dmq1, &data.exponent2); + ret |= _hc_BN_to_integer(rsa->iqmp, &data.coefficient); + if (ret) { + free_RSAPrivateKey(&data); + return -1; + } + + if (pp == NULL) { + size = length_RSAPrivateKey(&data); + free_RSAPrivateKey(&data); + } else { + void *p; + size_t len; + + ASN1_MALLOC_ENCODE(RSAPrivateKey, p, len, &data, &size, ret); + free_RSAPrivateKey(&data); + if (ret) + return -1; + if (len != size) + abort(); + + memcpy(*pp, p, size); + free(p); + + *pp += size; + + } + return size; +} + +int +i2d_RSAPublicKey(RSA *rsa, unsigned char **pp) +{ + RSAPublicKey data; + size_t size; + int ret; + + memset(&data, 0, sizeof(data)); + + if (_hc_BN_to_integer(rsa->n, &data.modulus) || + _hc_BN_to_integer(rsa->e, &data.publicExponent)) + { + free_RSAPublicKey(&data); + return -1; + } + + if (pp == NULL) { + size = length_RSAPublicKey(&data); + free_RSAPublicKey(&data); + } else { + void *p; + size_t len; + + ASN1_MALLOC_ENCODE(RSAPublicKey, p, len, &data, &size, ret); + free_RSAPublicKey(&data); + if (ret) + return -1; + if (len != size) + abort(); + + memcpy(*pp, p, size); + free(p); + + *pp += size; + } + + return size; +} + +RSA * +d2i_RSAPublicKey(RSA *rsa, const unsigned char **pp, size_t len) +{ + RSAPublicKey data; + RSA *k = rsa; + size_t size; + int ret; + + ret = decode_RSAPublicKey(*pp, len, &data, &size); + if (ret) + return NULL; + + *pp += size; + + if (k == NULL) { + k = RSA_new(); + if (k == NULL) { + free_RSAPublicKey(&data); + return NULL; + } + } + + k->n = _hc_integer_to_BN(&data.modulus, NULL); + k->e = _hc_integer_to_BN(&data.publicExponent, NULL); + + free_RSAPublicKey(&data); + + if (k->n == NULL || k->e == NULL) { + RSA_free(k); + return NULL; + } + + return k; +} diff --git a/crypto/heimdal/lib/hcrypto/rsakey.der b/crypto/heimdal/lib/hcrypto/rsakey.der new file mode 100644 index 0000000000000000000000000000000000000000..e7c665e3005ee3a753a3d6e26dc9f0aed74dab66 GIT binary patch literal 609 zc$@)Y0-pUaf&yIv0RRGlfdIm)qC&S@nWO!>@SAnp?>w7~&tqRk*pYNF=xwjRpOPnn~@Y$K2O#d-^0T4`Dr$-&e?s+*}#}RC~=PLpO0RRC4fq)*Q zRbE3Dd>p_x$lvd=YWovW8sq(cU0_tjiKfbvTq8tWoNBes^fMEr)Pm_calB`<1nPUQ zvl(O!xIW;#{9aT6u+x<-6VZI6!kBugYdSXc)78y;=Dd!PI_-Y!58i&9^8ii#T(gWu z*(w3UJQ+012Kf~|Je6GoOXW#CML_~V0O;1E_ww7&wIln9XE_+vWn8=8E4A;O3~Wrt zKeq*sM%*ol>Pmm+{tdkAMa2*IM7F0EW&d`wmMjSD%G`d!0|G$+)(7mqPeusAY7f2e z^xRh`j+1(G(jsi=IE-tXo%zLtWY0bY@}I?vSh+$8HH73lx#L z0zf$~m4Hl5eYq~k6q}qQBrQvm{2&1Xf`D#}fR=teNKLQ5BT~K3A&i|B8+N=2%E3NX zRHEV)WzT4<9CS&jd%prf0H5+KDa>>^_RyRY1`hVx>g3U}p!`@}s_hqp6F6&t005RB zbFyty<6o%C+oak}AId9)YmBy8r vFZBj@5ivhsq)?0J&iVT;j=No(-|+<0n~N73a914nGF!S(6}dmj{_Z7B-BBx1 literal 0 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 +#include + +#include "hash.h" +#include "sha.h" + +#define A m->counter[0] +#define B m->counter[1] +#define C m->counter[2] +#define D m->counter[3] +#define E m->counter[4] +#define X data + +int +SHA1_Init (struct sha *m) +{ + m->sz[0] = 0; + m->sz[1] = 0; + A = 0x67452301; + B = 0xefcdab89; + C = 0x98badcfe; + D = 0x10325476; + E = 0xc3d2e1f0; + return 1; +} + + +#define F0(x,y,z) CRAYFIX((x & y) | (~x & z)) +#define F1(x,y,z) (x ^ y ^ z) +#define F2(x,y,z) ((x & y) | (x & z) | (y & z)) +#define F3(x,y,z) F1(x,y,z) + +#define K0 0x5a827999 +#define K1 0x6ed9eba1 +#define K2 0x8f1bbcdc +#define K3 0xca62c1d6 + +#define DO(t,f,k) \ +do { \ + uint32_t temp; \ + \ + temp = cshift(AA, 5) + f(BB,CC,DD) + EE + data[t] + k; \ + EE = DD; \ + DD = CC; \ + CC = cshift(BB, 30); \ + BB = AA; \ + AA = temp; \ +} while(0) + +static inline void +calc (struct sha *m, uint32_t *in) +{ + uint32_t AA, BB, CC, DD, EE; + uint32_t data[80]; + int i; + + AA = A; + BB = B; + CC = C; + DD = D; + EE = E; + + for (i = 0; i < 16; ++i) + data[i] = in[i]; + for (i = 16; i < 80; ++i) + data[i] = cshift(data[i-3] ^ data[i-8] ^ data[i-14] ^ data[i-16], 1); + + /* t=[0,19] */ + + DO(0,F0,K0); + DO(1,F0,K0); + DO(2,F0,K0); + DO(3,F0,K0); + DO(4,F0,K0); + DO(5,F0,K0); + DO(6,F0,K0); + DO(7,F0,K0); + DO(8,F0,K0); + DO(9,F0,K0); + DO(10,F0,K0); + DO(11,F0,K0); + DO(12,F0,K0); + DO(13,F0,K0); + DO(14,F0,K0); + DO(15,F0,K0); + DO(16,F0,K0); + DO(17,F0,K0); + DO(18,F0,K0); + DO(19,F0,K0); + + /* t=[20,39] */ + + DO(20,F1,K1); + DO(21,F1,K1); + DO(22,F1,K1); + DO(23,F1,K1); + DO(24,F1,K1); + DO(25,F1,K1); + DO(26,F1,K1); + DO(27,F1,K1); + DO(28,F1,K1); + DO(29,F1,K1); + DO(30,F1,K1); + DO(31,F1,K1); + DO(32,F1,K1); + DO(33,F1,K1); + DO(34,F1,K1); + DO(35,F1,K1); + DO(36,F1,K1); + DO(37,F1,K1); + DO(38,F1,K1); + DO(39,F1,K1); + + /* t=[40,59] */ + + DO(40,F2,K2); + DO(41,F2,K2); + DO(42,F2,K2); + DO(43,F2,K2); + DO(44,F2,K2); + DO(45,F2,K2); + DO(46,F2,K2); + DO(47,F2,K2); + DO(48,F2,K2); + DO(49,F2,K2); + DO(50,F2,K2); + DO(51,F2,K2); + DO(52,F2,K2); + DO(53,F2,K2); + DO(54,F2,K2); + DO(55,F2,K2); + DO(56,F2,K2); + DO(57,F2,K2); + DO(58,F2,K2); + DO(59,F2,K2); + + /* t=[60,79] */ + + DO(60,F3,K3); + DO(61,F3,K3); + DO(62,F3,K3); + DO(63,F3,K3); + DO(64,F3,K3); + DO(65,F3,K3); + DO(66,F3,K3); + DO(67,F3,K3); + DO(68,F3,K3); + DO(69,F3,K3); + DO(70,F3,K3); + DO(71,F3,K3); + DO(72,F3,K3); + DO(73,F3,K3); + DO(74,F3,K3); + DO(75,F3,K3); + DO(76,F3,K3); + DO(77,F3,K3); + DO(78,F3,K3); + DO(79,F3,K3); + + A += AA; + B += BB; + C += CC; + D += DD; + E += EE; +} + +/* + * From `Performance analysis of MD5' by Joseph D. Touch + */ + +#if !defined(WORDS_BIGENDIAN) || defined(_CRAY) +static inline uint32_t +swap_uint32_t (uint32_t t) +{ +#define ROL(x,n) ((x)<<(n))|((x)>>(32-(n))) + uint32_t temp1, temp2; + + temp1 = cshift(t, 16); + temp2 = temp1 >> 8; + temp1 &= 0x00ff00ff; + temp2 &= 0x00ff00ff; + temp1 <<= 8; + return temp1 | temp2; +} +#endif + +struct x32{ + unsigned int a:32; + unsigned int b:32; +}; + +int +SHA1_Update (struct sha *m, const void *v, size_t len) +{ + const unsigned char *p = v; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 64; + while(len > 0){ + size_t l = min(len, 64 - offset); + memcpy(m->save + offset, p, l); + offset += l; + p += l; + len -= l; + if(offset == 64){ +#if !defined(WORDS_BIGENDIAN) || defined(_CRAY) + int i; + uint32_t SHA1current[16]; + struct x32 *us = (struct x32*)m->save; + for(i = 0; i < 8; i++){ + SHA1current[2*i+0] = swap_uint32_t(us[i].a); + SHA1current[2*i+1] = swap_uint32_t(us[i].b); + } + calc(m, SHA1current); +#else + calc(m, (uint32_t*)m->save); +#endif + offset = 0; + } + } + return 1; +} + +int +SHA1_Final (void *res, struct sha *m) +{ + unsigned char zeros[72]; + unsigned offset = (m->sz[0] / 8) % 64; + unsigned int dstart = (120 - offset - 1) % 64 + 1; + + *zeros = 0x80; + memset (zeros + 1, 0, sizeof(zeros) - 1); + zeros[dstart+7] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+6] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+5] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+4] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+3] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+2] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+1] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+0] = (m->sz[1] >> 24) & 0xff; + SHA1_Update (m, zeros, dstart + 8); + { + int i; + unsigned char *r = (unsigned char*)res; + + for (i = 0; i < 5; ++i) { + r[4*i+3] = m->counter[i] & 0xFF; + r[4*i+2] = (m->counter[i] >> 8) & 0xFF; + r[4*i+1] = (m->counter[i] >> 16) & 0xFF; + r[4*i] = (m->counter[i] >> 24) & 0xFF; + } + } +#if 0 + { + int i; + uint32_t *r = (uint32_t *)res; + + for (i = 0; i < 5; ++i) + r[i] = swap_uint32_t (m->counter[i]); + } +#endif + return 1; +} diff --git a/crypto/heimdal/lib/hcrypto/sha256.c b/crypto/heimdal/lib/hcrypto/sha256.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/sha256.c @@ -0,0 +1,233 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include "hash.h" +#include "sha.h" + +#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z))) +#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) + +#define ROTR(x,n) (((x)>>(n)) | ((x) << (32 - (n)))) + +#define Sigma0(x) (ROTR(x,2) ^ ROTR(x,13) ^ ROTR(x,22)) +#define Sigma1(x) (ROTR(x,6) ^ ROTR(x,11) ^ ROTR(x,25)) +#define sigma0(x) (ROTR(x,7) ^ ROTR(x,18) ^ ((x)>>3)) +#define sigma1(x) (ROTR(x,17) ^ ROTR(x,19) ^ ((x)>>10)) + +#define A m->counter[0] +#define B m->counter[1] +#define C m->counter[2] +#define D m->counter[3] +#define E m->counter[4] +#define F m->counter[5] +#define G m->counter[6] +#define H m->counter[7] + +static const uint32_t constant_256[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 +}; + +int +SHA256_Init (SHA256_CTX *m) +{ + m->sz[0] = 0; + m->sz[1] = 0; + A = 0x6a09e667; + B = 0xbb67ae85; + C = 0x3c6ef372; + D = 0xa54ff53a; + E = 0x510e527f; + F = 0x9b05688c; + G = 0x1f83d9ab; + H = 0x5be0cd19; + return 1; +} + +static void +calc (SHA256_CTX *m, uint32_t *in) +{ + uint32_t AA, BB, CC, DD, EE, FF, GG, HH; + uint32_t data[64]; + int i; + + AA = A; + BB = B; + CC = C; + DD = D; + EE = E; + FF = F; + GG = G; + HH = H; + + for (i = 0; i < 16; ++i) + data[i] = in[i]; + for (i = 16; i < 64; ++i) + data[i] = sigma1(data[i-2]) + data[i-7] + + sigma0(data[i-15]) + data[i - 16]; + + for (i = 0; i < 64; i++) { + uint32_t T1, T2; + + T1 = HH + Sigma1(EE) + Ch(EE, FF, GG) + constant_256[i] + data[i]; + T2 = Sigma0(AA) + Maj(AA,BB,CC); + + HH = GG; + GG = FF; + FF = EE; + EE = DD + T1; + DD = CC; + CC = BB; + BB = AA; + AA = T1 + T2; + } + + A += AA; + B += BB; + C += CC; + D += DD; + E += EE; + F += FF; + G += GG; + H += HH; +} + +/* + * From `Performance analysis of MD5' by Joseph D. Touch + */ + +#if !defined(WORDS_BIGENDIAN) || defined(_CRAY) +static inline uint32_t +swap_uint32_t (uint32_t t) +{ +#define ROL(x,n) ((x)<<(n))|((x)>>(32-(n))) + uint32_t temp1, temp2; + + temp1 = cshift(t, 16); + temp2 = temp1 >> 8; + temp1 &= 0x00ff00ff; + temp2 &= 0x00ff00ff; + temp1 <<= 8; + return temp1 | temp2; +} +#endif + +struct x32{ + unsigned int a:32; + unsigned int b:32; +}; + +int +SHA256_Update (SHA256_CTX *m, const void *v, size_t len) +{ + const unsigned char *p = v; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 64; + while(len > 0){ + size_t l = min(len, 64 - offset); + memcpy(m->save + offset, p, l); + offset += l; + p += l; + len -= l; + if(offset == 64){ +#if !defined(WORDS_BIGENDIAN) || defined(_CRAY) + int i; + uint32_t current[16]; + struct x32 *us = (struct x32*)m->save; + for(i = 0; i < 8; i++){ + current[2*i+0] = swap_uint32_t(us[i].a); + current[2*i+1] = swap_uint32_t(us[i].b); + } + calc(m, current); +#else + calc(m, (uint32_t*)m->save); +#endif + offset = 0; + } + } + return 1; +} + +int +SHA256_Final (void *res, SHA256_CTX *m) +{ + unsigned char zeros[72]; + unsigned offset = (m->sz[0] / 8) % 64; + unsigned int dstart = (120 - offset - 1) % 64 + 1; + + *zeros = 0x80; + memset (zeros + 1, 0, sizeof(zeros) - 1); + zeros[dstart+7] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+6] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+5] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+4] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+3] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+2] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+1] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+0] = (m->sz[1] >> 24) & 0xff; + SHA256_Update (m, zeros, dstart + 8); + { + int i; + unsigned char *r = (unsigned char*)res; + + for (i = 0; i < 8; ++i) { + r[4*i+3] = m->counter[i] & 0xFF; + r[4*i+2] = (m->counter[i] >> 8) & 0xFF; + r[4*i+1] = (m->counter[i] >> 16) & 0xFF; + r[4*i] = (m->counter[i] >> 24) & 0xFF; + } + } + return 1; +} diff --git a/crypto/heimdal/lib/hcrypto/sha512.c b/crypto/heimdal/lib/hcrypto/sha512.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/sha512.c @@ -0,0 +1,301 @@ +/* + * Copyright (c) 2006, 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include "hash.h" +#include "sha.h" + +#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z))) +#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) + +#define ROTR(x,n) (((x)>>(n)) | ((x) << (64 - (n)))) + +#define Sigma0(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39)) +#define Sigma1(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41)) +#define sigma0(x) (ROTR(x,1) ^ ROTR(x,8) ^ ((x)>>7)) +#define sigma1(x) (ROTR(x,19) ^ ROTR(x,61) ^ ((x)>>6)) + +#define A m->counter[0] +#define B m->counter[1] +#define C m->counter[2] +#define D m->counter[3] +#define E m->counter[4] +#define F m->counter[5] +#define G m->counter[6] +#define H m->counter[7] + +static const uint64_t constant_512[80] = { + 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, + 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, + 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, + 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, + 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, + 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, + 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, + 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, + 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, + 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, + 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, + 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, + 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, + 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, + 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, + 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, + 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, + 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, + 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, + 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, + 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL +}; + +int +SHA512_Init (SHA512_CTX *m) +{ + m->sz[0] = 0; + m->sz[1] = 0; + A = 0x6a09e667f3bcc908ULL; + B = 0xbb67ae8584caa73bULL; + C = 0x3c6ef372fe94f82bULL; + D = 0xa54ff53a5f1d36f1ULL; + E = 0x510e527fade682d1ULL; + F = 0x9b05688c2b3e6c1fULL; + G = 0x1f83d9abfb41bd6bULL; + H = 0x5be0cd19137e2179ULL; + return 1; +} + +static void +calc (SHA512_CTX *m, uint64_t *in) +{ + uint64_t AA, BB, CC, DD, EE, FF, GG, HH; + uint64_t data[80]; + int i; + + AA = A; + BB = B; + CC = C; + DD = D; + EE = E; + FF = F; + GG = G; + HH = H; + + for (i = 0; i < 16; ++i) + data[i] = in[i]; + for (i = 16; i < 80; ++i) + data[i] = sigma1(data[i-2]) + data[i-7] + + sigma0(data[i-15]) + data[i - 16]; + + for (i = 0; i < 80; i++) { + uint64_t T1, T2; + + T1 = HH + Sigma1(EE) + Ch(EE, FF, GG) + constant_512[i] + data[i]; + T2 = Sigma0(AA) + Maj(AA,BB,CC); + + HH = GG; + GG = FF; + FF = EE; + EE = DD + T1; + DD = CC; + CC = BB; + BB = AA; + AA = T1 + T2; + } + + A += AA; + B += BB; + C += CC; + D += DD; + E += EE; + F += FF; + G += GG; + H += HH; +} + +/* + * From `Performance analysis of MD5' by Joseph D. Touch + */ + +#if !defined(WORDS_BIGENDIAN) || defined(_CRAY) +static inline uint64_t +swap_uint64_t (uint64_t t) +{ + uint64_t temp; + + temp = cshift64(t, 32); + temp = ((temp & 0xff00ff00ff00ff00ULL) >> 8) | + ((temp & 0x00ff00ff00ff00ffULL) << 8); + return ((temp & 0xffff0000ffff0000ULL) >> 16) | + ((temp & 0x0000ffff0000ffffULL) << 16); +} + +struct x64{ + uint64_t a; + uint64_t b; +}; +#endif + +int +SHA512_Update (SHA512_CTX *m, const void *v, size_t len) +{ + const unsigned char *p = v; + size_t old_sz = m->sz[0]; + size_t offset; + + m->sz[0] += len * 8; + if (m->sz[0] < old_sz) + ++m->sz[1]; + offset = (old_sz / 8) % 128; + while(len > 0){ + size_t l = min(len, 128 - offset); + memcpy(m->save + offset, p, l); + offset += l; + p += l; + len -= l; + if(offset == 128){ +#if !defined(WORDS_BIGENDIAN) || defined(_CRAY) + int i; + uint64_t current[16]; + struct x64 *us = (struct x64*)m->save; + for(i = 0; i < 8; i++){ + current[2*i+0] = swap_uint64_t(us[i].a); + current[2*i+1] = swap_uint64_t(us[i].b); + } + calc(m, current); +#else + calc(m, (uint64_t*)m->save); +#endif + offset = 0; + } + } + return 1; +} + +int +SHA512_Final (void *res, SHA512_CTX *m) +{ + unsigned char zeros[128 + 16]; + unsigned offset = (m->sz[0] / 8) % 128; + unsigned int dstart = (240 - offset - 1) % 128 + 1; + + *zeros = 0x80; + memset (zeros + 1, 0, sizeof(zeros) - 1); + zeros[dstart+15] = (m->sz[0] >> 0) & 0xff; + zeros[dstart+14] = (m->sz[0] >> 8) & 0xff; + zeros[dstart+13] = (m->sz[0] >> 16) & 0xff; + zeros[dstart+12] = (m->sz[0] >> 24) & 0xff; + zeros[dstart+11] = (m->sz[0] >> 32) & 0xff; + zeros[dstart+10] = (m->sz[0] >> 40) & 0xff; + zeros[dstart+9] = (m->sz[0] >> 48) & 0xff; + zeros[dstart+8] = (m->sz[0] >> 56) & 0xff; + + zeros[dstart+7] = (m->sz[1] >> 0) & 0xff; + zeros[dstart+6] = (m->sz[1] >> 8) & 0xff; + zeros[dstart+5] = (m->sz[1] >> 16) & 0xff; + zeros[dstart+4] = (m->sz[1] >> 24) & 0xff; + zeros[dstart+3] = (m->sz[1] >> 32) & 0xff; + zeros[dstart+2] = (m->sz[1] >> 40) & 0xff; + zeros[dstart+1] = (m->sz[1] >> 48) & 0xff; + zeros[dstart+0] = (m->sz[1] >> 56) & 0xff; + SHA512_Update (m, zeros, dstart + 16); + { + int i; + unsigned char *r = (unsigned char*)res; + + for (i = 0; i < 8; ++i) { + r[8*i+7] = m->counter[i] & 0xFF; + r[8*i+6] = (m->counter[i] >> 8) & 0xFF; + r[8*i+5] = (m->counter[i] >> 16) & 0xFF; + r[8*i+4] = (m->counter[i] >> 24) & 0xFF; + r[8*i+3] = (m->counter[i] >> 32) & 0XFF; + r[8*i+2] = (m->counter[i] >> 40) & 0xFF; + r[8*i+1] = (m->counter[i] >> 48) & 0xFF; + r[8*i] = (m->counter[i] >> 56) & 0xFF; + } + } + return 1; +} + +int +SHA384_Init(SHA384_CTX *m) +{ + m->sz[0] = 0; + m->sz[1] = 0; + A = 0xcbbb9d5dc1059ed8ULL; + B = 0x629a292a367cd507ULL; + C = 0x9159015a3070dd17ULL; + D = 0x152fecd8f70e5939ULL; + E = 0x67332667ffc00b31ULL; + F = 0x8eb44a8768581511ULL; + G = 0xdb0c2e0d64f98fa7ULL; + H = 0x47b5481dbefa4fa4ULL; + return 1; +} + +int +SHA384_Update (SHA384_CTX *m, const void *v, size_t len) +{ + SHA512_Update(m, v, len); + return 1; +} + +int +SHA384_Final (void *res, SHA384_CTX *m) +{ + unsigned char data[SHA512_DIGEST_LENGTH]; + SHA512_Final(data, m); + memcpy(res, data, SHA384_DIGEST_LENGTH); + return 1; +} + diff --git a/crypto/heimdal/lib/hcrypto/test_bn.c b/crypto/heimdal/lib/hcrypto/test_bn.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_bn.c @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include + +static int +set_get(unsigned long num) +{ + BIGNUM *bn; + + bn = BN_new(); + if (!BN_set_word(bn, num)) + return 1; + + if (BN_get_word(bn) != num) + return 1; + + BN_free(bn); + return 0; +} + +#define CHECK(x) do { ret += x; } while(0) + +static int +test_BN_set_get(void) +{ + int ret = 0; + CHECK(set_get(0)); + CHECK(set_get(1)); + CHECK(set_get(0xff)); + CHECK(set_get(0x1ff)); + CHECK(set_get(0xffff)); + CHECK(set_get(0xf000)); + CHECK(set_get(ULONG_MAX / 2)); + CHECK(set_get(ULONG_MAX - 1)); + + return ret; +} + +static int +test_BN_bit(void) +{ + BIGNUM *bn; + int ret = 0; + + bn = BN_new(); + + /* test setting and getting of "word" */ + if (!BN_set_word(bn, 1)) + return 1; + if (!BN_is_bit_set(bn, 0)) + ret += 1; + if (!BN_is_bit_set(bn, 0)) + ret += 1; + + if (!BN_set_word(bn, 2)) + return 1; + if (!BN_is_bit_set(bn, 1)) + ret += 1; + + if (!BN_set_word(bn, 3)) + return 1; + if (!BN_is_bit_set(bn, 0)) + ret += 1; + if (!BN_is_bit_set(bn, 1)) + ret += 1; + + if (!BN_set_word(bn, 0x100)) + return 1; + if (!BN_is_bit_set(bn, 8)) + ret += 1; + + if (!BN_set_word(bn, 0x1000)) + return 1; + if (!BN_is_bit_set(bn, 12)) + ret += 1; + + /* test bitsetting */ + if (!BN_set_word(bn, 1)) + return 1; + if (!BN_set_bit(bn, 1)) + return 1; + if (BN_get_word(bn) != 3) + return 1; + if (!BN_clear_bit(bn, 0)) + return 1; + if (BN_get_word(bn) != 2) + return 1; + + /* test bitsetting past end of current end */ + BN_clear(bn); + if (!BN_set_bit(bn, 12)) + return 1; + if (BN_get_word(bn) != 0x1000) + return 1; + + /* test bit and byte counting functions */ + if (BN_num_bits(bn) != 13) + return 1; + if (BN_num_bytes(bn) != 2) + return 1; + + BN_free(bn); + return ret; +} + +struct ietest { + char *data; + size_t len; + unsigned long num; +} ietests[] = { + { "", 0, 0 }, + { "\x01", 1, 1 }, + { "\x02", 1, 2 }, + { "\xf2", 1, 0xf2 }, + { "\x01\x00", 2, 256 } +}; + +static int +test_BN_import_export(void) +{ + BIGNUM *bn; + int ret = 0; + int i; + + bn = BN_new(); + + for (i = 0; i < sizeof(ietests)/sizeof(ietests[0]); i++) { + size_t len; + unsigned char *p; + if (!BN_bin2bn((unsigned char*)ietests[i].data, ietests[i].len, bn)) + return 1; + if (BN_get_word(bn) != ietests[i].num) + return 1; + len = BN_num_bytes(bn); + if (len != ietests[i].len) + return 1; + p = malloc(len + 1); + p[len] = 0xf4; + BN_bn2bin(bn, p); + if (p[len] != 0xf4) + return 1; + if (memcmp(p, ietests[i].data, ietests[i].len) != 0) + return 1; + free(p); + } + + BN_free(bn); + return ret; +} + +static int +test_BN_uadd(void) +{ + BIGNUM *a, *b, *c; + char *p; + + a = BN_new(); + b = BN_new(); + c = BN_new(); + + BN_set_word(a, 1); + BN_set_word(b, 2); + + BN_uadd(c, a, b); + + if (BN_get_word(c) != 3) + return 1; + + BN_uadd(c, b, a); + + if (BN_get_word(c) != 3) + return 1; + + BN_set_word(b, 0xff); + + BN_uadd(c, a, b); + if (BN_get_word(c) != 0x100) + return 1; + + BN_uadd(c, b, a); + if (BN_get_word(c) != 0x100) + return 1; + + BN_set_word(a, 0xff); + + BN_uadd(c, a, b); + if (BN_get_word(c) != 0x1fe) + return 1; + + BN_uadd(c, b, a); + if (BN_get_word(c) != 0x1fe) + return 1; + + + BN_free(a); + BN_free(b); + + BN_hex2bn(&a, "50212A3B611D46642C825A16A354CE0FD4D85DD2"); + BN_hex2bn(&b, "84B6C7E8D28ACA1614954DA"); + + BN_uadd(c, b, a); + p = BN_bn2hex(c); + if (strcmp(p, "50212A3B611D466434CDC695307D7AB13621B2AC") != 0) { + free(p); + return 1; + } + free(p); + + BN_uadd(c, a, b); + p = BN_bn2hex(c); + if (strcmp(p, "50212A3B611D466434CDC695307D7AB13621B2AC") != 0) { + free(p); + return 1; + } + free(p); + + BN_free(a); + BN_free(b); + BN_free(c); + + return 0; +} + +static int +test_BN_cmp(void) +{ + BIGNUM *a, *b; + + a = BN_new(); + b = BN_new(); + + if (!BN_set_word(a, 1)) + return 1; + if (!BN_set_word(b, 1)) + return 1; + + if (BN_cmp(a, b) != 0) + return 1; + if (BN_cmp(b, a) != 0) + return 1; + + if (!BN_set_word(b, 2)) + return 1; + + if (BN_cmp(a, b) >= 0) + return 1; + if (BN_cmp(b, a) <= 0) + return 1; + + BN_set_negative(b, 1); + + if (BN_cmp(a, b) <= 0) + return 1; + if (BN_cmp(b, a) >= 0) + return 1; + + BN_free(a); + BN_free(b); + + BN_hex2bn(&a, "50212A3B611D46642C825A16A354CE0FD4D85DD1"); + BN_hex2bn(&b, "50212A3B611D46642C825A16A354CE0FD4D85DD2"); + + if (BN_cmp(a, b) >= 0) + return 1; + if (BN_cmp(b, a) <= 0) + return 1; + + BN_set_negative(b, 1); + + if (BN_cmp(a, b) <= 0) + return 1; + if (BN_cmp(b, a) >= 0) + return 1; + + BN_free(a); + BN_free(b); + return 0; +} + +static int +test_BN_rand(void) +{ + BIGNUM *bn; + + if (RAND_status() != 1) + return 0; + + bn = BN_new(); + if (bn == NULL) + return 1; + + if (!BN_rand(bn, 1024, 0, 0)) + return 1; + + BN_free(bn); + return 0; +} + +#define testnum 100 +#define testnum2 10 + +static int +test_BN_CTX(void) +{ + unsigned int i, j; + BIGNUM *bn; + BN_CTX *c; + + if ((c = BN_CTX_new()) == NULL) + return 1; + + for (i = 0; i < testnum; i++) { + BN_CTX_start(c); + BN_CTX_end(c); + } + + for (i = 0; i < testnum; i++) + BN_CTX_start(c); + for (i = 0; i < testnum; i++) + BN_CTX_end(c); + + for (i = 0; i < testnum; i++) { + BN_CTX_start(c); + if ((bn = BN_CTX_get(c)) == NULL) + return 1; + BN_CTX_end(c); + } + + for (i = 0; i < testnum; i++) { + BN_CTX_start(c); + for (j = 0; j < testnum2; j++) + if ((bn = BN_CTX_get(c)) == NULL) + return 1; + } + for (i = 0; i < testnum; i++) + BN_CTX_end(c); + + BN_CTX_free(c); + return 0; +} + + +int +main(int argc, char **argv) +{ + int ret = 0; + + ret += test_BN_set_get(); + ret += test_BN_bit(); + ret += test_BN_import_export(); + ret += test_BN_uadd(); + ret += test_BN_cmp(); + ret += test_BN_rand(); + ret += test_BN_CTX(); + + return ret; +} diff --git a/crypto/heimdal/lib/hcrypto/test_bulk.c b/crypto/heimdal/lib/hcrypto/test_bulk.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_bulk.c @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include +#include +#include +#if defined(_WIN32) +#include +#endif +#include +#include +#include + +#ifdef WIN32 +#define STATS_START(M) \ + LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds; \ + LARGE_INTEGER Frequency; \ + \ + QueryPerformanceFrequency(&Frequency); \ + QueryPerformanceCounter(&StartingTime); + +#define STATS_END(M) \ + QueryPerformanceCounter(&EndingTime); \ + ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart; \ + ElapsedMicroseconds.QuadPart *= 1000000; \ + ElapsedMicroseconds.QuadPart /= Frequency.QuadPart; \ + \ + M += (ElapsedMicroseconds.QuadPart - M) / (i + 1); +#else +#define STATS_START(M) \ + struct timeval StartingTime, EndingTime; \ + \ + gettimeofday(&StartingTime, NULL); + +#define STATS_END(M) \ + gettimeofday(&EndingTime, NULL); \ + timevalsub(&EndingTime, &StartingTime); \ + M += (EndingTime.tv_sec * 1000000 + EndingTime.tv_usec - M) / (i + 1); +#endif + +static int version_flag; +static int help_flag; +static int len = 1; +static int loops = 20; +static char *provider = "hcrypto"; +static unsigned char *d; + +#ifdef __APPLE__ +#define PROVIDER_USAGE "hcrypto|cc" +#elif defined(WIN32) +#define PROVIDER_USAGE "hcrypto|w32crypto" +#elif __sun || defined(PKCS11_MODULE_PATH) +#define PROVIDER_USAGE "hcrypto|pkcs11" +#else +#define PROVIDER_USAGE "hcrypto" +#endif + +static struct getargs args[] = { + { "provider", 0, arg_string, &provider, + "crypto provider", PROVIDER_USAGE }, + { "loops", 0, arg_integer, &loops, + "number of loops", "loops" }, + { "size", 0, arg_integer, &len, + "size (KB)", NULL }, + { "version", 0, arg_flag, &version_flag, + "print version", NULL }, + { "help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + +static int +test_bulk_cipher(const char *cname, const EVP_CIPHER *c) +{ + static unsigned char key[16]; + static unsigned char iv[16]; + int i; + int64_t M = 0; + + if (c == NULL) { + printf("%s not supported\n", cname); + return 0; + } + + for (i = 0; i < loops; i++) { + EVP_CIPHER_CTX ectx; + EVP_CIPHER_CTX dctx; + + STATS_START(M) + + EVP_CIPHER_CTX_init(&ectx); + EVP_CIPHER_CTX_init(&dctx); + + if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) + errx(1, "can't init encrypt"); + if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) + errx(1, "can't init decrypt"); + + EVP_CIPHER_CTX_set_key_length(&ectx, sizeof(key)); + EVP_CIPHER_CTX_set_key_length(&dctx, sizeof(key)); + + if (EVP_CipherInit_ex(&ectx, NULL, NULL, key, iv, 1) != 1) + errx(1, "can't init encrypt"); + if (EVP_CipherInit_ex(&dctx, NULL, NULL, key, iv, 0) != 1) + errx(1, "can't init decrypt"); + + if (!EVP_Cipher(&ectx, d, d, len)) + errx(1, "can't encrypt"); + if (!EVP_Cipher(&dctx, d, d, len)) + errx(1, "can't decrypt"); + + EVP_CIPHER_CTX_cleanup(&ectx); + EVP_CIPHER_CTX_cleanup(&dctx); + + STATS_END(M); + + if (d[0] != 0x00 || d[len - 1] != ((len - 1) & 0xff)) + errx(1, "encrypt/decrypt inconsistent"); + } + + printf("%s: mean time %llu usec%s\n", cname, (unsigned long long)M, + (M == 1) ? "" : "s"); + + return 0; +} + +static int +test_bulk_digest(const char *cname, const EVP_MD *md) +{ + char digest[EVP_MAX_MD_SIZE]; + int i; + unsigned int tmp = sizeof(digest); + int64_t M = 0; + + if (md == NULL) { + printf("%s not supported\n", cname); + return 0; + } + + for (i = 0; i < loops; i++) { + STATS_START(M); + EVP_Digest(d, len, digest, &tmp, md, NULL); + STATS_END(M); + } + + printf("%s: mean time %llu usec%s\n", cname, (unsigned long long)M, + (M == 1) ? "" : "s"); + + return 0; +} + +static void +test_bulk_provider_hcrypto(void) +{ + test_bulk_cipher("hcrypto_aes_256_cbc", EVP_hcrypto_aes_256_cbc()); +#if 0 + test_bulk_cipher("hcrypto_aes_256_cfb8", EVP_hcrypto_aes_256_cfb8()); +#endif + test_bulk_cipher("hcrypto_rc4", EVP_hcrypto_rc4()); + test_bulk_digest("hcrypto_md4", EVP_hcrypto_md4()); + test_bulk_digest("hcrypto_md5", EVP_hcrypto_md5()); + test_bulk_digest("hcrypto_sha1", EVP_hcrypto_sha1()); + test_bulk_digest("hcrypto_sha256", EVP_hcrypto_sha256()); + test_bulk_digest("hcrypto_sha384", EVP_hcrypto_sha384()); + test_bulk_digest("hcrypto_sha512", EVP_hcrypto_sha512()); +} + +#ifdef __APPLE__ +static void +test_bulk_provider_cc(void) +{ + test_bulk_cipher("cc_aes_256_cbc", EVP_cc_aes_256_cbc()); +#if 0 + test_bulk_cipher("cc_aes_256_cfb8", EVP_cc_aes_256_cfb8()); +#endif + test_bulk_cipher("cc_rc4", EVP_cc_rc4()); + test_bulk_digest("cc_md4", EVP_cc_md4()); + test_bulk_digest("cc_md5", EVP_cc_md5()); + test_bulk_digest("cc_sha1", EVP_cc_sha1()); + test_bulk_digest("cc_sha256", EVP_cc_sha256()); + test_bulk_digest("cc_sha384", EVP_cc_sha384()); + test_bulk_digest("cc_sha512", EVP_cc_sha512()); +} +#endif /* __APPLE__ */ + +#ifdef WIN32 +static void +test_bulk_provider_w32crypto(void) +{ + test_bulk_cipher("w32crypto_aes_256_cbc", EVP_w32crypto_aes_256_cbc()); +#if 0 + test_bulk_cipher("w32crypto_aes_256_cfb8", EVP_w32crypto_aes_256_cfb8()); +#endif + test_bulk_cipher("w32crypto_rc4", EVP_w32crypto_rc4()); + test_bulk_digest("w32crypto_md4", EVP_w32crypto_md4()); + test_bulk_digest("w32crypto_md5", EVP_w32crypto_md5()); + test_bulk_digest("w32crypto_sha1", EVP_w32crypto_sha1()); + test_bulk_digest("w32crypto_sha256", EVP_w32crypto_sha256()); + test_bulk_digest("w32crypto_sha384", EVP_w32crypto_sha384()); + test_bulk_digest("w32crypto_sha512", EVP_w32crypto_sha512()); +} +#endif /* WIN32 */ + +#if __sun || defined(PKCS11_MODULE_PATH) +static void +test_bulk_provider_pkcs11(void) +{ + test_bulk_cipher("pkcs11_aes_256_cbc", EVP_pkcs11_aes_256_cbc()); + test_bulk_cipher("pkcs11_rc4", EVP_pkcs11_rc4()); + test_bulk_digest("pkcs11_md5", EVP_pkcs11_md5()); + test_bulk_digest("pkcs11_sha1", EVP_pkcs11_sha1()); + test_bulk_digest("pkcs11_sha256", EVP_pkcs11_sha256()); + test_bulk_digest("pkcs11_sha384", EVP_pkcs11_sha384()); + test_bulk_digest("pkcs11_sha512", EVP_pkcs11_sha512()); +} +#endif /* __sun || PKCS11_MODULE_PATH */ + +int +main(int argc, char **argv) +{ + int ret = 0; + int idx = 0; + int i; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) + usage(1); + + if (help_flag) + usage(0); + + if(version_flag) { + print_version(NULL); + exit(0); + } + + argc -= idx; + argv += idx; + + len *= 1024; + + d = emalloc(len); + for (i = 0; i < len; i++) + d[i] = i & 0xff; + + if (strcmp(provider, "hcrypto") == 0) + test_bulk_provider_hcrypto(); +#ifdef __APPLE__ + else if (strcmp(provider, "cc") == 0) + test_bulk_provider_cc(); +#endif +#ifdef WIN32 + else if (strcmp(provider, "w32crypto") == 0) + test_bulk_provider_w32crypto(); +#endif +#if __sun || defined(PKCS11_MODULE_PATH) + else if (strcmp(provider, "pkcs11") == 0) + test_bulk_provider_pkcs11(); +#endif + else + usage(1); + + free(d); + + return ret; +} diff --git a/crypto/heimdal/lib/hcrypto/test_cipher.c b/crypto/heimdal/lib/hcrypto/test_cipher.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_cipher.c @@ -0,0 +1,435 @@ +/* + * Copyright (c) 2006-2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#define HC_DEPRECATED_CRYPTO + +#include + +#include +#include +#include +#if defined(_WIN32) +#include +#endif +#include +#include +#include +#include + +struct tests { + const char *name; + void *key; + size_t keysize; + void *iv; + size_t datasize; + void *indata; + void *outdata; + void *outiv; +}; + +struct tests aes_tests[] = { + { "aes-256", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 32, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\xdc\x95\xc0\x78\xa2\x40\x89\x89\xad\x48\xa2\x14\x92\x84\x20\x87", + NULL + } +}; + +struct tests aes_cfb_tests[] = { + { "aes-cfb8-128", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\x66\x16\xf9\x2e\x42\xa8\xf1\x1a\x91\x16\x68\x57\x8e\xc3\xaa\x0f", + NULL + } +}; + + +struct tests rc2_tests[] = { + { "rc2", + "\x88\xbc\xa9\x0e\x90\x87\x5a\x7f\x0f\x79\xc3\x84\x62\x7b\xaf\xb2", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00", + 8, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x22\x69\x55\x2a\xb0\xf8\x5c\xa6", + NULL + } +}; + + +struct tests rc2_40_tests[] = { + { "rc2-40", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\xc0\xb8\xff\xa5\xd6\xeb\xc9\x62\xcc\x52\x5f\xfe\x9a\x3c\x97\xe6", + NULL + } +}; + +struct tests des_ede3_tests[] = { + { "des-ede3", + "\x19\x17\xff\xe6\xbb\x77\x2e\xfc" + "\x29\x76\x43\xbc\x63\x56\x7e\x9a" + "\x00\x2e\x4d\x43\x1d\x5f\xfd\x58", + 24, + "\xbf\x9a\x12\xb7\x26\x69\xfd\x05", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\x55\x95\x97\x76\xa9\x6c\x66\x40\x64\xc7\xf4\x1c\x21\xb7\x14\x1b", + NULL + } +}; + +struct tests camellia128_tests[] = { + { "camellia128", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\x07\x92\x3A\x39\xEB\x0A\x81\x7D\x1C\x4D\x87\xBD\xB8\x2D\x1F\x1C", + NULL + } +}; + +struct tests rc4_tests[] = { + { + "rc4 8", + "\x01\x23\x45\x67\x89\xAB\xCD\xEF", + 8, + NULL, + 8, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x74\x94\xC2\xE7\x10\x4B\x08\x79", + NULL + }, + { + "rc4 5", + "\x61\x8a\x63\xd2\xfb", + 5, + NULL, + 5, + "\xdc\xee\x4c\xf9\x2c", + "\xf1\x38\x29\xc9\xde", + NULL + }, + { + "rc4 309", + "\x29\x04\x19\x72\xfb\x42\xba\x5f\xc7\x12\x77\x12\xf1\x38\x29\xc9", + 16, + NULL, + 309, + "\x52\x75\x69\x73\x6c\x69\x6e\x6e" + "\x75\x6e\x20\x6c\x61\x75\x6c\x75" + "\x20\x6b\x6f\x72\x76\x69\x73\x73" + "\x73\x61\x6e\x69\x2c\x20\x74\xe4" + "\x68\x6b\xe4\x70\xe4\x69\x64\x65" + "\x6e\x20\x70\xe4\xe4\x6c\x6c\xe4" + "\x20\x74\xe4\x79\x73\x69\x6b\x75" + "\x75\x2e\x20\x4b\x65\x73\xe4\x79" + "\xf6\x6e\x20\x6f\x6e\x20\x6f\x6e" + "\x6e\x69\x20\x6f\x6d\x61\x6e\x61" + "\x6e\x69\x2c\x20\x6b\x61\x73\x6b" + "\x69\x73\x61\x76\x75\x75\x6e\x20" + "\x6c\x61\x61\x6b\x73\x6f\x74\x20" + "\x76\x65\x72\x68\x6f\x75\x75\x2e" + "\x20\x45\x6e\x20\x6d\x61\x20\x69" + "\x6c\x6f\x69\x74\x73\x65\x2c\x20" + "\x73\x75\x72\x65\x20\x68\x75\x6f" + "\x6b\x61\x61\x2c\x20\x6d\x75\x74" + "\x74\x61\x20\x6d\x65\x74\x73\xe4" + "\x6e\x20\x74\x75\x6d\x6d\x75\x75" + "\x73\x20\x6d\x75\x6c\x6c\x65\x20" + "\x74\x75\x6f\x6b\x61\x61\x2e\x20" + "\x50\x75\x75\x6e\x74\x6f\x20\x70" + "\x69\x6c\x76\x65\x6e\x2c\x20\x6d" + "\x69\x20\x68\x75\x6b\x6b\x75\x75" + "\x2c\x20\x73\x69\x69\x6e\x74\x6f" + "\x20\x76\x61\x72\x61\x6e\x20\x74" + "\x75\x75\x6c\x69\x73\x65\x6e\x2c" + "\x20\x6d\x69\x20\x6e\x75\x6b\x6b" + "\x75\x75\x2e\x20\x54\x75\x6f\x6b" + "\x73\x75\x74\x20\x76\x61\x6e\x61" + "\x6d\x6f\x6e\x20\x6a\x61\x20\x76" + "\x61\x72\x6a\x6f\x74\x20\x76\x65" + "\x65\x6e\x2c\x20\x6e\x69\x69\x73" + "\x74\xe4\x20\x73\x79\x64\xe4\x6d" + "\x65\x6e\x69\x20\x6c\x61\x75\x6c" + "\x75\x6e\x20\x74\x65\x65\x6e\x2e" + "\x20\x2d\x20\x45\x69\x6e\x6f\x20" + "\x4c\x65\x69\x6e\x6f", + "\x35\x81\x86\x99\x90\x01\xe6\xb5" + "\xda\xf0\x5e\xce\xeb\x7e\xee\x21" + "\xe0\x68\x9c\x1f\x00\xee\xa8\x1f" + "\x7d\xd2\xca\xae\xe1\xd2\x76\x3e" + "\x68\xaf\x0e\xad\x33\xd6\x6c\x26" + "\x8b\xc9\x46\xc4\x84\xfb\xe9\x4c" + "\x5f\x5e\x0b\x86\xa5\x92\x79\xe4" + "\xf8\x24\xe7\xa6\x40\xbd\x22\x32" + "\x10\xb0\xa6\x11\x60\xb7\xbc\xe9" + "\x86\xea\x65\x68\x80\x03\x59\x6b" + "\x63\x0a\x6b\x90\xf8\xe0\xca\xf6" + "\x91\x2a\x98\xeb\x87\x21\x76\xe8" + "\x3c\x20\x2c\xaa\x64\x16\x6d\x2c" + "\xce\x57\xff\x1b\xca\x57\xb2\x13" + "\xf0\xed\x1a\xa7\x2f\xb8\xea\x52" + "\xb0\xbe\x01\xcd\x1e\x41\x28\x67" + "\x72\x0b\x32\x6e\xb3\x89\xd0\x11" + "\xbd\x70\xd8\xaf\x03\x5f\xb0\xd8" + "\x58\x9d\xbc\xe3\xc6\x66\xf5\xea" + "\x8d\x4c\x79\x54\xc5\x0c\x3f\x34" + "\x0b\x04\x67\xf8\x1b\x42\x59\x61" + "\xc1\x18\x43\x07\x4d\xf6\x20\xf2" + "\x08\x40\x4b\x39\x4c\xf9\xd3\x7f" + "\xf5\x4b\x5f\x1a\xd8\xf6\xea\x7d" + "\xa3\xc5\x61\xdf\xa7\x28\x1f\x96" + "\x44\x63\xd2\xcc\x35\xa4\xd1\xb0" + "\x34\x90\xde\xc5\x1b\x07\x11\xfb" + "\xd6\xf5\x5f\x79\x23\x4d\x5b\x7c" + "\x76\x66\x22\xa6\x6d\xe9\x2b\xe9" + "\x96\x46\x1d\x5e\x4d\xc8\x78\xef" + "\x9b\xca\x03\x05\x21\xe8\x35\x1e" + "\x4b\xae\xd2\xfd\x04\xf9\x46\x73" + "\x68\xc4\xad\x6a\xc1\x86\xd0\x82" + "\x45\xb2\x63\xa2\x66\x6d\x1f\x6c" + "\x54\x20\xf1\x59\x9d\xfd\x9f\x43" + "\x89\x21\xc2\xf5\xa4\x63\x93\x8c" + "\xe0\x98\x22\x65\xee\xf7\x01\x79" + "\xbc\x55\x3f\x33\x9e\xb1\xa4\xc1" + "\xaf\x5f\x6a\x54\x7f", + NULL + } +}; + + +static int +test_cipher(int i, const EVP_CIPHER *c, struct tests *t) +{ + EVP_CIPHER_CTX ectx; + EVP_CIPHER_CTX dctx; + void *d; + + if (c == NULL) { + printf("%s not supported\n", t->name); + return 0; + } + + EVP_CIPHER_CTX_init(&ectx); + EVP_CIPHER_CTX_init(&dctx); + + if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) + errx(1, "%s: %d EVP_CipherInit_ex einit", t->name, i); + if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) + errx(1, "%s: %d EVP_CipherInit_ex dinit", t->name, i); + + EVP_CIPHER_CTX_set_key_length(&ectx, t->keysize); + EVP_CIPHER_CTX_set_key_length(&dctx, t->keysize); + + if (EVP_CipherInit_ex(&ectx, NULL, NULL, t->key, t->iv, 1) != 1) + errx(1, "%s: %d EVP_CipherInit_ex encrypt", t->name, i); + if (EVP_CipherInit_ex(&dctx, NULL, NULL, t->key, t->iv, 0) != 1) + errx(1, "%s: %d EVP_CipherInit_ex decrypt", t->name, i); + + d = emalloc(t->datasize); + + if (!EVP_Cipher(&ectx, d, t->indata, t->datasize)) + errx(1, "%s: %d EVP_Cipher encrypt failed", t->name, i); + + if (memcmp(d, t->outdata, t->datasize) != 0) { + char *s, *s2; + hex_encode(d, t->datasize, &s); + hex_encode(t->outdata, t->datasize, &s2); + errx(1, "%s: %d encrypt not the same: %s != %s", t->name, i, s, s2); + } + + if (!EVP_Cipher(&dctx, d, d, t->datasize)) + errx(1, "%s: %d EVP_Cipher decrypt failed", t->name, i); + + if (memcmp(d, t->indata, t->datasize) != 0) { + char *s; + hex_encode(d, t->datasize, &s); + errx(1, "%s: %d decrypt not the same: %s", t->name, i, s); + } + if (t->outiv) { + /* XXXX check */ + ; + } + + EVP_CIPHER_CTX_cleanup(&ectx); + EVP_CIPHER_CTX_cleanup(&dctx); + free(d); + + return 0; +} + +static int version_flag; +static int help_flag; + +static struct getargs args[] = { + { "version", 0, arg_flag, &version_flag, + "print version", NULL }, + { "help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + int ret = 0; + int i, idx = 0; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) + usage(1); + + if (help_flag) + usage(0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= idx; + argv += idx; + + /* hcrypto */ + for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) + ret += test_cipher(i, EVP_hcrypto_aes_256_cbc(), &aes_tests[i]); + for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) + ret += test_cipher(i, EVP_hcrypto_aes_128_cfb8(), &aes_cfb_tests[i]); + for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) + ret += test_cipher(i, EVP_hcrypto_rc2_cbc(), &rc2_tests[i]); + for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) + ret += test_cipher(i, EVP_hcrypto_rc2_40_cbc(), &rc2_40_tests[i]); + for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) + ret += test_cipher(i, EVP_hcrypto_des_ede3_cbc(), &des_ede3_tests[i]); + for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++) + ret += test_cipher(i, EVP_hcrypto_camellia_128_cbc(), + &camellia128_tests[i]); + for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) + ret += test_cipher(i, EVP_hcrypto_rc4(), &rc4_tests[i]); + + /* Common Crypto */ +#ifdef __APPLE__ + for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) + ret += test_cipher(i, EVP_cc_aes_256_cbc(), &aes_tests[i]); + for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) + ret += test_cipher(i, EVP_cc_aes_128_cfb8(), &aes_cfb_tests[i]); + for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) + ret += test_cipher(i, EVP_cc_rc2_40_cbc(), &rc2_40_tests[i]); + for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) + ret += test_cipher(i, EVP_cc_des_ede3_cbc(), &des_ede3_tests[i]); + for (i = 0; i < sizeof(camellia128_tests)/sizeof(camellia128_tests[0]); i++) + ret += test_cipher(i, EVP_cc_camellia_128_cbc(), + &camellia128_tests[i]); + for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) + ret += test_cipher(i, EVP_cc_rc4(), &rc4_tests[i]); +#endif /* __APPLE__ */ + + /* Windows CNG (if available) */ +#ifdef WIN32 + for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) + ret += test_cipher(i, EVP_w32crypto_aes_256_cbc(), &aes_tests[i]); + for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) + ret += test_cipher(i, EVP_w32crypto_aes_128_cfb8(), &aes_cfb_tests[i]); + for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) + ret += test_cipher(i, EVP_w32crypto_rc2_cbc(), &rc2_tests[i]); + for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) + ret += test_cipher(i, EVP_w32crypto_rc2_40_cbc(), &rc2_40_tests[i]); + for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) + ret += test_cipher(i, EVP_w32crypto_des_ede3_cbc(), &des_ede3_tests[i]); + for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) + ret += test_cipher(i, EVP_w32crypto_rc4(), &rc4_tests[i]); +#endif /* WIN32 */ + + /* PKCS#11 */ +#if __sun || defined(PKCS11_MODULE_PATH) + for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) + ret += test_cipher(i, EVP_pkcs11_aes_256_cbc(), &aes_tests[i]); + for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) + ret += test_cipher(i, EVP_pkcs11_aes_128_cfb8(), &aes_cfb_tests[i]); + for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) + ret += test_cipher(i, EVP_pkcs11_rc2_cbc(), &rc2_tests[i]); + for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) + ret += test_cipher(i, EVP_pkcs11_rc2_40_cbc(), &rc2_40_tests[i]); + for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) + ret += test_cipher(i, EVP_pkcs11_des_ede3_cbc(), &des_ede3_tests[i]); + for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) + ret += test_cipher(i, EVP_pkcs11_rc4(), &rc4_tests[i]); +#endif /* PKCS11_MODULE_PATH */ + + /* OpenSSL */ +#ifdef HAVE_HCRYPTO_W_OPENSSL + for (i = 0; i < sizeof(aes_tests)/sizeof(aes_tests[0]); i++) + ret += test_cipher(i, EVP_ossl_aes_256_cbc(), &aes_tests[i]); + for (i = 0; i < sizeof(aes_cfb_tests)/sizeof(aes_cfb_tests[0]); i++) + ret += test_cipher(i, EVP_ossl_aes_128_cfb8(), &aes_cfb_tests[i]); + for (i = 0; i < sizeof(rc2_tests)/sizeof(rc2_tests[0]); i++) + ret += test_cipher(i, EVP_ossl_rc2_cbc(), &rc2_tests[i]); + for (i = 0; i < sizeof(rc2_40_tests)/sizeof(rc2_40_tests[0]); i++) + ret += test_cipher(i, EVP_ossl_rc2_40_cbc(), &rc2_40_tests[i]); + for (i = 0; i < sizeof(des_ede3_tests)/sizeof(des_ede3_tests[0]); i++) + ret += test_cipher(i, EVP_ossl_des_ede3_cbc(), &des_ede3_tests[i]); + for (i = 0; i < sizeof(rc4_tests)/sizeof(rc4_tests[0]); i++) + ret += test_cipher(i, EVP_ossl_rc4(), &rc4_tests[i]); +#endif /* PKCS11_MODULE_PATH */ + + return ret; +} diff --git a/crypto/heimdal/lib/hcrypto/test_crypto.in b/crypto/heimdal/lib/hcrypto/test_crypto.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_crypto.in @@ -0,0 +1,120 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +srcdir="@srcdir@" + +rsa="${TESTS_ENVIRONMENT} ./test_rsa@exeext@" +engine="${TESTS_ENVIRONMENT} ./test_engine_dso@exeext@" +rand="${TESTS_ENVIRONMENT} ./test_rand@exeext@" + +${engine} --test-random > /dev/null || { echo "missing random"; exit 77; } + +${rsa} --key=${srcdir}/rsakey.der || \ + { echo "rsa test failed" ; exit 1; } + +${rsa} --time-key=${srcdir}/rsakey.der || \ + { echo "rsa test failed" ; exit 1; } + +${rsa} --time-key=${srcdir}/rsakey2048.der || \ + { echo "rsa test failed" ; exit 1; } + +${rsa} --time-key=generate || \ + { echo "rsa test failed" ; exit 1; } + +${engine} --rsa=${srcdir}/rsakey.der || \ + { echo "engine test failed" ; exit 1; } + +${rsa} --loops=4 || { echo "rsa test for 4 loops failed" ; exit 1; } + +for a in unix fortuna egd w32crypto ;do + ${rand} --method=${a} --file=crypto-test 2>error + res=$? + if test "X$res" != X0 ; then + grep "unknown method" error && \ + { echo "random $a is not available" ; continue; } + grep "random not ready yet" error || \ + { echo "random $a ready failing" ; cat error; exit 1; } + echo "random method $a out for lunch" + continue + fi + ${rand} --method=${a} --file=crypto-test2 2>error + res=$? + if test "X$res" != X0 ; then + grep "random not ready yet" error || \ + { echo "random $a ready failing" ; cat error; exit 1; } + echo "random metod $a out for dinner" + continue + fi + cmp crypto-test crypto-test2 >/dev/null 2>/dev/null && \ + { echo "rand output same!" ; exit 1; } +done + +./example_evp_cipher 1 ${srcdir}/test_crypto.in test-out-1 || \ + { echo "1 failed" ; exit 1; } + +for a in 7 15 16 17 31 32 33 ; do + ./example_evp_cipher $a ${srcdir}/test_crypto.in test-out-$a + cmp test-out-1 test-out-$a || { echo "cmp $a failed" ; exit 1; } +done + +# +# Last time we run is w/o HOME and RANDFILE to make sure we can do +# RAND_file_name() when the environment is lacking those. +# + +if [ -r /dev/random -o -r /dev/urandom -o -r /dev/srandom -o -r /dev/arandom ] ; then + + # try hard to unset HOME and RANDFILE + HOME= + RANDFILE= + + unset HOME + unset RANDFILE + + ${rand} --method=unix --file=unix 2>error + res=$? + if test "X$res" != X0 ; then + grep "unknown method" error && \ + { echo "random unix is not available"; exit 0; } + grep "random not ready yet" error || \ + { echo "random unix ready failing" ; cat error; exit 1; } + echo "random method unix out for lunch" + continue + fi + +fi + +exit 0 diff --git a/crypto/heimdal/lib/hcrypto/test_dh.c b/crypto/heimdal/lib/hcrypto/test_dh.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_dh.c @@ -0,0 +1,474 @@ +/* +* Copyright (c) 2007, Novell, Inc. +* Author: Matthias Koenig +* +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* * Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials provided with the distribution. +* +* * Neither the name of the Novell nor the names of its contributors may be used +* to endorse or promote products derived from this software without specific +* prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +*/ + +/* openssl diffie-hellman test code + * works with openssl-0.9.8e + * primes with 3072 and 6144 bits as specified in RFC3526 + * fail since openssl-0.9.8f + */ + +#include +#include + +#include +#include + +#include +#include + +/* + * + */ + +static char *id_string; +static int verbose; +static int version_flag; +static int help_flag; + +static struct getargs args[] = { + { "id", 0, arg_string, &id_string, + "type of ENGINE", NULL }, + { "verbose", 0, arg_flag, &verbose, + "verbose output from tests", NULL }, + { "version", 0, arg_flag, &version_flag, + "print version", NULL }, + { "help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +/* + * + */ + +#define OAKLEY_PRIME_MODP768 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A63A3620 FFFFFFFF FFFFFFFF" + +#define OAKLEY_PRIME_MODP1024 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ + "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE65381" \ + "FFFFFFFF FFFFFFFF" + +#define OAKLEY_PRIME_MODP1536 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ + "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ + "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ + "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ + "670C354E 4ABC9804 F1746C08 CA237327 FFFFFFFF FFFFFFFF" + +/* RFC 3526 */ +#define OAKLEY_PRIME_MODP2048 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ + "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ + "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ + "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ + "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ + "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ + "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ + "15728E5A 8AACAA68 FFFFFFFF FFFFFFFF" + +#define OAKLEY_PRIME_MODP3072 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ + "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ + "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ + "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ + "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ + "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ + "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ + "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ + "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ + "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ + "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ + "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ + "43DB5BFC E0FD108E 4B82D120 A93AD2CA FFFFFFFF FFFFFFFF" + +#define OAKLEY_PRIME_MODP4096 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ + "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ + "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ + "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ + "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ + "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ + "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ + "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ + "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ + "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ + "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ + "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ + "43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \ + "88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \ + "2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \ + "287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \ + "1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \ + "93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34063199" \ + "FFFFFFFF FFFFFFFF" + +#define OAKLEY_PRIME_MODP6144 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ + "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ + "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ + "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ + "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ + "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ + "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ + "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ + "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ + "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ + "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ + "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ + "43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \ + "88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \ + "2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \ + "287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \ + "1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \ + "93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492" \ + "36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD" \ + "F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831" \ + "179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B" \ + "DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF" \ + "5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6" \ + "D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3" \ + "23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA" \ + "CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328" \ + "06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C" \ + "DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE" \ + "12BF2D5B 0B7474D6 E694F91E 6DCC4024 FFFFFFFF FFFFFFFF" + +#define OAKLEY_PRIME_MODP8192 \ + "FFFFFFFF FFFFFFFF C90FDAA2 2168C234 C4C6628B 80DC1CD1" \ + "29024E08 8A67CC74 020BBEA6 3B139B22 514A0879 8E3404DD" \ + "EF9519B3 CD3A431B 302B0A6D F25F1437 4FE1356D 6D51C245" \ + "E485B576 625E7EC6 F44C42E9 A637ED6B 0BFF5CB6 F406B7ED" \ + "EE386BFB 5A899FA5 AE9F2411 7C4B1FE6 49286651 ECE45B3D" \ + "C2007CB8 A163BF05 98DA4836 1C55D39A 69163FA8 FD24CF5F" \ + "83655D23 DCA3AD96 1C62F356 208552BB 9ED52907 7096966D" \ + "670C354E 4ABC9804 F1746C08 CA18217C 32905E46 2E36CE3B" \ + "E39E772C 180E8603 9B2783A2 EC07A28F B5C55DF0 6F4C52C9" \ + "DE2BCBF6 95581718 3995497C EA956AE5 15D22618 98FA0510" \ + "15728E5A 8AAAC42D AD33170D 04507A33 A85521AB DF1CBA64" \ + "ECFB8504 58DBEF0A 8AEA7157 5D060C7D B3970F85 A6E1E4C7" \ + "ABF5AE8C DB0933D7 1E8C94E0 4A25619D CEE3D226 1AD2EE6B" \ + "F12FFA06 D98A0864 D8760273 3EC86A64 521F2B18 177B200C" \ + "BBE11757 7A615D6C 770988C0 BAD946E2 08E24FA0 74E5AB31" \ + "43DB5BFC E0FD108E 4B82D120 A9210801 1A723C12 A787E6D7" \ + "88719A10 BDBA5B26 99C32718 6AF4E23C 1A946834 B6150BDA" \ + "2583E9CA 2AD44CE8 DBBBC2DB 04DE8EF9 2E8EFC14 1FBECAA6" \ + "287C5947 4E6BC05D 99B2964F A090C3A2 233BA186 515BE7ED" \ + "1F612970 CEE2D7AF B81BDD76 2170481C D0069127 D5B05AA9" \ + "93B4EA98 8D8FDDC1 86FFB7DC 90A6C08F 4DF435C9 34028492" \ + "36C3FAB4 D27C7026 C1D4DCB2 602646DE C9751E76 3DBA37BD" \ + "F8FF9406 AD9E530E E5DB382F 413001AE B06A53ED 9027D831" \ + "179727B0 865A8918 DA3EDBEB CF9B14ED 44CE6CBA CED4BB1B" \ + "DB7F1447 E6CC254B 33205151 2BD7AF42 6FB8F401 378CD2BF" \ + "5983CA01 C64B92EC F032EA15 D1721D03 F482D7CE 6E74FEF6" \ + "D55E702F 46980C82 B5A84031 900B1C9E 59E7C97F BEC7E8F3" \ + "23A97A7E 36CC88BE 0F1D45B7 FF585AC5 4BD407B2 2B4154AA" \ + "CC8F6D7E BF48E1D8 14CC5ED2 0F8037E0 A79715EE F29BE328" \ + "06A1D58B B7C5DA76 F550AA3D 8A1FBFF0 EB19CCB1 A313D55C" \ + "DA56C9EC 2EF29632 387FE8D7 6E3C0468 043E8F66 3F4860EE" \ + "12BF2D5B 0B7474D6 E694F91E 6DBE1159 74A3926F 12FEE5E4" \ + "38777CB6 A932DF8C D8BEC4D0 73B931BA 3BC832B6 8D9DD300" \ + "741FA7BF 8AFC47ED 2576F693 6BA42466 3AAB639C 5AE4F568" \ + "3423B474 2BF1C978 238F16CB E39D652D E3FDB8BE FC848AD9" \ + "22222E04 A4037C07 13EB57A8 1A23F0C7 3473FC64 6CEA306B" \ + "4BCBC886 2F8385DD FA9D4B7F A2C087E8 79683303 ED5BDD3A" \ + "062B3CF5 B3A278A6 6D2A13F8 3F44F82D DF310EE0 74AB6A36" \ + "4597E899 A0255DC1 64F31CC5 0846851D F9AB4819 5DED7EA1" \ + "B1D510BD 7EE74D73 FAF36BC3 1ECFA268 359046F4 EB879F92" \ + "4009438B 481C6CD7 889A002E D5EE382B C9190DA6 FC026E47" \ + "9558E447 5677E9AA 9E3050E2 765694DF C81F56E8 80B96E71" \ + "60C980DD 98EDD3DF FFFFFFFF FFFFFFFF" + +struct prime { + char *name; + char *value; +} primes[] = { + { "modp768", OAKLEY_PRIME_MODP768 }, + { "modp1024", OAKLEY_PRIME_MODP1024 }, + { "modp1536", OAKLEY_PRIME_MODP1536 }, + { "modp2048", OAKLEY_PRIME_MODP2048 }, + { "modp3072", OAKLEY_PRIME_MODP3072 }, + { "modp4096", OAKLEY_PRIME_MODP4096 }, + { "modp6144", OAKLEY_PRIME_MODP6144 }, + { "modp8192", OAKLEY_PRIME_MODP8192 }, + { NULL, NULL } +}; + +/* + * exchange a string based "base" to a value. + * + */ +static char * +str2val(const char *str, int base, size_t *len) +{ + int f; + size_t i; + char *dst; + char *rp; + const char *p; + char b[3]; + + i = 0; + for (p = str; *p != '\0'; p++) { + if (isxdigit((int)*p)) + i++; + else if (isspace((int)*p)) + ; + else + return NULL; + } + if (i == 0 || (i % 2) != 0) + return NULL; + i /= 2; + + if ((dst = malloc(i)) == NULL) + return NULL; + + i = 0; + f = 0; + for (rp = dst, p = str; *p != '\0'; p++) { + if (isxdigit((int)*p)) { + if (!f) { + b[0] = *p; + f = 1; + } else { + b[1] = *p; + b[2] = '\0'; + *rp++ = (char)strtol(b, NULL, base); + i++; + f = 0; + } + } + } + + *len = i; + + return(dst); +} + +static void set_prime(BIGNUM *p, char *str) +{ + size_t len = 0; + unsigned char *prime; + + prime = (unsigned char *)str2val(str, 16, &len); + if (prime == NULL) + errx(1, "failed to parse %s", str); + BN_bin2bn(prime, len, p); +} + +static void set_generator(BIGNUM *g) +{ + BN_set_word(g, 2); +} + +static void print_secret(unsigned char *sec, size_t len) +{ + size_t i; + + for (i = 0; i < len; ++i) + printf("%x", sec[i]); + + printf("\n"); +} + +static int check_prime(ENGINE *engine, struct prime *pr) +{ + DH *dh1, *dh2; + BIGNUM *p, *g; + unsigned char *sec1, *sec2; + size_t size; + int ret; + + if (verbose) + printf("Testing %s\n", pr->name); + + p = BN_new(); + g = BN_new(); + dh1 = DH_new_method(engine); + dh2 = DH_new_method(engine); + + /* 1. set shared parameter */ + set_prime(p, pr->value); + set_generator(g); + dh1->p = BN_dup(p); + dh1->g = BN_dup(g); + dh2->p = BN_dup(p); + dh2->g = BN_dup(g); + + /* 2. set keys */ + ret = DH_generate_key(dh1); + if (ret == 0) { + fprintf(stderr, "DH_generate_key\n"); + exit(EXIT_FAILURE); + } + ret = DH_generate_key(dh2); + if (ret == 0) { + fprintf(stderr, "DH_generate_key\n"); + exit(EXIT_FAILURE); + } + + /* 3. compute shared secret */ + size = DH_size(dh1); + if (size != DH_size(dh2)) { + fprintf(stderr, "size does not match!\n"); + exit(EXIT_FAILURE); + } + sec1 = malloc(size); + sec2 = malloc(size); + if (!sec1 || !sec2) { + perror("malloc"); + exit(EXIT_FAILURE); + } + ret = DH_compute_key(sec1, dh2->pub_key, dh1); + if (ret == -1) { + fprintf(stderr, "DH_compute_key"); + exit(EXIT_FAILURE); + } + ret = DH_compute_key(sec2, dh1->pub_key, dh2); + if (ret == -1) { + fprintf(stderr, "DH_compute_key"); + exit(EXIT_FAILURE); + } + + /* 4. compare shared secret */ + if (verbose) { + printf("shared secret 1\n"); + print_secret(sec1, size); + printf("shared secret 2\n"); + print_secret(sec2, size); + } + + if (memcmp(sec1, sec2, size) == 0) + ret = 1; + else + ret = 0; + + free(sec2); + free(sec1); + DH_free(dh2); + DH_free(dh1); + BN_free(g); + BN_free(p); + + return ret; +} + +/* + * + */ + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + ENGINE *engine = NULL; + int idx = 0; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) + usage(1); + + if (help_flag) + usage(0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= idx; + argv += idx; + + OpenSSL_add_all_algorithms(); +#ifdef OPENSSL + ENGINE_load_openssl(); +#endif + ENGINE_load_builtin_engines(); + + if (id_string) { + engine = ENGINE_by_id(id_string); + if (engine == NULL) + engine = ENGINE_by_dso(id_string, id_string); + } else { + engine = ENGINE_by_id("builtin"); + } + if (engine == NULL) + errx(1, "ENGINE_by_dso failed"); + + printf("dh %s\n", ENGINE_get_DH(engine)->name); + + { + struct prime *p = primes; + + for (; p->name; ++p) + if (check_prime(engine, p)) + printf("%s: shared secret OK\n", p->name); + else + printf("%s: shared secret FAILURE\n", p->name); + + return 0; + } + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/test_engine_dso.c b/crypto/heimdal/lib/hcrypto/test_engine_dso.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_engine_dso.c @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include + +struct { + const char *cpriv; + const char *cpub; + const char *spriv; + const char *spub; +} dhtests[] = { + { + "5C0946275D07223AEAF04301D964498F3285946057B4C50D13B4FE12C88DFD8D499DD3CC00C1BC17C0D343F2FE053C9F53389110551715B1EDF261A0314485C4835D01F7B8894027D534A2D81D63619D2F58C9864AC9816086B3FF75C01B3FAFF355425AB7369A6ABDC8B633F0A0DC4D29B50F364E7594B297183D14E5CDC05D", + "2D66DC5998B7AEE3332DC1061C6E6F6CF0FCCD74534187E2CDC9ACBCADF0FC9D5900451F44832A762F01E9CEEF1CBD7D69D020AC524D09FAD087DFADEAC36C845157B83937B51C8DB7F500C3C54FB2A05E074E40BA982186E7FEB2534EDDB387D5480AAA355B398CCAD0886F3952C3718490B7884FA67BD8B6943CDDA20134C6", + "42644BA7CF74689E18BA72BF80FCA674D1A2ADF81795EB3828E67C30E42ABD07A8E90E27F046189FAC122D915276870B72427388EAAB5D06994FC38885BBACCEA1CFC45951B730D73C1A8F83208CD1351746601648C11D70BC95B817C86E4A5C40D633654615041C7934BB3CAF4E02754D542033DB024E94C7E561A29ED0C6EC", + "C233633AB116E2DB20B4E08DA42DE8766293E6D9042F7A2C2A2F34F18FE66010B074CCF3C9B03EF27B14F0746B738AF22776224161D767D96AEC230A1DFA6DECFFCE9FED23B96F50CCB0093E59817AD0CEAEB7993AB5764679948BFB1293C9560B07AA3DFA229E341EB17C9FAE0B1D483082461D2DDBCEEE6FE7C0A34D96F66D" + }, + { + "76295C1280B890970F0F7EB01BBD9C5DF9BB8F590EB384A39EBF85CD141451407F955FD1D39012AA1F8BA53FD6A5A37CB2835CEDB27D1EBF1FE8AC9F2FFD628BD9BF7B8DD77CB80C8DC0A75F4567C7700442B26972833EB9738A8728A1FC274C59CED5E3ADA224B46711112AAA1CB831D2D6125E183ADA4F805A05024C9C6DDB", + "1E0AB5EBAAC7985FE67A574447FAE58AE4CB95416278D4C239A789D4532FA8E6F82BA10BE411D8A0A06B9E1DECE704466B3523496A8A4165B97FBCFB9CE9C4FF2DEEE786BA046E8C270FA8A9055D2F6E42EDDB32C73CF7875551A56EB69C0F14A3745745845B81C347401B27D074C60C5177BA9C14BBB1C8C219B78E15126EF8", + "68D84A8F92082F113542CFD990DEEFAD9C7EFA545268F8B3EBDF4CCBAF2865CF03EF60044EB4AF4154E6804CC2BDD673B801507446CEFC692DA577B6DC6E0272B7B081A1BEFDC2A4FAC83DB8845E3DA0D1B64DB33AA2164FEDB08A01E815336BD58F4E6DE6A265468E61C8C988B8AEC0D52DB714448DDC007E7C3382C07357DB", + "393815D507A2EF80DE2D0F2A55AAB1C25B870ACA3FC97438B4336CBF979BF9A4F8DA1B61C667129F9123045E07E24976040EC5E2368DD4EF70690102D74E900B260D3826256FD473733A7569BF514652AB78C48C334FDCA26C44ABF322643AF15BFF693A37BB2C19CA9FE5F1537FCFE2B24CF74D4E57060D35ABF115B4B6CD21" + }, + { + "7307D6C3CB874327A95F7A6A91C336CEAA086736525DF3F8EC49497CF444C68D264EB70CD6904FE56E240EEF34E6C5177911C478A7F250A0F54183BCBE64B42BAB5D019E73E2F17C095C211E4815E6BA5FDD72786AF987ABBC9109ECEEF439AF9E2141D5222CE7DC0152D8E9A6CCCE301D21A7D1D6ACB9B91B5E28379C91890D", + "83FBD7BFFDF415BBB7E21D399CB2F36A61AFDBAFC542E428E444C66AA03617C0C55C639FE2428905B57035892AE1BD2C4060E807D9E003B0C204FFC8FDD69CC8ADE7A8E18DCBFFF64E3EF9DA2C117390374241466E48A020A1B2F575AE42C233F8BD357B8331CC203E0345DFC19C73E6F1F70B6C2786E681D73BF48B15FE9992", + "61BCF748BB05A48861578B8CB1855200B2E62A40E126BD7323E5B714645A54A2C8761EE39EE39BA6D2FE19B688168EDEA6DC5056400B5315ED299E7926176B887012E58634D78F05D7BCF0E1B81B1B41F5F8EF0B0711D3A64F9A317DD183AE039A4D3BE02A515892362F8C7BB6EB6434BB25418A438ED33D50C475122CBBE862", + "7DB8D69D1605D9812B7F2F3E92BCEEB3426FEEE3265A174D71B2B6E16B332B43DF0B3C2FA152E48DE2FAC110D8CECE122C3398558E7987B27CACE12722C0032AC7E7766A9BCC881BA35B9DB9E751BD4E51F7683DE092F6C1D4DD937CDCE9C16E6F7D77CC6AAD806E4082E8E22E28592C4D78256354393FE831E811E03ED0A81A" + }, + { + "60C18B62F786DE6A4A8B13EB6DA2380B4C6731F861C715D9496DCF4A9F01CD33DDB52F1AB4D1F820FAF7AD4EFEB66586F7F08135714B13D77FE652B9EEAB2C543596A9ED307C1629CF535DD14AB22F081AE4ADF7A3E0BC7B33E0EC7A7306F9A737F55807974B5E1B7B6394BD0373917128B43A17757B34BAE1B600763E957F75", + "0DEDA337C38EA005D5B8567EAB681CE91892C2C62C9D42BF748FBFE681E11F25D98280E42E1539A10EEE9177EF2F40216987936AF19D9B5EBE22EEAC27242D77CE3A5061F2E5CFACF15CD0F80E736AE8642252FE91E129DE3C78CFB85A0B1BB87B059CBB24483444F8A07244F4E89370BA78D58BD409DFBB3D41921B8879B9C7", + "462C0707CF3366C2242A808CFDB79B77E8B3AF9D796583EB9CCD7BF4E8792AB0A818E49FFE53CA241F56988F825B366BF1E78481F8086A123259B9D83AC643E85845BF6B2C5412FFDDFAA8C9ED203CA4B3C1BFD777286099976472FA15B3CCC8418CF162F03C0C3E85D7EFC5CF5ACB9B2C039CCF3A1A9C6BB6B9C09C18D86CBD", + "56DB382EDB8C2D95934D20261CE1A37090B0802D451E647DB1DA3B73CDB5A878EAD598A8817302449370F9D45E34F5C45F73D02BF4EB2B3712A8665F446F5D2B774039E5444AB74807859FA58DF9EBA4B12BA4545ACED827E4ED64CC71F937D64A1033BC43403F2490C1B715A74822B8D50A72A102213F0CF7A1B98B771B34C4" + }, + { + "61B7321207F4A73646E43E99221F902D2F38095E84CE7346A1510FE71BA7B9B34DCB6609E4DDDA8C82426E82D1C23F1E761130ECE4638D77554A7618E1608625049328FCC1F8845CA9A88E847106B01BD31EF6500E3C7EE81A048924BEAA3EDF367E5F4575341206C7A76427571898294B07BD918D4C2642854CC89D439042E5", + "29AA38E63E4DD7C651E25DEC7A5A53E48114F52813793D36A9DBDD4F7C06FC38406E330764E0B2AFD811C39D857EA5F904105360E06856DC0780C7D61C53165833F0AEA15CB54732DE113F44C8FCFB86F4A876DD42D7A55356D91C0173F2B012680FB54C13EF54B65DF4AEDE2E13419B1316435187CEF07D44DB3DF57C4703FD", + "5ED5AFB04CBFEE43EF3D9B60A57080831563648A2380D98F1EA4A96CF153903A40A2E564DED87E7254DF3270568AB952BF6F400681DD6AD919C9B06AC0F45F0646BCF37B217191AA0B7B7BED226B61F48B46DEA2E5A09E41F316583823A38A60FFD79085F43F60D98871ECA1A0F667701425094E88885A81DE9DA6C293E95060", + "4DE4F24EAA3E2790FBCB1B13C2ED0EFD846EC33154DBEBBEFD895E1399B3617D55EC2CE8D71CF380B55D93636FEF741328D6B1E224D46F8A8B60A41D08DD86E88DE806AA781791364E6D88BF68571BF5D8C35CB04BA302227B7E4CB6A67AB7510ACBCDBF2F8A95EB5DEE693CCA5CC425A0F1CA2D18C369A767906A2477E32704" + } +}; + +static void +dh_test(DH *server, DH *client) +{ + void *skey, *ckey; + int ssize, csize; + + skey = emalloc(DH_size(server)); + ckey = emalloc(DH_size(client)); + + ssize = DH_compute_key(skey, client->pub_key, server); + if (ssize == -1) + errx(1, "DH_compute_key failed for server"); + csize = DH_compute_key(ckey, server->pub_key, client); + if (csize == -1) + errx(1, "DH_compute_key failed for client"); + + if (ssize != csize) + errx(1, "DH_compute_key size mismatch"); + + if (memcmp(skey, ckey, csize) != 0) + errx(1, "DH_compute_key key mismatch"); + + free(skey); + free(ckey); +} + + +static int version_flag; +static int help_flag; +static char *id_flag; +static char *rsa_flag; +static int dh_flag = 1; +static int test_random_flag; + +static struct getargs args[] = { + { "id", 0, arg_string, &id_flag, + "selects the engine id", "engine-id" }, + { "rsa", 0, arg_string, &rsa_flag, + "tests RSA modes", "private-rsa-der-file" }, + { "dh", 0, arg_negative_flag, &dh_flag, + "test dh", NULL }, + { "test-random", 0, arg_flag, &test_random_flag, + "test if there is a random device", NULL }, + { "version", 0, arg_flag, &version_flag, + "print version", NULL }, + { "help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + "filename.so"); + exit (ret); +} + +int +main(int argc, char **argv) +{ + ENGINE *engine = NULL; + int idx = 0; + int have_rsa, have_dh; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) + usage(1); + + if (help_flag) + usage(0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= idx; + argv += idx; + + OpenSSL_add_all_algorithms(); + + if (argc == 0) { + OpenSSL_add_all_algorithms(); + ENGINE_load_builtin_engines(); + engine = ENGINE_by_id("builtin"); + } else { + engine = ENGINE_by_dso(argv[0], id_flag); + } + if (engine == NULL) + errx(1, "ENGINE_by_dso failed"); + + printf("name: %s\n", ENGINE_get_name(engine)); + printf("id: %s\n", ENGINE_get_id(engine)); + have_rsa = ENGINE_get_RSA(engine) != NULL; + have_dh = ENGINE_get_DH(engine) != NULL; + printf("RSA: %s", have_rsa ? "yes," : "no"); + if (have_rsa) + printf(" %s", ENGINE_get_RSA(engine)->name); + printf("\n"); + printf("DH: %s", have_dh ? "yes," : "no"); + if (have_dh) + printf(" %s", ENGINE_get_DH(engine)->name); + printf("\n"); + + if (RAND_status() != 1) + errx(77, "no functional random device, can't execute tests"); + if (test_random_flag) + exit(0); + + if (rsa_flag && have_rsa) { + unsigned char buf[1024 * 4]; + const unsigned char *p; + size_t size; + int keylen; + RSA *rsa; + FILE *f; + + f = fopen(rsa_flag, "rb"); + if (f == NULL) + err(1, "could not open file %s", rsa_flag); + + size = fread(buf, 1, sizeof(buf), f); + if (size == 0) + err(1, "failed to read file %s", rsa_flag); + if (size == sizeof(buf)) + err(1, "key too long in file %s!", rsa_flag); + fclose(f); + + p = buf; + rsa = d2i_RSAPrivateKey(NULL, &p, size); + if (rsa == NULL) + err(1, "failed to parse key in file %s", rsa_flag); + + RSA_set_method(rsa, ENGINE_get_RSA(engine)); + + /* + * try rsa signing + */ + + memcpy(buf, "hejsan", 7); + keylen = RSA_private_encrypt(7, buf, buf, rsa, RSA_PKCS1_PADDING); + if (keylen <= 0) + errx(1, "failed to private encrypt"); + + keylen = RSA_public_decrypt(keylen, buf, buf, rsa, RSA_PKCS1_PADDING); + if (keylen <= 0) + errx(1, "failed to public decrypt"); + + if (keylen != 7) + errx(1, "output buffer not same length: %d", (int)keylen); + + if (memcmp(buf, "hejsan", 7) != 0) + errx(1, "string not the same after decryption"); + + /* + * try rsa encryption + */ + + memcpy(buf, "hejsan", 7); + keylen = RSA_public_encrypt(7, buf, buf, rsa, RSA_PKCS1_PADDING); + if (keylen <= 0) + errx(1, "failed to public encrypt"); + + keylen = RSA_private_decrypt(keylen, buf, buf, rsa, RSA_PKCS1_PADDING); + if (keylen <= 0) + errx(1, "failed to private decrypt"); + + if (keylen != 7) + errx(1, "output buffer not same length: %d", (int)keylen); + + if (memcmp(buf, "hejsan", 7) != 0) + errx(1, "string not the same after decryption"); + + RSA_free(rsa); + + printf("rsa test passed\n"); + + } + + if (dh_flag) { + DH *server, *client; + int i; + + /* RFC2412-MODP-group2 */ + const char *p = + "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1" + "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD" + "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245" + "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED" + "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381" + "FFFFFFFF" "FFFFFFFF"; + const char *g = "02"; + + /* + * Try generated keys + */ + + for (i = 0; i < 10; i++) { + server = DH_new_method(engine); + client = DH_new_method(engine); + + BN_hex2bn(&server->p, p); + BN_hex2bn(&client->p, p); + BN_hex2bn(&server->g, g); + BN_hex2bn(&client->g, g); + + if (!DH_generate_key(server)) + errx(1, "DH_generate_key failed for server"); + if (!DH_generate_key(client)) + errx(1, "DH_generate_key failed for client"); + + dh_test(server, client); + + DH_free(server); + DH_free(client); + } + /* + * Try known result + */ + + for (i = 0; i < sizeof(dhtests)/sizeof(dhtests[0]); i++) { + + server = DH_new_method(engine); + client = DH_new_method(engine); + + BN_hex2bn(&server->p, p); + BN_hex2bn(&client->p, p); + BN_hex2bn(&server->g, g); + BN_hex2bn(&client->g, g); + + BN_hex2bn(&client->priv_key, dhtests[i].cpriv); + BN_hex2bn(&client->pub_key, dhtests[i].cpub); + BN_hex2bn(&server->priv_key, dhtests[i].spriv); + BN_hex2bn(&server->pub_key, dhtests[i].spub); + + dh_test(server, client); + + DH_free(server); + DH_free(client); + } + + printf("DH test passed\n"); + } + + ENGINE_finish(engine); + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/test_hmac.c b/crypto/heimdal/lib/hcrypto/test_hmac.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_hmac.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include + +int +main(int argc, char **argv) +{ + unsigned char buf[4] = { 0, 0, 0, 0 }; + char hmackey[] = "hello-world"; + size_t hmackey_size = sizeof(hmackey); + unsigned int hmaclen; + unsigned char hmac[EVP_MAX_MD_SIZE]; + HMAC_CTX c; + + char answer[20] = "\x2c\xfa\x32\xb7\x2b\x8a\xf6\xdf\xcf\xda" + "\x6f\xd1\x52\x4d\x54\x58\x73\x0f\xf3\x24"; + + HMAC_CTX_init(&c); + HMAC_Init_ex(&c, hmackey, hmackey_size, EVP_sha1(), NULL); + HMAC_Update(&c, buf, sizeof(buf)); + HMAC_Final(&c, hmac, &hmaclen); + HMAC_CTX_cleanup(&c); + + if (hmaclen != 20) { + printf("hmaclen = %d\n", (int)hmaclen); + return 1; + } + + if (ct_memcmp(hmac, answer, hmaclen) != 0) { + printf("wrong answer\n"); + return 1; + } + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/test_pkcs12.c b/crypto/heimdal/lib/hcrypto/test_pkcs12.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_pkcs12.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include + +struct tests { + int id; + const char *password; + void *salt; + size_t saltsize; + int iterations; + size_t keylen; + const EVP_MD * (*md)(void); + void *key; +}; + +struct tests p12_pbe_tests[] = { + { PKCS12_KEY_ID, + NULL, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + 100, + 16, + EVP_sha1, + "\xd7\x2d\xd4\xcf\x7e\xe1\x89\xc5\xb5\xe5\x31\xa7\x63\x2c\xf0\x4b" + }, + { PKCS12_KEY_ID, + "", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + 100, + 16, + EVP_sha1, + "\x00\x54\x91\xaf\xc0\x6a\x76\xc3\xf9\xb6\xf2\x28\x1a\x15\xd9\xfe" + }, + { PKCS12_KEY_ID, + "foobar", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + 100, + 16, + EVP_sha1, + "\x79\x95\xbf\x3f\x1c\x6d\xe\xe8\xd3\x71\xc4\x94\xd\xb\x18\xb5" + }, + { PKCS12_KEY_ID, + "foobar", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + 2048, + 24, + EVP_sha1, + "\x0b\xb5\xe\xa6\x71\x0d\x0c\xf7\x44\xe\xe1\x9b\xb5\xdf\xf1\xdc\x4f\xb0\xca\xe\xee\x4f\xb9\xfd" + }, + { PKCS12_IV_ID, + "foobar", + "\x3c\xdf\x84\x32\x59\xd3\xda\x69", + 8, + 2048, + 8, + EVP_sha1, + "\xbf\x9a\x12\xb7\x26\x69\xfd\x05" + } + +}; + +static int +test_pkcs12_pbe(struct tests *t) +{ + void *key; + size_t pwlen = 0; + + key = malloc(t->keylen); + if (t->password) + pwlen = strlen(t->password); + + if (!PKCS12_key_gen(t->password, pwlen, + t->salt, t->saltsize, + t->id, t->iterations, t->keylen, + key, t->md())) + { + printf("key_gen failed\n"); + return 1; + } + + if (memcmp(t->key, key, t->keylen) != 0) { + printf("incorrect key\n"); + free(key); + return 1; + } + free(key); + return 0; +} + +int +main(int argc, char **argv) +{ + int ret = 0; + int i; + + for (i = 0; i < sizeof(p12_pbe_tests)/sizeof(p12_pbe_tests[0]); i++) + ret += test_pkcs12_pbe(&p12_pbe_tests[i]); + + return ret; +} diff --git a/crypto/heimdal/lib/hcrypto/test_pkcs5.c b/crypto/heimdal/lib/hcrypto/test_pkcs5.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_pkcs5.c @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +struct tests { + const char *password; + const char *salt; + int iterations; + const void *pbkdf2_128; + const void *pbkdf2_256; +}; + + +const struct tests pkcs5_tests[] = { + { "password", + "ATHENA.MIT.EDUraeburn", + 1, + "\xcd\xed\xb5\x28\x1b\xb2\xf8\x01\x56\x5a\x11\x22\xb2\x56\x35\x15", + "\xcd\xed\xb5\x28\x1b\xb2\xf8\x01\x56\x5a\x11\x22\xb2\x56\x35\x15" + "\x0a\xd1\xf7\xa0\x4b\xb9\xf3\xa3\x33\xec\xc0\xe2\xe1\xf7\x08\x37" + }, + { "password", + "ATHENA.MIT.EDUraeburn", + 2, + "\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d", + "\x01\xdb\xee\x7f\x4a\x9e\x24\x3e\x98\x8b\x62\xc7\x3c\xda\x93\x5d" + "\xa0\x53\x78\xb9\x32\x44\xec\x8f\x48\xa9\x9e\x61\xad\x79\x9d\x86" + }, + { "password", + "ATHENA.MIT.EDUraeburn", + 1200, + "\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b", + "\x5c\x08\xeb\x61\xfd\xf7\x1e\x4e\x4e\xc3\xcf\x6b\xa1\xf5\x51\x2b" + "\xa7\xe5\x2d\xdb\xc5\xe5\x14\x2f\x70\x8a\x31\xe2\xe6\x2b\x1e\x13" + }, + { + "password", "\x12\x34\x56\x78\x78\x56\x34\x12", + 5, + "\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49", + "\xd1\xda\xa7\x86\x15\xf2\x87\xe6\xa1\xc8\xb1\x20\xd7\x06\x2a\x49" + "\x3f\x98\xd2\x03\xe6\xbe\x49\xa6\xad\xf4\xfa\x57\x4b\x6e\x64\xee" + }, + { + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "pass phrase equals block size", + 1200, + "\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9", + "\x13\x9c\x30\xc0\x96\x6b\xc3\x2b\xa5\x5f\xdb\xf2\x12\x53\x0a\xc9" + "\xc5\xec\x59\xf1\xa4\x52\xf5\xcc\x9a\xd9\x40\xfe\xa0\x59\x8e\xd1" + }, + { + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", + "pass phrase exceeds block size", + 1200, + "\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61", + "\x9c\xca\xd6\xd4\x68\x77\x0c\xd5\x1b\x10\xe6\xa6\x87\x21\xbe\x61" + "\x1a\x8b\x4d\x28\x26\x01\xdb\x3b\x36\xbe\x92\x46\x91\x5e\xc8\x2a" + }, + { + "\xf0\x9d\x84\x9e" /* g-clef */, + "EXAMPLE.COMpianist", + 50, + "\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39", + "\x6b\x9c\xf2\x6d\x45\x45\x5a\x43\xa5\xb8\xbb\x27\x6a\x40\x3b\x39" + "\xe7\xfe\x37\xa0\xc4\x1e\x02\xc2\x81\xff\x30\x69\xe1\xe9\x4f\x52" + } +}; + +static int +test_pkcs5_pbe2(const struct tests *t) +{ + unsigned char key[32]; + int ret, error = 0; + + ret = PKCS5_PBKDF2_HMAC(t->password, strlen(t->password), + t->salt, strlen(t->salt), + t->iterations, EVP_sha1(), + 16, key); + if (ret != 1) + errx(1, "PKCS5_PBKDF2_HMAC: %d", ret); + + if (memcmp(t->pbkdf2_128, key, 16) != 0) { + printf("incorrect 128 key\n"); + error++; + } + + ret = PKCS5_PBKDF2_HMAC(t->password, strlen(t->password), + t->salt, strlen(t->salt), + t->iterations, EVP_sha1(), + 32, key); + if (ret != 1) + errx(1, "PKCS5_PBKDF2_HMAC: %d", ret); + + if (memcmp(t->pbkdf2_256, key, 32) != 0) { + printf("incorrect 256 key\n"); + error++; + } + + return error; +} + +int +main(int argc, char **argv) +{ + int ret = 0; + int i; + + for (i = 0; i < sizeof(pkcs5_tests)/sizeof(pkcs5_tests[0]); i++) + ret += test_pkcs5_pbe2(&pkcs5_tests[i]); + + return ret; +} diff --git a/crypto/heimdal/lib/hcrypto/test_rand.c b/crypto/heimdal/lib/hcrypto/test_rand.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_rand.c @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +#include + +#include "rand.h" + + +/* + * + */ + +static int version_flag; +static int help_flag; +static int len = 1024 * 1024; +static char *rand_method; +static char *filename; + +static struct getargs args[] = { + { "length", 0, arg_integer, &len, + "length", NULL }, + { "file", 0, arg_string, &filename, + "file name", NULL }, + { "method", 0, arg_string, &rand_method, + "method", NULL }, + { "version", 0, arg_flag, &version_flag, + "print version", NULL }, + { "help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +/* + * + */ + +/* + * + */ + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(args[0]), + NULL, + ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + int idx = 0; + char *buffer; + char path[MAXPATHLEN]; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) + usage(1); + + if (help_flag) + usage(0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + if (argc != idx) + usage(1); + + buffer = emalloc(len); + + if (rand_method) { + if (0) { + } +#ifndef NO_RAND_FORTUNA_METHOD + else if (strcasecmp(rand_method, "fortuna") == 0) + RAND_set_rand_method(RAND_fortuna_method()); +#endif +#ifndef NO_RAND_UNIX_METHOD + else if (strcasecmp(rand_method, "unix") == 0) + RAND_set_rand_method(RAND_unix_method()); +#endif +#ifdef WIN32 + else if (strcasecmp(rand_method, "w32crypto") == 0) + RAND_set_rand_method(RAND_w32crypto_method()); +#endif + else + errx(1, "unknown method %s", rand_method); + } + + if (RAND_file_name(path, sizeof(path)) == NULL) + errx(1, "RAND_file_name failed"); + + if (RAND_status() != 1) + errx(1, "random not ready yet"); + + if (RAND_bytes(buffer, len) != 1) + errx(1, "RAND_bytes"); + + if (filename) + rk_dumpdata(filename, buffer, len); + + /* head vs tail */ + if (len >= 100000) { + unsigned bytes[256]; + unsigned bits[8]; + size_t bit, i; + double res; + double slen = sqrt((double)len); + + memset(bits, 0, sizeof(bits)); + memset(bytes, 0, sizeof(bytes)); + + for (i = 0; i < len; i++) { + unsigned char c = ((unsigned char *)buffer)[i]; + + bytes[c]++; + + for (bit = 0; bit < 8 && c; bit++) { + if (c & 1) + bits[bit]++; + c = c >> 1; + } + } + + /* + * The count for each bit value has a mean of n*p = len/2, + * and a standard deviation of sqrt(n*p*q) ~ sqrt(len/4). + * Normalizing by dividing by "n*p", we get a mean of 1 and + * a standard deviation of sqrt(q/n*p) = 1/sqrt(len). + * + * A 5.33-sigma event happens 1 time in 10 million. + * A 5.73-sigma event happens 1 time in 100 million. + * A 6.11-sigma event happens 1 time in 1000 million. + * + * We tolerate 5.33-sigma events (we have 8 not entirely + * independent chances of skewed results) and want to fail + * with a good RNG less often than 1 time in million. + */ + for (bit = 0; bit < 8; bit++) { + res = slen * fabs(1.0 - 2 * (double)bits[bit] / len); + if (res > 5.33) + errx(1, "head%d vs tail%d: %.1f-sigma (%d of %d)", + (int)bit, (int)bit, res, bits[bit], len); + printf("head vs tails bit%d: %f-sigma\n", (int)bit, res); + } + + /* + * The count of each byte value has a mean of n*p = len/256, + * and a standard deviation of sqrt(n*p*q) ~ sqrt(len/256). + * Normalizing by dividing by "n*p", we get a mean of 1 and + * a standard deviation of sqrt(q/n*p) ~ 16/sqrt(len). + * + * We tolerate 5.73-sigma events (we have 256 not entirely + * independent chances of skewed results). Note, for example, + * a 5.2-sigma event was observed in ~5,000 runs. + */ + for (i = 0; i < 256; i++) { + res = (slen / 16) * fabs(1.0 - 256 * (double)bytes[i] / len); + if (res > 5.73) + errx(1, "byte %d: %.1f-sigma (%d of %d)", + (int) i, res, bytes[i], len); + printf("byte %d: %f-sigma\n", (int)i, res); + } + } + + free(buffer); + + /* test write random file */ + { + static const char *file = "test.file"; + if (RAND_write_file(file) != 1) + errx(1, "RAND_write_file"); + if (RAND_load_file(file, 1024) != 1) + errx(1, "RAND_load_file"); + unlink(file); + } + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/test_rsa.c b/crypto/heimdal/lib/hcrypto/test_rsa.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/test_rsa.c @@ -0,0 +1,395 @@ +/* + * Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include + +#include +#include + +/* + * + */ + +static int version_flag; +static int help_flag; +static int time_keygen; +static char *time_key; +static int key_blinding = 1; +static char *rsa_key; +static char *id_flag; +static int loops = 1; + +static struct getargs args[] = { + { "loops", 0, arg_integer, &loops, + "number of loops", "loops" }, + { "id", 0, arg_string, &id_flag, + "selects the engine id", "engine-id" }, + { "time-keygen", 0, arg_flag, &time_keygen, + "time rsa generation", NULL }, + { "time-key", 0, arg_string, &time_key, + "rsa key file", NULL }, + { "key-blinding", 0, arg_negative_flag, &key_blinding, + "key blinding", NULL }, + { "key", 0, arg_string, &rsa_key, + "rsa key file", NULL }, + { "version", 0, arg_flag, &version_flag, + "print version", NULL }, + { "help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +/* + * + */ + +static void +check_rsa(const unsigned char *in, size_t len, RSA *rsa, int padding) +{ + unsigned char *res, *res2; + unsigned int len2; + int keylen; + + res = malloc(RSA_size(rsa)); + if (res == NULL) + errx(1, "res: ENOMEM"); + + res2 = malloc(RSA_size(rsa)); + if (res2 == NULL) + errx(1, "res2: ENOMEM"); + + /* signing */ + + keylen = RSA_private_encrypt(len, in, res, rsa, padding); + if (keylen <= 0) + errx(1, "failed to private encrypt: %d %d", (int)len, (int)keylen); + + if (keylen > RSA_size(rsa)) + errx(1, "keylen > RSA_size(rsa)"); + + keylen = RSA_public_decrypt(keylen, res, res2, rsa, padding); + if (keylen <= 0) + errx(1, "failed to public decrypt: %d", (int)keylen); + + if (keylen != len) + errx(1, "output buffer not same length: %d", (int)keylen); + + if (memcmp(res2, in, len) != 0) + errx(1, "string not the same after decryption"); + + /* encryption */ + + keylen = RSA_public_encrypt(len, in, res, rsa, padding); + if (keylen <= 0) + errx(1, "failed to public encrypt: %d", (int)keylen); + + if (keylen > RSA_size(rsa)) + errx(1, "keylen > RSA_size(rsa)"); + + keylen = RSA_private_decrypt(keylen, res, res2, rsa, padding); + if (keylen <= 0) + errx(1, "failed to private decrypt: %d", (int)keylen); + + if (keylen != len) + errx(1, "output buffer not same length: %d", (int)keylen); + + if (memcmp(res2, in, len) != 0) + errx(1, "string not the same after decryption"); + + len2 = keylen; + + if (RSA_sign(NID_sha1, in, len, res, &len2, rsa) != 1) + errx(1, "RSA_sign failed"); + + if (RSA_verify(NID_sha1, in, len, res, len2, rsa) != 1) + errx(1, "RSA_verify failed"); + + free(res); + free(res2); +} + +static int +cb_func(int a, int b, BN_GENCB *c) +{ + return 1; +} + +static RSA * +read_key(ENGINE *engine, const char *keyfile) +{ + unsigned char buf[1024 * 4]; + const unsigned char *p; + size_t size; + RSA *rsa; + FILE *f; + + f = fopen(keyfile, "rb"); + if (f == NULL) + err(1, "could not open file %s", keyfile); + rk_cloexec_file(f); + + size = fread(buf, 1, sizeof(buf), f); + fclose(f); + if (size == 0) + err(1, "failed to read file %s", keyfile); + if (size == sizeof(buf)) + err(1, "key too long in file %s!", keyfile); + + p = buf; + rsa = d2i_RSAPrivateKey(NULL, &p, size); + if (rsa == NULL) + err(1, "failed to parse key in file %s", keyfile); + + RSA_set_method(rsa, ENGINE_get_RSA(engine)); + + if (!key_blinding) + rsa->flags |= RSA_FLAG_NO_BLINDING; + + return rsa; +} + +/* + * + */ + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + "filename.so"); + exit (ret); +} + +int +main(int argc, char **argv) +{ + ENGINE *engine = NULL; + int i, j, idx = 0; + RSA *rsa; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &idx)) + usage(1); + + if (help_flag) + usage(0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= idx; + argv += idx; + + OpenSSL_add_all_algorithms(); +#ifdef OPENSSL + ENGINE_load_openssl(); +#endif + ENGINE_load_builtin_engines(); + + if (argc == 0) { + engine = ENGINE_by_id("builtin"); + } else { + engine = ENGINE_by_id(argv[0]); + if (engine == NULL) + engine = ENGINE_by_dso(argv[0], id_flag); + } + if (engine == NULL) + errx(1, "ENGINE_by_dso failed"); + + if (ENGINE_get_RSA(engine) == NULL) + return 77; + + printf("rsa %s\n", ENGINE_get_RSA(engine)->name); + + if (RAND_status() != 1) + errx(77, "no functional random device, refusing to run tests"); + + if (time_keygen) { + struct timeval tv1, tv2; + BIGNUM *e; + + rsa = RSA_new_method(engine); + if (!key_blinding) + rsa->flags |= RSA_FLAG_NO_BLINDING; + + e = BN_new(); + BN_set_word(e, 0x10001); + + printf("running keygen with %d loops\n", loops); + + gettimeofday(&tv1, NULL); + + for (i = 0; i < loops; i++) { + rsa = RSA_new_method(engine); + if (RSA_generate_key_ex(rsa, 1024, e, NULL) != 1) + errx(1, "RSA_generate_key_ex"); + RSA_free(rsa); + } + + gettimeofday(&tv2, NULL); + timevalsub(&tv2, &tv1); + + printf("time %lu.%06lu\n", + (unsigned long)tv2.tv_sec, + (unsigned long)tv2.tv_usec); + + BN_free(e); + ENGINE_finish(engine); + + return 0; + } + + if (time_key) { + const int size = 20; + struct timeval tv1, tv2; + unsigned char *p; + + if (strcmp(time_key, "generate") == 0) { + BIGNUM *e; + + rsa = RSA_new_method(engine); + if (!key_blinding) + rsa->flags |= RSA_FLAG_NO_BLINDING; + + e = BN_new(); + BN_set_word(e, 0x10001); + + if (RSA_generate_key_ex(rsa, 1024, e, NULL) != 1) + errx(1, "RSA_generate_key_ex"); + } else { + rsa = read_key(engine, time_key); + } + + p = emalloc(loops * size); + + RAND_bytes(p, loops * size); + + gettimeofday(&tv1, NULL); + for (i = 0; i < loops; i++) + check_rsa(p + (i * size), size, rsa, RSA_PKCS1_PADDING); + gettimeofday(&tv2, NULL); + + timevalsub(&tv2, &tv1); + + printf("time %lu.%06lu\n", + (unsigned long)tv2.tv_sec, + (unsigned long)tv2.tv_usec); + + RSA_free(rsa); + ENGINE_finish(engine); + + return 0; + } + + if (rsa_key) { + rsa = read_key(engine, rsa_key); + + /* + * Assuming that you use the RSA key in the distribution, this + * test will generate a signature have a starting zero and thus + * will generate a checksum that is 127 byte instead of the + * checksum that is 128 byte (like the key). + */ + { + const unsigned char sha1[20] = { + 0x6d, 0x33, 0xf9, 0x40, 0x75, 0x5b, 0x4e, 0xc5, 0x90, 0x35, + 0x48, 0xab, 0x75, 0x02, 0x09, 0x76, 0x9a, 0xb4, 0x7d, 0x6b + }; + + check_rsa(sha1, sizeof(sha1), rsa, RSA_PKCS1_PADDING); + } + + for (i = 0; i < 128; i++) { + unsigned char sha1[20]; + + RAND_bytes(sha1, sizeof(sha1)); + check_rsa(sha1, sizeof(sha1), rsa, RSA_PKCS1_PADDING); + } + for (i = 0; i < 128; i++) { + unsigned char des3[21]; + + RAND_bytes(des3, sizeof(des3)); + check_rsa(des3, sizeof(des3), rsa, RSA_PKCS1_PADDING); + } + for (i = 0; i < 128; i++) { + unsigned char aes[32]; + + RAND_bytes(aes, sizeof(aes)); + check_rsa(aes, sizeof(aes), rsa, RSA_PKCS1_PADDING); + } + + RSA_free(rsa); + } + + for (i = 0; i < loops; i++) { + BN_GENCB cb; + BIGNUM *e; + unsigned int n; + + rsa = RSA_new_method(engine); + if (!key_blinding) + rsa->flags |= RSA_FLAG_NO_BLINDING; + + e = BN_new(); + BN_set_word(e, 0x10001); + + BN_GENCB_set(&cb, cb_func, NULL); + + RAND_bytes(&n, sizeof(n)); + n &= 0x1ff; + n += 1024; + + if (RSA_generate_key_ex(rsa, n, e, &cb) != 1) + errx(1, "RSA_generate_key_ex"); + + BN_free(e); + + for (j = 0; j < 8; j++) { + unsigned char sha1[20]; + RAND_bytes(sha1, sizeof(sha1)); + check_rsa(sha1, sizeof(sha1), rsa, RSA_PKCS1_PADDING); + } + + RSA_free(rsa); + } + + ENGINE_finish(engine); + + return 0; +} diff --git a/crypto/heimdal/lib/hcrypto/ui.h b/crypto/heimdal/lib/hcrypto/ui.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/ui.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef _HEIM_UI_H +#define _HEIM_UI_H 1 + +/* symbol renaming */ +#define UI_UTIL_read_pw_string hc_UI_UTIL_read_pw_string + +/* OpenSSL API extensions */ +#define UI_UTIL_FLAG_VERIFY 0x1 /* ask to verify password */ +#define UI_UTIL_FLAG_VERIFY_SILENT 0x2 /* silence on verify failure */ + +int UI_UTIL_read_pw_string(char *, int, const char *, int); /* XXX */ + +#endif /* _HEIM_UI_H */ + diff --git a/crypto/heimdal/lib/hcrypto/ui.c b/crypto/heimdal/lib/hcrypto/ui.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/ui.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 1997 - 2000, 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#ifdef HAVE_TERMIOS_H +#include +#endif + +#include +#ifdef HAVE_CONIO_H +#include +#endif + +static sig_atomic_t intr_flag; + +static void +intr(int sig) +{ + intr_flag++; +} + +#ifdef HAVE_CONIO_H + +/* + * Windows does console slightly different then then unix case. + */ + +static int +read_string(const char *preprompt, const char *prompt, + char *buf, size_t len, int echo) +{ + int of = 0; + int c; + char *p; + void (*oldsigintr)(int); + + _cprintf("%s%s", preprompt, prompt); + + oldsigintr = signal(SIGINT, intr); + + p = buf; + while(intr_flag == 0){ + c = ((echo)? _getche(): _getch()); + if(c == '\n' || c == '\r') + break; + if(of == 0) + *p++ = c; + of = (p == buf + len); + } + if(of) + p--; + *p = 0; + + if(echo == 0){ + printf("\n"); + } + + signal(SIGINT, oldsigintr); + + if(intr_flag) + return -2; + if(of) + return -1; + return 0; +} + +#else /* !HAVE_CONIO_H */ + +#ifndef NSIG +#define NSIG 47 +#endif + +static int +read_string(const char *preprompt, const char *prompt, + char *buf, size_t len, int echo) +{ + struct sigaction sigs[NSIG]; + int oksigs[NSIG]; + struct sigaction sa; + FILE *tty; + int ret = 0; + int of = 0; + int i; + int c; + char *p; + + struct termios t_new, t_old; + + memset(&oksigs, 0, sizeof(oksigs)); + + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = intr; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++) + if (i != SIGALRM) + if (sigaction(i, &sa, &sigs[i]) == 0) + oksigs[i] = 1; + + if((tty = fopen("/dev/tty", "r")) != NULL) + rk_cloexec_file(tty); + else + tty = stdin; + + fprintf(stderr, "%s%s", preprompt, prompt); + fflush(stderr); + + if(echo == 0){ + tcgetattr(fileno(tty), &t_old); + memcpy(&t_new, &t_old, sizeof(t_new)); + t_new.c_lflag &= ~ECHO; + tcsetattr(fileno(tty), TCSANOW, &t_new); + } + intr_flag = 0; + p = buf; + while(intr_flag == 0){ + c = getc(tty); + if(c == EOF){ + if(!ferror(tty)) + ret = 1; + break; + } + if(c == '\n') + break; + if(of == 0) + *p++ = c; + of = (p == buf + len); + } + if(of) + p--; + *p = 0; + + if(echo == 0){ + fprintf(stderr, "\n"); + tcsetattr(fileno(tty), TCSANOW, &t_old); + } + + if(tty != stdin) + fclose(tty); + + for(i = 1; i < sizeof(sigs) / sizeof(sigs[0]); i++) + if (oksigs[i]) + sigaction(i, &sigs[i], NULL); + + if(ret) + return -3; + if(intr_flag) + return -2; + if(of) + return -1; + return 0; +} + +#endif /* HAVE_CONIO_H */ + +int +UI_UTIL_read_pw_string(char *buf, int length, const char *prompt, int verify) +{ + int ret; + + ret = read_string("", prompt, buf, length, 0); + if (ret) + return ret; + + if (verify & UI_UTIL_FLAG_VERIFY) { + char *buf2; + buf2 = malloc(length); + if (buf2 == NULL) + return 1; + + ret = read_string("Verify password - ", prompt, buf2, length, 0); + if (ret) { + free(buf2); + return ret; + } + if (strcmp(buf2, buf) != 0) { + if (!(verify & UI_UTIL_FLAG_VERIFY_SILENT)) { + fprintf(stderr, "Verify failure\n"); + fflush(stderr); + } + ret = 1; + } + free(buf2); + } + return ret; +} diff --git a/crypto/heimdal/lib/hcrypto/undef.h b/crypto/heimdal/lib/hcrypto/undef.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/undef.h @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef HEIM_UNDEF_H +#define HEIM_UNDEF_H 1 + +#undef BIGNUM +#undef BN_CTX +#undef BN_BLINDING +#undef BN_MONT_CTX +#undef BN_GENCB +#undef DH +#undef DH_METHOD +#undef DSA +#undef DSA_METHOD +#undef RSA +#undef RSA_METHOD +#undef RAND_METHOD +#undef ENGINE +#undef BN_GENCB_call +#undef BN_GENCB_set +#undef BN_CTX_new +#undef BN_CTX_free +#undef BN_CTX_start +#undef BN_CTX_get +#undef BN_CTX_end +#undef BN_is_negative +#undef BN_rand +#undef BN_num_bits +#undef BN_num_bytes +#undef BN_new +#undef BN_clear_free +#undef BN_bin2bn +#undef BN_bn2bin +#undef BN_uadd +#undef BN_set_negative +#undef BN_set_word +#undef BN_get_word +#undef BN_cmp +#undef BN_free +#undef BN_is_bit_set +#undef BN_clear +#undef BN_dup +#undef BN_set_bit +#undef BN_clear_bit +#undef BN_bn2hex +#undef BN_hex2bn +#undef EVP_CIPHER_CTX_block_size +#undef EVP_CIPHER_CTX_cipher +#undef EVP_CIPHER_CTX_cleanup +#undef EVP_CIPHER_CTX_flags +#undef EVP_CIPHER_CTX_get_app_data +#undef EVP_CIPHER_CTX_init +#undef EVP_CIPHER_CTX_iv_length +#undef EVP_CIPHER_CTX_key_length +#undef EVP_CIPHER_CTX_mode +#undef EVP_CIPHER_CTX_set_app_data +#undef EVP_CIPHER_CTX_set_key_length +#undef EVP_CIPHER_CTX_set_padding +#undef EVP_CIPHER_block_size +#undef EVP_CIPHER_iv_length +#undef EVP_CIPHER_key_length +#undef EVP_Cipher +#undef EVP_CipherInit_ex +#undef EVP_CipherUpdate +#undef EVP_CipherFinal_ex +#undef EVP_Digest +#undef EVP_DigestFinal_ex +#undef EVP_DigestInit_ex +#undef EVP_DigestUpdate +#undef EVP_MD_CTX_block_size +#undef EVP_MD_CTX_cleanup +#undef EVP_MD_CTX_create +#undef EVP_MD_CTX_init +#undef EVP_MD_CTX_destroy +#undef EVP_MD_CTX_md +#undef EVP_MD_CTX_size +#undef EVP_MD_block_size +#undef EVP_MD_size +#undef EVP_aes_128_cbc +#undef EVP_aes_192_cbc +#undef EVP_aes_256_cbc +#undef EVP_aes_128_cfb8 +#undef EVP_aes_192_cfb8 +#undef EVP_aes_256_cfb8 +#undef EVP_des_cbc +#undef EVP_des_ede3_cbc +#undef EVP_enc_null +#undef EVP_md4 +#undef EVP_md5 +#undef EVP_md_null +#undef EVP_rc2_40_cbc +#undef EVP_rc2_64_cbc +#undef EVP_rc2_cbc +#undef EVP_rc4 +#undef EVP_rc4_40 +#undef EVP_camellia_128_cbc +#undef EVP_camellia_192_cbc +#undef EVP_camellia_256_cbc +#undef EVP_sha +#undef EVP_sha1 +#undef EVP_sha256 +#undef EVP_sha384 +#undef EVP_sha512 +#undef PKCS5_PBKDF2_HMAC +#undef PKCS5_PBKDF2_HMAC_SHA1 +#undef EVP_BytesToKey +#undef EVP_get_cipherbyname +#undef OpenSSL_add_all_algorithms +#undef OpenSSL_add_all_algorithms_conf +#undef OpenSSL_add_all_algorithms_noconf +#undef EVP_CIPHER_CTX_ctrl +#undef EVP_CIPHER_CTX_rand_key +#undef hcrypto_validate +#undef EVP_MD_CTX +#undef EVP_PKEY +#undef EVP_MD +#undef EVP_CIPHER +#undef EVP_CIPHER_CTX +#undef EVP_CIPH_STREAM_CIPHER +#undef EVP_CIPH_CBC_MODE +#undef EVP_CIPH_CFB8_MODE +#undef EVP_CIPH_MODE +#undef EVP_CIPH_CTRL_INIT +#undef EVP_CTRL_INIT +#undef EVP_CIPH_VARIABLE_LENGTH +#undef EVP_CIPH_ALWAYS_CALL_INIT +#undef EVP_CIPH_RAND_KEY +#undef EVP_CTRL_RAND_KEY +#undef NID_md4 +#undef NID_md5 +#undef NID_sha1 +#undef NID_sha256 +#undef NID_sha384 +#undef NID_sha512 + +#endif /* HEIM_UNDEF_H */ diff --git a/crypto/heimdal/lib/hcrypto/validate.c b/crypto/heimdal/lib/hcrypto/validate.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/validate.c @@ -0,0 +1,306 @@ +/* + * Copyright (c) 2010 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#include +#include +#include + +struct tests { + const EVP_CIPHER *(*cipher)(void); + const char *name; + void *key; + size_t keysize; + void *iv; + size_t datasize; + void *indata; + void *outdata; + void *outiv; +}; + +static struct tests hc_tests[] = { + { + EVP_aes_256_cbc, + "aes-256", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 32, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\xdc\x95\xc0\x78\xa2\x40\x89\x89\xad\x48\xa2\x14\x92\x84\x20\x87", + NULL + }, +#if 0 + { + EVP_aes_128_cfb8, + "aes-cfb8-128", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\x66\xe9\x4b\xd4\xef\x8a\x2c\x3b\x88\x4c\xfa\x59\xca\x34\x2b\x2e" + }, +#endif + { + EVP_des_ede3_cbc, + "des-ede3", + "\x19\x17\xff\xe6\xbb\x77\x2e\xfc" + "\x29\x76\x43\xbc\x63\x56\x7e\x9a" + "\x00\x2e\x4d\x43\x1d\x5f\xfd\x58", + 24, + "\xbf\x9a\x12\xb7\x26\x69\xfd\x05", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\x55\x95\x97\x76\xa9\x6c\x66\x40\x64\xc7\xf4\x1c\x21\xb7\x14\x1b", + NULL + }, +#if 0 + { + EVP_camellia_128_cbc, + "camellia128", + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + 16, + "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + "\x07\x92\x3A\x39\xEB\x0A\x81\x7D\x1C\x4D\x87\xBD\xB8\x2D\x1F\x1C", + NULL + }, +#endif + { + EVP_rc4, + "rc4 8", + "\x01\x23\x45\x67\x89\xAB\xCD\xEF", + 8, + NULL, + 8, + "\x00\x00\x00\x00\x00\x00\x00\x00", + "\x74\x94\xC2\xE7\x10\x4B\x08\x79", + NULL + }, + { + EVP_rc4, + "rc4 5", + "\x61\x8a\x63\xd2\xfb", + 5, + NULL, + 5, + "\xdc\xee\x4c\xf9\x2c", + "\xf1\x38\x29\xc9\xde", + NULL + }, + { + EVP_rc4, + "rc4 309", + "\x29\x04\x19\x72\xfb\x42\xba\x5f\xc7\x12\x77\x12\xf1\x38\x29\xc9", + 16, + NULL, + 309, + "\x52\x75\x69\x73\x6c\x69\x6e\x6e" + "\x75\x6e\x20\x6c\x61\x75\x6c\x75" + "\x20\x6b\x6f\x72\x76\x69\x73\x73" + "\x73\x61\x6e\x69\x2c\x20\x74\xe4" + "\x68\x6b\xe4\x70\xe4\x69\x64\x65" + "\x6e\x20\x70\xe4\xe4\x6c\x6c\xe4" + "\x20\x74\xe4\x79\x73\x69\x6b\x75" + "\x75\x2e\x20\x4b\x65\x73\xe4\x79" + "\xf6\x6e\x20\x6f\x6e\x20\x6f\x6e" + "\x6e\x69\x20\x6f\x6d\x61\x6e\x61" + "\x6e\x69\x2c\x20\x6b\x61\x73\x6b" + "\x69\x73\x61\x76\x75\x75\x6e\x20" + "\x6c\x61\x61\x6b\x73\x6f\x74\x20" + "\x76\x65\x72\x68\x6f\x75\x75\x2e" + "\x20\x45\x6e\x20\x6d\x61\x20\x69" + "\x6c\x6f\x69\x74\x73\x65\x2c\x20" + "\x73\x75\x72\x65\x20\x68\x75\x6f" + "\x6b\x61\x61\x2c\x20\x6d\x75\x74" + "\x74\x61\x20\x6d\x65\x74\x73\xe4" + "\x6e\x20\x74\x75\x6d\x6d\x75\x75" + "\x73\x20\x6d\x75\x6c\x6c\x65\x20" + "\x74\x75\x6f\x6b\x61\x61\x2e\x20" + "\x50\x75\x75\x6e\x74\x6f\x20\x70" + "\x69\x6c\x76\x65\x6e\x2c\x20\x6d" + "\x69\x20\x68\x75\x6b\x6b\x75\x75" + "\x2c\x20\x73\x69\x69\x6e\x74\x6f" + "\x20\x76\x61\x72\x61\x6e\x20\x74" + "\x75\x75\x6c\x69\x73\x65\x6e\x2c" + "\x20\x6d\x69\x20\x6e\x75\x6b\x6b" + "\x75\x75\x2e\x20\x54\x75\x6f\x6b" + "\x73\x75\x74\x20\x76\x61\x6e\x61" + "\x6d\x6f\x6e\x20\x6a\x61\x20\x76" + "\x61\x72\x6a\x6f\x74\x20\x76\x65" + "\x65\x6e\x2c\x20\x6e\x69\x69\x73" + "\x74\xe4\x20\x73\x79\x64\xe4\x6d" + "\x65\x6e\x69\x20\x6c\x61\x75\x6c" + "\x75\x6e\x20\x74\x65\x65\x6e\x2e" + "\x20\x2d\x20\x45\x69\x6e\x6f\x20" + "\x4c\x65\x69\x6e\x6f", + "\x35\x81\x86\x99\x90\x01\xe6\xb5" + "\xda\xf0\x5e\xce\xeb\x7e\xee\x21" + "\xe0\x68\x9c\x1f\x00\xee\xa8\x1f" + "\x7d\xd2\xca\xae\xe1\xd2\x76\x3e" + "\x68\xaf\x0e\xad\x33\xd6\x6c\x26" + "\x8b\xc9\x46\xc4\x84\xfb\xe9\x4c" + "\x5f\x5e\x0b\x86\xa5\x92\x79\xe4" + "\xf8\x24\xe7\xa6\x40\xbd\x22\x32" + "\x10\xb0\xa6\x11\x60\xb7\xbc\xe9" + "\x86\xea\x65\x68\x80\x03\x59\x6b" + "\x63\x0a\x6b\x90\xf8\xe0\xca\xf6" + "\x91\x2a\x98\xeb\x87\x21\x76\xe8" + "\x3c\x20\x2c\xaa\x64\x16\x6d\x2c" + "\xce\x57\xff\x1b\xca\x57\xb2\x13" + "\xf0\xed\x1a\xa7\x2f\xb8\xea\x52" + "\xb0\xbe\x01\xcd\x1e\x41\x28\x67" + "\x72\x0b\x32\x6e\xb3\x89\xd0\x11" + "\xbd\x70\xd8\xaf\x03\x5f\xb0\xd8" + "\x58\x9d\xbc\xe3\xc6\x66\xf5\xea" + "\x8d\x4c\x79\x54\xc5\x0c\x3f\x34" + "\x0b\x04\x67\xf8\x1b\x42\x59\x61" + "\xc1\x18\x43\x07\x4d\xf6\x20\xf2" + "\x08\x40\x4b\x39\x4c\xf9\xd3\x7f" + "\xf5\x4b\x5f\x1a\xd8\xf6\xea\x7d" + "\xa3\xc5\x61\xdf\xa7\x28\x1f\x96" + "\x44\x63\xd2\xcc\x35\xa4\xd1\xb0" + "\x34\x90\xde\xc5\x1b\x07\x11\xfb" + "\xd6\xf5\x5f\x79\x23\x4d\x5b\x7c" + "\x76\x66\x22\xa6\x6d\xe9\x2b\xe9" + "\x96\x46\x1d\x5e\x4d\xc8\x78\xef" + "\x9b\xca\x03\x05\x21\xe8\x35\x1e" + "\x4b\xae\xd2\xfd\x04\xf9\x46\x73" + "\x68\xc4\xad\x6a\xc1\x86\xd0\x82" + "\x45\xb2\x63\xa2\x66\x6d\x1f\x6c" + "\x54\x20\xf1\x59\x9d\xfd\x9f\x43" + "\x89\x21\xc2\xf5\xa4\x63\x93\x8c" + "\xe0\x98\x22\x65\xee\xf7\x01\x79" + "\xbc\x55\x3f\x33\x9e\xb1\xa4\xc1" + "\xaf\x5f\x6a\x54\x7f", + NULL + } +}; + +static int +test_cipher(struct tests *t) +{ + const EVP_CIPHER *c = t->cipher(); + EVP_CIPHER_CTX ectx; + EVP_CIPHER_CTX dctx; + void *d; + + EVP_CIPHER_CTX_init(&ectx); + EVP_CIPHER_CTX_init(&dctx); + + if (EVP_CipherInit_ex(&ectx, c, NULL, NULL, NULL, 1) != 1) + errx(1, "%s: EVP_CipherInit_ex einit", t->name); + if (EVP_CipherInit_ex(&dctx, c, NULL, NULL, NULL, 0) != 1) + errx(1, "%s: EVP_CipherInit_ex dinit", t->name); + + EVP_CIPHER_CTX_set_key_length(&ectx, t->keysize); + EVP_CIPHER_CTX_set_key_length(&dctx, t->keysize); + + if (EVP_CipherInit_ex(&ectx, NULL, NULL, t->key, t->iv, 1) != 1) + errx(1, "%s: EVP_CipherInit_ex encrypt", t->name); + if (EVP_CipherInit_ex(&dctx, NULL, NULL, t->key, t->iv, 0) != 1) + errx(1, "%s: EVP_CipherInit_ex decrypt", t->name); + + d = emalloc(t->datasize); + + if (!EVP_Cipher(&ectx, d, t->indata, t->datasize)) + return 1; + + if (memcmp(d, t->outdata, t->datasize) != 0) + errx(1, "%s: encrypt not the same", t->name); + + if (!EVP_Cipher(&dctx, d, d, t->datasize)) + return 1; + + if (memcmp(d, t->indata, t->datasize) != 0) + errx(1, "%s: decrypt not the same", t->name); + +#if 0 + if (t->outiv) + /* XXXX check */; +#endif + + EVP_CIPHER_CTX_cleanup(&ectx); + EVP_CIPHER_CTX_cleanup(&dctx); + free(d); + + return 0; +} + +static void +check_hmac(void) +{ + unsigned char buf[4] = { 0, 0, 0, 0 }; + char hmackey[] = "hello-world"; + size_t hmackey_size = sizeof(hmackey); + unsigned int hmaclen; + unsigned char hmac[EVP_MAX_MD_SIZE]; + HMAC_CTX c; + + char answer[20] = "\x2c\xfa\x32\xb7\x2b\x8a\xf6\xdf\xcf\xda" + "\x6f\xd1\x52\x4d\x54\x58\x73\x0f\xf3\x24"; + + HMAC_CTX_init(&c); + HMAC_Init_ex(&c, hmackey, hmackey_size, EVP_sha1(), NULL); + HMAC_Update(&c, buf, sizeof(buf)); + HMAC_Final(&c, hmac, &hmaclen); + HMAC_CTX_cleanup(&c); + + if (hmaclen != 20) + errx(1, "hmaclen = %d\n", (int)hmaclen); + + if (ct_memcmp(hmac, answer, hmaclen) != 0) + errx(1, "wrong answer\n"); +} + +void +hcrypto_validate(void) +{ + static int validated = 0; + unsigned int i; + + /* its ok to run this twice, do don't check for races */ + if (validated) + return; + validated++; + + for (i = 0; i < sizeof(hc_tests) / sizeof(hc_tests[0]); i++) + test_cipher(&hc_tests[i]); + + check_hmac(); +} diff --git a/crypto/heimdal/lib/hcrypto/version-script.map b/crypto/heimdal/lib/hcrypto/version-script.map new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hcrypto/version-script.map @@ -0,0 +1,329 @@ +# $Id$ + +HEIMDAL_CRYPTO_1.0 { + global: + hc_AES_cbc_encrypt; + hc_AES_cfb8_encrypt; + hc_AES_decrypt; + hc_AES_decrypt_key; + hc_BN_CTX_end; + hc_BN_CTX_free; + hc_BN_CTX_get; + hc_BN_CTX_new; + hc_BN_CTX_start; + hc_AES_encrypt; + hc_AES_set_encrypt_key; + hc_BN_GENCB_call; + hc_BN_GENCB_set; + hc_BN_bin2bn; + hc_BN_bn2bin; + hc_BN_bn2hex; + hc_BN_clear; + hc_BN_clear_bit; + hc_BN_clear_free; + hc_BN_cmp; + hc_BN_dup; + hc_BN_free; + hc_BN_get_word; + hc_BN_hex2bn; + hc_BN_is_bit_set; + hc_BN_is_negative; + hc_BN_new; + hc_BN_num_bits; + hc_BN_num_bytes; + hc_BN_rand; + hc_BN_set_bit; + hc_BN_set_negative; + hc_BN_set_word; + hc_BN_uadd; + hc_DES_cbc_cksum; + hc_DES_cbc_encrypt; + hc_DES_cfb64_encrypt; + hc_DES_check_key_parity; + hc_DES_ecb3_encrypt; + hc_DES_ecb_encrypt; + hc_DES_ede3_cbc_encrypt; + hc_DES_encrypt; + hc_DES_generate_random_block; + hc_DES_init_random_number_generator; + hc_DES_is_weak_key; + hc_DES_key_sched; + hc_DES_mem_rand8; + hc_DES_new_random_key; + hc_DES_pcbc_encrypt; + hc_DES_rand_data; + hc_DES_rand_data_key; + hc_DES_random_key; + hc_DES_read_password; + hc_DES_set_key; + hc_DES_set_key_checked; + hc_DES_set_key_unchecked; + hc_DES_set_odd_parity; + hc_DES_set_random_generator_seed; + hc_DES_set_sequence_number; + hc_DES_string_to_key; + hc_DH_check_pubkey; + hc_DH_compute_key; + hc_DH_free; + hc_DH_generate_key; + hc_DH_generate_parameters_ex; + hc_DH_get_default_method; + hc_DH_get_ex_data; + hc_DH_ltm_method; + hc_DH_gmp_method; + hc_DH_new; + hc_DH_new_method; + hc_DH_null_method; + hc_DH_set_default_method; + hc_DH_set_ex_data; + hc_DH_set_method; + hc_DH_size; + hc_DH_up_ref; + hc_DSA_free; + hc_DSA_get_default_method; + hc_DSA_new; + hc_DSA_null_method; + hc_DSA_set_default_method; + hc_DSA_up_ref; + hc_DSA_verify; + hc_ENGINE_new; + hc_ENGINE_free; + hc_ENGINE_add_conf_module; + hc_ENGINE_by_dso; + hc_ENGINE_by_id; + hc_ENGINE_finish; + hc_ENGINE_get_DH; + hc_ENGINE_get_RAND; + hc_ENGINE_get_RSA; + hc_ENGINE_get_default_DH; + hc_ENGINE_get_default_RSA; + hc_ENGINE_get_id; + hc_ENGINE_get_name; + hc_ENGINE_load_builtin_engines; + hc_ENGINE_set_DH; + hc_ENGINE_set_RSA; + hc_ENGINE_set_default_DH; + hc_ENGINE_set_default_RSA; + hc_ENGINE_set_destroy_function; + hc_ENGINE_set_id; + hc_ENGINE_set_name; + hc_ENGINE_up_ref; + hc_EVP_BytesToKey; + hc_EVP_CIPHER_CTX_block_size; + hc_EVP_CIPHER_CTX_cipher; + hc_EVP_CIPHER_CTX_cleanup; + hc_EVP_CIPHER_CTX_flags; + hc_EVP_CIPHER_CTX_get_app_data; + hc_EVP_CIPHER_CTX_init; + hc_EVP_CIPHER_CTX_iv_length; + hc_EVP_CIPHER_CTX_key_length; + hc_EVP_CIPHER_CTX_mode; + hc_EVP_CIPHER_CTX_set_app_data; + hc_EVP_CIPHER_block_size; + hc_EVP_CIPHER_iv_length; + hc_EVP_CIPHER_key_length; + hc_EVP_Cipher; + hc_EVP_CipherInit_ex; + hc_EVP_Digest; + hc_EVP_DigestFinal_ex; + hc_EVP_DigestInit_ex; + hc_EVP_DigestUpdate; + hc_EVP_MD_CTX_block_size; + hc_EVP_MD_CTX_cleanup; + hc_EVP_MD_CTX_cleanup; + hc_EVP_MD_CTX_create; + hc_EVP_MD_CTX_create; + hc_EVP_MD_CTX_destroy; + hc_EVP_MD_CTX_destroy; + hc_EVP_MD_CTX_init; + hc_EVP_MD_CTX_init; + hc_EVP_MD_CTX_md; + hc_EVP_MD_CTX_size; + hc_EVP_MD_block_size; + hc_EVP_MD_size; + hc_EVP_aes_128_cbc; + hc_EVP_aes_192_cbc; + hc_EVP_aes_256_cbc; + hc_EVP_aes_128_cfb8; + hc_EVP_aes_192_cfb8; + hc_EVP_aes_256_cfb8; + hc_EVP_des_cbc; + hc_EVP_des_ede3_cbc; + hc_EVP_camellia_128_cbc; + hc_EVP_camellia_192_cbc; + hc_EVP_camellia_256_cbc; + hc_EVP_enc_null; + hc_EVP_get_cipherbyname; + hc_EVP_md4; + hc_EVP_md5; + hc_EVP_md_null; + hc_EVP_rc2_40_cbc; + hc_EVP_rc2_64_cbc; + hc_EVP_rc2_cbc; + hc_EVP_rc4; + hc_EVP_rc4_40; + hc_EVP_sha; + hc_EVP_sha1; + hc_EVP_sha256; + hc_EVP_sha384; + hc_EVP_sha512; + + hc_EVP_cc_md4; + hc_EVP_cc_md5; + hc_EVP_cc_sha1; + hc_EVP_cc_sha256; + hc_EVP_cc_sha384; + hc_EVP_cc_sha512; + hc_EVP_cc_des_ede3_cbc; + hc_EVP_cc_aes_128_cbc; + hc_EVP_cc_aes_192_cbc; + hc_EVP_cc_aes_256_cbc; + hc_EVP_cc_aes_128_cfb8; + hc_EVP_cc_aes_192_cfb8; + hc_EVP_cc_aes_256_cfb8; + + hc_EVP_hcrypto_md4; + hc_EVP_hcrypto_md5; + hc_EVP_hcrypto_sha1; + hc_EVP_hcrypto_sha256; + hc_EVP_hcrypto_sha384; + hc_EVP_hcrypto_sha512; + hc_EVP_hcrypto_des_ede3_cbc; + hc_EVP_hcrypto_aes_128_cbc; + hc_EVP_hcrypto_aes_192_cbc; + hc_EVP_hcrypto_aes_256_cbc; + hc_EVP_hcrypto_aes_128_cfb8; + hc_EVP_hcrypto_aes_192_cfb8; + hc_EVP_hcrypto_aes_256_cfb8; + hc_EVP_hcrypto_rc4; + hc_EVP_hcrypto_rc4_40; + + hc_EVP_ossl_md4; + hc_EVP_ossl_md5; + hc_EVP_ossl_sha1; + hc_EVP_ossl_sha256; + hc_EVP_ossl_sha384; + hc_EVP_ossl_sha512; + hc_EVP_ossl_des_ede3_cbc; + hc_EVP_ossl_aes_128_cbc; + hc_EVP_ossl_aes_192_cbc; + hc_EVP_ossl_aes_256_cbc; + hc_EVP_ossl_aes_128_cfb8; + hc_EVP_ossl_aes_192_cfb8; + hc_EVP_ossl_aes_256_cfb8; + hc_EVP_ossl_rc2_cbc; + hc_EVP_ossl_rc2_40_cbc; + hc_EVP_ossl_rc4; + hc_EVP_ossl_rc4_40; + + hc_EVP_pkcs11_md4; + hc_EVP_pkcs11_md5; + hc_EVP_pkcs11_sha1; + hc_EVP_pkcs11_sha256; + hc_EVP_pkcs11_des_ede3_cbc; + hc_EVP_pkcs11_aes_128_cbc; + hc_EVP_pkcs11_aes_192_cbc; + hc_EVP_pkcs11_aes_256_cbc; + hc_EVP_pkcs11_aes_128_cfb8; + hc_EVP_pkcs11_aes_192_cfb8; + hc_EVP_pkcs11_aes_256_cfb8; + hc_EVP_pkcs11_rc2_40_cbc; + hc_EVP_pkcs11_rc2_64_cbc; + hc_EVP_pkcs11_rc2_cbc; + hc_EVP_pkcs11_rc4; + hc_EVP_pkcs11_rc4_40; + + hc_EVP_hcrypto_aes_128_cts; + hc_EVP_hcrypto_aes_192_cts; + hc_EVP_hcrypto_aes_256_cts; + hc_HMAC; + hc_HMAC_CTX_cleanup; + hc_HMAC_CTX_init; + hc_HMAC_Final; + hc_HMAC_Init_ex; + hc_HMAC_Update; + hc_HMAC_size; + hc_MD4_Final; + hc_MD4_Init; + hc_MD4_Update; + hc_MD5_Final; + hc_MD5_Init; + hc_MD5_Update; + hc_OpenSSL_add_all_algorithms; + hc_OpenSSL_add_all_algorithms_conf; + hc_OpenSSL_add_all_algorithms_noconf; + hc_PKCS12_key_gen; + hc_PKCS5_PBKDF2_HMAC; + hc_PKCS5_PBKDF2_HMAC_SHA1; + hc_RAND_add; + hc_RAND_bytes; + hc_RAND_cleanup; + hc_RAND_file_name; + hc_RAND_fortuna_method; + hc_RAND_get_rand_method; + hc_RAND_load_file; + hc_RAND_pseudo_bytes; + hc_RAND_seed; + hc_RAND_set_rand_engine; + hc_RAND_set_rand_method; + hc_RAND_status; + hc_RAND_unix_method; + hc_RAND_timer_method; + hc_RAND_write_file; + hc_RC2_cbc_encrypt; + hc_RC2_decryptc; + hc_RC2_encryptc; + hc_RC2_set_key; + hc_RC4; + hc_RC4_set_key; + hc_RSA_check_key; + hc_RSA_free; + hc_RSA_generate_key_ex; + hc_RSA_get_app_data; + hc_RSA_get_default_method; + hc_RSA_get_method; + hc_RSA_new; + hc_RSA_new_method; + hc_RSA_null_method; + hc_RSA_private_decrypt; + hc_RSA_private_encrypt; + hc_RSA_public_decrypt; + hc_RSA_public_encrypt; + hc_RSA_set_app_data; + hc_RSA_set_default_method; + hc_RSA_set_method; + hc_RSA_sign; + hc_RSA_size; + hc_RSA_up_ref; + hc_RSA_verify; + hc_SHA1_Final; + hc_SHA1_Init; + hc_SHA1_Update; + hc_SHA256_Final; + hc_SHA256_Init; + hc_SHA256_Update; + hc_SHA384_Final; + hc_SHA384_Init; + hc_SHA384_Update; + hc_SHA512_Final; + hc_SHA512_Init; + hc_SHA512_Update; + hc_UI_UTIL_read_pw_string; + hc_UI_UTIL_read_pw_string; + hc_i2d_DHparams; + hc_d2i_RSAPrivateKey; + hc_i2d_RSAPrivateKey; + hc_i2d_RSAPublicKey; + hc_d2i_RSAPublicKey; + hc_EVP_CIPHER_CTX_ctrl; + hc_EVP_CIPHER_CTX_rand_key; + hc_EVP_CIPHER_CTX_set_key_length; + hc_EVP_hcrypto_rc2_cbc; + hc_EVP_hcrypto_rc2_40_cbc; + hc_EVP_hcrypto_camellia_128_cbc; + hc_EVP_CipherUpdate; + hc_EVP_CipherFinal_ex; + hc_hcrypto_validate; + local: + *; +}; diff --git a/crypto/heimdal/lib/hdb/Makefile.am b/crypto/heimdal/lib/hdb/Makefile.am --- a/crypto/heimdal/lib/hdb/Makefile.am +++ b/crypto/heimdal/lib/hdb/Makefile.am @@ -2,7 +2,7 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += -I../asn1 -I$(srcdir)/../asn1 $(INCLUDE_hcrypto) +AM_CPPFLAGS += -I../asn1 -I$(srcdir)/../asn1 AM_CPPFLAGS += $(INCLUDE_openldap) -DHDB_DB_DIR=\"$(DIR_hdbdir)\" AM_CPPFLAGS += -I$(srcdir)/../krb5 AM_CPPFLAGS += $(INCLUDE_sqlite3) @@ -29,22 +29,24 @@ asn1_HDB_Ext_Lan_Manager_OWF.x \ asn1_HDB_Ext_Password.x \ asn1_HDB_Ext_Aliases.x \ + asn1_HDB_Ext_KeySet.x \ asn1_HDB_extension.x \ asn1_HDB_extensions.x \ asn1_hdb_entry.x \ asn1_hdb_entry_alias.x \ - asn1_hdb_keyset.x + asn1_hdb_keyset.x \ + asn1_Keys.x CLEANFILES = $(BUILT_SOURCES) $(gen_files_hdb) \ - hdb_asn1{,-priv}.h* hdb_asn1_files hdb_asn1-template.c* + hdb_asn1{,-priv}.h* hdb_asn1_files hdb_asn1-template.[cx] LDADD = libhdb.la \ - $(LIB_openldap) \ - $(LIB_libintl) \ ../krb5/libkrb5.la \ ../asn1/libasn1.la \ $(LIB_hcrypto) \ $(LIB_roken) \ + $(LIB_openldap) \ + $(LIB_libintl) \ $(LIB_ldopen) @@ -70,7 +72,7 @@ libhdb_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map endif -noinst_PROGRAMS = test_dbinfo test_hdbkeys test_mkey +noinst_PROGRAMS = test_dbinfo test_hdbkeys test_mkey test_hdbplugin dist_libhdb_la_SOURCES = \ common.c \ @@ -81,9 +83,9 @@ hdb.c \ hdb-sqlite.c \ hdb-keytab.c \ + hdb-mdb.c \ hdb-mitdb.c \ hdb_locl.h \ - hdb-private.h \ keys.c \ keytab.c \ dbinfo.c \ @@ -95,9 +97,11 @@ libhdb_la_DEPENDENCIES = version-script.map -include_HEADERS = hdb.h hdb-protos.h +include_HEADERS = hdb.h $(srcdir)/hdb-protos.h nodist_include_HEADERS = hdb_err.h hdb_asn1.h +noinst_HEADERS = $(srcdir)/hdb-private.h + libhdb_la_LIBADD = \ $(LIB_com_err) \ ../krb5/libkrb5.la \ @@ -106,27 +110,34 @@ $(LIBADD_roken) \ $(ldap_lib) \ $(LIB_dlopen) \ - $(DBLIB) \ - $(LIB_NDBM) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) + +HDB_PROTOS = $(srcdir)/hdb-protos.h $(srcdir)/hdb-private.h + +ALL_OBJECTS = $(libhdb_la_OBJECTS) +ALL_OBJECTS += $(test_dbinfo_OBJECTS) +ALL_OBJECTS += $(test_hdbkeys_OBJECTS) +ALL_OBJECTS += $(test_mkey_OBJECTS) +ALL_OBJECTS += $(test_hdbplugin_OBJECTS) -$(libhdb_la_OBJECTS): $(srcdir)/hdb-protos.h $(srcdir)/hdb-private.h -$(libhdb_la_OBJECTS): hdb_asn1.h hdb_asn1-priv.h hdb_err.h +$(ALL_OBJECTS): $(HDB_PROTOS) hdb_asn1.h hdb_asn1-priv.h hdb_err.h -$(srcdir)/hdb-protos.h: +$(srcdir)/hdb-protos.h: $(dist_libhdb_la_SOURCES) cd $(srcdir); perl ../../cf/make-proto.pl -q -P comment -o hdb-protos.h $(dist_libhdb_la_SOURCES) || rm -f hdb-protos.h -$(srcdir)/hdb-private.h: +$(srcdir)/hdb-private.h: $(dist_libhdb_la_SOURCES) cd $(srcdir); perl ../../cf/make-proto.pl -q -P comment -p hdb-private.h $(dist_libhdb_la_SOURCES) || rm -f hdb-private.h $(gen_files_hdb) hdb_asn1.hx hdb_asn1-priv.hx: hdb_asn1_files hdb_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/hdb.asn1 - $(ASN1_COMPILE) $(srcdir)/hdb.asn1 hdb_asn1 + $(ASN1_COMPILE) --sequence=HDB-Ext-KeySet --sequence=Keys $(srcdir)/hdb.asn1 hdb_asn1 test_dbinfo_LIBS = libhdb.la test_hdbkeys_LIBS = ../krb5/libkrb5.la libhdb.la test_mkey_LIBS = $(test_hdbkeys_LIBS) +test_hdbplugin_LIBS = $(test_hdbkeys_LIBS) # to help stupid solaris make diff --git a/crypto/heimdal/lib/hdb/Makefile.in b/crypto/heimdal/lib/hdb/Makefile.in --- a/crypto/heimdal/lib/hdb/Makefile.in +++ b/crypto/heimdal/lib/hdb/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,18 +96,14 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common @HAVE_DBHEADER_TRUE@am__append_1 = -I$(DBHEADER) @versionscript_TRUE@am__append_2 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map noinst_PROGRAMS = test_dbinfo$(EXEEXT) test_hdbkeys$(EXEEXT) \ - test_mkey$(EXEEXT) + test_mkey$(EXEEXT) test_hdbplugin$(EXEEXT) subdir = lib/hdb ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -64,8 +114,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -78,6 +127,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -97,10 +147,13 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -122,6 +175,12 @@ 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)" \ "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) @@ -131,17 +190,21 @@ am__hdb_ldap_la_SOURCES_DIST = hdb-ldap.c @OPENLDAP_MODULE_TRUE@am_hdb_ldap_la_OBJECTS = hdb-ldap.lo hdb_ldap_la_OBJECTS = $(am_hdb_ldap_la_OBJECTS) -hdb_ldap_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +hdb_ldap_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(hdb_ldap_la_LDFLAGS) $(LDFLAGS) -o $@ @OPENLDAP_MODULE_TRUE@am_hdb_ldap_la_rpath = -rpath $(libdir) @OPENLDAP_MODULE_FALSE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) am__dist_libhdb_la_SOURCES_DIST = common.c db.c db3.c ext.c hdb-ldap.c \ - hdb.c hdb-sqlite.c hdb-keytab.c hdb-mitdb.c hdb_locl.h \ - hdb-private.h keys.c keytab.c dbinfo.c mkey.c ndbm.c print.c + hdb.c hdb-sqlite.c hdb-keytab.c hdb-mdb.c hdb-mitdb.c \ + hdb_locl.h keys.c keytab.c dbinfo.c mkey.c ndbm.c print.c @OPENLDAP_MODULE_FALSE@am__objects_1 = hdb-ldap.lo dist_libhdb_la_OBJECTS = common.lo db.lo db3.lo ext.lo \ - $(am__objects_1) hdb.lo hdb-sqlite.lo hdb-keytab.lo \ + $(am__objects_1) hdb.lo hdb-sqlite.lo hdb-keytab.lo hdb-mdb.lo \ hdb-mitdb.lo keys.lo keytab.lo dbinfo.lo mkey.lo ndbm.lo \ print.lo am__objects_2 = asn1_Salt.lo asn1_Key.lo asn1_Event.lo \ @@ -149,61 +212,139 @@ asn1_HDB_Ext_PKINIT_cert.lo asn1_HDB_Ext_PKINIT_hash.lo \ asn1_HDB_Ext_Constrained_delegation_acl.lo \ asn1_HDB_Ext_Lan_Manager_OWF.lo asn1_HDB_Ext_Password.lo \ - asn1_HDB_Ext_Aliases.lo asn1_HDB_extension.lo \ - asn1_HDB_extensions.lo asn1_hdb_entry.lo \ - asn1_hdb_entry_alias.lo asn1_hdb_keyset.lo + asn1_HDB_Ext_Aliases.lo asn1_HDB_Ext_KeySet.lo \ + asn1_HDB_extension.lo asn1_HDB_extensions.lo asn1_hdb_entry.lo \ + asn1_hdb_entry_alias.lo asn1_hdb_keyset.lo asn1_Keys.lo am__objects_3 = $(am__objects_2) hdb_err.lo nodist_libhdb_la_OBJECTS = $(am__objects_3) libhdb_la_OBJECTS = $(dist_libhdb_la_OBJECTS) \ $(nodist_libhdb_la_OBJECTS) -libhdb_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +libhdb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libhdb_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(noinst_PROGRAMS) test_dbinfo_SOURCES = test_dbinfo.c test_dbinfo_OBJECTS = test_dbinfo.$(OBJEXT) test_dbinfo_LDADD = $(LDADD) -test_dbinfo_DEPENDENCIES = libhdb.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) ../krb5/libkrb5.la ../asn1/libasn1.la \ +test_dbinfo_DEPENDENCIES = libhdb.la ../krb5/libkrb5.la \ + ../asn1/libasn1.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) test_hdbkeys_SOURCES = test_hdbkeys.c test_hdbkeys_OBJECTS = test_hdbkeys.$(OBJEXT) test_hdbkeys_LDADD = $(LDADD) -test_hdbkeys_DEPENDENCIES = libhdb.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) ../krb5/libkrb5.la ../asn1/libasn1.la \ +test_hdbkeys_DEPENDENCIES = libhdb.la ../krb5/libkrb5.la \ + ../asn1/libasn1.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +test_hdbplugin_SOURCES = test_hdbplugin.c +test_hdbplugin_OBJECTS = test_hdbplugin.$(OBJEXT) +test_hdbplugin_LDADD = $(LDADD) +test_hdbplugin_DEPENDENCIES = libhdb.la ../krb5/libkrb5.la \ + ../asn1/libasn1.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) test_mkey_SOURCES = test_mkey.c test_mkey_OBJECTS = test_mkey.$(OBJEXT) test_mkey_LDADD = $(LDADD) -test_mkey_DEPENDENCIES = libhdb.la $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) ../krb5/libkrb5.la ../asn1/libasn1.la \ +test_mkey_DEPENDENCIES = libhdb.la ../krb5/libkrb5.la \ + ../asn1/libasn1.la $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/asn1_Event.Plo \ + ./$(DEPDIR)/asn1_GENERATION.Plo ./$(DEPDIR)/asn1_HDBFlags.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_Aliases.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_Constrained_delegation_acl.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_KeySet.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_Lan_Manager_OWF.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_acl.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_cert.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_hash.Plo \ + ./$(DEPDIR)/asn1_HDB_Ext_Password.Plo \ + ./$(DEPDIR)/asn1_HDB_extension.Plo \ + ./$(DEPDIR)/asn1_HDB_extensions.Plo ./$(DEPDIR)/asn1_Key.Plo \ + ./$(DEPDIR)/asn1_Keys.Plo ./$(DEPDIR)/asn1_Salt.Plo \ + ./$(DEPDIR)/asn1_hdb_entry.Plo \ + ./$(DEPDIR)/asn1_hdb_entry_alias.Plo \ + ./$(DEPDIR)/asn1_hdb_keyset.Plo ./$(DEPDIR)/common.Plo \ + ./$(DEPDIR)/db.Plo ./$(DEPDIR)/db3.Plo ./$(DEPDIR)/dbinfo.Plo \ + ./$(DEPDIR)/ext.Plo ./$(DEPDIR)/hdb-keytab.Plo \ + ./$(DEPDIR)/hdb-ldap.Plo ./$(DEPDIR)/hdb-mdb.Plo \ + ./$(DEPDIR)/hdb-mitdb.Plo ./$(DEPDIR)/hdb-sqlite.Plo \ + ./$(DEPDIR)/hdb.Plo ./$(DEPDIR)/hdb_err.Plo \ + ./$(DEPDIR)/keys.Plo ./$(DEPDIR)/keytab.Plo \ + ./$(DEPDIR)/mkey.Plo ./$(DEPDIR)/ndbm.Plo \ + ./$(DEPDIR)/print.Plo ./$(DEPDIR)/test_dbinfo.Po \ + ./$(DEPDIR)/test_hdbkeys.Po ./$(DEPDIR)/test_hdbplugin.Po \ + ./$(DEPDIR)/test_mkey.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(hdb_ldap_la_SOURCES) $(dist_libhdb_la_SOURCES) \ $(nodist_libhdb_la_SOURCES) test_dbinfo.c test_hdbkeys.c \ - test_mkey.c + test_hdbplugin.c test_mkey.c DIST_SOURCES = $(am__hdb_ldap_la_SOURCES_DIST) \ $(am__dist_libhdb_la_SOURCES_DIST) test_dbinfo.c \ - test_hdbkeys.c test_mkey.c -HEADERS = $(include_HEADERS) $(nodist_include_HEADERS) -ETAGS = etags -CTAGS = ctags + test_hdbkeys.c test_hdbplugin.c test_mkey.c +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) $(nodist_include_HEADERS) \ + $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -218,16 +359,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -237,17 +381,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -266,12 +412,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -280,6 +423,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -296,10 +440,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -307,6 +449,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -321,12 +464,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -343,10 +489,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -357,13 +509,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -387,6 +533,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -410,9 +558,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -422,32 +575,40 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) -I../asn1 -I$(srcdir)/../asn1 \ - $(INCLUDE_hcrypto) $(INCLUDE_openldap) \ - -DHDB_DB_DIR=\"$(DIR_hdbdir)\" -I$(srcdir)/../krb5 \ - $(INCLUDE_sqlite3) $(INCLUDE_libintl) $(am__append_1) + $(INCLUDE_openldap) -DHDB_DB_DIR=\"$(DIR_hdbdir)\" \ + -I$(srcdir)/../krb5 $(INCLUDE_sqlite3) $(INCLUDE_libintl) \ + $(am__append_1) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; BUILT_SOURCES = \ $(gen_files_hdb:.x=.c) \ hdb_err.c \ @@ -466,22 +627,24 @@ asn1_HDB_Ext_Lan_Manager_OWF.x \ asn1_HDB_Ext_Password.x \ asn1_HDB_Ext_Aliases.x \ + asn1_HDB_Ext_KeySet.x \ asn1_HDB_extension.x \ asn1_HDB_extensions.x \ asn1_hdb_entry.x \ asn1_hdb_entry_alias.x \ - asn1_hdb_keyset.x + asn1_hdb_keyset.x \ + asn1_Keys.x CLEANFILES = $(BUILT_SOURCES) $(gen_files_hdb) \ - hdb_asn1{,-priv}.h* hdb_asn1_files hdb_asn1-template.c* + hdb_asn1{,-priv}.h* hdb_asn1_files hdb_asn1-template.[cx] LDADD = libhdb.la \ - $(LIB_openldap) \ - $(LIB_libintl) \ ../krb5/libkrb5.la \ ../asn1/libasn1.la \ $(LIB_hcrypto) \ $(LIB_roken) \ + $(LIB_openldap) \ + $(LIB_libintl) \ $(LIB_ldopen) @OPENLDAP_MODULE_TRUE@ldap_so = hdb_ldap.la @@ -501,9 +664,9 @@ hdb.c \ hdb-sqlite.c \ hdb-keytab.c \ + hdb-mdb.c \ hdb-mitdb.c \ hdb_locl.h \ - hdb-private.h \ keys.c \ keytab.c \ dbinfo.c \ @@ -513,8 +676,9 @@ nodist_libhdb_la_SOURCES = $(BUILT_SOURCES) libhdb_la_DEPENDENCIES = version-script.map -include_HEADERS = hdb.h hdb-protos.h +include_HEADERS = hdb.h $(srcdir)/hdb-protos.h nodist_include_HEADERS = hdb_err.h hdb_asn1.h +noinst_HEADERS = $(srcdir)/hdb-private.h libhdb_la_LIBADD = \ $(LIB_com_err) \ ../krb5/libkrb5.la \ @@ -523,12 +687,16 @@ $(LIBADD_roken) \ $(ldap_lib) \ $(LIB_dlopen) \ - $(DBLIB) \ - $(LIB_NDBM) + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) +HDB_PROTOS = $(srcdir)/hdb-protos.h $(srcdir)/hdb-private.h +ALL_OBJECTS = $(libhdb_la_OBJECTS) $(test_dbinfo_OBJECTS) \ + $(test_hdbkeys_OBJECTS) $(test_mkey_OBJECTS) \ + $(test_hdbplugin_OBJECTS) test_dbinfo_LIBS = libhdb.la test_hdbkeys_LIBS = ../krb5/libkrb5.la libhdb.la test_mkey_LIBS = $(test_hdbkeys_LIBS) +test_hdbplugin_LIBS = $(test_hdbkeys_LIBS) EXTRA_DIST = \ NTMakefile \ libhdb-version.rc \ @@ -544,7 +712,7 @@ $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -557,15 +725,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/hdb/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/hdb/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -575,9 +743,18 @@ $(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 + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -585,6 +762,8 @@ 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)"; \ } @@ -600,34 +779,36 @@ clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -hdb_ldap.la: $(hdb_ldap_la_OBJECTS) $(hdb_ldap_la_DEPENDENCIES) - $(hdb_ldap_la_LINK) $(am_hdb_ldap_la_rpath) $(hdb_ldap_la_OBJECTS) $(hdb_ldap_la_LIBADD) $(LIBS) -libhdb.la: $(libhdb_la_OBJECTS) $(libhdb_la_DEPENDENCIES) - $(libhdb_la_LINK) -rpath $(libdir) $(libhdb_la_OBJECTS) $(libhdb_la_LIBADD) $(LIBS) + @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}; \ + } -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 -test_dbinfo$(EXEEXT): $(test_dbinfo_OBJECTS) $(test_dbinfo_DEPENDENCIES) +hdb_ldap.la: $(hdb_ldap_la_OBJECTS) $(hdb_ldap_la_DEPENDENCIES) $(EXTRA_hdb_ldap_la_DEPENDENCIES) + $(AM_V_CCLD)$(hdb_ldap_la_LINK) $(am_hdb_ldap_la_rpath) $(hdb_ldap_la_OBJECTS) $(hdb_ldap_la_LIBADD) $(LIBS) + +libhdb.la: $(libhdb_la_OBJECTS) $(libhdb_la_DEPENDENCIES) $(EXTRA_libhdb_la_DEPENDENCIES) + $(AM_V_CCLD)$(libhdb_la_LINK) -rpath $(libdir) $(libhdb_la_OBJECTS) $(libhdb_la_LIBADD) $(LIBS) + +test_dbinfo$(EXEEXT): $(test_dbinfo_OBJECTS) $(test_dbinfo_DEPENDENCIES) $(EXTRA_test_dbinfo_DEPENDENCIES) @rm -f test_dbinfo$(EXEEXT) - $(LINK) $(test_dbinfo_OBJECTS) $(test_dbinfo_LDADD) $(LIBS) -test_hdbkeys$(EXEEXT): $(test_hdbkeys_OBJECTS) $(test_hdbkeys_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_dbinfo_OBJECTS) $(test_dbinfo_LDADD) $(LIBS) + +test_hdbkeys$(EXEEXT): $(test_hdbkeys_OBJECTS) $(test_hdbkeys_DEPENDENCIES) $(EXTRA_test_hdbkeys_DEPENDENCIES) @rm -f test_hdbkeys$(EXEEXT) - $(LINK) $(test_hdbkeys_OBJECTS) $(test_hdbkeys_LDADD) $(LIBS) -test_mkey$(EXEEXT): $(test_mkey_OBJECTS) $(test_mkey_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_hdbkeys_OBJECTS) $(test_hdbkeys_LDADD) $(LIBS) + +test_hdbplugin$(EXEEXT): $(test_hdbplugin_OBJECTS) $(test_hdbplugin_DEPENDENCIES) $(EXTRA_test_hdbplugin_DEPENDENCIES) + @rm -f test_hdbplugin$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_hdbplugin_OBJECTS) $(test_hdbplugin_LDADD) $(LIBS) + +test_mkey$(EXEEXT): $(test_mkey_OBJECTS) $(test_mkey_DEPENDENCIES) $(EXTRA_test_mkey_DEPENDENCIES) @rm -f test_mkey$(EXEEXT) - $(LINK) $(test_mkey_OBJECTS) $(test_mkey_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_mkey_OBJECTS) $(test_mkey_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -635,63 +816,73 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_Event.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_GENERATION.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDBFlags.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Aliases.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Constrained_delegation_acl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Lan_Manager_OWF.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_PKINIT_acl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_PKINIT_cert.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_PKINIT_hash.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Password.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_extension.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_extensions.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_Key.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_Salt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_hdb_entry.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_hdb_entry_alias.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_hdb_keyset.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/db.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/db3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ext.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-keytab.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-ldap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-mitdb.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-sqlite.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keys.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keytab.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkey.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndbm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dbinfo.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hdbkeys.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mkey.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_Event.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_GENERATION.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDBFlags.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Aliases.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Constrained_delegation_acl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_KeySet.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Lan_Manager_OWF.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_PKINIT_acl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_PKINIT_cert.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_PKINIT_hash.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_Ext_Password.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_extension.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_HDB_extensions.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_Key.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_Keys.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_Salt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_hdb_entry.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_hdb_entry_alias.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_hdb_keyset.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/db.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/db3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ext.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-keytab.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-ldap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-mdb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-mitdb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb-sqlite.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hdb_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keys.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keytab.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mkey.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndbm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_dbinfo.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hdbkeys.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hdbplugin.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mkey.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -700,8 +891,11 @@ -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @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"; \ @@ -715,13 +909,14 @@ @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -735,30 +930,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -770,15 +952,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -787,11 +965,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -828,14 +1023,15 @@ $(MAKE) $(AM_MAKEFLAGS) check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -844,10 +1040,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -867,7 +1068,46 @@ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_Event.Plo + -rm -f ./$(DEPDIR)/asn1_GENERATION.Plo + -rm -f ./$(DEPDIR)/asn1_HDBFlags.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Aliases.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Constrained_delegation_acl.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_KeySet.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Lan_Manager_OWF.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_acl.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_cert.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_hash.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Password.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_extension.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_extensions.Plo + -rm -f ./$(DEPDIR)/asn1_Key.Plo + -rm -f ./$(DEPDIR)/asn1_Keys.Plo + -rm -f ./$(DEPDIR)/asn1_Salt.Plo + -rm -f ./$(DEPDIR)/asn1_hdb_entry.Plo + -rm -f ./$(DEPDIR)/asn1_hdb_entry_alias.Plo + -rm -f ./$(DEPDIR)/asn1_hdb_keyset.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/db.Plo + -rm -f ./$(DEPDIR)/db3.Plo + -rm -f ./$(DEPDIR)/dbinfo.Plo + -rm -f ./$(DEPDIR)/ext.Plo + -rm -f ./$(DEPDIR)/hdb-keytab.Plo + -rm -f ./$(DEPDIR)/hdb-ldap.Plo + -rm -f ./$(DEPDIR)/hdb-mdb.Plo + -rm -f ./$(DEPDIR)/hdb-mitdb.Plo + -rm -f ./$(DEPDIR)/hdb-sqlite.Plo + -rm -f ./$(DEPDIR)/hdb.Plo + -rm -f ./$(DEPDIR)/hdb_err.Plo + -rm -f ./$(DEPDIR)/keys.Plo + -rm -f ./$(DEPDIR)/keytab.Plo + -rm -f ./$(DEPDIR)/mkey.Plo + -rm -f ./$(DEPDIR)/ndbm.Plo + -rm -f ./$(DEPDIR)/print.Plo + -rm -f ./$(DEPDIR)/test_dbinfo.Po + -rm -f ./$(DEPDIR)/test_hdbkeys.Po + -rm -f ./$(DEPDIR)/test_hdbplugin.Po + -rm -f ./$(DEPDIR)/test_mkey.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -891,9 +1131,8 @@ install-dvi-am: -install-exec-am: install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -915,7 +1154,46 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_Event.Plo + -rm -f ./$(DEPDIR)/asn1_GENERATION.Plo + -rm -f ./$(DEPDIR)/asn1_HDBFlags.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Aliases.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Constrained_delegation_acl.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_KeySet.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Lan_Manager_OWF.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_acl.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_cert.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_PKINIT_hash.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_Ext_Password.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_extension.Plo + -rm -f ./$(DEPDIR)/asn1_HDB_extensions.Plo + -rm -f ./$(DEPDIR)/asn1_Key.Plo + -rm -f ./$(DEPDIR)/asn1_Keys.Plo + -rm -f ./$(DEPDIR)/asn1_Salt.Plo + -rm -f ./$(DEPDIR)/asn1_hdb_entry.Plo + -rm -f ./$(DEPDIR)/asn1_hdb_entry_alias.Plo + -rm -f ./$(DEPDIR)/asn1_hdb_keyset.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/db.Plo + -rm -f ./$(DEPDIR)/db3.Plo + -rm -f ./$(DEPDIR)/dbinfo.Plo + -rm -f ./$(DEPDIR)/ext.Plo + -rm -f ./$(DEPDIR)/hdb-keytab.Plo + -rm -f ./$(DEPDIR)/hdb-ldap.Plo + -rm -f ./$(DEPDIR)/hdb-mdb.Plo + -rm -f ./$(DEPDIR)/hdb-mitdb.Plo + -rm -f ./$(DEPDIR)/hdb-sqlite.Plo + -rm -f ./$(DEPDIR)/hdb.Plo + -rm -f ./$(DEPDIR)/hdb_err.Plo + -rm -f ./$(DEPDIR)/keys.Plo + -rm -f ./$(DEPDIR)/keytab.Plo + -rm -f ./$(DEPDIR)/mkey.Plo + -rm -f ./$(DEPDIR)/ndbm.Plo + -rm -f ./$(DEPDIR)/print.Plo + -rm -f ./$(DEPDIR)/test_dbinfo.Po + -rm -f ./$(DEPDIR)/test_hdbkeys.Po + -rm -f ./$(DEPDIR)/test_hdbplugin.Po + -rm -f ./$(DEPDIR)/test_mkey.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -937,42 +1215,56 @@ @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: all check check-am install install-am install-data-am \ - install-exec-am install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libLTLIBRARIES clean-libtool \ - clean-noinstPROGRAMS ctags dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ - install-exec-am install-exec-hook install-html install-html-am \ - install-includeHEADERS install-info install-info-am \ - install-libLTLIBRARIES install-man \ - install-nodist_includeHEADERS install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ + install-exec install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-local \ + install-html install-html-am install-includeHEADERS \ + install-info install-info-am install-libLTLIBRARIES \ + install-man install-nodist_includeHEADERS 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-hook \ + tags tags-am uninstall uninstall-am uninstall-hook \ uninstall-includeHEADERS uninstall-libLTLIBRARIES \ uninstall-nodist_includeHEADERS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -980,7 +1272,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1025,11 +1317,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1037,6 +1338,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1079,6 +1382,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1092,13 +1408,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1129,19 +1445,18 @@ fi ; \ done -$(libhdb_la_OBJECTS): $(srcdir)/hdb-protos.h $(srcdir)/hdb-private.h -$(libhdb_la_OBJECTS): hdb_asn1.h hdb_asn1-priv.h hdb_err.h +$(ALL_OBJECTS): $(HDB_PROTOS) hdb_asn1.h hdb_asn1-priv.h hdb_err.h -$(srcdir)/hdb-protos.h: +$(srcdir)/hdb-protos.h: $(dist_libhdb_la_SOURCES) cd $(srcdir); perl ../../cf/make-proto.pl -q -P comment -o hdb-protos.h $(dist_libhdb_la_SOURCES) || rm -f hdb-protos.h -$(srcdir)/hdb-private.h: +$(srcdir)/hdb-private.h: $(dist_libhdb_la_SOURCES) cd $(srcdir); perl ../../cf/make-proto.pl -q -P comment -p hdb-private.h $(dist_libhdb_la_SOURCES) || rm -f hdb-private.h $(gen_files_hdb) hdb_asn1.hx hdb_asn1-priv.hx: hdb_asn1_files hdb_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/hdb.asn1 - $(ASN1_COMPILE) $(srcdir)/hdb.asn1 hdb_asn1 + $(ASN1_COMPILE) --sequence=HDB-Ext-KeySet --sequence=Keys $(srcdir)/hdb.asn1 hdb_asn1 # to help stupid solaris make diff --git a/crypto/heimdal/lib/hdb/NTMakefile b/crypto/heimdal/lib/hdb/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hdb/NTMakefile @@ -0,0 +1,191 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\hdb + +!include ../../windows/NTMakefile.w32 + +gen_files_hdb = $(OBJ)\asn1_hdb_asn1.x + +$(gen_files_hdb) $(OBJ)\hdb_asn1.hx $(OBJ)\hdb_asn1-priv.hx: $(BINDIR)\asn1_compile.exe hdb.asn1 + cd $(OBJ) + $(BINDIR)\asn1_compile.exe --sequence=HDB-Ext-KeySet --sequence=Keys --one-code-file $(SRCDIR)\hdb.asn1 hdb_asn1 + cd $(SRCDIR) + +$(gen_files_hdb:.x=.c): $$(@R).x + +!ifdef OPENLDAP_MODULE + +ldap_dll = $(BINDIR)\hdb_ldap.dll +ldap_lib = $(LIBDIR)\hdb_ldap.lib +ldap_objs = $(OBJ)\hdb-ldap.obj + +$(ldap_dll): $(ldap_objs) + $(DLLGUILINK) -implib:$(ldap_lib) + $(DLLPREP) + +clean:: + -$(RM) $(ldap_dll) + -$(RM) $(ldap_lib) + +!else + +ldap = $(OBJ)\hdb-ldap.obj +ldap_c = hdb-ldap.c + +!endif + +dist_libhdb_la_SOURCES = \ + common.c \ + db.c \ + db3.c \ + ext.c \ + $(ldap_c) \ + hdb.c \ + hdb-sqlite.c \ + hdb-keytab.c \ + hdb-mitdb.c \ + hdb-mdb.c \ + hdb_locl.h \ + keys.c \ + keytab.c \ + dbinfo.c \ + mkey.c \ + ndbm.c \ + print.c + +libhdb_OBJs = \ + $(OBJ)\common.obj \ + $(OBJ)\db.obj \ + $(OBJ)\db3.obj \ + $(OBJ)\ext.obj \ + $(ldap) \ + $(OBJ)\hdb.obj \ + $(OBJ)\hdb-sqlite.obj \ + $(OBJ)\hdb-keytab.obj \ + $(OBJ)\hdb-mitdb.obj \ + $(OBJ)\keys.obj \ + $(OBJ)\keytab.obj \ + $(OBJ)\dbinfo.obj \ + $(OBJ)\mkey.obj \ + $(OBJ)\ndbm.obj \ + $(OBJ)\print.obj \ + $(gen_files_hdb:.x=.obj) \ + $(OBJ)\hdb_err.obj + +$(OBJ)\hdb_err.c $(OBJ)\hdb_err.h: hdb_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\hdb_err.et + cd $(SRCDIR) + +$(OBJ)\hdb-protos.h: $(dist_libhdb_la_SOURCES) + $(PERL) ../../cf/make-proto.pl -q -P remove -o $@ $(dist_libhdb_la_SOURCES) \ + || $(RM) $@ + +$(OBJ)\hdb-private.h: $(dist_libhdb_la_SOURCES) + $(PERL) ../../cf/make-proto.pl -q -P remote -p $@ $(dist_libhdb_la_SOURCES) \ + || $(RM) $@ + +INCFILES= \ + $(INCDIR)\hdb.h \ + $(INCDIR)\hdb-protos.h \ + $(OBJ)\hdb-private.h \ + $(INCDIR)\hdb_err.h \ + $(INCDIR)\hdb_asn1.h \ + $(INCDIR)\hdb_asn1-priv.h + +!ifndef STATICLIBS + +RES=$(OBJ)\libhdb-version.res + +$(LIBHDB): $(BINDIR)\libhdb.dll + +$(BINDIR)\libhdb.dll: $(libhdb_OBJs) $(ldap_lib) $(LIBHEIMBASE) $(LIBHEIMDAL) $(LIBSQLITE) $(LIBCOMERR) $(LIBROKEN) $(RES) + $(DLLGUILINK) -def:libhdb-exports.def -implib:$(LIBHDB) + $(DLLPREP_NODIST) + +clean:: + -$(RM) $(BINDIR)\libhdb.* + +!else + +$(LIBHDB): $(libhdb_OBJs) $(ldap_lib) + $(LIBCON) + +!endif + +all:: $(INCFILES) $(LIBHDB) + +clean:: + -$(RM) $(INCFILES) + -$(RM) $(LIBHDB) + +test:: test-binaries test-run + +test-binaries: $(OBJ)\test_dbinfo.exe $(OBJ)\test_hdbkeys.exe $(OBJ)\test_hdbplugin.exe + +$(OBJ)\test_dbinfo.exe: $(OBJ)\test_dbinfo.obj $(LIBHDB) $(LIBHEIMDAL) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_hdbkeys.exe: $(OBJ)\test_hdbkeys.obj $(LIBHDB) $(LIBHEIMDAL) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_hdbplugin.exe: $(OBJ)\test_hdbplugin.obj $(LIBHDB) $(LIBHEIMDAL) $(LIBROKEN) $(LIBVERS) + $(EXECONLINK) + $(EXEPREP_NODIST) + +test-run: + cd $(OBJ) + -test_dbinfo.exe + -test_hdbkeys.exe + -test_hdbplugin.exe + cd $(SRCDIR) + +!ifdef OPENLDAP_INC +openldap_inc_flag=-I$(OPENLDAP_INC) +!else +openldap_inc_flag= +!endif + +hdb_cflags=$(openldap_inc_flag) -I$(OBJ) + +{}.c{$(OBJ)}.obj:: + $(C2OBJ_P) $(hdb_cflags) -DASN1_LIB + +{$(OBJ)}.c{$(OBJ)}.obj:: + $(C2OBJ_P) $(hdb_cflags) + +test-exports: + $(PERL) ..\..\cf\w32-check-exported-symbols.pl --vs version-script.map --def libhdb-exports.def + +test:: test-exports diff --git a/crypto/heimdal/lib/hdb/common.c b/crypto/heimdal/lib/hdb/common.c --- a/crypto/heimdal/lib/hdb/common.c +++ b/crypto/heimdal/lib/hdb/common.c @@ -105,7 +105,6 @@ krb5_principal enterprise_principal = NULL; krb5_data key, value; krb5_error_code ret; - int code; if (principal->name.name_type == KRB5_NT_ENTERPRISE_PRINCIPAL) { if (principal->name.name_string.len != 1) { @@ -125,43 +124,74 @@ hdb_principal2key(context, principal, &key); if (enterprise_principal) krb5_free_principal(context, enterprise_principal); - code = db->hdb__get(context, db, key, &value); + ret = db->hdb__get(context, db, key, &value); krb5_data_free(&key); - if(code) - return code; - code = hdb_value2entry(context, &value, &entry->entry); - if (code == ASN1_BAD_ID && (flags & HDB_F_CANON) == 0) { + if(ret) + return ret; + ret = hdb_value2entry(context, &value, &entry->entry); + if (ret == ASN1_BAD_ID && (flags & HDB_F_CANON) == 0) { krb5_data_free(&value); return HDB_ERR_NOENTRY; - } else if (code == ASN1_BAD_ID) { + } else if (ret == ASN1_BAD_ID) { hdb_entry_alias alias; - code = hdb_value2entry_alias(context, &value, &alias); - if (code) { + ret = hdb_value2entry_alias(context, &value, &alias); + if (ret) { krb5_data_free(&value); - return code; + return ret; } hdb_principal2key(context, alias.principal, &key); krb5_data_free(&value); free_hdb_entry_alias(&alias); - code = db->hdb__get(context, db, key, &value); + ret = db->hdb__get(context, db, key, &value); krb5_data_free(&key); - if (code) - return code; - code = hdb_value2entry(context, &value, &entry->entry); - if (code) { + if (ret) + return ret; + ret = hdb_value2entry(context, &value, &entry->entry); + if (ret) { krb5_data_free(&value); - return code; + return ret; } } krb5_data_free(&value); - if (db->hdb_master_key_set && (flags & HDB_F_DECRYPT)) { - code = hdb_unseal_keys (context, db, &entry->entry); - if (code) + if ((flags & HDB_F_DECRYPT) && (flags & HDB_F_ALL_KVNOS)) { + /* Decrypt the current keys */ + ret = hdb_unseal_keys(context, db, &entry->entry); + if (ret) { hdb_free_entry(context, entry); + return ret; + } + /* Decrypt the key history too */ + ret = hdb_unseal_keys_kvno(context, db, 0, flags, &entry->entry); + if (ret) { + hdb_free_entry(context, entry); + return ret; + } + } else if ((flags & HDB_F_DECRYPT)) { + if ((flags & HDB_F_KVNO_SPECIFIED) == 0 || kvno == entry->entry.kvno) { + /* Decrypt the current keys */ + ret = hdb_unseal_keys(context, db, &entry->entry); + if (ret) { + hdb_free_entry(context, entry); + return ret; + } + } else { + if ((flags & HDB_F_ALL_KVNOS)) + kvno = 0; + /* + * Find and decrypt the keys from the history that we want, + * and swap them with the current keys + */ + ret = hdb_unseal_keys_kvno(context, db, kvno, flags, &entry->entry); + if (ret) { + hdb_free_entry(context, entry); + return ret; + } + } } - return code; + + return 0; } static krb5_error_code @@ -192,9 +222,11 @@ for (i = 0; i < aliases->aliases.len; i++) { krb5_data akey; - hdb_principal2key(context, &aliases->aliases.val[i], &akey); - code = db->hdb__del(context, db, akey); - krb5_data_free(&akey); + code = hdb_principal2key(context, &aliases->aliases.val[i], &akey); + if (code == 0) { + code = db->hdb__del(context, db, akey); + krb5_data_free(&akey); + } if (code) { free_hdb_entry(&oldentry); return code; @@ -221,14 +253,15 @@ hdb_entry_alias entryalias; entryalias.principal = entry->entry.principal; - hdb_principal2key(context, &aliases->aliases.val[i], &key); code = hdb_entry_alias2value(context, &entryalias, &value); - if (code) { - krb5_data_free(&key); + if (code) return code; - } - code = db->hdb__put(context, db, flags, key, value); - krb5_data_free(&key); + + code = hdb_principal2key(context, &aliases->aliases.val[i], &key); + if (code == 0) { + code = db->hdb__put(context, db, flags, key, value); + krb5_data_free(&key); + } krb5_data_free(&value); if (code) return code; @@ -253,9 +286,11 @@ hdb_entry_alias alias; krb5_data akey, value; - hdb_principal2key(context, &aliases->aliases.val[i], &akey); - code = db->hdb__get(context, db, akey, &value); - krb5_data_free(&akey); + code = hdb_principal2key(context, &aliases->aliases.val[i], &akey); + if (code == 0) { + code = db->hdb__get(context, db, akey, &value); + krb5_data_free(&akey); + } if (code == HDB_ERR_NOENTRY) continue; else if (code) @@ -284,11 +319,29 @@ krb5_data key, value; int code; + if (entry->entry.flags.do_not_store) + return HDB_ERR_MISUSE; /* check if new aliases already is used */ code = hdb_check_aliases(context, db, entry); if (code) return code; + if ((flags & HDB_F_PRECHECK) && (flags & HDB_F_REPLACE)) + return 0; + + if ((flags & HDB_F_PRECHECK)) { + code = hdb_principal2key(context, entry->entry.principal, &key); + if (code) + return code; + code = db->hdb__get(context, db, key, &value); + krb5_data_free(&key); + if (code == 0) + krb5_data_free(&value); + if (code == HDB_ERR_NOENTRY) + return 0; + return code ? code : HDB_ERR_EXISTS; + } + if(entry->entry.generation == NULL) { struct timeval t; entry->entry.generation = malloc(sizeof(*entry->entry.generation)); @@ -328,13 +381,32 @@ } krb5_error_code -_hdb_remove(krb5_context context, HDB *db, krb5_const_principal principal) +_hdb_remove(krb5_context context, HDB *db, + unsigned flags, krb5_const_principal principal) { - krb5_data key; + krb5_data key, value; int code; hdb_principal2key(context, principal, &key); + if ((flags & HDB_F_PRECHECK)) { + /* + * We don't check that we can delete the aliases because we + * assume that the DB is consistent. If we did check for alias + * consistency we'd also have to provide a way to fsck the DB, + * otherwise admins would have no way to recover -- papering + * over this here is less work, but we really ought to provide + * an HDB fsck. + */ + code = db->hdb__get(context, db, key, &value); + krb5_data_free(&key); + if (code == 0) { + krb5_data_free(&value); + return 0; + } + return code; + } + code = hdb_remove_aliases(context, db, &key); if (code) { krb5_data_free(&key); diff --git a/crypto/heimdal/lib/hdb/data-mkey.mit.des3.be b/crypto/heimdal/lib/hdb/data-mkey.mit.des3.be new file mode 100644 index 0000000000000000000000000000000000000000..4278ed339e520328e37626f1c42e785c5264a243 GIT binary patch literal 46 Qc${MpU|?X7P#_Wj0Bu$UDF6Tf literal 0 Hc$@ @@ -41,11 +41,28 @@ #include #endif +typedef struct { + HDB hdb; /* generic members */ + int lock_fd; /* DB-specific */ + int do_sync; /* DB-specific */ +} DB1_HDB; + static krb5_error_code DB_close(krb5_context context, HDB *db) { + DB1_HDB *db1 = (DB1_HDB *)db; DB *d = (DB*)db->hdb_db; + + heim_assert(d != 0, "Closing already closed HDB"); + (*d->close)(d); + db->hdb_db = 0; + + if (db1->lock_fd >= 0) { + close(db1->lock_fd); + db1->lock_fd = -1; + } + return 0; } @@ -61,29 +78,36 @@ } static krb5_error_code -DB_lock(krb5_context context, HDB *db, int operation) +DB_set_sync(krb5_context context, HDB *db, int on) { + DB1_HDB *db1 = (DB1_HDB *)db; DB *d = (DB*)db->hdb_db; - int fd = (*d->fd)(d); - if(fd < 0) { - krb5_set_error_message(context, HDB_ERR_CANT_LOCK_DB, - "Can't lock database: %s", db->hdb_name); - return HDB_ERR_CANT_LOCK_DB; + krb5_error_code ret = 0; + + db1->do_sync = on; + if (on) { + ret = (*d->sync)(d, 0); + if (ret == -1) { + ret = errno; + krb5_set_error_message(context, ret, "Database %s put sync error: %s", + db->hdb_name, strerror(ret)); + } } - return hdb_lock(fd, operation); + return ret; +} + +static krb5_error_code +DB_lock(krb5_context context, HDB *db, int operation) +{ + + return 0; } static krb5_error_code DB_unlock(krb5_context context, HDB *db) { - DB *d = (DB*)db->hdb_db; - int fd = (*d->fd)(d); - if(fd < 0) { - krb5_set_error_message(context, HDB_ERR_CANT_LOCK_DB, - "Can't unlock database: %s", db->hdb_name); - return HDB_ERR_CANT_LOCK_DB; - } - return hdb_unlock(fd); + + return 0; } @@ -96,13 +120,7 @@ krb5_data key_data, data; int code; - code = db->hdb_lock(context, db, HDB_RLOCK); - if(code == -1) { - krb5_set_error_message(context, HDB_ERR_DB_INUSE, "Database %s in use", db->hdb_name); - return HDB_ERR_DB_INUSE; - } code = (*d->seq)(d, &key, &value, flag); - db->hdb_unlock(context, db); /* XXX check value */ if(code == -1) { code = errno; krb5_set_error_message(context, code, "Database %s seq error: %s", @@ -159,6 +177,10 @@ int ret; char *old, *new; + if (strncmp(new_name, "db:", sizeof("db:") - 1) == 0) + new_name += sizeof("db:") - 1; + else if (strncmp(new_name, "db1:", sizeof("db1:") - 1) == 0) + new_name += sizeof("db1:") - 1; asprintf(&old, "%s.db", db->hdb_name); asprintf(&new, "%s.db", new_name); ret = rename(old, new); @@ -181,11 +203,7 @@ k.data = key.data; k.size = key.length; - code = db->hdb_lock(context, db, HDB_RLOCK); - if(code) - return code; code = (*d->get)(d, &k, &v, 0); - db->hdb_unlock(context, db); if(code < 0) { code = errno; krb5_set_error_message(context, code, "Database %s get error: %s", @@ -205,6 +223,7 @@ DB__put(krb5_context context, HDB *db, int replace, krb5_data key, krb5_data value) { + DB1_HDB *db1 = (DB1_HDB *)db; DB *d = (DB*)db->hdb_db; DBT k, v; int code; @@ -213,11 +232,8 @@ k.size = key.length; v.data = value.data; v.size = value.length; - code = db->hdb_lock(context, db, HDB_WLOCK); - if(code) - return code; + krb5_clear_error_message(context); code = (*d->put)(d, &k, &v, replace ? 0 : R_NOOVERWRITE); - db->hdb_unlock(context, db); if(code < 0) { code = errno; krb5_set_error_message(context, code, "Database %s put error: %s", @@ -225,39 +241,73 @@ return code; } if(code == 1) { - krb5_clear_error_message(context); return HDB_ERR_EXISTS; } - return 0; + + return db->hdb_set_sync(context, db, db1->do_sync); } static krb5_error_code DB__del(krb5_context context, HDB *db, krb5_data key) { + DB1_HDB *db1 = (DB1_HDB *)db; DB *d = (DB*)db->hdb_db; DBT k; krb5_error_code code; k.data = key.data; k.size = key.length; - code = db->hdb_lock(context, db, HDB_WLOCK); - if(code) - return code; + krb5_clear_error_message(context); code = (*d->del)(d, &k, 0); - db->hdb_unlock(context, db); - if(code == 1) { + if (code == 1) + return HDB_ERR_NOENTRY; + if (code < 0) { code = errno; - krb5_set_error_message(context, code, "Database %s put error: %s", + krb5_set_error_message(context, code, "Database %s del error: %s", db->hdb_name, strerror(code)); return code; } - if(code < 0) - return errno; - return 0; + return db->hdb_set_sync(context, db, db1->do_sync); +} + +static DB * +_open_db(char *fn, int flags, int mode, int *fd) +{ +#ifndef O_EXLOCK + int op; + int ret; + + *fd = open(fn, flags, mode); + if (*fd == -1) + return NULL; + + if ((flags & O_ACCMODE) == O_RDONLY) + op = LOCK_SH; + else + op = LOCK_EX; + + ret = flock(*fd, op); + if (ret == -1) { + int saved_errno; + + saved_errno = errno; + close(*fd); + errno = saved_errno; + return NULL; + } +#else + if ((flags & O_ACCMODE) == O_RDONLY) + flags |= O_SHLOCK; + else + flags |= O_EXLOCK; +#endif + + return dbopen(fn, flags, mode, DB_BTREE, NULL); } static krb5_error_code DB_open(krb5_context context, HDB *db, int flags, mode_t mode) { + DB1_HDB *db1 = (DB1_HDB *)db; char *fn; krb5_error_code ret; @@ -266,16 +316,15 @@ krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } - db->hdb_db = dbopen(fn, flags, mode, DB_BTREE, NULL); + db->hdb_db = _open_db(fn, flags, mode, &db1->lock_fd); free(fn); /* try to open without .db extension */ if(db->hdb_db == NULL && errno == ENOENT) - db->hdb_db = dbopen(db->hdb_name, flags, mode, DB_BTREE, NULL); + db->hdb_db = _open_db(db->hdb_name, flags, mode, &db1->lock_fd); if(db->hdb_db == NULL) { - ret = errno; - krb5_set_error_message(context, ret, "dbopen (%s): %s", - db->hdb_name, strerror(ret)); - return ret; + krb5_set_error_message(context, errno, "dbopen (%s): %s", + db->hdb_name, strerror(errno)); + return errno; } if((flags & O_ACCMODE) == O_RDONLY) ret = hdb_check_db_format(context, db); @@ -296,10 +345,11 @@ } krb5_error_code -hdb_db_create(krb5_context context, HDB **db, - const char *filename) +hdb_db1_create(krb5_context context, HDB **db, + const char *filename) { - *db = calloc(1, sizeof(**db)); + DB1_HDB **db1 = (DB1_HDB **)db; + *db = calloc(1, sizeof(**db1)); /* Allocate space for the larger db1 */ if (*db == NULL) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; @@ -330,7 +380,11 @@ (*db)->hdb__put = DB__put; (*db)->hdb__del = DB__del; (*db)->hdb_destroy = DB_destroy; + (*db)->hdb_set_sync = DB_set_sync; + + (*db1)->lock_fd = -1; + (*db1)->do_sync = 1; return 0; } -#endif /* HAVE_DB1 */ +#endif /* defined(HAVE_DB1) */ diff --git a/crypto/heimdal/lib/hdb/db3.c b/crypto/heimdal/lib/hdb/db3.c --- a/crypto/heimdal/lib/hdb/db3.c +++ b/crypto/heimdal/lib/hdb/db3.c @@ -33,10 +33,14 @@ #include "hdb_locl.h" +#include + #if HAVE_DB3 #ifdef HAVE_DBHEADER #include +#elif HAVE_DB6_DB_H +#include #elif HAVE_DB5_DB_H #include #elif HAVE_DB4_DB_H @@ -47,15 +51,33 @@ #include #endif +typedef struct { + HDB hdb; /* generic members */ + int lock_fd; /* DB3-specific */ + int do_sync; /* DB3-specific */ +} DB3_HDB; + + static krb5_error_code DB_close(krb5_context context, HDB *db) { + DB3_HDB *db3 = (DB3_HDB *)db; DB *d = (DB*)db->hdb_db; DBC *dbcp = (DBC*)db->hdb_dbc; - (*dbcp->c_close)(dbcp); + heim_assert(d != 0, "Closing already closed HDB"); + + if (dbcp != NULL) + dbcp->c_close(dbcp); + if (d != NULL) + d->close(d, 0); + if (db3->lock_fd >= 0) + close(db3->lock_fd); + + db3->lock_fd = -1; db->hdb_dbc = 0; - (*d->close)(d, 0); + db->hdb_db = 0; + return 0; } @@ -71,23 +93,43 @@ } static krb5_error_code -DB_lock(krb5_context context, HDB *db, int operation) +DB_set_sync(krb5_context context, HDB *db, int on) { + DB3_HDB *db3 = (DB3_HDB *)db; DB *d = (DB*)db->hdb_db; - int fd; - if ((*d->fd)(d, &fd)) - return HDB_ERR_CANT_LOCK_DB; - return hdb_lock(fd, operation); + krb5_error_code ret = 0; + + db3->do_sync = on; + if (on) { + ret = (*d->sync)(d, 0); + if (ret) { + if (ret == EACCES || ret == ENOSPC || ret == EINVAL) { + krb5_set_error_message(context, ret, + "Database %s put sync error: %s", + db->hdb_name, strerror(ret)); + } else { + ret = HDB_ERR_UK_SERROR; + krb5_set_error_message(context, ret, + "Database %s put sync error: unknown (%d)", + db->hdb_name, ret); + } + } + } + return ret; +} + +static krb5_error_code +DB_lock(krb5_context context, HDB *db, int operation) +{ + + return 0; } static krb5_error_code DB_unlock(krb5_context context, HDB *db) { - DB *d = (DB*)db->hdb_db; - int fd; - if ((*d->fd)(d, &fd)) - return HDB_ERR_CANT_LOCK_DB; - return hdb_unlock(fd); + + return 0; } @@ -102,10 +144,7 @@ memset(&key, 0, sizeof(DBT)); memset(&value, 0, sizeof(DBT)); - if ((*db->hdb_lock)(context, db, HDB_RLOCK)) - return HDB_ERR_DB_INUSE; code = (*dbcp->c_get)(dbcp, &key, &value, flag); - (*db->hdb_unlock)(context, db); /* XXX check value */ if (code == DB_NOTFOUND) return HDB_ERR_NOENTRY; if (code) @@ -156,16 +195,29 @@ int ret; char *old, *new; - asprintf(&old, "%s.db", db->hdb_name); - asprintf(&new, "%s.db", new_name); + if (strncmp(new_name, "db:", sizeof("db:") - 1) == 0) + new_name += sizeof("db:") - 1; + else if (strncmp(new_name, "db3:", sizeof("db3:") - 1) == 0) + new_name += sizeof("db3:") - 1; + + ret = asprintf(&old, "%s.db", db->hdb_name); + if (ret == -1) + return ENOMEM; + ret = asprintf(&new, "%s.db", new_name); + if (ret == -1) { + free(old); + return ENOMEM; + } ret = rename(old, new); free(old); - free(new); - if(ret) + if(ret) { + free(new); return errno; + } free(db->hdb_name); - db->hdb_name = strdup(new_name); + new[strlen(new) - 3] = '\0'; + db->hdb_name = new; return 0; } @@ -181,10 +233,7 @@ k.data = key.data; k.size = key.length; k.flags = 0; - if ((code = (*db->hdb_lock)(context, db, HDB_RLOCK))) - return code; code = (*d->get)(d, NULL, &k, &v, 0); - (*db->hdb_unlock)(context, db); if(code == DB_NOTFOUND) return HDB_ERR_NOENTRY; if(code) @@ -198,6 +247,7 @@ DB__put(krb5_context context, HDB *db, int replace, krb5_data key, krb5_data value) { + DB3_HDB *db3 = (DB3_HDB *)db; DB *d = (DB*)db->hdb_db; DBT k, v; int code; @@ -210,20 +260,42 @@ v.data = value.data; v.size = value.length; v.flags = 0; - if ((code = (*db->hdb_lock)(context, db, HDB_WLOCK))) - return code; code = (*d->put)(d, NULL, &k, &v, replace ? 0 : DB_NOOVERWRITE); - (*db->hdb_unlock)(context, db); if(code == DB_KEYEXIST) return HDB_ERR_EXISTS; - if(code) - return errno; - return 0; + if (code) { + /* + * Berkeley DB 3 and up have a terrible error reporting + * interface... + * + * DB->err() doesn't output a string. + * DB->set_errcall()'s callback function doesn't have a void * + * argument that can be used to place the error somewhere. + * + * The only thing we could do is fopen()/fdopen() a file, set it + * with DB->set_errfile(), then call DB->err(), then read the + * message from the file, unset it with DB->set_errfile(), close + * it and delete it. That's a lot of work... so we don't do it. + */ + if (code == EACCES || code == ENOSPC || code == EINVAL) { + krb5_set_error_message(context, code, + "Database %s put error: %s", + db->hdb_name, strerror(code)); + } else { + code = HDB_ERR_UK_SERROR; + krb5_set_error_message(context, code, + "Database %s put error: unknown (%d)", + db->hdb_name, code); + } + return code; + } + return db->hdb_set_sync(context, db, db3->do_sync); } static krb5_error_code DB__del(krb5_context context, HDB *db, krb5_data key) { + DB3_HDB *db3 = (DB3_HDB *)db; DB *d = (DB*)db->hdb_db; DBT k; krb5_error_code code; @@ -231,26 +303,82 @@ k.data = key.data; k.size = key.length; k.flags = 0; - code = (*db->hdb_lock)(context, db, HDB_WLOCK); - if(code) - return code; code = (*d->del)(d, NULL, &k, 0); - (*db->hdb_unlock)(context, db); if(code == DB_NOTFOUND) return HDB_ERR_NOENTRY; - if(code) + if (code) { + if (code == EACCES || code == ENOSPC || code == EINVAL) { + krb5_set_error_message(context, code, + "Database %s del error: %s", + db->hdb_name, strerror(code)); + } else { + code = HDB_ERR_UK_SERROR; + krb5_set_error_message(context, code, + "Database %s del error: unknown (%d)", + db->hdb_name, code); + } return code; - return 0; + } + return db->hdb_set_sync(context, db, db3->do_sync); +} + +#define RD_CACHE_SZ 0x8000 /* Minimal read cache size */ +#define WR_CACHE_SZ 0x8000 /* Minimal write cache size */ + +static int +_open_db(DB *d, char *fn, int myflags, int flags, mode_t mode, int *fd) +{ + int ret; + int cache_size = (myflags & DB_RDONLY) ? RD_CACHE_SZ : WR_CACHE_SZ; + + *fd = open(fn, flags, mode); + + if (*fd == -1) + return errno; + + /* + * Without DB_FCNTL_LOCKING, the DB library complains when initializing + * a database in an empty file. Since the database is our lock file, + * we create it before Berkeley DB does, so a new DB always starts empty. + */ + myflags |= DB_FCNTL_LOCKING; + + ret = flock(*fd, (myflags&DB_RDONLY) ? LOCK_SH : LOCK_EX); + if (ret == -1) { + ret = errno; + close(*fd); + *fd = -1; + return ret; + } + + d->set_cachesize(d, 0, cache_size, 0); + +#if (DB_VERSION_MAJOR > 4) || ((DB_VERSION_MAJOR == 4) && (DB_VERSION_MINOR >= 1)) + ret = (*d->open)(d, NULL, fn, NULL, DB_BTREE, myflags, mode); +#else + ret = (*d->open)(d, fn, NULL, DB_BTREE, myflags, mode); +#endif + + if (ret != 0) { + close(*fd); + *fd = -1; + } + + return ret; } static krb5_error_code DB_open(krb5_context context, HDB *db, int flags, mode_t mode) { + DB3_HDB *db3 = (DB3_HDB *)db; DBC *dbc = NULL; char *fn; krb5_error_code ret; DB *d; int myflags = 0; + int aret; + + heim_assert(db->hdb_db == 0, "Opening already open HDB"); if (flags & O_CREAT) myflags |= DB_CREATE; @@ -264,11 +392,12 @@ if (flags & O_TRUNC) myflags |= DB_TRUNCATE; - asprintf(&fn, "%s.db", db->hdb_name); - if (fn == NULL) { + aret = asprintf(&fn, "%s.db", db->hdb_name); + if (aret == -1) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } + if (db_create(&d, NULL, 0) != 0) { free(fn); krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); @@ -276,33 +405,29 @@ } db->hdb_db = d; -#if (DB_VERSION_MAJOR >= 4) && (DB_VERSION_MINOR >= 1) - ret = (*d->open)(db->hdb_db, NULL, fn, NULL, DB_BTREE, myflags, mode); -#else - ret = (*d->open)(db->hdb_db, fn, NULL, DB_BTREE, myflags, mode); -#endif + /* From here on out always DB_close() before returning on error */ + ret = _open_db(d, fn, myflags, flags, mode, &db3->lock_fd); + free(fn); if (ret == ENOENT) { /* try to open without .db extension */ -#if (DB_VERSION_MAJOR >= 4) && (DB_VERSION_MINOR >= 1) - ret = (*d->open)(db->hdb_db, NULL, db->hdb_name, NULL, DB_BTREE, - myflags, mode); -#else - ret = (*d->open)(db->hdb_db, db->hdb_name, NULL, DB_BTREE, - myflags, mode); -#endif + ret = _open_db(d, db->hdb_name, myflags, flags, mode, &db3->lock_fd); } if (ret) { - free(fn); + DB_close(context, db); krb5_set_error_message(context, ret, "opening %s: %s", - db->hdb_name, strerror(ret)); + db->hdb_name, strerror(ret)); return ret; } - free(fn); - ret = (*d->cursor)(d, NULL, &dbc, 0); +#ifndef DB_CURSOR_BULK +# define DB_CURSOR_BULK 0 /* Missing with DB < 4.8 */ +#endif + ret = (*d->cursor)(d, NULL, &dbc, DB_CURSOR_BULK); + if (ret) { + DB_close(context, db); krb5_set_error_message(context, ret, "d->cursor: %s", strerror(ret)); return ret; } @@ -326,10 +451,11 @@ } krb5_error_code -hdb_db_create(krb5_context context, HDB **db, - const char *filename) +hdb_db3_create(krb5_context context, HDB **db, + const char *filename) { - *db = calloc(1, sizeof(**db)); + DB3_HDB **db3 = (DB3_HDB **)db; + *db3 = calloc(1, sizeof(**db3)); /* Allocate space for the larger db3 */ if (*db == NULL) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; @@ -360,6 +486,9 @@ (*db)->hdb__put = DB__put; (*db)->hdb__del = DB__del; (*db)->hdb_destroy = DB_destroy; + (*db)->hdb_set_sync = DB_set_sync; + + (*db3)->lock_fd = -1; return 0; } #endif /* HAVE_DB3 */ diff --git a/crypto/heimdal/lib/hdb/dbinfo.c b/crypto/heimdal/lib/hdb/dbinfo.c --- a/crypto/heimdal/lib/hdb/dbinfo.c +++ b/crypto/heimdal/lib/hdb/dbinfo.c @@ -108,11 +108,9 @@ NULL); if (db_binding) { - ret = get_dbinfo(context, db_binding, "default", &di); - if (ret == 0 && di) { - databases = di; - dt = &di->next; - } + ret = get_dbinfo(context, db_binding, "default", &databases); + if (ret == 0 && databases != NULL) + dt = &databases->next; for ( ; db_binding != NULL; db_binding = db_binding->next) { @@ -129,36 +127,41 @@ if (dt) *dt = di; - else + else { + hdb_free_dbinfo(context, &databases); databases = di; + } dt = &di->next; } } - if(databases == NULL) { + if (databases == NULL) { /* if there are none specified, create one and use defaults */ - di = calloc(1, sizeof(*di)); - databases = di; - di->label = strdup("default"); + databases = calloc(1, sizeof(*databases)); + databases->label = strdup("default"); } - for(di = databases; di; di = di->next) { - if(di->dbname == NULL) { + for (di = databases; di; di = di->next) { + if (di->dbname == NULL) { di->dbname = strdup(default_dbname); if (di->mkey_file == NULL) di->mkey_file = strdup(default_mkey); } - if(di->mkey_file == NULL) { + if (di->mkey_file == NULL) { p = strrchr(di->dbname, '.'); if(p == NULL || strchr(p, '/') != NULL) /* final pathname component does not contain a . */ - asprintf(&di->mkey_file, "%s.mkey", di->dbname); + ret = asprintf(&di->mkey_file, "%s.mkey", di->dbname); else /* the filename is something.else, replace .else with .mkey */ - asprintf(&di->mkey_file, "%.*s.mkey", - (int)(p - di->dbname), di->dbname); + ret = asprintf(&di->mkey_file, "%.*s.mkey", + (int)(p - di->dbname), di->dbname); + if (ret == -1) { + hdb_free_dbinfo(context, &databases); + return ENOMEM; + } } if(di->acl_file == NULL) di->acl_file = strdup(default_acl); @@ -248,6 +251,12 @@ const char * hdb_db_dir(krb5_context context) { + const char *p; + + p = krb5_config_get_string(context, NULL, "hdb", "db-dir", NULL); + if (p) + return p; + return HDB_DB_DIR; } diff --git a/crypto/heimdal/lib/hdb/ext.c b/crypto/heimdal/lib/hdb/ext.c --- a/crypto/heimdal/lib/hdb/ext.c +++ b/crypto/heimdal/lib/hdb/ext.c @@ -101,7 +101,7 @@ ext2 = hdb_find_extension(entry, ext->data.element); } else { /* - * This is an unknown extention, and we are asked to replace a + * This is an unknown extension, and we are asked to replace a * possible entry in `entry' that is of the same type. This * might seem impossible, but ASN.1 CHOICE comes to our * rescue. The first tag in each branch in the CHOICE is @@ -120,7 +120,7 @@ &size); if (ret) { krb5_set_error_message(context, ret, "hdb: failed to decode " - "replacement hdb extention"); + "replacement hdb extension"); return ret; } @@ -136,7 +136,7 @@ &size); if (ret) { krb5_set_error_message(context, ret, "hdb: failed to decode " - "present hdb extention"); + "present hdb extension"); return ret; } @@ -153,7 +153,7 @@ ret = copy_HDB_extension(ext, ext2); if (ret) krb5_set_error_message(context, ret, "hdb: failed to copy replacement " - "hdb extention"); + "hdb extension"); return ret; } @@ -432,3 +432,101 @@ return 0; } + +unsigned int +hdb_entry_get_kvno_diff_clnt(const hdb_entry *entry) +{ + const HDB_extension *ext; + + ext = hdb_find_extension(entry, + choice_HDB_extension_data_hist_kvno_diff_clnt); + if (ext) + return ext->data.u.hist_kvno_diff_clnt; + return 1; +} + +krb5_error_code +hdb_entry_set_kvno_diff_clnt(krb5_context context, hdb_entry *entry, + unsigned int diff) +{ + HDB_extension ext; + + if (diff > 16384) + return EINVAL; + ext.mandatory = FALSE; + ext.data.element = choice_HDB_extension_data_hist_kvno_diff_clnt; + ext.data.u.hist_kvno_diff_clnt = diff; + return hdb_replace_extension(context, entry, &ext); +} + +krb5_error_code +hdb_entry_clear_kvno_diff_clnt(krb5_context context, hdb_entry *entry) +{ + return hdb_clear_extension(context, entry, + choice_HDB_extension_data_hist_kvno_diff_clnt); +} + +unsigned int +hdb_entry_get_kvno_diff_svc(const hdb_entry *entry) +{ + const HDB_extension *ext; + + ext = hdb_find_extension(entry, + choice_HDB_extension_data_hist_kvno_diff_svc); + if (ext) + return ext->data.u.hist_kvno_diff_svc; + return 1024; /* max_life effectively provides a better default */ +} + +krb5_error_code +hdb_entry_set_kvno_diff_svc(krb5_context context, hdb_entry *entry, + unsigned int diff) +{ + HDB_extension ext; + + if (diff > 16384) + return EINVAL; + ext.mandatory = FALSE; + ext.data.element = choice_HDB_extension_data_hist_kvno_diff_svc; + ext.data.u.hist_kvno_diff_svc = diff; + return hdb_replace_extension(context, entry, &ext); +} + +krb5_error_code +hdb_entry_clear_kvno_diff_svc(krb5_context context, hdb_entry *entry) +{ + return hdb_clear_extension(context, entry, + choice_HDB_extension_data_hist_kvno_diff_svc); +} + +krb5_error_code +hdb_set_last_modified_by(krb5_context context, hdb_entry *entry, + krb5_principal modby, time_t modtime) +{ + krb5_error_code ret; + Event *old_ev; + Event *ev; + + old_ev = entry->modified_by; + + ev = calloc(1, sizeof (*ev)); + if (!ev) + return ENOMEM; + if (modby) + ret = krb5_copy_principal(context, modby, &ev->principal); + else + ret = krb5_parse_name(context, "root/admin", &ev->principal); + if (ret) { + free(ev); + return ret; + } + ev->time = modtime; + if (!ev->time) + time(&ev->time); + + entry->modified_by = ev; + if (old_ev) + free_Event(old_ev); + return 0; +} + diff --git a/crypto/heimdal/lib/hdb/hdb-ldap.c b/crypto/heimdal/lib/hdb/hdb-ldap.c --- a/crypto/heimdal/lib/hdb/hdb-ldap.c +++ b/crypto/heimdal/lib/hdb/hdb-ldap.c @@ -2,6 +2,7 @@ * Copyright (c) 1999-2001, 2003, PADL Software Pty Ltd. * Copyright (c) 2004, Andrew Bartlett. * Copyright (c) 2003 - 2008, Kungliga Tekniska Högskolan. + * Copyright (c) 2015, Timothy Pearson. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -50,6 +51,7 @@ static const char *default_structural_object = "account"; static char *structural_object; +static const char *default_ldap_url = "ldapi:///"; static krb5_boolean samba_forwardable; struct hdbldapdb { @@ -57,6 +59,9 @@ int h_msgid; char *h_base; char *h_url; + char *h_bind_dn; + char *h_bind_password; + krb5_boolean h_start_tls; char *h_createbase; }; @@ -66,6 +71,8 @@ do { ((struct hdbldapdb *)(db)->hdb_db)->h_msgid = msgid; } while(0) #define HDB2BASE(dn) (((struct hdbldapdb *)(db)->hdb_db)->h_base) #define HDB2URL(dn) (((struct hdbldapdb *)(db)->hdb_db)->h_url) +#define HDB2BINDDN(db) (((struct hdbldapdb *)(db)->hdb_db)->h_bind_dn) +#define HDB2BINDPW(db) (((struct hdbldapdb *)(db)->hdb_db)->h_bind_password) #define HDB2CREATE(db) (((struct hdbldapdb *)(db)->hdb_db)->h_createbase) /* @@ -85,6 +92,7 @@ "krb5PasswordEnd", "krb5PrincipalName", "krb5PrincipalRealm", + "krb5ExtendedAttributes", "krb5ValidEnd", "krb5ValidStart", "modifiersName", @@ -510,6 +518,33 @@ goto out; } + if (is_heimdal_entry && ent->entry.extensions) { + if (!is_new_entry) { + vals = ldap_get_values_len(HDB2LDAP(db), msg, "krb5ExtendedAttributes"); + if (vals) { + ldap_value_free_len(vals); + ret = LDAP_addmod(&mods, LDAP_MOD_DELETE, "krb5ExtendedAttributes", NULL); + if (ret) + goto out; + } + } + + for (i = 0; i < ent->entry.extensions->len; i++) { + unsigned char *buf; + size_t size, sz = 0; + + ASN1_MALLOC_ENCODE(HDB_extension, buf, size, &ent->entry.extensions->val[i], &sz, ret); + if (ret) + goto out; + if (size != sz) + krb5_abortx(context, "internal error in ASN.1 encoder"); + + ret = LDAP_addmod_len(&mods, LDAP_MOD_ADD, "krb5ExtendedAttributes", buf, sz); + if (ret) + goto out; + } + } + if (is_heimdal_entry && ent->entry.valid_start) { if (orig.entry.valid_end == NULL || (*(ent->entry.valid_start) != *(orig.entry.valid_start))) { @@ -797,10 +832,10 @@ (c == 0x7f); } -const static char hexchar[] = "0123456789ABCDEF"; +static const char hexchar[] = "0123456789ABCDEF"; static krb5_error_code -escape_value(krb5_context context, const unsigned char *unquoted, char **quoted) +escape_value(krb5_context context, const char *unquoted, char **quoted) { size_t i, len; @@ -816,7 +851,7 @@ } for (i = 0; unquoted[0] ; unquoted++) { - if (need_quote((unsigned char *)unquoted[0])) { + if (need_quote((unsigned char)unquoted[0])) { (*quoted)[i++] = '\\'; (*quoted)[i++] = hexchar[(unquoted[0] >> 4) & 0xf]; (*quoted)[i++] = hexchar[(unquoted[0] ) & 0xf]; @@ -975,6 +1010,7 @@ char *unparsed_name = NULL, *dn = NULL, *ntPasswordIN = NULL; char *samba_acct_flags = NULL; struct berval **keys; + struct berval **extensions; struct berval **vals; int tmp, tmp_time, i, ret, have_arcfour = 0; @@ -1013,7 +1049,6 @@ keys = ldap_get_values_len(HDB2LDAP(db), msg, "krb5Key"); if (keys != NULL) { - int i; size_t l; ent->entry.keys.len = ldap_count_values_len(keys); @@ -1043,10 +1078,35 @@ #endif } + extensions = ldap_get_values_len(HDB2LDAP(db), msg, "krb5ExtendedAttributes"); + if (extensions != NULL) { + size_t l; + + ent->entry.extensions = calloc(1, sizeof(*(ent->entry.extensions))); + if (ent->entry.extensions == NULL) { + ret = krb5_enomem(context); + goto out; + } + ent->entry.extensions->len = ldap_count_values_len(extensions); + ent->entry.extensions->val = (HDB_extension *) calloc(ent->entry.extensions->len, sizeof(HDB_extension)); + if (ent->entry.extensions->val == NULL) { + ent->entry.extensions->len = 0; + ret = krb5_enomem(context); + goto out; + } + for (i = 0; i < ent->entry.extensions->len; i++) { + ret = decode_HDB_extension((unsigned char *) extensions[i]->bv_val, + (size_t) extensions[i]->bv_len, &ent->entry.extensions->val[i], &l); + if (ret) + krb5_set_error_message(context, ret, "decode_HDB_extension failed"); + } + ber_bvecfree(extensions); + } else { + ent->entry.extensions = NULL; + } + vals = ldap_get_values_len(HDB2LDAP(db), msg, "krb5EncryptionType"); if (vals != NULL) { - int i; - ent->entry.etypes = malloc(sizeof(*(ent->entry.etypes))); if (ent->entry.etypes == NULL) { ret = ENOMEM; @@ -1054,7 +1114,8 @@ goto out; } ent->entry.etypes->len = ldap_count_values_len(vals); - ent->entry.etypes->val = calloc(ent->entry.etypes->len, sizeof(int)); + ent->entry.etypes->val = calloc(ent->entry.etypes->len, + sizeof(ent->entry.etypes->val[0])); if (ent->entry.etypes->val == NULL) { ret = ENOMEM; krb5_set_error_message(context, ret, "malloc: out of memory"); @@ -1089,24 +1150,22 @@ ret = LDAP_get_string_value(db, msg, "sambaNTPassword", &ntPasswordIN); if (ret == 0 && have_arcfour == 0) { unsigned *etypes; - Key *keys; - int i; + Key *ks; - keys = realloc(ent->entry.keys.val, - (ent->entry.keys.len + 1) * sizeof(ent->entry.keys.val[0])); - if (keys == NULL) { - free(ntPasswordIN); + ks = realloc(ent->entry.keys.val, + (ent->entry.keys.len + 1) * + sizeof(ent->entry.keys.val[0])); + if (ks == NULL) { ret = ENOMEM; krb5_set_error_message(context, ret, "malloc: out of memory"); goto out; } - ent->entry.keys.val = keys; + ent->entry.keys.val = ks; memset(&ent->entry.keys.val[ent->entry.keys.len], 0, sizeof(Key)); ent->entry.keys.val[ent->entry.keys.len].key.keytype = ETYPE_ARCFOUR_HMAC_MD5; ret = krb5_data_alloc (&ent->entry.keys.val[ent->entry.keys.len].key.keyvalue, 16); if (ret) { krb5_set_error_message(context, ret, "malloc: out of memory"); - free(ntPasswordIN); ret = ENOMEM; goto out; } @@ -1239,21 +1298,24 @@ if (ret == 0) { time_t delta; - if (ent->entry.pw_end == NULL) { - ent->entry.pw_end = malloc(sizeof(*ent->entry.pw_end)); - if (ent->entry.pw_end == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, "malloc: out of memory"); - goto out; - } - } - delta = krb5_config_get_time_default(context, NULL, - 365 * 24 * 60 * 60, + 0, "kadmin", "password_lifetime", NULL); - *ent->entry.pw_end = tmp_time + delta; + + if (delta) { + if (ent->entry.pw_end == NULL) { + ent->entry.pw_end = malloc(sizeof(*ent->entry.pw_end)); + if (ent->entry.pw_end == NULL) { + ret = ENOMEM; + krb5_set_error_message(context, ret, "malloc: out of memory"); + goto out; + } + } + + *ent->entry.pw_end = tmp_time + delta; + } } ret = LDAP_get_integer_value(db, msg, "sambaPwdMustChange", &tmp_time); @@ -1333,7 +1395,6 @@ */ - int i; int flags_len = strlen(samba_acct_flags); if (flags_len < 2) @@ -1397,8 +1458,8 @@ ret = 0; out: - if (unparsed_name) - free(unparsed_name); + free(unparsed_name); + free(ntPasswordIN); if (ret) hdb_free_entry(context, ent); @@ -1513,7 +1574,7 @@ "(|(objectClass=krb5Principal)(objectClass=sambaSamAccount))", krb5kdcentry_attrs, 0, NULL, NULL, NULL, 0, &msgid); - if (msgid < 0) + if (ret != LDAP_SUCCESS || msgid < 0) return HDB_ERR_NOENTRY; HDBSETMSGID(db, msgid); @@ -1539,6 +1600,16 @@ * bind in progress message. */ struct berval bv = { 0, "" }; + const char *sasl_method = "EXTERNAL"; + const char *bind_dn = NULL; + + if (HDB2BINDDN(db) != NULL && HDB2BINDPW(db) != NULL) { + /* A bind DN was specified; use SASL SIMPLE */ + bind_dn = HDB2BINDDN(db); + sasl_method = LDAP_SASL_SIMPLE; + bv.bv_val = HDB2BINDPW(db); + bv.bv_len = strlen(bv.bv_val); + } if (HDB2LDAP(db)) { /* connection has been opened. ping server. */ @@ -1572,7 +1643,18 @@ return HDB_ERR_BADVERSION; } - rc = ldap_sasl_bind_s(HDB2LDAP(db), NULL, "EXTERNAL", &bv, + if (((struct hdbldapdb *)db->hdb_db)->h_start_tls) { + rc = ldap_start_tls_s(HDB2LDAP(db), NULL, NULL); + + if (rc != LDAP_SUCCESS) { + krb5_set_error_message(context, HDB_ERR_BADVERSION, + "ldap_start_tls_s: %s", ldap_err2string(rc)); + LDAP_close(context, db); + return HDB_ERR_BADVERSION; + } + } + + rc = ldap_sasl_bind_s(HDB2LDAP(db), bind_dn, sasl_method, &bv, NULL, NULL, NULL); if (rc != LDAP_SUCCESS) { krb5_set_error_message(context, HDB_ERR_BADVERSION, @@ -1635,6 +1717,7 @@ return ret; } +#if 0 static krb5_error_code LDAP_fetch(krb5_context context, HDB * db, krb5_const_principal principal, unsigned flags, hdb_entry_ex * entry) @@ -1642,6 +1725,7 @@ return LDAP_fetch_kvno(context, db, principal, flags & (~HDB_F_KVNO_SPECIFIED), 0, entry); } +#endif static krb5_error_code LDAP_store(krb5_context context, HDB * db, unsigned flags, @@ -1654,6 +1738,9 @@ LDAPMessage *msg = NULL, *e = NULL; char *dn = NULL, *name = NULL; + if ((flags & HDB_F_PRECHECK)) + return 0; /* we can't guarantee whether we'll be able to perform it */ + ret = LDAP_principal2message(context, db, entry->entry.principal, &msg); if (ret == 0) e = ldap_first_entry(HDB2LDAP(db), msg); @@ -1725,13 +1812,17 @@ } static krb5_error_code -LDAP_remove(krb5_context context, HDB *db, krb5_const_principal principal) +LDAP_remove(krb5_context context, HDB *db, + unsigned flags, krb5_const_principal principal) { krb5_error_code ret; LDAPMessage *msg, *e; char *dn = NULL; int rc, limit = LDAP_NO_LIMIT; + if ((flags & HDB_F_PRECHECK)) + return 0; /* we can't guarantee whether we'll be able to perform it */ + ret = LDAP_principal2message(context, db, principal, &msg); if (ret) goto out; @@ -1795,6 +1886,13 @@ return ret; } +static krb5_error_code +LDAP_set_sync(krb5_context context, HDB * db, int on) +{ + (void)on; + return 0; +} + static krb5_error_code hdb_ldap_common(krb5_context context, HDB ** db, @@ -1803,8 +1901,19 @@ { struct hdbldapdb *h; const char *create_base = NULL; + const char *ldap_secret_file = NULL; + + if (url == NULL || url[0] == '\0') { + const char *p; + p = krb5_config_get_string(context, NULL, "kdc", + "hdb-ldap-url", NULL); + if (p == NULL) + p = default_ldap_url; - if (search_base == NULL && search_base[0] == '\0') { + url = p; + } + + if (search_base == NULL || search_base[0] == '\0') { krb5_set_error_message(context, ENOMEM, "ldap search base not configured"); return ENOMEM; /* XXX */ } @@ -1860,6 +1969,34 @@ return ENOMEM; } + ldap_secret_file = krb5_config_get_string(context, NULL, "kdc", + "hdb-ldap-secret-file", NULL); + if (ldap_secret_file != NULL) { + krb5_config_binding *tmp; + krb5_error_code ret; + const char *p; + + ret = krb5_config_parse_file(context, ldap_secret_file, &tmp); + if (ret) + return ret; + + p = krb5_config_get_string(context, tmp, "kdc", + "hdb-ldap-bind-dn", NULL); + if (p != NULL) + h->h_bind_dn = strdup(p); + + p = krb5_config_get_string(context, tmp, "kdc", + "hdb-ldap-bind-password", NULL); + if (p != NULL) + h->h_bind_password = strdup(p); + + krb5_config_file_free(context, tmp); + } + + h->h_start_tls = + krb5_config_get_bool_default(context, NULL, FALSE, + "kdc", "hdb-ldap-start-tls", NULL); + create_base = krb5_config_get_string(context, NULL, "kdc", "hdb-ldap-create-base", NULL); if (create_base == NULL) @@ -1875,7 +2012,7 @@ (*db)->hdb_master_key_set = 0; (*db)->hdb_openp = 0; - (*db)->hdb_capability_flags = 0; + (*db)->hdb_capability_flags = HDB_CAP_F_SHARED_DIRECTORY; (*db)->hdb_open = LDAP_open; (*db)->hdb_close = LDAP_close; (*db)->hdb_fetch_kvno = LDAP_fetch_kvno; @@ -1890,24 +2027,32 @@ (*db)->hdb__put = NULL; (*db)->hdb__del = NULL; (*db)->hdb_destroy = LDAP_destroy; + (*db)->hdb_set_sync = LDAP_set_sync; return 0; } +#ifdef OPENLDAP_MODULE +static +#endif + krb5_error_code hdb_ldap_create(krb5_context context, HDB ** db, const char *arg) { - return hdb_ldap_common(context, db, arg, "ldapi:///"); + return hdb_ldap_common(context, db, arg, NULL); } +#ifdef OPENLDAP_MODULE +static +#endif + krb5_error_code hdb_ldapi_create(krb5_context context, HDB ** db, const char *arg) { krb5_error_code ret; char *search_base, *p; - asprintf(&p, "ldapi:%s", arg); - if (p == NULL) { + if (asprintf(&p, "ldapi:%s", arg) == -1 || p == NULL) { *db = NULL; krb5_set_error_message(context, ENOMEM, "out of memory"); return ENOMEM; @@ -1928,19 +2073,33 @@ } #ifdef OPENLDAP_MODULE +static krb5_error_code +init(krb5_context context, void **ctx) +{ + *ctx = NULL; + return 0; +} -struct hdb_so_method hdb_ldap_interface = { +static void +fini(void *ctx) +{ +} + +struct hdb_method hdb_ldap_interface = { HDB_INTERFACE_VERSION, + init, + fini, "ldap", hdb_ldap_create }; -struct hdb_so_method hdb_ldapi_interface = { +struct hdb_method hdb_ldapi_interface = { HDB_INTERFACE_VERSION, + init, + fini, "ldapi", hdb_ldapi_create }; - #endif #endif /* OPENLDAP */ diff --git a/crypto/heimdal/lib/hdb/hdb-mdb.c b/crypto/heimdal/lib/hdb/hdb-mdb.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hdb/hdb-mdb.c @@ -0,0 +1,417 @@ +/* + * Copyright (c) 1997 - 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * Copyright (c) 2011 - Howard Chu, Symas Corp. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "hdb_locl.h" + +#if HAVE_LMDB + +/* LMDB */ + +#include + +#define KILO 1024 + +typedef struct mdb_info { + MDB_env *e; + MDB_txn *t; + MDB_dbi d; + MDB_cursor *c; +} mdb_info; + +static krb5_error_code +DB_close(krb5_context context, HDB *db) +{ + mdb_info *mi = (mdb_info *)db->hdb_db; + + mdb_cursor_close(mi->c); + mdb_txn_abort(mi->t); + mdb_env_close(mi->e); + mi->c = 0; + mi->t = 0; + mi->e = 0; + return 0; +} + +static krb5_error_code +DB_destroy(krb5_context context, HDB *db) +{ + krb5_error_code ret; + + ret = hdb_clear_master_key (context, db); + free(db->hdb_name); + free(db->hdb_db); + free(db); + return ret; +} + +static krb5_error_code +DB_set_sync(krb5_context context, HDB *db, int on) +{ + mdb_info *mi = (mdb_info *)db->hdb_db; + + mdb_env_set_flags(mi->e, MDB_NOSYNC, !on); + return mdb_env_sync(mi->e, 0); +} + +static krb5_error_code +DB_lock(krb5_context context, HDB *db, int operation) +{ + db->lock_count++; + return 0; +} + +static krb5_error_code +DB_unlock(krb5_context context, HDB *db) +{ + if (db->lock_count > 1) { + db->lock_count--; + return 0; + } + heim_assert(db->lock_count == 1, "HDB lock/unlock sequence does not match"); + db->lock_count--; + return 0; +} + + +static krb5_error_code +DB_seq(krb5_context context, HDB *db, + unsigned flags, hdb_entry_ex *entry, int flag) +{ + mdb_info *mi = db->hdb_db; + MDB_val key, value; + krb5_data key_data, data; + int code; + + key.mv_size = 0; + value.mv_size = 0; + code = mdb_cursor_get(mi->c, &key, &value, flag); + if (code == MDB_NOTFOUND) + return HDB_ERR_NOENTRY; + if (code) + return code; + + key_data.data = key.mv_data; + key_data.length = key.mv_size; + data.data = value.mv_data; + data.length = value.mv_size; + memset(entry, 0, sizeof(*entry)); + if (hdb_value2entry(context, &data, &entry->entry)) + return DB_seq(context, db, flags, entry, MDB_NEXT); + if (db->hdb_master_key_set && (flags & HDB_F_DECRYPT)) { + code = hdb_unseal_keys (context, db, &entry->entry); + if (code) + hdb_free_entry (context, entry); + } + if (entry->entry.principal == NULL) { + entry->entry.principal = malloc(sizeof(*entry->entry.principal)); + if (entry->entry.principal == NULL) { + hdb_free_entry (context, entry); + krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); + return ENOMEM; + } else { + hdb_key2principal(context, &key_data, entry->entry.principal); + } + } + return 0; +} + + +static krb5_error_code +DB_firstkey(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry) +{ + mdb_info *mi = db->hdb_db; + int code; + + /* Always start with a fresh cursor to pick up latest DB state */ + if (mi->t) + mdb_txn_abort(mi->t); + + code = mdb_txn_begin(mi->e, NULL, MDB_RDONLY, &mi->t); + if (code) + return code; + + code = mdb_cursor_open(mi->t, mi->d, &mi->c); + if (code) + return code; + + return DB_seq(context, db, flags, entry, MDB_FIRST); +} + + +static krb5_error_code +DB_nextkey(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry) +{ + return DB_seq(context, db, flags, entry, MDB_NEXT); +} + +static krb5_error_code +DB_rename(krb5_context context, HDB *db, const char *new_name) +{ + int ret; + char *old, *new; + + if (strncmp(new_name, "mdb:", sizeof("mdb:") - 1) == 0) + new_name += sizeof("mdb:") - 1; + else if (strncmp(new_name, "lmdb:", sizeof("lmdb:") - 1) == 0) + new_name += sizeof("lmdb:") - 1; + if (asprintf(&old, "%s.mdb", db->hdb_name) == -1) + return ENOMEM; + if (asprintf(&new, "%s.mdb", new_name) == -1) { + free(old); + return ENOMEM; + } + ret = rename(old, new); + free(old); + free(new); + if(ret) + return errno; + + free(db->hdb_name); + db->hdb_name = strdup(new_name); + return 0; +} + +static krb5_error_code +DB__get(krb5_context context, HDB *db, krb5_data key, krb5_data *reply) +{ + mdb_info *mi = (mdb_info*)db->hdb_db; + MDB_txn *txn; + MDB_val k, v; + int code; + + k.mv_data = key.data; + k.mv_size = key.length; + + code = mdb_txn_begin(mi->e, NULL, MDB_RDONLY, &txn); + if (code) + return code; + + code = mdb_get(txn, mi->d, &k, &v); + if (code == 0) + krb5_data_copy(reply, v.mv_data, v.mv_size); + mdb_txn_abort(txn); + if(code == MDB_NOTFOUND) + return HDB_ERR_NOENTRY; + return code; +} + +static krb5_error_code +DB__put(krb5_context context, HDB *db, int replace, + krb5_data key, krb5_data value) +{ + mdb_info *mi = (mdb_info*)db->hdb_db; + MDB_txn *txn; + MDB_val k, v; + int code; + + k.mv_data = key.data; + k.mv_size = key.length; + v.mv_data = value.data; + v.mv_size = value.length; + + code = mdb_txn_begin(mi->e, NULL, 0, &txn); + if (code) + return code; + + code = mdb_put(txn, mi->d, &k, &v, replace ? 0 : MDB_NOOVERWRITE); + if (code) + mdb_txn_abort(txn); + else + code = mdb_txn_commit(txn); + /* + * No need to call mdb_env_sync(); it's done automatically if MDB_NOSYNC is + * not set. + */ + if(code == MDB_KEYEXIST) + return HDB_ERR_EXISTS; + return code; +} + +static krb5_error_code +DB__del(krb5_context context, HDB *db, krb5_data key) +{ + mdb_info *mi = (mdb_info*)db->hdb_db; + MDB_txn *txn; + MDB_val k; + krb5_error_code code; + + k.mv_data = key.data; + k.mv_size = key.length; + + code = mdb_txn_begin(mi->e, NULL, 0, &txn); + if (code) + return code; + + code = mdb_del(txn, mi->d, &k, NULL); + if (code) + mdb_txn_abort(txn); + else + code = mdb_txn_commit(txn); + /* + * No need to call mdb_env_sync(); it's done automatically if MDB_NOSYNC is + * not set. + */ + if(code == MDB_NOTFOUND) + return HDB_ERR_NOENTRY; + return code; +} + +static krb5_error_code +DB_open(krb5_context context, HDB *db, int flags, mode_t mode) +{ + mdb_info *mi = (mdb_info *)db->hdb_db; + MDB_txn *txn; + char *fn; + krb5_error_code ret; + int myflags = MDB_NOSUBDIR, tmp; + + if((flags & O_ACCMODE) == O_RDONLY) + myflags |= MDB_RDONLY; + + if (asprintf(&fn, "%s.mdb", db->hdb_name) == -1) + return krb5_enomem(context); + if (mdb_env_create(&mi->e)) { + free(fn); + return krb5_enomem(context); + } + + tmp = krb5_config_get_int_default(context, NULL, 0, "kdc", + "hdb-mdb-maxreaders", NULL); + if (tmp) { + ret = mdb_env_set_maxreaders(mi->e, tmp); + if (ret) { + free(fn); + krb5_set_error_message(context, ret, "setting maxreaders on %s: %s", + db->hdb_name, mdb_strerror(ret)); + return ret; + } + } + + tmp = krb5_config_get_int_default(context, NULL, 0, "kdc", + "hdb-mdb-mapsize", NULL); + if (tmp) { + size_t maps = tmp; + maps *= KILO; + ret = mdb_env_set_mapsize(mi->e, maps); + if (ret) { + free(fn); + krb5_set_error_message(context, ret, "setting mapsize on %s: %s", + db->hdb_name, mdb_strerror(ret)); + return ret; + } + } + + ret = mdb_env_open(mi->e, fn, myflags, mode); + free(fn); + if (ret) { +fail: + mdb_env_close(mi->e); + mi->e = 0; + krb5_set_error_message(context, ret, "opening %s: %s", + db->hdb_name, mdb_strerror(ret)); + return ret; + } + + ret = mdb_txn_begin(mi->e, NULL, MDB_RDONLY, &txn); + if (ret) + goto fail; + + ret = mdb_open(txn, NULL, 0, &mi->d); + mdb_txn_abort(txn); + if (ret) + goto fail; + + if((flags & O_ACCMODE) == O_RDONLY) + ret = hdb_check_db_format(context, db); + else + ret = hdb_init_db(context, db); + if(ret == HDB_ERR_NOENTRY) + return 0; + if (ret) { + DB_close(context, db); + krb5_set_error_message(context, ret, "hdb_open: failed %s database %s", + (flags & O_ACCMODE) == O_RDONLY ? + "checking format of" : "initialize", + db->hdb_name); + } + + return ret; +} + +krb5_error_code +hdb_mdb_create(krb5_context context, HDB **db, + const char *filename) +{ + *db = calloc(1, sizeof(**db)); + if (*db == NULL) { + krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); + return ENOMEM; + } + + (*db)->hdb_db = calloc(1, sizeof(mdb_info)); + if ((*db)->hdb_db == NULL) { + free(*db); + *db = NULL; + krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); + return ENOMEM; + } + (*db)->hdb_name = strdup(filename); + if ((*db)->hdb_name == NULL) { + free((*db)->hdb_db); + free(*db); + *db = NULL; + krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); + return ENOMEM; + } + (*db)->hdb_master_key_set = 0; + (*db)->hdb_openp = 0; + (*db)->hdb_capability_flags = HDB_CAP_F_HANDLE_ENTERPRISE_PRINCIPAL; + (*db)->hdb_open = DB_open; + (*db)->hdb_close = DB_close; + (*db)->hdb_fetch_kvno = _hdb_fetch_kvno; + (*db)->hdb_store = _hdb_store; + (*db)->hdb_remove = _hdb_remove; + (*db)->hdb_firstkey = DB_firstkey; + (*db)->hdb_nextkey= DB_nextkey; + (*db)->hdb_lock = DB_lock; + (*db)->hdb_unlock = DB_unlock; + (*db)->hdb_rename = DB_rename; + (*db)->hdb__get = DB__get; + (*db)->hdb__put = DB__put; + (*db)->hdb__del = DB__del; + (*db)->hdb_destroy = DB_destroy; + (*db)->hdb_set_sync = DB_set_sync; + return 0; +} +#endif /* HAVE_LMDB */ diff --git a/crypto/heimdal/lib/hdb/hdb-mitdb.c b/crypto/heimdal/lib/hdb/hdb-mitdb.c --- a/crypto/heimdal/lib/hdb/hdb-mitdb.c +++ b/crypto/heimdal/lib/hdb/hdb-mitdb.c @@ -91,18 +91,33 @@ #include "hdb_locl.h" -#define KDB_V1_BASE_LENGTH 38 +typedef struct MITDB { + HDB db; /* Generic */ + int do_sync; /* MITDB-specific */ +} MITDB; -#if HAVE_DB1 +static void +attr_to_flags(unsigned attr, HDBFlags *flags) +{ + flags->postdate = !(attr & KRB5_KDB_DISALLOW_POSTDATED); + flags->forwardable = !(attr & KRB5_KDB_DISALLOW_FORWARDABLE); + flags->initial = !!(attr & KRB5_KDB_DISALLOW_TGT_BASED); + flags->renewable = !(attr & KRB5_KDB_DISALLOW_RENEWABLE); + flags->proxiable = !(attr & KRB5_KDB_DISALLOW_PROXIABLE); + /* DUP_SKEY */ + flags->invalid = !!(attr & KRB5_KDB_DISALLOW_ALL_TIX); + flags->require_preauth = !!(attr & KRB5_KDB_REQUIRES_PRE_AUTH); + flags->require_hwauth = !!(attr & KRB5_KDB_REQUIRES_HW_AUTH); + flags->server = !(attr & KRB5_KDB_DISALLOW_SVR); + flags->change_pw = !!(attr & KRB5_KDB_PWCHANGE_SERVICE); + flags->client = 1; /* XXX */ +} -#if defined(HAVE_DB_185_H) -#include -#elif defined(HAVE_DB_H) -#include -#endif +#define KDB_V1_BASE_LENGTH 38 #define CHECK(x) do { if ((x)) goto out; } while(0) +#ifdef HAVE_DB1 static krb5_error_code mdb_principal2key(krb5_context context, krb5_const_principal principal, @@ -118,6 +133,7 @@ key->length = strlen(str) + 1; return 0; } +#endif /* HAVE_DB1 */ #define KRB5_KDB_SALTTYPE_NORMAL 0 #define KRB5_KDB_SALTTYPE_V4 1 @@ -128,10 +144,10 @@ #define KRB5_KDB_SALTTYPE_CERTHASH 6 static krb5_error_code -fix_salt(krb5_context context, hdb_entry *ent, int key_num) +fix_salt(krb5_context context, hdb_entry *ent, Key *k) { krb5_error_code ret; - Salt *salt = ent->keys.val[key_num].salt; + Salt *salt = k->salt; /* fix salt type */ switch((int)salt->type) { case KRB5_KDB_SALTTYPE_NORMAL: @@ -187,8 +203,8 @@ break; case KRB5_KDB_SALTTYPE_CERTHASH: krb5_data_free(&salt->salt); - free(ent->keys.val[key_num].salt); - ent->keys.val[key_num].salt = NULL; + free(k->salt); + k->salt = NULL; break; default: abort(); @@ -197,16 +213,216 @@ } +/** + * This function takes a key from a krb5_storage from an MIT KDB encoded + * entry and places it in the given Key object. + * + * @param context Context + * @param entry HDB entry + * @param sp krb5_storage with current offset set to the beginning of a + * key + * @param version See comments in caller body for the backstory on this + * @param k Key * to load the key into + */ +static krb5_error_code +mdb_keyvalue2key(krb5_context context, hdb_entry *entry, krb5_storage *sp, uint16_t version, Key *k) +{ + size_t i; + uint16_t u16, type; + krb5_error_code ret; + + k->mkvno = malloc(sizeof(*k->mkvno)); + if (k->mkvno == NULL) { + ret = ENOMEM; + goto out; + } + *k->mkvno = 1; + + for (i = 0; i < version; i++) { + CHECK(ret = krb5_ret_uint16(sp, &type)); + CHECK(ret = krb5_ret_uint16(sp, &u16)); + if (i == 0) { + /* This "version" means we have a key */ + k->key.keytype = type; + /* + * MIT stores keys encrypted keys as {16-bit length + * of plaintext key, {encrypted key}}. The reason + * for this is that the Kerberos cryptosystem is not + * length-preserving. Heimdal's approach is to + * truncate the plaintext to the expected length of + * the key given its enctype, so we ignore this + * 16-bit length-of-plaintext-key field. + */ + if (u16 > 2) { + krb5_storage_seek(sp, 2, SEEK_CUR); /* skip real length */ + k->key.keyvalue.length = u16 - 2; /* adjust cipher len */ + k->key.keyvalue.data = malloc(k->key.keyvalue.length); + krb5_storage_read(sp, k->key.keyvalue.data, + k->key.keyvalue.length); + } else { + /* We'll ignore this key; see our caller */ + k->key.keyvalue.length = 0; + k->key.keyvalue.data = NULL; + krb5_storage_seek(sp, u16, SEEK_CUR); /* skip real length */ + } + } else if (i == 1) { + /* This "version" means we have a salt */ + k->salt = calloc(1, sizeof(*k->salt)); + if (k->salt == NULL) { + ret = ENOMEM; + goto out; + } + k->salt->type = type; + if (u16 != 0) { + k->salt->salt.data = malloc(u16); + if (k->salt->salt.data == NULL) { + ret = ENOMEM; + goto out; + } + k->salt->salt.length = u16; + krb5_storage_read(sp, k->salt->salt.data, k->salt->salt.length); + } + fix_salt(context, entry, k); + } else { + /* + * Whatever this "version" might be, we skip it + * + * XXX A krb5.conf parameter requesting that we log + * about strangeness like this, or return an error + * from here, might be nice. + */ + krb5_storage_seek(sp, u16, SEEK_CUR); + } + } + + return 0; + +out: + free_Key(k); + return ret; +} + + +static krb5_error_code +add_1des_dup(krb5_context context, Keys *keys, Key *key, krb5_keytype keytype) +{ + key->key.keytype = keytype; + return add_Keys(keys, key); +} + +/* + * This monstrosity is here so we can avoid having to do enctype + * similarity checking in the KDC. This helper function dups 1DES keys + * in a keyset for all the similar 1DES enctypes for which keys are + * missing. And, of course, we do this only if there's any 1DES keys in + * the keyset to begin with. + */ +static krb5_error_code +dup_similar_keys_in_keyset(krb5_context context, Keys *keys) +{ + krb5_error_code ret; + size_t i, k; + Key key; + int keyset_has_1des_crc = 0; + int keyset_has_1des_md4 = 0; + int keyset_has_1des_md5 = 0; + + memset(&key, 0, sizeof (key)); + k = keys->len; + for (i = 0; i < keys->len; i++) { + if (keys->val[i].key.keytype == ETYPE_DES_CBC_CRC) { + keyset_has_1des_crc = 1; + if (k == keys->len) + k = i; + } else if (keys->val[i].key.keytype == ETYPE_DES_CBC_MD4) { + keyset_has_1des_crc = 1; + if (k == keys->len) + k = i; + } else if (keys->val[i].key.keytype == ETYPE_DES_CBC_MD5) { + keyset_has_1des_crc = 1; + if (k == keys->len) + k = i; + } + } + if (k == keys->len) + return 0; + + ret = copy_Key(&keys->val[k], &key); + if (ret) + return ret; + if (!keyset_has_1des_crc) { + ret = add_1des_dup(context, keys, &key, ETYPE_DES_CBC_CRC); + if (ret) + goto out; + } + if (!keyset_has_1des_md4) { + ret = add_1des_dup(context, keys, &key, ETYPE_DES_CBC_MD4); + if (ret) + goto out; + } + if (!keyset_has_1des_md5) { + ret = add_1des_dup(context, keys, &key, ETYPE_DES_CBC_MD5); + if (ret) + goto out; + } + +out: + free_Key(&key); + return ret; +} + + static krb5_error_code -mdb_value2entry(krb5_context context, krb5_data *data, krb5_kvno kvno, hdb_entry *entry) +dup_similar_keys(krb5_context context, hdb_entry *entry) +{ + krb5_error_code ret; + HDB_Ext_KeySet *hist_keys; + HDB_extension *extp; + size_t i; + + ret = dup_similar_keys_in_keyset(context, &entry->keys); + if (ret) + return ret; + extp = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys); + if (extp == NULL) + return 0; + + hist_keys = &extp->data.u.hist_keys; + for (i = 0; i < hist_keys->len; i++) { + ret = dup_similar_keys_in_keyset(context, &hist_keys->val[i].keys); + if (ret) + return ret; + } + return 0; +} + + +/** + * This function parses an MIT krb5 encoded KDB entry and fills in the + * given HDB entry with it. + * + * @param context krb5_context + * @param data Encoded MIT KDB entry + * @param target_kvno Desired kvno, or 0 for the entry's current kvno + * @param entry Desired kvno, or 0 for the entry's current kvno + */ +krb5_error_code +_hdb_mdb_value2entry(krb5_context context, krb5_data *data, + krb5_kvno target_kvno, hdb_entry *entry) { krb5_error_code ret; krb5_storage *sp; + Key k; + krb5_kvno key_kvno; uint32_t u32; uint16_t u16, num_keys, num_tl; - size_t i, j; + ssize_t sz; + size_t i; char *p; + memset(&k, 0, sizeof (k)); + memset(entry, 0, sizeof(*entry)); + sp = krb5_storage_from_data(data); if (sp == NULL) { krb5_set_error_message(context, ENOMEM, "out of memory"); @@ -228,24 +444,14 @@ * XXX But... surely we ought to log about this extra data, or skip * it, or something, in case anyone has MIT KDBs with ancient * entries in them... Logging would allow the admin to know which - * entries to dump with MIT krb5's kdb5_util. + * entries to dump with MIT krb5's kdb5_util. But logging would be + * noisy. For now we do nothing. */ CHECK(ret = krb5_ret_uint16(sp, &u16)); if (u16 != KDB_V1_BASE_LENGTH) { ret = EINVAL; goto out; } /* 32: attributes */ CHECK(ret = krb5_ret_uint32(sp, &u32)); - entry->flags.postdate = !(u32 & KRB5_KDB_DISALLOW_POSTDATED); - entry->flags.forwardable = !(u32 & KRB5_KDB_DISALLOW_FORWARDABLE); - entry->flags.initial = !!(u32 & KRB5_KDB_DISALLOW_TGT_BASED); - entry->flags.renewable = !(u32 & KRB5_KDB_DISALLOW_RENEWABLE); - entry->flags.proxiable = !(u32 & KRB5_KDB_DISALLOW_PROXIABLE); - /* DUP_SKEY */ - entry->flags.invalid = !!(u32 & KRB5_KDB_DISALLOW_ALL_TIX); - entry->flags.require_preauth =!!(u32 & KRB5_KDB_REQUIRES_PRE_AUTH); - entry->flags.require_hwauth =!!(u32 & KRB5_KDB_REQUIRES_HW_AUTH); - entry->flags.server = !(u32 & KRB5_KDB_DISALLOW_SVR); - entry->flags.change_pw = !!(u32 & KRB5_KDB_PWCHANGE_SERVICE); - entry->flags.client = 1; /* XXX */ + attr_to_flags(u32, &entry->flags); /* 32: max time */ CHECK(ret = krb5_ret_uint32(sp, &u32)); @@ -296,7 +502,11 @@ ret = ENOMEM; goto out; } - krb5_storage_read(sp, p, u16); + sz = krb5_storage_read(sp, p, u16); + if (sz != u16) { + ret = EINVAL; /* XXX */ + goto out; + } p[u16] = '\0'; CHECK(ret = krb5_parse_name(context, p, &entry->principal)); free(p); @@ -305,12 +515,53 @@ 16: tl data type 16: tl data length length: length */ +#define mit_KRB5_TL_LAST_PWD_CHANGE 1 +#define mit_KRB5_TL_MOD_PRINC 2 for (i = 0; i < num_tl; i++) { + int tl_type; + krb5_principal modby; /* 16: TL data type */ CHECK(ret = krb5_ret_uint16(sp, &u16)); + tl_type = u16; /* 16: TL data length */ CHECK(ret = krb5_ret_uint16(sp, &u16)); - krb5_storage_seek(sp, u16, SEEK_CUR); + /* + * For rollback to MIT purposes we really must understand some + * TL data! + * + * XXX Move all this to separate functions, one per-TL type. + */ + switch (tl_type) { + case mit_KRB5_TL_LAST_PWD_CHANGE: + CHECK(ret = krb5_ret_uint32(sp, &u32)); + CHECK(ret = hdb_entry_set_pw_change_time(context, entry, u32)); + break; + case mit_KRB5_TL_MOD_PRINC: + if (u16 < 5) { + ret = EINVAL; /* XXX */ + goto out; + } + CHECK(ret = krb5_ret_uint32(sp, &u32)); /* mod time */ + p = malloc(u16 - 4 + 1); + if (!p) { + ret = ENOMEM; + goto out; + } + p[u16 - 4] = '\0'; + sz = krb5_storage_read(sp, p, u16 - 4); + if (sz != u16 - 4) { + ret = EINVAL; /* XXX */ + goto out; + } + CHECK(ret = krb5_parse_name(context, p, &modby)); + ret = hdb_set_last_modified_by(context, entry, modby, u32); + krb5_free_principal(context, modby); + free(p); + break; + default: + krb5_storage_seek(sp, u16, SEEK_CUR); + break; + } } /* * for num key data times @@ -326,140 +577,92 @@ * That's right... hold that gag reflex, you can do it. */ for (i = 0; i < num_keys; i++) { - int keep = 0; uint16_t version; - void *ptr; CHECK(ret = krb5_ret_uint16(sp, &u16)); version = u16; CHECK(ret = krb5_ret_uint16(sp, &u16)); + key_kvno = u16; - /* - * First time through, and until we find one matching key, - * entry->kvno == 0. - */ - if ((entry->kvno < u16) && (kvno == 0 || kvno == u16)) { - keep = 1; - entry->kvno = u16; + ret = mdb_keyvalue2key(context, entry, sp, version, &k); + if (ret) + goto out; + if (k.key.keytype == 0 || k.key.keyvalue.length == 0) { /* - * Found a higher kvno than earlier, so free the old highest - * kvno keys. + * Older MIT KDBs may have enctype 0 / length 0 keys. We + * ignore these. + */ + free_Key(&k); + continue; + } + + if ((target_kvno == 0 && entry->kvno < key_kvno) || + (target_kvno == key_kvno && entry->kvno != target_kvno)) { + /* + * MIT's KDB doesn't keep track of kvno. The highest kvno + * is the current kvno, and we just found a new highest + * kvno or the desired kvno. * - * XXX Of course, we actually want to extract the old kvnos - * as well, for some of the kadm5 APIs. We shouldn't free - * these keys, but keep them elsewhere. + * Note that there's no guarantee of any key ordering, but + * generally MIT KDB entries have keys in strictly + * descending kvno order. + * + * XXX We do assume that keys are clustered by kvno. If + * not, then bad. It might be possible to construct + * non-clustered keys via the kadm5 API. It wouldn't be + * hard to cope with this, since if it happens the worst + * that will happen is that some of the current keys can be + * found in the history extension, and we could just pull + * them back out in that case. */ - for (j = 0; j < entry->keys.len; j++) - free_Key(&entry->keys.val[j]); - free(entry->keys.val); - entry->keys.len = 0; - entry->keys.val = NULL; - } else if (entry->kvno == u16) - /* Accumulate keys */ - keep = 1; - - if (keep) { - Key *k; - - ptr = realloc(entry->keys.val, sizeof(entry->keys.val[0]) * (entry->keys.len + 1)); - if (ptr == NULL) { - ret = ENOMEM; + ret = hdb_add_current_keys_to_history(context, entry); + if (ret) goto out; - } - entry->keys.val = ptr; - - /* k points to current Key */ - k = &entry->keys.val[entry->keys.len]; - - memset(k, 0, sizeof(*k)); - entry->keys.len += 1; - - k->mkvno = malloc(sizeof(*k->mkvno)); - if (k->mkvno == NULL) { - ret = ENOMEM; + free_Keys(&entry->keys); + ret = add_Keys(&entry->keys, &k); + free_Key(&k); + if (ret) goto out; - } - *k->mkvno = 1; - - for (j = 0; j < version; j++) { - uint16_t type; - CHECK(ret = krb5_ret_uint16(sp, &type)); - CHECK(ret = krb5_ret_uint16(sp, &u16)); - if (j == 0) { - /* This "version" means we have a key */ - k->key.keytype = type; - if (u16 < 2) { - ret = EINVAL; - goto out; - } - /* - * MIT stores keys encrypted keys as {16-bit length - * of plaintext key, {encrypted key}}. The reason - * for this is that the Kerberos cryptosystem is not - * length-preserving. Heimdal's approach is to - * truncate the plaintext to the expected length of - * the key given its enctype, so we ignore this - * 16-bit length-of-plaintext-key field. - */ - krb5_storage_seek(sp, 2, SEEK_CUR); /* skip real length */ - k->key.keyvalue.length = u16 - 2; /* adjust cipher len */ - k->key.keyvalue.data = malloc(k->key.keyvalue.length); - krb5_storage_read(sp, k->key.keyvalue.data, - k->key.keyvalue.length); - } else if (j == 1) { - /* This "version" means we have a salt */ - k->salt = calloc(1, sizeof(*k->salt)); - if (k->salt == NULL) { - ret = ENOMEM; - goto out; - } - k->salt->type = type; - if (u16 != 0) { - k->salt->salt.data = malloc(u16); - if (k->salt->salt.data == NULL) { - ret = ENOMEM; - goto out; - } - k->salt->salt.length = u16; - krb5_storage_read(sp, k->salt->salt.data, k->salt->salt.length); - } - fix_salt(context, entry, entry->keys.len - 1); - } else { - /* - * Whatever this "version" might be, we skip it - * - * XXX A krb5.conf parameter requesting that we log - * about strangeness like this, or return an error - * from here, might be nice. - */ - krb5_storage_seek(sp, u16, SEEK_CUR); - } - } - } else { + entry->kvno = key_kvno; + continue; + } + + if (entry->kvno == key_kvno) { /* - * XXX For now we skip older kvnos, but we should extract - * them... + * Note that if key_kvno == 0 and target_kvno == 0 then we + * end up adding those keys here. Yeah, kvno 0 is very + * special for us, but just in case, we keep such keys. */ - for (j = 0; j < version; j++) { - /* enctype */ - CHECK(ret = krb5_ret_uint16(sp, &u16)); - /* encrypted key (or plaintext salt) */ - CHECK(ret = krb5_ret_uint16(sp, &u16)); - krb5_storage_seek(sp, u16, SEEK_CUR); - } + ret = add_Keys(&entry->keys, &k); + free_Key(&k); + if (ret) + goto out; + entry->kvno = key_kvno; + } else { + ret = hdb_add_history_key(context, entry, key_kvno, &k); + if (ret) + goto out; + free_Key(&k); } } - if (entry->kvno == 0 && kvno != 0) { - ret = HDB_ERR_NOT_FOUND_HERE; + if (target_kvno != 0 && entry->kvno != target_kvno) { + ret = HDB_ERR_KVNO_NOT_FOUND; goto out; } - return 0; - out: + krb5_storage_free(sp); + + return dup_similar_keys(context, entry); + +out: + krb5_storage_free(sp); + if (ret == HEIM_ERR_EOF) /* Better error code than "end of file" */ ret = HEIM_ERR_BAD_HDBENT_ENCODING; + free_hdb_entry(entry); + free_Key(&k); return ret; } @@ -471,6 +674,14 @@ } #endif +#if HAVE_DB1 + +#if defined(HAVE_DB_185_H) +#include +#elif defined(HAVE_DB_H) +#include +#endif + static krb5_error_code mdb_close(krb5_context context, HDB *db) @@ -491,17 +702,41 @@ return ret; } +static krb5_error_code +mdb_set_sync(krb5_context context, HDB *db, int on) +{ + MITDB *mdb = (MITDB *)db; + DB *d = (DB*)db->hdb_db; + + mdb->do_sync = on; + if (on) + return fsync((*d->fd)(d)); + return 0; +} + static krb5_error_code mdb_lock(krb5_context context, HDB *db, int operation) { DB *d = (DB*)db->hdb_db; int fd = (*d->fd)(d); + krb5_error_code ret; + + if (db->lock_count > 1) { + db->lock_count++; + if (db->lock_type == HDB_WLOCK || db->lock_count == operation) + return 0; + } + if(fd < 0) { krb5_set_error_message(context, HDB_ERR_CANT_LOCK_DB, "Can't lock database: %s", db->hdb_name); return HDB_ERR_CANT_LOCK_DB; } - return hdb_lock(fd, operation); + ret = hdb_lock(fd, operation); + if (ret) + return ret; + db->lock_count++; + return 0; } static krb5_error_code @@ -509,6 +744,14 @@ { DB *d = (DB*)db->hdb_db; int fd = (*d->fd)(d); + + if (db->lock_count > 1) { + db->lock_count--; + return 0; + } + heim_assert(db->lock_count == 1, "HDB lock/unlock sequence does not match"); + db->lock_count--; + if(fd < 0) { krb5_set_error_message(context, HDB_ERR_CANT_LOCK_DB, "Can't unlock database: %s", db->hdb_name); @@ -551,7 +794,7 @@ data.length = value.size; memset(entry, 0, sizeof(*entry)); - if (mdb_value2entry(context, &data, 0, &entry->entry)) + if (_hdb_mdb_value2entry(context, &data, 0, &entry->entry)) return mdb_seq(context, db, flags, entry, R_NEXT); if (db->hdb_master_key_set && (flags & HDB_F_DECRYPT)) { @@ -581,19 +824,25 @@ mdb_rename(krb5_context context, HDB *db, const char *new_name) { int ret; - char *old, *new; + char *old = NULL; + char *new = NULL; - asprintf(&old, "%s.db", db->hdb_name); - asprintf(&new, "%s.db", new_name); + if (asprintf(&old, "%s.db", db->hdb_name) < 0) + goto out; + if (asprintf(&new, "%s.db", new_name) < 0) + goto out; ret = rename(old, new); - free(old); - free(new); if(ret) - return errno; + goto out; free(db->hdb_name); db->hdb_name = strdup(new_name); - return 0; + errno = 0; + +out: + free(old); + free(new); + return errno; } static krb5_error_code @@ -629,6 +878,7 @@ mdb__put(krb5_context context, HDB *db, int replace, krb5_data key, krb5_data value) { + MITDB *mdb = (MITDB *)db; DB *d = (DB*)db->hdb_db; DBT k, v; int code; @@ -641,6 +891,11 @@ if(code) return code; code = (*d->put)(d, &k, &v, replace ? 0 : R_NOOVERWRITE); + if (code == 0) { + code = mdb_set_sync(context, db, mdb->do_sync); + db->hdb_unlock(context, db); + return code; + } db->hdb_unlock(context, db); if(code < 0) { code = errno; @@ -648,16 +903,14 @@ db->hdb_name, strerror(code)); return code; } - if(code == 1) { - krb5_clear_error_message(context); - return HDB_ERR_EXISTS; - } - return 0; + krb5_clear_error_message(context); + return HDB_ERR_EXISTS; } static krb5_error_code mdb__del(krb5_context context, HDB *db, krb5_data key) { + MITDB *mdb = (MITDB *)db; DB *d = (DB*)db->hdb_db; DBT k; krb5_error_code code; @@ -667,6 +920,11 @@ if(code) return code; code = (*d->del)(d, &k, 0); + if (code == 0) { + code = mdb_set_sync(context, db, mdb->do_sync); + db->hdb_unlock(context, db); + return code; + } db->hdb_unlock(context, db); if(code == 1) { code = errno; @@ -684,24 +942,26 @@ unsigned flags, krb5_kvno kvno, hdb_entry_ex *entry) { krb5_data key, value; - krb5_error_code code; + krb5_error_code ret; - code = mdb_principal2key(context, principal, &key); - if (code) - return code; - code = db->hdb__get(context, db, key, &value); + ret = mdb_principal2key(context, principal, &key); + if (ret) + return ret; + ret = db->hdb__get(context, db, key, &value); krb5_data_free(&key); - if(code) - return code; - code = mdb_value2entry(context, &value, kvno, &entry->entry); + if(ret) + return ret; + ret = _hdb_mdb_value2entry(context, &value, kvno, &entry->entry); krb5_data_free(&value); - if (code) - return code; + if (ret) + return ret; if (db->hdb_master_key_set && (flags & HDB_F_DECRYPT)) { - code = hdb_unseal_keys (context, db, &entry->entry); - if (code) + ret = hdb_unseal_keys (context, db, &entry->entry); + if (ret) { hdb_free_entry(context, entry); + return ret; + } } return 0; @@ -710,15 +970,86 @@ static krb5_error_code mdb_store(krb5_context context, HDB *db, unsigned flags, hdb_entry_ex *entry) { - krb5_set_error_message(context, EINVAL, "can't set principal in mdb"); - return EINVAL; + krb5_error_code ret; + krb5_storage *sp = NULL; + krb5_storage *spent = NULL; + krb5_data line = { 0, 0 }; + krb5_data kdb_ent = { 0, 0 }; + krb5_data key = { 0, 0 }; + krb5_data value = { 0, 0 }; + ssize_t sz; + + if ((flags & HDB_F_PRECHECK) && (flags & HDB_F_REPLACE)) + return 0; + + if ((flags & HDB_F_PRECHECK)) { + ret = mdb_principal2key(context, entry->entry.principal, &key); + if (ret) return ret; + ret = db->hdb__get(context, db, key, &value); + krb5_data_free(&key); + if (ret == 0) + krb5_data_free(&value); + if (ret == HDB_ERR_NOENTRY) + return 0; + return ret ? ret : HDB_ERR_EXISTS; + } + + sp = krb5_storage_emem(); + if (!sp) return ENOMEM; + ret = _hdb_set_master_key_usage(context, db, 0); /* MIT KDB uses KU 0 */ + ret = hdb_seal_keys(context, db, &entry->entry); + if (ret) return ret; + ret = entry2mit_string_int(context, sp, &entry->entry); + if (ret) goto out; + sz = krb5_storage_write(sp, "\n", 2); /* NUL-terminate */ + ret = ENOMEM; + if (sz == -1) goto out; + ret = krb5_storage_to_data(sp, &line); + if (ret) goto out; + + ret = ENOMEM; + spent = krb5_storage_emem(); + if (!spent) goto out; + ret = _hdb_mit_dump2mitdb_entry(context, line.data, spent); + if (ret) goto out; + ret = krb5_storage_to_data(spent, &kdb_ent); + if (ret) goto out; + ret = mdb_principal2key(context, entry->entry.principal, &key); + if (ret) goto out; + ret = mdb__put(context, db, 1, key, kdb_ent); + +out: + if (sp) + krb5_storage_free(sp); + if (spent) + krb5_storage_free(spent); + krb5_data_free(&line); + krb5_data_free(&kdb_ent); + krb5_data_free(&key); + + return ret; } static krb5_error_code -mdb_remove(krb5_context context, HDB *db, krb5_const_principal principal) +mdb_remove(krb5_context context, HDB *db, + unsigned flags, krb5_const_principal principal) { krb5_error_code code; krb5_data key; + krb5_data value = { 0, 0 }; + + code = mdb_principal2key(context, principal, &key); + if (code) + return code; + if ((flags & HDB_F_PRECHECK)) { + code = db->hdb__get(context, db, key, &value); + krb5_data_free(&key); + if (code == 0) { + krb5_data_free(&value); + return 0; + } + return code; + } code = db->hdb__del(context, db, key); krb5_data_free(&key); @@ -729,40 +1060,47 @@ mdb_open(krb5_context context, HDB *db, int flags, mode_t mode) { char *fn; + char *actual_fn; krb5_error_code ret; + struct stat st; - asprintf(&fn, "%s.db", db->hdb_name); - if (fn == NULL) { + if (asprintf(&fn, "%s.db", db->hdb_name) < 0) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } - db->hdb_db = dbopen(fn, flags, mode, DB_BTREE, NULL); - free(fn); + if (stat(fn, &st) == 0) + actual_fn = fn; + else + actual_fn = db->hdb_name; + db->hdb_db = dbopen(actual_fn, flags, mode, DB_BTREE, NULL); if (db->hdb_db == NULL) { switch (errno) { #ifdef EFTYPE case EFTYPE: #endif case EINVAL: - db->hdb_db = dbopen(fn, flags, mode, DB_BTREE, NULL); + db->hdb_db = dbopen(actual_fn, flags, mode, DB_HASH, NULL); } } + free(fn); - /* try to open without .db extension */ - if(db->hdb_db == NULL && errno == ENOENT) - db->hdb_db = dbopen(db->hdb_name, flags, mode, DB_BTREE, NULL); - if(db->hdb_db == NULL) { + if (db->hdb_db == NULL) { ret = errno; krb5_set_error_message(context, ret, "dbopen (%s): %s", db->hdb_name, strerror(ret)); return ret; } - if((flags & O_ACCMODE) == O_RDONLY) - ret = hdb_check_db_format(context, db); - else +#if 0 + /* + * Don't do this -- MIT won't be able to handle the + * HDB_DB_FORMAT_ENTRY key. + */ + if ((flags & O_ACCMODE) != O_RDONLY) ret = hdb_init_db(context, db); - if(ret == HDB_ERR_NOENTRY) { +#endif + ret = hdb_check_db_format(context, db); + if (ret == HDB_ERR_NOENTRY) { krb5_clear_error_message(context); return 0; } @@ -777,11 +1115,12 @@ } krb5_error_code -hdb_mdb_create(krb5_context context, HDB **db, - const char *filename) +hdb_mitdb_create(krb5_context context, HDB **db, + const char *filename) { - *db = calloc(1, sizeof(**db)); - if (*db == NULL) { + MITDB **mdb = (MITDB **)db; + *mdb = calloc(1, sizeof(**mdb)); + if (*mdb == NULL) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } @@ -794,6 +1133,7 @@ krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } + (*mdb)->do_sync = 1; (*db)->hdb_master_key_set = 0; (*db)->hdb_openp = 0; (*db)->hdb_capability_flags = 0; @@ -811,7 +1151,352 @@ (*db)->hdb__put = mdb__put; (*db)->hdb__del = mdb__del; (*db)->hdb_destroy = mdb_destroy; + (*db)->hdb_set_sync = mdb_set_sync; return 0; } #endif /* HAVE_DB1 */ + +/* +can have any number of princ stanzas. +format is as follows (only \n indicates newlines) +princ\t%d\t (%d is KRB5_KDB_V1_BASE_LENGTH, always 38) +%d\t (strlen of principal e.g. shadow/foo@ANDREW.CMU.EDU) +%d\t (number of tl_data) +%d\t (number of key data, e.g. how many keys for this user) +%d\t (extra data length) +%s\t (principal name) +%d\t (attributes) +%d\t (max lifetime, seconds) +%d\t (max renewable life, seconds) +%d\t (expiration, seconds since epoch or 2145830400 for never) +%d\t (password expiration, seconds, 0 for never) +%d\t (last successful auth, seconds since epoch) +%d\t (last failed auth, per above) +%d\t (failed auth count) +foreach tl_data 0 to number of tl_data - 1 as above + %d\t%d\t (data type, data length) + foreach tl_data 0 to length-1 + %02x (tl data contents[element n]) + except if tl_data length is 0 + %d (always -1) + \t +foreach key 0 to number of keys - 1 as above + %d\t%d\t (key data version, kvno) + foreach version 0 to key data version - 1 (a key or a salt) + %d\t%d\t(data type for this key, data length for this key) + foreach key data length 0 to length-1 + %02x (key data contents[element n]) + except if key_data length is 0 + %d (always -1) + \t +foreach extra data length 0 to length - 1 + %02x (extra data part) +unless no extra data + %d (always -1) +;\n + +*/ + +#if 0 +/* Why ever did we loop? */ +static char * +nexttoken(char **p) +{ + char *q; + do { + q = strsep(p, " \t"); + } while(q && *q == '\0'); + return q; +} +#endif + +static char * +nexttoken(char **p, size_t len, const char *what) +{ + char *q; + + if (*p == NULL) + return NULL; + + q = *p; + *p += len; + /* Must be followed by a delimiter (right?) */ + if (strsep(p, " \t") != q + len) { + warnx("No tokens left in dump entry while looking for %s", what); + return NULL; + } + if (*q == '\0') + warnx("Empty last token in dump entry while looking for %s", what); + return q; +} + +static size_t +getdata(char **p, unsigned char *buf, size_t len, const char *what) +{ + size_t i; + int v; + char *q = nexttoken(p, 0, what); + if (q == NULL) { + warnx("Failed to find hex-encoded binary data (%s) in dump", what); + return 0; + } + i = 0; + while (*q && i < len) { + if (sscanf(q, "%02x", &v) != 1) + break; + buf[i++] = v; + q += 2; + } + return i; +} + +static int +getint(char **p, const char *what) +{ + int val; + char *q = nexttoken(p, 0, what); + if (!q) { + warnx("Failed to find a signed integer (%s) in dump", what); + return -1; + } + if (sscanf(q, "%d", &val) != 1) + return -1; + return val; +} + +static unsigned int +getuint(char **p, const char *what) +{ + int val; + char *q = nexttoken(p, 0, what); + if (!q) { + warnx("Failed to find an unsigned integer (%s) in dump", what); + return 0; + } + if (sscanf(q, "%u", &val) != 1) + return 0; + return val; +} + +#define KRB5_KDB_SALTTYPE_NORMAL 0 +#define KRB5_KDB_SALTTYPE_V4 1 +#define KRB5_KDB_SALTTYPE_NOREALM 2 +#define KRB5_KDB_SALTTYPE_ONLYREALM 3 +#define KRB5_KDB_SALTTYPE_SPECIAL 4 +#define KRB5_KDB_SALTTYPE_AFS3 5 + +#define CHECK_UINT(num) \ + if ((num) < 0 || (num) > INT_MAX) return EINVAL +#define CHECK_UINT16(num) \ + if ((num) < 0 || (num) > 1<<15) return EINVAL +#define CHECK_NUM(num, maxv) \ + if ((num) > (maxv)) return EINVAL + +/* + * This utility function converts an MIT dump entry to an MIT on-disk + * encoded entry, which can then be decoded with _hdb_mdb_value2entry(). + * This allows us to have a single decoding function (_hdb_mdb_value2entry), + * which makes the code cleaner (less code duplication), if a bit less + * efficient. It also will allow us to have a function to dump an HDB + * entry in MIT format so we can dump HDB into MIT format for rollback + * purposes. And that will allow us to write to MIT KDBs, again + * somewhat inefficiently, also for migration/rollback purposes. + */ +int +_hdb_mit_dump2mitdb_entry(krb5_context context, char *line, krb5_storage *sp) +{ + krb5_error_code ret = EINVAL; + char *p = line, *q; + char *princ; + ssize_t sz; + size_t i; + size_t princ_len; + unsigned int num_tl_data; + size_t num_key_data; + unsigned int attributes; + int tmp; + + krb5_storage_set_byteorder(sp, KRB5_STORAGE_BYTEORDER_LE); + + q = nexttoken(&p, 0, "record type (princ or policy)"); + if (strcmp(q, "kdb5_util") == 0 || strcmp(q, "policy") == 0 || + strcmp(q, "princ") != 0) { + warnx("Supposed MIT dump entry does not start with 'kdb5_util', " + "'policy', nor 'princ'"); + return -1; + } + if (getint(&p, "constant '38'") != 38) { + warnx("Dump entry does not start with '38'"); + return EINVAL; + } +#define KDB_V1_BASE_LENGTH 38 + ret = krb5_store_int16(sp, KDB_V1_BASE_LENGTH); + if (ret) return ret; + + princ_len = getuint(&p, "principal name length"); + if (princ_len > (1<<15) - 1) { + warnx("Principal name in dump entry too long (%llu)", + (unsigned long long)princ_len); + return EINVAL; + } + num_tl_data = getuint(&p, "number of TL data"); + num_key_data = getuint(&p, "number of key data"); + getint(&p, "5th field, length of 'extra data'"); + princ = nexttoken(&p, (int)princ_len, "principal name"); + if (princ == NULL) { + warnx("Failed to read principal name (expected length %llu)", + (unsigned long long)princ_len); + return -1; + } + + attributes = getuint(&p, "attributes"); + ret = krb5_store_uint32(sp, attributes); + if (ret) return ret; + + tmp = getint(&p, "max life"); + CHECK_UINT(tmp); + ret = krb5_store_uint32(sp, tmp); + if (ret) return ret; + + tmp = getint(&p, "max renewable life"); + CHECK_UINT(tmp); + ret = krb5_store_uint32(sp, tmp); + if (ret) return ret; + + tmp = getint(&p, "expiration"); + CHECK_UINT(tmp); + ret = krb5_store_uint32(sp, tmp); + if (ret) return ret; + + tmp = getint(&p, "pw expiration"); + CHECK_UINT(tmp); + ret = krb5_store_uint32(sp, tmp); + if (ret) return ret; + + tmp = getint(&p, "last auth"); + CHECK_UINT(tmp); + ret = krb5_store_uint32(sp, tmp); + if (ret) return ret; + + tmp = getint(&p, "last failed auth"); + CHECK_UINT(tmp); + ret = krb5_store_uint32(sp, tmp); + if (ret) return ret; + + tmp = getint(&p,"fail auth count"); + CHECK_UINT(tmp); + ret = krb5_store_uint32(sp, tmp); + if (ret) return ret; + + /* add TL data count */ + CHECK_NUM(num_tl_data, 1023); + ret = krb5_store_uint16(sp, num_tl_data); + if (ret) return ret; + + /* add key count */ + CHECK_NUM(num_key_data, 1023); + ret = krb5_store_uint16(sp, num_key_data); + if (ret) return ret; + + /* add principal unparsed name length and unparsed name */ + princ_len = strlen(princ); + princ_len++; /* must count and write the NUL in the on-disk encoding */ + ret = krb5_store_uint16(sp, princ_len); + if (ret) return ret; + sz = krb5_storage_write(sp, princ, princ_len); + if (sz == -1) return ENOMEM; + + /* scan and write TL data */ + for (i = 0; i < num_tl_data; i++) { + char *reading_what; + int tl_type, tl_length; + unsigned char *buf; + + tl_type = getint(&p, "TL data type"); + tl_length = getint(&p, "data length"); + + if (asprintf(&reading_what, "TL data type %d (length %d)", + tl_type, tl_length) < 0) + return ENOMEM; + + /* + * XXX Leaking reading_what, but only on ENOMEM cases anyways, + * so we don't care. + */ + CHECK_UINT16(tl_type); + ret = krb5_store_uint16(sp, tl_type); + if (ret) return ret; + CHECK_UINT16(tl_length); + ret = krb5_store_uint16(sp, tl_length); + if (ret) return ret; + + if (tl_length) { + buf = malloc(tl_length); + if (!buf) return ENOMEM; + if (getdata(&p, buf, tl_length, reading_what) != tl_length) + return EINVAL; + sz = krb5_storage_write(sp, buf, tl_length); + free(buf); + if (sz == -1) return ENOMEM; + } else { + if (strcmp(nexttoken(&p, 0, "'-1' field"), "-1") != 0) return EINVAL; + } + free(reading_what); + } + + for (i = 0; i < num_key_data; i++) { + unsigned char *buf; + int key_versions; + int kvno; + int keytype; + int keylen; + size_t k; + + key_versions = getint(&p, "key data 'version'"); + CHECK_UINT16(key_versions); + ret = krb5_store_int16(sp, key_versions); + if (ret) return ret; + + kvno = getint(&p, "kvno"); + CHECK_UINT16(kvno); + ret = krb5_store_int16(sp, kvno); + if (ret) return ret; + + for (k = 0; k < key_versions; k++) { + keytype = getint(&p, "enctype"); + CHECK_UINT16(keytype); + ret = krb5_store_int16(sp, keytype); + if (ret) return ret; + + keylen = getint(&p, "encrypted key length"); + CHECK_UINT16(keylen); + ret = krb5_store_int16(sp, keylen); + if (ret) return ret; + + if (keylen) { + buf = malloc(keylen); + if (!buf) return ENOMEM; + if (getdata(&p, buf, keylen, "key (or salt) data") != keylen) + return EINVAL; + sz = krb5_storage_write(sp, buf, keylen); + free(buf); + if (sz == -1) return ENOMEM; + } else { + if (strcmp(nexttoken(&p, 0, + "'-1' zero-length key/salt field"), + "-1") != 0) { + warnx("Expected '-1' field because key/salt length is 0"); + return -1; + } + } + } + } + /* + * The rest is "extra data", but there's never any and we wouldn't + * know what to do with it. + */ + /* nexttoken(&p, 0, "extra data"); */ + return 0; +} + diff --git a/crypto/heimdal/lib/hdb/hdb-private.h b/crypto/heimdal/lib/hdb/hdb-private.h --- a/crypto/heimdal/lib/hdb/hdb-private.h +++ b/crypto/heimdal/lib/hdb/hdb-private.h @@ -15,7 +15,7 @@ hdb_master_key _hdb_find_master_key ( - uint32_t */*mkvno*/, + unsigned int */*mkvno*/, hdb_master_key /*mkey*/); krb5_error_code @@ -24,6 +24,19 @@ const krb5_keytab_entry */*ktentry*/, hdb_entry_ex */*entry*/); +krb5_error_code +_hdb_mdb_value2entry ( + krb5_context /*context*/, + krb5_data */*data*/, + krb5_kvno /*target_kvno*/, + hdb_entry */*entry*/); + +int +_hdb_mit_dump2mitdb_entry ( + krb5_context /*context*/, + char */*line*/, + krb5_storage */*sp*/); + int _hdb_mkey_decrypt ( krb5_context /*context*/, @@ -49,8 +62,15 @@ _hdb_remove ( krb5_context /*context*/, HDB */*db*/, + unsigned /*flags*/, krb5_const_principal /*principal*/); +krb5_error_code +_hdb_set_master_key_usage ( + krb5_context /*context*/, + HDB */*db*/, + unsigned int /*key_usage*/); + krb5_error_code _hdb_store ( krb5_context /*context*/, diff --git a/crypto/heimdal/lib/hdb/hdb-protos.h b/crypto/heimdal/lib/hdb/hdb-protos.h --- a/crypto/heimdal/lib/hdb/hdb-protos.h +++ b/crypto/heimdal/lib/hdb/hdb-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __hdb_protos_h__ #define __hdb_protos_h__ +#ifndef DOXY #include @@ -8,12 +9,64 @@ extern "C" { #endif +krb5_error_code +entry2mit_string_int ( + krb5_context /*context*/, + krb5_storage */*sp*/, + hdb_entry */*ent*/); + +/** + * This function adds an HDB entry's current keyset to the entry's key + * history. The current keyset is left alone; the caller is responsible + * for freeing it. + * + * @param context Context + * @param entry HDB entry + */ + +krb5_error_code +hdb_add_current_keys_to_history ( + krb5_context /*context*/, + hdb_entry */*entry*/); + +/** + * This function adds a key to an HDB entry's key history. + * + * @param context Context + * @param entry HDB entry + * @param kvno Key version number of the key to add to the history + * @param key The Key to add + */ + +krb5_error_code +hdb_add_history_key ( + krb5_context /*context*/, + hdb_entry */*entry*/, + krb5_kvno /*kvno*/, + Key */*key*/); + krb5_error_code hdb_add_master_key ( krb5_context /*context*/, krb5_keyblock */*key*/, hdb_master_key */*inout*/); +/** + * This function changes an hdb_entry's kvno, swapping the current key + * set with a historical keyset. If no historical keys are found then + * an error is returned (the caller can still set entry->kvno directly). + * + * @param context krb5_context + * @param new_kvno New kvno for the entry + * @param entry hdb_entry to modify + */ + +krb5_error_code +hdb_change_kvno ( + krb5_context /*context*/, + krb5_kvno /*new_kvno*/, + hdb_entry */*entry*/); + krb5_error_code hdb_check_db_format ( krb5_context /*context*/, @@ -30,6 +83,14 @@ krb5_context /*context*/, HDB */*db*/); +/** + * Create a handle for a Kerberos database + * + * Create a handle for a Kerberos database backend specified by a + * filename. Doesn't create a file if its doesn't exists, you have to + * use O_CREAT to tell the backend to create the file. + */ + krb5_error_code hdb_create ( krb5_context /*context*/, @@ -37,11 +98,25 @@ const char */*filename*/); krb5_error_code -hdb_db_create ( +hdb_db1_create ( krb5_context /*context*/, HDB **/*db*/, const char */*filename*/); +krb5_error_code +hdb_db3_create ( + krb5_context /*context*/, + HDB **/*db*/, + const char */*filename*/); + +/** + * Return the directory where the hdb database resides. + * + * @param context Kerberos 5 context. + * + * @return string pointing to directory. + */ + const char * hdb_db_dir (krb5_context /*context*/); @@ -85,6 +160,14 @@ krb5_context /*context*/, struct hdb_dbinfo */*dbp*/); +/** + * Return the default hdb database resides. + * + * @param context Kerberos 5 context. + * + * @return string pointing to directory. + */ + const char * hdb_default_db (krb5_context /*context*/); @@ -92,6 +175,7 @@ hdb_enctype2key ( krb5_context /*context*/, hdb_entry */*e*/, + const Keys */*keyset*/, krb5_enctype /*enctype*/, Key **/*key*/); @@ -118,6 +202,16 @@ krb5_context /*context*/, const hdb_entry */*ent*/); +krb5_error_code +hdb_entry_clear_kvno_diff_clnt ( + krb5_context /*context*/, + hdb_entry */*entry*/); + +krb5_error_code +hdb_entry_clear_kvno_diff_svc ( + krb5_context /*context*/, + hdb_entry */*entry*/); + int hdb_entry_clear_password ( krb5_context /*context*/, @@ -133,6 +227,12 @@ const hdb_entry */*entry*/, const HDB_Ext_Aliases **/*a*/); +unsigned int +hdb_entry_get_kvno_diff_clnt (const hdb_entry */*entry*/); + +unsigned int +hdb_entry_get_kvno_diff_svc (const hdb_entry */*entry*/); + int hdb_entry_get_password ( krb5_context /*context*/, @@ -160,6 +260,18 @@ const hdb_entry */*entry*/, time_t */*t*/); +krb5_error_code +hdb_entry_set_kvno_diff_clnt ( + krb5_context /*context*/, + hdb_entry */*entry*/, + unsigned int /*diff*/); + +krb5_error_code +hdb_entry_set_kvno_diff_svc ( + krb5_context /*context*/, + hdb_entry */*entry*/, + unsigned int /*diff*/); + int hdb_entry_set_password ( krb5_context /*context*/, @@ -214,6 +326,8 @@ hdb_generate_key_set ( krb5_context /*context*/, krb5_principal /*principal*/, + krb5_key_salt_tuple */*ks_tuple*/, + int /*n_ks_tuple*/, Key **/*ret_key_set*/, size_t */*nkeyset*/, int /*no_salt*/); @@ -226,6 +340,16 @@ Key **/*keys*/, size_t */*num_keys*/); +krb5_error_code +hdb_generate_key_set_password_with_ks_tuple ( + krb5_context /*context*/, + krb5_principal /*principal*/, + const char */*password*/, + krb5_key_salt_tuple */*ks_tuple*/, + int /*n_ks_tuple*/, + Key **/*keys*/, + size_t */*num_keys*/); + int hdb_get_dbinfo ( krb5_context /*context*/, @@ -248,6 +372,12 @@ HDB ** /*db*/, const char */*arg*/); +const Keys * +hdb_kvno2keys ( + krb5_context /*context*/, + const hdb_entry */*e*/, + krb5_kvno /*kvno*/); + krb5_error_code hdb_ldap_create ( krb5_context /*context*/, @@ -276,6 +406,12 @@ HDB **/*db*/, const char */*filename*/); +krb5_error_code +hdb_mitdb_create ( + krb5_context /*context*/, + HDB **/*db*/, + const char */*filename*/); + krb5_error_code hdb_ndbm_create ( krb5_context /*context*/, @@ -286,6 +422,7 @@ hdb_next_enctype2key ( krb5_context /*context*/, const hdb_entry */*e*/, + const Keys */*keyset*/, krb5_enctype /*enctype*/, Key **/*key*/); @@ -310,6 +447,19 @@ krb5_enctype /*etype*/, hdb_master_key */*mkey*/); +/** + * This function prunes an HDB entry's keys that are too old to have been used + * to mint still valid tickets (based on the entry's maximum ticket lifetime). + * + * @param context Context + * @param entry HDB entry + */ + +krb5_error_code +hdb_prune_keys ( + krb5_context /*context*/, + hdb_entry */*entry*/); + krb5_error_code hdb_read_master_key ( krb5_context /*context*/, @@ -346,6 +496,13 @@ hdb_entry */*ent*/, hdb_master_key /*mkey*/); +krb5_error_code +hdb_set_last_modified_by ( + krb5_context /*context*/, + hdb_entry */*entry*/, + krb5_principal /*modby*/, + time_t /*modtime*/); + krb5_error_code hdb_set_master_key ( krb5_context /*context*/, @@ -358,11 +515,21 @@ HDB */*db*/, const char */*keyfile*/); +/** + * Create SQLITE object, and creates the on disk database if its doesn't exists. + * + * @param context A Kerberos 5 context. + * @param db a returned database handle. + * @param filename filename + * + * @return 0 on success, an error code if not + */ + krb5_error_code hdb_sqlite_create ( krb5_context /*context*/, HDB **/*db*/, - const char */*argument*/); + const char */*filename*/); krb5_error_code hdb_unlock (int /*fd*/); @@ -385,6 +552,14 @@ HDB */*db*/, hdb_entry */*ent*/); +krb5_error_code +hdb_unseal_keys_kvno ( + krb5_context /*context*/, + HDB */*db*/, + krb5_kvno /*kvno*/, + unsigned /*flags*/, + hdb_entry */*ent*/); + krb5_error_code hdb_unseal_keys_mkey ( krb5_context /*context*/, @@ -413,4 +588,5 @@ } #endif +#endif /* DOXY */ #endif /* __hdb_protos_h__ */ diff --git a/crypto/heimdal/lib/hdb/hdb-sqlite.c b/crypto/heimdal/lib/hdb/hdb-sqlite.c index e063588874ae31b6e434ba451b9358e0dcf73757..d5eb3f184e84db057125adb06f357e16ed931985 GIT binary patch literal 31246 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 diff --git a/crypto/heimdal/lib/hdb/hdb.h b/crypto/heimdal/lib/hdb/hdb.h --- a/crypto/heimdal/lib/hdb/hdb.h +++ b/crypto/heimdal/lib/hdb/hdb.h @@ -36,6 +36,8 @@ #ifndef __HDB_H__ #define __HDB_H__ +#include + #include #include @@ -58,15 +60,18 @@ #define HDB_F_ADMIN_DATA 64 /* want data that kdc don't use */ #define HDB_F_KVNO_SPECIFIED 128 /* we want a particular KVNO */ #define HDB_F_CURRENT_KVNO 256 /* we want the current KVNO */ -/* 512, 1024, 2048 are reserved for kvno operations that is not part of the 1.5 branch */ +#define HDB_F_LIVE_CLNT_KVNOS 512 /* we want all live keys for pre-auth */ +#define HDB_F_LIVE_SVC_KVNOS 1024 /* we want all live keys for tix */ #define HDB_F_ALL_KVNOS 2048 /* we want all the keys, live or not */ #define HDB_F_FOR_AS_REQ 4096 /* fetch is for a AS REQ */ #define HDB_F_FOR_TGS_REQ 8192 /* fetch is for a TGS REQ */ +#define HDB_F_PRECHECK 16384 /* check that the operation would succeed */ /* hdb_capability_flags */ #define HDB_CAP_F_HANDLE_ENTERPRISE_PRINCIPAL 1 #define HDB_CAP_F_HANDLE_PASSWORDS 2 #define HDB_CAP_F_PASSWORD_UPDATE_KEYS 4 +#define HDB_CAP_F_SHARED_DIRECTORY 8 /* auth status values */ #define HDB_AUTH_SUCCESS 0 @@ -99,7 +104,7 @@ * query the backend database when talking about principals. */ -typedef struct HDB{ +typedef struct HDB { void *hdb_db; void *hdb_dbc; /** don't use, only for DB3 */ char *hdb_name; @@ -107,6 +112,8 @@ hdb_master_key hdb_master_key; int hdb_openp; int hdb_capability_flags; + int lock_count; + int lock_type; /** * Open (or create) the a Kerberos database. * @@ -149,7 +156,7 @@ * Remove an entry from the database. */ krb5_error_code (*hdb_remove)(krb5_context, struct HDB*, - krb5_const_principal); + unsigned, krb5_const_principal); /** * As part of iteration, fetch one entry */ @@ -181,25 +188,33 @@ /** * Get an hdb_entry from a classical DB backend * - * If the database is a classical DB (ie BDB, NDBM, GDBM, etc) - * backend, this function will take a principal key (krb5_data) - * and return all data related to principal in the return - * krb5_data. The returned encoded entry is of type hdb_entry or - * hdb_entry_alias. + * This function takes a principal key (krb5_data) and returns all + * data related to principal in the return krb5_data. The returned + * encoded entry is of type hdb_entry or hdb_entry_alias. */ krb5_error_code (*hdb__get)(krb5_context, struct HDB*, krb5_data, krb5_data*); /** * Store an hdb_entry from a classical DB backend * - * Same discussion as in @ref HDB::hdb__get + * This function takes a principal key (krb5_data) and encoded + * hdb_entry or hdb_entry_alias as the data to store. + * + * For a file-based DB, this must synchronize to disk when done. + * This is sub-optimal for kadm5_s_rename_principal(), and for + * kadm5_s_modify_principal() when using principal aliases; to + * improve this so that only one fsync() need be done + * per-transaction will require HDB API extensions. */ krb5_error_code (*hdb__put)(krb5_context, struct HDB*, int, krb5_data, krb5_data); /** * Delete and hdb_entry from a classical DB backend * - * Same discussion as in @ref HDB::hdb__get + * This function takes a principal key (krb5_data) naming the record + * to delete. + * + * Same discussion as in @ref HDB::hdb__put */ krb5_error_code (*hdb__del)(krb5_context, struct HDB*, krb5_data); /** @@ -256,25 +271,41 @@ * Check if s4u2self is allowed from this client to this server */ krb5_error_code (*hdb_check_s4u2self)(krb5_context, struct HDB *, hdb_entry_ex *, krb5_const_principal); + + /** + * Enable/disable synchronous updates + * + * Calling this with 0 disables sync. Calling it with non-zero enables + * sync and does an fsync(). + */ + krb5_error_code (*hdb_set_sync)(krb5_context, struct HDB *, int); }HDB; -#define HDB_INTERFACE_VERSION 7 +#define HDB_INTERFACE_VERSION 10 -struct hdb_so_method { - int version; +struct hdb_method { + int version; + krb5_error_code (*init)(krb5_context, void **); + void (*fini)(void *); const char *prefix; krb5_error_code (*create)(krb5_context, HDB **, const char *filename); }; +/* dump entry format, for hdb_print_entry() */ +typedef enum hdb_dump_format { + HDB_DUMP_HEIMDAL = 0, + HDB_DUMP_MIT = 1, +} hdb_dump_format_t; + +struct hdb_print_entry_arg { + FILE *out; + hdb_dump_format_t fmt; +}; + typedef krb5_error_code (*hdb_foreach_func_t)(krb5_context, HDB*, hdb_entry_ex*, void*); extern krb5_kt_ops hdb_kt_ops; - -struct hdb_method { - int interface_version; - const char *prefix; - krb5_error_code (*create)(krb5_context, HDB **, const char *filename); -}; +extern krb5_kt_ops hdb_get_kt_ops; extern const int hdb_interface_version; diff --git a/crypto/heimdal/lib/hdb/hdb.asn1 b/crypto/heimdal/lib/hdb/hdb.asn1 --- a/crypto/heimdal/lib/hdb/hdb.asn1 +++ b/crypto/heimdal/lib/hdb/hdb.asn1 @@ -46,8 +46,10 @@ trusted-for-delegation(14), -- Trusted to print forwardabled tickets allow-kerberos4(15), -- Allow Kerberos 4 requests allow-digest(16), -- Allow digest requests - locked-out(17) -- Account is locked out, + locked-out(17), -- Account is locked out, -- authentication will be denied + require-pwchange(18), -- require a passwd change + do-not-store(31) -- Not to be modified and stored in HDB } GENERATION ::= SEQUENCE { @@ -87,6 +89,17 @@ aliases[1] SEQUENCE OF Principal -- all names, inc primary } +Keys ::= SEQUENCE OF Key + +hdb_keyset ::= SEQUENCE { + kvno[0] INTEGER (0..4294967295), + keys[1] Keys, + set-time[2] KerberosTime OPTIONAL, -- time this keyset was created/set + ... +} + +HDB-Ext-KeySet ::= SEQUENCE OF hdb_keyset + HDB-extension ::= SEQUENCE { mandatory[0] BOOLEAN, -- kdc MUST understand this extension, @@ -102,6 +115,11 @@ aliases[6] HDB-Ext-Aliases, last-pw-change[7] KerberosTime, pkinit-cert[8] HDB-Ext-PKINIT-cert, + hist-keys[9] HDB-Ext-KeySet, + hist-kvno-diff-clnt[10] INTEGER (0..4294967295), + hist-kvno-diff-svc[11] INTEGER (0..4294967295), + policy[12] UTF8String, + principal-id[13] INTEGER(-9223372036854775808..9223372036854775807), ... }, ... @@ -109,16 +127,11 @@ HDB-extensions ::= SEQUENCE OF HDB-extension -hdb_keyset ::= SEQUENCE { - kvno[1] INTEGER (0..4294967295), - keys[0] SEQUENCE OF Key -} - hdb_entry ::= SEQUENCE { principal[0] Principal OPTIONAL, -- this is optional only -- for compatibility with libkrb5 kvno[1] INTEGER (0..4294967295), - keys[2] SEQUENCE OF Key, + keys[2] Keys, created-by[3] Event, modified-by[4] Event OPTIONAL, valid-start[5] KerberosTime OPTIONAL, diff --git a/crypto/heimdal/lib/hdb/hdb.c b/crypto/heimdal/lib/hdb/hdb.c --- a/crypto/heimdal/lib/hdb/hdb.c +++ b/crypto/heimdal/lib/hdb/hdb.c @@ -64,47 +64,97 @@ const int hdb_interface_version = HDB_INTERFACE_VERSION; static struct hdb_method methods[] = { -#if HAVE_DB1 || HAVE_DB3 - { HDB_INTERFACE_VERSION, "db:", hdb_db_create}, + /* "db:" should be db3 if we have db3, or db1 if we have db1 */ +#if HAVE_DB3 + { HDB_INTERFACE_VERSION, NULL, NULL, "db:", hdb_db3_create}, +#elif HAVE_DB1 + { HDB_INTERFACE_VERSION, NULL, NULL, "db:", hdb_db1_create}, #endif #if HAVE_DB1 - { HDB_INTERFACE_VERSION, "mit-db:", hdb_mdb_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "db1:", hdb_db1_create}, +#endif +#if HAVE_DB3 + { HDB_INTERFACE_VERSION, NULL, NULL, "db3:", hdb_db3_create}, +#endif +#if HAVE_DB1 + { HDB_INTERFACE_VERSION, NULL, NULL, "mit-db:", hdb_mitdb_create}, +#endif +#if HAVE_LMDB + { HDB_INTERFACE_VERSION, NULL, NULL, "mdb:", hdb_mdb_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "lmdb:", hdb_mdb_create}, #endif #if HAVE_NDBM - { HDB_INTERFACE_VERSION, "ndbm:", hdb_ndbm_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "ndbm:", hdb_ndbm_create}, #endif - { HDB_INTERFACE_VERSION, "keytab:", hdb_keytab_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "keytab:", hdb_keytab_create}, #if defined(OPENLDAP) && !defined(OPENLDAP_MODULE) - { HDB_INTERFACE_VERSION, "ldap:", hdb_ldap_create}, - { HDB_INTERFACE_VERSION, "ldapi:", hdb_ldapi_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "ldap:", hdb_ldap_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "ldapi:", hdb_ldapi_create}, +#elif defined(OPENLDAP) + { HDB_INTERFACE_VERSION, NULL, NULL, "ldap:", NULL}, + { HDB_INTERFACE_VERSION, NULL, NULL, "ldapi:", NULL}, #endif #ifdef HAVE_SQLITE3 - { HDB_INTERFACE_VERSION, "sqlite:", hdb_sqlite_create}, + { HDB_INTERFACE_VERSION, NULL, NULL, "sqlite:", hdb_sqlite_create}, #endif - {0, NULL, NULL} + { 0, NULL, NULL, NULL, NULL} }; -#if HAVE_DB1 || HAVE_DB3 -static struct hdb_method dbmetod = - { HDB_INTERFACE_VERSION, "", hdb_db_create }; +/* + * It'd be nice if we could try opening an HDB with each supported + * backend until one works or all fail. It may not be possible for all + * flavors, but where it's possible we should. + */ +#if defined(HAVE_LMDB) +static struct hdb_method default_dbmethod = + { HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_mdb_create }; +#elif defined(HAVE_DB3) +static struct hdb_method default_dbmethod = + { HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_db3_create }; +#elif defined(HAVE_DB1) +static struct hdb_method default_dbmethod = + { HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_db1_create }; #elif defined(HAVE_NDBM) -static struct hdb_method dbmetod = - { HDB_INTERFACE_VERSION, "", hdb_ndbm_create }; +static struct hdb_method default_dbmethod = + { HDB_INTERFACE_VERSION, NULL, NULL, "", hdb_ndbm_create }; #endif +const Keys * +hdb_kvno2keys(krb5_context context, + const hdb_entry *e, + krb5_kvno kvno) +{ + HDB_Ext_KeySet *hist_keys; + HDB_extension *extp; + size_t i; + + if (kvno == 0) + return &e->keys; + + extp = hdb_find_extension(e, choice_HDB_extension_data_hist_keys); + if (extp == NULL) + return 0; + + hist_keys = &extp->data.u.hist_keys; + for (i = 0; i < hist_keys->len; i++) { + if (hist_keys->val[i].kvno == kvno) + return &hist_keys->val[i].keys; + } + + return NULL; +} krb5_error_code hdb_next_enctype2key(krb5_context context, const hdb_entry *e, + const Keys *keyset, krb5_enctype enctype, Key **key) { + const Keys *keys = keyset ? keyset : &e->keys; Key *k; - for (k = *key ? (*key) + 1 : e->keys.val; - k < e->keys.val + e->keys.len; - k++) - { + for (k = *key ? (*key) + 1 : keys->val; k < keys->val + keys->len; k++) { if(k->key.keytype == enctype){ *key = k; return 0; @@ -119,11 +169,12 @@ krb5_error_code hdb_enctype2key(krb5_context context, hdb_entry *e, + const Keys *keyset, krb5_enctype enctype, Key **key) { *key = NULL; - return hdb_next_enctype2key(context, e, enctype, key); + return hdb_next_enctype2key(context, e, keyset, enctype, key); } void @@ -168,13 +219,14 @@ void hdb_free_entry(krb5_context context, hdb_entry_ex *ent) { + Key *k; size_t i; if (ent->free_entry) (*ent->free_entry)(context, ent); - for(i = 0; i < ent->entry.keys.len; ++i) { - Key *k = &ent->entry.keys.val[i]; + for(i = 0; i < ent->entry.keys.len; i++) { + k = &ent->entry.keys.val[i]; memset (k->key.keyvalue.data, 0, k->key.keyvalue.length); } @@ -265,100 +317,6 @@ return ret2; } -#ifdef HAVE_DLOPEN - - /* - * Load a dynamic backend from /usr/heimdal/lib/hdb_NAME.so, - * looking for the hdb_NAME_create symbol. - */ - -static const struct hdb_method * -find_dynamic_method (krb5_context context, - const char *filename, - const char **rest) -{ - static struct hdb_method method; - struct hdb_so_method *mso; - char *prefix, *path, *symbol; - const char *p; - void *dl; - size_t len; - - p = strchr(filename, ':'); - - /* if no prefix, don't know what module to load, just ignore it */ - if (p == NULL) - return NULL; - - len = p - filename; - *rest = filename + len + 1; - - prefix = malloc(len + 1); - if (prefix == NULL) - krb5_errx(context, 1, "out of memory"); - strlcpy(prefix, filename, len + 1); - - if (asprintf(&path, LIBDIR "/hdb_%s.so", prefix) == -1) - krb5_errx(context, 1, "out of memory"); - -#ifndef RTLD_NOW -#define RTLD_NOW 0 -#endif -#ifndef RTLD_GLOBAL -#define RTLD_GLOBAL 0 -#endif - - dl = dlopen(path, RTLD_NOW | RTLD_GLOBAL); - if (dl == NULL) { - krb5_warnx(context, "error trying to load dynamic module %s: %s\n", - path, dlerror()); - free(prefix); - free(path); - return NULL; - } - - if (asprintf(&symbol, "hdb_%s_interface", prefix) == -1) - krb5_errx(context, 1, "out of memory"); - - mso = (struct hdb_so_method *) dlsym(dl, symbol); - if (mso == NULL) { - krb5_warnx(context, "error finding symbol %s in %s: %s\n", - symbol, path, dlerror()); - dlclose(dl); - free(symbol); - free(prefix); - free(path); - return NULL; - } - free(path); - free(symbol); - - if (mso->version != HDB_INTERFACE_VERSION) { - krb5_warnx(context, - "error wrong version in shared module %s " - "version: %d should have been %d\n", - prefix, mso->version, HDB_INTERFACE_VERSION); - dlclose(dl); - free(prefix); - return NULL; - } - - if (mso->create == NULL) { - krb5_errx(context, 1, - "no entry point function in shared mod %s ", - prefix); - dlclose(dl); - free(prefix); - return NULL; - } - - method.create = mso->create; - method.prefix = prefix; - - return &method; -} -#endif /* HAVE_DLOPEN */ - /* * find the relevant method for `filename', returning a pointer to the * rest in `rest'. @@ -376,19 +334,62 @@ return h; } } -#if defined(HAVE_DB1) || defined(HAVE_DB3) || defined(HAVE_NDBM) - if (strncmp(filename, "/", 1) == 0 - || strncmp(filename, "./", 2) == 0 - || strncmp(filename, "../", 3) == 0) +#if defined(HAVE_DB1) || defined(HAVE_DB3) || defined(HAVE_LMDB) || defined(HAVE_NDBM) + if (strncmp(filename, "/", sizeof("/") - 1) == 0 + || strncmp(filename, "./", sizeof("./") - 1) == 0 + || strncmp(filename, "../", sizeof("../") - 1) == 0 +#ifdef WIN32 + || strncmp(filename, "\\\\", sizeof("\\\\") - 1) + || (isalpha(filename[0]) && filename[1] == ':') +#endif + ) { *rest = filename; - return &dbmetod; + return &default_dbmethod; } #endif return NULL; } +struct cb_s { + const char *residual; + const char *filename; + const struct hdb_method *h; +}; + +static krb5_error_code KRB5_LIB_CALL +callback(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + const struct hdb_method *h = (const struct hdb_method *)plug; + struct cb_s *cb_ctx = (struct cb_s *)userctx; + + if (strncmp(cb_ctx->filename, h->prefix, strlen(h->prefix)) == 0) { + cb_ctx->residual = cb_ctx->filename + strlen(h->prefix) + 1; + cb_ctx->h = h; + return 0; + } + return KRB5_PLUGIN_NO_HANDLE; +} + +static char * +make_sym(const char *prefix) +{ + char *s, *sym; + + errno = 0; + if (prefix == NULL || prefix[0] == '\0') + return NULL; + if ((s = strdup(prefix)) == NULL) + return NULL; + if (strchr(s, ':') != NULL) + *strchr(s, ':') = '\0'; + if (asprintf(&sym, "hdb_%s_interface", s) == -1) + sym = NULL; + free(s); + return sym; +} + krb5_error_code hdb_list_builtin(krb5_context context, char **list) { @@ -405,12 +406,35 @@ len += 1; buf = malloc(len); if (buf == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; + return krb5_enomem(context); } buf[0] = '\0'; for (h = methods; h->prefix != NULL; ++h) { + if (h->create == NULL) { + struct cb_s cb_ctx; + char *f; + char *sym; + + /* Try loading the plugin */ + if (asprintf(&f, "%sfoo", h->prefix) == -1) + f = NULL; + if ((sym = make_sym(h->prefix)) == NULL) { + free(buf); + free(f); + return krb5_enomem(context); + } + cb_ctx.filename = f; + cb_ctx.residual = NULL; + cb_ctx.h = NULL; + (void)_krb5_plugin_run_f(context, "krb5", sym, + HDB_INTERFACE_VERSION, 0, &cb_ctx, + callback); + free(f); + free(sym); + if (cb_ctx.h == NULL || cb_ctx.h->create == NULL) + continue; + } if (h != methods) strlcat(buf, ", ", len); strlcat(buf, h->prefix, len); @@ -451,39 +475,25 @@ krb5_error_code hdb_create(krb5_context context, HDB **db, const char *filename) { - const struct hdb_method *h; - const char *residual; - krb5_error_code ret; - struct krb5_plugin *list = NULL, *e; + struct cb_s cb_ctx; - if(filename == NULL) + if (filename == NULL) filename = HDB_DEFAULT_DB; - krb5_add_et_list(context, initialize_hdb_error_table_r); - h = find_method (filename, &residual); - - if (h == NULL) { - ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, "hdb", &list); - if(ret == 0 && list != NULL) { - for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { - h = _krb5_plugin_get_symbol(e); - if (strncmp (filename, h->prefix, strlen(h->prefix)) == 0 - && h->interface_version == HDB_INTERFACE_VERSION) { - residual = filename + strlen(h->prefix); - break; - } - } - if (e == NULL) { - h = NULL; - _krb5_plugin_free(list); - } - } - } + cb_ctx.h = find_method (filename, &cb_ctx.residual); + cb_ctx.filename = filename; -#ifdef HAVE_DLOPEN - if (h == NULL) - h = find_dynamic_method (context, filename, &residual); -#endif - if (h == NULL) - krb5_errx(context, 1, "No database support for %s", filename); - return (*h->create)(context, db, residual); + if (cb_ctx.h == NULL || cb_ctx.h->create == NULL) { + char *sym; + + if ((sym = make_sym(filename)) == NULL) + return krb5_enomem(context); + + (void)_krb5_plugin_run_f(context, "krb5", sym, HDB_INTERFACE_VERSION, + 0, &cb_ctx, callback); + + free(sym); + } + if (cb_ctx.h == NULL) + krb5_errx(context, 1, "No database support for %s", cb_ctx.filename); + return (*cb_ctx.h->create)(context, db, cb_ctx.residual); } diff --git a/crypto/heimdal/lib/hdb/hdb.schema b/crypto/heimdal/lib/hdb/hdb.schema --- a/crypto/heimdal/lib/hdb/hdb.schema +++ b/crypto/heimdal/lib/hdb/hdb.schema @@ -113,6 +113,11 @@ EQUALITY octetStringMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.40{128} ) +attributetype ( 1.3.6.1.4.1.5322.10.1.13 + NAME 'krb5ExtendedAttributes' + DESC 'Encoded ASN1 HDB Extension Attributes as an octet string' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.5 ) + # Object class definitions objectclass ( 1.3.6.1.4.1.5322.10.2.1 @@ -129,7 +134,7 @@ MUST ( krb5KeyVersionNumber ) MAY ( krb5ValidStart $ krb5ValidEnd $ krb5PasswordEnd $ krb5MaxLife $ krb5MaxRenew $ krb5KDCFlags $ - krb5EncryptionType $ krb5Key ) ) + krb5EncryptionType $ krb5Key $ krb5ExtendedAttributes ) ) objectclass ( 1.3.6.1.4.1.5322.10.2.3 NAME 'krb5Realm' diff --git a/crypto/heimdal/lib/hdb/hdb_err.et b/crypto/heimdal/lib/hdb/hdb_err.et --- a/crypto/heimdal/lib/hdb/hdb_err.et +++ b/crypto/heimdal/lib/hdb/hdb_err.et @@ -26,5 +26,8 @@ error_code MANDATORY_OPTION, "Entry contains unknown mandatory extension" error_code NO_WRITE_SUPPORT, "HDB backend doesn't contain write support" error_code NOT_FOUND_HERE, "The secret for this entry is not replicated to this database" +error_code MISUSE, "Incorrect use of the API" +error_code KVNO_NOT_FOUND, "Entry key version number not found" +error_code WRONG_REALM, "The principal exists in another realm." end diff --git a/crypto/heimdal/lib/hdb/hdb_locl.h b/crypto/heimdal/lib/hdb/hdb_locl.h --- a/crypto/heimdal/lib/hdb/hdb_locl.h +++ b/crypto/heimdal/lib/hdb/hdb_locl.h @@ -38,6 +38,9 @@ #include +#include +#include + #include #include #include diff --git a/crypto/heimdal/lib/hdb/keys.c b/crypto/heimdal/lib/hdb/keys.c --- a/crypto/heimdal/lib/hdb/keys.c +++ b/crypto/heimdal/lib/hdb/keys.c @@ -1,6 +1,5 @@ - /* - * Copyright (c) 1997 - 2001, 2003 - 2004 Kungliga Tekniska Högskolan + * Copyright (c) 1997 - 2011 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -34,14 +33,29 @@ #include "hdb_locl.h" +struct hx509_certs_data; +struct krb5_pk_identity; +struct krb5_pk_cert; +struct ContentInfo; +struct AlgorithmIdentifier; +struct _krb5_krb_auth_data; +typedef struct krb5_pk_init_ctx_data *krb5_pk_init_ctx; +struct krb5_dh_moduli; +struct _krb5_key_data; +struct _krb5_encryption_type; +struct _krb5_key_type; +#include +#include +#include + /* * free all the memory used by (len, keys) */ void -hdb_free_keys (krb5_context context, int len, Key *keys) +hdb_free_keys(krb5_context context, int len, Key *keys) { - int i; + size_t i; for (i = 0; i < len; i++) { free(keys[i].mkvno); @@ -68,15 +82,15 @@ */ static const krb5_enctype des_etypes[] = { - ETYPE_DES_CBC_MD5, - ETYPE_DES_CBC_MD4, - ETYPE_DES_CBC_CRC + KRB5_ENCTYPE_DES_CBC_MD5, + KRB5_ENCTYPE_DES_CBC_MD4, + KRB5_ENCTYPE_DES_CBC_CRC }; static const krb5_enctype all_etypes[] = { - ETYPE_AES256_CTS_HMAC_SHA1_96, - ETYPE_ARCFOUR_HMAC_MD5, - ETYPE_DES3_CBC_SHA1 + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96, + KRB5_ENCTYPE_DES3_CBC_SHA1, + KRB5_ENCTYPE_ARCFOUR_HMAC_MD5 }; static krb5_error_code @@ -114,7 +128,7 @@ enctypes = des_etypes; num_enctypes = sizeof(des_etypes)/sizeof(des_etypes[0]); } else if(strcmp(buf[i], "des3") == 0) { - e = ETYPE_DES3_CBC_SHA1; + e = KRB5_ENCTYPE_DES3_CBC_SHA1; enctypes = &e; num_enctypes = 1; } else { @@ -148,29 +162,30 @@ continue; } - { - /* if there is a final string, use it as the string to - salt with, this is mostly useful with null salt for - v4 compat, and a cell name for afs compat */ - salt->saltvalue.data = strdup(buf[i]); - if (salt->saltvalue.data == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; - } - salt->saltvalue.length = strlen(buf[i]); - } + if (salt->saltvalue.data != NULL) + free(salt->saltvalue.data); + /* if there is a final string, use it as the string to + salt with, this is mostly useful with null salt for + v4 compat, and a cell name for afs compat */ + salt->saltvalue.data = strdup(buf[i]); + if (salt->saltvalue.data == NULL) + return krb5_enomem(context); + salt->saltvalue.length = strlen(buf[i]); } if(enctypes == NULL || salt->salttype == 0) { + krb5_free_salt(context, *salt); krb5_set_error_message(context, EINVAL, "bad value for default_keys `%s'", key); return EINVAL; } /* if no salt was specified make up default salt */ if(salt->saltvalue.data == NULL) { - if(salt->salttype == KRB5_PW_SALT) + if(salt->salttype == KRB5_PW_SALT) { ret = krb5_get_pw_salt(context, principal, salt); - else if(salt->salttype == KRB5_AFS3_SALT) { + if (ret) + return ret; + } else if(salt->salttype == KRB5_AFS3_SALT) { krb5_const_realm realm = krb5_principal_get_realm(context, principal); salt->saltvalue.data = strdup(realm); if(salt->saltvalue.data == NULL) { @@ -196,6 +211,256 @@ return 0; } +/** + * This function prunes an HDB entry's keys that are too old to have been used + * to mint still valid tickets (based on the entry's maximum ticket lifetime). + * + * @param context Context + * @param entry HDB entry + */ +krb5_error_code +hdb_prune_keys(krb5_context context, hdb_entry *entry) +{ + HDB_extension *ext; + HDB_Ext_KeySet *keys; + size_t nelem; + + ext = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys); + if (ext == NULL) + return 0; + keys = &ext->data.u.hist_keys; + nelem = keys->len; + + /* Optionally drop key history for keys older than now - max_life */ + if (entry->max_life != NULL && nelem > 0 + && krb5_config_get_bool_default(context, NULL, FALSE, + "kadmin", "prune-key-history", NULL)) { + hdb_keyset *elem; + time_t ceiling = time(NULL) - *entry->max_life; + time_t keep_time = 0; + size_t i; + + /* + * Compute most recent key timestamp that predates the current time + * by at least the entry's maximum ticket lifetime. + */ + for (i = 0; i < nelem; ++i) { + elem = &keys->val[i]; + if (elem->set_time && *elem->set_time < ceiling + && (keep_time == 0 || *elem->set_time > keep_time)) + keep_time = *elem->set_time; + } + + /* Drop obsolete entries */ + if (keep_time) { + for (i = 0; i < nelem; /* see below */) { + elem = &keys->val[i]; + if (elem->set_time && *elem->set_time < keep_time) { + remove_HDB_Ext_KeySet(keys, i); + /* + * Removing the i'th element shifts the tail down, continue + * at same index with reduced upper bound. + */ + --nelem; + continue; + } + ++i; + } + } + } + + return 0; +} + +/** + * This function adds an HDB entry's current keyset to the entry's key + * history. The current keyset is left alone; the caller is responsible + * for freeing it. + * + * @param context Context + * @param entry HDB entry + */ +krb5_error_code +hdb_add_current_keys_to_history(krb5_context context, hdb_entry *entry) +{ + krb5_boolean replace = FALSE; + krb5_error_code ret; + HDB_extension *ext; + HDB_Ext_KeySet *keys; + hdb_keyset newkeyset; + time_t newtime; + + if (entry->keys.len == 0) + return 0; /* nothing to do */ + + ext = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys); + if (ext == NULL) { + replace = TRUE; + ext = calloc(1, sizeof (*ext)); + if (ext == NULL) + return krb5_enomem(context); + + ext->data.element = choice_HDB_extension_data_hist_keys; + } + keys = &ext->data.u.hist_keys; + + ext->mandatory = FALSE; + + /* + * Copy in newest old keyset + */ + ret = hdb_entry_get_pw_change_time(entry, &newtime); + if (ret) + goto out; + + memset(&newkeyset, 0, sizeof(newkeyset)); + newkeyset.keys = entry->keys; + newkeyset.kvno = entry->kvno; + newkeyset.set_time = &newtime; + + ret = add_HDB_Ext_KeySet(keys, &newkeyset); + if (ret) + goto out; + + if (replace) { + /* hdb_replace_extension() deep-copies ext; what a waste */ + ret = hdb_replace_extension(context, entry, ext); + if (ret) + goto out; + } + + ret = hdb_prune_keys(context, entry); + if (ret) + goto out; + + out: + if (replace && ext) { + free_HDB_extension(ext); + free(ext); + } + return ret; +} + +/** + * This function adds a key to an HDB entry's key history. + * + * @param context Context + * @param entry HDB entry + * @param kvno Key version number of the key to add to the history + * @param key The Key to add + */ +krb5_error_code +hdb_add_history_key(krb5_context context, hdb_entry *entry, krb5_kvno kvno, Key *key) +{ + size_t i; + hdb_keyset keyset; + HDB_Ext_KeySet *hist_keys; + HDB_extension ext; + HDB_extension *extp; + krb5_error_code ret; + + memset(&keyset, 0, sizeof (keyset)); + memset(&ext, 0, sizeof (ext)); + + extp = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys); + if (extp == NULL) { + ext.data.element = choice_HDB_extension_data_hist_keys; + extp = &ext; + } + + extp->mandatory = FALSE; + hist_keys = &extp->data.u.hist_keys; + + for (i = 0; i < hist_keys->len; i++) { + if (hist_keys->val[i].kvno == kvno) { + ret = add_Keys(&hist_keys->val[i].keys, key); + goto out; + } + } + + keyset.kvno = kvno; + ret = add_Keys(&keyset.keys, key); + if (ret) + goto out; + ret = add_HDB_Ext_KeySet(hist_keys, &keyset); + if (ret) + goto out; + if (extp == &ext) { + ret = hdb_replace_extension(context, entry, &ext); + if (ret) + goto out; + } + +out: + free_hdb_keyset(&keyset); + free_HDB_extension(&ext); + return ret; +} + + +/** + * This function changes an hdb_entry's kvno, swapping the current key + * set with a historical keyset. If no historical keys are found then + * an error is returned (the caller can still set entry->kvno directly). + * + * @param context krb5_context + * @param new_kvno New kvno for the entry + * @param entry hdb_entry to modify + */ +krb5_error_code +hdb_change_kvno(krb5_context context, krb5_kvno new_kvno, hdb_entry *entry) +{ + HDB_extension ext; + HDB_extension *extp; + hdb_keyset keyset; + HDB_Ext_KeySet *hist_keys; + size_t i; + int found = 0; + krb5_error_code ret; + + if (entry->kvno == new_kvno) + return 0; + + extp = hdb_find_extension(entry, choice_HDB_extension_data_hist_keys); + if (extp == NULL) { + memset(&ext, 0, sizeof (ext)); + ext.data.element = choice_HDB_extension_data_hist_keys; + extp = &ext; + } + + memset(&keyset, 0, sizeof (keyset)); + hist_keys = &extp->data.u.hist_keys; + for (i = 0; i < hist_keys->len; i++) { + if (hist_keys->val[i].kvno == new_kvno) { + found = 1; + ret = copy_hdb_keyset(&hist_keys->val[i], &keyset); + if (ret) + goto out; + ret = remove_HDB_Ext_KeySet(hist_keys, i); + if (ret) + goto out; + break; + } + } + + if (!found) + return HDB_ERR_KVNO_NOT_FOUND; + + ret = hdb_add_current_keys_to_history(context, entry); + if (ret) + goto out; + + /* Note: we do nothing with keyset.set_time */ + entry->kvno = new_kvno; + entry->keys = keyset.keys; /* shortcut */ + memset(&keyset.keys, 0, sizeof (keyset.keys)); + +out: + free_hdb_keyset(&keyset); + return ret; +} + + static krb5_error_code add_enctype_to_key_set(Key **key_set, size_t *nkeyset, krb5_enctype enctype, krb5_salt *salt) @@ -243,6 +508,122 @@ } +static +krb5_error_code +ks_tuple2str(krb5_context context, int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, char ***ks_tuple_strs) +{ + size_t i; + char **ksnames; + krb5_error_code rc = KRB5_PROG_ETYPE_NOSUPP; + + *ks_tuple_strs = NULL; + if (n_ks_tuple < 1) + return 0; + + if ((ksnames = calloc(n_ks_tuple + 1, sizeof (*ksnames))) == NULL) + return (errno); + + for (i = 0; i < n_ks_tuple; i++) { + char *ename, *sname; + + if (krb5_enctype_to_string(context, ks_tuple[i].ks_enctype, &ename)) + goto out; + if (krb5_salttype_to_string(context, ks_tuple[i].ks_enctype, + ks_tuple[i].ks_salttype, &sname)) { + free(ename); + goto out; + } + + if (asprintf(&ksnames[i], "%s:%s", ename, sname) == -1) { + rc = errno; + free(ename); + free(sname); + goto out; + } + free(ename); + free(sname); + } + + ksnames[i] = NULL; + *ks_tuple_strs = ksnames; + return 0; + +out: + for (i = 0; i < n_ks_tuple; i++) + free(ksnames[i]); + free(ksnames); + return (rc); +} + +/* + * + */ + +static char ** +glob_rules_keys(krb5_context context, krb5_const_principal principal) +{ + const krb5_config_binding *list; + krb5_principal pattern; + krb5_error_code ret; + + list = krb5_config_get_list(context, NULL, "kadmin", + "default_key_rules", NULL); + if (list == NULL) + return NULL; + + while (list) { + if (list->type == krb5_config_string) { + ret = krb5_parse_name(context, list->name, &pattern); + if (ret == 0) { + ret = krb5_principal_match(context, principal, pattern); + krb5_free_principal(context, pattern); + if (ret) { + return krb5_config_get_strings(context, list, + list->name, NULL); + } + } + } + list = list->next; + } + return NULL; +} + +/* + * NIST guidance in Section 5.1 of [SP800-132] requires that a portion + * of the salt of at least 128 bits shall be randomly generated. + */ +static krb5_error_code +add_random_to_salt(krb5_context context, krb5_salt *in, krb5_salt *out) +{ + krb5_error_code ret; + char *p; + unsigned char random[16]; + char *s; + int slen; + + krb5_generate_random_block(random, sizeof(random)); + + slen = rk_base64_encode(random, sizeof(random), &s); + if (slen < 0) + return ENOMEM; + + ret = krb5_data_alloc(&out->saltvalue, slen + in->saltvalue.length); + if (ret) { + free(s); + return ret; + } + + p = out->saltvalue.data; + memcpy(p, s, slen); + memcpy(&p[slen], in->saltvalue.data, in->saltvalue.length); + + out->salttype = in->salttype; + free(s); + + return 0; +} + /* * Generate the `key_set' from the [kadmin]default_keys statement. If * `no_salt' is set, salt is not important (and will not be set) since @@ -251,12 +632,16 @@ krb5_error_code hdb_generate_key_set(krb5_context context, krb5_principal principal, + krb5_key_salt_tuple *ks_tuple, int n_ks_tuple, Key **ret_key_set, size_t *nkeyset, int no_salt) { - char **ktypes, **kp; + char **ktypes = NULL; + char **kp; krb5_error_code ret; Key *k, *key_set; size_t i, j; + char **ks_tuple_strs; + char **config_ktypes = NULL; static const char *default_keytypes[] = { "aes256-cts-hmac-sha1-96:pw-salt", "des3-cbc-sha1:pw-salt", @@ -264,16 +649,24 @@ NULL }; - ktypes = krb5_config_get_strings(context, NULL, "kadmin", - "default_keys", NULL); + if ((ret = ks_tuple2str(context, n_ks_tuple, ks_tuple, &ks_tuple_strs))) + return ret; + + ktypes = ks_tuple_strs; + if (ktypes == NULL) { + ktypes = glob_rules_keys(context, principal); + } + if (ktypes == NULL) { + config_ktypes = krb5_config_get_strings(context, NULL, "kadmin", + "default_keys", NULL); + ktypes = config_ktypes; + } if (ktypes == NULL) ktypes = (char **)(intptr_t)default_keytypes; *ret_key_set = key_set = NULL; *nkeyset = 0; - ret = 0; - for(kp = ktypes; kp && *kp; kp++) { const char *p; krb5_salt salt; @@ -298,10 +691,14 @@ if (ret) { krb5_warn(context, ret, "bad value for default_keys `%s'", *kp); ret = 0; + krb5_free_salt(context, salt); continue; } for (i = 0; i < num_enctypes; i++) { + krb5_salt *saltp = no_salt ? NULL : &salt; + krb5_salt rsalt; + /* find duplicates */ for (j = 0; j < *nkeyset; j++) { @@ -320,14 +717,27 @@ } } /* not a duplicate, lets add it */ - if (j == *nkeyset) { + if (j < *nkeyset) + continue; + + memset(&rsalt, 0, sizeof(rsalt)); + + /* prepend salt with randomness if required */ + if (!no_salt && + _krb5_enctype_requires_random_salt(context, enctypes[i])) { + saltp = &rsalt; + ret = add_random_to_salt(context, &salt, &rsalt); + } + + if (ret == 0) ret = add_enctype_to_key_set(&key_set, nkeyset, enctypes[i], - no_salt ? NULL : &salt); - if (ret) { - free(enctypes); - krb5_free_salt(context, salt); - goto out; - } + saltp); + krb5_free_salt(context, rsalt); + + if (ret) { + free(enctypes); + krb5_free_salt(context, salt); + goto out; } } free(enctypes); @@ -337,8 +747,12 @@ *ret_key_set = key_set; out: - if (ktypes != (char **)(intptr_t)default_keytypes) - krb5_config_free_strings(ktypes); + if (config_ktypes != NULL) + krb5_config_free_strings(config_ktypes); + + for(kp = ks_tuple_strs; kp && *kp; kp++) + free(*kp); + free(ks_tuple_strs); if (ret) { krb5_warn(context, ret, @@ -358,32 +772,34 @@ krb5_error_code -hdb_generate_key_set_password(krb5_context context, - krb5_principal principal, - const char *password, - Key **keys, size_t *num_keys) +hdb_generate_key_set_password_with_ks_tuple(krb5_context context, + krb5_principal principal, + const char *password, + krb5_key_salt_tuple *ks_tuple, + int n_ks_tuple, + Key **keys, size_t *num_keys) { krb5_error_code ret; size_t i; - ret = hdb_generate_key_set(context, principal, + ret = hdb_generate_key_set(context, principal, ks_tuple, n_ks_tuple, keys, num_keys, 0); if (ret) return ret; for (i = 0; i < (*num_keys); i++) { krb5_salt salt; + Key *key = &(*keys)[i]; - salt.salttype = (*keys)[i].salt->type; - salt.saltvalue.length = (*keys)[i].salt->salt.length; - salt.saltvalue.data = (*keys)[i].salt->salt.data; + salt.salttype = key->salt->type; + salt.saltvalue.length = key->salt->salt.length; + salt.saltvalue.data = key->salt->salt.data; ret = krb5_string_to_key_salt (context, - (*keys)[i].key.keytype, + key->key.keytype, password, salt, - &(*keys)[i].key); - + &key->key); if(ret) break; } @@ -394,3 +810,16 @@ } return ret; } + + +krb5_error_code +hdb_generate_key_set_password(krb5_context context, + krb5_principal principal, + const char *password, + Key **keys, size_t *num_keys) +{ + + return hdb_generate_key_set_password_with_ks_tuple(context, principal, + password, NULL, 0, + keys, num_keys); +} diff --git a/crypto/heimdal/lib/hdb/keytab.c b/crypto/heimdal/lib/hdb/keytab.c --- a/crypto/heimdal/lib/hdb/keytab.c +++ b/crypto/heimdal/lib/hdb/keytab.c @@ -65,7 +65,7 @@ } db = name; mkey = strstr(name, ":mkey="); - if(mkey == NULL || mkey[5] == '\0') { + if(mkey == NULL || mkey[6] == '\0') { if(*name == '\0') d->dbname = NULL; else { @@ -87,7 +87,7 @@ memmove(d->dbname, db, mkey - db); d->dbname[mkey - db] = '\0'; - d->mkey = strdup(mkey + 5); + d->mkey = strdup(mkey + 6); if(d->mkey == NULL) { free(d->dbname); free(d); @@ -159,8 +159,12 @@ } } hdb_free_dbinfo(context, &head); - if (*dbname == NULL) - *dbname = strdup(HDB_DEFAULT_DB); + if (*dbname == NULL && + (*dbname = strdup(HDB_DEFAULT_DB)) == NULL) { + free(*mkey); + *mkey = NULL; + return krb5_enomem(context); + } return 0; } @@ -420,5 +424,23 @@ hdb_next_entry, hdb_end_seq_get, NULL, /* add */ - NULL /* remove */ + NULL, /* remove */ + NULL, + 0 +}; + +krb5_kt_ops hdb_get_kt_ops = { + "HDBGET", + hdb_resolve, + hdb_get_name, + hdb_close, + NULL, + hdb_get_entry, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0 }; diff --git a/crypto/heimdal/lib/hdb/libhdb-exports.def b/crypto/heimdal/lib/hdb/libhdb-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hdb/libhdb-exports.def @@ -0,0 +1,120 @@ +EXPORTS + encode_hdb_keyset + hdb_add_master_key + hdb_add_current_keys_to_history + hdb_change_kvno + hdb_check_db_format + hdb_clear_extension + hdb_clear_master_key + hdb_create + hdb_db_dir + hdb_dbinfo_get_acl_file + hdb_dbinfo_get_binding + hdb_dbinfo_get_dbname + hdb_dbinfo_get_label + hdb_dbinfo_get_log_file + hdb_dbinfo_get_mkey_file + hdb_dbinfo_get_next + hdb_dbinfo_get_realm + hdb_default_db + hdb_enctype2key + hdb_entry2string + hdb_entry2value + hdb_entry_alias2value + hdb_entry_check_mandatory + hdb_entry_clear_password + hdb_entry_get_ConstrainedDelegACL + hdb_entry_get_aliases + hdb_entry_get_password + hdb_entry_get_pkinit_acl + hdb_entry_get_pkinit_cert + hdb_entry_get_pkinit_hash + hdb_entry_get_pw_change_time + hdb_entry_set_password + hdb_entry_set_pw_change_time + hdb_find_extension + hdb_foreach + hdb_free_dbinfo + hdb_free_entry + hdb_free_key + hdb_free_keys + hdb_free_master_key + hdb_generate_key_set + hdb_generate_key_set_password + hdb_generate_key_set_password_with_ks_tuple + hdb_get_dbinfo + hdb_init_db + hdb_interface_version DATA + hdb_key2principal + hdb_kvno2keys + hdb_list_builtin + hdb_lock + hdb_next_enctype2key + hdb_principal2key + hdb_print_entry + hdb_process_master_key + hdb_prune_keys + hdb_read_master_key + hdb_replace_extension + hdb_seal_key + hdb_seal_key_mkey + hdb_seal_keys + hdb_seal_keys_mkey + hdb_set_last_modified_by + hdb_set_master_key + hdb_set_master_keyfile + hdb_unlock + hdb_unseal_key + hdb_unseal_key_mkey + hdb_unseal_keys + hdb_unseal_keys_mkey + hdb_value2entry + hdb_value2entry_alias + hdb_write_master_key + length_hdb_keyset + initialize_hdb_error_table_r + + hdb_kt_ops + hdb_get_kt_ops + +; MIT KDB related entries + _hdb_mdb_value2entry + _hdb_mit_dump2mitdb_entry + +; some random bits needed for libkadm + HDBFlags2int + asn1_HDBFlags_units + copy_Event + copy_HDB_extensions + copy_Key + copy_Keys + copy_Salt + decode_HDB_Ext_Aliases + decode_HDB_Ext_PKINIT_acl + decode_HDB_extension + decode_Key + decode_Keys + encode_HDB_Ext_Aliases + encode_HDB_Ext_PKINIT_acl + encode_HDB_extension + encode_Key + encode_Keys + free_Event + free_HDB_Ext_Aliases + free_HDB_Ext_PKINIT_acl + free_HDB_extension + free_HDB_extensions + free_Key + free_Keys + free_Salt + free_hdb_entry + free_hdb_keyset + int2HDBFlags + length_HDB_Ext_Aliases + length_HDB_Ext_PKINIT_acl + length_HDB_extension + length_Key + length_Keys + add_Keys + add_HDB_Ext_KeySet + remove_Keys diff --git a/crypto/heimdal/lib/hdb/libhdb-version.rc b/crypto/heimdal/lib/hdb/libhdb-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hdb/libhdb-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_DLL +#define RC_FILE_DESC_0409 "Heimdal DB Library" +#define RC_FILE_ORIG_0409 "libhdb.dll" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/hdb/mkey.c b/crypto/heimdal/lib/hdb/mkey.c --- a/crypto/heimdal/lib/hdb/mkey.c +++ b/crypto/heimdal/lib/hdb/mkey.c @@ -40,6 +40,7 @@ krb5_keytab_entry keytab; krb5_crypto crypto; struct hdb_master_key_data *next; + unsigned int key_usage; }; void @@ -68,6 +69,7 @@ krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } + (*mkey)->key_usage = HDB_KU_MKEY; (*mkey)->keytab.vno = kvno; ret = krb5_parse_name(context, "K/M", &(*mkey)->keytab.principal); if(ret) @@ -117,6 +119,7 @@ krb5_keytab_entry entry; hdb_master_key p; + *mkey = NULL; ret = krb5_kt_resolve(context, filename, &id); if(ret) return ret; @@ -124,22 +127,26 @@ ret = krb5_kt_start_seq_get(context, id, &cursor); if(ret) goto out; - *mkey = NULL; while(krb5_kt_next_entry(context, id, &entry, &cursor) == 0) { p = calloc(1, sizeof(*p)); - if(p == NULL) { - krb5_kt_end_seq_get(context, id, &cursor); + if (p == NULL) { ret = ENOMEM; - goto out; + break; } p->keytab = entry; - ret = krb5_crypto_init(context, &p->keytab.keyblock, 0, &p->crypto); p->next = *mkey; *mkey = p; + ret = krb5_crypto_init(context, &p->keytab.keyblock, 0, &p->crypto); + if (ret) + break; } krb5_kt_end_seq_get(context, id, &cursor); out: krb5_kt_close(context, id); + if (ret) { + hdb_free_master_key(context, *mkey); + *mkey = NULL; + } return ret; } @@ -219,7 +226,7 @@ } ret = decode_EncryptionKey(buf, len, &key, &ret_len); - memset(buf, 0, sizeof(buf)); + memset_s(buf, sizeof(buf), 0, sizeof(buf)); if(ret) return ret; @@ -272,7 +279,7 @@ memset(&key, 0, sizeof(key)); key.keytype = ETYPE_DES_PCBC_NONE; ret = krb5_data_copy(&key.keyvalue, buf, len); - memset(buf, 0, sizeof(buf)); + memset_s(buf, sizeof(buf), 0, sizeof(buf)); if(ret) return ret; @@ -362,8 +369,17 @@ return ret; } +krb5_error_code +_hdb_set_master_key_usage(krb5_context context, HDB *db, unsigned int key_usage) +{ + if (db->hdb_master_key_set == 0) + return HDB_ERR_NO_MKEY; + db->hdb_master_key->key_usage = key_usage; + return 0; +} + hdb_master_key -_hdb_find_master_key(uint32_t *mkvno, hdb_master_key mkey) +_hdb_find_master_key(unsigned int *mkvno, hdb_master_key mkey) { hdb_master_key ret = NULL; while(mkey) { @@ -479,6 +495,135 @@ return hdb_unseal_keys_mkey(context, ent, db->hdb_master_key); } +/* + * Unseal the keys for the given kvno (or all of them) of entry. + * + * If kvno == 0 -> unseal all. + * if kvno != 0 -> unseal the requested kvno and make sure it's the one listed + * as the current keyset for the entry (swapping it with a + * historical keyset if need be). + */ +krb5_error_code +hdb_unseal_keys_kvno(krb5_context context, HDB *db, krb5_kvno kvno, + unsigned flags, hdb_entry *ent) +{ + krb5_error_code ret = HDB_ERR_NOENTRY; + HDB_extension *ext; + HDB_Ext_KeySet *hist_keys; + Key *tmp_val; + time_t tmp_set_time; + unsigned int tmp_len; + unsigned int kvno_diff = 0; + krb5_kvno tmp_kvno; + size_t i, k; + int exclude_dead = 0; + KerberosTime now = 0; + + if (kvno == 0) + ret = 0; + + if ((flags & HDB_F_LIVE_CLNT_KVNOS) || (flags & HDB_F_LIVE_SVC_KVNOS)) { + exclude_dead = 1; + now = time(NULL); + if (HDB_F_LIVE_CLNT_KVNOS) + kvno_diff = hdb_entry_get_kvno_diff_clnt(ent); + else + kvno_diff = hdb_entry_get_kvno_diff_svc(ent); + } + + ext = hdb_find_extension(ent, choice_HDB_extension_data_hist_keys); + if (ext == NULL || (&ext->data.u.hist_keys)->len == 0) + return hdb_unseal_keys_mkey(context, ent, db->hdb_master_key); + + /* For swapping; see below */ + tmp_len = ent->keys.len; + tmp_val = ent->keys.val; + tmp_kvno = ent->kvno; + (void) hdb_entry_get_pw_change_time(ent, &tmp_set_time); + + hist_keys = &ext->data.u.hist_keys; + + for (i = 0; i < hist_keys->len; i++) { + if (kvno != 0 && hist_keys->val[i].kvno != kvno) + continue; + + if (exclude_dead && + ((ent->max_life != NULL && + hist_keys->val[i].set_time != NULL && + (*hist_keys->val[i].set_time) < (now - (*ent->max_life))) || + (hist_keys->val[i].kvno < kvno && + (kvno - hist_keys->val[i].kvno) > kvno_diff))) + /* + * The KDC may want to to check for this keyset's set_time + * is within the TGS principal's max_life, say. But we stop + * here. + */ + continue; + + /* Either the keys we want, or all the keys */ + for (k = 0; k < hist_keys->val[i].keys.len; k++) { + ret = hdb_unseal_key_mkey(context, + &hist_keys->val[i].keys.val[k], + db->hdb_master_key); + /* + * If kvno == 0 we might not want to bail here! E.g., if we + * no longer have the right master key, so just ignore this. + * + * We could filter out keys that we can't decrypt here + * because of HDB_ERR_NO_MKEY. However, it seems safest to + * filter them out only where necessary, say, in kadm5. + */ + if (ret && kvno != 0) + return ret; + if (ret && ret != HDB_ERR_NO_MKEY) + return (ret); + } + + if (kvno == 0) + continue; + + /* + * What follows is a bit of a hack. + * + * This is the keyset we're being asked for, but it's not the + * current keyset. So we add the current keyset to the history, + * leave the one we were asked for in the history, and pretend + * the one we were asked for is also the current keyset. + * + * This is a bit of a defensive hack in case an entry fetched + * this way ever gets modified then stored: if the keyset is not + * changed we can detect this and put things back, else we won't + * drop any keysets from history by accident. + * + * Note too that we only ever get called with a non-zero kvno + * either in the KDC or in cases where we aren't changing the + * HDB entry anyways, which is why this is just a defensive + * hack. We also don't fetch specific kvnos in the dump case, + * so there's no danger that we'll dump this entry and load it + * again, repeatedly causing the history to grow boundelessly. + */ + + /* Swap key sets */ + ent->kvno = hist_keys->val[i].kvno; + ent->keys.val = hist_keys->val[i].keys.val; + ent->keys.len = hist_keys->val[i].keys.len; + if (hist_keys->val[i].set_time != NULL) + /* Sloppy, but the callers we expect won't care */ + (void) hdb_entry_set_pw_change_time(context, ent, + *hist_keys->val[i].set_time); + hist_keys->val[i].kvno = tmp_kvno; + hist_keys->val[i].keys.val = tmp_val; + hist_keys->val[i].keys.len = tmp_len; + if (hist_keys->val[i].set_time != NULL) + /* Sloppy, but the callers we expect won't care */ + *hist_keys->val[i].set_time = tmp_set_time; + + return 0; + } + + return (ret); +} + krb5_error_code hdb_unseal_key(krb5_context context, HDB *db, Key *k) { @@ -526,14 +671,31 @@ krb5_error_code hdb_seal_keys_mkey(krb5_context context, hdb_entry *ent, hdb_master_key mkey) { - size_t i; - for(i = 0; i < ent->keys.len; i++){ - krb5_error_code ret; + HDB_extension *ext; + HDB_Ext_KeySet *hist_keys; + size_t i, k; + krb5_error_code ret; + for(i = 0; i < ent->keys.len; i++){ ret = hdb_seal_key_mkey(context, &ent->keys.val[i], mkey); if (ret) return ret; } + + ext = hdb_find_extension(ent, choice_HDB_extension_data_hist_keys); + if (ext == NULL) + return 0; + hist_keys = &ext->data.u.hist_keys; + + for (i = 0; i < hist_keys->len; i++) { + for (k = 0; k < hist_keys->val[i].keys.len; k++) { + ret = hdb_seal_key_mkey(context, &hist_keys->val[i].keys.val[k], + mkey); + if (ret) + return ret; + } + } + return 0; } @@ -556,9 +718,9 @@ } krb5_error_code -hdb_set_master_key (krb5_context context, - HDB *db, - krb5_keyblock *key) +hdb_set_master_key(krb5_context context, + HDB *db, + krb5_keyblock *key) { krb5_error_code ret; hdb_master_key mkey; @@ -571,6 +733,7 @@ des_set_random_generator_seed(key.keyvalue.data); #endif db->hdb_master_key_set = 1; + db->hdb_master_key->key_usage = HDB_KU_MKEY; return 0; } diff --git a/crypto/heimdal/lib/hdb/print.c b/crypto/heimdal/lib/hdb/print.c --- a/crypto/heimdal/lib/hdb/print.c +++ b/crypto/heimdal/lib/hdb/print.c @@ -57,44 +57,57 @@ generation number */ -static krb5_error_code +/* + * These utility functions return the number of bytes written or -1, and + * they set an error in the context. + */ +static ssize_t append_string(krb5_context context, krb5_storage *sp, const char *fmt, ...) { - krb5_error_code ret; + ssize_t sz; char *s; + int rc; va_list ap; va_start(ap, fmt); - vasprintf(&s, fmt, ap); + rc = vasprintf(&s, fmt, ap); va_end(ap); - if(s == NULL) { + if(rc < 0) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; + return -1; } - ret = krb5_storage_write(sp, s, strlen(s)); + sz = krb5_storage_write(sp, s, strlen(s)); free(s); - return ret; + return sz; } static krb5_error_code -append_hex(krb5_context context, krb5_storage *sp, krb5_data *data) +append_hex(krb5_context context, krb5_storage *sp, + int always_encode, int lower, krb5_data *data) { + ssize_t sz; int printable = 1; size_t i; char *p; p = data->data; - for(i = 0; i < data->length; i++) - if(!isalnum((unsigned char)p[i]) && p[i] != '.'){ - printable = 0; - break; - } - if(printable) + if (!always_encode) { + for (i = 0; i < data->length; i++) { + if (!isalnum((unsigned char)p[i]) && p[i] != '.'){ + printable = 0; + break; + } + } + } + if (printable && !always_encode) return append_string(context, sp, "\"%.*s\"", data->length, data->data); - hex_encode(data->data, data->length, &p); - append_string(context, sp, "%s", p); + sz = hex_encode(data->data, data->length, &p); + if (sz == -1) return sz; + if (lower) + strlwr(p); + sz = append_string(context, sp, "%s", p); free(p); - return 0; + return sz; } static char * @@ -105,22 +118,99 @@ return buf; } -static krb5_error_code +static ssize_t append_event(krb5_context context, krb5_storage *sp, Event *ev) { - char *pr = NULL; krb5_error_code ret; + ssize_t sz; + char *pr = NULL; if(ev == NULL) return append_string(context, sp, "- "); if (ev->principal != NULL) { ret = krb5_unparse_name(context, ev->principal, &pr); - if(ret) - return ret; + if (ret) return -1; /* krb5_unparse_name() sets error info */ } - ret = append_string(context, sp, "%s:%s ", - time2str(ev->time), pr ? pr : "UNKNOWN"); + sz = append_string(context, sp, "%s:%s ", time2str(ev->time), + pr ? pr : "UNKNOWN"); free(pr); - return ret; + return sz; +} + +#define KRB5_KDB_SALTTYPE_NORMAL 0 +#define KRB5_KDB_SALTTYPE_V4 1 +#define KRB5_KDB_SALTTYPE_NOREALM 2 +#define KRB5_KDB_SALTTYPE_ONLYREALM 3 +#define KRB5_KDB_SALTTYPE_SPECIAL 4 +#define KRB5_KDB_SALTTYPE_AFS3 5 + +static ssize_t +append_mit_key(krb5_context context, krb5_storage *sp, + krb5_const_principal princ, + unsigned int kvno, Key *key) +{ + krb5_error_code ret; + krb5_salt k5salt; + ssize_t sz; + size_t key_versions = key->salt ? 2 : 1; + size_t decrypted_key_length; + char buf[2]; + krb5_data keylenbytes; + unsigned int salttype; + + sz = append_string(context, sp, "\t%u\t%u\t%d\t%d\t", key_versions, kvno, + key->key.keytype, key->key.keyvalue.length + 2); + if (sz == -1) return sz; + ret = krb5_enctype_keysize(context, key->key.keytype, &decrypted_key_length); + if (ret) return -1; /* XXX we lose the error code */ + buf[0] = decrypted_key_length & 0xff; + buf[1] = (decrypted_key_length & 0xff00) >> 8; + keylenbytes.data = buf; + keylenbytes.length = sizeof (buf); + sz = append_hex(context, sp, 1, 1, &keylenbytes); + if (sz == -1) return sz; + sz = append_hex(context, sp, 1, 1, &key->key.keyvalue); + if (!key->salt) + return sz; + + /* Map salt to MIT KDB style */ + switch (key->salt->type) { + case KRB5_PADATA_PW_SALT: + + /* + * Compute normal salt and then see whether it matches the stored one + */ + ret = krb5_get_pw_salt(context, princ, &k5salt); + if (ret) return -1; + if (k5salt.saltvalue.length == key->salt->salt.length && + memcmp(k5salt.saltvalue.data, key->salt->salt.data, + k5salt.saltvalue.length) == 0) + salttype = KRB5_KDB_SALTTYPE_NORMAL; /* matches */ + else if (key->salt->salt.length == strlen(princ->realm) && + memcmp(key->salt->salt.data, princ->realm, + key->salt->salt.length) == 0) + salttype = KRB5_KDB_SALTTYPE_ONLYREALM; /* matches realm */ + else if (key->salt->salt.length == + k5salt.saltvalue.length - strlen(princ->realm) && + memcmp((char *)k5salt.saltvalue.data + strlen(princ->realm), + key->salt->salt.data, key->salt->salt.length) == 0) + salttype = KRB5_KDB_SALTTYPE_NOREALM; /* matches w/o realm */ + else + salttype = KRB5_KDB_SALTTYPE_NORMAL; /* hope for best */ + + break; + + case KRB5_PADATA_AFS3_SALT: + salttype = KRB5_KDB_SALTTYPE_AFS3; + break; + + default: + return -1; + } + + sz = append_string(context, sp, "\t%u\t%u\t", salttype, + key->salt->salt.length); + if (sz == -1) return sz; + return append_hex(context, sp, 1, 1, &key->salt->salt); } static krb5_error_code @@ -149,12 +239,12 @@ append_string(context, sp, "::%d:", ent->keys.val[i].key.keytype); /* --- keydata */ - append_hex(context, sp, &ent->keys.val[i].key.keyvalue); + append_hex(context, sp, 0, 0, &ent->keys.val[i].key.keyvalue); append_string(context, sp, ":"); /* --- salt */ if(ent->keys.val[i].salt){ append_string(context, sp, "%u/", ent->keys.val[i].salt->type); - append_hex(context, sp, &ent->keys.val[i].salt->salt); + append_hex(context, sp, 0, 0, &ent->keys.val[i].salt->salt); }else append_string(context, sp, "-"); } @@ -234,25 +324,224 @@ } else append_string(context, sp, "-"); + return 0; +} + +#define KRB5_KDB_DISALLOW_POSTDATED 0x00000001 +#define KRB5_KDB_DISALLOW_FORWARDABLE 0x00000002 +#define KRB5_KDB_DISALLOW_TGT_BASED 0x00000004 +#define KRB5_KDB_DISALLOW_RENEWABLE 0x00000008 +#define KRB5_KDB_DISALLOW_PROXIABLE 0x00000010 +#define KRB5_KDB_DISALLOW_DUP_SKEY 0x00000020 +#define KRB5_KDB_DISALLOW_ALL_TIX 0x00000040 +#define KRB5_KDB_REQUIRES_PRE_AUTH 0x00000080 +#define KRB5_KDB_REQUIRES_HW_AUTH 0x00000100 +#define KRB5_KDB_REQUIRES_PWCHANGE 0x00000200 +#define KRB5_KDB_DISALLOW_SVR 0x00001000 +#define KRB5_KDB_PWCHANGE_SERVICE 0x00002000 +#define KRB5_KDB_SUPPORT_DESMD5 0x00004000 +#define KRB5_KDB_NEW_PRINC 0x00008000 + +static int +flags_to_attr(HDBFlags flags) +{ + int a = 0; + + if (!flags.postdate) + a |= KRB5_KDB_DISALLOW_POSTDATED; + if (!flags.forwardable) + a |= KRB5_KDB_DISALLOW_FORWARDABLE; + if (flags.initial) + a |= KRB5_KDB_DISALLOW_TGT_BASED; + if (!flags.renewable) + a |= KRB5_KDB_DISALLOW_RENEWABLE; + if (!flags.proxiable) + a |= KRB5_KDB_DISALLOW_PROXIABLE; + if (flags.invalid) + a |= KRB5_KDB_DISALLOW_ALL_TIX; + if (flags.require_preauth) + a |= KRB5_KDB_REQUIRES_PRE_AUTH; + if (flags.require_hwauth) + a |= KRB5_KDB_REQUIRES_HW_AUTH; + if (!flags.server) + a |= KRB5_KDB_DISALLOW_SVR; + if (flags.change_pw) + a |= KRB5_KDB_PWCHANGE_SERVICE; + return a; +} + +krb5_error_code +entry2mit_string_int(krb5_context context, krb5_storage *sp, hdb_entry *ent) +{ + krb5_error_code ret; + ssize_t sz; + size_t i, k; + size_t num_tl_data = 0; + size_t num_key_data = 0; + char *p; + HDB_Ext_KeySet *hist_keys = NULL; + HDB_extension *extp; + time_t last_pw_chg = 0; + time_t exp = 0; + time_t pwexp = 0; + unsigned int max_life = 0; + unsigned int max_renew = 0; + + if (ent->modified_by) + num_tl_data++; + + ret = hdb_entry_get_pw_change_time(ent, &last_pw_chg); + if (ret) return ret; + if (last_pw_chg) + num_tl_data++; + + extp = hdb_find_extension(ent, choice_HDB_extension_data_hist_keys); + if (extp) + hist_keys = &extp->data.u.hist_keys; + + for (i = 0; i < ent->keys.len;i++) { + if (ent->keys.val[i].key.keytype == ETYPE_DES_CBC_MD4 || + ent->keys.val[i].key.keytype == ETYPE_DES_CBC_MD5) + continue; + num_key_data++; + } + if (hist_keys) { + for (i = 0; i < hist_keys->len; i++) { + /* + * MIT uses the highest kvno as the current kvno instead of + * tracking kvno separately, so we can't dump keysets with kvno + * higher than the entry's kvno. + */ + if (hist_keys->val[i].kvno >= ent->kvno) + continue; + for (k = 0; k < hist_keys->val[i].keys.len; k++) { + if (ent->keys.val[k].key.keytype == ETYPE_DES_CBC_MD4 || + ent->keys.val[k].key.keytype == ETYPE_DES_CBC_MD5) + continue; + num_key_data++; + } + } + } + ret = krb5_unparse_name(context, ent->principal, &p); + if (ret) return ret; + sz = append_string(context, sp, "princ\t38\t%u\t%u\t%u\t0\t%s\t%d", + strlen(p), num_tl_data, num_key_data, p, + flags_to_attr(ent->flags)); + free(p); + if (sz == -1) return ENOMEM; + + if (ent->max_life) + max_life = *ent->max_life; + if (ent->max_renew) + max_renew = *ent->max_renew; + if (ent->valid_end) + exp = *ent->valid_end; + if (ent->pw_end) + pwexp = *ent->pw_end; + + sz = append_string(context, sp, "\t%u\t%u\t%u\t%u\t0\t0\t0", + max_life, max_renew, exp, pwexp); + if (sz == -1) return ENOMEM; + + /* Dump TL data we know: last pw chg and modified_by */ +#define mit_KRB5_TL_LAST_PWD_CHANGE 1 +#define mit_KRB5_TL_MOD_PRINC 2 + if (last_pw_chg) { + krb5_data d; + time_t val; + unsigned char *ptr; + + ptr = (unsigned char *)&last_pw_chg; + val = ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); + d.data = &val; + d.length = sizeof (last_pw_chg); + sz = append_string(context, sp, "\t%u\t%u\t", + mit_KRB5_TL_LAST_PWD_CHANGE, d.length); + if (sz == -1) return ENOMEM; + sz = append_hex(context, sp, 1, 1, &d); + if (sz == -1) return ENOMEM; + } + if (ent->modified_by) { + krb5_data d; + unsigned int val; + size_t plen; + unsigned char *ptr; + char *modby_p; + + ptr = (unsigned char *)&ent->modified_by->time; + val = ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24); + d.data = &val; + d.length = sizeof (ent->modified_by->time); + ret = krb5_unparse_name(context, ent->modified_by->principal, &modby_p); + if (ret) return ret; + plen = strlen(modby_p); + sz = append_string(context, sp, "\t%u\t%u\t", + mit_KRB5_TL_MOD_PRINC, + d.length + plen + 1 /* NULL counted */); + if (sz == -1) return ENOMEM; + sz = append_hex(context, sp, 1, 1, &d); + if (sz == -1) { + free(modby_p); + return ENOMEM; + } + d.data = modby_p; + d.length = plen + 1; + sz = append_hex(context, sp, 1, 1, &d); + free(modby_p); + if (sz == -1) return ENOMEM; + } + /* + * Dump keys (remembering to not include any with kvno higher than + * the entry's because MIT doesn't track entry kvno separately from + * the entry's keys -- max kvno is it) + */ + for (i = 0; i < ent->keys.len; i++) { + if (ent->keys.val[i].key.keytype == ETYPE_DES_CBC_MD4 || + ent->keys.val[i].key.keytype == ETYPE_DES_CBC_MD5) + continue; + sz = append_mit_key(context, sp, ent->principal, ent->kvno, + &ent->keys.val[i]); + if (sz == -1) return ENOMEM; + } + for (i = 0; hist_keys && i < ent->kvno; i++) { + size_t m; + + /* dump historical keys */ + for (k = 0; k < hist_keys->len; k++) { + if (hist_keys->val[k].kvno != ent->kvno - i) + continue; + for (m = 0; m < hist_keys->val[k].keys.len; m++) { + if (ent->keys.val[k].key.keytype == ETYPE_DES_CBC_MD4 || + ent->keys.val[k].key.keytype == ETYPE_DES_CBC_MD5) + continue; + sz = append_mit_key(context, sp, ent->principal, + hist_keys->val[k].kvno, + &hist_keys->val[k].keys.val[m]); + if (sz == -1) return ENOMEM; + } + } + } + sz = append_string(context, sp, "\t-1;"); /* "extra data" */ + if (sz == -1) return ENOMEM; return 0; } krb5_error_code -hdb_entry2string (krb5_context context, hdb_entry *ent, char **str) +hdb_entry2string(krb5_context context, hdb_entry *ent, char **str) { krb5_error_code ret; krb5_data data; krb5_storage *sp; sp = krb5_storage_emem(); - if(sp == NULL) { + if (sp == NULL) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } ret = entry2string_int(context, sp, ent); - if(ret) { + if (ret) { krb5_storage_free(sp); return ret; } @@ -267,22 +556,31 @@ /* print a hdb_entry to (FILE*)data; suitable for hdb_foreach */ krb5_error_code -hdb_print_entry(krb5_context context, HDB *db, hdb_entry_ex *entry, void *data) +hdb_print_entry(krb5_context context, HDB *db, hdb_entry_ex *entry, + void *data) { + struct hdb_print_entry_arg *parg = data; krb5_error_code ret; krb5_storage *sp; - FILE *f = data; - - fflush(f); - sp = krb5_storage_from_fd(fileno(f)); - if(sp == NULL) { + fflush(parg->out); + sp = krb5_storage_from_fd(fileno(parg->out)); + if (sp == NULL) { krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); return ENOMEM; } - ret = entry2string_int(context, sp, &entry->entry); - if(ret) { + switch (parg->fmt) { + case HDB_DUMP_HEIMDAL: + ret = entry2string_int(context, sp, &entry->entry); + break; + case HDB_DUMP_MIT: + ret = entry2mit_string_int(context, sp, &entry->entry); + break; + default: + heim_abort("Only two dump formats supported: Heimdal and MIT"); + } + if (ret) { krb5_storage_free(sp); return ret; } diff --git a/crypto/heimdal/lib/hdb/test_dbinfo.c b/crypto/heimdal/lib/hdb/test_dbinfo.c --- a/crypto/heimdal/lib/hdb/test_dbinfo.c +++ b/crypto/heimdal/lib/hdb/test_dbinfo.c @@ -38,8 +38,8 @@ static int version_flag; struct getargs args[] = { - { "help", 'h', arg_flag, &help_flag }, - { "version", 0, arg_flag, &version_flag } + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } }; static int num_args = sizeof(args) / sizeof(args[0]); diff --git a/crypto/heimdal/lib/hdb/test_hdbkeys.c b/crypto/heimdal/lib/hdb/test_hdbkeys.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hdb/test_hdbkeys.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "hdb_locl.h" +#include +#include + +static int help_flag; +static int version_flag; +static int kvno_integer = 1; + +struct getargs args[] = { + { "kvno", 'd', arg_integer, &kvno_integer, NULL, NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } +}; + +static int num_args = sizeof(args) / sizeof(args[0]); + +int +main(int argc, char **argv) +{ + krb5_principal principal; + krb5_context context; + char *principal_str, *password_str, *str; + int ret, o = 0; + hdb_keyset keyset; + size_t length, len; + void *data; + + setprogname(argv[0]); + + if(getarg(args, num_args, argc, argv, &o)) + krb5_std_usage(1, args, num_args); + + if(help_flag) + krb5_std_usage(0, args, num_args); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + if (argc != 3) + errx(1, "username and password missing"); + + principal_str = argv[1]; + password_str = argv[2]; + + ret = krb5_parse_name (context, principal_str, &principal); + if (ret) + krb5_err (context, 1, ret, "krb5_parse_name %s", principal_str); + + memset(&keyset, 0, sizeof(keyset)); + + keyset.kvno = kvno_integer; + keyset.set_time = malloc(sizeof (*keyset.set_time)); + if (keyset.set_time == NULL) + errx(1, "couldn't allocate set_time field of keyset"); + *keyset.set_time = time(NULL); + + ret = hdb_generate_key_set_password(context, principal, password_str, + &keyset.keys.val, &len); + if (ret) + krb5_err(context, 1, ret, "hdb_generate_key_set_password"); + keyset.keys.len = len; + + if (keyset.keys.len == 0) + krb5_errx (context, 1, "hdb_generate_key_set_password length 0"); + + krb5_free_principal (context, principal); + + ASN1_MALLOC_ENCODE(hdb_keyset, data, length, &keyset, &len, ret); + if (ret) + krb5_errx(context, 1, "encode keyset"); + if (len != length) + krb5_abortx(context, "foo"); + + krb5_free_context(context); + + ret = rk_base64_encode(data, length, &str); + if (ret < 0) + errx(1, "base64_encode"); + + printf("keyset: %s\n", str); + + free(data); + + return 0; +} diff --git a/crypto/heimdal/lib/hdb/test_hdbplugin.c b/crypto/heimdal/lib/hdb/test_hdbplugin.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hdb/test_hdbplugin.c @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2013 Jeffrey Clark + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "hdb_locl.h" + +struct hdb_called { + int create; + int init; + int fini; +}; +struct hdb_called testresult; + +static krb5_error_code +hdb_test_create(krb5_context context, struct HDB **db, const char *arg) +{ + testresult.create = 1; + return 0; +} + +static krb5_error_code +hdb_test_init(krb5_context context, void **ctx) +{ + *ctx = NULL; + testresult.init = 1; + return 0; +} + +static void hdb_test_fini(void *ctx) +{ + testresult.fini = 1; +} + +struct hdb_method hdb_test = +{ +#ifdef WIN32 + /* Not c99 */ + HDB_INTERFACE_VERSION, + hdb_test_init, + hdb_test_fini, + "test", + hdb_test_create +#else + .version = HDB_INTERFACE_VERSION, + .init = hdb_test_init, + .fini = hdb_test_fini, + .prefix = "test", + .create = hdb_test_create +#endif +}; + +int +main(int argc, char **argv) +{ + krb5_error_code ret; + krb5_context context; + HDB *db; + + setprogname(argv[0]); + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_contex"); + + ret = krb5_plugin_register(context, + PLUGIN_TYPE_DATA, "hdb_test_interface", + &hdb_test); + if(ret) { + krb5_err(context, 1, ret, "krb5_plugin_register"); + } + + ret = hdb_create(context, &db, "test:test&1234"); + if(ret) { + krb5_err(context, 1, ret, "hdb_create"); + } + + krb5_free_context(context); + return 0; +} diff --git a/crypto/heimdal/lib/hdb/test_mkey.c b/crypto/heimdal/lib/hdb/test_mkey.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hdb/test_mkey.c @@ -0,0 +1,55 @@ + +#include "hdb_locl.h" +#include +#include + +static char *mkey_file; +static int help_flag; +static int version_flag; + +struct getargs args[] = { + { "mkey-file", 0, arg_string, &mkey_file, NULL, NULL }, + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL } +}; + +static int num_args = sizeof(args) / sizeof(args[0]); + +int +main(int argc, char **argv) +{ + krb5_context context; + int ret, o = 0; + + setprogname(argv[0]); + + if(getarg(args, num_args, argc, argv, &o)) + krb5_std_usage(1, args, num_args); + + if(help_flag) + krb5_std_usage(0, args, num_args); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_context failed: %d", ret); + + if (mkey_file) { + hdb_master_key mkey; + + ret = hdb_read_master_key(context, mkey_file, &mkey); + if (ret) + krb5_err(context, 1, ret, "failed to read master key %s", mkey_file); + + hdb_free_master_key(context, mkey); + } else + krb5_errx(context, 1, "no command option given"); + + krb5_free_context(context); + + return 0; +} diff --git a/crypto/heimdal/lib/hdb/version-script.map b/crypto/heimdal/lib/hdb/version-script.map --- a/crypto/heimdal/lib/hdb/version-script.map +++ b/crypto/heimdal/lib/hdb/version-script.map @@ -4,6 +4,8 @@ global: encode_hdb_keyset; hdb_add_master_key; + hdb_add_current_keys_to_history; + hdb_change_kvno; hdb_check_db_format; hdb_clear_extension; hdb_clear_master_key; @@ -42,21 +44,25 @@ hdb_free_master_key; hdb_generate_key_set; hdb_generate_key_set_password; + hdb_generate_key_set_password_with_ks_tuple; hdb_get_dbinfo; hdb_init_db; hdb_key2principal; + hdb_kvno2keys; hdb_list_builtin; hdb_lock; hdb_next_enctype2key; hdb_principal2key; hdb_print_entry; hdb_process_master_key; + hdb_prune_keys; hdb_read_master_key; hdb_replace_extension; hdb_seal_key; hdb_seal_key_mkey; hdb_seal_keys; hdb_seal_keys_mkey; + hdb_set_last_modified_by; hdb_set_master_key; hdb_set_master_keyfile; hdb_unlock; @@ -71,36 +77,52 @@ hdb_interface_version; initialize_hdb_error_table_r; + # MIT KDB related entries + _hdb_mdb_value2entry; + _hdb_mit_dump2mitdb_entry; + hdb_kt_ops; + hdb_get_kt_ops; # some random bits needed for libkadm - HDBFlags2int; + add_HDB_Ext_KeySet; + add_Keys; asn1_HDBFlags_units; copy_Event; copy_HDB_extensions; copy_Key; + copy_Keys; copy_Salt; decode_HDB_Ext_Aliases; - decode_HDB_Ext_PKINIT_acl; decode_HDB_extension; + decode_HDB_Ext_PKINIT_acl; decode_Key; + decode_Keys; encode_HDB_Ext_Aliases; - encode_HDB_Ext_PKINIT_acl; encode_HDB_extension; + encode_HDB_Ext_PKINIT_acl; encode_Key; + encode_Keys; free_Event; + free_hdb_entry; free_HDB_Ext_Aliases; - free_HDB_Ext_PKINIT_acl; free_HDB_extension; free_HDB_extensions; + free_HDB_Ext_PKINIT_acl; + free_hdb_keyset; free_Key; + free_Keys; free_Salt; - free_hdb_entry; + HDBFlags2int; int2HDBFlags; length_HDB_Ext_Aliases; - length_HDB_Ext_PKINIT_acl; length_HDB_extension; + length_HDB_Ext_PKINIT_acl; length_Key; + length_Keys; + remove_Keys; + add_Keys; + add_HDB_Ext_KeySet; local: *; diff --git a/crypto/heimdal/lib/heimdal/NTMakefile b/crypto/heimdal/lib/heimdal/NTMakefile --- a/crypto/heimdal/lib/heimdal/NTMakefile +++ b/crypto/heimdal/lib/heimdal/NTMakefile @@ -54,6 +54,11 @@ dnsapi.lib \ shlwapi.lib +dlllflags=$(dlllflags) /DELAYLOAD:bcrypt.dll +DLLSDKDEPS=$(DLLSDKDEPS)\ + bcrypt.lib \ + delayimp.lib + DEF=$(OBJ)\heimdal.def RES=$(OBJ)\heimdal-version.res @@ -88,6 +93,3 @@ !endif all:: $(LIBHEIMDAL) - -clean:: - -$(RM) $(LIBHEIMDAL) diff --git a/crypto/heimdal/lib/heimdal/dllmain.c b/crypto/heimdal/lib/heimdal/dllmain.c deleted file mode 100644 --- a/crypto/heimdal/lib/heimdal/dllmain.c +++ /dev/null @@ -1,40 +0,0 @@ -/*********************************************************************** - * Copyright (c) 2009, Secure Endpoints Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - **********************************************************************/ - -#include - -BOOL WINAPI -DllMain(__in HINSTANCE hinstDLL, - __in DWORD fdwReason, - __in LPVOID lpvReserved) -{ - return TRUE; -} diff --git a/crypto/heimdal/lib/hx509/Makefile.am b/crypto/heimdal/lib/hx509/Makefile.am --- a/crypto/heimdal/lib/hx509/Makefile.am +++ b/crypto/heimdal/lib/hx509/Makefile.am @@ -1,5 +1,7 @@ include $(top_srcdir)/Makefile.am.common +AM_CPPFLAGS += $(INCLUDE_openssl_crypto) + lib_LTLIBRARIES = libhx509.la libhx509_la_LDFLAGS = -version-info 5:0:0 @@ -58,12 +60,11 @@ cms.c \ collector.c \ crypto.c \ + crypto-ec.c \ doxygen.c \ error.c \ env.c \ file.c \ - hx509-private.h \ - hx509-protos.h \ hx509.h \ hx_locl.h \ sel.c \ @@ -94,8 +95,10 @@ libhx509_la_LIBADD = \ $(LIB_com_err) \ $(LIB_hcrypto) \ + $(LIB_openssl_crypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/wind/libwind.la \ + $(top_builddir)/lib/base/libheimbase.la \ $(LIBADD_roken) \ $(LIB_dlopen) @@ -108,14 +111,15 @@ endif $(libhx509_la_OBJECTS): $(srcdir)/version-script.map $(nodist_include_HEADERS) $(priv_headers) -libhx509_la_CPPFLAGS = -I$(srcdir)/ref $(INCLUDE_hcrypto) nodist_libhx509_la_SOURCES = $(BUILT_SOURCES) $(gen_files_ocsp) ocsp_asn1.hx ocsp_asn1-priv.hx: ocsp_asn1_files $(gen_files_pkcs10) pkcs10_asn1.hx pkcs10_asn1-priv.hx: pkcs10_asn1_files $(gen_files_crmf) crmf_asn1.hx crmf_asn1-priv.hx: crmf_asn1_files -dist_include_HEADERS = hx509.h hx509-protos.h +dist_include_HEADERS = hx509.h $(srcdir)/hx509-protos.h + +noinst_HEADERS = $(srcdir)/hx509-private.h nodist_include_HEADERS = hx509_err.h nodist_include_HEADERS += ocsp_asn1.h @@ -128,34 +132,40 @@ ocsp_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/ocsp.asn1 $(srcdir)/ocsp.opt - $(ASN1_COMPILE) --option-file=$(srcdir)/ocsp.opt $(srcdir)/ocsp.asn1 ocsp_asn1 || (rm -f ocsp_asn1_files ; exit 1) + $(heim_verbose)$(ASN1_COMPILE) --option-file=$(srcdir)/ocsp.opt $(srcdir)/ocsp.asn1 ocsp_asn1 || (rm -f ocsp_asn1_files ; exit 1) pkcs10_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/pkcs10.asn1 $(srcdir)/pkcs10.opt - $(ASN1_COMPILE) --option-file=$(srcdir)/pkcs10.opt $(srcdir)/pkcs10.asn1 pkcs10_asn1 || (rm -f pkcs10_asn1_files ; exit 1) + $(heim_verbose)$(ASN1_COMPILE) --option-file=$(srcdir)/pkcs10.opt $(srcdir)/pkcs10.asn1 pkcs10_asn1 || (rm -f pkcs10_asn1_files ; exit 1) crmf_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/crmf.asn1 - $(ASN1_COMPILE) $(srcdir)/crmf.asn1 crmf_asn1 || (rm -f crmf_asn1_files ; exit 1) + $(heim_verbose)$(ASN1_COMPILE) $(srcdir)/crmf.asn1 crmf_asn1 || (rm -f crmf_asn1_files ; exit 1) + +ALL_OBJECTS = $(libhx509_la_OBJECTS) +ALL_OBJECTS += $(hxtool_OBJECTS) + +HX509_PROTOS = $(srcdir)/hx509-protos.h $(srcdir)/hx509-private.h + +$(ALL_OBJECTS): $(HX509_PROTOS) -$(libhx509_la_OBJECTS): $(srcdir)/hx509-protos.h $(srcdir)/hx509-private.h $(srcdir)/hx_locl.h +$(libhx509_la_OBJECTS): $(srcdir)/hx_locl.h $(libhx509_la_OBJECTS): ocsp_asn1.h pkcs10_asn1.h -$(srcdir)/hx509-protos.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -R '^(_|^C)' -E HX509_LIB -q -P comment -o hx509-protos.h $(dist_libhx509_la_SOURCES) || rm -f hx509-protos.h +$(srcdir)/hx509-protos.h: $(dist_libhx509_la_SOURCES) + $(heim_verbose)cd $(srcdir) && perl ../../cf/make-proto.pl -R '^(_|^C)' -E HX509_LIB -q -P comment -o hx509-protos.h $(dist_libhx509_la_SOURCES) || rm -f hx509-protos.h -$(srcdir)/hx509-private.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p hx509-private.h $(dist_libhx509_la_SOURCES) || rm -f hx509-private.h +$(srcdir)/hx509-private.h: $(dist_libhx509_la_SOURCES) + $(heim_verbose)cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p hx509-private.h $(dist_libhx509_la_SOURCES) || rm -f hx509-private.h bin_PROGRAMS = hxtool hxtool-commands.c hxtool-commands.h: hxtool-commands.in $(SLC) - $(SLC) $(srcdir)/hxtool-commands.in + $(heim_verbose)$(SLC) $(srcdir)/hxtool-commands.in dist_hxtool_SOURCES = hxtool.c nodist_hxtool_SOURCES = hxtool-commands.c hxtool-commands.h -$(hxtool_OBJECTS): hxtool-commands.h +$(hxtool_OBJECTS): hxtool-commands.h $(nodist_include_HEADERS) -hxtool_CPPFLAGS = $(INCLUDE_hcrypto) hxtool_LDADD = \ libhx509.la \ $(top_builddir)/lib/asn1/libasn1.la \ @@ -165,11 +175,11 @@ CLEANFILES = $(BUILT_SOURCES) sel-gram.c sel-lex.c \ $(gen_files_ocsp) ocsp_asn1_files ocsp_asn1{,-priv}.h* \ - ocsp_asn1-template.[ch]* \ + ocsp_asn1-template.[chx]* \ $(gen_files_pkcs10) pkcs10_asn1_files pkcs10_asn1{,-priv}.h* \ - pkcs10_asn1-template.[ch]* \ + pkcs10_asn1-template.[chx]* \ $(gen_files_crmf) crmf_asn1_files crmf_asn1{,-priv}.h* \ - crmf_asn1-template.[ch]* \ + crmf_asn1-template.[chx]* \ $(TESTS) \ hxtool-commands.c hxtool-commands.h *.tmp \ request.out \ @@ -198,11 +208,10 @@ LDADD = libhx509.la -test_soft_pkcs11_LDADD = libhx509.la -test_soft_pkcs11_CPPFLAGS = -I$(srcdir)/ref +test_soft_pkcs11_LDADD = libhx509.la $(top_builddir)/lib/asn1/libasn1.la -test_name_CPPFLAGS = $(INCLUDE_hcrypto) -test_name_LDADD = libhx509.la $(LIB_roken) +test_name_LDADD = libhx509.la $(LIB_roken) $(top_builddir)/lib/asn1/libasn1.la +test_expr_LDADD = libhx509.la $(LIB_roken) $(top_builddir)/lib/asn1/libasn1.la TESTS = $(SCRIPT_TESTS) $(PROGRAM_TESTS) @@ -226,78 +235,78 @@ test_windows \ test_query -do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ +do_subst = $(heim_verbose)sed -e 's,[@]srcdir[@],$(srcdir),g' \ -e 's,[@]objdir[@],$(top_builddir)/lib/hx509,g' \ -e 's,[@]egrep[@],$(EGREP),g' test_ca: test_ca.in Makefile $(do_subst) < $(srcdir)/test_ca.in > test_ca.tmp - chmod +x test_ca.tmp + $(heim_verbose)chmod +x test_ca.tmp mv test_ca.tmp test_ca test_cert: test_cert.in Makefile $(do_subst) < $(srcdir)/test_cert.in > test_cert.tmp - chmod +x test_cert.tmp + $(heim_verbose)chmod +x test_cert.tmp mv test_cert.tmp test_cert test_chain: test_chain.in Makefile $(do_subst) < $(srcdir)/test_chain.in > test_chain.tmp - chmod +x test_chain.tmp + $(heim_verbose)chmod +x test_chain.tmp mv test_chain.tmp test_chain test_cms: test_cms.in Makefile $(do_subst) < $(srcdir)/test_cms.in > test_cms.tmp - chmod +x test_cms.tmp + $(heim_verbose)chmod +x test_cms.tmp mv test_cms.tmp test_cms test_crypto: test_crypto.in Makefile $(do_subst) < $(srcdir)/test_crypto.in > test_crypto.tmp - chmod +x test_crypto.tmp + $(heim_verbose)chmod +x test_crypto.tmp mv test_crypto.tmp test_crypto test_nist: test_nist.in Makefile $(do_subst) < $(srcdir)/test_nist.in > test_nist.tmp - chmod +x test_nist.tmp + $(heim_verbose)chmod +x test_nist.tmp mv test_nist.tmp test_nist test_nist2: test_nist2.in Makefile $(do_subst) < $(srcdir)/test_nist2.in > test_nist2.tmp - chmod +x test_nist2.tmp + $(heim_verbose)chmod +x test_nist2.tmp mv test_nist2.tmp test_nist2 test_pkcs11: test_pkcs11.in Makefile $(do_subst) < $(srcdir)/test_pkcs11.in > test_pkcs11.tmp - chmod +x test_pkcs11.tmp + $(heim_verbose)chmod +x test_pkcs11.tmp mv test_pkcs11.tmp test_pkcs11 test_java_pkcs11: test_java_pkcs11.in Makefile $(do_subst) < $(srcdir)/test_java_pkcs11.in > test_java_pkcs11.tmp - chmod +x test_java_pkcs11.tmp + $(heim_verbose)chmod +x test_java_pkcs11.tmp mv test_java_pkcs11.tmp test_java_pkcs11 test_nist_cert: test_nist_cert.in Makefile $(do_subst) < $(srcdir)/test_nist_cert.in > test_nist_cert.tmp - chmod +x test_nist_cert.tmp + $(heim_verbose)chmod +x test_nist_cert.tmp mv test_nist_cert.tmp test_nist_cert test_nist_pkcs12: test_nist_pkcs12.in Makefile $(do_subst) < $(srcdir)/test_nist_pkcs12.in > test_nist_pkcs12.tmp - chmod +x test_nist_pkcs12.tmp + $(heim_verbose)chmod +x test_nist_pkcs12.tmp mv test_nist_pkcs12.tmp test_nist_pkcs12 test_req: test_req.in Makefile $(do_subst) < $(srcdir)/test_req.in > test_req.tmp - chmod +x test_req.tmp + $(heim_verbose)chmod +x test_req.tmp mv test_req.tmp test_req test_windows: test_windows.in Makefile $(do_subst) < $(srcdir)/test_windows.in > test_windows.tmp - chmod +x test_windows.tmp + $(heim_verbose)chmod +x test_windows.tmp mv test_windows.tmp test_windows test_query: test_query.in Makefile $(do_subst) < $(srcdir)/test_query.in > test_query.tmp - chmod +x test_query.tmp + $(heim_verbose)chmod +x test_query.tmp mv test_query.tmp test_query EXTRA_DIST = \ @@ -338,16 +347,22 @@ tst-crypto-select5 \ tst-crypto-select6 \ tst-crypto-select7 \ + data/PKITS_data.zip \ + data/eccurve.pem \ + data/https.crt \ + data/https.key \ + data/mkcert.sh \ + data/nist-result2 \ data/n0ll.pem \ - data/secp160r1TestCA.cert.pem \ - data/secp160r1TestCA.key.pem \ - data/secp160r1TestCA.pem \ - data/secp160r2TestClient.cert.pem \ - data/secp160r2TestClient.key.pem \ - data/secp160r2TestClient.pem \ - data/secp160r2TestServer.cert.pem \ - data/secp160r2TestServer.key.pem \ - data/secp160r2TestServer.pem \ + data/secp256r1TestCA.cert.pem \ + data/secp256r1TestCA.key.pem \ + data/secp256r1TestCA.pem \ + data/secp256r2TestClient.cert.pem \ + data/secp256r2TestClient.key.pem \ + data/secp256r2TestClient.pem \ + data/secp256r2TestServer.cert.pem \ + data/secp256r2TestServer.key.pem \ + data/secp256r2TestServer.pem \ data/bleichenbacher-bad.pem \ data/bleichenbacher-good.pem \ data/bleichenbacher-sf-pad-correct.pem \ @@ -377,7 +392,8 @@ data/ocsp-resp2.der \ data/ocsp-responder.crt \ data/ocsp-responder.key \ - data/openssl.cnf \ + data/openssl.1.0.cnf \ + data/openssl.1.1.cnf \ data/pkinit-proxy-chain.crt \ data/pkinit-proxy.crt \ data/pkinit-proxy.key \ diff --git a/crypto/heimdal/lib/hx509/Makefile.in b/crypto/heimdal/lib/hx509/Makefile.in --- a/crypto/heimdal/lib/hx509/Makefile.in +++ b/crypto/heimdal/lib/hx509/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,10 +94,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(dist_include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog TODO sel-gram.c \ - sel-gram.h sel-lex.c @FRAMEWORK_SECURITY_TRUE@am__append_1 = -framework Security -framework CoreFoundation @versionscript_TRUE@am__append_2 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map bin_PROGRAMS = hxtool$(EXEEXT) @@ -53,7 +103,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -64,8 +113,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -78,6 +126,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -97,10 +146,16 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_include_HEADERS) \ + $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" +am__EXEEXT_1 = test_name$(EXEEXT) test_expr$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -122,106 +177,366 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = -dist_libhx509_la_OBJECTS = libhx509_la-ca.lo libhx509_la-cert.lo \ - libhx509_la-cms.lo libhx509_la-collector.lo \ - libhx509_la-crypto.lo libhx509_la-doxygen.lo \ - libhx509_la-error.lo libhx509_la-env.lo libhx509_la-file.lo \ - libhx509_la-sel.lo libhx509_la-sel-gram.lo \ - libhx509_la-sel-lex.lo libhx509_la-keyset.lo \ - libhx509_la-ks_dir.lo libhx509_la-ks_file.lo \ - libhx509_la-ks_mem.lo libhx509_la-ks_null.lo \ - libhx509_la-ks_p11.lo libhx509_la-ks_p12.lo \ - libhx509_la-ks_keychain.lo libhx509_la-lock.lo \ - libhx509_la-name.lo libhx509_la-peer.lo libhx509_la-print.lo \ - libhx509_la-softp11.lo libhx509_la-req.lo \ - libhx509_la-revoke.lo -am__objects_1 = libhx509_la-asn1_OCSPBasicOCSPResponse.lo \ - libhx509_la-asn1_OCSPCertID.lo \ - libhx509_la-asn1_OCSPCertStatus.lo \ - libhx509_la-asn1_OCSPInnerRequest.lo \ - libhx509_la-asn1_OCSPKeyHash.lo \ - libhx509_la-asn1_OCSPRequest.lo \ - libhx509_la-asn1_OCSPResponderID.lo \ - libhx509_la-asn1_OCSPResponse.lo \ - libhx509_la-asn1_OCSPResponseBytes.lo \ - libhx509_la-asn1_OCSPResponseData.lo \ - libhx509_la-asn1_OCSPResponseStatus.lo \ - libhx509_la-asn1_OCSPSignature.lo \ - libhx509_la-asn1_OCSPSingleResponse.lo \ - libhx509_la-asn1_OCSPTBSRequest.lo \ - libhx509_la-asn1_OCSPVersion.lo \ - libhx509_la-asn1_id_pkix_ocsp.lo \ - libhx509_la-asn1_id_pkix_ocsp_basic.lo \ - libhx509_la-asn1_id_pkix_ocsp_nonce.lo -am__objects_2 = libhx509_la-asn1_CertificationRequestInfo.lo \ - libhx509_la-asn1_CertificationRequest.lo -am__objects_3 = $(am__objects_1) $(am__objects_2) \ - libhx509_la-hx509_err.lo +dist_libhx509_la_OBJECTS = ca.lo cert.lo cms.lo collector.lo crypto.lo \ + crypto-ec.lo doxygen.lo error.lo env.lo file.lo sel.lo \ + sel-gram.lo sel-lex.lo keyset.lo ks_dir.lo ks_file.lo \ + ks_mem.lo ks_null.lo ks_p11.lo ks_p12.lo ks_keychain.lo \ + lock.lo name.lo peer.lo print.lo softp11.lo req.lo revoke.lo +am__objects_1 = asn1_OCSPBasicOCSPResponse.lo asn1_OCSPCertID.lo \ + asn1_OCSPCertStatus.lo asn1_OCSPInnerRequest.lo \ + asn1_OCSPKeyHash.lo asn1_OCSPRequest.lo \ + asn1_OCSPResponderID.lo asn1_OCSPResponse.lo \ + asn1_OCSPResponseBytes.lo asn1_OCSPResponseData.lo \ + asn1_OCSPResponseStatus.lo asn1_OCSPSignature.lo \ + asn1_OCSPSingleResponse.lo asn1_OCSPTBSRequest.lo \ + asn1_OCSPVersion.lo asn1_id_pkix_ocsp.lo \ + asn1_id_pkix_ocsp_basic.lo asn1_id_pkix_ocsp_nonce.lo +am__objects_2 = asn1_CertificationRequestInfo.lo \ + asn1_CertificationRequest.lo +am__objects_3 = $(am__objects_1) $(am__objects_2) hx509_err.lo nodist_libhx509_la_OBJECTS = $(am__objects_3) libhx509_la_OBJECTS = $(dist_libhx509_la_OBJECTS) \ $(nodist_libhx509_la_OBJECTS) -libhx509_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libhx509_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libhx509_la_LDFLAGS) $(LDFLAGS) -o $@ -am__EXEEXT_1 = test_name$(EXEEXT) test_expr$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) -dist_hxtool_OBJECTS = hxtool-hxtool.$(OBJEXT) -nodist_hxtool_OBJECTS = hxtool-hxtool-commands.$(OBJEXT) +dist_hxtool_OBJECTS = hxtool.$(OBJEXT) +nodist_hxtool_OBJECTS = hxtool-commands.$(OBJEXT) hxtool_OBJECTS = $(dist_hxtool_OBJECTS) $(nodist_hxtool_OBJECTS) hxtool_DEPENDENCIES = libhx509.la $(top_builddir)/lib/asn1/libasn1.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/sl/libsl.la test_expr_SOURCES = test_expr.c test_expr_OBJECTS = test_expr.$(OBJEXT) -test_expr_LDADD = $(LDADD) -test_expr_DEPENDENCIES = libhx509.la +test_expr_DEPENDENCIES = libhx509.la $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/asn1/libasn1.la test_name_SOURCES = test_name.c -test_name_OBJECTS = test_name-test_name.$(OBJEXT) -test_name_DEPENDENCIES = libhx509.la $(am__DEPENDENCIES_1) +test_name_OBJECTS = test_name.$(OBJEXT) +test_name_DEPENDENCIES = libhx509.la $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/asn1/libasn1.la test_soft_pkcs11_SOURCES = test_soft_pkcs11.c -test_soft_pkcs11_OBJECTS = \ - test_soft_pkcs11-test_soft_pkcs11.$(OBJEXT) -test_soft_pkcs11_DEPENDENCIES = libhx509.la +test_soft_pkcs11_OBJECTS = test_soft_pkcs11.$(OBJEXT) +test_soft_pkcs11_DEPENDENCIES = libhx509.la \ + $(top_builddir)/lib/asn1/libasn1.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/asn1_CertificationRequest.Plo \ + ./$(DEPDIR)/asn1_CertificationRequestInfo.Plo \ + ./$(DEPDIR)/asn1_OCSPBasicOCSPResponse.Plo \ + ./$(DEPDIR)/asn1_OCSPCertID.Plo \ + ./$(DEPDIR)/asn1_OCSPCertStatus.Plo \ + ./$(DEPDIR)/asn1_OCSPInnerRequest.Plo \ + ./$(DEPDIR)/asn1_OCSPKeyHash.Plo \ + ./$(DEPDIR)/asn1_OCSPRequest.Plo \ + ./$(DEPDIR)/asn1_OCSPResponderID.Plo \ + ./$(DEPDIR)/asn1_OCSPResponse.Plo \ + ./$(DEPDIR)/asn1_OCSPResponseBytes.Plo \ + ./$(DEPDIR)/asn1_OCSPResponseData.Plo \ + ./$(DEPDIR)/asn1_OCSPResponseStatus.Plo \ + ./$(DEPDIR)/asn1_OCSPSignature.Plo \ + ./$(DEPDIR)/asn1_OCSPSingleResponse.Plo \ + ./$(DEPDIR)/asn1_OCSPTBSRequest.Plo \ + ./$(DEPDIR)/asn1_OCSPVersion.Plo \ + ./$(DEPDIR)/asn1_id_pkix_ocsp.Plo \ + ./$(DEPDIR)/asn1_id_pkix_ocsp_basic.Plo \ + ./$(DEPDIR)/asn1_id_pkix_ocsp_nonce.Plo ./$(DEPDIR)/ca.Plo \ + ./$(DEPDIR)/cert.Plo ./$(DEPDIR)/cms.Plo \ + ./$(DEPDIR)/collector.Plo ./$(DEPDIR)/crypto-ec.Plo \ + ./$(DEPDIR)/crypto.Plo ./$(DEPDIR)/doxygen.Plo \ + ./$(DEPDIR)/env.Plo ./$(DEPDIR)/error.Plo ./$(DEPDIR)/file.Plo \ + ./$(DEPDIR)/hx509_err.Plo ./$(DEPDIR)/hxtool-commands.Po \ + ./$(DEPDIR)/hxtool.Po ./$(DEPDIR)/keyset.Plo \ + ./$(DEPDIR)/ks_dir.Plo ./$(DEPDIR)/ks_file.Plo \ + ./$(DEPDIR)/ks_keychain.Plo ./$(DEPDIR)/ks_mem.Plo \ + ./$(DEPDIR)/ks_null.Plo ./$(DEPDIR)/ks_p11.Plo \ + ./$(DEPDIR)/ks_p12.Plo ./$(DEPDIR)/lock.Plo \ + ./$(DEPDIR)/name.Plo ./$(DEPDIR)/peer.Plo \ + ./$(DEPDIR)/print.Plo ./$(DEPDIR)/req.Plo \ + ./$(DEPDIR)/revoke.Plo ./$(DEPDIR)/sel-gram.Plo \ + ./$(DEPDIR)/sel-lex.Plo ./$(DEPDIR)/sel.Plo \ + ./$(DEPDIR)/softp11.Plo ./$(DEPDIR)/test_expr.Po \ + ./$(DEPDIR)/test_name.Po ./$(DEPDIR)/test_soft_pkcs11.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) +AM_V_LEX = $(am__v_LEX_@AM_V@) +am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) +am__v_LEX_0 = @echo " LEX " $@; +am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ + -e s/c++$$/h++/ -e s/c$$/h/ +YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) +AM_V_YACC = $(am__v_YACC_@AM_V@) +am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) +am__v_YACC_0 = @echo " YACC " $@; +am__v_YACC_1 = SOURCES = $(dist_libhx509_la_SOURCES) $(nodist_libhx509_la_SOURCES) \ $(dist_hxtool_SOURCES) $(nodist_hxtool_SOURCES) test_expr.c \ test_name.c test_soft_pkcs11.c DIST_SOURCES = $(dist_libhx509_la_SOURCES) $(dist_hxtool_SOURCES) \ test_expr.c test_name.c test_soft_pkcs11.c -HEADERS = $(dist_include_HEADERS) $(nodist_include_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(dist_include_HEADERS) $(nodist_include_HEADERS) \ + $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver $(top_srcdir)/ylwrap ChangeLog TODO \ + sel-gram.c sel-gram.h sel-lex.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -236,16 +551,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -255,17 +573,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -284,12 +604,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -298,6 +615,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -314,10 +632,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -325,6 +641,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -339,12 +656,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -361,10 +681,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -375,13 +701,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -405,6 +725,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -428,9 +750,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -440,29 +767,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) +AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_openssl_crypto) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; lib_LTLIBRARIES = libhx509.la libhx509_la_LDFLAGS = -version-info 5:0:0 $(am__append_1) \ $(am__append_2) @@ -520,12 +855,11 @@ cms.c \ collector.c \ crypto.c \ + crypto-ec.c \ doxygen.c \ error.c \ env.c \ file.c \ - hx509-private.h \ - hx509-protos.h \ hx509.h \ hx_locl.h \ sel.c \ @@ -553,20 +887,23 @@ libhx509_la_LIBADD = \ $(LIB_com_err) \ $(LIB_hcrypto) \ + $(LIB_openssl_crypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/wind/libwind.la \ + $(top_builddir)/lib/base/libheimbase.la \ $(LIBADD_roken) \ $(LIB_dlopen) -libhx509_la_CPPFLAGS = -I$(srcdir)/ref $(INCLUDE_hcrypto) nodist_libhx509_la_SOURCES = $(BUILT_SOURCES) -dist_include_HEADERS = hx509.h hx509-protos.h +dist_include_HEADERS = hx509.h $(srcdir)/hx509-protos.h +noinst_HEADERS = $(srcdir)/hx509-private.h nodist_include_HEADERS = hx509_err.h ocsp_asn1.h pkcs10_asn1.h \ crmf_asn1.h priv_headers = ocsp_asn1-priv.h pkcs10_asn1-priv.h crmf_asn1-priv.h +ALL_OBJECTS = $(libhx509_la_OBJECTS) $(hxtool_OBJECTS) +HX509_PROTOS = $(srcdir)/hx509-protos.h $(srcdir)/hx509-private.h dist_hxtool_SOURCES = hxtool.c nodist_hxtool_SOURCES = hxtool-commands.c hxtool-commands.h -hxtool_CPPFLAGS = $(INCLUDE_hcrypto) hxtool_LDADD = \ libhx509.la \ $(top_builddir)/lib/asn1/libasn1.la \ @@ -576,11 +913,11 @@ CLEANFILES = $(BUILT_SOURCES) sel-gram.c sel-lex.c \ $(gen_files_ocsp) ocsp_asn1_files ocsp_asn1{,-priv}.h* \ - ocsp_asn1-template.[ch]* \ + ocsp_asn1-template.[chx]* \ $(gen_files_pkcs10) pkcs10_asn1_files pkcs10_asn1{,-priv}.h* \ - pkcs10_asn1-template.[ch]* \ + pkcs10_asn1-template.[chx]* \ $(gen_files_crmf) crmf_asn1_files crmf_asn1{,-priv}.h* \ - crmf_asn1-template.[ch]* \ + crmf_asn1-template.[chx]* \ $(TESTS) \ hxtool-commands.c hxtool-commands.h *.tmp \ request.out \ @@ -603,10 +940,9 @@ # check_SCRIPTS = $(SCRIPT_TESTS) LDADD = libhx509.la -test_soft_pkcs11_LDADD = libhx509.la -test_soft_pkcs11_CPPFLAGS = -I$(srcdir)/ref -test_name_CPPFLAGS = $(INCLUDE_hcrypto) -test_name_LDADD = libhx509.la $(LIB_roken) +test_soft_pkcs11_LDADD = libhx509.la $(top_builddir)/lib/asn1/libasn1.la +test_name_LDADD = libhx509.la $(LIB_roken) $(top_builddir)/lib/asn1/libasn1.la +test_expr_LDADD = libhx509.la $(LIB_roken) $(top_builddir)/lib/asn1/libasn1.la PROGRAM_TESTS = \ test_name \ test_expr @@ -627,7 +963,7 @@ test_windows \ test_query -do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ +do_subst = $(heim_verbose)sed -e 's,[@]srcdir[@],$(srcdir),g' \ -e 's,[@]objdir[@],$(top_builddir)/lib/hx509,g' \ -e 's,[@]egrep[@],$(EGREP),g' @@ -669,16 +1005,22 @@ tst-crypto-select5 \ tst-crypto-select6 \ tst-crypto-select7 \ + data/PKITS_data.zip \ + data/eccurve.pem \ + data/https.crt \ + data/https.key \ + data/mkcert.sh \ + data/nist-result2 \ data/n0ll.pem \ - data/secp160r1TestCA.cert.pem \ - data/secp160r1TestCA.key.pem \ - data/secp160r1TestCA.pem \ - data/secp160r2TestClient.cert.pem \ - data/secp160r2TestClient.key.pem \ - data/secp160r2TestClient.pem \ - data/secp160r2TestServer.cert.pem \ - data/secp160r2TestServer.key.pem \ - data/secp160r2TestServer.pem \ + data/secp256r1TestCA.cert.pem \ + data/secp256r1TestCA.key.pem \ + data/secp256r1TestCA.pem \ + data/secp256r2TestClient.cert.pem \ + data/secp256r2TestClient.key.pem \ + data/secp256r2TestClient.pem \ + data/secp256r2TestServer.cert.pem \ + data/secp256r2TestServer.key.pem \ + data/secp256r2TestServer.pem \ data/bleichenbacher-bad.pem \ data/bleichenbacher-good.pem \ data/bleichenbacher-sf-pad-correct.pem \ @@ -708,7 +1050,8 @@ data/ocsp-resp2.der \ data/ocsp-responder.crt \ data/ocsp-responder.key \ - data/openssl.cnf \ + data/openssl.1.0.cnf \ + data/openssl.1.1.cnf \ data/pkinit-proxy-chain.crt \ data/pkinit-proxy.crt \ data/pkinit-proxy.key \ @@ -770,7 +1113,7 @@ $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .l .lo .o .obj .y +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .l .lo .log .o .obj .test .test$(EXEEXT) .trs .y $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -783,15 +1126,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/hx509/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/hx509/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -801,54 +1144,21 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -sel-gram.h: sel-gram.c - @if test ! -f $@; then \ - rm -f sel-gram.c; \ - $(MAKE) $(AM_MAKEFLAGS) sel-gram.c; \ - else :; fi -libhx509.la: $(libhx509_la_OBJECTS) $(libhx509_la_DEPENDENCIES) - $(libhx509_la_LINK) -rpath $(libdir) $(libhx509_la_OBJECTS) $(libhx509_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -869,7 +1179,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -891,18 +1202,63 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -hxtool$(EXEEXT): $(hxtool_OBJECTS) $(hxtool_DEPENDENCIES) + +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}; \ + } +sel-gram.h: sel-gram.c + @if test ! -f $@; then rm -f sel-gram.c; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) sel-gram.c; else :; fi + +libhx509.la: $(libhx509_la_OBJECTS) $(libhx509_la_DEPENDENCIES) $(EXTRA_libhx509_la_DEPENDENCIES) + $(AM_V_CCLD)$(libhx509_la_LINK) -rpath $(libdir) $(libhx509_la_OBJECTS) $(libhx509_la_LIBADD) $(LIBS) + +hxtool$(EXEEXT): $(hxtool_OBJECTS) $(hxtool_DEPENDENCIES) $(EXTRA_hxtool_DEPENDENCIES) @rm -f hxtool$(EXEEXT) - $(LINK) $(hxtool_OBJECTS) $(hxtool_LDADD) $(LIBS) -test_expr$(EXEEXT): $(test_expr_OBJECTS) $(test_expr_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(hxtool_OBJECTS) $(hxtool_LDADD) $(LIBS) + +test_expr$(EXEEXT): $(test_expr_OBJECTS) $(test_expr_DEPENDENCIES) $(EXTRA_test_expr_DEPENDENCIES) @rm -f test_expr$(EXEEXT) - $(LINK) $(test_expr_OBJECTS) $(test_expr_LDADD) $(LIBS) -test_name$(EXEEXT): $(test_name_OBJECTS) $(test_name_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_expr_OBJECTS) $(test_expr_LDADD) $(LIBS) + +test_name$(EXEEXT): $(test_name_OBJECTS) $(test_name_DEPENDENCIES) $(EXTRA_test_name_DEPENDENCIES) @rm -f test_name$(EXEEXT) - $(LINK) $(test_name_OBJECTS) $(test_name_LDADD) $(LIBS) -test_soft_pkcs11$(EXEEXT): $(test_soft_pkcs11_OBJECTS) $(test_soft_pkcs11_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_name_OBJECTS) $(test_name_LDADD) $(LIBS) + +test_soft_pkcs11$(EXEEXT): $(test_soft_pkcs11_OBJECTS) $(test_soft_pkcs11_DEPENDENCIES) $(EXTRA_test_soft_pkcs11_DEPENDENCIES) @rm -f test_soft_pkcs11$(EXEEXT) - $(LINK) $(test_soft_pkcs11_OBJECTS) $(test_soft_pkcs11_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_soft_pkcs11_OBJECTS) $(test_soft_pkcs11_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -910,478 +1266,93 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hxtool-hxtool-commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hxtool-hxtool.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_CertificationRequest.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_CertificationRequestInfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPBasicOCSPResponse.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPCertID.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPCertStatus.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPInnerRequest.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPKeyHash.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPRequest.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPResponderID.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPResponse.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPResponseBytes.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPResponseData.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPResponseStatus.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPSignature.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPSingleResponse.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPTBSRequest.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_OCSPVersion.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_basic.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_nonce.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ca.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-cert.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-cms.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-collector.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-crypto.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-doxygen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-env.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-error.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-file.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-hx509_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-keyset.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ks_dir.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ks_file.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ks_keychain.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ks_mem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ks_null.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ks_p11.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-ks_p12.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-lock.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-name.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-peer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-print.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-req.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-revoke.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-sel-gram.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-sel-lex.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-sel.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhx509_la-softp11.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_expr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_name-test_name.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_soft_pkcs11-test_soft_pkcs11.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_CertificationRequest.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_CertificationRequestInfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPBasicOCSPResponse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPCertID.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPCertStatus.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPInnerRequest.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPKeyHash.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPRequest.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPResponderID.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPResponse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPResponseBytes.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPResponseData.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPResponseStatus.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPSignature.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPSingleResponse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPTBSRequest.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_OCSPVersion.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_id_pkix_ocsp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_id_pkix_ocsp_basic.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/asn1_id_pkix_ocsp_nonce.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ca.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cert.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cms.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/collector.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto-ec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crypto.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/doxygen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hx509_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hxtool-commands.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hxtool.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keyset.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ks_dir.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ks_file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ks_keychain.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ks_mem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ks_null.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ks_p11.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ks_p12.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/name.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/req.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/revoke.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel-gram.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel-lex.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sel.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/softp11.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_expr.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_name.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_soft_pkcs11.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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 $@ $< - -libhx509_la-ca.lo: ca.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ca.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ca.Tpo -c -o libhx509_la-ca.lo `test -f 'ca.c' || echo '$(srcdir)/'`ca.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ca.Tpo $(DEPDIR)/libhx509_la-ca.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ca.c' object='libhx509_la-ca.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ca.lo `test -f 'ca.c' || echo '$(srcdir)/'`ca.c - -libhx509_la-cert.lo: cert.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-cert.lo -MD -MP -MF $(DEPDIR)/libhx509_la-cert.Tpo -c -o libhx509_la-cert.lo `test -f 'cert.c' || echo '$(srcdir)/'`cert.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-cert.Tpo $(DEPDIR)/libhx509_la-cert.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cert.c' object='libhx509_la-cert.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-cert.lo `test -f 'cert.c' || echo '$(srcdir)/'`cert.c - -libhx509_la-cms.lo: cms.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-cms.lo -MD -MP -MF $(DEPDIR)/libhx509_la-cms.Tpo -c -o libhx509_la-cms.lo `test -f 'cms.c' || echo '$(srcdir)/'`cms.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-cms.Tpo $(DEPDIR)/libhx509_la-cms.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cms.c' object='libhx509_la-cms.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-cms.lo `test -f 'cms.c' || echo '$(srcdir)/'`cms.c - -libhx509_la-collector.lo: collector.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-collector.lo -MD -MP -MF $(DEPDIR)/libhx509_la-collector.Tpo -c -o libhx509_la-collector.lo `test -f 'collector.c' || echo '$(srcdir)/'`collector.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-collector.Tpo $(DEPDIR)/libhx509_la-collector.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='collector.c' object='libhx509_la-collector.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-collector.lo `test -f 'collector.c' || echo '$(srcdir)/'`collector.c - -libhx509_la-crypto.lo: crypto.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-crypto.lo -MD -MP -MF $(DEPDIR)/libhx509_la-crypto.Tpo -c -o libhx509_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-crypto.Tpo $(DEPDIR)/libhx509_la-crypto.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto.c' object='libhx509_la-crypto.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c - -libhx509_la-doxygen.lo: doxygen.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-doxygen.lo -MD -MP -MF $(DEPDIR)/libhx509_la-doxygen.Tpo -c -o libhx509_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-doxygen.Tpo $(DEPDIR)/libhx509_la-doxygen.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='doxygen.c' object='libhx509_la-doxygen.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c - -libhx509_la-error.lo: error.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-error.lo -MD -MP -MF $(DEPDIR)/libhx509_la-error.Tpo -c -o libhx509_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-error.Tpo $(DEPDIR)/libhx509_la-error.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error.c' object='libhx509_la-error.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c - -libhx509_la-env.lo: env.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-env.lo -MD -MP -MF $(DEPDIR)/libhx509_la-env.Tpo -c -o libhx509_la-env.lo `test -f 'env.c' || echo '$(srcdir)/'`env.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-env.Tpo $(DEPDIR)/libhx509_la-env.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='env.c' object='libhx509_la-env.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-env.lo `test -f 'env.c' || echo '$(srcdir)/'`env.c - -libhx509_la-file.lo: file.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-file.lo -MD -MP -MF $(DEPDIR)/libhx509_la-file.Tpo -c -o libhx509_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-file.Tpo $(DEPDIR)/libhx509_la-file.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='file.c' object='libhx509_la-file.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-file.lo `test -f 'file.c' || echo '$(srcdir)/'`file.c - -libhx509_la-sel.lo: sel.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-sel.lo -MD -MP -MF $(DEPDIR)/libhx509_la-sel.Tpo -c -o libhx509_la-sel.lo `test -f 'sel.c' || echo '$(srcdir)/'`sel.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-sel.Tpo $(DEPDIR)/libhx509_la-sel.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sel.c' object='libhx509_la-sel.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-sel.lo `test -f 'sel.c' || echo '$(srcdir)/'`sel.c - -libhx509_la-sel-gram.lo: sel-gram.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-sel-gram.lo -MD -MP -MF $(DEPDIR)/libhx509_la-sel-gram.Tpo -c -o libhx509_la-sel-gram.lo `test -f 'sel-gram.c' || echo '$(srcdir)/'`sel-gram.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-sel-gram.Tpo $(DEPDIR)/libhx509_la-sel-gram.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sel-gram.c' object='libhx509_la-sel-gram.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-sel-gram.lo `test -f 'sel-gram.c' || echo '$(srcdir)/'`sel-gram.c - -libhx509_la-sel-lex.lo: sel-lex.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-sel-lex.lo -MD -MP -MF $(DEPDIR)/libhx509_la-sel-lex.Tpo -c -o libhx509_la-sel-lex.lo `test -f 'sel-lex.c' || echo '$(srcdir)/'`sel-lex.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-sel-lex.Tpo $(DEPDIR)/libhx509_la-sel-lex.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sel-lex.c' object='libhx509_la-sel-lex.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-sel-lex.lo `test -f 'sel-lex.c' || echo '$(srcdir)/'`sel-lex.c - -libhx509_la-keyset.lo: keyset.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-keyset.lo -MD -MP -MF $(DEPDIR)/libhx509_la-keyset.Tpo -c -o libhx509_la-keyset.lo `test -f 'keyset.c' || echo '$(srcdir)/'`keyset.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-keyset.Tpo $(DEPDIR)/libhx509_la-keyset.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keyset.c' object='libhx509_la-keyset.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-keyset.lo `test -f 'keyset.c' || echo '$(srcdir)/'`keyset.c - -libhx509_la-ks_dir.lo: ks_dir.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ks_dir.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ks_dir.Tpo -c -o libhx509_la-ks_dir.lo `test -f 'ks_dir.c' || echo '$(srcdir)/'`ks_dir.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ks_dir.Tpo $(DEPDIR)/libhx509_la-ks_dir.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ks_dir.c' object='libhx509_la-ks_dir.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ks_dir.lo `test -f 'ks_dir.c' || echo '$(srcdir)/'`ks_dir.c - -libhx509_la-ks_file.lo: ks_file.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ks_file.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ks_file.Tpo -c -o libhx509_la-ks_file.lo `test -f 'ks_file.c' || echo '$(srcdir)/'`ks_file.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ks_file.Tpo $(DEPDIR)/libhx509_la-ks_file.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ks_file.c' object='libhx509_la-ks_file.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ks_file.lo `test -f 'ks_file.c' || echo '$(srcdir)/'`ks_file.c - -libhx509_la-ks_mem.lo: ks_mem.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ks_mem.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ks_mem.Tpo -c -o libhx509_la-ks_mem.lo `test -f 'ks_mem.c' || echo '$(srcdir)/'`ks_mem.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ks_mem.Tpo $(DEPDIR)/libhx509_la-ks_mem.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ks_mem.c' object='libhx509_la-ks_mem.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ks_mem.lo `test -f 'ks_mem.c' || echo '$(srcdir)/'`ks_mem.c - -libhx509_la-ks_null.lo: ks_null.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ks_null.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ks_null.Tpo -c -o libhx509_la-ks_null.lo `test -f 'ks_null.c' || echo '$(srcdir)/'`ks_null.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ks_null.Tpo $(DEPDIR)/libhx509_la-ks_null.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ks_null.c' object='libhx509_la-ks_null.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ks_null.lo `test -f 'ks_null.c' || echo '$(srcdir)/'`ks_null.c - -libhx509_la-ks_p11.lo: ks_p11.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ks_p11.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ks_p11.Tpo -c -o libhx509_la-ks_p11.lo `test -f 'ks_p11.c' || echo '$(srcdir)/'`ks_p11.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ks_p11.Tpo $(DEPDIR)/libhx509_la-ks_p11.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ks_p11.c' object='libhx509_la-ks_p11.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ks_p11.lo `test -f 'ks_p11.c' || echo '$(srcdir)/'`ks_p11.c - -libhx509_la-ks_p12.lo: ks_p12.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ks_p12.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ks_p12.Tpo -c -o libhx509_la-ks_p12.lo `test -f 'ks_p12.c' || echo '$(srcdir)/'`ks_p12.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ks_p12.Tpo $(DEPDIR)/libhx509_la-ks_p12.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ks_p12.c' object='libhx509_la-ks_p12.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ks_p12.lo `test -f 'ks_p12.c' || echo '$(srcdir)/'`ks_p12.c - -libhx509_la-ks_keychain.lo: ks_keychain.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-ks_keychain.lo -MD -MP -MF $(DEPDIR)/libhx509_la-ks_keychain.Tpo -c -o libhx509_la-ks_keychain.lo `test -f 'ks_keychain.c' || echo '$(srcdir)/'`ks_keychain.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-ks_keychain.Tpo $(DEPDIR)/libhx509_la-ks_keychain.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ks_keychain.c' object='libhx509_la-ks_keychain.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-ks_keychain.lo `test -f 'ks_keychain.c' || echo '$(srcdir)/'`ks_keychain.c - -libhx509_la-lock.lo: lock.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-lock.lo -MD -MP -MF $(DEPDIR)/libhx509_la-lock.Tpo -c -o libhx509_la-lock.lo `test -f 'lock.c' || echo '$(srcdir)/'`lock.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-lock.Tpo $(DEPDIR)/libhx509_la-lock.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='lock.c' object='libhx509_la-lock.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-lock.lo `test -f 'lock.c' || echo '$(srcdir)/'`lock.c - -libhx509_la-name.lo: name.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-name.lo -MD -MP -MF $(DEPDIR)/libhx509_la-name.Tpo -c -o libhx509_la-name.lo `test -f 'name.c' || echo '$(srcdir)/'`name.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-name.Tpo $(DEPDIR)/libhx509_la-name.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='name.c' object='libhx509_la-name.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-name.lo `test -f 'name.c' || echo '$(srcdir)/'`name.c - -libhx509_la-peer.lo: peer.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-peer.lo -MD -MP -MF $(DEPDIR)/libhx509_la-peer.Tpo -c -o libhx509_la-peer.lo `test -f 'peer.c' || echo '$(srcdir)/'`peer.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-peer.Tpo $(DEPDIR)/libhx509_la-peer.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='peer.c' object='libhx509_la-peer.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-peer.lo `test -f 'peer.c' || echo '$(srcdir)/'`peer.c - -libhx509_la-print.lo: print.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-print.lo -MD -MP -MF $(DEPDIR)/libhx509_la-print.Tpo -c -o libhx509_la-print.lo `test -f 'print.c' || echo '$(srcdir)/'`print.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-print.Tpo $(DEPDIR)/libhx509_la-print.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='print.c' object='libhx509_la-print.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-print.lo `test -f 'print.c' || echo '$(srcdir)/'`print.c - -libhx509_la-softp11.lo: softp11.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-softp11.lo -MD -MP -MF $(DEPDIR)/libhx509_la-softp11.Tpo -c -o libhx509_la-softp11.lo `test -f 'softp11.c' || echo '$(srcdir)/'`softp11.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-softp11.Tpo $(DEPDIR)/libhx509_la-softp11.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='softp11.c' object='libhx509_la-softp11.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-softp11.lo `test -f 'softp11.c' || echo '$(srcdir)/'`softp11.c - -libhx509_la-req.lo: req.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-req.lo -MD -MP -MF $(DEPDIR)/libhx509_la-req.Tpo -c -o libhx509_la-req.lo `test -f 'req.c' || echo '$(srcdir)/'`req.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-req.Tpo $(DEPDIR)/libhx509_la-req.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='req.c' object='libhx509_la-req.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-req.lo `test -f 'req.c' || echo '$(srcdir)/'`req.c - -libhx509_la-revoke.lo: revoke.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-revoke.lo -MD -MP -MF $(DEPDIR)/libhx509_la-revoke.Tpo -c -o libhx509_la-revoke.lo `test -f 'revoke.c' || echo '$(srcdir)/'`revoke.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-revoke.Tpo $(DEPDIR)/libhx509_la-revoke.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='revoke.c' object='libhx509_la-revoke.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-revoke.lo `test -f 'revoke.c' || echo '$(srcdir)/'`revoke.c - -libhx509_la-asn1_OCSPBasicOCSPResponse.lo: asn1_OCSPBasicOCSPResponse.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPBasicOCSPResponse.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPBasicOCSPResponse.Tpo -c -o libhx509_la-asn1_OCSPBasicOCSPResponse.lo `test -f 'asn1_OCSPBasicOCSPResponse.c' || echo '$(srcdir)/'`asn1_OCSPBasicOCSPResponse.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPBasicOCSPResponse.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPBasicOCSPResponse.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPBasicOCSPResponse.c' object='libhx509_la-asn1_OCSPBasicOCSPResponse.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPBasicOCSPResponse.lo `test -f 'asn1_OCSPBasicOCSPResponse.c' || echo '$(srcdir)/'`asn1_OCSPBasicOCSPResponse.c - -libhx509_la-asn1_OCSPCertID.lo: asn1_OCSPCertID.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPCertID.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPCertID.Tpo -c -o libhx509_la-asn1_OCSPCertID.lo `test -f 'asn1_OCSPCertID.c' || echo '$(srcdir)/'`asn1_OCSPCertID.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPCertID.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPCertID.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPCertID.c' object='libhx509_la-asn1_OCSPCertID.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPCertID.lo `test -f 'asn1_OCSPCertID.c' || echo '$(srcdir)/'`asn1_OCSPCertID.c - -libhx509_la-asn1_OCSPCertStatus.lo: asn1_OCSPCertStatus.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPCertStatus.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPCertStatus.Tpo -c -o libhx509_la-asn1_OCSPCertStatus.lo `test -f 'asn1_OCSPCertStatus.c' || echo '$(srcdir)/'`asn1_OCSPCertStatus.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPCertStatus.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPCertStatus.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPCertStatus.c' object='libhx509_la-asn1_OCSPCertStatus.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPCertStatus.lo `test -f 'asn1_OCSPCertStatus.c' || echo '$(srcdir)/'`asn1_OCSPCertStatus.c - -libhx509_la-asn1_OCSPInnerRequest.lo: asn1_OCSPInnerRequest.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPInnerRequest.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPInnerRequest.Tpo -c -o libhx509_la-asn1_OCSPInnerRequest.lo `test -f 'asn1_OCSPInnerRequest.c' || echo '$(srcdir)/'`asn1_OCSPInnerRequest.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPInnerRequest.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPInnerRequest.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPInnerRequest.c' object='libhx509_la-asn1_OCSPInnerRequest.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPInnerRequest.lo `test -f 'asn1_OCSPInnerRequest.c' || echo '$(srcdir)/'`asn1_OCSPInnerRequest.c - -libhx509_la-asn1_OCSPKeyHash.lo: asn1_OCSPKeyHash.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPKeyHash.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPKeyHash.Tpo -c -o libhx509_la-asn1_OCSPKeyHash.lo `test -f 'asn1_OCSPKeyHash.c' || echo '$(srcdir)/'`asn1_OCSPKeyHash.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPKeyHash.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPKeyHash.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPKeyHash.c' object='libhx509_la-asn1_OCSPKeyHash.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPKeyHash.lo `test -f 'asn1_OCSPKeyHash.c' || echo '$(srcdir)/'`asn1_OCSPKeyHash.c - -libhx509_la-asn1_OCSPRequest.lo: asn1_OCSPRequest.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPRequest.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPRequest.Tpo -c -o libhx509_la-asn1_OCSPRequest.lo `test -f 'asn1_OCSPRequest.c' || echo '$(srcdir)/'`asn1_OCSPRequest.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPRequest.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPRequest.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPRequest.c' object='libhx509_la-asn1_OCSPRequest.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPRequest.lo `test -f 'asn1_OCSPRequest.c' || echo '$(srcdir)/'`asn1_OCSPRequest.c - -libhx509_la-asn1_OCSPResponderID.lo: asn1_OCSPResponderID.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPResponderID.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPResponderID.Tpo -c -o libhx509_la-asn1_OCSPResponderID.lo `test -f 'asn1_OCSPResponderID.c' || echo '$(srcdir)/'`asn1_OCSPResponderID.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPResponderID.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPResponderID.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPResponderID.c' object='libhx509_la-asn1_OCSPResponderID.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPResponderID.lo `test -f 'asn1_OCSPResponderID.c' || echo '$(srcdir)/'`asn1_OCSPResponderID.c - -libhx509_la-asn1_OCSPResponse.lo: asn1_OCSPResponse.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPResponse.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPResponse.Tpo -c -o libhx509_la-asn1_OCSPResponse.lo `test -f 'asn1_OCSPResponse.c' || echo '$(srcdir)/'`asn1_OCSPResponse.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPResponse.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPResponse.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPResponse.c' object='libhx509_la-asn1_OCSPResponse.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPResponse.lo `test -f 'asn1_OCSPResponse.c' || echo '$(srcdir)/'`asn1_OCSPResponse.c - -libhx509_la-asn1_OCSPResponseBytes.lo: asn1_OCSPResponseBytes.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPResponseBytes.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPResponseBytes.Tpo -c -o libhx509_la-asn1_OCSPResponseBytes.lo `test -f 'asn1_OCSPResponseBytes.c' || echo '$(srcdir)/'`asn1_OCSPResponseBytes.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPResponseBytes.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPResponseBytes.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPResponseBytes.c' object='libhx509_la-asn1_OCSPResponseBytes.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPResponseBytes.lo `test -f 'asn1_OCSPResponseBytes.c' || echo '$(srcdir)/'`asn1_OCSPResponseBytes.c - -libhx509_la-asn1_OCSPResponseData.lo: asn1_OCSPResponseData.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPResponseData.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPResponseData.Tpo -c -o libhx509_la-asn1_OCSPResponseData.lo `test -f 'asn1_OCSPResponseData.c' || echo '$(srcdir)/'`asn1_OCSPResponseData.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPResponseData.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPResponseData.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPResponseData.c' object='libhx509_la-asn1_OCSPResponseData.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPResponseData.lo `test -f 'asn1_OCSPResponseData.c' || echo '$(srcdir)/'`asn1_OCSPResponseData.c - -libhx509_la-asn1_OCSPResponseStatus.lo: asn1_OCSPResponseStatus.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPResponseStatus.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPResponseStatus.Tpo -c -o libhx509_la-asn1_OCSPResponseStatus.lo `test -f 'asn1_OCSPResponseStatus.c' || echo '$(srcdir)/'`asn1_OCSPResponseStatus.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPResponseStatus.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPResponseStatus.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPResponseStatus.c' object='libhx509_la-asn1_OCSPResponseStatus.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPResponseStatus.lo `test -f 'asn1_OCSPResponseStatus.c' || echo '$(srcdir)/'`asn1_OCSPResponseStatus.c - -libhx509_la-asn1_OCSPSignature.lo: asn1_OCSPSignature.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPSignature.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPSignature.Tpo -c -o libhx509_la-asn1_OCSPSignature.lo `test -f 'asn1_OCSPSignature.c' || echo '$(srcdir)/'`asn1_OCSPSignature.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPSignature.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPSignature.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPSignature.c' object='libhx509_la-asn1_OCSPSignature.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPSignature.lo `test -f 'asn1_OCSPSignature.c' || echo '$(srcdir)/'`asn1_OCSPSignature.c - -libhx509_la-asn1_OCSPSingleResponse.lo: asn1_OCSPSingleResponse.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPSingleResponse.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPSingleResponse.Tpo -c -o libhx509_la-asn1_OCSPSingleResponse.lo `test -f 'asn1_OCSPSingleResponse.c' || echo '$(srcdir)/'`asn1_OCSPSingleResponse.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPSingleResponse.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPSingleResponse.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPSingleResponse.c' object='libhx509_la-asn1_OCSPSingleResponse.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPSingleResponse.lo `test -f 'asn1_OCSPSingleResponse.c' || echo '$(srcdir)/'`asn1_OCSPSingleResponse.c - -libhx509_la-asn1_OCSPTBSRequest.lo: asn1_OCSPTBSRequest.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPTBSRequest.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPTBSRequest.Tpo -c -o libhx509_la-asn1_OCSPTBSRequest.lo `test -f 'asn1_OCSPTBSRequest.c' || echo '$(srcdir)/'`asn1_OCSPTBSRequest.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPTBSRequest.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPTBSRequest.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPTBSRequest.c' object='libhx509_la-asn1_OCSPTBSRequest.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPTBSRequest.lo `test -f 'asn1_OCSPTBSRequest.c' || echo '$(srcdir)/'`asn1_OCSPTBSRequest.c - -libhx509_la-asn1_OCSPVersion.lo: asn1_OCSPVersion.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_OCSPVersion.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_OCSPVersion.Tpo -c -o libhx509_la-asn1_OCSPVersion.lo `test -f 'asn1_OCSPVersion.c' || echo '$(srcdir)/'`asn1_OCSPVersion.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_OCSPVersion.Tpo $(DEPDIR)/libhx509_la-asn1_OCSPVersion.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_OCSPVersion.c' object='libhx509_la-asn1_OCSPVersion.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_OCSPVersion.lo `test -f 'asn1_OCSPVersion.c' || echo '$(srcdir)/'`asn1_OCSPVersion.c - -libhx509_la-asn1_id_pkix_ocsp.lo: asn1_id_pkix_ocsp.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_id_pkix_ocsp.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp.Tpo -c -o libhx509_la-asn1_id_pkix_ocsp.lo `test -f 'asn1_id_pkix_ocsp.c' || echo '$(srcdir)/'`asn1_id_pkix_ocsp.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp.Tpo $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_id_pkix_ocsp.c' object='libhx509_la-asn1_id_pkix_ocsp.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_id_pkix_ocsp.lo `test -f 'asn1_id_pkix_ocsp.c' || echo '$(srcdir)/'`asn1_id_pkix_ocsp.c - -libhx509_la-asn1_id_pkix_ocsp_basic.lo: asn1_id_pkix_ocsp_basic.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_id_pkix_ocsp_basic.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_basic.Tpo -c -o libhx509_la-asn1_id_pkix_ocsp_basic.lo `test -f 'asn1_id_pkix_ocsp_basic.c' || echo '$(srcdir)/'`asn1_id_pkix_ocsp_basic.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_basic.Tpo $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_basic.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_id_pkix_ocsp_basic.c' object='libhx509_la-asn1_id_pkix_ocsp_basic.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_id_pkix_ocsp_basic.lo `test -f 'asn1_id_pkix_ocsp_basic.c' || echo '$(srcdir)/'`asn1_id_pkix_ocsp_basic.c - -libhx509_la-asn1_id_pkix_ocsp_nonce.lo: asn1_id_pkix_ocsp_nonce.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_id_pkix_ocsp_nonce.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_nonce.Tpo -c -o libhx509_la-asn1_id_pkix_ocsp_nonce.lo `test -f 'asn1_id_pkix_ocsp_nonce.c' || echo '$(srcdir)/'`asn1_id_pkix_ocsp_nonce.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_nonce.Tpo $(DEPDIR)/libhx509_la-asn1_id_pkix_ocsp_nonce.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_id_pkix_ocsp_nonce.c' object='libhx509_la-asn1_id_pkix_ocsp_nonce.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_id_pkix_ocsp_nonce.lo `test -f 'asn1_id_pkix_ocsp_nonce.c' || echo '$(srcdir)/'`asn1_id_pkix_ocsp_nonce.c - -libhx509_la-asn1_CertificationRequestInfo.lo: asn1_CertificationRequestInfo.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_CertificationRequestInfo.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_CertificationRequestInfo.Tpo -c -o libhx509_la-asn1_CertificationRequestInfo.lo `test -f 'asn1_CertificationRequestInfo.c' || echo '$(srcdir)/'`asn1_CertificationRequestInfo.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_CertificationRequestInfo.Tpo $(DEPDIR)/libhx509_la-asn1_CertificationRequestInfo.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_CertificationRequestInfo.c' object='libhx509_la-asn1_CertificationRequestInfo.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_CertificationRequestInfo.lo `test -f 'asn1_CertificationRequestInfo.c' || echo '$(srcdir)/'`asn1_CertificationRequestInfo.c - -libhx509_la-asn1_CertificationRequest.lo: asn1_CertificationRequest.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-asn1_CertificationRequest.lo -MD -MP -MF $(DEPDIR)/libhx509_la-asn1_CertificationRequest.Tpo -c -o libhx509_la-asn1_CertificationRequest.lo `test -f 'asn1_CertificationRequest.c' || echo '$(srcdir)/'`asn1_CertificationRequest.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-asn1_CertificationRequest.Tpo $(DEPDIR)/libhx509_la-asn1_CertificationRequest.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_CertificationRequest.c' object='libhx509_la-asn1_CertificationRequest.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-asn1_CertificationRequest.lo `test -f 'asn1_CertificationRequest.c' || echo '$(srcdir)/'`asn1_CertificationRequest.c - -libhx509_la-hx509_err.lo: hx509_err.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libhx509_la-hx509_err.lo -MD -MP -MF $(DEPDIR)/libhx509_la-hx509_err.Tpo -c -o libhx509_la-hx509_err.lo `test -f 'hx509_err.c' || echo '$(srcdir)/'`hx509_err.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libhx509_la-hx509_err.Tpo $(DEPDIR)/libhx509_la-hx509_err.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hx509_err.c' object='libhx509_la-hx509_err.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhx509_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libhx509_la-hx509_err.lo `test -f 'hx509_err.c' || echo '$(srcdir)/'`hx509_err.c - -hxtool-hxtool.o: hxtool.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hxtool-hxtool.o -MD -MP -MF $(DEPDIR)/hxtool-hxtool.Tpo -c -o hxtool-hxtool.o `test -f 'hxtool.c' || echo '$(srcdir)/'`hxtool.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hxtool-hxtool.Tpo $(DEPDIR)/hxtool-hxtool.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hxtool.c' object='hxtool-hxtool.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hxtool-hxtool.o `test -f 'hxtool.c' || echo '$(srcdir)/'`hxtool.c - -hxtool-hxtool.obj: hxtool.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hxtool-hxtool.obj -MD -MP -MF $(DEPDIR)/hxtool-hxtool.Tpo -c -o hxtool-hxtool.obj `if test -f 'hxtool.c'; then $(CYGPATH_W) 'hxtool.c'; else $(CYGPATH_W) '$(srcdir)/hxtool.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hxtool-hxtool.Tpo $(DEPDIR)/hxtool-hxtool.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hxtool.c' object='hxtool-hxtool.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hxtool-hxtool.obj `if test -f 'hxtool.c'; then $(CYGPATH_W) 'hxtool.c'; else $(CYGPATH_W) '$(srcdir)/hxtool.c'; fi` - -hxtool-hxtool-commands.o: hxtool-commands.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hxtool-hxtool-commands.o -MD -MP -MF $(DEPDIR)/hxtool-hxtool-commands.Tpo -c -o hxtool-hxtool-commands.o `test -f 'hxtool-commands.c' || echo '$(srcdir)/'`hxtool-commands.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hxtool-hxtool-commands.Tpo $(DEPDIR)/hxtool-hxtool-commands.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hxtool-commands.c' object='hxtool-hxtool-commands.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hxtool-hxtool-commands.o `test -f 'hxtool-commands.c' || echo '$(srcdir)/'`hxtool-commands.c - -hxtool-hxtool-commands.obj: hxtool-commands.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT hxtool-hxtool-commands.obj -MD -MP -MF $(DEPDIR)/hxtool-hxtool-commands.Tpo -c -o hxtool-hxtool-commands.obj `if test -f 'hxtool-commands.c'; then $(CYGPATH_W) 'hxtool-commands.c'; else $(CYGPATH_W) '$(srcdir)/hxtool-commands.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/hxtool-hxtool-commands.Tpo $(DEPDIR)/hxtool-hxtool-commands.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hxtool-commands.c' object='hxtool-hxtool-commands.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(hxtool_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hxtool-hxtool-commands.obj `if test -f 'hxtool-commands.c'; then $(CYGPATH_W) 'hxtool-commands.c'; else $(CYGPATH_W) '$(srcdir)/hxtool-commands.c'; fi` - -test_name-test_name.o: test_name.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_name-test_name.o -MD -MP -MF $(DEPDIR)/test_name-test_name.Tpo -c -o test_name-test_name.o `test -f 'test_name.c' || echo '$(srcdir)/'`test_name.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/test_name-test_name.Tpo $(DEPDIR)/test_name-test_name.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_name.c' object='test_name-test_name.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_name-test_name.o `test -f 'test_name.c' || echo '$(srcdir)/'`test_name.c - -test_name-test_name.obj: test_name.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_name-test_name.obj -MD -MP -MF $(DEPDIR)/test_name-test_name.Tpo -c -o test_name-test_name.obj `if test -f 'test_name.c'; then $(CYGPATH_W) 'test_name.c'; else $(CYGPATH_W) '$(srcdir)/test_name.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/test_name-test_name.Tpo $(DEPDIR)/test_name-test_name.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_name.c' object='test_name-test_name.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_name_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_name-test_name.obj `if test -f 'test_name.c'; then $(CYGPATH_W) 'test_name.c'; else $(CYGPATH_W) '$(srcdir)/test_name.c'; fi` - -test_soft_pkcs11-test_soft_pkcs11.o: test_soft_pkcs11.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_soft_pkcs11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_soft_pkcs11-test_soft_pkcs11.o -MD -MP -MF $(DEPDIR)/test_soft_pkcs11-test_soft_pkcs11.Tpo -c -o test_soft_pkcs11-test_soft_pkcs11.o `test -f 'test_soft_pkcs11.c' || echo '$(srcdir)/'`test_soft_pkcs11.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/test_soft_pkcs11-test_soft_pkcs11.Tpo $(DEPDIR)/test_soft_pkcs11-test_soft_pkcs11.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_soft_pkcs11.c' object='test_soft_pkcs11-test_soft_pkcs11.o' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_soft_pkcs11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_soft_pkcs11-test_soft_pkcs11.o `test -f 'test_soft_pkcs11.c' || echo '$(srcdir)/'`test_soft_pkcs11.c - -test_soft_pkcs11-test_soft_pkcs11.obj: test_soft_pkcs11.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_soft_pkcs11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT test_soft_pkcs11-test_soft_pkcs11.obj -MD -MP -MF $(DEPDIR)/test_soft_pkcs11-test_soft_pkcs11.Tpo -c -o test_soft_pkcs11-test_soft_pkcs11.obj `if test -f 'test_soft_pkcs11.c'; then $(CYGPATH_W) 'test_soft_pkcs11.c'; else $(CYGPATH_W) '$(srcdir)/test_soft_pkcs11.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/test_soft_pkcs11-test_soft_pkcs11.Tpo $(DEPDIR)/test_soft_pkcs11-test_soft_pkcs11.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test_soft_pkcs11.c' object='test_soft_pkcs11-test_soft_pkcs11.obj' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_soft_pkcs11_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o test_soft_pkcs11-test_soft_pkcs11.obj `if test -f 'test_soft_pkcs11.c'; then $(CYGPATH_W) 'test_soft_pkcs11.c'; else $(CYGPATH_W) '$(srcdir)/test_soft_pkcs11.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .l.c: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) + $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo @@ -1390,8 +1361,11 @@ -rm -rf .libs _libs install-dist_includeHEADERS: $(dist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(dist_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"; \ @@ -1405,13 +1379,14 @@ @$(NORMAL_UNINSTALL) @list='$(dist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -1425,30 +1400,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -1460,15 +1422,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -1477,103 +1435,296 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - skipped="($$skip tests were not run)"; \ + color_start= color_end=; \ fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test_ca.log: test_ca + @p='test_ca'; \ + b='test_ca'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_cert.log: test_cert + @p='test_cert'; \ + b='test_cert'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_chain.log: test_chain + @p='test_chain'; \ + b='test_chain'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_cms.log: test_cms + @p='test_cms'; \ + b='test_cms'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_crypto.log: test_crypto + @p='test_crypto'; \ + b='test_crypto'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_nist.log: test_nist + @p='test_nist'; \ + b='test_nist'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_nist2.log: test_nist2 + @p='test_nist2'; \ + b='test_nist2'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_pkcs11.log: test_pkcs11 + @p='test_pkcs11'; \ + b='test_pkcs11'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_java_pkcs11.log: test_java_pkcs11 + @p='test_java_pkcs11'; \ + b='test_java_pkcs11'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_nist_cert.log: test_nist_cert + @p='test_nist_cert'; \ + b='test_nist_cert'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_nist_pkcs12.log: test_nist_pkcs12 + @p='test_nist_pkcs12'; \ + b='test_nist_pkcs12'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_req.log: test_req + @p='test_req'; \ + b='test_req'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_windows.log: test_windows + @p='test_windows'; \ + b='test_windows'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_query.log: test_query + @p='test_query'; \ + b='test_query'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_name.log: test_name$(EXEEXT) + @p='test_name$(EXEEXT)'; \ + b='test_name'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_expr.log: test_expr$(EXEEXT) + @p='test_expr$(EXEEXT)'; \ + b='test_expr'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -1611,16 +1762,19 @@ $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local install-binPROGRAMS: install-libLTLIBRARIES +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -1629,11 +1783,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -1655,7 +1817,60 @@ clean-libLTLIBRARIES clean-libtool clean-local mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_CertificationRequest.Plo + -rm -f ./$(DEPDIR)/asn1_CertificationRequestInfo.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPBasicOCSPResponse.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPCertID.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPCertStatus.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPInnerRequest.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPKeyHash.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPRequest.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponderID.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponse.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponseBytes.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponseData.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponseStatus.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPSignature.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPSingleResponse.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPTBSRequest.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPVersion.Plo + -rm -f ./$(DEPDIR)/asn1_id_pkix_ocsp.Plo + -rm -f ./$(DEPDIR)/asn1_id_pkix_ocsp_basic.Plo + -rm -f ./$(DEPDIR)/asn1_id_pkix_ocsp_nonce.Plo + -rm -f ./$(DEPDIR)/ca.Plo + -rm -f ./$(DEPDIR)/cert.Plo + -rm -f ./$(DEPDIR)/cms.Plo + -rm -f ./$(DEPDIR)/collector.Plo + -rm -f ./$(DEPDIR)/crypto-ec.Plo + -rm -f ./$(DEPDIR)/crypto.Plo + -rm -f ./$(DEPDIR)/doxygen.Plo + -rm -f ./$(DEPDIR)/env.Plo + -rm -f ./$(DEPDIR)/error.Plo + -rm -f ./$(DEPDIR)/file.Plo + -rm -f ./$(DEPDIR)/hx509_err.Plo + -rm -f ./$(DEPDIR)/hxtool-commands.Po + -rm -f ./$(DEPDIR)/hxtool.Po + -rm -f ./$(DEPDIR)/keyset.Plo + -rm -f ./$(DEPDIR)/ks_dir.Plo + -rm -f ./$(DEPDIR)/ks_file.Plo + -rm -f ./$(DEPDIR)/ks_keychain.Plo + -rm -f ./$(DEPDIR)/ks_mem.Plo + -rm -f ./$(DEPDIR)/ks_null.Plo + -rm -f ./$(DEPDIR)/ks_p11.Plo + -rm -f ./$(DEPDIR)/ks_p12.Plo + -rm -f ./$(DEPDIR)/lock.Plo + -rm -f ./$(DEPDIR)/name.Plo + -rm -f ./$(DEPDIR)/peer.Plo + -rm -f ./$(DEPDIR)/print.Plo + -rm -f ./$(DEPDIR)/req.Plo + -rm -f ./$(DEPDIR)/revoke.Plo + -rm -f ./$(DEPDIR)/sel-gram.Plo + -rm -f ./$(DEPDIR)/sel-lex.Plo + -rm -f ./$(DEPDIR)/sel.Plo + -rm -f ./$(DEPDIR)/softp11.Plo + -rm -f ./$(DEPDIR)/test_expr.Po + -rm -f ./$(DEPDIR)/test_name.Po + -rm -f ./$(DEPDIR)/test_soft_pkcs11.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1680,9 +1895,9 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -1704,7 +1919,60 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/asn1_CertificationRequest.Plo + -rm -f ./$(DEPDIR)/asn1_CertificationRequestInfo.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPBasicOCSPResponse.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPCertID.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPCertStatus.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPInnerRequest.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPKeyHash.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPRequest.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponderID.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponse.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponseBytes.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponseData.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPResponseStatus.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPSignature.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPSingleResponse.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPTBSRequest.Plo + -rm -f ./$(DEPDIR)/asn1_OCSPVersion.Plo + -rm -f ./$(DEPDIR)/asn1_id_pkix_ocsp.Plo + -rm -f ./$(DEPDIR)/asn1_id_pkix_ocsp_basic.Plo + -rm -f ./$(DEPDIR)/asn1_id_pkix_ocsp_nonce.Plo + -rm -f ./$(DEPDIR)/ca.Plo + -rm -f ./$(DEPDIR)/cert.Plo + -rm -f ./$(DEPDIR)/cms.Plo + -rm -f ./$(DEPDIR)/collector.Plo + -rm -f ./$(DEPDIR)/crypto-ec.Plo + -rm -f ./$(DEPDIR)/crypto.Plo + -rm -f ./$(DEPDIR)/doxygen.Plo + -rm -f ./$(DEPDIR)/env.Plo + -rm -f ./$(DEPDIR)/error.Plo + -rm -f ./$(DEPDIR)/file.Plo + -rm -f ./$(DEPDIR)/hx509_err.Plo + -rm -f ./$(DEPDIR)/hxtool-commands.Po + -rm -f ./$(DEPDIR)/hxtool.Po + -rm -f ./$(DEPDIR)/keyset.Plo + -rm -f ./$(DEPDIR)/ks_dir.Plo + -rm -f ./$(DEPDIR)/ks_file.Plo + -rm -f ./$(DEPDIR)/ks_keychain.Plo + -rm -f ./$(DEPDIR)/ks_mem.Plo + -rm -f ./$(DEPDIR)/ks_null.Plo + -rm -f ./$(DEPDIR)/ks_p11.Plo + -rm -f ./$(DEPDIR)/ks_p12.Plo + -rm -f ./$(DEPDIR)/lock.Plo + -rm -f ./$(DEPDIR)/name.Plo + -rm -f ./$(DEPDIR)/peer.Plo + -rm -f ./$(DEPDIR)/print.Plo + -rm -f ./$(DEPDIR)/req.Plo + -rm -f ./$(DEPDIR)/revoke.Plo + -rm -f ./$(DEPDIR)/sel-gram.Plo + -rm -f ./$(DEPDIR)/sel-lex.Plo + -rm -f ./$(DEPDIR)/sel.Plo + -rm -f ./$(DEPDIR)/softp11.Plo + -rm -f ./$(DEPDIR)/test_expr.Po + -rm -f ./$(DEPDIR)/test_name.Po + -rm -f ./$(DEPDIR)/test_soft_pkcs11.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1726,17 +1994,18 @@ @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: all check check-am install install-am install-data-am \ - install-exec-am install-strip uninstall-am + install-exec install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-binPROGRAMS clean-checkPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ - ctags dist-hook distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-local cscopelist-am ctags ctags-am \ + dist-hook 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-data-hook \ install-dist_includeHEADERS install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man \ install-nodist_includeHEADERS install-pdf install-pdf-am \ @@ -1744,25 +2013,40 @@ 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-dist_includeHEADERS uninstall-hook \ - uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_includeHEADERS \ + uninstall-hook uninstall-libLTLIBRARIES \ + uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1770,7 +2054,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1815,11 +2099,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1827,6 +2120,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1869,6 +2164,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1882,13 +2190,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1927,99 +2235,101 @@ $(gen_files_crmf) crmf_asn1.hx crmf_asn1-priv.hx: crmf_asn1_files ocsp_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/ocsp.asn1 $(srcdir)/ocsp.opt - $(ASN1_COMPILE) --option-file=$(srcdir)/ocsp.opt $(srcdir)/ocsp.asn1 ocsp_asn1 || (rm -f ocsp_asn1_files ; exit 1) + $(heim_verbose)$(ASN1_COMPILE) --option-file=$(srcdir)/ocsp.opt $(srcdir)/ocsp.asn1 ocsp_asn1 || (rm -f ocsp_asn1_files ; exit 1) pkcs10_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/pkcs10.asn1 $(srcdir)/pkcs10.opt - $(ASN1_COMPILE) --option-file=$(srcdir)/pkcs10.opt $(srcdir)/pkcs10.asn1 pkcs10_asn1 || (rm -f pkcs10_asn1_files ; exit 1) + $(heim_verbose)$(ASN1_COMPILE) --option-file=$(srcdir)/pkcs10.opt $(srcdir)/pkcs10.asn1 pkcs10_asn1 || (rm -f pkcs10_asn1_files ; exit 1) crmf_asn1_files: $(ASN1_COMPILE_DEP) $(srcdir)/crmf.asn1 - $(ASN1_COMPILE) $(srcdir)/crmf.asn1 crmf_asn1 || (rm -f crmf_asn1_files ; exit 1) + $(heim_verbose)$(ASN1_COMPILE) $(srcdir)/crmf.asn1 crmf_asn1 || (rm -f crmf_asn1_files ; exit 1) + +$(ALL_OBJECTS): $(HX509_PROTOS) -$(libhx509_la_OBJECTS): $(srcdir)/hx509-protos.h $(srcdir)/hx509-private.h $(srcdir)/hx_locl.h +$(libhx509_la_OBJECTS): $(srcdir)/hx_locl.h $(libhx509_la_OBJECTS): ocsp_asn1.h pkcs10_asn1.h -$(srcdir)/hx509-protos.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -R '^(_|^C)' -E HX509_LIB -q -P comment -o hx509-protos.h $(dist_libhx509_la_SOURCES) || rm -f hx509-protos.h +$(srcdir)/hx509-protos.h: $(dist_libhx509_la_SOURCES) + $(heim_verbose)cd $(srcdir) && perl ../../cf/make-proto.pl -R '^(_|^C)' -E HX509_LIB -q -P comment -o hx509-protos.h $(dist_libhx509_la_SOURCES) || rm -f hx509-protos.h -$(srcdir)/hx509-private.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p hx509-private.h $(dist_libhx509_la_SOURCES) || rm -f hx509-private.h +$(srcdir)/hx509-private.h: $(dist_libhx509_la_SOURCES) + $(heim_verbose)cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p hx509-private.h $(dist_libhx509_la_SOURCES) || rm -f hx509-private.h hxtool-commands.c hxtool-commands.h: hxtool-commands.in $(SLC) - $(SLC) $(srcdir)/hxtool-commands.in + $(heim_verbose)$(SLC) $(srcdir)/hxtool-commands.in -$(hxtool_OBJECTS): hxtool-commands.h +$(hxtool_OBJECTS): hxtool-commands.h $(nodist_include_HEADERS) clean-local: @echo "cleaning PKITS" ; rm -rf PKITS_data test_ca: test_ca.in Makefile $(do_subst) < $(srcdir)/test_ca.in > test_ca.tmp - chmod +x test_ca.tmp + $(heim_verbose)chmod +x test_ca.tmp mv test_ca.tmp test_ca test_cert: test_cert.in Makefile $(do_subst) < $(srcdir)/test_cert.in > test_cert.tmp - chmod +x test_cert.tmp + $(heim_verbose)chmod +x test_cert.tmp mv test_cert.tmp test_cert test_chain: test_chain.in Makefile $(do_subst) < $(srcdir)/test_chain.in > test_chain.tmp - chmod +x test_chain.tmp + $(heim_verbose)chmod +x test_chain.tmp mv test_chain.tmp test_chain test_cms: test_cms.in Makefile $(do_subst) < $(srcdir)/test_cms.in > test_cms.tmp - chmod +x test_cms.tmp + $(heim_verbose)chmod +x test_cms.tmp mv test_cms.tmp test_cms test_crypto: test_crypto.in Makefile $(do_subst) < $(srcdir)/test_crypto.in > test_crypto.tmp - chmod +x test_crypto.tmp + $(heim_verbose)chmod +x test_crypto.tmp mv test_crypto.tmp test_crypto test_nist: test_nist.in Makefile $(do_subst) < $(srcdir)/test_nist.in > test_nist.tmp - chmod +x test_nist.tmp + $(heim_verbose)chmod +x test_nist.tmp mv test_nist.tmp test_nist test_nist2: test_nist2.in Makefile $(do_subst) < $(srcdir)/test_nist2.in > test_nist2.tmp - chmod +x test_nist2.tmp + $(heim_verbose)chmod +x test_nist2.tmp mv test_nist2.tmp test_nist2 test_pkcs11: test_pkcs11.in Makefile $(do_subst) < $(srcdir)/test_pkcs11.in > test_pkcs11.tmp - chmod +x test_pkcs11.tmp + $(heim_verbose)chmod +x test_pkcs11.tmp mv test_pkcs11.tmp test_pkcs11 test_java_pkcs11: test_java_pkcs11.in Makefile $(do_subst) < $(srcdir)/test_java_pkcs11.in > test_java_pkcs11.tmp - chmod +x test_java_pkcs11.tmp + $(heim_verbose)chmod +x test_java_pkcs11.tmp mv test_java_pkcs11.tmp test_java_pkcs11 test_nist_cert: test_nist_cert.in Makefile $(do_subst) < $(srcdir)/test_nist_cert.in > test_nist_cert.tmp - chmod +x test_nist_cert.tmp + $(heim_verbose)chmod +x test_nist_cert.tmp mv test_nist_cert.tmp test_nist_cert test_nist_pkcs12: test_nist_pkcs12.in Makefile $(do_subst) < $(srcdir)/test_nist_pkcs12.in > test_nist_pkcs12.tmp - chmod +x test_nist_pkcs12.tmp + $(heim_verbose)chmod +x test_nist_pkcs12.tmp mv test_nist_pkcs12.tmp test_nist_pkcs12 test_req: test_req.in Makefile $(do_subst) < $(srcdir)/test_req.in > test_req.tmp - chmod +x test_req.tmp + $(heim_verbose)chmod +x test_req.tmp mv test_req.tmp test_req test_windows: test_windows.in Makefile $(do_subst) < $(srcdir)/test_windows.in > test_windows.tmp - chmod +x test_windows.tmp + $(heim_verbose)chmod +x test_windows.tmp mv test_windows.tmp test_windows test_query: test_query.in Makefile $(do_subst) < $(srcdir)/test_query.in > test_query.tmp - chmod +x test_query.tmp + $(heim_verbose)chmod +x test_query.tmp mv test_query.tmp test_query # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/crypto/heimdal/lib/hx509/NTMakefile b/crypto/heimdal/lib/hx509/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/NTMakefile @@ -0,0 +1,217 @@ +######################################################################## +# +# Copyright (c) 2009-2017, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\hx509 +intcflags=-I$(OBJ) +localcflags=-DASN1_LIB + +!include ../../windows/NTMakefile.w32 + +gen_files_ocsp = $(OBJ)\asn1_ocsp_asn1.x + +gen_files_pkcs10 = $(OBJ)\asn1_pkcs10_asn1.x + +gen_files_crmf = $(OBJ)\asn1_crmf_asn1.x + +libhx509_la_OBJS = \ + $(OBJ)\ca.obj \ + $(OBJ)\cert.obj \ + $(OBJ)\cms.obj \ + $(OBJ)\collector.obj \ + $(OBJ)\crypto.obj \ + $(OBJ)\crypto-ec.obj \ + $(OBJ)\error.obj \ + $(OBJ)\env.obj \ + $(OBJ)\file.obj \ + $(OBJ)\hx509_err.obj \ + $(OBJ)\sel.obj \ + $(OBJ)\sel-gram.obj \ + $(OBJ)\sel-lex.obj \ + $(OBJ)\keyset.obj \ + $(OBJ)\ks_dir.obj \ + $(OBJ)\ks_file.obj \ + $(OBJ)\ks_mem.obj \ + $(OBJ)\ks_null.obj \ + $(OBJ)\ks_p11.obj \ + $(OBJ)\ks_p12.obj \ + $(OBJ)\ks_keychain.obj \ + $(OBJ)\lock.obj \ + $(OBJ)\name.obj \ + $(OBJ)\peer.obj \ + $(OBJ)\print.obj \ + $(OBJ)\softp11.obj \ + $(OBJ)\req.obj \ + $(OBJ)\revoke.obj \ + $(gen_files_ocsp:.x=.obj) \ + $(gen_files_pkcs10:.x=.obj) + +$(LIBHX509): $(libhx509_la_OBJS) + $(LIBCON) + +dist_libhx509_la_SOURCES = \ + $(SRCDIR)\ca.c \ + $(SRCDIR)\cert.c \ + $(SRCDIR)\cms.c \ + $(SRCDIR)\collector.c \ + $(SRCDIR)\crypto.c \ + $(SRCDIR)\crypto-ec.c \ + $(SRCDIR)\doxygen.c \ + $(SRCDIR)\error.c \ + $(SRCDIR)\env.c \ + $(SRCDIR)\file.c \ + $(SRCDIR)\hx509.h \ + $(SRCDIR)\hx_locl.h \ + $(SRCDIR)\sel.c \ + $(SRCDIR)\sel.h \ + $(SRCDIR)\sel-gram.y \ + $(SRCDIR)\sel-lex.l \ + $(SRCDIR)\keyset.c \ + $(SRCDIR)\ks_dir.c \ + $(SRCDIR)\ks_file.c \ + $(SRCDIR)\ks_mem.c \ + $(SRCDIR)\ks_null.c \ + $(SRCDIR)\ks_p11.c \ + $(SRCDIR)\ks_p12.c \ + $(SRCDIR)\ks_keychain.c \ + $(SRCDIR)\lock.c \ + $(SRCDIR)\name.c \ + $(SRCDIR)\peer.c \ + $(SRCDIR)\print.c \ + $(SRCDIR)\softp11.c \ + $(SRCDIR)\ref\pkcs11.h \ + $(SRCDIR)\req.c \ + $(SRCDIR)\revoke.c + +asn1_compile=$(BINDIR)\asn1_compile.exe + +$(gen_files_ocsp:.x=.c): $$(@R).x + +$(gen_files_pkcs10:.x=.c): $$(@R).x + +$(gen_files_crmf:.x=.c): $$(@R).x + +$(gen_files_ocsp) $(OBJ)\ocsp_asn1.hx: $(asn1_compile) ocsp.asn1 + cd $(OBJ) + $(asn1_compile) --one-code-file \ + --preserve-binary=OCSPTBSRequest \ + --preserve-binary=OCSPResponseData \ + $(SRCDIR)\ocsp.asn1 ocsp_asn1 \ + || ( $(RM) -f $(gen_files_ocsp) $(OBJ)\ocsp_asn1.h ; exit /b 1 ) + cd $(SRCDIR) + +$(gen_files_pkcs10) $(OBJ)\pkcs10_asn1.hx: $(asn1_compile) pkcs10.asn1 + cd $(OBJ) + $(asn1_compile) --one-code-file \ + --preserve-binary=CertificationRequestInfo \ + $(SRCDIR)\pkcs10.asn1 pkcs10_asn1 \ + || ( $(RM) -f $(gen_files_pkcs10) $(OBJ)\pkcs10_asn1.h ; exit /b 1 ) + cd $(SRCDIR) + +$(gen_files_crmf) $(OBJ)\crmf_asn1.hx: $(asn1_compile) crmf.asn1 + cd $(OBJ) + $(asn1_compile) --one-code-file $(SRCDIR)\crmf.asn1 crmf_asn1 \ + || ( $(RM) -f $(gen_files_crmf) $(OBJ)\crmf_asn1.h ; exit /b 1 ) + cd $(SRCDIR) + +INCFILES= \ + $(INCDIR)\hx509.h \ + $(INCDIR)\hx509-protos.h \ + $(INCDIR)\hx509-private.h \ + $(INCDIR)\hx509_err.h \ + $(INCDIR)\ocsp_asn1.h \ + $(INCDIR)\pkcs10_asn1.h \ + $(INCDIR)\crmf_asn1.h \ + $(OBJ)\ocsp_asn1-priv.h \ + $(OBJ)\pkcs10_asn1-priv.h \ + $(OBJ)\crmf_asn1-priv.h + +hxtool.c: $(OBJ)\hxtool-commands.h + +SLC=$(BINDIR)\slc.exe + +$(OBJ)\hxtool-commands.c $(OBJ)\hxtool-commands.h: hxtool-commands.in $(SLC) + cd $(OBJ) + $(CP) $(SRCDIR)\hxtool-commands.in $(OBJ)\hxtool-commands.in + $(SLC) hxtool-commands.in + cd $(SRCDIR) + +$(BINDIR)\hxtool.exe: $(OBJ)\tool\hxtool.obj $(OBJ)\tool\hxtool-commands.obj $(LIBHEIMDAL) $(OBJ)\hxtool-version.res + $(EXECONLINK) $(LIBHEIMDAL) $(LIBROKEN) $(LIBSL) $(LIBVERS) $(LIBCOMERR) $(LIB_openssl_crypto) + $(EXEPREP) + +$(OBJ)\hx509-protos.h: + cd $(OBJ) + $(PERL) $(SRCDIR)\..\..\cf\make-proto.pl -R "^(_|^C)" -E HX509_LIB -q -P remove -o hx509-protos.h $(dist_libhx509_la_SOURCES) || $(RM) -f hx509-protos.h + cd $(SRCDIR) + +$(OBJ)\hx509-private.h: + cd $(OBJ) + $(PERL) $(SRCDIR)\..\..\cf\make-proto.pl -q -P remove -p hx509-private.h $(dist_libhx509_la_SOURCES) || $(RM) -f hx509-private.h + cd $(SRCDIR) + +$(OBJ)\hx509_err.c $(OBJ)\hx509_err.h: hx509_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\hx509_err.et + cd $(SRCDIR) + +$(OBJ)\sel-gram.obj: $(OBJ)\sel-gram.c + $(C2OBJ) -I$(SRCDIR) + +$(OBJ)\sel-lex.obj: $(OBJ)\sel-lex.c + $(C2OBJ) -I$(SRCDIR) -I$(OBJ) -DYY_NO_UNISTD_H + +$(OBJ)\sel-gram.c: sel-gram.y + $(YACC) -o $@ --defines=$(OBJ)\sel-gram.h sel-gram.y + +$(OBJ)\sel-lex.c: sel-lex.l + $(LEX) -P_hx509_sel_yy -o$@ sel-lex.l + +all:: $(INCFILES) $(LIBHX509) + +prep:: mktooldir + +mktooldir: +! if !exist($(OBJ)\tool) + $(MKDIR) $(OBJ)\tool +! endif + +all-tools:: $(BINDIR)\hxtool.exe + +clean:: + -$(RM) $(BINDIR)\hxtool.* + -$(RM) $(OBJ)\tool\*.* + +{}.c{$(OBJ)\tool}.obj:: + $(C2OBJ_C) /Fd$(OBJ)\tool\ /Fo$(OBJ)\tool\ $(MPOPT) /UASN1_LIB $< + +{$(OBJ)}.c{$(OBJ)\tool}.obj:: + $(C2OBJ_C) /Fd$(OBJ)\tool\ /Fo$(OBJ)\tool\ $(MPOPT) /UASN1_LIB $< + diff --git a/crypto/heimdal/lib/hx509/TODO b/crypto/heimdal/lib/hx509/TODO new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/TODO @@ -0,0 +1,61 @@ +Handle private_key_ops better, esp wrt ->key_oid + +Better support for keyex negotiation, DH and ECDH. + +x501 name + parsing + comparing (ldap canonlisation rules) + +DSA support +DSA2 support + +Rewrite the pkcs11 code to support the following: + + * Reset the pin on card change. + * Ref count the lock structure to make sure we have a + prompter when we need it. + * Add support for CK_TOKEN_INFO.CKF_PROTECTED_AUTHENTICATION_PATH + +x509 policy mappings support + +CRL delta support + +Qualified statement + https://bugzilla.mozilla.org/show_bug.cgi?id=277797#c2 + + +Signed Receipts + http://www.faqs.org/rfcs/rfc2634.html + chapter 2 + +tests + nist tests + name constrains + policy mappings + http://csrc.nist.gov/pki/testing/x509paths.html + + building path using Subject/Issuer vs SubjKeyID vs AuthKeyID + negative tests + all checksums + conditions/branches + +pkcs7 + handle pkcs7 support in CMS ? + +certificate request + generate pkcs10 request + from existing cert + generate CRMF request + pk-init KDC/client + web server/client + jabber server/client + email + + +x509 issues: + + OtherName is left unspecified, but it's used by other + specs. creating this hole where a application/CA can't specify + policy for SubjectAltName what covers whole space. For example, a + CA is trusted to provide authentication but not authorization. + diff --git a/crypto/heimdal/lib/hx509/ca.c b/crypto/heimdal/lib/hx509/ca.c --- a/crypto/heimdal/lib/hx509/ca.c +++ b/crypto/heimdal/lib/hx509/ca.c @@ -61,7 +61,7 @@ CRLDistributionPoints crldp; heim_bit_string subjectUniqueID; heim_bit_string issuerUniqueID; - + AlgorithmIdentifier *sigalg; }; /** @@ -109,6 +109,10 @@ der_free_bit_string(&(*tbs)->subjectUniqueID); der_free_bit_string(&(*tbs)->issuerUniqueID); hx509_name_free(&(*tbs)->subject); + if ((*tbs)->sigalg) { + free_AlgorithmIdentifier((*tbs)->sigalg); + free((*tbs)->sigalg); + } memset(*tbs, 0, sizeof(**tbs)); free(*tbs); @@ -888,7 +892,7 @@ * * @param context A hx509 context. * @param tbs object to be signed. - * @param env enviroment variable to expand variables in the subject + * @param env environment variable to expand variables in the subject * name, see hx509_env_init(). * * @return An hx509 error code, see hx509_get_error_string(). @@ -904,6 +908,39 @@ return hx509_name_expand(context, tbs->subject, env); } +/** + * Set signature algorithm on the to be signed certificate + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param sigalg signature algorithm to use + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + +int +hx509_ca_tbs_set_signature_algorithm(hx509_context context, + hx509_ca_tbs tbs, + const AlgorithmIdentifier *sigalg) +{ + int ret; + + tbs->sigalg = calloc(1, sizeof(*tbs->sigalg)); + if (tbs->sigalg == NULL) { + hx509_set_error_string(context, 0, ENOMEM, "Out of memory"); + return ENOMEM; + } + ret = copy_AlgorithmIdentifier(sigalg, tbs->sigalg); + if (ret) { + free(tbs->sigalg); + tbs->sigalg = NULL; + return ret; + } + return 0; +} + /* * */ @@ -965,8 +1002,8 @@ } t = time(NULL); - asprintf(&tstr, "ts-%lu", (unsigned long)t); - if (tstr == NULL) { + ret = asprintf(&tstr, "ts-%lu", (unsigned long)t); + if (ret == -1 || tstr == NULL) { hx509_set_error_string(context, 0, ENOMEM, "Failed to copy subject name"); return ENOMEM; @@ -987,6 +1024,7 @@ const Name *issuername, hx509_cert *certificate) { + heim_error_t error = NULL; heim_octet_string data; Certificate c; TBSCertificate *tbsc; @@ -997,7 +1035,9 @@ time_t notAfter; unsigned key_usage; - sigalg = _hx509_crypto_default_sig_alg; + sigalg = tbs->sigalg; + if (sigalg == NULL) + sigalg = _hx509_crypto_default_sig_alg; memset(&c, 0, sizeof(c)); @@ -1086,6 +1126,12 @@ goto out; } } else { + /* + * If no explicit serial number is specified, 20 random bytes should be + * sufficiently collision resistant. Since the serial number must be a + * positive integer, ensure minimal ASN.1 DER form by forcing the high + * bit off and the next bit on (thus avoiding an all zero first octet). + */ tbsc->serialNumber.length = 20; tbsc->serialNumber.data = malloc(tbsc->serialNumber.length); if (tbsc->serialNumber.data == NULL){ @@ -1093,9 +1139,9 @@ hx509_set_error_string(context, 0, ret, "Out of memory"); goto out; } - /* XXX diffrent */ RAND_bytes(tbsc->serialNumber.data, tbsc->serialNumber.length); ((unsigned char *)tbsc->serialNumber.data)[0] &= 0x7f; + ((unsigned char *)tbsc->serialNumber.data)[0] |= 0x40; } /* signature AlgorithmIdentifier, */ ret = copy_AlgorithmIdentifier(sigalg, &tbsc->signature); @@ -1408,9 +1454,12 @@ if (ret) goto out; - ret = hx509_cert_init(context, &c, certificate); - if (ret) + *certificate = hx509_cert_init(context, &c, &error); + if (*certificate == NULL) { + ret = heim_error_get_code(error); + heim_release(error); goto out; + } free_Certificate(&c); diff --git a/crypto/heimdal/lib/hx509/cert.c b/crypto/heimdal/lib/hx509/cert.c --- a/crypto/heimdal/lib/hx509/cert.c +++ b/crypto/heimdal/lib/hx509/cert.c @@ -93,6 +93,14 @@ #define GeneralSubtrees_SET(g,var) \ (g)->len = (var)->len, (g)->val = (var)->val; +static void +init_context_once(void *ignored) +{ + + ENGINE_add_conf_module(); + OpenSSL_add_all_algorithms(); +} + /** * Creates a hx509 context that most functions in the library * uses. The context is only allowed to be used by one thread at each @@ -108,10 +116,14 @@ int hx509_context_init(hx509_context *context) { + static heim_base_once_t init_context = HEIM_BASE_ONCE_INIT; + *context = calloc(1, sizeof(**context)); if (*context == NULL) return ENOMEM; + heim_base_once_f(&init_context, NULL, init_context_once); + _hx509_ks_null_register(*context); _hx509_ks_mem_register(*context); _hx509_ks_file_register(*context); @@ -120,9 +132,6 @@ _hx509_ks_dir_register(*context); _hx509_ks_keychain_register(*context); - ENGINE_add_conf_module(); - OpenSSL_add_all_algorithms(); - (*context)->ocsp_time_diff = HX509_DEFAULT_OCSP_TIME_DIFF; initialize_hx_error_table_r(&(*context)->et_list); @@ -209,42 +218,48 @@ * * @param context A hx509 context. * @param c - * @param cert + * @param error * - * @return Returns an hx509 error code. + * @return Returns an hx509 certificate * * @ingroup hx509_cert */ -int -hx509_cert_init(hx509_context context, const Certificate *c, hx509_cert *cert) +hx509_cert +hx509_cert_init(hx509_context context, const Certificate *c, heim_error_t *error) { + hx509_cert cert; int ret; - *cert = malloc(sizeof(**cert)); - if (*cert == NULL) - return ENOMEM; - (*cert)->ref = 1; - (*cert)->friendlyname = NULL; - (*cert)->attrs.len = 0; - (*cert)->attrs.val = NULL; - (*cert)->private_key = NULL; - (*cert)->basename = NULL; - (*cert)->release = NULL; - (*cert)->ctx = NULL; - - (*cert)->data = calloc(1, sizeof(*(*cert)->data)); - if ((*cert)->data == NULL) { - free(*cert); - return ENOMEM; + cert = malloc(sizeof(*cert)); + if (cert == NULL) { + if (error) + *error = heim_error_create_enomem(); + return NULL; + } + cert->ref = 1; + cert->friendlyname = NULL; + cert->attrs.len = 0; + cert->attrs.val = NULL; + cert->private_key = NULL; + cert->basename = NULL; + cert->release = NULL; + cert->ctx = NULL; + + cert->data = calloc(1, sizeof(*(cert->data))); + if (cert->data == NULL) { + free(cert); + if (error) + *error = heim_error_create_enomem(); + return NULL; } - ret = copy_Certificate(c, (*cert)->data); + ret = copy_Certificate(c, cert->data); if (ret) { - free((*cert)->data); - free(*cert); - *cert = NULL; + free(cert->data); + free(cert); + cert = NULL; } - return ret; + return cert; } /** @@ -259,39 +274,41 @@ * @param context A hx509 context. * @param ptr pointer to memory region containing encoded certificate. * @param len length of memory region. - * @param cert a return pointer to a hx509 certificate object, will - * contain NULL on error. + * @param error possibly returns an error * - * @return An hx509 error code, see hx509_get_error_string(). + * @return An hx509 certificate * * @ingroup hx509_cert */ -int +hx509_cert hx509_cert_init_data(hx509_context context, const void *ptr, size_t len, - hx509_cert *cert) + heim_error_t *error) { + hx509_cert cert; Certificate t; size_t size; int ret; ret = decode_Certificate(ptr, len, &t, &size); if (ret) { - hx509_set_error_string(context, 0, ret, "Failed to decode certificate"); - return ret; + if (error) + *error = heim_error_create(ret, "Failed to decode certificate"); + return NULL; } if (size != len) { free_Certificate(&t); - hx509_set_error_string(context, 0, HX509_EXTRA_DATA_AFTER_STRUCTURE, - "Extra data after certificate"); - return HX509_EXTRA_DATA_AFTER_STRUCTURE; + if (error) + *error = heim_error_create(HX509_EXTRA_DATA_AFTER_STRUCTURE, + "Extra data after certificate"); + return NULL; } - ret = hx509_cert_init(context, &t, cert); + cert = hx509_cert_init(context, &t, error); free_Certificate(&t); - return ret; + return cert; } void @@ -827,7 +844,8 @@ _hx509_unparse_Name(&cert->tbsCertificate.subject, &name); hx509_set_error_string(context, 0, HX509_KU_CERT_MISSING, "Key usage %s required but missing " - "from certifiate %s", buf, name); + "from certifiate %s", buf, + name ? name : ""); free(name); return HX509_KU_CERT_MISSING; } @@ -970,7 +988,7 @@ if (ai.authorityCertIssuer->val[0].element != choice_GeneralName_directoryName) return -1; - name.element = + name.element = (enum Name_enum) ai.authorityCertIssuer->val[0].u.directoryName.element; name.u.rdnSequence = ai.authorityCertIssuer->val[0].u.directoryName.u.rdnSequence; @@ -1803,12 +1821,12 @@ c_name._save.data = NULL; c_name._save.length = 0; - c_name.element = c->u.directoryName.element; + c_name.element = (enum Name_enum)c->u.directoryName.element; c_name.u.rdnSequence = c->u.directoryName.u.rdnSequence; n_name._save.data = NULL; n_name._save.length = 0; - n_name.element = n->u.directoryName.element; + n_name.element = (enum Name_enum)n->u.directoryName.element; n_name.u.rdnSequence = n->u.directoryName.u.rdnSequence; ret = match_X501Name(&c_name, &n_name); @@ -1829,7 +1847,7 @@ int *same, int *match) { GeneralNames sa; - int ret; + int ret = 0; size_t i, j; i = 0; @@ -1844,7 +1862,7 @@ for (j = 0; j < sa.len; j++) { if (n->element == sa.val[j].element) { *same = 1; - ret = match_general_name(n, &sa.val[j], match); + match_general_name(n, &sa.val[j], match); } } free_GeneralNames(&sa); @@ -1878,12 +1896,12 @@ memset(&certname, 0, sizeof(certname)); certname.element = choice_GeneralName_directoryName; - certname.u.directoryName.element = + certname.u.directoryName.element = (enum GeneralName_directoryName_enum) c->tbsCertificate.subject.element; certname.u.directoryName.u.rdnSequence = c->tbsCertificate.subject.u.rdnSequence; - ret = match_general_name(&t->val[i].base, &certname, &name); + match_general_name(&t->val[i].base, &certname, &name); } /* Handle subjectAltNames, this is icky since they @@ -1891,7 +1909,7 @@ * same type. So if there have been a match of type, require * altname to be set. */ - ret = match_alt_name(&t->val[i].base, c, &same, &alt_name); + match_alt_name(&t->val[i].base, c, &same, &alt_name); } if (name && (!same || alt_name)) *match = 1; @@ -1985,6 +2003,16 @@ memset(&proxy_issuer, 0, sizeof(proxy_issuer)); + if ((ctx->flags & HX509_VERIFY_CTX_F_ALLOW_PROXY_CERTIFICATE) == 0 && + is_proxy_cert(context, cert->data, NULL) == 0) + { + ret = HX509_PROXY_CERT_INVALID; + hx509_set_error_string(context, 0, ret, + "Proxy certificate is not allowed as an EE " + "certificae if proxy certificate is disabled"); + return ret; + } + ret = init_name_constraints(&nc); if (ret) return ret; @@ -2172,9 +2200,9 @@ * EE checking below. */ type = EE_CERT; - /* FALLTHOUGH */ } } + /* FALLTHROUGH */ case EE_CERT: /* * If there where any proxy certificates in the chain @@ -2353,20 +2381,12 @@ goto out; } /* - * Verify that the sigature algorithm "best-before" date is - * before the creation date of the certificate, do this for - * trust anchors too, since any trust anchor that is created - * after a algorithm is known to be bad deserved to be invalid. - * - * Skip the leaf certificate for now... + * Verify that the sigature algorithm is not weak. Ignore + * trust anchors since they are provisioned by the user. */ - if (i != 0 && (ctx->flags & HX509_VERIFY_CTX_F_NO_BEST_BEFORE_CHECK) == 0) { - time_t notBefore = - _hx509_Time2time_t(&c->tbsCertificate.validity.notBefore); - ret = _hx509_signature_best_before(context, - &c->signatureAlgorithm, - notBefore); + if (i + 1 != path.len && (ctx->flags & HX509_VERIFY_CTX_F_NO_BEST_BEFORE_CHECK) == 0) { + ret = _hx509_signature_is_weak(context, &c->signatureAlgorithm); if (ret) goto out; } @@ -3384,7 +3404,7 @@ void _hx509_abort(const char *fmt, ...) - __attribute__ ((noreturn, format (printf, 1, 2))) + __attribute__ ((__noreturn__, __format__ (__printf__, 1, 2))) { va_list ap; va_start(ap, fmt); @@ -3425,7 +3445,9 @@ *env = NULL; /* version */ - asprintf(&buf, "%d", _hx509_cert_get_version(_hx509_get_cert(cert))); + ret = asprintf(&buf, "%d", _hx509_cert_get_version(_hx509_get_cert(cert))); + if (ret == -1) + goto out; ret = hx509_env_add(context, &envcert, "version", buf); free(buf); if (ret) diff --git a/crypto/heimdal/lib/hx509/cms.c b/crypto/heimdal/lib/hx509/cms.c --- a/crypto/heimdal/lib/hx509/cms.c +++ b/crypto/heimdal/lib/hx509/cms.c @@ -182,7 +182,7 @@ &id->u.subjectKeyIdentifier); if (ret == 0) break; - /* FALL THOUGH */ + /* FALLTHROUGH */ case CMS_ID_NAME: { hx509_name name; @@ -209,7 +209,7 @@ CMSIdentifier *id, char **str) { - int ret; + int ret = -1; *str = NULL; switch (id->element) { @@ -227,8 +227,8 @@ free(name); return ret; } - asprintf(str, "certificate issued by %s with serial number %s", - name, serial); + ret = asprintf(str, "certificate issued by %s with serial number %s", + name, serial); free(name); free(serial); break; @@ -242,15 +242,19 @@ if (len < 0) return ENOMEM; - asprintf(str, "certificate with id %s", keyid); + ret = asprintf(str, "certificate with id %s", keyid); free(keyid); break; } default: - asprintf(str, "certificate have unknown CMSidentifier type"); + ret = asprintf(str, "certificate have unknown CMSidentifier type"); break; } - if (*str == NULL) + /* + * In the following if, we check ret and *str which should be returned/set + * by asprintf(3) in every branch of the switch statement. + */ + if (ret == -1 || *str == NULL) return ENOMEM; return 0; } @@ -340,6 +344,8 @@ * @param contentType output type oid, should be freed with der_free_oid(). * @param content the data, free with der_free_octet_string(). * + * @return an hx509 error code. + * * @ingroup hx509_cms */ @@ -531,7 +537,7 @@ * * @param context A hx509 context. * @param flags flags to control the behavior. - * - HX509_CMS_EV_NO_KU_CHECK - Dont check KU on certificate + * - HX509_CMS_EV_NO_KU_CHECK - Don't check KU on certificate * - HX509_CMS_EV_ALLOW_WEAK - Allow weak crytpo * - HX509_CMS_EV_ID_NAME - prefer issuer name and serial number * @param cert Certificate to encrypt the EnvelopedData encryption key @@ -544,6 +550,8 @@ * @param content the output of the function, * free with der_free_octet_string(). * + * @return an hx509 error code. + * * @ingroup hx509_cms */ @@ -726,14 +734,18 @@ return 0; for (i = 0; i < sd->certificates->len; i++) { + heim_error_t error; hx509_cert c; - ret = hx509_cert_init_data(context, - sd->certificates->val[i].data, - sd->certificates->val[i].length, - &c); - if (ret) + c = hx509_cert_init_data(context, + sd->certificates->val[i].data, + sd->certificates->val[i].length, + &error); + if (c == NULL) { + ret = heim_error_get_code(error); + heim_release(error); return ret; + } ret = hx509_certs_add(context, certs, c); hx509_cert_free(c); if (ret) @@ -772,6 +784,8 @@ * @param signer_certs list of the cerficates used to sign this * request, free with hx509_certs_free(). * + * @return an hx509 error code. + * * @ingroup hx509_cms */ @@ -855,7 +869,7 @@ } for (found_valid_sig = 0, i = 0; i < sd.signerInfos.len; i++) { - heim_octet_string signed_data; + heim_octet_string signed_data = { 0, 0 }; const heim_oid *match_oid; heim_oid decode_oid; @@ -1016,8 +1030,10 @@ "Failed to verify signature in " "CMS SignedData"); } - if (signer_info->signedAttrs) - free(signed_data.data); + if (signed_data.data != NULL && content->data != signed_data.data) { + free(signed_data.data); + signed_data.data = NULL; + } if (ret) goto next_sigature; @@ -1137,6 +1153,8 @@ * @param signed_data the output of the function, free with * der_free_octet_string(). * + * @return Returns an hx509 error code. + * * @ingroup hx509_cms */ diff --git a/crypto/heimdal/lib/hx509/crypto-ec.c b/crypto/heimdal/lib/hx509/crypto-ec.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/crypto-ec.c @@ -0,0 +1,533 @@ +/* + * Copyright (c) 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#ifdef HAVE_HCRYPTO_W_OPENSSL +#include +#include +#include +#include +#include +#define HEIM_NO_CRYPTO_HDRS +#endif /* HAVE_HCRYPTO_W_OPENSSL */ + +#include "hx_locl.h" + +extern const AlgorithmIdentifier _hx509_signature_sha512_data; +extern const AlgorithmIdentifier _hx509_signature_sha384_data; +extern const AlgorithmIdentifier _hx509_signature_sha256_data; +extern const AlgorithmIdentifier _hx509_signature_sha1_data; + +void +_hx509_private_eckey_free(void *eckey) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + EC_KEY_free(eckey); +#endif +} + +#ifdef HAVE_HCRYPTO_W_OPENSSL +static int +heim_oid2ecnid(heim_oid *oid) +{ + /* + * Now map to openssl OID fun + */ + + if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP256R1) == 0) + return NID_X9_62_prime256v1; +#ifdef NID_secp521r1 + else if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP521R1) == 0) + return NID_secp521r1; +#endif +#ifdef NID_secp384r1 + else if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP384R1) == 0) + return NID_secp384r1; +#endif +#ifdef NID_secp160r1 + else if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP160R1) == 0) + return NID_secp160r1; +#endif +#ifdef NID_secp160r2 + else if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP160R2) == 0) + return NID_secp160r2; +#endif + + return NID_undef; +} + +static int +parse_ECParameters(hx509_context context, + heim_octet_string *parameters, int *nid) +{ + ECParameters ecparam; + size_t size; + int ret; + + if (parameters == NULL) { + ret = HX509_PARSING_KEY_FAILED; + hx509_set_error_string(context, 0, ret, + "EC parameters missing"); + return ret; + } + + ret = decode_ECParameters(parameters->data, parameters->length, + &ecparam, &size); + if (ret) { + hx509_set_error_string(context, 0, ret, + "Failed to decode EC parameters"); + return ret; + } + + if (ecparam.element != choice_ECParameters_namedCurve) { + free_ECParameters(&ecparam); + hx509_set_error_string(context, 0, ret, + "EC parameters is not a named curve"); + return HX509_CRYPTO_SIG_INVALID_FORMAT; + } + + *nid = heim_oid2ecnid(&ecparam.u.namedCurve); + free_ECParameters(&ecparam); + if (*nid == NID_undef) { + hx509_set_error_string(context, 0, ret, + "Failed to find matcing NID for EC curve"); + return HX509_CRYPTO_SIG_INVALID_FORMAT; + } + return 0; +} + + +/* + * + */ + +static int +ecdsa_verify_signature(hx509_context context, + const struct signature_alg *sig_alg, + const Certificate *signer, + const AlgorithmIdentifier *alg, + const heim_octet_string *data, + const heim_octet_string *sig) +{ + const AlgorithmIdentifier *digest_alg; + const SubjectPublicKeyInfo *spi; + heim_octet_string digest; + int ret; + EC_KEY *key = NULL; + int groupnid; + EC_GROUP *group; + const unsigned char *p; + long len; + + digest_alg = sig_alg->digest_alg; + + ret = _hx509_create_signature(context, + NULL, + digest_alg, + data, + NULL, + &digest); + if (ret) + return ret; + + /* set up EC KEY */ + spi = &signer->tbsCertificate.subjectPublicKeyInfo; + + if (der_heim_oid_cmp(&spi->algorithm.algorithm, ASN1_OID_ID_ECPUBLICKEY) != 0) + return HX509_CRYPTO_SIG_INVALID_FORMAT; + + /* + * Find the group id + */ + + ret = parse_ECParameters(context, spi->algorithm.parameters, &groupnid); + if (ret) { + der_free_octet_string(&digest); + return ret; + } + + /* + * Create group, key, parse key + */ + + key = EC_KEY_new(); + group = EC_GROUP_new_by_curve_name(groupnid); + EC_KEY_set_group(key, group); + EC_GROUP_free(group); + + p = spi->subjectPublicKey.data; + len = spi->subjectPublicKey.length / 8; + + if (o2i_ECPublicKey(&key, &p, len) == NULL) { + EC_KEY_free(key); + return HX509_CRYPTO_SIG_INVALID_FORMAT; + } + + ret = ECDSA_verify(-1, digest.data, digest.length, + sig->data, sig->length, key); + der_free_octet_string(&digest); + EC_KEY_free(key); + if (ret != 1) { + ret = HX509_CRYPTO_SIG_INVALID_FORMAT; + return ret; + } + + return 0; +} + +static int +ecdsa_create_signature(hx509_context context, + const struct signature_alg *sig_alg, + const hx509_private_key signer, + const AlgorithmIdentifier *alg, + const heim_octet_string *data, + AlgorithmIdentifier *signatureAlgorithm, + heim_octet_string *sig) +{ + const AlgorithmIdentifier *digest_alg; + heim_octet_string indata; + const heim_oid *sig_oid; + unsigned int siglen; + int ret; + + if (signer->ops && der_heim_oid_cmp(signer->ops->key_oid, ASN1_OID_ID_ECPUBLICKEY) != 0) + _hx509_abort("internal error passing private key to wrong ops"); + + sig_oid = sig_alg->sig_oid; + digest_alg = sig_alg->digest_alg; + + if (signatureAlgorithm) { + ret = _hx509_set_digest_alg(signatureAlgorithm, sig_oid, + "\x05\x00", 2); + if (ret) { + hx509_clear_error_string(context); + return ret; + } + } + + ret = _hx509_create_signature(context, + NULL, + digest_alg, + data, + NULL, + &indata); + if (ret) + goto error; + + sig->length = ECDSA_size(signer->private_key.ecdsa); + sig->data = malloc(sig->length); + if (sig->data == NULL) { + der_free_octet_string(&indata); + ret = ENOMEM; + hx509_set_error_string(context, 0, ret, "out of memory"); + goto error; + } + + siglen = sig->length; + + ret = ECDSA_sign(-1, indata.data, indata.length, + sig->data, &siglen, signer->private_key.ecdsa); + der_free_octet_string(&indata); + if (ret != 1) { + ret = HX509_CMS_FAILED_CREATE_SIGATURE; + hx509_set_error_string(context, 0, ret, + "ECDSA sign failed: %d", ret); + goto error; + } + if (siglen > sig->length) + _hx509_abort("ECDSA signature prelen longer the output len"); + + sig->length = siglen; + + return 0; + error: + if (signatureAlgorithm) + free_AlgorithmIdentifier(signatureAlgorithm); + return ret; +} + +static int +ecdsa_available(const hx509_private_key signer, + const AlgorithmIdentifier *sig_alg) +{ + const struct signature_alg *sig; + const EC_GROUP *group; + BN_CTX *bnctx = NULL; + BIGNUM *order = NULL; + int ret = 0; + + if (der_heim_oid_cmp(signer->ops->key_oid, &asn1_oid_id_ecPublicKey) != 0) + _hx509_abort("internal error passing private key to wrong ops"); + + sig = _hx509_find_sig_alg(&sig_alg->algorithm); + + if (sig == NULL || sig->digest_size == 0) + return 0; + + group = EC_KEY_get0_group(signer->private_key.ecdsa); + if (group == NULL) + return 0; + + bnctx = BN_CTX_new(); + order = BN_new(); + if (order == NULL) + goto err; + + if (EC_GROUP_get_order(group, order, bnctx) != 1) + goto err; + +#if 0 + /* If anything, require a digest at least as wide as the EC key size */ + if (BN_num_bytes(order) > sig->digest_size) +#endif + ret = 1; + err: + if (bnctx) + BN_CTX_free(bnctx); + if (order) + BN_clear_free(order); + + return ret; +} + +static int +ecdsa_private_key2SPKI(hx509_context context, + hx509_private_key private_key, + SubjectPublicKeyInfo *spki) +{ + memset(spki, 0, sizeof(*spki)); + return ENOMEM; +} + +static int +ecdsa_private_key_export(hx509_context context, + const hx509_private_key key, + hx509_key_format_t format, + heim_octet_string *data) +{ + return HX509_CRYPTO_KEY_FORMAT_UNSUPPORTED; +} + +static int +ecdsa_private_key_import(hx509_context context, + const AlgorithmIdentifier *keyai, + const void *data, + size_t len, + hx509_key_format_t format, + hx509_private_key private_key) +{ + const unsigned char *p = data; + EC_KEY **pkey = NULL; + EC_KEY *key; + + if (keyai->parameters) { + EC_GROUP *group; + int groupnid; + int ret; + + ret = parse_ECParameters(context, keyai->parameters, &groupnid); + if (ret) + return ret; + + key = EC_KEY_new(); + if (key == NULL) + return ENOMEM; + + group = EC_GROUP_new_by_curve_name(groupnid); + if (group == NULL) { + EC_KEY_free(key); + return ENOMEM; + } + EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); + if (EC_KEY_set_group(key, group) == 0) { + EC_KEY_free(key); + EC_GROUP_free(group); + return ENOMEM; + } + EC_GROUP_free(group); + pkey = &key; + } + + switch (format) { + case HX509_KEY_FORMAT_DER: + + private_key->private_key.ecdsa = d2i_ECPrivateKey(pkey, &p, len); + if (private_key->private_key.ecdsa == NULL) { + hx509_set_error_string(context, 0, HX509_PARSING_KEY_FAILED, + "Failed to parse EC private key"); + return HX509_PARSING_KEY_FAILED; + } + private_key->signature_alg = ASN1_OID_ID_ECDSA_WITH_SHA256; + break; + + default: + return HX509_CRYPTO_KEY_FORMAT_UNSUPPORTED; + } + + return 0; +} + +static int +ecdsa_generate_private_key(hx509_context context, + struct hx509_generate_private_context *ctx, + hx509_private_key private_key) +{ + return ENOMEM; +} + +static BIGNUM * +ecdsa_get_internal(hx509_context context, + hx509_private_key key, + const char *type) +{ + return NULL; +} + +static const unsigned ecPublicKey[] ={ 1, 2, 840, 10045, 2, 1 }; +const AlgorithmIdentifier _hx509_signature_ecPublicKey = { + { 6, rk_UNCONST(ecPublicKey) }, NULL +}; + +static const unsigned ecdsa_with_sha256_oid[] ={ 1, 2, 840, 10045, 4, 3, 2 }; +const AlgorithmIdentifier _hx509_signature_ecdsa_with_sha256_data = { + { 7, rk_UNCONST(ecdsa_with_sha256_oid) }, NULL +}; + +static const unsigned ecdsa_with_sha384_oid[] ={ 1, 2, 840, 10045, 4, 3, 3 }; +const AlgorithmIdentifier _hx509_signature_ecdsa_with_sha384_data = { + { 7, rk_UNCONST(ecdsa_with_sha384_oid) }, NULL +}; + +static const unsigned ecdsa_with_sha512_oid[] ={ 1, 2, 840, 10045, 4, 3, 4 }; +const AlgorithmIdentifier _hx509_signature_ecdsa_with_sha512_data = { + { 7, rk_UNCONST(ecdsa_with_sha512_oid) }, NULL +}; + +static const unsigned ecdsa_with_sha1_oid[] ={ 1, 2, 840, 10045, 4, 1 }; +const AlgorithmIdentifier _hx509_signature_ecdsa_with_sha1_data = { + { 6, rk_UNCONST(ecdsa_with_sha1_oid) }, NULL +}; + +hx509_private_key_ops ecdsa_private_key_ops = { + "EC PRIVATE KEY", + ASN1_OID_ID_ECPUBLICKEY, + ecdsa_available, + ecdsa_private_key2SPKI, + ecdsa_private_key_export, + ecdsa_private_key_import, + ecdsa_generate_private_key, + ecdsa_get_internal +}; + +const struct signature_alg ecdsa_with_sha512_alg = { + "ecdsa-with-sha512", + ASN1_OID_ID_ECDSA_WITH_SHA512, + &_hx509_signature_ecdsa_with_sha512_data, + ASN1_OID_ID_ECPUBLICKEY, + &_hx509_signature_sha512_data, + PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO| + SIG_PUBLIC_SIG|SELF_SIGNED_OK, + 0, + NULL, + ecdsa_verify_signature, + ecdsa_create_signature, + 64 +}; + +const struct signature_alg ecdsa_with_sha384_alg = { + "ecdsa-with-sha384", + ASN1_OID_ID_ECDSA_WITH_SHA384, + &_hx509_signature_ecdsa_with_sha384_data, + ASN1_OID_ID_ECPUBLICKEY, + &_hx509_signature_sha384_data, + PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO| + SIG_PUBLIC_SIG|SELF_SIGNED_OK, + 0, + NULL, + ecdsa_verify_signature, + ecdsa_create_signature, + 48 +}; + +const struct signature_alg ecdsa_with_sha256_alg = { + "ecdsa-with-sha256", + ASN1_OID_ID_ECDSA_WITH_SHA256, + &_hx509_signature_ecdsa_with_sha256_data, + ASN1_OID_ID_ECPUBLICKEY, + &_hx509_signature_sha256_data, + PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO| + SIG_PUBLIC_SIG|SELF_SIGNED_OK, + 0, + NULL, + ecdsa_verify_signature, + ecdsa_create_signature, + 32 +}; + +const struct signature_alg ecdsa_with_sha1_alg = { + "ecdsa-with-sha1", + ASN1_OID_ID_ECDSA_WITH_SHA1, + &_hx509_signature_ecdsa_with_sha1_data, + ASN1_OID_ID_ECPUBLICKEY, + &_hx509_signature_sha1_data, + PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO| + SIG_PUBLIC_SIG|SELF_SIGNED_OK, + 0, + NULL, + ecdsa_verify_signature, + ecdsa_create_signature, + 20 +}; + +#endif /* HAVE_HCRYPTO_W_OPENSSL */ + +const AlgorithmIdentifier * +hx509_signature_ecPublicKey(void) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + return &_hx509_signature_ecPublicKey; +#else + return NULL; +#endif /* HAVE_HCRYPTO_W_OPENSSL */ +} + +const AlgorithmIdentifier * +hx509_signature_ecdsa_with_sha256(void) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + return &_hx509_signature_ecdsa_with_sha256_data; +#else + return NULL; +#endif /* HAVE_HCRYPTO_W_OPENSSL */ +} diff --git a/crypto/heimdal/lib/hx509/crypto.c b/crypto/heimdal/lib/hx509/crypto.c --- a/crypto/heimdal/lib/hx509/crypto.c +++ b/crypto/heimdal/lib/hx509/crypto.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004 - 2007 Kungliga Tekniska Högskolan + * Copyright (c) 2004 - 2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -33,95 +33,12 @@ #include "hx_locl.h" -struct hx509_crypto; - -struct signature_alg; - -struct hx509_generate_private_context { - const heim_oid *key_oid; - int isCA; - unsigned long num_bits; -}; - -struct hx509_private_key_ops { - const char *pemtype; - const heim_oid *key_oid; - int (*available)(const hx509_private_key, - const AlgorithmIdentifier *); - int (*get_spki)(hx509_context, - const hx509_private_key, - SubjectPublicKeyInfo *); - int (*export)(hx509_context context, - const hx509_private_key, - hx509_key_format_t, - heim_octet_string *); - int (*import)(hx509_context, const AlgorithmIdentifier *, - const void *, size_t, hx509_key_format_t, - hx509_private_key); - int (*generate_private_key)(hx509_context, - struct hx509_generate_private_context *, - hx509_private_key); - BIGNUM *(*get_internal)(hx509_context, hx509_private_key, const char *); -}; - -struct hx509_private_key { - unsigned int ref; - const struct signature_alg *md; - const heim_oid *signature_alg; - union { - RSA *rsa; - void *keydata; -#ifdef HAVE_OPENSSL - EC_KEY *ecdsa; -#endif - } private_key; - hx509_private_key_ops *ops; -}; - -/* - * - */ - -struct signature_alg { - const char *name; - const heim_oid *sig_oid; - const AlgorithmIdentifier *sig_alg; - const heim_oid *key_oid; - const AlgorithmIdentifier *digest_alg; - int flags; -#define PROVIDE_CONF 0x1 -#define REQUIRE_SIGNER 0x2 -#define SELF_SIGNED_OK 0x4 - -#define SIG_DIGEST 0x100 -#define SIG_PUBLIC_SIG 0x200 -#define SIG_SECRET 0x400 - -#define RA_RSA_USES_DIGEST_INFO 0x1000000 - - time_t best_before; /* refuse signature made after best before date */ - const EVP_MD *(*evp_md)(void); - int (*verify_signature)(hx509_context context, - const struct signature_alg *, - const Certificate *, - const AlgorithmIdentifier *, - const heim_octet_string *, - const heim_octet_string *); - int (*create_signature)(hx509_context, - const struct signature_alg *, - const hx509_private_key, - const AlgorithmIdentifier *, - const heim_octet_string *, - AlgorithmIdentifier *, - heim_octet_string *); - int digest_size; -}; - -static const struct signature_alg * -find_sig_alg(const heim_oid *oid); - -/* +/*- + * RFC5758 specifies no parameters for ecdsa-with-SHA signatures + * RFC5754 specifies NULL parameters for shaWithRSAEncryption signatures * + * XXX: Make sure that the parameters are either NULL in both the tbs and the + * signature, or absent from both the tbs and the signature. */ static const heim_octet_string null_entry_oid = { 2, rk_UNCONST("\x05\x00") }; @@ -151,44 +68,29 @@ { 6, rk_UNCONST(md5_oid_tree) }, rk_UNCONST(&null_entry_oid) }; -static const unsigned ecPublicKey[] ={ 1, 2, 840, 10045, 2, 1 }; -const AlgorithmIdentifier _hx509_signature_ecPublicKey = { - { 6, rk_UNCONST(ecPublicKey) }, NULL -}; - -static const unsigned ecdsa_with_sha256_oid[] ={ 1, 2, 840, 10045, 4, 3, 2 }; -const AlgorithmIdentifier _hx509_signature_ecdsa_with_sha256_data = { - { 7, rk_UNCONST(ecdsa_with_sha256_oid) }, NULL -}; - -static const unsigned ecdsa_with_sha1_oid[] ={ 1, 2, 840, 10045, 4, 1 }; -const AlgorithmIdentifier _hx509_signature_ecdsa_with_sha1_data = { - { 6, rk_UNCONST(ecdsa_with_sha1_oid) }, NULL -}; - static const unsigned rsa_with_sha512_oid[] ={ 1, 2, 840, 113549, 1, 1, 13 }; const AlgorithmIdentifier _hx509_signature_rsa_with_sha512_data = { - { 7, rk_UNCONST(rsa_with_sha512_oid) }, NULL + { 7, rk_UNCONST(rsa_with_sha512_oid) }, rk_UNCONST(&null_entry_oid) }; static const unsigned rsa_with_sha384_oid[] ={ 1, 2, 840, 113549, 1, 1, 12 }; const AlgorithmIdentifier _hx509_signature_rsa_with_sha384_data = { - { 7, rk_UNCONST(rsa_with_sha384_oid) }, NULL + { 7, rk_UNCONST(rsa_with_sha384_oid) }, rk_UNCONST(&null_entry_oid) }; static const unsigned rsa_with_sha256_oid[] ={ 1, 2, 840, 113549, 1, 1, 11 }; const AlgorithmIdentifier _hx509_signature_rsa_with_sha256_data = { - { 7, rk_UNCONST(rsa_with_sha256_oid) }, NULL + { 7, rk_UNCONST(rsa_with_sha256_oid) }, rk_UNCONST(&null_entry_oid) }; static const unsigned rsa_with_sha1_oid[] ={ 1, 2, 840, 113549, 1, 1, 5 }; const AlgorithmIdentifier _hx509_signature_rsa_with_sha1_data = { - { 7, rk_UNCONST(rsa_with_sha1_oid) }, NULL + { 7, rk_UNCONST(rsa_with_sha1_oid) }, rk_UNCONST(&null_entry_oid) }; static const unsigned rsa_with_md5_oid[] ={ 1, 2, 840, 113549, 1, 1, 4 }; const AlgorithmIdentifier _hx509_signature_rsa_with_md5_data = { - { 7, rk_UNCONST(rsa_with_md5_oid) }, NULL + { 7, rk_UNCONST(rsa_with_md5_oid) }, rk_UNCONST(&null_entry_oid) }; static const unsigned rsa_oid[] ={ 1, 2, 840, 113549, 1, 1, 1 }; @@ -226,8 +128,7 @@ BIGNUM *bn; bn = BN_bin2bn(i->data, i->length, NULL); - if (bn != NULL) - BN_set_negative(bn, i->negative); + BN_set_negative(bn, i->negative); return bn; } @@ -235,10 +136,10 @@ * */ -static int -set_digest_alg(DigestAlgorithmIdentifier *id, - const heim_oid *oid, - const void *param, size_t length) +int +_hx509_set_digest_alg(DigestAlgorithmIdentifier *id, + const heim_oid *oid, + const void *param, size_t length) { int ret; if (param) { @@ -267,265 +168,6 @@ return 0; } -#ifdef HAVE_OPENSSL - -static int -heim_oid2ecnid(heim_oid *oid) -{ - /* - * Now map to openssl OID fun - */ - - if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP256R1) == 0) - return NID_X9_62_prime256v1; - else if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP160R1) == 0) - return NID_secp160r1; - else if (der_heim_oid_cmp(oid, ASN1_OID_ID_EC_GROUP_SECP160R2) == 0) - return NID_secp160r2; - - return -1; -} - -static int -parse_ECParameters(hx509_context context, - heim_octet_string *parameters, int *nid) -{ - ECParameters ecparam; - size_t size; - int ret; - - if (parameters == NULL) { - ret = HX509_PARSING_KEY_FAILED; - hx509_set_error_string(context, 0, ret, - "EC parameters missing"); - return ret; - } - - ret = decode_ECParameters(parameters->data, parameters->length, - &ecparam, &size); - if (ret) { - hx509_set_error_string(context, 0, ret, - "Failed to decode EC parameters"); - return ret; - } - - if (ecparam.element != choice_ECParameters_namedCurve) { - free_ECParameters(&ecparam); - hx509_set_error_string(context, 0, ret, - "EC parameters is not a named curve"); - return HX509_CRYPTO_SIG_INVALID_FORMAT; - } - - *nid = heim_oid2ecnid(&ecparam.u.namedCurve); - free_ECParameters(&ecparam); - if (*nid == -1) { - hx509_set_error_string(context, 0, ret, - "Failed to find matcing NID for EC curve"); - return HX509_CRYPTO_SIG_INVALID_FORMAT; - } - return 0; -} - - -/* - * - */ - -static int -ecdsa_verify_signature(hx509_context context, - const struct signature_alg *sig_alg, - const Certificate *signer, - const AlgorithmIdentifier *alg, - const heim_octet_string *data, - const heim_octet_string *sig) -{ - const AlgorithmIdentifier *digest_alg; - const SubjectPublicKeyInfo *spi; - heim_octet_string digest; - int ret; - EC_KEY *key = NULL; - int groupnid; - EC_GROUP *group; - const unsigned char *p; - long len; - - digest_alg = sig_alg->digest_alg; - - ret = _hx509_create_signature(context, - NULL, - digest_alg, - data, - NULL, - &digest); - if (ret) - return ret; - - /* set up EC KEY */ - spi = &signer->tbsCertificate.subjectPublicKeyInfo; - - if (der_heim_oid_cmp(&spi->algorithm.algorithm, ASN1_OID_ID_ECPUBLICKEY) != 0) - return HX509_CRYPTO_SIG_INVALID_FORMAT; - -#ifdef HAVE_OPENSSL - /* - * Find the group id - */ - - ret = parse_ECParameters(context, spi->algorithm.parameters, &groupnid); - if (ret) { - der_free_octet_string(&digest); - return ret; - } - - /* - * Create group, key, parse key - */ - - key = EC_KEY_new(); - group = EC_GROUP_new_by_curve_name(groupnid); - EC_KEY_set_group(key, group); - EC_GROUP_free(group); - - p = spi->subjectPublicKey.data; - len = spi->subjectPublicKey.length / 8; - - if (o2i_ECPublicKey(&key, &p, len) == NULL) { - EC_KEY_free(key); - return HX509_CRYPTO_SIG_INVALID_FORMAT; - } -#else - key = SubjectPublicKeyInfo2EC_KEY(spi); -#endif - - ret = ECDSA_verify(-1, digest.data, digest.length, - sig->data, sig->length, key); - der_free_octet_string(&digest); - EC_KEY_free(key); - if (ret != 1) { - ret = HX509_CRYPTO_SIG_INVALID_FORMAT; - return ret; - } - - return 0; -} - -static int -ecdsa_create_signature(hx509_context context, - const struct signature_alg *sig_alg, - const hx509_private_key signer, - const AlgorithmIdentifier *alg, - const heim_octet_string *data, - AlgorithmIdentifier *signatureAlgorithm, - heim_octet_string *sig) -{ - const AlgorithmIdentifier *digest_alg; - heim_octet_string indata; - const heim_oid *sig_oid; - unsigned int siglen; - int ret; - - if (signer->ops && der_heim_oid_cmp(signer->ops->key_oid, ASN1_OID_ID_ECPUBLICKEY) != 0) - _hx509_abort("internal error passing private key to wrong ops"); - - sig_oid = sig_alg->sig_oid; - digest_alg = sig_alg->digest_alg; - - if (signatureAlgorithm) { - ret = set_digest_alg(signatureAlgorithm, sig_oid, "\x05\x00", 2); - if (ret) { - hx509_clear_error_string(context); - goto error; - } - } - - ret = _hx509_create_signature(context, - NULL, - digest_alg, - data, - NULL, - &indata); - if (ret) { - if (signatureAlgorithm) - free_AlgorithmIdentifier(signatureAlgorithm); - goto error; - } - - sig->length = ECDSA_size(signer->private_key.ecdsa); - sig->data = malloc(sig->length); - if (sig->data == NULL) { - der_free_octet_string(&indata); - ret = ENOMEM; - hx509_set_error_string(context, 0, ret, "out of memory"); - goto error; - } - - siglen = sig->length; - - ret = ECDSA_sign(-1, indata.data, indata.length, - sig->data, &siglen, signer->private_key.ecdsa); - der_free_octet_string(&indata); - if (ret != 1) { - ret = HX509_CMS_FAILED_CREATE_SIGATURE; - hx509_set_error_string(context, 0, ret, - "ECDSA sign failed: %d", ret); - goto error; - } - if (siglen > sig->length) - _hx509_abort("ECDSA signature prelen longer the output len"); - - sig->length = siglen; - - return 0; - error: - if (signatureAlgorithm) - free_AlgorithmIdentifier(signatureAlgorithm); - return ret; -} - -static int -ecdsa_available(const hx509_private_key signer, - const AlgorithmIdentifier *sig_alg) -{ - const struct signature_alg *sig; - const EC_GROUP *group; - BN_CTX *bnctx = NULL; - BIGNUM *order = NULL; - int ret = 0; - - if (der_heim_oid_cmp(signer->ops->key_oid, &asn1_oid_id_ecPublicKey) != 0) - _hx509_abort("internal error passing private key to wrong ops"); - - sig = find_sig_alg(&sig_alg->algorithm); - - if (sig == NULL || sig->digest_size == 0) - return 0; - - group = EC_KEY_get0_group(signer->private_key.ecdsa); - if (group == NULL) - return 0; - - bnctx = BN_CTX_new(); - order = BN_new(); - if (order == NULL) - goto err; - - if (EC_GROUP_get_order(group, order, bnctx) != 1) - goto err; - - if (BN_num_bytes(order) > sig->digest_size) - ret = 1; - err: - if (bnctx) - BN_CTX_free(bnctx); - if (order) - BN_clear_free(order); - - return ret; -} - - -#endif /* HAVE_OPENSSL */ - /* * */ @@ -620,6 +262,9 @@ &di.digestAlgorithm, data, &di.digest); + if (ret) + goto out; + } else { if ((size_t)retsize != data->length || ct_memcmp(to, data->data, retsize) != 0) @@ -629,8 +274,8 @@ goto out; } free(to); + ret = 0; } - ret = 0; out: free_DigestInfo(&di); @@ -684,7 +329,8 @@ return HX509_ALG_NOT_SUPP; if (signatureAlgorithm) { - ret = set_digest_alg(signatureAlgorithm, sig_oid, "\x05\x00", 2); + ret = _hx509_set_digest_alg(signatureAlgorithm, sig_oid, + "\x05\x00", 2); if (ret) { hx509_clear_error_string(context); return ret; @@ -740,11 +386,13 @@ "RSA private encrypt failed: %d", ret); return ret; } - if ((size_t)ret > sig->length) + if (sig->length > (size_t)ret) { + size = sig->length - ret; + memmove((uint8_t *)sig->data + size, sig->data, ret); + memset(sig->data, 0, size); + } else if (sig->length < (size_t)ret) _hx509_abort("RSA signature prelen longer the output len"); - sig->length = ret; - return 0; } @@ -796,8 +444,9 @@ } spki->subjectPublicKey.length = len * 8; - ret = set_digest_alg(&spki->algorithm, ASN1_OID_ID_PKCS1_RSAENCRYPTION, - "\x05\x00", 2); + ret = _hx509_set_digest_alg(&spki->algorithm, + ASN1_OID_ID_PKCS1_RSAENCRYPTION, + "\x05\x00", 2); if (ret) { hx509_set_error_string(context, 0, ret, "malloc - out of memory"); free(spki->subjectPublicKey.data); @@ -900,15 +549,12 @@ hx509_private_key key, const char *type) { - const BIGNUM *n; - if (strcasecmp(type, "rsa-modulus") == 0) { - RSA_get0_key(key->private_key.rsa, &n, NULL, NULL); + return BN_dup(key->private_key.rsa->n); } else if (strcasecmp(type, "rsa-exponent") == 0) { - RSA_get0_key(key->private_key.rsa, NULL, &n, NULL); + return BN_dup(key->private_key.rsa->e); } else return NULL; - return BN_dup(n); } @@ -924,115 +570,6 @@ rsa_get_internal }; -#ifdef HAVE_OPENSSL - -static int -ecdsa_private_key2SPKI(hx509_context context, - hx509_private_key private_key, - SubjectPublicKeyInfo *spki) -{ - memset(spki, 0, sizeof(*spki)); - return ENOMEM; -} - -static int -ecdsa_private_key_export(hx509_context context, - const hx509_private_key key, - hx509_key_format_t format, - heim_octet_string *data) -{ - return HX509_CRYPTO_KEY_FORMAT_UNSUPPORTED; -} - -static int -ecdsa_private_key_import(hx509_context context, - const AlgorithmIdentifier *keyai, - const void *data, - size_t len, - hx509_key_format_t format, - hx509_private_key private_key) -{ - const unsigned char *p = data; - EC_KEY **pkey = NULL; - - if (keyai->parameters) { - EC_GROUP *group; - int groupnid; - EC_KEY *key; - int ret; - - ret = parse_ECParameters(context, keyai->parameters, &groupnid); - if (ret) - return ret; - - key = EC_KEY_new(); - if (key == NULL) - return ENOMEM; - - group = EC_GROUP_new_by_curve_name(groupnid); - if (group == NULL) { - EC_KEY_free(key); - return ENOMEM; - } - EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE); - if (EC_KEY_set_group(key, group) == 0) { - EC_KEY_free(key); - EC_GROUP_free(group); - return ENOMEM; - } - EC_GROUP_free(group); - pkey = &key; - } - - switch (format) { - case HX509_KEY_FORMAT_DER: - - private_key->private_key.ecdsa = d2i_ECPrivateKey(pkey, &p, len); - if (private_key->private_key.ecdsa == NULL) { - hx509_set_error_string(context, 0, HX509_PARSING_KEY_FAILED, - "Failed to parse EC private key"); - return HX509_PARSING_KEY_FAILED; - } - private_key->signature_alg = ASN1_OID_ID_ECDSA_WITH_SHA256; - break; - - default: - return HX509_CRYPTO_KEY_FORMAT_UNSUPPORTED; - } - - return 0; -} - -static int -ecdsa_generate_private_key(hx509_context context, - struct hx509_generate_private_context *ctx, - hx509_private_key private_key) -{ - return ENOMEM; -} - -static BIGNUM * -ecdsa_get_internal(hx509_context context, - hx509_private_key key, - const char *type) -{ - return NULL; -} - - -static hx509_private_key_ops ecdsa_private_key_ops = { - "EC PRIVATE KEY", - ASN1_OID_ID_ECPUBLICKEY, - ecdsa_available, - ecdsa_private_key2SPKI, - ecdsa_private_key_export, - ecdsa_private_key_import, - ecdsa_generate_private_key, - ecdsa_get_internal -}; - -#endif /* HAVE_OPENSSL */ - /* * */ @@ -1049,7 +586,6 @@ DSAPublicKey pk; DSAParams param; size_t size; - BIGNUM *key, *p, *q, *g; DSA *dsa; int ret; @@ -1067,25 +603,16 @@ if (ret) goto out; - key = heim_int2BN(&pk); + dsa->pub_key = heim_int2BN(&pk); free_DSAPublicKey(&pk); - if (key == NULL) { + if (dsa->pub_key == NULL) { ret = ENOMEM; hx509_set_error_string(context, 0, ret, "out of memory"); goto out; } - ret = DSA_set0_key(dsa, key, NULL); - - if (ret != 1) { - BN_free(key); - ret = EINVAL; - hx509_set_error_string(context, 0, ret, "failed to set DSA key"); - goto out; - } - if (spi->algorithm.parameters == NULL) { ret = HX509_CRYPTO_SIG_INVALID_FORMAT; hx509_set_error_string(context, 0, ret, "DSA parameters missing"); @@ -1101,32 +628,18 @@ goto out; } - p = heim_int2BN(¶m.p); - q = heim_int2BN(¶m.q); - g = heim_int2BN(¶m.g); + dsa->p = heim_int2BN(¶m.p); + dsa->q = heim_int2BN(¶m.q); + dsa->g = heim_int2BN(¶m.g); free_DSAParams(¶m); - if (p == NULL || q == NULL || g == NULL) { - BN_free(p); - BN_free(q); - BN_free(g); + if (dsa->p == NULL || dsa->q == NULL || dsa->g == NULL) { ret = ENOMEM; hx509_set_error_string(context, 0, ret, "out of memory"); goto out; } - ret = DSA_set0_pqg(dsa, p, q, g); - - if (ret != 1) { - BN_free(p); - BN_free(q); - BN_free(g); - ret = EINVAL; - hx509_set_error_string(context, 0, ret, "failed to set DSA parameters"); - goto out; - } - ret = DSA_verify(-1, data->data, data->length, (unsigned char*)sig->data, sig->length, dsa); @@ -1185,8 +698,8 @@ if (signatureAlgorithm) { int ret; - ret = set_digest_alg(signatureAlgorithm, sig_alg->sig_oid, - "\x05\x00", 2); + ret = _hx509_set_digest_alg(signatureAlgorithm, + sig_alg->sig_oid, "\x05\x00", 2); if (ret) return ret; } @@ -1242,36 +755,11 @@ return 0; } -#ifdef HAVE_OPENSSL - -static const struct signature_alg ecdsa_with_sha256_alg = { - "ecdsa-with-sha256", - ASN1_OID_ID_ECDSA_WITH_SHA256, - &_hx509_signature_ecdsa_with_sha256_data, - ASN1_OID_ID_ECPUBLICKEY, - &_hx509_signature_sha256_data, - PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG|SELF_SIGNED_OK, - 0, - NULL, - ecdsa_verify_signature, - ecdsa_create_signature, - 32 -}; - -static const struct signature_alg ecdsa_with_sha1_alg = { - "ecdsa-with-sha1", - ASN1_OID_ID_ECDSA_WITH_SHA1, - &_hx509_signature_ecdsa_with_sha1_data, - ASN1_OID_ID_ECPUBLICKEY, - &_hx509_signature_sha1_data, - PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG|SELF_SIGNED_OK, - 0, - NULL, - ecdsa_verify_signature, - ecdsa_create_signature, - 20 -}; - +#ifdef HAVE_HCRYPTO_W_OPENSSL +extern const struct signature_alg ecdsa_with_sha512_alg; +extern const struct signature_alg ecdsa_with_sha384_alg; +extern const struct signature_alg ecdsa_with_sha256_alg; +extern const struct signature_alg ecdsa_with_sha1_alg; #endif static const struct signature_alg heim_rsa_pkcs1_x509 = { @@ -1378,7 +866,7 @@ &_hx509_signature_rsa_with_md5_data, ASN1_OID_ID_PKCS1_RSAENCRYPTION, &_hx509_signature_md5_data, - PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG, + PROVIDE_CONF|REQUIRE_SIGNER|RA_RSA_USES_DIGEST_INFO|SIG_PUBLIC_SIG|WEAK_SIG_ALG, 1230739889, NULL, rsa_verify_signature, @@ -1416,7 +904,7 @@ static const struct signature_alg sha384_alg = { "sha-384", - ASN1_OID_ID_SHA512, + ASN1_OID_ID_SHA384, &_hx509_signature_sha384_data, NULL, NULL, @@ -1462,7 +950,7 @@ &_hx509_signature_md5_data, NULL, NULL, - SIG_DIGEST, + SIG_DIGEST|WEAK_SIG_ALG, 0, EVP_md5, evp_md_verify_signature, @@ -1476,7 +964,9 @@ */ static const struct signature_alg *sig_algs[] = { -#ifdef HAVE_OPENSSL +#ifdef HAVE_HCRYPTO_W_OPENSSL + &ecdsa_with_sha512_alg, + &ecdsa_with_sha384_alg, &ecdsa_with_sha256_alg, &ecdsa_with_sha1_alg, #endif @@ -1497,8 +987,8 @@ NULL }; -static const struct signature_alg * -find_sig_alg(const heim_oid *oid) +const struct signature_alg * +_hx509_find_sig_alg(const heim_oid *oid) { unsigned int i; for (i = 0; sig_algs[i]; i++) @@ -1539,10 +1029,13 @@ /* * */ +#ifdef HAVE_HCRYPTO_W_OPENSSL +extern hx509_private_key_ops ecdsa_private_key_ops; +#endif static struct hx509_private_key_ops *private_algs[] = { &rsa_private_key_ops, -#ifdef HAVE_OPENSSL +#ifdef HAVE_HCRYPTO_W_OPENSSL &ecdsa_private_key_ops, #endif NULL @@ -1567,21 +1060,18 @@ */ int -_hx509_signature_best_before(hx509_context context, - const AlgorithmIdentifier *alg, - time_t t) +_hx509_signature_is_weak(hx509_context context, const AlgorithmIdentifier *alg) { const struct signature_alg *md; - md = find_sig_alg(&alg->algorithm); + md = _hx509_find_sig_alg(&alg->algorithm); if (md == NULL) { hx509_clear_error_string(context); return HX509_SIG_ALG_NO_SUPPORTED; } - if (md->best_before && md->best_before < t) { + if (md->flags & WEAK_SIG_ALG) { hx509_set_error_string(context, 0, HX509_CRYPTO_ALGORITHM_BEST_BEFORE, - "Algorithm %s has passed it best before date", - md->name); + "Algorithm %s is weak", md->name); return HX509_CRYPTO_ALGORITHM_BEST_BEFORE; } return 0; @@ -1593,7 +1083,7 @@ { const struct signature_alg *md; - md = find_sig_alg(&alg->algorithm); + md = _hx509_find_sig_alg(&alg->algorithm); if (md == NULL) { hx509_clear_error_string(context); return HX509_SIG_ALG_NO_SUPPORTED; @@ -1621,7 +1111,7 @@ if (cert) signer = _hx509_get_cert(cert); - md = find_sig_alg(&alg->algorithm); + md = _hx509_find_sig_alg(&alg->algorithm); if (md == NULL) { hx509_clear_error_string(context); return HX509_SIG_ALG_NO_SUPPORTED; @@ -1656,7 +1146,7 @@ { const struct signature_alg *md; - md = find_sig_alg(&alg->algorithm); + md = _hx509_find_sig_alg(&alg->algorithm); if (md == NULL) { hx509_set_error_string(context, 0, HX509_SIG_ALG_NO_SUPPORTED, "algorithm no supported"); @@ -1950,18 +1440,6 @@ hx509_signature_md5(void) { return &_hx509_signature_md5_data; } -const AlgorithmIdentifier * -hx509_signature_ecPublicKey(void) -{ return &_hx509_signature_ecPublicKey; } - -const AlgorithmIdentifier * -hx509_signature_ecdsa_with_sha256(void) -{ return &_hx509_signature_ecdsa_with_sha256_data; } - -const AlgorithmIdentifier * -hx509_signature_ecdsa_with_sha1(void) -{ return &_hx509_signature_ecdsa_with_sha1_data; } - const AlgorithmIdentifier * hx509_signature_rsa_with_sha512(void) { return &_hx509_signature_rsa_with_sha512_data; } @@ -2062,11 +1540,10 @@ if ((*key)->ops && der_heim_oid_cmp((*key)->ops->key_oid, ASN1_OID_ID_PKCS1_RSAENCRYPTION) == 0) { if ((*key)->private_key.rsa) RSA_free((*key)->private_key.rsa); -#ifdef HAVE_OPENSSL - } else if ((*key)->ops && der_heim_oid_cmp((*key)->ops->key_oid, ASN1_OID_ID_ECPUBLICKEY) == 0) { - if ((*key)->private_key.ecdsa) - EC_KEY_free((*key)->private_key.ecdsa); -#endif + } else if ((*key)->ops && der_heim_oid_cmp((*key)->ops->key_oid, + ASN1_OID_ID_ECPUBLICKEY) == 0 && + (*key)->private_key.ecdsa != NULL) { + _hx509_private_eckey_free((*key)->private_key.ecdsa); } (*key)->private_key.rsa = NULL; free(*key); @@ -2590,7 +2067,7 @@ const heim_octet_string *ivec, heim_octet_string **ciphertext) { - EVP_CIPHER_CTX *evp; + EVP_CIPHER_CTX evp; size_t padsize, bsize; int ret; @@ -2602,13 +2079,12 @@ assert(EVP_CIPHER_iv_length(crypto->c) == (int)ivec->length); - evp = EVP_CIPHER_CTX_new(); - if (evp == NULL) - return ENOMEM; + EVP_CIPHER_CTX_init(&evp); - ret = EVP_CipherInit_ex(evp, crypto->c, NULL, + ret = EVP_CipherInit_ex(&evp, crypto->c, NULL, crypto->key.data, ivec->data, 1); if (ret != 1) { + EVP_CIPHER_CTX_cleanup(&evp); ret = HX509_CRYPTO_INTERNAL_ERROR; goto out; } @@ -2648,7 +2124,7 @@ *p++ = padsize; } - ret = EVP_Cipher(evp, (*ciphertext)->data, + ret = EVP_Cipher(&evp, (*ciphertext)->data, (*ciphertext)->data, length + padsize); if (ret != 1) { @@ -2667,7 +2143,7 @@ *ciphertext = NULL; } } - EVP_CIPHER_CTX_free(evp); + EVP_CIPHER_CTX_cleanup(&evp); return ret; } @@ -2679,7 +2155,7 @@ heim_octet_string *ivec, heim_octet_string *clear) { - EVP_CIPHER_CTX *evp; + EVP_CIPHER_CTX evp; void *idata = NULL; int ret; @@ -2699,30 +2175,27 @@ if (ivec) idata = ivec->data; - evp = EVP_CIPHER_CTX_new(); - if (evp == NULL) - return ENOMEM; + EVP_CIPHER_CTX_init(&evp); - ret = EVP_CipherInit_ex(evp, crypto->c, NULL, + ret = EVP_CipherInit_ex(&evp, crypto->c, NULL, crypto->key.data, idata, 0); if (ret != 1) { - EVP_CIPHER_CTX_free(evp); + EVP_CIPHER_CTX_cleanup(&evp); return HX509_CRYPTO_INTERNAL_ERROR; } clear->length = length; clear->data = malloc(length); if (clear->data == NULL) { - EVP_CIPHER_CTX_free(evp); + EVP_CIPHER_CTX_cleanup(&evp); clear->length = 0; return ENOMEM; } - if (EVP_Cipher(evp, clear->data, data, length) != 1) { - EVP_CIPHER_CTX_free(evp); + if (EVP_Cipher(&evp, clear->data, data, length) != 1) { return HX509_CRYPTO_INTERNAL_ERROR; } - EVP_CIPHER_CTX_free(evp); + EVP_CIPHER_CTX_cleanup(&evp); if ((crypto->flags & PADDING_PKCS7) && EVP_CIPHER_block_size(crypto->c) > 1) { int padsize; @@ -2838,29 +2311,49 @@ { if (der_heim_oid_cmp(oid, ASN1_OID_ID_PBEWITHSHAAND40BITRC2_CBC) == 0) { *c = EVP_rc2_40_cbc(); + if (*c == NULL) + return NULL; *md = EVP_sha1(); + if (*md == NULL) + return NULL; *s2k = PBE_string2key; return &asn1_oid_private_rc2_40; } else if (der_heim_oid_cmp(oid, ASN1_OID_ID_PBEWITHSHAAND128BITRC2_CBC) == 0) { *c = EVP_rc2_cbc(); + if (*c == NULL) + return NULL; *md = EVP_sha1(); + if (*md == NULL) + return NULL; *s2k = PBE_string2key; return ASN1_OID_ID_PKCS3_RC2_CBC; #if 0 } else if (der_heim_oid_cmp(oid, ASN1_OID_ID_PBEWITHSHAAND40BITRC4) == 0) { *c = EVP_rc4_40(); + if (*c == NULL) + return NULL; *md = EVP_sha1(); + if (*md == NULL) + return NULL; *s2k = PBE_string2key; return NULL; } else if (der_heim_oid_cmp(oid, ASN1_OID_ID_PBEWITHSHAAND128BITRC4) == 0) { *c = EVP_rc4(); + if (*c == NULL) + return NULL; *md = EVP_sha1(); + if (*md == NULL) + return NULL; *s2k = PBE_string2key; return ASN1_OID_ID_PKCS3_RC4; #endif } else if (der_heim_oid_cmp(oid, ASN1_OID_ID_PBEWITHSHAAND3_KEYTRIPLEDES_CBC) == 0) { *c = EVP_des_ede3_cbc(); + if (*c == NULL) + return NULL; *md = EVP_sha1(); + if (*md == NULL) + return NULL; *s2k = PBE_string2key; return ASN1_OID_ID_PKCS3_DES_EDE3_CBC; } @@ -2981,8 +2474,6 @@ const SubjectPublicKeyInfo *spi; RSAPublicKey pk; RSA *rsa; - const BIGNUM *d, *p, *q, *dmp1, *dmq1, *iqmp; - BIGNUM *new_d, *new_p, *new_q, *new_dmp1, *new_dmq1, *new_iqmp, *n, *e; size_t size; int ret; @@ -2990,10 +2481,7 @@ return 0; rsa = private_key->private_key.rsa; - RSA_get0_key(rsa, NULL, NULL, &d); - RSA_get0_factors(rsa, &p, &q); - RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp); - if (d == NULL || p == NULL || q == NULL) + if (rsa->d == NULL || rsa->p == NULL || rsa->q == NULL) return 0; cert = _hx509_get_cert(c); @@ -3010,66 +2498,21 @@ RSA_free(rsa); return 0; } - n = heim_int2BN(&pk.modulus); - e = heim_int2BN(&pk.publicExponent); + rsa->n = heim_int2BN(&pk.modulus); + rsa->e = heim_int2BN(&pk.publicExponent); free_RSAPublicKey(&pk); - new_d = BN_dup(d); - new_p = BN_dup(p); - new_q = BN_dup(q); - new_dmp1 = BN_dup(dmp1); - new_dmq1 = BN_dup(dmq1); - new_iqmp = BN_dup(iqmp); - - if (n == NULL || e == NULL || - new_d == NULL || new_p == NULL|| new_q == NULL || - new_dmp1 == NULL || new_dmq1 == NULL || new_iqmp == NULL) { - BN_free(n); - BN_free(e); - BN_free(new_d); - BN_free(new_p); - BN_free(new_q); - BN_free(new_dmp1); - BN_free(new_dmq1); - BN_free(new_iqmp); - RSA_free(rsa); - return 0; - } - - ret = RSA_set0_key(rsa, new_d, n, e); + rsa->d = BN_dup(private_key->private_key.rsa->d); + rsa->p = BN_dup(private_key->private_key.rsa->p); + rsa->q = BN_dup(private_key->private_key.rsa->q); + rsa->dmp1 = BN_dup(private_key->private_key.rsa->dmp1); + rsa->dmq1 = BN_dup(private_key->private_key.rsa->dmq1); + rsa->iqmp = BN_dup(private_key->private_key.rsa->iqmp); - if (ret != 1) { - BN_free(n); - BN_free(e); - BN_free(new_d); - BN_free(new_p); - BN_free(new_q); - BN_free(new_dmp1); - BN_free(new_dmq1); - BN_free(new_iqmp); - RSA_free(rsa); - return 0; - } - - ret = RSA_set0_factors(rsa, new_p, new_q); - - if (ret != 1) { - BN_free(new_p); - BN_free(new_q); - BN_free(new_dmp1); - BN_free(new_dmq1); - BN_free(new_iqmp); - RSA_free(rsa); - return 0; - } - - ret = RSA_set0_crt_params(rsa, new_dmp1, new_dmq1, new_iqmp); - - if (ret != 1) { - BN_free(new_dmp1); - BN_free(new_dmq1); - BN_free(new_iqmp); + if (rsa->n == NULL || rsa->e == NULL || + rsa->d == NULL || rsa->p == NULL|| rsa->q == NULL || + rsa->dmp1 == NULL || rsa->dmq1 == NULL) { RSA_free(rsa); return 0; } @@ -3090,6 +2533,8 @@ int _hx509_match_keys(hx509_cert c, hx509_private_key key) { + if (!key->ops) + return 0; if (der_heim_oid_cmp(key->ops->key_oid, ASN1_OID_ID_PKCS1_RSAENCRYPTION) == 0) return match_keys_rsa(c, key); if (der_heim_oid_cmp(key->ops->key_oid, ASN1_OID_ID_ECPUBLICKEY) == 0) @@ -3107,7 +2552,7 @@ if (key == NULL) return NULL; - md = find_sig_alg(key->signature_alg); + md = _hx509_find_sig_alg(key->signature_alg); if (md == NULL) return NULL; return md->key_oid; diff --git a/crypto/heimdal/lib/hx509/data/PKITS_data.zip b/crypto/heimdal/lib/hx509/data/PKITS_data.zip new file mode 100644 index 0000000000000000000000000000000000000000..50d6fbb375ce54808dd7c749fc399bff0115d14f GIT binary patch literal 2149008 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

    8Cnoh&g4v$`~N% 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²ZLn|bHyq4 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

    -yQe6%{a_w? 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%0D1LmNp96Su6@5z_J+Mrv|3O2<@e234SG z{zF`1Zis1OJ-^{r+`L?~v@+)+8OAcaR>5A6UJqhZ9xoZfaN6~HGL666{_6Yc`@4;w zFjNQyk7VqjoF|sVq4}#ZAStnJLarJK0l{AL;g>Eb zNNDEEY!6s44oIKeMFytDfLR^>pM2{;LhF~B)7jWWHvQ>ZXux98P_0o$`BlO&DN}t0 zNQ@LbhG~?S-Y&K+v&wTJ=X!-^ju^Z2MY22``OHWnE%MjHz|0(|R5n>`` z7Ic0^X4Eeu+Sas&p@g33Qa7)ZmueAAcUa@OiMdx9G}@-_SQU6XI=FeCWk8m{ba<+( zjh%ay;tjMZpkqHo6MS!pK}=g2T^j)hRFm zLo8tKN1b)uq*RDj6^KM+tlQjWpdYH>XidL>_JIL^u^K-*TEmK$Fmo`Pc+)l$^9X7Y z@dv=U_~;fJXtxS>z#=|=VZ}PB0!A6*ceGWLfH_0bf*#x}yK$@>tFBKmwuFp|rX)F` zI$5iuP1i4+Y-&>{iELx`bX{XP0$+GS^+nHU;q);89PS0Z{L?zdSRo1FM1mz|sn(cF zz*W~XXfks7y>8TWeycU=>|-8)MQKx8#!#-}3uOGk)ZftE3%sJ#^Q-cuy~^II7_PxF zot$CPeZo4+?4Ab9y=v}h`?6%SGbL_NLME5}XYM1yRVUDjQlO=f&!DStV9c%3B_%dD zJZ6nR_s=6<60>+qyAtU4XN=U$08dTlE%T!njaC@LYcYFd^W>~YlW2Etw2bh%de1=B zQvSo`O4?fSPM+ZFf@dRVi6+;6zO6h>jPJ~WaYom@{@H@tM6#k!9M;-BbmK}|6P5tk zdSygoy@nzSquHwY=k+#7W>ulv5#j6gtGC~dTudmPqObYT~Fx%UhUl`|>b0 zT|*9JIZwpxxz#g~XNzp{6vd>mUQf$5AnT)BA#+jmxHnMddHN0xQ#41up197|n3K;` zK1Y-h`#|u#ACpym%7UT8pB2*AJZ$v6)Qv1< z`)7AJ>kY`@i|NbCSCC`|4X&5JX5N;D7`Sr&D{{%bGwV|E zj(UGfIw=$@v4C^7+$*o5lT20Y@V58;`LQv^$M;n?+CFL2?6j2Q=UH=qh^}uSq69a+ zsfVNadag|fJ)lY!dd*J~0214TWo`PE?gia{BhN7j%CbNzL=yOue+yDC?L6Hkf~OiO z?^XO3p~?Opa9`&~^TxSLEhe0_0oZQ@-%8{#nFQO-BdvZ@EG$0N1vv62NCGT6NNLsB z_NC#yZ3;F_TorlnNEpPN3|1^r7xUEGpAL(RL4PIKBK0&oX^{BHNnk_4q5tA+J|*L# zXE10vImHeKDy>JbO-pzI{MoJ#faY`OKy?>{Q00&M8JEzkhWM&Se>M;3HZV@`)iqMf zZxK1(l(&Fk>ipc9&QjcuC+jft6?@OmS1Ru#SD)T`@!~6Y4 zbbkH-V|e>|A-EBsX@7v2juEw#fre>6ZLdrl1sS$%9ZG1WX;JFvdGD^4Y_-f5t$KcyA-cbT z;60FX{hO&4XWXh`@r7_vs<1Ph!;Tqdy&#^V5HQKmC5UJaSYfs=ZT6nhb>G1x>uWEPW0K13xmDriUoVjk7=BWtz+0vpy2ut zUvklLY;he5;_R}%#RV>zGLdAFEH_;-Y>kfTWk$>~g=M2}EE>D!DWvw#7M@CD3NU3< z(ojJ(oI)$`sqIUzc63i^-xGtrxNRNw!>$iIyJ#l748+SH-O*3cRIT8E1cOI4sMX3v zRG0q1BecOhmhk;2e7}s2hpN?OKUEKlhH0=W!|9!ynM+tM4Wt@p|BO7JHtBg42LLfTYQCz1+MDroREpc^1sfF5vtKw*Az0QkP_3G_Xm4Wsyru}E=@AZ)@u(1a5(e-RmP z$PghcxKEa*y8Iy!->2y-4t>5 zI(K#m5?FB)f0z9R_~_e0$(WMNXX4HRkiW2!vFPMCU&~xD-RR6}XQtqWmbb$nD|Yx` z&#*1y4k^@pP{tot``nM{7MrUyxuotv?TI~i{hq;y9ue)9JIpIZ$86<+6)G$fLV42ufo2ky(`NCv2Kx8CSF+2}@*>DgNYhh8^Tf{5xOgN<*FkQ~A zcr(vbtP+qD3k7^vej7PxY4hFe@2Qt&R1OZhhgCZOrR&(7u57Au+ zC7{oG+9U@7NtYA%wSe_Px~uR^M}Gmz1Ln_DKi$&^n}>&;CZ##|3rosmGq&U-SIN_Z zE@PSxXoQ1i^w?8Ivjeu9!OjlWsGNFI_60@Lp*a{9Nr4#Xy$~JU*~r8}j(o(tR>yee zbN$3*h1-7~p(*&~T=hCs1aWA%EDEIe5=?5Na;pv4?P(OGCwCNzHFi;QeG(Z|_H0004;-ETo z8_nv!M7hH$4#$%R*gk9`mW8VR+}?3h;M@32cCH{PG~5pll_dBLll%q2i@rEp1one? zni5HwvDcf>&9dqT39>&V?BY2H6GLCG0#@`f@*n@^!GEFq>_IcWTG3@l{1m_s02F6vLNCR(+r@Hf7dLb5I1m(BM`lVBz?3+h{S}_Oq_{ zL^qRUs^HLF#c}WmALeB!_can1&R=S%VM`mK$531Jauk)eb03$}nn2c%^ET1%1&-rwY z@Ap|psnd29Ux0X+_nkpwMA%tnh>g8KTY=u{rC_OQY16g-D!X^8zfMmP^2FBm%yLp&u{G~*L8-QuuJ@$( zg#3~{M*3bNY$xi1KpIkkLV5QfYCv^L-0icg&h{r`={-ogdx=to@l~wyLM3zOkWj&y zWD~tSPSJ$;X@9YB8jn!?)i<1TLK0d+g^V0MY+vDpWj9^jxs3)83^CJpsb5*+8sVDu zrpm6kFU3PKX`zGU_-iMrHu$a}m>!RGYGhruGDccZPS@w}!d=^EGAlB}}3)==}Lp zL5-E7>CdoZJ$f4kKa&n3q!zjR7j^2bR3X?~&UDc!`Ep4)UQ5E6w|PWr?t>hc1~)6c zCA%auMeSiPr()0dSVbKx2Jx-x)1AWlR6=kj%el1GV6&l;MZ*F->NC4r)yi*=rYK%1 z07nVV268#gG`c+PcmeP8R_>j7drBzJ^XohV4pFuR&x9vkiE$*-J%O0mb7#9 z9HvSwGC87UG&W%^OglMB2|L`#nxJ{r8Z|L!*4)8Kopa#Lef633`g!xoIeq7uz3n}X zEagWN;HS?4+UL(}QyyKCq1YoN2n6yV5dE8kvli?Q^>&~~1rZ4J!d2JB&)+BD@ZF1` z3k&o)O8^=@DpP}5C=k#4kTK5I4{rGuyUm%tt8HOKjRCIlBv6Oz+Z?b zsP0jMnM63#*>1To5)^G7*|!`q!z9F%I3p09c!e&JKKk`WMuaG6;Gfj>8koD`$wJ01 zet$D!75h#CkEFU&o+g;4qS%s|;pOy+({+d?@jSBcDQK(ysPJ8Mx3R&qV4_}K5pU%N z{>b$}K^5HQC@7?^e7ApKEB4|v{Y3k>%YexYePlcABI&&&%PURIP41l=A@4kvc47U) zCx1?}NBj8Q40g4^pSIdQdrE-znX$Yjt2SxFQmBbr!e0#-{&cUS+%iamCV)HXZTqk!l4SW@2PxcC zs;Omn^vXzRYTcfJy@E=_fpbwS`^GTusLun}skGcrl2II))WscogbR?a-xb+KPozk# z(HGx(EeDP0)EEJ5l_oFjf_BntOcb`p4zC2wXYOmep)dYr3cY@JzgXwM7PAZ)FqS9N z;JOP*M3rNkIz<_}+tKFp(lQ&CIL<63lr_b5(<0>>wTc%Q{8z#{x-wk+@xrj24ojQ#0^;q!j4nAsKS(@-#aDI#5Xu-My3{Yw} zeSBU79H3u1U3!8r0YH@l3WAf}GT>hcotu{cy^EFcdcJbxLjQzl4;g|A%7%I0xk)2I ztPQ%lI~$N#wQ+2%z>YzgD-n_adRV48zTZxxTCbVyV`K zf}XM01snEzz#;Uk8P>6ryNGJSVQ3Qs4y5rO_6OUOGI$GKBUXkyYC0JH=zw>&%)+h89A%=Ih4AZq^OOw~;uZ=c6`g zi`piK8Y$9Ml?7AR6qyVRbd!&Yj6>^y>W%tOmErs(qr2~Fl)zmNw>`YAoU~<>?b!GI zx3>F~oUuG>g6XCaPG;lc&dxa!>e2?M(4Iuxs@v)q%CQ#78n#?|zH?o4oIC0(^zuv{ z!88yBe`GR*+^xSk1;d$1XE2q!-3w`uBGzxbFE;VJt|Vd{sM~@*r8yL_CpvWaDZYl+ zQ;Ov2Y;4oL*h<%WfsFo*{15QAFOz~2)d zQ?Gr>q-Y`FmnR*hyJ|Fd%FHw3E6OLOImwen=byx|Wqzj9{dGLd^XJ(fEnW<$aTdXn@6}d_IajL{lT|xL zFvW8!_5dBm#&}sA!1Owep3X$?7t%5YQ;wmS6C`Ke5G6Rw$C~<=mx0=)UL2&yZBuRY zddDN(nhxPLaWpi{rD*Jj%m<%$>)Sp9!(Drfo@PXZ)#4`#mwzVH#&hjxr#JRYKjWK0 z;JZ$Kd$20_`6I?-^+7|>Oru_HUsZM_33ma?KMw#0A3T2PL+oJT?wqOK+_hCse#PHL%_wHi__(N-omi9(9DU_9}- z>2^9D{I|VqcBi345jfz11mr~4aAdBOi?oU0;Nkw1VRZ`Rh^+4By~2ouNxf=yP(&o3 za}xl8{(}L(y$F(sWIwt47!V-|{t+QMReva?fBS#~MF4>i4+6*^0C;Zd!)$&?o~o#A zaV2*J*&#((ozo}?N|=_zriB&ho#9o{b=fJzG$=L6brf4oBId78P8i7s4=cBu!5fv| zUV!CJ(|^{3uH_dOJcNAi1dl<090U(yRbr2?~CgLkoU4SzuueNpZ zto!I2VJwoyH$@HV;+7g*A$BEUD!*D^|QrhHJAOChD0^&rYe`z$bG~1k?^3(d))H&Tgco$s-oHLCn%`C z&BobslTWdCXkdnu8}06*DeX4qo(*?STZ`D?Q=i29fHvlMTK?$vC;Oh^>prdQatw^W=M)}C~t6>*zgwUC%hQt&*~ z(qZn&4G-IgacKO|E^b@)sh4V9o?N(RjeLb!3;Yw=%}`dqzex{|`9mzuYBSyXo6r)U zIi5@_tDW*&_UkP;SgUy@J1`@6;?#$nn={?>c?aX`RQYOAzw2;MM+po^lvTCZIO{ZO zlLLj>tn)4sG{zlbL3$m+JwQlyb7@2W?mJsaMYxlM#vIn|*DPzJ^p#+ceE)SH(T;dmnoFlU|NWbRC++)FNxVi;tAP zrZ|-uP;7dyc)Jl@)aarjRey85bzo8}a!mwk5+7*f^a#eq6dnZDxhja(MeZIV#yrN< z0X+%+#P?Pmu);~s^~Zulzh`ufkf2*s{%y_W5%=>%%Uvr1pW4rB9kSYs=u805Yu<=1 zhAFg_((=Jh*rr4l&O$)Cc%nBksW{KY*d4v&3Q#rK;Fl5dcg~hRbIdn0# zoa5&TbXI&proZj<=C`kI>;tc8&f?$sT;kMfGfCJipSATp_s05W;c=I5A?{SlOn7|k z^%jp^N%MT-tBzui0SmGHnYd=iFj2AvK|RB>omA)AW$;;P%+#GR>Ml>3YAhPV)u4BF zN#!gN2Jv{ez*+Iw0pmi~phllj6@R*al=5ymTkRm`?lnW*b9ZEUzHLlZp^Lmcc3XdajJoE`w9M z7t;oR0iw{0?zf+H13K7eF3la}RNB0+%&%G*zq9Y?4D%;1F5n0!)gT}XIE8L2Xj^>W z6f8EVU{-RAi_CC{7~aXi6;pFxS?Y7omB@ zZ5gRR(KniZx3~f!0#H9h$3cG#(&%M~&%&$cvb`?AXZW?4H;t0zRb5ztxyhk6?NWB( zJ+B$;2@t3VQFYv;Q=7K+mrcGsQOQE`gmTS12Yoi9=6elQSLF?)5f35{m-G5K}Fmj=--bPQ~f{5{a0xJ+q4>mHR{IHN>jx^wEEByM4?El zFj;-vFiv`3lTkN+G`wENOyxA*E$?JkBXd%%4Sz9=kT}IjDA-ksz{}`{JNo(lkFSqE z_n+Lek6t;uezWM)NlAc!{pMuKAjz!y9QCYw{1W<*$P=OT`MuYhHs)mPhqI_nL6D|b zTFwXvb$SIqbU~_t6JKWjfca;@2<2CF7^`S>X2b~MP<{FV*|rSI4?@w|KyX{lpd3An zI~pSh$}$|gMkIP`n@X{h*~LQ-NI zB}z3#K{@?iK+?F(b0ppw%@cX3SQ?)DXD9pElCQ}K%dNn!@e?^eS`fD#8=3w3Nz3dt ziPTWooe1RYqztlc%Qy-1qi6MO5<^eqii+n-qLoSkxh=jT}BP;1E9 z@~TmyX=W}X)uH6}c>63HC6sPNNz28;QH=1m*$4(Y3O!5y zifP3j8H1>-V`}oE@t#*cFw2=k8j0(N)z~cFd4&fYdxuKSo@U)i_|}x_jr2{XnusIwm_h_uJi+ z)fO9%zk$3hMHLRfddmPnl40JphHX^HF76i6qU((cCblNrRBM zT$Mx0Uhcs84x(PL)%2C`~_vrZmZbUv6d=0AB-Cx_3&-f$!clg=u3h zwMc8O{^bT?B`9RRo8FOyuYB{@C-D*DY2po+U7%u$4U6=IYIn@E!hu`MXQf@`Hcajv zgQiNuSRt&;${Xd0y>I0BB-;i;E=m;FstZHBFlshKiwa>jrJdZ1&4gKyp&K9#G+=uy z6K%Fm&ho0=^-|*f!%|WCVYoAvjwi!+#pzvo%4ze>HSJ+;&j!5mtdAKd|6QXqDY7DO zbzs<}ZbT|PpP###qLO6swQRh>Cw?4kUtS|$F5<$}+>-8%;*Dv-7p_}Q}6 zW1QdcJ1h?dL1_>`IVU}r*gFUL6DS*P9hp@_qWppHESN?x;ySaPMbk!9w};enLDQnc z0(QvK^GsO7C0x&5DvOj4Q+`!T<)rZ1+|B0_Z=@L3X+OHt=T|o*`38prYdQUm9efeX zUgiZ;`{yN^f30ZT2nSrzxOrehQxC1w1I%x89gd!CAJLZWece!pp?bwGBYnL@Nq0m| z38p`o#Zo;d=W_Piq&k}Lbh_ygs@-;QmmgFQ2e)VO3VoQ%bQ!||d?r)k~Q=nJ316$a9>6;P*mHqPmGWA6Lxq}gO!{cH<)IdRUi zl6!?~_zxansg*|h`;&O69XhLROB!Kq z!2)Fw#GRJytV#XbencXER{e8JDkpDEG>ZM`W1PxR85iFH8}scthNnY7w&)av z>TGFDk8*+T-sbg~5R9;Z!3pq<+4oJr-$>`nhoegiH44D~6%KJ}+Hm$6vf337t|$^~ z3_gNL{a1=*pidycnVQ!K)i|mMlmrS2+ko4N(f$>u_xV305m>z65euQ6rL7U%ooej7 zuLkgunY;c_vYEZ zKFv)9QXIh;aT-{?%YDVVDV;VBAib=x5h&aPpMhN; z<&S#*!>c!-Yr5D(D^7-)loY2} zhG$18Mimzm7P?wA)i(u5HEBx83%HaRfEj2iY=jeus9052(=-obNo_8rowmQuWW)bk zIYnHDuBy9&kuA21TkpoGBi_yyc6-$XVnAbx~Jh z8%;6#n6{(s>!^lEX0W3eZ7;TB)7fZa47_)3&hjA#=lz&a^%{b5#3VHn77V6`89qLv zaI35|U)mlS$L>cuUoAx^Au-OGBZP=>81;$7(;RE-$T_bIGc;pd=JR9Sbk!f$p#60@ z_L2IumPeim4^umD#mcjbw%Qcq!=^*Edp|P~;}$jLz-Tw{*|QRcRK!2kzT>s>ubHej z%nsd*)*&$;OP?vElZ>6CT0P49N|y%^H|Aiiwm_I>h%btQqJJoL(;ejf%I6&GCGS-m zt<<<}Y&lY8AMmRdOk+d6xP4II+MUD^;#aU4+p7;zNj8syk59N|A5c4aMGA_Ta)p;m zkcy2Eu4(bF?*eD~l%_Kz4WlY@a@3o4m+)zxV7kipUgvcqE1t`nA|KU6`sp_Y*@Fu5 z4^uo$++rjyuIn$VszNdW;jE_CyQ!3nk9%0iJSRvMOjR?O0$NqXH?}-DmQ)jF?I^|5 zD*eWb6xOaNE#LQ(0c^&W3!!@*P{UboN9E{CZ6IBt#Y%U*^eVrIBMA)81`+Z1;=kNQ zw?hS=r;D%^%N7&8-h~Hf;C;*^jmCt=gJ?`TxGDxU(Bjsp;u23_(=S}nwBS7p^T9TA zT&@O^uaa&)Dc`cPQk!7w##8ZT$3erTi_f#BFb#bt{XOmxCRJtLBEFF?CKF?}@IQQ9 zlSYuSZ$Buv$_IuNX4H-cndD4K3sE1DQLV|_YeMTR3I%HC137OShCCX= z*}+0Z%6_%IMjj($=|(GcoBjb}w_D$;q;bMWd&CKdQg)J6;73s*mqgy(ASqDb_-(`6 zwBZl}t*TQ!Nd3?)%!fb`pq~JiKY^MMSdzhG z*P9EU3H}ma=wcuk`ig*PF;L21fr?{#Ni_lr$B>>NvAyKMihvUwwEZ>wgvTS_axC+3 zP6Do3YZ-^9__zWEqkY;@=nf$GCVHoX;3 zBw}gS#ty}m0@D)i{#4FOChv{)1?lnqf#vwF*ly6NbG8*!9lan@$WqZtIsJU2Vvukw zu?QwvjMoXfwJj>$iea*DT{>Ul3_*2H_v&4FXcBm+N~A09$dKLw{p0nW71Y5wfx(1} zLX@+>=?gK6f-Ky^-aek+;~(Nde`1R6=w2XWBwui=voqbo#$s~0Tw>{kCd-KJ`wEta z8kH)tUt1UAa;!kLzQSnPbq+;={BTO-;qloGrDaz=GQ;X3)faUYqb!kRmr?DtgZ2Fl zE~8=?!7K=0R&G2#VXC$$;{F>;%DN!0X=IyRE3YOg@M=XSrz%A%W;_coW4C;g1Z66D zEV56UgTW6>zZkU{BW$U9=m^mcW0tvgZ#~ek2ptdTF>n(hnnbLK`7^C+aj8RXvOetZ zzxcMRHmCpwCI225+A-YmQ3(rPvAS$nSfRA?o;q#M>4!g#txsP;@JF8eOluBOo}L^_ z7%cd&;EM|&O5HB_;gkIZJG->B7!(kBz6R5Z6;FCP_yKIWdjf*Ha6k zt}HO5Uc#+I%STx+=wtk=mpg2=aGlDgSdVCv*)!Vx*hrCct<=^2}w z2h0w%_ba)hg$>iIx$>AgRUHtM`ZYv?2lHUuX_PBnj{We#mwcT5(bquz^I{tsLxZH{ zG6`AFz3oEIQ-k@Y3@=07!iV-DmJnM89PGS!-Y52;%M8lQl6{8IrN8#jRRa$0LaoL0 zRJu(1ML<;ETMABrFwMpJkF_oHv$Ulp9oFB?LjN^ z0XkfYjQ%l}*^KLIn%uZ}c3M~#j*H<8ih<(ml(uPWC!x`+{XAL$Zk=F4|FEAMu+Za?;5r0t(vEF8xU7e^FDfA`) z8};+@XgXh`O6DVKW=`%pt)j3!S-ql5yAKdZ$jkc!z=h;~!B^Eeid(4k{k58Hu#t`9 zu5V9-xpM_xgC&@_pu#8?f`a$WjH^3yhn!52eS|Fe;Yn-&L-{^E82+EQGDg_XE54{TDKZzX|A7>jMCr+Dwir|F)NRM1|N1Y}chLHJG zXFarYe7U2|4OG4_$@jVy50LF^lA1lVTcG%_2V&8Zx-jk?KnTkTj>7Kht^JO$d9Uh42PLr3ajeUY0EDDomL|-7 z0l!tq>)>i7}_titT9tIVO(RZ)RjjFavHz#3gM|KzEFW(2Vx%w%a_a%#3 zM20bRja6nDHe_|ZFBx!xiUAlUZcSQf=U!@#V01MuBt8hL?)uWa%Y#9VR}SvQ*@W*U zZ-{)n;0emq>jz~HvsRfG?R_aO}8CeKlRvy8_*1?`z$}xk(qAz*cfi$sD(j6 z15ygkYpyDc{ra%nV$v{#l?h~P)$?nIoAit}esu+ovXY~3*gvT! znaB{|0zB}X2~Y= z?%$TGZocPZ*114nM40yF^a;BtSu3`X^bhP2fn5Ri`K#bP+!*zAXSg@vF<=!4 zQ*T_+npa%=OxA4WXPT)07PqkQyvhDrdF9khvzI-@)wzXErPwig$>RBZ%t+;9mISUD z{mMG*_ZM2dU!f#+2SceI4LTKD_eB}n^^s2%Y%aBE0Q#Fr4v?)`A_kN&I>ibuz+s>J zbegUpbC-Gc*A^rgy2)a>sCuGdPT7%&8^q-c}LEozAu;Z~ai{FM~Mym6RU4c)Rt zM-}vs-3$!el-fP?<=oK8WsCUfrz7O6Xuv_kn46v6yNIb zDrcbi_zVieT=W1u5px+GK<)BMCuldCBoU`*4WhaH#or}w2tkh%Am`Tr_!!c_9VGN}T~~fw7XH(e zcN(hU*XH0jVW;QTzU%Se>d3A7iAQpLTg_?aC^XSz92SamK3xPotv!T~XuU7Y*s5du zBVTaU)^-~M9-EJN%HsLITrn>CzEp@D)__gq;FdAIY16m!qv)+&lKY3eVC|;KSQ$_a ziNB4nj)OdZT1FZR$<;i9G|f*(bvXLbtF#mE$Jaex2}>x5L~qf2fphS^EzoJdEN-P} z3Y2Hou8>kGbwY9Dq_{z(FZGlKV*z2xrt)F=lGvrcdfUSP5{kf#`7i@3e$heY`zgGM zIT(R9ck+MJK>>o1?APGAR(WOL8sU~iwE57B6}0GnM}>cWcvfIvPFrk~CTE48v9&ck zNO5|?_L=p7^I-EKxXul6OHwpp{|?UH3fr%e%zJ9;xG&M5AGi3YzjTirjb@G3CsnYs zXlcCcX?EjDiC{albo#|x=Fq`c8Q`X z(S)Ohi;Rinu0P_UK{QIA;-{Zo(ZId1zFJsvAABWeD?>KH>+p1};21o*tk5V7x8L52 zbE-P2RLYqhTUUI(0Be*OEQ^kzMdbPbGHYmV_f&6=EiroS39|qlY6j=RO@&c`HZ_;E z%Z#e&$?zUpS9qgeTaC5Qdbe1bKkejJOx(1rniBDZE2}3Iy&Q4VdGH{OWm-5;gWevW z->Bk*_aLnZ*5pa~GOQ?!)s82MkvWM=_Bzvy?`{vL{!+h1a+o_;kWle=>#EI;xYz6; zyFxZJqO;NOT{Omw+C<{N?rtbv!p*FetVa%VceX=LmFUl7O?udtrR(iIR;#hJTSK#mH1us0xM1+$8W?B zUOPr<+Tjyx2!RM<90NoFRs_xle-ALvgODc}yOrM|m@v4F6wQ~*6EP6<6w5;pAw(e9 zOsXbUKd`RR8##d04t1aDorO#VB04I0`Y^M?UE=!>(_YDcAm#gUZ`%3y`1$`RPWN;uRNj)prHV$w71Cky>h|s3_5D12^vpSZWQO4D-U6>9QKPoFg_UjZH5ri=TJbO-_&y& z4Yg_1%bza@kO)c{ktg_3PYm~m%Xjlr^$-mSua1xtmkzFbW3c-#vr{Am%KkpCCyX~C z`m-y-C)ClB<11F>$cT*SR9F^I6pk%wu>yd8C8H$LO zjTiIeS$iuQjcEOn6gKC1ee`&t&hx;~UQFW5e4|kMOk(~LwCi*dR#$3)%+@OtKO8!X=_7;FUgDu-LZHs}pJ~D$ zK!!zSa`=7{He4rj;Z2`+u)pf z<_6N%-Bj%r`ds6dGq@F%M^^m!%PS}~lml>dKBzHnVr)qEZu=Wk?cy^TK5-Y{Eq2N!`rY(Lxa2I|2XlDNa zJ&PS@%A_;2S91m%%5|frlf*LR5y7siKX$3rox-ncGvsvo6e9&OE zGtoZ2b4ftI?hLWT+%8r!*4!QlD%GLepK#K?l#Oj z!$VqPvNnYUa;TDkYRIEo31)nQeuBRC1DCM})!70Op-*XHI~hpUQ>SVm(4UdT4ylK3 z$!QfD&8nGNC3rQSE+l$YinB4B!_p=5;j6%gS$lMt9e*Tcg`DMH3B*7vfmlO*#{K$F z5bAZBQcW0b&w8|@;G>pb?~lPe>L3YZX$0*pk*L;agEi=x;m6D z63sLIh~rQdA0F)tz2>c`E|7tX>SpKs%$I> zv|wm7+|=`2z`>Lzs;rfHy9YP@QOAa>gXh1_XL(@{`wU-NI$<0R|{5e*dE=3 zAxJX`3lJju5j4*ta15z;wJ_F83$F7Brprisituu~jKP%SQ~$W~fs5@!MjL#=LgPVU zf7m&OnIi+;J!YMHg4=I9D^@wlMZ4zm0kIe0k52m(y>gH0Z%Yng4LLSQM zGeX&@QqkjEx>$ujaIH%~7o49FEAl!50pp^{Ysm$60z$1;v8Fh?tHvZzsVBJfrD^sJ zaCp9ZC&6!#l!Z77X@+Iox^4crl|UKjioi=@G;mE~`W(+2`;_`@o z4d1exxjTne&WXE1bBW2CFba^<%D_=)@-AIcy|VGi_AD1&B4pB(ZBP08X&Dst;*iFS z7ky*^r?iD#_y|VUx+P+kzCXi0?H5zjjEZsuNMsK!4?^wF?++#nghFs8{^NhEfFH&c zs5C&h2b57jpezgEFYyPfm(9hA$Rrax0;z$nHJ`J_fOarwEeN&s;~n?67vMkR$uG~~ z^uHgK{y+Mc{vFT%k)P~KkyxXCrXv_5oGBPmgSa8o(#Krl94SF@=F%yMvRISqjadyQu*5j09yi^mIsaj^T%9r=NEmcfvEXQaS1D30 z$qj`4y*;Wzz7GOr)92dFkYa!Auckm`+1`;672XgiPHN{reopYe|1jM-3DgH5q;1(J z9Xj)KqJjhfGAP$QuYY43iNkLf%pmN)$7?(%*YBD~E-aYTGCw6_BUgjw5;%(;$L^`{ z6jlv(da%-ocphnioT(`7DCv9^9~sA92z5o%msl0S(bHw0BY%g5F##^3p?KT4O9lWp z?aYG}%wMgk+XMdnJ}>pXCwb$0KK|ofT6c0xp<4uPU4CkF$qu$+((lJ0#I9SYG`v&6 zWW?H0-F8m97tsIWJ&OO$=ut;t=o>0!YIviIob_nWus!5tVrFC~l~Mn59384z0y%7~ zc$Q^SgdiAtmfu}cSJ2F%nr=y}*L}>2>IT02*yKwG$LT;feNp)7VTk8@W%U$LB@WK> zh)r>>&=>vE@p-yFEbBc8S>%l&=jij`wy5PLYZIH$!~@-)l-k}7sjCuQppOi(7wwY* ztN!()n>ZeoIz8j!S*h5B$2gM%bM&WNe*vse@d?OjP^Bok3^vvHL+8xK)P8gZU6K0s?jS zvb2oU=!23C&4UPp5ykgaU5qCTjRB$@=SnX32dqj!Ofe)gBHZ@HUl~uLt|Z<0fxx+} zDMY3iRcUZE2=KVZ$5CrG@EBDo>93V}d*9}Q;#b%F)n3xOFXacGM*XHMn%P$@;08FOqtp$N zd9e*Foz6%H|4d#@t8JfSf|45oDo~d7C{sj!@plMXbPq7Pj8pt(?6X!LYCea&TMGP~ z2Ezs>iklH0zJ!#y@}P4(Q!CawTw@O3irRYKF|qL4Eiq@Xbv~g6qR*F2xU7Q;KHk!8 z-j}p)3;B48sfFUx1aVKXl<(?cd8A4sHZ#kISHe`5L3`EpcqbDVzZ1ppY!p$F2+G^E zAa_aQ2uDGzA&|^He+feb%RJr?8j6g{qGK|~OJzP#SAGqXezQ#S(lmc_?*YVyM=t+gU zP_2X9xAwePr&`X$=k}ebK^GHdIE9@b`mK8k#?D4Y8QG7L5iMrAd4idQKhgxP*lvMs zSPdQ|s3M@O)S~mDZyi;7TD&3MO9rVB%u z1Nl0d9A}rjd@W3HeP8OTj#7E0wDHxD_4JlLLSBo=)cu3elaX3mgPTwPgYI$^G#L_Z zp4zl?+Os^#OUJ+1Se5Bv$!*EAUwrr+#xXDM!MDNf2HhIuO5HeAw)dWx1a`VrBY8Wx z)qa%+eZTs;clf4kJmcNIBG6mpwm4{<)2`ps+$P~gdV5k;{RvC1xC#NPqM(VE;wtLy z92X*Wj-CfB)xz@zkwycmMJ1b?uro z0dsjT?Pc4xZQHhO+qP}nwr$(Cz52gtT2syV8|Gy}+( zErVU3nKfA6{lKlZ`}lx(?h_Bx&w~BRVqAfvrio7S2IW>KnWkOhp-#_nM$TP}YPAbV zsok(Vxl^ckEX=EDY^b^OxT3UDqx9?n?cj2J$G0gN29eN#DlGp_1|Dg=o=K@8%!sQ5 zZ_ly-m@CLktpw4+Gqb7GHdLj>dzNGplK(P9Cr~U)kJc5!bU};dPd(@#L7X&e@`HY?rq&R4*K@5fav)$VMKUuubO=L^;>)v9aT3c-tv z))IO8lqBKSS@eiNOP|_aZ?PoyeM%8<=9)s`7)twLi4E~ZyOuTIf67(&VS5BP`Wfo_ zFfVq-tx8vo@0~16%|8%6_iD?%F++9^4h((DcvyUZA^?Ek|Da*p_o#N`cWE!%S7CTu z-z8_G%ufeC{+Dk^A)-@XW&NV1ti!5E+j}%Mgf5L0-kLtS&+_#&m+!(D8&O?scsd)tk-!3LDD~XFcrbGc)HWTcw0j<2D}X1*`_m zrymzFPT%D1>NpE;!Qd&16RAomsx6Ef`l1atp8Oy`&|X}evmiQ^b4bkB^9RbzN@>@K z)_i@y>=*e#fXAFsyB6b)@0bi_Q<(cJ;wtFJ#w?yTtJTG<8TDZq;6|5(=SOVRjxwtK zL46vVHY><8r#xJ5Z2jiO&^NnN&_!~fkPn@O_603TV<0y#TNv17rrsJ|1QbJea|G+@ zLnvpy^G<`#TGZJ|_4<#;rJlGwI#HwD5Y5xACwLYyv~_SM)PUL6pYH`xRV$~CM)lP( zR|csbaYr+R*aAq+*ZefnSBr_Qk836sB=Pk(^L12)=xLW|Ez_x`QeQ-+gdGSyYuDR_ zI?TrUT(0(28d)!zbxo+%4J%e=a%CI+*EnsC_!uRklTVXHPfO|->t0%^H%Q7J?&@61 z*8GDlne8k;_@0DXEWNL$E7Ph`VDp7dYKHmESbni{HcaBJbPYrbuoU!)lQ>l7}b z)?HS`ZqE36NJ&ASr3it$Q*l>*OeS@)qdg72JfVMWz%I$TW11_qYOKbsp$pB3?uFU4 zprG|fO|@$r8UG+qUQFHA$BC#rf-W}*K3z&;gY?Tir!PjaV zyIe==%7gb>*PDxlU4z?Mc*z!_MH*!Oe91nXOzGSu69(eT#&6v zw+an{`t7@?dT{pSGTtw=J*CQNbV52mPy2$>+wuq~9S)e+)dxb}y+xSq>!!M3vNtw}M?= zJA2fr!j3L2VRLIp!~Ni+TF2!Y+|{?J+sOG1YTMaBwq0-n1TKzb1P@C{3=1J@P>T{95ZfBa9W`atT;8VI{d;iXw`#R~z_~jAvdg2aS0oo;=c~jfT3cm&5C(2m|gRAcA z-oX@7-C%AgFf_u#N9DpQS&BW(v!aG;SGVQ(aOcj5AgitZ^4UkoStn#w+zJO(rHt71 zaCGye^#G)vhTVg4lLGWd$N=a(O+nwBj4SH4w%}y&n}16*2G>;ZxR63slcl4JYOwnf zU6sloO?$RgJfnOh#OdmywG0K7gUbO=Mu)EwWJOjmx}YA_FnCcTS39{9MNkFW@~PTW z;$5v=q!()Gswfos@z3+^IPMdqPbp^Un&L0mBo#g+_0-6NxZ9VH+U6YFvS7G;WaGZ| z{Qk>g>He({B{^J--Ye#8j;xd`yc2UVyh_;bMug?tLo>b*nB~A zS(1|pUrhC-j}<8jnBdF}`o$T(v8iZsT9>|yX(VSzqg04};=F69`_HAA&e+ECDdpeK z6?H6>`%VO*v3ur?ol{^SQ@E#rk(#h<9vkb2zwv^WtY*P<3z?0J=ep4OD{cR8lwnJ4phYGa$nW<2ZA>05aB>t(HF zjmnZ){*tKF>zBfTFv@grD*c1{&q~HD312?oE{N~>#>IK)E;Ki=Vj^q#FL&5 zLf>1fmQhns&N8xK<2pB>=NfLl%k69QC`%ICi>dcRr7)CaF%o&oh#3<8Nx^r_tq?vA zl~$L6Qxg%*7~8F_n}gyE(-9 zXd`(+HUey9z-`KKf9#n>vdCQegK{R;k`7|fq*%DM;VRT#L~+Rxf}vRLuym{JSMV?s zlWt#Lp6~w1x3KUIJM?Jvk&|wPib>s;Dd!M*-FM*S1nD1g8QQv8TG)JW-1J%vu`Lb2 zDpZ}7UIpJ^m^-h|Qu#&`Om?KKAGOT?nK=)#3HcG4y5q4ucs0|YKLJ^MdUB=?w)P}1 zJtQ$L`$q5e=u3WkOxxN=Ek~YSz?_l zW-$IkVbvVjPwUG&PY_}rI1ZM6;>(?Se$+u&zeHQ}5h#BH7Fz$L0&jn#G&tSe9W>_D zw8P&W?Jo6xyQW@6SeAHA%_-pag%zPp^s2|}R#!@UYjFRuQ zY&lQXVUAyBURxc3`)ds9X>PtZe@(VO(n8l$ zbWWLnDsj~j?^-J~W~Dpmz`DY;V|o0pho^7a@`cxE3m2EF0%0$s9V-`HkiL{xwZgYy z2x++(Ww^98PUpUd?8^Xg!-b@BlKxmL ztT%+LVtxKF>jKmTLZgxK`6)!HOK^I8y--#@lxFJalJ)0Vh2r7q^?F^vTssg4f#x_@ zZTu(XRl*|~VB==wCpeQUuIX14_lXGFPvYLnJ|}2@z}Ju%BqRwaP67mg{1exDj@LXB zoKuONv-|O0c0&(eVR_+=KASF_ zOXN=@=GpGJHDnHMG4}oWw*@^PjTqsNp8=S_JCn^6AYcnixfnM8d6Dq+_g!wQ!w2jk z7q6q>=HJj>ubh~B2VDM1@814e9I{IoQwDT4uxrQ-EF@(k|I?VKZi#gBVs)=BQO-a4 zO~e?llA(zA1SOfk+bdh2i6P7vND|_7L=LZeI%y7Ar&M&DaLa;58KXZPE!EQ%WNa!_ zf#Ic~1z_hv6}!pg+cwGA)T@EX%($>Q^mjmNhy&~6g{Y3&_2DYshRaeO-1|a)W!(BD z=3bIfoQ^D;iTCalJ3RWI_f`eXiLlX#yYK-&N0TgLUUp*L8K~%08uPb%Ew0-KHOsCs zXivs%JF!P(4-2WJt5J~`c&bo$j2|?^nTM5xmt?zNdOXn(v`$^aL0JPAruGLtcYR*l z%%)=U@jN9hzE?TjUDlGl>T1?n^u~ZSIWz@A-sg9TLzSg~sf=q!f|JwuN)iG{jIYd_ z3$7mb8Aq7ed4sN_t$|svUE(7g)K-Tp`C!T-+`V>6%scrxMvl`oRgBw=vsZ4#rs|&k z!j;>czZaR(@Ua*=I|@Yp+*gd!WZSV5fiOQc>h4#w6$+hq26=TnnPwj0lhRf3@~@H? zGBCd`hL*r93NgF_E>80PRoffMnrTz8Zbg^^kGZudN&FK7MeH~9HLsFhKH}RRw68_? z>{BD>j$8u2yM*RN5fKPylyX>Ne~tb?0&RnB0|xu`?32SC&0Yq=fq^>*;bqC{LPN^$ z0rwZV=034BiNw|-874E?rH84yrkG9A0S4xgxV4}>?!o?VDiQvn63(79?D-!if584j zq{IK0N=I|Ue@R06A8eZ2m`WPE|C^hv|KcXnf8E+u`$OLl&HvI6nJX~SWn z2?w|cw#$re4mIjoVObd=G(iXitYB|0lOd$NtwKtW_yfmM`@&(`X?gw71_|)B|1#b+ z@XLF_%{ZDM;me_B0RhML#O(lrn3@TBy|#6NTeG`r`prBp7fGE75lp1 z61O0&Y@=nCj-y&@{0g~lRn?Lgli8u0*KAnBa5~db1A5-W86io~#gvg##=Om6+-jYT z2v<1GZJmi^B^v)h(WbT+;#MxNmKipQLbor_%`={O%*#r+Epm=@uNPievKaR^tmA8z zNl8x6+RH1{B`l9$(>y7UtOqv;A)e#nS&os~Vw9*Gxn&|CtW+pEI*-CjB?&AK4qhm* zypk=G{SNOz8OTD)7-l{wcdZ?^^8PZin9B(}aPB zQ@5cZ?W3FS4uv-XbfJwa*L4u-jqyF}-)AM=`MU@FAZ%Q1k&!;4)HTLT<~zQPc_KRb zK6ZZ9XBy?w4Ij|cD9ppLiYLrZQ5=Snpa=~uj^|)csE;1tkSemvYAe#VTm2=C&5AoW z8TN?*iJduy;j>3GIkuJ#PB(rfmuzg7iihGQDT`$UK=j@9$uMq2>!TlyqRo2Gbu3Zf z!ii;PE>@oNcS{*1&{vL^-L^}=dgS}F%x=npr}XbLi*@55Efd1^r3LkR|7HET!ipHg z{<>?vqUh=})HeZ-?5bxqY*xx(*6V{jAn%53Plt?9$uZ>QGdp)`M;up^Ovj+Bm>-&LgQu5MfMohO>i4}k7ZVd z2OApJ)(#@ABh`&t-ka_n#rj8Ba;SbYT4IY;GABqvVPVs~ef5X&cR_IPV zTx{>Eq;$-H(*z0bLUkAy!lx?0Ey>W)R$MIYmHoDecKo6)|I11E;YGk_KVh{7i52~} zRuQBV3u;A@k2?)Y7b0DcvIA%TNS5kK-isH%^t2nMPq`PQgAj zpAh&vqA>)`N*$g7hMjy8!qt0Kh<-ZxHkIJkHDMELLyxl)-&Do-CFBN=;KH^Nrzy{Y z_f73CkxmAaJ+7VMQ@paMqp%;{MZ@q=w&;1^6Qq3!U=PV60#bvKw> znndPqmLwt?L=2ano?f`bI}0rE0~MH>?D;7;MH4(LqES7xY6mH~%ZF`Pa`tC2qaqIH zF6tX-=u0rt9aihAL6&!3md$Cc8mlRB@}nTIJC?X9=ia#!P}3@h$` zJmJB3AKXaZGM_?tTid*)&rlsAMv8e35+dr1%oN8}Q|#80aUxE+Y0y%X{&F{tSw@BSmTff zc5`o@j0#ApW^P-2igs5DlPp7?|uxz0rdgx`!VUkyaDtB;Ix6h;aqa;Id6UDDakXC(U5(j^U#T9Vf*z# z^k!@O(xLhI|1EODb|F@?zV1542x8m=EwptarheZ2kGMt)AKpFv|BWl#e~YU*8xkby zsOc;Neka;z0yQJrdPx!`0%Ah7k?shG(8x?4zLqh$wxl8K;$QSmIg&{-$*uO4kp#(T z%?6g1OP<-!p4V>NpIP=(-GjKv)qlPvRN1;#&Ig7QT6S9opW={Li)~x>niT9ak~SyO)j|NfkZd5L3@?#jXtf~ z!Lam@@i!veG^1FvE}wzePTs|0LTZY!EU+iEC9ayeE2t60%iOk4^*iRyzf8k6)=F(- zh6JKK3YWv#)X_OX%N^SQn?cpT_&I?VQyFPxDXN#ly+^2jZ?!L3*2li)lV~*^i+E~G z;f3-Ahc`F`TYNL-cQGpE^JK!dPyD(;l^bA};_2@Zh!UeW5_-;pmAKnzwAJ|EWvT9` z5&O|o+EqQ2=hY^JSibQK~Fo{`yB!y`+gOe3@75B{*|I;KK4q@8y}m@^b^$!ksQ+%DyROjld>J4=}kVrJl6pNezO znzZs5HHayO7%+!vu+B~`QpMjdnWf6Xe_*)U?RYY1jWZ~_P_j-iyYXCeOqL^=Y?x1e z`WQFZn$wSa0m|;H=7yuQ9Q zq)kSQI4EkTF$8PDFW#hThQ@USAT`K<@9V$N>;izoO#KR2*Eam3ly00ob+n&rHkaFa zf?2oUn_AN!*Tw<|mpybHu8R)d*CRRrzQjAKKg(fvK{`4&T%j=y`_4n4_`~%Bjk4U< zx9M;F4#z-&6Cm;@ixHGP>HdRj34N2Wn|vKn=&daVzK~pi4u`bAOAY6b>jf9dN0~Fx zVU>NWG=}zV>Qw;upAkJ?q=_tx%x>^HgS@CKV^}*M?oGb1ij~(tC#@rD7FZLB5IZr9 zsTg3U`bK-`z)Td|>I+y*ANkoD`*I{kZU>GUe)iL(;Nf38U-k9{lJbx4#uAm8<{{ZM ztmR7(x#eu_3TlU`Qeyr&g^N()(hN6ke1D-psGaT%f};e>t|sng#EYr7)1YR@ zOhTKvc~C$m*}XlysDK}<&>j?5+;k}x^vEDN?JL@hCVStYTz^r(w&+oM3^6Zr|6HNr zC{F0YNVXM}kouT5hjlg-5B85)x%c;Z3_ef`OfCp~-3?~W(?jMz1@6`k$O>N6oh3ai zv0V4mN6zR;x0k;_Sa!FxFBQ?~>ih=tg0fQhb{lCoeM83A+LB{KEsJnc>x^3V4R*-{ zjEUec180&v0X zEC0Cr{!5P+{vTV#>6`%m*Gvq<|1Vo*j9pdDoy=sdjQ-DSQiT6Y)tVWOGSW-r@q*0l& z7HOGty2I)E3Ee+$Xih9@jk7ZC`~!`mz=FSIt; ztD*-Ff8uGe9W3Ct=y3TfKxQ8I$_va3A_U=JR~xJbK3^l8Dv-a$2Mr%Gz|=kV$MN3G zC6K^Emd~(5`>Dnu;qOq}%5tpc9?;WJayq>&M*NTlbxoxi`5VgEcD+h2If4hHIL$(f zOMA=eni*rtUW04%^ls@17+C7#G#`VHQ;2iHmz>}A(H5e%&oFTV9lj6OSYnUz%TMr* zqmh&0YIxWgOn(<*LBI7UHM*ZK`i0Z#CwZ@EtdA6<)`4ck^F@@C-APZ$V*3iZs9oxNVLxdCWz+1@VhT& z5l#1&(5Cm^C5+9co@Nm|S3sI9yq+3=dzw_iwc6PSL6^nfGH~3ZH8)J=QsC)flbjF6{)*&2}k*vk-4m0^u(CkbqPFnX#)2v8I|S)Vw%3larF$- z5@umK3i{wlVfI`suz>ODqfaIdXJSj0*FMj|Q9i)>Sk;!YS?x-WEn!z=Z{ZrEj~(4_ zhb~E7cySk0(W+A9*(Yz!ZjXHheIUob#hWb~XCq7f;yILh`!aI3+c3~#J=((3o;`KzG;SW?{6kuPV1`c>;SJjUKD zV*l-PEw)>$mf5JZMa?|u=}8!9RS@?qto5=r#mYdmOi;SvgiLaUZ}<5%(SnzzKbB{( z!m%$1sStVfGYqsZ?^1u8bx1iCw7uQ8m0D%W=3<805{?ijIxZJFPUUk>+^9NF%GK-H zlK3>nA@&yPw$xvLLhtH!-8j$BPI2tn9W;y_|EeaHH7r=BG_-Z_LHcTmzNz5Q+p1eX zjXUuv8ox6cIQ-ImTS`v>@*w@J8Hd4SOnKYRyA^c^wpcLaw#<%0nQY;tlMTw#=2k@%8*3j6nILz~>v2 z5i}jyA`Sc$!A*ZR_jBAG9P*MM;RzThslw{Mx^K?4Tc zqZExg9pR<4P6ouj!X%q@^d1UxVA#ab>TvLj!In))u7yjhYG44kGFmKA(WvT1e53B4|y`bGqimFCIYdes=cU zqnJo9d^h^TqA$0K5ir>(OL5(rUgB0gEfEVkao&X>(tcr{v@h5nzY)TNusKJEj&Ld= zdu<6>e{p2tOP#ZjUth|N+i$kIpy=Hk3%l+5mj7~6#A-rCc|qZm6qPh2CtaE;9R+} zmU<;g^JA8ozfIa^$5z0+2H)JGh>RJ#t66R3I3!cWYsq5k?W)hg^iqP`8o zYhC@niuwPB<4F4i3%zqa3-*>z z(2T_2$V&kitduzmyHG>?q*2mToK%~D7O_^mEL@24c3+Y?J7d4?c7Ggoz3JZV-t~PA zEf(Yr^wXol-T*-sBK1nFqlD%HHJZ;?hT~|u8lo9k=wIqpl|#Y4@-%Sw_w!3Uc<{xi z0`mCa1;zp&j^NXq?+<%iSmmq4gM;QP46N6biFi3l{v-He0|7Q$BuIEEV6G{m8VY4n zr=Mna-kUT71 znYrt=d$QHym8>5?FlwS1`LK@joQg`NtHp3m@Ve^6Z15+e`!#-)gWbZA74lo-PN*cg z-Nhat7pr&tx*Sd#C!=fu!9}jg$F^L$TvzBQ*_7s3ZEO(i<3>rxQjeIHpWH#bO zwrP-b7AxaoRq@z$^Uk`VE-b^L!bPNO>P{EUx}=V6PKeqqh`+4+1Jq>`?VnU~O8gXd z4A#yU-oM0ru*px?u_oe0d&XaybBzxoU;iE6)->6jFN3#dVLgI*Rvqcomfe5DXTG7j zewT`7UCArKeo^4mz*Th$v=Q+#X%`AHSoeMZkPylrVL0Uo$`b25HjF64Z$gIpA?DOT&0OuJ9iXwU1f zmzH~kOK$oOB{kCG(z$W&fjvs;lPn%&G*dwZ$D@KlDFKc7x~D6uZLlrvBP8BIUi|h- zsVD&9UCG3GVErgcS)P6;1~%fMI0%4WaL@b^ZfQN+ zOlX*GcMZgv+z1GTlEvFq`o#KJ(!6}=sTATT!yrtimzpBGa945!fAUZ*n>3Eqny)h@ zB#u}`AkvVtH$+fa**=Hf1E3NHaP1}AkR+Mkrcdt2-RG1!EK%buBA^|p%9ibtJOM_0 zDIHc|FK`Xn-n)B=5egbqaF4qdJ z8I+!{t#wY3tCFuN`|+v}dPcGHHm0I*`FsB7mZYn<4Tjf&mig@H?mAhy`f@eNV~#kBVSO{Qg) zT4Yj%|D0G4_LYN3@t^BYAZCEe{fO2p?yrOTE7}~wjm7Z=*jeJ zA|^w=mHs5q7foxjWvEYa_gTP{qF)HYwFf`1ZPOr(a~{z@Ne!HPbUxez`Cdj5xY{;k z-Ba(r%om~Dh_WWf*M8w$dp9YFz@YI90KsS0>DUwJrd}XH4|i=m)6CH$nx)Gkxmw|G zvPcX0RaXy!oshNKtvfof7+E<5SfO4>h^4vX3Yqc@U zC5t{?j>naL*C74f^Kt!RqV51;50kbe1P+dkjqK~yiYMO#i91V7x{=F-G`eMYh&Jw~ z9h|$WlEqQ;m!_xdQeVu&I&$p6(s5|u8~MP)?sA0tKp3J<=8wXfd>~C|Isu!8WT-3@R*_h@<@p=cQsm#Clb^X`=~*YQ5**gH z7&OYxv@ct!9iMZ(RC{uH1z(?Pi{(NOKZ2kVQ#PSeN!%I{i;6!Pw=!%3W1;gCt+`zU zrW0(PB2rE@HUlq3%+2K4<5sFK}%{Ln;EA zBn*&~;Q_D$?gJ3}LHI#~0|o(o0ql@IfVAa48Bu{%Mj;15mWBKAn}PzsmCK-5x882} z{BAiPeZ*phbA=4oA%TQ=c*VFQ70rD8%epqCe?YY%0jApcpAUHP{u8K%{37~Rj>i8d zpJ@M=3Dc!;%+XUGtV4{~Izv*XnjXV3ctv&s(-{Zmb_FyCkzzDf!D441M*p|ArySA~sJhi9pJhPAQx9-4BL!#hlkaO_X;7vL)hBK<> zbO>INF>MfqglU~F2)~#`ec%AVg7}*%m6JQI z*#3NSc}^TizSZ?iv#+Vnw`qT6d&I`y&8suSXp_P9X~DML4QcZoT5lBuR>K_+qF8&- z&pqVv;>W)j9f+V_oFwnHM7Be0@P9O#x`3wGo58T@jo2K!3oVC1ZSW|^Z+x^v-pOlQ zs-9gRkXI8$C{=R+Rs^XxV7_S?VF0I6PPun^s?TaIAMM|ZF@-!!*8`qNr6lCkkPS60 z_m}tR(v?*etG{X7^cwd(1xvh@>poz1IUE^p)BnV1GyFaCYTPEw-`a^GrNDHb?IvOu zkHy;MJsJl^3jgx(Ei{mj#pUhmR1hW{iM7hN`G}B8_X>!f#gVI=dPSmPxS3?HEkQP1 z8jZv%{LFYk>0~{#nxCS%DzD)HVpT2m3VN`?^Gr>+A!O|QF3WGLV!8e_5GP*txiX$R zHndSWXH#cp5V$lruvVZ!V=3RDBpu{>Nru@34>&T7968KtWW}vY$EJhDR^Mxq!xfuC z8lfg-r0`(tP|R&W#X=3RU^j#XiX;B+pt1XQY&1sYW}+}a_tBPq8%Ik~jQtFjA!TIm zdVP?uT#^05ON+Ml5Gc7NwYJOL=H;B|%r?>**{wGy1Wb)LjQ+;1%jlkO|KwfTf%-tMj;5Vh0F@?v04M`nf&C1r!#_v zyj>48W?4zWRozd{aZl1Fq*)}rMW{WLLNe0T+17988G7@;Kb##=lCZ{Ismo47)EpU6 zYnijat>pZwjY{Gfi!59~MS_1Bx$O?Ef$``uYlsF5%bPOD{o#jQqfRiOa#3#9 zDaK-jGlNlNTW)!(PygP=v|z=(=p=Uz5c^v87@n-Bg{*i4Suev zT-!Si=2TMLBH-~%$Qrl>#)NQUdYdqM0|stOb|00A7>hST*UU098`a(%#%OWJmL-e# zQ?}LTDA>mlE2-CZ@0Bm>o6h2to@|zaa_qF;F|c)`roks6|D9VYK?L!RV606*C9O+^ zJN)c!-1|k^d3So3*os`I zluTaCeo1Q5_7xA;?$r%l1U9>;p7c?w)o@E{M6JWs(+4>Qy2?Nvh;1v2OIJ83;;7eR z%<-&O&&6TK*1@F|8#tSSsT~k3TgeJ}oy3Y01r6e~-yW5%J0pb2P%# z)?4J>chI~PBI537WVW-?V!(&#N?*_Hx~W{Pq4vGk_>lT{46zKgaz|aYs_6pv3ww)M zxg|ARQh)lA{}^n_h+Wr7A|(61@&f`VxxrNAPyEITZbK8sp-gTKOnX$4N>i&d-Hn~C z3B21_x3Lz}yX#kXYlCspm}v5=N?H3v9r!}pjmm;}oWZW`d%m)f`;v~ne-z}UT|ZZ$ zh8$0~!P2T8`|a`$sW#Qrxh*^WT_YYTR5H#r0-{1>=pv8~(|Q(%hn&_rpv1#bOi72R z{VXIUikc6OKlp-}A>g8QUBUh6k?U!ta}TFXOCYo7*$%{7gyDy7(`*EpoLktglV_z$ zmey*g5+mW9uAK|{w-T!L_%J^XSFFQrM+5d_@Nk3|!KI7G-XM>a?m zarjt*OXaM&(TyNdI0@L(FZ)0O6SF;@svHG4Yy)U;-~oSlUSr;3CnPB7?aRI&ejaEZ zyqz~RQUTbX{yJJ4-W8;XUgXb&64Beu3n60`Lsz}BbRbo8hW_0n+5d>8zg4ox@&DXy z`rl&7_}^mb$+Z}XIcl0oznO95pv4d+Y{{uays)-)D{mv5RqF|{KG7YB zuG4;Xv=A@oW7D3abd(UXMZ!4#mi%e2Q@eZX>T?=9d+DAt`{?!KxkCid0*(?G2cU)x z?Zb5Mb)cG*7Nmv`aL5O!Hs7Po2ZYD(TdNlgFyy@J02b;068ZfbEJi_B{tGQek9H2A z#BgjpOP{%ROQu&xM26yL#=Fi2R2IFdttbZH!}c1PgFv)Sn))}EauO;AW`d4Fyy>Z& zg$V7$N8cX8#+5Kt5)Pt1vk*%SIbh6Pq%%>b3Y9A5)jOeG70!3R&5yqL`1?wJsT_SL zvn~ayV8H&dUssau?$02oEPiK1K+Yxl>_Psz^n7|C3-;p(aX8qZ5>*FRR5t15z(!{& zHF00`Hzg52S$nZl^`hR9@l1x09`sv6#hb_InedH~HEs8k+m}~LTz8=?>taOB3g>b$ zVhMYCd7A_Nmg+(Kz^Lm+j%Rh+>Igb~uB|15itCOZb?%IUuW;R>uai37>^MEUpm(Q^ zX;AK@LBs&u_6KKb_kQ%da#6?2ZYq!iqxsI|Rbx)~pu3qwS<8;c&@#-5>lW)l3$P4L z47wL)uT+W=Ut7B}U3@I}nBmjR5wRvN*z7Nx^gagEwl$QFd#9@fie=dmbnEe9$4Qy9 zGaW5r=;8gl0O}Q*we_*X%~6z4v46Qig5aw+H?^~6FR8bjv93h0ROQ#HyT$32`BzYU zDlCPWL_3%gu9GhJ>*EvMFW_oO6L*F}FstCXjZQ5o4&(HUmu7}y zJ)bgGuH_b&H)8r+>}PSWcG}F-SHMpcrYP>Ya3#Hn|{DE9ydeY_z&O9la{9vE;jGSBcbS@(y*ub z2pX`_&op2_6H8q@o;}AKs#~>0My?=o-y60aqC9-kACxL-}yhFef8DM$<@0zeEhfGZuxkZ zr-m9oOI4mH)FZoV)tiiQMmeDjqvp*|L)05B?JG8cWvl(s|SlG;7e^hU8{jv;qNGN+nfvfLE=`?#C3@W$X{Txk$t+$>)hm`$(PaNeadh-?%)vdBSu#X#sS)UEKP$V`* z*q?U{_aqw>5xI_%we|2LBbEWC$v=56@y<~cmR(Rt27(GQUIU`zU#B;46~epUZz8h6 zT?W?Dh%wA;woz+xG}L8|LGQw;uW({VlJCaslJmM_S2z#bL)<(Ko?$G~|I3ienJ<5D{}Pg#8MjeM_KNHtubr4x z=(u4$<-F`V1}b_Ez8*K*m2lH?4b``(vp^)`od7=VWIiPF2i<%L!w-4IUUxY*@mg%{ z*PB@@h6*-$m`E*79pT$FWY_^JA_SmD}-=xbNB!AMydIS!c&p$Lot*xgTnkCmSX zZ`Qlr|Ln8-PdJ|fX}|u#8!%j50vk9*CypUqiH8VZt_uo0F9U=yeo$hE+<4WWRgNd& zQ`aAm|LrEgKW=iBO&Bcy&si7J|Kz41zm2UEzloEvgOI+{f0_}!`_H2;|D#naS&)X3 zPo8tEzJNr3jKnOlsIMWZ6Q|J;6ro{J%`K5Qx3n^~CNgg!WR`4RuAw-YRFY^Oj)V*! zv9X$>LBhp&lJ&aN^?u0tx^uhpx%)auuZI8!7iHMjMmHpX;yOhQnuirP?T5^VR+r`d z2@?ZI^4lCxkG|)7tvQ2-r`PNC=_||j7wv&}5D*W#6x@HdmV~$b1S<;Ee-8iyxJswN z+4I#nzcA&Gcm~Sz)bJJrWxoM!0(D}@N~RA6SMvi|pz@lp%wZP|4pYs+_nY`tQ03|5 zNNzKWC=pClwC-!jOAxz(BEmYHa&zeQ(HL{~Kq`kux{-&Kf;q$({Euj0(}M`N-X|u! zwG}Zvvnl}P-!XywA;LSOqeu^bg};{D05$<8xo<%td098Q8lt;88(lSqhckKPQm+;v zFt(n#2w{R=8Ywsr3?J_m8-r$VWQ1G?JxQra9@6}F?tq<)PgzPaD1&4(COGWgPfp5$_dt|M>}V&g~x<<8C6=%CVW3 z7A@P5Jz$RO`Oi2e>RW{A^e&3wyRF~ggwnKp_0JJlHz7;-&_O|b zf5iP%)6q_AKE5_!oLZaqwtp0EyeuN9hg31(IQHv2P3%$4m^@V(z3O4;N===+e&|@A zDYn`N11$brWnBiTM4OekGy~gkzzieUWYuDh$)OniGK6tWU(_uu$2FAnSaS)k$Fw*% zMckE)keAG!cMijjpksdeygbHV>wHO{Z8#*ey1T@ZugN>peq4y`T{8qDv%mNJ?cnSG zH1E=pBD<9iC=FfFAr%ExQndMl`=!o)$l*PCpw8dK?86@t)66Q%isq>QYt&*`gE+py3eflcJ!Xm>DEyX7L#lu-nd>ksg z@x0Yi27N--)_O$&_6#-c@q-f1!R4Q2JFm}7WCDJ$IYaiJ^ z_*~v@mB+~RaP}OVi=4bnPU3wUM|v)rgUDbQo)(xMcgAnxR+5Ts2(OrRxE-H+EV-+HYs=@6|zr z9rS}!-f_@BBDiXQ2LLEe#l$y_gJGM=kMp23nQ76cCG5xlmZ!KJ|i_e+C95x9jw`!qUn!*zkzBYF6mK z3A|U)cct5(H@po3OV>&SyMfJW3pR{*Bs(PUV1G1b3e?YeIu28rkex(}<|j42fu5b6 zYEj9eWDjMCS>wG+qQ_FGhA}uE!M~O5cTUxc!v-hkqF?%qnU7xGMPG~5-FuERW7lQ$%0Ne3cSYd6=y>a(5H%r*t z)=kU!*?E5s4F?_{ZVsBajEhZDE4D0alON?*e%=RfdA%#j?7Igq8|3{+;`IJl3fl*_ zI0g1$ZI_U(pM_E&@eJ2hzsa>loXfCLL*uZRe!oO+4P;pq{uVkl!h$Lcr^j6n2`?`HA#=N3DG;2H#b4|qw$Ng)v#S4Wwqd+DSwgogTpL@g+aB_A z|LgilIF4xyRkH;*xW0?E3XfCZTf>h%0$hug`D2m5nSxiCVA0vdkVfDEbMO{dl?+0a4t22HA4e(e2jl^66l8F5i2!CD`EkdOA5>9)hO{QAkE0t#noz& zDJd`oj7nF+5|+Cfmeh$d&nod`BV4oHt~X!z|07Jd_i>P+AA(E>dJ;sEkDNP&*-{aV z0C1nK-wF+JYOPhVPKy3Pmojb;$#JXIDj!a-7w(rfNEvkh7afL=?}|U|D6|Ac?WGfr z2#ErMF3lkH3H?SaAM!)Y$wP5FEJkiATH*Tbqx*;#TNvBOKCNkx-|bc*@2kAQkb!w) zIxua5%?pGpmaS7tE{lfIy;xaR7|G*4fcn;{_%lkWa(&~(1xUW;j$dqc=}^8IFQ&7i z)DW=o1F`_taF_Pi(yQO*YEVe&SN2*6!P$N@ExYN)*{W&ytw9S&nNrCqBlAzR;N z{K64`#Bm#-c-QyiMnTp^K#Q=BrWidbIh-)1W*4@!bw$=P`*SWRpHB(}u*XnrOap4xh$}N%^Di-GwZba1fq2+6-Sekmiq-g1qUA#yMk0$QA zG}N>D)Fc+1=bEGxk88Y-TOHeJTnq_cP4OGVx5D;1D$vr%;TH50H6&F@6L`e4imnHB zTM-uv{H3m8B-Tk)b8f{K&F5`P7CsjGxkPZGF~C>q2wy##g{b}GPbebxovh+WO*uZt z#X!^|@^#DB;OcYqY_8AFUxaCuKhU|=)9Pue_q|xYLJOARaEF9-mp=_!CL;nOQ7h<~#d_qM`N_7TmzXWooAt zBf<$%yU9CPKczPVcqH{Ap_-vvpT^8sRHAu?*+v|k>q;kO*ad3k4m*f9qmS#LjA@06 z&I=0bwr?z?<cNAu7VqbWky+fLp{VkG_0s@Q=i4F;v?r_UAi&Xc^5T1PvM z%)?nZFXcA%r^$(YycjWhP~sU3oN0Q6)wsvbIm@*fG7O`BL||ZSkV8^2XnH+UVlArk zVcL<}k~n|gJi6G6QV%> zl*WW7La9{wJ*dKf44&>RXh78Mz(aaCP2)?yyB-U~@-tq5l7cp8Ujl29qRvRD#>mfv zV&V%554T;a(voaAL^$nu$aRrjBjSRL!@rhYA!6=?0Y?P9-PMJqR_)3#VdDpLwj<_| z!>WXbhR0_NJ^{DuGCT#9`BTO}j-anmcjli+7)yy-_*_xH86TFAX&~<_EnIb}SMP~? z(IYVVe<@&!fm^ScoOtNkB+jI2Q)Z0pW=FUjF^%=Q&7rEPqwWinrURKfSUyq?Ut8H6 z&6B8{q#anjyW-vw_RtM;G-r=0Idz?VF@2W5txm86iQ5E$esro!Z8ehoNqgzaMCC>D z*gi=c*YUq^{!F(dnBJ<=S8Z`zVL!d*VCdv&A@{AD#Vb6Q21k6%;6A$*SWG28^aF3~ z3P5vckE?+lmU<$6U9@CO9O$qVtHX^I8bCBa!IpW=2{rsGPa{ z%gOK7mhUw)PlQk2%sd;q|NTADAwxUdvlPvBw<7Llxd6PNfl4%(YW7|LocWhw;4b`^ zhWXl}j<*&AD#o^T$BmVLo??Zvqob=oC5aie`CQGeGUo|1Z01ycA$Vgr=&LkVnCbB* z-E~e0L+Ev3;q(L5DjB8;rKswAs!FR&*9i^v&=L0>$*vw^OY6Qw5uGkn@i@!Wqw6id z$#>`oB)9wXLiFzyDEeNb3d((^rCazR*o<2AuXl4&L4PY9s6%?WZPjxP+v?*yqjODF zSQ@K0bmY&aSU*6x66lp*B>-d{$d^Aj9s)QB(2FoI*=IMe3T|acGSKk+pW(dFVZbyX zBIW*)A7@bzC&EKh#}MFKN0@_+rxrD?M5@!bgt1c)0!AppUJ;@; z{*@~TQO3(lf?r3C2RDPOyUGkAo2;9lAx4rzQYVUn<}PK-{&Ab_e(iq!cEyDgXztes zhZ7*qHxdtr3ExCZW1_+p5GKS|8uIr>4uaeLY8E&a1djy1M8X2YLMr@)@^?e}nB~U_ z0jd{EAN@9+4$I}j>Dy=E!wLe(fq7bF83=>PIuKIqJ>STzV8kEF+t!(sc(?2zu$tp= z5q@l2K@73qKQ-i%ZQ6M7!=+a+JujtY?^9i$!O38cbp^L~6`p?Pi$_$hrpjW_s-!Uh zJp%dCn&KB{DCnVSx|8qQjiFU}5m_R8m(+a|VmA_)Y82Pg|D!Jg^$a?WxNo*aePLzI zmfziEUQGYJUsl>vj&u-h7?xk(X5kqGViA~<|M&~;Q^2#$q1kV9`fFB!_>~FS_$h@l z;u-k#&3K`Mc7!oM#=w@s)`ZZT#_Ds?D2*AbQK;g^P52$>XL@~#C@~W+QX!KB;%}aF zwkc;}_8XrqRSfb`(kOE<>Pw&N(z_`1zQiVtbo1l5>_TIhw(bv$eB)lM&x)#(qlY8C zsZ~~yqf7gDc|`j|7-LcKl+-94rhnKSl~a@GXzC?jq&5=A8^z{zR`I8sd`Z_=Pi@d_k ztOCL3wB~2qR)^-b$0`5OsPQ%bAMP*7OrAU&%y~rl3kUt^ER`G!I@I^Xvg9Dd6s|H$ z9+Q=06EzvXRZu_q)ag;)4p&cD2x7CO}Z?xgIg zym16nNZS+`h=bxAhhLk^Udxm1^M|P~p^>I}Ag`E;_kmclUBh5yW~pCj+8mO;&s4U& zMT)#S!L?2w`JU;XNCzmkCqIPh`xh+1E8ktT*exG8nGMTDx!)=YBol?v(!#34B^^*B z+_8UMv;q+^?T;_2JROG^TrX~}QjI3B^XiK#an_lc6ETK3BQ!ddK2f}6s7XZ{SS;2H zB-sE&UTu@`mEzz8-uqP8;; zlk9uLNf`sMqkUE9FGHrhlxNKhioF7vhhP;8w6$fZw&y&2o9*IR5_C@6o=9Xu^EuS6 z*&BPmnuH2xRf;|(>4;n~uqPSV&$}Y_%QFF+!yVg9ME(rq6>JAUW+DS_1I}oG+CZ*Qc|>(*vL`Q`*zD>b<5s14J!<52;JH`o z{Q}*5RI>P-Cl58f1f^kOFtQ6s0jXk-XDnIBP094NW7&G1dv@W&>>H|*540>U&Xl$# zy$LZW624}opiYbnEo-l&>(Jqp+4+rYBGQ`s>>g<_#1wK(?$#$?cl-`ctpwOZvW5sc z22X)L?MNC$y{1HOu@-<)hL%lYvyac5KqC5|wZJsI)HM;-&f5~72Uu9|cCX>VeXYnH zgxF_1d+=LTx=tLS#rV;#4MRU&x|#%*1XL?hL_Dg_#g5@9P}b7k@Urd#yk_p?=8a@I zX_4(sz#~DhoSR%$m3HOV311RseG`LXuZLxywT5q_e0JW4;)z0(W2nEpOT%Y~CBWN}CG)mk1Gw3C7X2c#R-}A~K zQ@gIe=epIHX&y0)88#}e**fEAj03pF5SRp2Xs~FIbRLj>SkzL`JEazDgqt2l3KWd& zAX!tBybjLx_O4JphryDVzqC2i4VZ1dIa(H^R=ZUuDx=3|9nyTzcTs$9mIdlM_BkT z9`^J)qMgDx2p^)Yct>NE8*dxbk4uvaCc-yPqz_Lqp;IOe;a!?+9hM~#vLN9z#lSO; zAqzAn88TTsdwlzNe%-rs&px{6%=*q^3Lhwg1mck)SYeOU#+#+KePV~9DhUNh3yRl` z3wmM+2Pl0t1|Y}dv4^UVpn+heZ2m&#!_oQw{uRJOgM>Mzd`>9%E5(Zo68H{40CB*Y z`kVIdHKGG`?ChyHNc$c!{z;=T$!y+n?*U}^UXXgXY(X{6H<#Gy-O=}Ov_R}DY&MwW z45oyazIHT=a>B}-)g{N9;$5e&gDIn~(ivJ-*}HO7ijcz)`s7sMoBYP%Pe@C~t*&I6 zO|(z->Mg_Sx%~k$LtkW5sm;T6P4v_goxmlq1hZoj9;)Ghj|>86%j)ZCJuIF=NwW0| zOkwJ1x{P7WjriOo_aUYvQfXtUPCCOpIaov)np+PV<%JDt1oGPjuT?02`umtgp-q8h ztI^+d0)veFNG7g!H_H5ba*=Lh+%;5gm4UZf%GkG#y0Vll+j;F+oYTCGYY1_>d=Yb5w95 zmhwanwPU(c;w)h-@+2Ij)#o`ZRpyU(B0=OS$jvgn=Mwx5+ml;#r=NXka?f?bTjK^_ zyZ>xwHSOtN=qgiWe!!hF9YN^!dNA|moKn2A4x{7e^}JkL)xt^p{bSk}`F8Lhl=z}6 zihRh;cUG=-O7z#_n5IDA2Dz?ic{kPZ%duI0TG<&YSmPdTIBIvxUm`p<$@OMix{@<8 z9(U9xV$j_Ubiy_Yp-n3fN@llsSd6$pHCib_`tF7jx=JJ-F04*hoo{p$-5SfnH}T>~ z8PTnCdBf=6jLKy3a%}7Hvgep%^4Qx*&&jxiv5)xnZJ`KFPLf0nCl=}i;|-19ot3mO zPYdD~)10Z8AR9bkCwoql4#{&b_dgR=ExL-t_`WTqBz%y&1hwTy(uF;v=fa~}hqj(@ zNvOA84~H@`-#b4yi;9Zyh0` z;A$0upsa=ChYmLDF0spTJCSaf(r6}AV^Tt0qBluPZE!gEeKd<|ldcB7h9|5Vlp-k< zn8$(hn$rQlXl#z@TUok5ve)G`?K#BQ>V668AAqGHxV@m0I%+Q1BUxm8vROrRBOD z&mA>P4J=h>Pb=PWUp!79kI*{`ppJeFpd4|x%A!d5pOqig2t3(zG!-4B8ig*+7xYyUGW5}BJ10%gq;v}O z4=SE?dO;GNiVa9&QVjVe zmqvfhSU6+j=ysiWO%WWaeLBrck;En?nj}yrcPP5~c{l(K&#Nd#{*YQC+hl0;Nt~ z%SzzN+HikHk8Q*d^cKT~A7C6j%YaECAIBRm7;z{vF+7V&E8{vqo(+a3jc#nzXR1J58HU3W4kk zAIifzy=S9?EBouZNBUK!F2fhZ57z8lw8CRpp!{VM%j_*plznauXtL$yL1buY;bR|9ETF zGZB{ekF_QLzrAJr*Jka;|LJX#CmSL(=7?(pyEO(BJ%PZ;rVz2|Ut(3Gler3X2NZ;4 z6yq4p#Dqgrrg8jG4EANqBQFUV#WDPPId+nvs##C%-Pi8j&rxsgSx4U4?_J05I;Ay4 zIJl_d0iZmB4ExeUmOVbSIN@OJ06G0rS8Gu!?(dn!_+@9^Bp6-vz zEg!9N{S}m#=FA{QwaJhaOoTSg_lbO{KqzrFmXSQ$hlVyp`(UYe8vy98~l!h8xJ+qhf`z+7! zETnWzU*=L#NPU_vX)KxP2 zdq$QV^`>ox{Fn1!@n9DNBhu{%S@m8ug)NRl7IfwUS@Z36_8&4ZRz1ds*u9kd;AwbL z9$FHk7CflImv*j4Zb^mG;S!3p%o3-vJp!lhB1tsoqub_HgDg+RR(L{{@nQ{g=>4i? zmSoLrt7hukL+3d%+YqNR$qe7!2yS{2i>tTK=vu?noi_qgO>D!!FqYSkj&?yNyi=Q+ zkOo%yqGzc>4am2jh2t&@>HMKu*xxS=QXrMXoT27%_X`d#+A1_pRj^U*q<+bxRmb(B zVy6cvl-`}DSdO8)Io4bG*4Mn^?=>X~!RMe1z|B>*ppnvy=FQyQzvAMDF;&qj%XGN7 z>{GfbuB42Q(KfQMnAwqc?7ijbIZqv2DUmSar(JrlUc)TQ!V-*b12ntLs3->7#fD)q8^io~TLr;u5 zaN(LGu~o){Th9U~n=hU5#8MbS7MZ+48w_&+h-l{)T!ip^6mNzUH5MBHEs;(lQoL?9 z;X6ZvWk>RAoK3CNj*cvXw}0RS_ze3i*yk4xg0l1JzO$U3&D8|kqA%~0K#nevX=B%7 z6`Q&Ty*glwld9Q~E>62|j9g%)+J1vh>2 zNC;-1R{GQ-nL(3wMcw3j&74pUw&~*IGm9cr0c;+le>`^xISokSDq>UyWubHomIWA( zhfc*NOkpLLFp4{DS{kymv9}-{>QCsHy<&tw?Dm;%mxU%Ta9DFxnrDCI50<40XDcd zX7hXGLH}D!Rl_s+IrMs!^ZehNvU-6#(AgkKZ7F0~Yz6WQ+`l)Dw;WdFh~p7IRGWg7w@y_8WA=3fnY zR#9apa2vnlHn$9gRIJACa=@&y03FeM&d9=iRq)j2gtRnA;Wju8!J%14+!k-v)+}|n z4D8L0udTSN_cf@-s3N6YV3Pk`f^4!mjZ_MBF0NVmbdr);P)=6u?ZZ|Efv5Kz^9Ig1bO>Hk1VuErS zu)8TU4lNx+>U^0X4IOIFM=pRUkFW3&qVn*6*`UDxkOA5O$nt^XA?-okZ6yEcvu=GI zvM@}pCy>L327*pN1mcs6IDP?zeXH=q_MvO)w41Go_ImB-3z{WPYu{iGa{t2okLufJ z=-_7jKdR60->UDv@a2dz$sgefst4%>xiziv|<|gwz8U1i-S) z;VcL;^@pbD&b^<^%cheBKCe&dM+YC0yw1B51px@`8YSMB3(zcR&-af$9S~gbJ(Qxg z=}uZ=I2<_d86+r255guMP1V)mg?sZh-GOAFrwHn(?tHuN^B1%{c|+ezfTYJ#z(Qg? z%hmOIsMoqW50lJOh3pYjB}N*V>1FKm&y^%Cv&TG*t9^Z!aIy~IU2;{y47Lw*!S{(A ze~xt~9QH?!7^$1mKYx8j=?7fk5;oF&y`1IwIi@O{df&f{6db=Dh`%WGCuZV}7tAT+ zkb;0*)hSR`7MPDb#m5%oOOI)w=jkY8)Bd0&P&o&Ps$V8J2(&H=5(C$D|J0hsHX#A=`Lh7xWj0kx$gswr()jb@LwkoQajP1;C}nf8x&Q6pM4Wmz>>=;A#~0iC3SXe2WtGoKsvij%6-iqa3!ls*SU_|C&@I zu`5a&{IT0wrKG(CUjsM&qE-0&JL9G_<{Hn98hWX+Nw!mkXIC&)i^9(L=4bz!VU6b3 zlER}a|6zc?(ktrPn9tI#Bl33INQ?Q?T5@P#z+K&kzLGcMc<+=6V(XziEYkLJ{8M{E zvY&*^);{5Aqvj$ZiHE?<@$|F7y%epP>>~;@GQ$iZF62R#Tgx{7P@Mp4NC{hY>dvtE zV#%&VK3?to&*wLN;-`nqz=ghfO|hj7nMuX7fsz*^T6|5P$f@a_)^c=tPW7LO z-J{x+fl=67Fa>qzZJTYnuF*q_6SYmo+DUDu;Q**XW(ut#hY!MUo`PMxv)Q1dr#QLV zv>l{O`FhXVmKMivF5q_l=hnDnL!t}T2#Pa7lED5nnpm1`Xq+qFr|>s^9N)O=4zU4y zm}la!WS;^XkxF(0Uih=Xa8(TCkO&#DowRZEu}Cw^h=Y{_^TZA5iMuZUCle-prhC_~ zF0ge9D6(-@VF(au)TZjm>JO(?r0ZIJ5e4ZJoS+%?ZaE`&+Ud) zzHoH+ypu#rh1bSLTE$k9EM8~FgH_JlyeLVNCfe`%v|^tD`L4FVI9I?`w_6dZ`=sH` zG%E&oWL^Jq`w zn57*X7`4-s9?4+$sb;U+-<_i8KEf&^u?(he}P1zcfv>Gnz z+p4!zw6;00Yab59^vT|QO52eBDW~>UHNC1MEsiIbnCnU2`*cXM!$PD`a4*d=fFfV8 z^V()1Bk*^=Z>hbzecckfADh^3#Imb2qRMU z1~PppTCjZPJkk82FefJ&a34g|qDy<&o;bYqHL&*FIU76HsZOP2)Z8Y4(kI9M!_iWC zB8tSC?GWGPTB8(g%y>BbH{%ndWc;dwr#-$nn+K5&?c#mR^_PL5nyem6x&dET7TtvJ zBCdFo7&G!(ya)$2Mj~z%rN2b_jY&eFf^S<}ht+Cm3dj&ig16Hm3OH#GWz{m#U=B6| zvr2m2GZiwV(6hqKWb1U)gbFM^YlwLL{&{^(%oF0i=edRhVHos z_NFaH9B=B<#H&ud4iy-~E+zVGq&2JIh#1?H@BX(OWvwtU0Ds+Pzk~SxTO(9Pp>>)S zQ&A)BW7F?rS5yoe8tktFz;M73A4(pd99tMP#~*_03EZRB%|AdHeq4BdewC2|_@DcD zXb)NR(^c+fd*$spdv2U1FQBQ!*+7S)8@b;My*15uxc}RGuYX%EcMq;3^pEv2{}0~( zYg+%-f9k56Dj|ZS1TW%4ItY8fs2U>Mf)irpdliK<&B|rpl2|lZvZgB z0U{GBM;Ig(lYxN>z$$YPgfX2%PG&WBHa;HayzY44{&?d0lj{Kk1wcpvGC|j%7$P^4 zLn8q+qyfo+D*}k=4fw#N>Fw-NqD4a3u+{1K`}qYbJo@4XAVJ^f@`HmDhVg+!t5htq zB!F4)!V zu6lO(+yXOHQZezY>lN9`spjT%J^DF?g}igzJ|pd<^@EEH0MlA*Z=eZ?`C8<_#Xx`O zcd5YanuxhJm10xUK?IM;s}J^0doA{^=||F*w(K|(-$^w@!=&n+qBd*ErASPgN)W{{2&71uwTI3lt`Jxw0 zV6CM0?-pu-rBme$#hjVI=7bI3bv~e4c=r;mdB?Inx^aq<^%}D>g5+ZSZD-NzjfM@G zrU>z%22GlZ)Bx?q@LIC`t=pKZAU=P;1CVGN&7bsq{yS!Jm&FN6O+DG3_-Vc$qMt?1;AEmAU#8+{ngC3B zVz2x4L$5rsS5fO?N*V^jhstqL@wv%-L&p87BV6LqF9V0KbH!k;S60)(94WJ?AunwK zX&2Yhu5FZ~WrwXgEbOj)5SFZ@NVD%Dg%wFY8>}K_rEOeULr5nkE4&|(c|y$WfP6i7 znaHLt7**b~+FO!U#}N*6L4CG``EF^>NxRyq2HZOUd2`HV{N0%M?eckfTWnw1`nmm< zv&|8!dXo&HdQXYH12y5Cla$lM3PL*2`2NL_p544h7{ajVUCOYFn)>EW=j2o7m2N`m+uUg7@X(Qz+>6@1;=jJ7Al{Zyq)kpnib-pO<`KeEqRsgD8Li zHK{p5AVj4**p7bRdFk@;oZTn-wU0;}a6}|=S61)ELb_AjYVcJBUL0c$U8jfDszRBs zCHkDJD~wXfX@A*A?~Xd*L5Gz%*c5dG*8wb*8{NrUonI?J1&4d;Xc)ks{u#Lnqg6Ev zSXf=1EKe#z0w>Kdb^V$q$B?OUC{30;+3IzwtIsAg8AF5VsE+E?p| zv~6}4td-jGhmq)~hHdPr1cZZUml|ak`2<8HTk8}uHT%Lbn~L1#&tIWZrm?~GiM?xR z$L`ful-rpxD7vRNi9#3Y#a{FZveb5%%}u-1LZ7Y0qY>(IWoLJ?G9RXb;j4>TRb)|S zoQ*>#%+nSPnH*>47$!}aEG`j^2{qo`5BYe02LTk}XtJrQ&vj?XS(^|gGnlfGXe9D5 zI{9ZcZ_+i2^Veooernc^YbB%Hgc=~>MJ`l78Fl%njT*~6zV^$`NujgN>cllWzGaHZH6UV^s+hB+7Z0t_Hh2PY`UB?zEpUa;! zVX{ma@XSd=SUw5*OJP1$G*r8#z#0QKfjDlkRbVmFig@_YV;Kh;UBEK(Ye0YSwOsHB zAB4Uh`RItSa*f16UA+z;R?C1F@)Vff@FE__HE8Ur-4`=DU-{KZEBs7a~=Zl*k&cL7m;0XYX_lFKx3vden1gHk6?9T&`9LxtL zh%-qPm2>_dWM=;FWKQ}Y`v6RFqrRiiFVzYm-pk1-1P;cW#LyC()>6e^=Jy^B^|DYz zj7b)R##LH^hU#Mi>w`klZ3G&UtHlbnR^4+vZ`)5}Zy$SZU%h*OyJ!CZ%)9E#u>ll# z%N=+sTr08`<(ZNF5$Yu1YkG{42I33)(4|EBBQ$oSmOw{lREqaY3sP1<^us77An(T{ zaK*>}Z2H2vD}p8kod7;C`c{Bwp+J$5f)gv7Ns(rY5IYUD&Vau%K44Zpb@xS@Lo}QW zfO`MU0)?IS#9M=yX=g6jNPSEC_bdB&Amd>t-Hpq&#Gzvo=Ps7ohg)+7Mx|+qh;ozhW0>{rD%O zjf6G{H~7zB*g%I@Q?{uBk1P#8*>!WNPOV^0c^1AG=N4W>wU+x4;%u+_i&J@`cAsoU zh+)J)DT@ntH}|bCZzT~)AjohvD^W^T&1~B48RhRU%9NBOaI= zX?!PCOfVC3RXqpKPN-G10aJq_k*$kj9E1q!Nu0T{(qb@pXnx(zQyG(1J)%7YGJ10h z7i(tie7vv2?w0N1Cy6f+OX9=w6VFk7GEqR-|=-?TL-vewxmRp~>APnrw~n+k7c zD7&D4dG#&FDO6JQ$glgj;;ybq`%6ZDrdzmcNTN*m5ExTWq0ja#9s6Ol3GTka>ukOrcCMQ21XPQJAt|9y zl~b8sKC}G$`s1sWUNU9DR#sc_Bpg%vwvXqWtO=@a^rswHs_9!IE(<|Ywhub&7E!A# zfixbvR}AzAgi6e`DL&RWKx_xCvgy?uZgm)-V+(($Cn_Nc<-Loj)unyS?Hn5YDvDt(J+F(2{$NQVqbZ`MSw6 z=9uUDJy<_jvIhvd{E5b~;{po$Z8Ds^0uLPcLWM$*L;Dki42V~?XWQiWD<0{UTsuQt zKYI031PT;HJm7)W+IR2Ar^j8vD4S-flG(N_%1>DdNM8IP?=;WPY3VRQZEj*_$3`&%7=C%k5n z6e;}ddv=eJy31O$vd4~+P_7fDS-WB6)1$gsd4x(|fPxOAQko@-;kv zDpCX$TR&KhqEzF3*EU}80xbyZwwC>u-~#2i6m7V&x4Z)82PZeqngiRlVUlEZ)7GSe zy>f*?5z`SIBY(3R3oTYgQ~x6#t=jy#5{P@E4;B#qlX+M3^_1H^TOwOU2X}=kY#%Tt zHW6BN81e|d%(nG7u&EOX$>+NRp8>ZB%{XLH+d&{=OqKM|Z5wqS0StHi4QDcL4ofz2 z$TK89HP8F4l~KrbGT#BaEBj2wNFdKENrpoCb-cTCQUm^q(QE@VYWmgL^wIAWJtPG` z;wAb(Co!Lx3Ez;uA?OYYS=Gh7^(T8c%Wl_(Kr!}cMMOU1k{n~Ex%QXd`K(oc$K=Mu z+%fm?)t^lyMkr1E^MAUZ?9P=0g*uw+o|kSH!8W-v6| zd^<6R*I=T0zZQ6|<^9f0BcTBq>f((r*V`Lr%jsWZ0ya<11yb*yA*_&fhyfs^xq8Y$8p@oro(*sfs+OoPz2 zxYw?>BPU(rKS!JT}Pk+*%Lp$Z>jaJ?q&ZV@>unxiRCU3!NK^ zF=X{e7YgegDdLF;q*9oXyX-PQ0aghpL@k{?qXj_)8=ideL9~U6RWMS79-)#8W^u=M zIeX>jJwf<$m7>CDDdqETVzGC|?EuIF8wqotkEU1aboPbz;?H3_i9b}!QvV{Cgmmgu zxpVn_jun&-;M>v-sMfRoM~@^cF<0RB0f!SVI>J-)`hItQc?gVktwUF2^N|G@vaW&^ zRblONptJh}H7d;8u=3jFTxQ@4t;Ns~c7{iRF_}WOrneK56_cIy*~E~9kGf)VY#iz@ zNY2t-+2WVF2PXLI^A&HT91p+UwQ_}SR$@1q{HC}ogp$xq4{eW!k5Mv- zu%;~T8kpq1E|Wll7}|i%rokqH2*fWeBQy|IaK8lubjoie&l&B<7WSp7=?F)}PXR1M z;Jp?GK8f;yq@II;k=-0nEKky*bwvn{v4AAO-)4~rPR!?5 z+#}sDGSrnUnzBasN+YL_D6CN4X}nb(kL(n?Ptwx_0c4Nc=IGS;{lK6BhKj}!4IH^P zyvM2^JruISAxK5Ozxhxz3{R3DSr7C0-8_~Y4=&Y;Rx~`pBRai#R~*XH>*1MFmc2Z| zs-%L+vW1Upm?06JY_AE;lL^24VX>jfe*sn5Yz)&4dS;E*V4( zs?|A`w5Cu!8MaOoJ50`O`b&AwP}0uBrGvnaLwK&@ykrz1?lt+^%o8|`M%K-OZWM>_ z+Px8WRbRkLeC)hxbbG2qy4?d{I@PS04}k(-imDEzHUN7rQ& zpIa`&Dio0&RF&?;J|Xj+1sz z(^=iLB6S}b3r=QjS&45G+80+nXVUz4#HD&PCOyv*!UQR7=Ouflai^?aT)Ez|B4VmJ z;t_pVzwkl5Pxk6*YqlY?D!+4+^rp>1!`SLb$spc$?bf2Za25_>;fC6~T8%5JWaKlzAo-YYpYo;xGj@(^2A7jO#|ry`gqU z=;-EsKw)4;fP{O{aFAJlz5qsAx&UUczo6B#sYFo(Aj%>H_HY0J!W~IJrdh7tgAC|F@%o|2W#K?UUsAPr2;#&ms6P9sPGW>HbB|lmFuG z+SgoWtC+mC@oBKM9=E4?Rs%NiR8doir83`cKX>wkB($&6p}oc z@i^XLgx0J3&TIGW_aWD5)-C&K@8fr#cpVuWCYp3Wx&S+JBKPA;Og@I7EpD z0cD~1-eIrkoG8)VN_Z2D0k90h;cv{G7}*!^G&u`d#-D-t%NS}Zo#Y5me>OiigtQTz ztI?!g%5LEfA*ep+Dw)&OTWJ^LnuxT_-uS_p;$D=}+1nr#ggbX}MZrf1h%rvkjr15T zzHEoF1#^ypf&$zcgE1<1aHn4rDI!+S5*V zL8x>R1lbA4aXO??juxLL;BnNN3uVzBlB?T%R_^;Zs1=s{TN0}q3S2oFr(K- zqTu$GPmp7rnP<9;qSigyNa9!lDt97~)YFX2Db5!eglUz_PKk#D0tz18gbQ&Q>PEw>!`jHXFW`p!+_xm}&A!$)i>s=qFrap$$O`1pJ_UKHr8t=lO+Z&Mc* zTl!x6rEUm+5DmF()cmS&9T|uzKX6BVp0OLbX(jg85K|V~)cA|nUb0;vS-I|7XDysr zVF)(b+0XDOj3YqfUwXDFserkJRFm>#J*yD{@4owLu`zJ9v#Dax)Z-c@SF*4zY2c@l zj+LqVNPb_!T)rRJX!O`=iLP`Tbb41x26=n*L)kS+9}W?|T29njQZ*)AKiXaTX@f18 zIBfk2ldiuP(ttB(DRrWSh+p$YniVe+Oi0vsVw2&fTCdq3o=ccuXHgZ^fgkplZL}4$ z_oQ7j+`VNlV8xC=tsk;$KAq8W3eiRlB%p^~QbaqN^e9l6{T4Kde03lF9ch`wFxm*i z@8S-I>kqPwfhg8^6zwuIL?Oy+8)5dYp}Nw})d1}QTDzMjR|&#IWP*IJiu1K%nmHh@ zXB^-tc31PJ8HO$`(xF&dYPTM{RpeXf*=&NDjV&e(z5?UQ5|ER$uh+pk5=rS-48Qu6 zB?N(1Dps{CPg*z-hJHDv+9NJ+hOD>=sy;?py-^KWRaT2uxNABM( zHXcy_;t|PtsbyW(nE)H3isOsExtg&VPQ%M+Eh!gx>ngjM(t0uUKL0$GUPZ-^1wT5 z^RT!RINI=f&}q0@)ALVRlpJXb^asjcy>>Z#M0rq777<%we)fny^*^^aY`u*xYB1xV zAm&snQ%9SebccSsjH7@=$MlH2>$FSWZNCK3_Ztxpinn;1K30p7c7xLtc0aWUI9PFB z{zyZibd71fF~*hEa%m9N(r&uyxvsIeaIiaGD4r{981LS}zEaKVL9kMfj{nh|rJ})_ zrW0;&wGGrib`M;l zHr*MZ+qP}nwr%sYZQFLAwr$(CZQC~I&0yurB$JiQdRF~~x}IHo*Ilfx*Ijn!Q5t%h zGrmqsPTS1X8}qh}o`q_nODtbH`s?zIQe@F`dUDOmpq8$>UO`B)UsB<*G;B3+mqK8M z2xd>x%Py%Z0cuUbF&SF<_yPv}6!nW(0$7LXJ61W=tXeHbE-$tQ`H_#nD1;TbONqrT zbb#KjJK(jL#cp>)R*KhLFZ$CDp(EJFdgh@WC)}E? z_;|1wzTE1z_1DpUa@E(UvC)9P2gTdWJq>(6+fnLmu zds9JFhKJ()X%QeL0Lc8|5um=X@4)ZK_hH?$m-x(0nn*H`Cu)X(!6NE_5daaln58Wx z7=>rHA%<3+Yf4XyP;m$PwaLh4&a;2s{w0&r{~yQ6`W2;J{%^+#|69lZHI#DiKQV5> zu^E9j@^`Gnva)z-M@L&BqNv$f=`uQ-D)fR(3k5Z%JRnb?d=sJ2mG!YUy>Su;f!MXXBSZn&G(9b+JOOw7(_G&CGqaCsPYLQM63&oKJ&`@m^kIp1Qzgqpjvl*JRaEyDF> z^&ww7rLqO~7_OeGRXx&L4frssH8psU*jiXgHD(qa7H%3_Z@jDgN4n>?=MKER`$vze z7gY}_$4H@}Oox!*&E!E3?A{=_N-7j`FH4JBa7*i#OUwR1*DGRv2H*D_&|~}c&&dFg zMVl`FG^2cEdnMY&XG&_*>)&CX2N(6YxoEI_lbaSx*L`;4aWKZqnErD~l}USL`F0;_ zGv&w1n=}r$C`bWq%{LcDx5iG;YVTh|3R)h?Nd+q|fA3!%H80mOD$cxG5KdrnzgzU5zVB7GOZ7bOK$9I6Q@`3a8CUTIkg$xQ2RN@IQS*4}F!(b{!dpjr;tWa;(9 z+0JCeVJ0Q1viWHBw%ZH71Rw4m?GqJHY;L~HO;b^yeZV&7I~q8T>knU_ z=3=$4t63)7hB~qSgyipP(DKwGe(@oalPBhcX;GwqXh@jaYPNfWZM{-a`dR8r&Fk{A z&zbmWniehFW%$mQR{Ot_V9T}X2CS4uF6@5n#$v~+W#zNZW-yn+)Et|flNmMKl(#m?O5HH_#!o4IeeaY4I zN3|BcPi?%MOGbcHEe)CLUr6Xxmu5F6B4VsRWPEu5>d3oMMK8*l6JmNiu^%p9bFhJ^ zxy$O_;!5>zQFe<0H$J!A<}h&8v{BH9*q^LjeC0ZZ(R&UBfoqIifF-ZQXe`#61akp4 z-Dde6YjTQpEaT4J2loRkCb?%9Ug9k9|I4578gT*NgY6wfH&#jaF(t zR-hzaO?G0EGVqkXpydMvv0{vX?xMHWJ+TUdmk~FW2o|~_J>_(mRv7>UGo6Xb(b9slwiJVi^R2Z;I<8QxLDKbMPVb-XnoRj=@^3E!CtwCp__iiLvK4eg1o8m8I((R&<=Vnlz#bfT@^EO!K9OdBimlSih=xD;R+#OL=KLor&4&HC&YB<^R0 zoZQ3Iz(OfoD;?ib#_rYAkqRoVwO*}yGETaP=I@}lRzcDp*~TZ+^(jRyRGE|s#HoE0 zmYSi6SpoS?Di&2!OED(RedxuBx(Rk8lx%5d((47XY~5P z$~5%c;#uYyzSj*I`8?N+33FgCpYP6jZizzqx01 zu3PqGmSPu`D?0FnjSWB6oL_6C?bHGB!j2Drl$pmojC7a=VpX@VY6>_GmaIJr^ep>Qy{4TPVNT~o@n2D<*LUED=Jb>9hD{uBI~Yhg zH+8)Ss^?SFlp)pcofX!I*$Rg(pS8b1k-N~*{~)wQO~M3Y9Orf$pi>6t9me4{Knaj_`annYxmHJBOT%JRz%9Q4yp+1bva-)LV z{XJ23IpZ}1X!hal*BJ_&>?-N(U5;tdYaZ4c$oqL+{zB4_ENg?VQOBQw9s*wrXUWit zTQmgLTVTNQqmM8;J~k0-$wP=I8bdjPgaX+He)sQ+Js=BrSMf4zVvxe{<&Y5$hj)Ym z3yjonB{uk+zNq*%t$sSRCW}KZ2a)zlHq& zo+bBXHf308fHB3e8e`H)BK_ybZ#BL?L~txeaB$9e9Ir#?Ge-=m0j-91#8FzaQ?bFA z9NG4-{r0KH?rYC$++&tg&uP~0%xh3_pB?ZYh!mjJu=+7F46?6rxX>VJN_$lb&>Cl| zNh8YmzkXtMN>E3Wdjgcp7Z$5#s_ zFw;Rq$#`gF^&4r)c0VDb{GH{`%fp!i0GDQ@jYV7RIPGlmU4C}m$J2z)$dq8Qyj{d2 z4NLYsgUhYI!UG~EBHDWmD5x{V33K*H1emMjz06+=KN*XFrw5s!-ia@OZ0MPeB8WqtUB zByMlVSs!ddnq510-+T(Y5x44V<1#`vSTWA3mE=eTUZI!Ld#Hi|LCw&R#Xy3)4ZT0{ z!P5ZRS>EN1r+)&diX+A^t_(SzI@_kQsB(hAt4r`WK^TJ6adEn^Y>gwgc`>Bh>I{0b z$PNkMh*mu?#1<;uyrSNRkMEs$4;3xA@rqC7i;VG0;kf1oF!RyfutIiteTlvop*#T# zD`|!Fxf|ufH zS7@OOJH^3j9hsR~$MR+7bss;tz;acj?a#xWX2_=bF=V$U8@(E$V23J5&|{FYy_O3G zn5^+?qZ?`g(4l~t&O@r0FF%}mURb0anzDJ5ei`zF8Sf6A4iXhTN#_}${}#@G-EOeT z*1hYgi56^LkBiYL`aFoC=5CVt8XUpYn*^hw`c(PI=Q%_Ro~gXgMvucHA1D8)qVZ$5 zmwp`!4$EwOyqIQKq&m*5W3N`}v1|FL{swOA>N;?ViHNRR6_7_hLrgE7Y{Z>d1vU?} zoL*}H+)V2lJlh0%992?wy#c#({w%mfT;W$hm{>7)nWug@kIK&n7$3>Kt%|Iq$_7Eu z8mpRb06tMn=Bx+ot=6>Qt?4tvVM!)f602g@CU4SgiSL632I63AFrX{RMB|7ah)y&W z;xG`2QQzxNTIpMTyyb5&n*}c<(ZqY^Z9% z?OGyjuzC5_ zR!4DrVwc5V$zLP;jDaU+TJQ<>6 zBDx3*e{Z5J9G*zcK}l3-wWWCw5G$qqXwA&5{9vT7!c{>JYbQjCp$LL4=dr}!c6>gj$8uR4s!`sv{s+{+d86+qu=y?5JD)-ziQl7@NWuv z%&pAq&W(dq#$w|K;gjhIA9mcgpl{eRvZ%AjN{B}LuvB4TsEqXwXC{Hj%H4jdC`Bap+BVip$O{iDCTdIg&T-k}e+D?%w3BEMI5V>3 z>F~(XQmMy_3!fR(j=ZKa-s8UnD>H z&yw??M52wFv0@nE8jtf)4n>EL%aQ4&Y*Bo2VO+`}Y8u{*Ei@hzW{j)}Stzy2O!!ht zzbJ-M8%LBRlE9cgY|Wl_yX}4-de3n7I?ec3BktxXUB1^v1f_y7U|f?EjtqsObmXW!^y;Zz``O0wp`ueMm-<;LXiaMycZ$}=3 zI216QbxwWrl(xtOGdv%^IBK`}VsvV$IO3LngdPF5uG9YgXI(k_guVI}?Q`IThrNfD(N`qUb`C9HJYTW!0m#;H3jNl7B| zX&gAng6%vPL8;sf0xxr3njq}0HmGesuIiLV?B@Qj$Oo)zb3n-Cj5o#<)_r*^NS#W- zXqW1CWA#%R*Rxp5Vwg`ESqTl}Z`w|Splx*JB8kV_sbaySg4G3Rx*r+xp<`E85Q@w} z`Yl-E?WTiAl612?W7N%9y7~`xmVo8;$9PHMa29LSr{>^WsS0X&nRD4uiYLyL<@ySrZLaY$pj{JV0i_IwMd0vN zQx?0_jswhQK$G4%GzXaJtCr>L$S*#P!}~<_B#T$>l4DQcJTQq|Hf4 zb=4|UbzC_Fn>qp^v(|2LoUhp)wA+-vkTR6uf!>Xg_r)cD)Auv;RjI|?!~~HG)5*)- zw5}0n$n=5ziWw9|>);sdfbW3a8SgZITE7u@-ND&-ZG*z?53LcYm!__+hIyZf z$SEWd9u;o18u2s2{1^8`RAm>>@_K4b)Gq}yaqFo1H=bBZo6I(F{4RD=_EwKked=;O z#_*FtAz6VfhkdABW>=&R`cUMV+Ecx@vWt{$!)ia~fx6KvLrn)Y@1LMsNh`fO&hx?o zSk8q|e4(8~aX*mg&xsS#bSP#MCyhHXY0&xjv%0D3MhLep?gW~4f(NmKK@Ln>I85Ih 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≪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�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%0DSjQ_v+DZ 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
    +** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER );
    +** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 );
    +** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 );
    +** 
    )^ +** +** ^The sqlite3_version[] string constant contains the text of [SQLITE_VERSION] +** macro. ^The sqlite3_libversion() function returns a pointer to the +** to the sqlite3_version[] string constant. The sqlite3_libversion() +** function is provided for use in DLLs since DLL users usually do not have +** direct access to string constants within the DLL. ^The +** sqlite3_libversion_number() function returns an integer equal to +** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns +** a pointer to a string constant whose value is the same as the +** [SQLITE_SOURCE_ID] C preprocessor macro. +** +** See also: [sqlite_version()] and [sqlite_source_id()]. +*/ +SQLITE_API SQLITE_EXTERN const char sqlite3_version[]; +SQLITE_API const char *sqlite3_libversion(void); +SQLITE_API const char *sqlite3_sourceid(void); +SQLITE_API int sqlite3_libversion_number(void); + +/* +** CAPI3REF: Run-Time Library Compilation Options Diagnostics +** +** ^The sqlite3_compileoption_used() function returns 0 or 1 +** indicating whether the specified option was defined at +** compile time. ^The SQLITE_ prefix may be omitted from the +** option name passed to sqlite3_compileoption_used(). +** +** ^The sqlite3_compileoption_get() function allows iterating +** over the list of options that were defined at compile time by +** returning the N-th compile time option string. ^If N is out of range, +** sqlite3_compileoption_get() returns a NULL pointer. ^The SQLITE_ +** prefix is omitted from any strings returned by +** sqlite3_compileoption_get(). +** +** ^Support for the diagnostic functions sqlite3_compileoption_used() +** and sqlite3_compileoption_get() may be omitted by specifying the +** [SQLITE_OMIT_COMPILEOPTION_DIAGS] option at compile time. +** +** See also: SQL functions [sqlite_compileoption_used()] and +** [sqlite_compileoption_get()] and the [compile_options pragma]. +*/ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_API int sqlite3_compileoption_used(const char *zOptName); +SQLITE_API const char *sqlite3_compileoption_get(int N); +#endif + +/* +** CAPI3REF: Test To See If The Library Is Threadsafe +** +** ^The sqlite3_threadsafe() function returns zero if and only if +** SQLite was compiled with mutexing code omitted due to the +** [SQLITE_THREADSAFE] compile-time option being set to 0. +** +** SQLite can be compiled with or without mutexes. When +** the [SQLITE_THREADSAFE] C preprocessor macro is 1 or 2, mutexes +** are enabled and SQLite is threadsafe. When the +** [SQLITE_THREADSAFE] macro is 0, +** the mutexes are omitted. Without the mutexes, it is not safe +** to use SQLite concurrently from more than one thread. +** +** Enabling mutexes incurs a measurable performance penalty. +** So if speed is of utmost importance, it makes sense to disable +** the mutexes. But for maximum safety, mutexes should be enabled. +** ^The default behavior is for mutexes to be enabled. +** +** This interface can be used by an application to make sure that the +** version of SQLite that it is linking against was compiled with +** the desired setting of the [SQLITE_THREADSAFE] macro. +** +** This interface only reports on the compile-time mutex setting +** of the [SQLITE_THREADSAFE] flag. If SQLite is compiled with +** SQLITE_THREADSAFE=1 or =2 then mutexes are enabled by default but +** can be fully or partially disabled using a call to [sqlite3_config()] +** with the verbs [SQLITE_CONFIG_SINGLETHREAD], [SQLITE_CONFIG_MULTITHREAD], +** or [SQLITE_CONFIG_SERIALIZED]. ^(The return value of the +** sqlite3_threadsafe() function shows only the compile-time setting of +** thread safety, not any run-time changes to that setting made by +** sqlite3_config(). In other words, the return value from sqlite3_threadsafe() +** is unchanged by calls to sqlite3_config().)^ +** +** See the [threading mode] documentation for additional information. +*/ +SQLITE_API int sqlite3_threadsafe(void); + +/* +** CAPI3REF: Database Connection Handle +** KEYWORDS: {database connection} {database connections} +** +** Each open SQLite database is represented by a pointer to an instance of +** the opaque structure named "sqlite3". It is useful to think of an sqlite3 +** pointer as an object. The [sqlite3_open()], [sqlite3_open16()], and +** [sqlite3_open_v2()] interfaces are its constructors, and [sqlite3_close()] +** and [sqlite3_close_v2()] are its destructors. There are many other +** interfaces (such as +** [sqlite3_prepare_v2()], [sqlite3_create_function()], and +** [sqlite3_busy_timeout()] to name but three) that are methods on an +** sqlite3 object. +*/ +typedef struct sqlite3 sqlite3; + +/* +** CAPI3REF: 64-Bit Integer Types +** KEYWORDS: sqlite_int64 sqlite_uint64 +** +** Because there is no cross-platform way to specify 64-bit integer types +** SQLite includes typedefs for 64-bit signed and unsigned integers. +** +** The sqlite3_int64 and sqlite3_uint64 are the preferred type definitions. +** The sqlite_int64 and sqlite_uint64 types are supported for backwards +** compatibility only. +** +** ^The sqlite3_int64 and sqlite_int64 types can store integer values +** between -9223372036854775808 and +9223372036854775807 inclusive. ^The +** sqlite3_uint64 and sqlite_uint64 types can store integer values +** between 0 and +18446744073709551615 inclusive. +*/ +#ifdef SQLITE_INT64_TYPE + typedef SQLITE_INT64_TYPE sqlite_int64; + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +#elif defined(_MSC_VER) || defined(__BORLANDC__) + typedef __int64 sqlite_int64; + typedef unsigned __int64 sqlite_uint64; +#else + typedef long long int sqlite_int64; + typedef unsigned long long int sqlite_uint64; +#endif +typedef sqlite_int64 sqlite3_int64; +typedef sqlite_uint64 sqlite3_uint64; + +/* +** If compiling for a processor that lacks floating point support, +** substitute integer for floating-point. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# define double sqlite3_int64 +#endif + +/* +** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 +** +** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors +** for the [sqlite3] object. +** ^Calls to sqlite3_close() and sqlite3_close_v2() return [SQLITE_OK] if +** the [sqlite3] object is successfully destroyed and all associated +** resources are deallocated. +** +** ^If the database connection is associated with unfinalized prepared +** statements or unfinished sqlite3_backup objects then sqlite3_close() +** will leave the database connection open and return [SQLITE_BUSY]. +** ^If sqlite3_close_v2() is called with unfinalized prepared statements +** and/or unfinished sqlite3_backups, then the database connection becomes +** an unusable "zombie" which will automatically be deallocated when the +** last prepared statement is finalized or the last sqlite3_backup is +** finished. The sqlite3_close_v2() interface is intended for use with +** host languages that are garbage collected, and where the order in which +** destructors are called is arbitrary. +** +** Applications should [sqlite3_finalize | finalize] all [prepared statements], +** [sqlite3_blob_close | close] all [BLOB handles], and +** [sqlite3_backup_finish | finish] all [sqlite3_backup] objects associated +** with the [sqlite3] object prior to attempting to close the object. ^If +** sqlite3_close_v2() is called on a [database connection] that still has +** outstanding [prepared statements], [BLOB handles], and/or +** [sqlite3_backup] objects then it returns [SQLITE_OK] and the deallocation +** of resources is deferred until all [prepared statements], [BLOB handles], +** and [sqlite3_backup] objects are also destroyed. +** +** ^If an [sqlite3] object is destroyed while a transaction is open, +** the transaction is automatically rolled back. +** +** The C parameter to [sqlite3_close(C)] and [sqlite3_close_v2(C)] +** must be either a NULL +** pointer or an [sqlite3] object pointer obtained +** from [sqlite3_open()], [sqlite3_open16()], or +** [sqlite3_open_v2()], and not previously closed. +** ^Calling sqlite3_close() or sqlite3_close_v2() with a NULL pointer +** argument is a harmless no-op. +*/ +SQLITE_API int sqlite3_close(sqlite3*); +SQLITE_API int sqlite3_close_v2(sqlite3*); + +/* +** The type for a callback function. +** This is legacy and deprecated. It is included for historical +** compatibility and is not documented. +*/ +typedef int (*sqlite3_callback)(void*,int,char**, char**); + +/* +** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 +** +** The sqlite3_exec() interface is a convenience wrapper around +** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], +** that allows an application to run multiple statements of SQL +** without having to use a lot of C code. +** +** ^The sqlite3_exec() interface runs zero or more UTF-8 encoded, +** semicolon-separate SQL statements passed into its 2nd argument, +** in the context of the [database connection] passed in as its 1st +** argument. ^If the callback function of the 3rd argument to +** sqlite3_exec() is not NULL, then it is invoked for each result row +** coming out of the evaluated SQL statements. ^The 4th argument to +** sqlite3_exec() is relayed through to the 1st argument of each +** callback invocation. ^If the callback pointer to sqlite3_exec() +** is NULL, then no callback is ever invoked and result rows are +** ignored. +** +** ^If an error occurs while evaluating the SQL statements passed into +** sqlite3_exec(), then execution of the current statement stops and +** subsequent statements are skipped. ^If the 5th parameter to sqlite3_exec() +** is not NULL then any error message is written into memory obtained +** from [sqlite3_malloc()] and passed back through the 5th parameter. +** To avoid memory leaks, the application should invoke [sqlite3_free()] +** on error message strings returned through the 5th parameter of +** sqlite3_exec() after the error message string is no longer needed. +** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors +** occur, then sqlite3_exec() sets the pointer in its 5th parameter to +** NULL before returning. +** +** ^If an sqlite3_exec() callback returns non-zero, the sqlite3_exec() +** routine returns SQLITE_ABORT without invoking the callback again and +** without running any subsequent SQL statements. +** +** ^The 2nd argument to the sqlite3_exec() callback function is the +** number of columns in the result. ^The 3rd argument to the sqlite3_exec() +** callback is an array of pointers to strings obtained as if from +** [sqlite3_column_text()], one for each column. ^If an element of a +** result row is NULL then the corresponding string pointer for the +** sqlite3_exec() callback is a NULL pointer. ^The 4th argument to the +** sqlite3_exec() callback is an array of pointers to strings where each +** entry represents the name of corresponding result column as obtained +** from [sqlite3_column_name()]. +** +** ^If the 2nd parameter to sqlite3_exec() is a NULL pointer, a pointer +** to an empty string, or a pointer that contains only whitespace and/or +** SQL comments, then no SQL statements are evaluated and the database +** is not changed. +** +** Restrictions: +** +**
      +**
    • The application must ensure that the 1st parameter to sqlite3_exec() +** is a valid and open [database connection]. +**
    • The application must not close the [database connection] specified by +** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. +**
    • The application must not modify the SQL statement text passed into +** the 2nd parameter of sqlite3_exec() while sqlite3_exec() is running. +**
    +*/ +SQLITE_API int sqlite3_exec( + sqlite3*, /* An open database */ + const char *sql, /* SQL to be evaluated */ + int (*callback)(void*,int,char**,char**), /* Callback function */ + void *, /* 1st argument to callback */ + char **errmsg /* Error msg written here */ +); + +/* +** CAPI3REF: Result Codes +** KEYWORDS: {result code definitions} +** +** Many SQLite functions return an integer result code from the set shown +** here in order to indicate success or failure. +** +** New error codes may be added in future versions of SQLite. +** +** See also: [extended result code definitions] +*/ +#define SQLITE_OK 0 /* Successful result */ +/* beginning-of-error-codes */ +#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ +#define SQLITE_PERM 3 /* Access permission denied */ +#define SQLITE_ABORT 4 /* Callback routine requested an abort */ +#define SQLITE_BUSY 5 /* The database file is locked */ +#define SQLITE_LOCKED 6 /* A table in the database is locked */ +#define SQLITE_NOMEM 7 /* A malloc() failed */ +#define SQLITE_READONLY 8 /* Attempt to write a readonly database */ +#define SQLITE_INTERRUPT 9 /* Operation terminated by sqlite3_interrupt()*/ +#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */ +#define SQLITE_CORRUPT 11 /* The database disk image is malformed */ +#define SQLITE_NOTFOUND 12 /* Unknown opcode in sqlite3_file_control() */ +#define SQLITE_FULL 13 /* Insertion failed because database is full */ +#define SQLITE_CANTOPEN 14 /* Unable to open the database file */ +#define SQLITE_PROTOCOL 15 /* Database lock protocol error */ +#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_SCHEMA 17 /* The database schema changed */ +#define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ +#define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ +#define SQLITE_MISMATCH 20 /* Data type mismatch */ +#define SQLITE_MISUSE 21 /* Library used incorrectly */ +#define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ +#define SQLITE_AUTH 23 /* Authorization denied */ +#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ +#define SQLITE_NOTADB 26 /* File opened that is not a database file */ +#define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ +#define SQLITE_WARNING 28 /* Warnings from sqlite3_log() */ +#define SQLITE_ROW 100 /* sqlite3_step() has another row ready */ +#define SQLITE_DONE 101 /* sqlite3_step() has finished executing */ +/* end-of-error-codes */ + +/* +** CAPI3REF: Extended Result Codes +** KEYWORDS: {extended result code definitions} +** +** In its default configuration, SQLite API routines return one of 30 integer +** [result codes]. However, experience has shown that many of +** these result codes are too coarse-grained. They do not provide as +** much information about problems as programmers might like. In an effort to +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include +** support for additional result codes that provide more detailed information +** about errors. These [extended result codes] are enabled or disabled +** on a per database connection basis using the +** [sqlite3_extended_result_codes()] API. Or, the extended code for +** the most recent error can be obtained using +** [sqlite3_extended_errcode()]. +*/ +#define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) +#define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) +#define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) +#define SQLITE_IOERR_FSYNC (SQLITE_IOERR | (4<<8)) +#define SQLITE_IOERR_DIR_FSYNC (SQLITE_IOERR | (5<<8)) +#define SQLITE_IOERR_TRUNCATE (SQLITE_IOERR | (6<<8)) +#define SQLITE_IOERR_FSTAT (SQLITE_IOERR | (7<<8)) +#define SQLITE_IOERR_UNLOCK (SQLITE_IOERR | (8<<8)) +#define SQLITE_IOERR_RDLOCK (SQLITE_IOERR | (9<<8)) +#define SQLITE_IOERR_DELETE (SQLITE_IOERR | (10<<8)) +#define SQLITE_IOERR_BLOCKED (SQLITE_IOERR | (11<<8)) +#define SQLITE_IOERR_NOMEM (SQLITE_IOERR | (12<<8)) +#define SQLITE_IOERR_ACCESS (SQLITE_IOERR | (13<<8)) +#define SQLITE_IOERR_CHECKRESERVEDLOCK (SQLITE_IOERR | (14<<8)) +#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8)) +#define SQLITE_IOERR_CLOSE (SQLITE_IOERR | (16<<8)) +#define SQLITE_IOERR_DIR_CLOSE (SQLITE_IOERR | (17<<8)) +#define SQLITE_IOERR_SHMOPEN (SQLITE_IOERR | (18<<8)) +#define SQLITE_IOERR_SHMSIZE (SQLITE_IOERR | (19<<8)) +#define SQLITE_IOERR_SHMLOCK (SQLITE_IOERR | (20<<8)) +#define SQLITE_IOERR_SHMMAP (SQLITE_IOERR | (21<<8)) +#define SQLITE_IOERR_SEEK (SQLITE_IOERR | (22<<8)) +#define SQLITE_IOERR_DELETE_NOENT (SQLITE_IOERR | (23<<8)) +#define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) +#define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) +#define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) +#define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) +#define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) +#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8)) +#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) +#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) +#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) +#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) +#define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) +#define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) +#define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) +#define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) +#define SQLITE_CONSTRAINT_FOREIGNKEY (SQLITE_CONSTRAINT | (3<<8)) +#define SQLITE_CONSTRAINT_FUNCTION (SQLITE_CONSTRAINT | (4<<8)) +#define SQLITE_CONSTRAINT_NOTNULL (SQLITE_CONSTRAINT | (5<<8)) +#define SQLITE_CONSTRAINT_PRIMARYKEY (SQLITE_CONSTRAINT | (6<<8)) +#define SQLITE_CONSTRAINT_TRIGGER (SQLITE_CONSTRAINT | (7<<8)) +#define SQLITE_CONSTRAINT_UNIQUE (SQLITE_CONSTRAINT | (8<<8)) +#define SQLITE_CONSTRAINT_VTAB (SQLITE_CONSTRAINT | (9<<8)) +#define SQLITE_CONSTRAINT_ROWID (SQLITE_CONSTRAINT |(10<<8)) +#define SQLITE_NOTICE_RECOVER_WAL (SQLITE_NOTICE | (1<<8)) +#define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) +#define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) +#define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) + +/* +** CAPI3REF: Flags For File Open Operations +** +** These bit values are intended for use in the +** 3rd parameter to the [sqlite3_open_v2()] interface and +** in the 4th parameter to the [sqlite3_vfs.xOpen] method. +*/ +#define SQLITE_OPEN_READONLY 0x00000001 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_READWRITE 0x00000002 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_CREATE 0x00000004 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_DELETEONCLOSE 0x00000008 /* VFS only */ +#define SQLITE_OPEN_EXCLUSIVE 0x00000010 /* VFS only */ +#define SQLITE_OPEN_AUTOPROXY 0x00000020 /* VFS only */ +#define SQLITE_OPEN_URI 0x00000040 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MEMORY 0x00000080 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_MAIN_DB 0x00000100 /* VFS only */ +#define SQLITE_OPEN_TEMP_DB 0x00000200 /* VFS only */ +#define SQLITE_OPEN_TRANSIENT_DB 0x00000400 /* VFS only */ +#define SQLITE_OPEN_MAIN_JOURNAL 0x00000800 /* VFS only */ +#define SQLITE_OPEN_TEMP_JOURNAL 0x00001000 /* VFS only */ +#define SQLITE_OPEN_SUBJOURNAL 0x00002000 /* VFS only */ +#define SQLITE_OPEN_MASTER_JOURNAL 0x00004000 /* VFS only */ +#define SQLITE_OPEN_NOMUTEX 0x00008000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_FULLMUTEX 0x00010000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_SHAREDCACHE 0x00020000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_PRIVATECACHE 0x00040000 /* Ok for sqlite3_open_v2() */ +#define SQLITE_OPEN_WAL 0x00080000 /* VFS only */ + +/* Reserved: 0x00F00000 */ + +/* +** CAPI3REF: Device Characteristics +** +** The xDeviceCharacteristics method of the [sqlite3_io_methods] +** object returns an integer which is a vector of these +** bit values expressing I/O characteristics of the mass storage +** device that holds the file that the [sqlite3_io_methods] +** refers to. +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that +** after reboot following a crash or power loss, the only bytes in a +** file that were written at the application level might have changed +** and that adjacent bytes, even bytes within the same sector are +** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN +** flag indicate that a file cannot be deleted when open. The +** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on +** read-only media and cannot be changed even by processes with +** elevated privileges. +*/ +#define SQLITE_IOCAP_ATOMIC 0x00000001 +#define SQLITE_IOCAP_ATOMIC512 0x00000002 +#define SQLITE_IOCAP_ATOMIC1K 0x00000004 +#define SQLITE_IOCAP_ATOMIC2K 0x00000008 +#define SQLITE_IOCAP_ATOMIC4K 0x00000010 +#define SQLITE_IOCAP_ATOMIC8K 0x00000020 +#define SQLITE_IOCAP_ATOMIC16K 0x00000040 +#define SQLITE_IOCAP_ATOMIC32K 0x00000080 +#define SQLITE_IOCAP_ATOMIC64K 0x00000100 +#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 +#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 +#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 +#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 +#define SQLITE_IOCAP_IMMUTABLE 0x00002000 + +/* +** CAPI3REF: File Locking Levels +** +** SQLite uses one of these integer values as the second +** argument to calls it makes to the xLock() and xUnlock() methods +** of an [sqlite3_io_methods] object. +*/ +#define SQLITE_LOCK_NONE 0 +#define SQLITE_LOCK_SHARED 1 +#define SQLITE_LOCK_RESERVED 2 +#define SQLITE_LOCK_PENDING 3 +#define SQLITE_LOCK_EXCLUSIVE 4 + +/* +** CAPI3REF: Synchronization Type Flags +** +** When SQLite invokes the xSync() method of an +** [sqlite3_io_methods] object it uses a combination of +** these integer values as the second argument. +** +** When the SQLITE_SYNC_DATAONLY flag is used, it means that the +** sync operation only needs to flush data to mass storage. Inode +** information need not be flushed. If the lower four bits of the flag +** equal SQLITE_SYNC_NORMAL, that means to use normal fsync() semantics. +** If the lower four bits equal SQLITE_SYNC_FULL, that means +** to use Mac OS X style fullsync instead of fsync(). +** +** Do not confuse the SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags +** with the [PRAGMA synchronous]=NORMAL and [PRAGMA synchronous]=FULL +** settings. The [synchronous pragma] determines when calls to the +** xSync VFS method occur and applies uniformly across all platforms. +** The SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL flags determine how +** energetic or rigorous or forceful the sync operations are and +** only make a difference on Mac OSX for the default SQLite code. +** (Third-party VFS implementations might also make the distinction +** between SQLITE_SYNC_NORMAL and SQLITE_SYNC_FULL, but among the +** operating systems natively supported by SQLite, only Mac OSX +** cares about the difference.) +*/ +#define SQLITE_SYNC_NORMAL 0x00002 +#define SQLITE_SYNC_FULL 0x00003 +#define SQLITE_SYNC_DATAONLY 0x00010 + +/* +** CAPI3REF: OS Interface Open File Handle +** +** An [sqlite3_file] object represents an open file in the +** [sqlite3_vfs | OS interface layer]. Individual OS interface +** implementations will +** want to subclass this object by appending additional fields +** for their own use. The pMethods entry is a pointer to an +** [sqlite3_io_methods] object that defines methods for performing +** I/O operations on the open file. +*/ +typedef struct sqlite3_file sqlite3_file; +struct sqlite3_file { + const struct sqlite3_io_methods *pMethods; /* Methods for an open file */ +}; + +/* +** CAPI3REF: OS Interface File Virtual Methods Object +** +** Every file opened by the [sqlite3_vfs.xOpen] method populates an +** [sqlite3_file] object (or, more commonly, a subclass of the +** [sqlite3_file] object) with a pointer to an instance of this object. +** This object defines the methods used to perform various operations +** against the open file represented by the [sqlite3_file] object. +** +** If the [sqlite3_vfs.xOpen] method sets the sqlite3_file.pMethods element +** to a non-NULL pointer, then the sqlite3_io_methods.xClose method +** may be invoked even if the [sqlite3_vfs.xOpen] reported that it failed. The +** only way to prevent a call to xClose following a failed [sqlite3_vfs.xOpen] +** is for the [sqlite3_vfs.xOpen] to set the sqlite3_file.pMethods element +** to NULL. +** +** The flags argument to xSync may be one of [SQLITE_SYNC_NORMAL] or +** [SQLITE_SYNC_FULL]. The first choice is the normal fsync(). +** The second choice is a Mac OS X style fullsync. The [SQLITE_SYNC_DATAONLY] +** flag may be ORed in to indicate that only the data of the file +** and not its inode needs to be synced. +** +** The integer values to xLock() and xUnlock() are one of +**
      +**
    • [SQLITE_LOCK_NONE], +**
    • [SQLITE_LOCK_SHARED], +**
    • [SQLITE_LOCK_RESERVED], +**
    • [SQLITE_LOCK_PENDING], or +**
    • [SQLITE_LOCK_EXCLUSIVE]. +**
    +** xLock() increases the lock. xUnlock() decreases the lock. +** The xCheckReservedLock() method checks whether any database connection, +** either in this process or in some other process, is holding a RESERVED, +** PENDING, or EXCLUSIVE lock on the file. It returns true +** if such a lock exists and false otherwise. +** +** The xFileControl() method is a generic interface that allows custom +** VFS implementations to directly control an open file using the +** [sqlite3_file_control()] interface. The second "op" argument is an +** integer opcode. The third argument is a generic pointer intended to +** point to a structure that may contain arguments or space in which to +** write return values. Potential uses for xFileControl() might be +** functions to enable blocking locks with timeouts, to change the +** locking strategy (for example to use dot-file locks), to inquire +** about the status of a lock, or to break stale locks. The SQLite +** core reserves all opcodes less than 100 for its own use. +** A [file control opcodes | list of opcodes] less than 100 is available. +** Applications that define a custom xFileControl method should use opcodes +** greater than 100 to avoid conflicts. VFS implementations should +** return [SQLITE_NOTFOUND] for file control opcodes that they do not +** recognize. +** +** The xSectorSize() method returns the sector size of the +** device that underlies the file. The sector size is the +** minimum write that can be performed without disturbing +** other bytes in the file. The xDeviceCharacteristics() +** method returns a bit vector describing behaviors of the +** underlying device: +** +**
      +**
    • [SQLITE_IOCAP_ATOMIC] +**
    • [SQLITE_IOCAP_ATOMIC512] +**
    • [SQLITE_IOCAP_ATOMIC1K] +**
    • [SQLITE_IOCAP_ATOMIC2K] +**
    • [SQLITE_IOCAP_ATOMIC4K] +**
    • [SQLITE_IOCAP_ATOMIC8K] +**
    • [SQLITE_IOCAP_ATOMIC16K] +**
    • [SQLITE_IOCAP_ATOMIC32K] +**
    • [SQLITE_IOCAP_ATOMIC64K] +**
    • [SQLITE_IOCAP_SAFE_APPEND] +**
    • [SQLITE_IOCAP_SEQUENTIAL] +**
    +** +** The SQLITE_IOCAP_ATOMIC property means that all writes of +** any size are atomic. The SQLITE_IOCAP_ATOMICnnn values +** mean that writes of blocks that are nnn bytes in size and +** are aligned to an address which is an integer multiple of +** nnn are atomic. The SQLITE_IOCAP_SAFE_APPEND value means +** that when data is appended to a file, the data is appended +** first then the size of the file is extended, never the other +** way around. The SQLITE_IOCAP_SEQUENTIAL property means that +** information is written to disk in the same order as calls +** to xWrite(). +** +** If xRead() returns SQLITE_IOERR_SHORT_READ it must also fill +** in the unread portions of the buffer with zeros. A VFS that +** fails to zero-fill short reads might seem to work. However, +** failure to zero-fill short reads will eventually lead to +** database corruption. +*/ +typedef struct sqlite3_io_methods sqlite3_io_methods; +struct sqlite3_io_methods { + int iVersion; + int (*xClose)(sqlite3_file*); + int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); + int (*xWrite)(sqlite3_file*, const void*, int iAmt, sqlite3_int64 iOfst); + int (*xTruncate)(sqlite3_file*, sqlite3_int64 size); + int (*xSync)(sqlite3_file*, int flags); + int (*xFileSize)(sqlite3_file*, sqlite3_int64 *pSize); + int (*xLock)(sqlite3_file*, int); + int (*xUnlock)(sqlite3_file*, int); + int (*xCheckReservedLock)(sqlite3_file*, int *pResOut); + int (*xFileControl)(sqlite3_file*, int op, void *pArg); + int (*xSectorSize)(sqlite3_file*); + int (*xDeviceCharacteristics)(sqlite3_file*); + /* Methods above are valid for version 1 */ + int (*xShmMap)(sqlite3_file*, int iPg, int pgsz, int, void volatile**); + int (*xShmLock)(sqlite3_file*, int offset, int n, int flags); + void (*xShmBarrier)(sqlite3_file*); + int (*xShmUnmap)(sqlite3_file*, int deleteFlag); + /* Methods above are valid for version 2 */ + int (*xFetch)(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); + int (*xUnfetch)(sqlite3_file*, sqlite3_int64 iOfst, void *p); + /* Methods above are valid for version 3 */ + /* Additional methods may be added in future releases */ +}; + +/* +** CAPI3REF: Standard File Control Opcodes +** KEYWORDS: {file control opcodes} {file control opcode} +** +** These integer constants are opcodes for the xFileControl method +** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] +** interface. +** +**
      +**
    • [[SQLITE_FCNTL_LOCKSTATE]] +** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This +** opcode causes the xFileControl method to write the current state of +** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], +** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) +** into an integer that the pArg argument points to. This capability +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** +**
    • [[SQLITE_FCNTL_SIZE_HINT]] +** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS +** layer a hint of how large the database file will grow to be during the +** current transaction. This hint is not guaranteed to be accurate but it +** is often close. The underlying VFS might choose to preallocate database +** file space based on this hint in order to help writes to the database +** file run faster. +** +**
    • [[SQLITE_FCNTL_CHUNK_SIZE]] +** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS +** extends and truncates the database file in chunks of a size specified +** by the user. The fourth argument to [sqlite3_file_control()] should +** point to an integer (type int) containing the new chunk-size to use +** for the nominated database. Allocating database file space in large +** chunks (say 1MB at a time), may reduce file-system fragmentation and +** improve performance on some systems. +** +**
    • [[SQLITE_FCNTL_FILE_POINTER]] +** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with a particular database +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +**
    • [[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. +** +**
    • [[SQLITE_FCNTL_SYNC_OMITTED]] +** No longer in use. +** +**
    • [[SQLITE_FCNTL_SYNC]] +** The [SQLITE_FCNTL_SYNC] opcode is generated internally by SQLite and +** sent to the VFS immediately before the xSync method is invoked on a +** database file descriptor. Or, if the xSync method is not invoked +** because the user has configured SQLite with +** [PRAGMA synchronous | PRAGMA synchronous=OFF] it is invoked in place +** of the xSync method. In most cases, the pointer argument passed with +** this file-control is NULL. However, if the database file is being synced +** as part of a multi-database commit, the argument points to a nul-terminated +** string containing the transactions master-journal file name. VFSes that +** do not need this signal should silently ignore this opcode. Applications +** should not call [sqlite3_file_control()] with this opcode as doing so may +** disrupt the operation of the specialized VFSes that do require it. +** +**
    • [[SQLITE_FCNTL_COMMIT_PHASETWO]] +** The [SQLITE_FCNTL_COMMIT_PHASETWO] opcode is generated internally by SQLite +** and sent to the VFS after a transaction has been committed immediately +** but before the database is unlocked. VFSes that do not need this signal +** should silently ignore this opcode. Applications should not call +** [sqlite3_file_control()] with this opcode as doing so may disrupt the +** operation of the specialized VFSes that do require it. +** +**
    • [[SQLITE_FCNTL_WIN32_AV_RETRY]] +** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic +** retry counts and intervals for certain disk I/O operations for the +** windows [VFS] in order to provide robustness in the presence of +** anti-virus programs. By default, the windows VFS will retry file read, +** file write, and file delete operations up to 10 times, with a delay +** of 25 milliseconds before the first retry and with the delay increasing +** by an additional 25 milliseconds with each subsequent retry. This +** opcode allows these two values (10 retries and 25 milliseconds of delay) +** to be adjusted. The values are changed for all database connections +** within the same process. The argument is a pointer to an array of two +** integers where the first integer i the new retry count and the second +** integer is the delay. If either integer is negative, then the setting +** is not changed but instead the prior value of that setting is written +** into the array entry, allowing the current retry settings to be +** interrogated. The zDbName parameter is ignored. +** +**
    • [[SQLITE_FCNTL_PERSIST_WAL]] +** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the +** persistent [WAL | Write Ahead Log] setting. By default, the auxiliary +** write ahead log and shared memory files used for transaction control +** are automatically deleted when the latest connection to the database +** closes. Setting persistent WAL mode causes those files to persist after +** close. Persisting the files is useful when other processes that do not +** have write permission on the directory containing the database file want +** to read the database file, as the WAL and shared memory files must exist +** in order for the database to be readable. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable persistent WAL mode or 1 to enable persistent +** WAL mode. If the integer is -1, then it is overwritten with the current +** WAL persistence setting. +** +**
    • [[SQLITE_FCNTL_POWERSAFE_OVERWRITE]] +** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the +** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting +** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the +** xDeviceCharacteristics methods. The fourth parameter to +** [sqlite3_file_control()] for this opcode should be a pointer to an integer. +** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage +** mode. If the integer is -1, then it is overwritten with the current +** zero-damage mode setting. +** +**
    • [[SQLITE_FCNTL_OVERWRITE]] +** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening +** a write transaction to indicate that, unless it is rolled back for some +** reason, the entire database file will be overwritten by the current +** transaction. This is used by VACUUM operations. +** +**
    • [[SQLITE_FCNTL_VFSNAME]] +** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of +** all [VFSes] in the VFS stack. The names are of all VFS shims and the +** final bottom-level VFS are written into memory obtained from +** [sqlite3_malloc()] and the result is stored in the char* variable +** that the fourth parameter of [sqlite3_file_control()] points to. +** The caller is responsible for freeing the memory when done. As with +** all file-control actions, there is no guarantee that this will actually +** do anything. Callers should initialize the char* variable to a NULL +** pointer in case this file-control is not implemented. This file-control +** is intended for diagnostic use only. +** +**
    • [[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** +**
    • [[SQLITE_FCNTL_PRAGMA]] +** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] +** file control is sent to the open [sqlite3_file] object corresponding +** to the database file to which the pragma statement refers. ^The argument +** to the [SQLITE_FCNTL_PRAGMA] file control is an array of +** pointers to strings (char**) in which the second element of the array +** is the name of the pragma and the third element is the argument to the +** pragma or NULL if the pragma has no argument. ^The handler for an +** [SQLITE_FCNTL_PRAGMA] file control can optionally make the first element +** of the char** argument point to a string obtained from [sqlite3_mprintf()] +** or the equivalent and that string will become the result of the pragma or +** the error message if the pragma fails. ^If the +** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal +** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] +** file control returns [SQLITE_OK], then the parser assumes that the +** VFS has handled the PRAGMA itself and the parser generates a no-op +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means +** that the VFS encountered an error while handling the [PRAGMA] and the +** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] +** file control occurs at the beginning of pragma statement analysis and so +** it is able to override built-in [PRAGMA] statements. +** +**
    • [[SQLITE_FCNTL_BUSYHANDLER]] +** ^The [SQLITE_FCNTL_BUSYHANDLER] +** file-control may be invoked by SQLite on the database file handle +** shortly after it is opened in order to provide a custom VFS with access +** to the connections busy-handler callback. The argument is of type (void **) +** - an array of two (void *) values. The first (void *) actually points +** to a function of type (int (*)(void *)). In order to invoke the connections +** busy-handler, this function should be invoked with the second (void *) in +** the array as the only argument. If it returns non-zero, then the operation +** should be retried. If it returns zero, the custom VFS should abandon the +** current operation. +** +**
    • [[SQLITE_FCNTL_TEMPFILENAME]] +** ^Application can invoke the [SQLITE_FCNTL_TEMPFILENAME] file-control +** to have SQLite generate a +** temporary filename using the same algorithm that is followed to generate +** temporary filenames for TEMP tables and other internal uses. The +** argument should be a char** which will be filled with the filename +** written into memory obtained from [sqlite3_malloc()]. The caller should +** invoke [sqlite3_free()] on the result to avoid a memory leak. +** +**
    • [[SQLITE_FCNTL_MMAP_SIZE]] +** The [SQLITE_FCNTL_MMAP_SIZE] file control is used to query or set the +** maximum number of bytes that will be used for memory-mapped I/O. +** The argument is a pointer to a value of type sqlite3_int64 that +** is an advisory maximum number of bytes in the file to memory map. The +** pointer is overwritten with the old value. The limit is not changed if +** the value originally pointed to is negative, and so the current limit +** can be queried by passing in a pointer to a negative number. This +** file-control is used internally to implement [PRAGMA mmap_size]. +** +**
    • [[SQLITE_FCNTL_TRACE]] +** The [SQLITE_FCNTL_TRACE] file control provides advisory information +** to the VFS about what the higher layers of the SQLite stack are doing. +** This file control is used by some VFS activity tracing [shims]. +** The argument is a zero-terminated string. Higher layers in the +** SQLite stack may generate instances of this file control if +** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. +** +**
    • [[SQLITE_FCNTL_HAS_MOVED]] +** The [SQLITE_FCNTL_HAS_MOVED] file control interprets its argument as a +** pointer to an integer and it writes a boolean into that integer depending +** on whether or not the file has been renamed, moved, or deleted since it +** was first opened. +** +**
    • [[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** +**
    • [[SQLITE_FCNTL_WIN32_SET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This +** opcode causes the xFileControl method to swap the file handle with the one +** pointed to by the pArg argument. This capability is used during testing +** and only needs to be supported when SQLITE_TEST is defined. +** +**
    • [[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should not use this file-control. +** +**
    • [[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +**
    • [[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +**
    +*/ +#define SQLITE_FCNTL_LOCKSTATE 1 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 +#define SQLITE_FCNTL_SIZE_HINT 5 +#define SQLITE_FCNTL_CHUNK_SIZE 6 +#define SQLITE_FCNTL_FILE_POINTER 7 +#define SQLITE_FCNTL_SYNC_OMITTED 8 +#define SQLITE_FCNTL_WIN32_AV_RETRY 9 +#define SQLITE_FCNTL_PERSIST_WAL 10 +#define SQLITE_FCNTL_OVERWRITE 11 +#define SQLITE_FCNTL_VFSNAME 12 +#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 +#define SQLITE_FCNTL_PRAGMA 14 +#define SQLITE_FCNTL_BUSYHANDLER 15 +#define SQLITE_FCNTL_TEMPFILENAME 16 +#define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 +#define SQLITE_FCNTL_HAS_MOVED 20 +#define SQLITE_FCNTL_SYNC 21 +#define SQLITE_FCNTL_COMMIT_PHASETWO 22 +#define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + + +/* +** CAPI3REF: Mutex Handle +** +** The mutex module within SQLite defines [sqlite3_mutex] to be an +** abstract type for a mutex object. The SQLite core never looks +** at the internal representation of an [sqlite3_mutex]. It only +** deals with pointers to the [sqlite3_mutex] object. +** +** Mutexes are created using [sqlite3_mutex_alloc()]. +*/ +typedef struct sqlite3_mutex sqlite3_mutex; + +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + +/* +** CAPI3REF: OS Interface Object +** +** An instance of the sqlite3_vfs object defines the interface between +** the SQLite core and the underlying operating system. The "vfs" +** in the name of the object stands for "virtual file system". See +** the [VFS | VFS documentation] for further information. +** +** The value of the iVersion field is initially 1 but may be larger in +** future versions of SQLite. Additional fields may be appended to this +** object when the iVersion value is increased. Note that the structure +** of the sqlite3_vfs object changes in the transaction between +** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not +** modified. +** +** The szOsFile field is the size of the subclassed [sqlite3_file] +** structure used by this VFS. mxPathname is the maximum length of +** a pathname in this VFS. +** +** Registered sqlite3_vfs objects are kept on a linked list formed by +** the pNext pointer. The [sqlite3_vfs_register()] +** and [sqlite3_vfs_unregister()] interfaces manage this list +** in a thread-safe way. The [sqlite3_vfs_find()] interface +** searches the list. Neither the application code nor the VFS +** implementation should use the pNext pointer. +** +** The pNext field is the only field in the sqlite3_vfs +** structure that SQLite will ever modify. SQLite will only access +** or modify this field while holding a particular static mutex. +** The application should never modify anything within the sqlite3_vfs +** object once the object has been registered. +** +** The zName field holds the name of the VFS module. The name must +** be unique across all VFS modules. +** +** [[sqlite3_vfs.xOpen]] +** ^SQLite guarantees that the zFilename parameter to xOpen +** is either a NULL pointer or string obtained +** from xFullPathname() with an optional suffix added. +** ^If a suffix is added to the zFilename parameter, it will +** consist of a single "-" character followed by no more than +** 11 alphanumeric and/or "-" characters. +** ^SQLite further guarantees that +** the string will be valid and unchanged until xClose() is +** called. Because of the previous sentence, +** the [sqlite3_file] can safely store a pointer to the +** filename if it needs to remember the filename for some reason. +** If the zFilename parameter to xOpen is a NULL pointer then xOpen +** must invent its own temporary name for the file. ^Whenever the +** xFilename parameter is NULL it will also be the case that the +** flags parameter will include [SQLITE_OPEN_DELETEONCLOSE]. +** +** The flags argument to xOpen() includes all bits set in +** the flags argument to [sqlite3_open_v2()]. Or if [sqlite3_open()] +** or [sqlite3_open16()] is used, then flags includes at least +** [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]. +** If xOpen() opens a file read-only then it sets *pOutFlags to +** include [SQLITE_OPEN_READONLY]. Other bits in *pOutFlags may be set. +** +** ^(SQLite will also add one of the following flags to the xOpen() +** call, depending on the object being opened: +** +**
      +**
    • [SQLITE_OPEN_MAIN_DB] +**
    • [SQLITE_OPEN_MAIN_JOURNAL] +**
    • [SQLITE_OPEN_TEMP_DB] +**
    • [SQLITE_OPEN_TEMP_JOURNAL] +**
    • [SQLITE_OPEN_TRANSIENT_DB] +**
    • [SQLITE_OPEN_SUBJOURNAL] +**
    • [SQLITE_OPEN_MASTER_JOURNAL] +**
    • [SQLITE_OPEN_WAL] +**
    )^ +** +** The file I/O implementation can use the object type flags to +** change the way it deals with files. For example, an application +** that does not care about crash recovery or rollback might make +** the open of a journal file a no-op. Writes to this journal would +** also be no-ops, and any attempt to read the journal would return +** SQLITE_IOERR. Or the implementation might recognize that a database +** file will be doing page-aligned sector reads and writes in a random +** order and set up its I/O subsystem accordingly. +** +** SQLite might also add one of the following flags to the xOpen method: +** +**
      +**
    • [SQLITE_OPEN_DELETEONCLOSE] +**
    • [SQLITE_OPEN_EXCLUSIVE] +**
    +** +** The [SQLITE_OPEN_DELETEONCLOSE] flag means the file should be +** deleted when it is closed. ^The [SQLITE_OPEN_DELETEONCLOSE] +** will be set for TEMP databases and their journals, transient +** databases, and subjournals. +** +** ^The [SQLITE_OPEN_EXCLUSIVE] flag is always used in conjunction +** with the [SQLITE_OPEN_CREATE] flag, which are both directly +** analogous to the O_EXCL and O_CREAT flags of the POSIX open() +** API. The SQLITE_OPEN_EXCLUSIVE flag, when paired with the +** SQLITE_OPEN_CREATE, is used to indicate that file should always +** be created, and that it is an error if it already exists. +** It is not used to indicate the file should be opened +** for exclusive access. +** +** ^At least szOsFile bytes of memory are allocated by SQLite +** to hold the [sqlite3_file] structure passed as the third +** argument to xOpen. The xOpen method does not have to +** allocate the structure; it should just fill it in. Note that +** the xOpen method must set the sqlite3_file.pMethods to either +** a valid [sqlite3_io_methods] object or to NULL. xOpen must do +** this even if the open fails. SQLite expects that the sqlite3_file.pMethods +** element will be valid after xOpen returns regardless of the success +** or failure of the xOpen call. +** +** [[sqlite3_vfs.xAccess]] +** ^The flags argument to xAccess() may be [SQLITE_ACCESS_EXISTS] +** to test for the existence of a file, or [SQLITE_ACCESS_READWRITE] to +** test whether a file is readable and writable, or [SQLITE_ACCESS_READ] +** to test whether a file is at least readable. The file can be a +** directory. +** +** ^SQLite will always allocate at least mxPathname+1 bytes for the +** output buffer xFullPathname. The exact size of the output buffer +** is also passed as a parameter to both methods. If the output buffer +** is not large enough, [SQLITE_CANTOPEN] should be returned. Since this is +** handled as a fatal error by SQLite, vfs implementations should endeavor +** to prevent this by setting mxPathname to a sufficiently large value. +** +** The xRandomness(), xSleep(), xCurrentTime(), and xCurrentTimeInt64() +** interfaces are not strictly a part of the filesystem, but they are +** included in the VFS structure for completeness. +** The xRandomness() function attempts to return nBytes bytes +** of good-quality randomness into zOut. The return value is +** the actual number of bytes of randomness obtained. +** The xSleep() method causes the calling thread to sleep for at +** least the number of microseconds given. ^The xCurrentTime() +** method returns a Julian Day Number for the current date and time as +** a floating point value. +** ^The xCurrentTimeInt64() method returns, as an integer, the Julian +** Day Number multiplied by 86400000 (the number of milliseconds in +** a 24-hour day). +** ^SQLite will use the xCurrentTimeInt64() method to get the current +** date and time if that method is available (if iVersion is 2 or +** greater and the function pointer is not NULL) and will fall back +** to xCurrentTime() if xCurrentTimeInt64() is unavailable. +** +** ^The xSetSystemCall(), xGetSystemCall(), and xNestSystemCall() interfaces +** are not used by the SQLite core. These optional interfaces are provided +** by some VFSes to facilitate testing of the VFS code. By overriding +** system calls with functions under its control, a test program can +** simulate faults and error conditions that would otherwise be difficult +** or impossible to induce. The set of system calls that can be overridden +** varies from one VFS to another, and from one version of the same VFS to the +** next. Applications that use these interfaces must be prepared for any +** or all of these interfaces to be NULL or for their behavior to change +** from one release to the next. Applications must not attempt to access +** any of these methods if the iVersion of the VFS is less than 3. +*/ +typedef struct sqlite3_vfs sqlite3_vfs; +typedef void (*sqlite3_syscall_ptr)(void); +struct sqlite3_vfs { + int iVersion; /* Structure version number (currently 3) */ + int szOsFile; /* Size of subclassed sqlite3_file */ + int mxPathname; /* Maximum file pathname length */ + sqlite3_vfs *pNext; /* Next registered VFS */ + const char *zName; /* Name of this virtual file system */ + void *pAppData; /* Pointer to application-specific data */ + int (*xOpen)(sqlite3_vfs*, const char *zName, sqlite3_file*, + int flags, int *pOutFlags); + int (*xDelete)(sqlite3_vfs*, const char *zName, int syncDir); + int (*xAccess)(sqlite3_vfs*, const char *zName, int flags, int *pResOut); + int (*xFullPathname)(sqlite3_vfs*, const char *zName, int nOut, char *zOut); + void *(*xDlOpen)(sqlite3_vfs*, const char *zFilename); + void (*xDlError)(sqlite3_vfs*, int nByte, char *zErrMsg); + void (*(*xDlSym)(sqlite3_vfs*,void*, const char *zSymbol))(void); + void (*xDlClose)(sqlite3_vfs*, void*); + int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut); + int (*xSleep)(sqlite3_vfs*, int microseconds); + int (*xCurrentTime)(sqlite3_vfs*, double*); + int (*xGetLastError)(sqlite3_vfs*, int, char *); + /* + ** The methods above are in version 1 of the sqlite_vfs object + ** definition. Those that follow are added in version 2 or later + */ + int (*xCurrentTimeInt64)(sqlite3_vfs*, sqlite3_int64*); + /* + ** The methods above are in versions 1 and 2 of the sqlite_vfs object. + ** Those below are for version 3 and greater. + */ + int (*xSetSystemCall)(sqlite3_vfs*, const char *zName, sqlite3_syscall_ptr); + sqlite3_syscall_ptr (*xGetSystemCall)(sqlite3_vfs*, const char *zName); + const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); + /* + ** The methods above are in versions 1 through 3 of the sqlite_vfs object. + ** New fields may be appended in future versions. The iVersion + ** value will increment whenever this happens. + */ +}; + +/* +** CAPI3REF: Flags for the xAccess VFS method +** +** These integer constants can be used as the third parameter to +** the xAccess method of an [sqlite3_vfs] object. They determine +** what kind of permissions the xAccess method is looking for. +** With SQLITE_ACCESS_EXISTS, the xAccess method +** simply checks whether the file exists. +** With SQLITE_ACCESS_READWRITE, the xAccess method +** checks whether the named directory is both readable and writable +** (in other words, if files can be added, removed, and renamed within +** the directory). +** The SQLITE_ACCESS_READWRITE constant is currently used only by the +** [temp_store_directory pragma], though this could change in a future +** release of SQLite. +** With SQLITE_ACCESS_READ, the xAccess method +** checks whether the file is readable. The SQLITE_ACCESS_READ constant is +** currently unused, though it might be used in a future release of +** SQLite. +*/ +#define SQLITE_ACCESS_EXISTS 0 +#define SQLITE_ACCESS_READWRITE 1 /* Used by PRAGMA temp_store_directory */ +#define SQLITE_ACCESS_READ 2 /* Unused */ + +/* +** CAPI3REF: Flags for the xShmLock VFS method +** +** These integer constants define the various locking operations +** allowed by the xShmLock method of [sqlite3_io_methods]. The +** following are the only legal combinations of flags to the +** xShmLock method: +** +**
      +**
    • SQLITE_SHM_LOCK | SQLITE_SHM_SHARED +**
    • SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE +**
    • SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED +**
    • SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE +**
    +** +** When unlocking, the same SHARED or EXCLUSIVE flag must be supplied as +** was given on the corresponding lock. +** +** The xShmLock method can transition between unlocked and SHARED or +** between unlocked and EXCLUSIVE. It cannot transition between SHARED +** and EXCLUSIVE. +*/ +#define SQLITE_SHM_UNLOCK 1 +#define SQLITE_SHM_LOCK 2 +#define SQLITE_SHM_SHARED 4 +#define SQLITE_SHM_EXCLUSIVE 8 + +/* +** CAPI3REF: Maximum xShmLock index +** +** The xShmLock method on [sqlite3_io_methods] may use values +** between 0 and this upper bound as its "offset" argument. +** The SQLite core will never attempt to acquire or release a +** lock outside of this range +*/ +#define SQLITE_SHM_NLOCK 8 + + +/* +** CAPI3REF: Initialize The SQLite Library +** +** ^The sqlite3_initialize() routine initializes the +** SQLite library. ^The sqlite3_shutdown() routine +** deallocates any resources that were allocated by sqlite3_initialize(). +** These routines are designed to aid in process initialization and +** shutdown on embedded systems. Workstation applications using +** SQLite normally do not need to invoke either of these routines. +** +** A call to sqlite3_initialize() is an "effective" call if it is +** the first time sqlite3_initialize() is invoked during the lifetime of +** the process, or if it is the first time sqlite3_initialize() is invoked +** following a call to sqlite3_shutdown(). ^(Only an effective call +** of sqlite3_initialize() does any initialization. All other calls +** are harmless no-ops.)^ +** +** A call to sqlite3_shutdown() is an "effective" call if it is the first +** call to sqlite3_shutdown() since the last sqlite3_initialize(). ^(Only +** an effective call to sqlite3_shutdown() does any deinitialization. +** All other valid calls to sqlite3_shutdown() are harmless no-ops.)^ +** +** The sqlite3_initialize() interface is threadsafe, but sqlite3_shutdown() +** is not. The sqlite3_shutdown() interface must only be called from a +** single thread. All open [database connections] must be closed and all +** other SQLite resources must be deallocated prior to invoking +** sqlite3_shutdown(). +** +** Among other things, ^sqlite3_initialize() will invoke +** sqlite3_os_init(). Similarly, ^sqlite3_shutdown() +** will invoke sqlite3_os_end(). +** +** ^The sqlite3_initialize() routine returns [SQLITE_OK] on success. +** ^If for some reason, sqlite3_initialize() is unable to initialize +** the library (perhaps it is unable to allocate a needed resource such +** as a mutex) it returns an [error code] other than [SQLITE_OK]. +** +** ^The sqlite3_initialize() routine is called internally by many other +** SQLite interfaces so that an application usually does not need to +** invoke sqlite3_initialize() directly. For example, [sqlite3_open()] +** calls sqlite3_initialize() so the SQLite library will be automatically +** initialized when [sqlite3_open()] is called if it has not be initialized +** already. ^However, if SQLite is compiled with the [SQLITE_OMIT_AUTOINIT] +** compile-time option, then the automatic calls to sqlite3_initialize() +** are omitted and the application must call sqlite3_initialize() directly +** prior to using any other SQLite interface. For maximum portability, +** it is recommended that applications always invoke sqlite3_initialize() +** directly prior to using any other SQLite interface. Future releases +** of SQLite may require this. In other words, the behavior exhibited +** when SQLite is compiled with [SQLITE_OMIT_AUTOINIT] might become the +** default behavior in some future release of SQLite. +** +** The sqlite3_os_init() routine does operating-system specific +** initialization of the SQLite library. The sqlite3_os_end() +** routine undoes the effect of sqlite3_os_init(). Typical tasks +** performed by these routines include allocation or deallocation +** of static resources, initialization of global variables, +** setting up a default [sqlite3_vfs] module, or setting up +** a default configuration using [sqlite3_config()]. +** +** The application should never invoke either sqlite3_os_init() +** or sqlite3_os_end() directly. The application should only invoke +** sqlite3_initialize() and sqlite3_shutdown(). The sqlite3_os_init() +** interface is called automatically by sqlite3_initialize() and +** sqlite3_os_end() is called by sqlite3_shutdown(). Appropriate +** implementations for sqlite3_os_init() and sqlite3_os_end() +** are built into SQLite when it is compiled for Unix, Windows, or OS/2. +** When [custom builds | built for other platforms] +** (using the [SQLITE_OS_OTHER=1] compile-time +** option) the application must supply a suitable implementation for +** sqlite3_os_init() and sqlite3_os_end(). An application-supplied +** implementation of sqlite3_os_init() or sqlite3_os_end() +** must return [SQLITE_OK] on success and some other [error code] upon +** failure. +*/ +SQLITE_API int sqlite3_initialize(void); +SQLITE_API int sqlite3_shutdown(void); +SQLITE_API int sqlite3_os_init(void); +SQLITE_API int sqlite3_os_end(void); + +/* +** CAPI3REF: Configuring The SQLite Library +** +** The sqlite3_config() interface is used to make global configuration +** changes to SQLite in order to tune SQLite to the specific needs of +** the application. The default configuration is recommended for most +** applications and so this routine is usually not necessary. It is +** provided to support rare applications with unusual needs. +** +** The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running. +** +** The sqlite3_config() interface +** may only be invoked prior to library initialization using +** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. +** ^If sqlite3_config() is called after [sqlite3_initialize()] and before +** [sqlite3_shutdown()] then it will return SQLITE_MISUSE. +** Note, however, that ^sqlite3_config() can be called as part of the +** implementation of an application-defined [sqlite3_os_init()]. +** +** The first argument to sqlite3_config() is an integer +** [configuration option] that determines +** what property of SQLite is to be configured. Subsequent arguments +** vary depending on the [configuration option] +** in the first argument. +** +** ^When a configuration option is set, sqlite3_config() returns [SQLITE_OK]. +** ^If the option is unknown or SQLite is unable to set the option +** then this routine returns a non-zero [error code]. +*/ +SQLITE_API int sqlite3_config(int, ...); + +/* +** CAPI3REF: Configure database connections +** METHOD: sqlite3 +** +** The sqlite3_db_config() interface is used to make configuration +** changes to a [database connection]. The interface is similar to +** [sqlite3_config()] except that the changes apply to a single +** [database connection] (specified in the first argument). +** +** The second argument to sqlite3_db_config(D,V,...) is the +** [SQLITE_DBCONFIG_LOOKASIDE | configuration verb] - an integer code +** that indicates what aspect of the [database connection] is being configured. +** Subsequent arguments vary depending on the configuration verb. +** +** ^Calls to sqlite3_db_config() return SQLITE_OK if and only if +** the call is considered successful. +*/ +SQLITE_API int sqlite3_db_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Memory Allocation Routines +** +** An instance of this object defines the interface between SQLite +** and low-level memory allocation routines. +** +** This object is used in only one place in the SQLite interface. +** A pointer to an instance of this object is the argument to +** [sqlite3_config()] when the configuration option is +** [SQLITE_CONFIG_MALLOC] or [SQLITE_CONFIG_GETMALLOC]. +** By creating an instance of this object +** and passing it to [sqlite3_config]([SQLITE_CONFIG_MALLOC]) +** during configuration, an application can specify an alternative +** memory allocation subsystem for SQLite to use for all of its +** dynamic memory needs. +** +** Note that SQLite comes with several [built-in memory allocators] +** that are perfectly adequate for the overwhelming majority of applications +** and that this object is only useful to a tiny minority of applications +** with specialized memory allocation requirements. This object is +** also used during testing of SQLite in order to specify an alternative +** memory allocator that simulates memory out-of-memory conditions in +** order to verify that SQLite recovers gracefully from such +** conditions. +** +** The xMalloc, xRealloc, and xFree methods must work like the +** malloc(), realloc() and free() functions from the standard C library. +** ^SQLite guarantees that the second argument to +** xRealloc is always a value returned by a prior call to xRoundup. +** +** xSize should return the allocated size of a memory allocation +** previously obtained from xMalloc or xRealloc. The allocated size +** is always at least as big as the requested size but may be larger. +** +** The xRoundup method returns what would be the allocated size of +** a memory allocation given a particular requested size. Most memory +** allocators round up memory allocations at least to the next multiple +** of 8. Some allocators round up to a larger multiple or to a power of 2. +** Every memory allocation request coming in through [sqlite3_malloc()] +** or [sqlite3_realloc()] first calls xRoundup. If xRoundup returns 0, +** that causes the corresponding memory allocation to fail. +** +** The xInit method initializes the memory allocator. For example, +** it might allocate any require mutexes or initialize internal data +** structures. The xShutdown method is invoked (indirectly) by +** [sqlite3_shutdown()] and should deallocate any resources acquired +** by xInit. The pAppData pointer is used as the only parameter to +** xInit and xShutdown. +** +** SQLite holds the [SQLITE_MUTEX_STATIC_MASTER] mutex when it invokes +** the xInit method, so the xInit method need not be threadsafe. The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. For all other methods, SQLite +** holds the [SQLITE_MUTEX_STATIC_MEM] mutex as long as the +** [SQLITE_CONFIG_MEMSTATUS] configuration option is turned on (which +** it is by default) and so the methods are automatically serialized. +** However, if [SQLITE_CONFIG_MEMSTATUS] is disabled, then the other +** methods must be threadsafe or else make their own arrangements for +** serialization. +** +** SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +*/ +typedef struct sqlite3_mem_methods sqlite3_mem_methods; +struct sqlite3_mem_methods { + void *(*xMalloc)(int); /* Memory allocation function */ + void (*xFree)(void*); /* Free a prior allocation */ + void *(*xRealloc)(void*,int); /* Resize an allocation */ + int (*xSize)(void*); /* Return the size of an allocation */ + int (*xRoundup)(int); /* Round up request size to allocation size */ + int (*xInit)(void*); /* Initialize the memory allocator */ + void (*xShutdown)(void*); /* Deinitialize the memory allocator */ + void *pAppData; /* Argument to xInit() and xShutdown() */ +}; + +/* +** CAPI3REF: Configuration Options +** KEYWORDS: {configuration option} +** +** These constants are the available integer configuration options that +** can be passed as the first argument to the [sqlite3_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_config()] to make sure that +** the call worked. The [sqlite3_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
    +** [[SQLITE_CONFIG_SINGLETHREAD]]
    SQLITE_CONFIG_SINGLETHREAD
    +**
    There are no arguments to this option. ^This option sets the +** [threading mode] to Single-thread. In other words, it disables +** all mutexing and puts SQLite into a mode where it can only be used +** by a single thread. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to change the [threading mode] from its default +** value of Single-thread and so [sqlite3_config()] will return +** [SQLITE_ERROR] if called with the SQLITE_CONFIG_SINGLETHREAD +** configuration option.
    +** +** [[SQLITE_CONFIG_MULTITHREAD]]
    SQLITE_CONFIG_MULTITHREAD
    +**
    There are no arguments to this option. ^This option sets the +** [threading mode] to Multi-thread. In other words, it disables +** mutexing on [database connection] and [prepared statement] objects. +** The application is responsible for serializing access to +** [database connections] and [prepared statements]. But other mutexes +** are enabled so that SQLite will be safe to use in a multi-threaded +** environment as long as no two threads attempt to use the same +** [database connection] at the same time. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Multi-thread [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_MULTITHREAD configuration option.
    +** +** [[SQLITE_CONFIG_SERIALIZED]]
    SQLITE_CONFIG_SERIALIZED
    +**
    There are no arguments to this option. ^This option sets the +** [threading mode] to Serialized. In other words, this option enables +** all mutexes including the recursive +** mutexes on [database connection] and [prepared statement] objects. +** In this mode (which is the default when SQLite is compiled with +** [SQLITE_THREADSAFE=1]) the SQLite library will itself serialize access +** to [database connections] and [prepared statements] so that the +** application is free to use the same [database connection] or the +** same [prepared statement] in different threads at the same time. +** ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** it is not possible to set the Serialized [threading mode] and +** [sqlite3_config()] will return [SQLITE_ERROR] if called with the +** SQLITE_CONFIG_SERIALIZED configuration option.
    +** +** [[SQLITE_CONFIG_MALLOC]]
    SQLITE_CONFIG_MALLOC
    +**
    ^(The SQLITE_CONFIG_MALLOC option takes a single argument which is +** a pointer to an instance of the [sqlite3_mem_methods] structure. +** The argument specifies +** alternative low-level memory allocation routines to be used in place of +** the memory allocation routines built into SQLite.)^ ^SQLite makes +** its own private copy of the content of the [sqlite3_mem_methods] structure +** before the [sqlite3_config()] call returns.
    +** +** [[SQLITE_CONFIG_GETMALLOC]]
    SQLITE_CONFIG_GETMALLOC
    +**
    ^(The SQLITE_CONFIG_GETMALLOC option takes a single argument which +** is a pointer to an instance of the [sqlite3_mem_methods] structure. +** The [sqlite3_mem_methods] +** structure is filled with the currently defined memory allocation routines.)^ +** This option can be used to overload the default memory allocation +** routines with a wrapper that simulations memory allocation failure or +** tracks memory usage, for example.
    +** +** [[SQLITE_CONFIG_MEMSTATUS]]
    SQLITE_CONFIG_MEMSTATUS
    +**
    ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, +** interpreted as a boolean, which enables or disables the collection of +** memory allocation statistics. ^(When memory allocation statistics are +** disabled, the following SQLite interfaces become non-operational: +**
      +**
    • [sqlite3_memory_used()] +**
    • [sqlite3_memory_highwater()] +**
    • [sqlite3_soft_heap_limit64()] +**
    • [sqlite3_status64()] +**
    )^ +** ^Memory allocation statistics are enabled by default unless SQLite is +** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory +** allocation statistics are disabled by default. +**
    +** +** [[SQLITE_CONFIG_SCRATCH]]
    SQLITE_CONFIG_SCRATCH
    +**
    ^The SQLITE_CONFIG_SCRATCH option specifies a static memory buffer +** that SQLite can use for scratch memory. ^(There are three arguments +** to SQLITE_CONFIG_SCRATCH: A pointer an 8-byte +** aligned memory buffer from which the scratch allocations will be +** drawn, the size of each scratch allocation (sz), +** and the maximum number of scratch allocations (N).)^ +** The first argument must be a pointer to an 8-byte aligned buffer +** of at least sz*N bytes of memory. +** ^SQLite will not use more than one scratch buffers per thread. +** ^SQLite will never request a scratch buffer that is more than 6 +** times the database page size. +** ^If SQLite needs needs additional +** scratch memory beyond what is provided by this configuration option, then +** [sqlite3_malloc()] will be used to obtain the memory needed.

    +** ^When the application provides any amount of scratch memory using +** SQLITE_CONFIG_SCRATCH, SQLite avoids unnecessary large +** [sqlite3_malloc|heap allocations]. +** This can help [Robson proof|prevent memory allocation failures] due to heap +** fragmentation in low-memory embedded systems. +**

    +** +** [[SQLITE_CONFIG_PAGECACHE]]
    SQLITE_CONFIG_PAGECACHE
    +**
    ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool +** that SQLite can use for the database page cache with the default page +** cache implementation. +** This configuration option is a no-op if an application-define page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. +** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). +** The sz argument should be the size of the largest database page +** (a power of two between 512 and 65536) plus some extra bytes for each +** page header. ^The number of extra bytes needed by the page header +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. +** ^It is harmless, apart from the wasted memory, +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line.
    +** +** [[SQLITE_CONFIG_HEAP]]
    SQLITE_CONFIG_HEAP
    +**
    ^The SQLITE_CONFIG_HEAP option specifies a static memory buffer +** that SQLite will use for all of its dynamic memory allocation needs +** beyond those provided for by [SQLITE_CONFIG_SCRATCH] and +** [SQLITE_CONFIG_PAGECACHE]. +** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled +** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns +** [SQLITE_ERROR] if invoked otherwise. +** ^There are three arguments to SQLITE_CONFIG_HEAP: +** An 8-byte aligned pointer to the memory, +** the number of bytes in the memory buffer, and the minimum allocation size. +** ^If the first pointer (the memory pointer) is NULL, then SQLite reverts +** to using its default memory allocator (the system malloc() implementation), +** undoing any prior invocation of [SQLITE_CONFIG_MALLOC]. ^If the +** memory pointer is not NULL then the alternative memory +** allocator is engaged to handle all of SQLites memory allocation needs. +** The first pointer (the memory pointer) must be aligned to an 8-byte +** boundary or subsequent behavior of SQLite will be undefined. +** The minimum allocation size is capped at 2**12. Reasonable values +** for the minimum allocation size are 2**5 through 2**8.
    +** +** [[SQLITE_CONFIG_MUTEX]]
    SQLITE_CONFIG_MUTEX
    +**
    ^(The SQLITE_CONFIG_MUTEX option takes a single argument which is a +** pointer to an instance of the [sqlite3_mutex_methods] structure. +** The argument specifies alternative low-level mutex routines to be used +** in place the mutex routines built into SQLite.)^ ^SQLite makes a copy of +** the content of the [sqlite3_mutex_methods] structure before the call to +** [sqlite3_config()] returns. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_MUTEX configuration option will +** return [SQLITE_ERROR].
    +** +** [[SQLITE_CONFIG_GETMUTEX]]
    SQLITE_CONFIG_GETMUTEX
    +**
    ^(The SQLITE_CONFIG_GETMUTEX option takes a single argument which +** is a pointer to an instance of the [sqlite3_mutex_methods] structure. The +** [sqlite3_mutex_methods] +** structure is filled with the currently defined mutex routines.)^ +** This option can be used to overload the default mutex allocation +** routines with a wrapper used to track mutex usage for performance +** profiling or testing, for example. ^If SQLite is compiled with +** the [SQLITE_THREADSAFE | SQLITE_THREADSAFE=0] compile-time option then +** the entire mutexing subsystem is omitted from the build and hence calls to +** [sqlite3_config()] with the SQLITE_CONFIG_GETMUTEX configuration option will +** return [SQLITE_ERROR].
    +** +** [[SQLITE_CONFIG_LOOKASIDE]]
    SQLITE_CONFIG_LOOKASIDE
    +**
    ^(The SQLITE_CONFIG_LOOKASIDE option takes two arguments that determine +** the default size of lookaside memory on each [database connection]. +** The first argument is the +** size of each lookaside buffer slot and the second is the number of +** slots allocated to each database connection.)^ ^(SQLITE_CONFIG_LOOKASIDE +** sets the default lookaside size. The [SQLITE_DBCONFIG_LOOKASIDE] +** option to [sqlite3_db_config()] can be used to change the lookaside +** configuration on individual connections.)^
    +** +** [[SQLITE_CONFIG_PCACHE2]]
    SQLITE_CONFIG_PCACHE2
    +**
    ^(The SQLITE_CONFIG_PCACHE2 option takes a single argument which is +** a pointer to an [sqlite3_pcache_methods2] object. This object specifies +** the interface to a custom page cache implementation.)^ +** ^SQLite makes a copy of the [sqlite3_pcache_methods2] object.
    +** +** [[SQLITE_CONFIG_GETPCACHE2]]
    SQLITE_CONFIG_GETPCACHE2
    +**
    ^(The SQLITE_CONFIG_GETPCACHE2 option takes a single argument which +** is a pointer to an [sqlite3_pcache_methods2] object. SQLite copies of +** the current page cache implementation into that object.)^
    +** +** [[SQLITE_CONFIG_LOG]]
    SQLITE_CONFIG_LOG
    +**
    The SQLITE_CONFIG_LOG option is used to configure the SQLite +** global [error log]. +** (^The SQLITE_CONFIG_LOG option takes two arguments: a pointer to a +** function with a call signature of void(*)(void*,int,const char*), +** and a pointer to void. ^If the function pointer is not NULL, it is +** invoked by [sqlite3_log()] to process each logging event. ^If the +** function pointer is NULL, the [sqlite3_log()] interface becomes a no-op. +** ^The void pointer that is the second argument to SQLITE_CONFIG_LOG is +** passed through as the first parameter to the application-defined logger +** function whenever that function is invoked. ^The second parameter to +** the logger function is a copy of the first parameter to the corresponding +** [sqlite3_log()] call and is intended to be a [result code] or an +** [extended result code]. ^The third parameter passed to the logger is +** log message after formatting via [sqlite3_snprintf()]. +** The SQLite logging interface is not reentrant; the logger function +** supplied by the application must not invoke any SQLite interface. +** In a multi-threaded application, the application-defined logger +** function must be threadsafe.
    +** +** [[SQLITE_CONFIG_URI]]
    SQLITE_CONFIG_URI +**
    ^(The SQLITE_CONFIG_URI option takes a single argument of type int. +** If non-zero, then URI handling is globally enabled. If the parameter is zero, +** then URI handling is globally disabled.)^ ^If URI handling is globally +** enabled, all filenames passed to [sqlite3_open()], [sqlite3_open_v2()], +** [sqlite3_open16()] or +** specified as part of [ATTACH] commands are interpreted as URIs, regardless +** of whether or not the [SQLITE_OPEN_URI] flag is set when the database +** connection is opened. ^If it is globally disabled, filenames are +** only interpreted as URIs if the SQLITE_OPEN_URI flag is set when the +** database connection is opened. ^(By default, URI handling is globally +** disabled. The default value may be changed by compiling with the +** [SQLITE_USE_URI] symbol defined.)^ +** +** [[SQLITE_CONFIG_COVERING_INDEX_SCAN]]
    SQLITE_CONFIG_COVERING_INDEX_SCAN +**
    ^The SQLITE_CONFIG_COVERING_INDEX_SCAN option takes a single integer +** argument which is interpreted as a boolean in order to enable or disable +** the use of covering indices for full table scans in the query optimizer. +** ^The default setting is determined +** by the [SQLITE_ALLOW_COVERING_INDEX_SCAN] compile-time option, or is "on" +** if that compile-time option is omitted. +** The ability to disable the use of covering indices for full table scans +** is because some incorrectly coded legacy applications might malfunction +** when the optimization is enabled. Providing the ability to +** disable the optimization allows the older, buggy application code to work +** without change even with newer versions of SQLite. +** +** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] +**
    SQLITE_CONFIG_PCACHE and SQLITE_CONFIG_GETPCACHE +**
    These options are obsolete and should not be used by new code. +** They are retained for backwards compatibility but are now no-ops. +**
    +** +** [[SQLITE_CONFIG_SQLLOG]] +**
    SQLITE_CONFIG_SQLLOG +**
    This option is only available if sqlite is compiled with the +** [SQLITE_ENABLE_SQLLOG] pre-processor macro defined. The first argument should +** be a pointer to a function of type void(*)(void*,sqlite3*,const char*, int). +** The second should be of type (void*). The callback is invoked by the library +** in three separate circumstances, identified by the value passed as the +** fourth parameter. If the fourth parameter is 0, then the database connection +** passed as the second argument has just been opened. The third argument +** points to a buffer containing the name of the main database file. If the +** fourth parameter is 1, then the SQL statement that the third parameter +** points to has just been executed. Or, if the fourth parameter is 2, then +** the connection being passed as the second parameter is being closed. The +** third parameter is passed NULL In this case. An example of using this +** configuration option can be seen in the "test_sqllog.c" source file in +** the canonical SQLite source tree.
    +** +** [[SQLITE_CONFIG_MMAP_SIZE]] +**
    SQLITE_CONFIG_MMAP_SIZE +**
    ^SQLITE_CONFIG_MMAP_SIZE takes two 64-bit integer (sqlite3_int64) values +** that are the default mmap size limit (the default setting for +** [PRAGMA mmap_size]) and the maximum allowed mmap size limit. +** ^The default setting can be overridden by each database connection using +** either the [PRAGMA mmap_size] command, or by using the +** [SQLITE_FCNTL_MMAP_SIZE] file control. ^(The maximum allowed mmap size +** will be silently truncated if necessary so that it does not exceed the +** compile-time maximum mmap size set by the +** [SQLITE_MAX_MMAP_SIZE] compile-time option.)^ +** ^If either argument to this option is negative, then that argument is +** changed to its compile-time default. +** +** [[SQLITE_CONFIG_WIN32_HEAPSIZE]] +**
    SQLITE_CONFIG_WIN32_HEAPSIZE +**
    ^The SQLITE_CONFIG_WIN32_HEAPSIZE option is only available if SQLite is +** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro +** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value +** that specifies the maximum size of the created heap. +** +** [[SQLITE_CONFIG_PCACHE_HDRSZ]] +**
    SQLITE_CONFIG_PCACHE_HDRSZ +**
    ^The SQLITE_CONFIG_PCACHE_HDRSZ option takes a single parameter which +** is a pointer to an integer and writes into that integer the number of extra +** bytes per page required for each page in [SQLITE_CONFIG_PAGECACHE]. +** The amount of extra space required can change depending on the compiler, +** target platform, and SQLite version. +** +** [[SQLITE_CONFIG_PMASZ]] +**
    SQLITE_CONFIG_PMASZ +**
    ^The SQLITE_CONFIG_PMASZ option takes a single parameter which +** is an unsigned integer and sets the "Minimum PMA Size" for the multithreaded +** sorter to that integer. The default minimum PMA Size is set by the +** [SQLITE_SORTER_PMASZ] compile-time option. New threads are launched +** to help with sort operations when multithreaded sorting +** is enabled (using the [PRAGMA threads] command) and the amount of content +** to be sorted exceeds the page size times the minimum of the +** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +**
    SQLITE_CONFIG_STMTJRNL_SPILL +**
    ^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +**
    +*/ +#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ +#define SQLITE_CONFIG_MULTITHREAD 2 /* nil */ +#define SQLITE_CONFIG_SERIALIZED 3 /* nil */ +#define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ +#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ +#define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ +#define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ +#define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ +#define SQLITE_CONFIG_MUTEX 10 /* sqlite3_mutex_methods* */ +#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ +/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ +#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ +#define SQLITE_CONFIG_PCACHE 14 /* no-op */ +#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ +#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ +#define SQLITE_CONFIG_URI 17 /* int */ +#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ +#define SQLITE_CONFIG_COVERING_INDEX_SCAN 20 /* int */ +#define SQLITE_CONFIG_SQLLOG 21 /* xSqllog, void* */ +#define SQLITE_CONFIG_MMAP_SIZE 22 /* sqlite3_int64, sqlite3_int64 */ +#define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ +#define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ +#define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ + +/* +** CAPI3REF: Database Connection Configuration Options +** +** These constants are the available integer configuration options that +** can be passed as the second argument to the [sqlite3_db_config()] interface. +** +** New configuration options may be added in future releases of SQLite. +** Existing configuration options might be discontinued. Applications +** should check the return code from [sqlite3_db_config()] to make sure that +** the call worked. ^The [sqlite3_db_config()] interface will return a +** non-zero [error code] if a discontinued or unsupported configuration option +** is invoked. +** +**
    +**
    SQLITE_DBCONFIG_LOOKASIDE
    +**
    ^This option takes three additional arguments that determine the +** [lookaside memory allocator] configuration for the [database connection]. +** ^The first argument (the third parameter to [sqlite3_db_config()] is a +** pointer to a memory buffer to use for lookaside memory. +** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb +** may be NULL in which case SQLite will allocate the +** lookaside buffer itself using [sqlite3_malloc()]. ^The second argument is the +** size of each lookaside buffer slot. ^The third argument is the number of +** slots. The size of the buffer in the first argument must be greater than +** or equal to the product of the second and third arguments. The buffer +** must be aligned to an 8-byte boundary. ^If the second argument to +** SQLITE_DBCONFIG_LOOKASIDE is not a multiple of 8, it is internally +** rounded down to the next smaller multiple of 8. ^(The lookaside memory +** configuration for a database connection can only be changed when that +** connection is not currently using lookaside memory, or in other words +** when the "current value" returned by +** [sqlite3_db_status](D,[SQLITE_CONFIG_LOOKASIDE],...) is zero. +** Any attempt to change the lookaside memory configuration when lookaside +** memory is in use leaves the configuration unchanged and returns +** [SQLITE_BUSY].)^
    +** +**
    SQLITE_DBCONFIG_ENABLE_FKEY
    +**
    ^This option is used to enable or disable the enforcement of +** [foreign key constraints]. There should be two additional arguments. +** The first argument is an integer which is 0 to disable FK enforcement, +** positive to enable FK enforcement or negative to leave FK enforcement +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether FK enforcement is off or on +** following this call. The second parameter may be a NULL pointer, in +** which case the FK enforcement setting is not reported back.
    +** +**
    SQLITE_DBCONFIG_ENABLE_TRIGGER
    +**
    ^This option is used to enable or disable [CREATE TRIGGER | triggers]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable triggers, +** positive to enable triggers or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether triggers are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the trigger setting is not reported back.
    +** +**
    SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
    +**
    ^This option is used to enable or disable the two-argument +** version of the [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back.
    +** +**
    SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
    +**
    ^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +**
    +** +**
    SQLITE_DBCONFIG_MAINDBNAME
    +**
    ^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +**
    +** +**
    +*/ +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ + + +/* +** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 +** +** ^The sqlite3_extended_result_codes() routine enables or disables the +** [extended result codes] feature of SQLite. ^The extended result +** codes are disabled by default for historical compatibility. +*/ +SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); + +/* +** CAPI3REF: Last Insert Rowid +** METHOD: sqlite3 +** +** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) +** has a unique 64-bit signed +** integer key called the [ROWID | "rowid"]. ^The rowid is always available +** as an undeclared column named ROWID, OID, or _ROWID_ as long as those +** names are not also used by explicitly declared columns. ^If +** the table has a column of type [INTEGER PRIMARY KEY] then that column +** is another alias for the rowid. +** +** ^The sqlite3_last_insert_rowid(D) interface returns the [rowid] of the +** most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. +** ^Inserts into [WITHOUT ROWID] tables are not recorded. +** ^If no successful [INSERT]s into rowid tables +** have ever occurred on the database connection D, +** then sqlite3_last_insert_rowid(D) returns zero. +** +** ^(If an [INSERT] occurs within a trigger or within a [virtual table] +** method, then this routine will return the [rowid] of the inserted +** row as long as the trigger or virtual table method is running. +** But once the trigger or virtual table method ends, the value returned +** by this routine reverts to what it was before the trigger or virtual +** table method began.)^ +** +** ^An [INSERT] that fails due to a constraint violation is not a +** successful [INSERT] and does not change the value returned by this +** routine. ^Thus INSERT OR FAIL, INSERT OR IGNORE, INSERT OR ROLLBACK, +** and INSERT OR ABORT make no changes to the return value of this +** routine when their insertion fails. ^(When INSERT OR REPLACE +** encounters a constraint violation, it does not fail. The +** INSERT continues to completion after deleting rows that caused +** the constraint problem so INSERT OR REPLACE will always change +** the return value of this interface.)^ +** +** ^For the purposes of this routine, an [INSERT] is considered to +** be successful even if it is subsequently rolled back. +** +** This function is accessible to SQL statements via the +** [last_insert_rowid() SQL function]. +** +** If a separate thread performs a new [INSERT] on the same +** database connection while the [sqlite3_last_insert_rowid()] +** function is running and thus changes the last insert [rowid], +** then the value returned by [sqlite3_last_insert_rowid()] is +** unpredictable and might not equal either the old or the new +** last insert [rowid]. +*/ +SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); + +/* +** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the number of rows modified, inserted or +** deleted by the most recently completed INSERT, UPDATE or DELETE +** statement on the database connection specified by the only parameter. +** ^Executing any other type of SQL statement does not modify the value +** returned by this function. +** +** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are +** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], +** [foreign key actions] or [REPLACE] constraint resolution are not counted. +** +** Changes to a view that are intercepted by +** [INSTEAD OF trigger | INSTEAD OF triggers] are not counted. ^The value +** returned by sqlite3_changes() immediately after an INSERT, UPDATE or +** DELETE statement run on a view is always zero. Only changes made to real +** tables are counted. +** +** Things are more complicated if the sqlite3_changes() function is +** executed while a trigger program is running. This may happen if the +** program uses the [changes() SQL function], or if some other callback +** function invokes sqlite3_changes() directly. Essentially: +** +**
      +**
    • ^(Before entering a trigger program the value returned by +** sqlite3_changes() function is saved. After the trigger program +** has finished, the original value is restored.)^ +** +**
    • ^(Within a trigger program each INSERT, UPDATE and DELETE +** statement sets the value returned by sqlite3_changes() +** upon completion as normal. Of course, this value will not include +** any changes performed by sub-triggers, as the sqlite3_changes() +** value will be saved and restored after each sub-trigger has run.)^ +**
    +** +** ^This means that if the changes() SQL function (or similar) is used +** by the first INSERT, UPDATE or DELETE statement within a trigger, it +** returns the value as set when the calling statement began executing. +** ^If it is used by the second or subsequent such statement within a trigger +** program, the value returned reflects the number of rows modified by the +** previous INSERT, UPDATE or DELETE statement within the same trigger. +** +** See also the [sqlite3_total_changes()] interface, the +** [count_changes pragma], and the [changes() SQL function]. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_changes()] is running then the value returned +** is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_changes(sqlite3*); + +/* +** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 +** +** ^This function returns the total number of rows inserted, modified or +** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed +** since the database connection was opened, including those executed as +** part of trigger programs. ^Executing any other type of SQL statement +** does not affect the value returned by sqlite3_total_changes(). +** +** ^Changes made as part of [foreign key actions] are included in the +** count, but those made as part of REPLACE constraint resolution are +** not. ^Changes to a view that are intercepted by INSTEAD OF triggers +** are not counted. +** +** See also the [sqlite3_changes()] interface, the +** [count_changes pragma], and the [total_changes() SQL function]. +** +** If a separate thread makes changes on the same database connection +** while [sqlite3_total_changes()] is running then the value +** returned is unpredictable and not meaningful. +*/ +SQLITE_API int sqlite3_total_changes(sqlite3*); + +/* +** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 +** +** ^This function causes any pending database operation to abort and +** return at its earliest opportunity. This routine is typically +** called in response to a user action such as pressing "Cancel" +** or Ctrl-C where the user wants a long query operation to halt +** immediately. +** +** ^It is safe to call this routine from a thread different from the +** thread that is currently running the database operation. But it +** is not safe to call this routine with a [database connection] that +** is closed or might close before sqlite3_interrupt() returns. +** +** ^If an SQL operation is very nearly finished at the time when +** sqlite3_interrupt() is called, then it might not have an opportunity +** to be interrupted and might continue to completion. +** +** ^An SQL operation that is interrupted will return [SQLITE_INTERRUPT]. +** ^If the interrupted SQL operation is an INSERT, UPDATE, or DELETE +** that is inside an explicit transaction, then the entire transaction +** will be rolled back automatically. +** +** ^The sqlite3_interrupt(D) call is in effect until all currently running +** SQL statements on [database connection] D complete. ^Any new SQL statements +** that are started after the sqlite3_interrupt() call and before the +** running statements reaches zero are interrupted as if they had been +** running prior to the sqlite3_interrupt() call. ^New SQL statements +** that are started after the running statement count reaches zero are +** not effected by the sqlite3_interrupt(). +** ^A call to sqlite3_interrupt(D) that occurs when there are no running +** SQL statements is a no-op and has no effect on SQL statements +** that are started after the sqlite3_interrupt() call returns. +** +** If the database connection closes while [sqlite3_interrupt()] +** is running then bad things will likely happen. +*/ +SQLITE_API void sqlite3_interrupt(sqlite3*); + +/* +** CAPI3REF: Determine If An SQL Statement Is Complete +** +** These routines are useful during command-line input to determine if the +** currently entered text seems to form a complete SQL statement or +** if additional input is needed before sending the text into +** SQLite for parsing. ^These routines return 1 if the input string +** appears to be a complete SQL statement. ^A statement is judged to be +** complete if it ends with a semicolon token and is not a prefix of a +** well-formed CREATE TRIGGER statement. ^Semicolons that are embedded within +** string literals or quoted identifier names or comments are not +** independent tokens (they are part of the token in which they are +** embedded) and thus do not count as a statement terminator. ^Whitespace +** and comments that follow the final semicolon are ignored. +** +** ^These routines return 0 if the statement is incomplete. ^If a +** memory allocation fails, then SQLITE_NOMEM is returned. +** +** ^These routines do not parse the SQL statements thus +** will not detect syntactically incorrect SQL. +** +** ^(If SQLite has not been initialized using [sqlite3_initialize()] prior +** to invoking sqlite3_complete16() then sqlite3_initialize() is invoked +** automatically by sqlite3_complete16(). If that initialization fails, +** then the return value from sqlite3_complete16() will be non-zero +** regardless of whether or not the input SQL is complete.)^ +** +** The input to [sqlite3_complete()] must be a zero-terminated +** UTF-8 string. +** +** The input to [sqlite3_complete16()] must be a zero-terminated +** UTF-16 string in native byte order. +*/ +SQLITE_API int sqlite3_complete(const char *sql); +SQLITE_API int sqlite3_complete16(const void *sql); + +/* +** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors +** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 +** +** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X +** that might be invoked with argument P whenever +** an attempt is made to access a database table associated with +** [database connection] D when another thread +** or process has the table locked. +** The sqlite3_busy_handler() interface is used to implement +** [sqlite3_busy_timeout()] and [PRAGMA busy_timeout]. +** +** ^If the busy callback is NULL, then [SQLITE_BUSY] +** is returned immediately upon encountering the lock. ^If the busy callback +** is not NULL, then the callback might be invoked with two arguments. +** +** ^The first argument to the busy handler is a copy of the void* pointer which +** is the third argument to sqlite3_busy_handler(). ^The second argument to +** the busy handler callback is the number of times that the busy handler has +** been invoked previously for the same locking event. ^If the +** busy callback returns 0, then no additional attempts are made to +** access the database and [SQLITE_BUSY] is returned +** to the application. +** ^If the callback returns non-zero, then another attempt +** is made to access the database and the cycle repeats. +** +** The presence of a busy handler does not guarantee that it will be invoked +** when there is lock contention. ^If SQLite determines that invoking the busy +** handler could result in a deadlock, it will go ahead and return [SQLITE_BUSY] +** to the application instead of invoking the +** busy handler. +** Consider a scenario where one process is holding a read lock that +** it is trying to promote to a reserved lock and +** a second process is holding a reserved lock that it is trying +** to promote to an exclusive lock. The first process cannot proceed +** because it is blocked by the second and the second process cannot +** proceed because it is blocked by the first. If both processes +** invoke the busy handlers, neither will make any progress. Therefore, +** SQLite returns [SQLITE_BUSY] for the first process, hoping that this +** will induce the first process to release its read lock and allow +** the second process to proceed. +** +** ^The default busy callback is NULL. +** +** ^(There can only be a single busy handler defined for each +** [database connection]. Setting a new busy handler clears any +** previously set handler.)^ ^Note that calling [sqlite3_busy_timeout()] +** or evaluating [PRAGMA busy_timeout=N] will change the +** busy handler and thus clear any previously set busy handler. +** +** The busy callback should not take any actions which modify the +** database connection that invoked the busy handler. In other words, +** the busy handler is not reentrant. Any such actions +** result in undefined behavior. +** +** A busy handler must not close the database connection +** or [prepared statement] that invoked the busy handler. +*/ +SQLITE_API int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*); + +/* +** CAPI3REF: Set A Busy Timeout +** METHOD: sqlite3 +** +** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps +** for a specified amount of time when a table is locked. ^The handler +** will sleep multiple times until at least "ms" milliseconds of sleeping +** have accumulated. ^After at least "ms" milliseconds of sleeping, +** the handler returns 0 which causes [sqlite3_step()] to return +** [SQLITE_BUSY]. +** +** ^Calling this routine with an argument less than or equal to zero +** turns off all busy handlers. +** +** ^(There can only be a single busy handler for a particular +** [database connection] at any given moment. If another busy handler +** was defined (using [sqlite3_busy_handler()]) prior to calling +** this routine, that other busy handler is cleared.)^ +** +** See also: [PRAGMA busy_timeout] +*/ +SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); + +/* +** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 +** +** This is a legacy interface that is preserved for backwards compatibility. +** Use of this interface is not recommended. +** +** Definition: A result table is memory data structure created by the +** [sqlite3_get_table()] interface. A result table records the +** complete query results from one or more queries. +** +** The table conceptually has a number of rows and columns. But +** these numbers are not part of the result table itself. These +** numbers are obtained separately. Let N be the number of rows +** and M be the number of columns. +** +** A result table is an array of pointers to zero-terminated UTF-8 strings. +** There are (N+1)*M elements in the array. The first M pointers point +** to zero-terminated strings that contain the names of the columns. +** The remaining entries all point to query results. NULL values result +** in NULL pointers. All other values are in their UTF-8 zero-terminated +** string representation as returned by [sqlite3_column_text()]. +** +** A result table might consist of one or more memory allocations. +** It is not safe to pass a result table directly to [sqlite3_free()]. +** A result table should be deallocated using [sqlite3_free_table()]. +** +** ^(As an example of the result table format, suppose a query result +** is as follows: +** +**
    +**        Name        | Age
    +**        -----------------------
    +**        Alice       | 43
    +**        Bob         | 28
    +**        Cindy       | 21
    +** 
    +** +** There are two column (M==2) and three rows (N==3). Thus the +** result table has 8 entries. Suppose the result table is stored +** in an array names azResult. Then azResult holds this content: +** +**
    +**        azResult[0] = "Name";
    +**        azResult[1] = "Age";
    +**        azResult[2] = "Alice";
    +**        azResult[3] = "43";
    +**        azResult[4] = "Bob";
    +**        azResult[5] = "28";
    +**        azResult[6] = "Cindy";
    +**        azResult[7] = "21";
    +** 
    )^ +** +** ^The sqlite3_get_table() function evaluates one or more +** semicolon-separated SQL statements in the zero-terminated UTF-8 +** string of its 2nd parameter and returns a result table to the +** pointer given in its 3rd parameter. +** +** After the application has finished with the result from sqlite3_get_table(), +** it must pass the result table pointer to sqlite3_free_table() in order to +** release the memory that was malloced. Because of the way the +** [sqlite3_malloc()] happens within sqlite3_get_table(), the calling +** function must not try to call [sqlite3_free()] directly. Only +** [sqlite3_free_table()] is able to release the memory properly and safely. +** +** The sqlite3_get_table() interface is implemented as a wrapper around +** [sqlite3_exec()]. The sqlite3_get_table() routine does not have access +** to any internal data structures of SQLite. It uses only the public +** interface defined here. As a consequence, errors that occur in the +** wrapper layer outside of the internal [sqlite3_exec()] call are not +** reflected in subsequent calls to [sqlite3_errcode()] or +** [sqlite3_errmsg()]. +*/ +SQLITE_API int sqlite3_get_table( + sqlite3 *db, /* An open database */ + const char *zSql, /* SQL to be evaluated */ + char ***pazResult, /* Results of the query */ + int *pnRow, /* Number of result rows written here */ + int *pnColumn, /* Number of result columns written here */ + char **pzErrmsg /* Error msg written here */ +); +SQLITE_API void sqlite3_free_table(char **result); + +/* +** CAPI3REF: Formatted String Printing Functions +** +** These routines are work-alikes of the "printf()" family of functions +** from the standard C library. +** These routines understand most of the common K&R formatting options, +** plus some additional non-standard formats, detailed below. +** Note that some of the more obscure formatting options from recent +** C-library standards are omitted from this implementation. +** +** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their +** results into memory obtained from [sqlite3_malloc()]. +** The strings returned by these two routines should be +** released by [sqlite3_free()]. ^Both routines return a +** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** memory to hold the resulting string. +** +** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from +** the standard C library. The result is written into the +** buffer supplied as the second parameter whose size is given by +** the first parameter. Note that the order of the +** first two parameters is reversed from snprintf().)^ This is an +** historical accident that cannot be fixed without breaking +** backwards compatibility. ^(Note also that sqlite3_snprintf() +** returns a pointer to its buffer instead of the number of +** characters actually written into the buffer.)^ We admit that +** the number of characters written would be a more useful return +** value but we cannot change the implementation of sqlite3_snprintf() +** now without breaking compatibility. +** +** ^As long as the buffer size is greater than zero, sqlite3_snprintf() +** guarantees that the buffer is always zero-terminated. ^The first +** parameter "n" is the total size of the buffer, including space for +** the zero terminator. So the longest string that can be completely +** written will be n-1 characters. +** +** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). +** +** These routines all implement some additional formatting +** options that are useful for constructing SQL statements. +** All of the usual printf() formatting options apply. In addition, there +** is are "%q", "%Q", "%w" and "%z" options. +** +** ^(The %q option works like %s in that it substitutes a nul-terminated +** string from the argument list. But %q also doubles every '\'' character. +** %q is designed for use inside a string literal.)^ By doubling each '\'' +** character it escapes that character and allows it to be inserted into +** the string. +** +** For example, assume the string variable zText contains text as follows: +** +**
    +**  char *zText = "It's a happy day!";
    +** 
    +** +** One can use this text in an SQL statement as follows: +** +**
    +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText);
    +**  sqlite3_exec(db, zSQL, 0, 0, 0);
    +**  sqlite3_free(zSQL);
    +** 
    +** +** Because the %q format string is used, the '\'' character in zText +** is escaped and the SQL generated is as follows: +** +**
    +**  INSERT INTO table1 VALUES('It''s a happy day!')
    +** 
    +** +** This is correct. Had we used %s instead of %q, the generated SQL +** would have looked like this: +** +**
    +**  INSERT INTO table1 VALUES('It's a happy day!');
    +** 
    +** +** This second example is an SQL syntax error. As a general rule you should +** always use %q instead of %s when inserting text into a string literal. +** +** ^(The %Q option works like %q except it also adds single quotes around +** the outside of the total string. Additionally, if the parameter in the +** argument list is a NULL pointer, %Q substitutes the text "NULL" (without +** single quotes).)^ So, for example, one could say: +** +**
    +**  char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText);
    +**  sqlite3_exec(db, zSQL, 0, 0, 0);
    +**  sqlite3_free(zSQL);
    +** 
    +** +** The code above will render a correct SQL statement in the zSQL +** variable even if the zText variable is a NULL pointer. +** +** ^(The "%w" formatting option is like "%q" except that it expects to +** be contained within double-quotes instead of single quotes, and it +** escapes the double-quote character instead of the single-quote +** character.)^ The "%w" formatting option is intended for safely inserting +** table and column names into a constructed SQL statement. +** +** ^(The "%z" formatting option works like "%s" but with the +** addition that after the string has been read and copied into +** the result, [sqlite3_free()] is called on the input string.)^ +*/ +SQLITE_API char *sqlite3_mprintf(const char*,...); +SQLITE_API char *sqlite3_vmprintf(const char*, va_list); +SQLITE_API char *sqlite3_snprintf(int,char*,const char*, ...); +SQLITE_API char *sqlite3_vsnprintf(int,char*,const char*, va_list); + +/* +** CAPI3REF: Memory Allocation Subsystem +** +** The SQLite core uses these three routines for all of its own +** internal memory allocation needs. "Core" in the previous sentence +** does not include operating-system specific VFS implementation. The +** Windows VFS uses native malloc() and free() for some operations. +** +** ^The sqlite3_malloc() routine returns a pointer to a block +** of memory at least N bytes in length, where N is the parameter. +** ^If sqlite3_malloc() is unable to obtain sufficient free +** memory, it returns a NULL pointer. ^If the parameter N to +** sqlite3_malloc() is zero or negative then sqlite3_malloc() returns +** a NULL pointer. +** +** ^The sqlite3_malloc64(N) routine works just like +** sqlite3_malloc(N) except that N is an unsigned 64-bit integer instead +** of a signed 32-bit integer. +** +** ^Calling sqlite3_free() with a pointer previously returned +** by sqlite3_malloc() or sqlite3_realloc() releases that memory so +** that it might be reused. ^The sqlite3_free() routine is +** a no-op if is called with a NULL pointer. Passing a NULL pointer +** to sqlite3_free() is harmless. After being freed, memory +** should neither be read nor written. Even reading previously freed +** memory might result in a segmentation fault or other severe error. +** Memory corruption, a segmentation fault, or other severe error +** might result if sqlite3_free() is called with a non-NULL pointer that +** was not obtained from sqlite3_malloc() or sqlite3_realloc(). +** +** ^The sqlite3_realloc(X,N) interface attempts to resize a +** prior memory allocation X to be at least N bytes. +** ^If the X parameter to sqlite3_realloc(X,N) +** is a NULL pointer then its behavior is identical to calling +** sqlite3_malloc(N). +** ^If the N parameter to sqlite3_realloc(X,N) is zero or +** negative then the behavior is exactly the same as calling +** sqlite3_free(X). +** ^sqlite3_realloc(X,N) returns a pointer to a memory allocation +** of at least N bytes in size or NULL if insufficient memory is available. +** ^If M is the size of the prior allocation, then min(N,M) bytes +** of the prior allocation are copied into the beginning of buffer returned +** by sqlite3_realloc(X,N) and the prior allocation is freed. +** ^If sqlite3_realloc(X,N) returns NULL and N is positive, then the +** prior allocation is not freed. +** +** ^The sqlite3_realloc64(X,N) interfaces works the same as +** sqlite3_realloc(X,N) except that N is a 64-bit unsigned integer instead +** of a 32-bit signed integer. +** +** ^If X is a memory allocation previously obtained from sqlite3_malloc(), +** sqlite3_malloc64(), sqlite3_realloc(), or sqlite3_realloc64(), then +** sqlite3_msize(X) returns the size of that memory allocation in bytes. +** ^The value returned by sqlite3_msize(X) might be larger than the number +** of bytes requested when X was allocated. ^If X is a NULL pointer then +** sqlite3_msize(X) returns zero. If X points to something that is not +** the beginning of memory allocation, or if it points to a formerly +** valid memory allocation that has now been freed, then the behavior +** of sqlite3_msize(X) is undefined and possibly harmful. +** +** ^The memory returned by sqlite3_malloc(), sqlite3_realloc(), +** sqlite3_malloc64(), and sqlite3_realloc64() +** is always aligned to at least an 8 byte boundary, or to a +** 4 byte boundary if the [SQLITE_4_BYTE_ALIGNED_MALLOC] compile-time +** option is used. +** +** In SQLite version 3.5.0 and 3.5.1, it was possible to define +** the SQLITE_OMIT_MEMORY_ALLOCATION which would cause the built-in +** implementation of these routines to be omitted. That capability +** is no longer provided. Only built-in memory allocators can be used. +** +** Prior to SQLite version 3.7.10, the Windows OS interface layer called +** the system malloc() and free() directly when converting +** filenames between the UTF-8 encoding used by SQLite +** and whatever filename encoding is used by the particular Windows +** installation. Memory allocation errors were detected, but +** they were reported back as [SQLITE_CANTOPEN] or +** [SQLITE_IOERR] rather than [SQLITE_NOMEM]. +** +** The pointer arguments to [sqlite3_free()] and [sqlite3_realloc()] +** must be either NULL or else pointers obtained from a prior +** invocation of [sqlite3_malloc()] or [sqlite3_realloc()] that have +** not yet been released. +** +** The application must not read or write any part of +** a block of memory after it has been released using +** [sqlite3_free()] or [sqlite3_realloc()]. +*/ +SQLITE_API void *sqlite3_malloc(int); +SQLITE_API void *sqlite3_malloc64(sqlite3_uint64); +SQLITE_API void *sqlite3_realloc(void*, int); +SQLITE_API void *sqlite3_realloc64(void*, sqlite3_uint64); +SQLITE_API void sqlite3_free(void*); +SQLITE_API sqlite3_uint64 sqlite3_msize(void*); + +/* +** CAPI3REF: Memory Allocator Statistics +** +** SQLite provides these two interfaces for reporting on the status +** of the [sqlite3_malloc()], [sqlite3_free()], and [sqlite3_realloc()] +** routines, which form the built-in memory allocation subsystem. +** +** ^The [sqlite3_memory_used()] routine returns the number of bytes +** of memory currently outstanding (malloced but not freed). +** ^The [sqlite3_memory_highwater()] routine returns the maximum +** value of [sqlite3_memory_used()] since the high-water mark +** was last reset. ^The values returned by [sqlite3_memory_used()] and +** [sqlite3_memory_highwater()] include any overhead +** added by SQLite in its implementation of [sqlite3_malloc()], +** but not overhead added by the any underlying system library +** routines that [sqlite3_malloc()] may call. +** +** ^The memory high-water mark is reset to the current value of +** [sqlite3_memory_used()] if and only if the parameter to +** [sqlite3_memory_highwater()] is true. ^The value returned +** by [sqlite3_memory_highwater(1)] is the high-water mark +** prior to the reset. +*/ +SQLITE_API sqlite3_int64 sqlite3_memory_used(void); +SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag); + +/* +** CAPI3REF: Pseudo-Random Number Generator +** +** SQLite contains a high-quality pseudo-random number generator (PRNG) used to +** select random [ROWID | ROWIDs] when inserting new records into a table that +** already uses the largest possible [ROWID]. The PRNG is also used for +** the build-in random() and randomblob() SQL functions. This interface allows +** applications to access the same PRNG for other purposes. +** +** ^A call to this routine stores N bytes of randomness into buffer P. +** ^The P parameter can be a NULL pointer. +** +** ^If this routine has not been previously called or if the previous +** call had N less than one or a NULL pointer for P, then the PRNG is +** seeded using randomness obtained from the xRandomness method of +** the default [sqlite3_vfs] object. +** ^If the previous call to this routine had an N of 1 or more and a +** non-NULL P then the pseudo-randomness is generated +** internally and without recourse to the [sqlite3_vfs] xRandomness +** method. +*/ +SQLITE_API void sqlite3_randomness(int N, void *P); + +/* +** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** +** ^This routine registers an authorizer callback with a particular +** [database connection], supplied in the first argument. +** ^The authorizer callback is invoked as SQL statements are being compiled +** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], +** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various +** points during the compilation process, as logic is being created +** to perform various actions, the authorizer callback is invoked to +** see if those actions are allowed. ^The authorizer callback should +** return [SQLITE_OK] to allow the action, [SQLITE_IGNORE] to disallow the +** specific action but allow the SQL statement to continue to be +** compiled, or [SQLITE_DENY] to cause the entire SQL statement to be +** rejected with an error. ^If the authorizer callback returns +** any value other than [SQLITE_IGNORE], [SQLITE_OK], or [SQLITE_DENY] +** then the [sqlite3_prepare_v2()] or equivalent call that triggered +** the authorizer will fail with an error message. +** +** When the callback returns [SQLITE_OK], that means the operation +** requested is ok. ^When the callback returns [SQLITE_DENY], the +** [sqlite3_prepare_v2()] or equivalent call that triggered the +** authorizer will fail with an error message explaining that +** access is denied. +** +** ^The first parameter to the authorizer callback is a copy of the third +** parameter to the sqlite3_set_authorizer() interface. ^The second parameter +** to the callback is an integer [SQLITE_COPY | action code] that specifies +** the particular action to be authorized. ^The third through sixth parameters +** to the callback are zero-terminated strings that contain additional +** details about the action to be authorized. +** +** ^If the action code is [SQLITE_READ] +** and the callback returns [SQLITE_IGNORE] then the +** [prepared statement] statement is constructed to substitute +** a NULL value in place of the table column that would have +** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] +** return can be used to deny an untrusted user access to individual +** columns of a table. +** ^If the action code is [SQLITE_DELETE] and the callback returns +** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the +** [truncate optimization] is disabled and all rows are deleted individually. +** +** An authorizer is used when [sqlite3_prepare | preparing] +** SQL statements from an untrusted source, to ensure that the SQL statements +** do not try to access data they are not allowed to see, or that they do not +** try to execute malicious statements that damage the database. For +** example, an application may allow a user to enter arbitrary +** SQL queries for evaluation by a database. But the application does +** not want the user to be able to make arbitrary changes to the +** database. An authorizer could then be put in place while the +** user-entered SQL is being [sqlite3_prepare | prepared] that +** disallows everything except [SELECT] statements. +** +** Applications that need to process SQL from untrusted sources +** might also consider lowering resource limits using [sqlite3_limit()] +** and limiting database size using the [max_page_count] [PRAGMA] +** in addition to using an authorizer. +** +** ^(Only a single authorizer can be in place on a database connection +** at a time. Each call to sqlite3_set_authorizer overrides the +** previous call.)^ ^Disable the authorizer by installing a NULL callback. +** The authorizer is disabled by default. +** +** The authorizer callback must not do anything that will modify +** the database connection that invoked the authorizer callback. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^When [sqlite3_prepare_v2()] is used to prepare a statement, the +** statement might be re-prepared during [sqlite3_step()] due to a +** schema change. Hence, the application should ensure that the +** correct authorizer callback remains in place during the [sqlite3_step()]. +** +** ^Note that the authorizer callback is invoked only during +** [sqlite3_prepare()] or its variants. Authorization is not +** performed during statement evaluation in [sqlite3_step()], unless +** as stated in the previous paragraph, sqlite3_step() invokes +** sqlite3_prepare_v2() to reprepare a statement after a schema change. +*/ +SQLITE_API int sqlite3_set_authorizer( + sqlite3*, + int (*xAuth)(void*,int,const char*,const char*,const char*,const char*), + void *pUserData +); + +/* +** CAPI3REF: Authorizer Return Codes +** +** The [sqlite3_set_authorizer | authorizer callback function] must +** return either [SQLITE_OK] or one of these two constants in order +** to signal SQLite whether or not the action is permitted. See the +** [sqlite3_set_authorizer | authorizer documentation] for additional +** information. +** +** Note that SQLITE_IGNORE is also used as a [conflict resolution mode] +** returned from the [sqlite3_vtab_on_conflict()] interface. +*/ +#define SQLITE_DENY 1 /* Abort the SQL statement with an error */ +#define SQLITE_IGNORE 2 /* Don't allow access, but don't generate an error */ + +/* +** CAPI3REF: Authorizer Action Codes +** +** The [sqlite3_set_authorizer()] interface registers a callback function +** that is invoked to authorize certain SQL statement actions. The +** second parameter to the callback is an integer code that specifies +** what action is being authorized. These are the integer action codes that +** the authorizer callback may be passed. +** +** These action code values signify what kind of operation is to be +** authorized. The 3rd and 4th parameters to the authorization +** callback function will be parameters or NULL depending on which of these +** codes is used as the second parameter. ^(The 5th parameter to the +** authorizer callback is the name of the database ("main", "temp", +** etc.) if applicable.)^ ^The 6th parameter to the authorizer callback +** is the name of the inner-most trigger or view that is responsible for +** the access attempt or NULL if this access attempt is directly from +** top-level SQL code. +*/ +/******************************************* 3rd ************ 4th ***********/ +#define SQLITE_CREATE_INDEX 1 /* Index Name Table Name */ +#define SQLITE_CREATE_TABLE 2 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_INDEX 3 /* Index Name Table Name */ +#define SQLITE_CREATE_TEMP_TABLE 4 /* Table Name NULL */ +#define SQLITE_CREATE_TEMP_TRIGGER 5 /* Trigger Name Table Name */ +#define SQLITE_CREATE_TEMP_VIEW 6 /* View Name NULL */ +#define SQLITE_CREATE_TRIGGER 7 /* Trigger Name Table Name */ +#define SQLITE_CREATE_VIEW 8 /* View Name NULL */ +#define SQLITE_DELETE 9 /* Table Name NULL */ +#define SQLITE_DROP_INDEX 10 /* Index Name Table Name */ +#define SQLITE_DROP_TABLE 11 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_INDEX 12 /* Index Name Table Name */ +#define SQLITE_DROP_TEMP_TABLE 13 /* Table Name NULL */ +#define SQLITE_DROP_TEMP_TRIGGER 14 /* Trigger Name Table Name */ +#define SQLITE_DROP_TEMP_VIEW 15 /* View Name NULL */ +#define SQLITE_DROP_TRIGGER 16 /* Trigger Name Table Name */ +#define SQLITE_DROP_VIEW 17 /* View Name NULL */ +#define SQLITE_INSERT 18 /* Table Name NULL */ +#define SQLITE_PRAGMA 19 /* Pragma Name 1st arg or NULL */ +#define SQLITE_READ 20 /* Table Name Column Name */ +#define SQLITE_SELECT 21 /* NULL NULL */ +#define SQLITE_TRANSACTION 22 /* Operation NULL */ +#define SQLITE_UPDATE 23 /* Table Name Column Name */ +#define SQLITE_ATTACH 24 /* Filename NULL */ +#define SQLITE_DETACH 25 /* Database Name NULL */ +#define SQLITE_ALTER_TABLE 26 /* Database Name Table Name */ +#define SQLITE_REINDEX 27 /* Index Name NULL */ +#define SQLITE_ANALYZE 28 /* Table Name NULL */ +#define SQLITE_CREATE_VTABLE 29 /* Table Name Module Name */ +#define SQLITE_DROP_VTABLE 30 /* Table Name Module Name */ +#define SQLITE_FUNCTION 31 /* NULL Function Name */ +#define SQLITE_SAVEPOINT 32 /* Operation Savepoint Name */ +#define SQLITE_COPY 0 /* No longer used */ +#define SQLITE_RECURSIVE 33 /* NULL NULL */ + +/* +** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. +** +** These routines register callback functions that can be used for +** tracing and profiling the execution of SQL statements. +** +** ^The callback function registered by sqlite3_trace() is invoked at +** various times when an SQL statement is being run by [sqlite3_step()]. +** ^The sqlite3_trace() callback is invoked with a UTF-8 rendering of the +** SQL statement text as the statement first begins executing. +** ^(Additional sqlite3_trace() callbacks might occur +** as each triggered subprogram is entered. The callbacks for triggers +** contain a UTF-8 SQL comment that identifies the trigger.)^ +** +** The [SQLITE_TRACE_SIZE_LIMIT] compile-time option can be used to limit +** the length of [bound parameter] expansion in the output of sqlite3_trace(). +** +** ^The callback function registered by sqlite3_profile() is invoked +** as each SQL statement finishes. ^The profile callback contains +** the original statement text and an estimate of wall-clock time +** of how long that statement took to run. ^The profile callback +** time is in units of nanoseconds, however the current implementation +** is only capable of millisecond resolution so the six least significant +** digits in the time are meaningless. Future versions of SQLite +** might provide greater resolution on the profiler callback. The +** sqlite3_profile() function is considered experimental and is +** subject to change in future versions of SQLite. +*/ +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, + void(*xProfile)(void*,const char*,sqlite3_uint64), void*); + +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The third argument +** to [sqlite3_trace_v2()] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +**
    +** [[SQLITE_TRACE_STMT]]
    SQLITE_TRACE_STMT
    +**
    ^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]]
    SQLITE_TRACE_PROFILE
    +**
    ^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]]
    SQLITE_TRACE_ROW
    +**
    ^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]]
    SQLITE_TRACE_CLOSE
    +**
    ^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +**
    +*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + +/* +** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback +** function X to be invoked periodically during long running calls to +** [sqlite3_exec()], [sqlite3_step()] and [sqlite3_get_table()] for +** database connection D. An example use for this +** interface is to keep a GUI updated during a large query. +** +** ^The parameter P is passed through as the only parameter to the +** callback function X. ^The parameter N is the approximate number of +** [virtual machine instructions] that are evaluated between successive +** invocations of the callback X. ^If N is less than one then the progress +** handler is disabled. +** +** ^Only a single progress handler may be defined at one time per +** [database connection]; setting a new progress handler cancels the +** old one. ^Setting parameter X to NULL disables the progress handler. +** ^The progress handler is also disabled by setting N to a value less +** than 1. +** +** ^If the progress callback returns non-zero, the operation is +** interrupted. This feature can be used to implement a +** "Cancel" button on a GUI progress dialog box. +** +** The progress handler callback must not do anything that will modify +** the database connection that invoked the progress handler. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +*/ +SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); + +/* +** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 +** +** ^These routines open an SQLite database file as specified by the +** filename argument. ^The filename argument is interpreted as UTF-8 for +** sqlite3_open() and sqlite3_open_v2() and as UTF-16 in the native byte +** order for sqlite3_open16(). ^(A [database connection] handle is usually +** returned in *ppDb, even if an error occurs. The only exception is that +** if SQLite is unable to allocate memory to hold the [sqlite3] object, +** a NULL will be written into *ppDb instead of a pointer to the [sqlite3] +** object.)^ ^(If the database is opened (and/or created) successfully, then +** [SQLITE_OK] is returned. Otherwise an [error code] is returned.)^ ^The +** [sqlite3_errmsg()] or [sqlite3_errmsg16()] routines can be used to obtain +** an English language description of the error following a failure of any +** of the sqlite3_open() routines. +** +** ^The default encoding will be UTF-8 for databases created using +** sqlite3_open() or sqlite3_open_v2(). ^The default encoding for databases +** created using sqlite3_open16() will be UTF-16 in the native byte order. +** +** Whether or not an error occurs when it is opened, resources +** associated with the [database connection] handle should be released by +** passing it to [sqlite3_close()] when it is no longer required. +** +** The sqlite3_open_v2() interface works like sqlite3_open() +** except that it accepts two additional parameters for additional control +** over the new database connection. ^(The flags parameter to +** sqlite3_open_v2() can take one of +** the following three values, optionally combined with the +** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], +** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ +** +**
    +** ^(
    [SQLITE_OPEN_READONLY]
    +**
    The database is opened in read-only mode. If the database does not +** already exist, an error is returned.
    )^ +** +** ^(
    [SQLITE_OPEN_READWRITE]
    +**
    The database is opened for reading and writing if possible, or reading +** only if the file is write protected by the operating system. In either +** case the database must already exist, otherwise an error is returned.
    )^ +** +** ^(
    [SQLITE_OPEN_READWRITE] | [SQLITE_OPEN_CREATE]
    +**
    The database is opened for reading and writing, and is created if +** it does not already exist. This is the behavior that is always used for +** sqlite3_open() and sqlite3_open16().
    )^ +**
    +** +** If the 3rd parameter to sqlite3_open_v2() is not one of the +** combinations shown above optionally combined with other +** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] +** then the behavior is undefined. +** +** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection +** opens in the multi-thread [threading mode] as long as the single-thread +** mode has not been set at compile-time or start-time. ^If the +** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens +** in the serialized [threading mode] unless single-thread was +** previously selected at compile-time or start-time. +** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be +** eligible to use [shared cache mode], regardless of whether or not shared +** cache is enabled using [sqlite3_enable_shared_cache()]. ^The +** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not +** participate in [shared cache mode] even if it is enabled. +** +** ^The fourth parameter to sqlite3_open_v2() is the name of the +** [sqlite3_vfs] object that defines the operating system interface that +** the new database connection should use. ^If the fourth parameter is +** a NULL pointer then the default [sqlite3_vfs] object is used. +** +** ^If the filename is ":memory:", then a private, temporary in-memory database +** is created for the connection. ^This in-memory database will vanish when +** the database connection is closed. Future versions of SQLite might +** make use of additional special filenames that begin with the ":" character. +** It is recommended that when a database filename actually does begin with +** a ":" character you should prefix the filename with a pathname such as +** "./" to avoid ambiguity. +** +** ^If the filename is an empty string, then a private, temporary +** on-disk database will be created. ^This private database will be +** automatically deleted as soon as the database connection is closed. +** +** [[URI filenames in sqlite3_open()]]

    URI Filenames

    +** +** ^If [URI filename] interpretation is enabled, and the filename argument +** begins with "file:", then the filename is interpreted as a URI. ^URI +** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is +** set in the fourth argument to sqlite3_open_v2(), or if it has +** been enabled globally using the [SQLITE_CONFIG_URI] option with the +** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. +** As of SQLite version 3.7.7, URI filename interpretation is turned off +** by default, but future releases of SQLite might enable URI filename +** interpretation by default. See "[URI filenames]" for additional +** information. +** +** URI filenames are parsed according to RFC 3986. ^If the URI contains an +** authority, then it must be either an empty string or the string +** "localhost". ^If the authority is not an empty string or "localhost", an +** error is returned to the caller. ^The fragment component of a URI, if +** present, is ignored. +** +** ^SQLite uses the path component of the URI as the name of the disk file +** which contains the database. ^If the path begins with a '/' character, +** then it is interpreted as an absolute path. ^If the path does not begin +** with a '/' (meaning that the authority section is omitted from the URI) +** then the path is interpreted as a relative path. +** ^(On windows, the first component of an absolute path +** is a drive specification (e.g. "C:").)^ +** +** [[core URI query parameters]] +** The query component of a URI may contain parameters that are interpreted +** either by SQLite itself, or by a [VFS | custom VFS implementation]. +** SQLite and its built-in [VFSes] interpret the +** following query parameters: +** +**
      +**
    • vfs: ^The "vfs" parameter may be used to specify the name of +** a VFS object that provides the operating system interface that should +** be used to access the database file on disk. ^If this option is set to +** an empty string the default VFS object is used. ^Specifying an unknown +** VFS is an error. ^If sqlite3_open_v2() is used and the vfs option is +** present, then the VFS specified by the option takes precedence over +** the value passed as the fourth parameter to sqlite3_open_v2(). +** +**
    • mode: ^(The mode parameter may be set to either "ro", "rw", +** "rwc", or "memory". Attempting to set it to any other value is +** an error)^. +** ^If "ro" is specified, then the database is opened for read-only +** access, just as if the [SQLITE_OPEN_READONLY] flag had been set in the +** third argument to sqlite3_open_v2(). ^If the mode option is set to +** "rw", then the database is opened for read-write (but not create) +** access, as if SQLITE_OPEN_READWRITE (but not SQLITE_OPEN_CREATE) had +** been set. ^Value "rwc" is equivalent to setting both +** SQLITE_OPEN_READWRITE and SQLITE_OPEN_CREATE. ^If the mode option is +** set to "memory" then a pure [in-memory database] that never reads +** or writes from disk is used. ^It is an error to specify a value for +** the mode parameter that is less restrictive than that specified by +** the flags passed in the third parameter to sqlite3_open_v2(). +** +**
    • cache: ^The cache parameter may be set to either "shared" or +** "private". ^Setting it to "shared" is equivalent to setting the +** SQLITE_OPEN_SHAREDCACHE bit in the flags argument passed to +** sqlite3_open_v2(). ^Setting the cache parameter to "private" is +** equivalent to setting the SQLITE_OPEN_PRIVATECACHE bit. +** ^If sqlite3_open_v2() is used and the "cache" parameter is present in +** a URI filename, its value overrides any behavior requested by setting +** SQLITE_OPEN_PRIVATECACHE or SQLITE_OPEN_SHAREDCACHE flag. +** +**
    • psow: ^The psow parameter indicates whether or not the +** [powersafe overwrite] property does or does not apply to the +** storage media on which the database file resides. +** +**
    • nolock: ^The nolock parameter is a boolean query parameter +** which if set disables file locking in rollback journal modes. This +** is useful for accessing a database on a filesystem that does not +** support locking. Caution: Database corruption might result if two +** or more processes write to the same database and any one of those +** processes uses nolock=1. +** +**
    • immutable: ^The immutable parameter is a boolean query +** parameter that indicates that the database file is stored on +** read-only media. ^When immutable is set, SQLite assumes that the +** database file cannot be changed, even by a process with higher +** privilege, and so the database is opened read-only and all locking +** and change detection is disabled. Caution: Setting the immutable +** property on a database file that does in fact change can result +** in incorrect query results and/or [SQLITE_CORRUPT] errors. +** See also: [SQLITE_IOCAP_IMMUTABLE]. +** +**
    +** +** ^Specifying an unknown parameter in the query component of a URI is not an +** error. Future versions of SQLite might understand additional query +** parameters. See "[query parameters with special meaning to SQLite]" for +** additional information. +** +** [[URI filename examples]]

    URI filename examples

    +** +** +**
    URI filenames Results +**
    file:data.db +** Open the file "data.db" in the current directory. +**
    file:/home/fred/data.db
    +** file:///home/fred/data.db
    +** file://localhost/home/fred/data.db
    +** Open the database file "/home/fred/data.db". +**
    file://darkstar/home/fred/data.db +** An error. "darkstar" is not a recognized authority. +**
    +** file:///C:/Documents%20and%20Settings/fred/Desktop/data.db +** Windows only: Open the file "data.db" on fred's desktop on drive +** C:. Note that the %20 escaping in this example is not strictly +** necessary - space characters can be used literally +** in URI filenames. +**
    file:data.db?mode=ro&cache=private +** Open file "data.db" in the current directory for read-only access. +** Regardless of whether or not shared-cache mode is enabled by +** default, use a private cache. +**
    file:/home/fred/data.db?vfs=unix-dotfile +** Open file "/home/fred/data.db". Use the special VFS "unix-dotfile" +** that uses dot-files in place of posix advisory locking. +**
    file:data.db?mode=readonly +** An error. "readonly" is not a valid option for the "mode" parameter. +**
    +** +** ^URI hexadecimal escape sequences (%HH) are supported within the path and +** query components of a URI. A hexadecimal escape sequence consists of a +** percent sign - "%" - followed by exactly two hexadecimal digits +** specifying an octet value. ^Before the path or query components of a +** URI filename are interpreted, they are encoded using UTF-8 and all +** hexadecimal escape sequences replaced by a single byte containing the +** corresponding octet. If this process generates an invalid UTF-8 encoding, +** the results are undefined. +** +** Note to Windows users: The encoding used for the filename argument +** of sqlite3_open() and sqlite3_open_v2() must be UTF-8, not whatever +** codepage is currently defined. Filenames containing international +** characters must be converted to UTF-8 prior to passing them into +** sqlite3_open() or sqlite3_open_v2(). +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling sqlite3_open() or sqlite3_open_v2(). Otherwise, various +** features that require the use of temporary files may fail. +** +** See also: [sqlite3_temp_directory] +*/ +SQLITE_API int sqlite3_open( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open16( + const void *filename, /* Database filename (UTF-16) */ + sqlite3 **ppDb /* OUT: SQLite db handle */ +); +SQLITE_API int sqlite3_open_v2( + const char *filename, /* Database filename (UTF-8) */ + sqlite3 **ppDb, /* OUT: SQLite db handle */ + int flags, /* Flags */ + const char *zVfs /* Name of VFS module to use */ +); + +/* +** CAPI3REF: Obtain Values For URI Parameters +** +** These are utility routines, useful to VFS implementations, that check +** to see if a database file was a URI that contained a specific query +** parameter, and if so obtains the value of that query parameter. +** +** If F is the database filename pointer passed into the xOpen() method of +** a VFS implementation when the flags parameter to xOpen() has one or +** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and +** P is the name of the query parameter, then +** sqlite3_uri_parameter(F,P) returns the value of the P +** parameter if it exists or a NULL pointer if P does not appear as a +** query parameter on F. If P is a query parameter of F +** has no explicit value, then sqlite3_uri_parameter(F,P) returns +** a pointer to an empty string. +** +** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean +** parameter and returns true (1) or false (0) according to the value +** of P. The sqlite3_uri_boolean(F,P,B) routine returns true (1) if the +** value of query parameter P is one of "yes", "true", or "on" in any +** case or if the value begins with a non-zero number. The +** sqlite3_uri_boolean(F,P,B) routines returns false (0) if the value of +** query parameter P is one of "no", "false", or "off" in any case or +** if the value begins with a numeric zero. If P is not a query +** parameter on F or if the value of P is does not match any of the +** above, then sqlite3_uri_boolean(F,P,B) returns (B!=0). +** +** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a +** 64-bit signed integer and returns that integer, or D if P does not +** exist. If the value of P is something other than an integer, then +** zero is returned. +** +** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and +** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and +** is not a database file pathname pointer that SQLite passed into the xOpen +** VFS method, then the behavior of this routine is undefined and probably +** undesirable. +*/ +SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); +SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); +SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); + + +/* +** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 +** +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** If the most recent API call was successful, +** then the return value from sqlite3_errcode() is undefined. +** ^The sqlite3_extended_errcode() +** interface is the same except that it always returns the +** [extended result code] even when extended result codes are +** disabled. +** +** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language +** text that describes the error, as either UTF-8 or UTF-16 respectively. +** ^(Memory to hold the error message string is managed internally. +** The application does not need to worry about freeing the result. +** However, the error string might be overwritten or deallocated by +** subsequent calls to other SQLite interface functions.)^ +** +** ^The sqlite3_errstr() interface returns the English-language text +** that describes the [result code], as UTF-8. +** ^(Memory to hold the error message string is managed internally +** and must not be freed by the application)^. +** +** When the serialized [threading mode] is in use, it might be the +** case that a second error occurs on a separate thread in between +** the time of the first error and the call to these interfaces. +** When that happens, the second error will be reported since these +** interfaces always report the most recent result. To avoid +** this, each thread can obtain exclusive use of the [database connection] D +** by invoking [sqlite3_mutex_enter]([sqlite3_db_mutex](D)) before beginning +** to use D and invoking [sqlite3_mutex_leave]([sqlite3_db_mutex](D)) after +** all calls to the interfaces listed here are completed. +** +** If an interface fails with SQLITE_MISUSE, that means the interface +** was invoked incorrectly by the application. In that case, the +** error code and message may or may not be set. +*/ +SQLITE_API int sqlite3_errcode(sqlite3 *db); +SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); +SQLITE_API const char *sqlite3_errmsg(sqlite3*); +SQLITE_API const void *sqlite3_errmsg16(sqlite3*); +SQLITE_API const char *sqlite3_errstr(int); + +/* +** CAPI3REF: Prepared Statement Object +** KEYWORDS: {prepared statement} {prepared statements} +** +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. +** +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: +** +**
      +**
    1. Create the prepared statement object using [sqlite3_prepare_v2()]. +**
    2. Bind values to [parameters] using the sqlite3_bind_*() +** interfaces. +**
    3. Run the SQL by calling [sqlite3_step()] one or more times. +**
    4. Reset the prepared statement using [sqlite3_reset()] then go back +** to step 2. Do this zero or more times. +**
    5. Destroy the object using [sqlite3_finalize()]. +**
    +*/ +typedef struct sqlite3_stmt sqlite3_stmt; + +/* +** CAPI3REF: Run-time Limits +** METHOD: sqlite3 +** +** ^(This interface allows the size of various constructs to be limited +** on a connection by connection basis. The first parameter is the +** [database connection] whose limit is to be set or queried. The +** second parameter is one of the [limit categories] that define a +** class of constructs to be size limited. The third parameter is the +** new limit for that construct.)^ +** +** ^If the new limit is a negative number, the limit is unchanged. +** ^(For each limit category SQLITE_LIMIT_NAME there is a +** [limits | hard upper bound] +** set at compile-time by a C preprocessor macro called +** [limits | SQLITE_MAX_NAME]. +** (The "_LIMIT_" in the name is changed to "_MAX_".))^ +** ^Attempts to increase a limit above its hard upper bound are +** silently truncated to the hard upper bound. +** +** ^Regardless of whether or not the limit was changed, the +** [sqlite3_limit()] interface returns the prior value of the limit. +** ^Hence, to find the current value of a limit without changing it, +** simply invoke this interface with the third parameter set to -1. +** +** Run-time limits are intended for use in applications that manage +** both their own internal database and also databases that are controlled +** by untrusted external sources. An example application might be a +** web browser that has its own databases for storing history and +** separate databases controlled by JavaScript applications downloaded +** off the Internet. The internal databases can be given the +** large, default limits. Databases managed by external sources can +** be given much smaller limits designed to prevent a denial of service +** attack. Developers might also want to use the [sqlite3_set_authorizer()] +** interface to further control untrusted SQL. The size of the database +** created by an untrusted script can be contained using the +** [max_page_count] [PRAGMA]. +** +** New run-time limit categories may be added in future releases. +*/ +SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); + +/* +** CAPI3REF: Run-Time Limit Categories +** KEYWORDS: {limit category} {*limit categories} +** +** These constants define various performance limits +** that can be lowered at run-time using [sqlite3_limit()]. +** The synopsis of the meanings of the various limits is shown below. +** Additional information is available at [limits | Limits in SQLite]. +** +**
    +** [[SQLITE_LIMIT_LENGTH]] ^(
    SQLITE_LIMIT_LENGTH
    +**
    The maximum size of any string or BLOB or table row, in bytes.
    )^ +** +** [[SQLITE_LIMIT_SQL_LENGTH]] ^(
    SQLITE_LIMIT_SQL_LENGTH
    +**
    The maximum length of an SQL statement, in bytes.
    )^ +** +** [[SQLITE_LIMIT_COLUMN]] ^(
    SQLITE_LIMIT_COLUMN
    +**
    The maximum number of columns in a table definition or in the +** result set of a [SELECT] or the maximum number of columns in an index +** or in an ORDER BY or GROUP BY clause.
    )^ +** +** [[SQLITE_LIMIT_EXPR_DEPTH]] ^(
    SQLITE_LIMIT_EXPR_DEPTH
    +**
    The maximum depth of the parse tree on any expression.
    )^ +** +** [[SQLITE_LIMIT_COMPOUND_SELECT]] ^(
    SQLITE_LIMIT_COMPOUND_SELECT
    +**
    The maximum number of terms in a compound SELECT statement.
    )^ +** +** [[SQLITE_LIMIT_VDBE_OP]] ^(
    SQLITE_LIMIT_VDBE_OP
    +**
    The maximum number of instructions in a virtual machine program +** used to implement an SQL statement. This limit is not currently +** enforced, though that might be added in some future release of +** SQLite.
    )^ +** +** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(
    SQLITE_LIMIT_FUNCTION_ARG
    +**
    The maximum number of arguments on a function.
    )^ +** +** [[SQLITE_LIMIT_ATTACHED]] ^(
    SQLITE_LIMIT_ATTACHED
    +**
    The maximum number of [ATTACH | attached databases].)^
    +** +** [[SQLITE_LIMIT_LIKE_PATTERN_LENGTH]] +** ^(
    SQLITE_LIMIT_LIKE_PATTERN_LENGTH
    +**
    The maximum length of the pattern argument to the [LIKE] or +** [GLOB] operators.
    )^ +** +** [[SQLITE_LIMIT_VARIABLE_NUMBER]] +** ^(
    SQLITE_LIMIT_VARIABLE_NUMBER
    +**
    The maximum index number of any [parameter] in an SQL statement.)^ +** +** [[SQLITE_LIMIT_TRIGGER_DEPTH]] ^(
    SQLITE_LIMIT_TRIGGER_DEPTH
    +**
    The maximum depth of recursion for triggers.
    )^ +** +** [[SQLITE_LIMIT_WORKER_THREADS]] ^(
    SQLITE_LIMIT_WORKER_THREADS
    +**
    The maximum number of auxiliary worker threads that a single +** [prepared statement] may start.
    )^ +**
    +*/ +#define SQLITE_LIMIT_LENGTH 0 +#define SQLITE_LIMIT_SQL_LENGTH 1 +#define SQLITE_LIMIT_COLUMN 2 +#define SQLITE_LIMIT_EXPR_DEPTH 3 +#define SQLITE_LIMIT_COMPOUND_SELECT 4 +#define SQLITE_LIMIT_VDBE_OP 5 +#define SQLITE_LIMIT_FUNCTION_ARG 6 +#define SQLITE_LIMIT_ATTACHED 7 +#define SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8 +#define SQLITE_LIMIT_VARIABLE_NUMBER 9 +#define SQLITE_LIMIT_TRIGGER_DEPTH 10 +#define SQLITE_LIMIT_WORKER_THREADS 11 + +/* +** CAPI3REF: Compiling An SQL Statement +** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt +** +** To execute an SQL query, it must first be compiled into a byte-code +** program using one of these routines. +** +** The first argument, "db", is a [database connection] obtained from a +** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or +** [sqlite3_open16()]. The database connection must not have been closed. +** +** The second argument, "zSql", is the statement to be compiled, encoded +** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() +** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() +** use UTF-16. +** +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string including +** the nul-terminator. +** +** ^If pzTail is not NULL then *pzTail is made to point to the first byte +** past the end of the first SQL statement in zSql. These routines only +** compile the first statement in zSql, so *pzTail is left pointing to +** what remains uncompiled. +** +** ^*ppStmt is left pointing to a compiled [prepared statement] that can be +** executed using [sqlite3_step()]. ^If there is an error, *ppStmt is set +** to NULL. ^If the input text contains no SQL (if the input is an empty +** string or a comment) then *ppStmt is set to NULL. +** The calling procedure is responsible for deleting the compiled +** SQL statement using [sqlite3_finalize()] after it has finished with it. +** ppStmt may not be NULL. +** +** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; +** otherwise an [error code] is returned. +** +** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are +** recommended for all new programs. The two older interfaces are retained +** for backwards compatibility, but their use is discouraged. +** ^In the "v2" interfaces, the prepared statement +** that is returned (the [sqlite3_stmt] object) contains a copy of the +** original SQL text. This causes the [sqlite3_step()] interface to +** behave differently in three ways: +** +**
      +**
    1. +** ^If the database schema changes, instead of returning [SQLITE_SCHEMA] as it +** always used to do, [sqlite3_step()] will automatically recompile the SQL +** statement and try to run it again. As many as [SQLITE_MAX_SCHEMA_RETRY] +** retries will occur before sqlite3_step() gives up and returns an error. +**
    2. +** +**
    3. +** ^When an error occurs, [sqlite3_step()] will return one of the detailed +** [error codes] or [extended error codes]. ^The legacy behavior was that +** [sqlite3_step()] would only return a generic [SQLITE_ERROR] result code +** and the application would have to make a second call to [sqlite3_reset()] +** in order to find the underlying cause of the problem. With the "v2" prepare +** interfaces, the underlying reason for the error is returned immediately. +**
    4. +** +**
    5. +** ^If the specific value bound to [parameter | host parameter] in the +** WHERE clause might influence the choice of query plan for a statement, +** then the statement will be automatically recompiled, as if there had been +** a schema change, on the first [sqlite3_step()] call following any change +** to the [sqlite3_bind_text | bindings] of that [parameter]. +** ^The specific value of WHERE-clause [parameter] might influence the +** choice of query plan if the parameter is the left-hand side of a [LIKE] +** or [GLOB] operator or if the parameter is compared to an indexed column +** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. +**
    6. +**
    +*/ +SQLITE_API int sqlite3_prepare( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare_v2( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); +SQLITE_API int sqlite3_prepare16_v2( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); + +/* +** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt +** +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The string returned by sqlite3_sql(P) is managed by SQLite and is +** automatically freed when the prepared statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be free by the application +** by passing it to [sqlite3_free()]. +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if +** and only if the [prepared statement] X makes no direct changes to +** the content of the database file. +** +** Note that [application-defined SQL functions] or +** [virtual tables] might change the database indirectly as a side effect. +** ^(For example, if an application defines a function "eval()" that +** calls [sqlite3_exec()], then the following SQL statement would +** change the database file through side-effects: +** +**
    +**    SELECT eval('DELETE FROM t1') FROM t2;
    +** 
    +** +** But because the [SELECT] statement does not change the database file +** directly, sqlite3_stmt_readonly() would still return true.)^ +** +** ^Transaction control statements such as [BEGIN], [COMMIT], [ROLLBACK], +** [SAVEPOINT], and [RELEASE] cause sqlite3_stmt_readonly() to return true, +** since the statements themselves do not actually modify the database but +** rather they control the timing of when other statements modify the +** database. ^The [ATTACH] and [DETACH] statements also cause +** sqlite3_stmt_readonly() to return true since, while those statements +** change the configuration of a database connection, they do not make +** changes to the content of the database files on disk. +*/ +SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt +** +** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the +** [prepared statement] S has been stepped at least once using +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor +** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) +** interface returns false if S is a NULL pointer. If S is not a +** NULL pointer and is not a pointer to a valid [prepared statement] +** object, then the behavior is undefined and probably undesirable. +** +** This interface can be used in combination [sqlite3_next_stmt()] +** to locate all prepared statements associated with a database +** connection that are in need of being reset. This can be used, +** for example, in diagnostic routines to search for prepared +** statements that are holding a transaction open. +*/ +SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); + +/* +** CAPI3REF: Dynamically Typed Value Object +** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} +** +** SQLite uses the sqlite3_value object to represent all values +** that can be stored in a database table. SQLite uses dynamic typing +** for the values it stores. ^Values stored in sqlite3_value objects +** can be integers, floating point values, strings, BLOBs, or NULL. +** +** An sqlite3_value object may be either "protected" or "unprotected". +** Some interfaces require a protected sqlite3_value. Other interfaces +** will accept either a protected or an unprotected sqlite3_value. +** Every interface that accepts sqlite3_value arguments specifies +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. +** +** The terms "protected" and "unprotected" refer to whether or not +** a mutex is held. An internal mutex is held for a protected +** sqlite3_value object but no mutex is held for an unprotected +** sqlite3_value object. If SQLite is compiled to be single-threaded +** (with [SQLITE_THREADSAFE=0] and with [sqlite3_threadsafe()] returning 0) +** or if SQLite is run in one of reduced mutex modes +** [SQLITE_CONFIG_SINGLETHREAD] or [SQLITE_CONFIG_MULTITHREAD] +** then there is no distinction between protected and unprotected +** sqlite3_value objects and they can be used interchangeably. However, +** for maximum code portability it is recommended that applications +** still make the distinction between protected and unprotected +** sqlite3_value objects even when not strictly required. +** +** ^The sqlite3_value objects that are passed as parameters into the +** implementation of [application-defined SQL functions] are protected. +** ^The sqlite3_value object returned by +** [sqlite3_column_value()] is unprotected. +** Unprotected sqlite3_value objects may only be used with +** [sqlite3_result_value()] and [sqlite3_bind_value()]. +** The [sqlite3_value_blob | sqlite3_value_type()] family of +** interfaces require protected sqlite3_value objects. +*/ +typedef struct Mem sqlite3_value; + +/* +** CAPI3REF: SQL Function Context Object +** +** The context in which an SQL function executes is stored in an +** sqlite3_context object. ^A pointer to an sqlite3_context object +** is always first parameter to [application-defined SQL functions]. +** The application-defined SQL function implementation will pass this +** pointer through into calls to [sqlite3_result_int | sqlite3_result()], +** [sqlite3_aggregate_context()], [sqlite3_user_data()], +** [sqlite3_context_db_handle()], [sqlite3_get_auxdata()], +** and/or [sqlite3_set_auxdata()]. +*/ +typedef struct sqlite3_context sqlite3_context; + +/* +** CAPI3REF: Binding Values To Prepared Statements +** KEYWORDS: {host parameter} {host parameters} {host parameter name} +** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt +** +** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, +** literals may be replaced by a [parameter] that matches one of following +** templates: +** +**
      +**
    • ? +**
    • ?NNN +**
    • :VVV +**
    • @VVV +**
    • $VVV +**
    +** +** In the templates above, NNN represents an integer literal, +** and VVV represents an alphanumeric identifier.)^ ^The values of these +** parameters (also called "host parameter names" or "SQL parameters") +** can be set using the sqlite3_bind_*() routines defined here. +** +** ^The first argument to the sqlite3_bind_*() routines is always +** a pointer to the [sqlite3_stmt] object returned from +** [sqlite3_prepare_v2()] or its variants. +** +** ^The second argument is the index of the SQL parameter to be set. +** ^The leftmost SQL parameter has an index of 1. ^When the same named +** SQL parameter is used more than once, second and subsequent +** occurrences have the same index as the first occurrence. +** ^The index for named parameters can be looked up using the +** [sqlite3_bind_parameter_index()] API if desired. ^The index +** for "?NNN" parameters is the value of NNN. +** ^The NNN value must be between 1 and the [sqlite3_limit()] +** parameter [SQLITE_LIMIT_VARIABLE_NUMBER] (default value: 999). +** +** ^The third argument is the value to bind to the parameter. +** ^If the third parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** or sqlite3_bind_blob() is a NULL pointer then the fourth parameter +** is ignored and the end result is the same as sqlite3_bind_null(). +** +** ^(In those routines that have a fourth argument, its value is the +** number of bytes in the parameter. To be clear: the value is the +** number of bytes in the value, not the number of characters.)^ +** ^If the fourth parameter to sqlite3_bind_text() or sqlite3_bind_text16() +** is negative, then the length of the string is +** the number of bytes up to the first zero terminator. +** If the fourth parameter to sqlite3_bind_blob() is negative, then +** the behavior is undefined. +** If a non-negative fourth parameter is provided to sqlite3_bind_text() +** or sqlite3_bind_text16() or sqlite3_bind_text64() then +** that parameter must be the byte offset +** where the NUL terminator would occur assuming the string were NUL +** terminated. If any NUL characters occur at byte offsets less than +** the value of the fourth parameter then the resulting string value will +** contain embedded NULs. The result of expressions involving strings +** with embedded NULs is undefined. +** +** ^The fifth argument to the BLOB and string binding interfaces +** is a destructor used to dispose of the BLOB or +** string after SQLite has finished with it. ^The destructor is called +** to dispose of the BLOB or string even if the call to bind API fails. +** ^If the fifth argument is +** the special value [SQLITE_STATIC], then SQLite assumes that the +** information is in static, unmanaged space and does not need to be freed. +** ^If the fifth argument has the value [SQLITE_TRANSIENT], then +** SQLite makes its own private copy of the data immediately, before +** the sqlite3_bind_*() routine returns. +** +** ^The sixth argument to sqlite3_bind_text64() must be one of +** [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE] +** to specify the encoding of the text in the third parameter. If +** the sixth argument to sqlite3_bind_text64() is not one of the +** allowed values shown above, or if the text encoding is different +** from the encoding specified by the sixth parameter, then the behavior +** is undefined. +** +** ^The sqlite3_bind_zeroblob() routine binds a BLOB of length N that +** is filled with zeroes. ^A zeroblob uses a fixed amount of memory +** (just an integer to hold its size) while it is being processed. +** Zeroblobs are intended to serve as placeholders for BLOBs whose +** content is later written using +** [sqlite3_blob_open | incremental BLOB I/O] routines. +** ^A negative value for the zeroblob results in a zero-length BLOB. +** +** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer +** for the [prepared statement] or with a prepared statement for which +** [sqlite3_step()] has been called more recently than [sqlite3_reset()], +** then the call will return [SQLITE_MISUSE]. If any sqlite3_bind_() +** routine is passed a [prepared statement] that has been finalized, the +** result is undefined and probably harmful. +** +** ^Bindings are not cleared by the [sqlite3_reset()] routine. +** ^Unbound parameters are interpreted as NULL. +** +** ^The sqlite3_bind_* routines return [SQLITE_OK] on success or an +** [error code] if anything goes wrong. +** ^[SQLITE_TOOBIG] might be returned if the size of a string or BLOB +** exceeds limits imposed by [sqlite3_limit]([SQLITE_LIMIT_LENGTH]) or +** [SQLITE_MAX_LENGTH]. +** ^[SQLITE_RANGE] is returned if the parameter +** index is out of range. ^[SQLITE_NOMEM] is returned if malloc() fails. +** +** See also: [sqlite3_bind_parameter_count()], +** [sqlite3_bind_parameter_name()], and [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*)); +SQLITE_API int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64, + void(*)(void*)); +SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double); +SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int); +SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64); +SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int); +SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*)); +SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*)); +SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); + +/* +** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt +** +** ^This routine can be used to find the number of [SQL parameters] +** in a [prepared statement]. SQL parameters are tokens of the +** form "?", "?NNN", ":AAA", "$AAA", or "@AAA" that serve as +** placeholders for values that are [sqlite3_bind_blob | bound] +** to the parameters at a later time. +** +** ^(This routine actually returns the index of the largest (rightmost) +** parameter. For all forms except ?NNN, this will correspond to the +** number of unique parameters. If parameters of the ?NNN form are used, +** there may be gaps in the list.)^ +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_name()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); + +/* +** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt +** +** ^The sqlite3_bind_parameter_name(P,N) interface returns +** the name of the N-th [SQL parameter] in the [prepared statement] P. +** ^(SQL parameters of the form "?NNN" or ":AAA" or "@AAA" or "$AAA" +** have a name which is the string "?NNN" or ":AAA" or "@AAA" or "$AAA" +** respectively. +** In other words, the initial ":" or "$" or "@" or "?" +** is included as part of the name.)^ +** ^Parameters of the form "?" without a following integer have no name +** and are referred to as "nameless" or "anonymous parameters". +** +** ^The first host parameter has an index of 1, not 0. +** +** ^If the value N is out of range or if the N-th parameter is +** nameless, then NULL is returned. ^The returned string is +** always in UTF-8 encoding even if the named parameter was +** originally specified as UTF-16 in [sqlite3_prepare16()] or +** [sqlite3_prepare16_v2()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_index()]. +*/ +SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); + +/* +** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt +** +** ^Return the index of an SQL parameter given its name. ^The +** index value returned is suitable for use as the second +** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero +** is returned if no matching parameter is found. ^The parameter +** name must be given in UTF-8 even if the original statement +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. +** +** See also: [sqlite3_bind_blob|sqlite3_bind()], +** [sqlite3_bind_parameter_count()], and +** [sqlite3_bind_parameter_name()]. +*/ +SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); + +/* +** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset +** the [sqlite3_bind_blob | bindings] on a [prepared statement]. +** ^Use this routine to reset all host parameters to NULL. +*/ +SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); + +/* +** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt +** +** ^Return the number of columns in the result set returned by the +** [prepared statement]. ^This routine returns 0 if pStmt is an SQL +** statement that does not return data (for example an [UPDATE]). +** +** See also: [sqlite3_data_count()] +*/ +SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt +** +** ^These routines return the name assigned to a particular column +** in the result set of a [SELECT] statement. ^The sqlite3_column_name() +** interface returns a pointer to a zero-terminated UTF-8 string +** and sqlite3_column_name16() returns a pointer to a zero-terminated +** UTF-16 string. ^The first parameter is the [prepared statement] +** that implements the [SELECT] statement. ^The second parameter is the +** column number. ^The leftmost column is number 0. +** +** ^The returned string pointer is valid until either the [prepared statement] +** is destroyed by [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the next call to +** sqlite3_column_name() or sqlite3_column_name16() on the same column. +** +** ^If sqlite3_malloc() fails during the processing of either routine +** (for example during a conversion from UTF-8 to UTF-16) then a +** NULL pointer is returned. +** +** ^The name of a result column is the value of the "AS" clause for +** that column, if there is an AS clause. If there is no AS clause +** then the name of the column is unspecified and may change from +** one release of SQLite to the next. +*/ +SQLITE_API const char *sqlite3_column_name(sqlite3_stmt*, int N); +SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); + +/* +** CAPI3REF: Source Of Data In A Query Result +** METHOD: sqlite3_stmt +** +** ^These routines provide a means to determine the database, table, and +** table column that is the origin of a particular result column in +** [SELECT] statement. +** ^The name of the database or table or column can be returned as +** either a UTF-8 or UTF-16 string. ^The _database_ routines return +** the database name, the _table_ routines return the table name, and +** the origin_ routines return the column name. +** ^The returned string is valid until the [prepared statement] is destroyed +** using [sqlite3_finalize()] or until the statement is automatically +** reprepared by the first call to [sqlite3_step()] for a particular run +** or until the same information is requested +** again in a different encoding. +** +** ^The names returned are the original un-aliased names of the +** database, table, and column. +** +** ^The first argument to these interfaces is a [prepared statement]. +** ^These functions return information about the Nth result column returned by +** the statement, where N is the second function argument. +** ^The left-most column is column 0 for these routines. +** +** ^If the Nth column returned by the statement is an expression or +** subquery and is not a column value, then all of these functions return +** NULL. ^These routine might also return NULL if a memory allocation error +** occurs. ^Otherwise, they return the name of the attached database, table, +** or column that query result column was extracted from. +** +** ^As with all other SQLite APIs, those whose names end with "16" return +** UTF-16 encoded strings and the other functions return UTF-8. +** +** ^These APIs are only available if the library was compiled with the +** [SQLITE_ENABLE_COLUMN_METADATA] C-preprocessor symbol. +** +** If two or more threads call one or more of these routines against the same +** prepared statement and column at the same time then the results are +** undefined. +** +** If two or more threads call one or more +** [sqlite3_column_database_name | column metadata interfaces] +** for the same [prepared statement] and result column +** at the same time then the results are undefined. +*/ +SQLITE_API const char *sqlite3_column_database_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_database_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_table_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_table_name16(sqlite3_stmt*,int); +SQLITE_API const char *sqlite3_column_origin_name(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Declared Datatype Of A Query Result +** METHOD: sqlite3_stmt +** +** ^(The first parameter is a [prepared statement]. +** If this statement is a [SELECT] statement and the Nth column of the +** returned result set of that [SELECT] is a table column (not an +** expression or subquery) then the declared type of the table +** column is returned.)^ ^If the Nth column of the result set is an +** expression or subquery, then a NULL pointer is returned. +** ^The returned string is always UTF-8 encoded. +** +** ^(For example, given the database schema: +** +** CREATE TABLE t1(c1 VARIANT); +** +** and the following statement to be compiled: +** +** SELECT c1 + 1, c1 FROM t1; +** +** this routine would return the string "VARIANT" for the second result +** column (i==1), and a NULL pointer for the first result column (i==0).)^ +** +** ^SQLite uses dynamic run-time typing. ^So just because a column +** is declared to contain a particular type does not mean that the +** data stored in that column is of the declared type. SQLite is +** strongly typed, but the typing is dynamic not static. ^Type +** is associated with individual values, not with the containers +** used to hold those values. +*/ +SQLITE_API const char *sqlite3_column_decltype(sqlite3_stmt*,int); +SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); + +/* +** CAPI3REF: Evaluate An SQL Statement +** METHOD: sqlite3_stmt +** +** After a [prepared statement] has been prepared using either +** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy +** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function +** must be called one or more times to evaluate the statement. +** +** The details of the behavior of the sqlite3_step() interface depend +** on whether the statement was prepared using the newer "v2" interface +** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy +** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "v2" interface is recommended for new applications but the legacy +** interface will continue to be supported. +** +** ^In the legacy interface, the return value will be either [SQLITE_BUSY], +** [SQLITE_DONE], [SQLITE_ROW], [SQLITE_ERROR], or [SQLITE_MISUSE]. +** ^With the "v2" interface, any of the other [result codes] or +** [extended result codes] might be returned as well. +** +** ^[SQLITE_BUSY] means that the database engine was unable to acquire the +** database locks it needs to do its job. ^If the statement is a [COMMIT] +** or occurs outside of an explicit transaction, then you can retry the +** statement. If the statement is not a [COMMIT] and occurs within an +** explicit transaction then you should rollback the transaction before +** continuing. +** +** ^[SQLITE_DONE] means that the statement has finished executing +** successfully. sqlite3_step() should not be called again on this virtual +** machine without first calling [sqlite3_reset()] to reset the virtual +** machine back to its initial state. +** +** ^If the SQL statement being executed returns any data, then [SQLITE_ROW] +** is returned each time a new row of data is ready for processing by the +** caller. The values may be accessed using the [column access functions]. +** sqlite3_step() is called again to retrieve the next row of data. +** +** ^[SQLITE_ERROR] means that a run-time error (such as a constraint +** violation) has occurred. sqlite3_step() should not be called again on +** the VM. More information may be found by calling [sqlite3_errmsg()]. +** ^With the legacy interface, a more specific error code (for example, +** [SQLITE_INTERRUPT], [SQLITE_SCHEMA], [SQLITE_CORRUPT], and so forth) +** can be obtained by calling [sqlite3_reset()] on the +** [prepared statement]. ^In the "v2" interface, +** the more specific error code is returned directly by sqlite3_step(). +** +** [SQLITE_MISUSE] means that the this routine was called inappropriately. +** Perhaps it was called on a [prepared statement] that has +** already been [sqlite3_finalize | finalized] or on one that had +** previously returned [SQLITE_ERROR] or [SQLITE_DONE]. Or it could +** be the case that the same database connection is being used by two or +** more threads at the same moment in time. +** +** For all versions of SQLite up to and including 3.6.23.1, a call to +** [sqlite3_reset()] was required after sqlite3_step() returned anything +** other than [SQLITE_ROW] before any subsequent invocation of +** sqlite3_step(). Failure to reset the prepared statement using +** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began +** calling [sqlite3_reset()] automatically in this circumstance rather +** than returning [SQLITE_MISUSE]. This is not considered a compatibility +** break because any application that ever receives an SQLITE_MISUSE error +** is broken by definition. The [SQLITE_OMIT_AUTORESET] compile-time option +** can be used to restore the legacy behavior. +** +** Goofy Interface Alert: In the legacy interface, the sqlite3_step() +** API always returns a generic error code, [SQLITE_ERROR], following any +** error other than [SQLITE_BUSY] and [SQLITE_MISUSE]. You must call +** [sqlite3_reset()] or [sqlite3_finalize()] in order to find one of the +** specific [error codes] that better describes the error. +** We admit that this is a goofy design. The problem has been fixed +** with the "v2" interface. If you prepare all of your SQL statements +** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, +** then the more specific [error codes] are returned directly +** by sqlite3_step(). The use of the "v2" interface is recommended. +*/ +SQLITE_API int sqlite3_step(sqlite3_stmt*); + +/* +** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt +** +** ^The sqlite3_data_count(P) interface returns the number of columns in the +** current row of the result set of [prepared statement] P. +** ^If prepared statement P does not have results ready to return +** (via calls to the [sqlite3_column_int | sqlite3_column_*()] of +** interfaces) then sqlite3_data_count(P) returns 0. +** ^The sqlite3_data_count(P) routine also returns 0 if P is a NULL pointer. +** ^The sqlite3_data_count(P) routine returns 0 if the previous call to +** [sqlite3_step](P) returned [SQLITE_DONE]. ^The sqlite3_data_count(P) +** will return non-zero if previous call to [sqlite3_step](P) returned +** [SQLITE_ROW], except in the case of the [PRAGMA incremental_vacuum] +** where it always returns zero since each step of that multi-step +** pragma returns 0 columns of data. +** +** See also: [sqlite3_column_count()] +*/ +SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Fundamental Datatypes +** KEYWORDS: SQLITE_TEXT +** +** ^(Every value in SQLite has one of five fundamental datatypes: +** +**
      +**
    • 64-bit signed integer +**
    • 64-bit IEEE floating point number +**
    • string +**
    • BLOB +**
    • NULL +**
    )^ +** +** These constants are codes for each of those types. +** +** Note that the SQLITE_TEXT constant was also used in SQLite version 2 +** for a completely different meaning. Software that links against both +** SQLite version 2 and SQLite version 3 should use SQLITE3_TEXT, not +** SQLITE_TEXT. +*/ +#define SQLITE_INTEGER 1 +#define SQLITE_FLOAT 2 +#define SQLITE_BLOB 4 +#define SQLITE_NULL 5 +#ifdef SQLITE_TEXT +# undef SQLITE_TEXT +#else +# define SQLITE_TEXT 3 +#endif +#define SQLITE3_TEXT 3 + +/* +** CAPI3REF: Result Values From A Query +** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt +** +** ^These routines return information about a single column of the current +** result row of a query. ^In every case the first argument is a pointer +** to the [prepared statement] that is being evaluated (the [sqlite3_stmt*] +** that was returned from [sqlite3_prepare_v2()] or one of its variants) +** and the second argument is the index of the column for which information +** should be returned. ^The leftmost column of the result set has the index 0. +** ^The number of columns in the result can be determined using +** [sqlite3_column_count()]. +** +** If the SQL statement does not currently point to a valid row, or if the +** column index is out of range, the result is undefined. +** These routines may only be called when the most recent call to +** [sqlite3_step()] has returned [SQLITE_ROW] and neither +** [sqlite3_reset()] nor [sqlite3_finalize()] have been called subsequently. +** If any of these routines are called after [sqlite3_reset()] or +** [sqlite3_finalize()] or after [sqlite3_step()] has returned +** something other than [SQLITE_ROW], the results are undefined. +** If [sqlite3_step()] or [sqlite3_reset()] or [sqlite3_finalize()] +** are called from a different thread while any of these routines +** are pending, then the results are undefined. +** +** ^The sqlite3_column_type() routine returns the +** [SQLITE_INTEGER | datatype code] for the initial data type +** of the result column. ^The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value +** returned by sqlite3_column_type() is only meaningful if no type +** conversions have occurred as described below. After a type conversion, +** the value returned by sqlite3_column_type() is undefined. Future +** versions of SQLite may change the behavior of sqlite3_column_type() +** following a type conversion. +** +** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts +** the string to UTF-8 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes() uses +** [sqlite3_snprintf()] to convert that value to a UTF-8 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes() returns zero. +** +** ^If the result is a BLOB or UTF-16 string then the sqlite3_column_bytes16() +** routine returns the number of bytes in that BLOB or string. +** ^If the result is a UTF-8 string, then sqlite3_column_bytes16() converts +** the string to UTF-16 and then returns the number of bytes. +** ^If the result is a numeric value then sqlite3_column_bytes16() uses +** [sqlite3_snprintf()] to convert that value to a UTF-16 string and returns +** the number of bytes in that string. +** ^If the result is NULL, then sqlite3_column_bytes16() returns zero. +** +** ^The values returned by [sqlite3_column_bytes()] and +** [sqlite3_column_bytes16()] do not include the zero terminators at the end +** of the string. ^For clarity: the values returned by +** [sqlite3_column_bytes()] and [sqlite3_column_bytes16()] are the number of +** bytes in the string, not the number of characters. +** +** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), +** even empty strings, are always zero-terminated. ^The return +** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. +** +** Warning: ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. +** If the [unprotected sqlite3_value] object returned by +** [sqlite3_column_value()] is used in any other way, including calls +** to routines like [sqlite3_value_int()], [sqlite3_value_text()], +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** +** These routines attempt to convert the value where appropriate. ^For +** example, if the internal representation is FLOAT and a text result +** is requested, [sqlite3_snprintf()] is used internally to perform the +** conversion automatically. ^(The following table details the conversions +** that are applied: +** +**
    +** +**
    Internal
    Type
    Requested
    Type
    Conversion +** +**
    NULL INTEGER Result is 0 +**
    NULL FLOAT Result is 0.0 +**
    NULL TEXT Result is a NULL pointer +**
    NULL BLOB Result is a NULL pointer +**
    INTEGER FLOAT Convert from integer to float +**
    INTEGER TEXT ASCII rendering of the integer +**
    INTEGER BLOB Same as INTEGER->TEXT +**
    FLOAT INTEGER [CAST] to INTEGER +**
    FLOAT TEXT ASCII rendering of the float +**
    FLOAT BLOB [CAST] to BLOB +**
    TEXT INTEGER [CAST] to INTEGER +**
    TEXT FLOAT [CAST] to REAL +**
    TEXT BLOB No change +**
    BLOB INTEGER [CAST] to INTEGER +**
    BLOB FLOAT [CAST] to REAL +**
    BLOB TEXT Add a zero terminator if needed +**
    +**
    )^ +** +** Note that when type conversions occur, pointers returned by prior +** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or +** sqlite3_column_text16() may be invalidated. +** Type conversions and pointer invalidations might occur +** in the following cases: +** +**
      +**
    • The initial content is a BLOB and sqlite3_column_text() or +** sqlite3_column_text16() is called. A zero-terminator might +** need to be added to the string.
    • +**
    • The initial content is UTF-8 text and sqlite3_column_bytes16() or +** sqlite3_column_text16() is called. The content must be converted +** to UTF-16.
    • +**
    • The initial content is UTF-16 text and sqlite3_column_bytes() or +** sqlite3_column_text() is called. The content must be converted +** to UTF-8.
    • +**
    +** +** ^Conversions between UTF-16be and UTF-16le are always done in place and do +** not invalidate a prior pointer, though of course the content of the buffer +** that the prior pointer references will have been modified. Other kinds +** of conversion are done in place when it is possible, but sometimes they +** are not possible and in those cases prior pointers are invalidated. +** +** The safest policy is to invoke these routines +** in one of the following ways: +** +**
      +**
    • sqlite3_column_text() followed by sqlite3_column_bytes()
    • +**
    • sqlite3_column_blob() followed by sqlite3_column_bytes()
    • +**
    • sqlite3_column_text16() followed by sqlite3_column_bytes16()
    • +**
    +** +** In other words, you should call sqlite3_column_text(), +** sqlite3_column_blob(), or sqlite3_column_text16() first to force the result +** into the desired format, then invoke sqlite3_column_bytes() or +** sqlite3_column_bytes16() to find the size of the result. Do not mix calls +** to sqlite3_column_text() or sqlite3_column_blob() with calls to +** sqlite3_column_bytes16(), and do not mix calls to sqlite3_column_text16() +** with calls to sqlite3_column_bytes(). +** +** ^The pointers returned are valid until a type conversion occurs as +** described above, or until [sqlite3_step()] or [sqlite3_reset()] or +** [sqlite3_finalize()] is called. ^The memory space used to hold strings +** and BLOBs is freed automatically. Do not pass the pointers returned +** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into +** [sqlite3_free()]. +** +** ^(If a memory allocation error occurs during the evaluation of any +** of these routines, a default value is returned. The default value +** is either the integer 0, the floating point number 0.0, or a NULL +** pointer. Subsequent calls to [sqlite3_errcode()] will return +** [SQLITE_NOMEM].)^ +*/ +SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); +SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); +SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); +SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); + +/* +** CAPI3REF: Destroy A Prepared Statement Object +** DESTRUCTOR: sqlite3_stmt +** +** ^The sqlite3_finalize() function is called to delete a [prepared statement]. +** ^If the most recent evaluation of the statement encountered no errors +** or if the statement is never been evaluated, then sqlite3_finalize() returns +** SQLITE_OK. ^If the most recent evaluation of statement S failed, then +** sqlite3_finalize(S) returns the appropriate [error code] or +** [extended error code]. +** +** ^The sqlite3_finalize(S) routine can be called at any point during +** the life cycle of [prepared statement] S: +** before statement S is ever evaluated, after +** one or more calls to [sqlite3_reset()], or after any call +** to [sqlite3_step()] regardless of whether or not the statement has +** completed execution. +** +** ^Invoking sqlite3_finalize() on a NULL pointer is a harmless no-op. +** +** The application must finalize every [prepared statement] in order to avoid +** resource leaks. It is a grievous error for the application to try to use +** a prepared statement after it has been finalized. Any use of a prepared +** statement after it has been finalized can result in undefined and +** undesirable behavior such as segfaults and heap corruption. +*/ +SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt +** +** The sqlite3_reset() function is called to reset a [prepared statement] +** object back to its initial state, ready to be re-executed. +** ^Any SQL statement variables that had values bound to them using +** the [sqlite3_bind_blob | sqlite3_bind_*() API] retain their values. +** Use [sqlite3_clear_bindings()] to reset the bindings. +** +** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S +** back to the beginning of its program. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S returned [SQLITE_ROW] or [SQLITE_DONE], +** or if [sqlite3_step(S)] has never before been called on S, +** then [sqlite3_reset(S)] returns [SQLITE_OK]. +** +** ^If the most recent call to [sqlite3_step(S)] for the +** [prepared statement] S indicated an error, then +** [sqlite3_reset(S)] returns an appropriate [error code]. +** +** ^The [sqlite3_reset(S)] interface does not change the values +** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S. +*/ +SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Create Or Redefine SQL Functions +** KEYWORDS: {function creation routines} +** KEYWORDS: {application-defined SQL function} +** KEYWORDS: {application-defined SQL functions} +** METHOD: sqlite3 +** +** ^These functions (collectively known as "function creation routines") +** are used to add SQL functions or aggregates or to redefine the behavior +** of existing SQL functions or aggregates. The only differences between +** these routines are the text encoding expected for +** the second parameter (the name of the function being created) +** and the presence or absence of a destructor callback for +** the application data pointer. +** +** ^The first parameter is the [database connection] to which the SQL +** function is to be added. ^If an application uses more than one database +** connection then application-defined SQL functions must be added +** to each database connection separately. +** +** ^The second parameter is the name of the SQL function to be created or +** redefined. ^The length of the name is limited to 255 bytes in a UTF-8 +** representation, exclusive of the zero-terminator. ^Note that the name +** length limit is in UTF-8 bytes, not characters nor UTF-16 bytes. +** ^Any attempt to create a function with a longer name +** will result in [SQLITE_MISUSE] being returned. +** +** ^The third parameter (nArg) +** is the number of arguments that the SQL function or +** aggregate takes. ^If this parameter is -1, then the SQL function or +** aggregate may take any number of arguments between 0 and the limit +** set by [sqlite3_limit]([SQLITE_LIMIT_FUNCTION_ARG]). If the third +** parameter is less than -1 or greater than 127 then the behavior is +** undefined. +** +** ^The fourth parameter, eTextRep, specifies what +** [SQLITE_UTF8 | text encoding] this SQL function prefers for +** its parameters. The application should set this parameter to +** [SQLITE_UTF16LE] if the function implementation invokes +** [sqlite3_value_text16le()] on an input, or [SQLITE_UTF16BE] if the +** implementation invokes [sqlite3_value_text16be()] on an input, or +** [SQLITE_UTF16] if [sqlite3_value_text16()] is used, or [SQLITE_UTF8] +** otherwise. ^The same SQL function may be registered multiple times using +** different preferred text encodings, with different implementations for +** each encoding. +** ^When multiple implementations of the same function are available, SQLite +** will pick the one that involves the least amount of data conversion. +** +** ^The fourth parameter may optionally be ORed with [SQLITE_DETERMINISTIC] +** to signal that the function will always return the same result given +** the same inputs within a single SQL statement. Most SQL functions are +** deterministic. The built-in [random()] SQL function is an example of a +** function that is not deterministic. The SQLite query planner is able to +** perform additional optimizations on deterministic functions, so use +** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. +** +** ^(The fifth parameter is an arbitrary pointer. The implementation of the +** function can gain access to this pointer using [sqlite3_user_data()].)^ +** +** ^The sixth, seventh and eighth parameters, xFunc, xStep and xFinal, are +** pointers to C-language functions that implement the SQL function or +** aggregate. ^A scalar SQL function requires an implementation of the xFunc +** callback only; NULL pointers must be passed as the xStep and xFinal +** parameters. ^An aggregate SQL function requires an implementation of xStep +** and xFinal and NULL pointer must be passed for xFunc. ^To delete an existing +** SQL function or aggregate, pass NULL pointers for all three function +** callbacks. +** +** ^(If the ninth parameter to sqlite3_create_function_v2() is not NULL, +** then it is destructor for the application data pointer. +** The destructor is invoked when the function is deleted, either by being +** overloaded or when the database connection closes.)^ +** ^The destructor is also invoked if the call to +** sqlite3_create_function_v2() fails. +** ^When the destructor callback of the tenth parameter is invoked, it +** is passed a single argument which is a copy of the application data +** pointer which was the fifth parameter to sqlite3_create_function_v2(). +** +** ^It is permitted to register multiple implementations of the same +** functions with the same name but with either differing numbers of +** arguments or differing preferred text encodings. ^SQLite will use +** the implementation that most closely matches the way in which the +** SQL function is used. ^A function implementation with a non-negative +** nArg parameter is a better match than a function implementation with +** a negative nArg. ^A function where the preferred text encoding +** matches the database encoding is a better +** match than a function where the encoding is different. +** ^A function where the encoding difference is between UTF16le and UTF16be +** is a closer match than a function where the encoding difference is +** between UTF8 and UTF16. +** +** ^Built-in functions may be overloaded by new application-defined functions. +** +** ^An application-defined function is permitted to call other +** SQLite interfaces. However, such calls must not +** close the database connection nor finalize or reset the prepared +** statement in which the function is running. +*/ +SQLITE_API int sqlite3_create_function( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function16( + sqlite3 *db, + const void *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*) +); +SQLITE_API int sqlite3_create_function_v2( + sqlite3 *db, + const char *zFunctionName, + int nArg, + int eTextRep, + void *pApp, + void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xStep)(sqlite3_context*,int,sqlite3_value**), + void (*xFinal)(sqlite3_context*), + void(*xDestroy)(void*) +); + +/* +** CAPI3REF: Text Encodings +** +** These constant define integer codes that represent the various +** text encodings supported by SQLite. +*/ +#define SQLITE_UTF8 1 /* IMP: R-37514-35566 */ +#define SQLITE_UTF16LE 2 /* IMP: R-03371-37637 */ +#define SQLITE_UTF16BE 3 /* IMP: R-51971-34154 */ +#define SQLITE_UTF16 4 /* Use native byte order */ +#define SQLITE_ANY 5 /* Deprecated */ +#define SQLITE_UTF16_ALIGNED 8 /* sqlite3_create_collation only */ + +/* +** CAPI3REF: Function Flags +** +** These constants may be ORed together with the +** [SQLITE_UTF8 | preferred text encoding] as the fourth argument +** to [sqlite3_create_function()], [sqlite3_create_function16()], or +** [sqlite3_create_function_v2()]. +*/ +#define SQLITE_DETERMINISTIC 0x800 + +/* +** CAPI3REF: Deprecated Functions +** DEPRECATED +** +** These functions are [deprecated]. In order to maintain +** backwards compatibility with older code, these functions continue +** to be supported. However, new applications should avoid +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. +*/ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_expired(sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_transfer_bindings(sqlite3_stmt*, sqlite3_stmt*); +SQLITE_API SQLITE_DEPRECATED int sqlite3_global_recover(void); +SQLITE_API SQLITE_DEPRECATED void sqlite3_thread_cleanup(void); +SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int64,int), + void*,sqlite3_int64); +#endif + +/* +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value +** +** The C-language implementation of SQL functions and aggregates uses +** this set of interface routines to access the parameter values on +** the function or aggregate. +** +** The xFunc (for scalar functions) or xStep (for aggregates) parameters +** to [sqlite3_create_function()] and [sqlite3_create_function16()] +** define callbacks that implement the SQL functions and aggregates. +** The 3rd parameter to these callbacks is an array of pointers to +** [protected sqlite3_value] objects. There is one [sqlite3_value] object for +** each parameter to the SQL function. These routines are used to +** extract values from the [sqlite3_value] objects. +** +** These routines work only with [protected sqlite3_value] objects. +** Any attempt to use these routines on an [unprotected sqlite3_value] +** object results in undefined behavior. +** +** ^These routines work just like the corresponding [column access functions] +** except that these routines take a single [protected sqlite3_value] object +** pointer instead of a [sqlite3_stmt*] pointer and an integer column number. +** +** ^The sqlite3_value_text16() interface extracts a UTF-16 string +** in the native byte-order of the host machine. ^The +** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces +** extract UTF-16 strings as big-endian and little-endian respectively. +** +** ^(The sqlite3_value_numeric_type() interface attempts to apply +** numeric affinity to the value. This means that an attempt is +** made to convert the value to an integer or floating point. If +** such a conversion is possible without loss of information (in other +** words, if the value is a string that looks like a number) +** then the conversion is performed. Otherwise no conversion occurs. +** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ +** +** Please pay particular attention to the fact that the pointer returned +** from [sqlite3_value_blob()], [sqlite3_value_text()], or +** [sqlite3_value_text16()] can be invalidated by a subsequent call to +** [sqlite3_value_bytes()], [sqlite3_value_bytes16()], [sqlite3_value_text()], +** or [sqlite3_value_text16()]. +** +** These routines must be called from the same thread as +** the SQL function that supplied the [sqlite3_value*] parameters. +*/ +SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); +SQLITE_API double sqlite3_value_double(sqlite3_value*); +SQLITE_API int sqlite3_value_int(sqlite3_value*); +SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); +SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_type(sqlite3_value*); +SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +** +** SQLite makes no use of subtype itself. It merely passes the subtype +** from the result of one [application-defined SQL function] into the +** input of another. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); + +/* +** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context +** +** Implementations of aggregate SQL functions use this +** routine to allocate memory for storing their state. +** +** ^The first time the sqlite3_aggregate_context(C,N) routine is called +** for a particular aggregate function, SQLite +** allocates N of memory, zeroes out that memory, and returns a pointer +** to the new memory. ^On second and subsequent calls to +** sqlite3_aggregate_context() for the same aggregate function instance, +** the same buffer is returned. Sqlite3_aggregate_context() is normally +** called once for each invocation of the xStep callback and then one +** last time when the xFinal callback is invoked. ^(When no rows match +** an aggregate query, the xStep() callback of the aggregate function +** implementation is never called and xFinal() is called exactly once. +** In those cases, sqlite3_aggregate_context() might be called for the +** first time from within xFinal().)^ +** +** ^The sqlite3_aggregate_context(C,N) routine returns a NULL pointer +** when first called if N is less than or equal to zero or if a memory +** allocate error occurs. +** +** ^(The amount of space allocated by sqlite3_aggregate_context(C,N) is +** determined by the N parameter on first successful call. Changing the +** value of N in subsequent call to sqlite3_aggregate_context() within +** the same aggregate function instance will not resize the memory +** allocation.)^ Within the xFinal callback, it is customary to set +** N=0 in calls to sqlite3_aggregate_context(C,N) so that no +** pointless memory allocations occur. +** +** ^SQLite automatically frees the memory allocated by +** sqlite3_aggregate_context() when the aggregate query concludes. +** +** The first parameter must be a copy of the +** [sqlite3_context | SQL function context] that is the first parameter +** to the xStep or xFinal callback routine that implements the aggregate +** function. +** +** This routine must be called from the same thread in which +** the aggregate SQL function is running. +*/ +SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); + +/* +** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context +** +** ^The sqlite3_user_data() interface returns a copy of +** the pointer that was the pUserData parameter (the 5th parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +** +** This routine must be called from the same thread in which +** the application-defined function is running. +*/ +SQLITE_API void *sqlite3_user_data(sqlite3_context*); + +/* +** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context +** +** ^The sqlite3_context_db_handle() interface returns a copy of +** the pointer to the [database connection] (the 1st parameter) +** of the [sqlite3_create_function()] +** and [sqlite3_create_function16()] routines that originally +** registered the application defined function. +*/ +SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); + +/* +** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context +** +** These functions may be used by (non-aggregate) SQL functions to +** associate metadata with argument values. If the same value is passed to +** multiple invocations of the same SQL function during query execution, under +** some circumstances the associated metadata may be preserved. An example +** of where this might be useful is in a regular-expression matching +** function. The compiled version of the regular expression can be stored as +** metadata associated with the pattern string. +** Then as long as the pattern string remains the same, +** the compiled regular expression can be reused on multiple +** invocations of the same function. +** +** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata() function with the Nth argument +** value to the application-defined function. ^If there is no metadata +** associated with the function argument, this sqlite3_get_auxdata() interface +** returns a NULL pointer. +** +** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th +** argument of the application-defined function. ^Subsequent +** calls to sqlite3_get_auxdata(C,N) return P from the most recent +** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or +** NULL if the metadata has been discarded. +** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, +** SQLite will invoke the destructor function X with parameter P exactly +** once, when the metadata is discarded. +** SQLite is free to discard the metadata at any time, including:
      +**
    • ^(when the corresponding function parameter changes)^, or +**
    • ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +**
    • ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +**
    • ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^
    +** +** Note the last bullet in particular. The destructor X in +** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the +** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata() +** should be called near the end of the function implementation and the +** function implementation should not make any use of P after +** sqlite3_set_auxdata() has been called. +** +** ^(In practice, metadata is preserved between function calls for +** function parameters that are compile-time constants, including literal +** values and [parameters] and expressions composed from the same.)^ +** +** These routines must be called from the same thread in which +** the SQL function is running. +*/ +SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); +SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); + + +/* +** CAPI3REF: Constants Defining Special Destructor Behavior +** +** These are special values for the destructor that is passed in as the +** final argument to routines like [sqlite3_result_blob()]. ^If the destructor +** argument is SQLITE_STATIC, it means that the content pointer is constant +** and will never change. It does not need to be destroyed. ^The +** SQLITE_TRANSIENT value means that the content will likely change in +** the near future and that SQLite should make its own private copy of +** the content before returning. +** +** The typedef is necessary to work around problems in certain +** C++ compilers. +*/ +typedef void (*sqlite3_destructor_type)(void*); +#define SQLITE_STATIC ((sqlite3_destructor_type)0) +#define SQLITE_TRANSIENT ((sqlite3_destructor_type)-1) + +/* +** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context +** +** These routines are used by the xFunc or xFinal callbacks that +** implement SQL functions and aggregates. See +** [sqlite3_create_function()] and [sqlite3_create_function16()] +** for additional information. +** +** These functions work very much like the [parameter binding] family of +** functions used to bind values to host parameters in prepared statements. +** Refer to the [SQL parameter] documentation for additional information. +** +** ^The sqlite3_result_blob() interface sets the result from +** an application-defined function to be the BLOB whose content is pointed +** to by the second parameter and which is N bytes long where N is the +** third parameter. +** +** ^The sqlite3_result_zeroblob(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. +** +** ^The sqlite3_result_double() interface sets the result from +** an application-defined function to be a floating point value specified +** by its 2nd argument. +** +** ^The sqlite3_result_error() and sqlite3_result_error16() functions +** cause the implemented SQL function to throw an exception. +** ^SQLite uses the string pointed to by the +** 2nd parameter of sqlite3_result_error() or sqlite3_result_error16() +** as the text of an error message. ^SQLite interprets the error +** message string from sqlite3_result_error() as UTF-8. ^SQLite +** interprets the string from sqlite3_result_error16() as UTF-16 in native +** byte order. ^If the third parameter to sqlite3_result_error() +** or sqlite3_result_error16() is negative then SQLite takes as the error +** message all text up through the first zero character. +** ^If the third parameter to sqlite3_result_error() or +** sqlite3_result_error16() is non-negative then SQLite takes that many +** bytes (not characters) from the 2nd parameter as the error message. +** ^The sqlite3_result_error() and sqlite3_result_error16() +** routines make a private copy of the error message text before +** they return. Hence, the calling function can deallocate or +** modify the text after they return without harm. +** ^The sqlite3_result_error_code() function changes the error code +** returned by SQLite as a result of an error in a function. ^By default, +** the error code is SQLITE_ERROR. ^A subsequent call to sqlite3_result_error() +** or sqlite3_result_error16() resets the error code to SQLITE_ERROR. +** +** ^The sqlite3_result_error_toobig() interface causes SQLite to throw an +** error indicating that a string or BLOB is too long to represent. +** +** ^The sqlite3_result_error_nomem() interface causes SQLite to throw an +** error indicating that a memory allocation failed. +** +** ^The sqlite3_result_int() interface sets the return value +** of the application-defined function to be the 32-bit signed integer +** value given in the 2nd argument. +** ^The sqlite3_result_int64() interface sets the return value +** of the application-defined function to be the 64-bit signed integer +** value given in the 2nd argument. +** +** ^The sqlite3_result_null() interface sets the return value +** of the application-defined function to be NULL. +** +** ^The sqlite3_result_text(), sqlite3_result_text16(), +** sqlite3_result_text16le(), and sqlite3_result_text16be() interfaces +** set the return value of the application-defined function to be +** a text string which is represented as UTF-8, UTF-16 native byte order, +** UTF-16 little endian, or UTF-16 big endian, respectively. +** ^The sqlite3_result_text64() interface sets the return value of an +** application-defined function to be a text string in an encoding +** specified by the fifth (and last) parameter, which must be one +** of [SQLITE_UTF8], [SQLITE_UTF16], [SQLITE_UTF16BE], or [SQLITE_UTF16LE]. +** ^SQLite takes the text result from the application from +** the 2nd parameter of the sqlite3_result_text* interfaces. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is negative, then SQLite takes result text from the 2nd parameter +** through the first zero character. +** ^If the 3rd parameter to the sqlite3_result_text* interfaces +** is non-negative, then as many bytes (not characters) of the text +** pointed to by the 2nd parameter are taken as the application-defined +** function result. If the 3rd parameter is non-negative, then it +** must be the byte offset into the string where the NUL terminator would +** appear if the string where NUL terminated. If any NUL characters occur +** in the string at a byte offset that is less than the value of the 3rd +** parameter, then the resulting string will contain embedded NULs and the +** result of expressions operating on strings with embedded NULs is undefined. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is a non-NULL pointer, then SQLite calls that +** function as the destructor on the text or BLOB result when it has +** finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces or to +** sqlite3_result_blob is the special constant SQLITE_STATIC, then SQLite +** assumes that the text or BLOB result is in constant space and does not +** copy the content of the parameter nor call a destructor on the content +** when it has finished using that result. +** ^If the 4th parameter to the sqlite3_result_text* interfaces +** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT +** then SQLite makes a copy of the result into space obtained from +** from [sqlite3_malloc()] before it returns. +** +** ^The sqlite3_result_value() interface sets the result of +** the application-defined function to be a copy of the +** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The +** sqlite3_result_value() interface makes a copy of the [sqlite3_value] +** so that the [sqlite3_value] specified in the parameter may change or +** be deallocated after sqlite3_result_value() returns without harm. +** ^A [protected sqlite3_value] object may always be used where an +** [unprotected sqlite3_value] object is required, so either +** kind of [sqlite3_value] object can be used with this interface. +** +** If these routines are called from within the different thread +** than the one containing the application-defined function that received +** the [sqlite3_context] pointer, the results are undefined. +*/ +SQLITE_API void sqlite3_result_blob(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_blob64(sqlite3_context*,const void*, + sqlite3_uint64,void(*)(void*)); +SQLITE_API void sqlite3_result_double(sqlite3_context*, double); +SQLITE_API void sqlite3_result_error(sqlite3_context*, const char*, int); +SQLITE_API void sqlite3_result_error16(sqlite3_context*, const void*, int); +SQLITE_API void sqlite3_result_error_toobig(sqlite3_context*); +SQLITE_API void sqlite3_result_error_nomem(sqlite3_context*); +SQLITE_API void sqlite3_result_error_code(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int(sqlite3_context*, int); +SQLITE_API void sqlite3_result_int64(sqlite3_context*, sqlite3_int64); +SQLITE_API void sqlite3_result_null(sqlite3_context*); +SQLITE_API void sqlite3_result_text(sqlite3_context*, const char*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text64(sqlite3_context*, const char*,sqlite3_uint64, + void(*)(void*), unsigned char encoding); +SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(*)(void*)); +SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); +SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); + +/* +** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 +** +** ^These functions add, remove, or modify a [collation] associated +** with the [database connection] specified as the first argument. +** +** ^The name of the collation is a UTF-8 string +** for sqlite3_create_collation() and sqlite3_create_collation_v2() +** and a UTF-16 string in native byte order for sqlite3_create_collation16(). +** ^Collation names that compare equal according to [sqlite3_strnicmp()] are +** considered to be the same name. +** +** ^(The third argument (eTextRep) must be one of the constants: +**
      +**
    • [SQLITE_UTF8], +**
    • [SQLITE_UTF16LE], +**
    • [SQLITE_UTF16BE], +**
    • [SQLITE_UTF16], or +**
    • [SQLITE_UTF16_ALIGNED]. +**
    )^ +** ^The eTextRep argument determines the encoding of strings passed +** to the collating function callback, xCallback. +** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep +** force strings to be UTF16 with native byte order. +** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin +** on an even byte address. +** +** ^The fourth argument, pArg, is an application data pointer that is passed +** through as the first argument to the collating function callback. +** +** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^Multiple collating functions can be registered using the same name but +** with different eTextRep parameters and SQLite will use whichever +** function requires the least amount of data transformation. +** ^If the xCallback argument is NULL then the collating function is +** deleted. ^When all collating functions having the same name are deleted, +** that collation is no longer usable. +** +** ^The collating function callback is invoked with a copy of the pArg +** application data pointer and with two strings in the encoding specified +** by the eTextRep argument. The collating function must return an +** integer that is negative, zero, or positive +** if the first string is less than, equal to, or greater than the second, +** respectively. A collating function must always return the same answer +** given the same inputs. If two or more collating functions are registered +** to the same collation name (using different eTextRep values) then all +** must give an equivalent answer when invoked with equivalent strings. +** The collating function must obey the following properties for all +** strings A, B, and C: +** +**
      +**
    1. If A==B then B==A. +**
    2. If A==B and B==C then A==C. +**
    3. If A<B THEN B>A. +**
    4. If A<B and B<C then A<C. +**
    +** +** If a collating function fails any of the above constraints and that +** collating function is registered and used, then the behavior of SQLite +** is undefined. +** +** ^The sqlite3_create_collation_v2() works like sqlite3_create_collation() +** with the addition that the xDestroy callback is invoked on pArg when +** the collating function is deleted. +** ^Collating functions are deleted when they are overridden by later +** calls to the collation creation functions or when the +** [database connection] is closed using [sqlite3_close()]. +** +** ^The xDestroy callback is not called if the +** sqlite3_create_collation_v2() function fails. Applications that invoke +** sqlite3_create_collation_v2() with a non-NULL xDestroy argument should +** check the return code and dispose of the application data pointer +** themselves rather than expecting SQLite to deal with it for them. +** This is different from every other SQLite interface. The inconsistency +** is unfortunate but cannot be changed without breaking backwards +** compatibility. +** +** See also: [sqlite3_collation_needed()] and [sqlite3_collation_needed16()]. +*/ +SQLITE_API int sqlite3_create_collation( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); +SQLITE_API int sqlite3_create_collation_v2( + sqlite3*, + const char *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*), + void(*xDestroy)(void*) +); +SQLITE_API int sqlite3_create_collation16( + sqlite3*, + const void *zName, + int eTextRep, + void *pArg, + int(*xCompare)(void*,int,const void*,int,const void*) +); + +/* +** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 +** +** ^To avoid having to register all collation sequences before a database +** can be used, a single callback function may be registered with the +** [database connection] to be invoked whenever an undefined collation +** sequence is required. +** +** ^If the function is registered using the sqlite3_collation_needed() API, +** then it is passed the names of undefined collation sequences as strings +** encoded in UTF-8. ^If sqlite3_collation_needed16() is used, +** the names are passed as UTF-16 in machine native byte order. +** ^A call to either function replaces the existing collation-needed callback. +** +** ^(When the callback is invoked, the first argument passed is a copy +** of the second argument to sqlite3_collation_needed() or +** sqlite3_collation_needed16(). The second argument is the database +** connection. The third argument is one of [SQLITE_UTF8], [SQLITE_UTF16BE], +** or [SQLITE_UTF16LE], indicating the most desirable form of the collation +** sequence function required. The fourth parameter is the name of the +** required collation sequence.)^ +** +** The callback function should register the desired collation using +** [sqlite3_create_collation()], [sqlite3_create_collation16()], or +** [sqlite3_create_collation_v2()]. +*/ +SQLITE_API int sqlite3_collation_needed( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const char*) +); +SQLITE_API int sqlite3_collation_needed16( + sqlite3*, + void*, + void(*)(void*,sqlite3*,int eTextRep,const void*) +); + +#ifdef SQLITE_HAS_CODEC +/* +** Specify the key for an encrypted database. This routine should be +** called right after sqlite3_open(). +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_key( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The key */ +); +SQLITE_API int sqlite3_key_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The key */ +); + +/* +** Change the key on an open database. If the current database is not +** encrypted, this routine will encrypt it. If pNew==0 or nNew==0, the +** database is decrypted. +** +** The code to implement this API is not available in the public release +** of SQLite. +*/ +SQLITE_API int sqlite3_rekey( + sqlite3 *db, /* Database to be rekeyed */ + const void *pKey, int nKey /* The new key */ +); +SQLITE_API int sqlite3_rekey_v2( + sqlite3 *db, /* Database to be rekeyed */ + const char *zDbName, /* Name of the database */ + const void *pKey, int nKey /* The new key */ +); + +/* +** Specify the activation key for a SEE database. Unless +** activated, none of the SEE routines will work. +*/ +SQLITE_API void sqlite3_activate_see( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +#ifdef SQLITE_ENABLE_CEROD +/* +** Specify the activation key for a CEROD database. Unless +** activated, none of the CEROD routines will work. +*/ +SQLITE_API void sqlite3_activate_cerod( + const char *zPassPhrase /* Activation phrase */ +); +#endif + +/* +** CAPI3REF: Suspend Execution For A Short Time +** +** The sqlite3_sleep() function causes the current thread to suspend execution +** for at least a number of milliseconds specified in its parameter. +** +** If the operating system does not support sleep requests with +** millisecond time resolution, then the time will be rounded up to +** the nearest second. The number of milliseconds of sleep actually +** requested from the operating system is returned. +** +** ^SQLite implements this interface by calling the xSleep() +** method of the default [sqlite3_vfs] object. If the xSleep() method +** of the default VFS is not implemented correctly, or not implemented at +** all, then the behavior of sqlite3_sleep() may deviate from the description +** in the previous paragraphs. +*/ +SQLITE_API int sqlite3_sleep(int); + +/* +** CAPI3REF: Name Of The Folder Holding Temporary Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all temporary files +** created by SQLite when using a built-in [sqlite3_vfs | VFS] +** will be placed in that directory.)^ ^If this variable +** is a NULL pointer, then SQLite performs a search for an appropriate +** temporary file directory. +** +** Applications are strongly discouraged from using this global variable. +** It is required to set a temporary folder on Windows Runtime (WinRT). +** But for all other platforms, it is highly recommended that applications +** neither read nor write this variable. This global variable is a relic +** that exists for backwards compatibility of legacy applications and should +** be avoided in new projects. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [temp_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [temp_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [temp_store_directory pragma] should be avoided. +** Except when requested by the [temp_store_directory pragma], SQLite +** does not free the memory that sqlite3_temp_directory points to. If +** the application wants that memory to be freed, it must do +** so itself, taking care to only do so after all [database connection] +** objects have been destroyed. +** +** Note to Windows Runtime users: The temporary directory must be set +** prior to calling [sqlite3_open] or [sqlite3_open_v2]. Otherwise, various +** features that require the use of temporary files may fail. Here is an +** example of how to do this using C++ with the Windows Runtime: +** +**
    +** LPCWSTR zPath = Windows::Storage::ApplicationData::Current->
    +**       TemporaryFolder->Path->Data();
    +** char zPathBuf[MAX_PATH + 1];
    +** memset(zPathBuf, 0, sizeof(zPathBuf));
    +** WideCharToMultiByte(CP_UTF8, 0, zPath, -1, zPathBuf, sizeof(zPathBuf),
    +**       NULL, NULL);
    +** sqlite3_temp_directory = sqlite3_mprintf("%s", zPathBuf);
    +** 
    +*/ +SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory; + +/* +** CAPI3REF: Name Of The Folder Holding Database Files +** +** ^(If this global variable is made to point to a string which is +** the name of a folder (a.k.a. directory), then all database files +** specified with a relative pathname and created or accessed by +** SQLite when using a built-in windows [sqlite3_vfs | VFS] will be assumed +** to be relative to that directory.)^ ^If this variable is a NULL +** pointer, then SQLite assumes that all database files specified +** with a relative pathname are relative to the current directory +** for the process. Only the windows VFS makes use of this global +** variable; it is ignored by the unix VFS. +** +** Changing the value of this variable while a database connection is +** open can result in a corrupt database. +** +** It is not safe to read or modify this variable in more than one +** thread at a time. It is not safe to read or modify this variable +** if a [database connection] is being used at the same time in a separate +** thread. +** It is intended that this variable be set once +** as part of process initialization and before any SQLite interface +** routines have been called and that this variable remain unchanged +** thereafter. +** +** ^The [data_store_directory pragma] may modify this variable and cause +** it to point to memory obtained from [sqlite3_malloc]. ^Furthermore, +** the [data_store_directory pragma] always assumes that any string +** that this variable points to is held in memory obtained from +** [sqlite3_malloc] and the pragma may attempt to free that memory +** using [sqlite3_free]. +** Hence, if this variable is modified directly, either it should be +** made NULL or made to point to memory obtained from [sqlite3_malloc] +** or else the use of the [data_store_directory pragma] should be avoided. +*/ +SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory; + +/* +** CAPI3REF: Test For Auto-Commit Mode +** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 +** +** ^The sqlite3_get_autocommit() interface returns non-zero or +** zero if the given database connection is or is not in autocommit mode, +** respectively. ^Autocommit mode is on by default. +** ^Autocommit mode is disabled by a [BEGIN] statement. +** ^Autocommit mode is re-enabled by a [COMMIT] or [ROLLBACK]. +** +** If certain kinds of errors occur on a statement within a multi-statement +** transaction (errors including [SQLITE_FULL], [SQLITE_IOERR], +** [SQLITE_NOMEM], [SQLITE_BUSY], and [SQLITE_INTERRUPT]) then the +** transaction might be rolled back automatically. The only way to +** find out whether SQLite automatically rolled back the transaction after +** an error is to use this function. +** +** If another thread changes the autocommit status of the database +** connection while this routine is running, then the return value +** is undefined. +*/ +SQLITE_API int sqlite3_get_autocommit(sqlite3*); + +/* +** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt +** +** ^The sqlite3_db_handle interface returns the [database connection] handle +** to which a [prepared statement] belongs. ^The [database connection] +** returned by sqlite3_db_handle is the same [database connection] +** that was the first argument +** to the [sqlite3_prepare_v2()] call (or its variants) that was used to +** create the statement in the first place. +*/ +SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); + +/* +** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename +** associated with database N of connection D. ^The main database file +** has the name "main". If there is no attached database N on the database +** connection D, or if database N is a temporary or in-memory database, then +** a NULL pointer is returned. +** +** ^The filename returned by this function is the output of the +** xFullPathname method of the [VFS]. ^In other words, the filename +** will be an absolute pathname, even if the filename used +** to open the database originally was a URI or relative pathname. +*/ +SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 +** +** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N +** of connection D is read-only, 0 if it is read/write, or -1 if N is not +** the name of a database on connection D. +*/ +SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); + +/* +** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 +** +** ^This interface returns a pointer to the next [prepared statement] after +** pStmt associated with the [database connection] pDb. ^If pStmt is NULL +** then this interface returns a pointer to the first prepared statement +** associated with the database connection pDb. ^If no prepared statement +** satisfies the conditions of this routine, it returns NULL. +** +** The [database connection] pointer D in a call to +** [sqlite3_next_stmt(D,S)] must refer to an open database +** connection and in particular must not be a NULL pointer. +*/ +SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); + +/* +** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_commit_hook() interface registers a callback +** function to be invoked whenever a transaction is [COMMIT | committed]. +** ^Any callback set by a previous call to sqlite3_commit_hook() +** for the same database connection is overridden. +** ^The sqlite3_rollback_hook() interface registers a callback +** function to be invoked whenever a transaction is [ROLLBACK | rolled back]. +** ^Any callback set by a previous call to sqlite3_rollback_hook() +** for the same database connection is overridden. +** ^The pArg argument is passed through to the callback. +** ^If the callback on a commit hook function returns non-zero, +** then the commit is converted into a rollback. +** +** ^The sqlite3_commit_hook(D,C,P) and sqlite3_rollback_hook(D,C,P) functions +** return the P argument from the previous call of the same function +** on the same [database connection] D, or NULL for +** the first call for each function on D. +** +** The commit and rollback hook callbacks are not reentrant. +** The callback implementation must not do anything that will modify +** the database connection that invoked the callback. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the commit +** or rollback hook in the first place. +** Note that running any other SQL statements, including SELECT statements, +** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify +** the database connections for the meaning of "modify" in this paragraph. +** +** ^Registering a NULL function disables the callback. +** +** ^When the commit hook callback routine returns zero, the [COMMIT] +** operation is allowed to continue normally. ^If the commit hook +** returns non-zero, then the [COMMIT] is converted into a [ROLLBACK]. +** ^The rollback hook is invoked on a rollback that results from a commit +** hook returning non-zero, just as it would be with any other rollback. +** +** ^For the purposes of this API, a transaction is said to have been +** rolled back if an explicit "ROLLBACK" statement is executed, or +** an error or constraint causes an implicit rollback to occur. +** ^The rollback callback is not invoked if a transaction is +** automatically rolled back because the database connection is closed. +** +** See also the [sqlite3_update_hook()] interface. +*/ +SQLITE_API void *sqlite3_commit_hook(sqlite3*, int(*)(void*), void*); +SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); + +/* +** CAPI3REF: Data Change Notification Callbacks +** METHOD: sqlite3 +** +** ^The sqlite3_update_hook() interface registers a callback function +** with the [database connection] identified by the first argument +** to be invoked whenever a row is updated, inserted or deleted in +** a [rowid table]. +** ^Any callback set by a previous call to this function +** for the same database connection is overridden. +** +** ^The second argument is a pointer to the function to invoke when a +** row is updated, inserted or deleted in a rowid table. +** ^The first argument to the callback is a copy of the third argument +** to sqlite3_update_hook(). +** ^The second callback argument is one of [SQLITE_INSERT], [SQLITE_DELETE], +** or [SQLITE_UPDATE], depending on the operation that caused the callback +** to be invoked. +** ^The third and fourth arguments to the callback contain pointers to the +** database and table name containing the affected row. +** ^The final callback parameter is the [rowid] of the row. +** ^In the case of an update, this is the [rowid] after the update takes place. +** +** ^(The update hook is not invoked when internal system tables are +** modified (i.e. sqlite_master and sqlite_sequence).)^ +** ^The update hook is not invoked when [WITHOUT ROWID] tables are modified. +** +** ^In the current implementation, the update hook +** is not invoked when duplication rows are deleted because of an +** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook +** invoked when rows are deleted using the [truncate optimization]. +** The exceptions defined in this paragraph might change in a future +** release of SQLite. +** +** The update hook implementation must not do anything that will modify +** the database connection that invoked the update hook. Any actions +** to modify the database connection must be deferred until after the +** completion of the [sqlite3_step()] call that triggered the update hook. +** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their +** database connections for the meaning of "modify" in this paragraph. +** +** ^The sqlite3_update_hook(D,C,P) function +** returns the P argument from the previous call +** on the same [database connection] D, or NULL for +** the first call on D. +** +** See also the [sqlite3_commit_hook()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. +*/ +SQLITE_API void *sqlite3_update_hook( + sqlite3*, + void(*)(void *,int ,char const *,char const *,sqlite3_int64), + void* +); + +/* +** CAPI3REF: Enable Or Disable Shared Pager Cache +** +** ^(This routine enables or disables the sharing of the database cache +** and schema data structures between [database connection | connections] +** to the same database. Sharing is enabled if the argument is true +** and disabled if the argument is false.)^ +** +** ^Cache sharing is enabled and disabled for an entire process. +** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]). +** In prior versions of SQLite, +** sharing was enabled or disabled for each thread separately. +** +** ^(The cache sharing mode set by this interface effects all subsequent +** calls to [sqlite3_open()], [sqlite3_open_v2()], and [sqlite3_open16()]. +** Existing database connections continue use the sharing mode +** that was in effect at the time they were opened.)^ +** +** ^(This routine returns [SQLITE_OK] if shared cache was enabled or disabled +** successfully. An [error code] is returned otherwise.)^ +** +** ^Shared cache is disabled by default. But this might change in +** future releases of SQLite. Applications that care about shared +** cache setting should set it explicitly. +** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** +** This interface is threadsafe on processors where writing a +** 32-bit integer is atomic. +** +** See Also: [SQLite Shared-Cache Mode] +*/ +SQLITE_API int sqlite3_enable_shared_cache(int); + +/* +** CAPI3REF: Attempt To Free Heap Memory +** +** ^The sqlite3_release_memory() interface attempts to free N bytes +** of heap memory by deallocating non-essential memory allocations +** held by the database library. Memory used to cache database +** pages to improve performance is an example of non-essential memory. +** ^sqlite3_release_memory() returns the number of bytes actually freed, +** which might be more or less than the amount requested. +** ^The sqlite3_release_memory() routine is a no-op returning zero +** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** See also: [sqlite3_db_release_memory()] +*/ +SQLITE_API int sqlite3_release_memory(int); + +/* +** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap +** memory as possible from database connection D. Unlike the +** [sqlite3_release_memory()] interface, this interface is in effect even +** when the [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is +** omitted. +** +** See also: [sqlite3_release_memory()] +*/ +SQLITE_API int sqlite3_db_release_memory(sqlite3*); + +/* +** CAPI3REF: Impose A Limit On Heap Size +** +** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the +** soft limit on the amount of heap memory that may be allocated by SQLite. +** ^SQLite strives to keep heap memory utilization below the soft heap +** limit by reducing the number of pages held in the page cache +** as heap memory usages approaches the limit. +** ^The soft heap limit is "soft" because even though SQLite strives to stay +** below the limit, it will exceed the limit rather than generate +** an [SQLITE_NOMEM] error. In other words, the soft heap limit +** is advisory only. +** +** ^The return value from sqlite3_soft_heap_limit64() is the size of +** the soft heap limit prior to the call, or negative in the case of an +** error. ^If the argument N is negative +** then no change is made to the soft heap limit. Hence, the current +** size of the soft heap limit can be determined by invoking +** sqlite3_soft_heap_limit64() with a negative argument. +** +** ^If the argument N is zero then the soft heap limit is disabled. +** +** ^(The soft heap limit is not enforced in the current implementation +** if one or more of following conditions are true: +** +**
      +**
    • The soft heap limit is set to zero. +**
    • Memory accounting is disabled using a combination of the +** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and +** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. +**
    • An alternative page cache implementation is specified using +** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). +**
    • The page cache allocates from its own memory pool supplied +** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than +** from the heap. +**
    )^ +** +** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), +** the soft heap limit is enforced +** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] +** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], +** the soft heap limit is enforced on every memory allocation. Without +** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced +** when memory is allocated by the page cache. Testing suggests that because +** the page cache is the predominate memory user in SQLite, most +** applications will achieve adequate soft heap limit enforcement without +** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. +** +** The circumstances under which SQLite will enforce the soft heap limit may +** changes in future releases of SQLite. +*/ +SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); + +/* +** CAPI3REF: Deprecated Soft Heap Limit Interface +** DEPRECATED +** +** This is a deprecated version of the [sqlite3_soft_heap_limit64()] +** interface. This routine is provided for historical compatibility +** only. All new applications should use the +** [sqlite3_soft_heap_limit64()] interface rather than this one. +*/ +SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); + + +/* +** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 +** +** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns +** information about column C of table T in database D +** on [database connection] X.)^ ^The sqlite3_table_column_metadata() +** interface returns SQLITE_OK and fills in the non-NULL pointers in +** the final five arguments with appropriate values if the specified +** column exists. ^The sqlite3_table_column_metadata() interface returns +** SQLITE_ERROR and if the specified column does not exist. +** ^If the column-name parameter to sqlite3_table_column_metadata() is a +** NULL pointer, then this routine simply checks for the existence of the +** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it +** does not. +** +** ^The column is identified by the second, third and fourth parameters to +** this function. ^(The second parameter is either the name of the database +** (i.e. "main", "temp", or an attached database) containing the specified +** table or NULL.)^ ^If it is NULL, then all attached databases are searched +** for the table using the same algorithm used by the database engine to +** resolve unqualified table references. +** +** ^The third and fourth parameters to this function are the table and column +** name of the desired column, respectively. +** +** ^Metadata is returned by writing to the memory locations passed as the 5th +** and subsequent parameters to this function. ^Any of these arguments may be +** NULL, in which case the corresponding element of metadata is omitted. +** +** ^(
    +** +**
    Parameter Output
    Type
    Description +** +**
    5th const char* Data type +**
    6th const char* Name of default collation sequence +**
    7th int True if column has a NOT NULL constraint +**
    8th int True if column is part of the PRIMARY KEY +**
    9th int True if column is [AUTOINCREMENT] +**
    +**
    )^ +** +** ^The memory pointed to by the character pointers returned for the +** declaration type and collation sequence is valid until the next +** call to any SQLite API function. +** +** ^If the specified table is actually a view, an [error code] is returned. +** +** ^If the specified column is "rowid", "oid" or "_rowid_" and the table +** is not a [WITHOUT ROWID] table and an +** [INTEGER PRIMARY KEY] column has been explicitly declared, then the output +** parameters are set for the explicitly declared column. ^(If there is no +** [INTEGER PRIMARY KEY] column, then the outputs +** for the [rowid] are set as follows: +** +**
    +**     data type: "INTEGER"
    +**     collation sequence: "BINARY"
    +**     not null: 0
    +**     primary key: 1
    +**     auto increment: 0
    +** 
    )^ +** +** ^This function causes all database schemas to be read from disk and +** parsed, if that has not already been done, and returns an error if +** any errors are encountered while loading the schema. +*/ +SQLITE_API int sqlite3_table_column_metadata( + sqlite3 *db, /* Connection handle */ + const char *zDbName, /* Database name or NULL */ + const char *zTableName, /* Table name */ + const char *zColumnName, /* Column name */ + char const **pzDataType, /* OUTPUT: Declared data type */ + char const **pzCollSeq, /* OUTPUT: Collation sequence name */ + int *pNotNull, /* OUTPUT: True if NOT NULL constraint exists */ + int *pPrimaryKey, /* OUTPUT: True if column part of PK */ + int *pAutoinc /* OUTPUT: True if column is auto-increment */ +); + +/* +** CAPI3REF: Load An Extension +** METHOD: sqlite3 +** +** ^This interface loads an SQLite extension library from the named file. +** +** ^The sqlite3_load_extension() interface attempts to load an +** [SQLite extension] library contained in the file zFile. If +** the file cannot be loaded directly, attempts are made to load +** with various operating-system specific extensions added. +** So for example, if "samplelib" cannot be loaded, then names like +** "samplelib.so" or "samplelib.dylib" or "samplelib.dll" might +** be tried also. +** +** ^The entry point is zProc. +** ^(zProc may be 0, in which case SQLite will try to come up with an +** entry point name on its own. It first tries "sqlite3_extension_init". +** If that does not work, it constructs a name "sqlite3_X_init" where the +** X is consists of the lower-case equivalent of all ASCII alphabetic +** characters in the filename from the last "/" to the first following +** "." and omitting any initial "lib".)^ +** ^The sqlite3_load_extension() interface returns +** [SQLITE_OK] on success and [SQLITE_ERROR] if something goes wrong. +** ^If an error occurs and pzErrMsg is not 0, then the +** [sqlite3_load_extension()] interface shall attempt to +** fill *pzErrMsg with error message text stored in memory +** obtained from [sqlite3_malloc()]. The calling function +** should free this memory by calling [sqlite3_free()]. +** +** ^Extension loading must be enabled using +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, +** otherwise an error will be returned. +** +** Security warning: It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** +** See also the [load_extension() SQL function]. +*/ +SQLITE_API int sqlite3_load_extension( + sqlite3 *db, /* Load the extension into this database connection */ + const char *zFile, /* Name of the shared library containing extension */ + const char *zProc, /* Entry point. Derived from zFile if 0 */ + char **pzErrMsg /* Put error message here if not 0 */ +); + +/* +** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 +** +** ^So as not to open security holes in older applications that are +** unprepared to deal with [extension loading], and as a means of disabling +** [extension loading] while evaluating user-entered SQL, the following API +** is provided to turn the [sqlite3_load_extension()] mechanism on and off. +** +** ^Extension loading is off by default. +** ^Call the sqlite3_enable_load_extension() routine with onoff==1 +** to turn extension loading on and call it with onoff==0 to turn +** it back off again. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** Security warning: It is recommended that extension loading +** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. +*/ +SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); + +/* +** CAPI3REF: Automatically Load Statically Linked Extensions +** +** ^This interface causes the xEntryPoint() function to be invoked for +** each new [database connection] that is created. The idea here is that +** xEntryPoint() is the entry point for a statically linked [SQLite extension] +** that is to be automatically loaded into all new database connections. +** +** ^(Even though the function prototype shows that xEntryPoint() takes +** no arguments and returns void, SQLite invokes xEntryPoint() with three +** arguments and expects an integer result as if the signature of the +** entry point where as follows: +** +**
    +**    int xEntryPoint(
    +**      sqlite3 *db,
    +**      const char **pzErrMsg,
    +**      const struct sqlite3_api_routines *pThunk
    +**    );
    +** 
    )^ +** +** If the xEntryPoint routine encounters an error, it should make *pzErrMsg +** point to an appropriate error message (obtained from [sqlite3_mprintf()]) +** and return an appropriate [error code]. ^SQLite ensures that *pzErrMsg +** is NULL before calling the xEntryPoint(). ^SQLite will invoke +** [sqlite3_free()] on *pzErrMsg after xEntryPoint() returns. ^If any +** xEntryPoint() returns an error, the [sqlite3_open()], [sqlite3_open16()], +** or [sqlite3_open_v2()] call that provoked the xEntryPoint() will fail. +** +** ^Calling sqlite3_auto_extension(X) with an entry point X that is already +** on the list of automatic extensions is a harmless no-op. ^No entry point +** will be called more than once for each database connection that is opened. +** +** See also: [sqlite3_reset_auto_extension()] +** and [sqlite3_cancel_auto_extension()] +*/ +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Cancel Automatic Extension Loading +** +** ^The [sqlite3_cancel_auto_extension(X)] interface unregisters the +** initialization routine X that was registered using a prior call to +** [sqlite3_auto_extension(X)]. ^The [sqlite3_cancel_auto_extension(X)] +** routine returns 1 if initialization routine X was successfully +** unregistered and it returns 0 if X was not on the list of initialization +** routines. +*/ +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); + +/* +** CAPI3REF: Reset Automatic Extension Loading +** +** ^This interface disables all automatic extensions previously +** registered using [sqlite3_auto_extension()]. +*/ +SQLITE_API void sqlite3_reset_auto_extension(void); + +/* +** The interface to the virtual-table mechanism is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** Structures used by the virtual table interface +*/ +typedef struct sqlite3_vtab sqlite3_vtab; +typedef struct sqlite3_index_info sqlite3_index_info; +typedef struct sqlite3_vtab_cursor sqlite3_vtab_cursor; +typedef struct sqlite3_module sqlite3_module; + +/* +** CAPI3REF: Virtual Table Object +** KEYWORDS: sqlite3_module {virtual table module} +** +** This structure, sometimes called a "virtual table module", +** defines the implementation of a [virtual tables]. +** This structure consists mostly of methods for the module. +** +** ^A virtual table module is created by filling in a persistent +** instance of this structure and passing a pointer to that instance +** to [sqlite3_create_module()] or [sqlite3_create_module_v2()]. +** ^The registration remains valid until it is replaced by a different +** module or until the [database connection] closes. The content +** of this structure must not change while it is registered with +** any database connection. +*/ +struct sqlite3_module { + int iVersion; + int (*xCreate)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xConnect)(sqlite3*, void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVTab, char**); + int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*); + int (*xDisconnect)(sqlite3_vtab *pVTab); + int (*xDestroy)(sqlite3_vtab *pVTab); + int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor); + int (*xClose)(sqlite3_vtab_cursor*); + int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr, + int argc, sqlite3_value **argv); + int (*xNext)(sqlite3_vtab_cursor*); + int (*xEof)(sqlite3_vtab_cursor*); + int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int); + int (*xRowid)(sqlite3_vtab_cursor*, sqlite3_int64 *pRowid); + int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite3_int64 *); + int (*xBegin)(sqlite3_vtab *pVTab); + int (*xSync)(sqlite3_vtab *pVTab); + int (*xCommit)(sqlite3_vtab *pVTab); + int (*xRollback)(sqlite3_vtab *pVTab); + int (*xFindFunction)(sqlite3_vtab *pVtab, int nArg, const char *zName, + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), + void **ppArg); + int (*xRename)(sqlite3_vtab *pVtab, const char *zNew); + /* The methods above are in version 1 of the sqlite_module object. Those + ** below are for version 2 and greater. */ + int (*xSavepoint)(sqlite3_vtab *pVTab, int); + int (*xRelease)(sqlite3_vtab *pVTab, int); + int (*xRollbackTo)(sqlite3_vtab *pVTab, int); +}; + +/* +** CAPI3REF: Virtual Table Indexing Information +** KEYWORDS: sqlite3_index_info +** +** The sqlite3_index_info structure and its substructures is used as part +** of the [virtual table] interface to +** pass information into and receive the reply from the [xBestIndex] +** method of a [virtual table module]. The fields under **Inputs** are the +** inputs to xBestIndex and are read-only. xBestIndex inserts its +** results into the **Outputs** fields. +** +** ^(The aConstraint[] array records WHERE clause constraints of the form: +** +**
    column OP expr
    +** +** where OP is =, <, <=, >, or >=.)^ ^(The particular operator is +** stored in aConstraint[].op using one of the +** [SQLITE_INDEX_CONSTRAINT_EQ | SQLITE_INDEX_CONSTRAINT_ values].)^ +** ^(The index of the column is stored in +** aConstraint[].iColumn.)^ ^(aConstraint[].usable is TRUE if the +** expr on the right-hand side can be evaluated (and thus the constraint +** is usable) and false if it cannot.)^ +** +** ^The optimizer automatically inverts terms of the form "expr OP column" +** and makes other simplifications to the WHERE clause in an attempt to +** get as many WHERE clause terms into the form shown above as possible. +** ^The aConstraint[] array only reports WHERE clause terms that are +** relevant to the particular virtual table being queried. +** +** ^Information about the ORDER BY clause is stored in aOrderBy[]. +** ^Each term of aOrderBy records a column of the ORDER BY clause. +** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** +** The [xBestIndex] method must fill aConstraintUsage[] with information +** about what parameters to pass to xFilter. ^If argvIndex>0 then +** the right-hand side of the corresponding aConstraint[] is evaluated +** and becomes the argvIndex-th entry in argv. ^(If aConstraintUsage[].omit +** is true, then the constraint is assumed to be fully handled by the +** virtual table and is not checked again by SQLite.)^ +** +** ^The idxNum and idxPtr values are recorded and passed into the +** [xFilter] method. +** ^[sqlite3_free()] is used to free idxPtr if and only if +** needToFreeIdxPtr is true. +** +** ^The orderByConsumed means that output from [xFilter]/[xNext] will occur in +** the correct order to satisfy the ORDER BY clause so that no separate +** sorting step is required. +** +** ^The estimatedCost value is an estimate of the cost of a particular +** strategy. A cost of N indicates that the cost of the strategy is similar +** to a linear scan of an SQLite table with N rows. A cost of log(N) +** indicates that the expense of the operation is similar to that of a +** binary search on a unique indexed field of an SQLite table with N rows. +** +** ^The estimatedRows value is an estimate of the number of rows that +** will be returned by the strategy. +** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** +** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is +** used with an SQLite version earlier than 3.8.2, the results of attempting +** to read or write the estimatedRows field are undefined (but are likely +** to included crashing the application). The estimatedRows field should +** therefore only be used if [sqlite3_libversion_number()] returns a +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. +*/ +struct sqlite3_index_info { + /* Inputs */ + int nConstraint; /* Number of entries in aConstraint */ + struct sqlite3_index_constraint { + int iColumn; /* Column constrained. -1 for ROWID */ + unsigned char op; /* Constraint operator */ + unsigned char usable; /* True if this constraint is usable */ + int iTermOffset; /* Used internally - xBestIndex should ignore */ + } *aConstraint; /* Table of WHERE clause constraints */ + int nOrderBy; /* Number of terms in the ORDER BY clause */ + struct sqlite3_index_orderby { + int iColumn; /* Column number */ + unsigned char desc; /* True for DESC. False for ASC. */ + } *aOrderBy; /* The ORDER BY clause */ + /* Outputs */ + struct sqlite3_index_constraint_usage { + int argvIndex; /* if >0, constraint is part of argv to xFilter */ + unsigned char omit; /* Do not code a test for this constraint */ + } *aConstraintUsage; + int idxNum; /* Number used to identify the index */ + char *idxStr; /* String, possibly obtained from sqlite3_malloc */ + int needToFreeIdxStr; /* Free idxStr using sqlite3_free() if true */ + int orderByConsumed; /* True if output is already ordered */ + double estimatedCost; /* Estimated cost of using this index */ + /* Fields below are only available in SQLite 3.8.2 and later */ + sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ +}; + +/* +** CAPI3REF: Virtual Table Scan Flags +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + +/* +** CAPI3REF: Virtual Table Constraint Operator Codes +** +** These macros defined the allowed values for the +** [sqlite3_index_info].aConstraint[].op field. Each value represents +** an operator that is part of a constraint term in the wHERE clause of +** a query that uses a [virtual table]. +*/ +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 + +/* +** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 +** +** ^These routines are used to register a new [virtual table module] name. +** ^Module names must be registered before +** creating a new [virtual table] using the module and before using a +** preexisting [virtual table] for the module. +** +** ^The module name is registered on the [database connection] specified +** by the first parameter. ^The name of the module is given by the +** second parameter. ^The third parameter is a pointer to +** the implementation of the [virtual table module]. ^The fourth +** parameter is an arbitrary client data pointer that is passed through +** into the [xCreate] and [xConnect] methods of the virtual table module +** when a new virtual table is be being created or reinitialized. +** +** ^The sqlite3_create_module_v2() interface has a fifth parameter which +** is a pointer to a destructor for the pClientData. ^SQLite will +** invoke the destructor function (if it is not NULL) when SQLite +** no longer needs the pClientData pointer. ^The destructor will also +** be invoked if the call to sqlite3_create_module_v2() fails. +** ^The sqlite3_create_module() +** interface is equivalent to sqlite3_create_module_v2() with a NULL +** destructor. +*/ +SQLITE_API int sqlite3_create_module( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData /* Client data for xCreate/xConnect */ +); +SQLITE_API int sqlite3_create_module_v2( + sqlite3 *db, /* SQLite connection to register module with */ + const char *zName, /* Name of the module */ + const sqlite3_module *p, /* Methods for the module */ + void *pClientData, /* Client data for xCreate/xConnect */ + void(*xDestroy)(void*) /* Module destructor function */ +); + +/* +** CAPI3REF: Virtual Table Instance Object +** KEYWORDS: sqlite3_vtab +** +** Every [virtual table module] implementation uses a subclass +** of this object to describe a particular instance +** of the [virtual table]. Each subclass will +** be tailored to the specific needs of the module implementation. +** The purpose of this superclass is to define certain fields that are +** common to all module implementations. +** +** ^Virtual tables methods can set an error message by assigning a +** string obtained from [sqlite3_mprintf()] to zErrMsg. The method should +** take care that any prior string is freed by a call to [sqlite3_free()] +** prior to assigning a new string to zErrMsg. ^After the error message +** is delivered up to the client application, the string will be automatically +** freed by sqlite3_free() and the zErrMsg field will be zeroed. +*/ +struct sqlite3_vtab { + const sqlite3_module *pModule; /* The module for this virtual table */ + int nRef; /* Number of open cursors */ + char *zErrMsg; /* Error message from sqlite3_mprintf() */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Virtual Table Cursor Object +** KEYWORDS: sqlite3_vtab_cursor {virtual table cursor} +** +** Every [virtual table module] implementation uses a subclass of the +** following structure to describe cursors that point into the +** [virtual table] and are used +** to loop through the virtual table. Cursors are created using the +** [sqlite3_module.xOpen | xOpen] method of the module and are destroyed +** by the [sqlite3_module.xClose | xClose] method. Cursors are used +** by the [xFilter], [xNext], [xEof], [xColumn], and [xRowid] methods +** of the module. Each module implementation will define +** the content of a cursor structure to suit its own needs. +** +** This superclass exists in order to define fields of the cursor that +** are common to all implementations. +*/ +struct sqlite3_vtab_cursor { + sqlite3_vtab *pVtab; /* Virtual table of this cursor */ + /* Virtual table implementations will typically add additional fields */ +}; + +/* +** CAPI3REF: Declare The Schema Of A Virtual Table +** +** ^The [xCreate] and [xConnect] methods of a +** [virtual table module] call this interface +** to declare the format (the names and datatypes of the columns) of +** the virtual tables they implement. +*/ +SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); + +/* +** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 +** +** ^(Virtual tables can provide alternative implementations of functions +** using the [xFindFunction] method of the [virtual table module]. +** But global versions of those functions +** must exist in order to be overloaded.)^ +** +** ^(This API makes sure a global version of a function with a particular +** name and number of parameters exists. If no such function exists +** before this API is called, a new function is created.)^ ^The implementation +** of the new function always causes an exception to be thrown. So +** the new function is not good for anything by itself. Its only +** purpose is to be a placeholder function that can be overloaded +** by a [virtual table]. +*/ +SQLITE_API int sqlite3_overload_function(sqlite3*, const char *zFuncName, int nArg); + +/* +** The interface to the virtual-table mechanism defined above (back up +** to a comment remarkably similar to this one) is currently considered +** to be experimental. The interface might change in incompatible ways. +** If this is a problem for you, do not use the interface at this time. +** +** When the virtual-table mechanism stabilizes, we will declare the +** interface fixed, support it indefinitely, and remove this comment. +*/ + +/* +** CAPI3REF: A Handle To An Open BLOB +** KEYWORDS: {BLOB handle} {BLOB handles} +** +** An instance of this object represents an open BLOB on which +** [sqlite3_blob_open | incremental BLOB I/O] can be performed. +** ^Objects of this type are created by [sqlite3_blob_open()] +** and destroyed by [sqlite3_blob_close()]. +** ^The [sqlite3_blob_read()] and [sqlite3_blob_write()] interfaces +** can be used to read or write small subsections of the BLOB. +** ^The [sqlite3_blob_bytes()] interface returns the size of the BLOB in bytes. +*/ +typedef struct sqlite3_blob sqlite3_blob; + +/* +** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob +** +** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located +** in row iRow, column zColumn, table zTable in database zDb; +** in other words, the same BLOB that would be selected by: +** +**
    +**     SELECT zColumn FROM zDb.zTable WHERE [rowid] = iRow;
    +** 
    )^ +** +** ^(Parameter zDb is not the filename that contains the database, but +** rather the symbolic name of the database. For attached databases, this is +** the name that appears after the AS keyword in the [ATTACH] statement. +** For the main database file, the database name is "main". For TEMP +** tables, the database name is "temp".)^ +** +** ^If the flags parameter is non-zero, then the BLOB is opened for read +** and write access. ^If the flags parameter is zero, the BLOB is opened for +** read-only access. +** +** ^(On success, [SQLITE_OK] is returned and the new [BLOB handle] is stored +** in *ppBlob. Otherwise an [error code] is returned and, unless the error +** code is SQLITE_MISUSE, *ppBlob is set to NULL.)^ ^This means that, provided +** the API is not misused, it is always safe to call [sqlite3_blob_close()] +** on *ppBlob after this function it returns. +** +** This function fails with SQLITE_ERROR if any of the following are true: +**
      +**
    • ^(Database zDb does not exist)^, +**
    • ^(Table zTable does not exist within database zDb)^, +**
    • ^(Table zTable is a WITHOUT ROWID table)^, +**
    • ^(Column zColumn does not exist)^, +**
    • ^(Row iRow is not present in the table)^, +**
    • ^(The specified column of row iRow contains a value that is not +** a TEXT or BLOB value)^, +**
    • ^(Column zColumn is part of an index, PRIMARY KEY or UNIQUE +** constraint and the blob is being opened for read/write access)^, +**
    • ^([foreign key constraints | Foreign key constraints] are enabled, +** column zColumn is part of a [child key] definition and the blob is +** being opened for read/write access)^. +**
    +** +** ^Unless it returns SQLITE_MISUSE, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** +** ^(If the row that a BLOB handle points to is modified by an +** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects +** then the BLOB handle is marked as "expired". +** This is true if any column of the row is changed, even a column +** other than the one the BLOB handle is open on.)^ +** ^Calls to [sqlite3_blob_read()] and [sqlite3_blob_write()] for +** an expired BLOB handle fail with a return code of [SQLITE_ABORT]. +** ^(Changes written into a BLOB prior to the BLOB expiring are not +** rolled back by the expiration of the BLOB. Such changes will eventually +** commit if the transaction continues to completion.)^ +** +** ^Use the [sqlite3_blob_bytes()] interface to determine the size of +** the opened blob. ^The size of a blob may not be changed by this +** interface. Use the [UPDATE] SQL command to change the size of a +** blob. +** +** ^The [sqlite3_bind_zeroblob()] and [sqlite3_result_zeroblob()] interfaces +** and the built-in [zeroblob] SQL function may be used to create a +** zero-filled blob to read or write using the incremental-blob interface. +** +** To avoid a resource leak, every open [BLOB handle] should eventually +** be released by a call to [sqlite3_blob_close()]. +*/ +SQLITE_API int sqlite3_blob_open( + sqlite3*, + const char *zDb, + const char *zTable, + const char *zColumn, + sqlite3_int64 iRow, + int flags, + sqlite3_blob **ppBlob +); + +/* +** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob +** +** ^This function is used to move an existing blob handle so that it points +** to a different row of the same database table. ^The new row is identified +** by the rowid value passed as the second argument. Only the row can be +** changed. ^The database, table and column on which the blob handle is open +** remain the same. Moving an existing blob handle to a new row can be +** faster than closing the existing handle and opening a new one. +** +** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - +** it must exist and there must be either a blob or text value stored in +** the nominated column.)^ ^If the new row is not present in the table, or if +** it does not contain a blob or text value, or if another error occurs, an +** SQLite error code is returned and the blob handle is considered aborted. +** ^All subsequent calls to [sqlite3_blob_read()], [sqlite3_blob_write()] or +** [sqlite3_blob_reopen()] on an aborted blob handle immediately return +** SQLITE_ABORT. ^Calling [sqlite3_blob_bytes()] on an aborted blob handle +** always returns zero. +** +** ^This function sets the database handle error code and message. +*/ +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); + +/* +** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob +** +** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed +** unconditionally. Even if this routine returns an error code, the +** handle is still closed.)^ +** +** ^If the blob handle being closed was opened for read-write access, and if +** the database is in auto-commit mode and there are no other open read-write +** blob handles or active write statements, the current transaction is +** committed. ^If an error occurs while committing the transaction, an error +** code is returned and the transaction rolled back. +** +** Calling this function with an argument that is not a NULL pointer or an +** open blob handle results in undefined behaviour. ^Calling this routine +** with a null pointer (such as would be returned by a failed call to +** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function +** is passed a valid open blob handle, the values returned by the +** sqlite3_errcode() and sqlite3_errmsg() functions are set before returning. +*/ +SQLITE_API int sqlite3_blob_close(sqlite3_blob *); + +/* +** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob +** +** ^Returns the size in bytes of the BLOB accessible via the +** successfully opened [BLOB handle] in its only argument. ^The +** incremental blob I/O routines can only read or overwriting existing +** blob content; they cannot change the size of a blob. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +*/ +SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); + +/* +** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(This function is used to read data from an open [BLOB handle] into a +** caller-supplied buffer. N bytes of data are copied into buffer Z +** from the open BLOB, starting at offset iOffset.)^ +** +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is read. ^If N or iOffset is +** less than zero, [SQLITE_ERROR] is returned and no data is read. +** ^The size of the blob (and hence the maximum value of N+iOffset) +** can be determined using the [sqlite3_blob_bytes()] interface. +** +** ^An attempt to read from an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. +** +** ^(On success, sqlite3_blob_read() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_write()]. +*/ +SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); + +/* +** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob +** +** ^(This function is used to write data into an open [BLOB handle] from a +** caller-supplied buffer. N bytes of data are copied from the buffer Z +** into the open BLOB, starting at offset iOffset.)^ +** +** ^(On success, sqlite3_blob_write() returns SQLITE_OK. +** Otherwise, an [error code] or an [extended error code] is returned.)^ +** ^Unless SQLITE_MISUSE is returned, this function sets the +** [database connection] error code and message accessible via +** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. +** +** ^If the [BLOB handle] passed as the first argument was not opened for +** writing (the flags parameter to [sqlite3_blob_open()] was zero), +** this function returns [SQLITE_READONLY]. +** +** This function may only modify the contents of the BLOB; it is +** not possible to increase the size of a BLOB using this API. +** ^If offset iOffset is less than N bytes from the end of the BLOB, +** [SQLITE_ERROR] is returned and no data is written. The size of the +** BLOB (and hence the maximum value of N+iOffset) can be determined +** using the [sqlite3_blob_bytes()] interface. ^If N or iOffset are less +** than zero [SQLITE_ERROR] is returned and no data is written. +** +** ^An attempt to write to an expired [BLOB handle] fails with an +** error code of [SQLITE_ABORT]. ^Writes to the BLOB that occurred +** before the [BLOB handle] expired are not rolled back by the +** expiration of the handle, though of course those changes might +** have been overwritten by the statement that expired the BLOB handle +** or by other independent statements. +** +** This routine only works on a [BLOB handle] which has been created +** by a prior successful call to [sqlite3_blob_open()] and which has not +** been closed by [sqlite3_blob_close()]. Passing any other pointer in +** to this routine results in undefined and probably undesirable behavior. +** +** See also: [sqlite3_blob_read()]. +*/ +SQLITE_API int sqlite3_blob_write(sqlite3_blob *, const void *z, int n, int iOffset); + +/* +** CAPI3REF: Virtual File System Objects +** +** A virtual filesystem (VFS) is an [sqlite3_vfs] object +** that SQLite uses to interact +** with the underlying operating system. Most SQLite builds come with a +** single default VFS that is appropriate for the host computer. +** New VFSes can be registered and existing VFSes can be unregistered. +** The following interfaces are provided. +** +** ^The sqlite3_vfs_find() interface returns a pointer to a VFS given its name. +** ^Names are case sensitive. +** ^Names are zero-terminated UTF-8 strings. +** ^If there is no match, a NULL pointer is returned. +** ^If zVfsName is NULL then the default VFS is returned. +** +** ^New VFSes are registered with sqlite3_vfs_register(). +** ^Each new VFS becomes the default VFS if the makeDflt flag is set. +** ^The same VFS can be registered multiple times without injury. +** ^To make an existing VFS into the default VFS, register it again +** with the makeDflt flag set. If two different VFSes with the +** same name are registered, the behavior is undefined. If a +** VFS is registered with a name that is NULL or an empty string, +** then the behavior is undefined. +** +** ^Unregister a VFS with the sqlite3_vfs_unregister() interface. +** ^(If the default VFS is unregistered, another VFS is chosen as +** the default. The choice for the new VFS is arbitrary.)^ +*/ +SQLITE_API sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName); +SQLITE_API int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt); +SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); + +/* +** CAPI3REF: Mutexes +** +** The SQLite core uses these routines for thread +** synchronization. Though they are intended for internal +** use by SQLite, code that links against SQLite is +** permitted to use any of these routines. +** +** The SQLite source code contains multiple implementations +** of these mutex routines. An appropriate implementation +** is selected automatically at compile-time. The following +** implementations are available in the SQLite core: +** +**
      +**
    • SQLITE_MUTEX_PTHREADS +**
    • SQLITE_MUTEX_W32 +**
    • SQLITE_MUTEX_NOOP +**
    +** +** The SQLITE_MUTEX_NOOP implementation is a set of routines +** that does no real locking and is appropriate for use in +** a single-threaded application. The SQLITE_MUTEX_PTHREADS and +** SQLITE_MUTEX_W32 implementations are appropriate for use on Unix +** and Windows. +** +** If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor +** macro defined (with "-DSQLITE_MUTEX_APPDEF=1"), then no mutex +** implementation is included with the library. In this case the +** application must supply a custom mutex implementation using the +** [SQLITE_CONFIG_MUTEX] option of the sqlite3_config() function +** before calling sqlite3_initialize() or any other public sqlite3_ +** function that calls sqlite3_initialize(). +** +** ^The sqlite3_mutex_alloc() routine allocates a new +** mutex and returns a pointer to it. ^The sqlite3_mutex_alloc() +** routine returns NULL if it is unable to allocate the requested +** mutex. The argument to sqlite3_mutex_alloc() must one of these +** integer constants: +** +**
      +**
    • SQLITE_MUTEX_FAST +**
    • SQLITE_MUTEX_RECURSIVE +**
    • SQLITE_MUTEX_STATIC_MASTER +**
    • SQLITE_MUTEX_STATIC_MEM +**
    • SQLITE_MUTEX_STATIC_OPEN +**
    • SQLITE_MUTEX_STATIC_PRNG +**
    • SQLITE_MUTEX_STATIC_LRU +**
    • SQLITE_MUTEX_STATIC_PMEM +**
    • SQLITE_MUTEX_STATIC_APP1 +**
    • SQLITE_MUTEX_STATIC_APP2 +**
    • SQLITE_MUTEX_STATIC_APP3 +**
    • SQLITE_MUTEX_STATIC_VFS1 +**
    • SQLITE_MUTEX_STATIC_VFS2 +**
    • SQLITE_MUTEX_STATIC_VFS3 +**
    +** +** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) +** cause sqlite3_mutex_alloc() to create +** a new mutex. ^The new mutex is recursive when SQLITE_MUTEX_RECURSIVE +** is used but not necessarily so when SQLITE_MUTEX_FAST is used. +** The mutex implementation does not need to make a distinction +** between SQLITE_MUTEX_RECURSIVE and SQLITE_MUTEX_FAST if it does +** not want to. SQLite will only request a recursive mutex in +** cases where it really needs one. If a faster non-recursive mutex +** implementation is available on the host platform, the mutex subsystem +** might return such a mutex in response to SQLITE_MUTEX_FAST. +** +** ^The other allowed parameters to sqlite3_mutex_alloc() (anything other +** than SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) each return +** a pointer to a static preexisting mutex. ^Nine static mutexes are +** used by the current version of SQLite. Future versions of SQLite +** may add additional static mutexes. Static mutexes are for internal +** use by SQLite only. Applications that use SQLite mutexes should +** use only the dynamic mutexes returned by SQLITE_MUTEX_FAST or +** SQLITE_MUTEX_RECURSIVE. +** +** ^Note that if one of the dynamic mutex parameters (SQLITE_MUTEX_FAST +** or SQLITE_MUTEX_RECURSIVE) is used then sqlite3_mutex_alloc() +** returns a different mutex on every call. ^For the static +** mutex types, the same mutex is returned on every call that has +** the same type number. +** +** ^The sqlite3_mutex_free() routine deallocates a previously +** allocated dynamic mutex. Attempting to deallocate a static +** mutex results in undefined behavior. +** +** ^The sqlite3_mutex_enter() and sqlite3_mutex_try() routines attempt +** to enter a mutex. ^If another thread is already within the mutex, +** sqlite3_mutex_enter() will block and sqlite3_mutex_try() will return +** SQLITE_BUSY. ^The sqlite3_mutex_try() interface returns [SQLITE_OK] +** upon successful entry. ^(Mutexes created using +** SQLITE_MUTEX_RECURSIVE can be entered multiple times by the same thread. +** In such cases, the +** mutex must be exited an equal number of times before another thread +** can enter.)^ If the same thread tries to enter any mutex other +** than an SQLITE_MUTEX_RECURSIVE more than once, the behavior is undefined. +** +** ^(Some systems (for example, Windows 95) do not support the operation +** implemented by sqlite3_mutex_try(). On those systems, sqlite3_mutex_try() +** will always return SQLITE_BUSY. The SQLite core only ever uses +** sqlite3_mutex_try() as an optimization so this is acceptable +** behavior.)^ +** +** ^The sqlite3_mutex_leave() routine exits a mutex that was +** previously entered by the same thread. The behavior +** is undefined if the mutex is not currently entered by the +** calling thread or is not currently allocated. +** +** ^If the argument to sqlite3_mutex_enter(), sqlite3_mutex_try(), or +** sqlite3_mutex_leave() is a NULL pointer, then all three routines +** behave as no-ops. +** +** See also: [sqlite3_mutex_held()] and [sqlite3_mutex_notheld()]. +*/ +SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int); +SQLITE_API void sqlite3_mutex_free(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_try(sqlite3_mutex*); +SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex*); + +/* +** CAPI3REF: Mutex Methods Object +** +** An instance of this structure defines the low-level routines +** used to allocate and use mutexes. +** +** Usually, the default mutex implementations provided by SQLite are +** sufficient, however the application has the option of substituting a custom +** implementation for specialized deployments or systems for which SQLite +** does not provide a suitable implementation. In this case, the application +** creates and populates an instance of this structure to pass +** to sqlite3_config() along with the [SQLITE_CONFIG_MUTEX] option. +** Additionally, an instance of this structure can be used as an +** output variable when querying the system for the current mutex +** implementation, using the [SQLITE_CONFIG_GETMUTEX] option. +** +** ^The xMutexInit method defined by this structure is invoked as +** part of system initialization by the sqlite3_initialize() function. +** ^The xMutexInit routine is called by SQLite exactly once for each +** effective call to [sqlite3_initialize()]. +** +** ^The xMutexEnd method defined by this structure is invoked as +** part of system shutdown by the sqlite3_shutdown() function. The +** implementation of this method is expected to release all outstanding +** resources obtained by the mutex methods implementation, especially +** those obtained by the xMutexInit method. ^The xMutexEnd() +** interface is invoked exactly once for each call to [sqlite3_shutdown()]. +** +** ^(The remaining seven methods defined by this structure (xMutexAlloc, +** xMutexFree, xMutexEnter, xMutexTry, xMutexLeave, xMutexHeld and +** xMutexNotheld) implement the following interfaces (respectively): +** +**
      +**
    • [sqlite3_mutex_alloc()]
    • +**
    • [sqlite3_mutex_free()]
    • +**
    • [sqlite3_mutex_enter()]
    • +**
    • [sqlite3_mutex_try()]
    • +**
    • [sqlite3_mutex_leave()]
    • +**
    • [sqlite3_mutex_held()]
    • +**
    • [sqlite3_mutex_notheld()]
    • +**
    )^ +** +** The only difference is that the public sqlite3_XXX functions enumerated +** above silently ignore any invocations that pass a NULL pointer instead +** of a valid mutex handle. The implementations of the methods defined +** by this structure are not required to handle this case, the results +** of passing a NULL pointer instead of a valid mutex handle are undefined +** (i.e. it is acceptable to provide an implementation that segfaults if +** it is passed a NULL pointer). +** +** The xMutexInit() method must be threadsafe. It must be harmless to +** invoke xMutexInit() multiple times within the same process and without +** intervening calls to xMutexEnd(). Second and subsequent calls to +** xMutexInit() must be no-ops. +** +** xMutexInit() must not use SQLite memory allocation ([sqlite3_malloc()] +** and its associates). Similarly, xMutexAlloc() must not use SQLite memory +** allocation for a static mutex. ^However xMutexAlloc() may use SQLite +** memory allocation for a fast or recursive mutex. +** +** ^SQLite will invoke the xMutexEnd() method when [sqlite3_shutdown()] is +** called, but only if the prior call to xMutexInit returned SQLITE_OK. +** If xMutexInit fails in any way, it is expected to clean up after itself +** prior to returning. +*/ +typedef struct sqlite3_mutex_methods sqlite3_mutex_methods; +struct sqlite3_mutex_methods { + int (*xMutexInit)(void); + int (*xMutexEnd)(void); + sqlite3_mutex *(*xMutexAlloc)(int); + void (*xMutexFree)(sqlite3_mutex *); + void (*xMutexEnter)(sqlite3_mutex *); + int (*xMutexTry)(sqlite3_mutex *); + void (*xMutexLeave)(sqlite3_mutex *); + int (*xMutexHeld)(sqlite3_mutex *); + int (*xMutexNotheld)(sqlite3_mutex *); +}; + +/* +** CAPI3REF: Mutex Verification Routines +** +** The sqlite3_mutex_held() and sqlite3_mutex_notheld() routines +** are intended for use inside assert() statements. The SQLite core +** never uses these routines except inside an assert() and applications +** are advised to follow the lead of the core. The SQLite core only +** provides implementations for these routines when it is compiled +** with the SQLITE_DEBUG flag. External mutex implementations +** are only required to provide these routines if SQLITE_DEBUG is +** defined and if NDEBUG is not defined. +** +** These routines should return true if the mutex in their argument +** is held or not held, respectively, by the calling thread. +** +** The implementation is not required to provide versions of these +** routines that actually work. If the implementation does not provide working +** versions of these routines, it should at least provide stubs that always +** return true so that one does not get spurious assertion failures. +** +** If the argument to sqlite3_mutex_held() is a NULL pointer then +** the routine should return 1. This seems counter-intuitive since +** clearly the mutex cannot be held if it does not exist. But +** the reason the mutex does not exist is because the build is not +** using mutexes. And we do not want the assert() containing the +** call to sqlite3_mutex_held() to fail, so a non-zero return is +** the appropriate thing to do. The sqlite3_mutex_notheld() +** interface should also return 1 when given a NULL pointer. +*/ +#ifndef NDEBUG +SQLITE_API int sqlite3_mutex_held(sqlite3_mutex*); +SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); +#endif + +/* +** CAPI3REF: Mutex Types +** +** The [sqlite3_mutex_alloc()] interface takes a single argument +** which is one of these integer constants. +** +** The set of static mutexes may change from one SQLite release to the +** next. Applications that override the built-in mutex logic must be +** prepared to accommodate additional static mutexes. +*/ +#define SQLITE_MUTEX_FAST 0 +#define SQLITE_MUTEX_RECURSIVE 1 +#define SQLITE_MUTEX_STATIC_MASTER 2 +#define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ +#define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ +#define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ +#define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ +#define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ +#define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ +#define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ + +/* +** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 +** +** ^This interface returns a pointer the [sqlite3_mutex] object that +** serializes access to the [database connection] given in the argument +** when the [threading mode] is Serialized. +** ^If the [threading mode] is Single-thread or Multi-thread then this +** routine returns a NULL pointer. +*/ +SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); + +/* +** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 +** +** ^The [sqlite3_file_control()] interface makes a direct call to the +** xFileControl method for the [sqlite3_io_methods] object associated +** with a particular database identified by the second argument. ^The +** name of the database is "main" for the main database or "temp" for the +** TEMP database, or the name that appears after the AS keyword for +** databases that are added using the [ATTACH] SQL command. +** ^A NULL pointer can be used in place of "main" to refer to the +** main database file. +** ^The third and fourth parameters to this routine +** are passed directly through to the second and third parameters of +** the xFileControl method. ^The return value of the xFileControl +** method becomes the return value of this routine. +** +** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes +** a pointer to the underlying [sqlite3_file] object to be written into +** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER +** case is a short-circuit path which does not actually invoke the +** underlying sqlite3_io_methods.xFileControl method. +** +** ^If the second parameter (zDbName) does not match the name of any +** open database file, then SQLITE_ERROR is returned. ^This error +** code is not remembered and will not be recalled by [sqlite3_errcode()] +** or [sqlite3_errmsg()]. The underlying xFileControl method might +** also return SQLITE_ERROR. There is no way to distinguish between +** an incorrect zDbName and an SQLITE_ERROR return from the underlying +** xFileControl method. +** +** See also: [SQLITE_FCNTL_LOCKSTATE] +*/ +SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); + +/* +** CAPI3REF: Testing Interface +** +** ^The sqlite3_test_control() interface is used to read out internal +** state of SQLite and to inject faults into SQLite for testing +** purposes. ^The first parameter is an operation code that determines +** the number, meaning, and operation of all subsequent parameters. +** +** This interface is not for use by applications. It exists solely +** for verifying the correct operation of the SQLite library. Depending +** on how the SQLite library is compiled, this interface might not exist. +** +** The details of the operation codes, their meanings, the parameters +** they take, and what they do are all subject to change without notice. +** Unlike most of the SQLite API, this function is not guaranteed to +** operate consistently from one release to the next. +*/ +SQLITE_API int sqlite3_test_control(int op, ...); + +/* +** CAPI3REF: Testing Interface Operation Codes +** +** These constants are the valid operation code parameters used +** as the first argument to [sqlite3_test_control()]. +** +** These parameters and their meanings are subject to change +** without notice. These values are for testing purposes only. +** Applications should not use any of these parameters or the +** [sqlite3_test_control()] interface. +*/ +#define SQLITE_TESTCTRL_FIRST 5 +#define SQLITE_TESTCTRL_PRNG_SAVE 5 +#define SQLITE_TESTCTRL_PRNG_RESTORE 6 +#define SQLITE_TESTCTRL_PRNG_RESET 7 +#define SQLITE_TESTCTRL_BITVEC_TEST 8 +#define SQLITE_TESTCTRL_FAULT_INSTALL 9 +#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 +#define SQLITE_TESTCTRL_PENDING_BYTE 11 +#define SQLITE_TESTCTRL_ASSERT 12 +#define SQLITE_TESTCTRL_ALWAYS 13 +#define SQLITE_TESTCTRL_RESERVE 14 +#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 +#define SQLITE_TESTCTRL_ISKEYWORD 16 +#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 +#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 +#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 +#define SQLITE_TESTCTRL_NEVER_CORRUPT 20 +#define SQLITE_TESTCTRL_VDBE_COVERAGE 21 +#define SQLITE_TESTCTRL_BYTEORDER 22 +#define SQLITE_TESTCTRL_ISINIT 23 +#define SQLITE_TESTCTRL_SORTER_MMAP 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_LAST 25 + +/* +** CAPI3REF: SQLite Runtime Status +** +** ^These interfaces are used to retrieve runtime status information +** about the performance of SQLite, and optionally to reset various +** highwater marks. ^The first argument is an integer code for +** the specific parameter to measure. ^(Recognized integer codes +** are of the form [status parameters | SQLITE_STATUS_...].)^ +** ^The current value of the parameter is returned into *pCurrent. +** ^The highest recorded value is returned in *pHighwater. ^If the +** resetFlag is true, then the highest record value is reset after +** *pHighwater is written. ^(Some parameters do not record the highest +** value. For those parameters +** nothing is written into *pHighwater and the resetFlag is ignored.)^ +** ^(Other parameters record only the highwater mark and not the current +** value. For these latter parameters nothing is written into *pCurrent.)^ +** +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. +** +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. +** +** See also: [sqlite3_db_status()] +*/ +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); + + +/* +** CAPI3REF: Status Parameters +** KEYWORDS: {status parameters} +** +** These integer constants designate various run-time status parameters +** that can be returned by [sqlite3_status()]. +** +**
    +** [[SQLITE_STATUS_MEMORY_USED]] ^(
    SQLITE_STATUS_MEMORY_USED
    +**
    This parameter is the current amount of memory checked out +** using [sqlite3_malloc()], either directly or indirectly. The +** figure includes calls made to [sqlite3_malloc()] by the application +** and internal memory usage by the SQLite library. Scratch memory +** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache +** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in +** this parameter. The amount returned is the sum of the allocation +** sizes as reported by the xSize method in [sqlite3_mem_methods].
    )^ +** +** [[SQLITE_STATUS_MALLOC_SIZE]] ^(
    SQLITE_STATUS_MALLOC_SIZE
    +**
    This parameter records the largest memory allocation request +** handed to [sqlite3_malloc()] or [sqlite3_realloc()] (or their +** internal equivalents). Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
    )^ +** +** [[SQLITE_STATUS_MALLOC_COUNT]] ^(
    SQLITE_STATUS_MALLOC_COUNT
    +**
    This parameter records the number of separate memory allocations +** currently checked out.
    )^ +** +** [[SQLITE_STATUS_PAGECACHE_USED]] ^(
    SQLITE_STATUS_PAGECACHE_USED
    +**
    This parameter returns the number of pages used out of the +** [pagecache memory allocator] that was configured using +** [SQLITE_CONFIG_PAGECACHE]. The +** value returned is in pages, not in bytes.
    )^ +** +** [[SQLITE_STATUS_PAGECACHE_OVERFLOW]] +** ^(
    SQLITE_STATUS_PAGECACHE_OVERFLOW
    +**
    This parameter returns the number of bytes of page cache +** allocation which could not be satisfied by the [SQLITE_CONFIG_PAGECACHE] +** buffer and where forced to overflow to [sqlite3_malloc()]. The +** returned value includes allocations that overflowed because they +** where too large (they were larger than the "sz" parameter to +** [SQLITE_CONFIG_PAGECACHE]) and allocations that overflowed because +** no space was left in the page cache.
    )^ +** +** [[SQLITE_STATUS_PAGECACHE_SIZE]] ^(
    SQLITE_STATUS_PAGECACHE_SIZE
    +**
    This parameter records the largest memory allocation request +** handed to [pagecache memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
    )^ +** +** [[SQLITE_STATUS_SCRATCH_USED]] ^(
    SQLITE_STATUS_SCRATCH_USED
    +**
    This parameter returns the number of allocations used out of the +** [scratch memory allocator] configured using +** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not +** in bytes. Since a single thread may only have one scratch allocation +** outstanding at time, this parameter also reports the number of threads +** using scratch memory at the same time.
    )^ +** +** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(
    SQLITE_STATUS_SCRATCH_OVERFLOW
    +**
    This parameter returns the number of bytes of scratch memory +** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] +** buffer and where forced to overflow to [sqlite3_malloc()]. The values +** returned include overflows because the requested allocation was too +** larger (that is, because the requested allocation was larger than the +** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer +** slots were available. +**
    )^ +** +** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(
    SQLITE_STATUS_SCRATCH_SIZE
    +**
    This parameter records the largest memory allocation request +** handed to [scratch memory allocator]. Only the value returned in the +** *pHighwater parameter to [sqlite3_status()] is of interest. +** The value written into the *pCurrent parameter is undefined.
    )^ +** +** [[SQLITE_STATUS_PARSER_STACK]] ^(
    SQLITE_STATUS_PARSER_STACK
    +**
    The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only +** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].
    )^ +**
    +** +** New status parameters may be added from time to time. +*/ +#define SQLITE_STATUS_MEMORY_USED 0 +#define SQLITE_STATUS_PAGECACHE_USED 1 +#define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 +#define SQLITE_STATUS_SCRATCH_USED 3 +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 +#define SQLITE_STATUS_MALLOC_SIZE 5 +#define SQLITE_STATUS_PARSER_STACK 6 +#define SQLITE_STATUS_PAGECACHE_SIZE 7 +#define SQLITE_STATUS_SCRATCH_SIZE 8 +#define SQLITE_STATUS_MALLOC_COUNT 9 + +/* +** CAPI3REF: Database Connection Status +** METHOD: sqlite3 +** +** ^This interface is used to retrieve runtime status information +** about a single [database connection]. ^The first argument is the +** database connection object to be interrogated. ^The second argument +** is an integer constant, taken from the set of +** [SQLITE_DBSTATUS options], that +** determines the parameter to interrogate. The set of +** [SQLITE_DBSTATUS options] is likely +** to grow in future releases of SQLite. +** +** ^The current value of the requested parameter is written into *pCur +** and the highest instantaneous value is written into *pHiwtr. ^If +** the resetFlg is true, then the highest instantaneous value is +** reset back down to the current value. +** +** ^The sqlite3_db_status() routine returns SQLITE_OK on success and a +** non-zero [error code] on failure. +** +** See also: [sqlite3_status()] and [sqlite3_stmt_status()]. +*/ +SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int resetFlg); + +/* +** CAPI3REF: Status Parameters for database connections +** KEYWORDS: {SQLITE_DBSTATUS options} +** +** These constants are the available integer "verbs" that can be passed as +** the second argument to the [sqlite3_db_status()] interface. +** +** New verbs may be added in future releases of SQLite. Existing verbs +** might be discontinued. Applications should check the return code from +** [sqlite3_db_status()] to make sure that the call worked. +** The [sqlite3_db_status()] interface will return a non-zero error code +** if a discontinued or unsupported verb is invoked. +** +**
    +** [[SQLITE_DBSTATUS_LOOKASIDE_USED]] ^(
    SQLITE_DBSTATUS_LOOKASIDE_USED
    +**
    This parameter returns the number of lookaside memory slots currently +** checked out.
    )^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_HIT]] ^(
    SQLITE_DBSTATUS_LOOKASIDE_HIT
    +**
    This parameter returns the number malloc attempts that were +** satisfied using lookaside memory. Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE]] +** ^(
    SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
    +**
    This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to the amount of +** memory requested being larger than the lookaside slot size. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL]] +** ^(
    SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
    +**
    This parameter returns the number malloc attempts that might have +** been satisfied using lookaside memory but failed due to all lookaside +** memory already being in use. +** Only the high-water value is meaningful; +** the current value is always zero.)^ +** +** [[SQLITE_DBSTATUS_CACHE_USED]] ^(
    SQLITE_DBSTATUS_CACHE_USED
    +**
    This parameter returns the approximate number of bytes of heap +** memory used by all pager caches associated with the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. +** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(
    SQLITE_DBSTATUS_CACHE_USED_SHARED
    +**
    This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** +** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(
    SQLITE_DBSTATUS_SCHEMA_USED
    +**
    This parameter returns the approximate number of bytes of heap +** memory used to store the schema for all databases associated +** with the connection - main, temp, and any [ATTACH]-ed databases.)^ +** ^The full amount of memory used by the schemas is reported, even if the +** schema memory is shared with other database connections due to +** [shared cache mode] being enabled. +** ^The highwater mark associated with SQLITE_DBSTATUS_SCHEMA_USED is always 0. +** +** [[SQLITE_DBSTATUS_STMT_USED]] ^(
    SQLITE_DBSTATUS_STMT_USED
    +**
    This parameter returns the approximate number of bytes of heap +** and lookaside memory used by all prepared statements associated with +** the database connection.)^ +** ^The highwater mark associated with SQLITE_DBSTATUS_STMT_USED is always 0. +**
    +** +** [[SQLITE_DBSTATUS_CACHE_HIT]] ^(
    SQLITE_DBSTATUS_CACHE_HIT
    +**
    This parameter returns the number of pager cache hits that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_HIT +** is always 0. +**
    +** +** [[SQLITE_DBSTATUS_CACHE_MISS]] ^(
    SQLITE_DBSTATUS_CACHE_MISS
    +**
    This parameter returns the number of pager cache misses that have +** occurred.)^ ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_MISS +** is always 0. +**
    +** +** [[SQLITE_DBSTATUS_CACHE_WRITE]] ^(
    SQLITE_DBSTATUS_CACHE_WRITE
    +**
    This parameter returns the number of dirty cache entries that have +** been written to disk. Specifically, the number of pages written to the +** wal file in wal mode databases, or the number of pages written to the +** database file in rollback mode databases. Any pages written as part of +** transaction rollback or database recovery operations are not included. +** If an IO or other error occurs while writing a page to disk, the effect +** on subsequent SQLITE_DBSTATUS_CACHE_WRITE requests is undefined.)^ ^The +** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. +**
    +** +** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(
    SQLITE_DBSTATUS_DEFERRED_FKS
    +**
    This parameter returns zero for the current value if and only if +** all foreign key constraints (deferred or immediate) have been +** resolved.)^ ^The highwater mark is always 0. +**
    +**
    +*/ +#define SQLITE_DBSTATUS_LOOKASIDE_USED 0 +#define SQLITE_DBSTATUS_CACHE_USED 1 +#define SQLITE_DBSTATUS_SCHEMA_USED 2 +#define SQLITE_DBSTATUS_STMT_USED 3 +#define SQLITE_DBSTATUS_LOOKASIDE_HIT 4 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5 +#define SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6 +#define SQLITE_DBSTATUS_CACHE_HIT 7 +#define SQLITE_DBSTATUS_CACHE_MISS 8 +#define SQLITE_DBSTATUS_CACHE_WRITE 9 +#define SQLITE_DBSTATUS_DEFERRED_FKS 10 +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_MAX 11 /* Largest defined DBSTATUS */ + + +/* +** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt +** +** ^(Each prepared statement maintains various +** [SQLITE_STMTSTATUS counters] that measure the number +** of times it has performed specific operations.)^ These counters can +** be used to monitor the performance characteristics of the prepared +** statements. For example, if the number of table steps greatly exceeds +** the number of table searches or result rows, that would tend to indicate +** that the prepared statement is using a full table scan rather than +** an index. +** +** ^(This interface is used to retrieve and reset counter values from +** a [prepared statement]. The first argument is the prepared statement +** object to be interrogated. The second argument +** is an integer code for a specific [SQLITE_STMTSTATUS counter] +** to be interrogated.)^ +** ^The current value of the requested counter is returned. +** ^If the resetFlg is true, then the counter is reset to zero after this +** interface call returns. +** +** See also: [sqlite3_status()] and [sqlite3_db_status()]. +*/ +SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); + +/* +** CAPI3REF: Status Parameters for prepared statements +** KEYWORDS: {SQLITE_STMTSTATUS counter} {SQLITE_STMTSTATUS counters} +** +** These preprocessor macros define integer codes that name counter +** values associated with the [sqlite3_stmt_status()] interface. +** The meanings of the various counters are as follows: +** +**
    +** [[SQLITE_STMTSTATUS_FULLSCAN_STEP]]
    SQLITE_STMTSTATUS_FULLSCAN_STEP
    +**
    ^This is the number of times that SQLite has stepped forward in +** a table as part of a full table scan. Large numbers for this counter +** may indicate opportunities for performance improvement through +** careful use of indices.
    +** +** [[SQLITE_STMTSTATUS_SORT]]
    SQLITE_STMTSTATUS_SORT
    +**
    ^This is the number of sort operations that have occurred. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance through careful use of indices.
    +** +** [[SQLITE_STMTSTATUS_AUTOINDEX]]
    SQLITE_STMTSTATUS_AUTOINDEX
    +**
    ^This is the number of rows inserted into transient indices that +** were created automatically in order to help joins run faster. +** A non-zero value in this counter may indicate an opportunity to +** improvement performance by adding permanent indices that do not +** need to be reinitialized each time the statement is run.
    +** +** [[SQLITE_STMTSTATUS_VM_STEP]]
    SQLITE_STMTSTATUS_VM_STEP
    +**
    ^This is the number of virtual machine operations executed +** by the prepared statement if that number is less than or equal +** to 2147483647. The number of virtual machine operations can be +** used as a proxy for the total work done by the prepared statement. +** If the number of virtual machine operations exceeds 2147483647 +** then the value returned by this statement status code is undefined. +**
    +**
    +*/ +#define SQLITE_STMTSTATUS_FULLSCAN_STEP 1 +#define SQLITE_STMTSTATUS_SORT 2 +#define SQLITE_STMTSTATUS_AUTOINDEX 3 +#define SQLITE_STMTSTATUS_VM_STEP 4 + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache type is opaque. It is implemented by +** the pluggable module. The SQLite core has no knowledge of +** its size or internal structure and never deals with the +** sqlite3_pcache object except by holding and passing pointers +** to the object. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache sqlite3_pcache; + +/* +** CAPI3REF: Custom Page Cache Object +** +** The sqlite3_pcache_page object represents a single page in the +** page cache. The page cache will allocate instances of this +** object. Various methods of the page cache use pointers to instances +** of this object as parameters or as their return value. +** +** See [sqlite3_pcache_methods2] for additional information. +*/ +typedef struct sqlite3_pcache_page sqlite3_pcache_page; +struct sqlite3_pcache_page { + void *pBuf; /* The content of the page */ + void *pExtra; /* Extra information associated with the page */ +}; + +/* +** CAPI3REF: Application Defined Page Cache. +** KEYWORDS: {page cache} +** +** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can +** register an alternative page cache implementation by passing in an +** instance of the sqlite3_pcache_methods2 structure.)^ +** In many applications, most of the heap memory allocated by +** SQLite is used for the page cache. +** By implementing a +** custom page cache using this API, an application can better control +** the amount of memory consumed by SQLite, the way in which +** that memory is allocated and released, and the policies used to +** determine exactly which parts of a database file are cached and for +** how long. +** +** The alternative page cache mechanism is an +** extreme measure that is only needed by the most demanding applications. +** The built-in page cache is recommended for most uses. +** +** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an +** internal buffer by SQLite within the call to [sqlite3_config]. Hence +** the application may discard the parameter after the call to +** [sqlite3_config()] returns.)^ +** +** [[the xInit() page cache method]] +** ^(The xInit() method is called once for each effective +** call to [sqlite3_initialize()])^ +** (usually only once during the lifetime of the process). ^(The xInit() +** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ +** The intent of the xInit() method is to set up global data structures +** required by the custom page cache implementation. +** ^(If the xInit() method is NULL, then the +** built-in default page cache is used instead of the application defined +** page cache.)^ +** +** [[the xShutdown() page cache method]] +** ^The xShutdown() method is called by [sqlite3_shutdown()]. +** It can be used to clean up +** any outstanding resources before process shutdown, if required. +** ^The xShutdown() method may be NULL. +** +** ^SQLite automatically serializes calls to the xInit method, +** so the xInit method need not be threadsafe. ^The +** xShutdown method is only called from [sqlite3_shutdown()] so it does +** not need to be threadsafe either. All other methods must be threadsafe +** in multithreaded applications. +** +** ^SQLite will never invoke xInit() more than once without an intervening +** call to xShutdown(). +** +** [[the xCreate() page cache methods]] +** ^SQLite invokes the xCreate() method to construct a new cache instance. +** SQLite will typically create one cache instance for each open database file, +** though this is not guaranteed. ^The +** first parameter, szPage, is the size in bytes of the pages that must +** be allocated by the cache. ^szPage will always a power of two. ^The +** second parameter szExtra is a number of bytes of extra storage +** associated with each page cache entry. ^The szExtra parameter will +** a number less than 250. SQLite will use the +** extra szExtra bytes on each page to store metadata about the underlying +** database page on disk. The value passed into szExtra depends +** on the SQLite version, the target platform, and how SQLite was compiled. +** ^The third argument to xCreate(), bPurgeable, is true if the cache being +** created will be used to cache database pages of a file stored on disk, or +** false if it is used for an in-memory database. The cache implementation +** does not have to do anything special based with the value of bPurgeable; +** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will +** never invoke xUnpin() except to deliberately delete a page. +** ^In other words, calls to xUnpin() on a cache with bPurgeable set to +** false will always have the "discard" flag set to true. +** ^Hence, a cache created with bPurgeable false will +** never contain any unpinned pages. +** +** [[the xCachesize() page cache method]] +** ^(The xCachesize() method may be called at any time by SQLite to set the +** suggested maximum cache-size (number of pages stored by) the cache +** instance passed as the first argument. This is the value configured using +** the SQLite "[PRAGMA cache_size]" command.)^ As with the bPurgeable +** parameter, the implementation is not required to do anything with this +** value; it is advisory only. +** +** [[the xPagecount() page cache methods]] +** The xPagecount() method must return the number of pages currently +** stored in the cache, both pinned and unpinned. +** +** [[the xFetch() page cache methods]] +** The xFetch() method locates a page in the cache and returns a pointer to +** an sqlite3_pcache_page object associated with that page, or a NULL pointer. +** The pBuf element of the returned sqlite3_pcache_page object will be a +** pointer to a buffer of szPage bytes used to store the content of a +** single database page. The pExtra element of sqlite3_pcache_page will be +** a pointer to the szExtra bytes of extra storage that SQLite has requested +** for each entry in the page cache. +** +** The page to be fetched is determined by the key. ^The minimum key value +** is 1. After it has been retrieved using xFetch, the page is considered +** to be "pinned". +** +** If the requested page is already in the page cache, then the page cache +** implementation must return a pointer to the page buffer with its content +** intact. If the requested page is not already in the cache, then the +** cache implementation should use the value of the createFlag +** parameter to help it determined what action to take: +** +** +**
    createFlag Behavior when page is not already in cache +**
    0 Do not allocate a new page. Return NULL. +**
    1 Allocate a new page if it easy and convenient to do so. +** Otherwise return NULL. +**
    2 Make every effort to allocate a new page. Only return +** NULL if allocating a new page is effectively impossible. +**
    +** +** ^(SQLite will normally invoke xFetch() with a createFlag of 0 or 1. SQLite +** will only use a createFlag of 2 after a prior call with a createFlag of 1 +** failed.)^ In between the to xFetch() calls, SQLite may +** attempt to unpin one or more cache pages by spilling the content of +** pinned pages to disk and synching the operating system disk cache. +** +** [[the xUnpin() page cache method]] +** ^xUnpin() is called by SQLite with a pointer to a currently pinned page +** as its second argument. If the third parameter, discard, is non-zero, +** then the page must be evicted from the cache. +** ^If the discard parameter is +** zero, then the page may be discarded or retained at the discretion of +** page cache implementation. ^The page cache implementation +** may choose to evict unpinned pages at any time. +** +** The cache must not perform any reference counting. A single +** call to xUnpin() unpins the page regardless of the number of prior calls +** to xFetch(). +** +** [[the xRekey() page cache methods]] +** The xRekey() method is used to change the key value associated with the +** page passed as the second argument. If the cache +** previously contains an entry associated with newKey, it must be +** discarded. ^Any prior cache entry associated with newKey is guaranteed not +** to be pinned. +** +** When SQLite calls the xTruncate() method, the cache must discard all +** existing cache entries with page numbers (keys) greater than or equal +** to the value of the iLimit parameter passed to xTruncate(). If any +** of these pages are pinned, they are implicitly unpinned, meaning that +** they can be safely discarded. +** +** [[the xDestroy() page cache method]] +** ^The xDestroy() method is used to delete a cache allocated by xCreate(). +** All resources associated with the specified cache should be freed. ^After +** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] +** handle invalid, and will not use it with any other sqlite3_pcache_methods2 +** functions. +** +** [[the xShrink() page cache method]] +** ^SQLite invokes the xShrink() method when it wants the page cache to +** free up as much of heap memory as possible. The page cache implementation +** is not obligated to free any memory, but well-behaved implementations should +** do their best. +*/ +typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; +struct sqlite3_pcache_methods2 { + int iVersion; + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); + void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, + unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); + void (*xShrink)(sqlite3_pcache*); +}; + +/* +** This is the obsolete pcache_methods object that has now been replaced +** by sqlite3_pcache_methods2. This object is not used by SQLite. It is +** retained in the header file for backwards compatibility only. +*/ +typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; +struct sqlite3_pcache_methods { + void *pArg; + int (*xInit)(void*); + void (*xShutdown)(void*); + sqlite3_pcache *(*xCreate)(int szPage, int bPurgeable); + void (*xCachesize)(sqlite3_pcache*, int nCachesize); + int (*xPagecount)(sqlite3_pcache*); + void *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); + void (*xUnpin)(sqlite3_pcache*, void*, int discard); + void (*xRekey)(sqlite3_pcache*, void*, unsigned oldKey, unsigned newKey); + void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); + void (*xDestroy)(sqlite3_pcache*); +}; + + +/* +** CAPI3REF: Online Backup Object +** +** The sqlite3_backup object records state information about an ongoing +** online backup operation. ^The sqlite3_backup object is created by +** a call to [sqlite3_backup_init()] and is destroyed by a call to +** [sqlite3_backup_finish()]. +** +** See Also: [Using the SQLite Online Backup API] +*/ +typedef struct sqlite3_backup sqlite3_backup; + +/* +** CAPI3REF: Online Backup API. +** +** The backup API copies the content of one database into another. +** It is useful either for creating backups of databases or +** for copying in-memory databases to or from persistent files. +** +** See Also: [Using the SQLite Online Backup API] +** +** ^SQLite holds a write transaction open on the destination database file +** for the duration of the backup operation. +** ^The source database is read-locked only while it is being read; +** it is not locked continuously for the entire backup operation. +** ^Thus, the backup may be performed on a live source database without +** preventing other database connections from +** reading or writing to the source database while the backup is underway. +** +** ^(To perform a backup operation: +**
      +**
    1. sqlite3_backup_init() is called once to initialize the +** backup, +**
    2. sqlite3_backup_step() is called one or more times to transfer +** the data between the two databases, and finally +**
    3. sqlite3_backup_finish() is called to release all resources +** associated with the backup operation. +**
    )^ +** There should be exactly one call to sqlite3_backup_finish() for each +** successful call to sqlite3_backup_init(). +** +** [[sqlite3_backup_init()]] sqlite3_backup_init() +** +** ^The D and N arguments to sqlite3_backup_init(D,N,S,M) are the +** [database connection] associated with the destination database +** and the database name, respectively. +** ^The database name is "main" for the main database, "temp" for the +** temporary database, or the name specified after the AS keyword in +** an [ATTACH] statement for an attached database. +** ^The S and M arguments passed to +** sqlite3_backup_init(D,N,S,M) identify the [database connection] +** and database name of the source database, respectively. +** ^The source and destination [database connections] (parameters S and D) +** must be different or else sqlite3_backup_init(D,N,S,M) will fail with +** an error. +** +** ^A call to sqlite3_backup_init() will fail, returning NULL, if +** there is already a read or read-write transaction open on the +** destination database. +** +** ^If an error occurs within sqlite3_backup_init(D,N,S,M), then NULL is +** returned and an error code and error message are stored in the +** destination [database connection] D. +** ^The error code and message for the failed call to sqlite3_backup_init() +** can be retrieved using the [sqlite3_errcode()], [sqlite3_errmsg()], and/or +** [sqlite3_errmsg16()] functions. +** ^A successful call to sqlite3_backup_init() returns a pointer to an +** [sqlite3_backup] object. +** ^The [sqlite3_backup] object may be used with the sqlite3_backup_step() and +** sqlite3_backup_finish() functions to perform the specified backup +** operation. +** +** [[sqlite3_backup_step()]] sqlite3_backup_step() +** +** ^Function sqlite3_backup_step(B,N) will copy up to N pages between +** the source and destination databases specified by [sqlite3_backup] object B. +** ^If N is negative, all remaining source pages are copied. +** ^If sqlite3_backup_step(B,N) successfully copies N pages and there +** are still more pages to be copied, then the function returns [SQLITE_OK]. +** ^If sqlite3_backup_step(B,N) successfully finishes copying all pages +** from source to destination, then it returns [SQLITE_DONE]. +** ^If an error occurs while running sqlite3_backup_step(B,N), +** then an [error code] is returned. ^As well as [SQLITE_OK] and +** [SQLITE_DONE], a call to sqlite3_backup_step() may return [SQLITE_READONLY], +** [SQLITE_NOMEM], [SQLITE_BUSY], [SQLITE_LOCKED], or an +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX] extended error code. +** +** ^(The sqlite3_backup_step() might return [SQLITE_READONLY] if +**
      +**
    1. the destination database was opened read-only, or +**
    2. the destination database is using write-ahead-log journaling +** and the destination and source page sizes differ, or +**
    3. the destination database is an in-memory database and the +** destination and source page sizes differ. +**
    )^ +** +** ^If sqlite3_backup_step() cannot obtain a required file-system lock, then +** the [sqlite3_busy_handler | busy-handler function] +** is invoked (if one is specified). ^If the +** busy-handler returns non-zero before the lock is available, then +** [SQLITE_BUSY] is returned to the caller. ^In this case the call to +** sqlite3_backup_step() can be retried later. ^If the source +** [database connection] +** is being used to write to the source database when sqlite3_backup_step() +** is called, then [SQLITE_LOCKED] is returned immediately. ^Again, in this +** case the call to sqlite3_backup_step() can be retried later on. ^(If +** [SQLITE_IOERR_ACCESS | SQLITE_IOERR_XXX], [SQLITE_NOMEM], or +** [SQLITE_READONLY] is returned, then +** there is no point in retrying the call to sqlite3_backup_step(). These +** errors are considered fatal.)^ The application must accept +** that the backup operation has failed and pass the backup operation handle +** to the sqlite3_backup_finish() to release associated resources. +** +** ^The first call to sqlite3_backup_step() obtains an exclusive lock +** on the destination file. ^The exclusive lock is not released until either +** sqlite3_backup_finish() is called or the backup operation is complete +** and sqlite3_backup_step() returns [SQLITE_DONE]. ^Every call to +** sqlite3_backup_step() obtains a [shared lock] on the source database that +** lasts for the duration of the sqlite3_backup_step() call. +** ^Because the source database is not locked between calls to +** sqlite3_backup_step(), the source database may be modified mid-way +** through the backup process. ^If the source database is modified by an +** external process or via a database connection other than the one being +** used by the backup operation, then the backup will be automatically +** restarted by the next call to sqlite3_backup_step(). ^If the source +** database is modified by the using the same database connection as is used +** by the backup operation, then the backup database is automatically +** updated at the same time. +** +** [[sqlite3_backup_finish()]] sqlite3_backup_finish() +** +** When sqlite3_backup_step() has returned [SQLITE_DONE], or when the +** application wishes to abandon the backup operation, the application +** should destroy the [sqlite3_backup] by passing it to sqlite3_backup_finish(). +** ^The sqlite3_backup_finish() interfaces releases all +** resources associated with the [sqlite3_backup] object. +** ^If sqlite3_backup_step() has not yet returned [SQLITE_DONE], then any +** active write-transaction on the destination database is rolled back. +** The [sqlite3_backup] object is invalid +** and may not be used following a call to sqlite3_backup_finish(). +** +** ^The value returned by sqlite3_backup_finish is [SQLITE_OK] if no +** sqlite3_backup_step() errors occurred, regardless or whether or not +** sqlite3_backup_step() completed. +** ^If an out-of-memory condition or IO error occurred during any prior +** sqlite3_backup_step() call on the same [sqlite3_backup] object, then +** sqlite3_backup_finish() returns the corresponding [error code]. +** +** ^A return of [SQLITE_BUSY] or [SQLITE_LOCKED] from sqlite3_backup_step() +** is not a permanent error and does not affect the return value of +** sqlite3_backup_finish(). +** +** [[sqlite3_backup_remaining()]] [[sqlite3_backup_pagecount()]] +** sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ +** +** Concurrent Usage of Database Handles +** +** ^The source [database connection] may be used by the application for other +** purposes while a backup operation is underway or being initialized. +** ^If SQLite is compiled and configured to support threadsafe database +** connections, then the source database connection may be used concurrently +** from within other threads. +** +** However, the application must guarantee that the destination +** [database connection] is not passed to any other API (by any thread) after +** sqlite3_backup_init() is called and before the corresponding call to +** sqlite3_backup_finish(). SQLite does not currently check to see +** if the application incorrectly accesses the destination [database connection] +** and so no error code is reported, but the operations may malfunction +** nevertheless. Use of the destination database connection while a +** backup is in progress might also also cause a mutex deadlock. +** +** If running in [shared cache mode], the application must +** guarantee that the shared cache used by the destination database +** is not accessed while the backup is running. In practice this means +** that the application must guarantee that the disk file being +** backed up to is not accessed by any connection within the process, +** not just the specific connection that was passed to sqlite3_backup_init(). +** +** The [sqlite3_backup] object itself is partially threadsafe. Multiple +** threads may safely make multiple concurrent calls to sqlite3_backup_step(). +** However, the sqlite3_backup_remaining() and sqlite3_backup_pagecount() +** APIs are not strictly speaking threadsafe. If they are invoked at the +** same time as another thread is invoking sqlite3_backup_step() it is +** possible that they return invalid values. +*/ +SQLITE_API sqlite3_backup *sqlite3_backup_init( + sqlite3 *pDest, /* Destination database handle */ + const char *zDestName, /* Destination database name */ + sqlite3 *pSource, /* Source database handle */ + const char *zSourceName /* Source database name */ +); +SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage); +SQLITE_API int sqlite3_backup_finish(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_remaining(sqlite3_backup *p); +SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); + +/* +** CAPI3REF: Unlock Notification +** METHOD: sqlite3 +** +** ^When running in shared-cache mode, a database operation may fail with +** an [SQLITE_LOCKED] error if the required locks on the shared-cache or +** individual tables within the shared-cache cannot be obtained. See +** [SQLite Shared-Cache Mode] for a description of shared-cache locking. +** ^This API may be used to register a callback that SQLite will invoke +** when the connection currently holding the required lock relinquishes it. +** ^This API is only available if the library was compiled with the +** [SQLITE_ENABLE_UNLOCK_NOTIFY] C-preprocessor symbol defined. +** +** See Also: [Using the SQLite Unlock Notification Feature]. +** +** ^Shared-cache locks are released when a database connection concludes +** its current transaction, either by committing it or rolling it back. +** +** ^When a connection (known as the blocked connection) fails to obtain a +** shared-cache lock and SQLITE_LOCKED is returned to the caller, the +** identity of the database connection (the blocking connection) that +** has locked the required resource is stored internally. ^After an +** application receives an SQLITE_LOCKED error, it may call the +** sqlite3_unlock_notify() method with the blocked connection handle as +** the first argument to register for a callback that will be invoked +** when the blocking connections current transaction is concluded. ^The +** callback is invoked from within the [sqlite3_step] or [sqlite3_close] +** call that concludes the blocking connections transaction. +** +** ^(If sqlite3_unlock_notify() is called in a multi-threaded application, +** there is a chance that the blocking connection will have already +** concluded its transaction by the time sqlite3_unlock_notify() is invoked. +** If this happens, then the specified callback is invoked immediately, +** from within the call to sqlite3_unlock_notify().)^ +** +** ^If the blocked connection is attempting to obtain a write-lock on a +** shared-cache table, and more than one other connection currently holds +** a read-lock on the same table, then SQLite arbitrarily selects one of +** the other connections to use as the blocking connection. +** +** ^(There may be at most one unlock-notify callback registered by a +** blocked connection. If sqlite3_unlock_notify() is called when the +** blocked connection already has a registered unlock-notify callback, +** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is +** called with a NULL pointer as its second argument, then any existing +** unlock-notify callback is canceled. ^The blocked connections +** unlock-notify callback may also be canceled by closing the blocked +** connection using [sqlite3_close()]. +** +** The unlock-notify callback is not reentrant. If an application invokes +** any sqlite3_xxx API functions from within an unlock-notify callback, a +** crash or deadlock may be the result. +** +** ^Unless deadlock is detected (see below), sqlite3_unlock_notify() always +** returns SQLITE_OK. +** +** Callback Invocation Details +** +** When an unlock-notify callback is registered, the application provides a +** single void* pointer that is passed to the callback when it is invoked. +** However, the signature of the callback function allows SQLite to pass +** it an array of void* context pointers. The first argument passed to +** an unlock-notify callback is a pointer to an array of void* pointers, +** and the second is the number of entries in the array. +** +** When a blocking connections transaction is concluded, there may be +** more than one blocked connection that has registered for an unlock-notify +** callback. ^If two or more such blocked connections have specified the +** same callback function, then instead of invoking the callback function +** multiple times, it is invoked once with the set of void* context pointers +** specified by the blocked connections bundled together into an array. +** This gives the application an opportunity to prioritize any actions +** related to the set of unblocked database connections. +** +** Deadlock Detection +** +** Assuming that after registering for an unlock-notify callback a +** database waits for the callback to be issued before taking any further +** action (a reasonable assumption), then using this API may cause the +** application to deadlock. For example, if connection X is waiting for +** connection Y's transaction to be concluded, and similarly connection +** Y is waiting on connection X's transaction, then neither connection +** will proceed and the system may remain deadlocked indefinitely. +** +** To avoid this scenario, the sqlite3_unlock_notify() performs deadlock +** detection. ^If a given call to sqlite3_unlock_notify() would put the +** system in a deadlocked state, then SQLITE_LOCKED is returned and no +** unlock-notify callback is registered. The system is said to be in +** a deadlocked state if connection A has registered for an unlock-notify +** callback on the conclusion of connection B's transaction, and connection +** B has itself registered for an unlock-notify callback when connection +** A's transaction is concluded. ^Indirect deadlock is also detected, so +** the system is also considered to be deadlocked if connection B has +** registered for an unlock-notify callback on the conclusion of connection +** C's transaction, where connection C is waiting on connection A. ^Any +** number of levels of indirection are allowed. +** +** The "DROP TABLE" Exception +** +** When a call to [sqlite3_step()] returns SQLITE_LOCKED, it is almost +** always appropriate to call sqlite3_unlock_notify(). There is however, +** one exception. When executing a "DROP TABLE" or "DROP INDEX" statement, +** SQLite checks if there are any currently executing SELECT statements +** that belong to the same connection. If there are, SQLITE_LOCKED is +** returned. In this case there is no "blocking connection", so invoking +** sqlite3_unlock_notify() results in the unlock-notify callback being +** invoked immediately. If the application then re-attempts the "DROP TABLE" +** or "DROP INDEX" query, an infinite loop might be the result. +** +** One way around this problem is to check the extended error code returned +** by an sqlite3_step() call. ^(If there is a blocking connection, then the +** extended error code is set to SQLITE_LOCKED_SHAREDCACHE. Otherwise, in +** the special "DROP TABLE/INDEX" case, the extended error code is just +** SQLITE_LOCKED.)^ +*/ +SQLITE_API int sqlite3_unlock_notify( + sqlite3 *pBlocked, /* Waiting connection */ + void (*xNotify)(void **apArg, int nArg), /* Callback function to invoke */ + void *pNotifyArg /* Argument to pass to xNotify */ +); + + +/* +** CAPI3REF: String Comparison +** +** ^The [sqlite3_stricmp()] and [sqlite3_strnicmp()] APIs allow applications +** and extensions to compare the contents of two buffers containing UTF-8 +** strings in a case-independent fashion, using the same definition of "case +** independence" that SQLite uses internally when comparing identifiers. +*/ +SQLITE_API int sqlite3_stricmp(const char *, const char *); +SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); + +/* +** CAPI3REF: String Globbing +* +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in +** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. +*/ +SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); + +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + +/* +** CAPI3REF: Error Logging Interface +** +** ^The [sqlite3_log()] interface writes a message into the [error log] +** established by the [SQLITE_CONFIG_LOG] option to [sqlite3_config()]. +** ^If logging is enabled, the zFormat string and subsequent arguments are +** used with [sqlite3_snprintf()] to generate the final output string. +** +** The sqlite3_log() interface is intended for use by extensions such as +** virtual tables, collating functions, and SQL functions. While there is +** nothing to prevent an application from calling sqlite3_log(), doing so +** is considered bad form. +** +** The zFormat string must not be NULL. +** +** To avoid deadlocks and other threading problems, the sqlite3_log() routine +** will not use dynamically allocated memory. The log message is stored in +** a fixed-length buffer on the stack. If the log message is longer than +** a few hundred characters, it will be truncated to the length of the +** buffer. +*/ +SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); + +/* +** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_hook()] function is used to register a callback that +** is invoked each time data is committed to a database in wal mode. +** +** ^(The callback is invoked by SQLite after the commit has taken place and +** the associated write-lock on the database released)^, so the implementation +** may read, write or [checkpoint] the database as required. +** +** ^The first parameter passed to the callback function when it is invoked +** is a copy of the third parameter passed to sqlite3_wal_hook() when +** registering the callback. ^The second is a copy of the database handle. +** ^The third parameter is the name of the database that was written to - +** either "main" or the name of an [ATTACH]-ed database. ^The fourth parameter +** is the number of pages currently in the write-ahead log file, +** including those that were just committed. +** +** The callback function should normally return [SQLITE_OK]. ^If an error +** code is returned, that error will propagate back up through the +** SQLite code base to cause the statement that provoked the callback +** to report an error, though the commit will have still occurred. If the +** callback returns [SQLITE_ROW] or [SQLITE_DONE], or if it returns a value +** that does not correspond to any valid SQLite error code, the results +** are undefined. +** +** A single database handle may have at most a single write-ahead log callback +** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any +** previously registered write-ahead log callback. ^Note that the +** [sqlite3_wal_autocheckpoint()] interface and the +** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will +** overwrite any prior [sqlite3_wal_hook()] settings. +*/ +SQLITE_API void *sqlite3_wal_hook( + sqlite3*, + int(*)(void *,sqlite3*,const char*,int), + void* +); + +/* +** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 +** +** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around +** [sqlite3_wal_hook()] that causes any database on [database connection] D +** to automatically [checkpoint] +** after committing a transaction if there are N or +** more frames in the [write-ahead log] file. ^Passing zero or +** a negative value as the nFrame parameter disables automatic +** checkpoints entirely. +** +** ^The callback registered by this function replaces any existing callback +** registered using [sqlite3_wal_hook()]. ^Likewise, registering a callback +** using [sqlite3_wal_hook()] disables the automatic checkpoint mechanism +** configured by this function. +** +** ^The [wal_autocheckpoint pragma] can be used to invoke this interface +** from SQL. +** +** ^Checkpoints initiated by this mechanism are +** [sqlite3_wal_checkpoint_v2|PASSIVE]. +** +** ^Every new [database connection] defaults to having the auto-checkpoint +** enabled with a threshold of 1000 or [SQLITE_DEFAULT_WAL_AUTOCHECKPOINT] +** pages. The use of this interface +** is only necessary if the default setting is found to be suboptimal +** for a particular application. +*/ +SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to +** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ +** +** In brief, sqlite3_wal_checkpoint(D,X) causes the content in the +** [write-ahead log] for database X on [database connection] D to be +** transferred into the database file and for the write-ahead log to +** be reset. See the [checkpointing] documentation for addition +** information. +** +** This interface used to be the only way to cause a checkpoint to +** occur. But then the newer and more powerful [sqlite3_wal_checkpoint_v2()] +** interface was added. This interface is retained for backwards +** compatibility and as a convenience for applications that need to manually +** start a callback but which do not need the full power (and corresponding +** complication) of [sqlite3_wal_checkpoint_v2()]. +*/ +SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 +** +** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint +** operation on database X of [database connection] D in mode M. Status +** information is written back into integers pointed to by L and C.)^ +** ^(The M parameter must be a valid [checkpoint mode]:)^ +** +**
    +**
    SQLITE_CHECKPOINT_PASSIVE
    +** ^Checkpoint as many frames as possible without waiting for any database +** readers or writers to finish, then sync the database file if all frames +** in the log were checkpointed. ^The [busy-handler callback] +** is never invoked in the SQLITE_CHECKPOINT_PASSIVE mode. +** ^On the other hand, passive mode might leave the checkpoint unfinished +** if there are concurrent readers or writers. +** +**
    SQLITE_CHECKPOINT_FULL
    +** ^This mode blocks (it invokes the +** [sqlite3_busy_handler|busy-handler callback]) until there is no +** database writer and all readers are reading from the most recent database +** snapshot. ^It then checkpoints all frames in the log file and syncs the +** database file. ^This mode blocks new database writers while it is pending, +** but new database readers are allowed to continue unimpeded. +** +**
    SQLITE_CHECKPOINT_RESTART
    +** ^This mode works the same way as SQLITE_CHECKPOINT_FULL with the addition +** that after checkpointing the log file it blocks (calls the +** [busy-handler callback]) +** until all readers are reading from the database file only. ^This ensures +** that the next writer will restart the log file from the beginning. +** ^Like SQLITE_CHECKPOINT_FULL, this mode blocks new +** database writer attempts while it is pending, but does not impede readers. +** +**
    SQLITE_CHECKPOINT_TRUNCATE
    +** ^This mode works the same way as SQLITE_CHECKPOINT_RESTART with the +** addition that it also truncates the log file to zero bytes just prior +** to a successful return. +**
    +** +** ^If pnLog is not NULL, then *pnLog is set to the total number of frames in +** the log file or to -1 if the checkpoint could not run because +** of an error or because the database is not in [WAL mode]. ^If pnCkpt is not +** NULL,then *pnCkpt is set to the total number of checkpointed frames in the +** log file (including any that were already checkpointed before the function +** was called) or to -1 if the checkpoint could not run due to an error or +** because the database is not in WAL mode. ^Note that upon successful +** completion of an SQLITE_CHECKPOINT_TRUNCATE, the log file will have been +** truncated to zero bytes and so both *pnLog and *pnCkpt will be set to zero. +** +** ^All calls obtain an exclusive "checkpoint" lock on the database file. ^If +** any other process is running a checkpoint operation at the same time, the +** lock cannot be obtained and SQLITE_BUSY is returned. ^Even if there is a +** busy-handler configured, it will not be invoked in this case. +** +** ^The SQLITE_CHECKPOINT_FULL, RESTART and TRUNCATE modes also obtain the +** exclusive "writer" lock on the database file. ^If the writer lock cannot be +** obtained immediately, and a busy-handler is configured, it is invoked and +** the writer lock retried until either the busy-handler returns 0 or the lock +** is successfully obtained. ^The busy-handler is also invoked while waiting for +** database readers as described above. ^If the busy-handler returns 0 before +** the writer lock is obtained or while waiting for database readers, the +** checkpoint operation proceeds from that point in the same way as +** SQLITE_CHECKPOINT_PASSIVE - checkpointing as many frames as possible +** without blocking any further. ^SQLITE_BUSY is returned in this case. +** +** ^If parameter zDb is NULL or points to a zero length string, then the +** specified operation is attempted on all WAL databases [attached] to +** [database connection] db. In this case the +** values written to output parameters *pnLog and *pnCkpt are undefined. ^If +** an SQLITE_BUSY error is encountered when processing one or more of the +** attached WAL databases, the operation is still attempted on any remaining +** attached databases and SQLITE_BUSY is returned at the end. ^If any other +** error occurs while processing an attached database, processing is abandoned +** and the error code is returned to the caller immediately. ^If no error +** (SQLITE_BUSY or otherwise) is encountered while processing the attached +** databases, SQLITE_OK is returned. +** +** ^If database zDb is the name of an attached database that is not in WAL +** mode, SQLITE_OK is returned and both *pnLog and *pnCkpt set to -1. ^If +** zDb is not NULL (or a zero length string) and is not the name of any +** attached database, SQLITE_ERROR is returned to the caller. +** +** ^Unless it returns SQLITE_MISUSE, +** the sqlite3_wal_checkpoint_v2() interface +** sets the error information that is queried by +** [sqlite3_errcode()] and [sqlite3_errmsg()]. +** +** ^The [PRAGMA wal_checkpoint] command can be used to invoke this interface +** from SQL. +*/ +SQLITE_API int sqlite3_wal_checkpoint_v2( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of attached database (or NULL) */ + int eMode, /* SQLITE_CHECKPOINT_* value */ + int *pnLog, /* OUT: Size of WAL log in frames */ + int *pnCkpt /* OUT: Total number of frames checkpointed */ +); + +/* +** CAPI3REF: Checkpoint Mode Values +** KEYWORDS: {checkpoint mode} +** +** These constants define all valid values for the "checkpoint mode" passed +** as the third parameter to the [sqlite3_wal_checkpoint_v2()] interface. +** See the [sqlite3_wal_checkpoint_v2()] documentation for details on the +** meaning of each of these checkpoint modes. +*/ +#define SQLITE_CHECKPOINT_PASSIVE 0 /* Do as much as possible w/o blocking */ +#define SQLITE_CHECKPOINT_FULL 1 /* Wait for writers, then checkpoint */ +#define SQLITE_CHECKPOINT_RESTART 2 /* Like FULL but wait for for readers */ +#define SQLITE_CHECKPOINT_TRUNCATE 3 /* Like RESTART but also truncate WAL */ + +/* +** CAPI3REF: Virtual Table Interface Configuration +** +** This function may be called by either the [xConnect] or [xCreate] method +** of a [virtual table] implementation to configure +** various facets of the virtual table interface. +** +** If this interface is invoked outside the context of an xConnect or +** xCreate virtual table method then the behavior is undefined. +** +** At present, there is only one option that may be configured using +** this function. (See [SQLITE_VTAB_CONSTRAINT_SUPPORT].) Further options +** may be added in the future. +*/ +SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); + +/* +** CAPI3REF: Virtual Table Configuration Options +** +** These macros define the various options to the +** [sqlite3_vtab_config()] interface that [virtual table] implementations +** can use to customize and optimize their behavior. +** +**
    +**
    SQLITE_VTAB_CONSTRAINT_SUPPORT +**
    Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_CONSTRAINT_SUPPORT,X) are supported, +** where X is an integer. If X is zero, then the [virtual table] whose +** [xCreate] or [xConnect] method invoked [sqlite3_vtab_config()] does not +** support constraints. In this configuration (which is the default) if +** a call to the [xUpdate] method returns [SQLITE_CONSTRAINT], then the entire +** statement is rolled back as if [ON CONFLICT | OR ABORT] had been +** specified as part of the users SQL statement, regardless of the actual +** ON CONFLICT mode specified. +** +** If X is non-zero, then the virtual table implementation guarantees +** that if [xUpdate] returns [SQLITE_CONSTRAINT], it will do so before +** any modifications to internal or persistent data structures have been made. +** If the [ON CONFLICT] mode is ABORT, FAIL, IGNORE or ROLLBACK, SQLite +** is able to roll back a statement or database transaction, and abandon +** or continue processing the current SQL statement as appropriate. +** If the ON CONFLICT mode is REPLACE and the [xUpdate] method returns +** [SQLITE_CONSTRAINT], SQLite handles this as if the ON CONFLICT mode +** had been ABORT. +** +** Virtual table implementations that are required to handle OR REPLACE +** must do so within the [xUpdate] method. If a call to the +** [sqlite3_vtab_on_conflict()] function indicates that the current ON +** CONFLICT policy is REPLACE, the virtual table implementation should +** silently replace the appropriate rows within the xUpdate callback and +** return SQLITE_OK. Or, if this is not possible, it may return +** SQLITE_CONSTRAINT, in which case SQLite falls back to OR ABORT +** constraint handling. +**
    +*/ +#define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 + +/* +** CAPI3REF: Determine The Virtual Table Conflict Policy +** +** This function may only be called from within a call to the [xUpdate] method +** of a [virtual table] implementation for an INSERT or UPDATE operation. ^The +** value returned is one of [SQLITE_ROLLBACK], [SQLITE_IGNORE], [SQLITE_FAIL], +** [SQLITE_ABORT], or [SQLITE_REPLACE], according to the [ON CONFLICT] mode +** of the SQL statement that triggered the call to the [xUpdate] method of the +** [virtual table]. +*/ +SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); + +/* +** CAPI3REF: Conflict resolution modes +** KEYWORDS: {conflict resolution mode} +** +** These constants are returned by [sqlite3_vtab_on_conflict()] to +** inform a [virtual table] implementation what the [ON CONFLICT] mode +** is for the SQL statement being evaluated. +** +** Note that the [SQLITE_IGNORE] constant is also used as a potential +** return value from the [sqlite3_set_authorizer()] callback and that +** [SQLITE_ABORT] is also a [result code]. +*/ +#define SQLITE_ROLLBACK 1 +/* #define SQLITE_IGNORE 2 // Also used by sqlite3_authorizer() callback */ +#define SQLITE_FAIL 3 +/* #define SQLITE_ABORT 4 // Also an error code */ +#define SQLITE_REPLACE 5 + +/* +** CAPI3REF: Prepared Statement Scan Status Opcodes +** KEYWORDS: {scanstatus options} +** +** The following constants can be used for the T parameter to the +** [sqlite3_stmt_scanstatus(S,X,T,V)] interface. Each constant designates a +** different metric for sqlite3_stmt_scanstatus() to return. +** +** When the value returned to V is a string, space to hold that string is +** managed by the prepared statement S and will be automatically freed when +** S is finalized. +** +**
    +** [[SQLITE_SCANSTAT_NLOOP]]
    SQLITE_SCANSTAT_NLOOP
    +**
    ^The [sqlite3_int64] variable pointed to by the T parameter will be +** set to the total number of times that the X-th loop has run.
    +** +** [[SQLITE_SCANSTAT_NVISIT]]
    SQLITE_SCANSTAT_NVISIT
    +**
    ^The [sqlite3_int64] variable pointed to by the T parameter will be set +** to the total number of rows examined by all iterations of the X-th loop.
    +** +** [[SQLITE_SCANSTAT_EST]]
    SQLITE_SCANSTAT_EST
    +**
    ^The "double" variable pointed to by the T parameter will be set to the +** query planner's estimate for the average number of rows output from each +** iteration of the X-th loop. If the query planner's estimates was accurate, +** then this value will approximate the quotient NVISIT/NLOOP and the +** product of this value for all prior loops with the same SELECTID will +** be the NLOOP value for the current loop. +** +** [[SQLITE_SCANSTAT_NAME]]
    SQLITE_SCANSTAT_NAME
    +**
    ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the name of the index or table +** used for the X-th loop. +** +** [[SQLITE_SCANSTAT_EXPLAIN]]
    SQLITE_SCANSTAT_EXPLAIN
    +**
    ^The "const char *" variable pointed to by the T parameter will be set +** to a zero-terminated UTF-8 string containing the [EXPLAIN QUERY PLAN] +** description for the X-th loop. +** +** [[SQLITE_SCANSTAT_SELECTID]]
    SQLITE_SCANSTAT_SELECT
    +**
    ^The "int" variable pointed to by the T parameter will be set to the +** "select-id" for the X-th loop. The select-id identifies which query or +** subquery the loop is part of. The main query has a select-id of zero. +** The select-id is the same value as is output in the first column +** of an [EXPLAIN QUERY PLAN] query. +**
    +*/ +#define SQLITE_SCANSTAT_NLOOP 0 +#define SQLITE_SCANSTAT_NVISIT 1 +#define SQLITE_SCANSTAT_EST 2 +#define SQLITE_SCANSTAT_NAME 3 +#define SQLITE_SCANSTAT_EXPLAIN 4 +#define SQLITE_SCANSTAT_SELECTID 5 + +/* +** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt +** +** This interface returns information about the predicted and measured +** performance for pStmt. Advanced applications can use this +** interface to compare the predicted and the measured performance and +** issue warnings and/or rerun [ANALYZE] if discrepancies are found. +** +** Since this interface is expected to be rarely used, it is only +** available if SQLite is compiled using the [SQLITE_ENABLE_STMT_SCANSTATUS] +** compile-time option. +** +** The "iScanStatusOp" parameter determines which status information to return. +** The "iScanStatusOp" must be one of the [scanstatus options] or the behavior +** of this interface is undefined. +** ^The requested measurement is written into a variable pointed to by +** the "pOut" parameter. +** Parameter "idx" identifies the specific loop to retrieve statistics for. +** Loops are numbered starting from zero. ^If idx is out of range - less than +** zero or greater than or equal to the total number of loops used to implement +** the statement - a non-zero value is returned and the variable that pOut +** points to is unchanged. +** +** ^Statistics might not be available for all loops in all statements. ^In cases +** where there exist loops with no available statistics, this function behaves +** as if the loop did not exist - it returns non-zero and leave the variable +** that pOut points to unchanged. +** +** See also: [sqlite3_stmt_scanstatus_reset()] +*/ +SQLITE_API int sqlite3_stmt_scanstatus( + sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ + int idx, /* Index of loop to report on */ + int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ + void *pOut /* Result written here */ +); + +/* +** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt +** +** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. +** +** This API is only available if the library is built with pre-processor +** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. +*/ +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); + +/* +** CAPI3REF: Flush caches to disk mid-transaction +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a [rowid table]. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to [rowid tables]; the preupdate +** hook is not invoked for changes to [virtual tables] or [WITHOUT ROWID] +** tables. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** ^The sixth parameter to the preupdate callback is the initial [rowid] of the +** row being changes for SQLITE_UPDATE and SQLITE_DELETE changes and is +** undefined for SQLITE_INSERT changes. +** ^The seventh parameter to the preupdate callback is the final [rowid] of +** the row being changed for SQLITE_UPDATE and SQLITE_INSERT changes and is +** undefined for SQLITE_DELETE changes. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** See also: [sqlite3_update_hook()] +*/ +SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); + +/* +** CAPI3REF: Low-level system error code +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} +** EXPERIMENTAL +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +** +** The constructor for this object is [sqlite3_snapshot_get()]. The +** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer +** to an historical snapshot (if possible). The destructor for +** sqlite3_snapshot objects is [sqlite3_snapshot_free()]. +*/ +typedef struct sqlite3_snapshot sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** ^If schema S of [database connection] D is not a [WAL mode] database +** that is in a read transaction, then [sqlite3_snapshot_get(D,S,P)] +** leaves the *P value unchanged and returns an appropriate [error code]. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a +** read transaction for schema S of +** [database connection] D such that the read transaction +** refers to historical [snapshot] P, rather than the most +** recent change to the database. +** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success +** or an appropriate [error code] if it fails. +** +** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be +** the first operation following the [BEGIN] that takes the schema S +** out of [autocommit mode]. +** ^In other words, schema S must not currently be in +** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the +** database connection D must be out of [autocommit mode]. +** ^A [snapshot] will fail to open if it has been overwritten by a +** [checkpoint]. +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** EXPERIMENTAL +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** Undo the hack that converts floating point types to integer for +** builds on processors without floating point support. +*/ +#ifdef SQLITE_OMIT_FLOATING_POINT +# undef double +#endif + +#ifdef __cplusplus +} /* End of the 'extern "C"' block */ +#endif +#endif /* SQLITE3_H */ + +/******** Begin file sqlite3rtree.h *********/ +/* +** 2010 August 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +*/ + +#ifndef _SQLITE3RTREE_H_ +#define _SQLITE3RTREE_H_ + + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry; +typedef struct sqlite3_rtree_query_info sqlite3_rtree_query_info; + +/* The double-precision datatype used by RTree depends on the +** SQLITE_RTREE_INT_ONLY compile-time option. +*/ +#ifdef SQLITE_RTREE_INT_ONLY + typedef sqlite3_int64 sqlite3_rtree_dbl; +#else + typedef double sqlite3_rtree_dbl; +#endif + +/* +** Register a geometry callback named zGeom that can be used as part of an +** R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zGeom(... params ...) +*/ +SQLITE_API int sqlite3_rtree_geometry_callback( + sqlite3 *db, + const char *zGeom, + int (*xGeom)(sqlite3_rtree_geometry*, int, sqlite3_rtree_dbl*,int*), + void *pContext +); + + +/* +** A pointer to a structure of the following type is passed as the first +** argument to callbacks registered using rtree_geometry_callback(). +*/ +struct sqlite3_rtree_geometry { + void *pContext; /* Copy of pContext passed to s_r_g_c() */ + int nParam; /* Size of array aParam[] */ + sqlite3_rtree_dbl *aParam; /* Parameters passed to SQL geom function */ + void *pUser; /* Callback implementation user data */ + void (*xDelUser)(void *); /* Called by SQLite to clean up pUser */ +}; + +/* +** Register a 2nd-generation geometry callback named zScore that can be +** used as part of an R-Tree geometry query as follows: +** +** SELECT ... FROM WHERE MATCH $zQueryFunc(... params ...) +*/ +SQLITE_API int sqlite3_rtree_query_callback( + sqlite3 *db, + const char *zQueryFunc, + int (*xQueryFunc)(sqlite3_rtree_query_info*), + void *pContext, + void (*xDestructor)(void*) +); + + +/* +** A pointer to a structure of the following type is passed as the +** argument to scored geometry callback registered using +** sqlite3_rtree_query_callback(). +** +** Note that the first 5 fields of this structure are identical to +** sqlite3_rtree_geometry. This structure is a subclass of +** sqlite3_rtree_geometry. +*/ +struct sqlite3_rtree_query_info { + void *pContext; /* pContext from when function registered */ + int nParam; /* Number of function parameters */ + sqlite3_rtree_dbl *aParam; /* value of function parameters */ + void *pUser; /* callback can use this, if desired */ + void (*xDelUser)(void*); /* function to free pUser */ + sqlite3_rtree_dbl *aCoord; /* Coordinates of node or entry to check */ + unsigned int *anQueue; /* Number of pending entries in the queue */ + int nCoord; /* Number of coordinates */ + int iLevel; /* Level of current node or entry */ + int mxLevel; /* The largest iLevel value in the tree */ + sqlite3_int64 iRowid; /* Rowid for current entry */ + sqlite3_rtree_dbl rParentScore; /* Score of parent node */ + int eParentWithin; /* Visibility of parent node */ + int eWithin; /* OUT: Visiblity */ + sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ +}; + +/* +** Allowed values for sqlite3_rtree_query.eWithin and .eParentWithin. +*/ +#define NOT_WITHIN 0 /* Object completely outside of query region */ +#define PARTLY_WITHIN 1 /* Object partially overlaps query region */ +#define FULLY_WITHIN 2 /* Object fully contained within query region */ + + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _SQLITE3RTREE_H_ */ + +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +void sqlite3session_delete(sqlite3_session *pSession); + + +/* +** CAPI3REF: Enable Or Disable A Session Object +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +**
      +**
    • The session object "indirect" flag is set when the change is +** made, or +**
    • The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +**
    +** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +*/ +int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes is not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +**

    Changeset Generation

    +** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +**
      +**
    • For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +**
    • For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +**
    +** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +**
      +**
    • Has the same name, +**
    • Has the same set of columns declared in the same order, and +**
    • Has the same PRIMARY KEY definition. +**
    +** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +**
      +**
    • For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +**
    • For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +**
    • For each row (primary key) that exists in both tables, but features +** different in each, an UPDATE record is added to the session. +**
    +** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** +** The differences between a patchset and a changeset are that: +** +**
      +**
    • DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +**
    • The original values of any modified fields are omitted from +** UPDATE records. +**
    +** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppChangeset */ + void **ppPatchset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +**
      +**
    • [sqlite3changeset_next()] +**
    • [sqlite3changeset_op()] +**
    • [sqlite3changeset_new()] +**
    • [sqlite3changeset_old()] +**
    +** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +*/ +int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); + + +/* +** CAPI3REF: Advance A Changeset Iterator +** +** This function may only be used with iterators created by function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** If argument pzTab is not NULL, then *pzTab is set to point to a +** nul-terminated utf-8 encoded string containing the name of the table +** affected by the current change. The buffer remains valid until either +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** set to the number of columns in the table affected by the change. If +** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** type of change that the iterator currently points to. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** +** For each modified table, a changeset includes the following: +** +**
      +**
    • The number of columns in the table, and +**
    • Which of those columns make up the tables PRIMARY KEY. +**
    +** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +** sqlite3changeset_start(); +** while( SQLITE_ROW==sqlite3changeset_next() ){ +** // Do something with change. +** } +** rc = sqlite3changeset_finalize(); +** if( rc!=SQLITE_OK ){ +** // An error has occurred +** } +*/ +int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +**
      +**
    • Each DELETE change is changed to an INSERT, and +**
    • Each INSERT change is changed to a DELETE, and +**
    • For each UPDATE change, the old.* and new.* values are exchanged. +**
    +** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +** sqlite3_changegroup *pGrp; +** rc = sqlite3_changegroup_new(&pGrp); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB); +** if( rc==SQLITE_OK ){ +** rc = sqlite3changegroup_output(pGrp, pnOut, ppOut); +** }else{ +** *ppOut = 0; +** *pnOut = 0; +** } +** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +**
      +**
    • It is created using a call to sqlite3changegroup_new(). +** +**
    • Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +**
    • The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +**
    • The object is deleted using a call to sqlite3changegroup_delete(). +**
    +** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** +** +** +**
    Existing Change New Change Output Change +**
    INSERT INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
    INSERT UPDATE +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +**
    INSERT DELETE +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +**
    UPDATE INSERT +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
    UPDATE UPDATE +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +**
    UPDATE DELETE +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +**
    DELETE INSERT +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +**
    DELETE UPDATE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
    DELETE DELETE +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +**
    +** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the +** final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +*/ +void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset to a database. This function attempts to update the +** "main" database attached to handle db with the changes found in the +** changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to this function is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument to this function as the first. If the "filter +** callback" returns zero, then no attempt is made to apply any changes to +** the table. Otherwise, if the return value is non-zero or the xFilter +** argument to this function is NULL, all changes related to the table are +** attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +**
      +**
    • The table has the same name as the name recorded in the +** changeset, and +**
    • The table has the same number of columns as recorded in the +** changeset, and +**
    • The table has primary key columns in the same position as +** recorded in the changeset. +**
    +** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +**
    +**
    DELETE Changes
    +** For each DELETE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +**
    INSERT Changes
    +** For each INSERT change, an attempt is made to insert the new row into +** the database. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +**
    UPDATE Changes
    +** For each UPDATE change, this function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from an original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +**
    +** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the applications conflict +** resolution strategy. +** +** All changes made by this function are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +*/ +int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +**
    +**
    SQLITE_CHANGESET_DATA
    +** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +**
    SQLITE_CHANGESET_NOTFOUND
    +** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
    SQLITE_CHANGESET_CONFLICT
    +** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +**
    SQLITE_CHANGESET_FOREIGN_KEY
    +** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +**
    SQLITE_CHANGESET_CONSTRAINT
    +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +**
    +*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +**
    +**
    SQLITE_CHANGESET_OMIT
    +** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +**
    SQLITE_CHANGESET_REPLACE
    +** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +**
    SQLITE_CHANGESET_ABORT
    +** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +**
    +*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** +** +**
    Streaming functionNon-streaming equivalent
    sqlite3changeset_apply_str[sqlite3changeset_apply] +**
    sqlite3changeset_concat_str[sqlite3changeset_concat] +**
    sqlite3changeset_invert_str[sqlite3changeset_invert] +**
    sqlite3changeset_start_str[sqlite3changeset_start] +**
    sqlite3session_changeset_str[sqlite3session_changeset] +**
    sqlite3session_patchset_str[sqlite3session_patchset] +**
    +** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +**
    +**        int nChangeset,
    +**        void *pChangeset,
    +**  
    +** +** Is replaced by: +** +**
    +**        int (*xInput)(void *pIn, void *pData, int *pnData),
    +**        void *pIn,
    +**  
    +** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +**
    +**        int *pnChangeset,
    +**        void **ppChangeset,
    +**  
    +** +** Is replaced by: +** +**
    +**        int (*xOutput)(void *pOut, const void *pData, int nData),
    +**        void *pOut
    +**  
    +** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. The exception is if the table was created +** with the offsets=0 option specified. In this case *piOff is always +** set to -1. +** +** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) +** if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension functions +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** of the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, an +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +**
    • FTS5_TOKENIZE_DOCUMENT - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +**
    • FTS5_TOKENIZE_QUERY - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +**
    • (FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX) - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +**
    • FTS5_TOKENIZE_AUX - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +**
    +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +**
    1. By mapping all synonyms to a single token. In this case, the +** In the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +**
    2. By adding multiple synonyms for a single term to the FTS index. +** In this case, when tokenizing query text, the tokenizer may +** provide multiple synonyms for a single term within the document. +** FTS5 then queries the index for each synonym individually. For +** example, faced with the query: +** +** +** ... MATCH 'first place' +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** +** ... MATCH '(first OR 1st) place' +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +**
    3. By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entires in the +** FTS index corresponding to both forms of the first token. +**
    +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a tflags argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +** +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is subsituted for "1st" by the tokenizer, then the query: +** +** +** ... MATCH '1s*' +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ diff --git a/crypto/heimdal/lib/sqlite/sqlite3.c b/crypto/heimdal/lib/sqlite/sqlite3.c new file mode 100644 index 0000000000000000000000000000000000000000..4a87906e12150c74009d8044e09e7e39cb228525 GIT binary patch literal 7007293 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
      kBU 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
    1. {a4WAL4ps(=Xui>kkzWh+ViI6q8hon&e) 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

      aq7H0Opkg}__k&VtdB$si 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�NhB-Y^yHz$e;=$lS%wa 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 z MoxI4=usj8W(V2XO+tRL8+M|ddZDP3!c_(-=kq9;DDXhfsli*NjU=R98FMK4$ zC#1+*@Z?tWlfCfCC;rJPgb~}b@y>}mckF}R0ABPFVB9b&w5Z*@-I6mdFXxo;jk^xt z8X1<6RTGjj=~wa@leKHCeP-Qs7PseFUF8B%2yhTJavMnHEc6^am;VsKuexJ{m)u1N}e z3({0g6dXPXG!w%8sdz6z=sYJEcc@-+&g zh@&Q}0N|j5xYd4JT-F)@EBX-S1=g6_qIj&YPHM4o)_uVLjI%m^eAhTtfpSC2kyfda z>gtZljf(53+kw`0CwYX=gc95eGo6pt?X^3$azpo?Fg$FYb8LzNl5X2oo#yHk0mR$_ zWxokn4)et_fPctMbkH#hAxqCB0xg-}0QPa)Ra6KY&-S9(2Yat)gM*MwFqT4>t|)xSzQNz#ud!ZSe+|MCeRG zE^!SUfG^)n(#tZQ1GI$C6{CTc);A;ve(l61+yJ~(Xd!W}zWBx4k$wM}ye)gz5~<;< zEqNcR&fgcWhjch{kR!~)YX}3v(cuXPq<3X1v+k~6l4JmKemd9sc!vSYLZh&GI%j(& z!3Rk+0oMDW-yg%!J0y{UN71vQ8KLc?OzV4O?gm5UU$q6$6T} z%X=OW6lYNhZF;LsSNl}0)*6y+o4W!M}_tqUtUOYV^$f{M^uN=<6 zyUX?_>f&X%qhN?No3Yyuzcxh!@;9(YaMl1*#Sz+8_-NMzT`1Mo01jMpXfeas4P8s^ zwG%ZLk7&$_WF;Q=eOvwp#@4NTEboG0!%nWZTYf5!la`b6=j&~GDwa{ZyL!WuM@fqb z^4Z^y_Aic(Pv7mm{lk9r=Kb5Z?WA@AV4?i{!)|RC@Al4qG)n-J;;e}3Y9K$j-!fNL zxQ>qyJpulq;Rocg^30>*dL2(Q8@SbU!|;kxMajb4c6tdXQxPHv5XYLv=VA<(2y{{G z>aO1OoSlxpG&aaEmOK2;4#(5avSPAEN~$ zCQ;KPhPxby&R+)P2#g6$!Ov)hBhlAQDOi~0^Mq^@zg7abKI|k>pc-6*>wz2t1L6i1 zVI8sO96PxdKkS`d>>s~A*l({1rYep^4=7^k?7O+Ss{p^ZDK<9p03RK{J9x(dvHu3r zs_RWU!e;JxG!sLmOBcWxvSHHLsP<3eqSO-*VKBAi4- zYHk?ST_&4qB5Kvp5(ciu1{J*7`!dLXI*Mz9*y@iH%ks!LvkR==(aAUb%QgUTJoh?0Z>^yVV4~iBpJcfcwy3&b; zbOeZ_CI8ZMf)==f12j#+dW+-jQ2b>qdvm$SBvh*VM#`cDsd;N^&LKPv+_}J1I_LQE zYww1pF^XMg?E6s=wlTq8)CB@coREa;do!bt_UozmDVy!~cxxLa9}lWvzq|?Kl*10Y zy$;_&2wUzwtCyf^B8}mYC<}0>xV^sB@vp__nCY$@O}vX%g_4B9u!Q`idxUT+%w3w|OnG&Ev|wB$jt~ zff6Jol+-kRJpgrC?XehzvtrfZhubtR^!5jjNfS#Jbs*dvcLSSD*Z5~f$ zlRgp+1jitrSE}NxY6zKCD1@?MFzzMZ@=W+#Q3s%UUW`%qtm}ZZQa66E`@z4gytXkh zVzd1<>WqLn48gZ6ClhW{X=H-tvZ#?vkd8)B`#s#36_U;&=Ia;amsrBVB{T`#OB5$J zqCF;viwaKUuz=Lcu!7-kuL{`%n6`|m+L|A%^cQ7Ul10NTf_ zj|;YwxN9{7Tj1<9(6kOb2qFPFfZSO*Ki%6uXtf@?U;i?DVFH`k&b*QQMM@`aNUf3n zUqD%xtg4?-jueL=%3YT_{vPY?}I zl~oL~FjS&?;42oI5CL4CI44akj^R~d#73*VRFb&dm^;SU2S!8-vR@Z2B*bU~*A4g= zr7x2Pv_J$3R)8@2saVd3nFqsy8p7ppp3f=~hxAJFBKai=t06^^dp_CR1U`UX>>hSU z0i`~x5+_Ys@l8+$!QdFAB>8WBs1QxTJOmLQ1Dkypf&d_vwWUh1Jg!YAeYRk5@Akew z+)w_{{FcM-4~||R?j4DTwy}rp59HN-xA)7%PX}&>$47THdHx|%2pXU4ZGGt2=q(%R z;Xftaye69Cc?DCDJCF!>eb2KGHSmMaeRV`xU@+m9EvF-LOPV|HYgHbO2@e0@L1)dZvcV8%hW7KU>Js6Lp=?i zK33zQthKX@MUi~?F)Kr88F6QhWP_0S@(S#V}dqejnJv-?nrih1E`x@g;L*6;ImQ?c;O z^)L%!4*(82GwH)I-_|ttn+;6;CeE@$AH4Af8=4Y*Zak@Mthw3nKEl44Hh)(o3eEZY zERY1WnH3G~p+1%0dNPb9-!gaNyV>Uyk+BNMV#CRUSlJ*?2DRwPenZ!7li`^rx9&Wi zV5~aGa((NpQ`V=5z@qJTN)>SLd!pp@4xxLiA? zQbJ@Dlw1Ds?EO3NmlO1}T6d)r??Um$TF@1i2uNQO-$KJ__lS}+#QiLXs zGi1$*ask7b3?_5^el3;r2Y?6ajlHT!Bea0r2D|}(^J=>j8f;d0CBos+jawFD`@LV- zikOyWl_(Z5_^bu1_D4UdTQt$XPSv?&J+AD;4QQM@bdsR8VbC`1O4J@}uNOw1&LFF8 z)ubDAMW`Nx#;dA9-k#L?kRDK9Y4LO!5 zX9OiR$D!nTa{RMX%=X?mdg?SZWHOl7No0m!AiYy2I9sVmgn=pHnxF~}tBF~mh){4i z4q9RZA78%4-b?^sR=4Fmn`KxwrG>tFC}hBl`#PO}Y@1w8j5aN^;i6z%NeL}PUIr0} z$jOdnY_rHZKp-?CglI`Q>M`gHW|fV0D!ok7&=%2DydI<4mDY;XVEDb;6zH3`BjQS0FPL_xLZbaY;v;gDX*h&*oDR8}-} zZk_380dZG49?71qmWG{Z!)~wrjsL5??thm~WXLVsTfZL?M;qQu4g4S|Tw8(^gE85- z^k$L_1U88AiQm1NUo}x=WFctZ7d{jQ!$Y4u7a3-~wA0`NL=6Ykg8Qj9QK9ulgS9uy z1%jeSaVDviGKiR@{Z_bDNhcSejbBXiYqD0le&yN=i{Lu*4cPJ z8q5g#&Gl#Z4;(dvun$t80YuYB{C%m{fOsRlBD5QI;5QMwzh^Hy<~+D2Z(;I!-w-G5 z4vWdA<(CB1tjKT+3lXs)MU}CXtSPL_HRuH%SsTE2BL=Txv;#R+N1zSH$mt8X#KB-m`X#qpdIj22cq9NcfZ8UH5e* zyM?|Ba0shk2WW)#>ADtyHJ~hdk$tP2YO{Dc?!TJyT$Fv-D;>(P;!p3`R5gF!)T>c! z1bTR7T(XPE$^x&HA6mXI@H*j4l?kl&#NE>}S{pDDmr~$ZQt&VVi$S;vvCF%uT==?3 zRO*xxGN_0idTPfh)F==jAq*OEYq|f!!Tyhk1wdqofr+M=9Y-~#!3+YJq&CS3afG;F zF9xJhdQgmg9@lbg?(Ttc`oY90jKg zDEbaKy6~kx(BjtxuGIFVfh(xUj0Pr)+()jk)e*zc8ka~Cu%NV5F$WgQ$gdh>`}^t+ z&f|t0C8`5hpH1HuH4DP+vBZmy8&RvPH!X7~2nKP#PUJ>qqiTQuR0&x}+e~rS>RNC> z5|$XR&BTQ`NKU)Yw!Yii>~4R%{d5zfXDo&BKx&GG z#E5NczL1N`Zk}ph@NEXzfGi3e!Re^GtESB#f6#iY2G(4Gsaa(|raT_Tfp`wo_Hj1v zPTn58J2*Pu1MOEAXLIYhTb!-l7FPU%^(YxR91#w*L7K`aPzk~uH z9qCO9Y4U&sP0-dC3ZPqR^O$|LWBULe!3W+2(13m_H!uJ{tvg9izx($2R`N?R_=F=0g6}}k`EwxedGi_Bz33$+=*clg@}L8q|4wQY8J^)(z<%>J#Z%%aiHZ_U0HrI!#^cC8wXj)Cgnm6Hg7T!s35e)U zJjXiFst7Bg9Y?|YW9Dcq_O(+A)IsRQ<3>DEuG|i^Bj(gK0B)dy4Yfr`=@r6CQh7gt5`QAO~M07^`26fiZPbCGWn=Zs5<9bQ_o zz$p0Kf2)lroGdEjXoIrT*pAa|g;Iot52%0FjPHUJgt&)oL0wF;;elthVw>BGS3$GNKnSI+CV>ab<5?Tye*yjO-3D{om8L(k|xNuasg6W z|KOMXx9@@b8e2~>gTASP2d)zr@HX#3hE(4Xf~rl~q^@6+E0=NG6(I^Myit@+Iz%Ts z6jTZ`r6K?%2>qlzm$~LXUI{Wws&8e)I7ZyY7lk06D1^ZkD&vD8FIp2oGhp>zZNWK{BOUG9h9+Wp3(ys$Ktv!suZhse%Y!8gLs=l+$zm#a%8k26 z3q|`TZ>TvV)$Oa2Bf27qP0IS&GvgdM;uN~h&0eh3b$DF&$=K2K}10gPa z7e{2We8bWJsGuQmG?x~jb*5v-oolw9*HWT$SY2oZ*Z~EB-kz6!k1P8y%`VeL{z*0i ztA~x|w_QlB;*(g+AZ-^7qX5o7LSQIRWfY8px6o?47(jcz1mI z_ltMOuhA|8qwV&*DJeRmP~n;ZOVB+Fi%p?3?$maBUbzQGld{Q#mWD)8y0lCfr6{71 zuz6;RstfQsYNTsi&lWsSS^~hEpy8y-M%&{~$GnvynBM2Jt818qS0D+~aFKq@rh!GF zy^$P2NDS@1r!bzLQySuyRm@)6$~D1W_a$A6 z7%l9u_xX)$k4LP!hF=;DlU?3#zpm(fZ76)xyA)ef${eD$R6oxe-3lDrE4iEpLd1?Y zjhdm_c`@^D(iOML#FO4pe&~K+hVi;t5vXCA<{H0aR^g5nYs7aKIaV`!v!GVNw3v3m zk)>5VfbqDMT~0D06ifx3b~Ecbl>&e_1*O777F3IS*q7i7*z&`?EqVp#Ve%VPe!!Xp z8_AtC_Xjt+ci1!%QbnFb$+YQe)sa!s18VDMN_`(#;r%(ptOZKk;5SFmw2lwKhf%_< zsoGx5(*Hu80?~^7% zq(rgN!LF~*X7cO`*x#RntlQIUQ3G~vZ;(Va_$Pci7c6)PUgOu;L%(-&Xb-&3_5$*CYnGr_yD(e0BH`I~|Ls*5 zrB}TK?!Q~r2e(8j!)!uGqvN;`A2vfvf|Y-?iu#SjWQ%e4kfT=7NI#roP=$LOOGT-n zNn4?lM*;f1!4zlH-IcMt#6kPNy#tSscWavLHa2-2H(@KHyu=qRX?h1gvD?&u-e5~x zQj!9?;cIC&`e$pY`hOmt{PgC`mkz5kN)z#cmK!z&!PO$7OBxtxQ*KAs7vFY7vlp`^4Da3uDb;GDmRR?#6kCye0r_;?{7)d^}Z z_-*dzU3#0`7E93OFN0npt+5{bV3*8VB@B{FXm-78DmTSlEk1g zZja(&0$4@hy`&fir}L2&glz3od=UCz73J?NFj!X?p95(UhAZoUJ}|dJiRe=+X7JZ{1=wg$`-6=qr5oCDKQ1Gs8dD{ zhJxWh8Ags^xIMm>GLep|3_qseT`4m+yiqdAKW4PmxM|q1SQ77yPwU~-$;qRPhH^Mv zY+MODy3R)cngo$SjmP+o)306LcO%T{-%j>s^L&y#Tl>Ff|9|-Gn}e@MyriI-MTSB9 zEw|(!yTHOmZO_d}t$TIuhD|ei!{8bVbl2cMEz6QE(ezx0O2Ls@#H*0JhEkcMkU;Fk@tb7-_}$6-^Mljm&3E{T3zkSl(e!jVZr8!Hd5dWN&lk8SnpDYKHyo46XesMiZr*0R( zU+zBWxJ@dZV1DJOz+#~hsu-Y^mH_!V%2G;RgDfGC%>o4CfSerpFc44*rw~|C;`umw z+>`iHvTrU2IPwi$rtUxaL%sarCcBuoFarC>?3R9kPkQnR{<5*L!G9igd-BMU`{iFY z7U&29xpO?OsO`^fr`U$8Nb-lhnm4VHEu9yt_C1X+fklQMDK5G!fLtuDWbYx5ny?!nK`n>8 z&N;kNGB-<y=%Am*lS<~bOU#oYC0tEB-_%vFy%1jl0Keg2F9PF+l4r! zl$7ZK#&Wh?pqs&B1D6>@RxfA(OevD&0B#BXg}RNcCWkL4Z+kJu6`U6ZfuNDW1v-Mc zr;-DMh(6O>oWLzrzbUQ1F61DVOuvWQnJS&;()RtPmE2 zRy>{*H?)!J*r7MjlxfDu*VwSgEs|h+1uRowL&yUP!9;712`mH@$tL~Ndxrlo zm`v$tn-lJwlt3`v{OTwFYjbn+p)}?d z@Z_nZyz@_7WqrI{EV0CzF3Xdxs9!>=GZ#;vd=@-uvoFlk%0S7?K~1-L|DMsmy{E}` z7ZEnEov18A0hdt%A;)PnQii!SVzP9@BRCsgW!GRKJLeBtPR z$(P@S^9K^fBkH;>%tu`~VO&gHnuPOaa}WLjRa z5FxLamdk4rJXM+#Je}hNUUiXSw!oSC_F(S~6ee~oj-zs&5J47w;QUXY zGLLY~^e@a^N7*=CPLPpO{0gPdQ{c_#{MsE>d@b@D^a`d3)CuuL3wL_pOD@VdrkEFy z5vPWOFWJ;gFS>i-o^6`|o<%HN(r9WVS?HIaB_VK!r50syiCEux!*olh~p1W&9SHPXitxf5_;?2_v+ zX!C+rM(l$Fi5>-aMny$k;|MGi=uin`2F6|}o;}K}UT7>Ua{1y4zAGuxr+h&}r9L!Z z7B|4FCi9fjRCII1neMhY-Cz-{N0~OHo46Su=OhKrON_XbRNvMHjgwXrOay=ahz$~d z_^*O~@q@&R#ePr#i?eaR4$UZ}!{>aiVZYp-f5M)fqToNpMar=f@QAdKyI&NnFTLmw z5ND~^8KiExCjiQ^z(ODh5osntdy?o6ckulj=suX8ZjkQ| zBZO?*eu1=x{&-G*Xjh^tu)s4g)ytURj#W+`NE|8tJPBKRrJ5L+q(4}>I(Ztlp|1Iz z^`t?YejCm?2*|%=83(rqZ-6!nML{lRKfKB(BT{79!htLuQC0~$5r)r~)rwh|R!)#w zv^GYs1>BNY(?%MPNR>X&m{^p>sDzMz7||SxXkk0qytu7tNJc9*MNV$X0%|ZiKvn|e|c7Mgd&KDkAD7#*CFCz?{#TRQQ^i0Uh(7GwWvsc>%(DK8LwhI}t% zYw-w6ft&-ko*~TiBqut63F8xOElAv1HnW7sF9#)o*!hb%3CUJ;4W0Chc1I|cR_5-U zq$sM0*mRYC;*ei=s`(=6d}YJ-gZb*w;A4d0ZfuIsm4btKiNtzQ0I?Rapmts5J@2iJ z!yp(|hyrD|PN2HD$RtkF&8HvHBZ?JRP-^hhoz0*62_Aeea}(EuO>t+OH^Y!Z-iaD& zi2mICQ#Or6DMys`<+|l$HFYXkS`x$`J^3mdrdT)3bSq|&rZJM->||!Q$VR#e$tvATxpp+oBlX$WgF+MtDsuY7`(7FpA`M#NiXAtXLyOLFqDqY~E@p5~t~HT>K@CAWbzb=Q}q zYr0*UUZRcJe;rcL>IMia$l}|BfXCiHD6Oei+g(8Rs54MAd}_EDRx8v~#u)*KIRYU> zEWcbr;WiXc>8Mg}K}gNW>7Y-eo-y^pW`%lOrysKt@lUFYCu~TRZ2A(q2)~Cx_h4bZ z9h8 zJJG>eJr9lj-@%yeqJZA5asy=@u@xvyo^5wweliZqQO&Rx8tylb!CcDC&zmBoMn3}p zuy*6XN9ae}d^^5pn{UV3=6SFFWtBG1{d=Bo-LFm0jP3bm{Qy^vEp`9-4hA@a|D;3c z;(5@fxAkQE>9cR2hx3X4v)K#VY;FNwM30yIr-p0fw-%I4$Bgq4-B7SQOOlw;PeSJ$Ug&Jh;`)Y)=K0vj)r3l^I+(jU@K0P& zopQd@ppQjG&c1hFZh2f+b1y|NF!%?eIgPj-b(e7b2}#7!)Zcj5o#fAnolDrT8Tz!a z?m_74IJAnf@7IV#A_3tm)F{O=WbV<9i2*P;6jC-^pVo|#6_T!qB5l!ev~n4S1pvi_ ztbR9GBHk%bYoUGC8T@C?1oG{`1Q;zZpp@8S=h*t><5N5rzzY(JpQc|~dHjSdd6${#=XyC=N}s*5fi?1_3=Y4?fW353e4>=le`6j0-7gpW2XEhAz`C_&uNLhD zK#>6#!~Fpu%$FI0B0q1pbxhKKjX^~H4)&reM4@54Fj_1%=f)h(#I<_HlqhL!8!Mtp zg+z_;q)nVmwiP|2V6eVHMbw77eYT|f-xMQayb_QN?N|$mgXrG@M&r?atLsNg*QzYq zH_vF<-V}3G5=Yr^l2XbsmUe_Y3bEZzAzls_$-C?tk0<}T6Mz4TfG6mm%C{hg0*s0N zvJ-$2U~K4hdYKP7gn%70ES<5k8|bf?=>;8dsDbyau?UQj#1!&$>-}YD-G+GK3OeQA zizO0Kg+OqFqJy0hptEb<#dMItEnD$#30KTD?!IQ9%G&s1fD>nLgbaFM(2w!0IGg*D4UL}Ok)W{RA$>pJW` zg^7Xtf=r;0@(ms-2zI3zOAp4EfU&S{#BNZK>7NhKo@)WfQZAo|(G<{wtSUrWPa%Wd zN1KV84`Qz;r8*?SkI@X)^a9`caGpumHAAFp5auSBje*Ps5&gd7-{8dmTO#Jgnl^Dr z%R`fv0fWZN0jHh}l^A819G|)|Qe0SSkRnR4X3_!Y;4R{I)+k#{yBJKEUo**~^hS#4 zW8;m#?UI6X#Z6@0Z7e5HOY_-ecI6|oTa)pMDwQ*-Jg za6O778iphX70r^c(L?{Za1SJNNF|mWC60K?jFjd`@WSa*j%1?FlXM2^k7OTpV9Yfb7to%cu7i5 zNWDoXACu(_AE$l8_k#5Z**5nC!5v^1K%Xnq07}HCZkE$|Hg2`!x2h51Mhl#Zmv>s= zEl0$-u~X5Z`hwbR;i1aH{Kx*(zrOZ8I9q3`%NZ!3a zJ5OF6BySE+&(0qxWb9O=^&Qifm!-Vq56pQ`j5t;|1;+L32kpi!`;Xae!;mmsAsJvO z15koDkbBMEM&SSaP1M<2cOG_XIuln0NTO4ImR}(qOia^C2UdKQ23MnbRGk=TqSMM@ zkQCXu0j@3#LV;v-ZHfBe$zm?m!nj@->xKP3wA=Q7ZfZj(n)QINu@1I_4IKk(xi8*A zCA&^<>)W8$$h*y!u7{%wUI@QIQg1xW2hwGZe* zABjAN_%Btz@x#HYV9`nUU4j%HwfqSKtf_@s)gdgQyGq=<#+Kbb+0{9w4z_pV2Q$Rj}TgcxvIs`_t1} z{|v*$GB_>f7VDkm^YwOx3=a7@N3$Rf^r{#cOmx?eWAbGNorN8BL{ot-T{mch(`SR8 zPA;K#l>1M-hen+z1yD|bYxc!xK%le;B8YBuN*k|^YCQML&-oz z`uOGibPx6CY95N()5zoJYiWXYQr#ICbY@=`NSvmB#&+NpY^$JHG0g;q1C<-f(6y-~ za|YTZiY;#ypopBP5MITALoCZFPz)A(R7l!32}daumMmQ(6cZ6&Yno}P6=J7oa??B* zKZ^VuzTPlnm}eLnM~+UEBQY?oT*%9s%0eb+4JP3TF%An7-pG4LhF(7G&}>qaD7L9& z#A^0GkP5-WK!Pj}06=xyi${M$+1$1DXO`x*6CB!8oqjQnqzuFssoXEW>~1Q4*@aT# zaMx!??j!{g7udG)X|&U{gnB!iJnU2~tnR@vx?|+0cqj-v*qlZ`5cu)Rj~SEu*}{(Z zf<+P$*B0beFf9#e2n$mL8jXgPm^^&a)k35ZuP8CC#Eeln+VMg*Aaj)As-T!$kNfI`2=kwew>K5 zst{>7O5&4}#-kQlKc$i~j5(kfd}^qC`UlW};+E8{EaYs5s;2G=Cxc_#hDXqD7Z{mw zCd$kMM51U?g6j=aqVWG16F1mPvPR9RoG+g-e$Yqo#4ld+G3=~?iKE=?DEuFlHN+Cf zv>ZZt*bqI7mB3dEJ<)70GEPnoD)+FGb1t}BG9fJ!6Di?ZZ9AHJT^4cBJD#|n~;dW7x3drWB-NWrXfP>u%ip{uF zxSW|)35&8ol#PIH`c&V_20?9R5M>#keTNl5%>5Jsil%lHU%R{ZVL2VdxD8KqUA$!p ziNVX{th^#qfm*AOAjw8aPoNk3o?xDOvsvcCX2M6^hN=dyShFHqkgtjy;y6Be+wA`^24bPLy zb%^!R(ME0Bl!379?{JcAMxWwsHX@6?)mth{H*z*8_zIcN2qz(Kt_qlMLNZR>*OI5h zl>y^oC}_vKL194dYYjC7HvKc&A#c2w(R?lOp0KIn$e`0~hf-nghO;Ak=Hhr34@TW< z#8jt@-Gz(f_>0^j;_Rv=5u|Yqb61&kdg?AotT}Ovmd?u4LO-#*tS&zaO<%#ZE&tz8 z3o8E7kst!hgo8mMmK(~{8d_V^A9Qf(h-^BMtN-r(`N1z2XHd8W%bNlK2yw?mOyHn{ zqp*Rmw^2|d%3~?uKuV1hG{6!ZE=D30;2|qvco=M>UR0iJ-`Z&>LpV1d^q% z7--}-1lw#ki7R{W&yRoF+kgN59d!&T(LZ4}a`UlF)-2mJ>2=u} zOlcvsvSwj_*gLz}KYo3%FMH*9e>&mBemNblvofCtfG%^%{3lD|Ol-EnBq5MtQC7G9 zRZ%#~H1&l+L5eubz*%~B0sIDv&~plDvp2_1pIj80Bs)!PDlumgukhwzR~-2Bm0gji zD7=}Cqq5nf#>&P+s`k?~q=tT+mLjn}p%Pb{5Kw5=wzei8fo&fsOzc9?<~|(2>sxh) z+IU)LSjyZ>%Sj6b=*L7o+kPn1z_V28D1d_qDGt{?C27OnZR1|y#2!tPgyWIXqu)qT%N@BL>{Mq{rLaO4cq|#eAi-uG|3MY`$Q`eF2E-P@`tfVVo*GeQ0P?{b z$)8AhzW9_40Vg*t_sO)v z^pJrn?Z!5eP!UEkwxF<1;zLFm<~G!qy5rc$9N4FgN^K+wac8n@G%$)`s8W;cV$ME& zf%?5?t$2tl%3@64*JtO~voknn0e{J^XMFm~<#?PAQ4W>(@DL^;a2V}@MCKMDu!-|Q z6C!IhPavge9EWf1tPCCihmL7UXxon_iKe zf9WF+Y;Rio#`dLYVlkjAtCw2O%X} z0}n>7u7qH3{Xb87k~N?~+T(P}<+Qd)+=VU>GYNnlP<4JnUw~4B%B1+k2>QX89#aDJ z2x5>a?`i?5mI~8Ck;{;ag~&Zx>(z&mYy3w9{liNUQfWsD&yG(o-tGP32;#~456RZ1 z_oK7-I*pnI=XOmz8y1rQI$8y*S;|t z{Ob&QV|R8i<^ddV-CYw8neaQxk2#t4xH_3&@n&bB6!!aPKOUYO9sF_*g+S!l-OU#X z2~t*;g%2D}#^_KeV|I^@UeMJB$DAlo|_5u;!9L5!Pq^?Zgh4&A~W|Sbtfeagtot4%6By{;&lL|&- ztf!UGRPrsM0mz1;aiY=CCu=003j!03C$mRvIbaMo8K;i8>0llM3&0Tv4LefQx*q}Q z1j4&8g^hDlfz4XItELx>5d%F0o~6o-sV*&chJ_j+qa|Oc$4n!vAUdUPr{+P_3TZW& z)kPuT59H=y6r;7LdY^C?-33R(2+~4(k%KBc8?J#|0jSM4*4lg$h z)RB+XrLk5H42K}{q2r1C^2;xn^zB4XcZ*sOqk<#yy*j~o0lvUlmh5|vu=Jk9JvNZ)9msOkx80AukVgERCcB#$$%N!r4FRww^+m=(6U($koy~m~pzIq!niGcTJ?m(u9wgH(^x-$hCeAnL=$#xM z>PQslcj+zSL9=g&hRBKzdX_bALz1)#(1r4bT_rN6&>3`s4v&7?dwckrg)Ux(QIQdL z2ZcAG98Swg;;t6!lp38aj0pUkLY{X!p}vgkkWII_m?ltCp>GZOLH~*)as*oi)Fxw) zR<2zh->L?Fu4 z4MTyO`nwDjQzOC_^9Fg8y7C2*eFkLeLHg{x6F2g_l6Kr&iywk_kcE$eiBq%NAd)iq%`Wtj|>%| zp8$2(peT&g@V8us#99h^L7|G7lM<-q3BT8^tpf84w5X}`$`0r3qn(Y0N`hP`6NuKC z)B$S0H^qFmA;`11&?NM?+f=~PXpd-y@BoqfKB|J^MZ^VIk#w&;swon7;-W>96D>m2gBX zYGTvWQMzOo!y;ZijMm?13#^d;3YQ3}QUI(bW><{=_$#0k{1xSfl<|auwW1rYv3k7C zpttMx%q1j4ipP@Rhp;|D2K{nAE4Co;TZO{4U^njF-d0NXarqI1eKlc*Uh%uFk9A>>N~T9 zF0wV}%?Z2XudEyR&Q z&33)bz@y};swP$~Jl z``Yc#^b=^XW;y@inGe?_5nCxGyCVnb1VRxm+_`~c14t);icAnkM8G2%xLnR=#T*hI zOl&8@_%AjT)t92urMQf^J|VaO@+C@D6N%VaDP7nLjTTySsq=TJlAfkF?T#rQtwl3f zr-RFkYztsO5&22NfY+T^*&&*tDycziB~72@dv9pb;s`K+r-LH~EmWa_2Kg5V8?J)*2KP zl0i;QT4bu7C*cHc0jXwr1iq$JVgIB3eP^xa`+wB>McK=Sw0w}kjB!3-2V1h+uo}qD zjg0RdW`af#C^SOe@tmSaZOWWMm^isKQHFp}gDX8V{1G>1Kz=0j^t6q~FbEvIZ_FqN zeAk~3=0P<6*`k=ih?mz8s)7a{u*sALcxes?Cu7`u?|8Hwg=4q|)MqTCGY4pZDW)>G z$KREgST`}9n*rhJe}naY$yLMHT5>HgWJ=9eVk4st(A|dcZ^`=aCu52=C2u2-0R)3_ z{@K6pQ?HYJ+A>S`led?H%2r^A#$QGz4H*j}-FP|rWB=CFhgV&#DOMZ0L`Ghcx@MzLc zTFd9{R_jxHclWvDB=B)hKmKI&Z}+Ng92wiYzvsX03xWqu_-|PN8SCC8zjWlJ<=(cO zB0j0kqTTT&ZW*GWH1-traUdmhYev}B)E~fc055gdTKY@L?~UQ3ezWMhQ{Eq{->_%g zSjsRl{)H5oKrSd85G;Aer+};2-+r>y^QOLdg0Ls8_13cYY`yLNKqgq*4IuwPtjh!D zzb$^`wd0eo-W~v$-s$1d+2KCPQVBf!{rQao2LedIi?oFe{hqy!BC@fD#t(gsAYp-e{kB<3hRgZGiW{!|WzfHp(S6m}JGPztMUl32oMx6^`q14sNPgw7<_ z1$01{3{>KXaH}to2gCdLG=$XXl^pnic+&C7(`5tJ+N_j*bCBkK=6iw zL1YG(C^xhVjIr=0mT>X!K{d+pY+T@xh52X9$!A}3ILTSIpgDtrz3 z{^xWf$gfXEeG6lO^QHGtv(7=o>*m1jhS6;NNWmMIuIa4WWF!JkM`cZsl8$Q;hlG=M+x$(KzH zYTtm=QfTEpUeNr!CcC-kTlRfUm^0l8zl7K%n-rJ%u#<3J zO|>79j<_(b=ZzhVE=S_EoJxHwL|HJ%M3fR(dfvJ$2}J>kLG@+AcR`U~0#F>(luJu4 zNiU_jitB3x!7Hm0@7IVKHqqcMcx2@C9Zm^32;NZQJWYrhTY%FciVdD++;B)S>~~H1 zzX0qE1pJ`^=%AKpqZ}>gnGHGy4*c)zv@GGfDTTBSh@B*C&l$(JYcao#Wa@rj)Se#` zoO_dqT@kY3BY#Z4@G4a#j}9~6Ig8>cmMenfM0TiA0c_zW0_>)?g>!W0^11@zKTeT9 z2h$sV)-v@lfe#Y!eJ`$E>i8_C0C_8^rCGSjR!WKN_q^hgXgWU4V8vQ?h2EYEZ>tu&x zgkBxe-2?ifE{ucETdywpRNrKpXUv%@z)@8U92S%1wbSdJWoTd@PgI=bhAKd2+u8LbuMkd6BjUvyn|>d>B2jei)*83HQ5k86ahfAEPp$->?pCu zH4Yy`5=Nm-;8dfaDyaF!{Ffb7Hz;Yi&xr4`L0=Qb2Bc->Q<0<4=?LLug7(PH-+a!` z;;I_BKmrw5++UYR+^>%xi(umf z7x*}RJ@_^Mu))?gCbUlIuBzKaQ-PY^i*fvadrHLH{FLs^AS6+W4iE}YWs`0PT_|oJ z9vY1T4*86Y7p&nD?l|S6tTwm?7|6XDgxivL^t$GqL1pcZt@wwLcfr6(e0KHb*d4!X zt3ut<{kf*T<5oooaFn`kydm>wds)E_+Y592Y0r~-bW`JDz|^UGpAXWWm5_n021STk z_n)r8>%j+wM>6OVRL+mP(!+!LEIx~bhwzZxi##l0i%|)cIXRV|zSwGG65Z>;gMN?g z0*mlLJEB+CaxCLxQRnFW+qc|k13I zMtU$fy&Qj+cThEIKJgywIz`h#7vMB=gR?K^7r$P*h8%KGk~{u|WEiXMt zGgX`?|2_ko>6o;(;hHG#Q+62KbnMuWm8>3%+sHp*L9a7)+|BFn7GLhi7gqCbA>K{q z7}4|mp{{dN2ZY>uxDSu^PhY(~e%0huW38DTYnoG7+)Np%bHU5OrJ%@g!l{P0 z0ggt5w!N)5PPx=-Vy|L#UC%kn4=ybgyk}wQ(Z6&lgrQqL?NMx94&~&;5;c5 zgVQn8bwQEH2d(G`aDwt2wXIc3>(2(|=e0th)wZcJU`0˭$u+9Q#w-N*Y0p!a(* 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

    2. B~{sL0PM|D-vzxJwp(#Ia{{%DHeh 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
      +lWS}Z;$9jcu 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%0AQK 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�#wx3h~xFlKSsRn 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 literal 0 Hc$@P`Xat2o$H=( z6;7WmYq+w1rP#z&?*gy2N_-O)Pe0-+FnBq0hPF<|i}mH_?Y9)PRlN4mwte+EHto@R zo|Au$6hHYcP+@h-nkj1Q?6j;iKlphP-cI^k=4X>{V}9(_J4qu$nX~rD4sqSXrTG8ba2cvFWtu$YD@9=`KS1)5k>t;*H{xx=8 zVSn`FG{H>*rRaWA5BD{7ILdJ!q-xjG6S%@$kA%%L&VZ*6j*AE-drV zvV4A4UU*qj^VOjA9S+lP7;A_%YwTH9T#@85KXJjvImYL{eN6ejp7+HEyXAVxa^`bR z#@Keru8z5+@~3Uvp+CK!n;Ccie#yOY6TjQRCGxY3MfBw!M+6u=S9~nU^}c;`%H5ZK z)zi{lcV5`2eq_spxOv=i?j^6@pOkjb;%2kE8zr(Q-NfDOc>4y`wMk7Z2aC>6f420{ zGQZ|00jJHUTwm0&*L2fS4|VUTSv<;*`q+DUvWsR(zW9=z71=R;Pk$r7^U{Uxix/dev/null ; then + config=openssl.1.1.cnf +else + config=openssl.1.0.cnf +fi + +gen_cert() +{ + keytype=${6:-rsa:4096} + ${openssl} req \ + -new \ + -subj "$1" \ + -config ${config} \ + -newkey $keytype \ + -sha1 \ + -nodes \ + -keyout out.key \ + -out cert.req > /dev/null 2>/dev/null + + if [ "$3" = "ca" ] ; then + ${openssl} x509 \ + -req \ + -days 182500 \ + -in cert.req \ + -extfile ${config} \ + -extensions $4 \ + -signkey out.key \ + -out cert.crt + + ln -s ca.crt `${openssl} x509 -hash -noout -in cert.crt`.0 + + name=$3 + + elif [ "$3" = "proxy" ] ; then + + ${openssl} x509 \ + -req \ + -in cert.req \ + -days 182500 \ + -out cert.crt \ + -CA $2.crt \ + -CAkey $2.key \ + -CAcreateserial \ + -extfile ${config} \ + -extensions $4 + + name=$5 + else + + ${openssl} ca \ + -name $4 \ + -days 182500 \ + -cert $2.crt \ + -keyfile $2.key \ + -in cert.req \ + -out cert.crt \ + -outdir . \ + -batch \ + -config ${config} + + name=$3 + fi + + mv cert.crt $name.crt + mv out.key $name.key +} + +echo "01" > serial +> index.txt +rm -f *.0 + +gen_cert "/CN=hx509 Test Root CA/C=SE" "root" "ca" "v3_ca" +gen_cert "/CN=OCSP responder/C=SE" "ca" "ocsp-responder" "ocsp" +gen_cert "/CN=Test cert/C=SE" "ca" "test" "usr" +gen_cert "/CN=Revoke cert/C=SE" "ca" "revoke" "usr" +gen_cert "/CN=Test cert KeyEncipherment/C=SE" "ca" "test-ke-only" "usr_ke" +gen_cert "/CN=Test cert DigitalSignature/C=SE" "ca" "test-ds-only" "usr_ds" +gen_cert "/CN=pkinit/C=SE" "ca" "pkinit" "pkinit_client" +$openssl ecparam -name secp256r1 -out eccurve.pem +gen_cert "/CN=pkinit-ec/C=SE" "ca" "pkinit-ec" "pkinit_client" "XXX" ec:eccurve.pem +gen_cert "/C=SE/CN=pkinit/CN=pkinit-proxy" "pkinit" "proxy" "proxy_cert" pkinit-proxy +gen_cert "/CN=kdc/C=SE" "ca" "kdc" "pkinit_kdc" +gen_cert "/CN=www.test.h5l.se/C=SE" "ca" "https" "https" +gen_cert "/CN=Sub CA/C=SE" "ca" "sub-ca" "subca" +gen_cert "/CN=Test sub cert/C=SE" "sub-ca" "sub-cert" "usr" +gen_cert "/C=SE/CN=Test cert/CN=proxy" "test" "proxy" "proxy_cert" proxy-test +gen_cert "/C=SE/CN=Test cert/CN=proxy/CN=child" "proxy-test" "proxy" "proxy_cert" proxy-level-test +gen_cert "/C=SE/CN=Test cert/CN=no-proxy" "test" "proxy" "usr_cert" no-proxy-test +gen_cert "/C=SE/CN=Test cert/CN=proxy10" "test" "proxy" "proxy10_cert" proxy10-test +gen_cert "/C=SE/CN=Test cert/CN=proxy10/CN=child" "proxy10-test" "proxy" "proxy10_cert" proxy10-child-test +gen_cert "/C=SE/CN=Test cert/CN=proxy10/CN=child/CN=child" "proxy10-child-test" "proxy" "proxy10_cert" proxy10-child-child-test + + +# combine +cat sub-ca.crt ca.crt > sub-ca-combined.crt +cat test.crt test.key > test.combined.crt +cat pkinit-proxy.crt pkinit.crt > pkinit-proxy-chain.crt + +# password protected key +${openssl} rsa -in test.key -aes256 -passout pass:foobar -out test-pw.key +${openssl} rsa -in pkinit.key -aes256 -passout pass:foo -out pkinit-pw.key + + +${openssl} ca \ + -name usr \ + -cert ca.crt \ + -keyfile ca.key \ + -revoke revoke.crt \ + -config ${config} + +${openssl} pkcs12 \ + -export \ + -in test.crt \ + -inkey test.key \ + -passout pass:foobar \ + -out test.p12 \ + -name "friendlyname-test" \ + -certfile ca.crt \ + -caname ca + +${openssl} pkcs12 \ + -export \ + -in sub-cert.crt \ + -inkey sub-cert.key \ + -passout pass:foobar \ + -out sub-cert.p12 \ + -name "friendlyname-sub-cert" \ + -certfile sub-ca-combined.crt \ + -caname sub-ca \ + -caname ca + +${openssl} pkcs12 \ + -keypbe NONE \ + -certpbe NONE \ + -export \ + -in test.crt \ + -inkey test.key \ + -passout pass:foobar \ + -out test-nopw.p12 \ + -name "friendlyname-cert" \ + -certfile ca.crt \ + -caname ca + +${openssl} smime \ + -sign \ + -nodetach \ + -binary \ + -in static-file \ + -signer test.crt \ + -inkey test.key \ + -outform DER \ + -out test-signed-data + +${openssl} smime \ + -sign \ + -nodetach \ + -binary \ + -in static-file \ + -signer test.crt \ + -inkey test.key \ + -noattr \ + -outform DER \ + -out test-signed-data-noattr + +${openssl} smime \ + -sign \ + -nodetach \ + -binary \ + -in static-file \ + -signer test.crt \ + -inkey test.key \ + -noattr \ + -nocerts \ + -outform DER \ + -out test-signed-data-noattr-nocerts + +${openssl} smime \ + -sign \ + -md sha1 \ + -nodetach \ + -binary \ + -in static-file \ + -signer test.crt \ + -inkey test.key \ + -outform DER \ + -out test-signed-sha-1 + +${openssl} smime \ + -sign \ + -md sha256 \ + -nodetach \ + -binary \ + -in static-file \ + -signer test.crt \ + -inkey test.key \ + -outform DER \ + -out test-signed-sha-256 + +${openssl} smime \ + -sign \ + -md sha512 \ + -nodetach \ + -binary \ + -in static-file \ + -signer test.crt \ + -inkey test.key \ + -outform DER \ + -out test-signed-sha-512 + + +${openssl} smime \ + -encrypt \ + -nodetach \ + -binary \ + -in static-file \ + -outform DER \ + -out test-enveloped-rc2-40 \ + -rc2-40 \ + test.crt + +${openssl} smime \ + -encrypt \ + -nodetach \ + -binary \ + -in static-file \ + -outform DER \ + -out test-enveloped-rc2-64 \ + -rc2-64 \ + test.crt + +${openssl} smime \ + -encrypt \ + -nodetach \ + -binary \ + -in static-file \ + -outform DER \ + -out test-enveloped-rc2-128 \ + -rc2-128 \ + test.crt + +${openssl} smime \ + -encrypt \ + -nodetach \ + -binary \ + -in static-file \ + -outform DER \ + -out test-enveloped-des \ + -des \ + test.crt + +${openssl} smime \ + -encrypt \ + -nodetach \ + -binary \ + -in static-file \ + -outform DER \ + -out test-enveloped-des-ede3 \ + -des3 \ + test.crt + +${openssl} smime \ + -encrypt \ + -nodetach \ + -binary \ + -in static-file \ + -outform DER \ + -out test-enveloped-aes-128 \ + -aes128 \ + test.crt + +${openssl} smime \ + -encrypt \ + -nodetach \ + -binary \ + -in static-file \ + -outform DER \ + -out test-enveloped-aes-256 \ + -aes256 \ + test.crt + +echo ocsp requests + +${openssl} ocsp \ + -issuer ca.crt \ + -cert test.crt \ + -reqout ocsp-req1.der + +${openssl} ocsp \ + -index index.txt \ + -rsigner ocsp-responder.crt \ + -rkey ocsp-responder.key \ + -CA ca.crt \ + -reqin ocsp-req1.der \ + -noverify \ + -respout ocsp-resp1-ocsp.der + +${openssl} ocsp \ + -index index.txt \ + -rsigner ca.crt \ + -rkey ca.key \ + -CA ca.crt \ + -reqin ocsp-req1.der \ + -noverify \ + -respout ocsp-resp1-ca.der + +${openssl} ocsp \ + -index index.txt \ + -rsigner ocsp-responder.crt \ + -rkey ocsp-responder.key \ + -CA ca.crt \ + -resp_no_certs \ + -reqin ocsp-req1.der \ + -noverify \ + -respout ocsp-resp1-ocsp-no-cert.der + +${openssl} ocsp \ + -index index.txt \ + -rsigner ocsp-responder.crt \ + -rkey ocsp-responder.key \ + -CA ca.crt \ + -reqin ocsp-req1.der \ + -resp_key_id \ + -noverify \ + -respout ocsp-resp1-keyhash.der + +${openssl} ocsp \ + -issuer ca.crt \ + -cert revoke.crt \ + -reqout ocsp-req2.der + +${openssl} ocsp \ + -index index.txt \ + -rsigner ocsp-responder.crt \ + -rkey ocsp-responder.key \ + -CA ca.crt \ + -reqin ocsp-req2.der \ + -noverify \ + -respout ocsp-resp2.der + +${openssl} ca \ + -gencrl \ + -name usr \ + -crldays 3600 \ + -keyfile ca.key \ + -cert ca.crt \ + -crl_reason superseded \ + -out crl1.crl \ + -config ${config} + +${openssl} crl -in crl1.crl -outform der -out crl1.der diff --git a/crypto/heimdal/lib/hx509/data/https.crt b/crypto/heimdal/lib/hx509/data/https.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/https.crt @@ -0,0 +1,116 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 9 (0x9) + Signature Algorithm: sha1WithRSAEncryption + Issuer: CN=hx509 Test Root CA, C=SE + Validity + Not Before: May 23 15:05:17 2019 GMT + Not After : Jan 16 15:05:17 2038 GMT + Subject: C=SE, CN=www.test.h5l.se + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (4096 bit) + Modulus: + 00:b5:58:e9:eb:2d:b3:7c:94:b7:a2:08:ec:fd:50: + c2:61:a4:35:c8:eb:ad:d6:93:4c:50:9a:ad:e0:9a: + 00:ae:4e:ef:ed:5e:ef:d9:cb:98:a6:5e:65:7f:a6: + 38:c0:ee:17:48:90:80:4c:6c:71:7a:11:af:11:22: + 1b:17:2c:db:c2:cc:2c:d0:0e:de:ea:95:6a:d0:42: + bb:b0:a1:eb:7c:9e:f0:28:64:dd:44:7f:c8:f6:d5: + 48:e4:80:be:f7:58:18:d6:d4:57:7a:09:07:3f:23: + d8:00:53:84:0f:72:e9:0d:a8:b9:49:57:80:f4:00: + 9c:92:16:bd:a7:ea:12:81:96:59:48:8b:ff:b9:8b: + 9d:68:e6:7c:0d:fb:c8:57:cc:ba:6a:4c:57:cc:e4: + eb:af:cc:6e:38:80:e6:47:a0:f2:e4:09:39:79:fb: + 42:c4:29:b2:8d:f1:8f:b9:45:1f:47:c2:e8:30:84: + a5:e7:fa:7c:df:f0:07:89:1e:fd:6f:a5:1d:88:57: + 4e:76:bf:91:c7:39:ac:87:6f:b0:29:0b:c0:04:89: + 95:9a:8a:b3:4a:22:63:7c:26:e2:ea:fc:e5:f8:43: + b5:67:50:0f:99:e0:9d:e2:2b:3f:fa:19:e4:61:1a: + e4:c7:68:66:43:a1:05:15:24:c4:09:3b:5d:b4:3a: + f8:87:d4:d8:80:cf:6c:ed:fa:b1:b7:7d:2b:68:ca: + 3a:26:a6:49:1e:e7:27:fc:4f:89:7b:19:ce:8d:c9: + 9d:cd:55:63:72:29:b1:2b:1b:35:a4:07:32:4f:13: + f1:bd:03:1f:b4:fc:f0:05:c4:9e:b0:c8:72:37:2c: + 0c:82:bc:d4:a7:87:d3:33:10:f3:80:fe:bf:61:1b: + 5e:c0:5b:c0:09:3d:db:c0:9d:91:92:c4:7c:7a:eb: + ec:b0:8e:69:a1:47:66:53:02:51:55:90:d1:e2:9a: + 86:70:7b:63:d4:b9:03:18:c8:01:69:c6:e9:63:bc: + 2b:b5:75:dc:03:5f:ef:b2:d3:3a:c8:db:3c:b6:3d: + 59:91:fc:7d:96:bf:43:97:5a:40:d6:f2:f8:82:44: + fb:9d:36:47:3f:3a:33:43:6d:9c:44:ba:60:1a:9d: + 77:02:44:14:d0:73:99:53:6d:ef:70:34:0b:11:b1: + 16:c3:c9:4b:41:66:64:4c:88:fe:12:8f:3d:4f:29: + 2f:b3:e8:15:8b:26:5a:ba:f9:fc:6b:ec:9d:8a:d9: + 65:17:de:e5:ce:a7:84:1b:1e:f1:ad:32:b3:78:15: + 7a:08:e3:93:9e:e5:eb:3c:33:9e:d5:2a:21:20:62: + 90:c7:d8:3e:d4:1e:0f:06:20:01:6e:22:a4:67:de: + 68:f0:b9 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + X509v3 Key Usage: + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Subject Key Identifier: + 91:03:3F:14:E3:BD:43:98:B2:D4:7F:46:C2:A7:B7:BB:0F:74:99:F3 + Signature Algorithm: sha1WithRSAEncryption + 27:3f:d8:cb:68:c8:ef:35:ed:a0:50:d7:58:60:77:48:76:45: + 7a:2c:20:22:81:62:e3:e2:0d:10:48:d7:74:23:95:76:fb:78: + c3:98:d2:39:13:13:7f:2a:38:dc:2a:80:ba:33:0a:51:d6:9e: + 0c:44:04:84:f0:ae:20:1e:e6:e8:89:09:cd:87:66:1b:80:21: + e7:bc:03:e0:c7:15:19:23:b7:05:0b:f9:64:50:b6:6f:7d:14: + 68:96:bb:4d:d6:c0:29:7f:e3:a1:48:c4:ad:6f:a7:bf:d2:63: + de:b7:fa:4f:8c:5e:ad:8e:c8:7e:4f:a4:9a:95:71:29:10:64: + 78:a0:55:ac:ec:9a:f0:27:03:2e:c4:ec:fb:4f:d2:a0:7e:98: + 90:88:30:02:45:07:10:d5:ad:f6:a8:e7:01:6c:87:c7:2e:0d: + d1:35:3a:e6:b0:e9:19:c9:c9:f7:ce:5e:77:d1:50:84:8a:c3: + d1:f1:56:2d:6e:65:0d:6f:e2:a0:c5:0e:48:82:6e:da:37:42: + fa:cf:5d:92:84:3a:67:bd:41:28:19:b8:81:1c:c3:eb:00:f0: + b0:a9:59:17:79:87:4b:d9:4f:e8:cf:30:76:42:55:9c:57:00: + d1:b2:2e:19:59:31:24:c2:9c:fa:c1:0b:54:56:a5:29:19:fd: + 14:82:c0:3f:a8:d1:a1:c9:6d:1e:f4:11:89:50:58:4f:8d:8a: + f8:f2:47:29:8c:a8:2d:21:1b:9b:ef:c6:1f:63:90:85:f1:c7: + d0:40:a0:53:29:9b:49:6a:73:38:d2:25:95:f7:52:2f:a0:24: + 1c:af:f1:f9:6e:78:d3:81:03:cd:3d:91:b0:99:45:fb:87:39: + 6e:b3:7c:fb:f7:60:01:86:71:40:5f:85:8b:7e:fb:cf:95:df: + 76:cc:7b:2c:06:d9:a5:cf:4d:f7:62:ab:57:2c:da:83:6e:34: + bc:bd:d8:d1:d4:5f:1b:94:78:c0:d3:b1:8c:82:d7:b1:f5:2c: + e5:30:bf:59:3e:d2:1f:a4:8e:0b:0c:d6:d1:fd:08:24:2c:31: + cb:b0:e6:36:3f:d7:b0:46:99:e1:48:18:8f:9f:42:fd:44:cb: + 6d:cc:b3:07:3b:7c:eb:44:d2:b4:52:12:2a:ba:c3:cb:f8:04: + 65:02:27:61:b9:35:9c:0d:0b:70:a1:d4:e7:c8:49:91:37:03: + 9e:8f:6e:a5:91:e8:6e:5e:ec:c4:17:4c:f6:dd:93:11:9d:40: + ad:e2:3c:05:dc:22:ff:1a:04:d7:b0:d4:a4:c0:03:e3:ba:4c: + 5e:b3:7a:bc:08:73:52:92:42:ab:7a:85:e1:64:e1:4e:b5:63: + 98:a9:b1:fb:23:61:1e:d5 +-----BEGIN CERTIFICATE----- +MIIFBTCCAu2gAwIBAgIBCTANBgkqhkiG9w0BAQUFADAqMRswGQYDVQQDDBJoeDUw +OSBUZXN0IFJvb3QgQ0ExCzAJBgNVBAYTAlNFMB4XDTE5MDUyMzE1MDUxN1oXDTM4 +MDExNjE1MDUxN1owJzELMAkGA1UEBhMCU0UxGDAWBgNVBAMMD3d3dy50ZXN0Lmg1 +bC5zZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALVY6ests3yUt6II +7P1QwmGkNcjrrdaTTFCareCaAK5O7+1e79nLmKZeZX+mOMDuF0iQgExscXoRrxEi +Gxcs28LMLNAO3uqVatBCu7Ch63ye8Chk3UR/yPbVSOSAvvdYGNbUV3oJBz8j2ABT +hA9y6Q2ouUlXgPQAnJIWvafqEoGWWUiL/7mLnWjmfA37yFfMumpMV8zk66/MbjiA +5keg8uQJOXn7QsQpso3xj7lFH0fC6DCEpef6fN/wB4ke/W+lHYhXTna/kcc5rIdv +sCkLwASJlZqKs0oiY3wm4ur85fhDtWdQD5ngneIrP/oZ5GEa5MdoZkOhBRUkxAk7 +XbQ6+IfU2IDPbO36sbd9K2jKOiamSR7nJ/xPiXsZzo3Jnc1VY3IpsSsbNaQHMk8T +8b0DH7T88AXEnrDIcjcsDIK81KeH0zMQ84D+v2EbXsBbwAk928CdkZLEfHrr7LCO +aaFHZlMCUVWQ0eKahnB7Y9S5AxjIAWnG6WO8K7V13ANf77LTOsjbPLY9WZH8fZa/ +Q5daQNby+IJE+502Rz86M0NtnES6YBqddwJEFNBzmVNt73A0CxGxFsPJS0FmZEyI +/hKPPU8pL7PoFYsmWrr5/GvsnYrZZRfe5c6nhBse8a0ys3gVegjjk57l6zwzntUq +ISBikMfYPtQeDwYgAW4ipGfeaPC5AgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0P +BAQDAgXgMB0GA1UdDgQWBBSRAz8U471DmLLUf0bCp7e7D3SZ8zANBgkqhkiG9w0B +AQUFAAOCAgEAJz/Yy2jI7zXtoFDXWGB3SHZFeiwgIoFi4+INEEjXdCOVdvt4w5jS +ORMTfyo43CqAujMKUdaeDEQEhPCuIB7m6IkJzYdmG4Ah57wD4McVGSO3BQv5ZFC2 +b30UaJa7TdbAKX/joUjErW+nv9Jj3rf6T4xerY7Ifk+kmpVxKRBkeKBVrOya8CcD +LsTs+0/SoH6YkIgwAkUHENWt9qjnAWyHxy4N0TU65rDpGcnJ985ed9FQhIrD0fFW +LW5lDW/ioMUOSIJu2jdC+s9dkoQ6Z71BKBm4gRzD6wDwsKlZF3mHS9lP6M8wdkJV +nFcA0bIuGVkxJMKc+sELVFalKRn9FILAP6jRocltHvQRiVBYT42K+PJHKYyoLSEb +m+/GH2OQhfHH0ECgUymbSWpzONIllfdSL6AkHK/x+W5404EDzT2RsJlF+4c5brN8 ++/dgAYZxQF+Fi377z5Xfdsx7LAbZpc9N92KrVyzag240vL3Y0dRfG5R4wNOxjILX +sfUs5TC/WT7SH6SOCwzW0f0IJCwxy7DmNj/XsEaZ4UgYj59C/UTLbcyzBzt860TS +tFISKrrDy/gEZQInYbk1nA0LcKHU58hJkTcDno9upZHobl7sxBdM9t2TEZ1AreI8 +Bdwi/xoE17DUpMAD47pMXrN6vAhzUpJCq3qF4WThTrVjmKmx+yNhHtU= +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/https.key b/crypto/heimdal/lib/hx509/data/https.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/https.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +2zmdO3l0e9ryWpkYHrKaEdZhkQx6ryE= +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/j.pem b/crypto/heimdal/lib/hx509/data/j.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/j.pem @@ -0,0 +1,26 @@ +-----BEGIN CERTIFICATE----- +MIIEajCCA1KgAwIBAgIBATANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJKUDEN +MAsGA1UECgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24g +Rm9yIEpQS0kxETAPBgNVBAsMCEJyaWRnZUNBMB4XDTAzMTIyNzA1MDgxNVoXDTEz +MTIyNjE0NTk1OVowWjELMAkGA1UEBhMCSlAxDTALBgNVBAoMBEpQS0kxKTAnBgNV +BAsMIFByZWZlY3R1cmFsIEFzc29jaWF0aW9uIEZvciBKUEtJMREwDwYDVQQLDAhC +cmlkZ2VDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANTnUmg7K3m8 +52vd77kwkq156euwoWm5no8E8kmaTSc7x2RABPpqNTlMKdZ6ttsyYrqREeDkcvPL +yF7yf/I8+innasNtsytcTAy8xY8Avsbd4JkCGW9dyPjk9pzzc3yLQ64Rx2fujRn2 +agcEVdPCr/XpJygX8FD5bbhkZ0CVoiASBmlHOcC3YpFlfbT1QcpOSOb7o+VdKVEi +MMfbBuU2IlYIaSr/R1nO7RPNtkqkFWJ1/nKjKHyzZje7j70qSxb+BTGcNgTHa1YA +UrogKB+UpBftmb4ds+XlkEJ1dvwokiSbCDaWFKD+YD4B2s0bvjCbw8xuZFYGhNyR +/2D5XfN1s2MCAwEAAaOCATkwggE1MA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MG0GA1UdHwRmMGQwYqBgoF6kXDBaMQswCQYDVQQGEwJKUDENMAsGA1UE +CgwESlBLSTEpMCcGA1UECwwgUHJlZmVjdHVyYWwgQXNzb2NpYXRpb24gRm9yIEpQ +S0kxETAPBgNVBAsMCEJyaWRnZUNBMIGDBgNVHREEfDB6pHgwdjELMAkGA1UEBhMC +SlAxJzAlBgNVBAoMHuWFrOeahOWAi+S6uuiqjeiovOOCteODvOODk+OCuTEeMBwG +A1UECwwV6YO96YGT5bqc55yM5Y2U6K2w5LyaMR4wHAYDVQQLDBXjg5bjg6rjg4Pj +grjoqo3oqLzlsYAwHQYDVR0OBBYEFNQXMiCqQNkR2OaZmQgLtf8mR8p8MA0GCSqG +SIb3DQEBBQUAA4IBAQATjJo4reTNPC5CsvAKu1RYT8PyXFVYHbKsEpGt4GR8pDCg +HEGAiAhHSNrGh9CagZMXADvlG0gmMOnXowriQQixrtpkmx0TB8tNAlZptZWkZC+R +8TnjOkHrk2nFAEC3ezbdK0R7MR4tJLDQCnhEWbg50rf0wZ/aF8uAaVeEtHXa6W0M +Xq3dSe0XAcrLbX4zZHQTaWvdpLAIjl6DZ3SCieRMyoWUL+LXaLFdTP5WBCd+No58 +IounD9X4xxze2aeRVaiV/WnQ0OSPNS7n7YXy6xQdnaOU4KRW/Lne1EDf5IfWC/ih +bVAmhZMbcrkWWcsR6aCPG+2mV3zTD6AUzuKPal8Y +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/kdc.crt b/crypto/heimdal/lib/hx509/data/kdc.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/kdc.crt @@ -0,0 +1,122 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 8 (0x8) + Signature Algorithm: sha1WithRSAEncryption + Issuer: CN=hx509 Test Root CA, C=SE + Validity + Not Before: May 23 15:05:16 2019 GMT + Not After : Jan 16 15:05:16 2038 GMT + Subject: C=SE, CN=kdc + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (4096 bit) + Modulus: + 00:ab:f2:c2:da:bb:d1:bc:5a:96:c0:76:11:4e:7a: + 52:49:8b:84:ae:ca:44:4c:5b:30:ad:9a:6d:94:5b: + 1a:52:3f:d5:9b:d9:62:4b:96:51:bd:e3:55:be:5b: + 09:65:7b:3a:3b:2a:1f:9b:a2:95:e5:a6:f6:85:1f: + 7b:35:b8:2c:55:14:19:13:91:bd:56:6e:5b:f7:49: + 03:a8:53:01:16:27:53:8e:3e:71:1d:9c:dc:38:30: + 38:c2:55:e3:58:15:bb:de:53:8d:2a:5f:68:b0:49: + e4:7f:dc:38:57:fe:89:1b:6f:5d:52:fc:fd:cc:ef: + 37:71:e6:70:13:3f:24:5a:a2:8d:b5:a4:90:4a:2a: + 0e:e0:c2:6f:4d:0e:ef:ab:c9:2f:90:0a:ee:20:e8: + be:6b:bb:4e:43:8b:56:9f:50:aa:e0:71:2b:0f:2b: + b6:68:d6:11:c0:c4:31:b0:ab:32:a1:2e:93:54:6d: + ab:d3:c1:84:4f:c3:fc:10:a5:fa:6a:ae:8c:80:05: + 7c:54:4c:c1:aa:bc:50:ec:3c:19:9e:aa:df:82:0c: + e7:6e:ed:c9:f4:46:3e:60:6b:81:d9:b3:d7:64:19: + 5f:64:bc:b5:a6:f6:38:03:02:ab:f2:b3:ba:2f:4f: + be:e3:c3:34:cb:d8:01:42:3d:43:81:9d:a9:4f:5e: + 6f:14:d1:84:05:b6:f3:f0:9b:fa:b5:e8:1f:e6:40: + e2:b9:ce:a9:eb:1c:c4:da:85:b2:6b:b1:c7:a5:91: + 0f:a0:79:7a:85:b2:b4:b5:4e:a6:8c:cd:c6:45:5c: + 97:d2:e8:3c:01:2a:77:b2:e1:a7:2f:ed:2c:bf:42: + 77:94:a4:47:bf:c7:58:43:14:08:66:4e:5d:24:99: + bd:5f:0d:e1:b1:56:f1:c3:db:97:f6:b5:22:92:23: + eb:a5:f5:49:4d:76:80:4a:83:af:a8:17:31:38:b6: + 3b:49:1e:37:5e:fb:e7:9e:90:1d:8c:b0:8a:c2:dd: + 5e:1d:1c:2f:c4:71:aa:d2:2b:c5:16:09:f1:5d:63: + 7c:02:dc:b6:e0:b9:f6:2b:a1:56:1b:20:8f:13:c4: + 60:d0:21:c9:91:a4:43:de:f9:64:d8:4a:5c:4a:cd: + 51:87:66:55:ec:9c:2d:10:b3:23:6e:0e:48:44:2b: + 86:01:73:2e:77:28:5b:6e:43:09:ea:0f:cc:0e:da: + da:88:f9:ef:6b:37:48:bd:e4:47:4a:4f:f9:72:bd: + b9:c4:a0:bc:67:29:ec:5a:55:22:b6:8e:f0:23:9f: + c1:fb:86:9c:18:59:43:4c:eb:b6:bd:2e:18:fb:44: + ae:27:15:e7:3d:6d:9a:c7:6f:61:99:e1:7a:80:de: + 64:a8:e7 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + X509v3 Key Usage: + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Extended Key Usage: + Signing KDC Response + X509v3 Subject Key Identifier: + E6:0A:BC:C8:0C:58:A4:53:82:C7:15:E0:42:D6:73:67:26:2C:39:D1 + X509v3 Subject Alternative Name: + othername: + Signature Algorithm: sha1WithRSAEncryption + 31:6b:88:4f:57:8a:4b:7b:25:d8:53:0f:04:e9:52:a7:e3:93: + 12:ed:bc:96:03:c3:ae:53:6a:10:60:76:18:85:1d:9c:b6:93: + d8:92:d1:d8:e5:af:23:d6:64:93:11:f3:23:8e:ed:43:12:dc: + 5d:1b:d5:49:b8:3d:fd:e7:52:58:a9:26:2c:cb:49:09:d4:54: + 6e:e6:45:c9:1c:3f:50:b9:f3:13:65:84:45:a7:1c:23:48:ad: + 93:c0:f9:b2:fa:1e:25:d0:40:d5:8f:7a:c8:8c:72:ba:88:22: + 19:a7:3a:08:cf:7d:9c:45:da:3e:12:64:3f:b4:e0:c4:36:97: + a9:be:ef:e2:4a:1a:cc:c7:f9:8f:4f:30:04:11:f4:16:cf:ff: + 6e:85:f1:cf:98:3d:09:e9:f1:98:30:ff:a2:3c:d5:96:50:3d: + cb:21:db:89:56:8c:f4:a6:87:e3:78:44:49:c5:53:c9:19:a1: + ff:a0:0d:4e:a7:89:d9:11:52:39:21:b4:b9:21:e8:af:39:9e: + 2c:41:3d:82:3e:20:b8:60:8a:b6:de:d6:6c:f3:b7:5a:10:ce: + ba:92:a7:6a:0d:5f:22:e6:98:e4:2c:d7:2d:7a:d4:22:bd:15: + ce:2c:79:7f:d6:d0:78:f8:d9:a6:e7:87:84:cb:0b:8b:1e:aa: + 0c:57:4b:8c:3a:a9:e5:66:92:eb:00:b2:2c:05:1f:14:ab:23: + 7a:61:b0:00:02:bf:24:42:8e:0e:1d:52:20:11:93:94:b5:2a: + 56:33:f4:bb:63:21:ea:64:cf:d2:92:8c:70:7e:b5:f9:4a:c2: + aa:a5:81:36:bb:76:cb:ec:98:bb:3c:8c:67:1a:0c:3e:97:f1: + 4c:dc:25:e2:59:a2:6d:fd:db:54:ea:9b:14:5f:18:dc:2c:e1: + 45:89:27:a0:b7:f0:09:57:94:b5:dd:9e:84:51:35:98:12:c7: + 20:ad:75:4d:42:54:44:30:e2:b9:cb:25:0f:e0:a9:6d:d5:6d: + 7a:97:b6:fe:b7:54:4e:83:ed:bb:4d:d3:80:99:2b:1b:ee:a1: + 3b:b8:69:52:64:f7:d2:bc:2f:18:73:d6:8d:04:54:c1:3f:14: + 05:65:fb:cf:c2:38:25:92:33:cc:f1:48:cf:e5:d1:a6:c2:57: + 1d:06:d8:1d:a1:0d:d6:e6:8e:ba:b6:d6:88:3c:a7:87:02:bb: + 32:47:82:aa:d6:5f:8a:69:d8:5e:38:99:a6:1d:09:a8:d5:b8: + 4c:80:23:ed:83:67:5f:b8:8e:f2:c4:8f:8b:76:b6:a2:09:b5: + 44:1c:70:d2:5b:61:cb:c6:68:f9:9b:93:72:5a:bc:08:98:80: + 90:64:a7:d3:a1:f8:ee:b7 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBCDANBgkqhkiG9w0BAQUFADAqMRswGQYDVQQDDBJoeDUw +OSBUZXN0IFJvb3QgQ0ExCzAJBgNVBAYTAlNFMB4XDTE5MDUyMzE1MDUxNloXDTM4 +MDExNjE1MDUxNlowGzELMAkGA1UEBhMCU0UxDDAKBgNVBAMMA2tkYzCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKvywtq70bxalsB2EU56UkmLhK7KRExb +MK2abZRbGlI/1ZvZYkuWUb3jVb5bCWV7OjsqH5uileWm9oUfezW4LFUUGRORvVZu +W/dJA6hTARYnU44+cR2c3DgwOMJV41gVu95TjSpfaLBJ5H/cOFf+iRtvXVL8/czv +N3HmcBM/JFqijbWkkEoqDuDCb00O76vJL5AK7iDovmu7TkOLVp9QquBxKw8rtmjW +EcDEMbCrMqEuk1Rtq9PBhE/D/BCl+mqujIAFfFRMwaq8UOw8GZ6q34IM527tyfRG +PmBrgdmz12QZX2S8tab2OAMCq/Kzui9PvuPDNMvYAUI9Q4GdqU9ebxTRhAW28/Cb ++rXoH+ZA4rnOqescxNqFsmuxx6WRD6B5eoWytLVOpozNxkVcl9LoPAEqd7Lhpy/t +LL9Cd5SkR7/HWEMUCGZOXSSZvV8N4bFW8cPbl/a1IpIj66X1SU12gEqDr6gXMTi2 +O0keN177556QHYywisLdXh0cL8RxqtIrxRYJ8V1jfALctuC59iuhVhsgjxPEYNAh +yZGkQ975ZNhKXErNUYdmVeycLRCzI24OSEQrhgFzLncoW25DCeoPzA7a2oj572s3 +SL3kR0pP+XK9ucSgvGcp7FpVIraO8COfwfuGnBhZQ0zrtr0uGPtEricV5z1tmsdv +YZnheoDeZKjnAgMBAAGjgZgwgZUwCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwEgYD +VR0lBAswCQYHKwYBBQIDBTAdBgNVHQ4EFgQU5gq8yAxYpFOCxxXgQtZzZyYsOdEw +SAYDVR0RBEEwP6A9BgYrBgEFAgKgMzAxoA0bC1RFU1QuSDVMLlNFoSAwHqADAgEB +oRcwFRsGa3JidGd0GwtURVNULkg1TC5TRTANBgkqhkiG9w0BAQUFAAOCAgEAMWuI +T1eKS3sl2FMPBOlSp+OTEu28lgPDrlNqEGB2GIUdnLaT2JLR2OWvI9ZkkxHzI47t +QxLcXRvVSbg9/edSWKkmLMtJCdRUbuZFyRw/ULnzE2WERaccI0itk8D5svoeJdBA +1Y96yIxyuogiGac6CM99nEXaPhJkP7TgxDaXqb7v4koazMf5j08wBBH0Fs//boXx +z5g9CenxmDD/ojzVllA9yyHbiVaM9KaH43hEScVTyRmh/6ANTqeJ2RFSOSG0uSHo +rzmeLEE9gj4guGCKtt7WbPO3WhDOupKnag1fIuaY5CzXLXrUIr0Vzix5f9bQePjZ +pueHhMsLix6qDFdLjDqp5WaS6wCyLAUfFKsjemGwAAK/JEKODh1SIBGTlLUqVjP0 +u2Mh6mTP0pKMcH61+UrCqqWBNrt2y+yYuzyMZxoMPpfxTNwl4lmibf3bVOqbFF8Y +3CzhRYknoLfwCVeUtd2ehFE1mBLHIK11TUJURDDiucslD+CpbdVtepe2/rdUToPt +u03TgJkrG+6hO7hpUmT30rwvGHPWjQRUwT8UBWX7z8I4JZIzzPFIz+XRpsJXHQbY +HaEN1uaOurbWiDynhwK7MkeCqtZfimnYXjiZph0JqNW4TIAj7YNnX7iO8sSPi3a2 +ogm1RBxw0lthy8Zo+ZuTclq8CJiAkGSn06H47rc= +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/kdc.key b/crypto/heimdal/lib/hx509/data/kdc.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/kdc.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +HWEzextsObokaNciuMPKlJLizq1W+w== +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/key.der b/crypto/heimdal/lib/hx509/data/key.der new file mode 100644 index 0000000000000000000000000000000000000000..e7c665e3005ee3a753a3d6e26dc9f0aed74dab66 GIT binary patch literal 609 zc$@)Y0-pUaf&yIv0RRGlfdIm)qC&S@nWO!>@SAnp?>w7~&tqRk*pYNF=xwjRpOPnn~@Y$K2O#d-^0T4`Dr$-&e?s+*}#}RC~=PLpO0RRC4fq)*Q zRbE3Dd>p_x$lvd=YWovW8sq(cU0_tjiKfbvTq8tWoNBes^fMEr)Pm_calB`<1nPUQ zvl(O!xIW;#{9aT6u+x<-6VZI6!kBugYdSXc)78y;=Dd!PI_-Y!58i&9^8ii#T(gWu z*(w3UJQ+012Kf~|Je6GoOXW#CML_~V0O;1E_ww7&wIln9XE_+vWn8=8E4A;O3~Wrt zKeq*sM%*ol>Pmm+{tdkAMa2*IM7F0EW&d`wmMjSD%G`d!0|G$+)(7mqPeusAY7f2e z^xRh`j+1(G(jsi=IE-tXo%zLtWY0bY@}I?vSh+$8HH73lx#L z0zf$~m4Hl5eYq~k6q}qQBrQvm{2&1Xf`D#}fR=teNKLQ5BT~K3A&i|B8+N=2%E3NX zRHEV)WzT4<9CS&jd%prf0H5+KDa>>^_RyRY1`hVx>g3U}p!`@}s_hqp6F6&t005RB zbFyty<6o%C+oak}AId9)YmBy8r vFZBj@5ivhsq)?0J&iVT;j=No(-|+<0n~N73a914nGF!S(6}dmj{_Z7B-BBx1 literal 0 Hc$@ZU{MtpmzGV;kE7_ly7?#(FV&x%vTl1N$dqeHI2ZZ#lsE1D24)BEGzNbQS)2Ld=drU_bNLz!2lWkUj$0Rlk)>t3epOnFoxeo7D+ z$b|#m47w^^H&urL2?cfm$1qBv8@_?TgpTPRA8?&*z6w-lQ55fP=tMHmh|(~o8bcS<&c0ZBgJU)f-7D`Ywhsb90FydG#(YU_D(OxW3f6LQ^6;QQ wr~1UeNiS!dd!3Rtwv;GUvkMm3S9*NE-7qo))6q0SKK#B1-+z3KpstSF \ + secp256r1TestCA.pem +cat secp256r2TestClient.cert.pem secp256r2TestClient.key.pem > \ + secp256r2TestClient.pem +cat secp256r2TestServer.cert.pem secp256r2TestServer.key.pem > \ + secp256r2TestServer.pem diff --git a/crypto/heimdal/lib/hx509/data/n0ll.pem b/crypto/heimdal/lib/hx509/data/n0ll.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/n0ll.pem @@ -0,0 +1,47 @@ +https://www.noisebridge.net/pipermail/noisebridge-discuss/2009-September/008400.html + +Jacob Appelbaum jacob at appelbaum.net +Tue Sep 29 22:51:33 PDT 2009 + + +I hope this release will help with confirmation of the bug and with +regression testing. Feel free to use this certificate for anything +relating to free software too. Consider it released into the public +domain of interesting integers. + +-----BEGIN CERTIFICATE----- +MIIGTjCCBbegAwIBAgIDExefMA0GCSqGSIb3DQEBBQUAMIIBEjELMAkGA1UEBhMC +RVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMSkwJwYD +VQQKEyBJUFMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgcy5sLjEuMCwGA1UEChQl +Z2VuZXJhbEBpcHNjYS5jb20gQy5JLkYuICBCLUI2MjIxMDY5NTEuMCwGA1UECxMl +aXBzQ0EgQ0xBU0VBMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl +aXBzQ0EgQ0xBU0VBMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEgMB4GCSqGSIb3 +DQEJARYRZ2VuZXJhbEBpcHNjYS5jb20wHhcNMDkwNzMwMDcxNDQyWhcNMTEwNzMw +MDcxNDQyWjCBnjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAU +BgNVBAcTDVNhbiBGcmFuY2lzY28xFDASBgNVBAoTC05vaXNlYnJpZGdlMSMwIQYD +VQQLExpNb3hpZSBNYXJsaW5zcGlrZSBGYW4gQ2x1YjEnMCUGA1UEAxQeKgB0aG91 +Z2h0Y3JpbWUubm9pc2VicmlkZ2UubmV0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB +iQKBgQDPTRdCAI0MQZUxjEAwvF5CtigJdS8ZYdmrTezzRMQcAZVvJ+twB5hPHgXQ +82xJRebeSHpZ8MKTajecAnJPvRQ2JqFwl9T+SyTozSkeYRqFsG+WBoMQE9aJn70H +Z/FC3ptjZ4uW+QbvfJNLavk5MTJ/mFnvzpG+Bc7wgjPYdgZMnwIDAQABo4IDITCC +Ax0wCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBkAwCwYDVR0PBAQDAgP4MBMG +A1UdJQQMMAoGCCsGAQUFBwMBMB0GA1UdDgQWBBStfpIwBXE+eXWUWtE3s5JqXon2 +TzAfBgNVHSMEGDAWgBQOB2DUOckbW12QeyPI0jSdSppGOTAJBgNVHREEAjAAMBwG +A1UdEgQVMBOBEWdlbmVyYWxAaXBzY2EuY29tMHIGCWCGSAGG+EIBDQRlFmNPcmdh +bml6YXRpb24gSW5mb3JtYXRpb24gTk9UIFZBTElEQVRFRC4gQ0xBU0VBMSBTZXJ2 +ZXIgQ2VydGlmaWNhdGUgaXNzdWVkIGJ5IGh0dHBzOi8vd3d3Lmlwc2NhLmNvbS8w +LwYJYIZIAYb4QgECBCIWIGh0dHBzOi8vd3d3Lmlwc2NhLmNvbS9pcHNjYTIwMDIv +MEMGCWCGSAGG+EIBBAQ2FjRodHRwczovL3d3dy5pcHNjYS5jb20vaXBzY2EyMDAy +L2lwc2NhMjAwMkNMQVNFQTEuY3JsMEYGCWCGSAGG+EIBAwQ5FjdodHRwczovL3d3 +dy5pcHNjYS5jb20vaXBzY2EyMDAyL3Jldm9jYXRpb25DTEFTRUExLmh0bWw/MEMG +CWCGSAGG+EIBBwQ2FjRodHRwczovL3d3dy5pcHNjYS5jb20vaXBzY2EyMDAyL3Jl +bmV3YWxDTEFTRUExLmh0bWw/MEEGCWCGSAGG+EIBCAQ0FjJodHRwczovL3d3dy5p +cHNjYS5jb20vaXBzY2EyMDAyL3BvbGljeUNMQVNFQTEuaHRtbDCBgwYDVR0fBHww +ejA5oDegNYYzaHR0cDovL3d3dy5pcHNjYS5jb20vaXBzY2EyMDAyL2lwc2NhMjAw +MkNMQVNFQTEuY3JsMD2gO6A5hjdodHRwOi8vd3d3YmFjay5pcHNjYS5jb20vaXBz +Y2EyMDAyL2lwc2NhMjAwMkNMQVNFQTEuY3JsMDIGCCsGAQUFBwEBBCYwJDAiBggr +BgEFBQcwAYYWaHR0cDovL29jc3AuaXBzY2EuY29tLzANBgkqhkiG9w0BAQUFAAOB +gQAjzXaLBu+/+RP0vQ6WjW/Pxgm4WQYhecqZ2+7ZFbsUCMJPQ8XE2uv+rIteGnRF +Zr3hYb+dVlfUnethjPhazZW+/hU4FePqmlbTtmMe+zMLThiScyC8y3EW4L4BZYcp +p1drPlZIj2RmSgPQ99oToUk5O6t+LMg1N14ajr9TpM8yNQ== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/nist-data b/crypto/heimdal/lib/hx509/data/nist-data new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/nist-data @@ -0,0 +1,91 @@ +# $Id$ +# id verify cert hxtool-verify-arguments... +# p(ass) f(ail) +# Those id's that end with i are invariants of the orignal test +# +# 4.1 Signature Verification +# +4.1.1 p ValidCertificatePathTest1EE.crt GoodCACert.crt GoodCACRL.crl +4.1.2 f InvalidCASignatureTest2EE.crt BadSignedCACert.crt BadSignedCACRL.crl +4.1.3 f InvalidEESignatureTest3EE.crt GoodCACert.crt GoodCACRL.crl +#4.1.4 p ValidDSASignaturesTest4EE.crt DSACACert.crt DSACACRL.crl +#4.1.5 p ValidDSAParameterInheritanceTest5EE.crl DSAParametersInheritedCACert.crt DSAParametersInheritedCACRL.crl DSACACert.crt DSACACRL.crl +#4.1.6 f InvalidDSASignaturesTest6EE.crt DSACACert.crt DSACACRL.crl +# +# 4.2 Validity Periods +# +4.2.1 f InvalidCAnotBeforeDateTest1EE.crt BadnotBeforeDateCACert.crt BadnotBeforeDateCACRL.crl +4.2.2 f InvalidEEnotBeforeDateTest2EE.crt GoodCACert.crt GoodCACRL.crl +4.2.3 p Validpre2000UTCnotBeforeDateTest3EE.crt GoodCACert.crt GoodCACRL.crl +4.2.4 p ValidGeneralizedTimenotBeforeDateTest4EE.crt GoodCACert.crt GoodCACRL.crl +4.2.5 f InvalidCAnotAfterDateTest5EE.crt BadnotAfterDateCACert.crt BadnotAfterDateCACRL.crl +4.2.6 f InvalidEEnotAfterDateTest6EE.crt GoodCACert.crt GoodCACRL.crl +4.2.7 f Invalidpre2000UTCEEnotAfterDateTest7EE.crt GoodCACert.crt GoodCACRL.crl +#4.2.8 p ValidGeneralizedTimenotAfterDateTest8EE.crt GoodCACert.crt GoodCACRL.crl +# +# 4.4 CRtests +# +4.4.1 f InvalidMissingCRLTest1EE.crt NoCRLCACert.crt +4.4.1i p InvalidMissingCRLTest1EE.crt --missing-revoke NoCRLCACert.crt +4.4.2 f InvalidRevokedEETest3EE.crt GoodCACert.crt InvalidRevokedCATest2EE.crt GoodCACRL.crl RevokedsubCACRL.crl +4.4.2i p InvalidRevokedEETest3EE.crt --missing-revoke GoodCACert.crt InvalidRevokedCATest2EE.crt +4.4.3 f InvalidRevokedEETest3EE.crt GoodCACert.crt GoodCACRL.crl +4.4.3i p InvalidRevokedEETest3EE.crt --missing-revoke GoodCACert.crt +4.4.4 f InvalidBadCRLSignatureTest4EE.crt BadCRLSignatureCACert.crt BadCRLSignatureCACRL.crl +4.4.4i p InvalidBadCRLSignatureTest4EE.crt --missing-revoke BadCRLSignatureCACert.crt +4.4.5 f InvalidBadCRLIssuerNameTest5EE.crt BadCRLIssuerNameCACert.crt BadCRLIssuerNameCACRL.crl +4.4.5i p InvalidBadCRLIssuerNameTest5EE.crt --missing-revoke BadCRLIssuerNameCACert.crt +4.4.6 f InvalidWrongCRLTest6EE.crt WrongCRLCACert.crt WrongCRLCACRL.crl +4.4.7 p ValidTwoCRLsTest7EE.crt TwoCRLsCACert.crt TwoCRLsCAGoodCRL.crl TwoCRLsCABadCRL.crl +4.4.8 f InvalidUnknownCRLEntryExtensionTest8EE.crt UnknownCRLEntryExtensionCACert.crt UnknownCRLEntryExtensionCACRL.crl +4.4.9 f InvalidUnknownCRLExtensionTest9EE.crt UnknownCRLExtensionCACert.crt UnknownCRLExtensionCACRL.crl +4.4.10 f InvalidUnknownCRLExtensionTest10EE.crt UnknownCRLExtensionCACert.crt UnknownCRLExtensionCACRL.crl +4.4.11 f InvalidOldCRLnextUpdateTest11EE.crt OldCRLnextUpdateCACert.crt OldCRLnextUpdateCACRL.crl +4.4.12 f Invalidpre2000CRLnextUpdateTest12EE.crt pre2000CRLnextUpdateCACert.crt pre2000CRLnextUpdateCACRL.crl +#4.4.13-xxx s ValidGeneralizedTimeCRLnextUpdateTest13EE.crt GeneralizedTimeCRLnextUpdateCACert.crt GeneralizedTimeCRLnextUpdateCACRL.crl +4.4.14 p ValidNegativeSerialNumberTest14EE.crt NegativeSerialNumberCACert.crt NegativeSerialNumberCACRL.crl +4.4.15 f InvalidNegativeSerialNumberTest15EE.crt NegativeSerialNumberCACert.crt NegativeSerialNumberCACRL.crl +4.4.16 p ValidLongSerialNumberTest16EE.crt LongSerialNumberCACert.crt LongSerialNumberCACRL.crl +4.4.17 p ValidLongSerialNumberTest17EE.crt LongSerialNumberCACert.crt LongSerialNumberCACRL.crl +4.4.18 f InvalidLongSerialNumberTest18EE.crt LongSerialNumberCACert.crt LongSerialNumberCACRL.crl +# +# +# 4.8 Ceificate Policies +incomplete4.8.2 p AllCertificatesNoPoliciesTest2EE.crt NoPoliciesCACert.crt NoPoliciesCACRL.crl +incomplete4.8.10 p AllCertificatesSamePoliciesTest10EE.crt PoliciesP12CACert.crt PoliciesP12CACRL.crl +incomplete4.8.13 p AllCertificatesSamePoliciesTest13EE.crt PoliciesP123CACert.crt PoliciesP123CACRL.crl +incomplete4.8.11 p AllCertificatesanyPolicyTest11EE.crt anyPolicyCACert.crt anyPolicyCACRL.crl +unknown p AnyPolicyTest14EE.crt anyPolicyCACert.crt anyPolicyCACRL.crl +unknown f BadSignedCACert.crt +unknown f BadnotAfterDateCACert.crt +unknown f BadnotBeforeDateCACert.crt +# +# 4.13 Name Constraints +# +4.13.1 p ValidDNnameConstraintsTest1EE.crt nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +4.13.2 f InvalidDNnameConstraintsTest2EE.crt nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +4.13.3 f InvalidDNnameConstraintsTest3EE.crt nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +4.13.4 p ValidDNnameConstraintsTest4EE.crt nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +4.13.5 p ValidDNnameConstraintsTest5EE.crt nameConstraintsDN2CACert.crt nameConstraintsDN2CACRL.crl +4.13.6 p ValidDNnameConstraintsTest6EE.crt nameConstraintsDN3CACert.crt nameConstraintsDN3CACRL.crl +4.13.7 f InvalidDNnameConstraintsTest7EE.crt nameConstraintsDN3CACert.crt nameConstraintsDN3CACRL.crl +4.13.8 f InvalidDNnameConstraintsTest8EE.crt nameConstraintsDN4CACert.crt nameConstraintsDN4CACRL.crl +4.13.9 f InvalidDNnameConstraintsTest9EE.crt nameConstraintsDN4CACert.crt nameConstraintsDN4CACRL.crl +4.13.10 f InvalidDNnameConstraintsTest10EE.crt nameConstraintsDN5CACert.crt nameConstraintsDN5CACRL.crl +4.13.11 p ValidDNnameConstraintsTest11EE.crt nameConstraintsDN5CACert.crt nameConstraintsDN5CACRL.crl +4.13.12 f InvalidDNnameConstraintsTest12EE.crt nameConstraintsDN1subCA1Cert.crt nameConstraintsDN1subCA1CRL.crl nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +4.13.13 f InvalidDNnameConstraintsTest13EE.crt nameConstraintsDN1subCA1Cert.crt nameConstraintsDN1subCA1CRL.crl nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +4.13.14 p ValidDNnameConstraintsTest14EE.crt nameConstraintsDN1subCA2Cert.crt nameConstraintsDN1subCA2CRL.crl nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +4.13.15 f InvalidDNnameConstraintsTest15EE.crt nameConstraintsDN3subCA1Cert.crt nameConstraintsDN3subCA1CRL.crl nameConstraintsDN3CACert.crt nameConstraintsDN3CACRL.crl +4.13.16 f InvalidDNnameConstraintsTest16EE.crt nameConstraintsDN3subCA1Cert.crt nameConstraintsDN3subCA1CRL.crl nameConstraintsDN3CACert.crt nameConstraintsDN3CACRL.crl +4.13.17 f InvalidDNnameConstraintsTest17EE.crt nameConstraintsDN3subCA2Cert.crt nameConstraintsDN3subCA2CRL.crl nameConstraintsDN3CACert.crt nameConstraintsDN3CACRL.crl +4.13.18 p ValidDNnameConstraintsTest18EE.crt nameConstraintsDN3subCA2Cert.crt nameConstraintsDN3subCA2CRL.crl nameConstraintsDN3CACert.crt nameConstraintsDN3CACRL.crl +# +# no crl for self issued cert +# +#4.13.19 p ValidDNnameConstraintsTest19EE.crt nameConstraintsDN1SelfIssuedCACert.crt nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +# ?? +4.13.20 f InvalidDNnameConstraintsTest20EE.crt nameConstraintsDN1CACert.crt nameConstraintsDN1CACRL.crl +#4.13.21 p ValidRFC822nameConstraintsTest21EE.crt nameConstraintsRFC822CA1Cert.crt nameConstraintsRFC822CA1CRL.crl +#page 74 +end diff --git a/crypto/heimdal/lib/hx509/data/nist-data2 b/crypto/heimdal/lib/hx509/data/nist-data2 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/nist-data2 @@ -0,0 +1,291 @@ +# 4.1.1 Valid Signatures Test1 - Validate Successfully +0 ValidCertificatePathTest1EE.crt +# 4.1.2 Invalid CA Signature Test2 - Reject - Invalid signature on intermediate certificate +1 InvalidCASignatureTest2EE.crt +# 4.1.3 Invalid EE Signature Test3 - Reject - Invalid signature on end entity certificate +1 InvalidEESignatureTest3EE.crt +# 4.1.4 Valid DSA Signatures Test4 - Reject - Application can not process DSA signatures +1 ValidDSASignaturesTest4EE.crt +# 4.2.1 Invalid CA notBefore Date Test1 - Reject - notBefore date in intermediate certificate is after the current date +1 InvalidCAnotBeforeDateTest1EE.crt +# 4.2.2 Invalid EE notBefore Date Test2 - Reject - notBefore date in end entity certificate is after the current date +1 InvalidEEnotBeforeDateTest2EE.crt +# 4.2.3 Valid pre2000 UTC notBefore Date Test3 - Validate Successfully +0 Validpre2000UTCnotBeforeDateTest3EE.crt +# 4.2.4 Valid GeneralizedTime notBefore Date Test4 - Validate Successfully +0 ValidGeneralizedTimenotBeforeDateTest4EE.crt +# 4.2.5 Invalid CA notAfter Date Test5 - Reject - notAfter date in intermediate certificate is before the current date +1 InvalidCAnotAfterDateTest5EE.crt +# 4.2.6 Invalid EE notAfter Date Test6 - Reject - notAfter date in end entity certificate is before the current date +1 InvalidEEnotAfterDateTest6EE.crt +# 4.2.7 Invalid pre2000 UTC EE notAfter Date Test7 - Reject - notAfter date in end entity certificate is before the current date +1 Invalidpre2000UTCEEnotAfterDateTest7EE.crt +# 4.2.8 Valid GeneralizedTime notAfter Date Test8 - Validate Successfully +0 ValidGeneralizedTimenotAfterDateTest8EE.crt +# 4.3.1 Invalid Name Chaining EE Test1 - Reject - names do not chain +1 InvalidNameChainingTest1EE.crt +# 4.3.2 Invalid Name Chaining Order Test2 - Reject - names do not chain +1 InvalidNameChainingOrderTest2EE.crt +# 4.3.3 Valid Name Chaining Whitespace Test3 - Validate Successfully +0 ValidNameChainingWhitespaceTest3EE.crt +# 4.3.4 Valid Name Chaining Whitespace Test4 - Validate Successfully +0 ValidNameChainingWhitespaceTest4EE.crt +# 4.3.5 Valid Name Chaining Capitalization Test5 - Validate Successfully +0 ValidNameChainingCapitalizationTest5EE.crt +# 4.3.6 Valid Name Chaining UIDs Test6 - Validate Successfully +0 ValidNameUIDsTest6EE.crt +# 4.3.9 Valid UTF8String Encoded Names Test9 - Validate Successfully +0 ValidUTF8StringEncodedNamesTest9EE.crt +# 4.4.1 Missing CRL Test1 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidMissingCRLTest1EE.crt +# 4.4.2 Invalid Revoked CA Test2 - Reject - an intermediate certificate has been revoked. +2 InvalidRevokedCATest2EE.crt +# 4.4.3 Invalid Revoked EE Test3 - Reject - the end entity certificate has been revoked +2 InvalidRevokedEETest3EE.crt +# 4.4.4. Invalid Bad CRL Signature Test4 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidBadCRLSignatureTest4EE.crt +# 4.4.5 Invalid Bad CRL Issuer Name Test5 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidBadCRLIssuerNameTest5EE.crt +# 4.4.6 Invalid Wrong CRL Test6 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidWrongCRLTest6EE.crt +# 4.4.7 Valid Two CRLs Test7 - Validate Successfully +0 ValidTwoCRLsTest7EE.crt +# 4.4.8 Invalid Unknown CRL Entry Extension Test8 - Reject - the end entity certificate has been revoked +2 InvalidUnknownCRLEntryExtensionTest8EE.crt +# 4.4.9 Invalid Unknown CRL Extension Test9 - Reject - the end entity certificate has been revoked +2 InvalidUnknownCRLExtensionTest9EE.crt +# 4.4.10 Invalid Unknown CRL Extension Test10 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidUnknownCRLExtensionTest10EE.crt +# 4.4.11 Invalid Old CRL nextUpdate Test11 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidOldCRLnextUpdateTest11EE.crt +# 4.4.12 Invalid pre2000 CRL nextUpdate Tesst12 - Reject or Warn - status of end entity certificate can not be determined +3 Invalidpre2000CRLnextUpdateTest12EE.crt +# 4.4.13 Valid GeneralizedTime CRL nextUpdate Test13 - Validate Successfully +0 ValidGeneralizedTimeCRLnextUpdateTest13EE.crt +# 4.4.14 Valid Negative Serial Number Test14 - Validate Successfully +0 ValidNegativeSerialNumberTest14EE.crt +# 4.4.15 Invalid Negative Serial Number Test15 - Reject - the end entity certificate has been revoked +2 InvalidNegativeSerialNumberTest15EE.crt +# 4.4.16 Valid Long Serial Number Test16 - Validate Successfully +0 ValidLongSerialNumberTest16EE.crt +# 4.4.17 Valid Long Serial Number Test17 - Validate Successfully +0 ValidLongSerialNumberTest17EE.crt +# 4.4.18 Invalid Long Serial Number Test18 - Reject - the end entity certificate has been revoked +2 InvalidLongSerialNumberTest18EE.crt +# 4.4.19 Valid Separate Certificate and CRL Keys Test19 - Validate Successfully +0 ValidSeparateCertificateandCRLKeysTest19EE.crt +# 4.4.20 Invalid Separate Certificate and CRL Keys Test20 - Reject - the end entity certificate has been revoked +2 InvalidSeparateCertificateandCRLKeysTest20EE.crt +# 4.4.21 Invalid Separate Certificate and CRL Keys Test21 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidSeparateCertificateandCRLKeysTest21EE.crt +# 4.5.1 Valid Basic Self-Issued Old With New Test1 - Validate Successfully +0 ValidBasicSelfIssuedOldWithNewTest1EE.crt +# 4.5.2 Invalid Basic Self-Issued Old With New Test2 - Reject - the end entity certificate has been revoked +2 InvalidBasicSelfIssuedOldWithNewTest2EE.crt +# 4.5.3 Valid Basic Self-Issued New With Old Test3 - Validate Successfully +0 ValidBasicSelfIssuedNewWithOldTest3EE.crt +# 4.5.4 Valid Basic Self-Issued New With Old Test4 - Validate Successfully +0 ValidBasicSelfIssuedNewWithOldTest4EE.crt +# 4.5.5 Invalid Basic Self-Issued New With Old Test5 - Reject - the end entity certificate has been revoked +2 InvalidBasicSelfIssuedNewWithOldTest5EE.crt +# 4.5.6 Valid Basic Self-Issued CRL Signing Key Test6 - Validate Successfully +0 ValidBasicSelfIssuedCRLSigningKeyTest6EE.crt +# 4.5.7 Invalid Basic Self-Issued CRL Signing Key Test7 - Reject - the end entity certificate has been revoked +2 InvalidBasicSelfIssuedCRLSigningKeyTest7EE.crt +# 4.5.8 Invalid Basic Self-Issued CRL Signing Key Test8 - Reject - invalid certification path +1 InvalidBasicSelfIssuedCRLSigningKeyTest8EE.crt +# 4.6.1 Invalid Missing basicConstraints Test1 - Reject - invalid certification path +1 InvalidMissingbasicConstraintsTest1EE.crt +# 4.6.2 Invalid cA False Test2 - Reject - invalid certification path +1 InvalidcAFalseTest2EE.crt +# 4.6.3 Invalid cA False Test3 - Reject - invalid certification path +1 InvalidcAFalseTest3EE.crt +# 4.6.4 Valid basicConstraints Not Critical Test4 - Validate Successfully +0 ValidbasicConstraintsNotCriticalTest4EE.crt +# 4.6.5 Invalid pathLenConstraint Test5 - Reject - invalid certification path +1 InvalidpathLenConstraintTest5EE.crt +# 4.6.6 Invalid pathLenConstraint Test6 - Reject - invalid certification path +1 InvalidpathLenConstraintTest6EE.crt +# 4.6.7 Valid pathLenConstraint Test7 - Validate Successfully +0 ValidpathLenConstraintTest7EE.crt +# 4.6.8 Valid pathLenConstraint Test8 - Validate Successfully +0 ValidpathLenConstraintTest8EE.crt +# 4.6.9 Invalid pathLenConstraint Test9 - Reject - invalid certification path +1 InvalidpathLenConstraintTest9EE.crt +# 4.6.10 Invalid pathLenConstraint Test10 - Reject - invalid certification path +1 InvalidpathLenConstraintTest10EE.crt +# 4.6.11 Invalid pathLenConstraint Test11 - Reject - invalid certification path +1 InvalidpathLenConstraintTest11EE.crt +# 4.6.12 Invalid pathLenConstraint Test12 - Reject - invalid certification path +1 InvalidpathLenConstraintTest12EE.crt +# 4.6.13 Valid pathLenConstraint Test13 - Validate Successfully +0 ValidpathLenConstraintTest13EE.crt +# 4.6.14 Valid pathLenConstraint Test14 - Validate Successfully +0 ValidpathLenConstraintTest14EE.crt +# 4.6.15 Valid Self-Issued pathLenConstraint Test15 - Validate Successfully +0 ValidSelfIssuedpathLenConstraintTest15EE.crt +# 4.6.16 Invalid Self-Issued pathLenConstraint Test16 - Reject - invalid certification path +1 InvalidSelfIssuedpathLenConstraintTest16EE.crt +# 4.6.17 Valid Self-Issued pathLenConstraint Test17 - Validate Successfully +0 ValidSelfIssuedpathLenConstraintTest17EE.crt +# 4.7.1 Invalid keyUsage Critical keyCertSign False Test1 - Reject - invalid certification path +1 InvalidkeyUsageCriticalkeyCertSignFalseTest1EE.crt +# 4.7.2 Invalid keyUsage Not Critical keyCertSign False Test2 - Reject - invalid certification path +1 InvalidkeyUsageNotCriticalkeyCertSignFalseTest2EE.crt +# 4.7.3 Valid keyUsage Not Critical Test3 - Validate Successfully +0 ValidkeyUsageNotCriticalTest3EE.crt +# 4.7.4 Invalid keyUsage Critical cRLSign False Test4 - Reject - invalid certification path +1 InvalidkeyUsageCriticalcRLSignFalseTest4EE.crt +# 4.7.5 Invalid keyUsage Not Critical cRLSign False Test5 - Reject - invalid certification path +1 InvalidkeyUsageNotCriticalcRLSignFalseTest5EE.crt +0 UserNoticeQualifierTest19EE.crt +# 4.10.1 Valid Policy Mapping Test1, subtest 1 - Reject - unrecognized critical extension [Test using the default settings (i.e., initial-policy-set = any-policy) +1 InvalidSelfIssuedrequireExplicitPolicyTest8EE.crt +# 4.11.2 Valid inhibitPolicyMapping Test2 - Reject - unrecognized critical extension +1 ValidinhibitPolicyMappingTest2EE.crt +# 4.12.2 Valid inhibitAnyPolicy Test2 - Reject - unrecognized critical extension +1 ValidinhibitAnyPolicyTest2EE.crt +# 4.13.1 Valid DN nameConstraints Test1 - Validate Successfully +0 ValidDNnameConstraintsTest1EE.crt +# 4.13.2 Invalid DN nameConstraints Test2 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest2EE.crt +# 4.13.3 Invalid DN nameConstraints Test3 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest3EE.crt +# 4.13.4 Valid DN nameConstraints Test4 - Validate Successfully +0 ValidDNnameConstraintsTest4EE.crt +# 4.13.5 Valid DN nameConstraints Test5 - Validate Successfully +0 ValidDNnameConstraintsTest5EE.crt +# 4.13.6 Valid DN nameConstraints Test6 - Validate Successfully +0 ValidDNnameConstraintsTest6EE.crt +# 4.13.7 Invalid DN nameConstraints Test7 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest7EE.crt +# 4.13.8 Invalid DN nameConstraints Test8 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest8EE.crt +# 4.13.9 Invalid DN nameConstraints Test9 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest9EE.crt +# 4.13.10 Invalid DN nameConstraints Test10 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest10EE.crt +# 4.13.11 Valid DN nameConstraints Test11 - Validate Successfully +0 ValidDNnameConstraintsTest11EE.crt +# 4.13.12 Invalid DN nameConstraints Test12 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest12EE.crt +# 4.13.13 Invalid DN nameConstraints Test13 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest13EE.crt +# 4.13.14 Valid DN nameConstraints Test14 - Validate Successfully +0 ValidDNnameConstraintsTest14EE.crt +# 4.13.15 Invalid DN nameConstraints Test15 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest15EE.crt +# 4.13.16 Invalid DN nameConstraints Test16 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest16EE.crt +# 4.13.17 Invalid DN nameConstraints Test17 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest17EE.crt +# 4.13.18 Valid DN nameConstraints Test18 - Validate Successfully +0 ValidDNnameConstraintsTest18EE.crt +# 4.13.19 Valid Self-Issued DN nameConstraints Test19 - Validate Successfully +0 ValidDNnameConstraintsTest19EE.crt +# 4.13.20 Invalid Self-Issued DN nameConstraints Test20 - Reject - name constraints violation +1 InvalidDNnameConstraintsTest20EE.crt +# 4.13.21 Valid RFC822 nameConstraints Test21 - Validate Successfully +0 ValidRFC822nameConstraintsTest21EE.crt +# 4.13.22 Invalid RFC822 nameConstraints Test22 - Reject - name constraints violation +1 InvalidRFC822nameConstraintsTest22EE.crt +# 4.13.23 Valid RFC822 nameConstraints Test23 - Validate Successfully +0 ValidRFC822nameConstraintsTest23EE.crt +# 4.13.24 Invalid RFC822 nameConstraints Test24 - Reject - name constraints violation +1 InvalidRFC822nameConstraintsTest24EE.crt +# 4.13.25 Valid RFC822 nameConstraints Test25 - Validate Successfully +0 ValidRFC822nameConstraintsTest25EE.crt +# 4.13.26 Invalid RFC822 nameConstraints Test26 - Reject - name constraints violation +1 InvalidRFC822nameConstraintsTest26EE.crt +# 4.13.27 Valid DN and RFC822 nameConstraints Test27 - Validate Successfully +0 ValidDNandRFC822nameConstraintsTest27EE.crt +# 4.13.28 Invalid DN and RFC822 nameConstraints Test28 - Reject - name constraints violation +1 InvalidDNandRFC822nameConstraintsTest28EE.crt +# 4.13.29 Invalid DN and RFC822 nameConstraints Test29 - Reject - name constraints violation +1 InvalidDNandRFC822nameConstraintsTest29EE.crt +# 4.13.30 Valid DNS nameConstraints Test30 - Validate Successfully +0 ValidDNSnameConstraintsTest30EE.crt +# 4.13.31 Invalid DNS nameConstraints Test31 - Reject - name constraints violation +1 InvalidDNSnameConstraintsTest31EE.crt +# 4.13.32 Valid DNS nameConstraints Test32 - Validate Successfully +0 ValidDNSnameConstraintsTest32EE.crt +# 4.13.33 Invalid DNS nameConstraints Test33 - Reject - name constraints violation +1 InvalidDNSnameConstraintsTest33EE.crt +# 4.13.34 Valid URI nameConstraints Test34 - Validate Successfully +0 ValidURInameConstraintsTest34EE.crt +# 4.13.35 Invalid URI nameConstraints Test35 - Reject - name constraints violation +1 InvalidURInameConstraintsTest35EE.crt +# 4.13.36 Valid URI nameConstraints Test36 - Validate Successfully +0 ValidURInameConstraintsTest36EE.crt +# 4.13.37 Invalid URI nameConstraints Test37 - Reject - name constraints violation +1 InvalidURInameConstraintsTest37EE.crt +# 4.13.38 Invalid DNS nameConstraints Test38 - Reject - name constraints violation +1 InvalidDNSnameConstraintsTest38EE.crt +# 4.14.1 Valid distributionPoint Test1 - Validate Successfully +0 ValiddistributionPointTest1EE.crt +# 4.14.2 Invalid distributionPoint Test2 - Reject - end entity certificate has been revoked +2 InvaliddistributionPointTest2EE.crt +# 4.14.3 Invalid distributionPoint Test3 - Reject or Warn - status of end entity certificate can not be determined +3 InvaliddistributionPointTest3EE.crt +# 4.14.4 Valid distributionPoint Test4 - Validate Successfully +0 ValiddistributionPointTest4EE.crt +# 4.14.5 Valid distributionPoint Test5 - Validate Successfully +0 ValiddistributionPointTest5EE.crt +# 4.14.6 Invalid distributionPoint Test6 - Reject - end entity certificate has been revoked +2 InvaliddistributionPointTest6EE.crt +# 4.14.7 Valid distributionPoint Test7 - Validate Successfully +0 ValiddistributionPointTest7EE.crt +# 4.14.8 Invalid distributionPoint Test8 - Reject or Warn - status of end entity certificate can not be determined +3 InvaliddistributionPointTest8EE.crt +# 4.14.9 Invalid distributionPoint Test9 - Reject or Warn - status of end entity certificate can not be determined +3 InvaliddistributionPointTest9EE.crt +# 4.14.10 Valid No issuingDistributionPoint Test10 - Validate Successfully +0 ValidNoissuingDistributionPointTest10EE.crt +# 4.14.11 Invalid onlyContainsUserCerts CRL Test11 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidonlyContainsUserCertsTest11EE.crt +# 4.14.12 Invalid onlyContainsCACerts CRL Test12 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidonlyContainsCACertsTest12EE.crt +# 4.14.13 Valid onlyContainsCACerts CRL Test13 - Validate Successfully +0 ValidonlyContainsCACertsTest13EE.crt +# 4.14.14 Invalid onlyContainsAttributeCerts Test14 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidonlyContainsAttributeCertsTest14EE.crt +# 4.14.15 Invalid onlySomeReasons Test15 - Reject - end entity certificate has been revoked +2 InvalidonlySomeReasonsTest15EE.crt +# 4.14.16 Invalid onlySomeReasons Test16 - Reject - end entity certificate is on hold +2 InvalidonlySomeReasonsTest16EE.crt +# 4.14.17 Invalid onlySomeReasons Test17 - Reject or Warn - status of end entity certificate can not be determined +3 InvalidonlySomeReasonsTest17EE.crt +# 4.14.18 Valid onlySomeReasons Test18 - Validate Successfully +0 ValidonlySomeReasonsTest18EE.crt +# 4.14.19 Valid onlySomeReasons Test19 - Validate Successfully +0 ValidonlySomeReasonsTest19EE.crt +# 4.14.20 Invalid onlySomeReasons Test20 - Reject - end entity certificate has been revoked +2 InvalidonlySomeReasonsTest20EE.crt +# 4.14.21 Invalid onlySomeReasons Test21 - Reject - end entity certificate has been revoked +2 InvalidonlySomeReasonsTest21EE.crt +# 4.14.24 Valid IDP with indirectCRL Test24 - Reject or Warn - status of end entity certificate can not be determined +3 ValidIDPwithindirectCRLTest24EE.crt +# 4.15.1 Invalid deltaCRLIndicator No Base Test1 - Reject or Warn - status of end entity certificate can not be determined +3 InvaliddeltaCRLIndicatorNoBaseTest1EE.crt +# 4.15.2 Valid delta-CRL Test2 - Validate Successfully +0 ValiddeltaCRLTest2EE.crt +# 4.15.3 Invalid delta-CRL Test3 - Reject - end entity certificate has been revoked +2 InvaliddeltaCRLTest3EE.crt +# 4.15.4 Invalid delta-CRL Test4 - Reject - end entity certificate has been revoked +2 InvaliddeltaCRLTest4EE.crt +# 4.15.5 Valid delta-CRL Test5 - Validate Successfully +0 ValiddeltaCRLTest5EE.crt +# 4.15.6 Invalid delta-CRL Test6 - Reject - end entity certificate has been revoked +2 InvaliddeltaCRLTest6EE.crt +# 4.15.7 Valid delta-CRL Test7 - Validate Successfully +0 ValiddeltaCRLTest7EE.crt +# 4.15.8 Valid delta-CRL Test8 - Validate Successfully +0 ValiddeltaCRLTest8EE.crt +# 4.15.9 Invalid delta-CRL Test9 - Reject - end entity certificate has been revoked +2 InvaliddeltaCRLTest9EE.crt +# 4.15.10 Invalid delta-CRL Test10 - Reject or Warn - status of end entity certificate can not be determined +3 InvaliddeltaCRLTest10EE.crt +# 4.16.1 Valid Unknown Not Critical Certificate Extension Test1 - Validate Successfully +0 ValidUnknownNotCriticalCertificateExtensionTest1EE.crt +# 4.16.2 Invalid Unknown Critical Certificate Extension Test2 - Reject - unrecognized critical extension +1 InvalidUnknownCriticalCertificateExtensionTest2EE.crt diff --git a/crypto/heimdal/lib/hx509/data/nist-result2 b/crypto/heimdal/lib/hx509/data/nist-result2 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/nist-result2 @@ -0,0 +1,31 @@ +# $Id$ +# id FAIL +4.2.8 EITHER depeneds on if time_t is 64 bit or not +4.3.5 FAIL +4.4.13 EITHER depeneds on if time_t is 64 bit or not +4.5.1 FAIL +4.5.4 FAIL +4.5.6 FAIL +4.6.15 FAIL +4.6.17 FAIL +4.11.2 FAIL +4.12.2 FAIL +4.13.19 FAIL +4.13.21 FAIL +4.13.23 FAIL +4.13.26 FAIL +4.13.27 FAIL +4.13.30 FAIL +4.13.33 FAIL +4.13.34 FAIL +4.13.37 FAIL +4.14.1 FAIL +4.14.4 FAIL +4.14.5 FAIL +4.14.7 FAIL +4.14.13 FAIL +4.14.18 FAIL +4.14.19 FAIL +4.15.4 FAIL +4.15.5 FAIL +4.16.2 FAIL diff --git a/crypto/heimdal/lib/hx509/data/no-proxy-test.crt b/crypto/heimdal/lib/hx509/data/no-proxy-test.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/no-proxy-test.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFETCCAvmgAwIBAgIJAKQmPUkmhyKoMA0GCSqGSIb3DQEBCwUAMCExCzAJBgNV +BAYTAlNFMRIwEAYDVQQDDAlUZXN0IGNlcnQwHhcNMTkwNTIzMTUwNTI2WhcNMzgw +MTE2MTUwNTI2WjA0MQswCQYDVQQGEwJTRTESMBAGA1UEAwwJVGVzdCBjZXJ0MREw +DwYDVQQDDAhuby1wcm94eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJ++Eu48QHbj9zWx743IdmFihU06xR/IAezZPoZYhQsxw0kVQXNnC1sdGqpl7DWe +IQGmokhpfRq0LPOtK4QhZBAqvpWohdreJfPrEM75U9LdPQXtKcbzV5hfz4tVUbcH +jvgvH+M5Zyr1SvDWsK7/CEyNC7d9EYfLcVtas+uPtq6YWtRW7A1SeHiZKGPikkQy +cSwtsqtyrbNyHvz32GdasW1exOLXwqH4dXNeO/C7EQCQu8gv/klWfKC9d3wBp+6h +LQsXoTh3JqaszucAMhen4RihyRcofsEbWLpmzGIyIDIB2IQ/ZYwF1xfOFi7gTGFF +Il80EdEvw8x7GcZFVMJUQzYH8rnHEU73bzAuEVJay4vR5SwWjGIgIcZl5gYWSGMq +4VhLQisIVfo1hcLniPCSQH3GExCQ8QvVi8Ks8tkd+0zs/24B5HFzWHJspKSnuOya +dZreKjAvNWPPflolipjKDORxocJDojIbW03cgZwHULRP6sU8H/dXnLBw8t9natJk +zHGslG8rZoR61QHVcalk2qAzP78lhRfOU/XlGTkOX8zbfnaVS/O6IbBxhagtBApc +Ms2aunf0H6fxyyzSAllAu+fnDsUMBhQWTkQmK2GmEEba8FYbS+K5rbn/fzn+xaS4 ++Lh3GaaPI67+2EwcDWdfBAzHC4Mj3UF2i4o3r3fAazHrAgMBAAGjOTA3MAkGA1Ud +EwQCMAAwCwYDVR0PBAQDAgXgMB0GA1UdDgQWBBQU3CICEd4bSVDR3MKEOFoAqRYt +8jANBgkqhkiG9w0BAQsFAAOCAgEAMAG64y2s7lZi+1yZtIfvgBe/QwO0s3TrZVc/ +VTSmVgcsI4pOW9A2NYxJR5RwEg1fNAoKPz8+D/9FeZwVED8Q9xUAuvtEsr2npd6d +ogQblbVBFkuQ+3Wt7ILYBKXgFQB+473yu91o/k7Mg07/2XsWMhkNspMpBo4frUo1 +7JlXH4wLs1pAGbhFZ7e4s+8Xm3zSPa9UuhYNDqwheeVulwiP4v4zf5DZD9iyFcYj +9COnCYNvY2gSi+GaT712jLR9/0CUfFbiY02e6VS9TI8pvHlCbOaUAqTeYAr8GkpH +qupkvOmTWwgubeK7BrDvuKJIavK8sN5mqK/KzFpzRjMzzppeuv/ArKMnjbr52BtG +fZK8LxbeXuxbcqHpxRT2uFIoQAtIxf1oMYoqac2TNZ2V+x3nRMfsgW6JK+huoQpB +Z9pyRNTGb5B6JNDaW5qeXmJz3zVKWFCRO9kwWajBDmQcd9A2BMukCtcWIDR9PSuO +zqRXI64gh/Pm+pHrG+U8/m/WhEmMquJHjbeU7lpd7wiRwHyvGqka/pHIKt3Eozkh +FCthDU5sK1pLWCyQU+DmrL3+LKJaL+Yiok0lKiPT42II3d0yVIeV6BtVHpFQLYBm +rJHozXOvFEE1i8o4jl7mjvXJHfkUHgmpuny5RicuxOrE12YrdQIq4qyTZiskd4N4 +fDTnu7M= +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/no-proxy-test.key b/crypto/heimdal/lib/hx509/data/no-proxy-test.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/no-proxy-test.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +IMZ41x5JPzpQTmrb056vt40ifw3+I946 +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/ocsp-req1.der b/crypto/heimdal/lib/hx509/data/ocsp-req1.der new file mode 100644 index 0000000000000000000000000000000000000000..650c879769566ea253b994f3c753a9cf72d8bd72 GIT binary patch literal 105 zc$@)g0G9tSXE0?jJ}^8mIxquyy}7(NC2>-i}!gy_a^)!0s#V|BQPN_9|j341_1>H2QUEw1QG-g{pNd=WZ$g& LYE^1vAd`Snu*D*% literal 0 Hc$@uyy}7(NC2>-i}!gy_a^)!0s#Y}BQPN_9|j341_1>H2QUEw1QG-g$B4SDFGfuG Lbq0F$wPnZnq$VQk literal 0 Hc$@KJGlN*hSBF^94+ z^9W^Bm>O6rgrpXiCBw<%nVEn3=IqnjEqd93<3@O z4Xl7FShe|>nWR`5SVV61YNyrcs&1BDv*YMRv30tY!n<~}h{VqEkT+75F#3GQnV-JT?>OBSTW(n)yWuKQA@Un4gwRyCC z=Vb({Vqk7;WSDCvR$Oe?x;ZG?b;I@zyJxM8U|XOO#v@bHG<~_DScjZ?{wJYF6Sgu0 znA$z7x%B+^96q7@8*F>lr!J1|R&$$FX?a{QHD}u^sY=V(RQ6*&GdufVuQHftBxd8e zex_|jowU?b&Qr|ps!o6O%pU$Va$7#Z>)8hJD>qE8F3}G0-*Y;0K@(GnK@(E}5a$>) zF z5fpg63UsuwlY%bHOnCMy;BL*wncqBKwXV*NZu@m|)7np6 ze1)d>wf#j7$y{cCtnz_L%Oo-Ul+etIhSY$6jAsrzP1@IIq(aH{>gIib;=-Av4k42+8#XBsq4 zGmr&3S(cAQ413x!hyqC~vjiIiHegk-P;UuINxKOtrg%VR3$w5qFf%g#H{b^G_*qzh z@%aob5<%%s&4$%;aRS4mb!T%9#cCc_nR!65d!qZKM|*{LxBq^y%;Eg`6KVY`0-x^T zluAnfc*rVSRVJUm|5EmchbzU`$IkQFc6hy=lxGb~SZ_XWSMO}IgFD^{J~rE#Beyc6 rvGTgU$t}NgZ~Z2QdPOO6c zm?_xRP~1Qi#9`*)^LGvoP$)_*F38VINiCA#H!?6VGcYkQG%zqQHL{2@2sH3FumWmj z)#hVnl450G5xLc?omQi(x>MgRPGO3)$d+8Qjy3$2 z3z-<18W=E)T&QfIXdsVpDHDqji$La%Jse7@_Y}OFC9H#&eO_X~%f_kI=F#?@ml3Fn zfw{4fK{dbSjbXWI_v14;yRy&A9V>PbdHHC;1?{$|RhtV>%K7H6mzc4%IFfCC&_f2J z`xSfdum3Lk)L6bEr`xN1KX;IM$=`{$eoSAoTHgQpgOeg1^?eMhz0P|seckG@#c+vW o%G}Do7b>f3b=~*gKj{90anrI>%*7#x6u&JiZB<>hg#A<=04eTy(EtDd literal 0 Hc$@q$MvJ1c%d7W!pXc7^z5UZ4=Z|x~=lMS8kI(r6bdgh{U=Wio;t$Y8 zyoC_DLSQ&t7yyG|bP?jt$R0>&D$xUUFp7Y@5Y!b06_*ORfCJ3XE);4cniLimi9UP? zBL*P8ibB#5XPZ5eSO8-N;IKv*9Dp+dJb~i?5je230oRp)LKNU2n9QG7b%SE{H5!zv zo4fx&)#%ft@3+EawtCzm+UDu{mZgM4Nw7;|GpLilY;Hq z;>9om$E!C^yPgh2XUCHOq!2iU6p=P%^b}(q{OiUto$Ywh*xeUimGz`6GKCSs^3%G zA641Jgj$X~#S5&Dd3Sm2%^jZ4+<^D7NmpUyGppXd<8?N?6V8Fr=Cw^Ot`2O59APo> zTyZ(QNBZ~GLYidQJ{@OQpCnn44!ycqiQX@4gK))-p9!_5H+!VB%&$W(eqL|ML3?;J z=XK49f=jqRsJMbMGiyohIM$F{^IUlavN2z)Z7>ExwTmUkD&$1eykeDWK4av5e2%iQ zf$j4{R$gLRL)}f@i>WJxFi(Id&&=yL0i)27lml#~(78JdRFFu?- zb+GQS@004(;4Op9Tj}FMBe)h8;8hi@ygf4CM7^yiA}ZO)$yTt27t}krugaVpD(25| zGwX2@hD@(rt9*>*g0oQ(_JY{L&(!X2<)j=8wx3@zLnRr891F6474AP+s^HG+MP$5b zpLJ2JM*bihXBE+dV`$$jSxyXIyD4~y$lpCDF)&TOA$yKY!%n~P%QjLgJUHj6v!>de zsbG;7o@UpbTts-ctR?iRGNDq~&92qGn0lT8dcr<0GsP=v5SljJ#pg1(@`|fD&yKS< z$B?+$miAF?7fy){`L}mkT3%6`UXPh{I1Qk~&+k+?K!=i<&>g@a2v8nn&6tzf8S#J2 zd=K})J~`yykYX^Na!4aQfWesjul+7BIz;uKr-1*9uOw(^E(-a|@dHsqrhtW<&j%mL z6}Oy_6^zEA`X-*$C;viUcel{2TB5nB^OCuJPcKM4OxZhpx7`27cHs)bbflApX4<-7 z%vhQ$&)qC+oLN_F{=n#bAKMtO?}RV>$f|lzo#kI777huY5`k`qTs6auHKP^> zzX)pN^3D80{oDrX<`M>5l^&L=2l@2R7F6%YG{m+QdOGRkE4+ue&K>MKpVNX^>&jevJTGzK_7NJK2*Ir_H_&4yjJ zeE<35@yLE+ij?R4QbesDI`r<*2quJK!3)&juqJ3t5GWV~E=$M*5^?~g9c+{&V5n~g zDB$^3R)aYM$K$`bP-0O2UHMM`$G3=o^_GUg0Vo)}4Tyd1Bw?_fpW=Nhd?D`)`0T;W zTw~sz0qwKVF6SsTJcB*42whlQKJ+U8+KBXaR?F-S&Y-#K$WWiXHUNy}Nq1#Flb~G!>e@)^%oIusIStpg4V};1KO& zUz3kng<;v^TSrQw^c?aqj-*Duf$h+EC4tr>(5hBj;?+in9@`^%I${YG_IEyAT>@kt z(~8$fVj;?R+bZln{Fx*zjs1) z@{+7)bfWECqPOYO&T!kQ8IfjdH#zZzR}GZeFWpxDq9eq#v)83i6?uX_3kjCvHRCAy zi{0FmQKPy|42|0Ah;;JhQD%&0tZ>hn_V6q-b%6rxAlXFE7( zPe?2O?)uw<+qJCe=L1Jc4=+1uU|n@CN6WO~jnXFt7-G?9O&r-sH8e@Em>IK$@IP{lTrcuD<1h-Y=jfsrH qGfkAqL{Kv^gfbF1lNnMobqt@>sukS^nc8|rOBKd{C}stFFaHPO#*xMV literal 0 Hc$@@%s4t6X|k?G zt`6l)X^B>BhFCdDXz^H@mKe#gYMCq$Ctl$PwED zIbxrY652>80wD%Mp>U4a{B~;=Oe`wK!FLT5UM`CktukL|T{Y0r*Hf!AkD~6z=z*j| zAVrT%qJR`K=nmS0C%|t&2_!;$2Mka^K;XMZ(zX3#bu{iPS2uR_;cn|h%QQcP@7m~e ziD;SQ$Xi41mheQ;W+KgX0ssZhL;mMv5dqu-s{W-5fMem(8`CjajPdHvOlKwof9<>j zh(=26Pqt1Lp`lO|0s`XzP>7E}reEjCoVufObamZ@2jgVomPN4=EJx|?8C@I125MH` zdjKi%uG~Kb_6(2b$2+EF(V(Xf+j5W)+75Y>=6=FkD`r|wlr0!#DYr}6Yu z;qBs%%FCAuIS3-iLG0TOb&vy-DuitV20)>IX9a?7n~%LyBwNq2$D$p|0+Sv|5zufVq?@G^vuM+Ru0k6e24IVCYMliYC@rC&9nca z`WnPalQ$c<@Fdxoy3D{BLAtxms3zBUF7>>b?Ebax3f(f#JUKe5*uu^e$6mtBzk4#7 zU)Rg8n9B`gzT@mr!cB^HkTPeAgv~t}PrRchFl(TwApw&&Z>? zcF1&aNzXR~&uxp;3aO+-C~Ca!BWI~xnziRssJ`-H4MXJ&Yd}1*y;6J6N{jJ>$Oa9z zIYGg5N)e;<^L2s3%N4fGXI5|08Q|&k<7da4FVow|GM=WX#^(wi2Ew{Er(4%Hcup2U zUD#RIDV>Pr$1#)#-Z#okvSX7KEWOSu_WK*G8jWu3*V^w*yJaG)#Vebsyg zMyZA^yEGOzdg#%_`;<3uFUtWFw&H5j_lCj9bof5^YdjqsEU((T^l*EYH0Bc8Xf%?( z*5)M=5-(|eI2V6XE7_wbCN+5HR4u}1)MnaMKGm`L?>AdyQ@an+iA^07oi5*u zFoVU%KL#0}@;%-(>6b~c26;D1oMX7O{wiJ)i6ueR;jhzc0#HJHT^J#Jk7obGQ(LD@ zK;=S8>UpkOwt@4}g4I6<&35#(Fl_$d4thPJ#Om~-F z_dE{m(8~)jv8EUb>2$SiXPVX6OIueH=o!y*S&lcGXDx<#x+%wRWMZFb_e_2&P`>Bo z{7}|zdbuSIRs=bES5r_ z3YB~z>X@)IbFSpt6Jq@7Rd@y){b;N^+6v`r-y3R>1q3 z+SU=ksMsmQ>{FS*>i)t+-)`KTjY}QBu)gZBZt&Cegs85o^$Vn{3hG(U0&tsW_p3Ri>-*1$9-G1%11I}Cw(vImwqQF(%Omc&3v2N UpnkfZ!AhT5$rUJ=%o(2e16%xKN&o-= literal 0 Hc$@uyy}7(NC2>- zi}!gy_a^)!0s#Vm02mK4FflnWH8L|XH83?ZFj}D_Fd;A>1_>($0R;sIFaZJt5(E(a z=6jT6->my;Rcd4)lYmk%4F(A+hDe6@4FLfQ1potr0s#OZ7@UO_7&|2kAvf=oZ^a^c zu@MW7PwnE5)ogZ5>Pyzbw=ZZqao^RMyQgGsS3-a9I8_dGwxYZfDy%jT5P>o~1DOkexji4*Mg`gKfS(eyi1&SU@ zCR~IzNG2lJ%^cz7C;gAt=otfv8S|6q79eH(4!5Lz%NQ1b1oMXJ9gwcvZ&CQq#dFoi zSx*t$tIh3%44B+4m3GW_gbsZSGX*37^P&`-T^E-S3O7<3N!atiOA7@wm2Vrx=*9Md zp>M6YiuUAcb`JTgyk8pyuqDb$NyYZf#^Z8ac?lc;!nP=bsmi`Qbc8Z~#>jq2{~V-t z+dF5t`aAo%*(hBa^11U9ysu_p(M?sgNT8uxr5;>_!w7+K7Pd;LZ;9HMpy@7jH{zUW zU886NB(NXLKKv1dU%WvW3+G7+K>C`VTWe)aR8yxz35+*?yq) zI;9{K!Ke{(mhL`EgXF^LD1`%R;sqyjWpe=>2nUukkgD3VY5f_HoAu_2+tEqTcQqoT elSeoEtwHLj0n?ab(`#_u^K{3k_3O$7#^^(fz&IxW literal 0 Hc$@q#C38)^C1RVj{RUg?Yx>5Hy=WL|a}20M zIps5LuBH=?(j+Gh4+i>5o~JxOT3008cb6gecL+2H8$@WYJ-_S_T$0RlQ$yz5wg;R= zB24vOTZ`?wSvBzK?PIITwPwwuime@TI4}3?AD>`+IqTVM{q{7rybYmX{6~0(s*{d? zsEG# zZO&MqC&fu@RJR8y!Rxg9oE*E>pLfqu{Hel9yPQVdOZWR8Tg0XsC3XKj$#GZtUfh&< zSo5a&*Om$00Mu#=Pp19n&{M;%-VF}y((lVu{Zl)IQlgQKPL*WFWFh;bVXVpQtv;_2!o^V`3Eub7Gqa+z-YmVXaq-`PMBj7;h(%*lS11 z(6YZ&N>K_vTRB~t=X}&ngOX<92Vz2Ez{)~`1-RU*$@0BrUp6iPgjasypJ_dEO6+R6;bXEGX8Dx##G9~ z0{2Ht=D&21FM^!Ro4A2Y^c$5(W9B?Ov`0RC3N3jnN)w_!%7LJ}06Vg|^Uu5oI^Ki^+lxGwiiO%4}Vj`>X z6eaC9!?--v%S#?Cyj`$jRMS`m(E%b9+gYWrzTR%}XfJCt8%j>2>UMuk@17oB?I+aRUC)shbs+ zn39DxQ@;XZO6~Y<9kC%j-@_Tx=eV_HtH$AVB;}mW5?f(^PX}bAuZz8E`Ox@VTG|ky zUveQm@Lu$2PUi86vW%RofaaD4ek(q+DpY^=*F(LO&()vqBa~}ta=hupDYK55&sW~U zf^1(|(v-fm+%}C6$cE|qUC%T?LW^onl^yNOlSEt=H=l|nY;uD5+=G`fzs4oGW77Qx z5*QIua}QZn#m2tFjN0>_C39(v5Da;oPYrkM7B2j-d55amN+oH zp1F82A*!kP-Gs1Q_yujlKAC$)ts*z8BB-7z5$5?j@*X~nXpIOfIRUcr>x^47j$zK$ z$Jg}hnT+rGy?ODFrj4o2mP0M_EV0(vYRAPO@ieY8e${Nzg-g1UQj}DY^?*O|X*=p# zwzP_dqZK#U>)PSPumh$3rlYFO`5cyXzFQXYb(cW-6UCj*rtR>t| zlHbWezaqM`*~lfRU`qlXd#1*vJIj80#Kp%Fd^RvH&+}I6(y@t5!z->gnbJM_1G5_? zDi4CZ+vJWfthFaXOF`e&sp&}g616J11sz#=dBT{Fk6y{j@jG!sGz)o3D3ykokbYA@>JF-SJagBB>3{V-qYdLdP`ncAw6 z^*#)dwfi@S`5muF>y7du`}&ocVFl!})5!)FyRrJHVZ^iSqeQ_f@k literal 0 Hc$@jq{OR!3YYlUIv54P9|Wu?K$=>clN?{f%gU zcE6B`nUR5Uail>w*e9~WEKCLr2HYSfKMM;p6YB#5IS@yc1>`$;s$gZ~fH0Xk4P-&` zd@N!tBKoE1w L5!Z?arL9{4iykhM literal 0 Hc$@ayWN$Dywj8pIh|n078WF})QqtrY9AvL- z8QP4v#;8$|qJ)H$bVy_Gr1M_yIq!S^Ie$FY_1yRO`aak5$LD@PItnKYg|O%-RgjKS zLJHxLPy}KN2!+DwDD-zr1U%DOyc5(Uh=4*!m^&OP1(2)>vY^bSfQfE(wj#M;V}g$z zjfxBkj@gFR1qntVQCE*Z1c`c}Hy8*8fX3gyBJf*bfII>MmmbQ(A3mY2(V$p!`{5Hz zopyp0yA3YA-sKU~K0}wYh1@7*2ofv=nrmtR6jm(pkCFc{iq$|BQ2DRb0k|YwygQ9u zv)jgDDGo{d(iGgi1d1Vrv{G$T1!7RB2m%7515gN4@w)WT%m?&YLdJcUpNm}i72kF| z;EYGul@9bWL8$<%3(3QW(#l?VHH;p(ppTWbjIfwpmLk>kK#7C#^=T(B>~vh1)w`;%XN4;cDcH2urA&XJW;l=1A~;GOK6ZiNW` z*+)bl#4+P(jdxs&fI)MQL!x8UQyxFfbPmd`E;S@A0Qb|~O&05@kV9)*oAl8|t9sm4 zOSuW8pTJ95`grctUhxnuBX@~wMVY&cI_o?AS1nCc{nPGiOXwfR@<>N~DI4Su0Brx{ z8$xB54iDNNYxu~bsy|Ld`#XS#4mN0#(9h0^jYotrBWCV+G*?7 zJ${}MW;1!P-|=G+ZZSHUZ`fGq=Ga?he8BL5sU4$KV=N$#6SnpV@+^Op%jR+JiM%`= zS2rVdQ9Q)%wL0jiTo_xTSR*5>CF#$iBX)sw#Ln-f4$@(wEEoU<04VhDtRN5&P>Zk~ zl>3u+$xtd0G{U+CAB)8vjEaiITJ8IvWPnPtVt>I&Ab87)=^26qg28{}zYP*d2UP#Q z2J{EAXvlY87}#W&6@O~wvDxV+H{F*x`@ zS7fd9F>StDnW2O)_f8>sL7w{!6O=y?Ad12(R~DG~)Z7|0A6U>0jKpSi#Nr~Wh%wtW zUO&;xQ#v>8$|PC`${lSPtO&9NP_djUyvo;h)5h2q4cb06dB3;Y(F%{Q^vOT_N;|Mh z<)<70Iw$XTJF?Gvb?8a?nWvk^7qx}Lc$$;($i4uot*H{%sEn$^`0>xXxiO!rKUSg@YH2bHuTBmd-5L9oHUjsz z>NlfpUuyl;kb=yD@ASUN(8j~lAzXN+dXt;hTV=~n)XDChKr-# z%xwo?Pzbct3nc%bNl^+8fDlk*vqi(dzJ?1S)R6Z-ryv z(*3OSv(XEnk~q%ie&dohtc7`?e?7R%**HVw05PqtxZ4tO*%S0^TfPbu-vr*nRSadzj0YwglpU89;3UNO YIivY4>JiOB)U2tm`F-+cGltH809=i5RsaA1 literal 0 Hc$@ + Signature Algorithm: sha1WithRSAEncryption + b3:3e:84:9b:be:cd:a0:cc:21:dd:f7:12:41:90:8e:9e:25:30: + 0b:2d:b5:1c:35:a1:15:76:9c:7e:dc:23:33:16:bf:ab:60:82: + ad:3a:2e:4f:84:f1:62:21:7c:1c:a1:37:45:01:12:cf:99:aa: + a3:b4:72:fe:c9:e3:bd:25:ef:4d:bf:b5:e2:ac:15:3f:b3:b7: + df:78:2b:0e:2d:95:71:0b:c7:6c:31:54:c0:c1:e0:8f:00:10: + 31:20:a6:5e:71:bd:d6:6f:45:cc:25:11:3d:ce:26:75:8b:ba: + 03:3c:d4:87:89:c7:93:5b:d9:76:b1:20:96:83:07:91:34:05: + 12:2d:56:e8:18:b2:4a:2d:ba:b0:59:02:65:81:60:3b:92:96: + 7d:d1:c9:ab:bf:ac:bb:aa:f7:b3:a5:0b:de:e5:cb:0c:16:ac: + 65:1c:da:6a:c5:16:43:15:b7:14:55:b9:6d:0f:f0:79:ef:b1: + d0:6e:bf:85:fb:bb:93:6b:30:69:98:db:da:8c:f2:3a:e8:a3: + c9:57:3c:d0:fa:7e:db:cd:48:93:7a:cd:af:a4:71:06:3d:a6: + 94:b4:99:3a:2e:9c:3a:ac:2f:19:f5:19:1d:71:3d:96:00:74: + c9:99:58:40:0d:c2:bf:cf:85:8f:dd:f6:ff:b0:cf:1a:84:6d: + 02:87:4d:96:7d:db:2f:f1:8a:e5:39:30:8b:89:c4:8d:34:60: + 05:85:96:92:fc:a0:6a:b9:df:54:53:e6:f3:9a:27:2d:bc:9d: + 8d:a5:44:bd:81:83:d3:8a:d6:96:b1:71:b3:4b:40:b6:95:e2: + 45:19:e3:a5:3c:17:af:a8:39:2a:52:68:e4:7c:0f:fa:fd:15: + 07:fd:e5:e8:1c:cb:b3:2c:d4:97:21:7b:86:fb:fb:78:9a:6a: + f2:71:0b:b7:2e:d7:df:96:cb:2e:83:2e:81:29:50:0f:e0:50: + 0f:d5:34:7d:13:eb:a2:68:d2:a1:26:35:15:08:a9:ac:7e:f5: + 8d:4c:68:01:a2:01:05:db:5b:7d:ea:ba:45:ea:34:93:db:89: + 0e:46:58:6e:a3:6f:aa:4a:6c:ac:28:58:a0:48:cc:e2:75:54: + e4:79:19:b3:d5:6c:c9:04:b3:d0:9b:51:f5:07:0e:e1:a0:07: + 61:e9:53:dc:0f:83:3c:7f:54:7b:ca:7e:35:b9:6c:0a:e5:b4: + 61:48:11:a1:92:27:1d:2e:57:07:67:f0:b0:66:61:0b:a5:15: + d1:1a:10:05:34:90:52:a3:c4:a8:19:cf:3e:52:b3:c9:ab:49: + e8:84:96:a9:9f:d7:bb:a4:43:2b:ef:b2:bf:8b:01:46:b0:48: + e4:80:b8:3e:4a:ab:85:5f +-----BEGIN CERTIFICATE----- +MIIDbjCCAVagAwIBAgIBBzANBgkqhkiG9w0BAQUFADAqMRswGQYDVQQDDBJoeDUw +OSBUZXN0IFJvb3QgQ0ExCzAJBgNVBAYTAlNFMB4XDTE5MDUyMzE1MDUxNVoXDTM4 +MDExNjE1MDUxNVowITELMAkGA1UEBhMCU0UxEjAQBgNVBAMMCXBraW5pdC1lYzBZ +MBMGByqGSM49AgEGCCqGSM49AwEHA0IABFeiJRRbp6xVnuDqwpKYyROR08QTAAz5 +1imkRcNT8vaSjtnO1CRIVoAcBI4T7EnBTXhe9RzXwg6Nk9qkeRhrCpqjczBxMAkG +A1UdEwQCMAAwCwYDVR0PBAQDAgXgMB0GA1UdDgQWBBQdLi3QY5RamZWH3aMR+IJa +KkMrKDA4BgNVHREEMTAvoC0GBisGAQUCAqAjMCGgDRsLVEVTVC5INUwuU0WhEDAO +oAMCAQGhBzAFGwNiYXIwDQYJKoZIhvcNAQEFBQADggIBALM+hJu+zaDMId33EkGQ +jp4lMAsttRw1oRV2nH7cIzMWv6tggq06Lk+E8WIhfByhN0UBEs+ZqqO0cv7J470l +702/teKsFT+zt994Kw4tlXELx2wxVMDB4I8AEDEgpl5xvdZvRcwlET3OJnWLugM8 +1IeJx5Nb2XaxIJaDB5E0BRItVugYskoturBZAmWBYDuSln3Ryau/rLuq97OlC97l +ywwWrGUc2mrFFkMVtxRVuW0P8HnvsdBuv4X7u5NrMGmY29qM8jroo8lXPND6ftvN +SJN6za+kcQY9ppS0mTounDqsLxn1GR1xPZYAdMmZWEANwr/PhY/d9v+wzxqEbQKH +TZZ92y/xiuU5MIuJxI00YAWFlpL8oGq531RT5vOaJy28nY2lRL2Bg9OK1paxcbNL +QLaV4kUZ46U8F6+oOSpSaOR8D/r9FQf95egcy7Ms1Jche4b7+3iaavJxC7cu19+W +yy6DLoEpUA/gUA/VNH0T66Jo0qEmNRUIqax+9Y1MaAGiAQXbW33qukXqNJPbiQ5G +WG6jb6pKbKwoWKBIzOJ1VOR5GbPVbMkEs9CbUfUHDuGgB2HpU9wPgzx/VHvKfjW5 +bArltGFIEaGSJx0uVwdn8LBmYQulFdEaEAU0kFKjxKgZzz5Ss8mrSeiElqmf17uk +Qyvvsr+LAUawSOSAuD5Kq4Vf +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/pkinit-ec.key b/crypto/heimdal/lib/hx509/data/pkinit-ec.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/pkinit-ec.key @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgf0P72e36G4JST5z5 +hGIETF9eViQ6rCu3pu3793hC6DuhRANCAARXoiUUW6esVZ7g6sKSmMkTkdPEEwAM ++dYppEXDU/L2ko7ZztQkSFaAHASOE+xJwU14XvUc18IOjZPapHkYawqa +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/pkinit-proxy-chain.crt b/crypto/heimdal/lib/hx509/data/pkinit-proxy-chain.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/pkinit-proxy-chain.crt @@ -0,0 +1,149 @@ +-----BEGIN CERTIFICATE----- +MIIFNjCCAx6gAwIBAgIJAJd7zCsMMPvCMA0GCSqGSIb3DQEBCwUAMB4xCzAJBgNV +BAYTAlNFMQ8wDQYDVQQDDAZwa2luaXQwHhcNMTkwNTIzMTUwNTE1WhcNMzgwMTE2 +MTUwNTE1WjA1MQswCQYDVQQGEwJTRTEPMA0GA1UEAwwGcGtpbml0MRUwEwYDVQQD +DAxwa2luaXQtcHJveHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCh +U0hTlQYhDONlH8153Wn2/H6/OW15S9pvg/RcQ9+Mc7a3kOEnImHt4B/zevv1rfYa +EernC2mrTxvSSy2Oxx3yNFsV1Kys+kMYiIygswPohTHYhMQKEjqGPTN97E1JcvMQ +iZy19sl6tG+kLZKa5pSTUoFrlqw2NN9U1WjlgaZ7WnLxwLlatQnZOnA6+MoU1bJe +pkPUAcjOOQZTd2D/3tAOcBKfQ6z97XFqfxzcnclz+9BXgFdZWTR1efd5yYNy17ny +8hoEHuc34+a/hrrhfiFiXYKFF6f07YI6lt+ElPOc93oz19fE4wVskXjvxLOwahzM +q2jRalsj/XlYCEHrZqaYjHvY8MYNFleThQEwJ/zldgQjx2MMnUD3ApxRDutfYM9e +MFSv0ATDFoKi55mGySMD3dMpI1I/TER459Am5c88SfxJNJXAW/2GJXQAJ7tCL3dM +sYcqkl5uVZXPJxSQbfFCl95lhlzOtoXZTS1+cxYN0oz9YfLoG3tz3x5Xtxo0eUbI +NJBq1sWi6bO6+6GyQOxs45sawl906XFqW/qzSywNOOsT/hcuEvc4IGdZKLP/wxF0 +HJzeaqDwfmiT1tz8jArGsbqw/i77xND6tq+56rur5/BhfIapXZ9wKDfawQttpDnX +PTcaT8BSqQejfZa0RiRvt70pypm98eZ1XRzWhC6bvQIDAQABo2AwXjAJBgNVHRME +AjAAMAsGA1UdDwQEAwIF4DAdBgNVHQ4EFgQUzoShaVViBQhilqB70YV+yuLcWIEw +JQYIKwYBBQUHAQ4BAf8EFjAUAgEAMA8GCCsGAQUFBxUABANmb28wDQYJKoZIhvcN +AQELBQADggIBAL45/vKz88cBG7c11gyePde86H7qWgIKrWocohn6eoXF1p2ZkLvP +na4o7WVr/WC7t4DiBZVUNVvrqss/nOI3wMVjU9Mn9wrJbycvrVPAWH1nIhlKR3gM +H8PTcZiHI+Vf14aHTjeRFEXxy0i+K7JxtKRQC/Bi+MuwnBvPwvar3tqFLXprRk4p +p42I7/ngT8WcAzz/LWj0rWYNl/TEFU3esDBr3rz+B5TFVcp2dLpcZW7ScFRh9bLT +OwJ/QNhzvnH5cwsWlb8cpDTFVeyTOBgqh9t6ut6SnDfCu03xIBVuCk+P5KhOGWAS +3cOVqvGn3Y3q1glE2XdKgyYqU2z3itneUyiCeopItFaKZIV52s4WuIuGO+PK8XOi +QhwtnsWO91toEFUpUNkxf/C6C61G4xuvHeMVLdTzO1Xi5kuHyN9gD8rLAuUfaV1c +Zv3f2S8WpvEGkSSu8Ap1k3ExfIaFhgxzu3pjGL5e6YV2lK9d/UGXOpDRFZOUuoRm +dyowQcF3XcH6zTDu+ThXlPSq5bkjrnMnNt2z2LfqGb/GFp1vl11LsXeLgpHmFTq2 +4umDDUwMHVzrmFoa3BtUkgO3BUoSrt2l63TFqTQZgZAf/D042jBcmOhV6Mt5MsDK +MFZkoYjtv+8jTeRwxP2zi3EceCvGkV1Mf3t2/h4wYGa25J6HFq86VVRU +-----END CERTIFICATE----- +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 6 (0x6) + Signature Algorithm: sha1WithRSAEncryption + Issuer: CN=hx509 Test Root CA, C=SE + Validity + Not Before: May 23 15:05:15 2019 GMT + Not After : Jan 16 15:05:15 2038 GMT + Subject: C=SE, CN=pkinit + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (4096 bit) + Modulus: + 00:bf:4b:44:8f:d1:dd:56:18:41:5c:c2:c4:2b:ff: + 28:e6:7f:68:26:d4:0f:08:e6:af:dd:72:28:9b:ec: + 5f:5a:2f:f1:9a:7b:21:0f:c2:01:96:d8:85:32:20: + 5c:c7:91:fb:2d:71:33:d7:dc:81:06:32:2e:e5:ec: + 61:37:8a:0b:0c:23:57:cd:9c:ae:93:79:58:26:1e: + de:26:18:12:52:c3:76:7a:d1:6a:dc:98:67:13:4d: + 73:dc:8f:7f:7b:dc:97:15:dd:eb:6e:0b:54:cc:f7: + ef:db:14:8f:d2:89:47:3e:8c:e7:de:ef:61:34:67: + 10:60:8a:87:13:6d:86:91:9d:8a:92:64:72:5c:ef: + 64:57:b9:0e:91:ea:41:2c:03:e0:67:c7:51:cf:ea: + 09:5a:e9:0e:ba:eb:be:53:10:90:e5:0f:87:33:3b: + e6:53:11:1c:6d:75:34:ea:4a:7c:59:f4:6b:da:82: + 30:4d:f5:72:ad:ae:41:f7:c1:ca:b2:7e:74:a4:45: + bd:2d:80:c5:47:d3:ed:c2:02:fb:d9:85:76:00:3d: + a6:ab:da:2a:ef:a4:c7:d6:74:c4:88:02:63:d5:a0: + 5f:6b:88:ee:bc:df:0f:43:78:8f:62:1a:c6:c8:e5: + 3a:43:aa:75:94:d0:71:15:a4:8a:f9:67:5d:93:93: + bd:78:04:46:39:90:48:22:05:78:17:ec:b9:26:3f: + 4f:7b:a9:e2:79:b3:cf:13:ce:34:9f:3c:7a:8f:a8: + b7:b4:12:39:01:4f:26:44:33:b9:7d:eb:c7:0d:c7: + 1c:d3:c5:52:2b:cb:65:a2:48:b8:c6:b2:e5:17:d3: + df:ed:ef:e9:ea:21:5f:2e:42:23:40:35:7e:97:23: + 28:42:0e:22:25:79:f6:ea:ae:a3:cf:c6:c4:ef:ed: + c3:1f:14:05:5f:66:ab:20:a0:5e:80:11:32:1f:ff: + 69:10:e2:8e:d6:70:e4:97:ab:82:89:37:57:74:43: + 81:e6:85:ca:6e:3b:1d:ae:3f:ca:7f:da:2b:7b:db: + ee:ab:ad:a1:a1:16:38:9c:b6:f2:af:be:b0:19:e1: + 63:14:6f:26:24:f4:a8:3a:04:0e:9a:9c:5a:0a:bd: + 22:91:c4:c3:ab:2f:ea:54:d7:ca:ad:ed:b7:a0:98: + 8a:c8:94:15:ea:13:22:97:29:df:3a:85:4c:80:0d: + ee:3f:d0:66:3d:9c:0f:41:2b:fd:1e:90:f5:8a:fb: + 4c:10:20:3b:91:cc:fc:ab:d8:89:ac:7a:9f:bc:c9: + e4:09:fe:81:ba:53:cf:f5:13:1b:4b:b0:f3:bf:34: + 3d:3d:2c:8c:90:89:d6:37:78:cc:7c:f0:a8:97:08: + ac:ea:f5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + X509v3 Key Usage: + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Subject Key Identifier: + 76:9F:AA:4D:D1:1E:92:61:23:CE:AE:DC:C3:CD:07:EB:A7:13:43:2F + X509v3 Subject Alternative Name: + othername: + Signature Algorithm: sha1WithRSAEncryption + 3d:2f:62:54:90:6a:d1:f1:93:cc:21:b6:45:d2:d8:d3:ae:c8: + c4:63:6d:9a:25:a1:c3:33:3a:c0:90:ea:ac:4b:67:a4:af:dd: + 75:3f:03:13:44:a9:7e:5a:9e:3b:6f:df:06:d0:6d:ae:bf:fc: + bf:23:b0:5e:c9:1b:98:d1:e6:6c:20:83:48:2f:b1:8d:ef:c1: + 33:fd:d1:7f:d0:ca:03:9a:e4:3a:42:17:0d:e6:40:25:2f:f3: + 80:83:36:c4:cc:8e:4b:7b:90:9d:22:ca:83:c1:a3:d0:c9:13: + af:b4:a6:d7:d9:3b:be:fd:d1:5a:da:71:f8:6e:18:c8:8e:82: + d0:b8:a6:de:58:c8:9b:8f:c1:20:ab:81:a8:3b:29:81:2d:cb: + a2:f3:b2:9b:81:7d:78:c6:55:ed:05:75:7f:4c:64:6b:fe:00: + e7:2b:6e:17:d5:32:de:e1:1d:33:f6:ce:89:4b:c6:be:92:54: + f7:16:ea:91:b7:af:46:80:41:8f:6c:47:d6:07:d7:62:34:1b: + 7c:69:e8:6c:ac:6f:39:b2:3c:60:cd:b3:89:95:3a:9e:ef:75: + fa:b1:ad:b4:bc:89:69:1c:69:53:dd:94:25:93:7c:64:56:75: + 0a:a9:8d:2b:6d:ed:9c:e7:cf:9a:ad:02:ca:79:f4:fa:59:4e: + 51:33:c3:f9:4d:a6:35:62:50:e7:f3:2d:aa:32:b3:60:2f:1e: + e3:71:6b:78:98:f7:9f:fe:0f:0f:f1:a5:6a:4f:f7:01:22:52: + 60:6b:62:b5:5b:15:6d:4f:41:e0:23:a0:43:45:39:70:f3:a0: + bd:30:14:63:01:01:f4:1f:fb:65:43:c8:99:57:aa:47:2d:53: + 0c:f6:c2:65:f3:1a:64:69:67:f3:7b:b1:2f:0f:c1:e8:a2:5e: + 78:bd:df:a6:d8:3e:ce:6a:fc:bb:c6:14:a1:6b:de:fa:47:5d: + ce:6a:24:60:da:1b:5d:fd:c1:5f:27:34:a2:b6:dc:bb:e5:f4: + cb:14:88:e6:66:e7:49:e8:a0:22:49:da:af:1a:30:f6:ac:a7: + 99:56:5e:b4:b0:19:71:67:59:cd:0d:67:4b:82:54:0d:c9:88: + cb:ea:36:7f:60:d5:df:8a:74:78:25:2a:b5:ca:89:ac:9a:0b: + bc:a4:25:f9:38:c0:13:58:1b:5c:60:0a:b7:9c:74:de:b1:7b: + e2:5e:1d:85:50:e0:69:22:c5:2f:e1:1a:1c:ca:cd:a7:ab:0d: + a2:ce:f1:88:92:68:10:fa:1d:ca:f4:62:6d:cd:8b:1b:72:2f: + 67:a1:b6:f6:ef:b9:f1:e8:bd:42:54:d8:4b:e0:8b:9b:6d:2d: + 1c:ca:c3:eb:79:5c:d7:00 +-----BEGIN CERTIFICATE----- +MIIFNjCCAx6gAwIBAgIBBjANBgkqhkiG9w0BAQUFADAqMRswGQYDVQQDDBJoeDUw +OSBUZXN0IFJvb3QgQ0ExCzAJBgNVBAYTAlNFMB4XDTE5MDUyMzE1MDUxNVoXDTM4 +MDExNjE1MDUxNVowHjELMAkGA1UEBhMCU0UxDzANBgNVBAMMBnBraW5pdDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL9LRI/R3VYYQVzCxCv/KOZ/aCbU +Dwjmr91yKJvsX1ov8Zp7IQ/CAZbYhTIgXMeR+y1xM9fcgQYyLuXsYTeKCwwjV82c +rpN5WCYe3iYYElLDdnrRatyYZxNNc9yPf3vclxXd624LVMz379sUj9KJRz6M597v +YTRnEGCKhxNthpGdipJkclzvZFe5DpHqQSwD4GfHUc/qCVrpDrrrvlMQkOUPhzM7 +5lMRHG11NOpKfFn0a9qCME31cq2uQffByrJ+dKRFvS2AxUfT7cIC+9mFdgA9pqva +Ku+kx9Z0xIgCY9WgX2uI7rzfD0N4j2IaxsjlOkOqdZTQcRWkivlnXZOTvXgERjmQ +SCIFeBfsuSY/T3up4nmzzxPONJ88eo+ot7QSOQFPJkQzuX3rxw3HHNPFUivLZaJI +uMay5RfT3+3v6eohXy5CI0A1fpcjKEIOIiV59uquo8/GxO/twx8UBV9mqyCgXoAR +Mh//aRDijtZw5Jergok3V3RDgeaFym47Ha4/yn/aK3vb7qutoaEWOJy28q++sBnh +YxRvJiT0qDoEDpqcWgq9IpHEw6sv6lTXyq3tt6CYisiUFeoTIpcp3zqFTIAN7j/Q +Zj2cD0Er/R6Q9Yr7TBAgO5HM/KvYiax6n7zJ5An+gbpTz/UTG0uw8780PT0sjJCJ +1jd4zHzwqJcIrOr1AgMBAAGjczBxMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMB0G +A1UdDgQWBBR2n6pN0R6SYSPOrtzDzQfrpxNDLzA4BgNVHREEMTAvoC0GBisGAQUC +AqAjMCGgDRsLVEVTVC5INUwuU0WhEDAOoAMCAQGhBzAFGwNiYXIwDQYJKoZIhvcN +AQEFBQADggIBAD0vYlSQatHxk8whtkXS2NOuyMRjbZolocMzOsCQ6qxLZ6Sv3XU/ +AxNEqX5anjtv3wbQba6//L8jsF7JG5jR5mwgg0gvsY3vwTP90X/QygOa5DpCFw3m +QCUv84CDNsTMjkt7kJ0iyoPBo9DJE6+0ptfZO7790VracfhuGMiOgtC4pt5YyJuP +wSCrgag7KYEty6LzspuBfXjGVe0FdX9MZGv+AOcrbhfVMt7hHTP2zolLxr6SVPcW +6pG3r0aAQY9sR9YH12I0G3xp6GysbzmyPGDNs4mVOp7vdfqxrbS8iWkcaVPdlCWT +fGRWdQqpjStt7Zznz5qtAsp59PpZTlEzw/lNpjViUOfzLaoys2AvHuNxa3iY95/+ +Dw/xpWpP9wEiUmBrYrVbFW1PQeAjoENFOXDzoL0wFGMBAfQf+2VDyJlXqkctUwz2 +wmXzGmRpZ/N7sS8PweiiXni936bYPs5q/LvGFKFr3vpHXc5qJGDaG139wV8nNKK2 +3Lvl9MsUiOZm50nooCJJ2q8aMPasp5lWXrSwGXFnWc0NZ0uCVA3JiMvqNn9g1d+K +dHglKrXKiayaC7ykJfk4wBNYG1xgCrecdN6xe+JeHYVQ4GkixS/hGhzKzaerDaLO +8YiSaBD6Hcr0Ym3NixtyL2ehtvbvufHovUJU2Evgi5ttLRzKw+t5XNcA +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/pkinit-proxy.crt b/crypto/heimdal/lib/hx509/data/pkinit-proxy.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/pkinit-proxy.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFNjCCAx6gAwIBAgIJAJd7zCsMMPvCMA0GCSqGSIb3DQEBCwUAMB4xCzAJBgNV +BAYTAlNFMQ8wDQYDVQQDDAZwa2luaXQwHhcNMTkwNTIzMTUwNTE1WhcNMzgwMTE2 +MTUwNTE1WjA1MQswCQYDVQQGEwJTRTEPMA0GA1UEAwwGcGtpbml0MRUwEwYDVQQD +DAxwa2luaXQtcHJveHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCh +U0hTlQYhDONlH8153Wn2/H6/OW15S9pvg/RcQ9+Mc7a3kOEnImHt4B/zevv1rfYa +EernC2mrTxvSSy2Oxx3yNFsV1Kys+kMYiIygswPohTHYhMQKEjqGPTN97E1JcvMQ +iZy19sl6tG+kLZKa5pSTUoFrlqw2NN9U1WjlgaZ7WnLxwLlatQnZOnA6+MoU1bJe +pkPUAcjOOQZTd2D/3tAOcBKfQ6z97XFqfxzcnclz+9BXgFdZWTR1efd5yYNy17ny +8hoEHuc34+a/hrrhfiFiXYKFF6f07YI6lt+ElPOc93oz19fE4wVskXjvxLOwahzM +q2jRalsj/XlYCEHrZqaYjHvY8MYNFleThQEwJ/zldgQjx2MMnUD3ApxRDutfYM9e +MFSv0ATDFoKi55mGySMD3dMpI1I/TER459Am5c88SfxJNJXAW/2GJXQAJ7tCL3dM +sYcqkl5uVZXPJxSQbfFCl95lhlzOtoXZTS1+cxYN0oz9YfLoG3tz3x5Xtxo0eUbI +NJBq1sWi6bO6+6GyQOxs45sawl906XFqW/qzSywNOOsT/hcuEvc4IGdZKLP/wxF0 +HJzeaqDwfmiT1tz8jArGsbqw/i77xND6tq+56rur5/BhfIapXZ9wKDfawQttpDnX +PTcaT8BSqQejfZa0RiRvt70pypm98eZ1XRzWhC6bvQIDAQABo2AwXjAJBgNVHRME +AjAAMAsGA1UdDwQEAwIF4DAdBgNVHQ4EFgQUzoShaVViBQhilqB70YV+yuLcWIEw +JQYIKwYBBQUHAQ4BAf8EFjAUAgEAMA8GCCsGAQUFBxUABANmb28wDQYJKoZIhvcN +AQELBQADggIBAL45/vKz88cBG7c11gyePde86H7qWgIKrWocohn6eoXF1p2ZkLvP +na4o7WVr/WC7t4DiBZVUNVvrqss/nOI3wMVjU9Mn9wrJbycvrVPAWH1nIhlKR3gM +H8PTcZiHI+Vf14aHTjeRFEXxy0i+K7JxtKRQC/Bi+MuwnBvPwvar3tqFLXprRk4p +p42I7/ngT8WcAzz/LWj0rWYNl/TEFU3esDBr3rz+B5TFVcp2dLpcZW7ScFRh9bLT +OwJ/QNhzvnH5cwsWlb8cpDTFVeyTOBgqh9t6ut6SnDfCu03xIBVuCk+P5KhOGWAS +3cOVqvGn3Y3q1glE2XdKgyYqU2z3itneUyiCeopItFaKZIV52s4WuIuGO+PK8XOi +QhwtnsWO91toEFUpUNkxf/C6C61G4xuvHeMVLdTzO1Xi5kuHyN9gD8rLAuUfaV1c +Zv3f2S8WpvEGkSSu8Ap1k3ExfIaFhgxzu3pjGL5e6YV2lK9d/UGXOpDRFZOUuoRm +dyowQcF3XcH6zTDu+ThXlPSq5bkjrnMnNt2z2LfqGb/GFp1vl11LsXeLgpHmFTq2 +4umDDUwMHVzrmFoa3BtUkgO3BUoSrt2l63TFqTQZgZAf/D042jBcmOhV6Mt5MsDK +MFZkoYjtv+8jTeRwxP2zi3EceCvGkV1Mf3t2/h4wYGa25J6HFq86VVRU +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/pkinit-proxy.key b/crypto/heimdal/lib/hx509/data/pkinit-proxy.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/pkinit-proxy.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +gvWFSlv63UgRaUrIlQWr2X01y9IGjw== +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/pkinit-pw.key b/crypto/heimdal/lib/hx509/data/pkinit-pw.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/pkinit-pw.key @@ -0,0 +1,54 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: AES-256-CBC,EF2C2237F4387D5197FBFEC26EFA3487 + +m1mmDR2qaA0u6ZSC1Xvw6o9Uyt0NvNgKM2Lln0BOvE3UvsbUxE5NEGynlthge4zX +HfLX6PNZ4vkQASzm+e0M/cwUijDADmuHhsaZP30BriJ8SzZoeYq7WUVkv1EbCZFZ +o/lsVFBPzW6K2Vfjphj1WRwZZEsgef+kFtwNSQxcHXRmK3njcKaP67fKzsH2rjPE +HMEo/9vAShCmFH4Tnzxy91SF4Gftdov0xqRQZpG/1maCx0/76RJL7lxpYUYmIOPa +j2l6SUFSOP742bLWuHQXT36/SyocF2pk9kFzTfNb0lP7lriYrWhSDqqRWtoU0m3M +Ulku3bcDd/HH0Br70qfDDOvWuGb2ayHRKoDDVlRnwXZ9tzl9BHqzvLIORKEt2vns +6pHNU+8GwvYgtAlLMaN7KAH6hFUkVRi49lvTJbtrVJjMcGU7Vl5zurcyrfL2eLEZ +tdyR1lL01JWZW1gz177dn9drcB//r2ZIq6g9Ah0e1ZBj7aEFfSabfRuLgUaF859q +lWKt8112uuVn9vqOkiOlZVsNMRzP+NUEggVQ7Jn3H8CEqHgC1a0JElaQh/kd6BkP +RthT1Qz0WyPMz1LE2aInFavnrFXqNyuLkkd8WSb+wo8V+jZL/a2jl8d7thQsxOHt +OjfRyioX1YmeGBWz7I1ZObk1O0xi7vj7f4LoqabUqnU2Z6FQLCNRBlnO+SJq0DJj +Ca6r1bN3NPGH9vhL8sd6Ce+C/fMXyDLX3qp9qS6ZmiSDOTIC5si8JmWMeCC8yrim +RjBWEtTC4ve41ObrPHeDqDQOGdPpnPH5unQZA2jul3xizbr1ToYD4Uk3FuUYd2dH +Fp/OutvsPUz6Eu6gllOJ/KYwSakncWZknJt7spwHjoyKoqRVbqyIrMWrQDCd491M +ezZPeFursXyMeTezWcgUvh/NWA7+neQg99CP7hBs4v7LV9GYXJOxcJ97Hwl4m7mF +u3QZb8Izgu7IVRFju3u5kU13hi/yO+q9Yg2wvZAg5C7znpm2d/QDJCEdjqqUIjE+ +/r+a4QxSCbl7y4fiuHZqY+qTgFK4kQBCDGIixc+tDcZru4wiGKDYoMhcERDvxKLT +Upwbx3CqA28L42A+6IwapWO+jSBmCdfD6B+GEEWPaf5YzNZmM7td+DLeyOKAEK8w +GCZkd58hn9x0BZxEvxTcLqWFO0BMC8FSHyjPRnW9Ik5H2a8vllb3Wiq7LFZum1of +w2s9eb3vY2Lv6WNU2Mug+QwwbCwwmQmEJfROp/CWuHMmDlBudtDvVi2zUhNrqLoI +LSNBlyxCIHO21R2IWOpZ+xglOh7+Qc4oXZHnhttREsOL7FnE6IYdcP1hfF0uWAtc +kArTtgvFJurlZO+k840KPS1cfYLBNTgPK+6xssC2qZr3u6zP5Oh30gGgBQeETUxW +JrMW3LzoMH0I/RcYK3FkEb38KAQpYLvJPKzNRD3/ZU2judjlslobHhvJaXTeOxiK +B3NoFGi9+BXFBDyuKcHwUuFA7XCM9iIUbGoMzrSKFkc0CsCrJCWVvF/1cRNpJUQz +SOxKM/HvWD9VdpTyJ8qDoI0lKS0jn+rCcF9lMwvORVPebkypGkXC0RSwvx4+cFnT +oRjqpfLKzJlcEk+U7hPH5ZjsDUYq+FargGDmNvGZohpGNxsdYV1v6B6l3c7sLcWf +lShZVLMTYzAlgBpywzsoyPQxm32hVMcpme+nzMq74QB3ZHv/uy/xgTbOCnTTQQZv +hPvnEYcsNW9IBhGLr4kIsex5O5sLuatgDLh9xWgPObriu5BBVDNNqApze6AcqnIN +3TW/qzmyc3R95nxHCxVocwU1Pl9ZPGP+Mc+osUQD3seHAKmNQKWPiVzven8NdiBC +nSIjmBxVRtHdoiVLXk9LkTBoS+w1iPG1ztVsf+Vjg3PUoROD0XuzqwZ4XlkT64IT +6zcjD0IrSYgbO56Oqga8quibZl3+BVLexj/veFv2SKw31dMZ95ntnwuKpwCv3jHf +lrxrkPzj9Fsqup+HR3yh36FKyZkgPEU4KUrraXbsQMDdJdcec944QBIftj0p44W0 +T2SeGk0rkHSFZiZqoeyJ6ubKxalnre6PwJwtvVrx0QzREIGdCG5+SyphYEtd+mBr +ATh0LbMqD6vyJ66t4SuOdiCSfVbEomKaftS3C752Gk2QxFT+XEgNPuSDp5V8DqBR +W3W8DB03d3DolznjjcHTUJH65A1ADepUFpIteIkhHUrQP6IqQUNaaCIFd462IDCL +lL/4V7b1kq1pZJcF/yyDvdDAZM/6aTorKXy9l/v3SUN4z6smraISVTwShyof7Olf +2dQx1Eh/OjYNEATG86eoW15p6EWclO0osvIxR21xeOTFQUuiR9SijtLOOTiNKrTu +ug4/57HvGI3rI6Lujcx+js2B2aBdk+O8AkpCAcFTM7FkFRQCngP7ayyVt3I6x+M/ +8vxz6L7fdXYX/RYSIVLKlbSKo15f9NyDJiaHpACIpRzYUQLjrXcKsTiAcDoFaFGz +TLsTLnA3QDbTRptaDSvQfPhrOM5QezKVmhT6MSzCeJFAskpIgRm4XwaOQjZ/XP0J +ua7IG2WD6k8f62cszlbCEvMZWMBvb8JYVB/UGcBLtolFG8EGvvUrWAHWLWVvngNb +HCI7t/Z4SqIexcBTAOal1bAT/gcvNrAmSBXkcNg3hMqMXOXuC7W5Qbqtk6Bd1uiN +5BWMJOnGXrALbpHxNtC4QBjCAC6MshkMOJvIpNn4f30Qq4Of+NyJrIJl1jo/WLqG +hsHXYzZYI2LcfOi7a+4oSHQ2OfsGvdKWwmJha6Koo1VlF8gnHSJaGAH/soilan0w +KSOqSW4DJnAc3zry0jfDeLJLktrEn86xen1v2HjnS1WohfkFL5sSk3z5bVqQ6NrK +9OOeeXIzWC7AETBc6N3TY7rKljH0ZdtiB7axVI/0Vfmiqw9vOzJ3fij9BcLvXBQs +JKy80AdUvT4o3PGW9DJX/Ki04NBB9Y/Jlmtu2j1Iq2NVERqma/HzUliGosffdwYw +EswIfbMjKhghu6mbHguE2DdW2vXkKgmbUJcBFb2tnc97ESslJoxssWB3uZJNQqRW +FLl+I56S4CVUDLg6WmB7ZMyhCWJ0u2d/zvombQBnPN6GEc+VkZUzVE7NFYmK8j2Y +-----END RSA PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/pkinit.crt b/crypto/heimdal/lib/hx509/data/pkinit.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/pkinit.crt @@ -0,0 +1,119 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 6 (0x6) + Signature Algorithm: sha1WithRSAEncryption + Issuer: CN=hx509 Test Root CA, C=SE + Validity + Not Before: May 23 15:05:15 2019 GMT + Not After : Jan 16 15:05:15 2038 GMT + Subject: C=SE, CN=pkinit + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (4096 bit) + Modulus: + 00:bf:4b:44:8f:d1:dd:56:18:41:5c:c2:c4:2b:ff: + 28:e6:7f:68:26:d4:0f:08:e6:af:dd:72:28:9b:ec: + 5f:5a:2f:f1:9a:7b:21:0f:c2:01:96:d8:85:32:20: + 5c:c7:91:fb:2d:71:33:d7:dc:81:06:32:2e:e5:ec: + 61:37:8a:0b:0c:23:57:cd:9c:ae:93:79:58:26:1e: + de:26:18:12:52:c3:76:7a:d1:6a:dc:98:67:13:4d: + 73:dc:8f:7f:7b:dc:97:15:dd:eb:6e:0b:54:cc:f7: + ef:db:14:8f:d2:89:47:3e:8c:e7:de:ef:61:34:67: + 10:60:8a:87:13:6d:86:91:9d:8a:92:64:72:5c:ef: + 64:57:b9:0e:91:ea:41:2c:03:e0:67:c7:51:cf:ea: + 09:5a:e9:0e:ba:eb:be:53:10:90:e5:0f:87:33:3b: + e6:53:11:1c:6d:75:34:ea:4a:7c:59:f4:6b:da:82: + 30:4d:f5:72:ad:ae:41:f7:c1:ca:b2:7e:74:a4:45: + bd:2d:80:c5:47:d3:ed:c2:02:fb:d9:85:76:00:3d: + a6:ab:da:2a:ef:a4:c7:d6:74:c4:88:02:63:d5:a0: + 5f:6b:88:ee:bc:df:0f:43:78:8f:62:1a:c6:c8:e5: + 3a:43:aa:75:94:d0:71:15:a4:8a:f9:67:5d:93:93: + bd:78:04:46:39:90:48:22:05:78:17:ec:b9:26:3f: + 4f:7b:a9:e2:79:b3:cf:13:ce:34:9f:3c:7a:8f:a8: + b7:b4:12:39:01:4f:26:44:33:b9:7d:eb:c7:0d:c7: + 1c:d3:c5:52:2b:cb:65:a2:48:b8:c6:b2:e5:17:d3: + df:ed:ef:e9:ea:21:5f:2e:42:23:40:35:7e:97:23: + 28:42:0e:22:25:79:f6:ea:ae:a3:cf:c6:c4:ef:ed: + c3:1f:14:05:5f:66:ab:20:a0:5e:80:11:32:1f:ff: + 69:10:e2:8e:d6:70:e4:97:ab:82:89:37:57:74:43: + 81:e6:85:ca:6e:3b:1d:ae:3f:ca:7f:da:2b:7b:db: + ee:ab:ad:a1:a1:16:38:9c:b6:f2:af:be:b0:19:e1: + 63:14:6f:26:24:f4:a8:3a:04:0e:9a:9c:5a:0a:bd: + 22:91:c4:c3:ab:2f:ea:54:d7:ca:ad:ed:b7:a0:98: + 8a:c8:94:15:ea:13:22:97:29:df:3a:85:4c:80:0d: + ee:3f:d0:66:3d:9c:0f:41:2b:fd:1e:90:f5:8a:fb: + 4c:10:20:3b:91:cc:fc:ab:d8:89:ac:7a:9f:bc:c9: + e4:09:fe:81:ba:53:cf:f5:13:1b:4b:b0:f3:bf:34: + 3d:3d:2c:8c:90:89:d6:37:78:cc:7c:f0:a8:97:08: + ac:ea:f5 + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + X509v3 Key Usage: + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Subject Key Identifier: + 76:9F:AA:4D:D1:1E:92:61:23:CE:AE:DC:C3:CD:07:EB:A7:13:43:2F + X509v3 Subject Alternative Name: + othername: + Signature Algorithm: sha1WithRSAEncryption + 3d:2f:62:54:90:6a:d1:f1:93:cc:21:b6:45:d2:d8:d3:ae:c8: + c4:63:6d:9a:25:a1:c3:33:3a:c0:90:ea:ac:4b:67:a4:af:dd: + 75:3f:03:13:44:a9:7e:5a:9e:3b:6f:df:06:d0:6d:ae:bf:fc: + bf:23:b0:5e:c9:1b:98:d1:e6:6c:20:83:48:2f:b1:8d:ef:c1: + 33:fd:d1:7f:d0:ca:03:9a:e4:3a:42:17:0d:e6:40:25:2f:f3: + 80:83:36:c4:cc:8e:4b:7b:90:9d:22:ca:83:c1:a3:d0:c9:13: + af:b4:a6:d7:d9:3b:be:fd:d1:5a:da:71:f8:6e:18:c8:8e:82: + d0:b8:a6:de:58:c8:9b:8f:c1:20:ab:81:a8:3b:29:81:2d:cb: + a2:f3:b2:9b:81:7d:78:c6:55:ed:05:75:7f:4c:64:6b:fe:00: + e7:2b:6e:17:d5:32:de:e1:1d:33:f6:ce:89:4b:c6:be:92:54: + f7:16:ea:91:b7:af:46:80:41:8f:6c:47:d6:07:d7:62:34:1b: + 7c:69:e8:6c:ac:6f:39:b2:3c:60:cd:b3:89:95:3a:9e:ef:75: + fa:b1:ad:b4:bc:89:69:1c:69:53:dd:94:25:93:7c:64:56:75: + 0a:a9:8d:2b:6d:ed:9c:e7:cf:9a:ad:02:ca:79:f4:fa:59:4e: + 51:33:c3:f9:4d:a6:35:62:50:e7:f3:2d:aa:32:b3:60:2f:1e: + e3:71:6b:78:98:f7:9f:fe:0f:0f:f1:a5:6a:4f:f7:01:22:52: + 60:6b:62:b5:5b:15:6d:4f:41:e0:23:a0:43:45:39:70:f3:a0: + bd:30:14:63:01:01:f4:1f:fb:65:43:c8:99:57:aa:47:2d:53: + 0c:f6:c2:65:f3:1a:64:69:67:f3:7b:b1:2f:0f:c1:e8:a2:5e: + 78:bd:df:a6:d8:3e:ce:6a:fc:bb:c6:14:a1:6b:de:fa:47:5d: + ce:6a:24:60:da:1b:5d:fd:c1:5f:27:34:a2:b6:dc:bb:e5:f4: + cb:14:88:e6:66:e7:49:e8:a0:22:49:da:af:1a:30:f6:ac:a7: + 99:56:5e:b4:b0:19:71:67:59:cd:0d:67:4b:82:54:0d:c9:88: + cb:ea:36:7f:60:d5:df:8a:74:78:25:2a:b5:ca:89:ac:9a:0b: + bc:a4:25:f9:38:c0:13:58:1b:5c:60:0a:b7:9c:74:de:b1:7b: + e2:5e:1d:85:50:e0:69:22:c5:2f:e1:1a:1c:ca:cd:a7:ab:0d: + a2:ce:f1:88:92:68:10:fa:1d:ca:f4:62:6d:cd:8b:1b:72:2f: + 67:a1:b6:f6:ef:b9:f1:e8:bd:42:54:d8:4b:e0:8b:9b:6d:2d: + 1c:ca:c3:eb:79:5c:d7:00 +-----BEGIN CERTIFICATE----- +MIIFNjCCAx6gAwIBAgIBBjANBgkqhkiG9w0BAQUFADAqMRswGQYDVQQDDBJoeDUw +OSBUZXN0IFJvb3QgQ0ExCzAJBgNVBAYTAlNFMB4XDTE5MDUyMzE1MDUxNVoXDTM4 +MDExNjE1MDUxNVowHjELMAkGA1UEBhMCU0UxDzANBgNVBAMMBnBraW5pdDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL9LRI/R3VYYQVzCxCv/KOZ/aCbU +Dwjmr91yKJvsX1ov8Zp7IQ/CAZbYhTIgXMeR+y1xM9fcgQYyLuXsYTeKCwwjV82c +rpN5WCYe3iYYElLDdnrRatyYZxNNc9yPf3vclxXd624LVMz379sUj9KJRz6M597v +YTRnEGCKhxNthpGdipJkclzvZFe5DpHqQSwD4GfHUc/qCVrpDrrrvlMQkOUPhzM7 +5lMRHG11NOpKfFn0a9qCME31cq2uQffByrJ+dKRFvS2AxUfT7cIC+9mFdgA9pqva +Ku+kx9Z0xIgCY9WgX2uI7rzfD0N4j2IaxsjlOkOqdZTQcRWkivlnXZOTvXgERjmQ +SCIFeBfsuSY/T3up4nmzzxPONJ88eo+ot7QSOQFPJkQzuX3rxw3HHNPFUivLZaJI +uMay5RfT3+3v6eohXy5CI0A1fpcjKEIOIiV59uquo8/GxO/twx8UBV9mqyCgXoAR +Mh//aRDijtZw5Jergok3V3RDgeaFym47Ha4/yn/aK3vb7qutoaEWOJy28q++sBnh +YxRvJiT0qDoEDpqcWgq9IpHEw6sv6lTXyq3tt6CYisiUFeoTIpcp3zqFTIAN7j/Q +Zj2cD0Er/R6Q9Yr7TBAgO5HM/KvYiax6n7zJ5An+gbpTz/UTG0uw8780PT0sjJCJ +1jd4zHzwqJcIrOr1AgMBAAGjczBxMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgXgMB0G +A1UdDgQWBBR2n6pN0R6SYSPOrtzDzQfrpxNDLzA4BgNVHREEMTAvoC0GBisGAQUC +AqAjMCGgDRsLVEVTVC5INUwuU0WhEDAOoAMCAQGhBzAFGwNiYXIwDQYJKoZIhvcN +AQEFBQADggIBAD0vYlSQatHxk8whtkXS2NOuyMRjbZolocMzOsCQ6qxLZ6Sv3XU/ +AxNEqX5anjtv3wbQba6//L8jsF7JG5jR5mwgg0gvsY3vwTP90X/QygOa5DpCFw3m +QCUv84CDNsTMjkt7kJ0iyoPBo9DJE6+0ptfZO7790VracfhuGMiOgtC4pt5YyJuP +wSCrgag7KYEty6LzspuBfXjGVe0FdX9MZGv+AOcrbhfVMt7hHTP2zolLxr6SVPcW +6pG3r0aAQY9sR9YH12I0G3xp6GysbzmyPGDNs4mVOp7vdfqxrbS8iWkcaVPdlCWT +fGRWdQqpjStt7Zznz5qtAsp59PpZTlEzw/lNpjViUOfzLaoys2AvHuNxa3iY95/+ +Dw/xpWpP9wEiUmBrYrVbFW1PQeAjoENFOXDzoL0wFGMBAfQf+2VDyJlXqkctUwz2 +wmXzGmRpZ/N7sS8PweiiXni936bYPs5q/LvGFKFr3vpHXc5qJGDaG139wV8nNKK2 +3Lvl9MsUiOZm50nooCJJ2q8aMPasp5lWXrSwGXFnWc0NZ0uCVA3JiMvqNn9g1d+K +dHglKrXKiayaC7ykJfk4wBNYG1xgCrecdN6xe+JeHYVQ4GkixS/hGhzKzaerDaLO +8YiSaBD6Hcr0Ym3NixtyL2ehtvbvufHovUJU2Evgi5ttLRzKw+t5XNcA +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/pkinit.key b/crypto/heimdal/lib/hx509/data/pkinit.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/pkinit.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +60UoyAUhtvNbBCWkTske6/ey/kjJTUD4 +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/proxy-level-test.crt b/crypto/heimdal/lib/hx509/data/proxy-level-test.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy-level-test.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFVTCCAz2gAwIBAgIJAOXO+qv/iXxEMA0GCSqGSIb3DQEBCwUAMDExCzAJBgNV +BAYTAlNFMRIwEAYDVQQDDAlUZXN0IGNlcnQxDjAMBgNVBAMMBXByb3h5MB4XDTE5 +MDUyMzE1MDUyNFoXDTM4MDExNjE1MDUyNFowQTELMAkGA1UEBhMCU0UxEjAQBgNV +BAMMCVRlc3QgY2VydDEOMAwGA1UEAwwFcHJveHkxDjAMBgNVBAMMBWNoaWxkMIIC +IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArcTnrpY2+DYyaO9DDllOz237 +auNMA2z86fS3monYx0feQ06cCdwA1xLNk/3BlkAsTH+7Q/Z8SGRFyzMKgbt8i97j +lyuLuXxwWK87Tz14S94BK6HIGN9yc4wNtZ8p6l3uaIeTlcEZJpltViEc+I/9kjNg +LK/0+s6OBuSEa6bEXJ5ecPFe7OeaSctN+7CMOS8FQJHFhH6zpq5uCcSnFS7ZxOGK +wdjziJWn7zd3qEc01cWsR7HZrRII31ctbmDxt0suAGfIZaMm8fkCQkH24w/xuNQH +ldH3q2/H7AdWvh6copqY5sxTAfaT9TSzOu9MaH129cz7x31+xMo64YxsUDP0yC9s +fmV3APEGX8Q8PIgs1FJjsknV9F1F78aBFAYTKlBhgMki3Fi+iC64QPfu12sGuzK7 +eoDbtD3Q3p4NpwVeQYZ8972zwhnPTT6tgoh50MaRb6c+5PmSRhKt3QL0aUp+URmY +SAdO8V0BI+exK5/T89Yd9c0uMn+TOUMHc5OEckBi9Fi/oOsYPBahyKAZxcERHdXo ++mZht5kl8mBVbk2hfQl75eUQ9sWvVQxn1uS4x/j4k8mMqLdbXL5keIXGOyA9S28n +IodERwwJdxgJ9JKw5WR4wdqeZJjIUw8qe7Du2FSH6L4eHMYOcS6nXlVM6Vl65nJh +vnqqmW6DQ+L22uBst7sCAwEAAaNgMF4wCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAw +HQYDVR0OBBYEFFjF34ZepMQe/Lgd/kmm+fXkMFhtMCUGCCsGAQUFBwEOAQH/BBYw +FAIBADAPBggrBgEFBQcVAAQDZm9vMA0GCSqGSIb3DQEBCwUAA4ICAQBza0sK8s5r +9PBUTZGQTylDsJgj6+siu6fwEOeUwJpag+9kDbyMHUTnueO4kPbahWdVtx5rwCxg +NqHtHl0g8GwwLJ1wX0e8bi4fNimx08W9b5PnhOzUzbZnUIuwc2q0YL3yp0yfDo5h +2R6BlCz/2AKM7i2PqoOsoctwJs5mE3I5E0AQto0tPaKqB2Z1FyU8ArY+2jrsgQq2 +EGbEeKSavjaIiuq3YQ9zyrZH17Npryw0brDkGBOvi2jANfQbvQJWlL7tklh8j/Xa +61/VAm4wU82P8NGM1LYjxH0Ad46Ca8cUq63Qxa2hb7igdOoUbvlSGNctgtENJPAd +XeUt1/bxjsBTgPo89tg0Hc1UBb/msd6q8/8a7mA69GrHG6yEEVHOQDal92PbP8WU +ajv4vAM0OxOHO3eyWqh1nGlYRmwE6iGtbVZypWgh30mKELjxn1q82+HvrKMAeS+S +4j34v4877EC+EXRPsHw5sGpmTp4eVtuFM87gGtrFLOheGi/2JHBYdgjJkuqPDYoE +0J4U30+xaz0mtY5hSTt6LknMQEOM1REcQ/NBovq/CsMs7vbaoNtfavu+ZSX9AgvU +5SKJ38KFndrV4VZq+hzTOXj3IhfLqSBm1EtbTQO1W8vLIR+SK6Ct0D76P+Ht5Ddg +Z/fMiB95hkiTG72ZnjMTvLn4U9mNFWanTg== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/proxy-level-test.key b/crypto/heimdal/lib/hx509/data/proxy-level-test.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy-level-test.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +FcKB1ity0sQYMAUGvDAqSodhrsSjn6o= +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/proxy-test.crt b/crypto/heimdal/lib/hx509/data/proxy-test.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy-test.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFNTCCAx2gAwIBAgIJAKQmPUkmhyKnMA0GCSqGSIb3DQEBCwUAMCExCzAJBgNV +BAYTAlNFMRIwEAYDVQQDDAlUZXN0IGNlcnQwHhcNMTkwNTIzMTUwNTIxWhcNMzgw +MTE2MTUwNTIxWjAxMQswCQYDVQQGEwJTRTESMBAGA1UEAwwJVGVzdCBjZXJ0MQ4w +DAYDVQQDDAVwcm94eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMIM +AgaAGNSDMgLYghbdvgtiyY4FoxSi2aJ02jC4Ji+QLWW0V9iWOW1IRNyEYRHX3AhE +1lX+zousMm9Yni6NEtNUERvaN/9hLGJzBQMIH5grWKU4AsUZKFLAa1P/DiLh+U7I +Blj2YESWh8BFnnfrMA2r94CYQmDCZyXL5xX5d75U5Y14isAUvthC9mbhhROu75C7 +OO2YFgMwDp0mlL02vp7z3NhbWqDxak+09LLuNwqy2H+E+qFou7mUNm1NP9dlUaYS +tKkk6QaRe6X7tO09mYHMx5AnhsH3NU7hc8nBPIDbToRHaEXzW8gtXukXUa3KwvSq +blqk0pWU3v/VV2Huwu4yfrzkL/Eb9Fyw6mlAP6Tui2lnqveb6xBPmyGr2UJ/pDfo +Nd1SNKE8kfwD2MK57xwSa8unVDUQYguCs9LhdJFZ52Cb6UtfffR8OlFuzA8I7BWt +0/Hh1lUIhTcvS6UaO3jP/7RmqmCwA6/9I5zAIh1bjSzpkJQLpEyPou9Ro+MarUOt +YSDK1Xq5LTYiP1hZqhOkhtU9XLCCsRd5sDYHo1IsTPLLBRdU+NYjlP4qrCuZHKEM +fLVSsMk/S8+W4nA/WrqZe+KIbgoxrQ2Zm4wTzdZWZC3ZEvF+IUjrm+nuXWTa/NBu +fFo8OB5waYS0jrWm27FkPfZwtcWQHpjxdf9YlsifAgMBAAGjYDBeMAkGA1UdEwQC +MAAwCwYDVR0PBAQDAgXgMB0GA1UdDgQWBBTZHxVeBpBui9FNbSHOWqtVj8r98TAl +BggrBgEFBQcBDgEB/wQWMBQCAQAwDwYIKwYBBQUHFQAEA2ZvbzANBgkqhkiG9w0B +AQsFAAOCAgEAXHVRH3wJdrTjJV0ywc1rrI1cH1itMOqzvZtbLUgMEJQuRRnRVHys +ZG8HxNeesfTiHAH635GeJh66rCbxmJWqczLUoTib/GRO3o+NbtcvAyEpT9SXD201 +x9tVUhEb0lBmZDpnvpfaC7MF3tS/PXMurlFV5xxFRG+xRbUo7+EAQfCEuADgdlRv +v75YrH5ShohTk5nP2SxYu6NLNqvawIb7a/GRCwD585FklQydJjPlYgPcbFW7FXBz +nopYKJriBJdttirZ2DW0HrZyjF5FNpGIEUOxkvYoiqTOTqOhTOrm1sziS3S0DbfT +eoMXIIV8vcFykmSh9ri/k+RKnznje6he7bt0yV3Fb+e/YnAdlxLVPCULWHS6IZtA +g8SZ6m0pKQByH/yF3dSEzLCP9XyNUybwPIbLXq0LVII46CtjNiAIgFSDDtQ11tS2 +Ja/rhsUsSE1eRggTXSPrYSB2D5J+j5zcT35nqmlTm4ZGuG05T/yh6c6UCwA7hXmj +YJxo+1BR+pNl6Q83mvPDKnZ7qkZdxCnuxkPEShatf5ntAxVVZPsfTbDwwkcMSCJA +Wvp2/2Ss6rv2o7+vs2AbygXdF9H7QmOkJj1TgDKwDTkFOLvgggMHZOSZBef8Tluh +gaX5p1Zxb9fvAhkTiSdTuos1YMPuu2zeQTmWXJqtjpGBJQBnDTA3b9k= +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/proxy-test.key b/crypto/heimdal/lib/hx509/data/proxy-test.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy-test.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDCDAIGgBjUgzIC +2IIW3b4LYsmOBaMUotmidNowuCYvkC1ltFfYljltSETchGER19wIRNZV/s6LrDJv +WJ4ujRLTVBEb2jf/YSxicwUDCB+YK1ilOALFGShSwGtT/w4i4flOyAZY9mBElofA +RZ536zANq/eAmEJgwmcly+cV+Xe+VOWNeIrAFL7YQvZm4YUTru+QuzjtmBYDMA6d +JpS9Nr6e89zYW1qg8WpPtPSy7jcKsth/hPqhaLu5lDZtTT/XZVGmErSpJOkGkXul ++7TtPZmBzMeQJ4bB9zVO4XPJwTyA206ER2hF81vILV7pF1GtysL0qm5apNKVlN7/ +1Vdh7sLuMn685C/xG/RcsOppQD+k7otpZ6r3m+sQT5shq9lCf6Q36DXdUjShPJH8 +A9jCue8cEmvLp1Q1EGILgrPS4XSRWedgm+lLX330fDpRbswPCOwVrdPx4dZVCIU3 +L0ulGjt4z/+0ZqpgsAOv/SOcwCIdW40s6ZCUC6RMj6LvUaPjGq1DrWEgytV6uS02 +Ij9YWaoTpIbVPVywgrEXebA2B6NSLEzyywUXVPjWI5T+KqwrmRyhDHy1UrDJP0vP +luJwP1q6mXviiG4KMa0NmZuME83WVmQt2RLxfiFI65vp7l1k2vzQbnxaPDgecGmE +tI61ptuxZD32cLXFkB6Y8XX/WJbInwIDAQABAoICADcofKbmYKh/xoaCjq/7Rhss +cIibV5j1FZIVTzRMFCavAAiJ8/KP+TD0OwbH5mPRDS2Yi6iULpgLUabO9N/cn/5M +RjS5mfNQ5vHxKfqLo5d4stD8E+V82jZzlc6hkJ4fx+M5/nvpRMIaW+oun/YMd3Nb +b5YxMaUZfYKD7GMVr5D9xuao3h/thbYpiqsB7fcDYfutDGiVM6SiU3UeU2dZmWPL +g/pINYHMPeD8WhZGmoTDA8Fzxl59S+dblwEI1V3f4g6oAIyX/lksn4419178hJcd +45g5dBfMsm2CrowqDo2+SRpWxfAkVfGX3AO76i7RlQtBKu8/LNDyKVVlilo/KU9X +eFstgoWDaux1ffezj2pkxa37wEaQIlPTrxTBZDB/ZO0+JMzvbmchLzBn4fY+1sXs +CnPdAA+Ls1UQMCGn4jfdIS1B2oBrA58sQ15YX4o7El1NvAQ5CbAOob6Y7TfpWhgR +2FKOxaRuK5Ep4rFY6bAKrSMigti+PGb1xx4E12hondwuEl15s1rIyB0/qjNQy4/D +VVjujBFBbPkexI9UQOzzh3bXSfYNtYiSAEqpbp9aYiK2fKMIE+pjWivXaJH3Th61 +bxKZwIsMBBcNa/S9VPiAFL5hIab+WVueI51M9o+eWYIADPq8SgyTqCryQpEyKDic +UQgM8EMSYnbttvKPE7x5AoIBAQDh4Gynf/FuZ2fbidv5UrnondQerFNfpCgco3gl +dwKIWfsT/MRrCsv7Q0j0gOZ8C3RjkXzM7+ySTNuGki+XML4B60k7Vj2m/Q1nHffp +nZUzY8PYctt2GsKnf1vi3X8NN8DsIHi/rFZu10ots5WGRnx4aqogZ0e9C0e5QaFL +TwxKAYre/brg4zHorgkRCKQFyJkDJcupgUFbgCZvqF1RdbUzQFsJWHci1X5JFSxM +FDnj7nOm3Eu7cjOMiL60+xHFLoePAISGc4XJvz8sWZdB04yZ+5GeCbOJ2gOiiFiY +/3a7fHKrok8THu1cChwEjRsJwHWNvslMY7IbEEBBMIHxTu7dAoIBAQDb7OUluo1i +7OsnRhF+1xGiuTOyeY8+6r1oA0uwHnnMUBjBV0YOWdqJp52tJsWnEgYbYc48P+oP +h6ljcPH2glPlPQRbnet38Wft3q5P4LqiD3sgfRuu6yw+c2CZwlWeK93ft248QV+G +v9FEQq0nC2x/aBNXxrWY4pPEAYaWYhG6D700X7+7EyKKgpVp1Gv528g7pTi92k9f +8Ut3F3hJVoGwTpcyTnz+S4xozL0N3LZQjfw/OgN6UXk/prMj4yUlswWoPkUN/LR3 +xYcOtmPkmiMwXEN8hDCqaQWAfqq8CRCy/iRha87e4Xg9YeNQvVPODLmxkCuP3H/K +WGlecH+knverAoIBAQCnI/lizLLrfksE0fNbf9KfhcKD3AJpwEAKSRBLsM/H88Vt +2dnCV5/vUq+2dXeYDKXYU7zkrRkCfSroXl4m42OGagOri7pdSd1UE4HydbAE8erm +zL8GmvC1HvHwYvRz5HC2iaSwOKdQp7B1NvELBjdup4cyKRqVkbZGKIFhB6JRVOjc +7yYM6TFyOu3sk9dDjFdlU99rk4C4Y5CNiSlccNxfi1ySAstNlGs5SxiXR1Q7DKS5 +sUO89dmdQUbVBv/0R+T5dWmbT/qM+h6WA8mAZTkibFwpdIZNGG0eJQRiWo8SVxlH +VfhrbrQ3KifnWj7KrYaPF8E+7HrLue/CDVHqLP1lAoIBAAfJCxOa1wZ5fJmXUWc8 +FdO82qemxftkM/BKrZM+gPFKpJWzkTdQ1vuog1xt0vFnIfA2NibL3G1QUB7FEMu5 +MV8cGdtka8GDOjqhd2o8el7iTWmJBEHc8WQEkZbf2kgPJXuV8sEPT2Jlx/KyqY6I +SP75oDWrQyJ2YuS9aRZJwnbjt77y5Maqlr5wgPmOG4Rs01nJL4kJAWZUFGfS3N87 +wLuNDK0rOiGGayIKnWawOYQAgr16QEVEPRaTwCO1FsuO2tRp3+fu2jSjOXS74C1n +h3dezMTLqS1fKmKyGTku2Ph9JqyMNHaPZMJHhNSG30CcErbGc8RT+fIfzxsYwGwD +dKECggEBAIk5NwbiRe8EJmhLlHUuALYrzBJDgTSSNwrqUBt3lyP46XC3dAyQavzy +OX1Bznr1AauC1w5JEfr5DHJ2MeRVR2V+Spb+5e7KQGemoe3jaM3724smxfhThW/W ++nmiJ3Gk20lwBVBDZ9KTBnptg3zr4kORlNP2+EooYj/1dvzkflwDm2dLX8taSn8h +d81XaKBBwrNi6MYBYLDzw/tSbCkMGWK+odUguw+X/IDXiFcKJ1J2lRelJxdv6h7g +NeeTX0a6esQQO1MMTIVZSib5CubwgMhz18XvMA9mkcDjzifFhCrE7P1KlQLUYIGx +lUR8W/if6GM2wU/6ijdEVsMAQJUI5cY= +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/proxy10-child-child-test.crt b/crypto/heimdal/lib/hx509/data/proxy10-child-child-test.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy10-child-child-test.crt @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFeTCCA2GgAwIBAgIJAIZ6hp81I2P7MA0GCSqGSIb3DQEBCwUAMEMxCzAJBgNV +BAYTAlNFMRIwEAYDVQQDDAlUZXN0IGNlcnQxEDAOBgNVBAMMB3Byb3h5MTAxDjAM +BgNVBAMMBWNoaWxkMB4XDTE5MDUyMzE1MDUzMFoXDTM4MDExNjE1MDUzMFowUzEL +MAkGA1UEBhMCU0UxEjAQBgNVBAMMCVRlc3QgY2VydDEQMA4GA1UEAwwHcHJveHkx +MDEOMAwGA1UEAwwFY2hpbGQxDjAMBgNVBAMMBWNoaWxkMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA5rd/XFWt7tSsRUHIdPgK+CNxME9zqxPFzb0MpToG +3BJmFnhSA+1qFigBNHEsESN0pCG2nn/j9PXFflYOEvhcMRVd+b/dhTkyrmZScaaG +4/hrQuHNW/k9CXsq/FEQbWqVxiHbs7KNjmHHYHSdmZ9Y19qS5kTFEE7ma2hySyJr +7yQ1Fd9yVJyzUr4dSkxx6kGh+aILgVbNqSrd7ElBIhPMl4Qd4UVLadfFyJYmxiG0 +Gur1wXDUN4ElCh8I70elpjQH0fXmBG/FZl8zdMJVnQMSeFG2Ob42Atu/4Ndz0N3w +9+4hVQW6v8C4TbPRaIYyUB8Lt9jxZWmOfXKAfEF1uQrZaFttQbIBNBxUmu7tRMAQ +4OEUbNTFJ/+ErhPHHStIx1emP22WaTmQ4v3qVPr7REYuNKBLsLUZJd6qTftlUd79 +x8E81aJaAk23QW+0xldVlt7bAXF02iy2oZnJcj9Uwe/l6XQgHoPuG4Lz6q4OA5WM +ROG2vgOtu6phY5jY16YiVvMPocW9mdJQCjRAbIGFpmUeYiB6wWr9EGZpp+RVOchG +zS6GJCGLgyxcxHWmGYSNvdMnEacyXiCnC8DQZMcgVnqsDFBsM6QyICwXZr72qkU1 +QiWswudnspE+hw9xgceZqzNpAKhUw2skiLZOO0rnpLc/Rtd9FR65Hnvscz9Xu+p9 +pCMCAwEAAaNgMF4wCQYDVR0TBAIwADALBgNVHQ8EBAMCBeAwHQYDVR0OBBYEFLD1 +SUEhi6VToeKjUn/AKcXzGbOFMCUGCCsGAQUFBwEOAQH/BBYwFAIBCjAPBggrBgEF +BQcVAAQDZm9vMA0GCSqGSIb3DQEBCwUAA4ICAQBy1ZfOf9nkMOa4p7Rm2uzJ8hn/ +7htPNcawOUlSiq0JjctHoYBthHAHvUrrkjjR303c21adSdjs1KusOn0sbynaEMgP +dU2tiLn7/Tb6bAAC61vvBErsqzPwPQJX0/M+qdoqop43DG1Pv53VR5LSISjXB7Sl +oXbJs4cV7oksxWy0eeSa3IXFEnH+NhmHIC6MtpHqRAY0dXS5IWWo1q2Hiutcdd2l +Nc2IBgIY38oM8vpFoQp0Z9S23WIBZzKJ/eqyYZewmSKLnJ1zPvlDJX7g9sIDuO6T +SIod413DgFYSqKAv1u8brT1KnTytyxRQOeXqLTMaJEGB/u4z+CH5Z8U5WlA3X8IO +dHKAZM4LhGWLloyIGjSJ628Ow8VVdP3ptkKXJ4cVka92SDocCtsEdXFYoU1NA6U1 +D4VkExZTVN1sLmIsBiG8i9O8VltjMpPYvKjlUaoezCczIuEFVefuNpYLx7quoIry +8FFW6Ccw/kMSgAhaO1l0OlMVcuZTVns1/fmAF1eOscb5ud7u6YvqQeAbouPt3I2d +eTFG1EJgmfG4JjqTWMXIJdt2VuLutMPUSPAZ0pM0pGsrHW6FVzgHNFlgrO6gOeUq +ytDsdPEy5H1Dk6dzoPzbfSkMQ7a6HGf1ANeNLsTXV/0+kn/T/RhZAjjRQLWeRzDv +N0angzihXX4AspaYJg== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/proxy10-child-child-test.key b/crypto/heimdal/lib/hx509/data/proxy10-child-child-test.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy10-child-child-test.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +eyMm+IBLsR7OBZ2PvfCkhvJ3qDXzx1+BdQ== +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/proxy10-child-test.crt b/crypto/heimdal/lib/hx509/data/proxy10-child-test.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy10-child-test.crt @@ -0,0 +1,31 @@ +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIJAM764JrT/2XzMA0GCSqGSIb3DQEBCwUAMDMxCzAJBgNV +BAYTAlNFMRIwEAYDVQQDDAlUZXN0IGNlcnQxEDAOBgNVBAMMB3Byb3h5MTAwHhcN +MTkwNTIzMTUwNTI5WhcNMzgwMTE2MTUwNTI5WjBDMQswCQYDVQQGEwJTRTESMBAG +A1UEAwwJVGVzdCBjZXJ0MRAwDgYDVQQDDAdwcm94eTEwMQ4wDAYDVQQDDAVjaGls +ZDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMyady7cAVLnQae6jZG0 +QWzGcIa+0EJdjG5PyLmw4nJSAWBno68VmIPzqThNPn8aHhJ28aMYdS/oLyi5+Vau +afOvG7gOW2ayxmPelafk4J0Olbg+dHG0XzfA6Y2Y8gBigXtVR176GR418uy31HpO +O3BnlvJFU7QkBr9A9zROTnlfUUw0mN/io9I+LAO2GsbdFl+HTbx+T3LDKORf4jWW +suHBFEdwm0piJbP5nIk72jLp71ulubi4j5E0tVElv0DpF4FaQeCRGMXOfTYwswar +qg2TzXBTyeq+Kmuk1hslrphEVu1IZc0D8+aAr/hvrsI90oyTysASAfoCYKASnZWN +vcYi2Vt8Kkb1f4sxISqtm2PmHllD6grHdK1iKfoa9al7VvAu7sGyu0DF1uwmyehJ +1FNnQl0BIbFlfXiEVv6gRAazOJkxGO3kjneFVWffFwv9F9chdSCcMKO8USOV2qey +ySHaO+YTP+ImXD65dP7Ks9r1dBKxcU5vxJG0orHSiwstY5cRRqDeKatRdJ1kOavc +DWTlz/MJkMS8o5QNjsvWd+a8MkW0rkjYIuPzNHkg5ydFtm4lfRj8tZkJ56M8B5Oz +KFTD8JQ1PgxyPtzC5gnOaDuiTrmZQd+6ob02nvP7S2PgmKLyVbb28987/CG7MczD +g1BjCYRGsQnUcnvNM5EuMNlLAgMBAAGjYDBeMAkGA1UdEwQCMAAwCwYDVR0PBAQD +AgXgMB0GA1UdDgQWBBRtG+s2dgue8pi+jKTQONY6Gu0vdjAlBggrBgEFBQcBDgEB +/wQWMBQCAQowDwYIKwYBBQUHFQAEA2ZvbzANBgkqhkiG9w0BAQsFAAOCAgEAcSYX +JZ8+DUUab6RvbRAxyK483Bw7DbJuqFy90zy9RNDHV1Og/YdEey1Qvne85sVhUGhb +PLCRyM6dgT7BRsyBT00CYFp2sjETFm2KCkEevpfUgpbdYmxccV4vlOMguYJ6DWn/ +eV8OBOkdmc4RxZ3ibZ5XvNbs7lR5B01qHviAp8MT7+QFACCnC7gpD2b5lv11ZUac +STkklsuSY4nPBaD1NcgysG5EAUxoP6x1J7nJM4ukb762H0/svmsaYSo9kk6KGNXM +D3VbPCF4huNJcT+GkdtFfUmFHKC7yVekLDhs4Nh2GrOLJii3alcZXEOvq2TKq4No +Tl1nTLFVLZ9pMsWzL4aDySYGPpNDZPvetfqGprw/uLohgd6k3eFdnWWBkOk8jX7y +V/wLTTQlQHxMENFwj/eguEI7Kav8UcoZNaRWIjUXyZ29pzuM+aRJ4SFB21iq/vTR +mqTB7I20eh4dcjVpytU9KeQkWhhvxdiUj7dfgIkSViMG3Cy9hvu19S+nUZyvuBGQ +TwAGQlzfc5hEBbV5qBZhF/iOiDZJfBFcrULke5FfmFE6mW23eSwisqV4l0YfpyBw +nAhC+u25wG1JC2xXitBLqDnZqoFoX7dSzEMG01ia+c1yn9sK9mRr5ahas/QnSSC7 +2C0QAQMNb+C32deKlAfuSbtk6H5Mwf2YmArqQ38= +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/proxy10-child-test.key b/crypto/heimdal/lib/hx509/data/proxy10-child-test.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy10-child-test.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +wVvqDgPCDWKi204uIah9SC95JGv/BA== +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/proxy10-test.crt b/crypto/heimdal/lib/hx509/data/proxy10-test.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy10-test.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFNzCCAx+gAwIBAgIJAKQmPUkmhyKpMA0GCSqGSIb3DQEBCwUAMCExCzAJBgNV +BAYTAlNFMRIwEAYDVQQDDAlUZXN0IGNlcnQwHhcNMTkwNTIzMTUwNTI2WhcNMzgw +MTE2MTUwNTI2WjAzMQswCQYDVQQGEwJTRTESMBAGA1UEAwwJVGVzdCBjZXJ0MRAw +DgYDVQQDDAdwcm94eTEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +1RLpk560fH8JMomm7OaAxwXICdeuqhJZHlu/RegfDIsqo/qGyrEJczQVFGKnISoZ +rDthg+005e7VtTvVC6caKRhewogFBOiLwk7SmoyzXFHcpAdLGJgUL9UCUnxL42UR +djmY7jEtgAIcCwtvCwJb7TXZSaOaYtov5iUTeKmjP6Ixu37CjEUL0CSh2f4/5auC +cRXDfiHmYoUK/9q0BxUaGgDOyCuyrtI25jaMtZMNtCGTGJCWeZJDk+7+/tyNGuQt +NGNKRmJyENvgx6HXQiytXnxYbDABpLNQ8fw31gQVvSiuSHvE6zZa4VNPPjMFIXXU +jk4LwFsuw47OZYiHrMJpuSXLY/v62uID0+88NM+naD4R+DYtxkL1RATSwbhHg5zL +np9i3D1BL9WrPnzlKHEpW4orjeEUljJqu2IVW1OFojAMHC9cqwU2LGIhRqcf2osr +zltVS0f+ssXPhMu/G0Ib31ow24EYZFR2C3uT5oVgDfZ59mArknUHooWjhb9WqO0q +LoyI+5YxKDroNm8QnEhZAzye85JRuXmGt/G0xg99kq0WAlFjb2Y88oimgdpVFrDd +BTzNEjDcG2z2L3IJyekElWeTF/qlweQfExpg+WnseCNUrTWjCVDv94vGKUXvA+Va +xpnQWNdGnX+741vHbg3CkQhDFiQoAu9pjI3W18YUWKkCAwEAAaNgMF4wCQYDVR0T +BAIwADALBgNVHQ8EBAMCBeAwHQYDVR0OBBYEFHQh/SEjpZ7xoyS/k1Dzsq4CqoyF +MCUGCCsGAQUFBwEOAQH/BBYwFAIBCjAPBggrBgEFBQcVAAQDZm9vMA0GCSqGSIb3 +DQEBCwUAA4ICAQCTubaEkl971rzVIKGtzpV6Pa2uYTijFOsCUYUPOPjgtPQ+h45A +rfgdVYKd9sbujQf9buZb8Tut7Dt3XJvpig4xopzQezkNdLCwLfYOfDEfWWAY4gJE +ZZ6wrVeB2jgwS+xGGYSjXWWM75wgvpeptQSJ57jvVzX6wCWrPjw9RpemkoGJyqex +4iMILSQRFCjYYulbK2B8kWfUUxqz38l6mwbB9nk4FR8OQ9b6AhwFaVYNqbTMP7kw +SDx4s4h54lkWJ3Z4ktxs3DpOmIyIE9yl7rq+T6RZvkgZX9+9Ftm5XfmEmxyzjSyN +FEjrBAk4v/ryKS3JUDHKjR2MiJmNn171lfxc16MgpRL6assUSJInZ3cEEaUQoK/I +zKFpwa2vepGkQhZ7E1cO/ynotiRsJY7K1i3H3Ai3fQid+2N+KODPV3mpXPOOWYAg +oJXsQMUG0EaBVogtDgTsRpnv08OO/OKeXvrTTi9wDrnaedMhdSA2XpHBditBbADX +31lISHXD/c7Va+ispKnEG1LqR+yo4XhV4qH0v6SX/493/UKZDAUEGQIA2nJ+NvPA +INiEa2aGsdLmbu66R1OVF8cKpn03a4Dul2XbwfL3zjhHICw6hMACvxrArcN/JLku +bZWhpWleT0Im/HqqlwS9Qp2CTneyTsvDfnyDzPA57lmUJtpVy8mFq+MHYQ== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/proxy10-test.key b/crypto/heimdal/lib/hx509/data/proxy10-test.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/proxy10-test.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +XnrAAFMk+GLkZE8dvbKiMb+/IIDXWsg= +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/revoke.crt b/crypto/heimdal/lib/hx509/data/revoke.crt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/revoke.crt @@ -0,0 +1,116 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 3 (0x3) + Signature Algorithm: sha1WithRSAEncryption + Issuer: CN=hx509 Test Root CA, C=SE + Validity + Not Before: May 23 15:05:12 2019 GMT + Not After : Jan 16 15:05:12 2038 GMT + Subject: C=SE, CN=Revoke cert + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (4096 bit) + Modulus: + 00:bf:d0:af:36:d0:76:65:eb:21:0c:44:48:66:6e: + 43:c8:d4:07:73:4f:2f:36:b7:1b:ec:6a:aa:7b:60: + f2:87:9a:94:bc:ba:91:f8:1c:c8:1a:01:e4:fb:d1: + ac:3f:a6:07:26:2a:b7:8f:79:f8:31:ea:4f:e3:9d: + 2d:84:43:0f:ee:d4:1d:5d:e3:f6:16:31:5c:bf:f9: + ce:3e:b8:4a:e3:77:2b:bc:41:ee:84:52:2a:c0:7a: + aa:86:a5:21:9c:c5:a0:2a:e6:d8:46:33:c5:87:14: + 76:a5:71:2d:ae:7a:e6:60:0c:3c:35:cb:af:80:6c: + bf:cf:eb:25:f3:0f:be:5b:53:59:cb:b2:9b:c9:17: + 86:2d:08:a7:60:1e:42:d5:80:ea:74:b3:d0:7c:3c: + 42:33:58:c2:bf:35:5b:e6:7a:8a:9c:fc:7f:fc:c9: + cc:3f:7e:52:d6:8c:33:1a:2b:03:de:a4:fb:04:86: + 13:a9:b6:0f:d2:a4:12:1d:88:a6:4d:aa:85:c2:ff: + 19:11:bf:04:e0:57:1c:2e:03:97:b8:83:9b:0d:75: + 95:d7:15:f4:31:5c:2e:76:39:25:f3:fa:b1:9a:ca: + de:c8:39:cf:03:72:d8:23:0a:00:3a:e9:66:ef:8a: + f2:b0:fc:56:04:3d:b8:e6:dc:f4:a0:ae:73:1b:ae: + e4:03:42:79:f0:ee:14:51:18:8f:bb:d5:7f:cb:5a: + 21:6d:b9:9d:b9:3c:9e:15:24:23:2d:bf:c5:a3:66: + 45:f6:33:dc:06:7b:e1:68:f7:75:2d:58:9d:e1:73: + 06:79:a0:de:68:e2:70:5f:5a:fc:05:a7:26:d6:76: + 57:f8:12:7b:48:07:93:65:a8:d1:04:94:a0:42:9e: + a8:8e:ff:3a:c7:aa:54:6d:c1:99:2d:2a:c2:33:65: + 49:82:e7:df:bd:18:10:e3:69:df:d6:d7:16:4b:72: + b3:3c:fb:81:72:97:cd:28:35:13:b9:2e:09:55:4d: + 40:eb:e0:2e:24:f5:f2:0c:04:e4:38:90:db:1f:7e: + 79:42:97:9d:74:7a:87:c3:18:da:ec:9e:8c:00:25: + 36:87:88:05:49:77:c2:76:fc:68:76:59:b0:1f:d7: + d5:81:d9:47:f9:e9:62:c6:f5:08:06:d0:21:50:eb: + c7:b6:d4:9e:dc:94:68:d0:0f:df:74:f1:43:2e:38: + 3c:76:ed:b1:b8:4d:88:8e:ae:e5:52:a9:9e:29:fa: + da:a6:aa:28:e2:0e:cf:c9:c7:4d:fd:cb:14:a3:aa: + d2:87:bf:e2:9f:09:86:e6:0e:77:14:c8:d8:96:b2: + 51:65:d6:bf:23:9b:da:ed:70:47:c5:7a:3e:1e:be: + 75:8b:8d + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + X509v3 Key Usage: + Digital Signature, Non Repudiation, Key Encipherment + X509v3 Subject Key Identifier: + C0:C4:1E:26:C8:53:2E:80:A5:50:44:F1:79:38:05:B4:12:CA:AA:7F + Signature Algorithm: sha1WithRSAEncryption + b1:f4:93:82:51:8f:d2:a0:c0:a7:9a:da:d3:f6:fc:01:aa:ae: + e9:a1:05:32:62:9b:63:a2:a3:05:ea:9e:f8:b3:af:d2:50:42: + 70:6f:35:88:86:f2:f5:bb:6f:44:a7:9b:51:14:c8:e1:9e:13: + c4:e6:ab:5a:bb:40:50:c2:ae:d5:b5:64:48:ab:29:30:d6:90: + f6:6f:24:b2:e9:aa:8d:12:54:68:5f:70:bc:99:5c:cf:c5:7d: + ae:e7:d2:7c:50:c0:7f:a6:a8:ae:0f:3b:9d:1a:e4:18:b3:f8: + 90:2c:a4:cf:83:41:c8:54:82:20:df:bc:4e:6a:6e:e6:61:dd: + d1:fa:95:2e:4b:22:28:84:db:d8:47:fb:a6:d7:65:07:41:64: + 1f:16:db:39:ea:75:23:63:d5:59:df:03:cf:4f:28:2a:73:07: + da:0c:f2:3f:3a:cb:40:3b:73:92:2e:93:79:90:a0:4c:ed:bc: + aa:7a:c4:40:54:5f:39:cf:e2:81:59:98:73:ce:5e:71:2a:3a: + 1f:60:94:fd:c3:c4:7f:24:05:31:66:d2:5f:ba:62:db:5c:ec: + 40:38:79:ee:5a:6d:90:8d:f7:99:49:cc:e0:1e:8e:47:0e:50: + c4:19:c2:43:bc:87:33:c0:fd:8a:cf:af:71:35:0b:fb:14:7a: + c4:5b:01:09:86:5e:8a:ab:b9:8b:81:50:bc:a3:d9:59:53:30: + 2c:97:32:97:da:16:3b:42:78:84:31:13:9a:ad:a9:a4:9d:5c: + 5d:69:6a:eb:53:71:e8:95:11:04:d7:ef:50:c0:c2:32:55:75: + a9:db:0d:4a:5c:b4:10:91:60:88:ec:25:8c:26:52:a9:be:5b: + 71:5e:ba:e0:df:ad:ac:e0:cd:01:7b:8f:ff:c5:c6:f0:9e:e6: + e2:f6:44:31:07:3c:99:d5:8f:43:1d:c4:5e:57:58:0e:72:4b: + 76:5d:4e:14:f5:03:08:c4:d4:05:71:2b:da:71:8f:c8:ec:b2: + 1f:cd:c3:52:6e:6d:53:db:9a:40:37:77:53:71:02:1f:a5:12: + e6:32:1d:bc:0e:83:b5:03:e4:85:ba:54:b2:3c:2e:c0:70:77: + a5:86:21:fc:6e:f7:46:24:84:75:9a:0f:f5:af:fa:12:26:b9: + 65:e5:8c:89:7e:42:d3:5a:22:22:dc:96:ed:92:17:65:e4:12: + 21:9c:ae:8d:03:c3:3b:d6:bf:68:b8:ba:08:51:44:8a:77:07: + 9d:be:de:a1:0e:93:cf:17:29:e3:67:ff:9c:e5:ea:5a:0d:b0: + bc:8d:5f:f3:44:d1:f8:12:b3:53:82:09:30:13:e4:12:99:3c: + d0:73:09:85:64:95:9e:bb +-----BEGIN CERTIFICATE----- +MIIFATCCAumgAwIBAgIBAzANBgkqhkiG9w0BAQUFADAqMRswGQYDVQQDDBJoeDUw +OSBUZXN0IFJvb3QgQ0ExCzAJBgNVBAYTAlNFMB4XDTE5MDUyMzE1MDUxMloXDTM4 +MDExNjE1MDUxMlowIzELMAkGA1UEBhMCU0UxFDASBgNVBAMMC1Jldm9rZSBjZXJ0 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv9CvNtB2ZeshDERIZm5D +yNQHc08vNrcb7Gqqe2Dyh5qUvLqR+BzIGgHk+9GsP6YHJiq3j3n4MepP450thEMP +7tQdXeP2FjFcv/nOPrhK43crvEHuhFIqwHqqhqUhnMWgKubYRjPFhxR2pXEtrnrm +YAw8NcuvgGy/z+sl8w++W1NZy7KbyReGLQinYB5C1YDqdLPQfDxCM1jCvzVb5nqK +nPx//MnMP35S1owzGisD3qT7BIYTqbYP0qQSHYimTaqFwv8ZEb8E4FccLgOXuIOb +DXWV1xX0MVwudjkl8/qxmsreyDnPA3LYIwoAOulm74rysPxWBD245tz0oK5zG67k +A0J58O4UURiPu9V/y1ohbbmduTyeFSQjLb/Fo2ZF9jPcBnvhaPd1LVid4XMGeaDe +aOJwX1r8Bacm1nZX+BJ7SAeTZajRBJSgQp6ojv86x6pUbcGZLSrCM2VJguffvRgQ +42nf1tcWS3KzPPuBcpfNKDUTuS4JVU1A6+AuJPXyDATkOJDbH355QpeddHqHwxja +7J6MACU2h4gFSXfCdvxodlmwH9fVgdlH+elixvUIBtAhUOvHttSe3JRo0A/fdPFD +Ljg8du2xuE2Ijq7lUqmeKfrapqoo4g7PycdN/csUo6rSh7/inwmG5g53FMjYlrJR +Zda/I5va7XBHxXo+Hr51i40CAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMC +BeAwHQYDVR0OBBYEFMDEHibIUy6ApVBE8Xk4BbQSyqp/MA0GCSqGSIb3DQEBBQUA +A4ICAQCx9JOCUY/SoMCnmtrT9vwBqq7poQUyYptjoqMF6p74s6/SUEJwbzWIhvL1 +u29Ep5tRFMjhnhPE5qtau0BQwq7VtWRIqykw1pD2bySy6aqNElRoX3C8mVzPxX2u +59J8UMB/pqiuDzudGuQYs/iQLKTPg0HIVIIg37xOam7mYd3R+pUuSyIohNvYR/um +12UHQWQfFts56nUjY9VZ3wPPTygqcwfaDPI/OstAO3OSLpN5kKBM7byqesRAVF85 +z+KBWZhzzl5xKjofYJT9w8R/JAUxZtJfumLbXOxAOHnuWm2QjfeZSczgHo5HDlDE +GcJDvIczwP2Kz69xNQv7FHrEWwEJhl6Kq7mLgVC8o9lZUzAslzKX2hY7QniEMROa +ramknVxdaWrrU3HolREE1+9QwMIyVXWp2w1KXLQQkWCI7CWMJlKpvltxXrrg362s +4M0Be4//xcbwnubi9kQxBzyZ1Y9DHcReV1gOckt2XU4U9QMIxNQFcSvacY/I7LIf +zcNSbm1T25pAN3dTcQIfpRLmMh28DoO1A+SFulSyPC7AcHelhiH8bvdGJIR1mg/1 +r/oSJrll5YyJfkLTWiIi3Jbtkhdl5BIhnK6NA8M71r9ouLoIUUSKdwedvt6hDpPP +FynjZ/+c5epaDbC8jV/zRNH4ErNTggkwE+QSmTzQcwmFZJWeuw== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/revoke.key b/crypto/heimdal/lib/hx509/data/revoke.key new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/revoke.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +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 +waMpuNHGyfEypx5NFeO8UU95fKkcTWM= +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r1TestCA.cert.pem b/crypto/heimdal/lib/hx509/data/secp256r1TestCA.cert.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r1TestCA.cert.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBuTCCAWCgAwIBAgIBATAKBggqhkjOPQQDAjA2MQswCQYDVQQGEwJTRTEQMA4G +A1UECgwHSGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMCAXDTE5MDMyMjIy +MjUyNVoYDzI1MTgxMTIxMjIyNTI1WjA2MQswCQYDVQQGEwJTRTEQMA4GA1UECgwH +SGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMFkwEwYHKoZIzj0CAQYIKoZI +zj0DAQcDQgAE5SuFK+KhglopQr1aMjl4ZEBaw4HYM2yVORyBOQWx3e8Pj90bFocE +4gyS4P2V0YraxACsQgMp+s4e8/6gXPeMtqNdMFswHQYDVR0OBBYEFOtR3wCoaF9m +8dWylzOdd5vfbwmDMB8GA1UdIwQYMBaAFOtR3wCoaF9m8dWylzOdd5vfbwmDMAwG +A1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMAoGCCqGSM49BAMCA0cAMEQCIF/JTbEv +iuYcuREFzWgZ/AgfLe2sRwEgSy6UcAWOYllkAiApMzA3xKjaX1/hhkDGKZnHfcTM +tRuM0FuTdO+e15ku8w== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r1TestCA.key.pem b/crypto/heimdal/lib/hx509/data/secp256r1TestCA.key.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r1TestCA.key.pem @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgL2N0gdHhAjBGcJ40 +gHePPMwGKygIVDXTfjysn9zPiSOhRANCAATlK4Ur4qGCWilCvVoyOXhkQFrDgdgz +bJU5HIE5BbHd7w+P3RsWhwTiDJLg/ZXRitrEAKxCAyn6zh7z/qBc94y2 +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r1TestCA.pem b/crypto/heimdal/lib/hx509/data/secp256r1TestCA.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r1TestCA.pem @@ -0,0 +1,17 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgL2N0gdHhAjBGcJ40 +gHePPMwGKygIVDXTfjysn9zPiSOhRANCAATlK4Ur4qGCWilCvVoyOXhkQFrDgdgz +bJU5HIE5BbHd7w+P3RsWhwTiDJLg/ZXRitrEAKxCAyn6zh7z/qBc94y2 +-----END PRIVATE KEY----- +-----BEGIN CERTIFICATE----- +MIIBuTCCAWCgAwIBAgIBATAKBggqhkjOPQQDAjA2MQswCQYDVQQGEwJTRTEQMA4G +A1UECgwHSGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMCAXDTE5MDMyMjIy +MjUyNVoYDzI1MTgxMTIxMjIyNTI1WjA2MQswCQYDVQQGEwJTRTEQMA4GA1UECgwH +SGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMFkwEwYHKoZIzj0CAQYIKoZI +zj0DAQcDQgAE5SuFK+KhglopQr1aMjl4ZEBaw4HYM2yVORyBOQWx3e8Pj90bFocE +4gyS4P2V0YraxACsQgMp+s4e8/6gXPeMtqNdMFswHQYDVR0OBBYEFOtR3wCoaF9m +8dWylzOdd5vfbwmDMB8GA1UdIwQYMBaAFOtR3wCoaF9m8dWylzOdd5vfbwmDMAwG +A1UdEwQFMAMBAf8wCwYDVR0PBAQDAgEGMAoGCCqGSM49BAMCA0cAMEQCIF/JTbEv +iuYcuREFzWgZ/AgfLe2sRwEgSy6UcAWOYllkAiApMzA3xKjaX1/hhkDGKZnHfcTM +tRuM0FuTdO+e15ku8w== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r2TestClient.cert.pem b/crypto/heimdal/lib/hx509/data/secp256r2TestClient.cert.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r2TestClient.cert.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBsDCCAVegAwIBAgIBAjAKBggqhkjOPQQDAjA2MQswCQYDVQQGEwJTRTEQMA4G +A1UECgwHSGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMCAXDTE5MDMyMjIy +MjUyNVoYDzI1MTgxMTIxMjIyNTI1WjAwMQswCQYDVQQGEwJTRTEQMA4GA1UECgwH +SGVpbWRhbDEPMA0GA1UEAwwGQ2xpZW50MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD +QgAE7v8wIgEd/yBAtDmW2nW7II4IDDy7KVlnv6/+sHegoe4AjIvqr9CNldkfcVHl +VwjMA1q83lIB/H0IUmk+T6lQhKNaMFgwHQYDVR0OBBYEFKNeDhfd+znE5CBO6aNl +DAUjXdF6MB8GA1UdIwQYMBaAFOtR3wCoaF9m8dWylzOdd5vfbwmDMAkGA1UdEwQC +MAAwCwYDVR0PBAQDAgSwMAoGCCqGSM49BAMCA0cAMEQCIBVFIAeFxXeB4LURDxv/ +YnGzJJK0b+pjK5hVEPYww8dzAiAmHrccM21Ga7S+/yFWIvMe3BKtAl0O62TTI2Fg +CHiIWQ== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r2TestClient.key.pem b/crypto/heimdal/lib/hx509/data/secp256r2TestClient.key.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r2TestClient.key.pem @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6oD5CbNzN7oAWqcq +dKJKw2WU5EwnUV05+7S9gXgeW/qhRANCAATu/zAiAR3/IEC0OZbadbsgjggMPLsp +WWe/r/6wd6Ch7gCMi+qv0I2V2R9xUeVXCMwDWrzeUgH8fQhSaT5PqVCE +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r2TestClient.pem b/crypto/heimdal/lib/hx509/data/secp256r2TestClient.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r2TestClient.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIIBsDCCAVegAwIBAgIBAjAKBggqhkjOPQQDAjA2MQswCQYDVQQGEwJTRTEQMA4G +A1UECgwHSGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMCAXDTE5MDMyMjIy +MjUyNVoYDzI1MTgxMTIxMjIyNTI1WjAwMQswCQYDVQQGEwJTRTEQMA4GA1UECgwH +SGVpbWRhbDEPMA0GA1UEAwwGQ2xpZW50MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD +QgAE7v8wIgEd/yBAtDmW2nW7II4IDDy7KVlnv6/+sHegoe4AjIvqr9CNldkfcVHl +VwjMA1q83lIB/H0IUmk+T6lQhKNaMFgwHQYDVR0OBBYEFKNeDhfd+znE5CBO6aNl +DAUjXdF6MB8GA1UdIwQYMBaAFOtR3wCoaF9m8dWylzOdd5vfbwmDMAkGA1UdEwQC +MAAwCwYDVR0PBAQDAgSwMAoGCCqGSM49BAMCA0cAMEQCIBVFIAeFxXeB4LURDxv/ +YnGzJJK0b+pjK5hVEPYww8dzAiAmHrccM21Ga7S+/yFWIvMe3BKtAl0O62TTI2Fg +CHiIWQ== +-----END CERTIFICATE----- +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg6oD5CbNzN7oAWqcq +dKJKw2WU5EwnUV05+7S9gXgeW/qhRANCAATu/zAiAR3/IEC0OZbadbsgjggMPLsp +WWe/r/6wd6Ch7gCMi+qv0I2V2R9xUeVXCMwDWrzeUgH8fQhSaT5PqVCE +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r2TestServer.cert.pem b/crypto/heimdal/lib/hx509/data/secp256r2TestServer.cert.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r2TestServer.cert.pem @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBsDCCAVegAwIBAgIBAjAKBggqhkjOPQQDAjA2MQswCQYDVQQGEwJTRTEQMA4G +A1UECgwHSGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMCAXDTE5MDMyMjIy +MjUyNVoYDzI1MTgxMTIxMjIyNTI1WjAwMQswCQYDVQQGEwJTRTEQMA4GA1UECgwH +SGVpbWRhbDEPMA0GA1UEAwwGU2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD +QgAEi1mCfULxkG8qSQ2gSh9YvQksJNodPaUmPt32NG1IqJHY+U613keG14Oo/vwr +h6CVEyTmeqyYSihqV9s2wUHLxKNaMFgwHQYDVR0OBBYEFOowNM57NxGxrHqV/oT9 +eT5DM+iuMB8GA1UdIwQYMBaAFOtR3wCoaF9m8dWylzOdd5vfbwmDMAkGA1UdEwQC +MAAwCwYDVR0PBAQDAgSwMAoGCCqGSM49BAMCA0cAMEQCIB2nDbiSg6jTeoSWfCvG +23Pn4xxbes8Nb+/8+1lDjLWPAiA+KB8wJhUA4hO/Axfu85wKjddpbGtJR0JlxtEe +whF52Q== +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r2TestServer.key.pem b/crypto/heimdal/lib/hx509/data/secp256r2TestServer.key.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r2TestServer.key.pem @@ -0,0 +1,5 @@ +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgKo/47DaveCl90GxH +LCE7IGBua2XsE+jI4RUWZrqjhBGhRANCAASLWYJ9QvGQbypJDaBKH1i9CSwk2h09 +pSY+3fY0bUiokdj5TrXeR4bXg6j+/CuHoJUTJOZ6rJhKKGpX2zbBQcvE +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/secp256r2TestServer.pem b/crypto/heimdal/lib/hx509/data/secp256r2TestServer.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/secp256r2TestServer.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIIBsDCCAVegAwIBAgIBAjAKBggqhkjOPQQDAjA2MQswCQYDVQQGEwJTRTEQMA4G +A1UECgwHSGVpbWRhbDEVMBMGA1UEAwwMQ0Egc2VjcDI1NnIxMCAXDTE5MDMyMjIy +MjUyNVoYDzI1MTgxMTIxMjIyNTI1WjAwMQswCQYDVQQGEwJTRTEQMA4GA1UECgwH +SGVpbWRhbDEPMA0GA1UEAwwGU2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD +QgAEi1mCfULxkG8qSQ2gSh9YvQksJNodPaUmPt32NG1IqJHY+U613keG14Oo/vwr +h6CVEyTmeqyYSihqV9s2wUHLxKNaMFgwHQYDVR0OBBYEFOowNM57NxGxrHqV/oT9 +eT5DM+iuMB8GA1UdIwQYMBaAFOtR3wCoaF9m8dWylzOdd5vfbwmDMAkGA1UdEwQC +MAAwCwYDVR0PBAQDAgSwMAoGCCqGSM49BAMCA0cAMEQCIB2nDbiSg6jTeoSWfCvG +23Pn4xxbes8Nb+/8+1lDjLWPAiA+KB8wJhUA4hO/Axfu85wKjddpbGtJR0JlxtEe +whF52Q== +-----END CERTIFICATE----- +-----BEGIN PRIVATE KEY----- +MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgKo/47DaveCl90GxH +LCE7IGBua2XsE+jI4RUWZrqjhBGhRANCAASLWYJ9QvGQbypJDaBKH1i9CSwk2h09 +pSY+3fY0bUiokdj5TrXeR4bXg6j+/CuHoJUTJOZ6rJhKKGpX2zbBQcvE +-----END PRIVATE KEY----- diff --git a/crypto/heimdal/lib/hx509/data/sf-class2-root.pem b/crypto/heimdal/lib/hx509/data/sf-class2-root.pem new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/data/sf-class2-root.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- diff --git a/crypto/heimdal/lib/hx509/data/static-file b/crypto/heimdal/lib/hx509/data/static-file new file mode 100644 index 0000000000000000000000000000000000000000..2216857ccca56bf014260d0ffe48d6fe815e2ae3 GIT binary patch literal 2865 zc$~FWO>g5i5IxtwVwx>B31H`|=p{vfm1QO-)|OmRO4dLR%Sg0MSQcH8O4dMrch8-n zY{Z-GVp||F445Wo-n@D9M5POD0lyNglTPO_)1`vKREG}og{vZ1ze0r~|Q@iNA>%4=|tT(luFB}}@$8d3W_8WX`s(GpB5>mCSv|UOV z{yn!#Q_2bxjuNwxCGg5R?HZ@R%rG!tRHiiZO&5eS`Ep^(6)qoDp{nB(z_g$&!Pl`+ zE34`URnR`3B&yKX)%w11+EgH`f=Cl*YnnP&eg_%LdIK|4uWT0{wOfFx{jX^p;jc`g zXF8XJ(FIv6SgU%aox}FmwRzA5F5E&ouf)uhrFqoVoa8DrC0RnDyp?j7Ewl5J7vwB8 zyJeM|0%IHNupcM43d?)*Ku0@G5d=S#!EvcBM&Lk7#3Pu!!qni`tgvWaO1)C`R-}t> zsbI-HRd!Uc*P_YQ8?o6rsYNPG-mK7TayPhBoQc8n8dlP&TFcTti|>a<$@^_=+xztd zBBgyMMO1R-eMReMqgCel)K5aAnaJ)Q%+z*EYb7^uuUh9j1F9xk1bqG+2uwLV^hfl}L{ng&CJ7S);sp43GUAAY z&`A)boQW>Ng`;f1qnj=u3Pf=VBR=LShNW@WS45z1Gawj;UkMu>@Pvgab@aRnQ90x{!mDJ$LQV_ziD5HAGVN|*1^XkzAUq_rK`;((u)U)n z2!mq@vxJR_GD;z`{*LTT91jFRA-rJ8Ef1Oa9Y(S6nq`7@u}B*D@`!?h;W4iJnc!YJ z9;GZvvPsJ0=$L?p@f~V|WCP3|c$wqK_lz>d$&_$O4?l%2+zlD-C#0%ZEg&rfsu!k& zwik(2QO|U*S%}!ph~Ka%^s2`MbjJld#-VXR0lckz7fgMRnQx!Qh1}ZZo`Ji5sKBow z7~FCqzYRt!2)?xqZXuG$!r@l^_EG3`Y@HXnzB>5OEh;#r+N((*#O2JGds)-&ErcQsaWslYb)Amasv_3+W2nFg=6qgk!-N+>sUjU4Zl|Ep0L_ucZn-hSfM{+}Mv zfLGy&m-CkAn-T3%jUSSI|NaHpe4+9sy=owrkgM9g7D0r2W$E5*#NVN5oBJLq^6$d^ qHzz)!`ycS72}`wkZC7Gy3*JNUx77M|n%ElR|FPbeoqo?coqqtfhKXGO literal 0 Hc$@zP|7>)eDSQ;8eEb%`r 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 literal 0 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 VFjfXAC|nD2F7=AA0u4~|90}KEzMcR8 literal 0 Hc$@%5#eCDgQq*s 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 BpXC4m literal 0 Hc$@5QIdcDVZE%u`4ClHlh9#{6w{QS2;JrQL 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 EfV#!1SO5S3 literal 0 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 Ja|W{7N=;gn!2kdN literal 0 Hc$@jV05O6BOE7{0M*;x=FfTAFF&i)$ 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 KBgU{sOqFNhV8%cI literal 0 Hc$@8U+>l!y4!3 z+PWV!^%2aPcxWU|IcSF#rSM5(r0QX8-Iuvcx~rYSJZSi*m{rFG#0iG)?fFkwu8iNm zy5F1ZrD0!VB_vP)qv)HirhcK$lMHLB;?IHA@JJ^{Fkr)5USc^5SdCg$=O2r;lklK5 z0igN#J%|$>8A8C!KWkHPjfJXqT5a-??I{o{-jOy4UOu8qwH|!DFVebwrjF9*1;BwT z&1A7`Q;yK2avp$P=L@`2u&e_o&70j*t$pHHm-5P=lo{q$Yh2F`52@a*Bk5=pH z3*<4Bt{$V0S@vOsKTul+$tJ}i$bKuSB18&5c($US*T|#B-7b*j&Hn)XcO6LVURM@d z#^+F|fjnDXe;h~kp>(opBM;^X)lk#ZGwy~hI1K;=#F}yZ@{;Kj@{-Q=OlNU1kqqy! zII!QxDjhTPUsO2nju3`M3={WCasz56z6#eh+z{%B!81e!X8_!uFkNh_Jt?%$8D(Q( zI>Z#tvi4+E-=9xFKd`3_$BF>5)=9)Sn#5VrUx#BhjbgCw1Zmx{b!4hzgTSSFa{h&6 zFoFwW1_>&LNQUd z!larIw^nj<*^1Md;|8!`sX-h6p|+W3NK`L&;tJ_~aZ7f%As%KYNwW&MYd-JygbHf{ zhPXlFhF*b^-8Maf(7%2AX$o{?xk>v1@P9Cv3tjrrj{3ip+q#OKz#O9ehqz$}tUjE% zY`8iV){E@>t+zVtiTMmHL7x^kvtrSrvERYp7huTS?)%x-dQm*fzO@|%;cq!_N>}RC zlHLR5Vx_l9*rsxm7mz?I4ml)LoqN*rG-sR32p$S?!Dr$vpM~KnwOUv>0GYEnyJcn3 zr5gsvjjXfROy$>HGiQ5h<(vG|0f4%rGg*abbPZf+s7h69we_*{3M&GL)i|emtBb8J zU9A{)RJ)OoVKlc9wl_SfX}q{7kbLPT(3k2NBK$+{NLG?kp-Xyg0Z}vwup5Pq-wLqd zT%?hmk?DaBu`L4t%+{pNC)NkaZE}_4R~1^v6ktQH3t69Tsnnh zj0@Of9fouqV31CBy0Ei*#FwShNpHua^QlJ%e^_W4xG&u=$}uQHiu^&Ee4zGnf>5jP zMirpw{SEs-ghn~AqwbZp-R)wLd+$Ts zOOZBkT}tt~>9v~=59t^){7flPIK`k=o!q0y)`BPgUWLcQNiw%o#RLX`Tsf=AeCmrX zdy*T5hzanRwl4qNQB^0d(_CaexP${O&M65NO7<4BDq+Wa_h|Qy-5L`gxAYFum3iU4 zJ^A7qw|j@*LbfY1vKNeDH9g4q#17z&LD0C+6%%AnIFosB)%V613)wDHq)?mJIKwT= zHdR>^I`4xlE{{W(qc!=b=HNmV%qPoABZu#*=1zA}AF*^b!T369zU-?e_sX%2fgqR} zo~A4i__{2nJtj>#JGz>B`T!#8W}`iR#XD&{qGk~Te__S_8<$k`B84Q4-%?o0y_B zMnL4e=4JMOlXIM(1w_zgGH49joYP&z-SOG)_z3>+=ppJ_bOe4Yz}LG7Qp#R@_f^Z5 z8`IZpd^gjt6#B3gBbcWecX#3Ye+4ex{G2!WJHz!wN<)LUg2xeeQd&;@SEQE1qHMax z={BRQtIP9}w_UNi^R-o)?v_c-#}TBrgp6iC;U_Kw>3fERAX!Y&e$HCX!*%&lKZn|4 zX^|-8&V=@GeSl-AT2zdSWoeGss5eBtD6o+I$(M-`+$9JL&5G|jG#Tu6m$@2~2N&9W(0zLQpT7HS_iOB-Dx`JGlb$}2#EiYp z%|xF`3ku%R_4hk3kSMpkso!1xS@2tVFvS>t;v}!-@X0_6l7r7P(%)d=?rvFPkB+U3 zc4zDrb1@vqf@2!Pk~46O>AZ1F{Hcg1AvfD7VliqW4(K}_4!(~K+t{xUv|T(>3O9}! zMu6l3_l-HO2eSox@)}3MML+L>J&w7x3iFfPeA_mkM*_Q8J(7@uNV~fOrzUmDQr)l6 zh*f{i1(j=Y{k_zWMxDRaGXo~eosoU|1tm1Joa>G4@jea^SS^8AWBg3#T!BTPqtjdB zeffgkxlim+{N)r_rQjuAjm(tZR%Pt%mq~4{je(Nh;aeiZ&dp;r_jmcW7E@wK?kj@k zcuHf@BAOE>fC16ZC|+~Pt@Bl(yqig3NhBfBuJGHjT}M_^%Jk3h8kDv6&Z=&%%niYf zG2)cRA5bF;ub{gU^0Vx0PaB{0qM!{&7sJ1X?R*IoL$cz2GpTV_NXmqg{!5&CSujE( zCYp3?8xNzD1iH&K8xK~-ZoJ$+4!X5-xib(E-pwr>h9Rvh!LNbvN_`BXHD7!x=s}IO zx_r@PTGUTw<8D1rU#S?iwuuBCOQaYSs19Xo`=moaVQcSUVx9)Z9sUFt&@9g{=^OdA z4nrYB3Z;;&Lh5qk_i#ys`IOa{L{OWNu&e<)fM6qWcsdn+*P%HHKTg5_0^=So>S+Nq zMG0dvVx&8dL{NCb9Q(}*McFVispe$30 zoVgakITAL1JLjxiV=F8an1S7V{Z>c;dBgNKJr}t9{^)a{_Jn3bx5e48ssNEd2y;157~szlZ$-q`%q9Vvj#o^is3MxuET- zb-!pgeC}2uA_eL|WqD$r21&iU&zt$ZSX1`&H&w(AyRH?#4Pz#r3~oOR(?*b^2Z`+V z=7$}KZvm)m0<2h6eKO@#Pw1q;6Bf> z{Ou+qr8F{d?g-Cro7OsMtD3?73{M}qDV>VH-3iGBcCedWoToGIjQ{3h1e5VHJo`Iz zZSB=!IS)c!iuSOO4O$krfvJWXr$T*8_uNbMZVgDT*%8m zyd1&{HK_1uG&l~~8AEkV{6gNS|KQ0je7s@Y4^>#CjXK$srYpOq!;mO#guQrPN9d>Gor!^ zpaSN(JQx$ubU6NVh+jupUSb!8BttmsxO}=xNxHr+0eIY>O9{1u7K@7+D~Eku$W*4K zy_HD*m$gmncpuEXp(cPzaj-bNI((x@X88IpM2Gm0)HG@0Ph1z!=C*URgIQz5=u;Or zKKGb^kQ{=zgB~xJTgZ@rFE10*5JHzCMGaMumQVu-h;$G_??syQ9w~|<0Rkup0)kPHCI~3KNDqie zheH#j1W<}}q)1WVM$eh=dd}RLJKx;7|9vxW+iUH;-aTu6``K$Fu*~;BKrjN!tWFNS zgww?B(*P-eSy*NnGAy$M$t;Gz!Yu#hg6WW9VHzZ}3IYqkk;DFSQBwiISy%`M$;e7h z^_LOKLK*;}Aj3jPzaTqBU_nb+U=R>Qx)3z~iVB240EkOS4g?!H*n|vB&FC5|g^-0C zI|pFkhCV(RxQa3ohJgNblAi$?sUgm@(ja9KQsNRwDTEYK+>(_>0);>#rT=Ooxc=51 z$%vr;Gcfd5NJnRX3~46Zzs~>&0f4a}IsnN|1;T=WfWof+gEv9=%l^i315}O~+cPv2 zKHSEvey4%?gU==QAWE;ro6Q$OUk(dSE1(>l;;}22Ow5pW-~y%&$^*d0&RR88UNM?ZCrH-7)lt+M(1 z{G$-t_WHvaFp=q#E4%x$K?IO)5lYvU9b9!&?d+CHD1%JJqdt9azpHL7(i3xyyhlw5 z?fu;&rIlaD;H|H9kyqRMygikvAI4KA2$uzd&W_R0opie>)tqohzwDN10!rUa`}Wx+ zT_^8I)BGhxcc-85GUTq@744!ol4s`1ELY9-Y4OM=pXKjOItLJ6TcEP^Kwp^m;39E} zrx2%Q&;O&)JXcMoLgQ$o4>Ol7(5r8^Tz29DyE}zmKCxLbc^du48L#JcU;8L4Cpv}{ zr;die=KG5(V5=^gjSu`~N2}7dxqp=O0IsDqJavRx(0jBWE@>+TuI4xaC5C{mt9sEDJz?Ynlk}q&o0=5z(4>nR~8}jOGxL=kbw{Y1nlQ09T^!I z1eryg``Mr+V9N%WHNnSz({+|AFC)rlOBy zyk0=A*;Oq|G#0j!|1rv(V9W_Jl^a3F+_LTDl5h&dxJuu8!I^JW`*rgPJvMS=MnqD_ zi`l^hSrMEpAp@VxLPSjt075G(a|)4T&`Vf2jh>j3i0tj<#NYh|5k6 zV?*n}h_waiaTcK$f&A}IOi14I+<+SZe}Egn8Q=|Y0(b&KNN;<97pW}*a3nqb0VJG3 zs{cvic#<*pA0!STk@zOb?uWpFE&e1i6o7X=lx$0E_5WS6u>TX0k$)#L((>Pm^}nIH ziApSMub5`#DNr?yT5*kM<@d&k)&&KQd|-jyP&JQd-~XR*Ve0aq5k*nrpw6c);Flo!;gXzyM7c zexcjK_uQ~>bmTT`doS1CxXFh238Hb?r=+;h>uru|O8~a|{^s*%B20m`N?H%wZVSF< z)=GTj)d#N|$J%YaaDv4&3w`5Q7O(8PPJY9T7vgDrH2Hm|q7|~KUR<~yu(W&&oiR+| zMhQN3jhB_0tYz6AI@v2>eJX43WpCPB{v~{<;T$1{_l8~1(zDkB$jW;Sm)i>IVrQ2_ zYWN>xSf=e@R`cT5Z3f+#Pa z+$b$s9*uk(ci|~lFs!2|$tF;mVU=OqFyJGmo&MO~o*C z(?A*2?4rN;ew>&rDoWhK;{Ib9HfK4w-N4uR+s{EZS=~XA)vy2)@0!rI+$%J>`qz4+ zQbKEtmD_CCSJ>+?(dYxt`|TTI7MHFa)w6#a9^-1%7uBjnNu;4U(Ub7bQd2FIKD5Ts zs3{VbaorOx&2Lf;K1&Sj9{(7Tm*uH@8*;wSU zLNX{Q*HQB(VJJ9-M?pbc~!r{XyVnY;c`32eqGRQVU4UyImD#a zqEItF2S145CbK|_PNH~BfuKBe5kj2#?v_Ub2*{M;$zkO+x52RqbLDeUm&85Npi`)f zIXp!veGpee4^P7qB^)EdO%Ei$&&FkVym6k31k|EkokyJ(5?xC^>7k+;E(SG%J{|Xm z#899%GK*bozag0sXMV>z`FS!DyzLQKXy4zeYiKhW7Ftg-*O2at-PcD`iqbxB>&|J9y^XxIC>IAjMD>0z_St7Be#3*zM&8a@^&Ng$H{E=bH#%8Ugc8$iy z*E&Vb;Ms|N-1}oMvzwQ1e0D4{xj1YqytDPT6QpEF6q_tRn~$667g@MndD^20;8h!c z7?j$>x~pyeDf#sJk8)JoO-$R|z`!Mg#CmLeFWoM-$f@^K$}S`A_O225E5!N@!>q^^ zgA4Zy6Yhm+l@$;v7DqL8(A^%>LV7lsMeEPAVov*x1MOC)uFFZcc_$cXd0z!2s?kTm zj1uVU?d1mc)n)VqSX|Pfd=rh>e45CjPnqDTYGL=7gZF)rg>Lzw;UOn#l5^d=-ziqC zqJCsC>J4oMWR5lLW5lHE?ix3_Us!uhdp-fMW{6RZFW9> zfDkS~TsF|dXf$A0&UHwYM6&rXseu1r0+OwXUBNLbKAJxq;ANY#i^xyETOd6`2-SW& zPS|@G#679eEfzlwH~+gXn$7MNU$ry;W3d97;%Z zdRF)7_G8EDY_A0ExM6Ms5Ecjoe6%R+VBikp(p4^wyE!y*XPloS{K?~Ox(B@H92q{c zi_<<$)~Yn$%MZ@&b~hsPwIyf(tYcd&>{A~KJKLp&G6#+D9&F4ncF3R03;M=*4rHkl zUKb=!@tv!^nXU}AGn=tI*w&$KdS7O5ZINA3Ncy{5wcylUV^Mmrp;g;K=*=GE)S`KS zzRPQB4Gs*tO7BAQyB8T^)E03xdbtzEni_dk4GJ7Xc3myW%5<)Ex@L3DZ>U~I;P4g_ zVfAg}R(iJ4vHUp9Q_ZoaDOJj33h^Rcd!X=j76!lAY3r++W!hNh;etHR@#od$K)6Q9ly(w9%y<`mPuUP#`LdSQY`V?SNrzP6PoaXSsLkCa}PG#jH^OM#jOI4K8 z7W?wd0xI0I(Z3N;8d}j{>X#bnXc*@^V`x3NB$wjQYww<9ilAlokVG}baConnu>=>v zdE^%_Z)H2q5iIxvmCtfuyirchh$VWw_J~abJlug<*W$#W35(<|Gdn=(Pf|9{_JnD= zyQ_V%S`WT<=dlb+oH6z$$d`?NtJ&Mp+y>})@u>6C(jy4(js)gwNbA^-k^iktcZc!vfS{0*;|3t=g) zRtp*CoGpa8bn^RqBeuKIdAeqCq90%aj{c9#S3%}YCH5a&7z&@i#%Y{o-YtP3|;PvoT<bU0=0VTK^DfPVJZ2rYmY_BZXFcR&@WH2ks(sCf6L{ z^{xp1arRjk-s|SM5fAB!5?QJyb1QL2uf<%h4j#QK zyS|m~sPO4o$pI#2uUHAW8s+_uD! zl_yvkI|`ll6!Chs3BD*&5&#MjnfW_AFTJ~06K8o^GG5b4wKC(iE#vDuFNts!hBL#7 znylMvxE*uRS9U-4QZ1t)drjJ#*5KM6)c(lKm!e&tSy2d!=iZIp8b*7^%i z;UnMbmrUi$${8o=pL6BP)Gq TO-9L+)Uno6kNXM&Q3C!8ZTpbV literal 0 Hc$@ryRlg<2JG!>uX`YO6(2P|=DNms;z>VqI#hVv%!^W*se5tWf;)@yY%@K*O{vp$l)(sx(?|_z3J3-; zO=vIxdmRfflNQpPNotsR7?G12y@fXGQ?0a~G6BM*VMsHaEtJ))ChaqjF=5UEX_VP$ z;e%;DMmqyPdSr`;1&q&fE+n5Q0Un6H>nr&yLrZjM^)k4F5Xrf(VB9+QyLN7IiAn;?N z;C7LGxB_m70pc+*oeDDzzRC&~RT~Jsku9UL#&^TnO9~3dYUANYJENPZ%s6;@dZkN$%W6dwZe5KuYTEnam0kVYK^-8Fv`X zM0G^%JE4bWV(e}Qqs*3eT1FxZq>^pUrzt?1G%!Xoet}$!6hvwh31({`N$5n71_Nz^ zSg1658e@Yttd|b6WRPmcUochA7|+Z&%hcvEi>0FxMI43$To$WH63S5k#|d&-A|^(~ zAVvj)a7v0RFojZq0-;n4L^7#Dj>RYyGC2+=PZr`ZW#~|Qh`DE^Du5;@$Wa^zGC9EF z6C@Z!g3xlIRDq#5AHs3g_jFs&>_cj21XlPo!YbI<16Np`MCP%>pSpMuLq& zr6RlPG6pCK!_fe^X&BBdz}hM&303wUmG<_T?SkCehMf$|w{I%IVu4Vch%w~b7eg!H zSi5cD6hy+6qPTYT+inFO&tg_<^yVnv=(a($FOLVG6BO{J;h6>RBNGh|7hhg*h;BMf zQHHiD@E*@KC@6!lSfUbyI6g9sqEZPnGn+6@gbRj`9Mpyuq9JG^gn6O`X9$LaoE$(- zhfh4g%Nj-^odgyuypiDn1?$0EJB_l!qs>3ftcOQ}A&WUi0y>qSY9-;izbqdV)HyM# z^FU8E&1JndilVhEd*w}aSIcydiewkP8_BU&mBYf2!Cg_KFJ8_g;PM7Yw>0w9&e3yl)$tl>NNGNba zT$!Mg7aK>Bw|aLKL?B_qLj_?-m|*yX-d#iAK?H*E_Df{oE6WAlk#23ku69VqAdrb~ zX9nKixMiFVd`7bcUy1_vm_8XUbR6dunUurgQ5@OACZmHL(^(y&BT4rgiB?VdOuxJQ`AWvuX-tA4wwTsv-Kb6oOf z=gJdP`Sp%7M@Ek=-uJfGjgkqC$qDXxf-4f*|OI~Q*W?qrizes6NuAYC^%eel)!z!2Emn&*UU1_f2 zBtN+=;!Hf*_2-L2N}3zPCv7;p{gi`b)xp(jS5>$4_5Nr<1fwdt58DTe)j~ADXI3RA!(1Xk6 zupNIue3%P&ZZB?+^EXtW;96AoBwkc0&!lya-n@FjYxd?ap7P-9J_*(C%5@#mLh81U=Zd~@+cxOq{6zJDQolG2y_H|4eLCNG z_~Kk$abC5=4Y}x~%Awu)AN@Rm*wOkVa(uVV%f-~e#~)1yoYY^kaPrh0Er*Y^cyqhY z$*;b*=ZdEL?C?IH_YWPs;_8a=jRoHhblTg?@jvGQer<9}wBg~5g3o64EsKcdHElZG zn7#5lk?~dqQS&r8`+4der1CE{!_e_}^ z)!UO(()&iFP}5%)jFY&P3rHf*QkniY*WJ2?irbJ)(W&ilW1M00Iyhmajp*8kS} zDGmc^(VwL z>t1Z!caU>(P>+aG-j?5bZQ5Cz_xV<;bw>RB1C9E%ha$L#HnWCxNg48Z@R(b<4<}}> z{6275)2JJJohrZboJLGISS(Q;*ya|!yl?InuYyl+*A3YfRAEJYTCKHF=Tg@AugMI5 z?sW>^=+UsKAuk5OyUsF_Nq4I3`((IB_ zPnOU9wN8Vp4)*Wqb9SV6>r(ILZ3%_lk5Sqz?fYvFs>wa?`JEZ{*fjAJf2P%IMeC{T zh80gE!)Nq7;i|qcJJ{&}*ea-7@AF*N@5qmQ*2Bf=Q$96*Qu20(RVhdgu(q&c3yj9Ccme0bfvhchmn;r#x` zP1jAq8n+KKJzUu3q4C!Od#+K<&V2NINdMktQ}TAS#z`_Xx)*`5GZsyq*)o1{qwhXR zZ9&|2ONsp1xxK`LOGEQ(_Rc@gmT40Ac$J9;YPKx&lr~O%Qhh-1LB!0#=}9YUt`(1r QnUi~~@8u2G`q%gRFK(|QLjV8( literal 0 Hc$@V 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 CoT_aA literal 0 Hc$@w*%JK}JJ@nFK^DG9&|uBpFO5EXq@i8??1( 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 QnUi~~@8u2G`q%gRFK(|QLjV8( literal 0 Hc$@36 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 literal 0 Hc$@ZdkfRkOoPqrI!W)=@LolknZjVX%Kk* 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 literal 0 Hc$@ zF^94+3oDf~7%^lsSTGa;X+4HqhD3%EhH{2tAUlsC706~_Fpv}HH8e0VF|sf;G%++a zi2`yBk+`H9*Tkq~z{|#|)#lOmotKf3k(GhDiIE>9&c)Qk$jGqjx{=!TKbhfPp&Z)N z4@OV;`{L{Od9^0zUhcM7F#kX@4p2` ztqRRHxU6&Mo|*66&+(DF!f#meM_+zuVyU#MP$07E&3vh^D;=&?8^ueu9{9T~$0*`X z4ZD-sh46~xgh{gUbN8OP{#Yvfc0og@nI&UkloqS1aKjHzk9f8Vr*$G`J@3vH*V!~( zNAzTIZomKMk2?$OPsca3cHh6mI#uS0`MXO=o*ehTF}-;<%lwaG)eIro%KgXrxfFi9 zUwVvhN}TuGeohSh(0N^L9t|!EGG6_f_W_m3eaST7CC0Ls{39ORCNvR?bMBa{O-1l}9g(AI*AM z`hh>O?H%8D%WQ+>r*2ndnipzRmNj}<6z#EB4K`fGba6KGqL?X)oBQr-E%ixV^mC0x r)lb*WS8qMt88*-TD%-PD*YntJ=Pj@H7Iv@^Dw~next; - free(msg->msg); - free(msg); - msg = m2; - } -} - /** * Resets the error strings the hx509 context. * @@ -68,7 +57,7 @@ hx509_clear_error_string(hx509_context context) { if (context) { - free_error_string(context->error); + heim_release(context->error); context->error = NULL; } } @@ -91,31 +80,18 @@ hx509_set_error_stringv(hx509_context context, int flags, int code, const char *fmt, va_list ap) { - hx509_error msg; + heim_error_t msg; if (context == NULL) return; - msg = calloc(1, sizeof(*msg)); - if (msg == NULL) { - hx509_clear_error_string(context); - return; - } - - if (vasprintf(&msg->msg, fmt, ap) == -1) { - hx509_clear_error_string(context); - free(msg); - return; - } - msg->code = code; - - if (flags & HX509_ERROR_APPEND) { - msg->next = context->error; - context->error = msg; - } else { - free_error_string(context->error); - context->error = msg; + msg = heim_error_createv(code, fmt, ap); + if (msg) { + if (flags & HX509_ERROR_APPEND) + heim_error_append(msg, context->error); + heim_release(context->error); } + context->error = msg; } /** @@ -157,12 +133,12 @@ char * hx509_get_error_string(hx509_context context, int error_code) { - struct rk_strpool *p = NULL; - hx509_error msg = context->error; + heim_error_t msg = context->error; + heim_string_t s; + char *str = NULL; - if (msg == NULL || msg->code != error_code) { + if (msg == NULL || heim_error_get_code(msg) != error_code) { const char *cstr; - char *str; cstr = com_right(context->et_list, error_code); if (cstr) @@ -175,11 +151,14 @@ return str; } - for (msg = context->error; msg; msg = msg->next) - p = rk_strpoolprintf(p, "%s%s", msg->msg, - msg->next != NULL ? "; " : ""); - - return rk_strpoolcollect(p); + s = heim_error_copy_string(msg); + if (s) { + const char *cstr = heim_string_get_utf8(s); + if (cstr) + str = strdup(cstr); + heim_release(s); + } + return str; } /** @@ -215,13 +194,14 @@ va_list ap; const char *msg; char *str; + int ret; va_start(ap, fmt); - vasprintf(&str, fmt, ap); + ret = vasprintf(&str, fmt, ap); va_end(ap); msg = hx509_get_error_string(context, error_code); if (msg == NULL) msg = "no error"; - errx(exit_code, "%s: %s", str, msg); + errx(exit_code, "%s: %s", ret != -1 ? str : "ENOMEM", msg); } diff --git a/crypto/heimdal/lib/hx509/file.c b/crypto/heimdal/lib/hx509/file.c --- a/crypto/heimdal/lib/hx509/file.c +++ b/crypto/heimdal/lib/hx509/file.c @@ -98,7 +98,7 @@ if (length > ENCODE_LINE_LENGTH) length = ENCODE_LINE_LENGTH; - l = base64_encode(p, length, &line); + l = rk_base64_encode(p, length, &line); if (l < 0) { hx509_set_error_string(context, 0, ENOMEM, "malloc - out of memory"); @@ -230,7 +230,7 @@ where = INDATA; goto indata; } - /* FALLTHOUGH */ + /* FALLTHROUGH */ case INHEADER: if (buf[0] == '\0') { where = INDATA; @@ -255,7 +255,7 @@ } p = emalloc(i); - i = base64_decode(buf, p); + i = rk_base64_decode(buf, p); if (i < 0) { free(p); goto out; diff --git a/crypto/heimdal/lib/hx509/hx509-private.h b/crypto/heimdal/lib/hx509/hx509-private.h --- a/crypto/heimdal/lib/hx509/hx509-private.h +++ b/crypto/heimdal/lib/hx509/hx509-private.h @@ -30,7 +30,7 @@ _hx509_abort ( const char */*fmt*/, ...) - __attribute__ ((noreturn, format (printf, 1, 2))); + __attribute__ ((__noreturn__, __format__ (__printf__, 1, 2))); int _hx509_calculate_path ( @@ -193,6 +193,9 @@ const Certificate */*issuer*/, SubjectKeyIdentifier */*si*/); +const struct signature_alg * +_hx509_find_sig_alg (const heim_oid */*oid*/); + int _hx509_generate_private_key ( hx509_context /*context*/, @@ -333,6 +336,9 @@ const char */*fmt*/, ...); +void +_hx509_private_eckey_free (void */*eckey*/); + int _hx509_private_key_export ( hx509_context /*context*/, @@ -440,10 +446,16 @@ const heim_octet_string */*attr*/); int -_hx509_signature_best_before ( +_hx509_set_digest_alg ( + DigestAlgorithmIdentifier */*id*/, + const heim_oid */*oid*/, + const void */*param*/, + size_t /*length*/); + +int +_hx509_signature_is_weak ( hx509_context /*context*/, - const AlgorithmIdentifier */*alg*/, - time_t /*t*/); + const AlgorithmIdentifier */*alg*/); void _hx509_unmap_file_os (heim_octet_string */*os*/); diff --git a/crypto/heimdal/lib/hx509/hx509-protos.h b/crypto/heimdal/lib/hx509/hx509-protos.h --- a/crypto/heimdal/lib/hx509/hx509-protos.h +++ b/crypto/heimdal/lib/hx509/hx509-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __hx509_protos_h__ #define __hx509_protos_h__ +#ifndef DOXY #include @@ -21,12 +22,47 @@ #endif #endif #endif +/** + * Print a bitstring using a hx509_vprint_func function. To print to + * stdout use hx509_print_stdout(). + * + * @param b bit string to print. + * @param func hx509_vprint_func to print with. + * @param ctx context variable to hx509_vprint_func function. + * + * @ingroup hx509_print + */ + void hx509_bitstring_print ( const heim_bit_string */*b*/, hx509_vprint_func /*func*/, void */*ctx*/); +/** + * Sign a to-be-signed certificate object with a issuer certificate. + * + * The caller needs to at least have called the following functions on the + * to-be-signed certificate object: + * - hx509_ca_tbs_init() + * - hx509_ca_tbs_set_subject() + * - hx509_ca_tbs_set_spki() + * + * When done the to-be-signed certificate object should be freed with + * hx509_ca_tbs_free(). + * + * When creating self-signed certificate use hx509_ca_sign_self() instead. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param signer the CA certificate object to sign with (need private key). + * @param certificate return cerificate, free with hx509_cert_free(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_sign ( hx509_context /*context*/, @@ -34,6 +70,19 @@ hx509_cert /*signer*/, hx509_cert */*certificate*/); +/** + * Work just like hx509_ca_sign() but signs it-self. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param signer private key to sign with. + * @param certificate return cerificate, free with hx509_cert_free(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_sign_self ( hx509_context /*context*/, @@ -41,6 +90,20 @@ hx509_private_key /*signer*/, hx509_cert */*certificate*/); +/** + * Add CRL distribution point URI to the to-be-signed certificate + * object. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param uri uri to the CRL. + * @param issuername name of the issuer. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_crl_dp_uri ( hx509_context /*context*/, @@ -48,30 +111,99 @@ const char */*uri*/, hx509_name /*issuername*/); +/** + * An an extended key usage to the to-be-signed certificate object. + * Duplicates will detected and not added. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param oid extended key usage to add. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_eku ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const heim_oid */*oid*/); +/** + * Add a Subject Alternative Name hostname to to-be-signed certificate + * object. A domain match starts with ., an exact match does not. + * + * Example of a an domain match: .domain.se matches the hostname + * host.domain.se. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param dnsname a hostame. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_san_hostname ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const char */*dnsname*/); +/** + * Add a Jabber/XMPP jid Subject Alternative Name to the to-be-signed + * certificate object. The jid is an UTF8 string. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param jid string of an a jabber id in UTF8. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_san_jid ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const char */*jid*/); +/** + * Add Microsoft UPN Subject Alternative Name to the to-be-signed + * certificate object. The principal string is a UTF8 string. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param principal Microsoft UPN string. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_san_ms_upn ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const char */*principal*/); +/** + * Add Subject Alternative Name otherName to the to-be-signed + * certificate object. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param oid the oid of the OtherName. + * @param os data in the other name. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_san_otherName ( hx509_context /*context*/, @@ -79,79 +211,273 @@ const heim_oid */*oid*/, const heim_octet_string */*os*/); +/** + * Add Kerberos Subject Alternative Name to the to-be-signed + * certificate object. The principal string is a UTF8 string. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param principal Kerberos principal to add to the certificate. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_san_pkinit ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const char */*principal*/); +/** + * Add a Subject Alternative Name rfc822 (email address) to + * to-be-signed certificate object. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param rfc822Name a string to a email address. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_add_san_rfc822name ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const char */*rfc822Name*/); +/** + * Free an To Be Signed object. + * + * @param tbs object to free. + * + * @ingroup hx509_ca + */ + void hx509_ca_tbs_free (hx509_ca_tbs */*tbs*/); +/** + * Allocate an to-be-signed certificate object that will be converted + * into an certificate. + * + * @param context A hx509 context. + * @param tbs returned to-be-signed certicate object, free with + * hx509_ca_tbs_free(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_init ( hx509_context /*context*/, hx509_ca_tbs */*tbs*/); +/** + * Make the to-be-signed certificate object a CA certificate. If the + * pathLenConstraint is negative path length constraint is used. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param pathLenConstraint path length constraint, negative, no + * constraint. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_ca ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, int /*pathLenConstraint*/); +/** + * Make the to-be-signed certificate object a windows domain controller certificate. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_domaincontroller ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/); +/** + * Set the absolute time when the certificate is valid to. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param t time when the certificate will expire + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_notAfter ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, time_t /*t*/); +/** + * Set the relative time when the certificiate is going to expire. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param delta seconds to the certificate is going to expire. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_notAfter_lifetime ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, time_t /*delta*/); +/** + * Set the absolute time when the certificate is valid from. If not + * set the current time will be used. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param t time the certificated will start to be valid + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_notBefore ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, time_t /*t*/); +/** + * Make the to-be-signed certificate object a proxy certificate. If the + * pathLenConstraint is negative path length constraint is used. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param pathLenConstraint path length constraint, negative, no + * constraint. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_proxy ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, int /*pathLenConstraint*/); +/** + * Set the serial number to use for to-be-signed certificate object. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param serialNumber serial number to use for the to-be-signed + * certificate object. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_serialnumber ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const heim_integer */*serialNumber*/); +/** + * Set signature algorithm on the to be signed certificate + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param sigalg signature algorithm to use + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + +int +hx509_ca_tbs_set_signature_algorithm ( + hx509_context /*context*/, + hx509_ca_tbs /*tbs*/, + const AlgorithmIdentifier */*sigalg*/); + +/** + * Set the subject public key info (SPKI) in the to-be-signed certificate + * object. SPKI is the public key and key related parameters in the + * certificate. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param spki subject public key info to use for the to-be-signed certificate object. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_spki ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, const SubjectPublicKeyInfo */*spki*/); +/** + * Set the subject name of a to-be-signed certificate object. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param subject the name to set a subject. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_subject ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, hx509_name /*subject*/); +/** + * Initialize the to-be-signed certificate object from a template certifiate. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param flags bit field selecting what to copy from the template + * certifiate. + * @param cert template certificate. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_template ( hx509_context /*context*/, @@ -159,6 +485,24 @@ int /*flags*/, hx509_cert /*cert*/); +/** + * Set the issuerUniqueID and subjectUniqueID + * + * These are only supposed to be used considered with version 2 + * certificates, replaced by the two extensions SubjectKeyIdentifier + * and IssuerKeyIdentifier. This function is to allow application + * using legacy protocol to issue them. + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param issuerUniqueID to be set + * @param subjectUniqueID to be set + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_set_unique ( hx509_context /*context*/, @@ -166,21 +510,71 @@ const heim_bit_string */*subjectUniqueID*/, const heim_bit_string */*issuerUniqueID*/); +/** + * Expand the the subject name in the to-be-signed certificate object + * using hx509_name_expand(). + * + * @param context A hx509 context. + * @param tbs object to be signed. + * @param env environment variable to expand variables in the subject + * name, see hx509_env_init(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_ca + */ + int hx509_ca_tbs_subject_expand ( hx509_context /*context*/, hx509_ca_tbs /*tbs*/, hx509_env /*env*/); +/** + * Make of template units, use to build flags argument to + * hx509_ca_tbs_set_template() with parse_units(). + * + * @return an units structure. + * + * @ingroup hx509_ca + */ + const struct units * hx509_ca_tbs_template_units (void); +/** + * Encodes the hx509 certificate as a DER encode binary. + * + * @param context A hx509 context. + * @param c the certificate to encode. + * @param os the encode certificate, set to NULL, 0 on case of + * error. Free the os->data with hx509_xfree(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_binary ( hx509_context /*context*/, hx509_cert /*c*/, heim_octet_string */*os*/); +/** + * Check the extended key usage on the hx509 certificate. + * + * @param context A hx509 context. + * @param cert A hx509 context. + * @param eku the EKU to check for + * @param allow_any_eku if the any EKU is set, allow that to be a + * substitute. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_check_eku ( hx509_context /*context*/, @@ -188,11 +582,40 @@ const heim_oid */*eku*/, int /*allow_any_eku*/); +/** + * Compare to hx509 certificate object, useful for sorting. + * + * @param p a hx509 certificate object. + * @param q a hx509 certificate object. + * + * @return 0 the objects are the same, returns > 0 is p is "larger" + * then q, < 0 if p is "smaller" then q. + * + * @ingroup hx509_cert + */ + int hx509_cert_cmp ( hx509_cert /*p*/, hx509_cert /*q*/); +/** + * Return a list of subjectAltNames specified by oid in the + * certificate. On error the + * + * The returned list of octet string should be freed with + * hx509_free_octet_string_list(). + * + * @param context A hx509 context. + * @param cert a hx509 certificate object. + * @param oid an oid to for SubjectAltName. + * @param list list of matching SubjectAltName. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_find_subjectAltName_otherName ( hx509_context /*context*/, @@ -200,62 +623,223 @@ const heim_oid */*oid*/, hx509_octet_string_list */*list*/); +/** + * Free reference to the hx509 certificate object, if the refcounter + * reaches 0, the object if freed. Its allowed to pass in NULL. + * + * @param cert the cert to free. + * + * @ingroup hx509_cert + */ + void hx509_cert_free (hx509_cert /*cert*/); +/** + * Get the SubjectPublicKeyInfo structure from the hx509 certificate. + * + * @param context a hx509 context. + * @param p a hx509 certificate object. + * @param spki SubjectPublicKeyInfo, should be freed with + * free_SubjectPublicKeyInfo(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_get_SPKI ( hx509_context /*context*/, hx509_cert /*p*/, SubjectPublicKeyInfo */*spki*/); +/** + * Get the AlgorithmIdentifier from the hx509 certificate. + * + * @param context a hx509 context. + * @param p a hx509 certificate object. + * @param alg AlgorithmIdentifier, should be freed with + * free_AlgorithmIdentifier(). The algorithmidentifier is + * typicly rsaEncryption, or id-ecPublicKey, or some other + * public key mechanism. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_get_SPKI_AlgorithmIdentifier ( hx509_context /*context*/, hx509_cert /*p*/, AlgorithmIdentifier */*alg*/); +/** + * Get an external attribute for the certificate, examples are + * friendly name and id. + * + * @param cert hx509 certificate object to search + * @param oid an oid to search for. + * + * @return an hx509_cert_attribute, only valid as long as the + * certificate is referenced. + * + * @ingroup hx509_cert + */ + hx509_cert_attribute hx509_cert_get_attribute ( hx509_cert /*cert*/, const heim_oid */*oid*/); +/** + * Return the name of the base subject of the hx509 certificate. If + * the certiicate is a verified proxy certificate, the this function + * return the base certificate (root of the proxy chain). If the proxy + * certificate is not verified with the base certificate + * HX509_PROXY_CERTIFICATE_NOT_CANONICALIZED is returned. + * + * @param context a hx509 context. + * @param c a hx509 certificate object. + * @param name a pointer to a hx509 name, should be freed by + * hx509_name_free(). See also hx509_cert_get_subject(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_get_base_subject ( hx509_context /*context*/, hx509_cert /*c*/, hx509_name */*name*/); +/** + * Get friendly name of the certificate. + * + * @param cert cert to get the friendly name from. + * + * @return an friendly name or NULL if there is. The friendly name is + * only valid as long as the certificate is referenced. + * + * @ingroup hx509_cert + */ + const char * hx509_cert_get_friendly_name (hx509_cert /*cert*/); +/** + * Return the name of the issuer of the hx509 certificate. + * + * @param p a hx509 certificate object. + * @param name a pointer to a hx509 name, should be freed by + * hx509_name_free(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_get_issuer ( hx509_cert /*p*/, hx509_name */*name*/); +/** + * Get a copy of the Issuer Unique ID + * + * @param context a hx509_context + * @param p a hx509 certificate + * @param issuer the issuer id returned, free with der_free_bit_string() + * + * @return An hx509 error code, see hx509_get_error_string(). The + * error code HX509_EXTENSION_NOT_FOUND is returned if the certificate + * doesn't have a issuerUniqueID + * + * @ingroup hx509_cert + */ + int hx509_cert_get_issuer_unique_id ( hx509_context /*context*/, hx509_cert /*p*/, heim_bit_string */*issuer*/); +/** + * Get notAfter time of the certificate. + * + * @param p a hx509 certificate object. + * + * @return return not after time. + * + * @ingroup hx509_cert + */ + time_t hx509_cert_get_notAfter (hx509_cert /*p*/); +/** + * Get notBefore time of the certificate. + * + * @param p a hx509 certificate object. + * + * @return return not before time + * + * @ingroup hx509_cert + */ + time_t hx509_cert_get_notBefore (hx509_cert /*p*/); +/** + * Get serial number of the certificate. + * + * @param p a hx509 certificate object. + * @param i serial number, should be freed ith der_free_heim_integer(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_get_serialnumber ( hx509_cert /*p*/, heim_integer */*i*/); +/** + * Return the name of the subject of the hx509 certificate. + * + * @param p a hx509 certificate object. + * @param name a pointer to a hx509 name, should be freed by + * hx509_name_free(). See also hx509_cert_get_base_subject(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_get_subject ( hx509_cert /*p*/, hx509_name */*name*/); +/** + * Get a copy of the Subect Unique ID + * + * @param context a hx509_context + * @param p a hx509 certificate + * @param subject the subject id returned, free with der_free_bit_string() + * + * @return An hx509 error code, see hx509_get_error_string(). The + * error code HX509_EXTENSION_NOT_FOUND is returned if the certificate + * doesn't have a subjectUniqueID + * + * @ingroup hx509_cert + */ + int hx509_cert_get_subject_unique_id ( hx509_context /*context*/, @@ -265,18 +849,63 @@ int hx509_cert_have_private_key (hx509_cert /*p*/); -int +/** + * Allocate and init an hx509 certificate object from the decoded + * certificate `c´. + * + * @param context A hx509 context. + * @param c + * @param error + * + * @return Returns an hx509 certificate + * + * @ingroup hx509_cert + */ + +hx509_cert hx509_cert_init ( hx509_context /*context*/, const Certificate */*c*/, - hx509_cert */*cert*/); + heim_error_t */*error*/); + +/** + * Just like hx509_cert_init(), but instead of a decode certificate + * takes an pointer and length to a memory region that contains a + * DER/BER encoded certificate. + * + * If the memory region doesn't contain just the certificate and + * nothing more the function will fail with + * HX509_EXTRA_DATA_AFTER_STRUCTURE. + * + * @param context A hx509 context. + * @param ptr pointer to memory region containing encoded certificate. + * @param len length of memory region. + * @param error possibly returns an error + * + * @return An hx509 certificate + * + * @ingroup hx509_cert + */ -int +hx509_cert hx509_cert_init_data ( hx509_context /*context*/, const void */*ptr*/, size_t /*len*/, - hx509_cert */*cert*/); + heim_error_t */*error*/); + +/** + * Print certificate usage for a certificate to a string. + * + * @param context A hx509 context. + * @param c a certificate print the keyusage for. + * @param s the return string with the keysage printed in to, free + * with hx509_xfree(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_print + */ int hx509_cert_keyusage_print ( @@ -292,20 +921,72 @@ heim_oid */*encryption_oid*/, heim_octet_string */*ciphertext*/); +/** + * Add a reference to a hx509 certificate object. + * + * @param cert a pointer to an hx509 certificate object. + * + * @return the same object as is passed in. + * + * @ingroup hx509_cert + */ + hx509_cert hx509_cert_ref (hx509_cert /*cert*/); +/** + * Set the friendly name on the certificate. + * + * @param cert The certificate to set the friendly name on + * @param name Friendly name. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_cert_set_friendly_name ( hx509_cert /*cert*/, const char */*name*/); +/** + * Add a certificate to the certificiate store. + * + * The receiving keyset certs will either increase reference counter + * of the cert or make a deep copy, either way, the caller needs to + * free the cert itself. + * + * @param context a hx509 context. + * @param certs certificate store to add the certificate to. + * @param cert certificate to add. + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_add ( hx509_context /*context*/, hx509_certs /*certs*/, hx509_cert /*cert*/); +/** + * Same a hx509_certs_merge() but use a lock and name to describe the + * from source. + * + * @param context a hx509 context. + * @param to the store to merge into. + * @param lock a lock that unlocks the certificates store, use NULL to + * select no password/certifictes/prompt lock (see @ref page_lock). + * @param name name of the source store + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_append ( hx509_context /*context*/, @@ -313,12 +994,38 @@ hx509_lock /*lock*/, const char */*name*/); +/** + * End the iteration over certificates. + * + * @param context a hx509 context. + * @param certs certificate store to iterate over. + * @param cursor cursor that will keep track of progress, freed. + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_end_seq ( hx509_context /*context*/, hx509_certs /*certs*/, hx509_cursor /*cursor*/); +/** + * Filter certificate matching the query. + * + * @param context a hx509 context. + * @param certs certificate store to search. + * @param q query allocated with @ref hx509_query functions. + * @param result the filtered certificate store, caller must free with + * hx509_certs_free(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_filter ( hx509_context /*context*/, @@ -326,6 +1033,20 @@ const hx509_query */*q*/, hx509_certs */*result*/); +/** + * Find a certificate matching the query. + * + * @param context a hx509 context. + * @param certs certificate store to search. + * @param q query allocated with @ref hx509_query functions. + * @param r return certificate (or NULL on error), should be freed + * with hx509_cert_free(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_find ( hx509_context /*context*/, @@ -333,9 +1054,32 @@ const hx509_query */*q*/, hx509_cert */*r*/); +/** + * Free a certificate store. + * + * @param certs certificate store to free. + * + * @ingroup hx509_keyset + */ + void hx509_certs_free (hx509_certs */*certs*/); +/** + * Print some info about the certificate store. + * + * @param context a hx509 context. + * @param certs certificate store to print information about. + * @param func function that will get each line of the information, if + * NULL is used the data is printed on a FILE descriptor that should + * be passed in ctx, if ctx also is NULL, stdout is used. + * @param ctx parameter to func. + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_info ( hx509_context /*context*/, @@ -343,6 +1087,24 @@ int (*/*func*/)(void *, const char *), void */*ctx*/); +/** + * Open or creates a new hx509 certificate store. + * + * @param context A hx509 context + * @param name name of the store, format is TYPE:type-specific-string, + * if NULL is used the MEMORY store is used. + * @param flags list of flags: + * - HX509_CERTS_CREATE create a new keystore of the specific TYPE. + * - HX509_CERTS_UNPROTECT_ALL fails if any private key failed to be extracted. + * @param lock a lock that unlocks the certificates store, use NULL to + * select no password/certifictes/prompt lock (see @ref page_lock). + * @param certs return pointer, free with hx509_certs_free(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_init ( hx509_context /*context*/, @@ -351,6 +1113,21 @@ hx509_lock /*lock*/, hx509_certs */*certs*/); +/** + * Iterate over all certificates in a keystore and call a block + * for each of them. + * + * @param context a hx509 context. + * @param certs certificate store to iterate over. + * @param func block to call for each certificate. The function + * should return non-zero to abort the iteration, that value is passed + * back to the caller of hx509_certs_iter(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + #ifdef __BLOCKS__ int hx509_certs_iter ( @@ -359,6 +1136,22 @@ int (^func)(hx509_cert)); #endif /* __BLOCKS__ */ +/** + * Iterate over all certificates in a keystore and call a function + * for each of them. + * + * @param context a hx509 context. + * @param certs certificate store to iterate over. + * @param func function to call for each certificate. The function + * should return non-zero to abort the iteration, that value is passed + * back to the caller of hx509_certs_iter_f(). + * @param ctx context variable that will passed to the function. + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_iter_f ( hx509_context /*context*/, @@ -366,12 +1159,40 @@ int (*/*func*/)(hx509_context, void *, hx509_cert), void */*ctx*/); +/** + * Merge a certificate store into another. The from store is keep + * intact. + * + * @param context a hx509 context. + * @param to the store to merge into. + * @param from the store to copy the object from. + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_merge ( hx509_context /*context*/, hx509_certs /*to*/, hx509_certs /*from*/); +/** + * Get next ceritificate from the certificate keystore pointed out by + * cursor. + * + * @param context a hx509 context. + * @param certs certificate store to iterate over. + * @param cursor cursor that keeps track of progress. + * @param cert return certificate next in store, NULL if the store + * contains no more certificates. Free with hx509_cert_free(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_certs_next_cert ( hx509_context /*context*/, @@ -382,12 +1203,42 @@ hx509_certs hx509_certs_ref (hx509_certs /*certs*/); +/** + * Start the integration + * + * @param context a hx509 context. + * @param certs certificate store to iterate over + * @param cursor cursor that will keep track of progress, free with + * hx509_certs_end_seq(). + * + * @return Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION is + * returned if the certificate store doesn't support the iteration + * operation. + * + * @ingroup hx509_keyset + */ + int hx509_certs_start_seq ( hx509_context /*context*/, hx509_certs /*certs*/, hx509_cursor */*cursor*/); +/** + * Write the certificate store to stable storage. + * + * @param context A hx509 context. + * @param certs a certificate store to store. + * @param flags currently unused, use 0. + * @param lock a lock that unlocks the certificates store, use NULL to + * select no password/certifictes/prompt lock (see @ref page_lock). + * + * @return Returns an hx509 error code. HX509_UNSUPPORTED_OPERATION if + * the certificate store doesn't support the store operation. + * + * @ingroup hx509_keyset + */ + int hx509_certs_store ( hx509_context /*context*/, @@ -395,12 +1246,33 @@ int /*flags*/, hx509_lock /*lock*/); +/** + * Function to use to hx509_certs_iter_f() as a function argument, the + * ctx variable to hx509_certs_iter_f() should be a FILE file descriptor. + * + * @param context a hx509 context. + * @param ctx used by hx509_certs_iter_f(). + * @param c a certificate + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_ci_print_names ( hx509_context /*context*/, void */*ctx*/, hx509_cert /*c*/); +/** + * Resets the error strings the hx509 context. + * + * @param context A hx509 context. + * + * @ingroup hx509_error + */ + void hx509_clear_error_string (hx509_context /*context*/); @@ -418,6 +1290,31 @@ hx509_certs /*pool*/, heim_octet_string */*signed_data*/); +/** + * Decode SignedData and verify that the signature is correct. + * + * @param context A hx509 context. + * @param flags + * @param eContentType the type of the data. + * @param data data to sign + * @param length length of the data that data point to. + * @param digest_alg digest algorithm to use, use NULL to get the + * default or the peer determined algorithm. + * @param cert certificate to use for sign the data. + * @param peer info about the peer the message to send the message to, + * like what digest algorithm to use. + * @param anchors trust anchors that the client will use, used to + * polulate the certificates included in the message + * @param pool certificates to use in try to build the path to the + * trust anchors. + * @param signed_data the output of the function, free with + * der_free_octet_string(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_cms + */ + int hx509_cms_create_signed_1 ( hx509_context /*context*/, @@ -432,6 +1329,11 @@ hx509_certs /*pool*/, heim_octet_string */*signed_data*/); +/** + * Use HX509_CMS_SIGNATURE_NO_SIGNER to create no sigInfo (no + * signatures). + */ + int hx509_cms_decrypt_encrypted ( hx509_context /*context*/, @@ -441,6 +1343,34 @@ heim_oid */*contentType*/, heim_octet_string */*content*/); +/** + * Encrypt end encode EnvelopedData. + * + * Encrypt and encode EnvelopedData. The data is encrypted with a + * random key and the the random key is encrypted with the + * certificates private key. This limits what private key type can be + * used to RSA. + * + * @param context A hx509 context. + * @param flags flags to control the behavior. + * - HX509_CMS_EV_NO_KU_CHECK - Don't check KU on certificate + * - HX509_CMS_EV_ALLOW_WEAK - Allow weak crytpo + * - HX509_CMS_EV_ID_NAME - prefer issuer name and serial number + * @param cert Certificate to encrypt the EnvelopedData encryption key + * with. + * @param data pointer the data to encrypt. + * @param length length of the data that data point to. + * @param encryption_type Encryption cipher to use for the bulk data, + * use NULL to get default. + * @param contentType type of the data that is encrypted + * @param content the output of the function, + * free with der_free_octet_string(). + * + * @return an hx509 error code. + * + * @ingroup hx509_cms + */ + int hx509_cms_envelope_1 ( hx509_context /*context*/, @@ -452,6 +1382,30 @@ const heim_oid */*contentType*/, heim_octet_string */*content*/); +/** + * Decode and unencrypt EnvelopedData. + * + * Extract data and parameteres from from the EnvelopedData. Also + * supports using detached EnvelopedData. + * + * @param context A hx509 context. + * @param certs Certificate that can decrypt the EnvelopedData + * encryption key. + * @param flags HX509_CMS_UE flags to control the behavior. + * @param data pointer the structure the contains the DER/BER encoded + * EnvelopedData stucture. + * @param length length of the data that data point to. + * @param encryptedContent in case of detached signature, this + * contains the actual encrypted data, othersize its should be NULL. + * @param time_now set the current time, if zero the library uses now as the date. + * @param contentType output type oid, should be freed with der_free_oid(). + * @param content the data, free with der_free_octet_string(). + * + * @return an hx509 error code. + * + * @ingroup hx509_cms + */ + int hx509_cms_unenvelope ( hx509_context /*context*/, @@ -464,6 +1418,20 @@ heim_oid */*contentType*/, heim_octet_string */*content*/); +/** + * Decode an ContentInfo and unwrap data and oid it. + * + * @param in the encoded buffer. + * @param oid type of the content. + * @param out data to be wrapped. + * @param have_data since the data is optional, this flags show dthe + * diffrence between no data and the zero length data. + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_cms + */ + int hx509_cms_unwrap_ContentInfo ( const heim_octet_string */*in*/, @@ -471,6 +1439,30 @@ heim_octet_string */*out*/, int */*have_data*/); +/** + * Decode SignedData and verify that the signature is correct. + * + * @param context A hx509 context. + * @param ctx a hx509 verify context. + * @param flags to control the behaivor of the function. + * - HX509_CMS_VS_NO_KU_CHECK - Don't check KeyUsage + * - HX509_CMS_VS_ALLOW_DATA_OID_MISMATCH - allow oid mismatch + * - HX509_CMS_VS_ALLOW_ZERO_SIGNER - no signer, see below. + * @param data pointer to CMS SignedData encoded data. + * @param length length of the data that data point to. + * @param signedContent external data used for signature. + * @param pool certificate pool to build certificates paths. + * @param contentType free with der_free_oid(). + * @param content the output of the function, free with + * der_free_octet_string(). + * @param signer_certs list of the cerficates used to sign this + * request, free with hx509_certs_free(). + * + * @return an hx509 error code. + * + * @ingroup hx509_cms + */ + int hx509_cms_verify_signed ( hx509_context /*context*/, @@ -484,45 +1476,152 @@ heim_octet_string */*content*/, hx509_certs */*signer_certs*/); +/** + * Wrap data and oid in a ContentInfo and encode it. + * + * @param oid type of the content. + * @param buf data to be wrapped. If a NULL pointer is passed in, the + * optional content field in the ContentInfo is not going be filled + * in. + * @param res the encoded buffer, the result should be freed with + * der_free_octet_string(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_cms + */ + int hx509_cms_wrap_ContentInfo ( const heim_oid */*oid*/, const heim_octet_string */*buf*/, heim_octet_string */*res*/); +/** + * Free the context allocated by hx509_context_init(). + * + * @param context context to be freed. + * + * @ingroup hx509 + */ + void hx509_context_free (hx509_context */*context*/); +/** + * Creates a hx509 context that most functions in the library + * uses. The context is only allowed to be used by one thread at each + * moment. Free the context with hx509_context_free(). + * + * @param context Returns a pointer to new hx509 context. + * + * @return Returns an hx509 error code. + * + * @ingroup hx509 + */ + int hx509_context_init (hx509_context */*context*/); +/** + * Selects if the hx509_revoke_verify() function is going to require + * the existans of a revokation method (OCSP, CRL) or not. Note that + * hx509_verify_path(), hx509_cms_verify_signed(), and other function + * call hx509_revoke_verify(). + * + * @param context hx509 context to change the flag for. + * @param flag zero, revokation method required, non zero missing + * revokation method ok + * + * @ingroup hx509_verify + */ + void hx509_context_set_missing_revoke ( hx509_context /*context*/, int /*flag*/); +/** + * Add revoked certificate to an CRL context. + * + * @param context a hx509 context. + * @param crl the CRL to add the revoked certificate to. + * @param certs keyset of certificate to revoke. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_verify + */ + int hx509_crl_add_revoked_certs ( hx509_context /*context*/, hx509_crl /*crl*/, hx509_certs /*certs*/); +/** + * Create a CRL context. Use hx509_crl_free() to free the CRL context. + * + * @param context a hx509 context. + * @param crl return pointer to a newly allocated CRL context. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_verify + */ + int hx509_crl_alloc ( hx509_context /*context*/, hx509_crl */*crl*/); +/** + * Free a CRL context. + * + * @param context a hx509 context. + * @param crl a CRL context to free. + * + * @ingroup hx509_verify + */ + void hx509_crl_free ( hx509_context /*context*/, hx509_crl */*crl*/); +/** + * Set the lifetime of a CRL context. + * + * @param context a hx509 context. + * @param crl a CRL context + * @param delta delta time the certificate is valid, library adds the + * current time to this. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_verify + */ + int hx509_crl_lifetime ( hx509_context /*context*/, hx509_crl /*crl*/, int /*delta*/); +/** + * Sign a CRL and return an encode certificate. + * + * @param context a hx509 context. + * @param signer certificate to sign the CRL with + * @param crl the CRL to sign + * @param os return the signed and encoded CRL, free with + * free_heim_octet_string() + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_verify + */ + int hx509_crl_sign ( hx509_context /*context*/, @@ -635,6 +1734,19 @@ hx509_crypto /*crypto*/, heim_octet_string */*key*/); +/** + * Add a new key/value pair to the hx509_env. + * + * @param context A hx509 context. + * @param env environment to add the environment variable too. + * @param key key to add + * @param value value to add + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_env + */ + int hx509_env_add ( hx509_context /*context*/, @@ -642,6 +1754,19 @@ const char */*key*/, const char */*value*/); +/** + * Add a new key/binding pair to the hx509_env. + * + * @param context A hx509 context. + * @param env environment to add the environment variable too. + * @param key key to add + * @param list binding list to add + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_env + */ + int hx509_env_add_binding ( hx509_context /*context*/, @@ -649,21 +1774,66 @@ const char */*key*/, hx509_env /*list*/); +/** + * Search the hx509_env for a key. + * + * @param context A hx509 context. + * @param env environment to add the environment variable too. + * @param key key to search for. + * + * @return the value if the key is found, NULL otherwise. + * + * @ingroup hx509_env + */ + const char * hx509_env_find ( hx509_context /*context*/, hx509_env /*env*/, const char */*key*/); +/** + * Search the hx509_env for a binding. + * + * @param context A hx509 context. + * @param env environment to add the environment variable too. + * @param key key to search for. + * + * @return the binding if the key is found, NULL if not found. + * + * @ingroup hx509_env + */ + hx509_env hx509_env_find_binding ( hx509_context /*context*/, hx509_env /*env*/, const char */*key*/); +/** + * Free an hx509_env environment context. + * + * @param env the environment to free. + * + * @ingroup hx509_env + */ + void hx509_env_free (hx509_env */*env*/); +/** + * Search the hx509_env for a length based key. + * + * @param context A hx509 context. + * @param env environment to add the environment variable too. + * @param key key to search for. + * @param len length of key. + * + * @return the value if the key is found, NULL otherwise. + * + * @ingroup hx509_env + */ + const char * hx509_env_lfind ( hx509_context /*context*/, @@ -671,6 +1841,18 @@ const char */*key*/, size_t /*len*/); +/** + * Print error message and fatally exit from error code + * + * @param context A hx509 context. + * @param exit_code exit() code from process. + * @param error_code Error code for the reason to exit. + * @param fmt format string with the exit message. + * @param ... argument to format string. + * + * @ingroup hx509_error + */ + void hx509_err ( hx509_context /*context*/, @@ -682,22 +1864,73 @@ hx509_private_key_ops * hx509_find_private_alg (const heim_oid */*oid*/); +/** + * Free error string returned by hx509_get_error_string(). + * + * @param str error string to free. + * + * @ingroup hx509_error + */ + void hx509_free_error_string (char */*str*/); +/** + * Free a list of octet strings returned by another hx509 library + * function. + * + * @param list list to be freed. + * + * @ingroup hx509_misc + */ + void hx509_free_octet_string_list (hx509_octet_string_list */*list*/); +/** + * Unparse the hx509 name in name into a string. + * + * @param name the name to print + * @param str an allocated string returns the name in string form + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_general_name_unparse ( GeneralName */*name*/, char **/*str*/); +/** + * Get an error string from context associated with error_code. + * + * @param context A hx509 context. + * @param error_code Get error message for this error code. + * + * @return error string, free with hx509_free_error_string(). + * + * @ingroup hx509_error + */ + char * hx509_get_error_string ( hx509_context /*context*/, int /*error_code*/); +/** + * Get one random certificate from the certificate store. + * + * @param context a hx509 context. + * @param certs a certificate store to get the certificate from. + * @param c return certificate, should be freed with hx509_cert_free(). + * + * @return Returns an hx509 error code. + * + * @ingroup hx509_keyset + */ + int hx509_get_one_cert ( hx509_context /*context*/, @@ -729,6 +1962,12 @@ void hx509_lock_free (hx509_lock /*lock*/); +/** + * @page page_lock Locking and unlocking certificates and encrypted data. + * + * See the library functions here: @ref hx509_lock + */ + int hx509_lock_init ( hx509_context /*context*/, @@ -756,31 +1995,98 @@ hx509_prompter_fct /*prompt*/, void */*data*/); +/** + * Convert a hx509_name object to DER encoded name. + * + * @param name name to concert + * @param os data to a DER encoded name, free the resulting octet + * string with hx509_xfree(os->data). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_name_binary ( const hx509_name /*name*/, heim_octet_string */*os*/); +/** + * Compare to hx509 name object, useful for sorting. + * + * @param n1 a hx509 name object. + * @param n2 a hx509 name object. + * + * @return 0 the objects are the same, returns > 0 is n2 is "larger" + * then n2, < 0 if n1 is "smaller" then n2. + * + * @ingroup hx509_name + */ + int hx509_name_cmp ( hx509_name /*n1*/, hx509_name /*n2*/); +/** + * Copy a hx509 name object. + * + * @param context A hx509 cotext. + * @param from the name to copy from + * @param to the name to copy to + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_name_copy ( hx509_context /*context*/, const hx509_name /*from*/, hx509_name */*to*/); +/** + * Expands variables in the name using env. Variables are on the form + * ${name}. Useful when dealing with certificate templates. + * + * @param context A hx509 cotext. + * @param name the name to expand. + * @param env environment variable to expand. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_name_expand ( hx509_context /*context*/, hx509_name /*name*/, hx509_env /*env*/); +/** + * Free a hx509 name object, upond return *name will be NULL. + * + * @param name a hx509 name object to be freed. + * + * @ingroup hx509_name + */ + void hx509_name_free (hx509_name */*name*/); +/** + * Unparse the hx509 name in name into a string. + * + * @param name the name to check if its empty/null. + * + * @return non zero if the name is empty/null. + * + * @ingroup hx509_name + */ + int hx509_name_is_null_p (const hx509_name /*name*/); @@ -789,16 +2095,56 @@ hx509_context /*context*/, hx509_name /*name*/); +/** + * Convert a hx509_name into a Name. + * + * @param from the name to copy from + * @param to the name to copy to + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_name_to_Name ( const hx509_name /*from*/, Name */*to*/); +/** + * Convert the hx509 name object into a printable string. + * The resulting string should be freed with free(). + * + * @param name name to print + * @param str the string to return + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_name_to_string ( const hx509_name /*name*/, char **/*str*/); +/** + * Create an OCSP request for a set of certificates. + * + * @param context a hx509 context + * @param reqcerts list of certificates to request ocsp data for + * @param pool certificate pool to use when signing + * @param signer certificate to use to sign the request + * @param digest the signing algorithm in the request, if NULL use the + * default signature algorithm, + * @param request the encoded request, free with free_heim_octet_string(). + * @param nonce nonce in the request, free with free_heim_octet_string(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_revoke + */ + int hx509_ocsp_request ( hx509_context /*context*/, @@ -809,6 +2155,25 @@ heim_octet_string */*request*/, heim_octet_string */*nonce*/); +/** + * Verify that the certificate is part of the OCSP reply and it's not + * expired. Doesn't verify signature the OCSP reply or it's done by a + * authorized sender, that is assumed to be already done. + * + * @param context a hx509 context + * @param now the time right now, if 0, use the current time. + * @param cert the certificate to verify + * @param flags flags control the behavior + * @param data pointer to the encode ocsp reply + * @param length the length of the encode ocsp reply + * @param expiration return the time the OCSP will expire and need to + * be rechecked. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_verify + */ + int hx509_ocsp_verify ( hx509_context /*context*/, @@ -819,17 +2184,51 @@ size_t /*length*/, time_t */*expiration*/); +/** + * Print a oid using a hx509_vprint_func function. To print to stdout + * use hx509_print_stdout(). + * + * @param oid oid to print + * @param func hx509_vprint_func to print with. + * @param ctx context variable to hx509_vprint_func function. + * + * @ingroup hx509_print + */ + void hx509_oid_print ( const heim_oid */*oid*/, hx509_vprint_func /*func*/, void */*ctx*/); +/** + * Print a oid to a string. + * + * @param oid oid to print + * @param str allocated string, free with hx509_xfree(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_print + */ + int hx509_oid_sprint ( const heim_oid */*oid*/, char **/*str*/); +/** + * Parse a string into a hx509 name object. + * + * @param context A hx509 context. + * @param str a string to parse. + * @param name the resulting object, NULL in case of error. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_parse_name ( hx509_context /*context*/, @@ -845,25 +2244,80 @@ hx509_key_format_t /*format*/, hx509_private_key */*private_key*/); +/** + * Add an additional algorithm that the peer supports. + * + * @param context A hx509 context. + * @param peer the peer to set the new algorithms for + * @param val an AlgorithmsIdentier to add + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_peer + */ + int hx509_peer_info_add_cms_alg ( hx509_context /*context*/, hx509_peer_info /*peer*/, const AlgorithmIdentifier */*val*/); +/** + * Allocate a new peer info structure an init it to default values. + * + * @param context A hx509 context. + * @param peer return an allocated peer, free with hx509_peer_info_free(). + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_peer + */ + int hx509_peer_info_alloc ( hx509_context /*context*/, hx509_peer_info */*peer*/); +/** + * Free a peer info structure. + * + * @param peer peer info to be freed. + * + * @ingroup hx509_peer + */ + void hx509_peer_info_free (hx509_peer_info /*peer*/); +/** + * Set the certificate that remote peer is using. + * + * @param peer peer info to update + * @param cert cerificate of the remote peer. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_peer + */ + int hx509_peer_info_set_cert ( hx509_peer_info /*peer*/, hx509_cert /*cert*/); +/** + * Set the algorithms that the peer supports. + * + * @param context A hx509 context. + * @param peer the peer to set the new algorithms for + * @param val array of supported AlgorithmsIdentiers + * @param len length of array val. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_peer + */ + int hx509_peer_info_set_cms_algs ( hx509_context /*context*/, @@ -901,12 +2355,38 @@ const void */*data*/, size_t /*size*/); +/** + * Print a simple representation of a certificate + * + * @param context A hx509 context, can be NULL + * @param cert certificate to print + * @param out the stdio output stream, if NULL, stdout is used + * + * @return An hx509 error code + * + * @ingroup hx509_cert + */ + int hx509_print_cert ( hx509_context /*context*/, hx509_cert /*cert*/, FILE */*out*/); +/** + * Helper function to print on stdout for: + * - hx509_oid_print(), + * - hx509_bitstring_print(), + * - hx509_validate_ctx_set_print(). + * + * @param ctx the context to the print function. If the ctx is NULL, + * stdout is used. + * @param fmt the printing format. + * @param va the argumet list. + * + * @ingroup hx509_print + */ + void hx509_print_stdout ( void */*ctx*/, @@ -944,22 +2424,68 @@ int hx509_prompt_hidden (hx509_prompt_type /*type*/); +/** + * Allocate an query controller. Free using hx509_query_free(). + * + * @param context A hx509 context. + * @param q return pointer to a hx509_query. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_query_alloc ( hx509_context /*context*/, hx509_query **/*q*/); +/** + * Free the query controller. + * + * @param context A hx509 context. + * @param q a pointer to the query controller. + * + * @ingroup hx509_cert + */ + void hx509_query_free ( hx509_context /*context*/, hx509_query */*q*/); +/** + * Set the query controller to match using a specific match function. + * + * @param q a hx509 query controller. + * @param func function to use for matching, if the argument is NULL, + * the match function is removed. + * @param ctx context passed to the function. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_query_match_cmp_func ( hx509_query */*q*/, int (*/*func*/)(hx509_context, hx509_cert, void *), void */*ctx*/); +/** + * Set the query controller to require an one specific EKU (extended + * key usage). Any previous EKU matching is overwitten. If NULL is + * passed in as the eku, the EKU requirement is reset. + * + * @param q a hx509 query controller. + * @param eku an EKU to match on. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_query_match_eku ( hx509_query */*q*/, @@ -971,27 +2497,81 @@ hx509_query */*q*/, const char */*expr*/); +/** + * Set the query controller to match on a friendly name + * + * @param q a hx509 query controller. + * @param name a friendly name to match on + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_query_match_friendly_name ( hx509_query */*q*/, const char */*name*/); +/** + * Set the issuer and serial number of match in the query + * controller. The function make copies of the isser and serial number. + * + * @param q a hx509 query controller + * @param issuer issuer to search for + * @param serialNumber the serialNumber of the issuer. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_query_match_issuer_serial ( hx509_query */*q*/, const Name */*issuer*/, const heim_integer */*serialNumber*/); +/** + * Set match options for the hx509 query controller. + * + * @param q query controller. + * @param option options to control the query controller. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + void hx509_query_match_option ( hx509_query */*q*/, hx509_query_option /*option*/); +/** + * Set a statistic file for the query statistics. + * + * @param context A hx509 context. + * @param fn statistics file name + * + * @ingroup hx509_cert + */ + void hx509_query_statistic_file ( hx509_context /*context*/, const char */*fn*/); +/** + * Unparse the statistics file and print the result on a FILE descriptor. + * + * @param context A hx509 context. + * @param printtype tyep to print + * @param out the FILE to write the data on. + * + * @ingroup hx509_cert + */ + void hx509_query_unparse_stats ( hx509_context /*context*/, @@ -1030,32 +2610,110 @@ hx509_request /*req*/, hx509_name /*name*/); +/** + * Add a CRL file to the revokation context. + * + * @param context hx509 context + * @param ctx hx509 revokation context + * @param path path to file that is going to be added to the context. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_revoke + */ + int hx509_revoke_add_crl ( hx509_context /*context*/, hx509_revoke_ctx /*ctx*/, const char */*path*/); +/** + * Add a OCSP file to the revokation context. + * + * @param context hx509 context + * @param ctx hx509 revokation context + * @param path path to file that is going to be added to the context. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_revoke + */ + int hx509_revoke_add_ocsp ( hx509_context /*context*/, hx509_revoke_ctx /*ctx*/, const char */*path*/); +/** + * Free a hx509 revokation context. + * + * @param ctx context to be freed + * + * @ingroup hx509_revoke + */ + void hx509_revoke_free (hx509_revoke_ctx */*ctx*/); +/** + * Allocate a revokation context. Free with hx509_revoke_free(). + * + * @param context A hx509 context. + * @param ctx returns a newly allocated revokation context. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_revoke + */ + int hx509_revoke_init ( hx509_context /*context*/, hx509_revoke_ctx */*ctx*/); +/** + * Print the OCSP reply stored in a file. + * + * @param context a hx509 context + * @param path path to a file with a OCSP reply + * @param out the out FILE descriptor to print the reply on + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_revoke + */ + int hx509_revoke_ocsp_print ( hx509_context /*context*/, const char */*path*/, FILE */*out*/); +int +hx509_revoke_print ( + hx509_context /*context*/, + hx509_revoke_ctx /*ctx*/, + FILE */*out*/); + +/** + * Check that a certificate is not expired according to a revokation + * context. Also need the parent certificte to the check OCSP + * parent identifier. + * + * @param context hx509 context + * @param ctx hx509 revokation context + * @param certs + * @param now + * @param cert + * @param parent_cert + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_revoke + */ + int hx509_revoke_verify ( hx509_context /*context*/, @@ -1065,6 +2723,20 @@ hx509_cert /*cert*/, hx509_cert /*parent_cert*/); +/** + * See hx509_set_error_stringv(). + * + * @param context A hx509 context. + * @param flags + * - HX509_ERROR_APPEND appends the error string to the old messages + (code is updated). + * @param code error code related to error message + * @param fmt error message format + * @param ... arguments to error message format + * + * @ingroup hx509_error + */ + void hx509_set_error_string ( hx509_context /*context*/, @@ -1073,6 +2745,20 @@ const char */*fmt*/, ...); +/** + * Add an error message to the hx509 context. + * + * @param context A hx509 context. + * @param flags + * - HX509_ERROR_APPEND appends the error string to the old messages + (code is updated). + * @param code error code related to error message + * @param fmt error message format + * @param ap arguments to error message format + * + * @ingroup hx509_error + */ + void hx509_set_error_stringv ( hx509_context /*context*/, @@ -1084,9 +2770,6 @@ const AlgorithmIdentifier * hx509_signature_ecPublicKey (void); -const AlgorithmIdentifier * -hx509_signature_ecdsa_with_sha1 (void); - const AlgorithmIdentifier * hx509_signature_ecdsa_with_sha256 (void); @@ -1126,42 +2809,135 @@ const AlgorithmIdentifier * hx509_signature_sha512 (void); +/** + * Convert a DER encoded name info a string. + * + * @param data data to a DER/BER encoded name + * @param length length of data + * @param str the resulting string, is NULL on failure. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_name + */ + int hx509_unparse_der_name ( const void */*data*/, size_t /*length*/, char **/*str*/); +/** + * Validate/Print the status of the certificate. + * + * @param context A hx509 context. + * @param ctx A hx509 validation context. + * @param cert the cerificate to validate/print. + + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_print + */ + int hx509_validate_cert ( hx509_context /*context*/, hx509_validate_ctx /*ctx*/, hx509_cert /*cert*/); +/** + * Add flags to control the behaivor of the hx509_validate_cert() + * function. + * + * @param ctx A hx509 validation context. + * @param flags flags to add to the validation context. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_print + */ + void hx509_validate_ctx_add_flags ( hx509_validate_ctx /*ctx*/, int /*flags*/); +/** + * Free an hx509 validate context. + * + * @param ctx the hx509 validate context to free. + * + * @ingroup hx509_print + */ + void hx509_validate_ctx_free (hx509_validate_ctx /*ctx*/); +/** + * Allocate a hx509 validation/printing context. + * + * @param context A hx509 context. + * @param ctx a new allocated hx509 validation context, free with + * hx509_validate_ctx_free(). + + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_print + */ + int hx509_validate_ctx_init ( hx509_context /*context*/, hx509_validate_ctx */*ctx*/); +/** + * Set the printing functions for the validation context. + * + * @param ctx a hx509 valication context. + * @param func the printing function to usea. + * @param c the context variable to the printing function. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_print + */ + void hx509_validate_ctx_set_print ( hx509_validate_ctx /*ctx*/, hx509_vprint_func /*func*/, void */*c*/); +/** + * Set the trust anchors in the verification context, makes an + * reference to the keyset, so the consumer can free the keyset + * independent of the destruction of the verification context (ctx). + * If there already is a keyset attached, it's released. + * + * @param ctx a verification context + * @param set a keyset containing the trust anchors. + * + * @ingroup hx509_verify + */ + void hx509_verify_attach_anchors ( hx509_verify_ctx /*ctx*/, hx509_certs /*set*/); +/** + * Attach an revocation context to the verfication context, , makes an + * reference to the revoke context, so the consumer can free the + * revoke context independent of the destruction of the verification + * context. If there is no revoke context, the verification process is + * NOT going to check any verification status. + * + * @param ctx a verification context. + * @param revoke_ctx a revoke context. + * + * @ingroup hx509_verify + */ + void hx509_verify_attach_revoke ( hx509_verify_ctx /*ctx*/, @@ -1172,14 +2948,56 @@ hx509_context /*ctx*/, int /*boolean*/); +/** + * Allow using the operating system builtin trust anchors if no other + * trust anchors are configured. + * + * @param ctx a verification context + * @param boolean if non zero, useing the operating systems builtin + * trust anchors. + * + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + void hx509_verify_ctx_f_allow_default_trustanchors ( hx509_verify_ctx /*ctx*/, int /*boolean*/); +/** + * Free an hx509 verification context. + * + * @param ctx the context to be freed. + * + * @ingroup hx509_verify + */ + void hx509_verify_destroy_ctx (hx509_verify_ctx /*ctx*/); +/** + * Verify that the certificate is allowed to be used for the hostname + * and address. + * + * @param context A hx509 context. + * @param cert the certificate to match with + * @param flags Flags to modify the behavior: + * - HX509_VHN_F_ALLOW_NO_MATCH no match is ok + * @param type type of hostname: + * - HX509_HN_HOSTNAME for plain hostname. + * - HX509_HN_DNSSRV for DNS SRV names. + * @param hostname the hostname to check + * @param sa address of the host + * @param sa_size length of address + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_cert + */ + int hx509_verify_hostname ( hx509_context /*context*/, @@ -1190,11 +3008,38 @@ const struct sockaddr */*sa*/, int /*sa_size*/); +/** + * Allocate an verification context that is used fo control the + * verification process. + * + * @param context A hx509 context. + * @param ctx returns a pointer to a hx509_verify_ctx object. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_verify + */ + int hx509_verify_init_ctx ( hx509_context /*context*/, hx509_verify_ctx */*ctx*/); +/** + * Build and verify the path for the certificate to the trust anchor + * specified in the verify context. The path is constructed from the + * certificate, the pool and the trust anchors. + * + * @param context A hx509 context. + * @param ctx A hx509 verification context. + * @param cert the certificate to build the path from. + * @param pool A keyset of certificates to build the chain from. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_verify + */ + int hx509_verify_path ( hx509_context /*context*/, @@ -1202,26 +3047,83 @@ hx509_cert /*cert*/, hx509_certs /*pool*/); +/** + * Set the maximum depth of the certificate chain that the path + * builder is going to try. + * + * @param ctx a verification context + * @param max_depth maxium depth of the certificate chain, include + * trust anchor. + * + * @ingroup hx509_verify + */ + void hx509_verify_set_max_depth ( hx509_verify_ctx /*ctx*/, unsigned int /*max_depth*/); +/** + * Allow or deny the use of proxy certificates + * + * @param ctx a verification context + * @param boolean if non zero, allow proxy certificates. + * + * @ingroup hx509_verify + */ + void hx509_verify_set_proxy_certificate ( hx509_verify_ctx /*ctx*/, int /*boolean*/); +/** + * Select strict RFC3280 verification of certificiates. This means + * checking key usage on CA certificates, this will make version 1 + * certificiates unuseable. + * + * @param ctx a verification context + * @param boolean if non zero, use strict verification. + * + * @ingroup hx509_verify + */ + void hx509_verify_set_strict_rfc3280_verification ( hx509_verify_ctx /*ctx*/, int /*boolean*/); +/** + * Set the clock time the the verification process is going to + * use. Used to check certificate in the past and future time. If not + * set the current time will be used. + * + * @param ctx a verification context. + * @param t the time the verifiation is using. + * + * + * @ingroup hx509_verify + */ + void hx509_verify_set_time ( hx509_verify_ctx /*ctx*/, time_t /*t*/); +/** + * Verify a signature made using the private key of an certificate. + * + * @param context A hx509 context. + * @param signer the certificate that made the signature. + * @param alg algorthm that was used to sign the data. + * @param data the data that was signed. + * @param sig the sigature to verify. + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_crypto + */ + int hx509_verify_signature ( hx509_context /*context*/, @@ -1230,6 +3132,14 @@ const heim_octet_string */*data*/, const heim_octet_string */*sig*/); +/** + * Free a data element allocated in the library. + * + * @param ptr data to be freed. + * + * @ingroup hx509_misc + */ + void hx509_xfree (void */*ptr*/); @@ -1240,4 +3150,5 @@ } #endif +#endif /* DOXY */ #endif /* __hx509_protos_h__ */ diff --git a/crypto/heimdal/lib/hx509/hx509.h b/crypto/heimdal/lib/hx509/hx509.h --- a/crypto/heimdal/lib/hx509/hx509.h +++ b/crypto/heimdal/lib/hx509/hx509.h @@ -39,6 +39,7 @@ #include #include #include +#include typedef struct hx509_cert_attribute_data *hx509_cert_attribute; typedef struct hx509_cert_data *hx509_cert; diff --git a/crypto/heimdal/lib/hx509/hx509_err.et b/crypto/heimdal/lib/hx509/hx509_err.et --- a/crypto/heimdal/lib/hx509/hx509_err.et +++ b/crypto/heimdal/lib/hx509/hx509_err.et @@ -8,7 +8,7 @@ error_table hx prefix HX509 -# path validateion and construction related errors +# path validation and construction related errors error_code BAD_TIMEFORMAT, "ASN.1 failed call to system time library" error_code EXTENSION_NOT_FOUND, "Extension not found" error_code NO_PATH, "Certification path not found" @@ -21,9 +21,9 @@ error_code PRIVATE_KEY_MISSING, "Private key required for the operation is missing" error_code ALG_NOT_SUPP, "Algorithm not supported" error_code ISSUER_NOT_FOUND, "Issuer couldn't be found" -error_code VERIFY_CONSTRAINTS, "Error verifing constraints" +error_code VERIFY_CONSTRAINTS, "Error verifying constraints" error_code RANGE, "Number too large" -error_code NAME_CONSTRAINT_ERROR, "Error while verifing name constraints" +error_code NAME_CONSTRAINT_ERROR, "Error while verifying name constraints" error_code PATH_TOO_LONG, "Path is too long, failed to find valid anchor" error_code KU_CERT_MISSING, "Required keyusage for this certificate is missing" error_code CERT_NOT_FOUND, "Certificate not found" @@ -32,10 +32,10 @@ error_code EXTRA_DATA_AFTER_STRUCTURE, "Extra data was found after the structure" error_code PROXY_CERT_INVALID, "Proxy certificate is invalid" error_code PROXY_CERT_NAME_WRONG, "Proxy certificate name is wrong" -error_code NAME_MALFORMED, "Name is malformated" -error_code CERTIFICATE_MALFORMED, "Certificate is malformated" +error_code NAME_MALFORMED, "Name is malformed" +error_code CERTIFICATE_MALFORMED, "Certificate is malformed" error_code CERTIFICATE_MISSING_EKU, "Certificate is missing a required EKU" -error_code PROXY_CERTIFICATE_NOT_CANONICALIZED, "Proxy certificate not canonicalize" +error_code PROXY_CERTIFICATE_NOT_CANONICALIZED, "Proxy certificate not canonicalized" # cms related errors index 32 @@ -58,9 +58,9 @@ error_code BAD_SIGNATURE, "Signature is not valid" error_code SIG_NO_CONF, "Sigature doesn't provide confidentiality" error_code SIG_INVALID_FORMAT, "Invalid format on signature" -error_code OID_MISMATCH, "Mismatch bewteen oids" +error_code OID_MISMATCH, "Mismatch between oids" error_code NO_PROMPTER, "No prompter function defined" -error_code SIGNATURE_WITHOUT_SIGNER, "Signature require signer, but non available" +error_code SIGNATURE_WITHOUT_SIGNER, "Signature requires signer, but none available" error_code RSA_PUBLIC_ENCRYPT, "RSA public encyption failed" error_code RSA_PRIVATE_ENCRYPT, "RSA private encyption failed" error_code RSA_PUBLIC_DECRYPT, "RSA public decryption failed" @@ -100,4 +100,10 @@ error_code LOGIN, "Failed to login to slot" error_code LOAD, "Failed to load PKCS module" +# pkinit related errors +error_code PIN_INCORRECT, "Incorrect User PIN" +error_code PIN_LOCKED, "User PIN locked" +error_code PIN_NOT_INITIALIZED, "User PIN not initialized" +error_code PIN_EXPIRED, "User PIN expired" + end diff --git a/crypto/heimdal/lib/hx509/hx_locl.h b/crypto/heimdal/lib/hx509/hx_locl.h --- a/crypto/heimdal/lib/hx509/hx_locl.h +++ b/crypto/heimdal/lib/hx509/hx_locl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004 - 2006 Kungliga Tekniska Högskolan + * Copyright (c) 2004 - 2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -70,14 +70,24 @@ #include +/* + * We use OpenSSL for EC, but to do this we need to disable cross-references + * between OpenSSL and hcrypto bn.h and such. Source files that use OpenSSL EC + * must define HEIM_NO_CRYPTO_HDRS before including this file. + */ + #define HC_DEPRECATED_CRYPTO +#ifndef HEIM_NO_CRYPTO_HDRS #include "crypto-headers.h" +#endif struct hx509_keyset_ops; struct hx509_collector; struct hx509_generate_private_context; typedef struct hx509_path hx509_path; +#include + #include typedef void (*_hx509_cert_release_func)(struct hx509_cert_data *, void *); @@ -186,7 +196,7 @@ #define HX509_CTX_VERIFY_MISSING_OK 1 int ocsp_time_diff; #define HX509_DEFAULT_OCSP_TIME_DIFF (5*60) - hx509_error error; + heim_error_t error; struct et_list *et_list; char *querystat; hx509_certs default_trust_anchors; @@ -211,6 +221,95 @@ extern const AlgorithmIdentifier * _hx509_crypto_default_digest_alg; extern const AlgorithmIdentifier * _hx509_crypto_default_secret_alg; +/* + * Private bits from crypto.c, so crypto-ec.c can also see them. + * + * This is part of the use-OpenSSL-for-EC hack. + */ + +struct hx509_crypto; + +struct signature_alg; + +struct hx509_generate_private_context { + const heim_oid *key_oid; + int isCA; + unsigned long num_bits; +}; + +struct hx509_private_key_ops { + const char *pemtype; + const heim_oid *key_oid; + int (*available)(const hx509_private_key, + const AlgorithmIdentifier *); + int (*get_spki)(hx509_context, + const hx509_private_key, + SubjectPublicKeyInfo *); + int (*export)(hx509_context context, + const hx509_private_key, + hx509_key_format_t, + heim_octet_string *); + int (*import)(hx509_context, const AlgorithmIdentifier *, + const void *, size_t, hx509_key_format_t, + hx509_private_key); + int (*generate_private_key)(hx509_context, + struct hx509_generate_private_context *, + hx509_private_key); + BIGNUM *(*get_internal)(hx509_context, hx509_private_key, const char *); +}; + +struct hx509_private_key { + unsigned int ref; + const struct signature_alg *md; + const heim_oid *signature_alg; + union { + RSA *rsa; + void *keydata; + void *ecdsa; /* EC_KEY */ + } private_key; + hx509_private_key_ops *ops; +}; + +/* + * + */ + +struct signature_alg { + const char *name; + const heim_oid *sig_oid; + const AlgorithmIdentifier *sig_alg; + const heim_oid *key_oid; + const AlgorithmIdentifier *digest_alg; + int flags; +#define PROVIDE_CONF 0x1 +#define REQUIRE_SIGNER 0x2 +#define SELF_SIGNED_OK 0x4 +#define WEAK_SIG_ALG 0x8 + +#define SIG_DIGEST 0x100 +#define SIG_PUBLIC_SIG 0x200 +#define SIG_SECRET 0x400 + +#define RA_RSA_USES_DIGEST_INFO 0x1000000 + + time_t best_before; /* refuse signature made after best before date */ + const EVP_MD *(*evp_md)(void); + int (*verify_signature)(hx509_context context, + const struct signature_alg *, + const Certificate *, + const AlgorithmIdentifier *, + const heim_octet_string *, + const heim_octet_string *); + int (*create_signature)(hx509_context, + const struct signature_alg *, + const hx509_private_key, + const AlgorithmIdentifier *, + const heim_octet_string *, + AlgorithmIdentifier *, + heim_octet_string *); + int digest_size; +}; + /* * Configurable options */ diff --git a/crypto/heimdal/lib/hx509/hxtool-commands.in b/crypto/heimdal/lib/hx509/hxtool-commands.in --- a/crypto/heimdal/lib/hx509/hxtool-commands.in +++ b/crypto/heimdal/lib/hx509/hxtool-commands.in @@ -107,7 +107,7 @@ option = { long = "embedded-certs" type = "-flag" - help = "dont embedded certficiates" + help = "don't embed certificates" } option = { long = "embed-leaf-only" @@ -408,6 +408,17 @@ argument="ocsp-response-file ..." help = "Print the OCSP responses" } +command = { + name = "revoke-print" + option = { + long = "verbose" + type = "flag" + help = "verbose" + } + min_args="1" + argument="ocsp/crl files" + help = "Print the OCSP/CRL files" +} command = { name = "request-create" option = { @@ -623,6 +634,11 @@ type = "string" help = "Lifetime of certificate" } + option = { + long = "signature-algorithm" + type = "string" + help = "Signature algorithm to use" + } option = { long = "serial-number" type = "string" @@ -646,7 +662,7 @@ } option = { long = "pk-init-principal" - type = "string" + type = "strings" help = "PK-INIT principal (for SAN)" } option = { diff --git a/crypto/heimdal/lib/hx509/hxtool-version.rc b/crypto/heimdal/lib/hx509/hxtool-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/hxtool-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Heimdal X.509 Certificate Tool" +#define RC_FILE_ORIG_0409 "hxtool.exe" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/hx509/hxtool.c b/crypto/heimdal/lib/hx509/hxtool.c --- a/crypto/heimdal/lib/hx509/hxtool.c +++ b/crypto/heimdal/lib/hx509/hxtool.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004 - 2007 Kungliga Tekniska Högskolan + * Copyright (c) 2004 - 2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -372,9 +372,9 @@ infile = argv[0]; if (argc < 2) { - asprintf(&outfile, "%s.%s", infile, - opt->pem_flag ? "pem" : "cms-signeddata"); - if (outfile == NULL) + ret = asprintf(&outfile, "%s.%s", infile, + opt->pem_flag ? "pem" : "cms-signeddata"); + if (ret == -1 || outfile == NULL) errx(1, "out of memory"); } else outfile = argv[1]; @@ -1135,6 +1135,45 @@ return 0; } +int +revoke_print(struct revoke_print_options *opt, int argc, char **argv) +{ + hx509_revoke_ctx revoke_ctx; + int ret; + + ret = hx509_revoke_init(context, &revoke_ctx); + if (ret) + errx(1, "hx509_revoke_init: %d", ret); + + while(argc--) { + char *s = *argv++; + + if (strncmp(s, "crl:", 4) == 0) { + s += 4; + + ret = hx509_revoke_add_crl(context, revoke_ctx, s); + if (ret) + errx(1, "hx509_revoke_add_crl: %s: %d", s, ret); + + } else if (strncmp(s, "ocsp:", 4) == 0) { + s += 5; + + ret = hx509_revoke_add_ocsp(context, revoke_ctx, s); + if (ret) + errx(1, "hx509_revoke_add_ocsp: %s: %d", s, ret); + + } else { + errx(1, "unknown option to verify: `%s'\n", s); + } + } + + ret = hx509_revoke_print(context, revoke_ctx, stdout); + if (ret) + warnx("hx509_revoke_print: %d", ret); + + return ret; +} + /* * */ @@ -1388,14 +1427,14 @@ { const RSA_METHOD *m = RSA_get_default_method(); if (m != NULL) - printf("rsa: %s\n", RSA_meth_get0_name(m)); + printf("rsa: %s\n", m->name); } { const DH_METHOD *m = DH_get_default_method(); if (m != NULL) - printf("dh: %s\n", DH_meth_get0_name(m)); + printf("dh: %s\n", m->name); } -#ifdef HAVE_OPENSSL +#ifdef HAVE_HCRYPTO_W_OPENSSL { printf("ecdsa: ECDSA_METHOD-not-export\n"); } @@ -1693,12 +1732,13 @@ } } - if (opt->pk_init_principal_string) { + for (i = 0; i < opt->pk_init_principal_strings.num_strings; i++) { + const char *pk_init_princ = opt->pk_init_principal_strings.strings[i]; + if (!ctopt.pkinit) errx(1, "pk-init principal given but no pk-init oid"); - ret = hx509_ca_tbs_add_san_pkinit(contextp, tbs, - opt->pk_init_principal_string); + ret = hx509_ca_tbs_add_san_pkinit(contextp, tbs, pk_init_princ); if (ret) hx509_err(contextp, 1, ret, "hx509_ca_tbs_add_san_pkinit"); } @@ -1889,6 +1929,17 @@ if (ret) hx509_err(context, 1, ret, "hx509_ca_tbs_init"); + if (opt->signature_algorithm_string) { + const AlgorithmIdentifier *sigalg; + if (strcasecmp(opt->signature_algorithm_string, "rsa-with-sha1") == 0) + sigalg = hx509_signature_rsa_with_sha1(); + else if (strcasecmp(opt->signature_algorithm_string, "rsa-with-sha256") == 0) + sigalg = hx509_signature_rsa_with_sha256(); + else + errx(1, "unsupported sigature algorithm"); + hx509_ca_tbs_set_signature_algorithm(context, tbs, sigalg); + } + if (opt->template_certificate_string) { hx509_cert template; hx509_certs tcerts; diff --git a/crypto/heimdal/lib/hx509/keyset.c b/crypto/heimdal/lib/hx509/keyset.c --- a/crypto/heimdal/lib/hx509/keyset.c +++ b/crypto/heimdal/lib/hx509/keyset.c @@ -107,6 +107,8 @@ * select no password/certifictes/prompt lock (see @ref page_lock). * @param certs return pointer, free with hx509_certs_free(). * + * @return Returns an hx509 error code. + * * @ingroup hx509_keyset */ @@ -318,8 +320,8 @@ } /** - * Iterate over all certificates in a keystore and call an function - * for each fo them. + * Iterate over all certificates in a keystore and call a function + * for each of them. * * @param context a hx509 context. * @param certs certificate store to iterate over. @@ -366,21 +368,6 @@ return ret; } -/** - * Iterate over all certificates in a keystore and call an function - * for each fo them. - * - * @param context a hx509 context. - * @param certs certificate store to iterate over. - * @param func function to call for each certificate. The function - * should return non-zero to abort the iteration, that value is passed - * back to the caller of hx509_certs_iter(). - * - * @return Returns an hx509 error code. - * - * @ingroup hx509_keyset - */ - #ifdef __BLOCKS__ static int @@ -391,8 +378,8 @@ } /** - * Iterate over all certificates in a keystore and call an block - * for each fo them. + * Iterate over all certificates in a keystore and call a block + * for each of them. * * @param context a hx509 context. * @param certs certificate store to iterate over. @@ -752,11 +739,12 @@ { va_list ap; char *str; + int ret; va_start(ap, fmt); - vasprintf(&str, fmt, ap); + ret = vasprintf(&str, fmt, ap); va_end(ap); - if (str == NULL) + if (ret == -1 || str == NULL) return; (*func)(ctx, str); free(str); diff --git a/crypto/heimdal/lib/hx509/ks_dir.c b/crypto/heimdal/lib/hx509/ks_dir.c --- a/crypto/heimdal/lib/hx509/ks_dir.c +++ b/crypto/heimdal/lib/hx509/ks_dir.c @@ -211,7 +211,10 @@ NULL, dir_iter_start, dir_iter, - dir_iter_end + dir_iter_end, + NULL, + NULL, + NULL }; void diff --git a/crypto/heimdal/lib/hx509/ks_file.c b/crypto/heimdal/lib/hx509/ks_file.c --- a/crypto/heimdal/lib/hx509/ks_file.c +++ b/crypto/heimdal/lib/hx509/ks_file.c @@ -52,12 +52,16 @@ const void *data, size_t len, const AlgorithmIdentifier *ai) { + heim_error_t error = NULL; hx509_cert cert; int ret; - ret = hx509_cert_init_data(context, data, len, &cert); - if (ret) + cert = hx509_cert_init_data(context, data, len, &error); + if (cert == NULL) { + ret = heim_error_get_code(error); + heim_release(error); return ret; + } ret = _hx509_collector_certs_add(context, c, cert); hx509_cert_free(cert); @@ -92,9 +96,10 @@ password, passwordlen, 1, key, NULL); if (ret <= 0) { - hx509_set_error_string(context, 0, HX509_CRYPTO_INTERNAL_ERROR, + ret = HX509_CRYPTO_INTERNAL_ERROR; + hx509_set_error_string(context, 0, ret, "Failed to do string2key for private key"); - return HX509_CRYPTO_INTERNAL_ERROR; + goto out; } clear.data = malloc(len); @@ -107,18 +112,11 @@ clear.length = len; { - EVP_CIPHER_CTX *ctx; - - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) { - hx509_set_error_string(context, 0, ENOMEM, - "Out of memory to decrypt for private key"); - ret = ENOMEM; - goto out; - } - EVP_CipherInit_ex(ctx, c, NULL, key, ivdata, 0); - EVP_Cipher(ctx, clear.data, cipher, len); - EVP_CIPHER_CTX_free(ctx); + EVP_CIPHER_CTX ctx; + EVP_CIPHER_CTX_init(&ctx); + EVP_CipherInit_ex(&ctx, c, NULL, key, ivdata, 0); + EVP_Cipher(&ctx, clear.data, cipher, len); + EVP_CIPHER_CTX_cleanup(&ctx); } ret = _hx509_collector_private_key_add(context, @@ -128,10 +126,10 @@ &clear, NULL); - memset(clear.data, 0, clear.length); -out: + memset_s(clear.data, clear.length, 0, clear.length); free(clear.data); - memset(key, 0, keylen); +out: + memset_s(key, keylen, 0, keylen); free(key); return ret; } @@ -294,7 +292,7 @@ ret = try_decrypt(context, c, ai, cipher, ivdata, password, strlen(password), data, len); /* XXX add password to lock password collection ? */ - memset(password, 0, sizeof(password)); + memset_s(password, sizeof(password), 0, sizeof(password)); } free(ivdata); @@ -322,7 +320,9 @@ { "CERTIFICATE", parse_certificate, NULL }, { "PRIVATE KEY", parse_pkcs8_private_key, NULL }, { "RSA PRIVATE KEY", parse_pem_private_key, hx509_signature_rsa }, +#ifdef HAVE_HCRYPTO_W_OPENSSL { "EC PRIVATE KEY", parse_pem_private_key, hx509_signature_ecPublicKey } +#endif }; diff --git a/crypto/heimdal/lib/hx509/ks_keychain.c b/crypto/heimdal/lib/hx509/ks_keychain.c --- a/crypto/heimdal/lib/hx509/ks_keychain.c +++ b/crypto/heimdal/lib/hx509/ks_keychain.c @@ -35,6 +35,9 @@ #ifdef HAVE_FRAMEWORK_SECURITY +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + #include /* Missing function decls in pre Leopard */ @@ -246,6 +249,7 @@ 0, NULL, NULL, + NULL, NULL }; @@ -340,11 +344,13 @@ if (ret != noErr) { hx509_set_error_string(context, 0, ENOENT, "Failed to open %s", residue); + free(ctx); return ENOENT; } } else { hx509_set_error_string(context, 0, ENOENT, "Unknown subtype %s", residue); + free(ctx); return ENOENT; } } @@ -420,8 +426,8 @@ SecCertificateGetData(cr, &cssm); - ret = hx509_cert_init_data(context, cssm.Data, cssm.Length, &cert); - if (ret) + cert = hx509_cert_init_data(context, cssm.Data, cssm.Length, NULL); + if (cert == NULL) continue; ret = hx509_certs_add(context, iter->certs, cert); @@ -470,6 +476,7 @@ UInt32 attrFormat[1] = { 0 }; SecKeychainItemRef itemRef; SecItemAttr item[1]; + heim_error_t error = NULL; struct iter *iter = cursor; OSStatus ret; UInt32 len; @@ -501,9 +508,12 @@ if (ret) return EINVAL; - ret = hx509_cert_init_data(context, ptr, len, cert); - if (ret) + *cert = hx509_cert_init_data(context, ptr, len, &error); + if (*cert == NULL) { + ret = heim_error_get_code(error); + heim_release(error); goto out; + } /* * Find related private key if there is one by looking at @@ -586,9 +596,14 @@ NULL, keychain_iter_start, keychain_iter, - keychain_iter_end + keychain_iter_end, + NULL, + NULL, + NULL }; +#pragma clang diagnostic pop + #endif /* HAVE_FRAMEWORK_SECURITY */ /* diff --git a/crypto/heimdal/lib/hx509/ks_null.c b/crypto/heimdal/lib/hx509/ks_null.c --- a/crypto/heimdal/lib/hx509/ks_null.c +++ b/crypto/heimdal/lib/hx509/ks_null.c @@ -87,7 +87,10 @@ NULL, null_iter_start, null_iter, - null_iter_end + null_iter_end, + NULL, + NULL, + NULL }; void diff --git a/crypto/heimdal/lib/hx509/ks_p11.c b/crypto/heimdal/lib/hx509/ks_p11.c --- a/crypto/heimdal/lib/hx509/ks_p11.c +++ b/crypto/heimdal/lib/hx509/ks_p11.c @@ -38,7 +38,7 @@ #ifdef HAVE_DLOPEN -#include "pkcs11.h" +#include "ref/pkcs11.h" struct p11_slot { int flags; @@ -65,6 +65,7 @@ CK_FUNCTION_LIST_PTR funcs; CK_ULONG num_slots; unsigned int ref; + unsigned int selected_slot; struct p11_slot *slot; }; @@ -213,47 +214,22 @@ return 1; } -static const RSA_METHOD * -get_p11_rsa_pkcs1_method(void) -{ - static const RSA_METHOD *p11_rsa_pkcs1_method; - RSA_METHOD *new_method; - - if (p11_rsa_pkcs1_method != NULL) - return p11_rsa_pkcs1_method; - - new_method = RSA_meth_new("hx509 PKCS11 PKCS#1 RSA", 0); - if (new_method == NULL) - return NULL; - - if (RSA_meth_set_pub_enc(new_method, p11_rsa_public_encrypt) != 1) - goto out; - - if (RSA_meth_set_pub_dec(new_method, p11_rsa_public_decrypt) != 1) - goto out; - - if (RSA_meth_set_priv_enc(new_method, p11_rsa_private_encrypt) != 1) - goto out; - - if (RSA_meth_set_priv_dec(new_method, p11_rsa_private_decrypt) != 1) - goto out; - - if (RSA_meth_set_init(new_method, p11_rsa_init) != 1) - goto out; - - if (RSA_meth_set_finish(new_method, p11_rsa_finish) != 1) - goto out; - - /* - * This might overwrite a previously-created method if multiple - * threads invoke this concurrently which will leak memory. - */ - p11_rsa_pkcs1_method = new_method; - return p11_rsa_pkcs1_method; -out: - RSA_meth_free(new_method); - return NULL; -} +static const RSA_METHOD p11_rsa_pkcs1_method = { + "hx509 PKCS11 PKCS#1 RSA", + p11_rsa_public_encrypt, + p11_rsa_public_decrypt, + p11_rsa_private_encrypt, + p11_rsa_private_decrypt, + NULL, + NULL, + p11_rsa_init, + p11_rsa_finish, + 0, + NULL, + NULL, + NULL, + NULL +}; /* * @@ -356,8 +332,10 @@ break; } - asprintf(&slot->name, "%.*s", - (int)i, slot_info.slotDescription); + ret = asprintf(&slot->name, "%.*s", (int)i, + slot_info.slotDescription); + if (ret == -1) + return ENOMEM; if ((slot_info.flags & CKF_TOKEN_PRESENT) == 0) return 0; @@ -366,7 +344,7 @@ if (ret) { hx509_set_error_string(context, 0, HX509_PKCS11_NO_TOKEN, "Failed to init PKCS11 slot %d " - "with error 0x08x", + "with error 0x%08x", num, ret); return HX509_PKCS11_NO_TOKEN; } @@ -448,7 +426,12 @@ memset(&prompt, 0, sizeof(prompt)); - asprintf(&str, "PIN code for %s: ", slot->name); + ret = asprintf(&str, "PIN code for %s: ", slot->name); + if (ret == -1 || str == NULL) { + if (context) + hx509_set_error_string(context, 0, ENOMEM, "out of memory"); + return ENOMEM; + } prompt.prompt = str; prompt.type = HX509_PROMPT_TYPE_PASSWORD; prompt.reply.data = pin; @@ -477,7 +460,18 @@ "Failed to login on slot id %d " "with error: 0x%08x", (int)slot->id, ret); - return HX509_PKCS11_LOGIN; + switch(ret) { + case CKR_PIN_LOCKED: + return HX509_PKCS11_PIN_LOCKED; + case CKR_PIN_EXPIRED: + return HX509_PKCS11_PIN_EXPIRED; + case CKR_PIN_INCORRECT: + return HX509_PKCS11_PIN_INCORRECT; + case CKR_USER_PIN_NOT_INITIALIZED: + return HX509_PKCS11_PIN_NOT_INITIALIZED; + default: + return HX509_PKCS11_LOGIN; + } } else slot->flags |= P11_LOGIN_DONE; @@ -633,8 +627,6 @@ hx509_private_key key; heim_octet_string localKeyId; int ret; - const RSA_METHOD *meth; - BIGNUM *n, *e; RSA *rsa; struct p11_rsa *p11rsa; @@ -654,15 +646,8 @@ * the pkcs11 specification, but some smartcards leaves it out, * let ignore any failure to fetch it. */ - n = getattr_bn(p, slot, session, object, CKA_MODULUS); - e = getattr_bn(p, slot, session, object, CKA_PUBLIC_EXPONENT); - if (RSA_set0_key(rsa, n, e, NULL) != 1) { - BN_free(n); - BN_free(e); - RSA_free(rsa); - hx509_private_key_free(&key); - return EINVAL; - } + rsa->n = getattr_bn(p, slot, session, object, CKA_MODULUS); + rsa->e = getattr_bn(p, slot, session, object, CKA_PUBLIC_EXPONENT); p11rsa = calloc(1, sizeof(*p11rsa)); if (p11rsa == NULL) @@ -678,10 +663,7 @@ if (p->ref == UINT_MAX) _hx509_abort("pkcs11 ref == UINT_MAX on alloc"); - meth = get_p11_rsa_pkcs1_method(); - if (meth == NULL) - _hx509_abort("failed to create RSA method"); - RSA_set_method(rsa, meth); + RSA_set_method(rsa, &p11_rsa_pkcs1_method); ret = RSA_set_app_data(rsa, p11rsa); if (ret != 1) _hx509_abort("RSA_set_app_data"); @@ -718,6 +700,7 @@ void *ptr, CK_ATTRIBUTE *query, int num_query) { struct hx509_collector *collector = ptr; + heim_error_t error = NULL; hx509_cert cert; int ret; @@ -727,10 +710,13 @@ return 0; } - ret = hx509_cert_init_data(context, query[1].pValue, - query[1].ulValueLen, &cert); - if (ret) + cert = hx509_cert_init_data(context, query[1].pValue, + query[1].ulValueLen, &error); + if (cert == NULL) { + ret = heim_error_get_code(error); + heim_release(error); return ret; + } if (p->ref == 0) _hx509_abort("pkcs11 ref == 0 on alloc"); @@ -755,9 +741,9 @@ if ((CK_LONG)query[2].ulValueLen != -1) { char *str; - asprintf(&str, "%.*s", - (int)query[2].ulValueLen, (char *)query[2].pValue); - if (str) { + ret = asprintf(&str, "%.*s", + (int)query[2].ulValueLen, (char *)query[2].pValue); + if (ret != -1 && str) { hx509_cert_set_friendly_name(cert, str); free(str); } @@ -848,6 +834,7 @@ } p->ref = 1; + p->selected_slot = 0; str = strchr(list, ','); if (str) @@ -857,15 +844,12 @@ strnext = strchr(str, ','); if (strnext) *strnext++ = '\0'; -#if 0 if (strncasecmp(str, "slot=", 5) == 0) p->selected_slot = atoi(str + 5); -#endif str = strnext; } p->dl_handle = dlopen(list, RTLD_NOW); - free(list); if (p->dl_handle == NULL) { ret = HX509_PKCS11_LOAD; hx509_set_error_string(context, 0, ret, @@ -946,11 +930,13 @@ } for (i = 0; i < p->num_slots; i++) { + if ((p->selected_slot != 0) && (slot_ids[i] != (p->selected_slot - 1))) + continue; ret = p11_init_slot(context, p, lock, slot_ids[i], i, &p->slot[i]); - if (ret) - break; - if (p->slot[i].flags & P11_TOKEN_PRESENT) - num_tokens++; + if (!ret) { + if (p->slot[i].flags & P11_TOKEN_PRESENT) + num_tokens++; + } } free(slot_ids); if (ret) @@ -961,10 +947,14 @@ } } + free(list); + *data = p; return 0; out: + if (list) + free(list); p11_release_module(p); return ret; } @@ -1214,7 +1204,9 @@ p11_iter_start, p11_iter, p11_iter_end, - p11_printinfo + p11_printinfo, + NULL, + NULL }; #endif /* HAVE_DLOPEN */ diff --git a/crypto/heimdal/lib/hx509/ks_p12.c b/crypto/heimdal/lib/hx509/ks_p12.c --- a/crypto/heimdal/lib/hx509/ks_p12.c +++ b/crypto/heimdal/lib/hx509/ks_p12.c @@ -130,6 +130,7 @@ const void *data, size_t length, const PKCS12_Attributes *attrs) { + heim_error_t error = NULL; heim_octet_string os; hx509_cert cert; PKCS12_CertBag cb; @@ -152,10 +153,13 @@ if (ret) return ret; - ret = hx509_cert_init_data(context, os.data, os.length, &cert); + cert = hx509_cert_init_data(context, os.data, os.length, &error); der_free_octet_string(&os); - if (ret) + if (cert == NULL) { + ret = heim_error_get_code(error); + heim_release(error); return ret; + } ret = _hx509_collector_certs_add(context, c, cert); if (ret) { @@ -697,7 +701,10 @@ NULL, p12_iter_start, p12_iter, - p12_iter_end + p12_iter_end, + NULL, + NULL, + NULL }; void diff --git a/crypto/heimdal/lib/hx509/libhx509-exports.def b/crypto/heimdal/lib/hx509/libhx509-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/libhx509-exports.def @@ -0,0 +1,238 @@ + +EXPORTS + _hx509_cert_assign_key + _hx509_cert_private_key + _hx509_certs_keys_free + _hx509_certs_keys_get + _hx509_expr_eval + _hx509_expr_free + _hx509_expr_parse + _hx509_generate_private_key + _hx509_generate_private_key_bits + _hx509_generate_private_key_free + _hx509_generate_private_key_init + _hx509_generate_private_key_is_ca + _hx509_map_file_os + _hx509_name_from_Name + hx509_private_key2SPKI + hx509_private_key_free + _hx509_private_key_ref + _hx509_request_add_dns_name + _hx509_request_add_email + hx509_request_free + hx509_request_get_SubjectPublicKeyInfo + hx509_request_get_name + hx509_request_init + _hx509_request_parse + _hx509_request_print + hx509_request_set_SubjectPublicKeyInfo +; _hx509_request_set_email + hx509_request_set_name + _hx509_request_to_pkcs10 + _hx509_request_to_pkcs10 + _hx509_unmap_file_os + _hx509_write_file + hx509_bitstring_print + hx509_ca_sign + hx509_ca_sign_self + hx509_ca_tbs_add_crl_dp_uri + hx509_ca_tbs_add_eku + hx509_ca_tbs_add_san_hostname + hx509_ca_tbs_add_san_jid + hx509_ca_tbs_add_san_ms_upn + hx509_ca_tbs_add_san_otherName + hx509_ca_tbs_add_san_pkinit + hx509_ca_tbs_add_san_rfc822name + hx509_ca_tbs_free + hx509_ca_tbs_init + hx509_ca_tbs_set_ca + hx509_ca_tbs_set_domaincontroller + hx509_ca_tbs_set_notAfter + hx509_ca_tbs_set_notAfter_lifetime + hx509_ca_tbs_set_notBefore + hx509_ca_tbs_set_proxy + hx509_ca_tbs_set_serialnumber + hx509_ca_tbs_set_signature_algorithm + hx509_ca_tbs_set_spki + hx509_ca_tbs_set_subject + hx509_ca_tbs_set_template + hx509_ca_tbs_subject_expand + hx509_ca_tbs_template_units +; hx509_cert +; hx509_cert_attribute + hx509_cert_binary + hx509_cert_check_eku + hx509_cert_cmp + hx509_cert_find_subjectAltName_otherName + hx509_cert_free + hx509_cert_get_SPKI + hx509_cert_get_SPKI_AlgorithmIdentifier + hx509_cert_get_attribute + hx509_cert_get_base_subject + hx509_cert_get_friendly_name + hx509_cert_get_issuer + hx509_cert_get_notAfter + hx509_cert_get_notBefore + hx509_cert_get_serialnumber + hx509_cert_get_subject + hx509_cert_init + hx509_cert_init_data + hx509_cert_keyusage_print + hx509_cert_ref + hx509_cert_set_friendly_name + hx509_certs_add + hx509_certs_append + hx509_certs_end_seq + hx509_certs_ref + hx509_certs_filter + hx509_certs_find + hx509_certs_free + hx509_certs_info + hx509_certs_init +; hx509_certs_iter + hx509_certs_iter_f + hx509_certs_merge + hx509_certs_next_cert + hx509_certs_start_seq + hx509_certs_store + hx509_ci_print_names + hx509_clear_error_string + hx509_cms_create_signed + hx509_cms_create_signed_1 + hx509_cms_decrypt_encrypted + hx509_cms_envelope_1 + hx509_cms_unenvelope + hx509_cms_unwrap_ContentInfo + hx509_cms_verify_signed + hx509_cms_wrap_ContentInfo + hx509_context_free + hx509_context_init + hx509_context_set_missing_revoke + hx509_crl_add_revoked_certs + hx509_crl_alloc + hx509_crl_free + hx509_crl_lifetime + hx509_crl_sign + hx509_crypto_aes128_cbc + hx509_crypto_aes256_cbc + hx509_crypto_allow_weak + hx509_crypto_available + hx509_crypto_decrypt + hx509_crypto_des_rsdi_ede3_cbc + hx509_crypto_destroy + hx509_crypto_encrypt + hx509_crypto_enctype_by_name + hx509_crypto_free_algs + hx509_crypto_get_params + hx509_crypto_init + hx509_crypto_provider + hx509_crypto_select + hx509_crypto_set_key_data + hx509_crypto_set_key_name + hx509_crypto_set_padding + hx509_crypto_set_params + hx509_crypto_set_random_key + hx509_env_add + hx509_env_add_binding + hx509_env_find + hx509_env_find_binding + hx509_env_free +; hx509_env_init + hx509_env_lfind + hx509_err + hx509_free_error_string + hx509_free_octet_string_list + hx509_general_name_unparse + hx509_get_error_string + hx509_get_one_cert + hx509_lock_add_cert + hx509_lock_add_certs + hx509_lock_add_password + hx509_lock_command_string + hx509_lock_free + hx509_lock_init + hx509_lock_prompt + hx509_lock_reset_certs + hx509_lock_reset_passwords + hx509_lock_reset_promper + hx509_lock_set_prompter + hx509_name_binary + hx509_name_cmp + hx509_name_copy + hx509_name_expand + hx509_name_free + hx509_name_is_null_p + hx509_name_normalize + hx509_name_to_Name + hx509_name_to_string + hx509_ocsp_request + hx509_ocsp_verify + hx509_oid_print + hx509_oid_sprint + hx509_parse_name + hx509_peer_info_add_cms_alg + hx509_peer_info_alloc + hx509_peer_info_free + hx509_peer_info_set_cert + hx509_peer_info_set_cms_algs + hx509_pem_add_header + hx509_pem_find_header + hx509_pem_free_header + hx509_pem_read + hx509_pem_write + hx509_print_stdout + hx509_print_cert + hx509_prompt_hidden + hx509_query_alloc + hx509_query_free + hx509_query_match_cmp_func + hx509_query_match_eku + hx509_query_match_expr + hx509_query_match_friendly_name + hx509_query_match_issuer_serial + hx509_query_match_option + hx509_query_statistic_file + hx509_query_unparse_stats + hx509_revoke_add_crl + hx509_revoke_add_ocsp + hx509_revoke_free + hx509_revoke_init + hx509_revoke_ocsp_print + hx509_revoke_print + hx509_revoke_verify + hx509_set_error_string + hx509_set_error_stringv + hx509_signature_md5 + hx509_signature_rsa + hx509_signature_rsa_with_md5 + hx509_signature_rsa_with_sha1 + hx509_signature_rsa_with_sha256 + hx509_signature_rsa_with_sha384 + hx509_signature_rsa_with_sha512 + hx509_signature_sha1 + hx509_signature_sha256 + hx509_signature_sha384 + hx509_signature_sha512 + hx509_unparse_der_name + hx509_validate_cert + hx509_validate_ctx_add_flags + hx509_validate_ctx_free + hx509_validate_ctx_init + hx509_validate_ctx_set_print + hx509_verify_attach_anchors + hx509_verify_attach_revoke + hx509_verify_ctx_f_allow_default_trustanchors + hx509_verify_destroy_ctx + hx509_verify_hostname + hx509_verify_init_ctx + hx509_verify_path + hx509_verify_set_max_depth + hx509_verify_set_proxy_certificate + hx509_verify_set_strict_rfc3280_verification + hx509_verify_set_time + hx509_verify_signature + hx509_xfree + initialize_hx_error_table_r + +; pkcs11 symbols + C_GetFunctionList diff --git a/crypto/heimdal/lib/hx509/lock.c b/crypto/heimdal/lib/hx509/lock.c --- a/crypto/heimdal/lib/hx509/lock.c +++ b/crypto/heimdal/lib/hx509/lock.c @@ -47,7 +47,10 @@ }; static struct hx509_lock_data empty_lock_data = { - { 0, NULL } + { 0, NULL }, + NULL, + NULL, + NULL }; hx509_lock _hx509_empty_lock = &empty_lock_data; diff --git a/crypto/heimdal/lib/hx509/name.c b/crypto/heimdal/lib/hx509/name.c --- a/crypto/heimdal/lib/hx509/name.c +++ b/crypto/heimdal/lib/hx509/name.c @@ -238,15 +238,22 @@ size_t k; ret = wind_ucs2utf8_length(bmp, bmplen, &k); - if (ret) + if (ret) { + free(oidname); + free(*str); + *str = NULL; return ret; + } ss = malloc(k + 1); if (ss == NULL) _hx509_abort("allocation failure"); /* XXX */ ret = wind_ucs2utf8(bmp, bmplen, ss, NULL); if (ret) { + free(oidname); free(ss); + free(*str); + *str = NULL; return ret; } ss[k] = '\0'; @@ -263,8 +270,12 @@ size_t k; ret = wind_ucs4utf8_length(uni, unilen, &k); - if (ret) + if (ret) { + free(oidname); + free(*str); + *str = NULL; return ret; + } ss = malloc(k + 1); if (ss == NULL) @@ -272,6 +283,9 @@ ret = wind_ucs4utf8(uni, unilen, ss, NULL); if (ret) { free(ss); + free(oidname); + free(*str); + *str = NULL; return ret; } ss[k] = '\0'; @@ -966,7 +980,7 @@ Name dir; char *s; memset(&dir, 0, sizeof(dir)); - dir.element = name->u.directoryName.element; + dir.element = (enum Name_enum)name->u.directoryName.element; dir.u.rdnSequence = name->u.directoryName.u.rdnSequence; ret = _hx509_unparse_Name(&dir, &s); if (ret) diff --git a/crypto/heimdal/lib/hx509/print.c b/crypto/heimdal/lib/hx509/print.c --- a/crypto/heimdal/lib/hx509/print.c +++ b/crypto/heimdal/lib/hx509/print.c @@ -234,7 +234,7 @@ } /* - * Dont Care, SHOULD critical, SHOULD NOT critical, MUST critical, + * Don't Care, SHOULD critical, SHOULD NOT critical, MUST critical, * MUST NOT critical */ enum critical_flag { D_C = 0, S_C, S_N_C, M_C, M_N_C }; @@ -969,7 +969,7 @@ } validate_print(ctx, HX509_VALIDATE_F_VALIDATE|HX509_VALIDATE_F_VERBOSE, - "checking extention: %s\n", + "checking extension: %s\n", check_extension[j].name); (*check_extension[j].func)(ctx, &status, @@ -977,7 +977,7 @@ &t->extensions->val[i]); } } else - validate_print(ctx, HX509_VALIDATE_F_VERBOSE, "no extentions\n"); + validate_print(ctx, HX509_VALIDATE_F_VERBOSE, "no extensions\n"); if (status.isca) { if (!status.haveSKI) diff --git a/crypto/heimdal/lib/hx509/ref/pkcs11.h b/crypto/heimdal/lib/hx509/ref/pkcs11.h --- a/crypto/heimdal/lib/hx509/ref/pkcs11.h +++ b/crypto/heimdal/lib/hx509/ref/pkcs11.h @@ -64,8 +64,9 @@ (you may use a macro with a different name to keep track of your versions). */ #define CRYPTOKI_VERSION_MAJOR 2 -#define CRYPTOKI_VERSION_MINOR 20 -#define CRYPTOKI_VERSION_REVISION 6 +#define CRYPTOKI_VERSION_MINOR 30 +#define CRYPTOKI_VERSION_REVISION 0 +#define CRYPTOKI_VERSION_AMENDMENT 0 /* Compatibility interface is default, unless CRYPTOKI_GNU is @@ -91,7 +92,11 @@ #else +#if defined(CRYPTOKI_VISIBILITY) && defined(CRYPTOKI_EXPORTS) +#define CK_SPEC __attribute__((visibility("default"))) +#else #define CK_SPEC +#endif #endif @@ -162,6 +167,34 @@ #define min_key_size ulMinKeySize #define max_key_size ulMaxKeySize +#define hash_alg hashAlg +#define source_data pSourceData +#define source_data_len ulSourceDataLen + +#define slen sLen + +#define ck_ec_kdf_type_t CK_EC_KDF_TYPE + +#define shared_data_len ulSharedDataLen +#define shared_data pSharedData +#define public_data_len ulPublicDataLen +#define public_data pPublicData + +#define private_data_len ulPrivateDataLen +#define private_data hPrivateData +#define public_data_len2 ulPublicDataLen2 +#define public_data2 pPublicData2 + +#define public_key publicKey + +#define ck_x9_42_dh_kdf_type_t CK_X9_42_DH_KDF_TYPE + +#define other_info_len ulOtherInfoLen +#define other_info pOtherInfo + +#define data pData +#define len ulLen + #define ck_rv_t CK_RV #define ck_notify_t CK_NOTIFY @@ -205,7 +238,7 @@ typedef unsigned long ck_notification_t; #define CKN_SURRENDER (0) - +#define CKN_OTP_CHANGED (1) typedef unsigned long ck_slot_id_t; @@ -267,6 +300,7 @@ #define CKF_SO_PIN_FINAL_TRY (1 << 21) #define CKF_SO_PIN_LOCKED (1 << 22) #define CKF_SO_PIN_TO_BE_CHANGED (1 << 23) +#define CKF_ERROR_STATE (1 << 24) #define CK_UNAVAILABLE_INFORMATION ((unsigned long) -1) #define CK_EFFECTIVELY_INFINITE (0) @@ -318,7 +352,8 @@ #define CKO_HW_FEATURE (5) #define CKO_DOMAIN_PARAMETERS (6) #define CKO_MECHANISM (7) -#define CKO_VENDOR_DEFINED ((unsigned long) (1 << 31)) +#define CKO_OTP_KEY (8) +#define CKO_VENDOR_DEFINED ((unsigned long) (1ul << 31)) typedef unsigned long ck_hw_feature_type_t; @@ -326,7 +361,7 @@ #define CKH_MONOTONIC_COUNTER (1) #define CKH_CLOCK (2) #define CKH_USER_INTERFACE (3) -#define CKH_VENDOR_DEFINED ((unsigned long) (1 << 31)) +#define CKH_VENDOR_DEFINED ((unsigned long) (1ul << 31)) typedef unsigned long ck_key_type_t; @@ -346,6 +381,7 @@ #define CKK_DES3 (0x15) #define CKK_CAST (0x16) #define CKK_CAST3 (0x17) +#define CKK_CAST5 (0x18) #define CKK_CAST128 (0x18) #define CKK_RC5 (0x19) #define CKK_IDEA (0x1a) @@ -356,7 +392,24 @@ #define CKK_AES (0x1f) #define CKK_BLOWFISH (0x20) #define CKK_TWOFISH (0x21) -#define CKK_VENDOR_DEFINED ((unsigned long) (1 << 31)) +#define CKK_SECURID (0x22) +#define CKK_HOTP (0x23) +#define CKK_ACTI (0x24) +#define CKK_CAMELLIA (0x25) +#define CKK_ARIA (0x26) +#define CKK_MD5_HMAC (0x27) +#define CKK_SHA_1_HMAC (0x28) +#define CKK_RIPEMD128_HMAC (0x29) +#define CKK_RIPEMD160_HMAC (0x2A) +#define CKK_SHA256_HMAC (0x2B) +#define CKK_SHA384_HMAC (0x2C) +#define CKK_SHA512_HMAC (0x2D) +#define CKK_SHA224_HMAC (0x2E) +#define CKK_SEED (0x2F) +#define CKK_GOSTR3410 (0x30) +#define CKK_GOSTR3411 (0x31) +#define CKK_GOST28147 (0x32) +#define CKK_VENDOR_DEFINED ((unsigned long) (1ul << 31)) typedef unsigned long ck_certificate_type_t; @@ -364,8 +417,17 @@ #define CKC_X_509 (0) #define CKC_X_509_ATTR_CERT (1) #define CKC_WTLS (2) -#define CKC_VENDOR_DEFINED ((unsigned long) (1 << 31)) +#define CKC_VENDOR_DEFINED ((unsigned long) (1ul << 31)) +#define CKC_OPENPGP (CKC_VENDOR_DEFINED|0x00504750) + +#define CK_OTP_FORMAT_DECIMAL (0) +#define CK_OTP_FORMAT_HEXADECIMAL (1) +#define CK_OTP_FORMAT_ALPHANUMERIC (2) +#define CK_OTP_FORMAT_BINARY (3) +#define CK_OTP_PARAM_IGNORED (0) +#define CK_OTP_PARAM_OPTIONAL (1) +#define CK_OTP_PARAM_MANDATORY (2) typedef unsigned long ck_attribute_type_t; @@ -388,6 +450,7 @@ #define CKA_URL (0x89) #define CKA_HASH_OF_SUBJECT_PUBLIC_KEY (0x8a) #define CKA_HASH_OF_ISSUER_PUBLIC_KEY (0x8b) +#define CKA_NAME_HASH_ALGORITHM (0x8c) #define CKA_CHECK_VALUE (0x90) #define CKA_KEY_TYPE (0x100) #define CKA_SUBJECT (0x101) @@ -418,6 +481,7 @@ #define CKA_BASE (0x132) #define CKA_PRIME_BITS (0x133) #define CKA_SUB_PRIME_BITS (0x134) +#define CKA_SUBPRIME_BITS (0x134) #define CKA_VALUE_BITS (0x160) #define CKA_VALUE_LEN (0x161) #define CKA_EXTRACTABLE (0x162) @@ -426,6 +490,7 @@ #define CKA_ALWAYS_SENSITIVE (0x165) #define CKA_KEY_GEN_MECHANISM (0x166) #define CKA_MODIFIABLE (0x170) +#define CKA_COPYABLE (0x171) #define CKA_ECDSA_PARAMS (0x180) #define CKA_EC_PARAMS (0x180) #define CKA_EC_POINT (0x181) @@ -433,6 +498,23 @@ #define CKA_AUTH_PIN_FLAGS (0x201) #define CKA_ALWAYS_AUTHENTICATE (0x202) #define CKA_WRAP_WITH_TRUSTED (0x210) +#define CKA_OTP_FORMAT (0x220) +#define CKA_OTP_LENGTH (0x221) +#define CKA_OTP_TIME_INTERVAL (0x222) +#define CKA_OTP_USER_FRIENDLY_MODE (0x223) +#define CKA_OTP_CHALLENGE_REQUIREMENT (0x224) +#define CKA_OTP_TIME_REQUIREMENT (0x225) +#define CKA_OTP_COUNTER_REQUIREMENT (0x226) +#define CKA_OTP_PIN_REQUIREMENT (0x227) +#define CKA_OTP_COUNTER (0x22E) +#define CKA_OTP_TIME (0x22F) +#define CKA_OTP_USER_IDENTIFIER (0x22A) +#define CKA_OTP_SERVICE_IDENTIFIER (0x22B) +#define CKA_OTP_SERVICE_LOGO (0x22C) +#define CKA_OTP_SERVICE_LOGO_TYPE (0x22D) +#define CKA_GOSTR3410_PARAMS (0x250) +#define CKA_GOSTR3411_PARAMS (0x251) +#define CKA_GOST28147_PARAMS (0x252) #define CKA_HW_FEATURE_TYPE (0x300) #define CKA_RESET_ON_INIT (0x301) #define CKA_HAS_RESET (0x302) @@ -452,8 +534,9 @@ #define CKA_SUPPORTED_CMS_ATTRIBUTES (0x503) #define CKA_WRAP_TEMPLATE (CKF_ARRAY_ATTRIBUTE | 0x211) #define CKA_UNWRAP_TEMPLATE (CKF_ARRAY_ATTRIBUTE | 0x212) +#define CKA_DERIVE_TEMPLATE (CKF_ARRAY_ATTRIBUTE | 0x213) #define CKA_ALLOWED_MECHANISMS (CKF_ARRAY_ATTRIBUTE | 0x600) -#define CKA_VENDOR_DEFINED ((unsigned long) (1 << 31)) +#define CKA_VENDOR_DEFINED ((unsigned long) (1ul << 31)) struct ck_attribute @@ -492,6 +575,10 @@ #define CKM_DSA_KEY_PAIR_GEN (0x10) #define CKM_DSA (0x11) #define CKM_DSA_SHA1 (0x12) +#define CKM_DSA_SHA224 (0x13) +#define CKM_DSA_SHA256 (0x14) +#define CKM_DSA_SHA384 (0x15) +#define CKM_DSA_SHA512 (0x16) #define CKM_DH_PKCS_KEY_PAIR_GEN (0x20) #define CKM_DH_PKCS_DERIVE (0x21) #define CKM_X9_42_DH_KEY_PAIR_GEN (0x30) @@ -504,6 +591,8 @@ #define CKM_SHA256_RSA_PKCS_PSS (0x43) #define CKM_SHA384_RSA_PKCS_PSS (0x44) #define CKM_SHA512_RSA_PKCS_PSS (0x45) +#define CKM_SHA224_RSA_PKCS (0x46) +#define CKM_SHA224_RSA_PKCS_PSS (0x47) #define CKM_RC2_KEY_GEN (0x100) #define CKM_RC2_ECB (0x101) #define CKM_RC2_CBC (0x102) @@ -525,12 +614,18 @@ #define CKM_DES3_MAC (0x134) #define CKM_DES3_MAC_GENERAL (0x135) #define CKM_DES3_CBC_PAD (0x136) +#define CKM_DES3_CMAC_GENERAL (0x137) +#define CKM_DES3_CMAC (0x138) #define CKM_CDMF_KEY_GEN (0x140) #define CKM_CDMF_ECB (0x141) #define CKM_CDMF_CBC (0x142) #define CKM_CDMF_MAC (0x143) #define CKM_CDMF_MAC_GENERAL (0x144) #define CKM_CDMF_CBC_PAD (0x145) +#define CKM_DES_OFB64 (0x150) +#define CKM_DES_OFB8 (0x151) +#define CKM_DES_CFB64 (0x152) +#define CKM_DES_CFB8 (0x153) #define CKM_MD2 (0x200) #define CKM_MD2_HMAC (0x201) #define CKM_MD2_HMAC_GENERAL (0x202) @@ -549,12 +644,21 @@ #define CKM_SHA256 (0x250) #define CKM_SHA256_HMAC (0x251) #define CKM_SHA256_HMAC_GENERAL (0x252) +#define CKM_SHA224 (0x255) +#define CKM_SHA224_HMAC (0x256) +#define CKM_SHA224_HMAC_GENERAL (0x257) #define CKM_SHA384 (0x260) #define CKM_SHA384_HMAC (0x261) #define CKM_SHA384_HMAC_GENERAL (0x262) #define CKM_SHA512 (0x270) #define CKM_SHA512_HMAC (0x271) #define CKM_SHA512_HMAC_GENERAL (0x272) +#define CKM_SECURID_KEY_GEN (0x280) +#define CKM_SECURID (0x282) +#define CKM_HOTP_KEY_GEN (0x290) +#define CKM_HOTP (0x291) +#define CKM_ACTI (0x2A0) +#define CKM_ACTI_KEY_GEN (0x2A1) #define CKM_CAST_KEY_GEN (0x300) #define CKM_CAST_ECB (0x301) #define CKM_CAST_CBC (0x302) @@ -605,11 +709,16 @@ #define CKM_TLS_MASTER_KEY_DERIVE (0x375) #define CKM_TLS_KEY_AND_MAC_DERIVE (0x376) #define CKM_TLS_MASTER_KEY_DERIVE_DH (0x377) +#define CKM_TLS_PRF (0x378) #define CKM_SSL3_MD5_MAC (0x380) #define CKM_SSL3_SHA1_MAC (0x381) #define CKM_MD5_KEY_DERIVATION (0x390) #define CKM_MD2_KEY_DERIVATION (0x391) #define CKM_SHA1_KEY_DERIVATION (0x392) +#define CKM_SHA256_KEY_DERIVATION (0x393) +#define CKM_SHA384_KEY_DERIVATION (0x394) +#define CKM_SHA512_KEY_DERIVATION (0x395) +#define CKM_SHA224_KEY_DERIVATION (0x396) #define CKM_PBE_MD2_DES_CBC (0x3a0) #define CKM_PBE_MD5_DES_CBC (0x3a1) #define CKM_PBE_MD5_CAST_CBC (0x3a2) @@ -626,8 +735,43 @@ #define CKM_PBE_SHA1_RC2_40_CBC (0x3ab) #define CKM_PKCS5_PBKD2 (0x3b0) #define CKM_PBA_SHA1_WITH_SHA1_HMAC (0x3c0) +#define CKM_WTLS_PRE_MASTER_KEY_GEN (0x3d0) +#define CKM_WTLS_MASTER_KEY_DERIVE (0x3d1) +#define CKM_WTLS_MASTER_KEY_DERIVE_DH_ECC (0x3d2) +#define CKM_WTLS_PRF (0x3d3) +#define CKM_WTLS_SERVER_KEY_AND_MAC_DERIVE (0x3d4) +#define CKM_WTLS_CLIENT_KEY_AND_MAC_DERIVE (0x3d5) #define CKM_KEY_WRAP_LYNKS (0x400) #define CKM_KEY_WRAP_SET_OAEP (0x401) +#define CKM_CMS_SIG (0x500) +#define CKM_KIP_DERIVE (0x510) +#define CKM_KIP_WRAP (0x511) +#define CKM_KIP_MAC (0x512) +#define CKM_CAMELLIA_KEY_GEN (0x550) +#define CKM_CAMELLIA_ECB (0x551) +#define CKM_CAMELLIA_CBC (0x552) +#define CKM_CAMELLIA_MAC (0x553) +#define CKM_CAMELLIA_MAC_GENERAL (0x554) +#define CKM_CAMELLIA_CBC_PAD (0x555) +#define CKM_CAMELLIA_ECB_ENCRYPT_DATA (0x556) +#define CKM_CAMELLIA_CBC_ENCRYPT_DATA (0x557) +#define CKM_CAMELLIA_CTR (0x558) +#define CKM_ARIA_KEY_GEN (0x560) +#define CKM_ARIA_ECB (0x561) +#define CKM_ARIA_CBC (0x562) +#define CKM_ARIA_MAC (0x563) +#define CKM_ARIA_MAC_GENERAL (0x564) +#define CKM_ARIA_CBC_PAD (0x565) +#define CKM_ARIA_ECB_ENCRYPT_DATA (0x566) +#define CKM_ARIA_CBC_ENCRYPT_DATA (0x567) +#define CKM_SEED_KEY_GEN (0x650) +#define CKM_SEED_ECB (0x651) +#define CKM_SEED_CBC (0x652) +#define CKM_SEED_MAC (0x653) +#define CKM_SEED_MAC_GENERAL (0x654) +#define CKM_SEED_CBC_PAD (0x655) +#define CKM_SEED_ECB_ENCRYPT_DATA (0x656) +#define CKM_SEED_CBC_ENCRYPT_DATA (0x657) #define CKM_SKIPJACK_KEY_GEN (0x1000) #define CKM_SKIPJACK_ECB64 (0x1001) #define CKM_SKIPJACK_CBC64 (0x1002) @@ -653,6 +797,10 @@ #define CKM_EC_KEY_PAIR_GEN (0x1040) #define CKM_ECDSA (0x1041) #define CKM_ECDSA_SHA1 (0x1042) +#define CKM_ECDSA_SHA224 (0x1043) +#define CKM_ECDSA_SHA256 (0x1044) +#define CKM_ECDSA_SHA384 (0x1045) +#define CKM_ECDSA_SHA512 (0x1046) #define CKM_ECDH1_DERIVE (0x1050) #define CKM_ECDH1_COFACTOR_DERIVE (0x1051) #define CKM_ECMQV_DERIVE (0x1052) @@ -669,10 +817,48 @@ #define CKM_AES_MAC (0x1083) #define CKM_AES_MAC_GENERAL (0x1084) #define CKM_AES_CBC_PAD (0x1085) +#define CKM_AES_CTR (0x1086) +#define CKM_AES_GCM (0x1087) +#define CKM_AES_CCM (0x1088) +#define CKM_AES_CTS (0x1089) +#define CKM_AES_CMAC (0x108a) +#define CKM_AES_CMAC_GENERAL (0x108b) +#define CKM_BLOWFISH_KEY_GEN (0x1090) +#define CKM_BLOWFISH_CBC (0x1091) +#define CKM_TWOFISH_KEY_GEN (0x1092) +#define CKM_TWOFISH_CBC (0x1093) +#define CKM_BLOWFISH_CBC_PAD (0x1094) +#define CKM_TWOFISH_CBC_PAD (0x1095) +#define CKM_DES_ECB_ENCRYPT_DATA (0x1100) +#define CKM_DES_CBC_ENCRYPT_DATA (0x1101) +#define CKM_DES3_ECB_ENCRYPT_DATA (0x1102) +#define CKM_DES3_CBC_ENCRYPT_DATA (0x1103) +#define CKM_AES_ECB_ENCRYPT_DATA (0x1104) +#define CKM_AES_CBC_ENCRYPT_DATA (0x1105) +#define CKM_GOSTR3410_KEY_PAIR_GEN (0x1200) +#define CKM_GOSTR3410 (0x1201) +#define CKM_GOSTR3410_WITH_GOSTR3411 (0x1202) +#define CKM_GOSTR3410_KEY_WRAP (0x1203) +#define CKM_GOSTR3410_DERIVE (0x1204) +#define CKM_GOSTR3411 (0x1210) +#define CKM_GOSTR3411_HMAC (0x1211) +#define CKM_GOST28147_KEY_GEN (0x1220) +#define CKM_GOST28147_ECB (0x1221) +#define CKM_GOST28147 (0x1222) +#define CKM_GOST28147_MAC (0x1223) +#define CKM_GOST28147_KEY_WRAP (0x1224) #define CKM_DSA_PARAMETER_GEN (0x2000) #define CKM_DH_PKCS_PARAMETER_GEN (0x2001) #define CKM_X9_42_DH_PARAMETER_GEN (0x2002) -#define CKM_VENDOR_DEFINED ((unsigned long) (1 << 31)) +#define CKM_AES_OFB (0x2104) +#define CKM_AES_CFB64 (0x2105) +#define CKM_AES_CFB8 (0x2106) +#define CKM_AES_CFB128 (0x2107) +#define CKM_AES_KEY_WRAP (0x2109) +#define CKM_AES_KEY_WRAP_PAD (0x210a) +#define CKM_RSA_PKCS_TPM_1_1 (0x4001) +#define CKM_RSA_PKCS_OAEPTPM_1_1 (0x4002) +#define CKM_VENDOR_DEFINED ((unsigned long) (1ul << 31)) struct ck_mechanism @@ -703,8 +889,137 @@ #define CKF_WRAP (1 << 17) #define CKF_UNWRAP (1 << 18) #define CKF_DERIVE (1 << 19) -#define CKF_EXTENSION ((unsigned long) (1 << 31)) +#define CKF_EC_F_P (1 << 20) +#define CKF_EC_F_2M (1 << 21) +#define CKF_EC_ECPARAMETERS (1 << 22) +#define CKF_EC_NAMEDCURVE (1 << 23) +#define CKF_EC_UNCOMPRESS (1 << 24) +#define CKF_EC_COMPRESS (1 << 25) +#define CKF_EXTENSION ((unsigned long) (1ul << 31)) + + +/* The following MGFs are defined */ +#define CKG_MGF1_SHA1 (0x00000001) +#define CKG_MGF1_SHA256 (0x00000002) +#define CKG_MGF1_SHA384 (0x00000003) +#define CKG_MGF1_SHA512 (0x00000004) +#define CKG_MGF1_SHA224 (0x00000005) + +#define CKZ_DATA_SPECIFIED (0x00000001) + +struct ck_rsa_pkcs_oaep_params { + ck_mechanism_type_t hash_alg; + unsigned long mgf; + unsigned long source; + void *source_data; + unsigned long source_data_len; +}; + +struct ck_rsa_pkcs_pss_params { + ck_mechanism_type_t hash_alg; + unsigned long mgf; + unsigned long slen; +}; + +typedef unsigned long ck_ec_kdf_type_t; + +/* The following EC Key Derivation Functions are defined */ +#define CKD_NULL (0x00000001) +#define CKD_SHA1_KDF (0x00000002) + +struct ck_ecdh1_derive_params { + ck_ec_kdf_type_t kdf; + unsigned long shared_data_len; + unsigned char *shared_data; + unsigned long public_data_len; + unsigned char *public_data; +}; + +struct ck_ecdh2_derive_params { + ck_ec_kdf_type_t kdf; + unsigned long shared_data_len; + unsigned char *shared_data; + unsigned long public_data_len; + unsigned char *public_data; + unsigned long private_data_len; + ck_object_handle_t private_data; + unsigned long public_data_len2; + unsigned char *public_data2; +}; + +struct ck_ecmqv_derive_params { + ck_ec_kdf_type_t kdf; + unsigned long shared_data_len; + unsigned char *shared_data; + unsigned long public_data_len; + unsigned char *public_data; + unsigned long private_data_len; + ck_object_handle_t private_data; + unsigned long public_data_len2; + unsigned char *public_data2; + ck_object_handle_t public_key; +}; +typedef unsigned long ck_x9_42_dh_kdf_type_t; + +/* The following X9.42 DH key derivation functions are defined */ +#define CKD_SHA1_KDF_ASN1 (0x00000003) +#define CKD_SHA1_KDF_CONCATENATE (0x00000004) +#define CKD_SHA224_KDF (0x00000005) +#define CKD_SHA256_KDF (0x00000006) +#define CKD_SHA384_KDF (0x00000007) +#define CKD_SHA512_KDF (0x00000008) +#define CKD_CPDIVERSIFY_KDF (0x00000009) + +struct ck_x9_42_dh1_derive_params { + ck_x9_42_dh_kdf_type_t kdf; + unsigned long other_info_len; + unsigned char *other_info; + unsigned long public_data_len; + unsigned char *public_data; +}; + +struct ck_x9_42_dh2_derive_params { + ck_x9_42_dh_kdf_type_t kdf; + unsigned long other_info_len; + unsigned char *other_info; + unsigned long public_data_len; + unsigned char *public_data; + unsigned long private_data_len; + ck_object_handle_t private_data; + unsigned long public_data_len2; + unsigned char *public_data2; +}; + +struct ck_x9_42_mqv_derive_params { + ck_x9_42_dh_kdf_type_t kdf; + unsigned long other_info_len; + unsigned char *other_info; + unsigned long public_data_len; + unsigned char *public_data; + unsigned long private_data_len; + ck_object_handle_t private_data; + unsigned long public_data_len2; + unsigned char *public_data2; + ck_object_handle_t public_key; +}; + +struct ck_des_cbc_encrypt_data_params { + unsigned char iv[8]; + unsigned char *data; + unsigned long length; +}; + +struct ck_aes_cbc_encrypt_data_params { + unsigned char iv[16]; + unsigned char *data; + unsigned long length; +}; + +struct ck_key_derivation_string_data { + unsigned char *data; + unsigned long len; +}; /* Flags for C_WaitForSlotEvent. */ #define CKF_DONT_BLOCK (1) @@ -1108,6 +1423,7 @@ #define CKR_ATTRIBUTE_SENSITIVE (0x11) #define CKR_ATTRIBUTE_TYPE_INVALID (0x12) #define CKR_ATTRIBUTE_VALUE_INVALID (0x13) +#define CKR_COPY_PROHIBITED (0x1A) #define CKR_DATA_INVALID (0x20) #define CKR_DATA_LEN_RANGE (0x21) #define CKR_DEVICE_ERROR (0x30) @@ -1178,8 +1494,15 @@ #define CKR_CRYPTOKI_ALREADY_INITIALIZED (0x191) #define CKR_MUTEX_BAD (0x1a0) #define CKR_MUTEX_NOT_LOCKED (0x1a1) +#define CKR_NEW_PIN_MODE (0x1b0) +#define CKR_NEXT_OTP (0x1b1) +#define CKR_EXCEEDED_MAX_ITERATIONS (0x1b5) +#define CKR_FIPS_SELF_TEST_FAILED (0x1b6) +#define CKR_LIBRARY_LOAD_FAILED (0x1b7) +#define CKR_PIN_TOO_WEAK (0x1b8) +#define CKR_PUBLIC_KEY_INVALID (0x1b9) #define CKR_FUNCTION_REJECTED (0x200) -#define CKR_VENDOR_DEFINED ((unsigned long) (1 << 31)) +#define CKR_VENDOR_DEFINED ((unsigned long) (1ul << 31)) @@ -1253,6 +1576,24 @@ typedef struct ck_mechanism_info CK_MECHANISM_INFO; typedef struct ck_mechanism_info *CK_MECHANISM_INFO_PTR; +typedef struct ck_rsa_pkcs_oaep_params CK_RSA_PKCS_OAEP_PARAMS; +typedef struct ck_rsa_pkcs_oaep_params *CK_RSA_PKCS_OAEP_PARAMS_PTR; + +typedef struct ck_rsa_pkcs_pss_params CK_RSA_PKCS_PSS_PARAMS; +typedef struct ck_rsa_pkcs_pss_params *CK_RSA_PKCS_PSS_PARAMS_PTR; + +typedef struct ck_ecdh1_derive_params CK_ECDH1_DERIVE_PARAMS; +typedef struct ck_ecdh1_derive_params *CK_ECDH1_DERIVE_PARAMS_PTR; + +typedef struct ck_des_cbc_encrypt_data_params CK_DES_CBC_ENCRYPT_DATA_PARAMS; +typedef struct ck_des_cbc_encrypt_data_params *CK_DES_CBC_ENCRYPT_DATA_PARAMS_PTR; + +typedef struct ck_aes_cbc_encrypt_data_params CK_AES_CBC_ENCRYPT_DATA_PARAMS; +typedef struct ck_aes_cbc_encrypt_data_params *CK_AES_CBC_ENCRYPT_DATA_PARAMS_PTR; + +typedef struct ck_key_derivation_string_data CK_KEY_DERIVATION_STRING_DATA; +typedef struct ck_key_derivation_string_data *CK_KEY_DERIVATION_STRING_DATA_PTR; + typedef struct ck_function_list CK_FUNCTION_LIST; typedef struct ck_function_list *CK_FUNCTION_LIST_PTR; typedef struct ck_function_list **CK_FUNCTION_LIST_PTR_PTR; @@ -1325,6 +1666,30 @@ #undef min_key_size #undef max_key_size +#undef ck_rsa_pkcs_oaep_params +#undef hash_alg +#undef source_data +#undef source_data_len +#undef slen + +#undef ck_ec_kdf_type_t +#undef shared_data_len +#undef shared_data +#undef public_data_len +#undef public_data +#undef private_data_len +#undef private_data +#undef public_data_len2 +#undef public_data2 +#undef public_key + +#undef ck_x9_42_dh_kdf_type_t +#undef other_info_len +#undef other_info + +#undef data +#undef len + #undef ck_rv_t #undef ck_notify_t diff --git a/crypto/heimdal/lib/hx509/revoke.c b/crypto/heimdal/lib/hx509/revoke.c --- a/crypto/heimdal/lib/hx509/revoke.c +++ b/crypto/heimdal/lib/hx509/revoke.c @@ -337,8 +337,10 @@ return ret; ret = stat(ocsp->path, &sb); - if (ret) + if (ret) { + rk_xfree(data); return errno; + } ret = parse_ocsp_basic(data, length, &basic); rk_xfree(data); @@ -361,8 +363,8 @@ for (i = 0; i < basic.certs->len; i++) { hx509_cert c; - ret = hx509_cert_init(context, &basic.certs->val[i], &c); - if (ret) + c = hx509_cert_init(context, &basic.certs->val[i], NULL); + if (c == NULL) continue; ret = hx509_certs_add(context, certs, c); @@ -561,36 +563,65 @@ } static int -load_crl(const char *path, time_t *t, CRLCertificateList *crl) +crl_parser(hx509_context context, const char *type, + const hx509_pem_header *header, + const void *data, size_t len, void *ctx) { - size_t length, size; - struct stat sb; - void *data; + CRLCertificateList *crl = (CRLCertificateList *)ctx; + size_t size; int ret; - memset(crl, 0, sizeof(*crl)); + if (strcasecmp("X509 CRL", type) != 0) + return HX509_CRYPTO_SIG_INVALID_FORMAT; - ret = rk_undumpdata(path, &data, &length); + ret = decode_CRLCertificateList(data, len, crl, &size); if (ret) return ret; + /* check signature is aligned */ + if (crl->signatureValue.length & 7) { + free_CRLCertificateList(crl); + return HX509_CRYPTO_SIG_INVALID_FORMAT; + } + + return 0; +} + +static int +load_crl(hx509_context context, const char *path, time_t *t, CRLCertificateList *crl) +{ + struct stat sb; + size_t length; + void *data; + FILE *f; + int ret; + + memset(crl, 0, sizeof(*crl)); + ret = stat(path, &sb); if (ret) return errno; - + *t = sb.st_mtime; + + if ((f = fopen(path, "r")) == NULL) + return errno; - ret = decode_CRLCertificateList(data, length, crl, &size); - rk_xfree(data); - if (ret) - return ret; + rk_cloexec_file(f); - /* check signature is aligned */ - if (crl->signatureValue.length & 7) { - free_CRLCertificateList(crl); - return HX509_CRYPTO_SIG_INVALID_FORMAT; + ret = hx509_pem_read(context, f, crl_parser, crl); + fclose(f); + + if (ret == HX509_PARSING_KEY_FAILED) { + + ret = rk_undumpdata(path, &data, &length); + if (ret) + return ret; + + ret = crl_parser(context, "X509 CRL", NULL, data, length, crl); + rk_xfree(data); } - return 0; + return ret; } /** @@ -624,7 +655,7 @@ path += 5; for (i = 0; i < ctx->crls.len; i++) { - if (strcmp(ctx->crls.val[0].path, path) == 0) + if (strcmp(ctx->crls.val[i].path, path) == 0) return 0; } @@ -644,7 +675,8 @@ return ENOMEM; } - ret = load_crl(path, + ret = load_crl(context, + path, &ctx->crls.val[ctx->crls.len].last_modfied, &ctx->crls.val[ctx->crls.len].crl); if (ret) { @@ -674,7 +706,6 @@ * @ingroup hx509_revoke */ - int hx509_revoke_verify(hx509_context context, hx509_revoke_ctx ctx, @@ -781,7 +812,7 @@ if (ret == 0 && crl->last_modfied != sb.st_mtime) { CRLCertificateList cl; - ret = load_crl(crl->path, &crl->last_modfied, &cl); + ret = load_crl(context, crl->path, &crl->last_modfied, &cl); if (ret == 0) { free_CRLCertificateList(&crl->crl); crl->crl = cl; @@ -1064,47 +1095,23 @@ return s; } -/** - * Print the OCSP reply stored in a file. - * - * @param context a hx509 context - * @param path path to a file with a OCSP reply - * @param out the out FILE descriptor to print the reply on - * - * @return An hx509 error code, see hx509_get_error_string(). +/* * - * @ingroup hx509_revoke */ -int -hx509_revoke_ocsp_print(hx509_context context, const char *path, FILE *out) +static int +print_ocsp(hx509_context context, struct revoke_ocsp *ocsp, FILE *out) { - struct revoke_ocsp ocsp; - int ret; + int ret = 0; size_t i; - if (out == NULL) - out = stdout; - - memset(&ocsp, 0, sizeof(ocsp)); - - ocsp.path = strdup(path); - if (ocsp.path == NULL) - return ENOMEM; - - ret = load_ocsp(context, &ocsp); - if (ret) { - free_ocsp(&ocsp); - return ret; - } - fprintf(out, "signer: "); - switch(ocsp.ocsp.tbsResponseData.responderID.element) { + switch(ocsp->ocsp.tbsResponseData.responderID.element) { case choice_OCSPResponderID_byName: { hx509_name n; char *s; - _hx509_name_from_Name(&ocsp.ocsp.tbsResponseData.responderID.u.byName, &n); + _hx509_name_from_Name(&ocsp->ocsp.tbsResponseData.responderID.u.byName, &n); hx509_name_to_string(n, &s); hx509_name_free(&n); fprintf(out, " byName: %s\n", s); @@ -1113,8 +1120,8 @@ } case choice_OCSPResponderID_byKey: { char *s; - hex_encode(ocsp.ocsp.tbsResponseData.responderID.u.byKey.data, - ocsp.ocsp.tbsResponseData.responderID.u.byKey.length, + hex_encode(ocsp->ocsp.tbsResponseData.responderID.u.byKey.data, + ocsp->ocsp.tbsResponseData.responderID.u.byKey.length, &s); fprintf(out, " byKey: %s\n", s); free(s); @@ -1126,13 +1133,13 @@ } fprintf(out, "producedAt: %s\n", - printable_time(ocsp.ocsp.tbsResponseData.producedAt)); + printable_time(ocsp->ocsp.tbsResponseData.producedAt)); - fprintf(out, "replies: %d\n", ocsp.ocsp.tbsResponseData.responses.len); + fprintf(out, "replies: %d\n", ocsp->ocsp.tbsResponseData.responses.len); - for (i = 0; i < ocsp.ocsp.tbsResponseData.responses.len; i++) { + for (i = 0; i < ocsp->ocsp.tbsResponseData.responses.len; i++) { const char *status; - switch (ocsp.ocsp.tbsResponseData.responses.val[i].certStatus.element) { + switch (ocsp->ocsp.tbsResponseData.responses.val[i].certStatus.element) { case choice_OCSPCertStatus_good: status = "good"; break; @@ -1146,19 +1153,116 @@ status = "element unknown"; } - fprintf(out, "\t%zu. status: %s\n", i, status); + fprintf(out, "\t%llu. status: %s\n", (unsigned long long)i, status); fprintf(out, "\tthisUpdate: %s\n", - printable_time(ocsp.ocsp.tbsResponseData.responses.val[i].thisUpdate)); - if (ocsp.ocsp.tbsResponseData.responses.val[i].nextUpdate) + printable_time(ocsp->ocsp.tbsResponseData.responses.val[i].thisUpdate)); + if (ocsp->ocsp.tbsResponseData.responses.val[i].nextUpdate) fprintf(out, "\tproducedAt: %s\n", - printable_time(ocsp.ocsp.tbsResponseData.responses.val[i].thisUpdate)); + printable_time(ocsp->ocsp.tbsResponseData.responses.val[i].thisUpdate)); } fprintf(out, "appended certs:\n"); - if (ocsp.certs) - ret = hx509_certs_iter_f(context, ocsp.certs, hx509_ci_print_names, out); + if (ocsp->certs) + ret = hx509_certs_iter_f(context, ocsp->certs, hx509_ci_print_names, out); + + return ret; +} + +static int +print_crl(hx509_context context, struct revoke_crl *crl, FILE *out) +{ + { + hx509_name n; + char *s; + _hx509_name_from_Name(&crl->crl.tbsCertList.issuer, &n); + hx509_name_to_string(n, &s); + hx509_name_free(&n); + fprintf(out, " issuer: %s\n", s); + free(s); + } + + fprintf(out, " thisUpdate: %s\n", + printable_time(_hx509_Time2time_t(&crl->crl.tbsCertList.thisUpdate))); + + return 0; +} + + +/* + * + */ + +int +hx509_revoke_print(hx509_context context, + hx509_revoke_ctx ctx, + FILE *out) +{ + int saved_ret = 0, ret; + size_t n; + + for (n = 0; n < ctx->ocsps.len; n++) { + struct revoke_ocsp *ocsp = &ctx->ocsps.val[n]; + + fprintf(out, "OCSP %s\n", ocsp->path); + + ret = print_ocsp(context, ocsp, out); + if (ret) { + fprintf(out, "failure printing OCSP: %d\n", ret); + saved_ret = ret; + } + } + + for (n = 0; n < ctx->crls.len; n++) { + struct revoke_crl *crl = &ctx->crls.val[n]; + + fprintf(out, "CRL %s\n", crl->path); + + ret = print_crl(context, crl, out); + if (ret) { + fprintf(out, "failure printing CRL: %d\n", ret); + saved_ret = ret; + } + } + return saved_ret; + +} + +/** + * Print the OCSP reply stored in a file. + * + * @param context a hx509 context + * @param path path to a file with a OCSP reply + * @param out the out FILE descriptor to print the reply on + * + * @return An hx509 error code, see hx509_get_error_string(). + * + * @ingroup hx509_revoke + */ + +int +hx509_revoke_ocsp_print(hx509_context context, const char *path, FILE *out) +{ + struct revoke_ocsp ocsp; + int ret; + + if (out == NULL) + out = stdout; + + memset(&ocsp, 0, sizeof(ocsp)); + + ocsp.path = strdup(path); + if (ocsp.path == NULL) + return ENOMEM; + + ret = load_ocsp(context, &ocsp); + if (ret) { + free_ocsp(&ocsp); + return ret; + } + + ret = print_ocsp(context, &ocsp, out); free_ocsp(&ocsp); return ret; diff --git a/crypto/heimdal/lib/hx509/sel-gram.h b/crypto/heimdal/lib/hx509/sel-gram.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/sel-gram.h @@ -0,0 +1,108 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_YY_SEL_GRAM_H_INCLUDED +# define YY_YY_SEL_GRAM_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int yydebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + kw_TRUE = 258, /* kw_TRUE */ + kw_FALSE = 259, /* kw_FALSE */ + kw_AND = 260, /* kw_AND */ + kw_OR = 261, /* kw_OR */ + kw_IN = 262, /* kw_IN */ + kw_TAILMATCH = 263, /* kw_TAILMATCH */ + NUMBER = 264, /* NUMBER */ + STRING = 265, /* STRING */ + IDENTIFIER = 266 /* IDENTIFIER */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 +#define kw_TRUE 258 +#define kw_FALSE 259 +#define kw_AND 260 +#define kw_OR 261 +#define kw_IN 262 +#define kw_TAILMATCH 263 +#define NUMBER 264 +#define STRING 265 +#define IDENTIFIER 266 + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 57 "sel-gram.y" + + char *string; + struct hx_expr *expr; + +#line 94 "sel-gram.h" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + +extern YYSTYPE yylval; + + +int yyparse (void); + + +#endif /* !YY_YY_SEL_GRAM_H_INCLUDED */ diff --git a/crypto/heimdal/lib/hx509/sel-gram.c b/crypto/heimdal/lib/hx509/sel-gram.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/sel-gram.c @@ -0,0 +1,1546 @@ +/* A Bison parser, made by GNU Bison 3.8.2. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + 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, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 + +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + + + +/* First part of user prologue. */ +#line 34 "sel-gram.y" + +#ifdef HAVE_CONFIG_H +#include +#endif +#include +#include +#include + +#if !defined(yylex) +#define yylex _hx509_sel_yylex +#define yywrap _hx509_sel_yywrap +#endif +#if !defined(yyparse) +#define yyparse _hx509_sel_yyparse +#define yyerror _hx509_sel_yyerror +#define yylval _hx509_sel_yylval +#define yychar _hx509_sel_yychar +#define yydebug _hx509_sel_yydebug +#define yynerrs _hx509_sel_yynerrs +#endif + + +#line 94 "sel-gram.c" + +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +/* Use api.header.include to #include this header + instead of duplicating it here. */ +#ifndef YY_YY_SEL_GRAM_H_INCLUDED +# define YY_YY_SEL_GRAM_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int yydebug; +#endif + +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + kw_TRUE = 258, /* kw_TRUE */ + kw_FALSE = 259, /* kw_FALSE */ + kw_AND = 260, /* kw_AND */ + kw_OR = 261, /* kw_OR */ + kw_IN = 262, /* kw_IN */ + kw_TAILMATCH = 263, /* kw_TAILMATCH */ + NUMBER = 264, /* NUMBER */ + STRING = 265, /* STRING */ + IDENTIFIER = 266 /* IDENTIFIER */ + }; + typedef enum yytokentype yytoken_kind_t; +#endif +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 +#define kw_TRUE 258 +#define kw_FALSE 259 +#define kw_AND 260 +#define kw_OR 261 +#define kw_IN 262 +#define kw_TAILMATCH 263 +#define NUMBER 264 +#define STRING 265 +#define IDENTIFIER 266 + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED +union YYSTYPE +{ +#line 57 "sel-gram.y" + + char *string; + struct hx_expr *expr; + +#line 174 "sel-gram.c" + +}; +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + +extern YYSTYPE yylval; + + +int yyparse (void); + + +#endif /* !YY_YY_SEL_GRAM_H_INCLUDED */ +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_kw_TRUE = 3, /* kw_TRUE */ + YYSYMBOL_kw_FALSE = 4, /* kw_FALSE */ + YYSYMBOL_kw_AND = 5, /* kw_AND */ + YYSYMBOL_kw_OR = 6, /* kw_OR */ + YYSYMBOL_kw_IN = 7, /* kw_IN */ + YYSYMBOL_kw_TAILMATCH = 8, /* kw_TAILMATCH */ + YYSYMBOL_NUMBER = 9, /* NUMBER */ + YYSYMBOL_STRING = 10, /* STRING */ + YYSYMBOL_IDENTIFIER = 11, /* IDENTIFIER */ + YYSYMBOL_12_ = 12, /* '!' */ + YYSYMBOL_13_ = 13, /* '(' */ + YYSYMBOL_14_ = 14, /* ')' */ + YYSYMBOL_15_ = 15, /* ',' */ + YYSYMBOL_16_ = 16, /* '=' */ + YYSYMBOL_17_ = 17, /* '%' */ + YYSYMBOL_18_ = 18, /* '{' */ + YYSYMBOL_19_ = 19, /* '}' */ + YYSYMBOL_20_ = 20, /* '.' */ + YYSYMBOL_YYACCEPT = 21, /* $accept */ + YYSYMBOL_start = 22, /* start */ + YYSYMBOL_expr = 23, /* expr */ + YYSYMBOL_words = 24, /* words */ + YYSYMBOL_comp = 25, /* comp */ + YYSYMBOL_word = 26, /* word */ + YYSYMBOL_number = 27, /* number */ + YYSYMBOL_string = 28, /* string */ + YYSYMBOL_function = 29, /* function */ + YYSYMBOL_variable = 30, /* variable */ + YYSYMBOL_variables = 31 /* variables */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; + + + + +#ifdef short +# undef short +#endif + +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif +#endif + +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; +#else +typedef short yytype_int16; +#endif + +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; +#else +typedef short yytype_uint8; +#endif + +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; +#else +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned +# endif +#endif + +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int8 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YY_USE(E) ((void) (E)) +#else +# define YY_USE(E) /* empty */ +#endif + +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + + +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* !defined yyoverflow */ + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 21 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 50 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 21 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 11 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 26 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 50 + +/* YYMAXUTOK -- Last valid token kind. */ +#define YYMAXUTOK 266 + + +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 12, 2, 2, 2, 17, 2, 2, + 13, 14, 2, 2, 15, 2, 20, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 16, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 18, 2, 19, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11 +}; + +#if YYDEBUG +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int8 yyrline[] = +{ + 0, 85, 85, 87, 88, 89, 90, 91, 92, 93, + 96, 97, 100, 101, 102, 103, 104, 107, 108, 109, + 110, 113, 114, 116, 119, 122, 124 +}; +#endif + +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "\"invalid token\"", "kw_TRUE", "kw_FALSE", + "kw_AND", "kw_OR", "kw_IN", "kw_TAILMATCH", "NUMBER", "STRING", + "IDENTIFIER", "'!'", "'('", "')'", "','", "'='", "'%'", "'{'", "'}'", + "'.'", "$accept", "start", "expr", "words", "comp", "word", "number", + "string", "function", "variable", "variables", YY_NULLPTR +}; + +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) +{ + return yytname[yysymbol]; +} +#endif + +#define YYPACT_NINF (-31) + +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) + +#define YYTABLE_NINF (-1) + +#define yytable_value_is_error(Yyn) \ + 0 + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int8 yypact[] = +{ + 22, -31, -31, -31, -31, -1, 22, 22, -11, 27, + 11, -31, -6, -31, -31, -31, -31, 19, 11, 9, + 26, -31, 22, 22, -4, 19, 24, 25, 28, 23, + -31, 29, 31, 11, 11, 19, -31, -31, 19, 19, + -31, 19, 26, -31, 30, -31, -31, -31, -31, -31 +}; + +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int8 yydefact[] = +{ + 0, 3, 4, 21, 22, 0, 0, 0, 0, 0, + 2, 9, 0, 17, 18, 19, 20, 0, 5, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 10, + 8, 26, 0, 6, 7, 0, 16, 14, 0, 0, + 23, 0, 0, 24, 0, 13, 12, 11, 25, 15 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -31, -31, -3, -30, -31, -17, -31, -31, -31, 21, + 1 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + 0, 9, 10, 28, 11, 12, 13, 14, 15, 16, + 32 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int8 yytable[] = +{ + 29, 24, 25, 18, 19, 44, 26, 20, 37, 35, + 27, 47, 17, 8, 22, 23, 22, 23, 29, 33, + 34, 45, 46, 30, 29, 1, 2, 21, 3, 4, + 5, 3, 4, 5, 6, 7, 8, 31, 41, 8, + 38, 39, 40, 48, 49, 36, 0, 0, 0, 42, + 43 +}; + +static const yytype_int8 yycheck[] = +{ + 17, 7, 8, 6, 7, 35, 12, 18, 25, 13, + 16, 41, 13, 17, 5, 6, 5, 6, 35, 22, + 23, 38, 39, 14, 41, 3, 4, 0, 9, 10, + 11, 9, 10, 11, 12, 13, 17, 11, 15, 17, + 16, 16, 14, 42, 14, 24, -1, -1, -1, 20, + 19 +}; + +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ +static const yytype_int8 yystos[] = +{ + 0, 3, 4, 9, 10, 11, 12, 13, 17, 22, + 23, 25, 26, 27, 28, 29, 30, 13, 23, 23, + 18, 0, 5, 6, 7, 8, 12, 16, 24, 26, + 14, 11, 31, 23, 23, 13, 30, 26, 16, 16, + 14, 15, 20, 19, 24, 26, 26, 24, 31, 14 +}; + +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr1[] = +{ + 0, 21, 22, 23, 23, 23, 23, 23, 23, 23, + 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, + 26, 27, 28, 29, 30, 31, 31 +}; + +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 1, 1, 1, 2, 3, 3, 3, 1, + 1, 3, 4, 4, 3, 5, 3, 1, 1, 1, + 1, 1, 1, 4, 4, 3, 1 +}; + + +enum { YYENOMEM = -2 }; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) +{ + FILE *yyoutput = yyo; + YY_USE (yyoutput); + if (!yyvaluep) + return; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ + +static void +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) +{ + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); + + yy_symbol_value_print (yyo, yykind, yyvaluep); + YYFPRINTF (yyo, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule) +{ + int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)]); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + + + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep) +{ + YY_USE (yyvaluep); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + +/* Lookahead token kind. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; +/* Number of syntax errors so far. */ +int yynerrs; + + + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (void) +{ + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; + + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; + + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yychar = YYEMPTY; /* Cause a token to be read. */ + + goto yysetstate; + + +/*------------------------------------------------------------. +| yynewstate -- push a new state, which is found in yystate. | +`------------------------------------------------------------*/ +yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); + + if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else + { + /* Get the current used size of the three stacks, in elements. */ + YYPTRDIFF_T yysize = yyssp - yyss + 1; + +# if defined yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; + } +# else /* defined YYSTACK_RELOCATE */ + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + YYNOMEM; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ + + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (); + } + + if (yychar <= YYEOF) + { + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + /* Discard the shifted token. */ + yychar = YYEMPTY; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: /* start: expr */ +#line 85 "sel-gram.y" + { _hx509_expr_input.expr = (yyvsp[0].expr); } +#line 1204 "sel-gram.c" + break; + + case 3: /* expr: kw_TRUE */ +#line 87 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(op_TRUE, NULL, NULL); } +#line 1210 "sel-gram.c" + break; + + case 4: /* expr: kw_FALSE */ +#line 88 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(op_FALSE, NULL, NULL); } +#line 1216 "sel-gram.c" + break; + + case 5: /* expr: '!' expr */ +#line 89 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(op_NOT, (yyvsp[0].expr), NULL); } +#line 1222 "sel-gram.c" + break; + + case 6: /* expr: expr kw_AND expr */ +#line 90 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(op_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 1228 "sel-gram.c" + break; + + case 7: /* expr: expr kw_OR expr */ +#line 91 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(op_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 1234 "sel-gram.c" + break; + + case 8: /* expr: '(' expr ')' */ +#line 92 "sel-gram.y" + { (yyval.expr) = (yyvsp[-1].expr); } +#line 1240 "sel-gram.c" + break; + + case 9: /* expr: comp */ +#line 93 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(op_COMP, (yyvsp[0].expr), NULL); } +#line 1246 "sel-gram.c" + break; + + case 10: /* words: word */ +#line 96 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(expr_WORDS, (yyvsp[0].expr), NULL); } +#line 1252 "sel-gram.c" + break; + + case 11: /* words: word ',' words */ +#line 97 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(expr_WORDS, (yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 1258 "sel-gram.c" + break; + + case 12: /* comp: word '=' '=' word */ +#line 100 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(comp_EQ, (yyvsp[-3].expr), (yyvsp[0].expr)); } +#line 1264 "sel-gram.c" + break; + + case 13: /* comp: word '!' '=' word */ +#line 101 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(comp_NE, (yyvsp[-3].expr), (yyvsp[0].expr)); } +#line 1270 "sel-gram.c" + break; + + case 14: /* comp: word kw_TAILMATCH word */ +#line 102 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(comp_TAILEQ, (yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 1276 "sel-gram.c" + break; + + case 15: /* comp: word kw_IN '(' words ')' */ +#line 103 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(comp_IN, (yyvsp[-4].expr), (yyvsp[-1].expr)); } +#line 1282 "sel-gram.c" + break; + + case 16: /* comp: word kw_IN variable */ +#line 104 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(comp_IN, (yyvsp[-2].expr), (yyvsp[0].expr)); } +#line 1288 "sel-gram.c" + break; + + case 17: /* word: number */ +#line 107 "sel-gram.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 1294 "sel-gram.c" + break; + + case 18: /* word: string */ +#line 108 "sel-gram.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 1300 "sel-gram.c" + break; + + case 19: /* word: function */ +#line 109 "sel-gram.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 1306 "sel-gram.c" + break; + + case 20: /* word: variable */ +#line 110 "sel-gram.y" + { (yyval.expr) = (yyvsp[0].expr); } +#line 1312 "sel-gram.c" + break; + + case 21: /* number: NUMBER */ +#line 113 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(expr_NUMBER, (yyvsp[0].string), NULL); } +#line 1318 "sel-gram.c" + break; + + case 22: /* string: STRING */ +#line 114 "sel-gram.y" + { (yyval.expr) = _hx509_make_expr(expr_STRING, (yyvsp[0].string), NULL); } +#line 1324 "sel-gram.c" + break; + + case 23: /* function: IDENTIFIER '(' words ')' */ +#line 116 "sel-gram.y" + { + (yyval.expr) = _hx509_make_expr(expr_FUNCTION, (yyvsp[-3].string), (yyvsp[-1].expr)); } +#line 1331 "sel-gram.c" + break; + + case 24: /* variable: '%' '{' variables '}' */ +#line 119 "sel-gram.y" + { (yyval.expr) = (yyvsp[-1].expr); } +#line 1337 "sel-gram.c" + break; + + case 25: /* variables: IDENTIFIER '.' variables */ +#line 122 "sel-gram.y" + { + (yyval.expr) = _hx509_make_expr(expr_VAR, (yyvsp[-2].string), (yyvsp[0].expr)); } +#line 1344 "sel-gram.c" + break; + + case 26: /* variables: IDENTIFIER */ +#line 124 "sel-gram.y" + { + (yyval.expr) = _hx509_make_expr(expr_VAR, (yyvsp[0].string), NULL); } +#line 1351 "sel-gram.c" + break; + + +#line 1355 "sel-gram.c" + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; + yyerror (YY_("syntax error")); + } + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + /* Pop stack until we find a state that shifts the error token. */ + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + YY_ACCESSING_SYMBOL (yystate), yyvsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturnlab; + + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturnlab; + + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + goto yyreturnlab; + + +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + + return yyresult; +} + diff --git a/crypto/heimdal/lib/hx509/sel-gram.y b/crypto/heimdal/lib/hx509/sel-gram.y --- a/crypto/heimdal/lib/hx509/sel-gram.y +++ b/crypto/heimdal/lib/hx509/sel-gram.y @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008 Kungliga Tekniska Högskolan + * Copyright (c) 2017 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -39,6 +39,18 @@ #include #include +#if !defined(yylex) +#define yylex _hx509_sel_yylex +#define yywrap _hx509_sel_yywrap +#endif +#if !defined(yyparse) +#define yyparse _hx509_sel_yyparse +#define yyerror _hx509_sel_yyerror +#define yylval _hx509_sel_yylval +#define yychar _hx509_sel_yychar +#define yydebug _hx509_sel_yydebug +#define yynerrs _hx509_sel_yynerrs +#endif %} diff --git a/crypto/heimdal/lib/hx509/sel-lex.c b/crypto/heimdal/lib/hx509/sel-lex.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/sel-lex.c @@ -0,0 +1,1941 @@ + +#line 2 "sel-lex.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +/* begin standard C++ headers. */ + +/* TODO: this is always defined, so inline it */ +#define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) +#else +#define yynoreturn +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. + */ +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else +#define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern int yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + int yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = NULL; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( YY_BUFFER_STATE b ); +void yy_flush_buffer ( YY_BUFFER_STATE b ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state ( void ); + +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); + +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); + +#define yy_new_buffer yy_create_buffer +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ +typedef flex_uint8_t YY_CHAR; + +FILE *yyin = NULL, *yyout = NULL; + +typedef int yy_state_type; + +extern int yylineno; +int yylineno = 1; + +extern char *yytext; +#ifdef yytext_ptr +#undef yytext_ptr +#endif +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yy_fatal_error ( const char* msg ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; +#define YY_NUM_RULES 12 +#define YY_END_OF_BUFFER 13 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static const flex_int16_t yy_accept[36] = + { 0, + 0, 0, 13, 12, 11, 9, 10, 8, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 5, 4, 7, + 7, 3, 7, 7, 7, 7, 7, 1, 2, 7, + 7, 7, 7, 6, 0 + } ; + +static const YY_CHAR yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 1, 1, 4, 1, 1, 4, + 4, 1, 1, 4, 6, 4, 1, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 1, 1, 1, + 4, 1, 1, 1, 7, 8, 9, 10, 11, 12, + 8, 13, 14, 8, 8, 15, 16, 17, 18, 8, + 8, 19, 20, 21, 22, 8, 8, 8, 8, 8, + 1, 1, 1, 1, 6, 1, 8, 8, 8, 8, + + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 4, 1, 4, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static const YY_CHAR yy_meta[23] = + { 0, + 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2 + } ; + +static const flex_int16_t yy_base[37] = + { 0, + 0, 0, 43, 44, 44, 44, 44, 44, 25, 0, + 34, 23, 20, 16, 0, 28, 22, 0, 0, 22, + 12, 0, 13, 17, 20, 19, 13, 0, 0, 21, + 6, 17, 12, 0, 44, 22 + } ; + +static const flex_int16_t yy_def[37] = + { 0, + 35, 1, 35, 35, 35, 35, 35, 35, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 0, 35 + } ; + +static const flex_int16_t yy_nxt[67] = + { 0, + 4, 5, 6, 7, 8, 4, 9, 10, 10, 10, + 10, 11, 10, 12, 10, 10, 10, 13, 10, 10, + 14, 10, 20, 15, 34, 33, 32, 31, 30, 29, + 28, 27, 26, 25, 21, 24, 23, 22, 19, 18, + 17, 16, 35, 3, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35 + } ; + +static const flex_int16_t yy_chk[67] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 14, 36, 33, 32, 31, 30, 27, 26, + 25, 24, 23, 21, 14, 20, 17, 16, 13, 12, + 11, 9, 3, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "sel-lex.l" +#line 2 "sel-lex.l" +/* + * Copyright (c) 2004 - 2017 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#undef ECHO + +#include +#include +#include +#include +#include "sel.h" +#include "sel-gram.h" +unsigned lineno = 1; + +static char * handle_string(void); +static int lex_input(char *, int); + +struct hx_expr_input _hx509_expr_input; + +#ifndef YY_NULL +#define YY_NULL 0 +#endif + +#define YY_NO_UNPUT 1 + +#undef YY_INPUT +#define YY_INPUT(buf,res,maxsize) (res = lex_input(buf, maxsize)) + +#undef ECHO + +#line 534 "sel-lex.c" +#line 535 "sel-lex.c" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals ( void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy ( void ); + +int yyget_debug ( void ); + +void yyset_debug ( int debug_flag ); + +YY_EXTRA_TYPE yyget_extra ( void ); + +void yyset_extra ( YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in ( void ); + +void yyset_in ( FILE * _in_str ); + +FILE *yyget_out ( void ); + +void yyset_out ( FILE * _out_str ); + + int yyget_leng ( void ); + +char *yyget_text ( void ); + +int yyget_lineno ( void ); + +void yyset_lineno ( int _line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap ( void ); +#else +extern int yywrap ( void ); +#endif +#endif + +#ifndef YY_NO_UNPUT + + static void yyunput ( int c, char *buf_ptr ); + +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy ( char *, const char *, int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen ( const char * ); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput ( void ); +#else +static int input ( void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else +#define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + int n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK /*LINTED*/break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + { +#line 73 "sel-lex.l" + + +#line 755 "sel-lex.c" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + do + { + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 36 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 44 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 75 "sel-lex.l" +{ return kw_TRUE; } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 76 "sel-lex.l" +{ return kw_FALSE; } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 77 "sel-lex.l" +{ return kw_AND; } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 78 "sel-lex.l" +{ return kw_OR; } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 79 "sel-lex.l" +{ return kw_IN; } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 80 "sel-lex.l" +{ return kw_TAILMATCH; } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 82 "sel-lex.l" +{ + yylval.string = strdup ((const char *)yytext); + return IDENTIFIER; + } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 86 "sel-lex.l" +{ yylval.string = handle_string(); return STRING; } + YY_BREAK +case 9: +/* rule 9 can match eol */ +YY_RULE_SETUP +#line 87 "sel-lex.l" +{ ++lineno; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 88 "sel-lex.l" +{ return *yytext; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 89 "sel-lex.l" +; + YY_BREAK +case 12: +YY_RULE_SETUP +#line 90 "sel-lex.l" +ECHO; + YY_BREAK +#line 876 "sel-lex.c" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = NULL; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + yy_state_type yy_current_state; + char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 36 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); + + YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 36 ) + yy_c = yy_meta[yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; + yy_is_jam = (yy_current_state == 35); + + return yy_is_jam ? 0 : yy_current_state; +} + +#ifndef YY_NO_UNPUT + + static void yyunput (int c, char * yy_bp ) +{ + char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + int number_to_move = (yy_n_chars) + 2; + char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return 0; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer( yyin, YY_BUF_SIZE ); + } + + yy_init_buffer( YY_CURRENT_BUFFER, input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree( (void *) b->yy_ch_buf ); + + yyfree( (void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + yy_size_t num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + yy_size_t grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return NULL; + + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = NULL; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (const char * yystr ) +{ + + return yy_scan_bytes( yystr, (int) strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yynoreturn yy_fatal_error (const char* msg ) +{ + fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +int yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param _line_number line number + * + */ +void yyset_lineno (int _line_number ) +{ + + yylineno = _line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param _in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * _in_str ) +{ + yyin = _in_str ; +} + +void yyset_out (FILE * _out_str ) +{ + yyout = _out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int _bdebug ) +{ + yy_flex_debug = _bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = NULL; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = NULL; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = NULL; + yyout = NULL; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer( YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, const char * s2, int n ) +{ + + int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (const char * s ) +{ + int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return malloc(size); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return realloc(ptr, size); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 90 "sel-lex.l" + + +static char * +handle_string(void) +{ + char x[1024]; + int i = 0; + int c; + int quote = 0; + while((c = input()) != EOF){ + if(quote) { + x[i++] = '\\'; + x[i++] = c; + quote = 0; + continue; + } + if(c == '\n'){ + _hx509_sel_yyerror("unterminated string"); + lineno++; + break; + } + if(c == '\\'){ + quote++; + continue; + } + if(c == '\"') + break; + x[i++] = c; + } + x[i] = '\0'; + return strdup(x); +} + +#if !defined(yywrap) +#define yywrap _hx509_sel_yywrap +#endif + +int +yywrap () +{ + return 1; +} + +static int +lex_input(char *buf, int max_size) +{ + int n; + + n = _hx509_expr_input.length - _hx509_expr_input.offset; + if (max_size < n) + n = max_size; + if (n <= 0) + return YY_NULL; + + memcpy(buf, _hx509_expr_input.buf + _hx509_expr_input.offset, n); + _hx509_expr_input.offset += n; + + return n; +} + diff --git a/crypto/heimdal/lib/hx509/sel-lex.l b/crypto/heimdal/lib/hx509/sel-lex.l --- a/crypto/heimdal/lib/hx509/sel-lex.l +++ b/crypto/heimdal/lib/hx509/sel-lex.l @@ -1,6 +1,6 @@ %{ /* - * Copyright (c) 2004, 2008 Kungliga Tekniska Högskolan + * Copyright (c) 2004 - 2017 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -34,6 +34,11 @@ /* $Id$ */ +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + #ifdef HAVE_CONFIG_H #include #endif @@ -50,7 +55,6 @@ static char * handle_string(void); static int lex_input(char *, int); -static int lex_classic_input(void); struct hx_expr_input _hx509_expr_input; @@ -116,6 +120,10 @@ return strdup(x); } +#if !defined(yywrap) +#define yywrap _hx509_sel_yywrap +#endif + int yywrap () { diff --git a/crypto/heimdal/lib/hx509/sel.h b/crypto/heimdal/lib/hx509/sel.h --- a/crypto/heimdal/lib/hx509/sel.h +++ b/crypto/heimdal/lib/hx509/sel.h @@ -67,14 +67,18 @@ extern struct hx_expr_input _hx509_expr_input; -#define yyparse _hx509_sel_yyparse +#if !defined(yylex) #define yylex _hx509_sel_yylex +#define yywrap _hx509_sel_yywrap +#endif +#if !defined(yyparse) +#define yyparse _hx509_sel_yyparse #define yyerror _hx509_sel_yyerror #define yylval _hx509_sel_yylval #define yychar _hx509_sel_yychar #define yydebug _hx509_sel_yydebug #define yynerrs _hx509_sel_yynerrs -#define yywrap _hx509_sel_yywrap +#endif int _hx509_sel_yyparse(void); int _hx509_sel_yylex(void); diff --git a/crypto/heimdal/lib/hx509/softp11.c b/crypto/heimdal/lib/hx509/softp11.c --- a/crypto/heimdal/lib/hx509/softp11.c +++ b/crypto/heimdal/lib/hx509/softp11.c @@ -34,7 +34,7 @@ #define CRYPTOKI_EXPORTS 1 #include "hx_locl.h" -#include "pkcs11.h" +#include "ref/pkcs11.h" #define OBJECT_ID_MASK 0xfff #define HANDLE_OBJECT_ID(h) ((h) & OBJECT_ID_MASK) @@ -547,6 +547,8 @@ CK_FLAGS flags; type = CKO_PRIVATE_KEY; + + /* Note to static analyzers: `o' is still referred to via globals */ o = add_st_object(); if (o == NULL) { ret = CKR_DEVICE_MEMORY; @@ -597,6 +599,7 @@ hx509_xfree(issuer_data.data); hx509_xfree(subject_data.data); + /* Note to static analyzers: `o' is still referred to via globals */ return 0; } @@ -619,7 +622,11 @@ if (pin) { char *str; - asprintf(&str, "PASS:%s", pin); + ret = asprintf(&str, "PASS:%s", pin); + if (ret == -1 || !str) { + st_logf("failed to allocate memory\n"); + return CKR_GENERAL_ERROR; + } hx509_lock_init(context, &lock); hx509_lock_command_string(lock, str); @@ -819,6 +826,7 @@ #ifndef _WIN32 char *home = NULL; + int ret; if (!issuid()) { fn = getenv("SOFTPKCS11RC"); @@ -832,9 +840,11 @@ home = pw->pw_dir; } if (fn == NULL) { - if (home) - asprintf(&fn, "%s/.soft-token.rc", home); - else + if (home) { + ret = asprintf(&fn, "%s/.soft-token.rc", home); + if (ret == -1) + fn = NULL; + } else fn = strdup("/etc/soft-token.rc"); } #else /* Windows */ @@ -1081,7 +1091,7 @@ *pulCount = 1; if (pMechanismList == NULL_PTR) return CKR_OK; - pMechanismList[1] = CKM_RSA_PKCS; + pMechanismList[0] = CKM_RSA_PKCS; return CKR_OK; } @@ -1209,8 +1219,13 @@ VERIFY_SESSION_HANDLE(hSession, NULL); if (pPin != NULL_PTR) { - asprintf(&pin, "%.*s", (int)ulPinLen, pPin); - st_logf("type: %d password: %s\n", (int)userType, pin); + int aret; + + aret = asprintf(&pin, "%.*s", (int)ulPinLen, pPin); + if (aret != -1 && pin) + st_logf("type: %d password: %s\n", (int)userType, pin); + else + st_logf("memory error: asprintf failed\n"); } /* diff --git a/crypto/heimdal/lib/hx509/test_ca.in b/crypto/heimdal/lib/hx509/test_ca.in --- a/crypto/heimdal/lib/hx509/test_ca.in +++ b/crypto/heimdal/lib/hx509/test_ca.in @@ -421,4 +421,32 @@ cert:FILE:cert-ee.pem \ anchor:FILE:cert-ca.pem > /dev/null || exit 1 +echo "+++++++++++ test sigalg" + +echo "issue cert with sha256" +${hxtool} issue-certificate \ + --ca-certificate=FILE:cert-ca.pem \ + --signature-algorithm=rsa-with-sha256 \ + --subject="cn=foo" \ + --req="PKCS10:pkcs10-request.der" \ + --certificate="FILE:cert-ee.pem" || exit 1 + +echo "verify certificate" +${hxtool} verify --missing-revoke \ + cert:FILE:cert-ee.pem \ + anchor:FILE:cert-ca.pem > /dev/null || exit 1 + +echo "issue cert with sha1" +${hxtool} issue-certificate \ + --ca-certificate=FILE:cert-ca.pem \ + --signature-algorithm=rsa-with-sha1 \ + --subject="cn=foo" \ + --req="PKCS10:pkcs10-request.der" \ + --certificate="FILE:cert-ee.pem" || exit 1 + +echo "verify certificate" +${hxtool} verify --missing-revoke \ + cert:FILE:cert-ee.pem \ + anchor:FILE:cert-ca.pem > /dev/null || exit 1 + exit 0 diff --git a/crypto/heimdal/lib/hx509/test_cert.in b/crypto/heimdal/lib/hx509/test_cert.in --- a/crypto/heimdal/lib/hx509/test_cert.in +++ b/crypto/heimdal/lib/hx509/test_cert.in @@ -46,7 +46,7 @@ fi echo "print DIR" -${hxtool} print --content DIR:$srcdir/data > /dev/null || exit 1 +${hxtool} print --content DIR:$srcdir/data > /dev/null 2>/dev/null || exit 1 echo "print FILE" for a in $srcdir/data/*.crt; do diff --git a/crypto/heimdal/lib/hx509/test_chain.in b/crypto/heimdal/lib/hx509/test_chain.in --- a/crypto/heimdal/lib/hx509/test_chain.in +++ b/crypto/heimdal/lib/hx509/test_chain.in @@ -192,13 +192,13 @@ else echo "eccert -> root" ${hxtool} verify --missing-revoke \ - cert:FILE:$srcdir/data/secp160r2TestServer.cert.pem \ - anchor:FILE:$srcdir/data/secp160r1TestCA.cert.pem > /dev/null || exit 1 + cert:FILE:$srcdir/data/secp256r2TestServer.cert.pem \ + anchor:FILE:$srcdir/data/secp256r1TestCA.cert.pem > /dev/null || exit 1 echo "eccert -> root" ${hxtool} verify --missing-revoke \ - cert:FILE:$srcdir/data/secp160r2TestClient.cert.pem \ - anchor:FILE:$srcdir/data/secp160r1TestCA.cert.pem > /dev/null || exit 1 + cert:FILE:$srcdir/data/secp256r2TestClient.cert.pem \ + anchor:FILE:$srcdir/data/secp256r1TestCA.cert.pem > /dev/null || exit 1 fi echo "proxy cert" diff --git a/crypto/heimdal/lib/hx509/test_cms.in b/crypto/heimdal/lib/hx509/test_cms.in --- a/crypto/heimdal/lib/hx509/test_cms.in +++ b/crypto/heimdal/lib/hx509/test_cms.in @@ -53,15 +53,15 @@ else echo "create signed data (ec)" ${hxtool} cms-create-sd \ - --certificate=FILE:$srcdir/data/secp160r2TestClient.pem \ - "$srcdir/test_chain.in" \ - sd.data > /dev/null || exit 1 + --certificate=FILE:$srcdir/data/secp256r2TestClient.pem \ + "$srcdir/test_chain.in" \ + sd.data > /dev/null || exit 1 echo "verify signed data (ec)" ${hxtool} cms-verify-sd \ - --missing-revoke \ - --anchors=FILE:$srcdir/data/secp160r1TestCA.cert.pem \ - sd.data sd.data.out > /dev/null || exit 1 + --missing-revoke \ + --anchors=FILE:$srcdir/data/secp256r1TestCA.cert.pem \ + sd.data sd.data.out > /dev/null || exit 1 cmp "$srcdir/test_chain.in" sd.data.out || exit 1 fi diff --git a/crypto/heimdal/lib/hx509/test_expr.c b/crypto/heimdal/lib/hx509/test_expr.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/hx509/test_expr.c @@ -0,0 +1,87 @@ + +#include "hx_locl.h" +#include + +struct foo { + int val; + char *str; +} foo[] = { + { 0, "FALSE" }, + { 1, "TRUE" }, + { 0, "!TRUE" }, + { 0, "! TRUE" }, + { 0, "!\tTRUE" }, + { 0, "( FALSE AND FALSE )" }, + { 0, "( TRUE AND FALSE )" }, + { 1, "( TRUE AND TRUE )" }, + { 1, "( TRUE OR TRUE )" }, + { 1, "( TRUE OR FALSE )" }, + { 0, "( FALSE OR FALSE )" }, + { 1, "! ( FALSE OR FALSE )" }, + + { 1, "\"foo\" TAILMATCH \"foo\"" }, + { 1, "\"foobar\" TAILMATCH \"bar\"" }, + { 0, "\"foobar\" TAILMATCH \"foo\"" }, + + { 1, "\"foo\" == \"foo\"" }, + { 0, "\"foo\" == \"bar\"" }, + { 0, "\"foo\" != \"foo\"" }, + { 1, "\"foo\" != \"bar\"" }, + { 1, "%{variable} == \"foo\"" }, + { 0, "%{variable} == \"bar\"" }, + { 1, "%{context.variable} == \"foo\"" }, + { 0, "%{context.variable} == \"bar\"" }, + { 1, "\"foo\" IN ( \"bar\", \"foo\")" }, + { 0, "\"foo\" IN ( \"bar\", \"baz\")" }, + { 0, "\"bar\" IN %{context}" }, + { 1, "\"foo\" IN %{context}" }, + { 1, "\"variable\" IN %{context}" }, + + { 1, "\"foo\" IN %{context} AND %{context.variable} == \"foo\"" } +}; + +int +main(int argc, char **argv) +{ + struct hx_expr *expr; + hx509_context context; + hx509_env env = NULL, env2 = NULL; + int val, i, ret; + +#if 0 + extern int yydebug; + yydebug = 1; +#endif + + ret = hx509_context_init(&context); + if (ret) + errx(1, "hx509_context_init failed with %d", ret); + + hx509_env_add(context, &env, "variable", "foo"); + hx509_env_add(context, &env2, "variable", "foo"); + hx509_env_add_binding(context, &env, "context", env2); + + for (i = 0; i < sizeof(foo)/sizeof(foo[0]); i++) { + + expr = _hx509_expr_parse(foo[i].str); + if (expr == NULL) + errx(1, "_hx509_expr_parse failed for %d: %s", i, foo[i].str); + + val = _hx509_expr_eval(context, env, expr); + if (foo[i].val) { + if (val == 0) + errx(1, "_hx509_expr_eval not true when it should: %d: %s", + i, foo[i].str); + } else { + if (val) + errx(1, "_hx509_expr_eval true when it should not: %d: %s", + i, foo[i].str); + } + + _hx509_expr_free(expr); + } + + hx509_env_free(&env); + + return 0; +} diff --git a/crypto/heimdal/lib/hx509/test_name.c b/crypto/heimdal/lib/hx509/test_name.c --- a/crypto/heimdal/lib/hx509/test_name.c +++ b/crypto/heimdal/lib/hx509/test_name.c @@ -319,14 +319,14 @@ /* check transative properties of name compare function */ - ret = hx509_cert_init_data(context, certdata1, sizeof(certdata1) - 1, &c1); - if (ret) return 1; - - ret = hx509_cert_init_data(context, certdata2, sizeof(certdata2) - 1, &c2); - if (ret) return 1; - - ret = hx509_cert_init_data(context, certdata3, sizeof(certdata3) - 1, &c3); - if (ret) return 1; + c1 = hx509_cert_init_data(context, certdata1, sizeof(certdata1) - 1, NULL); + if (c1 == NULL) return 1; + + c2 = hx509_cert_init_data(context, certdata2, sizeof(certdata2) - 1, NULL); + if (c2 == NULL) return 1; + + c3 = hx509_cert_init_data(context, certdata3, sizeof(certdata3) - 1, NULL); + if (c3 == NULL) return 1; ret = compare_subject(c1, c1, &l0); if (ret) return 1; diff --git a/crypto/heimdal/lib/hx509/test_soft_pkcs11.c b/crypto/heimdal/lib/hx509/test_soft_pkcs11.c --- a/crypto/heimdal/lib/hx509/test_soft_pkcs11.c +++ b/crypto/heimdal/lib/hx509/test_soft_pkcs11.c @@ -32,7 +32,7 @@ */ #include "hx_locl.h" -#include "pkcs11.h" +#include "ref/pkcs11.h" #include static CK_FUNCTION_LIST_PTR func; diff --git a/crypto/heimdal/lib/hx509/version-script.map b/crypto/heimdal/lib/hx509/version-script.map --- a/crypto/heimdal/lib/hx509/version-script.map +++ b/crypto/heimdal/lib/hx509/version-script.map @@ -208,6 +208,7 @@ hx509_revoke_init; hx509_revoke_ocsp_print; hx509_revoke_verify; + hx509_revoke_print; hx509_set_error_string; hx509_set_error_stringv; hx509_signature_md5; @@ -247,3 +248,8 @@ *; }; +HEIMDAL_X509_1.3 { + global: + hx509_ca_tbs_set_signature_algorithm; +}; + diff --git a/crypto/heimdal/lib/ipc/Makefile.am b/crypto/heimdal/lib/ipc/Makefile.am --- a/crypto/heimdal/lib/ipc/Makefile.am +++ b/crypto/heimdal/lib/ipc/Makefile.am @@ -33,10 +33,11 @@ ts_http_LDADD = $(ts_LDADD) tc_LDADD = libheim-ipcc.la $(LIB_roken) -if have_gcd EXTRA_DIST = heim_ipc.defs heim_ipc_async.defs heim_ipc_reply.defs +if have_gcd + heim_ipc.h heim_ipcUser.c heim_ipcServer.c heim_ipcServer.h: heim_ipc.defs mig -header heim_ipc.h -user heim_ipcUser.c -sheader heim_ipcServer.h -server heim_ipcServer.c -I$(srcdir) $(srcdir)/heim_ipc.defs diff --git a/crypto/heimdal/lib/ipc/Makefile.in b/crypto/heimdal/lib/ipc/Makefile.in --- a/crypto/heimdal/lib/ipc/Makefile.in +++ b/crypto/heimdal/lib/ipc/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,9 +94,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common TESTS = noinst_PROGRAMS = tc$(EXEEXT) ts$(EXEEXT) ts-http$(EXEEXT) @have_gcd_TRUE@am__append_1 = -lbsm @@ -50,7 +101,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -61,8 +111,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -75,6 +124,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -94,10 +144,13 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libheim_ipcc_la_DEPENDENCIES = $(LIB_heimbase) $(am__DEPENDENCIES_1) \ @@ -107,6 +160,10 @@ @have_gcd_TRUE@nodist_libheim_ipcc_la_OBJECTS = $(am__objects_1) libheim_ipcc_la_OBJECTS = $(dist_libheim_ipcc_la_OBJECTS) \ $(nodist_libheim_ipcc_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = am__DEPENDENCIES_2 = $(LIB_heimbase) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) libheim_ipcs_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ @@ -117,7 +174,6 @@ @have_gcd_TRUE@nodist_libheim_ipcs_la_OBJECTS = $(am__objects_2) libheim_ipcs_la_OBJECTS = $(dist_libheim_ipcs_la_OBJECTS) \ $(nodist_libheim_ipcs_la_OBJECTS) -PROGRAMS = $(noinst_PROGRAMS) tc_SOURCES = tc.c tc_OBJECTS = tc.$(OBJEXT) tc_DEPENDENCIES = libheim-ipcc.la $(am__DEPENDENCIES_1) @@ -128,24 +184,56 @@ ts_http_OBJECTS = ts-http.$(OBJEXT) am__DEPENDENCIES_3 = libheim-ipcs.la $(am__DEPENDENCIES_1) ts_http_DEPENDENCIES = $(am__DEPENDENCIES_3) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/client.Plo ./$(DEPDIR)/common.Plo \ + ./$(DEPDIR)/heim_ipcServer.Plo ./$(DEPDIR)/heim_ipcUser.Plo \ + ./$(DEPDIR)/heim_ipc_asyncServer.Plo \ + ./$(DEPDIR)/heim_ipc_asyncUser.Plo \ + ./$(DEPDIR)/heim_ipc_replyUser.Plo ./$(DEPDIR)/server.Plo \ + ./$(DEPDIR)/tc.Po ./$(DEPDIR)/ts-http.Po ./$(DEPDIR)/ts.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(dist_libheim_ipcc_la_SOURCES) \ $(nodist_libheim_ipcc_la_SOURCES) \ $(dist_libheim_ipcs_la_SOURCES) \ $(nodist_libheim_ipcs_la_SOURCES) tc.c ts.c ts-http.c DIST_SOURCES = $(dist_libheim_ipcc_la_SOURCES) \ $(dist_libheim_ipcs_la_SOURCES) tc.c ts.c ts-http.c +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/||"`;; \ @@ -167,17 +255,218 @@ 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)$(includedir)" HEADERS = $(include_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -192,16 +481,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -211,17 +503,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -240,12 +534,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -254,6 +545,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -270,10 +562,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -281,6 +571,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -295,12 +586,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -317,10 +611,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -331,13 +631,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -361,6 +655,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -384,9 +680,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -396,29 +697,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; noinst_LTLIBRARIES = libheim-ipcc.la libheim-ipcs.la dist_libheim_ipcc_la_SOURCES = hi_locl.h heim_ipc_types.h client.c common.c dist_libheim_ipcs_la_SOURCES = hi_locl.h heim_ipc_types.h server.c common.c @@ -440,7 +749,7 @@ ts_LDADD = libheim-ipcs.la $(LIB_roken) ts_http_LDADD = $(ts_LDADD) tc_LDADD = libheim-ipcc.la $(LIB_roken) -@have_gcd_TRUE@EXTRA_DIST = heim_ipc.defs heim_ipc_async.defs heim_ipc_reply.defs +EXTRA_DIST = heim_ipc.defs heim_ipc_async.defs heim_ipc_reply.defs @have_gcd_TRUE@built_ipcc = heim_ipc.h heim_ipcUser.c \ @have_gcd_TRUE@ heim_ipc_asyncServer.c heim_ipc_asyncServer.h @have_gcd_TRUE@nodist_libheim_ipcc_la_SOURCES = $(built_ipcc) @@ -452,7 +761,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -465,15 +774,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/ipc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/ipc/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -484,19 +793,6 @@ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libheim-ipcc.la: $(libheim_ipcc_la_OBJECTS) $(libheim_ipcc_la_DEPENDENCIES) - $(LINK) $(libheim_ipcc_la_OBJECTS) $(libheim_ipcc_la_LIBADD) $(LIBS) -libheim-ipcs.la: $(libheim_ipcs_la_OBJECTS) $(libheim_ipcs_la_DEPENDENCIES) - $(LINK) $(libheim_ipcs_la_OBJECTS) $(libheim_ipcs_la_LIBADD) $(LIBS) - clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ @@ -505,15 +801,35 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -tc$(EXEEXT): $(tc_OBJECTS) $(tc_DEPENDENCIES) + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_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}; \ + } + +libheim-ipcc.la: $(libheim_ipcc_la_OBJECTS) $(libheim_ipcc_la_DEPENDENCIES) $(EXTRA_libheim_ipcc_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libheim_ipcc_la_OBJECTS) $(libheim_ipcc_la_LIBADD) $(LIBS) + +libheim-ipcs.la: $(libheim_ipcs_la_OBJECTS) $(libheim_ipcs_la_DEPENDENCIES) $(EXTRA_libheim_ipcs_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libheim_ipcs_la_OBJECTS) $(libheim_ipcs_la_LIBADD) $(LIBS) + +tc$(EXEEXT): $(tc_OBJECTS) $(tc_DEPENDENCIES) $(EXTRA_tc_DEPENDENCIES) @rm -f tc$(EXEEXT) - $(LINK) $(tc_OBJECTS) $(tc_LDADD) $(LIBS) -ts$(EXEEXT): $(ts_OBJECTS) $(ts_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(tc_OBJECTS) $(tc_LDADD) $(LIBS) + +ts$(EXEEXT): $(ts_OBJECTS) $(ts_DEPENDENCIES) $(EXTRA_ts_DEPENDENCIES) @rm -f ts$(EXEEXT) - $(LINK) $(ts_OBJECTS) $(ts_LDADD) $(LIBS) -ts-http$(EXEEXT): $(ts_http_OBJECTS) $(ts_http_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(ts_OBJECTS) $(ts_LDADD) $(LIBS) + +ts-http$(EXEEXT): $(ts_http_OBJECTS) $(ts_http_DEPENDENCIES) $(EXTRA_ts_http_DEPENDENCIES) @rm -f ts-http$(EXEEXT) - $(LINK) $(ts_http_OBJECTS) $(ts_http_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(ts_http_OBJECTS) $(ts_http_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -521,38 +837,44 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipcServer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipcUser.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipc_asyncServer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipc_asyncUser.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipc_replyUser.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ts-http.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipcServer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipcUser.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipc_asyncServer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipc_asyncUser.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/heim_ipc_replyUser.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ts-http.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ts.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -561,8 +883,11 @@ -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @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"; \ @@ -576,30 +901,17 @@ @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -611,15 +923,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -628,103 +936,184 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - skipped="($$skip tests were not run)"; \ + color_start= color_end=; \ fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -760,7 +1149,7 @@ check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local installdirs: for dir in "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ @@ -775,11 +1164,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -797,7 +1194,17 @@ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/client.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/heim_ipcServer.Plo + -rm -f ./$(DEPDIR)/heim_ipcUser.Plo + -rm -f ./$(DEPDIR)/heim_ipc_asyncServer.Plo + -rm -f ./$(DEPDIR)/heim_ipc_asyncUser.Plo + -rm -f ./$(DEPDIR)/heim_ipc_replyUser.Plo + -rm -f ./$(DEPDIR)/server.Plo + -rm -f ./$(DEPDIR)/tc.Po + -rm -f ./$(DEPDIR)/ts-http.Po + -rm -f ./$(DEPDIR)/ts.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -821,9 +1228,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -845,7 +1251,17 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/client.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/heim_ipcServer.Plo + -rm -f ./$(DEPDIR)/heim_ipcUser.Plo + -rm -f ./$(DEPDIR)/heim_ipc_asyncServer.Plo + -rm -f ./$(DEPDIR)/heim_ipc_asyncUser.Plo + -rm -f ./$(DEPDIR)/heim_ipc_replyUser.Plo + -rm -f ./$(DEPDIR)/server.Plo + -rm -f ./$(DEPDIR)/tc.Po + -rm -f ./$(DEPDIR)/ts-http.Po + -rm -f ./$(DEPDIR)/ts.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -865,41 +1281,55 @@ uninstall-am: uninstall-includeHEADERS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-generic clean-libtool \ - clean-noinstLTLIBRARIES clean-noinstPROGRAMS ctags dist-hook \ - 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-generic \ + clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ install-html-am install-includeHEADERS 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-hook \ + recheck tags tags-am uninstall uninstall-am uninstall-hook \ uninstall-includeHEADERS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -907,7 +1337,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -952,11 +1382,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -964,6 +1403,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1006,6 +1447,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1019,13 +1473,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/lib/ipc/client.c b/crypto/heimdal/lib/ipc/client.c index 809fc6a010473b938d1b059ede17a8021dfd71db..b49cb22cf349275ad23bf0af55363209bcf4d63b GIT binary patch literal 13590 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 LLW&ik{@DHx)}gfe literal 13547 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 Ri8tn)6-%{h4y;ec{{hXs9fbe@ diff --git a/crypto/heimdal/lib/ipc/heim-ipc.h b/crypto/heimdal/lib/ipc/heim-ipc.h index 6fbf309f7cd4e5a191505bb184e63e4e65f00b89..b5b919b64626a5abec5724b911444206bfb2e57d GIT binary patch literal 3525 zc$~FXO>>(_5Isx3qN{QUQV~0L_Ok1(t-=UfQ!9ZMkR6}M7{=0+fl$LoA+4SwC|a|GTK4 zRnANDutN35b6{nyrCw_R>Ip5=WvOztc(WnWDt%t6yujhB$V53fBR40{!33(I61Ava zL`L(pG*gw9s;rNZaaOBbV6gP;M+l+FWUVXtxF#UrWd`e7fGnX_>nasy=24csdV?ob z6}1hoQZGSO=Bw74PzsgFCz*1>uz^-^_QEgTl&N%Gh*I-S>CUk#3fC(r zxE7V9WQat6MT#+6J;UYPErao4V;>Q+rHBsLT>Z_rd#x4a7e29JXJ z2s2S2$_&>8wG5Ie6e2Y$p?8KXu^ZtD7aB!s^`u|16I!gc$)H||lv)g3CG}oK%~dvS zR@YmZ#A6mg6x_u3PUr!SXJK&1M&1anA8-+;{3vGeJodoxN8kp29J1?q9E1^k`{qRG z^6?`rnXTtPfcJG4dQk*H2y8l=FhoM=(D7sDMK;2@llh4Gw>BUO_(2R4Hf1rI#eq!` z3Fy!hf*Y86p*zN(&NZ8`_`wjmVX;r)ZZMt$GbfChJD)fq%;w=NhzuHKHe!)GaoE%w zodJ@-z~J3^ehksrnN0RFMXa4fuRSE`Tu%&|iG+!cSm?PiWz>yaR1Wz~@I;z z)x%_*@WF0jBk!L%8sQ?Ljhv}-i|JWE5eCcR&O>iXlu?Rke!U@k8w8_>pb$Rt!aL@A z(G^UB$Y?f?JR5_=jtP$_C>So|_<9~OBOUW&FAV3im<9fTfX2Z+YJ+4Q^d1?R1K;F~ zG6mrS;gTMv3O3x2J)93oRim0iT12Rx8xz`=B}PR(=D_iiWb*7IGXdO$$;Eb<0e zG!~HoYa-t}4<^UCNuSDv+?wH51KXykz;3`9-7zBH8e=O&tZkd%hLEDUJ8spdy>Q;| ze~@LGukoDxlh@_Nr&JXM?vv$T{l0!%;r)V#sjhGv!cxd0k*gGjo6*%#le)91Pa4Uz z!VNv_#wW~bQSjAL;h8_&n>g<9$ZL^gT=UkShNo#JDaT81xcmF6-#;Hhqk~cCMaitc z$vJtdgh+_7)sY{d&st`Q?#yU9SqPor{GR3FgyrJEa&^LT^~;vEFz4Q$^=?K5-i#Ja z(bAsEoz?pkf#bzt<*Hne2Yrv3y>h9oJvhA3@Pa-GqsP^brK8*ZFl4nuT;|=vfR>LmQp8l z*@^Gk!Y|(2>5^A4w70g;VJb~ewQiePGTQ;C=6qkZp@H8fXCM95?6dKTO0RcuYITms^q0$C@A8zvIF4t% z-f!J$Wt6psoocGUC$1I)Yj>L;Nq{(?gh7`_o<4W^9}%qI>(O&$XNlD4s{c;M-aCaT zc2^)XopaQCnc@CSm!`8$bksXHif;&PC~lp{JM}m4co+&^B=ooxrKl_;$Cf6Cz`q8I z700J*vM%NKUm*<5-wEukjbhMgzv4^J>W+~;gBlOL)+kxxYd6Qt+V*WqH#p*Sxc};A G1O5kEuYEcI literal 3528 zc$~FXO>>(_5Isx3qN{QUQV~0L_Ok1(t-=UfQ!9ZMkR6}M7{=0+fl$LoA+4SwC|a|GTK4 zRnANDutN35b6{nyrCw_R>Ip5=WvOztc(WnWDt%t6yujhB$V53fBR40{!33(I61Ava zL`L(pG*gw9s;rNZaaOBbV6gP;M+l+FWUVXtxF#UrWd`e7fGnX_>nasy=24csdV?ob z6}1hoQZGSO=Bw74PzsgFCz*1>uz^-^_QEgTl&N%Gh*I-S>CUk#3fC(r zxE7V9WQat6MT#+6J;UYPErao4V;>Q+rHBsLT>Z_rd#x4a7e29JXJ z2s2S2$_&>8wG5Ie6e2Y$p?8KXu^ZtD7aB!s^`u|16I!gc$)H||lv)g3CG}oK%~dvS zR@YmZ#A6mg6x_u3PUr!SXJK&1M&1anA8-+;{3vGeJodoxN8kp29J1?q9E1^k`{qRG z^6?`rnXTtPfcJG4dQk*H2y8l=FhoM=(D7sDMK;2@llh4Gw>BUO_(2R4Hf1rI#eq!` z3Fy!hf*Y86p*zN(&NZ8`_`wjmVX;r)ZZMt$GbfChJD)fq%;w=NhzuHKHe!)GaoE%w zodJ@-z~J3^ehksrnN0RFMXa4fuRSE`Tu%&|iG+!cSm?PiWz>yaR1Wz~@I;z z)x%_*@WF0jBk!L%8sQ?Ljhv}-i|JWE5eCcR&O>iXlu?Rke!U@k8w8_>pb$Rt!aL@A z(G^UB$Y?f?JR5_=jtP$_C>So|_<9~OBOUW&FAV3im<9fTfX2Z+YJ+4Q^d1?R1K;F~ zG6mrS;gTMv3O3x2J)93oRim0iT12Rx8xz`=B}PR(=D_iiWb*7IGXdO$$;Eb<0e zG!~HoYa-t}4<^UCNuSDv+?wH51KXykz;3`9-7zBH8e=O&tZkd%hLEDUJ8spdy>Q;| ze~@LGukoDxlh@_Nr&JXM?vv$T{l0!%;r)V#sjhGv!cxd0k*gGjo6*%#le)91Pa4Uz z!VNv_#wW~bQSjAL;h8_&n>g;EQY~~sM;9K6jYq~cKg~2rIo^B2-QQRJ{`n9ZDU3)j zN@o2{+R0NTL_(ykj{g9C)-p?UXGYV>0_ouVp5@|%<>J6{b;5G>%a*k;N8g_HZbk)O zjuuVP(w@+r)%z5IL@szO zj=6lmvddDy*kjX#&D`YPVR3@znc3}@)zbNNF*sUhY9FiXBp43b?#LzHs-`<+xuv@- zrB3L+6W_IkU%a~0C9hy;Z|$JNRGOY@-8QpiwgXPh`MzpH1HVnqKKiTKYzJt(ek;?T zz!A&$uQhyHm+8RTOd{IpfP+>j^OUTbvu3*#5!E7on0Zu`Uhm@6>Ksq%FPFXETlrjFciE<=zS?lQCUWgElm!A ze+?EZj<45bUCQsjLKvFA6WCiD#h}xE#mAo29V2@NH6D7cQL@AbZ;qL@?c0=YaK!0w J|JBU~{14a3e!Bnw diff --git a/crypto/heimdal/lib/ipc/server.c b/crypto/heimdal/lib/ipc/server.c index 7b5b49ec019c4dd489962079a621d9261b44f2f9..ef91f6a0904433f2386fd72bee8bcf4495db851a GIT binary patch literal 26583 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 S=kAS#ZUkwOX`S6IYX2KPhl>6H diff --git a/crypto/heimdal/lib/ipc/tc.c b/crypto/heimdal/lib/ipc/tc.c index 8b56d21aa4725bf84702f15cec6f27e6f8c06f97..fb799bba94b71e5947392c442a857b6da728a2cb GIT binary patch literal 3519 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 L>$2daUwZ!rK6PCO literal 3623 zc$~FXQFEh45`MORMVGH)BNyw{CY7sPoJ|#$uth}{IzV<@xs-xoBuxyA0)y7Rl>hcU z-`4|Jl6UX!>HHu=chA>ff78><`?DUM(NJxkOSxKWvXVZ1JsA9reyWRACRZ^<;<1p` zV@%_Jt*S?r#Radh0`(kcyZsxOgoHk(W!S#tj05CW0PN|*AXW*~}-l5ET~d-nFwQf zkVRZR(^8drWz#3A*Q84GU)7pXa+S)ZOk&2cDJ}(VM43yiMM|4eZDooFy^b}01aPuU zeUinB5>=$qRKO^_E*JXymfDB&H|#1FtfiHx6v1_+QIU>8mx1F4wPjbU1%u$PP+BI! zMue;=10KWdGMfqyX(4Hn#WELVC)3xTb3x8MT{altYR*H{Hq4yLK(q&TIBUqM^XNK~rVb z^2+09dJx=4s6>${QuqY749MgPNR3KZoq{F0k(O{Yid1T;KcN#^thULh+K7Z(3`-^V zUdhc>G;LN@dzD0EFQm}Fite1iB|Ogp|JED1Bf7kY6Q*exdC@#_$(fF5=ue}-yPQXU z5YlhIIU$yup0djvz3Dx`W$aDh1X-p_eX5I+qiJW-_7Bkr%kbh%4GX4WS(P zO)!yW?$F~0_h%QyIKjQ$!iMhO=Lmw6(MHaVbB*$>{~-*vWjGJq8>S2?!ue%K_S*MH zAwvN^bc0)O=!O?G@k688Jala&i5!z2C=d*8JYUX3&q(J@BR2@#+-W*2O_8@sRvtg2DXVJ$+aH;fockNDx zMs=To?!3_LW7E8l1H2~lopWz$oSX7_yTGk^+-qRlY$|zIo6^KOUMg`EY1^EFZpor=K^XI<&8a%-_jPa%f#) z@RqAXTd5vJ!KPltV=2MF(zF)YX0goT)y2MbD@s1Mt)uf`G+{7MgN3o8db$kpk z4i`@nA97xQ(R(?B*P_x3{)FQjVzGtJ68&WJ7_L}pnJ;7->zK|;@rT_zVz>imQexcl zPv>mRn`Duw95)8dU##ZgAfhrMF>VqG5_W~{CB(O{VQ&guTE{EJ8vId%@jr^LG(??e zqFCWu^pU>V*$l)--u|@SSlH#?yA{@1$ER;4rq+Q?Cs@;nbD&NobiG+rxJC(G8F@OQ zZC}M{3U*6HYjA|{P^tYLG}+pXv#Gl19n?-WHrjmMM2heL(bA6=GLRMwc+E(ggI|igCZ;6`bD)#lO`2 z8q2#Mv9b_Px{qUeWKN9P0ju*h8rZL~UCBEOE(EyzsthTQm|sOd(7?c%OF&!})^P*M zZE@5#wU$LK@cM$R#)*@m7p1_>gY~db_y-Q(bIQ&3ud2wNJ71Fy7rB%z9UWeM_=cYC ze}NM(+%d{jC9LYp1o@^X3QqDZ2Q(YEJ6SAzoG+RvVW^K??`9Etv*9ATpSg>16wPoV z`EP#+bi?DM?zC(6*36M^fB$2i@9C@b*rsOG@RFBi$4enzJF0CRK5J;EUXI(gnQs_f z2?ozPF6rzHFWc^{u~TidOrKEVplu?Ek4;|j-I2%NwjG^aLpB5dv%%Qp;CNKnVD?d5 zGh{#P1H4ZESNCAwy+7>D9-1k&XwBx-uzoywt--4n9rL}R(t*B?O`}I=g^+bwaM3Tl Fe*@mYR*L`t diff --git a/crypto/heimdal/lib/ipc/ts.c b/crypto/heimdal/lib/ipc/ts.c index 680d77bc913efda29ac700cb155e59e42b70b686..e0f846eee42306a61b82959163742da64de15d39 GIT binary patch literal 2973 zc$~FX-*cNr5PlYa#f~x)OBy0O>Exkx-5D%l>!uh~Kz2N7M#XTFZVa3Phio_Ff4k4! zJ-|Xq(>~P?_}Cxce*4{Wr{j?UBbdnTQz6zH1%r49?@msBgkP(Cor-k?A-~T>c^|>- zuXTAZ(*wcVy1i^b!AL-2VbN>zxvihv->6R1iKB8O5|Ma;G3PUKPX z1S?r&r3nv0Z9o?KzpNCYWHJ#e5l4h!LR4_r@*)#T@dUPo+=&DiY7;4ZaKuSd`5^K& z#4=BW?toAzFXQT`hT7ZlSL{j>tf3Xl1cR$mVMi)Lx&$2E$sM^GEeHhva;ZejO^gsF zq=-i_`^vh*Lt0ogP9u@=qLu00w_LDhN0*ihcAHel@Bg6#b)yYZBI7FKxr*AYJH}m+ z=r16P6fZ=SmV5d2wh?f*jkdoZ#^7?HQz;~mGCiHN-j8c8_g=jh0tX72*J!dR8(vxT z1b3X~2s@F$^8|gIMh3}b5|L_^Fgrn(IE}DEN3BRHSLy*Lp}}f~49YE!X~Zy9(Cig7 zTzNfaW!dQ@oUs4`?;^ahd>e2*_q}U2wWn}?i%vATLCC^IXoKZWVdA-=&(0U2=Lhh| zA69@VM@Qt+pPqXQ_J_G|2LX6Ku&cSl5DB4u%MF! zdL~sQpl>t5yMQa(pUm*pI%f_GZ#AI{7P?gK0_#~YxBQSz7LMh^eBsZ%K%-G-Qx;4d zi(T2%F(3&n4ED9{h7imw$N8#L#5!p7+(wetxuel^C2Vxce0vg7NBh+Tl|z0Go=9_h z!f0WCu(27-zcm}!!2WH4LFgp3sdZ&tVta%C5C*qpvheLIqKr}mi}RN3rRPlpf&oW%B%6!X-WQE|_pLv(fI8s#-ORva;uk}0XFrf0=ocfdd-M@6O5w}ux4z$3qlGOlUbua zeGA8i@k-=zTH!hQbEy&`$D3acO{us$wA~kX@877WEiVu48!oapVjCY?*Ld(2>qA>1 z?|DupqoiXg#sf>ihNs)*Dvj2sUF(h)^xZa&)`LeA9t==p<6(%8kDuTSz8G{GeChQG ztZ(*uN1G$Fhi;v3qVM%f8F~YE;oz{+6Q0dBxv7cyN4u}nyL`-pbmRH-pr5?TmYUre zl;Te=R|9$*!g2TY7M1xB%YH0gvcX%j@Y6iK8a7!~}pY4iy0z!?{K64Rq~ z*5+-zjAe#DCKO#}_2M9+)FBc6$cV9E+gPU{UW+w*-RNr2UrW;9bA^n5&)e28YMki885>N)*p)9RuWkHl)s;n3*S1Ms#B@G`V7 z?vt*&JCsBG2zpw~HtuuP*W zk2lGZ97~ZSSYOho{XQMjRMEHJ$1TS{!s-rMJD{&A^@YGIyz|BCQ06vcS>@vKd-&f& WuNvr=iPZbsDutgzRphj1&&J=D(vcVd literal 2946 zc$~FXO>f&q5Iu{(VxR!ABrvj*B8S#>0a~K1MP*XuhaDpgSejf(3zJ-hT*`I>|LvYT zv!pC4Y1&hLkXQ5Z=FQvLT^)}M7{Nqto=UM=D;Ok0cz1I0Bm7zyt4yq72>5*=s{0sb zf32!}nZ*TV3_ST1XTXX|2~{f&a*2`2x{#S%J(=JuncS~smgDk)r@R=BDb30<(1j`} zdBw{uPsvWMg)EhjMfFc)tj#9lSS%U;8-mAEQK?eg)dU1_kwRT@5Cv4SE)%XTccO^P zCs@iduS|FlY7Mf~|7EQRC6}pKiXl@^Y?zYN@>)f5omM!CG30Ofk5w6n3Oyq)Wi@o!pYE)q+6quaHV4+{6e` zL56q)v#+c>Jfww1lPnfFFLyG%`<4sV?C7%Ng59Py^80`2K+|Z8l***ed75@poJI!8DL`S1YC70>}C!xh^hYYF>PiVw2RnY8} zG+ae9W>wYcB$zQDeD@-_u{;}az3|*?Hnpd4ev3{tIex%`FtEXLrZ91xz+>lO;Cep% z@rUJO%Fz+I^wD!}!TzxDY~Kgh19r8TGekmY&vF80`zFFo=HZk%mnI+zIBo!QcEth= z3tW>b641Aq;9kI$?M-I*)jDT$7Tjt=7c6k7+y&ONU}1Ryn}l=AgGJ~qTwkM6XH(`+ z<`%oMr(-}8SQzYU+X=v*S@Zc><>0JV|lk`3+vmzg&2fRLYrDw)+M$#_zz)lTPC4rUlC=L!Vk}PWG`KJ>Jt>g z`?hz@CboYHbJy3Jg}!ZKk-*aB5d{T9H?Ge^pK0ls6WE>?E&}E{Ljsz)H>eGgwJ>|C zWp*9iGs@(8w}eZ2=v^@3W@e+^BUQC(7HQ$5dXs?AI+0iv^$a@Af@5FK*`@7FwCXMa z-7w!C;-)d50$5Y|#=6x#hPr*)F67oMI|FR$O$BxV*7TYY`8F6w!DsE*xEF-vhm%>W zKAnYQ!+0f%B&+eB{JB!8kmL0)ho(&29op{8yZ3L@(}q`v_B9vz8?i|att-5E%hjQ+ zl=r+KlTp#Nl;DM>V9m2lw9MkwY1g{tC7s*WvGd^7gck!e*mxP@$Hz}_244)i4ZigH z1lBiuy`%M!*+aL^H_`X{r3^fqyXdwECLC?Qj_(qHXXE+wfOJvkk*074mH3m(<$%5o z;kf(t$rr`2)}F(_z`ue8(4~# z8zs`mroJ{-T;YqfqIZq9X4`J7j$gu{8OComttm?JNUXse4vk(j0B^ehFO&J=KIyu< zgE+)V?`Z|2);u6hFuX@op%W?ZnU41oqR3h-=5`b{18?;94d-#PKJ6HyEUt@Wokrw{ zM1f#^N$2-{Hm0ef1K!6i$3MdA4%%)&UsLJ}fmisji{+uryNswV#N+qyzlUD8&@U6I R_jjih9*4RtXwROFzX4tsiktud diff --git a/crypto/heimdal/lib/kadm5/Makefile.am b/crypto/heimdal/lib/kadm5/Makefile.am --- a/crypto/heimdal/lib/kadm5/Makefile.am +++ b/crypto/heimdal/lib/kadm5/Makefile.am @@ -2,11 +2,15 @@ include $(top_srcdir)/Makefile.am.common +libkadm5srv_la_CPPFLAGS = -I$(srcdir)/../krb5 +libkadm5clnt_la_CPPFLAGS = -I$(srcdir)/../krb5 + lib_LTLIBRARIES = libkadm5srv.la libkadm5clnt.la libkadm5srv_la_LDFLAGS = -version-info 8:1:0 libkadm5clnt_la_LDFLAGS = -version-info 7:1:0 if versionscript +libkadm5clnt_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script-client.map libkadm5srv_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map endif @@ -28,12 +32,13 @@ libexec_PROGRAMS = ipropd-master ipropd-slave default_keys_SOURCES = default_keys.c +default_keys_CPPFLAGS = -I$(srcdir)/../krb5 kadm5includedir = $(includedir)/kadm5 buildkadm5include = $(buildinclude)/kadm5 dist_kadm5include_HEADERS = admin.h private.h kadm5-pwcheck.h -dist_kadm5include_HEADERS += kadm5-protos.h kadm5-private.h +dist_kadm5include_HEADERS += $(srcdir)/kadm5-protos.h $(srcdir)/kadm5-private.h nodist_kadm5include_HEADERS = kadm5_err.h @@ -105,6 +110,7 @@ randkey_s.c \ rename_s.c \ server_glue.c \ + setkey3_s.c \ set_keys.c \ set_modifier.c \ admin.h @@ -120,8 +126,10 @@ nodist_iprop_log_SOURCES = iprop-commands.c ipropd_master_SOURCES = ipropd_master.c ipropd_common.c iprop.h kadm5_locl.h +ipropd_master_CPPFLAGS = -I$(srcdir)/../krb5 ipropd_slave_SOURCES = ipropd_slave.c ipropd_common.c iprop.h kadm5_locl.h +ipropd_slave_CPPFLAGS = -I$(srcdir)/../krb5 man_MANS = kadm5_pwcheck.3 iprop.8 iprop-log.8 @@ -132,7 +140,7 @@ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_hcrypto) \ $(LIB_roken) \ - $(DBLIB) \ + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) \ $(LIB_dlopen) \ $(LIB_pidfile) @@ -145,15 +153,17 @@ $(top_builddir)/lib/sl/libsl.la \ $(LIB_readline) \ $(LIB_roken) \ - $(DBLIB) \ + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) \ $(LIB_dlopen) \ $(LIB_pidfile) +iprop_log_CPPFLAGS = -I$(srcdir)/../krb5 iprop-commands.c iprop-commands.h: iprop-commands.in $(SLC) $(srcdir)/iprop-commands.in $(libkadm5srv_la_OBJECTS): kadm5_err.h +$(libkadm5clnt_la_OBJECTS): kadm5_err.h $(iprop_log_OBJECTS): iprop-commands.h client_glue.lo server_glue.lo: $(srcdir)/common_glue.c @@ -164,17 +174,30 @@ kadm5_err.h: kadm5_err.et -$(libkadm5clnt_la_OBJECTS) $(libkadm5srv_la_OBJECTS): $(srcdir)/kadm5-protos.h $(srcdir)/kadm5-private.h +ALL_OBJECTS = $(libkadm5clnt_la_OBJECTS) +ALL_OBJECTS += $(libkadm5srv_la_OBJECTS) +ALL_OBJECTS += $(ipropd_master_OBJECTS) +ALL_OBJECTS += $(ipropd_slave_OBJECTS) +ALL_OBJECTS += $(iprop_log_OBJECTS) +ALL_OBJECTS += $(test_pw_quality_OBJECTS) +ALL_OBJECTS += $(sample_passwd_check_la_OBJECTS) +ALL_OBJECTS += $(default_keys_OBJECTS) + +$(ALL_OBJECTS): $(srcdir)/kadm5-protos.h $(srcdir)/kadm5-private.h +$(ALL_OBJECTS): kadm5_err.h + +KADM5_PROTOS_SRCS = $(dist_libkadm5clnt_la_SOURCES) +KADM5_PROTOS_SRCS += $(dist_libkadm5srv_la_SOURCES) proto_opts = -q -R '^(_|kadm5_c_|kadm5_s_|kadm5_log)' -P comment -$(srcdir)/kadm5-protos.h: +$(srcdir)/kadm5-protos.h: $(KADM5_PROTOS_SRCS) cd $(srcdir); perl ../../cf/make-proto.pl $(proto_opts) \ -o kadm5-protos.h \ $(dist_libkadm5clnt_la_SOURCES) \ $(dist_libkadm5srv_la_SOURCES) \ || rm -f kadm5-protos.h -$(srcdir)/kadm5-private.h: +$(srcdir)/kadm5-private.h: $(KADM5_PROTOS_SRCS) cd $(srcdir); perl ../../cf/make-proto.pl $(proto_opts) \ -p kadm5-private.h \ $(dist_libkadm5clnt_la_SOURCES) \ @@ -194,4 +217,5 @@ check-cracklib.pl \ flush.c \ sample_passwd_check.c \ - version-script.map + version-script.map \ + version-script-client.map diff --git a/crypto/heimdal/lib/kadm5/Makefile.in b/crypto/heimdal/lib/kadm5/Makefile.in --- a/crypto/heimdal/lib/kadm5/Makefile.in +++ b/crypto/heimdal/lib/kadm5/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,10 +96,8 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(dist_kadm5include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog -@versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map +@versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script-client.map +@versionscript_TRUE@am__append_2 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map sbin_PROGRAMS = iprop-log$(EXEEXT) check_PROGRAMS = default_keys$(EXEEXT) noinst_PROGRAMS = test_pw_quality$(EXEEXT) @@ -54,7 +106,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -65,8 +116,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -79,6 +129,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -98,10 +149,17 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_kadm5include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" \ + "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" \ + "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(kadm5includedir)" \ + "$(DESTDIR)$(kadm5includedir)" +PROGRAMS = $(libexec_PROGRAMS) $(noinst_PROGRAMS) $(sbin_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -123,44 +181,66 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" \ - "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man3dir)" \ - "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(kadm5includedir)" \ - "$(DESTDIR)$(kadm5includedir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libkadm5clnt_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ ../krb5/libkrb5.la $(am__DEPENDENCIES_1) -dist_libkadm5clnt_la_OBJECTS = ad.lo chpass_c.lo client_glue.lo \ - common_glue.lo create_c.lo delete_c.lo destroy_c.lo flush_c.lo \ - free.lo get_c.lo get_princs_c.lo init_c.lo marshall.lo \ - modify_c.lo privs_c.lo randkey_c.lo rename_c.lo send_recv.lo -nodist_libkadm5clnt_la_OBJECTS = kadm5_err.lo +dist_libkadm5clnt_la_OBJECTS = libkadm5clnt_la-ad.lo \ + libkadm5clnt_la-chpass_c.lo libkadm5clnt_la-client_glue.lo \ + libkadm5clnt_la-common_glue.lo libkadm5clnt_la-create_c.lo \ + libkadm5clnt_la-delete_c.lo libkadm5clnt_la-destroy_c.lo \ + libkadm5clnt_la-flush_c.lo libkadm5clnt_la-free.lo \ + libkadm5clnt_la-get_c.lo libkadm5clnt_la-get_princs_c.lo \ + libkadm5clnt_la-init_c.lo libkadm5clnt_la-marshall.lo \ + libkadm5clnt_la-modify_c.lo libkadm5clnt_la-privs_c.lo \ + libkadm5clnt_la-randkey_c.lo libkadm5clnt_la-rename_c.lo \ + libkadm5clnt_la-send_recv.lo +nodist_libkadm5clnt_la_OBJECTS = libkadm5clnt_la-kadm5_err.lo libkadm5clnt_la_OBJECTS = $(dist_libkadm5clnt_la_OBJECTS) \ $(nodist_libkadm5clnt_la_OBJECTS) -libkadm5clnt_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libkadm5clnt_la_LDFLAGS) $(LDFLAGS) -o $@ -dist_libkadm5srv_la_OBJECTS = acl.lo bump_pw_expire.lo chpass_s.lo \ - common_glue.lo context_s.lo create_s.lo delete_s.lo \ - destroy_s.lo ent_setup.lo error.lo flush_s.lo free.lo \ - get_princs_s.lo get_s.lo init_s.lo keys.lo log.lo marshall.lo \ - modify_s.lo password_quality.lo privs_s.lo randkey_s.lo \ - rename_s.lo server_glue.lo set_keys.lo set_modifier.lo -nodist_libkadm5srv_la_OBJECTS = kadm5_err.lo +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libkadm5clnt_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libkadm5clnt_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +dist_libkadm5srv_la_OBJECTS = libkadm5srv_la-acl.lo \ + libkadm5srv_la-bump_pw_expire.lo libkadm5srv_la-chpass_s.lo \ + libkadm5srv_la-common_glue.lo libkadm5srv_la-context_s.lo \ + libkadm5srv_la-create_s.lo libkadm5srv_la-delete_s.lo \ + libkadm5srv_la-destroy_s.lo libkadm5srv_la-ent_setup.lo \ + libkadm5srv_la-error.lo libkadm5srv_la-flush_s.lo \ + libkadm5srv_la-free.lo libkadm5srv_la-get_princs_s.lo \ + libkadm5srv_la-get_s.lo libkadm5srv_la-init_s.lo \ + libkadm5srv_la-keys.lo libkadm5srv_la-log.lo \ + libkadm5srv_la-marshall.lo libkadm5srv_la-modify_s.lo \ + libkadm5srv_la-password_quality.lo libkadm5srv_la-privs_s.lo \ + libkadm5srv_la-randkey_s.lo libkadm5srv_la-rename_s.lo \ + libkadm5srv_la-server_glue.lo libkadm5srv_la-setkey3_s.lo \ + libkadm5srv_la-set_keys.lo libkadm5srv_la-set_modifier.lo +nodist_libkadm5srv_la_OBJECTS = libkadm5srv_la-kadm5_err.lo libkadm5srv_la_OBJECTS = $(dist_libkadm5srv_la_OBJECTS) \ $(nodist_libkadm5srv_la_OBJECTS) -libkadm5srv_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libkadm5srv_la_LDFLAGS) $(LDFLAGS) -o $@ +libkadm5srv_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libkadm5srv_la_LDFLAGS) $(LDFLAGS) -o \ + $@ sample_passwd_check_la_LIBADD = am_sample_passwd_check_la_OBJECTS = sample_passwd_check.lo sample_passwd_check_la_OBJECTS = $(am_sample_passwd_check_la_OBJECTS) -sample_passwd_check_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(sample_passwd_check_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(libexec_PROGRAMS) $(noinst_PROGRAMS) $(sbin_PROGRAMS) -am_default_keys_OBJECTS = default_keys.$(OBJEXT) +sample_passwd_check_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(sample_passwd_check_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +am_default_keys_OBJECTS = default_keys-default_keys.$(OBJEXT) default_keys_OBJECTS = $(am_default_keys_OBJECTS) default_keys_LDADD = $(LDADD) default_keys_DEPENDENCIES = libkadm5srv.la \ @@ -168,9 +248,11 @@ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -dist_iprop_log_OBJECTS = iprop-log.$(OBJEXT) -nodist_iprop_log_OBJECTS = iprop-commands.$(OBJEXT) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +dist_iprop_log_OBJECTS = iprop_log-iprop-log.$(OBJEXT) +nodist_iprop_log_OBJECTS = iprop_log-iprop-commands.$(OBJEXT) iprop_log_OBJECTS = $(dist_iprop_log_OBJECTS) \ $(nodist_iprop_log_OBJECTS) iprop_log_DEPENDENCIES = libkadm5srv.la \ @@ -179,9 +261,11 @@ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/sl/libsl.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am_ipropd_master_OBJECTS = ipropd_master.$(OBJEXT) \ - ipropd_common.$(OBJEXT) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_ipropd_master_OBJECTS = ipropd_master-ipropd_master.$(OBJEXT) \ + ipropd_master-ipropd_common.$(OBJEXT) ipropd_master_OBJECTS = $(am_ipropd_master_OBJECTS) ipropd_master_LDADD = $(LDADD) ipropd_master_DEPENDENCIES = libkadm5srv.la \ @@ -189,9 +273,11 @@ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) -am_ipropd_slave_OBJECTS = ipropd_slave.$(OBJEXT) \ - ipropd_common.$(OBJEXT) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +am_ipropd_slave_OBJECTS = ipropd_slave-ipropd_slave.$(OBJEXT) \ + ipropd_slave-ipropd_common.$(OBJEXT) ipropd_slave_OBJECTS = $(am_ipropd_slave_OBJECTS) ipropd_slave_LDADD = $(LDADD) ipropd_slave_DEPENDENCIES = libkadm5srv.la \ @@ -199,7 +285,9 @@ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) test_pw_quality_SOURCES = test_pw_quality.c test_pw_quality_OBJECTS = test_pw_quality.$(OBJEXT) test_pw_quality_LDADD = $(LDADD) @@ -208,19 +296,98 @@ $(top_builddir)/lib/krb5/libkrb5.la \ $(top_builddir)/lib/asn1/libasn1.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/default_keys-default_keys.Po \ + ./$(DEPDIR)/iprop_log-iprop-commands.Po \ + ./$(DEPDIR)/iprop_log-iprop-log.Po \ + ./$(DEPDIR)/ipropd_master-ipropd_common.Po \ + ./$(DEPDIR)/ipropd_master-ipropd_master.Po \ + ./$(DEPDIR)/ipropd_slave-ipropd_common.Po \ + ./$(DEPDIR)/ipropd_slave-ipropd_slave.Po \ + ./$(DEPDIR)/libkadm5clnt_la-ad.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-chpass_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-client_glue.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-common_glue.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-create_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-delete_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-destroy_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-flush_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-free.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-get_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-get_princs_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-init_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-kadm5_err.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-marshall.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-modify_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-privs_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-randkey_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-rename_c.Plo \ + ./$(DEPDIR)/libkadm5clnt_la-send_recv.Plo \ + ./$(DEPDIR)/libkadm5srv_la-acl.Plo \ + ./$(DEPDIR)/libkadm5srv_la-bump_pw_expire.Plo \ + ./$(DEPDIR)/libkadm5srv_la-chpass_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-common_glue.Plo \ + ./$(DEPDIR)/libkadm5srv_la-context_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-create_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-delete_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-destroy_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-ent_setup.Plo \ + ./$(DEPDIR)/libkadm5srv_la-error.Plo \ + ./$(DEPDIR)/libkadm5srv_la-flush_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-free.Plo \ + ./$(DEPDIR)/libkadm5srv_la-get_princs_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-get_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-init_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-kadm5_err.Plo \ + ./$(DEPDIR)/libkadm5srv_la-keys.Plo \ + ./$(DEPDIR)/libkadm5srv_la-log.Plo \ + ./$(DEPDIR)/libkadm5srv_la-marshall.Plo \ + ./$(DEPDIR)/libkadm5srv_la-modify_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-password_quality.Plo \ + ./$(DEPDIR)/libkadm5srv_la-privs_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-randkey_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-rename_s.Plo \ + ./$(DEPDIR)/libkadm5srv_la-server_glue.Plo \ + ./$(DEPDIR)/libkadm5srv_la-set_keys.Plo \ + ./$(DEPDIR)/libkadm5srv_la-set_modifier.Plo \ + ./$(DEPDIR)/libkadm5srv_la-setkey3_s.Plo \ + ./$(DEPDIR)/sample_passwd_check.Plo \ + ./$(DEPDIR)/test_pw_quality.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(dist_libkadm5clnt_la_SOURCES) \ $(nodist_libkadm5clnt_la_SOURCES) \ $(dist_libkadm5srv_la_SOURCES) \ @@ -234,17 +401,43 @@ $(sample_passwd_check_la_SOURCES) $(default_keys_SOURCES) \ $(dist_iprop_log_SOURCES) $(ipropd_master_SOURCES) \ $(ipropd_slave_SOURCES) test_pw_quality.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac man3dir = $(mandir)/man3 man8dir = $(mandir)/man8 MANS = $(man_MANS) HEADERS = $(dist_kadm5include_HEADERS) $(nodist_kadm5include_HEADERS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -259,16 +452,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -278,17 +474,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -307,12 +505,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -321,6 +516,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -337,10 +533,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -348,6 +542,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -362,12 +557,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -384,10 +582,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -398,13 +602,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -428,6 +626,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -451,9 +651,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -463,32 +668,42 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +libkadm5srv_la_CPPFLAGS = -I$(srcdir)/../krb5 +libkadm5clnt_la_CPPFLAGS = -I$(srcdir)/../krb5 lib_LTLIBRARIES = libkadm5srv.la libkadm5clnt.la -libkadm5srv_la_LDFLAGS = -version-info 8:1:0 $(am__append_1) -libkadm5clnt_la_LDFLAGS = -version-info 7:1:0 +libkadm5srv_la_LDFLAGS = -version-info 8:1:0 $(am__append_2) +libkadm5clnt_la_LDFLAGS = -version-info 7:1:0 $(am__append_1) noinst_LTLIBRARIES = sample_passwd_check.la sample_passwd_check_la_SOURCES = sample_passwd_check.c sample_passwd_check_la_LDFLAGS = -module @@ -500,10 +715,11 @@ $(LIB_com_err) ../krb5/libkrb5.la $(LIBADD_roken) default_keys_SOURCES = default_keys.c +default_keys_CPPFLAGS = -I$(srcdir)/../krb5 kadm5includedir = $(includedir)/kadm5 buildkadm5include = $(buildinclude)/kadm5 dist_kadm5include_HEADERS = admin.h private.h kadm5-pwcheck.h \ - kadm5-protos.h kadm5-private.h + $(srcdir)/kadm5-protos.h $(srcdir)/kadm5-private.h nodist_kadm5include_HEADERS = kadm5_err.h dist_libkadm5clnt_la_SOURCES = \ ad.c \ @@ -560,6 +776,7 @@ randkey_s.c \ rename_s.c \ server_glue.c \ + setkey3_s.c \ set_keys.c \ set_modifier.c \ admin.h @@ -574,7 +791,9 @@ dist_iprop_log_SOURCES = iprop-log.c nodist_iprop_log_SOURCES = iprop-commands.c ipropd_master_SOURCES = ipropd_master.c ipropd_common.c iprop.h kadm5_locl.h +ipropd_master_CPPFLAGS = -I$(srcdir)/../krb5 ipropd_slave_SOURCES = ipropd_slave.c ipropd_common.c iprop.h kadm5_locl.h +ipropd_slave_CPPFLAGS = -I$(srcdir)/../krb5 man_MANS = kadm5_pwcheck.3 iprop.8 iprop-log.8 LDADD = \ libkadm5srv.la \ @@ -583,7 +802,7 @@ $(top_builddir)/lib/asn1/libasn1.la \ $(LIB_hcrypto) \ $(LIB_roken) \ - $(DBLIB) \ + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) \ $(LIB_dlopen) \ $(LIB_pidfile) @@ -596,11 +815,18 @@ $(top_builddir)/lib/sl/libsl.la \ $(LIB_readline) \ $(LIB_roken) \ - $(DBLIB) \ + $(DB3LIB) $(DB1LIB) $(LMDBLIB) $(NDBMLIB) \ $(LIB_dlopen) \ $(LIB_pidfile) +iprop_log_CPPFLAGS = -I$(srcdir)/../krb5 CLEANFILES = kadm5_err.c kadm5_err.h iprop-commands.h iprop-commands.c +ALL_OBJECTS = $(libkadm5clnt_la_OBJECTS) $(libkadm5srv_la_OBJECTS) \ + $(ipropd_master_OBJECTS) $(ipropd_slave_OBJECTS) \ + $(iprop_log_OBJECTS) $(test_pw_quality_OBJECTS) \ + $(sample_passwd_check_la_OBJECTS) $(default_keys_OBJECTS) +KADM5_PROTOS_SRCS = $(dist_libkadm5clnt_la_SOURCES) \ + $(dist_libkadm5srv_la_SOURCES) proto_opts = -q -R '^(_|kadm5_c_|kadm5_s_|kadm5_log)' -P comment EXTRA_DIST = \ NTMakefile \ @@ -615,12 +841,13 @@ check-cracklib.pl \ flush.c \ sample_passwd_check.c \ - version-script.map + version-script.map \ + version-script-client.map all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -633,15 +860,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/kadm5/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/kadm5/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -651,52 +878,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libkadm5clnt.la: $(libkadm5clnt_la_OBJECTS) $(libkadm5clnt_la_DEPENDENCIES) - $(libkadm5clnt_la_LINK) -rpath $(libdir) $(libkadm5clnt_la_OBJECTS) $(libkadm5clnt_la_LIBADD) $(LIBS) -libkadm5srv.la: $(libkadm5srv_la_OBJECTS) $(libkadm5srv_la_DEPENDENCIES) - $(libkadm5srv_la_LINK) -rpath $(libdir) $(libkadm5srv_la_OBJECTS) $(libkadm5srv_la_LIBADD) $(LIBS) -sample_passwd_check.la: $(sample_passwd_check_la_OBJECTS) $(sample_passwd_check_la_DEPENDENCIES) - $(sample_passwd_check_la_LINK) $(sample_passwd_check_la_OBJECTS) $(sample_passwd_check_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ @@ -708,14 +889,19 @@ rm -f $$list install-libexecPROGRAMS: $(libexec_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexecdir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -736,7 +922,8 @@ @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexecdir)" && rm -f $$files @@ -760,14 +947,19 @@ rm -f $$list install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(sbindir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -788,7 +980,8 @@ @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files @@ -801,21 +994,81 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -default_keys$(EXEEXT): $(default_keys_OBJECTS) $(default_keys_DEPENDENCIES) + +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}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_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}; \ + } + +libkadm5clnt.la: $(libkadm5clnt_la_OBJECTS) $(libkadm5clnt_la_DEPENDENCIES) $(EXTRA_libkadm5clnt_la_DEPENDENCIES) + $(AM_V_CCLD)$(libkadm5clnt_la_LINK) -rpath $(libdir) $(libkadm5clnt_la_OBJECTS) $(libkadm5clnt_la_LIBADD) $(LIBS) + +libkadm5srv.la: $(libkadm5srv_la_OBJECTS) $(libkadm5srv_la_DEPENDENCIES) $(EXTRA_libkadm5srv_la_DEPENDENCIES) + $(AM_V_CCLD)$(libkadm5srv_la_LINK) -rpath $(libdir) $(libkadm5srv_la_OBJECTS) $(libkadm5srv_la_LIBADD) $(LIBS) + +sample_passwd_check.la: $(sample_passwd_check_la_OBJECTS) $(sample_passwd_check_la_DEPENDENCIES) $(EXTRA_sample_passwd_check_la_DEPENDENCIES) + $(AM_V_CCLD)$(sample_passwd_check_la_LINK) $(sample_passwd_check_la_OBJECTS) $(sample_passwd_check_la_LIBADD) $(LIBS) + +default_keys$(EXEEXT): $(default_keys_OBJECTS) $(default_keys_DEPENDENCIES) $(EXTRA_default_keys_DEPENDENCIES) @rm -f default_keys$(EXEEXT) - $(LINK) $(default_keys_OBJECTS) $(default_keys_LDADD) $(LIBS) -iprop-log$(EXEEXT): $(iprop_log_OBJECTS) $(iprop_log_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(default_keys_OBJECTS) $(default_keys_LDADD) $(LIBS) + +iprop-log$(EXEEXT): $(iprop_log_OBJECTS) $(iprop_log_DEPENDENCIES) $(EXTRA_iprop_log_DEPENDENCIES) @rm -f iprop-log$(EXEEXT) - $(LINK) $(iprop_log_OBJECTS) $(iprop_log_LDADD) $(LIBS) -ipropd-master$(EXEEXT): $(ipropd_master_OBJECTS) $(ipropd_master_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(iprop_log_OBJECTS) $(iprop_log_LDADD) $(LIBS) + +ipropd-master$(EXEEXT): $(ipropd_master_OBJECTS) $(ipropd_master_DEPENDENCIES) $(EXTRA_ipropd_master_DEPENDENCIES) @rm -f ipropd-master$(EXEEXT) - $(LINK) $(ipropd_master_OBJECTS) $(ipropd_master_LDADD) $(LIBS) -ipropd-slave$(EXEEXT): $(ipropd_slave_OBJECTS) $(ipropd_slave_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(ipropd_master_OBJECTS) $(ipropd_master_LDADD) $(LIBS) + +ipropd-slave$(EXEEXT): $(ipropd_slave_OBJECTS) $(ipropd_slave_DEPENDENCIES) $(EXTRA_ipropd_slave_DEPENDENCIES) @rm -f ipropd-slave$(EXEEXT) - $(LINK) $(ipropd_slave_OBJECTS) $(ipropd_slave_LDADD) $(LIBS) -test_pw_quality$(EXEEXT): $(test_pw_quality_OBJECTS) $(test_pw_quality_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(ipropd_slave_OBJECTS) $(ipropd_slave_LDADD) $(LIBS) + +test_pw_quality$(EXEEXT): $(test_pw_quality_OBJECTS) $(test_pw_quality_DEPENDENCIES) $(EXTRA_test_pw_quality_DEPENDENCIES) @rm -f test_pw_quality$(EXEEXT) - $(LINK) $(test_pw_quality_OBJECTS) $(test_pw_quality_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_pw_quality_OBJECTS) $(test_pw_quality_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -823,77 +1076,516 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/acl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ad.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bump_pw_expire.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpass_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chpass_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_glue.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common_glue.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/context_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/create_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default_keys.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delete_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/destroy_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/destroy_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ent_setup.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flush_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flush_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/free.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_princs_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_princs_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/init_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iprop-commands.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iprop-log.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipropd_common.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipropd_master.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipropd_slave.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/kadm5_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keys.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/marshall.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modify_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/modify_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/password_quality.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privs_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privs_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randkey_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/randkey_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename_c.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rename_s.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample_passwd_check.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/send_recv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server_glue.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_keys.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_modifier.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pw_quality.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/default_keys-default_keys.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iprop_log-iprop-commands.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iprop_log-iprop-log.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipropd_master-ipropd_common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipropd_master-ipropd_master.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipropd_slave-ipropd_common.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipropd_slave-ipropd_slave.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-ad.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-chpass_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-client_glue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-common_glue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-create_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-delete_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-destroy_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-flush_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-free.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-get_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-get_princs_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-init_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-kadm5_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-marshall.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-modify_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-privs_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-randkey_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-rename_c.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5clnt_la-send_recv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-acl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-bump_pw_expire.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-chpass_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-common_glue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-context_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-create_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-delete_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-destroy_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-ent_setup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-flush_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-free.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-get_princs_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-get_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-init_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-kadm5_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-keys.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-log.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-marshall.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-modify_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-password_quality.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-privs_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-randkey_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-rename_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-server_glue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-set_keys.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-set_modifier.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkadm5srv_la-setkey3_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample_passwd_check.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pw_quality.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +libkadm5clnt_la-ad.lo: ad.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-ad.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-ad.Tpo -c -o libkadm5clnt_la-ad.lo `test -f 'ad.c' || echo '$(srcdir)/'`ad.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-ad.Tpo $(DEPDIR)/libkadm5clnt_la-ad.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ad.c' object='libkadm5clnt_la-ad.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-ad.lo `test -f 'ad.c' || echo '$(srcdir)/'`ad.c + +libkadm5clnt_la-chpass_c.lo: chpass_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-chpass_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-chpass_c.Tpo -c -o libkadm5clnt_la-chpass_c.lo `test -f 'chpass_c.c' || echo '$(srcdir)/'`chpass_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-chpass_c.Tpo $(DEPDIR)/libkadm5clnt_la-chpass_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='chpass_c.c' object='libkadm5clnt_la-chpass_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-chpass_c.lo `test -f 'chpass_c.c' || echo '$(srcdir)/'`chpass_c.c + +libkadm5clnt_la-client_glue.lo: client_glue.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-client_glue.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-client_glue.Tpo -c -o libkadm5clnt_la-client_glue.lo `test -f 'client_glue.c' || echo '$(srcdir)/'`client_glue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-client_glue.Tpo $(DEPDIR)/libkadm5clnt_la-client_glue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='client_glue.c' object='libkadm5clnt_la-client_glue.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-client_glue.lo `test -f 'client_glue.c' || echo '$(srcdir)/'`client_glue.c + +libkadm5clnt_la-common_glue.lo: common_glue.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-common_glue.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-common_glue.Tpo -c -o libkadm5clnt_la-common_glue.lo `test -f 'common_glue.c' || echo '$(srcdir)/'`common_glue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-common_glue.Tpo $(DEPDIR)/libkadm5clnt_la-common_glue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common_glue.c' object='libkadm5clnt_la-common_glue.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-common_glue.lo `test -f 'common_glue.c' || echo '$(srcdir)/'`common_glue.c + +libkadm5clnt_la-create_c.lo: create_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-create_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-create_c.Tpo -c -o libkadm5clnt_la-create_c.lo `test -f 'create_c.c' || echo '$(srcdir)/'`create_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-create_c.Tpo $(DEPDIR)/libkadm5clnt_la-create_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create_c.c' object='libkadm5clnt_la-create_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-create_c.lo `test -f 'create_c.c' || echo '$(srcdir)/'`create_c.c + +libkadm5clnt_la-delete_c.lo: delete_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-delete_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-delete_c.Tpo -c -o libkadm5clnt_la-delete_c.lo `test -f 'delete_c.c' || echo '$(srcdir)/'`delete_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-delete_c.Tpo $(DEPDIR)/libkadm5clnt_la-delete_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='delete_c.c' object='libkadm5clnt_la-delete_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-delete_c.lo `test -f 'delete_c.c' || echo '$(srcdir)/'`delete_c.c + +libkadm5clnt_la-destroy_c.lo: destroy_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-destroy_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-destroy_c.Tpo -c -o libkadm5clnt_la-destroy_c.lo `test -f 'destroy_c.c' || echo '$(srcdir)/'`destroy_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-destroy_c.Tpo $(DEPDIR)/libkadm5clnt_la-destroy_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='destroy_c.c' object='libkadm5clnt_la-destroy_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-destroy_c.lo `test -f 'destroy_c.c' || echo '$(srcdir)/'`destroy_c.c + +libkadm5clnt_la-flush_c.lo: flush_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-flush_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-flush_c.Tpo -c -o libkadm5clnt_la-flush_c.lo `test -f 'flush_c.c' || echo '$(srcdir)/'`flush_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-flush_c.Tpo $(DEPDIR)/libkadm5clnt_la-flush_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='flush_c.c' object='libkadm5clnt_la-flush_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-flush_c.lo `test -f 'flush_c.c' || echo '$(srcdir)/'`flush_c.c + +libkadm5clnt_la-free.lo: free.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-free.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-free.Tpo -c -o libkadm5clnt_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-free.Tpo $(DEPDIR)/libkadm5clnt_la-free.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='free.c' object='libkadm5clnt_la-free.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c + +libkadm5clnt_la-get_c.lo: get_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-get_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-get_c.Tpo -c -o libkadm5clnt_la-get_c.lo `test -f 'get_c.c' || echo '$(srcdir)/'`get_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-get_c.Tpo $(DEPDIR)/libkadm5clnt_la-get_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_c.c' object='libkadm5clnt_la-get_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-get_c.lo `test -f 'get_c.c' || echo '$(srcdir)/'`get_c.c + +libkadm5clnt_la-get_princs_c.lo: get_princs_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-get_princs_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-get_princs_c.Tpo -c -o libkadm5clnt_la-get_princs_c.lo `test -f 'get_princs_c.c' || echo '$(srcdir)/'`get_princs_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-get_princs_c.Tpo $(DEPDIR)/libkadm5clnt_la-get_princs_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_princs_c.c' object='libkadm5clnt_la-get_princs_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-get_princs_c.lo `test -f 'get_princs_c.c' || echo '$(srcdir)/'`get_princs_c.c + +libkadm5clnt_la-init_c.lo: init_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-init_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-init_c.Tpo -c -o libkadm5clnt_la-init_c.lo `test -f 'init_c.c' || echo '$(srcdir)/'`init_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-init_c.Tpo $(DEPDIR)/libkadm5clnt_la-init_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init_c.c' object='libkadm5clnt_la-init_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-init_c.lo `test -f 'init_c.c' || echo '$(srcdir)/'`init_c.c + +libkadm5clnt_la-marshall.lo: marshall.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-marshall.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-marshall.Tpo -c -o libkadm5clnt_la-marshall.lo `test -f 'marshall.c' || echo '$(srcdir)/'`marshall.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-marshall.Tpo $(DEPDIR)/libkadm5clnt_la-marshall.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='marshall.c' object='libkadm5clnt_la-marshall.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-marshall.lo `test -f 'marshall.c' || echo '$(srcdir)/'`marshall.c + +libkadm5clnt_la-modify_c.lo: modify_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-modify_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-modify_c.Tpo -c -o libkadm5clnt_la-modify_c.lo `test -f 'modify_c.c' || echo '$(srcdir)/'`modify_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-modify_c.Tpo $(DEPDIR)/libkadm5clnt_la-modify_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modify_c.c' object='libkadm5clnt_la-modify_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-modify_c.lo `test -f 'modify_c.c' || echo '$(srcdir)/'`modify_c.c + +libkadm5clnt_la-privs_c.lo: privs_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-privs_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-privs_c.Tpo -c -o libkadm5clnt_la-privs_c.lo `test -f 'privs_c.c' || echo '$(srcdir)/'`privs_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-privs_c.Tpo $(DEPDIR)/libkadm5clnt_la-privs_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='privs_c.c' object='libkadm5clnt_la-privs_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-privs_c.lo `test -f 'privs_c.c' || echo '$(srcdir)/'`privs_c.c + +libkadm5clnt_la-randkey_c.lo: randkey_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-randkey_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-randkey_c.Tpo -c -o libkadm5clnt_la-randkey_c.lo `test -f 'randkey_c.c' || echo '$(srcdir)/'`randkey_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-randkey_c.Tpo $(DEPDIR)/libkadm5clnt_la-randkey_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='randkey_c.c' object='libkadm5clnt_la-randkey_c.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-randkey_c.lo `test -f 'randkey_c.c' || echo '$(srcdir)/'`randkey_c.c + +libkadm5clnt_la-rename_c.lo: rename_c.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-rename_c.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-rename_c.Tpo -c -o libkadm5clnt_la-rename_c.lo `test -f 'rename_c.c' || echo '$(srcdir)/'`rename_c.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-rename_c.Tpo $(DEPDIR)/libkadm5clnt_la-rename_c.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rename_c.c' object='libkadm5clnt_la-rename_c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-rename_c.lo `test -f 'rename_c.c' || echo '$(srcdir)/'`rename_c.c + +libkadm5clnt_la-send_recv.lo: send_recv.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-send_recv.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-send_recv.Tpo -c -o libkadm5clnt_la-send_recv.lo `test -f 'send_recv.c' || echo '$(srcdir)/'`send_recv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-send_recv.Tpo $(DEPDIR)/libkadm5clnt_la-send_recv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='send_recv.c' object='libkadm5clnt_la-send_recv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-send_recv.lo `test -f 'send_recv.c' || echo '$(srcdir)/'`send_recv.c + +libkadm5clnt_la-kadm5_err.lo: kadm5_err.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5clnt_la-kadm5_err.lo -MD -MP -MF $(DEPDIR)/libkadm5clnt_la-kadm5_err.Tpo -c -o libkadm5clnt_la-kadm5_err.lo `test -f 'kadm5_err.c' || echo '$(srcdir)/'`kadm5_err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5clnt_la-kadm5_err.Tpo $(DEPDIR)/libkadm5clnt_la-kadm5_err.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kadm5_err.c' object='libkadm5clnt_la-kadm5_err.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5clnt_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5clnt_la-kadm5_err.lo `test -f 'kadm5_err.c' || echo '$(srcdir)/'`kadm5_err.c + +libkadm5srv_la-acl.lo: acl.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-acl.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-acl.Tpo -c -o libkadm5srv_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-acl.Tpo $(DEPDIR)/libkadm5srv_la-acl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='acl.c' object='libkadm5srv_la-acl.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c + +libkadm5srv_la-bump_pw_expire.lo: bump_pw_expire.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-bump_pw_expire.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-bump_pw_expire.Tpo -c -o libkadm5srv_la-bump_pw_expire.lo `test -f 'bump_pw_expire.c' || echo '$(srcdir)/'`bump_pw_expire.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-bump_pw_expire.Tpo $(DEPDIR)/libkadm5srv_la-bump_pw_expire.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bump_pw_expire.c' object='libkadm5srv_la-bump_pw_expire.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-bump_pw_expire.lo `test -f 'bump_pw_expire.c' || echo '$(srcdir)/'`bump_pw_expire.c + +libkadm5srv_la-chpass_s.lo: chpass_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-chpass_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-chpass_s.Tpo -c -o libkadm5srv_la-chpass_s.lo `test -f 'chpass_s.c' || echo '$(srcdir)/'`chpass_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-chpass_s.Tpo $(DEPDIR)/libkadm5srv_la-chpass_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='chpass_s.c' object='libkadm5srv_la-chpass_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-chpass_s.lo `test -f 'chpass_s.c' || echo '$(srcdir)/'`chpass_s.c + +libkadm5srv_la-common_glue.lo: common_glue.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-common_glue.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-common_glue.Tpo -c -o libkadm5srv_la-common_glue.lo `test -f 'common_glue.c' || echo '$(srcdir)/'`common_glue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-common_glue.Tpo $(DEPDIR)/libkadm5srv_la-common_glue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='common_glue.c' object='libkadm5srv_la-common_glue.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-common_glue.lo `test -f 'common_glue.c' || echo '$(srcdir)/'`common_glue.c + +libkadm5srv_la-context_s.lo: context_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-context_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-context_s.Tpo -c -o libkadm5srv_la-context_s.lo `test -f 'context_s.c' || echo '$(srcdir)/'`context_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-context_s.Tpo $(DEPDIR)/libkadm5srv_la-context_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='context_s.c' object='libkadm5srv_la-context_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-context_s.lo `test -f 'context_s.c' || echo '$(srcdir)/'`context_s.c + +libkadm5srv_la-create_s.lo: create_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-create_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-create_s.Tpo -c -o libkadm5srv_la-create_s.lo `test -f 'create_s.c' || echo '$(srcdir)/'`create_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-create_s.Tpo $(DEPDIR)/libkadm5srv_la-create_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='create_s.c' object='libkadm5srv_la-create_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-create_s.lo `test -f 'create_s.c' || echo '$(srcdir)/'`create_s.c + +libkadm5srv_la-delete_s.lo: delete_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-delete_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-delete_s.Tpo -c -o libkadm5srv_la-delete_s.lo `test -f 'delete_s.c' || echo '$(srcdir)/'`delete_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-delete_s.Tpo $(DEPDIR)/libkadm5srv_la-delete_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='delete_s.c' object='libkadm5srv_la-delete_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-delete_s.lo `test -f 'delete_s.c' || echo '$(srcdir)/'`delete_s.c + +libkadm5srv_la-destroy_s.lo: destroy_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-destroy_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-destroy_s.Tpo -c -o libkadm5srv_la-destroy_s.lo `test -f 'destroy_s.c' || echo '$(srcdir)/'`destroy_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-destroy_s.Tpo $(DEPDIR)/libkadm5srv_la-destroy_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='destroy_s.c' object='libkadm5srv_la-destroy_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-destroy_s.lo `test -f 'destroy_s.c' || echo '$(srcdir)/'`destroy_s.c + +libkadm5srv_la-ent_setup.lo: ent_setup.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-ent_setup.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-ent_setup.Tpo -c -o libkadm5srv_la-ent_setup.lo `test -f 'ent_setup.c' || echo '$(srcdir)/'`ent_setup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-ent_setup.Tpo $(DEPDIR)/libkadm5srv_la-ent_setup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ent_setup.c' object='libkadm5srv_la-ent_setup.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-ent_setup.lo `test -f 'ent_setup.c' || echo '$(srcdir)/'`ent_setup.c + +libkadm5srv_la-error.lo: error.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-error.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-error.Tpo -c -o libkadm5srv_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-error.Tpo $(DEPDIR)/libkadm5srv_la-error.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error.c' object='libkadm5srv_la-error.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-error.lo `test -f 'error.c' || echo '$(srcdir)/'`error.c + +libkadm5srv_la-flush_s.lo: flush_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-flush_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-flush_s.Tpo -c -o libkadm5srv_la-flush_s.lo `test -f 'flush_s.c' || echo '$(srcdir)/'`flush_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-flush_s.Tpo $(DEPDIR)/libkadm5srv_la-flush_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='flush_s.c' object='libkadm5srv_la-flush_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-flush_s.lo `test -f 'flush_s.c' || echo '$(srcdir)/'`flush_s.c + +libkadm5srv_la-free.lo: free.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-free.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-free.Tpo -c -o libkadm5srv_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-free.Tpo $(DEPDIR)/libkadm5srv_la-free.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='free.c' object='libkadm5srv_la-free.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c + +libkadm5srv_la-get_princs_s.lo: get_princs_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-get_princs_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-get_princs_s.Tpo -c -o libkadm5srv_la-get_princs_s.lo `test -f 'get_princs_s.c' || echo '$(srcdir)/'`get_princs_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-get_princs_s.Tpo $(DEPDIR)/libkadm5srv_la-get_princs_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_princs_s.c' object='libkadm5srv_la-get_princs_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-get_princs_s.lo `test -f 'get_princs_s.c' || echo '$(srcdir)/'`get_princs_s.c + +libkadm5srv_la-get_s.lo: get_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-get_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-get_s.Tpo -c -o libkadm5srv_la-get_s.lo `test -f 'get_s.c' || echo '$(srcdir)/'`get_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-get_s.Tpo $(DEPDIR)/libkadm5srv_la-get_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_s.c' object='libkadm5srv_la-get_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-get_s.lo `test -f 'get_s.c' || echo '$(srcdir)/'`get_s.c + +libkadm5srv_la-init_s.lo: init_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-init_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-init_s.Tpo -c -o libkadm5srv_la-init_s.lo `test -f 'init_s.c' || echo '$(srcdir)/'`init_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-init_s.Tpo $(DEPDIR)/libkadm5srv_la-init_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init_s.c' object='libkadm5srv_la-init_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-init_s.lo `test -f 'init_s.c' || echo '$(srcdir)/'`init_s.c + +libkadm5srv_la-keys.lo: keys.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-keys.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-keys.Tpo -c -o libkadm5srv_la-keys.lo `test -f 'keys.c' || echo '$(srcdir)/'`keys.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-keys.Tpo $(DEPDIR)/libkadm5srv_la-keys.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keys.c' object='libkadm5srv_la-keys.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-keys.lo `test -f 'keys.c' || echo '$(srcdir)/'`keys.c + +libkadm5srv_la-log.lo: log.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-log.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-log.Tpo -c -o libkadm5srv_la-log.lo `test -f 'log.c' || echo '$(srcdir)/'`log.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-log.Tpo $(DEPDIR)/libkadm5srv_la-log.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='libkadm5srv_la-log.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-log.lo `test -f 'log.c' || echo '$(srcdir)/'`log.c + +libkadm5srv_la-marshall.lo: marshall.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-marshall.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-marshall.Tpo -c -o libkadm5srv_la-marshall.lo `test -f 'marshall.c' || echo '$(srcdir)/'`marshall.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-marshall.Tpo $(DEPDIR)/libkadm5srv_la-marshall.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='marshall.c' object='libkadm5srv_la-marshall.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-marshall.lo `test -f 'marshall.c' || echo '$(srcdir)/'`marshall.c + +libkadm5srv_la-modify_s.lo: modify_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-modify_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-modify_s.Tpo -c -o libkadm5srv_la-modify_s.lo `test -f 'modify_s.c' || echo '$(srcdir)/'`modify_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-modify_s.Tpo $(DEPDIR)/libkadm5srv_la-modify_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modify_s.c' object='libkadm5srv_la-modify_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-modify_s.lo `test -f 'modify_s.c' || echo '$(srcdir)/'`modify_s.c + +libkadm5srv_la-password_quality.lo: password_quality.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-password_quality.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-password_quality.Tpo -c -o libkadm5srv_la-password_quality.lo `test -f 'password_quality.c' || echo '$(srcdir)/'`password_quality.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-password_quality.Tpo $(DEPDIR)/libkadm5srv_la-password_quality.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='password_quality.c' object='libkadm5srv_la-password_quality.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-password_quality.lo `test -f 'password_quality.c' || echo '$(srcdir)/'`password_quality.c + +libkadm5srv_la-privs_s.lo: privs_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-privs_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-privs_s.Tpo -c -o libkadm5srv_la-privs_s.lo `test -f 'privs_s.c' || echo '$(srcdir)/'`privs_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-privs_s.Tpo $(DEPDIR)/libkadm5srv_la-privs_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='privs_s.c' object='libkadm5srv_la-privs_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-privs_s.lo `test -f 'privs_s.c' || echo '$(srcdir)/'`privs_s.c + +libkadm5srv_la-randkey_s.lo: randkey_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-randkey_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-randkey_s.Tpo -c -o libkadm5srv_la-randkey_s.lo `test -f 'randkey_s.c' || echo '$(srcdir)/'`randkey_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-randkey_s.Tpo $(DEPDIR)/libkadm5srv_la-randkey_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='randkey_s.c' object='libkadm5srv_la-randkey_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-randkey_s.lo `test -f 'randkey_s.c' || echo '$(srcdir)/'`randkey_s.c + +libkadm5srv_la-rename_s.lo: rename_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-rename_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-rename_s.Tpo -c -o libkadm5srv_la-rename_s.lo `test -f 'rename_s.c' || echo '$(srcdir)/'`rename_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-rename_s.Tpo $(DEPDIR)/libkadm5srv_la-rename_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rename_s.c' object='libkadm5srv_la-rename_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-rename_s.lo `test -f 'rename_s.c' || echo '$(srcdir)/'`rename_s.c + +libkadm5srv_la-server_glue.lo: server_glue.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-server_glue.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-server_glue.Tpo -c -o libkadm5srv_la-server_glue.lo `test -f 'server_glue.c' || echo '$(srcdir)/'`server_glue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-server_glue.Tpo $(DEPDIR)/libkadm5srv_la-server_glue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='server_glue.c' object='libkadm5srv_la-server_glue.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-server_glue.lo `test -f 'server_glue.c' || echo '$(srcdir)/'`server_glue.c + +libkadm5srv_la-setkey3_s.lo: setkey3_s.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-setkey3_s.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-setkey3_s.Tpo -c -o libkadm5srv_la-setkey3_s.lo `test -f 'setkey3_s.c' || echo '$(srcdir)/'`setkey3_s.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-setkey3_s.Tpo $(DEPDIR)/libkadm5srv_la-setkey3_s.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='setkey3_s.c' object='libkadm5srv_la-setkey3_s.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-setkey3_s.lo `test -f 'setkey3_s.c' || echo '$(srcdir)/'`setkey3_s.c + +libkadm5srv_la-set_keys.lo: set_keys.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-set_keys.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-set_keys.Tpo -c -o libkadm5srv_la-set_keys.lo `test -f 'set_keys.c' || echo '$(srcdir)/'`set_keys.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-set_keys.Tpo $(DEPDIR)/libkadm5srv_la-set_keys.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='set_keys.c' object='libkadm5srv_la-set_keys.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-set_keys.lo `test -f 'set_keys.c' || echo '$(srcdir)/'`set_keys.c + +libkadm5srv_la-set_modifier.lo: set_modifier.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-set_modifier.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-set_modifier.Tpo -c -o libkadm5srv_la-set_modifier.lo `test -f 'set_modifier.c' || echo '$(srcdir)/'`set_modifier.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-set_modifier.Tpo $(DEPDIR)/libkadm5srv_la-set_modifier.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='set_modifier.c' object='libkadm5srv_la-set_modifier.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-set_modifier.lo `test -f 'set_modifier.c' || echo '$(srcdir)/'`set_modifier.c + +libkadm5srv_la-kadm5_err.lo: kadm5_err.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkadm5srv_la-kadm5_err.lo -MD -MP -MF $(DEPDIR)/libkadm5srv_la-kadm5_err.Tpo -c -o libkadm5srv_la-kadm5_err.lo `test -f 'kadm5_err.c' || echo '$(srcdir)/'`kadm5_err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkadm5srv_la-kadm5_err.Tpo $(DEPDIR)/libkadm5srv_la-kadm5_err.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kadm5_err.c' object='libkadm5srv_la-kadm5_err.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkadm5srv_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkadm5srv_la-kadm5_err.lo `test -f 'kadm5_err.c' || echo '$(srcdir)/'`kadm5_err.c + +default_keys-default_keys.o: default_keys.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(default_keys_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT default_keys-default_keys.o -MD -MP -MF $(DEPDIR)/default_keys-default_keys.Tpo -c -o default_keys-default_keys.o `test -f 'default_keys.c' || echo '$(srcdir)/'`default_keys.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/default_keys-default_keys.Tpo $(DEPDIR)/default_keys-default_keys.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='default_keys.c' object='default_keys-default_keys.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(default_keys_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o default_keys-default_keys.o `test -f 'default_keys.c' || echo '$(srcdir)/'`default_keys.c + +default_keys-default_keys.obj: default_keys.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(default_keys_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT default_keys-default_keys.obj -MD -MP -MF $(DEPDIR)/default_keys-default_keys.Tpo -c -o default_keys-default_keys.obj `if test -f 'default_keys.c'; then $(CYGPATH_W) 'default_keys.c'; else $(CYGPATH_W) '$(srcdir)/default_keys.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/default_keys-default_keys.Tpo $(DEPDIR)/default_keys-default_keys.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='default_keys.c' object='default_keys-default_keys.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(default_keys_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o default_keys-default_keys.obj `if test -f 'default_keys.c'; then $(CYGPATH_W) 'default_keys.c'; else $(CYGPATH_W) '$(srcdir)/default_keys.c'; fi` + +iprop_log-iprop-log.o: iprop-log.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iprop_log-iprop-log.o -MD -MP -MF $(DEPDIR)/iprop_log-iprop-log.Tpo -c -o iprop_log-iprop-log.o `test -f 'iprop-log.c' || echo '$(srcdir)/'`iprop-log.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iprop_log-iprop-log.Tpo $(DEPDIR)/iprop_log-iprop-log.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iprop-log.c' object='iprop_log-iprop-log.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iprop_log-iprop-log.o `test -f 'iprop-log.c' || echo '$(srcdir)/'`iprop-log.c + +iprop_log-iprop-log.obj: iprop-log.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iprop_log-iprop-log.obj -MD -MP -MF $(DEPDIR)/iprop_log-iprop-log.Tpo -c -o iprop_log-iprop-log.obj `if test -f 'iprop-log.c'; then $(CYGPATH_W) 'iprop-log.c'; else $(CYGPATH_W) '$(srcdir)/iprop-log.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iprop_log-iprop-log.Tpo $(DEPDIR)/iprop_log-iprop-log.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iprop-log.c' object='iprop_log-iprop-log.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iprop_log-iprop-log.obj `if test -f 'iprop-log.c'; then $(CYGPATH_W) 'iprop-log.c'; else $(CYGPATH_W) '$(srcdir)/iprop-log.c'; fi` + +iprop_log-iprop-commands.o: iprop-commands.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iprop_log-iprop-commands.o -MD -MP -MF $(DEPDIR)/iprop_log-iprop-commands.Tpo -c -o iprop_log-iprop-commands.o `test -f 'iprop-commands.c' || echo '$(srcdir)/'`iprop-commands.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iprop_log-iprop-commands.Tpo $(DEPDIR)/iprop_log-iprop-commands.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iprop-commands.c' object='iprop_log-iprop-commands.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iprop_log-iprop-commands.o `test -f 'iprop-commands.c' || echo '$(srcdir)/'`iprop-commands.c + +iprop_log-iprop-commands.obj: iprop-commands.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iprop_log-iprop-commands.obj -MD -MP -MF $(DEPDIR)/iprop_log-iprop-commands.Tpo -c -o iprop_log-iprop-commands.obj `if test -f 'iprop-commands.c'; then $(CYGPATH_W) 'iprop-commands.c'; else $(CYGPATH_W) '$(srcdir)/iprop-commands.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/iprop_log-iprop-commands.Tpo $(DEPDIR)/iprop_log-iprop-commands.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='iprop-commands.c' object='iprop_log-iprop-commands.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(iprop_log_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iprop_log-iprop-commands.obj `if test -f 'iprop-commands.c'; then $(CYGPATH_W) 'iprop-commands.c'; else $(CYGPATH_W) '$(srcdir)/iprop-commands.c'; fi` + +ipropd_master-ipropd_master.o: ipropd_master.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_master-ipropd_master.o -MD -MP -MF $(DEPDIR)/ipropd_master-ipropd_master.Tpo -c -o ipropd_master-ipropd_master.o `test -f 'ipropd_master.c' || echo '$(srcdir)/'`ipropd_master.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_master-ipropd_master.Tpo $(DEPDIR)/ipropd_master-ipropd_master.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_master.c' object='ipropd_master-ipropd_master.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_master-ipropd_master.o `test -f 'ipropd_master.c' || echo '$(srcdir)/'`ipropd_master.c + +ipropd_master-ipropd_master.obj: ipropd_master.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_master-ipropd_master.obj -MD -MP -MF $(DEPDIR)/ipropd_master-ipropd_master.Tpo -c -o ipropd_master-ipropd_master.obj `if test -f 'ipropd_master.c'; then $(CYGPATH_W) 'ipropd_master.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_master.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_master-ipropd_master.Tpo $(DEPDIR)/ipropd_master-ipropd_master.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_master.c' object='ipropd_master-ipropd_master.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_master-ipropd_master.obj `if test -f 'ipropd_master.c'; then $(CYGPATH_W) 'ipropd_master.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_master.c'; fi` + +ipropd_master-ipropd_common.o: ipropd_common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_master-ipropd_common.o -MD -MP -MF $(DEPDIR)/ipropd_master-ipropd_common.Tpo -c -o ipropd_master-ipropd_common.o `test -f 'ipropd_common.c' || echo '$(srcdir)/'`ipropd_common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_master-ipropd_common.Tpo $(DEPDIR)/ipropd_master-ipropd_common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_common.c' object='ipropd_master-ipropd_common.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_master-ipropd_common.o `test -f 'ipropd_common.c' || echo '$(srcdir)/'`ipropd_common.c + +ipropd_master-ipropd_common.obj: ipropd_common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_master-ipropd_common.obj -MD -MP -MF $(DEPDIR)/ipropd_master-ipropd_common.Tpo -c -o ipropd_master-ipropd_common.obj `if test -f 'ipropd_common.c'; then $(CYGPATH_W) 'ipropd_common.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_common.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_master-ipropd_common.Tpo $(DEPDIR)/ipropd_master-ipropd_common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_common.c' object='ipropd_master-ipropd_common.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_master_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_master-ipropd_common.obj `if test -f 'ipropd_common.c'; then $(CYGPATH_W) 'ipropd_common.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_common.c'; fi` + +ipropd_slave-ipropd_slave.o: ipropd_slave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_slave-ipropd_slave.o -MD -MP -MF $(DEPDIR)/ipropd_slave-ipropd_slave.Tpo -c -o ipropd_slave-ipropd_slave.o `test -f 'ipropd_slave.c' || echo '$(srcdir)/'`ipropd_slave.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_slave-ipropd_slave.Tpo $(DEPDIR)/ipropd_slave-ipropd_slave.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_slave.c' object='ipropd_slave-ipropd_slave.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_slave-ipropd_slave.o `test -f 'ipropd_slave.c' || echo '$(srcdir)/'`ipropd_slave.c + +ipropd_slave-ipropd_slave.obj: ipropd_slave.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_slave-ipropd_slave.obj -MD -MP -MF $(DEPDIR)/ipropd_slave-ipropd_slave.Tpo -c -o ipropd_slave-ipropd_slave.obj `if test -f 'ipropd_slave.c'; then $(CYGPATH_W) 'ipropd_slave.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_slave.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_slave-ipropd_slave.Tpo $(DEPDIR)/ipropd_slave-ipropd_slave.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_slave.c' object='ipropd_slave-ipropd_slave.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_slave-ipropd_slave.obj `if test -f 'ipropd_slave.c'; then $(CYGPATH_W) 'ipropd_slave.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_slave.c'; fi` + +ipropd_slave-ipropd_common.o: ipropd_common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_slave-ipropd_common.o -MD -MP -MF $(DEPDIR)/ipropd_slave-ipropd_common.Tpo -c -o ipropd_slave-ipropd_common.o `test -f 'ipropd_common.c' || echo '$(srcdir)/'`ipropd_common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_slave-ipropd_common.Tpo $(DEPDIR)/ipropd_slave-ipropd_common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_common.c' object='ipropd_slave-ipropd_common.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_slave-ipropd_common.o `test -f 'ipropd_common.c' || echo '$(srcdir)/'`ipropd_common.c + +ipropd_slave-ipropd_common.obj: ipropd_common.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ipropd_slave-ipropd_common.obj -MD -MP -MF $(DEPDIR)/ipropd_slave-ipropd_common.Tpo -c -o ipropd_slave-ipropd_common.obj `if test -f 'ipropd_common.c'; then $(CYGPATH_W) 'ipropd_common.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_common.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ipropd_slave-ipropd_common.Tpo $(DEPDIR)/ipropd_slave-ipropd_common.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipropd_common.c' object='ipropd_slave-ipropd_common.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(ipropd_slave_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ipropd_slave-ipropd_common.obj `if test -f 'ipropd_common.c'; then $(CYGPATH_W) 'ipropd_common.c'; else $(CYGPATH_W) '$(srcdir)/ipropd_common.c'; fi` mostlyclean-libtool: -rm -f *.lo @@ -902,11 +1594,18 @@ -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" - @list=''; test -n "$(man3dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -935,16 +1634,21 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) install-man8: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -973,13 +1677,14 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) install-dist_kadm5includeHEADERS: $(dist_kadm5include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(kadm5includedir)" || $(MKDIR_P) "$(DESTDIR)$(kadm5includedir)" @list='$(dist_kadm5include_HEADERS)'; test -n "$(kadm5includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(kadm5includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(kadm5includedir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -993,13 +1698,14 @@ @$(NORMAL_UNINSTALL) @list='$(dist_kadm5include_HEADERS)'; test -n "$(kadm5includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(kadm5includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(kadm5includedir)" && rm -f $$files + dir='$(DESTDIR)$(kadm5includedir)'; $(am__uninstall_files_from_dir) install-nodist_kadm5includeHEADERS: $(nodist_kadm5include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(kadm5includedir)" || $(MKDIR_P) "$(DESTDIR)$(kadm5includedir)" @list='$(nodist_kadm5include_HEADERS)'; test -n "$(kadm5includedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(kadm5includedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(kadm5includedir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -1013,30 +1719,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_kadm5include_HEADERS)'; test -n "$(kadm5includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(kadm5includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(kadm5includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(kadm5includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -1048,15 +1741,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -1065,24 +1754,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -1119,10 +1812,16 @@ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-local check: check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS) \ +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(HEADERS) \ all-local +install-checkPROGRAMS: install-libLTLIBRARIES + +install-libexecPROGRAMS: install-libLTLIBRARIES + +install-sbinPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(kadm5includedir)" "$(DESTDIR)$(kadm5includedir)"; do \ + for dir in "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(kadm5includedir)" "$(DESTDIR)$(kadm5includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -1135,10 +1834,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -1158,7 +1862,62 @@ clean-noinstPROGRAMS clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/default_keys-default_keys.Po + -rm -f ./$(DEPDIR)/iprop_log-iprop-commands.Po + -rm -f ./$(DEPDIR)/iprop_log-iprop-log.Po + -rm -f ./$(DEPDIR)/ipropd_master-ipropd_common.Po + -rm -f ./$(DEPDIR)/ipropd_master-ipropd_master.Po + -rm -f ./$(DEPDIR)/ipropd_slave-ipropd_common.Po + -rm -f ./$(DEPDIR)/ipropd_slave-ipropd_slave.Po + -rm -f ./$(DEPDIR)/libkadm5clnt_la-ad.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-chpass_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-client_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-common_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-create_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-delete_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-destroy_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-flush_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-free.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-get_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-get_princs_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-init_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-kadm5_err.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-marshall.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-modify_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-privs_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-randkey_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-rename_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-send_recv.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-acl.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-bump_pw_expire.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-chpass_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-common_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-context_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-create_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-delete_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-destroy_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-ent_setup.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-error.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-flush_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-free.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-get_princs_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-get_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-init_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-kadm5_err.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-keys.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-log.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-marshall.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-modify_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-password_quality.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-privs_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-randkey_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-rename_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-server_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-set_keys.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-set_modifier.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-setkey3_s.Plo + -rm -f ./$(DEPDIR)/sample_passwd_check.Plo + -rm -f ./$(DEPDIR)/test_pw_quality.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1183,10 +1942,9 @@ install-dvi-am: -install-exec-am: install-libLTLIBRARIES install-libexecPROGRAMS \ - install-sbinPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local install-libLTLIBRARIES \ + install-libexecPROGRAMS install-sbinPROGRAMS + install-html: install-html-am install-html-am: @@ -1208,7 +1966,62 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/default_keys-default_keys.Po + -rm -f ./$(DEPDIR)/iprop_log-iprop-commands.Po + -rm -f ./$(DEPDIR)/iprop_log-iprop-log.Po + -rm -f ./$(DEPDIR)/ipropd_master-ipropd_common.Po + -rm -f ./$(DEPDIR)/ipropd_master-ipropd_master.Po + -rm -f ./$(DEPDIR)/ipropd_slave-ipropd_common.Po + -rm -f ./$(DEPDIR)/ipropd_slave-ipropd_slave.Po + -rm -f ./$(DEPDIR)/libkadm5clnt_la-ad.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-chpass_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-client_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-common_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-create_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-delete_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-destroy_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-flush_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-free.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-get_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-get_princs_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-init_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-kadm5_err.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-marshall.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-modify_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-privs_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-randkey_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-rename_c.Plo + -rm -f ./$(DEPDIR)/libkadm5clnt_la-send_recv.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-acl.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-bump_pw_expire.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-chpass_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-common_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-context_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-create_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-delete_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-destroy_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-ent_setup.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-error.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-flush_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-free.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-get_princs_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-get_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-init_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-kadm5_err.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-keys.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-log.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-marshall.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-modify_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-password_quality.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-privs_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-randkey_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-rename_s.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-server_glue.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-set_keys.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-set_modifier.Plo + -rm -f ./$(DEPDIR)/libkadm5srv_la-setkey3_s.Plo + -rm -f ./$(DEPDIR)/sample_passwd_check.Plo + -rm -f ./$(DEPDIR)/test_pw_quality.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1233,19 +2046,19 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man3 uninstall-man8 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ - clean-libexecPROGRAMS clean-libtool clean-noinstLTLIBRARIES \ - clean-noinstPROGRAMS clean-sbinPROGRAMS ctags dist-hook \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-checkPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ + clean-sbinPROGRAMS cscopelist-am ctags ctags-am dist-hook \ 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-data-hook \ install-dist_kadm5includeHEADERS install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + install-exec install-exec-am install-exec-local install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-libexecPROGRAMS install-man \ install-man3 install-man8 install-nodist_kadm5includeHEADERS \ @@ -1254,27 +2067,41 @@ 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-dist_kadm5includeHEADERS \ - uninstall-hook uninstall-libLTLIBRARIES \ - uninstall-libexecPROGRAMS uninstall-man uninstall-man3 \ - uninstall-man8 uninstall-nodist_kadm5includeHEADERS \ - uninstall-sbinPROGRAMS + tags tags-am uninstall uninstall-am \ + uninstall-dist_kadm5includeHEADERS uninstall-hook \ + uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \ + uninstall-man uninstall-man3 uninstall-man8 \ + uninstall-nodist_kadm5includeHEADERS uninstall-sbinPROGRAMS + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1282,7 +2109,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1327,11 +2154,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1339,6 +2175,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1381,6 +2219,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1394,13 +2245,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1448,6 +2299,7 @@ $(SLC) $(srcdir)/iprop-commands.in $(libkadm5srv_la_OBJECTS): kadm5_err.h +$(libkadm5clnt_la_OBJECTS): kadm5_err.h $(iprop_log_OBJECTS): iprop-commands.h client_glue.lo server_glue.lo: $(srcdir)/common_glue.c @@ -1456,15 +2308,16 @@ kadm5_err.h: kadm5_err.et -$(libkadm5clnt_la_OBJECTS) $(libkadm5srv_la_OBJECTS): $(srcdir)/kadm5-protos.h $(srcdir)/kadm5-private.h -$(srcdir)/kadm5-protos.h: +$(ALL_OBJECTS): $(srcdir)/kadm5-protos.h $(srcdir)/kadm5-private.h +$(ALL_OBJECTS): kadm5_err.h +$(srcdir)/kadm5-protos.h: $(KADM5_PROTOS_SRCS) cd $(srcdir); perl ../../cf/make-proto.pl $(proto_opts) \ -o kadm5-protos.h \ $(dist_libkadm5clnt_la_SOURCES) \ $(dist_libkadm5srv_la_SOURCES) \ || rm -f kadm5-protos.h -$(srcdir)/kadm5-private.h: +$(srcdir)/kadm5-private.h: $(KADM5_PROTOS_SRCS) cd $(srcdir); perl ../../cf/make-proto.pl $(proto_opts) \ -p kadm5-private.h \ $(dist_libkadm5clnt_la_SOURCES) \ diff --git a/crypto/heimdal/lib/kadm5/NTMakefile b/crypto/heimdal/lib/kadm5/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/NTMakefile @@ -0,0 +1,279 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\kadm5 + +!include ../../windows/NTMakefile.w32 + +dist_libkadm5clnt_la_SOURCES = \ + ad.c \ + chpass_c.c \ + client_glue.c \ + common_glue.c \ + create_c.c \ + delete_c.c \ + destroy_c.c \ + flush_c.c \ + free.c \ + get_c.c \ + get_princs_c.c \ + init_c.c \ + kadm5_locl.h \ + marshall.c \ + modify_c.c \ + private.h \ + privs_c.c \ + randkey_c.c \ + rename_c.c \ + send_recv.c \ + kadm5-pwcheck.h \ + admin.h + +dist_libkadm5srv_la_SOURCES = \ + acl.c \ + admin.h \ + bump_pw_expire.c \ + chpass_s.c \ + common_glue.c \ + context_s.c \ + create_s.c \ + delete_s.c \ + destroy_s.c \ + ent_setup.c \ + error.c \ + flush_s.c \ + free.c \ + get_princs_s.c \ + get_s.c \ + init_s.c \ + kadm5_locl.h \ + keys.c \ + log.c \ + marshall.c \ + modify_s.c \ + password_quality.c \ + private.h \ + privs_s.c \ + randkey_s.c \ + rename_s.c \ + server_glue.c \ + set_keys.c \ + setkey3_s.c \ + set_modifier.c \ + kadm5-pwcheck.h \ + admin.h + +LIBKADM5CLNT_OBJS= \ + $(OBJ)\ad.obj \ + $(OBJ)\chpass_c.obj \ + $(OBJ)\client_glue.obj \ + $(OBJ)\common_glue.obj \ + $(OBJ)\create_c.obj \ + $(OBJ)\delete_c.obj \ + $(OBJ)\destroy_c.obj \ + $(OBJ)\flush_c.obj \ + $(OBJ)\free.obj \ + $(OBJ)\get_c.obj \ + $(OBJ)\get_princs_c.obj \ + $(OBJ)\init_c.obj \ + $(OBJ)\marshall.obj \ + $(OBJ)\modify_c.obj \ + $(OBJ)\privs_c.obj \ + $(OBJ)\randkey_c.obj \ + $(OBJ)\rename_c.obj \ + $(OBJ)\send_recv.obj \ + $(OBJ)\kadm5_err.obj + +LIBKADM5SRV_OBJS= \ + $(OBJ)\acl.obj \ + $(OBJ)\bump_pw_expire.obj \ + $(OBJ)\chpass_s.obj \ + $(OBJ)\common_glue.obj \ + $(OBJ)\context_s.obj \ + $(OBJ)\create_s.obj \ + $(OBJ)\delete_s.obj \ + $(OBJ)\destroy_s.obj \ + $(OBJ)\ent_setup.obj \ + $(OBJ)\error.obj \ + $(OBJ)\flush_s.obj \ + $(OBJ)\free.obj \ + $(OBJ)\get_princs_s.obj \ + $(OBJ)\get_s.obj \ + $(OBJ)\init_s.obj \ + $(OBJ)\keys.obj \ + $(OBJ)\log.obj \ + $(OBJ)\marshall.obj \ + $(OBJ)\modify_s.obj \ + $(OBJ)\password_quality.obj \ + $(OBJ)\privs_s.obj \ + $(OBJ)\randkey_s.obj \ + $(OBJ)\rename_s.obj \ + $(OBJ)\server_glue.obj \ + $(OBJ)\set_keys.obj \ + $(OBJ)\setkey3_s.obj \ + $(OBJ)\set_modifier.obj \ + $(OBJ)\kadm5_err.obj + + +proto_opts = -q -R "^(_|kadm5_c_|kadm5_s_|kadm5_log)" -P remove + +$(OBJ)\kadm5-protos.h: $(dist_libkadm5srv_la_SOURCES) $(dist_libkadm5clnt_la_SOURCES) + $(PERL) ..\..\cf\make-proto.pl $(proto_opts) \ + -o $@ \ + $(dist_libkadm5srv_la_SOURCES) \ + $(dist_libkadm5clnt_la_SOURCES) \ + || $(RM) $@ + +$(OBJ)\kadm5-private.h: $(dist_libkadm5srv_la_SOURCES) $(dist_libkadm5clnt_la_SOURCES) + $(PERL) ..\..\cf\make-proto.pl $(proto_opts) \ + -p $@ \ + $(dist_libkadm5srv_la_SOURCES) \ + $(dist_libkadm5clnt_la_SOURCES) \ + || $(RM) $@ + +$(OBJ)\iprop-commands.c $(OBJ)\iprop-commands.h: iprop-commands.in + cd $(OBJ) + $(CP) $(SRCDIR)\iprop-commands.in $(OBJ) + $(BINDIR)\slc.exe iprop-commands.in + cd $(SRCDIR) + +$(OBJ)\kadm5_err.h $(OBJ)kadm5_err.c: kadm5_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\kadm5_err.et + cd $(SRCDIR) + +$(KADM5INCDIR)\kadm5_err.h: $(OBJ)\kadm5_err.h + +KADM5INCDIR=$(INCDIR)\kadm5 + +INCFILES=\ + $(KADM5INCDIR)\kadm5_err.h \ + $(KADM5INCDIR)\admin.h \ + $(KADM5INCDIR)\private.h \ + $(KADM5INCDIR)\kadm5-protos.h \ + $(KADM5INCDIR)\kadm5-private.h \ + $(OBJ)\iprop-commands.h + +SBINPROGRAMS=$(SBINDIR)\iprop-log.exe + +LIBEXECPROGRAMS=$(LIBEXECDIR)\ipropd-master.exe $(LIBEXECDIR)\ipropd-slave.exe + +EXELIBDEPS= \ + $(LIBKADM5SRV) \ + $(LIBROKEN) \ + $(LIBHEIMDAL) \ + $(LIBHDB) \ + $(LIBSQLITE) \ + $(LIBSL) \ + $(LIBCOMERR) \ + $(LIBVERS) + +$(SBINDIR)\iprop-log.exe: $(OBJ)\iprop-log.obj $(OBJ)\iprop-commands.obj $(EXELIBDEPS) \ + $(OBJ)\iprop-log-version.res + $(EXECONLINK) + $(EXEPREP) + +$(LIBEXECDIR)\ipropd-master.exe: $(OBJ)\ipropd_master.obj $(OBJ)\ipropd_common.obj \ + $(EXELIBDEPS) $(OBJ)\ipropd-master-version.res + $(EXECONLINK) + $(EXEPREP) + +$(LIBEXECDIR)\ipropd-slave.exe: $(OBJ)\ipropd_slave.obj $(OBJ)\ipropd_common.obj \ + $(EXELIBDEPS) $(OBJ)\ipropd-slave-version.res + $(EXECONLINK) + $(EXEPREP) + +$(LIBKADM5CLNT): $(LIBKADM5CLNT_OBJS) + $(LIBCON) + +LIBKADM5SRVRES=$(OBJ)\libkadm5srv-version.res + +$(LIBKADM5SRV): $(BINDIR)\libkadm5srv.dll + +$(BINDIR)\libkadm5srv.dll: $(LIBKADM5SRV_OBJS) $(LIBHEIMDAL) $(LIBROKEN) $(LIBHDB) $(LIBCOMERR) $(LIBSQLITE) $(LIBKADM5SRVRES) $(LIBHEIMBASE) + $(DLLGUILINK) -implib:$(LIBKADM5SRV) -def:libkadm5srv-exports.def + $(DLLPREP_NODIST) + +all:: $(INCFILES) $(LIBKADM5SRV) $(LIBKADM5CLNT) + +all-tools:: $(SBINPROGRAMS) $(LIBEXECPROGRAMS) + +clean:: + -$(RM) $(INCFILES) + -$(RM) $(LIBKADM5CLNT) + -$(RM) $(LIBKADM5SRV) + -$(RM) $(BINDIR)\libkadm5srv.* + -$(RM) $(SBINPROGRAMS:.exe=.*) + -$(RM) $(LIBEXECPROGRAMS:.exe=.*) + +test:: test-binaries test-run + +test-binaries: \ + $(OBJ)\default_keys.exe \ + $(OBJ)\test_pw_quality.exe \ + $(OBJ)\sample_passwd_check.dll + +$(OBJ)\default_keys.exe: $(OBJ)\default_keys.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBHDB) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_pw_quality.exe: $(OBJ)\test_pw_quality.obj \ + $(LIBROKEN) $(LIBKADM5SRV) $(LIBVERS) $(LIBHEIMDAL) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\sample_passwd_check.dll: $(OBJ)\sample_passwd_check.obj $(LIBHEIMDAL) + $(DLLGUILINK) /DEF:<< +EXPORTS + version DATA + check_length +<< + $(DLLPREP_NODIST) + +test-run: + cd $(OBJ) + -default_keys.exe + -test_pw_quality.exe + cd $(SRCDIR) + +{$(OBJ)}.h{$(KADM5INCDIR)}.h: + $(CP) $< $@ + +{}.h{$(KADM5INCDIR)}.h: + $(CP) $< $@ + +{}.c{$(OBJ)}.obj:: + $(C2OBJ_P) -I$(OBJ) -I$(KADM5INCDIR) + +test-exports: + $(PERL) ..\..\cf\w32-check-exported-symbols.pl --vs version-script.map --def libkadm5srv-exports.def + +test:: test-exports diff --git a/crypto/heimdal/lib/kadm5/acl.c b/crypto/heimdal/lib/kadm5/acl.c --- a/crypto/heimdal/lib/kadm5/acl.c +++ b/crypto/heimdal/lib/kadm5/acl.c @@ -44,6 +44,7 @@ { "modify", KADM5_PRIV_MODIFY }, { "add", KADM5_PRIV_ADD }, { "get", KADM5_PRIV_GET }, + { "get-keys", KADM5_PRIV_GET_KEYS }, { NULL, 0 } }; @@ -177,6 +178,8 @@ if(res & KADM5_PRIV_GET) return KADM5_AUTH_GET; + if(res & KADM5_PRIV_GET_KEYS) + return KADM5_AUTH_GET_KEYS; if(res & KADM5_PRIV_ADD) return KADM5_AUTH_ADD; if(res & KADM5_PRIV_MODIFY) diff --git a/crypto/heimdal/lib/kadm5/ad.c b/crypto/heimdal/lib/kadm5/ad.c --- a/crypto/heimdal/lib/kadm5/ad.c +++ b/crypto/heimdal/lib/kadm5/ad.c @@ -484,13 +484,14 @@ kadm5_ret_t ret; krb5_ccache cc; char *service; + int aret; if (context->ccache) return 0; - asprintf(&service, "%s/%s@%s", KRB5_TGS_NAME, - context->realm, context->realm); - if (service == NULL) + aret = asprintf(&service, "%s/%s@%s", KRB5_TGS_NAME, + context->realm, context->realm); + if (aret == -1 || service == NULL) return ENOMEM; ret = _kadm5_c_get_cred_cache(context->context, @@ -508,6 +509,9 @@ static kadm5_ret_t kadm5_ad_chpass_principal(void *server_handle, krb5_principal principal, + int keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password) { kadm5_ad_context *context = server_handle; @@ -515,6 +519,12 @@ int result_code; kadm5_ret_t ret; + if (keepold) + return KADM5_KEEPOLD_NOSUPP; + + if (n_ks_tuple > 0) + return KADM5_KS_TUPLE_NOSUPP; + ret = ad_get_cred(context, NULL); if (ret) return ret; @@ -562,6 +572,8 @@ kadm5_ad_create_principal(void *server_handle, kadm5_principal_ent_t entry, uint32_t mask, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password) { kadm5_ad_context *context = server_handle; @@ -587,6 +599,14 @@ if ((mask & KADM5_PRINCIPAL) == 0) return KADM5_BAD_MASK; + /* + * We should get around to implementing this... At the moment, the + * the server side API is implemented but the wire protocol has not + * been updated. + */ + if (n_ks_tuple > 0) + return KADM5_KS_TUPLE_NOSUPP; + for (i = 0; i < sizeof(rattrs)/sizeof(rattrs[0]); i++) attrs[i] = &rattrs[i]; attrs[i] = NULL; @@ -1224,14 +1244,21 @@ #endif } +/*ARGSUSED*/ static kadm5_ret_t kadm5_ad_randkey_principal(void *server_handle, krb5_principal principal, + krb5_boolean keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, krb5_keyblock **keys, int *n_keys) { kadm5_ad_context *context = server_handle; + if (keepold) + return KADM5_KEEPOLD_NOSUPP; + /* * random key */ @@ -1248,7 +1275,7 @@ { char p[64]; krb5_generate_random_block(p, sizeof(p)); - plen = base64_encode(p, sizeof(p), &password); + plen = rk_base64_encode(p, sizeof(p), &password); if (plen < 0) return ENOMEM; } @@ -1259,45 +1286,44 @@ return ret; } - krb5_data_zero (&result_code_string); - krb5_data_zero (&result_string); + krb5_data_zero(&result_code_string); + krb5_data_zero(&result_string); - ret = krb5_set_password_using_ccache (context->context, - context->ccache, - password, - principal, - &result_code, - &result_code_string, - &result_string); + ret = krb5_set_password_using_ccache(context->context, + context->ccache, + password, + principal, + &result_code, + &result_code_string, + &result_string); + krb5_data_free(&result_code_string); + krb5_data_free(&result_string); - krb5_data_free (&result_code_string); - krb5_data_free (&result_string); + if (ret) + goto out; - if (ret == 0) { + *keys = malloc(sizeof(**keys) * 1); + if (*keys == NULL) { + ret = ENOMEM; + goto out; + } + *n_keys = 1; - *keys = malloc(sizeof(**keys) * 1); - if (*keys == NULL) { - ret = ENOMEM; - goto out; - } - *n_keys = 1; - - ret = krb5_string_to_key(context->context, - ENCTYPE_ARCFOUR_HMAC_MD5, - password, - principal, - &(*keys)[0]); - memset(password, 0, sizeof(password)); - if (ret) { - free(*keys); - *keys = NULL; - *n_keys = 0; - goto out; - } + ret = krb5_string_to_key(context->context, + ENCTYPE_ARCFOUR_HMAC_MD5, + password, + principal, + &(*keys)[0]); + if (ret) { + free(*keys); + *keys = NULL; + *n_keys = 0; + goto out; } + + out: memset(password, 0, plen); free(password); - out: return ret; #else *keys = NULL; @@ -1321,6 +1347,7 @@ static kadm5_ret_t kadm5_ad_chpass_principal_with_key(void *server_handle, krb5_principal princ, + int keepold, int n_key_data, krb5_key_data *key_data) { @@ -1329,10 +1356,23 @@ return KADM5_RPC_ERROR; } +static kadm5_ret_t +kadm5_ad_lock(void *server_handle) +{ + return ENOTSUP; +} + +static kadm5_ret_t +kadm5_ad_unlock(void *server_handle) +{ + return ENOTSUP; +} + static void set_funcs(kadm5_ad_context *c) { #define SET(C, F) (C)->funcs.F = kadm5_ad_ ## F +#define SETNOTIMP(C, F) (C)->funcs.F = 0 SET(c, chpass_principal); SET(c, chpass_principal_with_key); SET(c, create_principal); @@ -1345,6 +1385,9 @@ SET(c, modify_principal); SET(c, randkey_principal); SET(c, rename_principal); + SET(c, lock); + SET(c, unlock); + SETNOTIMP(c, setkey_principal_3); } kadm5_ret_t diff --git a/crypto/heimdal/lib/kadm5/admin.h b/crypto/heimdal/lib/kadm5/admin.h --- a/crypto/heimdal/lib/kadm5/admin.h +++ b/crypto/heimdal/lib/kadm5/admin.h @@ -48,6 +48,11 @@ #define KADM5_STRUCT_VERSION 0 +/* For kadm5_log_get_version_fd() */ +#define LOG_VERSION_LAST -1 +#define LOG_VERSION_FIRST 1 +#define LOG_VERSION_UBER 0 + #include #define KRB5_KDB_DISALLOW_POSTDATED 0x00000001 @@ -112,6 +117,11 @@ void* key_data_contents[2];/* Array of pointers */ } krb5_key_data; +typedef struct _krb5_keysalt { + int16_t type; + krb5_data data; /* Length, data */ +} krb5_keysalt; + typedef struct _krb5_tl_data { struct _krb5_tl_data* tl_data_next; int16_t tl_data_type; @@ -129,6 +139,8 @@ #define KRB5_TL_EXTENSION 0x0008 #define KRB5_TL_PKINIT_ACL 0x0009 #define KRB5_TL_ALIASES 0x000a +#define KRB5_TL_HIST_KVNO_DIFF_CLNT 0x000b +#define KRB5_TL_HIST_KVNO_DIFF_SVC 0x000c typedef struct _kadm5_principal_ent_t { krb5_principal principal; @@ -193,11 +205,12 @@ #define KADM5_PRIV_DELETE (1 << 3) #define KADM5_PRIV_LIST (1 << 4) #define KADM5_PRIV_CPW (1 << 5) +#define KADM5_PRIV_GET_KEYS (1 << 6) + +/* Note: KADM5_PRIV_GET_KEYS not included */ #define KADM5_PRIV_ALL (KADM5_PRIV_GET | KADM5_PRIV_ADD | KADM5_PRIV_MODIFY | KADM5_PRIV_DELETE | KADM5_PRIV_LIST | KADM5_PRIV_CPW) -typedef struct { - int XXX; -}krb5_key_salt_tuple; +#define KADM5_BOGUS_KEY_DATA "\xe5\xe5\xe5\xe5" typedef struct _kadm5_config_params { uint32_t mask; @@ -221,38 +234,4 @@ #include "kadm5-protos.h" -#if 0 -/* unimplemented functions */ -kadm5_ret_t -kadm5_decrypt_key(void *server_handle, - kadm5_principal_ent_t entry, int32_t - ktype, int32_t stype, int32_t - kvno, krb5_keyblock *keyblock, - krb5_keysalt *keysalt, int *kvnop); - -kadm5_ret_t -kadm5_create_policy(void *server_handle, - kadm5_policy_ent_t policy, uint32_t mask); - -kadm5_ret_t -kadm5_delete_policy(void *server_handle, char *policy); - - -kadm5_ret_t -kadm5_modify_policy(void *server_handle, - kadm5_policy_ent_t policy, - uint32_t mask); - -kadm5_ret_t -kadm5_get_policy(void *server_handle, char *policy, kadm5_policy_ent_t ent); - -kadm5_ret_t -kadm5_get_policies(void *server_handle, char *exp, - char ***pols, int *count); - -void -kadm5_free_policy_ent(kadm5_policy_ent_t policy); - -#endif - #endif /* __KADM5_ADMIN_H__ */ diff --git a/crypto/heimdal/lib/kadm5/check-cracklib.pl b/crypto/heimdal/lib/kadm5/check-cracklib.pl old mode 100755 new mode 100644 diff --git a/crypto/heimdal/lib/kadm5/chpass_c.c b/crypto/heimdal/lib/kadm5/chpass_c.c --- a/crypto/heimdal/lib/kadm5/chpass_c.c +++ b/crypto/heimdal/lib/kadm5/chpass_c.c @@ -38,6 +38,9 @@ kadm5_ret_t kadm5_c_chpass_principal(void *server_handle, krb5_principal princ, + int keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password) { kadm5_client_context *context = server_handle; @@ -47,6 +50,14 @@ int32_t tmp; krb5_data reply; + /* + * We should get around to implementing this... At the moment, the + * the server side API is implemented but the wire protocol has not + * been updated. + */ + if (n_ks_tuple > 0) + return KADM5_KS_TUPLE_NOSUPP; + ret = _kadm5_connect(server_handle); if(ret) return ret; @@ -59,6 +70,7 @@ krb5_store_int32(sp, kadm_chpass); krb5_store_principal(sp, princ); krb5_store_string(sp, password); + krb5_store_int32(sp, keepold); /* extension */ ret = _kadm5_client_send(context, sp); krb5_storage_free(sp); if (ret) @@ -82,6 +94,7 @@ kadm5_ret_t kadm5_c_chpass_principal_with_key(void *server_handle, krb5_principal princ, + int keepold, int n_key_data, krb5_key_data *key_data) { @@ -107,6 +120,7 @@ krb5_store_int32(sp, n_key_data); for (i = 0; i < n_key_data; ++i) kadm5_store_key_data (sp, &key_data[i]); + krb5_store_int32(sp, keepold); /* extension */ ret = _kadm5_client_send(context, sp); krb5_storage_free(sp); if (ret) diff --git a/crypto/heimdal/lib/kadm5/chpass_s.c b/crypto/heimdal/lib/kadm5/chpass_s.c --- a/crypto/heimdal/lib/kadm5/chpass_s.c +++ b/crypto/heimdal/lib/kadm5/chpass_s.c @@ -38,6 +38,9 @@ static kadm5_ret_t change(void *server_handle, krb5_principal princ, + int keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password, int cond) { @@ -49,20 +52,36 @@ int existsp = 0; memset(&ent, 0, sizeof(ent)); - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) - return ret; + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if(ret) + return ret; + } + + ret = kadm5_log_init(context); + if (ret) + goto out; ret = context->db->hdb_fetch_kvno(context->context, context->db, princ, HDB_F_DECRYPT|HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); - if(ret) - goto out; + if (ret) + goto out2; + + if (keepold || cond) { + /* + * We save these for now so we can handle password history checking; + * we handle keepold further below. + */ + ret = hdb_add_current_keys_to_history(context->context, &ent.entry); + if (ret) + goto out3; + } if (context->db->hdb_capability_flags & HDB_CAP_F_HANDLE_PASSWORDS) { ret = context->db->hdb_password(context->context, context->db, &ent, password, cond); if (ret) - goto out2; + goto out3; } else { num_keys = ent.entry.keys.len; @@ -71,54 +90,76 @@ ent.entry.keys.len = 0; ent.entry.keys.val = NULL; - ret = _kadm5_set_keys(context, &ent.entry, password); + ret = _kadm5_set_keys(context, &ent.entry, n_ks_tuple, ks_tuple, + password); if(ret) { - _kadm5_free_keys (context->context, num_keys, keys); - goto out2; + _kadm5_free_keys(context->context, num_keys, keys); + goto out3; } + _kadm5_free_keys(context->context, num_keys, keys); - if (cond) - existsp = _kadm5_exists_keys (ent.entry.keys.val, - ent.entry.keys.len, - keys, num_keys); - _kadm5_free_keys (context->context, num_keys, keys); + if (cond) { + HDB_extension *ext; + + ext = hdb_find_extension(&ent.entry, choice_HDB_extension_data_hist_keys); + if (ext != NULL) + existsp = _kadm5_exists_keys_hist(ent.entry.keys.val, + ent.entry.keys.len, + &ext->data.u.hist_keys); + } if (existsp) { ret = KADM5_PASS_REUSE; krb5_set_error_message(context->context, ret, "Password reuse forbidden"); - goto out2; + goto out3; } + } + ent.entry.kvno++; - ret = hdb_seal_keys(context->context, context->db, &ent.entry); + ent.entry.flags.require_pwchange = 0; + + if (!keepold) { + HDB_extension ext; + + memset(&ext, 0, sizeof (ext)); + ext.mandatory = FALSE; + ext.data.element = choice_HDB_extension_data_hist_keys; + ret = hdb_replace_extension(context->context, &ent.entry, &ext); if (ret) - goto out2; + goto out3; } - ent.entry.kvno++; + + ret = hdb_seal_keys(context->context, context->db, &ent.entry); + if (ret) + goto out3; ret = _kadm5_set_modifier(context, &ent.entry); if(ret) - goto out2; + goto out3; ret = _kadm5_bump_pw_expire(context, &ent.entry); if (ret) - goto out2; - - ret = context->db->hdb_store(context->context, context->db, - HDB_F_REPLACE, &ent); - if (ret) - goto out2; + goto out3; - kadm5_log_modify (context, - &ent.entry, - KADM5_PRINCIPAL | KADM5_MOD_NAME | KADM5_MOD_TIME | - KADM5_KEY_DATA | KADM5_KVNO | KADM5_PW_EXPIRATION | - KADM5_TL_DATA); + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_modify(context, &ent.entry, + KADM5_ATTRIBUTES | KADM5_PRINCIPAL | + KADM5_MOD_NAME | KADM5_MOD_TIME | + KADM5_KEY_DATA | KADM5_KVNO | + KADM5_PW_EXPIRATION | KADM5_TL_DATA); -out2: + out3: hdb_free_entry(context->context, &ent); -out: - context->db->hdb_close(context->context, context->db); + out2: + (void) kadm5_log_end(context); + out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } return _kadm5_error_code(ret); } @@ -131,9 +172,10 @@ kadm5_ret_t kadm5_s_chpass_principal_cond(void *server_handle, krb5_principal princ, + int keepold, const char *password) { - return change (server_handle, princ, password, 1); + return change (server_handle, princ, keepold, 0, NULL, password, 1); } /* @@ -143,9 +185,13 @@ kadm5_ret_t kadm5_s_chpass_principal(void *server_handle, krb5_principal princ, + int keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password) { - return change (server_handle, princ, password, 0); + return change (server_handle, princ, keepold, + n_ks_tuple, ks_tuple, password, 0); } /* @@ -155,6 +201,7 @@ kadm5_ret_t kadm5_s_chpass_principal_with_key(void *server_handle, krb5_principal princ, + int keepold, int n_key_data, krb5_key_data *key_data) { @@ -163,42 +210,67 @@ kadm5_ret_t ret; memset(&ent, 0, sizeof(ent)); - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) - return ret; + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if(ret) + return ret; + } + + ret = kadm5_log_init(context); + if (ret) + goto out; + ret = context->db->hdb_fetch_kvno(context->context, context->db, princ, 0, HDB_F_GET_ANY|HDB_F_ADMIN_DATA, &ent); - if(ret) - goto out; - ret = _kadm5_set_keys2(context, &ent.entry, n_key_data, key_data); - if(ret) + if (ret == HDB_ERR_NOENTRY) goto out2; + if (keepold) { + ret = hdb_add_current_keys_to_history(context->context, &ent.entry); + if (ret) + goto out3; + } + ret = _kadm5_set_keys2(context, &ent.entry, n_key_data, key_data); + if (ret) + goto out3; ent.entry.kvno++; ret = _kadm5_set_modifier(context, &ent.entry); - if(ret) - goto out2; + if (ret) + goto out3; ret = _kadm5_bump_pw_expire(context, &ent.entry); if (ret) - goto out2; + goto out3; - ret = hdb_seal_keys(context->context, context->db, &ent.entry); - if (ret) - goto out2; + if (keepold) { + ret = hdb_seal_keys(context->context, context->db, &ent.entry); + if (ret) + goto out3; + } else { + HDB_extension ext; - ret = context->db->hdb_store(context->context, context->db, - HDB_F_REPLACE, &ent); - if (ret) - goto out2; + memset(&ext, 0, sizeof (ext)); + ext.mandatory = FALSE; + ext.data.element = choice_HDB_extension_data_hist_keys; + ext.data.u.hist_keys.len = 0; + ext.data.u.hist_keys.val = NULL; + hdb_replace_extension(context->context, &ent.entry, &ext); + } - kadm5_log_modify (context, - &ent.entry, - KADM5_PRINCIPAL | KADM5_MOD_NAME | KADM5_MOD_TIME | - KADM5_KEY_DATA | KADM5_KVNO | KADM5_PW_EXPIRATION | - KADM5_TL_DATA); + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_modify(context, &ent.entry, + KADM5_PRINCIPAL | KADM5_MOD_NAME | + KADM5_MOD_TIME | KADM5_KEY_DATA | KADM5_KVNO | + KADM5_PW_EXPIRATION | KADM5_TL_DATA); -out2: + out3: hdb_free_entry(context->context, &ent); -out: - context->db->hdb_close(context->context, context->db); + out2: + (void) kadm5_log_end(context); + out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } return _kadm5_error_code(ret); } diff --git a/crypto/heimdal/lib/kadm5/common_glue.c b/crypto/heimdal/lib/kadm5/common_glue.c --- a/crypto/heimdal/lib/kadm5/common_glue.c +++ b/crypto/heimdal/lib/kadm5/common_glue.c @@ -35,14 +35,28 @@ RCSID("$Id$"); -#define __CALL(F, P) (*((kadm5_common_context*)server_handle)->funcs.F)P; +#define __CALL(F, P) (*((kadm5_common_context*)server_handle)->funcs.F)P +#define __CALLABLE(F) (((kadm5_common_context*)server_handle)->funcs.F != 0) kadm5_ret_t kadm5_chpass_principal(void *server_handle, krb5_principal princ, const char *password) { - return __CALL(chpass_principal, (server_handle, princ, password)); + return __CALL(chpass_principal, (server_handle, princ, 0, + 0, NULL, password)); +} + +kadm5_ret_t +kadm5_chpass_principal_3(void *server_handle, + krb5_principal princ, + krb5_boolean keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, + const char *password) +{ + return __CALL(chpass_principal, (server_handle, princ, keepold, + n_ks_tuple, ks_tuple, password)); } kadm5_ret_t @@ -52,7 +66,30 @@ krb5_key_data *key_data) { return __CALL(chpass_principal_with_key, - (server_handle, princ, n_key_data, key_data)); + (server_handle, princ, 0, n_key_data, key_data)); +} + +kadm5_ret_t +kadm5_chpass_principal_with_key_3(void *server_handle, + krb5_principal princ, + int keepold, + int n_key_data, + krb5_key_data *key_data) +{ + return __CALL(chpass_principal_with_key, + (server_handle, princ, keepold, n_key_data, key_data)); +} + +kadm5_ret_t +kadm5_create_principal_3(void *server_handle, + kadm5_principal_ent_t princ, + uint32_t mask, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, + char *password) +{ + return __CALL(create_principal, + (server_handle, princ, mask, n_ks_tuple, ks_tuple, password)); } kadm5_ret_t @@ -61,7 +98,8 @@ uint32_t mask, const char *password) { - return __CALL(create_principal, (server_handle, princ, mask, password)); + return __CALL(create_principal, + (server_handle, princ, mask, 0, NULL, password)); } kadm5_ret_t @@ -92,6 +130,49 @@ return __CALL(get_principal, (server_handle, princ, out, mask)); } +/** + * Extract decrypted keys from kadm5_principal_ent_t object. Mostly a + * no-op for Heimdal because we fetch the entry with decrypted keys. + * Sadly this is not fully a no-op, as we have to allocate a copy. + * + * @server_handle is the kadm5 handle + * @entry is the HDB entry for the principal in question + * @ktype is the enctype to get a key for, or -1 to get the first one + * @stype is the salttype to get a key for, or -1 to get the first match + * @kvno is the kvno to search for, or -1 to get the first match (highest kvno) + * @keyblock is where the key will be placed + * @keysalt, if not NULL, is where the salt will be placed + * @kvnop, if not NULL, is where the selected kvno will be placed + */ +kadm5_ret_t +kadm5_decrypt_key(void *server_handle, + kadm5_principal_ent_t entry, + int32_t ktype, int32_t stype, + int32_t kvno, krb5_keyblock *keyblock, + krb5_keysalt *keysalt, int *kvnop) +{ + size_t i; + + if (kvno < 1 || stype != -1) + return KADM5_DECRYPT_USAGE_NOSUPP; + + for (i = 0; i < entry->n_key_data; i++) { + if (ktype != entry->key_data[i].key_data_kvno) + continue; + + keyblock->keytype = ktype; + keyblock->keyvalue.length = entry->key_data[i].key_data_length[0]; + keyblock->keyvalue.data = malloc(keyblock->keyvalue.length); + if (keyblock->keyvalue.data == NULL) + return ENOMEM; + memcpy(keyblock->keyvalue.data, + entry->key_data[i].key_data_contents[0], + keyblock->keyvalue.length); + } + + return 0; +} + kadm5_ret_t kadm5_modify_principal(void *server_handle, kadm5_principal_ent_t princ, @@ -106,7 +187,21 @@ krb5_keyblock **new_keys, int *n_keys) { - return __CALL(randkey_principal, (server_handle, princ, new_keys, n_keys)); + return __CALL(randkey_principal, (server_handle, princ, FALSE, 0, NULL, + new_keys, n_keys)); +} + +kadm5_ret_t +kadm5_randkey_principal_3(void *server_handle, + krb5_principal princ, + krb5_boolean keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, + krb5_keyblock **new_keys, + int *n_keys) +{ + return __CALL(randkey_principal, (server_handle, princ, keepold, + n_ks_tuple, ks_tuple, new_keys, n_keys)); } kadm5_ret_t @@ -132,3 +227,202 @@ { return __CALL(get_privs, (server_handle, privs)); } + + +/** + * This function is allows the caller to set new keys for a principal. + * This is a trivial wrapper around kadm5_setkey_principal_3(). + */ +kadm5_ret_t +kadm5_setkey_principal(void *server_handle, + krb5_principal princ, + krb5_keyblock *new_keys, + int n_keys) +{ + return kadm5_setkey_principal_3(server_handle, princ, 0, 0, NULL, + new_keys, n_keys); +} + +/** + * This function is allows the caller to set new keys for a principal. + * This is a simple wrapper around kadm5_get_principal() and + * kadm5_modify_principal(). + */ +kadm5_ret_t +kadm5_setkey_principal_3(void *server_handle, + krb5_principal princ, + krb5_boolean keepold, + int n_ks_tuple, krb5_key_salt_tuple *ks_tuple, + krb5_keyblock *keyblocks, + int n_keys) +{ + kadm5_principal_ent_rec princ_ent; + kadm5_ret_t ret; + krb5_key_data *new_key_data = NULL; + size_t i; + + if (n_keys < 1) + return EINVAL; + if (n_ks_tuple > 0 && n_ks_tuple != n_keys) + return KADM5_SETKEY3_ETYPE_MISMATCH; + + /* + * If setkey_principal_3 is defined in the server handle, use that. + */ + if (__CALLABLE(setkey_principal_3)) + return __CALL(setkey_principal_3, + (server_handle, princ, keepold, n_ks_tuple, ks_tuple, + keyblocks, n_keys)); + + /* + * Otherwise, simulate it via a get, update, modify sequence. + */ + ret = kadm5_get_principal(server_handle, princ, &princ_ent, + KADM5_KVNO | KADM5_PRINCIPAL | KADM5_KEY_DATA); + if (ret) + return ret; + + if (keepold) { + new_key_data = calloc((n_keys + princ_ent.n_key_data), + sizeof(*new_key_data)); + if (new_key_data == NULL) { + ret = ENOMEM; + goto out; + } + + memcpy(&new_key_data[n_keys], &princ_ent.key_data[0], + princ_ent.n_key_data * sizeof (princ_ent.key_data[0])); + } else { + new_key_data = calloc(n_keys, sizeof(*new_key_data)); + if (new_key_data == NULL) { + ret = ENOMEM; + goto out; + } + } + + princ_ent.kvno++; + for (i = 0; i < n_keys; i++) { + new_key_data[i].key_data_ver = 2; + + /* Key */ + new_key_data[i].key_data_kvno = princ_ent.kvno; + new_key_data[i].key_data_type[0] = keyblocks[i].keytype; + new_key_data[i].key_data_length[0] = keyblocks[i].keyvalue.length; + new_key_data[i].key_data_contents[0] = + malloc(keyblocks[i].keyvalue.length); + if (new_key_data[i].key_data_contents[0] == NULL) { + ret = ENOMEM; + goto out; + } + memcpy(new_key_data[i].key_data_contents[0], + keyblocks[i].keyvalue.data, + keyblocks[i].keyvalue.length); + + /* + * Salt (but there's no salt, just salttype, which is kinda + * silly -- what's the point of setkey_3() then, besides + * keepold?!) + */ + new_key_data[i].key_data_type[1] = 0; + if (n_ks_tuple > 0) { + if (ks_tuple[i].ks_enctype != keyblocks[i].keytype) { + ret = KADM5_SETKEY3_ETYPE_MISMATCH; + goto out; + } + new_key_data[i].key_data_type[1] = ks_tuple[i].ks_salttype; + } + new_key_data[i].key_data_length[1] = 0; + new_key_data[i].key_data_contents[1] = NULL; + } + + /* Free old keys */ + if (!keepold) { + for (i = 0; i < princ_ent.n_key_data; i++) { + free(princ_ent.key_data[i].key_data_contents[0]); + free(princ_ent.key_data[i].key_data_contents[1]); + } + } + free(princ_ent.key_data); + princ_ent.key_data = new_key_data; + princ_ent.n_key_data = n_keys + (keepold ? princ_ent.n_key_data : 0); + new_key_data = NULL; + + /* Modify the principal */ + ret = kadm5_modify_principal(server_handle, &princ_ent, KADM5_KVNO | KADM5_KEY_DATA); + +out: + if (new_key_data != NULL) { + for (i = 0; i < n_keys; i++) { + free(new_key_data[i].key_data_contents[0]); + free(new_key_data[i].key_data_contents[1]); + } + free(new_key_data); + } + kadm5_free_principal_ent(server_handle, &princ_ent); + return ret; +} + + +kadm5_ret_t +kadm5_lock(void *server_handle) +{ + return __CALL(lock, (server_handle)); +} + +kadm5_ret_t +kadm5_unlock(void *server_handle) +{ + return __CALL(unlock, (server_handle)); +} + + +kadm5_ret_t +kadm5_create_policy(void *server_handle, + kadm5_policy_ent_t policy, long mask) +{ + return KADM5_POLICY_OP_NOSUPP; +} + +kadm5_ret_t +kadm5_delete_policy(void *server_handle, char *name) +{ + return KADM5_POLICY_OP_NOSUPP; +} + + +kadm5_ret_t +kadm5_modify_policy(void *server_handle, kadm5_policy_ent_t policy, + uint32_t mask) +{ + return KADM5_POLICY_OP_NOSUPP; +} + +kadm5_ret_t +kadm5_get_policy(void *server_handle, char *policy, kadm5_policy_ent_t ent) +{ + memset(ent, 0, sizeof (*ent)); + return KADM5_POLICY_OP_NOSUPP; +} + + +kadm5_ret_t +kadm5_get_policies(void *server_handle, char *exp, char ***pols, int *count) +{ + *count = 0; + *pols = NULL; + + return KADM5_POLICY_OP_NOSUPP; +} + +kadm5_ret_t +kadm5_free_policy_ent(kadm5_policy_ent_t ent) +{ + if (ent->policy) + free(ent->policy); + /* + * Not clear if we should free ent or not. It might be an automatic + * struct, so we don't free it for now, just in case. + */ + return 0; +} + diff --git a/crypto/heimdal/lib/kadm5/context_s.c b/crypto/heimdal/lib/kadm5/context_s.c --- a/crypto/heimdal/lib/kadm5/context_s.c +++ b/crypto/heimdal/lib/kadm5/context_s.c @@ -35,6 +35,63 @@ RCSID("$Id$"); +static kadm5_ret_t +kadm5_s_lock(void *server_handle) +{ + kadm5_server_context *context = server_handle; + kadm5_ret_t ret; + + if (context->keep_open) { + /* + * We open/close around every operation, but we retain the DB + * open if the DB was locked with a prior call to kadm5_lock(), + * so if it's open here that must be because the DB is locked. + */ + heim_assert(context->db->lock_count > 0, + "Internal error in tracking HDB locks"); + return KADM5_ALREADY_LOCKED; + } + + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if (ret) + return ret; + + ret = context->db->hdb_lock(context->context, context->db, HDB_WLOCK); + if (ret) { + (void) context->db->hdb_close(context->context, context->db); + return ret; + } + + /* + * Attempt to recover the log. This will generally fail on slaves, + * and we can't tell if we're on a slave here. + * + * Perhaps we could set a flag in the kadm5_server_context to + * indicate whether a read has been done without recovering the log, + * in which case we could fail any subsequent writes. + */ + if (kadm5_log_init(context) == 0) + (void) kadm5_log_end(context); + + context->keep_open = 1; + return 0; +} + +static kadm5_ret_t +kadm5_s_unlock(void *server_handle) +{ + kadm5_server_context *context = server_handle; + kadm5_ret_t ret; + + if (!context->keep_open) + return KADM5_NOT_LOCKED; + + context->keep_open = 0; + ret = context->db->hdb_unlock(context->context, context->db); + (void) context->db->hdb_close(context->context, context->db); + return ret; +} + static void set_funcs(kadm5_server_context *c) { @@ -51,6 +108,9 @@ SET(c, modify_principal); SET(c, randkey_principal); SET(c, rename_principal); + SET(c, lock); + SET(c, unlock); + SET(c, setkey_principal_3); } #ifndef NO_UNIX_SOCKETS @@ -81,6 +141,7 @@ krb5_context context = ctx->context; struct hdb_dbinfo *info, *d; krb5_error_code ret; + int aret; if (ctx->config.realm) { /* fetch the databases */ @@ -97,20 +158,32 @@ continue; p = hdb_dbinfo_get_dbname(context, d); - if (p) + if (p) { ctx->config.dbname = strdup(p); + if (ctx->config.dbname == NULL) + return ENOMEM; + } p = hdb_dbinfo_get_acl_file(context, d); - if (p) + if (p) { ctx->config.acl_file = strdup(p); + if (ctx->config.acl_file == NULL) + return ENOMEM; + } p = hdb_dbinfo_get_mkey_file(context, d); - if (p) + if (p) { ctx->config.stash_file = strdup(p); + if (ctx->config.stash_file == NULL) + return ENOMEM; + } p = hdb_dbinfo_get_log_file(context, d); - if (p) + if (p) { ctx->log_context.log_file = strdup(p); + if (ctx->log_context.log_file == NULL) + return ENOMEM; + } break; } hdb_free_dbinfo(context, &info); @@ -118,14 +191,29 @@ /* If any of the values was unset, pick up the default value */ - if (ctx->config.dbname == NULL) + if (ctx->config.dbname == NULL) { ctx->config.dbname = strdup(hdb_default_db(context)); - if (ctx->config.acl_file == NULL) - asprintf(&ctx->config.acl_file, "%s/kadmind.acl", hdb_db_dir(context)); - if (ctx->config.stash_file == NULL) - asprintf(&ctx->config.stash_file, "%s/m-key", hdb_db_dir(context)); - if (ctx->log_context.log_file == NULL) - asprintf(&ctx->log_context.log_file, "%s/log", hdb_db_dir(context)); + if (ctx->config.dbname == NULL) + return ENOMEM; + } + if (ctx->config.acl_file == NULL) { + aret = asprintf(&ctx->config.acl_file, "%s/kadmind.acl", + hdb_db_dir(context)); + if (aret == -1) + return ENOMEM; + } + if (ctx->config.stash_file == NULL) { + aret = asprintf(&ctx->config.stash_file, "%s/m-key", + hdb_db_dir(context)); + if (aret == -1) + return ENOMEM; + } + if (ctx->log_context.log_file == NULL) { + aret = asprintf(&ctx->log_context.log_file, "%s/log", + hdb_db_dir(context)); + if (aret == -1) + return ENOMEM; + } #ifndef NO_UNIX_SOCKETS set_socket_name(context, &ctx->log_context.socket_name); @@ -141,24 +229,42 @@ kadm5_config_params *params, krb5_context context) { - *ctx = malloc(sizeof(**ctx)); - if(*ctx == NULL) + kadm5_ret_t ret = 0; + + *ctx = calloc(1, sizeof(**ctx)); + if (*ctx == NULL) return ENOMEM; - memset(*ctx, 0, sizeof(**ctx)); + (*ctx)->log_context.socket_fd = rk_INVALID_SOCKET; + set_funcs(*ctx); (*ctx)->context = context; krb5_add_et_list (context, initialize_kadm5_error_table_r); + #define is_set(M) (params && params->mask & KADM5_CONFIG_ ## M) - if(is_set(REALM)) + if (is_set(REALM)) { (*ctx)->config.realm = strdup(params->realm); - else - krb5_get_default_realm(context, &(*ctx)->config.realm); - if(is_set(DBNAME)) + if ((*ctx)->config.realm == NULL) + return ENOMEM; + } else { + ret = krb5_get_default_realm(context, &(*ctx)->config.realm); + if (ret) + return ret; + } + if (is_set(DBNAME)) { (*ctx)->config.dbname = strdup(params->dbname); - if(is_set(ACL_FILE)) + if ((*ctx)->config.dbname == NULL) + return ENOMEM; + } + if (is_set(ACL_FILE)) { (*ctx)->config.acl_file = strdup(params->acl_file); - if(is_set(STASH_FILE)) + if ((*ctx)->config.acl_file == NULL) + return ENOMEM; + } + if (is_set(STASH_FILE)) { (*ctx)->config.stash_file = strdup(params->stash_file); + if ((*ctx)->config.stash_file == NULL) + return ENOMEM; + } find_db_spec(*ctx); diff --git a/crypto/heimdal/lib/kadm5/create_c.c b/crypto/heimdal/lib/kadm5/create_c.c --- a/crypto/heimdal/lib/kadm5/create_c.c +++ b/crypto/heimdal/lib/kadm5/create_c.c @@ -39,6 +39,8 @@ kadm5_c_create_principal(void *server_handle, kadm5_principal_ent_t princ, uint32_t mask, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password) { kadm5_client_context *context = server_handle; @@ -48,6 +50,14 @@ int32_t tmp; krb5_data reply; + /* + * We should get around to implementing this... At the moment, the + * the server side API is implemented but the wire protocol has not + * been updated. + */ + if (n_ks_tuple > 0) + return KADM5_KS_TUPLE_NOSUPP; + ret = _kadm5_connect(server_handle); if(ret) return ret; diff --git a/crypto/heimdal/lib/kadm5/create_s.c b/crypto/heimdal/lib/kadm5/create_s.c --- a/crypto/heimdal/lib/kadm5/create_s.c +++ b/crypto/heimdal/lib/kadm5/create_s.c @@ -111,6 +111,12 @@ hdb_entry_ex ent; kadm5_server_context *context = server_handle; + if ((mask & KADM5_KVNO) == 0) { + /* create_principal() through _kadm5_setup_entry(), will need this */ + princ->kvno = 1; + mask |= KADM5_KVNO; + } + ret = create_principal(context, princ, mask, &ent, KADM5_PRINCIPAL | KADM5_KEY_DATA, KADM5_LAST_PWD_CHANGE | KADM5_MOD_TIME @@ -118,26 +124,37 @@ | KADM5_AUX_ATTRIBUTES | KADM5_POLICY_CLR | KADM5_LAST_SUCCESS | KADM5_LAST_FAILED | KADM5_FAIL_AUTH_COUNT); - if(ret) - goto out; + if (ret) + return ret; + + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if (ret) { + hdb_free_entry(context->context, &ent); + return ret; + } + } - if ((mask & KADM5_KVNO) == 0) - ent.entry.kvno = 1; + ret = kadm5_log_init(context); + if (ret) + goto out; ret = hdb_seal_keys(context->context, context->db, &ent.entry); if (ret) - goto out; + goto out2; - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) - goto out; - ret = context->db->hdb_store(context->context, context->db, 0, &ent); - context->db->hdb_close(context->context, context->db); - if (ret) - goto out; - kadm5_log_create (context, &ent.entry); + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_create(context, &ent.entry); -out: + out2: + (void) kadm5_log_end(context); + out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } hdb_free_entry(context->context, &ent); return _kadm5_error_code(ret); } @@ -147,12 +164,20 @@ kadm5_s_create_principal(void *server_handle, kadm5_principal_ent_t princ, uint32_t mask, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password) { kadm5_ret_t ret; hdb_entry_ex ent; kadm5_server_context *context = server_handle; + if ((mask & KADM5_KVNO) == 0) { + /* create_principal() through _kadm5_setup_entry(), will need this */ + princ->kvno = 1; + mask |= KADM5_KVNO; + } + ret = create_principal(context, princ, mask, &ent, KADM5_PRINCIPAL, KADM5_LAST_PWD_CHANGE | KADM5_MOD_TIME @@ -160,38 +185,44 @@ | KADM5_AUX_ATTRIBUTES | KADM5_KEY_DATA | KADM5_POLICY_CLR | KADM5_LAST_SUCCESS | KADM5_LAST_FAILED | KADM5_FAIL_AUTH_COUNT); - if(ret) - goto out; + if (ret) + return ret; + + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if (ret) { + hdb_free_entry(context->context, &ent); + return ret; + } + } - if ((mask & KADM5_KVNO) == 0) - ent.entry.kvno = 1; + ret = kadm5_log_init(context); + if (ret) + goto out; ent.entry.keys.len = 0; ent.entry.keys.val = NULL; - ret = fbsd_ossl_provider_load(); + ret = _kadm5_set_keys(context, &ent.entry, n_ks_tuple, ks_tuple, password); if (ret) - goto out; - - ret = _kadm5_set_keys(context, &ent.entry, password); - if (ret) - goto out; + goto out2; ret = hdb_seal_keys(context->context, context->db, &ent.entry); if (ret) - goto out; + goto out2; - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) - goto out; - ret = context->db->hdb_store(context->context, context->db, 0, &ent); - context->db->hdb_close(context->context, context->db); - if (ret) - goto out; - - kadm5_log_create (context, &ent.entry); + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_create(context, &ent.entry); + out2: + (void) kadm5_log_end(context); out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } hdb_free_entry(context->context, &ent); return _kadm5_error_code(ret); } diff --git a/crypto/heimdal/lib/kadm5/default_keys.c b/crypto/heimdal/lib/kadm5/default_keys.c --- a/crypto/heimdal/lib/kadm5/default_keys.c +++ b/crypto/heimdal/lib/kadm5/default_keys.c @@ -85,7 +85,8 @@ size_t nkeys; Key *keys; - ret = hdb_generate_key_set(context, principal, &keys, &nkeys, no_salt); + ret = hdb_generate_key_set(context, principal, NULL, 0, &keys, &nkeys, + no_salt); if (ret) krb5_err(context, 1, ret, "hdb_generate_key_set"); diff --git a/crypto/heimdal/lib/kadm5/delete_s.c b/crypto/heimdal/lib/kadm5/delete_s.c --- a/crypto/heimdal/lib/kadm5/delete_s.c +++ b/crypto/heimdal/lib/kadm5/delete_s.c @@ -43,33 +43,44 @@ hdb_entry_ex ent; memset(&ent, 0, sizeof(ent)); - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) { - krb5_warn(context->context, ret, "opening database"); - return ret; + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if(ret) { + krb5_warn(context->context, ret, "opening database"); + return ret; + } } + + ret = kadm5_log_init(context); + if (ret) + goto out; + ret = context->db->hdb_fetch_kvno(context->context, context->db, princ, HDB_F_DECRYPT|HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); - if (ret) - goto out; - if(ent.entry.flags.immutable) { - ret = KADM5_PROTECT_PRINCIPAL; + if (ret == HDB_ERR_NOENTRY) goto out2; + if (ent.entry.flags.immutable) { + ret = KADM5_PROTECT_PRINCIPAL; + goto out3; } ret = hdb_seal_keys(context->context, context->db, &ent.entry); if (ret) - goto out2; + goto out3; - ret = context->db->hdb_remove(context->context, context->db, princ); - if (ret) - goto out2; + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_delete(context, princ); - kadm5_log_delete (context, princ); - -out2: + out3: hdb_free_entry(context->context, &ent); -out: - context->db->hdb_close(context->context, context->db); + out2: + (void) kadm5_log_end(context); + out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } return _kadm5_error_code(ret); } diff --git a/crypto/heimdal/lib/kadm5/destroy_c.c b/crypto/heimdal/lib/kadm5/destroy_c.c --- a/crypto/heimdal/lib/kadm5/destroy_c.c +++ b/crypto/heimdal/lib/kadm5/destroy_c.c @@ -42,7 +42,7 @@ free(context->realm); free(context->admin_server); - close(context->sock); + rk_closesocket(context->sock); if (context->client_name) free(context->client_name); if (context->service_name) @@ -51,5 +51,6 @@ krb5_auth_con_free(context->context, context->ac); if(context->my_context) krb5_free_context(context->context); + free(context); return 0; } diff --git a/crypto/heimdal/lib/kadm5/destroy_s.c b/crypto/heimdal/lib/kadm5/destroy_s.c --- a/crypto/heimdal/lib/kadm5/destroy_s.c +++ b/crypto/heimdal/lib/kadm5/destroy_s.c @@ -55,8 +55,9 @@ static void destroy_kadm5_log_context (kadm5_log_context *c) { - free (c->log_file); - rk_closesocket (c->socket_fd); + free(c->log_file); + if (c->socket_fd != rk_INVALID_SOCKET) + rk_closesocket(c->socket_fd); #ifdef NO_UNIX_SOCKETS if (c->socket_info) { freeaddrinfo(c->socket_info); @@ -72,16 +73,18 @@ kadm5_ret_t kadm5_s_destroy(void *server_handle) { - kadm5_ret_t ret; + kadm5_ret_t ret = 0; kadm5_server_context *context = server_handle; krb5_context kcontext = context->context; - ret = context->db->hdb_destroy(kcontext, context->db); - destroy_kadm5_log_context (&context->log_context); - destroy_config (&context->config); - krb5_free_principal (kcontext, context->caller); - if(context->my_context) + if (context->db != NULL) + ret = context->db->hdb_destroy(kcontext, context->db); + destroy_kadm5_log_context(&context->log_context); + destroy_config(&context->config); + krb5_free_principal(kcontext, context->caller); + if (context->my_context) krb5_free_context(kcontext); - free (context); + free(context); + return ret; } diff --git a/crypto/heimdal/lib/kadm5/ent_setup.c b/crypto/heimdal/lib/kadm5/ent_setup.c --- a/crypto/heimdal/lib/kadm5/ent_setup.c +++ b/crypto/heimdal/lib/kadm5/ent_setup.c @@ -51,6 +51,7 @@ /* DUP_SKEY */ flags->invalid = !!(attr & KRB5_KDB_DISALLOW_ALL_TIX); flags->require_preauth = !!(attr & KRB5_KDB_REQUIRES_PRE_AUTH); + flags->require_pwchange = !!(attr & KRB5_KDB_REQUIRES_PWCHANGE); /* HW_AUTH */ flags->server = !(attr & KRB5_KDB_DISALLOW_SVR); flags->change_pw = !!(attr & KRB5_KDB_PWCHANGE_SERVICE); @@ -178,8 +179,14 @@ } } if(mask & KADM5_KVNO - && princ_mask & KADM5_KVNO) - ent->entry.kvno = princ->kvno; + && (princ_mask & KADM5_KVNO)) { + krb5_error_code ret; + + ret = hdb_change_kvno(context->context, princ->kvno, &ent->entry); + if (ret && ret != HDB_ERR_KVNO_NOT_FOUND) + return ret; + ent->entry.kvno = princ->kvno; /* force it */ + } if(mask & KADM5_MAX_RLIFE) { if(princ_mask & KADM5_MAX_RLIFE) { if(princ->max_renewable_life) diff --git a/crypto/heimdal/lib/kadm5/free.c b/crypto/heimdal/lib/kadm5/free.c --- a/crypto/heimdal/lib/kadm5/free.c +++ b/crypto/heimdal/lib/kadm5/free.c @@ -60,12 +60,13 @@ kadm5_principal_ent_t princ) { kadm5_server_context *context = server_handle; - if(princ->principal) + + if (princ->principal) krb5_free_principal(context->context, princ->principal); - if(princ->mod_name) + if (princ->mod_name) krb5_free_principal(context->context, princ->mod_name); kadm5_free_key_data(server_handle, &princ->n_key_data, princ->key_data); - while(princ->n_tl_data && princ->tl_data) { + while (princ->n_tl_data && princ->tl_data) { krb5_tl_data *tp; tp = princ->tl_data; princ->tl_data = tp->tl_data_next; @@ -74,8 +75,8 @@ free(tp->tl_data_contents); free(tp); } - if (princ->key_data != NULL) - free (princ->key_data); + free(princ->key_data); + free(princ->policy); } void diff --git a/crypto/heimdal/lib/kadm5/get_c.c b/crypto/heimdal/lib/kadm5/get_c.c --- a/crypto/heimdal/lib/kadm5/get_c.c +++ b/crypto/heimdal/lib/kadm5/get_c.c @@ -77,7 +77,7 @@ ret = tmp; krb5_clear_error_message(context->context); if(ret == 0) - ret = kadm5_ret_principal_ent(sp, out); + kadm5_ret_principal_ent(sp, out); krb5_storage_free(sp); krb5_data_free (&reply); return ret; diff --git a/crypto/heimdal/lib/kadm5/get_princs_s.c b/crypto/heimdal/lib/kadm5/get_princs_s.c --- a/crypto/heimdal/lib/kadm5/get_princs_s.c +++ b/crypto/heimdal/lib/kadm5/get_princs_s.c @@ -85,30 +85,41 @@ struct foreach_data d; kadm5_server_context *context = server_handle; kadm5_ret_t ret; - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) { - krb5_warn(context->context, ret, "opening database"); - return ret; + + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDONLY, 0); + if (ret) { + krb5_warn(context->context, ret, "opening database"); + return ret; + } } d.exp = expression; { krb5_realm r; - if ((ret = krb5_get_default_realm(context->context, &r))) - return (ret); - asprintf(&d.exp2, "%s@%s", expression, r); + int aret; + + krb5_get_default_realm(context->context, &r); + aret = asprintf(&d.exp2, "%s@%s", expression, r); free(r); + if (aret == -1 || d.exp2 == NULL) { + ret = ENOMEM; + goto out; + } } d.princs = NULL; d.count = 0; ret = hdb_foreach(context->context, context->db, HDB_F_ADMIN_DATA, foreach, &d); - context->db->hdb_close(context->context, context->db); - if(ret == 0) + + if (ret == 0) ret = add_princ(&d, NULL); - if(ret == 0){ + if (ret == 0){ *princs = d.princs; *count = d.count - 1; - }else + } else kadm5_free_name_list(context, d.princs, &d.count); free(d.exp2); + out: + if (!context->keep_open) + context->db->hdb_close(context->context, context->db); return _kadm5_error_code(ret); } diff --git a/crypto/heimdal/lib/kadm5/get_s.c b/crypto/heimdal/lib/kadm5/get_s.c --- a/crypto/heimdal/lib/kadm5/get_s.c +++ b/crypto/heimdal/lib/kadm5/get_s.c @@ -31,7 +31,9 @@ * SUCH DAMAGE. */ +#include #include "kadm5_locl.h" +#include RCSID("$Id$"); @@ -61,8 +63,56 @@ return 0; } -KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL -_krb5_put_int(void *buffer, unsigned long value, size_t size); /* XXX */ +static +krb5_error_code +copy_keyset_to_kadm5(kadm5_server_context *context, krb5_kvno kvno, + size_t n_keys, Key *keys, krb5_salt *salt, + kadm5_principal_ent_t out) +{ + size_t i; + Key *key; + krb5_key_data *kd; + krb5_data *sp; + krb5_error_code ret = 0; + + for (i = 0; i < n_keys; i++) { + key = &keys[i]; + kd = &out->key_data[out->n_key_data]; + kd->key_data_ver = 2; + kd->key_data_kvno = kvno; + kd->key_data_type[0] = key->key.keytype; + if(key->salt) + kd->key_data_type[1] = key->salt->type; + else + kd->key_data_type[1] = KRB5_PADATA_PW_SALT; + /* setup key */ + kd->key_data_length[0] = key->key.keyvalue.length; + kd->key_data_contents[0] = malloc(kd->key_data_length[0]); + if(kd->key_data_contents[0] == NULL && kd->key_data_length[0] != 0){ + ret = ENOMEM; + break; + } + memcpy(kd->key_data_contents[0], key->key.keyvalue.data, + kd->key_data_length[0]); + /* setup salt */ + if(key->salt) + sp = &key->salt->salt; + else + sp = &salt->saltvalue; + kd->key_data_length[1] = sp->length; + kd->key_data_contents[1] = malloc(kd->key_data_length[1]); + if(kd->key_data_length[1] != 0 + && kd->key_data_contents[1] == NULL) { + memset(kd->key_data_contents[0], 0, kd->key_data_length[0]); + ret = ENOMEM; + break; + } + memcpy(kd->key_data_contents[1], sp->data, kd->key_data_length[1]); + out->n_key_data++; + } + + return ret; +} kadm5_ret_t kadm5_s_get_principal(void *server_handle, @@ -75,16 +125,34 @@ hdb_entry_ex ent; memset(&ent, 0, sizeof(ent)); - ret = context->db->hdb_open(context->context, context->db, O_RDONLY, 0); - if(ret) - return ret; + memset(out, 0, sizeof(*out)); + + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDONLY, 0); + if (ret) + return ret; + } + + /* + * We may want to attempt to recover the log on read operations, but we + * because the HDB/log lock order is reversed on slaves, in order to avoid + * lock contention from kadm5srv apps we need to make sure that the the HDB + * open for read-write is optimistic and attempts only a non-blocking lock, + * and if it doesn't get it then it should fallback to read-only. But we + * don't have that option in the hdb_open() interface at this time. + * + * For now we won't attempt to recover the log. + */ + ret = context->db->hdb_fetch_kvno(context->context, context->db, princ, - HDB_F_DECRYPT|HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); - context->db->hdb_close(context->context, context->db); + HDB_F_DECRYPT|HDB_F_ALL_KVNOS| + HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); + + if (!context->keep_open) + context->db->hdb_close(context->context, context->db); if(ret) return _kadm5_error_code(ret); - memset(out, 0, sizeof(*out)); if(mask & KADM5_PRINCIPAL) ret = krb5_copy_principal(context->context, ent.entry.principal, &out->principal); @@ -104,6 +172,7 @@ out->attributes |= ent.entry.flags.proxiable ? 0 : KRB5_KDB_DISALLOW_PROXIABLE; out->attributes |= ent.entry.flags.invalid ? KRB5_KDB_DISALLOW_ALL_TIX : 0; out->attributes |= ent.entry.flags.require_preauth ? KRB5_KDB_REQUIRES_PRE_AUTH : 0; + out->attributes |= ent.entry.flags.require_pwchange ? KRB5_KDB_REQUIRES_PWCHANGE : 0; out->attributes |= ent.entry.flags.server ? 0 : KRB5_KDB_DISALLOW_SVR; out->attributes |= ent.entry.flags.change_pw ? KRB5_KDB_PWCHANGE_SERVICE : 0; out->attributes |= ent.entry.flags.ok_as_delegate ? KRB5_KDB_OK_AS_DELEGATE : 0; @@ -160,8 +229,21 @@ if(mask & KADM5_FAIL_AUTH_COUNT) ; #endif - if(mask & KADM5_POLICY) - out->policy = NULL; + if(mask & KADM5_POLICY) { + HDB_extension *ext; + + ext = hdb_find_extension(&ent.entry, choice_HDB_extension_data_policy); + if (ext == NULL) { + out->policy = strdup("default"); + /* It's OK if we retun NULL instead of "default" */ + } else { + out->policy = strdup(ext->data.u.policy); + if (out->policy == NULL) { + ret = ENOMEM; + goto out; + } + } + } if(mask & KADM5_MAX_RLIFE) { if(ent.entry.max_renew) out->max_renewable_life = *ent.entry.max_renew; @@ -170,57 +252,45 @@ } if(mask & KADM5_KEY_DATA){ size_t i; - Key *key; - krb5_key_data *kd; + size_t n_keys = ent.entry.keys.len; krb5_salt salt; - krb5_data *sp; + HDB_extension *ext; + HDB_Ext_KeySet *hist_keys = NULL; + + /* Don't return stale keys to kadm5 clients */ + ret = hdb_prune_keys(context->context, &ent.entry); + if (ret) + goto out; + ext = hdb_find_extension(&ent.entry, choice_HDB_extension_data_hist_keys); + if (ext != NULL) + hist_keys = &ext->data.u.hist_keys; + krb5_get_pw_salt(context->context, ent.entry.principal, &salt); - out->key_data = malloc(ent.entry.keys.len * sizeof(*out->key_data)); - if (out->key_data == NULL && ent.entry.keys.len != 0) { + for (i = 0; hist_keys != NULL && i < hist_keys->len; i++) + n_keys += hist_keys->val[i].keys.len; + out->key_data = malloc(n_keys * sizeof(*out->key_data)); + if (out->key_data == NULL && n_keys != 0) { ret = ENOMEM; goto out; } - for(i = 0; i < ent.entry.keys.len; i++){ - key = &ent.entry.keys.val[i]; - kd = &out->key_data[i]; - kd->key_data_ver = 2; - kd->key_data_kvno = ent.entry.kvno; - kd->key_data_type[0] = key->key.keytype; - if(key->salt) - kd->key_data_type[1] = key->salt->type; - else - kd->key_data_type[1] = KRB5_PADATA_PW_SALT; - /* setup key */ - kd->key_data_length[0] = key->key.keyvalue.length; - kd->key_data_contents[0] = malloc(kd->key_data_length[0]); - if(kd->key_data_contents[0] == NULL && kd->key_data_length[0] != 0){ - ret = ENOMEM; - break; - } - memcpy(kd->key_data_contents[0], key->key.keyvalue.data, - kd->key_data_length[0]); - /* setup salt */ - if(key->salt) - sp = &key->salt->salt; - else - sp = &salt.saltvalue; - kd->key_data_length[1] = sp->length; - kd->key_data_contents[1] = malloc(kd->key_data_length[1]); - if(kd->key_data_length[1] != 0 - && kd->key_data_contents[1] == NULL) { - memset(kd->key_data_contents[0], 0, kd->key_data_length[0]); - ret = ENOMEM; - break; - } - memcpy(kd->key_data_contents[1], sp->data, kd->key_data_length[1]); - out->n_key_data = i + 1; + out->n_key_data = 0; + ret = copy_keyset_to_kadm5(context, ent.entry.kvno, ent.entry.keys.len, + ent.entry.keys.val, &salt, out); + if (ret) + goto out; + for (i = 0; hist_keys != NULL && i < hist_keys->len; i++) { + ret = copy_keyset_to_kadm5(context, hist_keys->val[i].kvno, + hist_keys->val[i].keys.len, + hist_keys->val[i].keys.val, + &salt, out); + if (ret) + goto out; } krb5_free_salt(context->context, salt); + assert( out->n_key_data == n_keys ); } - if(ret){ - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } if(mask & KADM5_TL_DATA) { time_t last_pw_expire; const HDB_Ext_PKINIT_acl *acl; @@ -231,18 +301,14 @@ unsigned char buf[4]; _krb5_put_int(buf, last_pw_expire, sizeof(buf)); ret = add_tl_data(out, KRB5_TL_LAST_PWD_CHANGE, buf, sizeof(buf)); - if (ret) - goto out; } - if(ret){ - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } /* * If the client was allowed to get key data, let it have the * password too. */ - if(mask & KADM5_KEY_DATA) { + if (mask & KADM5_KEY_DATA) { heim_utf8_string pw; ret = hdb_entry_get_password(context->context, @@ -261,24 +327,18 @@ ASN1_MALLOC_ENCODE(HDB_Ext_PKINIT_acl, buf.data, buf.length, acl, &len, ret); - if (ret) { - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } if (len != buf.length) krb5_abortx(context->context, "internal ASN.1 encoder error"); ret = add_tl_data(out, KRB5_TL_PKINIT_ACL, buf.data, buf.length); free(buf.data); - if (ret) { - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } } - if(ret){ - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } ret = hdb_entry_get_aliases(&ent.entry, &aliases); if (ret == 0 && aliases) { @@ -287,27 +347,23 @@ ASN1_MALLOC_ENCODE(HDB_Ext_Aliases, buf.data, buf.length, aliases, &len, ret); - if (ret) { - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } if (len != buf.length) krb5_abortx(context->context, "internal ASN.1 encoder error"); ret = add_tl_data(out, KRB5_TL_ALIASES, buf.data, buf.length); free(buf.data); - if (ret) { - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } } - if(ret){ - kadm5_free_principal_ent(context, out); + if (ret) goto out; - } - } -out: + + out: + if (ret) + kadm5_free_principal_ent(context, out); hdb_free_entry(context->context, &ent); return _kadm5_error_code(ret); diff --git a/crypto/heimdal/lib/kadm5/init_c.c b/crypto/heimdal/lib/kadm5/init_c.c --- a/crypto/heimdal/lib/kadm5/init_c.c +++ b/crypto/heimdal/lib/kadm5/init_c.c @@ -45,10 +45,23 @@ RCSID("$Id$"); +static kadm5_ret_t +kadm5_c_lock(void *server_handle) +{ + return ENOTSUP; +} + +static kadm5_ret_t +kadm5_c_unlock(void *server_handle) +{ + return ENOTSUP; +} + static void set_funcs(kadm5_client_context *c) { #define SET(C, F) (C)->funcs.F = kadm5 ## _c_ ## F +#define SETNOTIMP(C, F) (C)->funcs.F = 0 SET(c, chpass_principal); SET(c, chpass_principal_with_key); SET(c, create_principal); @@ -61,6 +74,9 @@ SET(c, modify_principal); SET(c, randkey_principal); SET(c, rename_principal); + SET(c, lock); + SET(c, unlock); + SETNOTIMP(c, setkey_principal_3); } kadm5_ret_t @@ -465,11 +481,12 @@ } if (ctx->realm) - asprintf(&service_name, "%s@%s", KADM5_ADMIN_SERVICE, ctx->realm); + error = asprintf(&service_name, "%s@%s", KADM5_ADMIN_SERVICE, + ctx->realm); else - asprintf(&service_name, "%s", KADM5_ADMIN_SERVICE); + error = asprintf(&service_name, "%s", KADM5_ADMIN_SERVICE); - if (service_name == NULL) { + if (error == -1 || service_name == NULL) { freeaddrinfo (ai); rk_closesocket(s); krb5_clear_error_message(context); @@ -571,16 +588,18 @@ krb5_ccache cc; ret = _kadm5_c_init_context(&ctx, realm_params, context); - if(ret) + if (ret) return ret; - if(password != NULL && *password != '\0') { + if (password != NULL && *password != '\0') { ret = _kadm5_c_get_cred_cache(context, client_name, service_name, password, prompter, keytab, ccache, &cc); - if(ret) - return ret; /* XXX */ + if (ret) { + kadm5_c_destroy(ctx); + return ret; + } ccache = cc; } diff --git a/crypto/heimdal/lib/kadm5/init_s.c b/crypto/heimdal/lib/kadm5/init_s.c --- a/crypto/heimdal/lib/kadm5/init_s.c +++ b/crypto/heimdal/lib/kadm5/init_s.c @@ -32,8 +32,7 @@ */ #include "kadm5_locl.h" - -RCSID("$Id$"); +#include static kadm5_ret_t @@ -47,12 +46,26 @@ { kadm5_ret_t ret; kadm5_server_context *ctx; + char *dbname; + char *stash_file; + + *server_handle = NULL; ret = _kadm5_s_init_context(&ctx, realm_params, context); - if(ret) + if (ret) return ret; - assert(ctx->config.dbname != NULL); - assert(ctx->config.stash_file != NULL); + if (realm_params->mask & KADM5_CONFIG_DBNAME) + dbname = realm_params->dbname; + else + dbname = ctx->config.dbname; + + if (realm_params->mask & KADM5_CONFIG_STASH_FILE) + stash_file = realm_params->stash_file; + else + stash_file = ctx->config.stash_file; + + assert(dbname != NULL); + assert(stash_file != NULL); assert(ctx->config.acl_file != NULL); assert(ctx->log_context.log_file != NULL); #ifndef NO_UNIX_SOCKETS @@ -61,34 +74,36 @@ assert(ctx->log_context.socket_info != NULL); #endif - ret = hdb_create(ctx->context, &ctx->db, ctx->config.dbname); - if(ret) - return ret; - ret = hdb_set_master_keyfile (ctx->context, - ctx->db, ctx->config.stash_file); - if(ret) + ret = hdb_create(ctx->context, &ctx->db, dbname); + if (ret == 0) + ret = hdb_set_master_keyfile(ctx->context, + ctx->db, stash_file); + if (ret) { + kadm5_s_destroy(ctx); return ret; + } - ctx->log_context.log_fd = -1; + ctx->log_context.log_fd = -1; #ifndef NO_UNIX_SOCKETS - ctx->log_context.socket_fd = socket (AF_UNIX, SOCK_DGRAM, 0); + ctx->log_context.socket_fd = socket(AF_UNIX, SOCK_DGRAM, 0); #else - ctx->log_context.socket_fd = socket (ctx->log_context.socket_info->ai_family, - ctx->log_context.socket_info->ai_socktype, - ctx->log_context.socket_info->ai_protocol); + ctx->log_context.socket_fd = socket(ctx->log_context.socket_info->ai_family, + ctx->log_context.socket_info->ai_socktype, + ctx->log_context.socket_info->ai_protocol); #endif - ret = krb5_parse_name(ctx->context, client_name, &ctx->caller); - if(ret) - return ret; - - ret = _kadm5_acl_init(ctx); - if(ret) - return ret; + if (ctx->log_context.socket_fd != rk_INVALID_SOCKET) + socket_set_nonblocking(ctx->log_context.socket_fd, 1); - *server_handle = ctx; - return 0; + ret = krb5_parse_name(ctx->context, client_name, &ctx->caller); + if (ret == 0) + ret = _kadm5_acl_init(ctx); + if (ret) + kadm5_s_destroy(ctx); + else + *server_handle = ctx; + return ret; } kadm5_ret_t diff --git a/crypto/heimdal/lib/kadm5/iprop-commands.in b/crypto/heimdal/lib/kadm5/iprop-commands.in --- a/crypto/heimdal/lib/kadm5/iprop-commands.in +++ b/crypto/heimdal/lib/kadm5/iprop-commands.in @@ -41,6 +41,18 @@ help = "configuration file" argument = "file" } + option = { + long = "no-lock" + short = "n" + type = "flag" + help = "don't lock iprop log" + } + option = { + long = "reverse" + short = "R" + type = "flag" + help = "dump the log in reverse order" + } option = { long = "realm" short = "r" @@ -49,7 +61,7 @@ } function = "iprop_dump" help = "Prints the iprop transaction log in text." - max_args = "0" + max_args = "1" } command = { name = "truncate" @@ -66,9 +78,30 @@ type = "string" help = "realm" } + option = { + long = "keep-entries" + short = "K" + type = "integer" + help = "number of entries to keep" + default = "-1" + } + option = { + long = "max-bytes" + short = "B" + type = "integer" + help = "keep entries that fit in the given number of bytes" + default = "-1" + } + option = { + long = "reset" + short = "R" + type = "flag" + help = "reset the log to version 1; forces full propagation" + default = "0"; + } function = "iprop_truncate" - help = "Truncate the log, preserve the version number." - max_args = "0" + help = "Truncate the log, preserve the version number. Keeps 100 entries by default." + max_args = "1" } command = { name = "replay" @@ -101,7 +134,7 @@ } function = "iprop_replay" help = "Replay the log on the database." - max_args = "0" + max_args = "1" } command = { name = "last-version" @@ -112,6 +145,12 @@ help = "configuration file" argument = "file" } + option = { + long = "no-lock" + short = "n" + type = "flag" + help = "don't lock iprop log" + } option = { long = "realm" short = "r" @@ -120,6 +159,24 @@ } function = "last_version" help = "Print the last version of the log-file." +} +command = { + name = "signal" + option = { + long = "config-file" + short = "c" + type = "string" + help = "configuration file" + argument = "file" + } + option = { + long = "realm" + short = "r" + type = "string" + help = "realm" + } + function = "signal_master" + help = "Print the last version of the log-file." max_args = "0" } command = { diff --git a/crypto/heimdal/lib/kadm5/iprop-log-version.rc b/crypto/heimdal/lib/kadm5/iprop-log-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/iprop-log-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "IProp Log Tool" +#define RC_FILE_ORIG_0409 "iprop-log.exe" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/kadm5/iprop-log.8 b/crypto/heimdal/lib/kadm5/iprop-log.8 --- a/crypto/heimdal/lib/kadm5/iprop-log.8 +++ b/crypto/heimdal/lib/kadm5/iprop-log.8 @@ -35,10 +35,10 @@ .\" .Dd February 18, 2007 .Dt IPROP-LOG 8 -.Os Heimdal +.Os .Sh NAME .Nm iprop-log -.Nd maintain the iprop log file +.Nd examine and maintain the iprop log file .Sh SYNOPSIS .Nm .Op Fl Fl version @@ -54,7 +54,20 @@ .Fl Fl realm= Ns Ar string .Xc .Oc +.Oo Fl K Ar integer \*(Ba Xo +.Fl Fl keep-entries= Ns Ar integer +.Xc +.Oc +.Oo Fl B Ar integer \*(Ba Xo +.Fl Fl max-bytes= Ns Ar integer +.Xc +.Oc +.Oo Fl R \*(Ba Xo +.Fl Fl reset +.Xc +.Oc .Op Fl h | Fl Fl help +.Op Ar log-file .Pp .Nm iprop-log dump .Oo Fl c Ar file \*(Ba Xo @@ -65,7 +78,16 @@ .Fl Fl realm= Ns Ar string .Xc .Oc +.Oo Fl n \*(Ba Xo +.Fl Fl no-lock +.Xc +.Oc +.Oo Fl R \*(Ba Xo +.Fl Fl reverse +.Xc +.Oc .Op Fl h | Fl Fl help +.Op Ar log-file .Pp .Nm iprop-log replay .Op Fl Fl start-version= Ns Ar version-number @@ -79,6 +101,35 @@ .Xc .Oc .Op Fl h | Fl Fl help +.Op Ar log-file +.Pp +.Nm iprop-log last-version +.Oo Fl c Ar file \*(Ba Xo +.Fl Fl config-file= Ns Ar file +.Xc +.Oc +.Oo Fl r Ar string \*(Ba Xo +.Fl Fl realm= Ns Ar string +.Xc +.Oc +.Oo Fl n \*(Ba Xo +.Fl Fl no-lock +.Xc +.Oc +.Op Fl h | Fl Fl help +.Op Ar log-files +.Pp +.Nm iprop-log signal +.Oo Fl c Ar file \*(Ba Xo +.Fl Fl config-file= Ns Ar file +.Xc +.Oc +.Oo Fl r Ar string \*(Ba Xo +.Fl Fl realm= Ns Ar string +.Xc +.Oc +.Op Fl h | Fl Fl help +.Pp .Sh DESCRIPTION Supported options: .Bl -tag -width Ds @@ -94,11 +145,42 @@ configuration file .It Fl r Ar string , Fl Fl realm= Ns Ar string realm +.It Xo +.Fl K Ar integer , +.Fl Fl keep-entries= Ns Ar integer +.Xc +.It Xo +.Fl B Ar integer , +.Fl Fl max-bytes= Ns Ar integer +.Xc +.It Xo +.Fl R , +.Fl Fl reset +.Xc .El .Pp -Truncates the log. Sets the new logs version number for the to the -last entry of the old log. If the log is truncted by emptying the -file, the log will start over at the first version (0). +If +.Fl Fl reset +is given, then the given, configured, or default log file will be +truncated and will start at version 1. This forces full propagations to +all slave KDCs. +.Pp +Otherwise the log will be truncated but some entries will be preserved, +as specified by the +.Fl Fl keep-entries +and/or +.Fl Fl max-bytes +options. The largest number of +.Fl Fl keep-entries +entries that are available and fit in the given +.Fl Fl max-bytes +option will be used. The +.Fl Fl keep-entries option defaults to 100, and the +.Fl Fl max-bytes +option defaults to the +.Ar log-max-size +parameter in the configuration. +.Pp .It dump .Bl -tag -width Ds .It Fl c Ar file , Fl Fl config-file= Ns Ar file @@ -108,9 +190,23 @@ .Fl Fl realm= Ns Ar string .Xc realm +.It Xo +.Fl n Ar string , +.Fl Fl no-lock +.Xc +.It Xo +.Fl R Ar string , +.Fl Fl reverse +.Xc .El .Pp -Print out all entries in the log to standard output. +Print out all entries in the given, configured, or default log file to +standard output. If the +.Fl n +option is used then don't lock the iprop log file. If the +.Fl R +option is used, then print the entries in reverse order +(this can be useful when the log is very large). .It replay .Bl -tag -width Ds .It Fl Fl start-version= Ns Ar version-number @@ -125,17 +221,34 @@ realm .El .Pp -Replay the changes from specified entries (or all if none is -specified) in the transaction log to the database. +Replay the changes from specified entries (or all if none is specified) +in the given, configured, or default transaction log file to the +database. .It last-version .Bl -tag -width Ds .It Fl c Ar file , Fl Fl config-file= Ns Ar file configuration file .It Fl r Ar string , Fl Fl realm= Ns Ar string realm +.It Xo +.Fl n Ar string , +.Fl Fl no-lock +.Xc +.El +.Pp +prints the version of the last record in each of the given log files, or +the configured, or the default log file if none is given. +.It signal +.Bl -tag -width Ds +.It Fl c Ar file , Fl Fl config-file= Ns Ar file +configuration file +.It Fl r Ar string , Fl Fl realm= Ns Ar string +realm .El .Pp -prints the version of the last log entry. +Signals the ipropd-master daemon to send updates to slaves. Normally +kadmin does this every time it writes to the database, so this should +rarely be needed. .El .Sh SEE ALSO .Xr iprop 8 diff --git a/crypto/heimdal/lib/kadm5/iprop-log.c b/crypto/heimdal/lib/kadm5/iprop-log.c --- a/crypto/heimdal/lib/kadm5/iprop-log.c +++ b/crypto/heimdal/lib/kadm5/iprop-log.c @@ -46,17 +46,19 @@ kadm5_config_params conf; krb5_error_code ret; void *kadm_handle; + char *file = NULL; char **files; + int aret; if (config_file == NULL) { - char *file; - asprintf(&file, "%s/kdc.conf", hdb_db_dir(context)); - if (file == NULL) + aret = asprintf(&file, "%s/kdc.conf", hdb_db_dir(context)); + if (aret == -1 || file == NULL) errx(1, "out of memory"); config_file = file; } ret = krb5_prepend_config_files_default(config_file, &files); + free(file); if (ret) krb5_err(context, 1, ret, "getting configuration files"); @@ -101,7 +103,7 @@ "nop" }; -static void +static kadm5_ret_t print_entry(kadm5_server_context *server_context, uint32_t ver, time_t timestamp, @@ -111,52 +113,45 @@ void *ctx) { char t[256]; + const char *entry_kind = ctx; int32_t mask; + int32_t nop_time; + uint32_t nop_ver; hdb_entry ent; krb5_principal source; char *name1, *name2; krb5_data data; krb5_context scontext = server_context->context; - - off_t end = krb5_storage_seek(sp, 0, SEEK_CUR) + len; - krb5_error_code ret; + krb5_data_zero(&data); + strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); if((int)op < (int)kadm_get || (int)op > (int)kadm_nop) { printf("unknown op: %d\n", op); - krb5_storage_seek(sp, end, SEEK_SET); - return; + return 0; } - printf ("%s: ver = %u, timestamp = %s, len = %u\n", - op_names[op], ver, t, len); + printf ("%s%s: ver = %u, timestamp = %s, len = %u\n", + entry_kind, op_names[op], ver, t, len); switch(op) { case kadm_delete: - ret = krb5_unparse_name(scontext, source, &name1); - if (ret == 0) - ret = krb5_ret_principal(sp, &source); - if (ret) - krb5_err(scontext, 1, ret, "Failed to read a delete record"); + krb5_ret_principal(sp, &source); + krb5_unparse_name(scontext, source, &name1); printf(" %s\n", name1); free(name1); krb5_free_principal(scontext, source); break; case kadm_rename: ret = krb5_data_alloc(&data, len); - if (ret == 0) - krb5_ret_principal(sp, &source); - if (ret == 0 && krb5_storage_read(sp, data.data, data.length)) - ret = errno; - if (ret == 0) - ret = hdb_value2entry(scontext, &data, &ent); - if (ret == 0) - ret = krb5_unparse_name(scontext, source, &name1); - if (ret == 0) - ret = krb5_unparse_name(scontext, ent.principal, &name2); if (ret) krb5_err (scontext, 1, ret, "kadm_rename: data alloc: %d", len); + krb5_ret_principal(sp, &source); + krb5_storage_read(sp, data.data, data.length); + hdb_value2entry(scontext, &data, &ent); + krb5_unparse_name(scontext, source, &name1); + krb5_unparse_name(scontext, ent.principal, &name2); printf(" %s -> %s\n", name1, name2); free(name1); free(name2); @@ -165,30 +160,26 @@ break; case kadm_create: ret = krb5_data_alloc(&data, len); - if (ret == 0 && krb5_storage_read(sp, data.data, data.length)) - ret = errno; - if (ret == 0) - ret = hdb_value2entry(scontext, &data, &ent); if (ret) krb5_err (scontext, 1, ret, "kadm_create: data alloc: %d", len); + krb5_storage_read(sp, data.data, data.length); + ret = hdb_value2entry(scontext, &data, &ent); + if(ret) + abort(); mask = ~0; goto foo; case kadm_modify: ret = krb5_data_alloc(&data, len); - if (ret == 0) - ret = krb5_ret_int32(sp, &mask); - if (ret == 0 && krb5_storage_read(sp, data.data, data.length)) - ret = errno; - if (ret == 0) - ret = hdb_value2entry(scontext, &data, &ent); if (ret) krb5_err (scontext, 1, ret, "kadm_modify: data alloc: %d", len); + krb5_ret_int32(sp, &mask); + krb5_storage_read(sp, data.data, data.length); + ret = hdb_value2entry(scontext, &data, &ent); + if(ret) + abort(); foo: if(ent.principal /* mask & KADM5_PRINCIPAL */) { - ret = krb5_unparse_name(scontext, ent.principal, &name1); - if (ret) - krb5_err(scontext, 1, ret, - "Failed to process a create or modify record"); + krb5_unparse_name(scontext, ent.principal, &name1); printf(" principal = %s\n", name1); free(name1); } @@ -270,11 +261,29 @@ free_hdb_entry(&ent); break; case kadm_nop : + if (len == 16) { + uint64_t off; + krb5_ret_uint64(sp, &off); + printf("uberblock offset %llu ", (unsigned long long)off); + } else { + printf("nop"); + } + if (len == 16 || len == 8) { + krb5_ret_int32(sp, &nop_time); + krb5_ret_uint32(sp, &nop_ver); + + timestamp = nop_time; + strftime(t, sizeof(t), "%Y-%m-%d %H:%M:%S", localtime(×tamp)); + printf("timestamp %s version %u", t, nop_ver); + } + printf("\n"); break; default: - krb5_errx(scontext, 1, "Unknown record type"); + abort(); } - krb5_storage_seek(sp, end, SEEK_SET); + krb5_data_free(&data); + + return 0; } int @@ -282,21 +291,61 @@ { kadm5_server_context *server_context; krb5_error_code ret; + enum kadm_iter_opts iter_opts_1st = 0; + enum kadm_iter_opts iter_opts_2nd = 0; + char *desc_1st = ""; + char *desc_2nd = ""; server_context = get_kadmin_context(opt->config_file_string, opt->realm_string); - ret = kadm5_log_init (server_context); + if (argc > 0) { + free(server_context->log_context.log_file); + server_context->log_context.log_file = strdup(argv[0]); + if (server_context->log_context.log_file == NULL) + krb5_err(context, 1, errno, "strdup"); + } + + if (opt->reverse_flag) { + iter_opts_1st = kadm_backward | kadm_unconfirmed; + iter_opts_2nd = kadm_backward | kadm_confirmed; + desc_1st = "unconfirmed "; + } else { + iter_opts_1st = kadm_forward | kadm_confirmed; + iter_opts_2nd = kadm_forward | kadm_unconfirmed; + desc_2nd = "unconfirmed"; + } + + if (opt->no_lock_flag) { + ret = kadm5_log_init_sharedlock(server_context, LOCK_NB); + if (ret == EAGAIN || ret == EWOULDBLOCK) { + warnx("Not locking the iprop log"); + ret = kadm5_log_init_nolock(server_context); + if (ret) + krb5_err(context, 1, ret, "kadm5_log_init_nolock"); + } + } else { + warnx("If this command appears to block, try the --no-lock option"); + ret = kadm5_log_init_sharedlock(server_context, 0); + if (ret) + krb5_err(context, 1, ret, "kadm5_log_init_sharedlock"); + } + + ret = kadm5_log_foreach(server_context, iter_opts_1st, + NULL, print_entry, desc_1st); if (ret) - krb5_err (context, 1, ret, "kadm5_log_init"); + krb5_warn(context, ret, "kadm5_log_foreach"); - ret = kadm5_log_foreach (server_context, print_entry, NULL); - if(ret) + ret = kadm5_log_foreach(server_context, iter_opts_2nd, + NULL, print_entry, desc_2nd); + if (ret) krb5_warn(context, ret, "kadm5_log_foreach"); ret = kadm5_log_end (server_context); if (ret) krb5_warn(context, ret, "kadm5_log_end"); + + kadm5_destroy(server_context); return 0; } @@ -309,10 +358,41 @@ server_context = get_kadmin_context(opt->config_file_string, opt->realm_string); - ret = kadm5_log_truncate (server_context); + if (argc > 0) { + free(server_context->log_context.log_file); + server_context->log_context.log_file = strdup(argv[0]); + if (server_context->log_context.log_file == NULL) + krb5_err(context, 1, errno, "strdup"); + } + + if (opt->keep_entries_integer < 0 && + opt->max_bytes_integer < 0) { + opt->keep_entries_integer = 100; + opt->max_bytes_integer = 0; + } + if (opt->keep_entries_integer < 0) + opt->keep_entries_integer = 0; + if (opt->max_bytes_integer < 0) + opt->max_bytes_integer = 0; + + if (opt->reset_flag) { + /* First recover unconfirmed records */ + ret = kadm5_log_init(server_context); + if (ret == 0) + ret = kadm5_log_reinit(server_context, 0); + } else { + ret = kadm5_log_init(server_context); + if (ret) + krb5_err(context, 1, ret, "kadm5_log_init"); + ret = kadm5_log_truncate(server_context, opt->keep_entries_integer, + opt->max_bytes_integer); + } if (ret) - krb5_err (context, 1, ret, "kadm5_log_truncate"); + krb5_err(context, 1, ret, "kadm5_log_truncate"); + + kadm5_log_signal_master(server_context); + kadm5_destroy(server_context); return 0; } @@ -320,26 +400,71 @@ last_version(struct last_version_options *opt, int argc, char **argv) { kadm5_server_context *server_context; + char *alt_argv[2] = { NULL, NULL }; krb5_error_code ret; uint32_t version; + size_t i; server_context = get_kadmin_context(opt->config_file_string, opt->realm_string); - ret = kadm5_log_init (server_context); - if (ret) - krb5_err (context, 1, ret, "kadm5_log_init"); + if (argc == 0) { + alt_argv[0] = strdup(server_context->log_context.log_file); + if (alt_argv[0] == NULL) + krb5_err(context, 1, errno, "strdup"); + argv = alt_argv; + argc = 1; + } - ret = kadm5_log_get_version (server_context, &version); - if (ret) - krb5_err (context, 1, ret, "kadm5_log_get_version"); + for (i = 0; i < argc; i++) { + free(server_context->log_context.log_file); + server_context->log_context.log_file = strdup(argv[i]); + if (server_context->log_context.log_file == NULL) + krb5_err(context, 1, errno, "strdup"); + + if (opt->no_lock_flag) { + ret = kadm5_log_init_sharedlock(server_context, LOCK_NB); + if (ret == EAGAIN || ret == EWOULDBLOCK) { + warnx("Not locking the iprop log"); + ret = kadm5_log_init_nolock(server_context); + if (ret) + krb5_err(context, 1, ret, "kadm5_log_init_nolock"); + } + } else { + warnx("If this command appears to block, try the " + "--no-lock option"); + ret = kadm5_log_init_sharedlock(server_context, 0); + if (ret) + krb5_err(context, 1, ret, "kadm5_log_init_sharedlock"); + } + + ret = kadm5_log_get_version (server_context, &version); + if (ret) + krb5_err (context, 1, ret, "kadm5_log_get_version"); + + ret = kadm5_log_end (server_context); + if (ret) + krb5_warn(context, ret, "kadm5_log_end"); + + printf("version: %lu\n", (unsigned long)version); + } - ret = kadm5_log_end (server_context); - if (ret) - krb5_warn(context, ret, "kadm5_log_end"); + kadm5_destroy(server_context); + free(alt_argv[0]); + return 0; +} - printf("version: %lu\n", (unsigned long)version); +int +signal_master(struct signal_options *opt, int argc, char **argv) +{ + kadm5_server_context *server_context; + + server_context = get_kadmin_context(opt->config_file_string, + opt->realm_string); + kadm5_log_signal_master(server_context); + + kadm5_destroy(server_context); return 0; } @@ -350,7 +475,7 @@ int start_version = -1; int end_version = -1; -static void +static kadm5_ret_t apply_entry(kadm5_server_context *server_context, uint32_t ver, time_t timestamp, @@ -365,18 +490,18 @@ if((opt->start_version_integer != -1 && ver < (uint32_t)opt->start_version_integer) || (opt->end_version_integer != -1 && ver > (uint32_t)opt->end_version_integer)) { /* XXX skip this entry */ - krb5_storage_seek(sp, len, SEEK_CUR); - return; + return 0; } printf ("ver %u... ", ver); fflush (stdout); - ret = kadm5_log_replay (server_context, - op, ver, len, sp); + ret = kadm5_log_replay(server_context, op, ver, len, sp); if (ret) krb5_warn (server_context->context, ret, "kadm5_log_replay"); printf ("done\n"); + + return 0; } int @@ -388,6 +513,13 @@ server_context = get_kadmin_context(opt->config_file_string, opt->realm_string); + if (argc > 0) { + free(server_context->log_context.log_file); + server_context->log_context.log_file = strdup(argv[0]); + if (server_context->log_context.log_file == NULL) + krb5_err(context, 1, errno, "strdup"); + } + ret = server_context->db->hdb_open(context, server_context->db, O_RDWR | O_CREAT, 0600); @@ -398,7 +530,9 @@ if (ret) krb5_err (context, 1, ret, "kadm5_log_init"); - ret = kadm5_log_foreach (server_context, apply_entry, opt); + ret = kadm5_log_foreach(server_context, + kadm_forward | kadm_confirmed | kadm_unconfirmed, + NULL, apply_entry, opt); if(ret) krb5_warn(context, ret, "kadm5_log_foreach"); ret = kadm5_log_end (server_context); @@ -408,6 +542,7 @@ if (ret) krb5_err (context, 1, ret, "db->close"); + kadm5_destroy(server_context); return 0; } diff --git a/crypto/heimdal/lib/kadm5/iprop-log.cat8 b/crypto/heimdal/lib/kadm5/iprop-log.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/iprop-log.cat8 @@ -0,0 +1,128 @@ +IPROP-LOG(8) BSD System Manager's Manual IPROP-LOG(8) + +NAME + iprop-log -- examine and maintain the iprop log file + +SYNOPSIS + iprop-log [--version] [-h | --help] command + + iprop-log truncate [-c file | --config-file=file] [-r string | + --realm=string] [-K integer | --keep-entries=integer] [-B + integer | --max-bytes=integer] [-R | --reset] [-h | --help] + [log-file] + + iprop-log dump [-c file | --config-file=file] [-r string | + --realm=string] [-n | --no-lock] [-R | --reverse] [-h | --help] + [log-file] + + iprop-log replay [--start-version=version-number] + [--end-version=version-number] [-c file | --config-file=file] + [-r string | --realm=string] [-h | --help] [log-file] + + iprop-log last-version [-c file | --config-file=file] [-r string | + --realm=string] [-n | --no-lock] [-h | --help] [log-files] + + iprop-log signal [-c file | --config-file=file] [-r string | + --realm=string] [-h | --help] + +DESCRIPTION + Supported options: + + --version + + -h, --help + + command can be one of the following: + + truncate + + -c file, --config-file=file + configuration file + + -r string, --realm=string + realm + + -K integer, --keep-entries=integer + + -B integer, --max-bytes=integer + + -R, --reset + + If --reset is given, then the given, configured, or default log + file will be truncated and will start at version 1. This + forces full propagations to all slave KDCs. + + Otherwise the log will be truncated but some entries will be + preserved, as specified by the --keep-entries and/or + --max-bytes options. The largest number of --keep-entries en- + tries that are available and fit in the given --max-bytes op- + tion will be used. The --keep-entries -option -defaults -to + -100, -and -the --max-bytes option defaults to the log-max-size + parameter in the configuration. + + dump + + -c file, --config-file=file + configuration file + + -r string, --realm=string + realm + + -n string, --no-lock + + -R string, --reverse + + Print out all entries in the given, configured, or default log + file to standard output. If the -n option is used then don't + lock the iprop log file. If the -R option is used, then print + the entries in reverse order (this can be useful when the log + is very large). + + replay + + --start-version=version-number + start replay with this version + + --end-version=version-number + end replay with this version + + -c file, --config-file=file + configuration file + + -r string, --realm=string + realm + + Replay the changes from specified entries (or all if none is + specified) in the given, configured, or default transaction log + file to the database. + + last-version + + -c file, --config-file=file + configuration file + + -r string, --realm=string + realm + + -n string, --no-lock + + prints the version of the last record in each of the given log + files, or the configured, or the default log file if none is + given. + + signal + + -c file, --config-file=file + configuration file + + -r string, --realm=string + realm + + Signals the ipropd-master daemon to send updates to slaves. + Normally kadmin does this every time it writes to the database, + so this should rarely be needed. + +SEE ALSO + iprop(8) + +BSD February 18, 2007 BSD diff --git a/crypto/heimdal/lib/kadm5/iprop.h b/crypto/heimdal/lib/kadm5/iprop.h --- a/crypto/heimdal/lib/kadm5/iprop.h +++ b/crypto/heimdal/lib/kadm5/iprop.h @@ -61,10 +61,20 @@ ONE_PRINC = 4, NOW_YOU_HAVE = 5, ARE_YOU_THERE = 6, - I_AM_HERE = 7 + I_AM_HERE = 7, + YOU_HAVE_LAST_VERSION = 8 }; extern sig_atomic_t exit_flag; void setup_signal(void); +enum ipropd_exit_code { + IPROPD_DONE = 0, + IPROPD_RESTART = 1, + IPROPD_RESTART_SLOW = 2, + IPROPD_FATAL = 3, +}; + +int restarter(krb5_context, size_t *); + #endif /* __IPROP_H__ */ diff --git a/crypto/heimdal/lib/kadm5/iprop.8 b/crypto/heimdal/lib/kadm5/iprop.8 --- a/crypto/heimdal/lib/kadm5/iprop.8 +++ b/crypto/heimdal/lib/kadm5/iprop.8 @@ -33,12 +33,12 @@ .\" .Dd May 24, 2005 .Dt IPROP 8 -.Os Heimdal +.Os .Sh NAME .Nm iprop , .Nm ipropd-master , .Nm ipropd-slave -.Nd propagate changes to a Heimdal Kerberos master KDC to slave KDCs +.Nd propagate transactions from a Heimdal Kerberos master KDC to slave KDCs .Sh SYNOPSIS .Nm ipropd-master .Oo Fl c Ar string \*(Ba Xo @@ -110,13 +110,18 @@ .Nm normally sends only the changes as they happen on the master. The master keeps track of all the changes by assigning a version -number to every change to the database. +number to every transaction to the database. The slaves know which was the latest version they saw, and in this way it can be determined if they are in sync or not. -A log of all the changes is kept on the master. +A log of all the transactions is kept on the master. When a slave is at an older version than the oldest one in the log, the whole database has to be sent. .Pp +The log of transactions is also used to implement a two-phase commit +(with roll-forward for recovery) method of updating the HDB. +Transactions are first recorded in the log, then in the HDB, then +the log is updated to mark the transaction as committed. +.Pp The changes are propagated over a secure channel (on port 2121 by default). This should normally be defined as @@ -175,6 +180,11 @@ .Pa slaves , .Pa slave-stats in the database directory. +.Pa ipropd-master.pid , +.Pa ipropd-slave.pid +in the database directory, or in the directory named by the +.Ev HEIM_PIDFILE_DIR +environment variable. .Sh SEE ALSO .Xr krb5.conf 5 , .Xr hprop 8 , diff --git a/crypto/heimdal/lib/kadm5/iprop.cat8 b/crypto/heimdal/lib/kadm5/iprop.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/iprop.cat8 @@ -0,0 +1,112 @@ +IPROP(8) BSD System Manager's Manual IPROP(8) + +NAME + iprop, ipropd-master, ipropd-slave -- propagate transactions from a Heim- + dal Kerberos master KDC to slave KDCs + +SYNOPSIS + ipropd-master [-c string | --config-file=string] [-r string | + --realm=string] [-k kspec | --keytab=kspec] [-d file | + --database=file] [--slave-stats-file=file] + [--time-missing=time] [--time-gone=time] [--detach] + [--version] [--help] + ipropd-slave [-c string | --config-file=string] [-r string | + --realm=string] [-k kspec | --keytab=kspec] + [--time-lost=time] [--detach] [--version] [--help] master + +DESCRIPTION + ipropd-master is used to propagate changes to a Heimdal Kerberos database + from the master Kerberos server on which it runs to slave Kerberos + servers running ipropd-slave. + + The slaves are specified by the contents of the slaves file in the KDC's + database directory, e.g. /var/heimdal/slaves. This has principals one + per-line of the form + iprop/slave@REALM + where slave is the hostname of the slave server in the given REALM, e.g. + iprop/kerberos-1.example.com@EXAMPLE.COM + On a slave, the argument master specifies the hostname of the master + server from which to receive updates. + + In contrast to hprop(8), which sends the whole database to the slaves + regularly, iprop normally sends only the changes as they happen on the + master. The master keeps track of all the changes by assigning a version + number to every transaction to the database. The slaves know which was + the latest version they saw, and in this way it can be determined if they + are in sync or not. A log of all the transactions is kept on the master. + When a slave is at an older version than the oldest one in the log, the + whole database has to be sent. + + The log of transactions is also used to implement a two-phase commit + (with roll-forward for recovery) method of updating the HDB. Transac- + tions are first recorded in the log, then in the HDB, then the log is up- + dated to mark the transaction as committed. + + The changes are propagated over a secure channel (on port 2121 by de- + fault). This should normally be defined as "iprop/tcp" in /etc/services + or another source of the services database. The master and slaves must + each have access to a keytab with keys for the iprop service principal on + the local host. + + There is a keep-alive feature logged in the master's slave-stats file + (e.g. /var/heimdal/slave-stats). + + Supported options for ipropd-master: + + -c string, --config-file=string + + -r string, --realm=string + + -k kspec, --keytab=kspec + keytab to get authentication from + + -d file, --database=file + Database (default per KDC) + + --slave-stats-file=file + file for slave status information + + --time-missing=time + time before slave is polled for presence (default 2 min) + + --time-gone=time + time of inactivity after which a slave is considered gone (de- + fault 5 min) + + --detach + detach from console + + --version + + --help + + Supported options for ipropd-slave: + + -c string, --config-file=string + + -r string, --realm=string + + -k kspec, --keytab=kspec + keytab to get authentication from + + --time-lost=time + time before server is considered lost (default 5 min) + + --detach + detach from console + + --version + + --help + Time arguments for the relevant options above may be specified in forms + like 5 min, 300 s, or simply a number of seconds. + +FILES + slaves, slave-stats in the database directory. ipropd-master.pid, + ipropd-slave.pid in the database directory, or in the directory named by + the HEIM_PIDFILE_DIR environment variable. + +SEE ALSO + krb5.conf(5), hprop(8), hpropd(8), iprop-log(8), kdc(8). + +BSD May 24, 2005 BSD diff --git a/crypto/heimdal/lib/kadm5/ipropd-master-version.rc b/crypto/heimdal/lib/kadm5/ipropd-master-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/ipropd-master-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "IProp Master" +#define RC_FILE_ORIG_0409 "ipropd-master.exe" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/kadm5/ipropd-slave-version.rc b/crypto/heimdal/lib/kadm5/ipropd-slave-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/ipropd-slave-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "IProp Slave" +#define RC_FILE_ORIG_0409 "ipropd-slave.exe" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/kadm5/ipropd_common.c b/crypto/heimdal/lib/kadm5/ipropd_common.c --- a/crypto/heimdal/lib/kadm5/ipropd_common.c +++ b/crypto/heimdal/lib/kadm5/ipropd_common.c @@ -32,7 +32,11 @@ */ #include "iprop.h" -RCSID("$Id$"); + +#if defined(HAVE_FORK) && defined(HAVE_WAITPID) +#include +#include +#endif sig_atomic_t exit_flag; @@ -71,3 +75,191 @@ #endif #endif } + +/* + * Fork a child to run the service, and restart it if it dies. + * + * Returns -1 if not supported, else a file descriptor that the service + * should select() for. Any events on that file descriptor should cause + * the caller to exit immediately, as that means that the restarter + * exited. + * + * The service's normal exit status values should be should be taken + * from enum ipropd_exit_code. IPROPD_FATAL causes the restarter to + * stop restarting the service and to exit. + * + * A count of restarts is output via the `countp' argument, if it is + * non-NULL. This is useful for testing this function (e.g., kill the + * restarter after N restarts and check that the child gets the signal + * sent to it). + * + * This requires fork() and waitpid() (otherwise returns -1). Ignoring + * SIGCHLD, of course, would be bad. + * + * We could support this on Windows by spawning a child with mostly the + * same arguments as the restarter process. + */ +int +restarter(krb5_context context, size_t *countp) +{ +#if defined(HAVE_FORK) && defined(HAVE_WAITPID) + struct timeval tmout; + pid_t pid = -1; + pid_t wpid = -1; + int status; + int fds[2]; + int fds2[2]; + size_t count = 0; + fd_set readset; + + fds[0] = -1; + fds[1] = -1; + fds2[0] = -1; + fds2[1] = -1; + + signal(SIGCHLD, SIG_DFL); + + while (!exit_flag) { + /* Close the pipe ends we keep open */ + if (fds[1] != -1) + (void) close(fds[1]); + if (fds2[0] != -1) + (void) close(fds2[1]); + + /* A pipe so the child can detect the parent's death */ + if (pipe(fds) == -1) { + krb5_err(context, 1, errno, + "Could not setup pipes in service restarter"); + } + + /* A pipe so the parent can detect the child's death */ + if (pipe(fds2) == -1) { + krb5_err(context, 1, errno, + "Could not setup pipes in service restarter"); + } + + fflush(stdout); + fflush(stderr); + + pid = fork(); + if (pid == -1) + krb5_err(context, 1, errno, "Could not fork in service restarter"); + if (pid == 0) { + if (countp != NULL) + *countp = count; + (void) close(fds[1]); + (void) close(fds2[0]); + return fds[0]; + } + + count++; + + (void) close(fds[0]); + (void) close(fds2[1]); + + do { + wpid = waitpid(pid, &status, 0); + } while (wpid == -1 && errno == EINTR && !exit_flag); + if (wpid == -1 && errno == EINTR) + break; /* We were signaled; gotta kill the child and exit */ + if (wpid == -1) { + if (errno != ECHILD) { + warn("waitpid() failed; killing restarter's child process"); + kill(pid, SIGTERM); + } + krb5_err(context, 1, errno, "restarter failed waiting for child"); + } + + assert(wpid == pid); + wpid = -1; + pid = -1; + if (WIFEXITED(status)) { + switch (WEXITSTATUS(status)) { + case IPROPD_DONE: + exit(0); + case IPROPD_RESTART_SLOW: + if (exit_flag) + exit(1); + krb5_warnx(context, "Waiting 2 minutes to restart"); + sleep(120); + continue; + case IPROPD_FATAL: + krb5_errx(context, WEXITSTATUS(status), + "Sockets and pipes not supported for " + "iprop log files"); + case IPROPD_RESTART: + default: + if (exit_flag) + exit(1); + /* Add exponential backoff (with max backoff)? */ + krb5_warnx(context, "Waiting 30 seconds to restart"); + sleep(30); + continue; + } + } + /* else */ + krb5_warnx(context, "Child was killed; waiting 30 seconds to restart"); + sleep(30); + } + + if (pid == -1) + exit(0); /* No dead child to reap; done */ + + assert(pid > 0); + if (wpid != pid) { + warnx("Interrupted; killing child (pid %ld) with %d", + (long)pid, exit_flag); + krb5_warnx(context, "Interrupted; killing child (pid %ld) with %d", + (long)pid, exit_flag); + kill(pid, exit_flag); + + /* Wait up to one second for the child */ + tmout.tv_sec = 1; + tmout.tv_usec = 0; + FD_ZERO(&readset); + FD_SET(fds2[0], &readset); + /* We don't care why select() returns */ + (void) select(fds2[0] + 1, &readset, NULL, NULL, &tmout); + /* + * We haven't reaped the child yet; if it's a zombie, then + * SIGKILLing it won't hurt. If it's not a zombie yet, well, + * we're out of patience. + */ + kill(pid, SIGKILL); + do { + wpid = waitpid(pid, &status, 0); + } while (wpid != pid && errno == EINTR); + if (wpid == -1) + krb5_err(context, 1, errno, "restarter failed waiting for child"); + } + + /* Finally, the child is dead and reaped */ + if (WIFEXITED(status)) + exit(WEXITSTATUS(status)); + if (WIFSIGNALED(status)) { + switch (WTERMSIG(status)) { + case SIGTERM: + case SIGXCPU: + case SIGINT: + exit(0); + default: + /* + * Attempt to set the same exit status for the parent as for + * the child. + */ + kill(getpid(), WTERMSIG(status)); + /* + * We can get past the self-kill if we inherited a SIG_IGN + * disposition that the child reset to SIG_DFL. + */ + } + } + exit(1); +#else + if (countp != NULL) + *countp = 0; + errno = ENOTSUP; + return -1; +#endif +} + diff --git a/crypto/heimdal/lib/kadm5/ipropd_master.c b/crypto/heimdal/lib/kadm5/ipropd_master.c --- a/crypto/heimdal/lib/kadm5/ipropd_master.c +++ b/crypto/heimdal/lib/kadm5/ipropd_master.c @@ -36,6 +36,8 @@ static krb5_log_facility *log_facility; +static int verbose; + const char *slave_stats_file; const char *slave_time_missing = "2 min"; const char *slave_time_gone = "5 min"; @@ -119,63 +121,53 @@ return fd; } -static krb5_socket_t -make_listen6_socket (krb5_context context, const char *port_str) -{ - krb5_socket_t fd; - int one = 1; - struct sockaddr_in6 addr; - - fd = socket (AF_INET6, SOCK_STREAM, 0); - if (rk_IS_BAD_SOCKET(fd)) - krb5_err (context, 1, rk_SOCK_ERRNO, "socket AF_INET6"); - setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(one)); - memset (&addr, 0, sizeof(addr)); - addr.sin6_family = AF_INET6; - - if (port_str) { - addr.sin6_port = krb5_getportbyname (context, - port_str, "tcp", - 0); - if (addr.sin6_port == 0) { - char *ptr; - long port; - - port = strtol (port_str, &ptr, 10); - if (port == 0 && ptr == port_str) - krb5_errx (context, 1, "bad port `%s'", port_str); - addr.sin6_port = htons(port); - } - } else { - addr.sin6_port = krb5_getportbyname (context, IPROP_SERVICE, - "tcp", IPROP_PORT); - } - if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) - krb5_err (context, 1, errno, "bind6"); - if (listen(fd, SOMAXCONN) < 0) - krb5_err (context, 1, errno, "listen6"); - return fd; -} - -#ifndef _SOCKADDR_UNION -#define _SOCKADDR_UNION -union sockaddr_union { - struct sockaddr sa; - struct sockaddr_in sin; - struct sockaddr_in6 sin6; -}; -#endif /* _SOCKADDR_UNION */ struct slave { krb5_socket_t fd; - union sockaddr_union addr; + struct sockaddr_in addr; char *name; krb5_auth_context ac; uint32_t version; + uint32_t version_tstamp; + uint32_t version_ack; time_t seen; unsigned long flags; #define SLAVE_F_DEAD 0x1 #define SLAVE_F_AYT 0x2 +#define SLAVE_F_READY 0x4 + /* + * We'll use non-blocking I/O so no slave can hold us back. + * + * We call the state left over from a partial write a "tail". + * + * The krb5_data holding an KRB-PRIV will be the write buffer. + */ + struct { + /* Every message we send is a KRB-PRIV with a 4-byte length prefixed */ + uint8_t header_buf[4]; + krb5_data header; + krb5_data packet; + size_t packet_off; + /* For send_complete() we need an sp as part of the tail */ + krb5_storage *dump; + uint32_t vno; + } tail; + struct { + uint8_t header_buf[4]; + krb5_data packet; + size_t offset; + int hlen; + } input; + /* + * Continuation for fair diff sending we send N entries at a time. + */ + struct { + off_t off_next_version; /* offset in log of next diff */ + uint32_t initial_version; /* at time of previous diff */ + uint32_t initial_tstamp; /* at time of previous diff */ + uint32_t last_version_sent; + int more; /* need to send more diffs */ + } next_diff; struct slave *next; }; @@ -264,6 +256,11 @@ if (s->ac) krb5_auth_con_free (context, s->ac); + /* Free any pending input/output state */ + krb5_data_free(&s->input.packet); + krb5_data_free(&s->tail.packet); + krb5_storage_free(s->tail.dump); + for (p = root; *p; p = &(*p)->next) if (*p == s) { *p = s->next; @@ -283,20 +280,25 @@ krb5_ticket *ticket = NULL; char hostname[128]; - s = malloc(sizeof(*s)); + s = calloc(1, sizeof(*s)); if (s == NULL) { krb5_warnx (context, "add_slave: no memory"); return; } s->name = NULL; s->ac = NULL; + s->input.packet.data = NULL; + s->tail.header.data = NULL; + s->tail.packet.data = NULL; + s->tail.dump = NULL; - addr_len = sizeof(s->addr.sin6); - s->fd = accept (fd, (struct sockaddr *)&s->addr.sa, &addr_len); + addr_len = sizeof(s->addr); + s->fd = accept (fd, (struct sockaddr *)&s->addr, &addr_len); if (rk_IS_BAD_SOCKET(s->fd)) { krb5_warn (context, rk_SOCK_ERRNO, "accept"); goto error; } + if (master_hostname) strlcpy(hostname, master_hostname, sizeof(hostname)); else @@ -311,6 +313,35 @@ ret = krb5_recvauth (context, &s->ac, &s->fd, IPROP_VERSION, server, 0, keytab, &ticket); + + /* + * We'll be doing non-blocking I/O only after authentication. We don't + * want to get stuck talking to any one slave. + * + * If we get a partial write, we'll finish writing when the socket becomes + * writable. + * + * Partial reads will be treated as EOF, causing the slave to be marked + * dead. + * + * To do non-blocking I/O for authentication we'll have to implement our + * own krb5_recvauth(). + */ + socket_set_nonblocking(s->fd, 1); + + /* + * We write message lengths separately from the payload, and may do + * back-to-back small writes when flushing pending input and then a new + * update. Avoid Nagle delays. + */ +#if defined(IPPROTO_TCP) && defined(TCP_NODELAY) + { + int nodelay = 1; + (void) setsockopt(s->fd, IPPROTO_TCP, TCP_NODELAY, + (void *)&nodelay, sizeof(nodelay)); + } +#endif + krb5_free_principal (context, server); if (ret) { krb5_warn (context, ret, "krb5_recvauth"); @@ -348,6 +379,7 @@ krb5_warnx (context, "connection from %s", s->name); s->version = 0; + s->version_ack = 0; s->flags = 0; slave_seen(s); s->next = *root; @@ -357,44 +389,40 @@ remove_slave(context, s, root); } -struct prop_context { - krb5_auth_context auth_context; - krb5_socket_t fd; -}; - static int -prop_one (krb5_context context, HDB *db, hdb_entry_ex *entry, void *v) +dump_one (krb5_context context, HDB *db, hdb_entry_ex *entry, void *v) { krb5_error_code ret; + krb5_storage *dump = (krb5_storage *)v; krb5_storage *sp; krb5_data data; - struct slave *s = (struct slave *)v; ret = hdb_entry2value (context, &entry->entry, &data); if (ret) return ret; ret = krb5_data_realloc (&data, data.length + 4); - if (ret) { - krb5_data_free (&data); - return ret; - } + if (ret) + goto done; memmove ((char *)data.data + 4, data.data, data.length - 4); sp = krb5_storage_from_data(&data); if (sp == NULL) { - krb5_data_free (&data); - return ENOMEM; + ret = ENOMEM; + goto done; } - krb5_store_int32(sp, ONE_PRINC); + ret = krb5_store_uint32(sp, ONE_PRINC); krb5_storage_free(sp); - ret = krb5_write_priv_message (context, s->ac, &s->fd, &data); + if (ret == 0) + ret = krb5_store_data(dump, data); + +done: krb5_data_free (&data); return ret; } static int -send_complete (krb5_context context, slave *s, - const char *database, uint32_t current_version) +write_dump (krb5_context context, krb5_storage *dump, + const char *database, uint32_t current_version) { krb5_error_code ret; krb5_storage *sp; @@ -402,34 +430,52 @@ krb5_data data; char buf[8]; + /* we assume that the caller has obtained an exclusive lock */ + + ret = krb5_storage_truncate(dump, 0); + if (ret) + return ret; + + if (krb5_storage_seek(dump, 0, SEEK_SET) != 0) + return errno; + + /* + * First we store zero as the HDB version, this will indicate to a + * later reader that the dumpfile is invalid. We later write the + * correct version in the file after we have written all of the + * messages. A dump with a zero version will not be considered + * to be valid. + */ + + ret = krb5_store_uint32(dump, 0); + if (ret) + return ret; + ret = hdb_create (context, &db, database); if (ret) - krb5_err (context, 1, ret, "hdb_create: %s", database); + krb5_err (context, IPROPD_RESTART, ret, "hdb_create: %s", database); ret = db->hdb_open (context, db, O_RDONLY, 0); if (ret) - krb5_err (context, 1, ret, "db->open"); + krb5_err (context, IPROPD_RESTART, ret, "db->open"); sp = krb5_storage_from_mem (buf, 4); if (sp == NULL) - krb5_errx (context, 1, "krb5_storage_from_mem"); - krb5_store_int32 (sp, TELL_YOU_EVERYTHING); + krb5_errx (context, IPROPD_RESTART, "krb5_storage_from_mem"); + krb5_store_uint32 (sp, TELL_YOU_EVERYTHING); krb5_storage_free (sp); data.data = buf; data.length = 4; - ret = krb5_write_priv_message(context, s->ac, &s->fd, &data); - + ret = krb5_store_data(dump, data); if (ret) { - krb5_warn (context, ret, "krb5_write_priv_message"); - slave_dead(context, s); + krb5_warn (context, ret, "write_dump"); return ret; } - ret = hdb_foreach (context, db, HDB_F_ADMIN_DATA, prop_one, s); + ret = hdb_foreach (context, db, HDB_F_ADMIN_DATA, dump_one, dump); if (ret) { - krb5_warn (context, ret, "hdb_foreach"); - slave_dead(context, s); + krb5_warn (context, ret, "write_dump: hdb_foreach"); return ret; } @@ -438,27 +484,333 @@ sp = krb5_storage_from_mem (buf, 8); if (sp == NULL) - krb5_errx (context, 1, "krb5_storage_from_mem"); - krb5_store_int32 (sp, NOW_YOU_HAVE); - krb5_store_int32 (sp, current_version); + krb5_errx (context, IPROPD_RESTART, "krb5_storage_from_mem"); + ret = krb5_store_uint32(sp, NOW_YOU_HAVE); + if (ret == 0) + krb5_store_uint32(sp, current_version); krb5_storage_free (sp); data.length = 8; - s->version = current_version; + if (ret == 0) + ret = krb5_store_data(dump, data); - ret = krb5_write_priv_message(context, s->ac, &s->fd, &data); - if (ret) { - slave_dead(context, s); - krb5_warn (context, ret, "krb5_write_priv_message"); - return ret; - } + /* + * We must ensure that the entire valid dump is written to disk + * before we write the current version at the front thus making + * it a valid dump file. If we crash around here, this can be + * important upon reboot. + */ - slave_seen(s); + if (ret == 0) + ret = krb5_storage_fsync(dump); + + if (ret == 0 && krb5_storage_seek(dump, 0, SEEK_SET) == -1) + ret = errno; + + /* Write current version at the front making the dump valid */ + + if (ret == 0) + ret = krb5_store_uint32(dump, current_version); + + /* + * We don't need to fsync(2) after the real version is written as + * it is not a disaster if it doesn't make it to disk if we crash. + * After all, we'll just create a new dumpfile. + */ + + if (ret == 0) + krb5_warnx(context, "wrote new dumpfile (version %u)", + current_version); + else + krb5_warn(context, ret, "failed to write new dumpfile (version %u)", + current_version); + + return ret; +} + +static int +mk_priv_tail(krb5_context context, slave *s, krb5_data *data) +{ + uint32_t len; + int ret; + ret = krb5_mk_priv(context, s->ac, data, &s->tail.packet, NULL); + if (ret) + return ret; + + len = s->tail.packet.length; + _krb5_put_int(s->tail.header_buf, len, sizeof(s->tail.header_buf)); + s->tail.header.length = sizeof(s->tail.header_buf); + s->tail.header.data = s->tail.header_buf; return 0; } +static int +have_tail(slave *s) +{ + return s->tail.header.length || s->tail.packet.length || s->tail.dump; +} + +static int +more_diffs(slave *s) +{ + return s->next_diff.more; +} + +#define SEND_COMPLETE_MAX_RECORDS 50 +#define SEND_DIFFS_MAX_RECORDS 50 + +static int +send_tail(krb5_context context, slave *s) +{ + krb5_data data; + ssize_t bytes = 0; + size_t rem = 0; + size_t n; + int ret; + + if (! have_tail(s)) + return 0; + + /* + * For the case where we're continuing a send_complete() send up to + * SEND_COMPLETE_MAX_RECORDS records now, and the rest asynchronously + * later. This ensures that sending a complete dump to a slow-to-drain + * client does not prevent others from getting serviced. + */ + for (n = 0; n < SEND_COMPLETE_MAX_RECORDS; n++) { + if (! have_tail(s)) + return 0; + + if (s->tail.header.length) { + bytes = krb5_net_write(context, &s->fd, + s->tail.header.data, + s->tail.header.length); + if (bytes < 0) + goto err; + + s->tail.header.length -= bytes; + s->tail.header.data = (char *)s->tail.header.data + bytes; + rem = s->tail.header.length; + if (rem) + goto ewouldblock; + } + + if (s->tail.packet.length) { + bytes = krb5_net_write(context, &s->fd, + (char *)s->tail.packet.data + s->tail.packet_off, + s->tail.packet.length - s->tail.packet_off); + if (bytes < 0) + goto err; + s->tail.packet_off += bytes; + if (bytes) + slave_seen(s); + rem = s->tail.packet.length - s->tail.packet_off; + if (rem) + goto ewouldblock; + + krb5_data_free(&s->tail.packet); + s->tail.packet_off = 0; + } + + if (s->tail.dump == NULL) + return 0; + + /* + * We're in the middle of a send_complete() that was interrupted by + * EWOULDBLOCK. Continue the sending of the dump. + */ + ret = krb5_ret_data(s->tail.dump, &data); + if (ret == HEIM_ERR_EOF) { + krb5_storage_free(s->tail.dump); + s->tail.dump = NULL; + s->version = s->tail.vno; + return 0; + } + + if (ret) { + krb5_warn(context, ret, "failed to read entry from dump!"); + } else { + ret = mk_priv_tail(context, s, &data); + krb5_data_free(&data); + if (ret == 0) + continue; + krb5_warn(context, ret, "failed to make and send a KRB-PRIV to %s", + s->name); + } + + slave_dead(context, s); + return ret; + } + + if (ret == 0 && s->tail.dump != NULL) + return EWOULDBLOCK; + +err: + if (errno != EAGAIN && errno != EWOULDBLOCK) { + krb5_warn(context, ret = errno, + "error sending diffs to now-dead slave %s", s->name); + slave_dead(context, s); + return ret; + } + +ewouldblock: + if (verbose) + krb5_warnx(context, "would block writing %llu bytes to slave %s", + (unsigned long long)rem, s->name); + return EWOULDBLOCK; +} + +static int +send_complete(krb5_context context, slave *s, const char *database, + uint32_t current_version, uint32_t oldest_version, + uint32_t initial_log_tstamp) +{ + krb5_error_code ret; + krb5_storage *dump = NULL; + uint32_t vno = 0; + int fd = -1; + struct stat st; + char *dfn; + + ret = asprintf(&dfn, "%s/ipropd.dumpfile", hdb_db_dir(context)); + if (ret == -1 || !dfn) { + krb5_warn(context, ENOMEM, "Cannot allocate memory"); + return ENOMEM; + } + + fd = open(dfn, O_CREAT|O_RDWR, 0600); + if (fd == -1) { + ret = errno; + krb5_warn(context, ret, "Cannot open/create iprop dumpfile %s", dfn); + free(dfn); + return ret; + } + free(dfn); + + dump = krb5_storage_from_fd(fd); + if (!dump) { + ret = errno; + krb5_warn(context, ret, "krb5_storage_from_fd"); + goto done; + } + + for (;;) { + ret = flock(fd, LOCK_SH); + if (ret == -1) { + ret = errno; + krb5_warn(context, ret, "flock(fd, LOCK_SH)"); + goto done; + } + + if (krb5_storage_seek(dump, 0, SEEK_SET) == (off_t)-1) { + ret = errno; + krb5_warn(context, ret, "krb5_storage_seek(dump, 0, SEEK_SET)"); + goto done; + } + + vno = 0; + ret = krb5_ret_uint32(dump, &vno); + if (ret && ret != HEIM_ERR_EOF) { + krb5_warn(context, ret, "krb5_ret_uint32(dump, &vno)"); + goto done; + } + + if (fstat(fd, &st) == -1) { + ret = errno; + krb5_warn(context, ret, "send_complete: could not stat dump file"); + goto done; + } + + /* + * If the current dump has an appropriate version, then we can + * break out of the loop and send the file below. + */ + if (ret == 0 && vno != 0 && st.st_mtime > initial_log_tstamp && + vno >= oldest_version && vno <= current_version) + break; + + if (verbose) + krb5_warnx(context, "send_complete: dumping HDB"); + + /* + * Otherwise, we may need to write a new dump file. We + * obtain an exclusive lock on the fd. Because this is + * not guaranteed to be an upgrade of our existing shared + * lock, someone else may have written a new dumpfile while + * we were waiting and so we must first check the vno of + * the dump to see if that happened. If it did, we need + * to go back to the top of the loop so that we can downgrade + * our lock to a shared one. + */ + + ret = flock(fd, LOCK_EX); + if (ret == -1) { + ret = errno; + krb5_warn(context, ret, "flock(fd, LOCK_EX)"); + goto done; + } + + ret = krb5_storage_seek(dump, 0, SEEK_SET); + if (ret == -1) { + ret = errno; + krb5_warn(context, ret, "krb5_storage_seek(dump, 0, SEEK_SET)"); + goto done; + } + + vno = 0; + ret = krb5_ret_uint32(dump, &vno); + if (ret && ret != HEIM_ERR_EOF) { + krb5_warn(context, ret, "krb5_ret_uint32(dump, &vno)"); + goto done; + } + + if (fstat(fd, &st) == -1) { + ret = errno; + krb5_warn(context, ret, "send_complete: could not stat dump file"); + goto done; + } + + /* check if someone wrote a better version for us */ + if (ret == 0 && vno != 0 && st.st_mtime > initial_log_tstamp && + vno >= oldest_version && vno <= current_version) + continue; + + /* Now, we know that we must write a new dump file. */ + + ret = write_dump(context, dump, database, current_version); + if (ret) + goto done; + + /* + * And we must continue to the top of the loop so that we can + * downgrade to a shared lock. + */ + } + + /* + * Leaving the above loop, dump should have a ptr right after the initial + * 4 byte DB version number and we should have a shared lock on the file + * (which we may have just created), so we are reading to start sending + * the data down the wire. + * + * Note: (krb5_storage_from_fd() dup()'s the fd) + */ + + s->tail.dump = dump; + s->tail.vno = vno; + dump = NULL; + ret = send_tail(context, s); + +done: + if (fd != -1) + close(fd); + if (dump) + krb5_storage_free(dump); + return ret; +} + static int send_are_you_there (krb5_context context, slave *s) { @@ -470,6 +822,14 @@ if (s->flags & (SLAVE_F_DEAD|SLAVE_F_AYT)) return 0; + /* + * Write any remainder of previous write, if we can. If we'd block we'll + * return EWOULDBLOCK. + */ + ret = send_tail(context, s); + if (ret) + return ret; + krb5_warnx(context, "slave %s missing, sending AYT", s->name); s->flags |= SLAVE_F_AYT; @@ -481,173 +841,553 @@ if (sp == NULL) { krb5_warnx (context, "are_you_there: krb5_data_alloc"); slave_dead(context, s); - return 1; + return ENOMEM; } - krb5_store_int32 (sp, ARE_YOU_THERE); + ret = krb5_store_uint32(sp, ARE_YOU_THERE); krb5_storage_free (sp); - ret = krb5_write_priv_message(context, s->ac, &s->fd, &data); + if (ret == 0) + ret = mk_priv_tail(context, s, &data); + if (ret == 0) + ret = send_tail(context, s); + if (ret && ret != EWOULDBLOCK) { + krb5_warn(context, ret, "are_you_there"); + slave_dead(context, s); + } + return ret; +} - if (ret) { - krb5_warn (context, ret, "are_you_there: krb5_write_priv_message"); - slave_dead(context, s); - return 1; +static int +diffready(krb5_context context, slave *s) +{ + /* + * Don't send any diffs until slave has sent an I_HAVE telling us the + * initial version number! + */ + if ((s->flags & SLAVE_F_READY) == 0) + return 0; + + if (s->flags & SLAVE_F_DEAD) { + if (verbose) + krb5_warnx(context, "not sending diffs to dead slave %s", s->name); + return 0; } - return 0; + /* Write any remainder of previous write, if we can. */ + if (send_tail(context, s) != 0) + return 0; + + return 1; } static int -send_diffs (krb5_context context, slave *s, int log_fd, - const char *database, uint32_t current_version) +nodiffs(krb5_context context, slave *s, uint32_t current_version) { krb5_storage *sp; - uint32_t ver; - time_t timestamp; - enum kadm_ops op; - uint32_t len; - off_t right, left; krb5_data data; - int ret = 0; + int ret; - if (s->version == current_version) { - krb5_warnx(context, "slave %s in sync already at version %ld", - s->name, (long)s->version); - return 0; + if (s->version < current_version) + return 0; + + /* + * If we had sent a partial diff, and now they're caught up, then there's + * no more. + */ + s->next_diff.more = 0; + + if (verbose) + krb5_warnx(context, "slave %s version %ld already sent", s->name, + (long)s->version); + sp = krb5_storage_emem(); + if (sp == NULL) + krb5_errx(context, IPROPD_RESTART, "krb5_storage_from_mem"); + + ret = krb5_store_uint32(sp, YOU_HAVE_LAST_VERSION); + if (ret == 0) { + krb5_data_zero(&data); + ret = krb5_storage_to_data(sp, &data); + } + krb5_storage_free(sp); + if (ret == 0) { + ret = mk_priv_tail(context, s, &data); + krb5_data_free(&data); } + if (ret == 0) + send_tail(context, s); - if (s->flags & SLAVE_F_DEAD) - return 0; + return 1; +} + +/* + * Lock the log and return initial version and timestamp + */ +static int +get_first(kadm5_server_context *server_context, int log_fd, + uint32_t *initial_verp, uint32_t *initial_timep) +{ + krb5_context context = server_context->context; + int ret; + + /* + * We don't want to perform tight retry loops on log access errors, so on + * error mark the slave dead. The slave reconnect after a delay... + */ + if (flock(log_fd, LOCK_SH) == -1) { + krb5_warn(context, errno, "could not obtain shared lock on log file"); + return -1; + } - /* if slave is a fresh client, starting over */ - if (s->version == 0) { - krb5_warnx(context, "sending complete log to fresh slave %s", - s->name); - return send_complete (context, s, database, current_version); + ret = kadm5_log_get_version_fd(server_context, log_fd, LOG_VERSION_FIRST, + initial_verp, initial_timep); + if (ret != 0) { + flock(log_fd, LOCK_UN); + krb5_warnx(context, "could not read initial log entry"); + return -1; } - sp = kadm5_log_goto_end (log_fd); - right = krb5_storage_seek(sp, 0, SEEK_CUR); + return 0; +} + +/*- + * Find the left end of the diffs in the log we want to send. + * + * - On success, return a positive offset to the first new entry, retaining + * a read lock on the log file. + * - On error, return a negative offset, with the lock released. + * - If we simply find no successor entry in the log, return zero + * with the lock released, which indicates that fallback to send_complete() + * is needed. + */ +static off_t +get_left(kadm5_server_context *server_context, slave *s, krb5_storage *sp, + int log_fd, uint32_t current_version, + uint32_t *initial_verp, uint32_t *initial_timep) +{ + krb5_context context = server_context->context; + off_t pos; + off_t left; + int ret; + for (;;) { - ret = kadm5_log_previous (context, sp, &ver, ×tamp, &op, &len); - if (ret) - krb5_err(context, 1, ret, - "send_diffs: failed to find previous entry"); - left = krb5_storage_seek(sp, -16, SEEK_CUR); - if (ver == s->version) - return 0; - if (ver == s->version + 1) - break; - if (left == 0) { - krb5_storage_free(sp); - krb5_warnx(context, - "slave %s (version %lu) out of sync with master " - "(first version in log %lu), sending complete database", - s->name, (unsigned long)s->version, (unsigned long)ver); - return send_complete (context, s, database, current_version); - } + uint32_t ver = s->version; + + /* This acquires a read lock on success */ + ret = get_first(server_context, log_fd, + initial_verp, initial_timep); + if (ret != 0) + return -1; + + /* When the slave version is out of range, send the whole database. */ + if (ver == 0 || ver < *initial_verp || ver > current_version) { + flock(log_fd, LOCK_UN); + return 0; + } + + /* Avoid seeking past the last committed record */ + if (kadm5_log_goto_end(server_context, sp) != 0 || + (pos = krb5_storage_seek(sp, 0, SEEK_CUR)) < 0) + goto err; + + /* + * First try to see if we can find it quickly by seeking to the right + * end of the previous diff sent. + */ + if (s->next_diff.last_version_sent > 0 && + s->next_diff.off_next_version > 0 && + s->next_diff.off_next_version < pos && + s->next_diff.initial_version == *initial_verp && + s->next_diff.initial_tstamp == *initial_timep) { + /* + * Sanity check that the left version matches what we wanted, the + * log may have been truncated since. + */ + left = s->next_diff.off_next_version; + if (krb5_storage_seek(sp, left, SEEK_SET) != left) + goto err; + if (kadm5_log_next(context, sp, &ver, NULL, NULL, NULL) == 0 && + ver == s->next_diff.last_version_sent + 1) + return left; + } + + if (krb5_storage_seek(sp, pos, SEEK_SET) != pos) + goto err; + + /* + * Drop the lock and try to find the left entry by seeking backward + * from the end of the end of the log. If we succeed, re-acquire the + * lock, update "next_diff", and retry the fast-path. + */ + flock(log_fd, LOCK_UN); + + /* Slow path: seek backwards, entry by entry, from the end */ + for (;;) { + enum kadm_ops op; + uint32_t len; + + ret = kadm5_log_previous(context, sp, &ver, NULL, &op, &len); + if (ret) + return -1; + left = krb5_storage_seek(sp, -16, SEEK_CUR); + if (left < 0) + return left; + if (ver == s->version + 1) + break; + + /* + * We don't expect to reach the slave's version, unless the log + * has been modified after we released the lock. + */ + if (ver == s->version) { + krb5_warnx(context, "iprop log truncated while sending diffs " + "to slave?? ver = %lu", (unsigned long)ver); + return -1; + } + + /* If we've reached the uber record, send the complete database */ + if (left == 0 || (ver == 0 && op == kadm_nop)) + return 0; + } + assert(ver == s->version + 1); + + /* Set up the fast-path pre-conditions */ + s->next_diff.last_version_sent = s->version; + s->next_diff.off_next_version = left; + s->next_diff.initial_version = *initial_verp; + s->next_diff.initial_tstamp = *initial_timep; + + /* + * If we loop then we're hoping to hit the fast path so we can return a + * non-zero, positive left offset with the lock held. + * + * We just updated the fast path pre-conditions, so unless a log + * truncation event happens between the point where we dropped the lock + * and the point where we rearcuire it above, we will hit the fast + * path. + */ } - krb5_warnx(context, - "syncing slave %s from version %lu to version %lu", - s->name, (unsigned long)s->version, - (unsigned long)current_version); + return left; + + err: + flock(log_fd, LOCK_UN); + return -1; +} + +static off_t +get_right(krb5_context context, int log_fd, krb5_storage *sp, + int lastver, slave *s, off_t left, uint32_t *verp) +{ + int ret = 0; + int i = 0; + uint32_t ver = s->version; + off_t right = krb5_storage_seek(sp, left, SEEK_SET); + + if (right <= 0) { + flock(log_fd, LOCK_UN); + return -1; + } + + /* The "lastver" bound should preclude us reaching EOF */ + for (; ret == 0 && i < SEND_DIFFS_MAX_RECORDS && ver < lastver; ++i) { + uint32_t logver; + + ret = kadm5_log_next(context, sp, &logver, NULL, NULL, NULL); + if (logver != ++ver) + ret = KADM5_LOG_CORRUPT; + } + + if (ret == 0) + right = krb5_storage_seek(sp, 0, SEEK_CUR); + else + right = -1; + if (right <= 0) { + flock(log_fd, LOCK_UN); + return -1; + } + *verp = ver; + return right; +} + +static void +send_diffs(kadm5_server_context *server_context, slave *s, int log_fd, + const char *database, uint32_t current_version) +{ + krb5_context context = server_context->context; + krb5_storage *sp; + uint32_t initial_version; + uint32_t initial_tstamp; + uint32_t ver; + off_t left = 0; + off_t right = 0; + krb5_ssize_t bytes; + krb5_data data; + int ret = 0; + + if (!diffready(context, s) || nodiffs(context, s, current_version)) + return; + + if (verbose) + krb5_warnx(context, "sending diffs to live-seeming slave %s", s->name); + + sp = krb5_storage_from_fd(log_fd); + if (sp == NULL) + krb5_err(context, IPROPD_RESTART_SLOW, ENOMEM, + "send_diffs: out of memory"); + + left = get_left(server_context, s, sp, log_fd, current_version, + &initial_version, &initial_tstamp); + if (left < 0) { + krb5_storage_free(sp); + slave_dead(context, s); + return; + } + + if (left == 0) { + /* Slave's version is not in the log, fall back on send_complete() */ + krb5_storage_free(sp); + send_complete(context, s, database, current_version, + initial_version, initial_tstamp); + return; + } + + /* We still hold the read lock, if right > 0 */ + right = get_right(server_context->context, log_fd, sp, current_version, + s, left, &ver); + if (right == left) { + flock(log_fd, LOCK_UN); + krb5_storage_free(sp); + return; + } + if (right < left) { + assert(right < 0); + krb5_storage_free(sp); + slave_dead(context, s); + return; + } + + if (krb5_storage_seek(sp, left, SEEK_SET) != left) { + ret = errno ? errno : EIO; + flock(log_fd, LOCK_UN); + krb5_warn(context, ret, "send_diffs: krb5_storage_seek"); + krb5_storage_free(sp); + slave_dead(context, s); + return; + } - ret = krb5_data_alloc (&data, right - left + 4); + ret = krb5_data_alloc(&data, right - left + 4); if (ret) { - krb5_storage_free(sp); - krb5_warn (context, ret, "send_diffs: krb5_data_alloc"); - slave_dead(context, s); - return 1; + flock(log_fd, LOCK_UN); + krb5_warn(context, ret, "send_diffs: krb5_data_alloc"); + krb5_storage_free(sp); + slave_dead(context, s); + return; } - krb5_storage_read (sp, (char *)data.data + 4, data.length - 4); + + bytes = krb5_storage_read(sp, (char *)data.data + 4, data.length - 4); + flock(log_fd, LOCK_UN); krb5_storage_free(sp); + if (bytes != data.length - 4) + krb5_errx(context, IPROPD_RESTART, "locked log truncated???"); - sp = krb5_storage_from_data (&data); + sp = krb5_storage_from_data(&data); if (sp == NULL) { - krb5_warnx (context, "send_diffs: krb5_storage_from_data"); - slave_dead(context, s); - return 1; + krb5_err(context, IPROPD_RESTART_SLOW, ENOMEM, "out of memory"); + krb5_warnx(context, "send_diffs: krb5_storage_from_data"); + return; } - krb5_store_int32 (sp, FOR_YOU); + krb5_store_uint32(sp, FOR_YOU); krb5_storage_free(sp); - ret = krb5_write_priv_message(context, s->ac, &s->fd, &data); + ret = mk_priv_tail(context, s, &data); krb5_data_free(&data); + if (ret == 0) { + /* Save the fast-path continuation */ + s->next_diff.last_version_sent = ver; + s->next_diff.off_next_version = right; + s->next_diff.initial_version = initial_version; + s->next_diff.initial_tstamp = initial_tstamp; + s->next_diff.more = ver < current_version; + ret = send_tail(context, s); + + krb5_warnx(context, + "syncing slave %s from version %lu to version %lu", + s->name, (unsigned long)s->version, + (unsigned long)ver); + s->version = ver; + } - if (ret) { - krb5_warn (context, ret, "send_diffs: krb5_write_priv_message"); - slave_dead(context, s); - return 1; + if (ret && ret != EWOULDBLOCK) { + krb5_warn(context, ret, "send_diffs: making or sending " + "KRB-PRIV message"); + slave_dead(context, s); + return; } slave_seen(s); + return; +} + +/* Sensible bound on slave message size */ +#define SLAVE_MSG_MAX 65536 + +static int +fill_input(krb5_context context, slave *s) +{ + krb5_error_code ret; - s->version = current_version; + if (s->input.hlen < 4) { + uint8_t *buf = s->input.header_buf + s->input.hlen; + size_t len = 4 - s->input.hlen; + krb5_ssize_t bytes = krb5_net_read(context, &s->fd, buf, len); + + if (bytes == 0) + return HEIM_ERR_EOF; + if (bytes < 0) { + if (errno == EWOULDBLOCK || errno == EAGAIN) + return EWOULDBLOCK; + return errno ? errno : EIO; + } + s->input.hlen += bytes; + if (bytes < len) + return EWOULDBLOCK; + + buf = s->input.header_buf; + len = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; + if (len > SLAVE_MSG_MAX) + return EINVAL; + ret = krb5_data_alloc(&s->input.packet, len); + if (ret != 0) + return ret; + } + if (s->input.offset < s->input.packet.length) { + u_char *buf = (u_char *)s->input.packet.data + s->input.offset; + size_t len = s->input.packet.length - s->input.offset; + krb5_ssize_t bytes = krb5_net_read(context, &s->fd, buf, len); + + if (bytes == 0) + return HEIM_ERR_EOF; + if (bytes < 0) { + if (errno == EWOULDBLOCK || errno == EAGAIN) + return EWOULDBLOCK; + return errno ? errno : EIO; + } + s->input.offset += bytes; + if (bytes != len) + return EWOULDBLOCK; + } return 0; } static int -process_msg (krb5_context context, slave *s, int log_fd, - const char *database, uint32_t current_version) +read_msg(krb5_context context, slave *s, krb5_data *out) { + int ret = fill_input(context, s); + + if (ret != 0) + return ret; + + ret = krb5_rd_priv(context, s->ac, &s->input.packet, out, NULL); + + /* Prepare for next packet */ + krb5_data_free(&s->input.packet); + s->input.offset = 0; + s->input.hlen = 0; + + return ret; +} + +static int +process_msg(kadm5_server_context *server_context, slave *s, int log_fd, + const char *database, uint32_t current_version) +{ + krb5_context context = server_context->context; int ret = 0; krb5_data out; krb5_storage *sp; - int32_t tmp; + uint32_t tmp; - ret = krb5_read_priv_message(context, s->ac, &s->fd, &out); - if(ret) { - krb5_warn (context, ret, "error reading message from %s", s->name); - return 1; + ret = read_msg(context, s, &out); + if (ret) { + if (ret != EWOULDBLOCK) + krb5_warn(context, ret, "error reading message from %s", s->name); + return ret; } - sp = krb5_storage_from_mem (out.data, out.length); + sp = krb5_storage_from_mem(out.data, out.length); if (sp == NULL) { - krb5_warnx (context, "process_msg: no memory"); - krb5_data_free (&out); + krb5_warnx(context, "process_msg: no memory"); + krb5_data_free(&out); return 1; } - if (krb5_ret_int32 (sp, &tmp) != 0) { - krb5_warnx (context, "process_msg: client send too short command"); - krb5_data_free (&out); + if (krb5_ret_uint32(sp, &tmp) != 0) { + krb5_warnx(context, "process_msg: client send too short command"); + krb5_data_free(&out); return 1; } switch (tmp) { case I_HAVE : - ret = krb5_ret_int32 (sp, &tmp); + ret = krb5_ret_uint32(sp, &tmp); if (ret != 0) { - krb5_warnx (context, "process_msg: client send too I_HAVE data"); + krb5_warnx(context, "process_msg: client send too little I_HAVE data"); break; } - /* new started slave that have old log */ - if (s->version == 0 && tmp != 0) { - if (current_version < (uint32_t)tmp) { - krb5_warnx (context, "Slave %s (version %lu) have later version " - "the master (version %lu) OUT OF SYNC", - s->name, (unsigned long)tmp, - (unsigned long)current_version); + /* + * XXX Make the slave send the timestamp as well, and try to get it + * here, and pass it to send_diffs(). + */ + /* + * New slave whose version number we've not yet seen. If the version + * number is zero, the slave has no data, and we'll send a complete + * database (that happens in send_diffs()). Otherwise, we'll record a + * non-zero initial version and attempt an incremental update. + * + * NOTE!: Once the slave is "ready" (its first I_HAVE has conveyed its + * initial version), we MUST NOT update s->version to the slave's + * I_HAVE version, since we may already have sent later updates, and + * MUST NOT send them again, otherwise we can get further and further + * out of sync resending larger and larger diffs. The "not yet ready" + * is an essential precondition for setting s->version to the value + * in the I_HAVE message. This happens only once when the slave + * first connects. + */ + if (!(s->flags & SLAVE_F_READY)) { + if (current_version < tmp) { + krb5_warnx(context, "Slave %s (version %u) has later version " + "than the master (version %u) OUT OF SYNC", + s->name, tmp, current_version); + /* Force send_complete() */ + tmp = 0; } + /* + * Mark the slave as ready for updates based on incoming signals. + * Prior to the initial I_HAVE, we don't know the slave's version + * number, and MUST not send it anything, since we'll needlessly + * attempt to send the whole database! + */ s->version = tmp; + s->flags |= SLAVE_F_READY; + if (verbose) + krb5_warnx(context, "slave %s ready for updates from version %u", + s->name, tmp); } - if ((uint32_t)tmp < s->version) { - krb5_warnx (context, "Slave claims to not have " - "version we already sent to it"); - } else { - ret = send_diffs (context, s, log_fd, database, current_version); - } - break; + if ((s->version_ack = tmp) < s->version) + break; + send_diffs(server_context, s, log_fd, database, current_version); + break; case I_AM_HERE : + if (verbose) + krb5_warnx(context, "slave %s is there", s->name); break; case ARE_YOU_THERE: case FOR_YOU : default : - krb5_warnx (context, "Ignoring command %d", tmp); + krb5_warnx(context, "Ignoring command %d", tmp); break; } - krb5_data_free (&out); - krb5_storage_free (sp); + krb5_data_free(&out); + krb5_storage_free(sp); slave_seen(s); @@ -664,25 +1404,28 @@ open_stats(krb5_context context) { char *statfile = NULL; - const char *fn; - FILE *f; + const char *fn = NULL; + FILE *out = NULL; + /* + * krb5_config_get_string_default() returs default value as-is, + * delay free() of "statfile" until we're done with "fn". + */ if (slave_stats_file) fn = slave_stats_file; - else { - asprintf(&statfile, "%s/slaves-stats", hdb_db_dir(context)); + else if (asprintf(&statfile, "%s/slaves-stats", hdb_db_dir(context)) != -1 + && statfile != NULL) fn = krb5_config_get_string_default(context, NULL, statfile, "kdc", "iprop-stats", NULL); - } - f = fopen(fn, "w"); - if (statfile) + if (fn != NULL) + out = fopen(fn, "w"); + if (statfile != NULL) free(statfile); - - return f; + return out; } static void @@ -738,7 +1481,7 @@ krb5_error_code ret; rtbl_add_column_entry(tbl, SLAVE_NAME, slaves->name); ret = krb5_sockaddr2address (context, - (struct sockaddr*)&slaves->addr.sa, &addr); + (struct sockaddr*)&slaves->addr, &addr); if(ret == 0) { krb5_print_address(&addr, str, sizeof(str), NULL); krb5_free_address(context, &addr); @@ -746,7 +1489,7 @@ } else rtbl_add_column_entry(tbl, SLAVE_ADDRESS, ""); - snprintf(str, sizeof(str), "%u", (unsigned)slaves->version); + snprintf(str, sizeof(str), "%u", (unsigned)slaves->version_ack); rtbl_add_column_entry(tbl, SLAVE_VERSION, str); if (slaves->flags & SLAVE_F_DEAD) @@ -770,7 +1513,7 @@ } -static char sHDB[] = "HDB:"; +static char sHDB[] = "HDBGET:"; static char *realm; static int version_flag; static int help_flag; @@ -778,9 +1521,8 @@ static char *database; static char *config_file; static char *port_str; -#ifdef SUPPORT_DETACH -static int detach_from_console = 0; -#endif +static int detach_from_console; +static int daemon_child = -1; static struct getargs args[] = { { "config-file", 'c', arg_string, &config_file, NULL, NULL }, @@ -796,12 +1538,13 @@ "time of inactivity after which a slave is considered gone", "time"}, { "port", 0, arg_string, &port_str, "port ipropd will listen to", "port"}, -#ifdef SUPPORT_DETACH { "detach", 0, arg_flag, &detach_from_console, "detach from console", NULL }, -#endif + { "daemon-child", 0 , arg_integer, &daemon_child, + "private argument, do not use", NULL }, { "hostname", 0, arg_string, rk_UNCONST(&master_hostname), "hostname of master (if not same as hostname)", "hostname" }, + { "verbose", 0, arg_flag, &verbose, NULL, NULL }, { "version", 0, arg_flag, &version_flag, NULL, NULL }, { "help", 0, arg_flag, &help_flag, NULL, NULL } }; @@ -815,28 +1558,43 @@ void *kadm_handle; kadm5_server_context *server_context; kadm5_config_params conf; - krb5_socket_t signal_fd, listen_fd, listen6_fd; + krb5_socket_t signal_fd, listen_fd; int log_fd; slave *slaves = NULL; uint32_t current_version = 0, old_version = 0; krb5_keytab keytab; - int optidx; char **files; + int aret; + int optidx = 0; + int restarter_fd = -1; + struct stat st; + + setprogname(argv[0]); - optidx = krb5_program_setup(&context, argc, argv, args, num_args, NULL); + if (getarg(args, num_args, argc, argv, &optidx)) + krb5_std_usage(1, args, num_args); - if(help_flag) + if (help_flag) krb5_std_usage(0, args, num_args); - if(version_flag) { + + if (version_flag) { print_version(NULL); exit(0); } + if (detach_from_console && daemon_child == -1) + roken_detach_prep(argc, argv, "--daemon-child"); + rk_pidfile(NULL); + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_context failed: %d", ret); + setup_signal(); if (config_file == NULL) { - asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); - if (config_file == NULL) + aret = asprintf(&config_file, "%s/kdc.conf", hdb_db_dir(context)); + if (aret == -1 || config_file == NULL) errx(1, "out of memory"); } @@ -856,15 +1614,10 @@ if (time_before_missing < 0) krb5_errx (context, 1, "couldn't parse time: %s", slave_time_missing); -#ifdef SUPPORT_DETACH - if (detach_from_console) - daemon(0, 0); -#endif - pidfile (NULL); - krb5_openlog (context, "ipropd-master", &log_facility); + krb5_openlog(context, "ipropd-master", &log_facility); krb5_set_warn_dest(context, log_facility); - ret = krb5_kt_register(context, &hdb_kt_ops); + ret = krb5_kt_register(context, &hdb_get_kt_ops); if(ret) krb5_err(context, 1, ret, "krb5_kt_register"); @@ -893,69 +1646,126 @@ krb5_err (context, 1, errno, "open %s", server_context->log_context.log_file); + if (fstat(log_fd, &st) == -1) + krb5_err(context, 1, errno, "stat %s", + server_context->log_context.log_file); + + if (flock(log_fd, LOCK_SH) == -1) + krb5_err(context, 1, errno, "shared flock %s", + server_context->log_context.log_file); + kadm5_log_get_version_fd(server_context, log_fd, LOG_VERSION_LAST, + ¤t_version, NULL); + flock(log_fd, LOCK_UN); + signal_fd = make_signal_socket (context); listen_fd = make_listen_socket (context, port_str); - listen6_fd = make_listen6_socket (context, port_str); - - kadm5_log_get_version_fd (log_fd, ¤t_version); krb5_warnx(context, "ipropd-master started at version: %lu", (unsigned long)current_version); - while(exit_flag == 0){ + roken_detach_finish(NULL, daemon_child); + restarter_fd = restarter(context, NULL); + + while (exit_flag == 0){ slave *p; - fd_set readset; + fd_set readset, writeset; int max_fd = 0; struct timeval to = {30, 0}; uint32_t vers; + struct stat st2;; #ifndef NO_LIMIT_FD_SETSIZE if (signal_fd >= FD_SETSIZE || listen_fd >= FD_SETSIZE || - listen6_fd >= FD_SETSIZE) - krb5_errx (context, 1, "fd too large"); + restarter_fd >= FD_SETSIZE) + krb5_errx (context, IPROPD_RESTART, "fd too large"); #endif FD_ZERO(&readset); + FD_ZERO(&writeset); FD_SET(signal_fd, &readset); max_fd = max(max_fd, signal_fd); FD_SET(listen_fd, &readset); max_fd = max(max_fd, listen_fd); - FD_SET(listen6_fd, &readset); - max_fd = max(max_fd, listen6_fd); + if (restarter_fd > -1) { + FD_SET(restarter_fd, &readset); + max_fd = max(max_fd, restarter_fd); + } for (p = slaves; p != NULL; p = p->next) { if (p->flags & SLAVE_F_DEAD) continue; FD_SET(p->fd, &readset); + if (have_tail(p) || more_diffs(p)) + FD_SET(p->fd, &writeset); max_fd = max(max_fd, p->fd); } - ret = select (max_fd + 1, - &readset, NULL, NULL, &to); + ret = select(max_fd + 1, &readset, &writeset, NULL, &to); if (ret < 0) { if (errno == EINTR) continue; else - krb5_err (context, 1, errno, "select"); + krb5_err (context, IPROPD_RESTART, errno, "select"); } + if (stat(server_context->log_context.log_file, &st2) == -1) { + krb5_warn(context, errno, "could not stat log file by path"); + st2 = st; + } + + if (st2.st_dev != st.st_dev || st2.st_ino != st.st_ino) { + (void) close(log_fd); + + log_fd = open(server_context->log_context.log_file, O_RDONLY, 0); + if (log_fd < 0) + krb5_err(context, IPROPD_RESTART_SLOW, errno, "open %s", + server_context->log_context.log_file); + + if (fstat(log_fd, &st) == -1) + krb5_err(context, IPROPD_RESTART_SLOW, errno, "stat %s", + server_context->log_context.log_file); + + if (flock(log_fd, LOCK_SH) == -1) + krb5_err(context, IPROPD_RESTART, errno, "shared flock %s", + server_context->log_context.log_file); + kadm5_log_get_version_fd(server_context, log_fd, LOG_VERSION_LAST, + ¤t_version, NULL); + flock(log_fd, LOCK_UN); + } + if (ret == 0) { - old_version = current_version; - kadm5_log_get_version_fd (log_fd, ¤t_version); + /* Recover from failed transactions */ + if (kadm5_log_init_nb(server_context) == 0) + kadm5_log_end(server_context); + + if (flock(log_fd, LOCK_SH) == -1) + krb5_err(context, IPROPD_RESTART, errno, + "could not lock log file"); + kadm5_log_get_version_fd(server_context, log_fd, LOG_VERSION_LAST, + ¤t_version, NULL); + flock(log_fd, LOCK_UN); if (current_version > old_version) { - krb5_warnx(context, - "Missed a signal, updating slaves %lu to %lu", - (unsigned long)old_version, - (unsigned long)current_version); + if (verbose) + krb5_warnx(context, + "Missed a signal, updating slaves %lu to %lu", + (unsigned long)old_version, + (unsigned long)current_version); for (p = slaves; p != NULL; p = p->next) { if (p->flags & SLAVE_F_DEAD) continue; - send_diffs (context, p, log_fd, database, current_version); + send_diffs(server_context, p, log_fd, database, + current_version); } + old_version = current_version; } } + if (ret && FD_ISSET(restarter_fd, &readset)) { + exit_flag = SIGTERM; + break; + } + if (ret && FD_ISSET(signal_fd, &readset)) { #ifndef NO_UNIX_SOCKETS struct sockaddr_un peer_addr; @@ -972,31 +1782,63 @@ --ret; assert(ret >= 0); old_version = current_version; - kadm5_log_get_version_fd (log_fd, ¤t_version); - if (current_version > old_version) { - krb5_warnx(context, - "Got a signal, updating slaves %lu to %lu", - (unsigned long)old_version, - (unsigned long)current_version); + if (flock(log_fd, LOCK_SH) == -1) + krb5_err(context, IPROPD_RESTART, errno, "shared flock %s", + server_context->log_context.log_file); + kadm5_log_get_version_fd(server_context, log_fd, LOG_VERSION_LAST, + ¤t_version, NULL); + flock(log_fd, LOCK_UN); + if (current_version != old_version) { + /* + * If current_version < old_version then the log got + * truncated and we'll end up doing full propagations. + * + * Truncating the log when the current version is + * numerically small can lead to race conditions. + * Ideally we should identify log versions as + * {init_or_trunc_time, vno}, then we could not have any + * such race conditions, but this would either require + * breaking backwards compatibility for the protocol or + * adding new messages to it. + */ + if (verbose) + krb5_warnx(context, + "Got a signal, updating slaves %lu to %lu", + (unsigned long)old_version, + (unsigned long)current_version); for (p = slaves; p != NULL; p = p->next) { if (p->flags & SLAVE_F_DEAD) continue; - send_diffs (context, p, log_fd, database, current_version); + send_diffs(server_context, p, log_fd, database, + current_version); } } else { - krb5_warnx(context, - "Got a signal, but no update in log version %lu", - (unsigned long)current_version); + if (verbose) + krb5_warnx(context, + "Got a signal, but no update in log version %lu", + (unsigned long)current_version); } } + for (p = slaves; p != NULL; p = p->next) { + if (!(p->flags & SLAVE_F_DEAD) && + FD_ISSET(p->fd, &writeset) && + ((have_tail(p) && send_tail(context, p) == 0) || + (!have_tail(p) && more_diffs(p)))) { + send_diffs(server_context, p, log_fd, database, + current_version); + } + } + for(p = slaves; p != NULL; p = p->next) { if (p->flags & SLAVE_F_DEAD) continue; if (ret && FD_ISSET(p->fd, &readset)) { --ret; assert(ret >= 0); - if(process_msg (context, p, log_fd, database, current_version)) + ret = process_msg(server_context, p, log_fd, database, + current_version); + if (ret && ret != EWOULDBLOCK) slave_dead(context, p); } else if (slave_gone_p (p)) slave_dead(context, p); @@ -1004,11 +1846,6 @@ send_are_you_there (context, p); } - if (ret && FD_ISSET(listen6_fd, &readset)) { - add_slave (context, keytab, &slaves, listen6_fd); - --ret; - assert(ret >= 0); - } if (ret && FD_ISSET(listen_fd, &readset)) { add_slave (context, keytab, &slaves, listen_fd); --ret; diff --git a/crypto/heimdal/lib/kadm5/ipropd_slave.c b/crypto/heimdal/lib/kadm5/ipropd_slave.c --- a/crypto/heimdal/lib/kadm5/ipropd_slave.c +++ b/crypto/heimdal/lib/kadm5/ipropd_slave.c @@ -37,6 +37,8 @@ static const char *config_name = "ipropd-slave"; +static int verbose; + static krb5_log_facility *log_facility; static char five_min[] = "5 min"; static char *server_time_lost = five_min; @@ -51,9 +53,10 @@ struct addrinfo *ai, *a; struct addrinfo hints; int error; + int one = 1; int s = -1; - memset (&hints, 0, sizeof(hints)); + memset(&hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_STREAM; if (port_str == NULL) { @@ -61,7 +64,7 @@ port_str = port; } - error = getaddrinfo (master, port_str, &hints, &ai); + error = getaddrinfo(master, port_str, &hints, &ai); if (error) { krb5_warnx(context, "Failed to get address of to %s: %s", master, gai_strerror(error)); @@ -75,24 +78,36 @@ if (error) strlcpy(node, "[unknown-addr]", sizeof(node)); - s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); + s = socket(a->ai_family, a->ai_socktype, a->ai_protocol); if (s < 0) continue; - if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { + if (connect(s, a->ai_addr, a->ai_addrlen) < 0) { krb5_warn(context, errno, "connection failed to %s[%s]", master, node); - close (s); + close(s); continue; } krb5_warnx(context, "connection successful " "to master: %s[%s]", master, node); break; } - freeaddrinfo (ai); + freeaddrinfo(ai); if (a == NULL) return -1; + if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one)) < 0) + krb5_warn(context, errno, "setsockopt(SO_KEEPALIVE) failed"); + + /* + * We write message lengths separately from the payload, avoid Nagle + * delays. + */ +#if defined(IPPROTO_TCP) && defined(TCP_NODELAY) + (void) setsockopt(s, IPPROTO_TCP, TCP_NODELAY, + (void *)&one, sizeof(one)); +#endif + return s; } @@ -107,6 +122,7 @@ krb5_creds creds; char *server; char keytab_buf[256]; + int aret; if (keytab_str == NULL) { ret = krb5_kt_default_name (context, keytab_buf, sizeof(keytab_buf)); @@ -127,8 +143,8 @@ ret = krb5_get_init_creds_opt_alloc(context, &init_opts); if (ret) krb5_err(context, 1, ret, "krb5_get_init_creds_opt_alloc"); - asprintf (&server, "%s/%s", IPROP_NAME, serverhost); - if (server == NULL) + aret = asprintf (&server, "%s/%s", IPROP_NAME, serverhost); + if (aret == -1 || server == NULL) krb5_errx (context, 1, "malloc: no memory"); ret = krb5_get_init_creds_keytab(context, &creds, client, keytab, @@ -143,7 +159,7 @@ ret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, cache); if(ret) krb5_err(context, 1, ret, "krb5_cc_new_unique"); - ret = krb5_cc_initialize(context, *cache, client); + ret = krb5_cc_initialize(context, *cache, creds.client); if(ret) krb5_err(context, 1, ret, "krb5_cc_initialize"); ret = krb5_cc_store_cred(context, *cache, &creds); @@ -154,200 +170,331 @@ } static krb5_error_code -ihave (krb5_context context, krb5_auth_context auth_context, - int fd, uint32_t version) +ihave(krb5_context context, krb5_auth_context auth_context, + int fd, uint32_t version) { int ret; u_char buf[8]; krb5_storage *sp; krb5_data data; - sp = krb5_storage_from_mem (buf, 8); - krb5_store_int32 (sp, I_HAVE); - krb5_store_int32 (sp, version); - krb5_storage_free (sp); + sp = krb5_storage_from_mem(buf, 8); + ret = krb5_store_uint32(sp, I_HAVE); + if (ret == 0) + ret = krb5_store_uint32(sp, version); + krb5_storage_free(sp); data.length = 8; data.data = buf; - ret = krb5_write_priv_message(context, auth_context, &fd, &data); - if (ret) - krb5_warn (context, ret, "krb5_write_message"); + if (ret == 0) { + if (verbose) + krb5_warnx(context, "telling master we are at %u", version); + + ret = krb5_write_priv_message(context, auth_context, &fd, &data); + if (ret) + krb5_warn(context, ret, "krb5_write_message"); + } return ret; } -static void +#ifndef EDQUOT +/* There's no EDQUOT on WIN32, for example */ +#define EDQUOT ENOSPC +#endif + +static int +append_to_log_file(krb5_context context, + kadm5_server_context *server_context, + krb5_storage *sp, off_t start, ssize_t slen) +{ + size_t len; + ssize_t sret; + off_t log_off; + int ret, ret2; + void *buf; + + if (verbose) + krb5_warnx(context, "appending diffs to log"); + + if (slen == 0) + return 0; + if (slen < 0) + return EINVAL; + len = slen; + if (len != slen) + return EOVERFLOW; + + buf = malloc(len); + if (buf == NULL && len != 0) { + krb5_warn(context, errno, "malloc: no memory"); + return ENOMEM; + } + + if (krb5_storage_seek(sp, start, SEEK_SET) != start) { + krb5_errx(context, IPROPD_RESTART, + "krb5_storage_seek() failed"); /* can't happen */ + } + sret = krb5_storage_read(sp, buf, len); + if (sret < 0) + return errno; + if (len != (size_t)sret) { + /* Can't happen */ + krb5_errx(context, IPROPD_RESTART, + "short krb5_storage_read() from memory buffer"); + } + log_off = lseek(server_context->log_context.log_fd, 0, SEEK_CUR); + if (log_off == -1) + return errno; + + /* + * Use net_write() so we get an errno if less that len bytes were + * written. + */ + sret = net_write(server_context->log_context.log_fd, buf, len); + free(buf); + if (sret != slen) + ret = errno; + else + ret = fsync(server_context->log_context.log_fd); + if (ret == 0) + return 0; + + /* + * Attempt to recover from this. First, truncate the log file + * and reset the fd offset. Failure to do this -> unlink the + * log file and re-create it. Since we're the slave, we ought to be + * able to recover from the log being unlinked... + */ + if (ftruncate(server_context->log_context.log_fd, log_off) == -1 || + lseek(server_context->log_context.log_fd, log_off, SEEK_SET) == -1) { + (void) kadm5_log_end(server_context); + if (unlink(server_context->log_context.log_file) == -1) { + krb5_err(context, IPROPD_FATAL, errno, + "Failed to recover from failure to write log " + "entries from master to disk"); + } + ret2 = kadm5_log_init(server_context); + if (ret2) { + krb5_err(context, IPROPD_RESTART_SLOW, ret2, + "Failed to initialize log to recover from " + "failure to write log entries from master to disk"); + } + } + if (ret == ENOSPC || ret == EDQUOT || ret == EFBIG) { + /* Unlink the file in these cases. */ + krb5_warn(context, IPROPD_RESTART_SLOW, + "Failed to write log entries from master to disk"); + (void) kadm5_log_end(server_context); + if (unlink(server_context->log_context.log_file) == -1) { + krb5_err(context, IPROPD_FATAL, errno, + "Failed to recover from failure to write log " + "entries from master to disk"); + } + ret2 = kadm5_log_init(server_context); + if (ret2) { + krb5_err(context, IPROPD_RESTART_SLOW, ret2, + "Failed to initialize log to recover from " + "failure to write log entries from master to disk"); + } + return ret; + } + /* + * All other errors we treat as fatal here. This includes, for + * example, EIO and EPIPE (sorry, can't log to pipes nor sockets). + */ + krb5_err(context, IPROPD_FATAL, ret, + "Failed to write log entries from master to disk"); +} + +static int receive_loop (krb5_context context, krb5_storage *sp, kadm5_server_context *server_context) { int ret; - off_t left, right; - void *buf; - int32_t vers, vers2; - ssize_t sret; + off_t left, right, off; + uint32_t len, vers; + + if (verbose) + krb5_warnx(context, "receiving diffs"); /* - * Seek to the current version of the local database. + * Seek to the first entry in the message from the master that is + * past the current version of the local database. */ do { - int32_t len, timestamp, tmp; - enum kadm_ops op; - - if(krb5_ret_int32 (sp, &vers) != 0) - return; - krb5_ret_int32 (sp, ×tamp); - krb5_ret_int32 (sp, &tmp); - op = tmp; - krb5_ret_int32 (sp, &len); - if ((uint32_t)vers <= server_context->log_context.version) - krb5_storage_seek(sp, len + 8, SEEK_CUR); - } while((uint32_t)vers <= server_context->log_context.version); + uint32_t timestamp; + uint32_t op; + + if ((ret = krb5_ret_uint32(sp, &vers)) == HEIM_ERR_EOF) { + krb5_warnx(context, "master sent no new iprop entries"); + return 0; + } + + /* + * TODO We could do more to validate the entries from the master + * here. And we could use/reuse more kadm5_log_*() code here. + * + * Alternatively we should trust that the master sent us exactly + * what we needed and just write this to the log file and let + * kadm5_log_recover() do the rest. + */ + if (ret || krb5_ret_uint32(sp, ×tamp) != 0 || + krb5_ret_uint32(sp, &op) != 0 || + krb5_ret_uint32(sp, &len) != 0) { + + /* + * This shouldn't happen. Reconnecting probably won't help + * if it does happen, but by reconnecting we get a chance to + * connect to a new master if a new one is configured. + */ + krb5_warnx(context, "iprop entries from master were truncated"); + return EINVAL; + } + if (vers > server_context->log_context.version) { + break; + } + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (krb5_storage_seek(sp, len + 8, SEEK_CUR) != off + len + 8) { + krb5_warnx(context, "iprop entries from master were truncated"); + return EINVAL; + } + if (verbose) { + krb5_warnx(context, "diff contains old log record version " + "%u %lld %u length %u", + vers, (long long)timestamp, op, len); + } + } while(vers <= server_context->log_context.version); /* - * Read up rest of the entires into the memory... + * Read the remaining entries into memory... */ - left = krb5_storage_seek (sp, -16, SEEK_CUR); - right = krb5_storage_seek (sp, 0, SEEK_END); - buf = malloc (right - left); - if (buf == NULL && (right - left) != 0) - krb5_errx (context, 1, "malloc: no memory"); + /* SEEK_CUR is a header into the first entry we care about */ + left = krb5_storage_seek(sp, -16, SEEK_CUR); + right = krb5_storage_seek(sp, 0, SEEK_END); + if (right - left < 24 + len) { + krb5_warnx(context, "iprop entries from master were truncated"); + return EINVAL; + } /* * ...and then write them out to the on-disk log. */ - krb5_storage_seek (sp, left, SEEK_SET); - krb5_storage_read (sp, buf, right - left); - sret = write (server_context->log_context.log_fd, buf, right-left); - if (sret != right - left) - krb5_err(context, 1, errno, "Failed to write log to disk"); - ret = fsync (server_context->log_context.log_fd); + + ret = append_to_log_file(context, server_context, sp, left, right - left); if (ret) - krb5_err(context, 1, errno, "Failed to sync log to disk"); - free (buf); + return ret; /* - * Go back to the startpoint and start to commit the entires to - * the database. + * Replay the new entries. */ - krb5_storage_seek (sp, left, SEEK_SET); - - for(;;) { - int32_t len, len2, timestamp, tmp; - off_t cur, cur2; - enum kadm_ops op; - - if(krb5_ret_int32 (sp, &vers) != 0) - break; - ret = krb5_ret_int32 (sp, ×tamp); - if (ret) krb5_errx(context, 1, "entry %ld: too short", (long)vers); - ret = krb5_ret_int32 (sp, &tmp); - if (ret) krb5_errx(context, 1, "entry %ld: too short", (long)vers); - op = tmp; - ret = krb5_ret_int32 (sp, &len); - if (ret) krb5_errx(context, 1, "entry %ld: too short", (long)vers); - if (len < 0) - krb5_errx(context, 1, "log is corrupted, " - "negative length of entry version %ld: %ld", - (long)vers, (long)len); - cur = krb5_storage_seek(sp, 0, SEEK_CUR); - - krb5_warnx (context, "replaying entry %d", (int)vers); - - ret = kadm5_log_replay (server_context, - op, vers, len, sp); - if (ret) { - const char *s = krb5_get_error_message(server_context->context, ret); - krb5_warnx (context, - "kadm5_log_replay: %ld. Lost entry entry, " - "Database out of sync ?: %s (%d)", - (long)vers, s ? s : "unknown error", ret); - krb5_free_error_message(context, s); - } - - { - /* - * Make sure the krb5_log_replay does the right thing wrt - * reading out data from the sp. - */ - cur2 = krb5_storage_seek(sp, 0, SEEK_CUR); - if (cur + len != cur2) - krb5_errx(context, 1, - "kadm5_log_reply version: %ld didn't read the whole entry", - (long)vers); - } - - if (krb5_ret_int32 (sp, &len2) != 0) - krb5_errx(context, 1, "entry %ld: postamble too short", (long)vers); - if(krb5_ret_int32 (sp, &vers2) != 0) - krb5_errx(context, 1, "entry %ld: postamble too short", (long)vers); + if (verbose) + krb5_warnx(context, "replaying entries from master"); + ret = kadm5_log_recover(server_context, kadm_recover_replay); + if (ret) { + krb5_warn(context, ret, "replay failed"); + return ret; + } - if (len != len2) - krb5_errx(context, 1, "entry %ld: len != len2", (long)vers); - if (vers != vers2) - krb5_errx(context, 1, "entry %ld: vers != vers2", (long)vers); + ret = kadm5_log_get_version(server_context, &vers); + if (ret) { + krb5_warn(context, ret, + "could not get log version after applying diffs!"); + return ret; } + if (verbose) + krb5_warnx(context, "slave at version %u", vers); - /* - * Update version - */ + if (vers != server_context->log_context.version) { + krb5_warnx(context, "slave's log_context version (%u) is " + "inconsistent with log's version (%u)", + server_context->log_context.version, vers); + } - server_context->log_context.version = vers; + return 0; } -static void -receive (krb5_context context, - krb5_storage *sp, - kadm5_server_context *server_context) +static int +receive(krb5_context context, + krb5_storage *sp, + kadm5_server_context *server_context) { - int ret; + krb5_error_code ret, ret2; ret = server_context->db->hdb_open(context, server_context->db, O_RDWR | O_CREAT, 0600); if (ret) - krb5_err (context, 1, ret, "db->open"); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "db->open"); - receive_loop (context, sp, server_context); + ret2 = receive_loop(context, sp, server_context); + if (ret2) + krb5_warn(context, ret2, "receive from ipropd-master had errors"); - ret = server_context->db->hdb_close (context, server_context->db); + ret = server_context->db->hdb_close(context, server_context->db); if (ret) - krb5_err (context, 1, ret, "db->close"); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "db->close"); + + return ret2; } static void -send_im_here (krb5_context context, int fd, - krb5_auth_context auth_context) +send_im_here(krb5_context context, int fd, + krb5_auth_context auth_context) { krb5_storage *sp; krb5_data data; - int ret; + krb5_error_code ret; - ret = krb5_data_alloc (&data, 4); + ret = krb5_data_alloc(&data, 4); if (ret) - krb5_err (context, 1, ret, "send_im_here"); + krb5_err(context, IPROPD_RESTART, ret, "send_im_here"); sp = krb5_storage_from_data (&data); if (sp == NULL) - krb5_errx (context, 1, "krb5_storage_from_data"); - krb5_store_int32(sp, I_AM_HERE); + krb5_errx(context, IPROPD_RESTART, "krb5_storage_from_data"); + ret = krb5_store_uint32(sp, I_AM_HERE); krb5_storage_free(sp); - ret = krb5_write_priv_message(context, auth_context, &fd, &data); - krb5_data_free(&data); + if (ret == 0) { + ret = krb5_write_priv_message(context, auth_context, &fd, &data); + krb5_data_free(&data); + + if (ret) + krb5_err(context, IPROPD_RESTART, ret, "krb5_write_priv_message"); + + if (verbose) + krb5_warnx(context, "pinged master"); + } + + return; +} + +static void +reinit_log(krb5_context context, + kadm5_server_context *server_context, + uint32_t vno) +{ + krb5_error_code ret; + + if (verbose) + krb5_warnx(context, "truncating log on slave"); + ret = kadm5_log_reinit(server_context, vno); if (ret) - krb5_err (context, 1, ret, "krb5_write_priv_message"); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "kadm5_log_reinit"); } + static krb5_error_code -receive_everything (krb5_context context, int fd, - kadm5_server_context *server_context, - krb5_auth_context auth_context) +receive_everything(krb5_context context, int fd, + kadm5_server_context *server_context, + krb5_auth_context auth_context) { int ret; krb5_data data; - int32_t vno = 0; - int32_t opcode; + uint32_t vno = 0; + uint32_t opcode; krb5_storage *sp; char *dbname; @@ -355,36 +502,41 @@ krb5_warnx(context, "receive complete database"); - asprintf(&dbname, "%s-NEW", server_context->db->hdb_name); + ret = asprintf(&dbname, "%s-NEW", server_context->db->hdb_name); + if (ret == -1) + krb5_err(context, IPROPD_RESTART, ENOMEM, "asprintf"); ret = hdb_create(context, &mydb, dbname); if(ret) - krb5_err(context,1, ret, "hdb_create"); + krb5_err(context, IPROPD_RESTART, ret, "hdb_create"); free(dbname); - ret = hdb_set_master_keyfile (context, - mydb, server_context->config.stash_file); + ret = hdb_set_master_keyfile(context, + mydb, server_context->config.stash_file); if(ret) - krb5_err(context,1, ret, "hdb_set_master_keyfile"); + krb5_err(context, IPROPD_RESTART, ret, "hdb_set_master_keyfile"); /* I really want to use O_EXCL here, but given that I can't easily clean up on error, I won't */ ret = mydb->hdb_open(context, mydb, O_RDWR | O_CREAT | O_TRUNC, 0600); if (ret) - krb5_err (context, 1, ret, "db->open"); + krb5_err(context, IPROPD_RESTART, ret, "db->open"); + + (void) mydb->hdb_set_sync(context, mydb, 0); sp = NULL; + krb5_data_zero(&data); do { ret = krb5_read_priv_message(context, auth_context, &fd, &data); if (ret) { - krb5_warn (context, ret, "krb5_read_priv_message"); + krb5_warn(context, ret, "krb5_read_priv_message"); goto cleanup; } - sp = krb5_storage_from_data (&data); + sp = krb5_storage_from_data(&data); if (sp == NULL) - krb5_errx (context, 1, "krb5_storage_from_data"); - krb5_ret_int32 (sp, &opcode); + krb5_errx(context, IPROPD_RESTART, "krb5_storage_from_data"); + krb5_ret_uint32(sp, &opcode); if (opcode == ONE_PRINC) { krb5_data fake_data; hdb_entry_ex entry; @@ -396,69 +548,119 @@ memset(&entry, 0, sizeof(entry)); - ret = hdb_value2entry (context, &fake_data, &entry.entry); + ret = hdb_value2entry(context, &fake_data, &entry.entry); if (ret) - krb5_err (context, 1, ret, "hdb_value2entry"); + krb5_err(context, IPROPD_RESTART, ret, "hdb_value2entry"); ret = mydb->hdb_store(server_context->context, mydb, 0, &entry); if (ret) - krb5_err (context, 1, ret, "hdb_store"); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "hdb_store"); - hdb_free_entry (context, &entry); - krb5_data_free (&data); + hdb_free_entry(context, &entry); + krb5_data_free(&data); } else if (opcode == NOW_YOU_HAVE) ; else - krb5_errx (context, 1, "strange opcode %d", opcode); + krb5_errx(context, 1, "strange opcode %d", opcode); } while (opcode == ONE_PRINC); if (opcode != NOW_YOU_HAVE) - krb5_errx (context, 1, "receive_everything: strange %d", opcode); + krb5_errx(context, IPROPD_RESTART_SLOW, + "receive_everything: strange %d", opcode); - krb5_ret_int32 (sp, &vno); + krb5_ret_uint32(sp, &vno); krb5_storage_free(sp); - ret = kadm5_log_reinit (server_context); - if (ret) - krb5_err(context, 1, ret, "kadm5_log_reinit"); + reinit_log(context, server_context, vno); - ret = kadm5_log_set_version (server_context, vno - 1); + ret = mydb->hdb_set_sync(context, mydb, 1); if (ret) - krb5_err (context, 1, ret, "kadm5_log_set_version"); - - ret = kadm5_log_nop (server_context); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "failed to sync the received HDB"); + ret = mydb->hdb_close(context, mydb); if (ret) - krb5_err (context, 1, ret, "kadm5_log_nop"); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "db->close"); - ret = mydb->hdb_rename (context, mydb, server_context->db->hdb_name); + ret = mydb->hdb_rename(context, mydb, server_context->db->hdb_name); if (ret) - krb5_err (context, 1, ret, "db->rename"); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "db->rename"); + + + return 0; cleanup: - krb5_data_free (&data); + krb5_data_free(&data); - ret = mydb->hdb_close (context, mydb); if (ret) - krb5_err (context, 1, ret, "db->close"); + krb5_err(context, IPROPD_RESTART_SLOW, ret, "db->close"); - ret = mydb->hdb_destroy (context, mydb); + ret = mydb->hdb_destroy(context, mydb); if (ret) - krb5_err (context, 1, ret, "db->destroy"); + krb5_err(context, IPROPD_RESTART, ret, "db->destroy"); krb5_warnx(context, "receive complete database, version %ld", (long)vno); return ret; } +static void +slave_status(krb5_context context, + const char *file, + const char *status, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); + + +static void +slave_status(krb5_context context, + const char *file, + const char *fmt, ...) +{ + char *status; + char *fmt2; + va_list args; + int len; + + if (asprintf(&fmt2, "%s\n", fmt) == -1 || fmt2 == NULL) { + (void) unlink(file); + return; + } + va_start(args, fmt); + len = vasprintf(&status, fmt2, args); + free(fmt2); + va_end(args); + if (len < 0 || status == NULL) { + (void) unlink(file); + return; + } + krb5_warnx(context, "slave status change: %s", status); + + rk_dumpdata(file, status, len); + free(status); +} + +static void +is_up_to_date(krb5_context context, const char *file, + kadm5_server_context *server_context) +{ + krb5_error_code ret; + char buf[80]; + ret = krb5_format_time(context, time(NULL), buf, sizeof(buf), 1); + if (ret) { + unlink(file); + return; + } + slave_status(context, file, "up-to-date with version: %lu at %s", + (unsigned long)server_context->log_context.version, buf); +} + +static char *status_file; static char *config_file; static char *realm; static int version_flag; static int help_flag; static char *keytab_str; static char *port_str; -#ifdef SUPPORT_DETACH -static int detach_from_console = 0; -#endif +static int detach_from_console; +static int daemon_child = -1; static struct getargs args[] = { { "config-file", 'c', arg_string, &config_file, NULL, NULL }, @@ -467,14 +669,17 @@ "keytab to get authentication from", "kspec" }, { "time-lost", 0, arg_string, &server_time_lost, "time before server is considered lost", "time" }, + { "status-file", 0, arg_string, &status_file, + "file to write out status into", "file" }, { "port", 0, arg_string, &port_str, "port ipropd-slave will connect to", "port"}, -#ifdef SUPPORT_DETACH { "detach", 0, arg_flag, &detach_from_console, "detach from console", NULL }, -#endif + { "daemon-child", 0 , arg_integer, &daemon_child, + "private argument, do not use", NULL }, { "hostname", 0, arg_string, rk_UNCONST(&slave_str), "hostname of slave (if not same as hostname)", "hostname" }, + { "verbose", 0, arg_flag, &verbose, NULL, NULL }, { "version", 0, arg_flag, &version_flag, NULL, NULL }, { "help", 0, arg_flag, &help_flag, NULL, NULL } }; @@ -491,7 +696,7 @@ int main(int argc, char **argv) { - krb5_error_code ret; + krb5_error_code ret, ret2; krb5_context context; krb5_auth_context auth_context; void *kadm_handle; @@ -507,21 +712,27 @@ time_t reconnect_max; time_t reconnect; time_t before = 0; + int restarter_fd = -1; const char *master; setprogname(argv[0]); - if(getarg(args, num_args, argc, argv, &optidx)) + if (getarg(args, num_args, argc, argv, &optidx)) usage(1); - if(help_flag) + if (help_flag) usage(0); - if(version_flag) { + + if (version_flag) { print_version(NULL); exit(0); } + if (detach_from_console && daemon_child == -1) + roken_detach_prep(argc, argv, "--daemon-child"); + rk_pidfile(NULL); + ret = krb5_init_context(&context); if (ret) errx (1, "krb5_init_context failed: %d", ret); @@ -551,15 +762,17 @@ master = argv[0]; -#ifdef SUPPORT_DETACH - if (detach_from_console) - daemon(0, 0); -#endif - pidfile (NULL); - krb5_openlog (context, "ipropd-slave", &log_facility); + if (status_file == NULL) { + if (asprintf(&status_file, "%s/ipropd-slave-status", hdb_db_dir(context)) < 0 || status_file == NULL) + krb5_errx(context, 1, "can't allocate status file buffer"); + } + + krb5_openlog(context, "ipropd-slave", &log_facility); krb5_set_warn_dest(context, log_facility); - ret = krb5_kt_register(context, &hdb_kt_ops); + slave_status(context, status_file, "bootstrapping"); + + ret = krb5_kt_register(context, &hdb_get_kt_ops); if(ret) krb5_err(context, 1, ret, "krb5_kt_register"); @@ -567,6 +780,8 @@ if (time_before_lost < 0) krb5_errx (context, 1, "couldn't parse time: %s", server_time_lost); + slave_status(context, status_file, "getting credentials from keytab/database"); + memset(&conf, 0, sizeof(conf)); if(realm) { conf.mask |= KADM5_CONFIG_REALM; @@ -583,6 +798,8 @@ server_context = (kadm5_server_context *)kadm_handle; + slave_status(context, status_file, "creating log file"); + ret = kadm5_log_init (server_context); if (ret) krb5_err (context, 1, ret, "kadm5_log_init"); @@ -605,10 +822,26 @@ 10, &backoff); reconnect = reconnect_min; + slave_status(context, status_file, "ipropd-slave started"); + + roken_detach_finish(NULL, daemon_child); + restarter_fd = restarter(context, NULL); + while (!exit_flag) { + struct timeval to; time_t now, elapsed; + fd_set readset; int connected = FALSE; +#ifndef NO_LIMIT_FD_SETSIZE + if (restarter_fd >= FD_SETSIZE) + krb5_errx(context, IPROPD_RESTART, "fd too large"); +#endif + + FD_ZERO(&readset); + if (restarter_fd > -1) + FD_SET(restarter_fd, &readset); + now = time(NULL); elapsed = now - before; @@ -616,10 +849,17 @@ time_t left = reconnect - elapsed; krb5_warnx(context, "sleeping %d seconds before " "retrying to connect", (int)left); - sleep(left); + to.tv_sec = left; + to.tv_usec = 0; + if (select(restarter_fd + 1, &readset, NULL, NULL, &to) == 1) { + exit_flag = SIGTERM; + continue; + } } before = now; + slave_status(context, status_file, "connecting to master: %s\n", master); + master_fd = connect_to_master (context, master, port_str); if (master_fd < 0) goto retry; @@ -632,6 +872,8 @@ krb5_cc_destroy(context, ccache); get_creds(context, keytab_str, &ccache, master); } + if (verbose) + krb5_warnx(context, "authenticating to master"); ret = krb5_sendauth (context, &auth_context, &master_fd, IPROP_VERSION, NULL, server, AP_OPTS_MUTUAL_REQUIRED, NULL, NULL, @@ -644,32 +886,41 @@ krb5_warnx(context, "ipropd-slave started at version: %ld", (long)server_context->log_context.version); - ret = ihave (context, auth_context, master_fd, - server_context->log_context.version); + ret = ihave(context, auth_context, master_fd, + server_context->log_context.version); if (ret) goto retry; connected = TRUE; + if (verbose) + krb5_warnx(context, "connected to master"); + + slave_status(context, status_file, "connected to master, waiting instructions"); + while (connected && !exit_flag) { krb5_data out; krb5_storage *sp; - int32_t tmp; - fd_set readset; - struct timeval to; + uint32_t tmp; + int max_fd; #ifndef NO_LIMIT_FD_SETSIZE if (master_fd >= FD_SETSIZE) - krb5_errx (context, 1, "fd too large"); + krb5_errx(context, IPROPD_RESTART, "fd too large"); + if (restarter_fd >= FD_SETSIZE) + krb5_errx(context, IPROPD_RESTART, "fd too large"); + max_fd = max(restarter_fd, master_fd); #endif FD_ZERO(&readset); FD_SET(master_fd, &readset); + if (restarter_fd != -1) + FD_SET(restarter_fd, &readset); to.tv_sec = time_before_lost; to.tv_usec = 0; - ret = select (master_fd + 1, + ret = select (max_fd + 1, &readset, NULL, NULL, &to); if (ret < 0) { if (errno == EINTR) @@ -677,35 +928,104 @@ else krb5_err (context, 1, errno, "select"); } - if (ret == 0) - krb5_errx (context, 1, "server didn't send a message " - "in %d seconds", time_before_lost); + if (ret == 0) { + krb5_warnx(context, "server didn't send a message " + "in %d seconds", time_before_lost); + connected = FALSE; + continue; + } + + if (restarter_fd > -1 && FD_ISSET(restarter_fd, &readset)) { + if (verbose) + krb5_warnx(context, "slave restarter exited"); + exit_flag = SIGTERM; + } + + if (!FD_ISSET(master_fd, &readset)) + continue; + + if (verbose) + krb5_warnx(context, "message from master"); ret = krb5_read_priv_message(context, auth_context, &master_fd, &out); if (ret) { - krb5_warn (context, ret, "krb5_read_priv_message"); + krb5_warn(context, ret, "krb5_read_priv_message"); connected = FALSE; continue; } sp = krb5_storage_from_mem (out.data, out.length); - krb5_ret_int32 (sp, &tmp); + if (sp == NULL) + krb5_err(context, IPROPD_RESTART, errno, "krb5_storage_from_mem"); + ret = krb5_ret_uint32(sp, &tmp); + if (ret == HEIM_ERR_EOF) { + krb5_warn(context, ret, "master sent zero-length message"); + connected = FALSE; + continue; + } + if (ret != 0) { + krb5_warn(context, ret, "couldn't read master's message"); + connected = FALSE; + continue; + } + + ret = kadm5_log_init(server_context); + if (ret) { + krb5_err(context, IPROPD_RESTART, ret, "kadm5_log_init while " + "handling a message from the master"); + } switch (tmp) { case FOR_YOU : - receive (context, sp, server_context); - ret = ihave (context, auth_context, master_fd, - server_context->log_context.version); - if (ret) + if (verbose) + krb5_warnx(context, "master sent us diffs"); + ret2 = receive(context, sp, server_context); + if (ret2) + krb5_warn(context, ret2, + "receive from ipropd-master had errors"); + ret = ihave(context, auth_context, master_fd, + server_context->log_context.version); + if (ret || ret2) connected = FALSE; + + /* + * If it returns an error, receive() may nonetheless + * have committed some entries successfully, so we must + * update the slave_status even if there were errors. + */ + is_up_to_date(context, status_file, server_context); break; case TELL_YOU_EVERYTHING : - ret = receive_everything (context, master_fd, server_context, - auth_context); - if (ret) + if (verbose) + krb5_warnx(context, "master sent us a full dump"); + ret = receive_everything(context, master_fd, server_context, + auth_context); + if (ret == 0) { + ret = ihave(context, auth_context, master_fd, + server_context->log_context.version); + } + if (ret) connected = FALSE; + else + is_up_to_date(context, status_file, server_context); break; case ARE_YOU_THERE : - send_im_here (context, master_fd, auth_context); + if (verbose) + krb5_warnx(context, "master sent us a ping"); + is_up_to_date(context, status_file, server_context); + /* + * We used to send an I_HAVE here. But the master may send + * ARE_YOU_THERE messages in response to local, possibly- + * transient errors, and if that happens and we respond with an + * I_HAVE then we'll loop hard if the error was not transient. + * + * So we don't ihave() here. + */ + send_im_here(context, master_fd, auth_context); + break; + case YOU_HAVE_LAST_VERSION: + if (verbose) + krb5_warnx(context, "master tells us we are up to date"); + is_up_to_date(context, status_file, server_context); break; case NOW_YOU_HAVE : case I_HAVE : @@ -719,9 +1039,12 @@ krb5_data_free (&out); } + + slave_status(context, status_file, "disconnected from master"); retry: if (connected == FALSE) krb5_warnx (context, "disconnected for server"); + if (exit_flag) krb5_warnx (context, "got an exit signal"); @@ -729,8 +1052,15 @@ close(master_fd); reconnect += backoff; - if (reconnect > reconnect_max) + if (reconnect > reconnect_max) { + slave_status(context, status_file, "disconnected from master for a long time"); reconnect = reconnect_max; + } + } + + if (status_file) { + /* XXX It'd be better to leave it saying we're not here */ + unlink(status_file); } if (0); diff --git a/crypto/heimdal/lib/kadm5/kadm5-private.h b/crypto/heimdal/lib/kadm5/kadm5-private.h --- a/crypto/heimdal/lib/kadm5/kadm5-private.h +++ b/crypto/heimdal/lib/kadm5/kadm5-private.h @@ -52,11 +52,10 @@ _kadm5_error_code (kadm5_ret_t /*code*/); int -_kadm5_exists_keys ( +_kadm5_exists_keys_hist ( Key */*keys1*/, int /*len1*/, - Key */*keys2*/, - int /*len2*/); + HDB_Ext_KeySet */*hist_keys*/); void _kadm5_free_keys ( @@ -94,6 +93,8 @@ _kadm5_set_keys ( kadm5_server_context */*context*/, hdb_entry */*ent*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, const char */*password*/); kadm5_ret_t @@ -114,6 +115,8 @@ _kadm5_set_keys_randomly ( kadm5_server_context */*context*/, hdb_entry */*ent*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, krb5_keyblock **/*new_keys*/, int */*n_keys*/); @@ -147,12 +150,16 @@ kadm5_c_chpass_principal ( void */*server_handle*/, krb5_principal /*princ*/, + int /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, const char */*password*/); kadm5_ret_t kadm5_c_chpass_principal_with_key ( void */*server_handle*/, krb5_principal /*princ*/, + int /*keepold*/, int /*n_key_data*/, krb5_key_data */*key_data*/); @@ -161,6 +168,8 @@ void */*server_handle*/, kadm5_principal_ent_t /*princ*/, uint32_t /*mask*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, const char */*password*/); kadm5_ret_t @@ -266,6 +275,9 @@ kadm5_c_randkey_principal ( void */*server_handle*/, krb5_principal /*princ*/, + krb5_boolean /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, krb5_keyblock **/*new_keys*/, int */*n_keys*/); @@ -278,7 +290,7 @@ kadm5_ret_t kadm5_log_create ( kadm5_server_context */*context*/, - hdb_entry */*ent*/); + hdb_entry */*entry*/); kadm5_ret_t kadm5_log_delete ( @@ -286,56 +298,97 @@ krb5_principal /*princ*/); kadm5_ret_t -kadm5_log_end (kadm5_server_context */*context*/); +kadm5_log_end (kadm5_server_context */*server_context*/); kadm5_ret_t kadm5_log_foreach ( kadm5_server_context */*context*/, - void (*/*func*/)(kadm5_server_context *server_context, uint32_t ver, time_t timestamp, enum kadm_ops op, uint32_t len, krb5_storage *, void *), + enum kadm_iter_opts /*iter_opts*/, + off_t */*off_lastp*/, + kadm5_ret_t (*/*func*/)(kadm5_server_context *server_context, uint32_t ver, time_t timestamp, enum kadm_ops op, uint32_t len, krb5_storage *sp, void *ctx), void */*ctx*/); kadm5_ret_t kadm5_log_get_version ( - kadm5_server_context */*context*/, + kadm5_server_context */*server_context*/, uint32_t */*ver*/); kadm5_ret_t kadm5_log_get_version_fd ( + kadm5_server_context */*server_context*/, int /*fd*/, - uint32_t */*ver*/); + int /*which*/, + uint32_t */*ver*/, + uint32_t */*tstamp*/); -krb5_storage * -kadm5_log_goto_end (int /*fd*/); +kadm5_ret_t +kadm5_log_goto_end ( + kadm5_server_context */*server_context*/, + krb5_storage */*sp*/); + +kadm5_ret_t +kadm5_log_goto_first ( + kadm5_server_context */*server_context*/, + krb5_storage */*sp*/); kadm5_ret_t -kadm5_log_init (kadm5_server_context */*context*/); +kadm5_log_init (kadm5_server_context */*server_context*/); + +kadm5_ret_t +kadm5_log_init_nb (kadm5_server_context */*server_context*/); + +kadm5_ret_t +kadm5_log_init_nolock (kadm5_server_context */*server_context*/); + +kadm5_ret_t +kadm5_log_init_sharedlock ( + kadm5_server_context */*server_context*/, + int /*lock_flags*/); kadm5_ret_t kadm5_log_modify ( kadm5_server_context */*context*/, - hdb_entry */*ent*/, + hdb_entry */*entry*/, uint32_t /*mask*/); kadm5_ret_t -kadm5_log_nop (kadm5_server_context */*context*/); +kadm5_log_next ( + krb5_context /*context*/, + krb5_storage */*sp*/, + uint32_t */*verp*/, + time_t */*tstampp*/, + enum kadm_ops */*opp*/, + uint32_t */*lenp*/); + +kadm5_ret_t +kadm5_log_nop ( + kadm5_server_context */*context*/, + enum kadm_nop_type /*nop_type*/); kadm5_ret_t kadm5_log_previous ( krb5_context /*context*/, krb5_storage */*sp*/, - uint32_t */*ver*/, - time_t */*timestamp*/, - enum kadm_ops */*op*/, - uint32_t */*len*/); + uint32_t */*verp*/, + time_t */*tstampp*/, + enum kadm_ops */*opp*/, + uint32_t */*lenp*/); kadm5_ret_t -kadm5_log_reinit (kadm5_server_context */*context*/); +kadm5_log_recover ( + kadm5_server_context */*context*/, + enum kadm_recover_mode /*mode*/); + +kadm5_ret_t +kadm5_log_reinit ( + kadm5_server_context */*server_context*/, + uint32_t /*vno*/); kadm5_ret_t kadm5_log_rename ( kadm5_server_context */*context*/, krb5_principal /*source*/, - hdb_entry */*ent*/); + hdb_entry */*entry*/); kadm5_ret_t kadm5_log_replay ( @@ -350,6 +403,9 @@ kadm5_server_context */*context*/, uint32_t /*vno*/); +void +kadm5_log_signal_master (kadm5_server_context */*context*/); + const char * kadm5_log_signal_socket (krb5_context /*context*/); @@ -360,24 +416,32 @@ struct addrinfo **/*ret_addrs*/); kadm5_ret_t -kadm5_log_truncate (kadm5_server_context */*server_context*/); +kadm5_log_truncate ( + kadm5_server_context */*context*/, + size_t /*keep*/, + size_t /*maxbytes*/); kadm5_ret_t kadm5_s_chpass_principal ( void */*server_handle*/, krb5_principal /*princ*/, + int /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, const char */*password*/); kadm5_ret_t kadm5_s_chpass_principal_cond ( void */*server_handle*/, krb5_principal /*princ*/, + int /*keepold*/, const char */*password*/); kadm5_ret_t kadm5_s_chpass_principal_with_key ( void */*server_handle*/, krb5_principal /*princ*/, + int /*keepold*/, int /*n_key_data*/, krb5_key_data */*key_data*/); @@ -386,6 +450,8 @@ void */*server_handle*/, kadm5_principal_ent_t /*princ*/, uint32_t /*mask*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, const char */*password*/); kadm5_ret_t @@ -497,6 +563,9 @@ kadm5_s_randkey_principal ( void */*server_handle*/, krb5_principal /*princ*/, + krb5_boolean /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, krb5_keyblock **/*new_keys*/, int */*n_keys*/); @@ -506,4 +575,14 @@ krb5_principal /*source*/, krb5_principal /*target*/); +kadm5_ret_t +kadm5_s_setkey_principal_3 ( + void */*server_handle*/, + krb5_principal /*princ*/, + krb5_boolean /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, + krb5_keyblock */*keyblocks*/, + int /*n_keys*/); + #endif /* __kadm5_private_h__ */ diff --git a/crypto/heimdal/lib/kadm5/kadm5-protos.h b/crypto/heimdal/lib/kadm5/kadm5-protos.h --- a/crypto/heimdal/lib/kadm5/kadm5-protos.h +++ b/crypto/heimdal/lib/kadm5/kadm5-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __kadm5_protos_h__ #define __kadm5_protos_h__ +#ifndef DOXY #include @@ -34,6 +35,11 @@ krb5_context /*context*/, const char */*check_library*/); +int +kadm5_all_keys_are_bogus ( + size_t /*n_keys*/, + krb5_key_data */*keys*/); + const char * kadm5_check_password_quality ( krb5_context /*context*/, @@ -46,6 +52,15 @@ krb5_principal /*princ*/, const char */*password*/); +kadm5_ret_t +kadm5_chpass_principal_3 ( + void */*server_handle*/, + krb5_principal /*princ*/, + krb5_boolean /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, + const char */*password*/); + kadm5_ret_t kadm5_chpass_principal_with_key ( void */*server_handle*/, @@ -53,6 +68,20 @@ int /*n_key_data*/, krb5_key_data */*key_data*/); +kadm5_ret_t +kadm5_chpass_principal_with_key_3 ( + void */*server_handle*/, + krb5_principal /*princ*/, + int /*keepold*/, + int /*n_key_data*/, + krb5_key_data */*key_data*/); + +kadm5_ret_t +kadm5_create_policy ( + void */*server_handle*/, + kadm5_policy_ent_t /*policy*/, + long /*mask*/); + kadm5_ret_t kadm5_create_principal ( void */*server_handle*/, @@ -60,6 +89,46 @@ uint32_t /*mask*/, const char */*password*/); +kadm5_ret_t +kadm5_create_principal_3 ( + void */*server_handle*/, + kadm5_principal_ent_t /*princ*/, + uint32_t /*mask*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, + char */*password*/); + +/** + * Extract decrypted keys from kadm5_principal_ent_t object. Mostly a + * no-op for Heimdal because we fetch the entry with decrypted keys. + * Sadly this is not fully a no-op, as we have to allocate a copy. + * + * @server_handle is the kadm5 handle + * @entry is the HDB entry for the principal in question + * @ktype is the enctype to get a key for, or -1 to get the first one + * @stype is the salttype to get a key for, or -1 to get the first match + * @kvno is the kvno to search for, or -1 to get the first match (highest kvno) + * @keyblock is where the key will be placed + * @keysalt, if not NULL, is where the salt will be placed + * @kvnop, if not NULL, is where the selected kvno will be placed + */ + +kadm5_ret_t +kadm5_decrypt_key ( + void */*server_handle*/, + kadm5_principal_ent_t /*entry*/, + int32_t /*ktype*/, + int32_t /*stype*/, + int32_t /*kvno*/, + krb5_keyblock */*keyblock*/, + krb5_keysalt */*keysalt*/, + int */*kvnop*/); + +kadm5_ret_t +kadm5_delete_policy ( + void */*server_handle*/, + char */*name*/); + kadm5_ret_t kadm5_delete_principal ( void */*server_handle*/, @@ -83,11 +152,27 @@ char **/*names*/, int */*count*/); +kadm5_ret_t +kadm5_free_policy_ent (kadm5_policy_ent_t /*ent*/); + void kadm5_free_principal_ent ( void */*server_handle*/, kadm5_principal_ent_t /*princ*/); +kadm5_ret_t +kadm5_get_policies ( + void */*server_handle*/, + char */*exp*/, + char ***/*pols*/, + int */*count*/); + +kadm5_ret_t +kadm5_get_policy ( + void */*server_handle*/, + char */*policy*/, + kadm5_policy_ent_t /*ent*/); + kadm5_ret_t kadm5_get_principal ( void */*server_handle*/, @@ -170,6 +255,15 @@ unsigned long /*api_version*/, void **/*server_handle*/); +kadm5_ret_t +kadm5_lock (void */*server_handle*/); + +kadm5_ret_t +kadm5_modify_policy ( + void */*server_handle*/, + kadm5_policy_ent_t /*policy*/, + uint32_t /*mask*/); + kadm5_ret_t kadm5_modify_principal ( void */*server_handle*/, @@ -183,6 +277,16 @@ krb5_keyblock **/*new_keys*/, int */*n_keys*/); +kadm5_ret_t +kadm5_randkey_principal_3 ( + void */*server_handle*/, + krb5_principal /*princ*/, + krb5_boolean /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, + krb5_keyblock **/*new_keys*/, + int */*n_keys*/); + kadm5_ret_t kadm5_rename_principal ( void */*server_handle*/, @@ -210,12 +314,50 @@ krb5_storage */*sp*/, krb5_tl_data */*tl*/); +/** + * This function is allows the caller to set new keys for a principal. + * This is a trivial wrapper around kadm5_setkey_principal_3(). + */ + +kadm5_ret_t +kadm5_setkey_principal ( + void */*server_handle*/, + krb5_principal /*princ*/, + krb5_keyblock */*new_keys*/, + int /*n_keys*/); + +/** + * This function is allows the caller to set new keys for a principal. + * This is a simple wrapper around kadm5_get_principal() and + * kadm5_modify_principal(). + */ + +kadm5_ret_t +kadm5_setkey_principal_3 ( + void */*server_handle*/, + krb5_principal /*princ*/, + krb5_boolean /*keepold*/, + int /*n_ks_tuple*/, + krb5_key_salt_tuple */*ks_tuple*/, + krb5_keyblock */*keyblocks*/, + int /*n_keys*/); + void kadm5_setup_passwd_quality_check ( krb5_context /*context*/, const char */*check_library*/, const char */*check_function*/); +int +kadm5_some_keys_are_bogus ( + size_t /*n_keys*/, + krb5_key_data */*keys*/); + +kadm5_ret_t +kadm5_store_fake_key_data ( + krb5_storage */*sp*/, + krb5_key_data */*key*/); + kadm5_ret_t kadm5_store_key_data ( krb5_storage */*sp*/, @@ -232,13 +374,22 @@ kadm5_principal_ent_t /*princ*/, uint32_t /*mask*/); +kadm5_ret_t +kadm5_store_principal_ent_nokeys ( + krb5_storage */*sp*/, + kadm5_principal_ent_t /*princ*/); + kadm5_ret_t kadm5_store_tl_data ( krb5_storage */*sp*/, krb5_tl_data */*tl*/); +kadm5_ret_t +kadm5_unlock (void */*server_handle*/); + #ifdef __cplusplus } #endif +#endif /* DOXY */ #endif /* __kadm5_protos_h__ */ diff --git a/crypto/heimdal/lib/kadm5/kadm5_err.et b/crypto/heimdal/lib/kadm5/kadm5_err.et --- a/crypto/heimdal/lib/kadm5/kadm5_err.et +++ b/crypto/heimdal/lib/kadm5/kadm5_err.et @@ -57,3 +57,13 @@ error_code BAD_TL_TYPE, "Invalid tagged data list element type" error_code MISSING_CONF_PARAMS, "Required parameters in kdc.conf missing" error_code BAD_SERVER_NAME, "Bad krb5 admin server hostname" +error_code KS_TUPLE_NOSUPP, "Key/salt tuples not supported by this function" +error_code SETKEY3_ETYPE_MISMATCH, "Key/salt tuples don't match keys" +error_code DECRYPT_USAGE_NOSUPP, "Given usage of kadm5_decrypt() not supported" +error_code POLICY_OP_NOSUPP, "Policy operations not supported" +error_code KEEPOLD_NOSUPP, "Keep old keys option not supported" +error_code AUTH_GET_KEYS, "Operation requires `get-keys' privilege" +error_code ALREADY_LOCKED, "Database already locked" +error_code NOT_LOCKED, "Database not locked" +error_code LOG_CORRUPT, "Incremental propagation log got corrupted" +error_code LOG_NEEDS_UPGRADE, "Incremental propagation log must be upgraded" diff --git a/crypto/heimdal/lib/kadm5/kadm5_locl.h b/crypto/heimdal/lib/kadm5/kadm5_locl.h --- a/crypto/heimdal/lib/kadm5/kadm5_locl.h +++ b/crypto/heimdal/lib/kadm5/kadm5_locl.h @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -66,6 +67,12 @@ #ifdef HAVE_SYS_SOCKET_H #include #endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_TCP_H +#include +#endif #ifdef HAVE_SYS_UN_H #include #endif @@ -73,12 +80,12 @@ #include #endif #include +#include #include "admin.h" #include "kadm5_err.h" #include #include #include #include "private.h" -#include "fbsd_ossl_provider.h" #endif /* __KADM5_LOCL_H__ */ diff --git a/crypto/heimdal/lib/kadm5/kadm5_pwcheck.cat3 b/crypto/heimdal/lib/kadm5/kadm5_pwcheck.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/kadm5_pwcheck.cat3 @@ -0,0 +1,87 @@ +KADM5_PWCHECK(3) BSD Library Functions Manual KADM5_PWCHECK(3) + +NAME + krb5_pwcheck, kadm5_setup_passwd_quality_check, + kadm5_add_passwd_quality_verifier, kadm5_check_password_quality -- Heim- + dal warning and error functions + +LIBRARY + Kerberos 5 Library (libkadm5srv, -lkadm5srv) + +SYNOPSIS + #include  + #include  + + void + kadm5_setup_passwd_quality_check(krb5_context context, + const char *check_library, const char *check_function); + + krb5_error_code + kadm5_add_passwd_quality_verifier(krb5_context context, + const char *check_library); + + const char * + kadm5_check_password_quality(krb5_context context, + krb5_principal principal, krb5_data *pwd_data); + + int + (*kadm5_passwd_quality_check_func)(krb5_context context, + krb5_principal principal, krb5_data *password, const char *tuning, + char *message, size_t length); + +DESCRIPTION + These functions perform the quality check for the heimdal database li- + brary. + + There are two versions of the shared object API; the old version (0) is + deprecated, but still supported. The new version (1) supports multiple + password quality checking policies in the same shared object. See below + for details. + + The password quality checker will run all policies that are configured by + the user. If any policy rejects the password, the password will be re- + jected. + + Policy names are of the form `module-name:policy-name' or, if the the + policy name is unique enough, just `policy-name'. + +IMPLEMENTING A PASSWORD QUALITY CHECKING SHARED OBJECT + (This refers to the version 1 API only.) + + Module shared objects may conveniently be compiled and linked with + libtool(1). An object needs to export a symbol called + `kadm5_password_verifier' of the type struct kadm5_pw_policy_verifier. + + Its name and vendor fields should contain the obvious information. name + must match the `module-name' portion of the policy name (the part before + the colon), if the policy name contains a colon, or the policy will not + be run. version should be KADM5_PASSWD_VERSION_V1. + + funcs contains an array of struct kadm5_pw_policy_check_func structures + that is terminated with an entry whose name component is NULL. The name + field of the array must match the `policy-name' portion of a policy name + (the part after the colon, or the complete policy name if there is no + colon) specified by the user or the policy will not be run. The func + fields of the array elements are functions that are exported by the mod- + ule to be called to check the password. They get the following argu- + ments: the Kerberos context, principal, password, a tuning parameter, + and a pointer to a message buffer and its length. The tuning parameter + for the quality check function is currently always NULL. If the password + is acceptable, the function returns zero. Otherwise it returns non-zero + and fills in the message buffer with an appropriate explanation. + +RUNNING THE CHECKS + kadm5_setup_passwd_quality_check sets up type 0 checks. It sets up all + type 0 checks defined in krb5.conf(5) if called with the last two argu- + ments null. + + kadm5_add_passwd_quality_verifier sets up type 1 checks. It sets up all + type 1 tests defined in krb5.conf(5) if called with a null second argu- + ment. kadm5_check_password_quality runs the checks in the order in which + they are defined in krb5.conf(5) and the order in which they occur in a + module's funcs array until one returns non-zero. + +SEE ALSO + libtool(1), krb5(3), krb5.conf(5) + +HEIMDAL February 29, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/kadm5/keys.c b/crypto/heimdal/lib/kadm5/keys.c --- a/crypto/heimdal/lib/kadm5/keys.c +++ b/crypto/heimdal/lib/kadm5/keys.c @@ -63,16 +63,18 @@ } } + /* * return 1 if any key in `keys1, len1' exists in `keys2, len2' */ - -int +static int _kadm5_exists_keys(Key *keys1, int len1, Key *keys2, int len2) { - int i, j; + size_t i, j; + size_t optimize; for (i = 0; i < len1; ++i) { + optimize = 0; for (j = 0; j < len2; j++) { if ((keys1[i].salt != NULL && keys2[j].salt == NULL) || (keys1[i].salt == NULL && keys2[j].salt != NULL)) @@ -89,6 +91,7 @@ } if (keys1[i].key.keytype != keys2[j].key.keytype) continue; + optimize = 1; if (keys1[i].key.keyvalue.length != keys2[j].key.keyvalue.length) continue; if (memcmp (keys1[i].key.keyvalue.data, keys2[j].key.keyvalue.data, @@ -97,6 +100,33 @@ return 1; } + + /* + * Optimization: no need to check all of keys1[] if one there + * was one key in keys2[] with matching enctype and salt but not + * matching key. Assumption: all keys in keys1[] and keys2[] + * are output by string2key. + */ + if (optimize) + return 0; } return 0; } + +/* + * return 1 if any key in `keys1, len1' exists in hist_keys + */ +int +_kadm5_exists_keys_hist(Key *keys1, int len1, HDB_Ext_KeySet *hist_keys) +{ + size_t i; + + for (i = 0; i < hist_keys->len; i++) { + if (_kadm5_exists_keys(keys1, len1, + hist_keys->val[i].keys.val, + hist_keys->val[i].keys.len)) + return 1; + } + + return 0; +} diff --git a/crypto/heimdal/lib/kadm5/libkadm5srv-exports.def b/crypto/heimdal/lib/kadm5/libkadm5srv-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/libkadm5srv-exports.def @@ -0,0 +1,86 @@ +EXPORTS +;! kadm5_ad_init_with_password +;! kadm5_ad_init_with_password_ctx + kadm5_add_passwd_quality_verifier + kadm5_all_keys_are_bogus + kadm5_check_password_quality + kadm5_chpass_principal + kadm5_chpass_principal_3 + kadm5_chpass_principal_with_key + kadm5_chpass_principal_with_key_3 + kadm5_create_policy + kadm5_create_principal + kadm5_create_principal_3 + kadm5_decrypt_key + kadm5_delete_policy + kadm5_delete_principal + kadm5_destroy + kadm5_flush + kadm5_free_key_data + kadm5_free_name_list + kadm5_free_policy_ent + kadm5_free_principal_ent + kadm5_get_policies + kadm5_get_policy + kadm5_get_principal + kadm5_get_principals + kadm5_get_privs + kadm5_init_with_creds + kadm5_init_with_creds_ctx + kadm5_init_with_password + kadm5_init_with_password_ctx + kadm5_init_with_skey + kadm5_init_with_skey_ctx + kadm5_lock + kadm5_modify_policy + kadm5_modify_principal + kadm5_randkey_principal + kadm5_randkey_principal_3 + kadm5_rename_principal + kadm5_ret_key_data + kadm5_ret_principal_ent + kadm5_ret_principal_ent_mask + kadm5_ret_tl_data + kadm5_setkey_principal + kadm5_setkey_principal_3 + kadm5_setup_passwd_quality_check + kadm5_some_keys_are_bogus + kadm5_store_key_data + kadm5_store_principal_ent + kadm5_store_principal_ent_mask + kadm5_store_principal_ent_nokeys + kadm5_store_tl_data + kadm5_unlock + kadm5_s_init_with_password_ctx + kadm5_s_init_with_password + kadm5_s_init_with_skey_ctx + kadm5_s_init_with_skey + kadm5_s_init_with_creds_ctx + kadm5_s_init_with_creds + kadm5_s_chpass_principal_cond + kadm5_log_set_version + kadm5_log_signal_master +;! kadm5_log_signal_socket + kadm5_log_signal_socket_info ;! + kadm5_log_previous + kadm5_log_goto_first + kadm5_log_goto_end + kadm5_log_foreach + kadm5_log_get_version_fd + kadm5_log_get_version + kadm5_log_recover + kadm5_log_replay + kadm5_log_end + kadm5_log_reinit + kadm5_log_init + kadm5_log_init_nb + kadm5_log_init_nolock + kadm5_log_init_sharedlock + kadm5_log_next + kadm5_log_nop + kadm5_log_truncate + kadm5_log_modify + _kadm5_acl_check_permission + _kadm5_unmarshal_params + _kadm5_s_get_db + _kadm5_privs_to_string diff --git a/crypto/heimdal/lib/kadm5/libkadm5srv-version.rc b/crypto/heimdal/lib/kadm5/libkadm5srv-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/libkadm5srv-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_DLL +#define RC_FILE_DESC_0409 "Heimdal Kerberos v5 Administration Library" +#define RC_FILE_ORIG_0409 "libkadm5srv.dll" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/kadm5/log.c b/crypto/heimdal/lib/kadm5/log.c --- a/crypto/heimdal/lib/kadm5/log.c +++ b/crypto/heimdal/lib/kadm5/log.c @@ -37,50 +37,516 @@ RCSID("$Id$"); /* - * A log record consists of: + * A log consists of a sequence of records of this form: * - * version number 4 bytes - * time in seconds 4 bytes - * operation (enum kadm_ops) 4 bytes - * length of record 4 bytes - * data... n bytes - * length of record 4 bytes - * version number 4 bytes + * version number 4 bytes -\ + * time in seconds 4 bytes +> preamble --+> header + * operation (enum kadm_ops) 4 bytes -/ / + * n, length of payload 4 bytes --------------+ + * PAYLOAD DATA... n bytes + * n, length of payload 4 bytes ----------------+> trailer + * version number 4 bytes ->postamble ---/ * + * I.e., records have a header and a trailer so that knowing the offset + * of an record's start or end one can traverse the log forwards and + * backwards. + * + * The log always starts with a nop record (uber record) that contains the + * offset (8 bytes) of the first unconfirmed record (typically EOF), and the + * version number and timestamp of the preceding last confirmed record: + * + * offset of next new record 8 bytes + * last record time 4 bytes + * last record version number 4 bytes + * + * When an iprop slave receives a complete database, it saves that version as + * the last confirmed version, without writing any other records to the log. We + * use that version as the basis for further updates. + * + * kadm5 write operations are done in this order: + * + * - replay unconfirmed log records + * - write (append) and fsync() the log record for the kadm5 update + * - update the HDB (which includes fsync() or moral equivalent) + * - update the log uber record to mark the log record written as + * confirmed (not fsync()ed) + * + * This makes it possible and safe to seek to the logical end of the log + * (that is, the end of the last confirmed record) without traversing + * the whole log forward from offset zero. Unconfirmed records (which + * -currently- should never be more than one) can then be found (and + * rolled forward) by traversing forward from the logical end of the + * log. The trailers make it possible to traverse the log backwards + * from the logical end. + * + * This also makes the log + the HDB a two-phase commit with + * roll-forward system. + * + * HDB entry exists and HDB entry does not exist errors occurring during + * replay of unconfirmed records are ignored. This is because the + * corresponding HDB update might have completed. But also because a + * change to add aliases to a principal can fail because we don't check + * for alias conflicts before going ahead with the write operation. + * + * Non-sensical and incomplete log records found during roll-forward are + * truncated. A log record is non-sensical if its header and trailer + * don't match. + * + * Recovery (by rolling forward) occurs at the next read or write by a + * kadm5 API reader (e.g., kadmin), but not by an hdb API reader (e.g., + * the KDC). This means that, e.g., a principal rename could fail in + * between the store and the delete, and recovery might not take place + * until the next write operation. + * + * The log record payload format for create is: + * + * DER-encoded HDB_entry n bytes + * + * The log record payload format for update is: + * + * mask 4 bytes + * DER-encoded HDB_entry n-4 bytes + * + * The log record payload format for delete is: + * + * krb5_store_principal n bytes + * + * The log record payload format for rename is: + * + * krb5_store_principal m bytes (old principal name) + * DER-encoded HDB_entry n-m bytes (new record) + * + * The log record payload format for nop varies: + * + * - The zeroth record in new logs is a nop with a 16 byte payload: + * + * offset of end of last confirmed record 8 bytes + * timestamp of last confirmed record 4 bytes + * version number of last confirmed record 4 bytes + * + * - New non-zeroth nop records: + * + * nop type 4 bytes + * + * - Old nop records: + * + * version number 4 bytes + * timestamp 4 bytes + * + * Upon initialization, the log's uber record will have version 1, and + * will be followed by a nop record with version 2. The version numbers + * of additional records will be monotonically increasing. + * + * Truncation (kadm5_log_truncate()) takes some N > 0 records from the + * tail of the log and writes them to the beginning of the log after an + * uber record whose version will then be one less than the first of + * those records. + * + * On masters the log should never have more than one unconfirmed + * record, but slaves append all of a master's "diffs" and then call + * kadm5_log_recover() to recover. + */ + +/* + * HDB and log lock order on the master: + * + * 1) open and lock the HDB + * 2) open and lock the log + * 3) do something + * 4) unlock and close the log + * 5) repeat (2)..(4) if desired + * 6) unlock and close the HDB + * + * The kadmin -l lock command can be used to hold the HDB open and + * locked for multiple operations. + * + * HDB and log lock order on the slave: + * + * 1) open and lock the log + * 2) open and lock the HDB + * 3) replay entries + * 4) unlock and close the HDB + * 5) repeat (2)..(4) until signaled + * 6) unlock and close the HDB + * + * The slave doesn't want to allow other local writers, after all, thus + * the order is reversed. This means that using "kadmin -l" on a slave + * will deadlock with ipropd-slave -- don't do that. + */ + +#define LOG_HEADER_SZ ((off_t)(sizeof(uint32_t) * 4)) +#define LOG_TRAILER_SZ ((off_t)(sizeof(uint32_t) * 2)) +#define LOG_WRAPPER_SZ ((off_t)(LOG_HEADER_SZ + LOG_TRAILER_SZ)) +#define LOG_UBER_LEN ((off_t)(sizeof(uint64_t) + sizeof(uint32_t) * 2)) +#define LOG_UBER_SZ ((off_t)(LOG_WRAPPER_SZ + LOG_UBER_LEN)) + +#define LOG_NOPEEK 0 +#define LOG_DOPEEK 1 + +/* + * Read the header of the record starting at the current offset into sp. + * + * Preserves sp's offset on success if `peek', else skips the header. + * + * Preserves sp's offset on failure where possible. + */ +static kadm5_ret_t +get_header(krb5_storage *sp, int peek, uint32_t *verp, uint32_t *tstampp, + enum kadm_ops *opp, uint32_t *lenp) +{ + krb5_error_code ret; + uint32_t tstamp, op, len; + off_t off, new_off; + + if (tstampp == NULL) + tstampp = &tstamp; + if (lenp == NULL) + lenp = &len; + + *verp = 0; + *tstampp = 0; + if (opp != NULL) + *opp = kadm_nop; + *lenp = 0; + + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (off < 0) + return errno; + ret = krb5_ret_uint32(sp, verp); + if (ret == HEIM_ERR_EOF) { + (void) krb5_storage_seek(sp, off, SEEK_SET); + return HEIM_ERR_EOF; + } + if (ret) + goto log_corrupt; + ret = krb5_ret_uint32(sp, tstampp); + if (ret) + goto log_corrupt; + + /* Note: sizeof(*opp) might not == sizeof(op) */ + ret = krb5_ret_uint32(sp, &op); + if (ret) + goto log_corrupt; + if (opp != NULL) + *opp = op; + + ret = krb5_ret_uint32(sp, lenp); + if (ret) + goto log_corrupt; + + /* Restore offset if requested */ + if (peek == LOG_DOPEEK) { + new_off = krb5_storage_seek(sp, off, SEEK_SET); + if (new_off == -1) + return errno; + if (new_off != off) + return EIO; + } + + return 0; + +log_corrupt: + (void) krb5_storage_seek(sp, off, SEEK_SET); + return KADM5_LOG_CORRUPT; +} + +/* + * Seek to the start of the preceding record's header and returns its + * offset. If sp is at offset zero this sets *verp = 0 and returns 0. + * + * Does not verify the header of the previous entry. + * + * On error returns -1, setting errno (possibly to a kadm5_ret_t or + * krb5_error_code value) and preserves sp's offset where possible. */ +static off_t +seek_prev(krb5_storage *sp, uint32_t *verp, uint32_t *lenp) +{ + krb5_error_code ret; + uint32_t len, ver; + off_t off_len; + off_t off, new_off; + if (lenp == NULL) + lenp = &len; + if (verp == NULL) + verp = &ver; + + *verp = 0; + *lenp = 0; + + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (off < 0) + return off; + if (off == 0) + return 0; + + /* Check that `off' allows for the record's header and trailer */ + if (off < LOG_WRAPPER_SZ) + goto log_corrupt; + + /* Get the previous entry's length and version from its trailer */ + new_off = krb5_storage_seek(sp, -8, SEEK_CUR); + if (new_off == -1) + return -1; + if (new_off != off - 8) { + errno = EIO; + return -1; + } + ret = krb5_ret_uint32(sp, lenp); + if (ret) + goto log_corrupt; + + /* Check for overflow/sign extension */ + off_len = (off_t)*lenp; + if (off_len < 0 || *lenp != (uint32_t)off_len) + goto log_corrupt; + + ret = krb5_ret_uint32(sp, verp); + if (ret) + goto log_corrupt; + + /* Check that `off' allows for the record */ + if (off < LOG_WRAPPER_SZ + off_len) + goto log_corrupt; + + /* Seek backwards to the entry's start */ + new_off = krb5_storage_seek(sp, -(LOG_WRAPPER_SZ + off_len), SEEK_CUR); + if (new_off == -1) + return -1; + if (new_off != off - (LOG_WRAPPER_SZ + off_len)) { + errno = EIO; + return -1; + } + return new_off; + +log_corrupt: + (void) krb5_storage_seek(sp, off, SEEK_SET); + errno = KADM5_LOG_CORRUPT; + return -1; +} + +/* + * Seek to the start of the next entry's header. + * + * On error returns -1 and preserves sp's offset. + */ +static off_t +seek_next(krb5_storage *sp) +{ + krb5_error_code ret; + uint32_t ver, ver2, len, len2; + enum kadm_ops op; + uint32_t tstamp; + off_t off, off_len, new_off; + + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (off < 0) + return off; + + errno = get_header(sp, LOG_NOPEEK, &ver, &tstamp, &op, &len); + if (errno) + return -1; + + /* Check for overflow */ + off_len = len; + if (off_len < 0) + goto log_corrupt; + + new_off = krb5_storage_seek(sp, off_len, SEEK_CUR); + if (new_off == -1) { + (void) krb5_storage_seek(sp, off, SEEK_SET); + return -1; + } + if (new_off != off + LOG_HEADER_SZ + off_len) + goto log_corrupt; + ret = krb5_ret_uint32(sp, &len2); + if (ret || len2 != len) + goto log_corrupt; + ret = krb5_ret_uint32(sp, &ver2); + if (ret || ver2 != ver) + goto log_corrupt; + new_off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (new_off == -1) { + (void) krb5_storage_seek(sp, off, SEEK_SET); + return -1; + } + if (new_off != off + off_len + LOG_WRAPPER_SZ) + goto log_corrupt; + + return off + off_len + LOG_WRAPPER_SZ; + +log_corrupt: + (void) krb5_storage_seek(sp, off, SEEK_SET); + errno = KADM5_LOG_CORRUPT; + return -1; +} + +/* + * Get the version of the entry ending at the current offset into sp. + * If it is the uber record, return its nominal version instead. + * + * Returns HEIM_ERR_EOF if sp is at offset zero. + * + * Preserves sp's offset. + */ +static kadm5_ret_t +get_version_prev(krb5_storage *sp, uint32_t *verp, uint32_t *tstampp) +{ + krb5_error_code ret; + uint32_t ver, ver2, len, len2; + off_t off, prev_off, new_off; + + *verp = 0; + if (tstampp != NULL) + *tstampp = 0; + + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (off < 0) + return errno; + if (off == 0) + return HEIM_ERR_EOF; + + /* Read the trailer and seek back */ + prev_off = seek_prev(sp, &ver, &len); + if (prev_off == -1) + return errno; + + /* Uber record? Return nominal version. */ + if (prev_off == 0 && len == LOG_UBER_LEN && ver == 0) { + /* Skip 8 byte offset and 4 byte time */ + if (krb5_storage_seek(sp, LOG_HEADER_SZ + 12, SEEK_SET) + != LOG_HEADER_SZ + 12) + return errno; + ret = krb5_ret_uint32(sp, verp); + if (krb5_storage_seek(sp, 0, SEEK_SET) != 0) + return errno; + if (ret != 0) + return ret; + } else { + *verp = ver; + } + + /* Verify that the trailer matches header */ + ret = get_header(sp, LOG_NOPEEK, &ver2, tstampp, NULL, &len2); + if (ret || ver != ver2 || len != len2) + goto log_corrupt; + + /* Preserve offset */ + new_off = krb5_storage_seek(sp, off, SEEK_SET); + if (new_off == -1) + return errno; + if (new_off != off) { + errno = EIO; + return errno; + } + return 0; + +log_corrupt: + (void) krb5_storage_seek(sp, off, SEEK_SET); + return KADM5_LOG_CORRUPT; +} + +static size_t +get_max_log_size(krb5_context context) +{ + off_t n; + + /* Use database-label-specific lookup? No, ETOOHARD. */ + /* Default to 50MB max log size */ + n = krb5_config_get_int_default(context, NULL, 52428800, + "kdc", + "log-max-size", + NULL); + if (n >= 4 * (LOG_UBER_LEN + LOG_WRAPPER_SZ) && n == (size_t)n) + return (size_t)n; + return 0; +} + +static kadm5_ret_t truncate_if_needed(kadm5_server_context *); + +/* + * Get the version and timestamp metadata of either the first, or last + * confirmed entry in the log. + * + * If `which' is LOG_VERSION_UBER, then this gets the version number of the uber + * uber record which must be 0, or else we need to upgrade the log. + * + * If `which' is LOG_VERSION_FIRST, then this gets the metadata for the + * logically first entry past the uberblock, or returns HEIM_ERR_EOF if + * only the uber record is present. + * + * If `which' is LOG_VERSION_LAST, then this gets metadata for the last + * confirmed entry's version and timestamp. If only the uber record is present, + * then the version will be its "nominal" version, which may differ from its + * actual version (0). + * + * The `fd''s offset will be set to the start of the header of the entry + * identified by `which'. + */ kadm5_ret_t -kadm5_log_get_version_fd (int fd, - uint32_t *ver) +kadm5_log_get_version_fd(kadm5_server_context *server_context, int fd, + int which, uint32_t *ver, uint32_t *tstamp) { - int ret; + kadm5_ret_t ret = 0; krb5_storage *sp; - int32_t old_version; + enum kadm_ops op = kadm_get; + uint32_t len = 0; + uint32_t tmp; + + if (fd == -1) + return 0; /* /dev/null */ + + if (tstamp == NULL) + tstamp = &tmp; + + *ver = 0; + *tstamp = 0; + + sp = krb5_storage_from_fd(fd); + if (sp == NULL) + return errno ? errno : ENOMEM; + + switch (which) { + case LOG_VERSION_LAST: + ret = kadm5_log_goto_end(server_context, sp); + if (ret == 0) + ret = get_version_prev(sp, ver, tstamp); + break; + case LOG_VERSION_FIRST: + ret = kadm5_log_goto_first(server_context, sp); + if (ret == 0) + ret = get_header(sp, LOG_DOPEEK, ver, tstamp, NULL, NULL); + break; + case LOG_VERSION_UBER: + if (krb5_storage_seek(sp, 0, SEEK_SET) == 0) + ret = get_header(sp, LOG_DOPEEK, ver, tstamp, &op, &len); + else + ret = errno; + if (ret == 0 && (op != kadm_nop || len != LOG_UBER_LEN || *ver != 0)) + ret = KADM5_LOG_NEEDS_UPGRADE; + break; + default: + ret = ENOTSUP; + break; + } - ret = lseek (fd, 0, SEEK_END); - if(ret < 0) - return errno; - if(ret == 0) { - *ver = 0; - return 0; - } - sp = krb5_storage_from_fd (fd); - krb5_storage_seek(sp, -4, SEEK_CUR); - krb5_ret_int32 (sp, &old_version); - *ver = old_version; krb5_storage_free(sp); - lseek (fd, 0, SEEK_END); - return 0; + return ret; } +/* Get the version of the last confirmed entry in the log */ kadm5_ret_t -kadm5_log_get_version (kadm5_server_context *context, uint32_t *ver) +kadm5_log_get_version(kadm5_server_context *server_context, uint32_t *ver) { - return kadm5_log_get_version_fd (context->log_context.log_fd, ver); + return kadm5_log_get_version_fd(server_context, + server_context->log_context.log_fd, + LOG_VERSION_LAST, ver, NULL); } +/* Sets the version in the context, but NOT in the log */ kadm5_ret_t -kadm5_log_set_version (kadm5_server_context *context, uint32_t vno) +kadm5_log_set_version(kadm5_server_context *context, uint32_t vno) { kadm5_log_context *log_context = &context->log_context; @@ -88,187 +554,439 @@ return 0; } -kadm5_ret_t -kadm5_log_init (kadm5_server_context *context) +/* + * Open the log and setup server_context->log_context + */ +static kadm5_ret_t +log_open(kadm5_server_context *server_context, int lock_mode) { - int fd; + int fd = -1; + int lock_it = 0; + int lock_nb = 0; + int oflags = O_RDWR; kadm5_ret_t ret; - kadm5_log_context *log_context = &context->log_context; + kadm5_log_context *log_context = &server_context->log_context; - if (log_context->log_fd != -1) - return 0; - fd = open (log_context->log_file, O_RDWR | O_CREAT, 0600); - if (fd < 0) { - ret = errno; - krb5_set_error_message(context->context, ret, "kadm5_log_init: open %s", - log_context->log_file); - return ret; + if (lock_mode & LOCK_NB) { + lock_mode &= ~LOCK_NB; + lock_nb = LOCK_NB; } - if (flock (fd, LOCK_EX) < 0) { - ret = errno; - krb5_set_error_message(context->context, ret, "kadm5_log_init: flock %s", - log_context->log_file); - close (fd); - return errno; + + if (lock_mode == log_context->lock_mode && log_context->log_fd != -1) + return 0; + + if (strcmp(log_context->log_file, "/dev/null") == 0) { + /* log_context->log_fd should be -1 here */ + return 0; } - ret = kadm5_log_get_version_fd (fd, &log_context->version); - if (ret) + if (log_context->log_fd != -1) { + /* Lock or change lock */ + fd = log_context->log_fd; + if (lseek(fd, 0, SEEK_SET) == -1) + return errno; + lock_it = (lock_mode != log_context->lock_mode); + } else { + /* Open and lock */ + if (lock_mode != LOCK_UN) + oflags |= O_CREAT; + fd = open(log_context->log_file, oflags, 0600); + if (fd < 0) { + ret = errno; + krb5_set_error_message(server_context->context, ret, + "log_open: open %s", log_context->log_file); + return ret; + } + lock_it = (lock_mode != LOCK_UN); + } + if (lock_it && flock(fd, lock_mode | lock_nb) < 0) { + ret = errno; + krb5_set_error_message(server_context->context, ret, + "log_open: flock %s", log_context->log_file); + if (fd != log_context->log_fd) + (void) close(fd); return ret; + } + + log_context->log_fd = fd; + log_context->lock_mode = lock_mode; + log_context->read_only = (lock_mode != LOCK_EX); - log_context->log_fd = fd; return 0; } -kadm5_ret_t -kadm5_log_reinit (kadm5_server_context *context) +/* + * Open the log and setup server_context->log_context + */ +static kadm5_ret_t +log_init(kadm5_server_context *server_context, int lock_mode) { int fd; - kadm5_log_context *log_context = &context->log_context; + struct stat st; + uint32_t vno; + size_t maxbytes = get_max_log_size(server_context->context); + kadm5_ret_t ret; + kadm5_log_context *log_context = &server_context->log_context; - if (log_context->log_fd != -1) { - flock (log_context->log_fd, LOCK_UN); - close (log_context->log_fd); - log_context->log_fd = -1; + if (strcmp(log_context->log_file, "/dev/null") == 0) { + /* log_context->log_fd should be -1 here */ + return 0; } - fd = open (log_context->log_file, O_RDWR | O_CREAT | O_TRUNC, 0600); - if (fd < 0) - return errno; - if (flock (fd, LOCK_EX) < 0) { - close (fd); - return errno; + + ret = log_open(server_context, lock_mode); + if (ret) + return ret; + + fd = log_context->log_fd; + if (!log_context->read_only) { + if (fstat(fd, &st) == -1) + ret = errno; + if (ret == 0 && st.st_size == 0) { + /* Write first entry */ + log_context->version = 0; + ret = kadm5_log_nop(server_context, kadm_nop_plain); + if (ret == 0) + return 0; /* no need to truncate_if_needed(): it's not */ + } + if (ret == 0) { + ret = kadm5_log_get_version_fd(server_context, fd, + LOG_VERSION_UBER, &vno, NULL); + + /* Upgrade the log if it was an old-style log */ + if (ret == KADM5_LOG_NEEDS_UPGRADE) + ret = kadm5_log_truncate(server_context, 0, maxbytes / 4); + } + if (ret == 0) + ret = kadm5_log_recover(server_context, kadm_recover_replay); } - log_context->version = 0; - log_context->log_fd = fd; - return 0; + if (ret == 0) { + ret = kadm5_log_get_version_fd(server_context, fd, LOG_VERSION_LAST, + &log_context->version, NULL); + if (ret == HEIM_ERR_EOF) + ret = 0; + } + + if (ret == 0) + ret = truncate_if_needed(server_context); + + if (ret != 0) + (void) kadm5_log_end(server_context); + return ret; } +/* Open the log with an exclusive lock */ +kadm5_ret_t +kadm5_log_init(kadm5_server_context *server_context) +{ + return log_init(server_context, LOCK_EX); +} +/* Open the log with an exclusive non-blocking lock */ kadm5_ret_t -kadm5_log_end (kadm5_server_context *context) +kadm5_log_init_nb(kadm5_server_context *server_context) { - kadm5_log_context *log_context = &context->log_context; + return log_init(server_context, LOCK_EX | LOCK_NB); +} + +/* Open the log with no locks */ +kadm5_ret_t +kadm5_log_init_nolock(kadm5_server_context *server_context) +{ + return log_init(server_context, LOCK_UN); +} + +/* Open the log with a shared lock */ +kadm5_ret_t +kadm5_log_init_sharedlock(kadm5_server_context *server_context, int lock_flags) +{ + return log_init(server_context, LOCK_SH | lock_flags); +} + +/* + * Reinitialize the log and open it + */ +kadm5_ret_t +kadm5_log_reinit(kadm5_server_context *server_context, uint32_t vno) +{ + int ret; + kadm5_log_context *log_context = &server_context->log_context; + + ret = log_open(server_context, LOCK_EX); + if (ret) + return ret; + if (log_context->log_fd != -1) { + if (ftruncate(log_context->log_fd, 0) < 0) { + ret = errno; + return ret; + } + if (lseek(log_context->log_fd, 0, SEEK_SET) < 0) { + ret = errno; + return ret; + } + } + + /* Write uber entry and truncation nop with version `vno` */ + log_context->version = vno; + return kadm5_log_nop(server_context, kadm_nop_plain); +} + +/* Close the server_context->log_context. */ +kadm5_ret_t +kadm5_log_end(kadm5_server_context *server_context) +{ + kadm5_log_context *log_context = &server_context->log_context; + kadm5_ret_t ret = 0; int fd = log_context->log_fd; - flock (fd, LOCK_UN); - close(fd); + if (fd != -1) { + if (log_context->lock_mode != LOCK_UN) { + if (flock(fd, LOCK_UN) == -1 && errno == EBADF) + ret = errno; + } + if (ret != EBADF && close(fd) == -1) + ret = errno; + } log_context->log_fd = -1; - return 0; + log_context->lock_mode = LOCK_UN; + return ret; } +/* + * Write the version, timestamp, and op for a new entry. + * + * Note that the sp should be a krb5_storage_emem(), not a file. + * + * On success the sp's offset will be where the length of the payload + * should be written. + */ static kadm5_ret_t -kadm5_log_preamble (kadm5_server_context *context, - krb5_storage *sp, - enum kadm_ops op) +kadm5_log_preamble(kadm5_server_context *context, + krb5_storage *sp, + enum kadm_ops op, + uint32_t vno) { kadm5_log_context *log_context = &context->log_context; - kadm5_ret_t kadm_ret; + time_t now = time(NULL); + kadm5_ret_t ret; - kadm_ret = kadm5_log_init (context); - if (kadm_ret) - return kadm_ret; + ret = krb5_store_uint32(sp, vno); + if (ret) + return ret; + ret = krb5_store_uint32(sp, now); + if (ret) + return ret; + log_context->last_time = now; - krb5_store_int32 (sp, ++log_context->version); - krb5_store_int32 (sp, time(NULL)); - krb5_store_int32 (sp, op); - return 0; + if (op < kadm_first || op > kadm_last) + return ERANGE; + return krb5_store_uint32(sp, op); } +/* Writes the version part of the trailer */ static kadm5_ret_t -kadm5_log_postamble (kadm5_log_context *context, - krb5_storage *sp) +kadm5_log_postamble(kadm5_log_context *context, + krb5_storage *sp, + uint32_t vno) { - krb5_store_int32 (sp, context->version); - return 0; + return krb5_store_uint32(sp, vno); } /* - * flush the log record in `sp'. + * Signal the ipropd-master about changes to the log. + */ +/* + * XXX Get rid of the ifdef by having a sockaddr in log_context in both + * cases. + * + * XXX Better yet, just connect to the master's socket that slaves + * connect to, and then disconnect. The master should then check the + * log on every connection accepted. Then we wouldn't need IPC to + * signal the master. + */ +void +kadm5_log_signal_master(kadm5_server_context *context) +{ + kadm5_log_context *log_context = &context->log_context; +#ifndef NO_UNIX_SOCKETS + sendto(log_context->socket_fd, + (void *)&log_context->version, + sizeof(log_context->version), + 0, + (struct sockaddr *)&log_context->socket_name, + sizeof(log_context->socket_name)); +#else + sendto(log_context->socket_fd, + (void *)&log_context->version, + sizeof(log_context->version), + 0, + log_context->socket_info->ai_addr, + log_context->socket_info->ai_addrlen); +#endif +} + +/* + * Write sp's contents (which must be a fully formed record, complete + * with header, payload, and trailer) to the log and fsync the log. + * + * Does not free sp. */ static kadm5_ret_t -kadm5_log_flush (kadm5_log_context *log_context, - krb5_storage *sp) +kadm5_log_flush(kadm5_server_context *context, krb5_storage *sp) { + kadm5_log_context *log_context = &context->log_context; + kadm5_ret_t ret; krb5_data data; size_t len; - ssize_t ret; + krb5_ssize_t bytes; + uint32_t new_ver, prev_ver; + off_t off, end; + + if (strcmp(log_context->log_file, "/dev/null") == 0) + return 0; + + if (log_context->read_only) + return EROFS; + + if (krb5_storage_seek(sp, 0, SEEK_SET) == -1) + return errno; + + ret = get_header(sp, LOG_DOPEEK, &new_ver, NULL, NULL, NULL); + if (ret) + return ret; + + ret = krb5_storage_to_data(sp, &data); + if (ret) + return ret; + + /* Abandon the emem storage reference */ + sp = krb5_storage_from_fd(log_context->log_fd); + if (sp == NULL) { + krb5_data_free(&data); + return ENOMEM; + } + + /* Check that we are at the end of the log and fail if not */ + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (off == -1) { + krb5_data_free(&data); + krb5_storage_free(sp); + return errno; + } + end = krb5_storage_seek(sp, 0, SEEK_END); + if (end == -1) { + krb5_data_free(&data); + krb5_storage_free(sp); + return errno; + } + if (end != off) { + krb5_data_free(&data); + krb5_storage_free(sp); + return KADM5_LOG_CORRUPT; + } + + /* Enforce monotonically incremented versioning of records */ + if (seek_prev(sp, &prev_ver, NULL) == -1 || + krb5_storage_seek(sp, end, SEEK_SET) == -1) { + ret = errno; + krb5_data_free(&data); + krb5_storage_free(sp); + return ret; + } + + if (prev_ver != 0 && prev_ver != log_context->version) + return EINVAL; /* Internal error, really; just a consistency check */ + + if (prev_ver != 0 && new_ver != prev_ver + 1) { + krb5_warnx(context->context, "refusing to write a log record " + "with non-monotonic version (new: %u, old: %u)", + new_ver, prev_ver); + return KADM5_LOG_CORRUPT; + } - krb5_storage_to_data(sp, &data); len = data.length; - ret = write (log_context->log_fd, data.data, len); - if (ret < 0 || (size_t)ret != len) { - krb5_data_free(&data); + bytes = krb5_storage_write(sp, data.data, len); + krb5_data_free(&data); + if (bytes < 0) { + krb5_storage_free(sp); return errno; } - if (fsync (log_context->log_fd) < 0) { - krb5_data_free(&data); - return errno; + if (bytes != (krb5_ssize_t)len) { + krb5_storage_free(sp); + return EIO; } - /* - * Try to send a signal to any running `ipropd-master' - */ -#ifndef NO_UNIX_SOCKETS - sendto (log_context->socket_fd, - (void *)&log_context->version, - sizeof(log_context->version), - 0, - (struct sockaddr *)&log_context->socket_name, - sizeof(log_context->socket_name)); -#else - sendto (log_context->socket_fd, - (void *)&log_context->version, - sizeof(log_context->version), - 0, - log_context->socket_info->ai_addr, - log_context->socket_info->ai_addrlen); -#endif + ret = krb5_storage_fsync(sp); + krb5_storage_free(sp); + if (ret) + return ret; - krb5_data_free(&data); + /* Retain the nominal database version when flushing the uber record */ + if (new_ver != 0) + log_context->version = new_ver; return 0; } /* - * Add a `create' operation to the log. + * Add a `create' operation to the log and perform the create against the HDB. */ - kadm5_ret_t -kadm5_log_create (kadm5_server_context *context, - hdb_entry *ent) +kadm5_log_create(kadm5_server_context *context, hdb_entry *entry) { krb5_storage *sp; kadm5_ret_t ret; krb5_data value; + hdb_entry_ex ent; kadm5_log_context *log_context = &context->log_context; + memset(&ent, 0, sizeof(ent)); + ent.ctx = 0; + ent.free_entry = 0; + ent.entry = *entry; + + /* + * If we're not logging then we can't recover-to-perform, so just + * perform. + */ + if (strcmp(log_context->log_file, "/dev/null") == 0) + return context->db->hdb_store(context->context, context->db, 0, &ent); + + /* + * Test for any conflicting entries before writing the log. If we commit + * to the log we'll end-up rolling forward on recovery, but that would be + * wrong if the initial create is rejected. + */ + ret = context->db->hdb_store(context->context, context->db, + HDB_F_PRECHECK, &ent); + if (ret == 0) + ret = hdb_entry2value(context->context, entry, &value); + if (ret) + return ret; sp = krb5_storage_emem(); - ret = hdb_entry2value (context->context, ent, &value); - if (ret) { - krb5_storage_free(sp); - return ret; - } - ret = kadm5_log_preamble (context, sp, kadm_create); - if (ret) { - krb5_data_free (&value); - krb5_storage_free(sp); - return ret; - } - krb5_store_int32 (sp, value.length); - krb5_storage_write(sp, value.data, value.length); - krb5_store_int32 (sp, value.length); - krb5_data_free (&value); - ret = kadm5_log_postamble (log_context, sp); - if (ret) { - krb5_storage_free (sp); - return ret; + if (sp == NULL) + ret = ENOMEM; + if (ret == 0) + ret = kadm5_log_preamble(context, sp, kadm_create, + log_context->version + 1); + if (ret == 0) + ret = krb5_store_uint32(sp, value.length); + if (ret == 0) { + if (krb5_storage_write(sp, value.data, value.length) != + (krb5_ssize_t)value.length) + ret = errno; } - ret = kadm5_log_flush (log_context, sp); - krb5_storage_free (sp); - if (ret) - return ret; - ret = kadm5_log_end (context); + if (ret == 0) + ret = krb5_store_uint32(sp, value.length); + if (ret == 0) + ret = kadm5_log_postamble(log_context, sp, + log_context->version + 1); + if (ret == 0) + ret = kadm5_log_flush(context, sp); + krb5_storage_free(sp); + krb5_data_free(&value); + if (ret == 0) + ret = kadm5_log_recover(context, kadm_recover_commit); return ret; } @@ -276,12 +994,11 @@ * Read the data of a create log record from `sp' and change the * database. */ - static kadm5_ret_t -kadm5_log_replay_create (kadm5_server_context *context, - uint32_t ver, - uint32_t len, - krb5_storage *sp) +kadm5_log_replay_create(kadm5_server_context *context, + uint32_t ver, + uint32_t len, + krb5_storage *sp) { krb5_error_code ret; krb5_data data; @@ -289,158 +1006,237 @@ memset(&ent, 0, sizeof(ent)); - ret = krb5_data_alloc (&data, len); + ret = krb5_data_alloc(&data, len); if (ret) { krb5_set_error_message(context->context, ret, "out of memory"); return ret; } - krb5_storage_read (sp, data.data, len); - ret = hdb_value2entry (context->context, &data, &ent.entry); + krb5_storage_read(sp, data.data, len); + ret = hdb_value2entry(context->context, &data, &ent.entry); krb5_data_free(&data); if (ret) { krb5_set_error_message(context->context, ret, - "Unmarshaling hdb entry failed"); + "Unmarshaling hdb entry in log failed, " + "version: %ld", (long)ver); return ret; } ret = context->db->hdb_store(context->context, context->db, 0, &ent); - hdb_free_entry (context->context, &ent); + hdb_free_entry(context->context, &ent); return ret; } /* * Add a `delete' operation to the log. */ - kadm5_ret_t -kadm5_log_delete (kadm5_server_context *context, - krb5_principal princ) +kadm5_log_delete(kadm5_server_context *context, + krb5_principal princ) { - krb5_storage *sp; kadm5_ret_t ret; - off_t off; - off_t len; kadm5_log_context *log_context = &context->log_context; + krb5_storage *sp; + uint32_t len = 0; /* So dumb compilers don't warn */ + off_t end_off = 0; /* Ditto; this allows de-indentation by two levels */ + off_t off; + if (strcmp(log_context->log_file, "/dev/null") == 0) + return context->db->hdb_remove(context->context, context->db, 0, + princ); + ret = context->db->hdb_remove(context->context, context->db, + HDB_F_PRECHECK, princ); + if (ret) + return ret; sp = krb5_storage_emem(); if (sp == NULL) - return ENOMEM; - ret = kadm5_log_preamble (context, sp, kadm_delete); - if (ret) - goto out; - ret = krb5_store_int32 (sp, 0); - if (ret) - goto out; - off = krb5_storage_seek (sp, 0, SEEK_CUR); - ret = krb5_store_principal (sp, princ); - if (ret) - goto out; - len = krb5_storage_seek (sp, 0, SEEK_CUR) - off; - krb5_storage_seek(sp, -(len + 4), SEEK_CUR); - ret = krb5_store_int32 (sp, len); - if (ret) - goto out; - krb5_storage_seek(sp, len, SEEK_CUR); - ret = krb5_store_int32 (sp, len); - if (ret) - goto out; - ret = kadm5_log_postamble (log_context, sp); - if (ret) - goto out; - ret = kadm5_log_flush (log_context, sp); - if (ret) - goto out; - ret = kadm5_log_end (context); -out: - krb5_storage_free (sp); + ret = ENOMEM; + if (ret == 0) + ret = kadm5_log_preamble(context, sp, kadm_delete, + log_context->version + 1); + if (ret) { + krb5_storage_free(sp); + return ret; + } + + /* + * Write a 0 length which we overwrite once we know the length of + * the principal name payload. + */ + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (off == -1) + ret = errno; + if (ret == 0) + ret = krb5_store_uint32(sp, 0); + if (ret == 0) + ret = krb5_store_principal(sp, princ); + if (ret == 0) { + end_off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (end_off == -1) + ret = errno; + else if (end_off < off) + ret = KADM5_LOG_CORRUPT; + } + if (ret == 0) { + /* We wrote sizeof(uint32_t) + payload length bytes */ + len = (uint32_t)(end_off - off); + if (end_off - off != len || len < sizeof(len)) + ret = KADM5_LOG_CORRUPT; + else + len -= sizeof(len); + } + if (ret == 0 && krb5_storage_seek(sp, off, SEEK_SET) == -1) + ret = errno; + if (ret == 0) + ret = krb5_store_uint32(sp, len); + if (ret == 0 && krb5_storage_seek(sp, end_off, SEEK_SET) == -1) + ret = errno; + if (ret == 0) + ret = krb5_store_uint32(sp, len); + if (ret == 0) + ret = kadm5_log_postamble(log_context, sp, + log_context->version + 1); + if (ret == 0) + ret = kadm5_log_flush(context, sp); + if (ret == 0) + ret = kadm5_log_recover(context, kadm_recover_commit); + krb5_storage_free(sp); return ret; } /* * Read a `delete' log operation from `sp' and apply it. */ - static kadm5_ret_t -kadm5_log_replay_delete (kadm5_server_context *context, - uint32_t ver, - uint32_t len, - krb5_storage *sp) +kadm5_log_replay_delete(kadm5_server_context *context, + uint32_t ver, uint32_t len, krb5_storage *sp) { krb5_error_code ret; krb5_principal principal; - ret = krb5_ret_principal (sp, &principal); + ret = krb5_ret_principal(sp, &principal); if (ret) { krb5_set_error_message(context->context, ret, "Failed to read deleted " "principal from log version: %ld", (long)ver); return ret; } - ret = context->db->hdb_remove(context->context, context->db, principal); - krb5_free_principal (context->context, principal); + ret = context->db->hdb_remove(context->context, context->db, 0, principal); + krb5_free_principal(context->context, principal); return ret; } +static kadm5_ret_t kadm5_log_replay_rename(kadm5_server_context *, + uint32_t, uint32_t, + krb5_storage *); + /* * Add a `rename' operation to the log. */ - kadm5_ret_t -kadm5_log_rename (kadm5_server_context *context, - krb5_principal source, - hdb_entry *ent) +kadm5_log_rename(kadm5_server_context *context, + krb5_principal source, + hdb_entry *entry) { krb5_storage *sp; kadm5_ret_t ret; + uint32_t len = 0; /* So dumb compilers don't warn */ + off_t end_off = 0; /* Ditto; this allows de-indentation by two levels */ off_t off; - off_t len; krb5_data value; + hdb_entry_ex ent; kadm5_log_context *log_context = &context->log_context; - krb5_data_zero(&value); - - sp = krb5_storage_emem(); - ret = hdb_entry2value (context->context, ent, &value); - if (ret) - goto failed; - - ret = kadm5_log_preamble (context, sp, kadm_rename); - if (ret) - goto failed; - - ret = krb5_store_int32 (sp, 0); - if (ret) - goto failed; - off = krb5_storage_seek (sp, 0, SEEK_CUR); - ret = krb5_store_principal (sp, source); - if (ret) - goto failed; - - krb5_storage_write(sp, value.data, value.length); - len = krb5_storage_seek (sp, 0, SEEK_CUR) - off; - - krb5_storage_seek(sp, -(len + 4), SEEK_CUR); - ret = krb5_store_int32 (sp, len); - if (ret) - goto failed; - - krb5_storage_seek(sp, len, SEEK_CUR); - ret = krb5_store_int32 (sp, len); - if (ret) - goto failed; - - ret = kadm5_log_postamble (log_context, sp); - if (ret) - goto failed; + memset(&ent, 0, sizeof(ent)); + ent.ctx = 0; + ent.free_entry = 0; + ent.entry = *entry; + + if (strcmp(log_context->log_file, "/dev/null") == 0) { + ret = context->db->hdb_store(context->context, context->db, 0, &ent); + if (ret == 0) + return context->db->hdb_remove(context->context, context->db, 0, + source); + return ret; + } - ret = kadm5_log_flush (log_context, sp); + /* + * Pre-check that the transaction will succeed. + * + * Note that rename doesn't work to swap a principal's canonical + * name with one of its aliases. To make that work would require + * adding an hdb_rename() method for renaming principals (there's an + * hdb_rename() method already, but for renaming the HDB), which is + * ETOOMUCHWORK for the time being. + */ + ret = context->db->hdb_store(context->context, context->db, + HDB_F_PRECHECK, &ent); + if (ret == 0) + ret = context->db->hdb_remove(context->context, context->db, + HDB_F_PRECHECK, source); if (ret) - goto failed; - krb5_storage_free (sp); - krb5_data_free (&value); + return ret; - return kadm5_log_end (context); + sp = krb5_storage_emem(); + krb5_data_zero(&value); + if (sp == NULL) + ret = ENOMEM; + if (ret == 0) + ret = kadm5_log_preamble(context, sp, kadm_rename, + log_context->version + 1); + if (ret == 0) + ret = hdb_entry2value(context->context, entry, &value); + if (ret) { + krb5_data_free(&value); + krb5_storage_free(sp); + return ret; + } -failed: + /* + * Write a zero length which we'll overwrite once we know the length of the + * payload. + */ + off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (off == -1) + ret = errno; + if (ret == 0) + ret = krb5_store_uint32(sp, 0); + if (ret == 0) + ret = krb5_store_principal(sp, source); + if (ret == 0) { + errno = 0; + if (krb5_storage_write(sp, value.data, value.length) != + (krb5_ssize_t)value.length) + ret = errno ? errno : EIO; + } + if (ret == 0) { + end_off = krb5_storage_seek(sp, 0, SEEK_CUR); + if (end_off == -1) + ret = errno; + else if (end_off < off) + ret = KADM5_LOG_CORRUPT; + } + if (ret == 0) { + /* We wrote sizeof(uint32_t) + payload length bytes */ + len = (uint32_t)(end_off - off); + if (end_off - off != len || len < sizeof(len)) + ret = KADM5_LOG_CORRUPT; + else + len -= sizeof(len); + if (ret == 0 && krb5_storage_seek(sp, off, SEEK_SET) == -1) + ret = errno; + if (ret == 0) + ret = krb5_store_uint32(sp, len); + if (ret == 0 && krb5_storage_seek(sp, end_off, SEEK_SET) == -1) + ret = errno; + if (ret == 0) + ret = krb5_store_uint32(sp, len); + if (ret == 0) + ret = kadm5_log_postamble(log_context, sp, + log_context->version + 1); + if (ret == 0) + ret = kadm5_log_flush(context, sp); + if (ret == 0) + ret = kadm5_log_recover(context, kadm_recover_commit); + } krb5_data_free(&value); krb5_storage_free(sp); return ret; @@ -451,10 +1247,10 @@ */ static kadm5_ret_t -kadm5_log_replay_rename (kadm5_server_context *context, - uint32_t ver, - uint32_t len, - krb5_storage *sp) +kadm5_log_replay_rename(kadm5_server_context *context, + uint32_t ver, + uint32_t len, + krb5_storage *sp) { krb5_error_code ret; krb5_principal source; @@ -466,7 +1262,7 @@ memset(&target_ent, 0, sizeof(target_ent)); off = krb5_storage_seek(sp, 0, SEEK_CUR); - ret = krb5_ret_principal (sp, &source); + ret = krb5_ret_principal(sp, &source); if (ret) { krb5_set_error_message(context->context, ret, "Failed to read renamed " "principal in log, version: %ld", (long)ver); @@ -474,79 +1270,96 @@ } princ_len = krb5_storage_seek(sp, 0, SEEK_CUR) - off; data_len = len - princ_len; - ret = krb5_data_alloc (&value, data_len); + ret = krb5_data_alloc(&value, data_len); if (ret) { krb5_free_principal (context->context, source); return ret; } - krb5_storage_read (sp, value.data, data_len); - ret = hdb_value2entry (context->context, &value, &target_ent.entry); + krb5_storage_read(sp, value.data, data_len); + ret = hdb_value2entry(context->context, &value, &target_ent.entry); krb5_data_free(&value); if (ret) { - krb5_free_principal (context->context, source); + krb5_free_principal(context->context, source); return ret; } - ret = context->db->hdb_store (context->context, context->db, - 0, &target_ent); - hdb_free_entry (context->context, &target_ent); + ret = context->db->hdb_store(context->context, context->db, + 0, &target_ent); + hdb_free_entry(context->context, &target_ent); if (ret) { - krb5_free_principal (context->context, source); + krb5_free_principal(context->context, source); return ret; } - ret = context->db->hdb_remove (context->context, context->db, source); - krb5_free_principal (context->context, source); + ret = context->db->hdb_remove(context->context, context->db, 0, source); + krb5_free_principal(context->context, source); + return ret; } - /* * Add a `modify' operation to the log. */ - kadm5_ret_t -kadm5_log_modify (kadm5_server_context *context, - hdb_entry *ent, - uint32_t mask) +kadm5_log_modify(kadm5_server_context *context, + hdb_entry *entry, + uint32_t mask) { krb5_storage *sp; kadm5_ret_t ret; krb5_data value; uint32_t len; + hdb_entry_ex ent; kadm5_log_context *log_context = &context->log_context; - krb5_data_zero(&value); + memset(&ent, 0, sizeof(ent)); + ent.ctx = 0; + ent.free_entry = 0; + ent.entry = *entry; - sp = krb5_storage_emem(); - ret = hdb_entry2value (context->context, ent, &value); - if (ret) - goto failed; + if (strcmp(log_context->log_file, "/dev/null") == 0) + return context->db->hdb_store(context->context, context->db, + HDB_F_REPLACE, &ent); - ret = kadm5_log_preamble (context, sp, kadm_modify); + ret = context->db->hdb_store(context->context, context->db, + HDB_F_PRECHECK | HDB_F_REPLACE, &ent); if (ret) - goto failed; + return ret; - len = value.length + 4; - ret = krb5_store_int32 (sp, len); - if (ret) - goto failed; - ret = krb5_store_int32 (sp, mask); - if (ret) - goto failed; - krb5_storage_write (sp, value.data, value.length); + sp = krb5_storage_emem(); + krb5_data_zero(&value); + if (sp == NULL) + ret = ENOMEM; + if (ret == 0) + ret = hdb_entry2value(context->context, entry, &value); + if (ret) { + krb5_data_free(&value); + krb5_storage_free(sp); + return ret; + } - ret = krb5_store_int32 (sp, len); - if (ret) - goto failed; - ret = kadm5_log_postamble (log_context, sp); - if (ret) - goto failed; - ret = kadm5_log_flush (log_context, sp); - if (ret) - goto failed; - krb5_data_free(&value); - krb5_storage_free (sp); - return kadm5_log_end (context); -failed: + len = value.length + sizeof(len); + if (value.length > len || len > INT32_MAX) + ret = E2BIG; + if (ret == 0) + ret = kadm5_log_preamble(context, sp, kadm_modify, + log_context->version + 1); + if (ret == 0) + ret = krb5_store_uint32(sp, len); + if (ret == 0) + ret = krb5_store_uint32(sp, mask); + if (ret == 0) { + if (krb5_storage_write(sp, value.data, value.length) != + (krb5_ssize_t)value.length) + ret = errno; + } + if (ret == 0) + ret = krb5_store_uint32(sp, len); + if (ret == 0) + ret = kadm5_log_postamble(log_context, sp, + log_context->version + 1); + if (ret == 0) + ret = kadm5_log_flush(context, sp); + if (ret == 0) + ret = kadm5_log_recover(context, kadm_recover_commit); krb5_data_free(&value); krb5_storage_free(sp); return ret; @@ -555,28 +1368,33 @@ /* * Read a `modify' log operation from `sp' and apply it. */ - static kadm5_ret_t -kadm5_log_replay_modify (kadm5_server_context *context, - uint32_t ver, - uint32_t len, - krb5_storage *sp) +kadm5_log_replay_modify(kadm5_server_context *context, + uint32_t ver, + uint32_t len, + krb5_storage *sp) { krb5_error_code ret; - int32_t mask; + uint32_t mask; krb5_data value; hdb_entry_ex ent, log_ent; memset(&log_ent, 0, sizeof(log_ent)); - krb5_ret_int32 (sp, &mask); + ret = krb5_ret_uint32(sp, &mask); + if (ret) + return ret; len -= 4; ret = krb5_data_alloc (&value, len); if (ret) { krb5_set_error_message(context->context, ret, "out of memory"); return ret; } - krb5_storage_read (sp, value.data, len); + errno = 0; + if (krb5_storage_read (sp, value.data, len) != (krb5_ssize_t)len) { + ret = errno ? errno : EIO; + return ret; + } ret = hdb_value2entry (context->context, &value, &log_ent.entry); krb5_data_free(&value); if (ret) @@ -585,7 +1403,8 @@ memset(&ent, 0, sizeof(ent)); ret = context->db->hdb_fetch_kvno(context->context, context->db, log_ent.entry.principal, - HDB_F_DECRYPT|HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); + HDB_F_DECRYPT|HDB_F_ALL_KVNOS| + HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); if (ret) goto out; if (mask & KADM5_PRINC_EXPIRE_TIME) { @@ -619,7 +1438,8 @@ } } if (mask & KADM5_LAST_PWD_CHANGE) { - abort (); /* XXX */ + krb5_warnx (context->context, + "Unimplemented mask KADM5_LAST_PWD_CHANGE"); } if (mask & KADM5_ATTRIBUTES) { ent.entry.flags = log_ent.entry.flags; @@ -659,16 +1479,14 @@ ent.entry.kvno = log_ent.entry.kvno; } if (mask & KADM5_MKVNO) { - abort (); /* XXX */ + krb5_warnx(context->context, "Unimplemented mask KADM5_KVNO"); } if (mask & KADM5_AUX_ATTRIBUTES) { - abort (); /* XXX */ - } - if (mask & KADM5_POLICY) { - abort (); /* XXX */ + krb5_warnx(context->context, + "Unimplemented mask KADM5_AUX_ATTRIBUTES"); } if (mask & KADM5_POLICY_CLR) { - abort (); /* XXX */ + krb5_warnx(context->context, "Unimplemented mask KADM5_POLICY_CLR"); } if (mask & KADM5_MAX_RLIFE) { if (log_ent.entry.max_renew == NULL) { @@ -686,18 +1504,28 @@ } } if (mask & KADM5_LAST_SUCCESS) { - abort (); /* XXX */ + krb5_warnx(context->context, "Unimplemented mask KADM5_LAST_SUCCESS"); } if (mask & KADM5_LAST_FAILED) { - abort (); /* XXX */ + krb5_warnx(context->context, "Unimplemented mask KADM5_LAST_FAILED"); } if (mask & KADM5_FAIL_AUTH_COUNT) { - abort (); /* XXX */ + krb5_warnx(context->context, + "Unimplemented mask KADM5_FAIL_AUTH_COUNT"); } if (mask & KADM5_KEY_DATA) { size_t num; size_t i; + /* + * We don't need to do anything about key history here because + * the log entry contains a complete entry, including hdb + * extensions. We do need to make sure that KADM5_TL_DATA is in + * the mask though, since that's what it takes to update the + * extensions (see below). + */ + mask |= KADM5_TL_DATA; + for (i = 0; i < ent.entry.keys.len; ++i) free_Key(&ent.entry.keys.val[i]); free (ent.entry.keys.val); @@ -708,7 +1536,8 @@ ent.entry.keys.val = malloc(len * sizeof(*ent.entry.keys.val)); if (ent.entry.keys.val == NULL) { krb5_set_error_message(context->context, ENOMEM, "out of memory"); - return ENOMEM; + ret = ENOMEM; + goto out; } for (i = 0; i < ent.entry.keys.len; ++i) { ret = copy_Key(&log_ent.entry.keys.val[i], @@ -742,179 +1571,672 @@ ret = context->db->hdb_store(context->context, context->db, HDB_F_REPLACE, &ent); out: - hdb_free_entry (context->context, &ent); - hdb_free_entry (context->context, &log_ent); + hdb_free_entry(context->context, &ent); + hdb_free_entry(context->context, &log_ent); return ret; } /* - * Add a `nop' operation to the log. Does not close the log. + * Update the first entry (which should be a `nop'), the "uber-entry". */ +static kadm5_ret_t +log_update_uber(kadm5_server_context *context, off_t off) +{ + kadm5_log_context *log_context = &context->log_context; + kadm5_ret_t ret = 0; + krb5_storage *sp, *mem_sp; + krb5_data data; + uint32_t op, len; + ssize_t bytes; + + if (strcmp(log_context->log_file, "/dev/null") == 0) + return 0; + + if (log_context->read_only) + return EROFS; + + krb5_data_zero(&data); + + mem_sp = krb5_storage_emem(); + if (mem_sp == NULL) + return ENOMEM; + + sp = krb5_storage_from_fd(log_context->log_fd); + if (sp == NULL) { + krb5_storage_free(mem_sp); + return ENOMEM; + } + + /* Skip first entry's version and timestamp */ + if (krb5_storage_seek(sp, 8, SEEK_SET) == -1) { + ret = errno; + goto out; + } + + /* If the first entry is not a nop, there's nothing we can do here */ + ret = krb5_ret_uint32(sp, &op); + if (ret || op != kadm_nop) + goto out; + + /* If the first entry is not a 16-byte nop, ditto */ + ret = krb5_ret_uint32(sp, &len); + if (ret || len != LOG_UBER_LEN) + goto out; + + /* + * Try to make the writes here as close to atomic as possible: a + * single write() call. + */ + ret = krb5_store_uint64(mem_sp, off); + if (ret) + goto out; + ret = krb5_store_uint32(mem_sp, log_context->last_time); + if (ret) + goto out; + ret = krb5_store_uint32(mem_sp, log_context->version); + if (ret) + goto out; + + krb5_storage_to_data(mem_sp, &data); + bytes = krb5_storage_write(sp, data.data, data.length); + if (bytes < 0) + ret = errno; + else if (bytes != data.length) + ret = EIO; + + /* + * We don't fsync() this write because we can recover if the write + * doesn't complete, though for now we don't have code for properly + * dealing with the offset not getting written completely. + * + * We should probably have two copies of the offset so we can use + * one copy to verify the other, and when they don't match we could + * traverse the whole log forwards, replaying just the last entry. + */ + +out: + if (ret == 0) + kadm5_log_signal_master(context); + krb5_data_free(&data); + krb5_storage_free(sp); + krb5_storage_free(mem_sp); + if (lseek(log_context->log_fd, off, SEEK_SET) == -1) + ret = ret ? ret : errno; + + return ret; +} +/* + * Add a `nop' operation to the log. Does not close the log. + */ kadm5_ret_t -kadm5_log_nop (kadm5_server_context *context) +kadm5_log_nop(kadm5_server_context *context, enum kadm_nop_type nop_type) { krb5_storage *sp; kadm5_ret_t ret; kadm5_log_context *log_context = &context->log_context; + off_t off; + uint32_t vno = log_context->version; + + if (strcmp(log_context->log_file, "/dev/null") == 0) + return 0; + + off = lseek(log_context->log_fd, 0, SEEK_CUR); + if (off == -1) + return errno; sp = krb5_storage_emem(); - ret = kadm5_log_preamble (context, sp, kadm_nop); - if (ret) { - krb5_storage_free (sp); - return ret; - } - krb5_store_int32 (sp, 0); - krb5_store_int32 (sp, 0); - ret = kadm5_log_postamble (log_context, sp); - if (ret) { - krb5_storage_free (sp); - return ret; + ret = kadm5_log_preamble(context, sp, kadm_nop, off == 0 ? 0 : vno + 1); + if (ret) + goto out; + + if (off == 0) { + /* + * First entry (uber-entry) gets room for offset of next new + * entry and time and version of last entry. + */ + ret = krb5_store_uint32(sp, LOG_UBER_LEN); + /* These get overwritten with the same values below */ + if (ret == 0) + ret = krb5_store_uint64(sp, LOG_UBER_SZ); + if (ret == 0) + ret = krb5_store_uint32(sp, log_context->last_time); + if (ret == 0) + ret = krb5_store_uint32(sp, vno); + if (ret == 0) + ret = krb5_store_uint32(sp, LOG_UBER_LEN); + } else if (nop_type == kadm_nop_plain) { + ret = krb5_store_uint32(sp, 0); + if (ret == 0) + ret = krb5_store_uint32(sp, 0); + } else { + ret = krb5_store_uint32(sp, sizeof(uint32_t)); + if (ret == 0) + ret = krb5_store_uint32(sp, nop_type); + if (ret == 0) + ret = krb5_store_uint32(sp, sizeof(uint32_t)); } - ret = kadm5_log_flush (log_context, sp); - krb5_storage_free (sp); + if (ret == 0) + ret = kadm5_log_postamble(log_context, sp, off == 0 ? 0 : vno + 1); + if (ret == 0) + ret = kadm5_log_flush(context, sp); + + if (ret == 0 && off == 0 && nop_type != kadm_nop_plain) + ret = kadm5_log_nop(context, nop_type); + + if (ret == 0 && off != 0) + ret = kadm5_log_recover(context, kadm_recover_commit); + +out: + krb5_storage_free(sp); return ret; } /* - * Read a `nop' log operation from `sp' and apply it. + * Read a `nop' log operation from `sp' and "apply" it (there's nothing + * to do). + * + * FIXME Actually, if the nop payload is 4 bytes and contains an enum + * kadm_nop_type value of kadm_nop_trunc then we should truncate the + * log, and if it contains a kadm_nop_close then we should rename a new + * log into place. However, this is not implemented yet. */ - static kadm5_ret_t -kadm5_log_replay_nop (kadm5_server_context *context, - uint32_t ver, - uint32_t len, - krb5_storage *sp) +kadm5_log_replay_nop(kadm5_server_context *context, + uint32_t ver, + uint32_t len, + krb5_storage *sp) { return 0; } +struct replay_cb_data { + size_t count; + uint32_t ver; + enum kadm_recover_mode mode; +}; + + /* - * Call `func' for each log record in the log in `context' + * Recover or perform the initial commit of an unconfirmed log entry */ +static kadm5_ret_t +recover_replay(kadm5_server_context *context, + uint32_t ver, time_t timestamp, enum kadm_ops op, + uint32_t len, krb5_storage *sp, void *ctx) +{ + struct replay_cb_data *data = ctx; + kadm5_ret_t ret; + off_t off; + + /* On initial commit there must be just one pending unconfirmed entry */ + if (data->count > 0 && data->mode == kadm_recover_commit) + return KADM5_LOG_CORRUPT; + + /* We're at the start of the payload; compute end of entry offset */ + off = krb5_storage_seek(sp, 0, SEEK_CUR) + len + LOG_TRAILER_SZ; + + /* We cannot perform log recovery on LDAP and such backends */ + if (data->mode == kadm_recover_replay && + (context->db->hdb_capability_flags & HDB_CAP_F_SHARED_DIRECTORY)) + ret = 0; + else + ret = kadm5_log_replay(context, op, ver, len, sp); + switch (ret) { + case HDB_ERR_NOENTRY: + case HDB_ERR_EXISTS: + if (data->mode != kadm_recover_replay) + return ret; + case 0: + break; + case KADM5_LOG_CORRUPT: + return -1; + default: + krb5_warn(context->context, ret, "unexpected error while replaying"); + return -1; + } + data->count++; + data->ver = ver; + + /* + * With replay we may be making multiple HDB changes. We must sync the + * confirmation of each one before moving on to the next. Otherwise, we + * might attempt to replay multiple already applied updates, and this may + * introduce unintended intermediate states or fail to yield the same final + * result. + */ + kadm5_log_set_version(context, ver); + ret = log_update_uber(context, off); + if (ret == 0 && data->mode != kadm_recover_commit) + ret = krb5_storage_fsync(sp); + return ret; +} + kadm5_ret_t -kadm5_log_foreach (kadm5_server_context *context, - void (*func)(kadm5_server_context *server_context, - uint32_t ver, - time_t timestamp, - enum kadm_ops op, - uint32_t len, - krb5_storage *, - void *), - void *ctx) +kadm5_log_recover(kadm5_server_context *context, enum kadm_recover_mode mode) { + kadm5_ret_t ret; + krb5_storage *sp; + struct replay_cb_data replay_data; + + replay_data.count = 0; + replay_data.ver = 0; + replay_data.mode = mode; + + sp = krb5_storage_from_fd(context->log_context.log_fd); + if (sp == NULL) + return errno ? errno : EIO; + ret = kadm5_log_goto_end(context, sp); + + if (ret == 0) + ret = kadm5_log_foreach(context, kadm_forward | kadm_unconfirmed, + NULL, recover_replay, &replay_data); + if (ret == 0 && mode == kadm_recover_commit && replay_data.count != 1) + ret = KADM5_LOG_CORRUPT; + krb5_storage_free(sp); + return ret; +} + +/* + * Call `func' for each log record in the log in `context'. + * + * `func' is optional. + * + * If `func' returns -1 then log traversal terminates and this returns 0. + * Otherwise `func''s return is returned if there are no other errors. + */ +kadm5_ret_t +kadm5_log_foreach(kadm5_server_context *context, + enum kadm_iter_opts iter_opts, + off_t *off_lastp, + kadm5_ret_t (*func)(kadm5_server_context *server_context, + uint32_t ver, time_t timestamp, + enum kadm_ops op, uint32_t len, + krb5_storage *sp, void *ctx), + void *ctx) +{ + kadm5_ret_t ret = 0; int fd = context->log_context.log_fd; krb5_storage *sp; + off_t off_last; + off_t this_entry = 0; + off_t log_end = 0; + + if (strcmp(context->log_context.log_file, "/dev/null") == 0) + return 0; + + if (off_lastp == NULL) + off_lastp = &off_last; + *off_lastp = -1; + + if (((iter_opts & kadm_forward) && (iter_opts & kadm_backward)) || + (!(iter_opts & kadm_confirmed) && !(iter_opts & kadm_unconfirmed))) + return EINVAL; + + if ((iter_opts & kadm_forward) && (iter_opts & kadm_confirmed) && + (iter_opts & kadm_unconfirmed)) { + /* + * We want to traverse all log entries, confirmed or not, from + * the start, then there's no need to kadm5_log_goto_end() + * -- no reason to try to find the end. + */ + sp = krb5_storage_from_fd(fd); + if (sp == NULL) + return errno ? errno : ENOMEM; + + log_end = krb5_storage_seek(sp, 0, SEEK_END); + if (log_end == -1 || + krb5_storage_seek(sp, 0, SEEK_SET) == -1) { + ret = errno; + krb5_storage_free(sp); + return ret; + } + } else { + /* Get the end of the log based on the uber entry */ + sp = krb5_storage_from_fd(fd); + if (sp == NULL) + return errno ? errno : ENOMEM; + ret = kadm5_log_goto_end(context, sp); + if (ret != 0) + return ret; + log_end = krb5_storage_seek(sp, 0, SEEK_CUR); + } - lseek (fd, 0, SEEK_SET); - sp = krb5_storage_from_fd (fd); - for (;;) { - int32_t ver, timestamp, op, len, len2, ver2; + *off_lastp = log_end; + + if ((iter_opts & kadm_forward) && (iter_opts & kadm_confirmed)) { + /* Start at the beginning */ + if (krb5_storage_seek(sp, 0, SEEK_SET) == -1) { + ret = errno; + krb5_storage_free(sp); + return ret; + } + } else if ((iter_opts & kadm_backward) && (iter_opts & kadm_unconfirmed)) { + /* + * We're at the confirmed end but need to be at the unconfirmed + * end. Skip forward to the real end, re-entering to do it. + */ + ret = kadm5_log_foreach(context, kadm_forward | kadm_unconfirmed, + &log_end, NULL, NULL); + if (ret) + return ret; + if (krb5_storage_seek(sp, log_end, SEEK_SET) == -1) { + ret = errno; + krb5_storage_free(sp); + return ret; + } + } - if(krb5_ret_int32 (sp, &ver) != 0) + for (;;) { + uint32_t ver, ver2, len, len2; + uint32_t tstamp; + time_t timestamp; + enum kadm_ops op; + + if ((iter_opts & kadm_backward)) { + off_t o; + + o = krb5_storage_seek(sp, 0, SEEK_CUR); + if (o == 0 || + ((iter_opts & kadm_unconfirmed) && o <= *off_lastp)) + break; + ret = kadm5_log_previous(context->context, sp, &ver, + ×tamp, &op, &len); + if (ret) + break; + + /* Offset is now at payload of current entry */ + + o = krb5_storage_seek(sp, 0, SEEK_CUR); + if (o == -1) { + ret = errno; + break; + } + this_entry = o - LOG_HEADER_SZ; + if (this_entry < 0) { + ret = KADM5_LOG_CORRUPT; + break; + } + } else { + /* Offset is now at start of current entry, read header */ + this_entry = krb5_storage_seek(sp, 0, SEEK_CUR); + if (!(iter_opts & kadm_unconfirmed) && this_entry == log_end) + break; + ret = get_header(sp, LOG_NOPEEK, &ver, &tstamp, &op, &len); + if (ret == HEIM_ERR_EOF) { + ret = 0; + break; + } + timestamp = tstamp; + if (ret) + break; + /* Offset is now at payload of current entry */ + } + + /* Validate trailer before calling the callback */ + if (krb5_storage_seek(sp, len, SEEK_CUR) == -1) { + ret = errno; + break; + } + + ret = krb5_ret_uint32(sp, &len2); + if (ret) + break; + ret = krb5_ret_uint32(sp, &ver2); + if (ret) + break; + if (len != len2 || ver != ver2) { + ret = KADM5_LOG_CORRUPT; break; - krb5_ret_int32 (sp, ×tamp); - krb5_ret_int32 (sp, &op); - krb5_ret_int32 (sp, &len); - (*func)(context, ver, timestamp, op, len, sp, ctx); - krb5_ret_int32 (sp, &len2); - krb5_ret_int32 (sp, &ver2); - if (len != len2) - abort(); - if (ver != ver2) - abort(); + } + + /* Rewind to start of payload and call callback if we have one */ + if (krb5_storage_seek(sp, this_entry + LOG_HEADER_SZ, + SEEK_SET) == -1) { + ret = errno; + break; + } + + if (func != NULL) { + ret = (*func)(context, ver, timestamp, op, len, sp, ctx); + if (ret) { + /* Callback signals desire to stop by returning -1 */ + if (ret == -1) + ret = 0; + break; + } + } + if ((iter_opts & kadm_forward)) { + off_t o; + + o = krb5_storage_seek(sp, this_entry+LOG_WRAPPER_SZ+len, SEEK_SET); + if (o == -1) { + ret = errno; + break; + } + if (o > log_end) + *off_lastp = o; + } else if ((iter_opts & kadm_backward)) { + /* + * Rewind to the start of this entry so kadm5_log_previous() + * can find the previous one. + */ + if (krb5_storage_seek(sp, this_entry, SEEK_SET) == -1) { + ret = errno; + break; + } + } + } + if ((ret == HEIM_ERR_EOF || ret == KADM5_LOG_CORRUPT) && + (iter_opts & kadm_forward) && + context->log_context.lock_mode == LOCK_EX) { + /* + * Truncate partially written last log entry so we can write + * again. + */ + ret = krb5_storage_truncate(sp, this_entry); + if (ret == 0 && + krb5_storage_seek(sp, this_entry, SEEK_SET) == -1) + ret = errno; + krb5_warnx(context->context, "Truncating log at partial or " + "corrupt %s entry", + this_entry > log_end ? "unconfirmed" : "confirmed"); } krb5_storage_free(sp); + return ret; +} + +/* + * Go to the first record, which, if we have an uber record, will be + * the second record. + */ +kadm5_ret_t +kadm5_log_goto_first(kadm5_server_context *server_context, krb5_storage *sp) +{ + enum kadm_ops op; + uint32_t ver, len; + kadm5_ret_t ret; + + if (krb5_storage_seek(sp, 0, SEEK_SET) == -1) + return KADM5_LOG_CORRUPT; + + ret = get_header(sp, LOG_DOPEEK, &ver, NULL, &op, &len); + if (ret) + return ret; + if (op == kadm_nop && len == LOG_UBER_LEN && seek_next(sp) == -1) + return KADM5_LOG_CORRUPT; return 0; } /* * Go to end of log. */ +kadm5_ret_t +kadm5_log_goto_end(kadm5_server_context *server_context, krb5_storage *sp) +{ + krb5_error_code ret = 0; + enum kadm_ops op; + uint32_t ver, len; + uint32_t tstamp; + uint64_t off; + + if (krb5_storage_seek(sp, 0, SEEK_SET) == -1) + return errno; + ret = get_header(sp, LOG_NOPEEK, &ver, &tstamp, &op, &len); + if (ret == HEIM_ERR_EOF) { + (void) krb5_storage_seek(sp, 0, SEEK_SET); + return 0; + } + if (ret == KADM5_LOG_CORRUPT) + goto truncate; + if (ret) + return ret; + + if (op == kadm_nop && len == LOG_UBER_LEN) { + /* New style log */ + ret = krb5_ret_uint64(sp, &off); + if (ret) + goto truncate; + + if (krb5_storage_seek(sp, off, SEEK_SET) == -1) + return ret; + + if (off >= LOG_UBER_SZ) { + ret = get_version_prev(sp, &ver, NULL); + if (ret == 0) + return 0; + } + /* Invalid offset in uber entry */ + goto truncate; + } + + /* Old log with no uber entry */ + if (krb5_storage_seek(sp, 0, SEEK_END) == -1) { + static int warned = 0; + if (!warned) { + warned = 1; + krb5_warnx(server_context->context, + "Old log found; truncate it to upgrade"); + } + } + ret = get_version_prev(sp, &ver, NULL); + if (ret) + goto truncate; + return 0; -krb5_storage * -kadm5_log_goto_end (int fd) +truncate: + /* If we can, truncate */ + if (server_context->log_context.lock_mode == LOCK_EX) { + ret = kadm5_log_reinit(server_context, 0); + if (ret == 0) { + krb5_warn(server_context->context, ret, + "Invalid log; truncating to recover"); + if (krb5_storage_seek(sp, 0, SEEK_END) >= 0) + return 0; + } + } + ret = KADM5_LOG_CORRUPT; + krb5_warn(server_context->context, ret, + "Invalid log; truncate to recover"); + return ret; +} + +/* + * Return the next log entry. + * + * The pointer in `sp' is assumed to be at the end of an entry. On success, + * the `sp' pointer is set to the next entry (not the data portion). In case + * of error, it's not changed at all. + */ +kadm5_ret_t +kadm5_log_next(krb5_context context, + krb5_storage *sp, + uint32_t *verp, + time_t *tstampp, + enum kadm_ops *opp, + uint32_t *lenp) { - krb5_storage *sp; + uint32_t len = 0; + uint32_t len2 = 0; + uint32_t ver = verp ? *verp : 0; + uint32_t ver2; + uint32_t tstamp = tstampp ? *tstampp : 0; + enum kadm_ops op = kadm_nop; + off_t off = krb5_storage_seek(sp, 0, SEEK_CUR); + kadm5_ret_t ret = get_header(sp, LOG_NOPEEK, &ver, &tstamp, &op, &len); + + /* Validate the trailer */ + if (ret == 0 && krb5_storage_seek(sp, len, SEEK_CUR) == -1) + ret = errno; + + if (ret == 0) + ret = krb5_ret_uint32(sp, &len2); + if (ret == 0) + ret = krb5_ret_uint32(sp, &ver2); + if (ret == 0 && (len != len2 || ver != ver2)) + ret = KADM5_LOG_CORRUPT; + if (ret != 0) { + (void) krb5_storage_seek(sp, off, SEEK_SET); + return ret; + } - sp = krb5_storage_from_fd (fd); - krb5_storage_seek(sp, 0, SEEK_END); - return sp; + if (verp) + *verp = ver; + if (tstampp) + *tstampp = tstamp; + if (opp) + *opp = op; + if (lenp) + *lenp = len; + return 0; } /* * Return previous log entry. * - * The pointer in `sp´ is assumed to be at the top of the entry before - * previous entry. On success, the `sp´ pointer is set to data portion - * of previous entry. In case of error, it's not changed at all. + * The pointer in `sp' is assumed to be at the top of the entry after + * previous entry (e.g., at EOF). On success, the `sp' pointer is set to + * data portion of previous entry. In case of error, it's not changed + * at all. */ - kadm5_ret_t -kadm5_log_previous (krb5_context context, - krb5_storage *sp, - uint32_t *ver, - time_t *timestamp, - enum kadm_ops *op, - uint32_t *len) +kadm5_log_previous(krb5_context context, + krb5_storage *sp, + uint32_t *verp, + time_t *tstampp, + enum kadm_ops *opp, + uint32_t *lenp) { krb5_error_code ret; - off_t off, oldoff; - int32_t tmp; + off_t oldoff; + uint32_t ver2, len2; + uint32_t tstamp; oldoff = krb5_storage_seek(sp, 0, SEEK_CUR); + if (oldoff == -1) + goto log_corrupt; - krb5_storage_seek(sp, -8, SEEK_CUR); - ret = krb5_ret_int32 (sp, &tmp); - if (ret) - goto end_of_storage; - *len = tmp; - ret = krb5_ret_int32 (sp, &tmp); - if (ret) - goto end_of_storage; - *ver = tmp; - off = 24 + *len; - krb5_storage_seek(sp, -off, SEEK_CUR); - ret = krb5_ret_int32 (sp, &tmp); - if (ret) - goto end_of_storage; - if ((uint32_t)tmp != *ver) { - krb5_storage_seek(sp, oldoff, SEEK_SET); - krb5_set_error_message(context, KADM5_BAD_DB, - "kadm5_log_previous: log entry " - "have consistency failure, version number wrong " - "(tmp %lu ver %lu)", - (unsigned long)tmp, - (unsigned long)*ver); - return KADM5_BAD_DB; - } - ret = krb5_ret_int32 (sp, &tmp); - if (ret) - goto end_of_storage; - *timestamp = tmp; - ret = krb5_ret_int32 (sp, &tmp); - if (ret) - goto end_of_storage; - *op = tmp; - ret = krb5_ret_int32 (sp, &tmp); - if (ret) - goto end_of_storage; - if ((uint32_t)tmp != *len) { - krb5_storage_seek(sp, oldoff, SEEK_SET); - krb5_set_error_message(context, KADM5_BAD_DB, - "kadm5_log_previous: log entry " - "have consistency failure, length wrong"); - return KADM5_BAD_DB; + /* This reads the physical version of the uber record */ + if (seek_prev(sp, verp, lenp) == -1) + goto log_corrupt; + + ret = get_header(sp, LOG_NOPEEK, &ver2, &tstamp, opp, &len2); + if (ret) { + (void) krb5_storage_seek(sp, oldoff, SEEK_SET); + return ret; } + if (tstampp) + *tstampp = tstamp; + if (ver2 != *verp || len2 != *lenp) + goto log_corrupt; + return 0; - end_of_storage: - krb5_storage_seek(sp, oldoff, SEEK_SET); - krb5_set_error_message(context, ret, "kadm5_log_previous: end of storage " - "reached before end"); - return ret; +log_corrupt: + (void) krb5_storage_seek(sp, oldoff, SEEK_SET); + return KADM5_LOG_CORRUPT; } /* @@ -922,65 +2244,371 @@ */ kadm5_ret_t -kadm5_log_replay (kadm5_server_context *context, - enum kadm_ops op, - uint32_t ver, - uint32_t len, - krb5_storage *sp) +kadm5_log_replay(kadm5_server_context *context, + enum kadm_ops op, + uint32_t ver, + uint32_t len, + krb5_storage *sp) { switch (op) { case kadm_create : - return kadm5_log_replay_create (context, ver, len, sp); + return kadm5_log_replay_create(context, ver, len, sp); case kadm_delete : - return kadm5_log_replay_delete (context, ver, len, sp); + return kadm5_log_replay_delete(context, ver, len, sp); case kadm_rename : - return kadm5_log_replay_rename (context, ver, len, sp); + return kadm5_log_replay_rename(context, ver, len, sp); case kadm_modify : - return kadm5_log_replay_modify (context, ver, len, sp); + return kadm5_log_replay_modify(context, ver, len, sp); case kadm_nop : - return kadm5_log_replay_nop (context, ver, len, sp); + return kadm5_log_replay_nop(context, ver, len, sp); default : + /* + * FIXME This default arm makes it difficult to add new kadm_ops + * values. + */ krb5_set_error_message(context->context, KADM5_FAILURE, "Unsupported replay op %d", (int)op); + (void) krb5_storage_seek(sp, len, SEEK_CUR); return KADM5_FAILURE; } } +struct load_entries_data { + krb5_data *entries; + unsigned char *p; + uint32_t first; + uint32_t last; + size_t bytes; + size_t nentries; + size_t maxbytes; + size_t maxentries; +}; + + /* - * truncate the log - i.e. create an empty file with just (nop vno + 2) + * Prepend one entry with header and trailer to the entry buffer, stopping when + * we've reached either of the byte or entry-count limits (if non-zero). + * + * This is a two-pass algorithm: + * + * In the first pass, when entries->entries == NULL, we compute the space + * required, and count the entries that fit up from zero. + * + * In the second pass we fill the buffer, and count the entries back down to + * zero. The space used must be an exact fit, and the number of entries must + * reach zero at that point or an error is returned. + * + * The caller MUST check that entries->nentries == 0 at the end of the second + * pass. */ +static kadm5_ret_t +load_entries_cb(kadm5_server_context *server_context, + uint32_t ver, + time_t timestamp, + enum kadm_ops op, + uint32_t len, + krb5_storage *sp, + void *ctx) +{ + struct load_entries_data *entries = ctx; + kadm5_ret_t ret; + ssize_t bytes; + size_t entry_len = len + LOG_WRAPPER_SZ; + unsigned char *base; + + if (entries->entries == NULL) { + size_t total = entries->bytes + entry_len; + + /* + * First run: find the size of krb5_data buffer needed. + * + * If the log was huge we'd have to perhaps open a temp file for this. + * For now KISS. + */ + if ((op == kadm_nop && entry_len == LOG_UBER_SZ) || + entry_len < len /*overflow?*/ || + (entries->maxbytes > 0 && total > entries->maxbytes) || + total < entries->bytes /*overflow?*/ || + (entries->maxentries > 0 && entries->nentries == entries->maxentries)) + return -1; /* stop iteration */ + entries->bytes = total; + entries->first = ver; + if (entries->nentries++ == 0) + entries->last = ver; + return 0; + } -kadm5_ret_t -kadm5_log_truncate (kadm5_server_context *server_context) + /* Second run: load the data into memory */ + base = (unsigned char *)entries->entries->data; + if (entries->p - base < entry_len && entries->p != base) { + /* + * This can't happen normally: we stop the log record iteration + * above before we get here. This could happen if someone wrote + * garbage to the log while we were traversing it. We return an + * error instead of asserting. + */ + return KADM5_LOG_CORRUPT; + } + + /* + * sp here is a krb5_storage_from_fd() of the log file, and the + * offset pointer points at the current log record payload. + * + * Seek back to the start of the record poayload so we can read the + * whole record. + */ + if (krb5_storage_seek(sp, -LOG_HEADER_SZ, SEEK_CUR) == -1) + return errno; + + /* + * We read the header, payload, and trailer into the buffer we have, that + * many bytes before the previous record we read. + */ + errno = 0; + bytes = krb5_storage_read(sp, entries->p - entry_len, entry_len); + ret = errno; + if (bytes < 0 || bytes != entry_len) + return ret ? ret : EIO; + + entries->first = ver; + --entries->nentries; + entries->p -= entry_len; + return (entries->p == base) ? -1 : 0; +} + + +/* + * Serialize a tail fragment of the log as a krb5_data, this is constrained to + * at most `maxbytes' bytes and to at most `maxentries' entries if not zero. + */ +static kadm5_ret_t +load_entries(kadm5_server_context *context, krb5_data *p, + size_t maxentries, size_t maxbytes, + uint32_t *first, uint32_t *last) { + struct load_entries_data entries; kadm5_ret_t ret; - uint32_t vno; + unsigned char *base; - ret = kadm5_log_init (server_context); - if (ret) - return ret; + krb5_data_zero(p); - ret = kadm5_log_get_version (server_context, &vno); - if (ret) - return ret; + *first = 0; - ret = kadm5_log_reinit (server_context); - if (ret) - return ret; + memset(&entries, 0, sizeof(entries)); + entries.entries = NULL; + entries.p = NULL; + entries.maxentries = maxentries; + entries.maxbytes = maxbytes; - ret = kadm5_log_set_version (server_context, vno); + /* Figure out how many bytes it will take */ + ret = kadm5_log_foreach(context, kadm_backward | kadm_confirmed, + NULL, load_entries_cb, &entries); if (ret) - return ret; + return ret; - ret = kadm5_log_nop (server_context); + /* + * If no entries fit our limits, we do not truncate, instead the caller can + * call kadm5_log_reinit() if desired. + */ + if (entries.bytes == 0) + return 0; + + ret = krb5_data_alloc(p, entries.bytes); if (ret) - return ret; + return ret; + + *first = entries.first; + *last = entries.last; + entries.entries = p; + base = (unsigned char *)entries.entries->data; + entries.p = base + entries.bytes; + + ret = kadm5_log_foreach(context, kadm_backward | kadm_confirmed, + NULL, load_entries_cb, &entries); + if (ret == 0 && + (entries.nentries || entries.p != base || entries.first != *first)) + ret = KADM5_LOG_CORRUPT; + if (ret) + krb5_data_free(p); + return ret; +} + +/* + * Truncate the log, retaining at most `keep' entries and at most `maxbytes'. + * If `maxbytes' is zero, keep at most the default log size limit. + */ +kadm5_ret_t +kadm5_log_truncate(kadm5_server_context *context, size_t keep, size_t maxbytes) +{ + kadm5_ret_t ret; + uint32_t first, last, last_tstamp; + time_t now = time(NULL); + krb5_data entries; + krb5_storage *sp; + ssize_t bytes; + uint64_t sz; + off_t off; + + if (maxbytes == 0) + maxbytes = get_max_log_size(context->context); - ret = kadm5_log_end (server_context); + if (strcmp(context->log_context.log_file, "/dev/null") == 0) + return 0; + + if (context->log_context.read_only) + return EROFS; + + /* Get the desired records. */ + krb5_data_zero(&entries); + ret = load_entries(context, &entries, keep, maxbytes, &first, &last); if (ret) - return ret; - return 0; + return ret; + + if (first == 0) { + /* + * No records found/fit within resource limits. The caller should call + * kadm5_log_reinit(context) to truly truncate and reset the log to + * version 0, else call again with better limits. + */ + krb5_data_free(&entries); + return EINVAL; + } + + /* Check that entries.length won't overflow off_t */ + sz = LOG_UBER_SZ + entries.length; + off = (off_t)sz; + if (off < 0 || off != sz || sz < entries.length) { + krb5_data_free(&entries); + return EOVERFLOW; /* caller should ask for fewer entries */ + } + + /* Truncate to zero size and seek to zero offset */ + if (ftruncate(context->log_context.log_fd, 0) < 0 || + lseek(context->log_context.log_fd, 0, SEEK_SET) < 0) { + krb5_data_free(&entries); + return errno; + } + + /* + * Write the uber record and then the records loaded. Confirm the entries + * after writing them. + * + * If we crash then the log may not have all the entries we want, and + * replaying only some of the entries will leave us in a bad state. + * Additionally, we don't have mathematical proof that replaying the last + * N>1 entries is always idempotent. And though we believe we can make + * such replays idempotent, they would still leave the HDB with + * intermediate states that would not have occurred on the master. + * + * By initially setting the offset in the uber record to 0, the log will be + * seen as invalid should we crash here, thus the only + * harm will be that we'll reinitialize the log and force full props. + * + * We can't use the normal kadm5_log_*() machinery for this because + * we must set specific version numbers and timestamps. To keep + * things simple we don't try to do a single atomic write here as we + * do in kadm5_log_flush(). + * + * We really do want to keep the new first entry's version and + * timestamp so we don't trip up iprop. + * + * Keep this in sync with kadm5_log_nop(). + */ + sp = krb5_storage_from_fd(context->log_context.log_fd); + if (sp == NULL) { + ret = errno; + krb5_warn(context->context, ret, "Unable to keep entries"); + krb5_data_free(&entries); + return errno; + } + ret = krb5_store_uint32(sp, 0); + if (ret == 0) + ret = krb5_store_uint32(sp, now); + if (ret == 0) + ret = krb5_store_uint32(sp, kadm_nop); /* end of preamble */ + if (ret == 0) + ret = krb5_store_uint32(sp, LOG_UBER_LEN); /* end of header */ + if (ret == 0) + ret = krb5_store_uint64(sp, LOG_UBER_SZ); + if (ret == 0) + ret = krb5_store_uint32(sp, now); + if (ret == 0) + ret = krb5_store_uint32(sp, last); + if (ret == 0) + ret = krb5_store_uint32(sp, LOG_UBER_LEN); + if (ret == 0) + ret = krb5_store_uint32(sp, 0); /* end of trailer */ + if (ret == 0) { + bytes = krb5_storage_write(sp, entries.data, entries.length); + if (bytes == -1) + ret = errno; + } + if (ret == 0) + ret = krb5_storage_fsync(sp); + /* Confirm all the records now */ + if (ret == 0) { + if (krb5_storage_seek(sp, LOG_HEADER_SZ, SEEK_SET) == -1) + ret = errno; + } + if (ret == 0) + ret = krb5_store_uint64(sp, off); + krb5_data_free(&entries); + krb5_storage_free(sp); + if (ret) { + krb5_warn(context->context, ret, "Unable to keep entries"); + (void) ftruncate(context->log_context.log_fd, LOG_UBER_SZ); + (void) lseek(context->log_context.log_fd, 0, SEEK_SET); + return ret; + } + + /* Done. Now rebuild the log_context state. */ + (void) lseek(context->log_context.log_fd, off, SEEK_SET); + sp = krb5_storage_from_fd(context->log_context.log_fd); + if (sp == NULL) + return errno ? errno : krb5_enomem(context->context); + ret = kadm5_log_goto_end(context, sp); + if (ret == 0) { + ret = get_version_prev(sp, &context->log_context.version, &last_tstamp); + if (ret == 0) + context->log_context.last_time = last_tstamp; + } + krb5_storage_free(sp); + return ret; +} + +/* + * "Truncate" the log if not read only and over the desired maximum size. We + * attempt to retain 1/4 of the existing storage. + * + * Called after successful log recovery, so at this point we must have no + * unconfirmed entries in the log. + */ +static kadm5_ret_t +truncate_if_needed(kadm5_server_context *context) +{ + kadm5_ret_t ret = 0; + kadm5_log_context *log_context = &context->log_context; + size_t maxbytes; + struct stat st; + + if (log_context->log_fd == -1 || log_context->read_only) + return 0; + if (strcmp(context->log_context.log_file, "/dev/null") == 0) + return 0; + + maxbytes = get_max_log_size(context->context); + if (maxbytes <= 0) + return 0; + + if (fstat(log_context->log_fd, &st) == -1) + return errno; + if (st.st_size == (size_t)st.st_size && (size_t)st.st_size <= maxbytes) + return 0; + + /* Shrink the log by a factor of 4 */ + ret = kadm5_log_truncate(context, 0, maxbytes/4); + return ret == EINVAL ? 0 : ret; } #ifndef NO_UNIX_SOCKETS @@ -991,9 +2619,13 @@ const char * kadm5_log_signal_socket(krb5_context context) { + int ret = 0; + HEIMDAL_MUTEX_lock(&signal_mutex); if (!default_signal) - asprintf(&default_signal, "%s/signal", hdb_db_dir(context)); + ret = asprintf(&default_signal, "%s/signal", hdb_db_dir(context)); + if (ret == -1) + default_signal = NULL; HEIMDAL_MUTEX_unlock(&signal_mutex); return krb5_config_get_string_default(context, diff --git a/crypto/heimdal/lib/kadm5/marshall.c b/crypto/heimdal/lib/kadm5/marshall.c --- a/crypto/heimdal/lib/kadm5/marshall.c +++ b/crypto/heimdal/lib/kadm5/marshall.c @@ -34,23 +34,85 @@ #include "kadm5_locl.h" RCSID("$Id$"); -#define CHECK(e) do { if (e) return EINVAL; } while (0) + +int +kadm5_some_keys_are_bogus(size_t n_keys, krb5_key_data *keys) +{ + size_t i; + + for (i = 0; i < n_keys; i++) { + krb5_key_data *key = &keys[i]; + if (key->key_data_length[0] == sizeof(KADM5_BOGUS_KEY_DATA) - 1 && + ct_memcmp(key->key_data_contents[1], KADM5_BOGUS_KEY_DATA, + key->key_data_length[0]) == 0) + return 1; + } + return 0; +} + +int +kadm5_all_keys_are_bogus(size_t n_keys, krb5_key_data *keys) +{ + size_t i; + + if (n_keys == 0) + return 0; + + for (i = 0; i < n_keys; i++) { + krb5_key_data *key = &keys[i]; + if (key->key_data_length[0] != sizeof(KADM5_BOGUS_KEY_DATA) - 1 || + ct_memcmp(key->key_data_contents[1], KADM5_BOGUS_KEY_DATA, + key->key_data_length[0]) != 0) + return 0; + } + return 1; +} kadm5_ret_t kadm5_store_key_data(krb5_storage *sp, krb5_key_data *key) { krb5_data c; - CHECK(krb5_store_int32(sp, key->key_data_ver)); - CHECK(krb5_store_int32(sp, key->key_data_kvno)); - CHECK(krb5_store_int32(sp, key->key_data_type[0])); + krb5_store_int32(sp, key->key_data_ver); + krb5_store_int32(sp, key->key_data_kvno); + krb5_store_int32(sp, key->key_data_type[0]); c.length = key->key_data_length[0]; c.data = key->key_data_contents[0]; - CHECK(krb5_store_data(sp, c)); - CHECK(krb5_store_int32(sp, key->key_data_type[1])); + krb5_store_data(sp, c); + krb5_store_int32(sp, key->key_data_type[1]); + c.length = key->key_data_length[1]; + c.data = key->key_data_contents[1]; + krb5_store_data(sp, c); + return 0; +} + +kadm5_ret_t +kadm5_store_fake_key_data(krb5_storage *sp, + krb5_key_data *key) +{ + krb5_data c; + + krb5_store_int32(sp, key->key_data_ver); + krb5_store_int32(sp, key->key_data_kvno); + krb5_store_int32(sp, key->key_data_type[0]); + + /* + * This is the key contents. We want it to be obvious to the client + * (if it really did want the keys) that the key won't work. + * 32-bit keys are no good for any enctype, so that should do. + * Clients that didn't need keys will ignore this, and clients that + * did want keys will either fail or they'll, say, create bogus + * keytab entries that will subsequently fail to be useful. + */ + c.length = sizeof (KADM5_BOGUS_KEY_DATA) - 1; + c.data = KADM5_BOGUS_KEY_DATA; + krb5_store_data(sp, c); + + /* This is the salt -- no need to send garbage */ + krb5_store_int32(sp, key->key_data_type[1]); c.length = key->key_data_length[1]; c.data = key->key_data_contents[1]; - CHECK(krb5_store_data(sp, c)); + krb5_store_data(sp, c); return 0; } @@ -58,37 +120,23 @@ kadm5_ret_key_data(krb5_storage *sp, krb5_key_data *key) { - kadm5_ret_t ret; krb5_data c; int32_t tmp; - ret = krb5_ret_int32(sp, &tmp); - if (ret == 0) { - key->key_data_ver = tmp; - ret = krb5_ret_int32(sp, &tmp); - } - if (ret == 0) { - key->key_data_kvno = tmp; - ret = krb5_ret_int32(sp, &tmp); - } - if (ret == 0) { - key->key_data_type[0] = tmp; - ret = krb5_ret_data(sp, &c); - } - if (ret == 0) { - key->key_data_length[0] = c.length; - key->key_data_contents[0] = c.data; - ret = krb5_ret_int32(sp, &tmp); - } - if (ret == 0) { - key->key_data_type[1] = tmp; - ret = krb5_ret_data(sp, &c); - } - if (ret == 0) { - key->key_data_length[1] = c.length; - key->key_data_contents[1] = c.data; - return 0; - } - return KADM5_FAILURE; + krb5_ret_int32(sp, &tmp); + key->key_data_ver = tmp; + krb5_ret_int32(sp, &tmp); + key->key_data_kvno = tmp; + krb5_ret_int32(sp, &tmp); + key->key_data_type[0] = tmp; + krb5_ret_data(sp, &c); + key->key_data_length[0] = c.length; + key->key_data_contents[0] = c.data; + krb5_ret_int32(sp, &tmp); + key->key_data_type[1] = tmp; + krb5_ret_data(sp, &c); + key->key_data_length[1] = c.length; + key->key_data_contents[1] = c.data; + return 0; } kadm5_ret_t @@ -96,10 +144,10 @@ krb5_tl_data *tl) { krb5_data c; - CHECK(krb5_store_int32(sp, tl->tl_data_type)); + krb5_store_int32(sp, tl->tl_data_type); c.length = tl->tl_data_length; c.data = tl->tl_data_contents; - CHECK(krb5_store_data(sp, c)); + krb5_store_data(sp, c); return 0; } @@ -111,7 +159,7 @@ int32_t tmp; krb5_ret_int32(sp, &tmp); tl->tl_data_type = tmp; - CHECK(krb5_ret_data(sp, &c)); + krb5_ret_data(sp, &c); tl->tl_data_length = c.length; tl->tl_data_contents = c.data; return 0; @@ -120,59 +168,63 @@ static kadm5_ret_t store_principal_ent(krb5_storage *sp, kadm5_principal_ent_t princ, - uint32_t mask) + uint32_t mask, int wkeys) { int i; if (mask & KADM5_PRINCIPAL) - CHECK(krb5_store_principal(sp, princ->principal)); + krb5_store_principal(sp, princ->principal); if (mask & KADM5_PRINC_EXPIRE_TIME) - CHECK(krb5_store_int32(sp, princ->princ_expire_time)); + krb5_store_int32(sp, princ->princ_expire_time); if (mask & KADM5_PW_EXPIRATION) - CHECK(krb5_store_int32(sp, princ->pw_expiration)); + krb5_store_int32(sp, princ->pw_expiration); if (mask & KADM5_LAST_PWD_CHANGE) - CHECK(krb5_store_int32(sp, princ->last_pwd_change)); + krb5_store_int32(sp, princ->last_pwd_change); if (mask & KADM5_MAX_LIFE) - CHECK(krb5_store_int32(sp, princ->max_life)); + krb5_store_int32(sp, princ->max_life); if (mask & KADM5_MOD_NAME) { - CHECK(krb5_store_int32(sp, princ->mod_name != NULL)); + krb5_store_int32(sp, princ->mod_name != NULL); if(princ->mod_name) - CHECK(krb5_store_principal(sp, princ->mod_name)); + krb5_store_principal(sp, princ->mod_name); } if (mask & KADM5_MOD_TIME) - CHECK(krb5_store_int32(sp, princ->mod_date)); + krb5_store_int32(sp, princ->mod_date); if (mask & KADM5_ATTRIBUTES) - CHECK(krb5_store_int32(sp, princ->attributes)); + krb5_store_int32(sp, princ->attributes); if (mask & KADM5_KVNO) - CHECK(krb5_store_int32(sp, princ->kvno)); + krb5_store_int32(sp, princ->kvno); if (mask & KADM5_MKVNO) - CHECK(krb5_store_int32(sp, princ->mkvno)); + krb5_store_int32(sp, princ->mkvno); if (mask & KADM5_POLICY) { - CHECK(krb5_store_int32(sp, princ->policy != NULL)); + krb5_store_int32(sp, princ->policy != NULL); if(princ->policy) - CHECK(krb5_store_string(sp, princ->policy)); + krb5_store_string(sp, princ->policy); } if (mask & KADM5_AUX_ATTRIBUTES) - CHECK(krb5_store_int32(sp, princ->aux_attributes)); + krb5_store_int32(sp, princ->aux_attributes); if (mask & KADM5_MAX_RLIFE) - CHECK(krb5_store_int32(sp, princ->max_renewable_life)); + krb5_store_int32(sp, princ->max_renewable_life); if (mask & KADM5_LAST_SUCCESS) - CHECK(krb5_store_int32(sp, princ->last_success)); + krb5_store_int32(sp, princ->last_success); if (mask & KADM5_LAST_FAILED) - CHECK(krb5_store_int32(sp, princ->last_failed)); + krb5_store_int32(sp, princ->last_failed); if (mask & KADM5_FAIL_AUTH_COUNT) - CHECK(krb5_store_int32(sp, princ->fail_auth_count)); + krb5_store_int32(sp, princ->fail_auth_count); if (mask & KADM5_KEY_DATA) { - CHECK(krb5_store_int32(sp, princ->n_key_data)); - for(i = 0; i < princ->n_key_data; i++) - CHECK(kadm5_store_key_data(sp, &princ->key_data[i])); + krb5_store_int32(sp, princ->n_key_data); + for(i = 0; i < princ->n_key_data; i++) { + if (wkeys) + kadm5_store_key_data(sp, &princ->key_data[i]); + else + kadm5_store_fake_key_data(sp, &princ->key_data[i]); + } } if (mask & KADM5_TL_DATA) { krb5_tl_data *tp; - CHECK(krb5_store_int32(sp, princ->n_tl_data)); + krb5_store_int32(sp, princ->n_tl_data); for(tp = princ->tl_data; tp; tp = tp->tl_data_next) - CHECK(kadm5_store_tl_data(sp, tp)); + kadm5_store_tl_data(sp, tp); } return 0; } @@ -182,7 +234,14 @@ kadm5_store_principal_ent(krb5_storage *sp, kadm5_principal_ent_t princ) { - return store_principal_ent (sp, princ, ~0); + return store_principal_ent (sp, princ, ~0, 1); +} + +kadm5_ret_t +kadm5_store_principal_ent_nokeys(krb5_storage *sp, + kadm5_principal_ent_t princ) +{ + return store_principal_ent (sp, princ, ~0, 0); } kadm5_ret_t @@ -190,12 +249,8 @@ kadm5_principal_ent_t princ, uint32_t mask) { - kadm5_ret_t ret; - - ret = krb5_store_int32(sp, mask); - if (ret == 0) - ret = store_principal_ent (sp, princ, mask); - return (ret); + krb5_store_int32(sp, mask); + return store_principal_ent (sp, princ, mask, 1); } static kadm5_ret_t @@ -206,92 +261,93 @@ int i; int32_t tmp; - if (mask & KADM5_PRINCIPAL) - CHECK(krb5_ret_principal(sp, &princ->principal)); + if (mask & KADM5_PRINCIPAL) + krb5_ret_principal(sp, &princ->principal); + if (mask & KADM5_PRINC_EXPIRE_TIME) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->princ_expire_time = tmp; } if (mask & KADM5_PW_EXPIRATION) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->pw_expiration = tmp; } if (mask & KADM5_LAST_PWD_CHANGE) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->last_pwd_change = tmp; } if (mask & KADM5_MAX_LIFE) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->max_life = tmp; } if (mask & KADM5_MOD_NAME) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); if(tmp) - CHECK(krb5_ret_principal(sp, &princ->mod_name)); + krb5_ret_principal(sp, &princ->mod_name); else princ->mod_name = NULL; } if (mask & KADM5_MOD_TIME) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->mod_date = tmp; } if (mask & KADM5_ATTRIBUTES) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->attributes = tmp; } if (mask & KADM5_KVNO) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->kvno = tmp; } if (mask & KADM5_MKVNO) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->mkvno = tmp; } if (mask & KADM5_POLICY) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); if(tmp) - CHECK(krb5_ret_string(sp, &princ->policy)); + krb5_ret_string(sp, &princ->policy); else princ->policy = NULL; } if (mask & KADM5_AUX_ATTRIBUTES) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->aux_attributes = tmp; } if (mask & KADM5_MAX_RLIFE) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->max_renewable_life = tmp; } if (mask & KADM5_LAST_SUCCESS) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->last_success = tmp; } if (mask & KADM5_LAST_FAILED) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->last_failed = tmp; } if (mask & KADM5_FAIL_AUTH_COUNT) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->fail_auth_count = tmp; } if (mask & KADM5_KEY_DATA) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->n_key_data = tmp; princ->key_data = malloc(princ->n_key_data * sizeof(*princ->key_data)); if (princ->key_data == NULL && princ->n_key_data != 0) return ENOMEM; for(i = 0; i < princ->n_key_data; i++) - CHECK(kadm5_ret_key_data(sp, &princ->key_data[i])); + kadm5_ret_key_data(sp, &princ->key_data[i]); } if (mask & KADM5_TL_DATA) { - CHECK(krb5_ret_int32(sp, &tmp)); + krb5_ret_int32(sp, &tmp); princ->n_tl_data = tmp; princ->tl_data = NULL; for(i = 0; i < princ->n_tl_data; i++){ krb5_tl_data *tp = malloc(sizeof(*tp)); if (tp == NULL) return ENOMEM; - CHECK(kadm5_ret_tl_data(sp, tp)); + kadm5_ret_tl_data(sp, tp); tp->tl_data_next = princ->tl_data; princ->tl_data = tp; } @@ -311,14 +367,9 @@ kadm5_principal_ent_t princ, uint32_t *mask) { - kadm5_ret_t ret; int32_t tmp; - ret = krb5_ret_int32 (sp, &tmp); - if (ret) { - *mask = 0; - return (ret); - } + krb5_ret_int32 (sp, &tmp); *mask = tmp; return ret_principal_ent (sp, princ, *mask); } @@ -328,19 +379,16 @@ kadm5_config_params *params, krb5_data *out) { - kadm5_ret_t ret; - krb5_storage *sp = krb5_storage_emem(); - ret = krb5_store_int32(sp, params->mask & (KADM5_CONFIG_REALM)); + krb5_store_int32(sp, params->mask & (KADM5_CONFIG_REALM)); - if (ret == 0 && params->mask & KADM5_CONFIG_REALM) - ret = krb5_store_string(sp, params->realm); - if (ret == 0) - krb5_storage_to_data(sp, out); + if(params->mask & KADM5_CONFIG_REALM) + krb5_store_string(sp, params->realm); + krb5_storage_to_data(sp, out); krb5_storage_free(sp); - return (ret); + return 0; } kadm5_ret_t @@ -359,40 +407,10 @@ ret = krb5_ret_int32(sp, &mask); if (ret) goto out; - if (mask & KADM5_CONFIG_REALM & KADM5_CONFIG_DBNAME - & KADM5_CONFIG_ACL_FILE & KADM5_CONFIG_STASH_FILE) { - ret = EINVAL; - goto out; - } params->mask = mask; - if (params->mask & KADM5_CONFIG_REALM) { + if(params->mask & KADM5_CONFIG_REALM) ret = krb5_ret_string(sp, ¶ms->realm); - if (params->realm == NULL) { - ret = EINVAL; - goto out; - } - } - if (params->mask & KADM5_CONFIG_DBNAME) { - ret = krb5_ret_string(sp, ¶ms->dbname); - if (params->dbname == NULL) { - ret = EINVAL; - goto out; - } - } - if (params->mask & KADM5_CONFIG_ACL_FILE) { - ret = krb5_ret_string(sp, ¶ms->acl_file); - if (params->acl_file == NULL) { - ret = EINVAL; - goto out; - } - } - if (params->mask & KADM5_CONFIG_STASH_FILE) { - ret = krb5_ret_string(sp, ¶ms->stash_file); - if (params->stash_file == NULL) { - ret = EINVAL; - } - } out: krb5_storage_free(sp); diff --git a/crypto/heimdal/lib/kadm5/modify_s.c b/crypto/heimdal/lib/kadm5/modify_s.c --- a/crypto/heimdal/lib/kadm5/modify_s.c +++ b/crypto/heimdal/lib/kadm5/modify_s.c @@ -44,43 +44,87 @@ kadm5_server_context *context = server_handle; hdb_entry_ex ent; kadm5_ret_t ret; + + memset(&ent, 0, sizeof(ent)); + if((mask & forbidden_mask)) return KADM5_BAD_MASK; if((mask & KADM5_POLICY) && strcmp(princ->policy, "default")) return KADM5_UNK_POLICY; - memset(&ent, 0, sizeof(ent)); - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) - return ret; + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if(ret) + return ret; + } + + ret = kadm5_log_init(context); + if (ret) + goto out; + ret = context->db->hdb_fetch_kvno(context->context, context->db, princ->principal, HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); - if(ret) - goto out; - ret = _kadm5_setup_entry(context, &ent, mask, princ, mask, NULL, 0); - if(ret) + if (ret) goto out2; + ret = _kadm5_setup_entry(context, &ent, mask, princ, mask, NULL, 0); + if (ret) + goto out3; ret = _kadm5_set_modifier(context, &ent.entry); - if(ret) - goto out2; + if (ret) + goto out3; + + /* + * If any keys are bogus, disallow the modify. If the keys were + * bogus as stored in the HDB we could allow those through, but + * distinguishing that case from a pre-1.6 client using add_enctype + * without the get-keys privilege requires more work (mainly: checking that + * the bogus keys in princ->key_data[] have corresponding bogus keys in ent + * before calling _kadm5_setup_entry()). + */ + if ((mask & KADM5_KEY_DATA) && + kadm5_some_keys_are_bogus(princ->n_key_data, princ->key_data)) { + ret = KADM5_AUTH_GET_KEYS; /* Not quite appropriate, but it'll do */ + goto out3; + } ret = hdb_seal_keys(context->context, context->db, &ent.entry); if (ret) - goto out2; + goto out3; - ret = context->db->hdb_store(context->context, context->db, - HDB_F_REPLACE, &ent); - if (ret) - goto out2; + if ((mask & KADM5_POLICY)) { + HDB_extension ext; + + memset(&ext, 0, sizeof(ext)); + /* XXX should be TRUE, but we don't yet support policies */ + ext.mandatory = FALSE; + ext.data.element = choice_HDB_extension_data_policy; + ext.data.u.policy = strdup(princ->policy); + if (ext.data.u.policy == NULL) { + ret = ENOMEM; + goto out3; + } + /* This calls free_HDB_extension(), freeing ext.data.u.policy */ + ret = hdb_replace_extension(context->context, &ent.entry, &ext); + free(ext.data.u.policy); + if (ret) + goto out3; + } - kadm5_log_modify (context, - &ent.entry, - mask | KADM5_MOD_NAME | KADM5_MOD_TIME); + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_modify(context, &ent.entry, + mask | KADM5_MOD_NAME | KADM5_MOD_TIME); -out2: + out3: hdb_free_entry(context->context, &ent); -out: - context->db->hdb_close(context->context, context->db); + out2: + (void) kadm5_log_end(context); + out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } return _kadm5_error_code(ret); } diff --git a/crypto/heimdal/lib/kadm5/password_quality.c b/crypto/heimdal/lib/kadm5/password_quality.c --- a/crypto/heimdal/lib/kadm5/password_quality.c +++ b/crypto/heimdal/lib/kadm5/password_quality.c @@ -91,7 +91,7 @@ "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz", "1234567890", - "!@#$%^&*()/?<>,.{[]}\\|'~`\" " + " !\"#$%&'()*+,-./:;<=>?@\\]^_`{|}~" }; int counter = 0, req_classes; size_t i, len; @@ -120,11 +120,12 @@ if (counter < req_classes) { snprintf(message, length, "Password doesn't meet complexity requirement.\n" - "Add more characters from the following classes:\n" + "Add more characters from at least %d of the\n" + "following classes:\n" "1. English uppercase characters (A through Z)\n" "2. English lowercase characters (a through z)\n" "3. Base 10 digits (0 through 9)\n" - "4. Nonalphanumeric characters (e.g., !, $, #, %%)"); + "4. Nonalphanumeric characters (e.g., !, $, #, %%)", req_classes); return 1; } return 0; @@ -377,23 +378,24 @@ #ifdef HAVE_DLOPEN if(check_library == NULL) { - krb5_error_code ret; + krb5_error_code ret = 0; + char **strs; char **tmp; - tmp = krb5_config_get_strings(context, NULL, - "password_quality", - "policy_libraries", - NULL); - if(tmp == NULL || *tmp == NULL) + strs = krb5_config_get_strings(context, NULL, + "password_quality", + "policy_libraries", + NULL); + if (strs == NULL) return 0; - while (*tmp) { + for (tmp = strs; *tmp; tmp++) { ret = add_verifier(context, *tmp); if (ret) - return ret; - tmp++; + break; } - return 0; + krb5_config_free_strings(strs); + return ret; } else { return add_verifier(context, check_library); } diff --git a/crypto/heimdal/lib/kadm5/private.h b/crypto/heimdal/lib/kadm5/private.h --- a/crypto/heimdal/lib/kadm5/private.h +++ b/crypto/heimdal/lib/kadm5/private.h @@ -36,10 +36,16 @@ #ifndef __kadm5_privatex_h__ #define __kadm5_privatex_h__ +#ifdef HAVE_SYS_UN_H +#include +#endif + struct kadm_func { - kadm5_ret_t (*chpass_principal) (void *, krb5_principal, const char*); - kadm5_ret_t (*create_principal) (void*, kadm5_principal_ent_t, - uint32_t, const char*); + kadm5_ret_t (*chpass_principal) (void *, krb5_principal, int, + int, krb5_key_salt_tuple*, const char*); + kadm5_ret_t (*create_principal) (void*, kadm5_principal_ent_t, uint32_t, + int, krb5_key_salt_tuple *, + const char*); kadm5_ret_t (*delete_principal) (void*, krb5_principal); kadm5_ret_t (*destroy) (void*); kadm5_ret_t (*flush) (void*); @@ -48,11 +54,17 @@ kadm5_ret_t (*get_principals) (void*, const char*, char***, int*); kadm5_ret_t (*get_privs) (void*, uint32_t*); kadm5_ret_t (*modify_principal) (void*, kadm5_principal_ent_t, uint32_t); - kadm5_ret_t (*randkey_principal) (void*, krb5_principal, - krb5_keyblock**, int*); + kadm5_ret_t (*randkey_principal) (void*, krb5_principal, krb5_boolean, int, + krb5_key_salt_tuple*, krb5_keyblock**, + int*); kadm5_ret_t (*rename_principal) (void*, krb5_principal, krb5_principal); - kadm5_ret_t (*chpass_principal_with_key) (void *, krb5_principal, + kadm5_ret_t (*chpass_principal_with_key) (void *, krb5_principal, int, int, krb5_key_data *); + kadm5_ret_t (*lock) (void *); + kadm5_ret_t (*unlock) (void *); + kadm5_ret_t (*setkey_principal_3) (void *, krb5_principal, krb5_boolean, + int, krb5_key_salt_tuple *, + krb5_keyblock *, int); }; /* XXX should be integrated */ @@ -61,7 +73,7 @@ krb5_boolean my_context; struct kadm_func funcs; void *data; -}kadm5_common_context; +} kadm5_common_context; typedef struct kadm5_log_peer { int fd; @@ -73,7 +85,10 @@ typedef struct kadm5_log_context { char *log_file; int log_fd; + int read_only; + int lock_mode; uint32_t version; + time_t last_time; #ifndef NO_UNIX_SOCKETS struct sockaddr_un socket_name; #else @@ -89,6 +104,7 @@ /* */ kadm5_config_params config; HDB *db; + int keep_open; krb5_principal caller; unsigned acl_flags; kadm5_log_context log_context; @@ -103,14 +119,14 @@ char *realm; char *admin_server; int kadmind_port; - int sock; + krb5_socket_t sock; char *client_name; char *service_name; krb5_prompter_fct prompter; const char *keytab; krb5_ccache ccache; kadm5_config_params *realm_params; -}kadm5_client_context; +} kadm5_client_context; typedef struct kadm5_ad_context { krb5_context context; @@ -126,6 +142,11 @@ char *base_dn; } kadm5_ad_context; +/* + * This enum is used in the iprop log file and on the wire in the iprop + * protocol. DO NOT CHANGE, except to add new op types at the end, and + * look for places in lib/kadm5/log.c to update. + */ enum kadm_ops { kadm_get, kadm_delete, @@ -137,7 +158,28 @@ kadm_get_privs, kadm_get_princs, kadm_chpass_with_key, - kadm_nop + kadm_nop, + kadm_first = kadm_get, + kadm_last = kadm_nop +}; + +/* FIXME nop types are currently not implemented */ +enum kadm_nop_type { + kadm_nop_plain, /* plain nop, not relevance except as uberblock */ + kadm_nop_trunc, /* indicates that the master truncated the log */ + kadm_nop_close /* indicates that the master closed this log */ +}; + +enum kadm_iter_opts { + kadm_forward = 1, + kadm_backward = 2, + kadm_confirmed = 4, + kadm_unconfirmed = 8 +}; + +enum kadm_recover_mode { + kadm_recover_commit, + kadm_recover_replay }; #define KADMIN_APPL_VERSION "KADM0.1" diff --git a/crypto/heimdal/lib/kadm5/randkey_c.c b/crypto/heimdal/lib/kadm5/randkey_c.c --- a/crypto/heimdal/lib/kadm5/randkey_c.c +++ b/crypto/heimdal/lib/kadm5/randkey_c.c @@ -38,14 +38,18 @@ kadm5_ret_t kadm5_c_randkey_principal(void *server_handle, krb5_principal princ, + krb5_boolean keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, krb5_keyblock **new_keys, int *n_keys) { kadm5_client_context *context = server_handle; kadm5_ret_t ret; krb5_storage *sp; - unsigned char buf[1024]; + unsigned char buf[1536]; int32_t tmp; + size_t i; krb5_data reply; ret = _kadm5_connect(server_handle); @@ -57,8 +61,41 @@ krb5_clear_error_message(context->context); return ENOMEM; } - krb5_store_int32(sp, kadm_randkey); - krb5_store_principal(sp, princ); + + /* + * NOTE WELL: This message is extensible. It currently consists of: + * + * - opcode (kadm_randkey) + * - principal name (princ) + * + * followed by optional items, each of which must be present if + * there are any items following them that are also present: + * + * - keepold boolean (whether to delete old kvnos) + * - number of key/salt type tuples + * - array of {enctype, salttype} + * + * Eventually we may add: + * + * - opaque string2key parameters (salt, rounds, ...) + */ + ret = krb5_store_int32(sp, kadm_randkey); + if (ret == 0) + ret = krb5_store_principal(sp, princ); + + if (ret == 0 && (keepold == TRUE || n_ks_tuple > 0)) + ret = krb5_store_uint32(sp, keepold); + if (ret == 0 && n_ks_tuple > 0) + ret = krb5_store_uint32(sp, n_ks_tuple); + for (i = 0; ret == 0 && i < n_ks_tuple; i++) { + ret = krb5_store_int32(sp, ks_tuple[i].ks_enctype); + if (ret == 0) + krb5_store_int32(sp, ks_tuple[i].ks_salttype); + } + if (ret) + return ret; + /* Future extensions go here */ + ret = _kadm5_client_send(context, sp); krb5_storage_free(sp); if (ret) @@ -73,22 +110,35 @@ return ENOMEM; } krb5_clear_error_message(context->context); - krb5_ret_int32(sp, &tmp); - ret = tmp; - if(ret == 0){ + ret = krb5_ret_int32(sp, &tmp); + if (ret == 0) + ret = tmp; + if (ret == 0){ krb5_keyblock *k; - int i; - krb5_ret_int32(sp, &tmp); - k = malloc(tmp * sizeof(*k)); + ret = krb5_ret_int32(sp, &tmp); + if (ret) + goto out; + if (tmp < 0) { + ret = EOVERFLOW; + goto out; + } + k = calloc(tmp, sizeof(*k)); if (k == NULL) { ret = ENOMEM; goto out; } - for(i = 0; i < tmp; i++) - krb5_ret_keyblock(sp, &k[i]); - *n_keys = tmp; - *new_keys = k; + for(i = 0; ret == 0 && i < tmp; i++) + ret = krb5_ret_keyblock(sp, &k[i]); + if (ret == 0 && n_keys && new_keys) { + *n_keys = tmp; + *new_keys = k; + } else { + krb5_free_keyblock_contents(context->context, &k[i]); + for (; i > 0; i--) + krb5_free_keyblock_contents(context->context, &k[i - 1]); + free(k); + } } out: krb5_storage_free(sp); diff --git a/crypto/heimdal/lib/kadm5/randkey_s.c b/crypto/heimdal/lib/kadm5/randkey_s.c --- a/crypto/heimdal/lib/kadm5/randkey_s.c +++ b/crypto/heimdal/lib/kadm5/randkey_s.c @@ -43,6 +43,9 @@ kadm5_ret_t kadm5_s_randkey_principal(void *server_handle, krb5_principal princ, + krb5_boolean keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, krb5_keyblock **new_keys, int *n_keys) { @@ -51,57 +54,84 @@ kadm5_ret_t ret; memset(&ent, 0, sizeof(ent)); - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) - return ret; + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if(ret) + return ret; + } + + ret = kadm5_log_init(context); + if (ret) + goto out; + ret = context->db->hdb_fetch_kvno(context->context, context->db, princ, HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); if(ret) - goto out; + goto out2; + + if (keepold) { + ret = hdb_add_current_keys_to_history(context->context, &ent.entry); + if (ret) + goto out3; + } - ret = _kadm5_set_keys_randomly (context, - &ent.entry, - new_keys, - n_keys); + ret = _kadm5_set_keys_randomly(context, &ent.entry, n_ks_tuple, ks_tuple, + new_keys, n_keys); if (ret) - goto out2; + goto out3; ent.entry.kvno++; + ent.entry.flags.require_pwchange = 0; + ret = _kadm5_set_modifier(context, &ent.entry); if(ret) - goto out3; + goto out4; ret = _kadm5_bump_pw_expire(context, &ent.entry); if (ret) - goto out2; + goto out4; - ret = hdb_seal_keys(context->context, context->db, &ent.entry); - if (ret) - goto out2; + if (keepold) { + ret = hdb_seal_keys(context->context, context->db, &ent.entry); + if (ret) + goto out4; + } else { + HDB_extension ext; - ret = context->db->hdb_store(context->context, context->db, - HDB_F_REPLACE, &ent); - if (ret) - goto out2; + memset(&ext, 0, sizeof (ext)); + ext.mandatory = FALSE; + ext.data.element = choice_HDB_extension_data_hist_keys; + ext.data.u.hist_keys.len = 0; + ext.data.u.hist_keys.val = NULL; + hdb_replace_extension(context->context, &ent.entry, &ext); + } - kadm5_log_modify (context, - &ent.entry, - KADM5_PRINCIPAL | KADM5_MOD_NAME | KADM5_MOD_TIME | - KADM5_KEY_DATA | KADM5_KVNO | KADM5_PW_EXPIRATION | - KADM5_TL_DATA); + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_modify(context, &ent.entry, + KADM5_ATTRIBUTES | KADM5_PRINCIPAL | + KADM5_MOD_NAME | KADM5_MOD_TIME | + KADM5_KEY_DATA | KADM5_KVNO | + KADM5_PW_EXPIRATION | KADM5_TL_DATA); -out3: + out4: if (ret) { int i; for (i = 0; i < *n_keys; ++i) - krb5_free_keyblock_contents (context->context, &(*new_keys)[i]); + krb5_free_keyblock_contents(context->context, &(*new_keys)[i]); free (*new_keys); *new_keys = NULL; *n_keys = 0; } -out2: + out3: hdb_free_entry(context->context, &ent); -out: - context->db->hdb_close(context->context, context->db); + out2: + (void) kadm5_log_end(context); + out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } return _kadm5_error_code(ret); } diff --git a/crypto/heimdal/lib/kadm5/rename_s.c b/crypto/heimdal/lib/kadm5/rename_s.c --- a/crypto/heimdal/lib/kadm5/rename_s.c +++ b/crypto/heimdal/lib/kadm5/rename_s.c @@ -46,68 +46,74 @@ krb5_principal oldname; memset(&ent, 0, sizeof(ent)); - if(krb5_principal_compare(context->context, source, target)) + if (krb5_principal_compare(context->context, source, target)) return KADM5_DUP; /* XXX is this right? */ - ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); - if(ret) - return ret; + if (!context->keep_open) { + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if(ret) + return ret; + } + + ret = kadm5_log_init(context); + if (ret) + goto out; + ret = context->db->hdb_fetch_kvno(context->context, context->db, source, HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); - if(ret){ - context->db->hdb_close(context->context, context->db); - goto out; - } - ret = _kadm5_set_modifier(context, &ent.entry); - if(ret) + if (ret) goto out2; + oldname = ent.entry.principal; + ret = _kadm5_set_modifier(context, &ent.entry); + if (ret) + goto out3; { /* fix salt */ size_t i; Salt salt; krb5_salt salt2; memset(&salt, 0, sizeof(salt)); - ret = krb5_get_pw_salt(context->context, source, &salt2); - if (ret) - goto out; + krb5_get_pw_salt(context->context, source, &salt2); salt.type = hdb_pw_salt; salt.salt = salt2.saltvalue; for(i = 0; i < ent.entry.keys.len; i++){ if(ent.entry.keys.val[i].salt == NULL){ ent.entry.keys.val[i].salt = malloc(sizeof(*ent.entry.keys.val[i].salt)); - if(ent.entry.keys.val[i].salt == NULL) - return ENOMEM; - ret = copy_Salt(&salt, ent.entry.keys.val[i].salt); - if(ret) + if (ent.entry.keys.val[i].salt == NULL) + ret = ENOMEM; + else + ret = copy_Salt(&salt, ent.entry.keys.val[i].salt); + if (ret) break; } } krb5_free_salt(context->context, salt2); } - if(ret) - goto out2; - oldname = ent.entry.principal; - ent.entry.principal = target; + if (ret) + goto out3; + /* Borrow target */ + ent.entry.principal = target; ret = hdb_seal_keys(context->context, context->db, &ent.entry); - if (ret) { - ent.entry.principal = oldname; - goto out2; - } + if (ret) + goto out3; - kadm5_log_rename (context, source, &ent.entry); + /* This logs the change for iprop and writes to the HDB */ + ret = kadm5_log_rename(context, source, &ent.entry); - ret = context->db->hdb_store(context->context, context->db, 0, &ent); - if(ret){ - ent.entry.principal = oldname; - goto out2; - } - ret = context->db->hdb_remove(context->context, context->db, oldname); - ent.entry.principal = oldname; -out2: - context->db->hdb_close(context->context, context->db); + out3: + ent.entry.principal = oldname; /* Unborrow target */ hdb_free_entry(context->context, &ent); -out: + + out2: + (void) kadm5_log_end(context); + out: + if (!context->keep_open) { + kadm5_ret_t ret2; + ret2 = context->db->hdb_close(context->context, context->db); + if (ret == 0 && ret2 != 0) + ret = ret2; + } return _kadm5_error_code(ret); } diff --git a/crypto/heimdal/lib/kadm5/send_recv.c b/crypto/heimdal/lib/kadm5/send_recv.c --- a/crypto/heimdal/lib/kadm5/send_recv.c +++ b/crypto/heimdal/lib/kadm5/send_recv.c @@ -43,7 +43,7 @@ size_t len; krb5_storage *sock; - assert(context->sock != -1); + assert(context->sock != rk_INVALID_SOCKET); len = krb5_storage_seek(sp, 0, SEEK_CUR); ret = krb5_data_alloc(&msg, len); @@ -59,7 +59,7 @@ if(ret) return ret; - sock = krb5_storage_from_fd(context->sock); + sock = krb5_storage_from_socket(context->sock); if(sock == NULL) { krb5_clear_error_message(context->context); krb5_data_free(&out); @@ -81,7 +81,7 @@ krb5_data data; krb5_storage *sock; - sock = krb5_storage_from_fd(context->sock); + sock = krb5_storage_from_socket(context->sock); if(sock == NULL) { krb5_clear_error_message(context->context); return ENOMEM; diff --git a/crypto/heimdal/lib/kadm5/set_keys.c b/crypto/heimdal/lib/kadm5/set_keys.c --- a/crypto/heimdal/lib/kadm5/set_keys.c +++ b/crypto/heimdal/lib/kadm5/set_keys.c @@ -42,15 +42,19 @@ kadm5_ret_t _kadm5_set_keys(kadm5_server_context *context, hdb_entry *ent, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, const char *password) { Key *keys; size_t num_keys; kadm5_ret_t ret; - ret = hdb_generate_key_set_password(context->context, - ent->principal, - password, &keys, &num_keys); + ret = hdb_generate_key_set_password_with_ks_tuple(context->context, + ent->principal, + password, + ks_tuple, n_ks_tuple, + &keys, &num_keys); if (ret) return ret; @@ -72,6 +76,23 @@ return 0; } +static void +setup_Key(Key *k, Salt *s, krb5_key_data *kd, size_t kd_offset) +{ + memset(k, 0, sizeof (*k)); /* sets mkvno and salt */ + k->key.keytype = kd[kd_offset].key_data_type[0]; + k->key.keyvalue.length = kd[kd_offset].key_data_length[0]; + k->key.keyvalue.data = kd[kd_offset].key_data_contents[0]; + + if(kd[kd_offset].key_data_ver == 2) { + memset(s, 0, sizeof (*s)); + s->type = kd[kd_offset].key_data_type[1]; + s->salt.length = kd[kd_offset].key_data_length[1]; + s->salt.data = kd[kd_offset].key_data_contents[1]; + k->salt = s; + } +} + /* * Set the keys of `ent' to (`n_key_data', `key_data') */ @@ -83,51 +104,169 @@ krb5_key_data *key_data) { krb5_error_code ret; - int i; - unsigned len; - Key *keys; + size_t i, k; + HDB_extension ext; + HDB_extension *extp = NULL; + HDB_Ext_KeySet *hist_keys = &ext.data.u.hist_keys; + Key key; + Salt salt; + Keys keys; + hdb_keyset hkset; + krb5_kvno kvno = -1; + int one_key_set = 1; + int replace_hist_keys = 0; + + if (n_key_data == 0) { + /* Clear all keys! */ + ret = hdb_clear_extension(context->context, ent, + choice_HDB_extension_data_hist_keys); + if (ret) + return ret; + free_Keys(&ent->keys); + return 0; + } - len = n_key_data; - keys = malloc (len * sizeof(*keys)); - if (keys == NULL && len != 0) - return ENOMEM; + memset(&keys, 0, sizeof (keys)); + memset(&hkset, 0, sizeof (hkset)); /* set set_time */ + memset(&ext, 0, sizeof (ext)); + ext.mandatory = FALSE; + ext.data.element = choice_HDB_extension_data_hist_keys; + memset(hist_keys, 0, sizeof (*hist_keys)); + + for (i = 0; i < n_key_data; i++) { + if (kvno != -1 && kvno != key_data[i].key_data_kvno) { + one_key_set = 0; + break; + } + kvno = key_data[i].key_data_kvno; + } + if (one_key_set) { + /* + * If we're updating KADM5_KEY_DATA with a single keyset then we + * assume we must be setting the principal's kvno as well! + * + * Just have to be careful about old clients that might have + * sent 0 as the kvno... This may seem ugly, but it's the price + * of backwards compatibility with pre-multi-kvno kadmin clients + * (besides, who's to say that updating KADM5_KEY_DATA requires + * updating the entry's kvno?) + * + * Note that we do nothing special for the case where multiple + * keysets are given but the entry's kvno is not set and not in + * the given set of keysets. If this happens we'll just update + * the key history only and leave the current keyset alone. + */ + if (kvno == 0) { + /* Force kvno to 1 if it was 0; (ank would do this anyways) */ + if (ent->kvno == 0) + ent->kvno = 1; + /* Below we need key_data[*].kvno to be reasonable */ + for (i = 0; i < n_key_data; i++) + key_data[i].key_data_kvno = ent->kvno; + } else { + /* + * Or force the entry's kvno to match the one from the new, + * singular keyset + */ + ent->kvno = kvno; + } + } - _kadm5_init_keys (keys, len); + for (i = 0; i < n_key_data; i++) { + if (key_data[i].key_data_kvno == ent->kvno) { + /* A current key; add to current key set */ + setup_Key(&key, &salt, key_data, i); + ret = add_Keys(&keys, &key); + if (ret) + goto out; + continue; + } - for(i = 0; i < n_key_data; i++) { - keys[i].mkvno = NULL; - keys[i].key.keytype = key_data[i].key_data_type[0]; - ret = krb5_data_copy(&keys[i].key.keyvalue, - key_data[i].key_data_contents[0], - key_data[i].key_data_length[0]); - if(ret) + /* + * This kvno is historical. Build an hdb_keyset for keys of + * this enctype and add them to the new key history. + */ + for (k = 0; k < hist_keys->len; k++) { + if (hist_keys->val[k].kvno == key_data[i].key_data_kvno) + break; + } + if (hist_keys->len > k && + hist_keys->val[k].kvno == key_data[i].key_data_kvno) + /* We've added all keys of this kvno already (see below) */ + continue; + + memset(&hkset, 0, sizeof (hkset)); /* set set_time */ + hkset.kvno = key_data[i].key_data_kvno; + for (k = 0; k < n_key_data; k++) { + /* Find all keys of this kvno and add them to the new keyset */ + if (key_data[k].key_data_kvno != hkset.kvno) + continue; + + setup_Key(&key, &salt, key_data, k); + ret = add_Keys(&hkset.keys, &key); + if (ret) { + free_hdb_keyset(&hkset); + goto out; + } + } + ret = add_HDB_Ext_KeySet(hist_keys, &hkset); + free_hdb_keyset(&hkset); + if (ret) goto out; - if(key_data[i].key_data_ver == 2) { - Salt *salt; + replace_hist_keys = 1; + } - salt = calloc(1, sizeof(*salt)); - if(salt == NULL) { - ret = ENOMEM; - goto out; + if (replace_hist_keys) + /* No key history given -> leave it alone */ + extp = hdb_find_extension(ent, choice_HDB_extension_data_hist_keys); + if (extp != NULL) { + HDB_Ext_KeySet *old_hist_keys; + + /* + * Try to keep the very useful set_time values from the old hist + * keys. kadm5 loses this info, so this heuristic is the best we + * can do. + */ + old_hist_keys = &extp->data.u.hist_keys; + for (i = 0; i < old_hist_keys->len; i++) { + if (old_hist_keys->val[i].set_time == NULL) + continue; + for (k = 0; k < hist_keys->len; k++) { + if (hist_keys->val[k].kvno != old_hist_keys->val[k].kvno) + continue; + hist_keys->val[k].set_time = old_hist_keys->val[k].set_time; + old_hist_keys->val[k].set_time = NULL; } - keys[i].salt = salt; - salt->type = key_data[i].key_data_type[1]; - krb5_data_copy(&salt->salt, - key_data[i].key_data_contents[1], - key_data[i].key_data_length[1]); - } else - keys[i].salt = NULL; + } } - _kadm5_free_keys (context->context, ent->keys.len, ent->keys.val); - ent->keys.len = len; - ent->keys.val = keys; + if (replace_hist_keys) { + /* If hist keys not given in key_data then don't blow away hist_keys */ + ret = hdb_replace_extension(context->context, ent, &ext); + if (ret) + goto out; + } + + /* + * A structure copy is more efficient here than this would be: + * + * copy_Keys(&keys, &ent->keys); + * free_Keys(&keys); + * + * Of course, the above hdb_replace_extension() is not at all efficient... + */ + free_HDB_extension(&ext); + free_Keys(&ent->keys); + free_hdb_keyset(&hkset); + ent->keys = keys; hdb_entry_set_pw_change_time(context->context, ent, 0); hdb_entry_clear_password(context->context, ent); return 0; - out: - _kadm5_free_keys (context->context, len, keys); + +out: + free_Keys(&keys); + free_HDB_extension(&ext); return ret; } @@ -196,6 +335,8 @@ kadm5_ret_t _kadm5_set_keys_randomly (kadm5_server_context *context, hdb_entry *ent, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, krb5_keyblock **new_keys, int *n_keys) { @@ -206,7 +347,7 @@ Key *keys; ret = hdb_generate_key_set(context->context, ent->principal, - &keys, &num_keys, 1); + ks_tuple, n_ks_tuple, &keys, &num_keys, 1); if (ret) return ret; @@ -263,8 +404,12 @@ _kadm5_free_keys (context->context, ent->keys.len, ent->keys.val); ent->keys.val = keys; ent->keys.len = num_keys; - *new_keys = kblock; - *n_keys = num_keys; + if (n_keys && new_keys) { + *new_keys = kblock; + *n_keys = num_keys; + } else { + free(kblock); + } hdb_entry_set_pw_change_time(context->context, ent, 0); hdb_entry_clear_password(context->context, ent); diff --git a/crypto/heimdal/lib/kadm5/setkey3_s.c b/crypto/heimdal/lib/kadm5/setkey3_s.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/setkey3_s.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 1997-2001, 2003, 2005-2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "kadm5_locl.h" + +/** + * Server-side function to set new keys for a principal. + */ +kadm5_ret_t +kadm5_s_setkey_principal_3(void *server_handle, + krb5_principal princ, + krb5_boolean keepold, + int n_ks_tuple, + krb5_key_salt_tuple *ks_tuple, + krb5_keyblock *keyblocks, int n_keys) +{ + kadm5_server_context *context = server_handle; + hdb_entry_ex ent; + kadm5_ret_t ret = 0; + + memset(&ent, 0, sizeof(ent)); + if (!context->keep_open) + ret = context->db->hdb_open(context->context, context->db, O_RDWR, 0); + if (ret) + return ret; + + ret = kadm5_log_init(context); + if (ret) { + if (!context->keep_open) + context->db->hdb_close(context->context, context->db); + return ret; + } + + ret = context->db->hdb_fetch_kvno(context->context, context->db, princ, + HDB_F_GET_ANY|HDB_F_ADMIN_DATA, 0, &ent); + if (ret) { + (void) kadm5_log_end(context); + if (!context->keep_open) + context->db->hdb_close(context->context, context->db); + return ret; + } + + if (keepold) { + ret = hdb_add_current_keys_to_history(context->context, &ent.entry); + } else + ret = hdb_clear_extension(context->context, &ent.entry, + choice_HDB_extension_data_hist_keys); + + /* + * Though in practice all real calls to this function will pass an empty + * ks_tuple, and cannot in any case employ any salts that require + * additional data, we go the extra mile to set any requested salt type + * along with a zero length salt value. While we're at it we check that + * each ks_tuple's enctype matches the corresponding key enctype. + */ + if (ret == 0) { + int i; + + free_Keys(&ent.entry.keys); + for (i = 0; i < n_keys; ++i) { + Key k; + Salt s; + + k.mkvno = 0; + k.key = keyblocks[i]; + if (n_ks_tuple == 0) + k.salt = 0; + else { + if (ks_tuple[i].ks_enctype != keyblocks[i].keytype) { + ret = KADM5_SETKEY3_ETYPE_MISMATCH; + break; + } + s.type = ks_tuple[i].ks_salttype; + s.salt.data = 0; + s.opaque = 0; + k.salt = &s; + } + if ((ret = add_Keys(&ent.entry.keys, &k)) != 0) + break; + } + } + + if (ret == 0) { + ent.entry.kvno++; + ent.entry.flags.require_pwchange = 0; + hdb_entry_set_pw_change_time(context->context, &ent.entry, 0); + hdb_entry_clear_password(context->context, &ent.entry); + + if ((ret = hdb_seal_keys(context->context, context->db, + &ent.entry)) == 0 + && (ret = _kadm5_set_modifier(context, &ent.entry)) == 0 + && (ret = _kadm5_bump_pw_expire(context, &ent.entry)) == 0) + ret = kadm5_log_modify(context, &ent.entry, + KADM5_ATTRIBUTES | KADM5_PRINCIPAL | + KADM5_MOD_NAME | KADM5_MOD_TIME | + KADM5_KEY_DATA | KADM5_KVNO | + KADM5_PW_EXPIRATION | KADM5_TL_DATA); + } + + hdb_free_entry(context->context, &ent); + (void) kadm5_log_end(context); + if (!context->keep_open) + context->db->hdb_close(context->context, context->db); + return _kadm5_error_code(ret); +} diff --git a/crypto/heimdal/lib/kadm5/test_pw_quality.c b/crypto/heimdal/lib/kadm5/test_pw_quality.c --- a/crypto/heimdal/lib/kadm5/test_pw_quality.c +++ b/crypto/heimdal/lib/kadm5/test_pw_quality.c @@ -31,10 +31,14 @@ * SUCH DAMAGE. */ -#include "kadm5_locl.h" +#include +#include #include -RCSID("$Id$"); +#include +#include + +#include "admin.h" static int version_flag; static int help_flag; @@ -42,10 +46,10 @@ static char *password; static struct getargs args[] = { - { "principal", 0, arg_string, &principal }, - { "password", 0, arg_string, &password }, - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "principal", 0, arg_string, &principal, NULL, NULL }, + { "password", 0, arg_string, &password, NULL, NULL }, + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; int num_args = sizeof(args) / sizeof(args[0]); diff --git a/crypto/heimdal/lib/kadm5/version-script-client.map b/crypto/heimdal/lib/kadm5/version-script-client.map new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kadm5/version-script-client.map @@ -0,0 +1,59 @@ +HEIMDAL_KADM5_CLIENT_1.0 { + global: + et_kadm5_error_table; + initialize_kadm5_error_table; + initialize_kadm5_error_table_r; + kadm5_ad_init_with_password; + kadm5_ad_init_with_password_ctx; + kadm5_all_keys_are_bogus; + kadm5_c_chpass_principal; + kadm5_c_chpass_principal_with_key; + kadm5_c_create_principal; + kadm5_c_delete_principal; + kadm5_c_destroy; + kadm5_c_flush; + kadm5_c_get_principal; + kadm5_c_get_principals; + kadm5_c_get_privs; + kadm5_c_init_with_creds; + kadm5_c_init_with_creds_ctx; + kadm5_c_init_with_password; + kadm5_c_init_with_password_ctx; + kadm5_c_init_with_skey; + kadm5_c_init_with_skey_ctx; + kadm5_c_modify_principal; + kadm5_c_randkey_principal; + kadm5_c_rename_principal; + kadm5_chpass_principal; + kadm5_chpass_principal_with_key; + kadm5_create_principal; + kadm5_delete_principal; + kadm5_destroy; + kadm5_flush; + kadm5_free_key_data; + kadm5_free_name_list; + kadm5_free_principal_ent; + kadm5_get_principal; + kadm5_get_principals; + kadm5_get_privs; + kadm5_init_with_creds; + kadm5_init_with_creds_ctx; + kadm5_init_with_password; + kadm5_init_with_password_ctx; + kadm5_init_with_skey; + kadm5_init_with_skey_ctx; + kadm5_modify_principal; + kadm5_randkey_principal; + kadm5_rename_principal; + kadm5_ret_key_data; + kadm5_ret_principal_ent; + kadm5_ret_principal_ent_mask; + kadm5_ret_tl_data; + kadm5_some_keys_are_bogus; + kadm5_store_key_data; + kadm5_store_principal_ent; + kadm5_store_principal_ent_mask; + kadm5_store_tl_data; + local: + *; +}; diff --git a/crypto/heimdal/lib/kadm5/version-script.map b/crypto/heimdal/lib/kadm5/version-script.map --- a/crypto/heimdal/lib/kadm5/version-script.map +++ b/crypto/heimdal/lib/kadm5/version-script.map @@ -4,17 +4,27 @@ global: kadm5_ad_init_with_password; kadm5_ad_init_with_password_ctx; + kadm5_all_keys_are_bogus; kadm5_add_passwd_quality_verifier; kadm5_check_password_quality; kadm5_chpass_principal; + kadm5_chpass_principal_3; kadm5_chpass_principal_with_key; + kadm5_chpass_principal_with_key_3; + kadm5_create_policy; kadm5_create_principal; + kadm5_create_principal_3; kadm5_delete_principal; kadm5_destroy; + kadm5_decrypt_key; + kadm5_delete_policy; kadm5_flush; kadm5_free_key_data; kadm5_free_name_list; + kadm5_free_policy_ent; kadm5_free_principal_ent; + kadm5_get_policy; + kadm5_get_policies; kadm5_get_principal; kadm5_get_principals; kadm5_get_privs; @@ -24,18 +34,26 @@ kadm5_init_with_password_ctx; kadm5_init_with_skey; kadm5_init_with_skey_ctx; + kadm5_lock; kadm5_modify_principal; + kadm5_modify_policy; kadm5_randkey_principal; + kadm5_randkey_principal_3; kadm5_rename_principal; kadm5_ret_key_data; kadm5_ret_principal_ent; kadm5_ret_principal_ent_mask; kadm5_ret_tl_data; kadm5_setup_passwd_quality_check; + kadm5_setkey_principal; + kadm5_setkey_principal_3; + kadm5_some_keys_are_bogus; kadm5_store_key_data; kadm5_store_principal_ent; kadm5_store_principal_ent_mask; + kadm5_store_principal_ent_nokeys; kadm5_store_tl_data; + kadm5_unlock; kadm5_s_init_with_password_ctx; kadm5_s_init_with_password; kadm5_s_init_with_skey_ctx; @@ -44,16 +62,23 @@ kadm5_s_init_with_creds; kadm5_s_chpass_principal_cond; kadm5_log_set_version; + kadm5_log_signal_master; kadm5_log_signal_socket; kadm5_log_previous; + kadm5_log_goto_first; kadm5_log_goto_end; kadm5_log_foreach; kadm5_log_get_version_fd; kadm5_log_get_version; + kadm5_log_recover; kadm5_log_replay; kadm5_log_end; kadm5_log_reinit; kadm5_log_init; + kadm5_log_init_nb; + kadm5_log_init_nolock; + kadm5_log_init_sharedlock; + kadm5_log_next; kadm5_log_nop; kadm5_log_truncate; kadm5_log_modify; diff --git a/crypto/heimdal/lib/kafs/Makefile.am b/crypto/heimdal/lib/kafs/Makefile.am --- a/crypto/heimdal/lib/kafs/Makefile.am +++ b/crypto/heimdal/lib/kafs/Makefile.am @@ -5,8 +5,8 @@ AM_CPPFLAGS += $(AFS_EXTRA_DEFS) $(ROKEN_RENAME) if KRB5 -DEPLIB_krb5 = ../krb5/libkrb5.la -krb5_am_workaround = $(INCLUDE_hcrypto) -I$(top_srcdir)/lib/krb5 +DEPLIB_krb5 = ../krb5/libkrb5.la $(LIB_hcrypto) +krb5_am_workaround = -I$(top_srcdir)/lib/krb5 else DEPLIB_krb5 = krb5_am_workaround = @@ -61,6 +61,7 @@ dist_libkafs_la_SOURCES = \ afssys.c \ afskrb5.c \ + rxkad_kdf.c \ common.c \ $(AIX_SRC) \ kafs_locl.h \ diff --git a/crypto/heimdal/lib/kafs/Makefile.in b/crypto/heimdal/lib/kafs/Makefile.in --- a/crypto/heimdal/lib/kafs/Makefile.in +++ b/crypto/heimdal/lib/kafs/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,14 +96,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog subdir = lib/kafs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -60,8 +110,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -74,6 +123,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -93,6 +143,8 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -118,52 +170,115 @@ 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)$(man3dir)" \ "$(DESTDIR)$(foodir)" "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) -@KRB5_TRUE@am__DEPENDENCIES_1 = ../krb5/libkrb5.la -am__DEPENDENCIES_2 = -libkafs_la_DEPENDENCIES = $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) -am__dist_libkafs_la_SOURCES_DIST = afssys.c afskrb5.c common.c \ - afslib.c kafs_locl.h afssysdefs.h roken_rename.h +am__DEPENDENCIES_1 = +@KRB5_TRUE@am__DEPENDENCIES_2 = ../krb5/libkrb5.la \ +@KRB5_TRUE@ $(am__DEPENDENCIES_1) +libkafs_la_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) +am__dist_libkafs_la_SOURCES_DIST = afssys.c afskrb5.c rxkad_kdf.c \ + common.c afslib.c kafs_locl.h afssysdefs.h roken_rename.h @AIX_DYNAMIC_AFS_FALSE@@AIX_TRUE@am__objects_1 = afslib.lo -dist_libkafs_la_OBJECTS = afssys.lo afskrb5.lo common.lo \ +dist_libkafs_la_OBJECTS = afssys.lo afskrb5.lo rxkad_kdf.lo common.lo \ $(am__objects_1) @do_roken_rename_TRUE@am__objects_2 = resolve.lo strtok_r.lo \ @do_roken_rename_TRUE@ strlcpy.lo strsep.lo nodist_libkafs_la_OBJECTS = $(am__objects_2) libkafs_la_OBJECTS = $(dist_libkafs_la_OBJECTS) \ $(nodist_libkafs_la_OBJECTS) -libkafs_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libkafs_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libkafs_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/afskrb5.Plo ./$(DEPDIR)/afslib.Plo \ + ./$(DEPDIR)/afssys.Plo ./$(DEPDIR)/common.Plo \ + ./$(DEPDIR)/resolve.Plo ./$(DEPDIR)/rxkad_kdf.Plo \ + ./$(DEPDIR)/strlcpy.Plo ./$(DEPDIR)/strsep.Plo \ + ./$(DEPDIR)/strtok_r.Plo 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(EXTRA_libkafs_la_SOURCES) $(dist_libkafs_la_SOURCES) \ $(nodist_libkafs_la_SOURCES) DIST_SOURCES = $(EXTRA_libkafs_la_SOURCES) \ $(am__dist_libkafs_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 man3dir = $(mandir)/man3 MANS = $(man_MANS) DATA = $(foo_DATA) HEADERS = $(include_HEADERS) -ETAGS = etags -CTAGS = ctags +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -178,16 +293,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -197,17 +315,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -226,12 +346,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -240,6 +357,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -256,10 +374,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -267,6 +383,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -281,12 +398,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -303,10 +423,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -317,13 +443,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -347,6 +467,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -370,9 +492,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -382,7 +509,8 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) $(AFS_EXTRA_DEFS) $(ROKEN_RENAME) \ $(krb5_am_workaround) @@ -390,26 +518,33 @@ AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; @KRB5_FALSE@DEPLIB_krb5 = -@KRB5_TRUE@DEPLIB_krb5 = ../krb5/libkrb5.la +@KRB5_TRUE@DEPLIB_krb5 = ../krb5/libkrb5.la $(LIB_hcrypto) @KRB5_FALSE@krb5_am_workaround = -@KRB5_TRUE@krb5_am_workaround = $(INCLUDE_hcrypto) -I$(top_srcdir)/lib/krb5 +@KRB5_TRUE@krb5_am_workaround = -I$(top_srcdir)/lib/krb5 @AIX_FALSE@AFSL_EXP = @AIX_TRUE@AFSL_EXP = $(srcdir)/afsl.exp @AIX4_FALSE@@AIX_TRUE@AFS_EXTRA_LD = -e _nostart @@ -434,6 +569,7 @@ dist_libkafs_la_SOURCES = \ afssys.c \ afskrb5.c \ + rxkad_kdf.c \ common.c \ $(AIX_SRC) \ kafs_locl.h \ @@ -447,7 +583,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -460,15 +596,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/kafs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/kafs/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -478,9 +614,9 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -488,6 +624,8 @@ 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)"; \ } @@ -503,14 +641,17 @@ clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libkafs.la: $(libkafs_la_OBJECTS) $(libkafs_la_DEPENDENCIES) - $(libkafs_la_LINK) -rpath $(libdir) $(libkafs_la_OBJECTS) $(libkafs_la_LIBADD) $(LIBS) + @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}; \ + } + +libkafs.la: $(libkafs_la_OBJECTS) $(libkafs_la_DEPENDENCIES) $(EXTRA_libkafs_la_DEPENDENCIES) + $(AM_V_CCLD)$(libkafs_la_LINK) -rpath $(libdir) $(libkafs_la_OBJECTS) $(libkafs_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -518,35 +659,42 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afskrb5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afslib.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afssys.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcpy.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsep.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afskrb5.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afslib.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/afssys.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rxkad_kdf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcpy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strsep.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -555,11 +703,18 @@ -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" - @list=''; test -n "$(man3dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -588,13 +743,14 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) install-fooDATA: $(foo_DATA) @$(NORMAL_INSTALL) - test -z "$(foodir)" || $(MKDIR_P) "$(DESTDIR)$(foodir)" @list='$(foo_DATA)'; test -n "$(foodir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(foodir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(foodir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -608,13 +764,14 @@ @$(NORMAL_UNINSTALL) @list='$(foo_DATA)'; test -n "$(foodir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(foodir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(foodir)" && rm -f $$files + dir='$(DESTDIR)$(foodir)'; $(am__uninstall_files_from_dir) install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @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"; \ @@ -628,30 +785,17 @@ @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -663,15 +807,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -680,24 +820,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -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 +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -748,10 +892,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -770,7 +919,15 @@ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/afskrb5.Plo + -rm -f ./$(DEPDIR)/afslib.Plo + -rm -f ./$(DEPDIR)/afssys.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/resolve.Plo + -rm -f ./$(DEPDIR)/rxkad_kdf.Plo + -rm -f ./$(DEPDIR)/strlcpy.Plo + -rm -f ./$(DEPDIR)/strsep.Plo + -rm -f ./$(DEPDIR)/strtok_r.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -794,9 +951,8 @@ install-dvi-am: -install-exec-am: install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -818,7 +974,15 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/afskrb5.Plo + -rm -f ./$(DEPDIR)/afslib.Plo + -rm -f ./$(DEPDIR)/afssys.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/resolve.Plo + -rm -f ./$(DEPDIR)/rxkad_kdf.Plo + -rm -f ./$(DEPDIR)/strlcpy.Plo + -rm -f ./$(DEPDIR)/strsep.Plo + -rm -f ./$(DEPDIR)/strtok_r.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -841,42 +1005,56 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man3 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libLTLIBRARIES clean-libtool ctags \ - dist-hook 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-fooDATA \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libLTLIBRARIES \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-fooDATA \ install-html install-html-am install-includeHEADERS \ install-info install-info-am install-libLTLIBRARIES \ 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-compile mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-fooDATA uninstall-hook \ uninstall-includeHEADERS uninstall-libLTLIBRARIES \ uninstall-man uninstall-man3 +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -884,7 +1062,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -929,11 +1107,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -941,6 +1128,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -983,6 +1172,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -996,13 +1198,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/lib/kafs/NTMakefile b/crypto/heimdal/lib/kafs/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kafs/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\kafs + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/lib/kafs/afskrb5.c b/crypto/heimdal/lib/kafs/afskrb5.c --- a/crypto/heimdal/lib/kafs/afskrb5.c +++ b/crypto/heimdal/lib/kafs/afskrb5.c @@ -51,10 +51,6 @@ kt->ticket = NULL; - /* check if des key */ - if (cred->session.keyvalue.length != 8) - return EINVAL; - if (local524) { Ticket t; unsigned char *buf; @@ -96,8 +92,16 @@ * Build a struct ClearToken */ + ret = _kafs_derive_des_key(cred->session.keytype, + cred->session.keyvalue.data, + cred->session.keyvalue.length, + kt->ct.HandShakeKey); + if (ret) { + free(kt->ticket); + kt->ticket = NULL; + return ret; + } kt->ct.AuthHandle = kvno; - memcpy(kt->ct.HandShakeKey, cred->session.keyvalue.data, 8); kt->ct.ViceId = uid; kt->ct.BeginTimestamp = cred->times.starttime; kt->ct.EndTimestamp = cred->times.endtime; @@ -161,21 +165,15 @@ return ret; } - in_creds.session.keytype = ETYPE_DES_CBC_CRC; - /* check if des is disable, and in that case enable it for afs */ - invalid = krb5_enctype_valid(d->context, in_creds.session.keytype); + invalid = krb5_enctype_valid(d->context, ETYPE_DES_CBC_CRC); if (invalid) - krb5_enctype_enable(d->context, in_creds.session.keytype); + krb5_enctype_enable(d->context, ETYPE_DES_CBC_CRC); ret = krb5_get_credentials(d->context, 0, d->id, &in_creds, &out_creds); - if (ret) { - in_creds.session.keytype = ETYPE_DES_CBC_MD5; - ret = krb5_get_credentials(d->context, 0, d->id, &in_creds, &out_creds); - } if (invalid) - krb5_enctype_disable(d->context, in_creds.session.keytype); + krb5_enctype_disable(d->context, ETYPE_DES_CBC_CRC); krb5_free_principal(d->context, in_creds.server); krb5_free_principal(d->context, in_creds.client); diff --git a/crypto/heimdal/lib/kafs/afssys.c b/crypto/heimdal/lib/kafs/afssys.c --- a/crypto/heimdal/lib/kafs/afssys.c +++ b/crypto/heimdal/lib/kafs/afssys.c @@ -40,7 +40,12 @@ unsigned long param1; unsigned long syscall; }; +#ifdef __GNU__ +#define _IOT_procdata _IOT(_IOTS(long), 5, 0, 0, 0, 0) +#define VIOC_SYSCALL_PROC _IOW('C', 1, struct procdata) +#else #define VIOC_SYSCALL_PROC _IOW('C', 1, void *) +#endif struct devdata { unsigned long syscall; @@ -52,11 +57,40 @@ unsigned long param6; unsigned long retval; }; +#ifdef __GNU__ +#define _IOT_devdata _IOT(_IOTS(long), 8, 0, 0, 0, 0) +#endif #ifdef _IOWR #define VIOC_SYSCALL_DEV _IOWR('C', 2, struct devdata) #define VIOC_SYSCALL_DEV_OPENAFS _IOWR('C', 1, struct devdata) #endif +#ifdef _IOW +#ifdef _ILP32 +struct sundevdata { + uint32_t param6; + uint32_t param5; + uint32_t param4; + uint32_t param3; + uint32_t param2; + uint32_t param1; + uint32_t syscall; +}; +#define VIOC_SUN_SYSCALL_DEV _IOW('C', 2, struct sundevdata) +#else +struct sundevdata { + uint64_t param6; + uint64_t param5; + uint64_t param4; + uint64_t param3; + uint64_t param2; + uint64_t param1; + uint64_t syscall; +}; +#define VIOC_SUN_SYSCALL_DEV _IOW('C', 1, struct sundevdata) +#endif +#endif /* _IOW */ + int _kafs_debug; /* this should be done in a better way */ @@ -69,6 +103,7 @@ #define LINUX_PROC_POINT 5 #define AIX_ENTRY_POINTS 6 #define MACOS_DEV_POINT 7 +#define SUN_PROC_POINT 8 static int afs_entry_point = UNKNOWN_ENTRY_POINT; static int afs_syscalls[2]; @@ -184,6 +219,12 @@ ret = ioctl(fd, ioctlnum, &data); break; } + case SUN_PROC_POINT: { + struct sundevdata data = { 0, 0, 0, 0, 0, 0, AFSCALL_PIOCTL }; + data.param2 = (unsigned long)VIOCGETTOK; + ret = ioctl(fd, ioctlnum, &data); + break; + } default: abort(); } @@ -265,6 +306,14 @@ return data.retval; } + case SUN_PROC_POINT: { + struct sundevdata data = { 0, 0, 0, 0, 0, 0, AFSCALL_PIOCTL }; + data.param1 = (unsigned long)a_path; + data.param2 = (unsigned long)o_opcode; + data.param3 = (unsigned long)a_paramsP; + data.param4 = (unsigned long)a_followSymlinks; + return do_ioctl(&data); + } #ifdef _AIX case AIX_ENTRY_POINTS: return Pioctl(a_path, o_opcode, a_paramsP, a_followSymlinks); @@ -323,6 +372,10 @@ return ret; return data.retval; } + case SUN_PROC_POINT: { + struct sundevdata data = { 0, 0, 0, 0, 0, 0, AFSCALL_SETPAG }; + return do_ioctl(&data); + } #ifdef _AIX case AIX_ENTRY_POINTS: return Setpag(); @@ -470,6 +523,12 @@ if (ret == 0) goto done; #endif +#ifdef VIOC_SUN_SYSCALL_DEV + ret = try_ioctlpath("/dev/afs", VIOC_SUN_SYSCALL_DEV, SUN_PROC_POINT); + if (ret == 0) + goto done; +#endif + #if defined(AFS_SYSCALL) || defined(AFS_SYSCALL2) || defined(AFS_SYSCALL3) { diff --git a/crypto/heimdal/lib/kafs/afssysdefs.h b/crypto/heimdal/lib/kafs/afssysdefs.h --- a/crypto/heimdal/lib/kafs/afssysdefs.h +++ b/crypto/heimdal/lib/kafs/afssysdefs.h @@ -104,10 +104,6 @@ #define AFS_SYSCALL 210 #endif -#ifdef __APPLE__ /* MacOS X */ -#define AFS_SYSCALL 230 -#endif - #ifdef SYS_afs_syscall #define AFS_SYSCALL3 SYS_afs_syscall #endif diff --git a/crypto/heimdal/lib/kafs/common.c b/crypto/heimdal/lib/kafs/common.c --- a/crypto/heimdal/lib/kafs/common.c +++ b/crypto/heimdal/lib/kafs/common.c @@ -349,13 +349,19 @@ if (kafs_verbose) { const char *estr = (*data->get_error)(data, ret); char *str; - asprintf(&str, "%s tried afs%s%s@%s -> %s (%d)", - data->name, cell ? "/" : "", - cell ? cell : "", realm, estr ? estr : "unknown", ret); - (*kafs_verbose)(kafs_verbose_ctx, str); + int aret; + + aret = asprintf(&str, "%s tried afs%s%s@%s -> %s (%d)", + data->name, cell ? "/" : "", + cell ? cell : "", realm, estr ? estr : "unknown", ret); + if (aret != -1) { + (*kafs_verbose)(kafs_verbose_ctx, str); + free(str); + } else { + (*kafs_verbose)(kafs_verbose_ctx, "out of memory"); + } if (estr) (*data->free_error)(data, estr); - free(str); } return ret; diff --git a/crypto/heimdal/lib/kafs/kafs.h b/crypto/heimdal/lib/kafs/kafs.h --- a/crypto/heimdal/lib/kafs/kafs.h +++ b/crypto/heimdal/lib/kafs/kafs.h @@ -46,6 +46,9 @@ #define AFSCALL_SETPAG 21 #ifndef _VICEIOCTL +#ifdef __GNU__ +#define _IOT_ViceIoctl _IOT(_IOTS(caddr_t), 2, _IOTS(short), 2, 0, 0) +#endif #define _VICEIOCTL(id) ((unsigned int ) _IOW('V', id, struct ViceIoctl)) #define _AFSCIOCTL(id) ((unsigned int ) _IOW('C', id, struct ViceIoctl)) #endif /* _VICEIOCTL */ diff --git a/crypto/heimdal/lib/kafs/kafs.cat3 b/crypto/heimdal/lib/kafs/kafs.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kafs/kafs.cat3 @@ -0,0 +1,174 @@ +KAFS(3) BSD Library Functions Manual KAFS(3) + +NAME + k_hasafs, k_hasafs_recheck, k_pioctl, k_unlog, k_setpag, + k_afs_cell_of_file, kafs_set_verbose, kafs_settoken_rxkad, kafs_settoken, + krb_afslog, krb_afslog_uid, kafs_settoken5, krb5_afslog, krb5_afslog_uid + -- AFS library + +LIBRARY + AFS cache manager access library (libkafs, -lkafs) + +SYNOPSIS + #include  + + int + k_afs_cell_of_file(const char *path, char *cell, int len); + + int + k_hasafs(void); + + int + k_hasafs_recheck(void); + + int + k_pioctl(char *a_path, int o_opcode, struct ViceIoctl *a_paramsP, + int a_followSymlinks); + + int + k_setpag(void); + + int + k_unlog(void); + + void + kafs_set_verbose(void (*func)(void *, const char *, int), void *); + + int + kafs_settoken_rxkad(const char *cell, struct ClearToken *token, + void *ticket, size_t ticket_len); + + int + kafs_settoken(const char *cell, uid_t uid, CREDENTIALS *c); + + krb_afslog(char *cell, char *realm); + + int + krb_afslog_uid(char *cell, char *realm, uid_t uid); + + krb5_error_code + krb5_afslog_uid(krb5_context context, krb5_ccache id, const char *cell, + krb5_const_realm realm, uid_t uid); + + int + kafs_settoken5(const char *cell, uid_t uid, krb5_creds *c); + + krb5_error_code + krb5_afslog(krb5_context context, krb5_ccache id, const char *cell, + krb5_const_realm realm); + +DESCRIPTION + k_hasafs() initializes some library internal structures, and tests for + the presence of AFS in the kernel, none of the other functions should be + called before k_hasafs() is called, or if it fails. + + k_hasafs_recheck() forces a recheck if a AFS client has started since + last time k_hasafs() or k_hasafs_recheck() was called. + + kafs_set_verbose() set a log function that will be called each time the + kafs library does something important so that the application using + libkafs can output verbose logging. Calling the function + kafs_set_verbose with the function argument set to NULL will stop libkafs + from calling the logging function (if set). + + kafs_settoken_rxkad() set rxkad with the token and ticket (that have the + length ticket_len) for a given cell. + + kafs_settoken() and kafs_settoken5() work the same way as + kafs_settoken_rxkad() but internally converts the Kerberos 4 or 5 creden- + tial to a afs cleartoken and ticket. + + krb_afslog(), and krb_afslog_uid() obtains new tokens (and possibly tick- + ets) for the specified cell and realm. If cell is NULL, the local cell + is used. If realm is NULL, the function tries to guess what realm to use. + Unless you have some good knowledge of what cell or realm to use, you + should pass NULL. krb_afslog() will use the real user-id for the ViceId + field in the token, krb_afslog_uid() will use uid. + + krb5_afslog(), and krb5_afslog_uid() are the Kerberos 5 equivalents of + krb_afslog(), and krb_afslog_uid(). + + krb5_afslog(), kafs_settoken5() can be configured to behave differently + via a krb5_appdefault option afs-use-524 in krb5.conf. Possible values + for afs-use-524 are: + + yes use the 524 server in the realm to convert the ticket + + no use the Kerberos 5 ticket directly, can be used with if the afs + cell support 2b token. + + local, 2b + convert the Kerberos 5 credential to a 2b token locally (the same + work as a 2b 524 server should have done). + + Example: + + [appdefaults] + SU.SE = { afs-use-524 = local } + PDC.KTH.SE = { afs-use-524 = yes } + afs-use-524 = yes + + libkafs will use the libkafs as application name when running the + krb5_appdefault function call. + + The (uppercased) cell name is used as the realm to the krb5_appdefault + function. + + k_afs_cell_of_file() will in cell return the cell of a specified file, no + more than len characters is put in cell. + + k_pioctl() does a pioctl() system call with the specified arguments. This + function is equivalent to lpioctl(). + + k_setpag() initializes a new PAG. + + k_unlog() removes destroys all tokens in the current PAG. + +RETURN VALUES + k_hasafs() returns 1 if AFS is present in the kernel, 0 otherwise. + krb_afslog() and krb_afslog_uid() returns 0 on success, or a Kerberos er- + ror number on failure. k_afs_cell_of_file(), k_pioctl(), k_setpag(), and + k_unlog() all return the value of the underlaying system call, 0 on suc- + cess. + +ENVIRONMENT + The following environment variable affect the mode of operation of kafs: + + AFS_SYSCALL Normally, kafs will try to figure out the correct system + call(s) that are used by AFS by itself. If it does not man- + age to do that, or does it incorrectly, you can set this + variable to the system call number or list of system call + numbers that should be used. + +EXAMPLES + The following code from login will obtain a new PAG and tokens for the + local cell and the cell of the users home directory. + + if (k_hasafs()) { + char cell[64]; + k_setpag(); + if(k_afs_cell_of_file(pwd->pw_dir, cell, sizeof(cell)) == 0) + krb_afslog(cell, NULL); + krb_afslog(NULL, NULL); + } + +ERRORS + If any of these functions (apart from k_hasafs()) is called without AFS + being present in the kernel, the process will usually (depending on the + operating system) receive a SIGSYS signal. + +SEE ALSO + krb5_appdefault(3), krb5.conf(5) + + Transarc Corporation, "File Server/Cache Manager Interface", AFS-3 + Programmer's Reference, 1991. + +FILES + libkafs will search for ThisCell and TheseCells in the following loca- + tions: /usr/vice/etc, /etc/openafs, /var/db/openafs/etc, /usr/arla/etc, + /etc/arla, and /etc/afs + +BUGS + AFS_SYSCALL has no effect under AIX. + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/kafs/kafs_locl.h b/crypto/heimdal/lib/kafs/kafs_locl.h --- a/crypto/heimdal/lib/kafs/kafs_locl.h +++ b/crypto/heimdal/lib/kafs/kafs_locl.h @@ -99,7 +99,9 @@ #include typedef struct credentials CREDENTIALS; #endif /* KRB5 */ +#ifndef NO_AFS #include +#endif #include @@ -150,6 +152,9 @@ void _kafs_fixup_viceid(struct ClearToken *, uid_t); +int +_kafs_derive_des_key(krb5_enctype, void *, size_t, char[8]); + #ifdef _AIX int aix_pioctl(char*, int, struct ViceIoctl*, int); int aix_setpag(void); diff --git a/crypto/heimdal/lib/kafs/rxkad_kdf.c b/crypto/heimdal/lib/kafs/rxkad_kdf.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kafs/rxkad_kdf.c @@ -0,0 +1,217 @@ +/* + * Copyright (c) 1995-2003 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2013-2014 Carnegie Mellon University + * All rights reserved. + * + * Portions Copyright (c) 2013 by the Massachusetts Institute of Technology + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define HC_DEPRECATED_CRYPTO +#include "kafs_locl.h" + +static int rxkad_derive_des_key(const void *, size_t, char[8]); +static int compress_parity_bits(void *, size_t *); + +/** + * Use NIST SP800-108 with HMAC(MD5) in counter mode as the PRF to derive a + * des key from another type of key. + * + * L is 64, as we take 64 random bits and turn them into a 56-bit des key. + * The output of hmac_md5 is 128 bits; we take the first 64 only, so n + * properly should be 1. However, we apply a slight variation due to the + * possibility of producing a weak des key. If the output key is weak, do NOT + * simply correct it, instead, the counter is advanced and the next output + * used. As such, we code so as to have n be the full 255 permitted by our + * encoding of the counter i in an 8-bit field. L itself is encoded as a + * 32-bit field, big-endian. We use the constant string "rxkad" as a label + * for this key derivation, the standard NUL byte separator, and omit a + * key-derivation context. The input key is unique to the krb5 service ticket, + * which is unlikely to be used in an other location. If it is used in such + * a fashion, both locations will derive the same des key from the PRF, but + * this is no different from if a krb5 des key had been used in the same way, + * as traditional krb5 rxkad uses the ticket session key directly as the token + * key. + * + * @param[in] in pointer to input key data + * @param[in] insize length of input key data + * @param[out] out 8-byte buffer to hold the derived key + * + * @return Returns 0 to indicate success, or an error code. + * + * @retval KRB5DES_WEAK_KEY Successive derivation attempts with all + * 255 possible counter values each produced weak DES keys. This input + * cannot be used to produce a usable key. + */ +static int +rxkad_derive_des_key(const void *in, size_t insize, char out[8]) +{ + unsigned char i; + static unsigned char label[] = "rxkad"; + /* bits of output, as 32 bit word, MSB first */ + static unsigned char Lbuf[4] = { 0, 0, 0, 64 }; + /* only needs to be 16 for md5, but lets be sure it fits */ + unsigned char tmp[64]; + unsigned int mdsize; + DES_cblock ktmp; + HMAC_CTX mctx; + + /* stop when 8 bit counter wraps to 0 */ + for (i = 1; i; i++) { + HMAC_CTX_init(&mctx); + HMAC_Init_ex(&mctx, in, insize, EVP_md5(), NULL); + HMAC_Update(&mctx, &i, 1); + HMAC_Update(&mctx, label, sizeof(label)); /* includes label and separator */ + HMAC_Update(&mctx, Lbuf, 4); + mdsize = sizeof(tmp); + HMAC_Final(&mctx, tmp, &mdsize); + memcpy(ktmp, tmp, 8); + DES_set_odd_parity(&ktmp); + if (!DES_is_weak_key(&ktmp)) { + memcpy(out, ktmp, 8); + return 0; + } + } + return KRB5DES_WEAK_KEY; +} + +/** + * This is the inverse of the random-to-key for 3des specified in + * rfc3961, converting blocks of 8 bytes to blocks of 7 bytes by distributing + * the bits of each 8th byte as the lsb of the previous 7 bytes. + * + * @param[in,out] buffer Buffer containing the key to be converted + * @param[in,out] bufsiz Points to the size of the key data. On + * return, this is updated to reflect the size of the compressed data. + * + * @return Returns 0 to indicate success, or an error code. + * + * @retval KRB5_BAD_KEYSIZE The key size was not a multiple of 8 bytes. + */ +static int +compress_parity_bits(void *buffer, size_t *bufsiz) +{ + unsigned char *cb, tmp; + int i, j, nk; + + if (*bufsiz % 8 != 0) + return KRB5_BAD_KEYSIZE; + cb = (unsigned char *)buffer; + nk = *bufsiz / 8; + for (i = 0; i < nk; i++) { + tmp = cb[8 * i + 7] >> 1; + for (j = 0; j < 7; j++) { + cb[8 * i + j] &= 0xfe; + cb[8 * i + j] |= tmp & 0x1; + tmp >>= 1; + } + } + for (i = 1; i < nk; i++) + memmove(cb + 7 * i, cb + 8 * i, 7); + *bufsiz = 7 * nk; + return 0; +} + +/** + * Derive a DES key for use with rxkad and fcrypt from a given Kerberos + * key of (almost) any type. This function encodes enctype-specific + * knowledge about how to derive a DES key from a given key type. + * If given a des key, use it directly; otherwise, perform any parity + * fixup that may be needed and pass through to the hmad-md5 bits. + * + * @param[in] enctype Kerberos enctype of the input key + * @param[in] keydata Input key data + * @param[in] keylen Size of input key data + * @param[out] output 8-byte buffer to hold the derived key + * + * @return Returns 0 to indicate success, or an error code. + * + * @retval KRB5_PROG_ETYPE_NOSUPP The enctype is one for which rxkad-kdf + * is not supported. This includes several reserved enctypes, enctype + * values used in PKINIT to stand for CMS algorithm identifiers, and all + * private-use (negative) enctypes. + * + * @retval KRB5_BAD_KEYSIZE The key size was not a multiple of 8 bytes + * (for 3DES key types), exactly 8 bytes (for DES key types), or at least + * 8 bytes (for other key types). + * + * @retval KRB5DES_WEAK_KEY Successive derivation attempts with all + * 255 possible counter values each produced weak DES keys. This input + * cannot be used to produce a usable key. + */ +int +_kafs_derive_des_key(krb5_enctype enctype, void *keydata, size_t keylen, + char output[8]) +{ + int ret = 0; + + switch ((int)enctype) { + case ETYPE_DES_CBC_CRC: + case ETYPE_DES_CBC_MD4: + case ETYPE_DES_CBC_MD5: + if (keylen != 8) + return KRB5_BAD_KEYSIZE; + + /* Extract session key */ + memcpy(output, keydata, 8); + break; + case ETYPE_NULL: + case 4: + case 6: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + return KRB5_PROG_ETYPE_NOSUPP; + /*In order to become a "Cryptographic Key" as specified in + * SP800-108, it must be indistinguishable from a random bitstring. */ + case ETYPE_DES3_CBC_MD5: + case ETYPE_OLD_DES3_CBC_SHA1: + case ETYPE_DES3_CBC_SHA1: + ret = compress_parity_bits(keydata, &keylen); + if (ret) + return ret; + /* FALLTHROUGH */ + default: + if (enctype < 0) + return KRB5_PROG_ETYPE_NOSUPP; + if (keylen < 7) + return KRB5_BAD_KEYSIZE; + ret = rxkad_derive_des_key(keydata, keylen, output); + } + return ret; +} diff --git a/crypto/heimdal/lib/kdfs/ChangeLog b/crypto/heimdal/lib/kdfs/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kdfs/ChangeLog @@ -0,0 +1,28 @@ +2002-08-12 Johan Danielsson + + * k5dfspag.c: don't use ## in string concatenation + +2002-03-11 Assar Westerlund + + * Makefile.am (libkdfs_la_LDFLAGS): set versoin to 0:2:0 + +2002-01-23 Assar Westerlund + + * k5dfspag.c: use SIG_DFL and not SIG_IGN for SIGCHLD. + from "Todd C. Miller" + +2001-02-07 Assar Westerlund + + * k5dfspag.c: add config.h + +2000-12-11 Assar Westerlund + + * Makefile.am (libkdfs_la_LDFLAGS): set version to 0:1:0 + +2000-07-02 Assar Westerlund + + * k5dfspag.c: use krb5.h instead of krb5_locl.h + + * initial import from Ake Sandgren + + diff --git a/crypto/heimdal/lib/kdfs/Makefile.am b/crypto/heimdal/lib/kdfs/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kdfs/Makefile.am @@ -0,0 +1,12 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +lib_LTLIBRARIES = libkdfs.la + +libkdfs_la_SOURCES = \ + k5dfspag.c + +libkdfs_la_LDFLAGS = -version-info 0:3:0 + +EXTRA_DIST = NTMakefile diff --git a/crypto/heimdal/lib/kdfs/Makefile.in b/crypto/heimdal/lib/kdfs/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kdfs/Makefile.in @@ -0,0 +1,1066 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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 = lib/kdfs +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +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)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libkdfs_la_LIBADD = +am_libkdfs_la_OBJECTS = k5dfspag.lo +libkdfs_la_OBJECTS = $(am_libkdfs_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libkdfs_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libkdfs_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/k5dfspag.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libkdfs_la_SOURCES) +DIST_SOURCES = $(libkdfs_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +lib_LTLIBRARIES = libkdfs.la +libkdfs_la_SOURCES = \ + k5dfspag.c + +libkdfs_la_LDFLAGS = -version-info 0:3:0 +EXTRA_DIST = NTMakefile +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 lib/kdfs/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign lib/kdfs/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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-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}; \ + } + +libkdfs.la: $(libkdfs_la_OBJECTS) $(libkdfs_la_DEPENDENCIES) $(EXTRA_libkdfs_la_DEPENDENCIES) + $(AM_V_CCLD)$(libkdfs_la_LINK) -rpath $(libdir) $(libkdfs_la_OBJECTS) $(libkdfs_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/k5dfspag.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) all-local +installdirs: + for dir in "$(DESTDIR)$(libdir)"; 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 -f ./$(DEPDIR)/k5dfspag.Plo + -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local 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 -f ./$(DEPDIR)/k5dfspag.Plo + -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-libLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libLTLIBRARIES \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ + install-html-am 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 tags-am uninstall uninstall-am uninstall-hook \ + uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +# 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: diff --git a/crypto/heimdal/lib/kdfs/NTMakefile b/crypto/heimdal/lib/kdfs/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kdfs/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\kdfs + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/lib/kdfs/k5dfspag.c b/crypto/heimdal/lib/kdfs/k5dfspag.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/kdfs/k5dfspag.c @@ -0,0 +1,368 @@ +/* + * lib/krb5/os/k5dfspag.c + * + * New Kerberos module to issue the DFS PAG syscalls. + * It also contains the routine to fork and exec the + * k5dcecon routine to do most of the work. + * + * This file is designed to be as independent of DCE + * and DFS as possible. The only dependencies are on + * the syscall numbers. If DFS not running or not installed, + * the sig handlers will catch and the signal and + * will continue. + * + * krb5_dfs_newpag and krb5_dfs_getpag should not be real + * Kerberos routines, since they should be setpag and getpag + * in the DCE library, but without the DCE baggage. + * Thus they don't have context, and don't return a krb5 error. + * + * + * + * krb5_dfs_pag() + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +RCSID("$Id$"); + +#include + +#ifdef DCE + +#include +#include +#include +#include +#include + +/* Only run this DFS PAG code on systems with POSIX + * All that we are interested in dor:, AIX 4.x, + * Solaris 2.5.x, HPUX 10.x Even SunOS 4.1.4, AIX 3.2.5 + * and SGI 5.3 are OK. This simplifies + * the build/configure which I don't want to change now. + * All of them also have waitpid as well. + */ + +#define POSIX_SETJMP +#define POSIX_SIGNALS +#define HAVE_WAITPID + +#include +#include +#ifndef POSIX_SETJMP +#undef sigjmp_buf +#undef sigsetjmp +#undef siglongjmp +#define sigjmp_buf jmp_buf +#define sigsetjmp(j,s) setjmp(j) +#define siglongjmp longjmp +#endif + +#ifdef POSIX_SIGNALS +typedef struct sigaction handler; +#define handler_init(H,F) (sigemptyset(&(H).sa_mask), \ + (H).sa_flags=0, \ + (H).sa_handler=(F)) +#define handler_swap(S,NEW,OLD) sigaction(S, &NEW, &OLD) +#define handler_set(S,OLD) sigaction(S, &OLD, NULL) +#else +typedef sigtype (*handler)(); +#define handler_init(H,F) ((H) = (F)) +#define handler_swap(S,NEW,OLD) ((OLD) = signal ((S), (NEW))) +#define handler_set(S,OLD) (signal ((S), (OLD))) +#endif + +#define krb5_sigtype void +#define WAIT_USES_INT +typedef krb5_sigtype sigtype; + + +/* + * Need some syscall numbers based on different systems. + * These are based on: + * HPUX 10.10 /opt/dce/include/dcedfs/syscall.h + * Solaris 2.5 /opt/dcelocal/share/include/dcedfs/syscall.h + * AIX 4.2 - needs some funny games with load and kafs_syscall + * to get the kernel extentions. There should be a better way! + * + * DEE 5/27/97 + * + */ + + +#define AFSCALL_SETPAG 2 +#define AFSCALL_GETPAG 11 + +#if defined(sun) +#define AFS_SYSCALL 72 + +#elif defined(hpux) +/* assume HPUX 10 + or is it 50 */ +#define AFS_SYSCALL 326 + +#elif defined(_AIX) +#ifndef DPAGAIX +#define DPAGAIX LIBEXECDIR "/dpagaix" +#endif +int *load(); +static int (*dpagaix)(int, int, int, int, int, int) = 0; + +#elif defined(sgi) || defined(_sgi) +#define AFS_SYSCALL 206+1000 + +#else +#define AFS_SYSCALL (Unknown_DFS_AFS_SYSCALL) +#endif + + +#ifdef WAIT_USES_INT + int wait_status; +#else /* WAIT_USES_INT */ + union wait wait_status; +#endif /* WAIT_USES_INT */ + +#ifndef K5DCECON +#define K5DCECON LIBEXECDIR "/k5dcecon" +#endif + +/* + * mysig() + * + * signal handler if DFS not running + * + */ + +static sigjmp_buf setpag_buf; + +static sigtype mysig() +{ + siglongjmp(setpag_buf, 1); +} + +/* + * krb5_dfs_pag_syscall() + * + * wrapper for the syscall with signal handlers + * + */ + +static int krb5_dfs_pag_syscall(opt1,opt2) + int opt1; + int opt2; +{ + handler sa1, osa1; + handler sa2, osa2; + int pag = -2; + + handler_init (sa1, mysig); + handler_init (sa2, mysig); + handler_swap (SIGSYS, sa1, osa1); + handler_swap (SIGSEGV, sa2, osa2); + + if (sigsetjmp(setpag_buf, 1) == 0) { + +#if defined(_AIX) + if (!dpagaix) + dpagaix = load(DPAGAIX, 0, 0); + if (dpagaix) + pag = (*dpagaix)(opt1, opt2, 0, 0, 0, 0); +#else + pag = syscall(AFS_SYSCALL, opt1, opt2, 0, 0, 0, 0); +#endif + + handler_set (SIGSYS, osa1); + handler_set (SIGSEGV, osa2); + return(pag); + } + + /* syscall failed! return 0 */ + handler_set (SIGSYS, osa1); + handler_set (SIGSEGV, osa2); + return(-2); +} + +/* + * krb5_dfs_newpag() + * + * issue a DCE/DFS setpag system call to set the newpag + * for this process. This takes advantage of a currently + * undocumented feature of the Transarc port of DFS. + * Even in DCE 1.2.2 for which the source is available, + * (but no vendors have released), this feature is not + * there, but it should be, or could be added. + * If new_pag is zero, then the syscall will get a new pag + * and return its value. + */ + +int krb5_dfs_newpag(new_pag) + int new_pag; +{ + return(krb5_dfs_pag_syscall(AFSCALL_SETPAG, new_pag)); +} + +/* + * krb5_dfs_getpag() + * + * get the current PAG. Used mostly as a test. + */ + +int krb5_dfs_getpag() +{ + return(krb5_dfs_pag_syscall(AFSCALL_GETPAG, 0)); +} + +/* + * krb5_dfs_pag() + * + * Given a principal and local username, + * fork and exec the k5dcecon module to create + * refresh or join a new DCE/DFS + * Process Authentication Group (PAG) + * + * This routine should be called after krb5_kuserok has + * determined that this combination of local user and + * principal are acceptable for the local host. + * + * It should also be called after a forwarded ticket has + * been received, and the KRB5CCNAME environment variable + * has been set to point at it. k5dcecon will convert this + * to a new DCE context and a new pag and replace KRB5CCNAME + * in the environment. + * + * If there is no forwarded ticket, k5dcecon will attempt + * to join an existing PAG for the same principal and local + * user. + * + * And it should be called before access to the home directory + * as this may be in DFS, not accessible by root, and require + * the PAG to have been setup. + * + * The krb5_afs_pag can be called after this routine to + * use the the cache obtained by k5dcecon to get an AFS token. + * DEE - 7/97 + */ + +int krb5_dfs_pag(context, flag, principal, luser) + krb5_context context; + int flag; /* 1 if a forwarded TGT is to be used */ + krb5_principal principal; + const char *luser; + +{ + + struct stat stx; + int fd[2]; + int i,j; + int pid; + int new_pag; + int pag; + char newccname[MAXPATHLEN] = ""; + char *princ; + int err; + struct sigaction newsig, oldsig; + +#ifdef WAIT_USES_INT + int wait_status; +#else /* WAIT_USES_INT */ + union wait wait_status; +#endif /* WAIT_USES_INT */ + + if (krb5_unparse_name(context, principal, &princ)) + return(0); + + /* test if DFS is running or installed */ + if (krb5_dfs_getpag() == -2) + return(0); /* DFS not running, don't try */ + + if (pipe(fd) == -1) + return(0); + + /* Make sure that telnetd.c's SIGCHLD action don't happen right now... */ + memset((char *)&newsig, 0, sizeof(newsig)); + newsig.sa_handler = SIG_DFL; + sigaction(SIGCHLD, &newsig, &oldsig); + + pid = fork(); + if (pid <0) + return(0); + + if (pid == 0) { /* child process */ + + close(1); /* close stdout */ + dup(fd[1]); /* point stdout at pipe here */ + close(fd[0]); /* don't use end of pipe here */ + close(fd[1]); /* pipe now as stdout */ + + execl(K5DCECON, "k5dcecon", + (flag) ? "-f" : "-s" , + "-l", luser, + "-p", princ, (char *)0); + + exit(127); /* incase execl fails */ + } + + /* parent, wait for child to finish */ + + close(fd[1]); /* don't need this end of pipe */ + +/* #if defined(sgi) || defined(_sgi) */ + /* wait_status.w_status = 0; */ + /* waitpid((pid_t) pid, &wait_status.w_status, 0); */ +/* #else */ + + + wait_status = 0; +#ifdef HAVE_WAITPID + err = waitpid((pid_t) pid, &wait_status, 0); +#else /* HAVE_WAITPID */ + err = wait4(pid, &wait_status, 0, (struct rusage *) NULL); +#endif /* HAVE_WAITPID */ +/* #endif */ + + sigaction(SIGCHLD, &oldsig, 0); + if (WIFEXITED(wait_status)){ + if (WEXITSTATUS(wait_status) == 0) { + i = 1; + j = 0; + while (i != 0) { + i = read(fd[0], &newccname[j], sizeof(newccname)-1-j); + if ( i > 0) + j += i; + if (j >= sizeof(newccname)-1) + i = 0; + } + close(fd[0]); + if (j > 0) { + newccname[j] = '\0'; + esetenv("KRB5CCNAME",newccname,1); + sscanf(&newccname[j-8],"%8x",&new_pag); + if (new_pag && strncmp("FILE:/opt/dcelocal/var/security/creds/dcecred_", newccname, 46) == 0) { + if((pag = krb5_dfs_newpag(new_pag)) != -2) { + return(pag); + } + } + } + } + } + return(0); /* something not right */ +} + +#else /* DCE */ + +/* + * krb5_dfs_pag - dummy version for the lib for systems + * which don't have DFS, or the needed setpag kernel code. + */ + +krb5_boolean +krb5_dfs_pag(context, principal, luser) + krb5_context context; + krb5_principal principal; + const char *luser; +{ + return(0); +} + +#endif /* DCE */ diff --git a/crypto/heimdal/lib/krb5/Makefile.am b/crypto/heimdal/lib/krb5/Makefile.am --- a/crypto/heimdal/lib/krb5/Makefile.am +++ b/crypto/heimdal/lib/krb5/Makefile.am @@ -2,20 +2,21 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_krb4) $(INCLUDE_hcrypto) -I../com_err -I$(srcdir)/../com_err $(INCLUDE_sqlite3) $(INCLUDE_libintl) +AM_CPPFLAGS += -I../com_err -I$(srcdir)/../com_err $(INCLUDE_sqlite3) $(INCLUDE_libintl) $(INCLUDE_openssl_crypto) bin_PROGRAMS = verify_krb5_conf noinst_PROGRAMS = \ krbhst-test \ - test_gic \ test_alname \ test_crypto \ - test_rfc3961 \ + test_forward \ test_get_addrs \ + test_gic \ test_kuserok \ test_renew \ - test_forward + test_rfc3961 + noinst_LTLIBRARIES = \ librfc3961.la @@ -25,6 +26,7 @@ derived-key-test \ n-fold-test \ parse-name-test \ + pseudo-random-test \ store-test \ string-to-key-test \ test_acl \ @@ -43,17 +45,18 @@ test_pkinit_dh2key \ test_pknistkdf \ test_time \ + test_expand_toks \ test_x500 check_DATA = test_config_strings.out -check_PROGRAMS = $(TESTS) test_hostname test_ap-req +check_PROGRAMS = $(TESTS) test_hostname test_ap-req test_canon test_set_kvno0 LDADD = libkrb5.la \ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/wind/libwind.la \ - $(LIB_roken) + $(LIB_heimbase) $(LIB_roken) if PKINIT LIB_pkinit = ../hx509/libhx509.la @@ -67,8 +70,9 @@ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/ipc/libheim-ipcc.la \ $(top_builddir)/lib/wind/libwind.la \ - $(top_builddir)/base/libheimbase.la \ + $(top_builddir)/lib/base/libheimbase.la \ $(LIB_pkinit) \ + $(LIB_openssl_crypto) \ $(use_sqlite) \ $(LIB_com_err) \ $(LIB_hcrypto) \ @@ -111,6 +115,7 @@ acl.c \ add_et_list.c \ addr_families.c \ + an2ln_plugin.h \ aname_to_localname.c \ appdefault.c \ asn1_glue.c \ @@ -129,7 +134,8 @@ creds.c \ crypto.c \ crypto.h \ - crypto-aes.c \ + crypto-aes-sha1.c \ + crypto-aes-sha2.c \ crypto-algs.c \ crypto-arcfour.c \ crypto-des.c \ @@ -141,12 +147,17 @@ crypto-rand.c \ doxygen.c \ data.c \ + db_plugin.c \ + db_plugin.h \ + dcache.c \ deprecated.c \ digest.c \ eai_to_heim_errno.c \ + enomem.c \ error_string.c \ expand_hostname.c \ expand_path.c \ + fast.c \ fcache.c \ free.c \ free_host_realm.c \ @@ -174,6 +185,7 @@ krb5-v4compat.h \ krbhst.c \ kuserok.c \ + kuserok_plugin.h \ log.c \ mcache.c \ misc.c \ @@ -191,6 +203,7 @@ padata.c \ pcache.c \ pkinit.c \ + pkinit-ec.c \ principal.c \ prog_setup.c \ prompter_posix.c \ @@ -204,10 +217,12 @@ recvauth.c \ replay.c \ salt.c \ - salt-aes.c \ + salt-aes-sha1.c \ + salt-aes-sha2.c \ salt-arcfour.c \ salt-des.c \ salt-des3.c \ + sp800-108-kdf.c \ scache.c \ send_to_kdc.c \ sendauth.c \ @@ -219,6 +234,7 @@ store_emem.c \ store_fd.c \ store_mem.c \ + store_sock.c \ plugin.c \ ticket.c \ time.c \ @@ -241,13 +257,29 @@ libkrb5_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map endif -$(libkrb5_la_OBJECTS) $(verify_krb5_conf_OBJECTS) $(librfc3961_la_OBJECTS): $(srcdir)/krb5-protos.h $(srcdir)/krb5-private.h krb5_err.h heim_err.h k524_err.h krb5_err.h krb_err.h k524_err.h +ALL_OBJECTS = $(libkrb5_la_OBJECTS) +ALL_OBJECTS += $(verify_krb5_conf_OBJECTS) +ALL_OBJECTS += $(librfc3961_la_OBJECTS) +ALL_OBJECTS += $(librfc3961_la_OBJECTS) +ALL_OBJECTS += $(krbhst_test_OBJECTS) +ALL_OBJECTS += $(test_alname_OBJECTS) +ALL_OBJECTS += $(test_crypto_OBJECTS) +ALL_OBJECTS += $(test_forward_OBJECTS) +ALL_OBJECTS += $(test_get_addrs_OBJECTS) +ALL_OBJECTS += $(test_gic_OBJECTS) +ALL_OBJECTS += $(test_kuserok_OBJECTS) +ALL_OBJECTS += $(test_renew_OBJECTS) +ALL_OBJECTS += $(test_rfc3961_OBJECTS) + +$(ALL_OBJECTS): $(srcdir)/krb5-protos.h $(srcdir)/krb5-private.h +$(ALL_OBJECTS): krb5_err.h heim_err.h k524_err.h krb5_err.h krb_err.h k524_err.h librfc3961_la_SOURCES = \ crc.c \ crypto.c \ crypto.h \ - crypto-aes.c \ + crypto-aes-sha1.c \ + crypto-aes-sha2.c \ crypto-algs.c \ crypto-arcfour.c \ crypto-des.c \ @@ -259,14 +291,17 @@ crypto-rand.c \ crypto-stubs.c \ data.c \ + enomem.c \ error_string.c \ keyblock.c \ n-fold.c \ salt.c \ - salt-aes.c \ + salt-aes-sha1.c \ + salt-aes-sha2.c \ salt-arcfour.c \ salt-des.c \ salt-des3.c \ + sp800-108-kdf.c \ store-int.c \ warn.c @@ -277,15 +312,20 @@ $(LIB_hcrypto) \ $(LIB_roken) -$(srcdir)/krb5-protos.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -E KRB5_LIB -q -P comment -o krb5-protos.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-protos.h +if DEVELOPER_MODE +headerdeps = $(dist_libkrb5_la_SOURCES) +endif + +$(srcdir)/krb5-protos.h: $(headerdeps) + @cd $(srcdir) && perl ../../cf/make-proto.pl -E KRB5_LIB -q -P comment -o krb5-protos.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-protos.h -$(srcdir)/krb5-private.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p krb5-private.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-private.h +$(srcdir)/krb5-private.h: $(headerdeps) + @cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p krb5-private.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-private.h man_MANS = \ kerberos.8 \ krb5.conf.5 \ + krb5-plugin.7 \ krb524_convert_creds_kdc.3 \ krb5_425_conv_principal.3 \ krb5_acl_match_file.3 \ @@ -330,15 +370,17 @@ dist_include_HEADERS = \ krb5.h \ - krb5-protos.h \ - krb5-private.h \ + $(srcdir)/krb5-protos.h \ krb5_ccapi.h +noinst_HEADERS = $(srcdir)/krb5-private.h + + nodist_include_HEADERS = krb5_err.h heim_err.h k524_err.h # XXX use nobase_include_HEADERS = krb5/locate_plugin.h krb5dir = $(includedir)/krb5 -krb5_HEADERS = locate_plugin.h send_to_kdc_plugin.h ccache_plugin.h +krb5_HEADERS = locate_plugin.h send_to_kdc_plugin.h ccache_plugin.h an2ln_plugin.h db_plugin.h build_HEADERZ = \ $(krb5_HEADERS) \ @@ -359,6 +401,9 @@ EXTRA_DIST = \ NTMakefile \ + config_reg.c \ + dll.c \ + libkrb5-exports.def.in \ verify_krb5_conf-version.rc \ krb5_err.et \ krb_err.et \ diff --git a/crypto/heimdal/lib/krb5/Makefile.in b/crypto/heimdal/lib/krb5/Makefile.in --- a/crypto/heimdal/lib/krb5/Makefile.in +++ b/crypto/heimdal/lib/krb5/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,34 +96,31 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(dist_include_HEADERS) $(krb5_HEADERS) \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common bin_PROGRAMS = verify_krb5_conf$(EXEEXT) -noinst_PROGRAMS = krbhst-test$(EXEEXT) test_gic$(EXEEXT) \ - test_alname$(EXEEXT) test_crypto$(EXEEXT) \ - test_rfc3961$(EXEEXT) test_get_addrs$(EXEEXT) \ +noinst_PROGRAMS = krbhst-test$(EXEEXT) test_alname$(EXEEXT) \ + test_crypto$(EXEEXT) test_forward$(EXEEXT) \ + test_get_addrs$(EXEEXT) test_gic$(EXEEXT) \ test_kuserok$(EXEEXT) test_renew$(EXEEXT) \ - test_forward$(EXEEXT) + test_rfc3961$(EXEEXT) TESTS = aes-test$(EXEEXT) derived-key-test$(EXEEXT) \ n-fold-test$(EXEEXT) parse-name-test$(EXEEXT) \ - store-test$(EXEEXT) string-to-key-test$(EXEEXT) \ - test_acl$(EXEEXT) test_addr$(EXEEXT) test_cc$(EXEEXT) \ - test_config$(EXEEXT) test_fx$(EXEEXT) test_prf$(EXEEXT) \ - test_store$(EXEEXT) test_crypto_wrapping$(EXEEXT) \ - test_keytab$(EXEEXT) test_mem$(EXEEXT) test_pac$(EXEEXT) \ - test_plugin$(EXEEXT) test_princ$(EXEEXT) \ - test_pkinit_dh2key$(EXEEXT) test_pknistkdf$(EXEEXT) \ - test_time$(EXEEXT) test_x500$(EXEEXT) + pseudo-random-test$(EXEEXT) store-test$(EXEEXT) \ + string-to-key-test$(EXEEXT) test_acl$(EXEEXT) \ + test_addr$(EXEEXT) test_cc$(EXEEXT) test_config$(EXEEXT) \ + test_fx$(EXEEXT) test_prf$(EXEEXT) test_store$(EXEEXT) \ + test_crypto_wrapping$(EXEEXT) test_keytab$(EXEEXT) \ + test_mem$(EXEEXT) test_pac$(EXEEXT) test_plugin$(EXEEXT) \ + test_princ$(EXEEXT) test_pkinit_dh2key$(EXEEXT) \ + test_pknistkdf$(EXEEXT) test_time$(EXEEXT) \ + test_expand_toks$(EXEEXT) test_x500$(EXEEXT) check_PROGRAMS = $(am__EXEEXT_1) test_hostname$(EXEEXT) \ - test_ap-req$(EXEEXT) + test_ap-req$(EXEEXT) test_canon$(EXEEXT) \ + test_set_kvno0$(EXEEXT) @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map subdir = lib/krb5 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -80,8 +131,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -94,6 +144,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -113,10 +164,29 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_include_HEADERS) \ + $(krb5_HEADERS) $(noinst_HEADERS) $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" \ + "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(man8dir)" \ + "$(DESTDIR)$(includedir)" "$(DESTDIR)$(krb5dir)" \ + "$(DESTDIR)$(includedir)" +am__EXEEXT_1 = aes-test$(EXEEXT) derived-key-test$(EXEEXT) \ + n-fold-test$(EXEEXT) parse-name-test$(EXEEXT) \ + pseudo-random-test$(EXEEXT) store-test$(EXEEXT) \ + string-to-key-test$(EXEEXT) test_acl$(EXEEXT) \ + test_addr$(EXEEXT) test_cc$(EXEEXT) test_config$(EXEEXT) \ + test_fx$(EXEEXT) test_prf$(EXEEXT) test_store$(EXEEXT) \ + test_crypto_wrapping$(EXEEXT) test_keytab$(EXEEXT) \ + test_mem$(EXEEXT) test_pac$(EXEEXT) test_plugin$(EXEEXT) \ + test_princ$(EXEEXT) test_pkinit_dh2key$(EXEEXT) \ + test_pknistkdf$(EXEEXT) test_time$(EXEEXT) \ + test_expand_toks$(EXEEXT) test_x500$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -138,10 +208,12 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" \ - "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(includedir)" \ - "$(DESTDIR)$(krb5dir)" "$(DESTDIR)$(includedir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = @have_scc_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) @@ -155,16 +227,18 @@ libkrb5_la-constants.lo libkrb5_la-context.lo \ libkrb5_la-copy_host_realm.lo libkrb5_la-crc.lo \ libkrb5_la-creds.lo libkrb5_la-crypto.lo \ - libkrb5_la-crypto-aes.lo libkrb5_la-crypto-algs.lo \ - libkrb5_la-crypto-arcfour.lo libkrb5_la-crypto-des.lo \ - libkrb5_la-crypto-des-common.lo libkrb5_la-crypto-des3.lo \ - libkrb5_la-crypto-evp.lo libkrb5_la-crypto-null.lo \ - libkrb5_la-crypto-pk.lo libkrb5_la-crypto-rand.lo \ - libkrb5_la-doxygen.lo libkrb5_la-data.lo \ - libkrb5_la-deprecated.lo libkrb5_la-digest.lo \ - libkrb5_la-eai_to_heim_errno.lo libkrb5_la-error_string.lo \ + libkrb5_la-crypto-aes-sha1.lo libkrb5_la-crypto-aes-sha2.lo \ + libkrb5_la-crypto-algs.lo libkrb5_la-crypto-arcfour.lo \ + libkrb5_la-crypto-des.lo libkrb5_la-crypto-des-common.lo \ + libkrb5_la-crypto-des3.lo libkrb5_la-crypto-evp.lo \ + libkrb5_la-crypto-null.lo libkrb5_la-crypto-pk.lo \ + libkrb5_la-crypto-rand.lo libkrb5_la-doxygen.lo \ + libkrb5_la-data.lo libkrb5_la-db_plugin.lo \ + libkrb5_la-dcache.lo libkrb5_la-deprecated.lo \ + libkrb5_la-digest.lo libkrb5_la-eai_to_heim_errno.lo \ + libkrb5_la-enomem.lo libkrb5_la-error_string.lo \ libkrb5_la-expand_hostname.lo libkrb5_la-expand_path.lo \ - libkrb5_la-fcache.lo libkrb5_la-free.lo \ + libkrb5_la-fast.lo libkrb5_la-fcache.lo libkrb5_la-free.lo \ libkrb5_la-free_host_realm.lo \ libkrb5_la-generate_seq_number.lo \ libkrb5_la-generate_subkey.lo libkrb5_la-get_addrs.lo \ @@ -184,20 +258,23 @@ libkrb5_la-net_read.lo libkrb5_la-net_write.lo \ libkrb5_la-n-fold.lo libkrb5_la-pac.lo libkrb5_la-padata.lo \ libkrb5_la-pcache.lo libkrb5_la-pkinit.lo \ - libkrb5_la-principal.lo libkrb5_la-prog_setup.lo \ - libkrb5_la-prompter_posix.lo libkrb5_la-rd_cred.lo \ - libkrb5_la-rd_error.lo libkrb5_la-rd_priv.lo \ - libkrb5_la-rd_rep.lo libkrb5_la-rd_req.lo \ - libkrb5_la-rd_safe.lo libkrb5_la-read_message.lo \ - libkrb5_la-recvauth.lo libkrb5_la-replay.lo libkrb5_la-salt.lo \ - libkrb5_la-salt-aes.lo libkrb5_la-salt-arcfour.lo \ - libkrb5_la-salt-des.lo libkrb5_la-salt-des3.lo \ + libkrb5_la-pkinit-ec.lo libkrb5_la-principal.lo \ + libkrb5_la-prog_setup.lo libkrb5_la-prompter_posix.lo \ + libkrb5_la-rd_cred.lo libkrb5_la-rd_error.lo \ + libkrb5_la-rd_priv.lo libkrb5_la-rd_rep.lo \ + libkrb5_la-rd_req.lo libkrb5_la-rd_safe.lo \ + libkrb5_la-read_message.lo libkrb5_la-recvauth.lo \ + libkrb5_la-replay.lo libkrb5_la-salt.lo \ + libkrb5_la-salt-aes-sha1.lo libkrb5_la-salt-aes-sha2.lo \ + libkrb5_la-salt-arcfour.lo libkrb5_la-salt-des.lo \ + libkrb5_la-salt-des3.lo libkrb5_la-sp800-108-kdf.lo \ libkrb5_la-scache.lo libkrb5_la-send_to_kdc.lo \ libkrb5_la-sendauth.lo libkrb5_la-set_default_realm.lo \ libkrb5_la-sock_principal.lo libkrb5_la-store.lo \ libkrb5_la-store-int.lo libkrb5_la-store_emem.lo \ libkrb5_la-store_fd.lo libkrb5_la-store_mem.lo \ - libkrb5_la-plugin.lo libkrb5_la-ticket.lo libkrb5_la-time.lo \ + libkrb5_la-store_sock.lo libkrb5_la-plugin.lo \ + libkrb5_la-ticket.lo libkrb5_la-time.lo \ libkrb5_la-transited.lo libkrb5_la-verify_init.lo \ libkrb5_la-verify_user.lo libkrb5_la-version.lo \ libkrb5_la-warn.lo libkrb5_la-write_message.lo @@ -206,7 +283,11 @@ nodist_libkrb5_la_OBJECTS = $(am__objects_1) libkrb5_la_OBJECTS = $(dist_libkrb5_la_OBJECTS) \ $(nodist_libkrb5_la_OBJECTS) -libkrb5_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libkrb5_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libkrb5_la_LDFLAGS) $(LDFLAGS) -o $@ librfc3961_la_DEPENDENCIES = $(top_builddir)/lib/asn1/libasn1.la \ @@ -217,288 +298,746 @@ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_librfc3961_la_OBJECTS = librfc3961_la-crc.lo \ - librfc3961_la-crypto.lo librfc3961_la-crypto-aes.lo \ - librfc3961_la-crypto-algs.lo librfc3961_la-crypto-arcfour.lo \ - librfc3961_la-crypto-des.lo librfc3961_la-crypto-des-common.lo \ + librfc3961_la-crypto.lo librfc3961_la-crypto-aes-sha1.lo \ + librfc3961_la-crypto-aes-sha2.lo librfc3961_la-crypto-algs.lo \ + librfc3961_la-crypto-arcfour.lo librfc3961_la-crypto-des.lo \ + librfc3961_la-crypto-des-common.lo \ librfc3961_la-crypto-des3.lo librfc3961_la-crypto-evp.lo \ librfc3961_la-crypto-null.lo librfc3961_la-crypto-pk.lo \ librfc3961_la-crypto-rand.lo librfc3961_la-crypto-stubs.lo \ - librfc3961_la-data.lo librfc3961_la-error_string.lo \ - librfc3961_la-keyblock.lo librfc3961_la-n-fold.lo \ - librfc3961_la-salt.lo librfc3961_la-salt-aes.lo \ + librfc3961_la-data.lo librfc3961_la-enomem.lo \ + librfc3961_la-error_string.lo librfc3961_la-keyblock.lo \ + librfc3961_la-n-fold.lo librfc3961_la-salt.lo \ + librfc3961_la-salt-aes-sha1.lo librfc3961_la-salt-aes-sha2.lo \ librfc3961_la-salt-arcfour.lo librfc3961_la-salt-des.lo \ - librfc3961_la-salt-des3.lo librfc3961_la-store-int.lo \ - librfc3961_la-warn.lo + librfc3961_la-salt-des3.lo librfc3961_la-sp800-108-kdf.lo \ + librfc3961_la-store-int.lo librfc3961_la-warn.lo librfc3961_la_OBJECTS = $(am_librfc3961_la_OBJECTS) -am__EXEEXT_1 = aes-test$(EXEEXT) derived-key-test$(EXEEXT) \ - n-fold-test$(EXEEXT) parse-name-test$(EXEEXT) \ - store-test$(EXEEXT) string-to-key-test$(EXEEXT) \ - test_acl$(EXEEXT) test_addr$(EXEEXT) test_cc$(EXEEXT) \ - test_config$(EXEEXT) test_fx$(EXEEXT) test_prf$(EXEEXT) \ - test_store$(EXEEXT) test_crypto_wrapping$(EXEEXT) \ - test_keytab$(EXEEXT) test_mem$(EXEEXT) test_pac$(EXEEXT) \ - test_plugin$(EXEEXT) test_princ$(EXEEXT) \ - test_pkinit_dh2key$(EXEEXT) test_pknistkdf$(EXEEXT) \ - test_time$(EXEEXT) test_x500$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) aes_test_SOURCES = aes-test.c aes_test_OBJECTS = aes-test.$(OBJEXT) aes_test_LDADD = $(LDADD) aes_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) derived_key_test_SOURCES = derived-key-test.c derived_key_test_OBJECTS = derived-key-test.$(OBJEXT) derived_key_test_LDADD = $(LDADD) derived_key_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) krbhst_test_SOURCES = krbhst-test.c krbhst_test_OBJECTS = krbhst-test.$(OBJEXT) krbhst_test_LDADD = $(LDADD) krbhst_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) n_fold_test_SOURCES = n-fold-test.c n_fold_test_OBJECTS = n-fold-test.$(OBJEXT) n_fold_test_LDADD = $(LDADD) n_fold_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) parse_name_test_SOURCES = parse-name-test.c parse_name_test_OBJECTS = parse-name-test.$(OBJEXT) parse_name_test_LDADD = $(LDADD) parse_name_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) +pseudo_random_test_SOURCES = pseudo-random-test.c +pseudo_random_test_OBJECTS = pseudo-random-test.$(OBJEXT) +pseudo_random_test_LDADD = $(LDADD) +pseudo_random_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) store_test_SOURCES = store-test.c store_test_OBJECTS = store-test.$(OBJEXT) store_test_LDADD = $(LDADD) store_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) string_to_key_test_SOURCES = string-to-key-test.c string_to_key_test_OBJECTS = string-to-key-test.$(OBJEXT) string_to_key_test_LDADD = $(LDADD) string_to_key_test_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_acl_SOURCES = test_acl.c test_acl_OBJECTS = test_acl.$(OBJEXT) test_acl_LDADD = $(LDADD) test_acl_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_addr_SOURCES = test_addr.c test_addr_OBJECTS = test_addr.$(OBJEXT) test_addr_LDADD = $(LDADD) test_addr_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_alname_SOURCES = test_alname.c test_alname_OBJECTS = test_alname.$(OBJEXT) test_alname_LDADD = $(LDADD) test_alname_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_ap_req_SOURCES = test_ap-req.c test_ap_req_OBJECTS = test_ap-req.$(OBJEXT) test_ap_req_LDADD = $(LDADD) test_ap_req_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) +test_canon_SOURCES = test_canon.c +test_canon_OBJECTS = test_canon.$(OBJEXT) +test_canon_LDADD = $(LDADD) +test_canon_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_cc_SOURCES = test_cc.c test_cc_OBJECTS = test_cc.$(OBJEXT) test_cc_LDADD = $(LDADD) test_cc_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_config_SOURCES = test_config.c test_config_OBJECTS = test_config.$(OBJEXT) test_config_LDADD = $(LDADD) test_config_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_crypto_SOURCES = test_crypto.c test_crypto_OBJECTS = test_crypto.$(OBJEXT) test_crypto_LDADD = $(LDADD) test_crypto_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_crypto_wrapping_SOURCES = test_crypto_wrapping.c test_crypto_wrapping_OBJECTS = test_crypto_wrapping.$(OBJEXT) test_crypto_wrapping_LDADD = $(LDADD) test_crypto_wrapping_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) +test_expand_toks_SOURCES = test_expand_toks.c +test_expand_toks_OBJECTS = test_expand_toks.$(OBJEXT) +test_expand_toks_LDADD = $(LDADD) +test_expand_toks_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_forward_SOURCES = test_forward.c test_forward_OBJECTS = test_forward.$(OBJEXT) test_forward_LDADD = $(LDADD) test_forward_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_fx_SOURCES = test_fx.c test_fx_OBJECTS = test_fx.$(OBJEXT) test_fx_LDADD = $(LDADD) test_fx_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_get_addrs_SOURCES = test_get_addrs.c test_get_addrs_OBJECTS = test_get_addrs.$(OBJEXT) test_get_addrs_LDADD = $(LDADD) test_get_addrs_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_gic_SOURCES = test_gic.c test_gic_OBJECTS = test_gic.$(OBJEXT) test_gic_LDADD = $(LDADD) test_gic_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_hostname_SOURCES = test_hostname.c test_hostname_OBJECTS = test_hostname.$(OBJEXT) test_hostname_LDADD = $(LDADD) test_hostname_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_keytab_SOURCES = test_keytab.c test_keytab_OBJECTS = test_keytab.$(OBJEXT) test_keytab_LDADD = $(LDADD) test_keytab_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_kuserok_SOURCES = test_kuserok.c test_kuserok_OBJECTS = test_kuserok.$(OBJEXT) test_kuserok_LDADD = $(LDADD) test_kuserok_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_mem_SOURCES = test_mem.c test_mem_OBJECTS = test_mem.$(OBJEXT) test_mem_LDADD = $(LDADD) test_mem_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_pac_SOURCES = test_pac.c test_pac_OBJECTS = test_pac.$(OBJEXT) test_pac_LDADD = $(LDADD) test_pac_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_pkinit_dh2key_SOURCES = test_pkinit_dh2key.c test_pkinit_dh2key_OBJECTS = test_pkinit_dh2key.$(OBJEXT) test_pkinit_dh2key_LDADD = $(LDADD) test_pkinit_dh2key_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_pknistkdf_SOURCES = test_pknistkdf.c test_pknistkdf_OBJECTS = test_pknistkdf.$(OBJEXT) test_pknistkdf_LDADD = $(LDADD) test_pknistkdf_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_plugin_SOURCES = test_plugin.c test_plugin_OBJECTS = test_plugin.$(OBJEXT) test_plugin_LDADD = $(LDADD) test_plugin_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_prf_SOURCES = test_prf.c test_prf_OBJECTS = test_prf.$(OBJEXT) test_prf_LDADD = $(LDADD) test_prf_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_princ_SOURCES = test_princ.c test_princ_OBJECTS = test_princ.$(OBJEXT) test_princ_LDADD = $(LDADD) test_princ_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_renew_SOURCES = test_renew.c test_renew_OBJECTS = test_renew.$(OBJEXT) test_renew_LDADD = $(LDADD) test_renew_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_rfc3961_SOURCES = test_rfc3961.c test_rfc3961_OBJECTS = test_rfc3961.$(OBJEXT) test_rfc3961_DEPENDENCIES = librfc3961.la \ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) +test_set_kvno0_SOURCES = test_set_kvno0.c +test_set_kvno0_OBJECTS = test_set_kvno0.$(OBJEXT) +test_set_kvno0_LDADD = $(LDADD) +test_set_kvno0_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ + $(top_builddir)/lib/asn1/libasn1.la \ + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_store_SOURCES = test_store.c test_store_OBJECTS = test_store.$(OBJEXT) test_store_LDADD = $(LDADD) test_store_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_time_SOURCES = test_time.c test_time_OBJECTS = test_time.$(OBJEXT) test_time_LDADD = $(LDADD) test_time_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) test_x500_SOURCES = test_x500.c test_x500_OBJECTS = test_x500.$(OBJEXT) test_x500_LDADD = $(LDADD) test_x500_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) verify_krb5_conf_SOURCES = verify_krb5_conf.c verify_krb5_conf_OBJECTS = verify_krb5_conf.$(OBJEXT) verify_krb5_conf_LDADD = $(LDADD) verify_krb5_conf_DEPENDENCIES = libkrb5.la $(am__DEPENDENCIES_1) \ $(top_builddir)/lib/asn1/libasn1.la \ - $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) + $(top_builddir)/lib/wind/libwind.la $(LIB_heimbase) \ + $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/aes-test.Po \ + ./$(DEPDIR)/derived-key-test.Po ./$(DEPDIR)/krbhst-test.Po \ + ./$(DEPDIR)/libkrb5_la-acache.Plo \ + ./$(DEPDIR)/libkrb5_la-acl.Plo \ + ./$(DEPDIR)/libkrb5_la-add_et_list.Plo \ + ./$(DEPDIR)/libkrb5_la-addr_families.Plo \ + ./$(DEPDIR)/libkrb5_la-aname_to_localname.Plo \ + ./$(DEPDIR)/libkrb5_la-appdefault.Plo \ + ./$(DEPDIR)/libkrb5_la-asn1_glue.Plo \ + ./$(DEPDIR)/libkrb5_la-auth_context.Plo \ + ./$(DEPDIR)/libkrb5_la-build_ap_req.Plo \ + ./$(DEPDIR)/libkrb5_la-build_auth.Plo \ + ./$(DEPDIR)/libkrb5_la-cache.Plo \ + ./$(DEPDIR)/libkrb5_la-changepw.Plo \ + ./$(DEPDIR)/libkrb5_la-codec.Plo \ + ./$(DEPDIR)/libkrb5_la-config_file.Plo \ + ./$(DEPDIR)/libkrb5_la-constants.Plo \ + ./$(DEPDIR)/libkrb5_la-context.Plo \ + ./$(DEPDIR)/libkrb5_la-convert_creds.Plo \ + ./$(DEPDIR)/libkrb5_la-copy_host_realm.Plo \ + ./$(DEPDIR)/libkrb5_la-crc.Plo \ + ./$(DEPDIR)/libkrb5_la-creds.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-aes-sha1.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-aes-sha2.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-algs.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-arcfour.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-des-common.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-des.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-des3.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-evp.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-null.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-pk.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto-rand.Plo \ + ./$(DEPDIR)/libkrb5_la-crypto.Plo \ + ./$(DEPDIR)/libkrb5_la-data.Plo \ + ./$(DEPDIR)/libkrb5_la-db_plugin.Plo \ + ./$(DEPDIR)/libkrb5_la-dcache.Plo \ + ./$(DEPDIR)/libkrb5_la-deprecated.Plo \ + ./$(DEPDIR)/libkrb5_la-digest.Plo \ + ./$(DEPDIR)/libkrb5_la-doxygen.Plo \ + ./$(DEPDIR)/libkrb5_la-eai_to_heim_errno.Plo \ + ./$(DEPDIR)/libkrb5_la-enomem.Plo \ + ./$(DEPDIR)/libkrb5_la-error_string.Plo \ + ./$(DEPDIR)/libkrb5_la-expand_hostname.Plo \ + ./$(DEPDIR)/libkrb5_la-expand_path.Plo \ + ./$(DEPDIR)/libkrb5_la-fast.Plo \ + ./$(DEPDIR)/libkrb5_la-fcache.Plo \ + ./$(DEPDIR)/libkrb5_la-free.Plo \ + ./$(DEPDIR)/libkrb5_la-free_host_realm.Plo \ + ./$(DEPDIR)/libkrb5_la-generate_seq_number.Plo \ + ./$(DEPDIR)/libkrb5_la-generate_subkey.Plo \ + ./$(DEPDIR)/libkrb5_la-get_addrs.Plo \ + ./$(DEPDIR)/libkrb5_la-get_cred.Plo \ + ./$(DEPDIR)/libkrb5_la-get_default_principal.Plo \ + ./$(DEPDIR)/libkrb5_la-get_default_realm.Plo \ + ./$(DEPDIR)/libkrb5_la-get_for_creds.Plo \ + ./$(DEPDIR)/libkrb5_la-get_host_realm.Plo \ + ./$(DEPDIR)/libkrb5_la-get_in_tkt.Plo \ + ./$(DEPDIR)/libkrb5_la-get_port.Plo \ + ./$(DEPDIR)/libkrb5_la-heim_err.Plo \ + ./$(DEPDIR)/libkrb5_la-init_creds.Plo \ + ./$(DEPDIR)/libkrb5_la-init_creds_pw.Plo \ + ./$(DEPDIR)/libkrb5_la-k524_err.Plo \ + ./$(DEPDIR)/libkrb5_la-kcm.Plo \ + ./$(DEPDIR)/libkrb5_la-keyblock.Plo \ + ./$(DEPDIR)/libkrb5_la-keytab.Plo \ + ./$(DEPDIR)/libkrb5_la-keytab_any.Plo \ + ./$(DEPDIR)/libkrb5_la-keytab_file.Plo \ + ./$(DEPDIR)/libkrb5_la-keytab_keyfile.Plo \ + ./$(DEPDIR)/libkrb5_la-keytab_memory.Plo \ + ./$(DEPDIR)/libkrb5_la-krb5_err.Plo \ + ./$(DEPDIR)/libkrb5_la-krb_err.Plo \ + ./$(DEPDIR)/libkrb5_la-krbhst.Plo \ + ./$(DEPDIR)/libkrb5_la-kuserok.Plo \ + ./$(DEPDIR)/libkrb5_la-log.Plo \ + ./$(DEPDIR)/libkrb5_la-mcache.Plo \ + ./$(DEPDIR)/libkrb5_la-misc.Plo \ + ./$(DEPDIR)/libkrb5_la-mit_glue.Plo \ + ./$(DEPDIR)/libkrb5_la-mk_error.Plo \ + ./$(DEPDIR)/libkrb5_la-mk_priv.Plo \ + ./$(DEPDIR)/libkrb5_la-mk_rep.Plo \ + ./$(DEPDIR)/libkrb5_la-mk_req.Plo \ + ./$(DEPDIR)/libkrb5_la-mk_req_ext.Plo \ + ./$(DEPDIR)/libkrb5_la-mk_safe.Plo \ + ./$(DEPDIR)/libkrb5_la-n-fold.Plo \ + ./$(DEPDIR)/libkrb5_la-net_read.Plo \ + ./$(DEPDIR)/libkrb5_la-net_write.Plo \ + ./$(DEPDIR)/libkrb5_la-pac.Plo \ + ./$(DEPDIR)/libkrb5_la-padata.Plo \ + ./$(DEPDIR)/libkrb5_la-pcache.Plo \ + ./$(DEPDIR)/libkrb5_la-pkinit-ec.Plo \ + ./$(DEPDIR)/libkrb5_la-pkinit.Plo \ + ./$(DEPDIR)/libkrb5_la-plugin.Plo \ + ./$(DEPDIR)/libkrb5_la-principal.Plo \ + ./$(DEPDIR)/libkrb5_la-prog_setup.Plo \ + ./$(DEPDIR)/libkrb5_la-prompter_posix.Plo \ + ./$(DEPDIR)/libkrb5_la-rd_cred.Plo \ + ./$(DEPDIR)/libkrb5_la-rd_error.Plo \ + ./$(DEPDIR)/libkrb5_la-rd_priv.Plo \ + ./$(DEPDIR)/libkrb5_la-rd_rep.Plo \ + ./$(DEPDIR)/libkrb5_la-rd_req.Plo \ + ./$(DEPDIR)/libkrb5_la-rd_safe.Plo \ + ./$(DEPDIR)/libkrb5_la-read_message.Plo \ + ./$(DEPDIR)/libkrb5_la-recvauth.Plo \ + ./$(DEPDIR)/libkrb5_la-replay.Plo \ + ./$(DEPDIR)/libkrb5_la-salt-aes-sha1.Plo \ + ./$(DEPDIR)/libkrb5_la-salt-aes-sha2.Plo \ + ./$(DEPDIR)/libkrb5_la-salt-arcfour.Plo \ + ./$(DEPDIR)/libkrb5_la-salt-des.Plo \ + ./$(DEPDIR)/libkrb5_la-salt-des3.Plo \ + ./$(DEPDIR)/libkrb5_la-salt.Plo \ + ./$(DEPDIR)/libkrb5_la-scache.Plo \ + ./$(DEPDIR)/libkrb5_la-send_to_kdc.Plo \ + ./$(DEPDIR)/libkrb5_la-sendauth.Plo \ + ./$(DEPDIR)/libkrb5_la-set_default_realm.Plo \ + ./$(DEPDIR)/libkrb5_la-sock_principal.Plo \ + ./$(DEPDIR)/libkrb5_la-sp800-108-kdf.Plo \ + ./$(DEPDIR)/libkrb5_la-store-int.Plo \ + ./$(DEPDIR)/libkrb5_la-store.Plo \ + ./$(DEPDIR)/libkrb5_la-store_emem.Plo \ + ./$(DEPDIR)/libkrb5_la-store_fd.Plo \ + ./$(DEPDIR)/libkrb5_la-store_mem.Plo \ + ./$(DEPDIR)/libkrb5_la-store_sock.Plo \ + ./$(DEPDIR)/libkrb5_la-ticket.Plo \ + ./$(DEPDIR)/libkrb5_la-time.Plo \ + ./$(DEPDIR)/libkrb5_la-transited.Plo \ + ./$(DEPDIR)/libkrb5_la-verify_init.Plo \ + ./$(DEPDIR)/libkrb5_la-verify_user.Plo \ + ./$(DEPDIR)/libkrb5_la-version.Plo \ + ./$(DEPDIR)/libkrb5_la-warn.Plo \ + ./$(DEPDIR)/libkrb5_la-write_message.Plo \ + ./$(DEPDIR)/librfc3961_la-crc.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-aes-sha1.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-aes-sha2.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-algs.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-arcfour.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-des-common.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-des.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-des3.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-evp.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-null.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-pk.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-rand.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto-stubs.Plo \ + ./$(DEPDIR)/librfc3961_la-crypto.Plo \ + ./$(DEPDIR)/librfc3961_la-data.Plo \ + ./$(DEPDIR)/librfc3961_la-enomem.Plo \ + ./$(DEPDIR)/librfc3961_la-error_string.Plo \ + ./$(DEPDIR)/librfc3961_la-keyblock.Plo \ + ./$(DEPDIR)/librfc3961_la-n-fold.Plo \ + ./$(DEPDIR)/librfc3961_la-salt-aes-sha1.Plo \ + ./$(DEPDIR)/librfc3961_la-salt-aes-sha2.Plo \ + ./$(DEPDIR)/librfc3961_la-salt-arcfour.Plo \ + ./$(DEPDIR)/librfc3961_la-salt-des.Plo \ + ./$(DEPDIR)/librfc3961_la-salt-des3.Plo \ + ./$(DEPDIR)/librfc3961_la-salt.Plo \ + ./$(DEPDIR)/librfc3961_la-sp800-108-kdf.Plo \ + ./$(DEPDIR)/librfc3961_la-store-int.Plo \ + ./$(DEPDIR)/librfc3961_la-warn.Plo ./$(DEPDIR)/n-fold-test.Po \ + ./$(DEPDIR)/parse-name-test.Po \ + ./$(DEPDIR)/pseudo-random-test.Po ./$(DEPDIR)/store-test.Po \ + ./$(DEPDIR)/string-to-key-test.Po ./$(DEPDIR)/test_acl.Po \ + ./$(DEPDIR)/test_addr.Po ./$(DEPDIR)/test_alname.Po \ + ./$(DEPDIR)/test_ap-req.Po ./$(DEPDIR)/test_canon.Po \ + ./$(DEPDIR)/test_cc.Po ./$(DEPDIR)/test_config.Po \ + ./$(DEPDIR)/test_crypto.Po ./$(DEPDIR)/test_crypto_wrapping.Po \ + ./$(DEPDIR)/test_expand_toks.Po ./$(DEPDIR)/test_forward.Po \ + ./$(DEPDIR)/test_fx.Po ./$(DEPDIR)/test_get_addrs.Po \ + ./$(DEPDIR)/test_gic.Po ./$(DEPDIR)/test_hostname.Po \ + ./$(DEPDIR)/test_keytab.Po ./$(DEPDIR)/test_kuserok.Po \ + ./$(DEPDIR)/test_mem.Po ./$(DEPDIR)/test_pac.Po \ + ./$(DEPDIR)/test_pkinit_dh2key.Po \ + ./$(DEPDIR)/test_pknistkdf.Po ./$(DEPDIR)/test_plugin.Po \ + ./$(DEPDIR)/test_prf.Po ./$(DEPDIR)/test_princ.Po \ + ./$(DEPDIR)/test_renew.Po ./$(DEPDIR)/test_rfc3961.Po \ + ./$(DEPDIR)/test_set_kvno0.Po ./$(DEPDIR)/test_store.Po \ + ./$(DEPDIR)/test_time.Po ./$(DEPDIR)/test_x500.Po \ + ./$(DEPDIR)/verify_krb5_conf.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(dist_libkrb5_la_SOURCES) $(nodist_libkrb5_la_SOURCES) \ $(librfc3961_la_SOURCES) aes-test.c derived-key-test.c \ - krbhst-test.c n-fold-test.c parse-name-test.c store-test.c \ - string-to-key-test.c test_acl.c test_addr.c test_alname.c \ - test_ap-req.c test_cc.c test_config.c test_crypto.c \ - test_crypto_wrapping.c test_forward.c test_fx.c \ - test_get_addrs.c test_gic.c test_hostname.c test_keytab.c \ - test_kuserok.c test_mem.c test_pac.c test_pkinit_dh2key.c \ - test_pknistkdf.c test_plugin.c test_prf.c test_princ.c \ - test_renew.c test_rfc3961.c test_store.c test_time.c \ - test_x500.c verify_krb5_conf.c + krbhst-test.c n-fold-test.c parse-name-test.c \ + pseudo-random-test.c store-test.c string-to-key-test.c \ + test_acl.c test_addr.c test_alname.c test_ap-req.c \ + test_canon.c test_cc.c test_config.c test_crypto.c \ + test_crypto_wrapping.c test_expand_toks.c test_forward.c \ + test_fx.c test_get_addrs.c test_gic.c test_hostname.c \ + test_keytab.c test_kuserok.c test_mem.c test_pac.c \ + test_pkinit_dh2key.c test_pknistkdf.c test_plugin.c test_prf.c \ + test_princ.c test_renew.c test_rfc3961.c test_set_kvno0.c \ + test_store.c test_time.c test_x500.c verify_krb5_conf.c DIST_SOURCES = $(dist_libkrb5_la_SOURCES) $(librfc3961_la_SOURCES) \ aes-test.c derived-key-test.c krbhst-test.c n-fold-test.c \ - parse-name-test.c store-test.c string-to-key-test.c test_acl.c \ - test_addr.c test_alname.c test_ap-req.c test_cc.c \ - test_config.c test_crypto.c test_crypto_wrapping.c \ + parse-name-test.c pseudo-random-test.c store-test.c \ + string-to-key-test.c test_acl.c test_addr.c test_alname.c \ + test_ap-req.c test_canon.c test_cc.c test_config.c \ + test_crypto.c test_crypto_wrapping.c test_expand_toks.c \ test_forward.c test_fx.c test_get_addrs.c test_gic.c \ test_hostname.c test_keytab.c test_kuserok.c test_mem.c \ test_pac.c test_pkinit_dh2key.c test_pknistkdf.c test_plugin.c \ test_prf.c test_princ.c test_renew.c test_rfc3961.c \ - test_store.c test_time.c test_x500.c verify_krb5_conf.c + test_set_kvno0.c test_store.c test_time.c test_x500.c \ + verify_krb5_conf.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac man3dir = $(mandir)/man3 man5dir = $(mandir)/man5 +man7dir = $(mandir)/man7 man8dir = $(mandir)/man8 MANS = $(man_MANS) HEADERS = $(dist_include_HEADERS) $(krb5_HEADERS) \ - $(nodist_include_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= + $(nodist_include_HEADERS) $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -513,16 +1052,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -532,17 +1074,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -561,12 +1105,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -575,6 +1116,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -591,10 +1133,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -602,6 +1142,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -616,12 +1157,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -638,10 +1182,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -652,13 +1202,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -682,6 +1226,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -705,9 +1251,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -717,31 +1268,39 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_krb4) $(INCLUDE_hcrypto) \ - -I../com_err -I$(srcdir)/../com_err $(INCLUDE_sqlite3) \ - $(INCLUDE_libintl) +AM_CPPFLAGS = $(INCLUDES_roken) -I../com_err -I$(srcdir)/../com_err \ + $(INCLUDE_sqlite3) $(INCLUDE_libintl) \ + $(INCLUDE_openssl_crypto) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; noinst_LTLIBRARIES = \ librfc3961.la @@ -750,7 +1309,7 @@ $(LIB_hcrypto) \ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/wind/libwind.la \ - $(LIB_roken) + $(LIB_heimbase) $(LIB_roken) @PKINIT_TRUE@LIB_pkinit = ../hx509/libhx509.la @have_scc_TRUE@use_sqlite = $(LIB_sqlite3) @@ -758,8 +1317,9 @@ $(top_builddir)/lib/asn1/libasn1.la \ $(top_builddir)/lib/ipc/libheim-ipcc.la \ $(top_builddir)/lib/wind/libwind.la \ - $(top_builddir)/base/libheimbase.la \ + $(top_builddir)/lib/base/libheimbase.la \ $(LIB_pkinit) \ + $(LIB_openssl_crypto) \ $(use_sqlite) \ $(LIB_com_err) \ $(LIB_hcrypto) \ @@ -800,6 +1360,7 @@ acl.c \ add_et_list.c \ addr_families.c \ + an2ln_plugin.h \ aname_to_localname.c \ appdefault.c \ asn1_glue.c \ @@ -818,7 +1379,8 @@ creds.c \ crypto.c \ crypto.h \ - crypto-aes.c \ + crypto-aes-sha1.c \ + crypto-aes-sha2.c \ crypto-algs.c \ crypto-arcfour.c \ crypto-des.c \ @@ -830,12 +1392,17 @@ crypto-rand.c \ doxygen.c \ data.c \ + db_plugin.c \ + db_plugin.h \ + dcache.c \ deprecated.c \ digest.c \ eai_to_heim_errno.c \ + enomem.c \ error_string.c \ expand_hostname.c \ expand_path.c \ + fast.c \ fcache.c \ free.c \ free_host_realm.c \ @@ -863,6 +1430,7 @@ krb5-v4compat.h \ krbhst.c \ kuserok.c \ + kuserok_plugin.h \ log.c \ mcache.c \ misc.c \ @@ -880,6 +1448,7 @@ padata.c \ pcache.c \ pkinit.c \ + pkinit-ec.c \ principal.c \ prog_setup.c \ prompter_posix.c \ @@ -893,10 +1462,12 @@ recvauth.c \ replay.c \ salt.c \ - salt-aes.c \ + salt-aes-sha1.c \ + salt-aes-sha2.c \ salt-arcfour.c \ salt-des.c \ salt-des3.c \ + sp800-108-kdf.c \ scache.c \ send_to_kdc.c \ sendauth.c \ @@ -908,6 +1479,7 @@ store_emem.c \ store_fd.c \ store_mem.c \ + store_sock.c \ plugin.c \ ticket.c \ time.c \ @@ -925,11 +1497,19 @@ version-script.map libkrb5_la_LDFLAGS = -version-info 26:0:0 $(am__append_1) +ALL_OBJECTS = $(libkrb5_la_OBJECTS) $(verify_krb5_conf_OBJECTS) \ + $(librfc3961_la_OBJECTS) $(librfc3961_la_OBJECTS) \ + $(krbhst_test_OBJECTS) $(test_alname_OBJECTS) \ + $(test_crypto_OBJECTS) $(test_forward_OBJECTS) \ + $(test_get_addrs_OBJECTS) $(test_gic_OBJECTS) \ + $(test_kuserok_OBJECTS) $(test_renew_OBJECTS) \ + $(test_rfc3961_OBJECTS) librfc3961_la_SOURCES = \ crc.c \ crypto.c \ crypto.h \ - crypto-aes.c \ + crypto-aes-sha1.c \ + crypto-aes-sha2.c \ crypto-algs.c \ crypto-arcfour.c \ crypto-des.c \ @@ -941,14 +1521,17 @@ crypto-rand.c \ crypto-stubs.c \ data.c \ + enomem.c \ error_string.c \ keyblock.c \ n-fold.c \ salt.c \ - salt-aes.c \ + salt-aes-sha1.c \ + salt-aes-sha2.c \ salt-arcfour.c \ salt-des.c \ salt-des3.c \ + sp800-108-kdf.c \ store-int.c \ warn.c @@ -959,9 +1542,11 @@ $(LIB_hcrypto) \ $(LIB_roken) +@DEVELOPER_MODE_TRUE@headerdeps = $(dist_libkrb5_la_SOURCES) man_MANS = \ kerberos.8 \ krb5.conf.5 \ + krb5-plugin.7 \ krb524_convert_creds_kdc.3 \ krb5_425_conv_principal.3 \ krb5_acl_match_file.3 \ @@ -1006,15 +1591,15 @@ dist_include_HEADERS = \ krb5.h \ - krb5-protos.h \ - krb5-private.h \ + $(srcdir)/krb5-protos.h \ krb5_ccapi.h +noinst_HEADERS = $(srcdir)/krb5-private.h nodist_include_HEADERS = krb5_err.h heim_err.h k524_err.h # XXX use nobase_include_HEADERS = krb5/locate_plugin.h krb5dir = $(includedir)/krb5 -krb5_HEADERS = locate_plugin.h send_to_kdc_plugin.h ccache_plugin.h +krb5_HEADERS = locate_plugin.h send_to_kdc_plugin.h ccache_plugin.h an2ln_plugin.h db_plugin.h build_HEADERZ = \ $(krb5_HEADERS) \ krb_err.h @@ -1029,6 +1614,9 @@ EXTRA_DIST = \ NTMakefile \ + config_reg.c \ + dll.c \ + libkrb5-exports.def.in \ verify_krb5_conf-version.rc \ krb5_err.et \ krb_err.et \ @@ -1042,7 +1630,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -1055,15 +1643,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/krb5/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/krb5/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -1073,60 +1661,21 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libkrb5.la: $(libkrb5_la_OBJECTS) $(libkrb5_la_DEPENDENCIES) - $(libkrb5_la_LINK) -rpath $(libdir) $(libkrb5_la_OBJECTS) $(libkrb5_la_LIBADD) $(LIBS) -librfc3961.la: $(librfc3961_la_OBJECTS) $(librfc3961_la_DEPENDENCIES) - $(LINK) $(librfc3961_la_OBJECTS) $(librfc3961_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -1147,7 +1696,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -1178,111 +1728,214 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -aes-test$(EXEEXT): $(aes_test_OBJECTS) $(aes_test_DEPENDENCIES) + +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}; \ + } + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_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}; \ + } + +libkrb5.la: $(libkrb5_la_OBJECTS) $(libkrb5_la_DEPENDENCIES) $(EXTRA_libkrb5_la_DEPENDENCIES) + $(AM_V_CCLD)$(libkrb5_la_LINK) -rpath $(libdir) $(libkrb5_la_OBJECTS) $(libkrb5_la_LIBADD) $(LIBS) + +librfc3961.la: $(librfc3961_la_OBJECTS) $(librfc3961_la_DEPENDENCIES) $(EXTRA_librfc3961_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(librfc3961_la_OBJECTS) $(librfc3961_la_LIBADD) $(LIBS) + +aes-test$(EXEEXT): $(aes_test_OBJECTS) $(aes_test_DEPENDENCIES) $(EXTRA_aes_test_DEPENDENCIES) @rm -f aes-test$(EXEEXT) - $(LINK) $(aes_test_OBJECTS) $(aes_test_LDADD) $(LIBS) -derived-key-test$(EXEEXT): $(derived_key_test_OBJECTS) $(derived_key_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(aes_test_OBJECTS) $(aes_test_LDADD) $(LIBS) + +derived-key-test$(EXEEXT): $(derived_key_test_OBJECTS) $(derived_key_test_DEPENDENCIES) $(EXTRA_derived_key_test_DEPENDENCIES) @rm -f derived-key-test$(EXEEXT) - $(LINK) $(derived_key_test_OBJECTS) $(derived_key_test_LDADD) $(LIBS) -krbhst-test$(EXEEXT): $(krbhst_test_OBJECTS) $(krbhst_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(derived_key_test_OBJECTS) $(derived_key_test_LDADD) $(LIBS) + +krbhst-test$(EXEEXT): $(krbhst_test_OBJECTS) $(krbhst_test_DEPENDENCIES) $(EXTRA_krbhst_test_DEPENDENCIES) @rm -f krbhst-test$(EXEEXT) - $(LINK) $(krbhst_test_OBJECTS) $(krbhst_test_LDADD) $(LIBS) -n-fold-test$(EXEEXT): $(n_fold_test_OBJECTS) $(n_fold_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(krbhst_test_OBJECTS) $(krbhst_test_LDADD) $(LIBS) + +n-fold-test$(EXEEXT): $(n_fold_test_OBJECTS) $(n_fold_test_DEPENDENCIES) $(EXTRA_n_fold_test_DEPENDENCIES) @rm -f n-fold-test$(EXEEXT) - $(LINK) $(n_fold_test_OBJECTS) $(n_fold_test_LDADD) $(LIBS) -parse-name-test$(EXEEXT): $(parse_name_test_OBJECTS) $(parse_name_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(n_fold_test_OBJECTS) $(n_fold_test_LDADD) $(LIBS) + +parse-name-test$(EXEEXT): $(parse_name_test_OBJECTS) $(parse_name_test_DEPENDENCIES) $(EXTRA_parse_name_test_DEPENDENCIES) @rm -f parse-name-test$(EXEEXT) - $(LINK) $(parse_name_test_OBJECTS) $(parse_name_test_LDADD) $(LIBS) -store-test$(EXEEXT): $(store_test_OBJECTS) $(store_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(parse_name_test_OBJECTS) $(parse_name_test_LDADD) $(LIBS) + +pseudo-random-test$(EXEEXT): $(pseudo_random_test_OBJECTS) $(pseudo_random_test_DEPENDENCIES) $(EXTRA_pseudo_random_test_DEPENDENCIES) + @rm -f pseudo-random-test$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(pseudo_random_test_OBJECTS) $(pseudo_random_test_LDADD) $(LIBS) + +store-test$(EXEEXT): $(store_test_OBJECTS) $(store_test_DEPENDENCIES) $(EXTRA_store_test_DEPENDENCIES) @rm -f store-test$(EXEEXT) - $(LINK) $(store_test_OBJECTS) $(store_test_LDADD) $(LIBS) -string-to-key-test$(EXEEXT): $(string_to_key_test_OBJECTS) $(string_to_key_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(store_test_OBJECTS) $(store_test_LDADD) $(LIBS) + +string-to-key-test$(EXEEXT): $(string_to_key_test_OBJECTS) $(string_to_key_test_DEPENDENCIES) $(EXTRA_string_to_key_test_DEPENDENCIES) @rm -f string-to-key-test$(EXEEXT) - $(LINK) $(string_to_key_test_OBJECTS) $(string_to_key_test_LDADD) $(LIBS) -test_acl$(EXEEXT): $(test_acl_OBJECTS) $(test_acl_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(string_to_key_test_OBJECTS) $(string_to_key_test_LDADD) $(LIBS) + +test_acl$(EXEEXT): $(test_acl_OBJECTS) $(test_acl_DEPENDENCIES) $(EXTRA_test_acl_DEPENDENCIES) @rm -f test_acl$(EXEEXT) - $(LINK) $(test_acl_OBJECTS) $(test_acl_LDADD) $(LIBS) -test_addr$(EXEEXT): $(test_addr_OBJECTS) $(test_addr_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_acl_OBJECTS) $(test_acl_LDADD) $(LIBS) + +test_addr$(EXEEXT): $(test_addr_OBJECTS) $(test_addr_DEPENDENCIES) $(EXTRA_test_addr_DEPENDENCIES) @rm -f test_addr$(EXEEXT) - $(LINK) $(test_addr_OBJECTS) $(test_addr_LDADD) $(LIBS) -test_alname$(EXEEXT): $(test_alname_OBJECTS) $(test_alname_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_addr_OBJECTS) $(test_addr_LDADD) $(LIBS) + +test_alname$(EXEEXT): $(test_alname_OBJECTS) $(test_alname_DEPENDENCIES) $(EXTRA_test_alname_DEPENDENCIES) @rm -f test_alname$(EXEEXT) - $(LINK) $(test_alname_OBJECTS) $(test_alname_LDADD) $(LIBS) -test_ap-req$(EXEEXT): $(test_ap_req_OBJECTS) $(test_ap_req_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_alname_OBJECTS) $(test_alname_LDADD) $(LIBS) + +test_ap-req$(EXEEXT): $(test_ap_req_OBJECTS) $(test_ap_req_DEPENDENCIES) $(EXTRA_test_ap_req_DEPENDENCIES) @rm -f test_ap-req$(EXEEXT) - $(LINK) $(test_ap_req_OBJECTS) $(test_ap_req_LDADD) $(LIBS) -test_cc$(EXEEXT): $(test_cc_OBJECTS) $(test_cc_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_ap_req_OBJECTS) $(test_ap_req_LDADD) $(LIBS) + +test_canon$(EXEEXT): $(test_canon_OBJECTS) $(test_canon_DEPENDENCIES) $(EXTRA_test_canon_DEPENDENCIES) + @rm -f test_canon$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_canon_OBJECTS) $(test_canon_LDADD) $(LIBS) + +test_cc$(EXEEXT): $(test_cc_OBJECTS) $(test_cc_DEPENDENCIES) $(EXTRA_test_cc_DEPENDENCIES) @rm -f test_cc$(EXEEXT) - $(LINK) $(test_cc_OBJECTS) $(test_cc_LDADD) $(LIBS) -test_config$(EXEEXT): $(test_config_OBJECTS) $(test_config_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_cc_OBJECTS) $(test_cc_LDADD) $(LIBS) + +test_config$(EXEEXT): $(test_config_OBJECTS) $(test_config_DEPENDENCIES) $(EXTRA_test_config_DEPENDENCIES) @rm -f test_config$(EXEEXT) - $(LINK) $(test_config_OBJECTS) $(test_config_LDADD) $(LIBS) -test_crypto$(EXEEXT): $(test_crypto_OBJECTS) $(test_crypto_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_config_OBJECTS) $(test_config_LDADD) $(LIBS) + +test_crypto$(EXEEXT): $(test_crypto_OBJECTS) $(test_crypto_DEPENDENCIES) $(EXTRA_test_crypto_DEPENDENCIES) @rm -f test_crypto$(EXEEXT) - $(LINK) $(test_crypto_OBJECTS) $(test_crypto_LDADD) $(LIBS) -test_crypto_wrapping$(EXEEXT): $(test_crypto_wrapping_OBJECTS) $(test_crypto_wrapping_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_crypto_OBJECTS) $(test_crypto_LDADD) $(LIBS) + +test_crypto_wrapping$(EXEEXT): $(test_crypto_wrapping_OBJECTS) $(test_crypto_wrapping_DEPENDENCIES) $(EXTRA_test_crypto_wrapping_DEPENDENCIES) @rm -f test_crypto_wrapping$(EXEEXT) - $(LINK) $(test_crypto_wrapping_OBJECTS) $(test_crypto_wrapping_LDADD) $(LIBS) -test_forward$(EXEEXT): $(test_forward_OBJECTS) $(test_forward_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_crypto_wrapping_OBJECTS) $(test_crypto_wrapping_LDADD) $(LIBS) + +test_expand_toks$(EXEEXT): $(test_expand_toks_OBJECTS) $(test_expand_toks_DEPENDENCIES) $(EXTRA_test_expand_toks_DEPENDENCIES) + @rm -f test_expand_toks$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_expand_toks_OBJECTS) $(test_expand_toks_LDADD) $(LIBS) + +test_forward$(EXEEXT): $(test_forward_OBJECTS) $(test_forward_DEPENDENCIES) $(EXTRA_test_forward_DEPENDENCIES) @rm -f test_forward$(EXEEXT) - $(LINK) $(test_forward_OBJECTS) $(test_forward_LDADD) $(LIBS) -test_fx$(EXEEXT): $(test_fx_OBJECTS) $(test_fx_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_forward_OBJECTS) $(test_forward_LDADD) $(LIBS) + +test_fx$(EXEEXT): $(test_fx_OBJECTS) $(test_fx_DEPENDENCIES) $(EXTRA_test_fx_DEPENDENCIES) @rm -f test_fx$(EXEEXT) - $(LINK) $(test_fx_OBJECTS) $(test_fx_LDADD) $(LIBS) -test_get_addrs$(EXEEXT): $(test_get_addrs_OBJECTS) $(test_get_addrs_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_fx_OBJECTS) $(test_fx_LDADD) $(LIBS) + +test_get_addrs$(EXEEXT): $(test_get_addrs_OBJECTS) $(test_get_addrs_DEPENDENCIES) $(EXTRA_test_get_addrs_DEPENDENCIES) @rm -f test_get_addrs$(EXEEXT) - $(LINK) $(test_get_addrs_OBJECTS) $(test_get_addrs_LDADD) $(LIBS) -test_gic$(EXEEXT): $(test_gic_OBJECTS) $(test_gic_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_get_addrs_OBJECTS) $(test_get_addrs_LDADD) $(LIBS) + +test_gic$(EXEEXT): $(test_gic_OBJECTS) $(test_gic_DEPENDENCIES) $(EXTRA_test_gic_DEPENDENCIES) @rm -f test_gic$(EXEEXT) - $(LINK) $(test_gic_OBJECTS) $(test_gic_LDADD) $(LIBS) -test_hostname$(EXEEXT): $(test_hostname_OBJECTS) $(test_hostname_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_gic_OBJECTS) $(test_gic_LDADD) $(LIBS) + +test_hostname$(EXEEXT): $(test_hostname_OBJECTS) $(test_hostname_DEPENDENCIES) $(EXTRA_test_hostname_DEPENDENCIES) @rm -f test_hostname$(EXEEXT) - $(LINK) $(test_hostname_OBJECTS) $(test_hostname_LDADD) $(LIBS) -test_keytab$(EXEEXT): $(test_keytab_OBJECTS) $(test_keytab_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_hostname_OBJECTS) $(test_hostname_LDADD) $(LIBS) + +test_keytab$(EXEEXT): $(test_keytab_OBJECTS) $(test_keytab_DEPENDENCIES) $(EXTRA_test_keytab_DEPENDENCIES) @rm -f test_keytab$(EXEEXT) - $(LINK) $(test_keytab_OBJECTS) $(test_keytab_LDADD) $(LIBS) -test_kuserok$(EXEEXT): $(test_kuserok_OBJECTS) $(test_kuserok_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_keytab_OBJECTS) $(test_keytab_LDADD) $(LIBS) + +test_kuserok$(EXEEXT): $(test_kuserok_OBJECTS) $(test_kuserok_DEPENDENCIES) $(EXTRA_test_kuserok_DEPENDENCIES) @rm -f test_kuserok$(EXEEXT) - $(LINK) $(test_kuserok_OBJECTS) $(test_kuserok_LDADD) $(LIBS) -test_mem$(EXEEXT): $(test_mem_OBJECTS) $(test_mem_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_kuserok_OBJECTS) $(test_kuserok_LDADD) $(LIBS) + +test_mem$(EXEEXT): $(test_mem_OBJECTS) $(test_mem_DEPENDENCIES) $(EXTRA_test_mem_DEPENDENCIES) @rm -f test_mem$(EXEEXT) - $(LINK) $(test_mem_OBJECTS) $(test_mem_LDADD) $(LIBS) -test_pac$(EXEEXT): $(test_pac_OBJECTS) $(test_pac_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_mem_OBJECTS) $(test_mem_LDADD) $(LIBS) + +test_pac$(EXEEXT): $(test_pac_OBJECTS) $(test_pac_DEPENDENCIES) $(EXTRA_test_pac_DEPENDENCIES) @rm -f test_pac$(EXEEXT) - $(LINK) $(test_pac_OBJECTS) $(test_pac_LDADD) $(LIBS) -test_pkinit_dh2key$(EXEEXT): $(test_pkinit_dh2key_OBJECTS) $(test_pkinit_dh2key_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_pac_OBJECTS) $(test_pac_LDADD) $(LIBS) + +test_pkinit_dh2key$(EXEEXT): $(test_pkinit_dh2key_OBJECTS) $(test_pkinit_dh2key_DEPENDENCIES) $(EXTRA_test_pkinit_dh2key_DEPENDENCIES) @rm -f test_pkinit_dh2key$(EXEEXT) - $(LINK) $(test_pkinit_dh2key_OBJECTS) $(test_pkinit_dh2key_LDADD) $(LIBS) -test_pknistkdf$(EXEEXT): $(test_pknistkdf_OBJECTS) $(test_pknistkdf_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_pkinit_dh2key_OBJECTS) $(test_pkinit_dh2key_LDADD) $(LIBS) + +test_pknistkdf$(EXEEXT): $(test_pknistkdf_OBJECTS) $(test_pknistkdf_DEPENDENCIES) $(EXTRA_test_pknistkdf_DEPENDENCIES) @rm -f test_pknistkdf$(EXEEXT) - $(LINK) $(test_pknistkdf_OBJECTS) $(test_pknistkdf_LDADD) $(LIBS) -test_plugin$(EXEEXT): $(test_plugin_OBJECTS) $(test_plugin_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_pknistkdf_OBJECTS) $(test_pknistkdf_LDADD) $(LIBS) + +test_plugin$(EXEEXT): $(test_plugin_OBJECTS) $(test_plugin_DEPENDENCIES) $(EXTRA_test_plugin_DEPENDENCIES) @rm -f test_plugin$(EXEEXT) - $(LINK) $(test_plugin_OBJECTS) $(test_plugin_LDADD) $(LIBS) -test_prf$(EXEEXT): $(test_prf_OBJECTS) $(test_prf_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_plugin_OBJECTS) $(test_plugin_LDADD) $(LIBS) + +test_prf$(EXEEXT): $(test_prf_OBJECTS) $(test_prf_DEPENDENCIES) $(EXTRA_test_prf_DEPENDENCIES) @rm -f test_prf$(EXEEXT) - $(LINK) $(test_prf_OBJECTS) $(test_prf_LDADD) $(LIBS) -test_princ$(EXEEXT): $(test_princ_OBJECTS) $(test_princ_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_prf_OBJECTS) $(test_prf_LDADD) $(LIBS) + +test_princ$(EXEEXT): $(test_princ_OBJECTS) $(test_princ_DEPENDENCIES) $(EXTRA_test_princ_DEPENDENCIES) @rm -f test_princ$(EXEEXT) - $(LINK) $(test_princ_OBJECTS) $(test_princ_LDADD) $(LIBS) -test_renew$(EXEEXT): $(test_renew_OBJECTS) $(test_renew_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_princ_OBJECTS) $(test_princ_LDADD) $(LIBS) + +test_renew$(EXEEXT): $(test_renew_OBJECTS) $(test_renew_DEPENDENCIES) $(EXTRA_test_renew_DEPENDENCIES) @rm -f test_renew$(EXEEXT) - $(LINK) $(test_renew_OBJECTS) $(test_renew_LDADD) $(LIBS) -test_rfc3961$(EXEEXT): $(test_rfc3961_OBJECTS) $(test_rfc3961_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_renew_OBJECTS) $(test_renew_LDADD) $(LIBS) + +test_rfc3961$(EXEEXT): $(test_rfc3961_OBJECTS) $(test_rfc3961_DEPENDENCIES) $(EXTRA_test_rfc3961_DEPENDENCIES) @rm -f test_rfc3961$(EXEEXT) - $(LINK) $(test_rfc3961_OBJECTS) $(test_rfc3961_LDADD) $(LIBS) -test_store$(EXEEXT): $(test_store_OBJECTS) $(test_store_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_rfc3961_OBJECTS) $(test_rfc3961_LDADD) $(LIBS) + +test_set_kvno0$(EXEEXT): $(test_set_kvno0_OBJECTS) $(test_set_kvno0_DEPENDENCIES) $(EXTRA_test_set_kvno0_DEPENDENCIES) + @rm -f test_set_kvno0$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_set_kvno0_OBJECTS) $(test_set_kvno0_LDADD) $(LIBS) + +test_store$(EXEEXT): $(test_store_OBJECTS) $(test_store_DEPENDENCIES) $(EXTRA_test_store_DEPENDENCIES) @rm -f test_store$(EXEEXT) - $(LINK) $(test_store_OBJECTS) $(test_store_LDADD) $(LIBS) -test_time$(EXEEXT): $(test_time_OBJECTS) $(test_time_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_store_OBJECTS) $(test_store_LDADD) $(LIBS) + +test_time$(EXEEXT): $(test_time_OBJECTS) $(test_time_DEPENDENCIES) $(EXTRA_test_time_DEPENDENCIES) @rm -f test_time$(EXEEXT) - $(LINK) $(test_time_OBJECTS) $(test_time_LDADD) $(LIBS) -test_x500$(EXEEXT): $(test_x500_OBJECTS) $(test_x500_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_time_OBJECTS) $(test_time_LDADD) $(LIBS) + +test_x500$(EXEEXT): $(test_x500_OBJECTS) $(test_x500_DEPENDENCIES) $(EXTRA_test_x500_DEPENDENCIES) @rm -f test_x500$(EXEEXT) - $(LINK) $(test_x500_OBJECTS) $(test_x500_LDADD) $(LIBS) -verify_krb5_conf$(EXEEXT): $(verify_krb5_conf_OBJECTS) $(verify_krb5_conf_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_x500_OBJECTS) $(test_x500_LDADD) $(LIBS) + +verify_krb5_conf$(EXEEXT): $(verify_krb5_conf_OBJECTS) $(verify_krb5_conf_DEPENDENCIES) $(EXTRA_verify_krb5_conf_DEPENDENCIES) @rm -f verify_krb5_conf$(EXEEXT) - $(LINK) $(verify_krb5_conf_OBJECTS) $(verify_krb5_conf_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(verify_krb5_conf_OBJECTS) $(verify_krb5_conf_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -1290,1214 +1943,1328 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aes-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/derived-key-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krbhst-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-acache.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-acl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-add_et_list.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-addr_families.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-aname_to_localname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-appdefault.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-asn1_glue.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-auth_context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-build_ap_req.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-build_auth.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-cache.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-changepw.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-codec.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-config_file.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-constants.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-context.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-convert_creds.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-copy_host_realm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-creds.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-aes.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-algs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-arcfour.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-des-common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-des.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-des3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-evp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-null.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-pk.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-rand.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-data.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-deprecated.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-digest.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-doxygen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-eai_to_heim_errno.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-error_string.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-expand_hostname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-expand_path.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-fcache.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-free.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-free_host_realm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-generate_seq_number.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-generate_subkey.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_addrs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_default_principal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_default_realm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_for_creds.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_host_realm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_in_tkt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_port.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-heim_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-init_creds.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-init_creds_pw.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-k524_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-kcm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keyblock.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_any.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_file.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_keyfile.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_memory.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-krb5_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-krb_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-krbhst.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-kuserok.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-log.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mcache.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-misc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mit_glue.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_error.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_priv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_rep.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_req.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_req_ext.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_safe.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-n-fold.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-net_read.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-net_write.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-pac.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-padata.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-pcache.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-pkinit.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-plugin.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-principal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-prog_setup.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-prompter_posix.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_cred.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_error.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_priv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_rep.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_req.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_safe.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-read_message.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-recvauth.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-replay.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-aes.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-arcfour.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-des.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-des3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-scache.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-send_to_kdc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-sendauth.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-set_default_realm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-sock_principal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store-int.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store_emem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store_fd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store_mem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-ticket.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-transited.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-verify_init.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-verify_user.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-version.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-warn.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-write_message.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-aes.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-algs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-arcfour.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-des-common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-des.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-des3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-evp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-null.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-pk.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-rand.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-stubs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-data.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-error_string.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-keyblock.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-n-fold.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-aes.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-arcfour.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-des.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-des3.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-store-int.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-warn.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n-fold-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-name-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/store-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string-to-key-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acl.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_addr.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_alname.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ap-req.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cc.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_config.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_crypto.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_crypto_wrapping.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_forward.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fx.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_get_addrs.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gic.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hostname.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_keytab.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_kuserok.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mem.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pac.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pkinit_dh2key.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pknistkdf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_plugin.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_prf.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_princ.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_renew.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rfc3961.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_store.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_time.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_x500.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify_krb5_conf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/aes-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/derived-key-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/krbhst-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-acache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-acl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-add_et_list.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-addr_families.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-aname_to_localname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-appdefault.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-asn1_glue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-auth_context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-build_ap_req.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-build_auth.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-cache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-changepw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-codec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-config_file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-constants.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-context.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-convert_creds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-copy_host_realm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-creds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-aes-sha1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-aes-sha2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-algs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-arcfour.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-des-common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-des.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-des3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-evp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-null.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-pk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto-rand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-crypto.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-data.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-db_plugin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-dcache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-deprecated.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-digest.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-doxygen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-eai_to_heim_errno.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-enomem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-error_string.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-expand_hostname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-expand_path.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-fast.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-fcache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-free.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-free_host_realm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-generate_seq_number.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-generate_subkey.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_addrs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_default_principal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_default_realm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_for_creds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_host_realm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_in_tkt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-get_port.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-heim_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-init_creds.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-init_creds_pw.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-k524_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-kcm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keyblock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_any.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_file.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_keyfile.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-keytab_memory.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-krb5_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-krb_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-krbhst.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-kuserok.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-log.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mcache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-misc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mit_glue.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_priv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_rep.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_req.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_req_ext.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-mk_safe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-n-fold.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-net_read.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-net_write.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-pac.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-padata.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-pcache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-pkinit-ec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-pkinit.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-plugin.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-principal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-prog_setup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-prompter_posix.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_cred.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_error.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_priv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_rep.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_req.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-rd_safe.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-read_message.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-recvauth.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-replay.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-aes-sha1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-aes-sha2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-arcfour.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-des.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt-des3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-salt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-scache.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-send_to_kdc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-sendauth.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-set_default_realm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-sock_principal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-sp800-108-kdf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store-int.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store_emem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store_fd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store_mem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-store_sock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-ticket.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-time.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-transited.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-verify_init.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-verify_user.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-version.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-warn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libkrb5_la-write_message.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-aes-sha1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-aes-sha2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-algs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-arcfour.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-des-common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-des.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-des3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-evp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-null.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-pk.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-rand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto-stubs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-crypto.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-data.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-enomem.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-error_string.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-keyblock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-n-fold.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-aes-sha1.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-aes-sha2.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-arcfour.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-des.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt-des3.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-salt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-sp800-108-kdf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-store-int.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/librfc3961_la-warn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/n-fold-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-name-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pseudo-random-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/store-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/string-to-key-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_acl.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_addr.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_alname.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ap-req.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_canon.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cc.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_config.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_crypto.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_crypto_wrapping.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_expand_toks.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_forward.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_fx.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_get_addrs.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_gic.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_hostname.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_keytab.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_kuserok.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_mem.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pac.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pkinit_dh2key.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_pknistkdf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_plugin.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_prf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_princ.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_renew.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_rfc3961.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_set_kvno0.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_store.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_time.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_x500.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/verify_krb5_conf.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libkrb5_la-acache.lo: acache.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-acache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-acache.Tpo -c -o libkrb5_la-acache.lo `test -f 'acache.c' || echo '$(srcdir)/'`acache.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-acache.Tpo $(DEPDIR)/libkrb5_la-acache.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='acache.c' object='libkrb5_la-acache.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-acache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-acache.Tpo -c -o libkrb5_la-acache.lo `test -f 'acache.c' || echo '$(srcdir)/'`acache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-acache.Tpo $(DEPDIR)/libkrb5_la-acache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='acache.c' object='libkrb5_la-acache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-acache.lo `test -f 'acache.c' || echo '$(srcdir)/'`acache.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-acache.lo `test -f 'acache.c' || echo '$(srcdir)/'`acache.c libkrb5_la-acl.lo: acl.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-acl.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-acl.Tpo -c -o libkrb5_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-acl.Tpo $(DEPDIR)/libkrb5_la-acl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='acl.c' object='libkrb5_la-acl.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-acl.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-acl.Tpo -c -o libkrb5_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-acl.Tpo $(DEPDIR)/libkrb5_la-acl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='acl.c' object='libkrb5_la-acl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c libkrb5_la-add_et_list.lo: add_et_list.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-add_et_list.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-add_et_list.Tpo -c -o libkrb5_la-add_et_list.lo `test -f 'add_et_list.c' || echo '$(srcdir)/'`add_et_list.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-add_et_list.Tpo $(DEPDIR)/libkrb5_la-add_et_list.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='add_et_list.c' object='libkrb5_la-add_et_list.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-add_et_list.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-add_et_list.Tpo -c -o libkrb5_la-add_et_list.lo `test -f 'add_et_list.c' || echo '$(srcdir)/'`add_et_list.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-add_et_list.Tpo $(DEPDIR)/libkrb5_la-add_et_list.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='add_et_list.c' object='libkrb5_la-add_et_list.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-add_et_list.lo `test -f 'add_et_list.c' || echo '$(srcdir)/'`add_et_list.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-add_et_list.lo `test -f 'add_et_list.c' || echo '$(srcdir)/'`add_et_list.c libkrb5_la-addr_families.lo: addr_families.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-addr_families.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-addr_families.Tpo -c -o libkrb5_la-addr_families.lo `test -f 'addr_families.c' || echo '$(srcdir)/'`addr_families.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-addr_families.Tpo $(DEPDIR)/libkrb5_la-addr_families.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='addr_families.c' object='libkrb5_la-addr_families.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-addr_families.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-addr_families.Tpo -c -o libkrb5_la-addr_families.lo `test -f 'addr_families.c' || echo '$(srcdir)/'`addr_families.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-addr_families.Tpo $(DEPDIR)/libkrb5_la-addr_families.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='addr_families.c' object='libkrb5_la-addr_families.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-addr_families.lo `test -f 'addr_families.c' || echo '$(srcdir)/'`addr_families.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-addr_families.lo `test -f 'addr_families.c' || echo '$(srcdir)/'`addr_families.c libkrb5_la-aname_to_localname.lo: aname_to_localname.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-aname_to_localname.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-aname_to_localname.Tpo -c -o libkrb5_la-aname_to_localname.lo `test -f 'aname_to_localname.c' || echo '$(srcdir)/'`aname_to_localname.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-aname_to_localname.Tpo $(DEPDIR)/libkrb5_la-aname_to_localname.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='aname_to_localname.c' object='libkrb5_la-aname_to_localname.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-aname_to_localname.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-aname_to_localname.Tpo -c -o libkrb5_la-aname_to_localname.lo `test -f 'aname_to_localname.c' || echo '$(srcdir)/'`aname_to_localname.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-aname_to_localname.Tpo $(DEPDIR)/libkrb5_la-aname_to_localname.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='aname_to_localname.c' object='libkrb5_la-aname_to_localname.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-aname_to_localname.lo `test -f 'aname_to_localname.c' || echo '$(srcdir)/'`aname_to_localname.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-aname_to_localname.lo `test -f 'aname_to_localname.c' || echo '$(srcdir)/'`aname_to_localname.c libkrb5_la-appdefault.lo: appdefault.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-appdefault.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-appdefault.Tpo -c -o libkrb5_la-appdefault.lo `test -f 'appdefault.c' || echo '$(srcdir)/'`appdefault.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-appdefault.Tpo $(DEPDIR)/libkrb5_la-appdefault.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='appdefault.c' object='libkrb5_la-appdefault.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-appdefault.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-appdefault.Tpo -c -o libkrb5_la-appdefault.lo `test -f 'appdefault.c' || echo '$(srcdir)/'`appdefault.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-appdefault.Tpo $(DEPDIR)/libkrb5_la-appdefault.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='appdefault.c' object='libkrb5_la-appdefault.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-appdefault.lo `test -f 'appdefault.c' || echo '$(srcdir)/'`appdefault.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-appdefault.lo `test -f 'appdefault.c' || echo '$(srcdir)/'`appdefault.c libkrb5_la-asn1_glue.lo: asn1_glue.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-asn1_glue.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-asn1_glue.Tpo -c -o libkrb5_la-asn1_glue.lo `test -f 'asn1_glue.c' || echo '$(srcdir)/'`asn1_glue.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-asn1_glue.Tpo $(DEPDIR)/libkrb5_la-asn1_glue.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='asn1_glue.c' object='libkrb5_la-asn1_glue.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-asn1_glue.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-asn1_glue.Tpo -c -o libkrb5_la-asn1_glue.lo `test -f 'asn1_glue.c' || echo '$(srcdir)/'`asn1_glue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-asn1_glue.Tpo $(DEPDIR)/libkrb5_la-asn1_glue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='asn1_glue.c' object='libkrb5_la-asn1_glue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-asn1_glue.lo `test -f 'asn1_glue.c' || echo '$(srcdir)/'`asn1_glue.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-asn1_glue.lo `test -f 'asn1_glue.c' || echo '$(srcdir)/'`asn1_glue.c libkrb5_la-auth_context.lo: auth_context.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-auth_context.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-auth_context.Tpo -c -o libkrb5_la-auth_context.lo `test -f 'auth_context.c' || echo '$(srcdir)/'`auth_context.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-auth_context.Tpo $(DEPDIR)/libkrb5_la-auth_context.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='auth_context.c' object='libkrb5_la-auth_context.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-auth_context.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-auth_context.Tpo -c -o libkrb5_la-auth_context.lo `test -f 'auth_context.c' || echo '$(srcdir)/'`auth_context.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-auth_context.Tpo $(DEPDIR)/libkrb5_la-auth_context.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='auth_context.c' object='libkrb5_la-auth_context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-auth_context.lo `test -f 'auth_context.c' || echo '$(srcdir)/'`auth_context.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-auth_context.lo `test -f 'auth_context.c' || echo '$(srcdir)/'`auth_context.c libkrb5_la-build_ap_req.lo: build_ap_req.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-build_ap_req.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-build_ap_req.Tpo -c -o libkrb5_la-build_ap_req.lo `test -f 'build_ap_req.c' || echo '$(srcdir)/'`build_ap_req.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-build_ap_req.Tpo $(DEPDIR)/libkrb5_la-build_ap_req.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='build_ap_req.c' object='libkrb5_la-build_ap_req.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-build_ap_req.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-build_ap_req.Tpo -c -o libkrb5_la-build_ap_req.lo `test -f 'build_ap_req.c' || echo '$(srcdir)/'`build_ap_req.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-build_ap_req.Tpo $(DEPDIR)/libkrb5_la-build_ap_req.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='build_ap_req.c' object='libkrb5_la-build_ap_req.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-build_ap_req.lo `test -f 'build_ap_req.c' || echo '$(srcdir)/'`build_ap_req.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-build_ap_req.lo `test -f 'build_ap_req.c' || echo '$(srcdir)/'`build_ap_req.c libkrb5_la-build_auth.lo: build_auth.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-build_auth.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-build_auth.Tpo -c -o libkrb5_la-build_auth.lo `test -f 'build_auth.c' || echo '$(srcdir)/'`build_auth.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-build_auth.Tpo $(DEPDIR)/libkrb5_la-build_auth.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='build_auth.c' object='libkrb5_la-build_auth.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-build_auth.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-build_auth.Tpo -c -o libkrb5_la-build_auth.lo `test -f 'build_auth.c' || echo '$(srcdir)/'`build_auth.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-build_auth.Tpo $(DEPDIR)/libkrb5_la-build_auth.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='build_auth.c' object='libkrb5_la-build_auth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-build_auth.lo `test -f 'build_auth.c' || echo '$(srcdir)/'`build_auth.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-build_auth.lo `test -f 'build_auth.c' || echo '$(srcdir)/'`build_auth.c libkrb5_la-cache.lo: cache.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-cache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-cache.Tpo -c -o libkrb5_la-cache.lo `test -f 'cache.c' || echo '$(srcdir)/'`cache.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-cache.Tpo $(DEPDIR)/libkrb5_la-cache.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cache.c' object='libkrb5_la-cache.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-cache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-cache.Tpo -c -o libkrb5_la-cache.lo `test -f 'cache.c' || echo '$(srcdir)/'`cache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-cache.Tpo $(DEPDIR)/libkrb5_la-cache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cache.c' object='libkrb5_la-cache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-cache.lo `test -f 'cache.c' || echo '$(srcdir)/'`cache.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-cache.lo `test -f 'cache.c' || echo '$(srcdir)/'`cache.c libkrb5_la-changepw.lo: changepw.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-changepw.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-changepw.Tpo -c -o libkrb5_la-changepw.lo `test -f 'changepw.c' || echo '$(srcdir)/'`changepw.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-changepw.Tpo $(DEPDIR)/libkrb5_la-changepw.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='changepw.c' object='libkrb5_la-changepw.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-changepw.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-changepw.Tpo -c -o libkrb5_la-changepw.lo `test -f 'changepw.c' || echo '$(srcdir)/'`changepw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-changepw.Tpo $(DEPDIR)/libkrb5_la-changepw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='changepw.c' object='libkrb5_la-changepw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-changepw.lo `test -f 'changepw.c' || echo '$(srcdir)/'`changepw.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-changepw.lo `test -f 'changepw.c' || echo '$(srcdir)/'`changepw.c libkrb5_la-codec.lo: codec.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-codec.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-codec.Tpo -c -o libkrb5_la-codec.lo `test -f 'codec.c' || echo '$(srcdir)/'`codec.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-codec.Tpo $(DEPDIR)/libkrb5_la-codec.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='codec.c' object='libkrb5_la-codec.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-codec.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-codec.Tpo -c -o libkrb5_la-codec.lo `test -f 'codec.c' || echo '$(srcdir)/'`codec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-codec.Tpo $(DEPDIR)/libkrb5_la-codec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='codec.c' object='libkrb5_la-codec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-codec.lo `test -f 'codec.c' || echo '$(srcdir)/'`codec.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-codec.lo `test -f 'codec.c' || echo '$(srcdir)/'`codec.c libkrb5_la-config_file.lo: config_file.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-config_file.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-config_file.Tpo -c -o libkrb5_la-config_file.lo `test -f 'config_file.c' || echo '$(srcdir)/'`config_file.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-config_file.Tpo $(DEPDIR)/libkrb5_la-config_file.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='config_file.c' object='libkrb5_la-config_file.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-config_file.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-config_file.Tpo -c -o libkrb5_la-config_file.lo `test -f 'config_file.c' || echo '$(srcdir)/'`config_file.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-config_file.Tpo $(DEPDIR)/libkrb5_la-config_file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='config_file.c' object='libkrb5_la-config_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-config_file.lo `test -f 'config_file.c' || echo '$(srcdir)/'`config_file.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-config_file.lo `test -f 'config_file.c' || echo '$(srcdir)/'`config_file.c libkrb5_la-convert_creds.lo: convert_creds.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-convert_creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-convert_creds.Tpo -c -o libkrb5_la-convert_creds.lo `test -f 'convert_creds.c' || echo '$(srcdir)/'`convert_creds.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-convert_creds.Tpo $(DEPDIR)/libkrb5_la-convert_creds.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='convert_creds.c' object='libkrb5_la-convert_creds.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-convert_creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-convert_creds.Tpo -c -o libkrb5_la-convert_creds.lo `test -f 'convert_creds.c' || echo '$(srcdir)/'`convert_creds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-convert_creds.Tpo $(DEPDIR)/libkrb5_la-convert_creds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='convert_creds.c' object='libkrb5_la-convert_creds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-convert_creds.lo `test -f 'convert_creds.c' || echo '$(srcdir)/'`convert_creds.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-convert_creds.lo `test -f 'convert_creds.c' || echo '$(srcdir)/'`convert_creds.c libkrb5_la-constants.lo: constants.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-constants.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-constants.Tpo -c -o libkrb5_la-constants.lo `test -f 'constants.c' || echo '$(srcdir)/'`constants.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-constants.Tpo $(DEPDIR)/libkrb5_la-constants.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='constants.c' object='libkrb5_la-constants.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-constants.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-constants.Tpo -c -o libkrb5_la-constants.lo `test -f 'constants.c' || echo '$(srcdir)/'`constants.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-constants.Tpo $(DEPDIR)/libkrb5_la-constants.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='constants.c' object='libkrb5_la-constants.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-constants.lo `test -f 'constants.c' || echo '$(srcdir)/'`constants.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-constants.lo `test -f 'constants.c' || echo '$(srcdir)/'`constants.c libkrb5_la-context.lo: context.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-context.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-context.Tpo -c -o libkrb5_la-context.lo `test -f 'context.c' || echo '$(srcdir)/'`context.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-context.Tpo $(DEPDIR)/libkrb5_la-context.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='context.c' object='libkrb5_la-context.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-context.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-context.Tpo -c -o libkrb5_la-context.lo `test -f 'context.c' || echo '$(srcdir)/'`context.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-context.Tpo $(DEPDIR)/libkrb5_la-context.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='context.c' object='libkrb5_la-context.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-context.lo `test -f 'context.c' || echo '$(srcdir)/'`context.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-context.lo `test -f 'context.c' || echo '$(srcdir)/'`context.c libkrb5_la-copy_host_realm.lo: copy_host_realm.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-copy_host_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-copy_host_realm.Tpo -c -o libkrb5_la-copy_host_realm.lo `test -f 'copy_host_realm.c' || echo '$(srcdir)/'`copy_host_realm.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-copy_host_realm.Tpo $(DEPDIR)/libkrb5_la-copy_host_realm.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='copy_host_realm.c' object='libkrb5_la-copy_host_realm.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-copy_host_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-copy_host_realm.Tpo -c -o libkrb5_la-copy_host_realm.lo `test -f 'copy_host_realm.c' || echo '$(srcdir)/'`copy_host_realm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-copy_host_realm.Tpo $(DEPDIR)/libkrb5_la-copy_host_realm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='copy_host_realm.c' object='libkrb5_la-copy_host_realm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-copy_host_realm.lo `test -f 'copy_host_realm.c' || echo '$(srcdir)/'`copy_host_realm.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-copy_host_realm.lo `test -f 'copy_host_realm.c' || echo '$(srcdir)/'`copy_host_realm.c libkrb5_la-crc.lo: crc.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crc.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crc.Tpo -c -o libkrb5_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crc.Tpo $(DEPDIR)/libkrb5_la-crc.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crc.c' object='libkrb5_la-crc.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crc.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crc.Tpo -c -o libkrb5_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crc.Tpo $(DEPDIR)/libkrb5_la-crc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crc.c' object='libkrb5_la-crc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c libkrb5_la-creds.lo: creds.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-creds.Tpo -c -o libkrb5_la-creds.lo `test -f 'creds.c' || echo '$(srcdir)/'`creds.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-creds.Tpo $(DEPDIR)/libkrb5_la-creds.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='creds.c' object='libkrb5_la-creds.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-creds.Tpo -c -o libkrb5_la-creds.lo `test -f 'creds.c' || echo '$(srcdir)/'`creds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-creds.Tpo $(DEPDIR)/libkrb5_la-creds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='creds.c' object='libkrb5_la-creds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-creds.lo `test -f 'creds.c' || echo '$(srcdir)/'`creds.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-creds.lo `test -f 'creds.c' || echo '$(srcdir)/'`creds.c libkrb5_la-crypto.lo: crypto.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto.Tpo -c -o libkrb5_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto.Tpo $(DEPDIR)/libkrb5_la-crypto.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto.c' object='libkrb5_la-crypto.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto.Tpo -c -o libkrb5_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto.Tpo $(DEPDIR)/libkrb5_la-crypto.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto.c' object='libkrb5_la-crypto.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c + +libkrb5_la-crypto-aes-sha1.lo: crypto-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-aes-sha1.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-aes-sha1.Tpo -c -o libkrb5_la-crypto-aes-sha1.lo `test -f 'crypto-aes-sha1.c' || echo '$(srcdir)/'`crypto-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-aes-sha1.Tpo $(DEPDIR)/libkrb5_la-crypto-aes-sha1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-aes-sha1.c' object='libkrb5_la-crypto-aes-sha1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-aes-sha1.lo `test -f 'crypto-aes-sha1.c' || echo '$(srcdir)/'`crypto-aes-sha1.c -libkrb5_la-crypto-aes.lo: crypto-aes.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-aes.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-aes.Tpo -c -o libkrb5_la-crypto-aes.lo `test -f 'crypto-aes.c' || echo '$(srcdir)/'`crypto-aes.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-aes.Tpo $(DEPDIR)/libkrb5_la-crypto-aes.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-aes.c' object='libkrb5_la-crypto-aes.lo' libtool=yes @AMDEPBACKSLASH@ +libkrb5_la-crypto-aes-sha2.lo: crypto-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-aes-sha2.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-aes-sha2.Tpo -c -o libkrb5_la-crypto-aes-sha2.lo `test -f 'crypto-aes-sha2.c' || echo '$(srcdir)/'`crypto-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-aes-sha2.Tpo $(DEPDIR)/libkrb5_la-crypto-aes-sha2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-aes-sha2.c' object='libkrb5_la-crypto-aes-sha2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-aes.lo `test -f 'crypto-aes.c' || echo '$(srcdir)/'`crypto-aes.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-aes-sha2.lo `test -f 'crypto-aes-sha2.c' || echo '$(srcdir)/'`crypto-aes-sha2.c libkrb5_la-crypto-algs.lo: crypto-algs.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-algs.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-algs.Tpo -c -o libkrb5_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-algs.Tpo $(DEPDIR)/libkrb5_la-crypto-algs.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-algs.c' object='libkrb5_la-crypto-algs.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-algs.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-algs.Tpo -c -o libkrb5_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-algs.Tpo $(DEPDIR)/libkrb5_la-crypto-algs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-algs.c' object='libkrb5_la-crypto-algs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c libkrb5_la-crypto-arcfour.lo: crypto-arcfour.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-arcfour.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-arcfour.Tpo -c -o libkrb5_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-arcfour.Tpo $(DEPDIR)/libkrb5_la-crypto-arcfour.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-arcfour.c' object='libkrb5_la-crypto-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-arcfour.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-arcfour.Tpo -c -o libkrb5_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-arcfour.Tpo $(DEPDIR)/libkrb5_la-crypto-arcfour.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-arcfour.c' object='libkrb5_la-crypto-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c libkrb5_la-crypto-des.lo: crypto-des.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-des.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-des.Tpo -c -o libkrb5_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-des.Tpo $(DEPDIR)/libkrb5_la-crypto-des.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-des.c' object='libkrb5_la-crypto-des.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-des.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-des.Tpo -c -o libkrb5_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-des.Tpo $(DEPDIR)/libkrb5_la-crypto-des.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-des.c' object='libkrb5_la-crypto-des.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c libkrb5_la-crypto-des-common.lo: crypto-des-common.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-des-common.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-des-common.Tpo -c -o libkrb5_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-des-common.Tpo $(DEPDIR)/libkrb5_la-crypto-des-common.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-des-common.c' object='libkrb5_la-crypto-des-common.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-des-common.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-des-common.Tpo -c -o libkrb5_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-des-common.Tpo $(DEPDIR)/libkrb5_la-crypto-des-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-des-common.c' object='libkrb5_la-crypto-des-common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c libkrb5_la-crypto-des3.lo: crypto-des3.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-des3.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-des3.Tpo -c -o libkrb5_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-des3.Tpo $(DEPDIR)/libkrb5_la-crypto-des3.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-des3.c' object='libkrb5_la-crypto-des3.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-des3.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-des3.Tpo -c -o libkrb5_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-des3.Tpo $(DEPDIR)/libkrb5_la-crypto-des3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-des3.c' object='libkrb5_la-crypto-des3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c libkrb5_la-crypto-evp.lo: crypto-evp.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-evp.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-evp.Tpo -c -o libkrb5_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-evp.Tpo $(DEPDIR)/libkrb5_la-crypto-evp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-evp.c' object='libkrb5_la-crypto-evp.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-evp.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-evp.Tpo -c -o libkrb5_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-evp.Tpo $(DEPDIR)/libkrb5_la-crypto-evp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-evp.c' object='libkrb5_la-crypto-evp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c libkrb5_la-crypto-null.lo: crypto-null.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-null.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-null.Tpo -c -o libkrb5_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-null.Tpo $(DEPDIR)/libkrb5_la-crypto-null.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-null.c' object='libkrb5_la-crypto-null.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-null.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-null.Tpo -c -o libkrb5_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-null.Tpo $(DEPDIR)/libkrb5_la-crypto-null.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-null.c' object='libkrb5_la-crypto-null.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c libkrb5_la-crypto-pk.lo: crypto-pk.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-pk.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-pk.Tpo -c -o libkrb5_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-pk.Tpo $(DEPDIR)/libkrb5_la-crypto-pk.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-pk.c' object='libkrb5_la-crypto-pk.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-pk.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-pk.Tpo -c -o libkrb5_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-pk.Tpo $(DEPDIR)/libkrb5_la-crypto-pk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-pk.c' object='libkrb5_la-crypto-pk.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c libkrb5_la-crypto-rand.lo: crypto-rand.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-rand.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-rand.Tpo -c -o libkrb5_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-crypto-rand.Tpo $(DEPDIR)/libkrb5_la-crypto-rand.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-rand.c' object='libkrb5_la-crypto-rand.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-crypto-rand.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-crypto-rand.Tpo -c -o libkrb5_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-crypto-rand.Tpo $(DEPDIR)/libkrb5_la-crypto-rand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-rand.c' object='libkrb5_la-crypto-rand.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c libkrb5_la-doxygen.lo: doxygen.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-doxygen.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-doxygen.Tpo -c -o libkrb5_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-doxygen.Tpo $(DEPDIR)/libkrb5_la-doxygen.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='doxygen.c' object='libkrb5_la-doxygen.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-doxygen.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-doxygen.Tpo -c -o libkrb5_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-doxygen.Tpo $(DEPDIR)/libkrb5_la-doxygen.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='doxygen.c' object='libkrb5_la-doxygen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c libkrb5_la-data.lo: data.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-data.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-data.Tpo -c -o libkrb5_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-data.Tpo $(DEPDIR)/libkrb5_la-data.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='data.c' object='libkrb5_la-data.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-data.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-data.Tpo -c -o libkrb5_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-data.Tpo $(DEPDIR)/libkrb5_la-data.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='data.c' object='libkrb5_la-data.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c + +libkrb5_la-db_plugin.lo: db_plugin.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-db_plugin.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-db_plugin.Tpo -c -o libkrb5_la-db_plugin.lo `test -f 'db_plugin.c' || echo '$(srcdir)/'`db_plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-db_plugin.Tpo $(DEPDIR)/libkrb5_la-db_plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='db_plugin.c' object='libkrb5_la-db_plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-db_plugin.lo `test -f 'db_plugin.c' || echo '$(srcdir)/'`db_plugin.c + +libkrb5_la-dcache.lo: dcache.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-dcache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-dcache.Tpo -c -o libkrb5_la-dcache.lo `test -f 'dcache.c' || echo '$(srcdir)/'`dcache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-dcache.Tpo $(DEPDIR)/libkrb5_la-dcache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dcache.c' object='libkrb5_la-dcache.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-dcache.lo `test -f 'dcache.c' || echo '$(srcdir)/'`dcache.c libkrb5_la-deprecated.lo: deprecated.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-deprecated.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-deprecated.Tpo -c -o libkrb5_la-deprecated.lo `test -f 'deprecated.c' || echo '$(srcdir)/'`deprecated.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-deprecated.Tpo $(DEPDIR)/libkrb5_la-deprecated.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='deprecated.c' object='libkrb5_la-deprecated.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-deprecated.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-deprecated.Tpo -c -o libkrb5_la-deprecated.lo `test -f 'deprecated.c' || echo '$(srcdir)/'`deprecated.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-deprecated.Tpo $(DEPDIR)/libkrb5_la-deprecated.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='deprecated.c' object='libkrb5_la-deprecated.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-deprecated.lo `test -f 'deprecated.c' || echo '$(srcdir)/'`deprecated.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-deprecated.lo `test -f 'deprecated.c' || echo '$(srcdir)/'`deprecated.c libkrb5_la-digest.lo: digest.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-digest.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-digest.Tpo -c -o libkrb5_la-digest.lo `test -f 'digest.c' || echo '$(srcdir)/'`digest.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-digest.Tpo $(DEPDIR)/libkrb5_la-digest.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='digest.c' object='libkrb5_la-digest.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-digest.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-digest.Tpo -c -o libkrb5_la-digest.lo `test -f 'digest.c' || echo '$(srcdir)/'`digest.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-digest.Tpo $(DEPDIR)/libkrb5_la-digest.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='digest.c' object='libkrb5_la-digest.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-digest.lo `test -f 'digest.c' || echo '$(srcdir)/'`digest.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-digest.lo `test -f 'digest.c' || echo '$(srcdir)/'`digest.c libkrb5_la-eai_to_heim_errno.lo: eai_to_heim_errno.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-eai_to_heim_errno.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-eai_to_heim_errno.Tpo -c -o libkrb5_la-eai_to_heim_errno.lo `test -f 'eai_to_heim_errno.c' || echo '$(srcdir)/'`eai_to_heim_errno.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-eai_to_heim_errno.Tpo $(DEPDIR)/libkrb5_la-eai_to_heim_errno.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='eai_to_heim_errno.c' object='libkrb5_la-eai_to_heim_errno.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-eai_to_heim_errno.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-eai_to_heim_errno.Tpo -c -o libkrb5_la-eai_to_heim_errno.lo `test -f 'eai_to_heim_errno.c' || echo '$(srcdir)/'`eai_to_heim_errno.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-eai_to_heim_errno.Tpo $(DEPDIR)/libkrb5_la-eai_to_heim_errno.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='eai_to_heim_errno.c' object='libkrb5_la-eai_to_heim_errno.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-eai_to_heim_errno.lo `test -f 'eai_to_heim_errno.c' || echo '$(srcdir)/'`eai_to_heim_errno.c + +libkrb5_la-enomem.lo: enomem.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-enomem.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-enomem.Tpo -c -o libkrb5_la-enomem.lo `test -f 'enomem.c' || echo '$(srcdir)/'`enomem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-enomem.Tpo $(DEPDIR)/libkrb5_la-enomem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enomem.c' object='libkrb5_la-enomem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-eai_to_heim_errno.lo `test -f 'eai_to_heim_errno.c' || echo '$(srcdir)/'`eai_to_heim_errno.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-enomem.lo `test -f 'enomem.c' || echo '$(srcdir)/'`enomem.c libkrb5_la-error_string.lo: error_string.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-error_string.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-error_string.Tpo -c -o libkrb5_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-error_string.Tpo $(DEPDIR)/libkrb5_la-error_string.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error_string.c' object='libkrb5_la-error_string.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-error_string.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-error_string.Tpo -c -o libkrb5_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-error_string.Tpo $(DEPDIR)/libkrb5_la-error_string.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error_string.c' object='libkrb5_la-error_string.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c libkrb5_la-expand_hostname.lo: expand_hostname.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-expand_hostname.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-expand_hostname.Tpo -c -o libkrb5_la-expand_hostname.lo `test -f 'expand_hostname.c' || echo '$(srcdir)/'`expand_hostname.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-expand_hostname.Tpo $(DEPDIR)/libkrb5_la-expand_hostname.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='expand_hostname.c' object='libkrb5_la-expand_hostname.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-expand_hostname.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-expand_hostname.Tpo -c -o libkrb5_la-expand_hostname.lo `test -f 'expand_hostname.c' || echo '$(srcdir)/'`expand_hostname.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-expand_hostname.Tpo $(DEPDIR)/libkrb5_la-expand_hostname.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='expand_hostname.c' object='libkrb5_la-expand_hostname.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-expand_hostname.lo `test -f 'expand_hostname.c' || echo '$(srcdir)/'`expand_hostname.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-expand_hostname.lo `test -f 'expand_hostname.c' || echo '$(srcdir)/'`expand_hostname.c libkrb5_la-expand_path.lo: expand_path.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-expand_path.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-expand_path.Tpo -c -o libkrb5_la-expand_path.lo `test -f 'expand_path.c' || echo '$(srcdir)/'`expand_path.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-expand_path.Tpo $(DEPDIR)/libkrb5_la-expand_path.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='expand_path.c' object='libkrb5_la-expand_path.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-expand_path.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-expand_path.Tpo -c -o libkrb5_la-expand_path.lo `test -f 'expand_path.c' || echo '$(srcdir)/'`expand_path.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-expand_path.Tpo $(DEPDIR)/libkrb5_la-expand_path.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='expand_path.c' object='libkrb5_la-expand_path.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-expand_path.lo `test -f 'expand_path.c' || echo '$(srcdir)/'`expand_path.c + +libkrb5_la-fast.lo: fast.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-fast.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-fast.Tpo -c -o libkrb5_la-fast.lo `test -f 'fast.c' || echo '$(srcdir)/'`fast.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-fast.Tpo $(DEPDIR)/libkrb5_la-fast.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fast.c' object='libkrb5_la-fast.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-expand_path.lo `test -f 'expand_path.c' || echo '$(srcdir)/'`expand_path.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-fast.lo `test -f 'fast.c' || echo '$(srcdir)/'`fast.c libkrb5_la-fcache.lo: fcache.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-fcache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-fcache.Tpo -c -o libkrb5_la-fcache.lo `test -f 'fcache.c' || echo '$(srcdir)/'`fcache.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-fcache.Tpo $(DEPDIR)/libkrb5_la-fcache.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='fcache.c' object='libkrb5_la-fcache.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-fcache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-fcache.Tpo -c -o libkrb5_la-fcache.lo `test -f 'fcache.c' || echo '$(srcdir)/'`fcache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-fcache.Tpo $(DEPDIR)/libkrb5_la-fcache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fcache.c' object='libkrb5_la-fcache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-fcache.lo `test -f 'fcache.c' || echo '$(srcdir)/'`fcache.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-fcache.lo `test -f 'fcache.c' || echo '$(srcdir)/'`fcache.c libkrb5_la-free.lo: free.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-free.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-free.Tpo -c -o libkrb5_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-free.Tpo $(DEPDIR)/libkrb5_la-free.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='free.c' object='libkrb5_la-free.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-free.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-free.Tpo -c -o libkrb5_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-free.Tpo $(DEPDIR)/libkrb5_la-free.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='free.c' object='libkrb5_la-free.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-free.lo `test -f 'free.c' || echo '$(srcdir)/'`free.c libkrb5_la-free_host_realm.lo: free_host_realm.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-free_host_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-free_host_realm.Tpo -c -o libkrb5_la-free_host_realm.lo `test -f 'free_host_realm.c' || echo '$(srcdir)/'`free_host_realm.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-free_host_realm.Tpo $(DEPDIR)/libkrb5_la-free_host_realm.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='free_host_realm.c' object='libkrb5_la-free_host_realm.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-free_host_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-free_host_realm.Tpo -c -o libkrb5_la-free_host_realm.lo `test -f 'free_host_realm.c' || echo '$(srcdir)/'`free_host_realm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-free_host_realm.Tpo $(DEPDIR)/libkrb5_la-free_host_realm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='free_host_realm.c' object='libkrb5_la-free_host_realm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-free_host_realm.lo `test -f 'free_host_realm.c' || echo '$(srcdir)/'`free_host_realm.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-free_host_realm.lo `test -f 'free_host_realm.c' || echo '$(srcdir)/'`free_host_realm.c libkrb5_la-generate_seq_number.lo: generate_seq_number.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-generate_seq_number.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-generate_seq_number.Tpo -c -o libkrb5_la-generate_seq_number.lo `test -f 'generate_seq_number.c' || echo '$(srcdir)/'`generate_seq_number.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-generate_seq_number.Tpo $(DEPDIR)/libkrb5_la-generate_seq_number.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate_seq_number.c' object='libkrb5_la-generate_seq_number.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-generate_seq_number.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-generate_seq_number.Tpo -c -o libkrb5_la-generate_seq_number.lo `test -f 'generate_seq_number.c' || echo '$(srcdir)/'`generate_seq_number.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-generate_seq_number.Tpo $(DEPDIR)/libkrb5_la-generate_seq_number.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generate_seq_number.c' object='libkrb5_la-generate_seq_number.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-generate_seq_number.lo `test -f 'generate_seq_number.c' || echo '$(srcdir)/'`generate_seq_number.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-generate_seq_number.lo `test -f 'generate_seq_number.c' || echo '$(srcdir)/'`generate_seq_number.c libkrb5_la-generate_subkey.lo: generate_subkey.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-generate_subkey.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-generate_subkey.Tpo -c -o libkrb5_la-generate_subkey.lo `test -f 'generate_subkey.c' || echo '$(srcdir)/'`generate_subkey.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-generate_subkey.Tpo $(DEPDIR)/libkrb5_la-generate_subkey.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='generate_subkey.c' object='libkrb5_la-generate_subkey.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-generate_subkey.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-generate_subkey.Tpo -c -o libkrb5_la-generate_subkey.lo `test -f 'generate_subkey.c' || echo '$(srcdir)/'`generate_subkey.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-generate_subkey.Tpo $(DEPDIR)/libkrb5_la-generate_subkey.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='generate_subkey.c' object='libkrb5_la-generate_subkey.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-generate_subkey.lo `test -f 'generate_subkey.c' || echo '$(srcdir)/'`generate_subkey.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-generate_subkey.lo `test -f 'generate_subkey.c' || echo '$(srcdir)/'`generate_subkey.c libkrb5_la-get_addrs.lo: get_addrs.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_addrs.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_addrs.Tpo -c -o libkrb5_la-get_addrs.lo `test -f 'get_addrs.c' || echo '$(srcdir)/'`get_addrs.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_addrs.Tpo $(DEPDIR)/libkrb5_la-get_addrs.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_addrs.c' object='libkrb5_la-get_addrs.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_addrs.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_addrs.Tpo -c -o libkrb5_la-get_addrs.lo `test -f 'get_addrs.c' || echo '$(srcdir)/'`get_addrs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_addrs.Tpo $(DEPDIR)/libkrb5_la-get_addrs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_addrs.c' object='libkrb5_la-get_addrs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_addrs.lo `test -f 'get_addrs.c' || echo '$(srcdir)/'`get_addrs.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_addrs.lo `test -f 'get_addrs.c' || echo '$(srcdir)/'`get_addrs.c libkrb5_la-get_cred.lo: get_cred.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_cred.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_cred.Tpo -c -o libkrb5_la-get_cred.lo `test -f 'get_cred.c' || echo '$(srcdir)/'`get_cred.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_cred.Tpo $(DEPDIR)/libkrb5_la-get_cred.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_cred.c' object='libkrb5_la-get_cred.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_cred.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_cred.Tpo -c -o libkrb5_la-get_cred.lo `test -f 'get_cred.c' || echo '$(srcdir)/'`get_cred.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_cred.Tpo $(DEPDIR)/libkrb5_la-get_cred.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_cred.c' object='libkrb5_la-get_cred.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_cred.lo `test -f 'get_cred.c' || echo '$(srcdir)/'`get_cred.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_cred.lo `test -f 'get_cred.c' || echo '$(srcdir)/'`get_cred.c libkrb5_la-get_default_principal.lo: get_default_principal.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_default_principal.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_default_principal.Tpo -c -o libkrb5_la-get_default_principal.lo `test -f 'get_default_principal.c' || echo '$(srcdir)/'`get_default_principal.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_default_principal.Tpo $(DEPDIR)/libkrb5_la-get_default_principal.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_default_principal.c' object='libkrb5_la-get_default_principal.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_default_principal.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_default_principal.Tpo -c -o libkrb5_la-get_default_principal.lo `test -f 'get_default_principal.c' || echo '$(srcdir)/'`get_default_principal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_default_principal.Tpo $(DEPDIR)/libkrb5_la-get_default_principal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_default_principal.c' object='libkrb5_la-get_default_principal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_default_principal.lo `test -f 'get_default_principal.c' || echo '$(srcdir)/'`get_default_principal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_default_principal.lo `test -f 'get_default_principal.c' || echo '$(srcdir)/'`get_default_principal.c libkrb5_la-get_default_realm.lo: get_default_realm.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_default_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_default_realm.Tpo -c -o libkrb5_la-get_default_realm.lo `test -f 'get_default_realm.c' || echo '$(srcdir)/'`get_default_realm.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_default_realm.Tpo $(DEPDIR)/libkrb5_la-get_default_realm.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_default_realm.c' object='libkrb5_la-get_default_realm.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_default_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_default_realm.Tpo -c -o libkrb5_la-get_default_realm.lo `test -f 'get_default_realm.c' || echo '$(srcdir)/'`get_default_realm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_default_realm.Tpo $(DEPDIR)/libkrb5_la-get_default_realm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_default_realm.c' object='libkrb5_la-get_default_realm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_default_realm.lo `test -f 'get_default_realm.c' || echo '$(srcdir)/'`get_default_realm.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_default_realm.lo `test -f 'get_default_realm.c' || echo '$(srcdir)/'`get_default_realm.c libkrb5_la-get_for_creds.lo: get_for_creds.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_for_creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_for_creds.Tpo -c -o libkrb5_la-get_for_creds.lo `test -f 'get_for_creds.c' || echo '$(srcdir)/'`get_for_creds.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_for_creds.Tpo $(DEPDIR)/libkrb5_la-get_for_creds.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_for_creds.c' object='libkrb5_la-get_for_creds.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_for_creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_for_creds.Tpo -c -o libkrb5_la-get_for_creds.lo `test -f 'get_for_creds.c' || echo '$(srcdir)/'`get_for_creds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_for_creds.Tpo $(DEPDIR)/libkrb5_la-get_for_creds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_for_creds.c' object='libkrb5_la-get_for_creds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_for_creds.lo `test -f 'get_for_creds.c' || echo '$(srcdir)/'`get_for_creds.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_for_creds.lo `test -f 'get_for_creds.c' || echo '$(srcdir)/'`get_for_creds.c libkrb5_la-get_host_realm.lo: get_host_realm.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_host_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_host_realm.Tpo -c -o libkrb5_la-get_host_realm.lo `test -f 'get_host_realm.c' || echo '$(srcdir)/'`get_host_realm.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_host_realm.Tpo $(DEPDIR)/libkrb5_la-get_host_realm.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_host_realm.c' object='libkrb5_la-get_host_realm.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_host_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_host_realm.Tpo -c -o libkrb5_la-get_host_realm.lo `test -f 'get_host_realm.c' || echo '$(srcdir)/'`get_host_realm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_host_realm.Tpo $(DEPDIR)/libkrb5_la-get_host_realm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_host_realm.c' object='libkrb5_la-get_host_realm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_host_realm.lo `test -f 'get_host_realm.c' || echo '$(srcdir)/'`get_host_realm.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_host_realm.lo `test -f 'get_host_realm.c' || echo '$(srcdir)/'`get_host_realm.c libkrb5_la-get_in_tkt.lo: get_in_tkt.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_in_tkt.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_in_tkt.Tpo -c -o libkrb5_la-get_in_tkt.lo `test -f 'get_in_tkt.c' || echo '$(srcdir)/'`get_in_tkt.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_in_tkt.Tpo $(DEPDIR)/libkrb5_la-get_in_tkt.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_in_tkt.c' object='libkrb5_la-get_in_tkt.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_in_tkt.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_in_tkt.Tpo -c -o libkrb5_la-get_in_tkt.lo `test -f 'get_in_tkt.c' || echo '$(srcdir)/'`get_in_tkt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_in_tkt.Tpo $(DEPDIR)/libkrb5_la-get_in_tkt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_in_tkt.c' object='libkrb5_la-get_in_tkt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_in_tkt.lo `test -f 'get_in_tkt.c' || echo '$(srcdir)/'`get_in_tkt.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_in_tkt.lo `test -f 'get_in_tkt.c' || echo '$(srcdir)/'`get_in_tkt.c libkrb5_la-get_port.lo: get_port.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_port.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_port.Tpo -c -o libkrb5_la-get_port.lo `test -f 'get_port.c' || echo '$(srcdir)/'`get_port.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-get_port.Tpo $(DEPDIR)/libkrb5_la-get_port.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_port.c' object='libkrb5_la-get_port.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-get_port.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-get_port.Tpo -c -o libkrb5_la-get_port.lo `test -f 'get_port.c' || echo '$(srcdir)/'`get_port.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-get_port.Tpo $(DEPDIR)/libkrb5_la-get_port.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_port.c' object='libkrb5_la-get_port.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_port.lo `test -f 'get_port.c' || echo '$(srcdir)/'`get_port.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-get_port.lo `test -f 'get_port.c' || echo '$(srcdir)/'`get_port.c libkrb5_la-init_creds.lo: init_creds.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-init_creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-init_creds.Tpo -c -o libkrb5_la-init_creds.lo `test -f 'init_creds.c' || echo '$(srcdir)/'`init_creds.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-init_creds.Tpo $(DEPDIR)/libkrb5_la-init_creds.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='init_creds.c' object='libkrb5_la-init_creds.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-init_creds.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-init_creds.Tpo -c -o libkrb5_la-init_creds.lo `test -f 'init_creds.c' || echo '$(srcdir)/'`init_creds.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-init_creds.Tpo $(DEPDIR)/libkrb5_la-init_creds.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init_creds.c' object='libkrb5_la-init_creds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-init_creds.lo `test -f 'init_creds.c' || echo '$(srcdir)/'`init_creds.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-init_creds.lo `test -f 'init_creds.c' || echo '$(srcdir)/'`init_creds.c libkrb5_la-init_creds_pw.lo: init_creds_pw.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-init_creds_pw.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-init_creds_pw.Tpo -c -o libkrb5_la-init_creds_pw.lo `test -f 'init_creds_pw.c' || echo '$(srcdir)/'`init_creds_pw.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-init_creds_pw.Tpo $(DEPDIR)/libkrb5_la-init_creds_pw.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='init_creds_pw.c' object='libkrb5_la-init_creds_pw.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-init_creds_pw.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-init_creds_pw.Tpo -c -o libkrb5_la-init_creds_pw.lo `test -f 'init_creds_pw.c' || echo '$(srcdir)/'`init_creds_pw.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-init_creds_pw.Tpo $(DEPDIR)/libkrb5_la-init_creds_pw.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='init_creds_pw.c' object='libkrb5_la-init_creds_pw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-init_creds_pw.lo `test -f 'init_creds_pw.c' || echo '$(srcdir)/'`init_creds_pw.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-init_creds_pw.lo `test -f 'init_creds_pw.c' || echo '$(srcdir)/'`init_creds_pw.c libkrb5_la-kcm.lo: kcm.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-kcm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-kcm.Tpo -c -o libkrb5_la-kcm.lo `test -f 'kcm.c' || echo '$(srcdir)/'`kcm.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-kcm.Tpo $(DEPDIR)/libkrb5_la-kcm.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kcm.c' object='libkrb5_la-kcm.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-kcm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-kcm.Tpo -c -o libkrb5_la-kcm.lo `test -f 'kcm.c' || echo '$(srcdir)/'`kcm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-kcm.Tpo $(DEPDIR)/libkrb5_la-kcm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kcm.c' object='libkrb5_la-kcm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-kcm.lo `test -f 'kcm.c' || echo '$(srcdir)/'`kcm.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-kcm.lo `test -f 'kcm.c' || echo '$(srcdir)/'`kcm.c libkrb5_la-keyblock.lo: keyblock.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keyblock.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keyblock.Tpo -c -o libkrb5_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-keyblock.Tpo $(DEPDIR)/libkrb5_la-keyblock.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keyblock.c' object='libkrb5_la-keyblock.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keyblock.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keyblock.Tpo -c -o libkrb5_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-keyblock.Tpo $(DEPDIR)/libkrb5_la-keyblock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keyblock.c' object='libkrb5_la-keyblock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c libkrb5_la-keytab.lo: keytab.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab.Tpo -c -o libkrb5_la-keytab.lo `test -f 'keytab.c' || echo '$(srcdir)/'`keytab.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-keytab.Tpo $(DEPDIR)/libkrb5_la-keytab.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keytab.c' object='libkrb5_la-keytab.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab.Tpo -c -o libkrb5_la-keytab.lo `test -f 'keytab.c' || echo '$(srcdir)/'`keytab.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-keytab.Tpo $(DEPDIR)/libkrb5_la-keytab.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keytab.c' object='libkrb5_la-keytab.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab.lo `test -f 'keytab.c' || echo '$(srcdir)/'`keytab.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab.lo `test -f 'keytab.c' || echo '$(srcdir)/'`keytab.c libkrb5_la-keytab_any.lo: keytab_any.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_any.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_any.Tpo -c -o libkrb5_la-keytab_any.lo `test -f 'keytab_any.c' || echo '$(srcdir)/'`keytab_any.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-keytab_any.Tpo $(DEPDIR)/libkrb5_la-keytab_any.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keytab_any.c' object='libkrb5_la-keytab_any.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_any.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_any.Tpo -c -o libkrb5_la-keytab_any.lo `test -f 'keytab_any.c' || echo '$(srcdir)/'`keytab_any.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-keytab_any.Tpo $(DEPDIR)/libkrb5_la-keytab_any.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keytab_any.c' object='libkrb5_la-keytab_any.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_any.lo `test -f 'keytab_any.c' || echo '$(srcdir)/'`keytab_any.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_any.lo `test -f 'keytab_any.c' || echo '$(srcdir)/'`keytab_any.c libkrb5_la-keytab_file.lo: keytab_file.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_file.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_file.Tpo -c -o libkrb5_la-keytab_file.lo `test -f 'keytab_file.c' || echo '$(srcdir)/'`keytab_file.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-keytab_file.Tpo $(DEPDIR)/libkrb5_la-keytab_file.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keytab_file.c' object='libkrb5_la-keytab_file.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_file.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_file.Tpo -c -o libkrb5_la-keytab_file.lo `test -f 'keytab_file.c' || echo '$(srcdir)/'`keytab_file.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-keytab_file.Tpo $(DEPDIR)/libkrb5_la-keytab_file.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keytab_file.c' object='libkrb5_la-keytab_file.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_file.lo `test -f 'keytab_file.c' || echo '$(srcdir)/'`keytab_file.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_file.lo `test -f 'keytab_file.c' || echo '$(srcdir)/'`keytab_file.c libkrb5_la-keytab_keyfile.lo: keytab_keyfile.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_keyfile.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_keyfile.Tpo -c -o libkrb5_la-keytab_keyfile.lo `test -f 'keytab_keyfile.c' || echo '$(srcdir)/'`keytab_keyfile.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-keytab_keyfile.Tpo $(DEPDIR)/libkrb5_la-keytab_keyfile.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keytab_keyfile.c' object='libkrb5_la-keytab_keyfile.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_keyfile.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_keyfile.Tpo -c -o libkrb5_la-keytab_keyfile.lo `test -f 'keytab_keyfile.c' || echo '$(srcdir)/'`keytab_keyfile.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-keytab_keyfile.Tpo $(DEPDIR)/libkrb5_la-keytab_keyfile.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keytab_keyfile.c' object='libkrb5_la-keytab_keyfile.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_keyfile.lo `test -f 'keytab_keyfile.c' || echo '$(srcdir)/'`keytab_keyfile.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_keyfile.lo `test -f 'keytab_keyfile.c' || echo '$(srcdir)/'`keytab_keyfile.c libkrb5_la-keytab_memory.lo: keytab_memory.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_memory.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_memory.Tpo -c -o libkrb5_la-keytab_memory.lo `test -f 'keytab_memory.c' || echo '$(srcdir)/'`keytab_memory.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-keytab_memory.Tpo $(DEPDIR)/libkrb5_la-keytab_memory.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keytab_memory.c' object='libkrb5_la-keytab_memory.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-keytab_memory.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-keytab_memory.Tpo -c -o libkrb5_la-keytab_memory.lo `test -f 'keytab_memory.c' || echo '$(srcdir)/'`keytab_memory.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-keytab_memory.Tpo $(DEPDIR)/libkrb5_la-keytab_memory.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keytab_memory.c' object='libkrb5_la-keytab_memory.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_memory.lo `test -f 'keytab_memory.c' || echo '$(srcdir)/'`keytab_memory.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-keytab_memory.lo `test -f 'keytab_memory.c' || echo '$(srcdir)/'`keytab_memory.c libkrb5_la-krbhst.lo: krbhst.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-krbhst.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-krbhst.Tpo -c -o libkrb5_la-krbhst.lo `test -f 'krbhst.c' || echo '$(srcdir)/'`krbhst.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-krbhst.Tpo $(DEPDIR)/libkrb5_la-krbhst.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='krbhst.c' object='libkrb5_la-krbhst.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-krbhst.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-krbhst.Tpo -c -o libkrb5_la-krbhst.lo `test -f 'krbhst.c' || echo '$(srcdir)/'`krbhst.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-krbhst.Tpo $(DEPDIR)/libkrb5_la-krbhst.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='krbhst.c' object='libkrb5_la-krbhst.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-krbhst.lo `test -f 'krbhst.c' || echo '$(srcdir)/'`krbhst.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-krbhst.lo `test -f 'krbhst.c' || echo '$(srcdir)/'`krbhst.c libkrb5_la-kuserok.lo: kuserok.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-kuserok.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-kuserok.Tpo -c -o libkrb5_la-kuserok.lo `test -f 'kuserok.c' || echo '$(srcdir)/'`kuserok.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-kuserok.Tpo $(DEPDIR)/libkrb5_la-kuserok.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='kuserok.c' object='libkrb5_la-kuserok.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-kuserok.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-kuserok.Tpo -c -o libkrb5_la-kuserok.lo `test -f 'kuserok.c' || echo '$(srcdir)/'`kuserok.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-kuserok.Tpo $(DEPDIR)/libkrb5_la-kuserok.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='kuserok.c' object='libkrb5_la-kuserok.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-kuserok.lo `test -f 'kuserok.c' || echo '$(srcdir)/'`kuserok.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-kuserok.lo `test -f 'kuserok.c' || echo '$(srcdir)/'`kuserok.c libkrb5_la-log.lo: log.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-log.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-log.Tpo -c -o libkrb5_la-log.lo `test -f 'log.c' || echo '$(srcdir)/'`log.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-log.Tpo $(DEPDIR)/libkrb5_la-log.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='log.c' object='libkrb5_la-log.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-log.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-log.Tpo -c -o libkrb5_la-log.lo `test -f 'log.c' || echo '$(srcdir)/'`log.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-log.Tpo $(DEPDIR)/libkrb5_la-log.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log.c' object='libkrb5_la-log.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-log.lo `test -f 'log.c' || echo '$(srcdir)/'`log.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-log.lo `test -f 'log.c' || echo '$(srcdir)/'`log.c libkrb5_la-mcache.lo: mcache.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mcache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mcache.Tpo -c -o libkrb5_la-mcache.lo `test -f 'mcache.c' || echo '$(srcdir)/'`mcache.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mcache.Tpo $(DEPDIR)/libkrb5_la-mcache.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mcache.c' object='libkrb5_la-mcache.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mcache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mcache.Tpo -c -o libkrb5_la-mcache.lo `test -f 'mcache.c' || echo '$(srcdir)/'`mcache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mcache.Tpo $(DEPDIR)/libkrb5_la-mcache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mcache.c' object='libkrb5_la-mcache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mcache.lo `test -f 'mcache.c' || echo '$(srcdir)/'`mcache.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mcache.lo `test -f 'mcache.c' || echo '$(srcdir)/'`mcache.c libkrb5_la-misc.lo: misc.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-misc.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-misc.Tpo -c -o libkrb5_la-misc.lo `test -f 'misc.c' || echo '$(srcdir)/'`misc.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-misc.Tpo $(DEPDIR)/libkrb5_la-misc.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='misc.c' object='libkrb5_la-misc.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-misc.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-misc.Tpo -c -o libkrb5_la-misc.lo `test -f 'misc.c' || echo '$(srcdir)/'`misc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-misc.Tpo $(DEPDIR)/libkrb5_la-misc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='misc.c' object='libkrb5_la-misc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-misc.lo `test -f 'misc.c' || echo '$(srcdir)/'`misc.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-misc.lo `test -f 'misc.c' || echo '$(srcdir)/'`misc.c libkrb5_la-mk_error.lo: mk_error.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_error.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_error.Tpo -c -o libkrb5_la-mk_error.lo `test -f 'mk_error.c' || echo '$(srcdir)/'`mk_error.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mk_error.Tpo $(DEPDIR)/libkrb5_la-mk_error.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mk_error.c' object='libkrb5_la-mk_error.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_error.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_error.Tpo -c -o libkrb5_la-mk_error.lo `test -f 'mk_error.c' || echo '$(srcdir)/'`mk_error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mk_error.Tpo $(DEPDIR)/libkrb5_la-mk_error.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mk_error.c' object='libkrb5_la-mk_error.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_error.lo `test -f 'mk_error.c' || echo '$(srcdir)/'`mk_error.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_error.lo `test -f 'mk_error.c' || echo '$(srcdir)/'`mk_error.c libkrb5_la-mk_priv.lo: mk_priv.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_priv.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_priv.Tpo -c -o libkrb5_la-mk_priv.lo `test -f 'mk_priv.c' || echo '$(srcdir)/'`mk_priv.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mk_priv.Tpo $(DEPDIR)/libkrb5_la-mk_priv.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mk_priv.c' object='libkrb5_la-mk_priv.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_priv.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_priv.Tpo -c -o libkrb5_la-mk_priv.lo `test -f 'mk_priv.c' || echo '$(srcdir)/'`mk_priv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mk_priv.Tpo $(DEPDIR)/libkrb5_la-mk_priv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mk_priv.c' object='libkrb5_la-mk_priv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_priv.lo `test -f 'mk_priv.c' || echo '$(srcdir)/'`mk_priv.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_priv.lo `test -f 'mk_priv.c' || echo '$(srcdir)/'`mk_priv.c libkrb5_la-mk_rep.lo: mk_rep.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_rep.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_rep.Tpo -c -o libkrb5_la-mk_rep.lo `test -f 'mk_rep.c' || echo '$(srcdir)/'`mk_rep.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mk_rep.Tpo $(DEPDIR)/libkrb5_la-mk_rep.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mk_rep.c' object='libkrb5_la-mk_rep.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_rep.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_rep.Tpo -c -o libkrb5_la-mk_rep.lo `test -f 'mk_rep.c' || echo '$(srcdir)/'`mk_rep.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mk_rep.Tpo $(DEPDIR)/libkrb5_la-mk_rep.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mk_rep.c' object='libkrb5_la-mk_rep.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_rep.lo `test -f 'mk_rep.c' || echo '$(srcdir)/'`mk_rep.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_rep.lo `test -f 'mk_rep.c' || echo '$(srcdir)/'`mk_rep.c libkrb5_la-mk_req.lo: mk_req.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_req.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_req.Tpo -c -o libkrb5_la-mk_req.lo `test -f 'mk_req.c' || echo '$(srcdir)/'`mk_req.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mk_req.Tpo $(DEPDIR)/libkrb5_la-mk_req.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mk_req.c' object='libkrb5_la-mk_req.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_req.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_req.Tpo -c -o libkrb5_la-mk_req.lo `test -f 'mk_req.c' || echo '$(srcdir)/'`mk_req.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mk_req.Tpo $(DEPDIR)/libkrb5_la-mk_req.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mk_req.c' object='libkrb5_la-mk_req.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_req.lo `test -f 'mk_req.c' || echo '$(srcdir)/'`mk_req.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_req.lo `test -f 'mk_req.c' || echo '$(srcdir)/'`mk_req.c libkrb5_la-mk_req_ext.lo: mk_req_ext.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_req_ext.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_req_ext.Tpo -c -o libkrb5_la-mk_req_ext.lo `test -f 'mk_req_ext.c' || echo '$(srcdir)/'`mk_req_ext.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mk_req_ext.Tpo $(DEPDIR)/libkrb5_la-mk_req_ext.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mk_req_ext.c' object='libkrb5_la-mk_req_ext.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_req_ext.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_req_ext.Tpo -c -o libkrb5_la-mk_req_ext.lo `test -f 'mk_req_ext.c' || echo '$(srcdir)/'`mk_req_ext.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mk_req_ext.Tpo $(DEPDIR)/libkrb5_la-mk_req_ext.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mk_req_ext.c' object='libkrb5_la-mk_req_ext.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_req_ext.lo `test -f 'mk_req_ext.c' || echo '$(srcdir)/'`mk_req_ext.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_req_ext.lo `test -f 'mk_req_ext.c' || echo '$(srcdir)/'`mk_req_ext.c libkrb5_la-mk_safe.lo: mk_safe.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_safe.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_safe.Tpo -c -o libkrb5_la-mk_safe.lo `test -f 'mk_safe.c' || echo '$(srcdir)/'`mk_safe.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mk_safe.Tpo $(DEPDIR)/libkrb5_la-mk_safe.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mk_safe.c' object='libkrb5_la-mk_safe.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mk_safe.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mk_safe.Tpo -c -o libkrb5_la-mk_safe.lo `test -f 'mk_safe.c' || echo '$(srcdir)/'`mk_safe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mk_safe.Tpo $(DEPDIR)/libkrb5_la-mk_safe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mk_safe.c' object='libkrb5_la-mk_safe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_safe.lo `test -f 'mk_safe.c' || echo '$(srcdir)/'`mk_safe.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mk_safe.lo `test -f 'mk_safe.c' || echo '$(srcdir)/'`mk_safe.c libkrb5_la-mit_glue.lo: mit_glue.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mit_glue.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mit_glue.Tpo -c -o libkrb5_la-mit_glue.lo `test -f 'mit_glue.c' || echo '$(srcdir)/'`mit_glue.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-mit_glue.Tpo $(DEPDIR)/libkrb5_la-mit_glue.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mit_glue.c' object='libkrb5_la-mit_glue.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-mit_glue.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-mit_glue.Tpo -c -o libkrb5_la-mit_glue.lo `test -f 'mit_glue.c' || echo '$(srcdir)/'`mit_glue.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-mit_glue.Tpo $(DEPDIR)/libkrb5_la-mit_glue.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mit_glue.c' object='libkrb5_la-mit_glue.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mit_glue.lo `test -f 'mit_glue.c' || echo '$(srcdir)/'`mit_glue.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-mit_glue.lo `test -f 'mit_glue.c' || echo '$(srcdir)/'`mit_glue.c libkrb5_la-net_read.lo: net_read.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-net_read.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-net_read.Tpo -c -o libkrb5_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-net_read.Tpo $(DEPDIR)/libkrb5_la-net_read.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='net_read.c' object='libkrb5_la-net_read.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-net_read.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-net_read.Tpo -c -o libkrb5_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-net_read.Tpo $(DEPDIR)/libkrb5_la-net_read.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net_read.c' object='libkrb5_la-net_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c libkrb5_la-net_write.lo: net_write.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-net_write.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-net_write.Tpo -c -o libkrb5_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-net_write.Tpo $(DEPDIR)/libkrb5_la-net_write.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='net_write.c' object='libkrb5_la-net_write.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-net_write.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-net_write.Tpo -c -o libkrb5_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-net_write.Tpo $(DEPDIR)/libkrb5_la-net_write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net_write.c' object='libkrb5_la-net_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c libkrb5_la-n-fold.lo: n-fold.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-n-fold.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-n-fold.Tpo -c -o libkrb5_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-n-fold.Tpo $(DEPDIR)/libkrb5_la-n-fold.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='n-fold.c' object='libkrb5_la-n-fold.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-n-fold.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-n-fold.Tpo -c -o libkrb5_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-n-fold.Tpo $(DEPDIR)/libkrb5_la-n-fold.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='n-fold.c' object='libkrb5_la-n-fold.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c libkrb5_la-pac.lo: pac.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-pac.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-pac.Tpo -c -o libkrb5_la-pac.lo `test -f 'pac.c' || echo '$(srcdir)/'`pac.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-pac.Tpo $(DEPDIR)/libkrb5_la-pac.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pac.c' object='libkrb5_la-pac.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-pac.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-pac.Tpo -c -o libkrb5_la-pac.lo `test -f 'pac.c' || echo '$(srcdir)/'`pac.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-pac.Tpo $(DEPDIR)/libkrb5_la-pac.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pac.c' object='libkrb5_la-pac.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-pac.lo `test -f 'pac.c' || echo '$(srcdir)/'`pac.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-pac.lo `test -f 'pac.c' || echo '$(srcdir)/'`pac.c libkrb5_la-padata.lo: padata.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-padata.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-padata.Tpo -c -o libkrb5_la-padata.lo `test -f 'padata.c' || echo '$(srcdir)/'`padata.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-padata.Tpo $(DEPDIR)/libkrb5_la-padata.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='padata.c' object='libkrb5_la-padata.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-padata.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-padata.Tpo -c -o libkrb5_la-padata.lo `test -f 'padata.c' || echo '$(srcdir)/'`padata.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-padata.Tpo $(DEPDIR)/libkrb5_la-padata.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='padata.c' object='libkrb5_la-padata.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-padata.lo `test -f 'padata.c' || echo '$(srcdir)/'`padata.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-padata.lo `test -f 'padata.c' || echo '$(srcdir)/'`padata.c libkrb5_la-pcache.lo: pcache.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-pcache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-pcache.Tpo -c -o libkrb5_la-pcache.lo `test -f 'pcache.c' || echo '$(srcdir)/'`pcache.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-pcache.Tpo $(DEPDIR)/libkrb5_la-pcache.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pcache.c' object='libkrb5_la-pcache.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-pcache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-pcache.Tpo -c -o libkrb5_la-pcache.lo `test -f 'pcache.c' || echo '$(srcdir)/'`pcache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-pcache.Tpo $(DEPDIR)/libkrb5_la-pcache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pcache.c' object='libkrb5_la-pcache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-pcache.lo `test -f 'pcache.c' || echo '$(srcdir)/'`pcache.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-pcache.lo `test -f 'pcache.c' || echo '$(srcdir)/'`pcache.c libkrb5_la-pkinit.lo: pkinit.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-pkinit.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-pkinit.Tpo -c -o libkrb5_la-pkinit.lo `test -f 'pkinit.c' || echo '$(srcdir)/'`pkinit.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-pkinit.Tpo $(DEPDIR)/libkrb5_la-pkinit.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pkinit.c' object='libkrb5_la-pkinit.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-pkinit.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-pkinit.Tpo -c -o libkrb5_la-pkinit.lo `test -f 'pkinit.c' || echo '$(srcdir)/'`pkinit.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-pkinit.Tpo $(DEPDIR)/libkrb5_la-pkinit.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pkinit.c' object='libkrb5_la-pkinit.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-pkinit.lo `test -f 'pkinit.c' || echo '$(srcdir)/'`pkinit.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-pkinit.lo `test -f 'pkinit.c' || echo '$(srcdir)/'`pkinit.c + +libkrb5_la-pkinit-ec.lo: pkinit-ec.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-pkinit-ec.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-pkinit-ec.Tpo -c -o libkrb5_la-pkinit-ec.lo `test -f 'pkinit-ec.c' || echo '$(srcdir)/'`pkinit-ec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-pkinit-ec.Tpo $(DEPDIR)/libkrb5_la-pkinit-ec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pkinit-ec.c' object='libkrb5_la-pkinit-ec.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-pkinit-ec.lo `test -f 'pkinit-ec.c' || echo '$(srcdir)/'`pkinit-ec.c libkrb5_la-principal.lo: principal.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-principal.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-principal.Tpo -c -o libkrb5_la-principal.lo `test -f 'principal.c' || echo '$(srcdir)/'`principal.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-principal.Tpo $(DEPDIR)/libkrb5_la-principal.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='principal.c' object='libkrb5_la-principal.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-principal.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-principal.Tpo -c -o libkrb5_la-principal.lo `test -f 'principal.c' || echo '$(srcdir)/'`principal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-principal.Tpo $(DEPDIR)/libkrb5_la-principal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='principal.c' object='libkrb5_la-principal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-principal.lo `test -f 'principal.c' || echo '$(srcdir)/'`principal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-principal.lo `test -f 'principal.c' || echo '$(srcdir)/'`principal.c libkrb5_la-prog_setup.lo: prog_setup.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-prog_setup.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-prog_setup.Tpo -c -o libkrb5_la-prog_setup.lo `test -f 'prog_setup.c' || echo '$(srcdir)/'`prog_setup.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-prog_setup.Tpo $(DEPDIR)/libkrb5_la-prog_setup.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prog_setup.c' object='libkrb5_la-prog_setup.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-prog_setup.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-prog_setup.Tpo -c -o libkrb5_la-prog_setup.lo `test -f 'prog_setup.c' || echo '$(srcdir)/'`prog_setup.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-prog_setup.Tpo $(DEPDIR)/libkrb5_la-prog_setup.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='prog_setup.c' object='libkrb5_la-prog_setup.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-prog_setup.lo `test -f 'prog_setup.c' || echo '$(srcdir)/'`prog_setup.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-prog_setup.lo `test -f 'prog_setup.c' || echo '$(srcdir)/'`prog_setup.c libkrb5_la-prompter_posix.lo: prompter_posix.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-prompter_posix.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-prompter_posix.Tpo -c -o libkrb5_la-prompter_posix.lo `test -f 'prompter_posix.c' || echo '$(srcdir)/'`prompter_posix.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-prompter_posix.Tpo $(DEPDIR)/libkrb5_la-prompter_posix.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='prompter_posix.c' object='libkrb5_la-prompter_posix.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-prompter_posix.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-prompter_posix.Tpo -c -o libkrb5_la-prompter_posix.lo `test -f 'prompter_posix.c' || echo '$(srcdir)/'`prompter_posix.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-prompter_posix.Tpo $(DEPDIR)/libkrb5_la-prompter_posix.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='prompter_posix.c' object='libkrb5_la-prompter_posix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-prompter_posix.lo `test -f 'prompter_posix.c' || echo '$(srcdir)/'`prompter_posix.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-prompter_posix.lo `test -f 'prompter_posix.c' || echo '$(srcdir)/'`prompter_posix.c libkrb5_la-rd_cred.lo: rd_cred.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_cred.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_cred.Tpo -c -o libkrb5_la-rd_cred.lo `test -f 'rd_cred.c' || echo '$(srcdir)/'`rd_cred.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-rd_cred.Tpo $(DEPDIR)/libkrb5_la-rd_cred.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rd_cred.c' object='libkrb5_la-rd_cred.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_cred.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_cred.Tpo -c -o libkrb5_la-rd_cred.lo `test -f 'rd_cred.c' || echo '$(srcdir)/'`rd_cred.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-rd_cred.Tpo $(DEPDIR)/libkrb5_la-rd_cred.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rd_cred.c' object='libkrb5_la-rd_cred.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_cred.lo `test -f 'rd_cred.c' || echo '$(srcdir)/'`rd_cred.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_cred.lo `test -f 'rd_cred.c' || echo '$(srcdir)/'`rd_cred.c libkrb5_la-rd_error.lo: rd_error.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_error.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_error.Tpo -c -o libkrb5_la-rd_error.lo `test -f 'rd_error.c' || echo '$(srcdir)/'`rd_error.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-rd_error.Tpo $(DEPDIR)/libkrb5_la-rd_error.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rd_error.c' object='libkrb5_la-rd_error.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_error.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_error.Tpo -c -o libkrb5_la-rd_error.lo `test -f 'rd_error.c' || echo '$(srcdir)/'`rd_error.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-rd_error.Tpo $(DEPDIR)/libkrb5_la-rd_error.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rd_error.c' object='libkrb5_la-rd_error.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_error.lo `test -f 'rd_error.c' || echo '$(srcdir)/'`rd_error.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_error.lo `test -f 'rd_error.c' || echo '$(srcdir)/'`rd_error.c libkrb5_la-rd_priv.lo: rd_priv.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_priv.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_priv.Tpo -c -o libkrb5_la-rd_priv.lo `test -f 'rd_priv.c' || echo '$(srcdir)/'`rd_priv.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-rd_priv.Tpo $(DEPDIR)/libkrb5_la-rd_priv.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rd_priv.c' object='libkrb5_la-rd_priv.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_priv.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_priv.Tpo -c -o libkrb5_la-rd_priv.lo `test -f 'rd_priv.c' || echo '$(srcdir)/'`rd_priv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-rd_priv.Tpo $(DEPDIR)/libkrb5_la-rd_priv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rd_priv.c' object='libkrb5_la-rd_priv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_priv.lo `test -f 'rd_priv.c' || echo '$(srcdir)/'`rd_priv.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_priv.lo `test -f 'rd_priv.c' || echo '$(srcdir)/'`rd_priv.c libkrb5_la-rd_rep.lo: rd_rep.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_rep.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_rep.Tpo -c -o libkrb5_la-rd_rep.lo `test -f 'rd_rep.c' || echo '$(srcdir)/'`rd_rep.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-rd_rep.Tpo $(DEPDIR)/libkrb5_la-rd_rep.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rd_rep.c' object='libkrb5_la-rd_rep.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_rep.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_rep.Tpo -c -o libkrb5_la-rd_rep.lo `test -f 'rd_rep.c' || echo '$(srcdir)/'`rd_rep.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-rd_rep.Tpo $(DEPDIR)/libkrb5_la-rd_rep.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rd_rep.c' object='libkrb5_la-rd_rep.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_rep.lo `test -f 'rd_rep.c' || echo '$(srcdir)/'`rd_rep.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_rep.lo `test -f 'rd_rep.c' || echo '$(srcdir)/'`rd_rep.c libkrb5_la-rd_req.lo: rd_req.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_req.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_req.Tpo -c -o libkrb5_la-rd_req.lo `test -f 'rd_req.c' || echo '$(srcdir)/'`rd_req.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-rd_req.Tpo $(DEPDIR)/libkrb5_la-rd_req.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rd_req.c' object='libkrb5_la-rd_req.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_req.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_req.Tpo -c -o libkrb5_la-rd_req.lo `test -f 'rd_req.c' || echo '$(srcdir)/'`rd_req.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-rd_req.Tpo $(DEPDIR)/libkrb5_la-rd_req.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rd_req.c' object='libkrb5_la-rd_req.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_req.lo `test -f 'rd_req.c' || echo '$(srcdir)/'`rd_req.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_req.lo `test -f 'rd_req.c' || echo '$(srcdir)/'`rd_req.c libkrb5_la-rd_safe.lo: rd_safe.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_safe.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_safe.Tpo -c -o libkrb5_la-rd_safe.lo `test -f 'rd_safe.c' || echo '$(srcdir)/'`rd_safe.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-rd_safe.Tpo $(DEPDIR)/libkrb5_la-rd_safe.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rd_safe.c' object='libkrb5_la-rd_safe.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-rd_safe.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-rd_safe.Tpo -c -o libkrb5_la-rd_safe.lo `test -f 'rd_safe.c' || echo '$(srcdir)/'`rd_safe.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-rd_safe.Tpo $(DEPDIR)/libkrb5_la-rd_safe.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rd_safe.c' object='libkrb5_la-rd_safe.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_safe.lo `test -f 'rd_safe.c' || echo '$(srcdir)/'`rd_safe.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-rd_safe.lo `test -f 'rd_safe.c' || echo '$(srcdir)/'`rd_safe.c libkrb5_la-read_message.lo: read_message.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-read_message.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-read_message.Tpo -c -o libkrb5_la-read_message.lo `test -f 'read_message.c' || echo '$(srcdir)/'`read_message.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-read_message.Tpo $(DEPDIR)/libkrb5_la-read_message.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='read_message.c' object='libkrb5_la-read_message.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-read_message.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-read_message.Tpo -c -o libkrb5_la-read_message.lo `test -f 'read_message.c' || echo '$(srcdir)/'`read_message.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-read_message.Tpo $(DEPDIR)/libkrb5_la-read_message.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='read_message.c' object='libkrb5_la-read_message.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-read_message.lo `test -f 'read_message.c' || echo '$(srcdir)/'`read_message.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-read_message.lo `test -f 'read_message.c' || echo '$(srcdir)/'`read_message.c libkrb5_la-recvauth.lo: recvauth.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-recvauth.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-recvauth.Tpo -c -o libkrb5_la-recvauth.lo `test -f 'recvauth.c' || echo '$(srcdir)/'`recvauth.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-recvauth.Tpo $(DEPDIR)/libkrb5_la-recvauth.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='recvauth.c' object='libkrb5_la-recvauth.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-recvauth.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-recvauth.Tpo -c -o libkrb5_la-recvauth.lo `test -f 'recvauth.c' || echo '$(srcdir)/'`recvauth.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-recvauth.Tpo $(DEPDIR)/libkrb5_la-recvauth.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='recvauth.c' object='libkrb5_la-recvauth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-recvauth.lo `test -f 'recvauth.c' || echo '$(srcdir)/'`recvauth.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-recvauth.lo `test -f 'recvauth.c' || echo '$(srcdir)/'`recvauth.c libkrb5_la-replay.lo: replay.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-replay.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-replay.Tpo -c -o libkrb5_la-replay.lo `test -f 'replay.c' || echo '$(srcdir)/'`replay.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-replay.Tpo $(DEPDIR)/libkrb5_la-replay.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='replay.c' object='libkrb5_la-replay.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-replay.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-replay.Tpo -c -o libkrb5_la-replay.lo `test -f 'replay.c' || echo '$(srcdir)/'`replay.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-replay.Tpo $(DEPDIR)/libkrb5_la-replay.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='replay.c' object='libkrb5_la-replay.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-replay.lo `test -f 'replay.c' || echo '$(srcdir)/'`replay.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-replay.lo `test -f 'replay.c' || echo '$(srcdir)/'`replay.c libkrb5_la-salt.lo: salt.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt.Tpo -c -o libkrb5_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-salt.Tpo $(DEPDIR)/libkrb5_la-salt.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt.c' object='libkrb5_la-salt.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt.Tpo -c -o libkrb5_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-salt.Tpo $(DEPDIR)/libkrb5_la-salt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt.c' object='libkrb5_la-salt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c + +libkrb5_la-salt-aes-sha1.lo: salt-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-aes-sha1.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-aes-sha1.Tpo -c -o libkrb5_la-salt-aes-sha1.lo `test -f 'salt-aes-sha1.c' || echo '$(srcdir)/'`salt-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-salt-aes-sha1.Tpo $(DEPDIR)/libkrb5_la-salt-aes-sha1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-aes-sha1.c' object='libkrb5_la-salt-aes-sha1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-aes-sha1.lo `test -f 'salt-aes-sha1.c' || echo '$(srcdir)/'`salt-aes-sha1.c -libkrb5_la-salt-aes.lo: salt-aes.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-aes.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-aes.Tpo -c -o libkrb5_la-salt-aes.lo `test -f 'salt-aes.c' || echo '$(srcdir)/'`salt-aes.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-salt-aes.Tpo $(DEPDIR)/libkrb5_la-salt-aes.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-aes.c' object='libkrb5_la-salt-aes.lo' libtool=yes @AMDEPBACKSLASH@ +libkrb5_la-salt-aes-sha2.lo: salt-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-aes-sha2.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-aes-sha2.Tpo -c -o libkrb5_la-salt-aes-sha2.lo `test -f 'salt-aes-sha2.c' || echo '$(srcdir)/'`salt-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-salt-aes-sha2.Tpo $(DEPDIR)/libkrb5_la-salt-aes-sha2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-aes-sha2.c' object='libkrb5_la-salt-aes-sha2.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-aes.lo `test -f 'salt-aes.c' || echo '$(srcdir)/'`salt-aes.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-aes-sha2.lo `test -f 'salt-aes-sha2.c' || echo '$(srcdir)/'`salt-aes-sha2.c libkrb5_la-salt-arcfour.lo: salt-arcfour.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-arcfour.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-arcfour.Tpo -c -o libkrb5_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-salt-arcfour.Tpo $(DEPDIR)/libkrb5_la-salt-arcfour.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-arcfour.c' object='libkrb5_la-salt-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-arcfour.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-arcfour.Tpo -c -o libkrb5_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-salt-arcfour.Tpo $(DEPDIR)/libkrb5_la-salt-arcfour.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-arcfour.c' object='libkrb5_la-salt-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c libkrb5_la-salt-des.lo: salt-des.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-des.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-des.Tpo -c -o libkrb5_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-salt-des.Tpo $(DEPDIR)/libkrb5_la-salt-des.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-des.c' object='libkrb5_la-salt-des.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-des.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-des.Tpo -c -o libkrb5_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-salt-des.Tpo $(DEPDIR)/libkrb5_la-salt-des.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-des.c' object='libkrb5_la-salt-des.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c libkrb5_la-salt-des3.lo: salt-des3.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-des3.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-des3.Tpo -c -o libkrb5_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-salt-des3.Tpo $(DEPDIR)/libkrb5_la-salt-des3.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-des3.c' object='libkrb5_la-salt-des3.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-salt-des3.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-salt-des3.Tpo -c -o libkrb5_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-salt-des3.Tpo $(DEPDIR)/libkrb5_la-salt-des3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-des3.c' object='libkrb5_la-salt-des3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c + +libkrb5_la-sp800-108-kdf.lo: sp800-108-kdf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-sp800-108-kdf.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-sp800-108-kdf.Tpo -c -o libkrb5_la-sp800-108-kdf.lo `test -f 'sp800-108-kdf.c' || echo '$(srcdir)/'`sp800-108-kdf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-sp800-108-kdf.Tpo $(DEPDIR)/libkrb5_la-sp800-108-kdf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sp800-108-kdf.c' object='libkrb5_la-sp800-108-kdf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-sp800-108-kdf.lo `test -f 'sp800-108-kdf.c' || echo '$(srcdir)/'`sp800-108-kdf.c libkrb5_la-scache.lo: scache.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-scache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-scache.Tpo -c -o libkrb5_la-scache.lo `test -f 'scache.c' || echo '$(srcdir)/'`scache.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-scache.Tpo $(DEPDIR)/libkrb5_la-scache.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='scache.c' object='libkrb5_la-scache.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-scache.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-scache.Tpo -c -o libkrb5_la-scache.lo `test -f 'scache.c' || echo '$(srcdir)/'`scache.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-scache.Tpo $(DEPDIR)/libkrb5_la-scache.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='scache.c' object='libkrb5_la-scache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-scache.lo `test -f 'scache.c' || echo '$(srcdir)/'`scache.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-scache.lo `test -f 'scache.c' || echo '$(srcdir)/'`scache.c libkrb5_la-send_to_kdc.lo: send_to_kdc.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-send_to_kdc.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-send_to_kdc.Tpo -c -o libkrb5_la-send_to_kdc.lo `test -f 'send_to_kdc.c' || echo '$(srcdir)/'`send_to_kdc.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-send_to_kdc.Tpo $(DEPDIR)/libkrb5_la-send_to_kdc.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='send_to_kdc.c' object='libkrb5_la-send_to_kdc.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-send_to_kdc.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-send_to_kdc.Tpo -c -o libkrb5_la-send_to_kdc.lo `test -f 'send_to_kdc.c' || echo '$(srcdir)/'`send_to_kdc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-send_to_kdc.Tpo $(DEPDIR)/libkrb5_la-send_to_kdc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='send_to_kdc.c' object='libkrb5_la-send_to_kdc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-send_to_kdc.lo `test -f 'send_to_kdc.c' || echo '$(srcdir)/'`send_to_kdc.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-send_to_kdc.lo `test -f 'send_to_kdc.c' || echo '$(srcdir)/'`send_to_kdc.c libkrb5_la-sendauth.lo: sendauth.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-sendauth.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-sendauth.Tpo -c -o libkrb5_la-sendauth.lo `test -f 'sendauth.c' || echo '$(srcdir)/'`sendauth.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-sendauth.Tpo $(DEPDIR)/libkrb5_la-sendauth.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sendauth.c' object='libkrb5_la-sendauth.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-sendauth.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-sendauth.Tpo -c -o libkrb5_la-sendauth.lo `test -f 'sendauth.c' || echo '$(srcdir)/'`sendauth.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-sendauth.Tpo $(DEPDIR)/libkrb5_la-sendauth.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sendauth.c' object='libkrb5_la-sendauth.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-sendauth.lo `test -f 'sendauth.c' || echo '$(srcdir)/'`sendauth.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-sendauth.lo `test -f 'sendauth.c' || echo '$(srcdir)/'`sendauth.c libkrb5_la-set_default_realm.lo: set_default_realm.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-set_default_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-set_default_realm.Tpo -c -o libkrb5_la-set_default_realm.lo `test -f 'set_default_realm.c' || echo '$(srcdir)/'`set_default_realm.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-set_default_realm.Tpo $(DEPDIR)/libkrb5_la-set_default_realm.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='set_default_realm.c' object='libkrb5_la-set_default_realm.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-set_default_realm.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-set_default_realm.Tpo -c -o libkrb5_la-set_default_realm.lo `test -f 'set_default_realm.c' || echo '$(srcdir)/'`set_default_realm.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-set_default_realm.Tpo $(DEPDIR)/libkrb5_la-set_default_realm.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='set_default_realm.c' object='libkrb5_la-set_default_realm.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-set_default_realm.lo `test -f 'set_default_realm.c' || echo '$(srcdir)/'`set_default_realm.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-set_default_realm.lo `test -f 'set_default_realm.c' || echo '$(srcdir)/'`set_default_realm.c libkrb5_la-sock_principal.lo: sock_principal.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-sock_principal.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-sock_principal.Tpo -c -o libkrb5_la-sock_principal.lo `test -f 'sock_principal.c' || echo '$(srcdir)/'`sock_principal.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-sock_principal.Tpo $(DEPDIR)/libkrb5_la-sock_principal.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sock_principal.c' object='libkrb5_la-sock_principal.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-sock_principal.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-sock_principal.Tpo -c -o libkrb5_la-sock_principal.lo `test -f 'sock_principal.c' || echo '$(srcdir)/'`sock_principal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-sock_principal.Tpo $(DEPDIR)/libkrb5_la-sock_principal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sock_principal.c' object='libkrb5_la-sock_principal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-sock_principal.lo `test -f 'sock_principal.c' || echo '$(srcdir)/'`sock_principal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-sock_principal.lo `test -f 'sock_principal.c' || echo '$(srcdir)/'`sock_principal.c libkrb5_la-store.lo: store.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store.Tpo -c -o libkrb5_la-store.lo `test -f 'store.c' || echo '$(srcdir)/'`store.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-store.Tpo $(DEPDIR)/libkrb5_la-store.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='store.c' object='libkrb5_la-store.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store.Tpo -c -o libkrb5_la-store.lo `test -f 'store.c' || echo '$(srcdir)/'`store.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-store.Tpo $(DEPDIR)/libkrb5_la-store.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='store.c' object='libkrb5_la-store.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store.lo `test -f 'store.c' || echo '$(srcdir)/'`store.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store.lo `test -f 'store.c' || echo '$(srcdir)/'`store.c libkrb5_la-store-int.lo: store-int.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store-int.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store-int.Tpo -c -o libkrb5_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-store-int.Tpo $(DEPDIR)/libkrb5_la-store-int.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='store-int.c' object='libkrb5_la-store-int.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store-int.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store-int.Tpo -c -o libkrb5_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-store-int.Tpo $(DEPDIR)/libkrb5_la-store-int.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='store-int.c' object='libkrb5_la-store-int.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c libkrb5_la-store_emem.lo: store_emem.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store_emem.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store_emem.Tpo -c -o libkrb5_la-store_emem.lo `test -f 'store_emem.c' || echo '$(srcdir)/'`store_emem.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-store_emem.Tpo $(DEPDIR)/libkrb5_la-store_emem.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='store_emem.c' object='libkrb5_la-store_emem.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store_emem.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store_emem.Tpo -c -o libkrb5_la-store_emem.lo `test -f 'store_emem.c' || echo '$(srcdir)/'`store_emem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-store_emem.Tpo $(DEPDIR)/libkrb5_la-store_emem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='store_emem.c' object='libkrb5_la-store_emem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store_emem.lo `test -f 'store_emem.c' || echo '$(srcdir)/'`store_emem.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store_emem.lo `test -f 'store_emem.c' || echo '$(srcdir)/'`store_emem.c libkrb5_la-store_fd.lo: store_fd.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store_fd.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store_fd.Tpo -c -o libkrb5_la-store_fd.lo `test -f 'store_fd.c' || echo '$(srcdir)/'`store_fd.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-store_fd.Tpo $(DEPDIR)/libkrb5_la-store_fd.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='store_fd.c' object='libkrb5_la-store_fd.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store_fd.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store_fd.Tpo -c -o libkrb5_la-store_fd.lo `test -f 'store_fd.c' || echo '$(srcdir)/'`store_fd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-store_fd.Tpo $(DEPDIR)/libkrb5_la-store_fd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='store_fd.c' object='libkrb5_la-store_fd.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store_fd.lo `test -f 'store_fd.c' || echo '$(srcdir)/'`store_fd.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store_fd.lo `test -f 'store_fd.c' || echo '$(srcdir)/'`store_fd.c libkrb5_la-store_mem.lo: store_mem.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store_mem.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store_mem.Tpo -c -o libkrb5_la-store_mem.lo `test -f 'store_mem.c' || echo '$(srcdir)/'`store_mem.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-store_mem.Tpo $(DEPDIR)/libkrb5_la-store_mem.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='store_mem.c' object='libkrb5_la-store_mem.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store_mem.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store_mem.Tpo -c -o libkrb5_la-store_mem.lo `test -f 'store_mem.c' || echo '$(srcdir)/'`store_mem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-store_mem.Tpo $(DEPDIR)/libkrb5_la-store_mem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='store_mem.c' object='libkrb5_la-store_mem.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store_mem.lo `test -f 'store_mem.c' || echo '$(srcdir)/'`store_mem.c + +libkrb5_la-store_sock.lo: store_sock.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-store_sock.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-store_sock.Tpo -c -o libkrb5_la-store_sock.lo `test -f 'store_sock.c' || echo '$(srcdir)/'`store_sock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-store_sock.Tpo $(DEPDIR)/libkrb5_la-store_sock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='store_sock.c' object='libkrb5_la-store_sock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store_mem.lo `test -f 'store_mem.c' || echo '$(srcdir)/'`store_mem.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-store_sock.lo `test -f 'store_sock.c' || echo '$(srcdir)/'`store_sock.c libkrb5_la-plugin.lo: plugin.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-plugin.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-plugin.Tpo -c -o libkrb5_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-plugin.Tpo $(DEPDIR)/libkrb5_la-plugin.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='plugin.c' object='libkrb5_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-plugin.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-plugin.Tpo -c -o libkrb5_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-plugin.Tpo $(DEPDIR)/libkrb5_la-plugin.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='plugin.c' object='libkrb5_la-plugin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c libkrb5_la-ticket.lo: ticket.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-ticket.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-ticket.Tpo -c -o libkrb5_la-ticket.lo `test -f 'ticket.c' || echo '$(srcdir)/'`ticket.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-ticket.Tpo $(DEPDIR)/libkrb5_la-ticket.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ticket.c' object='libkrb5_la-ticket.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-ticket.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-ticket.Tpo -c -o libkrb5_la-ticket.lo `test -f 'ticket.c' || echo '$(srcdir)/'`ticket.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-ticket.Tpo $(DEPDIR)/libkrb5_la-ticket.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ticket.c' object='libkrb5_la-ticket.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-ticket.lo `test -f 'ticket.c' || echo '$(srcdir)/'`ticket.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-ticket.lo `test -f 'ticket.c' || echo '$(srcdir)/'`ticket.c libkrb5_la-time.lo: time.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-time.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-time.Tpo -c -o libkrb5_la-time.lo `test -f 'time.c' || echo '$(srcdir)/'`time.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-time.Tpo $(DEPDIR)/libkrb5_la-time.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='time.c' object='libkrb5_la-time.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-time.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-time.Tpo -c -o libkrb5_la-time.lo `test -f 'time.c' || echo '$(srcdir)/'`time.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-time.Tpo $(DEPDIR)/libkrb5_la-time.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='time.c' object='libkrb5_la-time.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-time.lo `test -f 'time.c' || echo '$(srcdir)/'`time.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-time.lo `test -f 'time.c' || echo '$(srcdir)/'`time.c libkrb5_la-transited.lo: transited.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-transited.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-transited.Tpo -c -o libkrb5_la-transited.lo `test -f 'transited.c' || echo '$(srcdir)/'`transited.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-transited.Tpo $(DEPDIR)/libkrb5_la-transited.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='transited.c' object='libkrb5_la-transited.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-transited.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-transited.Tpo -c -o libkrb5_la-transited.lo `test -f 'transited.c' || echo '$(srcdir)/'`transited.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-transited.Tpo $(DEPDIR)/libkrb5_la-transited.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='transited.c' object='libkrb5_la-transited.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-transited.lo `test -f 'transited.c' || echo '$(srcdir)/'`transited.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-transited.lo `test -f 'transited.c' || echo '$(srcdir)/'`transited.c libkrb5_la-verify_init.lo: verify_init.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-verify_init.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-verify_init.Tpo -c -o libkrb5_la-verify_init.lo `test -f 'verify_init.c' || echo '$(srcdir)/'`verify_init.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-verify_init.Tpo $(DEPDIR)/libkrb5_la-verify_init.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='verify_init.c' object='libkrb5_la-verify_init.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-verify_init.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-verify_init.Tpo -c -o libkrb5_la-verify_init.lo `test -f 'verify_init.c' || echo '$(srcdir)/'`verify_init.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-verify_init.Tpo $(DEPDIR)/libkrb5_la-verify_init.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='verify_init.c' object='libkrb5_la-verify_init.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-verify_init.lo `test -f 'verify_init.c' || echo '$(srcdir)/'`verify_init.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-verify_init.lo `test -f 'verify_init.c' || echo '$(srcdir)/'`verify_init.c libkrb5_la-verify_user.lo: verify_user.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-verify_user.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-verify_user.Tpo -c -o libkrb5_la-verify_user.lo `test -f 'verify_user.c' || echo '$(srcdir)/'`verify_user.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-verify_user.Tpo $(DEPDIR)/libkrb5_la-verify_user.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='verify_user.c' object='libkrb5_la-verify_user.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-verify_user.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-verify_user.Tpo -c -o libkrb5_la-verify_user.lo `test -f 'verify_user.c' || echo '$(srcdir)/'`verify_user.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-verify_user.Tpo $(DEPDIR)/libkrb5_la-verify_user.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='verify_user.c' object='libkrb5_la-verify_user.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-verify_user.lo `test -f 'verify_user.c' || echo '$(srcdir)/'`verify_user.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-verify_user.lo `test -f 'verify_user.c' || echo '$(srcdir)/'`verify_user.c libkrb5_la-version.lo: version.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-version.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-version.Tpo -c -o libkrb5_la-version.lo `test -f 'version.c' || echo '$(srcdir)/'`version.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-version.Tpo $(DEPDIR)/libkrb5_la-version.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='version.c' object='libkrb5_la-version.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-version.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-version.Tpo -c -o libkrb5_la-version.lo `test -f 'version.c' || echo '$(srcdir)/'`version.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-version.Tpo $(DEPDIR)/libkrb5_la-version.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='version.c' object='libkrb5_la-version.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-version.lo `test -f 'version.c' || echo '$(srcdir)/'`version.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-version.lo `test -f 'version.c' || echo '$(srcdir)/'`version.c libkrb5_la-warn.lo: warn.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-warn.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-warn.Tpo -c -o libkrb5_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-warn.Tpo $(DEPDIR)/libkrb5_la-warn.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='warn.c' object='libkrb5_la-warn.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-warn.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-warn.Tpo -c -o libkrb5_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-warn.Tpo $(DEPDIR)/libkrb5_la-warn.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='warn.c' object='libkrb5_la-warn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c libkrb5_la-write_message.lo: write_message.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-write_message.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-write_message.Tpo -c -o libkrb5_la-write_message.lo `test -f 'write_message.c' || echo '$(srcdir)/'`write_message.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-write_message.Tpo $(DEPDIR)/libkrb5_la-write_message.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='write_message.c' object='libkrb5_la-write_message.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-write_message.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-write_message.Tpo -c -o libkrb5_la-write_message.lo `test -f 'write_message.c' || echo '$(srcdir)/'`write_message.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-write_message.Tpo $(DEPDIR)/libkrb5_la-write_message.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='write_message.c' object='libkrb5_la-write_message.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-write_message.lo `test -f 'write_message.c' || echo '$(srcdir)/'`write_message.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-write_message.lo `test -f 'write_message.c' || echo '$(srcdir)/'`write_message.c libkrb5_la-krb5_err.lo: krb5_err.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-krb5_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-krb5_err.Tpo -c -o libkrb5_la-krb5_err.lo `test -f 'krb5_err.c' || echo '$(srcdir)/'`krb5_err.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-krb5_err.Tpo $(DEPDIR)/libkrb5_la-krb5_err.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='krb5_err.c' object='libkrb5_la-krb5_err.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-krb5_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-krb5_err.Tpo -c -o libkrb5_la-krb5_err.lo `test -f 'krb5_err.c' || echo '$(srcdir)/'`krb5_err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-krb5_err.Tpo $(DEPDIR)/libkrb5_la-krb5_err.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='krb5_err.c' object='libkrb5_la-krb5_err.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-krb5_err.lo `test -f 'krb5_err.c' || echo '$(srcdir)/'`krb5_err.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-krb5_err.lo `test -f 'krb5_err.c' || echo '$(srcdir)/'`krb5_err.c libkrb5_la-krb_err.lo: krb_err.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-krb_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-krb_err.Tpo -c -o libkrb5_la-krb_err.lo `test -f 'krb_err.c' || echo '$(srcdir)/'`krb_err.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-krb_err.Tpo $(DEPDIR)/libkrb5_la-krb_err.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='krb_err.c' object='libkrb5_la-krb_err.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-krb_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-krb_err.Tpo -c -o libkrb5_la-krb_err.lo `test -f 'krb_err.c' || echo '$(srcdir)/'`krb_err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-krb_err.Tpo $(DEPDIR)/libkrb5_la-krb_err.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='krb_err.c' object='libkrb5_la-krb_err.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-krb_err.lo `test -f 'krb_err.c' || echo '$(srcdir)/'`krb_err.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-krb_err.lo `test -f 'krb_err.c' || echo '$(srcdir)/'`krb_err.c libkrb5_la-heim_err.lo: heim_err.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-heim_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-heim_err.Tpo -c -o libkrb5_la-heim_err.lo `test -f 'heim_err.c' || echo '$(srcdir)/'`heim_err.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-heim_err.Tpo $(DEPDIR)/libkrb5_la-heim_err.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='heim_err.c' object='libkrb5_la-heim_err.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-heim_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-heim_err.Tpo -c -o libkrb5_la-heim_err.lo `test -f 'heim_err.c' || echo '$(srcdir)/'`heim_err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-heim_err.Tpo $(DEPDIR)/libkrb5_la-heim_err.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='heim_err.c' object='libkrb5_la-heim_err.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-heim_err.lo `test -f 'heim_err.c' || echo '$(srcdir)/'`heim_err.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-heim_err.lo `test -f 'heim_err.c' || echo '$(srcdir)/'`heim_err.c libkrb5_la-k524_err.lo: k524_err.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-k524_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-k524_err.Tpo -c -o libkrb5_la-k524_err.lo `test -f 'k524_err.c' || echo '$(srcdir)/'`k524_err.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libkrb5_la-k524_err.Tpo $(DEPDIR)/libkrb5_la-k524_err.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='k524_err.c' object='libkrb5_la-k524_err.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libkrb5_la-k524_err.lo -MD -MP -MF $(DEPDIR)/libkrb5_la-k524_err.Tpo -c -o libkrb5_la-k524_err.lo `test -f 'k524_err.c' || echo '$(srcdir)/'`k524_err.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libkrb5_la-k524_err.Tpo $(DEPDIR)/libkrb5_la-k524_err.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k524_err.c' object='libkrb5_la-k524_err.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-k524_err.lo `test -f 'k524_err.c' || echo '$(srcdir)/'`k524_err.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libkrb5_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libkrb5_la-k524_err.lo `test -f 'k524_err.c' || echo '$(srcdir)/'`k524_err.c librfc3961_la-crc.lo: crc.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crc.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crc.Tpo -c -o librfc3961_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crc.Tpo $(DEPDIR)/librfc3961_la-crc.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crc.c' object='librfc3961_la-crc.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crc.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crc.Tpo -c -o librfc3961_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crc.Tpo $(DEPDIR)/librfc3961_la-crc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crc.c' object='librfc3961_la-crc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crc.lo `test -f 'crc.c' || echo '$(srcdir)/'`crc.c librfc3961_la-crypto.lo: crypto.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto.Tpo -c -o librfc3961_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto.Tpo $(DEPDIR)/librfc3961_la-crypto.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto.c' object='librfc3961_la-crypto.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto.Tpo -c -o librfc3961_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto.Tpo $(DEPDIR)/librfc3961_la-crypto.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto.c' object='librfc3961_la-crypto.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto.lo `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c -librfc3961_la-crypto-aes.lo: crypto-aes.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-aes.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-aes.Tpo -c -o librfc3961_la-crypto-aes.lo `test -f 'crypto-aes.c' || echo '$(srcdir)/'`crypto-aes.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-aes.Tpo $(DEPDIR)/librfc3961_la-crypto-aes.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-aes.c' object='librfc3961_la-crypto-aes.lo' libtool=yes @AMDEPBACKSLASH@ +librfc3961_la-crypto-aes-sha1.lo: crypto-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-aes-sha1.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-aes-sha1.Tpo -c -o librfc3961_la-crypto-aes-sha1.lo `test -f 'crypto-aes-sha1.c' || echo '$(srcdir)/'`crypto-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-aes-sha1.Tpo $(DEPDIR)/librfc3961_la-crypto-aes-sha1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-aes-sha1.c' object='librfc3961_la-crypto-aes-sha1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-aes.lo `test -f 'crypto-aes.c' || echo '$(srcdir)/'`crypto-aes.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-aes-sha1.lo `test -f 'crypto-aes-sha1.c' || echo '$(srcdir)/'`crypto-aes-sha1.c + +librfc3961_la-crypto-aes-sha2.lo: crypto-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-aes-sha2.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-aes-sha2.Tpo -c -o librfc3961_la-crypto-aes-sha2.lo `test -f 'crypto-aes-sha2.c' || echo '$(srcdir)/'`crypto-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-aes-sha2.Tpo $(DEPDIR)/librfc3961_la-crypto-aes-sha2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-aes-sha2.c' object='librfc3961_la-crypto-aes-sha2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-aes-sha2.lo `test -f 'crypto-aes-sha2.c' || echo '$(srcdir)/'`crypto-aes-sha2.c librfc3961_la-crypto-algs.lo: crypto-algs.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-algs.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-algs.Tpo -c -o librfc3961_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-algs.Tpo $(DEPDIR)/librfc3961_la-crypto-algs.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-algs.c' object='librfc3961_la-crypto-algs.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-algs.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-algs.Tpo -c -o librfc3961_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-algs.Tpo $(DEPDIR)/librfc3961_la-crypto-algs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-algs.c' object='librfc3961_la-crypto-algs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-algs.lo `test -f 'crypto-algs.c' || echo '$(srcdir)/'`crypto-algs.c librfc3961_la-crypto-arcfour.lo: crypto-arcfour.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-arcfour.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-arcfour.Tpo -c -o librfc3961_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-arcfour.Tpo $(DEPDIR)/librfc3961_la-crypto-arcfour.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-arcfour.c' object='librfc3961_la-crypto-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-arcfour.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-arcfour.Tpo -c -o librfc3961_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-arcfour.Tpo $(DEPDIR)/librfc3961_la-crypto-arcfour.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-arcfour.c' object='librfc3961_la-crypto-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-arcfour.lo `test -f 'crypto-arcfour.c' || echo '$(srcdir)/'`crypto-arcfour.c librfc3961_la-crypto-des.lo: crypto-des.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-des.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-des.Tpo -c -o librfc3961_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-des.Tpo $(DEPDIR)/librfc3961_la-crypto-des.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-des.c' object='librfc3961_la-crypto-des.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-des.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-des.Tpo -c -o librfc3961_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-des.Tpo $(DEPDIR)/librfc3961_la-crypto-des.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-des.c' object='librfc3961_la-crypto-des.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-des.lo `test -f 'crypto-des.c' || echo '$(srcdir)/'`crypto-des.c librfc3961_la-crypto-des-common.lo: crypto-des-common.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-des-common.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-des-common.Tpo -c -o librfc3961_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-des-common.Tpo $(DEPDIR)/librfc3961_la-crypto-des-common.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-des-common.c' object='librfc3961_la-crypto-des-common.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-des-common.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-des-common.Tpo -c -o librfc3961_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-des-common.Tpo $(DEPDIR)/librfc3961_la-crypto-des-common.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-des-common.c' object='librfc3961_la-crypto-des-common.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-des-common.lo `test -f 'crypto-des-common.c' || echo '$(srcdir)/'`crypto-des-common.c librfc3961_la-crypto-des3.lo: crypto-des3.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-des3.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-des3.Tpo -c -o librfc3961_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-des3.Tpo $(DEPDIR)/librfc3961_la-crypto-des3.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-des3.c' object='librfc3961_la-crypto-des3.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-des3.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-des3.Tpo -c -o librfc3961_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-des3.Tpo $(DEPDIR)/librfc3961_la-crypto-des3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-des3.c' object='librfc3961_la-crypto-des3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-des3.lo `test -f 'crypto-des3.c' || echo '$(srcdir)/'`crypto-des3.c librfc3961_la-crypto-evp.lo: crypto-evp.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-evp.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-evp.Tpo -c -o librfc3961_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-evp.Tpo $(DEPDIR)/librfc3961_la-crypto-evp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-evp.c' object='librfc3961_la-crypto-evp.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-evp.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-evp.Tpo -c -o librfc3961_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-evp.Tpo $(DEPDIR)/librfc3961_la-crypto-evp.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-evp.c' object='librfc3961_la-crypto-evp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-evp.lo `test -f 'crypto-evp.c' || echo '$(srcdir)/'`crypto-evp.c librfc3961_la-crypto-null.lo: crypto-null.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-null.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-null.Tpo -c -o librfc3961_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-null.Tpo $(DEPDIR)/librfc3961_la-crypto-null.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-null.c' object='librfc3961_la-crypto-null.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-null.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-null.Tpo -c -o librfc3961_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-null.Tpo $(DEPDIR)/librfc3961_la-crypto-null.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-null.c' object='librfc3961_la-crypto-null.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-null.lo `test -f 'crypto-null.c' || echo '$(srcdir)/'`crypto-null.c librfc3961_la-crypto-pk.lo: crypto-pk.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-pk.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-pk.Tpo -c -o librfc3961_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-pk.Tpo $(DEPDIR)/librfc3961_la-crypto-pk.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-pk.c' object='librfc3961_la-crypto-pk.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-pk.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-pk.Tpo -c -o librfc3961_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-pk.Tpo $(DEPDIR)/librfc3961_la-crypto-pk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-pk.c' object='librfc3961_la-crypto-pk.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-pk.lo `test -f 'crypto-pk.c' || echo '$(srcdir)/'`crypto-pk.c librfc3961_la-crypto-rand.lo: crypto-rand.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-rand.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-rand.Tpo -c -o librfc3961_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-rand.Tpo $(DEPDIR)/librfc3961_la-crypto-rand.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-rand.c' object='librfc3961_la-crypto-rand.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-rand.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-rand.Tpo -c -o librfc3961_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-rand.Tpo $(DEPDIR)/librfc3961_la-crypto-rand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-rand.c' object='librfc3961_la-crypto-rand.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-rand.lo `test -f 'crypto-rand.c' || echo '$(srcdir)/'`crypto-rand.c librfc3961_la-crypto-stubs.lo: crypto-stubs.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-stubs.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-stubs.Tpo -c -o librfc3961_la-crypto-stubs.lo `test -f 'crypto-stubs.c' || echo '$(srcdir)/'`crypto-stubs.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-crypto-stubs.Tpo $(DEPDIR)/librfc3961_la-crypto-stubs.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='crypto-stubs.c' object='librfc3961_la-crypto-stubs.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-crypto-stubs.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-crypto-stubs.Tpo -c -o librfc3961_la-crypto-stubs.lo `test -f 'crypto-stubs.c' || echo '$(srcdir)/'`crypto-stubs.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-crypto-stubs.Tpo $(DEPDIR)/librfc3961_la-crypto-stubs.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-stubs.c' object='librfc3961_la-crypto-stubs.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-stubs.lo `test -f 'crypto-stubs.c' || echo '$(srcdir)/'`crypto-stubs.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-crypto-stubs.lo `test -f 'crypto-stubs.c' || echo '$(srcdir)/'`crypto-stubs.c librfc3961_la-data.lo: data.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-data.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-data.Tpo -c -o librfc3961_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-data.Tpo $(DEPDIR)/librfc3961_la-data.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='data.c' object='librfc3961_la-data.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-data.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-data.Tpo -c -o librfc3961_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-data.Tpo $(DEPDIR)/librfc3961_la-data.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='data.c' object='librfc3961_la-data.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c + +librfc3961_la-enomem.lo: enomem.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-enomem.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-enomem.Tpo -c -o librfc3961_la-enomem.lo `test -f 'enomem.c' || echo '$(srcdir)/'`enomem.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-enomem.Tpo $(DEPDIR)/librfc3961_la-enomem.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='enomem.c' object='librfc3961_la-enomem.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-data.lo `test -f 'data.c' || echo '$(srcdir)/'`data.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-enomem.lo `test -f 'enomem.c' || echo '$(srcdir)/'`enomem.c librfc3961_la-error_string.lo: error_string.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-error_string.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-error_string.Tpo -c -o librfc3961_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-error_string.Tpo $(DEPDIR)/librfc3961_la-error_string.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='error_string.c' object='librfc3961_la-error_string.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-error_string.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-error_string.Tpo -c -o librfc3961_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-error_string.Tpo $(DEPDIR)/librfc3961_la-error_string.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='error_string.c' object='librfc3961_la-error_string.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-error_string.lo `test -f 'error_string.c' || echo '$(srcdir)/'`error_string.c librfc3961_la-keyblock.lo: keyblock.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-keyblock.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-keyblock.Tpo -c -o librfc3961_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-keyblock.Tpo $(DEPDIR)/librfc3961_la-keyblock.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='keyblock.c' object='librfc3961_la-keyblock.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-keyblock.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-keyblock.Tpo -c -o librfc3961_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-keyblock.Tpo $(DEPDIR)/librfc3961_la-keyblock.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='keyblock.c' object='librfc3961_la-keyblock.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-keyblock.lo `test -f 'keyblock.c' || echo '$(srcdir)/'`keyblock.c librfc3961_la-n-fold.lo: n-fold.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-n-fold.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-n-fold.Tpo -c -o librfc3961_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-n-fold.Tpo $(DEPDIR)/librfc3961_la-n-fold.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='n-fold.c' object='librfc3961_la-n-fold.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-n-fold.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-n-fold.Tpo -c -o librfc3961_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-n-fold.Tpo $(DEPDIR)/librfc3961_la-n-fold.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='n-fold.c' object='librfc3961_la-n-fold.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-n-fold.lo `test -f 'n-fold.c' || echo '$(srcdir)/'`n-fold.c librfc3961_la-salt.lo: salt.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt.Tpo -c -o librfc3961_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-salt.Tpo $(DEPDIR)/librfc3961_la-salt.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt.c' object='librfc3961_la-salt.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt.Tpo -c -o librfc3961_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-salt.Tpo $(DEPDIR)/librfc3961_la-salt.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt.c' object='librfc3961_la-salt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt.lo `test -f 'salt.c' || echo '$(srcdir)/'`salt.c -librfc3961_la-salt-aes.lo: salt-aes.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-aes.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-aes.Tpo -c -o librfc3961_la-salt-aes.lo `test -f 'salt-aes.c' || echo '$(srcdir)/'`salt-aes.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-salt-aes.Tpo $(DEPDIR)/librfc3961_la-salt-aes.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-aes.c' object='librfc3961_la-salt-aes.lo' libtool=yes @AMDEPBACKSLASH@ +librfc3961_la-salt-aes-sha1.lo: salt-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-aes-sha1.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-aes-sha1.Tpo -c -o librfc3961_la-salt-aes-sha1.lo `test -f 'salt-aes-sha1.c' || echo '$(srcdir)/'`salt-aes-sha1.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-salt-aes-sha1.Tpo $(DEPDIR)/librfc3961_la-salt-aes-sha1.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-aes-sha1.c' object='librfc3961_la-salt-aes-sha1.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-aes.lo `test -f 'salt-aes.c' || echo '$(srcdir)/'`salt-aes.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-aes-sha1.lo `test -f 'salt-aes-sha1.c' || echo '$(srcdir)/'`salt-aes-sha1.c + +librfc3961_la-salt-aes-sha2.lo: salt-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-aes-sha2.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-aes-sha2.Tpo -c -o librfc3961_la-salt-aes-sha2.lo `test -f 'salt-aes-sha2.c' || echo '$(srcdir)/'`salt-aes-sha2.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-salt-aes-sha2.Tpo $(DEPDIR)/librfc3961_la-salt-aes-sha2.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-aes-sha2.c' object='librfc3961_la-salt-aes-sha2.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-aes-sha2.lo `test -f 'salt-aes-sha2.c' || echo '$(srcdir)/'`salt-aes-sha2.c librfc3961_la-salt-arcfour.lo: salt-arcfour.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-arcfour.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-arcfour.Tpo -c -o librfc3961_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-salt-arcfour.Tpo $(DEPDIR)/librfc3961_la-salt-arcfour.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-arcfour.c' object='librfc3961_la-salt-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-arcfour.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-arcfour.Tpo -c -o librfc3961_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-salt-arcfour.Tpo $(DEPDIR)/librfc3961_la-salt-arcfour.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-arcfour.c' object='librfc3961_la-salt-arcfour.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-arcfour.lo `test -f 'salt-arcfour.c' || echo '$(srcdir)/'`salt-arcfour.c librfc3961_la-salt-des.lo: salt-des.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-des.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-des.Tpo -c -o librfc3961_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-salt-des.Tpo $(DEPDIR)/librfc3961_la-salt-des.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-des.c' object='librfc3961_la-salt-des.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-des.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-des.Tpo -c -o librfc3961_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-salt-des.Tpo $(DEPDIR)/librfc3961_la-salt-des.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-des.c' object='librfc3961_la-salt-des.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-des.lo `test -f 'salt-des.c' || echo '$(srcdir)/'`salt-des.c librfc3961_la-salt-des3.lo: salt-des3.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-des3.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-des3.Tpo -c -o librfc3961_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-salt-des3.Tpo $(DEPDIR)/librfc3961_la-salt-des3.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='salt-des3.c' object='librfc3961_la-salt-des3.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-salt-des3.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-salt-des3.Tpo -c -o librfc3961_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-salt-des3.Tpo $(DEPDIR)/librfc3961_la-salt-des3.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='salt-des3.c' object='librfc3961_la-salt-des3.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-salt-des3.lo `test -f 'salt-des3.c' || echo '$(srcdir)/'`salt-des3.c + +librfc3961_la-sp800-108-kdf.lo: sp800-108-kdf.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-sp800-108-kdf.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-sp800-108-kdf.Tpo -c -o librfc3961_la-sp800-108-kdf.lo `test -f 'sp800-108-kdf.c' || echo '$(srcdir)/'`sp800-108-kdf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-sp800-108-kdf.Tpo $(DEPDIR)/librfc3961_la-sp800-108-kdf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='sp800-108-kdf.c' object='librfc3961_la-sp800-108-kdf.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-sp800-108-kdf.lo `test -f 'sp800-108-kdf.c' || echo '$(srcdir)/'`sp800-108-kdf.c librfc3961_la-store-int.lo: store-int.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-store-int.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-store-int.Tpo -c -o librfc3961_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-store-int.Tpo $(DEPDIR)/librfc3961_la-store-int.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='store-int.c' object='librfc3961_la-store-int.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-store-int.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-store-int.Tpo -c -o librfc3961_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-store-int.Tpo $(DEPDIR)/librfc3961_la-store-int.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='store-int.c' object='librfc3961_la-store-int.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-store-int.lo `test -f 'store-int.c' || echo '$(srcdir)/'`store-int.c librfc3961_la-warn.lo: warn.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-warn.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-warn.Tpo -c -o librfc3961_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/librfc3961_la-warn.Tpo $(DEPDIR)/librfc3961_la-warn.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='warn.c' object='librfc3961_la-warn.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT librfc3961_la-warn.lo -MD -MP -MF $(DEPDIR)/librfc3961_la-warn.Tpo -c -o librfc3961_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/librfc3961_la-warn.Tpo $(DEPDIR)/librfc3961_la-warn.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='warn.c' object='librfc3961_la-warn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(librfc3961_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o librfc3961_la-warn.lo `test -f 'warn.c' || echo '$(srcdir)/'`warn.c mostlyclean-libtool: -rm -f *.lo @@ -2506,11 +3273,18 @@ -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" - @list=''; test -n "$(man3dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -2539,16 +3313,21 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) install-man5: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man5dir)" || $(MKDIR_P) "$(DESTDIR)$(man5dir)" - @list=''; test -n "$(man5dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ - l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.5[a-z]*$$/p'; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man5dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man5dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man5dir)" || 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 '/\.5[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -2577,16 +3356,64 @@ sed -n '/\.5[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^5][0-9a-z]*$$,5,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man5dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man5dir)" && rm -f $$files; } -install-man8: $(man_MANS) + dir='$(DESTDIR)$(man5dir)'; $(am__uninstall_files_from_dir) +install-man7: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" - @list=''; test -n "$(man8dir)" || exit 0; \ - { for i in $$list; do echo "$$i"; done; \ + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man7dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man7dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man7dir)" || 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 '/\.7[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,^[^7][0-9a-z]*$$,7,;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)$(man7dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man7dir)/$$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)$(man7dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man7dir)" || exit $$?; }; \ + done; } + +uninstall-man7: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man7dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ - sed -n '/\.8[a-z]*$$/p'; \ + sed -n '/\.7[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^7][0-9a-z]*$$,7,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man7dir)'; $(am__uninstall_files_from_dir) +install-man8: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man8dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man8dir)" || 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 '/\.8[a-z]*$$/p'; \ + fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ @@ -2615,13 +3442,14 @@ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) install-dist_includeHEADERS: $(dist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(dist_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"; \ @@ -2635,13 +3463,14 @@ @$(NORMAL_UNINSTALL) @list='$(dist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-krb5HEADERS: $(krb5_HEADERS) @$(NORMAL_INSTALL) - test -z "$(krb5dir)" || $(MKDIR_P) "$(DESTDIR)$(krb5dir)" @list='$(krb5_HEADERS)'; test -n "$(krb5dir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(krb5dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(krb5dir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -2655,13 +3484,14 @@ @$(NORMAL_UNINSTALL) @list='$(krb5_HEADERS)'; test -n "$(krb5dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(krb5dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(krb5dir)" && rm -f $$files + dir='$(DESTDIR)$(krb5dir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -2675,30 +3505,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -2710,15 +3527,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -2727,116 +3540,359 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - skipped="($$skip tests were not run)"; \ + color_start= color_end=; \ fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -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 + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) $(check_DATA) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) $(check_DATA) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +aes-test.log: aes-test$(EXEEXT) + @p='aes-test$(EXEEXT)'; \ + b='aes-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +derived-key-test.log: derived-key-test$(EXEEXT) + @p='derived-key-test$(EXEEXT)'; \ + b='derived-key-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +n-fold-test.log: n-fold-test$(EXEEXT) + @p='n-fold-test$(EXEEXT)'; \ + b='n-fold-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +parse-name-test.log: parse-name-test$(EXEEXT) + @p='parse-name-test$(EXEEXT)'; \ + b='parse-name-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +pseudo-random-test.log: pseudo-random-test$(EXEEXT) + @p='pseudo-random-test$(EXEEXT)'; \ + b='pseudo-random-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +store-test.log: store-test$(EXEEXT) + @p='store-test$(EXEEXT)'; \ + b='store-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +string-to-key-test.log: string-to-key-test$(EXEEXT) + @p='string-to-key-test$(EXEEXT)'; \ + b='string-to-key-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_acl.log: test_acl$(EXEEXT) + @p='test_acl$(EXEEXT)'; \ + b='test_acl'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_addr.log: test_addr$(EXEEXT) + @p='test_addr$(EXEEXT)'; \ + b='test_addr'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_cc.log: test_cc$(EXEEXT) + @p='test_cc$(EXEEXT)'; \ + b='test_cc'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_config.log: test_config$(EXEEXT) + @p='test_config$(EXEEXT)'; \ + b='test_config'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_fx.log: test_fx$(EXEEXT) + @p='test_fx$(EXEEXT)'; \ + b='test_fx'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_prf.log: test_prf$(EXEEXT) + @p='test_prf$(EXEEXT)'; \ + b='test_prf'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_store.log: test_store$(EXEEXT) + @p='test_store$(EXEEXT)'; \ + b='test_store'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_crypto_wrapping.log: test_crypto_wrapping$(EXEEXT) + @p='test_crypto_wrapping$(EXEEXT)'; \ + b='test_crypto_wrapping'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_keytab.log: test_keytab$(EXEEXT) + @p='test_keytab$(EXEEXT)'; \ + b='test_keytab'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_mem.log: test_mem$(EXEEXT) + @p='test_mem$(EXEEXT)'; \ + b='test_mem'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_pac.log: test_pac$(EXEEXT) + @p='test_pac$(EXEEXT)'; \ + b='test_pac'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_plugin.log: test_plugin$(EXEEXT) + @p='test_plugin$(EXEEXT)'; \ + b='test_plugin'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_princ.log: test_princ$(EXEEXT) + @p='test_princ$(EXEEXT)'; \ + b='test_princ'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_pkinit_dh2key.log: test_pkinit_dh2key$(EXEEXT) + @p='test_pkinit_dh2key$(EXEEXT)'; \ + b='test_pkinit_dh2key'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_pknistkdf.log: test_pknistkdf$(EXEEXT) + @p='test_pknistkdf$(EXEEXT)'; \ + b='test_pknistkdf'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_time.log: test_time$(EXEEXT) + @p='test_time$(EXEEXT)'; \ + b='test_time'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_expand_toks.log: test_expand_toks$(EXEEXT) + @p='test_expand_toks$(EXEEXT)'; \ + b='test_expand_toks'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test_x500.log: test_x500$(EXEEXT) + @p='test_x500$(EXEEXT)'; \ + b='test_x500'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -2873,12 +3929,14 @@ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(check_DATA) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS) \ +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(HEADERS) \ all-local install-binPROGRAMS: install-libLTLIBRARIES +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(krb5dir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man5dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(krb5dir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -2891,11 +3949,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -2914,7 +3980,202 @@ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/aes-test.Po + -rm -f ./$(DEPDIR)/derived-key-test.Po + -rm -f ./$(DEPDIR)/krbhst-test.Po + -rm -f ./$(DEPDIR)/libkrb5_la-acache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-acl.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-add_et_list.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-addr_families.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-aname_to_localname.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-appdefault.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-asn1_glue.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-auth_context.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-build_ap_req.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-build_auth.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-cache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-changepw.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-codec.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-config_file.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-constants.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-context.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-convert_creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-copy_host_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crc.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-aes-sha1.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-aes-sha2.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-algs.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-arcfour.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-des-common.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-des.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-des3.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-evp.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-null.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-pk.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-rand.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-data.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-db_plugin.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-dcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-deprecated.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-digest.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-doxygen.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-eai_to_heim_errno.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-enomem.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-error_string.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-expand_hostname.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-expand_path.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-fast.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-fcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-free.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-free_host_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-generate_seq_number.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-generate_subkey.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_addrs.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_cred.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_default_principal.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_default_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_for_creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_host_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_in_tkt.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_port.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-heim_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-init_creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-init_creds_pw.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-k524_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-kcm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keyblock.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_any.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_file.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_keyfile.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_memory.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-krb5_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-krb_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-krbhst.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-kuserok.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-log.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-misc.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mit_glue.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_error.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_priv.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_rep.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_req.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_req_ext.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_safe.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-n-fold.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-net_read.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-net_write.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pac.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-padata.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pkinit-ec.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pkinit.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-plugin.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-principal.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-prog_setup.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-prompter_posix.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_cred.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_error.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_priv.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_rep.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_req.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_safe.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-read_message.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-recvauth.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-replay.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-aes-sha1.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-aes-sha2.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-arcfour.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-des.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-des3.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-scache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-send_to_kdc.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-sendauth.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-set_default_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-sock_principal.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-sp800-108-kdf.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store-int.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_emem.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_fd.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_mem.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_sock.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-ticket.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-time.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-transited.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-verify_init.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-verify_user.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-version.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-warn.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-write_message.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crc.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-aes-sha1.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-aes-sha2.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-algs.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-arcfour.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-des-common.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-des.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-des3.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-evp.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-null.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-pk.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-rand.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-stubs.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-data.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-enomem.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-error_string.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-keyblock.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-n-fold.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-aes-sha1.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-aes-sha2.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-arcfour.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-des.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-des3.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-sp800-108-kdf.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-store-int.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-warn.Plo + -rm -f ./$(DEPDIR)/n-fold-test.Po + -rm -f ./$(DEPDIR)/parse-name-test.Po + -rm -f ./$(DEPDIR)/pseudo-random-test.Po + -rm -f ./$(DEPDIR)/store-test.Po + -rm -f ./$(DEPDIR)/string-to-key-test.Po + -rm -f ./$(DEPDIR)/test_acl.Po + -rm -f ./$(DEPDIR)/test_addr.Po + -rm -f ./$(DEPDIR)/test_alname.Po + -rm -f ./$(DEPDIR)/test_ap-req.Po + -rm -f ./$(DEPDIR)/test_canon.Po + -rm -f ./$(DEPDIR)/test_cc.Po + -rm -f ./$(DEPDIR)/test_config.Po + -rm -f ./$(DEPDIR)/test_crypto.Po + -rm -f ./$(DEPDIR)/test_crypto_wrapping.Po + -rm -f ./$(DEPDIR)/test_expand_toks.Po + -rm -f ./$(DEPDIR)/test_forward.Po + -rm -f ./$(DEPDIR)/test_fx.Po + -rm -f ./$(DEPDIR)/test_get_addrs.Po + -rm -f ./$(DEPDIR)/test_gic.Po + -rm -f ./$(DEPDIR)/test_hostname.Po + -rm -f ./$(DEPDIR)/test_keytab.Po + -rm -f ./$(DEPDIR)/test_kuserok.Po + -rm -f ./$(DEPDIR)/test_mem.Po + -rm -f ./$(DEPDIR)/test_pac.Po + -rm -f ./$(DEPDIR)/test_pkinit_dh2key.Po + -rm -f ./$(DEPDIR)/test_pknistkdf.Po + -rm -f ./$(DEPDIR)/test_plugin.Po + -rm -f ./$(DEPDIR)/test_prf.Po + -rm -f ./$(DEPDIR)/test_princ.Po + -rm -f ./$(DEPDIR)/test_renew.Po + -rm -f ./$(DEPDIR)/test_rfc3961.Po + -rm -f ./$(DEPDIR)/test_set_kvno0.Po + -rm -f ./$(DEPDIR)/test_store.Po + -rm -f ./$(DEPDIR)/test_time.Po + -rm -f ./$(DEPDIR)/test_x500.Po + -rm -f ./$(DEPDIR)/verify_krb5_conf.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -2939,9 +4200,9 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -2950,7 +4211,7 @@ install-info-am: -install-man: install-man3 install-man5 install-man8 +install-man: install-man3 install-man5 install-man7 install-man8 install-pdf: install-pdf-am @@ -2963,7 +4224,202 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/aes-test.Po + -rm -f ./$(DEPDIR)/derived-key-test.Po + -rm -f ./$(DEPDIR)/krbhst-test.Po + -rm -f ./$(DEPDIR)/libkrb5_la-acache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-acl.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-add_et_list.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-addr_families.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-aname_to_localname.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-appdefault.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-asn1_glue.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-auth_context.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-build_ap_req.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-build_auth.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-cache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-changepw.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-codec.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-config_file.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-constants.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-context.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-convert_creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-copy_host_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crc.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-aes-sha1.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-aes-sha2.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-algs.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-arcfour.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-des-common.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-des.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-des3.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-evp.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-null.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-pk.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto-rand.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-crypto.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-data.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-db_plugin.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-dcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-deprecated.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-digest.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-doxygen.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-eai_to_heim_errno.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-enomem.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-error_string.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-expand_hostname.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-expand_path.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-fast.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-fcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-free.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-free_host_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-generate_seq_number.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-generate_subkey.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_addrs.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_cred.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_default_principal.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_default_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_for_creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_host_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_in_tkt.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-get_port.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-heim_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-init_creds.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-init_creds_pw.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-k524_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-kcm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keyblock.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_any.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_file.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_keyfile.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-keytab_memory.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-krb5_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-krb_err.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-krbhst.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-kuserok.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-log.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-misc.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mit_glue.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_error.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_priv.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_rep.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_req.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_req_ext.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-mk_safe.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-n-fold.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-net_read.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-net_write.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pac.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-padata.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pcache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pkinit-ec.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-pkinit.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-plugin.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-principal.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-prog_setup.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-prompter_posix.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_cred.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_error.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_priv.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_rep.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_req.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-rd_safe.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-read_message.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-recvauth.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-replay.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-aes-sha1.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-aes-sha2.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-arcfour.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-des.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt-des3.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-salt.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-scache.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-send_to_kdc.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-sendauth.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-set_default_realm.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-sock_principal.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-sp800-108-kdf.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store-int.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_emem.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_fd.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_mem.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-store_sock.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-ticket.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-time.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-transited.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-verify_init.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-verify_user.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-version.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-warn.Plo + -rm -f ./$(DEPDIR)/libkrb5_la-write_message.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crc.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-aes-sha1.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-aes-sha2.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-algs.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-arcfour.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-des-common.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-des.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-des3.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-evp.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-null.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-pk.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-rand.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto-stubs.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-crypto.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-data.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-enomem.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-error_string.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-keyblock.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-n-fold.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-aes-sha1.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-aes-sha2.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-arcfour.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-des.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt-des3.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-salt.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-sp800-108-kdf.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-store-int.Plo + -rm -f ./$(DEPDIR)/librfc3961_la-warn.Plo + -rm -f ./$(DEPDIR)/n-fold-test.Po + -rm -f ./$(DEPDIR)/parse-name-test.Po + -rm -f ./$(DEPDIR)/pseudo-random-test.Po + -rm -f ./$(DEPDIR)/store-test.Po + -rm -f ./$(DEPDIR)/string-to-key-test.Po + -rm -f ./$(DEPDIR)/test_acl.Po + -rm -f ./$(DEPDIR)/test_addr.Po + -rm -f ./$(DEPDIR)/test_alname.Po + -rm -f ./$(DEPDIR)/test_ap-req.Po + -rm -f ./$(DEPDIR)/test_canon.Po + -rm -f ./$(DEPDIR)/test_cc.Po + -rm -f ./$(DEPDIR)/test_config.Po + -rm -f ./$(DEPDIR)/test_crypto.Po + -rm -f ./$(DEPDIR)/test_crypto_wrapping.Po + -rm -f ./$(DEPDIR)/test_expand_toks.Po + -rm -f ./$(DEPDIR)/test_forward.Po + -rm -f ./$(DEPDIR)/test_fx.Po + -rm -f ./$(DEPDIR)/test_get_addrs.Po + -rm -f ./$(DEPDIR)/test_gic.Po + -rm -f ./$(DEPDIR)/test_hostname.Po + -rm -f ./$(DEPDIR)/test_keytab.Po + -rm -f ./$(DEPDIR)/test_kuserok.Po + -rm -f ./$(DEPDIR)/test_mem.Po + -rm -f ./$(DEPDIR)/test_pac.Po + -rm -f ./$(DEPDIR)/test_pkinit_dh2key.Po + -rm -f ./$(DEPDIR)/test_pknistkdf.Po + -rm -f ./$(DEPDIR)/test_plugin.Po + -rm -f ./$(DEPDIR)/test_prf.Po + -rm -f ./$(DEPDIR)/test_princ.Po + -rm -f ./$(DEPDIR)/test_renew.Po + -rm -f ./$(DEPDIR)/test_rfc3961.Po + -rm -f ./$(DEPDIR)/test_set_kvno0.Po + -rm -f ./$(DEPDIR)/test_store.Po + -rm -f ./$(DEPDIR)/test_time.Po + -rm -f ./$(DEPDIR)/test_x500.Po + -rm -f ./$(DEPDIR)/verify_krb5_conf.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -2985,50 +4441,64 @@ uninstall-nodist_includeHEADERS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -uninstall-man: uninstall-man3 uninstall-man5 uninstall-man8 - -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-binPROGRAMS clean-checkPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool \ - clean-noinstLTLIBRARIES clean-noinstPROGRAMS ctags dist-hook \ - 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-data-hook \ - install-dist_includeHEADERS install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ - install-html-am install-info install-info-am \ - install-krb5HEADERS install-libLTLIBRARIES install-man \ - install-man3 install-man5 install-man8 \ - install-nodist_includeHEADERS install-pdf install-pdf-am \ - install-ps install-ps-am install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ +uninstall-man: uninstall-man3 uninstall-man5 uninstall-man7 \ + uninstall-man8 + +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstLTLIBRARIES clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dist_includeHEADERS \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-exec-local install-html install-html-am install-info \ + install-info-am install-krb5HEADERS install-libLTLIBRARIES \ + install-man install-man3 install-man5 install-man7 \ + install-man8 install-nodist_includeHEADERS 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-dist_includeHEADERS uninstall-hook \ - uninstall-krb5HEADERS uninstall-libLTLIBRARIES uninstall-man \ - uninstall-man3 uninstall-man5 uninstall-man8 \ - uninstall-nodist_includeHEADERS + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_includeHEADERS \ + uninstall-hook uninstall-krb5HEADERS uninstall-libLTLIBRARIES \ + uninstall-man uninstall-man3 uninstall-man5 uninstall-man7 \ + uninstall-man8 uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-exec-hook: install-suid-programs +all-local: codesign-all -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -3036,7 +4506,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -3081,11 +4551,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -3093,6 +4572,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -3135,6 +4616,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -3148,13 +4642,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -3185,13 +4679,14 @@ fi ; \ done -$(libkrb5_la_OBJECTS) $(verify_krb5_conf_OBJECTS) $(librfc3961_la_OBJECTS): $(srcdir)/krb5-protos.h $(srcdir)/krb5-private.h krb5_err.h heim_err.h k524_err.h krb5_err.h krb_err.h k524_err.h +$(ALL_OBJECTS): $(srcdir)/krb5-protos.h $(srcdir)/krb5-private.h +$(ALL_OBJECTS): krb5_err.h heim_err.h k524_err.h krb5_err.h krb_err.h k524_err.h -$(srcdir)/krb5-protos.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -E KRB5_LIB -q -P comment -o krb5-protos.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-protos.h +$(srcdir)/krb5-protos.h: $(headerdeps) + @cd $(srcdir) && perl ../../cf/make-proto.pl -E KRB5_LIB -q -P comment -o krb5-protos.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-protos.h -$(srcdir)/krb5-private.h: - cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p krb5-private.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-private.h +$(srcdir)/krb5-private.h: $(headerdeps) + @cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -p krb5-private.h $(dist_libkrb5_la_SOURCES) || rm -f krb5-private.h $(libkrb5_la_OBJECTS): krb5_err.h krb_err.h heim_err.h k524_err.h diff --git a/crypto/heimdal/lib/krb5/NTMakefile b/crypto/heimdal/lib/krb5/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/NTMakefile @@ -0,0 +1,524 @@ +######################################################################## +# +# Copyright (c) 2009 - 2016, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\krb5 + +!include ../../windows/NTMakefile.w32 + +libkrb5_OBJS = \ + $(OBJ)\acache.obj \ + $(OBJ)\acl.obj \ + $(OBJ)\add_et_list.obj \ + $(OBJ)\addr_families.obj \ + $(OBJ)\aname_to_localname.obj \ + $(OBJ)\appdefault.obj \ + $(OBJ)\asn1_glue.obj \ + $(OBJ)\auth_context.obj \ + $(OBJ)\build_ap_req.obj \ + $(OBJ)\build_auth.obj \ + $(OBJ)\cache.obj \ + $(OBJ)\changepw.obj \ + $(OBJ)\codec.obj \ + $(OBJ)\config_file.obj \ + $(OBJ)\config_reg.obj \ + $(OBJ)\constants.obj \ + $(OBJ)\context.obj \ + $(OBJ)\convert_creds.obj \ + $(OBJ)\copy_host_realm.obj \ + $(OBJ)\crc.obj \ + $(OBJ)\creds.obj \ + $(OBJ)\crypto.obj \ + $(OBJ)\crypto-aes-sha1.obj \ + $(OBJ)\crypto-aes-sha2.obj \ + $(OBJ)\crypto-algs.obj \ + $(OBJ)\crypto-arcfour.obj \ + $(OBJ)\crypto-des-common.obj \ + $(OBJ)\crypto-des.obj \ + $(OBJ)\crypto-des3.obj \ + $(OBJ)\crypto-evp.obj \ + $(OBJ)\crypto-null.obj \ + $(OBJ)\crypto-pk.obj \ + $(OBJ)\crypto-rand.obj \ + $(OBJ)\data.obj \ + $(OBJ)\dcache.obj \ + $(OBJ)\db_plugin.obj \ + $(OBJ)\deprecated.obj \ + $(OBJ)\digest.obj \ + $(OBJ)\dll.obj \ + $(OBJ)\eai_to_heim_errno.obj \ + $(OBJ)\enomem.obj \ + $(OBJ)\error_string.obj \ + $(OBJ)\expand_hostname.obj \ + $(OBJ)\expand_path.obj \ + $(OBJ)\fast.obj \ + $(OBJ)\fcache.obj \ + $(OBJ)\free.obj \ + $(OBJ)\free_host_realm.obj \ + $(OBJ)\generate_seq_number.obj \ + $(OBJ)\generate_subkey.obj \ + $(OBJ)\get_addrs.obj \ + $(OBJ)\get_cred.obj \ + $(OBJ)\get_default_principal.obj \ + $(OBJ)\get_default_realm.obj \ + $(OBJ)\get_for_creds.obj \ + $(OBJ)\get_host_realm.obj \ + $(OBJ)\get_in_tkt.obj \ + $(OBJ)\get_port.obj \ + $(OBJ)\init_creds.obj \ + $(OBJ)\init_creds_pw.obj \ + $(OBJ)\kcm.obj \ + $(OBJ)\keyblock.obj \ + $(OBJ)\keytab.obj \ + $(OBJ)\keytab_any.obj \ + $(OBJ)\keytab_file.obj \ + $(OBJ)\keytab_keyfile.obj \ + $(OBJ)\keytab_memory.obj \ + $(OBJ)\krbhst.obj \ + $(OBJ)\kuserok.obj \ + $(OBJ)\log.obj \ + $(OBJ)\mcache.obj \ + $(OBJ)\misc.obj \ + $(OBJ)\mit_glue.obj \ + $(OBJ)\mk_error.obj \ + $(OBJ)\mk_priv.obj \ + $(OBJ)\mk_rep.obj \ + $(OBJ)\mk_req.obj \ + $(OBJ)\mk_req_ext.obj \ + $(OBJ)\mk_safe.obj \ + $(OBJ)\net_read.obj \ + $(OBJ)\net_write.obj \ + $(OBJ)\n-fold.obj \ + $(OBJ)\pac.obj \ + $(OBJ)\padata.obj \ + $(OBJ)\pcache.obj \ + $(OBJ)\pkinit.obj \ + $(OBJ)\pkinit-ec.obj \ + $(OBJ)\plugin.obj \ + $(OBJ)\principal.obj \ + $(OBJ)\prog_setup.obj \ + $(OBJ)\prompter_posix.obj \ + $(OBJ)\rd_cred.obj \ + $(OBJ)\rd_error.obj \ + $(OBJ)\rd_priv.obj \ + $(OBJ)\rd_rep.obj \ + $(OBJ)\rd_req.obj \ + $(OBJ)\rd_safe.obj \ + $(OBJ)\read_message.obj \ + $(OBJ)\recvauth.obj \ + $(OBJ)\replay.obj \ + $(OBJ)\salt-aes-sha1.obj \ + $(OBJ)\salt-aes-sha2.obj \ + $(OBJ)\salt-arcfour.obj \ + $(OBJ)\salt-des.obj \ + $(OBJ)\salt-des3.obj \ + $(OBJ)\salt.obj \ + $(OBJ)\scache.obj \ + $(OBJ)\send_to_kdc.obj \ + $(OBJ)\sendauth.obj \ + $(OBJ)\set_default_realm.obj \ + $(OBJ)\sock_principal.obj \ + $(OBJ)\sp800-108-kdf.obj \ + $(OBJ)\store.obj \ + $(OBJ)\store-int.obj \ + $(OBJ)\store_emem.obj \ + $(OBJ)\store_fd.obj \ + $(OBJ)\store_mem.obj \ + $(OBJ)\store_sock.obj \ + $(OBJ)\ticket.obj \ + $(OBJ)\time.obj \ + $(OBJ)\transited.obj \ + $(OBJ)\verify_init.obj \ + $(OBJ)\verify_user.obj \ + $(OBJ)\version.obj \ + $(OBJ)\warn.obj \ + $(OBJ)\write_message.obj + +libkrb5_gen_OBJS= \ + $(OBJ)\krb5_err.obj \ + $(OBJ)\krb_err.obj \ + $(OBJ)\heim_err.obj \ + $(OBJ)\k524_err.obj + +INCFILES= \ + $(INCDIR)\heim_err.h \ + $(INCDIR)\k524_err.h \ + $(INCDIR)\kcm.h \ + $(INCDIR)\krb_err.h \ + $(INCDIR)\krb5.h \ + $(INCDIR)\krb5_ccapi.h \ + $(INCDIR)\krb5_err.h \ + $(INCDIR)\krb5_locl.h \ + $(INCDIR)\krb5-protos.h \ + $(INCDIR)\krb5-private.h \ + $(INCDIR)\krb5-v4compat.h \ + $(INCDIR)\crypto.h + +all:: $(INCFILES) + +clean:: + -$(RM) $(INCFILES) + +dist_libkrb5_la_SOURCES = \ + acache.c \ + acl.c \ + add_et_list.c \ + addr_families.c \ + aname_to_localname.c \ + appdefault.c \ + asn1_glue.c \ + auth_context.c \ + build_ap_req.c \ + build_auth.c \ + cache.c \ + changepw.c \ + codec.c \ + config_file.c \ + config_reg.c \ + constants.c \ + context.c \ + copy_host_realm.c \ + crc.c \ + creds.c \ + crypto.c \ + crypto.h \ + crypto-aes-sha1.c \ + crypto-aes-sha2.c \ + crypto-algs.c \ + crypto-arcfour.c \ + crypto-des.c \ + crypto-des-common.c \ + crypto-des3.c \ + crypto-evp.c \ + crypto-pk.c \ + crypto-rand.c \ + db_plugin.c \ + doxygen.c \ + data.c \ + dcache.c \ + deprecated.c \ + digest.c \ + eai_to_heim_errno.c \ + enomem.c \ + error_string.c \ + expand_hostname.c \ + expand_path.c \ + fast.c \ + fcache.c \ + free.c \ + free_host_realm.c \ + generate_seq_number.c \ + generate_subkey.c \ + get_addrs.c \ + get_cred.c \ + get_default_principal.c \ + get_default_realm.c \ + get_for_creds.c \ + get_host_realm.c \ + get_in_tkt.c \ + get_port.c \ + init_creds.c \ + init_creds_pw.c \ + kcm.c \ + kcm.h \ + keyblock.c \ + keytab.c \ + keytab_any.c \ + keytab_file.c \ + keytab_keyfile.c \ + keytab_memory.c \ + krb5_locl.h \ + krb5-v4compat.h \ + krbhst.c \ + kuserok.c \ + log.c \ + mcache.c \ + misc.c \ + mk_error.c \ + mk_priv.c \ + mk_rep.c \ + mk_req.c \ + mk_req_ext.c \ + mk_safe.c \ + mit_glue.c \ + net_read.c \ + net_write.c \ + n-fold.c \ + pac.c \ + padata.c \ + pkinit.c \ + pkinit-ec.c \ + plugin.c \ + principal.c \ + prog_setup.c \ + prompter_posix.c \ + rd_cred.c \ + rd_error.c \ + rd_priv.c \ + rd_rep.c \ + rd_req.c \ + rd_safe.c \ + read_message.c \ + recvauth.c \ + replay.c \ + salt.c \ + salt-aes-sha1.c \ + salt-aes-sha2.c \ + salt-arcfour.c \ + salt-des.c \ + salt-des3.c \ + scache.c \ + send_to_kdc.c \ + sendauth.c \ + set_default_realm.c \ + sock_principal.c \ + sp800-108-kdf.c \ + store.c \ + store-int.c \ + store-int.h \ + store_emem.c \ + store_fd.c \ + store_mem.c \ + store_sock.c \ + pcache.c \ + plugin.c \ + ticket.c \ + time.c \ + transited.c \ + verify_init.c \ + verify_user.c \ + version.c \ + warn.c \ + write_message.c + +$(OBJ)\krb5-protos.h: $(dist_libkrb5_la_SOURCES) + $(PERL) ..\..\cf\make-proto.pl -E KRB5_LIB -q -P remove -o $(OBJ)\krb5-protos.h $(dist_libkrb5_la_SOURCES) || $(RM) -f $(OBJ)\krb5-protos.h + +$(OBJ)\krb5-private.h: $(dist_libkrb5_la_SOURCES) + $(PERL) ..\..\cf\make-proto.pl -q -P remove -p $(OBJ)\krb5-private.h $(dist_libkrb5_la_SOURCES) || $(RM) -f $(OBJ)\krb5-private.h + +$(OBJ)\krb5_err.c $(OBJ)\krb5_err.h: krb5_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\krb5_err.et + cd $(SRCDIR) + +$(OBJ)\krb_err.c $(OBJ)\krb_err.h: krb_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\krb_err.et + cd $(SRCDIR) + +$(OBJ)\heim_err.c $(OBJ)\heim_err.h: heim_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\heim_err.et + cd $(SRCDIR) + +$(OBJ)\k524_err.c $(OBJ)\k524_err.h: k524_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\k524_err.et + cd $(SRCDIR) + +#---------------------------------------------------------------------- +# libkrb5 + +$(LIBKRB5): $(libkrb5_OBJS) $(libkrb5_gen_OBJS) + $(LIBCON_C) -OUT:$@ $(LIBHEIMBASE) $(LIB_openssl_crypto) @<< +$(libkrb5_OBJS: = +) +$(libkrb5_gen_OBJS: = +) +<< + +all:: $(LIBKRB5) + +clean:: + -$(RM) $(LIBKRB5) + +$(OBJ)\libkrb5-exports.def: libkrb5-exports.def.in $(INCDIR)\config.h + $(CPREPROCESSOUT) libkrb5-exports.def.in > $@ || $(RM) $@ + +all:: $(OBJ)\libkrb5-exports.def + +clean:: + -$(RM) $(OBJ)\libkrb5-exports.def + +#---------------------------------------------------------------------- +# librfc3961 + +librfc3961_OBJS=\ + $(OBJ)\crc.obj \ + $(OBJ)\crypto.obj \ + $(OBJ)\crypto-aes-sha1.obj \ + $(OBJ)\crypto-aes-sha2.obj \ + $(OBJ)\crypto-algs.obj \ + $(OBJ)\crypto-arcfour.obj \ + $(OBJ)\crypto-des.obj \ + $(OBJ)\crypto-des-common.obj \ + $(OBJ)\crypto-des3.obj \ + $(OBJ)\crypto-evp.obj \ + $(OBJ)\crypto-null.obj \ + $(OBJ)\crypto-pk.obj \ + $(OBJ)\crypto-rand.obj \ + $(OBJ)\crypto-stubs.obj \ + $(OBJ)\data.obj \ + $(OBJ)\error_string.obj \ + $(OBJ)\keyblock.obj \ + $(OBJ)\n-fold.obj \ + $(OBJ)\salt.obj \ + $(OBJ)\salt-aes-sha1.obj \ + $(OBJ)\salt-aes-sha2.obj \ + $(OBJ)\salt-arcfour.obj \ + $(OBJ)\salt-des.obj \ + $(OBJ)\salt-des3.obj \ + $(OBJ)\sp800-108-kdf.obj \ + $(OBJ)\store-int.obj \ + $(OBJ)\warn.obj + +$(LIBRFC3961): $(librfc3961_OBJS) + $(LIBCON) + +all:: $(LIBRFC3961) + +clean:: + -$(RM) $(LIBRFC3961) + +#---------------------------------------------------------------------- +# Tools + +all-tools:: $(BINDIR)\verify_krb5_conf.exe + +clean:: + -$(RM) $(BINDIR)\verify_krb5_conf.* + +$(BINDIR)\verify_krb5_conf.exe: $(OBJ)\verify_krb5_conf.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBVERS) $(OBJ)\verify_krb5_conf-version.res + $(EXECONLINK) + $(EXEPREP) + +{}.c{$(OBJ)}.obj:: + $(C2OBJ_P) -DBUILD_KRB5_LIB -DASN1_LIB + +{$(OBJ)}.c{$(OBJ)}.obj:: + $(C2OBJ_P) -DBUILD_KRB5_LIB -DASN1_LIB + +#---------------------------------------------------------------------- +# Tests + +test:: test-binaries test-files test-run + +test_binaries = \ + $(OBJ)\aes-test.exe \ + $(OBJ)\derived-key-test.exe \ + $(OBJ)\krbhst-test.exe \ + $(OBJ)\n-fold-test.exe \ + $(OBJ)\parse-name-test.exe \ + $(OBJ)\pseudo-random-test.exe \ + $(OBJ)\store-test.exe \ + $(OBJ)\string-to-key-test.exe \ + $(OBJ)\test_acl.exe \ + $(OBJ)\test_addr.exe \ + $(OBJ)\test_alname.exe \ + $(OBJ)\test_cc.exe \ + $(OBJ)\test_config.exe \ + $(OBJ)\test_crypto.exe \ + $(OBJ)\test_crypto_wrapping.exe \ + $(OBJ)\test_forward.exe \ + $(OBJ)\test_get_addrs.exe \ + $(OBJ)\test_hostname.exe \ + $(OBJ)\test_keytab.exe \ + $(OBJ)\test_kuserok.exe \ + $(OBJ)\test_mem.exe \ + $(OBJ)\test_pac.exe \ + $(OBJ)\test_pkinit_dh2key.exe \ + $(OBJ)\test_pknistkdf.exe \ + $(OBJ)\test_plugin.exe \ + $(OBJ)\test_prf.exe \ + $(OBJ)\test_princ.exe \ + $(OBJ)\test_renew.exe \ + $(OBJ)\test_store.exe \ + $(OBJ)\test_time.exe \ + +test-binaries: $(test_binaries) $(OBJ)\test_rfc3961.exe + +test-files: $(OBJ)\test_config_strings.out + +$(OBJ)\test_config_strings.out: test_config_strings.cfg + $(CP) $** $@ + +test-run: + cd $(OBJ) + -aes-test.exe + -derived-key-test.exe + -krbhst-test.exe + -n-fold-test.exe + -parse-name-test.exe + -pseudo-random-test.exe + -store-test.exe + -string-to-key-test.exe + -test_acl.exe + -test_addr.exe +# Skip alname due to lack of .k5login and "root" +# -test_alname.exe + -test_cc.exe + -test_config.exe + -test_crypto.exe + -test_crypto_wrapping.exe +# Skip forward due to need for existing hostname +# -test_forward.exe + -test_get_addrs.exe + -test_hostname.exe + -test_keytab.exe +# Skip kuserok requires principal and localname +# -test_kuserok.exe + -test_mem.exe + -test_pac.exe + -test_pkinit_dh2key.exe + -test_pknistkdf.exe + -test_plugin.exe + -test_prf.exe + -test_renew.exe + -test_rfc3961.exe + -test_store.exe + -test_time.exe + cd $(SRCDIR) + +$(test_binaries): $$(@R).obj $(LIBHEIMDAL) $(LIBVERS) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\test_rfc3961.exe: $(OBJ)\test_rfc3961.obj $(LIBRFC3961) $(LIBHEIMDAL) $(LIBVERS) $(LIBCOMERR) $(LIBROKEN) $(LIBHEIMBASE) + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(test_binaries:.exe=.obj): $$(@B).c + $(C2OBJ_C) -Fo$@ -Fd$(@D)\ $** -DBlah + +test-exports: + $(PERL) ..\..\cf\w32-check-exported-symbols.pl --vs version-script.map --def libkrb5-exports.def.in + +test:: test-exports diff --git a/crypto/heimdal/lib/krb5/acache.c b/crypto/heimdal/lib/krb5/acache.c --- a/crypto/heimdal/lib/krb5/acache.c +++ b/crypto/heimdal/lib/krb5/acache.c @@ -125,7 +125,7 @@ #ifdef KRB5_USE_PATH_TOKENS { char * explib = NULL; - if (_krb5_expand_path_tokens(context, lib, &explib) == 0) { + if (_krb5_expand_path_tokens(context, lib, 0, &explib) == 0) { cc_handle = dlopen(explib, RTLD_LAZY|RTLD_LOCAL); free(explib); } @@ -168,7 +168,7 @@ #endif } -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _heim_krb5_ipc_client_set_target_uid(uid_t uid) { init_ccapi(NULL); @@ -176,7 +176,7 @@ (*set_target_uid)(uid); } -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _heim_krb5_ipc_client_clear_target(void) { init_ccapi(NULL); @@ -303,8 +303,7 @@ return 0; nomem: - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "malloc")); + ret = krb5_enomem(context); fail: krb5_free_cred_contents(context, cred); @@ -905,10 +904,8 @@ return ret; iter = calloc(1, sizeof(*iter)); - if (iter == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; - } + if (iter == NULL) + return krb5_enomem(context); error = (*init_func)(&iter->context, ccapi_version_3, NULL, NULL); if (error) { @@ -1036,10 +1033,8 @@ (*name->func->release)(name); (*cc->func->release)(cc); - if (error < 0 || *str == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (error < 0 || *str == NULL) + return krb5_enomem(context); return 0; } diff --git a/crypto/heimdal/lib/krb5/acl.c b/crypto/heimdal/lib/krb5/acl.c --- a/crypto/heimdal/lib/krb5/acl.c +++ b/crypto/heimdal/lib/krb5/acl.c @@ -81,10 +81,8 @@ for(p = format; *p != '\0'; p++) { tmp = malloc(sizeof(*tmp)); if(tmp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); acl_free_list(acl, 0); - return ENOMEM; + return krb5_enomem(context); } if(*p == 's') { tmp->type = acl_string; diff --git a/crypto/heimdal/lib/krb5/addr_families.c b/crypto/heimdal/lib/krb5/addr_families.c --- a/crypto/heimdal/lib/krb5/addr_families.c +++ b/crypto/heimdal/lib/krb5/addr_families.c @@ -799,6 +799,7 @@ NULL, NULL, NULL, + NULL, NULL } }; @@ -1160,6 +1161,7 @@ { int i, n; struct addrinfo *ai, *a; + struct addrinfo hint; int error; int save_errno; @@ -1171,18 +1173,18 @@ krb5_address addr; if((*at[i].parse_addr)(context, string, &addr) == 0) { ALLOC_SEQ(addresses, 1); - if (addresses->val == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (addresses->val == NULL) + return krb5_enomem(context); addresses->val[0] = addr; return 0; } } } - error = getaddrinfo (string, NULL, NULL, &ai); + /* if not parsed as numeric address, do a name lookup */ + memset(&hint, 0, sizeof(hint)); + hint.ai_family = AF_UNSPEC; + error = getaddrinfo (string, NULL, &hint, &ai); if (error) { krb5_error_code ret2; save_errno = errno; @@ -1198,15 +1200,13 @@ ALLOC_SEQ(addresses, n); if (addresses->val == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); freeaddrinfo(ai); - return ENOMEM; + return krb5_enomem(context); } addresses->len = 0; for (a = ai, i = 0; a != NULL; a = a->ai_next) { - if (krb5_sockaddr2address (context, ai->ai_addr, &addresses->val[i])) + if (krb5_sockaddr2address (context, a->ai_addr, &addresses->val[i])) continue; if(krb5_address_search(context, &addresses->val[i], addresses)) { krb5_free_address(context, &addresses->val[i]); @@ -1411,7 +1411,7 @@ size_t i; ALLOC_SEQ(outaddr, inaddr->len); if(inaddr->len > 0 && outaddr->val == NULL) - return ENOMEM; + return krb5_enomem(context); for(i = 0; i < inaddr->len; i++) krb5_copy_address(context, &inaddr->val[i], &outaddr->val[i]); return 0; @@ -1440,11 +1440,8 @@ size_t i; if(source->len > 0) { tmp = realloc(dest->val, (dest->len + source->len) * sizeof(*tmp)); - if(tmp == NULL) { - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (tmp == NULL) + return krb5_enomem(context); dest->val = tmp; for(i = 0; i < source->len; i++) { /* skip duplicates */ @@ -1483,19 +1480,14 @@ u_char *p; *res = malloc (sizeof(**res)); - if (*res == NULL) { - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*res == NULL) + return krb5_enomem(context); (*res)->addr_type = KRB5_ADDRESS_ADDRPORT; ret = krb5_data_alloc (&(*res)->address, len); if (ret) { - krb5_set_error_message (context, ret, - N_("malloc: out of memory", "")); free (*res); *res = NULL; - return ret; + return krb5_enomem(context); } p = (*res)->address.data; *p++ = 0; diff --git a/crypto/heimdal/lib/krb5/aes-test.c b/crypto/heimdal/lib/krb5/aes-test.c --- a/crypto/heimdal/lib/krb5/aes-test.c +++ b/crypto/heimdal/lib/krb5/aes-test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003 Kungliga Tekniska Högskolan + * Copyright (c) 2003-2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -35,10 +35,6 @@ #include #include -#ifdef HAVE_OPENSSL -#include -#endif - static int verbose = 0; static void @@ -61,6 +57,29 @@ char *pbkdf2; char *key; } keys[] = { + { + "password", + "\x10\xDF\x9D\xD7\x83\xE5\xBC\x8A\xCE\xA1\x73\x0E\x74\x35\x5F\x61" + "ATHENA.MIT.EDUraeburn", + 37, + 32768, + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128, + 16, + NULL, + "\x08\x9B\xCA\x48\xB1\x05\xEA\x6E\xA7\x7C\xA5\xD2\xF3\x9D\xC5\xE7" + }, + { + "password", + "\x10\xDF\x9D\xD7\x83\xE5\xBC\x8A\xCE\xA1\x73\x0E\x74\x35\x5F\x61" + "ATHENA.MIT.EDUraeburn", + 37, + 32768, + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192, + 32, + NULL, + "\x45\xBD\x80\x6D\xBF\x6A\x83\x3A\x9C\xFF\xC1\xC9\x45\x89\xA2\x22" + "\x36\x7A\x79\xBC\x21\xC4\x13\x71\x89\x06\xE9\xF5\x78\xA7\x84\x67" + }, { "password", "ATHENA.MIT.EDUraeburn", -1, 1, @@ -160,7 +179,6 @@ "\x1a\x8b\x4d\x28\x26\x01\xdb\x3b\x36\xbe\x92\x46\x91\x5e\xc8\x2a", "\xd7\x8c\x5c\x9c\xb8\x72\xa8\xc9\xda\xd4\x69\x7f\x0b\xb5\xb2\xd2" "\x14\x96\xc8\x2b\xeb\x2c\xae\xda\x21\x12\xfc\xee\xa0\x57\x40\x1b" - }, { "\xf0\x9d\x84\x9e" /* g-clef */, "EXAMPLE.COMpianist", -1, @@ -225,14 +243,15 @@ if (keys[i].keylen > sizeof(keyout)) abort(); - PKCS5_PBKDF2_HMAC_SHA1(password.data, password.length, - salt.saltvalue.data, salt.saltvalue.length, - keys[i].iterations, - keys[i].keylen, keyout); + PKCS5_PBKDF2_HMAC(password.data, password.length, + salt.saltvalue.data, salt.saltvalue.length, + keys[i].iterations, EVP_sha1(), + keys[i].keylen, keyout); if (memcmp(keyout, keys[i].pbkdf2, keys[i].keylen) != 0) { krb5_warnx(context, "%d: pbkdf2", i); val = 1; + hex_dump_data(keyout, keys[i].keylen); continue; } @@ -269,6 +288,8 @@ if (memcmp(key.keyvalue.data, keys[i].key, keys[i].keylen) != 0) { krb5_warnx(context, "%d: key wrong", i); val = 1; + hex_dump_data(key.keyvalue.data, key.keyvalue.length); + hex_dump_data(keys[i].key, keys[i].keylen); continue; } @@ -307,7 +328,8 @@ } if (decrypt.length != clear->length || - memcmp(decrypt.data, clear->data, decrypt.length) != 0) { + (decrypt.length && + memcmp(decrypt.data, clear->data, decrypt.length) != 0)) { krb5_warnx(context, "clear text not same"); return EINVAL; } @@ -478,9 +500,10 @@ krb_checksum_iov(krb5_context context, krb5_crypto crypto, unsigned usage, - krb5_data *plain) + krb5_data *plain, + krb5_data *verify) { - krb5_crypto_iov iov[4]; + krb5_crypto_iov iov[3]; int ret; char *p; size_t len; @@ -489,8 +512,12 @@ len = plain->length; iov[0].flags = KRB5_CRYPTO_TYPE_CHECKSUM; - krb5_crypto_length(context, crypto, iov[0].flags, &iov[0].data.length); - iov[0].data.data = emalloc(iov[0].data.length); + if (verify) { + iov[0].data = *verify; + } else { + krb5_crypto_length(context, crypto, iov[0].flags, &iov[0].data.length); + iov[0].data.data = emalloc(iov[0].data.length); + } iov[1].flags = KRB5_CRYPTO_TYPE_DATA; iov[1].data.length = len; @@ -500,16 +527,19 @@ krb5_crypto_length(context, crypto, iov[0].flags, &iov[2].data.length); iov[2].data.data = malloc(iov[2].data.length); - ret = krb5_create_checksum_iov(context, crypto, usage, - iov, sizeof(iov)/sizeof(iov[0]), NULL); - if (ret) - krb5_err(context, 1, ret, "krb5_create_checksum_iov failed"); + if (verify == NULL) { + ret = krb5_create_checksum_iov(context, crypto, usage, + iov, sizeof(iov)/sizeof(iov[0]), NULL); + if (ret) + krb5_err(context, 1, ret, "krb5_create_checksum_iov failed"); + } ret = krb5_verify_checksum_iov(context, crypto, usage, iov, sizeof(iov)/sizeof(iov[0]), NULL); if (ret) krb5_err(context, 1, ret, "krb5_verify_checksum_iov"); - free(iov[0].data.data); + if (verify == NULL) + free(iov[0].data.data); free(iov[2].data.data); return 0; @@ -539,7 +569,8 @@ return ret; if (decrypt.length != clear->length || - memcmp(decrypt.data, clear->data, decrypt.length) != 0) { + (decrypt.length && + memcmp(decrypt.data, clear->data, decrypt.length) != 0)) { krb5_warnx(context, "clear text not same"); return EINVAL; } @@ -559,7 +590,6 @@ return 0; } - struct { krb5_enctype enctype; unsigned usage; @@ -569,6 +599,8 @@ void* edata; size_t plen; void *pdata; + size_t clen; /* checksum length */ + void *cdata; /* checksum data */ } krbencs[] = { { ETYPE_AES256_CTS_HMAC_SHA1_96, @@ -581,11 +613,133 @@ "\xa9\xec\x1c\x5c\x21\xfb\x6e\xef\x1a\x7a\xc8\xc1\xcc\x5a\x95\x24" "\x6f\x9f\xf4\xd5\xbe\x5d\x59\x97\x44\xd8\x47\xcd", 16, - "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x2e\x0a" + "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x74\x65\x73\x74\x2e\x0a", + 0, + NULL + }, + { + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128, + 2, + 16, + "\x37\x05\xD9\x60\x80\xC1\x77\x28\xA0\xE8\x00\xEA\xB6\xE0\xD2\x3C", + 32, + "\xEF\x85\xFB\x89\x0B\xB8\x47\x2F\x4D\xAB\x20\x39\x4D\xCA\x78\x1D" + "\xAD\x87\x7E\xDA\x39\xD5\x0C\x87\x0C\x0D\x5A\x0A\x8E\x48\xC7\x18", + 0, + "", + 0, + NULL + }, + { + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128, + 2, + 16, + "\x37\x05\xD9\x60\x80\xC1\x77\x28\xA0\xE8\x00\xEA\xB6\xE0\xD2\x3C", + 38, + "\x84\xD7\xF3\x07\x54\xED\x98\x7B\xAB\x0B\xF3\x50\x6B\xEB\x09\xCF" + "\xB5\x54\x02\xCE\xF7\xE6\x87\x7C\xE9\x9E\x24\x7E\x52\xD1\x6E\xD4" + "\x42\x1D\xFD\xF8\x97\x6C", + 6, + "\x00\x01\x02\x03\x04\x05", + 0, + NULL + }, + { + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128, + 2, + 16, + "\x37\x05\xD9\x60\x80\xC1\x77\x28\xA0\xE8\x00\xEA\xB6\xE0\xD2\x3C", + 48, + "\x35\x17\xD6\x40\xF5\x0D\xDC\x8A\xD3\x62\x87\x22\xB3\x56\x9D\x2A" + "\xE0\x74\x93\xFA\x82\x63\x25\x40\x80\xEA\x65\xC1\x00\x8E\x8F\xC2" + "\x95\xFB\x48\x52\xE7\xD8\x3E\x1E\x7C\x48\xC3\x7E\xEB\xE6\xB0\xD3", + 16, + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", + 0, + NULL + }, + { + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128, + 2, + 16, + "\x37\x05\xD9\x60\x80\xC1\x77\x28\xA0\xE8\x00\xEA\xB6\xE0\xD2\x3C", + 53, + "\x72\x0F\x73\xB1\x8D\x98\x59\xCD\x6C\xCB\x43\x46\x11\x5C\xD3\x36" + "\xC7\x0F\x58\xED\xC0\xC4\x43\x7C\x55\x73\x54\x4C\x31\xC8\x13\xBC" + "\xE1\xE6\xD0\x72\xC1\x86\xB3\x9A\x41\x3C\x2F\x92\xCA\x9B\x83\x34" + "\xA2\x87\xFF\xCB\xFC", + 21, + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" + "\x10\x11\x12\x13\x14", + 16, + "\xD7\x83\x67\x18\x66\x43\xD6\x7B\x41\x1C\xBA\x91\x39\xFC\x1D\xEE" + }, + { + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192, + 2, + 32, + "\x6D\x40\x4D\x37\xFA\xF7\x9F\x9D\xF0\xD3\x35\x68\xD3\x20\x66\x98" + "\x00\xEB\x48\x36\x47\x2E\xA8\xA0\x26\xD1\x6B\x71\x82\x46\x0C\x52", + 40, + "\x41\xF5\x3F\xA5\xBF\xE7\x02\x6D\x91\xFA\xF9\xBE\x95\x91\x95\xA0" + "\x58\x70\x72\x73\xA9\x6A\x40\xF0\xA0\x19\x60\x62\x1A\xC6\x12\x74" + "\x8B\x9B\xBF\xBE\x7E\xB4\xCE\x3C", + 0, + "", + 0, + NULL + }, + { + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192, + 2, + 32, + "\x6D\x40\x4D\x37\xFA\xF7\x9F\x9D\xF0\xD3\x35\x68\xD3\x20\x66\x98" + "\x00\xEB\x48\x36\x47\x2E\xA8\xA0\x26\xD1\x6B\x71\x82\x46\x0C\x52", + 46, + "\x4E\xD7\xB3\x7C\x2B\xCA\xC8\xF7\x4F\x23\xC1\xCF\x07\xE6\x2B\xC7" + "\xB7\x5F\xB3\xF6\x37\xB9\xF5\x59\xC7\xF6\x64\xF6\x9E\xAB\x7B\x60" + "\x92\x23\x75\x26\xEA\x0D\x1F\x61\xCB\x20\xD6\x9D\x10\xF2", + 6, + "\x00\x01\x02\x03\x04\x05", + 0, + NULL + }, + { + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192, + 2, + 32, + "\x6D\x40\x4D\x37\xFA\xF7\x9F\x9D\xF0\xD3\x35\x68\xD3\x20\x66\x98" + "\x00\xEB\x48\x36\x47\x2E\xA8\xA0\x26\xD1\x6B\x71\x82\x46\x0C\x52", + 56, + "\xBC\x47\xFF\xEC\x79\x98\xEB\x91\xE8\x11\x5C\xF8\xD1\x9D\xAC\x4B" + "\xBB\xE2\xE1\x63\xE8\x7D\xD3\x7F\x49\xBE\xCA\x92\x02\x77\x64\xF6" + "\x8C\xF5\x1F\x14\xD7\x98\xC2\x27\x3F\x35\xDF\x57\x4D\x1F\x93\x2E" + "\x40\xC4\xFF\x25\x5B\x36\xA2\x66", + 16, + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F", + 0, + NULL + }, + { + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192, + 2, + 32, + "\x6D\x40\x4D\x37\xFA\xF7\x9F\x9D\xF0\xD3\x35\x68\xD3\x20\x66\x98" + "\x00\xEB\x48\x36\x47\x2E\xA8\xA0\x26\xD1\x6B\x71\x82\x46\x0C\x52", + 61, + "\x40\x01\x3E\x2D\xF5\x8E\x87\x51\x95\x7D\x28\x78\xBC\xD2\xD6\xFE" + "\x10\x1C\xCF\xD5\x56\xCB\x1E\xAE\x79\xDB\x3C\x3E\xE8\x64\x29\xF2" + "\xB2\xA6\x02\xAC\x86\xFE\xF6\xEC\xB6\x47\xD6\x29\x5F\xAE\x07\x7A" + "\x1F\xEB\x51\x75\x08\xD2\xC1\x6B\x41\x92\xE0\x1F\x62", + 21, + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F" + "\x10\x11\x12\x13\x14", + 24, + "\x45\xEE\x79\x15\x67\xEE\xFC\xA3\x7F\x4A\xC1\xE0\x22\x2D\xE8\x0D" + "\x43\xC3\xBF\xA0\x66\x99\x67\x2A" } }; - static int krb_enc_test(krb5_context context) { @@ -622,10 +776,22 @@ if (ret) errx(1, "krb_enc_iov2 failed with %d for test %d", ret, i); - ret = krb_checksum_iov(context, crypto, krbencs[i].usage, &plain); + ret = krb_checksum_iov(context, crypto, krbencs[i].usage, &plain, NULL); if (ret) errx(1, "krb_checksum_iov failed with %d for test %d", ret, i); + if (krbencs[i].cdata) { + krb5_data checksum; + + checksum.length = krbencs[i].clen; + checksum.data = krbencs[i].cdata; + + ret = krb_checksum_iov(context, crypto, krbencs[i].usage, + &plain, &checksum); + if (ret) + errx(1, "krb_checksum_iov(2) failed with %d for test %d", ret, i); + } + krb5_crypto_destroy(context, crypto); ret = krb_enc_mit(context, krbencs[i].enctype, &kb, @@ -638,9 +804,8 @@ } static int -iov_test(krb5_context context) +iov_test(krb5_context context, krb5_enctype enctype) { - krb5_enctype enctype = ENCTYPE_AES256_CTS_HMAC_SHA1_96; krb5_error_code ret; krb5_crypto crypto; krb5_keyblock key; @@ -857,6 +1022,9 @@ krb5_context context; int val = 0; + if (argc > 1 && strcmp(argv[1], "-v") == 0) + verbose = 1; + ret = krb5_init_context (&context); if (ret) errx (1, "krb5_init_context failed: %d", ret); @@ -865,7 +1033,9 @@ val |= krb_enc_test(context); val |= random_to_key(context); - val |= iov_test(context); + val |= iov_test(context, KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96); + val |= iov_test(context, KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128); + val |= iov_test(context, KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192); if (verbose && val == 0) printf("all ok\n"); diff --git a/crypto/heimdal/lib/krb5/an2ln_plugin.h b/crypto/heimdal/lib/krb5/an2ln_plugin.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/an2ln_plugin.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIMDAL_KRB5_AN2LN_PLUGIN_H +#define HEIMDAL_KRB5_AN2LN_PLUGIN_H 1 + +#define KRB5_PLUGIN_AN2LN "an2ln" +#define KRB5_PLUGIN_AN2LN_VERSION_0 0 + +typedef krb5_error_code (KRB5_LIB_CALL *set_result_f)(void *, const char *); + +/** @struct krb5plugin_an2ln_ftable_desc + * + * @brief Description of the krb5_aname_to_lname(3) plugin facility. + * + * The krb5_aname_to_lname(3) function is pluggable. The plugin is + * named KRB5_PLUGIN_AN2LN ("an2ln"), with a single minor version, + * KRB5_PLUGIN_AN2LN_VERSION_0 (0). + * + * The plugin for krb5_aname_to_lname(3) consists of a data symbol + * referencing a structure of type krb5plugin_an2ln_ftable, with four + * fields: + * + * @param init Plugin initialization function (see krb5-plugin(7)) + * + * @param minor_version The plugin minor version number (0) + * + * @param fini Plugin finalization function + * + * @param an2ln Plugin aname_to_lname function + * + * The an2ln field is the plugin entry point that performs the + * traditional aname_to_lname operation however the plugin desires. It + * is invoked in no particular order relative to other an2ln plugins, + * but it has a 'rule' argument that indicates which plugin is intended + * to act on the rule. The plugin an2ln function must return + * KRB5_PLUGIN_NO_HANDLE if the rule is not applicable to it. + * + * The plugin an2ln function has the following arguments, in this order: + * + * -# plug_ctx, the context value output by the plugin's init function + * -# context, a krb5_context + * -# rule, the aname_to_lname rule being evaluated (from krb5.conf(5)) + * -# aname, the krb5_principal to be mapped to an lname + * -# set_res_f, a function the plugin must call to set its result + * -# set_res_ctx, the first argument to set_res_f (the second is the result lname string) + * + * @ingroup krb5_support + */ +typedef struct krb5plugin_an2ln_ftable_desc { + int minor_version; + krb5_error_code (KRB5_LIB_CALL *init)(krb5_context, void **); + void (KRB5_LIB_CALL *fini)(void *); + krb5_error_code (KRB5_LIB_CALL *an2ln)(void *, krb5_context, const char *, + krb5_const_principal, set_result_f, void *); +} krb5plugin_an2ln_ftable; + +#endif /* HEIMDAL_KRB5_AN2LN_PLUGIN_H */ + diff --git a/crypto/heimdal/lib/krb5/aname_to_localname.c b/crypto/heimdal/lib/krb5/aname_to_localname.c --- a/crypto/heimdal/lib/krb5/aname_to_localname.c +++ b/crypto/heimdal/lib/krb5/aname_to_localname.c @@ -31,23 +31,109 @@ * SUCH DAMAGE. */ +#include #include "krb5_locl.h" +#include "an2ln_plugin.h" +#include "db_plugin.h" -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_aname_to_localname (krb5_context context, - krb5_const_principal aname, - size_t lnsize, - char *lname) +/* Default plugin (DB using binary search of sorted text file) follows */ +static krb5_error_code KRB5_LIB_CALL an2ln_def_plug_init(krb5_context, void **); +static void KRB5_LIB_CALL an2ln_def_plug_fini(void *); +static krb5_error_code KRB5_LIB_CALL an2ln_def_plug_an2ln(void *, krb5_context, const char *, + krb5_const_principal, set_result_f, + void *); + +static krb5plugin_an2ln_ftable an2ln_def_plug = { + 0, + an2ln_def_plug_init, + an2ln_def_plug_fini, + an2ln_def_plug_an2ln, +}; + +/* Plugin engine code follows */ +struct plctx { + krb5_const_principal aname; + heim_string_t luser; + const char *rule; +}; + +static krb5_error_code KRB5_LIB_CALL +set_res(void *userctx, const char *res) +{ + struct plctx *plctx = userctx; + plctx->luser = heim_string_create(res); + if (plctx->luser == NULL) + return ENOMEM; + return 0; +} + +static krb5_error_code KRB5_LIB_CALL +plcallback(krb5_context context, + const void *plug, void *plugctx, void *userctx) +{ + const krb5plugin_an2ln_ftable *locate = plug; + struct plctx *plctx = userctx; + + if (plctx->luser) + return 0; + + return locate->an2ln(plugctx, context, plctx->rule, plctx->aname, set_res, plctx); +} + +static krb5_error_code +an2ln_plugin(krb5_context context, const char *rule, krb5_const_principal aname, + size_t lnsize, char *lname) { krb5_error_code ret; - krb5_realm *lrealms, *r; + struct plctx ctx; + + ctx.rule = rule; + ctx.aname = aname; + ctx.luser = NULL; + + /* + * Order of plugin invocation is non-deterministic, but there should + * really be no more than one plugin that can handle any given kind + * rule, so the effect should be deterministic anyways. + */ + ret = _krb5_plugin_run_f(context, "krb5", KRB5_PLUGIN_AN2LN, + KRB5_PLUGIN_AN2LN_VERSION_0, 0, &ctx, plcallback); + if (ret != 0) { + heim_release(ctx.luser); + return ret; + } + + if (ctx.luser == NULL) + return KRB5_PLUGIN_NO_HANDLE; + + if (strlcpy(lname, heim_string_get_utf8(ctx.luser), lnsize) >= lnsize) + ret = KRB5_CONFIG_NOTENUFSPACE; + + heim_release(ctx.luser); + return ret; +} + +static void +reg_def_plugins_once(void *ctx) +{ + krb5_context context = ctx; + + krb5_plugin_register(context, PLUGIN_TYPE_DATA, KRB5_PLUGIN_AN2LN, + &an2ln_def_plug); +} + +static int +princ_realm_is_default(krb5_context context, + krb5_const_principal aname) +{ + krb5_error_code ret; + krb5_realm *lrealms = NULL; + krb5_realm *r; int valid; - size_t len; - const char *res; - ret = krb5_get_default_realms (context, &lrealms); + ret = krb5_get_default_realms(context, &lrealms); if (ret) - return ret; + return 0; valid = 0; for (r = lrealms; *r != NULL; ++r) { @@ -57,13 +143,107 @@ } } krb5_free_host_realm (context, lrealms); - if (valid == 0) + return valid; +} + +/* + * This function implements MIT's auth_to_local_names configuration for + * configuration compatibility. Specifically: + * + * [realms] + * = { + * auth_to_local_names = { + * = + * } + * } + * + * If multiple usernames are configured then the last one is taken. + * + * The configuration can only be expected to hold a relatively small + * number of mappings. For lots of mappings use a DB. + */ +static krb5_error_code +an2ln_local_names(krb5_context context, + krb5_const_principal aname, + size_t lnsize, + char *lname) +{ + krb5_error_code ret; + char *unparsed; + char **values; + char *res; + size_t i; + + if (!princ_realm_is_default(context, aname)) + return KRB5_PLUGIN_NO_HANDLE; + + ret = krb5_unparse_name_flags(context, aname, + KRB5_PRINCIPAL_UNPARSE_NO_REALM, + &unparsed); + if (ret) + return ret; + + ret = KRB5_PLUGIN_NO_HANDLE; + values = krb5_config_get_strings(context, NULL, "realms", aname->realm, + "auth_to_local_names", unparsed, NULL); + free(unparsed); + if (!values) + return ret; + /* Take the last value, just like MIT */ + for (res = NULL, i = 0; values[i]; i++) + res = values[i]; + if (res) { + ret = 0; + if (strlcpy(lname, res, lnsize) >= lnsize) + ret = KRB5_CONFIG_NOTENUFSPACE; + + if (!*res || strcmp(res, ":") == 0) + ret = KRB5_NO_LOCALNAME; + } + + krb5_config_free_strings(values); + return ret; +} + +/* + * Heimdal's default aname2lname mapping. + */ +static krb5_error_code +an2ln_default(krb5_context context, + char *rule, + krb5_const_principal aname, + size_t lnsize, char *lname) +{ + krb5_error_code ret; + const char *res; + int root_princs_ok; + + if (strcmp(rule, "NONE") == 0) return KRB5_NO_LOCALNAME; - if (aname->name.name_string.len == 1) + if (strcmp(rule, "DEFAULT") == 0) + root_princs_ok = 0; + else if (strcmp(rule, "HEIMDAL_DEFAULT") == 0) + root_princs_ok = 1; + else + return KRB5_PLUGIN_NO_HANDLE; + + if (!princ_realm_is_default(context, aname)) + return KRB5_PLUGIN_NO_HANDLE; + + if (aname->name.name_string.len == 1) { + /* + * One component principal names in default realm -> the one + * component is the username. + */ res = aname->name.name_string.val[0]; - else if (aname->name.name_string.len == 2 - && strcmp (aname->name.name_string.val[1], "root") == 0) { + } else if (root_princs_ok && aname->name.name_string.len == 2 && + strcmp (aname->name.name_string.val[1], "root") == 0) { + /* + * Two-component principal names in default realm where the + * first component is "root" -> root IFF the principal is in + * root's .k5login (or whatever krb5_kuserok() does). + */ krb5_principal rootprinc; krb5_boolean userok; @@ -73,18 +253,206 @@ if (ret) return ret; - userok = krb5_kuserok(context, rootprinc, res); + userok = _krb5_kuserok(context, rootprinc, res, FALSE); krb5_free_principal(context, rootprinc); if (!userok) return KRB5_NO_LOCALNAME; + } else { + return KRB5_PLUGIN_NO_HANDLE; + } + + if (strlcpy(lname, res, lnsize) >= lnsize) + return KRB5_CONFIG_NOTENUFSPACE; + + return 0; +} + +/** + * Map a principal name to a local username. + * + * Returns 0 on success, KRB5_NO_LOCALNAME if no mapping was found, or + * some Kerberos or system error. + * + * Inputs: + * + * @param context A krb5_context + * @param aname A principal name + * @param lnsize The size of the buffer into which the username will be written + * @param lname The buffer into which the username will be written + * + * @ingroup krb5_support + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_aname_to_localname(krb5_context context, + krb5_const_principal aname, + size_t lnsize, + char *lname) +{ + static heim_base_once_t reg_def_plugins = HEIM_BASE_ONCE_INIT; + krb5_error_code ret; + krb5_realm realm; + size_t i; + char **rules = NULL; + char *rule; + + if (lnsize) + lname[0] = '\0'; + + heim_base_once_f(®_def_plugins, context, reg_def_plugins_once); + + /* Try MIT's auth_to_local_names config first */ + ret = an2ln_local_names(context, aname, lnsize, lname); + if (ret != KRB5_PLUGIN_NO_HANDLE) + return ret; + + ret = krb5_get_default_realm(context, &realm); + if (ret) + return ret; + + rules = krb5_config_get_strings(context, NULL, "realms", realm, + "auth_to_local", NULL); + krb5_xfree(realm); + if (!rules) { + /* Heimdal's default rule */ + ret = an2ln_default(context, "HEIMDAL_DEFAULT", aname, lnsize, lname); + if (ret == KRB5_PLUGIN_NO_HANDLE) + return KRB5_NO_LOCALNAME; + return ret; + } - } else - return KRB5_NO_LOCALNAME; + /* + * MIT rules. + * + * Note that RULEs and DBs only have white-list functionality, + * thus RULEs and DBs that we don't understand we simply ignore. + * + * This means that plugins that implement black-lists are + * dangerous: if a black-list plugin isn't found, the black-list + * won't be enforced. But black-lists are dangerous anyways. + */ + for (ret = KRB5_PLUGIN_NO_HANDLE, i = 0; rules[i]; i++) { + rule = rules[i]; + + /* Try NONE, DEFAULT, and HEIMDAL_DEFAULT rules */ + ret = an2ln_default(context, rule, aname, lnsize, lname); + if (ret == KRB5_PLUGIN_NO_HANDLE) + /* Try DB, RULE, ... plugins */ + ret = an2ln_plugin(context, rule, aname, lnsize, lname); + + if (ret == 0 && lnsize && !lname[0]) + continue; /* Success but no lname?! lies! */ + else if (ret != KRB5_PLUGIN_NO_HANDLE) + break; + } - len = strlen (res); - if (len >= lnsize) - return ERANGE; - strlcpy (lname, res, lnsize); + if (ret == KRB5_PLUGIN_NO_HANDLE) { + if (lnsize) + lname[0] = '\0'; + ret = KRB5_NO_LOCALNAME; + } + + krb5_config_free_strings(rules); + return ret; +} +static krb5_error_code KRB5_LIB_CALL +an2ln_def_plug_init(krb5_context context, void **ctx) +{ + *ctx = NULL; return 0; } + +static void KRB5_LIB_CALL +an2ln_def_plug_fini(void *ctx) +{ +} + +static heim_base_once_t sorted_text_db_init_once = HEIM_BASE_ONCE_INIT; + +static void +sorted_text_db_init_f(void *arg) +{ + (void) heim_db_register("sorted-text", NULL, &heim_sorted_text_file_dbtype); +} + +static krb5_error_code KRB5_LIB_CALL +an2ln_def_plug_an2ln(void *plug_ctx, krb5_context context, + const char *rule, + krb5_const_principal aname, + set_result_f set_res_f, void *set_res_ctx) +{ + krb5_error_code ret; + const char *an2ln_db_fname; + heim_db_t dbh = NULL; + heim_dict_t db_options; + heim_data_t k, v; + heim_error_t error; + char *unparsed = NULL; + char *value = NULL; + + _krb5_load_db_plugins(context); + heim_base_once_f(&sorted_text_db_init_once, NULL, sorted_text_db_init_f); + + if (strncmp(rule, "DB:", strlen("DB:")) != 0) + return KRB5_PLUGIN_NO_HANDLE; + + an2ln_db_fname = &rule[strlen("DB:")]; + if (!*an2ln_db_fname) + return KRB5_PLUGIN_NO_HANDLE; + + ret = krb5_unparse_name(context, aname, &unparsed); + if (ret) + return ret; + + db_options = heim_dict_create(11); + if (db_options != NULL) + heim_dict_set_value(db_options, HSTR("read-only"), + heim_number_create(1)); + dbh = heim_db_create(NULL, an2ln_db_fname, db_options, &error); + if (dbh == NULL) { + krb5_set_error_message(context, heim_error_get_code(error), + N_("Couldn't open aname2lname-text-db", "")); + ret = KRB5_PLUGIN_NO_HANDLE; + goto cleanup; + } + + /* Binary search; file should be sorted (in C locale) */ + k = heim_data_ref_create(unparsed, strlen(unparsed), NULL); + if (k == NULL) { + ret = krb5_enomem(context); + goto cleanup; + } + v = heim_db_copy_value(dbh, NULL, k, &error); + heim_release(k); + if (v == NULL && error != NULL) { + krb5_set_error_message(context, heim_error_get_code(error), + N_("Lookup in aname2lname-text-db failed", "")); + ret = heim_error_get_code(error); + goto cleanup; + } else if (v == NULL) { + ret = KRB5_PLUGIN_NO_HANDLE; + goto cleanup; + } else { + /* found */ + if (heim_data_get_length(v) == 0) { + krb5_set_error_message(context, ret, + N_("Principal mapped to empty username", "")); + ret = KRB5_NO_LOCALNAME; + goto cleanup; + } + value = strndup(heim_data_get_ptr(v), heim_data_get_length(v)); + heim_release(v); + if (value == NULL) { + ret = krb5_enomem(context); + goto cleanup; + } + ret = set_res_f(set_res_ctx, value); + } + +cleanup: + heim_release(dbh); + free(unparsed); + free(value); + return ret; +} + diff --git a/crypto/heimdal/lib/krb5/asn1_glue.c b/crypto/heimdal/lib/krb5/asn1_glue.c --- a/crypto/heimdal/lib/krb5/asn1_glue.c +++ b/crypto/heimdal/lib/krb5/asn1_glue.c @@ -53,9 +53,9 @@ krb5_error_code ret; krb5_principal p; - p = malloc(sizeof(*p)); + p = calloc(1, sizeof(*p)); if (p == NULL) - return ENOMEM; + return krb5_enomem(context); ret = copy_PrincipalName(&from, &p->name); if (ret) { free(p); @@ -65,7 +65,7 @@ if (p->realm == NULL) { free_PrincipalName(&p->name); free(p); - return ENOMEM; + return krb5_enomem(context); } *principal = p; return 0; diff --git a/crypto/heimdal/lib/krb5/auth_context.c b/crypto/heimdal/lib/krb5/auth_context.c --- a/crypto/heimdal/lib/krb5/auth_context.c +++ b/crypto/heimdal/lib/krb5/auth_context.c @@ -33,6 +33,16 @@ #include "krb5_locl.h" +/** + * Allocate and initialize an autentication context. + * + * @param context A kerberos context. + * @param auth_context The authentication context to be initialized. + * + * Use krb5_auth_con_free() to release the memory when done using the context. + * + * @return An krb5 error code, see krb5_get_error_message(). + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_init(krb5_context context, krb5_auth_context *auth_context) @@ -40,16 +50,13 @@ krb5_auth_context p; ALLOC(p, 1); - if(!p) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (!p) + return krb5_enomem(context); memset(p, 0, sizeof(*p)); ALLOC(p->authenticator, 1); if (!p->authenticator) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(p); - return ENOMEM; + return krb5_enomem(context); } memset (p->authenticator, 0, sizeof(*p->authenticator)); p->flags = KRB5_AUTH_CONTEXT_DO_TIME; @@ -58,12 +65,22 @@ p->remote_address = NULL; p->local_port = 0; p->remote_port = 0; - p->keytype = ENCTYPE_NULL; + p->keytype = KRB5_ENCTYPE_NULL; p->cksumtype = CKSUMTYPE_NONE; + p->auth_data = NULL; *auth_context = p; return 0; } +/** + * Deallocate an authentication context previously initialized with + * krb5_auth_con_init(). + * + * @param context A kerberos context. + * @param auth_context The authentication context to be deallocated. + * + * @return An krb5 error code, see krb5_get_error_message(). + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_free(krb5_context context, krb5_auth_context auth_context) @@ -81,6 +98,10 @@ krb5_free_keyblock(context, auth_context->keyblock); krb5_free_keyblock(context, auth_context->remote_subkey); krb5_free_keyblock(context, auth_context->local_subkey); + if (auth_context->auth_data) { + free_AuthorizationData(auth_context->auth_data); + free(auth_context->auth_data); + } free (auth_context); } return 0; @@ -140,7 +161,7 @@ krb5_free_address (context, auth_context->local_address); else if ((auth_context->local_address = malloc(sizeof(krb5_address))) == NULL) - return ENOMEM; + return krb5_enomem(context); krb5_copy_address(context, local_addr, auth_context->local_address); } if (remote_addr) { @@ -148,12 +169,18 @@ krb5_free_address (context, auth_context->remote_address); else if ((auth_context->remote_address = malloc(sizeof(krb5_address))) == NULL) - return ENOMEM; + return krb5_enomem(context); krb5_copy_address(context, remote_addr, auth_context->remote_address); } return 0; } +/** + * Update the authentication context \a auth_context with the local + * and remote addresses from socket \a fd, according to \a flags. + * + * @return An krb5 error code, see krb5_get_error_message(). + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_genaddrs(krb5_context context, krb5_auth_context auth_context, @@ -239,10 +266,8 @@ if(*local_addr) krb5_free_address (context, *local_addr); *local_addr = malloc (sizeof(**local_addr)); - if (*local_addr == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*local_addr == NULL) + return krb5_enomem(context); krb5_copy_address(context, auth_context->local_address, *local_addr); @@ -251,10 +276,9 @@ krb5_free_address (context, *remote_addr); *remote_addr = malloc (sizeof(**remote_addr)); if (*remote_addr == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); krb5_free_address (context, *local_addr); *local_addr = NULL; - return ENOMEM; + return krb5_enomem(context); } krb5_copy_address(context, auth_context->remote_address, @@ -268,9 +292,9 @@ krb5_keyblock *in, krb5_keyblock **out) { - if(in) + *out = NULL; + if (in) return krb5_copy_keyblock(context, in, out); - *out = NULL; /* is this right? */ return 0; } @@ -385,6 +409,28 @@ return 0; } +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_auth_con_add_AuthorizationData(krb5_context context, + krb5_auth_context auth_context, + int type, + krb5_data *data) +{ + AuthorizationDataElement el; + + if (auth_context->auth_data == NULL) { + auth_context->auth_data = calloc(1, sizeof(*auth_context->auth_data)); + if (auth_context->auth_data == NULL) + return krb5_enomem(context); + } + el.ad_type = type; + el.ad_data.data = data->data; + el.ad_data.length = data->length; + + return add_AuthorizationData(auth_context->auth_data, &el); +} + + + #if 0 KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_setenctype(krb5_context context, @@ -395,7 +441,7 @@ krb5_free_keyblock(context, auth_context->keyblock); ALLOC(auth_context->keyblock, 1); if(auth_context->keyblock == NULL) - return ENOMEM; + return krb5_enomem(context); auth_context->keyblock->keytype = etype; return 0; } @@ -452,10 +498,8 @@ krb5_authenticator *authenticator) { *authenticator = malloc(sizeof(**authenticator)); - if (*authenticator == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*authenticator == NULL) + return krb5_enomem(context); copy_Authenticator(auth_context->authenticator, *authenticator); diff --git a/crypto/heimdal/lib/krb5/build_auth.c b/crypto/heimdal/lib/krb5/build_auth.c --- a/crypto/heimdal/lib/krb5/build_auth.c +++ b/crypto/heimdal/lib/krb5/build_auth.c @@ -62,8 +62,7 @@ ALLOC_SEQ(&ad, 1); if (ad.val == NULL) { free(buf); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } ad.val[0].ad_type = KRB5_AUTHDATA_GSS_API_ETYPE_NEGOTIATION; @@ -82,16 +81,14 @@ ALLOC(*auth_data, 1); if (*auth_data == NULL) { free(buf); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } ALLOC_SEQ(*auth_data, 1); if ((*auth_data)->val == NULL) { free(*auth_data); free(buf); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } (*auth_data)->val[0].ad_type = KRB5_AUTHDATA_IF_RELEVANT; @@ -120,8 +117,12 @@ memset(&auth, 0, sizeof(auth)); auth.authenticator_vno = 5; - copy_Realm(&cred->client->realm, &auth.crealm); - copy_PrincipalName(&cred->client->name, &auth.cname); + ret = copy_Realm(&cred->client->realm, &auth.crealm); + if (ret) + goto fail; + ret = copy_PrincipalName(&cred->client->name, &auth.cname); + if (ret) + goto fail; krb5_us_timeofday (context, &auth.ctime, &auth.cusec); @@ -136,7 +137,7 @@ &auth_context->local_seqnumber); ALLOC(auth.seq_number, 1); if(auth.seq_number == NULL) { - ret = ENOMEM; + ret = krb5_enomem(context); goto fail; } *auth.seq_number = auth_context->local_seqnumber; @@ -147,7 +148,7 @@ if (cksum) { ALLOC(auth.cksum, 1); if (auth.cksum == NULL) { - ret = ENOMEM; + ret = krb5_enomem(context); goto fail; } ret = copy_Checksum(cksum, auth.cksum); diff --git a/crypto/heimdal/lib/krb5/cache.c b/crypto/heimdal/lib/krb5/cache.c --- a/crypto/heimdal/lib/krb5/cache.c +++ b/crypto/heimdal/lib/krb5/cache.c @@ -155,15 +155,15 @@ * `ops'. Returns 0 or and error code. */ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_cc_allocate(krb5_context context, const krb5_cc_ops *ops, krb5_ccache *id) { krb5_ccache p; - p = malloc (sizeof(*p)); - if(p == NULL) { + p = calloc(1, sizeof(*p)); + if (p == NULL) { krb5_set_error_message(context, KRB5_CC_NOMEM, N_("malloc: out of memory", "")); return KRB5_CC_NOMEM; @@ -188,8 +188,13 @@ krb5_error_code ret; #ifdef KRB5_USE_PATH_TOKENS char * exp_residual = NULL; + int filepath; + + filepath = (strcmp("FILE", ops->prefix) == 0 + || strcmp("DIR", ops->prefix) == 0 + || strcmp("SCC", ops->prefix) == 0); - ret = _krb5_expand_path_tokens(context, residual, &exp_residual); + ret = _krb5_expand_path_tokens(context, residual, filepath, &exp_residual); if (ret) return ret; @@ -383,9 +388,8 @@ } if (asprintf(str, "%s:%s", type, name) == -1) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); *str = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -407,10 +411,16 @@ * Expand variables in `str' into `res' */ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_expand_default_cc_name(krb5_context context, const char *str, char **res) { - return _krb5_expand_path_tokens(context, str, res); + int filepath; + + filepath = (strncmp("FILE:", str, 5) == 0 + || strncmp("DIR:", str, 4) == 0 + || strncmp("SCC:", str, 4) == 0); + + return _krb5_expand_path_tokens(context, str, filepath, res); } /* @@ -502,11 +512,13 @@ { krb5_error_code ret = 0; char *p = NULL, *exp_p = NULL; + int filepath; + const krb5_cc_ops *ops = KRB5_DEFAULT_CCTYPE; if (name == NULL) { const char *e = NULL; - if(!issuid()) { + if (!issuid()) { e = getenv("KRB5CCNAME"); if (e) { p = strdup(e); @@ -517,11 +529,11 @@ } #ifdef _WIN32 - if (e == NULL) { - e = p = _krb5_get_default_cc_name_from_registry(context); + if (p == NULL) { + p = _krb5_get_default_cc_name_from_registry(context); } #endif - if (e == NULL) { + if (p == NULL) { e = krb5_config_get_string(context, NULL, "libdefaults", "default_cc_name", NULL); if (e) { @@ -529,45 +541,78 @@ if (ret) return ret; } - if (e == NULL) { - const krb5_cc_ops *ops = KRB5_DEFAULT_CCTYPE; - e = krb5_config_get_string(context, NULL, "libdefaults", - "default_cc_type", NULL); - if (e) { - ops = krb5_cc_get_prefix_ops(context, e); - if (ops == NULL) { - krb5_set_error_message(context, - KRB5_CC_UNKNOWN_TYPE, - "Credential cache type %s " - "is unknown", e); - return KRB5_CC_UNKNOWN_TYPE; - } + } + if (p == NULL) { + e = krb5_config_get_string(context, NULL, "libdefaults", + "default_cc_type", NULL); + if (e) { + ops = krb5_cc_get_prefix_ops(context, e); + if (ops == NULL) { + krb5_set_error_message(context, + KRB5_CC_UNKNOWN_TYPE, + "Credential cache type %s " + "is unknown", e); + return KRB5_CC_UNKNOWN_TYPE; + } + } + } +#ifdef _WIN32 + if (p == NULL) { + /* + * If the MSLSA ccache type has a principal name, + * use it as the default. + */ + krb5_ccache id; + ret = krb5_cc_resolve(context, "MSLSA:", &id); + if (ret == 0) { + krb5_principal princ; + ret = krb5_cc_get_principal(context, id, &princ); + if (ret == 0) { + krb5_free_principal(context, princ); + p = strdup("MSLSA:"); } - ret = (*ops->get_default_name)(context, &p); - if (ret) - return ret; + krb5_cc_close(context, id); } } + if (p == NULL) { + /* + * If the API:krb5cc ccache can be resolved, + * use it as the default. + */ + krb5_ccache api_id; + ret = krb5_cc_resolve(context, "API:krb5cc", &api_id); + if (ret == 0) + krb5_cc_close(context, api_id); + } + /* Otherwise, fallback to the FILE ccache */ +#endif + if (p == NULL) { + ret = (*ops->get_default_name)(context, &p); + if (ret) + return ret; + } context->default_cc_name_set = 0; } else { p = strdup(name); + if (p == NULL) + return krb5_enomem(context); context->default_cc_name_set = 1; } - if (p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + filepath = (strncmp("FILE:", p, 5) == 0 + || strncmp("DIR:", p, 4) == 0 + || strncmp("SCC:", p, 4) == 0); - ret = _krb5_expand_path_tokens(context, p, &exp_p); + ret = _krb5_expand_path_tokens(context, p, filepath, &exp_p); free(p); + p = exp_p; if (ret) return ret; if (context->default_cc_name) free(context->default_cc_name); - context->default_cc_name = exp_p; + context->default_cc_name = p; return 0; } @@ -606,10 +651,8 @@ { const char *p = krb5_cc_default_name(context); - if (p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (p == NULL) + return krb5_enomem(context); return krb5_cc_resolve(context, p, id); } @@ -627,7 +670,12 @@ krb5_ccache id, krb5_principal primary_principal) { - return (*id->ops->init)(context, id, primary_principal); + krb5_error_code ret; + + ret = (*id->ops->init)(context, id, primary_principal); + if (ret == 0) + id->initialized = 1; + return ret; } @@ -684,7 +732,35 @@ krb5_ccache id, krb5_creds *creds) { - return (*id->ops->store)(context, id, creds); + krb5_error_code ret; + krb5_data realm; + + ret = (*id->ops->store)(context, id, creds); + + /* Look for and mark the first root TGT's realm as the start realm */ + if (ret == 0 && id->initialized && + krb5_principal_is_root_krbtgt(context, creds->server)) { + + id->initialized = 0; + realm.length = strlen(creds->server->realm); + realm.data = creds->server->realm; + (void) krb5_cc_set_config(context, id, NULL, "start_realm", &realm); + } else if (ret == 0 && id->initialized && + krb5_is_config_principal(context, creds->server) && + strcmp(creds->server->name.name_string.val[1], "start_realm") == 0) { + + /* + * But if the caller is storing a start_realm ccconfig, then + * stop looking for root TGTs to mark as the start_realm. + * + * By honoring any start_realm cc config stored, we interop + * both, with ccache implementations that don't preserve + * insertion order, and Kerberos implementations that store this + * cc config before the TGT. + */ + id->initialized = 0; + } + return ret; } /** @@ -903,7 +979,7 @@ } while ((ret = krb5_cc_next_cred(context, from, &cursor, &cred)) == 0) { - if (match == NULL || (*match)(context, matchctx, &cred) == 0) { + if (match == NULL || (*match)(context, matchctx, &cred)) { if (matched) (*matched)++; ret = krb5_cc_store_cred(context, to, &cred); @@ -984,12 +1060,20 @@ if (prefix == NULL) return KRB5_DEFAULT_CCTYPE; - if (prefix[0] == '/') + + /* Is absolute path? Or UNC path? */ + if (ISPATHSEP(prefix[0])) return &krb5_fcc_ops; +#ifdef _WIN32 + /* Is drive letter? */ + if (isalpha(prefix[0]) && prefix[1] == ':') + return &krb5_fcc_ops; +#endif + p = strdup(prefix); if (p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); + krb5_enomem(context); return NULL; } p1 = strchr(p, ':'); @@ -1053,10 +1137,8 @@ } *cursor = calloc(1, sizeof(**cursor)); - if (*cursor == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*cursor == NULL) + return krb5_enomem(context); (*cursor)->ops = ops; @@ -1134,6 +1216,7 @@ krb5_cccol_cursor cursor; krb5_error_code ret; krb5_ccache cache = NULL; + krb5_ccache expired_match = NULL; *id = NULL; @@ -1141,26 +1224,46 @@ if (ret) return ret; - while (krb5_cccol_cursor_next (context, cursor, &cache) == 0 && cache != NULL) { + while (krb5_cccol_cursor_next(context, cursor, &cache) == 0 && cache != NULL) { krb5_principal principal; + krb5_boolean match; + time_t lifetime; ret = krb5_cc_get_principal(context, cache, &principal); - if (ret == 0) { - krb5_boolean match; + if (ret) + goto next; + if (client->name.name_string.len == 0) + match = (strcmp(client->realm, principal->realm) == 0); + else match = krb5_principal_compare(context, principal, client); - krb5_free_principal(context, principal); - if (match) - break; + krb5_free_principal(context, principal); + + if (!match) + goto next; + + if (expired_match == NULL && + (krb5_cc_get_lifetime(context, cache, &lifetime) != 0 || lifetime == 0)) { + expired_match = cache; + cache = NULL; + goto next; } + break; - krb5_cc_close(context, cache); + next: + if (cache) + krb5_cc_close(context, cache); cache = NULL; } krb5_cccol_cursor_free(context, &cursor); - if (cache == NULL) { + if (cache == NULL && expired_match) { + cache = expired_match; + expired_match = NULL; + } else if (expired_match) { + krb5_cc_close(context, expired_match); + } else if (cache == NULL) { char *str; krb5_unparse_name(context, client, &str); @@ -1173,6 +1276,7 @@ free(str); return KRB5_CC_NOTFOUND; } + *id = cache; return 0; @@ -1388,10 +1492,8 @@ krb5_cccol_cursor_new(krb5_context context, krb5_cccol_cursor *cursor) { *cursor = calloc(1, sizeof(**cursor)); - if (*cursor == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*cursor == NULL) + return krb5_enomem(context); (*cursor)->idx = 0; (*cursor)->cursor = NULL; @@ -1577,10 +1679,9 @@ } else { ret = asprintf(name, "%.*s", (int)data.length, (char *)data.data); krb5_data_free(&data); - if (ret <= 0) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); - } else + if (ret <= 0) + ret = krb5_enomem(context); + else ret = 0; } @@ -1626,27 +1727,72 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_lifetime(krb5_context context, krb5_ccache id, time_t *t) { + krb5_data config_start_realm; + char *start_realm; krb5_cc_cursor cursor; krb5_error_code ret; krb5_creds cred; - time_t now; + time_t now, endtime = 0; *t = 0; - now = time(NULL); + krb5_timeofday(context, &now); + + ret = krb5_cc_get_config(context, id, NULL, "start_realm", &config_start_realm); + if (ret == 0) { + start_realm = strndup(config_start_realm.data, config_start_realm.length); + krb5_data_free(&config_start_realm); + } else { + krb5_principal client; + + ret = krb5_cc_get_principal(context, id, &client); + if (ret) + return ret; + start_realm = strdup(krb5_principal_get_realm(context, client)); + krb5_free_principal(context, client); + } + if (start_realm == NULL) + return krb5_enomem(context); ret = krb5_cc_start_seq_get(context, id, &cursor); - if (ret) + if (ret) { + free(start_realm); return ret; + } while ((ret = krb5_cc_next_cred(context, id, &cursor, &cred)) == 0) { - if (cred.flags.b.initial) { + /** + * If we find the start krbtgt in the cache, use that as the lifespan. + */ + if (krb5_principal_is_root_krbtgt(context, cred.server) && + strcmp(cred.server->realm, start_realm) == 0) { if (now < cred.times.endtime) - *t = cred.times.endtime - now; + endtime = cred.times.endtime; krb5_free_cred_contents(context, &cred); break; } + /* + * Skip config entries + */ + if (krb5_is_config_principal(context, cred.server)) { + krb5_free_cred_contents(context, &cred); + continue; + } + /** + * If there was no krbtgt, use the shortest lifetime of + * service tickets that have yet to expire. If all + * credentials are expired, krb5_cc_get_lifetime() will fail. + */ + if ((endtime == 0 || cred.times.endtime < endtime) && now < cred.times.endtime) + endtime = cred.times.endtime; krb5_free_cred_contents(context, &cred); } + free(start_realm); + + /* if we found an endtime use that */ + if (endtime) { + *t = endtime - now; + ret = 0; + } krb5_cc_end_seq_get(context, id, &cursor); @@ -1702,18 +1848,17 @@ return (*id->ops->get_kdc_offset)(context, id, offset); } - #ifdef _WIN32 - #define REGPATH_MIT_KRB5 "SOFTWARE\\MIT\\Kerberos5" -char * -_krb5_get_default_cc_name_from_registry(krb5_context context) + +static char * +_get_default_cc_name_from_registry(krb5_context context, HKEY hkBase) { HKEY hk_k5 = 0; LONG code; - char * ccname = NULL; + char *ccname = NULL; - code = RegOpenKeyEx(HKEY_CURRENT_USER, + code = RegOpenKeyEx(hkBase, REGPATH_MIT_KRB5, 0, KEY_READ, &hk_k5); @@ -1728,7 +1873,20 @@ return ccname; } -int +KRB5_LIB_FUNCTION char * KRB5_LIB_CALL +_krb5_get_default_cc_name_from_registry(krb5_context context) +{ + char *ccname; + + ccname = _get_default_cc_name_from_registry(context, HKEY_CURRENT_USER); + if (ccname == NULL) + ccname = _get_default_cc_name_from_registry(context, + HKEY_LOCAL_MACHINE); + + return ccname; +} + +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_set_default_cc_name_to_registry(krb5_context context, krb5_ccache id) { HKEY hk_k5 = 0; @@ -1759,5 +1917,4 @@ return ret; } - #endif diff --git a/crypto/heimdal/lib/krb5/changepw.c b/crypto/heimdal/lib/krb5/changepw.c --- a/crypto/heimdal/lib/krb5/changepw.c +++ b/crypto/heimdal/lib/krb5/changepw.c @@ -40,7 +40,7 @@ static void str2data (krb5_data *d, const char *fmt, - ...) __attribute__ ((format (printf, 2, 3))); + ...) __attribute__ ((__format__ (__printf__, 2, 3))); static void str2data (krb5_data *d, @@ -302,6 +302,10 @@ _krb5_get_int(reply, &size, 4); if (size + 4 < len) continue; + if (sizeof(reply) - 4 < size) { + krb5_set_error_message(context, ERANGE, "size from server too large %s", host); + return ERANGE; + } memmove(reply, reply + 4, size); len = size; break; @@ -326,7 +330,7 @@ if (len < 6) { str2data (result_string, "server %s sent to too short message " - "(%zu bytes)", host, len); + "(%llu bytes)", host, (unsigned long long)len); *result_code = KRB5_KPASSWD_MALFORMED; return 0; } diff --git a/crypto/heimdal/lib/krb5/config_file.c b/crypto/heimdal/lib/krb5/config_file.c --- a/crypto/heimdal/lib/krb5/config_file.c +++ b/crypto/heimdal/lib/krb5/config_file.c @@ -82,7 +82,7 @@ krb5_config_binding **parent, const char **err_message); -krb5_config_section * +KRB5_LIB_FUNCTION krb5_config_section * KRB5_LIB_CALL _krb5_config_get_entry(krb5_config_section **parent, const char *name, int type) { krb5_config_section **q; @@ -353,6 +353,9 @@ char buf[KRB5_BUFSIZ]; krb5_error_code ret; + *lineno = 0; + *err_message = ""; + while (config_fgets(buf, sizeof(buf), f) != NULL) { char *p; @@ -370,11 +373,11 @@ b = NULL; } else if (*p == '}') { *err_message = "unmatched }"; - return EINVAL; /* XXX */ + return KRB5_CONFIG_BADFORMAT; } else if(*p != '\0') { if (s == NULL) { *err_message = "binding before section"; - return EINVAL; + return KRB5_CONFIG_BADFORMAT; } ret = parse_binding(f, lineno, p, &b, &s->u.list, err_message); if (ret) @@ -425,7 +428,7 @@ * current users home directory. The behavior can be disabled and * enabled by calling krb5_set_home_dir_access(). */ - if (fname[0] == '~' && fname[1] == '/') { + if (ISTILDE(fname[0]) && ISPATHSEP(fname[1])) { #ifndef KRB5_USE_PATH_TOKENS const char *home = NULL; @@ -444,22 +447,17 @@ home = pw->pw_dir; } if (home) { - asprintf(&newfname, "%s%s", home, &fname[1]); - if (newfname == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + int aret; + + aret = asprintf(&newfname, "%s%s", home, &fname[1]); + if (aret == -1 || newfname == NULL) + return krb5_enomem(context); fname = newfname; } #else /* KRB5_USE_PATH_TOKENS */ if (asprintf(&newfname, "%%{USERCONFIG}%s", &fname[1]) < 0 || newfname == NULL) - { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + return krb5_enomem(context); fname = newfname; #endif } @@ -483,7 +481,7 @@ #ifdef KRB5_USE_PATH_TOKENS char * exp_fname = NULL; - ret = _krb5_expand_path_tokens(context, fname, &exp_fname); + ret = _krb5_expand_path_tokens(context, fname, 1, &exp_fname); if (ret) { if (newfname) free(newfname); @@ -697,7 +695,7 @@ } -const void * +KRB5_LIB_FUNCTION const void * KRB5_LIB_CALL _krb5_config_vget (krb5_context context, const krb5_config_section *c, int type, @@ -939,13 +937,17 @@ s = next_component_string(tmp, " \t", &pos); while(s){ char **tmp2 = realloc(strings, (nstr + 1) * sizeof(*strings)); - if(tmp2 == NULL) + if(tmp2 == NULL) { + free(tmp); goto cleanup; + } strings = tmp2; strings[nstr] = strdup(s); nstr++; - if(strings[nstr-1] == NULL) + if(strings[nstr-1] == NULL) { + free(tmp); goto cleanup; + } s = next_component_string(NULL, " \t", &pos); } free(tmp); diff --git a/crypto/heimdal/lib/krb5/config_reg.c b/crypto/heimdal/lib/krb5/config_reg.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/config_reg.c @@ -0,0 +1,649 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include "krb5_locl.h" + +#ifndef _WIN32 +#error config_reg.c is only for Windows +#endif + +#include + +#ifndef MAX_DWORD +#define MAX_DWORD 0xFFFFFFFF +#endif + +#define REGPATH_KERBEROS "SOFTWARE\\Kerberos" +#define REGPATH_HEIMDAL "SOFTWARE\\Heimdal" + +/** + * Store a string as a registry value of the specified type + * + * The following registry types are handled: + * + * - REG_DWORD: The string is converted to a number. + * + * - REG_SZ: The string is stored as is. + * + * - REG_EXPAND_SZ: The string is stored as is. + * + * - REG_MULTI_SZ: + * + * . If a separator is specified, the input string is broken + * up into multiple strings and stored as a multi-sz. + * + * . If no separator is provided, the input string is stored + * as a multi-sz. + * + * - REG_NONE: + * + * . If the string is all numeric, it will be stored as a + * REG_DWORD. + * + * . Otherwise, the string is stored as a REG_SZ. + * + * Other types are rejected. + * + * If cb_data is MAX_DWORD, the string pointed to by data must be nul-terminated + * otherwise a buffer overrun will occur. + * + * @param [in]valuename Name of the registry value to be modified or created + * @param [in]type Type of the value. REG_NONE if unknown + * @param [in]data The input string to be stored in the registry. + * @param [in]cb_data Size of the input string in bytes. MAX_DWORD if unknown. + * @param [in]separator Separator character for parsing strings. + * + * @retval 0 if success or non-zero on error. + * If non-zero is returned, an error message has been set using + * krb5_set_error_message(). + * + */ +KRB5_LIB_FUNCTION int KRB5_LIB_CALL +_krb5_store_string_to_reg_value(krb5_context context, + HKEY key, const char * valuename, + DWORD type, const char *data, DWORD cb_data, + const char * separator) +{ + LONG rcode; + DWORD dwData; + BYTE static_buffer[16384]; + BYTE *pbuffer = &static_buffer[0]; + + if (data == NULL) + { + if (context) + krb5_set_error_message(context, 0, + "'data' must not be NULL"); + return -1; + } + + if (cb_data == MAX_DWORD) + { + cb_data = (DWORD)strlen(data) + 1; + } + else if ((type == REG_MULTI_SZ && cb_data >= sizeof(static_buffer) - 1) || + cb_data >= sizeof(static_buffer)) + { + if (context) + krb5_set_error_message(context, 0, "cb_data too big"); + return -1; + } + else if (data[cb_data-1] != '\0') + { + memcpy(static_buffer, data, cb_data); + static_buffer[cb_data++] = '\0'; + if (type == REG_MULTI_SZ) + static_buffer[cb_data++] = '\0'; + data = static_buffer; + } + + if (type == REG_NONE) + { + /* + * If input is all numeric, convert to DWORD and save as REG_DWORD. + * Otherwise, store as REG_SZ. + */ + if ( StrToIntExA( data, STIF_SUPPORT_HEX, &dwData) ) + { + type = REG_DWORD; + } else { + type = REG_SZ; + } + } + + switch (type) { + case REG_SZ: + case REG_EXPAND_SZ: + rcode = RegSetValueEx(key, valuename, 0, type, data, cb_data); + if (rcode) + { + if (context) + krb5_set_error_message(context, 0, + "Unexpected error when setting registry value %s gle 0x%x", + valuename, + GetLastError()); + return -1; + } + break; + case REG_MULTI_SZ: + if (separator && *separator) + { + char *cp; + + if (data != static_buffer) + static_buffer[cb_data++] = '\0'; + + for ( cp = static_buffer; cp < static_buffer+cb_data; cp++) + { + if (*cp == *separator) + *cp = '\0'; + } + + rcode = RegSetValueEx(key, valuename, 0, type, data, cb_data); + if (rcode) + { + if (context) + krb5_set_error_message(context, 0, + "Unexpected error when setting registry value %s gle 0x%x", + valuename, + GetLastError()); + return -1; + } + } + break; + case REG_DWORD: + if ( !StrToIntExA( data, STIF_SUPPORT_HEX, &dwData) ) + { + if (context) + krb5_set_error_message(context, 0, + "Unexpected error when parsing %s as number gle 0x%x", + data, + GetLastError()); + } + + rcode = RegSetValueEx(key, valuename, 0, type, (BYTE *)&dwData, sizeof(DWORD)); + if (rcode) + { + if (context) + krb5_set_error_message(context, 0, + "Unexpected error when setting registry value %s gle 0x%x", + valuename, + GetLastError()); + return -1; + } + break; + default: + return -1; + } + + return 0; +} + +/** + * Parse a registry value as a string + * + * @see _krb5_parse_reg_value_as_multi_string() + */ +KRB5_LIB_FUNCTION char * KRB5_LIB_CALL +_krb5_parse_reg_value_as_string(krb5_context context, + HKEY key, const char * valuename, + DWORD type, DWORD cb_data) +{ + return _krb5_parse_reg_value_as_multi_string(context, key, valuename, + type, cb_data, " "); +} + +/** + * Parse a registry value as a multi string + * + * The following registry value types are handled: + * + * - REG_DWORD: The decimal string representation is used as the + * value. + * + * - REG_SZ: The string is used as-is. + * + * - REG_EXPAND_SZ: Environment variables in the string are expanded + * and the result is used as the value. + * + * - REG_MULTI_SZ: The list of strings is concatenated using the + * separator. No quoting is performed. + * + * Any other value type is rejected. + * + * @param [in]valuename Name of the registry value to be queried + * @param [in]type Type of the value. REG_NONE if unknown + * @param [in]cbdata Size of value. 0 if unknown. + * @param [in]separator Separator character for concatenating strings. + * + * @a type and @a cbdata are only considered valid if both are + * specified. + * + * @retval The registry value string, or NULL if there was an error. + * If NULL is returned, an error message has been set using + * krb5_set_error_message(). + */ +KRB5_LIB_FUNCTION char * KRB5_LIB_CALL +_krb5_parse_reg_value_as_multi_string(krb5_context context, + HKEY key, const char * valuename, + DWORD type, DWORD cb_data, char *separator) +{ + LONG rcode = ERROR_MORE_DATA; + + BYTE static_buffer[16384]; + BYTE *pbuffer = &static_buffer[0]; + DWORD cb_alloc = sizeof(static_buffer); + char *ret_string = NULL; + + /* If we know a type and cb_data from a previous call to + * RegEnumValue(), we use it. Otherwise we use the + * static_buffer[] and query directly. We do this to minimize the + * number of queries. */ + + if (type == REG_NONE || cb_data == 0) { + + pbuffer = &static_buffer[0]; + cb_alloc = cb_data = sizeof(static_buffer); + rcode = RegQueryValueExA(key, valuename, NULL, &type, pbuffer, &cb_data); + + if (rcode == ERROR_SUCCESS && + + ((type != REG_SZ && + type != REG_EXPAND_SZ) || cb_data + 1 <= sizeof(static_buffer)) && + + (type != REG_MULTI_SZ || cb_data + 2 <= sizeof(static_buffer))) + goto have_data; + + if (rcode != ERROR_MORE_DATA && rcode != ERROR_SUCCESS) + return NULL; + } + + /* Either we don't have the data or we aren't sure of the size + * (due to potentially missing terminating NULs). */ + + switch (type) { + case REG_DWORD: + if (cb_data != sizeof(DWORD)) { + if (context) + krb5_set_error_message(context, 0, + "Unexpected size while reading registry value %s", + valuename); + return NULL; + } + break; + + case REG_SZ: + case REG_EXPAND_SZ: + + if (rcode == ERROR_SUCCESS && cb_data > 0 && pbuffer[cb_data - 1] == '\0') + goto have_data; + + cb_data += sizeof(char); /* Accout for potential missing NUL + * terminator. */ + break; + + case REG_MULTI_SZ: + + if (rcode == ERROR_SUCCESS && cb_data > 0 && pbuffer[cb_data - 1] == '\0' && + (cb_data == 1 || pbuffer[cb_data - 2] == '\0')) + goto have_data; + + cb_data += sizeof(char) * 2; /* Potential missing double NUL + * terminator. */ + break; + + default: + if (context) + krb5_set_error_message(context, 0, + "Unexpected type while reading registry value %s", + valuename); + return NULL; + } + + if (cb_data <= sizeof(static_buffer)) + pbuffer = &static_buffer[0]; + else { + pbuffer = malloc(cb_data); + if (pbuffer == NULL) + return NULL; + } + + cb_alloc = cb_data; + rcode = RegQueryValueExA(key, valuename, NULL, NULL, pbuffer, &cb_data); + + if (rcode != ERROR_SUCCESS) { + + /* This can potentially be from a race condition. I.e. some + * other process or thread went and modified the registry + * value between the time we queried its size and queried for + * its value. Ideally we would retry the query in a loop. */ + + if (context) + krb5_set_error_message(context, 0, + "Unexpected error while reading registry value %s", + valuename); + goto done; + } + + if (cb_data > cb_alloc || cb_data == 0) { + if (context) + krb5_set_error_message(context, 0, + "Unexpected size while reading registry value %s", + valuename); + goto done; + } + +have_data: + switch (type) { + case REG_DWORD: + asprintf(&ret_string, "%d", *((DWORD *) pbuffer)); + break; + + case REG_SZ: + { + char * str = (char *) pbuffer; + + if (str[cb_data - 1] != '\0') { + if (cb_data < cb_alloc) + str[cb_data] = '\0'; + else + break; + } + + if (pbuffer != static_buffer) { + ret_string = (char *) pbuffer; + pbuffer = NULL; + } else { + ret_string = strdup((char *) pbuffer); + } + } + break; + + case REG_EXPAND_SZ: + { + char *str = (char *) pbuffer; + char expsz[32768]; /* Size of output buffer for + * ExpandEnvironmentStrings() is + * limited to 32K. */ + + if (str[cb_data - 1] != '\0') { + if (cb_data < cb_alloc) + str[cb_data] = '\0'; + else + break; + } + + if (ExpandEnvironmentStrings(str, expsz, sizeof(expsz)/sizeof(char)) != 0) { + ret_string = strdup(expsz); + } else { + if (context) + krb5_set_error_message(context, 0, + "Overflow while expanding environment strings " + "for registry value %s", valuename); + } + } + break; + + case REG_MULTI_SZ: + { + char * str = (char *) pbuffer; + char * iter; + + str[cb_alloc - 1] = '\0'; + str[cb_alloc - 2] = '\0'; + + for (iter = str; *iter;) { + size_t len = strlen(iter); + + iter += len; + if (iter[1] != '\0') + *iter++ = *separator; + else + break; + } + + if (pbuffer != static_buffer) { + ret_string = str; + pbuffer = NULL; + } else { + ret_string = strdup(str); + } + } + break; + + default: + if (context) + krb5_set_error_message(context, 0, + "Unexpected type while reading registry value %s", + valuename); + } + +done: + if (pbuffer != static_buffer && pbuffer != NULL) + free(pbuffer); + + return ret_string; +} + +/** + * Parse a registry value as a configuration value + * + * @see parse_reg_value_as_string() + */ +static krb5_error_code +parse_reg_value(krb5_context context, + HKEY key, const char * valuename, + DWORD type, DWORD cbdata, krb5_config_section ** parent) +{ + char *reg_string = NULL; + krb5_config_section *value; + krb5_error_code code = 0; + + reg_string = _krb5_parse_reg_value_as_string(context, key, valuename, type, cbdata); + + if (reg_string == NULL) + return KRB5_CONFIG_BADFORMAT; + + value = _krb5_config_get_entry(parent, valuename, krb5_config_string); + if (value == NULL) { + code = ENOMEM; + goto done; + } + + if (value->u.string != NULL) + free(value->u.string); + + value->u.string = reg_string; + reg_string = NULL; + +done: + if (reg_string != NULL) + free(reg_string); + + return code; +} + +static krb5_error_code +parse_reg_values(krb5_context context, + HKEY key, + krb5_config_section ** parent) +{ + DWORD index; + LONG rcode; + + for (index = 0; ; index ++) { + char name[16385]; + DWORD cch = sizeof(name)/sizeof(name[0]); + DWORD type; + DWORD cbdata = 0; + krb5_error_code code; + + rcode = RegEnumValue(key, index, name, &cch, NULL, + &type, NULL, &cbdata); + if (rcode != ERROR_SUCCESS) + break; + + if (cbdata == 0) + continue; + + code = parse_reg_value(context, key, name, type, cbdata, parent); + if (code != 0) + return code; + } + + return 0; +} + +static krb5_error_code +parse_reg_subkeys(krb5_context context, + HKEY key, + krb5_config_section ** parent) +{ + DWORD index; + LONG rcode; + + for (index = 0; ; index ++) { + HKEY subkey = NULL; + char name[256]; + DWORD cch = sizeof(name)/sizeof(name[0]); + krb5_config_section *section = NULL; + krb5_error_code code; + + rcode = RegEnumKeyEx(key, index, name, &cch, NULL, NULL, NULL, NULL); + if (rcode != ERROR_SUCCESS) + break; + + rcode = RegOpenKeyEx(key, name, 0, KEY_READ, &subkey); + if (rcode != ERROR_SUCCESS) + continue; + + section = _krb5_config_get_entry(parent, name, krb5_config_list); + if (section == NULL) { + RegCloseKey(subkey); + return ENOMEM; + } + + code = parse_reg_values(context, subkey, §ion->u.list); + if (code) { + RegCloseKey(subkey); + return code; + } + + code = parse_reg_subkeys(context, subkey, §ion->u.list); + if (code) { + RegCloseKey(subkey); + return code; + } + + RegCloseKey(subkey); + } + + return 0; +} + +static krb5_error_code +parse_reg_root(krb5_context context, + HKEY key, + krb5_config_section ** parent) +{ + krb5_config_section *libdefaults = NULL; + krb5_error_code code = 0; + + libdefaults = _krb5_config_get_entry(parent, "libdefaults", krb5_config_list); + if (libdefaults == NULL) + return krb5_enomem(context); + + code = parse_reg_values(context, key, &libdefaults->u.list); + if (code) + return code; + + return parse_reg_subkeys(context, key, parent); +} + +static krb5_error_code +load_config_from_regpath(krb5_context context, + HKEY hk_root, + const char* key_path, + krb5_config_section ** res) +{ + HKEY key = NULL; + LONG rcode; + krb5_error_code code = 0; + + rcode = RegOpenKeyEx(hk_root, key_path, 0, KEY_READ, &key); + if (rcode == ERROR_SUCCESS) { + code = parse_reg_root(context, key, res); + RegCloseKey(key); + key = NULL; + } + + return code; +} + +/** + * Load configuration from registry + * + * The registry keys 'HKCU\Software\Heimdal' and + * 'HKLM\Software\Heimdal' are treated as krb5.conf files. Each + * registry key corresponds to a configuration section (or bound list) + * and each value in a registry key is treated as a bound value. The + * set of values that are directly under the Heimdal key are treated + * as if they were defined in the [libdefaults] section. + * + * @see parse_reg_value() for details about how each type of value is handled. + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_load_config_from_registry(krb5_context context, + krb5_config_section ** res) +{ + krb5_error_code code; + + code = load_config_from_regpath(context, HKEY_LOCAL_MACHINE, + REGPATH_KERBEROS, res); + if (code) + return code; + + code = load_config_from_regpath(context, HKEY_LOCAL_MACHINE, + REGPATH_HEIMDAL, res); + if (code) + return code; + + code = load_config_from_regpath(context, HKEY_CURRENT_USER, + REGPATH_KERBEROS, res); + if (code) + return code; + + code = load_config_from_regpath(context, HKEY_CURRENT_USER, + REGPATH_HEIMDAL, res); + if (code) + return code; + return 0; +} diff --git a/crypto/heimdal/lib/krb5/constants.c b/crypto/heimdal/lib/krb5/constants.c --- a/crypto/heimdal/lib/krb5/constants.c +++ b/crypto/heimdal/lib/krb5/constants.c @@ -36,6 +36,9 @@ #include "krb5_locl.h" KRB5_LIB_VARIABLE const char *krb5_config_file = +#ifdef KRB5_DEFAULT_CONFIG_FILE +KRB5_DEFAULT_CONFIG_FILE +#else #ifdef __APPLE__ "~/Library/Preferences/com.apple.Kerberos.plist" PATH_SEP "/Library/Preferences/com.apple.Kerberos.plist" PATH_SEP @@ -43,13 +46,14 @@ "/Library/Preferences/edu.mit.Kerberos" PATH_SEP #endif /* __APPLE__ */ "~/.krb5/config" PATH_SEP -SYSCONFDIR "/krb5.conf" +SYSCONFDIR "/krb5.conf" PATH_SEP #ifdef _WIN32 -PATH_SEP "%{COMMON_APPDATA}/Kerberos/krb5.conf" -PATH_SEP "%{WINDOWS}/krb5.ini" -#else -PATH_SEP "/etc/krb5.conf" -#endif +"%{COMMON_APPDATA}/Kerberos/krb5.conf" PATH_SEP +"%{WINDOWS}/krb5.ini" +#else /* _WIN32 */ +"/etc/krb5.conf" +#endif /* _WIN32 */ +#endif /* KRB5_DEFAULT_CONFIG_FILE */ ; KRB5_LIB_VARIABLE const char *krb5_defkeyname = KEYTAB_DEFAULT; @@ -59,3 +63,4 @@ KRB5_LIB_VARIABLE const char *krb5_cc_type_memory = "MEMORY"; KRB5_LIB_VARIABLE const char *krb5_cc_type_kcm = "KCM"; KRB5_LIB_VARIABLE const char *krb5_cc_type_scc = "SCC"; +KRB5_LIB_VARIABLE const char *krb5_cc_type_dcc = "DIR"; diff --git a/crypto/heimdal/lib/krb5/context.c b/crypto/heimdal/lib/krb5/context.c --- a/crypto/heimdal/lib/krb5/context.c +++ b/crypto/heimdal/lib/krb5/context.c @@ -48,6 +48,11 @@ } \ } while(0) +static krb5_error_code +copy_enctypes(krb5_context context, + const krb5_enctype *in, + krb5_enctype **out); + /* * Set the list of etypes `ret_etypes' from the configuration variable * `name' @@ -69,8 +74,7 @@ etypes = malloc((i+1) * sizeof(*etypes)); if (etypes == NULL) { krb5_config_free_strings (etypes_str); - krb5_set_error_message (context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } for(j = 0, k = 0; j < i; j++) { krb5_enctype e; @@ -100,7 +104,8 @@ krb5_enctype *tmptypes = NULL; INIT_FIELD(context, time, max_skew, 5 * 60, "clockskew"); - INIT_FIELD(context, time, kdc_timeout, 3, "kdc_timeout"); + INIT_FIELD(context, time, kdc_timeout, 30, "kdc_timeout"); + INIT_FIELD(context, time, host_timeout, 3, "host_timeout"); INIT_FIELD(context, int, max_retries, 3, "max_retries"); INIT_FIELD(context, string, http_proxy, NULL, "http_proxy"); @@ -123,6 +128,18 @@ free(context->etypes); context->etypes = tmptypes; + /* The etypes member may change during the lifetime + * of the context. To be able to reset it to + * config value, we keep another copy. + */ + free(context->cfg_etypes); + context->cfg_etypes = NULL; + if (tmptypes) { + ret = copy_enctypes(context, tmptypes, &context->cfg_etypes); + if (ret) + return ret; + } + ret = set_etypes (context, "default_etypes_des", &tmptypes); if(ret) return ret; @@ -147,15 +164,8 @@ free(context->permitted_enctypes); context->permitted_enctypes = tmptypes; - /* default keytab name */ - tmp = NULL; - if(!issuid()) - tmp = getenv("KRB5_KTNAME"); - if(tmp != NULL) - context->default_keytab = tmp; - else - INIT_FIELD(context, string, default_keytab, - KEYTAB_DEFAULT, "default_keytab_name"); + INIT_FIELD(context, string, default_keytab, + KEYTAB_DEFAULT, "default_keytab_name"); INIT_FIELD(context, string, default_keytab_modify, NULL, "default_keytab_modify_name"); @@ -220,14 +230,22 @@ INIT_FIELD(context, bool, srv_lookup, TRUE, "srv_lookup"); INIT_FIELD(context, bool, srv_lookup, context->srv_lookup, "dns_lookup_kdc"); INIT_FIELD(context, int, large_msg_size, 1400, "large_message_size"); + INIT_FIELD(context, int, max_msg_size, 1000 * 1024, "maximum_message_size"); INIT_FLAG(context, flags, KRB5_CTX_F_DNS_CANONICALIZE_HOSTNAME, TRUE, "dns_canonicalize_hostname"); INIT_FLAG(context, flags, KRB5_CTX_F_CHECK_PAC, TRUE, "check_pac"); + + if (context->default_cc_name) + free(context->default_cc_name); context->default_cc_name = NULL; context->default_cc_name_set = 0; s = krb5_config_get_strings(context, NULL, "logging", "krb5", NULL); if(s) { char **p; + + if (context->debug_dest) + krb5_closelog(context, context->debug_dest); + krb5_initlog(context, "libkrb5", &context->debug_dest); for(p = s; *p; p++) krb5_addlog_dest(context, context->debug_dest, *p); @@ -242,6 +260,11 @@ if (strcasecmp(tmp, "ignore") == 0) context->flags |= KRB5_CTX_F_RD_REQ_IGNORE; } + ret = krb5_config_get_bool_default(context, NULL, TRUE, + "libdefaults", + "fcache_strict_checking", NULL); + if (ret) + context->flags |= KRB5_CTX_F_FCACHE_STRICT_CHECKING; return 0; } @@ -256,6 +279,7 @@ krb5_cc_register(context, &krb5_acc_ops, TRUE); #endif krb5_cc_register(context, &krb5_fcc_ops, TRUE); + krb5_cc_register(context, &krb5_dcc_ops, TRUE); krb5_cc_register(context, &krb5_mcc_ops, TRUE); #ifdef HAVE_SCC krb5_cc_register(context, &krb5_scc_ops, TRUE); @@ -323,11 +347,8 @@ return 0; context->kt_types = malloc(sizeof(context->kt_types[0]) * src_context->num_kt_types); - if (context->kt_types == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (context->kt_types == NULL) + return krb5_enomem(context); context->num_kt_types = src_context->num_kt_types; memcpy(context->kt_types, src_context->kt_types, @@ -337,10 +358,17 @@ } static const char *sysplugin_dirs[] = { - LIBDIR "/plugin/krb5", +#ifdef _WIN32 + "$ORIGIN", +#else + "$ORIGIN/../lib/plugin/krb5", +#endif #ifdef __APPLE__ + LIBDIR "/plugin/krb5", +#ifdef HEIM_PLUGINS_SEARCH_SYSTEM "/Library/KerberosPlugins/KerberosFrameworkPlugins", "/System/Library/KerberosPlugins/KerberosFrameworkPlugins", +#endif #endif NULL }; @@ -349,8 +377,21 @@ init_context_once(void *ctx) { krb5_context context = ctx; + char **dirs; - _krb5_load_plugins(context, "krb5", sysplugin_dirs); +#ifdef _WIN32 + dirs = rk_UNCONST(sysplugin_dirs); +#else + dirs = krb5_config_get_strings(context, NULL, "libdefaults", + "plugin_dir", NULL); + if (dirs == NULL) + dirs = rk_UNCONST(sysplugin_dirs); +#endif + + _krb5_load_plugins(context, "krb5", (const char **)dirs); + + if (dirs != rk_UNCONST(sysplugin_dirs)) + krb5_config_free_strings(dirs); bindtextdomain(HEIMDAL_TEXTDOMAIN, HEIMDAL_LOCALEDIR); } @@ -366,7 +407,8 @@ * @return Returns 0 to indicate success. Otherwise an errno code is * returned. Failure means either that something bad happened during * initialization (typically ENOMEM) or that Kerberos should not be - * used ENXIO. + * used ENXIO. If the function returns HEIM_ERR_RANDOM_OFFLINE, the + * random source is not available and later Kerberos calls might fail. * * @ingroup krb5 */ @@ -378,23 +420,28 @@ krb5_context p; krb5_error_code ret; char **files; + uint8_t rnd; *context = NULL; + /** + * krb5_init_context() will get one random byte to make sure our + * random is alive. Assumption is that once the non blocking + * source allows us to pull bytes, its all seeded and allows us to + * pull more bytes. + * + * Most Kerberos users calls krb5_init_context(), so this is + * useful point where we can do the checking. + */ + ret = krb5_generate_random(&rnd, sizeof(rnd)); + if (ret) + return ret; + p = calloc(1, sizeof(*p)); if(!p) return ENOMEM; - p->mutex = malloc(sizeof(HEIMDAL_MUTEX)); - if (p->mutex == NULL) { - free(p); - return ENOMEM; - } - HEIMDAL_MUTEX_init(p->mutex); - - ret = fbsd_ossl_provider_load(); - if(ret) - goto out; + HEIMDAL_MUTEX_init(&p->mutex); p->flags |= KRB5_CTX_F_HOMEDIR_ACCESS; @@ -406,6 +453,9 @@ if(ret) goto out; + /* done enough to load plugins */ + heim_base_once_f(&init_context, p, init_context_once); + /* init error tables */ krb5_init_ets(p); cc_ops_register(p); @@ -423,8 +473,6 @@ if(ret) { krb5_free_context(p); p = NULL; - } else { - heim_base_once_f(&init_context, p, init_context_once); } *context = p; return ret; @@ -454,13 +502,10 @@ ; i++; - *ret_enctypes = malloc(sizeof(ret_enctypes[0]) * i); - if (*ret_enctypes == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } - memcpy(*ret_enctypes, enctypes, sizeof(ret_enctypes[0]) * i); + *ret_enctypes = malloc(sizeof(enctypes[0]) * i); + if (*ret_enctypes == NULL) + return krb5_enomem(context); + memcpy(*ret_enctypes, enctypes, sizeof(enctypes[0]) * i); return 0; } @@ -486,19 +531,10 @@ *out = NULL; p = calloc(1, sizeof(*p)); - if (p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } - - p->mutex = malloc(sizeof(HEIMDAL_MUTEX)); - if (p->mutex == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - free(p); - return ENOMEM; - } - HEIMDAL_MUTEX_init(p->mutex); + if (p == NULL) + return krb5_enomem(context); + HEIMDAL_MUTEX_init(&p->mutex); if (context->default_cc_name) p->default_cc_name = strdup(context->default_cc_name); @@ -510,6 +546,11 @@ if (ret) goto out; } + if (context->cfg_etypes) { + ret = copy_etypes(context, context->cfg_etypes, &p->cfg_etypes); + if (ret) + goto out; + } if (context->etypes_des) { ret = copy_etypes(context, context->etypes_des, &p->etypes_des); if (ret) @@ -573,11 +614,13 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context(krb5_context context) { + _krb5_free_name_canon_rules(context, context->name_canon_rules); if (context->default_cc_name) free(context->default_cc_name); if (context->default_cc_name_env) free(context->default_cc_name_env); free(context->etypes); + free(context->cfg_etypes); free(context->etypes_des); krb5_free_host_realm (context, context->default_realms); krb5_config_file_free (context, context->cf); @@ -598,8 +641,7 @@ hx509_context_free(&context->hx509ctx); #endif - HEIMDAL_MUTEX_destroy(context->mutex); - free(context->mutex); + HEIMDAL_MUTEX_destroy(&context->mutex); if (context->flags & KRB5_CTX_F_SOCKETS_INITIALIZED) { rk_SOCK_EXIT(); } @@ -627,7 +669,8 @@ krb5_config_binding *tmp = NULL; while(filenames != NULL && *filenames != NULL && **filenames != '\0') { ret = krb5_config_parse_file_multi(context, *filenames, &tmp); - if(ret != 0 && ret != ENOENT && ret != EACCES && ret != EPERM) { + if (ret != 0 && ret != ENOENT && ret != EACCES && ret != EPERM + && ret != KRB5_CONFIG_BADFORMAT) { krb5_config_file_free(context, tmp); return ret; } @@ -773,7 +816,7 @@ * to find the configuration file location in the * SOFTWARE\MIT\Kerberos registry key under the value "config". */ -char * +KRB5_LIB_FUNCTION char * KRB5_LIB_CALL _krb5_get_default_config_config_files_from_registry() { static const char * KeyName = "Software\\MIT\\Kerberos"; @@ -885,6 +928,18 @@ static const krb5_enctype p[] = { ETYPE_AES256_CTS_HMAC_SHA1_96, ETYPE_AES128_CTS_HMAC_SHA1_96, + ETYPE_AES256_CTS_HMAC_SHA384_192, + ETYPE_AES128_CTS_HMAC_SHA256_128, + ETYPE_DES3_CBC_SHA1, + ETYPE_ARCFOUR_HMAC_MD5, + ETYPE_NULL + }; + + static const krb5_enctype weak[] = { + ETYPE_AES256_CTS_HMAC_SHA1_96, + ETYPE_AES128_CTS_HMAC_SHA1_96, + ETYPE_AES256_CTS_HMAC_SHA384_192, + ETYPE_AES128_CTS_HMAC_SHA256_128, ETYPE_DES3_CBC_SHA1, ETYPE_DES3_CBC_MD5, ETYPE_ARCFOUR_HMAC_MD5, @@ -893,6 +948,20 @@ ETYPE_DES_CBC_CRC, ETYPE_NULL }; + + /* + * if the list of enctypes enabled by "allow_weak_crypto" + * are valid, then return the former default enctype list + * that contained the weak entries. + */ + if (krb5_enctype_valid(context, ETYPE_DES_CBC_CRC) == 0 && + krb5_enctype_valid(context, ETYPE_DES_CBC_MD4) == 0 && + krb5_enctype_valid(context, ETYPE_DES_CBC_MD5) == 0 && + krb5_enctype_valid(context, ETYPE_DES_CBC_NONE) == 0 && + krb5_enctype_valid(context, ETYPE_DES_CFB64_NONE) == 0 && + krb5_enctype_valid(context, ETYPE_DES_PCBC_NONE) == 0) + return weak; + return p; } @@ -948,6 +1017,8 @@ * * @param context Kerberos 5 context. * @param etypes Encryption types, array terminated with ETYPE_NULL (0). + * A value of NULL resets the encryption types to the defaults set in the + * configuration file. * * @return Returns 0 to indicate success. Otherwise an kerberos et * error code is returned, see krb5_get_error_message(). @@ -962,6 +1033,10 @@ krb5_error_code ret; krb5_enctype *p = NULL; + if(!etypes) { + etypes = context->cfg_etypes; + } + if(etypes) { ret = copy_enctypes(context, etypes, &p); if (ret) @@ -978,6 +1053,7 @@ * with the KDC, clients and servers. * * @param context Kerberos 5 context. + * @param pdu_type request type (AS, TGS or none) * @param etypes Encryption types, array terminated with * ETYPE_NULL(0), caller should free array with krb5_xfree(): * @@ -998,7 +1074,7 @@ heim_assert(pdu_type == KRB5_PDU_AS_REQUEST || pdu_type == KRB5_PDU_TGS_REQUEST || - pdu_type == KRB5_PDU_NONE, "pdu contant not as expected"); + pdu_type == KRB5_PDU_NONE, "unexpected pdu type"); if (pdu_type == KRB5_PDU_AS_REQUEST && context->as_etypes != NULL) enctypes = context->as_etypes; @@ -1137,10 +1213,8 @@ } if(context->extra_addresses == NULL) { context->extra_addresses = malloc(sizeof(*context->extra_addresses)); - if(context->extra_addresses == NULL) { - krb5_set_error_message (context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (context->extra_addresses == NULL) + return krb5_enomem(context); } return krb5_copy_addresses(context, addresses, context->extra_addresses); } @@ -1219,10 +1293,8 @@ } if(context->ignore_addresses == NULL) { context->ignore_addresses = malloc(sizeof(*context->ignore_addresses)); - if(context->ignore_addresses == NULL) { - krb5_set_error_message (context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (context->ignore_addresses == NULL) + return krb5_enomem(context); } return krb5_copy_addresses(context, addresses, context->ignore_addresses); } @@ -1461,17 +1533,11 @@ static HEIMDAL_MUTEX homedir_mutex = HEIMDAL_MUTEX_INITIALIZER; static krb5_boolean allow_homedir = TRUE; -krb5_boolean +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_homedir_access(krb5_context context) { krb5_boolean allow; -#ifdef HAVE_GETEUID - /* is never allowed for root */ - if (geteuid() == 0) - return FALSE; -#endif - if (context && (context->flags & KRB5_CTX_F_HOMEDIR_ACCESS) == 0) return FALSE; @@ -1490,8 +1556,6 @@ * For home directory access to be allowed, both the global state and * the krb5_context state have to be allowed. * - * Administrator (root user), never uses the home directory. - * * @param context a Kerberos 5 context or NULL * @param allow allow if TRUE home directory * @return the old value diff --git a/crypto/heimdal/lib/krb5/copy_host_realm.c b/crypto/heimdal/lib/krb5/copy_host_realm.c --- a/crypto/heimdal/lib/krb5/copy_host_realm.c +++ b/crypto/heimdal/lib/krb5/copy_host_realm.c @@ -58,19 +58,14 @@ ++n; *to = calloc (n, sizeof(**to)); - if (*to == NULL) { - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*to == NULL) + return krb5_enomem(context); for (i = 0, p = from; *p != NULL; ++p, ++i) { (*to)[i] = strdup(*p); if ((*to)[i] == NULL) { krb5_free_host_realm (context, *to); - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } } return 0; diff --git a/crypto/heimdal/lib/krb5/crc.c b/crypto/heimdal/lib/krb5/crc.c --- a/crypto/heimdal/lib/krb5/crc.c +++ b/crypto/heimdal/lib/krb5/crc.c @@ -37,7 +37,7 @@ #define CRC_GEN 0xEDB88320L -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_crc_init_table(void) { static int flag = 0; @@ -60,7 +60,7 @@ flag = 1; } -uint32_t +KRB5_LIB_FUNCTION uint32_t KRB5_LIB_CALL _krb5_crc_update (const char *p, size_t len, uint32_t res) { while (len--) diff --git a/crypto/heimdal/lib/krb5/creds.c b/crypto/heimdal/lib/krb5/creds.c --- a/crypto/heimdal/lib/krb5/creds.c +++ b/crypto/heimdal/lib/krb5/creds.c @@ -138,13 +138,9 @@ { krb5_creds *c; - c = malloc (sizeof (*c)); - if (c == NULL) { - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } - memset (c, 0, sizeof(*c)); + c = calloc(1, sizeof(*c)); + if (c == NULL) + return krb5_enomem(context); *outcred = c; return krb5_copy_creds_contents (context, incred, c); } @@ -164,8 +160,9 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds (krb5_context context, krb5_creds *c) { - krb5_free_cred_contents (context, c); - free (c); + if (c != NULL) + krb5_free_cred_contents(context, c); + free(c); return 0; } diff --git a/crypto/heimdal/lib/krb5/crypto-aes-sha1.c b/crypto/heimdal/lib/krb5/crypto-aes-sha1.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/crypto-aes-sha1.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + +/* + * AES + */ + +static struct _krb5_key_type keytype_aes128_sha1 = { + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96, + "aes-128", + 128, + 16, + sizeof(struct _krb5_evp_schedule), + NULL, + _krb5_evp_schedule, + _krb5_AES_SHA1_salt, + NULL, + _krb5_evp_cleanup, + EVP_aes_128_cbc +}; + +static struct _krb5_key_type keytype_aes256_sha1 = { + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96, + "aes-256", + 256, + 32, + sizeof(struct _krb5_evp_schedule), + NULL, + _krb5_evp_schedule, + _krb5_AES_SHA1_salt, + NULL, + _krb5_evp_cleanup, + EVP_aes_256_cbc +}; + +struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes128 = { + CKSUMTYPE_HMAC_SHA1_96_AES_128, + "hmac-sha1-96-aes128", + 64, + 12, + F_KEYED | F_CPROOF | F_DERIVED, + _krb5_SP_HMAC_SHA1_checksum, + NULL +}; + +struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes256 = { + CKSUMTYPE_HMAC_SHA1_96_AES_256, + "hmac-sha1-96-aes256", + 64, + 12, + F_KEYED | F_CPROOF | F_DERIVED, + _krb5_SP_HMAC_SHA1_checksum, + NULL +}; + +static krb5_error_code +AES_SHA1_PRF(krb5_context context, + krb5_crypto crypto, + const krb5_data *in, + krb5_data *out) +{ + struct _krb5_checksum_type *ct = crypto->et->checksum; + krb5_error_code ret; + Checksum result; + krb5_keyblock *derived; + + result.cksumtype = ct->type; + ret = krb5_data_alloc(&result.checksum, ct->checksumsize); + if (ret) { + krb5_set_error_message(context, ret, N_("malloc: out memory", "")); + return ret; + } + + ret = (*ct->checksum)(context, NULL, in->data, in->length, 0, &result); + if (ret) { + krb5_data_free(&result.checksum); + return ret; + } + + if (result.checksum.length < crypto->et->blocksize) + krb5_abortx(context, "internal prf error"); + + derived = NULL; + ret = krb5_derive_key(context, crypto->key.key, + crypto->et->type, "prf", 3, &derived); + if (ret) + krb5_abortx(context, "krb5_derive_key"); + + ret = krb5_data_alloc(out, crypto->et->blocksize); + if (ret) + krb5_abortx(context, "malloc failed"); + + { + const EVP_CIPHER *c = (*crypto->et->keytype->evp)(); + EVP_CIPHER_CTX ctx; + + EVP_CIPHER_CTX_init(&ctx); /* ivec all zero */ + EVP_CipherInit_ex(&ctx, c, NULL, derived->keyvalue.data, NULL, 1); + EVP_Cipher(&ctx, out->data, result.checksum.data, + crypto->et->blocksize); + EVP_CIPHER_CTX_cleanup(&ctx); + } + + krb5_data_free(&result.checksum); + krb5_free_keyblock(context, derived); + + return ret; +} + +struct _krb5_encryption_type _krb5_enctype_aes128_cts_hmac_sha1 = { + ETYPE_AES128_CTS_HMAC_SHA1_96, + "aes128-cts-hmac-sha1-96", + "aes128-cts", + 16, + 1, + 16, + &keytype_aes128_sha1, + &_krb5_checksum_sha1, + &_krb5_checksum_hmac_sha1_aes128, + F_DERIVED | F_RFC3961_ENC | F_RFC3961_KDF, + _krb5_evp_encrypt_cts, + 16, + AES_SHA1_PRF +}; + +struct _krb5_encryption_type _krb5_enctype_aes256_cts_hmac_sha1 = { + ETYPE_AES256_CTS_HMAC_SHA1_96, + "aes256-cts-hmac-sha1-96", + "aes256-cts", + 16, + 1, + 16, + &keytype_aes256_sha1, + &_krb5_checksum_sha1, + &_krb5_checksum_hmac_sha1_aes256, + F_DERIVED | F_RFC3961_ENC | F_RFC3961_KDF, + _krb5_evp_encrypt_cts, + 16, + AES_SHA1_PRF +}; diff --git a/crypto/heimdal/lib/krb5/crypto-aes-sha2.c b/crypto/heimdal/lib/krb5/crypto-aes-sha2.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/crypto-aes-sha2.c @@ -0,0 +1,194 @@ +/* + * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + +/* + * AES HMAC-SHA2 + */ + +krb5_error_code +_krb5_aes_sha2_md_for_enctype(krb5_context context, + krb5_enctype enctype, + const EVP_MD **md) +{ + switch (enctype) { + case ETYPE_AES128_CTS_HMAC_SHA256_128: + *md = EVP_sha256(); + break; + case ETYPE_AES256_CTS_HMAC_SHA384_192: + *md = EVP_sha384(); + break; + default: + return KRB5_PROG_ETYPE_NOSUPP; + break; + } + return 0; +} + +static krb5_error_code +SP_HMAC_SHA2_checksum(krb5_context context, + struct _krb5_key_data *key, + const void *data, + size_t len, + unsigned usage, + Checksum *result) +{ + krb5_error_code ret; + const EVP_MD *md; + unsigned char hmac[EVP_MAX_MD_SIZE]; + unsigned int hmaclen = sizeof(hmac); + + ret = _krb5_aes_sha2_md_for_enctype(context, key->key->keytype, &md); + if (ret) + return ret; + + HMAC(md, key->key->keyvalue.data, key->key->keyvalue.length, + data, len, hmac, &hmaclen); + + heim_assert(result->checksum.length <= hmaclen, "SHA2 internal error"); + + memcpy(result->checksum.data, hmac, result->checksum.length); + + return 0; +} + +static struct _krb5_key_type keytype_aes128_sha2 = { + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128, + "aes-128-sha2", + 128, + 16, + sizeof(struct _krb5_evp_schedule), + NULL, + _krb5_evp_schedule, + _krb5_AES_SHA2_salt, + NULL, + _krb5_evp_cleanup, + EVP_aes_128_cbc +}; + +static struct _krb5_key_type keytype_aes256_sha2 = { + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192, + "aes-256-sha2", + 256, + 32, + sizeof(struct _krb5_evp_schedule), + NULL, + _krb5_evp_schedule, + _krb5_AES_SHA2_salt, + NULL, + _krb5_evp_cleanup, + EVP_aes_256_cbc +}; + +struct _krb5_checksum_type _krb5_checksum_hmac_sha256_128_aes128 = { + CKSUMTYPE_HMAC_SHA256_128_AES128, + "hmac-sha256-128-aes128", + 64, + 16, + F_KEYED | F_CPROOF | F_DERIVED, + SP_HMAC_SHA2_checksum, + NULL +}; + +struct _krb5_checksum_type _krb5_checksum_hmac_sha384_192_aes256 = { + CKSUMTYPE_HMAC_SHA384_192_AES256, + "hmac-sha384-192-aes256", + 128, + 24, + F_KEYED | F_CPROOF | F_DERIVED, + SP_HMAC_SHA2_checksum, + NULL +}; + +static krb5_error_code +AES_SHA2_PRF(krb5_context context, + krb5_crypto crypto, + const krb5_data *in, + krb5_data *out) +{ + krb5_error_code ret; + krb5_data label; + const EVP_MD *md = NULL; + + ret = _krb5_aes_sha2_md_for_enctype(context, crypto->et->type, &md); + if (ret) + return ret; + + label.data = "prf"; + label.length = 3; + + ret = krb5_data_alloc(out, EVP_MD_size(md)); + if (ret) + return ret; + + ret = _krb5_SP800_108_HMAC_KDF(context, &crypto->key.key->keyvalue, + &label, in, md, out); + + if (ret) + krb5_data_free(out); + + return ret; +} + +struct _krb5_encryption_type _krb5_enctype_aes128_cts_hmac_sha256_128 = { + ETYPE_AES128_CTS_HMAC_SHA256_128, + "aes128-cts-hmac-sha256-128", + "aes128-cts-sha256", + 16, + 1, + 16, + &keytype_aes128_sha2, + NULL, /* should never be called */ + &_krb5_checksum_hmac_sha256_128_aes128, + F_DERIVED | F_ENC_THEN_CKSUM | F_SP800_108_HMAC_KDF, + _krb5_evp_encrypt_cts, + 16, + AES_SHA2_PRF +}; + +struct _krb5_encryption_type _krb5_enctype_aes256_cts_hmac_sha384_192 = { + ETYPE_AES256_CTS_HMAC_SHA384_192, + "aes256-cts-hmac-sha384-192", + "aes256-cts-sha384", + 16, + 1, + 16, + &keytype_aes256_sha2, + NULL, /* should never be called */ + &_krb5_checksum_hmac_sha384_192_aes256, + F_DERIVED | F_ENC_THEN_CKSUM | F_SP800_108_HMAC_KDF, + _krb5_evp_encrypt_cts, + 16, + AES_SHA2_PRF +}; diff --git a/crypto/heimdal/lib/krb5/crypto-aes.c b/crypto/heimdal/lib/krb5/crypto-aes.c deleted file mode 100644 --- a/crypto/heimdal/lib/krb5/crypto-aes.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "krb5_locl.h" - -/* - * AES - */ - -static struct _krb5_key_type keytype_aes128 = { - ENCTYPE_AES128_CTS_HMAC_SHA1_96, - "aes-128", - 128, - 16, - sizeof(struct _krb5_evp_schedule), - NULL, - _krb5_evp_schedule, - _krb5_AES_salt, - NULL, - _krb5_evp_cleanup, - EVP_aes_128_cbc -}; - -static struct _krb5_key_type keytype_aes256 = { - ENCTYPE_AES256_CTS_HMAC_SHA1_96, - "aes-256", - 256, - 32, - sizeof(struct _krb5_evp_schedule), - NULL, - _krb5_evp_schedule, - _krb5_AES_salt, - NULL, - _krb5_evp_cleanup, - EVP_aes_256_cbc -}; - -struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes128 = { - CKSUMTYPE_HMAC_SHA1_96_AES_128, - "hmac-sha1-96-aes128", - 64, - 12, - F_KEYED | F_CPROOF | F_DERIVED, - _krb5_SP_HMAC_SHA1_checksum, - NULL -}; - -struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes256 = { - CKSUMTYPE_HMAC_SHA1_96_AES_256, - "hmac-sha1-96-aes256", - 64, - 12, - F_KEYED | F_CPROOF | F_DERIVED, - _krb5_SP_HMAC_SHA1_checksum, - NULL -}; - -static krb5_error_code -AES_PRF(krb5_context context, - krb5_crypto crypto, - const krb5_data *in, - krb5_data *out) -{ - struct _krb5_checksum_type *ct = crypto->et->checksum; - krb5_error_code ret; - Checksum result; - krb5_keyblock *derived; - - result.cksumtype = ct->type; - ret = krb5_data_alloc(&result.checksum, ct->checksumsize); - if (ret) { - krb5_set_error_message(context, ret, N_("malloc: out memory", "")); - return ret; - } - - ret = (*ct->checksum)(context, NULL, in->data, in->length, 0, &result); - if (ret) { - krb5_data_free(&result.checksum); - return ret; - } - - if (result.checksum.length < crypto->et->blocksize) - krb5_abortx(context, "internal prf error"); - - derived = NULL; - ret = krb5_derive_key(context, crypto->key.key, - crypto->et->type, "prf", 3, &derived); - if (ret) - krb5_abortx(context, "krb5_derive_key"); - - ret = krb5_data_alloc(out, crypto->et->blocksize); - if (ret) - krb5_abortx(context, "malloc failed"); - - { - const EVP_CIPHER *c = (*crypto->et->keytype->evp)(); - EVP_CIPHER_CTX *ctx; - - ctx = EVP_CIPHER_CTX_new(); /* ivec all zero */ - if (ctx == NULL) - krb5_abortx(context, "malloc failed"); - EVP_CipherInit_ex(ctx, c, NULL, derived->keyvalue.data, NULL, 1); - EVP_Cipher(ctx, out->data, result.checksum.data, - crypto->et->blocksize); - EVP_CIPHER_CTX_free(ctx); - } - - krb5_data_free(&result.checksum); - krb5_free_keyblock(context, derived); - - return ret; -} - -struct _krb5_encryption_type _krb5_enctype_aes128_cts_hmac_sha1 = { - ETYPE_AES128_CTS_HMAC_SHA1_96, - "aes128-cts-hmac-sha1-96", - 16, - 1, - 16, - &keytype_aes128, - &_krb5_checksum_sha1, - &_krb5_checksum_hmac_sha1_aes128, - F_DERIVED, - _krb5_evp_encrypt_cts, - 16, - AES_PRF -}; - -struct _krb5_encryption_type _krb5_enctype_aes256_cts_hmac_sha1 = { - ETYPE_AES256_CTS_HMAC_SHA1_96, - "aes256-cts-hmac-sha1-96", - 16, - 1, - 16, - &keytype_aes256, - &_krb5_checksum_sha1, - &_krb5_checksum_hmac_sha1_aes256, - F_DERIVED, - _krb5_evp_encrypt_cts, - 16, - AES_PRF -}; diff --git a/crypto/heimdal/lib/krb5/crypto-algs.c b/crypto/heimdal/lib/krb5/crypto-algs.c --- a/crypto/heimdal/lib/krb5/crypto-algs.c +++ b/crypto/heimdal/lib/krb5/crypto-algs.c @@ -53,6 +53,8 @@ &_krb5_checksum_hmac_sha1_des3, &_krb5_checksum_hmac_sha1_aes128, &_krb5_checksum_hmac_sha1_aes256, + &_krb5_checksum_hmac_sha256_128_aes128, + &_krb5_checksum_hmac_sha384_192_aes256, &_krb5_checksum_hmac_md5 }; @@ -64,6 +66,8 @@ * (only relevant for !F_PSEUDO) */ struct _krb5_encryption_type *_krb5_etypes[] = { + &_krb5_enctype_aes256_cts_hmac_sha384_192, + &_krb5_enctype_aes128_cts_hmac_sha256_128, &_krb5_enctype_aes256_cts_hmac_sha1, &_krb5_enctype_aes128_cts_hmac_sha1, &_krb5_enctype_des3_cbc_sha1, diff --git a/crypto/heimdal/lib/krb5/crypto-arcfour.c b/crypto/heimdal/lib/krb5/crypto-arcfour.c --- a/crypto/heimdal/lib/krb5/crypto-arcfour.c +++ b/crypto/heimdal/lib/krb5/crypto-arcfour.c @@ -38,7 +38,7 @@ #include "krb5_locl.h" static struct _krb5_key_type keytype_arcfour = { - ENCTYPE_ARCFOUR_HMAC_MD5, + KRB5_ENCTYPE_ARCFOUR_HMAC_MD5, "arcfour", 128, 16, @@ -75,10 +75,8 @@ krb5_error_code ret; m = EVP_MD_CTX_create(); - if (m == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (m == NULL) + return krb5_enomem(context); ksign_c.checksum.length = sizeof(ksign_c_data); ksign_c.checksum.data = ksign_c_data; ret = _krb5_internal_hmac(context, c, signature, sizeof(signature), @@ -129,7 +127,7 @@ unsigned usage, void *ivec) { - EVP_CIPHER_CTX *ctx; + EVP_CIPHER_CTX ctx; struct _krb5_checksum_type *c = _krb5_find_checksum (CKSUMTYPE_RSA_MD5); Checksum k1_c, k2_c, k3_c, cksum; struct _krb5_key_data ke; @@ -147,7 +145,7 @@ k1_c.checksum.length = sizeof(k1_c_data); k1_c.checksum.data = k1_c_data; - ret = _krb5_internal_hmac(NULL, c, t, sizeof(t), 0, key, &k1_c); + ret = _krb5_internal_hmac(context, c, t, sizeof(t), 0, key, &k1_c); if (ret) krb5_abortx(context, "hmac failed"); @@ -162,7 +160,7 @@ cksum.checksum.length = 16; cksum.checksum.data = data; - ret = _krb5_internal_hmac(NULL, c, cdata + 16, len - 16, 0, &ke, &cksum); + ret = _krb5_internal_hmac(context, c, cdata + 16, len - 16, 0, &ke, &cksum); if (ret) krb5_abortx(context, "hmac failed"); @@ -172,21 +170,19 @@ k3_c.checksum.length = sizeof(k3_c_data); k3_c.checksum.data = k3_c_data; - ret = _krb5_internal_hmac(NULL, c, data, 16, 0, &ke, &k3_c); + ret = _krb5_internal_hmac(context, c, data, 16, 0, &ke, &k3_c); if (ret) krb5_abortx(context, "hmac failed"); - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) - krb5_abortx(context, "malloc failed"); + EVP_CIPHER_CTX_init(&ctx); - EVP_CipherInit_ex(ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 1); - EVP_Cipher(ctx, cdata + 16, cdata + 16, len - 16); - EVP_CIPHER_CTX_free(ctx); + EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 1); + EVP_Cipher(&ctx, cdata + 16, cdata + 16, len - 16); + EVP_CIPHER_CTX_cleanup(&ctx); - memset (k1_c_data, 0, sizeof(k1_c_data)); - memset (k2_c_data, 0, sizeof(k2_c_data)); - memset (k3_c_data, 0, sizeof(k3_c_data)); + memset_s(k1_c_data, sizeof(k1_c_data), 0, sizeof(k1_c_data)); + memset_s(k2_c_data, sizeof(k2_c_data), 0, sizeof(k2_c_data)); + memset_s(k3_c_data, sizeof(k3_c_data), 0, sizeof(k3_c_data)); return 0; } @@ -198,7 +194,7 @@ unsigned usage, void *ivec) { - EVP_CIPHER_CTX *ctx; + EVP_CIPHER_CTX ctx; struct _krb5_checksum_type *c = _krb5_find_checksum (CKSUMTYPE_RSA_MD5); Checksum k1_c, k2_c, k3_c, cksum; struct _krb5_key_data ke; @@ -217,7 +213,7 @@ k1_c.checksum.length = sizeof(k1_c_data); k1_c.checksum.data = k1_c_data; - ret = _krb5_internal_hmac(NULL, c, t, sizeof(t), 0, key, &k1_c); + ret = _krb5_internal_hmac(context, c, t, sizeof(t), 0, key, &k1_c); if (ret) krb5_abortx(context, "hmac failed"); @@ -232,16 +228,14 @@ k3_c.checksum.length = sizeof(k3_c_data); k3_c.checksum.data = k3_c_data; - ret = _krb5_internal_hmac(NULL, c, cdata, 16, 0, &ke, &k3_c); + ret = _krb5_internal_hmac(context, c, cdata, 16, 0, &ke, &k3_c); if (ret) krb5_abortx(context, "hmac failed"); - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) - krb5_abortx(context, "malloc failed"); - EVP_CipherInit_ex(ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 0); - EVP_Cipher(ctx, cdata + 16, cdata + 16, len - 16); - EVP_CIPHER_CTX_free(ctx); + EVP_CIPHER_CTX_init(&ctx); + EVP_CipherInit_ex(&ctx, EVP_rc4(), NULL, k3_c.checksum.data, NULL, 0); + EVP_Cipher(&ctx, cdata + 16, cdata + 16, len - 16); + EVP_CIPHER_CTX_cleanup(&ctx); ke.key = &kb; kb.keyvalue = k2_c.checksum; @@ -249,13 +243,13 @@ cksum.checksum.length = 16; cksum.checksum.data = cksum_data; - ret = _krb5_internal_hmac(NULL, c, cdata + 16, len - 16, 0, &ke, &cksum); + ret = _krb5_internal_hmac(context, c, cdata + 16, len - 16, 0, &ke, &cksum); if (ret) krb5_abortx(context, "hmac failed"); - memset (k1_c_data, 0, sizeof(k1_c_data)); - memset (k2_c_data, 0, sizeof(k2_c_data)); - memset (k3_c_data, 0, sizeof(k3_c_data)); + memset_s(k1_c_data, sizeof(k1_c_data), 0, sizeof(k1_c_data)); + memset_s(k2_c_data, sizeof(k2_c_data), 0, sizeof(k2_c_data)); + memset_s(k3_c_data, sizeof(k3_c_data), 0, sizeof(k3_c_data)); if (ct_memcmp (cksum.checksum.data, data, 16) != 0) { krb5_clear_error_message (context); @@ -271,7 +265,7 @@ * draft-brezak-win2k-krb-rc4-hmac-04.txt */ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_usage2arcfour(krb5_context context, unsigned *usage) { switch (*usage) { @@ -313,17 +307,42 @@ return ARCFOUR_subdecrypt (context, key, data, len, keyusage, ivec); } +static krb5_error_code +ARCFOUR_prf(krb5_context context, + krb5_crypto crypto, + const krb5_data *in, + krb5_data *out) +{ + struct _krb5_checksum_type *c = _krb5_find_checksum(CKSUMTYPE_SHA1); + krb5_error_code ret; + Checksum res; + + ret = krb5_data_alloc(out, c->checksumsize); + if (ret) + return ret; + + res.checksum.data = out->data; + res.checksum.length = out->length; + + ret = _krb5_internal_hmac(context, c, in->data, in->length, 0, &crypto->key, &res); + if (ret) + krb5_data_free(out); + return 0; +} + + struct _krb5_encryption_type _krb5_enctype_arcfour_hmac_md5 = { ETYPE_ARCFOUR_HMAC_MD5, "arcfour-hmac-md5", + "rc4-hmac", 1, 1, 8, &keytype_arcfour, &_krb5_checksum_hmac_md5, &_krb5_checksum_hmac_md5, - F_SPECIAL, + F_SPECIAL | F_WEAK, ARCFOUR_encrypt, 0, - NULL + ARCFOUR_prf }; diff --git a/crypto/heimdal/lib/krb5/crypto-des-common.c b/crypto/heimdal/lib/krb5/crypto-des-common.c --- a/crypto/heimdal/lib/krb5/crypto-des-common.c +++ b/crypto/heimdal/lib/krb5/crypto-des-common.c @@ -39,10 +39,9 @@ * A = A xor B. A & B are 8 bytes. */ -void -_krb5_xor (DES_cblock *key, const unsigned char *b) +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_xor8(unsigned char *a, const unsigned char *b) { - unsigned char *a = (unsigned char*)key; a[0] ^= b[0]; a[1] ^= b[1]; a[2] ^= b[2]; @@ -54,7 +53,7 @@ } #if defined(DES3_OLD_ENCTYPE) || defined(HEIM_WEAK_CRYPTO) -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_des_checksum(krb5_context context, const EVP_MD *evp_md, struct _krb5_key_data *key, @@ -70,24 +69,22 @@ krb5_generate_random_block(p, 8); m = EVP_MD_CTX_create(); - if (m == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (m == NULL) + return krb5_enomem(context); EVP_DigestInit_ex(m, evp_md, NULL); EVP_DigestUpdate(m, p, 8); EVP_DigestUpdate(m, data, len); EVP_DigestFinal_ex (m, p + 8, NULL); EVP_MD_CTX_destroy(m); - memset (&ivec, 0, sizeof(ivec)); - EVP_CipherInit_ex(ctx->ectx, NULL, NULL, NULL, (void *)&ivec, -1); - EVP_Cipher(ctx->ectx, p, p, 24); + memset_s(&ivec, sizeof(ivec), 0, sizeof(ivec)); + EVP_CipherInit_ex(&ctx->ectx, NULL, NULL, NULL, (void *)&ivec, -1); + EVP_Cipher(&ctx->ectx, p, p, 24); return 0; } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_des_verify(krb5_context context, const EVP_MD *evp_md, struct _krb5_key_data *key, @@ -103,14 +100,12 @@ krb5_error_code ret = 0; m = EVP_MD_CTX_create(); - if (m == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (m == NULL) + return krb5_enomem(context); - memset(&ivec, 0, sizeof(ivec)); - EVP_CipherInit_ex(ctx->dctx, NULL, NULL, NULL, (void *)&ivec, -1); - EVP_Cipher(ctx->dctx, tmp, C->checksum.data, 24); + memset_s(&ivec, sizeof(ivec), 0, sizeof(ivec)); + EVP_CipherInit_ex(&ctx->dctx, NULL, NULL, NULL, (void *)&ivec, -1); + EVP_Cipher(&ctx->dctx, tmp, C->checksum.data, 24); EVP_DigestInit_ex(m, evp_md, NULL); EVP_DigestUpdate(m, tmp, 8); /* confounder */ @@ -121,8 +116,8 @@ krb5_clear_error_message (context); ret = KRB5KRB_AP_ERR_BAD_INTEGRITY; } - memset(tmp, 0, sizeof(tmp)); - memset(res, 0, sizeof(res)); + memset_s(tmp, sizeof(tmp), 0, sizeof(tmp)); + memset_s(res, sizeof(res), 0, sizeof(res)); return ret; } diff --git a/crypto/heimdal/lib/krb5/crypto-des.c b/crypto/heimdal/lib/krb5/crypto-des.c --- a/crypto/heimdal/lib/krb5/crypto-des.c +++ b/crypto/heimdal/lib/krb5/crypto-des.c @@ -65,7 +65,7 @@ memcpy(k, data, key->keyvalue.length); DES_set_odd_parity(k); if(DES_is_weak_key(k)) - _krb5_xor(k, (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); + _krb5_xor8(*k, (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); } static struct _krb5_key_type keytype_des_old = { @@ -225,7 +225,7 @@ EVP_CIPHER_CTX *c; DES_cblock ivec; memset(&ivec, 0, sizeof(ivec)); - c = encryptp ? ctx->ectx : ctx->dctx; + c = encryptp ? &ctx->ectx : &ctx->dctx; EVP_CipherInit_ex(c, NULL, NULL, NULL, (void *)&ivec, -1); EVP_Cipher(c, data, data, len); return 0; @@ -244,7 +244,7 @@ EVP_CIPHER_CTX *c; DES_cblock ivec; memcpy(&ivec, key->key->keyvalue.data, sizeof(ivec)); - c = encryptp ? ctx->ectx : ctx->dctx; + c = encryptp ? &ctx->ectx : &ctx->dctx; EVP_CipherInit_ex(c, NULL, NULL, NULL, (void *)&ivec, -1); EVP_Cipher(c, data, data, len); return 0; @@ -288,6 +288,7 @@ struct _krb5_encryption_type _krb5_enctype_des_cbc_crc = { ETYPE_DES_CBC_CRC, "des-cbc-crc", + NULL, 8, 8, 8, @@ -303,6 +304,7 @@ struct _krb5_encryption_type _krb5_enctype_des_cbc_md4 = { ETYPE_DES_CBC_MD4, "des-cbc-md4", + NULL, 8, 8, 8, @@ -318,6 +320,7 @@ struct _krb5_encryption_type _krb5_enctype_des_cbc_md5 = { ETYPE_DES_CBC_MD5, "des-cbc-md5", + NULL, 8, 8, 8, @@ -333,6 +336,7 @@ struct _krb5_encryption_type _krb5_enctype_des_cbc_none = { ETYPE_DES_CBC_NONE, "des-cbc-none", + NULL, 8, 8, 0, @@ -348,6 +352,7 @@ struct _krb5_encryption_type _krb5_enctype_des_cfb64_none = { ETYPE_DES_CFB64_NONE, "des-cfb64-none", + NULL, 1, 1, 0, @@ -363,6 +368,7 @@ struct _krb5_encryption_type _krb5_enctype_des_pcbc_none = { ETYPE_DES_PCBC_NONE, "des-pcbc-none", + NULL, 8, 8, 0, diff --git a/crypto/heimdal/lib/krb5/crypto-des3.c b/crypto/heimdal/lib/krb5/crypto-des3.c --- a/crypto/heimdal/lib/krb5/crypto-des3.c +++ b/crypto/heimdal/lib/krb5/crypto-des3.c @@ -52,6 +52,59 @@ DES_is_weak_key(&k[2])); } +static krb5_error_code +DES3_prf(krb5_context context, + krb5_crypto crypto, + const krb5_data *in, + krb5_data *out) +{ + struct _krb5_checksum_type *ct = crypto->et->checksum; + krb5_error_code ret; + Checksum result; + krb5_keyblock *derived; + + result.cksumtype = ct->type; + ret = krb5_data_alloc(&result.checksum, ct->checksumsize); + if (ret) { + krb5_set_error_message(context, ret, N_("malloc: out memory", "")); + return ret; + } + + ret = (*ct->checksum)(context, NULL, in->data, in->length, 0, &result); + if (ret) { + krb5_data_free(&result.checksum); + return ret; + } + + if (result.checksum.length < crypto->et->blocksize) + krb5_abortx(context, "internal prf error"); + + derived = NULL; + ret = krb5_derive_key(context, crypto->key.key, + crypto->et->type, "prf", 3, &derived); + if (ret) + krb5_abortx(context, "krb5_derive_key"); + + ret = krb5_data_alloc(out, crypto->et->prf_length); + if (ret) + krb5_abortx(context, "malloc failed"); + + { + const EVP_CIPHER *c = (*crypto->et->keytype->evp)(); + EVP_CIPHER_CTX ctx; + + EVP_CIPHER_CTX_init(&ctx); /* ivec all zero */ + EVP_CipherInit_ex(&ctx, c, NULL, derived->keyvalue.data, NULL, 1); + EVP_Cipher(&ctx, out->data, result.checksum.data, + crypto->et->prf_length); + EVP_CIPHER_CTX_cleanup(&ctx); + } + + krb5_data_free(&result.checksum); + krb5_free_keyblock(context, derived); + + return ret; +} #ifdef DES3_OLD_ENCTYPE static struct _krb5_key_type keytype_des3 = { @@ -131,6 +184,7 @@ struct _krb5_encryption_type _krb5_enctype_des3_cbc_md5 = { ETYPE_DES3_CBC_MD5, "des3-cbc-md5", + NULL, 8, 8, 8, @@ -147,22 +201,24 @@ struct _krb5_encryption_type _krb5_enctype_des3_cbc_sha1 = { ETYPE_DES3_CBC_SHA1, "des3-cbc-sha1", + NULL, 8, 8, 8, &keytype_des3_derived, &_krb5_checksum_sha1, &_krb5_checksum_hmac_sha1_des3, - F_DERIVED, + F_DERIVED | F_RFC3961_ENC | F_RFC3961_KDF, _krb5_evp_encrypt, - 0, - NULL + 16, + DES3_prf }; #ifdef DES3_OLD_ENCTYPE struct _krb5_encryption_type _krb5_enctype_old_des3_cbc_sha1 = { ETYPE_OLD_DES3_CBC_SHA1, "old-des3-cbc-sha1", + NULL, 8, 8, 8, @@ -179,6 +235,7 @@ struct _krb5_encryption_type _krb5_enctype_des3_cbc_none = { ETYPE_DES3_CBC_NONE, "des3-cbc-none", + NULL, 8, 8, 0, @@ -221,6 +278,6 @@ for (i = 0; i < 3; i++) { DES_set_odd_parity(&k[i]); if(DES_is_weak_key(&k[i])) - _krb5_xor(&k[i], (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); + _krb5_xor8(k[i], (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); } } diff --git a/crypto/heimdal/lib/krb5/crypto-evp.c b/crypto/heimdal/lib/krb5/crypto-evp.c --- a/crypto/heimdal/lib/krb5/crypto-evp.c +++ b/crypto/heimdal/lib/krb5/crypto-evp.c @@ -41,21 +41,19 @@ struct _krb5_evp_schedule *key = kd->schedule->data; const EVP_CIPHER *c = (*kt->evp)(); - key->ectx = EVP_CIPHER_CTX_new(); - key->dctx = EVP_CIPHER_CTX_new(); - if (key->ectx == NULL || key->dctx == NULL) - krb5_abort(context, ENOMEM, "malloc failed"); + EVP_CIPHER_CTX_init(&key->ectx); + EVP_CIPHER_CTX_init(&key->dctx); - EVP_CipherInit_ex(key->ectx, c, NULL, kd->key->keyvalue.data, NULL, 1); - EVP_CipherInit_ex(key->dctx, c, NULL, kd->key->keyvalue.data, NULL, 0); + EVP_CipherInit_ex(&key->ectx, c, NULL, kd->key->keyvalue.data, NULL, 1); + EVP_CipherInit_ex(&key->dctx, c, NULL, kd->key->keyvalue.data, NULL, 0); } void _krb5_evp_cleanup(krb5_context context, struct _krb5_key_data *kd) { struct _krb5_evp_schedule *key = kd->schedule->data; - EVP_CIPHER_CTX_free(key->ectx); - EVP_CIPHER_CTX_free(key->dctx); + EVP_CIPHER_CTX_cleanup(&key->ectx); + EVP_CIPHER_CTX_cleanup(&key->dctx); } krb5_error_code @@ -69,15 +67,13 @@ { struct _krb5_evp_schedule *ctx = key->schedule->data; EVP_CIPHER_CTX *c; - c = encryptp ? ctx->ectx : ctx->dctx; + c = encryptp ? &ctx->ectx : &ctx->dctx; if (ivec == NULL) { /* alloca ? */ size_t len2 = EVP_CIPHER_CTX_iv_length(c); void *loiv = malloc(len2); - if (loiv == NULL) { - krb5_clear_error_message(context); - return ENOMEM; - } + if (loiv == NULL) + return krb5_enomem(context); memset(loiv, 0, len2); EVP_CipherInit_ex(c, NULL, NULL, NULL, loiv, -1); free(loiv); @@ -104,7 +100,7 @@ EVP_CIPHER_CTX *c; unsigned char *p; - c = encryptp ? ctx->ectx : ctx->dctx; + c = encryptp ? &ctx->ectx : &ctx->dctx; blocksize = EVP_CIPHER_CTX_block_size(c); diff --git a/crypto/heimdal/lib/krb5/crypto-null.c b/crypto/heimdal/lib/krb5/crypto-null.c --- a/crypto/heimdal/lib/krb5/crypto-null.c +++ b/crypto/heimdal/lib/krb5/crypto-null.c @@ -38,13 +38,16 @@ #endif static struct _krb5_key_type keytype_null = { - ENCTYPE_NULL, + KRB5_ENCTYPE_NULL, "null", 0, 0, 0, NULL, NULL, + NULL, + NULL, + NULL, NULL }; @@ -84,6 +87,7 @@ struct _krb5_encryption_type _krb5_enctype_null = { ETYPE_NULL, "null", + NULL, 1, 1, 0, diff --git a/crypto/heimdal/lib/krb5/crypto-pk.c b/crypto/heimdal/lib/krb5/crypto-pk.c --- a/crypto/heimdal/lib/krb5/crypto-pk.c +++ b/crypto/heimdal/lib/krb5/crypto-pk.c @@ -35,7 +35,7 @@ #include -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_pk_octetstring2key(krb5_context context, krb5_enctype type, const void *dhdata, @@ -61,16 +61,13 @@ keylen = (et->keytype->bits + 7) / 8; keydata = malloc(keylen); - if (keydata == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (keydata == NULL) + return krb5_enomem(context); m = EVP_MD_CTX_create(); if (m == NULL) { free(keydata); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } counter = 0; @@ -95,12 +92,12 @@ offset += sizeof(shaoutput); counter++; } while(offset < keylen); - memset(shaoutput, 0, sizeof(shaoutput)); + memset_s(shaoutput, sizeof(shaoutput), 0, sizeof(shaoutput)); EVP_MD_CTX_destroy(m); ret = krb5_random_to_key(context, type, keydata, keylen, key); - memset(keydata, 0, sizeof(keylen)); + memset_s(keydata, sizeof(keylen), 0, sizeof(keylen)); free(keydata); return ret; } @@ -194,7 +191,7 @@ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_pk_kdf(krb5_context context, const struct AlgorithmIdentifier *ai, const void *dhdata, @@ -248,10 +245,8 @@ keylen = (et->keytype->bits + 7) / 8; keydata = malloc(keylen); - if (keydata == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (keydata == NULL) + return krb5_enomem(context); ret = encode_otherinfo(context, ai, client, server, enctype, as_req, pk_as_rep, ticket, &other); @@ -264,8 +259,7 @@ if (m == NULL) { free(keydata); free(other.data); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } offset = 0; @@ -288,13 +282,13 @@ offset += EVP_MD_CTX_size(m); counter++; } while(offset < keylen); - memset(shaoutput, 0, sizeof(shaoutput)); + memset_s(shaoutput, sizeof(shaoutput), 0, sizeof(shaoutput)); EVP_MD_CTX_destroy(m); free(other.data); ret = krb5_random_to_key(context, enctype, keydata, keylen, key); - memset(keydata, 0, sizeof(keylen)); + memset_s(keydata, sizeof(keylen), 0, sizeof(keylen)); free(keydata); return ret; diff --git a/crypto/heimdal/lib/krb5/crypto-rand.c b/crypto/heimdal/lib/krb5/crypto-rand.c --- a/crypto/heimdal/lib/krb5/crypto-rand.c +++ b/crypto/heimdal/lib/krb5/crypto-rand.c @@ -33,6 +33,9 @@ #include "krb5_locl.h" +#undef HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE +#define HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE + #define ENTROPY_NEEDED 128 static HEIMDAL_MUTEX crypto_mutex = HEIMDAL_MUTEX_INITIALIZER; @@ -40,6 +43,7 @@ static int seed_something(void) { +#ifndef NO_RANDFILE char buf[1024], seedfile[256]; /* If there is a seed file, load it. But such a file cannot be trusted, @@ -58,54 +62,91 @@ seedfile[0] = '\0'; } else seedfile[0] = '\0'; +#endif /* Calling RAND_status() will try to use /dev/urandom if it exists so we do not have to deal with it. */ if (RAND_status() != 1) { -#ifndef _WIN32 -#ifndef OPENSSL_NO_EGD - krb5_context context; - const char *p; - - /* Try using egd */ - if (!krb5_init_context(&context)) { - p = krb5_config_get_string(context, NULL, "libdefaults", - "egd_socket", NULL); - if (p != NULL) - RAND_egd_bytes(p, ENTROPY_NEEDED); - krb5_free_context(context); - } -#endif -#else /* TODO: Once a Windows CryptoAPI RAND method is defined, we can use that and failover to another method. */ -#endif } if (RAND_status() == 1) { +#ifndef NO_RANDFILE /* Update the seed file */ if (seedfile[0]) RAND_write_file(seedfile); +#endif return 0; } else return -1; } -KRB5_LIB_FUNCTION void KRB5_LIB_CALL -krb5_generate_random_block(void *buf, size_t len) +/** + * Fill buffer buf with len bytes of PRNG randomness that is ok to use + * for key generation, padding and public diclosing the randomness w/o + * disclosing the randomness source. + * + * This function can fail, and callers must check the return value. + * + * @param buf a buffer to fill with randomness + * @param len length of memory that buf points to. + * + * @return return 0 on success or HEIM_ERR_RANDOM_OFFLINE if the + * funcation failed to initialize the randomness source. + * + * @ingroup krb5_crypto + */ + +HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_generate_random(void *buf, size_t len) { static int rng_initialized = 0; + int ret; HEIMDAL_MUTEX_lock(&crypto_mutex); if (!rng_initialized) { - if (seed_something()) - krb5_abortx(NULL, "Fatal: could not seed the " - "random number generator"); - + if (seed_something()) { + HEIMDAL_MUTEX_unlock(&crypto_mutex); + return HEIM_ERR_RANDOM_OFFLINE; + } rng_initialized = 1; } - HEIMDAL_MUTEX_unlock(&crypto_mutex); if (RAND_bytes(buf, len) <= 0) + ret = HEIM_ERR_RANDOM_OFFLINE; + else + ret = 0; + HEIMDAL_MUTEX_unlock(&crypto_mutex); + + return ret; +} + +/** + * Fill buffer buf with len bytes of PRNG randomness that is ok to use + * for key generation, padding and public diclosing the randomness w/o + * disclosing the randomness source. + * + * This function can NOT fail, instead it will abort() and program will crash. + * + * If this function is called after a successful krb5_init_context(), + * the chance of it failing is low due to that krb5_init_context() + * pulls out some random, and quite commonly the randomness sources + * will not fail once it have started to produce good output, + * /dev/urandom behavies that way. + * + * @param buf a buffer to fill with randomness + * @param len length of memory that buf points to. + * + * @ingroup krb5_crypto + */ + + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_generate_random_block(void *buf, size_t len) +{ + int ret = krb5_generate_random(buf, len); + if (ret) krb5_abortx(NULL, "Failed to generate random block"); } diff --git a/crypto/heimdal/lib/krb5/crypto-stubs.c b/crypto/heimdal/lib/krb5/crypto-stubs.c --- a/crypto/heimdal/lib/krb5/crypto-stubs.c +++ b/crypto/heimdal/lib/krb5/crypto-stubs.c @@ -49,12 +49,7 @@ if(!p) return ENOMEM; - p->mutex = malloc(sizeof(HEIMDAL_MUTEX)); - if (p->mutex == NULL) { - free(p); - return ENOMEM; - } - HEIMDAL_MUTEX_init(p->mutex); + HEIMDAL_MUTEX_init(&p->mutex); *context = p; return 0; @@ -65,8 +60,7 @@ { krb5_clear_error_message(context); - HEIMDAL_MUTEX_destroy(context->mutex); - free(context->mutex); + HEIMDAL_MUTEX_destroy(&context->mutex); if (context->flags & KRB5_CTX_F_SOCKETS_INITIALIZED) { rk_SOCK_EXIT(); } @@ -75,7 +69,7 @@ free(context); } -krb5_boolean +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_homedir_access(krb5_context context) { return 0; } @@ -90,6 +84,15 @@ return 0; } +void KRB5_LIB_FUNCTION +_krb5_debug(krb5_context context, + int level, + const char *fmt, + ...) +{ +} + + /* This function is currently just used to get the location of the EGD * socket. If we're not using an EGD, then we can just return NULL */ diff --git a/crypto/heimdal/lib/krb5/crypto.h b/crypto/heimdal/lib/krb5/crypto.h --- a/crypto/heimdal/lib/krb5/crypto.h +++ b/crypto/heimdal/lib/krb5/crypto.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan + * Copyright (c) 1997 - 2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -52,14 +52,22 @@ #define CRYPTO_ETYPE(C) ((C)->et->type) /* bits for `flags' below */ -#define F_KEYED 1 /* checksum is keyed */ -#define F_CPROOF 2 /* checksum is collision proof */ -#define F_DERIVED 4 /* uses derived keys */ -#define F_VARIANT 8 /* uses `variant' keys (6.4.3) */ -#define F_PSEUDO 16 /* not a real protocol type */ -#define F_SPECIAL 32 /* backwards */ -#define F_DISABLED 64 /* enctype/checksum disabled */ -#define F_WEAK 128 /* enctype is considered weak */ +#define F_KEYED 0x0001 /* checksum is keyed */ +#define F_CPROOF 0x0002 /* checksum is collision proof */ +#define F_DERIVED 0x0004 /* uses derived keys */ +#define F_VARIANT 0x0008 /* uses `variant' keys (6.4.3) */ +#define F_PSEUDO 0x0010 /* not a real protocol type */ +#define F_DISABLED 0x0020 /* enctype/checksum disabled */ +#define F_WEAK 0x0040 /* enctype is considered weak */ + +#define F_RFC3961_ENC 0x0100 /* RFC3961 simplified profile */ +#define F_SPECIAL 0x0200 /* backwards */ +#define F_ENC_THEN_CKSUM 0x0400 /* checksum is over encrypted data */ +#define F_CRYPTO_MASK 0x0F00 + +#define F_RFC3961_KDF 0x1000 /* RFC3961 KDF */ +#define F_SP800_108_HMAC_KDF 0x2000 /* SP800-108 HMAC KDF */ +#define F_KDF_MASK 0xF000 struct salt_type { krb5_salttype type; @@ -103,6 +111,7 @@ struct _krb5_encryption_type { krb5_enctype type; const char *name; + const char *alias; size_t blocksize; size_t padsize; size_t confoundersize; @@ -121,9 +130,9 @@ krb5_crypto, const krb5_data *, krb5_data *); }; -#define ENCRYPTION_USAGE(U) (((U) << 8) | 0xAA) -#define INTEGRITY_USAGE(U) (((U) << 8) | 0x55) -#define CHECKSUM_USAGE(U) (((U) << 8) | 0x99) +#define ENCRYPTION_USAGE(U) ((int32_t)((((uint32_t)(U)) << 8)) | 0xAA) +#define INTEGRITY_USAGE(U) ((int32_t)((((uint32_t)(U)) << 8)) | 0x55) +#define CHECKSUM_USAGE(U) ((int32_t)((((uint32_t)(U)) << 8)) | 0x99) /* Checksums */ @@ -137,15 +146,19 @@ extern struct _krb5_checksum_type _krb5_checksum_hmac_sha1_des3; extern struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes128; extern struct _krb5_checksum_type _krb5_checksum_hmac_sha1_aes256; +extern struct _krb5_checksum_type _krb5_checksum_hmac_sha256_128_aes128; +extern struct _krb5_checksum_type _krb5_checksum_hmac_sha384_192_aes256; extern struct _krb5_checksum_type _krb5_checksum_hmac_md5; extern struct _krb5_checksum_type _krb5_checksum_sha1; +extern struct _krb5_checksum_type _krb5_checksum_sha2; extern struct _krb5_checksum_type *_krb5_checksum_types[]; extern int _krb5_num_checksums; /* Salts */ -extern struct salt_type _krb5_AES_salt[]; +extern struct salt_type _krb5_AES_SHA1_salt[]; +extern struct salt_type _krb5_AES_SHA2_salt[]; extern struct salt_type _krb5_arcfour_salt[]; extern struct salt_type _krb5_des_salt[]; extern struct salt_type _krb5_des3_salt[]; @@ -155,6 +168,8 @@ extern struct _krb5_encryption_type _krb5_enctype_aes256_cts_hmac_sha1; extern struct _krb5_encryption_type _krb5_enctype_aes128_cts_hmac_sha1; +extern struct _krb5_encryption_type _krb5_enctype_aes128_cts_hmac_sha256_128; +extern struct _krb5_encryption_type _krb5_enctype_aes256_cts_hmac_sha384_192; extern struct _krb5_encryption_type _krb5_enctype_des3_cbc_sha1; extern struct _krb5_encryption_type _krb5_enctype_des3_cbc_md5; extern struct _krb5_encryption_type _krb5_enctype_des3_cbc_none; @@ -172,8 +187,15 @@ extern struct _krb5_encryption_type *_krb5_etypes[]; extern int _krb5_num_etypes; +/* NO_HCRYPTO_POLLUTION is defined in pkinit-ec.c. See commentary there. */ +#ifndef NO_HCRYPTO_POLLUTION /* Interface to the EVP crypto layer provided by hcrypto */ struct _krb5_evp_schedule { - EVP_CIPHER_CTX *ectx; - EVP_CIPHER_CTX *dctx; + /* + * Normally we'd say EVP_CIPHER_CTX here, but! this header gets + * included in lib/krb5/pkinit-ec.ck + */ + EVP_CIPHER_CTX ectx; + EVP_CIPHER_CTX dctx; }; +#endif diff --git a/crypto/heimdal/lib/krb5/crypto.c b/crypto/heimdal/lib/krb5/crypto.c --- a/crypto/heimdal/lib/krb5/crypto.c +++ b/crypto/heimdal/lib/krb5/crypto.c @@ -147,10 +147,8 @@ if (key->schedule != NULL) return 0; ALLOC(key->schedule, 1); - if(key->schedule == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (key->schedule == NULL) + return krb5_enomem(context); ret = krb5_data_alloc(key->schedule, kt->schedule_size); if(ret) { free(key->schedule); @@ -179,7 +177,7 @@ } /* HMAC according to RFC2104 */ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_internal_hmac(krb5_context context, struct _krb5_checksum_type *cm, const void *data, @@ -300,7 +298,7 @@ NULL }; -struct _krb5_checksum_type * +KRB5_LIB_FUNCTION struct _krb5_checksum_type * KRB5_LIB_CALL _krb5_find_checksum(krb5_cksumtype type) { int i; @@ -325,10 +323,8 @@ size_t i; *key = _new_derived_key(crypto, 0xff/* KRB5_KU_RFC1510_VARIANT */); - if(*key == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*key == NULL) + return krb5_enomem(context); ret = krb5_copy_keyblock(context, crypto->key.key, &(*key)->key); if(ret) return ret; @@ -640,7 +636,7 @@ * * ************************************************************/ -struct _krb5_encryption_type * +KRB5_LIB_FUNCTION struct _krb5_encryption_type * KRB5_LIB_CALL _krb5_find_enctype(krb5_enctype type) { int i; @@ -666,10 +662,8 @@ return KRB5_PROG_ETYPE_NOSUPP; } *string = strdup(e->name); - if(*string == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*string == NULL) + return krb5_enomem(context); return 0; } @@ -679,11 +673,17 @@ krb5_enctype *etype) { int i; - for(i = 0; i < _krb5_num_etypes; i++) + for(i = 0; i < _krb5_num_etypes; i++) { if(strcasecmp(_krb5_etypes[i]->name, string) == 0){ *etype = _krb5_etypes[i]->type; return 0; } + if(_krb5_etypes[i]->alias != NULL && + strcasecmp(_krb5_etypes[i]->alias, string) == 0){ + *etype = _krb5_etypes[i]->type; + return 0; + } + } krb5_set_error_message (context, KRB5_PROG_ETYPE_NOSUPP, N_("encryption type %s not supported", ""), string); @@ -790,7 +790,6 @@ return 0; } - static krb5_boolean derived_crypto(krb5_context context, krb5_crypto crypto) @@ -798,13 +797,6 @@ return (crypto->et->flags & F_DERIVED) != 0; } -static krb5_boolean -special_crypto(krb5_context context, - krb5_crypto crypto) -{ - return (crypto->et->flags & F_SPECIAL) != 0; -} - #define CHECKSUMSIZE(C) ((C)->checksumsize) #define CHECKSUMTYPE(C) ((C)->type) @@ -830,10 +822,8 @@ block_sz = (sz + et->padsize - 1) &~ (et->padsize - 1); /* pad */ total_sz = block_sz + checksum_sz; p = calloc(1, total_sz); - if(p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (p == NULL) + return krb5_enomem(context); q = p; krb5_generate_random_block(q, et->confoundersize); /* XXX */ @@ -874,6 +864,85 @@ return ret; } +static krb5_error_code +encrypt_internal_enc_then_cksum(krb5_context context, + krb5_crypto crypto, + unsigned usage, + const void *data, + size_t len, + krb5_data *result, + void *ivec) +{ + size_t sz, block_sz, checksum_sz, total_sz; + Checksum cksum; + unsigned char *p, *q, *ivc = NULL; + krb5_error_code ret; + struct _krb5_key_data *dkey; + const struct _krb5_encryption_type *et = crypto->et; + + checksum_sz = CHECKSUMSIZE(et->keyed_checksum); + + sz = et->confoundersize + len; + block_sz = (sz + et->padsize - 1) &~ (et->padsize - 1); /* pad */ + total_sz = block_sz + checksum_sz; + p = calloc(1, total_sz); + if (p == NULL) + return krb5_enomem(context); + + q = p; + krb5_generate_random_block(q, et->confoundersize); /* XXX */ + q += et->confoundersize; + memcpy(q, data, len); + + ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); + if(ret) + goto fail; + ret = _key_schedule(context, dkey); + if(ret) + goto fail; + + /* XXX EVP style update API would avoid needing to allocate here */ + ivc = malloc(et->blocksize + block_sz); + if (ivc == NULL) { + ret = krb5_enomem(context); + goto fail; + } + if (ivec) + memcpy(ivc, ivec, et->blocksize); + else + memset(ivc, 0, et->blocksize); + + ret = (*et->encrypt)(context, dkey, p, block_sz, 1, usage, ivec); + if (ret) + goto fail; + memcpy(&ivc[et->blocksize], p, block_sz); + + ret = create_checksum(context, + et->keyed_checksum, + crypto, + INTEGRITY_USAGE(usage), + ivc, + et->blocksize + block_sz, + &cksum); + if(ret == 0 && cksum.checksum.length != checksum_sz) { + free_Checksum (&cksum); + krb5_clear_error_message (context); + ret = KRB5_CRYPTO_INTERNAL; + } + if(ret) + goto fail; + memcpy(p + block_sz, cksum.checksum.data, cksum.checksum.length); + free_Checksum (&cksum); + result->data = p; + result->length = total_sz; + free(ivc); + return 0; + fail: + memset_s(p, total_sz, 0, total_sz); + free(p); + free(ivc); + return ret; +} static krb5_error_code encrypt_internal(krb5_context context, @@ -894,10 +963,8 @@ sz = et->confoundersize + checksum_sz + len; block_sz = (sz + et->padsize - 1) &~ (et->padsize - 1); /* pad */ p = calloc(1, block_sz); - if(p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (p == NULL) + return krb5_enomem(context); q = p; krb5_generate_random_block(q, et->confoundersize); /* XXX */ @@ -956,10 +1023,8 @@ krb5_error_code ret; tmp = malloc (sz); - if (tmp == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (tmp == NULL) + return krb5_enomem(context); p = tmp; memset (p, 0, cksum_sz); p += cksum_sz; @@ -1008,10 +1073,8 @@ } p = malloc(len); - if(len != 0 && p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (len != 0 && p == NULL) + return krb5_enomem(context); memcpy(p, data, len); len -= checksum_sz; @@ -1051,8 +1114,91 @@ result->data = realloc(p, l); if(result->data == NULL && l != 0) { free(p); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); + } + result->length = l; + return 0; +} + +static krb5_error_code +decrypt_internal_enc_then_cksum(krb5_context context, + krb5_crypto crypto, + unsigned usage, + void *data, + size_t len, + krb5_data *result, + void *ivec) +{ + size_t checksum_sz; + Checksum cksum; + unsigned char *p; + krb5_error_code ret; + struct _krb5_key_data *dkey; + struct _krb5_encryption_type *et = crypto->et; + unsigned long l; + + checksum_sz = CHECKSUMSIZE(et->keyed_checksum); + if (len < checksum_sz + et->confoundersize) { + krb5_set_error_message(context, KRB5_BAD_MSIZE, + N_("Encrypted data shorter then " + "checksum + confunder", "")); + return KRB5_BAD_MSIZE; + } + + if (((len - checksum_sz) % et->padsize) != 0) { + krb5_clear_error_message(context); + return KRB5_BAD_MSIZE; + } + + len -= checksum_sz; + + p = malloc(et->blocksize + len); + if (p == NULL) + return krb5_enomem(context); + + if (ivec) + memcpy(p, ivec, et->blocksize); + else + memset(p, 0, et->blocksize); + memcpy(&p[et->blocksize], data, len); + + cksum.checksum.data = (unsigned char *)data + len; + cksum.checksum.length = checksum_sz; + cksum.cksumtype = CHECKSUMTYPE(et->keyed_checksum); + + ret = verify_checksum(context, + crypto, + INTEGRITY_USAGE(usage), + p, + et->blocksize + len, + &cksum); + if(ret) { + free(p); + return ret; + } + + ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); + if(ret) { + free(p); + return ret; + } + ret = _key_schedule(context, dkey); + if(ret) { + free(p); + return ret; + } + ret = (*et->encrypt)(context, dkey, &p[et->blocksize], len, 0, usage, ivec); + if (ret) { + free(p); + return ret; + } + + l = len - et->confoundersize; + memmove(p, p + et->blocksize + et->confoundersize, l); + result->data = realloc(p, l); + if(result->data == NULL && l != 0) { + free(p); + return krb5_enomem(context); } result->length = l; return 0; @@ -1085,10 +1231,8 @@ } p = malloc(len); - if(len != 0 && p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (len != 0 && p == NULL) + return krb5_enomem(context); memcpy(p, data, len); ret = _key_schedule(context, &crypto->key); @@ -1119,8 +1263,7 @@ result->data = realloc(p, l); if(result->data == NULL && l != 0) { free(p); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } result->length = l; return 0; @@ -1153,10 +1296,8 @@ } p = malloc (len); - if (p == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (p == NULL) + return krb5_enomem(context); memcpy(p, data, len); ret = (*et->encrypt)(context, &crypto->key, p, len, FALSE, usage, ivec); @@ -1169,15 +1310,14 @@ result->data = realloc(p, sz); if(result->data == NULL && sz != 0) { free(p); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } result->length = sz; return 0; } static krb5_crypto_iov * -find_iv(krb5_crypto_iov *data, size_t num_data, unsigned type) +iov_find(krb5_crypto_iov *data, size_t num_data, unsigned type) { size_t i; for (i = 0; i < num_data; i++) @@ -1186,6 +1326,154 @@ return NULL; } +static size_t +iov_enc_data_len(krb5_crypto_iov *data, int num_data) +{ + size_t i, len; + + for (len = 0, i = 0; i < num_data; i++) { + if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) + continue; + len += data[i].data.length; + } + + return len; +} + +static size_t +iov_sign_data_len(krb5_crypto_iov *data, int num_data) +{ + size_t i, len; + + for (len = 0, i = 0; i < num_data; i++) { + if (data[i].flags != KRB5_CRYPTO_TYPE_DATA && + data[i].flags != KRB5_CRYPTO_TYPE_SIGN_ONLY) + continue; + len += data[i].data.length; + } + + return len; +} + +static krb5_error_code +iov_coalesce(krb5_context context, + krb5_data *prefix, + krb5_crypto_iov *data, + int num_data, + krb5_boolean inc_sign_data, + krb5_data *out) +{ + unsigned char *p, *q; + krb5_crypto_iov *hiv, *piv; + size_t len; + unsigned int i; + + hiv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_HEADER); + + piv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_PADDING); + + len = 0; + if (prefix) + len += prefix->length; + len += hiv->data.length; + if (inc_sign_data) + len += iov_sign_data_len(data, num_data); + else + len += iov_enc_data_len(data, num_data); + if (piv) + len += piv->data.length; + + p = q = malloc(len); + if (p == NULL) + return krb5_enomem(context); + + if (prefix) { + memcpy(q, prefix->data, prefix->length); + q += prefix->length; + } + memcpy(q, hiv->data.data, hiv->data.length); + q += hiv->data.length; + for (i = 0; i < num_data; i++) { + if (data[i].flags == KRB5_CRYPTO_TYPE_DATA || + (inc_sign_data && data[i].flags == KRB5_CRYPTO_TYPE_SIGN_ONLY)) { + memcpy(q, data[i].data.data, data[i].data.length); + q += data[i].data.length; + } + } + if (piv) + memset(q, 0, piv->data.length); + + out->length = len; + out->data = p; + + return 0; +} + +static krb5_error_code +iov_uncoalesce(krb5_context context, + krb5_data *enc_data, + krb5_crypto_iov *data, + int num_data) +{ + unsigned char *q = enc_data->data; + krb5_crypto_iov *hiv, *piv; + unsigned int i; + + hiv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_HEADER); + + piv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_PADDING); + + memcpy(hiv->data.data, q, hiv->data.length); + q += hiv->data.length; + + for (i = 0; i < num_data; i++) { + if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) + continue; + memcpy(data[i].data.data, q, data[i].data.length); + q += data[i].data.length; + } + if (piv) + memcpy(piv->data.data, q, piv->data.length); + + return 0; +} + +static krb5_error_code +iov_pad_validate(const struct _krb5_encryption_type *et, + krb5_crypto_iov *data, + int num_data, + krb5_crypto_iov **ppiv) +{ + krb5_crypto_iov *piv; + size_t sz, headersz, block_sz, pad_sz, len; + + len = iov_enc_data_len(data, num_data); + + headersz = et->confoundersize; + + sz = headersz + len; + block_sz = (sz + et->padsize - 1) &~ (et->padsize - 1); /* pad */ + + pad_sz = block_sz - sz; + + piv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_PADDING); + /* its ok to have no TYPE_PADDING if there is no padding */ + if (piv == NULL && pad_sz != 0) + return KRB5_BAD_MSIZE; + if (piv) { + if (piv->data.length < pad_sz) + return KRB5_BAD_MSIZE; + piv->data.length = pad_sz; + if (pad_sz) + memset(piv->data.data, pad_sz, pad_sz); + else + piv = NULL; + } + + *ppiv = piv; + return 0; +} + /** * Inline encrypt a kerberos message * @@ -1218,11 +1506,9 @@ int num_data, void *ivec) { - size_t headersz, trailersz, len; - int i; - size_t sz, block_sz, pad_sz; + size_t headersz, trailersz; Checksum cksum; - unsigned char *p, *q; + krb5_data enc_data, sign_data; krb5_error_code ret; struct _krb5_key_data *dkey; const struct _krb5_encryption_type *et = crypto->et; @@ -1238,147 +1524,126 @@ return KRB5_CRYPTO_INTERNAL; } + krb5_data_zero(&enc_data); + krb5_data_zero(&sign_data); + headersz = et->confoundersize; trailersz = CHECKSUMSIZE(et->keyed_checksum); - for (len = 0, i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) - continue; - len += data[i].data.length; - } - - sz = headersz + len; - block_sz = (sz + et->padsize - 1) &~ (et->padsize - 1); /* pad */ - - pad_sz = block_sz - sz; - /* header */ - - hiv = find_iv(data, num_data, KRB5_CRYPTO_TYPE_HEADER); + hiv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_HEADER); if (hiv == NULL || hiv->data.length != headersz) return KRB5_BAD_MSIZE; - krb5_generate_random_block(hiv->data.data, hiv->data.length); /* padding */ - piv = find_iv(data, num_data, KRB5_CRYPTO_TYPE_PADDING); - /* its ok to have no TYPE_PADDING if there is no padding */ - if (piv == NULL && pad_sz != 0) - return KRB5_BAD_MSIZE; - if (piv) { - if (piv->data.length < pad_sz) - return KRB5_BAD_MSIZE; - piv->data.length = pad_sz; - if (pad_sz) - memset(piv->data.data, pad_sz, pad_sz); - else - piv = NULL; - } + ret = iov_pad_validate(et, data, num_data, &piv); + if(ret) + goto cleanup; /* trailer */ - tiv = find_iv(data, num_data, KRB5_CRYPTO_TYPE_TRAILER); - if (tiv == NULL || tiv->data.length != trailersz) - return KRB5_BAD_MSIZE; - - /* - * XXX replace with EVP_Sign? at least make create_checksum an iov - * function. - * XXX CTS EVP is broken, can't handle multi buffers :( - */ - - len = block_sz; - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_SIGN_ONLY) - continue; - len += data[i].data.length; + tiv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_TRAILER); + if (tiv == NULL || tiv->data.length != trailersz) { + ret = KRB5_BAD_MSIZE; + goto cleanup; } - p = q = malloc(len); + if (et->flags & F_ENC_THEN_CKSUM) { + unsigned char old_ivec[EVP_MAX_IV_LENGTH]; + krb5_data ivec_data; - memcpy(q, hiv->data.data, hiv->data.length); - q += hiv->data.length; - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA && - data[i].flags != KRB5_CRYPTO_TYPE_SIGN_ONLY) - continue; - memcpy(q, data[i].data.data, data[i].data.length); - q += data[i].data.length; - } - if (piv) - memset(q, 0, piv->data.length); + ret = iov_coalesce(context, NULL, data, num_data, FALSE, &enc_data); + if(ret) + goto cleanup; - ret = create_checksum(context, - et->keyed_checksum, - crypto, - INTEGRITY_USAGE(usage), - p, - len, - &cksum); - free(p); - if(ret == 0 && cksum.checksum.length != trailersz) { - free_Checksum (&cksum); - krb5_clear_error_message (context); - ret = KRB5_CRYPTO_INTERNAL; - } - if(ret) - return ret; + ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); + if(ret) + goto cleanup; - /* save cksum at end */ - memcpy(tiv->data.data, cksum.checksum.data, cksum.checksum.length); - free_Checksum (&cksum); + ret = _key_schedule(context, dkey); + if(ret) + goto cleanup; - /* XXX replace with EVP_Cipher */ - p = q = malloc(block_sz); - if(p == NULL) - return ENOMEM; + heim_assert(et->blocksize <= sizeof(old_ivec), + "blocksize too big for ivec buffer"); - memcpy(q, hiv->data.data, hiv->data.length); - q += hiv->data.length; + if (ivec) + memcpy(old_ivec, ivec, et->blocksize); + else + memset(old_ivec, 0, et->blocksize); - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) - continue; - memcpy(q, data[i].data.data, data[i].data.length); - q += data[i].data.length; - } - if (piv) - memset(q, 0, piv->data.length); + ret = (*et->encrypt)(context, dkey, enc_data.data, enc_data.length, + 1, usage, ivec); + if(ret) + goto cleanup; + ret = iov_uncoalesce(context, &enc_data, data, num_data); + if(ret) + goto cleanup; - ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); - if(ret) { - free(p); - return ret; + ivec_data.length = et->blocksize; + ivec_data.data = old_ivec; + + ret = iov_coalesce(context, &ivec_data, data, num_data, TRUE, &sign_data); + if(ret) + goto cleanup; + } else { + ret = iov_coalesce(context, NULL, data, num_data, TRUE, &sign_data); + if(ret) + goto cleanup; } - ret = _key_schedule(context, dkey); - if(ret) { - free(p); - return ret; + + ret = create_checksum(context, + et->keyed_checksum, + crypto, + INTEGRITY_USAGE(usage), + sign_data.data, + sign_data.length, + &cksum); + if(ret == 0 && cksum.checksum.length != trailersz) { + free_Checksum (&cksum); + krb5_clear_error_message (context); + ret = KRB5_CRYPTO_INTERNAL; } + if(ret) + goto cleanup; - ret = (*et->encrypt)(context, dkey, p, block_sz, 1, usage, ivec); - if (ret) { - free(p); - return ret; - } + /* save cksum at end */ + memcpy(tiv->data.data, cksum.checksum.data, cksum.checksum.length); + free_Checksum (&cksum); - /* now copy data back to buffers */ - q = p; + if (!(et->flags & F_ENC_THEN_CKSUM)) { + ret = iov_coalesce(context, NULL, data, num_data, FALSE, &enc_data); + if(ret) + goto cleanup; - memcpy(hiv->data.data, q, hiv->data.length); - q += hiv->data.length; + ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); + if(ret) + goto cleanup; - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) - continue; - memcpy(data[i].data.data, q, data[i].data.length); - q += data[i].data.length; - } - if (piv) - memcpy(piv->data.data, q, pad_sz); + ret = _key_schedule(context, dkey); + if(ret) + goto cleanup; - free(p); + ret = (*et->encrypt)(context, dkey, enc_data.data, enc_data.length, + 1, usage, ivec); + if(ret) + goto cleanup; + ret = iov_uncoalesce(context, &enc_data, data, num_data); + if(ret) + goto cleanup; + } + +cleanup: + if (enc_data.data) { + memset_s(enc_data.data, enc_data.length, 0, enc_data.length); + krb5_data_free(&enc_data); + } + if (sign_data.data) { + memset_s(sign_data.data, sign_data.length, 0, sign_data.length); + krb5_data_free(&sign_data); + } return ret; } @@ -1411,10 +1676,8 @@ unsigned int num_data, void *ivec) { - unsigned int i; - size_t headersz, trailersz, len; Checksum cksum; - unsigned char *p, *q; + krb5_data enc_data, sign_data; krb5_error_code ret; struct _krb5_key_data *dkey; struct _krb5_encryption_type *et = crypto->et; @@ -1425,97 +1688,63 @@ return KRB5_CRYPTO_INTERNAL; } - headersz = et->confoundersize; - - hiv = find_iv(data, num_data, KRB5_CRYPTO_TYPE_HEADER); - if (hiv == NULL || hiv->data.length != headersz) + /* header */ + hiv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_HEADER); + if (hiv == NULL || hiv->data.length != et->confoundersize) return KRB5_BAD_MSIZE; /* trailer */ - trailersz = CHECKSUMSIZE(et->keyed_checksum); - - tiv = find_iv(data, num_data, KRB5_CRYPTO_TYPE_TRAILER); - if (tiv->data.length != trailersz) + tiv = iov_find(data, num_data, KRB5_CRYPTO_TYPE_TRAILER); + if (tiv->data.length != CHECKSUMSIZE(et->keyed_checksum)) return KRB5_BAD_MSIZE; - /* Find length of data we will decrypt */ - - len = headersz; - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) - continue; - len += data[i].data.length; - } - - if ((len % et->padsize) != 0) { + /* padding */ + if ((iov_enc_data_len(data, num_data) % et->padsize) != 0) { krb5_clear_error_message(context); return KRB5_BAD_MSIZE; } - /* XXX replace with EVP_Cipher */ - - p = q = malloc(len); - if (p == NULL) - return ENOMEM; + krb5_data_zero(&enc_data); + krb5_data_zero(&sign_data); - memcpy(q, hiv->data.data, hiv->data.length); - q += hiv->data.length; + if (!(et->flags & F_ENC_THEN_CKSUM)) { + ret = iov_coalesce(context, NULL, data, num_data, FALSE, &enc_data); + if(ret) + goto cleanup; - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) - continue; - memcpy(q, data[i].data.data, data[i].data.length); - q += data[i].data.length; - } + ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); + if(ret) + goto cleanup; - ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); - if(ret) { - free(p); - return ret; - } - ret = _key_schedule(context, dkey); - if(ret) { - free(p); - return ret; - } + ret = _key_schedule(context, dkey); + if(ret) + goto cleanup; - ret = (*et->encrypt)(context, dkey, p, len, 0, usage, ivec); - if (ret) { - free(p); - return ret; - } + ret = (*et->encrypt)(context, dkey, enc_data.data, enc_data.length, + 0, usage, ivec); + if(ret) + goto cleanup; - /* copy data back to buffers */ - memcpy(hiv->data.data, p, hiv->data.length); - q = p + hiv->data.length; - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA) - continue; - memcpy(data[i].data.data, q, data[i].data.length); - q += data[i].data.length; - } + ret = iov_uncoalesce(context, &enc_data, data, num_data); + if(ret) + goto cleanup; - free(p); + ret = iov_coalesce(context, NULL, data, num_data, TRUE, &sign_data); + if(ret) + goto cleanup; + } else { + krb5_data ivec_data; + static unsigned char zero_ivec[EVP_MAX_IV_LENGTH]; - /* check signature */ - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_SIGN_ONLY) - continue; - len += data[i].data.length; - } + heim_assert(et->blocksize <= sizeof(zero_ivec), + "blocksize too big for ivec buffer"); - p = q = malloc(len); - if (p == NULL) - return ENOMEM; + ivec_data.length = et->blocksize; + ivec_data.data = ivec ? ivec : zero_ivec; - memcpy(q, hiv->data.data, hiv->data.length); - q += hiv->data.length; - for (i = 0; i < num_data; i++) { - if (data[i].flags != KRB5_CRYPTO_TYPE_DATA && - data[i].flags != KRB5_CRYPTO_TYPE_SIGN_ONLY) - continue; - memcpy(q, data[i].data.data, data[i].data.length); - q += data[i].data.length; + ret = iov_coalesce(context, &ivec_data, data, num_data, TRUE, &sign_data); + if(ret) + goto cleanup; } cksum.checksum.data = tiv->data.data; @@ -1525,10 +1754,44 @@ ret = verify_checksum(context, crypto, INTEGRITY_USAGE(usage), - p, - len, + sign_data.data, + sign_data.length, &cksum); - free(p); + if(ret) + goto cleanup; + + if (et->flags & F_ENC_THEN_CKSUM) { + ret = iov_coalesce(context, NULL, data, num_data, FALSE, &enc_data); + if(ret) + goto cleanup; + + ret = _get_derived_key(context, crypto, ENCRYPTION_USAGE(usage), &dkey); + if(ret) + goto cleanup; + + ret = _key_schedule(context, dkey); + if(ret) + goto cleanup; + + ret = (*et->encrypt)(context, dkey, enc_data.data, enc_data.length, + 0, usage, ivec); + if(ret) + goto cleanup; + + ret = iov_uncoalesce(context, &enc_data, data, num_data); + if(ret) + goto cleanup; + } + +cleanup: + if (enc_data.data) { + memset_s(enc_data.data, enc_data.length, 0, enc_data.length); + krb5_data_free(&enc_data); + } + if (sign_data.data) { + memset_s(sign_data.data, sign_data.length, 0, sign_data.length); + krb5_data_free(&sign_data); + } return ret; } @@ -1566,7 +1829,7 @@ return KRB5_CRYPTO_INTERNAL; } - civ = find_iv(data, num_data, KRB5_CRYPTO_TYPE_CHECKSUM); + civ = iov_find(data, num_data, KRB5_CRYPTO_TYPE_CHECKSUM); if (civ == NULL) return KRB5_BAD_MSIZE; @@ -1645,7 +1908,7 @@ return KRB5_CRYPTO_INTERNAL; } - civ = find_iv(data, num_data, KRB5_CRYPTO_TYPE_CHECKSUM); + civ = iov_find(data, num_data, KRB5_CRYPTO_TYPE_CHECKSUM); if (civ == NULL) return KRB5_BAD_MSIZE; @@ -1754,14 +2017,27 @@ krb5_data *result, void *ivec) { - if(derived_crypto(context, crypto)) - return encrypt_internal_derived(context, crypto, usage, + krb5_error_code ret; + + switch (crypto->et->flags & F_CRYPTO_MASK) { + case F_RFC3961_ENC: + ret = encrypt_internal_derived(context, crypto, usage, + data, len, result, ivec); + break; + case F_SPECIAL: + ret = encrypt_internal_special (context, crypto, usage, data, len, result, ivec); - else if (special_crypto(context, crypto)) - return encrypt_internal_special (context, crypto, usage, - data, len, result, ivec); - else - return encrypt_internal(context, crypto, data, len, result, ivec); + break; + case F_ENC_THEN_CKSUM: + ret = encrypt_internal_enc_then_cksum(context, crypto, usage, + data, len, result, ivec); + break; + default: + ret = encrypt_internal(context, crypto, data, len, result, ivec); + break; + } + + return ret; } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -1802,14 +2078,27 @@ krb5_data *result, void *ivec) { - if(derived_crypto(context, crypto)) - return decrypt_internal_derived(context, crypto, usage, - data, len, result, ivec); - else if (special_crypto (context, crypto)) - return decrypt_internal_special(context, crypto, usage, - data, len, result, ivec); - else - return decrypt_internal(context, crypto, data, len, result, ivec); + krb5_error_code ret; + + switch (crypto->et->flags & F_CRYPTO_MASK) { + case F_RFC3961_ENC: + ret = decrypt_internal_derived(context, crypto, usage, + data, len, result, ivec); + break; + case F_SPECIAL: + ret = decrypt_internal_special(context, crypto, usage, + data, len, result, ivec); + break; + case F_ENC_THEN_CKSUM: + ret = decrypt_internal_enc_then_cksum(context, crypto, usage, + data, len, result, ivec); + break; + default: + ret = decrypt_internal(context, crypto, data, len, result, ivec); + break; + } + + return ret; } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -1839,32 +2128,29 @@ * * ************************************************************/ -krb5_error_code -_krb5_derive_key(krb5_context context, - struct _krb5_encryption_type *et, - struct _krb5_key_data *key, - const void *constant, - size_t len) +static krb5_error_code +derive_key_rfc3961(krb5_context context, + struct _krb5_encryption_type *et, + struct _krb5_key_data *key, + const void *constant, + size_t len) { + unsigned char *k = NULL; unsigned int nblocks = 0, i; krb5_error_code ret = 0; struct _krb5_key_type *kt = et->keytype; - ret = _key_schedule(context, key); - if(ret) - return ret; if(et->blocksize * 8 < kt->bits || len != et->blocksize) { nblocks = (kt->bits + et->blocksize * 8 - 1) / (et->blocksize * 8); k = malloc(nblocks * et->blocksize); if(k == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } ret = _krb5_n_fold(constant, len, k, et->blocksize); if (ret) { - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + krb5_enomem(context); goto out; } @@ -1882,8 +2168,7 @@ size_t res_len = (kt->bits + 7) / 8; if(len != 0 && c == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } memcpy(c, constant, len); @@ -1891,43 +2176,113 @@ k = malloc(res_len); if(res_len != 0 && k == NULL) { free(c); - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } ret = _krb5_n_fold(c, len, k, res_len); free(c); if (ret) { - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + krb5_enomem(context); goto out; } } - /* XXX keytype dependent post-processing */ - switch(kt->type) { - case ETYPE_OLD_DES3_CBC_SHA1: + if (kt->type == KRB5_ENCTYPE_OLD_DES3_CBC_SHA1) _krb5_DES3_random_to_key(context, key->key, k, nblocks * et->blocksize); - break; - case ENCTYPE_AES128_CTS_HMAC_SHA1_96: - case ENCTYPE_AES256_CTS_HMAC_SHA1_96: + else memcpy(key->key->keyvalue.data, k, key->key->keyvalue.length); + + out: + if (k) { + memset_s(k, nblocks * et->blocksize, 0, nblocks * et->blocksize); + free(k); + } + return ret; +} + +static krb5_error_code +derive_key_sp800_hmac(krb5_context context, + struct _krb5_encryption_type *et, + struct _krb5_key_data *key, + const void *constant, + size_t len) +{ + krb5_error_code ret; + struct _krb5_key_type *kt = et->keytype; + krb5_data label; + const EVP_MD *md = NULL; + const unsigned char *c = constant; + size_t key_len; + krb5_data K1; + + ret = _krb5_aes_sha2_md_for_enctype(context, kt->type, &md); + if (ret) + return ret; + + /* + * PRF usage: not handled here (output cannot be longer) + * Integrity usage: truncated hash (half length) + * Encryption usage: base key length + */ + if (len == 5 && (c[4] == 0x99 || c[4] == 0x55)) + key_len = EVP_MD_size(md) / 2; + else + key_len = kt->size; + + ret = krb5_data_alloc(&K1, key_len); + if (ret) + return ret; + + label.data = (void *)constant; + label.length = len; + + ret = _krb5_SP800_108_HMAC_KDF(context, &key->key->keyvalue, + &label, NULL, md, &K1); + if (ret == 0) { + if (key->key->keyvalue.length > key_len) + key->key->keyvalue.length = key_len; + memcpy(key->key->keyvalue.data, K1.data, key_len); + } + + memset_s(K1.data, K1.length, 0, K1.length); + krb5_data_free(&K1); + + return ret; +} + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_derive_key(krb5_context context, + struct _krb5_encryption_type *et, + struct _krb5_key_data *key, + const void *constant, + size_t len) +{ + krb5_error_code ret; + + ret = _key_schedule(context, key); + if(ret) + return ret; + + switch (et->flags & F_KDF_MASK) { + case F_RFC3961_KDF: + ret = derive_key_rfc3961(context, et, key, constant, len); + break; + case F_SP800_108_HMAC_KDF: + ret = derive_key_sp800_hmac(context, et, key, constant, len); break; default: ret = KRB5_CRYPTO_INTERNAL; krb5_set_error_message(context, ret, N_("derive_key() called with unknown keytype (%u)", ""), - kt->type); + et->keytype->type); break; } - out: + if (key->schedule) { free_key_schedule(context, key, et); key->schedule = NULL; } - if (k) { - memset(k, 0, nblocks * et->blocksize); - free(k); - } + return ret; } @@ -1986,21 +2341,19 @@ struct _krb5_key_data *d; unsigned char constant[5]; + *key = NULL; for(i = 0; i < crypto->num_key_usage; i++) if(crypto->key_usage[i].usage == usage) { *key = &crypto->key_usage[i].key; return 0; } d = _new_derived_key(crypto, usage); - if(d == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } - krb5_copy_keyblock(context, crypto->key.key, &d->key); - _krb5_put_int(constant, usage, 5); - _krb5_derive_key(context, crypto->et, d, constant, sizeof(constant)); + if (d == NULL) + return krb5_enomem(context); *key = d; - return 0; + krb5_copy_keyblock(context, crypto->key.key, &d->key); + _krb5_put_int(constant, usage, sizeof(constant)); + return _krb5_derive_key(context, crypto->et, d, constant, sizeof(constant)); } /** @@ -2029,11 +2382,9 @@ { krb5_error_code ret; ALLOC(*crypto, 1); - if(*crypto == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } - if(etype == ETYPE_NULL) + if (*crypto == NULL) + return krb5_enomem(context); + if(etype == (krb5_enctype)ETYPE_NULL) etype = key->keytype; (*crypto)->et = _krb5_find_enctype(etype); if((*crypto)->et == NULL || ((*crypto)->et->flags & F_DISABLED)) { @@ -2054,9 +2405,6 @@ *crypto = NULL; return ret; } - ret = fbsd_ossl_provider_load(); - if (ret) - return ret; (*crypto)->key.schedule = NULL; (*crypto)->num_key_usage = 0; (*crypto)->key_usage = NULL; @@ -2074,7 +2422,7 @@ krb5_free_data(context, key->schedule); } -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_free_key_data(krb5_context context, struct _krb5_key_data *key, struct _krb5_encryption_type *et) { @@ -2283,6 +2631,47 @@ return 0; } +/** + * Returns is the encryption is strong or weak + * + * @param context Kerberos 5 context + * @param enctype encryption type to probe + * + * @return Returns true if encryption type is weak or is not supported. + * + * @ingroup krb5_crypto + */ + +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +krb5_is_enctype_weak(krb5_context context, krb5_enctype enctype) +{ + struct _krb5_encryption_type *et = _krb5_find_enctype(enctype); + if(et == NULL || (et->flags & F_WEAK)) + return TRUE; + return FALSE; +} + +/** + * Returns whether the encryption type should use randomly generated salts + * + * @param context Kerberos 5 context + * @param enctype encryption type to probe + * + * @return Returns true if generated salts should have random component + * + * @ingroup krb5_crypto + */ +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +_krb5_enctype_requires_random_salt(krb5_context context, + krb5_enctype enctype) +{ + struct _krb5_encryption_type *et; + + et = _krb5_find_enctype (enctype); + + return et && (et->flags & F_SP800_108_HMAC_KDF); +} + static size_t wrapped_length (krb5_context context, krb5_crypto crypto, @@ -2519,7 +2908,7 @@ krb5_data_free(&input2); if (ret) krb5_data_free(output); - return 0; + return ret; } /** @@ -2552,14 +2941,14 @@ size_t i, keysize; memset(res, 0, sizeof(*res)); + krb5_data_zero(&os1); + krb5_data_zero(&os2); - ret = krb5_enctype_keysize(context, enctype, &keysize); + ret = krb5_enctype_keybits(context, enctype, &keysize); if (ret) return ret; + keysize = (keysize + 7) / 8; - ret = krb5_data_alloc(&res->keyvalue, keysize); - if (ret) - goto out; ret = krb5_crypto_prfplus(context, crypto1, pepper1, keysize, &os1); if (ret) goto out; @@ -2569,13 +2958,12 @@ res->keytype = enctype; { - unsigned char *p1 = os1.data, *p2 = os2.data, *p3 = res->keyvalue.data; + unsigned char *p1 = os1.data, *p2 = os2.data; for (i = 0; i < keysize; i++) - p3[i] = p1[i] ^ p2[i]; + p1[i] ^= p2[i]; } + ret = krb5_random_to_key(context, enctype, os1.data, keysize, res); out: - if (ret) - krb5_data_free(&res->keyvalue); krb5_data_free(&os1); krb5_data_free(&os2); @@ -2616,10 +3004,8 @@ } ret = malloc(n * sizeof(*ret)); - if (ret == NULL && n != 0) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; - } + if (ret == NULL && n != 0) + return krb5_enomem(context); n = 0; for (i = _krb5_num_etypes - 1; i >= 0; --i) { if (_krb5_etypes[i]->keytype->type == keytype diff --git a/crypto/heimdal/lib/krb5/data.c b/crypto/heimdal/lib/krb5/data.c --- a/crypto/heimdal/lib/krb5/data.c +++ b/crypto/heimdal/lib/krb5/data.c @@ -62,8 +62,7 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_free(krb5_data *p) { - if(p->data != NULL) - free(p->data); + free(p->data); krb5_data_zero(p); } @@ -176,10 +175,8 @@ { krb5_error_code ret; ALLOC(*outdata, 1); - if(*outdata == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; - } + if(*outdata == NULL) + return krb5_enomem(context); ret = der_copy_octet_string(indata, *outdata); if(ret) { krb5_clear_error_message (context); diff --git a/crypto/heimdal/lib/krb5/db_plugin.h b/crypto/heimdal/lib/krb5/db_plugin.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/db_plugin.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2011, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef HEIMDAL_KRB5_DB_PLUGIN_H +#define HEIMDAL_KRB5_DB_PLUGIN_H 1 + +#define KRB5_PLUGIN_DB "krb5_db_plug" +#define KRB5_PLUGIN_DB_VERSION_0 0 + +/** @struct krb5plugin_db_ftable_desc + * + * @brief Description of the krb5 DB plugin facility. + * + * The krb5_aname_to_lname(3) function's DB rule is pluggable. The + * plugin is named KRB5_PLUGIN_DB ("krb5_db_plug"), with a single minor + * version, KRB5_PLUGIN_DB_VERSION_0 (0). + * + * The plugin consists of a data symbol referencing a structure of type + * krb5plugin_db_ftable_desc, with three fields: + * + * @param init Plugin initialization function (see krb5-plugin(7)) + * + * @param minor_version The plugin minor version number (0) + * + * @param fini Plugin finalization function + * + * The init entry point is expected to call heim_db_register(). The + * fini entry point is expected to do nothing. + * + * @ingroup krb5_support + */ +typedef struct krb5plugin_db_ftable_desc { + int minor_version; + krb5_error_code (KRB5_LIB_CALL *init)(krb5_context, void **); + void (KRB5_LIB_CALL *fini)(void *); +} krb5plugin_db_ftable; + +#endif /* HEIMDAL_KRB5_DB_PLUGIN_H */ + diff --git a/crypto/heimdal/lib/krb5/db_plugin.c b/crypto/heimdal/lib/krb5/db_plugin.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/db_plugin.c @@ -0,0 +1,31 @@ +/* + */ + +#include "krb5_locl.h" +#include "db_plugin.h" + +/* Default plugin (DB using binary search of sorted text file) follows */ +static heim_base_once_t db_plugins_once = HEIM_BASE_ONCE_INIT; + +static krb5_error_code KRB5_LIB_CALL +db_plugins_plcallback(krb5_context context, const void *plug, void *plugctx, + void *userctx) +{ + return 0; +} + +static void +db_plugins_init(void *arg) +{ + krb5_context context = arg; + (void)_krb5_plugin_run_f(context, "krb5", KRB5_PLUGIN_DB, + KRB5_PLUGIN_DB_VERSION_0, 0, NULL, + db_plugins_plcallback); +} + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_load_db_plugins(krb5_context context) +{ + heim_base_once_f(&db_plugins_once, context, db_plugins_init); +} + diff --git a/crypto/heimdal/lib/krb5/dcache.c b/crypto/heimdal/lib/krb5/dcache.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/dcache.c @@ -0,0 +1,699 @@ +/* + * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + +typedef struct krb5_dcache{ + krb5_ccache fcache; + char *dir; + char *name; +} krb5_dcache; + +#define DCACHE(X) ((krb5_dcache*)(X)->data.data) +#define D2FCACHE(X) ((X)->fcache) + +static krb5_error_code KRB5_CALLCONV dcc_close(krb5_context, krb5_ccache); +static krb5_error_code KRB5_CALLCONV dcc_get_default_name(krb5_context, char **); + + +static char * +primary_create(krb5_dcache *dc) +{ + char *primary = NULL; + + asprintf(&primary, "%s/primary", dc->dir); + if (primary == NULL) + return NULL; + + return primary; +} + +static int +is_filename_cacheish(const char *name) +{ + return strncmp(name, "tkt", 3) == 0; + +} + +static krb5_error_code +set_default_cache(krb5_context context, krb5_dcache *dc, const char *residual) +{ + char *path = NULL, *primary = NULL; + krb5_error_code ret; + struct iovec iov[2]; + size_t len; + int fd = -1; + + if (!is_filename_cacheish(residual)) { + krb5_set_error_message(context, KRB5_CC_FORMAT, + "name %s is not a cache (doesn't start with tkt)", residual); + return KRB5_CC_FORMAT; + } + + asprintf(&path, "%s/primary-XXXXXX", dc->dir); + if (path == NULL) + return krb5_enomem(context); + + fd = mkstemp(path); + if (fd < 0) { + ret = errno; + goto out; + } + rk_cloexec(fd); +#ifndef _WIN32 + if (fchmod(fd, S_IRUSR | S_IWUSR) < 0) { + ret = errno; + goto out; + } +#endif + len = strlen(residual); + + iov[0].iov_base = rk_UNCONST(residual); + iov[0].iov_len = len; + iov[1].iov_base = "\n"; + iov[1].iov_len = 1; + + if (writev(fd, iov, sizeof(iov)/sizeof(iov[0])) != len + 1) { + ret = errno; + goto out; + } + + primary = primary_create(dc); + if (primary == NULL) { + ret = krb5_enomem(context); + goto out; + } + + if (rename(path, primary) < 0) { + ret = errno; + goto out; + } + + close(fd); + fd = -1; + + ret = 0; + out: + if (fd >= 0) { + (void)unlink(path); + close(fd); + } + if (path) + free(path); + if (primary) + free(primary); + + return ret; +} + +static krb5_error_code +get_default_cache(krb5_context context, krb5_dcache *dc, char **residual) +{ + krb5_error_code ret; + char buf[MAXPATHLEN]; + char *primary; + FILE *f; + + *residual = NULL; + primary = primary_create(dc); + if (primary == NULL) + return krb5_enomem(context); + + f = fopen(primary, "r"); + if (f == NULL) { + if (errno == ENOENT) { + free(primary); + *residual = strdup("tkt"); + if (*residual == NULL) + return krb5_enomem(context); + return 0; + } + ret = errno; + krb5_set_error_message(context, ret, "failed to open %s", primary); + free(primary); + return ret; + } + + if (fgets(buf, sizeof(buf), f) == NULL) { + ret = ferror(f); + fclose(f); + krb5_set_error_message(context, ret, "read file %s", primary); + free(primary); + return ret; + } + fclose(f); + + buf[strcspn(buf, "\r\n")] = '\0'; + + if (!is_filename_cacheish(buf)) { + krb5_set_error_message(context, KRB5_CC_FORMAT, + "name in %s is not a cache (doesn't start with tkt)", primary); + free(primary); + return KRB5_CC_FORMAT; + } + + free(primary); + + *residual = strdup(buf); + if (*residual == NULL) + return krb5_enomem(context); + + return 0; +} + + + +static const char* KRB5_CALLCONV +dcc_get_name(krb5_context context, + krb5_ccache id) +{ + krb5_dcache *dc = DCACHE(id); + return dc->name; +} + + +static krb5_error_code +verify_directory(krb5_context context, const char *path) +{ + struct stat sb; + + if (stat(path, &sb) != 0) { + if (errno == ENOENT) { + /* XXX should use mkdirx_np() */ + if (rk_mkdir(path, S_IRWXU) == 0) + return 0; + + krb5_set_error_message(context, ENOENT, + N_("DIR directory %s doesn't exists", ""), path); + return ENOENT; + } else { + int ret = errno; + krb5_set_error_message(context, ret, + N_("DIR directory %s is bad: %s", ""), path, strerror(ret)); + return errno; + } + } + if (!S_ISDIR(sb.st_mode)) { + krb5_set_error_message(context, KRB5_CC_BADNAME, + N_("DIR directory %s is not a directory", ""), path); + return KRB5_CC_BADNAME; + } + + return 0; +} + +static void +dcc_release(krb5_context context, krb5_dcache *dc) +{ + if (dc->fcache) + krb5_cc_close(context, dc->fcache); + if (dc->dir) + free(dc->dir); + if (dc->name) + free(dc->name); + memset(dc, 0, sizeof(*dc)); + free(dc); +} + +static krb5_error_code KRB5_CALLCONV +dcc_resolve(krb5_context context, krb5_ccache *id, const char *res) +{ + char *filename = NULL; + krb5_error_code ret; + krb5_dcache *dc; + const char *p; + + p = res; + do { + p = strstr(p, ".."); + if (p && (p == res || ISPATHSEP(p[-1])) && (ISPATHSEP(p[2]) || p[2] == '\0')) { + krb5_set_error_message(context, KRB5_CC_FORMAT, + N_("Path contains a .. component", "")); + return KRB5_CC_FORMAT; + } + if (p) + p += 3; + } while (p); + + dc = calloc(1, sizeof(*dc)); + if (dc == NULL) { + krb5_set_error_message(context, KRB5_CC_NOMEM, + N_("malloc: out of memory", "")); + return KRB5_CC_NOMEM; + } + + /* check for explicit component */ + if (res[0] == ':') { + char *q; + + dc->dir = strdup(&res[1]); +#ifdef _WIN32 + q = strrchr(dc->dir, '\\'); + if (q == NULL) +#endif + q = strrchr(dc->dir, '/'); + if (q) { + *q++ = '\0'; + } else { + krb5_set_error_message(context, KRB5_CC_FORMAT, N_("Cache not an absolute path: %s", ""), dc->dir); + dcc_release(context, dc); + return KRB5_CC_FORMAT; + } + + if (!is_filename_cacheish(q)) { + krb5_set_error_message(context, KRB5_CC_FORMAT, + N_("Name %s is not a cache (doesn't start with tkt)", ""), q); + dcc_release(context, dc); + return KRB5_CC_FORMAT; + } + + ret = verify_directory(context, dc->dir); + if (ret) { + dcc_release(context, dc); + return ret; + } + + dc->name = strdup(res); + if (dc->name == NULL) { + dcc_release(context, dc); + return krb5_enomem(context); + } + + } else { + char *residual; + size_t len; + + dc->dir = strdup(res); + if (dc->dir == NULL) { + dcc_release(context, dc); + return krb5_enomem(context); + } + + len = strlen(dc->dir); + + if (ISPATHSEP(dc->dir[len - 1])) + dc->dir[len - 1] = '\0'; + + ret = verify_directory(context, dc->dir); + if (ret) { + dcc_release(context, dc); + return ret; + } + + ret = get_default_cache(context, dc, &residual); + if (ret) { + dcc_release(context, dc); + return ret; + } + asprintf(&dc->name, ":%s/%s", dc->dir, residual); + free(residual); + if (dc->name == NULL) { + dcc_release(context, dc); + return krb5_enomem(context); + } + } + + asprintf(&filename, "FILE%s", dc->name); + if (filename == NULL) { + dcc_release(context, dc); + return krb5_enomem(context); + } + + ret = krb5_cc_resolve(context, filename, &dc->fcache); + free(filename); + if (ret) { + dcc_release(context, dc); + return ret; + } + + + (*id)->data.data = dc; + (*id)->data.length = sizeof(*dc); + return 0; +} + +static char * +copy_default_dcc_cache(krb5_context context) +{ + const char *defname; + krb5_error_code ret; + char *name = NULL; + size_t len; + + len = strlen(krb5_dcc_ops.prefix); + + defname = krb5_cc_default_name(context); + if (defname == NULL || + strncmp(defname, krb5_dcc_ops.prefix, len) != 0 || + defname[len] != ':') + { + ret = dcc_get_default_name(context, &name); + if (ret) + return NULL; + + return name; + } else { + return strdup(&defname[len + 1]); + } +} + + +static krb5_error_code KRB5_CALLCONV +dcc_gen_new(krb5_context context, krb5_ccache *id) +{ + krb5_error_code ret; + char *name = NULL; + krb5_dcache *dc; + int fd; + size_t len; + + name = copy_default_dcc_cache(context); + if (name == NULL) { + krb5_set_error_message(context, KRB5_CC_FORMAT, + N_("Can't generate DIR caches unless its the default type", "")); + return KRB5_CC_FORMAT; + } + + len = strlen(krb5_dcc_ops.prefix); + if (strncmp(name, krb5_dcc_ops.prefix, len) == 0 && name[len] == ':') + ++len; + else + len = 0; + + ret = dcc_resolve(context, id, name + len); + free(name); + name = NULL; + if (ret) + return ret; + + dc = DCACHE((*id)); + + asprintf(&name, ":%s/tktXXXXXX", dc->dir); + if (name == NULL) { + dcc_close(context, *id); + return krb5_enomem(context); + } + + fd = mkstemp(&name[1]); + if (fd < 0) { + dcc_close(context, *id); + return krb5_enomem(context); + } + close(fd); + + free(dc->name); + dc->name = name; + + return 0; +} + +static krb5_error_code KRB5_CALLCONV +dcc_initialize(krb5_context context, + krb5_ccache id, + krb5_principal primary_principal) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_initialize(context, D2FCACHE(dc), primary_principal); +} + +static krb5_error_code KRB5_CALLCONV +dcc_close(krb5_context context, + krb5_ccache id) +{ + dcc_release(context, DCACHE(id)); + return 0; +} + +static krb5_error_code KRB5_CALLCONV +dcc_destroy(krb5_context context, + krb5_ccache id) +{ + krb5_dcache *dc = DCACHE(id); + krb5_ccache fcache = D2FCACHE(dc); + dc->fcache = NULL; + return krb5_cc_destroy(context, fcache); +} + +static krb5_error_code KRB5_CALLCONV +dcc_store_cred(krb5_context context, + krb5_ccache id, + krb5_creds *creds) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_store_cred(context, D2FCACHE(dc), creds); +} + +static krb5_error_code KRB5_CALLCONV +dcc_get_principal(krb5_context context, + krb5_ccache id, + krb5_principal *principal) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_get_principal(context, D2FCACHE(dc), principal); +} + +static krb5_error_code KRB5_CALLCONV +dcc_get_first (krb5_context context, + krb5_ccache id, + krb5_cc_cursor *cursor) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_start_seq_get(context, D2FCACHE(dc), cursor); +} + +static krb5_error_code KRB5_CALLCONV +dcc_get_next (krb5_context context, + krb5_ccache id, + krb5_cc_cursor *cursor, + krb5_creds *creds) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_next_cred(context, D2FCACHE(dc), cursor, creds); +} + +static krb5_error_code KRB5_CALLCONV +dcc_end_get (krb5_context context, + krb5_ccache id, + krb5_cc_cursor *cursor) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_end_seq_get(context, D2FCACHE(dc), cursor); +} + +static krb5_error_code KRB5_CALLCONV +dcc_remove_cred(krb5_context context, + krb5_ccache id, + krb5_flags which, + krb5_creds *cred) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_remove_cred(context, D2FCACHE(dc), which, cred); +} + +static krb5_error_code KRB5_CALLCONV +dcc_set_flags(krb5_context context, + krb5_ccache id, + krb5_flags flags) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_set_flags(context, D2FCACHE(dc), flags); +} + +static int KRB5_CALLCONV +dcc_get_version(krb5_context context, + krb5_ccache id) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_get_version(context, D2FCACHE(dc)); +} + +struct dcache_iter { + int first; + krb5_dcache *dc; +}; + +static krb5_error_code KRB5_CALLCONV +dcc_get_cache_first(krb5_context context, krb5_cc_cursor *cursor) +{ + struct dcache_iter *iter; + krb5_error_code ret; + char *name; + + *cursor = NULL; + iter = calloc(1, sizeof(*iter)); + if (iter == NULL) + return krb5_enomem(context); + iter->first = 1; + + name = copy_default_dcc_cache(context); + if (name == NULL) { + free(iter); + krb5_set_error_message(context, KRB5_CC_FORMAT, + N_("Can't generate DIR caches unless its the default type", "")); + return KRB5_CC_FORMAT; + } + + ret = dcc_resolve(context, NULL, name); + free(name); + if (ret) { + free(iter); + return ret; + } + + /* XXX We need to opendir() here */ + + *cursor = iter; + return 0; +} + +static krb5_error_code KRB5_CALLCONV +dcc_get_cache_next(krb5_context context, krb5_cc_cursor cursor, krb5_ccache *id) +{ + struct dcache_iter *iter = cursor; + + if (iter == NULL) + return krb5_einval(context, 2); + + if (!iter->first) { + krb5_clear_error_message(context); + return KRB5_CC_END; + } + + /* XXX We need to readdir() here */ + iter->first = 0; + + return KRB5_CC_END; +} + +static krb5_error_code KRB5_CALLCONV +dcc_end_cache_get(krb5_context context, krb5_cc_cursor cursor) +{ + struct dcache_iter *iter = cursor; + + if (iter == NULL) + return krb5_einval(context, 2); + + /* XXX We need to closedir() here */ + if (iter->dc) + dcc_release(context, iter->dc); + free(iter); + return 0; +} + +static krb5_error_code KRB5_CALLCONV +dcc_move(krb5_context context, krb5_ccache from, krb5_ccache to) +{ + krb5_dcache *dcfrom = DCACHE(from); + krb5_dcache *dcto = DCACHE(to); + return krb5_cc_move(context, D2FCACHE(dcfrom), D2FCACHE(dcto)); +} + +static krb5_error_code KRB5_CALLCONV +dcc_get_default_name(krb5_context context, char **str) +{ + return _krb5_expand_default_cc_name(context, + KRB5_DEFAULT_CCNAME_DIR, + str); +} + +static krb5_error_code KRB5_CALLCONV +dcc_set_default(krb5_context context, krb5_ccache id) +{ + krb5_dcache *dc = DCACHE(id); + const char *name; + + name = krb5_cc_get_name(context, D2FCACHE(dc)); + if (name == NULL) + return ENOENT; + + return set_default_cache(context, dc, name); +} + +static krb5_error_code KRB5_CALLCONV +dcc_lastchange(krb5_context context, krb5_ccache id, krb5_timestamp *mtime) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_last_change_time(context, D2FCACHE(dc), mtime); +} + +static krb5_error_code KRB5_CALLCONV +dcc_set_kdc_offset(krb5_context context, krb5_ccache id, krb5_deltat kdc_offset) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_set_kdc_offset(context, D2FCACHE(dc), kdc_offset); +} + +static krb5_error_code KRB5_CALLCONV +dcc_get_kdc_offset(krb5_context context, krb5_ccache id, krb5_deltat *kdc_offset) +{ + krb5_dcache *dc = DCACHE(id); + return krb5_cc_get_kdc_offset(context, D2FCACHE(dc), kdc_offset); +} + + +/** + * Variable containing the DIR based credential cache implemention. + * + * @ingroup krb5_ccache + */ + +KRB5_LIB_VARIABLE const krb5_cc_ops krb5_dcc_ops = { + KRB5_CC_OPS_VERSION, + "DIR", + dcc_get_name, + dcc_resolve, + dcc_gen_new, + dcc_initialize, + dcc_destroy, + dcc_close, + dcc_store_cred, + NULL, /* dcc_retrieve */ + dcc_get_principal, + dcc_get_first, + dcc_get_next, + dcc_end_get, + dcc_remove_cred, + dcc_set_flags, + dcc_get_version, + dcc_get_cache_first, + dcc_get_cache_next, + dcc_end_cache_get, + dcc_move, + dcc_get_default_name, + dcc_set_default, + dcc_lastchange, + dcc_set_kdc_offset, + dcc_get_kdc_offset +}; diff --git a/crypto/heimdal/lib/krb5/deprecated.c b/crypto/heimdal/lib/krb5/deprecated.c index e7c0105ebf7fe4d65bd6dddd375096fb6075f679..0871aaf71db368687873034a1f055db318f199f4 GIT binary patch literal 18494 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 b`Q~O7O=U+*q-pVAOrUSA3jd7*s$u>I>6MF@ literal 15082 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 -enum { MAXSIZE = 24 }; +enum { MAXSIZE = 32 }; static struct testcase { krb5_enctype enctype; @@ -72,7 +72,31 @@ {ETYPE_DES3_CBC_SHA1, {0x00, 0x00, 0x00, 0x01, 0xaa}, 5, {0x26, 0xdc, 0xe3, 0x34, 0xb5, 0x45, 0x29, 0x2f, 0x2f, 0xea, 0xb9, 0xa8, 0x70, 0x1a, 0x89, 0xa4, 0xb9, 0x9e, 0xb9, 0x94, 0x2c, 0xec, 0xd0, 0x16}, {0xf4, 0x8f, 0xfd, 0x6e, 0x83, 0xf8, 0x3e, 0x73, 0x54, 0xe6, 0x94, 0xfd, 0x25, 0x2c, 0xf8, 0x3b, 0xfe, 0x58, 0xf7, 0xd5, 0xba, 0x37, 0xec, 0x5d}}, - {0} + {ETYPE_AES128_CTS_HMAC_SHA256_128, {0x00, 0x00, 0x00, 0x02, 0x99}, 5, + {0x37, 0x05, 0xD9, 0x60, 0x80, 0xC1, 0x77, 0x28, 0xA0, 0xE8, 0x00, 0xEA, 0xB6, 0xE0, 0xD2, 0x3C}, + {0xB3, 0x1A, 0x01, 0x8A, 0x48, 0xF5, 0x47, 0x76, 0xF4, 0x03, 0xE9, 0xA3, 0x96, 0x32, 0x5D, 0xC3}}, + {ETYPE_AES128_CTS_HMAC_SHA256_128, {0x00, 0x00, 0x00, 0x02, 0xAA}, 5, + {0x37, 0x05, 0xD9, 0x60, 0x80, 0xC1, 0x77, 0x28, 0xA0, 0xE8, 0x00, 0xEA, 0xB6, 0xE0, 0xD2, 0x3C}, + {0x9B, 0x19, 0x7D, 0xD1, 0xE8, 0xC5, 0x60, 0x9D, 0x6E, 0x67, 0xC3, 0xE3, 0x7C, 0x62, 0xC7, 0x2E}}, + {ETYPE_AES128_CTS_HMAC_SHA256_128, {0x00, 0x00, 0x00, 0x02, 0x55}, 5, + {0x37, 0x05, 0xD9, 0x60, 0x80, 0xC1, 0x77, 0x28, 0xA0, 0xE8, 0x00, 0xEA, 0xB6, 0xE0, 0xD2, 0x3C}, + {0x9F, 0xDA, 0x0E, 0x56, 0xAB, 0x2D, 0x85, 0xE1, 0x56, 0x9A, 0x68, 0x86, 0x96, 0xC2, 0x6A, 0x6C}}, + {ETYPE_AES256_CTS_HMAC_SHA384_192, {0x00, 0x00, 0x00, 0x02, 0x99}, 5, + {0x6D, 0x40, 0x4D, 0x37, 0xFA, 0xF7, 0x9F, 0x9D, 0xF0, 0xD3, 0x35, 0x68, 0xD3, 0x20, 0x66, 0x98, + 0x00, 0xEB, 0x48, 0x36, 0x47, 0x2E, 0xA8, 0xA0, 0x26, 0xD1, 0x6B, 0x71, 0x82, 0x46, 0x0C, 0x52}, + {0xEF, 0x57, 0x18, 0xBE, 0x86, 0xCC, 0x84, 0x96, 0x3D, 0x8B, 0xBB, 0x50, 0x31, 0xE9, 0xF5, 0xC4, + 0xBA, 0x41, 0xF2, 0x8F, 0xAF, 0x69, 0xE7, 0x3D }}, + {ETYPE_AES256_CTS_HMAC_SHA384_192, {0x00, 0x00, 0x00, 0x02, 0xAA}, 5, + {0x6D, 0x40, 0x4D, 0x37, 0xFA, 0xF7, 0x9F, 0x9D, 0xF0, 0xD3, 0x35, 0x68, 0xD3, 0x20, 0x66, 0x98, + 0x00, 0xEB, 0x48, 0x36, 0x47, 0x2E, 0xA8, 0xA0, 0x26, 0xD1, 0x6B, 0x71, 0x82, 0x46, 0x0C, 0x52}, + {0x56, 0xAB, 0x22, 0xBE, 0xE6, 0x3D, 0x82, 0xD7, 0xBC, 0x52, 0x27, 0xF6, 0x77, 0x3F, 0x8E, 0xA7, + 0xA5, 0xEB, 0x1C, 0x82, 0x51, 0x60, 0xC3, 0x83, 0x12, 0x98, 0x0C, 0x44, 0x2E, 0x5C, 0x7E, 0x49}}, + {ETYPE_AES256_CTS_HMAC_SHA384_192, {0x00, 0x00, 0x00, 0x02, 0x55}, 5, + {0x6D, 0x40, 0x4D, 0x37, 0xFA, 0xF7, 0x9F, 0x9D, 0xF0, 0xD3, 0x35, 0x68, 0xD3, 0x20, 0x66, 0x98, + 0x00, 0xEB, 0x48, 0x36, 0x47, 0x2E, 0xA8, 0xA0, 0x26, 0xD1, 0x6B, 0x71, 0x82, 0x46, 0x0C, 0x52}, + {0x69, 0xB1, 0x65, 0x14, 0xE3, 0xCD, 0x8E, 0x56, 0xB8, 0x20, 0x10, 0xD5, 0xC7, 0x30, 0x12, 0xB6, + 0x22, 0xC4, 0xD0, 0x0F, 0xFC, 0x23, 0xED, 0x1F}}, + {0, {0}, 0, {0}, {0}} }; int @@ -91,8 +115,8 @@ krb5_keyblock key; krb5_keyblock *dkey; - key.keytype = KEYTYPE_DES3; - key.keyvalue.length = MAXSIZE; + key.keytype = t->enctype; + krb5_enctype_keysize(context, t->enctype, &key.keyvalue.length); key.keyvalue.data = t->key; ret = krb5_derive_key(context, &key, t->enctype, t->constant, @@ -103,7 +127,7 @@ const unsigned char *p = dkey->keyvalue.data; int i; - printf ("derive_key failed\n"); + printf ("derive_key failed (enctype %d)\n", t->enctype); printf ("should be: "); for (i = 0; i < dkey->keyvalue.length; ++i) printf ("%02x", t->res[i]); diff --git a/crypto/heimdal/lib/krb5/digest.c b/crypto/heimdal/lib/krb5/digest.c --- a/crypto/heimdal/lib/krb5/digest.c +++ b/crypto/heimdal/lib/krb5/digest.c @@ -54,8 +54,7 @@ d = calloc(1, sizeof(*d)); if (d == NULL) { *digest = NULL; - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } *digest = d; @@ -106,8 +105,7 @@ free(digest->init.channel); digest->init.channel = NULL; } - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -120,10 +118,8 @@ return EINVAL; } digest->init.type = strdup(type); - if (digest->init.type == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->init.type == NULL) + return krb5_enomem(context); return 0; } @@ -137,16 +133,13 @@ return EINVAL; } digest->init.hostname = malloc(sizeof(*digest->init.hostname)); - if (digest->init.hostname == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->init.hostname == NULL) + return krb5_enomem(context); *digest->init.hostname = strdup(hostname); if (*digest->init.hostname == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->init.hostname); digest->init.hostname = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -168,10 +161,8 @@ return EINVAL; } digest->request.serverNonce = strdup(nonce); - if (digest->request.serverNonce == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.serverNonce == NULL) + return krb5_enomem(context); return 0; } @@ -192,10 +183,8 @@ return EINVAL; } digest->request.opaque = strdup(opaque); - if (digest->request.opaque == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.opaque == NULL) + return krb5_enomem(context); return 0; } @@ -218,16 +207,13 @@ return EINVAL; } digest->request.identifier = calloc(1, sizeof(*digest->request.identifier)); - if (digest->request.identifier == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.identifier == NULL) + return krb5_enomem(context); *digest->request.identifier = strdup(id); if (*digest->request.identifier == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.identifier); digest->request.identifier = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -473,16 +459,13 @@ } digest->request.clientNonce = calloc(1, sizeof(*digest->request.clientNonce)); - if (digest->request.clientNonce == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.clientNonce == NULL) + return krb5_enomem(context); *digest->request.clientNonce = strdup(nonce); if (*digest->request.clientNonce == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.clientNonce); digest->request.clientNonce = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -498,10 +481,8 @@ return EINVAL; } digest->request.digest = strdup(dgst); - if (digest->request.digest == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.digest == NULL) + return krb5_enomem(context); return 0; } @@ -515,10 +496,8 @@ return EINVAL; } digest->request.username = strdup(username); - if (digest->request.username == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.username == NULL) + return krb5_enomem(context); return 0; } @@ -532,16 +511,13 @@ return EINVAL; } digest->request.authid = malloc(sizeof(*digest->request.authid)); - if (digest->request.authid == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.authid == NULL) + return krb5_enomem(context); *digest->request.authid = strdup(authid); if (*digest->request.authid == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.authid); digest->request.authid = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -576,16 +552,13 @@ return EINVAL; } digest->request.realm = malloc(sizeof(*digest->request.realm)); - if (digest->request.realm == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.realm == NULL) + return krb5_enomem(context); *digest->request.realm = strdup(realm); if (*digest->request.realm == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.realm); digest->request.realm = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -601,16 +574,13 @@ return EINVAL; } digest->request.method = malloc(sizeof(*digest->request.method)); - if (digest->request.method == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.method == NULL) + return krb5_enomem(context); *digest->request.method = strdup(method); if (*digest->request.method == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.method); digest->request.method = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -625,16 +595,13 @@ return EINVAL; } digest->request.uri = malloc(sizeof(*digest->request.uri)); - if (digest->request.uri == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.uri == NULL) + return krb5_enomem(context); *digest->request.uri = strdup(uri); if (*digest->request.uri == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.uri); digest->request.uri = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -651,16 +618,13 @@ } digest->request.nonceCount = malloc(sizeof(*digest->request.nonceCount)); - if (digest->request.nonceCount == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.nonceCount == NULL) + return krb5_enomem(context); *digest->request.nonceCount = strdup(nonce_count); if (*digest->request.nonceCount == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.nonceCount); digest->request.nonceCount = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -675,16 +639,13 @@ return EINVAL; } digest->request.qop = malloc(sizeof(*digest->request.qop)); - if (digest->request.qop == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.qop == NULL) + return krb5_enomem(context); *digest->request.qop = strdup(qop); if (*digest->request.qop == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); free(digest->request.qop); digest->request.qop = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -695,10 +656,8 @@ const char *response) { digest->request.responseData = strdup(response); - if (digest->request.responseData == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (digest->request.responseData == NULL) + return krb5_enomem(context); return 0; } @@ -803,8 +762,7 @@ if (*type == NULL || *binding == NULL) { free(*type); free(*binding); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } } else { *type = NULL; @@ -842,10 +800,8 @@ krb5_ntlm *ntlm) { *ntlm = calloc(1, sizeof(**ntlm)); - if (*ntlm == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*ntlm == NULL) + return krb5_enomem(context); return 0; } @@ -933,13 +889,13 @@ } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_ntlm_init_get_challange(krb5_context context, +krb5_ntlm_init_get_challenge(krb5_context context, krb5_ntlm ntlm, - krb5_data *challange) + krb5_data *challenge) { krb5_error_code ret; - ret = der_copy_octet_string(&ntlm->initReply.challange, challange); + ret = der_copy_octet_string(&ntlm->initReply.challenge, challenge); if (ret) krb5_clear_error_message(context); @@ -966,10 +922,8 @@ char **name) { *name = strdup(ntlm->initReply.targetname); - if (*name == NULL) { - krb5_clear_error_message(context); - return ENOMEM; - } + if (*name == NULL) + return krb5_enomem(context); return 0; } @@ -1060,10 +1014,8 @@ const char *username) { ntlm->request.username = strdup(username); - if (ntlm->request.username == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ntlm->request.username == NULL) + return krb5_enomem(context); return 0; } @@ -1073,10 +1025,8 @@ const char *targetname) { ntlm->request.targetname = strdup(targetname); - if (ntlm->request.targetname == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ntlm->request.targetname == NULL) + return krb5_enomem(context); return 0; } @@ -1086,10 +1036,8 @@ void *hash, size_t len) { ntlm->request.lm.data = malloc(len); - if (ntlm->request.lm.data == NULL && len != 0) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ntlm->request.lm.data == NULL && len != 0) + return krb5_enomem(context); ntlm->request.lm.length = len; memcpy(ntlm->request.lm.data, hash, len); return 0; @@ -1101,10 +1049,8 @@ void *hash, size_t len) { ntlm->request.ntlm.data = malloc(len); - if (ntlm->request.ntlm.data == NULL && len != 0) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ntlm->request.ntlm.data == NULL && len != 0) + return krb5_enomem(context); ntlm->request.ntlm.length = len; memcpy(ntlm->request.ntlm.data, hash, len); return 0; @@ -1116,10 +1062,8 @@ krb5_data *opaque) { ntlm->request.opaque.data = malloc(opaque->length); - if (ntlm->request.opaque.data == NULL && opaque->length != 0) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ntlm->request.opaque.data == NULL && opaque->length != 0) + return krb5_enomem(context); ntlm->request.opaque.length = opaque->length; memcpy(ntlm->request.opaque.data, opaque->data, opaque->length); return 0; @@ -1131,15 +1075,11 @@ void *sessionkey, size_t length) { ntlm->request.sessionkey = calloc(1, sizeof(*ntlm->request.sessionkey)); - if (ntlm->request.sessionkey == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ntlm->request.sessionkey == NULL) + return krb5_enomem(context); ntlm->request.sessionkey->data = malloc(length); - if (ntlm->request.sessionkey->data == NULL && length != 0) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ntlm->request.sessionkey->data == NULL && length != 0) + return krb5_enomem(context); memcpy(ntlm->request.sessionkey->data, sessionkey, length); ntlm->request.sessionkey->length = length; return 0; diff --git a/crypto/heimdal/lib/krb5/dll.c b/crypto/heimdal/lib/krb5/dll.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/dll.c @@ -0,0 +1,76 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include + +extern void heim_w32_service_thread_detach(void *); + +HINSTANCE _krb5_hInstance = NULL; + +#if NTDDI_VERSION >= NTDDI_VISTA +extern BOOL WINAPI +_hc_w32crypto_DllMain(HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved); +#endif + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ +#if NTDDI_VERSION >= NTDDI_VISTA + BOOL ret; + + ret = _hc_w32crypto_DllMain(hinstDLL, fdwReason, lpvReserved); + if (!ret) + return ret; +#endif + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + + _krb5_hInstance = hinstDLL; + return TRUE; + + case DLL_PROCESS_DETACH: + return FALSE; + + case DLL_THREAD_ATTACH: + return FALSE; + + case DLL_THREAD_DETACH: + heim_w32_service_thread_detach(NULL); + return FALSE; + } + + return FALSE; +} + diff --git a/crypto/heimdal/lib/krb5/doxygen.c b/crypto/heimdal/lib/krb5/doxygen.c --- a/crypto/heimdal/lib/krb5/doxygen.c +++ b/crypto/heimdal/lib/krb5/doxygen.c @@ -308,8 +308,8 @@ * * In this case, mutual authentication will be tried. That means that the server * will authenticate to the client. Using mutual authentication - * is good since it enables the user to verify that they are talking to the - * right server (a server that knows the key). + * is required to avoid man-in-the-middle attacks, since it enables the user to + * verify that they are talking to the right server (a server that knows the key). * * If you are using a non-blocking socket you will need to do all work of * krb5_sendauth() yourself. Basically you need to send over the diff --git a/crypto/heimdal/lib/krb5/enomem.c b/crypto/heimdal/lib/krb5/enomem.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/enomem.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + +#undef krb5_enomem +krb5_error_code +krb5_enomem(krb5_context context) +{ + krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); + return ENOMEM; +} diff --git a/crypto/heimdal/lib/krb5/error_string.c b/crypto/heimdal/lib/krb5/error_string.c --- a/crypto/heimdal/lib/krb5/error_string.c +++ b/crypto/heimdal/lib/krb5/error_string.c @@ -47,12 +47,12 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_message(krb5_context context) { - HEIMDAL_MUTEX_lock(context->mutex); + HEIMDAL_MUTEX_lock(&context->mutex); if (context->error_string) free(context->error_string); context->error_code = 0; context->error_string = NULL; - HEIMDAL_MUTEX_unlock(context->mutex); + HEIMDAL_MUTEX_unlock(&context->mutex); } /** @@ -72,7 +72,7 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_error_message(krb5_context context, krb5_error_code ret, const char *fmt, ...) - __attribute__ ((format (printf, 3, 4))) + __attribute__ ((__format__ (__printf__, 3, 4))) { va_list ap; @@ -98,14 +98,14 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vset_error_message (krb5_context context, krb5_error_code ret, const char *fmt, va_list args) - __attribute__ ((format (printf, 3, 0))) + __attribute__ ((__format__ (__printf__, 3, 0))) { int r; if (context == NULL) return; - HEIMDAL_MUTEX_lock(context->mutex); + HEIMDAL_MUTEX_lock(&context->mutex); if (context->error_string) { free(context->error_string); context->error_string = NULL; @@ -114,7 +114,9 @@ r = vasprintf(&context->error_string, fmt, args); if (r < 0) context->error_string = NULL; - HEIMDAL_MUTEX_unlock(context->mutex); + HEIMDAL_MUTEX_unlock(&context->mutex); + if (context->error_string) + _krb5_debug(context, 100, "error message: %s: %d", context->error_string, ret); } /** @@ -134,7 +136,7 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_prepend_error_message(krb5_context context, krb5_error_code ret, const char *fmt, ...) - __attribute__ ((format (printf, 3, 4))) + __attribute__ ((__format__ (__printf__, 3, 4))) { va_list ap; @@ -159,20 +161,20 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vprepend_error_message(krb5_context context, krb5_error_code ret, const char *fmt, va_list args) - __attribute__ ((format (printf, 3, 0))) + __attribute__ ((__format__ (__printf__, 3, 0))) { char *str = NULL, *str2 = NULL; if (context == NULL) return; - HEIMDAL_MUTEX_lock(context->mutex); + HEIMDAL_MUTEX_lock(&context->mutex); if (context->error_code != ret) { - HEIMDAL_MUTEX_unlock(context->mutex); + HEIMDAL_MUTEX_unlock(&context->mutex); return; } if (vasprintf(&str, fmt, args) < 0 || str == NULL) { - HEIMDAL_MUTEX_unlock(context->mutex); + HEIMDAL_MUTEX_unlock(&context->mutex); return; } if (context->error_string) { @@ -187,42 +189,7 @@ free(str); } else context->error_string = str; - HEIMDAL_MUTEX_unlock(context->mutex); -} - - -/** - * Return the error message in context. On error or no error string, - * the function returns NULL. - * - * @param context Kerberos 5 context - * - * @return an error string, needs to be freed with - * krb5_free_error_message(). The functions return NULL on error. - * - * @ingroup krb5_error - */ - -KRB5_LIB_FUNCTION char * KRB5_LIB_CALL -krb5_get_error_string(krb5_context context) -{ - char *ret = NULL; - - HEIMDAL_MUTEX_lock(context->mutex); - if (context->error_string) - ret = strdup(context->error_string); - HEIMDAL_MUTEX_unlock(context->mutex); - return ret; -} - -KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL -krb5_have_error_string(krb5_context context) -{ - char *str; - HEIMDAL_MUTEX_lock(context->mutex); - str = context->error_string; - HEIMDAL_MUTEX_unlock(context->mutex); - return str != NULL; + HEIMDAL_MUTEX_unlock(&context->mutex); } /** @@ -259,13 +226,13 @@ */ if (context) { - HEIMDAL_MUTEX_lock(context->mutex); + HEIMDAL_MUTEX_lock(&context->mutex); if (context->error_string && (code == context->error_code || context->error_code == 0)) { str = strdup(context->error_string); } - HEIMDAL_MUTEX_unlock(context->mutex); + HEIMDAL_MUTEX_unlock(&context->mutex); if (str) return str; @@ -329,7 +296,7 @@ KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_get_err_text(krb5_context context, krb5_error_code code) - KRB5_DEPRECATED_FUNCTION("Use X instead") + KRB5_DEPRECATED_FUNCTION("Use krb5_get_error_message instead") { const char *p = NULL; if(context != NULL) @@ -340,3 +307,4 @@ p = "Unknown error"; return p; } + diff --git a/crypto/heimdal/lib/krb5/expand_hostname.c b/crypto/heimdal/lib/krb5/expand_hostname.c --- a/crypto/heimdal/lib/krb5/expand_hostname.c +++ b/crypto/heimdal/lib/krb5/expand_hostname.c @@ -39,11 +39,8 @@ char **new_hostname) { *new_hostname = strdup (orig_hostname); - if (*new_hostname == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*new_hostname == NULL) + return krb5_enomem(context); strlwr (*new_hostname); return 0; } @@ -84,13 +81,10 @@ if (a->ai_canonname != NULL) { *new_hostname = strdup (a->ai_canonname); freeaddrinfo (ai); - if (*new_hostname == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } else { + if (*new_hostname == NULL) + return krb5_enomem(context); + else return 0; - } } } freeaddrinfo (ai); diff --git a/crypto/heimdal/lib/krb5/expand_path.c b/crypto/heimdal/lib/krb5/expand_path.c --- a/crypto/heimdal/lib/krb5/expand_path.c +++ b/crypto/heimdal/lib/krb5/expand_path.c @@ -32,6 +32,8 @@ #include "krb5_locl.h" +#include + typedef int PTYPE; #ifdef _WIN32 @@ -49,7 +51,7 @@ * temporary directory until the user profile is loaded. In addition, * the returned path may or may not exist. */ -static int +static krb5_error_code _expand_temp_folder(krb5_context context, PTYPE param, const char *postfix, char **ret) { TCHAR tpath[MAX_PATH]; @@ -70,11 +72,8 @@ *ret = strdup(tpath); - if (*ret == NULL) { - if (context) - krb5_set_error_message(context, ENOMEM, "strdup - Out of memory"); - return ENOMEM; - } + if (*ret == NULL) + return krb5_enomem(context); return 0; } @@ -89,7 +88,7 @@ * "bin" directory is considered to be the directory in which the * krb5.dll is located. */ -static int +static krb5_error_code _expand_bin_dir(krb5_context context, PTYPE param, const char *postfix, char **ret) { TCHAR path[MAX_PATH]; @@ -119,7 +118,7 @@ *ret = strdup(path); if (*ret == NULL) - return ENOMEM; + return krb5_enomem(context); return 0; } @@ -139,7 +138,7 @@ * SecurityIdentification level the call will fail. * */ -static int +static krb5_error_code _expand_userid(krb5_context context, PTYPE param, const char *postfix, char **ret) { int rv = EINVAL; @@ -237,7 +236,7 @@ * Expand a folder identified by a CSIDL */ -static int +static krb5_error_code _expand_csidl(krb5_context context, PTYPE folder, const char *postfix, char **ret) { TCHAR path[MAX_PATH]; @@ -255,80 +254,85 @@ path[len - 1] = '\0'; if (postfix && - strlcat(path, postfix, sizeof(path)/sizeof(path[0])) >= sizeof(path)/sizeof(path[0])) { - return ENOMEM; - } + strlcat(path, postfix, sizeof(path)/sizeof(path[0])) >= sizeof(path)/sizeof(path[0])) + return krb5_enomem(context); *ret = strdup(path); - if (*ret == NULL) { - if (context) - krb5_set_error_message(context, ENOMEM, "Out of memory"); - return ENOMEM; - } + if (*ret == NULL) + return krb5_enomem(context); return 0; } #else -static int +static krb5_error_code _expand_path(krb5_context context, PTYPE param, const char *postfix, char **ret) { *ret = strdup(postfix); - if (*ret == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc - out of memory"); - return ENOMEM; - } + if (*ret == NULL) + return krb5_enomem(context); return 0; } -static int +static krb5_error_code _expand_temp_folder(krb5_context context, PTYPE param, const char *postfix, char **ret) { const char *p = NULL; - if (issuid()) + if (!issuid()) p = getenv("TEMP"); + if (p) *ret = strdup(p); else *ret = strdup("/tmp"); if (*ret == NULL) - return ENOMEM; + return krb5_enomem(context); return 0; } -static int +static krb5_error_code _expand_userid(krb5_context context, PTYPE param, const char *postfix, char **str) { int ret = asprintf(str, "%ld", (unsigned long)getuid()); if (ret < 0 || *str == NULL) - return ENOMEM; + return krb5_enomem(context); return 0; } #endif /* _WIN32 */ +/** + * Expand an extra token + */ + +static krb5_error_code +_expand_extra_token(krb5_context context, const char *value, char **ret) +{ + *ret = strdup(value); + if (*ret == NULL) + return krb5_enomem(context); + return 0; +} + /** * Expand a %{null} token * * The expansion of a %{null} token is always the empty string. */ -static int +static krb5_error_code _expand_null(krb5_context context, PTYPE param, const char *postfix, char **ret) { *ret = strdup(""); - if (*ret == NULL) { - if (context) - krb5_set_error_message(context, ENOMEM, "Out of memory"); - return ENOMEM; - } + if (*ret == NULL) + return krb5_enomem(context); return 0; } -static const struct token { +static const struct { const char * tok; int ftype; #define FTYPE_CSIDL 0 @@ -370,13 +374,15 @@ {"null", SPECIAL(_expand_null)} }; -static int +static krb5_error_code _expand_token(krb5_context context, const char *token, const char *token_end, + char **extra_tokens, char **ret) { size_t i; + char **p; *ret = NULL; @@ -387,6 +393,11 @@ return EINVAL; } + for (p = extra_tokens; p && p[0]; p += 2) { + if (strncmp(token+2, p[0], (token_end - token) - 2) == 0) + return _expand_extra_token(context, p[1], ret); + } + for (i = 0; i < sizeof(tokens)/sizeof(tokens[0]); i++) { if (!strncmp(token+2, tokens[i].tok, (token_end - token) - 2)) return tokens[i].exp_func(context, tokens[i].param, @@ -398,14 +409,65 @@ return EINVAL; } +/** + * Internal function to expand tokens in paths. + * + * Inputs: + * + * @context A krb5_context + * @path_in The path to expand tokens from + * + * Outputs: + * + * @ppath_out Path with expanded tokens (caller must free() this) + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_expand_path_tokens(krb5_context context, const char *path_in, + int filepath, char **ppath_out) +{ + return _krb5_expand_path_tokensv(context, path_in, filepath, ppath_out, NULL); +} + +static void +free_extra_tokens(char **extra_tokens) +{ + char **p; + + for (p = extra_tokens; p && *p; p++) + free(*p); + free(extra_tokens); +} + +/** + * Internal function to expand tokens in paths. + * + * Inputs: + * + * @context A krb5_context + * @path_in The path to expand tokens from + * @ppath_out The expanded path + * @... Variable number of pairs of strings, the first of each + * being a token (e.g., "luser") and the second a string to + * replace it with. The list is terminated by a NULL. + * + * Outputs: + * + * @ppath_out Path with expanded tokens (caller must free() this) + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_expand_path_tokensv(krb5_context context, + const char *path_in, + int filepath, + char **ppath_out, ...) { char *tok_begin, *tok_end, *append; + char **extra_tokens = NULL; const char *path_left; + size_t nargs = 0; size_t len = 0; + va_list ap; if (path_in == NULL || *path_in == '\0') { *ppath_out = strdup(""); @@ -414,6 +476,45 @@ *ppath_out = NULL; + va_start(ap, ppath_out); + while (va_arg(ap, const char *)) { + nargs++; + va_arg(ap, const char *); + } + va_end(ap); + nargs *= 2; + + /* Get extra tokens */ + if (nargs) { + size_t i; + + extra_tokens = calloc(nargs + 1, sizeof (*extra_tokens)); + if (extra_tokens == NULL) + return krb5_enomem(context); + va_start(ap, ppath_out); + for (i = 0; i < nargs; i++) { + const char *s = va_arg(ap, const char *); /* token key */ + if (s == NULL) + break; + extra_tokens[i] = strdup(s); + if (extra_tokens[i++] == NULL) { + va_end(ap); + free_extra_tokens(extra_tokens); + return krb5_enomem(context); + } + s = va_arg(ap, const char *); /* token value */ + if (s == NULL) + s = ""; + extra_tokens[i] = strdup(s); + if (extra_tokens[i] == NULL) { + va_end(ap); + free_extra_tokens(extra_tokens); + return krb5_enomem(context); + } + } + va_end(ap); + } + for (path_left = path_in; path_left && *path_left; ) { tok_begin = strstr(path_left, "%{"); @@ -431,6 +532,7 @@ tok_end = strchr(tok_begin, '}'); if (tok_end == NULL) { + free_extra_tokens(extra_tokens); if (*ppath_out) free(*ppath_out); *ppath_out = NULL; @@ -439,7 +541,9 @@ return EINVAL; } - if (_expand_token(context, tok_begin, tok_end, &append)) { + if (_expand_token(context, tok_begin, tok_end, extra_tokens, + &append)) { + free_extra_tokens(extra_tokens); if (*ppath_out) free(*ppath_out); *ppath_out = NULL; @@ -456,12 +560,11 @@ if (append == NULL) { + free_extra_tokens(extra_tokens); if (*ppath_out) free(*ppath_out); *ppath_out = NULL; - if (context) - krb5_set_error_message(context, ENOMEM, "malloc - out of memory"); - return ENOMEM; + return krb5_enomem(context); } @@ -470,13 +573,12 @@ char * new_str = realloc(*ppath_out, len + append_len + 1); if (new_str == NULL) { + free_extra_tokens(extra_tokens); free(append); if (*ppath_out) free(*ppath_out); *ppath_out = NULL; - if (context) - krb5_set_error_message(context, ENOMEM, "malloc - out of memory"); - return ENOMEM; + return krb5_enomem(context); } *ppath_out = new_str; @@ -488,13 +590,15 @@ #ifdef _WIN32 /* Also deal with slashes */ - if (*ppath_out) { + if (filepath && *ppath_out) { char * c; + for (c = *ppath_out; *c; c++) if (*c == '/') *c = '\\'; } #endif + free_extra_tokens(extra_tokens); return 0; } diff --git a/crypto/heimdal/lib/krb5/fast.c b/crypto/heimdal/lib/krb5/fast.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/fast.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2011 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_fast_cf2(krb5_context context, + krb5_keyblock *key1, + const char *pepper1, + krb5_keyblock *key2, + const char *pepper2, + krb5_keyblock *armorkey, + krb5_crypto *armor_crypto) +{ + krb5_crypto crypto1, crypto2; + krb5_data pa1, pa2; + krb5_error_code ret; + + ret = krb5_crypto_init(context, key1, 0, &crypto1); + if (ret) + return ret; + + ret = krb5_crypto_init(context, key2, 0, &crypto2); + if (ret) { + krb5_crypto_destroy(context, crypto1); + return ret; + } + + pa1.data = rk_UNCONST(pepper1); + pa1.length = strlen(pepper1); + pa2.data = rk_UNCONST(pepper2); + pa2.length = strlen(pepper2); + + ret = krb5_crypto_fx_cf2(context, crypto1, crypto2, &pa1, &pa2, + key1->keytype, armorkey); + krb5_crypto_destroy(context, crypto1); + krb5_crypto_destroy(context, crypto2); + if (ret) + return ret; + + if (armor_crypto) { + ret = krb5_crypto_init(context, armorkey, 0, armor_crypto); + if (ret) + krb5_free_keyblock_contents(context, armorkey); + } + + return ret; +} + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_fast_armor_key(krb5_context context, + krb5_keyblock *subkey, + krb5_keyblock *sessionkey, + krb5_keyblock *armorkey, + krb5_crypto *armor_crypto) +{ + return _krb5_fast_cf2(context, + subkey, + "subkeyarmor", + sessionkey, + "ticketarmor", + armorkey, + armor_crypto); +} diff --git a/crypto/heimdal/lib/krb5/fcache.c b/crypto/heimdal/lib/krb5/fcache.c --- a/crypto/heimdal/lib/krb5/fcache.c +++ b/crypto/heimdal/lib/krb5/fcache.c @@ -42,6 +42,8 @@ struct fcc_cursor { int fd; + off_t cred_start; + off_t cred_end; krb5_storage *sp; }; @@ -68,7 +70,7 @@ return FILENAME(id); } -int +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_xlock(krb5_context context, int fd, krb5_boolean exclusive, const char *filename) { @@ -112,7 +114,7 @@ return ret; } -int +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_xunlock(krb5_context context, int fd) { int ret; @@ -223,7 +225,11 @@ return errno; memset(buf, 0, sizeof(buf)); while(pos > 0) { - ssize_t tmp = write(fd, buf, min((off_t)sizeof(buf), pos)); + ssize_t tmp; + size_t wr = sizeof(buf); + if (wr > pos) + wr = (size_t)pos; + tmp = write(fd, buf, wr); if (tmp < 0) return errno; @@ -244,7 +250,7 @@ * hardlink) */ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_erase_file(krb5_context context, const char *filename) { int fd; @@ -255,7 +261,7 @@ if (ret < 0) return errno; - fd = open(filename, O_RDWR | O_BINARY); + fd = open(filename, O_RDWR | O_BINARY | O_CLOEXEC | O_NOFOLLOW); if(fd < 0) { if(errno == ENOENT) return 0; @@ -269,22 +275,27 @@ return ret; } if (unlink(filename) < 0) { + ret = errno; _krb5_xunlock(context, fd); close (fd); - return errno; + krb5_set_error_message(context, errno, + N_("krb5_cc_destroy: unlinking \"%s\": %s", ""), + filename, strerror(ret)); + return ret; } - ret = fstat (fd, &sb2); + ret = fstat(fd, &sb2); if (ret < 0) { + ret = errno; _krb5_xunlock(context, fd); close (fd); - return errno; + return ret; } /* check if someone was playing with symlinks */ if (sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) { _krb5_xunlock(context, fd); - close (fd); + close(fd); return EPERM; } @@ -292,18 +303,18 @@ if (sb2.st_nlink != 0) { _krb5_xunlock(context, fd); - close (fd); + close(fd); return 0; } - ret = scrub_file (fd); + ret = scrub_file(fd); if (ret) { _krb5_xunlock(context, fd); close(fd); return ret; } ret = _krb5_xunlock(context, fd); - close (fd); + close(fd); return ret; } @@ -321,27 +332,29 @@ N_("malloc: out of memory", "")); return KRB5_CC_NOMEM; } - ret = asprintf (&file, "%sXXXXXX", KRB5_DEFAULT_CCFILE_ROOT); + ret = asprintf(&file, "%sXXXXXX", KRB5_DEFAULT_CCFILE_ROOT); if(ret < 0 || file == NULL) { free(f); krb5_set_error_message(context, KRB5_CC_NOMEM, N_("malloc: out of memory", "")); return KRB5_CC_NOMEM; } - ret = _krb5_expand_path_tokens(context, file, &exp_file); + ret = _krb5_expand_path_tokens(context, file, 1, &exp_file); free(file); - if (ret) + if (ret) { + free(f); return ret; + } file = exp_file; fd = mkstemp(exp_file); if(fd < 0) { - int xret = errno; - krb5_set_error_message(context, xret, N_("mkstemp %s failed", ""), exp_file); + ret = (krb5_error_code)errno; + krb5_set_error_message(context, ret, N_("mkstemp %s failed", ""), exp_file); free(f); free(exp_file); - return xret; + return ret; } close(fd); f->filename = exp_file; @@ -379,6 +392,7 @@ static krb5_error_code KRB5_CALLCONV fcc_open(krb5_context context, krb5_ccache id, + const char *operation, int *fd_ret, int flags, mode_t mode) @@ -387,24 +401,132 @@ (flags | O_RDWR) == flags); krb5_error_code ret; const char *filename; + struct stat sb1, sb2; +#ifndef _WIN32 + struct stat sb3; + size_t tries = 3; +#endif + int strict_checking; int fd; + flags |= O_BINARY | O_CLOEXEC | O_NOFOLLOW; + + *fd_ret = -1; + if (FCACHE(id) == NULL) return krb5_einval(context, 2); filename = FILENAME(id); + strict_checking = (flags & O_CREAT) == 0 && + (context->flags & KRB5_CTX_F_FCACHE_STRICT_CHECKING) != 0; + +again: + memset(&sb1, 0, sizeof(sb1)); + ret = lstat(filename, &sb1); + if (ret == 0) { + if (!S_ISREG(sb1.st_mode)) { + krb5_set_error_message(context, EPERM, + N_("Refuses to open symlinks for caches FILE:%s", ""), filename); + return EPERM; + } + } else if (errno != ENOENT || !(flags & O_CREAT)) { + krb5_set_error_message(context, errno, N_("%s lstat(%s)", "file, error"), + operation, filename); + return errno; + } + fd = open(filename, flags, mode); if(fd < 0) { char buf[128]; ret = errno; rk_strerror_r(ret, buf, sizeof(buf)); - krb5_set_error_message(context, ret, N_("open(%s): %s", "file, error"), - filename, buf); + krb5_set_error_message(context, ret, N_("%s open(%s): %s", "file, error"), + operation, filename, buf); return ret; } rk_cloexec(fd); + ret = fstat(fd, &sb2); + if (ret < 0) { + krb5_clear_error_message(context); + close(fd); + return errno; + } + + if (!S_ISREG(sb2.st_mode)) { + krb5_set_error_message(context, EPERM, N_("Refuses to open non files caches: FILE:%s", ""), filename); + close(fd); + return EPERM; + } + +#ifndef _WIN32 + if (sb1.st_dev && sb1.st_ino && + (sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino)) { + /* + * Perhaps we raced with a rename(). To complain about + * symlinks in that case would cause unnecessary concern, so + * we check for that possibility and loop. This has no + * TOCTOU problems because we redo the open(). We could also + * not do any of this checking if O_NOFOLLOW != 0... + */ + close(fd); + ret = lstat(filename, &sb3); + if (ret || sb1.st_dev != sb2.st_dev || + sb3.st_dev != sb2.st_dev || sb3.st_ino != sb2.st_ino) { + krb5_set_error_message(context, EPERM, N_("Refuses to open possible symlink for caches: FILE:%s", ""), filename); + return EPERM; + } + if (--tries == 0) { + krb5_set_error_message(context, EPERM, N_("Raced too many times with renames of FILE:%s", ""), filename); + return EPERM; + } + goto again; + } +#endif + + /* + * /tmp (or wherever default ccaches go) might not be on its own + * filesystem, or on a filesystem different /etc, say, and even if + * it were, suppose a user hard-links another's ccache to her + * default ccache, then runs a set-uid program that will user her + * default ccache (even if it ignores KRB5CCNAME)... + * + * Default ccache locations should really be on per-user non-tmp + * locations on tmpfs "run" directories. But we don't know here + * that this is the case. Thus: no hard-links, no symlinks. + */ + if (sb2.st_nlink != 1) { + krb5_set_error_message(context, EPERM, N_("Refuses to open hardlinks for caches FILE:%s", ""), filename); + close(fd); + return EPERM; + } + + if (strict_checking) { +#ifndef _WIN32 + /* + * XXX WIN32: Needs to have ACL checking code! + * st_mode comes out as 100666, and st_uid is no use. + */ + /* + * XXX Should probably add options to improve control over this + * check. We might want strict checking of everything except + * this. + */ + if (sb2.st_uid != geteuid()) { + krb5_set_error_message(context, EPERM, N_("Refuses to open cache files not own by myself FILE:%s (owned by %d)", ""), filename, (int)sb2.st_uid); + close(fd); + return EPERM; + } + if ((sb2.st_mode & 077) != 0) { + krb5_set_error_message(context, EPERM, + N_("Refuses to open group/other readable files FILE:%s", ""), filename); + close(fd); + return EPERM; + } +#endif + } + if((ret = fcc_lock(context, id, fd, exclusive)) != 0) { close(fd); return ret; @@ -427,7 +549,7 @@ unlink (f->filename); - ret = fcc_open(context, id, &fd, O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_CLOEXEC, 0600); + ret = fcc_open(context, id, "initialize", &fd, O_RDWR | O_CREAT | O_EXCL, 0600); if(ret) return ret; { @@ -465,8 +587,8 @@ char buf[128]; ret = errno; rk_strerror_r(ret, buf, sizeof(buf)); - krb5_set_error_message (context, ret, N_("close %s: %s", ""), - FILENAME(id), buf); + krb5_set_error_message(context, ret, N_("close %s: %s", ""), + FILENAME(id), buf); } return ret; } @@ -490,8 +612,7 @@ if (FCACHE(id) == NULL) return krb5_einval(context, 2); - _krb5_erase_file(context, FILENAME(id)); - return 0; + return _krb5_erase_file(context, FILENAME(id)); } static krb5_error_code KRB5_CALLCONV @@ -502,7 +623,7 @@ int ret; int fd; - ret = fcc_open(context, id, &fd, O_WRONLY | O_APPEND | O_BINARY | O_CLOEXEC, 0); + ret = fcc_open(context, id, "store", &fd, O_WRONLY | O_APPEND, 0); if(ret) return ret; { @@ -511,11 +632,6 @@ sp = krb5_storage_emem(); krb5_storage_set_eof_code(sp, KRB5_CC_END); storage_set_flags(context, sp, FCACHE(id)->version); - if (!krb5_config_get_bool_default(context, NULL, TRUE, - "libdefaults", - "fcc-mit-ticketflags", - NULL)) - krb5_storage_set_flags(sp, KRB5_STORAGE_CREDS_FLAGS_WRONG_BITORDER); ret = krb5_store_creds(sp, creds); if (ret == 0) ret = write_storage(context, sp, fd); @@ -525,31 +641,34 @@ if (close(fd) < 0) { if (ret == 0) { char buf[128]; - rk_strerror_r(ret, buf, sizeof(buf)); ret = errno; - krb5_set_error_message (context, ret, N_("close %s: %s", ""), - FILENAME(id), buf); + rk_strerror_r(ret, buf, sizeof(buf)); + krb5_set_error_message(context, ret, N_("close %s: %s", ""), + FILENAME(id), buf); } } return ret; } static krb5_error_code -init_fcc (krb5_context context, - krb5_ccache id, - krb5_storage **ret_sp, - int *ret_fd, - krb5_deltat *kdc_offset) +init_fcc(krb5_context context, + krb5_ccache id, + const char *operation, + krb5_storage **ret_sp, + int *ret_fd, + krb5_deltat *kdc_offset) { int fd; int8_t pvno, tag; krb5_storage *sp; krb5_error_code ret; + *ret_fd = -1; + *ret_sp = NULL; if (kdc_offset) *kdc_offset = 0; - ret = fcc_open(context, id, &fd, O_RDONLY | O_BINARY | O_CLOEXEC, 0); + ret = fcc_open(context, id, operation, &fd, O_RDONLY, 0); if(ret) return ret; @@ -561,7 +680,7 @@ } krb5_storage_set_eof_code(sp, KRB5_CC_END); ret = krb5_ret_int8(sp, &pvno); - if(ret != 0) { + if (ret != 0) { if(ret == KRB5_CC_END) { ret = ENOENT; krb5_set_error_message(context, ret, @@ -573,7 +692,7 @@ FILENAME(id)); goto out; } - if(pvno != 5) { + if (pvno != 5) { ret = KRB5_CCACHE_BADVNO; krb5_set_error_message(context, ret, N_("Bad version number in credential " "cache file: %s", ""), @@ -581,7 +700,7 @@ goto out; } ret = krb5_ret_int8(sp, &tag); /* should not be host byte order */ - if(ret != 0) { + if (ret != 0) { ret = KRB5_CC_FORMAT; krb5_set_error_message(context, ret, "Error reading tag in " "cache file: %s", FILENAME(id)); @@ -693,7 +812,7 @@ int fd; krb5_storage *sp; - ret = init_fcc (context, id, &sp, &fd, NULL); + ret = init_fcc (context, id, "get-principal", &sp, &fd, NULL); if (ret) return ret; ret = krb5_ret_principal(sp, principal); @@ -728,8 +847,8 @@ } memset(*cursor, 0, sizeof(struct fcc_cursor)); - ret = init_fcc (context, id, &FCC_CURSOR(*cursor)->sp, - &FCC_CURSOR(*cursor)->fd, NULL); + ret = init_fcc(context, id, "get-frist", &FCC_CURSOR(*cursor)->sp, + &FCC_CURSOR(*cursor)->fd, NULL); if (ret) { free(*cursor); *cursor = NULL; @@ -762,11 +881,16 @@ if((ret = fcc_lock(context, id, FCC_CURSOR(*cursor)->fd, FALSE)) != 0) return ret; + FCC_CURSOR(*cursor)->cred_start = lseek(FCC_CURSOR(*cursor)->fd, + 0, SEEK_CUR); ret = krb5_ret_creds(FCC_CURSOR(*cursor)->sp, creds); if (ret) krb5_clear_error_message(context); + FCC_CURSOR(*cursor)->cred_end = lseek(FCC_CURSOR(*cursor)->fd, + 0, SEEK_CUR); + fcc_unlock(context, FCC_CURSOR(*cursor)->fd); return ret; } @@ -790,72 +914,158 @@ return 0; } -static krb5_error_code KRB5_CALLCONV -fcc_remove_cred(krb5_context context, - krb5_ccache id, - krb5_flags which, - krb5_creds *cred) +static void KRB5_CALLCONV +cred_delete(krb5_context context, + krb5_ccache id, + krb5_cc_cursor *cursor, + krb5_creds *cred) { krb5_error_code ret; - krb5_ccache copy, newfile; - char *newname = NULL; - int fd; + krb5_storage *sp; + krb5_data orig_cred_data; + unsigned char *cred_data_in_file = NULL; + off_t new_cred_sz; + struct stat sb1, sb2; + int fd = -1; + ssize_t bytes; + krb5_const_realm srealm = krb5_principal_get_realm(context, cred->server); - if (FCACHE(id) == NULL) - return krb5_einval(context, 2); + /* This is best-effort code; if we lose track of errors here it's OK */ + + heim_assert(FCC_CURSOR(*cursor)->cred_start < FCC_CURSOR(*cursor)->cred_end, + "fcache internal error"); + + krb5_data_zero(&orig_cred_data); + + sp = krb5_storage_emem(); + if (sp == NULL) + return; + krb5_storage_set_eof_code(sp, KRB5_CC_END); + storage_set_flags(context, sp, FCACHE(id)->version); - ret = krb5_cc_new_unique(context, krb5_cc_type_memory, NULL, ©); + /* Get a copy of what the cred should look like in the file; see below */ + ret = krb5_store_creds(sp, cred); if (ret) - return ret; + goto out; - ret = krb5_cc_copy_cache(context, id, copy); - if (ret) { - krb5_cc_destroy(context, copy); - return ret; - } + ret = krb5_storage_to_data(sp, &orig_cred_data); + if (ret) + goto out; + krb5_storage_free(sp); - ret = krb5_cc_remove_cred(context, copy, which, cred); - if (ret) { - krb5_cc_destroy(context, copy); - return ret; - } + cred_data_in_file = malloc(orig_cred_data.length); + if (cred_data_in_file == NULL) + goto out; - ret = asprintf(&newname, "FILE:%s.XXXXXX", FILENAME(id)); - if (ret < 0 || newname == NULL) { - krb5_cc_destroy(context, copy); - return ENOMEM; - } + /* + * Mark the cred expired; krb5_cc_retrieve_cred() callers should use + * KRB5_TC_MATCH_TIMES, so this should be good enough... + */ + cred->times.endtime = 0; - fd = mkstemp(&newname[5]); - if (fd < 0) { - ret = errno; - krb5_cc_destroy(context, copy); - return ret; + /* ...except for config creds because we don't check their endtimes */ + if (srealm && strcmp(srealm, "X-CACHECONF:") == 0) { + ret = krb5_principal_set_realm(context, cred->server, "X-RMED-CONF:"); + if (ret) + goto out; } - close(fd); - ret = krb5_cc_resolve(context, newname, &newfile); - if (ret) { - unlink(&newname[5]); - free(newname); - krb5_cc_destroy(context, copy); - return ret; - } + sp = krb5_storage_emem(); + if (sp == NULL) + goto out; + krb5_storage_set_eof_code(sp, KRB5_CC_END); + storage_set_flags(context, sp, FCACHE(id)->version); - ret = krb5_cc_copy_cache(context, copy, newfile); - krb5_cc_destroy(context, copy); - if (ret) { - free(newname); - krb5_cc_destroy(context, newfile); - return ret; + ret = krb5_store_creds(sp, cred); + + /* The new cred must be the same size as the old cred */ + new_cred_sz = krb5_storage_seek(sp, 0, SEEK_END); + if (new_cred_sz != orig_cred_data.length || new_cred_sz != + (FCC_CURSOR(*cursor)->cred_end - FCC_CURSOR(*cursor)->cred_start)) { + /* XXX This really can't happen. Assert like above? */ + krb5_set_error_message(context, EINVAL, + N_("Credential deletion failed on ccache " + "FILE:%s: new credential size did not " + "match old credential size", ""), + FILENAME(id)); + goto out; } - ret = rk_rename(&newname[5], FILENAME(id)); + ret = fcc_open(context, id, "remove_cred", &fd, O_RDWR, 0); if (ret) - ret = errno; - free(newname); - krb5_cc_close(context, newfile); + goto out; + + /* + * Check that we're updating the same file where we got the + * cred's offset, else we'd be corrupting a new ccache. + */ + if (fstat(FCC_CURSOR(*cursor)->fd, &sb1) == -1 || + fstat(fd, &sb2) == -1) + goto out; + if (sb1.st_dev != sb2.st_dev || sb1.st_ino != sb2.st_ino) + goto out; + + /* + * Make sure what we overwrite is what we expected. + * + * FIXME: We *really* need the ccache v4 tag for ccache ID. This + * check that we're only overwriting something that looks exactly + * like what we want to is probably good enough in practice, but + * it's not guaranteed to work. + */ + if (lseek(fd, FCC_CURSOR(*cursor)->cred_start, SEEK_SET) == (off_t)-1) + goto out; + bytes = read(fd, cred_data_in_file, orig_cred_data.length); + if (bytes != orig_cred_data.length) + goto out; + if (memcmp(orig_cred_data.data, cred_data_in_file, bytes) != 0) + goto out; + if (lseek(fd, FCC_CURSOR(*cursor)->cred_start, SEEK_SET) == (off_t)-1) + goto out; + ret = write_storage(context, sp, fd); +out: + if (fd > -1) { + fcc_unlock(context, fd); + if (close(fd) < 0 && ret == 0) { + krb5_set_error_message(context, errno, N_("close %s", ""), + FILENAME(id)); + } + } + krb5_data_free(&orig_cred_data); + free(cred_data_in_file); + krb5_storage_free(sp); + return; +} + +static krb5_error_code KRB5_CALLCONV +fcc_remove_cred(krb5_context context, + krb5_ccache id, + krb5_flags which, + krb5_creds *mcred) +{ + krb5_error_code ret, ret2; + krb5_cc_cursor cursor; + krb5_creds found_cred; + + if (FCACHE(id) == NULL) + return krb5_einval(context, 2); + ret = krb5_cc_start_seq_get(context, id, &cursor); + if (ret) + return ret; + while ((ret = krb5_cc_next_cred(context, id, &cursor, &found_cred)) == 0) { + if (!krb5_compare_creds(context, which, mcred, &found_cred)) { + krb5_free_cred_contents(context, &found_cred); + continue; + } + cred_delete(context, id, &cursor, &found_cred); + krb5_free_cred_contents(context, &found_cred); + } + ret2 = krb5_cc_end_seq_get(context, id, &cursor); + if (ret == 0) + return ret2; + if (ret == KRB5_CC_END) + return 0; return ret; } @@ -904,8 +1114,8 @@ { struct fcache_iter *iter = cursor; krb5_error_code ret; - const char *fn; - char *expandedfn = NULL; + const char *fn, *cc_type; + krb5_ccache cc; if (iter == NULL) return krb5_einval(context, 2); @@ -916,30 +1126,26 @@ } iter->first = 0; + /* + * Note: do not allow krb5_cc_default_name() to recurse via + * krb5_cc_cache_match(). + * Note that context->default_cc_name will be NULL even though + * KRB5CCNAME is set in the environment if + * krb5_cc_set_default_name() hasn't + */ fn = krb5_cc_default_name(context); - if (fn == NULL || strncasecmp(fn, "FILE:", 5) != 0) { - ret = _krb5_expand_default_cc_name(context, - KRB5_DEFAULT_CCNAME_FILE, - &expandedfn); - if (ret) - return ret; - fn = expandedfn; - } - /* check if file exists, don't return a non existant "next" */ - if (strncasecmp(fn, "FILE:", 5) == 0) { - struct stat sb; - ret = stat(fn + 5, &sb); - if (ret) { - ret = KRB5_CC_END; - goto out; - } + ret = krb5_cc_resolve(context, fn, &cc); + if (ret != 0) + return ret; + cc_type = krb5_cc_get_type(context, cc); + if (strcmp(cc_type, "FILE") != 0) { + krb5_cc_close(context, cc); + return KRB5_CC_END; } - ret = krb5_cc_resolve(context, fn, id); - out: - if (expandedfn) - free(expandedfn); - return ret; + *id = cc; + + return 0; } static krb5_error_code KRB5_CALLCONV @@ -976,14 +1182,14 @@ int fd1, fd2; char buf[BUFSIZ]; - ret = fcc_open(context, from, &fd1, O_RDONLY | O_BINARY | O_CLOEXEC, 0); + ret = fcc_open(context, from, "move/from", &fd1, O_RDONLY, 0); if(ret) return ret; unlink(FILENAME(to)); - ret = fcc_open(context, to, &fd2, - O_WRONLY | O_CREAT | O_EXCL | O_BINARY | O_CLOEXEC, 0600); + ret = fcc_open(context, to, "move/to", &fd2, + O_WRONLY | O_CREAT | O_EXCL, 0600); if(ret) goto out1; @@ -1024,7 +1230,7 @@ { krb5_storage *sp; int fd; - if ((ret = init_fcc (context, to, &sp, &fd, NULL)) == 0) { + if ((ret = init_fcc (context, to, "move", &sp, &fd, NULL)) == 0) { if (sp) krb5_storage_free(sp); fcc_unlock(context, fd); @@ -1052,7 +1258,7 @@ struct stat sb; int fd; - ret = fcc_open(context, id, &fd, O_RDONLY | O_BINARY | O_CLOEXEC, 0); + ret = fcc_open(context, id, "lastchange", &fd, O_RDONLY, 0); if(ret) return ret; ret = fstat(fd, &sb); @@ -1078,7 +1284,7 @@ krb5_error_code ret; krb5_storage *sp = NULL; int fd; - ret = init_fcc(context, id, &sp, &fd, kdc_offset); + ret = init_fcc(context, id, "get-kdc-offset", &sp, &fd, kdc_offset); if (sp) krb5_storage_free(sp); fcc_unlock(context, fd); diff --git a/crypto/heimdal/lib/krb5/generate_subkey.c b/crypto/heimdal/lib/krb5/generate_subkey.c --- a/crypto/heimdal/lib/krb5/generate_subkey.c +++ b/crypto/heimdal/lib/krb5/generate_subkey.c @@ -55,12 +55,10 @@ krb5_error_code ret; ALLOC(*subkey, 1); - if (*subkey == NULL) { - krb5_set_error_message(context, ENOMEM,N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*subkey == NULL) + return krb5_enomem(context); - if (etype == ETYPE_NULL) + if (etype == (krb5_enctype)ETYPE_NULL) etype = key->keytype; /* use session key etype */ /* XXX should we use the session key as input to the RF? */ diff --git a/crypto/heimdal/lib/krb5/get_addrs.c b/crypto/heimdal/lib/krb5/get_addrs.c --- a/crypto/heimdal/lib/krb5/get_addrs.c +++ b/crypto/heimdal/lib/krb5/get_addrs.c @@ -64,10 +64,8 @@ } res->len = 1; res->val = malloc (sizeof(*res->val)); - if (res->val == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (res->val == NULL) + return krb5_enomem(context); res->val[0].addr_type = hostent->h_addrtype; res->val[0].address.data = NULL; res->val[0].address.length = 0; @@ -130,10 +128,10 @@ /* Allocate storage for them. */ res->val = calloc(num, sizeof(*res->val)); if (res->val == NULL) { - krb5_free_addresses(context, &ignore_addresses); + if (flags & EXTRA_ADDRESSES) + krb5_free_addresses(context, &ignore_addresses); freeifaddrs(ifa0); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } /* Now traverse the list. */ diff --git a/crypto/heimdal/lib/krb5/get_cred.c b/crypto/heimdal/lib/krb5/get_cred.c --- a/crypto/heimdal/lib/krb5/get_cred.c +++ b/crypto/heimdal/lib/krb5/get_cred.c @@ -105,9 +105,7 @@ ALLOC(req_body->enc_authorization_data, 1); if (req_body->enc_authorization_data == NULL) { free (buf); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } ret = krb5_crypto_init(context, subkey, 0, &crypto); if (ret) { @@ -159,9 +157,7 @@ if (in_creds->session.keytype) { ALLOC_SEQ(&t->req_body.etype, 1); if(t->req_body.etype.val == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } t->req_body.etype.val[0] = in_creds->session.keytype; @@ -176,13 +172,15 @@ goto fail; t->req_body.addresses = addresses; t->req_body.kdc_options = flags.b; + t->req_body.kdc_options.forwardable = krbtgt->flags.b.forwardable; + t->req_body.kdc_options.renewable = krbtgt->flags.b.renewable; + t->req_body.kdc_options.proxiable = krbtgt->flags.b.proxiable; ret = copy_Realm(&in_creds->server->realm, &t->req_body.realm); if (ret) goto fail; ALLOC(t->req_body.sname, 1); if (t->req_body.sname == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } @@ -193,30 +191,43 @@ if (ret) goto fail; + if (krbtgt->times.starttime) { + ALLOC(t->req_body.from, 1); + if(t->req_body.from == NULL){ + ret = krb5_enomem(context); + goto fail; + } + *t->req_body.from = in_creds->times.starttime; + } + /* req_body.till should be NULL if there is no endtime specified, but old MIT code (like DCE secd) doesn't like that */ ALLOC(t->req_body.till, 1); if(t->req_body.till == NULL){ - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } *t->req_body.till = in_creds->times.endtime; + if (t->req_body.kdc_options.renewable && krbtgt->times.renew_till) { + ALLOC(t->req_body.rtime, 1); + if(t->req_body.rtime == NULL){ + ret = krb5_enomem(context); + goto fail; + } + *t->req_body.rtime = in_creds->times.renew_till; + } + t->req_body.nonce = nonce; if(second_ticket){ ALLOC(t->req_body.additional_tickets, 1); if (t->req_body.additional_tickets == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } ALLOC_SEQ(t->req_body.additional_tickets, 1); if (t->req_body.additional_tickets->val == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } ret = copy_Ticket(second_ticket, t->req_body.additional_tickets->val); @@ -225,14 +236,12 @@ } ALLOC(t->padata, 1); if (t->padata == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } ALLOC_SEQ(t->padata, 1 + padata->len); if (t->padata->val == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } { @@ -282,7 +291,7 @@ return ret; } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_get_krbtgt(krb5_context context, krb5_ccache id, krb5_realm realm, @@ -307,8 +316,13 @@ krb5_free_principal(context, tmp_cred.client); return ret; } + /* + * The forwardable TGT might not be the start TGT, in which case, it is + * generally, but not always already cached. Just in case, get it again if + * lost. + */ ret = krb5_get_credentials(context, - KRB5_GC_CACHED, + 0, id, &tmp_cred, cred); @@ -406,7 +420,7 @@ TGS_REQ req; krb5_data enc; krb5_data resp; - krb5_kdc_rep rep; + krb5_kdc_rep rep = {0}; KRB_ERROR error; krb5_error_code ret; unsigned nonce; @@ -526,7 +540,6 @@ if(ret) goto out; - memset(&rep, 0, sizeof(rep)); if(decode_TGS_REP(resp.data, resp.length, &rep.kdc_rep, &len) == 0) { unsigned eflags = 0; @@ -544,8 +557,10 @@ out_creds->times.endtime = in_creds->times.endtime; /* XXX should do better testing */ - if (flags.b.constrained_delegation || impersonate_principal) + if (flags.b.cname_in_addl_tkt || impersonate_principal) eflags |= EXTRACT_TICKET_ALLOW_CNAME_MISMATCH; + if (flags.b.request_anonymous) + eflags |= EXTRACT_TICKET_MATCH_ANON; ret = _krb5_extract_ticket(context, &rep, @@ -556,6 +571,7 @@ &krbtgt->addresses, nonce, eflags, + NULL, decrypt_tkt_with_subkey, subkey); out2: @@ -642,11 +658,8 @@ krb5_creds *krbtgt; *out_creds = calloc(1, sizeof(**out_creds)); - if(*out_creds == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if(*out_creds == NULL) + return krb5_enomem(context); ret = _krb5_get_krbtgt (context, id, in_creds->server->realm, @@ -670,15 +683,16 @@ not_found(krb5_context context, krb5_const_principal p, krb5_error_code code) { krb5_error_code ret; + const char *err; char *str; + err = krb5_get_error_message(context, code); ret = krb5_unparse_name(context, p, &str); if(ret) { krb5_clear_error_message(context); return code; } - krb5_set_error_message(context, code, - N_("Matching credential (%s) not found", ""), str); + krb5_set_error_message(context, code, N_("%s (%s)", ""), err, str); free(str); return code; } @@ -695,7 +709,10 @@ krb5_cc_clear_mcred(&mcreds); mcreds.server = server; - ret = krb5_cc_retrieve_cred(context, id, KRB5_TC_DONT_MATCH_REALM, + krb5_timeofday(context, &mcreds.times.endtime); + ret = krb5_cc_retrieve_cred(context, id, + KRB5_TC_DONT_MATCH_REALM | + KRB5_TC_MATCH_TIMES, &mcreds, out_creds); if(ret == 0) return 0; @@ -719,11 +736,8 @@ for(i = 0; tmp && tmp[i]; i++); /* XXX */ tmp = realloc(tmp, (i+2)*sizeof(*tmp)); - if(tmp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if(tmp == NULL) + return krb5_enomem(context); *tgts = tmp; ret = krb5_copy_creds(context, tkt, &tmp[i]); tmp[i+1] = NULL; @@ -742,18 +756,22 @@ krb5_creds ***ret_tgts) { krb5_error_code ret; - krb5_creds *tgt, tmp_creds; + krb5_creds *tgt = NULL; + krb5_creds tmp_creds; krb5_const_realm client_realm, server_realm; int ok_as_delegate = 1; - *out_creds = NULL; + *out_creds = calloc(1, sizeof(**out_creds)); + if (*out_creds == NULL) + return krb5_enomem(context); + + memset(&tmp_creds, 0, sizeof(tmp_creds)); client_realm = krb5_principal_get_realm(context, in_creds->client); server_realm = krb5_principal_get_realm(context, in_creds->server); - memset(&tmp_creds, 0, sizeof(tmp_creds)); ret = krb5_copy_principal(context, in_creds->client, &tmp_creds.client); - if(ret) - return ret; + if (ret) + goto out; ret = krb5_make_principal(context, &tmp_creds.server, @@ -761,57 +779,66 @@ KRB5_TGS_NAME, server_realm, NULL); - if(ret){ - krb5_free_principal(context, tmp_creds.client); - return ret; - } + if (ret) + goto out; + { krb5_creds tgts; + /* + * If we have krbtgt/server_realm@try_realm cached, use it and we're + * done. + */ ret = find_cred(context, ccache, tmp_creds.server, *ret_tgts, &tgts); - if(ret == 0){ + if (ret == 0) { /* only allow implicit ok_as_delegate if the realm is the clients realm */ - if (strcmp(try_realm, client_realm) != 0 || strcmp(try_realm, server_realm) != 0) + if (strcmp(try_realm, client_realm) != 0 + || strcmp(try_realm, server_realm) != 0) { ok_as_delegate = tgts.flags.b.ok_as_delegate; + } - *out_creds = calloc(1, sizeof(**out_creds)); - if(*out_creds == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); - } else { - ret = get_cred_kdc_address(context, ccache, flags, NULL, - in_creds, &tgts, - impersonate_principal, - second_ticket, - *out_creds); - if (ret) { - free (*out_creds); - *out_creds = NULL; - } else if (ok_as_delegate == 0) - (*out_creds)->flags.b.ok_as_delegate = 0; + ret = get_cred_kdc_address(context, ccache, flags, NULL, + in_creds, &tgts, + impersonate_principal, + second_ticket, + *out_creds); + krb5_free_cred_contents(context, &tgts); + if (ret == 0 && + !krb5_principal_compare(context, in_creds->server, + (*out_creds)->server)) { + ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; } - krb5_free_cred_contents(context, &tgts); - krb5_free_principal(context, tmp_creds.server); - krb5_free_principal(context, tmp_creds.client); - return ret; + if (ret == 0 && ok_as_delegate == 0) + (*out_creds)->flags.b.ok_as_delegate = 0; + + goto out; } } - if(krb5_realm_compare(context, in_creds->client, in_creds->server)) - return not_found(context, in_creds->server, KRB5_CC_NOTFOUND); - /* XXX this can loop forever */ - while(1){ + if (krb5_realm_compare(context, in_creds->client, in_creds->server)) { + ret = not_found(context, in_creds->server, KRB5_CC_NOTFOUND); + goto out; + } + + /* + * XXX This can loop forever, plus we recurse, so we can't just keep a + * count here. The count would have to get passed around by reference. + * + * The KDCs check for transit loops for us, and capath data is finite, so + * in fact we'll fall out of this loop at some point. We should do our own + * transit loop checking (like get_cred_kdc_referral()), and we should + * impose a max number of iterations altogether. But barring malicious or + * broken KDCs, this is good enough. + */ + while (1) { heim_general_string tgt_inst; ret = get_cred_kdc_capath(context, flags, ccache, &tmp_creds, NULL, NULL, &tgt, ret_tgts); - if(ret) { - krb5_free_principal(context, tmp_creds.server); - krb5_free_principal(context, tmp_creds.client); - return ret; - } + if (ret) + goto out; + /* * if either of the chain or the ok_as_delegate was stripped * by the kdc, make sure we strip it too. @@ -822,47 +849,46 @@ } ret = add_cred(context, tgt, ret_tgts); - if(ret) { - krb5_free_principal(context, tmp_creds.server); - krb5_free_principal(context, tmp_creds.client); - return ret; - } + if (ret) + goto out; tgt_inst = tgt->server->name.name_string.val[1]; - if(strcmp(tgt_inst, server_realm) == 0) + if (strcmp(tgt_inst, server_realm) == 0) break; krb5_free_principal(context, tmp_creds.server); tmp_creds.server = NULL; ret = krb5_make_principal(context, &tmp_creds.server, tgt_inst, KRB5_TGS_NAME, server_realm, NULL); - if(ret) { - krb5_free_principal(context, tmp_creds.server); - krb5_free_principal(context, tmp_creds.client); - return ret; - } + if (ret) + goto out; ret = krb5_free_creds(context, tgt); - if(ret) { - krb5_free_principal(context, tmp_creds.server); - krb5_free_principal(context, tmp_creds.client); - return ret; - } + tgt = NULL; + if (ret) + goto out; } - krb5_free_principal(context, tmp_creds.server); - krb5_free_principal(context, tmp_creds.client); - *out_creds = calloc(1, sizeof(**out_creds)); - if(*out_creds == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); - } else { - ret = get_cred_kdc_address (context, ccache, flags, NULL, - in_creds, tgt, impersonate_principal, - second_ticket, *out_creds); - if (ret) { - free (*out_creds); - *out_creds = NULL; - } + ret = get_cred_kdc_address(context, ccache, flags, NULL, + in_creds, tgt, impersonate_principal, + second_ticket, *out_creds); + if (ret == 0 && + !krb5_principal_compare(context, in_creds->server, + (*out_creds)->server)) { + krb5_free_cred_contents(context, *out_creds); + ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; + } + if (ret == 0 && ok_as_delegate == 0) + (*out_creds)->flags.b.ok_as_delegate = 0; + +out: + if (ret) { + krb5_free_creds(context, *out_creds); + *out_creds = NULL; } - krb5_free_creds(context, tgt); + if (tmp_creds.server) + krb5_free_principal(context, tmp_creds.server); + if (tmp_creds.client) + krb5_free_principal(context, tmp_creds.client); + if (tgt) + krb5_free_creds(context, tgt); return ret; } @@ -916,6 +942,13 @@ return ret; } +/* + * Get a service ticket from a KDC by chasing referrals from a start realm. + * + * All referral TGTs produced in the process are thrown away when we're done. + * We don't store them, and we don't allow other search mechanisms (capaths) to + * use referral TGTs produced here. + */ static krb5_error_code get_cred_kdc_referral(krb5_context context, krb5_kdc_flags flags, @@ -923,14 +956,16 @@ krb5_creds *in_creds, krb5_principal impersonate_principal, Ticket *second_ticket, - krb5_creds **out_creds, - krb5_creds ***ret_tgts) + krb5_creds **out_creds) { - krb5_const_realm client_realm; + krb5_realm start_realm = NULL; + krb5_data config_start_realm; krb5_error_code ret; krb5_creds tgt, referral, ticket; + krb5_creds **referral_tgts = NULL; /* used for loop detection */ int loop = 0; int ok_as_delegate = 1; + size_t i; if (in_creds->server->name.name_string.len < 2 && !flags.b.canonicalize) { krb5_set_error_message(context, KRB5KDC_ERR_PATH_NOT_ACCEPTED, @@ -945,33 +980,49 @@ *out_creds = NULL; - client_realm = krb5_principal_get_realm(context, in_creds->client); + + ret = krb5_cc_get_config(context, ccache, NULL, "start_realm", &config_start_realm); + if (ret == 0) { + start_realm = strndup(config_start_realm.data, config_start_realm.length); + krb5_data_free(&config_start_realm); + } else { + start_realm = strdup(krb5_principal_get_realm(context, in_creds->client)); + } + if (start_realm == NULL) + return krb5_enomem(context); /* find tgt for the clients base realm */ { krb5_principal tgtname; ret = krb5_make_principal(context, &tgtname, - client_realm, + start_realm, KRB5_TGS_NAME, - client_realm, + start_realm, NULL); - if(ret) + if (ret) { + free(start_realm); return ret; + } - ret = find_cred(context, ccache, tgtname, *ret_tgts, &tgt); + ret = find_cred(context, ccache, tgtname, NULL, &tgt); krb5_free_principal(context, tgtname); - if (ret) + if (ret) { + free(start_realm); return ret; + } } referral = *in_creds; ret = krb5_copy_principal(context, in_creds->server, &referral.server); if (ret) { krb5_free_cred_contents(context, &tgt); + free(start_realm); return ret; } - ret = krb5_principal_set_realm(context, referral.server, client_realm); + ret = krb5_principal_set_realm(context, referral.server, start_realm); + free(start_realm); + start_realm = NULL; if (ret) { krb5_free_cred_contents(context, &tgt); krb5_free_principal(context, referral.server); @@ -983,11 +1034,13 @@ krb5_creds mcreds; char *referral_realm; - /* Use cache if we are not doing impersonation or contrainte deleg */ - if (impersonate_principal == NULL || flags.b.constrained_delegation) { + /* Use cache if we are not doing impersonation or contrained deleg */ + if (impersonate_principal == NULL || flags.b.cname_in_addl_tkt) { krb5_cc_clear_mcred(&mcreds); mcreds.server = referral.server; - ret = krb5_cc_retrieve_cred(context, ccache, 0, &mcreds, &ticket); + krb5_timeofday(context, &mcreds.times.endtime); + ret = krb5_cc_retrieve_cred(context, ccache, KRB5_TC_MATCH_TIMES, + &mcreds, &ticket); } else ret = EINVAL; @@ -1016,17 +1069,16 @@ referral_realm = ticket.server->name.name_string.val[1]; /* check that there are no referrals loops */ - tickets = *ret_tgts; + tickets = referral_tgts; krb5_cc_clear_mcred(&mcreds); mcreds.server = ticket.server; - while(tickets && *tickets){ - if(krb5_compare_creds(context, + while (tickets && *tickets){ + if (krb5_compare_creds(context, KRB5_TC_DONT_MATCH_REALM, &mcreds, - *tickets)) - { + *tickets)) { krb5_set_error_message(context, KRB5_GET_IN_TKT_LOOP, N_("Referral from %s " "loops back to realm %s", ""), @@ -1048,7 +1100,9 @@ ticket.flags.b.ok_as_delegate = 0; } - ret = add_cred(context, &ticket, ret_tgts); + _krb5_debug(context, 6, "get_cred_kdc_referral: got referral " + "to %s from %s", referral_realm, referral.server->realm); + ret = add_cred(context, &ticket, &referral_tgts); if (ret) goto out; @@ -1066,6 +1120,9 @@ ret = krb5_copy_creds(context, &ticket, out_creds); out: + for (i = 0; referral_tgts && referral_tgts[i]; i++) + krb5_free_creds(context, referral_tgts[i]); + free(referral_tgts); krb5_free_principal(context, referral.server); krb5_free_cred_contents(context, &tgt); krb5_free_cred_contents(context, &ticket); @@ -1078,7 +1135,7 @@ * codebase. */ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_get_cred_kdc_any(krb5_context context, krb5_kdc_flags flags, krb5_ccache ccache, @@ -1092,29 +1149,100 @@ krb5_deltat offset; ret = krb5_cc_get_kdc_offset(context, ccache, &offset); - if (ret) { + if (ret == 0) { context->kdc_sec_offset = offset; context->kdc_usec_offset = 0; } - ret = get_cred_kdc_referral(context, - flags, - ccache, - in_creds, - impersonate_principal, - second_ticket, - out_creds, - ret_tgts); - if (ret == 0 || flags.b.canonicalize) - return ret; - return get_cred_kdc_capath(context, - flags, - ccache, - in_creds, - impersonate_principal, - second_ticket, - out_creds, - ret_tgts); + if (strcmp(in_creds->server->realm, "") != 0) { + /* + * Non-empty realm? Try capaths first. We might have local + * policy (capaths) to honor. + */ + ret = get_cred_kdc_capath(context, + flags, + ccache, + in_creds, + impersonate_principal, + second_ticket, + out_creds, + ret_tgts); + if (ret == 0) + return ret; + } + + /* Otherwise try referrals */ + return get_cred_kdc_referral(context, + flags, + ccache, + in_creds, + impersonate_principal, + second_ticket, + out_creds); +} + +static krb5_error_code +check_cc(krb5_context context, krb5_flags options, krb5_ccache ccache, + krb5_creds *in_creds, krb5_creds *out_creds) +{ + krb5_error_code ret; + krb5_timestamp now; + krb5_creds mcreds = *in_creds; + + krb5_timeofday(context, &now); + + if (!(options & KRB5_GC_EXPIRED_OK) && + mcreds.times.endtime < now) { + mcreds.times.renew_till = 0; + krb5_timeofday(context, &mcreds.times.endtime); + options |= KRB5_TC_MATCH_TIMES; + } + + if (mcreds.server->name.name_type == KRB5_NT_SRV_HST_NEEDS_CANON) { + /* Avoid name canonicalization in krb5_cc_retrieve_cred() */ + krb5_principal_set_type(context, mcreds.server, KRB5_NT_SRV_HST); + } + + if (options & KRB5_GC_ANONYMOUS) { + ret = krb5_make_principal(context, + &mcreds.client, + krb5_principal_get_realm(context, mcreds.client), + KRB5_WELLKNOWN_NAME, + KRB5_ANON_NAME, + NULL); + if (ret) + return ret; + } + + ret = krb5_cc_retrieve_cred(context, ccache, + (options & + (KRB5_TC_DONT_MATCH_REALM | + KRB5_TC_MATCH_KEYTYPE | + KRB5_TC_MATCH_TIMES)), + &mcreds, out_creds); + + if (options & KRB5_GC_ANONYMOUS) + krb5_free_principal(context, mcreds.client); + + return ret; +} + +static void +store_cred(krb5_context context, krb5_ccache ccache, + krb5_const_principal server_princ, krb5_creds *creds) +{ + if (!krb5_principal_compare(context, creds->server, server_princ)) { + krb5_principal tmp_princ = creds->server; + /* + * Store the cred with the pre-canon server princ first so it + * can be found quickly in the future. + */ + creds->server = (krb5_principal)server_princ; + krb5_cc_store_cred(context, ccache, creds); + creds->server = tmp_princ; + /* Then store again with the canonicalized server princ */ + } + krb5_cc_store_cred(context, ccache, creds); } @@ -1127,64 +1255,72 @@ krb5_creds **out_creds) { krb5_error_code ret; + krb5_name_canon_iterator name_canon_iter = NULL; + krb5_name_canon_rule_options rule_opts; + krb5_const_principal try_princ = NULL; + krb5_principal save_princ = in_creds->server; krb5_creds **tgts; krb5_creds *res_creds; int i; + if (_krb5_have_debug(context, 5)) { + char *unparsed; + + ret = krb5_unparse_name(context, in_creds->server, &unparsed); + if (ret) { + _krb5_debug(context, 5, "krb5_get_creds: unable to display " + "requested service principal"); + } else { + _krb5_debug(context, 5, "krb5_get_creds: requesting a ticket " + "for %s", unparsed); + free(unparsed); + } + } + if (in_creds->session.keytype) { ret = krb5_enctype_valid(context, in_creds->session.keytype); if (ret) return ret; + options |= KRB5_TC_MATCH_KEYTYPE; } *out_creds = NULL; res_creds = calloc(1, sizeof(*res_creds)); - if (res_creds == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } - - if (in_creds->session.keytype) - options |= KRB5_TC_MATCH_KEYTYPE; + if (res_creds == NULL) + return krb5_enomem(context); - /* - * If we got a credential, check if credential is expired before - * returning it. - */ - ret = krb5_cc_retrieve_cred(context, - ccache, - in_creds->session.keytype ? - KRB5_TC_MATCH_KEYTYPE : 0, - in_creds, res_creds); - /* - * If we got a credential, check if credential is expired before - * returning it, but only if KRB5_GC_EXPIRED_OK is not set. - */ - if (ret == 0) { - krb5_timestamp timeret; + ret = krb5_name_canon_iterator_start(context, in_creds->server, + &name_canon_iter); + if (ret) + return ret; - /* If expired ok, don't bother checking */ - if(options & KRB5_GC_EXPIRED_OK) { - *out_creds = res_creds; - return 0; - } +next_rule: + krb5_free_cred_contents(context, res_creds); + memset(res_creds, 0, sizeof (*res_creds)); + ret = krb5_name_canon_iterate(context, &name_canon_iter, &try_princ, + &rule_opts); + in_creds->server = rk_UNCONST(try_princ); + if (ret) + goto out; - krb5_timeofday(context, &timeret); - if(res_creds->times.endtime > timeret) { - *out_creds = res_creds; - return 0; - } - if(options & KRB5_GC_CACHED) - krb5_cc_remove_cred(context, ccache, 0, res_creds); + if (name_canon_iter == NULL) { + if (options & KRB5_GC_CACHED) + ret = KRB5_CC_NOTFOUND; + else + ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; + goto out; + } + ret = check_cc(context, options, ccache, in_creds, res_creds); + if (ret == 0) { + *out_creds = res_creds; + res_creds = NULL; + goto out; } else if(ret != KRB5_CC_END) { - free(res_creds); - return ret; + goto out; } - free(res_creds); - if(options & KRB5_GC_CACHED) - return not_found(context, in_creds->server, KRB5_CC_NOTFOUND); + if (options & KRB5_GC_CACHED) + goto next_rule; if(options & KRB5_GC_USER_USER) flags.b.enc_tkt_in_skey = 1; @@ -1194,14 +1330,42 @@ tgts = NULL; ret = _krb5_get_cred_kdc_any(context, flags, ccache, in_creds, NULL, NULL, out_creds, &tgts); - for(i = 0; tgts && tgts[i]; i++) { - krb5_cc_store_cred(context, ccache, tgts[i]); + for (i = 0; tgts && tgts[i]; i++) { + if ((options & KRB5_GC_NO_STORE) == 0) + krb5_cc_store_cred(context, ccache, tgts[i]); krb5_free_creds(context, tgts[i]); } free(tgts); + + /* We don't yet have TGS w/ FAST, so we can't protect KBR-ERRORs */ + if (ret == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN && + !(rule_opts & KRB5_NCRO_USE_FAST)) + goto next_rule; + if(ret == 0 && (options & KRB5_GC_NO_STORE) == 0) - krb5_cc_store_cred(context, ccache, *out_creds); - return ret; + store_cred(context, ccache, in_creds->server, *out_creds); + + if (ret == 0 && _krb5_have_debug(context, 5)) { + char *unparsed; + + ret = krb5_unparse_name(context, (*out_creds)->server, &unparsed); + if (ret) { + _krb5_debug(context, 5, "krb5_get_creds: unable to display " + "service principal"); + } else { + _krb5_debug(context, 5, "krb5_get_creds: got a ticket for %s", + unparsed); + free(unparsed); + } + } + +out: + in_creds->server = save_princ; + krb5_free_creds(context, res_creds); + krb5_free_name_canon_iterator(context, name_canon_iter); + if (ret) + return not_found(context, in_creds->server, ret); + return 0; } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -1229,11 +1393,8 @@ krb5_get_creds_opt_alloc(krb5_context context, krb5_get_creds_opt *opt) { *opt = calloc(1, sizeof(**opt)); - if (*opt == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*opt == NULL) + return krb5_enomem(context); return 0; } @@ -1298,11 +1459,8 @@ krb5_error_code ret; opt->ticket = malloc(sizeof(*ticket)); - if (opt->ticket == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (opt->ticket == NULL) + return krb5_enomem(context); ret = copy_Ticket(ticket, opt->ticket); if (ret) { free(opt->ticket); @@ -1316,7 +1474,6 @@ } - KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_creds(krb5_context context, krb5_get_creds_opt opt, @@ -1330,7 +1487,29 @@ krb5_error_code ret; krb5_creds **tgts; krb5_creds *res_creds; + krb5_const_principal try_princ = NULL; + krb5_name_canon_iterator name_canon_iter = NULL; + krb5_name_canon_rule_options rule_opts; int i; + int type; + const char *comp; + + memset(&in_creds, 0, sizeof(in_creds)); + in_creds.server = rk_UNCONST(inprinc); + + if (_krb5_have_debug(context, 5)) { + char *unparsed; + + ret = krb5_unparse_name(context, in_creds.server, &unparsed); + if (ret) { + _krb5_debug(context, 5, "krb5_get_creds: unable to display " + "requested service principal"); + } else { + _krb5_debug(context, 5, "krb5_get_creds: requesting a ticket " + "for %s", unparsed); + free(unparsed); + } + } if (opt && opt->enctype) { ret = krb5_enctype_valid(context, opt->enctype); @@ -1338,9 +1517,6 @@ return ret; } - memset(&in_creds, 0, sizeof(in_creds)); - in_creds.server = rk_UNCONST(inprinc); - ret = krb5_cc_get_principal(context, ccache, &in_creds.client); if (ret) return ret; @@ -1355,9 +1531,7 @@ res_creds = calloc(1, sizeof(*res_creds)); if (res_creds == NULL) { krb5_free_principal(context, in_creds.client); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } if (opt && opt->enctype) { @@ -1365,49 +1539,47 @@ options |= KRB5_TC_MATCH_KEYTYPE; } - /* - * If we got a credential, check if credential is expired before - * returning it. - */ - ret = krb5_cc_retrieve_cred(context, - ccache, - options & KRB5_TC_MATCH_KEYTYPE, - &in_creds, res_creds); - /* - * If we got a credential, check if credential is expired before - * returning it, but only if KRB5_GC_EXPIRED_OK is not set. - */ - if (ret == 0) { - krb5_timestamp timeret; - - /* If expired ok, don't bother checking */ - if(options & KRB5_GC_EXPIRED_OK) { - *out_creds = res_creds; - krb5_free_principal(context, in_creds.client); - goto out; - } + ret = krb5_name_canon_iterator_start(context, in_creds.server, + &name_canon_iter); + if (ret) + goto out; - krb5_timeofday(context, &timeret); - if(res_creds->times.endtime > timeret) { - *out_creds = res_creds; - krb5_free_principal(context, in_creds.client); - goto out; - } - if(options & KRB5_GC_CACHED) - krb5_cc_remove_cred(context, ccache, 0, res_creds); +next_rule: + ret = krb5_name_canon_iterate(context, &name_canon_iter, &try_princ, + &rule_opts); + in_creds.server = rk_UNCONST(try_princ); + if (ret) + goto out; - } else if(ret != KRB5_CC_END) { - free(res_creds); - krb5_free_principal(context, in_creds.client); + if (name_canon_iter == NULL) { + if (options & KRB5_GC_CACHED) + ret = KRB5_CC_NOTFOUND; + else + ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; goto out; } - free(res_creds); - if(options & KRB5_GC_CACHED) { - krb5_free_principal(context, in_creds.client); - ret = not_found(context, in_creds.server, KRB5_CC_NOTFOUND); + + ret = check_cc(context, options, ccache, &in_creds, res_creds); + if (ret == 0) { + *out_creds = res_creds; + res_creds = NULL; + goto out; + } else if (ret != KRB5_CC_END) { goto out; } - if(options & KRB5_GC_USER_USER) { + if (options & KRB5_GC_CACHED) + goto next_rule; + + type = krb5_principal_get_type(context, try_princ); + comp = krb5_principal_get_comp_string(context, try_princ, 0); + if ((type == KRB5_NT_SRV_HST || type == KRB5_NT_UNKNOWN) && + comp != NULL && strcmp(comp, "host") == 0) + flags.b.canonicalize = 1; + if (rule_opts & KRB5_NCRO_NO_REFERRALS) + flags.b.canonicalize = 0; + else + flags.b.canonicalize = (options & KRB5_GC_CANONICALIZE) ? 1 : 0; + if (options & KRB5_GC_USER_USER) { flags.b.enc_tkt_in_skey = 1; options |= KRB5_GC_NO_STORE; } @@ -1415,29 +1587,51 @@ flags.b.forwardable = 1; if (options & KRB5_GC_NO_TRANSIT_CHECK) flags.b.disable_transited_check = 1; - if (options & KRB5_GC_CONSTRAINED_DELEGATION) { - flags.b.request_anonymous = 1; /* XXX ARGH confusion */ - flags.b.constrained_delegation = 1; - } - if (options & KRB5_GC_CANONICALIZE) - flags.b.canonicalize = 1; + if (options & KRB5_GC_CONSTRAINED_DELEGATION) + flags.b.cname_in_addl_tkt = 1; + if (options & KRB5_GC_ANONYMOUS) + flags.b.request_anonymous = 1; tgts = NULL; ret = _krb5_get_cred_kdc_any(context, flags, ccache, - &in_creds, opt->self, opt->ticket, - out_creds, &tgts); - krb5_free_principal(context, in_creds.client); - for(i = 0; tgts && tgts[i]; i++) { - krb5_cc_store_cred(context, ccache, tgts[i]); + &in_creds, opt ? opt->self : 0, + opt ? opt->ticket : 0, out_creds, + &tgts); + for (i = 0; tgts && tgts[i]; i++) { + if ((options & KRB5_GC_NO_STORE) == 0) + krb5_cc_store_cred(context, ccache, tgts[i]); krb5_free_creds(context, tgts[i]); } free(tgts); - if(ret == 0 && (options & KRB5_GC_NO_STORE) == 0) - krb5_cc_store_cred(context, ccache, *out_creds); - out: - _krb5_debug(context, 5, "krb5_get_creds: ret = %d", ret); + /* We don't yet have TGS w/ FAST, so we can't protect KBR-ERRORs */ + if (ret == KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN && + !(rule_opts & KRB5_NCRO_USE_FAST)) + goto next_rule; + + if (ret == 0 && (options & KRB5_GC_NO_STORE) == 0) + store_cred(context, ccache, inprinc, *out_creds); + + if (ret == 0 && _krb5_have_debug(context, 5)) { + char *unparsed; + + ret = krb5_unparse_name(context, (*out_creds)->server, &unparsed); + if (ret) { + _krb5_debug(context, 5, "krb5_get_creds: unable to display " + "service principal"); + } else { + _krb5_debug(context, 5, "krb5_get_creds: got a ticket for %s", + unparsed); + free(unparsed); + } + } +out: + krb5_free_creds(context, res_creds); + krb5_free_principal(context, in_creds.client); + krb5_free_name_canon_iterator(context, name_canon_iter); + if (ret) + return not_found(context, inprinc, ret); return ret; } diff --git a/crypto/heimdal/lib/krb5/get_default_principal.c b/crypto/heimdal/lib/krb5/get_default_principal.c --- a/crypto/heimdal/lib/krb5/get_default_principal.c +++ b/crypto/heimdal/lib/krb5/get_default_principal.c @@ -56,7 +56,7 @@ * avoid recursive calls. */ -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_get_default_principal_local (krb5_context context, krb5_principal *princ) { @@ -100,7 +100,7 @@ #define SECURITY_WIN32 #include -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_get_default_principal_local(krb5_context context, krb5_principal *princ) { diff --git a/crypto/heimdal/lib/krb5/get_default_realm.c b/crypto/heimdal/lib/krb5/get_default_realm.c --- a/crypto/heimdal/lib/krb5/get_default_realm.c +++ b/crypto/heimdal/lib/krb5/get_default_realm.c @@ -73,11 +73,8 @@ } res = strdup (context->default_realms[0]); - if (res == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (res == NULL) + return krb5_enomem(context); *realm = res; return 0; } diff --git a/crypto/heimdal/lib/krb5/get_for_creds.c b/crypto/heimdal/lib/krb5/get_for_creds.c --- a/crypto/heimdal/lib/krb5/get_for_creds.c +++ b/crypto/heimdal/lib/krb5/get_for_creds.c @@ -49,8 +49,7 @@ tmp = realloc(addr->val, (addr->len + n) * sizeof(*addr->val)); if (tmp == NULL && (addr->len + n) != 0) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } addr->val = tmp; @@ -266,8 +265,7 @@ cred.msg_type = krb_cred; ALLOC_SEQ(&cred.tickets, 1); if (cred.tickets.val == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out2; } ret = decode_Ticket(out_creds->ticket.data, @@ -279,8 +277,7 @@ memset (&enc_krb_cred_part, 0, sizeof(enc_krb_cred_part)); ALLOC_SEQ(&enc_krb_cred_part.ticket_info, 1); if (enc_krb_cred_part.ticket_info.val == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out4; } @@ -292,15 +289,13 @@ ALLOC(enc_krb_cred_part.timestamp, 1); if (enc_krb_cred_part.timestamp == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out4; } *enc_krb_cred_part.timestamp = sec; ALLOC(enc_krb_cred_part.usec, 1); if (enc_krb_cred_part.usec == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out4; } *enc_krb_cred_part.usec = usec; @@ -343,9 +338,7 @@ } else { ALLOC(enc_krb_cred_part.r_address, 1); if (enc_krb_cred_part.r_address == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out4; } @@ -362,11 +355,17 @@ krb_cred_info = enc_krb_cred_part.ticket_info.val; - copy_EncryptionKey (&out_creds->session, &krb_cred_info->key); + ret = copy_EncryptionKey (&out_creds->session, &krb_cred_info->key); + if (ret) + goto out4; ALLOC(krb_cred_info->prealm, 1); - copy_Realm (&out_creds->client->realm, krb_cred_info->prealm); + ret = copy_Realm (&out_creds->client->realm, krb_cred_info->prealm); + if (ret) + goto out4; ALLOC(krb_cred_info->pname, 1); - copy_PrincipalName(&out_creds->client->name, krb_cred_info->pname); + ret = copy_PrincipalName(&out_creds->client->name, krb_cred_info->pname); + if (ret) + goto out4; ALLOC(krb_cred_info->flags, 1); *krb_cred_info->flags = out_creds->flags.b; ALLOC(krb_cred_info->authtime, 1); @@ -378,11 +377,17 @@ ALLOC(krb_cred_info->renew_till, 1); *krb_cred_info->renew_till = out_creds->times.renew_till; ALLOC(krb_cred_info->srealm, 1); - copy_Realm (&out_creds->server->realm, krb_cred_info->srealm); + ret = copy_Realm (&out_creds->server->realm, krb_cred_info->srealm); + if (ret) + goto out4; ALLOC(krb_cred_info->sname, 1); - copy_PrincipalName (&out_creds->server->name, krb_cred_info->sname); + ret = copy_PrincipalName (&out_creds->server->name, krb_cred_info->sname); + if (ret) + goto out4; ALLOC(krb_cred_info->caddr, 1); - copy_HostAddresses (&out_creds->addresses, krb_cred_info->caddr); + ret = copy_HostAddresses (&out_creds->addresses, krb_cred_info->caddr); + if (ret) + goto out4; krb5_free_creds (context, out_creds); @@ -407,7 +412,7 @@ */ if (auth_context->flags & KRB5_AUTH_CONTEXT_CLEAR_FORWARDED_CRED) { - cred.enc_part.etype = ENCTYPE_NULL; + cred.enc_part.etype = KRB5_ENCTYPE_NULL; cred.enc_part.kvno = NULL; cred.enc_part.cipher.data = buf; cred.enc_part.cipher.length = buf_size; diff --git a/crypto/heimdal/lib/krb5/get_host_realm.c b/crypto/heimdal/lib/krb5/get_host_realm.c --- a/crypto/heimdal/lib/krb5/get_host_realm.c +++ b/crypto/heimdal/lib/krb5/get_host_realm.c @@ -49,8 +49,10 @@ */ static int -copy_txt_to_realms (struct rk_resource_record *head, - krb5_realm **realms) +copy_txt_to_realms(krb5_context context, + const char *domain, + struct rk_resource_record *head, + krb5_realm **realms) { struct rk_resource_record *rr; unsigned int n, i; @@ -64,21 +66,36 @@ *realms = malloc ((n + 1) * sizeof(krb5_realm)); if (*realms == NULL) - return -1; + return krb5_enomem(context);; for (i = 0; i < n + 1; ++i) (*realms)[i] = NULL; for (i = 0, rr = head; rr; rr = rr->next) { if (rr->type == rk_ns_t_txt) { - char *tmp; + char *tmp = NULL; + int invalid_tld = 1; - tmp = strdup(rr->u.txt); + /* Check for a gTLD controlled interruption */ + if (strcmp("Your DNS configuration needs immediate " + "attention see https://icann.org/namecollision", + rr->u.txt) != 0) { + invalid_tld = 0; + tmp = strdup(rr->u.txt); + } if (tmp == NULL) { for (i = 0; i < n; ++i) free ((*realms)[i]); free (*realms); - return -1; + if (invalid_tld) { + krb5_warnx(context, + "Realm lookup failed: " + "Domain '%s' needs immediate attention " + "see https://icann.org/namecollision", + domain); + return KRB5_KDC_UNREACH; + } + return krb5_enomem(context);; } (*realms)[i] = tmp; ++i; @@ -97,7 +114,7 @@ struct rk_dns_reply *r; const char **labels; char **config_labels; - int i, ret; + int i, ret = 0; config_labels = krb5_config_get_strings(context, NULL, "libdefaults", "dns_lookup_realm_labels", NULL); @@ -110,24 +127,26 @@ for (i = 0; labels[i] != NULL; i++) { ret = snprintf(dom, sizeof(dom), "%s.%s.", labels[i], domain); if(ret < 0 || (size_t)ret >= sizeof(dom)) { - if (config_labels) - krb5_config_free_strings(config_labels); - return -1; + ret = krb5_enomem(context); + goto out; } r = rk_dns_lookup(dom, "TXT"); if(r != NULL) { - ret = copy_txt_to_realms (r->head, realms); + ret = copy_txt_to_realms(context, domain, r->head, realms); rk_dns_free_data(r); - if(ret == 0) { - if (config_labels) - krb5_config_free_strings(config_labels); - return 0; - } + if(ret == 0) + goto out; } } + krb5_set_error_message(context, KRB5_KDC_UNREACH, + "Realm lookup failed: " + "No DNS TXT record for %s", + domain); + ret = KRB5_KDC_UNREACH; +out: if (config_labels) krb5_config_free_strings(config_labels); - return -1; + return ret; } /* @@ -159,55 +178,78 @@ */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -_krb5_get_host_realm_int (krb5_context context, - const char *host, - krb5_boolean use_dns, - krb5_realm **realms) +_krb5_get_host_realm_int(krb5_context context, + const char *host, + krb5_boolean use_dns, + krb5_realm **realms) { const char *p, *q; + const char *port; krb5_boolean dns_locate_enable; + krb5_error_code ret = 0; + + /* Strip off any trailing ":port" suffix. */ + port = strchr(host, ':'); + if (port != NULL) { + host = strndup(host, port - host); + if (host == NULL) + return krb5_enomem(context); + } dns_locate_enable = krb5_config_get_bool_default(context, NULL, TRUE, - "libdefaults", "dns_lookup_realm", NULL); + "libdefaults", "dns_lookup_realm", NULL); for (p = host; p != NULL; p = strchr (p + 1, '.')) { - if(config_find_realm(context, p, realms) == 0) { - if(strcasecmp(*realms[0], "dns_locate") == 0) { - if(use_dns) - for (q = host; q != NULL; q = strchr(q + 1, '.')) - if(dns_find_realm(context, q, realms) == 0) - return 0; - continue; - } else - return 0; - } - else if(use_dns && dns_locate_enable) { - if(dns_find_realm(context, p, realms) == 0) - return 0; - } + if (config_find_realm(context, p, realms) == 0) { + if (strcasecmp(*realms[0], "dns_locate") != 0) + break; + krb5_free_host_realm(context, *realms); + *realms = NULL; + if (!use_dns) + continue; + for (q = host; q != NULL; q = strchr(q + 1, '.')) + if (dns_find_realm(context, q, realms) == 0) + break; + if (q) + break; + } else if (use_dns && dns_locate_enable) { + if (dns_find_realm(context, p, realms) == 0) + break; + } } - p = strchr(host, '.'); - if(p != NULL) { - p++; - *realms = malloc(2 * sizeof(krb5_realm)); - if (*realms == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } - (*realms)[0] = strdup(p); - if((*realms)[0] == NULL) { - free(*realms); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } - strupr((*realms)[0]); - (*realms)[1] = NULL; - return 0; + /* + * If 'p' is NULL, we did not find an explicit realm mapping in either the + * configuration file or DNS. Try the hostname suffix as a last resort. + * + * XXX: If we implement a KDC-specific variant of this function just for + * referrals, we could check whether we have a cross-realm TGT for the + * realm in question, and if not try the parent (loop again). + */ + if (p == NULL) { + p = strchr(host, '.'); + if (p != NULL) { + p++; + *realms = malloc(2 * sizeof(krb5_realm)); + if (*realms != NULL && + ((*realms)[0] = strdup(p)) != NULL) { + strupr((*realms)[0]); + (*realms)[1] = NULL; + } else { + free(*realms); + ret = krb5_enomem(context); + } + } else { + krb5_set_error_message(context, KRB5_ERR_HOST_REALM_UNKNOWN, + N_("unable to find realm of host %s", ""), + host); + ret = KRB5_ERR_HOST_REALM_UNKNOWN; + } } - krb5_set_error_message(context, KRB5_ERR_HOST_REALM_UNKNOWN, - N_("unable to find realm of host %s", ""), - host); - return KRB5_ERR_HOST_REALM_UNKNOWN; + + /* If 'port' is not NULL, we have a copy of 'host' to free. */ + if (port) + free((void *)host); + return ret; } /* diff --git a/crypto/heimdal/lib/krb5/get_in_tkt.c b/crypto/heimdal/lib/krb5/get_in_tkt.c --- a/crypto/heimdal/lib/krb5/get_in_tkt.c +++ b/crypto/heimdal/lib/krb5/get_in_tkt.c @@ -31,6 +31,8 @@ * SUCH DAMAGE. */ +#define KRB5_DEPRECATED_FUNCTION(x) + #include "krb5_locl.h" #ifndef HEIMDAL_SMALLER @@ -113,14 +115,12 @@ if (!enctypes) { enctypes = context->etypes; netypes = 0; - for (ep = enctypes; *ep != ETYPE_NULL; ep++) + for (ep = enctypes; *ep != (krb5_enctype)ETYPE_NULL; ep++) netypes++; } pa2 = realloc (md->val, (md->len + netypes) * sizeof(*md->val)); - if (pa2 == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (pa2 == NULL) + return krb5_enomem(context); md->val = pa2; for (i = 0; i < netypes; ++i) { @@ -164,14 +164,12 @@ a->req_body.kdc_options = opts; a->req_body.cname = malloc(sizeof(*a->req_body.cname)); if (a->req_body.cname == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } a->req_body.sname = malloc(sizeof(*a->req_body.sname)); if (a->req_body.sname == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } ret = _krb5_principal2principalname (a->req_body.cname, creds->client); @@ -187,8 +185,7 @@ if(creds->times.starttime) { a->req_body.from = malloc(sizeof(*a->req_body.from)); if (a->req_body.from == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } *a->req_body.from = creds->times.starttime; @@ -200,8 +197,7 @@ if(creds->times.renew_till){ a->req_body.rtime = malloc(sizeof(*a->req_body.rtime)); if (a->req_body.rtime == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } *a->req_body.rtime = creds->times.renew_till; @@ -224,8 +220,7 @@ } else { a->req_body.addresses = malloc(sizeof(*a->req_body.addresses)); if (a->req_body.addresses == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } @@ -249,8 +244,7 @@ size_t i; ALLOC(a->padata, 1); if(a->padata == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } a->padata->val = NULL; @@ -288,8 +282,7 @@ else if (*ptypes == KRB5_PADATA_ENC_TIMESTAMP) { ALLOC(a->padata, 1); if (a->padata == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } a->padata->len = 0; @@ -499,7 +492,7 @@ { unsigned flags = EXTRACT_TICKET_TIMESYNC; if (opts.request_anonymous) - flags |= EXTRACT_TICKET_ALLOW_SERVER_MISMATCH; + flags |= EXTRACT_TICKET_ALLOW_SERVER_MISMATCH | EXTRACT_TICKET_MATCH_ANON; ret = _krb5_extract_ticket(context, &rep, @@ -510,6 +503,7 @@ NULL, nonce, flags, + NULL, decrypt_proc, decryptarg); } diff --git a/crypto/heimdal/lib/krb5/heim_err.et b/crypto/heimdal/lib/krb5/heim_err.et --- a/crypto/heimdal/lib/krb5/heim_err.et +++ b/crypto/heimdal/lib/krb5/heim_err.et @@ -20,6 +20,7 @@ error_code NOT_SEEKABLE, "File descriptor not seekable" error_code TOO_BIG, "Offset too large" error_code BAD_HDBENT_ENCODING, "Invalid HDB entry encoding" +error_code RANDOM_OFFLINE, "No random source available" index 64 prefix HEIM_PKINIT @@ -44,4 +45,9 @@ error_code SERVICE, "servname not supported for ai_socktype" error_code SOCKTYPE, "ai_socktype not supported" error_code SYSTEM, "system error returned in errno" + +index 192 +prefix HEIM_NET +error_code CONN_REFUSED, "connection refused" + end diff --git a/crypto/heimdal/lib/krb5/init_creds.c b/crypto/heimdal/lib/krb5/init_creds.c --- a/crypto/heimdal/lib/krb5/init_creds.c +++ b/crypto/heimdal/lib/krb5/init_creds.c @@ -60,18 +60,13 @@ *opt = NULL; o = calloc(1, sizeof(*o)); - if (o == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (o == NULL) + return krb5_enomem(context); o->opt_private = calloc(1, sizeof(*o->opt_private)); if (o->opt_private == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); free(o); - return ENOMEM; + return krb5_enomem(context); } o->opt_private->refcount = 1; *opt = o; @@ -200,6 +195,13 @@ #endif } +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_get_init_creds_opt_set_change_password_prompt(krb5_get_init_creds_opt *opt, + int change_password_prompt) +{ + opt->flags |= KRB5_GET_INIT_CREDS_OPT_CHANGE_PASSWORD_PROMPT; + opt->change_password_prompt = change_password_prompt; +} KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_set_tkt_life(krb5_get_init_creds_opt *opt, @@ -364,9 +366,11 @@ if (req) { opt->opt_private->flags |= KRB5_INIT_CREDS_NO_C_CANON_CHECK; opt->opt_private->flags |= KRB5_INIT_CREDS_NO_C_NO_EKU_CHECK; + opt->opt_private->flags |= KRB5_INIT_CREDS_PKINIT_NO_KRBTGT_OTHERNAME_CHECK; } else { opt->opt_private->flags &= ~KRB5_INIT_CREDS_NO_C_CANON_CHECK; opt->opt_private->flags &= ~KRB5_INIT_CREDS_NO_C_NO_EKU_CHECK; + opt->opt_private->flags &= ~KRB5_INIT_CREDS_PKINIT_NO_KRBTGT_OTHERNAME_CHECK; } return 0; } @@ -379,7 +383,7 @@ void *ctx) { krb5_error_code ret; - ret = require_ext_opt(context, opt, "init_creds_opt_set_win2k"); + ret = require_ext_opt(context, opt, "init_creds_opt_set_process_last_req"); if (ret) return ret; @@ -423,10 +427,8 @@ KRB5_DEPRECATED_FUNCTION("Use X instead") { *error = calloc(1, sizeof(**error)); - if (*error == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*error == NULL) + return krb5_enomem(context); return 0; } diff --git a/crypto/heimdal/lib/krb5/init_creds_pw.c b/crypto/heimdal/lib/krb5/init_creds_pw.c --- a/crypto/heimdal/lib/krb5/init_creds_pw.c +++ b/crypto/heimdal/lib/krb5/init_creds_pw.c @@ -34,6 +34,9 @@ */ #include "krb5_locl.h" +#ifndef WIN32 +#include +#endif /* WIN32 */ typedef struct krb5_get_init_creds_ctx { KDCOptions flags; @@ -61,6 +64,10 @@ krb5_pk_init_ctx pk_init_ctx; int ic_flags; + struct { + unsigned change_password:1; + } runflags; + int used_pa_types; #define USED_PKINIT 1 #define USED_PKINIT_W2K 2 @@ -76,7 +83,25 @@ void *prompter_data; struct pa_info_data *ppaid; - + struct fast_state { + enum PA_FX_FAST_REQUEST_enum type; + unsigned int flags; +#define KRB5_FAST_REPLY_KEY_USE_TO_ENCRYPT_THE_REPLY 1 +#define KRB5_FAST_REPLY_KEY_USE_IN_TRANSACTION 2 +#define KRB5_FAST_KDC_REPLY_KEY_REPLACED 4 +#define KRB5_FAST_REPLY_REPLY_VERIFED 8 +#define KRB5_FAST_STRONG 16 +#define KRB5_FAST_EXPECTED 32 /* in exchange with KDC, fast was discovered */ +#define KRB5_FAST_REQUIRED 64 /* fast required by action of caller */ +#define KRB5_FAST_DISABLED 128 +#define KRB5_FAST_AP_ARMOR_SERVICE 256 + krb5_keyblock *reply_key; + krb5_ccache armor_ccache; + krb5_principal armor_service; + krb5_crypto armor_crypto; + krb5_keyblock armor_key; + krb5_keyblock *strengthen_key; + } fast_state; } krb5_get_init_creds_ctx; @@ -137,9 +162,24 @@ if (ctx->keytab_data) free(ctx->keytab_data); if (ctx->password) { - memset(ctx->password, 0, strlen(ctx->password)); + size_t len; + len = strlen(ctx->password); + memset_s(ctx->password, len, 0, len); free(ctx->password); } + /* + * FAST state (we don't close the armor_ccache because we might have + * to destroy it, and how would we know? also, the caller should + * take care of cleaning up the armor_ccache). + */ + if (ctx->fast_state.armor_service) + krb5_free_principal(context, ctx->fast_state.armor_service); + if (ctx->fast_state.armor_crypto) + krb5_crypto_destroy(context, ctx->fast_state.armor_crypto); + if (ctx->fast_state.strengthen_key) + krb5_free_keyblock(context, ctx->fast_state.strengthen_key); + krb5_free_keyblock_contents(context, &ctx->fast_state.armor_key); + krb5_data_free(&ctx->req_buffer); krb5_free_cred_contents(context, &ctx->cred); free_METHOD_DATA(&ctx->md); @@ -151,7 +191,7 @@ free_paid(context, ctx->ppaid); free(ctx->ppaid); } - memset(ctx, 0, sizeof(*ctx)); + memset_s(ctx, sizeof(*ctx), 0, sizeof(*ctx)); } static int @@ -194,13 +234,11 @@ memset (cred, 0, sizeof(*cred)); if (client) - krb5_copy_principal(context, client, &cred->client); - else { - ret = krb5_get_default_principal (context, - &cred->client); - if (ret) - goto out; - } + ret = krb5_copy_principal(context, client, &cred->client); + else + ret = krb5_get_default_principal(context, &cred->client); + if (ret) + goto out; if (start_time) cred->times.starttime = now + start_time; @@ -208,12 +246,15 @@ if (options->flags & KRB5_GET_INIT_CREDS_OPT_TKT_LIFE) tmp = options->tkt_life; else - tmp = 10 * 60 * 60; + tmp = KRB5_TKT_LIFETIME_DEFAULT; cred->times.endtime = now + tmp; - if ((options->flags & KRB5_GET_INIT_CREDS_OPT_RENEW_LIFE) && - options->renew_life > 0) { - cred->times.renew_till = now + options->renew_life; + if ((options->flags & KRB5_GET_INIT_CREDS_OPT_RENEW_LIFE)) { + if (options->renew_life > 0) + tmp = options->renew_life; + else + tmp = KRB5_TKT_RENEW_LIFETIME_DEFAULT; + cred->times.renew_till = now + tmp; } return 0; @@ -251,10 +292,10 @@ * @param ctx The krb5_init_creds_context check for expiration. */ -static krb5_error_code -process_last_request(krb5_context context, - krb5_get_init_creds_opt *options, - krb5_init_creds_context ctx) +krb5_error_code +krb5_process_last_request(krb5_context context, + krb5_get_init_creds_opt *options, + krb5_init_creds_context ctx) { krb5_const_realm realm; LastReq *lr; @@ -273,12 +314,9 @@ if (options && options->opt_private && options->opt_private->lr.func) { krb5_last_req_entry **lre; - lre = calloc(lr->len + 1, sizeof(**lre)); - if (lre == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + lre = calloc(lr->len + 1, sizeof(*lre)); + if (lre == NULL) + return krb5_enomem(context); for (i = 0; i < lr->len; i++) { lre[i] = calloc(1, sizeof(*lre[i])); if (lre[i] == NULL) @@ -311,7 +349,7 @@ for (i = 0; i < lr->len; ++i) { if (lr->val[i].lr_value <= t) { - switch (abs(lr->val[i].lr_type)) { + switch (lr->val[i].lr_type) { case LR_PW_EXPTIME : report_expiration(context, ctx->prompter, ctx->prompter_data, @@ -326,6 +364,8 @@ lr->val[i].lr_value); reported = TRUE; break; + default: + break; } } } @@ -440,8 +480,7 @@ etypes = malloc((options->etype_list_length + 1) * sizeof(krb5_enctype)); if (etypes == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } memcpy (etypes, options->etype_list, @@ -453,8 +492,7 @@ pre_auth_types = malloc((options->preauth_list_length + 1) * sizeof(krb5_preauthtype)); if (pre_auth_types == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } memcpy (pre_auth_types, options->preauth_list, @@ -494,6 +532,8 @@ char *p; krb5_get_init_creds_opt *options; + heim_assert(prompter != NULL, "unexpected NULL prompter"); + memset (&cpw_cred, 0, sizeof(cpw_cred)); ret = krb5_get_init_creds_opt_alloc(context, &options); @@ -502,10 +542,15 @@ krb5_get_init_creds_opt_set_tkt_life (options, 60); krb5_get_init_creds_opt_set_forwardable (options, FALSE); krb5_get_init_creds_opt_set_proxiable (options, FALSE); - if (old_options && old_options->flags & KRB5_GET_INIT_CREDS_OPT_PREAUTH_LIST) - krb5_get_init_creds_opt_set_preauth_list (options, - old_options->preauth_list, - old_options->preauth_list_length); + if (old_options && + (old_options->flags & KRB5_GET_INIT_CREDS_OPT_PREAUTH_LIST)) + krb5_get_init_creds_opt_set_preauth_list(options, + old_options->preauth_list, + old_options->preauth_list_length); + if (old_options && + (old_options->flags & KRB5_GET_INIT_CREDS_OPT_CHANGE_PASSWORD_PROMPT)) + krb5_get_init_creds_opt_set_change_password_prompt(options, + old_options->change_password_prompt); krb5_data_zero (&result_code_string); krb5_data_zero (&result_string); @@ -586,8 +631,8 @@ } out: - memset (buf1, 0, sizeof(buf1)); - memset (buf2, 0, sizeof(buf2)); + memset_s(buf1, sizeof(buf1), 0, sizeof(buf1)); + memset_s(buf2, sizeof(buf2), 0, sizeof(buf2)); krb5_data_free (&result_string); krb5_data_free (&result_code_string); krb5_free_cred_contents (context, &cpw_cred); @@ -626,14 +671,12 @@ a->req_body.kdc_options = opts; a->req_body.cname = malloc(sizeof(*a->req_body.cname)); if (a->req_body.cname == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } a->req_body.sname = malloc(sizeof(*a->req_body.sname)); if (a->req_body.sname == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } @@ -651,21 +694,23 @@ if(creds->times.starttime) { a->req_body.from = malloc(sizeof(*a->req_body.from)); if (a->req_body.from == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } *a->req_body.from = creds->times.starttime; } if(creds->times.endtime){ - ALLOC(a->req_body.till, 1); - *a->req_body.till = creds->times.endtime; + if ((ALLOC(a->req_body.till, 1)) != NULL) + *a->req_body.till = creds->times.endtime; + else { + ret = krb5_enomem(context); + goto fail; + } } if(creds->times.renew_till){ a->req_body.rtime = malloc(sizeof(*a->req_body.rtime)); if (a->req_body.rtime == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } *a->req_body.rtime = creds->times.renew_till; @@ -688,8 +733,7 @@ } else { a->req_body.addresses = malloc(sizeof(*a->req_body.addresses)); if (a->req_body.addresses == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } @@ -714,7 +758,7 @@ return 0; fail: free_AS_REQ(a); - memset(a, 0, sizeof(*a)); + memset_s(a, sizeof(*a), 0, sizeof(*a)); return ret; } @@ -859,7 +903,7 @@ heim_octet_string *data) { krb5_error_code ret; - if (paid->etype == ENCTYPE_NULL) + if (paid->etype == KRB5_ENCTYPE_NULL) return NULL; ret = set_paid(paid, context, paid->etype, @@ -1002,7 +1046,7 @@ if (!enctypes) { enctypes = context->etypes; netypes = 0; - for (ep = enctypes; *ep != ETYPE_NULL; ep++) + for (ep = enctypes; *ep != (krb5_enctype)ETYPE_NULL; ep++) netypes++; } @@ -1156,10 +1200,9 @@ krb5_error_code ret; ALLOC(*out_md, 1); - if (*out_md == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*out_md == NULL) + return krb5_enomem(context); + (*out_md)->len = 0; (*out_md)->val = NULL; @@ -1203,8 +1246,10 @@ unsigned flag; paid = calloc(1, sizeof(*paid)); + if (paid == NULL) + return krb5_enomem(context); - paid->etype = ENCTYPE_NULL; + paid->etype = KRB5_ENCTYPE_NULL; ppaid = process_pa_info(context, creds->client, a, paid, in_md); if (ppaid) @@ -1215,6 +1260,7 @@ if (ctx->used_pa_types & flag) { if (ppaid) free_paid(context, ppaid); + free(paid); krb5_set_error_message(context, KRB5_GET_IN_TKT_LOOP, "Already tried ENC-TS-%s, looping", flag == USED_ENC_TS_INFO ? "info" : "guess"); @@ -1237,6 +1283,12 @@ pa_data_add_pac_request(context, ctx, *out_md); + if ((ctx->fast_state.flags & KRB5_FAST_DISABLED) == 0) { + ret = krb5_padata_add(context, *out_md, KRB5_PADATA_REQ_ENC_PA_REP, NULL, 0); + if (ret) + return ret; + } + if ((*out_md)->len == 0) { free(*out_md); *out_md = NULL; @@ -1357,10 +1409,8 @@ *rctx = NULL; ctx = calloc(1, sizeof(*ctx)); - if (ctx == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ctx == NULL) + return krb5_enomem(context); ret = get_init_creds_common(context, client, start_time, options, ctx); if (ret) { @@ -1453,15 +1503,15 @@ const char *password) { if (ctx->password) { - memset(ctx->password, 0, strlen(ctx->password)); + size_t len; + len = strlen(ctx->password); + memset_s(ctx->password, len, 0, len); free(ctx->password); } if (password) { ctx->password = strdup(password); - if (ctx->password == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ctx->password == NULL) + return krb5_enomem(context); ctx->keyseed = (void *) ctx->password; } else { ctx->keyseed = NULL; @@ -1524,14 +1574,11 @@ krb5_enctype *etypes = NULL; krb5_error_code ret; size_t netypes = 0; - int kvno = 0; + int kvno = 0, found = 0; a = malloc(sizeof(*a)); - if (a == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (a == NULL) + return krb5_enomem(context); a->principal = ctx->cred.client; a->keytab = keytab; @@ -1557,6 +1604,8 @@ if (!krb5_principal_compare(context, entry.principal, ctx->cred.client)) goto next; + found = 1; + /* check if we ahve this kvno already */ if (entry.vno > kvno) { /* remove old list of etype */ @@ -1574,8 +1623,11 @@ /* add enctype to supported list */ ptr = realloc(etypes, sizeof(etypes[0]) * (netypes + 2)); - if (ptr == NULL) - goto next; + if (ptr == NULL) { + free(etypes); + ret = krb5_enomem(context); + goto out; + } etypes = ptr; etypes[netypes] = entry.keyblock.keytype; @@ -1593,7 +1645,13 @@ } out: - return 0; + if (!found) { + if (ret == 0) + ret = KRB5_KT_NOTFOUND; + _krb5_kt_principal_not_found(context, ret, keytab, ctx->cred.client, 0, 0); + } + + return ret; } static krb5_error_code KRB5_CALLCONV @@ -1616,6 +1674,483 @@ return 0; } +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_init_creds_set_fast_ccache(krb5_context context, + krb5_init_creds_context ctx, + krb5_ccache fast_ccache) +{ + ctx->fast_state.armor_ccache = fast_ccache; + ctx->fast_state.flags |= KRB5_FAST_REQUIRED; + return 0; +} + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_init_creds_set_fast_ap_armor_service(krb5_context context, + krb5_init_creds_context ctx, + krb5_const_principal armor_service) +{ + krb5_error_code ret; + + if (ctx->fast_state.armor_service) + krb5_free_principal(context, ctx->fast_state.armor_service); + if (armor_service) { + ret = krb5_copy_principal(context, armor_service, &ctx->fast_state.armor_service); + if (ret) + return ret; + } else { + ctx->fast_state.armor_service = NULL; + } + ctx->fast_state.flags |= KRB5_FAST_REQUIRED | KRB5_FAST_AP_ARMOR_SERVICE; + return 0; +} + +/* + * FAST + */ + +static krb5_error_code +check_fast(krb5_context context, struct fast_state *state) +{ + if (state->flags & KRB5_FAST_EXPECTED) { + krb5_set_error_message(context, KRB5KRB_AP_ERR_MODIFIED, + "Expected FAST, but no FAST " + "was in the response from the KDC"); + return KRB5KRB_AP_ERR_MODIFIED; + } + return 0; +} + + +static krb5_error_code +fast_unwrap_as_rep(krb5_context context, int32_t nonce, + krb5_data *chksumdata, + struct fast_state *state, AS_REP *rep) +{ + PA_FX_FAST_REPLY fxfastrep; + KrbFastResponse fastrep; + krb5_error_code ret; + PA_DATA *pa = NULL; + int idx = 0; + + if (state->armor_crypto == NULL || rep->padata == NULL) + return check_fast(context, state); + + /* find PA_FX_FAST_REPLY */ + + pa = krb5_find_padata(rep->padata->val, rep->padata->len, + KRB5_PADATA_FX_FAST, &idx); + if (pa == NULL) + return check_fast(context, state); + + memset(&fxfastrep, 0, sizeof(fxfastrep)); + memset(&fastrep, 0, sizeof(fastrep)); + + ret = decode_PA_FX_FAST_REPLY(pa->padata_value.data, pa->padata_value.length, &fxfastrep, NULL); + if (ret) + return ret; + + if (fxfastrep.element == choice_PA_FX_FAST_REPLY_armored_data) { + krb5_data data; + ret = krb5_decrypt_EncryptedData(context, + state->armor_crypto, + KRB5_KU_FAST_REP, + &fxfastrep.u.armored_data.enc_fast_rep, + &data); + if (ret) + goto out; + + ret = decode_KrbFastResponse(data.data, data.length, &fastrep, NULL); + krb5_data_free(&data); + if (ret) + goto out; + + } else { + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + free_METHOD_DATA(rep->padata); + ret = copy_METHOD_DATA(&fastrep.padata, rep->padata); + if (ret) + goto out; + + if (fastrep.strengthen_key) { + if (state->strengthen_key) + krb5_free_keyblock(context, state->strengthen_key); + + ret = krb5_copy_keyblock(context, fastrep.strengthen_key, &state->strengthen_key); + if (ret) + goto out; + } + + if (nonce != fastrep.nonce) { + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + if (fastrep.finished) { + PrincipalName cname; + krb5_realm crealm = NULL; + + if (chksumdata == NULL) { + ret = KRB5KDC_ERR_PREAUTH_FAILED; + goto out; + } + + ret = krb5_verify_checksum(context, state->armor_crypto, + KRB5_KU_FAST_FINISHED, + chksumdata->data, chksumdata->length, + &fastrep.finished->ticket_checksum); + if (ret) + goto out; + + /* update */ + ret = copy_Realm(&fastrep.finished->crealm, &crealm); + if (ret) + goto out; + free_Realm(&rep->crealm); + rep->crealm = crealm; + + ret = copy_PrincipalName(&fastrep.finished->cname, &cname); + if (ret) + goto out; + free_PrincipalName(&rep->cname); + rep->cname = cname; + +#if 0 /* store authenticated checksum as kdc-offset */ + fastrep->finished.timestamp; + fastrep->finished.usec = 0; +#endif + + } else if (chksumdata) { + /* expected fastrep.finish but didn't get it */ + ret = KRB5KDC_ERR_PREAUTH_FAILED; + } + + out: + free_PA_FX_FAST_REPLY(&fxfastrep); + + return ret; +} + +static krb5_error_code +fast_unwrap_error(krb5_context context, struct fast_state *state, KRB_ERROR *error) +{ + if (state->armor_crypto == NULL) + return check_fast(context, state); + + return 0; +} + +krb5_error_code +_krb5_make_fast_ap_fxarmor(krb5_context context, + krb5_ccache armor_ccache, + krb5_data *armor_value, + krb5_keyblock *armor_key, + krb5_crypto *armor_crypto) +{ + krb5_auth_context auth_context = NULL; + krb5_creds cred, *credp = NULL; + krb5_error_code ret; + krb5_data empty; + + krb5_data_zero(&empty); + + memset(&cred, 0, sizeof(cred)); + + ret = krb5_auth_con_init (context, &auth_context); + if (ret) + goto out; + + ret = krb5_cc_get_principal(context, armor_ccache, &cred.client); + if (ret) + goto out; + + ret = krb5_make_principal(context, &cred.server, + cred.client->realm, + KRB5_TGS_NAME, + cred.client->realm, + NULL); + if (ret) { + krb5_free_principal(context, cred.client); + goto out; + } + + ret = krb5_get_credentials(context, 0, armor_ccache, &cred, &credp); + krb5_free_principal(context, cred.server); + krb5_free_principal(context, cred.client); + if (ret) + goto out; + + ret = krb5_auth_con_add_AuthorizationData(context, auth_context, KRB5_PADATA_FX_FAST_ARMOR, &empty); + if (ret) + goto out; + + ret = krb5_mk_req_extended(context, + &auth_context, + AP_OPTS_USE_SUBKEY, + NULL, + credp, + armor_value); + krb5_free_creds(context, credp); + if (ret) + goto out; + + ret = _krb5_fast_armor_key(context, + auth_context->local_subkey, + auth_context->keyblock, + armor_key, + armor_crypto); + if (ret) + goto out; + + out: + krb5_auth_con_free(context, auth_context); + return ret; +} + +#ifndef WIN32 +static heim_base_once_t armor_service_once = HEIM_BASE_ONCE_INIT; +static heim_ipc armor_service = NULL; + +static void +fast_armor_init_ipc(void *ctx) +{ + heim_ipc *ipc = ctx; + heim_ipc_init_context("ANY:org.h5l.armor-service", ipc); +} +#endif /* WIN32 */ + + +static krb5_error_code +make_fast_ap_fxarmor(krb5_context context, + struct fast_state *state, + const char *realm, + KrbFastArmor **armor) +{ + KrbFastArmor *fxarmor = NULL; + krb5_error_code ret; + + if (state->armor_crypto) + krb5_crypto_destroy(context, state->armor_crypto); + krb5_free_keyblock_contents(context, &state->armor_key); + + + ALLOC(fxarmor, 1); + if (fxarmor == NULL) + return krb5_enomem(context); + + if (state->flags & KRB5_FAST_AP_ARMOR_SERVICE) { +#ifdef WIN32 + krb5_set_error_message(context, ENOTSUP, "Fast armor IPC service not supportted yet on Windows"); + ret = ENOTSUP; + goto out; +#else /* WIN32 */ + KERB_ARMOR_SERVICE_REPLY msg; + krb5_data request, reply; + + heim_base_once_f(&armor_service_once, &armor_service, fast_armor_init_ipc); + if (armor_service == NULL) { + krb5_set_error_message(context, ENOENT, "Failed to open fast armor service"); + ret = ENOENT; + goto out; + } + + krb5_data_zero(&reply); + + request.data = rk_UNCONST(realm); + request.length = strlen(realm); + + ret = heim_ipc_call(armor_service, &request, &reply, NULL); + heim_release(send); + if (ret) { + krb5_set_error_message(context, ret, "Failed to get armor service credential"); + goto out; + } + + ret = decode_KERB_ARMOR_SERVICE_REPLY(reply.data, reply.length, &msg, NULL); + krb5_data_free(&reply); + if (ret) + goto out; + + ret = copy_KrbFastArmor(fxarmor, &msg.armor); + if (ret) { + free_KERB_ARMOR_SERVICE_REPLY(&msg); + goto out; + } + + ret = krb5_copy_keyblock_contents(context, &msg.armor_key, &state->armor_key); + free_KERB_ARMOR_SERVICE_REPLY(&msg); + if (ret) + goto out; + + ret = krb5_crypto_init(context, &state->armor_key, 0, &state->armor_crypto); + if (ret) + goto out; +#endif /* WIN32 */ + } else { + + fxarmor->armor_type = 1; + + ret = _krb5_make_fast_ap_fxarmor(context, + state->armor_ccache, + &fxarmor->armor_value, + &state->armor_key, + &state->armor_crypto); + if (ret) + goto out; + } + + + *armor = fxarmor; + fxarmor = NULL; + out: + if (fxarmor) { + free_KrbFastArmor(fxarmor); + free(fxarmor); + } + return ret; +} + +static krb5_error_code +fast_wrap_req(krb5_context context, struct fast_state *state, KDC_REQ *req) +{ + KrbFastArmor *fxarmor = NULL; + PA_FX_FAST_REQUEST fxreq; + krb5_error_code ret; + KrbFastReq fastreq; + krb5_data data; + size_t size; + + if (state->flags & KRB5_FAST_DISABLED) { + _krb5_debug(context, 10, "fast disabled, not doing any fast wrapping"); + return 0; + } + + memset(&fxreq, 0, sizeof(fxreq)); + memset(&fastreq, 0, sizeof(fastreq)); + krb5_data_zero(&data); + + if (state->armor_crypto == NULL) { + if (state->armor_ccache) { + /* + * Instead of keeping state in FX_COOKIE in the KDC, we + * rebuild a new armor key for every request, because this + * is what the MIT KDC expect and RFC6113 is vage about + * what the behavior should be. + */ + state->type = choice_PA_FX_FAST_REQUEST_armored_data; + } else { + return check_fast(context, state); + } + } + + state->flags |= KRB5_FAST_EXPECTED; + + fastreq.fast_options.hide_client_names = 1; + + ret = copy_KDC_REQ_BODY(&req->req_body, &fastreq.req_body); + free_KDC_REQ_BODY(&req->req_body); + + req->req_body.realm = strdup(KRB5_ANON_REALM); + if ((ALLOC(req->req_body.cname, 1)) != NULL) { + req->req_body.cname->name_type = KRB5_NT_WELLKNOWN; + if ((ALLOC(req->req_body.cname->name_string.val, 2)) != NULL) { + req->req_body.cname->name_string.len = 2; + req->req_body.cname->name_string.val[0] = strdup(KRB5_WELLKNOWN_NAME); + req->req_body.cname->name_string.val[1] = strdup(KRB5_ANON_NAME); + if (req->req_body.cname->name_string.val[0] == NULL || + req->req_body.cname->name_string.val[1] == NULL) + ret = krb5_enomem(context); + } else + ret = krb5_enomem(context); + } else + ret = krb5_enomem(context); + if ((ALLOC(req->req_body.till, 1)) != NULL) + *req->req_body.till = 0; + else + ret = krb5_enomem(context); + if (ret) + goto out; + + if (req->padata) { + ret = copy_METHOD_DATA(req->padata, &fastreq.padata); + free_METHOD_DATA(req->padata); + } else { + if ((ALLOC(req->padata, 1)) == NULL) + ret = krb5_enomem(context); + } + if (ret) + goto out; + + ASN1_MALLOC_ENCODE(KrbFastReq, data.data, data.length, &fastreq, &size, ret); + if (ret) + goto out; + heim_assert(data.length == size, "ASN.1 internal error"); + + fxreq.element = state->type; + + if (state->type == choice_PA_FX_FAST_REQUEST_armored_data) { + size_t len; + void *buf; + + ret = make_fast_ap_fxarmor(context, state, fastreq.req_body.realm, &fxreq.u.armored_data.armor); + if (ret) + goto out; + + heim_assert(state->armor_crypto != NULL, "FAST armor key missing when FAST started"); + + ASN1_MALLOC_ENCODE(KDC_REQ_BODY, buf, len, &req->req_body, &size, ret); + if (ret) + goto out; + heim_assert(len == size, "ASN.1 internal error"); + + ret = krb5_create_checksum(context, state->armor_crypto, + KRB5_KU_FAST_REQ_CHKSUM, 0, + buf, len, + &fxreq.u.armored_data.req_checksum); + free(buf); + if (ret) + goto out; + + ret = krb5_encrypt_EncryptedData(context, state->armor_crypto, + KRB5_KU_FAST_ENC, + data.data, + data.length, + 0, + &fxreq.u.armored_data.enc_fast_req); + krb5_data_free(&data); + if (ret) + goto out; + + } else { + krb5_data_free(&data); + heim_assert(false, "unknown FAST type, internal error"); + } + + ASN1_MALLOC_ENCODE(PA_FX_FAST_REQUEST, data.data, data.length, &fxreq, &size, ret); + if (ret) + goto out; + heim_assert(data.length == size, "ASN.1 internal error"); + + + ret = krb5_padata_add(context, req->padata, KRB5_PADATA_FX_FAST, data.data, data.length); + if (ret) + goto out; + krb5_data_zero(&data); + + out: + free_PA_FX_FAST_REQUEST(&fxreq); + free_KrbFastReq(&fastreq); + if (fxarmor) { + free_KrbFastArmor(fxarmor); + free(fxarmor); + } + krb5_data_free(&data); + + return ret; +} + + /** * The core loop if krb5_get_init_creds() function family. Create the * packets and have the caller send them off to the KDC. @@ -1648,6 +2183,7 @@ krb5_error_code ret; size_t len = 0; size_t size; + AS_REQ req2; krb5_data_zero(out); @@ -1682,8 +2218,27 @@ ret = decode_AS_REP(in->data, in->length, &rep.kdc_rep, &size); if (ret == 0) { - krb5_keyblock *key = NULL; unsigned eflags = EXTRACT_TICKET_AS_REQ | EXTRACT_TICKET_TIMESYNC; + krb5_data data; + + /* + * Unwrap AS-REP + */ + ASN1_MALLOC_ENCODE(Ticket, data.data, data.length, + &rep.kdc_rep.ticket, &size, ret); + if (ret) + goto out; + heim_assert(data.length == size, "ASN.1 internal error"); + + ret = fast_unwrap_as_rep(context, ctx->nonce, &data, + &ctx->fast_state, &rep.kdc_rep); + krb5_data_free(&data); + if (ret) + goto out; + + /* + * Now check and extract the ticket + */ if (ctx->flags.canonicalize) { eflags |= EXTRACT_TICKET_ALLOW_SERVER_MISMATCH; @@ -1691,9 +2246,12 @@ } if (ctx->ic_flags & KRB5_INIT_CREDS_NO_C_CANON_CHECK) eflags |= EXTRACT_TICKET_ALLOW_CNAME_MISMATCH; + if (ctx->flags.request_anonymous) + eflags |= EXTRACT_TICKET_MATCH_ANON; ret = process_pa_data_to_key(context, ctx, &ctx->cred, - &ctx->as_req, &rep.kdc_rep, hostinfo, &key); + &ctx->as_req, &rep.kdc_rep, + hostinfo, &ctx->fast_state.reply_key); if (ret) { free_AS_REP(&rep.kdc_rep); goto out; @@ -1704,21 +2262,42 @@ ret = _krb5_extract_ticket(context, &rep, &ctx->cred, - key, + ctx->fast_state.reply_key, NULL, KRB5_KU_AS_REP_ENC_PART, NULL, ctx->nonce, eflags, + &ctx->req_buffer, NULL, NULL); - krb5_free_keyblock(context, key); - - *flags = 0; - + if (ret == 0 && ctx->pk_init_ctx) { + PA_DATA *pa_pkinit_kx; + int idx = 0; + + pa_pkinit_kx = + krb5_find_padata(rep.kdc_rep.padata->val, + rep.kdc_rep.padata->len, + KRB5_PADATA_PKINIT_KX, + &idx); + + ret = _krb5_pk_kx_confirm(context, ctx->pk_init_ctx, + ctx->fast_state.reply_key, + &ctx->cred.session, + pa_pkinit_kx); + if (ret) + krb5_set_error_message(context, ret, + N_("Failed to confirm PA-PKINIT-KX", "")); + else if (pa_pkinit_kx != NULL) + ctx->ic_flags |= KRB5_INIT_CREDS_PKINIT_KX_VALID; + } if (ret == 0) ret = copy_EncKDCRepPart(&rep.enc_part, &ctx->enc_part); + krb5_free_keyblock(context, ctx->fast_state.reply_key); + ctx->fast_state.reply_key = NULL; + *flags = 0; + free_AS_REP(&rep.kdc_rep); free_EncASRepPart(&rep.enc_part); @@ -1739,6 +2318,17 @@ goto out; } + /* + * Unwrap KRB-ERROR + */ + ret = fast_unwrap_error(context, &ctx->fast_state, &ctx->error); + if (ret) + goto out; + + /* + * + */ + ret = krb5_error_from_rd_error(context, &ctx->error, &ctx->cred); _krb5_debug(context, 5, "krb5_get_init_creds: KRB-ERROR %d", ret); @@ -1751,7 +2341,7 @@ if (ret == KRB5KDC_ERR_PREAUTH_REQUIRED) { free_METHOD_DATA(&ctx->md); - memset(&ctx->md, 0, sizeof(ctx->md)); + memset_s(&ctx->md, sizeof(ctx->md), 0, sizeof(ctx->md)); if (ctx->error.e_data) { ret = decode_METHOD_DATA(ctx->error.e_data->data, @@ -1795,14 +2385,79 @@ ret = krb5_principal_set_realm(context, ctx->cred.client, *ctx->error.crealm); + if (ret) + goto out; + + if (krb5_principal_is_krbtgt(context, ctx->cred.server)) { + ret = krb5_init_creds_set_service(context, ctx, NULL); + if (ret) + goto out; + } + + free_AS_REQ(&ctx->as_req); + memset_s(&ctx->as_req, sizeof(ctx->as_req), 0, sizeof(ctx->as_req)); ctx->used_pa_types = 0; + } else if (ret == KRB5KDC_ERR_KEY_EXP && ctx->runflags.change_password == 0 && ctx->prompter) { + char buf2[1024]; + + ctx->runflags.change_password = 1; + + ctx->prompter(context, ctx->prompter_data, NULL, N_("Password has expired", ""), 0, NULL); + + + /* try to avoid recursion */ + if (ctx->in_tkt_service != NULL && strcmp(ctx->in_tkt_service, "kadmin/changepw") == 0) + goto out; + + /* don't try to change password where then where none */ + if (ctx->prompter == NULL) + goto out; + + ret = change_password(context, + ctx->cred.client, + ctx->password, + buf2, + sizeof(buf2), + ctx->prompter, + ctx->prompter_data, + NULL); + if (ret) + goto out; + + krb5_init_creds_set_password(context, ctx, buf2); + + ctx->used_pa_types = 0; + ret = 0; + + } else if (ret == KRB5KDC_ERR_PREAUTH_FAILED) { + + if (ctx->fast_state.flags & KRB5_FAST_DISABLED) + goto out; + if (ctx->fast_state.flags & (KRB5_FAST_REQUIRED | KRB5_FAST_EXPECTED)) + goto out; + + _krb5_debug(context, 10, "preauth failed with FAST, " + "and told by KD or user, trying w/o FAST"); + + ctx->fast_state.flags |= KRB5_FAST_DISABLED; + ctx->used_pa_types = 0; + ret = 0; } if (ret) goto out; } } + if (ctx->as_req.req_body.cname == NULL) { + ret = init_as_req(context, ctx->flags, &ctx->cred, + ctx->addrs, ctx->etypes, &ctx->as_req); + if (ret) { + free_init_creds_ctx(context, ctx); + return ret; + } + } + if (ctx->as_req.padata) { free_METHOD_DATA(ctx->as_req.padata); free(ctx->as_req.padata); @@ -1819,11 +2474,23 @@ if (ret) goto out; + /* + * Wrap with FAST + */ + copy_AS_REQ(&ctx->as_req, &req2); + + ret = fast_wrap_req(context, &ctx->fast_state, &req2); + if (ret) { + free_AS_REQ(&req2); + goto out; + } + krb5_data_free(&ctx->req_buffer); ASN1_MALLOC_ENCODE(AS_REQ, ctx->req_buffer.data, ctx->req_buffer.length, - &ctx->as_req, &len, ret); + &req2, &len, ret); + free_AS_REQ(&req2); if (ret) goto out; if(len != ctx->req_buffer.length) @@ -1875,7 +2542,44 @@ ret = copy_KRB_ERROR(&ctx->error, error); if (ret) - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + krb5_enomem(context); + + return ret; +} + +/** + * + * @ingroup krb5_credential + */ + +krb5_error_code +krb5_init_creds_store(krb5_context context, + krb5_init_creds_context ctx, + krb5_ccache id) +{ + krb5_error_code ret; + + if (ctx->cred.client == NULL) { + ret = KRB5KDC_ERR_PREAUTH_REQUIRED; + krb5_set_error_message(context, ret, "init creds not completed yet"); + return ret; + } + + ret = krb5_cc_initialize(context, id, ctx->cred.client); + if (ret) + return ret; + + ret = krb5_cc_store_cred(context, id, &ctx->cred); + if (ret) + return ret; + + if (ctx->cred.flags.b.enc_pa_rep) { + krb5_data data = { 3, rk_UNCONST("yes") }; + ret = krb5_cc_set_config(context, id, ctx->cred.server, + "fast_avail", &data); + if (ret) + return ret; + } return ret; } @@ -1966,7 +2670,7 @@ krb5_get_init_creds_opt *options) { krb5_init_creds_context ctx; - char buf[BUFSIZ]; + char buf[BUFSIZ], buf2[BUFSIZ]; krb5_error_code ret; int chpw = 0; @@ -1982,11 +2686,19 @@ if (prompter != NULL && ctx->password == NULL && password == NULL) { krb5_prompt prompt; krb5_data password_data; - char *p, *q; + char *p, *q = NULL; + int aret; - krb5_unparse_name (context, client, &p); - asprintf (&q, "%s's Password: ", p); + ret = krb5_unparse_name(context, client, &p); + if (ret) + goto out; + + aret = asprintf(&q, "%s's Password: ", p); free (p); + if (aret == -1 || q == NULL) { + ret = krb5_enomem(context); + goto out; + } prompt.prompt = q; password_data.data = buf; password_data.length = sizeof(buf); @@ -1997,7 +2709,7 @@ ret = (*prompter) (context, data, NULL, NULL, 1, &prompt); free (q); if (ret) { - memset (buf, 0, sizeof(buf)); + memset_s(buf, sizeof(buf), 0, sizeof(buf)); ret = KRB5_LIBOS_PWDINTR; krb5_clear_error_message (context); goto out; @@ -2014,12 +2726,10 @@ ret = krb5_init_creds_get(context, ctx); if (ret == 0) - process_last_request(context, options, ctx); + krb5_process_last_request(context, options, ctx); if (ret == KRB5KDC_ERR_KEY_EXPIRED && chpw == 0) { - char buf2[1024]; - /* try to avoid recursion */ if (in_tkt_service != NULL && strcmp(in_tkt_service, "kadmin/changepw") == 0) goto out; @@ -2028,16 +2738,21 @@ if (prompter == NULL) goto out; + if ((options->flags & KRB5_GET_INIT_CREDS_OPT_CHANGE_PASSWORD_PROMPT) && + !options->change_password_prompt) + goto out; + ret = change_password (context, client, ctx->password, buf2, - sizeof(buf), + sizeof(buf2), prompter, data, options); if (ret) goto out; + password = buf2; chpw = 1; krb5_init_creds_free(context, ctx); goto again; @@ -2050,7 +2765,8 @@ if (ctx) krb5_init_creds_free(context, ctx); - memset(buf, 0, sizeof(buf)); + memset_s(buf, sizeof(buf), 0, sizeof(buf)); + memset_s(buf2, sizeof(buf), 0, sizeof(buf2)); return ret; } @@ -2089,7 +2805,7 @@ ret = krb5_init_creds_get(context, ctx); if (ret == 0) - process_last_request(context, options, ctx); + krb5_process_last_request(context, options, ctx); out: if (ret == 0) @@ -2117,10 +2833,22 @@ krb5_get_init_creds_opt *options) { krb5_init_creds_context ctx; + krb5_keytab_entry ktent; krb5_error_code ret; + memset(&ktent, 0, sizeof(ktent)); memset(creds, 0, sizeof(*creds)); + if (strcmp(client->realm, "") == 0) { + /* + * Referral realm. We have a keytab, so pick a realm by + * matching in the keytab. + */ + ret = krb5_kt_get_entry(context, keytab, client, 0, 0, &ktent); + if (ret == 0) + client = ktent.principal; + } + ret = krb5_init_creds_init(context, client, NULL, NULL, start_time, options, &ctx); if (ret) goto out; @@ -2135,9 +2863,10 @@ ret = krb5_init_creds_get(context, ctx); if (ret == 0) - process_last_request(context, options, ctx); + krb5_process_last_request(context, options, ctx); out: + krb5_kt_free_entry(context, &ktent); if (ret == 0) krb5_init_creds_get_creds(context, ctx, creds); diff --git a/crypto/heimdal/lib/krb5/kcm.c b/crypto/heimdal/lib/krb5/kcm.c --- a/crypto/heimdal/lib/krb5/kcm.c +++ b/crypto/heimdal/lib/krb5/kcm.c @@ -224,7 +224,7 @@ if (k != NULL) { if (k->name != NULL) free(k->name); - memset(k, 0, sizeof(*k)); + memset_s(k, sizeof(*k), 0, sizeof(*k)); krb5_data_free(&(*id)->data); } } @@ -553,9 +553,7 @@ c = calloc(1, sizeof(*c)); if (c == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); return ret; } @@ -577,9 +575,7 @@ if (ptr == NULL) { free(c->uuids); free(c); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } c->uuids = ptr; @@ -788,9 +784,7 @@ c = calloc(1, sizeof(*c)); if (c == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } @@ -819,9 +813,7 @@ ptr = realloc(c->uuids, sizeof(c->uuids[0]) * (c->length + 1)); if (ptr == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } c->uuids = ptr; @@ -963,6 +955,7 @@ krb5_storage *request, *response; krb5_data response_data; char *name; + int aret; *str = NULL; @@ -981,9 +974,9 @@ if (ret) return ret; - asprintf(str, "%s:%s", ops->prefix, name); + aret = asprintf(str, "%s:%s", ops->prefix, name); free(name); - if (str == NULL) + if (aret == -1 || str == NULL) return ENOMEM; return 0; diff --git a/crypto/heimdal/lib/krb5/kerberos.8 b/crypto/heimdal/lib/krb5/kerberos.8 --- a/crypto/heimdal/lib/krb5/kerberos.8 +++ b/crypto/heimdal/lib/krb5/kerberos.8 @@ -31,7 +31,7 @@ .\" .\" $Id$ .\" -.Dd May 15, 2021 +.Dd Jun 27, 2013 .Dt KERBEROS 8 .Os HEIMDAL .Sh NAME @@ -71,12 +71,9 @@ .Ic ftp , without giving your password. .Pp -For more information on how Kerberos works, see the tutorial at -.Lk https://kerberos.org/software/tutorial.html -or the informal -.Dq dialogue -at -.Lk https://web.mit.edu/kerberos/dialogue.html . +For more information on how Kerberos works, and other general Kerberos +questions see the Kerberos FAQ at +.Lk http://www.cmf.nrl.navy.mil/krb/kerberos-faq.html . .Pp For setup instructions see the Heimdal Texinfo manual. .Sh SEE ALSO @@ -85,7 +82,12 @@ .Xr kinit 1 , .Xr klist 1 , .Xr kpasswd 1 , -.Xr telnet 1 +.Xr telnet 1 , +.Xr krb5 3 , +.Xr krb5.conf 5 , +.Xr kadmin 1 , +.Xr kdc 8 , +.Xr ktutil 1 .Sh HISTORY The Kerberos authentication system was developed in the late 1980's as part of the Athena Project at the Massachusetts Institute of diff --git a/crypto/heimdal/lib/krb5/kerberos.cat8 b/crypto/heimdal/lib/krb5/kerberos.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/kerberos.cat8 @@ -0,0 +1,57 @@ +KERBEROS(8) BSD System Manager's Manual KERBEROS(8) + +NAME + kerberos -- introduction to the Kerberos system + +DESCRIPTION + Kerberos is a network authentication system. Its purpose is to securely + authenticate users and services in an insecure network environment. + + This is done with a Kerberos server acting as a trusted third party, + keeping a database with secret keys for all users and services (collec- + tively called principals). + + Each principal belongs to exactly one realm, which is the administrative + domain in Kerberos. A realm usually corresponds to an organisation, and + the realm should normally be derived from that organisation's domain + name. A realm is served by one or more Kerberos servers. + + The authentication process involves exchange of `tickets' and + `authenticators' which together prove the principal's identity. + + When you login to the Kerberos system, either through the normal system + login or with the kinit(1) program, you acquire a ticket granting ticket + which allows you to get new tickets for other services, such as telnet or + ftp, without giving your password. + + For more information on how Kerberos works, and other general Kerberos + questions see the Kerberos FAQ at + http://www.cmf.nrl.navy.mil/krb/kerberos-faq.html + + For setup instructions see the Heimdal Texinfo manual. + +SEE ALSO + ftp(1), kdestroy(1), kinit(1), klist(1), kpasswd(1), telnet(1), krb5(3), + krb5.conf(5), kadmin(1), kdc(8), ktutil(1) + +HISTORY + The Kerberos authentication system was developed in the late 1980's as + part of the Athena Project at the Massachusetts Institute of Technology. + Versions one through three never reached outside MIT, but version 4 was + (and still is) quite popular, especially in the academic community, but + is also used in commercial products like the AFS filesystem. + + The problems with version 4 are that it has many limitations, the code + was not too well written (since it had been developed over a long time), + and it has a number of known security problems. To resolve many of these + issues work on version five started, and resulted in IETF RFC 1510 in + 1993. IETF RFC 1510 was obsoleted in 2005 with IETF RFC 4120, also known + as Kerberos clarifications. With the arrival of IETF RFC 4120, the work + on adding extensibility and internationalization have started (Kerberos + extensions), and a new RFC will hopefully appear soon. + + This manual page is part of the Heimdal Kerberos 5 distribution, which + has been in development at the Royal Institute of Technology in Stock- + holm, Sweden, since about 1997. + +HEIMDAL Jun 27, 2013 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/keyblock.c b/crypto/heimdal/lib/krb5/keyblock.c --- a/crypto/heimdal/lib/krb5/keyblock.c +++ b/crypto/heimdal/lib/krb5/keyblock.c @@ -65,7 +65,7 @@ if (keyblock->keyvalue.data != NULL) memset(keyblock->keyvalue.data, 0, keyblock->keyvalue.length); krb5_data_free (&keyblock->keyvalue); - keyblock->keytype = ENCTYPE_NULL; + keyblock->keytype = KRB5_ENCTYPE_NULL; } } @@ -135,10 +135,8 @@ *to = NULL; k = calloc (1, sizeof(*k)); - if (k == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - return ENOMEM; - } + if (k == NULL) + return krb5_enomem(context); ret = krb5_copy_keyblock_contents (context, inblock, k); if (ret) { diff --git a/crypto/heimdal/lib/krb5/keytab.c b/crypto/heimdal/lib/krb5/keytab.c --- a/crypto/heimdal/lib/krb5/keytab.c +++ b/crypto/heimdal/lib/krb5/keytab.c @@ -153,11 +153,8 @@ tmp = realloc(context->kt_types, (context->num_kt_types + 1) * sizeof(*context->kt_types)); - if(tmp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if(tmp == NULL) + return krb5_enomem(context); memcpy(&tmp[context->num_kt_types], ops, sizeof(tmp[context->num_kt_types])); context->kt_types = tmp; @@ -173,7 +170,7 @@ residual = strchr(name, ':'); if (residual == NULL || - name[0] == '/' + ISPATHSEP(name[0]) #ifdef _WIN32 /* Avoid treating : as a keytab type * specification */ @@ -232,10 +229,8 @@ } k = malloc (sizeof(*k)); - if (k == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (k == NULL) + return krb5_enomem(context); memcpy(k, &context->kt_types[i], sizeof(*k)); k->data = NULL; ret = (*k->resolve)(context, residual, k); @@ -247,6 +242,21 @@ return ret; } +/* + * Default ktname from context with possible environment + * override + */ +static const char *default_ktname(krb5_context context) +{ + const char *tmp = NULL; + + if(!issuid()) + tmp = getenv("KRB5_KTNAME"); + if(tmp != NULL) + return tmp; + return context->default_keytab; +} + /** * copy the name of the default keytab into `name'. * @@ -262,7 +272,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_name(krb5_context context, char *name, size_t namesize) { - if (strlcpy (name, context->default_keytab, namesize) >= namesize) { + if (strlcpy (name, default_ktname(context), namesize) >= namesize) { krb5_clear_error_message (context); return KRB5_CONFIG_NOTENUFSPACE; } @@ -284,17 +294,18 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_modify_name(krb5_context context, char *name, size_t namesize) { - const char *kt = NULL; + const char *kt; + if(context->default_keytab_modify == NULL) { - if(strncasecmp(context->default_keytab, "ANY:", 4) != 0) - kt = context->default_keytab; - else { - size_t len = strcspn(context->default_keytab + 4, ","); - if(len >= namesize) { + kt = default_ktname(context); + + if (strncasecmp(kt, "ANY:", 4) == 0) { + size_t len = strcspn(kt + 4, ","); + if (len >= namesize) { krb5_clear_error_message(context); return KRB5_CONFIG_NOTENUFSPACE; } - strlcpy(name, context->default_keytab + 4, namesize); + strlcpy(name, kt + 4, namesize); name[len] = '\0'; return 0; } @@ -321,7 +332,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default(krb5_context context, krb5_keytab *id) { - return krb5_kt_resolve (context, context->default_keytab, id); + return krb5_kt_resolve (context, default_ktname(context), id); } /** @@ -450,9 +461,8 @@ return ret; if (asprintf(str, "%s:%s", type, name) == -1) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); *str = NULL; - return ENOMEM; + return krb5_enomem(context); } return 0; @@ -512,7 +522,7 @@ */ static krb5_boolean -compare_aliseses(krb5_context context, +compare_aliases(krb5_context context, krb5_keytab_entry *entry, krb5_const_principal principal) { @@ -548,18 +558,24 @@ krb5_kvno vno, krb5_enctype enctype) { - if(principal != NULL && - !(krb5_principal_compare(context, entry->principal, principal) || - compare_aliseses(context, entry, principal))) + /* krb5_principal_compare() does not special-case the referral realm */ + if (principal != NULL && strcmp(principal->realm, "") == 0 && + !(krb5_principal_compare_any_realm(context, entry->principal, principal) || + compare_aliases(context, entry, principal))) { + return FALSE; + } else if (principal != NULL && strcmp(principal->realm, "") != 0 && + !(krb5_principal_compare(context, entry->principal, principal) || + compare_aliases(context, entry, principal))) { return FALSE; - if(vno && vno != entry->vno) + } + if (vno && vno != entry->vno) return FALSE; - if(enctype && enctype != entry->keyblock.keytype) + if (enctype && enctype != entry->keyblock.keytype) return FALSE; return TRUE; } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_kt_principal_not_found(krb5_context context, krb5_error_code ret, krb5_keytab id, @@ -572,7 +588,8 @@ krb5_unparse_name_fixed (context, principal, princ, sizeof(princ)); krb5_kt_get_full_name (context, id, &kt_name); - krb5_enctype_to_string(context, enctype, &enctype_str); + if (enctype) + krb5_enctype_to_string(context, enctype, &enctype_str); if (kvno) snprintf(kvno_str, sizeof(kvno_str), "(kvno %d)", kvno); @@ -587,34 +604,18 @@ kt_name ? kt_name : "unknown keytab", enctype_str ? enctype_str : "unknown enctype"); free(kt_name); - free(enctype_str); + if (enctype_str) + free(enctype_str); return ret; } - -/** - * Retrieve the keytab entry for `principal, kvno, enctype' into `entry' - * from the keytab `id'. Matching is done like krb5_kt_compare(). - * - * @param context a Keberos context. - * @param id a keytab. - * @param principal principal to match, NULL matches all principals. - * @param kvno key version to match, 0 matches all key version numbers. - * @param enctype encryption type to match, 0 matches all encryption types. - * @param entry the returned entry, free with krb5_kt_free_entry(). - * - * @return Return an error code or 0, see krb5_get_error_message(). - * - * @ingroup krb5_keytab - */ - -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_kt_get_entry(krb5_context context, - krb5_keytab id, - krb5_const_principal principal, - krb5_kvno kvno, - krb5_enctype enctype, - krb5_keytab_entry *entry) +static krb5_error_code +krb5_kt_get_entry_wrapped(krb5_context context, + krb5_keytab id, + krb5_const_principal principal, + krb5_kvno kvno, + krb5_enctype enctype, + krb5_keytab_entry *entry) { krb5_keytab_entry tmp; krb5_error_code ret; @@ -658,6 +659,63 @@ return 0; } +/** + * Retrieve the keytab entry for `principal, kvno, enctype' into `entry' + * from the keytab `id'. Matching is done like krb5_kt_compare(). + * + * @param context a Keberos context. + * @param id a keytab. + * @param principal principal to match, NULL matches all principals. + * @param kvno key version to match, 0 matches all key version numbers. + * @param enctype encryption type to match, 0 matches all encryption types. + * @param entry the returned entry, free with krb5_kt_free_entry(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_kt_get_entry(krb5_context context, + krb5_keytab id, + krb5_const_principal principal, + krb5_kvno kvno, + krb5_enctype enctype, + krb5_keytab_entry *entry) +{ + krb5_error_code ret; + krb5_const_principal try_princ; + krb5_name_canon_iterator name_canon_iter; + + if (!principal) + return krb5_kt_get_entry_wrapped(context, id, principal, kvno, enctype, + entry); + + ret = krb5_name_canon_iterator_start(context, principal, &name_canon_iter); + if (ret) + return ret; + + do { + ret = krb5_name_canon_iterate(context, &name_canon_iter, &try_princ, + NULL); + if (ret) + break; + if (try_princ == NULL) { + ret = KRB5_KT_NOTFOUND; + continue; + } + ret = krb5_kt_get_entry_wrapped(context, id, try_princ, kvno, + enctype, entry); + } while (ret == KRB5_KT_NOTFOUND && name_canon_iter); + + if (ret != KRB5_KT_NOTFOUND) + krb5_set_error_message(context, ret, + N_("Name canon failed while searching keytab", + "")); + krb5_free_name_canon_iterator(context, name_canon_iter); + return ret; +} + /** * Copy the contents of `in' into `out'. * @@ -864,7 +922,7 @@ * @ingroup krb5_keytab */ -KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_have_content(krb5_context context, krb5_keytab id) { diff --git a/crypto/heimdal/lib/krb5/keytab_any.c b/crypto/heimdal/lib/krb5/keytab_any.c --- a/crypto/heimdal/lib/krb5/keytab_any.c +++ b/crypto/heimdal/lib/krb5/keytab_any.c @@ -63,15 +63,14 @@ while (strsep_copy(&name, ",", buf, sizeof(buf)) != -1) { a = calloc(1, sizeof(*a)); if (a == NULL) { - ret = ENOMEM; + ret = krb5_enomem(context); goto fail; } if (a0 == NULL) { a0 = a; a->name = strdup(buf); if (a->name == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto fail; } } else @@ -131,10 +130,8 @@ krb5_error_code ret; c->data = malloc (sizeof(struct any_cursor_extra_data)); - if(c->data == NULL){ - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if(c->data == NULL) + return krb5_enomem(context); ed = (struct any_cursor_extra_data *)c->data; for (ed->a = a; ed->a != NULL; ed->a = ed->a->next) { ret = krb5_kt_start_seq_get(context, ed->a->kt, &ed->cursor); @@ -257,5 +254,7 @@ any_next_entry, any_end_seq_get, any_add_entry, - any_remove_entry + any_remove_entry, + NULL, + 0 }; diff --git a/crypto/heimdal/lib/krb5/keytab_file.c b/crypto/heimdal/lib/krb5/keytab_file.c --- a/crypto/heimdal/lib/krb5/keytab_file.c +++ b/crypto/heimdal/lib/krb5/keytab_file.c @@ -59,10 +59,8 @@ return ret; data->length = size; data->data = malloc(size); - if (data->data == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (data->data == NULL) + return krb5_enomem(context); ret = krb5_storage_read(sp, data->data, size); if(ret != size) return (ret < 0)? errno : KRB5_KT_END; @@ -80,10 +78,8 @@ if(ret) return ret; *data = malloc(size + 1); - if (*data == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*data == NULL) + return krb5_enomem(context); ret = krb5_storage_read(sp, *data, size); (*data)[size] = '\0'; if(ret != size) @@ -188,11 +184,8 @@ int16_t len; ALLOC(p, 1); - if(p == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if(p == NULL) + return krb5_enomem(context); ret = krb5_ret_int16(sp, &len); if(ret) { @@ -221,8 +214,7 @@ } p->name.name_string.val = calloc(len, sizeof(*p->name.name_string.val)); if(p->name.name_string.val == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } p->name.name_string.len = len; @@ -292,15 +284,12 @@ struct fkt_data *d; d = malloc(sizeof(*d)); - if(d == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if(d == NULL) + return krb5_enomem(context); d->filename = strdup(name); if(d->filename == NULL) { free(d); - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } d->flags = 0; id->data = d; @@ -397,9 +386,7 @@ if (c->sp == NULL) { _krb5_xunlock(context, c->fd); close(c->fd); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } krb5_storage_set_eof_code(c->sp, KRB5_KT_END); ret = krb5_ret_int8(c->sp, &pvno); @@ -499,6 +486,8 @@ if(start) *start = pos; if(end) *end = pos + 4 + len; out: + if (ret) + krb5_kt_free_entry(context, entry); krb5_storage_seek(cursor->sp, pos + 4 + len, SEEK_SET); return ret; } @@ -622,9 +611,7 @@ krb5_storage *emem; emem = krb5_storage_emem(); if(emem == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } ret = krb5_kt_store_principal(context, emem, entry->principal); @@ -776,7 +763,9 @@ fkt_next_entry, fkt_end_seq_get, fkt_add_entry, - fkt_remove_entry + fkt_remove_entry, + NULL, + 0 }; const krb5_kt_ops krb5_wrfkt_ops = { @@ -790,7 +779,9 @@ fkt_next_entry, fkt_end_seq_get, fkt_add_entry, - fkt_remove_entry + fkt_remove_entry, + NULL, + 0 }; const krb5_kt_ops krb5_javakt_ops = { @@ -804,5 +795,7 @@ fkt_next_entry, fkt_end_seq_get, fkt_add_entry, - fkt_remove_entry + fkt_remove_entry, + NULL, + 0 }; diff --git a/crypto/heimdal/lib/krb5/keytab_keyfile.c b/crypto/heimdal/lib/krb5/keytab_keyfile.c --- a/crypto/heimdal/lib/krb5/keytab_keyfile.c +++ b/crypto/heimdal/lib/krb5/keytab_keyfile.c @@ -89,11 +89,8 @@ fclose(f); d->cell = strdup (buf); - if (d->cell == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (d->cell == NULL) + return krb5_enomem(context); f = fopen (AFS_SERVERMAGICKRBCONF, "r"); if (f != NULL) { @@ -117,9 +114,7 @@ if (d->realm == NULL) { free (d->cell); d->cell = NULL; - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } return 0; } @@ -132,13 +127,10 @@ akf_resolve(krb5_context context, const char *name, krb5_keytab id) { int ret; - struct akf_data *d = malloc(sizeof (struct akf_data)); + struct akf_data *d = calloc(1, sizeof (struct akf_data)); - if (d == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (d == NULL) + return krb5_enomem(context); d->num_entries = 0; ret = get_cell_and_realm (context, d); @@ -151,9 +143,7 @@ free (d->cell); free (d->realm); free (d); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } id->data = d; @@ -271,9 +261,7 @@ entry->keyblock.keyvalue.data = malloc (8); if (entry->keyblock.keyvalue.data == NULL) { krb5_free_principal (context, entry->principal); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - ret = ENOMEM; + ret = krb5_enomem(context); goto out; } @@ -348,9 +336,7 @@ sp = krb5_storage_from_fd(fd); if(sp == NULL) { close(fd); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } if (created) len = 0; @@ -462,7 +448,9 @@ akf_next_entry, akf_end_seq_get, akf_add_entry, - NULL /* remove */ + NULL, /* remove */ + NULL, + 0 }; #endif /* HEIMDAL_SMALLER */ diff --git a/crypto/heimdal/lib/krb5/keytab_memory.c b/crypto/heimdal/lib/krb5/keytab_memory.c --- a/crypto/heimdal/lib/krb5/keytab_memory.c +++ b/crypto/heimdal/lib/krb5/keytab_memory.c @@ -73,17 +73,13 @@ d = calloc(1, sizeof(*d)); if(d == NULL) { HEIMDAL_MUTEX_unlock(&mkt_mutex); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } d->name = strdup(name); if (d->name == NULL) { HEIMDAL_MUTEX_unlock(&mkt_mutex); free(d); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } d->entries = NULL; d->num_entries = 0; @@ -175,11 +171,8 @@ struct mkt_data *d = id->data; krb5_keytab_entry *tmp; tmp = realloc(d->entries, (d->num_entries + 1) * sizeof(*d->entries)); - if(tmp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (tmp == NULL) + return krb5_enomem(context); d->entries = tmp; return krb5_kt_copy_entry_contents(context, entry, &d->entries[d->num_entries++]); @@ -232,5 +225,7 @@ mkt_next_entry, mkt_end_seq_get, mkt_add_entry, - mkt_remove_entry + mkt_remove_entry, + NULL, + 0 }; diff --git a/crypto/heimdal/lib/krb5/krb5-plugin.7 b/crypto/heimdal/lib/krb5/krb5-plugin.7 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5-plugin.7 @@ -0,0 +1,245 @@ +.\" Copyright (c) 1999 - 2005 Kungliga Tekniska Högskolan +.\" (Royal Institute of Technology, Stockholm, Sweden). +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" 3. Neither the name of the Institute nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $Id$ +.\" +.Dd December 21, 2011 +.Dt KRB5-PLUGIN 7 +.Os HEIMDAL +.Sh NAME +.Nm krb5-plugin +.Nd plugin interface for Heimdal +.Sh SYNOPSIS +.In krb5.h +.In krb5/an2ln_plugin.h +.In krb5/ccache_plugin.h +.In krb5/db_plugin.h +.In krb5/kuserok_plugin.h +.In krb5/locate_plugin.h +.In krb5/send_to_kdc_plugin.h +.Sh DESCRIPTION +Heimdal has a plugin interface. Plugins may be statically linked into +Heimdal and registered via the +.Xr krb5_plugin_register 3 +function, or they may be dynamically loaded from shared objects present +in the Heimdal plugins directories. +.Pp +Plugins consist of a C struct whose struct name is given in the +associated header file, such as, for example, +.Va krb5plugin_kuserok_ftable +and a pointer to which is either registered via +.Xr krb5_plugin_register 3 +or found in a shared object via a symbol lookup for the symbol name +defined in the associated header file (e.g., "kuserok" for the +plugin for +.Xr krb5_kuserok 3 +). +.Pp +The plugin structs for all plugin types always begin with the same three +common fields: +.Bl -enum -compact +.It +.Va minor_version +, an int. Plugin minor versions are defined in each plugin type's +associated header file. +.It +.Va init +, a pointer to a function with two arguments, a krb5_context and a +void **, returning a krb5_error_code. This function will be called to +initialize a plugin-specific context in the form of a void * that will +be output through the init function's second argument. +.It +.Va fini +, a pointer to a function of one argument, a void *, consisting of the +plugin's context to be destroyed, and returning void. +.El +.Pp +Each plugin type must add zero or more fields to this struct following +the above three. Plugins are typically invoked in no particular order +until one succeeds or fails, or all return a special return value such +as KRB5_PLUGIN_NO_HANDLE to indicate that the plugin was not applicable. +Most plugin types obtain deterministic plugin behavior in spite of the +non-deterministic invocation order by, for example, invoking all plugins +for each "rule" and passing the rule to each plugin with the expectation +that just one plugin will match any given rule. +.Pp +There is a database plugin system intended for many of the uses of +databases in Heimdal. The plugin is expected to call +.Xr heim_db_register 3 +from its +.Va init +entry point to register a DB type. The DB plugin's +.Va fini +function must do nothing, and the plugin must not provide any other +entry points. +.Pp +The krb5_kuserok plugin adds a single field to its struct: a pointer to +a function that implements kuserok functionality with the following +form: +.Bd -literal -offset indent +static krb5_error_code +kuserok(void *plug_ctx, krb5_context context, const char *rule, + unsigned int flags, const char *k5login_dir, + const char *luser, krb5_const_principal principal, + krb5_boolean *result) +.Ed +.Pp +The +.Va luser +, +.Va principal +and +.Va result +arguments are self-explanatory (see +.Xr krb5_kuserok 3 +). The +.Va plug_ctx +argument is the context output by the plugin's init function. The +.Va rule +argument is a kuserok rule from the krb5.conf file; each plugin is invoked once +for each rule until all plugins fail or one succeeds. The +.Va k5login_dir +argument provides an alternative k5login file location, if not NULL. +The +.Va flags +argument indicates whether the plugin may call +.Xr krb5_aname_to_localname 3 +(KUSEROK_ANAME_TO_LNAME_OK), and whether k5login databases are expected to be +authoritative (KUSEROK_K5LOGIN_IS_AUTHORITATIVE). +.Pp +The plugin for +.Xr krb5_aname_to_localname 3 +is named "an2ln" and has a single extra field for the plugin struct: +.Bd -literal -offset indent +typedef krb5_error_code (*set_result_f)(void *, const char *); + +static krb5_error_code +an2ln(void *plug_ctx, krb5_context context, const char *rule, + krb5_const_principal aname, set_result_f set_res_f, void *set_res_ctx) +.Ed +.Pp +The arguments for the +.Va an2ln +plugin are similar to those of the kuserok plugin, but the result, being +a string, is set by calling the +.Va set_res_f +function argument with the +.Va set_res_ctx +and result string as arguments. The +.Va set_res_f +function will make a copy of the string. +.Sh FILES +.Bl -tag -compact +.It Pa libdir/plugin/krb5/* +Shared objects containing plugins for Heimdal. +.El +.Sh EXAMPLES +.Pp +An example an2ln plugin that maps principals to a constant "nouser" +follows: +.Pp +.Bd -literal -offset indent +#include + +static krb5_error_code KRB5_CALLCONV +nouser_plug_init(krb5_context context, void **ctx) +{ + *ctx = NULL; + return 0; +} + +static void KRB5_CALLCONV nouser_plug_fini(void *ctx) { } + +static krb5_error_code KRB5_CALLCONV +nouser_plug_an2ln(void *plug_ctx, krb5_context context, + const char *rule, + krb5_const_principal aname, + set_result_f set_res_f, void *set_res_ctx) +{ + krb5_error_code ret; + + if (strcmp(rule, "NOUSER") != 0) + return KRB5_PLUGIN_NO_HANDLE; + + ret = set_res_f(set_res_ctx, "nouser"); + + return ret; +} + +krb5plugin_an2ln_ftable an2ln = { + KRB5_PLUGIN_AN2LN_VERSION_0, + nouser_plug_init, + nouser_plug_fini, + nouser_plug_an2ln, +}; +.Ed +.Pp +An example kuserok plugin that rejects all requests follows. (Note that +there exists a built-in plugin with this functionality; see +.Xr krb5_kuserok 3 +). +.Pp +.Bd -literal -offset indent +#include + +static krb5_error_code KRB5_CALLCONV +reject_plug_init(krb5_context context, void **ctx) +{ + *ctx = NULL; + return 0; +} + +static void KRB5_CALLCONV reject_plug_fini(void *ctx) { } + +static krb5_error_code KRB5_CALLCONV +reject_plug_kuserok(void *plug_ctx, krb5_context context, const char *rule, + unsigned int flags, const char *k5login_dir, + const char *luser, krb5_const_principal principal, + krb5_boolean *result) +{ + if (strcmp(rule, "REJECT") != 0) + return KRB5_PLUGIN_NO_HANDLE; + + *result = FALSE; + return 0; +} + +krb5plugin_kuserok_ftable kuserok = { + KRB5_PLUGIN_KUSEROK_VERSION_0, + reject_plug_init, + reject_plug_fini, + reject_plug_kuserok, +}; +.Ed +.Sh SEE ALSO +.Xr krb5_plugin_register 3 +.Xr krb5_kuserok 3 +.Xr krb5_aname_to_localname 3 diff --git a/crypto/heimdal/lib/krb5/krb5-plugin.cat7 b/crypto/heimdal/lib/krb5/krb5-plugin.cat7 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5-plugin.cat7 @@ -0,0 +1,167 @@ +KRB5-PLUGIN(7) BSD Miscellaneous Information Manual KRB5-PLUGIN(7) + +NAME + krb5-plugin -- plugin interface for Heimdal + +SYNOPSIS + #include  + #include  + #include  + #include  + #include  + #include  + #include  + +DESCRIPTION + Heimdal has a plugin interface. Plugins may be statically linked into + Heimdal and registered via the krb5_plugin_register(3) function, or they + may be dynamically loaded from shared objects present in the Heimdal + plugins directories. + + Plugins consist of a C struct whose struct name is given in the associ- + ated header file, such as, for example, krb5plugin_kuserok_ftable and a + pointer to which is either registered via krb5_plugin_register(3) or + found in a shared object via a symbol lookup for the symbol name defined + in the associated header file (e.g., "kuserok" for the plugin for + krb5_kuserok(3) ). + + The plugin structs for all plugin types always begin with the same three + common fields: + 1. minor_version , an int. Plugin minor versions are defined in each + plugin type's associated header file. + 2. init , a pointer to a function with two arguments, a krb5_context + and a void **, returning a krb5_error_code. This function will be + called to initialize a plugin-specific context in the form of a void + * that will be output through the init function's second argument. + 3. fini , a pointer to a function of one argument, a void *, consisting + of the plugin's context to be destroyed, and returning void. + + Each plugin type must add zero or more fields to this struct following + the above three. Plugins are typically invoked in no particular order + until one succeeds or fails, or all return a special return value such as + KRB5_PLUGIN_NO_HANDLE to indicate that the plugin was not applicable. + Most plugin types obtain deterministic plugin behavior in spite of the + non-deterministic invocation order by, for example, invoking all plugins + for each "rule" and passing the rule to each plugin with the expectation + that just one plugin will match any given rule. + + There is a database plugin system intended for many of the uses of data- + bases in Heimdal. The plugin is expected to call heim_db_register(3) + from its init entry point to register a DB type. The DB plugin's fini + function must do nothing, and the plugin must not provide any other entry + points. + + The krb5_kuserok plugin adds a single field to its struct: a pointer to a + function that implements kuserok functionality with the following form: + + static krb5_error_code + kuserok(void *plug_ctx, krb5_context context, const char *rule, + unsigned int flags, const char *k5login_dir, + const char *luser, krb5_const_principal principal, + krb5_boolean *result) + + The luser , principal and result arguments are self-explanatory (see + krb5_kuserok(3) ). The plug_ctx argument is the context output by the + plugin's init function. The rule argument is a kuserok rule from the + krb5.conf file; each plugin is invoked once for each rule until all plug- + ins fail or one succeeds. The k5login_dir argument provides an alterna- + tive k5login file location, if not NULL. The flags argument indicates + whether the plugin may call krb5_aname_to_localname(3) + (KUSEROK_ANAME_TO_LNAME_OK), and whether k5login databases are expected + to be authoritative (KUSEROK_K5LOGIN_IS_AUTHORITATIVE). + + The plugin for krb5_aname_to_localname(3) is named "an2ln" and has a sin- + gle extra field for the plugin struct: + + typedef krb5_error_code (*set_result_f)(void *, const char *); + + static krb5_error_code + an2ln(void *plug_ctx, krb5_context context, const char *rule, + krb5_const_principal aname, set_result_f set_res_f, void *set_res_ctx) + + The arguments for the an2ln plugin are similar to those of the kuserok + plugin, but the result, being a string, is set by calling the set_res_f + function argument with the set_res_ctx and result string as arguments. + The set_res_f function will make a copy of the string. + +FILES + libdir/plugin/krb5/* + Shared objects containing plugins for Heimdal. + +EXAMPLES + An example an2ln plugin that maps principals to a constant "nouser" fol- + lows: + + #include + + static krb5_error_code KRB5_CALLCONV + nouser_plug_init(krb5_context context, void **ctx) + { + *ctx = NULL; + return 0; + } + + static void KRB5_CALLCONV nouser_plug_fini(void *ctx) { } + + static krb5_error_code KRB5_CALLCONV + nouser_plug_an2ln(void *plug_ctx, krb5_context context, + const char *rule, + krb5_const_principal aname, + set_result_f set_res_f, void *set_res_ctx) + { + krb5_error_code ret; + + if (strcmp(rule, "NOUSER") != 0) + return KRB5_PLUGIN_NO_HANDLE; + + ret = set_res_f(set_res_ctx, "nouser"); + + return ret; + } + + krb5plugin_an2ln_ftable an2ln = { + KRB5_PLUGIN_AN2LN_VERSION_0, + nouser_plug_init, + nouser_plug_fini, + nouser_plug_an2ln, + }; + + An example kuserok plugin that rejects all requests follows. (Note that + there exists a built-in plugin with this functionality; see + krb5_kuserok(3) ). + + #include + + static krb5_error_code KRB5_CALLCONV + reject_plug_init(krb5_context context, void **ctx) + { + *ctx = NULL; + return 0; + } + + static void KRB5_CALLCONV reject_plug_fini(void *ctx) { } + + static krb5_error_code KRB5_CALLCONV + reject_plug_kuserok(void *plug_ctx, krb5_context context, const char *rule, + unsigned int flags, const char *k5login_dir, + const char *luser, krb5_const_principal principal, + krb5_boolean *result) + { + if (strcmp(rule, "REJECT") != 0) + return KRB5_PLUGIN_NO_HANDLE; + + *result = FALSE; + return 0; + } + + krb5plugin_kuserok_ftable kuserok = { + KRB5_PLUGIN_KUSEROK_VERSION_0, + reject_plug_init, + reject_plug_fini, + reject_plug_kuserok, + }; + +SEE ALSO + krb5_plugin_register(3) krb5_kuserok(3) krb5_aname_to_localname(3) + +HEIMDAL December 21, 2011 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5-private.h b/crypto/heimdal/lib/krb5/krb5-private.h --- a/crypto/heimdal/lib/krb5/krb5-private.h +++ b/crypto/heimdal/lib/krb5/krb5-private.h @@ -9,18 +9,28 @@ #endif #ifndef KRB5_DEPRECATED_FUNCTION -#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 ))) +#ifndef __has_extension +#define __has_extension(x) 0 +#define KRB5_DEPRECATED_FUNCTIONhas_extension 1 +#endif +#if __has_extension(attribute_deprecated_with_message) +#define KRB5_DEPRECATED_FUNCTION(x) __attribute__((__deprecated__(x))) +#elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 ))) #define KRB5_DEPRECATED_FUNCTION(X) __attribute__((__deprecated__)) #else #define KRB5_DEPRECATED_FUNCTION(X) #endif +#ifdef KRB5_DEPRECATED_FUNCTIONhas_extension +#undef __has_extension +#undef KRB5_DEPRECATED_FUNCTIONhas_extension #endif +#endif /* KRB5_DEPRECATED_FUNCTION */ -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _heim_krb5_ipc_client_clear_target (void); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _heim_krb5_ipc_client_set_target_uid (uid_t /*uid*/); void @@ -39,6 +49,15 @@ unsigned /*usage*/, Checksum */*result*/); +krb5_error_code +_krb5_SP800_108_HMAC_KDF ( + krb5_context /*context*/, + const krb5_data */*kdf_K1*/, + const krb5_data */*kdf_label*/, + const krb5_data */*kdf_context*/, + const EVP_MD */*md*/, + krb5_data */*kdf_K0*/); + krb5_error_code _krb5_SP_HMAC_SHA1_checksum ( krb5_context /*context*/, @@ -48,6 +67,12 @@ unsigned /*usage*/, Checksum */*result*/); +krb5_error_code +_krb5_aes_sha2_md_for_enctype ( + krb5_context /*context*/, + krb5_enctype /*enctype*/, + const EVP_MD **/*md*/); + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_build_authenticator ( krb5_context /*context*/, @@ -59,6 +84,12 @@ krb5_key_usage /*usage*/); krb5_error_code +_krb5_build_authpack_subjectPK_EC ( + krb5_context /*context*/, + krb5_pk_init_ctx /*ctx*/, + AuthPack */*a*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_cc_allocate ( krb5_context /*context*/, const krb5_cc_ops */*ops*/, @@ -77,7 +108,7 @@ int /*type*/, ...); -krb5_config_section * +KRB5_LIB_FUNCTION krb5_config_section * KRB5_LIB_CALL _krb5_config_get_entry ( krb5_config_section **/*parent*/, const char */*name*/, @@ -91,7 +122,7 @@ int /*type*/, ...); -const void * +KRB5_LIB_FUNCTION const void * KRB5_LIB_CALL _krb5_config_vget ( krb5_context /*context*/, const krb5_config_section */*c*/, @@ -111,10 +142,10 @@ krb5_context /*context*/, krb5_context /*to*/); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_crc_init_table (void); -uint32_t +KRB5_LIB_FUNCTION uint32_t KRB5_LIB_CALL _krb5_crc_update ( const char */*p*/, size_t /*len*/, @@ -126,12 +157,12 @@ int /*level*/, const char */*fmt*/, ...) - __attribute__((format (printf, 3, 4))); + __attribute__ ((__format__ (__printf__, 3, 4))); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_debug_backtrace (krb5_context /*context*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_derive_key ( krb5_context /*context*/, struct _krb5_encryption_type */*et*/, @@ -139,7 +170,7 @@ const void */*constant*/, size_t /*len*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_des_checksum ( krb5_context /*context*/, const EVP_MD */*evp_md*/, @@ -148,7 +179,7 @@ size_t /*len*/, Checksum */*cksum*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_des_verify ( krb5_context /*context*/, const EVP_MD */*evp_md*/, @@ -157,7 +188,7 @@ size_t /*len*/, Checksum */*C*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_dh_group_ok ( krb5_context /*context*/, unsigned long /*bits*/, @@ -167,13 +198,18 @@ struct krb5_dh_moduli **/*moduli*/, char **/*name*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_einval ( krb5_context /*context*/, const char */*func*/, unsigned long /*argn*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +_krb5_enctype_requires_random_salt ( + krb5_context /*context*/, + krb5_enctype /*enctype*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_erase_file ( krb5_context /*context*/, const char */*filename*/); @@ -209,7 +245,7 @@ struct _krb5_key_type */*kt*/, struct _krb5_key_data */*kd*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_expand_default_cc_name ( krb5_context /*context*/, const char */*str*/, @@ -219,9 +255,18 @@ _krb5_expand_path_tokens ( krb5_context /*context*/, const char */*path_in*/, + int /*filepath*/, char **/*ppath_out*/); -int +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_expand_path_tokensv ( + krb5_context /*context*/, + const char */*path_in*/, + int /*filepath*/, + char **/*ppath_out*/, + ...); + +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_extract_ticket ( krb5_context /*context*/, krb5_kdc_rep */*rep*/, @@ -232,28 +277,75 @@ krb5_addresses */*addrs*/, unsigned /*nonce*/, unsigned /*flags*/, + krb5_data */*request*/, krb5_decrypt_proc /*decrypt_proc*/, krb5_const_pointer /*decryptarg*/); -struct _krb5_checksum_type * +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_fast_armor_key ( + krb5_context /*context*/, + krb5_keyblock */*subkey*/, + krb5_keyblock */*sessionkey*/, + krb5_keyblock */*armorkey*/, + krb5_crypto */*armor_crypto*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_fast_cf2 ( + krb5_context /*context*/, + krb5_keyblock */*key1*/, + const char */*pepper1*/, + krb5_keyblock */*key2*/, + const char */*pepper2*/, + krb5_keyblock */*armorkey*/, + krb5_crypto */*armor_crypto*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_find_capath ( + krb5_context /*context*/, + const char */*client_realm*/, + const char */*local_realm*/, + const char */*server_realm*/, + krb5_boolean /*use_hierarchical*/, + char ***/*rpath*/, + size_t */*npath*/); + +KRB5_LIB_FUNCTION struct _krb5_checksum_type * KRB5_LIB_CALL _krb5_find_checksum (krb5_cksumtype /*type*/); -struct _krb5_encryption_type * +KRB5_LIB_FUNCTION struct _krb5_encryption_type * KRB5_LIB_CALL _krb5_find_enctype (krb5_enctype /*type*/); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_free_capath ( + krb5_context /*context*/, + char **/*capath*/); + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_free_key_data ( krb5_context /*context*/, struct _krb5_key_data */*key*/, struct _krb5_encryption_type */*et*/); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_free_krbhst_info (krb5_krbhst_info */*hi*/); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_free_moduli (struct krb5_dh_moduli **/*moduli*/); -krb5_error_code +KRB5_LIB_FUNCTION void +_krb5_free_name_canon_rules ( + krb5_context /*context*/, + krb5_name_canon_rule /*rules*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_get_ad ( + krb5_context /*context*/, + const AuthorizationData */*ad*/, + krb5_keyblock */*sessionkey*/, + int /*type*/, + krb5_data */*data*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_get_cred_kdc_any ( krb5_context /*context*/, krb5_kdc_flags /*flags*/, @@ -264,13 +356,13 @@ krb5_creds **/*out_creds*/, krb5_creds ***/*ret_tgts*/); -char * +KRB5_LIB_FUNCTION char * KRB5_LIB_CALL _krb5_get_default_cc_name_from_registry (krb5_context /*context*/); -char * +KRB5_LIB_FUNCTION char * KRB5_LIB_CALL _krb5_get_default_config_config_files_from_registry (void); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_get_default_principal_local ( krb5_context /*context*/, krb5_principal */*princ*/); @@ -291,19 +383,30 @@ unsigned long */*value*/, size_t /*size*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL +_krb5_get_int64 ( + void */*buffer*/, + uint64_t */*value*/, + size_t /*size*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_get_krbtgt ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_realm /*realm*/, krb5_creds **/*cred*/); -krb5_boolean KRB5_LIB_FUNCTION +KRB5_LIB_FUNCTION krb5_error_code +_krb5_get_name_canon_rules ( + krb5_context /*context*/, + krb5_name_canon_rule */*rules*/); + +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_have_debug ( krb5_context /*context*/, int /*level*/); -krb5_boolean +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_homedir_access (krb5_context /*context*/); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -314,7 +417,7 @@ krb5_enctype **/*val*/, const krb5_enctype */*etypes*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_internal_hmac ( krb5_context /*context*/, struct _krb5_checksum_type */*cm*/, @@ -347,7 +450,7 @@ krb5_context /*context*/, krb5_ccache /*id*/); -krb5_error_code KRB5_CALLCONV +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_kdc_retry ( krb5_context /*context*/, krb5_sendto_ctx /*ctx*/, @@ -355,16 +458,16 @@ const krb5_data */*reply*/, int */*action*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_krbhost_info_move ( krb5_context /*context*/, krb5_krbhst_info */*from*/, krb5_krbhst_info **/*to*/); -const char * +KRB5_LIB_FUNCTION const char * KRB5_LIB_CALL _krb5_krbhst_get_realm (krb5_krbhst_handle /*handle*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_kt_principal_not_found ( krb5_context /*context*/, krb5_error_code /*ret*/, @@ -373,16 +476,34 @@ krb5_enctype /*enctype*/, int /*kvno*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +_krb5_kuserok ( + krb5_context /*context*/, + krb5_principal /*principal*/, + const char */*luser*/, + krb5_boolean /*an2ln_ok*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_load_ccache_plugins (krb5_context /*context*/); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_load_db_plugins (krb5_context /*context*/); + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_load_plugins ( krb5_context /*context*/, const char */*name*/, const char **/*paths*/); krb5_error_code +_krb5_make_fast_ap_fxarmor ( + krb5_context /*context*/, + krb5_ccache /*armor_ccache*/, + krb5_data */*armor_value*/, + krb5_keyblock */*armor_key*/, + krb5_crypto */*armor_crypto*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_mk_req_internal ( krb5_context /*context*/, krb5_auth_context */*auth_context*/, @@ -400,7 +521,7 @@ void */*key*/, size_t /*size*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_pac_sign ( krb5_context /*context*/, krb5_pac /*p*/, @@ -410,13 +531,13 @@ const krb5_keyblock */*priv_key*/, krb5_data */*data*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_parse_moduli ( krb5_context /*context*/, const char */*file*/, struct krb5_dh_moduli ***/*moduli*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_parse_moduli_line ( krb5_context /*context*/, const char */*file*/, @@ -427,7 +548,10 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_pk_cert_free (struct krb5_pk_cert */*cert*/); -krb5_error_code +void +_krb5_pk_eckey_free (void */*eckey*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_pk_kdf ( krb5_context /*context*/, const struct AlgorithmIdentifier */*ai*/, @@ -441,6 +565,14 @@ const Ticket */*ticket*/, krb5_keyblock */*key*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_pk_kx_confirm ( + krb5_context /*context*/, + krb5_pk_init_ctx /*ctx*/, + krb5_keyblock */*reply_key*/, + krb5_keyblock */*session_key*/, + PA_DATA */*pa_pkinit_kx*/); + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_pk_load_id ( krb5_context /*context*/, @@ -470,7 +602,7 @@ unsigned /*nonce*/, METHOD_DATA */*md*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_pk_octetstring2key ( krb5_context /*context*/, krb5_enctype /*type*/, @@ -493,22 +625,25 @@ krb5_keyblock **/*key*/); krb5_error_code +_krb5_pk_rd_pa_reply_ecdh_compute_key ( + krb5_context /*context*/, + krb5_pk_init_ctx /*ctx*/, + const unsigned char */*in*/, + size_t /*in_sz*/, + unsigned char **/*out*/, + int */*out_sz*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_plugin_find ( krb5_context /*context*/, enum krb5_plugin_type /*type*/, const char */*name*/, struct krb5_plugin **/*list*/); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_plugin_free (struct krb5_plugin */*list*/); -struct krb5_plugin * -_krb5_plugin_get_next (struct krb5_plugin */*p*/); - -void * -_krb5_plugin_get_symbol (struct krb5_plugin */*p*/); - -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_plugin_run_f ( krb5_context /*context*/, const char */*module*/, @@ -516,7 +651,7 @@ int /*min_version*/, int /*flags*/, void */*userctx*/, - krb5_error_code (*/*func*/)(krb5_context, const void *, void *, void *)); + krb5_error_code (KRB5_LIB_CALL *func)(krb5_context, const void *, void *, void *)); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_principal2principalname ( @@ -539,7 +674,7 @@ KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL _krb5_put_int ( void */*buffer*/, - unsigned long /*value*/, + uint64_t /*value*/, size_t /*size*/); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -548,41 +683,46 @@ const PA_S4U2Self */*self*/, krb5_data */*data*/); -int -_krb5_send_and_recv_tcp ( - krb5_socket_t /*fd*/, - time_t /*tmout*/, - const krb5_data */*req*/, - krb5_data */*rep*/); +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_sendto_ctx_set_krb5hst ( + krb5_context /*context*/, + krb5_sendto_ctx /*ctx*/, + krb5_krbhst_handle /*handle*/); -int +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_sendto_ctx_set_prexmit ( + krb5_sendto_ctx /*ctx*/, + krb5_sendto_prexmit /*prexmit*/, + void */*data*/); + +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_set_default_cc_name_to_registry ( krb5_context /*context*/, krb5_ccache /*id*/); -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_unload_plugins ( krb5_context /*context*/, const char */*name*/); -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_usage2arcfour ( krb5_context /*context*/, unsigned */*usage*/); -int +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_xlock ( krb5_context /*context*/, int /*fd*/, krb5_boolean /*exclusive*/, const char */*filename*/); -void -_krb5_xor ( - DES_cblock */*key*/, +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_xor8 ( + unsigned char */*a*/, const unsigned char */*b*/); -int +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_xunlock ( krb5_context /*context*/, int /*fd*/); diff --git a/crypto/heimdal/lib/krb5/krb5-protos.h b/crypto/heimdal/lib/krb5/krb5-protos.h --- a/crypto/heimdal/lib/krb5/krb5-protos.h +++ b/crypto/heimdal/lib/krb5/krb5-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __krb5_protos_h__ #define __krb5_protos_h__ +#ifndef DOXY #include @@ -9,12 +10,22 @@ #endif #ifndef KRB5_DEPRECATED_FUNCTION -#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 ))) +#ifndef __has_extension +#define __has_extension(x) 0 +#define KRB5_DEPRECATED_FUNCTIONhas_extension 1 +#endif +#if __has_extension(attribute_deprecated_with_message) +#define KRB5_DEPRECATED_FUNCTION(x) __attribute__((__deprecated__(x))) +#elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1 ))) #define KRB5_DEPRECATED_FUNCTION(X) __attribute__((__deprecated__)) #else #define KRB5_DEPRECATED_FUNCTION(X) #endif +#ifdef KRB5_DEPRECATED_FUNCTIONhas_extension +#undef __has_extension +#undef KRB5_DEPRECATED_FUNCTIONhas_extension #endif +#endif /* KRB5_DEPRECATED_FUNCTION */ #ifdef __cplusplus @@ -34,6 +45,22 @@ #endif #endif #endif +/** + * Convert the v5 credentials in in_cred to v4-dito in v4creds. This + * is done by sending them to the 524 function in the KDC. If + * `in_cred' doesn't contain a DES session key, then a new one is + * gotten from the KDC and stored in the cred cache `ccache'. + * + * @param context Kerberos 5 context. + * @param in_cred the credential to convert + * @param v4creds the converted credential + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5_v4compat + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc ( krb5_context /*context*/, @@ -41,6 +68,21 @@ struct credentials */*v4creds*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Convert the v5 credentials in in_cred to v4-dito in v4creds, + * check the credential cache ccache before checking with the KDC. + * + * @param context Kerberos 5 context. + * @param ccache credential cache used to check for des-ticket. + * @param in_cred the credential to convert + * @param v4creds the converted credential + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5_v4compat + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb524_convert_creds_kdc_ccache ( krb5_context /*context*/, @@ -49,20 +91,58 @@ struct credentials */*v4creds*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Log a warning to the log, default stderr, include the error from + * the last failure and then abort. + * + * @param context A Kerberos 5 context + * @param code error code of the last error + * @param fmt message to print + * @param ... arguments for format string + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abort ( krb5_context /*context*/, krb5_error_code /*code*/, const char */*fmt*/, ...) - __attribute__ ((noreturn, format (printf, 3, 4))); + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 4))); + +/** + * Log a warning to the log, default stderr, and then abort. + * + * @param context A Kerberos 5 context + * @param fmt printf format string of message to print + * @param ... arguments for format string + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abortx ( krb5_context /*context*/, const char */*fmt*/, ...) - __attribute__ ((noreturn, format (printf, 2, 3))); + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3))); + +/** + * krb5_acl_match_file matches ACL format against each line in a file + * using krb5_acl_match_string(). Lines starting with # are treated + * like comments and ignored. + * + * @param context Kerberos 5 context. + * @param file file with acl listed in the file. + * @param format format to match. + * @param ... parameter to format string. + * + * @return Return an error code or 0. + * + * @sa krb5_acl_match_string + * @ingroup krb5_support + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_file ( @@ -71,6 +151,52 @@ const char */*format*/, ...); +/** + * krb5_acl_match_string matches ACL format against a string. + * + * The ACL format has three format specifiers: s, f, and r. Each + * specifier will retrieve one argument from the variable arguments + * for either matching or storing data. The input string is split up + * using " " (space) and "\t" (tab) as a delimiter; multiple and "\t" + * in a row are considered to be the same. + * + * List of format specifiers: + * - s Matches a string using strcmp(3) (case sensitive). + * - f Matches the string with fnmatch(3). Theflags + * argument (the last argument) passed to the fnmatch function is 0. + * - r Returns a copy of the string in the char ** passed in; the copy + * must be freed with free(3). There is no need to free(3) the + * string on error: the function will clean up and set the pointer + * to NULL. + * + * @param context Kerberos 5 context + * @param string string to match with + * @param format format to match + * @param ... parameter to format string + * + * @return Return an error code or 0. + * + * + * @code + * char *s; + * + * ret = krb5_acl_match_string(context, "foo", "s", "foo"); + * if (ret) + * krb5_errx(context, 1, "acl didn't match"); + * ret = krb5_acl_match_string(context, "foo foo baz/kaka", + * "ss", "foo", &s, "foo/\\*"); + * if (ret) { + * // no need to free(s) on error + * assert(s == NULL); + * krb5_errx(context, 1, "acl didn't match"); + * } + * free(s); + * @endcode + * + * @sa krb5_acl_match_file + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_acl_match_string ( krb5_context /*context*/, @@ -78,16 +204,56 @@ const char */*format*/, ...); +/** + * Add a specified list of error messages to the et list in context. + * Call func (probably a comerr-generated function) with a pointer to + * the current et_list. + * + * @param context A kerberos context. + * @param func The generated com_err et function. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_et_list ( krb5_context /*context*/, void (*/*func*/)(struct et_list **)); +/** + * Add extra address to the address list that the library will add to + * the client's address list when communicating with the KDC. + * + * @param context Kerberos 5 context. + * @param addresses addreses to add + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_extra_addresses ( krb5_context /*context*/, krb5_addresses */*addresses*/); +/** + * Add extra addresses to ignore when fetching addresses from the + * underlaying operating system. + * + * @param context Kerberos 5 context. + * @param addresses addreses to ignore + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_add_ignore_addresses ( krb5_context /*context*/, @@ -109,6 +275,27 @@ krb5_log_close_func_t /*close_func*/, void */*data*/); +/** + * krb5_addr2sockaddr sets the "struct sockaddr sockaddr" from addr + * and port. The argument sa_size should initially contain the size of + * the sa and after the call, it will contain the actual length of the + * address. In case of the sa is too small to fit the whole address, + * the up to *sa_size will be stored, and then *sa_size will be set to + * the required length. + * + * @param context a Keberos context + * @param addr the address to copy the from + * @param sa the struct sockaddr that will be filled in + * @param sa_size pointer to length of sa, and after the call, it will + * contain the actual length of the address. + * @param port set port in sa. + * + * @return Return an error code or 0. Will return + * KRB5_PROG_ATYPE_NOSUPP in case address type is not supported. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_addr2sockaddr ( krb5_context /*context*/, @@ -117,18 +304,61 @@ krb5_socklen_t */*sa_size*/, int /*port*/); +/** + * krb5_address_compare compares the addresses addr1 and addr2. + * Returns TRUE if the two addresses are the same. + * + * @param context a Keberos context + * @param addr1 address to compare + * @param addr2 address to compare + * + * @return Return an TRUE is the address are the same FALSE if not + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_compare ( krb5_context /*context*/, const krb5_address */*addr1*/, const krb5_address */*addr2*/); +/** + * krb5_address_order compares the addresses addr1 and addr2 so that + * it can be used for sorting addresses. If the addresses are the same + * address krb5_address_order will return 0. Behavies like memcmp(2). + * + * @param context a Keberos context + * @param addr1 krb5_address to compare + * @param addr2 krb5_address to compare + * + * @return < 0 if address addr1 in "less" then addr2. 0 if addr1 and + * addr2 is the same address, > 0 if addr2 is "less" then addr1. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_address_order ( krb5_context /*context*/, const krb5_address */*addr1*/, const krb5_address */*addr2*/); +/** + * Calculate the boundary addresses of `inaddr'/`prefixlen' and store + * them in `low' and `high'. + * + * @param context a Keberos context + * @param inaddr address in prefixlen that the bondery searched + * @param prefixlen width of boundery + * @param low lowest address + * @param high highest address + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_address_prefixlen_boundary ( krb5_context /*context*/, @@ -137,17 +367,57 @@ krb5_address */*low*/, krb5_address */*high*/); +/** + * krb5_address_search checks if the address addr is a member of the + * address set list addrlist . + * + * @param context a Keberos context. + * @param addr address to search for. + * @param addrlist list of addresses to look in for addr. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_address_search ( krb5_context /*context*/, const krb5_address */*addr*/, const krb5_addresses */*addrlist*/); +/** + * Enable or disable all weak encryption types + * + * @param context Kerberos 5 context + * @param enable true to enable, false to disable + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_allow_weak_crypto ( krb5_context /*context*/, krb5_boolean /*enable*/); +/** + * Map a principal name to a local username. + * + * Returns 0 on success, KRB5_NO_LOCALNAME if no mapping was found, or + * some Kerberos or system error. + * + * Inputs: + * + * @param context A krb5_context + * @param aname A principal name + * @param lnsize The size of the buffer into which the username will be written + * @param lname The buffer into which the username will be written + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_aname_to_localname ( krb5_context /*context*/, @@ -155,6 +425,23 @@ size_t /*lnsize*/, char */*lname*/); +/** + * krb5_anyaddr fills in a "struct sockaddr sa" that can be used to + * bind(2) to. The argument sa_size should initially contain the size + * of the sa, and after the call, it will contain the actual length + * of the address. + * + * @param context a Keberos context + * @param af address family + * @param sa sockaddr + * @param sa_size lenght of sa. + * @param port for to fill into sa. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_anyaddr ( krb5_context /*context*/, @@ -190,12 +477,32 @@ time_t /*def_val*/, time_t */*ret_val*/); +/** + * krb5_append_addresses adds the set of addresses in source to + * dest. While copying the addresses, duplicates are also sorted out. + * + * @param context a Keberos context + * @param dest destination of copy operation + * @param source adresses that are going to be added to dest + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_append_addresses ( krb5_context /*context*/, krb5_addresses */*dest*/, const krb5_addresses */*source*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_auth_con_add_AuthorizationData ( + krb5_context /*context*/, + krb5_auth_context /*auth_context*/, + int /*type*/, + krb5_data */*data*/); + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_addflags ( krb5_context /*context*/, @@ -203,11 +510,28 @@ int32_t /*addflags*/, int32_t */*flags*/); +/** + * Deallocate an authentication context previously initialized with + * krb5_auth_con_init(). + * + * @param context A kerberos context. + * @param auth_context The authentication context to be deallocated. + * + * @return An krb5 error code, see krb5_get_error_message(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_free ( krb5_context /*context*/, krb5_auth_context /*auth_context*/); +/** + * Update the authentication context \a auth_context with the local + * and remote addresses from socket \a fd, according to \a flags. + * + * @return An krb5 error code, see krb5_get_error_message(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_genaddrs ( krb5_context /*context*/, @@ -300,6 +624,17 @@ krb5_auth_context /*auth_context*/, krb5_keyblock **/*keyblock*/); +/** + * Allocate and initialize an autentication context. + * + * @param context A kerberos context. + * @param auth_context The authentication context to be initialized. + * + * Use krb5_auth_con_free() to release the memory when done using the context. + * + * @return An krb5 error code, see krb5_get_error_message(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_con_init ( krb5_context /*context*/, @@ -397,6 +732,12 @@ krb5_auth_context /*auth_context*/, krb5_keyblock */*keyblock*/); +/** + * Deprecated: use krb5_auth_con_getremoteseqnumber() + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_auth_getremoteseqnumber ( krb5_context /*context*/, @@ -413,6 +754,20 @@ krb5_data /*authenticator*/, krb5_data */*retdata*/); +/** + * Build a principal using vararg style building + * + * @param context A Kerberos context. + * @param principal returned principal + * @param rlen length of realm + * @param realm realm name + * @param ... a list of components ended with NULL. + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_build_principal ( krb5_context /*context*/, @@ -482,6 +837,12 @@ size_t /*inputlen*/, size_t */*length*/); +/** + * Deprecated: keytypes doesn't exists, they are really enctypes. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_c_enctype_compare ( krb5_context /*context*/, @@ -565,49 +926,140 @@ const krb5_checksum */*cksum*/, krb5_boolean */*valid*/); +/** + * Destroy the cursor `cursor'. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_end_seq_get ( krb5_context /*context*/, krb5_cc_cache_cursor /*cursor*/); +/** + * Start iterating over all caches of specified type. See also + * krb5_cccol_cursor_new(). + + * @param context A Kerberos 5 context + * @param type optional type to iterate over, if NULL, the default cache is used. + * @param cursor cursor should be freed with krb5_cc_cache_end_seq_get(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_get_first ( krb5_context /*context*/, const char */*type*/, krb5_cc_cache_cursor */*cursor*/); +/** + * Search for a matching credential cache that have the + * `principal' as the default principal. On success, `id' needs to be + * freed with krb5_cc_close() or krb5_cc_destroy(). + * + * @param context A Kerberos 5 context + * @param client The principal to search for + * @param id the returned credential cache + * + * @return On failure, error code is returned and `id' is set to NULL. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_match ( krb5_context /*context*/, krb5_principal /*client*/, krb5_ccache */*id*/); +/** + * Retrieve the next cache pointed to by (`cursor') in `id' + * and advance `cursor'. + * + * @param context A Kerberos 5 context + * @param cursor the iterator cursor, returned by krb5_cc_cache_get_first() + * @param id next ccache + * + * @return Return 0 or an error code. Returns KRB5_CC_END when the end + * of caches is reached, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_cache_next ( krb5_context /*context*/, krb5_cc_cache_cursor /*cursor*/, krb5_ccache */*id*/); +/** + * Clear `mcreds' so it can be used with krb5_cc_retrieve_cred + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_cc_clear_mcred (krb5_creds */*mcred*/); +/** + * Stop using the ccache `id' and free the related resources. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_close ( krb5_context /*context*/, krb5_ccache /*id*/); +/** + * Just like krb5_cc_copy_match_f(), but copy everything. + * + * @ingroup @krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_cache ( krb5_context /*context*/, const krb5_ccache /*from*/, krb5_ccache /*to*/); +/** + * MIT compat glue + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_creds ( krb5_context /*context*/, const krb5_ccache /*from*/, krb5_ccache /*to*/); +/** + * Copy the contents of `from' to `to' if the given match function + * return true. + * + * @param context A Kerberos 5 context. + * @param from the cache to copy data from. + * @param to the cache to copy data to. + * @param match a match function that should return TRUE if cred argument should be copied, if NULL, all credentials are copied. + * @param matchctx context passed to match function. + * @param matched set to true if there was a credential that matched, may be NULL. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_copy_match_f ( krb5_context /*context*/, @@ -617,25 +1069,66 @@ void */*matchctx*/, unsigned int */*matched*/); +/** + * Open the default ccache in `id'. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_default ( krb5_context /*context*/, krb5_ccache */*id*/); +/** + * Return a pointer to a context static string containing the default + * ccache name. + * + * @return String to the default credential cache name. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_default_name (krb5_context /*context*/); +/** + * Remove the ccache `id'. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_destroy ( krb5_context /*context*/, krb5_ccache /*id*/); +/** + * Destroy the cursor `cursor'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_end_seq_get ( krb5_context /*context*/, const krb5_ccache /*id*/, krb5_cc_cursor */*cursor*/); +/** + * Generate a new ccache of type `ops' in `id'. + * + * Deprecated: use krb5_cc_new_unique() instead. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_gen_new ( krb5_context /*context*/, @@ -643,6 +1136,19 @@ krb5_ccache */*id*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Get some configuration for the credential cache in the cache. + * + * @param context a Keberos context + * @param id the credential cache to store the data for + * @param principal configuration for a specific principal, if + * NULL, global for the whole cache. + * @param name name under which the configuraion is stored. + * @param data data to fetched, free with krb5_data_free() + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_config ( krb5_context /*context*/, @@ -651,85 +1157,230 @@ const char */*name*/, krb5_data */*data*/); +/** + * Get the flags of `id', store them in `flags'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_flags ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_flags */*flags*/); +/** + * Return a friendly name on credential cache. Free the result with krb5_xfree(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_friendly_name ( krb5_context /*context*/, krb5_ccache /*id*/, char **/*name*/); +/** + * Return the complete resolvable name the cache + + * @param context a Keberos context + * @param id return pointer to a found credential cache + * @param str the returned name of a credential cache, free with krb5_xfree() + * + * @return Returns 0 or an error (and then *str is set to NULL). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_full_name ( krb5_context /*context*/, krb5_ccache /*id*/, char **/*str*/); +/** + * Get the time offset betwen the client and the KDC + * + * If the backend doesn't support KDC offset, use the context global setting. + * + * @param context A Kerberos 5 context. + * @param id a credential cache + * @param offset the offset in seconds + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_kdc_offset ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_deltat */*offset*/); +/** + * Get the lifetime of the initial ticket in the cache + * + * Get the lifetime of the initial ticket in the cache, if the initial + * ticket was not found, the error code KRB5_CC_END is returned. + * + * @param context A Kerberos 5 context. + * @param id a credential cache + * @param t the relative lifetime of the initial ticket + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_lifetime ( krb5_context /*context*/, krb5_ccache /*id*/, time_t */*t*/); +/** + * Return the name of the ccache `id' + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_name ( krb5_context /*context*/, krb5_ccache /*id*/); +/** + * Return krb5_cc_ops of a the ccache `id'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION const krb5_cc_ops * KRB5_LIB_CALL krb5_cc_get_ops ( krb5_context /*context*/, krb5_ccache /*id*/); +/** + * Get the cc ops that is registered in `context' to handle the + * prefix. prefix can be a complete credential cache name or a + * prefix, the function will only use part up to the first colon (:) + * if there is one. If prefix the argument is NULL, the default ccache + * implemtation is returned. + * + * @return Returns NULL if ops not found. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION const krb5_cc_ops * KRB5_LIB_CALL krb5_cc_get_prefix_ops ( krb5_context /*context*/, const char */*prefix*/); +/** + * Return the principal of `id' in `principal'. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_principal ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_principal */*principal*/); +/** + * Return the type of the ccache `id'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_cc_get_type ( krb5_context /*context*/, krb5_ccache /*id*/); +/** + * Return the version of `id'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_get_version ( krb5_context /*context*/, const krb5_ccache /*id*/); +/** + * Create a new ccache in `id' for `primary_principal'. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_initialize ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_principal /*primary_principal*/); +/** + * Return the last time the credential cache was modified. + * + * @param context A Kerberos 5 context + * @param id The credential cache to probe + * @param mtime the last modification time, set to 0 on error. + + * @return Return 0 or and error. See krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_last_change_time ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_timestamp */*mtime*/); +/** + * Move the content from one credential cache to another. The + * operation is an atomic switch. + * + * @param context a Keberos context + * @param from the credential cache to move the content from + * @param to the credential cache to move the content to + + * @return On sucess, from is freed. On failure, error code is + * returned and from and to are both still allocated, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_move ( krb5_context /*context*/, krb5_ccache /*from*/, krb5_ccache /*to*/); +/** + * Generates a new unique ccache of `type` in `id'. If `type' is NULL, + * the library chooses the default credential cache type. The supplied + * `hint' (that can be NULL) is a string that the credential cache + * type can use to base the name of the credential on, this is to make + * it easier for the user to differentiate the credentials. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_new_unique ( krb5_context /*context*/, @@ -737,6 +1388,15 @@ const char */*hint*/, krb5_ccache */*id*/); +/** + * Retrieve the next cred pointed to by (`id', `cursor') in `creds' + * and advance `cursor'. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_next_cred ( krb5_context /*context*/, @@ -744,12 +1404,32 @@ krb5_cc_cursor */*cursor*/, krb5_creds */*creds*/); +/** + * Add a new ccache type with operations `ops', overwriting any + * existing one if `override'. + * + * @param context a Keberos context + * @param ops type of plugin symbol + * @param override flag to select if the registration is to overide + * an existing ops with the same name. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_register ( krb5_context /*context*/, const krb5_cc_ops */*ops*/, krb5_boolean /*override*/); +/** + * Remove the credential identified by `cred', `which' from `id'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_remove_cred ( krb5_context /*context*/, @@ -757,12 +1437,43 @@ krb5_flags /*which*/, krb5_creds */*cred*/); +/** + * Find and allocate a ccache in `id' from the specification in `residual'. + * If the ccache name doesn't contain any colon, interpret it as a file name. + * + * @param context a Keberos context. + * @param name string name of a credential cache. + * @param id return pointer to a found credential cache. + * + * @return Return 0 or an error code. In case of an error, id is set + * to NULL, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_resolve ( krb5_context /*context*/, const char */*name*/, krb5_ccache */*id*/); +/** + * Retrieve the credential identified by `mcreds' (and `whichfields') + * from `id' in `creds'. 'creds' must be free by the caller using + * krb5_free_cred_contents. + * + * @param context A Kerberos 5 context + * @param id a Kerberos 5 credential cache + * @param whichfields what fields to use for matching credentials, same + * flags as whichfields in krb5_compare_creds() + * @param mcreds template credential to use for comparing + * @param creds returned credential, free with krb5_free_cred_contents() + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_retrieve_cred ( krb5_context /*context*/, @@ -771,6 +1482,20 @@ const krb5_creds */*mcreds*/, krb5_creds */*creds*/); +/** + * Store some configuration for the credential cache in the cache. + * Existing configuration under the same name is over-written. + * + * @param context a Keberos context + * @param id the credential cache to store the data for + * @param principal configuration for a specific principal, if + * NULL, global for the whole cache. + * @param name name under which the configuraion is stored. + * @param data data to store, if NULL, configure is removed. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_config ( krb5_context /*context*/, @@ -779,73 +1504,209 @@ const char */*name*/, krb5_data */*data*/); +/** + * Set the default cc name for `context' to `name'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_default_name ( krb5_context /*context*/, const char */*name*/); +/** + * Set the flags of `id' to `flags'. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_flags ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_flags /*flags*/); +/** + * Set the friendly name on credential cache. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_friendly_name ( krb5_context /*context*/, krb5_ccache /*id*/, const char */*name*/); +/** + * Set the time offset betwen the client and the KDC + * + * If the backend doesn't support KDC offset, use the context global setting. + * + * @param context A Kerberos 5 context. + * @param id a credential cache + * @param offset the offset in seconds + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_set_kdc_offset ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_deltat /*offset*/); +/** + * Start iterating over `id', `cursor' is initialized to the + * beginning. Caller must free the cursor with krb5_cc_end_seq_get(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_start_seq_get ( krb5_context /*context*/, const krb5_ccache /*id*/, krb5_cc_cursor */*cursor*/); +/** + * Store `creds' in the ccache `id'. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_store_cred ( krb5_context /*context*/, krb5_ccache /*id*/, krb5_creds */*creds*/); +/** + * Return true if the default credential cache support switch + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_cc_support_switch ( krb5_context /*context*/, const char */*type*/); +/** + * Switch the default default credential cache for a specific + * credcache type (and name for some implementations). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cc_switch ( krb5_context /*context*/, krb5_ccache /*id*/); +/** + * End an iteration and free all resources, can be done before end is reached. + * + * @param context A Kerberos 5 context + * @param cursor the iteration cursor to be freed. + * + * @return Return 0 or and error, KRB5_CC_END is returned at the end + * of iteration. See krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_free ( krb5_context /*context*/, krb5_cccol_cursor */*cursor*/); +/** + * Get a new cache interation cursor that will interate over all + * credentials caches independent of type. + * + * @param context a Keberos context + * @param cursor passed into krb5_cccol_cursor_next() and free with krb5_cccol_cursor_free(). + * + * @return Returns 0 or and error code, see krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_new ( krb5_context /*context*/, krb5_cccol_cursor */*cursor*/); +/** + * Get next credential cache from the iteration. + * + * @param context A Kerberos 5 context + * @param cursor the iteration cursor + * @param cache the returned cursor, pointer is set to NULL on failure + * and a cache on success. The returned cache needs to be freed + * with krb5_cc_close() or destroyed with krb5_cc_destroy(). + * MIT Kerberos behavies slightly diffrent and sets cache to NULL + * when all caches are iterated over and return 0. + * + * @return Return 0 or and error, KRB5_CC_END is returned at the end + * of iteration. See krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_cursor_next ( krb5_context /*context*/, krb5_cccol_cursor /*cursor*/, krb5_ccache */*cache*/); +/** + * Return the last modfication time for a cache collection. The query + * can be limited to a specific cache type. If the function return 0 + * and mtime is 0, there was no credentials in the caches. + * + * @param context A Kerberos 5 context + * @param type The credential cache to probe, if NULL, all type are traversed. + * @param mtime the last modification time, set to 0 on error. + + * @return Return 0 or and error. See krb5_get_error_message(). + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cccol_last_change_time ( krb5_context /*context*/, const char */*type*/, krb5_timestamp */*mtime*/); +/** + * Deprecated: krb5_change_password() is deprecated, use krb5_set_password(). + * + * @param context a Keberos context + * @param creds + * @param newpw + * @param result_code + * @param result_code_string + * @param result_string + * + * @return On sucess password is changed. + + * @ingroup @krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_change_password ( krb5_context /*context*/, @@ -898,6 +1759,18 @@ krb5_cksumtype /*type*/, size_t */*size*/); +/** + * Return the coresponding encryption type for a checksum type. + * + * @param context Kerberos context + * @param ctype The checksum type to get the result enctype for + * @param etype The returned encryption, when the matching etype is + * not found, etype is set to ETYPE_NULL. + * + * @return Return an error code for an failure or 0 on success. + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_cksumtype_to_enctype ( krb5_context /*context*/, @@ -909,9 +1782,27 @@ krb5_context /*context*/, krb5_cksumtype /*ctype*/); +/** + * Clears the error message from the Kerberos 5 context. + * + * @param context The Kerberos 5 context to clear + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_message (krb5_context /*context*/); +/** + * Clear the error message returned by krb5_get_error_string(). + * + * Deprecated: use krb5_clear_error_message() + * + * @param context Kerberos context + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_clear_error_string (krb5_context /*context*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); @@ -921,6 +1812,32 @@ krb5_context /*context*/, krb5_log_facility */*fac*/); +/** + * Return TRUE if `mcreds' and `creds' are equal (`whichfields' + * determines what equal means). + * + * + * The following flags, set in whichfields affects the comparison: + * - KRB5_TC_MATCH_SRV_NAMEONLY Consider all realms equal when comparing the service principal. + * - KRB5_TC_MATCH_KEYTYPE Compare enctypes. + * - KRB5_TC_MATCH_FLAGS_EXACT Make sure that the ticket flags are identical. + * - KRB5_TC_MATCH_FLAGS Make sure that all ticket flags set in mcreds are also present in creds . + * - KRB5_TC_MATCH_TIMES_EXACT Compares the ticket times exactly. + * - KRB5_TC_MATCH_TIMES Compares only the expiration times of the creds. + * - KRB5_TC_MATCH_AUTHDATA Compares the authdata fields. + * - KRB5_TC_MATCH_2ND_TKT Compares the second tickets (used by user-to-user authentication). + * - KRB5_TC_MATCH_IS_SKEY Compares the existance of the second ticket. + * + * @param context Kerberos 5 context. + * @param whichfields which fields to compare. + * @param mcreds cred to compare with. + * @param creds cred to compare with. + * + * @return return TRUE if mcred and creds are equal, FALSE if not. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_compare_creds ( krb5_context /*context*/, @@ -928,20 +1845,74 @@ const krb5_creds * /*mcreds*/, const krb5_creds * /*creds*/); +/** + * Free configuration file section, the result of + * krb5_config_parse_file() and krb5_config_parse_file_multi(). + * + * @param context A Kerberos 5 context + * @param s the configuration section to free + * + * @return returns 0 on successes, otherwise an error code, see + * krb5_get_error_message() + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_file_free ( krb5_context /*context*/, krb5_config_section */*s*/); +/** + * Free the resulting strings from krb5_config-get_strings() and + * krb5_config_vget_strings(). + * + * @param strings strings to free + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_config_free_strings (char **/*strings*/); +/** + * Like krb5_config_get_bool() but with a va_list list of + * configuration selection. + * + * Configuration value to a boolean value, where yes/true and any + * non-zero number means TRUE and other value is FALSE. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param ... a list of names, terminated with NULL. + * + * @return TRUE or FALSE + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool ( krb5_context /*context*/, const krb5_config_section */*c*/, ...); +/** + * krb5_config_get_bool_default() will convert the configuration + * option value to a boolean value, where yes/true and any non-zero + * number means TRUE and other value is FALSE. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param def_value the default value to return if no configuration + * found in the database. + * @param ... a list of names, terminated with NULL. + * + * @return TRUE or FALSE + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_get_bool_default ( krb5_context /*context*/, @@ -962,18 +1933,60 @@ int /*def_value*/, ...); +/** + * Get a list of configuration binding list for more processing + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param ... a list of names, terminated with NULL. + * + * @return NULL if configuration list is not found, a list otherwise + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION const krb5_config_binding * KRB5_LIB_CALL krb5_config_get_list ( krb5_context /*context*/, const krb5_config_section */*c*/, ...); +/** + * Returns a "const char *" to a string in the configuration database. + * The string may not be valid after a reload of the configuration + * database so a caller should make a local copy if it needs to keep + * the string. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param ... a list of names, terminated with NULL. + * + * @return NULL if configuration string not found, a string otherwise + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string ( krb5_context /*context*/, const krb5_config_section */*c*/, ...); +/** + * Like krb5_config_get_string(), but instead of returning NULL, + * instead return a default value. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param def_value the default value to return if no configuration + * found in the database. + * @param ... a list of names, terminated with NULL. + * + * @return a configuration string + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_get_string_default ( krb5_context /*context*/, @@ -981,18 +1994,57 @@ const char */*def_value*/, ...); +/** + * Get a list of configuration strings, free the result with + * krb5_config_free_strings(). + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param ... a list of names, terminated with NULL. + * + * @return TRUE or FALSE + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION char** KRB5_LIB_CALL krb5_config_get_strings ( krb5_context /*context*/, const krb5_config_section */*c*/, ...); +/** + * Get the time from the configuration file using a relative time, for example: 1h30s + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param ... a list of names, terminated with NULL. + * + * @return parsed the time or -1 on error + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time ( krb5_context /*context*/, const krb5_config_section */*c*/, ...); +/** + * Get the time from the configuration file using a relative time, for example: 1h30s + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param def_value the default value to return if no configuration + * found in the database. + * @param ... a list of names, terminated with NULL. + * + * @return parsed the time (or def_value on parse error) + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_get_time_default ( krb5_context /*context*/, @@ -1000,18 +2052,43 @@ int /*def_value*/, ...); +/** + * If the fname starts with "~/" parse configuration file in the + * current users home directory. The behavior can be disabled and + * enabled by calling krb5_set_home_dir_access(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_file ( krb5_context /*context*/, const char */*fname*/, krb5_config_section **/*res*/); +/** + * Parse a configuration file and add the result into res. This + * interface can be used to parse several configuration files into one + * resulting krb5_config_section by calling it repeatably. + * + * @param context a Kerberos 5 context. + * @param fname a file name to a Kerberos configuration file + * @param res the returned result, must be free with krb5_free_config_files(). + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_file_multi ( krb5_context /*context*/, const char */*fname*/, krb5_config_section **/*res*/); +/** + * Deprecated: configuration files are not strings + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_config_parse_string_multi ( krb5_context /*context*/, @@ -1019,12 +2096,44 @@ krb5_config_section **/*res*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * krb5_config_get_bool() will convert the configuration + * option value to a boolean value, where yes/true and any non-zero + * number means TRUE and other value is FALSE. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param args a va_list of arguments + * + * @return TRUE or FALSE + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool ( krb5_context /*context*/, const krb5_config_section */*c*/, va_list /*args*/); +/** + * Like krb5_config_get_bool_default() but with a va_list list of + * configuration selection. + * + * Configuration value to a boolean value, where yes/true and any + * non-zero number means TRUE and other value is FALSE. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param def_value the default value to return if no configuration + * found in the database. + * @param args a va_list of arguments + * + * @return TRUE or FALSE + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_config_vget_bool_default ( krb5_context /*context*/, @@ -1045,18 +2154,57 @@ int /*def_value*/, va_list /*args*/); +/** + * Get a list of configuration binding list for more processing + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param args a va_list of arguments + * + * @return NULL if configuration list is not found, a list otherwise + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION const krb5_config_binding * KRB5_LIB_CALL krb5_config_vget_list ( krb5_context /*context*/, const krb5_config_section */*c*/, va_list /*args*/); +/** + * Like krb5_config_get_string(), but uses a va_list instead of ... + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param args a va_list of arguments + * + * @return NULL if configuration string not found, a string otherwise + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string ( krb5_context /*context*/, const krb5_config_section */*c*/, va_list /*args*/); +/** + * Like krb5_config_vget_string(), but instead of returning NULL, + * instead return a default value. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param def_value the default value to return if no configuration + * found in the database. + * @param args a va_list of arguments + * + * @return a configuration string + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_config_vget_string_default ( krb5_context /*context*/, @@ -1064,18 +2212,60 @@ const char */*def_value*/, va_list /*args*/); +/** + * Get a list of configuration strings, free the result with + * krb5_config_free_strings(). + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param args a va_list of arguments + * + * @return TRUE or FALSE + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION char ** KRB5_LIB_CALL krb5_config_vget_strings ( krb5_context /*context*/, const krb5_config_section */*c*/, va_list /*args*/); +/** + * Get the time from the configuration file using a relative time, for example: 1h30s + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param args a va_list of arguments + * + * @return parsed the time or -1 on error + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time ( krb5_context /*context*/, const krb5_config_section */*c*/, va_list /*args*/); +/** + * Get the time from the configuration file using a relative time. + * + * Like krb5_config_get_time_default() but with a va_list list of + * configuration selection. + * + * @param context A Kerberos 5 context. + * @param c a configuration section, or NULL to use the section from context + * @param def_value the default value to return if no configuration + * found in the database. + * @param args a va_list of arguments + * + * @return parsed the time (or def_value on parse error) + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_config_vget_time_default ( krb5_context /*context*/, @@ -1083,12 +2273,38 @@ int /*def_value*/, va_list /*args*/); +/** + * krb5_copy_address copies the content of address + * inaddr to outaddr. + * + * @param context a Keberos context + * @param inaddr pointer to source address + * @param outaddr pointer to destination address + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_address ( krb5_context /*context*/, const krb5_address */*inaddr*/, krb5_address */*outaddr*/); +/** + * krb5_copy_addresses copies the content of addresses + * inaddr to outaddr. + * + * @param context a Keberos context + * @param inaddr pointer to source addresses + * @param outaddr pointer to destination addresses + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_addresses ( krb5_context /*context*/, @@ -1101,53 +2317,169 @@ const krb5_checksum */*old*/, krb5_checksum **/*new*/); +/** + * Make a copy for the Kerberos 5 context, the new krb5_context shoud + * be freed with krb5_free_context(). + * + * @param context the Kerberos context to copy + * @param out the copy of the Kerberos, set to NULL error. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_context ( krb5_context /*context*/, krb5_context */*out*/); +/** + * Copy krb5_creds. + * + * @param context Kerberos 5 context. + * @param incred source credential + * @param outcred destination credential, free with krb5_free_creds(). + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds ( krb5_context /*context*/, const krb5_creds */*incred*/, krb5_creds **/*outcred*/); +/** + * Copy content of krb5_creds. + * + * @param context Kerberos 5 context. + * @param incred source credential + * @param c destination credential, free with krb5_free_cred_contents(). + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_creds_contents ( krb5_context /*context*/, const krb5_creds */*incred*/, krb5_creds */*c*/); +/** + * Copy the data into a newly allocated krb5_data. + * + * @param context Kerberos 5 context. + * @param indata the krb5_data data to copy + * @param outdata new krb5_date to copy too. Free with krb5_free_data(). + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_data ( krb5_context /*context*/, const krb5_data */*indata*/, krb5_data **/*outdata*/); +/** + * Copy the list of realms from `from' to `to'. + * + * @param context Kerberos 5 context. + * @param from list of realms to copy from. + * @param to list of realms to copy to, free list of krb5_free_host_realm(). + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_host_realm ( krb5_context /*context*/, const krb5_realm */*from*/, krb5_realm **/*to*/); +/** + * Copy a keyblock, free the output keyblock with + * krb5_free_keyblock(). + * + * @param context a Kerberos 5 context + * @param inblock the key to copy + * @param to the output key. + * + * @return 0 on success or a Kerberos 5 error code + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock ( krb5_context /*context*/, const krb5_keyblock */*inblock*/, krb5_keyblock **/*to*/); +/** + * Copy a keyblock, free the output keyblock with + * krb5_free_keyblock_contents(). + * + * @param context a Kerberos 5 context + * @param inblock the key to copy + * @param to the output key. + * + * @return 0 on success or a Kerberos 5 error code + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_keyblock_contents ( krb5_context /*context*/, const krb5_keyblock */*inblock*/, krb5_keyblock */*to*/); +/** + * Copy a principal + * + * @param context A Kerberos context. + * @param inprinc principal to copy + * @param outprinc copied principal, free with krb5_free_principal() + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_principal ( krb5_context /*context*/, krb5_const_principal /*inprinc*/, krb5_principal */*outprinc*/); +/** + * Copy ticket and content + * + * @param context a Kerberos 5 context + * @param from ticket to copy + * @param to new copy of ticket, free with krb5_free_ticket() + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_copy_ticket ( krb5_context /*context*/, @@ -1164,6 +2496,20 @@ size_t /*len*/, Checksum */*result*/); +/** + * Create a Kerberos message checksum. + * + * @param context Kerberos context + * @param crypto Kerberos crypto context + * @param usage Key usage for this buffer + * @param data array of buffers to process + * @param num_data length of array + * @param type output data + * + * @return Return an error code or 0. + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_create_checksum_iov ( krb5_context /*context*/, @@ -1173,14 +2519,52 @@ unsigned int /*num_data*/, krb5_cksumtype */*type*/); +/** + * Returns the ticket flags for the credentials in creds. + * See also krb5_ticket_get_flags(). + * + * @param creds credential to get ticket flags from + * + * @return ticket flags + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_creds_get_ticket_flags (krb5_creds */*creds*/); +/** + * Free a crypto context created by krb5_crypto_init(). + * + * @param context Kerberos context + * @param crypto crypto context to free + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_destroy ( krb5_context /*context*/, krb5_crypto /*crypto*/); +/** + * The FX-CF2 key derivation function, used in FAST and preauth framework. + * + * @param context Kerberos 5 context + * @param crypto1 first key to combine + * @param crypto2 second key to combine + * @param pepper1 factor to combine with first key to garante uniqueness + * @param pepper2 factor to combine with second key to garante uniqueness + * @param enctype the encryption type of the resulting key + * @param res allocated key, free with krb5_free_keyblock_contents() + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_fx_cf2 ( krb5_context /*context*/, @@ -1197,30 +2581,96 @@ krb5_crypto /*crypto*/, krb5_cksumtype */*type*/); +/** + * Return the blocksize used algorithm referenced by the crypto context + * + * @param context Kerberos context + * @param crypto crypto context to query + * @param blocksize the resulting blocksize + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getblocksize ( krb5_context /*context*/, krb5_crypto /*crypto*/, size_t */*blocksize*/); +/** + * Return the confounder size used by the crypto context + * + * @param context Kerberos context + * @param crypto crypto context to query + * @param confoundersize the returned confounder size + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getconfoundersize ( krb5_context /*context*/, krb5_crypto /*crypto*/, size_t */*confoundersize*/); +/** + * Return the encryption type used by the crypto context + * + * @param context Kerberos context + * @param crypto crypto context to query + * @param enctype the resulting encryption type + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getenctype ( krb5_context /*context*/, krb5_crypto /*crypto*/, krb5_enctype */*enctype*/); +/** + * Return the padding size used by the crypto context + * + * @param context Kerberos context + * @param crypto crypto context to query + * @param padsize the return padding size + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_getpadsize ( krb5_context /*context*/, krb5_crypto /*crypto*/, size_t */*padsize*/); +/** + * Create a crypto context used for all encryption and signature + * operation. The encryption type to use is taken from the key, but + * can be overridden with the enctype parameter. This can be useful + * for encryptions types which is compatiable (DES for example). + * + * To free the crypto context, use krb5_crypto_destroy(). + * + * @param context Kerberos context + * @param key the key block information with all key data + * @param etype the encryption type + * @param crypto the resulting crypto context + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_crypto_init ( krb5_context /*context*/, @@ -1260,35 +2710,113 @@ krb5_enctype /*type*/, size_t */*length*/); +/** + * Allocate data of and krb5_data. + * + * @param p krb5_data to allocate. + * @param len size to allocate. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_alloc ( krb5_data */*p*/, int /*len*/); +/** + * Compare to data. + * + * @param data1 krb5_data to compare + * @param data2 krb5_data to compare + * + * @return return the same way as memcmp(), useful when sorting. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_cmp ( const krb5_data */*data1*/, const krb5_data */*data2*/); +/** + * Copy the data of len into the krb5_data. + * + * @param p krb5_data to copy into. + * @param data data to copy.. + * @param len new size. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_copy ( krb5_data */*p*/, const void */*data*/, size_t /*len*/); +/** + * Compare to data not exposing timing information from the checksum data + * + * @param data1 krb5_data to compare + * @param data2 krb5_data to compare + * + * @return returns zero for same data, otherwise non zero. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_data_ct_cmp ( const krb5_data */*data1*/, const krb5_data */*data2*/); +/** + * Free the content of krb5_data structure, its ok to free a zeroed + * structure (with memset() or krb5_data_zero()). When done, the + * structure will be zeroed. The same function is called + * krb5_free_data_contents() in MIT Kerberos. + * + * @param p krb5_data to free. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_free (krb5_data */*p*/); +/** + * Grow (or shrink) the content of krb5_data to a new size. + * + * @param p krb5_data to free. + * @param len new size. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_data_realloc ( krb5_data */*p*/, int /*len*/); +/** + * Reset the (potentially uninitalized) krb5_data structure. + * + * @param p krb5_data to reset. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_data_zero (krb5_data */*p*/); @@ -1387,6 +2915,27 @@ const EncryptedData */*e*/, krb5_data */*result*/); +/** + * Inline decrypt a Kerberos message. + * + * @param context Kerberos context + * @param crypto Kerberos crypto context + * @param usage Key usage for this buffer + * @param data array of buffers to process + * @param num_data length of array + * @param ivec initial cbc/cts vector + * + * @return Return an error code or 0. + * @ingroup krb5_crypto + * + * 1. KRB5_CRYPTO_TYPE_HEADER + * 2. one KRB5_CRYPTO_TYPE_DATA and array [0,...] of KRB5_CRYPTO_TYPE_SIGN_ONLY in + * any order, however the receiver have to aware of the + * order. KRB5_CRYPTO_TYPE_SIGN_ONLY is commonly used unencrypoted + * protocol headers and trailers. The output data will be of same + * size as the input data or shorter. + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_decrypt_iov_ivec ( krb5_context /*context*/, @@ -1477,6 +3026,19 @@ krb5_realm /*realm*/, krb5_ccache /*ccache*/); +/** + * Get the supported/allowed mechanism for this principal. + * + * @param context A Keberos context. + * @param realm The realm of the KDC. + * @param ccache The credential cache to use when talking to the KDC. + * @param flags The supported mechanism. + * + * @return Return an error code or 0. + * + * @ingroup krb5_digest + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_digest_probe ( krb5_context /*context*/, @@ -1614,6 +3176,17 @@ unsigned int /*num_realms*/, krb5_data */*encoding*/); +/** + * Convert the getaddrinfo() error code to a Kerberos et error code. + * + * @param eai_errno contains the error code from getaddrinfo(). + * @param system_error should have the value of errno after the failed getaddrinfo(). + * + * @return Kerberos error code representing the EAI errors. + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_eai_to_heim_errno ( int /*eai_errno*/, @@ -1710,6 +3283,30 @@ int /*kvno*/, EncryptedData */*result*/); +/** + * Inline encrypt a kerberos message + * + * @param context Kerberos context + * @param crypto Kerberos crypto context + * @param usage Key usage for this buffer + * @param data array of buffers to process + * @param num_data length of array + * @param ivec initial cbc/cts vector + * + * @return Return an error code or 0. + * @ingroup krb5_crypto + * + * Kerberos encrypted data look like this: + * + * 1. KRB5_CRYPTO_TYPE_HEADER + * 2. array [1,...] KRB5_CRYPTO_TYPE_DATA and array [0,...] + * KRB5_CRYPTO_TYPE_SIGN_ONLY in any order, however the receiver + * have to aware of the order. KRB5_CRYPTO_TYPE_SIGN_ONLY is + * commonly used headers and trailers. + * 3. KRB5_CRYPTO_TYPE_PADDING, at least on padsize long if padsize > 1 + * 4. KRB5_CRYPTO_TYPE_TRAILER + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_encrypt_iov_ivec ( krb5_context /*context*/, @@ -1729,11 +3326,33 @@ krb5_data */*result*/, void */*ivec*/); +/** + * Disable encryption type + * + * @param context Kerberos 5 context + * @param enctype encryption type to disable + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_disable ( krb5_context /*context*/, krb5_enctype /*enctype*/); +/** + * Enable encryption type + * + * @param context Kerberos 5 context + * @param enctype encryption type to enable + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_enable ( krb5_context /*context*/, @@ -1763,11 +3382,27 @@ krb5_enctype /*etype*/, char **/*string*/); +/** + * Check if a enctype is valid, return 0 if it is. + * + * @param context Kerberos context + * @param etype enctype to check if its valid or not + * + * @return Return an error code for an failure or 0 on success (enctype valid). + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_enctype_valid ( krb5_context /*context*/, krb5_enctype /*etype*/); +/** + * Deprecated: keytypes doesn't exists, they are really enctypes. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_enctypes_compatible_keys ( krb5_context /*context*/, @@ -1778,6 +3413,18 @@ krb5_error_code krb5_enomem (krb5_context /*context*/); +/** + * Log a warning to the log, default stderr, include bthe error from + * the last failure and then exit. + * + * @param context A Kerberos 5 context + * @param eval the exit code to exit with + * @param code error code of the last error + * @param fmt message to print + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err ( krb5_context /*context*/, @@ -1785,7 +3432,7 @@ krb5_error_code /*code*/, const char */*fmt*/, ...) - __attribute__ ((noreturn, format (printf, 4, 5))); + __attribute__ ((__noreturn__, __format__ (__printf__, 4, 5))); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_error_from_rd_error ( @@ -1793,13 +3440,38 @@ const krb5_error */*error*/, const krb5_creds */*creds*/); +/** + * Log a warning to the log, default stderr, and then exit. + * + * @param context A Kerberos 5 context + * @param eval the exit code to exit with + * @param fmt message to print + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_errx ( krb5_context /*context*/, int /*eval*/, const char */*fmt*/, ...) - __attribute__ ((noreturn, format (printf, 3, 4))); + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 4))); + +/** + * krb5_expand_hostname() tries to make orig_hostname into a more + * canonical one in the newly allocated space returned in + * new_hostname. + + * @param context a Keberos context + * @param orig_hostname hostname to canonicalise. + * @param new_hostname output hostname, caller must free hostname with + * krb5_xfree(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_support + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname ( @@ -1807,6 +3479,24 @@ const char */*orig_hostname*/, char **/*new_hostname*/); +/** + * krb5_expand_hostname_realms() expands orig_hostname to a name we + * believe to be a hostname in newly allocated space in new_hostname + * and return the realms new_hostname is believed to belong to in + * realms. + * + * @param context a Keberos context + * @param orig_hostname hostname to canonicalise. + * @param new_hostname output hostname, caller must free hostname with + * krb5_xfree(). + * @param realms output possible realms, is an array that is terminated + * with NULL. Caller must free with krb5_free_host_realm(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_expand_hostname_realms ( krb5_context /*context*/, @@ -1829,11 +3519,35 @@ size_t /*len*/, krb5_boolean /*include_time*/); +/** + * krb5_free_address frees the data stored in the address that is + * alloced with any of the krb5_address functions. + * + * @param context a Keberos context + * @param address addresss to be freed. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_address ( krb5_context /*context*/, krb5_address */*address*/); +/** + * krb5_free_addresses frees the data stored in the address that is + * alloced with any of the krb5_address functions. + * + * @param context a Keberos context + * @param addresses addressses to be freed. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_addresses ( krb5_context /*context*/, @@ -1859,33 +3573,103 @@ krb5_context /*context*/, krb5_checksum */*cksum*/); +/** + * Free a list of configuration files. + * + * @param filenames list, terminated with a NULL pointer, to be + * freed. NULL is an valid argument. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_config_files (char **/*filenames*/); +/** + * Frees the krb5_context allocated by krb5_init_context(). + * + * @param context context to be freed. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_context (krb5_context /*context*/); +/** + * Free content of krb5_creds. + * + * @param context Kerberos 5 context. + * @param c krb5_creds to free. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_cred_contents ( krb5_context /*context*/, krb5_creds */*c*/); +/** + * Free krb5_creds. + * + * @param context Kerberos 5 context. + * @param c krb5_creds to free. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds ( krb5_context /*context*/, krb5_creds */*c*/); +/** + * Deprecated: use krb5_free_cred_contents() + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_creds_contents ( krb5_context /*context*/, krb5_creds */*c*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Free krb5_data (and its content). + * + * @param context Kerberos 5 context. + * @param p krb5_data to free. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data ( krb5_context /*context*/, krb5_data */*p*/); +/** + * Same as krb5_data_free(). MIT compat. + * + * Deprecated: use krb5_data_free(). + * + * @param context Kerberos 5 context. + * @param data krb5_data to free. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_data_contents ( krb5_context /*context*/, @@ -1907,32 +3691,89 @@ krb5_context /*context*/, krb5_error */*error*/); +/** + * Free the error message returned by krb5_get_error_message(). + * + * @param context Kerberos context + * @param msg error message to free, returned byg + * krb5_get_error_message(). + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_message ( krb5_context /*context*/, const char */*msg*/); +/** + * Free the error message returned by krb5_get_error_string(). + * + * Deprecated: use krb5_free_error_message() + * + * @param context Kerberos context + * @param str error message to free + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_error_string ( krb5_context /*context*/, char */*str*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Free all memory allocated by `realmlist' + * + * @param context A Kerberos 5 context. + * @param realmlist realmlist to free, NULL is ok + * + * @return a Kerberos error code, always 0. + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_host_realm ( krb5_context /*context*/, krb5_realm */*realmlist*/); +/** + * Variable containing the FILE based credential cache implemention. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_kdc_rep ( krb5_context /*context*/, krb5_kdc_rep */*rep*/); +/** + * Free a keyblock, also zero out the content of the keyblock, uses + * krb5_free_keyblock_contents() to free the content. + * + * @param context a Kerberos 5 context + * @param keyblock keyblock to free, NULL is valid argument + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock ( krb5_context /*context*/, krb5_keyblock */*keyblock*/); +/** + * Free a keyblock's content, also zero out the content of the keyblock. + * + * @param context a Kerberos 5 context + * @param keyblock keyblock content to free, NULL is valid argument + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_keyblock_contents ( krb5_context /*context*/, @@ -1943,6 +3784,28 @@ krb5_context /*context*/, char **/*hostlist*/); +/** + * Free a name canonicalization rule iterator. + */ + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_free_name_canon_iterator ( + krb5_context /*context*/, + krb5_name_canon_iterator /*iter*/); + +/** + * Frees a Kerberos principal allocated by the library with + * krb5_parse_name(), krb5_make_principal() or any other related + * principal functions. + * + * @param context A Kerberos context. + * @param p a principal to free. + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_principal ( krb5_context /*context*/, @@ -1953,17 +3816,54 @@ krb5_context /*context*/, krb5_salt /*salt*/); +/** + * Free ticket and content + * + * @param context a Kerberos 5 context + * @param ticket ticket to free + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_free_ticket ( krb5_context /*context*/, krb5_ticket */*ticket*/); +/** + * Deprecated: use krb5_xfree(). + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_free_unparsed_name ( krb5_context /*context*/, char */*str*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Forward credentials for client to host hostname , making them + * forwardable if forwardable, and returning the blob of data to sent + * in out_data. If hostname == NULL, pick it from server. + * + * @param context A kerberos 5 context. + * @param auth_context the auth context with the key to encrypt the out_data. + * @param hostname the host to forward the tickets too. + * @param client the client to delegate from. + * @param server the server to delegate the credential too. + * @param ccache credential cache to use. + * @param forwardable make the forwarded ticket forwabledable. + * @param out_data the resulting credential. + * + * @return Return an error code or 0. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_fwd_tgt_creds ( krb5_context /*context*/, @@ -1975,6 +3875,46 @@ int /*forwardable*/, krb5_data */*out_data*/); +/** + * Fill buffer buf with len bytes of PRNG randomness that is ok to use + * for key generation, padding and public diclosing the randomness w/o + * disclosing the randomness source. + * + * This function can fail, and callers must check the return value. + * + * @param buf a buffer to fill with randomness + * @param len length of memory that buf points to. + * + * @return return 0 on success or HEIM_ERR_RANDOM_OFFLINE if the + * funcation failed to initialize the randomness source. + * + * @ingroup krb5_crypto + */ + +HEIMDAL_WARN_UNUSED_RESULT_ATTRIBUTE KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_generate_random ( + void */*buf*/, + size_t /*len*/); + +/** + * Fill buffer buf with len bytes of PRNG randomness that is ok to use + * for key generation, padding and public diclosing the randomness w/o + * disclosing the randomness source. + * + * This function can NOT fail, instead it will abort() and program will crash. + * + * If this function is called after a successful krb5_init_context(), + * the chance of it failing is low due to that krb5_init_context() + * pulls out some random, and quite commonly the randomness sources + * will not fail once it have started to produce good output, + * /dev/urandom behavies that way. + * + * @param buf a buffer to fill with randomness + * @param len length of memory that buf points to. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_generate_random_block ( void */*buf*/, @@ -1992,6 +3932,12 @@ const krb5_keyblock */*key*/, uint32_t */*seqno*/); +/** + * Deprecated: use krb5_generate_subkey_extended() + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey ( krb5_context /*context*/, @@ -1999,6 +3945,19 @@ krb5_keyblock **/*subkey*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Generate subkey, from keyblock + * + * @param context kerberos context + * @param key session key + * @param etype encryption type of subkey, if ETYPE_NULL, use key's enctype + * @param subkey returned new, free with krb5_free_keyblock(). + * + * @return 0 on success or a Kerberos 5 error code + * +* @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_generate_subkey_extended ( krb5_context /*context*/, @@ -2016,6 +3975,12 @@ krb5_context /*context*/, krb5_addresses */*res*/); +/** + * Deprecated: use krb5_get_credentials_with_flags(). + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc ( krb5_context /*context*/, @@ -2025,6 +3990,12 @@ krb5_creds ***/*ret_tgts*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: use krb5_get_credentials_with_flags(). + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_cred_from_kdc_opt ( krb5_context /*context*/, @@ -2100,9 +4071,35 @@ krb5_get_creds_opt /*opt*/, const Ticket */*ticket*/); +/** + * Get the global configuration list. + * + * @param pfilenames return array of filenames, should be freed with krb5_free_config_files(). + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_config_files (char ***/*pfilenames*/); +/** + * Get the default encryption types that will be use in communcation + * with the KDC, clients and servers. + * + * @param context Kerberos 5 context. + * @param pdu_type request type (AS, TGS or none) + * @param etypes Encryption types, array terminated with + * ETYPE_NULL(0), caller should free array with krb5_xfree(): + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_default_in_tkt_etypes ( krb5_context /*context*/, @@ -2124,33 +4121,135 @@ krb5_context /*context*/, krb5_realm **/*realms*/); +/** + * Get if the library uses DNS to canonicalize hostnames. + * + * @param context Kerberos 5 context. + * + * @return return non zero if the library uses DNS to canonicalize hostnames. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_dns_canonicalize_hostname (krb5_context /*context*/); +/** + * Return the error string for the error code. The caller must not + * free the string. + * + * This function is deprecated since its not threadsafe. + * + * @param context Kerberos 5 context. + * @param code Kerberos error code. + * + * @return the error message matching code + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_get_err_text ( krb5_context /*context*/, krb5_error_code /*code*/) - KRB5_DEPRECATED_FUNCTION("Use X instead"); + KRB5_DEPRECATED_FUNCTION("Use krb5_get_error_message instead"); + +/** + * Return the error message for `code' in context. On memory + * allocation error the function returns NULL. + * + * @param context Kerberos 5 context + * @param code Error code related to the error + * + * @return an error string, needs to be freed with + * krb5_free_error_message(). The functions return NULL on error. + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION const char * KRB5_LIB_CALL krb5_get_error_message ( krb5_context /*context*/, krb5_error_code /*code*/); +/** + * Return the error message in context. On error or no error string, + * the function returns NULL. + * + * @param context Kerberos 5 context + * + * @return an error string, needs to be freed with + * krb5_free_error_message(). The functions return NULL on error. + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION char * KRB5_LIB_CALL -krb5_get_error_string (krb5_context /*context*/); +krb5_get_error_string (krb5_context /*context*/) + KRB5_DEPRECATED_FUNCTION("Use krb5_get_error_message instead"); + +/** + * Get extra address to the address list that the library will add to + * the client's address list when communicating with the KDC. + * + * @param context Kerberos 5 context. + * @param addresses addreses to set + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_extra_addresses ( krb5_context /*context*/, krb5_addresses */*addresses*/); +/** + * Get version of fcache that the library should use. + * + * @param context Kerberos 5 context. + * @param version version number. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_fcache_version ( krb5_context /*context*/, int */*version*/); +/** + * Gets tickets forwarded to hostname. If the tickets that are + * forwarded are address-less, the forwarded tickets will also be + * address-less. + * + * If the ticket have any address, hostname will be used for figure + * out the address to forward the ticket too. This since this might + * use DNS, its insecure and also doesn't represent configured all + * addresses of the host. For example, the host might have two + * adresses, one IPv4 and one IPv6 address where the later is not + * published in DNS. This IPv6 address might be used communications + * and thus the resulting ticket useless. + * + * @param context A kerberos 5 context. + * @param auth_context the auth context with the key to encrypt the out_data. + * @param ccache credential cache to use + * @param flags the flags to control the resulting ticket flags + * @param hostname the host to forward the tickets too. + * @param in_creds the in client and server ticket names. The client + * and server components forwarded to the remote host. + * @param out_data the resulting credential. + * + * @return Return an error code or 0. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_forwarded_creds ( krb5_context /*context*/, @@ -2167,6 +4266,19 @@ const char */*targethost*/, krb5_realm **/*realms*/); +/** + * Get extra addresses to ignore when fetching addresses from the + * underlaying operating system. + * + * @param context Kerberos 5 context. + * @param addresses list addreses ignored + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_ignore_addresses ( krb5_context /*context*/, @@ -2204,6 +4316,12 @@ krb5_kdc_rep */*ret_as_reply*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: use krb5_get_init_creds() and friends. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_keytab ( krb5_context /*context*/, @@ -2217,6 +4335,12 @@ krb5_kdc_rep */*ret_as_reply*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: use krb5_get_init_creds() and friends. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_password ( krb5_context /*context*/, @@ -2230,6 +4354,12 @@ krb5_kdc_rep */*ret_as_reply*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: use krb5_get_init_creds() and friends. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_in_tkt_with_skey ( krb5_context /*context*/, @@ -2243,6 +4373,12 @@ krb5_kdc_rep */*ret_as_reply*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Get new credentials using keyblock. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keyblock ( krb5_context /*context*/, @@ -2253,6 +4389,12 @@ const char */*in_tkt_service*/, krb5_get_init_creds_opt */*options*/); +/** + * Get new credentials using keytab. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_keytab ( krb5_context /*context*/, @@ -2263,16 +4405,36 @@ const char */*in_tkt_service*/, krb5_get_init_creds_opt */*options*/); +/** + * Allocate a new krb5_get_init_creds_opt structure, free with + * krb5_get_init_creds_opt_free(). + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_alloc ( krb5_context /*context*/, krb5_get_init_creds_opt **/*opt*/); +/** + * Free krb5_get_init_creds_opt structure. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_free ( krb5_context /*context*/, krb5_get_init_creds_opt */*opt*/); +/** + * Deprecated: use the new krb5_init_creds_init() and + * krb5_init_creds_get_error(). + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_opt_get_error ( krb5_context /*context*/, @@ -2280,6 +4442,16 @@ KRB_ERROR **/*error*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: use krb5_get_init_creds_opt_alloc(). + * + * The reason krb5_get_init_creds_opt_init() is deprecated is that + * krb5_get_init_creds_opt is a static structure and for ABI reason it + * can't grow, ie can't add new functionality. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_init (krb5_get_init_creds_opt */*opt*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); @@ -2306,6 +4478,11 @@ krb5_get_init_creds_opt */*opt*/, krb5_boolean /*req*/); +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_get_init_creds_opt_set_change_password_prompt ( + krb5_get_init_creds_opt */*opt*/, + int /*change_password_prompt*/); + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_get_init_creds_opt_set_default_flags ( krb5_context /*context*/, @@ -2396,6 +4573,12 @@ krb5_get_init_creds_opt */*opt*/, krb5_boolean /*req*/); +/** + * Get new credentials using password. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_init_creds_password ( krb5_context /*context*/, @@ -2418,6 +4601,18 @@ krb5_creds */*in_creds*/, krb5_creds **out_creds ); +/** + * Get current offset in time to the KDC. + * + * @param context Kerberos 5 context. + * @param sec seconds part of offset. + * @param usec micro seconds part of offset. + * + * @return returns zero + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_kdc_sec_offset ( krb5_context /*context*/, @@ -2448,9 +4643,29 @@ const krb5_realm */*realm*/, char ***/*hostlist*/); +/** + * Get max time skew allowed. + * + * @param context Kerberos 5 context. + * + * @return timeskew in seconds. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_get_max_time_skew (krb5_context /*context*/); +/** + * krb5_init_context() will get one random byte to make sure our + * random is alive. Assumption is that once the non blocking + * source allows us to pull bytes, its all seeded and allows us to + * pull more bytes. + * + * Most Kerberos users calls krb5_init_context(), so this is + * useful point where we can do the checking. + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_permitted_enctypes ( krb5_context /*context*/, @@ -2476,9 +4691,33 @@ const krb5_data */*piece*/, krb5_rcache */*id*/); +/** + * Make the kerberos library default to the admin KDC. + * + * @param context Kerberos 5 context. + * + * @return boolean flag to telling the context will use admin KDC as the default KDC. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_get_use_admin_kdc (krb5_context /*context*/); +/** + * Validate the newly fetch credential, see also krb5_verify_init_creds(). + * + * @param context a Kerberos 5 context + * @param creds the credentials to verify + * @param client the client name to match up + * @param ccache the credential cache to use + * @param service a service name to use, used with + * krb5_sname_to_principal() to build a hostname to use to + * verify. + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_get_validated_creds ( krb5_context /*context*/, @@ -2487,6 +4726,14 @@ krb5_ccache /*ccache*/, char */*service*/); +/** + * Get the default logging facility. + * + * @param context A Kerberos 5 context + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_log_facility * KRB5_LIB_CALL krb5_get_warn_dest (krb5_context /*context*/); @@ -2503,6 +4750,20 @@ const char */*proto*/, int /*default_port*/); +/** + * krb5_h_addr2addr works like krb5_h_addr2sockaddr with the exception + * that it operates on a krb5_address instead of a struct sockaddr. + * + * @param context a Keberos context + * @param af address family + * @param haddr host address from struct hostent. + * @param addr returned krb5_address. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2addr ( krb5_context /*context*/, @@ -2510,6 +4771,25 @@ const char */*haddr*/, krb5_address */*addr*/); +/** + * krb5_h_addr2sockaddr initializes a "struct sockaddr sa" from af and + * the "struct hostent" (see gethostbyname(3) ) h_addr_list + * component. The argument sa_size should initially contain the size + * of the sa, and after the call, it will contain the actual length of + * the address. + * + * @param context a Keberos context + * @param af addresses + * @param addr address + * @param sa returned struct sockaddr + * @param sa_size size of sa + * @param port port to set in sa. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_addr2sockaddr ( krb5_context /*context*/, @@ -2519,11 +4799,23 @@ krb5_socklen_t */*sa_size*/, int /*port*/); +/** + * Convert the gethostname() error code (h_error) to a Kerberos et + * error code. + * + * @param eai_errno contains the error code from gethostname(). + * + * @return Kerberos error code representing the gethostname errors. + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_h_errno_to_heim_errno (int /*eai_errno*/); KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL -krb5_have_error_string (krb5_context /*context*/); +krb5_have_error_string (krb5_context /*context*/) + KRB5_DEPRECATED_FUNCTION("Use krb5_get_error_message instead"); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_hmac ( @@ -2535,31 +4827,102 @@ krb5_keyblock */*key*/, Checksum */*result*/); +/** + * Initializes the context structure and reads the configuration file + * /etc/krb5.conf. The structure should be freed by calling + * krb5_free_context() when it is no longer being used. + * + * @param context pointer to returned context + * + * @return Returns 0 to indicate success. Otherwise an errno code is + * returned. Failure means either that something bad happened during + * initialization (typically ENOMEM) or that Kerberos should not be + * used ENXIO. If the function returns HEIM_ERR_RANDOM_OFFLINE, the + * random source is not available and later Kerberos calls might fail. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_context (krb5_context */*context*/); +/** + * Free the krb5_init_creds_context allocated by krb5_init_creds_init(). + * + * @param context A Kerberos 5 context. + * @param ctx The krb5_init_creds_context to free. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_creds_free ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/); +/** + * Get new credentials as setup by the krb5_init_creds_context. + * + * @param context A Kerberos 5 context. + * @param ctx The krb5_init_creds_context to process. + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/); +/** + * Extract the newly acquired credentials from krb5_init_creds_context + * context. + * + * @param context A Kerberos 5 context. + * @param ctx + * @param cred credentials, free with krb5_free_cred_contents(). + * + * @return 0 for sucess or An Kerberos error code, see krb5_get_error_message(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get_creds ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/, krb5_creds */*cred*/); +/** + * Get the last error from the transaction. + * + * @return Returns 0 or an error code + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_get_error ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/, KRB_ERROR */*error*/); +/** + * Start a new context to get a new initial credential. + * + * @param context A Kerberos 5 context. + * @param client The Kerberos principal to get the credential for, if + * NULL is given, the default principal is used as determined by + * krb5_get_default_principal(). + * @param prompter + * @param prompter_data + * @param start_time the time the ticket should start to be valid or 0 for now. + * @param options a options structure, can be NULL for default options. + * @param rctx A new allocated free with krb5_init_creds_free(). + * + * @return 0 for success or an Kerberos 5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_init ( krb5_context /*context*/, @@ -2570,30 +4933,99 @@ krb5_get_init_creds_opt */*options*/, krb5_init_creds_context */*rctx*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_init_creds_set_fast_ap_armor_service ( + krb5_context /*context*/, + krb5_init_creds_context /*ctx*/, + krb5_const_principal /*armor_service*/); + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_init_creds_set_fast_ccache ( + krb5_context /*context*/, + krb5_init_creds_context /*ctx*/, + krb5_ccache /*fast_ccache*/); + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_keyblock ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/, krb5_keyblock */*keyblock*/); +/** + * Set the keytab to use for authentication. + * + * @param context a Kerberos 5 context. + * @param ctx ctx krb5_init_creds_context context. + * @param keytab the keytab to read the key from. + * + * @return 0 for success, or an Kerberos 5 error code, see krb5_get_error_message(). + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_keytab ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/, krb5_keytab /*keytab*/); +/** + * Sets the password that will use for the request. + * + * @param context a Kerberos 5 context. + * @param ctx ctx krb5_init_creds_context context. + * @param password the password to use. + * + * @return 0 for success, or an Kerberos 5 error code, see krb5_get_error_message(). + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_password ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/, const char */*password*/); +/** + * Sets the service that the is requested. This call is only neede for + * special initial tickets, by default the a krbtgt is fetched in the default realm. + * + * @param context a Kerberos 5 context. + * @param ctx a krb5_init_creds_context context. + * @param service the service given as a string, for example + * "kadmind/admin". If NULL, the default krbtgt in the clients + * realm is set. + * + * @return 0 for success, or an Kerberos 5 error code, see krb5_get_error_message(). + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_set_service ( krb5_context /*context*/, krb5_init_creds_context /*ctx*/, const char */*service*/); +/** + * The core loop if krb5_get_init_creds() function family. Create the + * packets and have the caller send them off to the KDC. + * + * If the caller want all work been done for them, use + * krb5_init_creds_get() instead. + * + * @param context a Kerberos 5 context. + * @param ctx ctx krb5_init_creds_context context. + * @param in input data from KDC, first round it should be reset by krb5_data_zer(). + * @param out reply to KDC. + * @param hostinfo KDC address info, first round it can be NULL. + * @param flags status of the round, if + * KRB5_INIT_CREDS_STEP_FLAG_CONTINUE is set, continue one more round. + * + * @return 0 for success, or an Kerberos 5 error code, see + * krb5_get_error_message(). + * + * @ingroup krb5_credential + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_init_creds_step ( krb5_context /*context*/, @@ -2603,20 +5035,115 @@ krb5_krbhst_info */*hostinfo*/, unsigned int */*flags*/); +/** + * + * @ingroup krb5_credential + */ + +krb5_error_code +krb5_init_creds_store ( + krb5_context /*context*/, + krb5_init_creds_context /*ctx*/, + krb5_ccache /*id*/); + +/** + * Init the built-in ets in the Kerberos library. + * + * @param context kerberos context to add the ets too + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_init_ets (krb5_context /*context*/); +/** + @struct krb5plugin_kuserok_ftable_desc * + * @brief Description of the krb5_kuserok(3) plugin facility. + * + * The krb5_kuserok(3) function is pluggable. The plugin is named + * KRB5_PLUGIN_KUSEROK ("krb5_plugin_kuserok"), with a single minor + * version, KRB5_PLUGIN_KUSEROK_VERSION_0 (0). + * + * The plugin for krb5_kuserok(3) consists of a data symbol referencing + * a structure of type krb5plugin_kuserok_ftable, with four fields: + * + * @param init Plugin initialization function (see krb5-plugin(7)) + * + * @param minor_version The plugin minor version number (0) + * + * @param fini Plugin finalization function + * + * @param kuserok Plugin kuserok function + * + * The kuserok field is the plugin entry point that performs the + * traditional kuserok operation however the plugin desires. It is + * invoked in no particular order relative to other kuserok plugins, but + * it has a 'rule' argument that indicates which plugin is intended to + * act on the rule. The plugin kuserok function must return + * KRB5_PLUGIN_NO_HANDLE if the rule is not applicable to it. + * + * The plugin kuserok function has the following arguments, in this + * order: + * + * -# plug_ctx, the context value output by the plugin's init function + * -# context, a krb5_context + * -# rule, the kuserok rule being evaluated (from krb5.conf(5)) + * -# flags + * -# k5login_dir, configured location of k5login per-user files if any + * -# luser, name of the local user account to which principal is attempting to access. + * -# principal, the krb5_principal trying to access the luser account + * -# result, a krb5_boolean pointer where the plugin will output its result + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_initlog ( krb5_context /*context*/, const char */*program*/, krb5_log_facility **/*fac*/); +/** + * Return TRUE (non zero) if the principal is a configuration + * principal (generated part of krb5_cc_set_config()). Returns FALSE + * (zero) if not a configuration principal. + * + * @param context a Keberos context + * @param principal principal to check if it a configuration principal + * + * @ingroup krb5_ccache + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_config_principal ( krb5_context /*context*/, krb5_const_principal /*principal*/); +/** + * Returns is the encryption is strong or weak + * + * @param context Kerberos 5 context + * @param enctype encryption type to probe + * + * @return Returns true if encryption type is weak or is not supported. + * + * @ingroup krb5_crypto + */ + +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +krb5_is_enctype_weak ( + krb5_context /*context*/, + krb5_enctype /*enctype*/); + +/** + * Runtime check if the Kerberos library was complied with thread support. + * + * @return TRUE if the library was compiled with thread support, FALSE if not. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_is_thread_safe (void); @@ -2633,12 +5160,40 @@ uint16_t /*opcode*/, krb5_storage **/*storage_p*/); +/** + * Returns the list of Kerberos encryption types sorted in order of + * most preferred to least preferred encryption type. Note that some + * encryption types might be disabled, so you need to check with + * krb5_enctype_valid() before using the encryption type. + * + * @return list of enctypes, terminated with ETYPE_NULL. Its a static + * array completed into the Kerberos library so the content doesn't + * need to be freed. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION const krb5_enctype * KRB5_LIB_CALL krb5_kerberos_enctypes (krb5_context /*context*/); +/** + * Get encryption type of a keyblock. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_enctype KRB5_LIB_CALL krb5_keyblock_get_enctype (const krb5_keyblock */*block*/); +/** + * Fill in `key' with key data of type `enctype' from `data' of length + * `size'. Key should be freed using krb5_free_keyblock_contents(). + * + * @return 0 on success or a Kerberos 5 error code + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keyblock_init ( krb5_context /*context*/, @@ -2655,9 +5210,23 @@ krb5_const_pointer /*keyseed*/, krb5_keyblock **/*key*/); +/** + * Zero out a keyblock + * + * @param keyblock keyblock to zero out + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_keyblock_zero (krb5_keyblock */*keyblock*/); +/** + * Deprecated: use krb5_get_init_creds() and friends. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_keytab_key_proc ( krb5_context /*context*/, @@ -2667,6 +5236,12 @@ krb5_keyblock **/*key*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: keytypes doesn't exists, they are really enctypes. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes ( krb5_context /*context*/, @@ -2675,6 +5250,12 @@ krb5_enctype **/*val*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: keytypes doesn't exists, they are really enctypes. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_enctypes_default ( krb5_context /*context*/, @@ -2683,6 +5264,13 @@ krb5_enctype **/*val*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: keytypes doesn't exists, they are really enctypes in + * most cases, use krb5_enctype_to_string(). + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_keytype_to_string ( krb5_context /*context*/, @@ -2702,6 +5290,16 @@ krb5_context /*context*/, krb5_krbhst_handle /*handle*/); +/** + * Return an `struct addrinfo *' for a KDC host. + * + * Returns an the struct addrinfo in in that corresponds to the + * information in `host'. free:ing is handled by krb5_krbhst_free, so + * the returned ai must not be released. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_krbhst_get_addrinfo ( krb5_context /*context*/, @@ -2741,17 +5339,63 @@ krb5_context /*context*/, krb5_krbhst_handle /*handle*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_krbhst_set_hostname ( + krb5_context /*context*/, + krb5_krbhst_handle /*handle*/, + const char */*hostname*/); + +/** + * Add the entry in `entry' to the keytab `id'. + * + * @param context a Keberos context. + * @param id a keytab. + * @param entry the entry to add + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_add_entry ( krb5_context /*context*/, krb5_keytab /*id*/, krb5_keytab_entry */*entry*/); +/** + * Finish using the keytab in `id'. All resources will be released, + * even on errors. + * + * @param context a Keberos context. + * @param id keytab to close. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_close ( krb5_context /*context*/, krb5_keytab /*id*/); +/** + * Compare `entry' against `principal, vno, enctype'. + * Any of `principal, vno, enctype' might be 0 which acts as a wildcard. + * Return TRUE if they compare the same, FALSE otherwise. + * + * @param context a Keberos context. + * @param entry an entry to match with. + * @param principal principal to match, NULL matches all principals. + * @param vno key version to match, 0 matches all key version numbers. + * @param enctype encryption type to match, 0 matches all encryption types. + * + * @return Return TRUE or match, FALSE if not matched. + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kt_compare ( krb5_context /*context*/, @@ -2760,45 +5404,143 @@ krb5_kvno /*vno*/, krb5_enctype /*enctype*/); +/** + * Copy the contents of `in' into `out'. + * + * @param context a Keberos context. + * @param in the keytab entry to copy. + * @param out the copy of the keytab entry, free with krb5_kt_free_entry(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_copy_entry_contents ( krb5_context /*context*/, const krb5_keytab_entry */*in*/, krb5_keytab_entry */*out*/); +/** + * Set `id' to the default keytab. + * + * @param context a Keberos context. + * @param id the new default keytab. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default ( krb5_context /*context*/, krb5_keytab */*id*/); +/** + * Copy the name of the default modify keytab into `name'. + * + * @param context a Keberos context. + * @param name buffer where the name will be written + * @param namesize length of name + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_modify_name ( krb5_context /*context*/, char */*name*/, size_t /*namesize*/); +/** + * copy the name of the default keytab into `name'. + * + * @param context a Keberos context. + * @param name buffer where the name will be written + * @param namesize length of name + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_default_name ( krb5_context /*context*/, char */*name*/, size_t /*namesize*/); +/** + * Destroy (remove) the keytab in `id'. All resources will be released, + * even on errors, does the equvalment of krb5_kt_close() on the resources. + * + * @param context a Keberos context. + * @param id keytab to destroy. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_destroy ( krb5_context /*context*/, krb5_keytab /*id*/); +/** + * Release all resources associated with `cursor'. + * + * @param context a Keberos context. + * @param id a keytab. + * @param cursor the cursor to free. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_end_seq_get ( krb5_context /*context*/, krb5_keytab /*id*/, krb5_kt_cursor */*cursor*/); +/** + * Free the contents of `entry'. + * + * @param context a Keberos context. + * @param entry the entry to free + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_free_entry ( krb5_context /*context*/, krb5_keytab_entry */*entry*/); +/** + * Retrieve the keytab entry for `principal, kvno, enctype' into `entry' + * from the keytab `id'. Matching is done like krb5_kt_compare(). + * + * @param context a Keberos context. + * @param id a keytab. + * @param principal principal to match, NULL matches all principals. + * @param kvno key version to match, 0 matches all key version numbers. + * @param enctype encryption type to match, 0 matches all encryption types. + * @param entry the returned entry, free with krb5_kt_free_entry(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_entry ( krb5_context /*context*/, @@ -2808,12 +5550,39 @@ krb5_enctype /*enctype*/, krb5_keytab_entry */*entry*/); +/** + * Retrieve the full name of the keytab `keytab' and store the name in + * `str'. + * + * @param context a Keberos context. + * @param keytab keytab to get name for. + * @param str the name of the keytab name, usee krb5_xfree() to free + * the string. On error, *str is set to NULL. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_full_name ( krb5_context /*context*/, krb5_keytab /*keytab*/, char **/*str*/); +/** + * Retrieve the name of the keytab `keytab' into `name', `namesize' + * + * @param context a Keberos context. + * @param keytab the keytab to get the name for. + * @param name name buffer. + * @param namesize size of name buffer. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_name ( krb5_context /*context*/, @@ -2821,6 +5590,20 @@ char */*name*/, size_t /*namesize*/); +/** + * Return the type of the `keytab' in the string `prefix of length + * `prefixsize'. + * + * @param context a Keberos context. + * @param keytab the keytab to get the prefix for + * @param prefix prefix buffer + * @param prefixsize length of prefix buffer + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_get_type ( krb5_context /*context*/, @@ -2828,11 +5611,36 @@ char */*prefix*/, size_t /*prefixsize*/); -KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +/** + * Return true if the keytab exists and have entries + * + * @param context a Keberos context. + * @param id a keytab. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_have_content ( krb5_context /*context*/, krb5_keytab /*id*/); +/** + * Get the next entry from keytab, advance the cursor. On last entry + * the function will return KRB5_KT_END. + * + * @param context a Keberos context. + * @param id a keytab. + * @param entry the returned entry, free with krb5_kt_free_entry(). + * @param cursor the cursor of the iteration. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_next_entry ( krb5_context /*context*/, @@ -2840,6 +5648,22 @@ krb5_keytab_entry */*entry*/, krb5_kt_cursor */*cursor*/); +/** + * Read the key identified by `(principal, vno, enctype)' from the + * keytab in `keyprocarg' (the default if == NULL) into `*key'. + * + * @param context a Keberos context. + * @param keyprocarg + * @param principal + * @param vno + * @param enctype + * @param key + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_read_service_key ( krb5_context /*context*/, @@ -2849,29 +5673,113 @@ krb5_enctype /*enctype*/, krb5_keyblock **/*key*/); +/** + * Register a new keytab backend. + * + * @param context a Keberos context. + * @param ops a backend to register. + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_register ( krb5_context /*context*/, const krb5_kt_ops */*ops*/); +/** + * Remove an entry from the keytab, matching is done using + * krb5_kt_compare(). + + * @param context a Keberos context. + * @param id a keytab. + * @param entry the entry to remove + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_remove_entry ( krb5_context /*context*/, krb5_keytab /*id*/, krb5_keytab_entry */*entry*/); +/** + * Resolve the keytab name (of the form `type:residual') in `name' + * into a keytab in `id'. + * + * @param context a Keberos context. + * @param name name to resolve + * @param id resulting keytab, free with krb5_kt_close(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_resolve ( krb5_context /*context*/, const char */*name*/, krb5_keytab */*id*/); +/** + * Set `cursor' to point at the beginning of `id'. + * + * @param context a Keberos context. + * @param id a keytab. + * @param cursor a newly allocated cursor, free with krb5_kt_end_seq_get(). + * + * @return Return an error code or 0, see krb5_get_error_message(). + * + * @ingroup krb5_keytab + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_kt_start_seq_get ( krb5_context /*context*/, krb5_keytab /*id*/, krb5_kt_cursor */*cursor*/); +/** + * This function takes the name of a local user and checks if + * principal is allowed to log in as that user. + * + * The user may have a ~/.k5login file listing principals that are + * allowed to login as that user. If that file does not exist, all + * principals with a only one component that is identical to the + * username, and a realm considered local, are allowed access. + * + * The .k5login file must contain one principal per line, be owned by + * user and not be writable by group or other (but must be readable by + * anyone). + * + * Note that if the file exists, no implicit access rights are given + * to user@@LOCALREALM. + * + * Optionally, a set of files may be put in ~/.k5login.d (a + * directory), in which case they will all be checked in the same + * manner as .k5login. The files may be called anything, but files + * starting with a hash (#) , or ending with a tilde (~) are + * ignored. Subdirectories are not traversed. Note that this directory + * may not be checked by other Kerberos implementations. + * + * If no configuration file exists, match user against local domains, + * ie luser@@LOCAL-REALMS-IN-CONFIGURATION-FILES. + * + * @param context Kerberos 5 context. + * @param principal principal to check if allowed to login + * @param luser local user id + * + * @return returns TRUE if access should be granted, FALSE otherwise. + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_kuserok ( krb5_context /*context*/, @@ -2885,7 +5793,7 @@ int /*level*/, const char */*fmt*/, ...) - __attribute__((format (printf, 4, 5))); + __attribute__ ((__format__ (__printf__, 4, 5))); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_log_msg ( @@ -2895,7 +5803,20 @@ char **/*reply*/, const char */*fmt*/, ...) - __attribute__((format (printf, 5, 6))); + __attribute__ ((__format__ (__printf__, 5, 6))); + +/** + * Create an address of type KRB5_ADDRESS_ADDRPORT from (addr, port) + * + * @param context a Keberos context + * @param res built address from addr/port + * @param addr address to use + * @param port port to use + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_addrport ( @@ -2904,6 +5825,19 @@ const krb5_address */*addr*/, int16_t /*port*/); +/** + * Build a principal using vararg style building + * + * @param context A Kerberos context. + * @param principal returned principal + * @param realm realm name + * @param ... a list of components ended with NULL. + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_principal ( krb5_context /*context*/, @@ -2911,6 +5845,15 @@ krb5_const_realm /*realm*/, ...); +/** + * krb5_max_sockaddr_size returns the max size of the .Li struct + * sockaddr that the Kerberos library will return. + * + * @return Return an size_t of the maximum struct sockaddr. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION size_t KRB5_LIB_CALL krb5_max_sockaddr_size (void); @@ -2926,6 +5869,19 @@ int */*client_usec*/, krb5_data */*reply*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_mk_error_ext ( + krb5_context /*context*/, + krb5_error_code /*error_code*/, + const char */*e_text*/, + const krb5_data */*e_data*/, + const krb5_principal /*server*/, + const PrincipalName */*client_name*/, + const Realm */*client_realm*/, + time_t */*client_time*/, + int */*client_usec*/, + krb5_data */*reply*/); + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_mk_priv ( krb5_context /*context*/, @@ -2978,6 +5934,49 @@ krb5_data */*outbuf*/, krb5_replay_data */*outdata*/); +/** + * Iteratively apply name canon rules, outputing a principal and rule + * options each time. Iteration completes when the @iter is NULL on + * return or when an error is returned. Callers must free the iterator + * if they abandon it mid-way. + * + * @param context Kerberos context + * @param iter name canon rule iterator (input/output) + * @param try_princ output principal name + * @param rule_opts output rule options + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_name_canon_iterate ( + krb5_context /*context*/, + krb5_name_canon_iterator */*iter*/, + krb5_const_principal */*try_princ*/, + krb5_name_canon_rule_options */*rule_opts*/); + +/** + * Initialize name canonicalization iterator. + * + * @param context Kerberos context + * @param in_princ principal name to be canonicalized OR + * @param iter output iterator object + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_name_canon_iterator_start ( + krb5_context /*context*/, + krb5_const_principal /*in_princ*/, + krb5_name_canon_iterator */*iter*/); + +/** + * Read \a len bytes from socket \a p_fd into buffer \a buf. + * Block until \a len bytes are read or until an error. + * + * @return If successful, the number of bytes read: \a len. + * On end-of-file, 0. + * On error, less than 0 (if single-threaded, the error can be found + * in the errno global variable). + */ + KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_net_read ( krb5_context /*context*/, @@ -3011,10 +6010,10 @@ krb5_ntlm /*ntlm*/); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_ntlm_init_get_challange ( +krb5_ntlm_init_get_challenge ( krb5_context /*context*/, krb5_ntlm /*ntlm*/, - krb5_data */*challange*/); + krb5_data */*challenge*/); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ntlm_init_get_flags ( @@ -3131,6 +6130,20 @@ krb5_context /*context*/, krb5_pac /*pac*/); +/** + * Get the PAC buffer of specific type from the pac. + * + * @param context Kerberos 5 context. + * @param p the pac structure returned by krb5_pac_parse(). + * @param type type of buffer to get + * @param data return data, free with krb5_data_free(). + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5_pac + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_get_buffer ( krb5_context /*context*/, @@ -3157,6 +6170,22 @@ size_t /*len*/, krb5_pac */*pac*/); +/** + * Verify the PAC. + * + * @param context Kerberos 5 context. + * @param pac the pac structure returned by krb5_pac_parse(). + * @param authtime The time of the ticket the PAC belongs to. + * @param principal the principal to verify. + * @param server The service key, most always be given. + * @param privsvr The KDC key, may be given. + + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5_pac + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_pac_verify ( krb5_context /*context*/, @@ -3174,18 +6203,56 @@ void */*buf*/, size_t /*len*/); +/** + * krb5_parse_address returns the resolved hostname in string to the + * krb5_addresses addresses . + * + * @param context a Keberos context + * @param string + * @param addresses + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_address ( krb5_context /*context*/, const char */*string*/, krb5_addresses */*addresses*/); +/** + * Parse a name into a krb5_principal structure + * + * @param context Kerberos 5 context + * @param name name to parse into a Kerberos principal + * @param principal returned principal, free with krb5_free_principal(). + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name ( krb5_context /*context*/, const char */*name*/, krb5_principal */*principal*/); +/** + * Parse a name into a krb5_principal structure, flags controls the behavior. + * + * @param context Kerberos 5 context + * @param name name to parse into a Kerberos principal + * @param flags flags to control the behavior + * @param principal returned principal, free with krb5_free_principal(). + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_name_flags ( krb5_context /*context*/, @@ -3193,6 +6260,12 @@ int /*flags*/, krb5_principal */*principal*/); +/** + * Parse nametype string and return a nametype integer + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_parse_nametype ( krb5_context /*context*/, @@ -3204,6 +6277,12 @@ krb5_context /*context*/, int /*result*/); +/** + * Deprecated: use krb5_get_init_creds() and friends. + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_CALLCONV krb5_password_key_proc ( krb5_context /*context*/, @@ -3221,6 +6300,18 @@ krb5_principal */*principal*/, struct hx509_certs_data **/*res*/); +/** + * Register a plugin symbol name of specific type. + * @param context a Keberos context + * @param type type of plugin symbol + * @param name name of plugin symbol + * @param symbol a pointer to the named symbol + * @return In case of error a non zero error com_err error is returned + * and the Kerberos error string is set. + * + * @ingroup krb5_support + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_plugin_register ( krb5_context /*context*/, @@ -3234,18 +6325,50 @@ char **/*pq*/, char ***/*ret_pp*/); +/** + * Prepend the filename to the global configuration list. + * + * @param filelist a filename to add to the default list of filename + * @param pfilenames return array of filenames, should be freed with krb5_free_config_files(). + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_prepend_config_files_default ( const char */*filelist*/, char ***/*pfilenames*/); +/** + * Prepend the context full error string for a specific error code. + * The error that is stored should be internationalized. + * + * The if context is NULL, no error string is stored. + * + * @param context Kerberos 5 context + * @param ret The error code + * @param fmt Error string for the error code + * @param ... printf(3) style parameters. + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_prepend_error_message ( krb5_context /*context*/, krb5_error_code /*ret*/, const char */*fmt*/, ...) - __attribute__ ((format (printf, 3, 4))); + __attribute__ ((__format__ (__printf__, 3, 4))); + +/** + * Deprecated: use krb5_principal_get_realm() + * + * @ingroup krb5_deprecated + */ KRB5_LIB_FUNCTION krb5_realm * KRB5_LIB_CALL krb5_princ_realm ( @@ -3253,6 +6376,12 @@ krb5_principal /*principal*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Deprecated: use krb5_principal_set_realm() + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_princ_set_realm ( krb5_context /*context*/, @@ -3260,12 +6389,39 @@ krb5_realm */*realm*/) KRB5_DEPRECATED_FUNCTION("Use X instead"); +/** + * Compares the two principals, including realm of the principals and returns + * TRUE if they are the same and FALSE if not. + * + * @param context Kerberos 5 context + * @param princ1 first principal to compare + * @param princ2 second principal to compare + * + * @ingroup krb5_principal + * @see krb5_principal_compare_any_realm() + * @see krb5_realm_compare() + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare ( krb5_context /*context*/, krb5_const_principal /*princ1*/, krb5_const_principal /*princ2*/); +/** + * Return TRUE iff princ1 == princ2 (without considering the realm) + * + * @param context Kerberos 5 context + * @param princ1 first principal to compare + * @param princ2 second principal to compare + * + * @return non zero if equal, 0 if not + * + * @ingroup krb5_principal + * @see krb5_principal_compare() + * @see krb5_realm_compare() + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_compare_any_realm ( krb5_context /*context*/, @@ -3278,44 +6434,204 @@ krb5_const_principal /*principal*/, unsigned int /*component*/); +/** + * Get number of component is principal. + * + * @param context Kerberos 5 context + * @param principal principal to query + * + * @return number of components in string + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION unsigned int KRB5_LIB_CALL krb5_principal_get_num_comp ( krb5_context /*context*/, krb5_const_principal /*principal*/); +/** + * Get the realm of the principal + * + * @param context A Kerberos context. + * @param principal principal to get the realm for + * + * @return realm of the principal, don't free or use after krb5_principal is freed + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION const char* KRB5_LIB_CALL krb5_principal_get_realm ( krb5_context /*context*/, krb5_const_principal /*principal*/); +/** + * Get the type of the principal + * + * @param context A Kerberos context. + * @param principal principal to get the type for + * + * @return the type of principal + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_principal_get_type ( krb5_context /*context*/, krb5_const_principal /*principal*/); +/** + * Returns true iff name is WELLKNOWN/ANONYMOUS + * + * @ingroup krb5_principal + */ + +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +krb5_principal_is_anonymous ( + krb5_context /*context*/, + krb5_const_principal /*p*/, + unsigned int /*flags*/); + +/** + * Returns true iff name is an WELLKNOWN:ORG.H5L.HOSTBASED-SERVICE + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_gss_hostbased_service ( + krb5_context /*context*/, + krb5_const_principal /*principal*/); + +/** + * Check if the cname part of the principal is a krbtgt principal + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_is_krbtgt ( krb5_context /*context*/, krb5_const_principal /*p*/); +/** + * Returns true if name is Kerberos an LKDC realm + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_lkdc ( + krb5_context /*context*/, + krb5_const_principal /*principal*/); + +/** + * Returns true if name is Kerberos NULL name + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_null ( + krb5_context /*context*/, + krb5_const_principal /*principal*/); + +/** + * Returns true if name is Kerberos an LKDC realm + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_pku2u ( + krb5_context /*context*/, + krb5_const_principal /*principal*/); + +/** + * Check if the cname part of the principal is a initial or renewed krbtgt principal + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_root_krbtgt ( + krb5_context /*context*/, + krb5_const_principal /*p*/); + +/** + * return TRUE iff princ matches pattern + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_principal_match ( krb5_context /*context*/, krb5_const_principal /*princ*/, krb5_const_principal /*pattern*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_principal_set_comp_string ( + krb5_context /*context*/, + krb5_principal /*principal*/, + unsigned int /*k*/, + const char */*component*/); + +/** + * Set a new realm for a principal, and as a side-effect free the + * previous realm. + * + * @param context A Kerberos context. + * @param principal principal set the realm for + * @param realm the new realm to set + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_principal_set_realm ( krb5_context /*context*/, krb5_principal /*principal*/, krb5_const_realm /*realm*/); +/** + * Set the type of the principal + * + * @param context A Kerberos context. + * @param principal principal to set the type for + * @param type the new type + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_principal_set_type ( krb5_context /*context*/, krb5_principal /*principal*/, int /*type*/); +/** + * krb5_print_address prints the address in addr to the string string + * that have the length len. If ret_len is not NULL, it will be filled + * with the length of the string if size were unlimited (not including + * the final NUL) . + * + * @param addr address to be printed + * @param str pointer string to print the address into + * @param len length that will fit into area pointed to by "str". + * @param ret_len return length the str. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_print_address ( const krb5_address */*addr*/, @@ -3323,6 +6639,12 @@ size_t /*len*/, size_t */*ret_len*/); +krb5_error_code +krb5_process_last_request ( + krb5_context /*context*/, + krb5_get_init_creds_opt */*options*/, + krb5_init_creds_context /*ctx*/); + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_program_setup ( krb5_context */*context*/, @@ -3341,6 +6663,23 @@ int /*num_prompts*/, krb5_prompt prompts[]); +/** + * Converts the random bytestring to a protocol key according to + * Kerberos crypto frame work. It may be assumed that all the bits of + * the input string are equally random, even though the entropy + * present in the random source may be limited. + * + * @param context Kerberos 5 context + * @param type the enctype resulting key will be of + * @param data input random data to convert to a key + * @param size size of input random data, at least krb5_enctype_keysize() long + * @param key key, output key, free with krb5_free_keyblock_contents() + * + * @return Return an error code or 0. + * + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_random_to_key ( krb5_context /*context*/, @@ -3462,6 +6801,23 @@ const krb5_data */*inbuf*/, krb5_ap_rep_enc_part **/*repl*/); +/** + * Process an AP_REQ message. + * + * @param context Kerberos 5 context. + * @param auth_context authentication context of the peer. + * @param inbuf the AP_REQ message, obtained for example with krb5_read_message(). + * @param server server principal. + * @param keytab server keytab. + * @param ap_req_options set to the AP_REQ options. See the AP_OPTS_* defines. + * @param ticket on success, set to the authenticated client credentials. + * Must be deallocated with krb5_free_ticket(). If not + * interested, pass a NULL value. + * + * @return 0 to indicate success. Otherwise a Kerberos error code is + * returned, see krb5_get_error_message(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req ( krb5_context /*context*/, @@ -3472,6 +6828,30 @@ krb5_flags */*ap_req_options*/, krb5_ticket **/*ticket*/); +/** + * The core server function that verify application authentication + * requests from clients. + * + * @param context Keberos 5 context. + * @param auth_context the authentication context, can be NULL, then + * default values for the authentication context will used. + * @param inbuf the (AP-REQ) authentication buffer + * + * @param server the server to authenticate to. If NULL the function + * will try to find any available credential in the keytab + * that will verify the reply. The function will prefer the + * server specified in the AP-REQ, but if + * there is no mach, it will try all keytab entries for a + * match. This has serious performance issues for large keytabs. + * + * @param inctx control the behavior of the function, if NULL, the + * default behavior is used. + * @param outctx the return outctx, free with krb5_rd_req_out_ctx_free(). + * @return Kerberos 5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_auth + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_ctx ( krb5_context /*context*/, @@ -3481,6 +6861,19 @@ krb5_rd_req_in_ctx /*inctx*/, krb5_rd_req_out_ctx */*outctx*/); +/** + * Allocate a krb5_rd_req_in_ctx as an input parameter to + * krb5_rd_req_ctx(). The caller should free the context with + * krb5_rd_req_in_ctx_free() when done with the context. + * + * @param context Keberos 5 context. + * @param ctx in ctx to krb5_rd_req_ctx(). + * + * @return Kerberos 5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_auth + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_ctx_alloc ( krb5_context /*context*/, @@ -3497,18 +6890,53 @@ krb5_rd_req_in_ctx /*in*/, krb5_keyblock */*keyblock*/); +/** + * Set the keytab that krb5_rd_req_ctx() will use. + * + * @param context Keberos 5 context. + * @param in in ctx to krb5_rd_req_ctx(). + * @param keytab keytab that krb5_rd_req_ctx() will use, only copy the + * pointer, so the caller must free they keytab after + * krb5_rd_req_in_ctx_free() is called. + * + * @return Kerberos 5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_auth + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_keytab ( krb5_context /*context*/, krb5_rd_req_in_ctx /*in*/, krb5_keytab /*keytab*/); +/** + * Set if krb5_rq_red() is going to check the Windows PAC or not + * + * @param context Keberos 5 context. + * @param in krb5_rd_req_in_ctx to check the option on. + * @param flag flag to select if to check the pac (TRUE) or not (FALSE). + * + * @return Kerberos 5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_auth + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_in_set_pac_check ( krb5_context /*context*/, krb5_rd_req_in_ctx /*in*/, krb5_boolean /*flag*/); +/** + * Free the krb5_rd_req_out_ctx. + * + * @param context Keberos 5 context. + * @param ctx krb5_rd_req_out_ctx context to free. + * + * @ingroup krb5_auth + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_rd_req_out_ctx_free ( krb5_context /*context*/, @@ -3526,6 +6954,18 @@ krb5_rd_req_out_ctx /*out*/, krb5_keyblock **/*keyblock*/); +/** + * Get the principal that was used in the request from the + * client. Might not match whats in the ticket if krb5_rd_req_ctx() + * searched in the keytab for a matching key. + * + * @param context a Kerberos 5 context. + * @param out a krb5_rd_req_out_ctx from krb5_rd_req_ctx(). + * @param principal return principal, free with krb5_free_principal(). + * + * @ingroup krb5_auth + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req_out_get_server ( krb5_context /*context*/, @@ -3576,12 +7016,52 @@ krb5_pointer /*p_fd*/, krb5_data */*data*/); +/** + * return TRUE iff realm(princ1) == realm(princ2) + * + * @param context Kerberos 5 context + * @param princ1 first principal to compare + * @param princ2 second principal to compare + * + * @ingroup krb5_principal + * @see krb5_principal_compare_any_realm() + * @see krb5_principal_compare() + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_realm_compare ( krb5_context /*context*/, krb5_const_principal /*princ1*/, krb5_const_principal /*princ2*/); +/** + * Returns true if name is Kerberos an LKDC realm + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_realm_is_lkdc (const char */*realm*/); + +/** + * Perform the server side of the sendauth protocol. + * + * @param context Kerberos 5 context. + * @param auth_context authentication context of the peer. + * @param p_fd socket associated to the connection. + * @param appl_version server-specific string. + * @param server server principal. + * @param flags if KRB5_RECVAUTH_IGNORE_VERSION is set, skip the sendauth version + * part of the protocol. + * @param keytab server keytab. + * @param ticket on success, set to the authenticated client credentials. + * Must be deallocated with krb5_free_ticket(). If not + * interested, pass a NULL value. + * + * @return 0 to indicate success. Otherwise a Kerberos error code is + * returned, see krb5_get_error_message(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_recvauth ( krb5_context /*context*/, @@ -3593,6 +7073,12 @@ krb5_keytab /*keytab*/, krb5_ticket **/*ticket*/); +/** + * Perform the server side of the sendauth protocol like krb5_recvauth(), but support + * a user-specified callback, \a match_appl_version, to perform the match of the application + * version \a match_data. + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_recvauth_match_version ( krb5_context /*context*/, @@ -3605,61 +7091,212 @@ krb5_keytab /*keytab*/, krb5_ticket **/*ticket*/); +/** + * Read a address block from the storage. + * + * @param sp the storage buffer to write to + * @param adr the address block read from storage + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_address ( krb5_storage */*sp*/, krb5_address */*adr*/); +/** + * Read a addresses block from the storage. + * + * @param sp the storage buffer to write to + * @param adr the addresses block read from storage + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_addrs ( krb5_storage */*sp*/, krb5_addresses */*adr*/); +/** + * Read a auth data from the storage. + * + * @param sp the storage buffer to write to + * @param auth the auth data block read from storage + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_authdata ( krb5_storage */*sp*/, krb5_authdata */*auth*/); +/** + * Read a credentials block from the storage. + * + * @param sp the storage buffer to write to + * @param creds the credentials block read from storage + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds ( krb5_storage */*sp*/, krb5_creds */*creds*/); +/** + * Read a tagged credentials block from the storage. + * + * @param sp the storage buffer to write to + * @param creds the credentials block read from storage + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_creds_tag ( krb5_storage */*sp*/, krb5_creds */*creds*/); +/** + * Parse a data from the storage. + * + * @param sp the storage buffer to read from + * @param data the parsed data + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_data ( krb5_storage */*sp*/, krb5_data */*data*/); +/** + * Read a int16 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int16 ( krb5_storage */*sp*/, int16_t */*value*/); +/** + * Read a int32 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int32 ( krb5_storage */*sp*/, int32_t */*value*/); +/** + * Read a int64 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_ret_int64 ( + krb5_storage */*sp*/, + int64_t */*value*/); + +/** + * Read a int8 from storage + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_int8 ( krb5_storage */*sp*/, int8_t */*value*/); +/** + * Read a keyblock from the storage. + * + * @param sp the storage buffer to write to + * @param p the keyblock read from storage, free using krb5_free_keyblock() + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_keyblock ( krb5_storage */*sp*/, krb5_keyblock */*p*/); +/** + * Parse principal from the storage. + * + * @param sp the storage buffer to read from + * @param princ the parsed principal + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_principal ( krb5_storage */*sp*/, krb5_principal */*princ*/); +/** + * Parse a string from the storage. + * + * @param sp the storage buffer to read from + * @param string the parsed string + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_string ( krb5_storage */*sp*/, @@ -3670,26 +7307,100 @@ krb5_storage */*sp*/, char **/*string*/); +/** + * Parse zero terminated string from the storage. + * + * @param sp the storage buffer to read from + * @param string the parsed string + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_stringz ( krb5_storage */*sp*/, char **/*string*/); +/** + * Read a times block from the storage. + * + * @param sp the storage buffer to write to + * @param times the times block read from storage + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_times ( krb5_storage */*sp*/, krb5_times */*times*/); +/** + * Read a int16 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint16 ( krb5_storage */*sp*/, uint16_t */*value*/); +/** + * Read a uint32 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint32 ( krb5_storage */*sp*/, uint32_t */*value*/); +/** + * Read a uint64 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_ret_uint64 ( + krb5_storage */*sp*/, + uint64_t */*value*/); + +/** + * Read a uint8 from storage + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ret_uint8 ( krb5_storage */*sp*/, @@ -3702,6 +7413,30 @@ krb5_salttype /*stype*/, char **/*string*/); +/** + * Perform the client side of the sendauth protocol. + * + * @param context Kerberos 5 context. + * @param auth_context Authentication context of the peer. + * @param p_fd Socket associated to the connection. + * @param appl_version Server-specific string. + * @param client Client principal. If NULL, use the credentials in \a ccache. + * @param server Server principal. + * @param ap_req_options Options for the AP_REQ message. See the AP_OPTS_* defines in krb5.h. + * @param in_data FIXME + * @param in_creds FIXME + * @param ccache Credentials cache. If NULL, use the default credentials cache. + * @param ret_error If not NULL, will be set to the error reported by server, if any. + * Must be deallocated with krb5_free_error_contents(). + * @param rep_result If not NULL, will be set to the EncApRepPart of the AP_REP message. + * Must be deallocated with krb5_free_ap_rep_enc_part(). + * @param out_creds FIXME If not NULL, will be set to FIXME. Must be deallocated with + * krb5_free_creds(). + * + * @return 0 to indicate success. Otherwise a Kerberos error code is + * returned, see krb5_get_error_message(). + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sendauth ( krb5_context /*context*/, @@ -3730,7 +7465,7 @@ krb5_context /*context*/, krb5_sendto_ctx /*ctx*/, const krb5_data */*send_data*/, - const krb5_realm /*realm*/, + krb5_const_realm /*realm*/, krb5_data */*receive*/); KRB5_LIB_FUNCTION void KRB5_LIB_CALL @@ -3738,6 +7473,23 @@ krb5_sendto_ctx /*ctx*/, int /*flags*/); +/** + * @section send_to_kdc Locating and sending packets to the KDC + * + * The send to kdc code is responsible to request the list of KDC from + * the locate-kdc subsystem and then send requests to each of them. + * + * - Each second a new hostname is tried. + * - If the hostname have several addresses, the first will be tried + * directly then in turn the other will be tried every 3 seconds + * (host_timeout). + * - UDP requests are tried 3 times, and it tried with a individual timeout of kdc_timeout / 3. + * - TCP and HTTP requests are tried 1 time. + * + * Total wait time shorter then (number of addresses * 3) + kdc_timeout seconds. + * + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sendto_ctx_alloc ( krb5_context /*context*/, @@ -3777,11 +7529,50 @@ krb5_data */*receive*/, int /*flags*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_sendto_set_hostname ( + krb5_context /*context*/, + krb5_sendto_ctx /*ctx*/, + const char */*hostname*/); + +/** + * Reinit the context from a new set of filenames. + * + * @param context context to add configuration too. + * @param filenames array of filenames, end of list is indicated with a NULL filename. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_config_files ( krb5_context /*context*/, char **/*filenames*/); +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_set_debug_dest ( + krb5_context /*context*/, + const char */*program*/, + const char */*log_spec*/); + +/** + * Set the default encryption types that will be use in communcation + * with the KDC, clients and servers. + * + * @param context Kerberos 5 context. + * @param etypes Encryption types, array terminated with ETYPE_NULL (0). + * A value of NULL resets the encryption types to the defaults set in the + * configuration file. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_default_in_tkt_etypes ( krb5_context /*context*/, @@ -3792,57 +7583,186 @@ krb5_context /*context*/, const char */*realm*/); +/** + * Set if the library should use DNS to canonicalize hostnames. + * + * @param context Kerberos 5 context. + * @param flag if its dns canonicalizion is used or not. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_dns_canonicalize_hostname ( krb5_context /*context*/, krb5_boolean /*flag*/); +/** + * Set the context full error string for a specific error code. + * The error that is stored should be internationalized. + * + * The if context is NULL, no error string is stored. + * + * @param context Kerberos 5 context + * @param ret The error code + * @param fmt Error string for the error code + * @param ... printf(3) style parameters. + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_error_message ( krb5_context /*context*/, krb5_error_code /*ret*/, const char */*fmt*/, ...) - __attribute__ ((format (printf, 3, 4))); + __attribute__ ((__format__ (__printf__, 3, 4))); + +/** + * Set the error message returned by krb5_get_error_string(). + * + * Deprecated: use krb5_get_error_message() + * + * @param context Kerberos context + * @param fmt error message to free + * + * @return Return an error code or 0. + * + * @ingroup krb5_deprecated + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_error_string ( krb5_context /*context*/, const char */*fmt*/, ...) - __attribute__((format (printf, 2, 3))) KRB5_DEPRECATED_FUNCTION("Use X instead"); + __attribute__ ((__format__ (__printf__, 2, 3))) KRB5_DEPRECATED_FUNCTION("Use X instead"); + +/** + * Set extra address to the address list that the library will add to + * the client's address list when communicating with the KDC. + * + * @param context Kerberos 5 context. + * @param addresses addreses to set + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_extra_addresses ( krb5_context /*context*/, const krb5_addresses */*addresses*/); +/** + * Set version of fcache that the library should use. + * + * @param context Kerberos 5 context. + * @param version version number. + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_fcache_version ( krb5_context /*context*/, int /*version*/); +/** + * Enable and disable home directory access on either the global state + * or the krb5_context state. By calling krb5_set_home_dir_access() + * with context set to NULL, the global state is configured otherwise + * the state for the krb5_context is modified. + * + * For home directory access to be allowed, both the global state and + * the krb5_context state have to be allowed. + * + * @param context a Kerberos 5 context or NULL + * @param allow allow if TRUE home directory + * @return the old value + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_set_home_dir_access ( krb5_context /*context*/, krb5_boolean /*allow*/); +/** + * Set extra addresses to ignore when fetching addresses from the + * underlaying operating system. + * + * @param context Kerberos 5 context. + * @param addresses addreses to ignore + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_ignore_addresses ( krb5_context /*context*/, const krb5_addresses */*addresses*/); +/** + * Set current offset in time to the KDC. + * + * @param context Kerberos 5 context. + * @param sec seconds part of offset. + * @param usec micro seconds part of offset. + * + * @return returns zero + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_kdc_sec_offset ( krb5_context /*context*/, int32_t /*sec*/, int32_t /*usec*/); +/** + * Set max time skew allowed. + * + * @param context Kerberos 5 context. + * @param t timeskew in seconds. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_max_time_skew ( krb5_context /*context*/, time_t /*t*/); +/** + * Change password using creds. + * + * @param context a Keberos context + * @param creds The initial kadmin/passwd for the principal or an admin principal + * @param newpw The new password to set + * @param targprinc if unset, the default principal is used. + * @param result_code Result code, KRB5_KPASSWD_SUCCESS is when password is changed. + * @param result_code_string binary message from the server, contains + * at least the result_code. + * @param result_string A message from the kpasswd service or the + * library in human printable form. The string is NUL terminated. + * + * @return On sucess and *result_code is KRB5_KPASSWD_SUCCESS, the password is changed. + + * @ingroup @krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_password ( krb5_context /*context*/, @@ -3863,6 +7783,20 @@ krb5_data */*result_code_string*/, krb5_data */*result_string*/); +/** + * Set the absolute time that the caller knows the kdc has so the + * kerberos library can calculate the relative diffrence beteen the + * KDC time and local system time. + * + * @param context Keberos 5 context. + * @param sec The applications new of "now" in seconds + * @param usec The applications new of "now" in micro seconds + + * @return Kerberos 5 error code, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_real_time ( krb5_context /*context*/, @@ -3875,16 +7809,57 @@ krb5_send_to_kdc_func /*func*/, void */*data*/); +/** + * Make the kerberos library default to the admin KDC. + * + * @param context Kerberos 5 context. + * @param flag boolean flag to select if the use the admin KDC or not. + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_set_use_admin_kdc ( krb5_context /*context*/, krb5_boolean /*flag*/); +/** + * Set the default logging facility. + * + * @param context A Kerberos 5 context + * @param fac Facility to use for logging. + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_set_warn_dest ( krb5_context /*context*/, krb5_log_facility */*fac*/); +/** + * Create a principal for the given service running on the given + * hostname. If KRB5_NT_SRV_HST is used, the hostname is canonicalized + * according the configured name canonicalization rules, with + * canonicalization delayed in some cases. One rule involves DNS, which + * is insecure unless DNSSEC is used, but we don't use DNSSEC-capable + * resolver APIs here, so that if DNSSEC is used we wouldn't know it. + * + * Canonicalization is immediate (not delayed) only when there is only + * one canonicalization rule and that rule indicates that we should do a + * host lookup by name (i.e., DNS). + * + * @param context A Kerberos context. + * @param hostname hostname to use + * @param sname Service name to use + * @param type name type of principal, use KRB5_NT_SRV_HST or KRB5_NT_UNKNOWN. + * @param ret_princ return principal, free with krb5_free_principal(). + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sname_to_principal ( krb5_context /*context*/, @@ -3901,12 +7876,39 @@ int32_t /*type*/, krb5_principal */*ret_princ*/); +/** + * krb5_sockaddr2address stores a address a "struct sockaddr" sa in + * the krb5_address addr. + * + * @param context a Keberos context + * @param sa a struct sockaddr to extract the address from + * @param addr an Kerberos 5 address to store the address in. + * + * @return Return an error code or 0. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2address ( krb5_context /*context*/, const struct sockaddr */*sa*/, krb5_address */*addr*/); +/** + * krb5_sockaddr2port extracts a port (if possible) from a "struct + * sockaddr. + * + * @param context a Keberos context + * @param sa a struct sockaddr to extract the port from + * @param port a pointer to an int16_t store the port in. + * + * @return Return an error code or 0. Will return + * KRB5_PROG_ATYPE_NOSUPP in case address type is not supported. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sockaddr2port ( krb5_context /*context*/, @@ -3916,6 +7918,18 @@ KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_sockaddr_is_loopback (const struct sockaddr */*sa*/); +/** + * krb5_sockaddr_uninteresting returns TRUE for all .Fa sa that the + * kerberos library thinks are uninteresting. One example are link + * local addresses. + * + * @param sa pointer to struct sockaddr that might be interesting. + * + * @return Return a non zero for uninteresting addresses. + * + * @ingroup krb5_address + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_sockaddr_uninteresting (const struct sockaddr */*sa*/); @@ -3925,147 +7939,546 @@ struct getargs */*args*/, int /*num_args*/); +/** + * Clear the flags on a storage buffer + * + * @param sp the storage buffer to clear the flags on + * @param flags the flags to clear + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_clear_flags ( krb5_storage */*sp*/, krb5_flags /*flags*/); +/** + * Create a elastic (allocating) memory storage backend. Memory is + * allocated on demand. Free returned krb5_storage with + * krb5_storage_free(). + * + * @return A krb5_storage on success, or NULL on out of memory error. + * + * @ingroup krb5_storage + * + * @sa krb5_storage_from_mem() + * @sa krb5_storage_from_readonly_mem() + * @sa krb5_storage_from_fd() + * @sa krb5_storage_from_data() + * @sa krb5_storage_from_socket() + */ + KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL krb5_storage_emem (void); +/** + * Free a krb5 storage. + * + * @param sp the storage to free. + * + * @return An Kerberos 5 error code. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_free (krb5_storage */*sp*/); +/** + * Create a fixed size memory storage block + * + * @return A krb5_storage on success, or NULL on out of memory error. + * + * @ingroup krb5_storage + * + * @sa krb5_storage_mem() + * @sa krb5_storage_from_mem() + * @sa krb5_storage_from_readonly_mem() + * @sa krb5_storage_from_fd() + */ + KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL krb5_storage_from_data (krb5_data */*data*/); +/** + * + * + * @return A krb5_storage on success, or NULL on out of memory error. + * + * @ingroup krb5_storage + * + * @sa krb5_storage_emem() + * @sa krb5_storage_from_mem() + * @sa krb5_storage_from_readonly_mem() + * @sa krb5_storage_from_data() + * @sa krb5_storage_from_socket() + */ + KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL -krb5_storage_from_fd (krb5_socket_t /*fd_in*/); +krb5_storage_from_fd (int /*fd_in*/); + +/** + * Create a fixed size memory storage block + * + * @return A krb5_storage on success, or NULL on out of memory error. + * + * @ingroup krb5_storage + * + * @sa krb5_storage_mem() + * @sa krb5_storage_from_readonly_mem() + * @sa krb5_storage_from_data() + * @sa krb5_storage_from_fd() + * @sa krb5_storage_from_socket() + */ KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL krb5_storage_from_mem ( void */*buf*/, size_t /*len*/); +/** + * Create a fixed size memory storage block that is read only + * + * @return A krb5_storage on success, or NULL on out of memory error. + * + * @ingroup krb5_storage + * + * @sa krb5_storage_mem() + * @sa krb5_storage_from_mem() + * @sa krb5_storage_from_data() + * @sa krb5_storage_from_fd() + */ + KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL krb5_storage_from_readonly_mem ( const void */*buf*/, size_t /*len*/); +/** + * + * + * @return A krb5_storage on success, or NULL on out of memory error. + * + * @ingroup krb5_storage + * + * @sa krb5_storage_emem() + * @sa krb5_storage_from_mem() + * @sa krb5_storage_from_readonly_mem() + * @sa krb5_storage_from_data() + * @sa krb5_storage_from_fd() + */ + +KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL +krb5_storage_from_socket (krb5_socket_t /*sock_in*/); + +/** + * Sync the storage buffer to its backing store. If there is no + * backing store this function will return success. + * + * @param sp the storage buffer to sync + * + * @return A Kerberos 5 error code + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION int KRB5_LIB_CALL +krb5_storage_fsync (krb5_storage */*sp*/); + +/** + * Return the current byteorder for the buffer. See krb5_storage_set_byteorder() for the list or byte order contants. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_flags KRB5_LIB_CALL krb5_storage_get_byteorder (krb5_storage */*sp*/); +/** + * Get the return code that will be used when end of storage is reached. + * + * @param sp the storage + * + * @return storage error code + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_get_eof_code (krb5_storage */*sp*/); +/** + * Return true or false depending on if the storage flags is set or + * not. NB testing for the flag 0 always return true. + * + * @param sp the storage buffer to check flags on + * @param flags The flags to test for + * + * @return true if all the flags are set, false if not. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL krb5_storage_is_flags ( krb5_storage */*sp*/, krb5_flags /*flags*/); +/** + * Read to the storage buffer. + * + * @param sp the storage buffer to read from + * @param buf the buffer to store the data in + * @param len the length to read + * + * @return The length of data read (can be shorter then len), or negative on error. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_read ( krb5_storage */*sp*/, void */*buf*/, size_t /*len*/); +/** + * Seek to a new offset. + * + * @param sp the storage buffer to seek in. + * @param offset the offset to seek + * @param whence relateive searching, SEEK_CUR from the current + * position, SEEK_END from the end, SEEK_SET absolute from the start. + * + * @return The new current offset + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION off_t KRB5_LIB_CALL krb5_storage_seek ( krb5_storage */*sp*/, off_t /*offset*/, int /*whence*/); +/** + * Set the new byte order of the storage buffer. + * + * @param sp the storage buffer to set the byte order for. + * @param byteorder the new byte order. + * + * The byte order are: KRB5_STORAGE_BYTEORDER_BE, + * KRB5_STORAGE_BYTEORDER_LE and KRB5_STORAGE_BYTEORDER_HOST. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_byteorder ( krb5_storage */*sp*/, krb5_flags /*byteorder*/); +/** + * Set the return code that will be used when end of storage is reached. + * + * @param sp the storage + * @param code the error code to return on end of storage + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_eof_code ( krb5_storage */*sp*/, int /*code*/); +/** + * Add the flags on a storage buffer by or-ing in the flags to the buffer. + * + * @param sp the storage buffer to set the flags on + * @param flags the flags to set + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_flags ( krb5_storage */*sp*/, krb5_flags /*flags*/); +/** + * Set the max alloc value + * + * @param sp the storage buffer set the max allow for + * @param size maximum size to allocate, use 0 to remove limit + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_storage_set_max_alloc ( krb5_storage */*sp*/, size_t /*size*/); +/** + * Copy the contnent of storage + * + * @param sp the storage to copy to a data + * @param data the copied data, free with krb5_data_free() + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_to_data ( krb5_storage */*sp*/, krb5_data */*data*/); +/** + * Truncate the storage buffer in sp to offset. + * + * @param sp the storage buffer to truncate. + * @param offset the offset to truncate too. + * + * @return An Kerberos 5 error code. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION int KRB5_LIB_CALL krb5_storage_truncate ( krb5_storage */*sp*/, off_t /*offset*/); +/** + * Write to the storage buffer. + * + * @param sp the storage buffer to write to + * @param buf the buffer to write to the storage buffer + * @param len the length to write + * + * @return The length of data written (can be shorter then len), or negative on error. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_storage_write ( krb5_storage */*sp*/, const void */*buf*/, size_t /*len*/); +/** + * Write a address block to storage. + * + * @param sp the storage buffer to write to + * @param p the address block to write. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_address ( krb5_storage */*sp*/, krb5_address /*p*/); +/** + * Write a addresses block to storage. + * + * @param sp the storage buffer to write to + * @param p the addresses block to write. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_addrs ( krb5_storage */*sp*/, krb5_addresses /*p*/); +/** + * Write a auth data block to storage. + * + * @param sp the storage buffer to write to + * @param auth the auth data block to write. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_authdata ( krb5_storage */*sp*/, krb5_authdata /*auth*/); +/** + * Write a credentials block to storage. + * + * @param sp the storage buffer to write to + * @param creds the creds block to write. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds ( krb5_storage */*sp*/, krb5_creds */*creds*/); +/** + * Write a tagged credentials block to storage. + * + * @param sp the storage buffer to write to + * @param creds the creds block to write. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_creds_tag ( krb5_storage */*sp*/, krb5_creds */*creds*/); +/** + * Store a data to the storage. The data is stored with an int32 as + * lenght plus the data (not padded). + * + * @param sp the storage buffer to write to + * @param data the buffer to store. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_data ( krb5_storage */*sp*/, krb5_data /*data*/); +/** + * Store a int16 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int16 ( krb5_storage */*sp*/, int16_t /*value*/); +/** + * Store a int32 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int32 ( krb5_storage */*sp*/, int32_t /*value*/); +/** + * Store a int64 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_store_int64 ( + krb5_storage */*sp*/, + int64_t /*value*/); + +/** + * Store a int8 to storage. + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_int8 ( krb5_storage */*sp*/, int8_t /*value*/); +/** + * Store a keyblock to the storage. + * + * @param sp the storage buffer to write to + * @param p the keyblock to write + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_keyblock ( krb5_storage */*sp*/, krb5_keyblock /*p*/); +/** + * Write a principal block to storage. + * + * @param sp the storage buffer to write to + * @param p the principal block to write. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_principal ( krb5_storage */*sp*/, krb5_const_principal /*p*/); +/** + * Store a string to the buffer. The data is formated as an len:uint32 + * plus the string itself (not padded). + * + * @param sp the storage buffer to write to + * @param s the string to store. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_string ( krb5_storage */*sp*/, @@ -4076,26 +8489,101 @@ krb5_storage */*sp*/, const char */*s*/); +/** + * Store a zero terminated string to the buffer. The data is stored + * one character at a time until a NUL is stored. + * + * @param sp the storage buffer to write to + * @param s the string to store. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_stringz ( krb5_storage */*sp*/, const char */*s*/); +/** + * Write a times block to storage. + * + * @param sp the storage buffer to write to + * @param times the times block to write. + * + * @return 0 on success, a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_times ( krb5_storage */*sp*/, krb5_times /*times*/); +/** + * Store a uint16 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint16 ( krb5_storage */*sp*/, uint16_t /*value*/); +/** + * Store a uint32 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint32 ( krb5_storage */*sp*/, uint32_t /*value*/); +/** + * Store a uint64 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_store_uint64 ( + krb5_storage */*sp*/, + uint64_t /*value*/); + +/** + * Store a uint8 to storage. + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_store_uint8 ( krb5_storage */*sp*/, @@ -4170,6 +8658,13 @@ krb5_data /*opaque*/, krb5_keyblock */*key*/); +/** + * Deprecated: keytypes doesn't exists, they are really enctypes in + * most cases, use krb5_string_to_enctype(). + * + * @ingroup krb5_deprecated + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_string_to_keytype ( krb5_context /*context*/, @@ -4184,6 +8679,19 @@ const char */*string*/, krb5_salttype */*salttype*/); +/** + * Extract the authorization data type of type from the ticket. Store + * the field in data. This function is to use for kerberos + * applications. + * + * @param context a Kerberos 5 context + * @param ticket Kerberos ticket + * @param type type to fetch + * @param data returned data, free with krb5_data_free() + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_authorization_data_type ( krb5_context /*context*/, @@ -4191,39 +8699,117 @@ int /*type*/, krb5_data */*data*/); +/** + * Return client principal in ticket + * + * @param context a Kerberos 5 context + * @param ticket ticket to copy + * @param client client principal, free with krb5_free_principal() + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_client ( krb5_context /*context*/, const krb5_ticket */*ticket*/, krb5_principal */*client*/); +/** + * Return end time of ticket + * + * @param context a Kerberos 5 context + * @param ticket ticket to copy + * + * @return end time of ticket + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION time_t KRB5_LIB_CALL krb5_ticket_get_endtime ( krb5_context /*context*/, const krb5_ticket */*ticket*/); +/** + * Get the flags from the Kerberos ticket + * + * @param context Kerberos context + * @param ticket Kerberos ticket + * + * @return ticket flags + * + * @ingroup krb5_ticket + */ + KRB5_LIB_FUNCTION unsigned long KRB5_LIB_CALL krb5_ticket_get_flags ( krb5_context /*context*/, const krb5_ticket */*ticket*/); +/** + * Return server principal in ticket + * + * @param context a Kerberos 5 context + * @param ticket ticket to copy + * @param server server principal, free with krb5_free_principal() + * + * @return Returns 0 to indicate success. Otherwise an kerberos et + * error code is returned, see krb5_get_error_message(). + * + * @ingroup krb5 + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_ticket_get_server ( krb5_context /*context*/, const krb5_ticket */*ticket*/, krb5_principal */*server*/); +/** + * If the caller passes in a negative usec, its assumed to be + * unknown and the function will use the current time usec. + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_timeofday ( krb5_context /*context*/, krb5_timestamp */*timeret*/); +/** + * Unparse the Kerberos name into a string + * + * @param context Kerberos 5 context + * @param principal principal to query + * @param name resulting string, free with krb5_xfree() + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name ( krb5_context /*context*/, krb5_const_principal /*principal*/, char **/*name*/); +/** + * Unparse the principal name to a fixed buffer + * + * @param context A Kerberos context. + * @param principal principal to unparse + * @param name buffer to write name to + * @param len length of buffer + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed ( krb5_context /*context*/, @@ -4231,6 +8817,20 @@ char */*name*/, size_t /*len*/); +/** + * Unparse the principal name with unparse flags to a fixed buffer. + * + * @param context A Kerberos context. + * @param principal principal to unparse + * @param flags unparse flags + * @param name buffer to write name to + * @param len length of buffer + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_flags ( krb5_context /*context*/, @@ -4239,6 +8839,20 @@ char */*name*/, size_t /*len*/); +/** + * Unparse the principal name to a fixed buffer. The realm is skipped + * if its a default realm. + * + * @param context A Kerberos context. + * @param principal principal to unparse + * @param name buffer to write name to + * @param len length of buffer + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_fixed_short ( krb5_context /*context*/, @@ -4246,6 +8860,19 @@ char */*name*/, size_t /*len*/); +/** + * Unparse the Kerberos name into a string + * + * @param context Kerberos 5 context + * @param principal principal to query + * @param flags flag to determine the behavior + * @param name resulting string, free with krb5_xfree() + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_flags ( krb5_context /*context*/, @@ -4253,6 +8880,19 @@ int /*flags*/, char **/*name*/); +/** + * Unparse the principal name to a allocated buffer. The realm is + * skipped if its a default realm. + * + * @param context A Kerberos context. + * @param principal principal to unparse + * @param name returned buffer, free with krb5_xfree() + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_unparse_name_short ( krb5_context /*context*/, @@ -4265,20 +8905,32 @@ krb5_timestamp */*sec*/, int32_t */*usec*/); +/** + * Log a warning to the log, default stderr, include bthe error from + * the last failure and then abort. + * + * @param context A Kerberos 5 context + * @param code error code of the last error + * @param fmt message to print + * @param ap arguments + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vabort ( krb5_context /*context*/, krb5_error_code /*code*/, const char */*fmt*/, va_list /*ap*/) - __attribute__ ((noreturn, format (printf, 3, 0))); + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 0))); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vabortx ( krb5_context /*context*/, const char */*fmt*/, va_list /*ap*/) - __attribute__ ((noreturn, format (printf, 2, 0))); + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 0))); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verify_ap_req ( @@ -4319,6 +8971,20 @@ size_t /*len*/, Checksum */*cksum*/); +/** + * Verify a Kerberos message checksum. + * + * @param context Kerberos context + * @param crypto Kerberos crypto context + * @param usage Key usage for this buffer + * @param data array of buffers to process + * @param num_data length of array + * @param type return checksum type if not NULL + * + * @return Return an error code or 0. + * @ingroup krb5_crypto + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verify_checksum_iov ( krb5_context /*context*/, @@ -4406,6 +9072,19 @@ const char */*password*/, krb5_verify_opt */*opt*/); +/** + * Log a warning to the log, default stderr, include bthe error from + * the last failure and then exit. + * + * @param context A Kerberos 5 context + * @param eval the exit code to exit with + * @param code error code of the last error + * @param fmt message to print + * @param ap arguments + * + * @ingroup krb5_error + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verr ( krb5_context /*context*/, @@ -4413,7 +9092,18 @@ krb5_error_code /*code*/, const char */*fmt*/, va_list /*ap*/) - __attribute__ ((noreturn, format (printf, 4, 0))); + __attribute__ ((__noreturn__, __format__ (__printf__, 4, 0))); + +/** + * Log a warning to the log, default stderr, and then exit. + * + * @param context A Kerberos 5 context + * @param eval the exit code to exit with + * @param fmt message to print + * @param ap arguments + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verrx ( @@ -4421,7 +9111,7 @@ int /*eval*/, const char */*fmt*/, va_list /*ap*/) - __attribute__ ((noreturn, format (printf, 3, 0))); + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 0))); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vlog ( @@ -4430,7 +9120,7 @@ int /*level*/, const char */*fmt*/, va_list /*ap*/) - __attribute__((format (printf, 4, 0))); + __attribute__ ((__format__ (__printf__, 4, 0))); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vlog_msg ( @@ -4440,7 +9130,20 @@ int /*level*/, const char */*fmt*/, va_list /*ap*/) - __attribute__((format (printf, 5, 0))); + __attribute__ ((__format__ (__printf__, 5, 0))); + +/** + * Prepend the contexts's full error string for a specific error code. + * + * The if context is NULL, no error string is stored. + * + * @param context Kerberos 5 context + * @param ret The error code + * @param fmt Error string for the error code + * @param args printf(3) style parameters. + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vprepend_error_message ( @@ -4448,7 +9151,20 @@ krb5_error_code /*ret*/, const char */*fmt*/, va_list /*args*/) - __attribute__ ((format (printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); + +/** + * Set the context full error string for a specific error code. + * + * The if context is NULL, no error string is stored. + * + * @param context Kerberos 5 context + * @param ret The error code + * @param fmt Error string for the error code + * @param args printf(3) style parameters. + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_vset_error_message ( @@ -4456,14 +9172,41 @@ krb5_error_code /*ret*/, const char */*fmt*/, va_list /*args*/) - __attribute__ ((format (printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); + +/** + * Set the error message returned by krb5_get_error_string(), + * deprecated, use krb5_set_error_message(). + * + * Deprecated: use krb5_vset_error_message() + * + * @param context Kerberos context + * @param fmt error message to free + * @param args variable argument list vector + * + * @return Return an error code or 0. + * + * @ingroup krb5_deprecated + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vset_error_string ( krb5_context /*context*/, const char */*fmt*/, va_list /*args*/) - __attribute__ ((format (printf, 2, 0))) KRB5_DEPRECATED_FUNCTION("Use X instead"); + __attribute__ ((__format__ (__printf__, 2, 0))) KRB5_DEPRECATED_FUNCTION("Use X instead"); + +/** + * Log a warning to the log, default stderr, include the error from + * the last failure. + * + * @param context A Kerberos 5 context. + * @param code error code of the last error + * @param fmt message to print + * @param ap arguments + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarn ( @@ -4471,14 +9214,35 @@ krb5_error_code /*code*/, const char */*fmt*/, va_list /*ap*/) - __attribute__ ((format (printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); + +/** + * Log a warning to the log, default stderr. + * + * @param context A Kerberos 5 context. + * @param fmt message to print + * @param ap arguments + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarnx ( krb5_context /*context*/, const char */*fmt*/, va_list /*ap*/) - __attribute__ ((format (printf, 2, 0))); + __attribute__ ((__format__ (__printf__, 2, 0))); + +/** + * Log a warning to the log, default stderr, include the error from + * the last failure. + * + * @param context A Kerberos 5 context. + * @param code error code of the last error + * @param fmt message to print + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warn ( @@ -4486,14 +9250,23 @@ krb5_error_code /*code*/, const char */*fmt*/, ...) - __attribute__ ((format (printf, 3, 4))); + __attribute__ ((__format__ (__printf__, 3, 4))); + +/** + * Log a warning to the log, default stderr. + * + * @param context A Kerberos 5 context. + * @param fmt message to print + * + * @ingroup krb5_error + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warnx ( krb5_context /*context*/, const char */*fmt*/, ...) - __attribute__ ((format (printf, 2, 3))); + __attribute__ ((__format__ (__printf__, 2, 3))); KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_write_message ( @@ -4524,4 +9297,5 @@ #undef KRB5_DEPRECATED_FUNCTION +#endif /* DOXY */ #endif /* __krb5_protos_h__ */ diff --git a/crypto/heimdal/lib/krb5/krb5.h b/crypto/heimdal/lib/krb5/krb5.h --- a/crypto/heimdal/lib/krb5/krb5.h +++ b/crypto/heimdal/lib/krb5/krb5.h @@ -117,53 +117,52 @@ } krb5_enc_data; /* alternative names */ -enum { - ENCTYPE_NULL = KRB5_ENCTYPE_NULL, - ENCTYPE_DES_CBC_CRC = KRB5_ENCTYPE_DES_CBC_CRC, - ENCTYPE_DES_CBC_MD4 = KRB5_ENCTYPE_DES_CBC_MD4, - ENCTYPE_DES_CBC_MD5 = KRB5_ENCTYPE_DES_CBC_MD5, - ENCTYPE_DES3_CBC_MD5 = KRB5_ENCTYPE_DES3_CBC_MD5, - ENCTYPE_OLD_DES3_CBC_SHA1 = KRB5_ENCTYPE_OLD_DES3_CBC_SHA1, - ENCTYPE_SIGN_DSA_GENERATE = KRB5_ENCTYPE_SIGN_DSA_GENERATE, - ENCTYPE_ENCRYPT_RSA_PRIV = KRB5_ENCTYPE_ENCRYPT_RSA_PRIV, - ENCTYPE_ENCRYPT_RSA_PUB = KRB5_ENCTYPE_ENCRYPT_RSA_PUB, - ENCTYPE_DES3_CBC_SHA1 = KRB5_ENCTYPE_DES3_CBC_SHA1, - ENCTYPE_AES128_CTS_HMAC_SHA1_96 = KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96, - ENCTYPE_AES256_CTS_HMAC_SHA1_96 = KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96, - ENCTYPE_ARCFOUR_HMAC = KRB5_ENCTYPE_ARCFOUR_HMAC_MD5, - ENCTYPE_ARCFOUR_HMAC_MD5 = KRB5_ENCTYPE_ARCFOUR_HMAC_MD5, - ENCTYPE_ARCFOUR_HMAC_MD5_56 = KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56, - ENCTYPE_ENCTYPE_PK_CROSS = KRB5_ENCTYPE_ENCTYPE_PK_CROSS, - ENCTYPE_DES_CBC_NONE = KRB5_ENCTYPE_DES_CBC_NONE, - ENCTYPE_DES3_CBC_NONE = KRB5_ENCTYPE_DES3_CBC_NONE, - ENCTYPE_DES_CFB64_NONE = KRB5_ENCTYPE_DES_CFB64_NONE, - ENCTYPE_DES_PCBC_NONE = KRB5_ENCTYPE_DES_PCBC_NONE, - ETYPE_NULL = KRB5_ENCTYPE_NULL, - ETYPE_DES_CBC_CRC = KRB5_ENCTYPE_DES_CBC_CRC, - ETYPE_DES_CBC_MD4 = KRB5_ENCTYPE_DES_CBC_MD4, - ETYPE_DES_CBC_MD5 = KRB5_ENCTYPE_DES_CBC_MD5, - ETYPE_DES3_CBC_MD5 = KRB5_ENCTYPE_DES3_CBC_MD5, - ETYPE_OLD_DES3_CBC_SHA1 = KRB5_ENCTYPE_OLD_DES3_CBC_SHA1, - ETYPE_SIGN_DSA_GENERATE = KRB5_ENCTYPE_SIGN_DSA_GENERATE, - ETYPE_ENCRYPT_RSA_PRIV = KRB5_ENCTYPE_ENCRYPT_RSA_PRIV, - ETYPE_ENCRYPT_RSA_PUB = KRB5_ENCTYPE_ENCRYPT_RSA_PUB, - ETYPE_DES3_CBC_SHA1 = KRB5_ENCTYPE_DES3_CBC_SHA1, - ETYPE_AES128_CTS_HMAC_SHA1_96 = KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96, - ETYPE_AES256_CTS_HMAC_SHA1_96 = KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96, - ETYPE_ARCFOUR_HMAC_MD5 = KRB5_ENCTYPE_ARCFOUR_HMAC_MD5, - ETYPE_ARCFOUR_HMAC_MD5_56 = KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56, - ETYPE_ENCTYPE_PK_CROSS = KRB5_ENCTYPE_ENCTYPE_PK_CROSS, - ETYPE_ARCFOUR_MD4 = KRB5_ENCTYPE_ARCFOUR_MD4, - ETYPE_ARCFOUR_HMAC_OLD = KRB5_ENCTYPE_ARCFOUR_HMAC_OLD, - ETYPE_ARCFOUR_HMAC_OLD_EXP = KRB5_ENCTYPE_ARCFOUR_HMAC_OLD_EXP, - ETYPE_DES_CBC_NONE = KRB5_ENCTYPE_DES_CBC_NONE, - ETYPE_DES3_CBC_NONE = KRB5_ENCTYPE_DES3_CBC_NONE, - ETYPE_DES_CFB64_NONE = KRB5_ENCTYPE_DES_CFB64_NONE, - ETYPE_DES_PCBC_NONE = KRB5_ENCTYPE_DES_PCBC_NONE, - ETYPE_DIGEST_MD5_NONE = KRB5_ENCTYPE_DIGEST_MD5_NONE, - ETYPE_CRAM_MD5_NONE = KRB5_ENCTYPE_CRAM_MD5_NONE - -}; +#define ENCTYPE_NULL KRB5_ENCTYPE_NULL +#define ENCTYPE_DES_CBC_CRC KRB5_ENCTYPE_DES_CBC_CRC +#define ENCTYPE_DES_CBC_MD4 KRB5_ENCTYPE_DES_CBC_MD4 +#define ENCTYPE_DES_CBC_MD5 KRB5_ENCTYPE_DES_CBC_MD5 +#define ENCTYPE_DES3_CBC_MD5 KRB5_ENCTYPE_DES3_CBC_MD5 +#define ENCTYPE_OLD_DES3_CBC_SHA1 KRB5_ENCTYPE_OLD_DES3_CBC_SHA1 +#define ENCTYPE_SIGN_DSA_GENERATE KRB5_ENCTYPE_SIGN_DSA_GENERATE +#define ENCTYPE_ENCRYPT_RSA_PRIV KRB5_ENCTYPE_ENCRYPT_RSA_PRIV +#define ENCTYPE_ENCRYPT_RSA_PUB KRB5_ENCTYPE_ENCRYPT_RSA_PUB +#define ENCTYPE_DES3_CBC_SHA1 KRB5_ENCTYPE_DES3_CBC_SHA1 +#define ENCTYPE_AES128_CTS_HMAC_SHA1_96 KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96 +#define ENCTYPE_AES256_CTS_HMAC_SHA1_96 KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96 +#define ENCTYPE_ARCFOUR_HMAC KRB5_ENCTYPE_ARCFOUR_HMAC_MD5 +#define ENCTYPE_ARCFOUR_HMAC_MD5 KRB5_ENCTYPE_ARCFOUR_HMAC_MD5 +#define ENCTYPE_ARCFOUR_HMAC_MD5_56 KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56 +#define ENCTYPE_ENCTYPE_PK_CROSS KRB5_ENCTYPE_ENCTYPE_PK_CROSS +#define ENCTYPE_DES_CBC_NONE KRB5_ENCTYPE_DES_CBC_NONE +#define ENCTYPE_DES3_CBC_NONE KRB5_ENCTYPE_DES3_CBC_NONE +#define ENCTYPE_DES_CFB64_NONE KRB5_ENCTYPE_DES_CFB64_NONE +#define ENCTYPE_DES_PCBC_NONE KRB5_ENCTYPE_DES_PCBC_NONE +#define ETYPE_NULL KRB5_ENCTYPE_NULL +#define ETYPE_DES_CBC_CRC KRB5_ENCTYPE_DES_CBC_CRC +#define ETYPE_DES_CBC_MD4 KRB5_ENCTYPE_DES_CBC_MD4 +#define ETYPE_DES_CBC_MD5 KRB5_ENCTYPE_DES_CBC_MD5 +#define ETYPE_DES3_CBC_MD5 KRB5_ENCTYPE_DES3_CBC_MD5 +#define ETYPE_OLD_DES3_CBC_SHA1 KRB5_ENCTYPE_OLD_DES3_CBC_SHA1 +#define ETYPE_SIGN_DSA_GENERATE KRB5_ENCTYPE_SIGN_DSA_GENERATE +#define ETYPE_ENCRYPT_RSA_PRIV KRB5_ENCTYPE_ENCRYPT_RSA_PRIV +#define ETYPE_ENCRYPT_RSA_PUB KRB5_ENCTYPE_ENCRYPT_RSA_PUB +#define ETYPE_DES3_CBC_SHA1 KRB5_ENCTYPE_DES3_CBC_SHA1 +#define ETYPE_AES128_CTS_HMAC_SHA1_96 KRB5_ENCTYPE_AES128_CTS_HMAC_SHA1_96 +#define ETYPE_AES256_CTS_HMAC_SHA1_96 KRB5_ENCTYPE_AES256_CTS_HMAC_SHA1_96 +#define ETYPE_AES128_CTS_HMAC_SHA256_128 KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128 +#define ETYPE_AES256_CTS_HMAC_SHA384_192 KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192 +#define ETYPE_ARCFOUR_HMAC_MD5 KRB5_ENCTYPE_ARCFOUR_HMAC_MD5 +#define ETYPE_ARCFOUR_HMAC_MD5_56 KRB5_ENCTYPE_ARCFOUR_HMAC_MD5_56 +#define ETYPE_ENCTYPE_PK_CROSS KRB5_ENCTYPE_ENCTYPE_PK_CROSS +#define ETYPE_ARCFOUR_MD4 KRB5_ENCTYPE_ARCFOUR_MD4 +#define ETYPE_ARCFOUR_HMAC_OLD KRB5_ENCTYPE_ARCFOUR_HMAC_OLD +#define ETYPE_ARCFOUR_HMAC_OLD_EXP KRB5_ENCTYPE_ARCFOUR_HMAC_OLD_EXP +#define ETYPE_DES_CBC_NONE KRB5_ENCTYPE_DES_CBC_NONE +#define ETYPE_DES3_CBC_NONE KRB5_ENCTYPE_DES3_CBC_NONE +#define ETYPE_DES_CFB64_NONE KRB5_ENCTYPE_DES_CFB64_NONE +#define ETYPE_DES_PCBC_NONE KRB5_ENCTYPE_DES_PCBC_NONE +#define ETYPE_DIGEST_MD5_NONE KRB5_ENCTYPE_DIGEST_MD5_NONE +#define ETYPE_CRAM_MD5_NONE KRB5_ENCTYPE_CRAM_MD5_NONE /* PDU types */ typedef enum krb5_pdu { @@ -274,14 +273,28 @@ /* Encryption type of the kdc session contribution in pk-init */ KRB5_KU_AS_REQ = 56, /* Checksum of over the AS-REQ send by the KDC in PA-REQ-ENC-PA-REP */ + KRB5_KU_FAST_REQ_CHKSUM = 50, + /* FAST armor checksum */ + KRB5_KU_FAST_ENC = 51, + /* FAST armor encryption */ + KRB5_KU_FAST_REP = 52, + /* FAST armor reply */ + KRB5_KU_FAST_FINISHED = 53, + /* FAST finished checksum */ + KRB5_KU_ENC_CHALLENGE_CLIENT = 54, + /* fast challenge from client */ + KRB5_KU_ENC_CHALLENGE_KDC = 55, + /* fast challenge from kdc */ KRB5_KU_DIGEST_ENCRYPT = -18, /* Encryption key usage used in the digest encryption field */ KRB5_KU_DIGEST_OPAQUE = -19, /* Checksum key usage used in the digest opaque field */ KRB5_KU_KRB5SIGNEDPATH = -21, /* Checksum key usage on KRB5SignedPath */ - KRB5_KU_CANONICALIZED_NAMES = -23 + KRB5_KU_CANONICALIZED_NAMES = -23, /* Checksum key usage on PA-CANONICALIZED */ + KRB5_KU_H5L_COOKIE = -25 + /* encrypted foo */ } krb5_key_usage; typedef krb5_key_usage krb5_keyusage; @@ -367,6 +380,7 @@ typedef struct krb5_ccache_data { const struct krb5_cc_ops *ops; krb5_data data; + int initialized; /* if non-zero: krb5_cc_initialize() called, now empty */ }krb5_ccache_data; typedef struct krb5_ccache_data *krb5_ccache; @@ -431,6 +445,7 @@ #define KRB5_GC_NO_TRANSIT_CHECK (1U << 5) #define KRB5_GC_CONSTRAINED_DELEGATION (1U << 6) #define KRB5_GC_CANONICALIZE (1U << 7) +#define KRB5_GC_ANONYMOUS (1U << 8) /* constants for compare_creds (and cc_retrieve_cred) */ #define KRB5_TC_DONT_MATCH_REALM (1U << 31) @@ -641,6 +656,8 @@ krb5_keytype keytype; /* ¿requested key type ? */ krb5_cksumtype cksumtype; /* ¡requested checksum type! */ + + AuthorizationData *auth_data; }krb5_auth_context_data, *krb5_auth_context; @@ -671,8 +688,17 @@ #define KRB5_TGS_NAME ("krbtgt") #define KRB5_WELLKNOWN_NAME ("WELLKNOWN") #define KRB5_ANON_NAME ("ANONYMOUS") +#define KRB5_ANON_REALM ("WELLKNOWN:ANONYMOUS") +#define KRB5_WELLKNOWN_ORG_H5L_REALM ("WELLKNOWN:ORG.H5L") #define KRB5_DIGEST_NAME ("digest") + +#define KRB5_PKU2U_REALM_NAME ("WELLKNOWN:PKU2U") +#define KRB5_LKDC_REALM_NAME ("WELLKNOWN:COM.APPLE.LKDC") + +#define KRB5_GSS_HOSTBASED_SERVICE_NAME ("WELLKNOWN:ORG.H5L.HOSTBASED-SERVICE") +#define KRB5_GSS_REFERALS_REALM_NAME ("WELLKNOWN:ORG.H5L.REFERALS-REALM") + typedef enum { KRB5_PROMPT_TYPE_PASSWORD = 0x1, KRB5_PROMPT_TYPE_NEW_PASSWORD = 0x2, @@ -720,6 +746,7 @@ int forwardable; int proxiable; int anonymous; + int change_password_prompt; krb5_enctype *etype_list; int etype_list_length; krb5_addresses *address_list; @@ -743,6 +770,7 @@ #define KRB5_GET_INIT_CREDS_OPT_SALT 0x0080 /* no supported */ #define KRB5_GET_INIT_CREDS_OPT_ANONYMOUS 0x0100 #define KRB5_GET_INIT_CREDS_OPT_DISABLE_TRANSITED_CHECK 0x0200 +#define KRB5_GET_INIT_CREDS_OPT_CHANGE_PASSWORD_PROMPT 0x0400 /* krb5_init_creds_step flags argument */ #define KRB5_INIT_CREDS_STEP_FLAG_CONTINUE 0x0001 @@ -806,6 +834,7 @@ KRB5_KRBHST_FLAGS_LARGE_MSG = 2 }; +typedef krb5_error_code (*krb5_sendto_prexmit)(krb5_context, int, void *, int, krb5_data *); typedef krb5_error_code (KRB5_CALLCONV * krb5_send_to_kdc_func)(krb5_context, void *, krb5_krbhst_info *, time_t, const krb5_data *, krb5_data *); @@ -814,7 +843,9 @@ enum { KRB5_PRINCIPAL_PARSE_NO_REALM = 1, /**< Require that there are no realm */ KRB5_PRINCIPAL_PARSE_REQUIRE_REALM = 2, /**< Require a realm present */ - KRB5_PRINCIPAL_PARSE_ENTERPRISE = 4 /**< Parse as a NT-ENTERPRISE name */ + KRB5_PRINCIPAL_PARSE_ENTERPRISE = 4, /**< Parse as a NT-ENTERPRISE name */ + KRB5_PRINCIPAL_PARSE_IGNORE_REALM = 8, /**< Ignore realm if present */ + KRB5_PRINCIPAL_PARSE_NO_DEF_REALM = 16 /**< Don't default the realm */ }; /** flags for krb5_unparse_name_flags */ @@ -827,8 +858,13 @@ typedef struct krb5_sendto_ctx_data *krb5_sendto_ctx; #define KRB5_SENDTO_DONE 0 -#define KRB5_SENDTO_RESTART 1 +#define KRB5_SENDTO_RESET 1 #define KRB5_SENDTO_CONTINUE 2 +#define KRB5_SENDTO_TIMEOUT 3 +#define KRB5_SENDTO_INITIAL 4 +#define KRB5_SENDTO_FILTER 5 +#define KRB5_SENDTO_FAILED 6 +#define KRB5_SENDTO_KRBHST 7 typedef krb5_error_code (KRB5_CALLCONV * krb5_sendto_ctx_func)(krb5_context, krb5_sendto_ctx, void *, @@ -840,6 +876,8 @@ PLUGIN_TYPE_FUNC }; +#define KRB5_PLUGIN_INVOKE_ALL 1 + struct credentials; /* this is to keep the compiler happy */ struct getargs; struct sockaddr; @@ -878,6 +916,48 @@ typedef krb5_error_code (KRB5_CALLCONV * krb5_gic_process_last_req)(krb5_context, krb5_last_req_entry **, void *); +typedef struct { + krb5_enctype ks_enctype; + krb5int32 ks_salttype; +}krb5_key_salt_tuple; + +/* + * Name canonicalization rule options + */ + +typedef enum krb5_name_canon_rule_options { + KRB5_NCRO_GC_ONLY = 1 << 0, + KRB5_NCRO_USE_REFERRALS = 1 << 1, + KRB5_NCRO_NO_REFERRALS = 1 << 2, + KRB5_NCRO_USE_FAST = 1 << 3, + KRB5_NCRO_USE_DNSSEC = 1 << 4, + KRB5_NCRO_LOOKUP_REALM = 1 << 5 +} krb5_name_canon_rule_options; + +typedef struct krb5_name_canon_rule_data *krb5_name_canon_rule; +typedef const struct krb5_name_canon_rule_data *krb5_const_name_canon_rule; +typedef struct krb5_name_canon_iterator_data *krb5_name_canon_iterator; + +/* + * krb5_get_init_creds_opt_set_pkinit flags + */ + +#define KRB5_GIC_OPT_PKINIT_USE_ENCKEY 2 /* use RSA, not DH */ +#define KRB5_GIC_OPT_PKINIT_ANONYMOUS 4 /* anonymous PKINIT */ +#define KRB5_GIC_OPT_PKINIT_BTMM 8 /* reserved by Apple */ +#define KRB5_GIC_OPT_PKINIT_NO_KDC_ANCHOR 16 /* do not authenticate KDC */ + +/* + * _krb5_principal_is_anonymous() flags + */ +#define KRB5_ANON_MATCH_AUTHENTICATED 1 /* authenticated with anon flag */ +#define KRB5_ANON_MATCH_UNAUTHENTICATED 2 /* anonymous PKINIT */ +#define KRB5_ANON_IGNORE_NAME_TYPE 4 /* don't check the name type */ +#define KRB5_ANON_MATCH_ANY ( KRB5_ANON_MATCH_AUTHENTICATED | \ + KRB5_ANON_MATCH_UNAUTHENTICATED ) +#define KRB5_ANON_MATCH_ANY_NONT ( KRB5_ANON_MATCH_ANY | \ + KRB5_ANON_IGNORE_NAME_TYPE ) + /* * */ @@ -893,6 +973,7 @@ extern KRB5_LIB_VARIABLE const krb5_cc_ops krb5_acc_ops; +extern KRB5_LIB_VARIABLE const krb5_cc_ops krb5_dcc_ops; extern KRB5_LIB_VARIABLE const krb5_cc_ops krb5_fcc_ops; extern KRB5_LIB_VARIABLE const krb5_cc_ops krb5_mcc_ops; extern KRB5_LIB_VARIABLE const krb5_cc_ops krb5_kcm_ops; @@ -911,8 +992,7 @@ extern KRB5_LIB_VARIABLE const char *krb5_cc_type_memory; extern KRB5_LIB_VARIABLE const char *krb5_cc_type_kcm; extern KRB5_LIB_VARIABLE const char *krb5_cc_type_scc; - -#endif /* __KRB5_H__ */ +extern KRB5_LIB_VARIABLE const char *krb5_cc_type_dcc; /* clang analyzer workarounds */ @@ -933,3 +1013,5 @@ #define krb5_enomem(c) (krb5_enomem(c), ENOMEM) #endif +#endif /* __KRB5_H__ */ + diff --git a/crypto/heimdal/lib/krb5/krb5.conf.5 b/crypto/heimdal/lib/krb5/krb5.conf.5 --- a/crypto/heimdal/lib/krb5/krb5.conf.5 +++ b/crypto/heimdal/lib/krb5/krb5.conf.5 @@ -135,6 +135,19 @@ .Xr rsh 1 , .Xr telnet 1 , etc). +.It Li historical_anon_pkinit = Va boolean +Enable legacy anonymous pkinit command-line syntax. +With this option set to +.Li true, +the +.Xr kinit 1 +.Fl Fl anonymous +command with no principal argument specified will request an anonymous pkinit +ticket from the default realm. +If a principal argument is specified, it is used as an explicit realm name for +anonymous pkinit even without an +.Li @ +prefix. .El .It Li [libdefaults] .Bl -tag -width "xxx" -offset indent @@ -144,7 +157,7 @@ The default is the result of .Fn krb5_get_host_realm "local hostname" . .It Li allow_weak_crypto = Va boolean -is weaks crypto algorithms allowed to be used, among others, DES is +are weak crypto algorithms allowed to be used, among others, DES is considered weak. .It Li clockskew = Va time Maximum time differential (in seconds) allowed when comparing @@ -152,11 +165,6 @@ Default is 300 seconds (five minutes). .It Li kdc_timeout = Va time Maximum time to wait for a reply from the kdc, default is 3 seconds. -.It Li v4_name_convert -.It Li v4_instance_resolve -These are described in the -.Xr krb5_425_conv_principal 3 -manual page. .It Li capath = { .Bl -tag -width "xxx" -offset indent .It Va destination-realm Li = Va next-hop-realm @@ -173,9 +181,9 @@ If you want to change the type only use .Li default_cc_type . The string can contain variables that are expanded on runtime. -Only support variable now is +The Only supported variable currently is .Li %{uid} -that expands to the current user id. +which expands to the current user id. .It Li default_etypes = Va etypes ... A list of default encryption types to use. (Default: all enctypes if allow_weak_crypto = TRUE, else all enctypes except single DES enctypes.) @@ -242,24 +250,172 @@ the address associated with the system's host name. .It Li fcache_version = Va int Use file credential cache format version specified. -.It Li krb4_get_tickets = Va boolean -Also get Kerberos 4 tickets in -.Nm kinit , -.Nm login , -and other programs. -This option is also valid in the [realms] section. .It Li fcc-mit-ticketflags = Va boolean Use MIT compatible format for file credential cache. It's the field ticketflags that is stored in reverse bit order for older than Heimdal 0.7. Setting this flag to .Dv TRUE -make it store the MIT way, this is default for Heimdal 0.7. +makes it store the MIT way, this is default for Heimdal 0.7. .It Li check-rd-req-server -If set to "ignore", the framework will ignore any the server input to +If set to "ignore", the framework will ignore any of the server input to .Xr krb5_rd_req 3 , this is very useful when the GSS-API server input the wrong server name into the gss_accept_sec_context call. +.It Li k5login_directory = Va directory +Alternative location for user .k5login files. This option is provided +for compatibility with MIT krb5 configuration files. +.It Li k5login_authoritative = Va boolean +If true then if a principal is not found in k5login files then +.Xr krb5_userok 3 +will not fallback on principal to username mapping. This option is +provided for compatibility with MIT krb5 configuration files. +.It Li kuserok = Va rule ... +Specifies +.Xr krb5_userok 3 +behavior. If multiple values are given, then +.Xr krb5_userok 3 +will evaluate them in order until one succeeds or all fail. Rules are +implemented by plugins, with three built-in plugins +described below. Default: USER-K5LOGIN SIMPLE DENY. +.It Li kuserok = Va DENY +If set and evaluated then +.Xr krb5_userok 3 +will deny access to the given username no matter what the principal name +might be. +.It Li kuserok = Va SIMPLE +If set and evaluated then +.Xr krb5_userok 3 +will use principal to username mapping (see auth_to_local below). If +the principal maps to the requested username then access is allowed. +.It Li kuserok = Va SYSTEM-K5LOGIN[:directory] +If set and evaluated then +.Xr krb5_userok 3 +will use k5login files named after the +.Va luser +argument to +.Xr krb5_userok 3 +in the given directory or in +.Pa /etc/k5login.d/ . +K5login files are text files, with each line containing just a principal +name; principals apearing in a user's k5login file are permitted access +to the user's account. Note: this rule performs no ownership nor +permissions checks on k5login files; proper ownership and +permissions/ACLs are expected due to the k5login location being a +system location. +.It Li kuserok = Va USER-K5LOGIN +If set and evaluated then +.Xr krb5_userok 3 +will use +.Pa ~luser/.k5login +and +.Pa ~luser/.k5login.d/* . +User k5login files and directories must be owned by the user and must +not have world nor group write permissions. +.It Li aname2lname-text-db = Va filename +The named file must be a sorted (in increasing order) text file where +every line consists of an unparsed principal name optionally followed by +whitespace and a username. The aname2lname function will do a binary +search on this file, if configured, looking for lines that match the +given principal name, and if found the given username will be used, or, +if the username is missing, an error will be returned. If the file +doesn't exist, or if no matching line is found then other plugins will +be allowed to run. +.It Li fcache_strict_checking +strict checking in FILE credential caches that owner, no symlink and +permissions is correct. +.It Li name_canon_rules = Va rules +One or more service principal name canonicalization rules. Each rule +consists of one or more tokens separated by colon (':'). Currently +these rules are used only for hostname canonicalization (usually when +getting a service ticket, from a ccache or a TGS, but also when +acquiring GSS initiator credentials from a keytab). These rules can be +used to implement DNS resolver-like search lists without having to use +DNS. +.Pp +NOTE: Name canonicalization rules are an experimental feature. +.Pp +The first token is a rule type, one of: +.Va as-is, +.Va qualify, or +.Va nss. +.Pp +Any remaining tokens must be options tokens: +.Va use_fast +(use FAST to protect TGS exchanges; currently not supported), +.Va use_dnssec +(use DNSSEC to protect hostname lookups; currently not supported), +.Va ccache_only +, +.Va use_referrals, +.Va no_referrals, +.Va lookup_realm, +.Va mindots=N, +.Va maxdots=N, +.Va order=N, +domain= +.Va domain, +realm= +.Va realm, +match_domain= +.Va domain, +and match_realm= +.Va realm. +.Pp +When trying to obtain a service ticket for a host-based service +principal name, name canonicalization rules are applied to that name in +the order given, one by one, until one succeds (a service ticket is +obtained), or all fail. Similarly when acquiring GSS initiator +credentials from a keytab, and when comparing a non-canonical GSS name +to a canonical one. +.Pp +For each rule the system checks that the hostname has at least +.Va mindots +periods (if given) in it, at most +.Va maxdots +periods (if given), that the hostname ends in the given +.Va match_domain +(if given), +and that the realm of the principal matches the +.Va match_realm +(if given). +.Pp +.Va As-is +rules leave the hostname unmodified but may set a realm. +.Va Qualify +rules qualify the hostname with the given +.Va domain +and also may set the realm. +The +.Va nss +rule uses the system resolver to lookup the host's canonical name and is +usually not secure. Note that using the +.Va nss +rule type implies having to have principal aliases in the HDB (though +not necessarily in keytabs). +.Pp +The empty realm denotes "ask the client's realm's TGS". The empty realm +may be set as well as matched. +.Pp +The order in which rules are applied is as follows: first all the rules +with explicit +.Va order +then all other rules in the order in which they appear. If any two +rules have the same explicit +.Va order , +their order of appearance in krb5.conf breaks the tie. Explicitly +specifying order can be useful where tools read and write the +configuration file without preserving parameter order. +.Pp +Malformed rules are ignored. +.It Li allow_hierarchical_capaths = Va boolean +When validating cross-realm transit paths, absent any explicit capath from the +client realm to the server realm, allow a hierarchical transit path via the +common ancestor domain of the two realms. +Defaults to true. +Note, absent an explicit setting, hierarchical capaths are always used by +the KDC when generating a referral to a destination with which is no direct +trust. .El .It Li [domain_realm] This is a list of mappings from DNS domain to Kerberos realm. @@ -319,17 +475,65 @@ Points to the server where all the password changes are performed. If there is no such entry, the kpasswd port on the admin_server host will be tried. -.It Li krb524_server = Va host[:port] -Points to the server that does 524 conversions. -If it is not mentioned, the krb524 port on the kdcs will be tried. -.It Li v4_instance_convert -.It Li v4_name_convert -.It Li default_domain -See -.Xr krb5_425_conv_principal 3 . .It Li tgs_require_subkey a boolan variable that defaults to false. Old DCE secd (pre 1.1) might need this to be true. +.It Li auth_to_local_names = { +.Bl -tag -width "xxx" -offset indent +.It Va principal_name = Va username +The given +.Va principal_name +will be mapped to the given +.Va username +if the +.Va REALM +is a default realm. +.El +.It Li } +.It Li auth_to_local = HEIMDAL_DEFAULT +Use the Heimdal default principal to username mapping. +Applies to principals from the +.Va REALM +if and only if +.Va REALM +is a default realm. +.It Li auth_to_local = DEFAULT +Use the MIT default principal to username mapping. +Applies to principals from the +.Va REALM +if and only if +.Va REALM +is a default realm. +.It Li auth_to_local = DB:/path/to/db.txt +Use a binary search of the given DB. The DB must be a flat-text +file sortedf in the "C" locale, with each record being a line +(separated by either LF or CRLF) consisting of a principal name +followed by whitespace followed by a username. +Applies to principals from the +.Va REALM +if and only if +.Va REALM +is a default realm. +.It Li auth_to_local = DB:/path/to/db +Use the given DB, if there's a plugin for it. +Applies to principals from the +.Va REALM +if and only if +.Va REALM +is a default realm. +.It Li auth_to_local = RULE:... +Use the given rule, if there's a plugin for it. +Applies to principals from the +.Va REALM +if and only if +.Va REALM +is a default realm. +.It Li auth_to_local = NONE +No additional principal to username mapping is done. Note that +.Va auth_to_local_names +and any preceding +.Va auth_to_local +rules have precedence. .El .It Li } .El @@ -368,8 +572,10 @@ .Bl -tag -width "xxx" -offset indent .It Li database Li = { .Bl -tag -width "xxx" -offset indent -.It Li dbname Li = Va DATABASENAME -Use this database for this realm. +.It Li dbname Li = Va [DATBASETYPE:]DATABASENAME +Use this database for this realm. The +.Va DATABASETYPE +should be one of 'lmdb', 'db3', 'db1', 'db', 'sqlite', or 'ldap'. See the info documetation how to configure different database backends. .It Li realm Li = Va REALM Specifies the realm that will be stored in this database. @@ -388,51 +594,58 @@ Use this file as the log of changes performed to the database. This file is used by .Nm ipropd-master -for propagating changes to slaves. +for propagating changes to slaves. It is also used by +.Nm kadmind +and +.Nm kadmin +(when used with the +.Li -l +option), and by all applications using +.Nm libkadm5 +with the local backend, for two-phase commit functionality. Slaves also +use this. Setting this to +.Nm /dev/null +disables two-phase commit and incremental propagation. Use +.Nm iprop-log +to show the contents of this log file. +.It Li log-max-size = Pa number +When the log reaches this size (in bytes), the log will be truncated, +saving some entries, and keeping the latest version number so as to not +disrupt incremental propagation. If set to a negative value then +automatic log truncation will be disabled. Defaults to 52428800 (50MB). .El .It Li } .It Li max-request = Va SIZE Maximum size of a kdc request. .It Li require-preauth = Va BOOL If set pre-authentication is required. -Since krb4 requests are not pre-authenticated they will be rejected. .It Li ports = Va "list of ports" List of ports the kdc should listen to. .It Li addresses = Va "list of interfaces" List of addresses the kdc should bind to. -.It Li enable-kerberos4 = Va BOOL -Turn on Kerberos 4 support. -.It Li v4-realm = Va REALM -To what realm v4 requests should be mapped. -.It Li enable-524 = Va BOOL -Should the Kerberos 524 converting facility be turned on. -Default is the same as -.Va enable-kerberos4 . .It Li enable-http = Va BOOL Should the kdc answer kdc-requests over http. -.It Li enable-kaserver = Va BOOL -If this kdc should emulate the AFS kaserver. .It Li tgt-use-strongest-session-key = Va BOOL If this is TRUE then the KDC will prefer the strongest key from the client's AS-REQ or TGS-REQ enctype list for the ticket session key that is supported by the KDC and the target principal when the target principal is a krbtgt principal. Else it will prefer the first key from the client's AS-REQ enctype list that is also supported by the KDC and -the target principal. Defaults to TRUE. +the target principal. Defaults to FALSE. .It Li svc-use-strongest-session-key = Va BOOL Like tgt-use-strongest-session-key, but applies to the session key enctype of tickets for services other than krbtgt principals. Defaults -to TRUE. +to FALSE. .It Li preauth-use-strongest-session-key = Va BOOL If TRUE then select the strongest possible enctype from the client's AS-REQ for PA-ETYPE-INFO2 (i.e., for password-based pre-authentication). -Else pick the first supported enctype from the client's AS-REQ. Defaults -to TRUE. +Else pick the first supported enctype from the client's AS-REQ. Defaults +to FALSE. .It Li use-strongest-server-key = Va BOOL If TRUE then the KDC picks, for the ticket encrypted part's key, the first supported enctype from the target service principal's hdb entry's current keyset. Else the KDC picks the first supported enctype from the -target service principal's hdb entry's current keyset. Defaults to TRUE. +target service principal's hdb entry's current keyset. Defaults to TRUE. .It Li check-ticket-addresses = Va BOOL Verify the addresses in the tickets used in tgs requests. .\" XXX @@ -441,22 +654,27 @@ .\" XXX .It Li allow-anonymous = Va BOOL If the kdc is allowed to hand out anonymous tickets. +.It Li historical_anon_realm = Va boolean +Enables pre-7.0 non-RFC-comformant KDC behavior. +With this option set to +.Li true +the client realm in anonymous pkinit AS replies will be the requested realm, +rather than the RFC-conformant +.Li WELLKNOWN:ANONYMOUS +realm. +This can have a security impact on servers that expect to grant access to +anonymous-but-authenticated to the KDC users of the realm in question: +they would also grant access to unauthenticated anonymous users. +As such, it is not recommend to set this option to +.Li true. .It Li encode_as_rep_as_tgs_rep = Va BOOL -Encode as-rep as tgs-rep tobe compatible with mistakes older DCE secd did. +Encode as-rep as tgs-rep to be compatible with mistakes older DCE secd did. .\" XXX .It Li kdc_warn_pwexpire = Va TIME The time before expiration that the user should be warned that her password is about to expire. .It Li logging = Va Logging What type of logging the kdc should use, see also [logging]/kdc. -.It Li use_2b = { -.Bl -tag -width "xxx" -offset indent -.It Va principal Li = Va BOOL -boolean value if the 524 daemon should return AFS 2b tokens for -.Fa principal . -.It ... -.El -.It Li } .It Li hdb-ldap-structural-object Va structural object If the LDAP backend is used for storing principals, this is the structural object that will be used when creating and when reading @@ -470,11 +688,44 @@ .It Li digests_allowed = Va list of digests Specifies the digests the kdc will reply to. The default is .Li ntlm-v2 . +.It Li kx509_ca = Va file +Specifies the PEM credentials for the kx509 certification authority. +.It Li require_initial_kca_tickets = Va boolean +Specified whether to require that tickets for the +.Li kca_service +service principal be INITIAL. +This may be set on a per-realm basis as well as globally. +Defaults to true for the global setting. +.It Li kx509_include_pkinit_san = Va boolean +If true then the kx509 client principal's name and realm will be +included in an +.Li id-pkinit-san +certificate extension. +This can be set on a per-realm basis as well as globally. +Defaults to true for the global setting. +.It Li kx509_template = Va file +Specifies the PEM file with a template for the certificates to be +issued. +The following variables can be interpolated in the subject name using +${variable} syntax: +.Bl -tag -width "xxx" -offset indent +.It principal-name +The full name of the kx509 client principal. +.It principal-name-without-realm +The full name of the kx509 client principal, excluding the realm name. +.It principal-name-realm +The name of the client principal's realm. .El +.El +The +.Li kx509 , +.Li kx509_template , +.Li kx509_include_pkinit_san , +and +.Li require_initial_kca_tickets +parameters may be set on a per-realm basis as well. .It Li [kadmin] .Bl -tag -width "xxx" -offset indent -.It Li require-preauth = Va BOOL -If pre-authentication is required to talk to the kadmin server. .It Li password_lifetime = Va time If a principal already have its password set for expiration, this is the time it will be valid for after a change. @@ -496,17 +747,27 @@ .It Li v5 The Kerberos 5 salt .Va pw-salt -.It Li v4 -The Kerberos 4 salt -.Va des:pw-salt: .El +.It Li default_key_rules = Va { +.Bl -tag -width "xxx" -offset indent +.It Va globing-rule Li = Va keytypes... +a globbing rule to matching a principal, and when true, use the +keytypes as specified the same format as [kadmin]default_keys . +.El +.It Li } +.It Li prune-key-history = Va BOOL +When adding keys to the key history, drop keys that are too old to match +unexpired tickets (based on the principal's maximum ticket lifetime). +If the KDC keystore is later compromised traffic protected with the +discarded older keys may remain protected. This also keeps the HDB +records for principals with key history from growing without bound. +The default (backwards compatible) value is "false". .It Li use_v4_salt = Va BOOL When true, this is the same as .Pp .Va default_keys = Va des3:pw-salt Va v4 .Pp and is only left for backwards compatibility. -.El .It Li [password_quality] Check the Password quality assurance in the info documentation for more information. @@ -522,6 +783,7 @@ among other minimum-length, character-class, external-check. .El .El +.El .Sh ENVIRONMENT .Ev KRB5_CONFIG points to the configuration file to read. @@ -534,24 +796,26 @@ .Bd -literal -offset indent [libdefaults] default_realm = FOO.SE + name_canon_rules = as-is:realm=FOO.SE + name_canon_rules = qualify:domain=foo.se:realm=FOO.SE + name_canon_rules = qualify:domain=bar.se:realm=FOO.SE + name_canon_rules = nss [domain_realm] .foo.se = FOO.SE .bar.se = FOO.SE [realms] FOO.SE = { kdc = kerberos.foo.se - v4_name_convert = { - rcmd = host - } - v4_instance_convert = { - xyz = xyz.bar.se - } default_domain = foo.se } [logging] kdc = FILE:/var/heimdal/kdc.log kdc = SYSLOG:INFO default = SYSLOG:INFO:USER +[kadmin] + default_key_rules = { + */ppp@* = arcfour-hmac-md5:pw-salt + } .Ed .Sh DIAGNOSTICS Since @@ -569,7 +833,6 @@ ones. .Sh SEE ALSO .Xr kinit 1 , -.Xr krb5_425_conv_principal 3 , .Xr krb5_openlog 3 , .Xr strftime 3 , .Xr verify_krb5_conf 8 diff --git a/crypto/heimdal/lib/krb5/krb5.conf.cat5 b/crypto/heimdal/lib/krb5/krb5.conf.cat5 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5.conf.cat5 @@ -0,0 +1,840 @@ +KRB5.CONF(5) BSD File Formats Manual KRB5.CONF(5) + +NAME + krb5.conf -- configuration file for Kerberos 5 + +SYNOPSIS + #include  + +DESCRIPTION + The krb5.conf file specifies several configuration parameters for the + Kerberos 5 library, as well as for some programs. + + The file consists of one or more sections, containing a number of bind- + ings. The value of each binding can be either a string or a list of + other bindings. The grammar looks like: + + file: + /* empty */ + sections + + sections: + section sections + section + + section: + '[' section_name ']' bindings + + section_name: + STRING + + bindings: + binding bindings + binding + + binding: + name '=' STRING + name '=' '{' bindings '}' + + name: + STRING + + STRINGs consists of one or more non-whitespace characters. + + STRINGs that are specified later in this man-page uses the following no- + tation. + + boolean + values can be either yes/true or no/false. + + time + values can be a list of year, month, day, hour, min, second. + Example: 1 month 2 days 30 min. If no unit is given, seconds + is assumed. + + etypes + valid encryption types are: des-cbc-crc, des-cbc-md4, des-cbc- + md5, des3-cbc-sha1, arcfour-hmac-md5, aes128-cts-hmac-sha1-96, + and aes256-cts-hmac-sha1-96 . + + address + an address can be either a IPv4 or a IPv6 address. + + Currently recognised sections and bindings are: + + [appdefaults] + Specifies the default values to be used for Kerberos applica- + tions. You can specify defaults per application, realm, or a + combination of these. The preference order is: + 1. application realm option + 2. application option + 3. realm option + 4. option + + The supported options are: + + forwardable = boolean + When obtaining initial credentials, make the cre- + dentials forwardable. + + proxiable = boolean + When obtaining initial credentials, make the cre- + dentials proxiable. + + no-addresses = boolean + When obtaining initial credentials, request them + for an empty set of addresses, making the tickets + valid from any address. + + ticket_lifetime = time + Default ticket lifetime. + + renew_lifetime = time + Default renewable ticket lifetime. + + encrypt = boolean + Use encryption, when available. + + forward = boolean + Forward credentials to remote host (for rsh(1), + telnet(1), etc). + + historical_anon_pkinit = boolean + Enable legacy anonymous pkinit command-line syntax. + With this option set to true, the kinit(1) + --anonymous command with no principal argument + specified will request an anonymous pkinit ticket + from the default realm. If a principal argument is + specified, it is used as an explicit realm name for + anonymous pkinit even without an @ prefix. + + [libdefaults] + + default_realm = REALM + Default realm to use, this is also known as your + "local realm". The default is the result of + krb5_get_host_realm(local hostname). + + allow_weak_crypto = boolean + are weak crypto algorithms allowed to be used, + among others, DES is considered weak. + + clockskew = time + Maximum time differential (in seconds) allowed when + comparing times. Default is 300 seconds (five min- + utes). + + kdc_timeout = time + Maximum time to wait for a reply from the kdc, de- + fault is 3 seconds. + + capath = { + + destination-realm = next-hop-realm + + ... + + } + This is deprecated, see the capaths section below. + + default_cc_type = cctype + sets the default credentials type. + + default_cc_name = ccname + the default credentials cache name. If you want to + change the type only use default_cc_type. The + string can contain variables that are expanded on + runtime. The Only supported variable currently is + %{uid} which expands to the current user id. + + default_etypes = etypes ... + A list of default encryption types to use. (De- + fault: all enctypes if allow_weak_crypto = TRUE, + else all enctypes except single DES enctypes.) + + default_as_etypes = etypes ... + A list of default encryption types to use in AS re- + quests. (Default: the value of default_etypes.) + + default_tgs_etypes = etypes ... + A list of default encryption types to use in TGS + requests. (Default: the value of default_etypes.) + + default_etypes_des = etypes ... + A list of default encryption types to use when re- + questing a DES credential. + + default_keytab_name = keytab + The keytab to use if no other is specified, default + is "FILE:/etc/krb5.keytab". + + dns_lookup_kdc = boolean + Use DNS SRV records to lookup KDC services loca- + tion. + + dns_lookup_realm = boolean + Use DNS TXT records to lookup domain to realm map- + pings. + + kdc_timesync = boolean + Try to keep track of the time differential between + the local machine and the KDC, and then compensate + for that when issuing requests. + + max_retries = number + The max number of times to try to contact each KDC. + + large_msg_size = number + The threshold where protocols with tiny maximum + message sizes are not considered usable to send + messages to the KDC. + + ticket_lifetime = time + Default ticket lifetime. + + renew_lifetime = time + Default renewable ticket lifetime. + + forwardable = boolean + When obtaining initial credentials, make the cre- + dentials forwardable. This option is also valid in + the [realms] section. + + proxiable = boolean + When obtaining initial credentials, make the cre- + dentials proxiable. This option is also valid in + the [realms] section. + + verify_ap_req_nofail = boolean + If enabled, failure to verify credentials against a + local key is a fatal error. The application has to + be able to read the corresponding service key for + this to work. Some applications, like su(1), en- + able this option unconditionally. + + warn_pwexpire = time + How soon to warn for expiring password. Default is + seven days. + + http_proxy = proxy-spec + A HTTP-proxy to use when talking to the KDC via + HTTP. + + dns_proxy = proxy-spec + Enable using DNS via HTTP. + + extra_addresses = address ... + A list of addresses to get tickets for along with + all local addresses. + + time_format = string + How to print time strings in logs, this string is + passed to strftime(3). + + date_format = string + How to print date strings in logs, this string is + passed to strftime(3). + + log_utc = boolean + Write log-entries using UTC instead of your local + time zone. + + scan_interfaces = boolean + Scan all network interfaces for addresses, as op- + posed to simply using the address associated with + the system's host name. + + fcache_version = int + Use file credential cache format version specified. + + fcc-mit-ticketflags = boolean + Use MIT compatible format for file credential + cache. It's the field ticketflags that is stored + in reverse bit order for older than Heimdal 0.7. + Setting this flag to TRUE makes it store the MIT + way, this is default for Heimdal 0.7. + + check-rd-req-server + If set to "ignore", the framework will ignore any + of the server input to krb5_rd_req(3), this is very + useful when the GSS-API server input the wrong + server name into the gss_accept_sec_context call. + + k5login_directory = directory + Alternative location for user .k5login files. This + option is provided for compatibility with MIT krb5 + configuration files. + + k5login_authoritative = boolean + If true then if a principal is not found in k5login + files then krb5_userok(3) will not fallback on + principal to username mapping. This option is pro- + vided for compatibility with MIT krb5 configuration + files. + + kuserok = rule ... + Specifies krb5_userok(3) behavior. If multiple + values are given, then krb5_userok(3) will evaluate + them in order until one succeeds or all fail. + Rules are implemented by plugins, with three built- + in plugins described below. Default: USER-K5LOGIN + SIMPLE DENY. + + kuserok = DENY + If set and evaluated then krb5_userok(3) will deny + access to the given username no matter what the + principal name might be. + + kuserok = SIMPLE + If set and evaluated then krb5_userok(3) will use + principal to username mapping (see auth_to_local + below). If the principal maps to the requested + username then access is allowed. + + kuserok = SYSTEM-K5LOGIN[:directory] + If set and evaluated then krb5_userok(3) will use + k5login files named after the luser argument to + krb5_userok(3) in the given directory or in + /etc/k5login.d/. K5login files are text files, + with each line containing just a principal name; + principals apearing in a user's k5login file are + permitted access to the user's account. Note: this + rule performs no ownership nor permissions checks + on k5login files; proper ownership and permis- + sions/ACLs are expected due to the k5login location + being a system location. + + kuserok = USER-K5LOGIN + If set and evaluated then krb5_userok(3) will use + ~luser/.k5login and ~luser/.k5login.d/*. User + k5login files and directories must be owned by the + user and must not have world nor group write per- + missions. + + aname2lname-text-db = filename + The named file must be a sorted (in increasing or- + der) text file where every line consists of an un- + parsed principal name optionally followed by white- + space and a username. The aname2lname function + will do a binary search on this file, if config- + ured, looking for lines that match the given prin- + cipal name, and if found the given username will be + used, or, if the username is missing, an error will + be returned. If the file doesn't exist, or if no + matching line is found then other plugins will be + allowed to run. + + fcache_strict_checking + strict checking in FILE credential caches that + owner, no symlink and permissions is correct. + + name_canon_rules = rules + One or more service principal name canonicalization + rules. Each rule consists of one or more tokens + separated by colon (':'). Currently these rules + are used only for hostname canonicalization (usu- + ally when getting a service ticket, from a ccache + or a TGS, but also when acquiring GSS initiator + credentials from a keytab). These rules can be + used to implement DNS resolver-like search lists + without having to use DNS. + + NOTE: Name canonicalization rules are an experimen- + tal feature. + + The first token is a rule type, one of: as-is, + qualify, or nss. + + Any remaining tokens must be options tokens: + use_fast (use FAST to protect TGS exchanges; cur- + rently not supported), use_dnssec (use DNSSEC to + protect hostname lookups; currently not supported), + ccache_only , use_referrals, no_referrals, + lookup_realm, mindots=N, maxdots=N, order=N, do- + main= domain, realm= realm, match_domain= domain, + and match_realm= realm. + + When trying to obtain a service ticket for a host- + based service principal name, name canonicalization + rules are applied to that name in the order given, + one by one, until one succeds (a service ticket is + obtained), or all fail. Similarly when acquiring + GSS initiator credentials from a keytab, and when + comparing a non-canonical GSS name to a canonical + one. + + For each rule the system checks that the hostname + has at least mindots periods (if given) in it, at + most maxdots periods (if given), that the hostname + ends in the given match_domain (if given), and that + the realm of the principal matches the match_realm + (if given). + + As-is rules leave the hostname unmodified but may + set a realm. Qualify rules qualify the hostname + with the given domain and also may set the realm. + The nss rule uses the system resolver to lookup the + host's canonical name and is usually not secure. + Note that using the nss rule type implies having to + have principal aliases in the HDB (though not nec- + essarily in keytabs). + + The empty realm denotes "ask the client's realm's + TGS". The empty realm may be set as well as + matched. + + The order in which rules are applied is as follows: + first all the rules with explicit order then all + other rules in the order in which they appear. If + any two rules have the same explicit order, their + order of appearance in krb5.conf breaks the tie. + Explicitly specifying order can be useful where + tools read and write the configuration file without + preserving parameter order. + + Malformed rules are ignored. + + allow_hierarchical_capaths = boolean + When validating cross-realm transit paths, absent + any explicit capath from the client realm to the + server realm, allow a hierarchical transit path via + the common ancestor domain of the two realms. De- + faults to true. Note, absent an explicit setting, + hierarchical capaths are always used by the KDC + when generating a referral to a destination with + which is no direct trust. + + [domain_realm] + This is a list of mappings from DNS domain to Kerberos realm. + Each binding in this section looks like: + + domain = realm + + The domain can be either a full name of a host or a trailing + component, in the latter case the domain-string should start + with a period. The trailing component only matches hosts that + are in the same domain, ie ".example.com" matches + "foo.example.com", but not "foo.test.example.com". + + The realm may be the token `dns_locate', in which case the ac- + tual realm will be determined using DNS (independently of the + setting of the `dns_lookup_realm' option). + + [realms] + + REALM = { + + kdc = [service/]host[:port] + Specifies a list of kdcs for this realm. + If the optional port is absent, the de- + fault value for the "kerberos/udp" + "kerberos/tcp", and "http/tcp" port (de- + pending on service) will be used. The + kdcs will be used in the order that they + are specified. + + The optional service specifies over what + medium the kdc should be contacted. + Possible services are "udp", "tcp", and + "http". Http can also be written as + "http://". Default service is "udp" and + "tcp". + + admin_server = host[:port] + Specifies the admin server for this + realm, where all the modifications to + the database are performed. + + kpasswd_server = host[:port] + Points to the server where all the pass- + word changes are performed. If there is + no such entry, the kpasswd port on the + admin_server host will be tried. + + tgs_require_subkey + a boolan variable that defaults to + false. Old DCE secd (pre 1.1) might + need this to be true. + + auth_to_local_names = { + + principal_name = username + The given principal_name will + be mapped to the given + username if the REALM is a + default realm. + + } + + auth_to_local = HEIMDAL_DEFAULT + Use the Heimdal default principal to + username mapping. Applies to principals + from the REALM if and only if REALM is a + default realm. + + auth_to_local = DEFAULT + Use the MIT default principal to user- + name mapping. Applies to principals + from the REALM if and only if REALM is a + default realm. + + auth_to_local = DB:/path/to/db.txt + Use a binary search of the given DB. + The DB must be a flat-text file sortedf + in the "C" locale, with each record be- + ing a line (separated by either LF or + CRLF) consisting of a principal name + followed by whitespace followed by a + username. Applies to principals from + the REALM if and only if REALM is a de- + fault realm. + + auth_to_local = DB:/path/to/db + Use the given DB, if there's a plugin + for it. Applies to principals from the + REALM if and only if REALM is a default + realm. + + auth_to_local = RULE:... + Use the given rule, if there's a plugin + for it. Applies to principals from the + REALM if and only if REALM is a default + realm. + + auth_to_local = NONE + No additional principal to username map- + ping is done. Note that + auth_to_local_names and any preceding + auth_to_local rules have precedence. + + } + + [capaths] + + client-realm = { + + server-realm = hop-realm ... + This serves two purposes. First the + first listed hop-realm tells a client + which realm it should contact in order + to ultimately obtain credentials for a + service in the server-realm. Secondly, + it tells the KDC (and other servers) + which realms are allowed in a multi-hop + traversal from client-realm to + server-realm. Except for the client + case, the order of the realms are not + important. + + } + + [logging] + + entity = destination + Specifies that entity should use the specified + destination for logging. See the krb5_openlog(3) + manual page for a list of defined destinations. + + [kdc] + + database = { + + dbname = [DATBASETYPE:]DATABASENAME + Use this database for this realm. The + DATABASETYPE should be one of 'lmdb', + 'db3', 'db1', 'db', 'sqlite', or 'ldap'. + See the info documetation how to config- + ure different database backends. + + realm = REALM + Specifies the realm that will be stored + in this database. It realm isn't set, + it will used as the default database, + there can only be one entry that doesn't + have a realm stanza. + + mkey_file = FILENAME + Use this keytab file for the master key + of this database. If not specified + DATABASENAME.mkey will be used. + + acl_file = PA FILENAME + Use this file for the ACL list of this + database. + + log_file = FILENAME + Use this file as the log of changes per- + formed to the database. This file is + used by ipropd-master for propagating + changes to slaves. It is also used by + kadmind and kadmin (when used with the + -l option), and by all applications us- + ing libkadm5 with the local backend, for + two-phase commit functionality. Slaves + also use this. Setting this to + /dev/null disables two-phase commit and + incremental propagation. Use iprop-log + to show the contents of this log file. + + log-max-size = number + When the log reaches this size (in + bytes), the log will be truncated, sav- + ing some entries, and keeping the latest + version number so as to not disrupt in- + cremental propagation. If set to a neg- + ative value then automatic log trunca- + tion will be disabled. Defaults to + 52428800 (50MB). + + } + + max-request = SIZE + Maximum size of a kdc request. + + require-preauth = BOOL + If set pre-authentication is required. + + ports = list of ports + List of ports the kdc should listen to. + + addresses = list of interfaces + List of addresses the kdc should bind to. + + enable-http = BOOL + Should the kdc answer kdc-requests over http. + + tgt-use-strongest-session-key = BOOL + If this is TRUE then the KDC will prefer the + strongest key from the client's AS-REQ or TGS-REQ + enctype list for the ticket session key that is + supported by the KDC and the target principal when + the target principal is a krbtgt principal. Else + it will prefer the first key from the client's AS- + REQ enctype list that is also supported by the KDC + and the target principal. Defaults to FALSE. + + svc-use-strongest-session-key = BOOL + Like tgt-use-strongest-session-key, but applies to + the session key enctype of tickets for services + other than krbtgt principals. Defaults to FALSE. + + preauth-use-strongest-session-key = BOOL + If TRUE then select the strongest possible enctype + from the client's AS-REQ for PA-ETYPE-INFO2 (i.e., + for password-based pre-authentication). Else pick + the first supported enctype from the client's AS- + REQ. Defaults to FALSE. + + use-strongest-server-key = BOOL + If TRUE then the KDC picks, for the ticket en- + crypted part's key, the first supported enctype + from the target service principal's hdb entry's + current keyset. Else the KDC picks the first sup- + ported enctype from the target service principal's + hdb entry's current keyset. Defaults to TRUE. + + check-ticket-addresses = BOOL + Verify the addresses in the tickets used in tgs re- + quests. + + allow-null-ticket-addresses = BOOL + Allow address-less tickets. + + allow-anonymous = BOOL + If the kdc is allowed to hand out anonymous tick- + ets. + + historical_anon_realm = boolean + Enables pre-7.0 non-RFC-comformant KDC behavior. + With this option set to true the client realm in + anonymous pkinit AS replies will be the requested + realm, rather than the RFC-conformant + WELLKNOWN:ANONYMOUS realm. This can have a secu- + rity impact on servers that expect to grant access + to anonymous-but-authenticated to the KDC users of + the realm in question: they would also grant access + to unauthenticated anonymous users. As such, it is + not recommend to set this option to true. + + encode_as_rep_as_tgs_rep = BOOL + Encode as-rep as tgs-rep to be compatible with mis- + takes older DCE secd did. + + kdc_warn_pwexpire = TIME + The time before expiration that the user should be + warned that her password is about to expire. + + logging = Logging + What type of logging the kdc should use, see also + [logging]/kdc. + + hdb-ldap-structural-object structural object + If the LDAP backend is used for storing principals, + this is the structural object that will be used + when creating and when reading objects. The de- + fault value is account . + + hdb-ldap-create-base creation dn + is the dn that will be appended to the principal + when creating entries. Default value is the search + dn. + + enable-digest = BOOL + Should the kdc answer digest requests. The default + is FALSE. + + digests_allowed = list of digests + Specifies the digests the kdc will reply to. The + default is ntlm-v2. + + kx509_ca = file + Specifies the PEM credentials for the kx509 certi- + fication authority. + + require_initial_kca_tickets = boolean + Specified whether to require that tickets for the + kca_service service principal be INITIAL. This may + be set on a per-realm basis as well as globally. + Defaults to true for the global setting. + + kx509_include_pkinit_san = boolean + If true then the kx509 client principal's name and + realm will be included in an id-pkinit-san certifi- + cate extension. This can be set on a per-realm ba- + sis as well as globally. Defaults to true for the + global setting. + + kx509_template = file + Specifies the PEM file with a template for the cer- + tificates to be issued. The following variables + can be interpolated in the subject name using + ${variable} syntax: + + principal-name + The full name of the kx509 client prin- + cipal. + + principal-name-without-realm + The full name of the kx509 client prin- + cipal, excluding the realm name. + + principal-name-realm + The name of the client principal's + realm. + The kx509, kx509_template, kx509_include_pkinit_san, and + require_initial_kca_tickets parameters may be set on a per- + realm basis as well. + + [kadmin] + + password_lifetime = time + If a principal already have its password set for + expiration, this is the time it will be valid for + after a change. + + default_keys = keytypes... + For each entry in default_keys try to parse it as a + sequence of etype:salttype:salt syntax of this if + something like: + + [(des|des3|etype):](pw-salt|afs3-salt)[:string] + + If etype is omitted it means everything, and if + string is omitted it means the default salt string + (for that principal and encryption type). Addi- + tional special values of keytypes are: + + v5 The Kerberos 5 salt pw-salt + + default_key_rules = { + + globing-rule = keytypes... + a globbing rule to matching a principal, + and when true, use the keytypes as spec- + ified the same format as [kadmin]de- + fault_keys . + + } + + prune-key-history = BOOL + When adding keys to the key history, drop keys that + are too old to match unexpired tickets (based on + the principal's maximum ticket lifetime). If the + KDC keystore is later compromised traffic protected + with the discarded older keys may remain protected. + This also keeps the HDB records for principals with + key history from growing without bound. The de- + fault (backwards compatible) value is "false". + + use_v4_salt = BOOL + When true, this is the same as + + default_keys = des3:pw-salt v4 + + and is only left for backwards compatibility. + + [password_quality] + Check the Password quality assurance in the info + documentation for more information. + + check_library = library-name + Library name that contains the password + check_function + + check_function = function-name + Function name for checking passwords in + check_library + + policy_libraries = library1 ... libraryN + List of libraries that can do password + policy checks + + policies = policy1 ... policyN + List of policy names to apply to the + password. Builtin policies are among + other minimum-length, character-class, + external-check. + +ENVIRONMENT + KRB5_CONFIG points to the configuration file to read. + +FILES + /etc/krb5.conf configuration file for Kerberos 5. + +EXAMPLES + [libdefaults] + default_realm = FOO.SE + name_canon_rules = as-is:realm=FOO.SE + name_canon_rules = qualify:domain=foo.se:realm=FOO.SE + name_canon_rules = qualify:domain=bar.se:realm=FOO.SE + name_canon_rules = nss + [domain_realm] + .foo.se = FOO.SE + .bar.se = FOO.SE + [realms] + FOO.SE = { + kdc = kerberos.foo.se + default_domain = foo.se + } + [logging] + kdc = FILE:/var/heimdal/kdc.log + kdc = SYSLOG:INFO + default = SYSLOG:INFO:USER + [kadmin] + default_key_rules = { + */ppp@* = arcfour-hmac-md5:pw-salt + } + +DIAGNOSTICS + Since krb5.conf is read and parsed by the krb5 library, there is not a + lot of opportunities for programs to report parsing errors in any useful + format. To help overcome this problem, there is a program + verify_krb5_conf that reads krb5.conf and tries to emit useful diagnos- + tics from parsing errors. Note that this program does not have any way + of knowing what options are actually used and thus cannot warn about un- + known or misspelled ones. + +SEE ALSO + kinit(1), krb5_openlog(3), strftime(3), verify_krb5_conf(8) + +HEIMDAL May 4, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb524_convert_creds_kdc.cat3 b/crypto/heimdal/lib/krb5/krb524_convert_creds_kdc.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb524_convert_creds_kdc.cat3 @@ -0,0 +1,42 @@ +KRB524_CONVERT_CREDS_... BSD Library Functions Manual KRB524_CONVERT_CREDS_... + +NAME + krb524_convert_creds_kdc, krb524_convert_creds_kdc_ccache -- converts + Kerberos 5 credentials to Kerberos 4 credentials + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb524_convert_creds_kdc(krb5_context context, krb5_creds *in_cred, + struct credentials *v4creds); + + krb5_error_code + krb524_convert_creds_kdc_ccache(krb5_context context, krb5_ccache ccache, + krb5_creds *in_cred, struct credentials *v4creds); + +DESCRIPTION + Convert the Kerberos 5 credential to Kerberos 4 credential. This is done + by sending them to the 524 service in the KDC. + + krb524_convert_creds_kdc() converts the Kerberos 5 credential in in_cred + to Kerberos 4 credential that is stored in credentials. + + krb524_convert_creds_kdc_ccache() is different from + krb524_convert_creds_kdc() in that way that if in_cred doesn't contain a + DES session key, then a new one is fetched from the KDC and stored in the + cred cache ccache, and then the KDC is queried to convert the credential. + + This interfaces are used to make the migration to Kerberos 5 from Ker- + beros 4 easier. There are few services that still need Kerberos 4, and + this is mainly for compatibility for those services. Some services, like + AFS, really have Kerberos 5 supports, but still uses the 524 interface to + make the migration easier. + +SEE ALSO + krb5(3), krb5.conf(5) + +HEIMDAL March 20, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_425_conv_principal.cat3 b/crypto/heimdal/lib/krb5/krb5_425_conv_principal.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_425_conv_principal.cat3 @@ -0,0 +1,139 @@ +KRB5_425_CONV_PRINCIP... BSD Library Functions Manual KRB5_425_CONV_PRINCIP... + +NAME + krb5_425_conv_principal, krb5_425_conv_principal_ext, + krb5_524_conv_principal -- converts to and from version 4 principals + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_425_conv_principal(krb5_context context, const char *name, + const char *instance, const char *realm, krb5_principal *principal); + + krb5_error_code + krb5_425_conv_principal_ext(krb5_context context, const char *name, + const char *instance, const char *realm, + krb5_boolean (*func)(krb5_context, krb5_principal), + krb5_boolean resolve, krb5_principal *principal); + + krb5_error_code + krb5_524_conv_principal(krb5_context context, + const krb5_principal principal, char *name, char *instance, + char *realm); + +DESCRIPTION + Converting between version 4 and version 5 principals can at best be de- + scribed as a mess. + + A version 4 principal consists of a name, an instance, and a realm. A + version 5 principal consists of one or more components, and a realm. In + some cases also the first component/name will differ between version 4 + and version 5. Furthermore the second component of a host principal will + be the fully qualified domain name of the host in question, while the in- + stance of a version 4 principal will only contain the first part (short + hostname). Because of these problems the conversion between principals + will have to be site customized. + + krb5_425_conv_principal_ext() will try to convert a version 4 principal, + given by name, instance, and realm, to a version 5 principal. This can + result in several possible principals, and if func is non-NULL, it will + be called for each candidate principal. func should return true if the + principal was "good". To accomplish this, krb5_425_conv_principal_ext() + will look up the name in krb5.conf. It first looks in the + v4_name_convert/host subsection, which should contain a list of version 4 + names whose instance should be treated as a hostname. This list can be + specified for each realm (in the realms section), or in the libdefaults + section. If the name is found the resulting name of the principal will + be the value of this binding. The instance is then first looked up in + v4_instance_convert for the specified realm. If found the resulting value + will be used as instance (this can be used for special cases), no further + attempts will be made to find a conversion if this fails (with func). If + the resolve parameter is true, the instance will be looked up with + gethostbyname(). This can be a time consuming, error prone, and unsafe + operation. Next a list of hostnames will be created from the instance + and the v4_domains variable, which should contain a list of possible do- + mains for the specific realm. + + On the other hand, if the name is not found in a host section, it is + looked up in a v4_name_convert/plain binding. If found here the name will + be converted, but the instance will be untouched. + + This list of default host-type conversions is compiled-in: + + v4_name_convert = { + host = { + ftp = ftp + hprop = hprop + imap = imap + pop = pop + rcmd = host + smtp = smtp + } + } + + It will only be used if there isn't an entry for these names in the con- + fig file, so you can override these defaults. + + krb5_425_conv_principal() will call krb5_425_conv_principal_ext() with + NULL as func, and the value of v4_instance_resolve (from the libdefaults + section) as resolve. + + krb5_524_conv_principal() basically does the opposite of + krb5_425_conv_principal(), it just doesn't have to look up any names, but + will instead truncate instances found to belong to a host principal. The + name, instance, and realm should be at least 40 characters long. + +EXAMPLES + Since this is confusing an example is in place. + + Assume that we have the "foo.com", and "bar.com" domains that have shared + a single version 4 realm, FOO.COM. The version 4 krb.realms file looked + like: + + foo.com FOO.COM + .foo.com FOO.COM + .bar.com FOO.COM + + A krb5.conf file that covers this case might look like: + + [libdefaults] + v4_instance_resolve = yes + [realms] + FOO.COM = { + kdc = kerberos.foo.com + v4_instance_convert = { + foo = foo.com + } + v4_domains = foo.com + } + + With this setup and the following host table: + + foo.com + a-host.foo.com + b-host.bar.com + the following conversions will be made: + + rcmd.a-host -> host/a-host.foo.com + ftp.b-host -> ftp/b-host.bar.com + pop.foo -> pop/foo.com + ftp.other -> ftp/other.foo.com + other.a-host -> other/a-host + + The first three are what you expect. If you remove the "v4_domains", the + fourth entry will result in an error (since the host "other" can't be + found). Even if "a-host" is a valid host name, the last entry will not be + converted, since the "other" name is not known to represent a host-type + principal. If you turn off "v4_instance_resolve" the second example will + result in "ftp/b-host.foo.com" (because of the default domain). And all + of this is of course only valid if you have working name resolving. + +SEE ALSO + krb5_build_principal(3), krb5_free_principal(3), krb5_parse_name(3), + krb5_sname_to_principal(3), krb5_unparse_name(3), krb5.conf(5) + +HEIMDAL September 3, 2003 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_acl_match_file.cat3 b/crypto/heimdal/lib/krb5/krb5_acl_match_file.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_acl_match_file.cat3 @@ -0,0 +1,60 @@ +KRB5_ACL_MATCH_FILE(3) BSD Library Functions Manual KRB5_ACL_MATCH_FILE(3) + +NAME + krb5_acl_match_file, krb5_acl_match_string -- ACL matching functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + krb5_error_code + krb5_acl_match_file(krb5_context context, const char *file, + const char *format, ...); + + krb5_error_code + krb5_acl_match_string(krb5_context context, const char *string, + const char *format, ...); + +DESCRIPTION + krb5_acl_match_file matches ACL format against each line in a file. + Lines starting with # are treated like comments and ignored. + + krb5_acl_match_string matches ACL format against a string. + + The ACL format has three format specifiers: s, f, and r. Each specifier + will retrieve one argument from the variable arguments for either match- + ing or storing data. The input string is split up using " " and "\t" as + a delimiter; multiple " " and "\t" in a row are considered to be the + same. + + s Matches a string using strcmp(3) (case sensitive). + + f Matches the string with fnmatch(3). The flags argument (the + last argument) passed to the fnmatch function is 0. + + r Returns a copy of the string in the char ** passed in; the + copy must be freed with free(3). There is no need to free(3) + the string on error: the function will clean up and set the + pointer to NULL. + + All unknown format specifiers cause an error. + +EXAMPLES + char *s; + + ret = krb5_acl_match_string(context, "foo", "s", "foo"); + if (ret) + krb5_errx(context, 1, "acl didn't match"); + ret = krb5_acl_match_string(context, "foo foo baz/kaka", + "ss", "foo", &s, "foo/*"); + if (ret) { + /* no need to free(s) on error */ + assert(s == NULL); + krb5_errx(context, 1, "acl didn't match"); + } + free(s); + +SEE ALSO + krb5(3) + +HEIMDAL May 12, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_aname_to_localname.cat3 b/crypto/heimdal/lib/krb5/krb5_aname_to_localname.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_aname_to_localname.cat3 @@ -0,0 +1,38 @@ +KRB5_ANAME_TO_LOCALNA... BSD Library Functions Manual KRB5_ANAME_TO_LOCALNA... + +NAME + krb5_aname_to_localname -- converts a principal to a system local name + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_boolean + krb5_aname_to_localname(krb5_context context, krb5_const_principal name, + size_t lnsize, char *lname); + +DESCRIPTION + This function takes a principal name, verifies that it is in the local + realm (using krb5_get_default_realms()) and then returns the local name + of the principal. + + If name isn't in one of the local realms an error is returned. + + If the size (lnsize) of the local name (lname) is too small, an error is + returned. + + krb5_aname_to_localname() should only be use by an application that im- + plements protocols that don't transport the login name and thus needs to + convert a principal to a local name. + + Protocols should be designed so that they authenticate using Kerberos, + send over the login name and then verify the principal that is authenti- + cated is allowed to login and the login name. A way to check if a user + is allowed to login is using the function krb5_kuserok(). + +SEE ALSO + krb5_get_default_realms(3), krb5_kuserok(3) + +HEIMDAL February 18, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_appdefault.cat3 b/crypto/heimdal/lib/krb5/krb5_appdefault.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_appdefault.cat3 @@ -0,0 +1,56 @@ +KRB5_APPDEFAULT(3) BSD Library Functions Manual KRB5_APPDEFAULT(3) + +NAME + krb5_appdefault_boolean, krb5_appdefault_string, krb5_appdefault_time -- + get application configuration value + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + void + krb5_appdefault_boolean(krb5_context context, const char *appname, + krb5_realm realm, const char *option, krb5_boolean def_val, + krb5_boolean *ret_val); + + void + krb5_appdefault_string(krb5_context context, const char *appname, + krb5_realm realm, const char *option, const char *def_val, + char **ret_val); + + void + krb5_appdefault_time(krb5_context context, const char *appname, + krb5_realm realm, const char *option, time_t def_val, + time_t *ret_val); + +DESCRIPTION + These functions get application defaults from the appdefaults section of + the krb5.conf(5) configuration file. These defaults can be specified per + application, and/or per realm. + + These values will be looked for in krb5.conf(5), in order of descending + importance. + + [appdefaults] + appname = { + realm = { + option = value + } + } + appname = { + option = value + } + realm = { + option = value + } + option = value + appname is the name of the application, and realm is the realm name. If + the realm is omitted it will not be used for resolving values. def_val + is the value to return if no value is found in krb5.conf(5). + +SEE ALSO + krb5_config(3), krb5.conf(5) + +HEIMDAL July 25, 2000 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_auth_context.3 b/crypto/heimdal/lib/krb5/krb5_auth_context.3 --- a/crypto/heimdal/lib/krb5/krb5_auth_context.3 +++ b/crypto/heimdal/lib/krb5/krb5_auth_context.3 @@ -224,7 +224,7 @@ and .Fn krb5_fwd_tgt_creds to create unencrypted ) -.Dv ENCTYPE_NULL ) +.Dv KRB5_ENCTYPE_NULL ) credentials. This is for use with old MIT server and JAVA based servers as they can't handle encrypted diff --git a/crypto/heimdal/lib/krb5/krb5_auth_context.cat3 b/crypto/heimdal/lib/krb5/krb5_auth_context.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_auth_context.cat3 @@ -0,0 +1,220 @@ +KRB5_AUTH_CONTEXT(3) BSD Library Functions Manual KRB5_AUTH_CONTEXT(3) + +NAME + krb5_auth_con_addflags, krb5_auth_con_free, krb5_auth_con_genaddrs, + krb5_auth_con_generatelocalsubkey, krb5_auth_con_getaddrs, + krb5_auth_con_getauthenticator, krb5_auth_con_getflags, + krb5_auth_con_getkey, krb5_auth_con_getlocalsubkey, + krb5_auth_con_getrcache, krb5_auth_con_getremotesubkey, + krb5_auth_con_getuserkey, krb5_auth_con_init, krb5_auth_con_initivector, + krb5_auth_con_removeflags, krb5_auth_con_setaddrs, + krb5_auth_con_setaddrs_from_fd, krb5_auth_con_setflags, + krb5_auth_con_setivector, krb5_auth_con_setkey, + krb5_auth_con_setlocalsubkey, krb5_auth_con_setrcache, + krb5_auth_con_setremotesubkey, krb5_auth_con_setuserkey, + krb5_auth_context, krb5_auth_getcksumtype, krb5_auth_getkeytype, + krb5_auth_getlocalseqnumber, krb5_auth_getremoteseqnumber, + krb5_auth_setcksumtype, krb5_auth_setkeytype, + krb5_auth_setlocalseqnumber, krb5_auth_setremoteseqnumber, + krb5_free_authenticator -- manage authentication on connection level + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_auth_con_init(krb5_context context, + krb5_auth_context *auth_context); + + void + krb5_auth_con_free(krb5_context context, krb5_auth_context auth_context); + + krb5_error_code + krb5_auth_con_setflags(krb5_context context, + krb5_auth_context auth_context, int32_t flags); + + krb5_error_code + krb5_auth_con_getflags(krb5_context context, + krb5_auth_context auth_context, int32_t *flags); + + krb5_error_code + krb5_auth_con_addflags(krb5_context context, + krb5_auth_context auth_context, int32_t addflags, int32_t *flags); + + krb5_error_code + krb5_auth_con_removeflags(krb5_context context, + krb5_auth_context auth_context, int32_t removelags, int32_t *flags); + + krb5_error_code + krb5_auth_con_setaddrs(krb5_context context, + krb5_auth_context auth_context, krb5_address *local_addr, + krb5_address *remote_addr); + + krb5_error_code + krb5_auth_con_getaddrs(krb5_context context, + krb5_auth_context auth_context, krb5_address **local_addr, + krb5_address **remote_addr); + + krb5_error_code + krb5_auth_con_genaddrs(krb5_context context, + krb5_auth_context auth_context, int fd, int flags); + + krb5_error_code + krb5_auth_con_setaddrs_from_fd(krb5_context context, + krb5_auth_context auth_context, void *p_fd); + + krb5_error_code + krb5_auth_con_getkey(krb5_context context, + krb5_auth_context auth_context, krb5_keyblock **keyblock); + + krb5_error_code + krb5_auth_con_getlocalsubkey(krb5_context context, + krb5_auth_context auth_context, krb5_keyblock **keyblock); + + krb5_error_code + krb5_auth_con_getremotesubkey(krb5_context context, + krb5_auth_context auth_context, krb5_keyblock **keyblock); + + krb5_error_code + krb5_auth_con_generatelocalsubkey(krb5_context context, + krb5_auth_context auth_context, krb5_keyblock, *key"); + + krb5_error_code + krb5_auth_con_initivector(krb5_context context, + krb5_auth_context auth_context); + + krb5_error_code + krb5_auth_con_setivector(krb5_context context, + krb5_auth_context *auth_context, krb5_pointer ivector); + + void + krb5_free_authenticator(krb5_context context, + krb5_authenticator *authenticator); + +DESCRIPTION + The krb5_auth_context structure holds all context related to an authenti- + cated connection, in a similar way to krb5_context that holds the context + for the thread or process. krb5_auth_context is used by various func- + tions that are directly related to authentication between the + server/client. Example of data that this structure contains are various + flags, addresses of client and server, port numbers, keyblocks (and sub- + keys), sequence numbers, replay cache, and checksum-type. + + krb5_auth_con_init() allocates and initializes the krb5_auth_context + structure. Default values can be changed with + krb5_auth_con_setcksumtype() and krb5_auth_con_setflags(). The + auth_context structure must be freed by krb5_auth_con_free(). + + krb5_auth_con_getflags(), krb5_auth_con_setflags(), + krb5_auth_con_addflags() and krb5_auth_con_removeflags() gets and modi- + fies the flags for a krb5_auth_context structure. Possible flags to set + are: + + KRB5_AUTH_CONTEXT_DO_SEQUENCE + Generate and check sequence-number on each packet. + + KRB5_AUTH_CONTEXT_DO_TIME + Check timestamp on incoming packets. + + KRB5_AUTH_CONTEXT_RET_SEQUENCE, KRB5_AUTH_CONTEXT_RET_TIME + Return sequence numbers and time stamps in the outdata parame- + ters. + + KRB5_AUTH_CONTEXT_CLEAR_FORWARDED_CRED + will force krb5_get_forwarded_creds() and krb5_fwd_tgt_creds() to + create unencrypted ) KRB5_ENCTYPE_NULL) credentials. This is for + use with old MIT server and JAVA based servers as they can't han- + dle encrypted KRB-CRED. Note that sending such KRB-CRED is clear + exposes crypto keys and tickets and is insecure, make sure the + packet is encrypted in the protocol. krb5_rd_cred(3), + krb5_rd_priv(3), krb5_rd_safe(3), krb5_mk_priv(3) and + krb5_mk_safe(3). Setting this flag requires that parameter to be + passed to these functions. + + The flags KRB5_AUTH_CONTEXT_DO_TIME also modifies the behavior + the function krb5_get_forwarded_creds() by removing the timestamp + in the forward credential message, this have backward compatibil- + ity problems since not all versions of the heimdal supports time- + less credentional messages. Is very useful since it always the + sender of the message to cache forward message and thus avoiding + a round trip to the KDC for each time a credential is forwarded. + The same functionality can be obtained by using address-less + tickets. + + krb5_auth_con_setaddrs(), krb5_auth_con_setaddrs_from_fd() and + krb5_auth_con_getaddrs() gets and sets the addresses that are checked + when a packet is received. It is mandatory to set an address for the re- + mote host. If the local address is not set, it iss deduced from the un- + derlaying operating system. krb5_auth_con_getaddrs() will call + krb5_free_address() on any address that is passed in local_addr or + remote_addr. krb5_auth_con_setaddr() allows passing in a NULL pointer as + local_addr and remote_addr, in that case it will just not set that ad- + dress. + + krb5_auth_con_setaddrs_from_fd() fetches the addresses from a file de- + scriptor. + + krb5_auth_con_genaddrs() fetches the address information from the given + file descriptor fd depending on the bitmap argument flags. + + Possible values on flags are: + + KRB5_AUTH_CONTEXT_GENERATE_LOCAL_ADDR + fetches the local address from fd. + + KRB5_AUTH_CONTEXT_GENERATE_REMOTE_ADDR + fetches the remote address from fd. + + krb5_auth_con_setkey(), krb5_auth_con_setuserkey() and + krb5_auth_con_getkey() gets and sets the key used for this auth context. + The keyblock returned by krb5_auth_con_getkey() should be freed with + krb5_free_keyblock(). The keyblock send into krb5_auth_con_setkey() is + copied into the krb5_auth_context, and thus no special handling is + needed. NULL is not a valid keyblock to krb5_auth_con_setkey(). + + krb5_auth_con_setuserkey() is only useful when doing user to user authen- + tication. krb5_auth_con_setkey() is equivalent to + krb5_auth_con_setuserkey(). + + krb5_auth_con_getlocalsubkey(), krb5_auth_con_setlocalsubkey(), + krb5_auth_con_getremotesubkey() and krb5_auth_con_setremotesubkey() gets + and sets the keyblock for the local and remote subkey. The keyblock re- + turned by krb5_auth_con_getlocalsubkey() and + krb5_auth_con_getremotesubkey() must be freed with krb5_free_keyblock(). + + krb5_auth_setcksumtype() and krb5_auth_getcksumtype() sets and gets the + checksum type that should be used for this connection. + + krb5_auth_con_generatelocalsubkey() generates a local subkey that have + the same encryption type as key. + + krb5_auth_getremoteseqnumber() krb5_auth_setremoteseqnumber(), + krb5_auth_getlocalseqnumber() and krb5_auth_setlocalseqnumber() gets and + sets the sequence-number for the local and remote sequence-number + counter. + + krb5_auth_setkeytype() and krb5_auth_getkeytype() gets and gets the key- + type of the keyblock in krb5_auth_context. + + krb5_auth_con_getauthenticator() Retrieves the authenticator that was + used during mutual authentication. The authenticator returned should be + freed by calling krb5_free_authenticator(). + + krb5_auth_con_getrcache() and krb5_auth_con_setrcache() gets and sets the + replay-cache. + + krb5_auth_con_initivector() allocates memory for and zeros the initial + vector in the auth_context keyblock. + + krb5_auth_con_setivector() sets the i_vector portion of auth_context to + ivector. + + krb5_free_authenticator() free the content of authenticator and + authenticator itself. + +SEE ALSO + krb5_context(3), kerberos(8) + +HEIMDAL May 17, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_c_make_checksum.3 b/crypto/heimdal/lib/krb5/krb5_c_make_checksum.3 --- a/crypto/heimdal/lib/krb5/krb5_c_make_checksum.3 +++ b/crypto/heimdal/lib/krb5/krb5_c_make_checksum.3 @@ -168,7 +168,7 @@ The .Li krb5_enc_data structure holds and encrypted data. -There are two public accessable members of +There are two public accessible members of .Li krb5_enc_data . .Li enctype that holds the encryption type of the data encrypted and diff --git a/crypto/heimdal/lib/krb5/krb5_c_make_checksum.cat3 b/crypto/heimdal/lib/krb5/krb5_c_make_checksum.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_c_make_checksum.cat3 @@ -0,0 +1,141 @@ +KRB5_C_MAKE_CHECKSUM(3) BSD Library Functions Manual KRB5_C_MAKE_CHECKSUM(3) + +NAME + krb5_c_block_size, krb5_c_decrypt, krb5_c_encrypt, krb5_c_encrypt_length, + krb5_c_enctype_compare, krb5_c_get_checksum, krb5_c_is_coll_proof_cksum, + krb5_c_is_keyed_cksum, krb5_c_keylength, krb5_c_make_checksum, + krb5_c_make_random_key, krb5_c_set_checksum, krb5_c_valid_cksumtype, + krb5_c_valid_enctype, krb5_c_verify_checksum, krb5_c_checksum_length -- + Kerberos 5 crypto API + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_c_block_size(krb5_context context, krb5_enctype enctype, + size_t *blocksize); + + krb5_error_code + krb5_c_decrypt(krb5_context context, const krb5_keyblock key, + krb5_keyusage usage, const krb5_data *ivec, krb5_enc_data *input, + krb5_data *output); + + krb5_error_code + krb5_c_encrypt(krb5_context context, const krb5_keyblock *key, + krb5_keyusage usage, const krb5_data *ivec, const krb5_data *input, + krb5_enc_data *output); + + krb5_error_code + krb5_c_encrypt_length(krb5_context context, krb5_enctype enctype, + size_t inputlen, size_t *length); + + krb5_error_code + krb5_c_enctype_compare(krb5_context context, krb5_enctype e1, + krb5_enctype e2, krb5_boolean *similar); + + krb5_error_code + krb5_c_make_random_key(krb5_context context, krb5_enctype enctype, + krb5_keyblock *random_key); + + krb5_error_code + krb5_c_make_checksum(krb5_context context, krb5_cksumtype cksumtype, + const krb5_keyblock *key, krb5_keyusage usage, + const krb5_data *input, krb5_checksum *cksum); + + krb5_error_code + krb5_c_verify_checksum(krb5_context context, const krb5_keyblock *key, + krb5_keyusage usage, const krb5_data *data, + const krb5_checksum *cksum, krb5_boolean *valid); + + krb5_error_code + krb5_c_checksum_length(krb5_context context, krb5_cksumtype cksumtype, + size_t *length); + + krb5_error_code + krb5_c_get_checksum(krb5_context context, const krb5_checksum *cksum, + krb5_cksumtype *type, krb5_data **data); + + krb5_error_code + krb5_c_set_checksum(krb5_context context, krb5_checksum *cksum, + krb5_cksumtype type, const krb5_data *data); + + krb5_boolean + krb5_c_valid_enctype(krb5_enctype, etype"); + + krb5_boolean + krb5_c_valid_cksumtype(krb5_cksumtype ctype); + + krb5_boolean + krb5_c_is_coll_proof_cksum(krb5_cksumtype ctype); + + krb5_boolean + krb5_c_is_keyed_cksum(krb5_cksumtype ctype); + + krb5_error_code + krb5_c_keylengths(krb5_context context, krb5_enctype enctype, + size_t *inlength, size_t *keylength); + +DESCRIPTION + The functions starting with krb5_c are compat functions with MIT ker- + beros. + + The krb5_enc_data structure holds and encrypted data. There are two pub- + lic accessible members of krb5_enc_data. enctype that holds the encryp- + tion type of the data encrypted and ciphertext that is a krb5_data that + might contain the encrypted data. + + krb5_c_block_size() returns the blocksize of the encryption type. + + krb5_c_decrypt() decrypts input and store the data in output. If ivec is + NULL the default initialization vector for that encryption type will be + used. + + krb5_c_encrypt() encrypts the plaintext in input and store the ciphertext + in output. + + krb5_c_encrypt_length() returns the length the encrypted data given the + plaintext length. + + krb5_c_enctype_compare() compares to encryption types and returns if they + use compatible encryption key types. + + krb5_c_make_checksum() creates a checksum cksum with the checksum type + cksumtype of the data in data. key and usage are used if the checksum is + a keyed checksum type. Returns 0 or an error code. + + krb5_c_verify_checksum() verifies the checksum of data in cksum that was + created with key using the key usage usage. verify is set to non-zero if + the checksum verifies correctly and zero if not. Returns 0 or an error + code. + + krb5_c_checksum_length() returns the length of the checksum. + + krb5_c_set_checksum() sets the krb5_checksum structure given type and + data. The content of cksum should be freeed with + krb5_c_free_checksum_contents(). + + krb5_c_get_checksum() retrieves the components of the krb5_checksum. + structure. data should be free with krb5_free_data(). If some either of + data or checksum is not needed for the application, NULL can be passed + in. + + krb5_c_valid_enctype() returns true if etype is a valid encryption type. + + krb5_c_valid_cksumtype() returns true if ctype is a valid checksum type. + + krb5_c_is_keyed_cksum() return true if ctype is a keyed checksum type. + + krb5_c_is_coll_proof_cksum() returns true if ctype is a collision proof + checksum type. + + krb5_c_keylengths() return the minimum length (inlength) bytes needed to + create a key and the length (keylength) of the resulting key for the + enctype. + +SEE ALSO + krb5(3), krb5_create_checksum(3), krb5_free_data(3), kerberos(8) + +HEIMDAL Nov 17, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_ccapi.h b/crypto/heimdal/lib/krb5/krb5_ccapi.h --- a/crypto/heimdal/lib/krb5/krb5_ccapi.h +++ b/crypto/heimdal/lib/krb5/krb5_ccapi.h @@ -231,7 +231,7 @@ typedef cc_int32 (*cc_initialize_func)(cc_context_t*, cc_int32, cc_int32 *, char const **); -#ifdef __APPLE__ +#if defined(__APPLE__) #pragma pack(pop) #endif diff --git a/crypto/heimdal/lib/krb5/krb5_check_transited.cat3 b/crypto/heimdal/lib/krb5/krb5_check_transited.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_check_transited.cat3 @@ -0,0 +1,48 @@ +KRB5_CHECK_TRANSITED(3) BSD Library Functions Manual KRB5_CHECK_TRANSITED(3) + +NAME + krb5_check_transited, krb5_check_transited_realms, + krb5_domain_x500_decode, krb5_domain_x500_encode -- realm transit verifi- + cation and encoding/decoding functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_check_transited(krb5_context context, krb5_const_realm client_realm, + krb5_const_realm server_realm, krb5_realm *realms, int num_realms, + int *bad_realm); + + krb5_error_code + krb5_check_transited_realms(krb5_context context, + const char *const *realms, int num_realms, int *bad_realm); + + krb5_error_code + krb5_domain_x500_decode(krb5_context context, krb5_data tr, + char ***realms, int *num_realms, const char *client_realm, + const char *server_realm); + + krb5_error_code + krb5_domain_x500_encode(char **realms, int num_realms, + krb5_data *encoding); + +DESCRIPTION + krb5_check_transited() checks the path from client_realm to server_realm + where realms and num_realms is the realms between them. If the function + returns an error value, bad_realm will be set to the realm in the list + causing the error. krb5_check_transited() is used internally by the KDC + and libkrb5 and should not be called by client applications. + + krb5_check_transited_realms() is deprecated. + + krb5_domain_x500_encode() and krb5_domain_x500_decode() encodes and de- + codes the realm names in the X500 format that Kerberos uses to describe + the transited realms in krbtgts. + +SEE ALSO + krb5(3), krb5.conf(5) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_create_checksum.cat3 b/crypto/heimdal/lib/krb5/krb5_create_checksum.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_create_checksum.cat3 @@ -0,0 +1,112 @@ +NAME(3) BSD Library Functions Manual NAME(3) + +NAME + krb5_checksum, krb5_checksum_disable, krb5_checksum_is_collision_proof, + krb5_checksum_is_keyed, krb5_checksumsize, krb5_cksumtype_valid, + krb5_copy_checksum, krb5_create_checksum, krb5_crypto_get_checksum_type + krb5_free_checksum, krb5_free_checksum_contents, krb5_hmac, + krb5_verify_checksum -- creates, handles and verifies checksums + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + typedef Checksum krb5_checksum; + + void + krb5_checksum_disable(krb5_context context, krb5_cksumtype type); + + krb5_boolean + krb5_checksum_is_collision_proof(krb5_context context, + krb5_cksumtype type); + + krb5_boolean + krb5_checksum_is_keyed(krb5_context context, krb5_cksumtype type); + + krb5_error_code + krb5_cksumtype_valid(krb5_context context, krb5_cksumtype ctype); + + krb5_error_code + krb5_checksumsize(krb5_context context, krb5_cksumtype type, + size_t *size); + + krb5_error_code + krb5_create_checksum(krb5_context context, krb5_crypto crypto, + krb5_key_usage usage, int type, void *data, size_t len, + Checksum *result); + + krb5_error_code + krb5_verify_checksum(krb5_context context, krb5_crypto crypto, + krb5_key_usage usage, void *data, size_t len, Checksum *cksum); + + krb5_error_code + krb5_crypto_get_checksum_type(krb5_context context, krb5_crypto crypto, + krb5_cksumtype *type); + + void + krb5_free_checksum(krb5_context context, krb5_checksum *cksum); + + void + krb5_free_checksum_contents(krb5_context context, krb5_checksum *cksum); + + krb5_error_code + krb5_hmac(krb5_context context, krb5_cksumtype cktype, const void *data, + size_t len, unsigned usage, krb5_keyblock *key, Checksum *result); + + krb5_error_code + krb5_copy_checksum(krb5_context context, const krb5_checksum *old, + krb5_checksum **new); + +DESCRIPTION + The krb5_checksum structure holds a Kerberos checksum. There is no com- + ponent inside krb5_checksum that is directly referable. + + The functions are used to create and verify checksums. + krb5_create_checksum() creates a checksum of the specified data, and puts + it in result. If crypto is NULL, usage_or_type specifies the checksum + type to use; it must not be keyed. Otherwise crypto is an encryption con- + text created by krb5_crypto_init(), and usage_or_type specifies a key-us- + age. + + krb5_verify_checksum() verifies the checksum against the provided data. + + krb5_checksum_is_collision_proof() returns true is the specified checksum + is collision proof (that it's very unlikely that two strings has the same + hash value, and that it's hard to find two strings that has the same + hash). Examples of collision proof checksums are MD5, and SHA1, while + CRC32 is not. + + krb5_checksum_is_keyed() returns true if the specified checksum type is + keyed (that the hash value is a function of both the data, and a separate + key). Examples of keyed hash algorithms are HMAC-SHA1-DES3, and RSA- + MD5-DES. The "plain" hash functions MD5, and SHA1 are not keyed. + + krb5_crypto_get_checksum_type() returns the checksum type that will be + used when creating a checksum for the given crypto context. This func- + tion is useful in combination with krb5_checksumsize() when you want to + know the size a checksum will use when you create it. + + krb5_cksumtype_valid() returns 0 or an error if the checksumtype is im- + plemented and not currently disabled in this kerberos library. + + krb5_checksumsize() returns the size of the outdata of checksum function. + + krb5_copy_checksum() returns a copy of the checksum krb5_free_checksum() + should use used to free the new checksum. + + krb5_free_checksum() free the checksum and the content of the checksum. + + krb5_free_checksum_contents() frees the content of checksum in cksum. + + krb5_hmac() calculates the HMAC over data (with length len) using the + keyusage usage and keyblock key. Note that keyusage is not always used + in checksums. + + krb5_checksum_disable globally disables the checksum type. + +SEE ALSO + krb5_crypto_init(3), krb5_c_encrypt(3), krb5_encrypt(3) + +HEIMDAL August 12, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_creds.cat3 b/crypto/heimdal/lib/krb5/krb5_creds.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_creds.cat3 @@ -0,0 +1,57 @@ +KRB5_CREDS(3) BSD Library Functions Manual KRB5_CREDS(3) + +NAME + krb5_creds, krb5_copy_creds, krb5_copy_creds_contents, krb5_free_creds, + krb5_free_cred_contents -- Kerberos 5 credential handling functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_copy_creds(krb5_context context, const krb5_creds *incred, + krb5_creds **outcred); + + krb5_error_code + krb5_copy_creds_contents(krb5_context context, const krb5_creds *incred, + krb5_creds *outcred); + + krb5_error_code + krb5_free_creds(krb5_context context, krb5_creds *outcred); + + krb5_error_code + krb5_free_cred_contents(krb5_context context, krb5_creds *cred); + +DESCRIPTION + krb5_creds holds Kerberos credentials: + + typedef struct krb5_creds { + krb5_principal client; + krb5_principal server; + krb5_keyblock session; + krb5_times times; + krb5_data ticket; + krb5_data second_ticket; + krb5_authdata authdata; + krb5_addresses addresses; + krb5_ticket_flags flags; + } krb5_creds; + + krb5_copy_creds() makes a copy of incred to outcred. outcred should be + freed with krb5_free_creds() by the caller. + + krb5_copy_creds_contents() makes a copy of the content of incred to + outcreds. outcreds should be freed by the called with + krb5_free_creds_contents(). + + krb5_free_creds() frees the content of the cred structure and the struc- + ture itself. + + krb5_free_cred_contents() frees the content of the cred structure. + +SEE ALSO + krb5(3), krb5_compare_creds(3), krb5_get_init_creds(3), kerberos(8) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_digest.3 b/crypto/heimdal/lib/krb5/krb5_digest.3 --- a/crypto/heimdal/lib/krb5/krb5_digest.3 +++ b/crypto/heimdal/lib/krb5/krb5_digest.3 @@ -64,7 +64,7 @@ .Nm krb5_digest_get_tickets , .Nm krb5_digest_get_client_binding , .Nm krb5_digest_get_a1_hash -.Nd remote digest (HTTP-DIGEST, SASL, CHAP) suppport +.Nd remote digest (HTTP-DIGEST, SASL, CHAP) support .Sh LIBRARY Kerberos 5 Library (libkrb5, -lkrb5) .Sh SYNOPSIS diff --git a/crypto/heimdal/lib/krb5/krb5_digest.cat3 b/crypto/heimdal/lib/krb5/krb5_digest.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_digest.cat3 @@ -0,0 +1,145 @@ +KRB5_DIGEST(3) BSD Library Functions Manual KRB5_DIGEST(3) + +NAME + krb5_digest, krb5_digest_alloc, krb5_digest_free, + krb5_digest_set_server_cb, krb5_digest_set_type, + krb5_digest_set_hostname, krb5_digest_get_server_nonce, + krb5_digest_set_server_nonce, krb5_digest_get_opaque, + krb5_digest_set_opaque, krb5_digest_get_identifier, + krb5_digest_set_identifier, krb5_digest_init_request, + krb5_digest_set_client_nonce, krb5_digest_set_digest, + krb5_digest_set_username, krb5_digest_set_authid, + krb5_digest_set_authentication_user, krb5_digest_set_realm, + krb5_digest_set_method, krb5_digest_set_uri, krb5_digest_set_nonceCount, + krb5_digest_set_qop, krb5_digest_request, krb5_digest_get_responseData, + krb5_digest_get_rsp, krb5_digest_get_tickets, + krb5_digest_get_client_binding, krb5_digest_get_a1_hash -- remote digest + (HTTP-DIGEST, SASL, CHAP) support + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + typedef struct krb5_digest *krb5_digest; + + krb5_error_code + krb5_digest_alloc(krb5_context context, krb5_digest *digest); + + void + krb5_digest_free(krb5_digest digest); + + krb5_error_code + krb5_digest_set_type(krb5_context context, krb5_digest digest, + const char *type); + + krb5_error_code + krb5_digest_set_server_cb(krb5_context context, krb5_digest digest, + const char *type, const char *binding); + + krb5_error_code + krb5_digest_set_hostname(krb5_context context, krb5_digest digest, + const char *hostname); + + const char * + krb5_digest_get_server_nonce(krb5_context context, krb5_digest digest); + + krb5_error_code + krb5_digest_set_server_nonce(krb5_context context, krb5_digest digest, + const char *nonce); + + const char * + krb5_digest_get_opaque(krb5_context context, krb5_digest digest); + + krb5_error_code + krb5_digest_set_opaque(krb5_context context, krb5_digest digest, + const char *opaque); + + const char * + krb5_digest_get_identifier(krb5_context context, krb5_digest digest); + + krb5_error_code + krb5_digest_set_identifier(krb5_context context, krb5_digest digest, + const char *id); + + krb5_error_code + krb5_digest_init_request(krb5_context context, krb5_digest digest, + krb5_realm realm, krb5_ccache ccache); + + krb5_error_code + krb5_digest_set_client_nonce(krb5_context context, krb5_digest digest, + const char *nonce); + + krb5_error_code + krb5_digest_set_digest(krb5_context context, krb5_digest digest, + const char *dgst); + + krb5_error_code + krb5_digest_set_username(krb5_context context, krb5_digest digest, + const char *username); + + krb5_error_code + krb5_digest_set_authid(krb5_context context, krb5_digest digest, + const char *authid); + + krb5_error_code + krb5_digest_set_authentication_user(krb5_context context, + krb5_digest digest, krb5_principal authentication_user); + + krb5_error_code + krb5_digest_set_realm(krb5_context context, krb5_digest digest, + const char *realm); + + krb5_error_code + krb5_digest_set_method(krb5_context context, krb5_digest digest, + const char *method); + + krb5_error_code + krb5_digest_set_uri(krb5_context context, krb5_digest digest, + const char *uri); + + krb5_error_code + krb5_digest_set_nonceCount(krb5_context context, krb5_digest digest, + const char *nonce_count); + + krb5_error_code + krb5_digest_set_qop(krb5_context context, krb5_digest digest, + const char *qop); + + krb5_error_code + krb5_digest_request(krb5_context context, krb5_digest digest, + krb5_realm realm, krb5_ccache ccache); + + const char * + krb5_digest_get_responseData(krb5_context context, krb5_digest digest); + + const char * + krb5_digest_get_rsp(krb5_context context, krb5_digest digest); + + krb5_error_code + krb5_digest_get_tickets(krb5_context context, krb5_digest digest, + Ticket **tickets); + + krb5_error_code + krb5_digest_get_client_binding(krb5_context context, krb5_digest digest, + char **type, char **binding); + + krb5_error_code + krb5_digest_get_a1_hash(krb5_context context, krb5_digest digest, + krb5_data *data); + +DESCRIPTION + The krb5_digest_alloc() function allocatates the digest structure. The + structure should be freed with krb5_digest_free() when it is no longer + being used. + + krb5_digest_alloc() returns 0 to indicate success. Otherwise an kerberos + code is returned and the pointer that digest points to is set to NULL. + + krb5_digest_free() free the structure digest. + +SEE ALSO + krb5(3), kerberos(8) + +HEIMDAL February 18, 2007 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_eai_to_heim_errno.cat3 b/crypto/heimdal/lib/krb5/krb5_eai_to_heim_errno.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_eai_to_heim_errno.cat3 @@ -0,0 +1,28 @@ +KRB5_EAI_TO_HEIM_ERRN... BSD Library Functions Manual KRB5_EAI_TO_HEIM_ERRN... + +NAME + krb5_eai_to_heim_errno, krb5_h_errno_to_heim_errno -- convert resolver + error code to com_err error codes + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_eai_to_heim_errno(int eai_errno, int system_error); + + krb5_error_code + krb5_h_errno_to_heim_errno(int eai_errno); + +DESCRIPTION + krb5_eai_to_heim_errno() and krb5_h_errno_to_heim_errno() convert + getaddrinfo(3), getnameinfo(3), and h_errno(3) to com_err error code that + are used by Heimdal, this is useful for for function returning kerberos + errors and needs to communicate failures from resolver function. + +SEE ALSO + krb5(3), kerberos(8) + +HEIMDAL April 13, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_encrypt.cat3 b/crypto/heimdal/lib/krb5/krb5_encrypt.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_encrypt.cat3 @@ -0,0 +1,137 @@ +KRB5_ENCRYPT(3) BSD Library Functions Manual KRB5_ENCRYPT(3) + +NAME + krb5_crypto_getblocksize, krb5_crypto_getconfoundersize + krb5_crypto_getenctype, krb5_crypto_getpadsize, krb5_crypto_overhead, + krb5_decrypt, krb5_decrypt_EncryptedData, krb5_decrypt_ivec, + krb5_decrypt_ticket, krb5_encrypt, krb5_encrypt_EncryptedData, + krb5_encrypt_ivec, krb5_enctype_disable, krb5_enctype_keysize, + krb5_enctype_to_string, krb5_enctype_valid, krb5_get_wrapped_length, + krb5_string_to_enctype -- encrypt and decrypt data, set and get encryp- + tion type parameters + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_encrypt(krb5_context context, krb5_crypto crypto, unsigned usage, + void *data, size_t len, krb5_data *result); + + krb5_error_code + krb5_encrypt_EncryptedData(krb5_context context, krb5_crypto crypto, + unsigned usage, void *data, size_t len, int kvno, + EncryptedData *result); + + krb5_error_code + krb5_encrypt_ivec(krb5_context context, krb5_crypto crypto, + unsigned usage, void *data, size_t len, krb5_data *result, + void *ivec); + + krb5_error_code + krb5_decrypt(krb5_context context, krb5_crypto crypto, unsigned usage, + void *data, size_t len, krb5_data *result); + + krb5_error_code + krb5_decrypt_EncryptedData(krb5_context context, krb5_crypto crypto, + unsigned usage, EncryptedData *e, krb5_data *result); + + krb5_error_code + krb5_decrypt_ivec(krb5_context context, krb5_crypto crypto, + unsigned usage, void *data, size_t len, krb5_data *result, + void *ivec); + + krb5_error_code + krb5_decrypt_ticket(krb5_context context, Ticket *ticket, + krb5_keyblock *key, EncTicketPart *out, krb5_flags flags); + + krb5_error_code + krb5_crypto_getblocksize(krb5_context context, size_t *blocksize); + + krb5_error_code + krb5_crypto_getenctype(krb5_context context, krb5_crypto crypto, + krb5_enctype *enctype); + + krb5_error_code + krb5_crypto_getpadsize(krb5_context context, size_t, *padsize"); + + krb5_error_code + krb5_crypto_getconfoundersize(krb5_context context, krb5_crypto crypto, + size_t, *confoundersize"); + + krb5_error_code + krb5_enctype_keysize(krb5_context context, krb5_enctype type, + size_t *keysize); + + krb5_error_code + krb5_crypto_overhead(krb5_context context, size_t, *padsize"); + + krb5_error_code + krb5_string_to_enctype(krb5_context context, const char *string, + krb5_enctype *etype); + + krb5_error_code + krb5_enctype_to_string(krb5_context context, krb5_enctype etype, + char **string); + + krb5_error_code + krb5_enctype_valid(krb5_context context, krb5_enctype etype); + + void + krb5_enctype_disable(krb5_context context, krb5_enctype etype); + + size_t + krb5_get_wrapped_length(krb5_context context, krb5_crypto crypto, + size_t data_len); + +DESCRIPTION + These functions are used to encrypt and decrypt data. + + krb5_encrypt_ivec() puts the encrypted version of data (of size len) in + result. If the encryption type supports using derived keys, usage should + be the appropriate key-usage. ivec is a pointer to a initial IV, it is + modified to the end IV at the end of the round. Ivec should be the size + of If NULL is passed in, the default IV is used. krb5_encrypt() does the + same as krb5_encrypt_ivec() but with ivec being NULL. + krb5_encrypt_EncryptedData() does the same as krb5_encrypt(), but it puts + the encrypted data in a EncryptedData structure instead. If kvno is not + zero, it will be put in the (optional) kvno field in the EncryptedData. + + krb5_decrypt_ivec(), krb5_decrypt(), and krb5_decrypt_EncryptedData() + works similarly. + + krb5_decrypt_ticket() decrypts the encrypted part of ticket with key. + krb5_decrypt_ticket() also verifies the timestamp in the ticket, invalid + flag and if the KDC haven't verified the transited path, the transit + path. + + krb5_enctype_keysize(), krb5_crypto_getconfoundersize(), + krb5_crypto_getblocksize(), krb5_crypto_getenctype(), + krb5_crypto_getpadsize(), krb5_crypto_overhead() all returns various + (sometimes) useful information from a crypto context. + krb5_crypto_overhead() is the combination of krb5_crypto_getconfounder- + size, krb5_crypto_getblocksize and krb5_crypto_getpadsize and return the + maximum overhead size. + + krb5_enctype_to_string() converts a encryption type number to a string + that can be printable and stored. The strings returned should be freed + with free(3). + + krb5_string_to_enctype() converts a encryption type strings to a encryp- + tion type number that can use used for other Kerberos crypto functions. + + krb5_enctype_valid() returns 0 if the encrypt is supported and not dis- + abled, otherwise and error code is returned. + + krb5_enctype_disable() (globally, for all contextes) disables the + enctype. + + krb5_get_wrapped_length() returns the size of an encrypted packet by + crypto of length data_len. + +SEE ALSO + krb5_create_checksum(3), krb5_crypto_init(3) + +HEIMDAL March 20, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_err.et b/crypto/heimdal/lib/krb5/krb5_err.et --- a/crypto/heimdal/lib/krb5/krb5_err.et +++ b/crypto/heimdal/lib/krb5/krb5_err.et @@ -112,7 +112,12 @@ error_code INVALID_HASH_ALG, "Invalid OTP digest algorithm" error_code INVALID_ITERATION_COUNT, "Invalid OTP iteration count" -# 97-127 are reserved +# 97-99 are reserved + +index 100 +error_code NO_ACCEPTABLE_KDF, "No acceptable KDF offered" + +# 101-127 are reserved index 128 prefix diff --git a/crypto/heimdal/lib/krb5/krb5_find_padata.cat3 b/crypto/heimdal/lib/krb5/krb5_find_padata.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_find_padata.cat3 @@ -0,0 +1,32 @@ +KRB5_FIND_PADATA(3) BSD Library Functions Manual KRB5_FIND_PADATA(3) + +NAME + krb5_find_padata, krb5_padata_add -- Kerberos 5 pre-authentication data + handling functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + PA_DATA * + krb5_find_padata(PA_DATA *val, unsigned len, int type, int *index); + + int + krb5_padata_add(krb5_context context, METHOD_DATA *md, int type, + void *buf, size_t len); + +DESCRIPTION + krb5_find_padata() tries to find the pre-authentication data entry of + type type in the array val of length len. The search is started at entry + pointed out by *index (zero based indexing). If the type isn't found, + NULL is returned. + + krb5_padata_add() adds a pre-authentication data entry of type type + pointed out by buf and len to md. + +SEE ALSO + krb5(3), kerberos(8) + +HEIMDAL March 21, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_generate_random_block.cat3 b/crypto/heimdal/lib/krb5/krb5_generate_random_block.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_generate_random_block.cat3 @@ -0,0 +1,22 @@ +KRB5_GENERATE_RANDOM_... BSD Library Functions Manual KRB5_GENERATE_RANDOM_... + +NAME + krb5_generate_random_block -- Kerberos 5 random functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + void + krb5_generate_random_block(void *buf, size_t len); + +DESCRIPTION + krb5_generate_random_block() generates a cryptographically strong pseudo- + random block into the buffer buf of length len. + +SEE ALSO + krb5(3), krb5.conf(5) + +HEIMDAL March 21, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_get_all_client_addrs.cat3 b/crypto/heimdal/lib/krb5/krb5_get_all_client_addrs.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_get_all_client_addrs.cat3 @@ -0,0 +1,38 @@ +KRB5_GET_ADDRS(3) BSD Library Functions Manual KRB5_GET_ADDRS(3) + +NAME + krb5_get_all_client_addrs, krb5_get_all_server_addrs -- return local ad- + dresses + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_get_all_client_addrs(krb5_context context, krb5_addresses *addrs); + + krb5_error_code + krb5_get_all_server_addrs(krb5_context context, krb5_addresses *addrs); + +DESCRIPTION + These functions return in addrs a list of addresses associated with the + local host. + + The server variant returns all configured interface addresses (if possi- + ble), including loop-back addresses. This is useful if you want to create + sockets to listen to. + + The client version will also scan local interfaces (can be turned off by + setting libdefaults/scan_interfaces to false in krb5.conf), but will not + include loop-back addresses, unless there are no other addresses found. + It will remove all addresses included in libdefaults/ignore_addresses but + will unconditionally include addresses in libdefaults/extra_addresses. + + The returned addresses should be freed by calling krb5_free_addresses(). + +SEE ALSO + krb5_free_addresses(3) + +HEIMDAL July 1, 2001 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_get_credentials.cat3 b/crypto/heimdal/lib/krb5/krb5_get_credentials.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_get_credentials.cat3 @@ -0,0 +1,96 @@ +KRB5_GET_CREDENTIALS(3) BSD Library Functions Manual KRB5_GET_CREDENTIALS(3) + +NAME + krb5_get_credentials, krb5_get_credentials_with_flags, krb5_get_kdc_cred, + krb5_get_renewed_creds -- get credentials from the KDC using krbtgt + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_get_credentials(krb5_context context, krb5_flags options, + krb5_ccache ccache, krb5_creds *in_creds, krb5_creds **out_creds); + + krb5_error_code + krb5_get_credentials_with_flags(krb5_context context, krb5_flags options, + krb5_kdc_flags flags, krb5_ccache ccache, krb5_creds *in_creds, + krb5_creds **out_creds); + + krb5_error_code + krb5_get_kdc_cred(krb5_context context, krb5_ccache id, + krb5_kdc_flags flags, krb5_addresses *addresses, + Ticket *second_ticket, krb5_creds *in_creds, krb5_creds **out_creds); + + krb5_error_code + krb5_get_renewed_creds(krb5_context context, krb5_creds *creds, + krb5_const_principal client, krb5_ccache ccache, + const char *in_tkt_service); + +DESCRIPTION + krb5_get_credentials_with_flags() get credentials specified by + in_creds->server and in_creds->client (the rest of the in_creds structure + is ignored) by first looking in the ccache and if doesn't exists or is + expired, fetch the credential from the KDC using the krbtgt in ccache. + The credential is returned in out_creds and should be freed using the + function krb5_free_creds(). + + Valid flags to pass into options argument are: + + KRB5_GC_CACHED Only check the ccache, don't got out on network to + fetch credential. + KRB5_GC_USER_USER Request a user to user ticket. This option doesn't + store the resulting user to user credential in the + ccache. + KRB5_GC_EXPIRED_OK returns the credential even if it is expired, default + behavior is trying to refetch the credential from the + KDC. + + Flags are KDCOptions, note the caller must fill in the bit-field and not + use the integer associated structure. + + krb5_get_credentials() works the same way as + krb5_get_credentials_with_flags() except that the flags field is missing. + + krb5_get_kdc_cred() does the same as the functions above, but the caller + must fill in all the information andits closer to the wire protocol. + + krb5_get_renewed_creds() renews a credential given by in_tkt_service (if + NULL the default krbtgt) using the credential cache ccache. The result + is stored in creds and should be freed using krb5_free_creds. + +EXAMPLES + Here is a example function that get a credential from a credential cache + id or the KDC and returns it to the caller. + + #include + + int + getcred(krb5_context context, krb5_ccache id, krb5_creds **creds) + { + krb5_error_code ret; + krb5_creds in; + + ret = krb5_parse_name(context, "client@EXAMPLE.COM", + &in.client); + if (ret) + krb5_err(context, 1, ret, "krb5_parse_name"); + + ret = krb5_parse_name(context, "host/server.example.com@EXAMPLE.COM", + &in.server); + if (ret) + krb5_err(context, 1, ret, "krb5_parse_name"); + + ret = krb5_get_credentials(context, 0, id, &in, creds); + if (ret) + krb5_err(context, 1, ret, "krb5_get_credentials"); + + return 0; + } + +SEE ALSO + krb5(3), krb5_get_forwarded_creds(3), krb5.conf(5) + +HEIMDAL July 26, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_get_creds.3 b/crypto/heimdal/lib/krb5/krb5_get_creds.3 --- a/crypto/heimdal/lib/krb5/krb5_get_creds.3 +++ b/crypto/heimdal/lib/krb5/krb5_get_creds.3 @@ -133,7 +133,7 @@ and .Fn krb5_get_creds_opt_set_options adds and sets options to the -.Fi krb5_get_creds_opt +.Li krb5_get_creds_opt structure . The possible options to set are .Bl -tag -width "KRB5_GC_USER_USER" -compact diff --git a/crypto/heimdal/lib/krb5/krb5_get_creds.cat3 b/crypto/heimdal/lib/krb5/krb5_get_creds.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_get_creds.cat3 @@ -0,0 +1,92 @@ +KRB5_GET_CREDS(3) BSD Library Functions Manual KRB5_GET_CREDS(3) + +NAME + krb5_get_creds, krb5_get_creds_opt_add_options, krb5_get_creds_opt_alloc, + krb5_get_creds_opt_free, krb5_get_creds_opt_set_enctype, + krb5_get_creds_opt_set_impersonate, krb5_get_creds_opt_set_options, + krb5_get_creds_opt_set_ticket -- get credentials from the KDC + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_get_creds(krb5_context context, krb5_get_creds_opt opt, + krb5_ccache ccache, krb5_const_principal inprinc, + krb5_creds **out_creds); + + void + krb5_get_creds_opt_add_options(krb5_context context, + krb5_get_creds_opt opt, krb5_flags options); + + krb5_error_code + krb5_get_creds_opt_alloc(krb5_context context, krb5_get_creds_opt *opt); + + void + krb5_get_creds_opt_free(krb5_context context, krb5_get_creds_opt opt); + + void + krb5_get_creds_opt_set_enctype(krb5_context context, + krb5_get_creds_opt opt, krb5_enctype enctype); + + krb5_error_code + krb5_get_creds_opt_set_impersonate(krb5_context context, + krb5_get_creds_opt opt, krb5_const_principal self); + + void + krb5_get_creds_opt_set_options(krb5_context context, + krb5_get_creds_opt opt, krb5_flags options); + + krb5_error_code + krb5_get_creds_opt_set_ticket(krb5_context context, + krb5_get_creds_opt opt, const Ticket *ticket); + +DESCRIPTION + krb5_get_creds() fetches credentials specified by opt by first looking in + the ccache, and then it doesn't exists, fetch the credential from the KDC + using the krbtgts in ccache. The credential is returned in out_creds and + should be freed using the function krb5_free_creds(). + + The structure krb5_get_creds_opt controls the behavior of + krb5_get_creds(). The structure is opaque to consumers that can set the + content of the structure with accessors functions. All accessor functions + make copies of the data that is passed into accessor functions, so exter- + nal consumers free the memory before calling krb5_get_creds(). + + The structure krb5_get_creds_opt is allocated with + krb5_get_creds_opt_alloc() and freed with krb5_get_creds_opt_free(). The + free function also frees the content of the structure set by the accessor + functions. + + krb5_get_creds_opt_add_options() and krb5_get_creds_opt_set_options() + adds and sets options to the krb5_get_creds_opt structure . The possible + options to set are + KRB5_GC_CACHED Only check the ccache, don't got out on network to + fetch credential. + KRB5_GC_USER_USER request a user to user ticket. This options doesn't + store the resulting user to user credential in the + ccache. + KRB5_GC_EXPIRED_OK + returns the credential even if it is expired, default + behavior is trying to refetch the credential from the + KDC. + KRB5_GC_NO_STORE Do not store the resulting credentials in the ccache. + + krb5_get_creds_opt_set_enctype() sets the preferred encryption type of + the application. Don't set this unless you have to since if there is no + match in the KDC, the function call will fail. + + krb5_get_creds_opt_set_impersonate() sets the principal to impersonate., + Returns a ticket that have the impersonation principal as a client and + the requestor as the service. Note that the requested principal have to + be the same as the client principal in the krbtgt. + + krb5_get_creds_opt_set_ticket() sets the extra ticket used in user-to- + user or contrained delegation use case. + +SEE ALSO + krb5(3), krb5_get_credentials(3), krb5.conf(5) + +HEIMDAL June 15, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_get_forwarded_creds.cat3 b/crypto/heimdal/lib/krb5/krb5_get_forwarded_creds.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_get_forwarded_creds.cat3 @@ -0,0 +1,32 @@ +KRB5_GET_FORWARDED_CR... BSD Library Functions Manual KRB5_GET_FORWARDED_CR... + +NAME + krb5_get_forwarded_creds, krb5_fwd_tgt_creds -- get forwarded credentials + from the KDC + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_get_forwarded_creds(krb5_context context, + krb5_auth_context auth_context, krb5_ccache ccache, krb5_flags flags, + const char *hostname, krb5_creds *in_creds, krb5_data *out_data); + + krb5_error_code + krb5_fwd_tgt_creds(krb5_context context, krb5_auth_context auth_context, + const char *hostname, krb5_principal client, krb5_principal server, + krb5_ccache ccache, int forwardable, krb5_data *out_data); + +DESCRIPTION + krb5_get_forwarded_creds() and krb5_fwd_tgt_creds() get tickets forwarded + to hostname. If the tickets that are forwarded are address-less, the for- + warded tickets will also be address-less, otherwise hostname will be used + for figure out the address to forward the ticket too. + +SEE ALSO + krb5(3), krb5_get_credentials(3), krb5.conf(5) + +HEIMDAL July 26, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_get_in_cred.cat3 b/crypto/heimdal/lib/krb5/krb5_get_in_cred.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_get_in_cred.cat3 @@ -0,0 +1,131 @@ +KRB5_GET_IN_TKT(3) BSD Library Functions Manual KRB5_GET_IN_TKT(3) + +NAME + krb5_get_in_tkt, krb5_get_in_cred, krb5_get_in_tkt_with_password, + krb5_get_in_tkt_with_keytab, krb5_get_in_tkt_with_skey, + krb5_free_kdc_rep, krb5_password_key_proc -- deprecated initial authenti- + cation functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_get_in_tkt(krb5_context context, krb5_flags options, + const krb5_addresses *addrs, const krb5_enctype *etypes, + const krb5_preauthtype *ptypes, krb5_key_proc key_proc, + krb5_const_pointer keyseed, krb5_decrypt_proc decrypt_proc, + krb5_const_pointer decryptarg, krb5_creds *creds, krb5_ccache ccache, + krb5_kdc_rep *ret_as_reply); + + krb5_error_code + krb5_get_in_cred(krb5_context context, krb5_flags options, + const krb5_addresses *addrs, const krb5_enctype *etypes, + const krb5_preauthtype *ptypes, const krb5_preauthdata *preauth, + krb5_key_proc key_proc, krb5_const_pointer keyseed, + krb5_decrypt_proc decrypt_proc, krb5_const_pointer decryptarg, + krb5_creds *creds, krb5_kdc_rep *ret_as_reply); + + krb5_error_code + krb5_get_in_tkt_with_password(krb5_context context, krb5_flags options, + krb5_addresses *addrs, const krb5_enctype *etypes, + const krb5_preauthtype *pre_auth_types, const char *password, + krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply); + + krb5_error_code + krb5_get_in_tkt_with_keytab(krb5_context context, krb5_flags options, + krb5_addresses *addrs, const krb5_enctype *etypes, + const krb5_preauthtype *pre_auth_types, krb5_keytab keytab, + krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply); + + krb5_error_code + krb5_get_in_tkt_with_skey(krb5_context context, krb5_flags options, + krb5_addresses *addrs, const krb5_enctype *etypes, + const krb5_preauthtype *pre_auth_types, const krb5_keyblock *key, + krb5_ccache ccache, krb5_creds *creds, krb5_kdc_rep *ret_as_reply); + + krb5_error_code + krb5_free_kdc_rep(krb5_context context, krb5_kdc_rep *rep); + + krb5_error_code + krb5_password_key_proc(krb5_context context, krb5_enctype type, + krb5_salt salt, krb5_const_pointer keyseed, krb5_keyblock **key); + +DESCRIPTION + All the functions in this manual page are deprecated in the MIT implemen- + tation, and will soon be deprecated in Heimdal too, don't use them. + + Getting initial credential ticket for a principal. krb5_get_in_cred is + the function all other krb5_get_in function uses to fetch tickets. The + other krb5_get_in function are more specialized and therefor somewhat + easier to use. + + If your need is only to verify a user and password, consider using + krb5_verify_user(3) instead, it have a much simpler interface. + + krb5_get_in_tkt and krb5_get_in_cred fetches initial credential, queries + after key using the key_proc argument. The differences between the two + function is that krb5_get_in_tkt stores the credential in a krb5_creds + while krb5_get_in_cred stores the credential in a krb5_ccache. + + krb5_get_in_tkt_with_password, krb5_get_in_tkt_with_keytab, and + krb5_get_in_tkt_with_skey does the same work as krb5_get_in_cred but are + more specialized. + + krb5_get_in_tkt_with_password uses the clients password to authenticate. + If the password argument is NULL the user user queried with the default + password query function. + + krb5_get_in_tkt_with_keytab searches the given keytab for a service entry + for the client principal. If the keytab is NULL the default keytab is + used. + + krb5_get_in_tkt_with_skey uses a key to get the initial credential. + + There are some common arguments to the krb5_get_in functions, these are: + + options are the KDC_OPT flags. + + etypes is a NULL terminated array of encryption types that the client ap- + proves. + + addrs a list of the addresses that the initial ticket. If it is NULL the + list will be generated by the library. + + pre_auth_types a NULL terminated array of pre-authentication types. If + pre_auth_types is NULL the function will try without pre-authentication + and return those pre-authentication that the KDC returned. + + ret_as_reply will (if not NULL) be filled in with the response of the KDC + and should be free with krb5_free_kdc_rep(). + + key_proc is a pointer to a function that should return a key salted ap- + propriately. Using NULL will use the default password query function. + + decrypt_proc Using NULL will use the default decryption function. + + decryptarg will be passed to the decryption function decrypt_proc. + + creds creds should be filled in with the template for a credential that + should be requested. The client and server elements of the creds struc- + ture must be filled in. Upon return of the function it will be contain + the content of the requested credential (krb5_get_in_cred), or it will be + freed with krb5_free_creds(3) (all the other krb5_get_in functions). + + ccache will store the credential in the credential cache ccache. The + credential cache will not be initialized, thats up the the caller. + + krb5_password_key_proc is a library function that is suitable using as + the krb5_key_proc argument to krb5_get_in_cred or krb5_get_in_tkt. + keyseed should be a pointer to a NUL terminated string or NULL. + krb5_password_key_proc will query the user for the pass on the console if + the password isn't given as the argument keyseed. + + krb5_free_kdc_rep() frees the content of rep. + +SEE ALSO + krb5(3), krb5_verify_user(3), krb5.conf(5), kerberos(8) + +HEIMDAL May 31, 2003 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_get_init_creds.3 b/crypto/heimdal/lib/krb5/krb5_get_init_creds.3 --- a/crypto/heimdal/lib/krb5/krb5_get_init_creds.3 +++ b/crypto/heimdal/lib/krb5/krb5_get_init_creds.3 @@ -97,6 +97,11 @@ .Fa "int anonymous" .Fc .Ft void +.Fo krb5_get_init_creds_opt_set_change_password_prompt +.Fa "krb5_get_init_creds_opt *opt" +.Fa "int change_password_prompt" +.Fc +.Ft void .Fo krb5_get_init_creds_opt_set_default_flags .Fa "krb5_context context" .Fa "const char *appname" diff --git a/crypto/heimdal/lib/krb5/krb5_get_init_creds.cat3 b/crypto/heimdal/lib/krb5/krb5_get_init_creds.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_get_init_creds.cat3 @@ -0,0 +1,248 @@ +KRB5_GET_INIT_CREDS(3) BSD Library Functions Manual KRB5_GET_INIT_CREDS(3) + +NAME + krb5_get_init_creds, krb5_get_init_creds_keytab, krb5_get_init_creds_opt, + krb5_get_init_creds_opt_alloc, krb5_get_init_creds_opt_free, + krb5_get_init_creds_opt_init, krb5_get_init_creds_opt_set_address_list, + krb5_get_init_creds_opt_set_addressless, + krb5_get_init_creds_opt_set_anonymous, + krb5_get_init_creds_opt_set_default_flags, + krb5_get_init_creds_opt_set_etype_list, + krb5_get_init_creds_opt_set_forwardable, + krb5_get_init_creds_opt_set_pa_password, + krb5_get_init_creds_opt_set_paq_request, + krb5_get_init_creds_opt_set_preauth_list, + krb5_get_init_creds_opt_set_proxiable, + krb5_get_init_creds_opt_set_renew_life, krb5_get_init_creds_opt_set_salt, + krb5_get_init_creds_opt_set_tkt_life, + krb5_get_init_creds_opt_set_canonicalize, + krb5_get_init_creds_opt_set_win2k, krb5_get_init_creds_password, + krb5_prompt, krb5_prompter_posix -- Kerberos 5 initial authentication + functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_get_init_creds_opt; + + krb5_error_code + krb5_get_init_creds_opt_alloc(krb5_context context, + krb5_get_init_creds_opt **opt); + + void + krb5_get_init_creds_opt_free(krb5_context context, + krb5_get_init_creds_opt *opt); + + void + krb5_get_init_creds_opt_init(krb5_get_init_creds_opt *opt); + + void + krb5_get_init_creds_opt_set_address_list(krb5_get_init_creds_opt *opt, + krb5_addresses *addresses); + + void + krb5_get_init_creds_opt_set_addressless(krb5_get_init_creds_opt *opt, + krb5_boolean addressless); + + void + krb5_get_init_creds_opt_set_anonymous(krb5_get_init_creds_opt *opt, + int anonymous); + + void + krb5_get_init_creds_opt_set_change_password_prompt(krb5_get_init_creds_opt *opt, + int change_password_prompt); + + void + krb5_get_init_creds_opt_set_default_flags(krb5_context context, + const char *appname, krb5_const_realm realm, + krb5_get_init_creds_opt *opt); + + void + krb5_get_init_creds_opt_set_etype_list(krb5_get_init_creds_opt *opt, + krb5_enctype *etype_list, int etype_list_length); + + void + krb5_get_init_creds_opt_set_forwardable(krb5_get_init_creds_opt *opt, + int forwardable); + + krb5_error_code + krb5_get_init_creds_opt_set_pa_password(krb5_context context, + krb5_get_init_creds_opt *opt, const char *password, + krb5_s2k_proc key_proc); + + krb5_error_code + krb5_get_init_creds_opt_set_paq_request(krb5_context context, + krb5_get_init_creds_opt *opt, krb5_boolean req_pac); + + krb5_error_code + krb5_get_init_creds_opt_set_pkinit(krb5_context context, + krb5_get_init_creds_opt *opt, const char *cert_file, + const char *key_file, const char *x509_anchors, int flags, + char *password); + + void + krb5_get_init_creds_opt_set_preauth_list(krb5_get_init_creds_opt *opt, + krb5_preauthtype *preauth_list, int preauth_list_length); + + void + krb5_get_init_creds_opt_set_proxiable(krb5_get_init_creds_opt *opt, + int proxiable); + + void + krb5_get_init_creds_opt_set_renew_life(krb5_get_init_creds_opt *opt, + krb5_deltat renew_life); + + void + krb5_get_init_creds_opt_set_salt(krb5_get_init_creds_opt *opt, + krb5_data *salt); + + void + krb5_get_init_creds_opt_set_tkt_life(krb5_get_init_creds_opt *opt, + krb5_deltat tkt_life); + + krb5_error_code + krb5_get_init_creds_opt_set_canonicalize(krb5_context context, + krb5_get_init_creds_opt *opt, krb5_boolean req); + + krb5_error_code + krb5_get_init_creds_opt_set_win2k(krb5_context context, + krb5_get_init_creds_opt *opt, krb5_boolean req); + + krb5_error_code + krb5_get_init_creds(krb5_context context, krb5_creds *creds, + krb5_principal client, krb5_prompter_fct prompter, + void *prompter_data, krb5_deltat start_time, + const char *in_tkt_service, krb5_get_init_creds_opt *options); + + krb5_error_code + krb5_get_init_creds_password(krb5_context context, krb5_creds *creds, + krb5_principal client, const char *password, + krb5_prompter_fct prompter, void *prompter_data, + krb5_deltat start_time, const char *in_tkt_service, + krb5_get_init_creds_opt *in_options); + + krb5_error_code + krb5_get_init_creds_keytab(krb5_context context, krb5_creds *creds, + krb5_principal client, krb5_keytab keytab, krb5_deltat start_time, + const char *in_tkt_service, krb5_get_init_creds_opt *options); + + int + krb5_prompter_posix(krb5_context context, void *data, const char *name, + const char *banner, int num_prompts, krb5_prompt prompts[]); + +DESCRIPTION + Getting initial credential ticket for a principal. That may include + changing an expired password, and doing preauthentication. This inter- + face that replaces the deprecated krb5_in_tkt and krb5_in_cred functions. + + If you only want to verify a username and password, consider using + krb5_verify_user(3) instead, since it also verifies that initial creden- + tials with using a keytab to make sure the response was from the KDC. + + First a krb5_get_init_creds_opt structure is initialized with + krb5_get_init_creds_opt_alloc() or krb5_get_init_creds_opt_init(). + krb5_get_init_creds_opt_alloc() allocates a extendible structures that + needs to be freed with krb5_get_init_creds_opt_free(). The structure may + be modified by any of the krb5_get_init_creds_opt_set() functions to + change request parameters and authentication information. + + If the caller want to use the default options, NULL can be passed in- + stead. + + The the actual request to the KDC is done by any of the + krb5_get_init_creds(), krb5_get_init_creds_password(), or + krb5_get_init_creds_keytab() functions. krb5_get_init_creds() is the + least specialized function and can, with the right in data, behave like + the latter two. The latter two are there for compatibility with older + releases and they are slightly easier to use. + + krb5_prompt is a structure containing the following elements: + + typedef struct { + const char *prompt; + int hidden; + krb5_data *reply; + krb5_prompt_type type + } krb5_prompt; + + prompt is the prompt that should shown to the user If hidden is set, the + prompter function shouldn't echo the output to the display device. reply + must be preallocated; it will not be allocated by the prompter function. + Possible values for the type element are: + + KRB5_PROMPT_TYPE_PASSWORD + KRB5_PROMPT_TYPE_NEW_PASSWORD + KRB5_PROMPT_TYPE_NEW_PASSWORD_AGAIN + KRB5_PROMPT_TYPE_PREAUTH + KRB5_PROMPT_TYPE_INFO + + krb5_prompter_posix() is the default prompter function in a POSIX envi- + ronment. It matches the krb5_prompter_fct and can be used in the + krb5_get_init_creds functions. krb5_prompter_posix() doesn't require + prompter_data. + + If the start_time is zero, then the requested ticket will be valid begin- + ning immediately. Otherwise, the start_time indicates how far in the fu- + ture the ticket should be postdated. + + If the in_tkt_service name is non-NULL, that principal name will be used + as the server name for the initial ticket request. The realm of the name + specified will be ignored and will be set to the realm of the client + name. If no in_tkt_service name is specified, krbtgt/CLIENT- + REALM@CLIENT-REALM will be used. + + For the rest of arguments, a configuration or library default will be + used if no value is specified in the options structure. + + krb5_get_init_creds_opt_set_address_list() sets the list of addresses + that is should be stored in the ticket. + + krb5_get_init_creds_opt_set_addressless() controls if the ticket is re- + quested with addresses or not, krb5_get_init_creds_opt_set_address_list() + overrides this option. + + krb5_get_init_creds_opt_set_anonymous() make the request anonymous if the + anonymous parameter is non-zero. + + krb5_get_init_creds_opt_set_default_flags() sets the default flags using + the configuration file. + + krb5_get_init_creds_opt_set_etype_list() set a list of enctypes that the + client is willing to support in the request. + + krb5_get_init_creds_opt_set_forwardable() request a forwardable ticket. + + krb5_get_init_creds_opt_set_pa_password() set the password and key_proc + that is going to be used to get a new ticket. password or key_proc can + be NULL if the caller wants to use the default values. If the password + is unset and needed, the user will be prompted for it. + + krb5_get_init_creds_opt_set_paq_request() sets the password that is going + to be used to get a new ticket. + + krb5_get_init_creds_opt_set_preauth_list() sets the list of client-sup- + ported preauth types. + + krb5_get_init_creds_opt_set_proxiable() makes the request proxiable. + + krb5_get_init_creds_opt_set_renew_life() sets the requested renewable + lifetime. + + krb5_get_init_creds_opt_set_salt() sets the salt that is going to be used + in the request. + + krb5_get_init_creds_opt_set_tkt_life() sets requested ticket lifetime. + + krb5_get_init_creds_opt_set_canonicalize() requests that the KDC canoni- + calize the client principal if possible. + + krb5_get_init_creds_opt_set_win2k() turns on compatibility with Windows + 2000. + +SEE ALSO + krb5(3), krb5_creds(3), krb5_verify_user(3), krb5.conf(5), kerberos(8) + +HEIMDAL Sep 16, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_get_krbhst.cat3 b/crypto/heimdal/lib/krb5/krb5_get_krbhst.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_get_krbhst.cat3 @@ -0,0 +1,55 @@ +KRB5_GET_KRBHST(3) BSD Library Functions Manual KRB5_GET_KRBHST(3) + +NAME + krb5_get_krbhst, krb5_get_krb_admin_hst, krb5_get_krb_changepw_hst, + krb5_get_krb524hst, krb5_free_krbhst -- lookup Kerberos KDC hosts + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_get_krbhst(krb5_context context, const krb5_realm *realm, + char ***hostlist); + + krb5_error_code + krb5_get_krb_admin_hst(krb5_context context, const krb5_realm *realm, + char ***hostlist); + + krb5_error_code + krb5_get_krb_changepw_hst(krb5_context context, const krb5_realm *realm, + char ***hostlist); + + krb5_error_code + krb5_get_krb524hst(krb5_context context, const krb5_realm *realm, + char ***hostlist); + + krb5_error_code + krb5_free_krbhst(krb5_context context, char **hostlist); + +DESCRIPTION + These functions implement the old API to get a list of Kerberos hosts, + and are thus similar to the krb5_krbhst_init() functions. However, since + these functions returns all hosts in one go, they potentially have to do + more lookups than necessary. These functions remain for compatibility + reasons. + + After a call to one of these functions, hostlist is a NULL terminated + list of strings, pointing to the requested Kerberos hosts. These should + be freed with krb5_free_krbhst() when done with. + +EXAMPLES + The following code will print the KDCs of the realm "MY.REALM". + + char **hosts, **p; + krb5_get_krbhst(context, "MY.REALM", &hosts); + for(p = hosts; *p; p++) + printf("%s\n", *p); + krb5_free_krbhst(context, hosts); + +SEE ALSO + krb5_krbhst_init(3) + +HEIMDAL April 24, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_getportbyname.cat3 b/crypto/heimdal/lib/krb5/krb5_getportbyname.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_getportbyname.cat3 @@ -0,0 +1,28 @@ +NAME(3) BSD Library Functions Manual NAME(3) + +NAME + krb5_getportbyname -- get port number by name + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + int + krb5_getportbyname(krb5_context context, const char *service, + const char *proto, int default_port); + +DESCRIPTION + krb5_getportbyname() gets the port number for service / proto pair from + the global service table for and returns it in network order. If it + isn't found in the global table, the default_port (given in host order) + is returned. + +EXAMPLE + int port = krb5_getportbyname(context, "kerberos", "tcp", 88); + +SEE ALSO + krb5(3) + +HEIMDAL August 15, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_init_context.cat3 b/crypto/heimdal/lib/krb5/krb5_init_context.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_init_context.cat3 @@ -0,0 +1,184 @@ +KRB5_CONTEXT(3) BSD Library Functions Manual KRB5_CONTEXT(3) + +NAME + krb5_add_et_list, krb5_add_extra_addresses, krb5_add_ignore_addresses, + krb5_context, krb5_free_config_files, krb5_free_context, + krb5_get_default_config_files, krb5_get_dns_canonize_hostname, + krb5_get_extra_addresses, krb5_get_fcache_version, + krb5_get_ignore_addresses, krb5_get_kdc_sec_offset, + krb5_get_max_time_skew, krb5_get_use_admin_kdc krb5_init_context, + krb5_init_ets, krb5_prepend_config_files, + krb5_prepend_config_files_default, krb5_set_config_files, + krb5_set_dns_canonize_hostname, krb5_set_extra_addresses, + krb5_set_fcache_version, krb5_set_ignore_addresses, + krb5_set_max_time_skew, krb5_set_use_admin_kdc, -- create, modify and + delete krb5_context structures + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + struct krb5_context; + + krb5_error_code + krb5_init_context(krb5_context *context); + + void + krb5_free_context(krb5_context context); + + void + krb5_init_ets(krb5_context context); + + krb5_error_code + krb5_add_et_list(krb5_context context, void (*func)(struct et_list **)); + + krb5_error_code + krb5_add_extra_addresses(krb5_context context, + krb5_addresses *addresses); + + krb5_error_code + krb5_set_extra_addresses(krb5_context context, + const krb5_addresses *addresses); + + krb5_error_code + krb5_get_extra_addresses(krb5_context context, + krb5_addresses *addresses); + + krb5_error_code + krb5_add_ignore_addresses(krb5_context context, + krb5_addresses *addresses); + + krb5_error_code + krb5_set_ignore_addresses(krb5_context context, + const krb5_addresses *addresses); + + krb5_error_code + krb5_get_ignore_addresses(krb5_context context, + krb5_addresses *addresses); + + krb5_error_code + krb5_set_fcache_version(krb5_context context, int version); + + krb5_error_code + krb5_get_fcache_version(krb5_context context, int *version); + + void + krb5_set_dns_canonize_hostname(krb5_context context, krb5_boolean flag); + + krb5_boolean + krb5_get_dns_canonize_hostname(krb5_context context); + + krb5_error_code + krb5_get_kdc_sec_offset(krb5_context context, int32_t *sec, + int32_t *usec); + + krb5_error_code + krb5_set_config_files(krb5_context context, char **filenames); + + krb5_error_code + krb5_prepend_config_files(const char *filelist, char **pq, + char ***ret_pp); + + krb5_error_code + krb5_prepend_config_files_default(const char *filelist, + char ***pfilenames); + + krb5_error_code + krb5_get_default_config_files(char ***pfilenames); + + void + krb5_free_config_files(char **filenames); + + void + krb5_set_use_admin_kdc(krb5_context context, krb5_boolean flag); + + krb5_boolean + krb5_get_use_admin_kdc(krb5_context context); + + time_t + krb5_get_max_time_skew(krb5_context context); + + krb5_error_code + krb5_set_max_time_skew(krb5_context context, time_t time); + +DESCRIPTION + The krb5_init_context() function initializes the context structure and + reads the configuration file /etc/krb5.conf. + + The structure should be freed by calling krb5_free_context() when it is + no longer being used. + + krb5_init_context() returns 0 to indicate success. Otherwise an errno + code is returned. Failure means either that something bad happened dur- + ing initialization (typically [ENOMEM]) or that Kerberos should not be + used [ENXIO]. + + krb5_init_ets() adds all com_err(3) libs to context. This is done by + krb5_init_context(). + + krb5_add_et_list() adds a com_err(3) error-code handler func to the spec- + ified context. The error handler must generated by the the re-rentrant + version of the compile_et(1) program. krb5_add_extra_addresses() add a + list of addresses that should be added when requesting tickets. + + krb5_add_ignore_addresses() add a list of addresses that should be ig- + nored when requesting tickets. + + krb5_get_extra_addresses() get the list of addresses that should be added + when requesting tickets. + + krb5_get_ignore_addresses() get the list of addresses that should be ig- + nored when requesting tickets. + + krb5_set_ignore_addresses() set the list of addresses that should be ig- + nored when requesting tickets. + + krb5_set_extra_addresses() set the list of addresses that should be added + when requesting tickets. + + krb5_set_fcache_version() sets the version of file credentials caches + that should be used. + + krb5_get_fcache_version() gets the version of file credentials caches + that should be used. + + krb5_set_dns_canonize_hostname() sets if the context is configured to + canonicalize hostnames using DNS. + + krb5_get_dns_canonize_hostname() returns if the context is configured to + canonicalize hostnames using DNS. + + krb5_get_kdc_sec_offset() returns the offset between the localtime and + the KDC's time. sec and usec are both optional argument and NULL can be + passed in. + + krb5_set_config_files() set the list of configuration files to use and + re-initialize the configuration from the files. + + krb5_prepend_config_files() parse the filelist and prepend the result to + the already existing list pq The result is returned in ret_pp and should + be freed with krb5_free_config_files(). + + krb5_prepend_config_files_default() parse the filelist and append that to + the default list of configuration files. + + krb5_get_default_config_files() get a list of default configuration + files. + + krb5_free_config_files() free a list of configuration files returned by + krb5_get_default_config_files(), krb5_prepend_config_files_default(), or + krb5_prepend_config_files(). + + krb5_set_use_admin_kdc() sets if all KDC requests should go admin KDC. + + krb5_get_use_admin_kdc() gets if all KDC requests should go admin KDC. + + krb5_get_max_time_skew() and krb5_set_max_time_skew() get and sets the + maximum allowed time skew between client and server. + +SEE ALSO + errno(2), krb5(3), krb5_config(3), krb5_context(3), kerberos(8) + +HEIMDAL December 8, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_is_thread_safe.cat3 b/crypto/heimdal/lib/krb5/krb5_is_thread_safe.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_is_thread_safe.cat3 @@ -0,0 +1,25 @@ +KRB5_IS_THREAD_SAFE(3) BSD Library Functions Manual KRB5_IS_THREAD_SAFE(3) + +NAME + krb5_is_thread_safe -- is the Kerberos library compiled with multithread + support + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_boolean + krb5_is_thread_safe(void); + +DESCRIPTION + krb5_is_thread_safe returns TRUE if the library was compiled with with + multithread support. If the library isn't compiled, the consumer have to + use a global lock to make sure Kerboros functions are not called at the + same time by different threads. + +SEE ALSO + krb5_create_checksum(3), krb5_encrypt(3) + +HEIMDAL May 5, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_krbhst_init.cat3 b/crypto/heimdal/lib/krb5/krb5_krbhst_init.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_krbhst_init.cat3 @@ -0,0 +1,117 @@ +KRB5_KRBHST_INIT(3) BSD Library Functions Manual KRB5_KRBHST_INIT(3) + +NAME + krb5_krbhst_init, krb5_krbhst_init_flags, krb5_krbhst_next, + krb5_krbhst_next_as_string, krb5_krbhst_reset, krb5_krbhst_free, + krb5_krbhst_format_string, krb5_krbhst_get_addrinfo -- lookup Kerberos + KDC hosts + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_krbhst_init(krb5_context context, const char *realm, + unsigned int type, krb5_krbhst_handle *handle); + + krb5_error_code + krb5_krbhst_init_flags(krb5_context context, const char *realm, + unsigned int type, int flags, krb5_krbhst_handle *handle); + + krb5_error_code + krb5_krbhst_next(krb5_context context, krb5_krbhst_handle handle, + krb5_krbhst_info **host); + + krb5_error_code + krb5_krbhst_next_as_string(krb5_context context, + krb5_krbhst_handle handle, char *hostname, size_t hostlen); + + void + krb5_krbhst_reset(krb5_context context, krb5_krbhst_handle handle); + + void + krb5_krbhst_free(krb5_context context, krb5_krbhst_handle handle); + + krb5_error_code + krb5_krbhst_format_string(krb5_context context, + const krb5_krbhst_info *host, char *hostname, size_t hostlen); + + krb5_error_code + krb5_krbhst_get_addrinfo(krb5_context context, krb5_krbhst_info *host, + struct addrinfo **ai); + +DESCRIPTION + These functions are used to sequence through all Kerberos hosts of a par- + ticular realm and service. The service type can be the KDCs, the adminis- + trative servers, the password changing servers, or the servers for Ker- + beros 4 ticket conversion. + + First a handle to a particular service is obtained by calling + krb5_krbhst_init() (or krb5_krbhst_init_flags()) with the realm of inter- + est and the type of service to lookup. The type can be one of: + + KRB5_KRBHST_KDC + KRB5_KRBHST_ADMIN + KRB5_KRBHST_CHANGEPW + KRB5_KRBHST_KRB524 + + The handle is returned to the caller, and should be passed to the other + functions. + + The flag argument to krb5_krbhst_init_flags is the same flags as + krb5_send_to_kdc_flags() uses. Possible values are: + + KRB5_KRBHST_FLAGS_MASTER only talk to master (readwrite) KDC + KRB5_KRBHST_FLAGS_LARGE_MSG this is a large message, so use trans- + port that can handle that. + + For each call to krb5_krbhst_next() information on a new host is re- + turned. The former function returns in host a pointer to a structure con- + taining information about the host, such as protocol, hostname, and port: + + typedef struct krb5_krbhst_info { + enum { KRB5_KRBHST_UDP, + KRB5_KRBHST_TCP, + KRB5_KRBHST_HTTP } proto; + unsigned short port; + struct addrinfo *ai; + struct krb5_krbhst_info *next; + char hostname[1]; + } krb5_krbhst_info; + + The related function, krb5_krbhst_next_as_string(), return the same in- + formation as a URL-like string. + + When there are no more hosts, these functions return KRB5_KDC_UNREACH. + + To re-iterate over all hosts, call krb5_krbhst_reset() and the next call + to krb5_krbhst_next() will return the first host. + + When done with the handle, krb5_krbhst_free() should be called. + + To use a krb5_krbhst_info, there are two functions: + krb5_krbhst_format_string() that will return a printable representation + of that struct and krb5_krbhst_get_addrinfo() that will return a struct + addrinfo that can then be used for communicating with the server men- + tioned. + +EXAMPLES + The following code will print the KDCs of the realm "MY.REALM": + + krb5_krbhst_handle handle; + char host[MAXHOSTNAMELEN]; + krb5_krbhst_init(context, "MY.REALM", KRB5_KRBHST_KDC, &handle); + while(krb5_krbhst_next_as_string(context, handle, + host, sizeof(host)) == 0) + printf("%s\n", host); + krb5_krbhst_free(context, handle); + +SEE ALSO + getaddrinfo(3), krb5_get_krbhst(3), krb5_send_to_kdc_flags(3) + +HISTORY + These functions first appeared in Heimdal 0.3g. + +HEIMDAL May 10, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_locl.h b/crypto/heimdal/lib/krb5/krb5_locl.h --- a/crypto/heimdal/lib/krb5/krb5_locl.h +++ b/crypto/heimdal/lib/krb5/krb5_locl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997-2006 Kungliga Tekniska Högskolan + * Copyright (c) 1997-2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -39,13 +39,13 @@ #define __KRB5_LOCL_H__ #include +#include -#include #include -#include -#include -#include -#include + +#ifdef HAVE_POLL_H +#include +#endif #include @@ -55,12 +55,6 @@ #ifdef HAVE_SYS_MMAN_H #include #endif -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_FCNTL_H -#include -#endif #if defined(HAVE_SYS_IOCTL_H) && SunOS != 40 #include @@ -72,44 +66,11 @@ #include #endif -#ifdef HAVE_SYS_PARAM_H -#include -#endif -#include -#ifdef HAVE_SYS_TIME_H -#include -#endif #ifdef HAVE_SYS_SELECT_H #include #endif -#ifdef HAVE_SYS_SOCKET_H -#include -#endif -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifdef HAVE_NETINET_IN6_H -#include -#endif -#ifdef HAVE_NETINET6_IN6_H -#include -#endif -#ifdef HAVE_NETDB_H -#include -#endif #ifdef _AIX -struct ether_addr; struct mbuf; -struct sockaddr_dl; -#endif -#ifdef HAVE_ARPA_INET_H -#include -#endif -#ifdef HAVE_ARPA_NAMESER_H -#include -#endif -#ifdef HAVE_SYS_UIO_H -#include #endif #ifdef HAVE_SYS_FILIO_H #include @@ -144,17 +105,24 @@ #include #endif -#include #include #include #include +/* + * We use OpenSSL for EC, but to do this we need to disable cross-references + * between OpenSSL and hcrypto bn.h and such. Source files that use OpenSSL EC + * must define HEIM_NO_CRYPTO_HDRS before including this file. + */ #define HC_DEPRECATED_CRYPTO +#ifndef HEIM_NO_CRYPTO_HDRS #include "crypto-headers.h" +#endif #include +#include struct send_to_kdc; @@ -240,6 +208,8 @@ #define KRB5_INIT_CREDS_CANONICALIZE 1 #define KRB5_INIT_CREDS_NO_C_CANON_CHECK 2 #define KRB5_INIT_CREDS_NO_C_NO_EKU_CHECK 4 +#define KRB5_INIT_CREDS_PKINIT_KX_VALID 32 +#define KRB5_INIT_CREDS_PKINIT_NO_KRBTGT_OTHERNAME_CHECK 64 struct { krb5_gic_process_last_req func; void *ctx; @@ -250,6 +220,7 @@ typedef struct krb5_context_data { krb5_enctype *etypes; + krb5_enctype *cfg_etypes; krb5_enctype *etypes_des;/* deprecated */ krb5_enctype *as_etypes; krb5_enctype *tgs_etypes; @@ -257,6 +228,7 @@ char **default_realms; time_t max_skew; time_t kdc_timeout; + time_t host_timeout; unsigned max_retries; int32_t kdc_sec_offset; int32_t kdc_usec_offset; @@ -287,24 +259,31 @@ char *default_cc_name; char *default_cc_name_env; int default_cc_name_set; - void *mutex; /* protects error_string/error_buf */ + HEIMDAL_MUTEX mutex; /* protects error_string */ int large_msg_size; + int max_msg_size; + int tgs_negative_timeout; /* timeout for TGS negative cache */ int flags; #define KRB5_CTX_F_DNS_CANONICALIZE_HOSTNAME 1 #define KRB5_CTX_F_CHECK_PAC 2 #define KRB5_CTX_F_HOMEDIR_ACCESS 4 #define KRB5_CTX_F_SOCKETS_INITIALIZED 8 #define KRB5_CTX_F_RD_REQ_IGNORE 16 +#define KRB5_CTX_F_FCACHE_STRICT_CHECKING 32 struct send_to_kdc *send_to_kdc; #ifdef PKINIT hx509_context hx509ctx; #endif + unsigned int num_kdc_requests; + krb5_name_canon_rule name_canon_rules; } krb5_context_data; #ifndef KRB5_USE_PATH_TOKENS #define KRB5_DEFAULT_CCNAME_FILE "FILE:/tmp/krb5cc_%{uid}" +#define KRB5_DEFAULT_CCNAME_DIR "DIR:/tmp/krb5cc_%{uid}_dir/" #else #define KRB5_DEFAULT_CCNAME_FILE "FILE:%{TEMP}/krb5cc_%{uid}" +#define KRB5_DEFAULT_CCNAME_DIR "DIR:%{TEMP}/krb5cc_%{uid}_dir/" #endif #define KRB5_DEFAULT_CCNAME_API "API:" #define KRB5_DEFAULT_CCNAME_KCM_KCM "KCM:%{uid}" @@ -315,6 +294,7 @@ #define EXTRACT_TICKET_MATCH_REALM 4 #define EXTRACT_TICKET_AS_REQ 8 #define EXTRACT_TICKET_TIMESYNC 16 +#define EXTRACT_TICKET_MATCH_ANON 32 /* * Configurable options @@ -336,6 +316,22 @@ #define KRB5_FORWARDABLE_DEFAULT TRUE #endif +#ifndef KRB5_CONFIGURATION_CHANGE_NOTIFY_NAME +#define KRB5_CONFIGURATION_CHANGE_NOTIFY_NAME "org.h5l.Kerberos.configuration-changed" +#endif + +#ifndef KRB5_FALLBACK_DEFAULT +#define KRB5_FALLBACK_DEFAULT TRUE +#endif + +#ifndef KRB5_TKT_LIFETIME_DEFAULT +# define KRB5_TKT_LIFETIME_DEFAULT 15778800 /* seconds */ +#endif + +#ifndef KRB5_TKT_RENEW_LIFETIME_DEFAULT +# define KRB5_TKT_RENEW_LIFETIME_DEFAULT 15778800 /* seconds */ +#endif + #ifdef PKINIT struct krb5_pk_identity { @@ -354,6 +350,34 @@ PKINIT_27 = 2 }; +enum keyex_enum { USE_RSA, USE_DH, USE_ECDH }; + +struct krb5_pk_init_ctx_data { + struct krb5_pk_identity *id; + enum keyex_enum keyex; + union { + DH *dh; + void *eckey; + } u; + krb5_data *clientDHNonce; + struct krb5_dh_moduli **m; + hx509_peer_info peer; + enum krb5_pk_type type; + unsigned int require_binding:1; + unsigned int require_eku:1; + unsigned int require_krbtgt_otherName:1; + unsigned int require_hostname_match:1; + unsigned int trustedCertifiers:1; + unsigned int anonymous:1; +}; + #endif /* PKINIT */ +#define ISTILDE(x) (x == '~') +#ifdef _WIN32 +# define ISPATHSEP(x) (x == '/' || x =='\\') +#else +# define ISPATHSEP(x) (x == '/') +#endif + #endif /* __KRB5_LOCL_H__ */ diff --git a/crypto/heimdal/lib/krb5/krb5_mk_req.cat3 b/crypto/heimdal/lib/krb5/krb5_mk_req.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_mk_req.cat3 @@ -0,0 +1,88 @@ +KRB5_MK_REQ(3) BSD Library Functions Manual KRB5_MK_REQ(3) + +NAME + krb5_mk_req, krb5_mk_req_exact, krb5_mk_req_extended, krb5_rd_req, + krb5_rd_req_with_keyblock, krb5_mk_rep, krb5_mk_rep_exact, + krb5_mk_rep_extended, krb5_rd_rep, krb5_build_ap_req, krb5_verify_ap_req + -- create and read application authentication request + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_mk_req(krb5_context context, krb5_auth_context *auth_context, + const krb5_flags ap_req_options, const char *service, + const char *hostname, krb5_data *in_data, krb5_ccache ccache, + krb5_data *outbuf); + + krb5_error_code + krb5_mk_req_extended(krb5_context context, + krb5_auth_context *auth_context, const krb5_flags ap_req_options, + krb5_data *in_data, krb5_creds *in_creds, krb5_data *outbuf); + + krb5_error_code + krb5_rd_req(krb5_context context, krb5_auth_context *auth_context, + const krb5_data *inbuf, krb5_const_principal server, + krb5_keytab keytab, krb5_flags *ap_req_options, + krb5_ticket **ticket); + + krb5_error_code + krb5_build_ap_req(krb5_context context, krb5_enctype enctype, + krb5_creds *cred, krb5_flags ap_options, krb5_data authenticator, + krb5_data *retdata); + + krb5_error_code + krb5_verify_ap_req(krb5_context context, krb5_auth_context *auth_context, + krb5_ap_req *ap_req, krb5_const_principal server, + krb5_keyblock *keyblock, krb5_flags flags, + krb5_flags *ap_req_options, krb5_ticket **ticket); + +DESCRIPTION + The functions documented in this manual page document the functions that + facilitates the exchange between a Kerberos client and server. They are + the core functions used in the authentication exchange between the client + and the server. + + The krb5_mk_req and krb5_mk_req_extended creates the Kerberos message + KRB_AP_REQ that is sent from the client to the server as the first packet + in a client/server exchange. The result that should be sent to server is + stored in outbuf. + + auth_context should be allocated with krb5_auth_con_init() or NULL passed + in, in that case, it will be allocated and freed internally. + + The input data in_data will have a checksum calculated over it and check- + sum will be transported in the message to the server. + + ap_req_options can be set to one or more of the following flags: + + AP_OPTS_USE_SESSION_KEY + Use the session key when creating the request, used for user to + user authentication. + + AP_OPTS_MUTUAL_REQUIRED + Mark the request as mutual authenticate required so that the re- + ceiver returns a mutual authentication packet. + + The krb5_rd_req read the AP_REQ in inbuf and verify and extract the con- + tent. If server is specified, that server will be fetched from the + keytab and used unconditionally. If server is NULL, the keytab will be + search for a matching principal. + + The keytab argument specifies what keytab to search for receiving princi- + pals. The arguments ap_req_options and ticket returns the content. + + When the AS-REQ is a user to user request, neither of keytab or principal + are used, instead krb5_rd_req() expects the session key to be set in + auth_context. + + The krb5_verify_ap_req and krb5_build_ap_req both constructs and verify + the AP_REQ message, should not be used by external code. + +SEE ALSO + krb5(3), krb5.conf(5) + +HEIMDAL August 27, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_mk_safe.cat3 b/crypto/heimdal/lib/krb5/krb5_mk_safe.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_mk_safe.cat3 @@ -0,0 +1,35 @@ +KRB5_MK_SAFE(3) BSD Library Functions Manual KRB5_MK_SAFE(3) + +NAME + krb5_mk_safe, krb5_mk_priv -- generates integrity protected and/or en- + crypted messages + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_mk_priv(krb5_context context, krb5_auth_context auth_context, + const krb5_data *userdata, krb5_data *outbuf, + krb5_replay_data *outdata); + + krb5_error_code + krb5_mk_safe(krb5_context context, krb5_auth_context auth_context, + const krb5_data *userdata, krb5_data *outbuf, + krb5_replay_data *outdata); + +DESCRIPTION + krb5_mk_safe() and krb5_mk_priv() formats KRB-SAFE (integrity protected) + and KRB-PRIV (also encrypted) messages into outbuf. The actual message + data is taken from userdata. If the KRB5_AUTH_CONTEXT_DO_SEQUENCE or + KRB5_AUTH_CONTEXT_DO_TIME flags are set in the auth_context, sequence + numbers and time stamps are generated. If the + KRB5_AUTH_CONTEXT_RET_SEQUENCE or KRB5_AUTH_CONTEXT_RET_TIME flags are + set they are also returned in the outdata parameter. + +SEE ALSO + krb5_auth_con_init(3), krb5_rd_priv(3), krb5_rd_safe(3) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_openlog.cat3 b/crypto/heimdal/lib/krb5/krb5_openlog.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_openlog.cat3 @@ -0,0 +1,158 @@ +KRB5_OPENLOG(3) BSD Library Functions Manual KRB5_OPENLOG(3) + +NAME + krb5_initlog, krb5_openlog, krb5_closelog, krb5_addlog_dest, + krb5_addlog_func, krb5_log, krb5_vlog, krb5_log_msg, krb5_vlog_msg -- + Heimdal logging functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + typedef void + (*krb5_log_log_func_t)(const char *time, const char *message, + void *data); + + typedef void + (*krb5_log_close_func_t)(void *data); + + krb5_error_code + krb5_addlog_dest(krb5_context context, krb5_log_facility *facility, + const char *destination); + + krb5_error_code + krb5_addlog_func(krb5_context context, krb5_log_facility *facility, + int min, int max, krb5_log_log_func_t log, + krb5_log_close_func_t close, void *data); + + krb5_error_code + krb5_closelog(krb5_context context, krb5_log_facility *facility); + + krb5_error_code + krb5_initlog(krb5_context context, const char *program, + krb5_log_facility **facility); + + krb5_error_code + krb5_log(krb5_context context, krb5_log_facility *facility, int level, + const char *format, ...); + + krb5_error_code + krb5_log_msg(krb5_context context, krb5_log_facility *facility, + char **reply, int level, const char *format, ...); + + krb5_error_code + krb5_openlog(krb5_context context, const char *program, + krb5_log_facility **facility); + + krb5_error_code + krb5_vlog(krb5_context context, krb5_log_facility *facility, int level, + const char *format, va_list arglist); + + krb5_error_code + krb5_vlog_msg(krb5_context context, krb5_log_facility *facility, + char **reply, int level, const char *format, va_list arglist); + +DESCRIPTION + These functions logs messages to one or more destinations. + + The krb5_openlog() function creates a logging facility, that is used to + log messages. A facility consists of one or more destinations (which can + be files or syslog or some other device). The program parameter should be + the generic name of the program that is doing the logging. This name is + used to lookup which destinations to use. This information is contained + in the logging section of the krb5.conf configuration file. If no entry + is found for program, the entry for default is used, or if that is miss- + ing too, SYSLOG will be used as destination. + + To close a logging facility, use the krb5_closelog() function. + + To log a message to a facility use one of the functions krb5_log(), + krb5_log_msg(), krb5_vlog(), or krb5_vlog_msg(). The functions ending in + _msg return in reply a pointer to the message that just got logged. This + string is allocated, and should be freed with free(). The format is a + standard printf() style format string (but see the BUGS section). + + If you want better control of where things gets logged, you can instead + of using krb5_openlog() call krb5_initlog(), which just initializes a fa- + cility, but doesn't define any actual logging destinations. You can then + add destinations with the krb5_addlog_dest() and krb5_addlog_func() func- + tions. The first of these takes a string specifying a logging destina- + tion, and adds this to the facility. If you want to do some non-standard + logging you can use the krb5_addlog_func() function, which takes a func- + tion to use when logging. The log function is called for each message + with time being a string specifying the current time, and message the + message to log. close is called when the facility is closed. You can + pass application specific data in the data parameter. The min and max pa- + rameter are the same as in a destination (defined below). To specify a + max of infinity, pass -1. + + krb5_openlog() calls krb5_initlog() and then calls krb5_addlog_dest() for + each destination found. + + Destinations + The defined destinations (as specified in krb5.conf) follows: + + STDERR + This logs to the program's stderr. + + FILE:/file + + FILE=/file + Log to the specified file. The form using a colon appends to + the file, the form with an equal truncates the file. The trun- + cating form keeps the file open, while the appending form + closes it after each log message (which makes it possible to + rotate logs). The truncating form is mainly for compatibility + with the MIT libkrb5. + + DEVICE=/device + This logs to the specified device, at present this is the same + as FILE:/device. + + CONSOLE + Log to the console, this is the same as DEVICE=/dev/console. + + SYSLOG[:priority[:facility]] + Send messages to the syslog system, using priority, and facil- + ity. To get the name for one of these, you take the name of + the macro passed to syslog(3), and remove the leading LOG_ + (LOG_NOTICE becomes NOTICE). The default values (as well as + the values used for unrecognised values), are ERR, and AUTH, + respectively. See syslog(3) for a list of priorities and fa- + cilities. + + Each destination may optionally be prepended with a range of logging lev- + els, specified as min-max/. If the level parameter to krb5_log() is + within this range (inclusive) the message gets logged to this destina- + tion, otherwise not. Either of the min and max valued may be omitted, in + this case min is assumed to be zero, and max is assumed to be infinity. + If you don't include a dash, both min and max gets set to the specified + value. If no range is specified, all messages gets logged. + +EXAMPLES + [logging] + kdc = 0/FILE:/var/log/kdc.log + kdc = 1-/SYSLOG:INFO:USER + default = STDERR + + This will log all messages from the kdc program with level 0 to + /var/log/kdc.log, other messages will be logged to syslog with priority + LOG_INFO, and facility LOG_USER. All other programs will log all mes- + sages to their stderr. + +SEE ALSO + syslog(3), krb5.conf(5) + +BUGS + These functions use asprintf() to format the message. If your operating + system does not have a working asprintf(), a replacement will be used. At + present this replacement does not handle some correct conversion specifi- + cations (like floating point numbers). Until this is fixed, the use of + these conversions should be avoided. + + If logging is done to the syslog facility, these functions might not be + thread-safe, depending on the implementation of openlog(), and syslog(). + +HEIMDAL August 6, 1997 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_parse_name.3 b/crypto/heimdal/lib/krb5/krb5_parse_name.3 --- a/crypto/heimdal/lib/krb5/krb5_parse_name.3 +++ b/crypto/heimdal/lib/krb5/krb5_parse_name.3 @@ -61,7 +61,6 @@ .Pq Dq \e . A realm should not contain slashes or colons. .Sh SEE ALSO -.Xr krb5_425_conv_principal 3 , .Xr krb5_build_principal 3 , .Xr krb5_free_principal 3 , .Xr krb5_sname_to_principal 3 , diff --git a/crypto/heimdal/lib/krb5/krb5_parse_name.cat3 b/crypto/heimdal/lib/krb5/krb5_parse_name.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_parse_name.cat3 @@ -0,0 +1,30 @@ +KRB5_PARSE_NAME(3) BSD Library Functions Manual KRB5_PARSE_NAME(3) + +NAME + krb5_parse_name -- string to principal conversion + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_parse_name(krb5_context context, const char *name, + krb5_principal *principal); + +DESCRIPTION + krb5_parse_name() converts a string representation of a principal name to + krb5_principal. The principal will point to allocated data that should + be freed with krb5_free_principal(). + + The string should consist of one or more name components separated with + slashes ("/"), optionally followed with an "@" and a realm name. A slash + or @ may be contained in a name component by quoting it with a backslash + ("\"). A realm should not contain slashes or colons. + +SEE ALSO + krb5_build_principal(3), krb5_free_principal(3), + krb5_sname_to_principal(3), krb5_unparse_name(3) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_principal.3 b/crypto/heimdal/lib/krb5/krb5_principal.3 --- a/crypto/heimdal/lib/krb5/krb5_principal.3 +++ b/crypto/heimdal/lib/krb5/krb5_principal.3 @@ -293,7 +293,7 @@ .Dv krb5_data was that it was believed that principal components could contain binary data, but this belief was unfounded, and it has been decided -that principal components are in fact UTF8, so it's safe to use zero +that principal components are infact UTF8, so it's safe to use zero terminated strings. .Pp It's generally not necessary to look at the components of a principal. @@ -362,7 +362,6 @@ string. .\" .Sh EXAMPLES .Sh SEE ALSO -.Xr krb5_425_conv_principal 3 , .Xr krb5_config 3 , .Xr krb5.conf 5 .Sh BUGS diff --git a/crypto/heimdal/lib/krb5/krb5_principal.cat3 b/crypto/heimdal/lib/krb5/krb5_principal.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_principal.cat3 @@ -0,0 +1,259 @@ +KRB5_PRINCIPAL(3) BSD Library Functions Manual KRB5_PRINCIPAL(3) + +NAME + krb5_get_default_principal, krb5_principal, krb5_build_principal, + krb5_build_principal_ext, krb5_build_principal_va, + krb5_build_principal_va_ext, krb5_copy_principal, krb5_free_principal, + krb5_make_principal, krb5_parse_name, krb5_parse_name_flags, + krb5_parse_nametype, krb5_princ_set_realm, krb5_principal_compare, + krb5_principal_compare_any_realm, krb5_principal_get_comp_string, + krb5_principal_get_realm, krb5_principal_get_type, krb5_principal_match, + krb5_principal_set_type, krb5_realm_compare, krb5_sname_to_principal, + krb5_sock_to_principal, krb5_unparse_name, krb5_unparse_name_flags, + krb5_unparse_name_fixed, krb5_unparse_name_fixed_flags, + krb5_unparse_name_fixed_short, krb5_unparse_name_short -- Kerberos 5 + principal handling functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_principal; + + void + krb5_free_principal(krb5_context context, krb5_principal principal); + + krb5_error_code + krb5_parse_name(krb5_context context, const char *name, + krb5_principal *principal); + + krb5_error_code + krb5_parse_name_flags(krb5_context context, const char *name, int flags, + krb5_principal *principal); + + krb5_error_code + krb5_unparse_name(krb5_context context, krb5_const_principal principal, + char **name); + + krb5_error_code + krb5_unparse_name_flags(krb5_context context, + krb5_const_principal principal, int flags, char **name); + + krb5_error_code + krb5_unparse_name_fixed(krb5_context context, + krb5_const_principal principal, char *name, size_t len); + + krb5_error_code + krb5_unparse_name_fixed_flags(krb5_context context, + krb5_const_principal principal, int flags, char *name, size_t len); + + krb5_error_code + krb5_unparse_name_short(krb5_context context, + krb5_const_principal principal, char **name); + + krb5_error_code + krb5_unparse_name_fixed_short(krb5_context context, + krb5_const_principal principal, char *name, size_t len); + + void + krb5_princ_set_realm(krb5_context context, krb5_principal principal, + krb5_realm *realm); + + krb5_error_code + krb5_build_principal(krb5_context context, krb5_principal *principal, + int rlen, krb5_const_realm realm, ...); + + krb5_error_code + krb5_build_principal_va(krb5_context context, krb5_principal *principal, + int rlen, krb5_const_realm realm, va_list ap); + + krb5_error_code + krb5_build_principal_ext(krb5_context context, krb5_principal *principal, + int rlen, krb5_const_realm realm, ...); + + krb5_error_code + krb5_build_principal_va_ext(krb5_context context, + krb5_principal *principal, int rlen, krb5_const_realm realm, + va_list ap); + + krb5_error_code + krb5_make_principal(krb5_context context, krb5_principal *principal, + krb5_const_realm realm, ...); + + krb5_error_code + krb5_copy_principal(krb5_context context, krb5_const_principal inprinc, + krb5_principal *outprinc); + + krb5_boolean + krb5_principal_compare(krb5_context context, krb5_const_principal princ1, + krb5_const_principal princ2); + + krb5_boolean + krb5_principal_compare_any_realm(krb5_context context, + krb5_const_principal princ1, krb5_const_principal princ2); + + const char * + krb5_principal_get_comp_string(krb5_context context, + krb5_const_principal principal, unsigned int component); + + const char * + krb5_principal_get_realm(krb5_context context, + krb5_const_principal principal); + + int + krb5_principal_get_type(krb5_context context, + krb5_const_principal principal); + + krb5_boolean + krb5_principal_match(krb5_context context, + krb5_const_principal principal, krb5_const_principal pattern); + + void + krb5_principal_set_type(krb5_context context, krb5_principal principal, + int type); + + krb5_boolean + krb5_realm_compare(krb5_context context, krb5_const_principal princ1, + krb5_const_principal princ2); + + krb5_error_code + krb5_sname_to_principal(krb5_context context, const char *hostname, + const char *sname, int32_t type, krb5_principal *ret_princ); + + krb5_error_code + krb5_sock_to_principal(krb5_context context, int socket, + const char *sname, int32_t type, krb5_principal *principal); + + krb5_error_code + krb5_get_default_principal(krb5_context context, krb5_principal *princ); + + krb5_error_code + krb5_parse_nametype(krb5_context context, const char *str, + int32_t *type); + +DESCRIPTION + krb5_principal holds the name of a user or service in Kerberos. + + A principal has two parts, a PrincipalName and a realm. The Principal- + Name consists of one or more components. In printed form, the components + are separated by /. The PrincipalName also has a name-type. + + Examples of a principal are nisse/root@EXAMPLE.COM and + host/datan.kth.se@KTH.SE. krb5_parse_name() and krb5_parse_name_flags() + passes a principal name in name to the kerberos principal structure. + krb5_parse_name_flags() takes an extra flags argument the following flags + can be passed in + + KRB5_PRINCIPAL_PARSE_NO_REALM + requires the input string to be without a realm, and no realm is + stored in the principal return argument. + + KRB5_PRINCIPAL_PARSE_REQUIRE_REALM + requires the input string to with a realm. + + krb5_unparse_name() and krb5_unparse_name_flags() prints the principal + princ to the string name. name should be freed with free(3). To the + flags argument the following flags can be passed in + + KRB5_PRINCIPAL_UNPARSE_SHORT + no realm if the realm is one of the local realms. + + KRB5_PRINCIPAL_UNPARSE_NO_REALM + never include any realm in the principal name. + + KRB5_PRINCIPAL_UNPARSE_DISPLAY + don't quote + On failure name is set to NULL. krb5_unparse_name_fixed() and + krb5_unparse_name_fixed_flags() behaves just like krb5_unparse(), but in- + stead unparses the principal into a fixed size buffer. + + krb5_unparse_name_short() just returns the principal without the realm if + the principal is in the default realm. If the principal isn't, the full + name is returned. krb5_unparse_name_fixed_short() works just like + krb5_unparse_name_short() but on a fixed size buffer. + + krb5_build_principal() builds a principal from the realm realm that has + the length rlen. The following arguments form the components of the + principal. The list of components is terminated with NULL. + + krb5_build_principal_va() works like krb5_build_principal() using vargs. + + krb5_build_principal_ext() and krb5_build_principal_va_ext() take a list + of length-value pairs, the list is terminated with a zero length. + + krb5_make_principal() works the same way as krb5_build_principal(), ex- + cept it figures out the length of the realm itself. + + krb5_copy_principal() makes a copy of a principal. The copy needs to be + freed with krb5_free_principal(). + + krb5_principal_compare() compares the two principals, including realm of + the principals and returns TRUE if they are the same and FALSE if not. + + krb5_principal_compare_any_realm() works the same way as + krb5_principal_compare() but doesn't compare the realm component of the + principal. + + krb5_realm_compare() compares the realms of the two principals and re- + turns TRUE is they are the same, and FALSE if not. + + krb5_principal_match() matches a principal against a pattern. The pat- + tern is a globbing expression, where each component (separated by /) is + matched against the corresponding component of the principal. + + The krb5_principal_get_realm() and krb5_principal_get_comp_string() func- + tions return parts of the principal, either the realm or a specific com- + ponent. Both functions return string pointers to data inside the princi- + pal, so they are valid only as long as the principal exists. + + The component argument to krb5_principal_get_comp_string() is the index + of the component to return, from zero to the total number of components + minus one. If the index is out of range NULL is returned. + + krb5_principal_get_realm() and krb5_principal_get_comp_string() are re- + placements for krb5_princ_component() and related macros, described as + internal in the MIT API specification. Unlike the macros, these func- + tions return strings, not krb5_data. A reason to return krb5_data was + that it was believed that principal components could contain binary data, + but this belief was unfounded, and it has been decided that principal + components are infact UTF8, so it's safe to use zero terminated strings. + + It's generally not necessary to look at the components of a principal. + + krb5_principal_get_type() and krb5_principal_set_type() get and sets the + name type for a principal. Name type handling is tricky and not often + needed, don't use this unless you know what you do. + + krb5_sname_to_principal() and krb5_sock_to_principal() are for easy cre- + ation of "service" principals that can, for instance, be used to lookup a + key in a keytab. For both functions the sname parameter will be used for + the first component of the created principal. If sname is NULL, "host" + will be used instead. + + krb5_sname_to_principal() will use the passed hostname for the second + component. If type is KRB5_NT_SRV_HST this name will be looked up with + gethostbyname(). If hostname is NULL, the local hostname will be used. + + krb5_sock_to_principal() will use the "sockname" of the passed socket, + which should be a bound AF_INET or AF_INET6 socket. There must be a map- + ping between the address and "sockname". The function may try to resolve + the name in DNS. + + krb5_get_default_principal() tries to find out what's a reasonable de- + fault principal by looking at the environment it is running in. + + krb5_parse_nametype() parses and returns the name type integer value in + type. On failure the function returns an error code and set the error + string. + +SEE ALSO + krb5_config(3), krb5.conf(5) + +BUGS + You can not have a NUL in a component in some of the variable argument + functions above. Until someone can give a good example of where it would + be a good idea to have NUL's in a component, this will not be fixed. + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_rcache.cat3 b/crypto/heimdal/lib/krb5/krb5_rcache.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_rcache.cat3 @@ -0,0 +1,83 @@ +KRB5_RCACHE(3) BSD Library Functions Manual KRB5_RCACHE(3) + +NAME + krb5_rcache, krb5_rc_close, krb5_rc_default, krb5_rc_default_name, + krb5_rc_default_type, krb5_rc_destroy, krb5_rc_expunge, + krb5_rc_get_lifespan, krb5_rc_get_name, krb5_rc_get_type, + krb5_rc_initialize, krb5_rc_recover, krb5_rc_resolve, + krb5_rc_resolve_full, krb5_rc_resolve_type, krb5_rc_store, + krb5_get_server_rcache -- Kerberos 5 replay cache + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + struct krb5_rcache; + + krb5_error_code + krb5_rc_close(krb5_context context, krb5_rcache id); + + krb5_error_code + krb5_rc_default(krb5_context context, krb5_rcache *id); + + const char * + krb5_rc_default_name(krb5_context context); + + const char * + krb5_rc_default_type(krb5_context context); + + krb5_error_code + krb5_rc_destroy(krb5_context context, krb5_rcache id); + + krb5_error_code + krb5_rc_expunge(krb5_context context, krb5_rcache id); + + krb5_error_code + krb5_rc_get_lifespan(krb5_context context, krb5_rcache id, + krb5_deltat *auth_lifespan); + + const char* + krb5_rc_get_name(krb5_context context, krb5_rcache id); + + const char* + krb5_rc_get_type(krb5_context context, krb5_rcache id); + + krb5_error_code + krb5_rc_initialize(krb5_context context, krb5_rcache id, + krb5_deltat auth_lifespan); + + krb5_error_code + krb5_rc_recover(krb5_context context, krb5_rcache id); + + krb5_error_code + krb5_rc_resolve(krb5_context context, krb5_rcache id, const char *name); + + krb5_error_code + krb5_rc_resolve_full(krb5_context context, krb5_rcache *id, + const char *string_name); + + krb5_error_code + krb5_rc_resolve_type(krb5_context context, krb5_rcache *id, + const char *type); + + krb5_error_code + krb5_rc_store(krb5_context context, krb5_rcache id, + krb5_donot_replay *rep); + + krb5_error_code + krb5_get_server_rcache(krb5_context context, const krb5_data *piece, + krb5_rcache *id); + +DESCRIPTION + The krb5_rcache structure holds a storage element that is used for data + manipulation. The structure contains no public accessible elements. + + krb5_rc_initialize() Creates the reply cache id and sets it lifespan to + auth_lifespan. If the cache already exists, the content is destroyed. + +SEE ALSO + krb5(3), krb5_data(3), kerberos(8) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_rd_error.cat3 b/crypto/heimdal/lib/krb5/krb5_rd_error.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_rd_error.cat3 @@ -0,0 +1,51 @@ +KRB5_RD_ERROR(3) BSD Library Functions Manual KRB5_RD_ERROR(3) + +NAME + krb5_rd_error, krb5_free_error, krb5_free_error_contents, + krb5_error_from_rd_error -- parse, free and read error from KRB-ERROR + message + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_rd_error(krb5_context context, const krb5_data *msg, + KRB_ERROR *result); + + void + krb5_free_error(krb5_context context, krb5_error *error); + + void + krb5_free_error_contents(krb5_context context, krb5_error *error); + + krb5_error_code + krb5_error_from_rd_error(krb5_context context, const krb5_error *error, + const krb5_creds *creds); + +DESCRIPTION + Usually applications never needs to parse and understand Kerberos error + messages since higher level functions will parse and push up the error in + the krb5_context. These functions are described for completeness. + + krb5_rd_error() parses and returns the kerboeros error message, the + structure should be freed with krb5_free_error_contents() when the caller + is done with the structure. + + krb5_free_error() frees the content and the memory region holding the + structure iself. + + krb5_free_error_contents() free the content of the KRB-ERROR message. + + krb5_error_from_rd_error() will parse the error message and set the error + buffer in krb5_context to the error string passed back or the matching + error code in the KRB-ERROR message. Caller should pick up the message + with krb5_get_error_string(3) (don't forget to free the returned string + with krb5_free_error_string()). + +SEE ALSO + krb5(3), krb5_set_error_string(3), krb5_get_error_string(3), krb5.conf(5) + +HEIMDAL July 26, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_rd_safe.cat3 b/crypto/heimdal/lib/krb5/krb5_rd_safe.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_rd_safe.cat3 @@ -0,0 +1,34 @@ +KRB5_RD_SAFE(3) BSD Library Functions Manual KRB5_RD_SAFE(3) + +NAME + krb5_rd_safe, krb5_rd_priv -- verifies authenticity of messages + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_rd_priv(krb5_context context, krb5_auth_context auth_context, + const krb5_data *inbuf, krb5_data *outbuf, + krb5_replay_data *outdata); + + krb5_error_code + krb5_rd_safe(krb5_context context, krb5_auth_context auth_context, + const krb5_data *inbuf, krb5_data *outbuf, + krb5_replay_data *outdata); + +DESCRIPTION + krb5_rd_safe() and krb5_rd_priv() parses KRB-SAFE and KRB-PRIV messages + (as generated by krb5_mk_safe(3) and krb5_mk_priv(3)) from inbuf and ver- + ifies its integrity. The user data part of the message in put in outbuf. + The encryption state, including keyblocks and addresses, is taken from + auth_context. If the KRB5_AUTH_CONTEXT_RET_SEQUENCE or + KRB5_AUTH_CONTEXT_RET_TIME flags are set in the auth_context the sequence + number and time are returned in the outdata parameter. + +SEE ALSO + krb5_auth_con_init(3), krb5_mk_priv(3), krb5_mk_safe(3) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_set_default_realm.3 b/crypto/heimdal/lib/krb5/krb5_set_default_realm.3 --- a/crypto/heimdal/lib/krb5/krb5_set_default_realm.3 +++ b/crypto/heimdal/lib/krb5/krb5_set_default_realm.3 @@ -95,7 +95,7 @@ .Fn krb5_get_default_realm returns the first default realm for this host. The realm returned should be freed with -.Fn free . +.Fn krb5_xfree . .Pp .Fn krb5_get_default_realms returns a diff --git a/crypto/heimdal/lib/krb5/krb5_set_default_realm.cat3 b/crypto/heimdal/lib/krb5/krb5_set_default_realm.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_set_default_realm.cat3 @@ -0,0 +1,69 @@ +KRB5_SET_DEFAULT_REAL... BSD Library Functions Manual KRB5_SET_DEFAULT_REAL... + +NAME + krb5_copy_host_realm, krb5_free_host_realm, krb5_get_default_realm, + krb5_get_default_realms, krb5_get_host_realm, krb5_set_default_realm -- + default and host realm read and manipulation routines + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_copy_host_realm(krb5_context context, const krb5_realm *from, + krb5_realm **to); + + krb5_error_code + krb5_free_host_realm(krb5_context context, krb5_realm *realmlist); + + krb5_error_code + krb5_get_default_realm(krb5_context context, krb5_realm *realm); + + krb5_error_code + krb5_get_default_realms(krb5_context context, krb5_realm **realm); + + krb5_error_code + krb5_get_host_realm(krb5_context context, const char *host, + krb5_realm **realms); + + krb5_error_code + krb5_set_default_realm(krb5_context context, const char *realm); + +DESCRIPTION + krb5_copy_host_realm() copies the list of realms from from to to. to + should be freed by the caller using krb5_free_host_realm. + + krb5_free_host_realm() frees all memory allocated by realmlist. + + krb5_get_default_realm() returns the first default realm for this host. + The realm returned should be freed with krb5_xfree(). + + krb5_get_default_realms() returns a NULL terminated list of default + realms for this context. Realms returned by krb5_get_default_realms() + should be freed with krb5_free_host_realm(). + + krb5_get_host_realm() returns a NULL terminated list of realms for host + by looking up the information in the [domain_realm] in krb5.conf or in + DNS. If the mapping in [domain_realm] results in the string dns_locate, + DNS is used to lookup the realm. + + When using DNS to a resolve the domain for the host a.b.c, + krb5_get_host_realm() looks for a TXT resource record named + _kerberos.a.b.c, and if not found, it strips off the first component and + tries a again (_kerberos.b.c) until it reaches the root. + + If there is no configuration or DNS information found, + krb5_get_host_realm() assumes it can use the domain part of the host to + form a realm. Caller must free realmlist with krb5_free_host_realm(). + + krb5_set_default_realm() sets the default realm for the context. If NULL + is used as a realm, the [libdefaults]default_realm stanza in krb5.conf is + used. If there is no such stanza in the configuration file, the + krb5_get_host_realm() function is used to form a default realm. + +SEE ALSO + free(3), krb5.conf(5) + +HEIMDAL April 24, 2005 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_set_password.cat3 b/crypto/heimdal/lib/krb5/krb5_set_password.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_set_password.cat3 @@ -0,0 +1,65 @@ +KRB5_SET_PASSWORD(3) BSD Library Functions Manual KRB5_SET_PASSWORD(3) + +NAME + krb5_change_password, krb5_set_password, krb5_set_password_using_ccache, + krb5_passwd_result_to_string -- change password functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_change_password(krb5_context context, krb5_creds *creds, + char *newpw, int *result_code, krb5_data *result_code_string, + krb5_data *result_string); + + krb5_error_code + krb5_set_password(krb5_context context, krb5_creds *creds, char *newpw, + krb5_principal targprinc, int *result_code, + krb5_data *result_code_string, krb5_data *result_string); + + krb5_error_code + krb5_set_password_using_ccache(krb5_context context, krb5_ccache ccache, + char *newpw, krb5_principal targprinc, int *result_code, + krb5_data *result_code_string, krb5_data *result_string); + + const char * + krb5_passwd_result_to_string(krb5_context context, int result); + +DESCRIPTION + These functions change the password for a given principal. + + krb5_set_password() and krb5_set_password_using_ccache() are the newer of + the three functions, and use a newer version of the protocol (and also + fall back to the older set-password protocol if the newer protocol + doesn't work). + + krb5_change_password() sets the password newpasswd for the client princi- + pal in creds. The server principal of creds must be kadmin/changepw. + + krb5_set_password() and krb5_set_password_using_ccache() change the pass- + word for the principal targprinc. + + krb5_set_password() requires that the credential for + kadmin/changepw@REALM is in creds. If the user caller isn't an adminis- + trator, this credential needs to be an initial credential, see + krb5_get_init_creds(3) how to get such credentials. + + krb5_set_password_using_ccache() will get the credential from ccache. + + If targprinc is NULL, krb5_set_password_using_ccache() uses the the de- + fault principal in ccache and krb5_set_password() uses the global the de- + fault principal. + + All three functions return an error in result_code and maybe an error + string to print in result_string. + + krb5_passwd_result_to_string() returns an human readable string describ- + ing the error code in result_code from the krb5_set_password() functions. + +SEE ALSO + krb5_ccache(3), krb5_init_context(3) + +HEIMDAL July 15, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_string_to_key.cat3 b/crypto/heimdal/lib/krb5/krb5_string_to_key.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_string_to_key.cat3 @@ -0,0 +1,73 @@ +KRB5_STRING_TO_KEY(3) BSD Library Functions Manual KRB5_STRING_TO_KEY(3) + +NAME + krb5_string_to_key, krb5_string_to_key_data, + krb5_string_to_key_data_salt, krb5_string_to_key_data_salt_opaque, + krb5_string_to_key_salt, krb5_string_to_key_salt_opaque, + krb5_get_pw_salt, krb5_free_salt -- turns a string to a Kerberos key + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_string_to_key(krb5_context context, krb5_enctype enctype, + const char *password, krb5_principal principal, krb5_keyblock *key); + + krb5_error_code + krb5_string_to_key_data(krb5_context context, krb5_enctype enctype, + krb5_data password, krb5_principal principal, krb5_keyblock *key); + + krb5_error_code + krb5_string_to_key_data_salt(krb5_context context, krb5_enctype enctype, + krb5_data password, krb5_salt salt, krb5_keyblock *key); + + krb5_error_code + krb5_string_to_key_data_salt_opaque(krb5_context context, + krb5_enctype enctype, krb5_data password, krb5_salt salt, + krb5_data opaque, krb5_keyblock *key); + + krb5_error_code + krb5_string_to_key_salt(krb5_context context, krb5_enctype enctype, + const char *password, krb5_salt salt, krb5_keyblock *key); + + krb5_error_code + krb5_string_to_key_salt_opaque(krb5_context context, + krb5_enctype enctype, const char *password, krb5_salt salt, + krb5_data opaque, krb5_keyblock *key); + + krb5_error_code + krb5_get_pw_salt(krb5_context context, krb5_const_principal principal, + krb5_salt *salt); + + krb5_error_code + krb5_free_salt(krb5_context context, krb5_salt salt); + +DESCRIPTION + The string to key functions convert a string to a kerberos key. + + krb5_string_to_key_data_salt_opaque() is the function that does all the + work, the rest of the functions are just wrappers around + krb5_string_to_key_data_salt_opaque() that calls it with default values. + + krb5_string_to_key_data_salt_opaque() transforms the password with the + given salt-string salt and the opaque, encryption type specific parameter + opaque to a encryption key key according to the string to key function + associated with enctype. + + The key should be freed with krb5_free_keyblock_contents(). + + If one of the functions that doesn't take a krb5_salt as it argument + krb5_get_pw_salt() is used to get the salt value. + + krb5_get_pw_salt() get the default password salt for a principal, use + krb5_free_salt() to free the salt when done. + + krb5_free_salt() frees the content of salt. + +SEE ALSO + krb5(3), krb5_data(3), krb5_keyblock(3), kerberos(8) + +HEIMDAL July 10, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_timeofday.3 b/crypto/heimdal/lib/krb5/krb5_timeofday.3 --- a/crypto/heimdal/lib/krb5/krb5_timeofday.3 +++ b/crypto/heimdal/lib/krb5/krb5_timeofday.3 @@ -33,7 +33,7 @@ .\" .\" $Id$ .\" -.Dd Sepember 16, 2006 +.Dd September 16, 2006 .Dt KRB5_TIMEOFDAY 3 .Os HEIMDAL .Sh NAME diff --git a/crypto/heimdal/lib/krb5/krb5_timeofday.cat3 b/crypto/heimdal/lib/krb5/krb5_timeofday.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_timeofday.cat3 @@ -0,0 +1,54 @@ +KRB5_TIMEOFDAY(3) BSD Library Functions Manual KRB5_TIMEOFDAY(3) + +NAME + krb5_timeofday, krb5_set_real_time, krb5_us_timeofday, krb5_format_time, + krb5_string_to_deltat -- Kerberos 5 time handling functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_timestamp; + + krb5_deltat; + + krb5_error_code + krb5_set_real_time(krb5_context context, krb5_timestamp sec, + int32_t usec); + + krb5_error_code + krb5_timeofday(krb5_context context, krb5_timestamp *timeret); + + krb5_error_code + krb5_us_timeofday(krb5_context context, krb5_timestamp *sec, + int32_t *usec); + + krb5_error_code + krb5_format_time(krb5_context context, time_t t, char *s, size_t len, + krb5_boolean include_time); + + krb5_error_code + krb5_string_to_deltat(const char *string, krb5_deltat *deltat); + +DESCRIPTION + krb5_set_real_time sets the absolute time that the caller knows the KDC + has. With this the Kerberos library can calculate the relative differ- + ence between the KDC time and the local system time and store it in the + context. With this information the Kerberos library can adjust all time + stamps in Kerberos packages. + + krb5_timeofday() returns the current time, but adjusted with the time + difference between the local host and the KDC. krb5_us_timeofday() also + returns microseconds. + + krb5_format_time formats the time t into the string s of length len. If + include_time is set, the time is set include_time. + + krb5_string_to_deltat parses delta time string into deltat. + +SEE ALSO + gettimeofday(2), krb5(3) + +HEIMDAL September 16, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_verify_init_creds.cat3 b/crypto/heimdal/lib/krb5/krb5_verify_init_creds.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_verify_init_creds.cat3 @@ -0,0 +1,51 @@ +KRB5_VERIFY_INIT_CRED... BSD Library Functions Manual KRB5_VERIFY_INIT_CRED... + +NAME + krb5_verify_init_creds_opt_init, + krb5_verify_init_creds_opt_set_ap_req_nofail, krb5_verify_init_creds -- + verifies a credential cache is correct by using a local keytab + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + struct krb5_verify_init_creds_opt; + + void + krb5_verify_init_creds_opt_init(krb5_verify_init_creds_opt *options); + + void + krb5_verify_init_creds_opt_set_ap_req_nofail(krb5_verify_init_creds_opt *options, + int ap_req_nofail); + + krb5_error_code + krb5_verify_init_creds(krb5_context context, krb5_creds *creds, + krb5_principal ap_req_server, krb5_ccache *ccache, + krb5_verify_init_creds_opt *options); + +DESCRIPTION + The krb5_verify_init_creds function verifies the initial tickets with the + local keytab to make sure the response of the KDC was spoof-ed. + + krb5_verify_init_creds will use principal ap_req_server from the local + keytab, if NULL is passed in, the code will guess the local hostname and + use that to form host/hostname/GUESSED-REALM-FOR-HOSTNAME. creds is the + credential that krb5_verify_init_creds should verify. If ccache is given + krb5_verify_init_creds() stores all credentials it fetched from the KDC + there, otherwise it will use a memory credential cache that is destroyed + when done. + + krb5_verify_init_creds_opt_init() cleans the the structure, must be used + before trying to pass it in to krb5_verify_init_creds(). + + krb5_verify_init_creds_opt_set_ap_req_nofail() controls controls the be- + havior if ap_req_server doesn't exists in the local keytab or in the + KDC's database, if it's true, the error will be ignored. Note that this + use is possible insecure. + +SEE ALSO + krb5(3), krb5_get_init_creds(3), krb5_verify_user(3), krb5.conf(5) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krb5_verify_user.cat3 b/crypto/heimdal/lib/krb5/krb5_verify_user.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/krb5_verify_user.cat3 @@ -0,0 +1,140 @@ +KRB5_VERIFY_USER(3) BSD Library Functions Manual KRB5_VERIFY_USER(3) + +NAME + krb5_verify_user, krb5_verify_user_lrealm, krb5_verify_user_opt, + krb5_verify_opt_init, krb5_verify_opt_alloc, krb5_verify_opt_free, + krb5_verify_opt_set_ccache, krb5_verify_opt_set_flags, + krb5_verify_opt_set_service, krb5_verify_opt_set_secure, + krb5_verify_opt_set_keytab -- Heimdal password verifying functions + +LIBRARY + Kerberos 5 Library (libkrb5, -lkrb5) + +SYNOPSIS + #include  + + krb5_error_code + krb5_verify_user(krb5_context context, krb5_principal principal, + krb5_ccache ccache, const char *password, krb5_boolean secure, + const char *service); + + krb5_error_code + krb5_verify_user_lrealm(krb5_context context, krb5_principal principal, + krb5_ccache ccache, const char *password, krb5_boolean secure, + const char *service); + + void + krb5_verify_opt_init(krb5_verify_opt *opt); + + void + krb5_verify_opt_alloc(krb5_verify_opt **opt); + + void + krb5_verify_opt_free(krb5_verify_opt *opt); + + void + krb5_verify_opt_set_ccache(krb5_verify_opt *opt, krb5_ccache ccache); + + void + krb5_verify_opt_set_keytab(krb5_verify_opt *opt, krb5_keytab keytab); + + void + krb5_verify_opt_set_secure(krb5_verify_opt *opt, krb5_boolean secure); + + void + krb5_verify_opt_set_service(krb5_verify_opt *opt, const char *service); + + void + krb5_verify_opt_set_flags(krb5_verify_opt *opt, unsigned int flags); + + krb5_error_code + krb5_verify_user_opt(krb5_context context, krb5_principal principal, + const char *password, krb5_verify_opt *opt); + +DESCRIPTION + The krb5_verify_user function verifies the password supplied by a user. + The principal whose password will be verified is specified in principal. + New tickets will be obtained as a side-effect and stored in ccache (if + NULL, the default ccache is used). krb5_verify_user() will call + krb5_cc_initialize() on the given ccache, so ccache must only initialized + with krb5_cc_resolve() or krb5_cc_gen_new(). If the password is not sup- + plied in password (and is given as NULL) the user will be prompted for + it. If secure the ticket will be verified against the locally stored + service key service (by default `host' if given as NULL ). + + The krb5_verify_user_lrealm() function does the same, except that it ig- + nores the realm in principal and tries all the local realms (see + krb5.conf(5)). After a successful return, the principal is set to the + authenticated realm. If the call fails, the principal will not be mean- + ingful, and should only be freed with krb5_free_principal(3). + + krb5_verify_opt_alloc() and krb5_verify_opt_free() allocates and frees a + krb5_verify_opt. You should use the the alloc and free function instead + of allocation the structure yourself, this is because in a future release + the structure wont be exported. + + krb5_verify_opt_init() resets all opt to default values. + + None of the krb5_verify_opt_set function makes a copy of the data struc- + ture that they are called with. It's up the caller to free them after the + krb5_verify_user_opt() is called. + + krb5_verify_opt_set_ccache() sets the ccache that user of opt will use. + If not set, the default credential cache will be used. + + krb5_verify_opt_set_keytab() sets the keytab that user of opt will use. + If not set, the default keytab will be used. + + krb5_verify_opt_set_secure() if secure if true, the password verification + will require that the ticket will be verified against the locally stored + service key. If not set, default value is true. + + krb5_verify_opt_set_service() sets the service principal that user of opt + will use. If not set, the `host' service will be used. + + krb5_verify_opt_set_flags() sets flags that user of opt will use. If the + flag KRB5_VERIFY_LREALMS is used, the principal will be modified like + krb5_verify_user_lrealm() modifies it. + + krb5_verify_user_opt() function verifies the password supplied by a user. + The principal whose password will be verified is specified in principal. + Options the to the verification process is pass in in opt. + +EXAMPLES + Here is a example program that verifies a password. it uses the + `host/`hostname`' service principal in krb5.keytab. + + #include + + int + main(int argc, char **argv) + { + char *user; + krb5_error_code error; + krb5_principal princ; + krb5_context context; + + if (argc != 2) + errx(1, "usage: verify_passwd "); + + user = argv[1]; + + if (krb5_init_context(&context) < 0) + errx(1, "krb5_init_context"); + + if ((error = krb5_parse_name(context, user, &princ)) != 0) + krb5_err(context, 1, error, "krb5_parse_name"); + + error = krb5_verify_user(context, princ, NULL, NULL, TRUE, NULL); + if (error) + krb5_err(context, 1, error, "krb5_verify_user"); + + return 0; + } + +SEE ALSO + krb5_cc_gen_new(3), krb5_cc_initialize(3), krb5_cc_resolve(3), + krb5_err(3), krb5_free_principal(3), krb5_init_context(3), + krb5_kt_default(3), krb5.conf(5) + +HEIMDAL May 1, 2006 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/krbhst.c b/crypto/heimdal/lib/krb5/krbhst.c --- a/crypto/heimdal/lib/krb5/krbhst.c +++ b/crypto/heimdal/lib/krb5/krbhst.c @@ -3,6 +3,8 @@ * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -47,6 +49,14 @@ return -1; } +static int +is_invalid_tld_srv_target(const char *target) +{ + return (strncmp("your-dns-needs-immediate-attention.", + target, 35) == 0 + && strchr(&target[35], '.') == NULL); +} + /* * set `res' and `count' to the result of looking up SRV RR in DNS for * `proto', `proto', `realm' using `dns_type'. @@ -105,26 +115,38 @@ *res = malloc(num_srv * sizeof(**res)); if(*res == NULL) { rk_dns_free_data(r); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } rk_dns_srv_order(r); for(num_srv = 0, rr = r->head; rr; rr = rr->next) if(rr->type == rk_ns_t_srv) { - krb5_krbhst_info *hi; - size_t len = strlen(rr->u.srv->target); - - hi = calloc(1, sizeof(*hi) + len); + krb5_krbhst_info *hi = NULL; + size_t len; + int invalid_tld = 1; + + /* Test for top-level domain controlled interruptions */ + if (!is_invalid_tld_srv_target(rr->u.srv->target)) { + invalid_tld = 0; + len = strlen(rr->u.srv->target); + hi = calloc(1, sizeof(*hi) + len); + } if(hi == NULL) { rk_dns_free_data(r); while(--num_srv >= 0) free((*res)[num_srv]); free(*res); *res = NULL; - return ENOMEM; + if (invalid_tld) { + krb5_warnx(context, + "Domain lookup failed: " + "Realm %s needs immediate attention " + "see https://icann.org/namecollision", + realm); + return KRB5_KDC_UNREACH; + } + return krb5_enomem(context); } (*res)[num_srv++] = hi; @@ -159,9 +181,11 @@ #define KD_CONFIG_EXISTS 32 #define KD_LARGE_MSG 64 #define KD_PLUGIN 128 +#define KD_HOSTNAMES 256 krb5_error_code (*get_next)(krb5_context, struct krb5_krbhst_data *, krb5_krbhst_info**); + char *hostname; unsigned int fallback_count; struct krb5_krbhst_info *hosts, **index, **end; @@ -185,11 +209,17 @@ return KRB5_KRBHST_UDP; } +static int +krbhst_get_default_port(struct krb5_krbhst_data *kd) +{ + return kd->def_port; +} + /* * */ -const char * +KRB5_LIB_FUNCTION const char * KRB5_LIB_CALL _krb5_krbhst_get_realm(krb5_krbhst_handle handle) { return handle->realm; @@ -224,6 +254,7 @@ hi->proto = KRB5_KRBHST_TCP; p += 4; } else if(strncmp(p, "udp/", 4) == 0) { + hi->proto = KRB5_KRBHST_UDP; p += 4; } @@ -259,7 +290,7 @@ return hi; } -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_free_krbhst_info(krb5_krbhst_info *hi) { if (hi->ai != NULL) @@ -267,7 +298,7 @@ free(hi); } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_krbhost_info_move(krb5_context context, krb5_krbhst_info *from, krb5_krbhst_info **to) @@ -275,11 +306,8 @@ size_t hostnamelen = strlen(from->hostname); /* trailing NUL is included in structure */ *to = calloc(1, sizeof(**to) + hostnamelen); - if(*to == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*to == NULL) + return krb5_enomem(context); (*to)->proto = from->proto; (*to)->port = from->port; @@ -316,7 +344,7 @@ hi = parse_hostspec(context, kd, host, def_port, port); if(hi == NULL) - return ENOMEM; + return krb5_enomem(context); append_host_hostinfo(kd, hi); return 0; @@ -381,39 +409,11 @@ if (host->ai == NULL) { struct addrinfo hints; char portstr[NI_MAXSERV]; - char *hostname = host->hostname; snprintf (portstr, sizeof(portstr), "%d", host->port); make_hints(&hints, host->proto); - /** - * First try this as an IP address, this allows us to add a - * dot at the end to stop using the search domains. - */ - - hints.ai_flags |= AI_NUMERICHOST | AI_NUMERICSERV; - ret = getaddrinfo(host->hostname, portstr, &hints, &host->ai); - if (ret == 0) - goto out; - - /** - * If the hostname contains a dot, assumes it's a FQDN and - * don't use search domains since that might be painfully slow - * when machine is disconnected from that network. - */ - - hints.ai_flags &= ~(AI_NUMERICHOST); - - if (strchr(hostname, '.') && hostname[strlen(hostname) - 1] != '.') { - ret = asprintf(&hostname, "%s.", host->hostname); - if (ret < 0 || hostname == NULL) - return ENOMEM; - } - - ret = getaddrinfo(hostname, portstr, &hints, &host->ai); - if (hostname != host->hostname) - free(hostname); if (ret) { ret = krb5_eai_to_heim_errno(ret, errno); goto out; @@ -444,6 +444,9 @@ krb5_krbhst_info **res; int count, i; + if (krb5_realm_is_lkdc(kd->realm)) + return; + ret = srv_find_realm(context, &res, &count, kd->realm, "SRV", proto, service, kd->port); _krb5_debug(context, 2, "searching DNS for realm %s %s.%s -> %d", @@ -498,14 +501,23 @@ struct addrinfo hints; char portstr[NI_MAXSERV]; + ret = krb5_config_get_bool_default(context, NULL, KRB5_FALLBACK_DEFAULT, + "libdefaults", "use_fallback", NULL); + if (!ret) { + kd->flags |= KD_FALLBACK; + return 0; + } + _krb5_debug(context, 2, "fallback lookup %d for realm %s (service %s)", kd->fallback_count, kd->realm, serv_string); /* * Don't try forever in case the DNS server keep returning us * entries (like wildcard entries or the .nu TLD) + * + * Also don't try LKDC realms since fallback wont work on them at all. */ - if(kd->fallback_count >= 5) { + if(kd->fallback_count >= 5 || krb5_realm_is_lkdc(kd->realm)) { kd->flags |= KD_FALLBACK; return 0; } @@ -517,7 +529,7 @@ serv_string, kd->fallback_count, kd->realm); if (ret < 0 || host == NULL) - return ENOMEM; + return krb5_enomem(context); make_hints(&hints, proto); snprintf(portstr, sizeof(portstr), "%d", port); @@ -528,12 +540,26 @@ kd->flags |= KD_FALLBACK; } else { struct krb5_krbhst_info *hi; - size_t hostlen = strlen(host); + size_t hostlen; + + /* Check for ICANN gTLD Name Collision address (127.0.53.53) */ + if (ai->ai_family == AF_INET) { + struct sockaddr_in *sin = (struct sockaddr_in *)ai->ai_addr; + if (sin->sin_addr.s_addr == htonl(0x7f003535)) { + krb5_warnx(context, + "Fallback lookup failed: " + "Realm %s needs immediate attention " + "see https://icann.org/namecollision", + kd->realm); + return KRB5_KDC_UNREACH; + } + } + hostlen = strlen(host); hi = calloc(1, sizeof(*hi) + hostlen); if(hi == NULL) { free(host); - return ENOMEM; + return krb5_enomem(context); } hi->proto = proto; @@ -553,24 +579,18 @@ */ static krb5_error_code -add_locate(void *ctx, int type, struct sockaddr *addr) +add_plugin_host(struct krb5_krbhst_data *kd, + const char *host, + const char *port, + int portnum, + int proto) { struct krb5_krbhst_info *hi; - struct krb5_krbhst_data *kd = ctx; - char host[NI_MAXHOST], port[NI_MAXSERV]; struct addrinfo hints, *ai; - socklen_t socklen; size_t hostlen; int ret; - socklen = socket_sockaddr_size(addr); - - ret = getnameinfo(addr, socklen, host, sizeof(host), port, sizeof(port), - NI_NUMERICHOST|NI_NUMERICSERV); - if (ret != 0) - return 0; - - make_hints(&hints, krbhst_get_default_proto(kd)); + make_hints(&hints, proto); ret = getaddrinfo(host, port, &hints, &ai); if (ret) return 0; @@ -578,11 +598,13 @@ hostlen = strlen(host); hi = calloc(1, sizeof(*hi) + hostlen); - if(hi == NULL) + if (hi == NULL) { + freeaddrinfo(ai); return ENOMEM; + } - hi->proto = krbhst_get_default_proto(kd); - hi->port = hi->def_port = socket_get_port(addr); + hi->proto = proto; + hi->port = hi->def_port = portnum; hi->ai = ai; memmove(hi->hostname, host, hostlen); hi->hostname[hostlen] = '\0'; @@ -591,44 +613,103 @@ return 0; } +static krb5_error_code +add_locate(void *ctx, int type, struct sockaddr *addr) +{ + struct krb5_krbhst_data *kd = ctx; + char host[NI_MAXHOST], port[NI_MAXSERV]; + socklen_t socklen; + krb5_error_code ret; + int proto, portnum; + + socklen = socket_sockaddr_size(addr); + portnum = socket_get_port(addr); + + ret = getnameinfo(addr, socklen, host, sizeof(host), port, sizeof(port), + NI_NUMERICHOST|NI_NUMERICSERV); + if (ret != 0) + return 0; + + if (kd->port) + snprintf(port, sizeof(port), "%d", kd->port); + else if (atoi(port) == 0) + snprintf(port, sizeof(port), "%d", krbhst_get_default_port(kd)); + + proto = krbhst_get_default_proto(kd); + + ret = add_plugin_host(kd, host, port, portnum, proto); + if (ret) + return ret; + + /* + * This is really kind of broken and should be solved a different + * way, some sites block UDP, and we don't, in the general case, + * fall back to TCP, that should also be done. But since that + * should require us to invert the whole "find kdc" stack, let put + * this in for now. + */ + + if (proto == KRB5_KRBHST_UDP) { + ret = add_plugin_host(kd, host, port, portnum, KRB5_KRBHST_TCP); + if (ret) + return ret; + } + + return 0; +} + +struct plctx { + enum locate_service_type type; + struct krb5_krbhst_data *kd; + unsigned long flags; +}; + +static KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +plcallback(krb5_context context, + const void *plug, void *plugctx, void *userctx) +{ + const krb5plugin_service_locate_ftable *locate = plug; + struct plctx *plctx = userctx; + + if (locate->minor_version >= KRB5_PLUGIN_LOCATE_VERSION_2) + return locate->lookup(plugctx, plctx->flags, plctx->type, plctx->kd->realm, 0, 0, add_locate, plctx->kd); + + if (plctx->flags & KRB5_PLF_ALLOW_HOMEDIR) + return locate->old_lookup(plugctx, plctx->type, plctx->kd->realm, 0, 0, add_locate, plctx->kd); + + return KRB5_PLUGIN_NO_HANDLE; +} + static void plugin_get_hosts(krb5_context context, struct krb5_krbhst_data *kd, enum locate_service_type type) { - struct krb5_plugin *list = NULL, *e; - krb5_error_code ret; + struct plctx ctx = { type, kd, 0 }; - ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, - KRB5_PLUGIN_LOCATE, &list); - if(ret != 0 || list == NULL) - return; + if (_krb5_homedir_access(context)) + ctx.flags |= KRB5_PLF_ALLOW_HOMEDIR; - for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { - krb5plugin_service_locate_ftable *service; - void *ctx; - - service = _krb5_plugin_get_symbol(e); - if (service->minor_version != 0) - continue; - - (*service->init)(context, &ctx); - ret = (*service->lookup)(ctx, type, kd->realm, 0, 0, add_locate, kd); - (*service->fini)(ctx); - if (ret && ret != KRB5_PLUGIN_NO_HANDLE) { - krb5_set_error_message(context, ret, - N_("Locate plugin failed to lookup realm %s: %d", ""), - kd->realm, ret); - break; - } else if (ret == 0) { - _krb5_debug(context, 2, "plugin found result for realm %s", kd->realm); - kd->flags |= KD_CONFIG_EXISTS; - } + _krb5_plugin_run_f(context, "krb5", KRB5_PLUGIN_LOCATE, + KRB5_PLUGIN_LOCATE_VERSION_0, + 0, &ctx, plcallback); +} - } - _krb5_plugin_free(list); +/* + * + */ + +static void +hostnames_get_hosts(krb5_context context, + struct krb5_krbhst_data *kd, + const char *type) +{ + kd->flags |= KD_HOSTNAMES; + if (kd->hostname) + append_host_string(context, kd, kd->hostname, kd->def_port, kd->port); } + /* * */ @@ -640,6 +721,12 @@ { krb5_error_code ret; + if ((kd->flags & KD_HOSTNAMES) == 0) { + hostnames_get_hosts(context, kd, "kdc"); + if(get_next(kd, host)) + return 0; + } + if ((kd->flags & KD_PLUGIN) == 0) { plugin_get_hosts(context, kd, locate_service_kdc); kd->flags |= KD_PLUGIN; @@ -812,60 +899,20 @@ return KRB5_KDC_UNREACH; } -static krb5_error_code -krb524_get_next(krb5_context context, - struct krb5_krbhst_data *kd, - krb5_krbhst_info **host) +static void +krbhost_dealloc(void *ptr) { - if ((kd->flags & KD_PLUGIN) == 0) { - plugin_get_hosts(context, kd, locate_service_krb524); - kd->flags |= KD_PLUGIN; - if(get_next(kd, host)) - return 0; - } - - if((kd->flags & KD_CONFIG) == 0) { - config_get_hosts(context, kd, "krb524_server"); - if(get_next(kd, host)) - return 0; - kd->flags |= KD_CONFIG; - } - - if (kd->flags & KD_CONFIG_EXISTS) { - _krb5_debug(context, 1, - "Configuration exists for realm %s, wont go to DNS", - kd->realm); - return KRB5_KDC_UNREACH; - } - - if(context->srv_lookup) { - if((kd->flags & KD_SRV_UDP) == 0) { - srv_get_hosts(context, kd, "udp", "krb524"); - kd->flags |= KD_SRV_UDP; - if(get_next(kd, host)) - return 0; - } - - if((kd->flags & KD_SRV_TCP) == 0) { - srv_get_hosts(context, kd, "tcp", "krb524"); - kd->flags |= KD_SRV_TCP; - if(get_next(kd, host)) - return 0; - } - } - - /* no matches -> try kdc */ + struct krb5_krbhst_data *handle = (struct krb5_krbhst_data *)ptr; + krb5_krbhst_info *h, *next; - if (krbhst_empty(kd)) { - kd->flags = 0; - kd->port = kd->def_port; - kd->get_next = kdc_get_next; - return (*kd->get_next)(context, kd, host); + for (h = handle->hosts; h != NULL; h = next) { + next = h->next; + _krb5_free_krbhst_info(h); } + if (handle->hostname) + free(handle->hostname); - _krb5_debug(context, 0, "No kpasswd entries found for realm %s", kd->realm); - - return KRB5_KDC_UNREACH; + free(handle->realm); } static struct krb5_krbhst_data* @@ -876,11 +923,11 @@ { struct krb5_krbhst_data *kd; - if((kd = calloc(1, sizeof(*kd))) == NULL) + if ((kd = heim_alloc(sizeof(*kd), "krbhst-context", krbhost_dealloc)) == NULL) return NULL; if((kd->realm = strdup(realm)) == NULL) { - free(kd); + heim_release(kd); return NULL; } @@ -923,6 +970,8 @@ int def_port; const char *service; + *handle = NULL; + switch(type) { case KRB5_KRBHST_KDC: next = kdc_get_next; @@ -941,11 +990,6 @@ KPASSWD_PORT)); service = "change_password"; break; - case KRB5_KRBHST_KRB524: - next = krb524_get_next; - def_port = ntohs(krb5_getportbyname (context, "krb524", "udp", 4444)); - service = "524"; - break; default: krb5_set_error_message(context, ENOTTY, N_("unknown krbhst type (%u)", ""), type); @@ -993,6 +1037,22 @@ return krb5_krbhst_format_string(context, host, hostname, hostlen); } +/* + * + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_krbhst_set_hostname(krb5_context context, + krb5_krbhst_handle handle, + const char *hostname) +{ + if (handle->hostname) + free(handle->hostname); + handle->hostname = strdup(hostname); + if (handle->hostname == NULL) + return ENOMEM; + return 0; +} KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_krbhst_reset(krb5_context context, krb5_krbhst_handle handle) @@ -1003,20 +1063,11 @@ KRB5_LIB_FUNCTION void KRB5_LIB_CALL krb5_krbhst_free(krb5_context context, krb5_krbhst_handle handle) { - krb5_krbhst_info *h, *next; - - if (handle == NULL) - return; - - for (h = handle->hosts; h != NULL; h = next) { - next = h->next; - _krb5_free_krbhst_info(h); - } - - free(handle->realm); - free(handle); + heim_release(handle); } +#ifndef HEIMDAL_SMALLER + /* backwards compatibility ahead */ static krb5_error_code @@ -1043,7 +1094,7 @@ *hostlist = calloc(nhost + 1, sizeof(**hostlist)); if(*hostlist == NULL) { krb5_krbhst_free(context, handle); - return ENOMEM; + return krb5_enomem(context); } krb5_krbhst_reset(context, handle); @@ -1053,7 +1104,7 @@ if(((*hostlist)[nhost++] = strdup(host)) == NULL) { krb5_free_krbhst(context, *hostlist); krb5_krbhst_free(context, handle); - return ENOMEM; + return krb5_enomem(context); } } (*hostlist)[nhost] = NULL; @@ -1097,7 +1148,6 @@ return gethostlist(context, *realm, KRB5_KRBHST_KRB524, hostlist); } - /* * return an malloced list of KDC's for `realm' in `hostlist' */ @@ -1125,3 +1175,5 @@ free (hostlist); return 0; } + +#endif /* HEIMDAL_SMALLER */ diff --git a/crypto/heimdal/lib/krb5/kuserok.c b/crypto/heimdal/lib/krb5/kuserok.c --- a/crypto/heimdal/lib/krb5/kuserok.c +++ b/crypto/heimdal/lib/krb5/kuserok.c @@ -32,9 +32,230 @@ */ #include "krb5_locl.h" +#include "kuserok_plugin.h" #include -#ifndef _WIN32 +#ifndef SYSTEM_K5LOGIN_DIR +/* + * System k5login location. File namess in this directory are expected + * to be usernames and to contain a list of principals allowed to login + * as the user named the same as the file. + */ +#define SYSTEM_K5LOGIN_DIR SYSCONFDIR "/k5login.d" +#endif + +/* Plugin framework bits */ + +struct plctx { + const char *rule; + const char *k5login_dir; + const char *luser; + krb5_const_principal principal; + unsigned int flags; + krb5_boolean result; +}; + +static krb5_error_code KRB5_LIB_CALL +plcallback(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + const krb5plugin_kuserok_ftable *locate = plug; + struct plctx *plctx = userctx; + + return locate->kuserok(plugctx, context, plctx->rule, plctx->flags, + plctx->k5login_dir, plctx->luser, plctx->principal, + &plctx->result); +} + +static krb5_error_code plugin_reg_ret; +static krb5plugin_kuserok_ftable kuserok_simple_plug; +static krb5plugin_kuserok_ftable kuserok_sys_k5login_plug; +static krb5plugin_kuserok_ftable kuserok_user_k5login_plug; +static krb5plugin_kuserok_ftable kuserok_deny_plug; + +static void +reg_def_plugins_once(void *ctx) +{ + krb5_error_code ret; + krb5_context context = ctx; + + plugin_reg_ret = krb5_plugin_register(context, PLUGIN_TYPE_DATA, + KRB5_PLUGIN_KUSEROK, + &kuserok_simple_plug); + ret = krb5_plugin_register(context, PLUGIN_TYPE_DATA, + KRB5_PLUGIN_KUSEROK, &kuserok_sys_k5login_plug); + if (!plugin_reg_ret) + plugin_reg_ret = ret; + ret = krb5_plugin_register(context, PLUGIN_TYPE_DATA, + KRB5_PLUGIN_KUSEROK, &kuserok_user_k5login_plug); + if (!plugin_reg_ret) + plugin_reg_ret = ret; + ret = krb5_plugin_register(context, PLUGIN_TYPE_DATA, + KRB5_PLUGIN_KUSEROK, &kuserok_deny_plug); + if (!plugin_reg_ret) + plugin_reg_ret = ret; +} + +/** + * This function is designed to be portable for Win32 and POSIX. The + * design does lead to multiple getpwnam_r() calls, but this is probably + * not a big deal. + * + * Inputs: + * + * @param context A krb5_context + * @param filename Name of item to introspection + * @param is_system_location TRUE if the dir/file are system locations or + * FALSE if they are user home directory locations + * @param dir Directory (optional) + * @param dirlstat A pointer to struct stat for the directory (optional) + * @param file File (optional) + * @param owner Name of user that is expected to own the file + */ + +static krb5_error_code +check_owner_dir(krb5_context context, + const char *filename, + krb5_boolean is_system_location, + DIR *dir, + struct stat *dirlstat, + const char *owner) +{ +#ifdef _WIN32 + /* + * XXX Implement this! + * + * The thing to do is to call _get_osfhandle() on fileno(file) and + * dirfd(dir) to get HANDLEs to the same, then call + * GetSecurityInfo() on those HANDLEs to get the security descriptor + * (SD), then check the owner and DACL. Checking the DACL sounds + * like a lot of work (what, derive a mode from the ACL the way + * NFSv4 servers do?). Checking the owner means doing an LSARPC + * lookup at least (to get the user's SID). + */ + if (is_system_location || owner == NULL) + return 0; + krb5_set_error_message(context, EACCES, + "User k5login files not supported on Windows"); + return EACCES; +#else + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; + struct stat st; + + heim_assert(owner != NULL, "no directory owner ?"); + + if (rk_getpwnam_r(owner, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) { + krb5_set_error_message(context, errno, + "User unknown %s (getpwnam_r())", owner); + return EACCES; + } + if (pwd == NULL) { + krb5_set_error_message(context, EACCES, "no user %s", owner); + return EACCES; + } + + if (fstat(dirfd(dir), &st) == -1) { + krb5_set_error_message(context, EACCES, + "fstat(%s) of k5login.d failed", + filename); + return EACCES; + } + if (!S_ISDIR(st.st_mode)) { + krb5_set_error_message(context, ENOTDIR, "%s not a directory", + filename); + return ENOTDIR; + } + if (st.st_dev != dirlstat->st_dev || st.st_ino != dirlstat->st_ino) { + krb5_set_error_message(context, EACCES, + "%s was renamed during kuserok " + "operation", filename); + return EACCES; + } + if ((st.st_mode & (S_IWGRP | S_IWOTH)) != 0) { + krb5_set_error_message(context, EACCES, + "%s has world and/or group write " + "permissions", filename); + return EACCES; + } + if (pwd->pw_uid != st.st_uid && st.st_uid != 0) { + krb5_set_error_message(context, EACCES, + "%s not owned by the user (%s) or root", + filename, owner); + return EACCES; + } + + return 0; +#endif +} + +static krb5_error_code +check_owner_file(krb5_context context, + const char *filename, + FILE *file, const char *owner) +{ +#ifdef _WIN32 + /* + * XXX Implement this! + * + * The thing to do is to call _get_osfhandle() on fileno(file) and + * dirfd(dir) to get HANDLEs to the same, then call + * GetSecurityInfo() on those HANDLEs to get the security descriptor + * (SD), then check the owner and DACL. Checking the DACL sounds + * like a lot of work (what, derive a mode from the ACL the way + * NFSv4 servers do?). Checking the owner means doing an LSARPC + * lookup at least (to get the user's SID). + */ + if (owner == NULL) + return 0; + + krb5_set_error_message(context, EACCES, + "User k5login files not supported on Windows"); + return EACCES; +#else + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; + struct stat st; + + if (owner == NULL) + return 0; + + if (rk_getpwnam_r(owner, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) { + krb5_set_error_message(context, errno, + "User unknown %s (getpwnam_r())", owner); + return EACCES; + } + if (pwd == NULL) { + krb5_set_error_message(context, EACCES, "no user %s", owner); + return EACCES; + } + + if (fstat(fileno(file), &st) == -1) { + krb5_set_error_message(context, EACCES, "fstat(%s) of k5login failed", + filename); + return EACCES; + } + if (S_ISDIR(st.st_mode)) { + krb5_set_error_message(context, EISDIR, "k5login: %s is a directory", + filename); + return EISDIR; + } + if ((st.st_mode & (S_IWGRP | S_IWOTH)) != 0) { + krb5_set_error_message(context, EISDIR, + "k5login %s has world and/or group write " + "permissions", filename); + return EACCES; + } + if (pwd->pw_uid != st.st_uid && st.st_uid != 0) { + krb5_set_error_message(context, EACCES, + "k5login %s not owned by the user or root", + filename); + return EACCES; + } + + return 0; +#endif +} + /* see if principal is mentioned in the filename access file, return TRUE (in result) if so, FALSE otherwise */ @@ -42,160 +263,152 @@ static krb5_error_code check_one_file(krb5_context context, const char *filename, - struct passwd *pwd, - krb5_principal principal, + const char *owner, + krb5_boolean is_system_location, + krb5_const_principal principal, krb5_boolean *result) { FILE *f; char buf[BUFSIZ]; krb5_error_code ret; - struct stat st; *result = FALSE; - f = fopen (filename, "r"); + f = fopen(filename, "r"); if (f == NULL) return errno; rk_cloexec_file(f); - /* check type and mode of file */ - if (fstat(fileno(f), &st) != 0) { - fclose (f); - return errno; - } - if (S_ISDIR(st.st_mode)) { - fclose (f); - return EISDIR; - } - if (st.st_uid != pwd->pw_uid && st.st_uid != 0) { - fclose (f); - return EACCES; - } - if ((st.st_mode & (S_IWGRP | S_IWOTH)) != 0) { - fclose (f); - return EACCES; - } + ret = check_owner_file(context, filename, f, owner); + if (ret) + goto out; - while (fgets (buf, sizeof(buf), f) != NULL) { + while (fgets(buf, sizeof(buf), f) != NULL) { krb5_principal tmp; char *newline = buf + strcspn(buf, "\n"); - if(*newline != '\n') { + if (*newline != '\n') { int c; c = fgetc(f); - if(c != EOF) { - while(c != EOF && c != '\n') + if (c != EOF) { + while (c != EOF && c != '\n') c = fgetc(f); /* line was too long, so ignore it */ continue; } } *newline = '\0'; - ret = krb5_parse_name (context, buf, &tmp); + ret = krb5_parse_name(context, buf, &tmp); if (ret) continue; - *result = krb5_principal_compare (context, principal, tmp); - krb5_free_principal (context, tmp); + *result = krb5_principal_compare(context, principal, tmp); + krb5_free_principal(context, tmp); if (*result) { fclose (f); return 0; } } - fclose (f); + +out: + fclose(f); return 0; } static krb5_error_code check_directory(krb5_context context, const char *dirname, - struct passwd *pwd, - krb5_principal principal, + const char *owner, + krb5_boolean is_system_location, + krb5_const_principal principal, krb5_boolean *result) { DIR *d; struct dirent *dent; char filename[MAXPATHLEN]; + size_t len; krb5_error_code ret = 0; struct stat st; *result = FALSE; - if(lstat(dirname, &st) < 0) + if (lstat(dirname, &st) < 0) return errno; - if (!S_ISDIR(st.st_mode)) + if (!S_ISDIR(st.st_mode)) { + krb5_set_error_message(context, ENOTDIR, "k5login.d not a directory"); return ENOTDIR; + } - if (st.st_uid != pwd->pw_uid && st.st_uid != 0) - return EACCES; - if ((st.st_mode & (S_IWGRP | S_IWOTH)) != 0) - return EACCES; - - if((d = opendir(dirname)) == NULL) + if ((d = opendir(dirname)) == NULL) { + krb5_set_error_message(context, ENOTDIR, "Could not open k5login.d"); return errno; - - { - int fd; - struct stat st2; - - fd = dirfd(d); - if(fstat(fd, &st2) < 0) { - closedir(d); - return errno; - } - if(st.st_dev != st2.st_dev || st.st_ino != st2.st_ino) { - closedir(d); - return EACCES; - } } - while((dent = readdir(d)) != NULL) { - if(strcmp(dent->d_name, ".") == 0 || + ret = check_owner_dir(context, dirname, is_system_location, d, &st, owner); + if (ret) + goto out; + + while ((dent = readdir(d)) != NULL) { + /* + * XXX: Should we also skip files whose names start with "."? + * Vim ".filename.swp" files are also good candidates to skip. + * Once we ignore "#*" and "*~", it is not clear what other + * heuristics to apply. + */ + if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0 || dent->d_name[0] == '#' || /* emacs autosave */ dent->d_name[strlen(dent->d_name) - 1] == '~') /* emacs backup */ continue; - snprintf(filename, sizeof(filename), "%s/%s", dirname, dent->d_name); - ret = check_one_file(context, filename, pwd, principal, result); - if(ret == 0 && *result == TRUE) - break; + len = snprintf(filename, sizeof(filename), "%s/%s", dirname, dent->d_name); + /* Skip too-long filenames that got truncated by snprintf() */ + if (len < sizeof(filename)) { + ret = check_one_file(context, filename, owner, is_system_location, + principal, result); + if (ret == 0 && *result == TRUE) + break; + } ret = 0; /* don't propagate errors upstream */ } + +out: closedir(d); return ret; } -#endif /* !_WIN32 */ - -static krb5_boolean -match_local_principals(krb5_context context, - krb5_principal principal, - const char *luser) +static krb5_error_code +check_an2ln(krb5_context context, + krb5_const_principal principal, + const char *luser, + krb5_boolean *result) { krb5_error_code ret; - krb5_realm *realms, *r; - krb5_boolean result = FALSE; + char *lname; +#if 0 + /* XXX Should we make this an option? */ /* multi-component principals can never match */ - if(krb5_principal_get_comp_string(context, principal, 1) != NULL) - return FALSE; + if (krb5_principal_get_comp_string(context, principal, 1) != NULL) { + *result = FALSE; + return 0; + } +#endif - ret = krb5_get_default_realms (context, &realms); + lname = malloc(strlen(luser) + 1); + if (lname == NULL) + return krb5_enomem(context); + ret = krb5_aname_to_localname(context, principal, strlen(luser)+1, lname); if (ret) - return FALSE; + goto out; + if (strcmp(lname, luser) == 0) + *result = TRUE; + else + *result = FALSE; + +out: + free(lname); + return 0; - for (r = realms; *r != NULL; ++r) { - if(strcmp(krb5_principal_get_realm(context, principal), - *r) != 0) - continue; - if(strcmp(krb5_principal_get_comp_string(context, principal, 0), - luser) == 0) { - result = TRUE; - break; - } - } - krb5_free_host_realm (context, realms); - return result; } /** @@ -204,8 +417,8 @@ * * The user may have a ~/.k5login file listing principals that are * allowed to login as that user. If that file does not exist, all - * principals with a first component identical to the username, and a - * realm considered local, are allowed access. + * principals with a only one component that is identical to the + * username, and a realm considered local, are allowed access. * * The .k5login file must contain one principal per line, be owned by * user and not be writable by group or other (but must be readable by @@ -234,70 +447,297 @@ */ KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL -krb5_kuserok (krb5_context context, +krb5_kuserok(krb5_context context, + krb5_principal principal, + const char *luser) +{ + return _krb5_kuserok(context, principal, luser, TRUE); +} + + +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +_krb5_kuserok(krb5_context context, krb5_principal principal, - const char *luser) + const char *luser, + krb5_boolean an2ln_ok) { -#ifndef _WIN32 - char *buf; - size_t buflen; - struct passwd *pwd = NULL; - char *profile_dir = NULL; + static heim_base_once_t reg_def_plugins = HEIM_BASE_ONCE_INIT; krb5_error_code ret; - krb5_boolean result = FALSE; + struct plctx ctx; + char **rules; + + /* + * XXX we should have a struct with a krb5_context field and a + * krb5_error_code fied and pass the address of that as the ctx + * argument of heim_base_once_f(). For now we use a static to + * communicate failures. Actually, we ignore failures anyways, + * since we can't return them. + */ + heim_base_once_f(®_def_plugins, context, reg_def_plugins_once); + + ctx.flags = 0; + ctx.luser = luser; + ctx.principal = principal; + ctx.result = FALSE; + + ctx.k5login_dir = krb5_config_get_string(context, NULL, "libdefaults", + "k5login_directory", NULL); + + if (an2ln_ok) + ctx.flags |= KUSEROK_ANAME_TO_LNAME_OK; + + if (krb5_config_get_bool_default(context, NULL, FALSE, "libdefaults", + "k5login_authoritative", NULL)) + ctx.flags |= KUSEROK_K5LOGIN_IS_AUTHORITATIVE; + + if ((ctx.flags & KUSEROK_K5LOGIN_IS_AUTHORITATIVE) && plugin_reg_ret) + return plugin_reg_ret; /* fail safe */ + + rules = krb5_config_get_strings(context, NULL, "libdefaults", + "kuserok", NULL); + if (rules == NULL) { + /* Default: check ~/.k5login */ + ctx.rule = "USER-K5LOGIN"; + + ret = plcallback(context, &kuserok_user_k5login_plug, NULL, &ctx); + if (ret == 0) + goto out; + + ctx.rule = "SIMPLE"; + ret = plcallback(context, &kuserok_simple_plug, NULL, &ctx); + if (ret == 0) + goto out; + + ctx.result = FALSE; + } else { + size_t n; + + for (n = 0; rules[n]; n++) { + ctx.rule = rules[n]; + + ret = _krb5_plugin_run_f(context, "krb5", KRB5_PLUGIN_KUSEROK, + KRB5_PLUGIN_KUSEROK_VERSION_0, 0, + &ctx, plcallback); + if (ret != KRB5_PLUGIN_NO_HANDLE) + goto out; + } + } - krb5_boolean found_file = FALSE; +out: + krb5_config_free_strings(rules); -#ifdef POSIX_GETPWNAM_R - char pwbuf[2048]; - struct passwd pw; + return ctx.result; +} + +/* + * Simple kuserok: check that the lname for the aname matches luser. + */ + +static krb5_error_code KRB5_LIB_CALL +kuserok_simple_plug_f(void *plug_ctx, krb5_context context, const char *rule, + unsigned int flags, const char *k5login_dir, + const char *luser, krb5_const_principal principal, + krb5_boolean *result) +{ + krb5_error_code ret; + + if (strcmp(rule, "SIMPLE") != 0 || (flags & KUSEROK_ANAME_TO_LNAME_OK) == 0) + return KRB5_PLUGIN_NO_HANDLE; + + ret = check_an2ln(context, principal, luser, result); + if (ret == 0 && *result == FALSE) + return KRB5_PLUGIN_NO_HANDLE; + + return 0; +} + +/* + * Check k5login files in a system location, rather than in home + * directories. + */ + +static krb5_error_code KRB5_LIB_CALL +kuserok_sys_k5login_plug_f(void *plug_ctx, krb5_context context, + const char *rule, unsigned int flags, + const char *k5login_dir, const char *luser, + krb5_const_principal principal, krb5_boolean *result) +{ + char filename[MAXPATHLEN]; + size_t len; + const char *profile_dir = NULL; + krb5_error_code ret; + + *result = FALSE; + + if (strcmp(rule, "SYSTEM-K5LOGIN") != 0 && + strncmp(rule, "SYSTEM-K5LOGIN:", strlen("SYSTEM-K5LOGIN:")) != 0) + return KRB5_PLUGIN_NO_HANDLE; - if(getpwnam_r(luser, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) - return FALSE; + profile_dir = strchr(rule, ':'); + if (profile_dir == NULL) + profile_dir = k5login_dir ? k5login_dir : SYSTEM_K5LOGIN_DIR; + else + profile_dir++; + + len = snprintf(filename, sizeof(filename), "%s/%s", profile_dir, luser); + if (len < sizeof(filename)) { + ret = check_one_file(context, filename, NULL, TRUE, principal, result); + + if (ret == 0 && + ((flags & KUSEROK_K5LOGIN_IS_AUTHORITATIVE) || *result == TRUE)) + return 0; + } + + *result = FALSE; + return KRB5_PLUGIN_NO_HANDLE; +} + +/* + * Check ~luser/.k5login and/or ~/luser/.k5login.d + */ + +static krb5_error_code KRB5_LIB_CALL +kuserok_user_k5login_plug_f(void *plug_ctx, krb5_context context, + const char *rule, unsigned int flags, + const char *k5login_dir, const char *luser, + krb5_const_principal principal, + krb5_boolean *result) +{ +#ifdef _WIN32 + return KRB5_PLUGIN_NO_HANDLE; #else - pwd = getpwnam (luser); -#endif - if (pwd == NULL) - return FALSE; - profile_dir = pwd->pw_dir; + char *path; + char *path_exp; + const char *profile_dir = NULL; + krb5_error_code ret; + krb5_boolean found_file = FALSE; + struct passwd pw, *pwd = NULL; + char pwbuf[2048]; -#define KLOGIN "/.k5login" - buflen = strlen(profile_dir) + sizeof(KLOGIN) + 2; /* 2 for .d */ - buf = malloc(buflen); - if(buf == NULL) - return FALSE; - /* check user's ~/.k5login */ - strlcpy(buf, profile_dir, buflen); - strlcat(buf, KLOGIN, buflen); - ret = check_one_file(context, buf, pwd, principal, &result); + if (strcmp(rule, "USER-K5LOGIN") != 0) + return KRB5_PLUGIN_NO_HANDLE; - if(ret == 0 && result == TRUE) { - free(buf); - return TRUE; + profile_dir = k5login_dir; + if (profile_dir == NULL) { + /* Don't deadlock with gssd or anything of the sort */ + if (!_krb5_homedir_access(context)) + return KRB5_PLUGIN_NO_HANDLE; + + if (getpwnam_r(luser, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) { + krb5_set_error_message(context, errno, "User unknown (getpwnam_r())"); + return KRB5_PLUGIN_NO_HANDLE; + } + if (pwd == NULL) { + krb5_set_error_message(context, errno, "User unknown (getpwnam())"); + return KRB5_PLUGIN_NO_HANDLE; + } + profile_dir = pwd->pw_dir; } - if(ret != ENOENT) - found_file = TRUE; +#define KLOGIN "/.k5login" - strlcat(buf, ".d", buflen); - ret = check_directory(context, buf, pwd, principal, &result); - free(buf); - if(ret == 0 && result == TRUE) - return TRUE; + if (asprintf(&path, "%s/.k5login.d", profile_dir) == -1) + return krb5_enomem(context); - if(ret != ENOENT && ret != ENOTDIR) + ret = _krb5_expand_path_tokensv(context, path, 1, &path_exp, + "luser", luser, NULL); + free(path); + if (ret) + return ret; + path = path_exp; + + /* check user's ~/.k5login */ + path[strlen(path) - strlen(".d")] = '\0'; + ret = check_one_file(context, path, luser, FALSE, principal, result); + + /* + * A match in ~/.k5login is sufficient. A non-match, falls through to the + * .k5login.d code below. + */ + if (ret == 0 && *result == TRUE) { + free(path); + return 0; + } + if (ret != ENOENT) found_file = TRUE; - /* finally if no files exist, allow all principals matching - @ */ - if(found_file == FALSE) - return match_local_principals(context, principal, luser); + /* + * A match in ~/.k5login.d/somefile is sufficient. A non-match, falls + * through to the code below that handles negative results. + * + * XXX: put back the .d; clever|hackish? you decide + */ + path[strlen(path)] = '.'; + ret = check_directory(context, path, luser, FALSE, principal, result); + free(path); + if (ret == 0 && *result == TRUE) + return 0; + if (ret != ENOENT && ret != ENOTDIR) + found_file = TRUE; - return FALSE; -#else - /* The .k5login file may be on a remote profile and we don't have - access to the profile until we have a token handle for the - user's credentials. */ - return match_local_principals(context, principal, luser); + /* + * When either ~/.k5login or ~/.k5login.d/ exists, but neither matches + * and we're authoritative, we're done. Otherwise, give other plugins + * a chance. + */ + *result = FALSE; + if (found_file && (flags & KUSEROK_K5LOGIN_IS_AUTHORITATIVE)) + return 0; + return KRB5_PLUGIN_NO_HANDLE; #endif } + +static krb5_error_code KRB5_LIB_CALL +kuserok_deny_plug_f(void *plug_ctx, krb5_context context, const char *rule, + unsigned int flags, const char *k5login_dir, + const char *luser, krb5_const_principal principal, + krb5_boolean *result) +{ + if (strcmp(rule, "DENY") != 0) + return KRB5_PLUGIN_NO_HANDLE; + + *result = FALSE; + return 0; +} + +static krb5_error_code KRB5_LIB_CALL +kuser_ok_null_plugin_init(krb5_context context, void **ctx) +{ + *ctx = NULL; + return 0; +} + +static void KRB5_LIB_CALL +kuser_ok_null_plugin_fini(void *ctx) +{ + return; +} + +static krb5plugin_kuserok_ftable kuserok_simple_plug = { + KRB5_PLUGIN_KUSEROK_VERSION_0, + kuser_ok_null_plugin_init, + kuser_ok_null_plugin_fini, + kuserok_simple_plug_f, +}; + +static krb5plugin_kuserok_ftable kuserok_sys_k5login_plug = { + KRB5_PLUGIN_KUSEROK_VERSION_0, + kuser_ok_null_plugin_init, + kuser_ok_null_plugin_fini, + kuserok_sys_k5login_plug_f, +}; + +static krb5plugin_kuserok_ftable kuserok_user_k5login_plug = { + KRB5_PLUGIN_KUSEROK_VERSION_0, + kuser_ok_null_plugin_init, + kuser_ok_null_plugin_fini, + kuserok_user_k5login_plug_f, +}; + +static krb5plugin_kuserok_ftable kuserok_deny_plug = { + KRB5_PLUGIN_KUSEROK_VERSION_0, + kuser_ok_null_plugin_init, + kuser_ok_null_plugin_fini, + kuserok_deny_plug_f, +}; + diff --git a/crypto/heimdal/lib/krb5/kuserok_plugin.h b/crypto/heimdal/lib/krb5/kuserok_plugin.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/kuserok_plugin.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2011, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef HEIMDAL_KRB5_KUSEROK_PLUGIN_H +#define HEIMDAL_KRB5_KUSEROK_PLUGIN_H 1 + +#define KRB5_PLUGIN_KUSEROK "krb5_plugin_kuserok" +#define KRB5_PLUGIN_KUSEROK_VERSION_0 0 + +/** @struct krb5plugin_kuserok_ftable_desc + * + * @brief Description of the krb5_kuserok(3) plugin facility. + * + * The krb5_kuserok(3) function is pluggable. The plugin is named + * KRB5_PLUGIN_KUSEROK ("krb5_plugin_kuserok"), with a single minor + * version, KRB5_PLUGIN_KUSEROK_VERSION_0 (0). + * + * The plugin for krb5_kuserok(3) consists of a data symbol referencing + * a structure of type krb5plugin_kuserok_ftable, with four fields: + * + * @param init Plugin initialization function (see krb5-plugin(7)) + * + * @param minor_version The plugin minor version number (0) + * + * @param fini Plugin finalization function + * + * @param kuserok Plugin kuserok function + * + * The kuserok field is the plugin entry point that performs the + * traditional kuserok operation however the plugin desires. It is + * invoked in no particular order relative to other kuserok plugins, but + * it has a 'rule' argument that indicates which plugin is intended to + * act on the rule. The plugin kuserok function must return + * KRB5_PLUGIN_NO_HANDLE if the rule is not applicable to it. + * + * The plugin kuserok function has the following arguments, in this + * order: + * + * -# plug_ctx, the context value output by the plugin's init function + * -# context, a krb5_context + * -# rule, the kuserok rule being evaluated (from krb5.conf(5)) + * -# flags + * -# k5login_dir, configured location of k5login per-user files if any + * -# luser, name of the local user account to which principal is attempting to access. + * -# principal, the krb5_principal trying to access the luser account + * -# result, a krb5_boolean pointer where the plugin will output its result + * + * @ingroup krb5_support + */ +typedef struct krb5plugin_kuserok_ftable_desc { + int minor_version; + krb5_error_code (KRB5_LIB_CALL *init)(krb5_context, void **); + void (KRB5_LIB_CALL *fini)(void *); + krb5_error_code (KRB5_LIB_CALL *kuserok)(void *, krb5_context, const char *, + unsigned int, const char *, const char *, + krb5_const_principal, + krb5_boolean *); +} krb5plugin_kuserok_ftable; + +#define KUSEROK_ANAME_TO_LNAME_OK 1 +#define KUSEROK_K5LOGIN_IS_AUTHORITATIVE 2 + +#endif /* HEIMDAL_KRB5_KUSEROK_PLUGIN_H */ diff --git a/crypto/heimdal/lib/krb5/libkrb5-exports.def.in b/crypto/heimdal/lib/krb5/libkrb5-exports.def.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/libkrb5-exports.def.in @@ -0,0 +1,806 @@ +EXPORTS + krb524_convert_creds_kdc + krb524_convert_creds_kdc_ccache + krb5_abort + krb5_abortx + krb5_acl_match_file + krb5_acl_match_string + krb5_add_et_list + krb5_add_extra_addresses + krb5_add_ignore_addresses + krb5_addlog_dest + krb5_addlog_func + krb5_addr2sockaddr + krb5_address_compare + krb5_address_order + krb5_address_prefixlen_boundary + krb5_address_search + krb5_allow_weak_crypto + krb5_aname_to_localname + krb5_anyaddr + krb5_appdefault_boolean + krb5_appdefault_string + krb5_appdefault_time + krb5_append_addresses + krb5_auth_con_addflags + krb5_auth_con_free + krb5_auth_con_genaddrs + krb5_auth_con_generatelocalsubkey + krb5_auth_con_getaddrs + krb5_auth_con_getauthenticator + krb5_auth_con_getcksumtype + krb5_auth_con_getflags + krb5_auth_con_getkey + krb5_auth_con_getkeytype + krb5_auth_con_getlocalseqnumber + krb5_auth_con_getlocalsubkey + krb5_auth_con_getrcache + krb5_auth_con_getremoteseqnumber + krb5_auth_con_getremotesubkey + krb5_auth_con_init + krb5_auth_con_removeflags + krb5_auth_con_setaddrs + krb5_auth_con_setaddrs_from_fd + krb5_auth_con_setcksumtype + krb5_auth_con_setflags + krb5_auth_con_setkey + krb5_auth_con_setkeytype + krb5_auth_con_setlocalseqnumber + krb5_auth_con_setlocalsubkey + krb5_auth_con_setrcache + krb5_auth_con_setremoteseqnumber + krb5_auth_con_setremotesubkey + krb5_auth_con_setuserkey + krb5_auth_getremoteseqnumber + krb5_build_ap_req + krb5_build_principal + krb5_build_principal_ext + krb5_build_principal_va + krb5_build_principal_va_ext + krb5_c_block_size + krb5_c_checksum_length + krb5_c_decrypt + krb5_c_encrypt + krb5_c_encrypt_length + krb5_c_enctype_compare + krb5_c_get_checksum + krb5_c_is_coll_proof_cksum + krb5_c_is_keyed_cksum + krb5_c_keylengths + krb5_c_make_checksum + krb5_c_make_random_key + krb5_c_prf + krb5_c_prf_length + krb5_c_random_make_octets ;! + krb5_c_set_checksum + krb5_c_valid_cksumtype + krb5_c_valid_enctype + krb5_c_verify_checksum + krb5_cc_cache_end_seq_get + krb5_cc_cache_get_first + krb5_cc_cache_match + krb5_cc_cache_next + krb5_cc_clear_mcred + krb5_cc_close + krb5_cc_copy_cache + krb5_cc_copy_creds ;! + krb5_cc_copy_match_f + krb5_cc_default + krb5_cc_default_name + krb5_cc_destroy + krb5_cc_end_seq_get + krb5_cc_gen_new + krb5_cc_get_config + krb5_cc_get_friendly_name + krb5_cc_get_full_name + krb5_cc_get_kdc_offset + krb5_cc_get_lifetime + krb5_cc_get_name + krb5_cc_get_ops + krb5_cc_get_prefix_ops + krb5_cc_get_principal + krb5_cc_get_type + krb5_cc_get_version + krb5_cc_initialize + krb5_cc_last_change_time + krb5_cc_move + krb5_cc_new_unique + krb5_cc_next_cred +;! krb5_cc_next_cred_match + krb5_cc_register + krb5_cc_remove_cred + krb5_cc_resolve + krb5_cc_retrieve_cred + krb5_cc_set_config + krb5_cc_set_default_name + krb5_cc_set_flags + krb5_cc_set_kdc_offset + krb5_cc_start_seq_get + krb5_cc_store_cred + krb5_cc_support_switch + krb5_cc_switch + krb5_cc_set_friendly_name + krb5_change_password + krb5_check_transited + krb5_check_transited_realms + krb5_checksum_disable + krb5_checksum_free + krb5_checksum_is_collision_proof + krb5_checksum_is_keyed + krb5_checksumsize + krb5_cksumtype_to_enctype + krb5_cksumtype_valid + krb5_clear_error_string + krb5_clear_error_message + krb5_closelog + krb5_compare_creds + krb5_config_file_free + krb5_config_free_strings +; _krb5_config_get + krb5_config_get_bool + krb5_config_get_bool_default + krb5_config_get_int + krb5_config_get_int_default + krb5_config_get_list +; _krb5_config_get_next + krb5_config_get_string + krb5_config_get_string_default + krb5_config_get_strings + krb5_config_get_time + krb5_config_get_time_default + krb5_config_parse_file + krb5_config_parse_file_multi + krb5_config_parse_string_multi +; _krb5_config_vget + krb5_config_vget_bool + krb5_config_vget_bool_default + krb5_config_vget_int + krb5_config_vget_int_default + krb5_config_vget_list +; _krb5_config_vget_next + krb5_config_vget_string + krb5_config_vget_string_default + krb5_config_vget_strings + krb5_config_vget_time + krb5_config_vget_time_default + krb5_copy_address + krb5_copy_addresses + krb5_copy_checksum + krb5_copy_context + krb5_copy_creds + krb5_copy_creds_contents + krb5_copy_data + krb5_copy_host_realm + krb5_copy_keyblock + krb5_copy_keyblock_contents + krb5_copy_principal + krb5_copy_ticket + krb5_create_checksum + krb5_create_checksum_iov + krb5_crypto_destroy + krb5_crypto_fx_cf2 + krb5_crypto_get_checksum_type + krb5_crypto_getblocksize + krb5_crypto_getconfoundersize + krb5_crypto_getenctype + krb5_crypto_getpadsize + krb5_crypto_init + krb5_crypto_overhead + krb5_crypto_prf + krb5_crypto_prf_length + krb5_crypto_length + krb5_crypto_length_iov + krb5_decrypt_iov_ivec + krb5_encrypt_iov_ivec + krb5_data_alloc + krb5_data_cmp + krb5_data_copy + krb5_data_ct_cmp + krb5_data_free + krb5_data_realloc + krb5_data_zero + krb5_decode_Authenticator + krb5_decode_ETYPE_INFO2 + krb5_decode_ETYPE_INFO + krb5_decode_EncAPRepPart + krb5_decode_EncASRepPart + krb5_decode_EncKrbCredPart + krb5_decode_EncTGSRepPart + krb5_decode_EncTicketPart + krb5_decode_ap_req + krb5_decrypt + krb5_decrypt_EncryptedData + krb5_decrypt_ivec + krb5_decrypt_ticket + krb5_derive_key + krb5_digest_alloc + krb5_digest_free + krb5_digest_get_client_binding + krb5_digest_get_identifier + krb5_digest_get_opaque + krb5_digest_get_rsp + krb5_digest_get_server_nonce + krb5_digest_get_session_key + krb5_digest_get_tickets + krb5_digest_init_request + krb5_digest_probe + krb5_digest_rep_get_status + krb5_digest_request + krb5_digest_set_authentication_user + krb5_digest_set_authid + krb5_digest_set_client_nonce + krb5_digest_set_digest + krb5_digest_set_hostname + krb5_digest_set_identifier + krb5_digest_set_method + krb5_digest_set_nonceCount + krb5_digest_set_opaque + krb5_digest_set_qop + krb5_digest_set_realm + krb5_digest_set_responseData + krb5_digest_set_server_cb + krb5_digest_set_server_nonce + krb5_digest_set_type + krb5_digest_set_uri + krb5_digest_set_username + krb5_domain_x500_decode + krb5_domain_x500_encode + krb5_eai_to_heim_errno + krb5_encode_Authenticator + krb5_encode_ETYPE_INFO2 + krb5_encode_ETYPE_INFO + krb5_encode_EncAPRepPart + krb5_encode_EncASRepPart + krb5_encode_EncKrbCredPart + krb5_encode_EncTGSRepPart + krb5_encode_EncTicketPart + krb5_encrypt + krb5_encrypt_EncryptedData + krb5_encrypt_ivec + krb5_enctype_enable + krb5_enctype_disable + krb5_enctype_keybits + krb5_enctype_keysize + krb5_enctype_to_keytype + krb5_enctype_to_string + krb5_enctype_valid + krb5_enctypes_compatible_keys + krb5_enomem + krb5_err + krb5_error_from_rd_error + krb5_errx + krb5_expand_hostname + krb5_expand_hostname_realms + krb5_find_padata + krb5_format_time + krb5_free_address + krb5_free_addresses + krb5_free_ap_rep_enc_part + krb5_free_authenticator + krb5_free_checksum + krb5_free_checksum_contents + krb5_free_config_files + krb5_free_context + krb5_free_cred_contents + krb5_free_creds + krb5_free_creds_contents + krb5_free_data + krb5_free_data_contents + krb5_free_default_realm + krb5_free_error + krb5_free_error_contents + krb5_free_error_string + krb5_free_error_message + krb5_free_host_realm + krb5_free_kdc_rep + krb5_free_keyblock + krb5_free_keyblock_contents + krb5_free_krbhst + krb5_free_principal + krb5_free_salt + krb5_free_ticket + krb5_free_unparsed_name + krb5_fwd_tgt_creds + krb5_generate_random_block + krb5_generate_random_keyblock + krb5_generate_seq_number + krb5_generate_subkey + krb5_generate_subkey_extended + krb5_get_all_client_addrs + krb5_get_all_server_addrs + krb5_get_cred_from_kdc + krb5_get_cred_from_kdc_opt + krb5_get_credentials + krb5_get_credentials_with_flags + krb5_get_creds + krb5_get_creds_opt_add_options + krb5_get_creds_opt_alloc + krb5_get_creds_opt_free + krb5_get_creds_opt_set_enctype + krb5_get_creds_opt_set_impersonate + krb5_get_creds_opt_set_options + krb5_get_creds_opt_set_ticket + krb5_get_default_config_files + krb5_get_default_in_tkt_etypes + krb5_get_default_principal + krb5_get_default_realm + krb5_get_default_realms + krb5_get_dns_canonicalize_hostname + krb5_get_err_text + krb5_get_error_message + krb5_get_error_string + krb5_get_extra_addresses + krb5_get_fcache_version + krb5_get_forwarded_creds + krb5_get_host_realm + krb5_get_ignore_addresses + krb5_get_in_cred +; krb5_cccol_last_change_time + krb5_get_in_tkt + krb5_get_in_tkt_with_keytab + krb5_get_in_tkt_with_password + krb5_get_in_tkt_with_skey +;! krb5_get_init_creds + krb5_get_init_creds_keyblock + krb5_get_init_creds_keytab + krb5_get_init_creds_opt_alloc + krb5_get_init_creds_opt_free + krb5_get_init_creds_opt_get_error + krb5_get_init_creds_opt_init + krb5_get_init_creds_opt_set_address_list + krb5_get_init_creds_opt_set_addressless + krb5_get_init_creds_opt_set_anonymous + krb5_get_init_creds_opt_set_change_password_prompt + krb5_get_init_creds_opt_set_canonicalize + krb5_get_init_creds_opt_set_default_flags + krb5_get_init_creds_opt_set_etype_list + krb5_get_init_creds_opt_set_forwardable + krb5_get_init_creds_opt_set_pa_password + krb5_get_init_creds_opt_set_pac_request + krb5_get_init_creds_opt_set_pkinit + krb5_get_init_creds_opt_set_preauth_list + krb5_get_init_creds_opt_set_process_last_req + krb5_get_init_creds_opt_set_proxiable + krb5_get_init_creds_opt_set_renew_life + krb5_get_init_creds_opt_set_salt + krb5_get_init_creds_opt_set_tkt_life + krb5_get_init_creds_opt_set_win2k + krb5_get_init_creds_password + krb5_get_kdc_cred + krb5_get_kdc_sec_offset + krb5_get_krb524hst + krb5_get_krb_admin_hst + krb5_get_krb_changepw_hst + krb5_get_krbhst + krb5_get_max_time_skew + krb5_get_pw_salt + krb5_get_renewed_creds + krb5_get_server_rcache + krb5_get_use_admin_kdc + krb5_get_validated_creds ;! + krb5_get_warn_dest + krb5_get_wrapped_length + krb5_getportbyname + krb5_h_addr2addr + krb5_h_addr2sockaddr + krb5_h_errno_to_heim_errno + krb5_have_error_string + krb5_hmac + krb5_init_context + krb5_init_ets + krb5_initlog + krb5_is_config_principal + krb5_is_enctype_weak + krb5_is_thread_safe +#ifdef HAVE_KCM + krb5_kcm_call + krb5_kcm_storage_request +#endif + krb5_kerberos_enctypes + krb5_keyblock_get_enctype + krb5_keyblock_init + krb5_keyblock_key_proc + krb5_keyblock_zero + krb5_keytab_key_proc + krb5_keytype_to_enctypes + krb5_keytype_to_enctypes_default + krb5_keytype_to_string + krb5_krbhst_format_string + krb5_krbhst_free + krb5_krbhst_get_addrinfo + krb5_krbhst_init + krb5_krbhst_init_flags + krb5_krbhst_next + krb5_krbhst_next_as_string + krb5_krbhst_reset + krb5_kt_add_entry + krb5_kt_close + krb5_kt_compare + krb5_kt_copy_entry_contents + krb5_kt_default + krb5_kt_default_modify_name + krb5_kt_default_name + krb5_kt_destroy + krb5_kt_end_seq_get + krb5_kt_free_entry + krb5_kt_get_entry + krb5_kt_get_full_name + krb5_kt_get_name + krb5_kt_get_type + krb5_kt_have_content + krb5_kt_next_entry + krb5_kt_read_service_key + krb5_kt_register + krb5_kt_remove_entry + krb5_kt_resolve + krb5_kt_start_seq_get + krb5_kuserok + krb5_log + krb5_log_msg + krb5_make_addrport + krb5_make_principal + krb5_max_sockaddr_size + krb5_mk_error + krb5_mk_error_ext + krb5_mk_priv + krb5_mk_rep + krb5_mk_req + krb5_mk_req_exact + krb5_mk_req_extended + krb5_mk_safe + krb5_net_read + krb5_net_write + krb5_net_write_block + krb5_ntlm_alloc + krb5_ntlm_free + krb5_ntlm_init_get_challenge + krb5_ntlm_init_get_flags + krb5_ntlm_init_get_opaque + krb5_ntlm_init_get_targetinfo + krb5_ntlm_init_get_targetname + krb5_ntlm_init_request + krb5_ntlm_rep_get_sessionkey + krb5_ntlm_rep_get_status + krb5_ntlm_req_set_flags + krb5_ntlm_req_set_lm + krb5_ntlm_req_set_ntlm + krb5_ntlm_req_set_opaque + krb5_ntlm_req_set_session + krb5_ntlm_req_set_targetname + krb5_ntlm_req_set_username + krb5_ntlm_request + krb5_openlog + krb5_pac_add_buffer + krb5_pac_free + krb5_pac_get_buffer + krb5_pac_get_types + krb5_pac_init + krb5_pac_parse + krb5_pac_verify + krb5_padata_add + krb5_parse_address + krb5_parse_name + krb5_parse_name_flags + krb5_parse_nametype + krb5_passwd_result_to_string + krb5_password_key_proc + krb5_get_permitted_enctypes + krb5_plugin_register + krb5_prepend_config_files + krb5_prepend_config_files_default + krb5_prepend_error_message + krb5_princ_realm + krb5_princ_set_realm + krb5_principal_compare + krb5_principal_compare_any_realm + krb5_principal_get_comp_string + krb5_principal_get_num_comp + krb5_principal_get_realm + krb5_principal_get_type + krb5_principal_is_anonymous + krb5_principal_is_krbtgt + krb5_principal_match + krb5_principal_set_comp_string + krb5_principal_set_realm + krb5_principal_set_type + krb5_print_address + krb5_program_setup + krb5_prompter_posix + krb5_random_to_key + krb5_rc_close + krb5_rc_default + krb5_rc_default_name + krb5_rc_default_type + krb5_rc_destroy + krb5_rc_expunge + krb5_rc_get_lifespan + krb5_rc_get_name + krb5_rc_get_type + krb5_rc_initialize + krb5_rc_recover + krb5_rc_resolve + krb5_rc_resolve_full + krb5_rc_resolve_type + krb5_rc_store + krb5_rd_cred2 + krb5_rd_cred + krb5_rd_error + krb5_rd_priv + krb5_rd_rep + krb5_rd_req + krb5_rd_req_ctx + krb5_rd_req_in_ctx_alloc + krb5_rd_req_in_ctx_free + krb5_rd_req_in_set_keyblock + krb5_rd_req_in_set_keytab + krb5_rd_req_in_set_pac_check + krb5_rd_req_out_ctx_free + krb5_rd_req_out_get_ap_req_options + krb5_rd_req_out_get_keyblock + krb5_rd_req_out_get_ticket + krb5_rd_req_with_keyblock + krb5_rd_safe + krb5_read_message + krb5_read_priv_message + krb5_read_safe_message + krb5_realm_compare + krb5_recvauth + krb5_recvauth_match_version + krb5_ret_address + krb5_ret_addrs + krb5_ret_authdata + krb5_ret_creds + krb5_ret_creds_tag + krb5_ret_data + krb5_ret_int16 + krb5_ret_int32 + krb5_ret_int64 + krb5_ret_int8 + krb5_ret_keyblock + krb5_ret_principal + krb5_ret_string + krb5_ret_stringnl + krb5_ret_stringz + krb5_ret_times + krb5_ret_uint16 + krb5_ret_uint32 + krb5_ret_uint64 + krb5_ret_uint8 + krb5_salttype_to_string + krb5_sendauth + krb5_sendto + krb5_sendto_context + krb5_sendto_ctx_add_flags + krb5_sendto_ctx_alloc + krb5_sendto_ctx_free + krb5_sendto_ctx_get_flags + krb5_sendto_ctx_set_func + krb5_sendto_ctx_set_type + krb5_sendto_kdc + krb5_sendto_kdc_flags + krb5_set_config_files + krb5_set_debug_dest + krb5_set_default_in_tkt_etypes + krb5_set_default_realm + krb5_set_dns_canonicalize_hostname + krb5_set_error_message + krb5_set_error_string + krb5_set_extra_addresses + krb5_set_fcache_version + krb5_set_home_dir_access + krb5_set_ignore_addresses + krb5_set_kdc_sec_offset + krb5_set_max_time_skew + krb5_set_password + krb5_set_password_using_ccache + krb5_set_real_time + krb5_set_send_to_kdc_func + krb5_set_use_admin_kdc + krb5_set_warn_dest + krb5_sname_to_principal + krb5_sock_to_principal + krb5_sockaddr2address + krb5_sockaddr2port + krb5_sockaddr_uninteresting + krb5_std_usage + krb5_storage_clear_flags + krb5_storage_emem + krb5_storage_free + krb5_storage_from_data + krb5_storage_from_fd + krb5_storage_from_mem + krb5_storage_from_readonly_mem + krb5_storage_from_socket + krb5_storage_fsync + krb5_storage_get_byteorder + krb5_storage_get_eof_code + krb5_storage_is_flags + krb5_storage_read + krb5_storage_seek + krb5_storage_set_byteorder + krb5_storage_set_eof_code + krb5_storage_set_flags + krb5_storage_set_max_alloc + krb5_storage_to_data + krb5_storage_truncate + krb5_storage_write + krb5_store_address + krb5_store_addrs + krb5_store_authdata + krb5_store_creds + krb5_store_creds_tag + krb5_store_data + krb5_store_int16 + krb5_store_int32 + krb5_store_int64 + krb5_store_int8 + krb5_store_keyblock + krb5_store_principal + krb5_store_string + krb5_store_stringnl + krb5_store_stringz + krb5_store_times + krb5_store_uint16 + krb5_store_uint32 + krb5_store_uint64 + krb5_store_uint8 + krb5_string_to_deltat + krb5_string_to_enctype + krb5_string_to_key + krb5_string_to_key_data + krb5_string_to_key_data_salt + krb5_string_to_key_data_salt_opaque + krb5_string_to_key_derived + krb5_string_to_key_salt + krb5_string_to_key_salt_opaque + krb5_string_to_keytype + krb5_string_to_salttype + krb5_ticket_get_authorization_data_type + krb5_ticket_get_client + krb5_ticket_get_endtime + krb5_ticket_get_server + krb5_timeofday + krb5_unparse_name + krb5_unparse_name_fixed + krb5_unparse_name_fixed_flags + krb5_unparse_name_fixed_short + krb5_unparse_name_flags + krb5_unparse_name_short + krb5_us_timeofday + krb5_vabort + krb5_vabortx + krb5_verify_ap_req2 + krb5_verify_ap_req + krb5_verify_authenticator_checksum + krb5_verify_checksum + krb5_verify_checksum_iov + krb5_verify_init_creds + krb5_verify_init_creds_opt_init + krb5_verify_init_creds_opt_set_ap_req_nofail + krb5_verify_opt_alloc + krb5_verify_opt_free + krb5_verify_opt_init + krb5_verify_opt_set_ccache + krb5_verify_opt_set_flags + krb5_verify_opt_set_keytab + krb5_verify_opt_set_secure + krb5_verify_opt_set_service + krb5_verify_user + krb5_verify_user_lrealm + krb5_verify_user_opt + krb5_verr + krb5_verrx + krb5_vlog + krb5_vlog_msg + krb5_vprepend_error_message + krb5_vset_error_message + krb5_vset_error_string + krb5_vwarn + krb5_vwarnx + krb5_warn + krb5_warnx + krb5_write_message + krb5_write_priv_message + krb5_write_safe_message + krb5_xfree + krb5_cccol_last_change_time + krb5_cccol_cursor_new + krb5_cccol_cursor_next + krb5_cccol_cursor_free + + ; com_err error tables + initialize_krb5_error_table_r + initialize_krb5_error_table + initialize_krb_error_table_r + initialize_krb_error_table + initialize_heim_error_table_r + initialize_heim_error_table + initialize_k524_error_table_r + initialize_k524_error_table + + ; variables + krb5_mcc_ops DATA + krb5_acc_ops DATA + krb5_fcc_ops DATA +#ifdef HAVE_SCC + krb5_scc_ops DATA +#endif +#ifdef HAVE_KCM + krb5_kcm_ops DATA +#endif + krb5_wrfkt_ops DATA + krb5_mkt_ops DATA + krb5_akf_ops DATA + krb5_any_ops DATA + heimdal_version DATA + heimdal_long_version DATA + krb5_config_file DATA + krb5_defkeyname DATA + krb5_cc_type_api DATA + krb5_cc_type_file DATA + krb5_cc_type_memory DATA + krb5_cc_type_kcm DATA + krb5_cc_type_scc DATA + + ; Shared with GSSAPI krb5 + _krb5_crc_init_table + _krb5_crc_update + _krb5_get_krbtgt + _krb5_build_authenticator + + ; Shared with libkdc + _krb5_AES_SHA1_string_to_default_iterator + _krb5_AES_SHA2_string_to_default_iterator + _krb5_dh_group_ok + _krb5_get_host_realm_int + _krb5_get_int + _krb5_get_int64 + _krb5_pac_sign + _krb5_parse_moduli + _krb5_pk_kdf + _krb5_pk_load_id + _krb5_pk_mk_ContentInfo + _krb5_pk_octetstring2key + _krb5_plugin_run_f + _krb5_enctype_requires_random_salt + _krb5_principal2principalname + _krb5_principalname2krb5_principal + _krb5_put_int + _krb5_s4u2self_to_checksumdata + _krb5_HMAC_MD5_checksum + _krb5_expand_path_tokens ;! + + ; kinit helper + krb5_get_init_creds_opt_set_pkinit_user_certs + krb5_pk_enterprise_cert + + krb5_auth_con_getsendsubkey + krb5_init_creds_free + krb5_init_creds_get + krb5_init_creds_get_creds + krb5_init_creds_get_error + krb5_init_creds_init + krb5_init_creds_set_fast_ccache + krb5_init_creds_set_keytab + krb5_init_creds_set_password + krb5_init_creds_set_service + krb5_init_creds_store + krb5_process_last_request + + ; testing +;! _krb5_aes_cts_encrypt + _krb5_n_fold + _krb5_expand_default_cc_name + + ; FAST + _krb5_fast_cf2 + _krb5_fast_armor_key + + ; Recent additions + krb5_cc_type_dcc; + krb5_dcc_ops; + _krb5_plugin_find; + _krb5_plugin_free; + _krb5_expand_path_tokensv; + _krb5_find_capath; + _krb5_free_capath; diff --git a/crypto/heimdal/lib/krb5/locate_plugin.h b/crypto/heimdal/lib/krb5/locate_plugin.h --- a/crypto/heimdal/lib/krb5/locate_plugin.h +++ b/crypto/heimdal/lib/krb5/locate_plugin.h @@ -3,6 +3,8 @@ * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * + * Portions Copyright (c) 2010 Apple Inc. All rights reserved. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -37,6 +39,10 @@ #define HEIMDAL_KRB5_LOCATE_PLUGIN_H 1 #define KRB5_PLUGIN_LOCATE "service_locator" +#define KRB5_PLUGIN_LOCATE_VERSION 1 +#define KRB5_PLUGIN_LOCATE_VERSION_0 0 +#define KRB5_PLUGIN_LOCATE_VERSION_1 1 +#define KRB5_PLUGIN_LOCATE_VERSION_2 2 enum locate_service_type { locate_service_kdc = 1, @@ -47,7 +53,17 @@ }; typedef krb5_error_code -(*krb5plugin_service_locate_lookup) (void *, enum locate_service_type, +(KRB5_CALLCONV *krb5plugin_service_locate_lookup) + (void *, unsigned long, enum locate_service_type, + const char *, int, int, + int (*)(void *,int,struct sockaddr *), + void *); + +#define KRB5_PLF_ALLOW_HOMEDIR 1 + +typedef krb5_error_code +(KRB5_CALLCONV *krb5plugin_service_locate_lookup_old) + (void *, enum locate_service_type, const char *, int, int, int (*)(void *,int,struct sockaddr *), void *); @@ -55,9 +71,10 @@ typedef struct krb5plugin_service_locate_ftable { int minor_version; - krb5_error_code (*init)(krb5_context, void **); - void (*fini)(void *); - krb5plugin_service_locate_lookup lookup; + krb5_error_code (KRB5_CALLCONV *init)(krb5_context, void **); + void (KRB5_CALLCONV *fini)(void *); + krb5plugin_service_locate_lookup_old old_lookup; + krb5plugin_service_locate_lookup lookup; /* version 2 */ } krb5plugin_service_locate_ftable; #endif /* HEIMDAL_KRB5_LOCATE_PLUGIN_H */ diff --git a/crypto/heimdal/lib/krb5/log.c b/crypto/heimdal/lib/krb5/log.c --- a/crypto/heimdal/lib/krb5/log.c +++ b/crypto/heimdal/lib/krb5/log.c @@ -121,17 +121,12 @@ krb5_log_facility **fac) { krb5_log_facility *f = calloc(1, sizeof(*f)); - if(f == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (f == NULL) + return krb5_enomem(context); f->program = strdup(program); if(f->program == NULL){ free(f); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } *fac = f; return 0; @@ -147,11 +142,8 @@ void *data) { struct facility *fp = log_realloc(fac); - if(fp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (fp == NULL) + return krb5_enomem(context); fp->min = min; fp->max = max; fp->log_func = log_func; @@ -190,11 +182,8 @@ struct _heimdal_syslog_data *sd = malloc(sizeof(*sd)); int i; - if(sd == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (sd == NULL) + return krb5_enomem(context); i = find_value(sev, syslogvals); if(i == -1) i = LOG_ERR; @@ -213,6 +202,7 @@ const char *mode; FILE *fd; int keep_open; + int freefilename; }; static void KRB5_CALLCONV @@ -247,23 +237,27 @@ struct file_data *f = data; if(f->keep_open && f->filename) fclose(f->fd); + if (f->filename && f->freefilename) + free((char *)f->filename); free(data); } static krb5_error_code open_file(krb5_context context, krb5_log_facility *fac, int min, int max, - const char *filename, const char *mode, FILE *f, int keep_open) + const char *filename, const char *mode, FILE *f, int keep_open, + int freefilename) { struct file_data *fd = malloc(sizeof(*fd)); - if(fd == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + if (fd == NULL) { + if (freefilename && filename) + free((char *)filename); + return krb5_enomem(context); } fd->filename = filename; fd->mode = mode; fd->fd = f; fd->keep_open = keep_open; + fd->freefilename = freefilename; return krb5_addlog_func(context, fac, min, max, log_file, close_file, fd); } @@ -277,10 +271,13 @@ int min = 0, max = -1, n; char c; const char *p = orig; +#ifdef _WIN32 + const char *q; +#endif n = sscanf(p, "%d%c%d/", &min, &c, &max); if(n == 2){ - if(c == '/') { + if(ISPATHSEP(c)) { if(min < 0){ max = -min; min = 0; @@ -290,6 +287,12 @@ } } if(n){ +#ifdef _WIN32 + q = strrchr(p, '\\'); + if (q != NULL) + p = q; + else +#endif p = strchr(p, '/'); if(p == NULL) { krb5_set_error_message(context, HEIM_ERR_LOG_PARSE, @@ -299,26 +302,23 @@ p++; } if(strcmp(p, "STDERR") == 0){ - ret = open_file(context, f, min, max, NULL, NULL, stderr, 1); + ret = open_file(context, f, min, max, NULL, NULL, stderr, 1, 0); }else if(strcmp(p, "CONSOLE") == 0){ - ret = open_file(context, f, min, max, "/dev/console", "w", NULL, 0); + ret = open_file(context, f, min, max, "/dev/console", "w", NULL, 0, 0); }else if(strncmp(p, "FILE", 4) == 0 && (p[4] == ':' || p[4] == '=')){ char *fn; FILE *file = NULL; int keep_open = 0; fn = strdup(p + 5); - if(fn == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (fn == NULL) + return krb5_enomem(context); if(p[4] == '='){ int i = open(fn, O_WRONLY | O_CREAT | O_TRUNC | O_APPEND, 0666); if(i < 0) { ret = errno; krb5_set_error_message(context, ret, - N_("open(%s) logile: %s", ""), fn, + N_("open(%s) logfile: %s", ""), fn, strerror(ret)); free(fn); return ret; @@ -336,9 +336,9 @@ } keep_open = 1; } - ret = open_file(context, f, min, max, fn, "a", file, keep_open); + ret = open_file(context, f, min, max, fn, "a", file, keep_open, 1); }else if(strncmp(p, "DEVICE", 6) == 0 && (p[6] == ':' || p[6] == '=')){ - ret = open_file(context, f, min, max, strdup(p + 7), "w", NULL, 0); + ret = open_file(context, f, min, max, strdup(p + 7), "w", NULL, 0, 1); }else if(strncmp(p, "SYSLOG", 6) == 0 && (p[6] == '\0' || p[6] == ':')){ char severity[128] = ""; char facility[128] = ""; @@ -411,7 +411,7 @@ int level, const char *fmt, va_list ap) - __attribute__((format (printf, 5, 0))) + __attribute__ ((__format__ (__printf__, 5, 0))) { char *msg = NULL; @@ -449,7 +449,7 @@ int level, const char *fmt, va_list ap) - __attribute__((format (printf, 4, 0))) + __attribute__ ((__format__ (__printf__, 4, 0))) { return krb5_vlog_msg(context, fac, NULL, level, fmt, ap); } @@ -461,7 +461,7 @@ char **reply, const char *fmt, ...) - __attribute__((format (printf, 5, 6))) + __attribute__ ((__format__ (__printf__, 5, 6))) { va_list ap; krb5_error_code ret; @@ -479,7 +479,7 @@ int level, const char *fmt, ...) - __attribute__((format (printf, 4, 5))) + __attribute__ ((__format__ (__printf__, 4, 5))) { va_list ap; krb5_error_code ret; @@ -495,7 +495,7 @@ int level, const char *fmt, ...) - __attribute__((format (printf, 3, 4))) + __attribute__ ((__format__ (__printf__, 3, 4))) { va_list ap; @@ -507,10 +507,28 @@ va_end(ap); } -krb5_boolean KRB5_LIB_FUNCTION +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL _krb5_have_debug(krb5_context context, int level) { if (context == NULL || context->debug_dest == NULL) return 0 ; return 1; } + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_set_debug_dest(krb5_context context, const char *program, + const char *log_spec) +{ + krb5_error_code ret; + + if (context->debug_dest == NULL) { + ret = krb5_initlog(context, program, &context->debug_dest); + if (ret) + return ret; + } + + ret = krb5_addlog_dest(context, context->debug_dest, log_spec); + if (ret) + return ret; + return 0; +} diff --git a/crypto/heimdal/lib/krb5/mcache.c b/crypto/heimdal/lib/krb5/mcache.c --- a/crypto/heimdal/lib/krb5/mcache.c +++ b/crypto/heimdal/lib/krb5/mcache.c @@ -47,6 +47,7 @@ struct krb5_mcache *next; time_t mtime; krb5_deltat kdc_offset; + HEIMDAL_MUTEX mutex; } krb5_mcache; static HEIMDAL_MUTEX mcc_mutex = HEIMDAL_MUTEX_INITIALIZER; @@ -99,6 +100,7 @@ m->mtime = time(NULL); m->kdc_offset = 0; m->next = mcc_head; + HEIMDAL_MUTEX_init(&(m->mutex)); mcc_head = m; HEIMDAL_MUTEX_unlock(&mcc_mutex); return m; @@ -116,10 +118,12 @@ HEIMDAL_MUTEX_unlock(&mcc_mutex); if (m != NULL) { - m->refcnt++; - (*id)->data.data = m; - (*id)->data.length = sizeof(*m); - return 0; + HEIMDAL_MUTEX_lock(&(m->mutex)); + m->refcnt++; + HEIMDAL_MUTEX_unlock(&(m->mutex)); + (*id)->data.data = m; + (*id)->data.length = sizeof(*m); + return 0; } m = mcc_alloc(res); @@ -155,29 +159,73 @@ return 0; } +static void KRB5_CALLCONV +mcc_destroy_internal(krb5_context context, + krb5_mcache *m) +{ + struct link *l; + + if (m->primary_principal != NULL) { + krb5_free_principal (context, m->primary_principal); + m->primary_principal = NULL; + } + m->dead = 1; + + l = m->creds; + while (l != NULL) { + struct link *old; + + krb5_free_cred_contents (context, &l->cred); + old = l; + l = l->next; + free (old); + } + + m->creds = NULL; + return; +} + static krb5_error_code KRB5_CALLCONV mcc_initialize(krb5_context context, krb5_ccache id, krb5_principal primary_principal) { krb5_mcache *m = MCACHE(id); + krb5_error_code ret = 0; + HEIMDAL_MUTEX_lock(&(m->mutex)); + heim_assert(m->refcnt != 0, "resurection released mcache"); + /* + * It's important to destroy any existing + * creds here, that matches the baheviour + * of all other backends and also the + * MEMORY: backend in MIT. + */ + mcc_destroy_internal(context, m); m->dead = 0; + m->kdc_offset = 0; m->mtime = time(NULL); - return krb5_copy_principal (context, - primary_principal, - &m->primary_principal); + ret = krb5_copy_principal (context, + primary_principal, + &m->primary_principal); + HEIMDAL_MUTEX_unlock(&(m->mutex)); + return ret; } static int mcc_close_internal(krb5_mcache *m) { - if (--m->refcnt != 0) + HEIMDAL_MUTEX_lock(&(m->mutex)); + heim_assert(m->refcnt != 0, "closed dead cache mcache"); + if (--m->refcnt != 0) { + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; - + } if (MISDEAD(m)) { free (m->name); + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 1; } + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; } @@ -185,8 +233,12 @@ mcc_close(krb5_context context, krb5_ccache id) { - if (mcc_close_internal(MCACHE(id))) + krb5_mcache *m = MCACHE(id); + + if (mcc_close_internal(MCACHE(id))) { + HEIMDAL_MUTEX_destroy(&(m->mutex)); krb5_data_free(&id->data); + } return 0; } @@ -195,39 +247,29 @@ krb5_ccache id) { krb5_mcache **n, *m = MCACHE(id); - struct link *l; + HEIMDAL_MUTEX_lock(&mcc_mutex); + HEIMDAL_MUTEX_lock(&(m->mutex)); if (m->refcnt == 0) - krb5_abortx(context, "mcc_destroy: refcnt already 0"); + { + HEIMDAL_MUTEX_unlock(&(m->mutex)); + HEIMDAL_MUTEX_unlock(&mcc_mutex); + krb5_abortx(context, "mcc_destroy: refcnt already 0"); + } if (!MISDEAD(m)) { /* if this is an active mcache, remove it from the linked list, and free all data */ - HEIMDAL_MUTEX_lock(&mcc_mutex); for(n = &mcc_head; n && *n; n = &(*n)->next) { if(m == *n) { *n = m->next; break; } } - HEIMDAL_MUTEX_unlock(&mcc_mutex); - if (m->primary_principal != NULL) { - krb5_free_principal (context, m->primary_principal); - m->primary_principal = NULL; - } - m->dead = 1; - - l = m->creds; - while (l != NULL) { - struct link *old; - - krb5_free_cred_contents (context, &l->cred); - old = l; - l = l->next; - free (old); - } - m->creds = NULL; + mcc_destroy_internal(context, m); } + HEIMDAL_MUTEX_unlock(&(m->mutex)); + HEIMDAL_MUTEX_unlock(&mcc_mutex); return 0; } @@ -240,25 +282,32 @@ krb5_error_code ret; struct link *l; + HEIMDAL_MUTEX_lock(&(m->mutex)); if (MISDEAD(m)) - return ENOENT; + { + HEIMDAL_MUTEX_unlock(&(m->mutex)); + return ENOENT; + } l = malloc (sizeof(*l)); if (l == NULL) { - krb5_set_error_message(context, KRB5_CC_NOMEM, - N_("malloc: out of memory", "")); - return KRB5_CC_NOMEM; + krb5_set_error_message(context, KRB5_CC_NOMEM, + N_("malloc: out of memory", "")); + HEIMDAL_MUTEX_unlock(&(m->mutex)); + return KRB5_CC_NOMEM; } l->next = m->creds; m->creds = l; memset (&l->cred, 0, sizeof(l->cred)); ret = krb5_copy_creds_contents (context, creds, &l->cred); if (ret) { - m->creds = l->next; - free (l); - return ret; + m->creds = l->next; + free (l); + HEIMDAL_MUTEX_unlock(&(m->mutex)); + return ret; } m->mtime = time(NULL); + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; } @@ -268,25 +317,35 @@ krb5_principal *principal) { krb5_mcache *m = MCACHE(id); + krb5_error_code ret = 0; - if (MISDEAD(m) || m->primary_principal == NULL) + HEIMDAL_MUTEX_lock(&(m->mutex)); + if (MISDEAD(m) || m->primary_principal == NULL) { + HEIMDAL_MUTEX_unlock(&(m->mutex)); return ENOENT; - return krb5_copy_principal (context, - m->primary_principal, - principal); + } + ret = krb5_copy_principal (context, + m->primary_principal, + principal); + HEIMDAL_MUTEX_unlock(&(m->mutex)); + return ret; } static krb5_error_code KRB5_CALLCONV mcc_get_first (krb5_context context, - krb5_ccache id, - krb5_cc_cursor *cursor) + krb5_ccache id, + krb5_cc_cursor *cursor) { krb5_mcache *m = MCACHE(id); - if (MISDEAD(m)) + HEIMDAL_MUTEX_lock(&(m->mutex)); + if (MISDEAD(m)) { + HEIMDAL_MUTEX_unlock(&(m->mutex)); return ENOENT; - + } *cursor = m->creds; + + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; } @@ -299,8 +358,12 @@ krb5_mcache *m = MCACHE(id); struct link *l; - if (MISDEAD(m)) + HEIMDAL_MUTEX_lock(&(m->mutex)); + if (MISDEAD(m)) { + HEIMDAL_MUTEX_unlock(&(m->mutex)); return ENOENT; + } + HEIMDAL_MUTEX_unlock(&(m->mutex)); l = *cursor; if (l != NULL) { @@ -328,6 +391,9 @@ { krb5_mcache *m = MCACHE(id); struct link **q, *p; + + HEIMDAL_MUTEX_lock(&(m->mutex)); + for(q = &m->creds, p = *q; p; p = *q) { if(krb5_compare_creds(context, which, mcreds, &p->cred)) { *q = p->next; @@ -337,6 +403,7 @@ } else q = &p->next; } + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; } @@ -358,16 +425,16 @@ struct mcache_iter *iter; iter = calloc(1, sizeof(*iter)); - if (iter == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (iter == NULL) + return krb5_enomem(context); HEIMDAL_MUTEX_lock(&mcc_mutex); iter->cache = mcc_head; - if (iter->cache) + if (iter->cache) { + HEIMDAL_MUTEX_lock(&(iter->cache->mutex)); iter->cache->refcnt++; + HEIMDAL_MUTEX_unlock(&(iter->cache->mutex)); + } HEIMDAL_MUTEX_unlock(&mcc_mutex); *cursor = iter; @@ -387,7 +454,12 @@ HEIMDAL_MUTEX_lock(&mcc_mutex); m = iter->cache; if (m->next) - m->next->refcnt++; + { + HEIMDAL_MUTEX_lock(&(m->next->mutex)); + m->next->refcnt++; + HEIMDAL_MUTEX_unlock(&(m->next->mutex)); + } + iter->cache = m->next; HEIMDAL_MUTEX_unlock(&mcc_mutex); @@ -407,7 +479,7 @@ struct mcache_iter *iter = cursor; if (iter->cache) - mcc_close_internal(iter->cache); + mcc_close_internal(iter->cache); iter->cache = NULL; free(iter); return 0; @@ -431,6 +503,8 @@ } } + HEIMDAL_MUTEX_lock(&(mfrom->mutex)); + HEIMDAL_MUTEX_lock(&(mto->mutex)); /* swap creds */ creds = mto->creds; mto->creds = mfrom->creds; @@ -442,6 +516,8 @@ mto->mtime = mfrom->mtime = time(NULL); + HEIMDAL_MUTEX_unlock(&(mfrom->mutex)); + HEIMDAL_MUTEX_unlock(&(mto->mutex)); HEIMDAL_MUTEX_unlock(&mcc_mutex); mcc_destroy(context, from); @@ -452,18 +528,18 @@ mcc_default_name(krb5_context context, char **str) { *str = strdup("MEMORY:"); - if (*str == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*str == NULL) + return krb5_enomem(context); return 0; } static krb5_error_code KRB5_CALLCONV mcc_lastchange(krb5_context context, krb5_ccache id, krb5_timestamp *mtime) { - *mtime = MCACHE(id)->mtime; + krb5_mcache *m = MCACHE(id); + HEIMDAL_MUTEX_lock(&(m->mutex)); + *mtime = m->mtime; + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; } @@ -471,7 +547,9 @@ mcc_set_kdc_offset(krb5_context context, krb5_ccache id, krb5_deltat kdc_offset) { krb5_mcache *m = MCACHE(id); + HEIMDAL_MUTEX_lock(&(m->mutex)); m->kdc_offset = kdc_offset; + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; } @@ -479,7 +557,9 @@ mcc_get_kdc_offset(krb5_context context, krb5_ccache id, krb5_deltat *kdc_offset) { krb5_mcache *m = MCACHE(id); + HEIMDAL_MUTEX_lock(&(m->mutex)); *kdc_offset = m->kdc_offset; + HEIMDAL_MUTEX_unlock(&(m->mutex)); return 0; } diff --git a/crypto/heimdal/lib/krb5/misc.c b/crypto/heimdal/lib/krb5/misc.c --- a/crypto/heimdal/lib/krb5/misc.c +++ b/crypto/heimdal/lib/krb5/misc.c @@ -48,55 +48,38 @@ size_t i; sp = krb5_storage_emem(); - if (sp == NULL) { - krb5_clear_error_message(context); - return ENOMEM; - } + if (sp == NULL) + return krb5_enomem(context); krb5_storage_set_flags(sp, KRB5_STORAGE_BYTEORDER_LE); ret = krb5_store_int32(sp, self->name.name_type); - if (ret) - goto out; + if (ret) { + krb5_clear_error_message(context); + return ret; + } for (i = 0; i < self->name.name_string.len; i++) { size = strlen(self->name.name_string.val[i]); ssize = krb5_storage_write(sp, self->name.name_string.val[i], size); - if (ssize != (krb5_ssize_t)size) { - ret = ENOMEM; - goto out; - } + if (ssize != (krb5_ssize_t)size) + return krb5_enomem(context); } size = strlen(self->realm); ssize = krb5_storage_write(sp, self->realm, size); - if (ssize != (krb5_ssize_t)size) { - ret = ENOMEM; - goto out; - } + if (ssize != (krb5_ssize_t)size) + return krb5_enomem(context); size = strlen(self->auth); ssize = krb5_storage_write(sp, self->auth, size); - if (ssize != (krb5_ssize_t)size) { - ret = ENOMEM; - goto out; - } + if (ssize != (krb5_ssize_t)size) + return krb5_enomem(context); ret = krb5_storage_to_data(sp, data); krb5_storage_free(sp); return ret; - -out: - krb5_clear_error_message(context); - return ret; -} - -krb5_error_code -krb5_enomem(krb5_context context) -{ - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; } -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_debug_backtrace(krb5_context context) { -#if defined(HAVE_BACKTRACE) && !defined(HEIMDAL_SMALLER) +#if defined(HAVE_BACKTRACE) && defined(HAVE_BACKTRACE_SYMBOLS) && !defined(HEIMDAL_SMALLER) void *stack[128]; char **strs = NULL; int i, frames = backtrace(stack, sizeof(stack) / sizeof(stack[0])); @@ -110,7 +93,7 @@ #endif } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_einval(krb5_context context, const char *func, unsigned long argn) { #ifndef HEIMDAL_SMALLER diff --git a/crypto/heimdal/lib/krb5/mit_glue.c b/crypto/heimdal/lib/krb5/mit_glue.c --- a/crypto/heimdal/lib/krb5/mit_glue.c +++ b/crypto/heimdal/lib/krb5/mit_glue.c @@ -96,7 +96,7 @@ if (data) { *data = malloc(sizeof(**data)); if (*data == NULL) - return ENOMEM; + return krb5_enomem(context); ret = der_copy_octet_string(&cksum->checksum, *data); if (ret) { @@ -167,7 +167,7 @@ { *new = malloc(sizeof(**new)); if (*new == NULL) - return ENOMEM; + return krb5_enomem(context); return copy_Checksum(old, *new); } @@ -378,7 +378,8 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_c_random_make_octets(krb5_context context, krb5_data * data) { - return krb5_generate_random_keyblock(context, data->length, data->data); + krb5_generate_random_block(data->data, data->length); + return 0; } /** diff --git a/crypto/heimdal/lib/krb5/mk_error.c b/crypto/heimdal/lib/krb5/mk_error.c --- a/crypto/heimdal/lib/krb5/mk_error.c +++ b/crypto/heimdal/lib/krb5/mk_error.c @@ -34,15 +34,16 @@ #include "krb5_locl.h" KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_mk_error(krb5_context context, - krb5_error_code error_code, - const char *e_text, - const krb5_data *e_data, - const krb5_principal client, - const krb5_principal server, - time_t *client_time, - int *client_usec, - krb5_data *reply) +krb5_mk_error_ext(krb5_context context, + krb5_error_code error_code, + const char *e_text, + const krb5_data *e_data, + const krb5_principal server, + const PrincipalName *client_name, + const Realm *client_realm, + time_t *client_time, + int *client_usec, + krb5_data *reply) { const char *e_text2 = NULL; KRB_ERROR msg; @@ -78,10 +79,8 @@ static char unspec[] = ""; msg.realm = unspec; } - if(client){ - msg.crealm = &client->realm; - msg.cname = &client->name; - } + msg.crealm = rk_UNCONST(client_realm); + msg.cname = rk_UNCONST(client_name); ASN1_MALLOC_ENCODE(KRB_ERROR, reply->data, reply->length, &msg, &len, ret); if (e_text2) @@ -92,3 +91,27 @@ krb5_abortx(context, "internal error in ASN.1 encoder"); return 0; } + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_mk_error(krb5_context context, + krb5_error_code error_code, + const char *e_text, + const krb5_data *e_data, + const krb5_principal client, + const krb5_principal server, + time_t *client_time, + int *client_usec, + krb5_data *reply) +{ + const PrincipalName *client_name = NULL; + const Realm *client_realm = NULL; + + if (client) { + client_realm = &client->realm; + client_name = &client->name; + } + + return krb5_mk_error_ext(context, error_code, e_text, e_data, + server, client_name, client_realm, + client_time, client_usec, reply); +} diff --git a/crypto/heimdal/lib/krb5/mk_priv.c b/crypto/heimdal/lib/krb5/mk_priv.c --- a/crypto/heimdal/lib/krb5/mk_priv.c +++ b/crypto/heimdal/lib/krb5/mk_priv.c @@ -135,10 +135,8 @@ ret = krb5_data_copy(outbuf, buf + buf_size - len, len); if (ret) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); free(buf); - return ENOMEM; + return krb5_enomem(context); } free (buf); if (auth_context->flags & KRB5_AUTH_CONTEXT_DO_SEQUENCE) diff --git a/crypto/heimdal/lib/krb5/mk_rep.c b/crypto/heimdal/lib/krb5/mk_rep.c --- a/crypto/heimdal/lib/krb5/mk_rep.c +++ b/crypto/heimdal/lib/krb5/mk_rep.c @@ -67,9 +67,7 @@ &body.subkey); if (ret) { free_EncAPRepPart(&body); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } } else body.subkey = NULL; @@ -80,9 +78,8 @@ &auth_context->local_seqnumber); ALLOC(body.seq_number, 1); if (body.seq_number == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); free_EncAPRepPart(&body); - return ENOMEM; + return krb5_enomem(context); } *(body.seq_number) = auth_context->local_seqnumber; } else diff --git a/crypto/heimdal/lib/krb5/mk_req_ext.c b/crypto/heimdal/lib/krb5/mk_req_ext.c --- a/crypto/heimdal/lib/krb5/mk_req_ext.c +++ b/crypto/heimdal/lib/krb5/mk_req_ext.c @@ -33,7 +33,7 @@ #include "krb5_locl.h" -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_mk_req_internal(krb5_context context, krb5_auth_context *auth_context, const krb5_flags ap_req_options, diff --git a/crypto/heimdal/lib/krb5/n-fold-test.c b/crypto/heimdal/lib/krb5/n-fold-test.c --- a/crypto/heimdal/lib/krb5/n-fold-test.c +++ b/crypto/heimdal/lib/krb5/n-fold-test.c @@ -87,7 +87,7 @@ 0x08, 0xa5, 0x08, 0x41, 0x22, 0x9a, 0xd7, 0x98, 0xfa, 0xb9, 0x54, 0x0c, 0x1b} }, - {NULL, 0} + {NULL, 0, {0}} }; int diff --git a/crypto/heimdal/lib/krb5/n-fold.c b/crypto/heimdal/lib/krb5/n-fold.c --- a/crypto/heimdal/lib/krb5/n-fold.c +++ b/crypto/heimdal/lib/krb5/n-fold.c @@ -32,68 +32,79 @@ #include "krb5_locl.h" -static krb5_error_code -rr13(unsigned char *buf, size_t len) +static void +rr13(uint8_t *dst1, uint8_t *dst2, uint8_t *src, size_t len) { - unsigned char *tmp; int bytes = (len + 7) / 8; int i; - if(len == 0) - return 0; - { - const int bits = 13 % len; - const int lbit = len % 8; - - tmp = malloc(bytes); - if (tmp == NULL) - return ENOMEM; - memcpy(tmp, buf, bytes); - if(lbit) { - /* pad final byte with inital bits */ - tmp[bytes - 1] &= 0xff << (8 - lbit); - for(i = lbit; i < 8; i += len) - tmp[bytes - 1] |= buf[0] >> i; - } - for(i = 0; i < bytes; i++) { - int bb; - int b1, s1, b2, s2; - /* calculate first bit position of this byte */ - bb = 8 * i - bits; - while(bb < 0) - bb += len; - /* byte offset and shift count */ - b1 = bb / 8; - s1 = bb % 8; - - if(bb + 8 > bytes * 8) - /* watch for wraparound */ - s2 = (len + 8 - s1) % 8; - else - s2 = 8 - s1; - b2 = (b1 + 1) % bytes; - buf[i] = (tmp[b1] << s1) | (tmp[b2] >> s2); - } - free(tmp); + const int bits = 13 % len; + + for (i = 0; i < bytes; i++) { + int bb; + int b1, s1, b2, s2; + /* calculate first bit position of this byte */ + bb = 8 * i - bits; + while(bb < 0) + bb += len; + /* byte offset and shift count */ + b1 = bb / 8; + s1 = bb % 8; + + if (bb + 8 > bytes * 8) + /* watch for wraparound */ + s2 = (len + 8 - s1) % 8; + else + s2 = 8 - s1; + b2 = (b1 + 1) % bytes; + dst1[i] = (src[b1] << s1) | (src[b2] >> s2); + dst2[i] = dst1[i]; } - return 0; + + return; } -/* Add `b' to `a', both being one's complement numbers. */ +/* + * Add `b' to `a', both being one's complement numbers. + * This function assumes that inputs *a, *b are aligned + * to 4 bytes. + */ static void -add1(unsigned char *a, unsigned char *b, size_t len) +add1(uint8_t *a, uint8_t *b, size_t len) { int i; int carry = 0; - for(i = len - 1; i >= 0; i--){ - int x = a[i] + b[i] + carry; + uint32_t x; + uint32_t left, right; + + for (i = len - 1; (i+1) % 4; i--) { + x = a[i] + b[i] + carry; carry = x > 0xff; a[i] = x & 0xff; } - for(i = len - 1; carry && i >= 0; i--){ - int x = a[i] + carry; + + for (i = len / 4 - 1; i >= 0; i--) { + left = ntohl(((uint32_t *)a)[i]); + right = ntohl(((uint32_t *)b)[i]); + x = left + right + carry; + carry = x < left || x < right; + ((uint32_t *)a)[i] = x; + } + + for (i = len - 1; (i+1) % 4; i--) { + x = a[i] + carry; carry = x > 0xff; a[i] = x & 0xff; } + + for (i = len / 4 - 1; carry && i >= 0; i--) { + left = ((uint32_t *)a)[i]; + x = left + carry; + carry = x < left; + ((uint32_t *)a)[i] = x; + } + + for (i = len / 4 - 1; i >=0; i--) + ((uint32_t *)a)[i] = htonl(((uint32_t *)a)[i]); } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -101,25 +112,25 @@ { /* if len < size we need at most N * len bytes, ie < 2 * size; if len > size we need at most 2 * len */ - krb5_error_code ret = 0; size_t maxlen = 2 * max(size, len); size_t l = 0; - unsigned char *tmp = malloc(maxlen); - unsigned char *buf = malloc(len); + uint8_t *tmp; + uint8_t *tmpbuf; + uint8_t *buf1; + uint8_t *buf2; - if (tmp == NULL || buf == NULL) { - ret = ENOMEM; - goto out; - } + tmp = malloc(maxlen + 2 * len); + if (tmp == NULL) + return ENOMEM; + + buf1 = tmp + maxlen; + buf2 = tmp + maxlen + len; - memcpy(buf, str, len); memset(key, 0, size); + memcpy(buf1, str, len); + memcpy(tmp, buf1, len); do { - memcpy(tmp + l, buf, len); l += len; - ret = rr13(buf, len * 8); - if (ret) - goto out; while(l >= size) { add1(key, tmp, size); l -= size; @@ -127,15 +138,13 @@ break; memmove(tmp, tmp + size, l); } + rr13(tmp + l, buf2, buf1, len * 8); + tmpbuf = buf1; + buf1 = buf2; + buf2 = tmpbuf; } while(l != 0); -out: - if (buf) { - memset(buf, 0, len); - free(buf); - } - if (tmp) { - memset(tmp, 0, maxlen); - free(tmp); - } - return ret; + + memset(tmp, 0, maxlen + 2 * len); + free(tmp); + return 0; } diff --git a/crypto/heimdal/lib/krb5/net_read.c b/crypto/heimdal/lib/krb5/net_read.c --- a/crypto/heimdal/lib/krb5/net_read.c +++ b/crypto/heimdal/lib/krb5/net_read.c @@ -33,6 +33,15 @@ #include "krb5_locl.h" +/** + * Read \a len bytes from socket \a p_fd into buffer \a buf. + * Block until \a len bytes are read or until an error. + * + * @return If successful, the number of bytes read: \a len. + * On end-of-file, 0. + * On error, less than 0 (if single-threaded, the error can be found + * in the errno global variable). + */ KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL krb5_net_read (krb5_context context, void *p_fd, diff --git a/crypto/heimdal/lib/krb5/pac.c b/crypto/heimdal/lib/krb5/pac.c --- a/crypto/heimdal/lib/krb5/pac.c +++ b/crypto/heimdal/lib/krb5/pac.c @@ -120,7 +120,7 @@ uint32_t header_size; /* Guard against integer overflow on 32-bit systems. */ - if (num_buffers > 1000) { + if (num_buffers > UINT32_MAX / PAC_INFO_BUFFER_SIZE) { ret = EINVAL; krb5_set_error_message(context, ret, "PAC has too many buffers"); return ret; @@ -486,7 +486,7 @@ { size_t i; - *types = calloc(p->pac->numbuffers, sizeof(*types)); + *types = calloc(p->pac->numbuffers, sizeof(**types)); if (*types == NULL) { *len = 0; return krb5_enomem(context); @@ -630,6 +630,8 @@ if (cksumtype == (uint32_t)CKSUMTYPE_HMAC_MD5) { ret = HMAC_MD5_any_checksum(context, key, data, datalen, KRB5_KU_OTHER_CKSUM, &cksum); + if (ret) + return ret; } else { ret = krb5_crypto_init(context, key, 0, &crypto); if (ret) @@ -676,11 +678,12 @@ krb5_const_principal principal) { krb5_error_code ret; - krb5_principal p2; uint32_t time1, time2; krb5_storage *sp; uint16_t len; - char *s; + char *s = NULL; + char *principal_string = NULL; + char *logon_string = NULL; sp = krb5_storage_from_readonly_mem((const char *)data->data + logon_name->offset_lo, logon_name->buffersize); @@ -696,7 +699,13 @@ uint64_t t1, t2; t1 = unix2nttime(authtime); t2 = ((uint64_t)time2 << 32) | time1; - if (t1 != t2) { + /* + * When neither the ticket nor the PAC set an explicit authtime, + * both times are zero, but relative to different time scales. + * So we must compare "not set" values without converting to a + * common time reference. + */ + if (t1 != t2 && (t2 != 0 && authtime != 0)) { krb5_storage_free(sp); krb5_set_error_message(context, EINVAL, "PAC timestamp mismatch"); return EINVAL; @@ -745,29 +754,36 @@ return ret; } u8len += 1; /* Add space for NUL */ - s = malloc(u8len); - if (s == NULL) { + logon_string = malloc(u8len); + if (logon_string == NULL) { free(ucs2); return krb5_enomem(context); } - ret = wind_ucs2utf8(ucs2, ucs2len, s, &u8len); + ret = wind_ucs2utf8(ucs2, ucs2len, logon_string, &u8len); free(ucs2); if (ret) { - free(s); + free(logon_string); krb5_set_error_message(context, ret, "Failed to convert to UTF-8"); return ret; } } - ret = krb5_parse_name_flags(context, s, KRB5_PRINCIPAL_PARSE_NO_REALM, &p2); - free(s); - if (ret) + ret = krb5_unparse_name_flags(context, principal, + KRB5_PRINCIPAL_UNPARSE_NO_REALM | + KRB5_PRINCIPAL_UNPARSE_DISPLAY, + &principal_string); + if (ret) { + free(logon_string); return ret; + } - if (krb5_principal_compare_any_realm(context, principal, p2) != TRUE) { + ret = strcmp(logon_string, principal_string); + if (ret != 0) { ret = EINVAL; - krb5_set_error_message(context, ret, "PAC logon name mismatch"); + krb5_set_error_message(context, ret, "PAC logon name [%s] mismatch principal name [%s]", + logon_string, principal_string); } - krb5_free_principal(context, p2); + free(logon_string); + free(principal_string); return ret; out: return ret; @@ -803,7 +819,9 @@ CHECK(ret, krb5_store_uint32(sp, t >> 32), out); ret = krb5_unparse_name_flags(context, principal, - KRB5_PRINCIPAL_UNPARSE_NO_REALM, &s); + KRB5_PRINCIPAL_UNPARSE_NO_REALM | + KRB5_PRINCIPAL_UNPARSE_DISPLAY, + &s); if (ret) goto out; @@ -814,8 +832,8 @@ ret = wind_utf8ucs2_length(s, &ucs2_len); if (ret) { + krb5_set_error_message(context, ret, "Principal %s is not valid UTF-8", s); free(s); - krb5_set_error_message(context, ret, "Failed to count length of UTF-8 string"); return ret; } @@ -826,16 +844,17 @@ } ret = wind_utf8ucs2(s, ucs2, &ucs2_len); - free(s); if (ret) { free(ucs2); - krb5_set_error_message(context, ret, "Failed to convert string to UCS-2"); + krb5_set_error_message(context, ret, "Principal %s is not valid UTF-8", s); + free(s); return ret; - } + } else + free(s); s2_len = (ucs2_len + 1) * 2; s2 = malloc(s2_len); - if (ucs2 == NULL) { + if (s2 == NULL) { free(ucs2); return krb5_enomem(context); } @@ -930,15 +949,14 @@ { krb5_data *copy; + if (pac->server_checksum->buffersize < 4 || + pac->privsvr_checksum->buffersize < 4) + return EINVAL; + ret = krb5_copy_data(context, &pac->data, ©); if (ret) return ret; - if (pac->server_checksum->buffersize < 4) - return EINVAL; - if (pac->privsvr_checksum->buffersize < 4) - return EINVAL; - memset((char *)copy->data + pac->server_checksum->offset_lo + 4, 0, pac->server_checksum->buffersize - 4); @@ -1029,7 +1047,7 @@ return 0; } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_pac_sign(krb5_context context, krb5_pac p, time_t authtime, @@ -1050,6 +1068,40 @@ krb5_data_zero(&logon); + for (i = 0; i < p->pac->numbuffers; i++) { + if (p->pac->buffers[i].type == PAC_SERVER_CHECKSUM) { + if (p->server_checksum == NULL) { + p->server_checksum = &p->pac->buffers[i]; + } + if (p->server_checksum != &p->pac->buffers[i]) { + ret = EINVAL; + krb5_set_error_message(context, ret, + N_("PAC have two server checksums", "")); + goto out; + } + } else if (p->pac->buffers[i].type == PAC_PRIVSVR_CHECKSUM) { + if (p->privsvr_checksum == NULL) { + p->privsvr_checksum = &p->pac->buffers[i]; + } + if (p->privsvr_checksum != &p->pac->buffers[i]) { + ret = EINVAL; + krb5_set_error_message(context, ret, + N_("PAC have two KDC checksums", "")); + goto out; + } + } else if (p->pac->buffers[i].type == PAC_LOGON_NAME) { + if (p->logon_name == NULL) { + p->logon_name = &p->pac->buffers[i]; + } + if (p->logon_name != &p->pac->buffers[i]) { + ret = EINVAL; + krb5_set_error_message(context, ret, + N_("PAC have two logon names", "")); + goto out; + } + } + } + if (p->logon_name == NULL) num++; if (p->server_checksum == NULL) diff --git a/crypto/heimdal/lib/krb5/padata.c b/crypto/heimdal/lib/krb5/padata.c --- a/crypto/heimdal/lib/krb5/padata.c +++ b/crypto/heimdal/lib/krb5/padata.c @@ -49,11 +49,8 @@ PA_DATA *pa; pa = realloc (md->val, (md->len + 1) * sizeof(*md->val)); - if (pa == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (pa == NULL) + return krb5_enomem(context); md->val = pa; pa[md->len].padata_type = type; diff --git a/crypto/heimdal/lib/krb5/pcache.c b/crypto/heimdal/lib/krb5/pcache.c --- a/crypto/heimdal/lib/krb5/pcache.c +++ b/crypto/heimdal/lib/krb5/pcache.c @@ -36,31 +36,35 @@ #endif #include -krb5_error_code -_krb5_load_ccache_plugins(krb5_context context) +/* + * cc_plugin_register_to_context is executed once per krb5_init_context(). + * Its job is to register the plugin's krb5_cc_ops structure with the + * krb5_context. + */ + +static krb5_error_code KRB5_LIB_CALL +cc_plugin_register_to_context(krb5_context context, const void *plug, void *plugctx, void *userctx) { - struct krb5_plugin * plist = NULL; - struct krb5_plugin *p; - krb5_error_code code; + krb5_cc_ops *ccops = (krb5_cc_ops *)plugctx; + krb5_error_code ret; + + if (ccops == NULL || ccops->version < KRB5_CC_OPS_VERSION) + return KRB5_PLUGIN_NO_HANDLE; - code = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, KRB5_PLUGIN_CCACHE, - &plist); - if (code) - return code; + ret = krb5_cc_register(context, ccops, TRUE); + if (ret != 0) + *((krb5_error_code *)userctx) = ret; - for (p = plist; p != NULL; p = _krb5_plugin_get_next(p)) { - krb5_cc_ops * ccops; - krb5_error_code c_load; + return KRB5_PLUGIN_NO_HANDLE; +} - ccops = _krb5_plugin_get_symbol(p); - if (ccops != NULL && ccops->version == KRB5_CC_OPS_VERSION) { - c_load = krb5_cc_register(context, ccops, TRUE); - if (c_load != 0) - code = c_load; - } - } +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_load_ccache_plugins(krb5_context context) +{ + krb5_error_code userctx = 0; - _krb5_plugin_free(plist); + (void)_krb5_plugin_run_f(context, "krb5", KRB5_PLUGIN_CCACHE, + 0, 0, &userctx, cc_plugin_register_to_context); - return code; + return userctx; } diff --git a/crypto/heimdal/lib/krb5/pkinit-ec.c b/crypto/heimdal/lib/krb5/pkinit-ec.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/pkinit-ec.c @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2016 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +#ifdef PKINIT + +/* + * As with the other *-ec.c files in Heimdal, this is a bit of a hack. + * + * The idea is to use OpenSSL for EC because hcrypto doesn't have the + * required functionality at this time. To do this we segregate + * EC-using code into separate source files and then we arrange for them + * to get the OpenSSL headers and not the conflicting hcrypto ones. + * + * Because of auto-generated *-private.h headers, we end up needing to + * make sure various types are defined before we include them, thus the + * strange header include order here. + */ + +#ifdef HAVE_HCRYPTO_W_OPENSSL +#include +#include +#include +#include +#define HEIM_NO_CRYPTO_HDRS +#endif + +/* + * NO_HCRYPTO_POLLUTION -> don't refer to hcrypto type/function names + * that we don't need in this file and which would clash with OpenSSL's + * in ways that are difficult to address in cleaner ways. + * + * In the medium- to long-term what we should do is move all PK in + * Heimdal to the newer EVP interfaces for PK and then nothing outside + * lib/hcrypto should ever have to include OpenSSL headers, and -more + * specifically- the only thing that should ever have to include OpenSSL + * headers is the OpenSSL backend to hcrypto. + */ +#define NO_HCRYPTO_POLLUTION + +#include "krb5_locl.h" +#include +#include +#include +#include +#include +#include +#include + +#include + +krb5_error_code +_krb5_build_authpack_subjectPK_EC(krb5_context context, + krb5_pk_init_ctx ctx, + AuthPack *a) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + krb5_error_code ret; + ECParameters ecp; + unsigned char *p; + size_t size; + int xlen; + + /* copy in public key, XXX find the best curve that the server support or use the clients curve if possible */ + + ecp.element = choice_ECParameters_namedCurve; + ret = der_copy_oid(&asn1_oid_id_ec_group_secp256r1, + &ecp.u.namedCurve); + if (ret) + return ret; + + ALLOC(a->clientPublicValue->algorithm.parameters, 1); + if (a->clientPublicValue->algorithm.parameters == NULL) { + free_ECParameters(&ecp); + return krb5_enomem(context); + } + ASN1_MALLOC_ENCODE(ECParameters, p, xlen, &ecp, &size, ret); + free_ECParameters(&ecp); + if (ret) + return ret; + if ((int)size != xlen) + krb5_abortx(context, "asn1 internal error"); + + a->clientPublicValue->algorithm.parameters->data = p; + a->clientPublicValue->algorithm.parameters->length = size; + + /* copy in public key */ + + ret = der_copy_oid(&asn1_oid_id_ecPublicKey, + &a->clientPublicValue->algorithm.algorithm); + if (ret) + return ret; + + ctx->u.eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); + if (ctx->u.eckey == NULL) + return krb5_enomem(context); + + ret = EC_KEY_generate_key(ctx->u.eckey); + if (ret != 1) + return EINVAL; + + xlen = i2o_ECPublicKey(ctx->u.eckey, NULL); + if (xlen <= 0) + return EINVAL; + + p = malloc(xlen); + if (p == NULL) + return krb5_enomem(context); + + a->clientPublicValue->subjectPublicKey.data = p; + + xlen = i2o_ECPublicKey(ctx->u.eckey, &p); + if (xlen <= 0) { + a->clientPublicValue->subjectPublicKey.data = NULL; + free(p); + return EINVAL; + } + + a->clientPublicValue->subjectPublicKey.length = xlen * 8; + + return 0; + + /* XXX verify that this is right with RFC3279 */ +#else + krb5_set_error_message(context, ENOTSUP, + N_("PKINIT: ECDH not supported", "")); + return ENOTSUP; +#endif +} + +krb5_error_code +_krb5_pk_rd_pa_reply_ecdh_compute_key(krb5_context context, + krb5_pk_init_ctx ctx, + const unsigned char *in, + size_t in_sz, + unsigned char **out, + int *out_sz) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + krb5_error_code ret = 0; + int dh_gen_keylen; + + const EC_GROUP *group; + EC_KEY *public = NULL; + + group = EC_KEY_get0_group(ctx->u.eckey); + + public = EC_KEY_new(); + if (public == NULL) + return krb5_enomem(context); + if (EC_KEY_set_group(public, group) != 1) { + EC_KEY_free(public); + return krb5_enomem(context); + } + + if (o2i_ECPublicKey(&public, &in, in_sz) == NULL) { + EC_KEY_free(public); + ret = KRB5KRB_ERR_GENERIC; + krb5_set_error_message(context, ret, + N_("PKINIT: Can't parse ECDH public key", "")); + return ret; + } + + *out_sz = (EC_GROUP_get_degree(group) + 7) / 8; + if (*out_sz < 0) + return EOVERFLOW; + *out = malloc(*out_sz); + if (*out == NULL) { + EC_KEY_free(public); + return krb5_enomem(context); + } + dh_gen_keylen = ECDH_compute_key(*out, *out_sz, + EC_KEY_get0_public_key(public), + ctx->u.eckey, NULL); + EC_KEY_free(public); + if (dh_gen_keylen <= 0) { + ret = KRB5KRB_ERR_GENERIC; + dh_gen_keylen = 0; + krb5_set_error_message(context, ret, + N_("PKINIT: Can't compute ECDH public key", "")); + free(*out); + *out = NULL; + *out_sz = 0; + } + *out_sz = dh_gen_keylen; + + return ret; +#else + krb5_set_error_message(context, ENOTSUP, + N_("PKINIT: ECDH not supported", "")); + return ENOTSUP; +#endif +} + +void +_krb5_pk_eckey_free(void *eckey) +{ +#ifdef HAVE_HCRYPTO_W_OPENSSL + EC_KEY_free(eckey); +#endif +} + +#else + +static char lib_krb5_pkinit_ec_c = '\0'; + +#endif diff --git a/crypto/heimdal/lib/krb5/pkinit.c b/crypto/heimdal/lib/krb5/pkinit.c --- a/crypto/heimdal/lib/krb5/pkinit.c +++ b/crypto/heimdal/lib/krb5/pkinit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003 - 2007 Kungliga Tekniska Högskolan + * Copyright (c) 2003 - 2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -58,34 +58,13 @@ hx509_cert cert; }; -struct krb5_pk_init_ctx_data { - struct krb5_pk_identity *id; - enum { USE_RSA, USE_DH, USE_ECDH } keyex; - union { - DH *dh; -#ifdef HAVE_OPENSSL - EC_KEY *eckey; -#endif - } u; - krb5_data *clientDHNonce; - struct krb5_dh_moduli **m; - hx509_peer_info peer; - enum krb5_pk_type type; - unsigned int require_binding:1; - unsigned int require_eku:1; - unsigned int require_krbtgt_otherName:1; - unsigned int require_hostname_match:1; - unsigned int trustedCertifiers:1; - unsigned int anonymous:1; -}; - static void pk_copy_error(krb5_context context, hx509_context hx509ctx, int hxret, const char *fmt, ...) - __attribute__ ((format (printf, 4, 5))); + __attribute__ ((__format__ (__printf__, 4, 5))); /* * @@ -101,7 +80,7 @@ } static krb5_error_code -BN_to_integer(krb5_context context, const BIGNUM *bn, heim_integer *integer) +BN_to_integer(krb5_context context, BIGNUM *bn, heim_integer *integer) { integer->length = BN_num_bytes(bn); integer->data = malloc(integer->length); @@ -134,7 +113,6 @@ struct krb5_dh_moduli **moduli) { const struct krb5_dh_moduli *m; - BIGNUM *p, *g, *q; if (bits == 0) { m = moduli[1]; /* XXX */ @@ -156,22 +134,15 @@ m = moduli[i]; } - p = integer_to_BN(context, "p", &m->p); - g = integer_to_BN(context, "g", &m->g); - q = integer_to_BN(context, "q", &m->q); - if (p == NULL || g == NULL || q == NULL) { - BN_free(p); - BN_free(g); - BN_free(q); + dh->p = integer_to_BN(context, "p", &m->p); + if (dh->p == NULL) + return ENOMEM; + dh->g = integer_to_BN(context, "g", &m->g); + if (dh->g == NULL) + return ENOMEM; + dh->q = integer_to_BN(context, "q", &m->q); + if (dh->q == NULL) return ENOMEM; - } - - if (DH_set0_pqg(dh, p, q, g) != 1) { - BN_free(p); - BN_free(g); - BN_free(q); - return EINVAL; - } return 0; } @@ -191,10 +162,10 @@ hx509_query *q, hx509_cert *cert) { struct certfind cf[4] = { - { "MobileMe EKU" }, - { "PKINIT EKU" }, - { "MS EKU" }, - { "any (or no)" } + { "MobileMe EKU", NULL }, + { "PKINIT EKU", NULL }, + { "MS EKU", NULL }, + { "any (or no)", NULL } }; int ret = HX509_CERT_NOT_FOUND; size_t i, start = 1; @@ -336,8 +307,10 @@ id.issuerAndSerialNumber->length, &iasn, &size, ret); free_IssuerAndSerialNumber(&iasn); - if (ret) + if (ret) { + free_ExternalPrincipalIdentifier(&id); return ret; + } if (id.issuerAndSerialNumber->length != size) abort(); } @@ -407,9 +380,7 @@ ALLOC(a->pkAuthenticator.paChecksum, 1); if (a->pkAuthenticator.paChecksum == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } ret = krb5_data_copy(a->pkAuthenticator.paChecksum, @@ -444,11 +415,8 @@ return ret; ctx->u.dh = DH_new(); - if (ctx->u.dh == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ctx->u.dh == NULL) + return krb5_enomem(context); ret = select_dh_group(context, ctx->u.dh, dh_min_bits, ctx->m); if (ret) @@ -485,7 +453,6 @@ if (ctx->keyex == USE_DH) { DH *dh = ctx->u.dh; - const BIGNUM *p, *g, *q, *pub_key; DomainParameters dp; heim_integer dh_pub_key; @@ -496,18 +463,22 @@ memset(&dp, 0, sizeof(dp)); - DH_get0_pqg(dh, &p, &q, &g); - ret = BN_to_integer(context, p, &dp.p); + ret = BN_to_integer(context, dh->p, &dp.p); if (ret) { free_DomainParameters(&dp); return ret; } - ret = BN_to_integer(context, g, &dp.g); + ret = BN_to_integer(context, dh->g, &dp.g); if (ret) { free_DomainParameters(&dp); return ret; } - ret = BN_to_integer(context, q, &dp.q); + dp.q = calloc(1, sizeof(*dp.q)); + if (dp.q == NULL) { + free_DomainParameters(&dp); + return ENOMEM; + } + ret = BN_to_integer(context, dh->q, dp.q); if (ret) { free_DomainParameters(&dp); return ret; @@ -532,8 +503,7 @@ if (size != a->clientPublicValue->algorithm.parameters->length) krb5_abortx(context, "Internal ASN1 encoder error"); - DH_get0_key(dh, &pub_key, NULL); - ret = BN_to_integer(context, pub_key, &dh_pub_key); + ret = BN_to_integer(context, dh->pub_key, &dh_pub_key); if (ret) return ret; @@ -544,74 +514,14 @@ return ret; if (size != dhbuf.length) krb5_abortx(context, "asn1 internal error"); + a->clientPublicValue->subjectPublicKey.length = dhbuf.length * 8; + a->clientPublicValue->subjectPublicKey.data = dhbuf.data; } else if (ctx->keyex == USE_ECDH) { -#ifdef HAVE_OPENSSL - ECParameters ecp; - unsigned char *p; - int xlen; - - /* copy in public key, XXX find the best curve that the server support or use the clients curve if possible */ - - ecp.element = choice_ECParameters_namedCurve; - ret = der_copy_oid(&asn1_oid_id_ec_group_secp256r1, - &ecp.u.namedCurve); - if (ret) - return ret; - - ALLOC(a->clientPublicValue->algorithm.parameters, 1); - if (a->clientPublicValue->algorithm.parameters == NULL) { - free_ECParameters(&ecp); - return ENOMEM; - } - ASN1_MALLOC_ENCODE(ECParameters, p, xlen, &ecp, &size, ret); - free_ECParameters(&ecp); - if (ret) - return ret; - if ((int)size != xlen) - krb5_abortx(context, "asn1 internal error"); - - a->clientPublicValue->algorithm.parameters->data = p; - a->clientPublicValue->algorithm.parameters->length = size; - - /* copy in public key */ - - ret = der_copy_oid(&asn1_oid_id_ecPublicKey, - &a->clientPublicValue->algorithm.algorithm); - if (ret) - return ret; - - ctx->u.eckey = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); - if (ctx->u.eckey == NULL) - return ENOMEM; - - ret = EC_KEY_generate_key(ctx->u.eckey); - if (ret != 1) - return EINVAL; - - /* encode onto dhkey */ - - xlen = i2o_ECPublicKey(ctx->u.eckey, NULL); - if (xlen <= 0) - abort(); - - dhbuf.data = malloc(xlen); - if (dhbuf.data == NULL) - abort(); - dhbuf.length = xlen; - p = dhbuf.data; - - xlen = i2o_ECPublicKey(ctx->u.eckey, &p); - if (xlen <= 0) - abort(); - - /* XXX verify that this is right with RFC3279 */ -#else - return EINVAL; -#endif + ret = _krb5_build_authpack_subjectPK_EC(context, ctx, a); + if (ret) + return ret; } else krb5_abortx(context, "internal error"); - a->clientPublicValue->subjectPublicKey.length = dhbuf.length * 8; - a->clientPublicValue->subjectPublicKey.data = dhbuf.data; } { @@ -774,9 +684,7 @@ req.trustedCertifiers = calloc(1, sizeof(*req.trustedCertifiers)); if (req.trustedCertifiers == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); free_PA_PK_AS_REQ(&req); goto out; } @@ -876,6 +784,8 @@ req_body->realm, "pkinit_require_krbtgt_otherName", NULL); + if (ic_flags & KRB5_INIT_CREDS_PKINIT_NO_KRBTGT_OTHERNAME_CHECK) + ctx->require_krbtgt_otherName = FALSE; ctx->require_hostname_match = krb5_config_get_bool_default(context, NULL, @@ -991,9 +901,7 @@ *key = malloc (sizeof (**key)); if (*key == NULL) { free_ReplyKeyPack_Win2k(&key_pack); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } ret = copy_EncryptionKey(&key_pack.replyKey, *key); @@ -1056,9 +964,7 @@ *key = malloc (sizeof (**key)); if (*key == NULL) { free_ReplyKeyPack(&key_pack); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } ret = copy_EncryptionKey(&key_pack.replyKey, *key); @@ -1095,6 +1001,7 @@ if (ctx->require_krbtgt_otherName) { hx509_octet_string_list list; size_t i; + int matched = 0; ret = hx509_cert_find_subjectAltName_otherName(context->hx509ctx, host->cert, @@ -1109,7 +1016,14 @@ return ret; } - for (i = 0; i < list.len; i++) { + /* + * subjectAltNames are multi-valued, and a single KDC may serve + * multiple realms. The SAN validation here must accept + * the KDC's cert if *any* of the SANs match the expected KDC. + * It is OK for *some* of the SANs to not match, provided at least + * one does. + */ + for (i = 0; matched == 0 && i < list.len; i++) { KRB5PrincipalName r; ret = decode_KRB5PrincipalName(list.val[i].data, @@ -1125,22 +1039,22 @@ break; } - if (r.principalName.name_string.len != 2 || - strcmp(r.principalName.name_string.val[0], KRB5_TGS_NAME) != 0 || - strcmp(r.principalName.name_string.val[1], realm) != 0 || - strcmp(r.realm, realm) != 0) - { - ret = KRB5_KDC_ERR_INVALID_CERTIFICATE; - krb5_set_error_message(context, ret, - N_("KDC have wrong realm name in " - "the certificate", "")); - } + if (r.principalName.name_string.len == 2 && + strcmp(r.principalName.name_string.val[0], KRB5_TGS_NAME) == 0 + && strcmp(r.principalName.name_string.val[1], realm) == 0 + && strcmp(r.realm, realm) == 0) + matched = 1; free_KRB5PrincipalName(&r); - if (ret) - break; } hx509_free_octet_string_list(&list); + if (matched == 0) { + ret = KRB5_KDC_ERR_INVALID_CERTIFICATE; + /* XXX: Lost in translation... */ + krb5_set_error_message(context, ret, + N_("KDC have wrong realm name in " + "the certificate", "")); + } } if (ret) return ret; @@ -1221,8 +1135,10 @@ ret = der_put_length_and_tag (ptr + ph - 1, ph, content.length, ASN1_C_UNIV, CONS, UT_Sequence, &l); - if (ret) + if (ret) { + free(ptr); return ret; + } free(content.data); content.data = ptr; content.length += ph; @@ -1306,6 +1222,98 @@ return ret; } +/* + * RFC 8062 section 7: + * + * The client then decrypts the KDC contribution key and verifies that + * the ticket session key in the returned ticket is the combined key of + * the KDC contribution key and the reply key. + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_pk_kx_confirm(krb5_context context, + krb5_pk_init_ctx ctx, + krb5_keyblock *reply_key, + krb5_keyblock *session_key, + PA_DATA *pa_pkinit_kx) +{ + krb5_error_code ret; + EncryptedData ed; + krb5_keyblock ck, sk_verify; + krb5_crypto ck_crypto = NULL; + krb5_crypto rk_crypto = NULL; + size_t len; + krb5_data data; + krb5_data p1 = { sizeof("PKINIT") - 1, "PKINIT" }; + krb5_data p2 = { sizeof("KEYEXCHANGE") - 1, "KEYEXCHANGE" }; + + heim_assert(ctx != NULL, "PKINIT context is non-NULL"); + heim_assert(reply_key != NULL, "reply key is non-NULL"); + heim_assert(session_key != NULL, "session key is non-NULL"); + + /* PA-PKINIT-KX is optional unless anonymous */ + if (pa_pkinit_kx == NULL) + return ctx->anonymous ? KRB5_KDCREP_MODIFIED : 0; + + memset(&ed, 0, sizeof(ed)); + krb5_keyblock_zero(&ck); + krb5_keyblock_zero(&sk_verify); + krb5_data_zero(&data); + + ret = decode_EncryptedData(pa_pkinit_kx->padata_value.data, + pa_pkinit_kx->padata_value.length, + &ed, &len); + if (ret) + goto out; + + if (len != pa_pkinit_kx->padata_value.length) { + ret = KRB5_KDCREP_MODIFIED; + goto out; + } + + ret = krb5_crypto_init(context, reply_key, 0, &rk_crypto); + if (ret) + goto out; + + ret = krb5_decrypt_EncryptedData(context, rk_crypto, + KRB5_KU_PA_PKINIT_KX, + &ed, &data); + if (ret) + goto out; + + ret = decode_EncryptionKey(data.data, data.length, + &ck, &len); + if (ret) + goto out; + + ret = krb5_crypto_init(context, &ck, 0, &ck_crypto); + if (ret) + goto out; + + ret = krb5_crypto_fx_cf2(context, ck_crypto, rk_crypto, + &p1, &p2, session_key->keytype, + &sk_verify); + if (ret) + goto out; + + if (sk_verify.keytype != session_key->keytype || + krb5_data_ct_cmp(&sk_verify.keyvalue, &session_key->keyvalue) != 0) { + ret = KRB5_KDCREP_MODIFIED; + goto out; + } + +out: + free_EncryptedData(&ed); + krb5_free_keyblock_contents(context, &ck); + krb5_free_keyblock_contents(context, &sk_verify); + if (ck_crypto) + krb5_crypto_destroy(context, ck_crypto); + if (rk_crypto) + krb5_crypto_destroy(context, rk_crypto); + krb5_data_free(&data); + + return ret; +} + static krb5_error_code pk_rd_pa_reply_dh(krb5_context context, const heim_octet_string *indata, @@ -1433,8 +1441,7 @@ dh_gen_key = malloc(size); if (dh_gen_key == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } @@ -1453,53 +1460,11 @@ } } else { -#ifdef HAVE_OPENSSL - const EC_GROUP *group; - EC_KEY *public = NULL; - - group = EC_KEY_get0_group(ctx->u.eckey); - - public = EC_KEY_new(); - if (public == NULL) { - ret = ENOMEM; - goto out; - } - if (EC_KEY_set_group(public, group) != 1) { - EC_KEY_free(public); - ret = ENOMEM; - goto out; - } - - if (o2i_ECPublicKey(&public, &p, size) == NULL) { - EC_KEY_free(public); - ret = KRB5KRB_ERR_GENERIC; - krb5_set_error_message(context, ret, - N_("PKINIT: Can't parse ECDH public key", "")); - goto out; - } - - size = (EC_GROUP_get_degree(group) + 7) / 8; - dh_gen_key = malloc(size); - if (dh_gen_key == NULL) { - EC_KEY_free(public); - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); - goto out; - } - dh_gen_keylen = ECDH_compute_key(dh_gen_key, size, - EC_KEY_get0_public_key(public), ctx->u.eckey, NULL); - EC_KEY_free(public); - if (dh_gen_keylen == -1) { - ret = KRB5KRB_ERR_GENERIC; - dh_gen_keylen = 0; - krb5_set_error_message(context, ret, - N_("PKINIT: Can't compute ECDH public key", "")); - goto out; - } -#else - ret = EINVAL; -#endif + ret = _krb5_pk_rd_pa_reply_ecdh_compute_key(context, ctx, p, + size, &dh_gen_key, + &dh_gen_keylen); + if (ret) + goto out; } if (dh_gen_keylen <= 0) { @@ -1512,9 +1477,7 @@ *key = malloc (sizeof (**key)); if (*key == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } @@ -1866,11 +1829,8 @@ /* load cert */ id = calloc(1, sizeof(*id)); - if (id == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (id == NULL) + return krb5_enomem(context); if (user_id) { hx509_lock lock; @@ -2039,7 +1999,7 @@ return 0; } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_parse_moduli_line(krb5_context context, const char *file, int lineno, @@ -2053,11 +2013,8 @@ *m = NULL; m1 = calloc(1, sizeof(*m1)); - if (m1 == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (m1 == NULL) + return krb5_enomem(context); while (isspace((unsigned char)*p)) p++; @@ -2076,8 +2033,7 @@ } m1->name = strdup(p1); if (m1->name == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memeory", "")); + ret = krb5_enomem(context); goto out; } @@ -2119,7 +2075,7 @@ return ret; } -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_free_moduli(struct krb5_dh_moduli **moduli) { int i; @@ -2187,7 +2143,7 @@ "EF15E5FB" "4AAC0B8C" "1CCAA4BE" "754AB572" "8AE9130C" "4C7D0288" "0AB9472D" "45565534" "7FFFFFFF" "FFFFFFFF"; -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_parse_moduli(krb5_context context, const char *file, struct krb5_dh_moduli ***moduli) { @@ -2201,11 +2157,8 @@ *moduli = NULL; m = calloc(1, sizeof(m[0]) * 3); - if (m == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (m == NULL) + return krb5_enomem(context); strlcpy(buf, default_moduli_rfc3526_MODP_group14, sizeof(buf)); ret = _krb5_parse_moduli_line(context, "builtin", 1, buf, &m[0]); @@ -2231,7 +2184,7 @@ { char * exp_file; - if (_krb5_expand_path_tokens(context, file, &exp_file) == 0) { + if (_krb5_expand_path_tokens(context, file, 1, &exp_file) == 0) { f = fopen(exp_file, "r"); krb5_xfree(exp_file); } else { @@ -2257,9 +2210,7 @@ m2 = realloc(m, (n + 2) * sizeof(m[0])); if (m2 == NULL) { _krb5_free_moduli(m); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } m = m2; @@ -2281,7 +2232,7 @@ return 0; } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_dh_group_ok(krb5_context context, unsigned long bits, heim_integer *p, heim_integer *g, heim_integer *q, struct krb5_dh_moduli **moduli, @@ -2335,10 +2286,8 @@ case USE_RSA: break; case USE_ECDH: -#ifdef HAVE_OPENSSL if (ctx->u.eckey) - EC_KEY_free(ctx->u.eckey); -#endif + _krb5_pk_eckey_free(ctx->u.eckey); break; } if (ctx->id) { @@ -2387,11 +2336,8 @@ opt->opt_private->pk_init_ctx = calloc(1, sizeof(*opt->opt_private->pk_init_ctx)); - if (opt->opt_private->pk_init_ctx == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (opt->opt_private->pk_init_ctx == NULL) + return krb5_enomem(context); opt->opt_private->pk_init_ctx->require_binding = 0; opt->opt_private->pk_init_ctx->require_eku = 1; opt->opt_private->pk_init_ctx->require_krbtgt_otherName = 1; @@ -2417,7 +2363,7 @@ x509_anchors = anchors; } - if (flags & 4) + if (flags & KRB5_GIC_OPT_PKINIT_ANONYMOUS) opt->opt_private->pk_init_ctx->anonymous = 1; ret = _krb5_pk_load_id(context, @@ -2434,6 +2380,11 @@ opt->opt_private->pk_init_ctx = NULL; return ret; } + if (flags & KRB5_GIC_OPT_PKINIT_BTMM) + opt->opt_private->pk_init_ctx->id->flags |= PKINIT_BTMM; + + if (principal && krb5_principal_is_lkdc(context, principal)) + opt->opt_private->pk_init_ctx->id->flags |= PKINIT_BTMM; if (opt->opt_private->pk_init_ctx->id->certs) { _krb5_pk_set_user_id(context, @@ -2443,7 +2394,7 @@ } else opt->opt_private->pk_init_ctx->id->cert = NULL; - if ((flags & 2) == 0) { + if ((flags & KRB5_GIC_OPT_PKINIT_USE_ENCKEY) == 0) { hx509_context hx509ctx = context->hx509ctx; hx509_cert cert = opt->opt_private->pk_init_ctx->id->cert; diff --git a/crypto/heimdal/lib/krb5/plugin.c b/crypto/heimdal/lib/krb5/plugin.c --- a/crypto/heimdal/lib/krb5/plugin.c +++ b/crypto/heimdal/lib/krb5/plugin.c @@ -61,67 +61,6 @@ static HEIMDAL_MUTEX plugin_mutex = HEIMDAL_MUTEX_INITIALIZER; static struct plugin *registered = NULL; -static int plugins_needs_scan = 1; - -static const char *sysplugin_dirs[] = { - LIBDIR "/plugin/krb5", -#ifdef __APPLE__ - "/System/Library/KerberosPlugins/KerberosFrameworkPlugins", -#endif - NULL -}; - -/* - * - */ - -void * -_krb5_plugin_get_symbol(struct krb5_plugin *p) -{ - return p->symbol; -} - -struct krb5_plugin * -_krb5_plugin_get_next(struct krb5_plugin *p) -{ - return p->next; -} - -/* - * - */ - -#ifdef HAVE_DLOPEN - -static krb5_error_code -loadlib(krb5_context context, char *path) -{ - struct plugin *e; - - e = calloc(1, sizeof(*e)); - if (e == NULL) { - krb5_set_error_message(context, ENOMEM, "malloc: out of memory"); - free(path); - return ENOMEM; - } - -#ifndef RTLD_LAZY -#define RTLD_LAZY 0 -#endif -#ifndef RTLD_LOCAL -#define RTLD_LOCAL 0 -#endif - e->type = DSO; - /* ignore error from dlopen, and just keep it as negative cache entry */ - e->u.dso.dsohandle = dlopen(path, RTLD_LOCAL|RTLD_LAZY); - e->u.dso.path = path; - - e->next = registered; - registered = e; - - return 0; -} -#endif /* HAVE_DLOPEN */ /** * Register a plugin symbol name of specific type. @@ -179,128 +118,6 @@ return 0; } -static int -is_valid_plugin_filename(const char * n) -{ - if (n[0] == '.' && (n[1] == '\0' || (n[1] == '.' && n[2] == '\0'))) - return 0; - -#ifdef _WIN32 - /* On Windows, we only attempt to load .dll files as plug-ins. */ - { - const char * ext; - - ext = strrchr(n, '.'); - if (ext == NULL) - return 0; - - return !stricmp(ext, ".dll"); - } -#else - return 1; -#endif -} - -static void -trim_trailing_slash(char * path) -{ - size_t l; - - l = strlen(path); - while (l > 0 && (path[l - 1] == '/' -#ifdef BACKSLASH_PATH_DELIM - || path[l - 1] == '\\' -#endif - )) { - path[--l] = '\0'; - } -} - -static krb5_error_code -load_plugins(krb5_context context) -{ - struct plugin *e; - krb5_error_code ret; - char **dirs = NULL, **di; - struct dirent *entry; - char *path; - DIR *d = NULL; - - if (!plugins_needs_scan) - return 0; - plugins_needs_scan = 0; - -#ifdef HAVE_DLOPEN - - dirs = krb5_config_get_strings(context, NULL, "libdefaults", - "plugin_dir", NULL); - if (dirs == NULL) - dirs = rk_UNCONST(sysplugin_dirs); - - for (di = dirs; *di != NULL; di++) { - char * dir = *di; - -#ifdef KRB5_USE_PATH_TOKENS - if (_krb5_expand_path_tokens(context, *di, &dir)) - goto next_dir; -#endif - - trim_trailing_slash(dir); - - d = opendir(dir); - - if (d == NULL) - goto next_dir; - - rk_cloexec_dir(d); - - while ((entry = readdir(d)) != NULL) { - char *n = entry->d_name; - - /* skip . and .. */ - if (!is_valid_plugin_filename(n)) - continue; - - path = NULL; - ret = 0; -#ifdef __APPLE__ - { /* support loading bundles on MacOS */ - size_t len = strlen(n); - if (len > 7 && strcmp(&n[len - 7], ".bundle") == 0) - ret = asprintf(&path, "%s/%s/Contents/MacOS/%.*s", dir, n, (int)(len - 7), n); - } -#endif - if (ret < 0 || path == NULL) - ret = asprintf(&path, "%s/%s", dir, n); - - if (ret < 0 || path == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, "malloc: out of memory"); - return ret; - } - - /* check if already tried */ - for (e = registered; e != NULL; e = e->next) - if (e->type == DSO && strcmp(e->u.dso.path, path) == 0) - break; - if (e) { - free(path); - } else { - loadlib(context, path); /* store or frees path */ - } - } - closedir(d); - - next_dir: - if (dir != *di) - free(dir); - } - if (dirs != rk_UNCONST(sysplugin_dirs)) - krb5_config_free_strings(dirs); -#endif /* HAVE_DLOPEN */ - return 0; -} - static krb5_error_code add_symbol(krb5_context context, struct krb5_plugin **list, void *symbol) { @@ -317,7 +134,7 @@ return 0; } -krb5_error_code +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_plugin_find(krb5_context context, enum krb5_plugin_type type, const char *name, @@ -330,8 +147,6 @@ HEIMDAL_MUTEX_lock(&plugin_mutex); - load_plugins(context); - for (ret = 0, e = registered; e != NULL; e = e->next) { switch(e->type) { case DSO: { @@ -366,7 +181,7 @@ return 0; } -void +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_plugin_free(struct krb5_plugin *list) { struct krb5_plugin *next; @@ -404,8 +219,57 @@ dlclose(p->dsohandle); } +static char * +resolve_origin(const char *di) +{ +#ifdef HAVE_DLADDR + Dl_info dl_info; + const char *dname; + char *path, *p; +#endif + + if (strncmp(di, "$ORIGIN/", sizeof("$ORIGIN/") - 1) && + strcmp(di, "$ORIGIN")) + return strdup(di); + +#ifndef HAVE_DLADDR + return strdup(LIBDIR "/plugin/krb5"); +#else /* !HAVE_DLADDR */ + di += sizeof("$ORIGIN") - 1; + + if (dladdr(_krb5_load_plugins, &dl_info) == 0) + return strdup(LIBDIR "/plugin/krb5"); + + dname = dl_info.dli_fname; +#ifdef _WIN32 + p = strrchr(dname, '\\'); + if (p == NULL) +#endif + p = strrchr(dname, '/'); + if (p) { + if (asprintf(&path, "%.*s%s", (int) (p - dname), dname, di) == -1) + return NULL; + } else { + if (asprintf(&path, "%s%s", dname, di) == -1) + return NULL; + } + + return path; +#endif /* !HAVE_DLADDR */ +} + -void +/** + * Load plugins (new system) for the given module @name (typically + * "krb5") from the given directory @paths. + * + * Inputs: + * + * @context A krb5_context + * @name Name of plugin module (typically "krb5") + * @paths Array of directory paths where to look + */ +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_load_plugins(krb5_context context, const char *name, const char **paths) { #ifdef HAVE_DLOPEN @@ -414,7 +278,16 @@ struct dirent *entry; krb5_error_code ret; const char **di; + char *dirname = NULL; DIR *d; +#ifdef _WIN32 + const char * plugin_prefix; + size_t plugin_prefix_len; + + if (asprintf(&plugin_prefix, "plugin_%s_", name) == -1) + return; + plugin_prefix_len = (plugin_prefix ? strlen(plugin_prefix) : 0); +#endif HEIMDAL_MUTEX_lock(&plugin_mutex); @@ -434,12 +307,16 @@ heim_release(s); return; } - heim_dict_add_value(modules, s, module); + heim_dict_set_value(modules, s, module); } heim_release(s); for (di = paths; *di != NULL; di++) { - d = opendir(*di); + free(dirname); + dirname = resolve_origin(*di); + if (dirname == NULL) + continue; + d = opendir(dirname); if (d == NULL) continue; rk_cloexec_dir(d); @@ -455,15 +332,35 @@ continue; ret = 0; +#ifdef _WIN32 + /* + * On Windows, plugins must be loaded from the same directory as + * heimdal.dll (typically the assembly directory) and must have + * the name form "plugin__.dll". + */ + { + char *ext; + + if (strnicmp(n, plugin_prefix, plugin_prefix_len)) + continue; + ext = strrchr(n, '.'); + if (ext == NULL || stricmp(ext, ".dll")) + continue; + + ret = asprintf(&path, "%s\\%s", dirname, n); + if (ret < 0 || path == NULL) + continue; + } +#endif #ifdef __APPLE__ { /* support loading bundles on MacOS */ size_t len = strlen(n); if (len > 7 && strcmp(&n[len - 7], ".bundle") == 0) - ret = asprintf(&path, "%s/%s/Contents/MacOS/%.*s", *di, n, (int)(len - 7), n); + ret = asprintf(&path, "%s/%s/Contents/MacOS/%.*s", dirname, n, (int)(len - 7), n); } #endif if (ret < 0 || path == NULL) - ret = asprintf(&path, "%s/%s", *di, n); + ret = asprintf(&path, "%s/%s", dirname, n); if (ret < 0 || path == NULL) continue; @@ -481,24 +378,32 @@ if (p) p->dsohandle = dlopen(path, RTLD_LOCAL|RTLD_LAZY); - if (p->dsohandle) { + if (p && p->dsohandle) { p->path = heim_retain(spath); p->names = heim_dict_create(11); - heim_dict_add_value(module, spath, p); + heim_dict_set_value(module, spath, p); } } + heim_release(p); heim_release(spath); - heim_release(p); free(path); } closedir(d); } - heim_release(module); + free(dirname); HEIMDAL_MUTEX_unlock(&plugin_mutex); + heim_release(module); +#ifdef _WIN32 + if (plugin_prefix) + free(plugin_prefix); +#endif #endif /* HAVE_DLOPEN */ } -void +/** + * Unload plugins (new system) + */ +KRB5_LIB_FUNCTION void KRB5_LIB_CALL _krb5_unload_plugins(krb5_context context, const char *name) { HEIMDAL_MUTEX_lock(&plugin_mutex); @@ -537,14 +442,15 @@ heim_string_t n; const char *name; int min_version; + int flags; heim_array_t result; - krb5_error_code (*func)(krb5_context, const void *, void *, void *); + krb5_error_code (KRB5_LIB_CALL *func)(krb5_context, const void *, void *, void *); void *userctx; krb5_error_code ret; }; static void -search_modules(void *ctx, heim_object_t key, heim_object_t value) +search_modules(heim_object_t key, heim_object_t value, void *ctx) { struct iter_ctx *s = ctx; struct plugin2 *p = value; @@ -565,19 +471,18 @@ if (ret) cpm = pl->dataptr = NULL; } - heim_dict_add_value(p->names, s->n, pl); + heim_dict_set_value(p->names, s->n, pl); } else { cpm = pl->dataptr; } if (cpm && cpm->version >= s->min_version) heim_array_append_value(s->result, pl); - heim_release(pl); } static void -eval_results(heim_object_t value, void *ctx) +eval_results(heim_object_t value, void *ctx, int *stop) { struct plug *pl = value; struct iter_ctx *s = ctx; @@ -586,50 +491,116 @@ return; s->ret = s->func(s->context, pl->dataptr, pl->ctx, s->userctx); + if (s->ret != KRB5_PLUGIN_NO_HANDLE + && !(s->flags & KRB5_PLUGIN_INVOKE_ALL)) + *stop = 1; } -krb5_error_code +/** + * Run plugins for the given @module (e.g., "krb5") and @name (e.g., + * "kuserok"). Specifically, the @func is invoked once per-plugin with + * four arguments: the @context, the plugin symbol value (a pointer to a + * struct whose first three fields are the same as struct common_plugin_method), + * a context value produced by the plugin's init method, and @userctx. + * + * @func should unpack arguments for a plugin function and invoke it + * with arguments taken from @userctx. @func should save plugin + * outputs, if any, in @userctx. + * + * All loaded and registered plugins are invoked via @func until @func + * returns something other than KRB5_PLUGIN_NO_HANDLE. Plugins that + * have nothing to do for the given arguments should return + * KRB5_PLUGIN_NO_HANDLE. + * + * Inputs: + * + * @context A krb5_context + * @module Name of module (typically "krb5") + * @name Name of pluggable interface (e.g., "kuserok") + * @min_version Lowest acceptable plugin minor version number + * @flags Flags (none defined at this time) + * @userctx Callback data for the callback function @func + * @func A callback function, invoked once per-plugin + * + * Outputs: None, other than the return value and such outputs as are + * gathered by @func. + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL _krb5_plugin_run_f(krb5_context context, const char *module, const char *name, int min_version, int flags, void *userctx, - krb5_error_code (*func)(krb5_context, const void *, void *, void *)) + krb5_error_code (KRB5_LIB_CALL *func)(krb5_context, const void *, void *, void *)) { heim_string_t m = heim_string_create(module); heim_dict_t dict; + void *plug_ctx; + struct common_plugin_method *cpm; struct iter_ctx s; + struct krb5_plugin *registered_plugins = NULL; + struct krb5_plugin *p; - HEIMDAL_MUTEX_lock(&plugin_mutex); + /* Get registered plugins */ + (void) _krb5_plugin_find(context, PLUGIN_TYPE_DATA, name, ®istered_plugins); - dict = heim_dict_copy_value(modules, m); - heim_release(m); - if (dict == NULL) { - HEIMDAL_MUTEX_unlock(&plugin_mutex); - return KRB5_PLUGIN_NO_HANDLE; - } + HEIMDAL_MUTEX_lock(&plugin_mutex); s.context = context; s.name = name; s.n = heim_string_create(name); + s.flags = flags; s.min_version = min_version; s.result = heim_array_create(); s.func = func; s.userctx = userctx; + s.ret = KRB5_PLUGIN_NO_HANDLE; - heim_dict_iterate_f(dict, search_modules, &s); + /* Get loaded plugins */ + dict = heim_dict_copy_value(modules, m); + heim_release(m); - heim_release(dict); + /* Add loaded plugins to s.result array */ + if (dict) + heim_dict_iterate_f(dict, &s, search_modules); + /* We don't need to hold plugin_mutex during plugin invocation */ HEIMDAL_MUTEX_unlock(&plugin_mutex); - s.ret = KRB5_PLUGIN_NO_HANDLE; + /* Invoke registered plugins (old system) */ + for (p = registered_plugins; p; p = p->next) { + /* + * XXX This is the wrong way to handle registered plugins, as we + * call init/fini on each invocation! We do this because we + * have nowhere in the struct plugin registered list to store + * the context allocated by the plugin's init function. (But at + * least we do call init/fini!) + * + * What we should do is adapt the old plugin system to the new + * one and change how we register plugins so that we use the new + * struct plug to keep track of their context structures, that + * way we can init once, invoke many times, then fini. + */ + cpm = (struct common_plugin_method *)p->symbol; + s.ret = cpm->init(context, &plug_ctx); + if (s.ret) + continue; + s.ret = s.func(s.context, p->symbol, plug_ctx, s.userctx); + cpm->fini(plug_ctx); + if (s.ret != KRB5_PLUGIN_NO_HANDLE && + !(flags & KRB5_PLUGIN_INVOKE_ALL)) + break; + } + _krb5_plugin_free(registered_plugins); - heim_array_iterate_f(s.result, eval_results, &s); + /* Invoke loaded plugins (new system) */ + if (s.ret == KRB5_PLUGIN_NO_HANDLE) + heim_array_iterate_f(s.result, &s, eval_results); heim_release(s.result); heim_release(s.n); + heim_release(dict); return s.ret; } diff --git a/crypto/heimdal/lib/krb5/principal.c b/crypto/heimdal/lib/krb5/principal.c --- a/crypto/heimdal/lib/krb5/principal.c +++ b/crypto/heimdal/lib/krb5/principal.c @@ -35,8 +35,8 @@ * @page krb5_principal_intro The principal handing functions. * * A Kerberos principal is a email address looking string that - * contains to parts separeted by a @. The later part is the kerbero - * realm the principal belongs to and the former is a list of 0 or + * contains two parts separated by @. The second part is the kerberos + * realm the principal belongs to and the first is a list of 0 or * more components. For example * @verbatim lha@SU.SE @@ -63,6 +63,28 @@ #define princ_ncomp(P, N) ((P)->name.name_string.val[(N)]) #define princ_realm(P) ((P)->realm) +static krb5_error_code +set_default_princ_type(krb5_principal p, NAME_TYPE defnt) +{ + if (princ_num_comp(p) > 1 && strcmp(princ_ncomp(p, 0), KRB5_TGS_NAME) == 0) + princ_type(p) = KRB5_NT_SRV_INST; + else if (princ_num_comp(p) > 1 && strcmp(princ_ncomp(p, 0), "host") == 0) + princ_type(p) = KRB5_NT_SRV_HST; + else if (princ_num_comp(p) > 1 && strcmp(princ_ncomp(p, 0), "kca_service") == 0) + princ_type(p) = KRB5_NT_SRV_HST; + else if (princ_num_comp(p) == 2 && + strcmp(princ_ncomp(p, 0), KRB5_WELLKNOWN_NAME) == 0) + princ_type(p) = KRB5_NT_WELLKNOWN; + else if (princ_num_comp(p) == 1 && strchr(princ_ncomp(p, 0), '@') != NULL) + princ_type(p) = KRB5_NT_SMTP_NAME; + else + princ_type(p) = defnt; + return 0; +} + +static krb5_error_code append_component(krb5_context, krb5_principal, + const char *, size_t); + /** * Frees a Kerberos principal allocated by the library with * krb5_parse_name(), krb5_make_principal() or any other related @@ -203,99 +225,93 @@ char c; int got_realm = 0; int first_at = 1; - int enterprise = (flags & KRB5_PRINCIPAL_PARSE_ENTERPRISE); + int no_realm = flags & KRB5_PRINCIPAL_PARSE_NO_REALM; + int require_realm = flags & KRB5_PRINCIPAL_PARSE_REQUIRE_REALM; + int enterprise = flags & KRB5_PRINCIPAL_PARSE_ENTERPRISE; + int ignore_realm = flags & KRB5_PRINCIPAL_PARSE_IGNORE_REALM; + int no_def_realm = flags & KRB5_PRINCIPAL_PARSE_NO_DEF_REALM; *principal = NULL; -#define RFLAGS (KRB5_PRINCIPAL_PARSE_NO_REALM|KRB5_PRINCIPAL_PARSE_REQUIRE_REALM) - - if ((flags & RFLAGS) == RFLAGS) { + if (no_realm && require_realm) { krb5_set_error_message(context, KRB5_ERR_NO_SERVICE, N_("Can't require both realm and " "no realm at the same time", "")); return KRB5_ERR_NO_SERVICE; } -#undef RFLAGS /* count number of component, * enterprise names only have one component */ ncomp = 1; if (!enterprise) { - for(p = name; *p; p++){ - if(*p=='\\'){ - if(!p[1]) { + for (p = name; *p; p++) { + if (*p=='\\') { + if (!p[1]) { krb5_set_error_message(context, KRB5_PARSE_MALFORMED, N_("trailing \\ in principal name", "")); return KRB5_PARSE_MALFORMED; } p++; - } else if(*p == '/') + } else if (*p == '/') ncomp++; - else if(*p == '@') + else if (*p == '@') break; } } comp = calloc(ncomp, sizeof(*comp)); - if (comp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (comp == NULL) + return krb5_enomem(context); n = 0; p = start = q = s = strdup(name); if (start == NULL) { - free (comp); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + free(comp); + return krb5_enomem(context); } - while(*p){ + while (*p) { c = *p++; - if(c == '\\'){ + if (c == '\\') { c = *p++; - if(c == 'n') + if (c == 'n') c = '\n'; - else if(c == 't') + else if (c == 't') c = '\t'; - else if(c == 'b') + else if (c == 'b') c = '\b'; - else if(c == '0') + else if (c == '0') c = '\0'; - else if(c == '\0') { + else if (c == '\0') { ret = KRB5_PARSE_MALFORMED; krb5_set_error_message(context, ret, N_("trailing \\ in principal name", "")); goto exit; } - }else if(enterprise && first_at) { + } else if (enterprise && first_at) { if (c == '@') first_at = 0; - }else if((c == '/' && !enterprise) || c == '@'){ - if(got_realm){ + } else if ((c == '/' && !enterprise) || c == '@') { + if (got_realm) { ret = KRB5_PARSE_MALFORMED; krb5_set_error_message(context, ret, N_("part after realm in principal name", "")); goto exit; - }else{ + } else { comp[n] = malloc(q - start + 1); if (comp[n] == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto exit; } memcpy(comp[n], start, q - start); comp[n][q - start] = 0; n++; } - if(c == '@') + if (c == '@') got_realm = 1; start = q; continue; } - if(got_realm && (c == '/' || c == '\0')) { + if (got_realm && (c == '/' || c == '\0')) { ret = KRB5_PARSE_MALFORMED; krb5_set_error_message(context, ret, N_("part after realm in principal name", "")); @@ -303,71 +319,67 @@ } *q++ = c; } - if(got_realm){ - if (flags & KRB5_PRINCIPAL_PARSE_NO_REALM) { + if (got_realm) { + if (no_realm) { ret = KRB5_PARSE_MALFORMED; krb5_set_error_message(context, ret, N_("realm found in 'short' principal " "expected to be without one", "")); goto exit; } - realm = malloc(q - start + 1); - if (realm == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); - goto exit; + if (!ignore_realm) { + realm = malloc(q - start + 1); + if (realm == NULL) { + ret = krb5_enomem(context); + goto exit; + } + memcpy(realm, start, q - start); + realm[q - start] = 0; } - memcpy(realm, start, q - start); - realm[q - start] = 0; - }else{ - if (flags & KRB5_PRINCIPAL_PARSE_REQUIRE_REALM) { + } else { + if (require_realm) { ret = KRB5_PARSE_MALFORMED; krb5_set_error_message(context, ret, N_("realm NOT found in principal " "expected to be with one", "")); goto exit; - } else if (flags & KRB5_PRINCIPAL_PARSE_NO_REALM) { + } else if (no_realm || no_def_realm) { realm = NULL; } else { - ret = krb5_get_default_realm (context, &realm); + ret = krb5_get_default_realm(context, &realm); if (ret) goto exit; } comp[n] = malloc(q - start + 1); if (comp[n] == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto exit; } memcpy(comp[n], start, q - start); comp[n][q - start] = 0; n++; } - *principal = malloc(sizeof(**principal)); + *principal = calloc(1, sizeof(**principal)); if (*principal == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto exit; } - if (enterprise) - (*principal)->name.name_type = KRB5_NT_ENTERPRISE_PRINCIPAL; - else - (*principal)->name.name_type = KRB5_NT_PRINCIPAL; (*principal)->name.name_string.val = comp; princ_num_comp(*principal) = n; (*principal)->realm = realm; + if (enterprise) + princ_type(*principal) = KRB5_NT_ENTERPRISE_PRINCIPAL; + else + set_default_princ_type(*principal, KRB5_NT_PRINCIPAL); free(s); return 0; exit: - while(n>0){ + while (n>0) { free(comp[--n]); } free(comp); - free(realm); + krb5_free_default_realm(context, realm); free(s); return ret; } @@ -394,7 +406,6 @@ static const char quotable_chars[] = " \n\t\b\\/@"; static const char replace_chars[] = " ntb\\/@"; -static const char nq_chars[] = " \\/@"; #define add_char(BASE, INDEX, LEN, C) do { if((INDEX) < (LEN)) (BASE)[(INDEX)++] = (C); }while(0); @@ -457,7 +468,7 @@ return ret; if(strcmp(princ_realm(principal), r) != 0) short_form = 0; - free(r); + krb5_free_default_realm(context, r); } if(!short_form && !no_realm) { add_char(name, idx, len, '@'); @@ -571,11 +582,8 @@ } len++; /* '\0' */ *name = malloc(len); - if(*name == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if(*name == NULL) + return krb5_enomem(context); ret = unparse_name_fixed(context, principal, *name, len, flags); if(ret) { free(*name); @@ -668,12 +676,29 @@ if (princ_realm(principal)) free(princ_realm(principal)); - princ_realm(principal) = strdup(realm); - if (princ_realm(principal) == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (realm == NULL) + princ_realm(principal) = NULL; + else if ((princ_realm(principal) = strdup(realm)) == NULL) + return krb5_enomem(context); + return 0; +} + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_principal_set_comp_string(krb5_context context, + krb5_principal principal, + unsigned int k, + const char *component) +{ + char *s; + size_t i; + + for (i = princ_num_comp(principal); i <= k; i++) + append_component(context, principal, "", 0); + s = strdup(component); + if (s == NULL) + return krb5_enomem(context); + free(princ_ncomp(principal, k)); + princ_ncomp(principal, k) = s; return 0; } @@ -721,6 +746,7 @@ * @ingroup krb5_principal */ +/* coverity[+alloc : arg-*1] */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_make_principal(krb5_context context, krb5_principal *principal, @@ -740,7 +766,7 @@ ret = krb5_build_principal_va(context, principal, strlen(realm), realm, ap); va_end(ap); if(r) - free(r); + krb5_free_default_realm(context, r); return ret; } @@ -753,48 +779,50 @@ size_t len = princ_num_comp(p); tmp = realloc(princ_comp(p), (len + 1) * sizeof(*tmp)); - if(tmp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if(tmp == NULL) + return krb5_enomem(context); princ_comp(p) = tmp; princ_ncomp(p, len) = malloc(comp_len + 1); - if (princ_ncomp(p, len) == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (princ_ncomp(p, len) == NULL) + return krb5_enomem(context); memcpy (princ_ncomp(p, len), comp, comp_len); princ_ncomp(p, len)[comp_len] = '\0'; princ_num_comp(p)++; return 0; } -static void +static krb5_error_code va_ext_princ(krb5_context context, krb5_principal p, va_list ap) { - while(1){ + krb5_error_code ret = 0; + + while (1){ const char *s; int len; - len = va_arg(ap, int); - if(len == 0) + + if ((len = va_arg(ap, int)) == 0) break; s = va_arg(ap, const char*); - append_component(context, p, s, len); + if ((ret = append_component(context, p, s, len)) != 0) + break; } + return ret; } -static void +static krb5_error_code va_princ(krb5_context context, krb5_principal p, va_list ap) { - while(1){ + krb5_error_code ret = 0; + + while (1){ const char *s; - s = va_arg(ap, const char*); - if(s == NULL) + + if ((s = va_arg(ap, const char*)) == NULL) + break; + if ((ret = append_component(context, p, s, strlen(s))) != 0) break; - append_component(context, p, s, strlen(s)); } + return ret; } static krb5_error_code @@ -802,30 +830,30 @@ krb5_principal *principal, int rlen, krb5_const_realm realm, - void (*func)(krb5_context, krb5_principal, va_list), + krb5_error_code (*func)(krb5_context, krb5_principal, va_list), va_list ap) { + krb5_error_code ret; krb5_principal p; + *principal = NULL; p = calloc(1, sizeof(*p)); - if (p == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } - princ_type(p) = KRB5_NT_PRINCIPAL; + if (p == NULL) + return krb5_enomem(context); princ_realm(p) = strdup(realm); - if(p->realm == NULL){ + if (p->realm == NULL) { free(p); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } - (*func)(context, p, ap); - *principal = p; - return 0; + ret = func(context, p, ap); + if (ret == 0) { + *principal = p; + set_default_princ_type(p, KRB5_NT_PRINCIPAL); + } else + krb5_free_principal(context, p); + return ret; } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL @@ -883,16 +911,11 @@ krb5_principal *outprinc) { krb5_principal p = malloc(sizeof(*p)); - if (p == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (p == NULL) + return krb5_enomem(context); if(copy_Principal(inprinc, p)) { free(p); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } *outprinc = p; return 0; @@ -965,7 +988,7 @@ krb5_const_principal princ1, krb5_const_principal princ2) { - if(!krb5_realm_compare(context, princ1, princ2)) + if (!krb5_realm_compare(context, princ1, princ2)) return FALSE; return krb5_principal_compare_any_realm(context, princ1, princ2); } @@ -1013,32 +1036,21 @@ return TRUE; } -/** - * Create a principal for the service running on hostname. If - * KRB5_NT_SRV_HST is used, the hostname is canonization using DNS (or - * some other service), this is potentially insecure. - * - * @param context A Kerberos context. - * @param hostname hostname to use - * @param sname Service name to use - * @param type name type of pricipal, use KRB5_NT_SRV_HST or KRB5_NT_UNKNOWN. - * @param ret_princ return principal, free with krb5_free_principal(). - * - * @return An krb5 error code, see krb5_get_error_message(). - * - * @ingroup krb5_principal +/* + * This is the original krb5_sname_to_principal(), renamed to be a + * helper of the new one. */ - -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_sname_to_principal (krb5_context context, - const char *hostname, - const char *sname, - int32_t type, - krb5_principal *ret_princ) +static krb5_error_code +krb5_sname_to_principal_old(krb5_context context, + const char *realm, + const char *hostname, + const char *sname, + int32_t type, + krb5_principal *ret_princ) { krb5_error_code ret; char localhost[MAXHOSTNAMELEN]; - char **realms, *host = NULL; + char **realms = NULL, *host = NULL; if(type != KRB5_NT_SRV_HST && type != KRB5_NT_UNKNOWN) { krb5_set_error_message(context, KRB5_SNAME_UNSUPP_NAMETYPE, @@ -1060,23 +1072,30 @@ if(sname == NULL) sname = "host"; if(type == KRB5_NT_SRV_HST) { - ret = krb5_expand_hostname_realms (context, hostname, - &host, &realms); + if (realm) + ret = krb5_expand_hostname(context, hostname, &host); + else + ret = krb5_expand_hostname_realms(context, hostname, + &host, &realms); if (ret) return ret; strlwr(host); hostname = host; - } else { + if (!realm) + realm = realms[0]; + } else if (!realm) { ret = krb5_get_host_realm(context, hostname, &realms); if(ret) return ret; + realm = realms[0]; } - ret = krb5_make_principal(context, ret_princ, realms[0], sname, + ret = krb5_make_principal(context, ret_princ, realm, sname, hostname, NULL); if(host) free(host); - krb5_free_host_realm(context, realms); + if (realms) + krb5_free_host_realm(context, realms); return ret; } @@ -1093,9 +1112,12 @@ { "X500_PRINCIPAL", KRB5_NT_X500_PRINCIPAL }, { "SMTP_NAME", KRB5_NT_SMTP_NAME }, { "ENTERPRISE_PRINCIPAL", KRB5_NT_ENTERPRISE_PRINCIPAL }, + { "WELLKNOWN", KRB5_NT_WELLKNOWN }, + { "SRV_HST_DOMAIN", KRB5_NT_SRV_HST_DOMAIN }, { "ENT_PRINCIPAL_AND_ID", KRB5_NT_ENT_PRINCIPAL_AND_ID }, { "MS_PRINCIPAL", KRB5_NT_MS_PRINCIPAL }, { "MS_PRINCIPAL_AND_ID", KRB5_NT_MS_PRINCIPAL_AND_ID }, + { "SRV_HST_NEEDS_CANON", KRB5_NT_SRV_HST_NEEDS_CANON }, { NULL, 0 } }; @@ -1121,6 +1143,64 @@ return KRB5_PARSE_MALFORMED; } +/** + * Returns true if name is Kerberos NULL name + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_null(krb5_context context, krb5_const_principal principal) +{ + if (principal->name.name_type == KRB5_NT_WELLKNOWN && + principal->name.name_string.len == 2 && + strcmp(principal->name.name_string.val[0], "WELLKNOWN") == 0 && + strcmp(principal->name.name_string.val[1], "NULL") == 0) + return TRUE; + return FALSE; +} + +const char _krb5_wellknown_lkdc[] = "WELLKNOWN:COM.APPLE.LKDC"; +static const char lkdc_prefix[] = "LKDC:"; + +/** + * Returns true if name is Kerberos an LKDC realm + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_realm_is_lkdc(const char *realm) +{ + + return strncmp(realm, lkdc_prefix, sizeof(lkdc_prefix)-1) == 0 || + strncmp(realm, _krb5_wellknown_lkdc, sizeof(_krb5_wellknown_lkdc) - 1) == 0; +} + +/** + * Returns true if name is Kerberos an LKDC realm + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_lkdc(krb5_context context, krb5_const_principal principal) +{ + return krb5_realm_is_lkdc(principal->realm); +} + +/** + * Returns true if name is Kerberos an LKDC realm + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_pku2u(krb5_context context, krb5_const_principal principal) +{ + return strcmp(principal->realm, KRB5_PKU2U_REALM_NAME) == 0; +} + /** * Check if the cname part of the principal is a krbtgt principal * @@ -1132,5 +1212,923 @@ { return p->name.name_string.len == 2 && strcmp(p->name.name_string.val[0], KRB5_TGS_NAME) == 0; +} + +/** + * Returns true iff name is an WELLKNOWN:ORG.H5L.HOSTBASED-SERVICE + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_gss_hostbased_service(krb5_context context, + krb5_const_principal principal) +{ + if (principal == NULL) + return FALSE; + if (principal->name.name_string.len != 2) + return FALSE; + if (strcmp(principal->name.name_string.val[1], KRB5_GSS_HOSTBASED_SERVICE_NAME) != 0) + return FALSE; + return TRUE; +} + +/** + * Check if the cname part of the principal is a initial or renewed krbtgt principal + * + * @ingroup krb5_principal + */ + +krb5_boolean KRB5_LIB_FUNCTION +krb5_principal_is_root_krbtgt(krb5_context context, krb5_const_principal p) +{ + return p->name.name_string.len == 2 && + strcmp(p->name.name_string.val[0], KRB5_TGS_NAME) == 0 && + strcmp(p->name.name_string.val[1], p->realm) == 0; +} + +/** + * Returns true iff name is WELLKNOWN/ANONYMOUS + * + * @ingroup krb5_principal + */ +KRB5_LIB_FUNCTION krb5_boolean KRB5_LIB_CALL +krb5_principal_is_anonymous(krb5_context context, + krb5_const_principal p, + unsigned int flags) +{ + /* + * Heimdal versions 7.5 and below left the name-type at KRB5_NT_PRINCIPAL + * even with anonymous pkinit responses. To retain interoperability with + * legacy KDCs, the name-type is not checked by the client after requesting + * a fully anonymous ticket. + */ + if (!(flags & KRB5_ANON_IGNORE_NAME_TYPE) && + p->name.name_type != KRB5_NT_WELLKNOWN && + p->name.name_type != KRB5_NT_UNKNOWN) + return FALSE; + + if (p->name.name_string.len != 2 || + strcmp(p->name.name_string.val[0], KRB5_WELLKNOWN_NAME) != 0 || + strcmp(p->name.name_string.val[1], KRB5_ANON_NAME) != 0) + return FALSE; + + /* + * While unauthenticated clients SHOULD get "WELLKNOWN:ANONYMOUS" as their + * realm, Heimdal KDCs prior to 7.0 returned the requested realm. While + * such tickets might lead *servers* to unwittingly grant access to fully + * anonymous clients, trusting that the client was authenticated to the + * realm in question, doing it right is the KDC's job, the client should + * not refuse such a ticket. + * + * If we ever do decide to enforce WELLKNOWN:ANONYMOUS for unauthenticated + * clients, it is essential that calls that pass KRB5_ANON_MATCH_ANY still + * ignore the realm, as in that case either case matches one of the two + * possible conditions. + */ + if (flags & KRB5_ANON_MATCH_UNAUTHENTICATED) + return TRUE; + + /* + * Finally, authenticated clients that asked to be only anonymized do + * legitimately expect a non-anon realm. + */ + return strcmp(p->realm, KRB5_ANON_REALM) != 0; +} + +static int +tolower_ascii(int c) +{ + if (c >= 'A' || c <= 'Z') + return 'a' + (c - 'A'); + return c; +} + +typedef enum krb5_name_canon_rule_type { + KRB5_NCRT_BOGUS = 0, + KRB5_NCRT_AS_IS, + KRB5_NCRT_QUALIFY, + KRB5_NCRT_NSS +} krb5_name_canon_rule_type; + +#ifdef UINT8_MAX +#define MAXDOTS UINT8_MAX +#else +#define MAXDOTS (255U) +#endif +#ifdef UINT16_MAX +#define MAXORDER UINT16_MAX +#else +#define MAXORDER (65535U) +#endif + +struct krb5_name_canon_rule_data { + krb5_name_canon_rule_type type; + krb5_name_canon_rule_options options; + uint8_t mindots; /* match this many dots or more */ + uint8_t maxdots; /* match no more than this many dots */ + uint16_t explicit_order; /* given order */ + uint16_t order; /* actual order */ + char *match_domain; /* match this stem */ + char *match_realm; /* match this realm */ + char *domain; /* qualify with this domain */ + char *realm; /* qualify with this realm */ +}; + +/** + * Create a principal for the given service running on the given + * hostname. If KRB5_NT_SRV_HST is used, the hostname is canonicalized + * according the configured name canonicalization rules, with + * canonicalization delayed in some cases. One rule involves DNS, which + * is insecure unless DNSSEC is used, but we don't use DNSSEC-capable + * resolver APIs here, so that if DNSSEC is used we wouldn't know it. + * + * Canonicalization is immediate (not delayed) only when there is only + * one canonicalization rule and that rule indicates that we should do a + * host lookup by name (i.e., DNS). + * + * @param context A Kerberos context. + * @param hostname hostname to use + * @param sname Service name to use + * @param type name type of principal, use KRB5_NT_SRV_HST or KRB5_NT_UNKNOWN. + * @param ret_princ return principal, free with krb5_free_principal(). + * + * @return An krb5 error code, see krb5_get_error_message(). + * + * @ingroup krb5_principal + */ + +/* coverity[+alloc : arg-*4] */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_sname_to_principal(krb5_context context, + const char *hostname, + const char *sname, + int32_t type, + krb5_principal *ret_princ) +{ + char *realm, *remote_host; + krb5_error_code ret; + register char *cp; + char localname[MAXHOSTNAMELEN]; + + *ret_princ = NULL; + + if ((type != KRB5_NT_UNKNOWN) && + (type != KRB5_NT_SRV_HST)) + return KRB5_SNAME_UNSUPP_NAMETYPE; + + /* if hostname is NULL, use local hostname */ + if (hostname == NULL) { + if (gethostname(localname, MAXHOSTNAMELEN)) + return errno; + hostname = localname; + } + + /* if sname is NULL, use "host" */ + if (sname == NULL) + sname = "host"; + + remote_host = strdup(hostname); + if (remote_host == NULL) + return krb5_enomem(context); + + if (type == KRB5_NT_SRV_HST) { + krb5_name_canon_rule rules; + + /* Lower-case the hostname, because that's the convention */ + for (cp = remote_host; *cp; cp++) + if (isupper((int) (*cp))) + *cp = tolower((int) (*cp)); + + /* + * If there is only one name canon rule and it says to + * canonicalize the old way, do that now, as we used to. + */ + ret = _krb5_get_name_canon_rules(context, &rules); + if (ret) { + _krb5_debug(context, 5, "Failed to get name canon rules: ret = %d", + ret); + free(remote_host); + return ret; + } + if (rules[0].type == KRB5_NCRT_NSS && + rules[1].type == KRB5_NCRT_BOGUS) { + _krb5_debug(context, 5, "Using nss for name canon immediately"); + ret = krb5_sname_to_principal_old(context, rules[0].realm, + remote_host, sname, + KRB5_NT_SRV_HST, ret_princ); + free(remote_host); + return ret; + } + } + + /* Remove trailing dots */ + if (remote_host[0]) { + for (cp = remote_host + strlen(remote_host)-1; + *cp == '.' && cp > remote_host; + cp--) { + *cp = '\0'; + } + } + + realm = ""; /* "Referral realm" */ + + ret = krb5_build_principal(context, ret_princ, strlen(realm), + realm, sname, remote_host, + (char *)0); + + if (ret == 0 && type == KRB5_NT_SRV_HST) { + /* + * Hostname canonicalization is done elsewhere (in + * krb5_get_credentials() and krb5_kt_get_entry()). + * + * We overload the name type to indicate to those functions that + * this principal name requires canonicalization. + * + * We can't use the empty realm to denote the need to + * canonicalize the hostname too: it would mean that users who + * want to assert knowledge of a service's realm must also know + * the canonical hostname, but in practice they don't. + */ + (*ret_princ)->name.name_type = KRB5_NT_SRV_HST_NEEDS_CANON; + + _krb5_debug(context, 5, "Building a delayed canon principal for %s/%s@", + sname, remote_host); + } + + free(remote_host); + return ret; +} + +static void +tolower_str(char *s) +{ + for (; *s != '\0'; s++) { + if (isupper(*s)) + *s = tolower_ascii(*s); + } +} + +static krb5_error_code +rule_parse_token(krb5_context context, krb5_name_canon_rule rule, + const char *tok) +{ + long int n; + int needs_type = rule->type == KRB5_NCRT_BOGUS; + + /* + * Rules consist of a sequence of tokens, some of which indicate + * what type of rule the rule is, and some of which set rule options + * or ancilliary data. Last rule type token wins. + */ + + /* Rule type tokens: */ + if (needs_type && strcmp(tok, "as-is") == 0) { + rule->type = KRB5_NCRT_AS_IS; + } else if (needs_type && strcmp(tok, "qualify") == 0) { + rule->type = KRB5_NCRT_QUALIFY; + } else if (needs_type && strcmp(tok, "nss") == 0) { + rule->type = KRB5_NCRT_NSS; + /* Rule options: */ + } else if (strcmp(tok, "use_fast") == 0) { + rule->options |= KRB5_NCRO_USE_FAST; + } else if (strcmp(tok, "use_dnssec") == 0) { + rule->options |= KRB5_NCRO_USE_DNSSEC; + } else if (strcmp(tok, "ccache_only") == 0) { + rule->options |= KRB5_NCRO_GC_ONLY; + } else if (strcmp(tok, "no_referrals") == 0) { + rule->options |= KRB5_NCRO_NO_REFERRALS; + } else if (strcmp(tok, "use_referrals") == 0) { + rule->options &= ~KRB5_NCRO_NO_REFERRALS; + if (rule->realm == NULL) { + rule->realm = strdup(""); + if (rule->realm == NULL) + return krb5_enomem(context); + } + } else if (strcmp(tok, "lookup_realm") == 0) { + rule->options |= KRB5_NCRO_LOOKUP_REALM; + free(rule->realm); + rule->realm = NULL; + /* Rule ancilliary data: */ + } else if (strncmp(tok, "domain=", strlen("domain=")) == 0) { + free(rule->domain); + rule->domain = strdup(tok + strlen("domain=")); + if (rule->domain == NULL) + return krb5_enomem(context); + tolower_str(rule->domain); + } else if (strncmp(tok, "realm=", strlen("realm=")) == 0) { + free(rule->realm); + rule->realm = strdup(tok + strlen("realm=")); + if (rule->realm == NULL) + return krb5_enomem(context); + } else if (strncmp(tok, "match_domain=", strlen("match_domain=")) == 0) { + free(rule->match_domain); + rule->match_domain = strdup(tok + strlen("match_domain=")); + if (rule->match_domain == NULL) + return krb5_enomem(context); + tolower_str(rule->match_domain); + } else if (strncmp(tok, "match_realm=", strlen("match_realm=")) == 0) { + free(rule->match_realm); + rule->match_realm = strdup(tok + strlen("match_realm=")); + if (rule->match_realm == NULL) + return krb5_enomem(context); + } else if (strncmp(tok, "mindots=", strlen("mindots=")) == 0) { + errno = 0; + n = strtol(tok + strlen("mindots="), NULL, 10); + if (errno == 0 && n > 0 && n <= MAXDOTS) + rule->mindots = n; + } else if (strncmp(tok, "maxdots=", strlen("maxdots=")) == 0) { + errno = 0; + n = strtol(tok + strlen("maxdots="), NULL, 10); + if (errno == 0 && n > 0 && n <= MAXDOTS) + rule->maxdots = n; + } else if (strncmp(tok, "order=", strlen("order=")) == 0) { + errno = 0; + n = strtol(tok + strlen("order="), NULL, 10); + if (errno == 0 && n > 0 && n <= MAXORDER) + rule->explicit_order = n; + } else { + _krb5_debug(context, 5, + "Unrecognized name canonicalization rule token %s", tok); + return EINVAL; + } + return 0; +} + +static int +rule_cmp(const void *a, const void *b) +{ + krb5_const_name_canon_rule left = a; + krb5_const_name_canon_rule right = b; + + if (left->type == KRB5_NCRT_BOGUS && + right->type == KRB5_NCRT_BOGUS) + return 0; + if (left->type == KRB5_NCRT_BOGUS) + return 1; + if (right->type == KRB5_NCRT_BOGUS) + return -1; + if (left->explicit_order < right->explicit_order) + return -1; + if (left->explicit_order > right->explicit_order) + return 1; + return left->order - right->order; +} + +static krb5_error_code +parse_name_canon_rules(krb5_context context, char **rulestrs, + krb5_name_canon_rule *rules) +{ + krb5_error_code ret; + char *tok; + char *cp; + char **cpp; + size_t n; + size_t i, k; + int do_sort = 0; + krb5_name_canon_rule r; + + *rules = NULL; + + for (n =0, cpp = rulestrs; cpp != NULL && *cpp != NULL; cpp++) + n++; + + n += 2; /* Always at least one rule; two for the default case */ + + if ((r = calloc(n, sizeof (*r))) == NULL) + return krb5_enomem(context); + + for (k = 0; k < n; k++) { + r[k].type = KRB5_NCRT_BOGUS; + r[k].match_domain = NULL; + r[k].match_realm = NULL; + r[k].domain = NULL; + r[k].realm = NULL; + } + + for (i = 0, k = 0; i < n && rulestrs != NULL && rulestrs[i] != NULL; i++) { + cp = rulestrs[i]; + r[k].explicit_order = MAXORDER; /* mark order, see below */ + r[k].maxdots = MAXDOTS; + r[k].order = k; /* default order */ + + /* Tokenize and parse value */ + do { + tok = cp; + cp = strchr(cp, ':'); /* XXX use strtok_r() */ + if (cp) + *cp++ = '\0'; /* delimit token */ + ret = rule_parse_token(context, &r[k], tok); + if (ret == EINVAL) { + r[k].type = KRB5_NCRT_BOGUS; + break; + } + if (ret) { + _krb5_free_name_canon_rules(context, r); + return ret; + } + } while (cp && *cp); + if (r[k].explicit_order != MAXORDER) + do_sort = 1; + + /* Validate parsed rule */ + if (r[k].type == KRB5_NCRT_BOGUS || + (r[k].type == KRB5_NCRT_QUALIFY && !r[k].domain) || + (r[k].type == KRB5_NCRT_NSS && r[k].domain)) { + /* Invalid rule; mark it so and clean up */ + r[k].type = KRB5_NCRT_BOGUS; + free(r[k].match_domain); + free(r[k].match_realm); + free(r[k].domain); + free(r[k].realm); + r[k].realm = NULL; + r[k].domain = NULL; + r[k].match_domain = NULL; + r[k].match_realm = NULL; + _krb5_debug(context, 5, + "Ignoring invalid name canonicalization rule %lu", + (unsigned long)i); + continue; + } + k++; /* good rule */ + } + + if (do_sort) { + /* + * Note that we make make this a stable sort by using appareance + * and explicit order. + */ + qsort(r, n, sizeof(r[0]), rule_cmp); + } + + if (r[0].type == KRB5_NCRT_BOGUS) { + /* No rules, or no valid rules */ + r[0].type = KRB5_NCRT_NSS; + } + + *rules = r; + return 0; /* We don't communicate bad rule errors here */ +} + +/* + * This exists only because the hostname canonicalization behavior in Heimdal + * (and other implementations of Kerberos) has been to use getaddrinfo(), + * unsafe though it is, for ages. We can't fix it in one day. + */ +static void +make_rules_safe(krb5_context context, krb5_name_canon_rule rules) +{ + /* + * If the only rule were to use the name service (getaddrinfo()) then we're + * bound to fail. We could try to convert that rule to an as-is rule, but + * when we do get a validating resolver we'd be unhappy that we did such a + * conversion. Better let the user get failures and make them think about + * their naming rules. + */ + if (rules == NULL) + return; + for (; rules[0].type != KRB5_NCRT_BOGUS; rules++) { + if (rules->type == KRB5_NCRT_NSS) + rules->options |= KRB5_NCRO_USE_DNSSEC; + else + rules->options |= KRB5_NCRO_USE_FAST; + } +} + +/** + * This function returns an array of host-based service name + * canonicalization rules. The array of rules is organized as a list. + * See the definition of krb5_name_canon_rule. + * + * @param context A Kerberos context. + * @param rules Output location for array of rules. + */ +KRB5_LIB_FUNCTION krb5_error_code +_krb5_get_name_canon_rules(krb5_context context, krb5_name_canon_rule *rules) +{ + krb5_error_code ret; + char **values = NULL; + + *rules = context->name_canon_rules; + if (*rules != NULL) + return 0; + + values = krb5_config_get_strings(context, NULL, + "libdefaults", "name_canon_rules", NULL); + ret = parse_name_canon_rules(context, values, rules); + krb5_config_free_strings(values); + if (ret) + return ret; + + if (krb5_config_get_bool_default(context, NULL, FALSE, + "libdefaults", "safe_name_canon", NULL)) + make_rules_safe(context, *rules); + + heim_assert(rules != NULL && (*rules)[0].type != KRB5_NCRT_BOGUS, + "internal error in parsing principal name " + "canonicalization rules"); + + /* Memoize */ + context->name_canon_rules = *rules; + + return 0; +} + +static krb5_error_code +get_host_realm(krb5_context context, const char *hostname, char **realm) +{ + krb5_error_code ret; + char **hrealms = NULL; + + *realm = NULL; + ret = krb5_get_host_realm(context, hostname, &hrealms); + if (ret) + return ret; + if (hrealms == NULL) + return KRB5_ERR_HOST_REALM_UNKNOWN; /* krb5_set_error() already done */ + if (hrealms[0] == NULL) { + krb5_free_host_realm(context, hrealms); + return KRB5_ERR_HOST_REALM_UNKNOWN; /* krb5_set_error() already done */ + } + *realm = strdup(hrealms[0]); + krb5_free_host_realm(context, hrealms); + if (*realm == NULL) + return krb5_enomem(context); + return 0; +} + +static int +is_domain_suffix(const char *domain, const char *suffix) +{ + size_t dlen = strlen(domain); + size_t slen = strlen(suffix); + + if (dlen < slen + 2) + return 0; + + if (strcasecmp(domain + (dlen - slen), suffix) != 0) + return 0; + + if (domain[(dlen - slen) - 1] != '.') + return 0; + return 1; +} + +/* + * Applies a name canonicalization rule to a principal. + * + * Returns zero and no out_princ if the rule does not match. + * Returns zero and an out_princ if the rule does match. + */ +static krb5_error_code +apply_name_canon_rule(krb5_context context, krb5_name_canon_rule rules, + size_t rule_idx, krb5_const_principal in_princ, + krb5_principal *out_princ, + krb5_name_canon_rule_options *rule_opts) +{ + krb5_name_canon_rule rule = &rules[rule_idx]; + krb5_error_code ret; + unsigned int ndots = 0; + krb5_principal nss = NULL; + const char *sname = NULL; + const char *orig_hostname = NULL; + const char *new_hostname = NULL; + const char *new_realm = NULL; + const char *port = ""; + const char *cp; + char *hostname_sans_port = NULL; + char *hostname_with_port = NULL; + char *tmp_hostname = NULL; + char *tmp_realm = NULL; + + *out_princ = NULL; /* Signal no match */ + + if (rule_opts != NULL) + *rule_opts = rule->options; + + if (rule->type == KRB5_NCRT_BOGUS) + return 0; /* rule doesn't apply */ + + sname = krb5_principal_get_comp_string(context, in_princ, 0); + orig_hostname = krb5_principal_get_comp_string(context, in_princ, 1); + + /* + * Some apps want to use the very non-standard svc/hostname:port@REALM + * form. We do our best to support that here :( + */ + port = strchr(orig_hostname, ':'); + if (port != NULL) { + hostname_sans_port = strndup(orig_hostname, port - orig_hostname); + if (hostname_sans_port == NULL) + return krb5_enomem(context); + orig_hostname = hostname_sans_port; + } + + _krb5_debug(context, 5, N_("Applying a name rule (type %d) to %s", ""), + rule->type, orig_hostname); + + if (rule->mindots > 0 || rule->maxdots > 0) { + for (cp = strchr(orig_hostname, '.'); cp && *cp; cp = strchr(cp + 1, '.')) + ndots++; + } + if (rule->mindots > 0 && ndots < rule->mindots) + return 0; + if (ndots > rule->maxdots) + return 0; + + if (rule->match_domain != NULL && + !is_domain_suffix(orig_hostname, rule->match_domain)) + return 0; + + if (rule->match_realm != NULL && + strcmp(rule->match_realm, in_princ->realm) != 0) + return 0; + + new_realm = rule->realm; + switch (rule->type) { + case KRB5_NCRT_AS_IS: + break; + + case KRB5_NCRT_QUALIFY: + heim_assert(rule->domain != NULL, + "missing domain for qualify name canon rule"); + if (asprintf(&tmp_hostname, "%s.%s", orig_hostname, + rule->domain) == -1 || tmp_hostname == NULL) { + ret = krb5_enomem(context); + goto out; + } + new_hostname = tmp_hostname; + break; + + case KRB5_NCRT_NSS: + if ((rule->options & KRB5_NCRO_USE_DNSSEC)) { + ret = KRB5KDC_ERR_S_PRINCIPAL_UNKNOWN; + krb5_set_error_message(context, ret, + "Secure hostname resolution not supported"); + goto out; + } + _krb5_debug(context, 5, "Using name service lookups"); + ret = krb5_sname_to_principal_old(context, rule->realm, + orig_hostname, sname, + KRB5_NT_SRV_HST, + &nss); + if (rules[rule_idx + 1].type != KRB5_NCRT_BOGUS && + (ret == KRB5_ERR_BAD_HOSTNAME || + ret == KRB5_ERR_HOST_REALM_UNKNOWN)) { + /* + * Bad hostname / realm unknown -> rule inapplicable if + * there's more rules. If it's the last rule then we want + * to return all errors from krb5_sname_to_principal_old() + * here. + */ + ret = 0; + goto out; + } + if (ret) + goto out; + + new_hostname = krb5_principal_get_comp_string(context, nss, 1); + new_realm = krb5_principal_get_realm(context, nss); + break; + + default: + /* Can't happen */ + ret = 0; + goto out; + } + + /* + * This rule applies. + * + * Copy in_princ and mutate the copy per the matched rule. + * + * This way we apply to principals with two or more components, such as + * domain-based names. + */ + ret = krb5_copy_principal(context, in_princ, out_princ); + if (ret) + goto out; + + if (new_realm == NULL && (rule->options & KRB5_NCRO_LOOKUP_REALM) != 0) { + ret = get_host_realm(context, new_hostname, &tmp_realm); + if (ret) + goto out; + new_realm = tmp_realm; + } + + /* If we stripped off a :port, add it back in */ + if (port != NULL && new_hostname != NULL) { + if (asprintf(&hostname_with_port, "%s%s", new_hostname, port) == -1 || + hostname_with_port == NULL) { + ret = krb5_enomem(context); + goto out; + } + new_hostname = hostname_with_port; + } + + if (new_realm != NULL) + krb5_principal_set_realm(context, *out_princ, new_realm); + if (new_hostname != NULL) + krb5_principal_set_comp_string(context, *out_princ, 1, new_hostname); + if (princ_type(*out_princ) == KRB5_NT_SRV_HST_NEEDS_CANON) + princ_type(*out_princ) = KRB5_NT_SRV_HST; + + /* Trace rule application */ + { + krb5_error_code ret2; + char *unparsed; + + ret2 = krb5_unparse_name(context, *out_princ, &unparsed); + if (ret2) { + _krb5_debug(context, 5, + N_("Couldn't unparse canonicalized princicpal (%d)", + ""), + ret); + } else { + _krb5_debug(context, 5, + N_("Name canon rule application yields %s", ""), + unparsed); + free(unparsed); + } + } + +out: + free(hostname_sans_port); + free(hostname_with_port); + free(tmp_hostname); + free(tmp_realm); + krb5_free_principal(context, nss); + if (ret) + krb5_set_error_message(context, ret, + N_("Name canon rule application failed", "")); + return ret; +} + +/** + * Free name canonicalization rules + */ +KRB5_LIB_FUNCTION void +_krb5_free_name_canon_rules(krb5_context context, krb5_name_canon_rule rules) +{ + size_t k; + + if (rules == NULL) + return; + + for (k = 0; rules[k].type != KRB5_NCRT_BOGUS; k++) { + free(rules[k].match_domain); + free(rules[k].match_realm); + free(rules[k].domain); + free(rules[k].realm); + } + free(rules); +} + +struct krb5_name_canon_iterator_data { + krb5_name_canon_rule rules; + krb5_const_principal in_princ; /* given princ */ + krb5_const_principal out_princ; /* princ to be output */ + krb5_principal tmp_princ; /* to be freed */ + int is_trivial; /* no canon to be done */ + int done; /* no more rules to be applied */ + size_t cursor; /* current/next rule */ +}; + +/** + * Initialize name canonicalization iterator. + * + * @param context Kerberos context + * @param in_princ principal name to be canonicalized OR + * @param iter output iterator object + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_name_canon_iterator_start(krb5_context context, + krb5_const_principal in_princ, + krb5_name_canon_iterator *iter) +{ + krb5_error_code ret; + krb5_name_canon_iterator state; + + *iter = NULL; + + state = calloc(1, sizeof (*state)); + if (state == NULL) + return krb5_enomem(context); + state->in_princ = in_princ; + + if (princ_type(state->in_princ) == KRB5_NT_SRV_HST_NEEDS_CANON) { + ret = _krb5_get_name_canon_rules(context, &state->rules); + if (ret) + goto out; + } else { + /* Name needs no canon -> trivial iterator: in_princ is canonical */ + state->is_trivial = 1; + } + + *iter = state; + return 0; + +out: + krb5_free_name_canon_iterator(context, state); + return krb5_enomem(context); +} + +/* + * Helper for name canon iteration. + */ +static krb5_error_code +name_canon_iterate(krb5_context context, + krb5_name_canon_iterator *iter, + krb5_name_canon_rule_options *rule_opts) +{ + krb5_error_code ret; + krb5_name_canon_iterator state = *iter; + + if (rule_opts) + *rule_opts = 0; + + if (state == NULL) + return 0; + + if (state->done) { + krb5_free_name_canon_iterator(context, state); + *iter = NULL; + return 0; + } + + if (state->is_trivial && !state->done) { + state->out_princ = state->in_princ; + state->done = 1; + return 0; + } + + heim_assert(state->rules != NULL && + state->rules[state->cursor].type != KRB5_NCRT_BOGUS, + "Internal error during name canonicalization"); + + do { + krb5_free_principal(context, state->tmp_princ); + ret = apply_name_canon_rule(context, state->rules, state->cursor, + state->in_princ, &state->tmp_princ, rule_opts); + if (ret) { + krb5_free_name_canon_iterator(context, state); + *iter = NULL; + return ret; + } + state->cursor++; + } while (state->tmp_princ == NULL && + state->rules[state->cursor].type != KRB5_NCRT_BOGUS); + + if (state->rules[state->cursor].type == KRB5_NCRT_BOGUS) + state->done = 1; + + state->out_princ = state->tmp_princ; + if (state->tmp_princ == NULL) { + krb5_free_name_canon_iterator(context, state); + *iter = NULL; + return 0; + } + return 0; +} + +/** + * Iteratively apply name canon rules, outputing a principal and rule + * options each time. Iteration completes when the @iter is NULL on + * return or when an error is returned. Callers must free the iterator + * if they abandon it mid-way. + * + * @param context Kerberos context + * @param iter name canon rule iterator (input/output) + * @param try_princ output principal name + * @param rule_opts output rule options + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_name_canon_iterate(krb5_context context, + krb5_name_canon_iterator *iter, + krb5_const_principal *try_princ, + krb5_name_canon_rule_options *rule_opts) +{ + krb5_error_code ret; + + *try_princ = NULL; + + ret = name_canon_iterate(context, iter, rule_opts); + if (*iter) + *try_princ = (*iter)->out_princ; + return ret; +} + +/** + * Free a name canonicalization rule iterator. + */ +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_free_name_canon_iterator(krb5_context context, + krb5_name_canon_iterator iter) +{ + if (iter == NULL) + return; + if (iter->tmp_princ) + krb5_free_principal(context, iter->tmp_princ); + free(iter); } diff --git a/crypto/heimdal/lib/krb5/pseudo-random-test.c b/crypto/heimdal/lib/krb5/pseudo-random-test.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/pseudo-random-test.c @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2001 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "krb5_locl.h" +#include + +enum { MAXSIZE = 48 }; + +static struct testcase { + krb5_enctype enctype; + unsigned char constant[MAXSIZE]; + size_t constant_len; + unsigned char key[MAXSIZE]; + unsigned char res[MAXSIZE]; +} tests[] = { + {ETYPE_AES128_CTS_HMAC_SHA256_128, "test", 4, + {0x37, 0x05, 0xD9, 0x60, 0x80, 0xC1, 0x77, 0x28, 0xA0, 0xE8, 0x00, 0xEA, 0xB6, 0xE0, 0xD2, 0x3C}, + {0x9D, 0x18, 0x86, 0x16, 0xF6, 0x38, 0x52, 0xFE, 0x86, 0x91, 0x5B, 0xB8, 0x40, 0xB4, 0xA8, 0x86, + 0xFF, 0x3E, 0x6B, 0xB0, 0xF8, 0x19, 0xB4, 0x9B, 0x89, 0x33, 0x93, 0xD3, 0x93, 0x85, 0x42, 0x95}}, + {ETYPE_AES256_CTS_HMAC_SHA384_192, "test", 4, + {0x6D, 0x40, 0x4D, 0x37, 0xFA, 0xF7, 0x9F, 0x9D, 0xF0, 0xD3, 0x35, 0x68, 0xD3, 0x20, 0x66, 0x98, + 0x00, 0xEB, 0x48, 0x36, 0x47, 0x2E, 0xA8, 0xA0, 0x26, 0xD1, 0x6B, 0x71, 0x82, 0x46, 0x0C, 0x52}, + {0x98, 0x01, 0xF6, 0x9A, 0x36, 0x8C, 0x2B, 0xF6, 0x75, 0xE5, 0x95, 0x21, 0xE1, 0x77, 0xD9, 0xA0, + 0x7F, 0x67, 0xEF, 0xE1, 0xCF, 0xDE, 0x8D, 0x3C, 0x8D, 0x6F, 0x6A, 0x02, 0x56, 0xE3, 0xB1, 0x7D, + 0xB3, 0xC1, 0xB6, 0x2A, 0xD1, 0xB8, 0x55, 0x33, 0x60, 0xD1, 0x73, 0x67, 0xEB, 0x15, 0x14, 0xD2}}, + {0, {0}, 0, {0}, {0}} +}; + +int +main(int argc, char **argv) +{ + struct testcase *t; + krb5_context context; + krb5_error_code ret; + int val = 0; + + ret = krb5_init_context (&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + for (t = tests; t->enctype != 0; ++t) { + krb5_keyblock key; + krb5_crypto crypto; + krb5_data constant, prf; + + krb5_data_zero(&prf); + + key.keytype = t->enctype; + krb5_enctype_keysize(context, t->enctype, &key.keyvalue.length); + key.keyvalue.data = t->key; + + ret = krb5_crypto_init(context, &key, 0, &crypto); + if (ret) + krb5_err (context, 1, ret, "krb5_crypto_init"); + + constant.data = t->constant; + constant.length = t->constant_len; + + ret = krb5_crypto_prf(context, crypto, &constant, &prf); + if (ret) + krb5_err (context, 1, ret, "krb5_crypto_prf"); + + if (memcmp(prf.data, t->res, prf.length) != 0) { + const unsigned char *p = prf.data; + int i; + + printf ("PRF failed (enctype %d)\n", t->enctype); + printf ("should be: "); + for (i = 0; i < prf.length; ++i) + printf ("%02x", t->res[i]); + printf ("\nresult was: "); + for (i = 0; i < prf.length; ++i) + printf ("%02x", p[i]); + printf ("\n"); + val = 1; + } + krb5_data_free(&prf); + krb5_crypto_destroy(context, crypto); + } + krb5_free_context(context); + + return val; +} diff --git a/crypto/heimdal/lib/krb5/rd_cred.c b/crypto/heimdal/lib/krb5/rd_cred.c --- a/crypto/heimdal/lib/krb5/rd_cred.c +++ b/crypto/heimdal/lib/krb5/rd_cred.c @@ -96,7 +96,7 @@ goto out; } - if (cred.enc_part.etype == ETYPE_NULL) { + if (cred.enc_part.etype == (krb5_enctype)ETYPE_NULL) { /* DK: MIT GSS-API Compatibility */ enc_krb_cred_part_data.length = cred.enc_part.cipher.length; enc_krb_cred_part_data.data = cred.enc_part.cipher.data; @@ -222,7 +222,7 @@ if (enc_krb_cred_part.timestamp == NULL || enc_krb_cred_part.usec == NULL || - abs(*enc_krb_cred_part.timestamp - sec) + labs(*enc_krb_cred_part.timestamp - sec) > context->max_skew) { krb5_clear_error_message (context); ret = KRB5KRB_AP_ERR_SKEW; @@ -249,9 +249,7 @@ sizeof(**ret_creds)); if (*ret_creds == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } @@ -261,9 +259,7 @@ creds = calloc(1, sizeof(*creds)); if(creds == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, - N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } @@ -275,7 +271,11 @@ } if(creds->ticket.length != len) krb5_abortx(context, "internal error in ASN.1 encoder"); - copy_EncryptionKey (&kci->key, &creds->session); + ret = copy_EncryptionKey (&kci->key, &creds->session); + if (ret) { + krb5_free_creds(context, creds); + goto out; + } if (kci->prealm && kci->pname) _krb5_principalname2krb5_principal (context, &creds->client, diff --git a/crypto/heimdal/lib/krb5/rd_priv.c b/crypto/heimdal/lib/krb5/rd_priv.c --- a/crypto/heimdal/lib/krb5/rd_priv.c +++ b/crypto/heimdal/lib/krb5/rd_priv.c @@ -136,7 +136,7 @@ krb5_timeofday (context, &sec); if (part.timestamp == NULL || part.usec == NULL || - abs(*part.timestamp - sec) > context->max_skew) { + labs(*part.timestamp - sec) > context->max_skew) { krb5_clear_error_message (context); ret = KRB5KRB_AP_ERR_SKEW; goto failure_part; diff --git a/crypto/heimdal/lib/krb5/rd_rep.c b/crypto/heimdal/lib/krb5/rd_rep.c --- a/crypto/heimdal/lib/krb5/rd_rep.c +++ b/crypto/heimdal/lib/krb5/rd_rep.c @@ -45,6 +45,7 @@ krb5_data data; krb5_crypto crypto; + *repl = NULL; krb5_data_zero (&data); ret = decode_AP_REP(inbuf->data, inbuf->length, &ap_rep, &len); @@ -64,35 +65,32 @@ ret = krb5_crypto_init(context, auth_context->keyblock, 0, &crypto); if (ret) goto out; - ret = krb5_decrypt_EncryptedData (context, - crypto, - KRB5_KU_AP_REQ_ENC_PART, - &ap_rep.enc_part, - &data); + ret = krb5_decrypt_EncryptedData(context, + crypto, + KRB5_KU_AP_REQ_ENC_PART, + &ap_rep.enc_part, + &data); krb5_crypto_destroy(context, crypto); if (ret) goto out; *repl = malloc(sizeof(**repl)); if (*repl == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } ret = decode_EncAPRepPart(data.data, data.length, *repl, &len); if (ret) { krb5_set_error_message(context, ret, N_("Failed to decode EncAPRepPart", "")); - return ret; + goto out; } if (auth_context->flags & KRB5_AUTH_CONTEXT_DO_TIME) { if ((*repl)->ctime != auth_context->authenticator->ctime || (*repl)->cusec != auth_context->authenticator->cusec) { - krb5_free_ap_rep_enc_part(context, *repl); - *repl = NULL; ret = KRB5KRB_AP_ERR_MUT_FAIL; - krb5_clear_error_message (context); + krb5_clear_error_message(context); goto out; } } @@ -103,8 +101,12 @@ krb5_auth_con_setremotesubkey(context, auth_context, (*repl)->subkey); out: - krb5_data_free (&data); - free_AP_REP (&ap_rep); + if (ret) { + krb5_free_ap_rep_enc_part(context, *repl); + *repl = NULL; + } + krb5_data_free(&data); + free_AP_REP(&ap_rep); return ret; } diff --git a/crypto/heimdal/lib/krb5/rd_req.c b/crypto/heimdal/lib/krb5/rd_req.c --- a/crypto/heimdal/lib/krb5/rd_req.c +++ b/crypto/heimdal/lib/krb5/rd_req.c @@ -173,50 +173,17 @@ EtypeList *etypes) { krb5_error_code ret; - krb5_authdata *ad; - krb5_authdata adIfRelevant; - unsigned i; - - memset(&adIfRelevant, 0, sizeof(adIfRelevant)); - - etypes->len = 0; - etypes->val = NULL; - - ad = auth_context->authenticator->authorization_data; - if (ad == NULL) - return 0; - - for (i = 0; i < ad->len; i++) { - if (ad->val[i].ad_type == KRB5_AUTHDATA_IF_RELEVANT) { - ret = decode_AD_IF_RELEVANT(ad->val[i].ad_data.data, - ad->val[i].ad_data.length, - &adIfRelevant, - NULL); - if (ret) - return ret; - - if (adIfRelevant.len == 1 && - adIfRelevant.val[0].ad_type == - KRB5_AUTHDATA_GSS_API_ETYPE_NEGOTIATION) { - break; - } - free_AD_IF_RELEVANT(&adIfRelevant); - adIfRelevant.len = 0; - } - } - - if (adIfRelevant.len == 0) - return 0; - - ret = decode_EtypeList(adIfRelevant.val[0].ad_data.data, - adIfRelevant.val[0].ad_data.length, - etypes, - NULL); + krb5_data data; + + ret = _krb5_get_ad(context, auth_context->authenticator->authorization_data, NULL, KRB5_AUTHDATA_GSS_API_ETYPE_NEGOTIATION, &data); if (ret) - krb5_clear_error_message(context); - - free_AD_IF_RELEVANT(&adIfRelevant); - + return 0; + + ret = decode_EtypeList(data.data, data.length, etypes, NULL); + krb5_data_free(&data); + if (ret) + krb5_clear_error_message(context); + return ret; } @@ -276,33 +243,26 @@ size_t len) { krb5_error_code ret; - krb5_keyblock *key; + krb5_keyblock *key = NULL; krb5_authenticator authenticator; krb5_crypto crypto; - ret = krb5_auth_con_getauthenticator (context, - ac, - &authenticator); - if(ret) + ret = krb5_auth_con_getauthenticator(context, ac, &authenticator); + if (ret) return ret; - if(authenticator->cksum == NULL) { - krb5_free_authenticator(context, &authenticator); - return -17; + if (authenticator->cksum == NULL) { + ret = -17; + goto out; } ret = krb5_auth_con_getkey(context, ac, &key); - if(ret) { - krb5_free_authenticator(context, &authenticator); - return ret; - } + if (ret) + goto out; ret = krb5_crypto_init(context, key, 0, &crypto); - if(ret) + if (ret) goto out; - ret = krb5_verify_checksum (context, - crypto, - KRB5_KU_AP_REQ_AUTH_CKSUM, - data, - len, - authenticator->cksum); + ret = krb5_verify_checksum(context, crypto, + KRB5_KU_AP_REQ_AUTH_CKSUM, + data, len, authenticator->cksum); krb5_crypto_destroy(context, crypto); out: krb5_free_authenticator(context, &authenticator); @@ -348,6 +308,8 @@ krb5_error_code ret; EtypeList etypes; + memset(&etypes, 0, sizeof(etypes)); + if (ticket) *ticket = NULL; @@ -361,8 +323,7 @@ t = calloc(1, sizeof(*t)); if (t == NULL) { - ret = ENOMEM; - krb5_clear_error_message (context); + ret = krb5_enomem(context); goto out; } @@ -441,7 +402,7 @@ krb5_timeofday (context, &now); - if (abs(ac->authenticator->ctime - now) > context->max_skew) { + if (labs(ac->authenticator->ctime - now) > context->max_skew) { ret = KRB5KRB_AP_ERR_SKEW; krb5_clear_error_message (context); goto out; @@ -484,7 +445,7 @@ if (ap_req_options) { *ap_req_options = 0; - if (ac->keytype != ETYPE_NULL) + if (ac->keytype != (krb5_enctype)ETYPE_NULL) *ap_req_options |= AP_OPTS_USE_SUBKEY; if (ap_req->ap_options.use_session_key) *ap_req_options |= AP_OPTS_USE_SESSION_KEY; @@ -504,6 +465,7 @@ free_EtypeList(&etypes); return 0; out: + free_EtypeList(&etypes); if (t) krb5_free_ticket (context, t); if (auth_context == NULL || *auth_context == NULL) @@ -545,11 +507,8 @@ krb5_rd_req_in_ctx_alloc(krb5_context context, krb5_rd_req_in_ctx *ctx) { *ctx = calloc(1, sizeof(**ctx)); - if (*ctx == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*ctx == NULL) + return krb5_enomem(context); (*ctx)->check_pac = (context->flags & KRB5_CTX_F_CHECK_PAC) ? 1 : 0; return 0; } @@ -680,10 +639,22 @@ free(ctx); } -/* +/** + * Process an AP_REQ message. + * + * @param context Kerberos 5 context. + * @param auth_context authentication context of the peer. + * @param inbuf the AP_REQ message, obtained for example with krb5_read_message(). + * @param server server principal. + * @param keytab server keytab. + * @param ap_req_options set to the AP_REQ options. See the AP_OPTS_* defines. + * @param ticket on success, set to the authenticated client credentials. + * Must be deallocated with krb5_free_ticket(). If not + * interested, pass a NULL value. * + * @return 0 to indicate success. Otherwise a Kerberos error code is + * returned, see krb5_get_error_message(). */ - KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_rd_req(krb5_context context, krb5_auth_context *auth_context, @@ -821,12 +792,12 @@ * default values for the authentication context will used. * @param inbuf the (AP-REQ) authentication buffer * - * @param server the server with authenticate as, if NULL the function + * @param server the server to authenticate to. If NULL the function * will try to find any available credential in the keytab * that will verify the reply. The function will prefer the - * server the server client specified in the AP-REQ, but if + * server specified in the AP-REQ, but if * there is no mach, it will try all keytab entries for a - * match. This have serious performance issues for larger keytabs. + * match. This has serious performance issues for large keytabs. * * @param inctx control the behavior of the function, if NULL, the * default behavior is used. @@ -853,11 +824,8 @@ *outctx = NULL; o = calloc(1, sizeof(*o)); - if (o == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (o == NULL) + return krb5_enomem(context); if (*auth_context == NULL) { ret = krb5_auth_con_init(context, auth_context); @@ -869,7 +837,7 @@ if(ret) goto out; - /* Save that principal that was in the request */ + /* Save the principal that was in the request */ ret = _krb5_principalname2krb5_principal(context, &o->server, ap_req.ticket.sname, @@ -981,7 +949,7 @@ _krb5_kt_principal_not_found(context, ret, id, o->server, ap_req.ticket.enc_part.etype, kvno); - goto out; + break; } if (entry.keyblock.keytype != ap_req.ticket.enc_part.etype) { @@ -1014,13 +982,13 @@ &o->keyblock); if (ret) { krb5_kt_free_entry (context, &entry); - goto out; + break; } ret = krb5_copy_principal(context, entry.principal, &p); if (ret) { krb5_kt_free_entry (context, &entry); - goto out; + break; } krb5_free_principal(context, o->ticket->server); o->ticket->server = p; @@ -1030,6 +998,8 @@ done = 1; } krb5_kt_end_seq_get (context, id, &cursor); + if (ret) + goto out; } /* If there is a PAC, verify its server signature */ diff --git a/crypto/heimdal/lib/krb5/rd_safe.c b/crypto/heimdal/lib/krb5/rd_safe.c --- a/crypto/heimdal/lib/krb5/rd_safe.c +++ b/crypto/heimdal/lib/krb5/rd_safe.c @@ -159,7 +159,7 @@ if (safe.safe_body.timestamp == NULL || safe.safe_body.usec == NULL || - abs(*safe.safe_body.timestamp - sec) > context->max_skew) { + labs(*safe.safe_body.timestamp - sec) > context->max_skew) { ret = KRB5KRB_AP_ERR_SKEW; krb5_clear_error_message (context); goto failure; @@ -191,8 +191,7 @@ outbuf->length = safe.safe_body.user_data.length; outbuf->data = malloc(outbuf->length); if (outbuf->data == NULL && outbuf->length != 0) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); krb5_data_zero(outbuf); goto failure; } diff --git a/crypto/heimdal/lib/krb5/recvauth.c b/crypto/heimdal/lib/krb5/recvauth.c --- a/crypto/heimdal/lib/krb5/recvauth.c +++ b/crypto/heimdal/lib/krb5/recvauth.c @@ -43,6 +43,24 @@ return strcmp(data, appl_version) == 0; } +/** + * Perform the server side of the sendauth protocol. + * + * @param context Kerberos 5 context. + * @param auth_context authentication context of the peer. + * @param p_fd socket associated to the connection. + * @param appl_version server-specific string. + * @param server server principal. + * @param flags if KRB5_RECVAUTH_IGNORE_VERSION is set, skip the sendauth version + * part of the protocol. + * @param keytab server keytab. + * @param ticket on success, set to the authenticated client credentials. + * Must be deallocated with krb5_free_ticket(). If not + * interested, pass a NULL value. + * + * @return 0 to indicate success. Otherwise a Kerberos error code is + * returned, see krb5_get_error_message(). + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_recvauth(krb5_context context, krb5_auth_context *auth_context, @@ -59,6 +77,11 @@ keytab, ticket); } +/** + * Perform the server side of the sendauth protocol like krb5_recvauth(), but support + * a user-specified callback, \a match_appl_version, to perform the match of the application + * version \a match_data. + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_recvauth_match_version(krb5_context context, krb5_auth_context *auth_context, @@ -75,7 +98,7 @@ const char *version = KRB5_SENDAUTH_VERSION; char her_version[sizeof(KRB5_SENDAUTH_VERSION)]; char *her_appl_version; - uint32_t len, bytes; + uint32_t len; u_char repl; krb5_data data; krb5_flags ap_options; @@ -97,10 +120,13 @@ if (ret) return ret; + /* + * Expect SENDAUTH protocol version. + */ if(!(flags & KRB5_RECVAUTH_IGNORE_VERSION)) { n = krb5_net_read (context, p_fd, &len, 4); if (n < 0) { - ret = errno; + ret = errno ? errno : EINVAL; krb5_set_error_message(context, ret, "read: %s", strerror(ret)); return ret; } @@ -120,9 +146,12 @@ } } + /* + * Expect application protocol version. + */ n = krb5_net_read (context, p_fd, &len, 4); if (n < 0) { - ret = errno; + ret = errno ? errno : EINVAL; krb5_set_error_message(context, ret, "read: %s", strerror(ret)); return ret; } @@ -135,35 +164,38 @@ if (her_appl_version == NULL) { repl = 2; krb5_net_write (context, p_fd, &repl, 1); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } - if ((bytes = krb5_net_read (context, p_fd, her_appl_version, len))) { - /* PR/267884: String read must always conatain a terminating NUL */ - if (strnlen(her_appl_version, len) == len) - her_appl_version[len-1] = '\0'; - - if (bytes != len || - !(*match_appl_version)(match_data, her_appl_version)) { - repl = 2; - krb5_net_write (context, p_fd, &repl, 1); - krb5_set_error_message(context, KRB5_SENDAUTH_BADAPPLVERS, - N_("wrong sendauth version (%s)", ""), - her_appl_version); - free (her_appl_version); - return KRB5_SENDAUTH_BADAPPLVERS; - } + if (krb5_net_read (context, p_fd, her_appl_version, len) != len + || !(*match_appl_version)(match_data, her_appl_version)) { + repl = 2; + krb5_net_write (context, p_fd, &repl, 1); + krb5_set_error_message(context, KRB5_SENDAUTH_BADAPPLVERS, + N_("wrong sendauth application version (%s)", ""), + her_appl_version); + free (her_appl_version); + return KRB5_SENDAUTH_BADAPPLVERS; } free (her_appl_version); + /* + * Send OK. + */ repl = 0; if (krb5_net_write (context, p_fd, &repl, 1) != 1) { - ret = errno; + ret = errno ? errno : EINVAL; krb5_set_error_message(context, ret, "write: %s", strerror(ret)); return ret; } + /* + * Until here, the fields in the message were in cleartext and unauthenticated. + * From now on, Kerberos kicks in. + */ + + /* + * Expect AP_REQ. + */ krb5_data_zero (&data); ret = krb5_read_message (context, p_fd, &data); if (ret) @@ -197,15 +229,21 @@ return ret; } + /* + * Send OK. + */ len = 0; if (krb5_net_write (context, p_fd, &len, 4) != 4) { - ret = errno; + ret = errno ? errno : EINVAL; krb5_set_error_message(context, ret, "write: %s", strerror(ret)); krb5_free_ticket(context, *ticket); *ticket = NULL; return ret; } + /* + * If client requires mutual authentication, send AP_REP. + */ if (ap_options & AP_OPTS_MUTUAL_REQUIRED) { ret = krb5_mk_rep (context, *auth_context, &data); if (ret) { diff --git a/crypto/heimdal/lib/krb5/replay.c b/crypto/heimdal/lib/krb5/replay.c --- a/crypto/heimdal/lib/krb5/replay.c +++ b/crypto/heimdal/lib/krb5/replay.c @@ -139,6 +139,7 @@ krb5_set_error_message(context, ret, "open(%s): %s", id->name, buf); return ret; } + memset(&tmp, 0, sizeof(tmp)); tmp.stamp = auth_lifespan; fwrite(&tmp, 1, sizeof(tmp), f); fclose(f); @@ -205,6 +206,7 @@ time_t t; FILE *f; int ret; + size_t count; ent.stamp = time(NULL); checksum_authenticator(rep, ent.data); @@ -217,7 +219,9 @@ return ret; } rk_cloexec_file(f); - fread(&tmp, sizeof(ent), 1, f); + count = fread(&tmp, sizeof(ent), 1, f); + if(count != 1) + return KRB5_RC_IO_UNKNOWN; t = ent.stamp - tmp.stamp; while(fread(&tmp, sizeof(ent), 1, f)){ if(tmp.stamp < t) @@ -301,11 +305,8 @@ char *tmp = malloc(4 * piece->length + 1); char *name; - if(tmp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (tmp == NULL) + return krb5_enomem(context); strvisx(tmp, piece->data, piece->length, VIS_WHITE | VIS_OCTAL); #ifdef HAVE_GETEUID ret = asprintf(&name, "FILE:rc_%s_%u", tmp, (unsigned)geteuid()); @@ -313,11 +314,8 @@ ret = asprintf(&name, "FILE:rc_%s", tmp); #endif free(tmp); - if(ret < 0 || name == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ret < 0 || name == NULL) + return krb5_enomem(context); ret = krb5_rc_resolve_full(context, &rcache, name); free(name); diff --git a/crypto/heimdal/lib/krb5/salt-aes-sha1.c b/crypto/heimdal/lib/krb5/salt-aes-sha1.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/salt-aes-sha1.c @@ -0,0 +1,102 @@ +/* + * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + +int _krb5_AES_SHA1_string_to_default_iterator = 4096; + +static krb5_error_code +AES_SHA1_string_to_key(krb5_context context, + krb5_enctype enctype, + krb5_data password, + krb5_salt salt, + krb5_data opaque, + krb5_keyblock *key) +{ + krb5_error_code ret; + uint32_t iter; + struct _krb5_encryption_type *et; + struct _krb5_key_data kd; + + if (opaque.length == 0) + iter = _krb5_AES_SHA1_string_to_default_iterator; + else if (opaque.length == 4) { + unsigned long v; + _krb5_get_int(opaque.data, &v, 4); + iter = ((uint32_t)v); + } else + return KRB5_PROG_KEYTYPE_NOSUPP; /* XXX */ + + et = _krb5_find_enctype(enctype); + if (et == NULL) + return KRB5_PROG_KEYTYPE_NOSUPP; + + kd.schedule = NULL; + ALLOC(kd.key, 1); + if (kd.key == NULL) + return krb5_enomem(context); + kd.key->keytype = enctype; + ret = krb5_data_alloc(&kd.key->keyvalue, et->keytype->size); + if (ret) { + krb5_set_error_message (context, ret, N_("malloc: out of memory", "")); + return ret; + } + + ret = PKCS5_PBKDF2_HMAC(password.data, password.length, + salt.saltvalue.data, salt.saltvalue.length, + iter, + EVP_sha1(), + et->keytype->size, kd.key->keyvalue.data); + if (ret != 1) { + _krb5_free_key_data(context, &kd, et); + krb5_set_error_message(context, KRB5_PROG_KEYTYPE_NOSUPP, + "Error calculating s2k"); + return KRB5_PROG_KEYTYPE_NOSUPP; + } + + ret = _krb5_derive_key(context, et, &kd, "kerberos", strlen("kerberos")); + if (ret == 0) + ret = krb5_copy_keyblock_contents(context, kd.key, key); + _krb5_free_key_data(context, &kd, et); + + return ret; +} + +struct salt_type _krb5_AES_SHA1_salt[] = { + { + KRB5_PW_SALT, + "pw-salt", + AES_SHA1_string_to_key + }, + { 0, NULL, NULL } +}; diff --git a/crypto/heimdal/lib/krb5/salt-aes-sha2.c b/crypto/heimdal/lib/krb5/salt-aes-sha2.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/salt-aes-sha2.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" + +int _krb5_AES_SHA2_string_to_default_iterator = 32768; + +static krb5_error_code +AES_SHA2_string_to_key(krb5_context context, + krb5_enctype enctype, + krb5_data password, + krb5_salt salt, + krb5_data opaque, + krb5_keyblock *key) +{ + krb5_error_code ret; + uint32_t iter; + struct _krb5_encryption_type *et = NULL; + struct _krb5_key_data kd; + krb5_data saltp; + size_t enctypesz; + const EVP_MD *md = NULL; + + krb5_data_zero(&saltp); + kd.key = NULL; + kd.schedule = NULL; + + if (opaque.length == 0) { + iter = _krb5_AES_SHA2_string_to_default_iterator; + } else if (opaque.length == 4) { + unsigned long v; + _krb5_get_int(opaque.data, &v, 4); + iter = ((uint32_t)v); + } else { + ret = KRB5_PROG_KEYTYPE_NOSUPP; /* XXX */ + goto cleanup; + } + + et = _krb5_find_enctype(enctype); + if (et == NULL) { + ret = KRB5_PROG_KEYTYPE_NOSUPP; + goto cleanup; + } + + kd.schedule = NULL; + ALLOC(kd.key, 1); + if (kd.key == NULL) { + ret = krb5_enomem(context); + goto cleanup; + } + kd.key->keytype = enctype; + ret = krb5_data_alloc(&kd.key->keyvalue, et->keytype->size); + if (ret) { + ret = krb5_enomem(context); + goto cleanup; + } + + enctypesz = strlen(et->name) + 1; + ret = krb5_data_alloc(&saltp, enctypesz + salt.saltvalue.length); + if (ret) { + ret = krb5_enomem(context); + goto cleanup; + } + memcpy(saltp.data, et->name, enctypesz); + if (salt.saltvalue.length) + memcpy((unsigned char *)saltp.data + enctypesz, + salt.saltvalue.data, salt.saltvalue.length); + + ret = _krb5_aes_sha2_md_for_enctype(context, enctype, &md); + if (ret) + goto cleanup; + + ret = PKCS5_PBKDF2_HMAC(password.data, password.length, + saltp.data, saltp.length, + iter, md, + et->keytype->size, kd.key->keyvalue.data); + if (ret != 1) { + krb5_set_error_message(context, KRB5_PROG_KEYTYPE_NOSUPP, + "Error calculating s2k"); + ret = KRB5_PROG_KEYTYPE_NOSUPP; + goto cleanup; + } + + ret = _krb5_derive_key(context, et, &kd, "kerberos", strlen("kerberos")); + if (ret) + goto cleanup; + + ret = krb5_copy_keyblock_contents(context, kd.key, key); + if (ret) + goto cleanup; + +cleanup: + krb5_data_free(&saltp); + _krb5_free_key_data(context, &kd, et); + + return ret; +} + +struct salt_type _krb5_AES_SHA2_salt[] = { + { + KRB5_PW_SALT, + "pw-salt", + AES_SHA2_string_to_key + }, + { 0, NULL, NULL } +}; diff --git a/crypto/heimdal/lib/krb5/salt-aes.c b/crypto/heimdal/lib/krb5/salt-aes.c deleted file mode 100644 --- a/crypto/heimdal/lib/krb5/salt-aes.c +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 1997 - 2008 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "krb5_locl.h" - -int _krb5_AES_string_to_default_iterator = 4096; - -static krb5_error_code -AES_string_to_key(krb5_context context, - krb5_enctype enctype, - krb5_data password, - krb5_salt salt, - krb5_data opaque, - krb5_keyblock *key) -{ - krb5_error_code ret; - uint32_t iter; - struct _krb5_encryption_type *et; - struct _krb5_key_data kd; - - if (opaque.length == 0) - iter = _krb5_AES_string_to_default_iterator; - else if (opaque.length == 4) { - unsigned long v; - _krb5_get_int(opaque.data, &v, 4); - iter = ((uint32_t)v); - } else - return KRB5_PROG_KEYTYPE_NOSUPP; /* XXX */ - - et = _krb5_find_enctype(enctype); - if (et == NULL) - return KRB5_PROG_KEYTYPE_NOSUPP; - - kd.schedule = NULL; - ALLOC(kd.key, 1); - if(kd.key == NULL) { - krb5_set_error_message (context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } - kd.key->keytype = enctype; - ret = krb5_data_alloc(&kd.key->keyvalue, et->keytype->size); - if (ret) { - krb5_set_error_message (context, ret, N_("malloc: out of memory", "")); - return ret; - } - - ret = PKCS5_PBKDF2_HMAC_SHA1(password.data, password.length, - salt.saltvalue.data, salt.saltvalue.length, - iter, - et->keytype->size, kd.key->keyvalue.data); - if (ret != 1) { - _krb5_free_key_data(context, &kd, et); - krb5_set_error_message(context, KRB5_PROG_KEYTYPE_NOSUPP, - "Error calculating s2k"); - return KRB5_PROG_KEYTYPE_NOSUPP; - } - - ret = _krb5_derive_key(context, et, &kd, "kerberos", strlen("kerberos")); - if (ret == 0) - ret = krb5_copy_keyblock_contents(context, kd.key, key); - _krb5_free_key_data(context, &kd, et); - - return ret; -} - -struct salt_type _krb5_AES_salt[] = { - { - KRB5_PW_SALT, - "pw-salt", - AES_string_to_key - }, - { 0 } -}; diff --git a/crypto/heimdal/lib/krb5/salt-arcfour.c b/crypto/heimdal/lib/krb5/salt-arcfour.c --- a/crypto/heimdal/lib/krb5/salt-arcfour.c +++ b/crypto/heimdal/lib/krb5/salt-arcfour.c @@ -48,8 +48,7 @@ m = EVP_MD_CTX_create(); if (m == NULL) { - ret = ENOMEM; - krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); + ret = krb5_enomem(context); goto out; } @@ -58,22 +57,20 @@ ret = wind_utf8ucs2_length(password.data, &len); if (ret) { krb5_set_error_message (context, ret, - N_("Password not an UCS2 string", "")); + N_("Password is not valid UTF-8", "")); goto out; } s = malloc (len * sizeof(s[0])); if (len != 0 && s == NULL) { - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - ret = ENOMEM; + ret = krb5_enomem(context); goto out; } ret = wind_utf8ucs2(password.data, s, &len); if (ret) { krb5_set_error_message (context, ret, - N_("Password not an UCS2 string", "")); + N_("Password is not valid UTF-8", "")); goto out; } @@ -89,7 +86,7 @@ key->keytype = enctype; ret = krb5_data_alloc (&key->keyvalue, 16); if (ret) { - krb5_set_error_message (context, ENOMEM, N_("malloc: out of memory", "")); + krb5_enomem(context); goto out; } EVP_DigestFinal_ex (m, key->keyvalue.data, NULL); @@ -108,5 +105,5 @@ "pw-salt", ARCFOUR_string_to_key }, - { 0 } + { 0, NULL, NULL } }; diff --git a/crypto/heimdal/lib/krb5/salt-des.c b/crypto/heimdal/lib/krb5/salt-des.c --- a/crypto/heimdal/lib/krb5/salt-des.c +++ b/crypto/heimdal/lib/krb5/salt-des.c @@ -109,7 +109,7 @@ memset(&schedule, 0, sizeof(schedule)); memset(&temp_key, 0, sizeof(temp_key)); memset(&ivec, 0, sizeof(ivec)); - memset(password, 0, sizeof(password)); + memset_s(password, sizeof(password), 0, sizeof(password)); DES_set_odd_parity (key); } @@ -191,12 +191,11 @@ len = password.length + salt.saltvalue.length; s = malloc(len); - if(len > 0 && s == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (len > 0 && s == NULL) + return krb5_enomem(context); memcpy(s, password.data, password.length); - memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length); + if (salt.saltvalue.length) + memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length); DES_string_to_key_int(s, len, &tmp); key->keytype = enctype; krb5_data_copy(&key->keyvalue, tmp, sizeof(tmp)); @@ -219,6 +218,6 @@ DES_AFS3_string_to_key }, #endif - { 0 } + { 0, NULL, NULL } }; #endif diff --git a/crypto/heimdal/lib/krb5/salt-des3.c b/crypto/heimdal/lib/krb5/salt-des3.c --- a/crypto/heimdal/lib/krb5/salt-des3.c +++ b/crypto/heimdal/lib/krb5/salt-des3.c @@ -50,10 +50,8 @@ len = password.length + salt.saltvalue.length; str = malloc(len); - if(len != 0 && str == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (len != 0 && str == NULL) + return krb5_enomem(context); memcpy(str, password.data, password.length); memcpy(str + password.length, salt.saltvalue.data, salt.saltvalue.length); { @@ -63,7 +61,7 @@ ret = _krb5_n_fold(str, len, tmp, 24); if (ret) { - memset(str, 0, len); + memset_s(str, len, 0, len); free(str); krb5_set_error_message(context, ret, N_("malloc: out of memory", "")); return ret; @@ -73,27 +71,27 @@ memcpy(keys + i, tmp + i * 8, sizeof(keys[i])); DES_set_odd_parity(keys + i); if(DES_is_weak_key(keys + i)) - _krb5_xor(keys + i, (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); + _krb5_xor8(*(keys + i), (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); DES_set_key_unchecked(keys + i, &s[i]); } - memset(&ivec, 0, sizeof(ivec)); + memset_s(&ivec, sizeof(ivec), 0, sizeof(ivec)); DES_ede3_cbc_encrypt(tmp, tmp, sizeof(tmp), &s[0], &s[1], &s[2], &ivec, DES_ENCRYPT); - memset(s, 0, sizeof(s)); - memset(&ivec, 0, sizeof(ivec)); + memset_s(s, sizeof(s), 0, sizeof(s)); + memset_s(&ivec, sizeof(ivec), 0, sizeof(ivec)); for(i = 0; i < 3; i++){ memcpy(keys + i, tmp + i * 8, sizeof(keys[i])); DES_set_odd_parity(keys + i); if(DES_is_weak_key(keys + i)) - _krb5_xor(keys + i, (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); + _krb5_xor8(*(keys + i), (const unsigned char*)"\0\0\0\0\0\0\0\xf0"); } - memset(tmp, 0, sizeof(tmp)); + memset_s(tmp, sizeof(tmp), 0, sizeof(tmp)); } key->keytype = enctype; krb5_data_copy(&key->keyvalue, keys, sizeof(keys)); - memset(keys, 0, sizeof(keys)); - memset(str, 0, len); + memset_s(keys, sizeof(keys), 0, sizeof(keys)); + memset_s(str, len, 0, len); free(str); return 0; } @@ -112,18 +110,17 @@ char *s; s = malloc(len); - if(len != 0 && s == NULL) { - krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; - } + if (len != 0 && s == NULL) + return krb5_enomem(context); memcpy(s, password.data, password.length); - memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length); + if (salt.saltvalue.length) + memcpy(s + password.length, salt.saltvalue.data, salt.saltvalue.length); ret = krb5_string_to_key_derived(context, s, len, enctype, key); - memset(s, 0, len); + memset_s(s, len, 0, len); free(s); return ret; } @@ -136,7 +133,7 @@ "pw-salt", DES3_string_to_key }, - { 0 } + { 0, NULL, NULL } }; #endif @@ -146,5 +143,5 @@ "pw-salt", DES3_string_to_key_derived }, - { 0 } + { 0, NULL, NULL } }; diff --git a/crypto/heimdal/lib/krb5/salt.c b/crypto/heimdal/lib/krb5/salt.c --- a/crypto/heimdal/lib/krb5/salt.c +++ b/crypto/heimdal/lib/krb5/salt.c @@ -43,8 +43,7 @@ struct _krb5_encryption_type *e; struct salt_type *st; - (void) fbsd_ossl_provider_load(); - + *string = NULL; e = _krb5_find_enctype (etype); if (e == NULL) { krb5_set_error_message(context, KRB5_PROG_ETYPE_NOSUPP, @@ -55,11 +54,8 @@ for (st = e->keytype->string_to_key; st && st->type; st++) { if (st->type == stype) { *string = strdup (st->name); - if (*string == NULL) { - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*string == NULL) + return krb5_enomem(context); return 0; } } @@ -77,8 +73,6 @@ struct _krb5_encryption_type *e; struct salt_type *st; - (void) fbsd_ossl_provider_load(); - e = _krb5_find_enctype (etype); if (e == NULL) { krb5_set_error_message(context, KRB5_PROG_ETYPE_NOSUPP, @@ -200,7 +194,6 @@ enctype); return KRB5_PROG_ETYPE_NOSUPP; } - (void) fbsd_ossl_provider_load(); for(st = et->keytype->string_to_key; st && st->type; st++) if(st->type == salt.salttype) return (*st->string_to_key)(context, enctype, password, @@ -268,11 +261,8 @@ keylen = et->keytype->bits / 8; ALLOC(kd.key, 1); - if(kd.key == NULL) { - krb5_set_error_message (context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (kd.key == NULL) + return krb5_enomem(context); ret = krb5_data_alloc(&kd.key->keyvalue, et->keytype->size); if(ret) { free(kd.key); @@ -282,13 +272,12 @@ tmp = malloc (keylen); if(tmp == NULL) { krb5_free_keyblock(context, kd.key); - krb5_set_error_message (context, ENOMEM, N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } ret = _krb5_n_fold(str, len, tmp, keylen); if (ret) { free(tmp); - krb5_set_error_message (context, ENOMEM, N_("malloc: out of memory", "")); + krb5_enomem(context); return ret; } kd.schedule = NULL; diff --git a/crypto/heimdal/lib/krb5/scache.c b/crypto/heimdal/lib/krb5/scache.c --- a/crypto/heimdal/lib/krb5/scache.c +++ b/crypto/heimdal/lib/krb5/scache.c @@ -309,7 +309,6 @@ char *file; if (*name == '\0') { - krb5_error_code ret; ret = get_def_name(context, &s->name); if (ret) s->name = strdup(SCACHE_DEF_NAME); @@ -657,12 +656,10 @@ krb5_error_code ret; krb5_storage *sp; + krb5_data_zero(data); sp = krb5_storage_emem(); - if (sp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (sp == NULL) + return krb5_enomem(context); ret = krb5_store_creds(sp, creds); if (ret) { @@ -688,11 +685,8 @@ krb5_storage *sp; sp = krb5_storage_from_readonly_mem(data, length); - if (sp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (sp == NULL) + return krb5_enomem(context); ret = krb5_ret_creds(sp, creds); krb5_storage_free(sp); @@ -882,11 +876,8 @@ *cursor = NULL; ctx = calloc(1, sizeof(*ctx)); - if (ctx == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ctx == NULL) + return krb5_enomem(context); ret = make_database(context, s); if (ret) { @@ -905,19 +896,15 @@ ret = asprintf(&name, "credIteration%pPid%d", ctx, (int)getpid()); if (ret < 0 || name == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); free(ctx); - return ENOMEM; + return krb5_enomem(context); } ret = asprintf(&ctx->drop, "DROP TABLE %s", name); if (ret < 0 || ctx->drop == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); free(name); free(ctx); - return ENOMEM; + return krb5_enomem(context); } ret = asprintf(&str, "CREATE TEMPORARY TABLE %s " @@ -927,7 +914,7 @@ free(ctx->drop); free(name); free(ctx); - return ENOMEM; + return krb5_enomem(context); } ret = exec_stmt(context, s->db, str, KRB5_CC_IO); @@ -1161,11 +1148,8 @@ *cursor = NULL; ctx = calloc(1, sizeof(*ctx)); - if (ctx == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ctx == NULL) + return krb5_enomem(context); ret = default_db(context, &ctx->db); if (ctx->db == NULL) { @@ -1176,33 +1160,27 @@ ret = asprintf(&name, "cacheIteration%pPid%d", ctx, (int)getpid()); if (ret < 0 || name == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); sqlite3_close(ctx->db); free(ctx); - return ENOMEM; + return krb5_enomem(context); } ret = asprintf(&ctx->drop, "DROP TABLE %s", name); if (ret < 0 || ctx->drop == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); sqlite3_close(ctx->db); free(name); free(ctx); - return ENOMEM; + return krb5_enomem(context); } ret = asprintf(&str, "CREATE TEMPORARY TABLE %s AS SELECT name FROM caches", name); if (ret < 0 || str == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); sqlite3_close(ctx->db); free(name); free(ctx->drop); free(ctx); - return ENOMEM; + return krb5_enomem(context); } ret = exec_stmt(context, ctx->db, str, KRB5_CC_IO); @@ -1217,15 +1195,15 @@ } ret = asprintf(&str, "SELECT name FROM %s", name); - free(name); if (ret < 0 || str == NULL) { exec_stmt(context, ctx->db, ctx->drop, 0); sqlite3_close(ctx->db); free(name); free(ctx->drop); free(ctx); - return ENOMEM; + return krb5_enomem(context); } + free(name); ret = prepare_stmt(context, ctx->db, &ctx->stmt, str); free(str); @@ -1373,11 +1351,8 @@ ret = asprintf(str, "SCC:%s", name); free(name); - if (ret < 0 || *str == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (ret < 0 || *str == NULL) + return krb5_enomem(context); return 0; } @@ -1445,7 +1420,10 @@ scc_end_cache_get, scc_move, scc_get_default_name, - scc_set_default + scc_set_default, + NULL, + NULL, + NULL }; #endif diff --git a/crypto/heimdal/lib/krb5/send_to_kdc.c b/crypto/heimdal/lib/krb5/send_to_kdc.c --- a/crypto/heimdal/lib/krb5/send_to_kdc.c +++ b/crypto/heimdal/lib/krb5/send_to_kdc.c @@ -3,6 +3,8 @@ * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * + * Portions Copyright (c) 2010 - 2013 Apple Inc. All rights reserved. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -34,566 +36,1102 @@ #include "krb5_locl.h" #include "send_to_kdc_plugin.h" -struct send_to_kdc { - krb5_send_to_kdc_func func; - void *data; -}; - -/* - * send the data in `req' on the socket `fd' (which is datagram iff udp) - * waiting `tmout' for a reply and returning the reply in `rep'. - * iff limit read up to this many bytes - * returns 0 and data in `rep' if succesful, otherwise -1 +/** + * @section send_to_kdc Locating and sending packets to the KDC + * + * The send to kdc code is responsible to request the list of KDC from + * the locate-kdc subsystem and then send requests to each of them. + * + * - Each second a new hostname is tried. + * - If the hostname have several addresses, the first will be tried + * directly then in turn the other will be tried every 3 seconds + * (host_timeout). + * - UDP requests are tried 3 times, and it tried with a individual timeout of kdc_timeout / 3. + * - TCP and HTTP requests are tried 1 time. + * + * Total wait time shorter then (number of addresses * 3) + kdc_timeout seconds. + * */ static int -recv_loop (krb5_socket_t fd, - time_t tmout, - int udp, - size_t limit, - krb5_data *rep) +init_port(const char *s, int fallback) { - fd_set fdset; - struct timeval timeout; - int ret; - int nbytes; + int tmp; -#ifndef NO_LIMIT_FD_SETSIZE - if (fd >= FD_SETSIZE) { - return -1; - } -#endif + if (s && sscanf(s, "%d", &tmp) == 1) + return htons(tmp); + return fallback; +} + +struct send_via_plugin_s { + krb5_const_realm realm; + krb5_krbhst_info *hi; + time_t timeout; + const krb5_data *send_data; + krb5_data *receive; +}; + - krb5_data_zero(rep); - do { - FD_ZERO(&fdset); - FD_SET(fd, &fdset); - timeout.tv_sec = tmout; - timeout.tv_usec = 0; - ret = select (fd + 1, &fdset, NULL, NULL, &timeout); - if (ret < 0) { - if (errno == EINTR) - continue; - return -1; - } else if (ret == 0) { - return 0; - } else { - void *tmp; - - if (rk_SOCK_IOCTL (fd, FIONREAD, &nbytes) < 0) { - krb5_data_free (rep); - return -1; - } - if(nbytes <= 0) - return 0; - - if (limit) - nbytes = min((size_t)nbytes, limit - rep->length); - - tmp = realloc (rep->data, rep->length + nbytes); - if (tmp == NULL) { - krb5_data_free (rep); - return -1; - } - rep->data = tmp; - ret = recv (fd, (char*)tmp + rep->length, nbytes, 0); - if (ret < 0) { - krb5_data_free (rep); - return -1; - } - rep->length += ret; - } - } while(!udp && (limit == 0 || rep->length < limit)); - return 0; +static krb5_error_code KRB5_LIB_CALL +kdccallback(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + const krb5plugin_send_to_kdc_ftable *service = (const krb5plugin_send_to_kdc_ftable *)plug; + struct send_via_plugin_s *ctx = userctx; + + if (service->send_to_kdc == NULL) + return KRB5_PLUGIN_NO_HANDLE; + return service->send_to_kdc(context, plugctx, ctx->hi, ctx->timeout, + ctx->send_data, ctx->receive); } -/* - * Send kerberos requests and receive a reply on a udp or any other kind - * of a datagram socket. See `recv_loop'. - */ +static krb5_error_code KRB5_LIB_CALL +realmcallback(krb5_context context, const void *plug, void *plugctx, void *userctx) +{ + const krb5plugin_send_to_kdc_ftable *service = (const krb5plugin_send_to_kdc_ftable *)plug; + struct send_via_plugin_s *ctx = userctx; -static int -send_and_recv_udp(krb5_socket_t fd, - time_t tmout, - const krb5_data *req, - krb5_data *rep) + if (service->send_to_realm == NULL) + return KRB5_PLUGIN_NO_HANDLE; + return service->send_to_realm(context, plugctx, ctx->realm, ctx->timeout, + ctx->send_data, ctx->receive); +} + +static krb5_error_code +kdc_via_plugin(krb5_context context, + krb5_krbhst_info *hi, + time_t timeout, + const krb5_data *send_data, + krb5_data *receive) { - if (send (fd, req->data, req->length, 0) < 0) - return -1; + struct send_via_plugin_s userctx; + + userctx.realm = NULL; + userctx.hi = hi; + userctx.timeout = timeout; + userctx.send_data = send_data; + userctx.receive = receive; - return recv_loop(fd, tmout, 1, 0, rep); + return _krb5_plugin_run_f(context, "krb5", KRB5_PLUGIN_SEND_TO_KDC, + KRB5_PLUGIN_SEND_TO_KDC_VERSION_0, 0, + &userctx, kdccallback); } -/* - * `send_and_recv' for a TCP (or any other stream) socket. - * Since there are no record limits on a stream socket the protocol here - * is to prepend the request with 4 bytes of its length and the reply - * is similarly encoded. - */ +static krb5_error_code +realm_via_plugin(krb5_context context, + krb5_const_realm realm, + time_t timeout, + const krb5_data *send_data, + krb5_data *receive) +{ + struct send_via_plugin_s userctx; -static int -send_and_recv_tcp(krb5_socket_t fd, - time_t tmout, - const krb5_data *req, - krb5_data *rep) + userctx.realm = realm; + userctx.hi = NULL; + userctx.timeout = timeout; + userctx.send_data = send_data; + userctx.receive = receive; + + return _krb5_plugin_run_f(context, "krb5", KRB5_PLUGIN_SEND_TO_KDC, + KRB5_PLUGIN_SEND_TO_KDC_VERSION_2, 0, + &userctx, realmcallback); +} + +struct krb5_sendto_ctx_data { + int flags; + int type; + krb5_sendto_ctx_func func; + void *data; + char *hostname; + krb5_krbhst_handle krbhst; + + /* context2 */ + const krb5_data *send_data; + krb5_data response; + heim_array_t hosts; + int stateflags; +#define KRBHST_COMPLETED 1 + + /* prexmit */ + krb5_sendto_prexmit prexmit_func; + void *prexmit_ctx; + + /* stats */ + struct { + struct timeval start_time; + struct timeval name_resolution; + struct timeval krbhst; + unsigned long sent_packets; + unsigned long num_hosts; + } stats; + unsigned int stid; +}; + +static void +dealloc_sendto_ctx(void *ptr) { - unsigned char len[4]; - unsigned long rep_len; - krb5_data len_data; + krb5_sendto_ctx ctx = (krb5_sendto_ctx)ptr; + if (ctx->hostname) + free(ctx->hostname); + heim_release(ctx->hosts); + heim_release(ctx->krbhst); +} - _krb5_put_int(len, req->length, 4); - if(net_write (fd, len, sizeof(len)) < 0) - return -1; - if(net_write (fd, req->data, req->length) < 0) - return -1; - if (recv_loop (fd, tmout, 0, 4, &len_data) < 0) - return -1; - if (len_data.length != 4) { - krb5_data_free (&len_data); - return -1; - } - _krb5_get_int(len_data.data, &rep_len, 4); - krb5_data_free (&len_data); - if (recv_loop (fd, tmout, 0, rep_len, rep) < 0) - return -1; - if(rep->length != rep_len) { - krb5_data_free (rep); - return -1; +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_sendto_ctx_alloc(krb5_context context, krb5_sendto_ctx *ctx) +{ + *ctx = heim_alloc(sizeof(**ctx), "sendto-context", dealloc_sendto_ctx); + if (*ctx == NULL) + return krb5_enomem(context); + (*ctx)->hosts = heim_array_create(); + + return 0; +} + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_sendto_ctx_add_flags(krb5_sendto_ctx ctx, int flags) +{ + ctx->flags |= flags; +} + +KRB5_LIB_FUNCTION int KRB5_LIB_CALL +krb5_sendto_ctx_get_flags(krb5_sendto_ctx ctx) +{ + return ctx->flags; +} + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_sendto_ctx_set_type(krb5_sendto_ctx ctx, int type) +{ + ctx->type = type; +} + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_sendto_ctx_set_func(krb5_sendto_ctx ctx, + krb5_sendto_ctx_func func, + void *data) +{ + ctx->func = func; + ctx->data = data; +} + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_sendto_ctx_set_prexmit(krb5_sendto_ctx ctx, + krb5_sendto_prexmit prexmit, + void *data) +{ + ctx->prexmit_func = prexmit; + ctx->prexmit_ctx = data; +} + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_sendto_set_hostname(krb5_context context, + krb5_sendto_ctx ctx, + const char *hostname) +{ + if (ctx->hostname == NULL) + free(ctx->hostname); + ctx->hostname = strdup(hostname); + if (ctx->hostname == NULL) { + krb5_set_error_message(context, ENOMEM, N_("malloc: out of memory", "")); + return ENOMEM; } return 0; } -int -_krb5_send_and_recv_tcp(krb5_socket_t fd, - time_t tmout, - const krb5_data *req, - krb5_data *rep) +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_sendto_ctx_set_krb5hst(krb5_context context, + krb5_sendto_ctx ctx, + krb5_krbhst_handle handle) +{ + heim_release(ctx->krbhst); + ctx->krbhst = heim_retain(handle); +} + +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +krb5_sendto_ctx_free(krb5_context context, krb5_sendto_ctx ctx) { - return send_and_recv_tcp(fd, tmout, req, rep); + heim_release(ctx); +} + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_kdc_retry(krb5_context context, krb5_sendto_ctx ctx, void *data, + const krb5_data *reply, int *action) +{ + krb5_error_code ret; + KRB_ERROR error; + + if(krb5_rd_error(context, reply, &error)) + return 0; + + ret = krb5_error_from_rd_error(context, &error, NULL); + krb5_free_error_contents(context, &error); + + switch(ret) { + case KRB5KRB_ERR_RESPONSE_TOO_BIG: { + if (krb5_sendto_ctx_get_flags(ctx) & KRB5_KRBHST_FLAGS_LARGE_MSG) + break; + krb5_sendto_ctx_add_flags(ctx, KRB5_KRBHST_FLAGS_LARGE_MSG); + *action = KRB5_SENDTO_RESET; + break; + } + case KRB5KDC_ERR_SVC_UNAVAILABLE: + *action = KRB5_SENDTO_CONTINUE; + break; + } + return 0; } /* - * `send_and_recv' tailored for the HTTP protocol. + * */ -static int -send_and_recv_http(krb5_socket_t fd, - time_t tmout, - const char *prefix, - const krb5_data *req, - krb5_data *rep) -{ - char *request = NULL; - char *str; +struct host; + +struct host_fun { + krb5_error_code (*prepare)(krb5_context, struct host *, const krb5_data *); + krb5_error_code (*send_fn)(krb5_context, struct host *); + krb5_error_code (*recv_fn)(krb5_context, struct host *, krb5_data *); + int ntries; +}; + +struct host { + enum host_state { CONNECT, CONNECTING, CONNECTED, WAITING_REPLY, DEAD } state; + krb5_krbhst_info *hi; + struct addrinfo *ai; + rk_socket_t fd; + struct host_fun *fun; + unsigned int tries; + time_t timeout; + krb5_data data; + unsigned int tid; +}; + +static void +debug_host(krb5_context context, int level, struct host *host, const char *fmt, ...) + __attribute__ ((__format__ (__printf__, 4, 5))); + +static void +debug_host(krb5_context context, int level, struct host *host, const char *fmt, ...) +{ + const char *proto = "unknown"; + const char *state; + char name[NI_MAXHOST], port[NI_MAXSERV]; + char *text = NULL; + va_list ap; int ret; - int len = base64_encode(req->data, req->length, &str); - if(len < 0) - return -1; - ret = asprintf(&request, "GET %s%s HTTP/1.0\r\n\r\n", prefix, str); - free(str); - if (ret < 0 || request == NULL) + if (!_krb5_have_debug(context, 5)) + return; + + va_start(ap, fmt); + ret = vasprintf(&text, fmt, ap); + va_end(ap); + if (ret == -1 || text == NULL) + return; + + if (host->hi->proto == KRB5_KRBHST_HTTP) + proto = "http"; + else if (host->hi->proto == KRB5_KRBHST_TCP) + proto = "tcp"; + else if (host->hi->proto == KRB5_KRBHST_UDP) + proto = "udp"; + + if (getnameinfo(host->ai->ai_addr, host->ai->ai_addrlen, + name, sizeof(name), port, sizeof(port), NI_NUMERICHOST) != 0) + name[0] = '\0'; + + switch (host->state) { + case CONNECT: state = "CONNECT"; break; + case CONNECTING: state = "CONNECTING"; break; + case CONNECTED: state = "CONNECTED"; break; + case WAITING_REPLY: state = "WAITING_REPLY"; break; + case DEAD: state = "DEAD"; break; + default: state = "unknown"; break; + } + + _krb5_debug(context, level, "%s: %s %s:%s (%s) state=%s tid: %08x", text, + proto, name, port, host->hi->hostname, state, host->tid); + free(text); +} + + +static void +deallocate_host(void *ptr) +{ + struct host *host = ptr; + if (!rk_IS_BAD_SOCKET(host->fd)) + rk_closesocket(host->fd); + krb5_data_free(&host->data); + host->ai = NULL; +} + +static void +host_dead(krb5_context context, struct host *host, const char *msg) +{ + debug_host(context, 5, host, "%s", msg); + rk_closesocket(host->fd); + host->fd = rk_INVALID_SOCKET; + host->state = DEAD; +} + +static krb5_error_code +send_stream(krb5_context context, struct host *host) +{ + ssize_t len; + + len = krb5_net_write(context, &host->fd, host->data.data, host->data.length); + + if (len < 0) + return errno; + else if (len < host->data.length) { + host->data.length -= len; + memmove(host->data.data, ((uint8_t *)host->data.data) + len, host->data.length - len); return -1; - ret = net_write (fd, request, strlen(request)); - free (request); - if (ret < 0) + } else { + krb5_data_free(&host->data); + return 0; + } +} + +static krb5_error_code +recv_stream(krb5_context context, struct host *host) +{ + krb5_error_code ret; + size_t oldlen; + ssize_t sret; + int nbytes; + + if (rk_SOCK_IOCTL(host->fd, FIONREAD, &nbytes) != 0 || nbytes <= 0) + return HEIM_NET_CONN_REFUSED; + + if (context->max_msg_size - host->data.length < nbytes) { + krb5_set_error_message(context, KRB5KRB_ERR_FIELD_TOOLONG, + N_("TCP message from KDC too large %d", ""), + (int)(host->data.length + nbytes)); + return KRB5KRB_ERR_FIELD_TOOLONG; + } + + oldlen = host->data.length; + + ret = krb5_data_realloc(&host->data, oldlen + nbytes + 1 /* NUL */); + if (ret) return ret; - ret = recv_loop(fd, tmout, 0, 0, rep); - if(ret) + + sret = krb5_net_read(context, &host->fd, ((uint8_t *)host->data.data) + oldlen, nbytes); + if (sret <= 0) { + ret = errno; return ret; - { - unsigned long rep_len; - char *s, *p; - - s = realloc(rep->data, rep->length + 1); - if (s == NULL) { - krb5_data_free (rep); - return -1; - } - s[rep->length] = 0; - p = strstr(s, "\r\n\r\n"); - if(p == NULL) { - krb5_data_zero(rep); - free(s); - return -1; - } - p += 4; - rep->data = s; - rep->length -= p - s; - if(rep->length < 4) { /* remove length */ - krb5_data_zero(rep); - free(s); - return -1; - } - rep->length -= 4; - _krb5_get_int(p, &rep_len, 4); - if (rep_len != rep->length) { - krb5_data_zero(rep); - free(s); - return -1; - } - memmove(rep->data, p + 4, rep->length); } + host->data.length = oldlen + sret; + /* zero terminate for http transport */ + ((uint8_t *)host->data.data)[host->data.length] = '\0'; + return 0; } -static int -init_port(const char *s, int fallback) +/* + * + */ + +static void +host_next_timeout(krb5_context context, struct host *host) { - if (s) { - int tmp; + host->timeout = context->kdc_timeout / host->fun->ntries; + if (host->timeout == 0) + host->timeout = 1; - sscanf (s, "%d", &tmp); - return htons(tmp); - } else - return fallback; + host->timeout += time(NULL); } /* - * Return 0 if succesful, otherwise 1 + * connected host */ -static int -send_via_proxy (krb5_context context, - const krb5_krbhst_info *hi, - const krb5_data *send_data, - krb5_data *receive) -{ - char *proxy2 = strdup(context->http_proxy); - char *proxy = proxy2; - char *prefix = NULL; - char *colon; - struct addrinfo hints; - struct addrinfo *ai, *a; - int ret; - krb5_socket_t s = rk_INVALID_SOCKET; - char portstr[NI_MAXSERV]; +static void +host_connected(krb5_context context, krb5_sendto_ctx ctx, struct host *host) +{ + krb5_error_code ret; - if (proxy == NULL) - return ENOMEM; - if (strncmp (proxy, "http://", 7) == 0) - proxy += 7; - - colon = strchr(proxy, ':'); - if(colon != NULL) - *colon++ = '\0'; - memset (&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - snprintf (portstr, sizeof(portstr), "%d", - ntohs(init_port (colon, htons(80)))); - ret = getaddrinfo (proxy, portstr, &hints, &ai); - free (proxy2); + host->state = CONNECTED; + /* + * Now prepare data to send to host + */ + if (ctx->prexmit_func) { + krb5_data data; + + krb5_data_zero(&data); + + ret = ctx->prexmit_func(context, host->hi->proto, + ctx->prexmit_ctx, host->fd, &data); + if (ret == 0) { + if (data.length == 0) { + host_dead(context, host, "prexmit function didn't send data"); + return; + } + ret = host->fun->prepare(context, host, &data); + krb5_data_free(&data); + } + + } else { + ret = host->fun->prepare(context, host, ctx->send_data); + } if (ret) - return krb5_eai_to_heim_errno(ret, errno); + debug_host(context, 5, host, "failed to prexmit/prepare"); +} - for (a = ai; a != NULL; a = a->ai_next) { - s = socket (a->ai_family, a->ai_socktype | SOCK_CLOEXEC, a->ai_protocol); - if (s < 0) - continue; - rk_cloexec(s); - if (connect (s, a->ai_addr, a->ai_addrlen) < 0) { - rk_closesocket (s); - continue; +/* + * connect host + */ + +static void +host_connect(krb5_context context, krb5_sendto_ctx ctx, struct host *host) +{ + krb5_krbhst_info *hi = host->hi; + struct addrinfo *ai = host->ai; + + debug_host(context, 5, host, "connecting to host"); + + if (connect(host->fd, ai->ai_addr, ai->ai_addrlen) < 0) { +#ifdef HAVE_WINSOCK + if (WSAGetLastError() == WSAEWOULDBLOCK) + errno = EINPROGRESS; +#endif /* HAVE_WINSOCK */ + if (errno == EINPROGRESS && (hi->proto == KRB5_KRBHST_HTTP || hi->proto == KRB5_KRBHST_TCP)) { + debug_host(context, 5, host, "connecting to %d", host->fd); + host->state = CONNECTING; + } else { + host_dead(context, host, "failed to connect"); } - break; + } else { + host_connected(context, ctx, host); } - if (a == NULL) { - freeaddrinfo (ai); - return 1; - } - freeaddrinfo (ai); - ret = asprintf(&prefix, "http://%s/", hi->hostname); - if(ret < 0 || prefix == NULL) { - close(s); - return 1; - } - ret = send_and_recv_http(s, context->kdc_timeout, - prefix, send_data, receive); - rk_closesocket (s); - free(prefix); - if(ret == 0 && receive->length != 0) - return 0; - return 1; + host_next_timeout(context, host); } +/* + * HTTP transport + */ + static krb5_error_code -send_via_plugin(krb5_context context, - krb5_krbhst_info *hi, - time_t timeout, - const krb5_data *send_data, - krb5_data *receive) +prepare_http(krb5_context context, struct host *host, const krb5_data *data) { - struct krb5_plugin *list = NULL, *e; + char *str = NULL, *request = NULL; krb5_error_code ret; + int len; - ret = _krb5_plugin_find(context, PLUGIN_TYPE_DATA, KRB5_PLUGIN_SEND_TO_KDC, &list); - if(ret != 0 || list == NULL) - return KRB5_PLUGIN_NO_HANDLE; + heim_assert(host->data.length == 0, "prepare_http called twice"); - for (e = list; e != NULL; e = _krb5_plugin_get_next(e)) { - krb5plugin_send_to_kdc_ftable *service; - void *ctx; + len = rk_base64_encode(data->data, data->length, &str); + if(len < 0) + return ENOMEM; - service = _krb5_plugin_get_symbol(e); - if (service->minor_version != 0) - continue; + if (context->http_proxy) + ret = asprintf(&request, "GET http://%s/%s HTTP/1.0\r\n\r\n", host->hi->hostname, str); + else + ret = asprintf(&request, "GET /%s HTTP/1.0\r\n\r\n", str); + free(str); + if(ret < 0 || request == NULL) + return ENOMEM; + + host->data.data = request; + host->data.length = strlen(request); - (*service->init)(context, &ctx); - ret = (*service->send_to_kdc)(context, ctx, hi, - timeout, send_data, receive); - (*service->fini)(ctx); - if (ret == 0) - break; - if (ret != KRB5_PLUGIN_NO_HANDLE) { - krb5_set_error_message(context, ret, - N_("Plugin send_to_kdc failed to " - "lookup with error: %d", ""), ret); - break; - } + return 0; +} + +static krb5_error_code +recv_http(krb5_context context, struct host *host, krb5_data *data) +{ + krb5_error_code ret; + unsigned long rep_len; + size_t len; + char *p; + + /* + * recv_stream returns a NUL terminated stream + */ + + ret = recv_stream(context, host); + if (ret) + return ret; + + p = strstr(host->data.data, "\r\n\r\n"); + if (p == NULL) + return -1; + p += 4; + + len = host->data.length - (p - (char *)host->data.data); + if (len < 4) + return -1; + + _krb5_get_int(p, &rep_len, 4); + if (len < rep_len) + return -1; + + p += 4; + + memmove(host->data.data, p, rep_len); + host->data.length = rep_len; + + *data = host->data; + krb5_data_zero(&host->data); + + return 0; +} + +/* + * TCP transport + */ + +static krb5_error_code +prepare_tcp(krb5_context context, struct host *host, const krb5_data *data) +{ + krb5_error_code ret; + krb5_storage *sp; + + heim_assert(host->data.length == 0, "prepare_tcp called twice"); + + sp = krb5_storage_emem(); + if (sp == NULL) + return ENOMEM; + + ret = krb5_store_data(sp, *data); + if (ret) { + krb5_storage_free(sp); + return ret; } - _krb5_plugin_free(list); - return KRB5_PLUGIN_NO_HANDLE; + ret = krb5_storage_to_data(sp, &host->data); + krb5_storage_free(sp); + + return ret; } +static krb5_error_code +recv_tcp(krb5_context context, struct host *host, krb5_data *data) +{ + krb5_error_code ret; + unsigned long pktlen; + + ret = recv_stream(context, host); + if (ret) + return ret; + + if (host->data.length < 4) + return -1; + + _krb5_get_int(host->data.data, &pktlen, 4); + + if (pktlen > host->data.length - 4) + return -1; + + memmove(host->data.data, ((uint8_t *)host->data.data) + 4, host->data.length - 4); + host->data.length -= 4; + + *data = host->data; + krb5_data_zero(&host->data); + + return 0; +} /* - * Send the data `send' to one host from `handle` and get back the reply - * in `receive'. + * UDP transport */ -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_sendto (krb5_context context, - const krb5_data *send_data, - krb5_krbhst_handle handle, - krb5_data *receive) -{ - krb5_error_code ret; - krb5_socket_t fd; - size_t i; - - krb5_data_zero(receive); - - for (i = 0; i < context->max_retries; ++i) { - krb5_krbhst_info *hi; - - while (krb5_krbhst_next(context, handle, &hi) == 0) { - struct addrinfo *ai, *a; - - _krb5_debug(context, 2, - "trying to communicate with host %s in realm %s", - hi->hostname, _krb5_krbhst_get_realm(handle)); - - if (context->send_to_kdc) { - struct send_to_kdc *s = context->send_to_kdc; - - ret = (*s->func)(context, s->data, hi, - context->kdc_timeout, send_data, receive); - if (ret == 0 && receive->length != 0) - goto out; - continue; - } - - ret = send_via_plugin(context, hi, context->kdc_timeout, - send_data, receive); - if (ret == 0 && receive->length != 0) - goto out; - else if (ret != KRB5_PLUGIN_NO_HANDLE) - continue; - - if(hi->proto == KRB5_KRBHST_HTTP && context->http_proxy) { - if (send_via_proxy (context, hi, send_data, receive) == 0) { - ret = 0; - goto out; - } - continue; - } - - ret = krb5_krbhst_get_addrinfo(context, hi, &ai); - if (ret) - continue; - - for (a = ai; a != NULL; a = a->ai_next) { - fd = socket (a->ai_family, a->ai_socktype | SOCK_CLOEXEC, a->ai_protocol); - if (rk_IS_BAD_SOCKET(fd)) - continue; - rk_cloexec(fd); - if (connect (fd, a->ai_addr, a->ai_addrlen) < 0) { - rk_closesocket (fd); - continue; - } - switch (hi->proto) { - case KRB5_KRBHST_HTTP : - ret = send_and_recv_http(fd, context->kdc_timeout, - "", send_data, receive); - break; - case KRB5_KRBHST_TCP : - ret = send_and_recv_tcp (fd, context->kdc_timeout, - send_data, receive); - break; - case KRB5_KRBHST_UDP : - ret = send_and_recv_udp (fd, context->kdc_timeout, - send_data, receive); - break; - } - rk_closesocket (fd); - if(ret == 0 && receive->length != 0) - goto out; - } - } - krb5_krbhst_reset(context, handle); - } - krb5_clear_error_message (context); - ret = KRB5_KDC_UNREACH; -out: - _krb5_debug(context, 2, - "result of trying to talk to realm %s = %d", - _krb5_krbhst_get_realm(handle), ret); - return ret; +static krb5_error_code +prepare_udp(krb5_context context, struct host *host, const krb5_data *data) +{ + return krb5_data_copy(&host->data, data->data, data->length); } -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_sendto_kdc(krb5_context context, - const krb5_data *send_data, - const krb5_realm *realm, - krb5_data *receive) +static krb5_error_code +send_udp(krb5_context context, struct host *host) { - return krb5_sendto_kdc_flags(context, send_data, realm, receive, 0); + if (send(host->fd, host->data.data, host->data.length, 0) < 0) + return errno; + return 0; } -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_sendto_kdc_flags(krb5_context context, - const krb5_data *send_data, - const krb5_realm *realm, - krb5_data *receive, - int flags) +static krb5_error_code +recv_udp(krb5_context context, struct host *host, krb5_data *data) { krb5_error_code ret; - krb5_sendto_ctx ctx; + int nbytes; + - ret = krb5_sendto_ctx_alloc(context, &ctx); + if (rk_SOCK_IOCTL(host->fd, FIONREAD, &nbytes) != 0 || nbytes <= 0) + return HEIM_NET_CONN_REFUSED; + + if (context->max_msg_size < nbytes) { + krb5_set_error_message(context, KRB5KRB_ERR_FIELD_TOOLONG, + N_("UDP message from KDC too large %d", ""), + (int)nbytes); + return KRB5KRB_ERR_FIELD_TOOLONG; + } + + ret = krb5_data_alloc(data, nbytes); if (ret) return ret; - krb5_sendto_ctx_add_flags(ctx, flags); - krb5_sendto_ctx_set_func(ctx, _krb5_kdc_retry, NULL); - ret = krb5_sendto_context(context, ctx, send_data, *realm, receive); - krb5_sendto_ctx_free(context, ctx); - return ret; + ret = recv(host->fd, data->data, data->length, 0); + if (ret < 0) { + ret = errno; + krb5_data_free(data); + return ret; + } + data->length = ret; + + return 0; } -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_set_send_to_kdc_func(krb5_context context, - krb5_send_to_kdc_func func, - void *data) +static struct host_fun http_fun = { + prepare_http, + send_stream, + recv_http, + 1 +}; +static struct host_fun tcp_fun = { + prepare_tcp, + send_stream, + recv_tcp, + 1 +}; +static struct host_fun udp_fun = { + prepare_udp, + send_udp, + recv_udp, + 3 +}; + + +/* + * Host state machine + */ + +static int +eval_host_state(krb5_context context, + krb5_sendto_ctx ctx, + struct host *host, + int readable, int writeable) { - free(context->send_to_kdc); - if (func == NULL) { - context->send_to_kdc = NULL; + krb5_error_code ret; + + if (host->state == CONNECT) { + /* check if its this host time to connect */ + if (host->timeout < time(NULL)) + host_connect(context, ctx, host); return 0; } - context->send_to_kdc = malloc(sizeof(*context->send_to_kdc)); - if (context->send_to_kdc == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + if (host->state == CONNECTING && writeable) + host_connected(context, ctx, host); + + if (readable) { + + debug_host(context, 5, host, "reading packet"); + + ret = host->fun->recv_fn(context, host, &ctx->response); + if (ret == -1) { + /* not done yet */ + } else if (ret == 0) { + /* if recv_foo function returns 0, we have a complete reply */ + debug_host(context, 5, host, "host completed"); + return 1; + } else { + host_dead(context, host, "host disconnected"); + } + } + + /* check if there is anything to send, state might DEAD after read */ + if (writeable && host->state == CONNECTED) { + + ctx->stats.sent_packets++; + + debug_host(context, 5, host, "writing packet"); + + ret = host->fun->send_fn(context, host); + if (ret == -1) { + /* not done yet */ + } else if (ret) { + host_dead(context, host, "host dead, write failed"); + } else + host->state = WAITING_REPLY; } - context->send_to_kdc->func = func; - context->send_to_kdc->data = data; return 0; } -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -_krb5_copy_send_to_kdc_func(krb5_context context, krb5_context to) +/* + * + */ + +static krb5_error_code +submit_request(krb5_context context, krb5_sendto_ctx ctx, krb5_krbhst_info *hi) { - if (context->send_to_kdc) - return krb5_set_send_to_kdc_func(to, - context->send_to_kdc->func, - context->send_to_kdc->data); - else - return krb5_set_send_to_kdc_func(to, NULL, NULL); -} + unsigned long submitted_host = 0; + krb5_boolean freeai = FALSE; + struct timeval nrstart, nrstop; + krb5_error_code ret; + struct addrinfo *ai = NULL, *a; + struct host *host; + ret = kdc_via_plugin(context, hi, context->kdc_timeout, + ctx->send_data, &ctx->response); + if (ret == 0) { + return 0; + } else if (ret != KRB5_PLUGIN_NO_HANDLE) { + _krb5_debug(context, 5, "send via plugin failed %s: %d", + hi->hostname, ret); + return ret; + } + /* + * If we have a proxy, let use the address of the proxy instead of + * the KDC and let the proxy deal with the resolving of the KDC. + */ + + gettimeofday(&nrstart, NULL); + + if (hi->proto == KRB5_KRBHST_HTTP && context->http_proxy) { + char *proxy2 = strdup(context->http_proxy); + char *el, *proxy = proxy2; + struct addrinfo hints; + char portstr[NI_MAXSERV]; + unsigned short nport; + + if (proxy == NULL) + return ENOMEM; + if (strncmp(proxy, "http://", 7) == 0) + proxy += 7; + + /* check for url terminating slash */ + el = strchr(proxy, '/'); + if (el != NULL) + *el = '\0'; + + /* check for port in hostname, used below as port */ + el = strchr(proxy, ':'); + if(el != NULL) + *el++ = '\0'; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = PF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + /* On some systems ntohs(foo(..., htons(...))) causes shadowing */ + nport = init_port(el, htons(80)); + snprintf(portstr, sizeof(portstr), "%d", ntohs(nport)); + + ret = getaddrinfo(proxy, portstr, &hints, &ai); + free(proxy2); + if (ret) + return krb5_eai_to_heim_errno(ret, errno); + + freeai = TRUE; -struct krb5_sendto_ctx_data { - int flags; - int type; - krb5_sendto_ctx_func func; - void *data; -}; + } else { + ret = krb5_krbhst_get_addrinfo(context, hi, &ai); + if (ret) + return ret; + } -KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_sendto_ctx_alloc(krb5_context context, krb5_sendto_ctx *ctx) -{ - *ctx = calloc(1, sizeof(**ctx)); - if (*ctx == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + /* add up times */ + gettimeofday(&nrstop, NULL); + timevalsub(&nrstop, &nrstart); + timevaladd(&ctx->stats.name_resolution, &nrstop); + + ctx->stats.num_hosts++; + + for (a = ai; a != NULL; a = a->ai_next) { + rk_socket_t fd; + + fd = socket(a->ai_family, a->ai_socktype | SOCK_CLOEXEC, a->ai_protocol); + if (rk_IS_BAD_SOCKET(fd)) + continue; + rk_cloexec(fd); + +#ifndef NO_LIMIT_FD_SETSIZE + if (fd >= FD_SETSIZE) { + _krb5_debug(context, 0, "fd too large for select"); + rk_closesocket(fd); + continue; + } +#endif + socket_set_nonblocking(fd, 1); + + host = heim_alloc(sizeof(*host), "sendto-host", deallocate_host); + if (host == NULL) { + if (freeai) + freeaddrinfo(ai); + rk_closesocket(fd); + return ENOMEM; + } + host->hi = hi; + host->fd = fd; + host->ai = a; + /* next version of stid */ + host->tid = ctx->stid = (ctx->stid & 0xffff0000) | ((ctx->stid & 0xffff) + 1); + + host->state = CONNECT; + + switch (host->hi->proto) { + case KRB5_KRBHST_HTTP : + host->fun = &http_fun; + break; + case KRB5_KRBHST_TCP : + host->fun = &tcp_fun; + break; + case KRB5_KRBHST_UDP : + host->fun = &udp_fun; + break; + default: + heim_abort("undefined http transport protocol: %d", (int)host->hi->proto); + } + + host->tries = host->fun->ntries; + + /* + * Connect directly next host, wait a host_timeout for each next address. + * We try host_connect() here, checking the return code because as we do + * non-blocking connects, any error here indicates that the address is just + * offline. That is, it's something like "No route to host" which is not + * worth retrying. And so, we fail directly and immediately to the next + * address for this host without enqueueing the address for retries. + */ + if (submitted_host == 0) { + host_connect(context, ctx, host); + if (host->state == DEAD) + continue; + } else { + debug_host(context, 5, host, + "Queuing host in future (in %ds), its the %lu address on the same name", + (int)(context->host_timeout * submitted_host), submitted_host + 1); + host->timeout = time(NULL) + (submitted_host * context->host_timeout); + } + + heim_array_append_value(ctx->hosts, host); + heim_release(host); + submitted_host++; } + + if (freeai) + freeaddrinfo(ai); + + if (submitted_host == 0) + return KRB5_KDC_UNREACH; + return 0; } -KRB5_LIB_FUNCTION void KRB5_LIB_CALL -krb5_sendto_ctx_add_flags(krb5_sendto_ctx ctx, int flags) +struct wait_ctx { + krb5_context context; + krb5_sendto_ctx ctx; + fd_set rfds; + fd_set wfds; + rk_socket_t max_fd; + int got_reply; + time_t timenow; +}; + +static void +wait_setup(heim_object_t obj, void *iter_ctx, int *stop) { - ctx->flags |= flags; + struct wait_ctx *wait_ctx = iter_ctx; + struct host *h = (struct host *)obj; + + if (h->state == CONNECT) { + if (h->timeout >= wait_ctx->timenow) + return; + host_connect(wait_ctx->context, wait_ctx->ctx, h); + } + + /* skip dead hosts */ + if (h->state == DEAD) + return; + + /* if host timed out, dec tries and (retry or kill host) */ + if (h->timeout < wait_ctx->timenow) { + heim_assert(h->tries != 0, "tries should not reach 0"); + h->tries--; + if (h->tries == 0) { + host_dead(wait_ctx->context, h, "host timed out"); + return; + } else { + debug_host(wait_ctx->context, 5, h, "retrying sending to"); + host_next_timeout(wait_ctx->context, h); + host_connected(wait_ctx->context, wait_ctx->ctx, h); + } + } + +#ifndef NO_LIMIT_FD_SETSIZE + heim_assert(h->fd < FD_SETSIZE, "fd too large"); +#endif + switch (h->state) { + case WAITING_REPLY: + FD_SET(h->fd, &wait_ctx->rfds); + break; + case CONNECTING: + case CONNECTED: + FD_SET(h->fd, &wait_ctx->rfds); + FD_SET(h->fd, &wait_ctx->wfds); + break; + default: + debug_host(wait_ctx->context, 5, h, "invalid sendto host state"); + heim_abort("invalid sendto host state"); + } + if (h->fd > wait_ctx->max_fd || wait_ctx->max_fd == rk_INVALID_SOCKET) + wait_ctx->max_fd = h->fd; } -KRB5_LIB_FUNCTION int KRB5_LIB_CALL -krb5_sendto_ctx_get_flags(krb5_sendto_ctx ctx) +static int +wait_filter_dead(heim_object_t obj, void *ctx) { - return ctx->flags; + struct host *h = (struct host *)obj; + return (int)((h->state == DEAD) ? true : false); } -KRB5_LIB_FUNCTION void KRB5_LIB_CALL -krb5_sendto_ctx_set_type(krb5_sendto_ctx ctx, int type) +static void +wait_accelerate(heim_object_t obj, void *ctx, int *stop) { - ctx->type = type; + struct host *h = (struct host *)obj; + + if (h->state == CONNECT && h->timeout > 0) + h->timeout--; } +static void +wait_process(heim_object_t obj, void *ctx, int *stop) +{ + struct wait_ctx *wait_ctx = ctx; + struct host *h = (struct host *)obj; + int readable, writeable; + heim_assert(h->state != DEAD, "dead host resurected"); -KRB5_LIB_FUNCTION void KRB5_LIB_CALL -krb5_sendto_ctx_set_func(krb5_sendto_ctx ctx, - krb5_sendto_ctx_func func, - void *data) +#ifndef NO_LIMIT_FD_SETSIZE + heim_assert(h->fd < FD_SETSIZE, "fd too large"); +#endif + readable = FD_ISSET(h->fd, &wait_ctx->rfds); + writeable = FD_ISSET(h->fd, &wait_ctx->wfds); + + if (readable || writeable || h->state == CONNECT) + wait_ctx->got_reply |= eval_host_state(wait_ctx->context, wait_ctx->ctx, h, readable, writeable); + + /* if there is already a reply, just fall though the array */ + if (wait_ctx->got_reply) + *stop = 1; +} + +static krb5_error_code +wait_response(krb5_context context, int *action, krb5_sendto_ctx ctx) { - ctx->func = func; - ctx->data = data; + struct wait_ctx wait_ctx; + struct timeval tv; + int ret; + + wait_ctx.context = context; + wait_ctx.ctx = ctx; + FD_ZERO(&wait_ctx.rfds); + FD_ZERO(&wait_ctx.wfds); + wait_ctx.max_fd = rk_INVALID_SOCKET; + + /* oh, we have a reply, it must be a plugin that got it for us */ + if (ctx->response.length) { + *action = KRB5_SENDTO_FILTER; + return 0; + } + + wait_ctx.timenow = time(NULL); + + heim_array_iterate_f(ctx->hosts, &wait_ctx, wait_setup); + heim_array_filter_f(ctx->hosts, &wait_ctx, wait_filter_dead); + + if (heim_array_get_length(ctx->hosts) == 0) { + if (ctx->stateflags & KRBHST_COMPLETED) { + _krb5_debug(context, 5, "no more hosts to send/recv packets to/from " + "trying to pulling more hosts"); + *action = KRB5_SENDTO_FAILED; + } else { + _krb5_debug(context, 5, "no more hosts to send/recv packets to/from " + "and no more hosts -> failure"); + *action = KRB5_SENDTO_TIMEOUT; + } + return 0; + } + + if (wait_ctx.max_fd == rk_INVALID_SOCKET) { + /* + * If we don't find a host which can make progress, then + * we accelerate the process by moving all of the contestants + * up by 1s. + */ + _krb5_debug(context, 5, "wait_response: moving the contestants forward"); + heim_array_iterate_f(ctx->hosts, &wait_ctx, wait_accelerate); + return 0; + } + + tv.tv_sec = 1; + tv.tv_usec = 0; + + ret = select(wait_ctx.max_fd + 1, &wait_ctx.rfds, &wait_ctx.wfds, NULL, &tv); + if (ret < 0) + return errno; + if (ret == 0) { + *action = KRB5_SENDTO_TIMEOUT; + return 0; + } + + wait_ctx.got_reply = 0; + heim_array_iterate_f(ctx->hosts, &wait_ctx, wait_process); + if (wait_ctx.got_reply) + *action = KRB5_SENDTO_FILTER; + else + *action = KRB5_SENDTO_CONTINUE; + + return 0; } -KRB5_LIB_FUNCTION void KRB5_LIB_CALL -krb5_sendto_ctx_free(krb5_context context, krb5_sendto_ctx ctx) +static void +reset_context(krb5_context context, krb5_sendto_ctx ctx) { - memset(ctx, 0, sizeof(*ctx)); - free(ctx); + krb5_data_free(&ctx->response); + heim_release(ctx->hosts); + ctx->hosts = heim_array_create(); + ctx->stateflags = 0; } + +/* + * + */ + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sendto_context(krb5_context context, krb5_sendto_ctx ctx, const krb5_data *send_data, - const krb5_realm realm, + krb5_const_realm realm, krb5_data *receive) { - krb5_error_code ret; + krb5_error_code ret = 0; krb5_krbhst_handle handle = NULL; + struct timeval nrstart, nrstop, stop_time; int type, freectx = 0; int action; + int numreset = 0; krb5_data_zero(receive); - + if (ctx == NULL) { - freectx = 1; ret = krb5_sendto_ctx_alloc(context, &ctx); if (ret) - return ret; + goto out; + freectx = 1; } + ctx->stid = (context->num_kdc_requests++) << 16; + + memset(&ctx->stats, 0, sizeof(ctx->stats)); + gettimeofday(&ctx->stats.start_time, NULL); + type = ctx->type; if (type == 0) { if ((ctx->flags & KRB5_KRBHST_FLAGS_MASTER) || context->use_admin_kdc) @@ -602,76 +1140,165 @@ type = KRB5_KRBHST_KDC; } + ctx->send_data = send_data; + if ((int)send_data->length > context->large_msg_size) ctx->flags |= KRB5_KRBHST_FLAGS_LARGE_MSG; /* loop until we get back a appropriate response */ - do { - action = KRB5_SENDTO_DONE; + action = KRB5_SENDTO_INITIAL; - krb5_data_free(receive); + while (action != KRB5_SENDTO_DONE && action != KRB5_SENDTO_FAILED) { + krb5_krbhst_info *hi; - if (handle == NULL) { - ret = krb5_krbhst_init_flags(context, realm, type, - ctx->flags, &handle); - if (ret) { - if (freectx) - krb5_sendto_ctx_free(context, ctx); - return ret; + switch (action) { + case KRB5_SENDTO_INITIAL: + ret = realm_via_plugin(context, realm, context->kdc_timeout, + send_data, &ctx->response); + if (ret == 0 || ret != KRB5_PLUGIN_NO_HANDLE) { + action = KRB5_SENDTO_DONE; + break; + } + action = KRB5_SENDTO_KRBHST; + /* FALLTHROUGH */ + case KRB5_SENDTO_KRBHST: + if (ctx->krbhst == NULL) { + ret = krb5_krbhst_init_flags(context, realm, type, + ctx->flags, &handle); + if (ret) + goto out; + + if (ctx->hostname) { + ret = krb5_krbhst_set_hostname(context, handle, ctx->hostname); + if (ret) + goto out; + } + + } else { + handle = heim_retain(ctx->krbhst); + } + action = KRB5_SENDTO_TIMEOUT; + /* FALLTHROUGH */ + case KRB5_SENDTO_TIMEOUT: + + /* + * If we completed, just got to next step + */ + + if (ctx->stateflags & KRBHST_COMPLETED) { + action = KRB5_SENDTO_CONTINUE; + break; + } + + /* + * Pull out next host, if there is no more, close the + * handle and mark as completed. + * + * Collect time spent in krbhst (dns, plugin, etc) + */ + + + gettimeofday(&nrstart, NULL); + + ret = krb5_krbhst_next(context, handle, &hi); + + gettimeofday(&nrstop, NULL); + timevalsub(&nrstop, &nrstart); + timevaladd(&ctx->stats.krbhst, &nrstop); + + action = KRB5_SENDTO_CONTINUE; + if (ret == 0) { + _krb5_debug(context, 5, "submitting new requests to new host"); + if (submit_request(context, ctx, hi) != 0) + action = KRB5_SENDTO_TIMEOUT; + } else { + _krb5_debug(context, 5, "out of hosts, waiting for replies"); + ctx->stateflags |= KRBHST_COMPLETED; } - } - ret = krb5_sendto(context, send_data, handle, receive); - if (ret) break; - if (ctx->func) { - ret = (*ctx->func)(context, ctx, ctx->data, receive, &action); + case KRB5_SENDTO_CONTINUE: + + ret = wait_response(context, &action, ctx); if (ret) - break; - } - if (action != KRB5_SENDTO_CONTINUE) { - krb5_krbhst_free(context, handle); - handle = NULL; + goto out; + + break; + case KRB5_SENDTO_RESET: + /* start over */ + _krb5_debug(context, 5, + "krb5_sendto trying over again (reset): %d", + numreset); + reset_context(context, ctx); + if (handle) { + krb5_krbhst_free(context, handle); + handle = NULL; + } + numreset++; + if (numreset >= 3) + action = KRB5_SENDTO_FAILED; + else + action = KRB5_SENDTO_KRBHST; + + break; + case KRB5_SENDTO_FILTER: + /* default to next state, the filter function might modify this */ + action = KRB5_SENDTO_DONE; + + if (ctx->func) { + ret = (*ctx->func)(context, ctx, ctx->data, + &ctx->response, &action); + if (ret) + goto out; + } + break; + case KRB5_SENDTO_FAILED: + ret = KRB5_KDC_UNREACH; + break; + case KRB5_SENDTO_DONE: + ret = 0; + break; + default: + heim_abort("invalid krb5_sendto_context state"); } - } while (action != KRB5_SENDTO_DONE); - if (handle) - krb5_krbhst_free(context, handle); - if (ret == KRB5_KDC_UNREACH) + } + +out: + gettimeofday(&stop_time, NULL); + timevalsub(&stop_time, &ctx->stats.start_time); + if (ret == 0 && ctx->response.length) { + *receive = ctx->response; + krb5_data_zero(&ctx->response); + } else { + krb5_data_free(&ctx->response); + krb5_clear_error_message (context); + ret = KRB5_KDC_UNREACH; krb5_set_error_message(context, ret, N_("unable to reach any KDC in realm %s", ""), realm); - if (ret) - krb5_data_free(receive); - if (freectx) - krb5_sendto_ctx_free(context, ctx); - return ret; -} + } -krb5_error_code KRB5_CALLCONV -_krb5_kdc_retry(krb5_context context, krb5_sendto_ctx ctx, void *data, - const krb5_data *reply, int *action) -{ - krb5_error_code ret; - KRB_ERROR error; + _krb5_debug(context, 1, + "%s %s done: %d hosts: %lu packets: %lu" + " wc: %lld.%06lu nr: %lld.%06lu kh: %lld.%06lu tid: %08x", + __func__, realm, ret, + ctx->stats.num_hosts, ctx->stats.sent_packets, + (long long)stop_time.tv_sec, + (unsigned long)stop_time.tv_usec, + (long long)ctx->stats.name_resolution.tv_sec, + (unsigned long)ctx->stats.name_resolution.tv_usec, + (long long)ctx->stats.krbhst.tv_sec, + (unsigned long)ctx->stats.krbhst.tv_usec, ctx->stid); - if(krb5_rd_error(context, reply, &error)) - return 0; - ret = krb5_error_from_rd_error(context, &error, NULL); - krb5_free_error_contents(context, &error); + if (freectx) + krb5_sendto_ctx_free(context, ctx); + else + reset_context(context, ctx); - switch(ret) { - case KRB5KRB_ERR_RESPONSE_TOO_BIG: { - if (krb5_sendto_ctx_get_flags(ctx) & KRB5_KRBHST_FLAGS_LARGE_MSG) - break; - krb5_sendto_ctx_add_flags(ctx, KRB5_KRBHST_FLAGS_LARGE_MSG); - *action = KRB5_SENDTO_RESTART; - break; - } - case KRB5KDC_ERR_SVC_UNAVAILABLE: - *action = KRB5_SENDTO_CONTINUE; - break; - } - return 0; + if (handle) + krb5_krbhst_free(context, handle); + + return ret; } diff --git a/crypto/heimdal/lib/krb5/send_to_kdc_plugin.h b/crypto/heimdal/lib/krb5/send_to_kdc_plugin.h --- a/crypto/heimdal/lib/krb5/send_to_kdc_plugin.h +++ b/crypto/heimdal/lib/krb5/send_to_kdc_plugin.h @@ -40,19 +40,32 @@ #define KRB5_PLUGIN_SEND_TO_KDC "send_to_kdc" +#define KRB5_PLUGIN_SEND_TO_KDC_VERSION_0 0 +#define KRB5_PLUGIN_SEND_TO_KDC_VERSION_2 2 +#define KRB5_PLUGIN_SEND_TO_KDC_VERSION KRB5_PLUGIN_SEND_TO_KDC_VERSION_2 + typedef krb5_error_code -(*krb5plugin_send_to_kdc_func)(krb5_context, +(KRB5_CALLCONV *krb5plugin_send_to_kdc_func)(krb5_context, void *, krb5_krbhst_info *, time_t timeout, const krb5_data *, krb5_data *); +typedef krb5_error_code +(KRB5_CALLCONV *krb5plugin_send_to_realm_func)(krb5_context, + void *, + krb5_const_realm, + time_t timeout, + const krb5_data *, + krb5_data *); + typedef struct krb5plugin_send_to_kdc_ftable { int minor_version; - krb5_error_code (*init)(krb5_context, void **); - void (*fini)(void *); + krb5_error_code (KRB5_CALLCONV *init)(krb5_context, void **); + void (KRB5_CALLCONV *fini)(void *); krb5plugin_send_to_kdc_func send_to_kdc; + krb5plugin_send_to_realm_func send_to_realm; /* added in version 2 */ } krb5plugin_send_to_kdc_ftable; #endif /* HEIMDAL_KRB5_SEND_TO_KDC_PLUGIN_H */ diff --git a/crypto/heimdal/lib/krb5/sendauth.c b/crypto/heimdal/lib/krb5/sendauth.c --- a/crypto/heimdal/lib/krb5/sendauth.c +++ b/crypto/heimdal/lib/krb5/sendauth.c @@ -60,6 +60,29 @@ * } */ +/** + * Perform the client side of the sendauth protocol. + * + * @param context Kerberos 5 context. + * @param auth_context Authentication context of the peer. + * @param p_fd Socket associated to the connection. + * @param appl_version Server-specific string. + * @param client Client principal. If NULL, use the credentials in \a ccache. + * @param server Server principal. + * @param ap_req_options Options for the AP_REQ message. See the AP_OPTS_* defines in krb5.h. + * @param in_data FIXME + * @param in_creds FIXME + * @param ccache Credentials cache. If NULL, use the default credentials cache. + * @param ret_error If not NULL, will be set to the error reported by server, if any. + * Must be deallocated with krb5_free_error_contents(). + * @param rep_result If not NULL, will be set to the EncApRepPart of the AP_REP message. + * Must be deallocated with krb5_free_ap_rep_enc_part(). + * @param out_creds FIXME If not NULL, will be set to FIXME. Must be deallocated with + * krb5_free_creds(). + * + * @return 0 to indicate success. Otherwise a Kerberos error code is + * returned, see krb5_get_error_message(). + */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_sendauth(krb5_context context, krb5_auth_context *auth_context, diff --git a/crypto/heimdal/lib/krb5/set_default_realm.c b/crypto/heimdal/lib/krb5/set_default_realm.c --- a/crypto/heimdal/lib/krb5/set_default_realm.c +++ b/crypto/heimdal/lib/krb5/set_default_realm.c @@ -43,17 +43,12 @@ { *list = malloc (2 * sizeof(**list)); - if (*list == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (*list == NULL) + return krb5_enomem(context); (*list)[0] = strdup (s); if ((*list)[0] == NULL) { free (*list); - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; + return krb5_enomem(context); } (*list)[1] = NULL; return 0; diff --git a/crypto/heimdal/lib/krb5/sp800-108-kdf.c b/crypto/heimdal/lib/krb5/sp800-108-kdf.c new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/krb5/sp800-108-kdf.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2015, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "krb5_locl.h" + +/* + * SP800-108 KDF + */ + +/** + * As described in SP800-108 5.1 (for HMAC) + * + * @param context Kerberos 5 context + * @param kdf_K1 Base key material. + * @param kdf_label A string that identifies the purpose for the derived key. + * @param kdf_context A binary string containing parties, nonce, etc. + * @param md Message digest function to use for PRF. + * @param kdf_K0 Derived key data. + * + * @return Return an error code for an failure or 0 on success. + * @ingroup krb5_crypto + */ +krb5_error_code +_krb5_SP800_108_HMAC_KDF(krb5_context context, + const krb5_data *kdf_K1, + const krb5_data *kdf_label, + const krb5_data *kdf_context, + const EVP_MD *md, + krb5_data *kdf_K0) +{ + HMAC_CTX c; + unsigned char *p = kdf_K0->data; + size_t i, n, left = kdf_K0->length; + unsigned char hmac[EVP_MAX_MD_SIZE]; + unsigned int h = EVP_MD_size(md); + const size_t L = kdf_K0->length; + + heim_assert(md != NULL, "SP800-108 KDF internal error"); + + HMAC_CTX_init(&c); + + n = L / h; + + for (i = 0; i <= n; i++) { + unsigned char tmp[4]; + size_t len; + + HMAC_Init_ex(&c, kdf_K1->data, kdf_K1->length, md, NULL); + + _krb5_put_int(tmp, i + 1, 4); + HMAC_Update(&c, tmp, 4); + HMAC_Update(&c, kdf_label->data, kdf_label->length); + HMAC_Update(&c, (unsigned char *)"", 1); + if (kdf_context) + HMAC_Update(&c, kdf_context->data, kdf_context->length); + _krb5_put_int(tmp, L * 8, 4); + HMAC_Update(&c, tmp, 4); + + HMAC_Final(&c, hmac, &h); + len = h > left ? left : h; + memcpy(p, hmac, len); + p += len; + left -= len; + } + + HMAC_CTX_cleanup(&c); + + return 0; +} diff --git a/crypto/heimdal/lib/krb5/store-int.h b/crypto/heimdal/lib/krb5/store-int.h --- a/crypto/heimdal/lib/krb5/store-int.h +++ b/crypto/heimdal/lib/krb5/store-int.h @@ -40,6 +40,7 @@ ssize_t (*store)(struct krb5_storage_data*, const void*, size_t); off_t (*seek)(struct krb5_storage_data*, off_t, int); int (*trunc)(struct krb5_storage_data*, off_t); + int (*fsync)(struct krb5_storage_data*); void (*free)(struct krb5_storage_data*); krb5_flags flags; int eof_code; diff --git a/crypto/heimdal/lib/krb5/store-int.c b/crypto/heimdal/lib/krb5/store-int.c --- a/crypto/heimdal/lib/krb5/store-int.c +++ b/crypto/heimdal/lib/krb5/store-int.c @@ -34,7 +34,7 @@ #include "krb5_locl.h" KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL -_krb5_put_int(void *buffer, unsigned long value, size_t size) +_krb5_put_int(void *buffer, uint64_t value, size_t size) { unsigned char *p = buffer; int i; @@ -46,7 +46,7 @@ } KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL -_krb5_get_int(void *buffer, unsigned long *value, size_t size) +_krb5_get_int64(void *buffer, uint64_t *value, size_t size) { unsigned char *p = buffer; unsigned long v = 0; @@ -56,3 +56,12 @@ *value = v; return size; } + +KRB5_LIB_FUNCTION krb5_ssize_t KRB5_LIB_CALL +_krb5_get_int(void *buffer, unsigned long *value, size_t size) +{ + uint64_t v64; + krb5_ssize_t bytes = _krb5_get_int64(buffer, &v64, size); + *value = v64; + return bytes; +} diff --git a/crypto/heimdal/lib/krb5/store.c b/crypto/heimdal/lib/krb5/store.c --- a/crypto/heimdal/lib/krb5/store.c +++ b/crypto/heimdal/lib/krb5/store.c @@ -190,6 +190,25 @@ return (*sp->trunc)(sp, offset); } +/** + * Sync the storage buffer to its backing store. If there is no + * backing store this function will return success. + * + * @param sp the storage buffer to sync + * + * @return A Kerberos 5 error code + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION int KRB5_LIB_CALL +krb5_storage_fsync(krb5_storage *sp) +{ + if (sp->fsync != NULL) + return sp->fsync(sp); + return 0; +} + /** * Read to the storage buffer. * @@ -270,6 +289,8 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_storage_free(krb5_storage *sp) { + if (sp == NULL) + return 0; if(sp->free) (*sp->free)(sp); free(sp->data); @@ -316,13 +337,13 @@ static krb5_error_code krb5_store_int(krb5_storage *sp, - int32_t value, + int64_t value, size_t len) { int ret; - unsigned char v[16]; + unsigned char v[8]; - if(len > sizeof(v)) + if (len > sizeof(v)) return EINVAL; _krb5_put_int(v, value, len); ret = sp->store(sp, v, len); @@ -356,6 +377,33 @@ return krb5_store_int(sp, value, 4); } +/** + * Store a int64 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_store_int64(krb5_storage *sp, + int64_t value) +{ + if (BYTEORDER_IS_HOST(sp)) +#ifdef WORDS_BIGENDIAN + ; +#else + value = bswap64(value); /* There's no ntohll() */ +#endif + else if (BYTEORDER_IS_LE(sp)) + value = bswap64(value); + return krb5_store_int(sp, value, 8); +} + /** * Store a uint32 to storage, byte order is controlled by the settings * on the storage, see krb5_storage_set_byteorder(). @@ -375,24 +423,100 @@ return krb5_store_int32(sp, (int32_t)value); } +/** + * Store a uint64 to storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value to store + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_store_uint64(krb5_storage *sp, + uint64_t value) +{ + return krb5_store_int64(sp, (int64_t)value); +} + static krb5_error_code krb5_ret_int(krb5_storage *sp, - int32_t *value, + int64_t *value, size_t len) { int ret; - unsigned char v[4]; - unsigned long w; + unsigned char v[8]; + uint64_t w; + *value = 0; /* quiets warnings */ ret = sp->fetch(sp, v, len); if (ret < 0) return errno; if ((size_t)ret != len) return sp->eof_code; - _krb5_get_int(v, &w, len); + _krb5_get_int64(v, &w, len); *value = w; return 0; } +/** + * Read a int64 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_ret_int64(krb5_storage *sp, + int64_t *value) +{ + krb5_error_code ret = krb5_ret_int(sp, value, 8); + if(ret) + return ret; + if(BYTEORDER_IS_HOST(sp)) +#ifdef WORDS_BIGENDIAN + ; +#else + *value = bswap64(*value); /* There's no ntohll() */ +#endif + else if(BYTEORDER_IS_LE(sp)) + *value = bswap64(*value); + return 0; +} + +/** + * Read a uint64 from storage, byte order is controlled by the settings + * on the storage, see krb5_storage_set_byteorder(). + * + * @param sp the storage to write too + * @param value the value read from the buffer + * + * @return 0 for success, or a Kerberos 5 error code on failure. + * + * @ingroup krb5_storage + */ + +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +krb5_ret_uint64(krb5_storage *sp, + uint64_t *value) +{ + krb5_error_code ret; + int64_t v; + + ret = krb5_ret_int64(sp, &v); + if (ret == 0) + *value = (uint64_t)v; + + return ret; +} + /** * Read a int32 from storage, byte order is controlled by the settings * on the storage, see krb5_storage_set_byteorder(). @@ -409,12 +533,15 @@ krb5_ret_int32(krb5_storage *sp, int32_t *value) { - krb5_error_code ret = krb5_ret_int(sp, value, 4); - if(ret) + int64_t v; + + krb5_error_code ret = krb5_ret_int(sp, &v, 4); + if (ret) return ret; - if(BYTEORDER_IS_HOST(sp)) + *value = v; + if (BYTEORDER_IS_HOST(sp)) *value = htonl(*value); - else if(BYTEORDER_IS_LE(sp)) + else if (BYTEORDER_IS_LE(sp)) *value = bswap32(*value); return 0; } @@ -432,8 +559,7 @@ */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL -krb5_ret_uint32(krb5_storage *sp, - uint32_t *value) +krb5_ret_uint32(krb5_storage *sp, uint32_t *value) { krb5_error_code ret; int32_t v; @@ -503,7 +629,7 @@ krb5_ret_int16(krb5_storage *sp, int16_t *value) { - int32_t v; + int64_t v; int ret; ret = krb5_ret_int(sp, &v, 2); if(ret) @@ -688,8 +814,10 @@ return ret; if (size) { ret = sp->fetch(sp, data->data, size); - if(ret != size) + if(ret != size) { + krb5_data_free(data); return (ret < 0)? errno : sp->eof_code; + } } return 0; } @@ -792,12 +920,15 @@ ssize_t ret; while((ret = sp->fetch(sp, &c, 1)) == 1){ + krb5_error_code eret; char *tmp; len++; - ret = size_too_large(sp, len); - if (ret) - break; + eret = size_too_large(sp, len); + if (eret) { + free(s); + return eret; + } tmp = realloc (s, len); if (tmp == NULL) { free (s); @@ -852,6 +983,7 @@ ssize_t ret; while((ret = sp->fetch(sp, &c, 1)) == 1){ + krb5_error_code eret; char *tmp; if (c == '\r') { @@ -864,9 +996,11 @@ } len++; - ret = size_too_large(sp, len); - if (ret) - break; + eret = size_too_large(sp, len); + if (eret) { + free(s); + return eret; + } tmp = realloc (s, len); if (tmp == NULL) { free (s); @@ -1320,14 +1454,9 @@ ret = krb5_store_int8(sp, creds->second_ticket.length != 0); /* is_skey */ if(ret) return ret; - - if(krb5_storage_is_flags(sp, KRB5_STORAGE_CREDS_FLAGS_WRONG_BITORDER)) - ret = krb5_store_int32(sp, creds->flags.i); - else - ret = krb5_store_int32(sp, bitswap32(TicketFlags2int(creds->flags.b))); + ret = krb5_store_int32(sp, bitswap32(TicketFlags2int(creds->flags.b))); if(ret) return ret; - ret = krb5_store_addrs(sp, creds->addresses); if(ret) return ret; @@ -1372,23 +1501,7 @@ if(ret) goto cleanup; ret = krb5_ret_int32 (sp, &dummy32); if(ret) goto cleanup; - /* - * Runtime detect the what is the higher bits of the bitfield. If - * any of the higher bits are set in the input data, it's either a - * new ticket flag (and this code need to be removed), or it's a - * MIT cache (or new Heimdal cache), lets change it to our current - * format. - */ - { - uint32_t mask = 0xffff0000; - creds->flags.i = 0; - creds->flags.b.anonymous = 1; - if (creds->flags.i & mask) - mask = ~mask; - if (dummy32 & mask) - dummy32 = bitswap32(dummy32); - } - creds->flags.i = dummy32; + creds->flags.b = int2TicketFlags(bitswap32(dummy32)); ret = krb5_ret_addrs (sp, &creds->addresses); if(ret) goto cleanup; ret = krb5_ret_authdata (sp, &creds->authdata); @@ -1547,23 +1660,7 @@ if(ret) goto cleanup; ret = krb5_ret_int32 (sp, &dummy32); if(ret) goto cleanup; - /* - * Runtime detect the what is the higher bits of the bitfield. If - * any of the higher bits are set in the input data, it's either a - * new ticket flag (and this code need to be removed), or it's a - * MIT cache (or new Heimdal cache), lets change it to our current - * format. - */ - { - uint32_t mask = 0xffff0000; - creds->flags.i = 0; - creds->flags.b.anonymous = 1; - if (creds->flags.i & mask) - mask = ~mask; - if (dummy32 & mask) - dummy32 = bitswap32(dummy32); - } - creds->flags.i = dummy32; + creds->flags.b = int2TicketFlags(bitswap32(dummy32)); if (header & SC_ADDRESSES) { ret = krb5_ret_addrs (sp, &creds->addresses); if(ret) goto cleanup; diff --git a/crypto/heimdal/lib/krb5/store_emem.c b/crypto/heimdal/lib/krb5/store_emem.c --- a/crypto/heimdal/lib/krb5/store_emem.c +++ b/crypto/heimdal/lib/krb5/store_emem.c @@ -70,7 +70,8 @@ s->base = base; s->ptr = (unsigned char*)base + off; } - memmove(s->ptr, data, size); + if (size) + memmove(s->ptr, data, size); sp->seek(sp, size, SEEK_CUR); return size; } @@ -156,6 +157,7 @@ * @sa krb5_storage_from_readonly_mem() * @sa krb5_storage_from_fd() * @sa krb5_storage_from_data() + * @sa krb5_storage_from_socket() */ KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL @@ -189,6 +191,7 @@ sp->store = emem_store; sp->seek = emem_seek; sp->trunc = emem_trunc; + sp->fsync = NULL; sp->free = emem_free; sp->max_alloc = UINT_MAX/8; return sp; diff --git a/crypto/heimdal/lib/krb5/store_fd.c b/crypto/heimdal/lib/krb5/store_fd.c --- a/crypto/heimdal/lib/krb5/store_fd.c +++ b/crypto/heimdal/lib/krb5/store_fd.c @@ -43,13 +43,47 @@ static ssize_t fd_fetch(krb5_storage * sp, void *data, size_t size) { - return net_read(FD(sp), data, size); + char *cbuf = (char *)data; + ssize_t count; + size_t rem = size; + + /* similar pattern to net_read() to support pipes */ + while (rem > 0) { + count = read (FD(sp), cbuf, rem); + if (count < 0) { + if (errno == EINTR) + continue; + else + return count; + } else if (count == 0) { + return count; + } + cbuf += count; + rem -= count; + } + return size; } static ssize_t fd_store(krb5_storage * sp, const void *data, size_t size) { - return net_write(FD(sp), data, size); + const char *cbuf = (const char *)data; + ssize_t count; + size_t rem = size; + + /* similar pattern to net_write() to support pipes */ + while (rem > 0) { + count = write(FD(sp), cbuf, rem); + if (count < 0) { + if (errno == EINTR) + continue; + else + return count; + } + cbuf += count; + rem -= count; + } + return size; } static off_t @@ -66,10 +100,20 @@ return 0; } +static int +fd_sync(krb5_storage * sp) +{ + if (fsync(FD(sp)) == -1) + return errno; + return 0; +} + static void fd_free(krb5_storage * sp) { - close(FD(sp)); + int save_errno = errno; + if (close(FD(sp)) == 0) + errno = save_errno; } /** @@ -83,41 +127,48 @@ * @sa krb5_storage_from_mem() * @sa krb5_storage_from_readonly_mem() * @sa krb5_storage_from_data() + * @sa krb5_storage_from_socket() */ KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL -krb5_storage_from_fd(krb5_socket_t fd_in) +krb5_storage_from_fd(int fd_in) { krb5_storage *sp; + int saved_errno; int fd; -#ifdef SOCKET_IS_NOT_AN_FD #ifdef _MSC_VER - if (_get_osfhandle(fd_in) != -1) { - fd = dup(fd_in); - } else { - fd = _open_osfhandle(fd_in, 0); - } + /* + * This function used to try to pass the input to + * _get_osfhandle() to test if the value is a HANDLE + * but this doesn't work because doing so throws an + * exception that will result in Watson being triggered + * to file a Windows Error Report. + */ + fd = _dup(fd_in); #else -#error Dont know how to deal with fd that may or may not be a socket. -#endif -#else /* SOCKET_IS_NOT_AN_FD */ fd = dup(fd_in); #endif if (fd < 0) return NULL; + errno = ENOMEM; sp = malloc(sizeof(krb5_storage)); if (sp == NULL) { + saved_errno = errno; close(fd); + errno = saved_errno; return NULL; } + errno = ENOMEM; sp->data = malloc(sizeof(fd_storage)); if (sp->data == NULL) { + saved_errno = errno; close(fd); free(sp); + errno = saved_errno; return NULL; } sp->flags = 0; @@ -127,6 +178,7 @@ sp->store = fd_store; sp->seek = fd_seek; sp->trunc = fd_trunc; + sp->fsync = fd_sync; sp->free = fd_free; sp->max_alloc = UINT_MAX/8; return sp; diff --git a/crypto/heimdal/lib/krb5/store_mem.c b/crypto/heimdal/lib/krb5/store_mem.c --- a/crypto/heimdal/lib/krb5/store_mem.c +++ b/crypto/heimdal/lib/krb5/store_mem.c @@ -120,6 +120,7 @@ * @sa krb5_storage_from_readonly_mem() * @sa krb5_storage_from_data() * @sa krb5_storage_from_fd() + * @sa krb5_storage_from_socket() */ KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL @@ -144,6 +145,7 @@ sp->store = mem_store; sp->seek = mem_seek; sp->trunc = mem_trunc; + sp->fsync = NULL; sp->free = NULL; sp->max_alloc = UINT_MAX/8; return sp; @@ -203,6 +205,7 @@ sp->store = mem_no_store; sp->seek = mem_seek; sp->trunc = mem_no_trunc; + sp->fsync = NULL; sp->free = NULL; sp->max_alloc = UINT_MAX/8; return sp; diff --git a/crypto/heimdal/lib/krb5/store_sock.c b/crypto/heimdal/lib/krb5/store_sock.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/store_sock.c @@ -0,0 +1,159 @@ +/* + * Copyright (c) 1997 - 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "krb5_locl.h" +#include "store-int.h" + +#ifdef _WIN32 +#include +#endif + +typedef struct socket_storage { + krb5_socket_t sock; +} socket_storage; + +#define SOCK(S) (((socket_storage*)(S)->data)->sock) + +static ssize_t +socket_fetch(krb5_storage * sp, void *data, size_t size) +{ + return net_read(SOCK(sp), data, size); +} + +static ssize_t +socket_store(krb5_storage * sp, const void *data, size_t size) +{ + return net_write(SOCK(sp), data, size); +} + +static off_t +socket_seek(krb5_storage * sp, off_t offset, int whence) +{ + return lseek(SOCK(sp), offset, whence); +} + +static int +socket_trunc(krb5_storage * sp, off_t offset) +{ + if (ftruncate(SOCK(sp), offset) == -1) + return errno; + return 0; +} + +static int +socket_sync(krb5_storage * sp) +{ + if (fsync(SOCK(sp)) == -1) + return errno; + return 0; +} + +static void +socket_free(krb5_storage * sp) +{ + int save_errno = errno; + if (rk_IS_SOCKET_ERROR(rk_closesocket(SOCK(sp)))) + errno = rk_SOCK_ERRNO; + else + errno = save_errno; +} + +/** + * + * + * @return A krb5_storage on success, or NULL on out of memory error. + * + * @ingroup krb5_storage + * + * @sa krb5_storage_emem() + * @sa krb5_storage_from_mem() + * @sa krb5_storage_from_readonly_mem() + * @sa krb5_storage_from_data() + * @sa krb5_storage_from_fd() + */ + +KRB5_LIB_FUNCTION krb5_storage * KRB5_LIB_CALL +krb5_storage_from_socket(krb5_socket_t sock_in) +{ + krb5_storage *sp; + int saved_errno; + krb5_socket_t sock; + +#ifdef _WIN32 + WSAPROTOCOL_INFO info; + + if (WSADuplicateSocket(sock_in, GetCurrentProcessId(), &info) == 0) + { + + sock = WSASocket( FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + &info, 0, 0); + } +#else + sock = dup(sock_in); +#endif + + if (sock == rk_INVALID_SOCKET) + return NULL; + + errno = ENOMEM; + sp = malloc(sizeof(krb5_storage)); + if (sp == NULL) { + saved_errno = errno; + rk_closesocket(sock); + errno = saved_errno; + return NULL; + } + + errno = ENOMEM; + sp->data = malloc(sizeof(socket_storage)); + if (sp->data == NULL) { + saved_errno = errno; + rk_closesocket(sock); + free(sp); + errno = saved_errno; + return NULL; + } + sp->flags = 0; + sp->eof_code = HEIM_ERR_EOF; + SOCK(sp) = sock; + sp->fetch = socket_fetch; + sp->store = socket_store; + sp->seek = socket_seek; + sp->trunc = socket_trunc; + sp->fsync = socket_sync; + sp->free = socket_free; + sp->max_alloc = UINT_MAX/8; + return sp; +} diff --git a/crypto/heimdal/lib/krb5/string-to-key-test.c b/crypto/heimdal/lib/krb5/string-to-key-test.c --- a/crypto/heimdal/lib/krb5/string-to-key-test.c +++ b/crypto/heimdal/lib/krb5/string-to-key-test.c @@ -86,7 +86,7 @@ {0x6d, 0x2f, 0xcd, 0xf2, 0xd6, 0xfb, 0xbc, 0x3d, 0xdc, 0xad, 0xb5, 0xda, 0x57, 0x10, 0xa2, 0x34, 0x89, 0xb0, 0xd3, 0xb6, 0x9d, 0x5d, 0x9d, 0x4a}}, {"Juri\xc5\xa1i\xc4\x87@ATHENA.MIT.EDU", "\xc3\x9f", ETYPE_DES3_CBC_SHA1, {0x16, 0xd5, 0xa4, 0x0e, 0x1c, 0xe3, 0xba, 0xcb, 0x61, 0xb9, 0xdc, 0xe0, 0x04, 0x70, 0x32, 0x4c, 0x83, 0x19, 0x73, 0xa7, 0xb9, 0x52, 0xfe, 0xb0}}, - {NULL} + {NULL, NULL, 0, {0}} }; int diff --git a/crypto/heimdal/lib/krb5/test_alname.c b/crypto/heimdal/lib/krb5/test_alname.c --- a/crypto/heimdal/lib/krb5/test_alname.c +++ b/crypto/heimdal/lib/krb5/test_alname.c @@ -34,13 +34,33 @@ #include #include +char localname[1024]; +static size_t lname_size = sizeof (localname); +static int lname_size_arg = 0; +static int simple_flag = 0; +static int verbose_flag = 0; +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"lname-size", 0, arg_integer, &lname_size_arg, + "set localname size (0 means use default, must be 0..1023)", "integer" }, + {"simple", 0, arg_flag, &simple_flag, /* Used for scripting */ + "map the given principal and print the resulting localname", NULL }, + {"verbose", 0, arg_flag, &verbose_flag, + "print the actual principal name as well as the localname", NULL }, + {"version", 0, arg_flag, &version_flag, + "print version", NULL }, + {"help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + static void test_alname(krb5_context context, krb5_const_realm realm, const char *user, const char *inst, const char *localuser, int ok) { krb5_principal p; - char localname[1024]; krb5_error_code ret; char *princ; @@ -52,14 +72,16 @@ if (ret) krb5_err(context, 1, ret, "krb5_unparse_name"); - ret = krb5_aname_to_localname(context, p, sizeof(localname), localname); + ret = krb5_aname_to_localname(context, p, lname_size, localname); krb5_free_principal(context, p); - free(princ); if (ret) { - if (!ok) + if (!ok) { + free(princ); return; + } krb5_err(context, 1, ret, "krb5_aname_to_localname: %s -> %s", princ, localuser); + free(princ); } if (strcmp(localname, localuser) != 0) { @@ -74,16 +96,6 @@ } -static int version_flag = 0; -static int help_flag = 0; - -static struct getargs args[] = { - {"version", 0, arg_flag, &version_flag, - "print version", NULL }, - {"help", 0, arg_flag, &help_flag, - NULL, NULL } -}; - static void usage (int ret) { @@ -119,15 +131,68 @@ argc -= optidx; argv += optidx; - if (argc != 1) - errx(1, "first argument should be a local user that in root .k5login"); - - user = argv[0]; - ret = krb5_init_context(&context); if (ret) errx (1, "krb5_init_context failed: %d", ret); + if (simple_flag) { + krb5_principal princ; + char *unparsed; + int status = 0; + + /* Map then print the result and exit */ + if (argc != 1) + errx(1, "One argument is required and it must be a principal name"); + + ret = krb5_parse_name(context, argv[0], &princ); + if (ret) + krb5_err(context, 1, ret, "krb5_build_principal"); + + ret = krb5_unparse_name(context, princ, &unparsed); + if (ret) + krb5_err(context, 1, ret, "krb5_unparse_name"); + + if (lname_size_arg > 0 && lname_size_arg < 1024) + lname_size = lname_size_arg; + else if (lname_size_arg != 0) + errx(1, "local name size must be between 0 and 1023 (inclusive)"); + + ret = krb5_aname_to_localname(context, princ, lname_size, localname); + if (ret == KRB5_NO_LOCALNAME) { + if (verbose_flag) + fprintf(stderr, "No mapping obtained for %s\n", unparsed); + exit(1); + } + switch (ret) { + case KRB5_PLUGIN_NO_HANDLE: + fprintf(stderr, "Error: KRB5_PLUGIN_NO_HANDLE leaked!\n"); + status = 2; + break; + case KRB5_CONFIG_NOTENUFSPACE: + fprintf(stderr, "Error: lname-size (%lu) too small\n", + (long unsigned)lname_size); + status = 3; + break; + case 0: + if (verbose_flag) + printf("%s ", unparsed); + printf("%s\n", localname); + break; + default: + krb5_err(context, 4, ret, "krb5_aname_to_localname"); + break; + } + free(unparsed); + krb5_free_principal(context, princ); + krb5_free_context(context); + exit(status); + } + + if (argc != 1) + errx(1, "first argument should be a local user that is in root .k5login"); + + user = argv[0]; + ret = krb5_get_default_realm(context, &realm); if (ret) krb5_err(context, 1, ret, "krb5_get_default_realm"); diff --git a/crypto/heimdal/lib/krb5/test_ap-req.c b/crypto/heimdal/lib/krb5/test_ap-req.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_ap-req.c @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2006 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include + +#include +#include +#include +#include +#include +#include + +static int verify_pac = 0; +static int server_any = 0; +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"verify-pac",0, arg_flag, &verify_pac, + "verify the PAC", NULL }, + {"server-any",0, arg_flag, &server_any, + "let server pick the principal", NULL }, + {"version", 0, arg_flag, &version_flag, + "print version", NULL }, + {"help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, sizeof(args)/sizeof(*args), NULL, "..."); + exit (ret); +} + + +static void +test_ap(krb5_context context, + krb5_principal target, + krb5_principal server, + krb5_keytab keytab, + krb5_ccache ccache, + const krb5_flags client_flags) +{ + krb5_error_code ret; + krb5_auth_context client_ac = NULL, server_ac = NULL; + krb5_data data; + krb5_flags server_flags; + krb5_ticket *ticket = NULL; + int32_t server_seq, client_seq; + + ret = krb5_mk_req_exact(context, + &client_ac, + client_flags, + target, + NULL, + ccache, + &data); + if (ret) + krb5_err(context, 1, ret, "krb5_mk_req_exact"); + + ret = krb5_rd_req(context, + &server_ac, + &data, + server, + keytab, + &server_flags, + &ticket); + if (ret) + krb5_err(context, 1, ret, "krb5_rd_req"); + + + if (server_flags & AP_OPTS_MUTUAL_REQUIRED) { + krb5_ap_rep_enc_part *repl; + + krb5_data_free(&data); + + if ((client_flags & AP_OPTS_MUTUAL_REQUIRED) == 0) + krb5_errx(context, 1, "client flag missing mutual req"); + + ret = krb5_mk_rep (context, server_ac, &data); + if (ret) + krb5_err(context, 1, ret, "krb5_mk_rep"); + + ret = krb5_rd_rep (context, + client_ac, + &data, + &repl); + if (ret) + krb5_err(context, 1, ret, "krb5_rd_rep"); + + krb5_free_ap_rep_enc_part (context, repl); + } else { + if (client_flags & AP_OPTS_MUTUAL_REQUIRED) + krb5_errx(context, 1, "server flag missing mutual req"); + } + + krb5_auth_con_getremoteseqnumber(context, server_ac, &server_seq); + krb5_auth_con_getremoteseqnumber(context, client_ac, &client_seq); + if (server_seq != client_seq) + krb5_errx(context, 1, "seq num differ"); + + krb5_auth_con_getlocalseqnumber(context, server_ac, &server_seq); + krb5_auth_con_getlocalseqnumber(context, client_ac, &client_seq); + if (server_seq != client_seq) + krb5_errx(context, 1, "seq num differ"); + + krb5_data_free(&data); + krb5_auth_con_free(context, client_ac); + krb5_auth_con_free(context, server_ac); + + if (verify_pac) { + krb5_pac pac; + + ret = krb5_ticket_get_authorization_data_type(context, + ticket, + KRB5_AUTHDATA_WIN2K_PAC, + &data); + if (ret) + krb5_err(context, 1, ret, "get pac"); + + ret = krb5_pac_parse(context, data.data, data.length, &pac); + if (ret) + krb5_err(context, 1, ret, "pac parse"); + + krb5_pac_free(context, pac); + } + + krb5_free_ticket(context, ticket); +} + + +int +main(int argc, char **argv) +{ + krb5_context context; + krb5_error_code ret; + int optidx = 0; + const char *principal, *keytab, *ccache; + krb5_ccache id; + krb5_keytab kt; + krb5_principal sprincipal, server; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + if (argc < 3) + usage(1); + + principal = argv[0]; + keytab = argv[1]; + ccache = argv[2]; + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + ret = krb5_cc_resolve(context, ccache, &id); + if (ret) + krb5_err(context, 1, ret, "krb5_cc_resolve"); + + ret = krb5_parse_name(context, principal, &sprincipal); + if (ret) + krb5_err(context, 1, ret, "krb5_parse_name"); + + ret = krb5_kt_resolve(context, keytab, &kt); + if (ret) + krb5_err(context, 1, ret, "krb5_kt_resolve"); + + if (server_any) + server = NULL; + else + server = sprincipal; + + test_ap(context, sprincipal, server, kt, id, 0); + test_ap(context, sprincipal, server, kt, id, AP_OPTS_MUTUAL_REQUIRED); + + krb5_cc_close(context, id); + krb5_kt_close(context, kt); + krb5_free_principal(context, sprincipal); + + krb5_free_context(context); + + return ret; +} diff --git a/crypto/heimdal/lib/krb5/test_canon.c b/crypto/heimdal/lib/krb5/test_canon.c new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_canon.c @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2011, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "krb5_locl.h" +#include +#include + +#if 0 +#include +#include +#include +#include +#include +#include +#endif + +int +main(int argc, char **argv) +{ + krb5_error_code retval; + krb5_context context; + krb5_principal princ = NULL; + krb5_principal me = NULL; + krb5_principal cmp_to_princ = NULL; + krb5_ccache cc = NULL; + krb5_creds *out_creds = NULL; + krb5_keytab kt = NULL; + krb5_keytab_entry ktent; + krb5_creds in_creds; + char *hostname = NULL; + char *unparsed = NULL; + char *unparsed_canon = NULL; + char *during; + char *cmp_to = NULL;; + int do_kt = 0; + int do_get_creds = 0; + int opt; + int ret = 1; + + memset(&ktent, 0, sizeof(ktent)); + + while ((opt = getopt(argc, argv, "hgkc:")) != -1) { + switch (opt) { + case 'g': + do_get_creds++; + break; + case 'k': + do_kt++; + break; + case 'c': + cmp_to = optarg; + break; + case 'h': + default: + fprintf(stderr, "Usage: %s [-g] [-k] [-c compare-to-principal] " + "[principal]\n", argv[0]); + return 1; + } + } + + if (!do_get_creds && !do_kt && !cmp_to) + do_get_creds++; + + if (optind < argc) + hostname = argv[optind]; + + during = "init_context"; + retval = krb5_init_context(&context); + if (retval) goto err; + + during = "sn2p"; + retval = krb5_sname_to_principal(context, hostname, "host", KRB5_NT_SRV_HST, &princ); + if (retval) goto err; + + during = "unparse of sname2princ"; + retval = krb5_unparse_name(context, princ, &unparsed); + if (retval) goto err; + printf("krb5_sname_to_principal() output: %s\n", unparsed); + + if (cmp_to) { + krb5_boolean eq; + + during = "parsing principal name for comparison compare"; + retval = krb5_parse_name(context, cmp_to, &cmp_to_princ); + if (retval) goto err; + + eq = krb5_principal_compare(context, princ, cmp_to_princ); + printf("%s %s %s\n", unparsed, eq ? "==" : "!=", cmp_to); + } + + if (do_get_creds) { + during = "ccdefault"; + retval = krb5_cc_default(context, &cc); + if (retval) goto err; + + during = "ccprinc"; + retval = krb5_cc_get_principal(context, cc, &me); + if (retval) goto err; + + memset(&in_creds, 0, sizeof(in_creds)); + in_creds.client = me; + in_creds.server = princ; + + during = "getcreds"; + retval = krb5_get_credentials(context, 0, cc, &in_creds, &out_creds); + if (retval) goto err; + + during = "unparsing principal name canonicalized by krb5_get_credentials()"; + retval = krb5_unparse_name(context, in_creds.server, &unparsed_canon); + if (retval) goto err; + printf("Principal name as canonicalized by krb5_get_credentials() is %s\n", unparsed_canon); + } + + if (do_kt) { + during = "getting keytab"; + retval = krb5_kt_default(context, &kt); + if (retval) goto err; + + during = "getting keytab ktent"; + retval = krb5_kt_get_entry(context, kt, princ, 0, 0, &ktent); + if (retval) goto err; + + during = "unparsing principal name canonicalized by krb5_kt_get_entry()"; + retval = krb5_unparse_name(context, ktent.principal, &unparsed_canon); + if (retval) goto err; + printf("Principal name as canonicalized by krb5_kt_get_entry() is %s\n", unparsed_canon); + } + + ret = 0; + +err: + krb5_free_principal(context, princ); + krb5_free_principal(context, me); + krb5_free_principal(context, cmp_to_princ); + krb5_xfree(unparsed); + krb5_xfree(unparsed_canon); + if (do_get_creds) { + krb5_free_creds(context, out_creds); + (void) krb5_cc_close(context, cc); + } + krb5_kt_free_entry(context, &ktent); + if (kt) + krb5_kt_close(context, kt); + krb5_free_context(context); + if (ret) + fprintf(stderr, "Failed while doing %s (%d)\n", during, retval); + return (ret); +} + diff --git a/crypto/heimdal/lib/krb5/test_cc.c b/crypto/heimdal/lib/krb5/test_cc.c --- a/crypto/heimdal/lib/krb5/test_cc.c +++ b/crypto/heimdal/lib/krb5/test_cc.c @@ -57,7 +57,7 @@ p1 = estrdup(p); ret = krb5_cc_set_default_name(context, NULL); - if (p == NULL) + if (ret) krb5_errx (context, 1, "krb5_cc_set_default_name failed"); p = krb5_cc_default_name(context); @@ -69,7 +69,7 @@ krb5_errx (context, 1, "krb5_cc_default_name no longer same"); ret = krb5_cc_set_default_name(context, test_cc_name); - if (p == NULL) + if (ret) krb5_errx (context, 1, "krb5_cc_set_default_name 1 failed"); p = krb5_cc_default_name(context); @@ -293,31 +293,31 @@ } cc_names[] = { { "foo", 0, "foo" }, { "foo%}", 0, "foo%}" }, - { "%{uid}", 0 }, + { "%{uid}", 0, NULL }, { "foo%{null}", 0, "foo" }, { "foo%{null}bar", 0, "foobar" }, - { "%{", 1 }, - { "%{foo %{", 1 }, - { "%{{", 1 }, - { "%{{}", 1 }, - { "%{nulll}", 1 }, - { "%{does not exist}", 1 }, - { "%{}", 1 }, + { "%{", 1, NULL }, + { "%{foo %{", 1, NULL }, + { "%{{", 1, NULL }, + { "%{{}", 1, NULL }, + { "%{nulll}", 1, NULL }, + { "%{does not exist}", 1, NULL }, + { "%{}", 1, NULL }, #ifdef KRB5_USE_PATH_TOKENS - { "%{APPDATA}", 0 }, - { "%{COMMON_APPDATA}", 0}, - { "%{LOCAL_APPDATA}", 0}, - { "%{SYSTEM}", 0}, - { "%{WINDOWS}", 0}, - { "%{TEMP}", 0}, - { "%{USERID}", 0}, - { "%{uid}", 0}, - { "%{USERCONFIG}", 0}, - { "%{COMMONCONFIG}", 0}, - { "%{LIBDIR}", 0}, - { "%{BINDIR}", 0}, - { "%{LIBEXEC}", 0}, - { "%{SBINDIR}", 0}, + { "%{APPDATA}", 0, NULL }, + { "%{COMMON_APPDATA}", 0, NULL}, + { "%{LOCAL_APPDATA}", 0, NULL}, + { "%{SYSTEM}", 0, NULL}, + { "%{WINDOWS}", 0, NULL}, + { "%{TEMP}", 0, NULL}, + { "%{USERID}", 0, NULL}, + { "%{uid}", 0, NULL}, + { "%{USERCONFIG}", 0, NULL}, + { "%{COMMONCONFIG}", 0, NULL}, + { "%{LIBDIR}", 0, NULL}, + { "%{BINDIR}", 0, NULL}, + { "%{LIBEXEC}", 0, NULL}, + { "%{SBINDIR}", 0, NULL}, #endif }; @@ -549,14 +549,15 @@ } static void -test_cc_config(krb5_context context) +test_cc_config(krb5_context context, const char *cc_type, + const char *cc_name, size_t count) { krb5_error_code ret; krb5_principal p; krb5_ccache id; unsigned int i; - ret = krb5_cc_new_unique(context, "MEMORY", "bar", &id); + ret = krb5_cc_new_unique(context, cc_type, cc_name, &id); if (ret) krb5_err(context, 1, ret, "krb5_cc_new_unique"); @@ -568,7 +569,7 @@ if (ret) krb5_err(context, 1, ret, "krb5_cc_initialize"); - for (i = 0; i < 1000; i++) { + for (i = 0; i < count; i++) { krb5_data data, data2; const char *name = "foo"; krb5_principal p1 = NULL; @@ -579,6 +580,10 @@ data.data = rk_UNCONST(name); data.length = strlen(name); + /* + * Because of how krb5_cc_set_config() this will also test + * krb5_cc_remove_cred(). + */ ret = krb5_cc_set_config(context, id, p1, "FriendlyName", &data); if (ret) krb5_errx(context, 1, "krb5_cc_set_config: add"); @@ -586,8 +591,16 @@ ret = krb5_cc_get_config(context, id, p1, "FriendlyName", &data2); if (ret) krb5_errx(context, 1, "krb5_cc_get_config: first"); + + if (data.length != data2.length || + memcmp(data.data, data2.data, data.length) != 0) + krb5_errx(context, 1, "krb5_cc_get_config: did not fetch what was set"); + krb5_data_free(&data2); + data.data = rk_UNCONST("bar"); + data.length = strlen("bar"); + ret = krb5_cc_set_config(context, id, p1, "FriendlyName", &data); if (ret) krb5_errx(context, 1, "krb5_cc_set_config: add -second"); @@ -595,6 +608,11 @@ ret = krb5_cc_get_config(context, id, p1, "FriendlyName", &data2); if (ret) krb5_errx(context, 1, "krb5_cc_get_config: second"); + + if (data.length != data2.length || + memcmp(data.data, data2.data, data.length) != 0) + krb5_errx(context, 1, "krb5_cc_get_config: replace failed"); + krb5_data_free(&data2); ret = krb5_cc_set_config(context, id, p1, "FriendlyName", NULL); @@ -604,6 +622,9 @@ ret = krb5_cc_get_config(context, id, p1, "FriendlyName", &data2); if (ret == 0) krb5_errx(context, 1, "krb5_cc_get_config: non-existant"); + + if (data2.length) + krb5_errx(context, 1, "krb5_cc_get_config: delete failed"); } krb5_cc_destroy(context, id); @@ -669,6 +690,7 @@ test_init_vs_destroy(context, krb5_cc_type_api); #endif test_init_vs_destroy(context, krb5_cc_type_scc); + test_init_vs_destroy(context, krb5_cc_type_dcc); test_mcc_default(); test_def_cc_name(context); @@ -694,6 +716,10 @@ test_cache_iter(context, krb5_cc_type_api, 0); test_cache_iter(context, krb5_cc_type_scc, 0); test_cache_iter(context, krb5_cc_type_scc, 1); +#if 0 + test_cache_iter(context, krb5_cc_type_dcc, 0); + test_cache_iter(context, krb5_cc_type_dcc, 1); +#endif test_copy(context, krb5_cc_type_file, krb5_cc_type_file); test_copy(context, krb5_cc_type_memory, krb5_cc_type_memory); @@ -703,6 +729,11 @@ test_copy(context, krb5_cc_type_file, krb5_cc_type_scc); test_copy(context, krb5_cc_type_scc, krb5_cc_type_memory); test_copy(context, krb5_cc_type_memory, krb5_cc_type_scc); +#if 0 + test_copy(context, krb5_cc_type_dcc, krb5_cc_type_memory); + test_copy(context, krb5_cc_type_dcc, krb5_cc_type_file); + test_copy(context, krb5_cc_type_dcc, krb5_cc_type_scc); +#endif test_move(context, krb5_cc_type_file); test_move(context, krb5_cc_type_memory); @@ -710,6 +741,9 @@ test_move(context, krb5_cc_type_kcm); #endif test_move(context, krb5_cc_type_scc); +#if 0 + test_move(context, krb5_cc_type_dcc); +#endif test_prefix_ops(context, "FILE:/tmp/foo", &krb5_fcc_ops); test_prefix_ops(context, "FILE", &krb5_fcc_ops); @@ -720,11 +754,16 @@ test_prefix_ops(context, "SCC:", &krb5_scc_ops); test_prefix_ops(context, "SCC:foo", &krb5_scc_ops); #endif +#if 0 + test_prefix_ops(context, "DIR:", &krb5_dcc_ops); + test_prefix_ops(context, "DIR:tkt1", &krb5_dcc_ops); +#endif krb5_cc_destroy(context, id1); krb5_cc_destroy(context, id2); - test_cc_config(context); + test_cc_config(context, "MEMORY", "bar", 1000); /* 1000 because fast */ + test_cc_config(context, "FILE", "/tmp/foocc", 30); /* 30 because slower */ krb5_free_context(context); diff --git a/crypto/heimdal/lib/krb5/test_config_strings.cfg b/crypto/heimdal/lib/krb5/test_config_strings.cfg new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_config_strings.cfg @@ -0,0 +1,12 @@ +[escapes] + foo = A B C D + bar = A B "C D" + baz = A B "" + quux = "A B;C: D" + questionable="""" "" """" + mismatch1 = A"BQd + mismatch2 = efgh" ABC + internal1 = "SnapeKills\" "Dumbledore" + internal2 = "TownOf Sandwich: Massachusetts"Oldest Town In "Cape Cod" + internal3 = "Begins and"ends In One String + longer_strings = "Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:" "1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer." "2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution." "3. Neither the name of the Institute nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission." "THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." "Why do we test with such long strings? Because some people have config files" That look "Like this." diff --git a/crypto/heimdal/lib/krb5/test_crypto.c b/crypto/heimdal/lib/krb5/test_crypto.c --- a/crypto/heimdal/lib/krb5/test_crypto.c +++ b/crypto/heimdal/lib/krb5/test_crypto.c @@ -158,11 +158,15 @@ krb5_salt salt; krb5_enctype enctypes[] = { +#if 0 ETYPE_DES_CBC_CRC, ETYPE_DES3_CBC_SHA1, ETYPE_ARCFOUR_HMAC_MD5, +#endif ETYPE_AES128_CTS_HMAC_SHA1_96, - ETYPE_AES256_CTS_HMAC_SHA1_96 + ETYPE_AES256_CTS_HMAC_SHA1_96, + ETYPE_AES128_CTS_HMAC_SHA256_128, + ETYPE_AES256_CTS_HMAC_SHA384_192 }; setprogname(argv[0]); diff --git a/crypto/heimdal/lib/krb5/test_crypto_wrapping.c b/crypto/heimdal/lib/krb5/test_crypto_wrapping.c --- a/crypto/heimdal/lib/krb5/test_crypto_wrapping.c +++ b/crypto/heimdal/lib/krb5/test_crypto_wrapping.c @@ -131,7 +131,9 @@ ETYPE_DES3_CBC_SHA1, ETYPE_ARCFOUR_HMAC_MD5, ETYPE_AES128_CTS_HMAC_SHA1_96, - ETYPE_AES256_CTS_HMAC_SHA1_96 + ETYPE_AES256_CTS_HMAC_SHA1_96, + KRB5_ENCTYPE_AES128_CTS_HMAC_SHA256_128, + KRB5_ENCTYPE_AES256_CTS_HMAC_SHA384_192 }; setprogname(argv[0]); diff --git a/crypto/heimdal/lib/krb5/test_expand_toks.c b/crypto/heimdal/lib/krb5/test_expand_toks.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_expand_toks.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2003 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "krb5_locl.h" +#include +#include + +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + krb5_context context; + krb5_error_code ret; + int optidx = 0; + char *expanded; + + setprogname(argv[0]); + + if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if (version_flag){ + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + ret = _krb5_expand_path_tokensv(context, "/tmp/%{foo}/%{bar}%{baz}/x", 0, + &expanded, + "foo", "abc", + "bar", "dce", + "baz", "fgh", + NULL); + if (ret) + krb5_err(context, ret, 1, "Token expansion failed"); + +#ifdef _WIN32 +#define EXPANDED_SHOULD_BE "\\tmp\\abc\\dcefgh\\x" +#else +#define EXPANDED_SHOULD_BE "/tmp/abc/dcefgh/x" +#endif + + if (strcmp(expanded, EXPANDED_SHOULD_BE)) + krb5_errx(context, 1, "Token expansion incorrect"); + + krb5_free_context(context); + + return 0; +} diff --git a/crypto/heimdal/lib/krb5/test_fx.c b/crypto/heimdal/lib/krb5/test_fx.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_fx.c @@ -0,0 +1,253 @@ +/* + * Copyright (c) 2009 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "krb5_locl.h" +#include +#include + +struct { + char *p1; + char *pepper1; + krb5_enctype e1; + char *p2; + char *pepper2; + krb5_enctype e2; + krb5_enctype e3; + char *key; + size_t len; +} cf2[] = { + { + "key1", "a", ETYPE_AES128_CTS_HMAC_SHA1_96, + "key2", "b", ETYPE_AES128_CTS_HMAC_SHA1_96, + ETYPE_AES128_CTS_HMAC_SHA1_96, + "\x97\xdf\x97\xe4\xb7\x98\xb2\x9e\xb3\x1e\xd7\x28\x02\x87\xa9\x2a", + 16 + }, + { + "key1", "a", ETYPE_AES256_CTS_HMAC_SHA1_96, + "key2", "b", ETYPE_AES256_CTS_HMAC_SHA1_96, + ETYPE_AES256_CTS_HMAC_SHA1_96, + "\x4d\x6c\xa4\xe6\x29\x78\x5c\x1f\x01\xba\xf5\x5e\x2e\x54\x85\x66" + "\xb9\x61\x7a\xe3\xa9\x68\x68\xc3\x37\xcb\x93\xb5\xe7\x2b\x1c\x7b", + 32 + }, + { + "key1", "a", ETYPE_AES128_CTS_HMAC_SHA1_96, + "key2", "b", ETYPE_AES128_CTS_HMAC_SHA1_96, + ETYPE_AES256_CTS_HMAC_SHA1_96, + "\x97\xdf\x97\xe4\xb7\x98\xb2\x9e\xb3\x1e\xd7\x28\x2\x87\xa9\x2a" + "\x1\x96\xfa\xf2\x44\xf8\x11\x20\xc2\x1c\x51\x17\xb3\xe6\xeb\x98", + 32 + }, + { + "key1", "a", ETYPE_AES256_CTS_HMAC_SHA1_96, + "key2", "b", ETYPE_AES256_CTS_HMAC_SHA1_96, + ETYPE_AES128_CTS_HMAC_SHA1_96, + "\x4d\x6c\xa4\xe6\x29\x78\x5c\x1f\x01\xba\xf5\x5e\x2e\x54\x85\x66", + 16 + }, + { + "key1", "a", ETYPE_AES128_CTS_HMAC_SHA1_96, + "key2", "b", ETYPE_AES256_CTS_HMAC_SHA1_96, + ETYPE_AES256_CTS_HMAC_SHA1_96, + "\x88\xbd\xb2\xa9\xf\x3e\x52\x5a\xb0\x5f\x68\xc5\x43\x9a\x4d\x5e" + "\x9c\x2b\xfd\x2b\x02\x24\xde\x39\xb5\x82\xf4\xbb\x05\xfe\x2\x2e", + 32 + }, + { + "key1", "a", ETYPE_ARCFOUR_HMAC_MD5, + "key2", "b", ETYPE_ARCFOUR_HMAC_MD5, + ETYPE_ARCFOUR_HMAC_MD5, + "\x24\xd7\xf6\xb6\xba\xe4\xe5\xc0\x0d\x20\x82\xc5\xeb\xab\x36\x72", + 16 + }, + /* We don't yet have a PRF for 1DES in Heimdal */ + { + "key1", "a", ETYPE_DES_CBC_CRC, + "key2", "b", ETYPE_DES_CBC_CRC, + ETYPE_DES_CBC_CRC, + "\x43\xba\xe3\x73\x8c\x94\x67\xe6", + 8 + }, + { + "key1", "a", ETYPE_DES3_CBC_SHA1, + "key2", "b", ETYPE_DES3_CBC_SHA1, + ETYPE_DES3_CBC_SHA1, + "\xe5\x8f\x9e\xb6\x43\x86\x2c\x13\xad\x38\xe5\x29\x31\x34\x62\xa7" + "\xf7\x3e\x62\x83\x4f\xe5\x4a\x01", + 24 + }, +}; + + +static void +test_cf2(krb5_context context) +{ + krb5_error_code ret; + krb5_data pw, p1, p2; + krb5_salt salt; + krb5_keyblock k1, k2, k3; + krb5_crypto c1, c2; + unsigned int i; + unsigned int errors = 0; + + ret = krb5_allow_weak_crypto(context, 1); + if (ret) + krb5_err(context, 1, ret, "krb5_allow_weak_crypto"); + + for (i = 0; i < sizeof(cf2)/sizeof(cf2[0]); i++) { + pw.data = cf2[i].p1; + pw.length = strlen(cf2[i].p1); + salt.salttype = (krb5_salttype)KRB5_PADATA_PW_SALT; + salt.saltvalue.data = cf2[i].p1; + salt.saltvalue.length = strlen(cf2[i].p1); + + ret = krb5_string_to_key_data_salt(context, + cf2[i].e1, + pw, + salt, + &k1); + if (ret) + krb5_err(context, 1, ret, "krb5_string_to_key_data_salt"); + + ret = krb5_crypto_init(context, &k1, 0, &c1); + if (ret) + krb5_err(context, 1, ret, "krb5_crypto_init"); + + pw.data = cf2[i].p2; + pw.length = strlen(cf2[i].p2); + salt.saltvalue.data = cf2[i].p2; + salt.saltvalue.length = strlen(cf2[i].p2); + + ret = krb5_string_to_key_data_salt(context, + cf2[i].e2, + pw, + salt, + &k2); + if (ret) + krb5_err(context, 1, ret, "krb5_string_to_key_data_salt"); + + ret = krb5_crypto_init(context, &k2, 0, &c2); + if (ret) + krb5_err(context, 1, ret, "krb5_crypto_init"); + + + p1.data = cf2[i].pepper1; + p1.length = strlen(cf2[i].pepper1); + + p2.data = cf2[i].pepper2; + p2.length = strlen(cf2[i].pepper2); + + ret = krb5_crypto_fx_cf2(context, c1, c2, &p1, &p2, cf2[i].e3, &k3); + if (ret == KRB5_PROG_ETYPE_NOSUPP) { + krb5_warn(context, ret, "KRB-FX-CF2 not supported for enctype %d", + cf2[i].e1); + continue; + } else if (ret) { + krb5_err(context, 1, ret, "krb5_crypto_fx_cf2"); + } + + if (k3.keytype != cf2[i].e3) { + errors++; + krb5_warnx(context, "length not right for enctype %d", cf2[i].e3); + continue; + } + if (k3.keyvalue.length != cf2[i].len || + memcmp(k3.keyvalue.data, cf2[i].key, cf2[i].len) != 0) { + errors++; + krb5_warnx(context, "key not same for enctypes %d %d %d", + cf2[i].e1, cf2[i].e2, cf2[i].e3); + continue; + } + + krb5_crypto_destroy(context, c1); + krb5_crypto_destroy(context, c2); + + krb5_free_keyblock_contents(context, &k1); + krb5_free_keyblock_contents(context, &k2); + krb5_free_keyblock_contents(context, &k3); + } + + if (errors) + krb5_errx(context, 1, "%u KRB-FX-CF2 vectors failed", errors); +} + +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"version", 0, arg_flag, &version_flag, + "print version", NULL }, + {"help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + krb5_context context; + krb5_error_code ret; + int optidx = 0; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + test_cf2(context); + + krb5_free_context(context); + + return 0; +} diff --git a/crypto/heimdal/lib/krb5/test_gic.c b/crypto/heimdal/lib/krb5/test_gic.c new file mode 100644 index 0000000000000000000000000000000000000000..f22a6930fcffb7138b4f52d18569176e419165ed GIT binary patch literal 4133 zc$~FYQFGcx5PpVVu|ub}AS!m!=|e-485v}A6D(0l*zu$pDoY34Sm>xEu-%ORcAvX@ zl8^v9O=nsjWa)PA+i$`{41rSfqD8 z4F8&^cQW#0nxQ%J(T{+|X(qCD#zD@|Gg!njlJiF$+)M^{3mGl(^`3`3Zg**#5k;T^ zrI7HHCmSBpIGG$CiZn~a?K%@O20spAopKN{q;j1ET#ej{*iRl|CX;2V!@bBBAQSah zt}{Ye%23Qi;1h-pe!^kJlcmTq9>OY-8xi75w(v82aKwosc`xEQ1Tqcl zwxIU9yT>l2bPHO64AFU=W|&dtBV7XaZ{>zeg{%aEzgT7>;5vGU6e7eUm@2Z$aF-Sa z4I*DGc~Z*s=8y}^RJp&{2Hm9y-g*1uL%_)Awjpu)nbf+{Ydl8W=xQ7rk7LJl zU9cTsm*Wvb3~pv@o&FF% zjWaf4-i?ZS&OD34ont%$#)jju{$yl0gfgBuW7{=>avCtVKQh>*Ip`t>j0@(KX?frd zjnPP@NQCz@JX35&%s3mFc?jzUp&YaCQ7YA2AH_mqBWxUFv(MbqwMe6rNB}DKzI)&L%EXvN6ju9cME3m~FLTXkVi$4)hJ2Jy81EmdY8|#ddB8 zm&8!=>jZQ?G|}Xcq)Ir0?t8W&ZYy!GwuGz)~V=noy zJovSNktdWs@u1A|*ILc$YB_-^fsDZwBmRXy)_}{3lEEQ&(jOM;ccF9AY&c~Er zyVq>+SFd^s|4BXZd{`$joc5Ye+l+`xGvmk+m6(cHWYZwwVfuVZ%|?TOl#K`mVugor z5D84K%wJ2m!E4)hSjiZXCu3VvTg=%Nx?FDZ! z*lZ{Xc+v~Vtyua#=I)Z`sFn8~j1mHg9f!v`3?+vkl|Utg>RWiTQK5AVc3VZ6^9PaTg|3RPiLlKj-u+cjoF3>!B@)(Vr!()h^xoHd zHsN87i|~QUQ3vId=B4@KNl@${>^r!}=fs^7+0+Up7xwCzfjX3$P+QS0^4E>GEMF{%|!w?Xo%Y5Cb%POfk3d|zV_ROCU! z)>3XByu#!EHI)2wJvMJ9x%Apm@p90+2on_O!6caZcvT4L7SK}t?3o}dAOGE$D&4n@ ns;>QHtkg!gLR31`? +#include +#include +#include + +static int verbose_flag = 0; + +struct testcase { + const heim_oid *oid; + krb5_data Z; + const char *client; + const char *server; + krb5_enctype enctype; + krb5_data as_req; + krb5_data pk_as_rep; + krb5_data ticket; + + krb5_data key; +} tests[] = { + /* 0 */ + { + NULL, /* AlgorithmIdentifier */ + { /* Z */ + 256, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + }, + "lha@SU.SE", /* client, partyUInfo */ + "krbtgt/SU.SE@SU.SE", /* server, partyVInfo */ + ETYPE_AES256_CTS_HMAC_SHA1_96, /* enctype */ + { /* as_req */ + 10, + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + }, + { /* pk_as_rep */ + 9, + "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" + }, + { /* ticket */ + 55, + "\x61\x35\x30\x33\xa0\x03\x02\x01\x05\xa1\x07\x1b\x05\x53\x55\x2e" + "\x53\x45\xa2\x10\x30\x0e\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b" + "\x03\x6c\x68\x61\xa3\x11\x30\x0f\xa0\x03\x02\x01\x12\xa2\x08\x04" + "\x06\x68\x65\x6a\x68\x65\x6a" + }, + { /* key */ + 32, + "\xc7\x62\x89\xec\x4b\x28\xa6\x91\xff\xce\x80\xbb\xb7\xec\x82\x41" + "\x52\x3f\x99\xb1\x90\xcf\x2d\x34\x8f\x54\xa8\x65\x81\x2c\x32\x73" + } + }, + /* 1 */ + { + NULL, /* AlgorithmIdentifier */ + { /* Z */ + 256, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + }, + "lha@SU.SE", /* client, partyUInfo */ + "krbtgt/SU.SE@SU.SE", /* server, partyVInfo */ + ETYPE_AES256_CTS_HMAC_SHA1_96, /* enctype */ + { /* as_req */ + 10, + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + }, + { /* pk_as_rep */ + 9, + "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" + }, + { /* ticket */ + 55, + "\x61\x35\x30\x33\xa0\x03\x02\x01\x05\xa1\x07\x1b\x05\x53\x55\x2e" + "\x53\x45\xa2\x10\x30\x0e\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b" + "\x03\x6c\x68\x61\xa3\x11\x30\x0f\xa0\x03\x02\x01\x12\xa2\x08\x04" + "\x06\x68\x65\x6a\x68\x65\x6a" + }, + { /* key */ + 32, + "\x59\xf3\xca\x77\x5b\x20\x17\xe9\xad\x36\x3f\x47\xca\xbd\x43\xb8" + "\x8c\xb8\x90\x35\x8d\xc6\x0d\x52\x0d\x11\x9f\xb0\xdc\x24\x0b\x61" + } + }, + /* 2 */ + { + NULL, /* AlgorithmIdentifier */ + { /* Z */ + 256, + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" + }, + "lha@SU.SE", /* client, partyUInfo */ + "krbtgt/SU.SE@SU.SE", /* server, partyVInfo */ + ETYPE_AES256_CTS_HMAC_SHA1_96, /* enctype */ + { /* as_req */ + 10, + "\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA" + }, + { /* pk_as_rep */ + 9, + "\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB\xBB" + }, + { /* ticket */ + 55, + "\x61\x35\x30\x33\xa0\x03\x02\x01\x05\xa1\x07\x1b\x05\x53\x55\x2e" + "\x53\x45\xa2\x10\x30\x0e\xa0\x03\x02\x01\x01\xa1\x07\x30\x05\x1b" + "\x03\x6c\x68\x61\xa3\x11\x30\x0f\xa0\x03\x02\x01\x12\xa2\x08\x04" + "\x06\x68\x65\x6a\x68\x65\x6a" + }, + { /* key */ + 32, + "\x8a\x9a\xc5\x5f\x45\xda\x1a\x73\xd9\x1e\xe9\x88\x1f\xa9\x48\x81" + "\xce\xac\x66\x2d\xb1\xd3\xb9\x0a\x9d\x0e\x52\x83\xdf\xe1\x84\x3d" + } + } +}; + +#ifdef MAKETICKET +static void +fooTicket(void) +{ + krb5_error_code ret; + krb5_data data; + size_t size; + Ticket t; + + t.tkt_vno = 5; + t.realm = "SU.SE"; + t.sname.name_type = KRB5_NT_PRINCIPAL; + t.sname.name_string.len = 1; + t.sname.name_string.val = ecalloc(1, sizeof(t.sname.name_string.val[0])); + t.sname.name_string.val[0] = estrdup("lha"); + t.enc_part.etype = ETYPE_AES256_CTS_HMAC_SHA1_96; + t.enc_part.kvno = NULL; + t.enc_part.cipher.length = 6; + t.enc_part.cipher.data = "hejhej"; + + ASN1_MALLOC_ENCODE(Ticket, data.data, data.length, &t, &size, ret); + if (ret) + errx(1, "ASN1_MALLOC_ENCODE(Ticket)"); + + rk_dumpdata("foo", data.data, data.length); + free(data.data); +} +#endif + +static void +test_dh2key(krb5_context context, int i, struct testcase *c) +{ + krb5_error_code ret; + krb5_keyblock key; + krb5_principal client, server; + Ticket ticket; + AlgorithmIdentifier ai; + size_t size; + + memset(&ticket, 0, sizeof(ticket)); + + ai.algorithm = *c->oid; + ai.parameters = NULL; + + ret = decode_Ticket(c->ticket.data, c->ticket.length, &ticket, &size); + if (ret) + krb5_errx(context, 1, "decode ticket: %d", ret); + + ret = krb5_parse_name(context, c->client, &client); + if (ret) + krb5_err(context, 1, ret, "parse_name: %s", c->client); + ret = krb5_parse_name(context, c->server, &server); + if (ret) + krb5_err(context, 1, ret, "parse_name: %s", c->server); + /* + * Making krb5_build_principal*() set a reasonable default principal + * name type broke the test vectors here. Rather than regenerate + * the vectors, and to prove that this was the issue, we coerce the + * name types back to their original. + */ + krb5_principal_set_type(context, client, KRB5_NT_PRINCIPAL); + krb5_principal_set_type(context, server, KRB5_NT_PRINCIPAL); + + if (verbose_flag) { + char *str; + hex_encode(c->Z.data, c->Z.length, &str); + printf("Z: %s\n", str); + free(str); + printf("client: %s\n", c->client); + printf("server: %s\n", c->server); + printf("enctype: %d\n", (int)c->enctype); + hex_encode(c->as_req.data, c->as_req.length, &str); + printf("as-req: %s\n", str); + free(str); + hex_encode(c->pk_as_rep.data, c->pk_as_rep.length, &str); + printf("pk-as-rep: %s\n", str); + free(str); + hex_encode(c->ticket.data, c->ticket.length, &str); + printf("ticket: %s\n", str); + free(str); + } + + ret = _krb5_pk_kdf(context, + &ai, + c->Z.data, + c->Z.length, + client, + server, + c->enctype, + &c->as_req, + &c->pk_as_rep, + &ticket, + &key); + krb5_free_principal(context, client); + krb5_free_principal(context, server); + if (ret) + krb5_err(context, 1, ret, "_krb5_pk_kdf: %d", i); + + if (verbose_flag) { + char *str; + hex_encode(key.keyvalue.data, key.keyvalue.length, &str); + printf("key: %s\n", str); + free(str); + } + + if (key.keyvalue.length != c->key.length || + memcmp(key.keyvalue.data, c->key.data, c->key.length) != 0) + krb5_errx(context, 1, "resulting key wrong: %d", i); + + krb5_free_keyblock_contents(context, &key); + free_Ticket(&ticket); +} + + + + +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"verbose", 0, arg_flag, &verbose_flag, + "verbose output", NULL }, + {"version", 0, arg_flag, &version_flag, + "print version", NULL }, + {"help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + + +int +main(int argc, char **argv) +{ + krb5_context context; + krb5_error_code ret; + int i, optidx = 0; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + argc -= optidx; + argv += optidx; + +#ifdef MAKETICKET + fooTicket(); +#endif + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + tests[0].oid = &asn1_oid_id_pkinit_kdf_ah_sha1; + tests[1].oid = &asn1_oid_id_pkinit_kdf_ah_sha256; + tests[2].oid = &asn1_oid_id_pkinit_kdf_ah_sha512; + + for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++) + test_dh2key(context, i, &tests[i]); + + krb5_free_context(context); + + return 0; +} diff --git a/crypto/heimdal/lib/krb5/test_plugin.c b/crypto/heimdal/lib/krb5/test_plugin.c --- a/crypto/heimdal/lib/krb5/test_plugin.c +++ b/crypto/heimdal/lib/krb5/test_plugin.c @@ -34,19 +34,19 @@ #include #include "locate_plugin.h" -static krb5_error_code +static krb5_error_code KRB5_CALLCONV resolve_init(krb5_context context, void **ctx) { *ctx = NULL; return 0; } -static void +static void KRB5_CALLCONV resolve_fini(void *ctx) { } -static krb5_error_code +static krb5_error_code KRB5_CALLCONV resolve_lookup(void *ctx, enum locate_service_type service, const char *realm, @@ -77,7 +77,8 @@ 0, resolve_init, resolve_fini, - resolve_lookup + resolve_lookup, + NULL }; @@ -113,11 +114,13 @@ while(krb5_krbhst_next_as_string(context, handle, host, sizeof(host)) == 0){ found++; - if (strcmp(host, "127.0.0.2") != 0) + if (!found && strcmp(host, "127.0.0.2") != 0 && strcmp(host, "tcp/127.0.0.2") != 0) krb5_errx(context, 1, "wrong address: %s", host); } if (!found) krb5_errx(context, 1, "failed to find host"); + if (found < 2) + krb5_errx(context, 1, "did not get the two expected results"); krb5_krbhst_free(context, handle); diff --git a/crypto/heimdal/lib/krb5/test_rfc3961.c b/crypto/heimdal/lib/krb5/test_rfc3961.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_rfc3961.c @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2003-2005 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "krb5_locl.h" +#include +#include + +static void +time_encryption(krb5_context context, size_t size, + krb5_enctype etype, int iterations) +{ + struct timeval tv1, tv2; + krb5_error_code ret; + krb5_keyblock key; + krb5_crypto crypto; + krb5_data data; + char *etype_name; + void *buf; + int i; + + ret = krb5_generate_random_keyblock(context, etype, &key); + if (ret) + krb5_err(context, 1, ret, "krb5_generate_random_keyblock"); + + ret = krb5_enctype_to_string(context, etype, &etype_name); + if (ret) + krb5_err(context, 1, ret, "krb5_enctype_to_string"); + + buf = malloc(size); + if (buf == NULL) + krb5_errx(context, 1, "out of memory"); + memset(buf, 0, size); + + ret = krb5_crypto_init(context, &key, 0, &crypto); + if (ret) + krb5_err(context, 1, ret, "krb5_crypto_init"); + + gettimeofday(&tv1, NULL); + + for (i = 0; i < iterations; i++) { + ret = krb5_encrypt(context, crypto, 0, buf, size, &data); + if (ret) + krb5_err(context, 1, ret, "encrypt: %d", i); + krb5_data_free(&data); + } + + gettimeofday(&tv2, NULL); + + timevalsub(&tv2, &tv1); + + printf("%s size: %7lu iterations: %d time: %3ld.%06ld\n", + etype_name, (unsigned long)size, iterations, + (long)tv2.tv_sec, (long)tv2.tv_usec); + + free(buf); + free(etype_name); + krb5_crypto_destroy(context, crypto); + krb5_free_keyblock_contents(context, &key); +} + +static void +time_s2k(krb5_context context, + krb5_enctype etype, + const char *password, + krb5_salt salt, + int iterations) +{ + struct timeval tv1, tv2; + krb5_error_code ret; + krb5_keyblock key; + krb5_data opaque; + char *etype_name; + int i; + + ret = krb5_enctype_to_string(context, etype, &etype_name); + if (ret) + krb5_err(context, 1, ret, "krb5_enctype_to_string"); + + opaque.data = NULL; + opaque.length = 0; + + gettimeofday(&tv1, NULL); + + for (i = 0; i < iterations; i++) { + ret = krb5_string_to_key_salt_opaque(context, etype, password, salt, + opaque, &key); + if (ret) + krb5_err(context, 1, ret, "krb5_string_to_key_data_salt_opaque"); + krb5_free_keyblock_contents(context, &key); + } + + gettimeofday(&tv2, NULL); + + timevalsub(&tv2, &tv1); + + printf("%s string2key %d iterations time: %3ld.%06ld\n", + etype_name, iterations, (long)tv2.tv_sec, (long)tv2.tv_usec); + free(etype_name); + +} + +static int version_flag = 0; +static int help_flag = 0; + +static struct getargs args[] = { + {"version", 0, arg_flag, &version_flag, + "print version", NULL }, + {"help", 0, arg_flag, &help_flag, + NULL, NULL } +}; + +static void +usage (int ret) +{ + arg_printusage (args, + sizeof(args)/sizeof(*args), + NULL, + ""); + exit (ret); +} + +int +main(int argc, char **argv) +{ + krb5_context context; + krb5_error_code ret; + int i, enciter, s2kiter; + int optidx = 0; + krb5_salt salt; + + krb5_enctype enctypes[] = { + ETYPE_DES_CBC_CRC, + ETYPE_DES3_CBC_SHA1, + ETYPE_ARCFOUR_HMAC_MD5, + ETYPE_AES128_CTS_HMAC_SHA1_96, + ETYPE_AES256_CTS_HMAC_SHA1_96, + ETYPE_AES128_CTS_HMAC_SHA256_128, + ETYPE_AES256_CTS_HMAC_SHA384_192 + }; + + setprogname(argv[0]); + + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage (0); + + if(version_flag){ + print_version(NULL); + exit(0); + } + + salt.salttype = KRB5_PW_SALT; + salt.saltvalue.data = NULL; + salt.saltvalue.length = 0; + + ret = krb5_init_context(&context); + if (ret) + errx (1, "krb5_init_context failed: %d", ret); + + enciter = 1000; + s2kiter = 100; + + for (i = 0; i < sizeof(enctypes)/sizeof(enctypes[0]); i++) { + + krb5_enctype_enable(context, enctypes[i]); + + time_encryption(context, 16, enctypes[i], enciter); + time_encryption(context, 32, enctypes[i], enciter); + time_encryption(context, 512, enctypes[i], enciter); + time_encryption(context, 1024, enctypes[i], enciter); + time_encryption(context, 2048, enctypes[i], enciter); + time_encryption(context, 4096, enctypes[i], enciter); + time_encryption(context, 8192, enctypes[i], enciter); + time_encryption(context, 16384, enctypes[i], enciter); + time_encryption(context, 32768, enctypes[i], enciter); + + time_s2k(context, enctypes[i], "mYsecreitPassword", salt, s2kiter); + } + + krb5_free_context(context); + + return 0; +} diff --git a/crypto/heimdal/lib/krb5/test_set_kvno0.c b/crypto/heimdal/lib/krb5/test_set_kvno0.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_set_kvno0.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2011, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "krb5_locl.h" +#include +#include + +#if 0 +#include +#include +#include +#include +#include +#include +#endif + +int +main(int argc, char **argv) +{ + krb5_error_code ret; + krb5_context context; + krb5_ccache src_cc = NULL; + krb5_ccache dst_cc = NULL; + krb5_cc_cursor cursor; + krb5_principal me = NULL; + krb5_creds cred; + const char *during; + Ticket t; + size_t len; + int make_kvno_absent = 0; + int opt; + + memset(&cred, 0, sizeof (cred)); + during = "init_context"; + ret = krb5_init_context(&context); + if (ret) goto err; + + while ((opt = getopt(argc, argv, "c:n")) != -1) { + switch (opt) { + case 'c': + during = "cc_resolve of source ccache"; + ret = krb5_cc_resolve(context, optarg, &src_cc); + if (ret) goto err; + break; + case 'n': + make_kvno_absent++; + break; + case 'h': + default: + fprintf(stderr, "Usage: %s [-n] [-c ccache]\n" + "\tThis utility edits a ccache, setting all ticket\n" + "\tenc_part kvnos to zero or absent (if -n is set).\n", + argv[0]); + return 1; + } + } + + if (!src_cc) { + during = "cc_default"; + ret = krb5_cc_default(context, &src_cc); + if (ret) goto err; + } + + during = "cc_get_principal"; + ret = krb5_cc_get_principal(context, src_cc, &me); + if (ret) goto err; + + if (optind != argc) { + fprintf(stderr, "Usage: %s [-n] [-c ccache]\n" + "\tThis utility edits a ccache, setting all ticket\n" + "\tenc_part kvnos to zero or absent (if -n is set).\n", + argv[0]); + return 1; + } + + during = "cc_new_unique of temporary ccache"; + ret = krb5_cc_new_unique(context, krb5_cc_get_type(context, src_cc), + NULL, &dst_cc); + + during = "cc_initialize of temporary ccache"; + ret = krb5_cc_initialize(context, dst_cc, me); + if (ret) goto err; + + during = "cc_start_seq_get"; + ret = krb5_cc_start_seq_get(context, src_cc, &cursor); + if (ret) goto err; + + while ((ret = krb5_cc_next_cred(context, src_cc, &cursor, &cred)) == 0) { + krb5_data data; + + during = "decode_Ticket"; + memset(&t, 0, sizeof (t)); + ret = decode_Ticket(cred.ticket.data, cred.ticket.length, &t, &len); + if (ret == ASN1_MISSING_FIELD) + continue; + if (ret) goto err; + if (t.enc_part.kvno) { + *t.enc_part.kvno = 0; + if (make_kvno_absent) { + free(t.enc_part.kvno); + t.enc_part.kvno = NULL; + } + /* + * The new Ticket has to need less or same space as before, so + * we reuse cred->icket.data. + */ + during = "encode_Ticket"; + ASN1_MALLOC_ENCODE(Ticket, data.data, data.length, &t, &len, ret); + if (ret) { + free_Ticket(&t); + goto err; + } + krb5_data_free(&cred.ticket); + cred.ticket = data; + } + free_Ticket(&t); + during = "cc_store_cred"; + ret = krb5_cc_store_cred(context, dst_cc, &cred); + if (ret) goto err; + krb5_free_cred_contents(context, &cred); + memset(&cred, 0, sizeof (cred)); + } + during = "cc_next_cred"; + if (ret != KRB5_CC_END) goto err; + + during = "cc_end_seq_get"; + ret = krb5_cc_end_seq_get(context, src_cc, &cursor); + if (ret) goto err; + + during = "cc_move"; + ret = krb5_cc_move(context, dst_cc, src_cc); + if (ret) goto err; + dst_cc = NULL; + + during = "cc_switch"; + ret = krb5_cc_switch(context, src_cc); + if (ret) goto err; + +err: + (void) krb5_free_principal(context, me); + if (src_cc) + (void) krb5_cc_close(context, src_cc); + if (dst_cc) + (void) krb5_cc_destroy(context, dst_cc); + if (ret) { + fprintf(stderr, "Failed while doing %s (%d)\n", during, ret); + ret = 1; + } + return (ret); +} + diff --git a/crypto/heimdal/lib/krb5/test_store.c b/crypto/heimdal/lib/krb5/test_store.c --- a/crypto/heimdal/lib/krb5/test_store.c +++ b/crypto/heimdal/lib/krb5/test_store.c @@ -44,12 +44,12 @@ krb5_storage_truncate(sp, 0); - for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { + for (i = 0; i < sizeof(val)/sizeof(val[0]); i++) { ret = krb5_store_int8(sp, val[i]); if (ret) krb5_err(context, 1, ret, "krb5_store_int8"); - krb5_storage_seek(sp, 0, SEEK_SET); + krb5_storage_seek(sp, i, SEEK_SET); ret = krb5_ret_int8(sp, &v); if (ret) krb5_err(context, 1, ret, "krb5_ret_int8"); @@ -69,12 +69,12 @@ krb5_storage_truncate(sp, 0); - for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { + for (i = 0; i < sizeof(val)/sizeof(val[0]); i++) { ret = krb5_store_int16(sp, val[i]); if (ret) krb5_err(context, 1, ret, "krb5_store_int16"); - krb5_storage_seek(sp, 0, SEEK_SET); + krb5_storage_seek(sp, i * sizeof (v), SEEK_SET); ret = krb5_ret_int16(sp, &v); if (ret) krb5_err(context, 1, ret, "krb5_ret_int16"); @@ -94,12 +94,12 @@ krb5_storage_truncate(sp, 0); - for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { + for (i = 0; i < sizeof(val)/sizeof(val[0]); i++) { ret = krb5_store_int32(sp, val[i]); if (ret) krb5_err(context, 1, ret, "krb5_store_int32"); - krb5_storage_seek(sp, 0, SEEK_SET); + krb5_storage_seek(sp, i * sizeof (v), SEEK_SET); ret = krb5_ret_int32(sp, &v); if (ret) krb5_err(context, 1, ret, "krb5_ret_int32"); @@ -119,12 +119,12 @@ krb5_storage_truncate(sp, 0); - for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { + for (i = 0; i < sizeof(val)/sizeof(val[0]); i++) { ret = krb5_store_uint8(sp, val[i]); if (ret) krb5_err(context, 1, ret, "krb5_store_uint8"); - krb5_storage_seek(sp, 0, SEEK_SET); + krb5_storage_seek(sp, i * sizeof (v), SEEK_SET); ret = krb5_ret_uint8(sp, &v); if (ret) krb5_err(context, 1, ret, "krb5_ret_uint8"); @@ -144,12 +144,12 @@ krb5_storage_truncate(sp, 0); - for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { + for (i = 0; i < sizeof(val)/sizeof(val[0]); i++) { ret = krb5_store_uint16(sp, val[i]); if (ret) krb5_err(context, 1, ret, "krb5_store_uint16"); - krb5_storage_seek(sp, 0, SEEK_SET); + krb5_storage_seek(sp, i * sizeof (v), SEEK_SET); ret = krb5_ret_uint16(sp, &v); if (ret) krb5_err(context, 1, ret, "krb5_ret_uint16"); @@ -169,12 +169,12 @@ krb5_storage_truncate(sp, 0); - for (i = 0; i < sizeof(val[0])/sizeof(val); i++) { + for (i = 0; i < sizeof(val)/sizeof(val[0]); i++) { ret = krb5_store_uint32(sp, val[i]); if (ret) krb5_err(context, 1, ret, "krb5_store_uint32"); - krb5_storage_seek(sp, 0, SEEK_SET); + krb5_storage_seek(sp, i * sizeof (v), SEEK_SET); ret = krb5_ret_uint32(sp, &v); if (ret) krb5_err(context, 1, ret, "krb5_ret_uint32"); @@ -220,12 +220,12 @@ static void check_too_large(krb5_context context, krb5_storage *sp) { - uint32_t too_big_sizes[] = { INT_MAX, INT_MAX / 2, INT_MAX / 4, INT_MAX / 8 + 1}; + uint32_t too_big_sizes[] = { UINT_MAX, UINT_MAX / 2, UINT_MAX / 4, UINT_MAX / 8 + 1}; krb5_error_code ret; krb5_data data; size_t n; - for (n = 0; n < sizeof(too_big_sizes) / sizeof(too_big_sizes); n++) { + for (n = 0; n < sizeof(too_big_sizes) / sizeof(too_big_sizes[0]); n++) { krb5_storage_truncate(sp, 0); krb5_store_uint32(sp, too_big_sizes[n]); krb5_storage_seek(sp, 0, SEEK_SET); diff --git a/crypto/heimdal/lib/krb5/test_time.c b/crypto/heimdal/lib/krb5/test_time.c --- a/crypto/heimdal/lib/krb5/test_time.c +++ b/crypto/heimdal/lib/krb5/test_time.c @@ -54,11 +54,11 @@ if (ret) krb5_err(context, 1, ret, "krb5_us_timeofday"); - diff2 = abs(sec - tv.tv_sec); + diff2 = labs(sec - tv.tv_sec); if (diff2 < 9 || diff > 11) - krb5_errx(context, 1, "set time error: diff: %d", - abs(sec - tv.tv_sec)); + krb5_errx(context, 1, "set time error: diff: %ld", + labs(sec - tv.tv_sec)); } diff --git a/crypto/heimdal/lib/krb5/test_x500.c b/crypto/heimdal/lib/krb5/test_x500.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/test_x500.c @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2011 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of KTH nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +#include "krb5_locl.h" +#include + +/* + * + */ + +static void +check_linear(krb5_context context, + const char *client_realm, + const char *server_realm, + const char *realm, + ...) +{ + unsigned int num_inrealms = 0, num_realms = 0, n; + char **inrealms = NULL; + char **realms = NULL; + krb5_error_code ret; + krb5_data tr; + va_list va; + + krb5_data_zero(&tr); + + va_start(va, realm); + + while (realm) { + inrealms = erealloc(inrealms, (num_inrealms + 2) * sizeof(inrealms[0])); + inrealms[num_inrealms] = rk_UNCONST(realm); + num_inrealms++; + realm = va_arg(va, const char *); + } + if (inrealms) + inrealms[num_inrealms] = NULL; + + ret = krb5_domain_x500_encode(inrealms, num_inrealms, &tr); + if (ret) + krb5_err(context, 1, ret, "krb5_domain_x500_encode"); + + ret = krb5_domain_x500_decode(context, tr, + &realms, &num_realms, + client_realm, server_realm); + if (ret) + krb5_err(context, 1, ret, "krb5_domain_x500_decode"); + + krb5_data_free(&tr); + + if (num_inrealms != num_realms) + errx(1, "num_inrealms != num_realms"); + + for(n = 0; n < num_realms; n++) + free(realms[n]); + free(realms); + + free(inrealms); +} + + +int +main(int argc, char **argv) +{ + krb5_context context; + krb5_error_code ret; + + setprogname(argv[0]); + + ret = krb5_init_context(&context); + if (ret) + errx(1, "krb5_init_context"); + + + check_linear(context, "KTH1.SE", "KTH1.SE", NULL); + check_linear(context, "KTH1.SE", "KTH2.SE", NULL); + check_linear(context, "KTH1.SE", "KTH3.SE", "KTH2.SE", NULL); + check_linear(context, "KTH1.SE", "KTH4.SE", "KTH3.SE", "KTH2.SE", NULL); + check_linear(context, "KTH1.SE", "KTH5.SE", "KTH4.SE", "KTH3.SE", "KTH2.SE", NULL); + + return 0; +} diff --git a/crypto/heimdal/lib/krb5/ticket.c b/crypto/heimdal/lib/krb5/ticket.c --- a/crypto/heimdal/lib/krb5/ticket.c +++ b/crypto/heimdal/lib/krb5/ticket.c @@ -81,11 +81,8 @@ *to = NULL; tmp = malloc(sizeof(*tmp)); - if(tmp == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if (tmp == NULL) + return krb5_enomem(context); if((ret = copy_EncTicketPart(&from->ticket, &tmp->ticket))){ free(tmp); return ret; @@ -325,6 +322,37 @@ return ret; } +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_get_ad(krb5_context context, + const AuthorizationData *ad, + krb5_keyblock *sessionkey, + int type, + krb5_data *data) +{ + krb5_boolean found = FALSE; + krb5_error_code ret; + + krb5_data_zero(data); + + if (ad == NULL) { + krb5_set_error_message(context, ENOENT, + N_("No authorization data", "")); + return ENOENT; /* XXX */ + } + + ret = find_type_in_ad(context, type, data, &found, TRUE, sessionkey, ad, 0); + if (ret) + return ret; + if (!found) { + krb5_set_error_message(context, ENOENT, + N_("Have no authorization data of type %d", ""), + type); + return ENOENT; /* XXX */ + } + return 0; +} + + /** * Extract the authorization data type of type from the ticket. Store * the field in data. This function is to use for kerberos @@ -498,107 +526,76 @@ return 0; } - /* - * Verify referral data + * Verify KDC supported anonymous if requested */ +static krb5_error_code +check_client_anonymous(krb5_context context, + krb5_kdc_rep *rep, + krb5_const_principal requested, + krb5_const_principal mapped, + krb5_boolean is_tgs_rep) +{ + int flags; + if (!rep->enc_part.flags.anonymous) + return KRB5KDC_ERR_BADOPTION; + + /* + * Here we must validate that the AS returned a ticket of the expected type + * for either a fully anonymous request, or authenticated request for an + * anonymous ticket. If this is a TGS request, we're done. Then if the + * 'requested' principal was anonymous, we'll check the 'mapped' principal + * accordingly (without enforcing the name type and perhaps the realm). + * Finally, if the 'requested' principal was not anonymous, well check + * that the 'mapped' principal has an anonymous name and type, in a + * non-anonymous realm. (Should we also be checking for a realm match + * between the request and the mapped name in this case?) + */ + if (is_tgs_rep) + flags = KRB5_ANON_MATCH_ANY_NONT; + else if (krb5_principal_is_anonymous(context, requested, + KRB5_ANON_MATCH_ANY_NONT)) + flags = KRB5_ANON_MATCH_UNAUTHENTICATED | KRB5_ANON_IGNORE_NAME_TYPE; + else + flags = KRB5_ANON_MATCH_AUTHENTICATED; + + if (!krb5_principal_is_anonymous(context, mapped, flags)) + return KRB5KRB_AP_ERR_MODIFIED; + + return 0; +} + +/* + * Verify returned client principal name in anonymous/referral case + */ static krb5_error_code -check_client_referral(krb5_context context, +check_client_mismatch(krb5_context context, krb5_kdc_rep *rep, krb5_const_principal requested, krb5_const_principal mapped, krb5_keyblock const * key) { - krb5_error_code ret; - PA_ClientCanonicalized canon; - krb5_crypto crypto; - krb5_data data; - PA_DATA *pa; - size_t len; - int i = 0; - - if (rep->kdc_rep.padata == NULL) - goto noreferral; - - pa = krb5_find_padata(rep->kdc_rep.padata->val, - rep->kdc_rep.padata->len, - KRB5_PADATA_CLIENT_CANONICALIZED, &i); - if (pa == NULL) - goto noreferral; - - ret = decode_PA_ClientCanonicalized(pa->padata_value.data, - pa->padata_value.length, - &canon, &len); - if (ret) { - krb5_set_error_message(context, ret, - N_("Failed to decode ClientCanonicalized " - "from realm %s", ""), requested->realm); - return ret; - } - - ASN1_MALLOC_ENCODE(PA_ClientCanonicalizedNames, data.data, data.length, - &canon.names, &len, ret); - if (ret) { - free_PA_ClientCanonicalized(&canon); - return ret; - } - if (data.length != len) - krb5_abortx(context, "internal asn.1 error"); - - ret = krb5_crypto_init(context, key, 0, &crypto); - if (ret) { - free(data.data); - free_PA_ClientCanonicalized(&canon); - return ret; - } - - ret = krb5_verify_checksum(context, crypto, KRB5_KU_CANONICALIZED_NAMES, - data.data, data.length, - &canon.canon_checksum); - krb5_crypto_destroy(context, crypto); - free(data.data); - if (ret) { - krb5_set_error_message(context, ret, - N_("Failed to verify client canonicalized " - "data from realm %s", ""), - requested->realm); - free_PA_ClientCanonicalized(&canon); - return ret; - } - - if (!_krb5_principal_compare_PrincipalName(context, - requested, - &canon.names.requested_name)) - { - free_PA_ClientCanonicalized(&canon); - krb5_set_error_message(context, KRB5_PRINC_NOMATCH, - N_("Requested name doesn't match" - " in client referral", "")); - return KRB5_PRINC_NOMATCH; - } - if (!_krb5_principal_compare_PrincipalName(context, - mapped, - &canon.names.mapped_name)) - { - free_PA_ClientCanonicalized(&canon); - krb5_set_error_message(context, KRB5_PRINC_NOMATCH, - N_("Mapped name doesn't match" - " in client referral", "")); - return KRB5_PRINC_NOMATCH; + if (rep->enc_part.flags.anonymous) { + if (!krb5_principal_is_anonymous(context, mapped, + KRB5_ANON_MATCH_ANY_NONT)) { + krb5_set_error_message(context, KRB5KRB_AP_ERR_MODIFIED, + N_("Anonymous ticket does not contain anonymous " + "principal", "")); + return KRB5KRB_AP_ERR_MODIFIED; + } + } else { + if (krb5_principal_compare(context, requested, mapped) == FALSE && + !rep->enc_part.flags.enc_pa_rep) { + krb5_set_error_message(context, KRB5KRB_AP_ERR_MODIFIED, + N_("Not same client principal returned " + "as requested", "")); + return KRB5KRB_AP_ERR_MODIFIED; + } } return 0; - -noreferral: - if (krb5_principal_compare(context, requested, mapped) == FALSE) { - krb5_set_error_message(context, KRB5KRB_AP_ERR_MODIFIED, - N_("Not same client principal returned " - "as requested", "")); - return KRB5KRB_AP_ERR_MODIFIED; - } - return 0; } @@ -646,7 +643,7 @@ return 0; } -int +KRB5_LIB_FUNCTION int KRB5_LIB_CALL _krb5_extract_ticket(krb5_context context, krb5_kdc_rep *rep, krb5_creds *creds, @@ -656,6 +653,7 @@ krb5_addresses *addrs, unsigned nonce, unsigned flags, + krb5_data *request, krb5_decrypt_proc decrypt_proc, krb5_const_pointer decryptarg) { @@ -674,6 +672,48 @@ if (ret) goto out; + if (rep->enc_part.flags.enc_pa_rep && request) { + krb5_crypto crypto = NULL; + Checksum cksum; + PA_DATA *pa = NULL; + int idx = 0; + + _krb5_debug(context, 5, "processing enc-ap-rep"); + + if (rep->enc_part.encrypted_pa_data == NULL || + (pa = krb5_find_padata(rep->enc_part.encrypted_pa_data->val, + rep->enc_part.encrypted_pa_data->len, + KRB5_PADATA_REQ_ENC_PA_REP, + &idx)) == NULL) + { + _krb5_debug(context, 5, "KRB5_PADATA_REQ_ENC_PA_REP missing"); + ret = KRB5KRB_AP_ERR_MODIFIED; + goto out; + } + + ret = krb5_crypto_init(context, key, 0, &crypto); + if (ret) + goto out; + + ret = decode_Checksum(pa->padata_value.data, + pa->padata_value.length, + &cksum, NULL); + if (ret) { + krb5_crypto_destroy(context, crypto); + goto out; + } + + ret = krb5_verify_checksum(context, crypto, + KRB5_KU_AS_REQ, + request->data, request->length, + &cksum); + krb5_crypto_destroy(context, crypto); + free_Checksum(&cksum); + _krb5_debug(context, 5, "enc-ap-rep: %svalid", (ret == 0) ? "" : "in"); + if (ret) + goto out; + } + /* save session key */ creds->session.keyvalue.length = 0; @@ -688,17 +728,28 @@ } /* compare client and save */ - ret = _krb5_principalname2krb5_principal (context, - &tmp_principal, - rep->kdc_rep.cname, - rep->kdc_rep.crealm); + ret = _krb5_principalname2krb5_principal(context, + &tmp_principal, + rep->kdc_rep.cname, + rep->kdc_rep.crealm); if (ret) goto out; + /* check KDC supported anonymous if it was requested */ + if (flags & EXTRACT_TICKET_MATCH_ANON) { + ret = check_client_anonymous(context,rep, + creds->client, + tmp_principal, + request == NULL); /* is TGS */ + if (ret) { + krb5_free_principal(context, tmp_principal); + goto out; + } + } + /* check client referral and save principal */ - /* anonymous here ? */ if((flags & EXTRACT_TICKET_ALLOW_CNAME_MISMATCH) == 0) { - ret = check_client_referral(context, rep, + ret = check_client_mismatch(context, rep, creds->client, tmp_principal, &creds->session); @@ -776,12 +827,12 @@ tmp_time = rep->enc_part.authtime; if (creds->times.starttime == 0 - && abs(tmp_time - sec_now) > context->max_skew) { + && labs(tmp_time - sec_now) > context->max_skew) { ret = KRB5KRB_AP_ERR_SKEW; krb5_set_error_message (context, ret, - N_("time skew (%d) larger than max (%d)", ""), - abs(tmp_time - sec_now), - (int)context->max_skew); + N_("time skew (%ld) larger than max (%ld)", ""), + labs(tmp_time - sec_now), + (long)context->max_skew); goto out; } diff --git a/crypto/heimdal/lib/krb5/transited.c b/crypto/heimdal/lib/krb5/transited.c --- a/crypto/heimdal/lib/krb5/transited.c +++ b/crypto/heimdal/lib/krb5/transited.c @@ -401,6 +401,208 @@ return 0; } +KRB5_LIB_FUNCTION void KRB5_LIB_CALL +_krb5_free_capath(krb5_context context, char **capath) +{ + char **s; + + for (s = capath; s && *s; ++s) + free(*s); + free(capath); +} + +struct hier_iter { + const char *local_realm; + const char *server_realm; + const char *lr; /* Pointer into tail of local realm */ + const char *sr; /* Pointer into tail of server realm */ + size_t llen; /* Length of local_realm */ + size_t slen; /* Length of server_realm */ + size_t len; /* Length of common suffix */ + size_t num; /* Path element count */ +}; + +/* + * Step up from local_realm to common suffix, or else down to server_realm. + */ +static const char * +hier_next(struct hier_iter *state) +{ + const char *lr = state->lr; + const char *sr = state->sr; + const char *lsuffix = state->local_realm + state->llen - state->len; + const char *server_realm = state->server_realm; + + if (lr != NULL) { + while (lr < lsuffix) + if (*lr++ == '.') + return state->lr = lr; + state->lr = NULL; + } + if (sr != NULL) { + while (--sr >= server_realm) + if (sr == server_realm || sr[-1] == '.') + return state->sr = sr; + state->sr = NULL; + } + return NULL; +} + +static void +hier_init(struct hier_iter *state, const char *local_realm, const char *server_realm) +{ + size_t llen; + size_t slen; + size_t len = 0; + const char *lr; + const char *sr; + + state->local_realm = local_realm; + state->server_realm = server_realm; + state->llen = llen = strlen(local_realm); + state->slen = slen = strlen(server_realm); + state->len = 0; + state->num = 0; + + if (slen == 0 || llen == 0) + return; + + /* Find first difference from the back */ + for (lr = local_realm + llen, sr = server_realm + slen; + lr != local_realm && sr != server_realm; + --lr, --sr) { + if (lr[-1] != sr[-1]) + break; + if (lr[-1] == '.') + len = llen - (lr - local_realm); + } + + /* Nothing in common? */ + if (*lr == '\0') + return; + + /* Everything in common? */ + if (llen == slen && lr == local_realm) + return; + + /* Is one realm is a suffix of the other? */ + if ((llen < slen && lr == local_realm && sr[-1] == '.') || + (llen > slen && sr == server_realm && lr[-1] == '.')) + len = llen - (lr - local_realm); + + state->len = len; + /* `lr` starts at local realm and walks up the tree to common suffix */ + state->lr = local_realm; + /* `sr` starts at common suffix in server realm and walks down the tree */ + state->sr = server_realm + slen - len; + + /* Count elements and reset */ + while (hier_next(state) != NULL) + ++state->num; + state->lr = local_realm; + state->sr = server_realm + slen - len; +} + +/* + * Find a referral path from client_realm to server_realm via local_realm. + * Either via [capaths] or hierarchicaly. + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_find_capath(krb5_context context, + const char *client_realm, + const char *local_realm, + const char *server_realm, + krb5_boolean use_hierarchical, + char ***rpath, + size_t *npath) +{ + char **confpath; + char **capath; + struct hier_iter hier_state; + char **rp; + const char *r; + + *rpath = NULL; + *npath = 0; + + confpath = krb5_config_get_strings(context, NULL, "capaths", + client_realm, server_realm, NULL); + if (confpath == NULL) + confpath = krb5_config_get_strings(context, NULL, "capaths", + local_realm, server_realm, NULL); + /* + * With a [capaths] setting from the client to the server we look for our + * own realm in the list. If our own realm is not present, we return the + * full list. Otherwise, we return our realm's successors, or possibly + * NULL. Ignoring a [capaths] settings risks loops plus would violate + * explicit policy and the principle of least surpise. + */ + if (confpath != NULL) { + char **start = confpath; + size_t i; + size_t n; + + for (rp = start; *rp; rp++) + if (strcmp(*rp, local_realm) == 0) + start = rp+1; + n = rp - start; + + if (n == 0) { + krb5_config_free_strings(confpath); + return 0; + } + + capath = calloc(n + 1, sizeof(*capath)); + if (capath == NULL) { + krb5_config_free_strings(confpath); + return krb5_enomem(context); + } + + for (i = 0, rp = start; *rp; rp++) { + if ((capath[i++] = strdup(*rp)) == NULL) { + _krb5_free_capath(context, capath); + krb5_config_free_strings(confpath); + return krb5_enomem(context); + } + } + krb5_config_free_strings(confpath); + capath[i] = NULL; + *rpath = capath; + *npath = n; + return 0; + } + + /* The use_hierarchical flag makes hierarchical path lookup unconditional */ + if (! use_hierarchical && + ! krb5_config_get_bool_default(context, NULL, TRUE, "libdefaults", + "allow_hierarchical_capaths", NULL)) + return 0; + + /* + * When validating transit paths, local_realm == client_realm. Otherwise, + * with hierarchical referrals, they may differ, and we may be building a + * path forward from our own realm! + */ + hier_init(&hier_state, local_realm, server_realm); + if (hier_state.num == 0) + return 0; + + rp = capath = calloc(hier_state.num + 1, sizeof(*capath)); + if (capath == NULL) + return krb5_enomem(context); + while ((r = hier_next(&hier_state)) != NULL) { + if ((*rp++ = strdup(r)) == NULL) { + _krb5_free_capath(context, capath); + return krb5_enomem(context); + } + } + + *rp = NULL; + *rpath = capath; + *npath = hier_state.num; + return 0; +} + KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_check_transited(krb5_context context, krb5_const_realm client_realm, @@ -409,35 +611,36 @@ unsigned int num_realms, int *bad_realm) { - char **tr_realms; - char **p; - size_t i; - - if(num_realms == 0) - return 0; - - tr_realms = krb5_config_get_strings(context, NULL, - "capaths", - client_realm, - server_realm, - NULL); - for(i = 0; i < num_realms; i++) { - for(p = tr_realms; p && *p; p++) { - if(strcmp(*p, realms[i]) == 0) + krb5_error_code ret = 0; + char **capath = NULL; + size_t num_capath = 0; + size_t i = 0; + size_t j = 0; + + /* In transit checks hierarchical capaths are optional */ + ret = _krb5_find_capath(context, client_realm, client_realm, server_realm, + FALSE, &capath, &num_capath); + if (ret) + return ret; + + for (i = 0; i < num_realms; i++) { + for (j = 0; j < num_capath; ++j) { + if (strcmp(realms[i], capath[j]) == 0) break; } - if(p == NULL || *p == NULL) { - krb5_config_free_strings(tr_realms); + if (j == num_capath) { + _krb5_free_capath(context, capath); krb5_set_error_message (context, KRB5KRB_AP_ERR_ILL_CR_TKT, N_("no transit allowed " - "through realm %s", ""), - realms[i]); - if(bad_realm) + "through realm %s from %s to %s", ""), + realms[i], client_realm, server_realm); + if (bad_realm) *bad_realm = i; return KRB5KRB_AP_ERR_ILL_CR_TKT; } } - krb5_config_free_strings(tr_realms); + + _krb5_free_capath(context, capath); return 0; } @@ -490,4 +693,3 @@ return 0; } #endif - diff --git a/crypto/heimdal/lib/krb5/verify_init.c b/crypto/heimdal/lib/krb5/verify_init.c --- a/crypto/heimdal/lib/krb5/verify_init.c +++ b/crypto/heimdal/lib/krb5/verify_init.c @@ -55,16 +55,19 @@ fail_verify_is_ok (krb5_context context, krb5_verify_init_creds_opt *options) { - if ((options->flags & KRB5_VERIFY_INIT_CREDS_OPT_AP_REQ_NOFAIL - && options->ap_req_nofail != 0) - || krb5_config_get_bool (context, - NULL, - "libdefaults", - "verify_ap_req_nofail", - NULL)) + + if (options && (options->flags & KRB5_VERIFY_INIT_CREDS_OPT_AP_REQ_NOFAIL) + && options->ap_req_nofail != 0) + return FALSE; + + if (krb5_config_get_bool(context, + NULL, + "libdefaults", + "verify_ap_req_nofail", + NULL)) return FALSE; - else - return TRUE; + + return TRUE; } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL diff --git a/crypto/heimdal/lib/krb5/verify_krb5_conf-version.rc b/crypto/heimdal/lib/krb5/verify_krb5_conf-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/verify_krb5_conf-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_APP +#define RC_FILE_DESC_0409 "Krb5.conf Verification Tool" +#define RC_FILE_ORIG_0409 "verify_krb5_conf.exe" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/krb5/verify_krb5_conf.c b/crypto/heimdal/lib/krb5/verify_krb5_conf.c --- a/crypto/heimdal/lib/krb5/verify_krb5_conf.c +++ b/crypto/heimdal/lib/krb5/verify_krb5_conf.c @@ -163,22 +163,22 @@ /* XXX data could be a list of hosts that this code can't handle */ /* XXX copied from krbhst.c */ - if(strncmp(p, "http://", 7) == 0){ + if (strncmp(p, "http://", 7) == 0){ p += 7; hints.ai_socktype = SOCK_STREAM; strlcpy(service, "http", sizeof(service)); defport = 80; - } else if(strncmp(p, "http/", 5) == 0) { + } else if (strncmp(p, "http/", 5) == 0) { p += 5; hints.ai_socktype = SOCK_STREAM; strlcpy(service, "http", sizeof(service)); defport = 80; - }else if(strncmp(p, "tcp/", 4) == 0){ + } else if (strncmp(p, "tcp/", 4) == 0){ p += 4; hints.ai_socktype = SOCK_STREAM; strlcpy(service, "kerberos", sizeof(service)); defport = 88; - } else if(strncmp(p, "udp/", 4) == 0) { + } else if (strncmp(p, "udp/", 4) == 0) { p += 4; hints.ai_socktype = SOCK_DGRAM; strlcpy(service, "kerberos", sizeof(service)); @@ -188,14 +188,14 @@ strlcpy(service, "kerberos", sizeof(service)); defport = 88; } - if(strsep_copy(&p, ":", hostname, sizeof(hostname)) < 0) { + if (strsep_copy(&p, ":", hostname, sizeof(hostname)) < 0) { return 1; } hostname[strcspn(hostname, "/")] = '\0'; - if(p != NULL) { + if (p != NULL) { char *end; int tmp = strtol(p, &end, 0); - if(end == p) { + if (end == p) { krb5_warnx(context, "%s: failed to parse port number in %s", path, data); return 1; @@ -204,14 +204,15 @@ snprintf(service, sizeof(service), "%u", defport); } ret = getaddrinfo(hostname, service, &hints, &ai); - if(ret == EAI_SERVICE && !isdigit((unsigned char)service[0])) { + if (ret == EAI_SERVICE && !isdigit((unsigned char)service[0])) { snprintf(service, sizeof(service), "%u", defport); ret = getaddrinfo(hostname, service, &hints, &ai); } - if(ret != 0) { + if (ret != 0) { krb5_warnx(context, "%s: %s (%s)", path, gai_strerror(ret), hostname); return 1; } + freeaddrinfo(ai); return 0; } @@ -289,10 +290,13 @@ int min = 0, max = -1, n; char c; const char *p = data; +#ifdef _WIN32 + const char *q; +#endif n = sscanf(p, "%d%c%d/", &min, &c, &max); if(n == 2){ - if(c == '/') { + if(ISPATHSEP(c)) { if(min < 0){ max = -min; min = 0; @@ -302,6 +306,12 @@ } } if(n){ +#ifdef _WIN32 + q = strrchr(p, '\\'); + if (q != NULL) + p = q; + else +#endif p = strchr(p, '/'); if(p == NULL) { krb5_warnx(context, "%s: failed to parse \"%s\"", path, data); @@ -327,7 +337,7 @@ strlcpy(severity, "ERR", sizeof(severity)); if(*facility == '\0') strlcpy(facility, "AUTH", sizeof(facility)); - if(find_value(severity, syslogvals) == -1) { + if(find_value(facility, syslogvals) == -1) { krb5_warnx(context, "%s: unknown syslog facility \"%s\"", path, facility); ret++; @@ -353,227 +363,302 @@ }; struct entry all_strings[] = { - { "", krb5_config_string, NULL }, - { NULL } + { "", krb5_config_string, NULL, 0 }, + { NULL, 0, NULL, 0 } }; struct entry all_boolean[] = { - { "", krb5_config_string, check_boolean }, - { NULL } + { "", krb5_config_string, check_boolean, 0 }, + { NULL, 0, NULL, 0 } }; struct entry v4_name_convert_entries[] = { - { "host", krb5_config_list, all_strings }, - { "plain", krb5_config_list, all_strings }, - { NULL } + { "host", krb5_config_list, all_strings, 0 }, + { "plain", krb5_config_list, all_strings, 0 }, + { NULL, 0, NULL, 0 } }; struct entry libdefaults_entries[] = { - { "accept_null_addresses", krb5_config_string, check_boolean }, - { "allow_weak_crypto", krb5_config_string, check_boolean }, + { "accept_null_addresses", krb5_config_string, check_boolean, 0 }, + { "allow_weak_crypto", krb5_config_string, check_boolean, 0 }, { "capath", krb5_config_list, all_strings, 1 }, - { "check_pac", krb5_config_string, check_boolean }, - { "clockskew", krb5_config_string, check_time }, - { "date_format", krb5_config_string, NULL }, - { "default_cc_name", krb5_config_string, NULL }, - { "default_etypes", krb5_config_string, NULL }, - { "default_etypes_des", krb5_config_string, NULL }, - { "default_keytab_modify_name", krb5_config_string, NULL }, - { "default_keytab_name", krb5_config_string, NULL }, - { "default_realm", krb5_config_string, NULL }, - { "dns_canonize_hostname", krb5_config_string, check_boolean }, - { "dns_proxy", krb5_config_string, NULL }, - { "dns_lookup_kdc", krb5_config_string, check_boolean }, - { "dns_lookup_realm", krb5_config_string, check_boolean }, - { "dns_lookup_realm_labels", krb5_config_string, NULL }, - { "egd_socket", krb5_config_string, NULL }, - { "encrypt", krb5_config_string, check_boolean }, - { "extra_addresses", krb5_config_string, NULL }, - { "fcache_version", krb5_config_string, check_numeric }, - { "fcc-mit-ticketflags", krb5_config_string, check_boolean }, - { "forward", krb5_config_string, check_boolean }, - { "forwardable", krb5_config_string, check_boolean }, - { "http_proxy", krb5_config_string, check_host /* XXX */ }, - { "ignore_addresses", krb5_config_string, NULL }, - { "kdc_timeout", krb5_config_string, check_time }, - { "kdc_timesync", krb5_config_string, check_boolean }, - { "log_utc", krb5_config_string, check_boolean }, - { "maxretries", krb5_config_string, check_numeric }, - { "scan_interfaces", krb5_config_string, check_boolean }, - { "srv_lookup", krb5_config_string, check_boolean }, - { "srv_try_txt", krb5_config_string, check_boolean }, - { "ticket_lifetime", krb5_config_string, check_time }, - { "time_format", krb5_config_string, NULL }, - { "transited_realms_reject", krb5_config_string, NULL }, - { "no-addresses", krb5_config_string, check_boolean }, - { "v4_instance_resolve", krb5_config_string, check_boolean }, - { "v4_name_convert", krb5_config_list, v4_name_convert_entries }, - { "verify_ap_req_nofail", krb5_config_string, check_boolean }, - { "max_retries", krb5_config_string, check_time }, - { "renew_lifetime", krb5_config_string, check_time }, - { "proxiable", krb5_config_string, check_boolean }, - { "warn_pwexpire", krb5_config_string, check_time }, + { "ccapi_library", krb5_config_string, NULL, 0 }, + { "check_pac", krb5_config_string, check_boolean, 0 }, + { "check-rd-req-server", krb5_config_string, check_boolean, 0 }, + { "clockskew", krb5_config_string, check_time, 0 }, + { "date_format", krb5_config_string, NULL, 0 }, + { "default_as_etypes", krb5_config_string, NULL, 0 }, + { "default_cc_name", krb5_config_string, NULL, 0 }, + { "default_cc_type", krb5_config_string, NULL, 0 }, + { "default_etypes", krb5_config_string, NULL, 0 }, + { "default_etypes_des", krb5_config_string, NULL, 0 }, + { "default_keytab_modify_name", krb5_config_string, NULL, 0 }, + { "default_keytab_name", krb5_config_string, NULL, 0 }, + { "default_keytab_modify_name", krb5_config_string, NULL, 0 }, + { "default_realm", krb5_config_string, NULL, 0 }, + { "default_tgs_etypes", krb5_config_string, NULL, 0 }, + { "dns_canonize_hostname", krb5_config_string, check_boolean, 0 }, + { "dns_proxy", krb5_config_string, NULL, 0 }, + { "dns_lookup_kdc", krb5_config_string, check_boolean, 0 }, + { "dns_lookup_realm", krb5_config_string, check_boolean, 0 }, + { "dns_lookup_realm_labels", krb5_config_string, NULL, 0 }, + { "egd_socket", krb5_config_string, NULL, 0 }, + { "encrypt", krb5_config_string, check_boolean, 0 }, + { "extra_addresses", krb5_config_string, NULL, 0 }, + { "fcache_version", krb5_config_string, check_numeric, 0 }, + { "fcache_strict_checking", krb5_config_string, check_boolean, 0 }, + { "fcc-mit-ticketflags", krb5_config_string, check_boolean, 0 }, + { "forward", krb5_config_string, check_boolean, 0 }, + { "forwardable", krb5_config_string, check_boolean, 0 }, + { "allow_hierarchical_capaths", krb5_config_string, check_boolean, 0 }, + { "host_timeout", krb5_config_string, check_time, 0 }, + { "http_proxy", krb5_config_string, check_host /* XXX */, 0 }, + { "ignore_addresses", krb5_config_string, NULL, 0 }, + { "k5login_authoritative", krb5_config_string, check_boolean, 0 }, + { "k5login_directory", krb5_config_string, NULL, 0 }, + { "kdc_timeout", krb5_config_string, check_time, 0 }, + { "kdc_timesync", krb5_config_string, check_boolean, 0 }, + { "kuserok", krb5_config_string, NULL, 0 }, + { "large_message_size", krb5_config_string, check_numeric, 0 }, + { "log_utc", krb5_config_string, check_boolean, 0 }, + { "max_retries", krb5_config_string, check_numeric, 0 }, + { "maximum_message_size", krb5_config_string, check_numeric, 0 }, + { "moduli", krb5_config_string, NULL, 0 }, + { "name_canon_rules", krb5_config_string, NULL, 0 }, + { "no-addresses", krb5_config_string, check_boolean, 0 }, + { "pkinit_dh_min_bits", krb5_config_string, NULL, 0 }, + { "proxiable", krb5_config_string, check_boolean, 0 }, + { "renew_lifetime", krb5_config_string, check_time, 0 }, + { "scan_interfaces", krb5_config_string, check_boolean, 0 }, + { "srv_lookup", krb5_config_string, check_boolean, 0 }, + { "srv_try_txt", krb5_config_string, check_boolean, 0 }, + { "ticket_lifetime", krb5_config_string, check_time, 0 }, + { "time_format", krb5_config_string, NULL, 0 }, + { "transited_realms_reject", krb5_config_string, NULL, 0 }, + { "use_fallback", krb5_config_string, check_boolean, 0 }, + { "v4_instance_resolve", krb5_config_string, check_boolean, 0 }, + { "v4_name_convert", krb5_config_list, v4_name_convert_entries, 0 }, + { "verify_ap_req_nofail", krb5_config_string, check_boolean, 0 }, + { "warn_pwexpire", krb5_config_string, check_time, 0 }, + /* MIT stuff */ - { "permitted_enctypes", krb5_config_string, mit_entry }, - { "default_tgs_enctypes", krb5_config_string, mit_entry }, - { "default_tkt_enctypes", krb5_config_string, mit_entry }, - { NULL } + { "permitted_enctypes", krb5_config_string, mit_entry, 0 }, + { "default_tgs_enctypes", krb5_config_string, mit_entry, 0 }, + { "default_tkt_enctypes", krb5_config_string, mit_entry, 0 }, + { NULL, 0, NULL, 0 } }; struct entry appdefaults_entries[] = { - { "afslog", krb5_config_string, check_boolean }, - { "afs-use-524", krb5_config_string, check_524 }, - { "encrypt", krb5_config_string, check_boolean }, - { "forward", krb5_config_string, check_boolean }, - { "forwardable", krb5_config_string, check_boolean }, - { "proxiable", krb5_config_string, check_boolean }, - { "ticket_lifetime", krb5_config_string, check_time }, - { "renew_lifetime", krb5_config_string, check_time }, - { "no-addresses", krb5_config_string, check_boolean }, - { "krb4_get_tickets", krb5_config_string, check_boolean }, - { "pkinit_anchors", krb5_config_string, NULL }, - { "pkinit_win2k", krb5_config_string, NULL }, - { "pkinit_win2k_require_binding", krb5_config_string, NULL }, - { "pkinit_require_eku", krb5_config_string, NULL }, - { "pkinit_require_krbtgt_otherName", krb5_config_string, NULL }, - { "pkinit_require_hostname_match", krb5_config_string, NULL }, + { "afslog", krb5_config_string, check_boolean, 0 }, + { "afs-use-524", krb5_config_string, check_524, 0 }, #if 0 - { "anonymous", krb5_config_string, check_boolean }, + { "anonymous", krb5_config_string, check_boolean, 0 }, #endif - { "", krb5_config_list, appdefaults_entries }, - { NULL } + { "encrypt", krb5_config_string, check_boolean, 0 }, + { "forward", krb5_config_string, check_boolean, 0 }, + { "forwardable", krb5_config_string, check_boolean, 0 }, + { "krb4_get_tickets", krb5_config_string, check_boolean, 0 }, + { "proxiable", krb5_config_string, check_boolean, 0 }, + { "renew_lifetime", krb5_config_string, check_time, 0 }, + { "no-addresses", krb5_config_string, check_boolean, 0 }, + { "pkinit_anchors", krb5_config_string, NULL, 0 }, + { "pkinit_pool", krb5_config_string, NULL, 0 }, + { "pkinit_require_eku", krb5_config_string, NULL, 0 }, + { "pkinit_require_hostname_match", krb5_config_string, NULL, 0 }, + { "pkinit_require_krbtgt_otherName", krb5_config_string, NULL, 0 }, + { "pkinit_revoke", krb5_config_string, NULL, 0 }, + { "pkinit_trustedCertifiers", krb5_config_string, check_boolean, 0 }, + { "pkinit_win2k", krb5_config_string, NULL, 0 }, + { "pkinit_win2k_require_binding", krb5_config_string, NULL, 0 }, + { "ticket_lifetime", krb5_config_string, check_time, 0 }, + { "", krb5_config_list, appdefaults_entries, 0 }, + { NULL, 0, NULL, 0 } }; struct entry realms_entries[] = { - { "forwardable", krb5_config_string, check_boolean }, - { "proxiable", krb5_config_string, check_boolean }, - { "ticket_lifetime", krb5_config_string, check_time }, - { "renew_lifetime", krb5_config_string, check_time }, - { "warn_pwexpire", krb5_config_string, check_time }, - { "kdc", krb5_config_string, check_host }, - { "admin_server", krb5_config_string, check_host }, - { "kpasswd_server", krb5_config_string, check_host }, - { "krb524_server", krb5_config_string, check_host }, - { "v4_name_convert", krb5_config_list, v4_name_convert_entries }, - { "v4_instance_convert", krb5_config_list, all_strings }, - { "v4_domains", krb5_config_string, NULL }, - { "default_domain", krb5_config_string, NULL }, - { "win2k_pkinit", krb5_config_string, NULL }, + { "admin_server", krb5_config_string, check_host, 0 }, + { "auth_to_local", krb5_config_string, NULL, 0 }, + { "auth_to_local_names", krb5_config_string, NULL, 0 }, + { "default_domain", krb5_config_string, NULL, 0 }, + { "forwardable", krb5_config_string, check_boolean, 0 }, + { "allow_hierarchical_capaths", krb5_config_string, check_boolean, 0 }, + { "kdc", krb5_config_string, check_host, 0 }, + { "kpasswd_server", krb5_config_string, check_host, 0 }, + { "krb524_server", krb5_config_string, check_host, 0 }, + { "kx509_ca", krb5_config_string, NULL, 0 }, + { "kx509_include_pkinit_san", krb5_config_string, check_boolean, 0 }, + { "name_canon_rules", krb5_config_string, NULL, 0 }, + { "no-addresses", krb5_config_string, check_boolean, 0 }, + { "pkinit_anchors", krb5_config_string, NULL, 0 }, + { "pkinit_require_eku", krb5_config_string, NULL, 0 }, + { "pkinit_require_hostname_match", krb5_config_string, NULL, 0 }, + { "pkinit_require_krbtgt_otherName", krb5_config_string, NULL, 0 }, + { "pkinit_trustedCertifiers", krb5_config_string, check_boolean, 0 }, + { "pkinit_win2k", krb5_config_string, NULL, 0 }, + { "pkinit_win2k_require_binding", krb5_config_string, NULL, 0 }, + { "proxiable", krb5_config_string, check_boolean, 0 }, + { "renew_lifetime", krb5_config_string, check_time, 0 }, + { "require_initial_kca_tickets", krb5_config_string, check_boolean, 0 }, + { "ticket_lifetime", krb5_config_string, check_time, 0 }, + { "v4_domains", krb5_config_string, NULL, 0 }, + { "v4_instance_convert", krb5_config_list, all_strings, 0 }, + { "v4_name_convert", krb5_config_list, v4_name_convert_entries, 0 }, + { "warn_pwexpire", krb5_config_string, check_time, 0 }, + { "win2k_pkinit", krb5_config_string, NULL, 0 }, + /* MIT stuff */ - { "admin_keytab", krb5_config_string, mit_entry }, - { "acl_file", krb5_config_string, mit_entry }, - { "dict_file", krb5_config_string, mit_entry }, - { "kadmind_port", krb5_config_string, mit_entry }, - { "kpasswd_port", krb5_config_string, mit_entry }, - { "master_key_name", krb5_config_string, mit_entry }, - { "master_key_type", krb5_config_string, mit_entry }, - { "key_stash_file", krb5_config_string, mit_entry }, - { "max_life", krb5_config_string, mit_entry }, - { "max_renewable_life", krb5_config_string, mit_entry }, - { "default_principal_expiration", krb5_config_string, mit_entry }, - { "default_principal_flags", krb5_config_string, mit_entry }, - { "supported_enctypes", krb5_config_string, mit_entry }, - { "database_name", krb5_config_string, mit_entry }, - { NULL } + { "admin_keytab", krb5_config_string, mit_entry, 0 }, + { "acl_file", krb5_config_string, mit_entry, 0 }, + { "database_name", krb5_config_string, mit_entry, 0 }, + { "default_principal_expiration", krb5_config_string, mit_entry, 0 }, + { "default_principal_flags", krb5_config_string, mit_entry, 0 }, + { "dict_file", krb5_config_string, mit_entry, 0 }, + { "kadmind_port", krb5_config_string, mit_entry, 0 }, + { "kpasswd_port", krb5_config_string, mit_entry, 0 }, + { "master_kdc", krb5_config_string, mit_entry, 0 }, + { "master_key_name", krb5_config_string, mit_entry, 0 }, + { "master_key_type", krb5_config_string, mit_entry, 0 }, + { "key_stash_file", krb5_config_string, mit_entry, 0 }, + { "max_life", krb5_config_string, mit_entry, 0 }, + { "max_renewable_life", krb5_config_string, mit_entry, 0 }, + { "supported_enctypes", krb5_config_string, mit_entry, 0 }, + { NULL, 0, NULL, 0 } }; struct entry realms_foobar[] = { - { "", krb5_config_list, realms_entries }, - { NULL } + { "", krb5_config_list, realms_entries, 0 }, + { NULL, 0, NULL, 0 } }; struct entry kdc_database_entries[] = { - { "realm", krb5_config_string, NULL }, - { "dbname", krb5_config_string, NULL }, - { "mkey_file", krb5_config_string, NULL }, - { "acl_file", krb5_config_string, NULL }, - { "log_file", krb5_config_string, NULL }, - { NULL } + { "acl_file", krb5_config_string, NULL, 0 }, + { "dbname", krb5_config_string, NULL, 0 }, + { "log_file", krb5_config_string, NULL, 0 }, + { "mkey_file", krb5_config_string, NULL, 0 }, + { "realm", krb5_config_string, NULL, 0 }, + { NULL, 0, NULL, 0 } }; struct entry kdc_entries[] = { - { "database", krb5_config_list, kdc_database_entries }, - { "key-file", krb5_config_string, NULL }, - { "logging", krb5_config_string, check_log }, - { "max-request", krb5_config_string, check_bytes }, - { "require-preauth", krb5_config_string, check_boolean }, - { "ports", krb5_config_string, NULL }, - { "addresses", krb5_config_string, NULL }, - { "enable-kerberos4", krb5_config_string, check_boolean }, - { "enable-524", krb5_config_string, check_boolean }, - { "enable-http", krb5_config_string, check_boolean }, - { "check-ticket-addresses", krb5_config_string, check_boolean }, - { "allow-null-ticket-addresses", krb5_config_string, check_boolean }, - { "allow-anonymous", krb5_config_string, check_boolean }, - { "v4_realm", krb5_config_string, NULL }, + { "addresses", krb5_config_string, NULL, 0 }, + { "allow-anonymous", krb5_config_string, check_boolean, 0 }, + { "allow-null-ticket-addresses", krb5_config_string, check_boolean, 0 }, + { "check-ticket-addresses", krb5_config_string, check_boolean, 0 }, + { "database", krb5_config_list, kdc_database_entries, 0 }, + { "detach", krb5_config_string, check_boolean, 0 }, + { "digests_allowed", krb5_config_string, NULL, 0 }, + { "disable-des", krb5_config_string, check_boolean, 0 }, + { "enable-524", krb5_config_string, check_boolean, 0 }, + { "enable-digest", krb5_config_string, check_boolean, 0 }, { "enable-kaserver", krb5_config_string, check_boolean, 1 }, - { "encode_as_rep_as_tgs_rep", krb5_config_string, check_boolean }, - { "kdc_warn_pwexpire", krb5_config_string, check_time }, - { "use_2b", krb5_config_list, NULL }, - { "enable-pkinit", krb5_config_string, check_boolean }, - { "pkinit_identity", krb5_config_string, NULL }, - { "pkinit_anchors", krb5_config_string, NULL }, - { "pkinit_pool", krb5_config_string, NULL }, - { "pkinit_revoke", krb5_config_string, NULL }, - { "pkinit_kdc_ocsp", krb5_config_string, NULL }, - { "pkinit_principal_in_certificate", krb5_config_string, NULL }, - { "pkinit_dh_min_bits", krb5_config_string, NULL }, - { "pkinit_allow_proxy_certificate", krb5_config_string, NULL }, - { "hdb-ldap-create-base", krb5_config_string, NULL }, - { "v4-realm", krb5_config_string, NULL }, - { NULL } + { "enable-kerberos4", krb5_config_string, check_boolean, 1 }, + { "enable-kx509", krb5_config_string, check_boolean, 0 }, + { "enable-http", krb5_config_string, check_boolean, 0 }, + { "enable-pkinit", krb5_config_string, check_boolean, 0 }, + { "encode_as_rep_as_tgs_rep", krb5_config_string, check_boolean, 0 }, + { "enforce-transited-policy", krb5_config_string, NULL, 1 }, + { "hdb-ldap-create-base", krb5_config_string, NULL, 0 }, + { "iprop-acl", krb5_config_string, NULL, 0 }, + { "iprop-stats", krb5_config_string, NULL, 0 }, + { "kdc-request-log", krb5_config_string, NULL, 0 }, + { "kdc_warn_pwexpire", krb5_config_string, check_time, 0 }, + { "key-file", krb5_config_string, NULL, 0 }, + { "kx509_ca", krb5_config_string, NULL, 0 }, + { "kx509_include_pkinit_san", krb5_config_string, check_boolean, 0 }, + { "kx509_template", krb5_config_string, NULL, 0 }, + { "logging", krb5_config_string, check_log, 0 }, + { "max-kdc-datagram-reply-length", krb5_config_string, check_bytes, 0 }, + { "max-request", krb5_config_string, check_bytes, 0 }, + { "pkinit_allow_proxy_certificate", krb5_config_string, check_boolean, 0 }, + { "pkinit_anchors", krb5_config_string, NULL, 0 }, + { "pkinit_dh_min_bits", krb5_config_string, check_numeric, 0 }, + { "pkinit_identity", krb5_config_string, NULL, 0 }, + { "pkinit_kdc_friendly_name", krb5_config_string, NULL, 0 }, + { "pkinit_kdc_ocsp", krb5_config_string, NULL, 0 }, + { "pkinit_mappings_file", krb5_config_string, NULL, 0 }, + { "pkinit_pool", krb5_config_string, NULL, 0 }, + { "pkinit_principal_in_certificate", krb5_config_string, check_boolean, 0 }, + { "pkinit_revoke", krb5_config_string, NULL, 0 }, + { "pkinit_win2k_require_binding", krb5_config_string, check_boolean, 0 }, + { "ports", krb5_config_string, NULL, 0 }, + { "preauth-use-strongest-session-key", krb5_config_string, check_boolean, 0 }, + { "require_initial_kca_tickets", krb5_config_string, check_boolean, 0 }, + { "require-preauth", krb5_config_string, check_boolean, 0 }, + { "svc-use-strongest-session-key", krb5_config_string, check_boolean, 0 }, + { "tgt-use-strongest-session-key", krb5_config_string, check_boolean, 0 }, + { "transited-policy", krb5_config_string, NULL, 0 }, + { "use_2b", krb5_config_list, NULL, 0 }, + { "use-strongest-server-key", krb5_config_string, check_boolean, 0 }, + { "v4_realm", krb5_config_string, NULL, 0 }, + { NULL, 0, NULL, 0 } }; struct entry kadmin_entries[] = { - { "password_lifetime", krb5_config_string, check_time }, - { "default_keys", krb5_config_string, NULL }, - { "use_v4_salt", krb5_config_string, NULL }, - { "require-preauth", krb5_config_string, check_boolean }, - { NULL } + { "allow_self_change_password", krb5_config_string, check_boolean, 0 }, + { "default_keys", krb5_config_string, NULL, 0 }, + { "password_lifetime", krb5_config_string, check_time, 0 }, + { "require-preauth", krb5_config_string, check_boolean, 0 }, + { "save-password", krb5_config_string, check_boolean, 0 }, + { "use_v4_salt", krb5_config_string, NULL, 0 }, + { NULL, 0, NULL, 0 } }; struct entry log_strings[] = { - { "", krb5_config_string, check_log }, - { NULL } + { "", krb5_config_string, check_log, 0 }, + { NULL, 0, NULL, 0 } }; /* MIT stuff */ struct entry kdcdefaults_entries[] = { - { "kdc_ports", krb5_config_string, mit_entry }, - { "v4_mode", krb5_config_string, mit_entry }, - { NULL } + { "kdc_ports", krb5_config_string, mit_entry, 0 }, + { "v4_mode", krb5_config_string, mit_entry, 0 }, + { NULL, 0, NULL, 0 } }; struct entry capaths_entries[] = { - { "", krb5_config_list, all_strings }, - { NULL } + { "", krb5_config_list, all_strings, 0 }, + { NULL, 0, NULL, 0 } +}; + +struct entry kcm_entries[] = { + { "detach", krb5_config_string, check_boolean, 0 }, + { "disallow-getting-krbtgt", krb5_config_string, check_boolean, 0 }, + { "logging", krb5_config_string, NULL, 0 }, + { "max-request", krb5_config_string, NULL, 0 }, + { "system_ccache", krb5_config_string, NULL, 0 }, + { NULL, 0, NULL, 0 } }; struct entry password_quality_entries[] = { - { "policies", krb5_config_string, NULL }, - { "external_program", krb5_config_string, NULL }, - { "min_classes", krb5_config_string, check_numeric }, - { "min_length", krb5_config_string, check_numeric }, - { "", krb5_config_list, all_strings }, - { NULL } + { "check_function", krb5_config_string, NULL, 0 }, + { "check_library", krb5_config_string, NULL, 0 }, + { "external_program", krb5_config_string, NULL, 0 }, + { "min_classes", krb5_config_string, check_numeric, 0 }, + { "min_length", krb5_config_string, check_numeric, 0 }, + { "policies", krb5_config_string, NULL, 0 }, + { "policy_libraries", krb5_config_string, NULL, 0 }, + { "", krb5_config_list, all_strings, 0 }, + { NULL, 0, NULL, 0 } }; struct entry toplevel_sections[] = { - { "libdefaults" , krb5_config_list, libdefaults_entries }, - { "realms", krb5_config_list, realms_foobar }, - { "domain_realm", krb5_config_list, all_strings }, - { "logging", krb5_config_list, log_strings }, - { "kdc", krb5_config_list, kdc_entries }, - { "kadmin", krb5_config_list, kadmin_entries }, - { "appdefaults", krb5_config_list, appdefaults_entries }, - { "gssapi", krb5_config_list, NULL }, - { "capaths", krb5_config_list, capaths_entries }, - { "password_quality", krb5_config_list, password_quality_entries }, + { "appdefaults", krb5_config_list, appdefaults_entries, 0 }, + { "capaths", krb5_config_list, capaths_entries, 0 }, + { "domain_realm", krb5_config_list, all_strings, 0 }, + { "gssapi", krb5_config_list, NULL, 0 }, + { "kadmin", krb5_config_list, kadmin_entries, 0 }, + { "kcm", krb5_config_list, kcm_entries, 0 }, + { "kdc", krb5_config_list, kdc_entries, 0 }, + { "libdefaults" , krb5_config_list, libdefaults_entries, 0 }, + { "logging", krb5_config_list, log_strings, 0 }, + { "password_quality", krb5_config_list, password_quality_entries, 0 }, + { "realms", krb5_config_list, realms_foobar, 0 }, + /* MIT stuff */ - { "kdcdefaults", krb5_config_list, kdcdefaults_entries }, - { NULL } + { "kdcdefaults", krb5_config_list, kdcdefaults_entries, 0 }, + { NULL, 0, NULL, 0 } }; diff --git a/crypto/heimdal/lib/krb5/verify_krb5_conf.cat8 b/crypto/heimdal/lib/krb5/verify_krb5_conf.cat8 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/krb5/verify_krb5_conf.cat8 @@ -0,0 +1,56 @@ +VERIFY_KRB5_CONF(8) BSD System Manager's Manual VERIFY_KRB5_CONF(8) + +NAME + verify_krb5_conf -- checks krb5.conf for obvious errors + +SYNOPSIS + verify_krb5_conf [config-file] + +DESCRIPTION + verify_krb5_conf reads the configuration file krb5.conf, or the file + given on the command line, parses it, checking verifying that the syntax + is not correctly wrong. + + If the file is syntactically correct, verify_krb5_conf tries to verify + that the contents of the file is of relevant nature. + +ENVIRONMENT + KRB5_CONFIG points to the configuration file to read. + +FILES + /etc/krb5.conf Kerberos 5 configuration file + +DIAGNOSTICS + Possible output from verify_krb5_conf include: + + : failed to parse as size/time/number/boolean + Usually means that is misspelled, or that it contains + weird characters. The parsing done by verify_krb5_conf is more + strict than the one performed by libkrb5, so strings that work in + real life might be reported as bad. + + : host not found () + Means that is supposed to point to a host, but it can't be + recognised as one. + + : unknown or wrong type + Means that is either a string when it should be a list, + vice versa, or just that verify_krb5_conf is confused. + + : unknown entry + Means that is not known by verify_krb5_conf. + +SEE ALSO + krb5.conf(5) + +BUGS + Since each application can put almost anything in the config file, it's + hard to come up with a watertight verification process. Most of the de- + fault settings are sanity checked, but this does not mean that every + problem is discovered, or that everything that is reported as a possible + problem actually is one. This tool should thus be used with some care. + + It should warn about obsolete data, or bad practice, but currently + doesn't. + +HEIMDAL December 8, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/krb5/verify_user.c b/crypto/heimdal/lib/krb5/verify_user.c --- a/crypto/heimdal/lib/krb5/verify_user.c +++ b/crypto/heimdal/lib/krb5/verify_user.c @@ -100,11 +100,8 @@ krb5_verify_opt_alloc(krb5_context context, krb5_verify_opt **opt) { *opt = calloc(1, sizeof(**opt)); - if ((*opt) == NULL) { - krb5_set_error_message(context, ENOMEM, - N_("malloc: out of memory", "")); - return ENOMEM; - } + if ((*opt) == NULL) + return krb5_enomem(context); krb5_verify_opt_init(*opt); return 0; } diff --git a/crypto/heimdal/lib/krb5/version-script.map b/crypto/heimdal/lib/krb5/version-script.map --- a/crypto/heimdal/lib/krb5/version-script.map +++ b/crypto/heimdal/lib/krb5/version-script.map @@ -2,10 +2,6 @@ global: krb524_convert_creds_kdc; krb524_convert_creds_kdc_ccache; - krb5_425_conv_principal; - krb5_425_conv_principal_ext2; - krb5_425_conv_principal_ext; - krb5_524_conv_principal; krb5_abort; krb5_abortx; krb5_acl_match_file; @@ -42,6 +38,7 @@ krb5_auth_con_getrcache; krb5_auth_con_getremoteseqnumber; krb5_auth_con_getremotesubkey; + krb5_auth_con_getsendsubkey; krb5_auth_con_init; krb5_auth_con_removeflags; krb5_auth_con_setaddrs; @@ -349,6 +346,7 @@ krb5_get_init_creds_opt_set_address_list; krb5_get_init_creds_opt_set_addressless; krb5_get_init_creds_opt_set_anonymous; + krb5_get_init_creds_opt_set_change_password_prompt; krb5_get_init_creds_opt_set_canonicalize; krb5_get_init_creds_opt_set_default_flags; krb5_get_init_creds_opt_set_etype_list; @@ -387,6 +385,7 @@ krb5_init_ets; krb5_initlog; krb5_is_config_principal; + krb5_is_enctype_weak; krb5_is_thread_safe; krb5_kcm_call; krb5_kcm_storage_request; @@ -435,6 +434,7 @@ krb5_make_principal; krb5_max_sockaddr_size; krb5_mk_error; + krb5_mk_error_ext; krb5_mk_priv; krb5_mk_rep; krb5_mk_req; @@ -446,7 +446,7 @@ krb5_net_write_block; krb5_ntlm_alloc; krb5_ntlm_free; - krb5_ntlm_init_get_challange; + krb5_ntlm_init_get_challenge; krb5_ntlm_init_get_flags; krb5_ntlm_init_get_opaque; krb5_ntlm_init_get_targetinfo; @@ -491,8 +491,10 @@ krb5_principal_get_realm; krb5_principal_get_type; krb5_principal_match; + krb5_principal_set_comp_string; krb5_principal_set_realm; krb5_principal_set_type; + krb5_principal_is_anonymous; krb5_principal_is_krbtgt; krb5_print_address; krb5_program_setup; @@ -545,6 +547,7 @@ krb5_ret_data; krb5_ret_int16; krb5_ret_int32; + krb5_ret_int64; krb5_ret_int8; krb5_ret_keyblock; krb5_ret_principal; @@ -554,6 +557,7 @@ krb5_ret_times; krb5_ret_uint16; krb5_ret_uint32; + krb5_ret_uint64; krb5_ret_uint8; krb5_salttype_to_string; krb5_sendauth; @@ -568,6 +572,7 @@ krb5_sendto_kdc; krb5_sendto_kdc_flags; krb5_set_config_files; + krb5_set_debug_dest; krb5_set_default_in_tkt_etypes; krb5_set_default_realm; krb5_set_dns_canonicalize_hostname; @@ -598,6 +603,8 @@ krb5_storage_from_fd; krb5_storage_from_mem; krb5_storage_from_readonly_mem; + krb5_storage_from_socket; + krb5_storage_fsync; krb5_storage_get_byteorder; krb5_storage_get_eof_code; krb5_storage_is_flags; @@ -618,6 +625,7 @@ krb5_store_data; krb5_store_int16; krb5_store_int32; + krb5_store_int64; krb5_store_int8; krb5_store_keyblock; krb5_store_principal; @@ -627,6 +635,7 @@ krb5_store_times; krb5_store_uint16; krb5_store_uint32; + krb5_store_uint64; krb5_store_uint8; krb5_string_to_deltat; krb5_string_to_enctype; @@ -702,6 +711,7 @@ initialize_k524_error_table; # variables + krb5_dcc_ops; krb5_mcc_ops; krb5_acc_ops; krb5_fcc_ops; @@ -716,36 +726,29 @@ krb5_config_file; krb5_defkeyname; krb5_cc_type_api; + krb5_cc_type_dcc; krb5_cc_type_file; krb5_cc_type_memory; krb5_cc_type_kcm; krb5_cc_type_scc; + # shared with HDB + _krb5_plugin_run_f; + _krb5_enctype_requires_random_salt; + # Shared with GSSAPI krb5 _krb5_crc_init_table; _krb5_crc_update; _krb5_get_krbtgt; _krb5_build_authenticator; - # V4 compat glue - _krb5_krb_tf_setup; - _krb5_krb_dest_tkt; - _krb5_krb_life_to_time; - _krb5_krb_decomp_ticket; - _krb5_krb_decomp_ticket; - _krb5_krb_create_ticket; - _krb5_krb_create_ciph; - _krb5_krb_create_auth_reply; - _krb5_krb_rd_req; - _krb5_krb_free_auth_data; - _krb5_krb_time_to_life; - _krb5_krb_cr_err_reply; - # Shared with libkdc - _krb5_AES_string_to_default_iterator; + _krb5_AES_SHA1_string_to_default_iterator; + _krb5_AES_SHA2_string_to_default_iterator; _krb5_dh_group_ok; _krb5_get_host_realm_int; _krb5_get_int; + _krb5_get_int64; _krb5_pac_sign; _krb5_parse_moduli; _krb5_pk_kdf; @@ -754,21 +757,42 @@ _krb5_pk_octetstring2key; _krb5_plugin_find; _krb5_plugin_free; - _krb5_plugin_get_next; - _krb5_plugin_get_symbol; + _krb5_plugin_run_f; _krb5_principal2principalname; _krb5_principalname2krb5_principal; _krb5_put_int; _krb5_s4u2self_to_checksumdata; + _krb5_HMAC_MD5_checksum; # kinit helper krb5_get_init_creds_opt_set_pkinit_user_certs; krb5_pk_enterprise_cert; + krb5_process_last_request; + krb5_init_creds_init; + krb5_init_creds_set_service; + krb5_init_creds_set_fast_ccache; + krb5_init_creds_set_keytab; + krb5_init_creds_get; + krb5_init_creds_get_creds; + krb5_init_creds_get_error; + krb5_init_creds_set_password; + krb5_init_creds_store; + krb5_init_creds_free; # testing _krb5_aes_cts_encrypt; _krb5_n_fold; _krb5_expand_default_cc_name; + _krb5_expand_path_tokensv; + + # FAST + _krb5_fast_cf2; + _krb5_fast_armor_key; + + # TGS + _krb5_find_capath; + _krb5_free_capath; + local: *; }; diff --git a/crypto/heimdal/lib/krb5/warn.c b/crypto/heimdal/lib/krb5/warn.c --- a/crypto/heimdal/lib/krb5/warn.c +++ b/crypto/heimdal/lib/krb5/warn.c @@ -36,7 +36,7 @@ static krb5_error_code _warnerr(krb5_context context, int do_errtext, krb5_error_code code, int level, const char *fmt, va_list ap) - __attribute__((__format__(__printf__, 5, 0))); + __attribute__ ((__format__ (__printf__, 5, 0))); static krb5_error_code _warnerr(krb5_context context, int do_errtext, @@ -86,6 +86,12 @@ ret = _warnerr(context, ETEXT, CODE, LEVEL, fmt, ap); \ va_end(ap); +#define FUNC_NORET(ETEXT, CODE, LEVEL) \ + va_list ap; \ + va_start(ap, fmt); \ + (void) _warnerr(context, ETEXT, CODE, LEVEL, fmt, ap); \ + va_end(ap); + #undef __attribute__ #define __attribute__(X) @@ -104,7 +110,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarn(krb5_context context, krb5_error_code code, const char *fmt, va_list ap) - __attribute__ ((format (printf, 3, 0))) + __attribute__ ((__format__ (__printf__, 3, 0))) { return _warnerr(context, 1, code, 1, fmt, ap); } @@ -122,7 +128,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warn(krb5_context context, krb5_error_code code, const char *fmt, ...) - __attribute__ ((format (printf, 3, 4))) + __attribute__ ((__format__ (__printf__, 3, 4))) { FUNC(1, code, 1); return ret; @@ -140,7 +146,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vwarnx(krb5_context context, const char *fmt, va_list ap) - __attribute__ ((format (printf, 2, 0))) + __attribute__ ((__format__ (__printf__, 2, 0))) { return _warnerr(context, 0, 0, 1, fmt, ap); } @@ -156,7 +162,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_warnx(krb5_context context, const char *fmt, ...) - __attribute__ ((format (printf, 2, 3))) + __attribute__ ((__format__ (__printf__, 2, 3))) { FUNC(0, 0, 1); return ret; @@ -178,7 +184,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verr(krb5_context context, int eval, krb5_error_code code, const char *fmt, va_list ap) - __attribute__ ((noreturn, format (printf, 4, 0))) + __attribute__ ((__noreturn__, __format__ (__printf__, 4, 0))) { _warnerr(context, 1, code, 0, fmt, ap); exit(eval); @@ -200,9 +206,9 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_err(krb5_context context, int eval, krb5_error_code code, const char *fmt, ...) - __attribute__ ((noreturn, format (printf, 4, 5))) + __attribute__ ((__noreturn__, __format__ (__printf__, 4, 5))) { - FUNC(1, code, 0); + FUNC_NORET(1, code, 0); exit(eval); UNREACHABLE(return 0); } @@ -220,7 +226,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_verrx(krb5_context context, int eval, const char *fmt, va_list ap) - __attribute__ ((noreturn, format (printf, 3, 0))) + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 0))) { _warnerr(context, 0, 0, 0, fmt, ap); exit(eval); @@ -239,9 +245,9 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_errx(krb5_context context, int eval, const char *fmt, ...) - __attribute__ ((noreturn, format (printf, 3, 4))) + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 4))) { - FUNC(0, 0, 0); + FUNC_NORET(0, 0, 0); exit(eval); UNREACHABLE(return 0); } @@ -261,7 +267,7 @@ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vabort(krb5_context context, krb5_error_code code, const char *fmt, va_list ap) - __attribute__ ((noreturn, format (printf, 3, 0))) + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 0))) { _warnerr(context, 1, code, 0, fmt, ap); abort(); @@ -275,22 +281,23 @@ * @param context A Kerberos 5 context * @param code error code of the last error * @param fmt message to print + * @param ... arguments for format string * * @ingroup krb5_error */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abort(krb5_context context, krb5_error_code code, const char *fmt, ...) - __attribute__ ((noreturn, format (printf, 3, 4))) + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 4))) { - FUNC(1, code, 0); + FUNC_NORET(1, code, 0); abort(); UNREACHABLE(return 0); } KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_vabortx(krb5_context context, const char *fmt, va_list ap) - __attribute__ ((noreturn, format (printf, 2, 0))) + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 0))) { _warnerr(context, 0, 0, 0, fmt, ap); abort(); @@ -301,17 +308,17 @@ * Log a warning to the log, default stderr, and then abort. * * @param context A Kerberos 5 context - * @param code error code of the last error - * @param fmt message to print + * @param fmt printf format string of message to print + * @param ... arguments for format string * * @ingroup krb5_error */ KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL krb5_abortx(krb5_context context, const char *fmt, ...) - __attribute__ ((noreturn, format (printf, 2, 3))) + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3))) { - FUNC(0, 0, 0); + FUNC_NORET(0, 0, 0); abort(); UNREACHABLE(return 0); } diff --git a/crypto/heimdal/lib/libedit/COPYING b/crypto/heimdal/lib/libedit/COPYING new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/COPYING @@ -0,0 +1,30 @@ +Copyright (c) 1992, 1993 + The Regents of the University of California. All rights reserved. + +This code is derived from software contributed to Berkeley by +Christos Zoulas of Cornell University. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + diff --git a/crypto/heimdal/lib/libedit/ChangeLog b/crypto/heimdal/lib/libedit/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/ChangeLog @@ -0,0 +1,300 @@ + * See also NetBSD changelog: + http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libedit + +2011-02-27 Jess Thrysoee + + * version-info: 0:36:0 + + * all: sync with upstream source. + +2010-04-24 Jess Thrysoee + + * version-info: 0:35:0 + + * all: sync with upstream source. + Now with UTF-8 support. To enable this run 'configure --enable-widec'. + For now an UTF-32 encoded wchar_t is required. + This requirement is met on NetBSD, Solaris and OS X for any UTF-8 locale, + and any system that define __STDC_ISO_10646__ (e.g. GNU libc on Linux). + +2009-09-23 Jess Thrysoee + * version-info: 0:34:0 + + * all: apply Apple patches from: + http://opensource.apple.com/source/libedit/libedit-11/patches + +2009-09-05 Jess Thrysoee + + * version-info: 0:33:0 + + * all: Use predefined macro __sun to identify Solaris + + * src/el.c: Ignore comment lines in .editrc + +2009-07-23 Jess Thrysoee + + * version-info: 0:32:0 + + * all: sync with upstream source. + +2009-06-10 Jess Thrysoee + + * version-info: 0:31:0 + + * all: sync with upstream source. + +2009-05-03 Jess Thrysoee + + * version-info: 0:30:0 + + * all: sync with upstream source. + +2009-04-05 Jess Thrysoee + + * version-info: 0:29:0 + + * all: sync with upstream source. + +2009-01-11 Jess Thrysoee + + * version-info: 0:28:0 + + * all: sync with upstream source. MAJOR.MINOR version is now 3.0. + This is due to NetBSD changing time_t and dev_t to 64 bits. It does + not really effect this package. + + * configure.ac: Remove '--enable-debug' configure flag. The autoconf way + to control flags is by specifying them when running configure, + e.g. 'CFLAGS="-O0 -g" ./configure' + +2008-07-12 Jess Thrysoee + + * version-info: 0:27:0 + + * configure.ac: Added '--enable-debug' configure flag, to produce debugging + information. + + * examples/fileman.c: cast stat struct members, st_nlink and st_size, + appropriately (see also 'man 2 stat'). Patch by Alex Elder. + + * all: sync with upstream source. MINOR version is now 11. + +2007-08-31 Jess Thrysoee + + * version-info: 0:26:0 + + * libedit.pc.in,Makefile.am,configure.ac,patches/extra_dist_list.sh: + Added pkg-config support for libedit. Patch by Masatake YAMATO. + +2007-08-13 Jess Thrysoee + + * version-info: 0:25:0 + + * all: sync with upstream source. + +2007-03-02 Jess Thrysoee + + * version-info: 0:24:0 + + * all: sync with upstream source. + +2006-10-22 Jess Thrysoee + + * version-info: 0:23:0 + + * src/shlib_version: Upstream bumped minor version from 9 to 10. + + * all: sync with upstream source. More readline functions. + +2006-10-22 Jess Thrysoee + + * version-info: 0:22:0 + + * all: sync with upstream source. + +2006-08-29 Jess Thrysoee + + * version-info: 0:21:0 + + * all: License cleanup. All 4-clause advertising BSD licenses has been + changed to the 3-clause version by upstream. + + * src/fgetln.c: use src/tools/compat/fgetln.c instead of + othersrc/libexec/tnftpd/libnetbsd/fgetln.c + +2006-08-16 Jess Thrysoee + + * version-info: 0:20:0 + + * all: sync with upstream source. + +2006-06-03 Jess Thrysoee + + * version-info: 0:19:0 + + * COPYING: added global license file + + * all: sync with upstream source. + +2006-02-13 Jess Thrysoee + + * version-info: 0:18:0 + + * src/readline.c: Partial rl_getc_function support, patch by Kjeld Borch + Egevang. + + * src/readline.c: Make write_history and read_history returncode readline + compatible. Upstream patch. + +2006-01-03 Jess Thrysoee + + * version-info: 0:17:0 + + * patches/cvs_export.sh: strlcat.c and strlcpy.c was moved to + src/common/lib/libc/string in the upstream cvs repository. + + * all: sync with upstream source. + +2005-10-22 Jess Thrysoee + + * version-info: 0:16:0 + + * patches/*.patch, configure.ac: define SCCSID, undef LIBC_SCCS. Remove + fourteen cosmetic patches. + + * all: sync with upstream source. + +2005-09-11 Jess Thrysoee + + * version-info: 0:15:0 + + * src/Makefile.am: fix typo that meant generated files were distributes, + and make generated file targets dependent on the the 'makelist' input + files. + + * all: sync with upstream source. This is just a manpage update + +2005-08-28 Jess Thrysoee + + * version-info: 0:14:0 + + * src/sys.h: include config.h to avoid "redefinition of + `u_int32_t'". Patch by Norihiko Murase. + + * src/search.c: explicitly include sys/types.h, because regex.h on + FreeBSD needs it and does not include it itself. Patch by Norihiko Murase. + + * acinclude.m4: added EL_GETPW_R_DRAFT test and use AC_TRY_LINK instead + of AC_TRY_COMPILE. Suggested by Norihiko Murase. + + * all: sync with upstream source. + +2005-08-16 Jess Thrysoee + + * version-info: 0:13:0 + + * all: sync with upstream source. + +2005-08-05 Jess Thrysoee + + * version-info: 0:12:0 + + * all: sync with upstream source. + +2005-07-24 Jess Thrysoee + + * version-info: 0:11:0 + + * histedit.h, histedit.c, readline.c, editline/readline.h: From + upstream; added remove_history(). + +2005-07-07 Jess Thrysoee + + * version-info: 0:10:0 + + * history.c, key.c: From upstream source; Fix memory leaks found by + valgrind. + +2005-06-28 Jess Thrysoee + + * version-info: 0:9:0 + + * src/readline.c: getpwent_r is not POSIX, always use getpwent. + Reported by Gerrit P. Haase. + + * src/Makefile.am: Added libtool -no-undefined. This is needed on Cygwin + to get a shared editline library. Should not affect other platforms. + Suggested by Gerrit P. Haase. + +2005-06-15 Jess Thrysoee + + * version-info: 0:8:0 + + * all: sync with upstream source. + +2005-06-01 Jess Thrysoee + + * version-info: 0:7:0 + + * all: sync with upstream source. + + * src/readline.c, src/filecomplete.c: Solaris use POSIX draft versions + of getpwent_r, getpwnam_r and getpwuid_r which return 'struct passwd *'. + Define HAVE_GETPW_R_POSIX if these functions are (non draft) POSIX + compatible. Patch by Julien Torrès. + +2005-05-28 Jess Thrysoee + + * version-info: 0:6:0 + + * all: sync with upstream source. + +2005-03-11 Jess Thrysoee + + * version-info: 0:5:0 + + * all: sync with upstream source. + +2004-12-07 Jess Thrysoee + + * version-info: 0:4:0 + + * src/readline.c: d_namlen (in struct dirent) is not portable, always + use strlen. Patch by Scott Rankin. + +2004-11-27 Jess Thrysoee + + * version-info: 0:3:0 + + * src/history.c: bug #26785 fixed upstream, removed local patch. + +2004-11-06 Jess Thrysoee + + * version-info: 0:2:0 + + * all: sync with upstream source. + + * doc/Makefile.am: If mdoc2man fails, remove empty file. Patch by + Darren Tucker. + +2004-10-14 Jess Thrysoee + + * version-info: 0:1:0 + + * doc/Makefile.am: 'make install' twice fails. Remove old links before + trying to link the man pages. Patch by Rick Richardson. + +2004-09-28 Jess Thrysoee + + * version-info: 0:0:0 + + * acinclude.m4 configure.ac src/Makefile.am: Adhere to + LibTools library interface versions recommendation. + http://www.gnu.org/software/libtool/manual.html#SEC32 + + * doc/Makefile.am: name all manpage links as el_* (e.g. el_history.3) + to avoid conflicts. + +2004-09-08 Jess Thrysoee + + * all: Initial package. diff --git a/crypto/heimdal/lib/libedit/INSTALL b/crypto/heimdal/lib/libedit/INSTALL new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/INSTALL @@ -0,0 +1,229 @@ +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + 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 only 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. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. 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. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. 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. + +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=c89 CFLAGS=-O2 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 must use a version of `make' that +supports the `VPATH' variable, such as 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 `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have 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. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' 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. + + 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'. + +Optional Features +================= + + 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. + +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 `--target=TYPE' option 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 + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--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. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/crypto/heimdal/lib/libedit/Makefile.am b/crypto/heimdal/lib/libedit/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/Makefile.am @@ -0,0 +1,9 @@ + +AUTOMAKE_OPTIONS = foreign + +#SUBDIRS = src examples doc +SUBDIRS = src + +#EXTRA_DIST = libedit.pc.in +#pkgconfigdir = $(libdir)/pkgconfig +#pkgconfig_DATA = libedit.pc diff --git a/crypto/heimdal/lib/libedit/Makefile.in b/crypto/heimdal/lib/libedit/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/Makefile.in @@ -0,0 +1,829 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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 = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +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 = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-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_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir distdir-am dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) \ + config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in COPYING \ + ChangeLog INSTALL THANKS compile config.guess config.sub \ + install-sh ltmain.sh missing +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 +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi +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@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +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@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LT_VERSION = @LT_VERSION@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MANTYPE = @MANTYPE@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NROFF = @NROFF@ +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@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +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_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@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +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 = foreign + +#SUBDIRS = src examples doc +SUBDIRS = src +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign 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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +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: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt + +# 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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + 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" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + 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; \ + $(am__define_uniq_tagged_files); \ + 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-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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 +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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) | eval GZIP= gzip $(GZIP_ENV) -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-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -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*) \ + eval GZIP= gzip $(GZIP_ENV) -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*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ + && $(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 config.h +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 $(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-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: + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + clean-libtool cscope cscopelist-am ctags ctags-am dist \ + dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ + dist-xz dist-zip dist-zstd 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-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-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +#EXTRA_DIST = libedit.pc.in +#pkgconfigdir = $(libdir)/pkgconfig +#pkgconfig_DATA = libedit.pc + +# 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: diff --git a/crypto/heimdal/lib/libedit/THANKS b/crypto/heimdal/lib/libedit/THANKS new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/THANKS @@ -0,0 +1 @@ +Thanks to the NetBSD Project maintainers of libedit! diff --git a/crypto/heimdal/lib/libedit/acinclude.m4 b/crypto/heimdal/lib/libedit/acinclude.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/acinclude.m4 @@ -0,0 +1,66 @@ + +dnl +dnl read lib version from file (and trim trailing newline) +dnl +define([EL_RELEASE], [patsubst(esyscmd([. src/shlib_version; echo $major.$minor]), [ +])]) + +dnl +dnl read cvsexport timestamp from file (and trim trailing newline) +dnl +define([EL_TIMESTAMP], [patsubst(esyscmd([date +"%Y%m%d"]), [ +])]) + + +dnl +dnl NetBSD use the -mdoc macro package for manpages, but e.g. +dnl AIX and Solaris only support the -man package. +dnl +AC_DEFUN([EL_MANTYPE], +[ + MANTYPE= + TestPath="/usr/bin${PATH_SEPARATOR}/usr/ucb" + AC_PATH_PROGS(NROFF, nroff awf, /bin/false, $TestPath) + if ${NROFF} -mdoc ${srcdir}/doc/editrc.5.roff >/dev/null 2>&1; then + MANTYPE=mdoc + fi + AC_SUBST(MANTYPE) +]) + + +dnl +dnl Check if getpwnam_r and getpwuid_r are POSIX.1 compatible +dnl POSIX draft version returns 'struct passwd *' (used on Solaris) +dnl NOTE: getpwent_r is not POSIX so we always use getpwent +dnl +AC_DEFUN([EL_GETPW_R_POSIX], +[ + AC_MSG_CHECKING([whether getpwnam_r and getpwuid_r are posix like]) + # The prototype for the POSIX version is: + # int getpwnam_r(char *, struct passwd *, char *, size_t, struct passwd **) + # int getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **); + AC_TRY_LINK([#include + #include + #include ], + [getpwnam_r(NULL, NULL, NULL, (size_t)0, NULL); + getpwuid_r((uid_t)0, NULL, NULL, (size_t)0, NULL);], + [AC_DEFINE([HAVE_GETPW_R_POSIX], 1, [Define to 1 if you have getpwnam_r and getpwuid_r that are POSIX.1 compatible.]) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no)]) +]) + +AC_DEFUN([EL_GETPW_R_DRAFT], +[ + AC_MSG_CHECKING([whether getpwnam_r and getpwuid_r are posix _draft_ like]) + # The prototype for the POSIX draft version is: + # struct passwd *getpwuid_r(uid_t, struct passwd *, char *, int); + # struct passwd *getpwnam_r(char *, struct passwd *, char *, int); + AC_TRY_LINK([#include + #include + #include ], + [getpwnam_r(NULL, NULL, NULL, (size_t)0); + getpwuid_r((uid_t)0, NULL, NULL, (size_t)0);], + [AC_DEFINE([HAVE_GETPW_R_DRAFT], 1, [Define to 1 if you have getpwnam_r and getpwuid_r that are draft POSIX.1 versions.]) + AC_MSG_RESULT(yes)], + [AC_MSG_RESULT(no)]) +]) diff --git a/crypto/heimdal/lib/libedit/aclocal.m4 b/crypto/heimdal/lib/libedit/aclocal.m4 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/aclocal.m4 @@ -0,0 +1,10215 @@ +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- + +# Copyright (C) 1996-2021 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_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. +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'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2019, 2021-2022 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) 2014 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 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 this program. If not, see . +]) + +# serial 59 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.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +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_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _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_DECL_FILECMD])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 +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that 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 set != "${COLLECT_NAMES+set}"; 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 and +# ICC, which need '.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 + + + +# 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], [[!?.]$], [], [.]) +)]) + + + + + +# _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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + 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\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + 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 0 = "$lt_write_fail" && 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 yes = "$silent" && + 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 that 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 +# Generated automatically by $as_me ($PACKAGE) $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. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_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 set != "${COLLECT_NAMES+set}"; 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) + + 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' + 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 0 = "$_lt_result"; 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 $AR_FLAGS libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR $AR_FLAGS 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 0 = "$_lt_result" && $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*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.[[012]],*|,*powerpc*-darwin[[5-8]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; 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 yes != "$lt_cv_apple_cc_single_mod"; 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 set = "${lt_cv_aix_libpath+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 that will find a shell with a builtin +# printf (that 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], +[m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--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 yes = "$GCC"; 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 where 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 no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `$FILECMD conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `$FILECMD 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* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `$FILECMD conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `$FILECMD conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + 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" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + 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 yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `$FILECMD conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-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} +_LT_DECL([], [AR], [1], [The archiver]) + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS +_LT_DECL([], [lt_ar_flags], [0], [Flags to create an archive (by configure)]) + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. +_LT_DECL([], [AR_FLAGS], [\@S|@{ARFLAGS-"\@S|@lt_ar_flags"}], + [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 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; 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 + bitrig* | 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" ## exclude from sc_useless_quotes_in_assignment + # 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 yes = "[$]$2"; 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 yes = "[$]$2"; 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; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) + # 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" && \ + test undefined != "$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 17 != "$i" # 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 yes = "$cross_compiling"; 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 -fvisibility=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 yes != "$enable_dlopen"; 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 + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + 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 no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && 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 yes = "$lt_cv_dlopen_self"; 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 no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; 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 no = "$hard_links"; 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 where 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 yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; 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 relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; 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 -z "$STRIP"; then + AC_MSG_RESULT([no]) +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac + fi +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _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 +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; 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` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + 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" + elif test -n "$lt_multi_os_dir"; then + 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 + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +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 ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # 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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + 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%'\''`; $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* | *,icl*) + # Native MSVC or ICC + 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 and ICC 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* | midnightbsd*) + # 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$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + 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 + ;; + +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=no + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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 yes = "$lt_cv_prog_gnu_ld"; 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | 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 + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) 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="$sys_lib_dlsearch_path_spec $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* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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' + ;; + +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 yes = "$with_gnu_ld"; 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=sco + 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 yes = "$with_gnu_ld"; 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 no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_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], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that 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 that 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 no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; 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 yes = "$with_gnu_ld"; 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 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that 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='$FILECMD -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. + if ( 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* | midnightbsd*) + 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=$FILECMD + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=$FILECMD + 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 | 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=$FILECMD + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + ;; +os2*) + 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 + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + 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 no != "$lt_cv_path_NM"; 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 -headers /dev/null 2>&1 | $SED '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + 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 one 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 yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; 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 + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# 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"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$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"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, + # 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};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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 yes = "$pipe_works"; 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_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_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_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_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 yes = "$GXX"; 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + 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']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + 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 ia64 = "$host_cpu"; 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* | midnightbsd*) + # 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 ia64 != "$host_cpu"; 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 | 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 yes = "$GCC"; 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + 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']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + 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 ia64 = "$host_cpu"; 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 + ;; + + 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' + case $cc_basename in + 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' + ;; + esac + ;; + + 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']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + 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 | 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' + ;; + tcc*) + # Fabrice Bellard et al's Tiny 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)='-static' + ;; + 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 that 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl* | icl*) + _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++ and ICC port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/([[^)]]\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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 + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + ;; + + 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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" + 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' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + 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 yes = "$supports_anon_versioning"; 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 cannot +*** 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 no = "$_LT_TAGVAR(ld_shlibs, $1)"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + 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++ or Intel C++ Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC + _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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 and ICC 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* | midnightbsd*) + _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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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 yes = "$lt_cv_irix_exported_symbol"; 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 + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + 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* | bitrig*) + 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__`"; 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 + _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' + 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 + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + ;; + + osf3*) + if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes,yes = "$GCC,$enable_shared"; 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 + +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 what 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || 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 no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); 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 yes != "$_lt_caught_CXX_error"; 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 yes = "$GXX"; 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 yes = "$GXX"; 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 yes = "$with_gnu_ld"; 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 ia64 = "$host_cpu"; 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + 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 + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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 yes = "$with_gnu_ld"; 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 + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + 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* | ,icl* | no,icl*) + # Native MSVC or ICC + # 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $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, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); 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) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(file_list_spec, $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* | midnightbsd*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + 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 "x$output_objdir/$soname" = "x$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 yes = "$GXX"; 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 "x$output_objdir/$soname" = "x$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 no = "$with_gnu_ld"; 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 yes = "$GXX"; then + if test no = "$with_gnu_ld"; 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 yes = "$GXX"; then + if test no = "$with_gnu_ld"; 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 | 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 yes = "$supports_anon_versioning"; 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 + ;; + + openbsd* | bitrig*) + 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__`"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 yes,no = "$GXX,$with_gnu_ld"; 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 $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 $wl-h $wl$soname -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 $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 $wl-h $wl$soname -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 CANNOT 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 no = "$_LT_TAGVAR(ld_shlibs, $1)" && 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 yes != "$_lt_caught_CXX_error" + +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 @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@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 x-L = "$p" || + test x-R = "$p"; 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 no = "$pre_test_object_deps_done"; 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 no = "$pre_test_object_deps_done"; 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)= + ;; +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 no = "$F77"; 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 yes != "$_lt_disable_F77"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_F77" + +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 no = "$FC"; 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 yes != "$_lt_disable_FC"; 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 no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + 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 yes = "$enable_shared" || 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 yes != "$_lt_disable_FC" + +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 + +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 + +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 set = "${GCJFLAGS+set}" || 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_FILECMD +# ---------------- +# Check for a file(cmd) program that can be used to detect file type and magic +m4_defun([_LT_DECL_FILECMD], +[AC_CHECK_TOOL([FILECMD], [file], [:]) +_LT_DECL([], [FILECMD], [1], [A file(cmd) program that detects file types]) +])# _LD_DECL_FILECMD + +# _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 10 -lt "$lt_ac_count" && 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], +[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_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what 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 + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2019, 2021-2022 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 8 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_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_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_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _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=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], []) + + +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])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2019, 2021-2022 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 +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2019, 2021-2022 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 4245 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.7]) +m4_define([LT_PACKAGE_REVISION], [2.4.7]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.7' +macro_revision='2.4.7' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2019, 2021-2022 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])]) + +# Copyright (C) 2002-2021 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.16' +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.16.5], [], + [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.16.5])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2021 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], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2021 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-2021 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-2021 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], +[{ + # Older Autoconf 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. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +])# _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. +# This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2021 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. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# 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.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])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.]) +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_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([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 (and possibly the TAP driver). 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 +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro 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 + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +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-2021 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+set}" != 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-2021 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])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2021 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 whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. +AC_DEFUN([AM_MAKE_INCLUDE], +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2021 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 is modern enough. +# If it is, 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 + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2021 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])]) + +# Copyright (C) 1999-2021 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_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2021 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_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2021 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) 2009-2021 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_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2021 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-2021 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-2021 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}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + 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([acinclude.m4]) diff --git a/crypto/heimdal/lib/libedit/compile b/crypto/heimdal/lib/libedit/compile new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/libedit/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# 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 +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/crypto/heimdal/lib/libedit/config.h.in b/crypto/heimdal/lib/libedit/config.h.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/config.h.in @@ -0,0 +1,279 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_CURSES_H + +/* Define to 1 if you have the header file, and it defines `DIR'. + */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define to 1 if you have the `getline' function. */ +#undef HAVE_GETLINE + +/* Define to 1 if you have getpwnam_r and getpwuid_r that are draft POSIX.1 + versions. */ +#undef HAVE_GETPW_R_DRAFT + +/* Define to 1 if you have getpwnam_r and getpwuid_r that are POSIX.1 + compatible. */ +#undef HAVE_GETPW_R_POSIX + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `isascii' function. */ +#undef HAVE_ISASCII + +/* Define to 1 if you have the `issetugid' function. */ +#undef HAVE_ISSETUGID + +/* Define to 1 if you have the `curses' library (-lcurses). */ +#undef HAVE_LIBCURSES + +/* Define to 1 if you have the `ncurses' library (-lncurses). */ +#undef HAVE_LIBNCURSES + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIX_CONFIG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NCURSES_H + +/* Define to 1 if you have the header file, and it defines `DIR'. */ +#undef HAVE_NDIR_H + +/* Define to 1 if if your system has SIZE_MAX */ +#undef HAVE_SIZE_MAX + +/* Define to 1 if `stat' has the bug that it succeeds when given the + zero-length file name argument. */ +#undef HAVE_STAT_EMPTY_STRING_BUG + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* 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 struct dirent has member d_namlen */ +#undef HAVE_STRUCT_DIRENT_D_NAMLEN + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_CDEFS_H + +/* 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_IOCTL_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_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TERM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `u_int32_t'. */ +#undef HAVE_U_INT32_T + +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_WCHAR_H + +/* Define to 1 if you have the `wcsdup' function. */ +#undef HAVE_WCSDUP + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Define to 1 if `lstat' dereferences a symlink specified with a trailing + slash. */ +#undef LSTAT_FOLLOWS_SLASHED_SYMLINK + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* 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 as the return type of signal handlers (`int' or `void'). */ +#undef RETSIGTYPE + +/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +#undef STDC_HEADERS + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable general extensions on macOS. */ +#ifndef _DARWIN_C_SOURCE +# undef _DARWIN_C_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable X/Open compliant socket functions that do not require linking + with -lxnet on HP-UX 11.11. */ +#ifndef _HPUX_ALT_XOPEN_SOCKET_API +# undef _HPUX_ALT_XOPEN_SOCKET_API +#endif +/* Identify the host operating system as Minix. + This macro does not affect the system headers' behavior. + A future release of Autoconf may stop defining this macro. */ +#ifndef _MINIX +# undef _MINIX +#endif +/* Enable general extensions on NetBSD. + Enable NetBSD compatibility extensions on Minix. */ +#ifndef _NETBSD_SOURCE +# undef _NETBSD_SOURCE +#endif +/* Enable OpenBSD compatibility extensions on NetBSD. + Oddly enough, this does nothing on OpenBSD. */ +#ifndef _OPENBSD_SOURCE +# undef _OPENBSD_SOURCE +#endif +/* Define to 1 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_SOURCE +# undef _POSIX_SOURCE +#endif +/* Define to 2 if needed for POSIX-compatible behavior. */ +#ifndef _POSIX_1_SOURCE +# undef _POSIX_1_SOURCE +#endif +/* Enable POSIX-compatible threading on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */ +#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ +# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */ +#ifndef __STDC_WANT_IEC_60559_BFP_EXT__ +# undef __STDC_WANT_IEC_60559_BFP_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */ +#ifndef __STDC_WANT_IEC_60559_DFP_EXT__ +# undef __STDC_WANT_IEC_60559_DFP_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */ +#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__ +# undef __STDC_WANT_IEC_60559_FUNCS_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TS 18661-3:2015. */ +#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__ +# undef __STDC_WANT_IEC_60559_TYPES_EXT__ +#endif +/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */ +#ifndef __STDC_WANT_LIB_EXT2__ +# undef __STDC_WANT_LIB_EXT2__ +#endif +/* Enable extensions specified by ISO/IEC 24747:2009. */ +#ifndef __STDC_WANT_MATH_SPEC_FUNCS__ +# undef __STDC_WANT_MATH_SPEC_FUNCS__ +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable X/Open extensions. Define to 500 only if necessary + to make mbstate_t available. */ +#ifndef _XOPEN_SOURCE +# undef _XOPEN_SOURCE +#endif + + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define as a signed integer type capable of holding a process identifier. */ +#undef pid_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork + + +#include "sys.h" +#define SCCSID +#undef LIBC_SCCS +#define lint + diff --git a/crypto/heimdal/lib/libedit/config.guess b/crypto/heimdal/lib/libedit/config.guess new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/libedit/config.guess @@ -0,0 +1,1768 @@ +#!/usr/bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2022 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-05-25' + +# 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; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess +# +# Please send patches to . + + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -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-2022 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 + +# Just in case it came from the environment. +GUESS= + +# 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. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039,SC3028 + { 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" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD=$driver + 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 +} + +# 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 ; 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/*) + LIBC=unknown + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #elif defined(__GLIBC__) + LIBC=gnu + #else + #include + /* First heuristic to detect musl libc. */ + #ifdef __DEFINED_va_list + LIBC=musl + #endif + #endif + EOF + cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + eval "$cc_set_libc" + + # Second heuristic to detect musl libc. + if [ "$LIBC" = unknown ] && + command -v ldd >/dev/null && + ldd --version 2>&1 | grep -q ^musl; then + LIBC=musl + fi + + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + if [ "$LIBC" = unknown ]; then + LIBC=gnu + fi + ;; +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". + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ + echo unknown)` + case $UNAME_MACHINE_ARCH in + aarch64eb) machine=aarch64_be-unknown ;; + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-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) and ABI. + case $UNAME_MACHINE_ARCH in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + 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 + # Determine ABI tags. + case $UNAME_MACHINE_ARCH in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + 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/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + GUESS=$machine-${os}${release}${abi-} + ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE + ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE + ;; + *:SecBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE + ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE + ;; + *:MidnightBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE + ;; + *:ekkoBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE + ;; + *:SolidBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE + ;; + *:OS108:*:*) + GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE + ;; + macppc:MirBSD:*:*) + GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE + ;; + *:MirBSD:*:*) + GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE + ;; + *:Sortix:*:*) + GUESS=$UNAME_MACHINE-unknown-sortix + ;; + *:Twizzler:*:*) + GUESS=$UNAME_MACHINE-unknown-twizzler + ;; + *:Redox:*:*) + GUESS=$UNAME_MACHINE-unknown-redox + ;; + mips:OSF1:*.*) + GUESS=mips-dec-osf1 + ;; + alpha:OSF1:*:*) + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + trap '' 0 + 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. + OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + GUESS=$UNAME_MACHINE-dec-osf$OSF_REL + ;; + Amiga*:UNIX_System_V:4.0:*) + GUESS=m68k-unknown-sysv4 + ;; + *:[Aa]miga[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-amigaos + ;; + *:[Mm]orph[Oo][Ss]:*:*) + GUESS=$UNAME_MACHINE-unknown-morphos + ;; + *:OS/390:*:*) + GUESS=i370-ibm-openedition + ;; + *:z/VM:*:*) + GUESS=s390-ibm-zvmoe + ;; + *:OS400:*:*) + GUESS=powerpc-ibm-os400 + ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + GUESS=arm-acorn-riscix$UNAME_RELEASE + ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + GUESS=arm-unknown-riscos + ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + GUESS=hppa1.1-hitachi-hiuxmpp + ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + case `(/bin/universe) 2>/dev/null` in + att) GUESS=pyramid-pyramid-sysv3 ;; + *) GUESS=pyramid-pyramid-bsd ;; + esac + ;; + NILE*:*:*:dcosx) + GUESS=pyramid-pyramid-svr4 + ;; + DRS?6000:unix:4.0:6*) + GUESS=sparc-icl-nx6 + ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) GUESS=sparc-icl-nx7 ;; + esac + ;; + s390x:SunOS:*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL + ;; + sun4H:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-hal-solaris2$SUN_REL + ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris2$SUN_REL + ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + GUESS=i386-pc-auroraux$UNAME_RELEASE + ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + 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 test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=$SUN_ARCH-pc-solaris2$SUN_REL + ;; + 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. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=sparc-sun-solaris3$SUN_REL + ;; + 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'. + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` + GUESS=sparc-sun-sunos$SUN_REL + ;; + sun3*:SunOS:*:*) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + 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) + GUESS=m68k-sun-sunos$UNAME_RELEASE + ;; + sun4) + GUESS=sparc-sun-sunos$UNAME_RELEASE + ;; + esac + ;; + aushp:SunOS:*:*) + GUESS=sparc-auspex-sunos$UNAME_RELEASE + ;; + # 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:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + GUESS=m68k-atari-mint$UNAME_RELEASE + ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + GUESS=m68k-milan-mint$UNAME_RELEASE + ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + GUESS=m68k-hades-mint$UNAME_RELEASE + ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + GUESS=m68k-unknown-mint$UNAME_RELEASE + ;; + m68k:machten:*:*) + GUESS=m68k-apple-machten$UNAME_RELEASE + ;; + powerpc:machten:*:*) + GUESS=powerpc-apple-machten$UNAME_RELEASE + ;; + RISC*:Mach:*:*) + GUESS=mips-dec-mach_bsd4.3 + ;; + RISC*:ULTRIX:*:*) + GUESS=mips-dec-ultrix$UNAME_RELEASE + ;; + VAX*:ULTRIX*:*:*) + GUESS=vax-dec-ultrix$UNAME_RELEASE + ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + GUESS=clipper-intergraph-clix$UNAME_RELEASE + ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + 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; } + GUESS=mips-mips-riscos$UNAME_RELEASE + ;; + Motorola:PowerMAX_OS:*:*) + GUESS=powerpc-motorola-powermax + ;; + Motorola:*:4.3:PL8-*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + GUESS=powerpc-harris-powermax + ;; + Night_Hawk:Power_UNIX:*:*) + GUESS=powerpc-harris-powerunix + ;; + m88k:CX/UX:7*:*) + GUESS=m88k-harris-cxux7 + ;; + m88k:*:4*:R4*) + GUESS=m88k-motorola-sysv4 + ;; + m88k:*:3*:R3*) + GUESS=m88k-motorola-sysv3 + ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + GUESS=m88k-dg-dgux$UNAME_RELEASE + else + GUESS=m88k-dg-dguxbcs$UNAME_RELEASE + fi + else + GUESS=i586-dg-dgux$UNAME_RELEASE + fi + ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + GUESS=m88k-dolphin-sysv3 + ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + GUESS=m88k-motorola-sysv3 + ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + GUESS=m88k-tektronix-sysv3 + ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + GUESS=m68k-tektronix-bsd + ;; + *:IRIX*:*:*) + IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` + GUESS=mips-sgi-irix$IRIX_REL + ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id + ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + GUESS=i386-ibm-aix + ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV + ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + 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 + GUESS=$SYSTEM_NAME + else + GUESS=rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + GUESS=rs6000-ibm-aix3.2.4 + else + GUESS=rs6000-ibm-aix3.2 + fi + ;; + *: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 test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=$UNAME_VERSION.$UNAME_RELEASE + fi + GUESS=$IBM_ARCH-ibm-aix$IBM_REV + ;; + *:AIX:*:*) + GUESS=rs6000-ibm-aix + ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + GUESS=romp-ibm-bsd4.4 + ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to + ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + GUESS=rs6000-bull-bosx + ;; + DPX/2?00:B.O.S.:*:*) + GUESS=m68k-bull-sysv3 + ;; + 9000/[34]??:4.3bsd:1.*:*) + GUESS=m68k-hp-bsd + ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + GUESS=m68k-hp-bsd4.4 + ;; + 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 test -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 test "$HP_ARCH" = ""; then + 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 test "$HP_ARCH" = hppa2.0w + then + 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 + GUESS=$HP_ARCH-hp-hpux$HPUX_REV + ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` + GUESS=ia64-hp-hpux$HPUX_REV + ;; + 3050*:HI-UX:*:*) + 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; } + GUESS=unknown-hitachi-hiuxwe2 + ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + GUESS=hppa1.1-hp-bsd + ;; + 9000/8??:4.3bsd:*:*) + GUESS=hppa1.0-hp-bsd + ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + GUESS=hppa1.0-hp-mpeix + ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + GUESS=hppa1.1-hp-osf + ;; + hp8??:OSF1:*:*) + GUESS=hppa1.0-hp-osf + ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + GUESS=$UNAME_MACHINE-unknown-osf1mk + else + GUESS=$UNAME_MACHINE-unknown-osf1 + fi + ;; + parisc*:Lites*:*:*) + GUESS=hppa1.1-hp-lites + ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + GUESS=c1-convex-bsd + ;; + 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*:*) + GUESS=c34-convex-bsd + ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + GUESS=c38-convex-bsd + ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + GUESS=c4-convex-bsd + ;; + CRAY*Y-MP:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=ymp-cray-unicos$CRAY_REL + ;; + 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:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=t90-cray-unicos$CRAY_REL + ;; + CRAY*T3E:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=alphaev5-cray-unicosmk$CRAY_REL + ;; + CRAY*SV1:*:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=sv1-cray-unicos$CRAY_REL + ;; + *:UNICOS/mp:*:*) + CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` + GUESS=craynv-cray-unicosmp$CRAY_REL + ;; + 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/ /_/'` + GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + 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/ /_/'` + GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} + ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE + ;; + sparc*:BSD/OS:*:*) + GUESS=sparc-unknown-bsdi$UNAME_RELEASE + ;; + *:BSD/OS:*:*) + GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE + ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi + else + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf + fi + ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case $UNAME_PROCESSOR in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL + ;; + i*:CYGWIN*:*) + GUESS=$UNAME_MACHINE-pc-cygwin + ;; + *:MINGW64*:*) + GUESS=$UNAME_MACHINE-pc-mingw64 + ;; + *:MINGW*:*) + GUESS=$UNAME_MACHINE-pc-mingw32 + ;; + *:MSYS*:*) + GUESS=$UNAME_MACHINE-pc-msys + ;; + i*:PW*:*) + GUESS=$UNAME_MACHINE-pc-pw32 + ;; + *:SerenityOS:*:*) + GUESS=$UNAME_MACHINE-pc-serenity + ;; + *:Interix*:*) + case $UNAME_MACHINE in + x86) + GUESS=i586-pc-interix$UNAME_RELEASE + ;; + authenticamd | genuineintel | EM64T) + GUESS=x86_64-unknown-interix$UNAME_RELEASE + ;; + IA64) + GUESS=ia64-unknown-interix$UNAME_RELEASE + ;; + esac ;; + i*:UWIN*:*) + GUESS=$UNAME_MACHINE-pc-uwin + ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + GUESS=x86_64-pc-cygwin + ;; + prep*:SunOS:5.*:*) + SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` + GUESS=powerpcle-unknown-solaris2$SUN_REL + ;; + *:GNU:*:*) + # the GNU system + GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` + GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL + ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` + GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC + ;; + *:Minix:*:*) + GUESS=$UNAME_MACHINE-unknown-minix + ;; + aarch64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` 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 + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi + else + GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf + fi + fi + ;; + avr32*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + cris:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + crisv32:Linux:*:*) + GUESS=$UNAME_MACHINE-axis-linux-$LIBC + ;; + e2k:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + frv:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + hexagon:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + i*86:Linux:*:*) + GUESS=$UNAME_MACHINE-pc-linux-$LIBC + ;; + ia64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + k1om:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m32r*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + m68*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` + eval "$cc_set_vars" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + openrisc*:Linux:*:*) + GUESS=or1k-unknown-linux-$LIBC + ;; + or32:Linux:*:* | or1k*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + padre:Linux:*:*) + GUESS=sparc-unknown-linux-$LIBC + ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + GUESS=hppa64-unknown-linux-$LIBC + ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; + PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; + *) GUESS=hppa-unknown-linux-$LIBC ;; + esac + ;; + ppc64:Linux:*:*) + GUESS=powerpc64-unknown-linux-$LIBC + ;; + ppc:Linux:*:*) + GUESS=powerpc-unknown-linux-$LIBC + ;; + ppc64le:Linux:*:*) + GUESS=powerpc64le-unknown-linux-$LIBC + ;; + ppcle:Linux:*:*) + GUESS=powerpcle-unknown-linux-$LIBC + ;; + riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + s390:Linux:*:* | s390x:Linux:*:*) + GUESS=$UNAME_MACHINE-ibm-linux-$LIBC + ;; + sh64*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sh*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + tile*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + vax:Linux:*:*) + GUESS=$UNAME_MACHINE-dec-linux-$LIBC + ;; + x86_64:Linux:*:*) + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __i386__ + ABI=x86 + #else + #ifdef __ILP32__ + ABI=x32 + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + x86) CPU=i686 ;; + x32) LIBCABI=${LIBC}x32 ;; + esac + fi + GUESS=$CPU-pc-linux-$LIBCABI + ;; + xtensa*:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + 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. + GUESS=i386-sequent-sysv4 + ;; + 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. + GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION + ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + GUESS=$UNAME_MACHINE-pc-os2-emx + ;; + i*86:XTS-300:*:STOP) + GUESS=$UNAME_MACHINE-unknown-stop + ;; + i*86:atheos:*:*) + GUESS=$UNAME_MACHINE-unknown-atheos + ;; + i*86:syllable:*:*) + GUESS=$UNAME_MACHINE-pc-syllable + ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + GUESS=i386-unknown-lynxos$UNAME_RELEASE + ;; + i*86:*DOS:*:*) + GUESS=$UNAME_MACHINE-pc-msdosdjgpp + ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL + fi + ;; + 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 + GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + ;; + 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 + GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL + else + GUESS=$UNAME_MACHINE-pc-sysv32 + fi + ;; + 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 configure will decide that + # this is a cross-build. + GUESS=i586-pc-msdosdjgpp + ;; + Intel:Mach:3*:*) + GUESS=i386-pc-mach3 + ;; + paragon:*:*:*) + GUESS=i860-intel-osf1 + ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 + fi + ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + GUESS=m68010-convergent-sysv + ;; + mc68k:UNIX:SYSTEM5:3.51m) + GUESS=m68k-convergent-sysv + ;; + M680?0:D-NIX:5.3:*) + GUESS=m68k-diab-dnix + ;; + 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*:*) + GUESS=m68k-unknown-lynxos$UNAME_RELEASE + ;; + mc68030:UNIX_System_V:4.*:*) + GUESS=m68k-atari-sysv4 + ;; + TSUNAMI:LynxOS:2.*:*) + GUESS=sparc-unknown-lynxos$UNAME_RELEASE + ;; + rs6000:LynxOS:2.*:*) + GUESS=rs6000-unknown-lynxos$UNAME_RELEASE + ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + GUESS=powerpc-unknown-lynxos$UNAME_RELEASE + ;; + SM[BE]S:UNIX_SV:*:*) + GUESS=mips-dde-sysv$UNAME_RELEASE + ;; + RM*:ReliantUNIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + RM*:SINIX-*:*:*) + GUESS=mips-sni-sysv4 + ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + GUESS=$UNAME_MACHINE-sni-sysv4 + else + GUESS=ns32k-sni-sysv + fi + ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + GUESS=i586-unisys-sysv4 + ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + GUESS=hppa1.1-stratus-sysv4 + ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + GUESS=i860-stratus-sysv4 + ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=$UNAME_MACHINE-stratus-vos + ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + GUESS=hppa1.1-stratus-vos + ;; + mc68*:A/UX:*:*) + GUESS=m68k-apple-aux$UNAME_RELEASE + ;; + news*:NEWS-OS:6*:*) + GUESS=mips-sony-newsos6 + ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + GUESS=mips-nec-sysv$UNAME_RELEASE + else + GUESS=mips-unknown-sysv$UNAME_RELEASE + fi + ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + GUESS=powerpc-be-beos + ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + GUESS=powerpc-apple-beos + ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + GUESS=i586-pc-beos + ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + GUESS=i586-pc-haiku + ;; + ppc:Haiku:*:*) # Haiku running on Apple PowerPC + GUESS=powerpc-apple-haiku + ;; + *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) + GUESS=$UNAME_MACHINE-unknown-haiku + ;; + SX-4:SUPER-UX:*:*) + GUESS=sx4-nec-superux$UNAME_RELEASE + ;; + SX-5:SUPER-UX:*:*) + GUESS=sx5-nec-superux$UNAME_RELEASE + ;; + SX-6:SUPER-UX:*:*) + GUESS=sx6-nec-superux$UNAME_RELEASE + ;; + SX-7:SUPER-UX:*:*) + GUESS=sx7-nec-superux$UNAME_RELEASE + ;; + SX-8:SUPER-UX:*:*) + GUESS=sx8-nec-superux$UNAME_RELEASE + ;; + SX-8R:SUPER-UX:*:*) + GUESS=sx8r-nec-superux$UNAME_RELEASE + ;; + SX-ACE:SUPER-UX:*:*) + GUESS=sxace-nec-superux$UNAME_RELEASE + ;; + Power*:Rhapsody:*:*) + GUESS=powerpc-apple-rhapsody$UNAME_RELEASE + ;; + *:Rhapsody:*:*) + GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE + ;; + arm64:Darwin:*:*) + GUESS=aarch64-apple-darwin$UNAME_RELEASE + ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$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 + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE + ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE + ;; + *:QNX:*:4*) + GUESS=i386-pc-qnx + ;; + NEO-*:NONSTOP_KERNEL:*:*) + GUESS=neo-tandem-nsk$UNAME_RELEASE + ;; + NSE-*:NONSTOP_KERNEL:*:*) + GUESS=nse-tandem-nsk$UNAME_RELEASE + ;; + NSR-*:NONSTOP_KERNEL:*:*) + GUESS=nsr-tandem-nsk$UNAME_RELEASE + ;; + NSV-*:NONSTOP_KERNEL:*:*) + GUESS=nsv-tandem-nsk$UNAME_RELEASE + ;; + NSX-*:NONSTOP_KERNEL:*:*) + GUESS=nsx-tandem-nsk$UNAME_RELEASE + ;; + *:NonStop-UX:*:*) + GUESS=mips-compaq-nonstopux + ;; + BS2000:POSIX*:*:*) + GUESS=bs2000-siemens-sysv + ;; + DS/*:UNIX_System_V:*:*) + GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE + ;; + *: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 + elif test "x${cputype-}" != x; then + UNAME_MACHINE=$cputype + fi + GUESS=$UNAME_MACHINE-unknown-plan9 + ;; + *:TOPS-10:*:*) + GUESS=pdp10-unknown-tops10 + ;; + *:TENEX:*:*) + GUESS=pdp10-unknown-tenex + ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + GUESS=pdp10-dec-tops20 + ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + GUESS=pdp10-xkl-tops20 + ;; + *:TOPS-20:*:*) + GUESS=pdp10-unknown-tops20 + ;; + *:ITS:*:*) + GUESS=pdp10-unknown-its + ;; + SEI:*:*:SEIUX) + GUESS=mips-sei-seiux$UNAME_RELEASE + ;; + *:DragonFly:*:*) + DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` + GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL + ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case $UNAME_MACHINE in + A*) GUESS=alpha-dec-vms ;; + I*) GUESS=ia64-dec-vms ;; + V*) GUESS=vax-dec-vms ;; + esac ;; + *:XENIX:*:SysV) + GUESS=i386-pc-xenix + ;; + i*86:skyos:*:*) + SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` + GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL + ;; + i*86:rdos:*:*) + GUESS=$UNAME_MACHINE-pc-rdos + ;; + i*86:Fiwix:*:*) + GUESS=$UNAME_MACHINE-pc-fiwix + ;; + *:AROS:*:*) + GUESS=$UNAME_MACHINE-unknown-aros + ;; + x86_64:VMkernel:*:*) + GUESS=$UNAME_MACHINE-unknown-esx + ;; + amd64:Isilon\ OneFS:*:*) + GUESS=x86_64-unknown-onefs + ;; + *:Unleashed:*:*) + GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE + ;; +esac + +# Do we have a guess based on uname results? +if test "x$GUESS" != x; then + echo "$GUESS" + exit +fi + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#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 (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 +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#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; } + +echo "$0: unable to guess system type" >&2 + +case $UNAME_MACHINE:$UNAME_SYSTEM in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&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 +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/crypto/heimdal/lib/libedit/config.sub b/crypto/heimdal/lib/libedit/config.sub new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/libedit/config.sub @@ -0,0 +1,1890 @@ +#!/usr/bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2022 Free Software Foundation, Inc. + +# shellcheck disable=SC2006,SC2268 # see below for rationale + +timestamp='2022-01-03' + +# 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 to . +# +# 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: +# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub + +# 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. + +# The "shellcheck disable" line above the timestamp inhibits complaints +# about features and limitations of the classic Bourne shell that were +# superseded or lifted in POSIX. However, this script identifies a wide +# variety of pre-POSIX systems that do not have POSIX shells at all, and +# even some reasonably current systems (Solaris 10 as case-in-point) still +# have a pre-POSIX /bin/sh. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -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-2022 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 ;; + + *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 + +# Split fields of configuration type +# shellcheck disable=SC2162 +saved_IFS=$IFS +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + zephyr*) + basic_machine=$field1-unknown + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | 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* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # 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) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` + ;; + os2-emx) + kernel=os2 + os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` + ;; + nto-qnx*) + kernel=nto + os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + saved_IFS=$IFS + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ + | linux-musl* | linux-relibc* | linux-uclibc* ) + ;; + uclinux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + vxworks-simlinux | vxworks-simwindows | vxworks-spe) + ;; + nto-qnx*) + ;; + os2-emx) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$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 + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + 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 + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/crypto/heimdal/lib/libedit/configure b/crypto/heimdal/lib/libedit/configure new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/libedit/configure @@ -0,0 +1,16662 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.71 for libedit 3.1. +# +# +# Copyright (C) 1992-1996, 1998-2017, 2020-2021 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 +as_nop=: +if test ${ZSH_VERSION+y} && (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 $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; 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 + + +# 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# 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'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +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="as_nop=: +if test \${ZSH_VERSION+y} && (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 \$as_nop + 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 \$as_nop + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || 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 -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 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else $as_nop + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi + + + 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'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# 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=`printf "%s\n" "$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 || +printf "%s\n" 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_nop + 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_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + +# as_fn_nop +# --------- +# Do nothing but, unlike ":", preserve the value of $?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +# 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$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 || +printf "%s\n" 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" || + { printf "%s\n" "$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 +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +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 + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + + +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='libedit' +PACKAGE_TARNAME='libedit-20221115' +PACKAGE_VERSION='3.1' +PACKAGE_STRING='libedit 3.1' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="src/el.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_func_c_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +CPP +MANTYPE +NROFF +LT_VERSION +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +DLLTOOL +OBJDUMP +FILECMD +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +LIBTOOL +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +CSCOPE +ETAGS +CTAGS +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +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 +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +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 +runstatedir +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 +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_silent_rules +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +LT_SYS_LIBRARY_PATH +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +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 + + 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=`printf "%s\n" "$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=`printf "%s\n" "$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 ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -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=`printf "%s\n" "$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=`printf "%s\n" "$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. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$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" ;; + *) printf "%s\n" "$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 runstatedir +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 || +printf "%s\n" 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 libedit 3.1 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] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --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/libedit-20221115] + --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 libedit 3.1:";; + 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-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --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-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --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 + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$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 configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + 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 + printf "%s\n" "$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 +libedit configure 3.1 +generated by GNU Autoconf 2.71 + +Copyright (C) 2021 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 conftest.beam + 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\"" +printf "%s\n" "$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 + printf "%s\n" "$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_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam 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\"" +printf "%s\n" "$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 + printf "%s\n" "$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_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ + +#include +#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 (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main (void) +{ +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 (void) +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_type + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to run 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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: program exited with status $ac_status" >&5 + printf "%s\n" "$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_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\"" +printf "%s\n" "$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 + printf "%s\n" "$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_nop + printf "%s\n" "$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_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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +printf %s "checking for $2.$3... " >&6; } +if eval test \${$4+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main (void) +{ +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 $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main (void) +{ +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 $as_nop + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$4 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_member +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +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 libedit $as_me 3.1, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "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=`printf "%s\n" "$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=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## 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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$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 + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$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 + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in #( + */*) : + ;; #( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*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 do not provoke an error unfortunately, instead are silently treated + as an "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 is necessary to write \x00 == 0 to get something + that is 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 **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __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 + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "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 bool +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 = 0; + float fnumber = 0; + + 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); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= 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[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" +as_fn_append ac_header_c_list " wchar.h wchar_h HAVE_WCHAR_H" +as_fn_append ac_header_c_list " minix/config.h minix_config_h HAVE_MINIX_CONFIG_H" +as_fn_append ac_header_c_list " vfork.h vfork_h HAVE_VFORK_H" +as_fn_append ac_func_c_list " fork HAVE_FORK" +as_fn_append ac_func_c_list " vfork HAVE_VFORK" + +# Auxiliary files required by this configure script. +ac_aux_files="config.guess config.sub ltmain.sh missing install-sh compile" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$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. +if test -f "${ac_aux_dir}config.guess"; then + ac_config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_configure="$SHELL ${ac_aux_dir}configure" +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,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$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=`printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-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 + + + +ac_config_headers="$ac_config_headers config.h" + + +# features of Posix that are extensions to C (define _GNU_SOURCE) + + + + + + + + + + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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}clang" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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="clang" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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. +printf "%s\n" "$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 -version; 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\"" +printf "%s\n" "$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 + printf "%s\n" "$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 (void) +{ + + ; + 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. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$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+y} && 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 $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$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_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$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 (void) +{ +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. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$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 + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + 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\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$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_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + 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.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; 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 +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +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 conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_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 conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +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 + + + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # 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__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h + +fi + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +printf %s "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test ${ac_cv_safe_to_define___extensions__+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_safe_to_define___extensions__=yes +else $as_nop + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +printf "%s\n" "$ac_cv_safe_to_define___extensions__" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether _XOPEN_SOURCE should be defined" >&5 +printf %s "checking whether _XOPEN_SOURCE should be defined... " >&6; } +if test ${ac_cv_should_define__xopen_source+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_should_define__xopen_source=no + if test $ac_cv_header_wchar_h = yes +then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + mbstate_t x; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE 500 + #include + mbstate_t x; +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_should_define__xopen_source=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_should_define__xopen_source" >&5 +printf "%s\n" "$ac_cv_should_define__xopen_source" >&6; } + + printf "%s\n" "#define _ALL_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _DARWIN_C_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _GNU_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _HPUX_ALT_XOPEN_SOCKET_API 1" >>confdefs.h + + printf "%s\n" "#define _NETBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _OPENBSD_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_BFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_DFP_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_LIB_EXT2__ 1" >>confdefs.h + + printf "%s\n" "#define __STDC_WANT_MATH_SPEC_FUNCS__ 1" >>confdefs.h + + printf "%s\n" "#define _TANDEM_SOURCE 1" >>confdefs.h + + if test $ac_cv_header_minix_config_h = yes +then : + MINIX=yes + printf "%s\n" "#define _MINIX 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_SOURCE 1" >>confdefs.h + + printf "%s\n" "#define _POSIX_1_SOURCE 2" >>confdefs.h + +else $as_nop + MINIX= +fi + if test $ac_cv_safe_to_define___extensions__ = yes +then : + printf "%s\n" "#define __EXTENSIONS__ 1" >>confdefs.h + +fi + if test $ac_cv_should_define__xopen_source = yes +then : + printf "%s\n" "#define _XOPEN_SOURCE 500" >>confdefs.h + +fi + + +am__api_version='1.16' + + + # 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. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +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+y}; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$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' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "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=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 ('*'coreutils) '* | \ + 'BusyBox '* | \ + '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+y}; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in #( + '0:this is the am__doit target') : + case $s in #( + BSD) : + am__include='.include' am__quote='"' ;; #( + *) : + am__include='include' am__quote='' ;; +esac ;; #( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +# Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +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 + + +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +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='libedit-20221115' + VERSION='3.1' + + +printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h + + +printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h + +# 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 (and possibly the TAP driver). 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}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$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 + + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.7' +macro_revision='2.4.7' + + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + + + + # 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 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$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 + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$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 + + +# 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' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "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*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "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 yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 -headers /dev/null 2>&1 | $SED '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) + # 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" && \ + test undefined != "$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 17 != "$i" # 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +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 + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + #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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_reload_flag='-r' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$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 yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; 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}file", so it can be a program name with args. +set dummy ${ac_tool_prefix}file; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_FILECMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$FILECMD"; then + ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_FILECMD="${ac_tool_prefix}file" + printf "%s\n" "$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 +FILECMD=$ac_cv_prog_FILECMD +if test -n "$FILECMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 +printf "%s\n" "$FILECMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_FILECMD"; then + ac_ct_FILECMD=$FILECMD + # Extract the first word of "file", so it can be a program name with args. +set dummy file; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_FILECMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_FILECMD"; then + ac_cv_prog_ac_ct_FILECMD="$ac_ct_FILECMD" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_FILECMD="file" + printf "%s\n" "$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_FILECMD=$ac_cv_prog_ac_ct_FILECMD +if test -n "$ac_ct_FILECMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_FILECMD" >&5 +printf "%s\n" "$ac_ct_FILECMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_FILECMD" = x; then + FILECMD=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + FILECMD=$ac_ct_FILECMD + fi +else + FILECMD="$ac_cv_prog_FILECMD" +fi + + + + + + + +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +# that 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='$FILECMD -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. + if ( 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* | midnightbsd*) + 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=$FILECMD + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=$FILECMD + 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 | 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=$FILECMD + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; 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 + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 one 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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} + + + + + + +# Use ARFLAGS variable as AR's operation code to sync the variable naming with +# Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have +# higher priority because thats what people were doing historically (setting +# ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS +# variable obsoleted/removed. + +test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} +lt_ar_flags=$AR_FLAGS + + + + + + +# Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override +# by AR_FLAGS because that was never working and AR_FLAGS is about to die. + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + 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=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; 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=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + bitrig* | 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. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +# 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 ia64 = "$host_cpu"; 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 + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# 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"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$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"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/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, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++ or ICC, + # 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};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,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=$? + printf "%s\n" "$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=$? + printf "%s\n" "$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 can'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* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$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=$? + printf "%s\n" "$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 yes = "$pipe_works"; 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test ${with_sysroot+y} +then : + withval=$with_sysroot; +else $as_nop + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test ${enable_libtool_lock+y} +then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || 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 what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + 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=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `$FILECMD 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* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + 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=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `$FILECMD conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `$FILECMD conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `$FILECMD conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + 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" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + 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" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_cc_needs_belf=yes +else $as_nop + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `$FILECMD conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_ld_exported_symbols_list=yes +else $as_nop + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 $AR_FLAGS libconftest.a conftest.o" >&5 + $AR $AR_FLAGS 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 0 = "$_lt_result" && $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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$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*) + case $MACOSX_DEPLOYMENT_TARGET,$host in + 10.[012],*|,*powerpc*-darwin[5-8]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; 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 no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +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 : + printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test ${enable_shared+y} +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 $as_nop + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test ${enable_static+y} +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 $as_nop + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test ${with_pic+y} +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 $as_nop + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +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 $as_nop + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# 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 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h + + + + +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 set != "${COLLECT_NAMES+set}"; 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 and +# ICC, which need '.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 + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "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* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" ## exclude from sc_useless_quotes_in_assignment + # 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; 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 yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + 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' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + 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 ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + 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' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + 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 | 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' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + 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 that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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" ## exclude from sc_useless_quotes_in_assignment + # 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; 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\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$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 + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "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++ and ICC port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++ or Intel C++ Compiler. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + 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 yes = "$with_gnu_ld"; 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 yes = "$lt_use_gnu_ld_interface"; 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 | $SED -e 's/([^)]\+)\s\+//' 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 ia64 != "$host_cpu"; 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, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; 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 + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + + 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 linux-dietlibc = "$host_os"; 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 no = "$tmp_diet" + 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' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-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 yes = "$supports_anon_versioning"; 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 + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + 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 yes = "$supports_anon_versioning"; 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 cannot +*** 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 no = "$ld_shlibs"; 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 yes = "$GCC" && 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 ia64 = "$host_cpu"; 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 GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + 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) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | 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 + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + 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,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; 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 yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + 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,yes = "$with_aix_soname,$aix_use_runtimelinking"; 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 set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + 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.beam \ + 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 -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; 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 set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + 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.beam \ + 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 yes = "$with_gnu_ld"; 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 + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + 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++ or Intel C++ Compiler. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl* | icl*) + # Native MSVC or ICC + 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,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $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 and ICC 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 yes = "$lt_cv_ld_force_load"; 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*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; 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* | midnightbsd*) + 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 yes = "$GCC"; 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 "x$output_objdir/$soname" = "x$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 "x$output_objdir/$soname" = "x$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 yes,no = "$GCC,$with_gnu_ld"; 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 no = "$with_gnu_ld"; 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 yes,no = "$GCC,$with_gnu_ld"; 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) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; 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 no = "$with_gnu_ld"; 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 yes = "$GCC"; 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. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 $as_nop + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; 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 + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + 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* | bitrig*) + 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__`"; 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 + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + file_list_spec='@' + ;; + + osf3*) + if test yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 yes = "$GCC"; 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 sequent = "$host_vendor"; 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 yes = "$GCC"; 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 CANNOT 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 yes = "$GCC"; 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 sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && 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 yes,yes = "$GCC,$enable_shared"; 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. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $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=$? + printf "%s\n" "$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=$? + printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; 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` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + 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" + elif test -n "$lt_multi_os_dir"; then + 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 ia64 = "$host_cpu"; 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 + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # 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' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # 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' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + 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%'\''`; $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* | *,icl*) + # Native MSVC or ICC + 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 and ICC 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* | midnightbsd*) + # 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$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + 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 + ;; + +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=no + 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 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + 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 yes = "$lt_cv_prog_gnu_ld"; 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 + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # 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 + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | 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 test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 (void) +{ + + ; + 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.beam \ + 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 + + # Add ABI-specific directories to the system library path. + sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) 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="$sys_lib_dlsearch_path_spec $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* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + 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 + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + 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' + ;; + +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 yes = "$with_gnu_ld"; 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=sco + 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 yes = "$with_gnu_ld"; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # 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 no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$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_nop + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + 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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char shl_load (); +int +main (void) +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else $as_nop + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$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 $as_nop + 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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$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_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char dld_link (); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$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 no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && 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" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; 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 -fvisibility=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=$? + printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; 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 -fvisibility=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=$? + printf "%s\n" "$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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$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= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -z "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +else + if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + case $host_os in + darwin*) + # FIXME - insert some real tests, host_os isn't really good enough + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + ;; + freebsd*) + if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then + old_striplib="$STRIP --strip-debug" + striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac + fi +fi + + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && 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 yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$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 + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# libtool -version-info +LT_VERSION=0:36:0 + + +# Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +# Checks for programs. + +#AC_PROG_CC +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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" + printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + + + MANTYPE= + TestPath="/usr/bin${PATH_SEPARATOR}/usr/ucb" + for ac_prog in nroff awf +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_path_NROFF+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $NROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_NROFF="$NROFF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $TestPath +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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_NROFF="$as_dir$ac_word$ac_exec_ext" + printf "%s\n" "$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 +NROFF=$ac_cv_path_NROFF +if test -n "$NROFF"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NROFF" >&5 +printf "%s\n" "$NROFF" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$NROFF" && break +done +test -n "$NROFF" || NROFF="/bin/false" + + if ${NROFF} -mdoc ${srcdir}/doc/editrc.5.roff >/dev/null 2>&1; then + MANTYPE=mdoc + fi + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lcurses" >&5 +printf %s "checking for tgetent in -lcurses... " >&6; } +if test ${ac_cv_lib_curses_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lcurses $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. */ +char tgetent (); +int +main (void) +{ +return tgetent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_curses_tgetent=yes +else $as_nop + ac_cv_lib_curses_tgetent=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tgetent" >&5 +printf "%s\n" "$ac_cv_lib_curses_tgetent" >&6; } +if test "x$ac_cv_lib_curses_tgetent" = xyes +then : + printf "%s\n" "#define HAVE_LIBCURSES 1" >>confdefs.h + + LIBS="-lcurses $LIBS" + +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncurses" >&5 +printf %s "checking for tgetent in -lncurses... " >&6; } +if test ${ac_cv_lib_ncurses_tgetent+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lncurses $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. */ +char tgetent (); +int +main (void) +{ +return tgetent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_ncurses_tgetent=yes +else $as_nop + ac_cv_lib_ncurses_tgetent=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tgetent" >&5 +printf "%s\n" "$ac_cv_lib_ncurses_tgetent" >&6; } +if test "x$ac_cv_lib_ncurses_tgetent" = xyes +then : + printf "%s\n" "#define HAVE_LIBNCURSES 1" >>confdefs.h + + LIBS="-lncurses $LIBS" + +else $as_nop + as_fn_error $? "libcurses or libncurses are required!" "$LINENO" 5 +fi + +fi + + + +# Checks for header files. +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`printf "%s\n" "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +printf %s "checking for $ac_hdr that defines DIR... " >&6; } +if eval test \${$as_ac_Header+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main (void) +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$as_ac_Header=yes" +else $as_nop + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } +if eval test \"x\$"$as_ac_Header"\" = x"yes" +then : + cat >>confdefs.h <<_ACEOF +#define `printf "%s\n" "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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +printf %s "checking for library containing opendir... " >&6; } +if test ${ac_cv_search_opendir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char opendir (); +int +main (void) +{ +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.beam \ + conftest$ac_exeext + if test ${ac_cv_search_opendir+y} +then : + break +fi +done +if test ${ac_cv_search_opendir+y} +then : + +else $as_nop + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +printf %s "checking for library containing opendir... " >&6; } +if test ${ac_cv_search_opendir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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. */ +char opendir (); +int +main (void) +{ +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.beam \ + conftest$ac_exeext + if test ${ac_cv_search_opendir+y} +then : + break +fi +done +if test ${ac_cv_search_opendir+y} +then : + +else $as_nop + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +printf "%s\n" "$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 + +# Autoupdate added the next two lines to ensure that your configure +# script's behavior did not change. They are probably safe to remove. + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 +printf %s "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } +if test ${ac_cv_header_sys_wait_h+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main (void) +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_header_sys_wait_h=yes +else $as_nop + ac_cv_header_sys_wait_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 +printf "%s\n" "$ac_cv_header_sys_wait_h" >&6; } +if test $ac_cv_header_sys_wait_h = yes; then + +printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h + +fi + +ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default" +if test "x$ac_cv_header_fcntl_h" = xyes +then : + printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" +if test "x$ac_cv_header_limits_h" = xyes +then : + printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" "$ac_includes_default" +if test "x$ac_cv_header_stdint_h" = xyes +then : + printf "%s\n" "#define HAVE_STDINT_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = xyes +then : + printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = xyes +then : + printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_param_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default" +if test "x$ac_cv_header_unistd_h" = xyes +then : + printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "curses.h" "ac_cv_header_curses_h" "$ac_includes_default" +if test "x$ac_cv_header_curses_h" = xyes +then : + printf "%s\n" "#define HAVE_CURSES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "ncurses.h" "ac_cv_header_ncurses_h" "$ac_includes_default" +if test "x$ac_cv_header_ncurses_h" = xyes +then : + printf "%s\n" "#define HAVE_NCURSES_H 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "sys/cdefs.h" "ac_cv_header_sys_cdefs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_cdefs_h" = xyes +then : + printf "%s\n" "#define HAVE_SYS_CDEFS_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_compile "$LINENO" "termios.h" "ac_cv_header_termios_h" "$ac_includes_default" +if test "x$ac_cv_header_termios_h" = xyes +then : + +else $as_nop + as_fn_error $? "termios.h is required!" "$LINENO" 5 +fi + + +## include curses.h to prevent "Present But Cannot Be Compiled" +ac_fn_c_check_header_compile "$LINENO" "term.h" "ac_cv_header_term_h" "#if HAVE_CURSES_H +# include +#elif HAVE_NCURSES_H +# include +#endif + +" +if test "x$ac_cv_header_term_h" = xyes +then : + printf "%s\n" "#define HAVE_TERM_H 1" >>confdefs.h + +fi + + +# Checks for typedefs, structures, and compiler characteristics. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +printf %s "checking for an ANSI C-conforming const... " >&6; } +if test ${ac_cv_c_const+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + +#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}; + /* IBM 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; + } + { /* IBM 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 $as_nop + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +printf "%s\n" "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +printf "%s\n" "#define const /**/" >>confdefs.h + +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 $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #if defined _WIN64 && !defined __CYGWIN__ + LLP64 + #endif + +int +main (void) +{ + + ; + return 0; +} + +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_pid_type='int' +else $as_nop + ac_pid_type='__int64' +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h + + +fi + + +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 $as_nop + +printf "%s\n" "#define size_t unsigned int" >>confdefs.h + +fi + +ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "$ac_includes_default" +if test "x$ac_cv_type_u_int32_t" = xyes +then : + +printf "%s\n" "#define HAVE_U_INT32_T 1" >>confdefs.h + + +fi + + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#if HAVE_STDINT_H +# include +#endif + +int +main (void) +{ +size_t x = SIZE_MAX; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + have_size_max=yes +else $as_nop + have_size_max=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +if test "$have_size_max" = yes; then + +printf "%s\n" "#define HAVE_SIZE_MAX 1" >>confdefs.h + +fi + +# Checks for library functions. + +ac_func= +for ac_item in $ac_func_c_list +do + if test $ac_func; then + ac_fn_c_check_func "$LINENO" $ac_func ac_cv_func_$ac_func + if eval test \"x\$ac_cv_func_$ac_func\" = xyes; then + echo "#define $ac_item 1" >> confdefs.h + fi + ac_func= + else + ac_func=$ac_item + fi +done + + + +if test "x$ac_cv_func_fork" = xyes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working fork" >&5 +printf %s "checking for working fork... " >&6; } +if test ${ac_cv_func_fork_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + ac_cv_func_fork_works=cross +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ + + /* By Ruediger Kuhlmann. */ + return fork () < 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_fork_works=yes +else $as_nop + ac_cv_func_fork_works=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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works" >&5 +printf "%s\n" "$ac_cv_func_fork_works" >&6; } + +else + ac_cv_func_fork_works=$ac_cv_func_fork +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 +printf "%s\n" "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working vfork" >&5 +printf %s "checking for working vfork... " >&6; } +if test ${ac_cv_func_vfork_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + ac_cv_func_vfork_works=cross +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +$ac_includes_default +#include +#include +#ifdef HAVE_VFORK_H +# include +#endif + +static void +do_nothing (int sig) +{ + (void) sig; +} + +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static void +sparc_address_test (int arg) +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main (void) +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (0); + + /* On Solaris 2.4, changes by the child to the signal handler + also munge signal handlers in the parent. To detect this, + start by putting the parent's handler in a known state. */ + signal (SIGTERM, SIG_DFL); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* Alter the child's signal handler. */ + if (signal (SIGTERM, do_nothing) != SIG_DFL) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + return ( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child munge the parent's signal handler? */ + || signal (SIGTERM, SIG_DFL) != SIG_DFL + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 0 + ); + } +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_vfork_works=yes +else $as_nop + ac_cv_func_vfork_works=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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works" >&5 +printf "%s\n" "$ac_cv_func_vfork_works" >&6; } + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=$ac_cv_func_vfork + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 +printf "%s\n" "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +printf "%s\n" "#define HAVE_WORKING_VFORK 1" >>confdefs.h + +else + +printf "%s\n" "#define vfork fork" >>confdefs.h + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +printf "%s\n" "#define HAVE_WORKING_FORK 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +printf %s "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 test ${ac_cv_prog_CPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CC needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" 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. + # 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. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # 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 $as_nop + # 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 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +printf "%s\n" "$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. + # 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. */ +#include + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO" +then : + +else $as_nop + # 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 $as_nop + # 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_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$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 + + +if test $ac_cv_c_compiler_gnu = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 +printf %s "checking whether $CC needs -traditional... " >&6; } +if test ${ac_cv_prog_gcc_traditional+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_pattern="Autoconf.*'x'" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TIOCGETP +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1 +then : + ac_cv_prog_gcc_traditional=yes +else $as_nop + ac_cv_prog_gcc_traditional=no +fi +rm -rf conftest* + + + if test $ac_cv_prog_gcc_traditional = no; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +Autoconf TCGETA +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "$ac_pattern" >/dev/null 2>&1 +then : + ac_cv_prog_gcc_traditional=yes +fi +rm -rf conftest* + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 +printf "%s\n" "$ac_cv_prog_gcc_traditional" >&6; } + if test $ac_cv_prog_gcc_traditional = yes; then + CC="$CC -traditional" + fi +fi + +## _AIX is offended by rpl_malloc and rpl_realloc +#AC_FUNC_MALLOC +#AC_FUNC_REALLOC +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 +printf %s "checking return type of signal handlers... " >&6; } +if test ${ac_cv_type_signal+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include + +int +main (void) +{ +return *(signal (0, 0)) (0) == 1; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_type_signal=int +else $as_nop + ac_cv_type_signal=void +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 +printf "%s\n" "$ac_cv_type_signal" >&6; } + +printf "%s\n" "#define RETSIGTYPE $ac_cv_type_signal" >>confdefs.h + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether lstat correctly handles trailing slash" >&5 +printf %s "checking whether lstat correctly handles trailing slash... " >&6; } +if test ${ac_cv_func_lstat_dereferences_slashed_symlink+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -f conftest.sym conftest.file +echo >conftest.file +if test "$as_ln_s" = "ln -s" && ln -s conftest.file conftest.sym; then + if test "$cross_compiling" = yes +then : + case "$host_os" in # (( + # Guess yes on glibc systems. + *-gnu*) ac_cv_func_lstat_dereferences_slashed_symlink=yes ;; + # If we don't know, assume the worst. + *) ac_cv_func_lstat_dereferences_slashed_symlink=no ;; + esac +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ +struct stat sbuf; + /* Linux will dereference the symlink and fail, as required by POSIX. + That is better in the sense that it means we will not + have to compile and use the lstat wrapper. */ + return lstat ("conftest.sym/", &sbuf) == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_lstat_dereferences_slashed_symlink=yes +else $as_nop + ac_cv_func_lstat_dereferences_slashed_symlink=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 + # If the `ln -s' command failed, then we probably don't even + # have an lstat function. + ac_cv_func_lstat_dereferences_slashed_symlink=no +fi +rm -f conftest.sym conftest.file + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_lstat_dereferences_slashed_symlink" >&5 +printf "%s\n" "$ac_cv_func_lstat_dereferences_slashed_symlink" >&6; } + +test $ac_cv_func_lstat_dereferences_slashed_symlink = yes && + +printf "%s\n" "#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1" >>confdefs.h + + +if test "x$ac_cv_func_lstat_dereferences_slashed_symlink" = xno; then + case " $LIBOBJS " in + *" lstat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS lstat.$ac_objext" + ;; +esac + +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stat accepts an empty string" >&5 +printf %s "checking whether stat accepts an empty string... " >&6; } +if test ${ac_cv_func_stat_empty_string_bug+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "$cross_compiling" = yes +then : + ac_cv_func_stat_empty_string_bug=yes +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main (void) +{ +struct stat sbuf; + return stat ("", &sbuf) == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO" +then : + ac_cv_func_stat_empty_string_bug=no +else $as_nop + ac_cv_func_stat_empty_string_bug=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_stat_empty_string_bug" >&5 +printf "%s\n" "$ac_cv_func_stat_empty_string_bug" >&6; } +if test $ac_cv_func_stat_empty_string_bug = yes; then + case " $LIBOBJS " in + *" stat.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS stat.$ac_objext" + ;; +esac + + +printf "%s\n" "#define HAVE_STAT_EMPTY_STRING_BUG 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "getline" "ac_cv_func_getline" +if test "x$ac_cv_func_getline" = xyes +then : + printf "%s\n" "#define HAVE_GETLINE 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "isascii" "ac_cv_func_isascii" +if test "x$ac_cv_func_isascii" = xyes +then : + printf "%s\n" "#define HAVE_ISASCII 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "issetugid" "ac_cv_func_issetugid" +if test "x$ac_cv_func_issetugid" = xyes +then : + printf "%s\n" "#define HAVE_ISSETUGID 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "wcsdup" "ac_cv_func_wcsdup" +if test "x$ac_cv_func_wcsdup" = xyes +then : + printf "%s\n" "#define HAVE_WCSDUP 1" >>confdefs.h + +fi + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getpwnam_r and getpwuid_r are posix like" >&5 +printf %s "checking whether getpwnam_r and getpwuid_r are posix like... " >&6; } + # The prototype for the POSIX version is: + # int getpwnam_r(char *, struct passwd *, char *, size_t, struct passwd **) + # int getpwuid_r(uid_t, struct passwd *, char *, size_t, struct passwd **); + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #include +int +main (void) +{ +getpwnam_r(NULL, NULL, NULL, (size_t)0, NULL); + getpwuid_r((uid_t)0, NULL, NULL, (size_t)0, NULL); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +printf "%s\n" "#define HAVE_GETPW_R_POSIX 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether getpwnam_r and getpwuid_r are posix _draft_ like" >&5 +printf %s "checking whether getpwnam_r and getpwuid_r are posix _draft_ like... " >&6; } + # The prototype for the POSIX draft version is: + # struct passwd *getpwuid_r(uid_t, struct passwd *, char *, int); + # struct passwd *getpwnam_r(char *, struct passwd *, char *, int); + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + #include +int +main (void) +{ +getpwnam_r(NULL, NULL, NULL, (size_t)0); + getpwuid_r((uid_t)0, NULL, NULL, (size_t)0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + +printf "%s\n" "#define HAVE_GETPW_R_DRAFT 1" >>confdefs.h + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + + +ac_fn_c_check_member "$LINENO" "struct dirent" "d_namlen" "ac_cv_member_struct_dirent_d_namlen" "#if HAVE_DIRENT_H +#include +#endif + +" +if test "x$ac_cv_member_struct_dirent_d_namlen" = xyes +then : + +printf "%s\n" "#define HAVE_STRUCT_DIRENT_D_NAMLEN 1" >>confdefs.h + +fi + + + + +ac_config_files="$ac_config_files Makefile src/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$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+y} || &/ + 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$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=`printf "%s\n" "$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 + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } +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 -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$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 +as_nop=: +if test ${ZSH_VERSION+y} && (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 $as_nop + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; 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 + + +# 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 + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + 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 + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +# 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 + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$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_nop + 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_nop + 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 || +printf "%s\n" 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 + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +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 + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_echo='printf %s\n' +as_echo_n='printf %s' + +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=`printf "%s\n" "$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 || +printf "%s\n" 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 libedit $as_me 3.1, which was +generated by GNU Autoconf 2.71. 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 the package provider." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +libedit config.status 3.1 +configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2021 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 ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$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=`printf "%s\n" "$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 ) + printf "%s\n" "$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 + \printf "%s\n" "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 + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# 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' +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"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $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"`' +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"`' +LD='`$ECHO "$LD" | $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"`' +FILECMD='`$ECHO "$FILECMD" | $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"`' +lt_ar_flags='`$ECHO "$lt_ar_flags" | $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_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $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"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $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"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $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"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $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"`' + +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 SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +FILECMD \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +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_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +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; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + 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 \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that 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' + 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" ;; + + *) 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+y} || CONFIG_FILES=$config_files + test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers + test ${CONFIG_COMMANDS+y} || 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=`printf "%s\n" "$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 '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$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 || +printf "%s\n" 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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$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@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$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"; } && + { printf "%s\n" "$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 +printf "%s\n" "$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 + { + printf "%s\n" "/* $configure_input */" >&1 \ + && 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +printf "%s\n" "$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 + printf "%s\n" "/* $configure_input */" >&1 \ + && 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 || +printf "%s\n" 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) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf 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. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in #( + *\'*) : + eval set x "$CONFIG_FILES" ;; #( + *) : + set x $CONFIG_FILES ;; #( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that 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 +# Generated automatically by $as_me ($PACKAGE) $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. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 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 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 this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# 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 + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# 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 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 + +# 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 + +# A file(cmd) program that detects file types. +FILECMD=$lt_FILECMD + +# 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 (by configure). +lt_ar_flags=$lt_ar_flags + +# Flags to create an archive. +AR_FLAGS=\${ARFLAGS-"\$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 into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# 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 + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# 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 where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# 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 + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# 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 + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_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 set != "${COLLECT_NAMES+set}"; 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) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + 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 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + diff --git a/crypto/heimdal/lib/libedit/configure.ac b/crypto/heimdal/lib/libedit/configure.ac new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/configure.ac @@ -0,0 +1,109 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. +# +# Compile with debug symbols: +# CFLAGS="-ggdb -pedandic -O0" ./configure +# CFLAGS="-ggdb -Wall -Wextra -pedantic -O0" ./configure +# +# Verbose output can be enabled with +# "./configure --disable-silent-rules" or "make V=1" +# + +AC_PREREQ(2.61) +AC_INIT(libedit, [EL_RELEASE],, libedit-[EL_TIMESTAMP]) +AC_CONFIG_SRCDIR([src/el.c]) +AC_CONFIG_HEADER([config.h]) + +# features of Posix that are extensions to C (define _GNU_SOURCE) +AC_USE_SYSTEM_EXTENSIONS + +AM_INIT_AUTOMAKE +AC_PROG_LIBTOOL + +# libtool -version-info +AC_SUBST(LT_VERSION, [0:36:0]) + +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +# Checks for programs. +AC_PROG_CC_C99 +#AC_PROG_CC +AC_PROG_LN_S +AC_PROG_AWK +EL_MANTYPE + + +AC_CHECK_LIB(curses, tgetent,, + [AC_CHECK_LIB(ncurses, tgetent,, + [AC_MSG_ERROR([libcurses or libncurses are required!])] )] ) + + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_HEADER_SYS_WAIT +AC_CHECK_HEADERS([fcntl.h limits.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h unistd.h curses.h ncurses.h sys/cdefs.h]) + +AC_CHECK_HEADER([termios.h], [], [AC_MSG_ERROR([termios.h is required!])],[]) + +## include curses.h to prevent "Present But Cannot Be Compiled" +AC_CHECK_HEADERS([term.h],,, +[[#if HAVE_CURSES_H +# include +#elif HAVE_NCURSES_H +# include +#endif +]]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_CHECK_TYPES([u_int32_t]) + +AC_TRY_COMPILE([ +#include +#include +#if HAVE_STDINT_H +# include +#endif +], +[size_t x = SIZE_MAX;], +[have_size_max=yes], +[have_size_max=no]) +if test "$have_size_max" = yes; then + AC_DEFINE([HAVE_SIZE_MAX], [1], + [Define to 1 if if your system has SIZE_MAX]) +fi + +# Checks for library functions. +AC_FUNC_FORK +AC_PROG_GCC_TRADITIONAL +## _AIX is offended by rpl_malloc and rpl_realloc +#AC_FUNC_MALLOC +#AC_FUNC_REALLOC +AC_TYPE_SIGNAL +AC_FUNC_STAT +AC_CHECK_FUNCS([getline isascii issetugid wcsdup]) +EL_GETPW_R_POSIX +EL_GETPW_R_DRAFT + +AC_CHECK_MEMBER(struct dirent.d_namlen, +AC_DEFINE([HAVE_STRUCT_DIRENT_D_NAMLEN],[1], +[Define to 1 if struct dirent has member d_namlen]),, +[#if HAVE_DIRENT_H +#include +#endif +]) + +AH_BOTTOM([ +#include "sys.h" +#define SCCSID +#undef LIBC_SCCS +#define lint +]) + +AC_CONFIG_FILES([Makefile + src/Makefile +]) +AC_OUTPUT diff --git a/crypto/heimdal/lib/libedit/depcomp b/crypto/heimdal/lib/libedit/depcomp new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/libedit/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# 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 + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +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 -ne 0; then + 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 -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # 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. +## 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. + tr ' ' "$nl" < "$tmpdepfile" \ + | 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 -ne 0; then + 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 + make_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. + set_dir_from "$object" + set_base_from "$object" + 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 -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$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 ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + 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 + rmdir '$lockdir' + exit 1 + " 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. + rmdir "$lockdir" + break + else + # If 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. + set_dir_from "$object" + set_base_from "$object" + 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 -ne 0; then + 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,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_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. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool 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$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +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 -ne 0; then + 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" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + 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" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | 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" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | 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 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/crypto/heimdal/lib/libedit/install-sh b/crypto/heimdal/lib/libedit/install-sh new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/libedit/install-sh @@ -0,0 +1,541 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2020-11-14.01; # 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. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# 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_mkdir= + +# Desired mode of installed file. +mode=0755 + +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +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 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. + -p pass -p to $cpprog. + -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. + -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 + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ +" + +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 + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -p) cpprog="$cpprog -p";; + + -s) stripcmd=$stripprog;; + + -S) backupsuffix="$2" + shift;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +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 + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +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=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi + 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. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # 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 + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # 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 + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + 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=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_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 && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $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` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + + # 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 "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd "$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 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/crypto/heimdal/lib/libedit/ltmain.sh b/crypto/heimdal/lib/libedit/ltmain.sh new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/ltmain.sh @@ -0,0 +1,11429 @@ +#! /usr/bin/env sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2019-02-19.15 + +# libtool (GNU libtool) 2.4.7 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2019, 2021-2022 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 this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.7 +package_revision=2.4.7 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2004-2019, 2021 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +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 + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done +# These NLS vars are set unconditionally (bootstrap issue #24). Unset those +# in case the environment reset is needed later and the $save_* variant is not +# defined (see the code above). +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +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 + + +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} + + +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH + +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_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 +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_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 '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + +# require_check_ifs_backslash +# --------------------------- +# Check if we can use backslash as IFS='\' separator, and set +# $check_ifs_backshlash_broken to ':' or 'false'. +require_check_ifs_backslash=func_require_check_ifs_backslash +func_require_check_ifs_backslash () +{ + _G_save_IFS=$IFS + IFS='\' + _G_check_ifs_backshlash='a\\b' + for _G_i in $_G_check_ifs_backshlash + do + case $_G_i in + a) + check_ifs_backshlash_broken=false + ;; + '') + break + ;; + *) + check_ifs_backshlash_broken=: + break + ;; + esac + done + IFS=$_G_save_IFS + require_check_ifs_backslash=: +} + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +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. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# 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 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1+=\\ \$func_quote_arg_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1=\$$1\\ \$func_quote_arg_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# 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" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_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 "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# 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. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # 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 "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_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 "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_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_append 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_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || 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_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + 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 -z "$func_relative_path_tlibdir"; 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 -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_portable EVAL ARG +# ---------------------------- +# Internal function to portably implement func_quote_arg. Note that we still +# keep attention to performance here so we as much as possible try to avoid +# calling sed binary (so far O(N) complexity as long as func_append is O(1)). +func_quote_portable () +{ + $debug_cmd + + $require_check_ifs_backslash + + func_quote_portable_result=$2 + + # one-time-loop (easy break) + while true + do + if $1; then + func_quote_portable_result=`$ECHO "$2" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` + break + fi + + # Quote for eval. + case $func_quote_portable_result in + *[\\\`\"\$]*) + # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string + # contains the shell wildcard characters. + case $check_ifs_backshlash_broken$func_quote_portable_result in + :*|*[\[\*\?]*) + func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ + | $SED "$sed_quote_subst"` + break + ;; + esac + + func_quote_portable_old_IFS=$IFS + for _G_char in '\' '`' '"' '$' + do + # STATE($1) PREV($2) SEPARATOR($3) + set start "" "" + func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy + IFS=$_G_char + for _G_part in $func_quote_portable_result + do + case $1 in + quote) + func_append func_quote_portable_result "$3$2" + set quote "$_G_part" "\\$_G_char" + ;; + start) + set first "" "" + func_quote_portable_result= + ;; + first) + set quote "$_G_part" "" + ;; + esac + done + done + IFS=$func_quote_portable_old_IFS + ;; + *) ;; + esac + break + done + + func_quote_portable_unquoted_result=$func_quote_portable_result + case $func_quote_portable_result in + # double-quote args containing shell metacharacters to delay + # word splitting, command substitution 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_portable_result=\"$func_quote_portable_result\" + ;; + esac +} + + +# func_quotefast_eval ARG +# ----------------------- +# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', +# but optimized for speed. Result is stored in $func_quotefast_eval. +if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then + printf -v _GL_test_printf_tilde %q '~' + if test '\~' = "$_GL_test_printf_tilde"; then + func_quotefast_eval () + { + printf -v func_quotefast_eval_result %q "$1" + } + else + # Broken older Bash implementations. Make those faster too if possible. + func_quotefast_eval () + { + case $1 in + '~'*) + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + ;; + *) + printf -v func_quotefast_eval_result %q "$1" + ;; + esac + } + fi +else + func_quotefast_eval () + { + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + } +fi + + +# func_quote_arg MODEs ARG +# ------------------------ +# Quote one ARG to be evaled later. MODEs argument may contain zero or more +# specifiers listed below separated by ',' character. This function returns two +# values: +# i) func_quote_arg_result +# double-quoted (when needed), suitable for a subsequent eval +# ii) func_quote_arg_unquoted_result +# has all characters that are still active within double +# quotes backslashified. Available only if 'unquoted' is specified. +# +# Available modes: +# ---------------- +# 'eval' (default) +# - escape shell special characters +# 'expand' +# - the same as 'eval'; but do not quote variable references +# 'pretty' +# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might +# be used later in func_quote to get output like: 'echo "a b"' instead +# of 'echo a\ b'. This is slower than default on some shells. +# 'unquoted' +# - produce also $func_quote_arg_unquoted_result which does not contain +# wrapping double-quotes. +# +# Examples for 'func_quote_arg pretty,unquoted string': +# +# string | *_result | *_unquoted_result +# ------------+-----------------------+------------------- +# " | \" | \" +# a b | "a b" | a b +# "a b" | "\"a b\"" | \"a b\" +# * | "*" | * +# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" +# +# Examples for 'func_quote_arg pretty,unquoted,expand string': +# +# string | *_result | *_unquoted_result +# --------------+---------------------+-------------------- +# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" +func_quote_arg () +{ + _G_quote_expand=false + case ,$1, in + *,expand,*) + _G_quote_expand=: + ;; + esac + + case ,$1, in + *,pretty,*|*,expand,*|*,unquoted,*) + func_quote_portable $_G_quote_expand "$2" + func_quote_arg_result=$func_quote_portable_result + func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result + ;; + *) + # Faster quote-for-eval for some shells. + func_quotefast_eval "$2" + func_quote_arg_result=$func_quotefast_eval_result + ;; + esac +} + + +# func_quote MODEs ARGs... +# ------------------------ +# Quote all ARGs to be evaled later and join them into single command. See +# func_quote_arg's description for more info. +func_quote () +{ + $debug_cmd + _G_func_quote_mode=$1 ; shift + func_quote_result= + while test 0 -lt $#; do + func_quote_arg "$_G_func_quote_mode" "$1" + if test -n "$func_quote_result"; then + func_append func_quote_result " $func_quote_arg_result" + else + func_append func_quote_result "$func_quote_arg_result" + fi + shift + done +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# 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). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet 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 () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_arg pretty,expand "$_G_cmd" + eval "func_notquiet $func_quote_arg_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet 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 () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_arg expand,pretty "$_G_cmd" + eval "func_echo $func_quote_arg_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + 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 () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2010-2019, 2021 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# Copyright'. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug in processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# in the main code. A hook is just a list of function names that can be +# run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of hook functions to be called by +# FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_propagate_result FUNC_NAME_A FUNC_NAME_B +# --------------------------------------------- +# If the *_result variable of FUNC_NAME_A _is set_, assign its value to +# *_result variable of FUNC_NAME_B. +func_propagate_result () +{ + $debug_cmd + + func_propagate_result_result=: + if eval "test \"\${${1}_result+set}\" = set" + then + eval "${2}_result=\$${1}_result" + else + func_propagate_result_result=false + fi +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It's assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook functions." ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + func_unset "${_G_hook}_result" + eval $_G_hook '${1+"$@"}' + func_propagate_result $_G_hook func_run_hooks + if $func_propagate_result_result; then + eval set dummy "$func_run_hooks_result"; shift + fi + done +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list from your hook function. You may remove +# or edit any options that you action, and then pass back the remaining +# unprocessed options in '_result', escaped +# suitably for 'eval'. +# +# The '_result' variable is automatically unset +# before your hook gets called; for best performance, only set the +# *_result variable when necessary (i.e. don't call the 'func_quote' +# function unnecessarily because it can be an expensive operation on some +# machines). +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). Leave +# # my_options_prep_result variable intact. +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that, for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@" in case we need it later, +# # if $args_changed was set to 'true'. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# # Only call 'func_quote' here if we processed at least one argument. +# if $args_changed; then +# func_quote eval ${1+"$@"} +# my_silent_option_result=$func_quote_result +# fi +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + func_run_hooks func_options ${1+"$@"} + func_propagate_result func_run_hooks func_options_finish +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_options_quoted=false + + for my_func in options_prep parse_options validate_options options_finish + do + func_unset func_${my_func}_result + func_unset func_run_hooks_result + eval func_$my_func '${1+"$@"}' + func_propagate_result func_$my_func func_options + if $func_propagate_result_result; then + eval set dummy "$func_options_result"; shift + _G_options_quoted=: + fi + done + + $_G_options_quoted || { + # As we (func_options) are top-level options-parser function and + # nobody quoted "$@" for us yet, we need to do it explicitly for + # caller. + func_quote eval ${1+"$@"} + func_options_result=$func_quote_result + } +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + func_propagate_result func_run_hooks func_options_prep +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + _G_parse_options_requote=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + func_propagate_result func_run_hooks func_parse_options + if $func_propagate_result_result; then + eval set dummy "$func_parse_options_result"; shift + # Even though we may have changed "$@", we passed the "$@" array + # down into the hook and it quoted it for us (because we are in + # this if-branch). No need to quote it again. + _G_parse_options_requote=false + fi + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + # We expect that one of the options parsed in this function matches + # and thus we remove _G_opt from "$@" and need to re-quote. + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" >&2 + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_parse_options_requote=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_parse_options_requote=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac + + if $_G_match_parse_options; then + _G_parse_options_requote=: + fi + done + + if $_G_parse_options_requote; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + func_parse_options_result=$func_quote_result + fi +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + func_propagate_result func_run_hooks func_validate_options + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables +# after splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + if test "x$func_split_equals_lhs" = "x$1"; then + func_split_equals_rhs= + fi + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs=" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# 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. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +# The version message is extracted from the calling file's header +# comments, with leading '# ' stripped: +# 1. First display the progname and version +# 2. Followed by the header comment line matching /^# Written by / +# 3. Then a blank line followed by the first following line matching +# /^# Copyright / +# 4. Immediately followed by any lines between the previous matches, +# except lines preceding the intervening completely blank line. +# For example, see the header comments of this file. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /^# Written by /!b + s|^# ||; p; n + + :fwd2blnk + /./ { + n + b fwd2blnk + } + p; n + + :holdwrnt + s|^# || + s|^# *$|| + /^Copyright /!{ + /./H + n + b holdwrnt + } + + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + G + s|\(\n\)\n*|\1|g + p; q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.7' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --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 + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_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) + version: $progname (GNU libtool) 2.4.7 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "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 yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; 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 +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + _G_rc_lt_options_prep=: + + # 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 + ;; + *) + _G_rc_lt_options_prep=false + ;; + esac + + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote eval ${1+"$@"} + libtool_options_prep_result=$func_quote_result + fi +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + _G_rc_lt_parse_options=false + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done + + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + libtool_parse_options_result=$func_quote_result + fi +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + # Keeping compiler generated duplicates in $postdeps and $predeps is not + # harmful, and is necessary in a majority of systems that use it to satisfy + # symbol dependencies. + opt_duplicate_compiler_generated_deps=: + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; 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." + } + + # Pass back the unparsed argument list + func_quote eval ${1+"$@"} + libtool_validate_options_result=$func_quote_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +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= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# 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 | func_generated_by_libtool_p +} + +# 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 yes = "$lalib_p" +} + +# 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 () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# 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 () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 + 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 yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; 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 "$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 () +{ + $debug_cmd + + # 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + $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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # 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 yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot 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_arg pretty "$libobj" + test "X$libobj" != "X$func_quote_arg_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 yes = "$build_old_libs"; 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 no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; 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 yes = "$need_locks"; 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 warn = "$need_locks"; 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_arg pretty "$srcfile" + qsrcfile=$func_quote_arg_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; 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 warn = "$need_locks" && + 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 yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; 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 warn = "$need_locks" && + 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 no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && 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 + -Xcompiler 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 + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -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 + -Wa,FLAG + -Xassembler FLAG pass linker-specific FLAG directly to the assembler + -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 () +{ + $debug_cmd + + # 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 $opt_dry_run; then + # 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 + else + 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 + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + 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_quiet && 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 finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_arg pretty "$nonopt" + install_prog="$func_quote_arg_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_arg pretty "$arg" + func_append install_prog "$func_quote_arg_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=false + 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=: ;; + -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-m = "X$prev" && 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_arg pretty "$arg" + func_append install_prog " $func_quote_arg_result" + if test -n "$arg2"; then + func_quote_arg pretty "$arg2" + fi + func_append install_shared_prog " $func_quote_arg_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_arg pretty "$install_override_mode" + func_append install_shared_prog " -m $func_quote_arg_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=: + if $isdir; 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 + ;; + os2*) + 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 yes = "$build_old_libs"; 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=: + 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'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; 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_quiet || { + func_quote_arg expand,pretty "$relink_command" + eval "func_echo $func_quote_arg_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 install = "$opt_mode" && 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 () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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) $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 can'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 + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; 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 + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + 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[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + 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" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + 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" "${nlist}I"' + + # 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 + ;; + *) + 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_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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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_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 () +{ + $debug_cmd + + 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 + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + 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 + } + }'` + ;; + esac + 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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 that possess that section. Heuristic: eliminate + # all those that 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_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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; 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 yes = "$lock_old_archive_extraction"; 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 () +{ + $debug_cmd + + 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` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + 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 "$sed_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 where 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) $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\"" + + func_quote_arg pretty "$ECHO" + qECHO=$func_quote_arg_result + $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/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that 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) $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 yes = "$fast_install"; 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 yes = "$shlibpath_overrides_runpath" && 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 + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* 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_platform || defined ... */ +#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 +#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 (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]; + size_t 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 = (size_t) (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 (STREQ (str, pat)) + *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 + size_t 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) + { + size_t orig_value_len = strlen (orig_value); + size_t 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 #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\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 () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + 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 + # what 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 that 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= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + 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 yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && 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_arg pretty,unquoted "$arg" + qarg=$func_quote_arg_unquoted_result + func_append libtool_args " $func_quote_arg_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) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; 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 + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + 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 none = "$pic_object" && + test none = "$non_pic_object"; 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 none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; 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 none != "$non_pic_object"; 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 none = "$pic_object"; 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 + ;; + os2dllname) + os2dllname=$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 rpath = "$prev"; 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 + ;; + xassembler) + func_append compiler_flags " -Xassembler $qarg" + prev= + func_append compile_command " -Xassembler $qarg" + func_append finalize_command " -Xassembler $qarg" + 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-export-symbols = "X$arg"; 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 + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; 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-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && 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-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + 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 + ;; + # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. + -pthread) + case $host in + *solaris2*) ;; + *) + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + ;; + esac + continue + ;; + -mt|-mthreads|-kthread|-Kthread|-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 + ;; + + -os2dllname) + prev=os2dllname + 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_arg pretty "$flag" + func_append arg " $func_quote_arg_result" + func_append compiler_flags " $func_quote_arg_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_arg pretty "$flag" + func_append arg " $wl$func_quote_arg_result" + func_append compiler_flags " $wl$func_quote_arg_result" + func_append linker_flags " $func_quote_arg_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xassembler) + prev=xassembler + continue + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_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 + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC + # -Wa,* Pass flags directly to the assembler + -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*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*|-Wa,*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_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 none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; 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 none = "$pic_object"; 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 dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; 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_arg pretty "$arg" + arg=$func_quote_arg_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 yes = "$export_dynamic" && 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\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + 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 lib = "$linkmode"; 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=false + 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 lib,link = "$linkmode,$pass"; 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 lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; 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 dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; 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 .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; 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 conv = "$pass" && 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 conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; 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 link = "$pass"; 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 conv = "$pass"; 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=false + 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=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + 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." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; 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=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # 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 lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; 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 prog != "$linkmode" && test lib != "$linkmode"; 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 yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; 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 dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + 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 yes = "$installed"; 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 yes = "$hardcode_automatic" && 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 dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; 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 lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; 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 prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + 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 $linkalldeplibs; 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 prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + 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 $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + 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 built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; 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 yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; 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 lib = "$linkmode" && + test yes = "$hardcode_into_libs"; 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* | *os2*) + 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 prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; 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 cannot + # 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 no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; 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 yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; 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 prog = "$linkmode"; 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 yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; 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 prog = "$linkmode"; 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 prog = "$linkmode"; 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 unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; 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 cannot 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 yes = "$module"; 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 no = "$build_old_libs"; 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 lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; 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 no = "$link_static" && 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 no != "$link_all_deplibs"; 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 link = "$pass"; then + if test prog = "$linkmode"; 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 dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # 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= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=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 + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # 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 prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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 no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; 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 pass_all != "$deplibs_check_method"; 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 no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; 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 + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|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" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf | midnightbsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; 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 0 -ne "$loop"; 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 0 -ne "$loop"; 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 + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + 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 no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; 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 -n "$precious_files_regex"; 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 yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; 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 yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 yes = "$build_libtool_libs"; 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* | *-*-midnightbsd*) + # 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 yes = "$build_libtool_need_lc"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 none = "$deplibs_check_method"; 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 yes = "$droppeddeps"; then + if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || 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 relink = "$opt_mode" || 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 + func_dll_def_p "$export_symbols" || { + # 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 + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || 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 yes = "$try_normal_branch" \ + && { 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 : != "$skipped_export"; 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 : != "$skipped_export" && 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 yes = "$compiler_needs_object" && + 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 yes = "$thread_safe" && 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 relink = "$opt_mode"; 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 yes = "$module" && 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 : != "$skipped_export" && + 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 : != "$skipped_export" && test yes = "$with_gnu_ld"; 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 : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; 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 -z "$objlist" || + 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 1 -eq "$k"; 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 + + ${skipped_export-false} && { + 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 + } + + 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_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; 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 + + ${skipped_export-false} && { + 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 + } + + 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 yes = "$module" && 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=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; 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 relink = "$opt_mode"; 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 yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + 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 yes = "$build_libtool_libs" || 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 + + 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 + + test yes = "$build_libtool_libs" || { + 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 + } + + if test -n "$pic_flag" || test default != "$pic_mode"; 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" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && 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 CXX = "$tagname"; 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 yes = "$build_old_libs"; 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@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # 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 + } + + 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 yes = "$no_install"; 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 + + case $hardcode_action,$fast_install in + relink,*) + # 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" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # 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_arg pretty "$var_value" + relink_command="$var=$func_quote_arg_result; export $var; $relink_command" + fi + done + func_quote eval cd "`pwd`" + func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" + relink_command=$func_quote_arg_unquoted_result + 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 + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + 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 yes = "$build_libtool_libs"; 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 -z "$oldobjs"; 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 yes = "$build_old_libs" && 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_arg pretty,unquoted "$var_value" + relink_command="$var=$func_quote_arg_unquoted_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + func_quote eval cd "`pwd`" + relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + func_quote_arg pretty,unquoted "$relink_command" + relink_command=$func_quote_arg_unquoted_result + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; 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 -n "$bindir"; 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) $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 cannot 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 no,yes = "$installed,$need_relink"; 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 +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + 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=: ;; + -*) 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 . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; 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 $rmforce; 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" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || 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 none != "$pic_object"; 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 none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; 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 yes = "$fast_install" && 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 +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +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 +# where 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: diff --git a/crypto/heimdal/lib/libedit/missing b/crypto/heimdal/lib/libedit/missing new file mode 100755 --- /dev/null +++ b/crypto/heimdal/lib/libedit/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# Originally written 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 + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +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 + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/crypto/heimdal/lib/libedit/src/Makefile.am b/crypto/heimdal/lib/libedit/src/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/Makefile.am @@ -0,0 +1,43 @@ + +BUILT_SOURCES = vi.h emacs.h common.h fcns.h help.h func.h + +AHDR= vi.h emacs.h common.h +ASRC= $(srcdir)/vi.c $(srcdir)/emacs.c $(srcdir)/common.c + +vi.h: Makefile $(srcdir)/makelist $(srcdir)/vi.c + AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/vi.c > $@ + +emacs.h: Makefile $(srcdir)/makelist $(srcdir)/emacs.c + AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/emacs.c > $@ + +common.h: Makefile $(srcdir)/makelist $(srcdir)/common.c + AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/common.c > $@ + +fcns.h: Makefile $(srcdir)/makelist $(AHDR) + AWK=$(AWK) sh $(srcdir)/makelist -fh $(AHDR) > $@ + +func.h: Makefile $(srcdir)/makelist $(AHDR) + AWK=$(AWK) sh $(srcdir)/makelist -fc $(AHDR) > $@ + +help.h: Makefile $(srcdir)/makelist $(ASRC) + AWK=$(AWK) sh $(srcdir)/makelist -bh $(ASRC) > $@ + +CLEANFILES = $(BUILT_SOURCES) + +lib_LTLIBRARIES = libheimedit.la +libheimedit_la_SOURCES = \ + chared.c chartype.c common.c el.c eln.c emacs.c filecomplete.c hist.c \ + history.c historyn.c keymacro.c map.c parse.c prompt.c read.c readline.c \ + refresh.c search.c sig.c terminal.c tokenizer.c tokenizern.c tty.c \ + unvis.c vi.c vis.c wcsdup.c \ + chared.h chartype.h readline/readline.h el.h filecomplete.h \ + histedit.h hist.h keymacro.h map.h parse.h prompt.h read.h \ + refresh.h search.h sig.h sys.h terminal.h tty.h vis.h + +EXTRA_DIST = makelist shlib_version +EXTRA_DIST += histedit.h readline/readline.h + +nodist_libheimedit_la_SOURCES = $(BUILT_SOURCES) + +libheimedit_la_LDFLAGS = -no-undefined -version-info $(LT_VERSION) + diff --git a/crypto/heimdal/lib/libedit/src/Makefile.in b/crypto/heimdal/lib/libedit/src/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/Makefile.in @@ -0,0 +1,790 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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 +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +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)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libheimedit_la_LIBADD = +am_libheimedit_la_OBJECTS = chared.lo chartype.lo common.lo el.lo \ + eln.lo emacs.lo filecomplete.lo hist.lo history.lo historyn.lo \ + keymacro.lo map.lo parse.lo prompt.lo read.lo readline.lo \ + refresh.lo search.lo sig.lo terminal.lo tokenizer.lo \ + tokenizern.lo tty.lo unvis.lo vi.lo vis.lo wcsdup.lo +am__objects_1 = +nodist_libheimedit_la_OBJECTS = $(am__objects_1) +libheimedit_la_OBJECTS = $(am_libheimedit_la_OBJECTS) \ + $(nodist_libheimedit_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libheimedit_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libheimedit_la_LDFLAGS) $(LDFLAGS) -o \ + $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/chared.Plo ./$(DEPDIR)/chartype.Plo \ + ./$(DEPDIR)/common.Plo ./$(DEPDIR)/el.Plo ./$(DEPDIR)/eln.Plo \ + ./$(DEPDIR)/emacs.Plo ./$(DEPDIR)/filecomplete.Plo \ + ./$(DEPDIR)/hist.Plo ./$(DEPDIR)/history.Plo \ + ./$(DEPDIR)/historyn.Plo ./$(DEPDIR)/keymacro.Plo \ + ./$(DEPDIR)/map.Plo ./$(DEPDIR)/parse.Plo \ + ./$(DEPDIR)/prompt.Plo ./$(DEPDIR)/read.Plo \ + ./$(DEPDIR)/readline.Plo ./$(DEPDIR)/refresh.Plo \ + ./$(DEPDIR)/search.Plo ./$(DEPDIR)/sig.Plo \ + ./$(DEPDIR)/terminal.Plo ./$(DEPDIR)/tokenizer.Plo \ + ./$(DEPDIR)/tokenizern.Plo ./$(DEPDIR)/tty.Plo \ + ./$(DEPDIR)/unvis.Plo ./$(DEPDIR)/vi.Plo ./$(DEPDIR)/vis.Plo \ + ./$(DEPDIR)/wcsdup.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libheimedit_la_SOURCES) $(nodist_libheimedit_la_SOURCES) +DIST_SOURCES = $(libheimedit_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GREP = @GREP@ +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@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LT_VERSION = @LT_VERSION@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MANTYPE = @MANTYPE@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NROFF = @NROFF@ +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@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +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_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@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +runstatedir = @runstatedir@ +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_SOURCES = vi.h emacs.h common.h fcns.h help.h func.h +AHDR = vi.h emacs.h common.h +ASRC = $(srcdir)/vi.c $(srcdir)/emacs.c $(srcdir)/common.c +CLEANFILES = $(BUILT_SOURCES) +lib_LTLIBRARIES = libheimedit.la +libheimedit_la_SOURCES = \ + chared.c chartype.c common.c el.c eln.c emacs.c filecomplete.c hist.c \ + history.c historyn.c keymacro.c map.c parse.c prompt.c read.c readline.c \ + refresh.c search.c sig.c terminal.c tokenizer.c tokenizern.c tty.c \ + unvis.c vi.c vis.c wcsdup.c \ + chared.h chartype.h readline/readline.h el.h filecomplete.h \ + histedit.h hist.h keymacro.h map.h parse.h prompt.h read.h \ + refresh.h search.h sig.h sys.h terminal.h tty.h vis.h + +EXTRA_DIST = makelist shlib_version histedit.h readline/readline.h +nodist_libheimedit_la_SOURCES = $(BUILT_SOURCES) +libheimedit_la_LDFLAGS = -no-undefined -version-info $(LT_VERSION) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(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) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +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}; \ + } + +libheimedit.la: $(libheimedit_la_OBJECTS) $(libheimedit_la_DEPENDENCIES) $(EXTRA_libheimedit_la_DEPENDENCIES) + $(AM_V_CCLD)$(libheimedit_la_LINK) -rpath $(libdir) $(libheimedit_la_OBJECTS) $(libheimedit_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chared.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chartype.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/common.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/el.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eln.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emacs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filecomplete.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/history.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/historyn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/keymacro.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prompt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/read.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readline.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/refresh.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sig.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/terminal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tokenizer.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tokenizern.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tty.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unvis.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vis.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wcsdup.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) 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: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/chared.Plo + -rm -f ./$(DEPDIR)/chartype.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/el.Plo + -rm -f ./$(DEPDIR)/eln.Plo + -rm -f ./$(DEPDIR)/emacs.Plo + -rm -f ./$(DEPDIR)/filecomplete.Plo + -rm -f ./$(DEPDIR)/hist.Plo + -rm -f ./$(DEPDIR)/history.Plo + -rm -f ./$(DEPDIR)/historyn.Plo + -rm -f ./$(DEPDIR)/keymacro.Plo + -rm -f ./$(DEPDIR)/map.Plo + -rm -f ./$(DEPDIR)/parse.Plo + -rm -f ./$(DEPDIR)/prompt.Plo + -rm -f ./$(DEPDIR)/read.Plo + -rm -f ./$(DEPDIR)/readline.Plo + -rm -f ./$(DEPDIR)/refresh.Plo + -rm -f ./$(DEPDIR)/search.Plo + -rm -f ./$(DEPDIR)/sig.Plo + -rm -f ./$(DEPDIR)/terminal.Plo + -rm -f ./$(DEPDIR)/tokenizer.Plo + -rm -f ./$(DEPDIR)/tokenizern.Plo + -rm -f ./$(DEPDIR)/tty.Plo + -rm -f ./$(DEPDIR)/unvis.Plo + -rm -f ./$(DEPDIR)/vi.Plo + -rm -f ./$(DEPDIR)/vis.Plo + -rm -f ./$(DEPDIR)/wcsdup.Plo + -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-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 -f ./$(DEPDIR)/chared.Plo + -rm -f ./$(DEPDIR)/chartype.Plo + -rm -f ./$(DEPDIR)/common.Plo + -rm -f ./$(DEPDIR)/el.Plo + -rm -f ./$(DEPDIR)/eln.Plo + -rm -f ./$(DEPDIR)/emacs.Plo + -rm -f ./$(DEPDIR)/filecomplete.Plo + -rm -f ./$(DEPDIR)/hist.Plo + -rm -f ./$(DEPDIR)/history.Plo + -rm -f ./$(DEPDIR)/historyn.Plo + -rm -f ./$(DEPDIR)/keymacro.Plo + -rm -f ./$(DEPDIR)/map.Plo + -rm -f ./$(DEPDIR)/parse.Plo + -rm -f ./$(DEPDIR)/prompt.Plo + -rm -f ./$(DEPDIR)/read.Plo + -rm -f ./$(DEPDIR)/readline.Plo + -rm -f ./$(DEPDIR)/refresh.Plo + -rm -f ./$(DEPDIR)/search.Plo + -rm -f ./$(DEPDIR)/sig.Plo + -rm -f ./$(DEPDIR)/terminal.Plo + -rm -f ./$(DEPDIR)/tokenizer.Plo + -rm -f ./$(DEPDIR)/tokenizern.Plo + -rm -f ./$(DEPDIR)/tty.Plo + -rm -f ./$(DEPDIR)/unvis.Plo + -rm -f ./$(DEPDIR)/vi.Plo + -rm -f ./$(DEPDIR)/vis.Plo + -rm -f ./$(DEPDIR)/wcsdup.Plo + -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-libLTLIBRARIES + +.MAKE: all check install install-am install-exec install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ + ctags ctags-am 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-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 tags-am uninstall uninstall-am uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +vi.h: Makefile $(srcdir)/makelist $(srcdir)/vi.c + AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/vi.c > $@ + +emacs.h: Makefile $(srcdir)/makelist $(srcdir)/emacs.c + AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/emacs.c > $@ + +common.h: Makefile $(srcdir)/makelist $(srcdir)/common.c + AWK=$(AWK) sh $(srcdir)/makelist -h $(srcdir)/common.c > $@ + +fcns.h: Makefile $(srcdir)/makelist $(AHDR) + AWK=$(AWK) sh $(srcdir)/makelist -fh $(AHDR) > $@ + +func.h: Makefile $(srcdir)/makelist $(AHDR) + AWK=$(AWK) sh $(srcdir)/makelist -fc $(AHDR) > $@ + +help.h: Makefile $(srcdir)/makelist $(ASRC) + AWK=$(AWK) sh $(srcdir)/makelist -bh $(ASRC) > $@ + +# 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: diff --git a/crypto/heimdal/lib/libedit/src/chared.h b/crypto/heimdal/lib/libedit/src/chared.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/chared.h @@ -0,0 +1,155 @@ +/* $NetBSD: chared.h,v 1.30 2016/05/22 19:44:26 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)chared.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.chared.h: Character editor interface + */ +#ifndef _h_el_chared +#define _h_el_chared + +/* + * This is an issue of basic "vi" look-and-feel. Defining VI_MOVE works + * like real vi: i.e. the transition from command<->insert modes moves + * the cursor. + * + * On the other hand we really don't want to move the cursor, because + * all the editing commands don't include the character under the cursor. + * Probably the best fix is to make all the editing commands aware of + * this fact. + */ +#define VI_MOVE + +/* + * Undo information for vi - no undo in emacs (yet) + */ +typedef struct c_undo_t { + ssize_t len; /* length of saved line */ + int cursor; /* position of saved cursor */ + wchar_t *buf; /* full saved text */ +} c_undo_t; + +/* redo for vi */ +typedef struct c_redo_t { + wchar_t *buf; /* redo insert key sequence */ + wchar_t *pos; + wchar_t *lim; + el_action_t cmd; /* command to redo */ + wchar_t ch; /* char that invoked it */ + int count; + int action; /* from cv_action() */ +} c_redo_t; + +/* + * Current action information for vi + */ +typedef struct c_vcmd_t { + int action; + wchar_t *pos; +} c_vcmd_t; + +/* + * Kill buffer for emacs + */ +typedef struct c_kill_t { + wchar_t *buf; + wchar_t *last; + wchar_t *mark; +} c_kill_t; + +typedef void (*el_zfunc_t)(EditLine *, void *); +typedef const char *(*el_afunc_t)(void *, const char *); + +/* + * Note that we use both data structures because the user can bind + * commands from both editors! + */ +typedef struct el_chared_t { + c_undo_t c_undo; + c_kill_t c_kill; + c_redo_t c_redo; + c_vcmd_t c_vcmd; + el_zfunc_t c_resizefun; + el_afunc_t c_aliasfun; + void * c_resizearg; + void * c_aliasarg; +} el_chared_t; + + +#define STRQQ "\"\"" + +#define isglob(a) (strchr("*[]?", (a)) != NULL) + +#define NOP 0x00 +#define DELETE 0x01 +#define INSERT 0x02 +#define YANK 0x04 + +#define CHAR_FWD (+1) +#define CHAR_BACK (-1) + +#define MODE_INSERT 0 +#define MODE_REPLACE 1 +#define MODE_REPLACE_1 2 + + +libedit_private int cv__isword(wint_t); +libedit_private int cv__isWord(wint_t); +libedit_private void cv_delfini(EditLine *); +libedit_private wchar_t *cv__endword(wchar_t *, wchar_t *, int, int (*)(wint_t)); +libedit_private int ce__isword(wint_t); +libedit_private void cv_undo(EditLine *); +libedit_private void cv_yank(EditLine *, const wchar_t *, int); +libedit_private wchar_t *cv_next_word(EditLine*, wchar_t *, wchar_t *, int, + int (*)(wint_t)); +libedit_private wchar_t *cv_prev_word(wchar_t *, wchar_t *, int, int (*)(wint_t)); +libedit_private wchar_t *c__next_word(wchar_t *, wchar_t *, int, int (*)(wint_t)); +libedit_private wchar_t *c__prev_word(wchar_t *, wchar_t *, int, int (*)(wint_t)); +libedit_private void c_insert(EditLine *, int); +libedit_private void c_delbefore(EditLine *, int); +libedit_private void c_delbefore1(EditLine *); +libedit_private void c_delafter(EditLine *, int); +libedit_private void c_delafter1(EditLine *); +libedit_private int c_gets(EditLine *, wchar_t *, const wchar_t *); +libedit_private int c_hpos(EditLine *); + +libedit_private int ch_init(EditLine *); +libedit_private void ch_reset(EditLine *); +libedit_private int ch_resizefun(EditLine *, el_zfunc_t, void *); +libedit_private int ch_aliasfun(EditLine *, el_afunc_t, void *); +libedit_private int ch_enlargebufs(EditLine *, size_t); +libedit_private void ch_end(EditLine *); + +#endif /* _h_el_chared */ diff --git a/crypto/heimdal/lib/libedit/src/chared.c b/crypto/heimdal/lib/libedit/src/chared.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/chared.c @@ -0,0 +1,753 @@ +/* $NetBSD: chared.c,v 1.56 2016/05/22 19:44:26 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)chared.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: chared.c,v 1.56 2016/05/22 19:44:26 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * chared.c: Character editor utilities + */ +#include +#include +#include + +#include "el.h" +#include "common.h" +#include "fcns.h" + +/* value to leave unused in line buffer */ +#define EL_LEAVE 2 + +/* cv_undo(): + * Handle state for the vi undo command + */ +libedit_private void +cv_undo(EditLine *el) +{ + c_undo_t *vu = &el->el_chared.c_undo; + c_redo_t *r = &el->el_chared.c_redo; + size_t size; + + /* Save entire line for undo */ + size = (size_t)(el->el_line.lastchar - el->el_line.buffer); + vu->len = (ssize_t)size; + vu->cursor = (int)(el->el_line.cursor - el->el_line.buffer); + (void)memcpy(vu->buf, el->el_line.buffer, size * sizeof(*vu->buf)); + + /* save command info for redo */ + r->count = el->el_state.doingarg ? el->el_state.argument : 0; + r->action = el->el_chared.c_vcmd.action; + r->pos = r->buf; + r->cmd = el->el_state.thiscmd; + r->ch = el->el_state.thisch; +} + +/* cv_yank(): + * Save yank/delete data for paste + */ +libedit_private void +cv_yank(EditLine *el, const wchar_t *ptr, int size) +{ + c_kill_t *k = &el->el_chared.c_kill; + + (void)memcpy(k->buf, ptr, (size_t)size * sizeof(*k->buf)); + k->last = k->buf + size; +} + + +/* c_insert(): + * Insert num characters + */ +libedit_private void +c_insert(EditLine *el, int num) +{ + wchar_t *cp; + + if (el->el_line.lastchar + num >= el->el_line.limit) { + if (!ch_enlargebufs(el, (size_t)num)) + return; /* can't go past end of buffer */ + } + + if (el->el_line.cursor < el->el_line.lastchar) { + /* if I must move chars */ + for (cp = el->el_line.lastchar; cp >= el->el_line.cursor; cp--) + cp[num] = *cp; + } + el->el_line.lastchar += num; +} + + +/* c_delafter(): + * Delete num characters after the cursor + */ +libedit_private void +c_delafter(EditLine *el, int num) +{ + + if (el->el_line.cursor + num > el->el_line.lastchar) + num = (int)(el->el_line.lastchar - el->el_line.cursor); + + if (el->el_map.current != el->el_map.emacs) { + cv_undo(el); + cv_yank(el, el->el_line.cursor, num); + } + + if (num > 0) { + wchar_t *cp; + + for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) + *cp = cp[num]; + + el->el_line.lastchar -= num; + } +} + + +/* c_delafter1(): + * Delete the character after the cursor, do not yank + */ +libedit_private void +c_delafter1(EditLine *el) +{ + wchar_t *cp; + + for (cp = el->el_line.cursor; cp <= el->el_line.lastchar; cp++) + *cp = cp[1]; + + el->el_line.lastchar--; +} + + +/* c_delbefore(): + * Delete num characters before the cursor + */ +libedit_private void +c_delbefore(EditLine *el, int num) +{ + + if (el->el_line.cursor - num < el->el_line.buffer) + num = (int)(el->el_line.cursor - el->el_line.buffer); + + if (el->el_map.current != el->el_map.emacs) { + cv_undo(el); + cv_yank(el, el->el_line.cursor - num, num); + } + + if (num > 0) { + wchar_t *cp; + + for (cp = el->el_line.cursor - num; + cp <= el->el_line.lastchar; + cp++) + *cp = cp[num]; + + el->el_line.lastchar -= num; + } +} + + +/* c_delbefore1(): + * Delete the character before the cursor, do not yank + */ +libedit_private void +c_delbefore1(EditLine *el) +{ + wchar_t *cp; + + for (cp = el->el_line.cursor - 1; cp <= el->el_line.lastchar; cp++) + *cp = cp[1]; + + el->el_line.lastchar--; +} + + +/* ce__isword(): + * Return if p is part of a word according to emacs + */ +libedit_private int +ce__isword(wint_t p) +{ + return iswalnum(p) || wcschr(L"*?_-.[]~=", p) != NULL; +} + + +/* cv__isword(): + * Return if p is part of a word according to vi + */ +libedit_private int +cv__isword(wint_t p) +{ + if (iswalnum(p) || p == L'_') + return 1; + if (iswgraph(p)) + return 2; + return 0; +} + + +/* cv__isWord(): + * Return if p is part of a big word according to vi + */ +libedit_private int +cv__isWord(wint_t p) +{ + return !iswspace(p); +} + + +/* c__prev_word(): + * Find the previous word + */ +libedit_private wchar_t * +c__prev_word(wchar_t *p, wchar_t *low, int n, int (*wtest)(wint_t)) +{ + p--; + + while (n--) { + while ((p >= low) && !(*wtest)(*p)) + p--; + while ((p >= low) && (*wtest)(*p)) + p--; + } + + /* cp now points to one character before the word */ + p++; + if (p < low) + p = low; + /* cp now points where we want it */ + return p; +} + + +/* c__next_word(): + * Find the next word + */ +libedit_private wchar_t * +c__next_word(wchar_t *p, wchar_t *high, int n, int (*wtest)(wint_t)) +{ + while (n--) { + while ((p < high) && !(*wtest)(*p)) + p++; + while ((p < high) && (*wtest)(*p)) + p++; + } + if (p > high) + p = high; + /* p now points where we want it */ + return p; +} + +/* cv_next_word(): + * Find the next word vi style + */ +libedit_private wchar_t * +cv_next_word(EditLine *el, wchar_t *p, wchar_t *high, int n, + int (*wtest)(wint_t)) +{ + int test; + + while (n--) { + test = (*wtest)(*p); + while ((p < high) && (*wtest)(*p) == test) + p++; + /* + * vi historically deletes with cw only the word preserving the + * trailing whitespace! This is not what 'w' does.. + */ + if (n || el->el_chared.c_vcmd.action != (DELETE|INSERT)) + while ((p < high) && iswspace(*p)) + p++; + } + + /* p now points where we want it */ + if (p > high) + return high; + else + return p; +} + + +/* cv_prev_word(): + * Find the previous word vi style + */ +libedit_private wchar_t * +cv_prev_word(wchar_t *p, wchar_t *low, int n, int (*wtest)(wint_t)) +{ + int test; + + p--; + while (n--) { + while ((p > low) && iswspace(*p)) + p--; + test = (*wtest)(*p); + while ((p >= low) && (*wtest)(*p) == test) + p--; + } + p++; + + /* p now points where we want it */ + if (p < low) + return low; + else + return p; +} + + +/* cv_delfini(): + * Finish vi delete action + */ +libedit_private void +cv_delfini(EditLine *el) +{ + int size; + int action = el->el_chared.c_vcmd.action; + + if (action & INSERT) + el->el_map.current = el->el_map.key; + + if (el->el_chared.c_vcmd.pos == 0) + /* sanity */ + return; + + size = (int)(el->el_line.cursor - el->el_chared.c_vcmd.pos); + if (size == 0) + size = 1; + el->el_line.cursor = el->el_chared.c_vcmd.pos; + if (action & YANK) { + if (size > 0) + cv_yank(el, el->el_line.cursor, size); + else + cv_yank(el, el->el_line.cursor + size, -size); + } else { + if (size > 0) { + c_delafter(el, size); + re_refresh_cursor(el); + } else { + c_delbefore(el, -size); + el->el_line.cursor += size; + } + } + el->el_chared.c_vcmd.action = NOP; +} + + +/* cv__endword(): + * Go to the end of this word according to vi + */ +libedit_private wchar_t * +cv__endword(wchar_t *p, wchar_t *high, int n, int (*wtest)(wint_t)) +{ + int test; + + p++; + + while (n--) { + while ((p < high) && iswspace(*p)) + p++; + + test = (*wtest)(*p); + while ((p < high) && (*wtest)(*p) == test) + p++; + } + p--; + return p; +} + +/* ch_init(): + * Initialize the character editor + */ +libedit_private int +ch_init(EditLine *el) +{ + el->el_line.buffer = el_malloc(EL_BUFSIZ * + sizeof(*el->el_line.buffer)); + if (el->el_line.buffer == NULL) + return -1; + + (void) memset(el->el_line.buffer, 0, EL_BUFSIZ * + sizeof(*el->el_line.buffer)); + el->el_line.cursor = el->el_line.buffer; + el->el_line.lastchar = el->el_line.buffer; + el->el_line.limit = &el->el_line.buffer[EL_BUFSIZ - EL_LEAVE]; + + el->el_chared.c_undo.buf = el_malloc(EL_BUFSIZ * + sizeof(*el->el_chared.c_undo.buf)); + if (el->el_chared.c_undo.buf == NULL) + return -1; + (void) memset(el->el_chared.c_undo.buf, 0, EL_BUFSIZ * + sizeof(*el->el_chared.c_undo.buf)); + el->el_chared.c_undo.len = -1; + el->el_chared.c_undo.cursor = 0; + el->el_chared.c_redo.buf = el_malloc(EL_BUFSIZ * + sizeof(*el->el_chared.c_redo.buf)); + if (el->el_chared.c_redo.buf == NULL) + return -1; + el->el_chared.c_redo.pos = el->el_chared.c_redo.buf; + el->el_chared.c_redo.lim = el->el_chared.c_redo.buf + EL_BUFSIZ; + el->el_chared.c_redo.cmd = ED_UNASSIGNED; + + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_vcmd.pos = el->el_line.buffer; + + el->el_chared.c_kill.buf = el_malloc(EL_BUFSIZ * + sizeof(*el->el_chared.c_kill.buf)); + if (el->el_chared.c_kill.buf == NULL) + return -1; + (void) memset(el->el_chared.c_kill.buf, 0, EL_BUFSIZ * + sizeof(*el->el_chared.c_kill.buf)); + el->el_chared.c_kill.mark = el->el_line.buffer; + el->el_chared.c_kill.last = el->el_chared.c_kill.buf; + el->el_chared.c_resizefun = NULL; + el->el_chared.c_resizearg = NULL; + el->el_chared.c_aliasfun = NULL; + el->el_chared.c_aliasarg = NULL; + + el->el_map.current = el->el_map.key; + + el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */ + el->el_state.doingarg = 0; + el->el_state.metanext = 0; + el->el_state.argument = 1; + el->el_state.lastcmd = ED_UNASSIGNED; + + return 0; +} + +/* ch_reset(): + * Reset the character editor + */ +libedit_private void +ch_reset(EditLine *el) +{ + el->el_line.cursor = el->el_line.buffer; + el->el_line.lastchar = el->el_line.buffer; + + el->el_chared.c_undo.len = -1; + el->el_chared.c_undo.cursor = 0; + + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_vcmd.pos = el->el_line.buffer; + + el->el_chared.c_kill.mark = el->el_line.buffer; + + el->el_map.current = el->el_map.key; + + el->el_state.inputmode = MODE_INSERT; /* XXX: save a default */ + el->el_state.doingarg = 0; + el->el_state.metanext = 0; + el->el_state.argument = 1; + el->el_state.lastcmd = ED_UNASSIGNED; + + el->el_history.eventno = 0; +} + +/* ch_enlargebufs(): + * Enlarge line buffer to be able to hold twice as much characters. + * Returns 1 if successful, 0 if not. + */ +libedit_private int +ch_enlargebufs(EditLine *el, size_t addlen) +{ + size_t sz, newsz; + wchar_t *newbuffer, *oldbuf, *oldkbuf; + + sz = (size_t)(el->el_line.limit - el->el_line.buffer + EL_LEAVE); + newsz = sz * 2; + /* + * If newly required length is longer than current buffer, we need + * to make the buffer big enough to hold both old and new stuff. + */ + if (addlen > sz) { + while(newsz - sz < addlen) + newsz *= 2; + } + + /* + * Reallocate line buffer. + */ + newbuffer = el_realloc(el->el_line.buffer, newsz * sizeof(*newbuffer)); + if (!newbuffer) + return 0; + + /* zero the newly added memory, leave old data in */ + (void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer)); + + oldbuf = el->el_line.buffer; + + el->el_line.buffer = newbuffer; + el->el_line.cursor = newbuffer + (el->el_line.cursor - oldbuf); + el->el_line.lastchar = newbuffer + (el->el_line.lastchar - oldbuf); + /* don't set new size until all buffers are enlarged */ + el->el_line.limit = &newbuffer[sz - EL_LEAVE]; + + /* + * Reallocate kill buffer. + */ + newbuffer = el_realloc(el->el_chared.c_kill.buf, newsz * + sizeof(*newbuffer)); + if (!newbuffer) + return 0; + + /* zero the newly added memory, leave old data in */ + (void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer)); + + oldkbuf = el->el_chared.c_kill.buf; + + el->el_chared.c_kill.buf = newbuffer; + el->el_chared.c_kill.last = newbuffer + + (el->el_chared.c_kill.last - oldkbuf); + el->el_chared.c_kill.mark = el->el_line.buffer + + (el->el_chared.c_kill.mark - oldbuf); + + /* + * Reallocate undo buffer. + */ + newbuffer = el_realloc(el->el_chared.c_undo.buf, + newsz * sizeof(*newbuffer)); + if (!newbuffer) + return 0; + + /* zero the newly added memory, leave old data in */ + (void) memset(&newbuffer[sz], 0, (newsz - sz) * sizeof(*newbuffer)); + el->el_chared.c_undo.buf = newbuffer; + + newbuffer = el_realloc(el->el_chared.c_redo.buf, + newsz * sizeof(*newbuffer)); + if (!newbuffer) + return 0; + el->el_chared.c_redo.pos = newbuffer + + (el->el_chared.c_redo.pos - el->el_chared.c_redo.buf); + el->el_chared.c_redo.lim = newbuffer + + (el->el_chared.c_redo.lim - el->el_chared.c_redo.buf); + el->el_chared.c_redo.buf = newbuffer; + + if (!hist_enlargebuf(el, sz, newsz)) + return 0; + + /* Safe to set enlarged buffer size */ + el->el_line.limit = &el->el_line.buffer[newsz - EL_LEAVE]; + if (el->el_chared.c_resizefun) + (*el->el_chared.c_resizefun)(el, el->el_chared.c_resizearg); + return 1; +} + +/* ch_end(): + * Free the data structures used by the editor + */ +libedit_private void +ch_end(EditLine *el) +{ + el_free(el->el_line.buffer); + el->el_line.buffer = NULL; + el->el_line.limit = NULL; + el_free(el->el_chared.c_undo.buf); + el->el_chared.c_undo.buf = NULL; + el_free(el->el_chared.c_redo.buf); + el->el_chared.c_redo.buf = NULL; + el->el_chared.c_redo.pos = NULL; + el->el_chared.c_redo.lim = NULL; + el->el_chared.c_redo.cmd = ED_UNASSIGNED; + el_free(el->el_chared.c_kill.buf); + el->el_chared.c_kill.buf = NULL; + ch_reset(el); +} + + +/* el_insertstr(): + * Insert string at cursorI + */ +int +el_winsertstr(EditLine *el, const wchar_t *s) +{ + size_t len; + + if (s == NULL || (len = wcslen(s)) == 0) + return -1; + if (el->el_line.lastchar + len >= el->el_line.limit) { + if (!ch_enlargebufs(el, len)) + return -1; + } + + c_insert(el, (int)len); + while (*s) + *el->el_line.cursor++ = *s++; + return 0; +} + + +/* el_deletestr(): + * Delete num characters before the cursor + */ +void +el_deletestr(EditLine *el, int n) +{ + if (n <= 0) + return; + + if (el->el_line.cursor < &el->el_line.buffer[n]) + return; + + c_delbefore(el, n); /* delete before dot */ + el->el_line.cursor -= n; + if (el->el_line.cursor < el->el_line.buffer) + el->el_line.cursor = el->el_line.buffer; +} + +/* el_cursor(): + * Move the cursor to the left or the right of the current position + */ +int +el_cursor(EditLine *el, int n) +{ + if (n == 0) + goto out; + + el->el_line.cursor += n; + + if (el->el_line.cursor < el->el_line.buffer) + el->el_line.cursor = el->el_line.buffer; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; +out: + return (int)(el->el_line.cursor - el->el_line.buffer); +} + +/* c_gets(): + * Get a string + */ +libedit_private int +c_gets(EditLine *el, wchar_t *buf, const wchar_t *prompt) +{ + ssize_t len; + wchar_t *cp = el->el_line.buffer, ch; + + if (prompt) { + len = (ssize_t)wcslen(prompt); + (void)memcpy(cp, prompt, (size_t)len * sizeof(*cp)); + cp += len; + } + len = 0; + + for (;;) { + el->el_line.cursor = cp; + *cp = ' '; + el->el_line.lastchar = cp + 1; + re_refresh(el); + + if (el_wgetc(el, &ch) != 1) { + ed_end_of_file(el, 0); + len = -1; + break; + } + + switch (ch) { + + case L'\b': /* Delete and backspace */ + case 0177: + if (len == 0) { + len = -1; + break; + } + len--; + cp--; + continue; + + case 0033: /* ESC */ + case L'\r': /* Newline */ + case L'\n': + buf[len] = ch; + break; + + default: + if (len >= (ssize_t)(EL_BUFSIZ - 16)) + terminal_beep(el); + else { + buf[len++] = ch; + *cp++ = ch; + } + continue; + } + break; + } + + el->el_line.buffer[0] = '\0'; + el->el_line.lastchar = el->el_line.buffer; + el->el_line.cursor = el->el_line.buffer; + return (int)len; +} + + +/* c_hpos(): + * Return the current horizontal position of the cursor + */ +libedit_private int +c_hpos(EditLine *el) +{ + wchar_t *ptr; + + /* + * Find how many characters till the beginning of this line. + */ + if (el->el_line.cursor == el->el_line.buffer) + return 0; + else { + for (ptr = el->el_line.cursor - 1; + ptr >= el->el_line.buffer && *ptr != '\n'; + ptr--) + continue; + return (int)(el->el_line.cursor - ptr - 1); + } +} + +libedit_private int +ch_resizefun(EditLine *el, el_zfunc_t f, void *a) +{ + el->el_chared.c_resizefun = f; + el->el_chared.c_resizearg = a; + return 0; +} + +libedit_private int +ch_aliasfun(EditLine *el, el_afunc_t f, void *a) +{ + el->el_chared.c_aliasfun = f; + el->el_chared.c_aliasarg = a; + return 0; +} diff --git a/crypto/heimdal/lib/libedit/src/chartype.h b/crypto/heimdal/lib/libedit/src/chartype.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/chartype.h @@ -0,0 +1,114 @@ +/* $NetBSD: chartype.h,v 1.34 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _h_chartype_f +#define _h_chartype_f + +/* Ideally we should also test the value of the define to see if it + * supports non-BMP code points without requiring UTF-16, but nothing + * seems to actually advertise this properly, despite Unicode 3.1 having + * been around since 2001... */ +#if !defined(__NetBSD__) && !defined(__sun) && !(defined(__APPLE__) && defined(__MACH__)) && !defined(__OpenBSD__) && !defined(__FreeBSD__) +#ifndef __STDC_ISO_10646__ +/* In many places it is assumed that the first 127 code points are ASCII + * compatible, so ensure wchar_t indeed does ISO 10646 and not some other + * funky encoding that could break us in weird and wonderful ways. */ + #error wchar_t must store ISO 10646 characters +#endif +#endif + +/* Oh for a with char32_t and __STDC_UTF_32__ in it... + * ref: ISO/IEC DTR 19769 + */ +#if WCHAR_MAX < INT32_MAX +#warning Build environment does not support non-BMP characters +#endif + +/* + * Conversion buffer + */ +typedef struct ct_buffer_t { + char *cbuff; + size_t csize; + wchar_t *wbuff; + size_t wsize; +} ct_buffer_t; + +/* Encode a wide-character string and return the UTF-8 encoded result. */ +char *ct_encode_string(const wchar_t *, ct_buffer_t *); + +/* Decode a (multi)?byte string and return the wide-character string result. */ +wchar_t *ct_decode_string(const char *, ct_buffer_t *); + +/* Decode a (multi)?byte argv string array. + * The pointer returned must be free()d when done. */ +libedit_private wchar_t **ct_decode_argv(int, const char *[], ct_buffer_t *); + +/* Encode a character into the destination buffer, provided there is sufficient + * buffer space available. Returns the number of bytes used up (zero if the + * character cannot be encoded, -1 if there was not enough space available). */ +libedit_private ssize_t ct_encode_char(char *, size_t, wchar_t); +libedit_private size_t ct_enc_width(wchar_t); + +/* The maximum buffer size to hold the most unwieldy visual representation, + * in this case \U+nnnnn. */ +#define VISUAL_WIDTH_MAX ((size_t)8) + +/* The terminal is thought of in terms of X columns by Y lines. In the cases + * where a wide character takes up more than one column, the adjacent + * occupied column entries will contain this faux character. */ +#define MB_FILL_CHAR ((wchar_t)-1) + +/* Visual width of character c, taking into account ^? , \0177 and \U+nnnnn + * style visual expansions. */ +libedit_private int ct_visual_width(wchar_t); + +/* Turn the given character into the appropriate visual format, matching + * the width given by ct_visual_width(). Returns the number of characters used + * up, or -1 if insufficient space. Buffer length is in count of wchar_t's. */ +libedit_private ssize_t ct_visual_char(wchar_t *, size_t, wchar_t); + +/* Convert the given string into visual format, using the ct_visual_char() + * function. Uses a static buffer, so not threadsafe. */ +libedit_private const wchar_t *ct_visual_string(const wchar_t *, ct_buffer_t *); + + +/* printable character, use ct_visual_width() to find out display width */ +#define CHTYPE_PRINT ( 0) +/* control character found inside the ASCII portion of the charset */ +#define CHTYPE_ASCIICTL (-1) +/* a \t */ +#define CHTYPE_TAB (-2) +/* a \n */ +#define CHTYPE_NL (-3) +/* non-printable character */ +#define CHTYPE_NONPRINT (-4) +/* classification of character c, as one of the above defines */ +libedit_private int ct_chr_class(wchar_t c); + +#endif /* _chartype_f */ diff --git a/crypto/heimdal/lib/libedit/src/chartype.c b/crypto/heimdal/lib/libedit/src/chartype.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/chartype.c @@ -0,0 +1,340 @@ +/* $NetBSD: chartype.c,v 1.30 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * chartype.c: character classification and meta information + */ +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +__RCSID("$NetBSD: chartype.c,v 1.30 2016/05/09 21:46:56 christos Exp $"); +#endif /* not lint && not SCCSID */ + +#include +#include +#include + +#include "el.h" + +#define CT_BUFSIZ ((size_t)1024) + +static int ct_conv_cbuff_resize(ct_buffer_t *, size_t); +static int ct_conv_wbuff_resize(ct_buffer_t *, size_t); + +static int +ct_conv_cbuff_resize(ct_buffer_t *conv, size_t csize) +{ + void *p; + + if (csize <= conv->csize) + return 0; + + conv->csize = csize; + + p = el_realloc(conv->cbuff, conv->csize * sizeof(*conv->cbuff)); + if (p == NULL) { + conv->csize = 0; + el_free(conv->cbuff); + conv->cbuff = NULL; + return -1; + } + conv->cbuff = p; + return 0; +} + +static int +ct_conv_wbuff_resize(ct_buffer_t *conv, size_t wsize) +{ + void *p; + + if (wsize <= conv->wsize) + return 0; + + conv->wsize = wsize; + + p = el_realloc(conv->wbuff, conv->wsize * sizeof(*conv->wbuff)); + if (p == NULL) { + conv->wsize = 0; + el_free(conv->wbuff); + conv->wbuff = NULL; + return -1; + } + conv->wbuff = p; + return 0; +} + + +char * +ct_encode_string(const wchar_t *s, ct_buffer_t *conv) +{ + char *dst; + ssize_t used; + + if (!s) + return NULL; + + dst = conv->cbuff; + for (;;) { + used = (ssize_t)(dst - conv->cbuff); + if ((conv->csize - (size_t)used) < 5) { + if (ct_conv_cbuff_resize(conv, + conv->csize + CT_BUFSIZ) == -1) + return NULL; + dst = conv->cbuff + used; + } + if (!*s) + break; + used = ct_encode_char(dst, (size_t)5, *s); + if (used == -1) /* failed to encode, need more buffer space */ + abort(); + ++s; + dst += used; + } + *dst = '\0'; + return conv->cbuff; +} + +wchar_t * +ct_decode_string(const char *s, ct_buffer_t *conv) +{ + size_t len; + + if (!s) + return NULL; + + len = mbstowcs(NULL, s, (size_t)0); + if (len == (size_t)-1) + return NULL; + + if (conv->wsize < ++len) + if (ct_conv_wbuff_resize(conv, len + CT_BUFSIZ) == -1) + return NULL; + + mbstowcs(conv->wbuff, s, conv->wsize); + return conv->wbuff; +} + + +libedit_private wchar_t ** +ct_decode_argv(int argc, const char *argv[], ct_buffer_t *conv) +{ + size_t bufspace; + int i; + wchar_t *p; + wchar_t **wargv; + ssize_t bytes; + + /* Make sure we have enough space in the conversion buffer to store all + * the argv strings. */ + for (i = 0, bufspace = 0; i < argc; ++i) + bufspace += argv[i] ? strlen(argv[i]) + 1 : 0; + if (conv->wsize < ++bufspace) + if (ct_conv_wbuff_resize(conv, bufspace + CT_BUFSIZ) == -1) + return NULL; + + wargv = el_malloc((size_t)argc * sizeof(*wargv)); + + for (i = 0, p = conv->wbuff; i < argc; ++i) { + if (!argv[i]) { /* don't pass null pointers to mbstowcs */ + wargv[i] = NULL; + continue; + } else { + wargv[i] = p; + bytes = (ssize_t)mbstowcs(p, argv[i], bufspace); + } + if (bytes == -1) { + el_free(wargv); + return NULL; + } else + bytes++; /* include '\0' in the count */ + bufspace -= (size_t)bytes; + p += bytes; + } + + return wargv; +} + + +libedit_private size_t +ct_enc_width(wchar_t c) +{ + /* UTF-8 encoding specific values */ + if (c < 0x80) + return 1; + else if (c < 0x0800) + return 2; + else if (c < 0x10000) + return 3; + else if (c < 0x110000) + return 4; + else + return 0; /* not a valid codepoint */ +} + +libedit_private ssize_t +ct_encode_char(char *dst, size_t len, wchar_t c) +{ + ssize_t l = 0; + if (len < ct_enc_width(c)) + return -1; + l = wctomb(dst, c); + + if (l < 0) { + wctomb(NULL, L'\0'); + l = 0; + } + return l; +} + +libedit_private const wchar_t * +ct_visual_string(const wchar_t *s, ct_buffer_t *conv) +{ + wchar_t *dst; + ssize_t used; + + if (!s) + return NULL; + + if (ct_conv_wbuff_resize(conv, CT_BUFSIZ) == -1) + return NULL; + + used = 0; + dst = conv->wbuff; + while (*s) { + used = ct_visual_char(dst, + conv->wsize - (size_t)(dst - conv->wbuff), *s); + if (used != -1) { + ++s; + dst += used; + continue; + } + + /* failed to encode, need more buffer space */ + used = dst - conv->wbuff; + if (ct_conv_wbuff_resize(conv, conv->wsize + CT_BUFSIZ) == -1) + return NULL; + dst = conv->wbuff + used; + } + + if (dst >= (conv->wbuff + conv->wsize)) { /* sigh */ + used = dst - conv->wbuff; + if (ct_conv_wbuff_resize(conv, conv->wsize + CT_BUFSIZ) == -1) + return NULL; + dst = conv->wbuff + used; + } + + *dst = L'\0'; + return conv->wbuff; +} + + + +libedit_private int +ct_visual_width(wchar_t c) +{ + int t = ct_chr_class(c); + switch (t) { + case CHTYPE_ASCIICTL: + return 2; /* ^@ ^? etc. */ + case CHTYPE_TAB: + return 1; /* Hmm, this really need to be handled outside! */ + case CHTYPE_NL: + return 0; /* Should this be 1 instead? */ + case CHTYPE_PRINT: + return wcwidth(c); + case CHTYPE_NONPRINT: + if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */ + return 8; /* \U+12345 */ + else + return 7; /* \U+1234 */ + default: + return 0; /* should not happen */ + } +} + + +libedit_private ssize_t +ct_visual_char(wchar_t *dst, size_t len, wchar_t c) +{ + int t = ct_chr_class(c); + switch (t) { + case CHTYPE_TAB: + case CHTYPE_NL: + case CHTYPE_ASCIICTL: + if (len < 2) + return -1; /* insufficient space */ + *dst++ = '^'; + if (c == '\177') + *dst = '?'; /* DEL -> ^? */ + else + *dst = c | 0100; /* uncontrolify it */ + return 2; + case CHTYPE_PRINT: + if (len < 1) + return -1; /* insufficient space */ + *dst = c; + return 1; + case CHTYPE_NONPRINT: + /* we only use single-width glyphs for display, + * so this is right */ + if ((ssize_t)len < ct_visual_width(c)) + return -1; /* insufficient space */ + *dst++ = '\\'; + *dst++ = 'U'; + *dst++ = '+'; +#define tohexdigit(v) "0123456789ABCDEF"[v] + if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */ + *dst++ = tohexdigit(((unsigned int) c >> 16) & 0xf); + *dst++ = tohexdigit(((unsigned int) c >> 12) & 0xf); + *dst++ = tohexdigit(((unsigned int) c >> 8) & 0xf); + *dst++ = tohexdigit(((unsigned int) c >> 4) & 0xf); + *dst = tohexdigit(((unsigned int) c ) & 0xf); + return c > 0xffff ? 8 : 7; + /*FALLTHROUGH*/ + /* these two should be handled outside this function */ + default: /* we should never hit the default */ + return 0; + } +} + + + + +libedit_private int +ct_chr_class(wchar_t c) +{ + if (c == '\t') + return CHTYPE_TAB; + else if (c == '\n') + return CHTYPE_NL; + else if (c < 0x100 && iswcntrl(c)) + return CHTYPE_ASCIICTL; + else if (iswprint(c)) + return CHTYPE_PRINT; + else + return CHTYPE_NONPRINT; +} diff --git a/crypto/heimdal/lib/libedit/src/common.c b/crypto/heimdal/lib/libedit/src/common.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/common.c @@ -0,0 +1,835 @@ +/* $NetBSD: common.c,v 1.47 2016/05/22 19:44:26 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)common.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: common.c,v 1.47 2016/05/22 19:44:26 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * common.c: Common Editor functions + */ +#include +#include + +#include "el.h" +#include "common.h" +#include "fcns.h" +#include "parse.h" +#include "vi.h" + +/* ed_end_of_file(): + * Indicate end of file + * [^D] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_end_of_file(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + re_goto_bottom(el); + *el->el_line.lastchar = '\0'; + return CC_EOF; +} + + +/* ed_insert(): + * Add character to the line + * Insert a character [bound to all insert keys] + */ +libedit_private el_action_t +ed_insert(EditLine *el, wint_t c) +{ + int count = el->el_state.argument; + + if (c == '\0') + return CC_ERROR; + + if (el->el_line.lastchar + el->el_state.argument >= + el->el_line.limit) { + /* end of buffer space, try to allocate more */ + if (!ch_enlargebufs(el, (size_t) count)) + return CC_ERROR; /* error allocating more */ + } + + if (count == 1) { + if (el->el_state.inputmode == MODE_INSERT + || el->el_line.cursor >= el->el_line.lastchar) + c_insert(el, 1); + + *el->el_line.cursor++ = c; + re_fastaddc(el); /* fast refresh for one char. */ + } else { + if (el->el_state.inputmode != MODE_REPLACE_1) + c_insert(el, el->el_state.argument); + + while (count-- && el->el_line.cursor < el->el_line.lastchar) + *el->el_line.cursor++ = c; + re_refresh(el); + } + + if (el->el_state.inputmode == MODE_REPLACE_1) + return vi_command_mode(el, 0); + + return CC_NORM; +} + + +/* ed_delete_prev_word(): + * Delete from beginning of current word to cursor + * [M-^?] [^W] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_delete_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *cp, *p, *kp; + + if (el->el_line.cursor == el->el_line.buffer) + return CC_ERROR; + + cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, + el->el_state.argument, ce__isword); + + for (p = cp, kp = el->el_chared.c_kill.buf; p < el->el_line.cursor; p++) + *kp++ = *p; + el->el_chared.c_kill.last = kp; + + c_delbefore(el, (int)(el->el_line.cursor - cp));/* delete before dot */ + el->el_line.cursor = cp; + if (el->el_line.cursor < el->el_line.buffer) + el->el_line.cursor = el->el_line.buffer; /* bounds check */ + return CC_REFRESH; +} + + +/* ed_delete_next_char(): + * Delete character under cursor + * [^D] [x] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_delete_next_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ +#ifdef DEBUG_EDIT +#define EL el->el_line + (void) fprintf(el->el_errfile, + "\nD(b: %p(%ls) c: %p(%ls) last: %p(%ls) limit: %p(%ls)\n", + EL.buffer, EL.buffer, EL.cursor, EL.cursor, EL.lastchar, + EL.lastchar, EL.limit, EL.limit); +#endif + if (el->el_line.cursor == el->el_line.lastchar) { + /* if I'm at the end */ + if (el->el_map.type == MAP_VI) { + if (el->el_line.cursor == el->el_line.buffer) { + /* if I'm also at the beginning */ +#ifdef KSHVI + return CC_ERROR; +#else + /* then do an EOF */ + terminal_writec(el, c); + return CC_EOF; +#endif + } else { +#ifdef KSHVI + el->el_line.cursor--; +#else + return CC_ERROR; +#endif + } + } else + return CC_ERROR; + } + c_delafter(el, el->el_state.argument); /* delete after dot */ + if (el->el_map.type == MAP_VI && + el->el_line.cursor >= el->el_line.lastchar && + el->el_line.cursor > el->el_line.buffer) + /* bounds check */ + el->el_line.cursor = el->el_line.lastchar - 1; + return CC_REFRESH; +} + + +/* ed_kill_line(): + * Cut to the end of line + * [^K] [^K] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_kill_line(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *kp, *cp; + + cp = el->el_line.cursor; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.lastchar) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + /* zap! -- delete to end */ + el->el_line.lastchar = el->el_line.cursor; + return CC_REFRESH; +} + + +/* ed_move_to_end(): + * Move cursor to the end of line + * [^E] [^E] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_move_to_end(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_line.cursor = el->el_line.lastchar; + if (el->el_map.type == MAP_VI) { + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } +#ifdef VI_MOVE + el->el_line.cursor--; +#endif + } + return CC_CURSOR; +} + + +/* ed_move_to_beg(): + * Move cursor to the beginning of line + * [^A] [^A] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_move_to_beg(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_line.cursor = el->el_line.buffer; + + if (el->el_map.type == MAP_VI) { + /* We want FIRST non space character */ + while (iswspace(*el->el_line.cursor)) + el->el_line.cursor++; + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + } + return CC_CURSOR; +} + + +/* ed_transpose_chars(): + * Exchange the character to the left of the cursor with the one under it + * [^T] [^T] + */ +libedit_private el_action_t +ed_transpose_chars(EditLine *el, wint_t c) +{ + + if (el->el_line.cursor < el->el_line.lastchar) { + if (el->el_line.lastchar <= &el->el_line.buffer[1]) + return CC_ERROR; + else + el->el_line.cursor++; + } + if (el->el_line.cursor > &el->el_line.buffer[1]) { + /* must have at least two chars entered */ + c = el->el_line.cursor[-2]; + el->el_line.cursor[-2] = el->el_line.cursor[-1]; + el->el_line.cursor[-1] = c; + return CC_REFRESH; + } else + return CC_ERROR; +} + + +/* ed_next_char(): + * Move to the right one character + * [^F] [^F] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_next_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *lim = el->el_line.lastchar; + + if (el->el_line.cursor >= lim || + (el->el_line.cursor == lim - 1 && + el->el_map.type == MAP_VI && + el->el_chared.c_vcmd.action == NOP)) + return CC_ERROR; + + el->el_line.cursor += el->el_state.argument; + if (el->el_line.cursor > lim) + el->el_line.cursor = lim; + + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* ed_prev_word(): + * Move to the beginning of the current word + * [M-b] [b] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor == el->el_line.buffer) + return CC_ERROR; + + el->el_line.cursor = c__prev_word(el->el_line.cursor, + el->el_line.buffer, + el->el_state.argument, + ce__isword); + + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* ed_prev_char(): + * Move to the left one character + * [^B] [^B] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor > el->el_line.buffer) { + el->el_line.cursor -= el->el_state.argument; + if (el->el_line.cursor < el->el_line.buffer) + el->el_line.cursor = el->el_line.buffer; + + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; + } else + return CC_ERROR; +} + + +/* ed_quoted_insert(): + * Add the next character typed verbatim + * [^V] [^V] + */ +libedit_private el_action_t +ed_quoted_insert(EditLine *el, wint_t c) +{ + int num; + + tty_quotemode(el); + num = el_wgetc(el, &c); + tty_noquotemode(el); + if (num == 1) + return ed_insert(el, c); + else + return ed_end_of_file(el, 0); +} + + +/* ed_digit(): + * Adds to argument or enters a digit + */ +libedit_private el_action_t +ed_digit(EditLine *el, wint_t c) +{ + + if (!iswdigit(c)) + return CC_ERROR; + + if (el->el_state.doingarg) { + /* if doing an arg, add this in... */ + if (el->el_state.lastcmd == EM_UNIVERSAL_ARGUMENT) + el->el_state.argument = c - '0'; + else { + if (el->el_state.argument > 1000000) + return CC_ERROR; + el->el_state.argument = + (el->el_state.argument * 10) + (c - '0'); + } + return CC_ARGHACK; + } + + return ed_insert(el, c); +} + + +/* ed_argument_digit(): + * Digit that starts argument + * For ESC-n + */ +libedit_private el_action_t +ed_argument_digit(EditLine *el, wint_t c) +{ + + if (!iswdigit(c)) + return CC_ERROR; + + if (el->el_state.doingarg) { + if (el->el_state.argument > 1000000) + return CC_ERROR; + el->el_state.argument = (el->el_state.argument * 10) + + (c - '0'); + } else { /* else starting an argument */ + el->el_state.argument = c - '0'; + el->el_state.doingarg = 1; + } + return CC_ARGHACK; +} + + +/* ed_unassigned(): + * Indicates unbound character + * Bound to keys that are not assigned + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_unassigned(EditLine *el __attribute__((__unused__)), + wint_t c __attribute__((__unused__))) +{ + + return CC_ERROR; +} + + +/* ed_ignore(): + * Input characters that have no effect + * [^C ^O ^Q ^S ^Z ^\ ^]] [^C ^O ^Q ^S ^\] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_ignore(EditLine *el __attribute__((__unused__)), + wint_t c __attribute__((__unused__))) +{ + + return CC_NORM; +} + + +/* ed_newline(): + * Execute command + * [^J] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_newline(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + re_goto_bottom(el); + *el->el_line.lastchar++ = '\n'; + *el->el_line.lastchar = '\0'; + return CC_NEWLINE; +} + + +/* ed_delete_prev_char(): + * Delete the character to the left of the cursor + * [^?] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor <= el->el_line.buffer) + return CC_ERROR; + + c_delbefore(el, el->el_state.argument); + el->el_line.cursor -= el->el_state.argument; + if (el->el_line.cursor < el->el_line.buffer) + el->el_line.cursor = el->el_line.buffer; + return CC_REFRESH; +} + + +/* ed_clear_screen(): + * Clear screen leaving current line at the top + * [^L] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_clear_screen(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + terminal_clear_screen(el); /* clear the whole real screen */ + re_clear_display(el); /* reset everything */ + return CC_REFRESH; +} + + +/* ed_redisplay(): + * Redisplay everything + * ^R + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_redisplay(EditLine *el __attribute__((__unused__)), + wint_t c __attribute__((__unused__))) +{ + + return CC_REDISPLAY; +} + + +/* ed_start_over(): + * Erase current line and start from scratch + * [^G] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_start_over(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + ch_reset(el); + return CC_REFRESH; +} + + +/* ed_sequence_lead_in(): + * First character in a bound sequence + * Placeholder for external keys + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_sequence_lead_in(EditLine *el __attribute__((__unused__)), + wint_t c __attribute__((__unused__))) +{ + + return CC_NORM; +} + + +/* ed_prev_history(): + * Move to the previous history line + * [^P] [k] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_prev_history(EditLine *el, wint_t c __attribute__((__unused__))) +{ + char beep = 0; + int sv_event = el->el_history.eventno; + + el->el_chared.c_undo.len = -1; + *el->el_line.lastchar = '\0'; /* just in case */ + + if (el->el_history.eventno == 0) { /* save the current buffer + * away */ + (void) wcsncpy(el->el_history.buf, el->el_line.buffer, + EL_BUFSIZ); + el->el_history.last = el->el_history.buf + + (el->el_line.lastchar - el->el_line.buffer); + } + el->el_history.eventno += el->el_state.argument; + + if (hist_get(el) == CC_ERROR) { + if (el->el_map.type == MAP_VI) { + el->el_history.eventno = sv_event; + } + beep = 1; + /* el->el_history.eventno was fixed by first call */ + (void) hist_get(el); + } + if (beep) + return CC_REFRESH_BEEP; + return CC_REFRESH; +} + + +/* ed_next_history(): + * Move to the next history line + * [^N] [j] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_next_history(EditLine *el, wint_t c __attribute__((__unused__))) +{ + el_action_t beep = CC_REFRESH, rval; + + el->el_chared.c_undo.len = -1; + *el->el_line.lastchar = '\0'; /* just in case */ + + el->el_history.eventno -= el->el_state.argument; + + if (el->el_history.eventno < 0) { + el->el_history.eventno = 0; + beep = CC_REFRESH_BEEP; + } + rval = hist_get(el); + if (rval == CC_REFRESH) + return beep; + return rval; + +} + + +/* ed_search_prev_history(): + * Search previous in history for a line matching the current + * next search history [M-P] [K] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_search_prev_history(EditLine *el, wint_t c __attribute__((__unused__))) +{ + const wchar_t *hp; + int h; + int found = 0; + + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_undo.len = -1; + *el->el_line.lastchar = '\0'; /* just in case */ + if (el->el_history.eventno < 0) { +#ifdef DEBUG_EDIT + (void) fprintf(el->el_errfile, + "e_prev_search_hist(): eventno < 0;\n"); +#endif + el->el_history.eventno = 0; + return CC_ERROR; + } + if (el->el_history.eventno == 0) { + (void) wcsncpy(el->el_history.buf, el->el_line.buffer, + EL_BUFSIZ); + el->el_history.last = el->el_history.buf + + (el->el_line.lastchar - el->el_line.buffer); + } + if (el->el_history.ref == NULL) + return CC_ERROR; + + hp = HIST_FIRST(el); + if (hp == NULL) + return CC_ERROR; + + c_setpat(el); /* Set search pattern !! */ + + for (h = 1; h <= el->el_history.eventno; h++) + hp = HIST_NEXT(el); + + while (hp != NULL) { +#ifdef SDEBUG + (void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp); +#endif + if ((wcsncmp(hp, el->el_line.buffer, (size_t) + (el->el_line.lastchar - el->el_line.buffer)) || + hp[el->el_line.lastchar - el->el_line.buffer]) && + c_hmatch(el, hp)) { + found = 1; + break; + } + h++; + hp = HIST_NEXT(el); + } + + if (!found) { +#ifdef SDEBUG + (void) fprintf(el->el_errfile, "not found\n"); +#endif + return CC_ERROR; + } + el->el_history.eventno = h; + + return hist_get(el); +} + + +/* ed_search_next_history(): + * Search next in history for a line matching the current + * [M-N] [J] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_search_next_history(EditLine *el, wint_t c __attribute__((__unused__))) +{ + const wchar_t *hp; + int h; + int found = 0; + + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_undo.len = -1; + *el->el_line.lastchar = '\0'; /* just in case */ + + if (el->el_history.eventno == 0) + return CC_ERROR; + + if (el->el_history.ref == NULL) + return CC_ERROR; + + hp = HIST_FIRST(el); + if (hp == NULL) + return CC_ERROR; + + c_setpat(el); /* Set search pattern !! */ + + for (h = 1; h < el->el_history.eventno && hp; h++) { +#ifdef SDEBUG + (void) fprintf(el->el_errfile, "Comparing with \"%s\"\n", hp); +#endif + if ((wcsncmp(hp, el->el_line.buffer, (size_t) + (el->el_line.lastchar - el->el_line.buffer)) || + hp[el->el_line.lastchar - el->el_line.buffer]) && + c_hmatch(el, hp)) + found = h; + hp = HIST_NEXT(el); + } + + if (!found) { /* is it the current history number? */ + if (!c_hmatch(el, el->el_history.buf)) { +#ifdef SDEBUG + (void) fprintf(el->el_errfile, "not found\n"); +#endif + return CC_ERROR; + } + } + el->el_history.eventno = found; + + return hist_get(el); +} + + +/* ed_prev_line(): + * Move up one line + * Could be [k] [^p] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_prev_line(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *ptr; + int nchars = c_hpos(el); + + /* + * Move to the line requested + */ + if (*(ptr = el->el_line.cursor) == '\n') + ptr--; + + for (; ptr >= el->el_line.buffer; ptr--) + if (*ptr == '\n' && --el->el_state.argument <= 0) + break; + + if (el->el_state.argument > 0) + return CC_ERROR; + + /* + * Move to the beginning of the line + */ + for (ptr--; ptr >= el->el_line.buffer && *ptr != '\n'; ptr--) + continue; + + /* + * Move to the character requested + */ + for (ptr++; + nchars-- > 0 && ptr < el->el_line.lastchar && *ptr != '\n'; + ptr++) + continue; + + el->el_line.cursor = ptr; + return CC_CURSOR; +} + + +/* ed_next_line(): + * Move down one line + * Could be [j] [^n] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_next_line(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *ptr; + int nchars = c_hpos(el); + + /* + * Move to the line requested + */ + for (ptr = el->el_line.cursor; ptr < el->el_line.lastchar; ptr++) + if (*ptr == '\n' && --el->el_state.argument <= 0) + break; + + if (el->el_state.argument > 0) + return CC_ERROR; + + /* + * Move to the character requested + */ + for (ptr++; + nchars-- > 0 && ptr < el->el_line.lastchar && *ptr != '\n'; + ptr++) + continue; + + el->el_line.cursor = ptr; + return CC_CURSOR; +} + + +/* ed_command(): + * Editline extended command + * [M-X] [:] + */ +libedit_private el_action_t +/*ARGSUSED*/ +ed_command(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t tmpbuf[EL_BUFSIZ]; + int tmplen; + + tmplen = c_gets(el, tmpbuf, L"\n: "); + terminal__putc(el, '\n'); + + if (tmplen < 0 || (tmpbuf[tmplen] = 0, parse_line(el, tmpbuf)) == -1) + terminal_beep(el); + + el->el_map.current = el->el_map.key; + re_clear_display(el); + return CC_REFRESH; +} diff --git a/crypto/heimdal/lib/libedit/src/el.h b/crypto/heimdal/lib/libedit/src/el.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/el.h @@ -0,0 +1,153 @@ +/* $NetBSD: el.h,v 1.41 2016/05/24 15:00:45 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)el.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.h: Internal structures. + */ +#ifndef _h_el +#define _h_el +/* + * Local defaults + */ +#define KSHVI +#define VIDEFAULT +#define ANCHOR + +#include "histedit.h" +#include "chartype.h" + +#define EL_BUFSIZ ((size_t)1024) /* Maximum line size */ + +#define HANDLE_SIGNALS 0x01 +#define NO_TTY 0x02 +#define EDIT_DISABLED 0x04 +#define UNBUFFERED 0x08 +#define CHARSET_IS_UTF8 0x10 +#define NARROW_HISTORY 0x40 + +typedef unsigned char el_action_t; /* Index to command array */ + +typedef struct coord_t { /* Position on the screen */ + int h; + int v; +} coord_t; + +typedef struct el_line_t { + wchar_t *buffer; /* Input line */ + wchar_t *cursor; /* Cursor position */ + wchar_t *lastchar; /* Last character */ + const wchar_t *limit; /* Max position */ +} el_line_t; + +/* + * Editor state + */ +typedef struct el_state_t { + int inputmode; /* What mode are we in? */ + int doingarg; /* Are we getting an argument? */ + int argument; /* Numeric argument */ + int metanext; /* Is the next char a meta char */ + el_action_t lastcmd; /* Previous command */ + el_action_t thiscmd; /* this command */ + wchar_t thisch; /* char that generated it */ +} el_state_t; + +/* + * Until we come up with something better... + */ +#define el_malloc(a) malloc(a) +#define el_realloc(a,b) realloc(a, b) +#define el_free(a) free(a) + +#include "tty.h" +#include "prompt.h" +#include "keymacro.h" +#include "terminal.h" +#include "refresh.h" +#include "chared.h" +#include "search.h" +#include "hist.h" +#include "map.h" +#include "sig.h" + +struct el_read_t; + +struct editline { + wchar_t *el_prog; /* the program name */ + FILE *el_infile; /* Stdio stuff */ + FILE *el_outfile; /* Stdio stuff */ + FILE *el_errfile; /* Stdio stuff */ + int el_infd; /* Input file descriptor */ + int el_outfd; /* Output file descriptor */ + int el_errfd; /* Error file descriptor */ + int el_flags; /* Various flags. */ + coord_t el_cursor; /* Cursor location */ + wchar_t **el_display; /* Real screen image = what is there */ + wchar_t **el_vdisplay; /* Virtual screen image = what we see */ + void *el_data; /* Client data */ + el_line_t el_line; /* The current line information */ + el_state_t el_state; /* Current editor state */ + el_terminal_t el_terminal; /* Terminal dependent stuff */ + el_tty_t el_tty; /* Tty dependent stuff */ + el_refresh_t el_refresh; /* Refresh stuff */ + el_prompt_t el_prompt; /* Prompt stuff */ + el_prompt_t el_rprompt; /* Prompt stuff */ + el_chared_t el_chared; /* Characted editor stuff */ + el_map_t el_map; /* Key mapping stuff */ + el_keymacro_t el_keymacro; /* Key binding stuff */ + el_history_t el_history; /* History stuff */ + el_search_t el_search; /* Search stuff */ + el_signal_t el_signal; /* Signal handling stuff */ + struct el_read_t *el_read; /* Character reading stuff */ + ct_buffer_t el_visual; /* Buffer for displayable str */ + ct_buffer_t el_scratch; /* Scratch conversion buffer */ + ct_buffer_t el_lgcyconv; /* Buffer for legacy wrappers */ + LineInfo el_lgcylinfo; /* Legacy LineInfo buffer */ +}; + +libedit_private int el_editmode(EditLine *, int, const wchar_t **); + +#ifdef DEBUG +#define EL_ABORT(a) do { \ + fprintf(el->el_errfile, "%s, %d: ", \ + __FILE__, __LINE__); \ + fprintf a; \ + abort(); \ + } while( /*CONSTCOND*/0); +#else +#define EL_ABORT(a) abort() +#endif +#endif /* _h_el */ diff --git a/crypto/heimdal/lib/libedit/src/el.c b/crypto/heimdal/lib/libedit/src/el.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/el.c @@ -0,0 +1,640 @@ +/* $NetBSD: el.c,v 1.92 2016/05/22 19:44:26 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94"; +#else +__RCSID("$NetBSD: el.c,v 1.92 2016/05/22 19:44:26 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * el.c: EditLine interface functions + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "el.h" +#include "parse.h" +#include "read.h" + +/* el_init(): + * Initialize editline and set default parameters. + */ +EditLine * +el_init(const char *prog, FILE *fin, FILE *fout, FILE *ferr) +{ + return el_init_fd(prog, fin, fout, ferr, fileno(fin), fileno(fout), + fileno(ferr)); +} + +EditLine * +el_init_fd(const char *prog, FILE *fin, FILE *fout, FILE *ferr, + int fdin, int fdout, int fderr) +{ + EditLine *el = el_malloc(sizeof(*el)); + + if (el == NULL) + return NULL; + + memset(el, 0, sizeof(EditLine)); + + el->el_infile = fin; + el->el_outfile = fout; + el->el_errfile = ferr; + + el->el_infd = fdin; + el->el_outfd = fdout; + el->el_errfd = fderr; + + el->el_prog = wcsdup(ct_decode_string(prog, &el->el_scratch)); + if (el->el_prog == NULL) { + el_free(el); + return NULL; + } + + /* + * Initialize all the modules. Order is important!!! + */ + el->el_flags = 0; + if (setlocale(LC_CTYPE, NULL) != NULL){ + if (strcmp(nl_langinfo(CODESET), "UTF-8") == 0) + el->el_flags |= CHARSET_IS_UTF8; + } + + if (terminal_init(el) == -1) { + el_free(el->el_prog); + el_free(el); + return NULL; + } + (void) keymacro_init(el); + (void) map_init(el); + if (tty_init(el) == -1) + el->el_flags |= NO_TTY; + (void) ch_init(el); + (void) search_init(el); + (void) hist_init(el); + (void) prompt_init(el); + (void) sig_init(el); + if (read_init(el) == -1) { + el_end(el); + return NULL; + } + return el; +} + + +/* el_end(): + * Clean up. + */ +void +el_end(EditLine *el) +{ + + if (el == NULL) + return; + + el_reset(el); + + terminal_end(el); + keymacro_end(el); + map_end(el); + if (!(el->el_flags & NO_TTY)) + tty_end(el); + ch_end(el); + read_end(el->el_read); + search_end(el); + hist_end(el); + prompt_end(el); + sig_end(el); + + el_free(el->el_prog); + el_free(el->el_visual.cbuff); + el_free(el->el_visual.wbuff); + el_free(el->el_scratch.cbuff); + el_free(el->el_scratch.wbuff); + el_free(el->el_lgcyconv.cbuff); + el_free(el->el_lgcyconv.wbuff); + el_free(el); +} + + +/* el_reset(): + * Reset the tty and the parser + */ +void +el_reset(EditLine *el) +{ + + tty_cookedmode(el); + ch_reset(el); /* XXX: Do we want that? */ +} + + +/* el_set(): + * set the editline parameters + */ +int +el_wset(EditLine *el, int op, ...) +{ + va_list ap; + int rv = 0; + + if (el == NULL) + return -1; + va_start(ap, op); + + switch (op) { + case EL_PROMPT: + case EL_RPROMPT: { + el_pfunc_t p = va_arg(ap, el_pfunc_t); + + rv = prompt_set(el, p, 0, op, 1); + break; + } + + case EL_RESIZE: { + el_zfunc_t p = va_arg(ap, el_zfunc_t); + void *arg = va_arg(ap, void *); + rv = ch_resizefun(el, p, arg); + break; + } + + case EL_ALIAS_TEXT: { + el_afunc_t p = va_arg(ap, el_afunc_t); + void *arg = va_arg(ap, void *); + rv = ch_aliasfun(el, p, arg); + break; + } + + case EL_PROMPT_ESC: + case EL_RPROMPT_ESC: { + el_pfunc_t p = va_arg(ap, el_pfunc_t); + int c = va_arg(ap, int); + + rv = prompt_set(el, p, (wchar_t)c, op, 1); + break; + } + + case EL_TERMINAL: + rv = terminal_set(el, va_arg(ap, char *)); + break; + + case EL_EDITOR: + rv = map_set_editor(el, va_arg(ap, wchar_t *)); + break; + + case EL_SIGNAL: + if (va_arg(ap, int)) + el->el_flags |= HANDLE_SIGNALS; + else + el->el_flags &= ~HANDLE_SIGNALS; + break; + + case EL_BIND: + case EL_TELLTC: + case EL_SETTC: + case EL_ECHOTC: + case EL_SETTY: + { + const wchar_t *argv[20]; + int i; + + for (i = 1; i < (int)__arraycount(argv); i++) + if ((argv[i] = va_arg(ap, wchar_t *)) == NULL) + break; + + switch (op) { + case EL_BIND: + argv[0] = L"bind"; + rv = map_bind(el, i, argv); + break; + + case EL_TELLTC: + argv[0] = L"telltc"; + rv = terminal_telltc(el, i, argv); + break; + + case EL_SETTC: + argv[0] = L"settc"; + rv = terminal_settc(el, i, argv); + break; + + case EL_ECHOTC: + argv[0] = L"echotc"; + rv = terminal_echotc(el, i, argv); + break; + + case EL_SETTY: + argv[0] = L"setty"; + rv = tty_stty(el, i, argv); + break; + + default: + rv = -1; + EL_ABORT((el->el_errfile, "Bad op %d\n", op)); + break; + } + break; + } + + case EL_ADDFN: + { + wchar_t *name = va_arg(ap, wchar_t *); + wchar_t *help = va_arg(ap, wchar_t *); + el_func_t func = va_arg(ap, el_func_t); + + rv = map_addfunc(el, name, help, func); + break; + } + + case EL_HIST: + { + hist_fun_t func = va_arg(ap, hist_fun_t); + void *ptr = va_arg(ap, void *); + + rv = hist_set(el, func, ptr); + if (!(el->el_flags & CHARSET_IS_UTF8)) + el->el_flags &= ~NARROW_HISTORY; + break; + } + + case EL_EDITMODE: + if (va_arg(ap, int)) + el->el_flags &= ~EDIT_DISABLED; + else + el->el_flags |= EDIT_DISABLED; + rv = 0; + break; + + case EL_GETCFN: + { + el_rfunc_t rc = va_arg(ap, el_rfunc_t); + rv = el_read_setfn(el->el_read, rc); + break; + } + + case EL_CLIENTDATA: + el->el_data = va_arg(ap, void *); + break; + + case EL_UNBUFFERED: + rv = va_arg(ap, int); + if (rv && !(el->el_flags & UNBUFFERED)) { + el->el_flags |= UNBUFFERED; + read_prepare(el); + } else if (!rv && (el->el_flags & UNBUFFERED)) { + el->el_flags &= ~UNBUFFERED; + read_finish(el); + } + rv = 0; + break; + + case EL_PREP_TERM: + rv = va_arg(ap, int); + if (rv) + (void) tty_rawmode(el); + else + (void) tty_cookedmode(el); + rv = 0; + break; + + case EL_SETFP: + { + FILE *fp; + int what; + + what = va_arg(ap, int); + fp = va_arg(ap, FILE *); + + rv = 0; + switch (what) { + case 0: + el->el_infile = fp; + el->el_infd = fileno(fp); + break; + case 1: + el->el_outfile = fp; + el->el_outfd = fileno(fp); + break; + case 2: + el->el_errfile = fp; + el->el_errfd = fileno(fp); + break; + default: + rv = -1; + break; + } + break; + } + + case EL_REFRESH: + re_clear_display(el); + re_refresh(el); + terminal__flush(el); + break; + + default: + rv = -1; + break; + } + + va_end(ap); + return rv; +} + + +/* el_get(): + * retrieve the editline parameters + */ +int +el_wget(EditLine *el, int op, ...) +{ + va_list ap; + int rv; + + if (el == NULL) + return -1; + + va_start(ap, op); + + switch (op) { + case EL_PROMPT: + case EL_RPROMPT: { + el_pfunc_t *p = va_arg(ap, el_pfunc_t *); + rv = prompt_get(el, p, 0, op); + break; + } + case EL_PROMPT_ESC: + case EL_RPROMPT_ESC: { + el_pfunc_t *p = va_arg(ap, el_pfunc_t *); + wchar_t *c = va_arg(ap, wchar_t *); + + rv = prompt_get(el, p, c, op); + break; + } + + case EL_EDITOR: + rv = map_get_editor(el, va_arg(ap, const wchar_t **)); + break; + + case EL_SIGNAL: + *va_arg(ap, int *) = (el->el_flags & HANDLE_SIGNALS); + rv = 0; + break; + + case EL_EDITMODE: + *va_arg(ap, int *) = !(el->el_flags & EDIT_DISABLED); + rv = 0; + break; + + case EL_TERMINAL: + terminal_get(el, va_arg(ap, const char **)); + rv = 0; + break; + + case EL_GETTC: + { + static char name[] = "gettc"; + char *argv[20]; + int i; + + for (i = 1; i < (int)__arraycount(argv); i++) + if ((argv[i] = va_arg(ap, char *)) == NULL) + break; + + argv[0] = name; + rv = terminal_gettc(el, i, argv); + break; + } + + case EL_GETCFN: + *va_arg(ap, el_rfunc_t *) = el_read_getfn(el->el_read); + rv = 0; + break; + + case EL_CLIENTDATA: + *va_arg(ap, void **) = el->el_data; + rv = 0; + break; + + case EL_UNBUFFERED: + *va_arg(ap, int *) = (el->el_flags & UNBUFFERED) != 0; + rv = 0; + break; + + case EL_GETFP: + { + int what; + FILE **fpp; + + what = va_arg(ap, int); + fpp = va_arg(ap, FILE **); + rv = 0; + switch (what) { + case 0: + *fpp = el->el_infile; + break; + case 1: + *fpp = el->el_outfile; + break; + case 2: + *fpp = el->el_errfile; + break; + default: + rv = -1; + break; + } + break; + } + default: + rv = -1; + break; + } + va_end(ap); + + return rv; +} + + +/* el_line(): + * Return editing info + */ +const LineInfoW * +el_wline(EditLine *el) +{ + + return (const LineInfoW *)(void *)&el->el_line; +} + + +/* el_source(): + * Source a file + */ +int +el_source(EditLine *el, const char *fname) +{ + FILE *fp; + size_t len; + ssize_t slen; + char *ptr; + char *path = NULL; + const wchar_t *dptr; + int error = 0; + + fp = NULL; + if (fname == NULL) { +#ifdef HAVE_ISSETUGID + static const char elpath[] = "/.editrc"; + size_t plen = sizeof(elpath); + + if (issetugid()) + return -1; + if ((ptr = getenv("HOME")) == NULL) + return -1; + plen += strlen(ptr); + if ((path = el_malloc(plen * sizeof(*path))) == NULL) + return -1; + (void)snprintf(path, plen, "%s%s", ptr, elpath); + fname = path; +#else + /* + * If issetugid() is missing, always return an error, in order + * to keep from inadvertently opening up the user to a security + * hole. + */ + return -1; +#endif + } + if (fp == NULL) + fp = fopen(fname, "r"); + if (fp == NULL) { + el_free(path); + return -1; + } + + ptr = NULL; + len = 0; + while ((slen = getline(&ptr, &len, fp)) != -1) { + if (*ptr == '\n') + continue; /* Empty line. */ + if (slen > 0 && ptr[--slen] == '\n') + ptr[slen] = '\0'; + + dptr = ct_decode_string(ptr, &el->el_scratch); + if (!dptr) + continue; + /* loop until first non-space char or EOL */ + while (*dptr != '\0' && iswspace(*dptr)) + dptr++; + if (*dptr == '#') + continue; /* ignore, this is a comment line */ + if ((error = parse_line(el, dptr)) == -1) + break; + } + free(ptr); + + el_free(path); + (void) fclose(fp); + return error; +} + + +/* el_resize(): + * Called from program when terminal is resized + */ +void +el_resize(EditLine *el) +{ + int lins, cols; + sigset_t oset, nset; + + (void) sigemptyset(&nset); + (void) sigaddset(&nset, SIGWINCH); + (void) sigprocmask(SIG_BLOCK, &nset, &oset); + + /* get the correct window size */ + if (terminal_get_size(el, &lins, &cols)) + terminal_change_size(el, lins, cols); + + (void) sigprocmask(SIG_SETMASK, &oset, NULL); +} + + +/* el_beep(): + * Called from the program to beep + */ +void +el_beep(EditLine *el) +{ + + terminal_beep(el); +} + + +/* el_editmode() + * Set the state of EDIT_DISABLED from the `edit' command. + */ +libedit_private int +/*ARGSUSED*/ +el_editmode(EditLine *el, int argc, const wchar_t **argv) +{ + const wchar_t *how; + + if (argv == NULL || argc != 2 || argv[1] == NULL) + return -1; + + how = argv[1]; + if (wcscmp(how, L"on") == 0) { + el->el_flags &= ~EDIT_DISABLED; + tty_rawmode(el); + } else if (wcscmp(how, L"off") == 0) { + tty_cookedmode(el); + el->el_flags |= EDIT_DISABLED; + } + else { + (void) fprintf(el->el_errfile, "edit: Bad value `%ls'.\n", + how); + return -1; + } + return 0; +} diff --git a/crypto/heimdal/lib/libedit/src/eln.c b/crypto/heimdal/lib/libedit/src/eln.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/eln.c @@ -0,0 +1,388 @@ +/* $NetBSD: eln.c,v 1.34 2016/05/09 21:37:34 christos Exp $ */ + +/*- + * Copyright (c) 2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +__RCSID("$NetBSD: eln.c,v 1.34 2016/05/09 21:37:34 christos Exp $"); +#endif /* not lint && not SCCSID */ + +#include +#include +#include +#include + +#include "el.h" + +int +el_getc(EditLine *el, char *cp) +{ + int num_read; + wchar_t wc = 0; + + num_read = el_wgetc(el, &wc); + *cp = '\0'; + if (num_read <= 0) + return num_read; + num_read = wctob(wc); + if (num_read == EOF) { + errno = ERANGE; + return -1; + } else { + *cp = (char)num_read; + return 1; + } +} + + +void +el_push(EditLine *el, const char *str) +{ + /* Using multibyte->wide string decoding works fine under single-byte + * character sets too, and Does The Right Thing. */ + el_wpush(el, ct_decode_string(str, &el->el_lgcyconv)); +} + + +const char * +el_gets(EditLine *el, int *nread) +{ + const wchar_t *tmp; + + tmp = el_wgets(el, nread); + if (tmp != NULL) { + int i; + size_t nwread = 0; + + for (i = 0; i < *nread; i++) + nwread += ct_enc_width(tmp[i]); + *nread = (int)nwread; + } + return ct_encode_string(tmp, &el->el_lgcyconv); +} + + +int +el_parse(EditLine *el, int argc, const char *argv[]) +{ + int ret; + const wchar_t **wargv; + + wargv = (void *)ct_decode_argv(argc, argv, &el->el_lgcyconv); + if (!wargv) + return -1; + ret = el_wparse(el, argc, wargv); + el_free(wargv); + + return ret; +} + + +int +el_set(EditLine *el, int op, ...) +{ + va_list ap; + int ret; + + if (!el) + return -1; + va_start(ap, op); + + switch (op) { + case EL_PROMPT: /* el_pfunc_t */ + case EL_RPROMPT: { + el_pfunc_t p = va_arg(ap, el_pfunc_t); + ret = prompt_set(el, p, 0, op, 0); + break; + } + + case EL_RESIZE: { + el_zfunc_t p = va_arg(ap, el_zfunc_t); + void *arg = va_arg(ap, void *); + ret = ch_resizefun(el, p, arg); + break; + } + + case EL_ALIAS_TEXT: { + el_afunc_t p = va_arg(ap, el_afunc_t); + void *arg = va_arg(ap, void *); + ret = ch_aliasfun(el, p, arg); + break; + } + + case EL_PROMPT_ESC: + case EL_RPROMPT_ESC: { + el_pfunc_t p = va_arg(ap, el_pfunc_t); + int c = va_arg(ap, int); + + ret = prompt_set(el, p, c, op, 0); + break; + } + + case EL_TERMINAL: /* const char * */ + ret = el_wset(el, op, va_arg(ap, char *)); + break; + + case EL_EDITOR: /* const wchar_t * */ + ret = el_wset(el, op, ct_decode_string(va_arg(ap, char *), + &el->el_lgcyconv)); + break; + + case EL_SIGNAL: /* int */ + case EL_EDITMODE: + case EL_UNBUFFERED: + case EL_PREP_TERM: + ret = el_wset(el, op, va_arg(ap, int)); + break; + + case EL_BIND: /* const char * list -> const wchar_t * list */ + case EL_TELLTC: + case EL_SETTC: + case EL_ECHOTC: + case EL_SETTY: { + const char *argv[20]; + int i; + const wchar_t **wargv; + for (i = 1; i < (int)__arraycount(argv) - 1; ++i) + if ((argv[i] = va_arg(ap, const char *)) == NULL) + break; + argv[0] = argv[i] = NULL; + wargv = (void *)ct_decode_argv(i + 1, argv, &el->el_lgcyconv); + if (!wargv) { + ret = -1; + goto out; + } + /* + * AFAIK we can't portably pass through our new wargv to + * el_wset(), so we have to reimplement the body of + * el_wset() for these ops. + */ + switch (op) { + case EL_BIND: + wargv[0] = L"bind"; + ret = map_bind(el, i, wargv); + break; + case EL_TELLTC: + wargv[0] = L"telltc"; + ret = terminal_telltc(el, i, wargv); + break; + case EL_SETTC: + wargv[0] = L"settc"; + ret = terminal_settc(el, i, wargv); + break; + case EL_ECHOTC: + wargv[0] = L"echotc"; + ret = terminal_echotc(el, i, wargv); + break; + case EL_SETTY: + wargv[0] = L"setty"; + ret = tty_stty(el, i, wargv); + break; + default: + ret = -1; + } + el_free(wargv); + break; + } + + /* XXX: do we need to change el_func_t too? */ + case EL_ADDFN: { /* const char *, const char *, el_func_t */ + const char *args[2]; + el_func_t func; + wchar_t **wargv; + + args[0] = va_arg(ap, const char *); + args[1] = va_arg(ap, const char *); + func = va_arg(ap, el_func_t); + + wargv = ct_decode_argv(2, args, &el->el_lgcyconv); + if (!wargv) { + ret = -1; + goto out; + } + /* XXX: The two strdup's leak */ + ret = map_addfunc(el, wcsdup(wargv[0]), wcsdup(wargv[1]), + func); + el_free(wargv); + break; + } + case EL_HIST: { /* hist_fun_t, const char * */ + hist_fun_t fun = va_arg(ap, hist_fun_t); + void *ptr = va_arg(ap, void *); + ret = hist_set(el, fun, ptr); + el->el_flags |= NARROW_HISTORY; + break; + } + + case EL_GETCFN: /* el_rfunc_t */ + ret = el_wset(el, op, va_arg(ap, el_rfunc_t)); + break; + + case EL_CLIENTDATA: /* void * */ + ret = el_wset(el, op, va_arg(ap, void *)); + break; + + case EL_SETFP: { /* int, FILE * */ + int what = va_arg(ap, int); + FILE *fp = va_arg(ap, FILE *); + ret = el_wset(el, op, what, fp); + break; + } + + case EL_REFRESH: + re_clear_display(el); + re_refresh(el); + terminal__flush(el); + ret = 0; + break; + + default: + ret = -1; + break; + } + +out: + va_end(ap); + return ret; +} + + +int +el_get(EditLine *el, int op, ...) +{ + va_list ap; + int ret; + + if (!el) + return -1; + + va_start(ap, op); + + switch (op) { + case EL_PROMPT: /* el_pfunc_t * */ + case EL_RPROMPT: { + el_pfunc_t *p = va_arg(ap, el_pfunc_t *); + ret = prompt_get(el, p, 0, op); + break; + } + + case EL_PROMPT_ESC: /* el_pfunc_t *, char **/ + case EL_RPROMPT_ESC: { + el_pfunc_t *p = va_arg(ap, el_pfunc_t *); + char *c = va_arg(ap, char *); + wchar_t wc = 0; + ret = prompt_get(el, p, &wc, op); + *c = (char)wc; + break; + } + + case EL_EDITOR: { + const char **p = va_arg(ap, const char **); + const wchar_t *pw; + ret = el_wget(el, op, &pw); + *p = ct_encode_string(pw, &el->el_lgcyconv); + if (!el->el_lgcyconv.csize) + ret = -1; + break; + } + + case EL_TERMINAL: /* const char ** */ + ret = el_wget(el, op, va_arg(ap, const char **)); + break; + + case EL_SIGNAL: /* int * */ + case EL_EDITMODE: + case EL_UNBUFFERED: + case EL_PREP_TERM: + ret = el_wget(el, op, va_arg(ap, int *)); + break; + + case EL_GETTC: { + char *argv[20]; + static char gettc[] = "gettc"; + int i; + for (i = 1; i < (int)__arraycount(argv); ++i) + if ((argv[i] = va_arg(ap, char *)) == NULL) + break; + argv[0] = gettc; + ret = terminal_gettc(el, i, argv); + break; + } + + case EL_GETCFN: /* el_rfunc_t */ + ret = el_wget(el, op, va_arg(ap, el_rfunc_t *)); + break; + + case EL_CLIENTDATA: /* void ** */ + ret = el_wget(el, op, va_arg(ap, void **)); + break; + + case EL_GETFP: { /* int, FILE ** */ + int what = va_arg(ap, int); + FILE **fpp = va_arg(ap, FILE **); + ret = el_wget(el, op, what, fpp); + break; + } + + default: + ret = -1; + break; + } + + va_end(ap); + return ret; +} + + +const LineInfo * +el_line(EditLine *el) +{ + const LineInfoW *winfo = el_wline(el); + LineInfo *info = &el->el_lgcylinfo; + size_t offset; + const wchar_t *p; + + info->buffer = ct_encode_string(winfo->buffer, &el->el_lgcyconv); + + offset = 0; + for (p = winfo->buffer; p < winfo->cursor; p++) + offset += ct_enc_width(*p); + info->cursor = info->buffer + offset; + + offset = 0; + for (p = winfo->buffer; p < winfo->lastchar; p++) + offset += ct_enc_width(*p); + info->lastchar = info->buffer + offset; + + return info; +} + + +int +el_insertstr(EditLine *el, const char *str) +{ + return el_winsertstr(el, ct_decode_string(str, &el->el_lgcyconv)); +} diff --git a/crypto/heimdal/lib/libedit/src/emacs.c b/crypto/heimdal/lib/libedit/src/emacs.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/emacs.c @@ -0,0 +1,512 @@ +/* $NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)emacs.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: emacs.c,v 1.36 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * emacs.c: Emacs functions + */ +#include + +#include "el.h" +#include "emacs.h" +#include "fcns.h" + +/* em_delete_or_list(): + * Delete character under cursor or list completions if at end of line + * [^D] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_delete_or_list(EditLine *el, wint_t c) +{ + + if (el->el_line.cursor == el->el_line.lastchar) { + /* if I'm at the end */ + if (el->el_line.cursor == el->el_line.buffer) { + /* and the beginning */ + terminal_writec(el, c); /* then do an EOF */ + return CC_EOF; + } else { + /* + * Here we could list completions, but it is an + * error right now + */ + terminal_beep(el); + return CC_ERROR; + } + } else { + if (el->el_state.doingarg) + c_delafter(el, el->el_state.argument); + else + c_delafter1(el); + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + /* bounds check */ + return CC_REFRESH; + } +} + + +/* em_delete_next_word(): + * Cut from cursor to end of current word + * [M-d] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_delete_next_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *cp, *p, *kp; + + if (el->el_line.cursor == el->el_line.lastchar) + return CC_ERROR; + + cp = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); + + for (p = el->el_line.cursor, kp = el->el_chared.c_kill.buf; p < cp; p++) + /* save the text */ + *kp++ = *p; + el->el_chared.c_kill.last = kp; + + c_delafter(el, (int)(cp - el->el_line.cursor)); /* delete after dot */ + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + /* bounds check */ + return CC_REFRESH; +} + + +/* em_yank(): + * Paste cut buffer at cursor position + * [^Y] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_yank(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *kp, *cp; + + if (el->el_chared.c_kill.last == el->el_chared.c_kill.buf) + return CC_NORM; + + if (el->el_line.lastchar + + (el->el_chared.c_kill.last - el->el_chared.c_kill.buf) >= + el->el_line.limit) + return CC_ERROR; + + el->el_chared.c_kill.mark = el->el_line.cursor; + cp = el->el_line.cursor; + + /* open the space, */ + c_insert(el, + (int)(el->el_chared.c_kill.last - el->el_chared.c_kill.buf)); + /* copy the chars */ + for (kp = el->el_chared.c_kill.buf; kp < el->el_chared.c_kill.last; kp++) + *cp++ = *kp; + + /* if an arg, cursor at beginning else cursor at end */ + if (el->el_state.argument == 1) + el->el_line.cursor = cp; + + return CC_REFRESH; +} + + +/* em_kill_line(): + * Cut the entire line and save in cut buffer + * [^U] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_kill_line(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *kp, *cp; + + cp = el->el_line.buffer; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.lastchar) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + /* zap! -- delete all of it */ + el->el_line.lastchar = el->el_line.buffer; + el->el_line.cursor = el->el_line.buffer; + return CC_REFRESH; +} + + +/* em_kill_region(): + * Cut area between mark and cursor and save in cut buffer + * [^W] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_kill_region(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *kp, *cp; + + if (!el->el_chared.c_kill.mark) + return CC_ERROR; + + if (el->el_chared.c_kill.mark > el->el_line.cursor) { + cp = el->el_line.cursor; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_chared.c_kill.mark) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + c_delafter(el, (int)(cp - el->el_line.cursor)); + } else { /* mark is before cursor */ + cp = el->el_chared.c_kill.mark; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.cursor) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + c_delbefore(el, (int)(cp - el->el_chared.c_kill.mark)); + el->el_line.cursor = el->el_chared.c_kill.mark; + } + return CC_REFRESH; +} + + +/* em_copy_region(): + * Copy area between mark and cursor to cut buffer + * [M-W] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_copy_region(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *kp, *cp; + + if (!el->el_chared.c_kill.mark) + return CC_ERROR; + + if (el->el_chared.c_kill.mark > el->el_line.cursor) { + cp = el->el_line.cursor; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_chared.c_kill.mark) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + } else { + cp = el->el_chared.c_kill.mark; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.cursor) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + } + return CC_NORM; +} + + +/* em_gosmacs_transpose(): + * Exchange the two characters before the cursor + * Gosling emacs transpose chars [^T] + */ +libedit_private el_action_t +em_gosmacs_transpose(EditLine *el, wint_t c) +{ + + if (el->el_line.cursor > &el->el_line.buffer[1]) { + /* must have at least two chars entered */ + c = el->el_line.cursor[-2]; + el->el_line.cursor[-2] = el->el_line.cursor[-1]; + el->el_line.cursor[-1] = c; + return CC_REFRESH; + } else + return CC_ERROR; +} + + +/* em_next_word(): + * Move next to end of current word + * [M-f] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_next_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + if (el->el_line.cursor == el->el_line.lastchar) + return CC_ERROR; + + el->el_line.cursor = c__next_word(el->el_line.cursor, + el->el_line.lastchar, + el->el_state.argument, + ce__isword); + + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* em_upper_case(): + * Uppercase the characters from cursor to end of current word + * [M-u] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_upper_case(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *cp, *ep; + + ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); + + for (cp = el->el_line.cursor; cp < ep; cp++) + if (iswlower(*cp)) + *cp = towupper(*cp); + + el->el_line.cursor = ep; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + return CC_REFRESH; +} + + +/* em_capitol_case(): + * Capitalize the characters from cursor to end of current word + * [M-c] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_capitol_case(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *cp, *ep; + + ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); + + for (cp = el->el_line.cursor; cp < ep; cp++) { + if (iswalpha(*cp)) { + if (iswlower(*cp)) + *cp = towupper(*cp); + cp++; + break; + } + } + for (; cp < ep; cp++) + if (iswupper(*cp)) + *cp = towlower(*cp); + + el->el_line.cursor = ep; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + return CC_REFRESH; +} + + +/* em_lower_case(): + * Lowercase the characters from cursor to end of current word + * [M-l] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_lower_case(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *cp, *ep; + + ep = c__next_word(el->el_line.cursor, el->el_line.lastchar, + el->el_state.argument, ce__isword); + + for (cp = el->el_line.cursor; cp < ep; cp++) + if (iswupper(*cp)) + *cp = towlower(*cp); + + el->el_line.cursor = ep; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + return CC_REFRESH; +} + + +/* em_set_mark(): + * Set the mark at cursor + * [^@] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_set_mark(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_chared.c_kill.mark = el->el_line.cursor; + return CC_NORM; +} + + +/* em_exchange_mark(): + * Exchange the cursor and mark + * [^X^X] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_exchange_mark(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *cp; + + cp = el->el_line.cursor; + el->el_line.cursor = el->el_chared.c_kill.mark; + el->el_chared.c_kill.mark = cp; + return CC_CURSOR; +} + + +/* em_universal_argument(): + * Universal argument (argument times 4) + * [^U] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_universal_argument(EditLine *el, wint_t c __attribute__((__unused__))) +{ /* multiply current argument by 4 */ + + if (el->el_state.argument > 1000000) + return CC_ERROR; + el->el_state.doingarg = 1; + el->el_state.argument *= 4; + return CC_ARGHACK; +} + + +/* em_meta_next(): + * Add 8th bit to next character typed + * [] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_meta_next(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_state.metanext = 1; + return CC_ARGHACK; +} + + +/* em_toggle_overwrite(): + * Switch from insert to overwrite mode or vice versa + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_toggle_overwrite(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_state.inputmode = (el->el_state.inputmode == MODE_INSERT) ? + MODE_REPLACE : MODE_INSERT; + return CC_NORM; +} + + +/* em_copy_prev_word(): + * Copy current word to cursor + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_copy_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *cp, *oldc, *dp; + + if (el->el_line.cursor == el->el_line.buffer) + return CC_ERROR; + + oldc = el->el_line.cursor; + /* does a bounds check */ + cp = c__prev_word(el->el_line.cursor, el->el_line.buffer, + el->el_state.argument, ce__isword); + + c_insert(el, (int)(oldc - cp)); + for (dp = oldc; cp < oldc && dp < el->el_line.lastchar; cp++) + *dp++ = *cp; + + el->el_line.cursor = dp;/* put cursor at end */ + + return CC_REFRESH; +} + + +/* em_inc_search_next(): + * Emacs incremental next search + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_inc_search_next(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_search.patlen = 0; + return ce_inc_search(el, ED_SEARCH_NEXT_HISTORY); +} + + +/* em_inc_search_prev(): + * Emacs incremental reverse search + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_inc_search_prev(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_search.patlen = 0; + return ce_inc_search(el, ED_SEARCH_PREV_HISTORY); +} + + +/* em_delete_prev_char(): + * Delete the character to the left of the cursor + * [^?] + */ +libedit_private el_action_t +/*ARGSUSED*/ +em_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor <= el->el_line.buffer) + return CC_ERROR; + + if (el->el_state.doingarg) + c_delbefore(el, el->el_state.argument); + else + c_delbefore1(el); + el->el_line.cursor -= el->el_state.argument; + if (el->el_line.cursor < el->el_line.buffer) + el->el_line.cursor = el->el_line.buffer; + return CC_REFRESH; +} diff --git a/crypto/heimdal/lib/libedit/src/filecomplete.h b/crypto/heimdal/lib/libedit/src/filecomplete.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/filecomplete.h @@ -0,0 +1,44 @@ +/* $NetBSD: filecomplete.h,v 1.10 2016/04/11 00:50:13 christos Exp $ */ + +/*- + * Copyright (c) 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jaromir Dolecek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _FILECOMPLETE_H_ +#define _FILECOMPLETE_H_ + +int fn_complete(EditLine *, + char *(*)(const char *, int), + char **(*)(const char *, int, int), + const wchar_t *, const wchar_t *, const char *(*)(const char *), size_t, + int *, int *, int *, int *); + +void fn_display_match_list(EditLine *, char **, size_t, size_t); +char *fn_tilde_expand(const char *); +char *fn_filename_completion_function(const char *, int); + +#endif diff --git a/crypto/heimdal/lib/libedit/src/filecomplete.c b/crypto/heimdal/lib/libedit/src/filecomplete.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/filecomplete.c @@ -0,0 +1,573 @@ +/* $NetBSD: filecomplete.c,v 1.44 2016/10/31 17:46:32 abhinav Exp $ */ + +/*- + * Copyright (c) 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jaromir Dolecek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +__RCSID("$NetBSD: filecomplete.c,v 1.44 2016/10/31 17:46:32 abhinav Exp $"); +#endif /* not lint && not SCCSID */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "el.h" +#include "filecomplete.h" + +static const wchar_t break_chars[] = L" \t\n\"\\'`@$><=;|&{("; + +/********************************/ +/* completion functions */ + +/* + * does tilde expansion of strings of type ``~user/foo'' + * if ``user'' isn't valid user name or ``txt'' doesn't start + * w/ '~', returns pointer to strdup()ed copy of ``txt'' + * + * it's the caller's responsibility to free() the returned string + */ +char * +fn_tilde_expand(const char *txt) +{ +#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT) + struct passwd pwres; + char pwbuf[1024]; +#endif + struct passwd *pass; + char *temp; + size_t len = 0; + + if (txt[0] != '~') + return strdup(txt); + + temp = strchr(txt + 1, '/'); + if (temp == NULL) { + temp = strdup(txt + 1); + if (temp == NULL) + return NULL; + } else { + /* text until string after slash */ + len = (size_t)(temp - txt + 1); + temp = el_malloc(len * sizeof(*temp)); + if (temp == NULL) + return NULL; + (void)strncpy(temp, txt + 1, len - 2); + temp[len - 2] = '\0'; + } + if (temp[0] == 0) { +#ifdef HAVE_GETPW_R_POSIX + if (getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf), + &pass) != 0) + pass = NULL; +#elif HAVE_GETPW_R_DRAFT + pass = getpwuid_r(getuid(), &pwres, pwbuf, sizeof(pwbuf)); +#else + pass = getpwuid(getuid()); +#endif + } else { +#ifdef HAVE_GETPW_R_POSIX + if (getpwnam_r(temp, &pwres, pwbuf, sizeof(pwbuf), &pass) != 0) + pass = NULL; +#elif HAVE_GETPW_R_DRAFT + pass = getpwnam_r(temp, &pwres, pwbuf, sizeof(pwbuf)); +#else + pass = getpwnam(temp); +#endif + } + el_free(temp); /* value no more needed */ + if (pass == NULL) + return strdup(txt); + + /* update pointer txt to point at string immedially following */ + /* first slash */ + txt += len; + + len = strlen(pass->pw_dir) + 1 + strlen(txt) + 1; + temp = el_malloc(len * sizeof(*temp)); + if (temp == NULL) + return NULL; + (void)snprintf(temp, len, "%s/%s", pass->pw_dir, txt); + + return temp; +} + + +/* + * return first found file name starting by the ``text'' or NULL if no + * such file can be found + * value of ``state'' is ignored + * + * it's the caller's responsibility to free the returned string + */ +char * +fn_filename_completion_function(const char *text, int state) +{ + static DIR *dir = NULL; + static char *filename = NULL, *dirname = NULL, *dirpath = NULL; + static size_t filename_len = 0; + struct dirent *entry; + char *temp; + size_t len; + + if (state == 0 || dir == NULL) { + temp = strrchr(text, '/'); + if (temp) { + char *nptr; + temp++; + nptr = el_realloc(filename, (strlen(temp) + 1) * + sizeof(*nptr)); + if (nptr == NULL) { + el_free(filename); + filename = NULL; + return NULL; + } + filename = nptr; + (void)strcpy(filename, temp); + len = (size_t)(temp - text); /* including last slash */ + + nptr = el_realloc(dirname, (len + 1) * + sizeof(*nptr)); + if (nptr == NULL) { + el_free(dirname); + dirname = NULL; + return NULL; + } + dirname = nptr; + (void)strncpy(dirname, text, len); + dirname[len] = '\0'; + } else { + el_free(filename); + if (*text == 0) + filename = NULL; + else { + filename = strdup(text); + if (filename == NULL) + return NULL; + } + el_free(dirname); + dirname = NULL; + } + + if (dir != NULL) { + (void)closedir(dir); + dir = NULL; + } + + /* support for ``~user'' syntax */ + + el_free(dirpath); + dirpath = NULL; + if (dirname == NULL) { + if ((dirname = strdup("")) == NULL) + return NULL; + dirpath = strdup("./"); + } else if (*dirname == '~') + dirpath = fn_tilde_expand(dirname); + else + dirpath = strdup(dirname); + + if (dirpath == NULL) + return NULL; + + dir = opendir(dirpath); + if (!dir) + return NULL; /* cannot open the directory */ + + /* will be used in cycle */ + filename_len = filename ? strlen(filename) : 0; + } + + /* find the match */ + while ((entry = readdir(dir)) != NULL) { + /* skip . and .. */ + if (entry->d_name[0] == '.' && (!entry->d_name[1] + || (entry->d_name[1] == '.' && !entry->d_name[2]))) + continue; + if (filename_len == 0) + break; + /* otherwise, get first entry where first */ + /* filename_len characters are equal */ + if (entry->d_name[0] == filename[0] +#if HAVE_STRUCT_DIRENT_D_NAMLEN + && entry->d_namlen >= filename_len +#else + && strlen(entry->d_name) >= filename_len +#endif + && strncmp(entry->d_name, filename, + filename_len) == 0) + break; + } + + if (entry) { /* match found */ + +#if HAVE_STRUCT_DIRENT_D_NAMLEN + len = entry->d_namlen; +#else + len = strlen(entry->d_name); +#endif + + len = strlen(dirname) + len + 1; + temp = el_malloc(len * sizeof(*temp)); + if (temp == NULL) + return NULL; + (void)snprintf(temp, len, "%s%s", dirname, entry->d_name); + } else { + (void)closedir(dir); + dir = NULL; + temp = NULL; + } + + return temp; +} + + +static const char * +append_char_function(const char *name) +{ + struct stat stbuf; + char *expname = *name == '~' ? fn_tilde_expand(name) : NULL; + const char *rs = " "; + + if (stat(expname ? expname : name, &stbuf) == -1) + goto out; + if (S_ISDIR(stbuf.st_mode)) + rs = "/"; +out: + if (expname) + el_free(expname); + return rs; +} +/* + * returns list of completions for text given + * non-static for readline. + */ +char ** completion_matches(const char *, char *(*)(const char *, int)); +char ** +completion_matches(const char *text, char *(*genfunc)(const char *, int)) +{ + char **match_list = NULL, *retstr, *prevstr; + size_t match_list_len, max_equal, which, i; + size_t matches; + + matches = 0; + match_list_len = 1; + while ((retstr = (*genfunc) (text, (int)matches)) != NULL) { + /* allow for list terminator here */ + if (matches + 3 >= match_list_len) { + char **nmatch_list; + while (matches + 3 >= match_list_len) + match_list_len <<= 1; + nmatch_list = el_realloc(match_list, + match_list_len * sizeof(*nmatch_list)); + if (nmatch_list == NULL) { + el_free(match_list); + return NULL; + } + match_list = nmatch_list; + + } + match_list[++matches] = retstr; + } + + if (!match_list) + return NULL; /* nothing found */ + + /* find least denominator and insert it to match_list[0] */ + which = 2; + prevstr = match_list[1]; + max_equal = strlen(prevstr); + for (; which <= matches; which++) { + for (i = 0; i < max_equal && + prevstr[i] == match_list[which][i]; i++) + continue; + max_equal = i; + } + + retstr = el_malloc((max_equal + 1) * sizeof(*retstr)); + if (retstr == NULL) { + el_free(match_list); + return NULL; + } + (void)strncpy(retstr, match_list[1], max_equal); + retstr[max_equal] = '\0'; + match_list[0] = retstr; + + /* add NULL as last pointer to the array */ + match_list[matches + 1] = NULL; + + return match_list; +} + +/* + * Sort function for qsort(). Just wrapper around strcasecmp(). + */ +static int +_fn_qsort_string_compare(const void *i1, const void *i2) +{ + const char *s1 = ((const char * const *)i1)[0]; + const char *s2 = ((const char * const *)i2)[0]; + + return strcasecmp(s1, s2); +} + +/* + * Display list of strings in columnar format on readline's output stream. + * 'matches' is list of strings, 'num' is number of strings in 'matches', + * 'width' is maximum length of string in 'matches'. + * + * matches[0] is not one of the match strings, but it is counted in + * num, so the strings are matches[1] *through* matches[num-1]. + */ +void +fn_display_match_list (EditLine *el, char **matches, size_t num, size_t width) +{ + size_t line, lines, col, cols, thisguy; + int screenwidth = el->el_terminal.t_size.h; + + /* Ignore matches[0]. Avoid 1-based array logic below. */ + matches++; + num--; + + /* + * Find out how many entries can be put on one line; count + * with one space between strings the same way it's printed. + */ + cols = (size_t)screenwidth / (width + 1); + if (cols == 0) + cols = 1; + + /* how many lines of output, rounded up */ + lines = (num + cols - 1) / cols; + + /* Sort the items. */ + qsort(matches, num, sizeof(char *), _fn_qsort_string_compare); + + /* + * On the ith line print elements i, i+lines, i+lines*2, etc. + */ + for (line = 0; line < lines; line++) { + for (col = 0; col < cols; col++) { + thisguy = line + col * lines; + if (thisguy >= num) + break; + (void)fprintf(el->el_outfile, "%s%-*s", + col == 0 ? "" : " ", (int)width, matches[thisguy]); + } + (void)fprintf(el->el_outfile, "\n"); + } +} + +/* + * Complete the word at or before point, + * 'what_to_do' says what to do with the completion. + * \t means do standard completion. + * `?' means list the possible completions. + * `*' means insert all of the possible completions. + * `!' means to do standard completion, and list all possible completions if + * there is more than one. + * + * Note: '*' support is not implemented + * '!' could never be invoked + */ +int +fn_complete(EditLine *el, + char *(*complet_func)(const char *, int), + char **(*attempted_completion_function)(const char *, int, int), + const wchar_t *word_break, const wchar_t *special_prefixes, + const char *(*app_func)(const char *), size_t query_items, + int *completion_type, int *over, int *point, int *end) +{ + const LineInfoW *li; + wchar_t *temp; + char **matches; + const wchar_t *ctemp; + size_t len; + int what_to_do = '\t'; + int retval = CC_NORM; + + if (el->el_state.lastcmd == el->el_state.thiscmd) + what_to_do = '?'; + + /* readline's rl_complete() has to be told what we did... */ + if (completion_type != NULL) + *completion_type = what_to_do; + + if (!complet_func) + complet_func = fn_filename_completion_function; + if (!app_func) + app_func = append_char_function; + + /* We now look backwards for the start of a filename/variable word */ + li = el_wline(el); + ctemp = li->cursor; + while (ctemp > li->buffer + && !wcschr(word_break, ctemp[-1]) + && (!special_prefixes || !wcschr(special_prefixes, ctemp[-1]) ) ) + ctemp--; + + len = (size_t)(li->cursor - ctemp); + temp = el_malloc((len + 1) * sizeof(*temp)); + (void)wcsncpy(temp, ctemp, len); + temp[len] = '\0'; + + /* these can be used by function called in completion_matches() */ + /* or (*attempted_completion_function)() */ + if (point != NULL) + *point = (int)(li->cursor - li->buffer); + if (end != NULL) + *end = (int)(li->lastchar - li->buffer); + + if (attempted_completion_function) { + int cur_off = (int)(li->cursor - li->buffer); + matches = (*attempted_completion_function)( + ct_encode_string(temp, &el->el_scratch), + cur_off - (int)len, cur_off); + } else + matches = NULL; + if (!attempted_completion_function || + (over != NULL && !*over && !matches)) + matches = completion_matches( + ct_encode_string(temp, &el->el_scratch), complet_func); + + if (over != NULL) + *over = 0; + + if (matches) { + int i; + size_t matches_num, maxlen, match_len, match_display=1; + + retval = CC_REFRESH; + /* + * Only replace the completed string with common part of + * possible matches if there is possible completion. + */ + if (matches[0][0] != '\0') { + el_deletestr(el, (int) len); + el_winsertstr(el, + ct_decode_string(matches[0], &el->el_scratch)); + } + + + if (matches[2] == NULL && + (matches[1] == NULL || strcmp(matches[0], matches[1]) == 0)) { + /* + * We found exact match. Add a space after + * it, unless we do filename completion and the + * object is a directory. + */ + el_winsertstr(el, + ct_decode_string((*app_func)(matches[0]), + &el->el_scratch)); + } else if (what_to_do == '!' || what_to_do == '?') { + /* + * More than one match and requested to list possible + * matches. + */ + + for(i = 1, maxlen = 0; matches[i]; i++) { + match_len = strlen(matches[i]); + if (match_len > maxlen) + maxlen = match_len; + } + /* matches[1] through matches[i-1] are available */ + matches_num = (size_t)(i - 1); + + /* newline to get on next line from command line */ + (void)fprintf(el->el_outfile, "\n"); + + /* + * If there are too many items, ask user for display + * confirmation. + */ + if (matches_num > query_items) { + (void)fprintf(el->el_outfile, + "Display all %zu possibilities? (y or n) ", + matches_num); + (void)fflush(el->el_outfile); + if (getc(stdin) != 'y') + match_display = 0; + (void)fprintf(el->el_outfile, "\n"); + } + + if (match_display) { + /* + * Interface of this function requires the + * strings be matches[1..num-1] for compat. + * We have matches_num strings not counting + * the prefix in matches[0], so we need to + * add 1 to matches_num for the call. + */ + fn_display_match_list(el, matches, + matches_num+1, maxlen); + } + retval = CC_REDISPLAY; + } else if (matches[0][0]) { + /* + * There was some common match, but the name was + * not complete enough. Next tab will print possible + * completions. + */ + el_beep(el); + } else { + /* lcd is not a valid object - further specification */ + /* is needed */ + el_beep(el); + retval = CC_NORM; + } + + /* free elements of array and the array itself */ + for (i = 0; matches[i]; i++) + el_free(matches[i]); + el_free(matches); + matches = NULL; + } + el_free(temp); + return retval; +} + +/* + * el-compatible wrapper around rl_complete; needed for key binding + */ +/* ARGSUSED */ +unsigned char +_el_fn_complete(EditLine *el, int ch __attribute__((__unused__))) +{ + return (unsigned char)fn_complete(el, NULL, NULL, + break_chars, NULL, NULL, (size_t)100, + NULL, NULL, NULL, NULL); +} diff --git a/crypto/heimdal/lib/libedit/src/hist.h b/crypto/heimdal/lib/libedit/src/hist.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/hist.h @@ -0,0 +1,79 @@ +/* $NetBSD: hist.h,v 1.22 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)hist.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.hist.c: History functions + */ +#ifndef _h_el_hist +#define _h_el_hist + +typedef int (*hist_fun_t)(void *, HistEventW *, int, ...); + +typedef struct el_history_t { + wchar_t *buf; /* The history buffer */ + size_t sz; /* Size of history buffer */ + wchar_t *last; /* The last character */ + int eventno; /* Event we are looking for */ + void *ref; /* Argument for history fcns */ + hist_fun_t fun; /* Event access */ + HistEventW ev; /* Event cookie */ +} el_history_t; + +#define HIST_FUN_INTERNAL(el, fn, arg) \ + ((((*(el)->el_history.fun) ((el)->el_history.ref, &(el)->el_history.ev, \ + fn, arg)) == -1) ? NULL : (el)->el_history.ev.str) +#define HIST_FUN(el, fn, arg) \ + (((el)->el_flags & NARROW_HISTORY) ? hist_convert(el, fn, arg) : \ + HIST_FUN_INTERNAL(el, fn, arg)) + +#define HIST_NEXT(el) HIST_FUN(el, H_NEXT, NULL) +#define HIST_FIRST(el) HIST_FUN(el, H_FIRST, NULL) +#define HIST_LAST(el) HIST_FUN(el, H_LAST, NULL) +#define HIST_PREV(el) HIST_FUN(el, H_PREV, NULL) +#define HIST_SET(el, num) HIST_FUN(el, H_SET, num) +#define HIST_LOAD(el, fname) HIST_FUN(el, H_LOAD fname) +#define HIST_SAVE(el, fname) HIST_FUN(el, H_SAVE fname) +#define HIST_SAVE_FP(el, fp) HIST_FUN(el, H_SAVE_FP fp) + +libedit_private int hist_init(EditLine *); +libedit_private void hist_end(EditLine *); +libedit_private el_action_t hist_get(EditLine *); +libedit_private int hist_set(EditLine *, hist_fun_t, void *); +libedit_private int hist_command(EditLine *, int, const wchar_t **); +libedit_private int hist_enlargebuf(EditLine *, size_t, size_t); +libedit_private wchar_t *hist_convert(EditLine *, int, void *); + +#endif /* _h_el_hist */ diff --git a/crypto/heimdal/lib/libedit/src/hist.c b/crypto/heimdal/lib/libedit/src/hist.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/hist.c @@ -0,0 +1,245 @@ +/* $NetBSD: hist.c,v 1.30 2016/11/07 15:30:18 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)hist.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: hist.c,v 1.30 2016/11/07 15:30:18 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * hist.c: History access functions + */ +#include +#include +#include + +#include "el.h" + +/* hist_init(): + * Initialization function. + */ +libedit_private int +hist_init(EditLine *el) +{ + + el->el_history.fun = NULL; + el->el_history.ref = NULL; + el->el_history.buf = el_malloc(EL_BUFSIZ * sizeof(*el->el_history.buf)); + el->el_history.sz = EL_BUFSIZ; + if (el->el_history.buf == NULL) + return -1; + el->el_history.last = el->el_history.buf; + return 0; +} + + +/* hist_end(): + * clean up history; + */ +libedit_private void +hist_end(EditLine *el) +{ + + el_free(el->el_history.buf); + el->el_history.buf = NULL; +} + + +/* hist_set(): + * Set new history interface + */ +libedit_private int +hist_set(EditLine *el, hist_fun_t fun, void *ptr) +{ + + el->el_history.ref = ptr; + el->el_history.fun = fun; + return 0; +} + + +/* hist_get(): + * Get a history line and update it in the buffer. + * eventno tells us the event to get. + */ +libedit_private el_action_t +hist_get(EditLine *el) +{ + const wchar_t *hp; + int h; + + if (el->el_history.eventno == 0) { /* if really the current line */ + (void) wcsncpy(el->el_line.buffer, el->el_history.buf, + el->el_history.sz); + el->el_line.lastchar = el->el_line.buffer + + (el->el_history.last - el->el_history.buf); + +#ifdef KSHVI + if (el->el_map.type == MAP_VI) + el->el_line.cursor = el->el_line.buffer; + else +#endif /* KSHVI */ + el->el_line.cursor = el->el_line.lastchar; + + return CC_REFRESH; + } + if (el->el_history.ref == NULL) + return CC_ERROR; + + hp = HIST_FIRST(el); + + if (hp == NULL) + return CC_ERROR; + + for (h = 1; h < el->el_history.eventno; h++) + if ((hp = HIST_NEXT(el)) == NULL) { + el->el_history.eventno = h; + return CC_ERROR; + } + (void) wcsncpy(el->el_line.buffer, hp, + (size_t)(el->el_line.limit - el->el_line.buffer)); + el->el_line.buffer[el->el_line.limit - el->el_line.buffer - 1] = '\0'; + el->el_line.lastchar = el->el_line.buffer + wcslen(el->el_line.buffer); + + if (el->el_line.lastchar > el->el_line.buffer + && el->el_line.lastchar[-1] == '\n') + el->el_line.lastchar--; + if (el->el_line.lastchar > el->el_line.buffer + && el->el_line.lastchar[-1] == ' ') + el->el_line.lastchar--; +#ifdef KSHVI + if (el->el_map.type == MAP_VI) + el->el_line.cursor = el->el_line.buffer; + else +#endif /* KSHVI */ + el->el_line.cursor = el->el_line.lastchar; + + return CC_REFRESH; +} + + +/* hist_command() + * process a history command + */ +libedit_private int +hist_command(EditLine *el, int argc, const wchar_t **argv) +{ + const wchar_t *str; + int num; + HistEventW ev; + + if (el->el_history.ref == NULL) + return -1; + + if (argc == 1 || wcscmp(argv[1], L"list") == 0) { + size_t maxlen = 0; + char *buf = NULL; + int hno = 1; + /* List history entries */ + + for (str = HIST_LAST(el); str != NULL; str = HIST_PREV(el)) { + char *ptr = + ct_encode_string(str, &el->el_scratch); + size_t len = strlen(ptr); + if (len > 0 && ptr[len - 1] == '\n') + ptr[--len] = '\0'; + len = len * 4 + 1; + if (len >= maxlen) { + maxlen = len + 1024; + char *nbuf = el_realloc(buf, maxlen); + if (nbuf == NULL) { + el_free(buf); + return -1; + } + buf = nbuf; + } + strvis(buf, ptr, VIS_NL); + (void) fprintf(el->el_outfile, "%d\t%s\n", + hno++, buf); + } + el_free(buf); + return 0; + } + + if (argc != 3) + return -1; + + num = (int)wcstol(argv[2], NULL, 0); + + if (wcscmp(argv[1], L"size") == 0) + return history_w(el->el_history.ref, &ev, H_SETSIZE, num); + + if (wcscmp(argv[1], L"unique") == 0) + return history_w(el->el_history.ref, &ev, H_SETUNIQUE, num); + + return -1; +} + +/* hist_enlargebuf() + * Enlarge history buffer to specified value. Called from el_enlargebufs(). + * Return 0 for failure, 1 for success. + */ +libedit_private int +/*ARGSUSED*/ +hist_enlargebuf(EditLine *el, size_t oldsz, size_t newsz) +{ + wchar_t *newbuf; + + newbuf = el_realloc(el->el_history.buf, newsz * sizeof(*newbuf)); + if (!newbuf) + return 0; + + (void) memset(&newbuf[oldsz], '\0', (newsz - oldsz) * sizeof(*newbuf)); + + el->el_history.last = newbuf + + (el->el_history.last - el->el_history.buf); + el->el_history.buf = newbuf; + el->el_history.sz = newsz; + + return 1; +} + +libedit_private wchar_t * +hist_convert(EditLine *el, int fn, void *arg) +{ + HistEventW ev; + if ((*(el)->el_history.fun)((el)->el_history.ref, &ev, fn, arg) == -1) + return NULL; + return ct_decode_string((const char *)(const void *)ev.str, + &el->el_scratch); +} diff --git a/crypto/heimdal/lib/libedit/src/histedit.h b/crypto/heimdal/lib/libedit/src/histedit.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/histedit.h @@ -0,0 +1,313 @@ +/* $NetBSD: histedit.h,v 1.56 2016/04/19 19:50:53 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)histedit.h 8.2 (Berkeley) 1/3/94 + */ + +/* + * histedit.h: Line editor and history interface. + */ +#ifndef _HISTEDIT_H_ +#define _HISTEDIT_H_ + +#define LIBEDIT_MAJOR 2 +#define LIBEDIT_MINOR 11 + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * ==== Editing ==== + */ + +typedef struct editline EditLine; + +/* + * For user-defined function interface + */ +typedef struct lineinfo { + const char *buffer; + const char *cursor; + const char *lastchar; +} LineInfo; + +/* + * EditLine editor function return codes. + * For user-defined function interface + */ +#define CC_NORM 0 +#define CC_NEWLINE 1 +#define CC_EOF 2 +#define CC_ARGHACK 3 +#define CC_REFRESH 4 +#define CC_CURSOR 5 +#define CC_ERROR 6 +#define CC_FATAL 7 +#define CC_REDISPLAY 8 +#define CC_REFRESH_BEEP 9 + +/* + * Initialization, cleanup, and resetting + */ +EditLine *el_init(const char *, FILE *, FILE *, FILE *); +EditLine *el_init_fd(const char *, FILE *, FILE *, FILE *, + int, int, int); +void el_end(EditLine *); +void el_reset(EditLine *); + +/* + * Get a line, a character or push a string back in the input queue + */ +const char *el_gets(EditLine *, int *); +int el_getc(EditLine *, char *); +void el_push(EditLine *, const char *); + +/* + * Beep! + */ +void el_beep(EditLine *); + +/* + * High level function internals control + * Parses argc, argv array and executes builtin editline commands + */ +int el_parse(EditLine *, int, const char **); + +/* + * Low level editline access functions + */ +int el_set(EditLine *, int, ...); +int el_get(EditLine *, int, ...); +unsigned char _el_fn_complete(EditLine *, int); + +/* + * el_set/el_get parameters + * + * When using el_wset/el_wget (as opposed to el_set/el_get): + * Char is wchar_t, otherwise it is char. + * prompt_func is el_wpfunc_t, otherwise it is el_pfunc_t . + + * Prompt function prototypes are: + * typedef char *(*el_pfunct_t) (EditLine *); + * typedef wchar_t *(*el_wpfunct_t) (EditLine *); + * + * For operations that support set or set/get, the argument types listed are for + * the "set" operation. For "get", each listed type must be a pointer. + * E.g. EL_EDITMODE takes an int when set, but an int* when get. + * + * Operations that only support "get" have the correct argument types listed. + */ +#define EL_PROMPT 0 /* , prompt_func); set/get */ +#define EL_TERMINAL 1 /* , const char *); set/get */ +#define EL_EDITOR 2 /* , const Char *); set/get */ +#define EL_SIGNAL 3 /* , int); set/get */ +#define EL_BIND 4 /* , const Char *, ..., NULL); set */ +#define EL_TELLTC 5 /* , const Char *, ..., NULL); set */ +#define EL_SETTC 6 /* , const Char *, ..., NULL); set */ +#define EL_ECHOTC 7 /* , const Char *, ..., NULL); set */ +#define EL_SETTY 8 /* , const Char *, ..., NULL); set */ +#define EL_ADDFN 9 /* , const Char *, const Char, set */ + /* el_func_t); */ +#define EL_HIST 10 /* , hist_fun_t, const void *); set */ +#define EL_EDITMODE 11 /* , int); set/get */ +#define EL_RPROMPT 12 /* , prompt_func); set/get */ +#define EL_GETCFN 13 /* , el_rfunc_t); set/get */ +#define EL_CLIENTDATA 14 /* , void *); set/get */ +#define EL_UNBUFFERED 15 /* , int); set/get */ +#define EL_PREP_TERM 16 /* , int); set */ +#define EL_GETTC 17 /* , const Char *, ..., NULL); get */ +#define EL_GETFP 18 /* , int, FILE **); get */ +#define EL_SETFP 19 /* , int, FILE *); set */ +#define EL_REFRESH 20 /* , void); set */ +#define EL_PROMPT_ESC 21 /* , prompt_func, Char); set/get */ +#define EL_RPROMPT_ESC 22 /* , prompt_func, Char); set/get */ +#define EL_RESIZE 23 /* , el_zfunc_t, void *); set */ +#define EL_ALIAS_TEXT 24 /* , el_afunc_t, void *); set */ + +#define EL_BUILTIN_GETCFN (NULL) + +/* + * Source named file or $PWD/.editrc or $HOME/.editrc + */ +int el_source(EditLine *, const char *); + +/* + * Must be called when the terminal changes size; If EL_SIGNAL + * is set this is done automatically otherwise it is the responsibility + * of the application + */ +void el_resize(EditLine *); + +/* + * User-defined function interface. + */ +const LineInfo *el_line(EditLine *); +int el_insertstr(EditLine *, const char *); +void el_deletestr(EditLine *, int); + + +/* + * ==== History ==== + */ + +typedef struct history History; + +typedef struct HistEvent { + int num; + const char *str; +} HistEvent; + +/* + * History access functions. + */ +History * history_init(void); +void history_end(History *); + +int history(History *, HistEvent *, int, ...); + +#define H_FUNC 0 /* , UTSL */ +#define H_SETSIZE 1 /* , const int); */ +#define H_GETSIZE 2 /* , void); */ +#define H_FIRST 3 /* , void); */ +#define H_LAST 4 /* , void); */ +#define H_PREV 5 /* , void); */ +#define H_NEXT 6 /* , void); */ +#define H_CURR 8 /* , const int); */ +#define H_SET 7 /* , int); */ +#define H_ADD 9 /* , const wchar_t *); */ +#define H_ENTER 10 /* , const wchar_t *); */ +#define H_APPEND 11 /* , const wchar_t *); */ +#define H_END 12 /* , void); */ +#define H_NEXT_STR 13 /* , const wchar_t *); */ +#define H_PREV_STR 14 /* , const wchar_t *); */ +#define H_NEXT_EVENT 15 /* , const int); */ +#define H_PREV_EVENT 16 /* , const int); */ +#define H_LOAD 17 /* , const char *); */ +#define H_SAVE 18 /* , const char *); */ +#define H_CLEAR 19 /* , void); */ +#define H_SETUNIQUE 20 /* , int); */ +#define H_GETUNIQUE 21 /* , void); */ +#define H_DEL 22 /* , int); */ +#define H_NEXT_EVDATA 23 /* , const int, histdata_t *); */ +#define H_DELDATA 24 /* , int, histdata_t *);*/ +#define H_REPLACE 25 /* , const char *, histdata_t); */ +#define H_SAVE_FP 26 /* , FILE *); */ + + + +/* + * ==== Tokenization ==== + */ + +typedef struct tokenizer Tokenizer; + +/* + * String tokenization functions, using simplified sh(1) quoting rules + */ +Tokenizer *tok_init(const char *); +void tok_end(Tokenizer *); +void tok_reset(Tokenizer *); +int tok_line(Tokenizer *, const LineInfo *, + int *, const char ***, int *, int *); +int tok_str(Tokenizer *, const char *, + int *, const char ***); + +/* + * Begin Wide Character Support + */ +#include +#include + +/* + * ==== Editing ==== + */ +typedef struct lineinfow { + const wchar_t *buffer; + const wchar_t *cursor; + const wchar_t *lastchar; +} LineInfoW; + +typedef int (*el_rfunc_t)(EditLine *, wchar_t *); + +const wchar_t *el_wgets(EditLine *, int *); +int el_wgetc(EditLine *, wchar_t *); +void el_wpush(EditLine *, const wchar_t *); + +int el_wparse(EditLine *, int, const wchar_t **); + +int el_wset(EditLine *, int, ...); +int el_wget(EditLine *, int, ...); + +int el_cursor(EditLine *, int); +const LineInfoW *el_wline(EditLine *); +int el_winsertstr(EditLine *, const wchar_t *); +#define el_wdeletestr el_deletestr + +/* + * ==== History ==== + */ +typedef struct histeventW { + int num; + const wchar_t *str; +} HistEventW; + +typedef struct historyW HistoryW; + +HistoryW * history_winit(void); +void history_wend(HistoryW *); + +int history_w(HistoryW *, HistEventW *, int, ...); + +/* + * ==== Tokenization ==== + */ +typedef struct tokenizerW TokenizerW; + +/* Wide character tokenizer support */ +TokenizerW *tok_winit(const wchar_t *); +void tok_wend(TokenizerW *); +void tok_wreset(TokenizerW *); +int tok_wline(TokenizerW *, const LineInfoW *, + int *, const wchar_t ***, int *, int *); +int tok_wstr(TokenizerW *, const wchar_t *, + int *, const wchar_t ***); + +#ifdef __cplusplus +} +#endif + +#endif /* _HISTEDIT_H_ */ diff --git a/crypto/heimdal/lib/libedit/src/history.c b/crypto/heimdal/lib/libedit/src/history.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/history.c @@ -0,0 +1,1157 @@ +/* $NetBSD: history.c,v 1.57 2016/04/11 18:56:31 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)history.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: history.c,v 1.57 2016/04/11 18:56:31 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * hist.c: TYPE(History) access functions + */ +#include +#include +#include +#include +#include + +static const char hist_cookie[] = "_HiStOrY_V2_\n"; + +#include "histedit.h" + + +#ifdef NARROWCHAR + +#define Char char +#define FUN(prefix, rest) prefix ## _ ## rest +#define FUNW(type) type +#define TYPE(type) type +#define STR(x) x + +#define Strlen(s) strlen(s) +#define Strdup(s) strdup(s) +#define Strcmp(d, s) strcmp(d, s) +#define Strncmp(d, s, n) strncmp(d, s, n) +#define Strncpy(d, s, n) strncpy(d, s, n) +#define Strncat(d, s, n) strncat(d, s, n) +#define ct_decode_string(s, b) (s) +#define ct_encode_string(s, b) (s) + +#else +#include "chartype.h" + +#define Char wchar_t +#define FUN(prefix, rest) prefix ## _w ## rest +#define FUNW(type) type ## _w +#define TYPE(type) type ## W +#define STR(x) L ## x + +#define Strlen(s) wcslen(s) +#define Strdup(s) wcsdup(s) +#define Strcmp(d, s) wcscmp(d, s) +#define Strncmp(d, s, n) wcsncmp(d, s, n) +#define Strncpy(d, s, n) wcsncpy(d, s, n) +#define Strncat(d, s, n) wcsncat(d, s, n) + +#endif + + +typedef int (*history_gfun_t)(void *, TYPE(HistEvent) *); +typedef int (*history_efun_t)(void *, TYPE(HistEvent) *, const Char *); +typedef void (*history_vfun_t)(void *, TYPE(HistEvent) *); +typedef int (*history_sfun_t)(void *, TYPE(HistEvent) *, const int); + +struct TYPE(history) { + void *h_ref; /* Argument for history fcns */ + int h_ent; /* Last entry point for history */ + history_gfun_t h_first; /* Get the first element */ + history_gfun_t h_next; /* Get the next element */ + history_gfun_t h_last; /* Get the last element */ + history_gfun_t h_prev; /* Get the previous element */ + history_gfun_t h_curr; /* Get the current element */ + history_sfun_t h_set; /* Set the current element */ + history_sfun_t h_del; /* Set the given element */ + history_vfun_t h_clear; /* Clear the history list */ + history_efun_t h_enter; /* Add an element */ + history_efun_t h_add; /* Append to an element */ +}; + +#define HNEXT(h, ev) (*(h)->h_next)((h)->h_ref, ev) +#define HFIRST(h, ev) (*(h)->h_first)((h)->h_ref, ev) +#define HPREV(h, ev) (*(h)->h_prev)((h)->h_ref, ev) +#define HLAST(h, ev) (*(h)->h_last)((h)->h_ref, ev) +#define HCURR(h, ev) (*(h)->h_curr)((h)->h_ref, ev) +#define HSET(h, ev, n) (*(h)->h_set)((h)->h_ref, ev, n) +#define HCLEAR(h, ev) (*(h)->h_clear)((h)->h_ref, ev) +#define HENTER(h, ev, str) (*(h)->h_enter)((h)->h_ref, ev, str) +#define HADD(h, ev, str) (*(h)->h_add)((h)->h_ref, ev, str) +#define HDEL(h, ev, n) (*(h)->h_del)((h)->h_ref, ev, n) + +#define h_strdup(a) Strdup(a) +#define h_malloc(a) malloc(a) +#define h_realloc(a, b) realloc((a), (b)) +#define h_free(a) free(a) + +typedef struct { + int num; + Char *str; +} HistEventPrivate; + + +static int history_setsize(TYPE(History) *, TYPE(HistEvent) *, int); +static int history_getsize(TYPE(History) *, TYPE(HistEvent) *); +static int history_setunique(TYPE(History) *, TYPE(HistEvent) *, int); +static int history_getunique(TYPE(History) *, TYPE(HistEvent) *); +static int history_set_fun(TYPE(History) *, TYPE(History) *); +static int history_load(TYPE(History) *, const char *); +static int history_save(TYPE(History) *, const char *); +static int history_save_fp(TYPE(History) *, FILE *); +static int history_prev_event(TYPE(History) *, TYPE(HistEvent) *, int); +static int history_next_event(TYPE(History) *, TYPE(HistEvent) *, int); +static int history_next_string(TYPE(History) *, TYPE(HistEvent) *, + const Char *); +static int history_prev_string(TYPE(History) *, TYPE(HistEvent) *, + const Char *); + + +/***********************************************************************/ + +/* + * Builtin- history implementation + */ +typedef struct hentry_t { + TYPE(HistEvent) ev; /* What we return */ + void *data; /* data */ + struct hentry_t *next; /* Next entry */ + struct hentry_t *prev; /* Previous entry */ +} hentry_t; + +typedef struct history_t { + hentry_t list; /* Fake list header element */ + hentry_t *cursor; /* Current element in the list */ + int max; /* Maximum number of events */ + int cur; /* Current number of events */ + int eventid; /* For generation of unique event id */ + int flags; /* TYPE(History) flags */ +#define H_UNIQUE 1 /* Store only unique elements */ +} history_t; + +static int history_def_next(void *, TYPE(HistEvent) *); +static int history_def_first(void *, TYPE(HistEvent) *); +static int history_def_prev(void *, TYPE(HistEvent) *); +static int history_def_last(void *, TYPE(HistEvent) *); +static int history_def_curr(void *, TYPE(HistEvent) *); +static int history_def_set(void *, TYPE(HistEvent) *, const int); +static void history_def_clear(void *, TYPE(HistEvent) *); +static int history_def_enter(void *, TYPE(HistEvent) *, const Char *); +static int history_def_add(void *, TYPE(HistEvent) *, const Char *); +static int history_def_del(void *, TYPE(HistEvent) *, const int); + +static int history_def_init(void **, TYPE(HistEvent) *, int); +static int history_def_insert(history_t *, TYPE(HistEvent) *, const Char *); +static void history_def_delete(history_t *, TYPE(HistEvent) *, hentry_t *); + +static int history_deldata_nth(history_t *, TYPE(HistEvent) *, int, void **); +static int history_set_nth(void *, TYPE(HistEvent) *, int); + +#define history_def_setsize(p, num)(void) (((history_t *)p)->max = (num)) +#define history_def_getsize(p) (((history_t *)p)->cur) +#define history_def_getunique(p) (((((history_t *)p)->flags) & H_UNIQUE) != 0) +#define history_def_setunique(p, uni) \ + if (uni) \ + (((history_t *)p)->flags) |= H_UNIQUE; \ + else \ + (((history_t *)p)->flags) &= ~H_UNIQUE + +#define he_strerror(code) he_errlist[code] +#define he_seterrev(evp, code) {\ + evp->num = code;\ + evp->str = he_strerror(code);\ + } + +/* error messages */ +static const Char *const he_errlist[] = { + STR("OK"), + STR("unknown error"), + STR("malloc() failed"), + STR("first event not found"), + STR("last event not found"), + STR("empty list"), + STR("no next event"), + STR("no previous event"), + STR("current event is invalid"), + STR("event not found"), + STR("can't read history from file"), + STR("can't write history"), + STR("required parameter(s) not supplied"), + STR("history size negative"), + STR("function not allowed with other history-functions-set the default"), + STR("bad parameters") +}; +/* error codes */ +#define _HE_OK 0 +#define _HE_UNKNOWN 1 +#define _HE_MALLOC_FAILED 2 +#define _HE_FIRST_NOTFOUND 3 +#define _HE_LAST_NOTFOUND 4 +#define _HE_EMPTY_LIST 5 +#define _HE_END_REACHED 6 +#define _HE_START_REACHED 7 +#define _HE_CURR_INVALID 8 +#define _HE_NOT_FOUND 9 +#define _HE_HIST_READ 10 +#define _HE_HIST_WRITE 11 +#define _HE_PARAM_MISSING 12 +#define _HE_SIZE_NEGATIVE 13 +#define _HE_NOT_ALLOWED 14 +#define _HE_BAD_PARAM 15 + +/* history_def_first(): + * Default function to return the first event in the history. + */ +static int +history_def_first(void *p, TYPE(HistEvent) *ev) +{ + history_t *h = (history_t *) p; + + h->cursor = h->list.next; + if (h->cursor != &h->list) + *ev = h->cursor->ev; + else { + he_seterrev(ev, _HE_FIRST_NOTFOUND); + return -1; + } + + return 0; +} + + +/* history_def_last(): + * Default function to return the last event in the history. + */ +static int +history_def_last(void *p, TYPE(HistEvent) *ev) +{ + history_t *h = (history_t *) p; + + h->cursor = h->list.prev; + if (h->cursor != &h->list) + *ev = h->cursor->ev; + else { + he_seterrev(ev, _HE_LAST_NOTFOUND); + return -1; + } + + return 0; +} + + +/* history_def_next(): + * Default function to return the next event in the history. + */ +static int +history_def_next(void *p, TYPE(HistEvent) *ev) +{ + history_t *h = (history_t *) p; + + if (h->cursor == &h->list) { + he_seterrev(ev, _HE_EMPTY_LIST); + return -1; + } + + if (h->cursor->next == &h->list) { + he_seterrev(ev, _HE_END_REACHED); + return -1; + } + + h->cursor = h->cursor->next; + *ev = h->cursor->ev; + + return 0; +} + + +/* history_def_prev(): + * Default function to return the previous event in the history. + */ +static int +history_def_prev(void *p, TYPE(HistEvent) *ev) +{ + history_t *h = (history_t *) p; + + if (h->cursor == &h->list) { + he_seterrev(ev, + (h->cur > 0) ? _HE_END_REACHED : _HE_EMPTY_LIST); + return -1; + } + + if (h->cursor->prev == &h->list) { + he_seterrev(ev, _HE_START_REACHED); + return -1; + } + + h->cursor = h->cursor->prev; + *ev = h->cursor->ev; + + return 0; +} + + +/* history_def_curr(): + * Default function to return the current event in the history. + */ +static int +history_def_curr(void *p, TYPE(HistEvent) *ev) +{ + history_t *h = (history_t *) p; + + if (h->cursor != &h->list) + *ev = h->cursor->ev; + else { + he_seterrev(ev, + (h->cur > 0) ? _HE_CURR_INVALID : _HE_EMPTY_LIST); + return -1; + } + + return 0; +} + + +/* history_def_set(): + * Default function to set the current event in the history to the + * given one. + */ +static int +history_def_set(void *p, TYPE(HistEvent) *ev, const int n) +{ + history_t *h = (history_t *) p; + + if (h->cur == 0) { + he_seterrev(ev, _HE_EMPTY_LIST); + return -1; + } + if (h->cursor == &h->list || h->cursor->ev.num != n) { + for (h->cursor = h->list.next; h->cursor != &h->list; + h->cursor = h->cursor->next) + if (h->cursor->ev.num == n) + break; + } + if (h->cursor == &h->list) { + he_seterrev(ev, _HE_NOT_FOUND); + return -1; + } + return 0; +} + + +/* history_set_nth(): + * Default function to set the current event in the history to the + * n-th one. + */ +static int +history_set_nth(void *p, TYPE(HistEvent) *ev, int n) +{ + history_t *h = (history_t *) p; + + if (h->cur == 0) { + he_seterrev(ev, _HE_EMPTY_LIST); + return -1; + } + for (h->cursor = h->list.prev; h->cursor != &h->list; + h->cursor = h->cursor->prev) + if (n-- <= 0) + break; + if (h->cursor == &h->list) { + he_seterrev(ev, _HE_NOT_FOUND); + return -1; + } + return 0; +} + + +/* history_def_add(): + * Append string to element + */ +static int +history_def_add(void *p, TYPE(HistEvent) *ev, const Char *str) +{ + history_t *h = (history_t *) p; + size_t len; + Char *s; + HistEventPrivate *evp = (void *)&h->cursor->ev; + + if (h->cursor == &h->list) + return history_def_enter(p, ev, str); + len = Strlen(evp->str) + Strlen(str) + 1; + s = h_malloc(len * sizeof(*s)); + if (s == NULL) { + he_seterrev(ev, _HE_MALLOC_FAILED); + return -1; + } + (void) Strncpy(s, h->cursor->ev.str, len); + s[len - 1] = '\0'; + (void) Strncat(s, str, len - Strlen(s) - 1); + h_free(evp->str); + evp->str = s; + *ev = h->cursor->ev; + return 0; +} + + +static int +history_deldata_nth(history_t *h, TYPE(HistEvent) *ev, + int num, void **data) +{ + if (history_set_nth(h, ev, num) != 0) + return -1; + /* magic value to skip delete (just set to n-th history) */ + if (data == (void **)-1) + return 0; + ev->str = Strdup(h->cursor->ev.str); + ev->num = h->cursor->ev.num; + if (data) + *data = h->cursor->data; + history_def_delete(h, ev, h->cursor); + return 0; +} + + +/* history_def_del(): + * Delete element hp of the h list + */ +/* ARGSUSED */ +static int +history_def_del(void *p, TYPE(HistEvent) *ev __attribute__((__unused__)), + const int num) +{ + history_t *h = (history_t *) p; + if (history_def_set(h, ev, num) != 0) + return -1; + ev->str = Strdup(h->cursor->ev.str); + ev->num = h->cursor->ev.num; + history_def_delete(h, ev, h->cursor); + return 0; +} + + +/* history_def_delete(): + * Delete element hp of the h list + */ +/* ARGSUSED */ +static void +history_def_delete(history_t *h, + TYPE(HistEvent) *ev __attribute__((__unused__)), hentry_t *hp) +{ + HistEventPrivate *evp = (void *)&hp->ev; + if (hp == &h->list) + abort(); + if (h->cursor == hp) { + h->cursor = hp->prev; + if (h->cursor == &h->list) + h->cursor = hp->next; + } + hp->prev->next = hp->next; + hp->next->prev = hp->prev; + h_free(evp->str); + h_free(hp); + h->cur--; +} + + +/* history_def_insert(): + * Insert element with string str in the h list + */ +static int +history_def_insert(history_t *h, TYPE(HistEvent) *ev, const Char *str) +{ + hentry_t *c; + + c = h_malloc(sizeof(*c)); + if (c == NULL) + goto oomem; + if ((c->ev.str = h_strdup(str)) == NULL) { + h_free(c); + goto oomem; + } + c->data = NULL; + c->ev.num = ++h->eventid; + c->next = h->list.next; + c->prev = &h->list; + h->list.next->prev = c; + h->list.next = c; + h->cur++; + h->cursor = c; + + *ev = c->ev; + return 0; +oomem: + he_seterrev(ev, _HE_MALLOC_FAILED); + return -1; +} + + +/* history_def_enter(): + * Default function to enter an item in the history + */ +static int +history_def_enter(void *p, TYPE(HistEvent) *ev, const Char *str) +{ + history_t *h = (history_t *) p; + + if ((h->flags & H_UNIQUE) != 0 && h->list.next != &h->list && + Strcmp(h->list.next->ev.str, str) == 0) + return 0; + + if (history_def_insert(h, ev, str) == -1) + return -1; /* error, keep error message */ + + /* + * Always keep at least one entry. + * This way we don't have to check for the empty list. + */ + while (h->cur > h->max && h->cur > 0) + history_def_delete(h, ev, h->list.prev); + + return 1; +} + + +/* history_def_init(): + * Default history initialization function + */ +/* ARGSUSED */ +static int +history_def_init(void **p, TYPE(HistEvent) *ev __attribute__((__unused__)), int n) +{ + history_t *h = (history_t *) h_malloc(sizeof(*h)); + if (h == NULL) + return -1; + + if (n <= 0) + n = 0; + h->eventid = 0; + h->cur = 0; + h->max = n; + h->list.next = h->list.prev = &h->list; + h->list.ev.str = NULL; + h->list.ev.num = 0; + h->cursor = &h->list; + h->flags = 0; + *p = h; + return 0; +} + + +/* history_def_clear(): + * Default history cleanup function + */ +static void +history_def_clear(void *p, TYPE(HistEvent) *ev) +{ + history_t *h = (history_t *) p; + + while (h->list.prev != &h->list) + history_def_delete(h, ev, h->list.prev); + h->cursor = &h->list; + h->eventid = 0; + h->cur = 0; +} + + + + +/************************************************************************/ + +/* history_init(): + * Initialization function. + */ +TYPE(History) * +FUN(history,init)(void) +{ + TYPE(HistEvent) ev; + TYPE(History) *h = (TYPE(History) *) h_malloc(sizeof(*h)); + if (h == NULL) + return NULL; + + if (history_def_init(&h->h_ref, &ev, 0) == -1) { + h_free(h); + return NULL; + } + h->h_ent = -1; + h->h_next = history_def_next; + h->h_first = history_def_first; + h->h_last = history_def_last; + h->h_prev = history_def_prev; + h->h_curr = history_def_curr; + h->h_set = history_def_set; + h->h_clear = history_def_clear; + h->h_enter = history_def_enter; + h->h_add = history_def_add; + h->h_del = history_def_del; + + return h; +} + + +/* history_end(): + * clean up history; + */ +void +FUN(history,end)(TYPE(History) *h) +{ + TYPE(HistEvent) ev; + + if (h->h_next == history_def_next) + history_def_clear(h->h_ref, &ev); + h_free(h->h_ref); + h_free(h); +} + + + +/* history_setsize(): + * Set history number of events + */ +static int +history_setsize(TYPE(History) *h, TYPE(HistEvent) *ev, int num) +{ + + if (h->h_next != history_def_next) { + he_seterrev(ev, _HE_NOT_ALLOWED); + return -1; + } + if (num < 0) { + he_seterrev(ev, _HE_BAD_PARAM); + return -1; + } + history_def_setsize(h->h_ref, num); + return 0; +} + + +/* history_getsize(): + * Get number of events currently in history + */ +static int +history_getsize(TYPE(History) *h, TYPE(HistEvent) *ev) +{ + if (h->h_next != history_def_next) { + he_seterrev(ev, _HE_NOT_ALLOWED); + return -1; + } + ev->num = history_def_getsize(h->h_ref); + if (ev->num < -1) { + he_seterrev(ev, _HE_SIZE_NEGATIVE); + return -1; + } + return 0; +} + + +/* history_setunique(): + * Set if adjacent equal events should not be entered in history. + */ +static int +history_setunique(TYPE(History) *h, TYPE(HistEvent) *ev, int uni) +{ + + if (h->h_next != history_def_next) { + he_seterrev(ev, _HE_NOT_ALLOWED); + return -1; + } + history_def_setunique(h->h_ref, uni); + return 0; +} + + +/* history_getunique(): + * Get if adjacent equal events should not be entered in history. + */ +static int +history_getunique(TYPE(History) *h, TYPE(HistEvent) *ev) +{ + if (h->h_next != history_def_next) { + he_seterrev(ev, _HE_NOT_ALLOWED); + return -1; + } + ev->num = history_def_getunique(h->h_ref); + return 0; +} + + +/* history_set_fun(): + * Set history functions + */ +static int +history_set_fun(TYPE(History) *h, TYPE(History) *nh) +{ + TYPE(HistEvent) ev; + + if (nh->h_first == NULL || nh->h_next == NULL || nh->h_last == NULL || + nh->h_prev == NULL || nh->h_curr == NULL || nh->h_set == NULL || + nh->h_enter == NULL || nh->h_add == NULL || nh->h_clear == NULL || + nh->h_del == NULL || nh->h_ref == NULL) { + if (h->h_next != history_def_next) { + if (history_def_init(&h->h_ref, &ev, 0) == -1) + return -1; + h->h_first = history_def_first; + h->h_next = history_def_next; + h->h_last = history_def_last; + h->h_prev = history_def_prev; + h->h_curr = history_def_curr; + h->h_set = history_def_set; + h->h_clear = history_def_clear; + h->h_enter = history_def_enter; + h->h_add = history_def_add; + h->h_del = history_def_del; + } + return -1; + } + if (h->h_next == history_def_next) + history_def_clear(h->h_ref, &ev); + + h->h_ent = -1; + h->h_first = nh->h_first; + h->h_next = nh->h_next; + h->h_last = nh->h_last; + h->h_prev = nh->h_prev; + h->h_curr = nh->h_curr; + h->h_set = nh->h_set; + h->h_clear = nh->h_clear; + h->h_enter = nh->h_enter; + h->h_add = nh->h_add; + h->h_del = nh->h_del; + + return 0; +} + + +/* history_load(): + * TYPE(History) load function + */ +static int +history_load(TYPE(History) *h, const char *fname) +{ + FILE *fp; + char *line; + size_t llen; + ssize_t sz; + size_t max_size; + char *ptr; + int i = -1; + TYPE(HistEvent) ev; +#ifndef NARROWCHAR + static ct_buffer_t conv; +#endif + + if ((fp = fopen(fname, "r")) == NULL) + return i; + + line = NULL; + llen = 0; + if ((sz = getline(&line, &llen, fp)) == -1) + goto done; + + if (strncmp(line, hist_cookie, (size_t)sz) != 0) + goto done; + + ptr = h_malloc((max_size = 1024) * sizeof(*ptr)); + if (ptr == NULL) + goto done; + for (i = 0; (sz = getline(&line, &llen, fp)) != -1; i++) { + if (sz > 0 && line[sz - 1] == '\n') + line[--sz] = '\0'; + if (max_size < (size_t)sz) { + char *nptr; + max_size = ((size_t)sz + 1024) & (size_t)~1023; + nptr = h_realloc(ptr, max_size * sizeof(*ptr)); + if (nptr == NULL) { + i = -1; + goto oomem; + } + ptr = nptr; + } + (void) strunvis(ptr, line); + if (HENTER(h, &ev, ct_decode_string(ptr, &conv)) == -1) { + i = -1; + goto oomem; + } + } +oomem: + h_free(ptr); +done: + free(line); + (void) fclose(fp); + return i; +} + + +/* history_save_fp(): + * TYPE(History) save function + */ +static int +history_save_fp(TYPE(History) *h, FILE *fp) +{ + TYPE(HistEvent) ev; + int i = -1, retval; + size_t len, max_size; + char *ptr; + const char *str; +#ifndef NARROWCHAR + static ct_buffer_t conv; +#endif + + if (fchmod(fileno(fp), S_IRUSR|S_IWUSR) == -1) + goto done; + if (fputs(hist_cookie, fp) == EOF) + goto done; + ptr = h_malloc((max_size = 1024) * sizeof(*ptr)); + if (ptr == NULL) + goto done; + for (i = 0, retval = HLAST(h, &ev); + retval != -1; + retval = HPREV(h, &ev), i++) { + str = ct_encode_string(ev.str, &conv); + len = strlen(str) * 4 + 1; + if (len > max_size) { + char *nptr; + max_size = (len + 1024) & (size_t)~1023; + nptr = h_realloc(ptr, max_size * sizeof(*ptr)); + if (nptr == NULL) { + i = -1; + goto oomem; + } + ptr = nptr; + } + (void) strvis(ptr, str, VIS_WHITE); + (void) fprintf(fp, "%s\n", ptr); + } +oomem: + h_free(ptr); +done: + return i; +} + + +/* history_save(): + * History save function + */ +static int +history_save(TYPE(History) *h, const char *fname) +{ + FILE *fp; + int i; + + if ((fp = fopen(fname, "w")) == NULL) + return -1; + + i = history_save_fp(h, fp); + + (void) fclose(fp); + return i; +} + + +/* history_prev_event(): + * Find the previous event, with number given + */ +static int +history_prev_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num) +{ + int retval; + + for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) + if (ev->num == num) + return 0; + + he_seterrev(ev, _HE_NOT_FOUND); + return -1; +} + + +static int +history_next_evdata(TYPE(History) *h, TYPE(HistEvent) *ev, int num, void **d) +{ + int retval; + + for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) + if (ev->num == num) { + if (d) + *d = ((history_t *)h->h_ref)->cursor->data; + return 0; + } + + he_seterrev(ev, _HE_NOT_FOUND); + return -1; +} + + +/* history_next_event(): + * Find the next event, with number given + */ +static int +history_next_event(TYPE(History) *h, TYPE(HistEvent) *ev, int num) +{ + int retval; + + for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev)) + if (ev->num == num) + return 0; + + he_seterrev(ev, _HE_NOT_FOUND); + return -1; +} + + +/* history_prev_string(): + * Find the previous event beginning with string + */ +static int +history_prev_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) +{ + size_t len = Strlen(str); + int retval; + + for (retval = HCURR(h, ev); retval != -1; retval = HNEXT(h, ev)) + if (Strncmp(str, ev->str, len) == 0) + return 0; + + he_seterrev(ev, _HE_NOT_FOUND); + return -1; +} + + +/* history_next_string(): + * Find the next event beginning with string + */ +static int +history_next_string(TYPE(History) *h, TYPE(HistEvent) *ev, const Char *str) +{ + size_t len = Strlen(str); + int retval; + + for (retval = HCURR(h, ev); retval != -1; retval = HPREV(h, ev)) + if (Strncmp(str, ev->str, len) == 0) + return 0; + + he_seterrev(ev, _HE_NOT_FOUND); + return -1; +} + + +/* history(): + * User interface to history functions. + */ +int +FUNW(history)(TYPE(History) *h, TYPE(HistEvent) *ev, int fun, ...) +{ + va_list va; + const Char *str; + int retval; + + va_start(va, fun); + + he_seterrev(ev, _HE_OK); + + switch (fun) { + case H_GETSIZE: + retval = history_getsize(h, ev); + break; + + case H_SETSIZE: + retval = history_setsize(h, ev, va_arg(va, int)); + break; + + case H_GETUNIQUE: + retval = history_getunique(h, ev); + break; + + case H_SETUNIQUE: + retval = history_setunique(h, ev, va_arg(va, int)); + break; + + case H_ADD: + str = va_arg(va, const Char *); + retval = HADD(h, ev, str); + break; + + case H_DEL: + retval = HDEL(h, ev, va_arg(va, const int)); + break; + + case H_ENTER: + str = va_arg(va, const Char *); + if ((retval = HENTER(h, ev, str)) != -1) + h->h_ent = ev->num; + break; + + case H_APPEND: + str = va_arg(va, const Char *); + if ((retval = HSET(h, ev, h->h_ent)) != -1) + retval = HADD(h, ev, str); + break; + + case H_FIRST: + retval = HFIRST(h, ev); + break; + + case H_NEXT: + retval = HNEXT(h, ev); + break; + + case H_LAST: + retval = HLAST(h, ev); + break; + + case H_PREV: + retval = HPREV(h, ev); + break; + + case H_CURR: + retval = HCURR(h, ev); + break; + + case H_SET: + retval = HSET(h, ev, va_arg(va, const int)); + break; + + case H_CLEAR: + HCLEAR(h, ev); + retval = 0; + break; + + case H_LOAD: + retval = history_load(h, va_arg(va, const char *)); + if (retval == -1) + he_seterrev(ev, _HE_HIST_READ); + break; + + case H_SAVE: + retval = history_save(h, va_arg(va, const char *)); + if (retval == -1) + he_seterrev(ev, _HE_HIST_WRITE); + break; + + case H_SAVE_FP: + retval = history_save_fp(h, va_arg(va, FILE *)); + if (retval == -1) + he_seterrev(ev, _HE_HIST_WRITE); + break; + + case H_PREV_EVENT: + retval = history_prev_event(h, ev, va_arg(va, int)); + break; + + case H_NEXT_EVENT: + retval = history_next_event(h, ev, va_arg(va, int)); + break; + + case H_PREV_STR: + retval = history_prev_string(h, ev, va_arg(va, const Char *)); + break; + + case H_NEXT_STR: + retval = history_next_string(h, ev, va_arg(va, const Char *)); + break; + + case H_FUNC: + { + TYPE(History) hf; + + hf.h_ref = va_arg(va, void *); + h->h_ent = -1; + hf.h_first = va_arg(va, history_gfun_t); + hf.h_next = va_arg(va, history_gfun_t); + hf.h_last = va_arg(va, history_gfun_t); + hf.h_prev = va_arg(va, history_gfun_t); + hf.h_curr = va_arg(va, history_gfun_t); + hf.h_set = va_arg(va, history_sfun_t); + hf.h_clear = va_arg(va, history_vfun_t); + hf.h_enter = va_arg(va, history_efun_t); + hf.h_add = va_arg(va, history_efun_t); + hf.h_del = va_arg(va, history_sfun_t); + + if ((retval = history_set_fun(h, &hf)) == -1) + he_seterrev(ev, _HE_PARAM_MISSING); + break; + } + + case H_END: + FUN(history,end)(h); + retval = 0; + break; + + case H_NEXT_EVDATA: + { + int num = va_arg(va, int); + void **d = va_arg(va, void **); + retval = history_next_evdata(h, ev, num, d); + break; + } + + case H_DELDATA: + { + int num = va_arg(va, int); + void **d = va_arg(va, void **); + retval = history_deldata_nth((history_t *)h->h_ref, ev, num, d); + break; + } + + case H_REPLACE: /* only use after H_NEXT_EVDATA */ + { + const Char *line = va_arg(va, const Char *); + void *d = va_arg(va, void *); + const Char *s; + if(!line || !(s = Strdup(line))) { + retval = -1; + break; + } + ((history_t *)h->h_ref)->cursor->ev.str = s; + ((history_t *)h->h_ref)->cursor->data = d; + retval = 0; + break; + } + + default: + retval = -1; + he_seterrev(ev, _HE_UNKNOWN); + break; + } + va_end(va); + return retval; +} diff --git a/crypto/heimdal/lib/libedit/src/historyn.c b/crypto/heimdal/lib/libedit/src/historyn.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/historyn.c @@ -0,0 +1,3 @@ +#include "config.h" +#define NARROWCHAR +#include "history.c" diff --git a/crypto/heimdal/lib/libedit/src/keymacro.h b/crypto/heimdal/lib/libedit/src/keymacro.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/keymacro.h @@ -0,0 +1,76 @@ +/* $NetBSD: keymacro.h,v 1.6 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)key.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.keymacro.h: Key macro header + */ +#ifndef _h_el_keymacro +#define _h_el_keymacro + +typedef union keymacro_value_t { + el_action_t cmd; /* If it is a command the # */ + wchar_t *str; /* If it is a string... */ +} keymacro_value_t; + +typedef struct keymacro_node_t keymacro_node_t; + +typedef struct el_keymacro_t { + wchar_t *buf; /* Key print buffer */ + keymacro_node_t *map; /* Key map */ + keymacro_value_t val; /* Local conversion buffer */ +} el_keymacro_t; + +#define XK_CMD 0 +#define XK_STR 1 +#define XK_NOD 2 + +libedit_private int keymacro_init(EditLine *); +libedit_private void keymacro_end(EditLine *); +libedit_private keymacro_value_t *keymacro_map_cmd(EditLine *, int); +libedit_private keymacro_value_t *keymacro_map_str(EditLine *, wchar_t *); +libedit_private void keymacro_reset(EditLine *); +libedit_private int keymacro_get(EditLine *, wchar_t *, keymacro_value_t *); +libedit_private void keymacro_add(EditLine *, const wchar_t *, + keymacro_value_t *, int); +libedit_private void keymacro_clear(EditLine *, el_action_t *, const wchar_t *); +libedit_private int keymacro_delete(EditLine *, const wchar_t *); +libedit_private void keymacro_print(EditLine *, const wchar_t *); +libedit_private void keymacro_kprint(EditLine *, const wchar_t *, + keymacro_value_t *, int); +libedit_private size_t keymacro__decode_str(const wchar_t *, char *, size_t, + const char *); + +#endif /* _h_el_keymacro */ diff --git a/crypto/heimdal/lib/libedit/src/keymacro.c b/crypto/heimdal/lib/libedit/src/keymacro.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/keymacro.c @@ -0,0 +1,669 @@ +/* $NetBSD: keymacro.c,v 1.23 2016/05/24 15:00:45 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)key.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: keymacro.c,v 1.23 2016/05/24 15:00:45 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * keymacro.c: This module contains the procedures for maintaining + * the extended-key map. + * + * An extended-key (key) is a sequence of keystrokes introduced + * with a sequence introducer and consisting of an arbitrary + * number of characters. This module maintains a map (the + * el->el_keymacro.map) + * to convert these extended-key sequences into input strs + * (XK_STR) or editor functions (XK_CMD). + * + * Warning: + * If key is a substr of some other keys, then the longer + * keys are lost!! That is, if the keys "abcd" and "abcef" + * are in el->el_keymacro.map, adding the key "abc" will cause + * the first two definitions to be lost. + * + * Restrictions: + * ------------- + * 1) It is not possible to have one key that is a + * substr of another. + */ +#include +#include + +#include "el.h" +#include "fcns.h" + +/* + * The Nodes of the el->el_keymacro.map. The el->el_keymacro.map is a + * linked list of these node elements + */ +struct keymacro_node_t { + wchar_t ch; /* single character of key */ + int type; /* node type */ + keymacro_value_t val; /* command code or pointer to str, */ + /* if this is a leaf */ + struct keymacro_node_t *next; /* ptr to next char of this key */ + struct keymacro_node_t *sibling;/* ptr to another key with same prefix*/ +}; + +static int node_trav(EditLine *, keymacro_node_t *, wchar_t *, + keymacro_value_t *); +static int node__try(EditLine *, keymacro_node_t *, + const wchar_t *, keymacro_value_t *, int); +static keymacro_node_t *node__get(wint_t); +static void node__free(keymacro_node_t *); +static void node__put(EditLine *, keymacro_node_t *); +static int node__delete(EditLine *, keymacro_node_t **, + const wchar_t *); +static int node_lookup(EditLine *, const wchar_t *, + keymacro_node_t *, size_t); +static int node_enum(EditLine *, keymacro_node_t *, size_t); + +#define KEY_BUFSIZ EL_BUFSIZ + + +/* keymacro_init(): + * Initialize the key maps + */ +libedit_private int +keymacro_init(EditLine *el) +{ + + el->el_keymacro.buf = el_malloc(KEY_BUFSIZ * + sizeof(*el->el_keymacro.buf)); + if (el->el_keymacro.buf == NULL) + return -1; + el->el_keymacro.map = NULL; + keymacro_reset(el); + return 0; +} + +/* keymacro_end(): + * Free the key maps + */ +libedit_private void +keymacro_end(EditLine *el) +{ + + el_free(el->el_keymacro.buf); + el->el_keymacro.buf = NULL; + node__free(el->el_keymacro.map); +} + + +/* keymacro_map_cmd(): + * Associate cmd with a key value + */ +libedit_private keymacro_value_t * +keymacro_map_cmd(EditLine *el, int cmd) +{ + + el->el_keymacro.val.cmd = (el_action_t) cmd; + return &el->el_keymacro.val; +} + + +/* keymacro_map_str(): + * Associate str with a key value + */ +libedit_private keymacro_value_t * +keymacro_map_str(EditLine *el, wchar_t *str) +{ + + el->el_keymacro.val.str = str; + return &el->el_keymacro.val; +} + + +/* keymacro_reset(): + * Takes all nodes on el->el_keymacro.map and puts them on free list. + * Then initializes el->el_keymacro.map with arrow keys + * [Always bind the ansi arrow keys?] + */ +libedit_private void +keymacro_reset(EditLine *el) +{ + + node__put(el, el->el_keymacro.map); + el->el_keymacro.map = NULL; + return; +} + + +/* keymacro_get(): + * Calls the recursive function with entry point el->el_keymacro.map + * Looks up *ch in map and then reads characters until a + * complete match is found or a mismatch occurs. Returns the + * type of the match found (XK_STR or XK_CMD). + * Returns NULL in val.str and XK_STR for no match. + * Returns XK_NOD for end of file or read error. + * The last character read is returned in *ch. + */ +libedit_private int +keymacro_get(EditLine *el, wchar_t *ch, keymacro_value_t *val) +{ + + return node_trav(el, el->el_keymacro.map, ch, val); +} + + +/* keymacro_add(): + * Adds key to the el->el_keymacro.map and associates the value in + * val with it. If key is already is in el->el_keymacro.map, the new + * code is applied to the existing key. Ntype specifies if code is a + * command, an out str or a unix command. + */ +libedit_private void +keymacro_add(EditLine *el, const wchar_t *key, keymacro_value_t *val, + int ntype) +{ + + if (key[0] == '\0') { + (void) fprintf(el->el_errfile, + "keymacro_add: Null extended-key not allowed.\n"); + return; + } + if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) { + (void) fprintf(el->el_errfile, + "keymacro_add: sequence-lead-in command not allowed\n"); + return; + } + if (el->el_keymacro.map == NULL) + /* tree is initially empty. Set up new node to match key[0] */ + el->el_keymacro.map = node__get(key[0]); + /* it is properly initialized */ + + /* Now recurse through el->el_keymacro.map */ + (void) node__try(el, el->el_keymacro.map, key, val, ntype); + return; +} + + +/* keymacro_clear(): + * + */ +libedit_private void +keymacro_clear(EditLine *el, el_action_t *map, const wchar_t *in) +{ + if (*in > N_KEYS) /* can't be in the map */ + return; + if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) && + ((map == el->el_map.key && + el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) || + (map == el->el_map.alt && + el->el_map.key[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN))) + (void) keymacro_delete(el, in); +} + + +/* keymacro_delete(): + * Delete the key and all longer keys staring with key, if + * they exists. + */ +libedit_private int +keymacro_delete(EditLine *el, const wchar_t *key) +{ + + if (key[0] == '\0') { + (void) fprintf(el->el_errfile, + "keymacro_delete: Null extended-key not allowed.\n"); + return -1; + } + if (el->el_keymacro.map == NULL) + return 0; + + (void) node__delete(el, &el->el_keymacro.map, key); + return 0; +} + + +/* keymacro_print(): + * Print the binding associated with key key. + * Print entire el->el_keymacro.map if null + */ +libedit_private void +keymacro_print(EditLine *el, const wchar_t *key) +{ + + /* do nothing if el->el_keymacro.map is empty and null key specified */ + if (el->el_keymacro.map == NULL && *key == 0) + return; + + el->el_keymacro.buf[0] = '"'; + if (node_lookup(el, key, el->el_keymacro.map, (size_t)1) <= -1) + /* key is not bound */ + (void) fprintf(el->el_errfile, "Unbound extended key \"%ls" + "\"\n", key); + return; +} + + +/* node_trav(): + * recursively traverses node in tree until match or mismatch is + * found. May read in more characters. + */ +static int +node_trav(EditLine *el, keymacro_node_t *ptr, wchar_t *ch, + keymacro_value_t *val) +{ + + if (ptr->ch == *ch) { + /* match found */ + if (ptr->next) { + /* key not complete so get next char */ + if (el_wgetc(el, ch) != 1) + return XK_NOD; + return node_trav(el, ptr->next, ch, val); + } else { + *val = ptr->val; + if (ptr->type != XK_CMD) + *ch = '\0'; + return ptr->type; + } + } else { + /* no match found here */ + if (ptr->sibling) { + /* try next sibling */ + return node_trav(el, ptr->sibling, ch, val); + } else { + /* no next sibling -- mismatch */ + val->str = NULL; + return XK_STR; + } + } +} + + +/* node__try(): + * Find a node that matches *str or allocate a new one + */ +static int +node__try(EditLine *el, keymacro_node_t *ptr, const wchar_t *str, + keymacro_value_t *val, int ntype) +{ + + if (ptr->ch != *str) { + keymacro_node_t *xm; + + for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) + if (xm->sibling->ch == *str) + break; + if (xm->sibling == NULL) + xm->sibling = node__get(*str); /* setup new node */ + ptr = xm->sibling; + } + if (*++str == '\0') { + /* we're there */ + if (ptr->next != NULL) { + node__put(el, ptr->next); + /* lose longer keys with this prefix */ + ptr->next = NULL; + } + switch (ptr->type) { + case XK_CMD: + case XK_NOD: + break; + case XK_STR: + if (ptr->val.str) + el_free(ptr->val.str); + break; + default: + EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", + ptr->type)); + break; + } + + switch (ptr->type = ntype) { + case XK_CMD: + ptr->val = *val; + break; + case XK_STR: + if ((ptr->val.str = wcsdup(val->str)) == NULL) + return -1; + break; + default: + EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); + break; + } + } else { + /* still more chars to go */ + if (ptr->next == NULL) + ptr->next = node__get(*str); /* setup new node */ + (void) node__try(el, ptr->next, str, val, ntype); + } + return 0; +} + + +/* node__delete(): + * Delete node that matches str + */ +static int +node__delete(EditLine *el, keymacro_node_t **inptr, const wchar_t *str) +{ + keymacro_node_t *ptr; + keymacro_node_t *prev_ptr = NULL; + + ptr = *inptr; + + if (ptr->ch != *str) { + keymacro_node_t *xm; + + for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) + if (xm->sibling->ch == *str) + break; + if (xm->sibling == NULL) + return 0; + prev_ptr = xm; + ptr = xm->sibling; + } + if (*++str == '\0') { + /* we're there */ + if (prev_ptr == NULL) + *inptr = ptr->sibling; + else + prev_ptr->sibling = ptr->sibling; + ptr->sibling = NULL; + node__put(el, ptr); + return 1; + } else if (ptr->next != NULL && + node__delete(el, &ptr->next, str) == 1) { + if (ptr->next != NULL) + return 0; + if (prev_ptr == NULL) + *inptr = ptr->sibling; + else + prev_ptr->sibling = ptr->sibling; + ptr->sibling = NULL; + node__put(el, ptr); + return 1; + } else { + return 0; + } +} + + +/* node__put(): + * Puts a tree of nodes onto free list using free(3). + */ +static void +node__put(EditLine *el, keymacro_node_t *ptr) +{ + if (ptr == NULL) + return; + + if (ptr->next != NULL) { + node__put(el, ptr->next); + ptr->next = NULL; + } + node__put(el, ptr->sibling); + + switch (ptr->type) { + case XK_CMD: + case XK_NOD: + break; + case XK_STR: + if (ptr->val.str != NULL) + el_free(ptr->val.str); + break; + default: + EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type)); + break; + } + el_free(ptr); +} + + +/* node__get(): + * Returns pointer to a keymacro_node_t for ch. + */ +static keymacro_node_t * +node__get(wint_t ch) +{ + keymacro_node_t *ptr; + + ptr = el_malloc(sizeof(*ptr)); + if (ptr == NULL) + return NULL; + ptr->ch = ch; + ptr->type = XK_NOD; + ptr->val.str = NULL; + ptr->next = NULL; + ptr->sibling = NULL; + return ptr; +} + +static void +node__free(keymacro_node_t *k) +{ + if (k == NULL) + return; + node__free(k->sibling); + node__free(k->next); + el_free(k); +} + +/* node_lookup(): + * look for the str starting at node ptr. + * Print if last node + */ +static int +node_lookup(EditLine *el, const wchar_t *str, keymacro_node_t *ptr, + size_t cnt) +{ + ssize_t used; + + if (ptr == NULL) + return -1; /* cannot have null ptr */ + + if (!str || *str == 0) { + /* no more chars in str. node_enum from here. */ + (void) node_enum(el, ptr, cnt); + return 0; + } else { + /* If match put this char into el->el_keymacro.buf. Recurse */ + if (ptr->ch == *str) { + /* match found */ + used = ct_visual_char(el->el_keymacro.buf + cnt, + KEY_BUFSIZ - cnt, ptr->ch); + if (used == -1) + return -1; /* ran out of buffer space */ + if (ptr->next != NULL) + /* not yet at leaf */ + return (node_lookup(el, str + 1, ptr->next, + (size_t)used + cnt)); + else { + /* next node is null so key should be complete */ + if (str[1] == 0) { + size_t px = cnt + (size_t)used; + el->el_keymacro.buf[px] = '"'; + el->el_keymacro.buf[px + 1] = '\0'; + keymacro_kprint(el, el->el_keymacro.buf, + &ptr->val, ptr->type); + return 0; + } else + return -1; + /* mismatch -- str still has chars */ + } + } else { + /* no match found try sibling */ + if (ptr->sibling) + return (node_lookup(el, str, ptr->sibling, + cnt)); + else + return -1; + } + } +} + + +/* node_enum(): + * Traverse the node printing the characters it is bound in buffer + */ +static int +node_enum(EditLine *el, keymacro_node_t *ptr, size_t cnt) +{ + ssize_t used; + + if (cnt >= KEY_BUFSIZ - 5) { /* buffer too small */ + el->el_keymacro.buf[++cnt] = '"'; + el->el_keymacro.buf[++cnt] = '\0'; + (void) fprintf(el->el_errfile, + "Some extended keys too long for internal print buffer"); + (void) fprintf(el->el_errfile, " \"%ls...\"\n", + el->el_keymacro.buf); + return 0; + } + if (ptr == NULL) { +#ifdef DEBUG_EDIT + (void) fprintf(el->el_errfile, + "node_enum: BUG!! Null ptr passed\n!"); +#endif + return -1; + } + /* put this char at end of str */ + used = ct_visual_char(el->el_keymacro.buf + cnt, KEY_BUFSIZ - cnt, + ptr->ch); + if (ptr->next == NULL) { + /* print this key and function */ + el->el_keymacro.buf[cnt + (size_t)used ] = '"'; + el->el_keymacro.buf[cnt + (size_t)used + 1] = '\0'; + keymacro_kprint(el, el->el_keymacro.buf, &ptr->val, ptr->type); + } else + (void) node_enum(el, ptr->next, cnt + (size_t)used); + + /* go to sibling if there is one */ + if (ptr->sibling) + (void) node_enum(el, ptr->sibling, cnt); + return 0; +} + + +/* keymacro_kprint(): + * Print the specified key and its associated + * function specified by val + */ +libedit_private void +keymacro_kprint(EditLine *el, const wchar_t *key, keymacro_value_t *val, + int ntype) +{ + el_bindings_t *fp; + char unparsbuf[EL_BUFSIZ]; + static const char fmt[] = "%-15s-> %s\n"; + + if (val != NULL) + switch (ntype) { + case XK_STR: + (void) keymacro__decode_str(val->str, unparsbuf, + sizeof(unparsbuf), + ntype == XK_STR ? "\"\"" : "[]"); + (void) fprintf(el->el_outfile, fmt, + ct_encode_string(key, &el->el_scratch), unparsbuf); + break; + case XK_CMD: + for (fp = el->el_map.help; fp->name; fp++) + if (val->cmd == fp->func) { + wcstombs(unparsbuf, fp->name, sizeof(unparsbuf)); + unparsbuf[sizeof(unparsbuf) -1] = '\0'; + (void) fprintf(el->el_outfile, fmt, + ct_encode_string(key, &el->el_scratch), unparsbuf); + break; + } +#ifdef DEBUG_KEY + if (fp->name == NULL) + (void) fprintf(el->el_outfile, + "BUG! Command not found.\n"); +#endif + + break; + default: + EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); + break; + } + else + (void) fprintf(el->el_outfile, fmt, ct_encode_string(key, + &el->el_scratch), "no input"); +} + + +#define ADDC(c) \ + if (b < eb) \ + *b++ = c; \ + else \ + b++ +/* keymacro__decode_str(): + * Make a printable version of the ey + */ +libedit_private size_t +keymacro__decode_str(const wchar_t *str, char *buf, size_t len, + const char *sep) +{ + char *b = buf, *eb = b + len; + const wchar_t *p; + + b = buf; + if (sep[0] != '\0') { + ADDC(sep[0]); + } + if (*str == '\0') { + ADDC('^'); + ADDC('@'); + goto add_endsep; + } + for (p = str; *p != 0; p++) { + wchar_t dbuf[VISUAL_WIDTH_MAX]; + wchar_t *p2 = dbuf; + ssize_t l = ct_visual_char(dbuf, VISUAL_WIDTH_MAX, *p); + while (l-- > 0) { + ssize_t n = ct_encode_char(b, (size_t)(eb - b), *p2++); + if (n == -1) /* ran out of space */ + goto add_endsep; + else + b += n; + } + } +add_endsep: + if (sep[0] != '\0' && sep[1] != '\0') { + ADDC(sep[1]); + } + ADDC('\0'); + if ((size_t)(b - buf) >= len) + buf[len - 1] = '\0'; + return (size_t)(b - buf); +} diff --git a/crypto/heimdal/lib/libedit/src/makelist b/crypto/heimdal/lib/libedit/src/makelist new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/makelist @@ -0,0 +1,177 @@ +#!/bin/sh - +# $NetBSD: makelist,v 1.29 2016/05/09 21:46:56 christos Exp $ +# +# Copyright (c) 1992, 1993 +# The Regents of the University of California. All rights reserved. +# +# This code is derived from software contributed to Berkeley by +# Christos Zoulas of Cornell University. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# @(#)makelist 5.3 (Berkeley) 6/4/93 + +# makelist.sh: Automatically generate header files... + +if [ "x$AWK" = "x" ] +then + AWK=awk +fi +USAGE="Usage: $0 -h|-fc|-fh|-bh " + +if [ "x$1" = "x" ] +then + echo $USAGE 1>&2 + exit 1 +fi + +FLAG="$1" +shift + +FILES="$@" + +case $FLAG in + +-h) + set - `echo $FILES | sed -e 's/\\./_/g'` + hdr="_h_`basename $1`" + cat $FILES | $AWK ' + BEGIN { + printf("/* Automatically generated file, do not edit */\n"); + printf("#ifndef %s\n#define %s\n", "'$hdr'", "'$hdr'"); + } + /\(\):/ { + pr = substr($2, 1, 2); + if (pr == "vi" || pr == "em" || pr == "ed") { + name = substr($2, 1, length($2) - 3); +# +# XXX: need a space between name and prototype so that -fc and -fh +# parsing is much easier +# + printf("libedit_private el_action_t\t%s (EditLine *, wint_t);\n", + name); + } + } + END { + printf("#endif /* %s */\n", "'$hdr'"); + }' + ;; + +# generate help.h from various .c files +# +-bh) + cat $FILES | $AWK ' + BEGIN { + printf("/* Automatically generated file, do not edit */\n"); + printf("static const struct el_bindings_t el_func_help[] = {\n"); + low = "abcdefghijklmnopqrstuvwxyz_"; + high = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_"; + for (i = 1; i <= length(low); i++) + tr[substr(low, i, 1)] = substr(high, i, 1); + } + /\(\):/ { + pr = substr($2, 1, 2); + if (pr == "vi" || pr == "em" || pr == "ed") { + name = substr($2, 1, length($2) - 3); + uname = ""; + fname = ""; + for (i = 1; i <= length(name); i++) { + s = substr(name, i, 1); + uname = uname tr[s]; + if (s == "_") + s = "-"; + fname = fname s; + } + + printf(" { %-30.30s %-30.30s\n","L\"" fname "\",", uname ","); + ok = 1; + } + } + /^ \*/ { + if (ok) { + printf(" L\""); + for (i = 2; i < NF; i++) + printf("%s ", $i); + printf("%s\" },\n", $i); + ok = 0; + } + } + END { + printf("};\n"); + }' + ;; + +# generate fcns.h from various .h files +# +-fh) + cat $FILES | $AWK '/el_action_t/ { print $3 }' | \ + sort | tr '[:lower:]' '[:upper:]' | $AWK ' + BEGIN { + printf("/* Automatically generated file, do not edit */\n"); + count = 0; + } + { + printf("#define\t%-30.30s\t%3d\n", $1, count++); + } + END { + printf("#define\t%-30.30s\t%3d\n", "EL_NUM_FCNS", count); + }' + ;; + +# generate func.h from various .h files +# +-fc) + cat $FILES | $AWK '/el_action_t/ { print $3 }' | sort | $AWK ' + BEGIN { + printf("/* Automatically generated file, do not edit */\n"); + printf("static const el_func_t el_func[] = {"); + maxlen = 80; + needn = 1; + len = 0; + } + { + clen = 25 + 2; + len += clen; + if (len >= maxlen) + needn = 1; + if (needn) { + printf("\n "); + needn = 0; + len = 4 + clen; + } + s = $1 ","; + printf("%-26.26s ", s); + } + END { + printf("\n};\n"); + }' + ;; + +*) + echo $USAGE 1>&2 + exit 1 + ;; + +esac diff --git a/crypto/heimdal/lib/libedit/src/map.h b/crypto/heimdal/lib/libedit/src/map.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/map.h @@ -0,0 +1,79 @@ +/* $NetBSD: map.h,v 1.13 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)map.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.map.h: Editor maps + */ +#ifndef _h_el_map +#define _h_el_map + +typedef el_action_t (*el_func_t)(EditLine *, wint_t); + +typedef struct el_bindings_t { /* for the "bind" shell command */ + const wchar_t *name; /* function name for bind command */ + int func; /* function numeric value */ + const wchar_t *description; /* description of function */ +} el_bindings_t; + +typedef struct el_map_t { + el_action_t *alt; /* The current alternate key map */ + el_action_t *key; /* The current normal key map */ + el_action_t *current; /* The keymap we are using */ + const el_action_t *emacs; /* The default emacs key map */ + const el_action_t *vic; /* The vi command mode key map */ + const el_action_t *vii; /* The vi insert mode key map */ + int type; /* Emacs or vi */ + el_bindings_t *help; /* The help for the editor functions */ + el_func_t *func; /* List of available functions */ + size_t nfunc; /* The number of functions/help items */ +} el_map_t; + +#define MAP_EMACS 0 +#define MAP_VI 1 + +#define N_KEYS 256 + +libedit_private int map_bind(EditLine *, int, const wchar_t **); +libedit_private int map_init(EditLine *); +libedit_private void map_end(EditLine *); +libedit_private void map_init_vi(EditLine *); +libedit_private void map_init_emacs(EditLine *); +libedit_private int map_set_editor(EditLine *, wchar_t *); +libedit_private int map_get_editor(EditLine *, const wchar_t **); +libedit_private int map_addfunc(EditLine *, const wchar_t *, const wchar_t *, + el_func_t); + +#endif /* _h_el_map */ diff --git a/crypto/heimdal/lib/libedit/src/map.c b/crypto/heimdal/lib/libedit/src/map.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/map.c @@ -0,0 +1,1427 @@ +/* $NetBSD: map.c,v 1.51 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)map.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: map.c,v 1.51 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * map.c: Editor function definitions + */ +#include +#include +#include + +#include "el.h" +#include "common.h" +#include "emacs.h" +#include "vi.h" +#include "fcns.h" +#include "func.h" +#include "help.h" +#include "parse.h" + +static void map_print_key(EditLine *, el_action_t *, const wchar_t *); +static void map_print_some_keys(EditLine *, el_action_t *, wint_t, wint_t); +static void map_print_all_keys(EditLine *); +static void map_init_nls(EditLine *); +static void map_init_meta(EditLine *); + +/* keymap tables ; should be N_KEYS*sizeof(KEYCMD) bytes long */ + + +static const el_action_t el_map_emacs[] = { + /* 0 */ EM_SET_MARK, /* ^@ */ + /* 1 */ ED_MOVE_TO_BEG, /* ^A */ + /* 2 */ ED_PREV_CHAR, /* ^B */ + /* 3 */ ED_IGNORE, /* ^C */ + /* 4 */ EM_DELETE_OR_LIST, /* ^D */ + /* 5 */ ED_MOVE_TO_END, /* ^E */ + /* 6 */ ED_NEXT_CHAR, /* ^F */ + /* 7 */ ED_UNASSIGNED, /* ^G */ + /* 8 */ EM_DELETE_PREV_CHAR, /* ^H */ + /* 9 */ ED_UNASSIGNED, /* ^I */ + /* 10 */ ED_NEWLINE, /* ^J */ + /* 11 */ ED_KILL_LINE, /* ^K */ + /* 12 */ ED_CLEAR_SCREEN, /* ^L */ + /* 13 */ ED_NEWLINE, /* ^M */ + /* 14 */ ED_NEXT_HISTORY, /* ^N */ + /* 15 */ ED_IGNORE, /* ^O */ + /* 16 */ ED_PREV_HISTORY, /* ^P */ + /* 17 */ ED_IGNORE, /* ^Q */ + /* 18 */ ED_REDISPLAY, /* ^R */ + /* 19 */ ED_IGNORE, /* ^S */ + /* 20 */ ED_TRANSPOSE_CHARS, /* ^T */ + /* 21 */ EM_KILL_LINE, /* ^U */ + /* 22 */ ED_QUOTED_INSERT, /* ^V */ + /* 23 */ EM_KILL_REGION, /* ^W */ + /* 24 */ ED_SEQUENCE_LEAD_IN, /* ^X */ + /* 25 */ EM_YANK, /* ^Y */ + /* 26 */ ED_IGNORE, /* ^Z */ + /* 27 */ EM_META_NEXT, /* ^[ */ + /* 28 */ ED_IGNORE, /* ^\ */ + /* 29 */ ED_IGNORE, /* ^] */ + /* 30 */ ED_UNASSIGNED, /* ^^ */ + /* 31 */ ED_UNASSIGNED, /* ^_ */ + /* 32 */ ED_INSERT, /* SPACE */ + /* 33 */ ED_INSERT, /* ! */ + /* 34 */ ED_INSERT, /* " */ + /* 35 */ ED_INSERT, /* # */ + /* 36 */ ED_INSERT, /* $ */ + /* 37 */ ED_INSERT, /* % */ + /* 38 */ ED_INSERT, /* & */ + /* 39 */ ED_INSERT, /* ' */ + /* 40 */ ED_INSERT, /* ( */ + /* 41 */ ED_INSERT, /* ) */ + /* 42 */ ED_INSERT, /* * */ + /* 43 */ ED_INSERT, /* + */ + /* 44 */ ED_INSERT, /* , */ + /* 45 */ ED_INSERT, /* - */ + /* 46 */ ED_INSERT, /* . */ + /* 47 */ ED_INSERT, /* / */ + /* 48 */ ED_DIGIT, /* 0 */ + /* 49 */ ED_DIGIT, /* 1 */ + /* 50 */ ED_DIGIT, /* 2 */ + /* 51 */ ED_DIGIT, /* 3 */ + /* 52 */ ED_DIGIT, /* 4 */ + /* 53 */ ED_DIGIT, /* 5 */ + /* 54 */ ED_DIGIT, /* 6 */ + /* 55 */ ED_DIGIT, /* 7 */ + /* 56 */ ED_DIGIT, /* 8 */ + /* 57 */ ED_DIGIT, /* 9 */ + /* 58 */ ED_INSERT, /* : */ + /* 59 */ ED_INSERT, /* ; */ + /* 60 */ ED_INSERT, /* < */ + /* 61 */ ED_INSERT, /* = */ + /* 62 */ ED_INSERT, /* > */ + /* 63 */ ED_INSERT, /* ? */ + /* 64 */ ED_INSERT, /* @ */ + /* 65 */ ED_INSERT, /* A */ + /* 66 */ ED_INSERT, /* B */ + /* 67 */ ED_INSERT, /* C */ + /* 68 */ ED_INSERT, /* D */ + /* 69 */ ED_INSERT, /* E */ + /* 70 */ ED_INSERT, /* F */ + /* 71 */ ED_INSERT, /* G */ + /* 72 */ ED_INSERT, /* H */ + /* 73 */ ED_INSERT, /* I */ + /* 74 */ ED_INSERT, /* J */ + /* 75 */ ED_INSERT, /* K */ + /* 76 */ ED_INSERT, /* L */ + /* 77 */ ED_INSERT, /* M */ + /* 78 */ ED_INSERT, /* N */ + /* 79 */ ED_INSERT, /* O */ + /* 80 */ ED_INSERT, /* P */ + /* 81 */ ED_INSERT, /* Q */ + /* 82 */ ED_INSERT, /* R */ + /* 83 */ ED_INSERT, /* S */ + /* 84 */ ED_INSERT, /* T */ + /* 85 */ ED_INSERT, /* U */ + /* 86 */ ED_INSERT, /* V */ + /* 87 */ ED_INSERT, /* W */ + /* 88 */ ED_INSERT, /* X */ + /* 89 */ ED_INSERT, /* Y */ + /* 90 */ ED_INSERT, /* Z */ + /* 91 */ ED_INSERT, /* [ */ + /* 92 */ ED_INSERT, /* \ */ + /* 93 */ ED_INSERT, /* ] */ + /* 94 */ ED_INSERT, /* ^ */ + /* 95 */ ED_INSERT, /* _ */ + /* 96 */ ED_INSERT, /* ` */ + /* 97 */ ED_INSERT, /* a */ + /* 98 */ ED_INSERT, /* b */ + /* 99 */ ED_INSERT, /* c */ + /* 100 */ ED_INSERT, /* d */ + /* 101 */ ED_INSERT, /* e */ + /* 102 */ ED_INSERT, /* f */ + /* 103 */ ED_INSERT, /* g */ + /* 104 */ ED_INSERT, /* h */ + /* 105 */ ED_INSERT, /* i */ + /* 106 */ ED_INSERT, /* j */ + /* 107 */ ED_INSERT, /* k */ + /* 108 */ ED_INSERT, /* l */ + /* 109 */ ED_INSERT, /* m */ + /* 110 */ ED_INSERT, /* n */ + /* 111 */ ED_INSERT, /* o */ + /* 112 */ ED_INSERT, /* p */ + /* 113 */ ED_INSERT, /* q */ + /* 114 */ ED_INSERT, /* r */ + /* 115 */ ED_INSERT, /* s */ + /* 116 */ ED_INSERT, /* t */ + /* 117 */ ED_INSERT, /* u */ + /* 118 */ ED_INSERT, /* v */ + /* 119 */ ED_INSERT, /* w */ + /* 120 */ ED_INSERT, /* x */ + /* 121 */ ED_INSERT, /* y */ + /* 122 */ ED_INSERT, /* z */ + /* 123 */ ED_INSERT, /* { */ + /* 124 */ ED_INSERT, /* | */ + /* 125 */ ED_INSERT, /* } */ + /* 126 */ ED_INSERT, /* ~ */ + /* 127 */ EM_DELETE_PREV_CHAR, /* ^? */ + /* 128 */ ED_UNASSIGNED, /* M-^@ */ + /* 129 */ ED_UNASSIGNED, /* M-^A */ + /* 130 */ ED_UNASSIGNED, /* M-^B */ + /* 131 */ ED_UNASSIGNED, /* M-^C */ + /* 132 */ ED_UNASSIGNED, /* M-^D */ + /* 133 */ ED_UNASSIGNED, /* M-^E */ + /* 134 */ ED_UNASSIGNED, /* M-^F */ + /* 135 */ ED_UNASSIGNED, /* M-^G */ + /* 136 */ ED_DELETE_PREV_WORD, /* M-^H */ + /* 137 */ ED_UNASSIGNED, /* M-^I */ + /* 138 */ ED_UNASSIGNED, /* M-^J */ + /* 139 */ ED_UNASSIGNED, /* M-^K */ + /* 140 */ ED_CLEAR_SCREEN, /* M-^L */ + /* 141 */ ED_UNASSIGNED, /* M-^M */ + /* 142 */ ED_UNASSIGNED, /* M-^N */ + /* 143 */ ED_UNASSIGNED, /* M-^O */ + /* 144 */ ED_UNASSIGNED, /* M-^P */ + /* 145 */ ED_UNASSIGNED, /* M-^Q */ + /* 146 */ ED_UNASSIGNED, /* M-^R */ + /* 147 */ ED_UNASSIGNED, /* M-^S */ + /* 148 */ ED_UNASSIGNED, /* M-^T */ + /* 149 */ ED_UNASSIGNED, /* M-^U */ + /* 150 */ ED_UNASSIGNED, /* M-^V */ + /* 151 */ ED_UNASSIGNED, /* M-^W */ + /* 152 */ ED_UNASSIGNED, /* M-^X */ + /* 153 */ ED_UNASSIGNED, /* M-^Y */ + /* 154 */ ED_UNASSIGNED, /* M-^Z */ + /* 155 */ ED_UNASSIGNED, /* M-^[ */ + /* 156 */ ED_UNASSIGNED, /* M-^\ */ + /* 157 */ ED_UNASSIGNED, /* M-^] */ + /* 158 */ ED_UNASSIGNED, /* M-^^ */ + /* 159 */ EM_COPY_PREV_WORD, /* M-^_ */ + /* 160 */ ED_UNASSIGNED, /* M-SPACE */ + /* 161 */ ED_UNASSIGNED, /* M-! */ + /* 162 */ ED_UNASSIGNED, /* M-" */ + /* 163 */ ED_UNASSIGNED, /* M-# */ + /* 164 */ ED_UNASSIGNED, /* M-$ */ + /* 165 */ ED_UNASSIGNED, /* M-% */ + /* 166 */ ED_UNASSIGNED, /* M-& */ + /* 167 */ ED_UNASSIGNED, /* M-' */ + /* 168 */ ED_UNASSIGNED, /* M-( */ + /* 169 */ ED_UNASSIGNED, /* M-) */ + /* 170 */ ED_UNASSIGNED, /* M-* */ + /* 171 */ ED_UNASSIGNED, /* M-+ */ + /* 172 */ ED_UNASSIGNED, /* M-, */ + /* 173 */ ED_UNASSIGNED, /* M-- */ + /* 174 */ ED_UNASSIGNED, /* M-. */ + /* 175 */ ED_UNASSIGNED, /* M-/ */ + /* 176 */ ED_ARGUMENT_DIGIT, /* M-0 */ + /* 177 */ ED_ARGUMENT_DIGIT, /* M-1 */ + /* 178 */ ED_ARGUMENT_DIGIT, /* M-2 */ + /* 179 */ ED_ARGUMENT_DIGIT, /* M-3 */ + /* 180 */ ED_ARGUMENT_DIGIT, /* M-4 */ + /* 181 */ ED_ARGUMENT_DIGIT, /* M-5 */ + /* 182 */ ED_ARGUMENT_DIGIT, /* M-6 */ + /* 183 */ ED_ARGUMENT_DIGIT, /* M-7 */ + /* 184 */ ED_ARGUMENT_DIGIT, /* M-8 */ + /* 185 */ ED_ARGUMENT_DIGIT, /* M-9 */ + /* 186 */ ED_UNASSIGNED, /* M-: */ + /* 187 */ ED_UNASSIGNED, /* M-; */ + /* 188 */ ED_UNASSIGNED, /* M-< */ + /* 189 */ ED_UNASSIGNED, /* M-= */ + /* 190 */ ED_UNASSIGNED, /* M-> */ + /* 191 */ ED_UNASSIGNED, /* M-? */ + /* 192 */ ED_UNASSIGNED, /* M-@ */ + /* 193 */ ED_UNASSIGNED, /* M-A */ + /* 194 */ ED_PREV_WORD, /* M-B */ + /* 195 */ EM_CAPITOL_CASE, /* M-C */ + /* 196 */ EM_DELETE_NEXT_WORD, /* M-D */ + /* 197 */ ED_UNASSIGNED, /* M-E */ + /* 198 */ EM_NEXT_WORD, /* M-F */ + /* 199 */ ED_UNASSIGNED, /* M-G */ + /* 200 */ ED_UNASSIGNED, /* M-H */ + /* 201 */ ED_UNASSIGNED, /* M-I */ + /* 202 */ ED_UNASSIGNED, /* M-J */ + /* 203 */ ED_UNASSIGNED, /* M-K */ + /* 204 */ EM_LOWER_CASE, /* M-L */ + /* 205 */ ED_UNASSIGNED, /* M-M */ + /* 206 */ ED_SEARCH_NEXT_HISTORY, /* M-N */ + /* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */ + /* 208 */ ED_SEARCH_PREV_HISTORY, /* M-P */ + /* 209 */ ED_UNASSIGNED, /* M-Q */ + /* 210 */ ED_UNASSIGNED, /* M-R */ + /* 211 */ ED_UNASSIGNED, /* M-S */ + /* 212 */ ED_UNASSIGNED, /* M-T */ + /* 213 */ EM_UPPER_CASE, /* M-U */ + /* 214 */ ED_UNASSIGNED, /* M-V */ + /* 215 */ EM_COPY_REGION, /* M-W */ + /* 216 */ ED_COMMAND, /* M-X */ + /* 217 */ ED_UNASSIGNED, /* M-Y */ + /* 218 */ ED_UNASSIGNED, /* M-Z */ + /* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */ + /* 220 */ ED_UNASSIGNED, /* M-\ */ + /* 221 */ ED_UNASSIGNED, /* M-] */ + /* 222 */ ED_UNASSIGNED, /* M-^ */ + /* 223 */ ED_UNASSIGNED, /* M-_ */ + /* 223 */ ED_UNASSIGNED, /* M-` */ + /* 224 */ ED_UNASSIGNED, /* M-a */ + /* 225 */ ED_PREV_WORD, /* M-b */ + /* 226 */ EM_CAPITOL_CASE, /* M-c */ + /* 227 */ EM_DELETE_NEXT_WORD, /* M-d */ + /* 228 */ ED_UNASSIGNED, /* M-e */ + /* 229 */ EM_NEXT_WORD, /* M-f */ + /* 230 */ ED_UNASSIGNED, /* M-g */ + /* 231 */ ED_UNASSIGNED, /* M-h */ + /* 232 */ ED_UNASSIGNED, /* M-i */ + /* 233 */ ED_UNASSIGNED, /* M-j */ + /* 234 */ ED_UNASSIGNED, /* M-k */ + /* 235 */ EM_LOWER_CASE, /* M-l */ + /* 236 */ ED_UNASSIGNED, /* M-m */ + /* 237 */ ED_SEARCH_NEXT_HISTORY, /* M-n */ + /* 238 */ ED_UNASSIGNED, /* M-o */ + /* 239 */ ED_SEARCH_PREV_HISTORY, /* M-p */ + /* 240 */ ED_UNASSIGNED, /* M-q */ + /* 241 */ ED_UNASSIGNED, /* M-r */ + /* 242 */ ED_UNASSIGNED, /* M-s */ + /* 243 */ ED_UNASSIGNED, /* M-t */ + /* 244 */ EM_UPPER_CASE, /* M-u */ + /* 245 */ ED_UNASSIGNED, /* M-v */ + /* 246 */ EM_COPY_REGION, /* M-w */ + /* 247 */ ED_COMMAND, /* M-x */ + /* 248 */ ED_UNASSIGNED, /* M-y */ + /* 249 */ ED_UNASSIGNED, /* M-z */ + /* 250 */ ED_UNASSIGNED, /* M-{ */ + /* 251 */ ED_UNASSIGNED, /* M-| */ + /* 252 */ ED_UNASSIGNED, /* M-} */ + /* 253 */ ED_UNASSIGNED, /* M-~ */ + /* 254 */ ED_DELETE_PREV_WORD /* M-^? */ + /* 255 */ +}; + + +/* + * keymap table for vi. Each index into above tbl; should be + * N_KEYS entries long. Vi mode uses a sticky-extend to do command mode: + * insert mode characters are in the normal keymap, and command mode + * in the extended keymap. + */ +static const el_action_t el_map_vi_insert[] = { +#ifdef KSHVI + /* 0 */ ED_UNASSIGNED, /* ^@ */ + /* 1 */ ED_INSERT, /* ^A */ + /* 2 */ ED_INSERT, /* ^B */ + /* 3 */ ED_INSERT, /* ^C */ + /* 4 */ VI_LIST_OR_EOF, /* ^D */ + /* 5 */ ED_INSERT, /* ^E */ + /* 6 */ ED_INSERT, /* ^F */ + /* 7 */ ED_INSERT, /* ^G */ + /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */ + /* 9 */ ED_INSERT, /* ^I */ /* Tab Key */ + /* 10 */ ED_NEWLINE, /* ^J */ + /* 11 */ ED_INSERT, /* ^K */ + /* 12 */ ED_INSERT, /* ^L */ + /* 13 */ ED_NEWLINE, /* ^M */ + /* 14 */ ED_INSERT, /* ^N */ + /* 15 */ ED_INSERT, /* ^O */ + /* 16 */ ED_INSERT, /* ^P */ + /* 17 */ ED_IGNORE, /* ^Q */ + /* 18 */ ED_INSERT, /* ^R */ + /* 19 */ ED_IGNORE, /* ^S */ + /* 20 */ ED_INSERT, /* ^T */ + /* 21 */ VI_KILL_LINE_PREV, /* ^U */ + /* 22 */ ED_QUOTED_INSERT, /* ^V */ + /* 23 */ ED_DELETE_PREV_WORD, /* ^W */ + /* ED_DELETE_PREV_WORD: Only until strt edit pos */ + /* 24 */ ED_INSERT, /* ^X */ + /* 25 */ ED_INSERT, /* ^Y */ + /* 26 */ ED_INSERT, /* ^Z */ + /* 27 */ VI_COMMAND_MODE, /* ^[ */ /* [ Esc ] key */ + /* 28 */ ED_IGNORE, /* ^\ */ + /* 29 */ ED_INSERT, /* ^] */ + /* 30 */ ED_INSERT, /* ^^ */ + /* 31 */ ED_INSERT, /* ^_ */ +#else /* !KSHVI */ + /* + * NOTE: These mappings do NOT Correspond well + * to the KSH VI editing assignments. + * On the other and they are convenient and + * many people have have gotten used to them. + */ + /* 0 */ ED_UNASSIGNED, /* ^@ */ + /* 1 */ ED_MOVE_TO_BEG, /* ^A */ + /* 2 */ ED_PREV_CHAR, /* ^B */ + /* 3 */ ED_IGNORE, /* ^C */ + /* 4 */ VI_LIST_OR_EOF, /* ^D */ + /* 5 */ ED_MOVE_TO_END, /* ^E */ + /* 6 */ ED_NEXT_CHAR, /* ^F */ + /* 7 */ ED_UNASSIGNED, /* ^G */ + /* 8 */ VI_DELETE_PREV_CHAR, /* ^H */ /* BackSpace key */ + /* 9 */ ED_UNASSIGNED, /* ^I */ /* Tab Key */ + /* 10 */ ED_NEWLINE, /* ^J */ + /* 11 */ ED_KILL_LINE, /* ^K */ + /* 12 */ ED_CLEAR_SCREEN, /* ^L */ + /* 13 */ ED_NEWLINE, /* ^M */ + /* 14 */ ED_NEXT_HISTORY, /* ^N */ + /* 15 */ ED_IGNORE, /* ^O */ + /* 16 */ ED_PREV_HISTORY, /* ^P */ + /* 17 */ ED_IGNORE, /* ^Q */ + /* 18 */ ED_REDISPLAY, /* ^R */ + /* 19 */ ED_IGNORE, /* ^S */ + /* 20 */ ED_TRANSPOSE_CHARS, /* ^T */ + /* 21 */ VI_KILL_LINE_PREV, /* ^U */ + /* 22 */ ED_QUOTED_INSERT, /* ^V */ + /* 23 */ ED_DELETE_PREV_WORD, /* ^W */ + /* 24 */ ED_UNASSIGNED, /* ^X */ + /* 25 */ ED_IGNORE, /* ^Y */ + /* 26 */ ED_IGNORE, /* ^Z */ + /* 27 */ VI_COMMAND_MODE, /* ^[ */ + /* 28 */ ED_IGNORE, /* ^\ */ + /* 29 */ ED_UNASSIGNED, /* ^] */ + /* 30 */ ED_UNASSIGNED, /* ^^ */ + /* 31 */ ED_UNASSIGNED, /* ^_ */ +#endif /* KSHVI */ + /* 32 */ ED_INSERT, /* SPACE */ + /* 33 */ ED_INSERT, /* ! */ + /* 34 */ ED_INSERT, /* " */ + /* 35 */ ED_INSERT, /* # */ + /* 36 */ ED_INSERT, /* $ */ + /* 37 */ ED_INSERT, /* % */ + /* 38 */ ED_INSERT, /* & */ + /* 39 */ ED_INSERT, /* ' */ + /* 40 */ ED_INSERT, /* ( */ + /* 41 */ ED_INSERT, /* ) */ + /* 42 */ ED_INSERT, /* * */ + /* 43 */ ED_INSERT, /* + */ + /* 44 */ ED_INSERT, /* , */ + /* 45 */ ED_INSERT, /* - */ + /* 46 */ ED_INSERT, /* . */ + /* 47 */ ED_INSERT, /* / */ + /* 48 */ ED_INSERT, /* 0 */ + /* 49 */ ED_INSERT, /* 1 */ + /* 50 */ ED_INSERT, /* 2 */ + /* 51 */ ED_INSERT, /* 3 */ + /* 52 */ ED_INSERT, /* 4 */ + /* 53 */ ED_INSERT, /* 5 */ + /* 54 */ ED_INSERT, /* 6 */ + /* 55 */ ED_INSERT, /* 7 */ + /* 56 */ ED_INSERT, /* 8 */ + /* 57 */ ED_INSERT, /* 9 */ + /* 58 */ ED_INSERT, /* : */ + /* 59 */ ED_INSERT, /* ; */ + /* 60 */ ED_INSERT, /* < */ + /* 61 */ ED_INSERT, /* = */ + /* 62 */ ED_INSERT, /* > */ + /* 63 */ ED_INSERT, /* ? */ + /* 64 */ ED_INSERT, /* @ */ + /* 65 */ ED_INSERT, /* A */ + /* 66 */ ED_INSERT, /* B */ + /* 67 */ ED_INSERT, /* C */ + /* 68 */ ED_INSERT, /* D */ + /* 69 */ ED_INSERT, /* E */ + /* 70 */ ED_INSERT, /* F */ + /* 71 */ ED_INSERT, /* G */ + /* 72 */ ED_INSERT, /* H */ + /* 73 */ ED_INSERT, /* I */ + /* 74 */ ED_INSERT, /* J */ + /* 75 */ ED_INSERT, /* K */ + /* 76 */ ED_INSERT, /* L */ + /* 77 */ ED_INSERT, /* M */ + /* 78 */ ED_INSERT, /* N */ + /* 79 */ ED_INSERT, /* O */ + /* 80 */ ED_INSERT, /* P */ + /* 81 */ ED_INSERT, /* Q */ + /* 82 */ ED_INSERT, /* R */ + /* 83 */ ED_INSERT, /* S */ + /* 84 */ ED_INSERT, /* T */ + /* 85 */ ED_INSERT, /* U */ + /* 86 */ ED_INSERT, /* V */ + /* 87 */ ED_INSERT, /* W */ + /* 88 */ ED_INSERT, /* X */ + /* 89 */ ED_INSERT, /* Y */ + /* 90 */ ED_INSERT, /* Z */ + /* 91 */ ED_INSERT, /* [ */ + /* 92 */ ED_INSERT, /* \ */ + /* 93 */ ED_INSERT, /* ] */ + /* 94 */ ED_INSERT, /* ^ */ + /* 95 */ ED_INSERT, /* _ */ + /* 96 */ ED_INSERT, /* ` */ + /* 97 */ ED_INSERT, /* a */ + /* 98 */ ED_INSERT, /* b */ + /* 99 */ ED_INSERT, /* c */ + /* 100 */ ED_INSERT, /* d */ + /* 101 */ ED_INSERT, /* e */ + /* 102 */ ED_INSERT, /* f */ + /* 103 */ ED_INSERT, /* g */ + /* 104 */ ED_INSERT, /* h */ + /* 105 */ ED_INSERT, /* i */ + /* 106 */ ED_INSERT, /* j */ + /* 107 */ ED_INSERT, /* k */ + /* 108 */ ED_INSERT, /* l */ + /* 109 */ ED_INSERT, /* m */ + /* 110 */ ED_INSERT, /* n */ + /* 111 */ ED_INSERT, /* o */ + /* 112 */ ED_INSERT, /* p */ + /* 113 */ ED_INSERT, /* q */ + /* 114 */ ED_INSERT, /* r */ + /* 115 */ ED_INSERT, /* s */ + /* 116 */ ED_INSERT, /* t */ + /* 117 */ ED_INSERT, /* u */ + /* 118 */ ED_INSERT, /* v */ + /* 119 */ ED_INSERT, /* w */ + /* 120 */ ED_INSERT, /* x */ + /* 121 */ ED_INSERT, /* y */ + /* 122 */ ED_INSERT, /* z */ + /* 123 */ ED_INSERT, /* { */ + /* 124 */ ED_INSERT, /* | */ + /* 125 */ ED_INSERT, /* } */ + /* 126 */ ED_INSERT, /* ~ */ + /* 127 */ VI_DELETE_PREV_CHAR, /* ^? */ + /* 128 */ ED_INSERT, /* M-^@ */ + /* 129 */ ED_INSERT, /* M-^A */ + /* 130 */ ED_INSERT, /* M-^B */ + /* 131 */ ED_INSERT, /* M-^C */ + /* 132 */ ED_INSERT, /* M-^D */ + /* 133 */ ED_INSERT, /* M-^E */ + /* 134 */ ED_INSERT, /* M-^F */ + /* 135 */ ED_INSERT, /* M-^G */ + /* 136 */ ED_INSERT, /* M-^H */ + /* 137 */ ED_INSERT, /* M-^I */ + /* 138 */ ED_INSERT, /* M-^J */ + /* 139 */ ED_INSERT, /* M-^K */ + /* 140 */ ED_INSERT, /* M-^L */ + /* 141 */ ED_INSERT, /* M-^M */ + /* 142 */ ED_INSERT, /* M-^N */ + /* 143 */ ED_INSERT, /* M-^O */ + /* 144 */ ED_INSERT, /* M-^P */ + /* 145 */ ED_INSERT, /* M-^Q */ + /* 146 */ ED_INSERT, /* M-^R */ + /* 147 */ ED_INSERT, /* M-^S */ + /* 148 */ ED_INSERT, /* M-^T */ + /* 149 */ ED_INSERT, /* M-^U */ + /* 150 */ ED_INSERT, /* M-^V */ + /* 151 */ ED_INSERT, /* M-^W */ + /* 152 */ ED_INSERT, /* M-^X */ + /* 153 */ ED_INSERT, /* M-^Y */ + /* 154 */ ED_INSERT, /* M-^Z */ + /* 155 */ ED_INSERT, /* M-^[ */ + /* 156 */ ED_INSERT, /* M-^\ */ + /* 157 */ ED_INSERT, /* M-^] */ + /* 158 */ ED_INSERT, /* M-^^ */ + /* 159 */ ED_INSERT, /* M-^_ */ + /* 160 */ ED_INSERT, /* M-SPACE */ + /* 161 */ ED_INSERT, /* M-! */ + /* 162 */ ED_INSERT, /* M-" */ + /* 163 */ ED_INSERT, /* M-# */ + /* 164 */ ED_INSERT, /* M-$ */ + /* 165 */ ED_INSERT, /* M-% */ + /* 166 */ ED_INSERT, /* M-& */ + /* 167 */ ED_INSERT, /* M-' */ + /* 168 */ ED_INSERT, /* M-( */ + /* 169 */ ED_INSERT, /* M-) */ + /* 170 */ ED_INSERT, /* M-* */ + /* 171 */ ED_INSERT, /* M-+ */ + /* 172 */ ED_INSERT, /* M-, */ + /* 173 */ ED_INSERT, /* M-- */ + /* 174 */ ED_INSERT, /* M-. */ + /* 175 */ ED_INSERT, /* M-/ */ + /* 176 */ ED_INSERT, /* M-0 */ + /* 177 */ ED_INSERT, /* M-1 */ + /* 178 */ ED_INSERT, /* M-2 */ + /* 179 */ ED_INSERT, /* M-3 */ + /* 180 */ ED_INSERT, /* M-4 */ + /* 181 */ ED_INSERT, /* M-5 */ + /* 182 */ ED_INSERT, /* M-6 */ + /* 183 */ ED_INSERT, /* M-7 */ + /* 184 */ ED_INSERT, /* M-8 */ + /* 185 */ ED_INSERT, /* M-9 */ + /* 186 */ ED_INSERT, /* M-: */ + /* 187 */ ED_INSERT, /* M-; */ + /* 188 */ ED_INSERT, /* M-< */ + /* 189 */ ED_INSERT, /* M-= */ + /* 190 */ ED_INSERT, /* M-> */ + /* 191 */ ED_INSERT, /* M-? */ + /* 192 */ ED_INSERT, /* M-@ */ + /* 193 */ ED_INSERT, /* M-A */ + /* 194 */ ED_INSERT, /* M-B */ + /* 195 */ ED_INSERT, /* M-C */ + /* 196 */ ED_INSERT, /* M-D */ + /* 197 */ ED_INSERT, /* M-E */ + /* 198 */ ED_INSERT, /* M-F */ + /* 199 */ ED_INSERT, /* M-G */ + /* 200 */ ED_INSERT, /* M-H */ + /* 201 */ ED_INSERT, /* M-I */ + /* 202 */ ED_INSERT, /* M-J */ + /* 203 */ ED_INSERT, /* M-K */ + /* 204 */ ED_INSERT, /* M-L */ + /* 205 */ ED_INSERT, /* M-M */ + /* 206 */ ED_INSERT, /* M-N */ + /* 207 */ ED_INSERT, /* M-O */ + /* 208 */ ED_INSERT, /* M-P */ + /* 209 */ ED_INSERT, /* M-Q */ + /* 210 */ ED_INSERT, /* M-R */ + /* 211 */ ED_INSERT, /* M-S */ + /* 212 */ ED_INSERT, /* M-T */ + /* 213 */ ED_INSERT, /* M-U */ + /* 214 */ ED_INSERT, /* M-V */ + /* 215 */ ED_INSERT, /* M-W */ + /* 216 */ ED_INSERT, /* M-X */ + /* 217 */ ED_INSERT, /* M-Y */ + /* 218 */ ED_INSERT, /* M-Z */ + /* 219 */ ED_INSERT, /* M-[ */ + /* 220 */ ED_INSERT, /* M-\ */ + /* 221 */ ED_INSERT, /* M-] */ + /* 222 */ ED_INSERT, /* M-^ */ + /* 223 */ ED_INSERT, /* M-_ */ + /* 224 */ ED_INSERT, /* M-` */ + /* 225 */ ED_INSERT, /* M-a */ + /* 226 */ ED_INSERT, /* M-b */ + /* 227 */ ED_INSERT, /* M-c */ + /* 228 */ ED_INSERT, /* M-d */ + /* 229 */ ED_INSERT, /* M-e */ + /* 230 */ ED_INSERT, /* M-f */ + /* 231 */ ED_INSERT, /* M-g */ + /* 232 */ ED_INSERT, /* M-h */ + /* 233 */ ED_INSERT, /* M-i */ + /* 234 */ ED_INSERT, /* M-j */ + /* 235 */ ED_INSERT, /* M-k */ + /* 236 */ ED_INSERT, /* M-l */ + /* 237 */ ED_INSERT, /* M-m */ + /* 238 */ ED_INSERT, /* M-n */ + /* 239 */ ED_INSERT, /* M-o */ + /* 240 */ ED_INSERT, /* M-p */ + /* 241 */ ED_INSERT, /* M-q */ + /* 242 */ ED_INSERT, /* M-r */ + /* 243 */ ED_INSERT, /* M-s */ + /* 244 */ ED_INSERT, /* M-t */ + /* 245 */ ED_INSERT, /* M-u */ + /* 246 */ ED_INSERT, /* M-v */ + /* 247 */ ED_INSERT, /* M-w */ + /* 248 */ ED_INSERT, /* M-x */ + /* 249 */ ED_INSERT, /* M-y */ + /* 250 */ ED_INSERT, /* M-z */ + /* 251 */ ED_INSERT, /* M-{ */ + /* 252 */ ED_INSERT, /* M-| */ + /* 253 */ ED_INSERT, /* M-} */ + /* 254 */ ED_INSERT, /* M-~ */ + /* 255 */ ED_INSERT /* M-^? */ +}; + +static const el_action_t el_map_vi_command[] = { + /* 0 */ ED_UNASSIGNED, /* ^@ */ + /* 1 */ ED_MOVE_TO_BEG, /* ^A */ + /* 2 */ ED_UNASSIGNED, /* ^B */ + /* 3 */ ED_IGNORE, /* ^C */ + /* 4 */ ED_UNASSIGNED, /* ^D */ + /* 5 */ ED_MOVE_TO_END, /* ^E */ + /* 6 */ ED_UNASSIGNED, /* ^F */ + /* 7 */ ED_UNASSIGNED, /* ^G */ + /* 8 */ ED_DELETE_PREV_CHAR, /* ^H */ + /* 9 */ ED_UNASSIGNED, /* ^I */ + /* 10 */ ED_NEWLINE, /* ^J */ + /* 11 */ ED_KILL_LINE, /* ^K */ + /* 12 */ ED_CLEAR_SCREEN, /* ^L */ + /* 13 */ ED_NEWLINE, /* ^M */ + /* 14 */ ED_NEXT_HISTORY, /* ^N */ + /* 15 */ ED_IGNORE, /* ^O */ + /* 16 */ ED_PREV_HISTORY, /* ^P */ + /* 17 */ ED_IGNORE, /* ^Q */ + /* 18 */ ED_REDISPLAY, /* ^R */ + /* 19 */ ED_IGNORE, /* ^S */ + /* 20 */ ED_UNASSIGNED, /* ^T */ + /* 21 */ VI_KILL_LINE_PREV, /* ^U */ + /* 22 */ ED_UNASSIGNED, /* ^V */ + /* 23 */ ED_DELETE_PREV_WORD, /* ^W */ + /* 24 */ ED_UNASSIGNED, /* ^X */ + /* 25 */ ED_UNASSIGNED, /* ^Y */ + /* 26 */ ED_UNASSIGNED, /* ^Z */ + /* 27 */ EM_META_NEXT, /* ^[ */ + /* 28 */ ED_IGNORE, /* ^\ */ + /* 29 */ ED_UNASSIGNED, /* ^] */ + /* 30 */ ED_UNASSIGNED, /* ^^ */ + /* 31 */ ED_UNASSIGNED, /* ^_ */ + /* 32 */ ED_NEXT_CHAR, /* SPACE */ + /* 33 */ ED_UNASSIGNED, /* ! */ + /* 34 */ ED_UNASSIGNED, /* " */ + /* 35 */ VI_COMMENT_OUT, /* # */ + /* 36 */ ED_MOVE_TO_END, /* $ */ + /* 37 */ VI_MATCH, /* % */ + /* 38 */ ED_UNASSIGNED, /* & */ + /* 39 */ ED_UNASSIGNED, /* ' */ + /* 40 */ ED_UNASSIGNED, /* ( */ + /* 41 */ ED_UNASSIGNED, /* ) */ + /* 42 */ ED_UNASSIGNED, /* * */ + /* 43 */ ED_NEXT_HISTORY, /* + */ + /* 44 */ VI_REPEAT_PREV_CHAR, /* , */ + /* 45 */ ED_PREV_HISTORY, /* - */ + /* 46 */ VI_REDO, /* . */ + /* 47 */ VI_SEARCH_PREV, /* / */ + /* 48 */ VI_ZERO, /* 0 */ + /* 49 */ ED_ARGUMENT_DIGIT, /* 1 */ + /* 50 */ ED_ARGUMENT_DIGIT, /* 2 */ + /* 51 */ ED_ARGUMENT_DIGIT, /* 3 */ + /* 52 */ ED_ARGUMENT_DIGIT, /* 4 */ + /* 53 */ ED_ARGUMENT_DIGIT, /* 5 */ + /* 54 */ ED_ARGUMENT_DIGIT, /* 6 */ + /* 55 */ ED_ARGUMENT_DIGIT, /* 7 */ + /* 56 */ ED_ARGUMENT_DIGIT, /* 8 */ + /* 57 */ ED_ARGUMENT_DIGIT, /* 9 */ + /* 58 */ ED_COMMAND, /* : */ + /* 59 */ VI_REPEAT_NEXT_CHAR, /* ; */ + /* 60 */ ED_UNASSIGNED, /* < */ + /* 61 */ ED_UNASSIGNED, /* = */ + /* 62 */ ED_UNASSIGNED, /* > */ + /* 63 */ VI_SEARCH_NEXT, /* ? */ + /* 64 */ VI_ALIAS, /* @ */ + /* 65 */ VI_ADD_AT_EOL, /* A */ + /* 66 */ VI_PREV_BIG_WORD, /* B */ + /* 67 */ VI_CHANGE_TO_EOL, /* C */ + /* 68 */ ED_KILL_LINE, /* D */ + /* 69 */ VI_END_BIG_WORD, /* E */ + /* 70 */ VI_PREV_CHAR, /* F */ + /* 71 */ VI_TO_HISTORY_LINE, /* G */ + /* 72 */ ED_UNASSIGNED, /* H */ + /* 73 */ VI_INSERT_AT_BOL, /* I */ + /* 74 */ ED_SEARCH_NEXT_HISTORY, /* J */ + /* 75 */ ED_SEARCH_PREV_HISTORY, /* K */ + /* 76 */ ED_UNASSIGNED, /* L */ + /* 77 */ ED_UNASSIGNED, /* M */ + /* 78 */ VI_REPEAT_SEARCH_PREV, /* N */ + /* 79 */ ED_SEQUENCE_LEAD_IN, /* O */ + /* 80 */ VI_PASTE_PREV, /* P */ + /* 81 */ ED_UNASSIGNED, /* Q */ + /* 82 */ VI_REPLACE_MODE, /* R */ + /* 83 */ VI_SUBSTITUTE_LINE, /* S */ + /* 84 */ VI_TO_PREV_CHAR, /* T */ + /* 85 */ VI_UNDO_LINE, /* U */ + /* 86 */ ED_UNASSIGNED, /* V */ + /* 87 */ VI_NEXT_BIG_WORD, /* W */ + /* 88 */ ED_DELETE_PREV_CHAR, /* X */ + /* 89 */ VI_YANK_END, /* Y */ + /* 90 */ ED_UNASSIGNED, /* Z */ + /* 91 */ ED_SEQUENCE_LEAD_IN, /* [ */ + /* 92 */ ED_UNASSIGNED, /* \ */ + /* 93 */ ED_UNASSIGNED, /* ] */ + /* 94 */ ED_MOVE_TO_BEG, /* ^ */ + /* 95 */ VI_HISTORY_WORD, /* _ */ + /* 96 */ ED_UNASSIGNED, /* ` */ + /* 97 */ VI_ADD, /* a */ + /* 98 */ VI_PREV_WORD, /* b */ + /* 99 */ VI_CHANGE_META, /* c */ + /* 100 */ VI_DELETE_META, /* d */ + /* 101 */ VI_END_WORD, /* e */ + /* 102 */ VI_NEXT_CHAR, /* f */ + /* 103 */ ED_UNASSIGNED, /* g */ + /* 104 */ ED_PREV_CHAR, /* h */ + /* 105 */ VI_INSERT, /* i */ + /* 106 */ ED_NEXT_HISTORY, /* j */ + /* 107 */ ED_PREV_HISTORY, /* k */ + /* 108 */ ED_NEXT_CHAR, /* l */ + /* 109 */ ED_UNASSIGNED, /* m */ + /* 110 */ VI_REPEAT_SEARCH_NEXT, /* n */ + /* 111 */ ED_UNASSIGNED, /* o */ + /* 112 */ VI_PASTE_NEXT, /* p */ + /* 113 */ ED_UNASSIGNED, /* q */ + /* 114 */ VI_REPLACE_CHAR, /* r */ + /* 115 */ VI_SUBSTITUTE_CHAR, /* s */ + /* 116 */ VI_TO_NEXT_CHAR, /* t */ + /* 117 */ VI_UNDO, /* u */ + /* 118 */ VI_HISTEDIT, /* v */ + /* 119 */ VI_NEXT_WORD, /* w */ + /* 120 */ ED_DELETE_NEXT_CHAR, /* x */ + /* 121 */ VI_YANK, /* y */ + /* 122 */ ED_UNASSIGNED, /* z */ + /* 123 */ ED_UNASSIGNED, /* { */ + /* 124 */ VI_TO_COLUMN, /* | */ + /* 125 */ ED_UNASSIGNED, /* } */ + /* 126 */ VI_CHANGE_CASE, /* ~ */ + /* 127 */ ED_DELETE_PREV_CHAR, /* ^? */ + /* 128 */ ED_UNASSIGNED, /* M-^@ */ + /* 129 */ ED_UNASSIGNED, /* M-^A */ + /* 130 */ ED_UNASSIGNED, /* M-^B */ + /* 131 */ ED_UNASSIGNED, /* M-^C */ + /* 132 */ ED_UNASSIGNED, /* M-^D */ + /* 133 */ ED_UNASSIGNED, /* M-^E */ + /* 134 */ ED_UNASSIGNED, /* M-^F */ + /* 135 */ ED_UNASSIGNED, /* M-^G */ + /* 136 */ ED_UNASSIGNED, /* M-^H */ + /* 137 */ ED_UNASSIGNED, /* M-^I */ + /* 138 */ ED_UNASSIGNED, /* M-^J */ + /* 139 */ ED_UNASSIGNED, /* M-^K */ + /* 140 */ ED_UNASSIGNED, /* M-^L */ + /* 141 */ ED_UNASSIGNED, /* M-^M */ + /* 142 */ ED_UNASSIGNED, /* M-^N */ + /* 143 */ ED_UNASSIGNED, /* M-^O */ + /* 144 */ ED_UNASSIGNED, /* M-^P */ + /* 145 */ ED_UNASSIGNED, /* M-^Q */ + /* 146 */ ED_UNASSIGNED, /* M-^R */ + /* 147 */ ED_UNASSIGNED, /* M-^S */ + /* 148 */ ED_UNASSIGNED, /* M-^T */ + /* 149 */ ED_UNASSIGNED, /* M-^U */ + /* 150 */ ED_UNASSIGNED, /* M-^V */ + /* 151 */ ED_UNASSIGNED, /* M-^W */ + /* 152 */ ED_UNASSIGNED, /* M-^X */ + /* 153 */ ED_UNASSIGNED, /* M-^Y */ + /* 154 */ ED_UNASSIGNED, /* M-^Z */ + /* 155 */ ED_UNASSIGNED, /* M-^[ */ + /* 156 */ ED_UNASSIGNED, /* M-^\ */ + /* 157 */ ED_UNASSIGNED, /* M-^] */ + /* 158 */ ED_UNASSIGNED, /* M-^^ */ + /* 159 */ ED_UNASSIGNED, /* M-^_ */ + /* 160 */ ED_UNASSIGNED, /* M-SPACE */ + /* 161 */ ED_UNASSIGNED, /* M-! */ + /* 162 */ ED_UNASSIGNED, /* M-" */ + /* 163 */ ED_UNASSIGNED, /* M-# */ + /* 164 */ ED_UNASSIGNED, /* M-$ */ + /* 165 */ ED_UNASSIGNED, /* M-% */ + /* 166 */ ED_UNASSIGNED, /* M-& */ + /* 167 */ ED_UNASSIGNED, /* M-' */ + /* 168 */ ED_UNASSIGNED, /* M-( */ + /* 169 */ ED_UNASSIGNED, /* M-) */ + /* 170 */ ED_UNASSIGNED, /* M-* */ + /* 171 */ ED_UNASSIGNED, /* M-+ */ + /* 172 */ ED_UNASSIGNED, /* M-, */ + /* 173 */ ED_UNASSIGNED, /* M-- */ + /* 174 */ ED_UNASSIGNED, /* M-. */ + /* 175 */ ED_UNASSIGNED, /* M-/ */ + /* 176 */ ED_UNASSIGNED, /* M-0 */ + /* 177 */ ED_UNASSIGNED, /* M-1 */ + /* 178 */ ED_UNASSIGNED, /* M-2 */ + /* 179 */ ED_UNASSIGNED, /* M-3 */ + /* 180 */ ED_UNASSIGNED, /* M-4 */ + /* 181 */ ED_UNASSIGNED, /* M-5 */ + /* 182 */ ED_UNASSIGNED, /* M-6 */ + /* 183 */ ED_UNASSIGNED, /* M-7 */ + /* 184 */ ED_UNASSIGNED, /* M-8 */ + /* 185 */ ED_UNASSIGNED, /* M-9 */ + /* 186 */ ED_UNASSIGNED, /* M-: */ + /* 187 */ ED_UNASSIGNED, /* M-; */ + /* 188 */ ED_UNASSIGNED, /* M-< */ + /* 189 */ ED_UNASSIGNED, /* M-= */ + /* 190 */ ED_UNASSIGNED, /* M-> */ + /* 191 */ ED_UNASSIGNED, /* M-? */ + /* 192 */ ED_UNASSIGNED, /* M-@ */ + /* 193 */ ED_UNASSIGNED, /* M-A */ + /* 194 */ ED_UNASSIGNED, /* M-B */ + /* 195 */ ED_UNASSIGNED, /* M-C */ + /* 196 */ ED_UNASSIGNED, /* M-D */ + /* 197 */ ED_UNASSIGNED, /* M-E */ + /* 198 */ ED_UNASSIGNED, /* M-F */ + /* 199 */ ED_UNASSIGNED, /* M-G */ + /* 200 */ ED_UNASSIGNED, /* M-H */ + /* 201 */ ED_UNASSIGNED, /* M-I */ + /* 202 */ ED_UNASSIGNED, /* M-J */ + /* 203 */ ED_UNASSIGNED, /* M-K */ + /* 204 */ ED_UNASSIGNED, /* M-L */ + /* 205 */ ED_UNASSIGNED, /* M-M */ + /* 206 */ ED_UNASSIGNED, /* M-N */ + /* 207 */ ED_SEQUENCE_LEAD_IN, /* M-O */ + /* 208 */ ED_UNASSIGNED, /* M-P */ + /* 209 */ ED_UNASSIGNED, /* M-Q */ + /* 210 */ ED_UNASSIGNED, /* M-R */ + /* 211 */ ED_UNASSIGNED, /* M-S */ + /* 212 */ ED_UNASSIGNED, /* M-T */ + /* 213 */ ED_UNASSIGNED, /* M-U */ + /* 214 */ ED_UNASSIGNED, /* M-V */ + /* 215 */ ED_UNASSIGNED, /* M-W */ + /* 216 */ ED_UNASSIGNED, /* M-X */ + /* 217 */ ED_UNASSIGNED, /* M-Y */ + /* 218 */ ED_UNASSIGNED, /* M-Z */ + /* 219 */ ED_SEQUENCE_LEAD_IN, /* M-[ */ + /* 220 */ ED_UNASSIGNED, /* M-\ */ + /* 221 */ ED_UNASSIGNED, /* M-] */ + /* 222 */ ED_UNASSIGNED, /* M-^ */ + /* 223 */ ED_UNASSIGNED, /* M-_ */ + /* 224 */ ED_UNASSIGNED, /* M-` */ + /* 225 */ ED_UNASSIGNED, /* M-a */ + /* 226 */ ED_UNASSIGNED, /* M-b */ + /* 227 */ ED_UNASSIGNED, /* M-c */ + /* 228 */ ED_UNASSIGNED, /* M-d */ + /* 229 */ ED_UNASSIGNED, /* M-e */ + /* 230 */ ED_UNASSIGNED, /* M-f */ + /* 231 */ ED_UNASSIGNED, /* M-g */ + /* 232 */ ED_UNASSIGNED, /* M-h */ + /* 233 */ ED_UNASSIGNED, /* M-i */ + /* 234 */ ED_UNASSIGNED, /* M-j */ + /* 235 */ ED_UNASSIGNED, /* M-k */ + /* 236 */ ED_UNASSIGNED, /* M-l */ + /* 237 */ ED_UNASSIGNED, /* M-m */ + /* 238 */ ED_UNASSIGNED, /* M-n */ + /* 239 */ ED_UNASSIGNED, /* M-o */ + /* 240 */ ED_UNASSIGNED, /* M-p */ + /* 241 */ ED_UNASSIGNED, /* M-q */ + /* 242 */ ED_UNASSIGNED, /* M-r */ + /* 243 */ ED_UNASSIGNED, /* M-s */ + /* 244 */ ED_UNASSIGNED, /* M-t */ + /* 245 */ ED_UNASSIGNED, /* M-u */ + /* 246 */ ED_UNASSIGNED, /* M-v */ + /* 247 */ ED_UNASSIGNED, /* M-w */ + /* 248 */ ED_UNASSIGNED, /* M-x */ + /* 249 */ ED_UNASSIGNED, /* M-y */ + /* 250 */ ED_UNASSIGNED, /* M-z */ + /* 251 */ ED_UNASSIGNED, /* M-{ */ + /* 252 */ ED_UNASSIGNED, /* M-| */ + /* 253 */ ED_UNASSIGNED, /* M-} */ + /* 254 */ ED_UNASSIGNED, /* M-~ */ + /* 255 */ ED_UNASSIGNED /* M-^? */ +}; + + +/* map_init(): + * Initialize and allocate the maps + */ +libedit_private int +map_init(EditLine *el) +{ + + /* + * Make sure those are correct before starting. + */ +#ifdef MAP_DEBUG + if (sizeof(el_map_emacs) != N_KEYS * sizeof(el_action_t)) + EL_ABORT((el->errfile, "Emacs map incorrect\n")); + if (sizeof(el_map_vi_command) != N_KEYS * sizeof(el_action_t)) + EL_ABORT((el->errfile, "Vi command map incorrect\n")); + if (sizeof(el_map_vi_insert) != N_KEYS * sizeof(el_action_t)) + EL_ABORT((el->errfile, "Vi insert map incorrect\n")); +#endif + + el->el_map.alt = el_malloc(sizeof(*el->el_map.alt) * N_KEYS); + if (el->el_map.alt == NULL) + return -1; + el->el_map.key = el_malloc(sizeof(*el->el_map.key) * N_KEYS); + if (el->el_map.key == NULL) + return -1; + el->el_map.emacs = el_map_emacs; + el->el_map.vic = el_map_vi_command; + el->el_map.vii = el_map_vi_insert; + el->el_map.help = el_malloc(sizeof(*el->el_map.help) * EL_NUM_FCNS); + if (el->el_map.help == NULL) + return -1; + (void) memcpy(el->el_map.help, el_func_help, + sizeof(*el->el_map.help) * EL_NUM_FCNS); + el->el_map.func = el_malloc(sizeof(*el->el_map.func) * EL_NUM_FCNS); + if (el->el_map.func == NULL) + return -1; + memcpy(el->el_map.func, el_func, sizeof(*el->el_map.func) + * EL_NUM_FCNS); + el->el_map.nfunc = EL_NUM_FCNS; + +#ifdef VIDEFAULT + map_init_vi(el); +#else + map_init_emacs(el); +#endif /* VIDEFAULT */ + return 0; +} + + +/* map_end(): + * Free the space taken by the editor maps + */ +libedit_private void +map_end(EditLine *el) +{ + + el_free(el->el_map.alt); + el->el_map.alt = NULL; + el_free(el->el_map.key); + el->el_map.key = NULL; + el->el_map.emacs = NULL; + el->el_map.vic = NULL; + el->el_map.vii = NULL; + el_free(el->el_map.help); + el->el_map.help = NULL; + el_free(el->el_map.func); + el->el_map.func = NULL; +} + + +/* map_init_nls(): + * Find all the printable keys and bind them to self insert + */ +static void +map_init_nls(EditLine *el) +{ + int i; + + el_action_t *map = el->el_map.key; + + for (i = 0200; i <= 0377; i++) + if (iswprint(i)) + map[i] = ED_INSERT; +} + + +/* map_init_meta(): + * Bind all the meta keys to the appropriate ESC- sequence + */ +static void +map_init_meta(EditLine *el) +{ + wchar_t buf[3]; + int i; + el_action_t *map = el->el_map.key; + el_action_t *alt = el->el_map.alt; + + for (i = 0; i <= 0377 && map[i] != EM_META_NEXT; i++) + continue; + + if (i > 0377) { + for (i = 0; i <= 0377 && alt[i] != EM_META_NEXT; i++) + continue; + if (i > 0377) { + i = 033; + if (el->el_map.type == MAP_VI) + map = alt; + } else + map = alt; + } + buf[0] = (wchar_t)i; + buf[2] = 0; + for (i = 0200; i <= 0377; i++) + switch (map[i]) { + case ED_INSERT: + case ED_UNASSIGNED: + case ED_SEQUENCE_LEAD_IN: + break; + default: + buf[1] = i & 0177; + keymacro_add(el, buf, keymacro_map_cmd(el, (int) map[i]), XK_CMD); + break; + } + map[(int) buf[0]] = ED_SEQUENCE_LEAD_IN; +} + + +/* map_init_vi(): + * Initialize the vi bindings + */ +libedit_private void +map_init_vi(EditLine *el) +{ + int i; + el_action_t *key = el->el_map.key; + el_action_t *alt = el->el_map.alt; + const el_action_t *vii = el->el_map.vii; + const el_action_t *vic = el->el_map.vic; + + el->el_map.type = MAP_VI; + el->el_map.current = el->el_map.key; + + keymacro_reset(el); + + for (i = 0; i < N_KEYS; i++) { + key[i] = vii[i]; + alt[i] = vic[i]; + } + + map_init_meta(el); + map_init_nls(el); + + tty_bind_char(el, 1); + terminal_bind_arrow(el); +} + + +/* map_init_emacs(): + * Initialize the emacs bindings + */ +libedit_private void +map_init_emacs(EditLine *el) +{ + int i; + wchar_t buf[3]; + el_action_t *key = el->el_map.key; + el_action_t *alt = el->el_map.alt; + const el_action_t *emacs = el->el_map.emacs; + + el->el_map.type = MAP_EMACS; + el->el_map.current = el->el_map.key; + keymacro_reset(el); + + for (i = 0; i < N_KEYS; i++) { + key[i] = emacs[i]; + alt[i] = ED_UNASSIGNED; + } + + map_init_meta(el); + map_init_nls(el); + + buf[0] = CONTROL('X'); + buf[1] = CONTROL('X'); + buf[2] = 0; + keymacro_add(el, buf, keymacro_map_cmd(el, EM_EXCHANGE_MARK), XK_CMD); + + tty_bind_char(el, 1); + terminal_bind_arrow(el); +} + + +/* map_set_editor(): + * Set the editor + */ +libedit_private int +map_set_editor(EditLine *el, wchar_t *editor) +{ + + if (wcscmp(editor, L"emacs") == 0) { + map_init_emacs(el); + return 0; + } + if (wcscmp(editor, L"vi") == 0) { + map_init_vi(el); + return 0; + } + return -1; +} + + +/* map_get_editor(): + * Retrieve the editor + */ +libedit_private int +map_get_editor(EditLine *el, const wchar_t **editor) +{ + + if (editor == NULL) + return -1; + switch (el->el_map.type) { + case MAP_EMACS: + *editor = L"emacs"; + return 0; + case MAP_VI: + *editor = L"vi"; + return 0; + } + return -1; +} + + +/* map_print_key(): + * Print the function description for 1 key + */ +static void +map_print_key(EditLine *el, el_action_t *map, const wchar_t *in) +{ + char outbuf[EL_BUFSIZ]; + el_bindings_t *bp, *ep; + + if (in[0] == '\0' || in[1] == '\0') { + (void) keymacro__decode_str(in, outbuf, sizeof(outbuf), ""); + ep = &el->el_map.help[el->el_map.nfunc]; + for (bp = el->el_map.help; bp < ep; bp++) + if (bp->func == map[(unsigned char) *in]) { + (void) fprintf(el->el_outfile, + "%s\t->\t%ls\n", outbuf, bp->name); + return; + } + } else + keymacro_print(el, in); +} + + +/* map_print_some_keys(): + * Print keys from first to last + */ +static void +map_print_some_keys(EditLine *el, el_action_t *map, wint_t first, wint_t last) +{ + el_bindings_t *bp, *ep; + wchar_t firstbuf[2], lastbuf[2]; + char unparsbuf[EL_BUFSIZ], extrabuf[EL_BUFSIZ]; + + firstbuf[0] = first; + firstbuf[1] = 0; + lastbuf[0] = last; + lastbuf[1] = 0; + if (map[first] == ED_UNASSIGNED) { + if (first == last) { + (void) keymacro__decode_str(firstbuf, unparsbuf, + sizeof(unparsbuf), STRQQ); + (void) fprintf(el->el_outfile, + "%-15s-> is undefined\n", unparsbuf); + } + return; + } + ep = &el->el_map.help[el->el_map.nfunc]; + for (bp = el->el_map.help; bp < ep; bp++) { + if (bp->func == map[first]) { + if (first == last) { + (void) keymacro__decode_str(firstbuf, unparsbuf, + sizeof(unparsbuf), STRQQ); + (void) fprintf(el->el_outfile, "%-15s-> %ls\n", + unparsbuf, bp->name); + } else { + (void) keymacro__decode_str(firstbuf, unparsbuf, + sizeof(unparsbuf), STRQQ); + (void) keymacro__decode_str(lastbuf, extrabuf, + sizeof(extrabuf), STRQQ); + (void) fprintf(el->el_outfile, + "%-4s to %-7s-> %ls\n", + unparsbuf, extrabuf, bp->name); + } + return; + } + } +#ifdef MAP_DEBUG + if (map == el->el_map.key) { + (void) keymacro__decode_str(firstbuf, unparsbuf, + sizeof(unparsbuf), STRQQ); + (void) fprintf(el->el_outfile, + "BUG!!! %s isn't bound to anything.\n", unparsbuf); + (void) fprintf(el->el_outfile, "el->el_map.key[%d] == %d\n", + first, el->el_map.key[first]); + } else { + (void) keymacro__decode_str(firstbuf, unparsbuf, + sizeof(unparsbuf), STRQQ); + (void) fprintf(el->el_outfile, + "BUG!!! %s isn't bound to anything.\n", unparsbuf); + (void) fprintf(el->el_outfile, "el->el_map.alt[%d] == %d\n", + first, el->el_map.alt[first]); + } +#endif + EL_ABORT((el->el_errfile, "Error printing keys\n")); +} + + +/* map_print_all_keys(): + * Print the function description for all keys. + */ +static void +map_print_all_keys(EditLine *el) +{ + int prev, i; + + (void) fprintf(el->el_outfile, "Standard key bindings\n"); + prev = 0; + for (i = 0; i < N_KEYS; i++) { + if (el->el_map.key[prev] == el->el_map.key[i]) + continue; + map_print_some_keys(el, el->el_map.key, prev, i - 1); + prev = i; + } + map_print_some_keys(el, el->el_map.key, prev, i - 1); + + (void) fprintf(el->el_outfile, "Alternative key bindings\n"); + prev = 0; + for (i = 0; i < N_KEYS; i++) { + if (el->el_map.alt[prev] == el->el_map.alt[i]) + continue; + map_print_some_keys(el, el->el_map.alt, prev, i - 1); + prev = i; + } + map_print_some_keys(el, el->el_map.alt, prev, i - 1); + + (void) fprintf(el->el_outfile, "Multi-character bindings\n"); + keymacro_print(el, L""); + (void) fprintf(el->el_outfile, "Arrow key bindings\n"); + terminal_print_arrow(el, L""); +} + + +/* map_bind(): + * Add/remove/change bindings + */ +libedit_private int +map_bind(EditLine *el, int argc, const wchar_t **argv) +{ + el_action_t *map; + int ntype, rem; + const wchar_t *p; + wchar_t inbuf[EL_BUFSIZ]; + wchar_t outbuf[EL_BUFSIZ]; + const wchar_t *in = NULL; + wchar_t *out; + el_bindings_t *bp, *ep; + int cmd; + int key; + + if (argv == NULL) + return -1; + + map = el->el_map.key; + ntype = XK_CMD; + key = rem = 0; + for (argc = 1; (p = argv[argc]) != NULL; argc++) + if (p[0] == '-') + switch (p[1]) { + case 'a': + map = el->el_map.alt; + break; + + case 's': + ntype = XK_STR; + break; + case 'k': + key = 1; + break; + + case 'r': + rem = 1; + break; + + case 'v': + map_init_vi(el); + return 0; + + case 'e': + map_init_emacs(el); + return 0; + + case 'l': + ep = &el->el_map.help[el->el_map.nfunc]; + for (bp = el->el_map.help; bp < ep; bp++) + (void) fprintf(el->el_outfile, + "%ls\n\t%ls\n", + bp->name, bp->description); + return 0; + default: + (void) fprintf(el->el_errfile, + "%ls: Invalid switch `%lc'.\n", + argv[0], (wint_t)p[1]); + } + else + break; + + if (argv[argc] == NULL) { + map_print_all_keys(el); + return 0; + } + if (key) + in = argv[argc++]; + else if ((in = parse__string(inbuf, argv[argc++])) == NULL) { + (void) fprintf(el->el_errfile, + "%ls: Invalid \\ or ^ in instring.\n", + argv[0]); + return -1; + } + if (rem) { + if (key) { + (void) terminal_clear_arrow(el, in); + return -1; + } + if (in[1]) + (void) keymacro_delete(el, in); + else if (map[(unsigned char) *in] == ED_SEQUENCE_LEAD_IN) + (void) keymacro_delete(el, in); + else + map[(unsigned char) *in] = ED_UNASSIGNED; + return 0; + } + if (argv[argc] == NULL) { + if (key) + terminal_print_arrow(el, in); + else + map_print_key(el, map, in); + return 0; + } +#ifdef notyet + if (argv[argc + 1] != NULL) { + bindkeymacro_usage(); + return -1; + } +#endif + + switch (ntype) { + case XK_STR: + if ((out = parse__string(outbuf, argv[argc])) == NULL) { + (void) fprintf(el->el_errfile, + "%ls: Invalid \\ or ^ in outstring.\n", argv[0]); + return -1; + } + if (key) + terminal_set_arrow(el, in, keymacro_map_str(el, out), ntype); + else + keymacro_add(el, in, keymacro_map_str(el, out), ntype); + map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; + break; + + case XK_CMD: + if ((cmd = parse_cmd(el, argv[argc])) == -1) { + (void) fprintf(el->el_errfile, + "%ls: Invalid command `%ls'.\n", + argv[0], argv[argc]); + return -1; + } + if (key) + terminal_set_arrow(el, in, keymacro_map_cmd(el, cmd), ntype); + else { + if (in[1]) { + keymacro_add(el, in, keymacro_map_cmd(el, cmd), ntype); + map[(unsigned char) *in] = ED_SEQUENCE_LEAD_IN; + } else { + keymacro_clear(el, map, in); + map[(unsigned char) *in] = (el_action_t)cmd; + } + } + break; + + /* coverity[dead_error_begin] */ + default: + EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); + break; + } + return 0; +} + + +/* map_addfunc(): + * add a user defined function + */ +libedit_private int +map_addfunc(EditLine *el, const wchar_t *name, const wchar_t *help, + el_func_t func) +{ + void *p; + size_t nf = el->el_map.nfunc + 1; + + if (name == NULL || help == NULL || func == NULL) + return -1; + + if ((p = el_realloc(el->el_map.func, nf * + sizeof(*el->el_map.func))) == NULL) + return -1; + el->el_map.func = p; + if ((p = el_realloc(el->el_map.help, nf * sizeof(*el->el_map.help))) + == NULL) + return -1; + el->el_map.help = p; + + nf = (size_t)el->el_map.nfunc; + el->el_map.func[nf] = func; + + el->el_map.help[nf].name = name; + el->el_map.help[nf].func = (int)nf; + el->el_map.help[nf].description = help; + el->el_map.nfunc++; + + return 0; +} diff --git a/crypto/heimdal/lib/libedit/src/parse.h b/crypto/heimdal/lib/libedit/src/parse.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/parse.h @@ -0,0 +1,48 @@ +/* $NetBSD: parse.h,v 1.9 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)parse.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.parse.h: Parser functions + */ +#ifndef _h_el_parse +#define _h_el_parse + +libedit_private int parse_line(EditLine *, const wchar_t *); +libedit_private int parse__escape(const wchar_t **); +libedit_private wchar_t *parse__string(wchar_t *, const wchar_t *); +libedit_private int parse_cmd(EditLine *, const wchar_t *); + +#endif /* _h_el_parse */ diff --git a/crypto/heimdal/lib/libedit/src/parse.c b/crypto/heimdal/lib/libedit/src/parse.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/parse.c @@ -0,0 +1,289 @@ +/* $NetBSD: parse.c,v 1.40 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)parse.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: parse.c,v 1.40 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * parse.c: parse an editline extended command + * + * commands are: + * + * bind + * echotc + * edit + * gettc + * history + * settc + * setty + */ +#include +#include + +#include "el.h" +#include "parse.h" + +static const struct { + const wchar_t *name; + int (*func)(EditLine *, int, const wchar_t **); +} cmds[] = { + { L"bind", map_bind }, + { L"echotc", terminal_echotc }, + { L"edit", el_editmode }, + { L"history", hist_command }, + { L"telltc", terminal_telltc }, + { L"settc", terminal_settc }, + { L"setty", tty_stty }, + { NULL, NULL } +}; + + +/* parse_line(): + * Parse a line and dispatch it + */ +libedit_private int +parse_line(EditLine *el, const wchar_t *line) +{ + const wchar_t **argv; + int argc; + TokenizerW *tok; + + tok = tok_winit(NULL); + tok_wstr(tok, line, &argc, &argv); + argc = el_wparse(el, argc, argv); + tok_wend(tok); + return argc; +} + + +/* el_parse(): + * Command dispatcher + */ +int +el_wparse(EditLine *el, int argc, const wchar_t *argv[]) +{ + const wchar_t *ptr; + int i; + + if (argc < 1) + return -1; + ptr = wcschr(argv[0], L':'); + if (ptr != NULL) { + wchar_t *tprog; + size_t l; + + if (ptr == argv[0]) + return 0; + l = (size_t)(ptr - argv[0] - 1); + tprog = el_malloc((l + 1) * sizeof(*tprog)); + if (tprog == NULL) + return 0; + (void) wcsncpy(tprog, argv[0], l); + tprog[l] = '\0'; + ptr++; + l = (size_t)el_match(el->el_prog, tprog); + el_free(tprog); + if (!l) + return 0; + } else + ptr = argv[0]; + + for (i = 0; cmds[i].name != NULL; i++) + if (wcscmp(cmds[i].name, ptr) == 0) { + i = (*cmds[i].func) (el, argc, argv); + return -i; + } + return -1; +} + + +/* parse__escape(): + * Parse a string of the form ^ \ \ \U+xxxx and return + * the appropriate character or -1 if the escape is not valid + */ +libedit_private int +parse__escape(const wchar_t **ptr) +{ + const wchar_t *p; + wint_t c; + + p = *ptr; + + if (p[1] == 0) + return -1; + + if (*p == '\\') { + p++; + switch (*p) { + case 'a': + c = '\007'; /* Bell */ + break; + case 'b': + c = '\010'; /* Backspace */ + break; + case 't': + c = '\011'; /* Horizontal Tab */ + break; + case 'n': + c = '\012'; /* New Line */ + break; + case 'v': + c = '\013'; /* Vertical Tab */ + break; + case 'f': + c = '\014'; /* Form Feed */ + break; + case 'r': + c = '\015'; /* Carriage Return */ + break; + case 'e': + c = '\033'; /* Escape */ + break; + case 'U': /* Unicode \U+xxxx or \U+xxxxx format */ + { + int i; + const wchar_t hex[] = L"0123456789ABCDEF"; + const wchar_t *h; + ++p; + if (*p++ != '+') + return -1; + c = 0; + for (i = 0; i < 5; ++i) { + h = wcschr(hex, *p++); + if (!h && i < 4) + return -1; + else if (h) + c = (c << 4) | ((int)(h - hex)); + else + --p; + } + if (c > 0x10FFFF) /* outside valid character range */ + return -1; + break; + } + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { + int cnt, ch; + + for (cnt = 0, c = 0; cnt < 3; cnt++) { + ch = *p++; + if (ch < '0' || ch > '7') { + p--; + break; + } + c = (c << 3) | (ch - '0'); + } + if ((c & (wint_t)0xffffff00) != (wint_t)0) + return -1; + --p; + break; + } + default: + c = *p; + break; + } + } else if (*p == '^') { + p++; + c = (*p == '?') ? '\177' : (*p & 0237); + } else + c = *p; + *ptr = ++p; + return c; +} + +/* parse__string(): + * Parse the escapes from in and put the raw string out + */ +libedit_private wchar_t * +parse__string(wchar_t *out, const wchar_t *in) +{ + wchar_t *rv = out; + int n; + + for (;;) + switch (*in) { + case '\0': + *out = '\0'; + return rv; + + case '\\': + case '^': + if ((n = parse__escape(&in)) == -1) + return NULL; + *out++ = (wchar_t)n; + break; + + case 'M': + if (in[1] == '-' && in[2] != '\0') { + *out++ = '\033'; + in += 2; + break; + } + /*FALLTHROUGH*/ + + default: + *out++ = *in++; + break; + } +} + + +/* parse_cmd(): + * Return the command number for the command string given + * or -1 if one is not found + */ +libedit_private int +parse_cmd(EditLine *el, const wchar_t *cmd) +{ + el_bindings_t *b = el->el_map.help; + size_t i; + + for (i = 0; i < el->el_map.nfunc; i++) + if (wcscmp(b[i].name, cmd) == 0) + return b[i].func; + return -1; +} diff --git a/crypto/heimdal/lib/libedit/src/prompt.h b/crypto/heimdal/lib/libedit/src/prompt.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/prompt.h @@ -0,0 +1,58 @@ +/* $NetBSD: prompt.h,v 1.15 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)prompt.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.prompt.h: Prompt printing stuff + */ +#ifndef _h_el_prompt +#define _h_el_prompt + +typedef wchar_t *(*el_pfunc_t)(EditLine *); + +typedef struct el_prompt_t { + el_pfunc_t p_func; /* Function to return the prompt */ + coord_t p_pos; /* position in the line after prompt */ + wchar_t p_ignore; /* character to start/end literal */ + int p_wide; +} el_prompt_t; + +libedit_private void prompt_print(EditLine *, int); +libedit_private int prompt_set(EditLine *, el_pfunc_t, wchar_t, int, int); +libedit_private int prompt_get(EditLine *, el_pfunc_t *, wchar_t *, int); +libedit_private int prompt_init(EditLine *); +libedit_private void prompt_end(EditLine *); + +#endif /* _h_el_prompt */ diff --git a/crypto/heimdal/lib/libedit/src/prompt.c b/crypto/heimdal/lib/libedit/src/prompt.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/prompt.c @@ -0,0 +1,199 @@ +/* $NetBSD: prompt.c,v 1.26 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: prompt.c,v 1.26 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * prompt.c: Prompt printing functions + */ +#include +#include "el.h" + +static wchar_t *prompt_default(EditLine *); +static wchar_t *prompt_default_r(EditLine *); + +/* prompt_default(): + * Just a default prompt, in case the user did not provide one + */ +static wchar_t * +/*ARGSUSED*/ +prompt_default(EditLine *el __attribute__((__unused__))) +{ + static wchar_t a[3] = L"? "; + + return a; +} + + +/* prompt_default_r(): + * Just a default rprompt, in case the user did not provide one + */ +static wchar_t * +/*ARGSUSED*/ +prompt_default_r(EditLine *el __attribute__((__unused__))) +{ + static wchar_t a[1] = L""; + + return a; +} + + +/* prompt_print(): + * Print the prompt and update the prompt position. + */ +libedit_private void +prompt_print(EditLine *el, int op) +{ + el_prompt_t *elp; + wchar_t *p; + int ignore = 0; + + if (op == EL_PROMPT) + elp = &el->el_prompt; + else + elp = &el->el_rprompt; + + if (elp->p_wide) + p = (*elp->p_func)(el); + else + p = ct_decode_string((char *)(void *)(*elp->p_func)(el), + &el->el_scratch); + + for (; *p; p++) { + if (elp->p_ignore == *p) { + ignore = !ignore; + continue; + } + if (ignore) + terminal__putc(el, *p); + else + re_putc(el, *p, 1); + } + + elp->p_pos.v = el->el_refresh.r_cursor.v; + elp->p_pos.h = el->el_refresh.r_cursor.h; +} + + +/* prompt_init(): + * Initialize the prompt stuff + */ +libedit_private int +prompt_init(EditLine *el) +{ + + el->el_prompt.p_func = prompt_default; + el->el_prompt.p_pos.v = 0; + el->el_prompt.p_pos.h = 0; + el->el_prompt.p_ignore = '\0'; + el->el_rprompt.p_func = prompt_default_r; + el->el_rprompt.p_pos.v = 0; + el->el_rprompt.p_pos.h = 0; + el->el_rprompt.p_ignore = '\0'; + return 0; +} + + +/* prompt_end(): + * Clean up the prompt stuff + */ +libedit_private void +/*ARGSUSED*/ +prompt_end(EditLine *el __attribute__((__unused__))) +{ +} + + +/* prompt_set(): + * Install a prompt printing function + */ +libedit_private int +prompt_set(EditLine *el, el_pfunc_t prf, wchar_t c, int op, int wide) +{ + el_prompt_t *p; + + if (op == EL_PROMPT || op == EL_PROMPT_ESC) + p = &el->el_prompt; + else + p = &el->el_rprompt; + + if (prf == NULL) { + if (op == EL_PROMPT || op == EL_PROMPT_ESC) + p->p_func = prompt_default; + else + p->p_func = prompt_default_r; + } else { + p->p_func = prf; + } + + p->p_ignore = c; + + p->p_pos.v = 0; + p->p_pos.h = 0; + p->p_wide = wide; + + return 0; +} + + +/* prompt_get(): + * Retrieve the prompt printing function + */ +libedit_private int +prompt_get(EditLine *el, el_pfunc_t *prf, wchar_t *c, int op) +{ + el_prompt_t *p; + + if (prf == NULL) + return -1; + + if (op == EL_PROMPT) + p = &el->el_prompt; + else + p = &el->el_rprompt; + + if (prf) + *prf = p->p_func; + if (c) + *c = p->p_ignore; + + return 0; +} diff --git a/crypto/heimdal/lib/libedit/src/read.h b/crypto/heimdal/lib/libedit/src/read.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/read.h @@ -0,0 +1,45 @@ +/* $NetBSD: read.h,v 1.12 2016/05/22 19:44:26 christos Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Anthony Mallet. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * el.read.h: Character reading functions + */ +#ifndef _h_el_read +#define _h_el_read + +libedit_private int read_init(EditLine *); +libedit_private void read_end(struct el_read_t *); +libedit_private void read_prepare(EditLine *); +libedit_private void read_finish(EditLine *); +libedit_private int el_read_setfn(struct el_read_t *, el_rfunc_t); +libedit_private el_rfunc_t el_read_getfn(struct el_read_t *); + +#endif /* _h_el_read */ diff --git a/crypto/heimdal/lib/libedit/src/read.c b/crypto/heimdal/lib/libedit/src/read.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/read.c @@ -0,0 +1,628 @@ +/* $NetBSD: read.c,v 1.101 2016/05/25 13:01:11 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: read.c,v 1.101 2016/05/25 13:01:11 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * read.c: Terminal read functions + */ +#include +#include +#include +#include +#include +#include +#include + +#include "el.h" +#include "fcns.h" +#include "read.h" + +#define EL_MAXMACRO 10 + +struct macros { + wchar_t **macro; + int level; + int offset; +}; + +struct el_read_t { + struct macros macros; + el_rfunc_t read_char; /* Function to read a character. */ + int read_errno; +}; + +static int read__fixio(int, int); +static int read_char(EditLine *, wchar_t *); +static int read_getcmd(EditLine *, el_action_t *, wchar_t *); +static void read_clearmacros(struct macros *); +static void read_pop(struct macros *); +static const wchar_t *noedit_wgets(EditLine *, int *); + +/* read_init(): + * Initialize the read stuff + */ +libedit_private int +read_init(EditLine *el) +{ + struct macros *ma; + + if ((el->el_read = el_malloc(sizeof(*el->el_read))) == NULL) + return -1; + + ma = &el->el_read->macros; + if ((ma->macro = el_malloc(EL_MAXMACRO * + sizeof(*ma->macro))) == NULL) { + free(el->el_read); + return -1; + } + ma->level = -1; + ma->offset = 0; + + /* builtin read_char */ + el->el_read->read_char = read_char; + return 0; +} + +/* el_read_end(): + * Free the data structures used by the read stuff. + */ +libedit_private void +read_end(struct el_read_t *el_read) +{ + read_clearmacros(&el_read->macros); + el_free(el_read->macros.macro); + el_read->macros.macro = NULL; +} + +/* el_read_setfn(): + * Set the read char function to the one provided. + * If it is set to EL_BUILTIN_GETCFN, then reset to the builtin one. + */ +libedit_private int +el_read_setfn(struct el_read_t *el_read, el_rfunc_t rc) +{ + el_read->read_char = (rc == EL_BUILTIN_GETCFN) ? read_char : rc; + return 0; +} + + +/* el_read_getfn(): + * return the current read char function, or EL_BUILTIN_GETCFN + * if it is the default one + */ +libedit_private el_rfunc_t +el_read_getfn(struct el_read_t *el_read) +{ + return el_read->read_char == read_char ? + EL_BUILTIN_GETCFN : el_read->read_char; +} + + +/* read__fixio(): + * Try to recover from a read error + */ +/* ARGSUSED */ +static int +read__fixio(int fd __attribute__((__unused__)), int e) +{ + + switch (e) { + case -1: /* Make sure that the code is reachable */ + +#ifdef EWOULDBLOCK + case EWOULDBLOCK: +#ifndef TRY_AGAIN +#define TRY_AGAIN +#endif +#endif /* EWOULDBLOCK */ + +#if defined(POSIX) && defined(EAGAIN) +#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN + case EAGAIN: +#ifndef TRY_AGAIN +#define TRY_AGAIN +#endif +#endif /* EWOULDBLOCK && EWOULDBLOCK != EAGAIN */ +#endif /* POSIX && EAGAIN */ + + e = 0; +#ifdef TRY_AGAIN +#if defined(F_SETFL) && defined(O_NDELAY) + if ((e = fcntl(fd, F_GETFL, 0)) == -1) + return -1; + + if (fcntl(fd, F_SETFL, e & ~O_NDELAY) == -1) + return -1; + else + e = 1; +#endif /* F_SETFL && O_NDELAY */ + +#ifdef FIONBIO + { + int zero = 0; + + if (ioctl(fd, FIONBIO, &zero) == -1) + return -1; + else + e = 1; + } +#endif /* FIONBIO */ + +#endif /* TRY_AGAIN */ + return e ? 0 : -1; + + case EINTR: + return 0; + + default: + return -1; + } +} + + +/* el_push(): + * Push a macro + */ +void +el_wpush(EditLine *el, const wchar_t *str) +{ + struct macros *ma = &el->el_read->macros; + + if (str != NULL && ma->level + 1 < EL_MAXMACRO) { + ma->level++; + if ((ma->macro[ma->level] = wcsdup(str)) != NULL) + return; + ma->level--; + } + terminal_beep(el); + terminal__flush(el); +} + + +/* read_getcmd(): + * Get next command from the input stream, + * return 0 on success or -1 on EOF or error. + * Character values > 255 are not looked up in the map, but inserted. + */ +static int +read_getcmd(EditLine *el, el_action_t *cmdnum, wchar_t *ch) +{ + static const wchar_t meta = (wchar_t)0x80; + el_action_t cmd; + int num; + + do { + if ((num = el_wgetc(el, ch)) != 1) + return -1; + +#ifdef KANJI + if ((*ch & meta)) { + el->el_state.metanext = 0; + cmd = CcViMap[' ']; + break; + } else +#endif /* KANJI */ + + if (el->el_state.metanext) { + el->el_state.metanext = 0; + *ch |= meta; + } + if (*ch >= N_KEYS) + cmd = ED_INSERT; + else + cmd = el->el_map.current[(unsigned char) *ch]; + if (cmd == ED_SEQUENCE_LEAD_IN) { + keymacro_value_t val; + switch (keymacro_get(el, ch, &val)) { + case XK_CMD: + cmd = val.cmd; + break; + case XK_STR: + el_wpush(el, val.str); + break; + case XK_NOD: + return -1; + default: + EL_ABORT((el->el_errfile, "Bad XK_ type \n")); + break; + } + } + } while (cmd == ED_SEQUENCE_LEAD_IN); + *cmdnum = cmd; + return 0; +} + +/* read_char(): + * Read a character from the tty. + */ +static int +read_char(EditLine *el, wchar_t *cp) +{ + ssize_t num_read; + int tried = 0; + char cbuf[MB_LEN_MAX]; + size_t cbp = 0; + int save_errno = errno; + + again: + el->el_signal->sig_no = 0; + while ((num_read = read(el->el_infd, cbuf + cbp, (size_t)1)) == -1) { + int e = errno; + switch (el->el_signal->sig_no) { + case SIGCONT: + el_wset(el, EL_REFRESH); + /*FALLTHROUGH*/ + case SIGWINCH: + sig_set(el); + goto again; + default: + break; + } + if (!tried && read__fixio(el->el_infd, e) == 0) { + errno = save_errno; + tried = 1; + } else { + errno = e; + *cp = L'\0'; + return -1; + } + } + + /* Test for EOF */ + if (num_read == 0) { + *cp = L'\0'; + return 0; + } + + for (;;) { + mbstate_t mbs; + + ++cbp; + /* This only works because UTF8 is stateless. */ + memset(&mbs, 0, sizeof(mbs)); + switch (mbrtowc(cp, cbuf, cbp, &mbs)) { + case (size_t)-1: + if (cbp > 1) { + /* + * Invalid sequence, discard all bytes + * except the last one. + */ + cbuf[0] = cbuf[cbp - 1]; + cbp = 0; + break; + } else { + /* Invalid byte, discard it. */ + cbp = 0; + goto again; + } + case (size_t)-2: + /* + * We don't support other multibyte charsets. + * The second condition shouldn't happen + * and is here merely for additional safety. + */ + if ((el->el_flags & CHARSET_IS_UTF8) == 0 || + cbp >= MB_LEN_MAX) { + errno = EILSEQ; + *cp = L'\0'; + return -1; + } + /* Incomplete sequence, read another byte. */ + goto again; + default: + /* Valid character, process it. */ + return 1; + } + } +} + +/* read_pop(): + * Pop a macro from the stack + */ +static void +read_pop(struct macros *ma) +{ + int i; + + el_free(ma->macro[0]); + for (i = 0; i < ma->level; i++) + ma->macro[i] = ma->macro[i + 1]; + ma->level--; + ma->offset = 0; +} + +static void +read_clearmacros(struct macros *ma) +{ + while (ma->level >= 0) + el_free(ma->macro[ma->level--]); + ma->offset = 0; +} + +/* el_wgetc(): + * Read a wide character + */ +int +el_wgetc(EditLine *el, wchar_t *cp) +{ + struct macros *ma = &el->el_read->macros; + int num_read; + + terminal__flush(el); + for (;;) { + if (ma->level < 0) + break; + + if (ma->macro[0][ma->offset] == '\0') { + read_pop(ma); + continue; + } + + *cp = ma->macro[0][ma->offset++]; + + if (ma->macro[0][ma->offset] == '\0') { + /* Needed for QuoteMode On */ + read_pop(ma); + } + + return 1; + } + + if (tty_rawmode(el) < 0)/* make sure the tty is set up correctly */ + return 0; + + num_read = (*el->el_read->read_char)(el, cp); + + /* + * Remember the original reason of a read failure + * such that el_wgets() can restore it after doing + * various cleanup operation that might change errno. + */ + if (num_read < 0) + el->el_read->read_errno = errno; + + return num_read; +} + +libedit_private void +read_prepare(EditLine *el) +{ + if (el->el_flags & HANDLE_SIGNALS) + sig_set(el); + if (el->el_flags & NO_TTY) + return; + if ((el->el_flags & (UNBUFFERED|EDIT_DISABLED)) == UNBUFFERED) + tty_rawmode(el); + + /* This is relatively cheap, and things go terribly wrong if + we have the wrong size. */ + el_resize(el); + re_clear_display(el); /* reset the display stuff */ + ch_reset(el); + re_refresh(el); /* print the prompt */ + + if (el->el_flags & UNBUFFERED) + terminal__flush(el); +} + +libedit_private void +read_finish(EditLine *el) +{ + if ((el->el_flags & UNBUFFERED) == 0) + (void) tty_cookedmode(el); + if (el->el_flags & HANDLE_SIGNALS) + sig_clr(el); +} + +static const wchar_t * +noedit_wgets(EditLine *el, int *nread) +{ + el_line_t *lp = &el->el_line; + int num; + + while ((num = (*el->el_read->read_char)(el, lp->lastchar)) == 1) { + if (lp->lastchar + 1 >= lp->limit && + !ch_enlargebufs(el, (size_t)2)) + break; + lp->lastchar++; + if (el->el_flags & UNBUFFERED || + lp->lastchar[-1] == '\r' || + lp->lastchar[-1] == '\n') + break; + } + if (num == -1 && errno == EINTR) + lp->lastchar = lp->buffer; + lp->cursor = lp->lastchar; + *lp->lastchar = '\0'; + *nread = (int)(lp->lastchar - lp->buffer); + return *nread ? lp->buffer : NULL; +} + +const wchar_t * +el_wgets(EditLine *el, int *nread) +{ + int retval; + el_action_t cmdnum = 0; + int num; /* how many chars we have read at NL */ + wchar_t ch; + int nrb; + + if (nread == NULL) + nread = &nrb; + *nread = 0; + el->el_read->read_errno = 0; + + if (el->el_flags & NO_TTY) { + el->el_line.lastchar = el->el_line.buffer; + return noedit_wgets(el, nread); + } + +#ifdef FIONREAD + if (el->el_tty.t_mode == EX_IO && el->el_read->macros.level < 0) { + int chrs = 0; + + (void) ioctl(el->el_infd, FIONREAD, &chrs); + if (chrs == 0) { + if (tty_rawmode(el) < 0) { + errno = 0; + *nread = 0; + return NULL; + } + } + } +#endif /* FIONREAD */ + + if ((el->el_flags & UNBUFFERED) == 0) + read_prepare(el); + + if (el->el_flags & EDIT_DISABLED) { + if ((el->el_flags & UNBUFFERED) == 0) + el->el_line.lastchar = el->el_line.buffer; + terminal__flush(el); + return noedit_wgets(el, nread); + } + + for (num = -1; num == -1;) { /* while still editing this line */ + /* if EOF or error */ + if (read_getcmd(el, &cmdnum, &ch) == -1) + break; + if ((size_t)cmdnum >= el->el_map.nfunc) /* BUG CHECK command */ + continue; /* try again */ + /* now do the real command */ + /* vi redo needs these way down the levels... */ + el->el_state.thiscmd = cmdnum; + el->el_state.thisch = ch; + if (el->el_map.type == MAP_VI && + el->el_map.current == el->el_map.key && + el->el_chared.c_redo.pos < el->el_chared.c_redo.lim) { + if (cmdnum == VI_DELETE_PREV_CHAR && + el->el_chared.c_redo.pos != el->el_chared.c_redo.buf + && iswprint(el->el_chared.c_redo.pos[-1])) + el->el_chared.c_redo.pos--; + else + *el->el_chared.c_redo.pos++ = ch; + } + retval = (*el->el_map.func[cmdnum]) (el, ch); + + /* save the last command here */ + el->el_state.lastcmd = cmdnum; + + /* use any return value */ + switch (retval) { + case CC_CURSOR: + re_refresh_cursor(el); + break; + + case CC_REDISPLAY: + re_clear_lines(el); + re_clear_display(el); + /* FALLTHROUGH */ + + case CC_REFRESH: + re_refresh(el); + break; + + case CC_REFRESH_BEEP: + re_refresh(el); + terminal_beep(el); + break; + + case CC_NORM: /* normal char */ + break; + + case CC_ARGHACK: /* Suggested by Rich Salz */ + /* */ + continue; /* keep going... */ + + case CC_EOF: /* end of file typed */ + if ((el->el_flags & UNBUFFERED) == 0) + num = 0; + else if (num == -1) { + *el->el_line.lastchar++ = CONTROL('d'); + el->el_line.cursor = el->el_line.lastchar; + num = 1; + } + break; + + case CC_NEWLINE: /* normal end of line */ + num = (int)(el->el_line.lastchar - el->el_line.buffer); + break; + + case CC_FATAL: /* fatal error, reset to known state */ + /* put (real) cursor in a known place */ + re_clear_display(el); /* reset the display stuff */ + ch_reset(el); /* reset the input pointers */ + read_clearmacros(&el->el_read->macros); + re_refresh(el); /* print the prompt again */ + break; + + case CC_ERROR: + default: /* functions we don't know about */ + terminal_beep(el); + terminal__flush(el); + break; + } + el->el_state.argument = 1; + el->el_state.doingarg = 0; + el->el_chared.c_vcmd.action = NOP; + if (el->el_flags & UNBUFFERED) + break; + } + + terminal__flush(el); /* flush any buffered output */ + /* make sure the tty is set up correctly */ + if ((el->el_flags & UNBUFFERED) == 0) { + read_finish(el); + *nread = num != -1 ? num : 0; + } else + *nread = (int)(el->el_line.lastchar - el->el_line.buffer); + + if (*nread == 0) { + if (num == -1) { + *nread = -1; + if (el->el_read->read_errno) + errno = el->el_read->read_errno; + } + return NULL; + } else + return el->el_line.buffer; +} diff --git a/crypto/heimdal/lib/libedit/src/readline.c b/crypto/heimdal/lib/libedit/src/readline.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/readline.c @@ -0,0 +1,2367 @@ +/* $NetBSD: readline.c,v 1.139 2016/10/28 18:32:26 christos Exp $ */ + +/*- + * Copyright (c) 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jaromir Dolecek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +__RCSID("$NetBSD: readline.c,v 1.139 2016/10/28 18:32:26 christos Exp $"); +#endif /* not lint && not SCCSID */ + +#include "config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "readline/readline.h" +#include "el.h" +#include "fcns.h" +#include "filecomplete.h" + +void rl_prep_terminal(int); +void rl_deprep_terminal(void); + +/* for rl_complete() */ +#define TAB '\r' + +/* see comment at the #ifdef for sense of this */ +/* #define GDB_411_HACK */ + +/* readline compatibility stuff - look at readline sources/documentation */ +/* to see what these variables mean */ +const char *rl_library_version = "EditLine wrapper"; +int rl_readline_version = RL_READLINE_VERSION; +static char empty[] = { '\0' }; +static char expand_chars[] = { ' ', '\t', '\n', '=', '(', '\0' }; +static char break_chars[] = { ' ', '\t', '\n', '"', '\\', '\'', '`', '@', '$', + '>', '<', '=', ';', '|', '&', '{', '(', '\0' }; +char *rl_readline_name = empty; +FILE *rl_instream = NULL; +FILE *rl_outstream = NULL; +int rl_point = 0; +int rl_end = 0; +char *rl_line_buffer = NULL; +rl_vcpfunc_t *rl_linefunc = NULL; +int rl_done = 0; +VFunction *rl_event_hook = NULL; +KEYMAP_ENTRY_ARRAY emacs_standard_keymap, + emacs_meta_keymap, + emacs_ctlx_keymap; +/* + * The following is not implemented; we always catch signals in the + * libedit fashion: set handlers on entry to el_gets() and clear them + * on the way out. This simplistic approach works for most cases; if + * it does not work for your application, please let us know. + */ +int rl_catch_signals = 1; +int rl_catch_sigwinch = 1; + +int history_base = 1; /* probably never subject to change */ +int history_length = 0; +int history_offset = 0; +int max_input_history = 0; +char history_expansion_char = '!'; +char history_subst_char = '^'; +char *history_no_expand_chars = expand_chars; +Function *history_inhibit_expansion_function = NULL; +char *history_arg_extract(int start, int end, const char *str); + +int rl_inhibit_completion = 0; +int rl_attempted_completion_over = 0; +char *rl_basic_word_break_characters = break_chars; +char *rl_completer_word_break_characters = NULL; +char *rl_completer_quote_characters = NULL; +rl_compentry_func_t *rl_completion_entry_function = NULL; +char *(*rl_completion_word_break_hook)(void) = NULL; +rl_completion_func_t *rl_attempted_completion_function = NULL; +Function *rl_pre_input_hook = NULL; +Function *rl_startup1_hook = NULL; +int (*rl_getc_function)(FILE *) = NULL; +char *rl_terminal_name = NULL; +int rl_already_prompted = 0; +int rl_filename_completion_desired = 0; +int rl_ignore_completion_duplicates = 0; +int readline_echoing_p = 1; +int _rl_print_completions_horizontally = 0; +VFunction *rl_redisplay_function = NULL; +Function *rl_startup_hook = NULL; +VFunction *rl_completion_display_matches_hook = NULL; +VFunction *rl_prep_term_function = (VFunction *)rl_prep_terminal; +VFunction *rl_deprep_term_function = (VFunction *)rl_deprep_terminal; +KEYMAP_ENTRY_ARRAY emacs_meta_keymap; + +/* + * The current prompt string. + */ +char *rl_prompt = NULL; +/* + * This is set to character indicating type of completion being done by + * rl_complete_internal(); this is available for application completion + * functions. + */ +int rl_completion_type = 0; + +/* + * If more than this number of items results from query for possible + * completions, we ask user if they are sure to really display the list. + */ +int rl_completion_query_items = 100; + +/* + * List of characters which are word break characters, but should be left + * in the parsed text when it is passed to the completion function. + * Shell uses this to help determine what kind of completing to do. + */ +char *rl_special_prefixes = NULL; + +/* + * This is the character appended to the completed words if at the end of + * the line. Default is ' ' (a space). + */ +int rl_completion_append_character = ' '; + +/* stuff below is used internally by libedit for readline emulation */ + +static History *h = NULL; +static EditLine *e = NULL; +static rl_command_func_t *map[256]; +static jmp_buf topbuf; + +/* internal functions */ +static unsigned char _el_rl_complete(EditLine *, int); +static unsigned char _el_rl_tstp(EditLine *, int); +static char *_get_prompt(EditLine *); +static int _getc_function(EditLine *, wchar_t *); +static int _history_expand_command(const char *, size_t, size_t, + char **); +static char *_rl_compat_sub(const char *, const char *, + const char *, int); +static int _rl_event_read_char(EditLine *, wchar_t *); +static void _rl_update_pos(void); + +static HIST_ENTRY rl_he; + +/* ARGSUSED */ +static char * +_get_prompt(EditLine *el __attribute__((__unused__))) +{ + rl_already_prompted = 1; + return rl_prompt; +} + + +/* + * read one key from user defined input function + */ +static int +/*ARGSUSED*/ +_getc_function(EditLine *el __attribute__((__unused__)), wchar_t *c) +{ + int i; + + i = (*rl_getc_function)(rl_instream); + if (i == -1) + return 0; + *c = (wchar_t)i; + return 1; +} + +static void +_resize_fun(EditLine *el, void *a) +{ + const LineInfo *li; + char **ap = a; + + li = el_line(el); + /* a cheesy way to get rid of const cast. */ + *ap = memchr(li->buffer, *li->buffer, (size_t)1); +} + +static const char * +_default_history_file(void) +{ + struct passwd *p; + static char *path; + size_t len; + + if (path) + return path; + + if ((p = getpwuid(getuid())) == NULL) + return NULL; + + len = strlen(p->pw_dir) + sizeof("/.history"); + if ((path = malloc(len)) == NULL) + return NULL; + + (void)snprintf(path, len, "%s/.history", p->pw_dir); + return path; +} + +/* + * READLINE compatibility stuff + */ + +/* + * Set the prompt + */ +int +rl_set_prompt(const char *prompt) +{ + char *p; + + if (!prompt) + prompt = ""; + if (rl_prompt != NULL && strcmp(rl_prompt, prompt) == 0) + return 0; + if (rl_prompt) + el_free(rl_prompt); + rl_prompt = strdup(prompt); + if (rl_prompt == NULL) + return -1; + + while ((p = strchr(rl_prompt, RL_PROMPT_END_IGNORE)) != NULL) + *p = RL_PROMPT_START_IGNORE; + + return 0; +} + +/* + * initialize rl compat stuff + */ +int +rl_initialize(void) +{ + HistEvent ev; + int editmode = 1; + struct termios t; + + if (e != NULL) + el_end(e); + if (h != NULL) + history_end(h); + + if (!rl_instream) + rl_instream = stdin; + if (!rl_outstream) + rl_outstream = stdout; + + /* + * See if we don't really want to run the editor + */ + if (tcgetattr(fileno(rl_instream), &t) != -1 && (t.c_lflag & ECHO) == 0) + editmode = 0; + + e = el_init(rl_readline_name, rl_instream, rl_outstream, stderr); + + if (!editmode) + el_set(e, EL_EDITMODE, 0); + + h = history_init(); + if (!e || !h) + return -1; + + history(h, &ev, H_SETSIZE, INT_MAX); /* unlimited */ + history_length = 0; + max_input_history = INT_MAX; + el_set(e, EL_HIST, history, h); + + /* Setup resize function */ + el_set(e, EL_RESIZE, _resize_fun, &rl_line_buffer); + + /* setup getc function if valid */ + if (rl_getc_function) + el_set(e, EL_GETCFN, _getc_function); + + /* for proper prompt printing in readline() */ + if (rl_set_prompt("") == -1) { + history_end(h); + el_end(e); + return -1; + } + el_set(e, EL_PROMPT, _get_prompt, RL_PROMPT_START_IGNORE); + el_set(e, EL_SIGNAL, rl_catch_signals); + + /* set default mode to "emacs"-style and read setting afterwards */ + /* so this can be overridden */ + el_set(e, EL_EDITOR, "emacs"); + if (rl_terminal_name != NULL) + el_set(e, EL_TERMINAL, rl_terminal_name); + else + el_get(e, EL_TERMINAL, &rl_terminal_name); + + /* + * Word completion - this has to go AFTER rebinding keys + * to emacs-style. + */ + el_set(e, EL_ADDFN, "rl_complete", + "ReadLine compatible completion function", + _el_rl_complete); + el_set(e, EL_BIND, "^I", "rl_complete", NULL); + + /* + * Send TSTP when ^Z is pressed. + */ + el_set(e, EL_ADDFN, "rl_tstp", + "ReadLine compatible suspend function", + _el_rl_tstp); + el_set(e, EL_BIND, "^Z", "rl_tstp", NULL); + + /* + * Set some readline compatible key-bindings. + */ + el_set(e, EL_BIND, "^R", "em-inc-search-prev", NULL); + + /* + * Allow the use of Home/End keys. + */ + el_set(e, EL_BIND, "\\e[1~", "ed-move-to-beg", NULL); + el_set(e, EL_BIND, "\\e[4~", "ed-move-to-end", NULL); + el_set(e, EL_BIND, "\\e[7~", "ed-move-to-beg", NULL); + el_set(e, EL_BIND, "\\e[8~", "ed-move-to-end", NULL); + el_set(e, EL_BIND, "\\e[H", "ed-move-to-beg", NULL); + el_set(e, EL_BIND, "\\e[F", "ed-move-to-end", NULL); + + /* + * Allow the use of the Delete/Insert keys. + */ + el_set(e, EL_BIND, "\\e[3~", "ed-delete-next-char", NULL); + el_set(e, EL_BIND, "\\e[2~", "ed-quoted-insert", NULL); + + /* + * Ctrl-left-arrow and Ctrl-right-arrow for word moving. + */ + el_set(e, EL_BIND, "\\e[1;5C", "em-next-word", NULL); + el_set(e, EL_BIND, "\\e[1;5D", "ed-prev-word", NULL); + el_set(e, EL_BIND, "\\e[5C", "em-next-word", NULL); + el_set(e, EL_BIND, "\\e[5D", "ed-prev-word", NULL); + el_set(e, EL_BIND, "\\e\\e[C", "em-next-word", NULL); + el_set(e, EL_BIND, "\\e\\e[D", "ed-prev-word", NULL); + + /* read settings from configuration file */ + el_source(e, NULL); + + /* + * Unfortunately, some applications really do use rl_point + * and rl_line_buffer directly. + */ + _resize_fun(e, &rl_line_buffer); + _rl_update_pos(); + + if (rl_startup_hook) + (*rl_startup_hook)(NULL, 0); + + return 0; +} + + +/* + * read one line from input stream and return it, chomping + * trailing newline (if there is any) + */ +char * +readline(const char *p) +{ + HistEvent ev; + const char * volatile prompt = p; + int count; + const char *ret; + char *buf; + static int used_event_hook; + + if (e == NULL || h == NULL) + rl_initialize(); + + rl_done = 0; + + (void)setjmp(topbuf); + + /* update prompt accordingly to what has been passed */ + if (rl_set_prompt(prompt) == -1) + return NULL; + + if (rl_pre_input_hook) + (*rl_pre_input_hook)(NULL, 0); + + if (rl_event_hook && !(e->el_flags&NO_TTY)) { + el_set(e, EL_GETCFN, _rl_event_read_char); + used_event_hook = 1; + } + + if (!rl_event_hook && used_event_hook) { + el_set(e, EL_GETCFN, EL_BUILTIN_GETCFN); + used_event_hook = 0; + } + + rl_already_prompted = 0; + + /* get one line from input stream */ + ret = el_gets(e, &count); + + if (ret && count > 0) { + int lastidx; + + buf = strdup(ret); + if (buf == NULL) + return NULL; + lastidx = count - 1; + if (buf[lastidx] == '\n') + buf[lastidx] = '\0'; + } else + buf = NULL; + + history(h, &ev, H_GETSIZE); + history_length = ev.num; + + return buf; +} + +/* + * history functions + */ + +/* + * is normally called before application starts to use + * history expansion functions + */ +void +using_history(void) +{ + if (h == NULL || e == NULL) + rl_initialize(); + history_offset = history_length; +} + + +/* + * substitute ``what'' with ``with'', returning resulting string; if + * globally == 1, substitutes all occurrences of what, otherwise only the + * first one + */ +static char * +_rl_compat_sub(const char *str, const char *what, const char *with, + int globally) +{ + const char *s; + char *r, *result; + size_t len, with_len, what_len; + + len = strlen(str); + with_len = strlen(with); + what_len = strlen(what); + + /* calculate length we need for result */ + s = str; + while (*s) { + if (*s == *what && !strncmp(s, what, what_len)) { + len += with_len - what_len; + if (!globally) + break; + s += what_len; + } else + s++; + } + r = result = el_malloc((len + 1) * sizeof(*r)); + if (result == NULL) + return NULL; + s = str; + while (*s) { + if (*s == *what && !strncmp(s, what, what_len)) { + (void)strncpy(r, with, with_len); + r += with_len; + s += what_len; + if (!globally) { + (void)strcpy(r, s); + return result; + } + } else + *r++ = *s++; + } + *r = '\0'; + return result; +} + +static char *last_search_pat; /* last !?pat[?] search pattern */ +static char *last_search_match; /* last !?pat[?] that matched */ + +const char * +get_history_event(const char *cmd, int *cindex, int qchar) +{ + int idx, sign, sub, num, begin, ret; + size_t len; + char *pat; + const char *rptr; + HistEvent ev; + + idx = *cindex; + if (cmd[idx++] != history_expansion_char) + return NULL; + + /* find out which event to take */ + if (cmd[idx] == history_expansion_char || cmd[idx] == '\0') { + if (history(h, &ev, H_FIRST) != 0) + return NULL; + *cindex = cmd[idx]? (idx + 1):idx; + return ev.str; + } + sign = 0; + if (cmd[idx] == '-') { + sign = 1; + idx++; + } + + if ('0' <= cmd[idx] && cmd[idx] <= '9') { + HIST_ENTRY *he; + + num = 0; + while (cmd[idx] && '0' <= cmd[idx] && cmd[idx] <= '9') { + num = num * 10 + cmd[idx] - '0'; + idx++; + } + if (sign) + num = history_length - num + 1; + + if (!(he = history_get(num))) + return NULL; + + *cindex = idx; + return he->line; + } + sub = 0; + if (cmd[idx] == '?') { + sub = 1; + idx++; + } + begin = idx; + while (cmd[idx]) { + if (cmd[idx] == '\n') + break; + if (sub && cmd[idx] == '?') + break; + if (!sub && (cmd[idx] == ':' || cmd[idx] == ' ' + || cmd[idx] == '\t' || cmd[idx] == qchar)) + break; + idx++; + } + len = (size_t)idx - (size_t)begin; + if (sub && cmd[idx] == '?') + idx++; + if (sub && len == 0 && last_search_pat && *last_search_pat) + pat = last_search_pat; + else if (len == 0) + return NULL; + else { + if ((pat = el_malloc((len + 1) * sizeof(*pat))) == NULL) + return NULL; + (void)strncpy(pat, cmd + begin, len); + pat[len] = '\0'; + } + + if (history(h, &ev, H_CURR) != 0) { + if (pat != last_search_pat) + el_free(pat); + return NULL; + } + num = ev.num; + + if (sub) { + if (pat != last_search_pat) { + if (last_search_pat) + el_free(last_search_pat); + last_search_pat = pat; + } + ret = history_search(pat, -1); + } else + ret = history_search_prefix(pat, -1); + + if (ret == -1) { + /* restore to end of list on failed search */ + history(h, &ev, H_FIRST); + (void)fprintf(rl_outstream, "%s: Event not found\n", pat); + if (pat != last_search_pat) + el_free(pat); + return NULL; + } + + if (sub && len) { + if (last_search_match && last_search_match != pat) + el_free(last_search_match); + last_search_match = pat; + } + + if (pat != last_search_pat) + el_free(pat); + + if (history(h, &ev, H_CURR) != 0) + return NULL; + *cindex = idx; + rptr = ev.str; + + /* roll back to original position */ + (void)history(h, &ev, H_SET, num); + + return rptr; +} + +/* + * the real function doing history expansion - takes as argument command + * to do and data upon which the command should be executed + * does expansion the way I've understood readline documentation + * + * returns 0 if data was not modified, 1 if it was and 2 if the string + * should be only printed and not executed; in case of error, + * returns -1 and *result points to NULL + * it's the caller's responsibility to free() the string returned in *result + */ +static int +_history_expand_command(const char *command, size_t offs, size_t cmdlen, + char **result) +{ + char *tmp, *search = NULL, *aptr; + const char *ptr, *cmd; + static char *from = NULL, *to = NULL; + int start, end, idx, has_mods = 0; + int p_on = 0, g_on = 0; + + *result = NULL; + aptr = NULL; + ptr = NULL; + + /* First get event specifier */ + idx = 0; + + if (strchr(":^*$", command[offs + 1])) { + char str[4]; + /* + * "!:" is shorthand for "!!:". + * "!^", "!*" and "!$" are shorthand for + * "!!:^", "!!:*" and "!!:$" respectively. + */ + str[0] = str[1] = '!'; + str[2] = '0'; + ptr = get_history_event(str, &idx, 0); + idx = (command[offs + 1] == ':')? 1:0; + has_mods = 1; + } else { + if (command[offs + 1] == '#') { + /* use command so far */ + if ((aptr = el_malloc((offs + 1) * sizeof(*aptr))) + == NULL) + return -1; + (void)strncpy(aptr, command, offs); + aptr[offs] = '\0'; + idx = 1; + } else { + int qchar; + + qchar = (offs > 0 && command[offs - 1] == '"')? '"':0; + ptr = get_history_event(command + offs, &idx, qchar); + } + has_mods = command[offs + (size_t)idx] == ':'; + } + + if (ptr == NULL && aptr == NULL) + return -1; + + if (!has_mods) { + *result = strdup(aptr ? aptr : ptr); + if (aptr) + el_free(aptr); + if (*result == NULL) + return -1; + return 1; + } + + cmd = command + offs + idx + 1; + + /* Now parse any word designators */ + + if (*cmd == '%') /* last word matched by ?pat? */ + tmp = strdup(last_search_match? last_search_match:""); + else if (strchr("^*$-0123456789", *cmd)) { + start = end = -1; + if (*cmd == '^') + start = end = 1, cmd++; + else if (*cmd == '$') + start = -1, cmd++; + else if (*cmd == '*') + start = 1, cmd++; + else if (*cmd == '-' || isdigit((unsigned char) *cmd)) { + start = 0; + while (*cmd && '0' <= *cmd && *cmd <= '9') + start = start * 10 + *cmd++ - '0'; + + if (*cmd == '-') { + if (isdigit((unsigned char) cmd[1])) { + cmd++; + end = 0; + while (*cmd && '0' <= *cmd && *cmd <= '9') + end = end * 10 + *cmd++ - '0'; + } else if (cmd[1] == '$') { + cmd += 2; + end = -1; + } else { + cmd++; + end = -2; + } + } else if (*cmd == '*') + end = -1, cmd++; + else + end = start; + } + tmp = history_arg_extract(start, end, aptr? aptr:ptr); + if (tmp == NULL) { + (void)fprintf(rl_outstream, "%s: Bad word specifier", + command + offs + idx); + if (aptr) + el_free(aptr); + return -1; + } + } else + tmp = strdup(aptr? aptr:ptr); + + if (aptr) + el_free(aptr); + + if (*cmd == '\0' || ((size_t)(cmd - (command + offs)) >= cmdlen)) { + *result = tmp; + return 1; + } + + for (; *cmd; cmd++) { + if (*cmd == ':') + continue; + else if (*cmd == 'h') { /* remove trailing path */ + if ((aptr = strrchr(tmp, '/')) != NULL) + *aptr = '\0'; + } else if (*cmd == 't') { /* remove leading path */ + if ((aptr = strrchr(tmp, '/')) != NULL) { + aptr = strdup(aptr + 1); + el_free(tmp); + tmp = aptr; + } + } else if (*cmd == 'r') { /* remove trailing suffix */ + if ((aptr = strrchr(tmp, '.')) != NULL) + *aptr = '\0'; + } else if (*cmd == 'e') { /* remove all but suffix */ + if ((aptr = strrchr(tmp, '.')) != NULL) { + aptr = strdup(aptr); + el_free(tmp); + tmp = aptr; + } + } else if (*cmd == 'p') /* print only */ + p_on = 1; + else if (*cmd == 'g') + g_on = 2; + else if (*cmd == 's' || *cmd == '&') { + char *what, *with, delim; + size_t len, from_len; + size_t size; + + if (*cmd == '&' && (from == NULL || to == NULL)) + continue; + else if (*cmd == 's') { + delim = *(++cmd), cmd++; + size = 16; + what = el_realloc(from, size * sizeof(*what)); + if (what == NULL) { + el_free(from); + el_free(tmp); + return 0; + } + len = 0; + for (; *cmd && *cmd != delim; cmd++) { + if (*cmd == '\\' && cmd[1] == delim) + cmd++; + if (len >= size) { + char *nwhat; + nwhat = el_realloc(what, + (size <<= 1) * + sizeof(*nwhat)); + if (nwhat == NULL) { + el_free(what); + el_free(tmp); + return 0; + } + what = nwhat; + } + what[len++] = *cmd; + } + what[len] = '\0'; + from = what; + if (*what == '\0') { + el_free(what); + if (search) { + from = strdup(search); + if (from == NULL) { + el_free(tmp); + return 0; + } + } else { + from = NULL; + el_free(tmp); + return -1; + } + } + cmd++; /* shift after delim */ + if (!*cmd) + continue; + + size = 16; + with = el_realloc(to, size * sizeof(*with)); + if (with == NULL) { + el_free(to); + el_free(tmp); + return -1; + } + len = 0; + from_len = strlen(from); + for (; *cmd && *cmd != delim; cmd++) { + if (len + from_len + 1 >= size) { + char *nwith; + size += from_len + 1; + nwith = el_realloc(with, + size * sizeof(*nwith)); + if (nwith == NULL) { + el_free(with); + el_free(tmp); + return -1; + } + with = nwith; + } + if (*cmd == '&') { + /* safe */ + (void)strcpy(&with[len], from); + len += from_len; + continue; + } + if (*cmd == '\\' + && (*(cmd + 1) == delim + || *(cmd + 1) == '&')) + cmd++; + with[len++] = *cmd; + } + with[len] = '\0'; + to = with; + } + + aptr = _rl_compat_sub(tmp, from, to, g_on); + if (aptr) { + el_free(tmp); + tmp = aptr; + } + g_on = 0; + } + } + *result = tmp; + return p_on? 2:1; +} + + +/* + * csh-style history expansion + */ +int +history_expand(char *str, char **output) +{ + int ret = 0; + size_t idx, i, size; + char *tmp, *result; + + if (h == NULL || e == NULL) + rl_initialize(); + + if (history_expansion_char == 0) { + *output = strdup(str); + return 0; + } + + *output = NULL; + if (str[0] == history_subst_char) { + /* ^foo^foo2^ is equivalent to !!:s^foo^foo2^ */ + *output = el_malloc((strlen(str) + 4 + 1) * sizeof(**output)); + if (*output == NULL) + return 0; + (*output)[0] = (*output)[1] = history_expansion_char; + (*output)[2] = ':'; + (*output)[3] = 's'; + (void)strcpy((*output) + 4, str); + str = *output; + } else { + *output = strdup(str); + if (*output == NULL) + return 0; + } + +#define ADD_STRING(what, len, fr) \ + { \ + if (idx + len + 1 > size) { \ + char *nresult = el_realloc(result, \ + (size += len + 1) * sizeof(*nresult)); \ + if (nresult == NULL) { \ + el_free(*output); \ + if (/*CONSTCOND*/fr) \ + el_free(tmp); \ + return 0; \ + } \ + result = nresult; \ + } \ + (void)strncpy(&result[idx], what, len); \ + idx += len; \ + result[idx] = '\0'; \ + } + + result = NULL; + size = idx = 0; + tmp = NULL; + for (i = 0; str[i];) { + int qchar, loop_again; + size_t len, start, j; + + qchar = 0; + loop_again = 1; + start = j = i; +loop: + for (; str[j]; j++) { + if (str[j] == '\\' && + str[j + 1] == history_expansion_char) { + len = strlen(&str[j + 1]) + 1; + memmove(&str[j], &str[j + 1], len); + continue; + } + if (!loop_again) { + if (isspace((unsigned char) str[j]) + || str[j] == qchar) + break; + } + if (str[j] == history_expansion_char + && !strchr(history_no_expand_chars, str[j + 1]) + && (!history_inhibit_expansion_function || + (*history_inhibit_expansion_function)(str, + (int)j) == 0)) + break; + } + + if (str[j] && loop_again) { + i = j; + qchar = (j > 0 && str[j - 1] == '"' )? '"':0; + j++; + if (str[j] == history_expansion_char) + j++; + loop_again = 0; + goto loop; + } + len = i - start; + ADD_STRING(&str[start], len, 0); + + if (str[i] == '\0' || str[i] != history_expansion_char) { + len = j - i; + ADD_STRING(&str[i], len, 0); + if (start == 0) + ret = 0; + else + ret = 1; + break; + } + ret = _history_expand_command (str, i, (j - i), &tmp); + if (ret > 0 && tmp) { + len = strlen(tmp); + ADD_STRING(tmp, len, 1); + } + if (tmp) { + el_free(tmp); + tmp = NULL; + } + i = j; + } + + /* ret is 2 for "print only" option */ + if (ret == 2) { + add_history(result); +#ifdef GDB_411_HACK + /* gdb 4.11 has been shipped with readline, where */ + /* history_expand() returned -1 when the line */ + /* should not be executed; in readline 2.1+ */ + /* it should return 2 in such a case */ + ret = -1; +#endif + } + el_free(*output); + *output = result; + + return ret; +} + +/* +* Return a string consisting of arguments of "str" from "start" to "end". +*/ +char * +history_arg_extract(int start, int end, const char *str) +{ + size_t i, len, max; + char **arr, *result = NULL; + + arr = history_tokenize(str); + if (!arr) + return NULL; + if (arr && *arr == NULL) + goto out; + + for (max = 0; arr[max]; max++) + continue; + max--; + + if (start == '$') + start = (int)max; + if (end == '$') + end = (int)max; + if (end < 0) + end = (int)max + end + 1; + if (start < 0) + start = end; + + if (start < 0 || end < 0 || (size_t)start > max || + (size_t)end > max || start > end) + goto out; + + for (i = (size_t)start, len = 0; i <= (size_t)end; i++) + len += strlen(arr[i]) + 1; + len++; + result = el_malloc(len * sizeof(*result)); + if (result == NULL) + goto out; + + for (i = (size_t)start, len = 0; i <= (size_t)end; i++) { + (void)strcpy(result + len, arr[i]); + len += strlen(arr[i]); + if (i < (size_t)end) + result[len++] = ' '; + } + result[len] = '\0'; + +out: + for (i = 0; arr[i]; i++) + el_free(arr[i]); + el_free(arr); + + return result; +} + +/* + * Parse the string into individual tokens, + * similar to how shell would do it. + */ +char ** +history_tokenize(const char *str) +{ + int size = 1, idx = 0, i, start; + size_t len; + char **result = NULL, *temp, delim = '\0'; + + for (i = 0; str[i];) { + while (isspace((unsigned char) str[i])) + i++; + start = i; + for (; str[i];) { + if (str[i] == '\\') { + if (str[i+1] != '\0') + i++; + } else if (str[i] == delim) + delim = '\0'; + else if (!delim && + (isspace((unsigned char) str[i]) || + strchr("()<>;&|$", str[i]))) + break; + else if (!delim && strchr("'`\"", str[i])) + delim = str[i]; + if (str[i]) + i++; + } + + if (idx + 2 >= size) { + char **nresult; + size <<= 1; + nresult = el_realloc(result, (size_t)size * sizeof(*nresult)); + if (nresult == NULL) { + el_free(result); + return NULL; + } + result = nresult; + } + len = (size_t)i - (size_t)start; + temp = el_malloc((size_t)(len + 1) * sizeof(*temp)); + if (temp == NULL) { + for (i = 0; i < idx; i++) + el_free(result[i]); + el_free(result); + return NULL; + } + (void)strncpy(temp, &str[start], len); + temp[len] = '\0'; + result[idx++] = temp; + result[idx] = NULL; + if (str[i]) + i++; + } + return result; +} + + +/* + * limit size of history record to ``max'' events + */ +void +stifle_history(int max) +{ + HistEvent ev; + HIST_ENTRY *he; + + if (h == NULL || e == NULL) + rl_initialize(); + + if (history(h, &ev, H_SETSIZE, max) == 0) { + max_input_history = max; + if (history_length > max) + history_base = history_length - max; + while (history_length > max) { + he = remove_history(0); + el_free(he->data); + el_free((void *)(unsigned long)he->line); + el_free(he); + } + } +} + + +/* + * "unlimit" size of history - set the limit to maximum allowed int value + */ +int +unstifle_history(void) +{ + HistEvent ev; + int omax; + + history(h, &ev, H_SETSIZE, INT_MAX); + omax = max_input_history; + max_input_history = INT_MAX; + return omax; /* some value _must_ be returned */ +} + + +int +history_is_stifled(void) +{ + + /* cannot return true answer */ + return max_input_history != INT_MAX; +} + +static const char _history_tmp_template[] = "/tmp/.historyXXXXXX"; + +int +history_truncate_file (const char *filename, int nlines) +{ + int ret = 0; + FILE *fp, *tp; + char template[sizeof(_history_tmp_template)]; + char buf[4096]; + int fd; + char *cp; + off_t off; + int count = 0; + ssize_t left = 0; + + if (filename == NULL && (filename = _default_history_file()) == NULL) + return errno; + if ((fp = fopen(filename, "r+")) == NULL) + return errno; + strcpy(template, _history_tmp_template); + if ((fd = mkstemp(template)) == -1) { + ret = errno; + goto out1; + } + + if ((tp = fdopen(fd, "r+")) == NULL) { + close(fd); + ret = errno; + goto out2; + } + + for(;;) { + if (fread(buf, sizeof(buf), (size_t)1, fp) != 1) { + if (ferror(fp)) { + ret = errno; + break; + } + if (fseeko(fp, (off_t)sizeof(buf) * count, SEEK_SET) == + (off_t)-1) { + ret = errno; + break; + } + left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), fp); + if (ferror(fp)) { + ret = errno; + break; + } + if (left == 0) { + count--; + left = sizeof(buf); + } else if (fwrite(buf, (size_t)left, (size_t)1, tp) + != 1) { + ret = errno; + break; + } + fflush(tp); + break; + } + if (fwrite(buf, sizeof(buf), (size_t)1, tp) != 1) { + ret = errno; + break; + } + count++; + } + if (ret) + goto out3; + cp = buf + left - 1; + if(*cp != '\n') + cp++; + for(;;) { + while (--cp >= buf) { + if (*cp == '\n') { + if (--nlines == 0) { + if (++cp >= buf + sizeof(buf)) { + count++; + cp = buf; + } + break; + } + } + } + if (nlines <= 0 || count == 0) + break; + count--; + if (fseeko(tp, (off_t)sizeof(buf) * count, SEEK_SET) < 0) { + ret = errno; + break; + } + if (fread(buf, sizeof(buf), (size_t)1, tp) != 1) { + if (ferror(tp)) { + ret = errno; + break; + } + ret = EAGAIN; + break; + } + cp = buf + sizeof(buf); + } + + if (ret || nlines > 0) + goto out3; + + if (fseeko(fp, (off_t)0, SEEK_SET) == (off_t)-1) { + ret = errno; + goto out3; + } + + if (fseeko(tp, (off_t)sizeof(buf) * count + (cp - buf), SEEK_SET) == + (off_t)-1) { + ret = errno; + goto out3; + } + + for(;;) { + if ((left = (ssize_t)fread(buf, (size_t)1, sizeof(buf), tp)) == 0) { + if (ferror(fp)) + ret = errno; + break; + } + if (fwrite(buf, (size_t)left, (size_t)1, fp) != 1) { + ret = errno; + break; + } + } + fflush(fp); + if((off = ftello(fp)) > 0) + (void)ftruncate(fileno(fp), off); +out3: + fclose(tp); +out2: + unlink(template); +out1: + fclose(fp); + + return ret; +} + + +/* + * read history from a file given + */ +int +read_history(const char *filename) +{ + HistEvent ev; + + if (h == NULL || e == NULL) + rl_initialize(); + if (filename == NULL && (filename = _default_history_file()) == NULL) + return errno; + return history(h, &ev, H_LOAD, filename) == -1 ? + (errno ? errno : EINVAL) : 0; +} + + +/* + * write history to a file given + */ +int +write_history(const char *filename) +{ + HistEvent ev; + + if (h == NULL || e == NULL) + rl_initialize(); + if (filename == NULL && (filename = _default_history_file()) == NULL) + return errno; + return history(h, &ev, H_SAVE, filename) == -1 ? + (errno ? errno : EINVAL) : 0; +} + + +/* + * returns history ``num''th event + * + * returned pointer points to static variable + */ +HIST_ENTRY * +history_get(int num) +{ + static HIST_ENTRY she; + HistEvent ev; + int curr_num; + + if (h == NULL || e == NULL) + rl_initialize(); + + if (num < history_base) + return NULL; + + /* save current position */ + if (history(h, &ev, H_CURR) != 0) + return NULL; + curr_num = ev.num; + + /* + * use H_DELDATA to set to nth history (without delete) by passing + * (void **)-1 -- as in history_set_pos + */ + if (history(h, &ev, H_DELDATA, num - history_base, (void **)-1) != 0) + goto out; + + /* get current entry */ + if (history(h, &ev, H_CURR) != 0) + goto out; + if (history(h, &ev, H_NEXT_EVDATA, ev.num, &she.data) != 0) + goto out; + she.line = ev.str; + + /* restore pointer to where it was */ + (void)history(h, &ev, H_SET, curr_num); + + return &she; + +out: + /* restore pointer to where it was */ + (void)history(h, &ev, H_SET, curr_num); + return NULL; +} + + +/* + * add the line to history table + */ +int +add_history(const char *line) +{ + HistEvent ev; + + if (h == NULL || e == NULL) + rl_initialize(); + + if (history(h, &ev, H_ENTER, line) == -1) + return 0; + + (void)history(h, &ev, H_GETSIZE); + if (ev.num == history_length) + history_base++; + else + history_length = ev.num; + return 0; +} + + +/* + * remove the specified entry from the history list and return it. + */ +HIST_ENTRY * +remove_history(int num) +{ + HIST_ENTRY *he; + HistEvent ev; + + if (h == NULL || e == NULL) + rl_initialize(); + + if ((he = el_malloc(sizeof(*he))) == NULL) + return NULL; + + if (history(h, &ev, H_DELDATA, num, &he->data) != 0) { + el_free(he); + return NULL; + } + + he->line = ev.str; + if (history(h, &ev, H_GETSIZE) == 0) + history_length = ev.num; + + return he; +} + + +/* + * replace the line and data of the num-th entry + */ +HIST_ENTRY * +replace_history_entry(int num, const char *line, histdata_t data) +{ + HIST_ENTRY *he; + HistEvent ev; + int curr_num; + + if (h == NULL || e == NULL) + rl_initialize(); + + /* save current position */ + if (history(h, &ev, H_CURR) != 0) + return NULL; + curr_num = ev.num; + + /* start from the oldest */ + if (history(h, &ev, H_LAST) != 0) + return NULL; /* error */ + + if ((he = el_malloc(sizeof(*he))) == NULL) + return NULL; + + /* look forwards for event matching specified offset */ + if (history(h, &ev, H_NEXT_EVDATA, num, &he->data)) + goto out; + + he->line = strdup(ev.str); + if (he->line == NULL) + goto out; + + if (history(h, &ev, H_REPLACE, line, data)) + goto out; + + /* restore pointer to where it was */ + if (history(h, &ev, H_SET, curr_num)) + goto out; + + return he; +out: + el_free(he); + return NULL; +} + +/* + * clear the history list - delete all entries + */ +void +clear_history(void) +{ + HistEvent ev; + + if (h == NULL || e == NULL) + rl_initialize(); + + (void)history(h, &ev, H_CLEAR); + history_offset = history_length = 0; +} + + +/* + * returns offset of the current history event + */ +int +where_history(void) +{ + return history_offset; +} + +static HIST_ENTRY **_history_listp; +static HIST_ENTRY *_history_list; + +HIST_ENTRY ** +history_list(void) +{ + HistEvent ev; + HIST_ENTRY **nlp, *nl; + int i; + + if (history(h, &ev, H_LAST) != 0) + return NULL; + + if ((nlp = el_realloc(_history_listp, + (size_t)history_length * sizeof(*nlp))) == NULL) + return NULL; + _history_listp = nlp; + + if ((nl = el_realloc(_history_list, + (size_t)history_length * sizeof(*nl))) == NULL) + return NULL; + _history_list = nl; + + i = 0; + do { + _history_listp[i] = &_history_list[i]; + _history_list[i].line = ev.str; + _history_list[i].data = NULL; + if (i++ == history_length) + abort(); + } while (history(h, &ev, H_PREV) == 0); + return _history_listp; +} + +/* + * returns current history event or NULL if there is no such event + */ +HIST_ENTRY * +current_history(void) +{ + HistEvent ev; + + if (history(h, &ev, H_PREV_EVENT, history_offset + 1) != 0) + return NULL; + + rl_he.line = ev.str; + rl_he.data = NULL; + return &rl_he; +} + + +/* + * returns total number of bytes history events' data are using + */ +int +history_total_bytes(void) +{ + HistEvent ev; + int curr_num; + size_t size; + + if (history(h, &ev, H_CURR) != 0) + return -1; + curr_num = ev.num; + + (void)history(h, &ev, H_FIRST); + size = 0; + do + size += strlen(ev.str) * sizeof(*ev.str); + while (history(h, &ev, H_NEXT) == 0); + + /* get to the same position as before */ + history(h, &ev, H_PREV_EVENT, curr_num); + + return (int)size; +} + + +/* + * sets the position in the history list to ``pos'' + */ +int +history_set_pos(int pos) +{ + if (pos >= history_length || pos < 0) + return 0; + + history_offset = pos; + return 1; +} + + +/* + * returns previous event in history and shifts pointer accordingly + * Note that readline and editline define directions in opposite ways. + */ +HIST_ENTRY * +previous_history(void) +{ + HistEvent ev; + + if (history_offset == 0) + return NULL; + + if (history(h, &ev, H_LAST) != 0) + return NULL; + + history_offset--; + return current_history(); +} + + +/* + * returns next event in history and shifts pointer accordingly + */ +HIST_ENTRY * +next_history(void) +{ + HistEvent ev; + + if (history_offset >= history_length) + return NULL; + + if (history(h, &ev, H_LAST) != 0) + return NULL; + + history_offset++; + return current_history(); +} + + +/* + * searches for first history event containing the str + */ +int +history_search(const char *str, int direction) +{ + HistEvent ev; + const char *strp; + int curr_num; + + if (history(h, &ev, H_CURR) != 0) + return -1; + curr_num = ev.num; + + for (;;) { + if ((strp = strstr(ev.str, str)) != NULL) + return (int)(strp - ev.str); + if (history(h, &ev, direction < 0 ? H_NEXT:H_PREV) != 0) + break; + } + (void)history(h, &ev, H_SET, curr_num); + return -1; +} + + +/* + * searches for first history event beginning with str + */ +int +history_search_prefix(const char *str, int direction) +{ + HistEvent ev; + + return (history(h, &ev, direction < 0 ? + H_PREV_STR : H_NEXT_STR, str)); +} + + +/* + * search for event in history containing str, starting at offset + * abs(pos); continue backward, if pos<0, forward otherwise + */ +/* ARGSUSED */ +int +history_search_pos(const char *str, + int direction __attribute__((__unused__)), int pos) +{ + HistEvent ev; + int curr_num, off; + + off = (pos > 0) ? pos : -pos; + pos = (pos > 0) ? 1 : -1; + + if (history(h, &ev, H_CURR) != 0) + return -1; + curr_num = ev.num; + + if (!history_set_pos(off) || history(h, &ev, H_CURR) != 0) + return -1; + + for (;;) { + if (strstr(ev.str, str)) + return off; + if (history(h, &ev, (pos < 0) ? H_PREV : H_NEXT) != 0) + break; + } + + /* set "current" pointer back to previous state */ + (void)history(h, &ev, + pos < 0 ? H_NEXT_EVENT : H_PREV_EVENT, curr_num); + + return -1; +} + + +/********************************/ +/* completion functions */ + +char * +tilde_expand(char *name) +{ + return fn_tilde_expand(name); +} + +char * +filename_completion_function(const char *name, int state) +{ + return fn_filename_completion_function(name, state); +} + +/* + * a completion generator for usernames; returns _first_ username + * which starts with supplied text + * text contains a partial username preceded by random character + * (usually '~'); state resets search from start (??? should we do that anyway) + * it's the caller's responsibility to free the returned value + */ +char * +username_completion_function(const char *text, int state) +{ +#if defined(HAVE_GETPW_R_POSIX) || defined(HAVE_GETPW_R_DRAFT) + struct passwd pwres; + char pwbuf[1024]; +#endif + struct passwd *pass = NULL; + + if (text[0] == '\0') + return NULL; + + if (*text == '~') + text++; + + if (state == 0) + setpwent(); + + while ( + (pass = getpwent()) != NULL + && text[0] == pass->pw_name[0] + && strcmp(text, pass->pw_name) == 0) + continue; + + if (pass == NULL) { + endpwent(); + return NULL; + } + return strdup(pass->pw_name); +} + + +/* + * el-compatible wrapper to send TSTP on ^Z + */ +/* ARGSUSED */ +static unsigned char +_el_rl_tstp(EditLine *el __attribute__((__unused__)), int ch __attribute__((__unused__))) +{ + (void)kill(0, SIGTSTP); + return CC_NORM; +} + +/* + * Display list of strings in columnar format on readline's output stream. + * 'matches' is list of strings, 'len' is number of strings in 'matches', + * 'max' is maximum length of string in 'matches'. + */ +void +rl_display_match_list(char **matches, int len, int max) +{ + + fn_display_match_list(e, matches, (size_t)len, (size_t)max); +} + +static const char * +/*ARGSUSED*/ +_rl_completion_append_character_function(const char *dummy + __attribute__((__unused__))) +{ + static char buf[2]; + buf[0] = (char)rl_completion_append_character; + buf[1] = '\0'; + return buf; +} + + +/* + * complete word at current point + */ +/* ARGSUSED */ +int +rl_complete(int ignore __attribute__((__unused__)), int invoking_key) +{ + static ct_buffer_t wbreak_conv, sprefix_conv; + char *breakchars; + + if (h == NULL || e == NULL) + rl_initialize(); + + if (rl_inhibit_completion) { + char arr[2]; + arr[0] = (char)invoking_key; + arr[1] = '\0'; + el_insertstr(e, arr); + return CC_REFRESH; + } + + if (rl_completion_word_break_hook != NULL) + breakchars = (*rl_completion_word_break_hook)(); + else + breakchars = rl_basic_word_break_characters; + + _rl_update_pos(); + + /* Just look at how many global variables modify this operation! */ + return fn_complete(e, + (rl_compentry_func_t *)rl_completion_entry_function, + rl_attempted_completion_function, + ct_decode_string(rl_basic_word_break_characters, &wbreak_conv), + ct_decode_string(breakchars, &sprefix_conv), + _rl_completion_append_character_function, + (size_t)rl_completion_query_items, + &rl_completion_type, &rl_attempted_completion_over, + &rl_point, &rl_end); + + +} + + +/* ARGSUSED */ +static unsigned char +_el_rl_complete(EditLine *el __attribute__((__unused__)), int ch) +{ + return (unsigned char)rl_complete(0, ch); +} + +/* + * misc other functions + */ + +/* + * bind key c to readline-type function func + */ +int +rl_bind_key(int c, rl_command_func_t *func) +{ + int retval = -1; + + if (h == NULL || e == NULL) + rl_initialize(); + + if (func == rl_insert) { + /* XXX notice there is no range checking of ``c'' */ + e->el_map.key[c] = ED_INSERT; + retval = 0; + } + return retval; +} + + +/* + * read one key from input - handles chars pushed back + * to input stream also + */ +int +rl_read_key(void) +{ + char fooarr[2 * sizeof(int)]; + + if (e == NULL || h == NULL) + rl_initialize(); + + return el_getc(e, fooarr); +} + + +/* + * reset the terminal + */ +/* ARGSUSED */ +void +rl_reset_terminal(const char *p __attribute__((__unused__))) +{ + + if (h == NULL || e == NULL) + rl_initialize(); + el_reset(e); +} + + +/* + * insert character ``c'' back into input stream, ``count'' times + */ +int +rl_insert(int count, int c) +{ + char arr[2]; + + if (h == NULL || e == NULL) + rl_initialize(); + + /* XXX - int -> char conversion can lose on multichars */ + arr[0] = (char)c; + arr[1] = '\0'; + + for (; count > 0; count--) + el_push(e, arr); + + return 0; +} + +int +rl_insert_text(const char *text) +{ + if (!text || *text == 0) + return 0; + + if (h == NULL || e == NULL) + rl_initialize(); + + if (el_insertstr(e, text) < 0) + return 0; + return (int)strlen(text); +} + +/*ARGSUSED*/ +int +rl_newline(int count __attribute__((__unused__)), + int c __attribute__((__unused__))) +{ + /* + * Readline-4.0 appears to ignore the args. + */ + return rl_insert(1, '\n'); +} + +/*ARGSUSED*/ +static unsigned char +rl_bind_wrapper(EditLine *el __attribute__((__unused__)), unsigned char c) +{ + if (map[c] == NULL) + return CC_ERROR; + + _rl_update_pos(); + + (*map[c])(1, c); + + /* If rl_done was set by the above call, deal with it here */ + if (rl_done) + return CC_EOF; + + return CC_NORM; +} + +int +rl_add_defun(const char *name, rl_command_func_t *fun, int c) +{ + char dest[8]; + if ((size_t)c >= sizeof(map) / sizeof(map[0]) || c < 0) + return -1; + map[(unsigned char)c] = fun; + el_set(e, EL_ADDFN, name, name, rl_bind_wrapper); + vis(dest, c, VIS_WHITE|VIS_NOSLASH, 0); + el_set(e, EL_BIND, dest, name, NULL); + return 0; +} + +void +rl_callback_read_char(void) +{ + int count = 0, done = 0; + const char *buf = el_gets(e, &count); + char *wbuf; + + if (buf == NULL || count-- <= 0) + return; + if (count == 0 && buf[0] == e->el_tty.t_c[TS_IO][C_EOF]) + done = 1; + if (buf[count] == '\n' || buf[count] == '\r') + done = 2; + + if (done && rl_linefunc != NULL) { + el_set(e, EL_UNBUFFERED, 0); + if (done == 2) { + if ((wbuf = strdup(buf)) != NULL) + wbuf[count] = '\0'; + } else + wbuf = NULL; + (*(void (*)(const char *))rl_linefunc)(wbuf); + el_set(e, EL_UNBUFFERED, 1); + } +} + +void +rl_callback_handler_install(const char *prompt, rl_vcpfunc_t *linefunc) +{ + if (e == NULL) { + rl_initialize(); + } + (void)rl_set_prompt(prompt); + rl_linefunc = linefunc; + el_set(e, EL_UNBUFFERED, 1); +} + +void +rl_callback_handler_remove(void) +{ + el_set(e, EL_UNBUFFERED, 0); + rl_linefunc = NULL; +} + +void +rl_redisplay(void) +{ + char a[2]; + a[0] = (char)e->el_tty.t_c[TS_IO][C_REPRINT]; + a[1] = '\0'; + el_push(e, a); +} + +int +rl_get_previous_history(int count, int key) +{ + char a[2]; + a[0] = (char)key; + a[1] = '\0'; + while (count--) + el_push(e, a); + return 0; +} + +void +/*ARGSUSED*/ +rl_prep_terminal(int meta_flag __attribute__((__unused__))) +{ + el_set(e, EL_PREP_TERM, 1); +} + +void +rl_deprep_terminal(void) +{ + el_set(e, EL_PREP_TERM, 0); +} + +int +rl_read_init_file(const char *s) +{ + return el_source(e, s); +} + +int +rl_parse_and_bind(const char *line) +{ + const char **argv; + int argc; + Tokenizer *tok; + + tok = tok_init(NULL); + tok_str(tok, line, &argc, &argv); + argc = el_parse(e, argc, argv); + tok_end(tok); + return argc ? 1 : 0; +} + +int +rl_variable_bind(const char *var, const char *value) +{ + /* + * The proper return value is undocument, but this is what the + * readline source seems to do. + */ + return el_set(e, EL_BIND, "", var, value, NULL) == -1 ? 1 : 0; +} + +void +rl_stuff_char(int c) +{ + char buf[2]; + + buf[0] = (char)c; + buf[1] = '\0'; + el_insertstr(e, buf); +} + +static int +_rl_event_read_char(EditLine *el, wchar_t *wc) +{ + char ch; + int n; + ssize_t num_read = 0; + + ch = '\0'; + *wc = L'\0'; + while (rl_event_hook) { + + (*rl_event_hook)(); + +#if defined(FIONREAD) + if (ioctl(el->el_infd, FIONREAD, &n) < 0) + return -1; + if (n) + num_read = read(el->el_infd, &ch, (size_t)1); + else + num_read = 0; +#elif defined(F_SETFL) && defined(O_NDELAY) + if ((n = fcntl(el->el_infd, F_GETFL, 0)) < 0) + return -1; + if (fcntl(el->el_infd, F_SETFL, n|O_NDELAY) < 0) + return -1; + num_read = read(el->el_infd, &ch, 1); + if (fcntl(el->el_infd, F_SETFL, n)) + return -1; +#else + /* not non-blocking, but what you gonna do? */ + num_read = read(el->el_infd, &ch, 1); + return -1; +#endif + + if (num_read < 0 && errno == EAGAIN) + continue; + if (num_read == 0) + continue; + break; + } + if (!rl_event_hook) + el_set(el, EL_GETCFN, EL_BUILTIN_GETCFN); + *wc = (wchar_t)ch; + return (int)num_read; +} + +static void +_rl_update_pos(void) +{ + const LineInfo *li = el_line(e); + + rl_point = (int)(li->cursor - li->buffer); + rl_end = (int)(li->lastchar - li->buffer); +} + +void +rl_get_screen_size(int *rows, int *cols) +{ + if (rows) + el_get(e, EL_GETTC, "li", rows, (void *)0); + if (cols) + el_get(e, EL_GETTC, "co", cols, (void *)0); +} + +void +rl_set_screen_size(int rows, int cols) +{ + char buf[64]; + (void)snprintf(buf, sizeof(buf), "%d", rows); + el_set(e, EL_SETTC, "li", buf, NULL); + (void)snprintf(buf, sizeof(buf), "%d", cols); + el_set(e, EL_SETTC, "co", buf, NULL); +} + +char ** +rl_completion_matches(const char *str, rl_compentry_func_t *fun) +{ + size_t len, max, i, j, min; + char **list, *match, *a, *b; + + len = 1; + max = 10; + if ((list = el_malloc(max * sizeof(*list))) == NULL) + return NULL; + + while ((match = (*fun)(str, (int)(len - 1))) != NULL) { + list[len++] = match; + if (len == max) { + char **nl; + max += 10; + if ((nl = el_realloc(list, max * sizeof(*nl))) == NULL) + goto out; + list = nl; + } + } + if (len == 1) + goto out; + list[len] = NULL; + if (len == 2) { + if ((list[0] = strdup(list[1])) == NULL) + goto out; + return list; + } + qsort(&list[1], len - 1, sizeof(*list), + (int (*)(const void *, const void *)) strcmp); + min = SIZE_MAX; + for (i = 1, a = list[i]; i < len - 1; i++, a = b) { + b = list[i + 1]; + for (j = 0; a[j] && a[j] == b[j]; j++) + continue; + if (min > j) + min = j; + } + if (min == 0 && *str) { + if ((list[0] = strdup(str)) == NULL) + goto out; + } else { + if ((list[0] = el_malloc((min + 1) * sizeof(*list[0]))) == NULL) + goto out; + (void)memcpy(list[0], list[1], min); + list[0][min] = '\0'; + } + return list; + +out: + el_free(list); + return NULL; +} + +char * +rl_filename_completion_function (const char *text, int state) +{ + return fn_filename_completion_function(text, state); +} + +void +rl_forced_update_display(void) +{ + el_set(e, EL_REFRESH); +} + +int +_rl_abort_internal(void) +{ + el_beep(e); + longjmp(topbuf, 1); + /*NOTREACHED*/ +} + +int +_rl_qsort_string_compare(char **s1, char **s2) +{ + return strcoll(*s1, *s2); +} + +HISTORY_STATE * +history_get_history_state(void) +{ + HISTORY_STATE *hs; + + if ((hs = el_malloc(sizeof(*hs))) == NULL) + return NULL; + hs->length = history_length; + return hs; +} + +int +/*ARGSUSED*/ +rl_kill_text(int from __attribute__((__unused__)), + int to __attribute__((__unused__))) +{ + return 0; +} + +Keymap +rl_make_bare_keymap(void) +{ + return NULL; +} + +Keymap +rl_get_keymap(void) +{ + return NULL; +} + +void +/*ARGSUSED*/ +rl_set_keymap(Keymap k __attribute__((__unused__))) +{ +} + +int +/*ARGSUSED*/ +rl_generic_bind(int type __attribute__((__unused__)), + const char * keyseq __attribute__((__unused__)), + const char * data __attribute__((__unused__)), + Keymap k __attribute__((__unused__))) +{ + return 0; +} + +int +/*ARGSUSED*/ +rl_bind_key_in_map(int key __attribute__((__unused__)), + rl_command_func_t *fun __attribute__((__unused__)), + Keymap k __attribute__((__unused__))) +{ + return 0; +} + +/* unsupported, but needed by python */ +void +rl_cleanup_after_signal(void) +{ +} + +int +rl_on_new_line(void) +{ + return 0; +} + +void +rl_free_line_state(void) +{ +} + +int +/*ARGSUSED*/ +rl_set_keyboard_input_timeout(int u __attribute__((__unused__))) +{ + return 0; +} diff --git a/crypto/heimdal/lib/libedit/src/readline/readline.h b/crypto/heimdal/lib/libedit/src/readline/readline.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/readline/readline.h @@ -0,0 +1,227 @@ +/* $NetBSD: readline.h,v 1.41 2016/10/28 18:32:35 christos Exp $ */ + +/*- + * Copyright (c) 1997 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jaromir Dolecek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _READLINE_H_ +#define _READLINE_H_ + +#include +#include + +/* list of readline stuff supported by editline library's readline wrapper */ + +/* typedefs */ +typedef int Function(const char *, int); +typedef void VFunction(void); +typedef void rl_vcpfunc_t(char *); +typedef char **rl_completion_func_t(const char *, int, int); +typedef char *rl_compentry_func_t(const char *, int); +typedef int rl_command_func_t(int, int); + +/* only supports length */ +typedef struct { + int length; +} HISTORY_STATE; + +typedef void *histdata_t; + +typedef struct _hist_entry { + const char *line; + histdata_t data; +} HIST_ENTRY; + +typedef struct _keymap_entry { + char type; +#define ISFUNC 0 +#define ISKMAP 1 +#define ISMACR 2 + Function *function; +} KEYMAP_ENTRY; + +#define KEYMAP_SIZE 256 + +typedef KEYMAP_ENTRY KEYMAP_ENTRY_ARRAY[KEYMAP_SIZE]; +typedef KEYMAP_ENTRY *Keymap; + +#define control_character_threshold 0x20 +#define control_character_bit 0x40 + +#ifndef CTRL +#include +#if !defined(__sun) && !defined(__hpux) && !defined(_AIX) && !defined(_CYGWIN_) +#include +#endif +#ifndef CTRL +#define CTRL(c) ((c) & 037) +#endif +#endif +#ifndef UNCTRL +#define UNCTRL(c) (((c) - 'a' + 'A')|control_character_bit) +#endif + +#define RUBOUT 0x7f +#define ABORT_CHAR CTRL('G') +#define RL_READLINE_VERSION 0x0402 +#define RL_PROMPT_START_IGNORE '\1' +#define RL_PROMPT_END_IGNORE '\2' + +/* global variables used by readline enabled applications */ +#ifdef __cplusplus +extern "C" { +#endif +extern const char *rl_library_version; +extern int rl_readline_version; +extern char *rl_readline_name; +extern FILE *rl_instream; +extern FILE *rl_outstream; +extern char *rl_line_buffer; +extern int rl_point, rl_end; +extern int history_base, history_length; +extern int max_input_history; +extern char *rl_basic_word_break_characters; +extern char *rl_completer_word_break_characters; +extern char *rl_completer_quote_characters; +extern rl_compentry_func_t *rl_completion_entry_function; +extern char *(*rl_completion_word_break_hook)(void); +extern rl_completion_func_t *rl_attempted_completion_function; +extern int rl_attempted_completion_over; +extern int rl_completion_type; +extern int rl_completion_query_items; +extern char *rl_special_prefixes; +extern int rl_completion_append_character; +extern int rl_inhibit_completion; +extern Function *rl_pre_input_hook; +extern Function *rl_startup_hook; +extern char *rl_terminal_name; +extern int rl_already_prompted; +extern char *rl_prompt; +extern int rl_done; +/* + * The following is not implemented + */ +extern int rl_catch_signals; +extern int rl_catch_sigwinch; +extern KEYMAP_ENTRY_ARRAY emacs_standard_keymap, + emacs_meta_keymap, + emacs_ctlx_keymap; +extern int rl_filename_completion_desired; +extern int rl_ignore_completion_duplicates; +extern int (*rl_getc_function)(FILE *); +extern VFunction *rl_redisplay_function; +extern VFunction *rl_completion_display_matches_hook; +extern VFunction *rl_prep_term_function; +extern VFunction *rl_deprep_term_function; +extern int readline_echoing_p; +extern int _rl_print_completions_horizontally; + +/* supported functions */ +char *readline(const char *); +int rl_initialize(void); + +void using_history(void); +int add_history(const char *); +void clear_history(void); +void stifle_history(int); +int unstifle_history(void); +int history_is_stifled(void); +int where_history(void); +HIST_ENTRY *current_history(void); +HIST_ENTRY *history_get(int); +HIST_ENTRY *remove_history(int); +HIST_ENTRY *replace_history_entry(int, const char *, histdata_t); +int history_total_bytes(void); +int history_set_pos(int); +HIST_ENTRY *previous_history(void); +HIST_ENTRY *next_history(void); +HIST_ENTRY **history_list(void); +int history_search(const char *, int); +int history_search_prefix(const char *, int); +int history_search_pos(const char *, int, int); +int read_history(const char *); +int write_history(const char *); +int history_truncate_file (const char *, int); +int history_expand(char *, char **); +char **history_tokenize(const char *); +const char *get_history_event(const char *, int *, int); +char *history_arg_extract(int, int, const char *); + +char *tilde_expand(char *); +char *filename_completion_function(const char *, int); +char *username_completion_function(const char *, int); +int rl_complete(int, int); +int rl_read_key(void); +char **completion_matches(const char *, rl_compentry_func_t *); +void rl_display_match_list(char **, int, int); + +int rl_insert(int, int); +int rl_insert_text(const char *); +void rl_reset_terminal(const char *); +int rl_bind_key(int, rl_command_func_t *); +int rl_newline(int, int); +void rl_callback_read_char(void); +void rl_callback_handler_install(const char *, rl_vcpfunc_t *); +void rl_callback_handler_remove(void); +void rl_redisplay(void); +int rl_get_previous_history(int, int); +void rl_prep_terminal(int); +void rl_deprep_terminal(void); +int rl_read_init_file(const char *); +int rl_parse_and_bind(const char *); +int rl_variable_bind(const char *, const char *); +void rl_stuff_char(int); +int rl_add_defun(const char *, rl_command_func_t *, int); +HISTORY_STATE *history_get_history_state(void); +void rl_get_screen_size(int *, int *); +void rl_set_screen_size(int, int); +char *rl_filename_completion_function (const char *, int); +int _rl_abort_internal(void); +int _rl_qsort_string_compare(char **, char **); +char **rl_completion_matches(const char *, rl_compentry_func_t *); +void rl_forced_update_display(void); +int rl_set_prompt(const char *); +int rl_on_new_line(void); + +/* + * The following are not implemented + */ +int rl_kill_text(int, int); +Keymap rl_get_keymap(void); +void rl_set_keymap(Keymap); +Keymap rl_make_bare_keymap(void); +int rl_generic_bind(int, const char *, const char *, Keymap); +int rl_bind_key_in_map(int, rl_command_func_t *, Keymap); +void rl_cleanup_after_signal(void); +void rl_free_line_state(void); +int rl_set_keyboard_input_timeout(int); + +#ifdef __cplusplus +} +#endif + +#endif /* _READLINE_H_ */ diff --git a/crypto/heimdal/lib/libedit/src/refresh.h b/crypto/heimdal/lib/libedit/src/refresh.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/refresh.h @@ -0,0 +1,57 @@ +/* $NetBSD: refresh.h,v 1.10 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)refresh.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.refresh.h: Screen refresh functions + */ +#ifndef _h_el_refresh +#define _h_el_refresh + +typedef struct { + coord_t r_cursor; /* Refresh cursor position */ + int r_oldcv; /* Vertical locations */ + int r_newcv; +} el_refresh_t; + +libedit_private void re_putc(EditLine *, wint_t, int); +libedit_private void re_clear_lines(EditLine *); +libedit_private void re_clear_display(EditLine *); +libedit_private void re_refresh(EditLine *); +libedit_private void re_refresh_cursor(EditLine *); +libedit_private void re_fastaddc(EditLine *); +libedit_private void re_goto_bottom(EditLine *); + +#endif /* _h_el_refresh */ diff --git a/crypto/heimdal/lib/libedit/src/refresh.c b/crypto/heimdal/lib/libedit/src/refresh.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/refresh.c @@ -0,0 +1,1187 @@ +/* $NetBSD: refresh.c,v 1.51 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: refresh.c,v 1.51 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * refresh.c: Lower level screen refreshing functions + */ +#include +#include +#include + +#include "el.h" + +static void re_nextline(EditLine *); +static void re_addc(EditLine *, wint_t); +static void re_update_line(EditLine *, wchar_t *, wchar_t *, int); +static void re_insert (EditLine *, wchar_t *, int, int, wchar_t *, int); +static void re_delete(EditLine *, wchar_t *, int, int, int); +static void re_fastputc(EditLine *, wint_t); +static void re_clear_eol(EditLine *, int, int, int); +static void re__strncopy(wchar_t *, wchar_t *, size_t); +static void re__copy_and_pad(wchar_t *, const wchar_t *, size_t); + +#ifdef DEBUG_REFRESH +static void re_printstr(EditLine *, const char *, wchar_t *, wchar_t *); +#define __F el->el_errfile +#define ELRE_ASSERT(a, b, c) do \ + if (/*CONSTCOND*/ a) { \ + (void) fprintf b; \ + c; \ + } \ + while (/*CONSTCOND*/0) +#define ELRE_DEBUG(a, b) ELRE_ASSERT(a,b,;) + +/* re_printstr(): + * Print a string on the debugging pty + */ +static void +re_printstr(EditLine *el, const char *str, wchar_t *f, wchar_t *t) +{ + + ELRE_DEBUG(1, (__F, "%s:\"", str)); + while (f < t) + ELRE_DEBUG(1, (__F, "%c", *f++ & 0177)); + ELRE_DEBUG(1, (__F, "\"\r\n")); +} +#else +#define ELRE_ASSERT(a, b, c) +#define ELRE_DEBUG(a, b) +#endif + +/* re_nextline(): + * Move to the next line or scroll + */ +static void +re_nextline(EditLine *el) +{ + el->el_refresh.r_cursor.h = 0; /* reset it. */ + + /* + * If we would overflow (input is longer than terminal size), + * emulate scroll by dropping first line and shuffling the rest. + * We do this via pointer shuffling - it's safe in this case + * and we avoid memcpy(). + */ + if (el->el_refresh.r_cursor.v + 1 >= el->el_terminal.t_size.v) { + int i, lins = el->el_terminal.t_size.v; + wchar_t *firstline = el->el_vdisplay[0]; + + for(i = 1; i < lins; i++) + el->el_vdisplay[i - 1] = el->el_vdisplay[i]; + + firstline[0] = '\0'; /* empty the string */ + el->el_vdisplay[i - 1] = firstline; + } else + el->el_refresh.r_cursor.v++; + + ELRE_ASSERT(el->el_refresh.r_cursor.v >= el->el_terminal.t_size.v, + (__F, "\r\nre_putc: overflow! r_cursor.v == %d > %d\r\n", + el->el_refresh.r_cursor.v, el->el_terminal.t_size.v), + abort()); +} + +/* re_addc(): + * Draw c, expanding tabs, control chars etc. + */ +static void +re_addc(EditLine *el, wint_t c) +{ + switch (ct_chr_class(c)) { + case CHTYPE_TAB: /* expand the tab */ + for (;;) { + re_putc(el, ' ', 1); + if ((el->el_refresh.r_cursor.h & 07) == 0) + break; /* go until tab stop */ + } + break; + case CHTYPE_NL: { + int oldv = el->el_refresh.r_cursor.v; + re_putc(el, '\0', 0); /* assure end of line */ + if (oldv == el->el_refresh.r_cursor.v) /* XXX */ + re_nextline(el); + break; + } + case CHTYPE_PRINT: + re_putc(el, c, 1); + break; + default: { + wchar_t visbuf[VISUAL_WIDTH_MAX]; + ssize_t i, n = + ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c); + for (i = 0; n-- > 0; ++i) + re_putc(el, visbuf[i], 1); + break; + } + } +} + + +/* re_putc(): + * Draw the character given + */ +libedit_private void +re_putc(EditLine *el, wint_t c, int shift) +{ + int i, w = wcwidth(c); + ELRE_DEBUG(1, (__F, "printing %5x '%lc'\r\n", c, c)); + if (w == -1) + w = 0; + + while (shift && (el->el_refresh.r_cursor.h + w > el->el_terminal.t_size.h)) + re_putc(el, ' ', 1); + + el->el_vdisplay[el->el_refresh.r_cursor.v] + [el->el_refresh.r_cursor.h] = c; + /* assumes !shift is only used for single-column chars */ + i = w; + while (--i > 0) + el->el_vdisplay[el->el_refresh.r_cursor.v] + [el->el_refresh.r_cursor.h + i] = MB_FILL_CHAR; + + if (!shift) + return; + + el->el_refresh.r_cursor.h += w; /* advance to next place */ + if (el->el_refresh.r_cursor.h >= el->el_terminal.t_size.h) { + /* assure end of line */ + el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_terminal.t_size.h] + = '\0'; + re_nextline(el); + } +} + + +/* re_refresh(): + * draws the new virtual screen image from the current input + * line, then goes line-by-line changing the real image to the new + * virtual image. The routine to re-draw a line can be replaced + * easily in hopes of a smarter one being placed there. + */ +libedit_private void +re_refresh(EditLine *el) +{ + int i, rhdiff; + wchar_t *cp, *st; + coord_t cur; +#ifdef notyet + size_t termsz; +#endif + + ELRE_DEBUG(1, (__F, "el->el_line.buffer = :%ls:\r\n", + el->el_line.buffer)); + + /* reset the Drawing cursor */ + el->el_refresh.r_cursor.h = 0; + el->el_refresh.r_cursor.v = 0; + + /* temporarily draw rprompt to calculate its size */ + prompt_print(el, EL_RPROMPT); + + /* reset the Drawing cursor */ + el->el_refresh.r_cursor.h = 0; + el->el_refresh.r_cursor.v = 0; + + if (el->el_line.cursor >= el->el_line.lastchar) { + if (el->el_map.current == el->el_map.alt + && el->el_line.lastchar != el->el_line.buffer) + el->el_line.cursor = el->el_line.lastchar - 1; + else + el->el_line.cursor = el->el_line.lastchar; + } + + cur.h = -1; /* set flag in case I'm not set */ + cur.v = 0; + + prompt_print(el, EL_PROMPT); + + /* draw the current input buffer */ +#if notyet + termsz = el->el_terminal.t_size.h * el->el_terminal.t_size.v; + if (el->el_line.lastchar - el->el_line.buffer > termsz) { + /* + * If line is longer than terminal, process only part + * of line which would influence display. + */ + size_t rem = (el->el_line.lastchar-el->el_line.buffer)%termsz; + + st = el->el_line.lastchar - rem + - (termsz - (((rem / el->el_terminal.t_size.v) - 1) + * el->el_terminal.t_size.v)); + } else +#endif + st = el->el_line.buffer; + + for (cp = st; cp < el->el_line.lastchar; cp++) { + if (cp == el->el_line.cursor) { + int w = wcwidth(*cp); + /* save for later */ + cur.h = el->el_refresh.r_cursor.h; + cur.v = el->el_refresh.r_cursor.v; + /* handle being at a linebroken doublewidth char */ + if (w > 1 && el->el_refresh.r_cursor.h + w > + el->el_terminal.t_size.h) { + cur.h = 0; + cur.v++; + } + } + re_addc(el, *cp); + } + + if (cur.h == -1) { /* if I haven't been set yet, I'm at the end */ + cur.h = el->el_refresh.r_cursor.h; + cur.v = el->el_refresh.r_cursor.v; + } + rhdiff = el->el_terminal.t_size.h - el->el_refresh.r_cursor.h - + el->el_rprompt.p_pos.h; + if (el->el_rprompt.p_pos.h && !el->el_rprompt.p_pos.v && + !el->el_refresh.r_cursor.v && rhdiff > 1) { + /* + * have a right-hand side prompt that will fit + * on the end of the first line with at least + * one character gap to the input buffer. + */ + while (--rhdiff > 0) /* pad out with spaces */ + re_putc(el, ' ', 1); + prompt_print(el, EL_RPROMPT); + } else { + el->el_rprompt.p_pos.h = 0; /* flag "not using rprompt" */ + el->el_rprompt.p_pos.v = 0; + } + + re_putc(el, '\0', 0); /* make line ended with NUL, no cursor shift */ + + el->el_refresh.r_newcv = el->el_refresh.r_cursor.v; + + ELRE_DEBUG(1, (__F, + "term.h=%d vcur.h=%d vcur.v=%d vdisplay[0]=\r\n:%80.80s:\r\n", + el->el_terminal.t_size.h, el->el_refresh.r_cursor.h, + el->el_refresh.r_cursor.v, ct_encode_string(el->el_vdisplay[0], + &el->el_scratch))); + + ELRE_DEBUG(1, (__F, "updating %d lines.\r\n", el->el_refresh.r_newcv)); + for (i = 0; i <= el->el_refresh.r_newcv; i++) { + /* NOTE THAT re_update_line MAY CHANGE el_display[i] */ + re_update_line(el, el->el_display[i], el->el_vdisplay[i], i); + + /* + * Copy the new line to be the current one, and pad out with + * spaces to the full width of the terminal so that if we try + * moving the cursor by writing the character that is at the + * end of the screen line, it won't be a NUL or some old + * leftover stuff. + */ + re__copy_and_pad(el->el_display[i], el->el_vdisplay[i], + (size_t) el->el_terminal.t_size.h); + } + ELRE_DEBUG(1, (__F, + "\r\nel->el_refresh.r_cursor.v=%d,el->el_refresh.r_oldcv=%d i=%d\r\n", + el->el_refresh.r_cursor.v, el->el_refresh.r_oldcv, i)); + + if (el->el_refresh.r_oldcv > el->el_refresh.r_newcv) + for (; i <= el->el_refresh.r_oldcv; i++) { + terminal_move_to_line(el, i); + terminal_move_to_char(el, 0); + /* This wcslen should be safe even with MB_FILL_CHARs */ + terminal_clear_EOL(el, (int) wcslen(el->el_display[i])); +#ifdef DEBUG_REFRESH + terminal_overwrite(el, L"C\b", 2); +#endif /* DEBUG_REFRESH */ + el->el_display[i][0] = '\0'; + } + + el->el_refresh.r_oldcv = el->el_refresh.r_newcv; /* set for next time */ + ELRE_DEBUG(1, (__F, + "\r\ncursor.h = %d, cursor.v = %d, cur.h = %d, cur.v = %d\r\n", + el->el_refresh.r_cursor.h, el->el_refresh.r_cursor.v, + cur.h, cur.v)); + terminal_move_to_line(el, cur.v); /* go to where the cursor is */ + terminal_move_to_char(el, cur.h); +} + + +/* re_goto_bottom(): + * used to go to last used screen line + */ +libedit_private void +re_goto_bottom(EditLine *el) +{ + + terminal_move_to_line(el, el->el_refresh.r_oldcv); + terminal__putc(el, '\n'); + re_clear_display(el); + terminal__flush(el); +} + + +/* re_insert(): + * insert num characters of s into d (in front of the character) + * at dat, maximum length of d is dlen + */ +static void +/*ARGSUSED*/ +re_insert(EditLine *el __attribute__((__unused__)), + wchar_t *d, int dat, int dlen, wchar_t *s, int num) +{ + wchar_t *a, *b; + + if (num <= 0) + return; + if (num > dlen - dat) + num = dlen - dat; + + ELRE_DEBUG(1, + (__F, "re_insert() starting: %d at %d max %d, d == \"%s\"\n", + num, dat, dlen, ct_encode_string(d, &el->el_scratch))); + ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s, + &el->el_scratch))); + + /* open up the space for num chars */ + if (num > 0) { + b = d + dlen - 1; + a = b - num; + while (a >= &d[dat]) + *b-- = *a--; + d[dlen] = '\0'; /* just in case */ + } + + ELRE_DEBUG(1, (__F, + "re_insert() after insert: %d at %d max %d, d == \"%s\"\n", + num, dat, dlen, ct_encode_string(d, &el->el_scratch))); + ELRE_DEBUG(1, (__F, "s == \"%s\"\n", ct_encode_string(s, + &el->el_scratch))); + + /* copy the characters */ + for (a = d + dat; (a < d + dlen) && (num > 0); num--) + *a++ = *s++; + +#ifdef notyet + /* ct_encode_string() uses a static buffer, so we can't conveniently + * encode both d & s here */ + ELRE_DEBUG(1, + (__F, "re_insert() after copy: %d at %d max %d, %s == \"%s\"\n", + num, dat, dlen, d, s)); + ELRE_DEBUG(1, (__F, "s == \"%s\"\n", s)); +#endif +} + + +/* re_delete(): + * delete num characters d at dat, maximum length of d is dlen + */ +static void +/*ARGSUSED*/ +re_delete(EditLine *el __attribute__((__unused__)), + wchar_t *d, int dat, int dlen, int num) +{ + wchar_t *a, *b; + + if (num <= 0) + return; + if (dat + num >= dlen) { + d[dat] = '\0'; + return; + } + ELRE_DEBUG(1, + (__F, "re_delete() starting: %d at %d max %d, d == \"%s\"\n", + num, dat, dlen, ct_encode_string(d, &el->el_scratch))); + + /* open up the space for num chars */ + if (num > 0) { + b = d + dat; + a = b + num; + while (a < &d[dlen]) + *b++ = *a++; + d[dlen] = '\0'; /* just in case */ + } + ELRE_DEBUG(1, + (__F, "re_delete() after delete: %d at %d max %d, d == \"%s\"\n", + num, dat, dlen, ct_encode_string(d, &el->el_scratch))); +} + + +/* re__strncopy(): + * Like strncpy without padding. + */ +static void +re__strncopy(wchar_t *a, wchar_t *b, size_t n) +{ + + while (n-- && *b) + *a++ = *b++; +} + +/* re_clear_eol(): + * Find the number of characters we need to clear till the end of line + * in order to make sure that we have cleared the previous contents of + * the line. fx and sx is the number of characters inserted or deleted + * in the first or second diff, diff is the difference between the + * number of characters between the new and old line. + */ +static void +re_clear_eol(EditLine *el, int fx, int sx, int diff) +{ + + ELRE_DEBUG(1, (__F, "re_clear_eol sx %d, fx %d, diff %d\n", + sx, fx, diff)); + + if (fx < 0) + fx = -fx; + if (sx < 0) + sx = -sx; + if (fx > diff) + diff = fx; + if (sx > diff) + diff = sx; + + ELRE_DEBUG(1, (__F, "re_clear_eol %d\n", diff)); + terminal_clear_EOL(el, diff); +} + +/***************************************************************** + re_update_line() is based on finding the middle difference of each line + on the screen; vis: + + /old first difference + /beginning of line | /old last same /old EOL + v v v v +old: eddie> Oh, my little gruntle-buggy is to me, as lurgid as +new: eddie> Oh, my little buggy says to me, as lurgid as + ^ ^ ^ ^ + \beginning of line | \new last same \new end of line + \new first difference + + all are character pointers for the sake of speed. Special cases for + no differences, as well as for end of line additions must be handled. +**************************************************************** */ + +/* Minimum at which doing an insert it "worth it". This should be about + * half the "cost" of going into insert mode, inserting a character, and + * going back out. This should really be calculated from the termcap + * data... For the moment, a good number for ANSI terminals. + */ +#define MIN_END_KEEP 4 + +static void +re_update_line(EditLine *el, wchar_t *old, wchar_t *new, int i) +{ + wchar_t *o, *n, *p, c; + wchar_t *ofd, *ols, *oe, *nfd, *nls, *ne; + wchar_t *osb, *ose, *nsb, *nse; + int fx, sx; + size_t len; + + /* + * find first diff + */ + for (o = old, n = new; *o && (*o == *n); o++, n++) + continue; + ofd = o; + nfd = n; + + /* + * Find the end of both old and new + */ + while (*o) + o++; + /* + * Remove any trailing blanks off of the end, being careful not to + * back up past the beginning. + */ + while (ofd < o) { + if (o[-1] != ' ') + break; + o--; + } + oe = o; + *oe = '\0'; + + while (*n) + n++; + + /* remove blanks from end of new */ + while (nfd < n) { + if (n[-1] != ' ') + break; + n--; + } + ne = n; + *ne = '\0'; + + /* + * if no diff, continue to next line of redraw + */ + if (*ofd == '\0' && *nfd == '\0') { + ELRE_DEBUG(1, (__F, "no difference.\r\n")); + return; + } + /* + * find last same pointer + */ + while ((o > ofd) && (n > nfd) && (*--o == *--n)) + continue; + ols = ++o; + nls = ++n; + + /* + * find same beginning and same end + */ + osb = ols; + nsb = nls; + ose = ols; + nse = nls; + + /* + * case 1: insert: scan from nfd to nls looking for *ofd + */ + if (*ofd) { + for (c = *ofd, n = nfd; n < nls; n++) { + if (c == *n) { + for (o = ofd, p = n; + p < nls && o < ols && *o == *p; + o++, p++) + continue; + /* + * if the new match is longer and it's worth + * keeping, then we take it + */ + if (((nse - nsb) < (p - n)) && + (2 * (p - n) > n - nfd)) { + nsb = n; + nse = p; + osb = ofd; + ose = o; + } + } + } + } + /* + * case 2: delete: scan from ofd to ols looking for *nfd + */ + if (*nfd) { + for (c = *nfd, o = ofd; o < ols; o++) { + if (c == *o) { + for (n = nfd, p = o; + p < ols && n < nls && *p == *n; + p++, n++) + continue; + /* + * if the new match is longer and it's worth + * keeping, then we take it + */ + if (((ose - osb) < (p - o)) && + (2 * (p - o) > o - ofd)) { + nsb = nfd; + nse = n; + osb = o; + ose = p; + } + } + } + } + /* + * Pragmatics I: If old trailing whitespace or not enough characters to + * save to be worth it, then don't save the last same info. + */ + if ((oe - ols) < MIN_END_KEEP) { + ols = oe; + nls = ne; + } + /* + * Pragmatics II: if the terminal isn't smart enough, make the data + * dumber so the smart update doesn't try anything fancy + */ + + /* + * fx is the number of characters we need to insert/delete: in the + * beginning to bring the two same begins together + */ + fx = (int)((nsb - nfd) - (osb - ofd)); + /* + * sx is the number of characters we need to insert/delete: in the + * end to bring the two same last parts together + */ + sx = (int)((nls - nse) - (ols - ose)); + + if (!EL_CAN_INSERT) { + if (fx > 0) { + osb = ols; + ose = ols; + nsb = nls; + nse = nls; + } + if (sx > 0) { + ols = oe; + nls = ne; + } + if ((ols - ofd) < (nls - nfd)) { + ols = oe; + nls = ne; + } + } + if (!EL_CAN_DELETE) { + if (fx < 0) { + osb = ols; + ose = ols; + nsb = nls; + nse = nls; + } + if (sx < 0) { + ols = oe; + nls = ne; + } + if ((ols - ofd) > (nls - nfd)) { + ols = oe; + nls = ne; + } + } + /* + * Pragmatics III: make sure the middle shifted pointers are correct if + * they don't point to anything (we may have moved ols or nls). + */ + /* if the change isn't worth it, don't bother */ + /* was: if (osb == ose) */ + if ((ose - osb) < MIN_END_KEEP) { + osb = ols; + ose = ols; + nsb = nls; + nse = nls; + } + /* + * Now that we are done with pragmatics we recompute fx, sx + */ + fx = (int)((nsb - nfd) - (osb - ofd)); + sx = (int)((nls - nse) - (ols - ose)); + + ELRE_DEBUG(1, (__F, "fx %d, sx %d\n", fx, sx)); + ELRE_DEBUG(1, (__F, "ofd %td, osb %td, ose %td, ols %td, oe %td\n", + ofd - old, osb - old, ose - old, ols - old, oe - old)); + ELRE_DEBUG(1, (__F, "nfd %td, nsb %td, nse %td, nls %td, ne %td\n", + nfd - new, nsb - new, nse - new, nls - new, ne - new)); + ELRE_DEBUG(1, (__F, + "xxx-xxx:\"00000000001111111111222222222233333333334\"\r\n")); + ELRE_DEBUG(1, (__F, + "xxx-xxx:\"01234567890123456789012345678901234567890\"\r\n")); +#ifdef DEBUG_REFRESH + re_printstr(el, "old- oe", old, oe); + re_printstr(el, "new- ne", new, ne); + re_printstr(el, "old-ofd", old, ofd); + re_printstr(el, "new-nfd", new, nfd); + re_printstr(el, "ofd-osb", ofd, osb); + re_printstr(el, "nfd-nsb", nfd, nsb); + re_printstr(el, "osb-ose", osb, ose); + re_printstr(el, "nsb-nse", nsb, nse); + re_printstr(el, "ose-ols", ose, ols); + re_printstr(el, "nse-nls", nse, nls); + re_printstr(el, "ols- oe", ols, oe); + re_printstr(el, "nls- ne", nls, ne); +#endif /* DEBUG_REFRESH */ + + /* + * el_cursor.v to this line i MUST be in this routine so that if we + * don't have to change the line, we don't move to it. el_cursor.h to + * first diff char + */ + terminal_move_to_line(el, i); + + /* + * at this point we have something like this: + * + * /old /ofd /osb /ose /ols /oe + * v.....................v v..................v v........v + * eddie> Oh, my fredded gruntle-buggy is to me, as foo var lurgid as + * eddie> Oh, my fredded quiux buggy is to me, as gruntle-lurgid as + * ^.....................^ ^..................^ ^........^ + * \new \nfd \nsb \nse \nls \ne + * + * fx is the difference in length between the chars between nfd and + * nsb, and the chars between ofd and osb, and is thus the number of + * characters to delete if < 0 (new is shorter than old, as above), + * or insert (new is longer than short). + * + * sx is the same for the second differences. + */ + + /* + * if we have a net insert on the first difference, AND inserting the + * net amount ((nsb-nfd) - (osb-ofd)) won't push the last useful + * character (which is ne if nls != ne, otherwise is nse) off the edge + * of the screen (el->el_terminal.t_size.h) else we do the deletes first + * so that we keep everything we need to. + */ + + /* + * if the last same is the same like the end, there is no last same + * part, otherwise we want to keep the last same part set p to the + * last useful old character + */ + p = (ols != oe) ? oe : ose; + + /* + * if (There is a diffence in the beginning) && (we need to insert + * characters) && (the number of characters to insert is less than + * the term width) + * We need to do an insert! + * else if (we need to delete characters) + * We need to delete characters! + * else + * No insert or delete + */ + if ((nsb != nfd) && fx > 0 && + ((p - old) + fx <= el->el_terminal.t_size.h)) { + ELRE_DEBUG(1, + (__F, "first diff insert at %td...\r\n", nfd - new)); + /* + * Move to the first char to insert, where the first diff is. + */ + terminal_move_to_char(el, (int)(nfd - new)); + /* + * Check if we have stuff to keep at end + */ + if (nsb != ne) { + ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n")); + /* + * insert fx chars of new starting at nfd + */ + if (fx > 0) { + ELRE_DEBUG(!EL_CAN_INSERT, (__F, + "ERROR: cannot insert in early first diff\n")); + terminal_insertwrite(el, nfd, fx); + re_insert(el, old, (int)(ofd - old), + el->el_terminal.t_size.h, nfd, fx); + } + /* + * write (nsb-nfd) - fx chars of new starting at + * (nfd + fx) + */ + len = (size_t) ((nsb - nfd) - fx); + terminal_overwrite(el, (nfd + fx), len); + re__strncopy(ofd + fx, nfd + fx, len); + } else { + ELRE_DEBUG(1, (__F, "without anything to save\r\n")); + len = (size_t)(nsb - nfd); + terminal_overwrite(el, nfd, len); + re__strncopy(ofd, nfd, len); + /* + * Done + */ + return; + } + } else if (fx < 0) { + ELRE_DEBUG(1, + (__F, "first diff delete at %td...\r\n", ofd - old)); + /* + * move to the first char to delete where the first diff is + */ + terminal_move_to_char(el, (int)(ofd - old)); + /* + * Check if we have stuff to save + */ + if (osb != oe) { + ELRE_DEBUG(1, (__F, "with stuff to save at end\r\n")); + /* + * fx is less than zero *always* here but we check + * for code symmetry + */ + if (fx < 0) { + ELRE_DEBUG(!EL_CAN_DELETE, (__F, + "ERROR: cannot delete in first diff\n")); + terminal_deletechars(el, -fx); + re_delete(el, old, (int)(ofd - old), + el->el_terminal.t_size.h, -fx); + } + /* + * write (nsb-nfd) chars of new starting at nfd + */ + len = (size_t) (nsb - nfd); + terminal_overwrite(el, nfd, len); + re__strncopy(ofd, nfd, len); + + } else { + ELRE_DEBUG(1, (__F, + "but with nothing left to save\r\n")); + /* + * write (nsb-nfd) chars of new starting at nfd + */ + terminal_overwrite(el, nfd, (size_t)(nsb - nfd)); + re_clear_eol(el, fx, sx, + (int)((oe - old) - (ne - new))); + /* + * Done + */ + return; + } + } else + fx = 0; + + if (sx < 0 && (ose - old) + fx < el->el_terminal.t_size.h) { + ELRE_DEBUG(1, (__F, + "second diff delete at %td...\r\n", (ose - old) + fx)); + /* + * Check if we have stuff to delete + */ + /* + * fx is the number of characters inserted (+) or deleted (-) + */ + + terminal_move_to_char(el, (int)((ose - old) + fx)); + /* + * Check if we have stuff to save + */ + if (ols != oe) { + ELRE_DEBUG(1, (__F, "with stuff to save at end\r\n")); + /* + * Again a duplicate test. + */ + if (sx < 0) { + ELRE_DEBUG(!EL_CAN_DELETE, (__F, + "ERROR: cannot delete in second diff\n")); + terminal_deletechars(el, -sx); + } + /* + * write (nls-nse) chars of new starting at nse + */ + terminal_overwrite(el, nse, (size_t)(nls - nse)); + } else { + ELRE_DEBUG(1, (__F, + "but with nothing left to save\r\n")); + terminal_overwrite(el, nse, (size_t)(nls - nse)); + re_clear_eol(el, fx, sx, + (int)((oe - old) - (ne - new))); + } + } + /* + * if we have a first insert AND WE HAVEN'T ALREADY DONE IT... + */ + if ((nsb != nfd) && (osb - ofd) <= (nsb - nfd) && (fx == 0)) { + ELRE_DEBUG(1, (__F, "late first diff insert at %td...\r\n", + nfd - new)); + + terminal_move_to_char(el, (int)(nfd - new)); + /* + * Check if we have stuff to keep at the end + */ + if (nsb != ne) { + ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n")); + /* + * We have to recalculate fx here because we set it + * to zero above as a flag saying that we hadn't done + * an early first insert. + */ + fx = (int)((nsb - nfd) - (osb - ofd)); + if (fx > 0) { + /* + * insert fx chars of new starting at nfd + */ + ELRE_DEBUG(!EL_CAN_INSERT, (__F, + "ERROR: cannot insert in late first diff\n")); + terminal_insertwrite(el, nfd, fx); + re_insert(el, old, (int)(ofd - old), + el->el_terminal.t_size.h, nfd, fx); + } + /* + * write (nsb-nfd) - fx chars of new starting at + * (nfd + fx) + */ + len = (size_t) ((nsb - nfd) - fx); + terminal_overwrite(el, (nfd + fx), len); + re__strncopy(ofd + fx, nfd + fx, len); + } else { + ELRE_DEBUG(1, (__F, "without anything to save\r\n")); + len = (size_t) (nsb - nfd); + terminal_overwrite(el, nfd, len); + re__strncopy(ofd, nfd, len); + } + } + /* + * line is now NEW up to nse + */ + if (sx >= 0) { + ELRE_DEBUG(1, (__F, + "second diff insert at %d...\r\n", (int)(nse - new))); + terminal_move_to_char(el, (int)(nse - new)); + if (ols != oe) { + ELRE_DEBUG(1, (__F, "with stuff to keep at end\r\n")); + if (sx > 0) { + /* insert sx chars of new starting at nse */ + ELRE_DEBUG(!EL_CAN_INSERT, (__F, + "ERROR: cannot insert in second diff\n")); + terminal_insertwrite(el, nse, sx); + } + /* + * write (nls-nse) - sx chars of new starting at + * (nse + sx) + */ + terminal_overwrite(el, (nse + sx), + (size_t)((nls - nse) - sx)); + } else { + ELRE_DEBUG(1, (__F, "without anything to save\r\n")); + terminal_overwrite(el, nse, (size_t)(nls - nse)); + + /* + * No need to do a clear-to-end here because we were + * doing a second insert, so we will have over + * written all of the old string. + */ + } + } + ELRE_DEBUG(1, (__F, "done.\r\n")); +} + + +/* re__copy_and_pad(): + * Copy string and pad with spaces + */ +static void +re__copy_and_pad(wchar_t *dst, const wchar_t *src, size_t width) +{ + size_t i; + + for (i = 0; i < width; i++) { + if (*src == '\0') + break; + *dst++ = *src++; + } + + for (; i < width; i++) + *dst++ = ' '; + + *dst = '\0'; +} + + +/* re_refresh_cursor(): + * Move to the new cursor position + */ +libedit_private void +re_refresh_cursor(EditLine *el) +{ + wchar_t *cp; + int h, v, th, w; + + if (el->el_line.cursor >= el->el_line.lastchar) { + if (el->el_map.current == el->el_map.alt + && el->el_line.lastchar != el->el_line.buffer) + el->el_line.cursor = el->el_line.lastchar - 1; + else + el->el_line.cursor = el->el_line.lastchar; + } + + /* first we must find where the cursor is... */ + h = el->el_prompt.p_pos.h; + v = el->el_prompt.p_pos.v; + th = el->el_terminal.t_size.h; /* optimize for speed */ + + /* do input buffer to el->el_line.cursor */ + for (cp = el->el_line.buffer; cp < el->el_line.cursor; cp++) { + switch (ct_chr_class(*cp)) { + case CHTYPE_NL: /* handle newline in data part too */ + h = 0; + v++; + break; + case CHTYPE_TAB: /* if a tab, to next tab stop */ + while (++h & 07) + continue; + break; + default: + w = wcwidth(*cp); + if (w > 1 && h + w > th) { /* won't fit on line */ + h = 0; + v++; + } + h += ct_visual_width(*cp); + break; + } + + if (h >= th) { /* check, extra long tabs picked up here also */ + h -= th; + v++; + } + } + /* if we have a next character, and it's a doublewidth one, we need to + * check whether we need to linebreak for it to fit */ + if (cp < el->el_line.lastchar && (w = wcwidth(*cp)) > 1) + if (h + w > th) { + h = 0; + v++; + } + + /* now go there */ + terminal_move_to_line(el, v); + terminal_move_to_char(el, h); + terminal__flush(el); +} + + +/* re_fastputc(): + * Add a character fast. + */ +static void +re_fastputc(EditLine *el, wint_t c) +{ + int w = wcwidth(c); + while (w > 1 && el->el_cursor.h + w > el->el_terminal.t_size.h) + re_fastputc(el, ' '); + + terminal__putc(el, c); + el->el_display[el->el_cursor.v][el->el_cursor.h++] = c; + while (--w > 0) + el->el_display[el->el_cursor.v][el->el_cursor.h++] + = MB_FILL_CHAR; + + if (el->el_cursor.h >= el->el_terminal.t_size.h) { + /* if we must overflow */ + el->el_cursor.h = 0; + + /* + * If we would overflow (input is longer than terminal size), + * emulate scroll by dropping first line and shuffling the rest. + * We do this via pointer shuffling - it's safe in this case + * and we avoid memcpy(). + */ + if (el->el_cursor.v + 1 >= el->el_terminal.t_size.v) { + int i, lins = el->el_terminal.t_size.v; + wchar_t *firstline = el->el_display[0]; + + for(i = 1; i < lins; i++) + el->el_display[i - 1] = el->el_display[i]; + + re__copy_and_pad(firstline, L"", (size_t)0); + el->el_display[i - 1] = firstline; + } else { + el->el_cursor.v++; + el->el_refresh.r_oldcv++; + } + if (EL_HAS_AUTO_MARGINS) { + if (EL_HAS_MAGIC_MARGINS) { + terminal__putc(el, ' '); + terminal__putc(el, '\b'); + } + } else { + terminal__putc(el, '\r'); + terminal__putc(el, '\n'); + } + } +} + + +/* re_fastaddc(): + * we added just one char, handle it fast. + * Assumes that screen cursor == real cursor + */ +libedit_private void +re_fastaddc(EditLine *el) +{ + wchar_t c; + int rhdiff; + + c = el->el_line.cursor[-1]; + + if (c == '\t' || el->el_line.cursor != el->el_line.lastchar) { + re_refresh(el); /* too hard to handle */ + return; + } + rhdiff = el->el_terminal.t_size.h - el->el_cursor.h - + el->el_rprompt.p_pos.h; + if (el->el_rprompt.p_pos.h && rhdiff < 3) { + re_refresh(el); /* clear out rprompt if less than 1 char gap */ + return; + } /* else (only do at end of line, no TAB) */ + switch (ct_chr_class(c)) { + case CHTYPE_TAB: /* already handled, should never happen here */ + break; + case CHTYPE_NL: + case CHTYPE_PRINT: + re_fastputc(el, c); + break; + case CHTYPE_ASCIICTL: + case CHTYPE_NONPRINT: { + wchar_t visbuf[VISUAL_WIDTH_MAX]; + ssize_t i, n = + ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c); + for (i = 0; n-- > 0; ++i) + re_fastputc(el, visbuf[i]); + break; + } + } + terminal__flush(el); +} + + +/* re_clear_display(): + * clear the screen buffers so that new new prompt starts fresh. + */ +libedit_private void +re_clear_display(EditLine *el) +{ + int i; + + el->el_cursor.v = 0; + el->el_cursor.h = 0; + for (i = 0; i < el->el_terminal.t_size.v; i++) + el->el_display[i][0] = '\0'; + el->el_refresh.r_oldcv = 0; +} + + +/* re_clear_lines(): + * Make sure all lines are *really* blank + */ +libedit_private void +re_clear_lines(EditLine *el) +{ + + if (EL_CAN_CEOL) { + int i; + for (i = el->el_refresh.r_oldcv; i >= 0; i--) { + /* for each line on the screen */ + terminal_move_to_line(el, i); + terminal_move_to_char(el, 0); + terminal_clear_EOL(el, el->el_terminal.t_size.h); + } + } else { + terminal_move_to_line(el, el->el_refresh.r_oldcv); + /* go to last line */ + terminal__putc(el, '\r'); /* go to BOL */ + terminal__putc(el, '\n'); /* go to new line */ + } +} diff --git a/crypto/heimdal/lib/libedit/src/search.h b/crypto/heimdal/lib/libedit/src/search.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/search.h @@ -0,0 +1,64 @@ +/* $NetBSD: search.h,v 1.14 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)search.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.search.h: Line and history searching utilities + */ +#ifndef _h_el_search +#define _h_el_search + +typedef struct el_search_t { + wchar_t *patbuf; /* The pattern buffer */ + size_t patlen; /* Length of the pattern buffer */ + int patdir; /* Direction of the last search */ + int chadir; /* Character search direction */ + wchar_t chacha; /* Character we are looking for */ + char chatflg; /* 0 if f, 1 if t */ +} el_search_t; + + +libedit_private int el_match(const wchar_t *, const wchar_t *); +libedit_private int search_init(EditLine *); +libedit_private void search_end(EditLine *); +libedit_private int c_hmatch(EditLine *, const wchar_t *); +libedit_private void c_setpat(EditLine *); +libedit_private el_action_t ce_inc_search(EditLine *, int); +libedit_private el_action_t cv_search(EditLine *, int); +libedit_private el_action_t ce_search_line(EditLine *, int); +libedit_private el_action_t cv_repeat_srch(EditLine *, wint_t); +libedit_private el_action_t cv_csearch(EditLine *, int, wint_t, int, int); + +#endif /* _h_el_search */ diff --git a/crypto/heimdal/lib/libedit/src/search.c b/crypto/heimdal/lib/libedit/src/search.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/search.c @@ -0,0 +1,641 @@ +/* $NetBSD: search.c,v 1.47 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)search.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: search.c,v 1.47 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * search.c: History and character search functions + */ +#include +#include +#if defined(REGEX) +#include +#elif defined(REGEXP) +#include +#endif + +#include "el.h" +#include "common.h" +#include "fcns.h" + +/* + * Adjust cursor in vi mode to include the character under it + */ +#define EL_CURSOR(el) \ + ((el)->el_line.cursor + (((el)->el_map.type == MAP_VI) && \ + ((el)->el_map.current == (el)->el_map.alt))) + +/* search_init(): + * Initialize the search stuff + */ +libedit_private int +search_init(EditLine *el) +{ + + el->el_search.patbuf = el_malloc(EL_BUFSIZ * + sizeof(*el->el_search.patbuf)); + if (el->el_search.patbuf == NULL) + return -1; + el->el_search.patbuf[0] = L'\0'; + el->el_search.patlen = 0; + el->el_search.patdir = -1; + el->el_search.chacha = L'\0'; + el->el_search.chadir = CHAR_FWD; + el->el_search.chatflg = 0; + return 0; +} + + +/* search_end(): + * Initialize the search stuff + */ +libedit_private void +search_end(EditLine *el) +{ + + el_free(el->el_search.patbuf); + el->el_search.patbuf = NULL; +} + + +#ifdef REGEXP +/* regerror(): + * Handle regular expression errors + */ +void +/*ARGSUSED*/ +regerror(const char *msg) +{ +} +#endif + + +/* el_match(): + * Return if string matches pattern + */ +libedit_private int +el_match(const wchar_t *str, const wchar_t *pat) +{ + static ct_buffer_t conv; +#if defined (REGEX) + regex_t re; + int rv; +#elif defined (REGEXP) + regexp *rp; + int rv; +#else + extern char *re_comp(const char *); + extern int re_exec(const char *); +#endif + + if (wcsstr(str, pat) != 0) + return 1; + +#if defined(REGEX) + if (regcomp(&re, ct_encode_string(pat, &conv), 0) == 0) { + rv = regexec(&re, ct_encode_string(str, &conv), (size_t)0, NULL, + 0) == 0; + regfree(&re); + } else { + rv = 0; + } + return rv; +#elif defined(REGEXP) + if ((re = regcomp(ct_encode_string(pat, &conv))) != NULL) { + rv = regexec(re, ct_encode_string(str, &conv)); + el_free(re); + } else { + rv = 0; + } + return rv; +#else + if (re_comp(ct_encode_string(pat, &conv)) != NULL) + return 0; + else + return re_exec(ct_encode_string(str, &conv)) == 1; +#endif +} + + +/* c_hmatch(): + * return True if the pattern matches the prefix + */ +libedit_private int +c_hmatch(EditLine *el, const wchar_t *str) +{ +#ifdef SDEBUG + (void) fprintf(el->el_errfile, "match `%s' with `%s'\n", + el->el_search.patbuf, str); +#endif /* SDEBUG */ + + return el_match(str, el->el_search.patbuf); +} + + +/* c_setpat(): + * Set the history seatch pattern + */ +libedit_private void +c_setpat(EditLine *el) +{ + if (el->el_state.lastcmd != ED_SEARCH_PREV_HISTORY && + el->el_state.lastcmd != ED_SEARCH_NEXT_HISTORY) { + el->el_search.patlen = + (size_t)(EL_CURSOR(el) - el->el_line.buffer); + if (el->el_search.patlen >= EL_BUFSIZ) + el->el_search.patlen = EL_BUFSIZ - 1; + if (el->el_search.patlen != 0) { + (void) wcsncpy(el->el_search.patbuf, el->el_line.buffer, + el->el_search.patlen); + el->el_search.patbuf[el->el_search.patlen] = '\0'; + } else + el->el_search.patlen = wcslen(el->el_search.patbuf); + } +#ifdef SDEBUG + (void) fprintf(el->el_errfile, "\neventno = %d\n", + el->el_history.eventno); + (void) fprintf(el->el_errfile, "patlen = %d\n", el->el_search.patlen); + (void) fprintf(el->el_errfile, "patbuf = \"%s\"\n", + el->el_search.patbuf); + (void) fprintf(el->el_errfile, "cursor %d lastchar %d\n", + EL_CURSOR(el) - el->el_line.buffer, + el->el_line.lastchar - el->el_line.buffer); +#endif +} + + +/* ce_inc_search(): + * Emacs incremental search + */ +libedit_private el_action_t +ce_inc_search(EditLine *el, int dir) +{ + static const wchar_t STRfwd[] = L"fwd", STRbck[] = L"bck"; + static wchar_t pchar = L':'; /* ':' = normal, '?' = failed */ + static wchar_t endcmd[2] = {'\0', '\0'}; + wchar_t *ocursor = el->el_line.cursor, oldpchar = pchar, ch; + const wchar_t *cp; + + el_action_t ret = CC_NORM; + + int ohisteventno = el->el_history.eventno; + size_t oldpatlen = el->el_search.patlen; + int newdir = dir; + int done, redo; + + if (el->el_line.lastchar + sizeof(STRfwd) / + sizeof(*el->el_line.lastchar) + 2 + + el->el_search.patlen >= el->el_line.limit) + return CC_ERROR; + + for (;;) { + + if (el->el_search.patlen == 0) { /* first round */ + pchar = ':'; +#ifdef ANCHOR +#define LEN 2 + el->el_search.patbuf[el->el_search.patlen++] = '.'; + el->el_search.patbuf[el->el_search.patlen++] = '*'; +#else +#define LEN 0 +#endif + } + done = redo = 0; + *el->el_line.lastchar++ = '\n'; + for (cp = (newdir == ED_SEARCH_PREV_HISTORY) ? STRbck : STRfwd; + *cp; *el->el_line.lastchar++ = *cp++) + continue; + *el->el_line.lastchar++ = pchar; + for (cp = &el->el_search.patbuf[LEN]; + cp < &el->el_search.patbuf[el->el_search.patlen]; + *el->el_line.lastchar++ = *cp++) + continue; + *el->el_line.lastchar = '\0'; + re_refresh(el); + + if (el_wgetc(el, &ch) != 1) + return ed_end_of_file(el, 0); + + switch (el->el_map.current[(unsigned char) ch]) { + case ED_INSERT: + case ED_DIGIT: + if (el->el_search.patlen >= EL_BUFSIZ - LEN) + terminal_beep(el); + else { + el->el_search.patbuf[el->el_search.patlen++] = + ch; + *el->el_line.lastchar++ = ch; + *el->el_line.lastchar = '\0'; + re_refresh(el); + } + break; + + case EM_INC_SEARCH_NEXT: + newdir = ED_SEARCH_NEXT_HISTORY; + redo++; + break; + + case EM_INC_SEARCH_PREV: + newdir = ED_SEARCH_PREV_HISTORY; + redo++; + break; + + case EM_DELETE_PREV_CHAR: + case ED_DELETE_PREV_CHAR: + if (el->el_search.patlen > LEN) + done++; + else + terminal_beep(el); + break; + + default: + switch (ch) { + case 0007: /* ^G: Abort */ + ret = CC_ERROR; + done++; + break; + + case 0027: /* ^W: Append word */ + /* No can do if globbing characters in pattern */ + for (cp = &el->el_search.patbuf[LEN];; cp++) + if (cp >= &el->el_search.patbuf[ + el->el_search.patlen]) { + el->el_line.cursor += + el->el_search.patlen - LEN - 1; + cp = c__next_word(el->el_line.cursor, + el->el_line.lastchar, 1, + ce__isword); + while (el->el_line.cursor < cp && + *el->el_line.cursor != '\n') { + if (el->el_search.patlen >= + EL_BUFSIZ - LEN) { + terminal_beep(el); + break; + } + el->el_search.patbuf[el->el_search.patlen++] = + *el->el_line.cursor; + *el->el_line.lastchar++ = + *el->el_line.cursor++; + } + el->el_line.cursor = ocursor; + *el->el_line.lastchar = '\0'; + re_refresh(el); + break; + } else if (isglob(*cp)) { + terminal_beep(el); + break; + } + break; + + default: /* Terminate and execute cmd */ + endcmd[0] = ch; + el_wpush(el, endcmd); + /* FALLTHROUGH */ + + case 0033: /* ESC: Terminate */ + ret = CC_REFRESH; + done++; + break; + } + break; + } + + while (el->el_line.lastchar > el->el_line.buffer && + *el->el_line.lastchar != '\n') + *el->el_line.lastchar-- = '\0'; + *el->el_line.lastchar = '\0'; + + if (!done) { + + /* Can't search if unmatched '[' */ + for (cp = &el->el_search.patbuf[el->el_search.patlen-1], + ch = L']'; + cp >= &el->el_search.patbuf[LEN]; + cp--) + if (*cp == '[' || *cp == ']') { + ch = *cp; + break; + } + if (el->el_search.patlen > LEN && ch != L'[') { + if (redo && newdir == dir) { + if (pchar == '?') { /* wrap around */ + el->el_history.eventno = + newdir == ED_SEARCH_PREV_HISTORY ? 0 : 0x7fffffff; + if (hist_get(el) == CC_ERROR) + /* el->el_history.event + * no was fixed by + * first call */ + (void) hist_get(el); + el->el_line.cursor = newdir == + ED_SEARCH_PREV_HISTORY ? + el->el_line.lastchar : + el->el_line.buffer; + } else + el->el_line.cursor += + newdir == + ED_SEARCH_PREV_HISTORY ? + -1 : 1; + } +#ifdef ANCHOR + el->el_search.patbuf[el->el_search.patlen++] = + '.'; + el->el_search.patbuf[el->el_search.patlen++] = + '*'; +#endif + el->el_search.patbuf[el->el_search.patlen] = + '\0'; + if (el->el_line.cursor < el->el_line.buffer || + el->el_line.cursor > el->el_line.lastchar || + (ret = ce_search_line(el, newdir)) + == CC_ERROR) { + /* avoid c_setpat */ + el->el_state.lastcmd = + (el_action_t) newdir; + ret = (el_action_t) + (newdir == ED_SEARCH_PREV_HISTORY ? + ed_search_prev_history(el, 0) : + ed_search_next_history(el, 0)); + if (ret != CC_ERROR) { + el->el_line.cursor = newdir == + ED_SEARCH_PREV_HISTORY ? + el->el_line.lastchar : + el->el_line.buffer; + (void) ce_search_line(el, + newdir); + } + } + el->el_search.patlen -= LEN; + el->el_search.patbuf[el->el_search.patlen] = + '\0'; + if (ret == CC_ERROR) { + terminal_beep(el); + if (el->el_history.eventno != + ohisteventno) { + el->el_history.eventno = + ohisteventno; + if (hist_get(el) == CC_ERROR) + return CC_ERROR; + } + el->el_line.cursor = ocursor; + pchar = '?'; + } else { + pchar = ':'; + } + } + ret = ce_inc_search(el, newdir); + + if (ret == CC_ERROR && pchar == '?' && oldpchar == ':') + /* + * break abort of failed search at last + * non-failed + */ + ret = CC_NORM; + + } + if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) { + /* restore on normal return or error exit */ + pchar = oldpchar; + el->el_search.patlen = oldpatlen; + if (el->el_history.eventno != ohisteventno) { + el->el_history.eventno = ohisteventno; + if (hist_get(el) == CC_ERROR) + return CC_ERROR; + } + el->el_line.cursor = ocursor; + if (ret == CC_ERROR) + re_refresh(el); + } + if (done || ret != CC_NORM) + return ret; + } +} + + +/* cv_search(): + * Vi search. + */ +libedit_private el_action_t +cv_search(EditLine *el, int dir) +{ + wchar_t ch; + wchar_t tmpbuf[EL_BUFSIZ]; + ssize_t tmplen; + +#ifdef ANCHOR + tmpbuf[0] = '.'; + tmpbuf[1] = '*'; +#endif + tmplen = LEN; + + el->el_search.patdir = dir; + + tmplen = c_gets(el, &tmpbuf[LEN], + dir == ED_SEARCH_PREV_HISTORY ? L"\n/" : L"\n?" ); + if (tmplen == -1) + return CC_REFRESH; + + tmplen += LEN; + ch = tmpbuf[tmplen]; + tmpbuf[tmplen] = '\0'; + + if (tmplen == LEN) { + /* + * Use the old pattern, but wild-card it. + */ + if (el->el_search.patlen == 0) { + re_refresh(el); + return CC_ERROR; + } +#ifdef ANCHOR + if (el->el_search.patbuf[0] != '.' && + el->el_search.patbuf[0] != '*') { + (void) wcsncpy(tmpbuf, el->el_search.patbuf, + sizeof(tmpbuf) / sizeof(*tmpbuf) - 1); + el->el_search.patbuf[0] = '.'; + el->el_search.patbuf[1] = '*'; + (void) wcsncpy(&el->el_search.patbuf[2], tmpbuf, + EL_BUFSIZ - 3); + el->el_search.patlen++; + el->el_search.patbuf[el->el_search.patlen++] = '.'; + el->el_search.patbuf[el->el_search.patlen++] = '*'; + el->el_search.patbuf[el->el_search.patlen] = '\0'; + } +#endif + } else { +#ifdef ANCHOR + tmpbuf[tmplen++] = '.'; + tmpbuf[tmplen++] = '*'; +#endif + tmpbuf[tmplen] = '\0'; + (void) wcsncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1); + el->el_search.patlen = (size_t)tmplen; + } + el->el_state.lastcmd = (el_action_t) dir; /* avoid c_setpat */ + el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer; + if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) : + ed_search_next_history(el, 0)) == CC_ERROR) { + re_refresh(el); + return CC_ERROR; + } + if (ch == 0033) { + re_refresh(el); + return ed_newline(el, 0); + } + return CC_REFRESH; +} + + +/* ce_search_line(): + * Look for a pattern inside a line + */ +libedit_private el_action_t +ce_search_line(EditLine *el, int dir) +{ + wchar_t *cp = el->el_line.cursor; + wchar_t *pattern = el->el_search.patbuf; + wchar_t oc, *ocp; +#ifdef ANCHOR + ocp = &pattern[1]; + oc = *ocp; + *ocp = '^'; +#else + ocp = pattern; + oc = *ocp; +#endif + + if (dir == ED_SEARCH_PREV_HISTORY) { + for (; cp >= el->el_line.buffer; cp--) { + if (el_match(cp, ocp)) { + *ocp = oc; + el->el_line.cursor = cp; + return CC_NORM; + } + } + *ocp = oc; + return CC_ERROR; + } else { + for (; *cp != '\0' && cp < el->el_line.limit; cp++) { + if (el_match(cp, ocp)) { + *ocp = oc; + el->el_line.cursor = cp; + return CC_NORM; + } + } + *ocp = oc; + return CC_ERROR; + } +} + + +/* cv_repeat_srch(): + * Vi repeat search + */ +libedit_private el_action_t +cv_repeat_srch(EditLine *el, wint_t c) +{ + +#ifdef SDEBUG + (void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n", + c, el->el_search.patlen, ct_encode_string(el->el_search.patbuf)); +#endif + + el->el_state.lastcmd = (el_action_t) c; /* Hack to stop c_setpat */ + el->el_line.lastchar = el->el_line.buffer; + + switch (c) { + case ED_SEARCH_NEXT_HISTORY: + return ed_search_next_history(el, 0); + case ED_SEARCH_PREV_HISTORY: + return ed_search_prev_history(el, 0); + default: + return CC_ERROR; + } +} + + +/* cv_csearch(): + * Vi character search + */ +libedit_private el_action_t +cv_csearch(EditLine *el, int direction, wint_t ch, int count, int tflag) +{ + wchar_t *cp; + + if (ch == 0) + return CC_ERROR; + + if (ch == (wint_t)-1) { + if (el_wgetc(el, &ch) != 1) + return ed_end_of_file(el, 0); + } + + /* Save for ';' and ',' commands */ + el->el_search.chacha = ch; + el->el_search.chadir = direction; + el->el_search.chatflg = (char)tflag; + + cp = el->el_line.cursor; + while (count--) { + if ((wint_t)*cp == ch) + cp += direction; + for (;;cp += direction) { + if (cp >= el->el_line.lastchar) + return CC_ERROR; + if (cp < el->el_line.buffer) + return CC_ERROR; + if ((wint_t)*cp == ch) + break; + } + } + + if (tflag) + cp -= direction; + + el->el_line.cursor = cp; + + if (el->el_chared.c_vcmd.action != NOP) { + if (direction > 0) + el->el_line.cursor++; + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} diff --git a/crypto/heimdal/lib/libedit/src/shlib_version b/crypto/heimdal/lib/libedit/src/shlib_version new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/shlib_version @@ -0,0 +1,5 @@ +# $NetBSD: shlib_version,v 1.19 2013/01/22 20:23:21 christos Exp $ +# Remember to update distrib/sets/lists/base/shl.* when changing +# +major=3 +minor=1 diff --git a/crypto/heimdal/lib/libedit/src/sig.h b/crypto/heimdal/lib/libedit/src/sig.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/sig.h @@ -0,0 +1,70 @@ +/* $NetBSD: sig.h,v 1.11 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)sig.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.sig.h: Signal handling functions + */ +#ifndef _h_el_sig +#define _h_el_sig + +#include + +/* + * Define here all the signals we are going to handle + * The _DO macro is used to iterate in the source code + */ +#define ALLSIGS \ + _DO(SIGINT) \ + _DO(SIGTSTP) \ + _DO(SIGQUIT) \ + _DO(SIGHUP) \ + _DO(SIGTERM) \ + _DO(SIGCONT) \ + _DO(SIGWINCH) +#define ALLSIGSNO 7 + +typedef struct { + struct sigaction sig_action[ALLSIGSNO]; + sigset_t sig_set; + volatile sig_atomic_t sig_no; +} *el_signal_t; + +libedit_private void sig_end(EditLine*); +libedit_private int sig_init(EditLine*); +libedit_private void sig_set(EditLine*); +libedit_private void sig_clr(EditLine*); + +#endif /* _h_el_sig */ diff --git a/crypto/heimdal/lib/libedit/src/sig.c b/crypto/heimdal/lib/libedit/src/sig.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/sig.c @@ -0,0 +1,205 @@ +/* $NetBSD: sig.c,v 1.26 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)sig.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: sig.c,v 1.26 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * sig.c: Signal handling stuff. + * our policy is to trap all signals, set a good state + * and pass the ball to our caller. + */ +#include +#include + +#include "el.h" +#include "common.h" + +static EditLine *sel = NULL; + +static const int sighdl[] = { +#define _DO(a) (a), + ALLSIGS +#undef _DO + - 1 +}; + +static void sig_handler(int); + +/* sig_handler(): + * This is the handler called for all signals + * XXX: we cannot pass any data so we just store the old editline + * state in a private variable + */ +static void +sig_handler(int signo) +{ + int i, save_errno; + sigset_t nset, oset; + + save_errno = errno; + (void) sigemptyset(&nset); + (void) sigaddset(&nset, signo); + (void) sigprocmask(SIG_BLOCK, &nset, &oset); + + sel->el_signal->sig_no = signo; + + switch (signo) { + case SIGCONT: + tty_rawmode(sel); + if (ed_redisplay(sel, 0) == CC_REFRESH) + re_refresh(sel); + terminal__flush(sel); + break; + + case SIGWINCH: + el_resize(sel); + break; + + default: + tty_cookedmode(sel); + break; + } + + for (i = 0; sighdl[i] != -1; i++) + if (signo == sighdl[i]) + break; + + (void) sigaction(signo, &sel->el_signal->sig_action[i], NULL); + sel->el_signal->sig_action[i].sa_handler = SIG_ERR; + sel->el_signal->sig_action[i].sa_flags = 0; + sigemptyset(&sel->el_signal->sig_action[i].sa_mask); + (void) sigprocmask(SIG_SETMASK, &oset, NULL); + (void) kill(0, signo); + errno = save_errno; +} + + +/* sig_init(): + * Initialize all signal stuff + */ +libedit_private int +sig_init(EditLine *el) +{ + size_t i; + sigset_t *nset, oset; + + el->el_signal = el_malloc(sizeof(*el->el_signal)); + if (el->el_signal == NULL) + return -1; + + nset = &el->el_signal->sig_set; + (void) sigemptyset(nset); +#define _DO(a) (void) sigaddset(nset, a); + ALLSIGS +#undef _DO + (void) sigprocmask(SIG_BLOCK, nset, &oset); + + for (i = 0; sighdl[i] != -1; i++) { + el->el_signal->sig_action[i].sa_handler = SIG_ERR; + el->el_signal->sig_action[i].sa_flags = 0; + sigemptyset(&el->el_signal->sig_action[i].sa_mask); + } + + (void) sigprocmask(SIG_SETMASK, &oset, NULL); + + return 0; +} + + +/* sig_end(): + * Clear all signal stuff + */ +libedit_private void +sig_end(EditLine *el) +{ + + el_free(el->el_signal); + el->el_signal = NULL; +} + + +/* sig_set(): + * set all the signal handlers + */ +libedit_private void +sig_set(EditLine *el) +{ + size_t i; + sigset_t oset; + struct sigaction osa, nsa; + + nsa.sa_handler = sig_handler; + nsa.sa_flags = 0; + sigemptyset(&nsa.sa_mask); + + (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset); + + for (i = 0; sighdl[i] != -1; i++) { + /* This could happen if we get interrupted */ + if (sigaction(sighdl[i], &nsa, &osa) != -1 && + osa.sa_handler != sig_handler) + el->el_signal->sig_action[i] = osa; + } + sel = el; + (void) sigprocmask(SIG_SETMASK, &oset, NULL); +} + + +/* sig_clr(): + * clear all the signal handlers + */ +libedit_private void +sig_clr(EditLine *el) +{ + size_t i; + sigset_t oset; + + (void) sigprocmask(SIG_BLOCK, &el->el_signal->sig_set, &oset); + + for (i = 0; sighdl[i] != -1; i++) + if (el->el_signal->sig_action[i].sa_handler != SIG_ERR) + (void)sigaction(sighdl[i], + &el->el_signal->sig_action[i], NULL); + + sel = NULL; /* we are going to die if the handler is + * called */ + (void)sigprocmask(SIG_SETMASK, &oset, NULL); +} diff --git a/crypto/heimdal/lib/libedit/src/sys.h b/crypto/heimdal/lib/libedit/src/sys.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/sys.h @@ -0,0 +1,108 @@ +/* $NetBSD: sys.h,v 1.27 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)sys.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * sys.h: Put all the stupid compiler and system dependencies here... + */ +#ifndef _h_sys +#define _h_sys + +#ifdef HAVE_SYS_CDEFS_H +#include +#endif + +#ifdef HAVE_STDINT_H +#include +#endif + +#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8) +# define __attribute__(A) +#endif + +#ifndef __BEGIN_DECLS +# ifdef __cplusplus +# define __BEGIN_DECLS extern "C" { +# define __END_DECLS } +# else +# define __BEGIN_DECLS +# define __END_DECLS +# endif +#endif + +/* If your compiler does not support this, define it to be empty. */ +#define libedit_private __attribute__((__visibility__("hidden"))) + +#ifndef __arraycount +# define __arraycount(a) (sizeof(a) / sizeof(*(a))) +#endif + +#include + +#ifndef HAVE_STRLCAT +#define strlcat libedit_strlcat +size_t strlcat(char *dst, const char *src, size_t size); +#endif + +#ifndef HAVE_STRLCPY +#define strlcpy libedit_strlcpy +size_t strlcpy(char *dst, const char *src, size_t size); +#endif + +#ifndef HAVE_GETLINE +#define getline libedit_getline +ssize_t getline(char **line, size_t *len, FILE *fp); +#endif + +#ifndef _DIAGASSERT +#define _DIAGASSERT(x) +#endif + +#ifndef __RCSID +#define __RCSID(x) +#endif + +#ifndef HAVE_U_INT32_T +typedef unsigned int u_int32_t; +#endif + +#ifndef HAVE_SIZE_MAX +#define SIZE_MAX ((size_t)-1) +#endif + +#define REGEX /* Use POSIX.2 regular expression functions */ +#undef REGEXP /* Use UNIX V8 regular expression functions */ + +#endif /* _h_sys */ diff --git a/crypto/heimdal/lib/libedit/src/terminal.h b/crypto/heimdal/lib/libedit/src/terminal.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/terminal.h @@ -0,0 +1,125 @@ +/* $NetBSD: terminal.h,v 1.9 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)term.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.term.h: Termcap header + */ +#ifndef _h_el_terminal +#define _h_el_terminal + +typedef struct { /* Symbolic function key bindings */ + const wchar_t *name; /* name of the key */ + int key; /* Index in termcap table */ + keymacro_value_t fun; /* Function bound to it */ + int type; /* Type of function */ +} funckey_t; + +typedef struct { + const char *t_name; /* the terminal name */ + coord_t t_size; /* # lines and cols */ + int t_flags; +#define TERM_CAN_INSERT 0x001 /* Has insert cap */ +#define TERM_CAN_DELETE 0x002 /* Has delete cap */ +#define TERM_CAN_CEOL 0x004 /* Has CEOL cap */ +#define TERM_CAN_TAB 0x008 /* Can use tabs */ +#define TERM_CAN_ME 0x010 /* Can turn all attrs. */ +#define TERM_CAN_UP 0x020 /* Can move up */ +#define TERM_HAS_META 0x040 /* Has a meta key */ +#define TERM_HAS_AUTO_MARGINS 0x080 /* Has auto margins */ +#define TERM_HAS_MAGIC_MARGINS 0x100 /* Has magic margins */ + char *t_buf; /* Termcap buffer */ + size_t t_loc; /* location used */ + char **t_str; /* termcap strings */ + int *t_val; /* termcap values */ + char *t_cap; /* Termcap buffer */ + funckey_t *t_fkey; /* Array of keys */ +} el_terminal_t; + +/* + * fKey indexes + */ +#define A_K_DN 0 +#define A_K_UP 1 +#define A_K_LT 2 +#define A_K_RT 3 +#define A_K_HO 4 +#define A_K_EN 5 +#define A_K_DE 6 +#define A_K_NKEYS 7 + +libedit_private void terminal_move_to_line(EditLine *, int); +libedit_private void terminal_move_to_char(EditLine *, int); +libedit_private void terminal_clear_EOL(EditLine *, int); +libedit_private void terminal_overwrite(EditLine *, const wchar_t *, size_t); +libedit_private void terminal_insertwrite(EditLine *, wchar_t *, int); +libedit_private void terminal_deletechars(EditLine *, int); +libedit_private void terminal_clear_screen(EditLine *); +libedit_private void terminal_beep(EditLine *); +libedit_private int terminal_change_size(EditLine *, int, int); +libedit_private int terminal_get_size(EditLine *, int *, int *); +libedit_private int terminal_init(EditLine *); +libedit_private void terminal_bind_arrow(EditLine *); +libedit_private void terminal_print_arrow(EditLine *, const wchar_t *); +libedit_private int terminal_clear_arrow(EditLine *, const wchar_t *); +libedit_private int terminal_set_arrow(EditLine *, const wchar_t *, + keymacro_value_t *, int); +libedit_private void terminal_end(EditLine *); +libedit_private void terminal_get(EditLine *, const char **); +libedit_private int terminal_set(EditLine *, const char *); +libedit_private int terminal_settc(EditLine *, int, const wchar_t **); +libedit_private int terminal_gettc(EditLine *, int, char **); +libedit_private int terminal_telltc(EditLine *, int, const wchar_t **); +libedit_private int terminal_echotc(EditLine *, int, const wchar_t **); +libedit_private void terminal_writec(EditLine *, wint_t); +libedit_private int terminal__putc(EditLine *, wint_t); +libedit_private void terminal__flush(EditLine *); + +/* + * Easy access macros + */ +#define EL_FLAGS (el)->el_terminal.t_flags + +#define EL_CAN_INSERT (EL_FLAGS & TERM_CAN_INSERT) +#define EL_CAN_DELETE (EL_FLAGS & TERM_CAN_DELETE) +#define EL_CAN_CEOL (EL_FLAGS & TERM_CAN_CEOL) +#define EL_CAN_TAB (EL_FLAGS & TERM_CAN_TAB) +#define EL_CAN_ME (EL_FLAGS & TERM_CAN_ME) +#define EL_CAN_UP (EL_FLAGS & TERM_CAN_UP) +#define EL_HAS_META (EL_FLAGS & TERM_HAS_META) +#define EL_HAS_AUTO_MARGINS (EL_FLAGS & TERM_HAS_AUTO_MARGINS) +#define EL_HAS_MAGIC_MARGINS (EL_FLAGS & TERM_HAS_MAGIC_MARGINS) + +#endif /* _h_el_terminal */ diff --git a/crypto/heimdal/lib/libedit/src/terminal.c b/crypto/heimdal/lib/libedit/src/terminal.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/terminal.c @@ -0,0 +1,1682 @@ +/* $NetBSD: terminal.c,v 1.32 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95"; +#else +__RCSID("$NetBSD: terminal.c,v 1.32 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * terminal.c: Editor/termcap-curses interface + * We have to declare a static variable here, since the + * termcap putchar routine does not take an argument! + */ +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_TERMCAP_H +#include +#endif +#ifdef HAVE_CURSES_H +#include +#elif HAVE_NCURSES_H +#include +#endif + +/* Solaris's term.h does horrid things. */ +#if defined(HAVE_TERM_H) && !defined(__sun) && !defined(HAVE_TERMCAP_H) +#include +#endif + +#ifdef _REENTRANT +#include +#endif + +#include "el.h" +#include "fcns.h" + +/* + * IMPORTANT NOTE: these routines are allowed to look at the current screen + * and the current position assuming that it is correct. If this is not + * true, then the update will be WRONG! This is (should be) a valid + * assumption... + */ + +#define TC_BUFSIZE ((size_t)2048) + +#define GoodStr(a) (el->el_terminal.t_str[a] != NULL && \ + el->el_terminal.t_str[a][0] != '\0') +#define Str(a) el->el_terminal.t_str[a] +#define Val(a) el->el_terminal.t_val[a] + +static const struct termcapstr { + const char *name; + const char *long_name; +} tstr[] = { +#define T_al 0 + { "al", "add new blank line" }, +#define T_bl 1 + { "bl", "audible bell" }, +#define T_cd 2 + { "cd", "clear to bottom" }, +#define T_ce 3 + { "ce", "clear to end of line" }, +#define T_ch 4 + { "ch", "cursor to horiz pos" }, +#define T_cl 5 + { "cl", "clear screen" }, +#define T_dc 6 + { "dc", "delete a character" }, +#define T_dl 7 + { "dl", "delete a line" }, +#define T_dm 8 + { "dm", "start delete mode" }, +#define T_ed 9 + { "ed", "end delete mode" }, +#define T_ei 10 + { "ei", "end insert mode" }, +#define T_fs 11 + { "fs", "cursor from status line" }, +#define T_ho 12 + { "ho", "home cursor" }, +#define T_ic 13 + { "ic", "insert character" }, +#define T_im 14 + { "im", "start insert mode" }, +#define T_ip 15 + { "ip", "insert padding" }, +#define T_kd 16 + { "kd", "sends cursor down" }, +#define T_kl 17 + { "kl", "sends cursor left" }, +#define T_kr 18 + { "kr", "sends cursor right" }, +#define T_ku 19 + { "ku", "sends cursor up" }, +#define T_md 20 + { "md", "begin bold" }, +#define T_me 21 + { "me", "end attributes" }, +#define T_nd 22 + { "nd", "non destructive space" }, +#define T_se 23 + { "se", "end standout" }, +#define T_so 24 + { "so", "begin standout" }, +#define T_ts 25 + { "ts", "cursor to status line" }, +#define T_up 26 + { "up", "cursor up one" }, +#define T_us 27 + { "us", "begin underline" }, +#define T_ue 28 + { "ue", "end underline" }, +#define T_vb 29 + { "vb", "visible bell" }, +#define T_DC 30 + { "DC", "delete multiple chars" }, +#define T_DO 31 + { "DO", "cursor down multiple" }, +#define T_IC 32 + { "IC", "insert multiple chars" }, +#define T_LE 33 + { "LE", "cursor left multiple" }, +#define T_RI 34 + { "RI", "cursor right multiple" }, +#define T_UP 35 + { "UP", "cursor up multiple" }, +#define T_kh 36 + { "kh", "send cursor home" }, +#define T_at7 37 + { "@7", "send cursor end" }, +#define T_kD 38 + { "kD", "send cursor delete" }, +#define T_str 39 + { NULL, NULL } +}; + +static const struct termcapval { + const char *name; + const char *long_name; +} tval[] = { +#define T_am 0 + { "am", "has automatic margins" }, +#define T_pt 1 + { "pt", "has physical tabs" }, +#define T_li 2 + { "li", "Number of lines" }, +#define T_co 3 + { "co", "Number of columns" }, +#define T_km 4 + { "km", "Has meta key" }, +#define T_xt 5 + { "xt", "Tab chars destructive" }, +#define T_xn 6 + { "xn", "newline ignored at right margin" }, +#define T_MT 7 + { "MT", "Has meta key" }, /* XXX? */ +#define T_val 8 + { NULL, NULL, } +}; +/* do two or more of the attributes use me */ + +static void terminal_setflags(EditLine *); +static int terminal_rebuffer_display(EditLine *); +static void terminal_free_display(EditLine *); +static int terminal_alloc_display(EditLine *); +static void terminal_alloc(EditLine *, const struct termcapstr *, + const char *); +static void terminal_init_arrow(EditLine *); +static void terminal_reset_arrow(EditLine *); +static int terminal_putc(int); +static void terminal_tputs(EditLine *, const char *, int); + +#ifdef _REENTRANT +static pthread_mutex_t terminal_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif +static FILE *terminal_outfile = NULL; + + +/* terminal_setflags(): + * Set the terminal capability flags + */ +static void +terminal_setflags(EditLine *el) +{ + EL_FLAGS = 0; + if (el->el_tty.t_tabs) + EL_FLAGS |= (Val(T_pt) && !Val(T_xt)) ? TERM_CAN_TAB : 0; + + EL_FLAGS |= (Val(T_km) || Val(T_MT)) ? TERM_HAS_META : 0; + EL_FLAGS |= GoodStr(T_ce) ? TERM_CAN_CEOL : 0; + EL_FLAGS |= (GoodStr(T_dc) || GoodStr(T_DC)) ? TERM_CAN_DELETE : 0; + EL_FLAGS |= (GoodStr(T_im) || GoodStr(T_ic) || GoodStr(T_IC)) ? + TERM_CAN_INSERT : 0; + EL_FLAGS |= (GoodStr(T_up) || GoodStr(T_UP)) ? TERM_CAN_UP : 0; + EL_FLAGS |= Val(T_am) ? TERM_HAS_AUTO_MARGINS : 0; + EL_FLAGS |= Val(T_xn) ? TERM_HAS_MAGIC_MARGINS : 0; + + if (GoodStr(T_me) && GoodStr(T_ue)) + EL_FLAGS |= (strcmp(Str(T_me), Str(T_ue)) == 0) ? + TERM_CAN_ME : 0; + else + EL_FLAGS &= ~TERM_CAN_ME; + if (GoodStr(T_me) && GoodStr(T_se)) + EL_FLAGS |= (strcmp(Str(T_me), Str(T_se)) == 0) ? + TERM_CAN_ME : 0; + + +#ifdef DEBUG_SCREEN + if (!EL_CAN_UP) { + (void) fprintf(el->el_errfile, + "WARNING: Your terminal cannot move up.\n"); + (void) fprintf(el->el_errfile, + "Editing may be odd for long lines.\n"); + } + if (!EL_CAN_CEOL) + (void) fprintf(el->el_errfile, "no clear EOL capability.\n"); + if (!EL_CAN_DELETE) + (void) fprintf(el->el_errfile, "no delete char capability.\n"); + if (!EL_CAN_INSERT) + (void) fprintf(el->el_errfile, "no insert char capability.\n"); +#endif /* DEBUG_SCREEN */ +} + +/* terminal_init(): + * Initialize the terminal stuff + */ +libedit_private int +terminal_init(EditLine *el) +{ + + el->el_terminal.t_buf = el_malloc(TC_BUFSIZE * + sizeof(*el->el_terminal.t_buf)); + if (el->el_terminal.t_buf == NULL) + goto fail1; + el->el_terminal.t_cap = el_malloc(TC_BUFSIZE * + sizeof(*el->el_terminal.t_cap)); + if (el->el_terminal.t_cap == NULL) + goto fail2; + el->el_terminal.t_fkey = el_malloc(A_K_NKEYS * + sizeof(*el->el_terminal.t_fkey)); + if (el->el_terminal.t_fkey == NULL) + goto fail3; + el->el_terminal.t_loc = 0; + el->el_terminal.t_str = el_malloc(T_str * + sizeof(*el->el_terminal.t_str)); + if (el->el_terminal.t_str == NULL) + goto fail4; + (void) memset(el->el_terminal.t_str, 0, T_str * + sizeof(*el->el_terminal.t_str)); + el->el_terminal.t_val = el_malloc(T_val * + sizeof(*el->el_terminal.t_val)); + if (el->el_terminal.t_val == NULL) + goto fail5; + (void) memset(el->el_terminal.t_val, 0, T_val * + sizeof(*el->el_terminal.t_val)); + (void) terminal_set(el, NULL); + terminal_init_arrow(el); + return 0; +fail5: + free(el->el_terminal.t_str); + el->el_terminal.t_str = NULL; +fail4: + free(el->el_terminal.t_fkey); + el->el_terminal.t_fkey = NULL; +fail3: + free(el->el_terminal.t_cap); + el->el_terminal.t_cap = NULL; +fail2: + free(el->el_terminal.t_buf); + el->el_terminal.t_buf = NULL; +fail1: + return -1; +} + +/* terminal_end(): + * Clean up the terminal stuff + */ +libedit_private void +terminal_end(EditLine *el) +{ + + el_free(el->el_terminal.t_buf); + el->el_terminal.t_buf = NULL; + el_free(el->el_terminal.t_cap); + el->el_terminal.t_cap = NULL; + el->el_terminal.t_loc = 0; + el_free(el->el_terminal.t_str); + el->el_terminal.t_str = NULL; + el_free(el->el_terminal.t_val); + el->el_terminal.t_val = NULL; + el_free(el->el_terminal.t_fkey); + el->el_terminal.t_fkey = NULL; + terminal_free_display(el); +} + + +/* terminal_alloc(): + * Maintain a string pool for termcap strings + */ +static void +terminal_alloc(EditLine *el, const struct termcapstr *t, const char *cap) +{ + char termbuf[TC_BUFSIZE]; + size_t tlen, clen; + char **tlist = el->el_terminal.t_str; + char **tmp, **str = &tlist[t - tstr]; + + (void) memset(termbuf, 0, sizeof(termbuf)); + if (cap == NULL || *cap == '\0') { + *str = NULL; + return; + } else + clen = strlen(cap); + + tlen = *str == NULL ? 0 : strlen(*str); + + /* + * New string is shorter; no need to allocate space + */ + if (clen <= tlen) { + if (*str) + (void) strcpy(*str, cap); /* XXX strcpy is safe */ + return; + } + /* + * New string is longer; see if we have enough space to append + */ + if (el->el_terminal.t_loc + 3 < TC_BUFSIZE) { + /* XXX strcpy is safe */ + (void) strcpy(*str = &el->el_terminal.t_buf[ + el->el_terminal.t_loc], cap); + el->el_terminal.t_loc += clen + 1; /* one for \0 */ + return; + } + /* + * Compact our buffer; no need to check compaction, cause we know it + * fits... + */ + tlen = 0; + for (tmp = tlist; tmp < &tlist[T_str]; tmp++) + if (*tmp != NULL && **tmp != '\0' && *tmp != *str) { + char *ptr; + + for (ptr = *tmp; *ptr != '\0'; termbuf[tlen++] = *ptr++) + continue; + termbuf[tlen++] = '\0'; + } + memcpy(el->el_terminal.t_buf, termbuf, TC_BUFSIZE); + el->el_terminal.t_loc = tlen; + if (el->el_terminal.t_loc + 3 >= TC_BUFSIZE) { + (void) fprintf(el->el_errfile, + "Out of termcap string space.\n"); + return; + } + /* XXX strcpy is safe */ + (void) strcpy(*str = &el->el_terminal.t_buf[el->el_terminal.t_loc], + cap); + el->el_terminal.t_loc += (size_t)clen + 1; /* one for \0 */ + return; +} + + +/* terminal_rebuffer_display(): + * Rebuffer the display after the screen changed size + */ +static int +terminal_rebuffer_display(EditLine *el) +{ + coord_t *c = &el->el_terminal.t_size; + + terminal_free_display(el); + + c->h = Val(T_co); + c->v = Val(T_li); + + if (terminal_alloc_display(el) == -1) + return -1; + return 0; +} + + +/* terminal_alloc_display(): + * Allocate a new display. + */ +static int +terminal_alloc_display(EditLine *el) +{ + int i; + wchar_t **b; + coord_t *c = &el->el_terminal.t_size; + + b = el_malloc(sizeof(*b) * (size_t)(c->v + 1)); + if (b == NULL) + goto done; + for (i = 0; i < c->v; i++) { + b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1)); + if (b[i] == NULL) { + while (--i >= 0) + el_free(b[i]); + el_free(b); + goto done; + } + } + b[c->v] = NULL; + el->el_display = b; + + b = el_malloc(sizeof(*b) * (size_t)(c->v + 1)); + if (b == NULL) + goto done; + for (i = 0; i < c->v; i++) { + b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1)); + if (b[i] == NULL) { + while (--i >= 0) + el_free(b[i]); + el_free(b); + goto done; + } + } + b[c->v] = NULL; + el->el_vdisplay = b; + return 0; +done: + terminal_free_display(el); + return -1; +} + + +/* terminal_free_display(): + * Free the display buffers + */ +static void +terminal_free_display(EditLine *el) +{ + wchar_t **b; + wchar_t **bufp; + + b = el->el_display; + el->el_display = NULL; + if (b != NULL) { + for (bufp = b; *bufp != NULL; bufp++) + el_free(*bufp); + el_free(b); + } + b = el->el_vdisplay; + el->el_vdisplay = NULL; + if (b != NULL) { + for (bufp = b; *bufp != NULL; bufp++) + el_free(*bufp); + el_free(b); + } +} + + +/* terminal_move_to_line(): + * move to line (first line == 0) + * as efficiently as possible + */ +libedit_private void +terminal_move_to_line(EditLine *el, int where) +{ + int del; + + if (where == el->el_cursor.v) + return; + + if (where > el->el_terminal.t_size.v) { +#ifdef DEBUG_SCREEN + (void) fprintf(el->el_errfile, + "%s: where is ridiculous: %d\r\n", __func__, where); +#endif /* DEBUG_SCREEN */ + return; + } + if ((del = where - el->el_cursor.v) > 0) { + while (del > 0) { + if (EL_HAS_AUTO_MARGINS && + el->el_display[el->el_cursor.v][0] != '\0') { + size_t h = (size_t) + (el->el_terminal.t_size.h - 1); + for (; h > 0 && + el->el_display[el->el_cursor.v][h] == + MB_FILL_CHAR; + h--) + continue; + /* move without newline */ + terminal_move_to_char(el, (int)h); + terminal_overwrite(el, &el->el_display + [el->el_cursor.v][el->el_cursor.h], + (size_t)(el->el_terminal.t_size.h - + el->el_cursor.h)); + /* updates Cursor */ + del--; + } else { + if ((del > 1) && GoodStr(T_DO)) { + terminal_tputs(el, tgoto(Str(T_DO), del, + del), del); + del = 0; + } else { + for (; del > 0; del--) + terminal__putc(el, '\n'); + /* because the \n will become \r\n */ + el->el_cursor.h = 0; + } + } + } + } else { /* del < 0 */ + if (GoodStr(T_UP) && (-del > 1 || !GoodStr(T_up))) + terminal_tputs(el, tgoto(Str(T_UP), -del, -del), -del); + else { + if (GoodStr(T_up)) + for (; del < 0; del++) + terminal_tputs(el, Str(T_up), 1); + } + } + el->el_cursor.v = where;/* now where is here */ +} + + +/* terminal_move_to_char(): + * Move to the character position specified + */ +libedit_private void +terminal_move_to_char(EditLine *el, int where) +{ + int del, i; + +mc_again: + if (where == el->el_cursor.h) + return; + + if (where > el->el_terminal.t_size.h) { +#ifdef DEBUG_SCREEN + (void) fprintf(el->el_errfile, + "%s: where is ridiculous: %d\r\n", __func__, where); +#endif /* DEBUG_SCREEN */ + return; + } + if (!where) { /* if where is first column */ + terminal__putc(el, '\r'); /* do a CR */ + el->el_cursor.h = 0; + return; + } + del = where - el->el_cursor.h; + + if ((del < -4 || del > 4) && GoodStr(T_ch)) + /* go there directly */ + terminal_tputs(el, tgoto(Str(T_ch), where, where), where); + else { + if (del > 0) { /* moving forward */ + if ((del > 4) && GoodStr(T_RI)) + terminal_tputs(el, tgoto(Str(T_RI), del, del), + del); + else { + /* if I can do tabs, use them */ + if (EL_CAN_TAB) { + if ((el->el_cursor.h & 0370) != + (where & ~0x7) + && (el->el_display[ + el->el_cursor.v][where & 0370] != + MB_FILL_CHAR) + ) { + /* if not within tab stop */ + for (i = + (el->el_cursor.h & 0370); + i < (where & ~0x7); + i += 8) + terminal__putc(el, + '\t'); + /* then tab over */ + el->el_cursor.h = where & ~0x7; + } + } + /* + * it's usually cheaper to just write the + * chars, so we do. + */ + /* + * NOTE THAT terminal_overwrite() WILL CHANGE + * el->el_cursor.h!!! + */ + terminal_overwrite(el, &el->el_display[ + el->el_cursor.v][el->el_cursor.h], + (size_t)(where - el->el_cursor.h)); + + } + } else { /* del < 0 := moving backward */ + if ((-del > 4) && GoodStr(T_LE)) + terminal_tputs(el, tgoto(Str(T_LE), -del, -del), + -del); + else { /* can't go directly there */ + /* + * if the "cost" is greater than the "cost" + * from col 0 + */ + if (EL_CAN_TAB ? + ((unsigned int)-del > + (((unsigned int) where >> 3) + + (where & 07))) + : (-del > where)) { + terminal__putc(el, '\r');/* do a CR */ + el->el_cursor.h = 0; + goto mc_again; /* and try again */ + } + for (i = 0; i < -del; i++) + terminal__putc(el, '\b'); + } + } + } + el->el_cursor.h = where; /* now where is here */ +} + + +/* terminal_overwrite(): + * Overstrike num characters + * Assumes MB_FILL_CHARs are present to keep the column count correct + */ +libedit_private void +terminal_overwrite(EditLine *el, const wchar_t *cp, size_t n) +{ + if (n == 0) + return; + + if (n > (size_t)el->el_terminal.t_size.h) { +#ifdef DEBUG_SCREEN + (void) fprintf(el->el_errfile, + "%s: n is ridiculous: %zu\r\n", __func__, n); +#endif /* DEBUG_SCREEN */ + return; + } + + do { + /* terminal__putc() ignores any MB_FILL_CHARs */ + terminal__putc(el, *cp++); + el->el_cursor.h++; + } while (--n); + + if (el->el_cursor.h >= el->el_terminal.t_size.h) { /* wrap? */ + if (EL_HAS_AUTO_MARGINS) { /* yes */ + el->el_cursor.h = 0; + el->el_cursor.v++; + if (EL_HAS_MAGIC_MARGINS) { + /* force the wrap to avoid the "magic" + * situation */ + wchar_t c; + if ((c = el->el_display[el->el_cursor.v] + [el->el_cursor.h]) != '\0') { + terminal_overwrite(el, &c, (size_t)1); + while (el->el_display[el->el_cursor.v] + [el->el_cursor.h] == MB_FILL_CHAR) + el->el_cursor.h++; + } else { + terminal__putc(el, ' '); + el->el_cursor.h = 1; + } + } + } else /* no wrap, but cursor stays on screen */ + el->el_cursor.h = el->el_terminal.t_size.h - 1; + } +} + + +/* terminal_deletechars(): + * Delete num characters + */ +libedit_private void +terminal_deletechars(EditLine *el, int num) +{ + if (num <= 0) + return; + + if (!EL_CAN_DELETE) { +#ifdef DEBUG_EDIT + (void) fprintf(el->el_errfile, " ERROR: cannot delete \n"); +#endif /* DEBUG_EDIT */ + return; + } + if (num > el->el_terminal.t_size.h) { +#ifdef DEBUG_SCREEN + (void) fprintf(el->el_errfile, + "%s: num is ridiculous: %d\r\n", __func__, num); +#endif /* DEBUG_SCREEN */ + return; + } + if (GoodStr(T_DC)) /* if I have multiple delete */ + if ((num > 1) || !GoodStr(T_dc)) { /* if dc would be more + * expen. */ + terminal_tputs(el, tgoto(Str(T_DC), num, num), num); + return; + } + if (GoodStr(T_dm)) /* if I have delete mode */ + terminal_tputs(el, Str(T_dm), 1); + + if (GoodStr(T_dc)) /* else do one at a time */ + while (num--) + terminal_tputs(el, Str(T_dc), 1); + + if (GoodStr(T_ed)) /* if I have delete mode */ + terminal_tputs(el, Str(T_ed), 1); +} + + +/* terminal_insertwrite(): + * Puts terminal in insert character mode or inserts num + * characters in the line + * Assumes MB_FILL_CHARs are present to keep column count correct + */ +libedit_private void +terminal_insertwrite(EditLine *el, wchar_t *cp, int num) +{ + if (num <= 0) + return; + if (!EL_CAN_INSERT) { +#ifdef DEBUG_EDIT + (void) fprintf(el->el_errfile, " ERROR: cannot insert \n"); +#endif /* DEBUG_EDIT */ + return; + } + if (num > el->el_terminal.t_size.h) { +#ifdef DEBUG_SCREEN + (void) fprintf(el->el_errfile, + "%s: num is ridiculous: %d\r\n", __func__, num); +#endif /* DEBUG_SCREEN */ + return; + } + if (GoodStr(T_IC)) /* if I have multiple insert */ + if ((num > 1) || !GoodStr(T_ic)) { + /* if ic would be more expensive */ + terminal_tputs(el, tgoto(Str(T_IC), num, num), num); + terminal_overwrite(el, cp, (size_t)num); + /* this updates el_cursor.h */ + return; + } + if (GoodStr(T_im) && GoodStr(T_ei)) { /* if I have insert mode */ + terminal_tputs(el, Str(T_im), 1); + + el->el_cursor.h += num; + do + terminal__putc(el, *cp++); + while (--num); + + if (GoodStr(T_ip)) /* have to make num chars insert */ + terminal_tputs(el, Str(T_ip), 1); + + terminal_tputs(el, Str(T_ei), 1); + return; + } + do { + if (GoodStr(T_ic)) /* have to make num chars insert */ + terminal_tputs(el, Str(T_ic), 1); + + terminal__putc(el, *cp++); + + el->el_cursor.h++; + + if (GoodStr(T_ip)) /* have to make num chars insert */ + terminal_tputs(el, Str(T_ip), 1); + /* pad the inserted char */ + + } while (--num); +} + + +/* terminal_clear_EOL(): + * clear to end of line. There are num characters to clear + */ +libedit_private void +terminal_clear_EOL(EditLine *el, int num) +{ + int i; + + if (EL_CAN_CEOL && GoodStr(T_ce)) + terminal_tputs(el, Str(T_ce), 1); + else { + for (i = 0; i < num; i++) + terminal__putc(el, ' '); + el->el_cursor.h += num; /* have written num spaces */ + } +} + + +/* terminal_clear_screen(): + * Clear the screen + */ +libedit_private void +terminal_clear_screen(EditLine *el) +{ /* clear the whole screen and home */ + + if (GoodStr(T_cl)) + /* send the clear screen code */ + terminal_tputs(el, Str(T_cl), Val(T_li)); + else if (GoodStr(T_ho) && GoodStr(T_cd)) { + terminal_tputs(el, Str(T_ho), Val(T_li)); /* home */ + /* clear to bottom of screen */ + terminal_tputs(el, Str(T_cd), Val(T_li)); + } else { + terminal__putc(el, '\r'); + terminal__putc(el, '\n'); + } +} + + +/* terminal_beep(): + * Beep the way the terminal wants us + */ +libedit_private void +terminal_beep(EditLine *el) +{ + if (GoodStr(T_bl)) + /* what termcap says we should use */ + terminal_tputs(el, Str(T_bl), 1); + else + terminal__putc(el, '\007'); /* an ASCII bell; ^G */ +} + + +libedit_private void +terminal_get(EditLine *el, const char **term) +{ + *term = el->el_terminal.t_name; +} + + +/* terminal_set(): + * Read in the terminal capabilities from the requested terminal + */ +libedit_private int +terminal_set(EditLine *el, const char *term) +{ + int i; + char buf[TC_BUFSIZE]; + char *area; + const struct termcapstr *t; + sigset_t oset, nset; + int lins, cols; + + (void) sigemptyset(&nset); + (void) sigaddset(&nset, SIGWINCH); + (void) sigprocmask(SIG_BLOCK, &nset, &oset); + + area = buf; + + + if (term == NULL) + term = getenv("TERM"); + + if (!term || !term[0]) + term = "dumb"; + + if (strcmp(term, "emacs") == 0) + el->el_flags |= EDIT_DISABLED; + + (void) memset(el->el_terminal.t_cap, 0, TC_BUFSIZE); + + i = tgetent(el->el_terminal.t_cap, term); + + if (i <= 0) { + if (i == -1) + (void) fprintf(el->el_errfile, + "Cannot read termcap database;\n"); + else if (i == 0) + (void) fprintf(el->el_errfile, + "No entry for terminal type \"%s\";\n", term); + (void) fprintf(el->el_errfile, + "using dumb terminal settings.\n"); + Val(T_co) = 80; /* do a dumb terminal */ + Val(T_pt) = Val(T_km) = Val(T_li) = 0; + Val(T_xt) = Val(T_MT); + for (t = tstr; t->name != NULL; t++) + terminal_alloc(el, t, NULL); + } else { + /* auto/magic margins */ + Val(T_am) = tgetflag("am"); + Val(T_xn) = tgetflag("xn"); + /* Can we tab */ + Val(T_pt) = tgetflag("pt"); + Val(T_xt) = tgetflag("xt"); + /* do we have a meta? */ + Val(T_km) = tgetflag("km"); + Val(T_MT) = tgetflag("MT"); + /* Get the size */ + Val(T_co) = tgetnum("co"); + Val(T_li) = tgetnum("li"); + for (t = tstr; t->name != NULL; t++) { + /* XXX: some systems' tgetstr needs non const */ + terminal_alloc(el, t, tgetstr(strchr(t->name, *t->name), + &area)); + } + } + + if (Val(T_co) < 2) + Val(T_co) = 80; /* just in case */ + if (Val(T_li) < 1) + Val(T_li) = 24; + + el->el_terminal.t_size.v = Val(T_co); + el->el_terminal.t_size.h = Val(T_li); + + terminal_setflags(el); + + /* get the correct window size */ + (void) terminal_get_size(el, &lins, &cols); + if (terminal_change_size(el, lins, cols) == -1) + return -1; + (void) sigprocmask(SIG_SETMASK, &oset, NULL); + terminal_bind_arrow(el); + el->el_terminal.t_name = term; + return i <= 0 ? -1 : 0; +} + + +/* terminal_get_size(): + * Return the new window size in lines and cols, and + * true if the size was changed. + */ +libedit_private int +terminal_get_size(EditLine *el, int *lins, int *cols) +{ + + *cols = Val(T_co); + *lins = Val(T_li); + +#ifdef TIOCGWINSZ + { + struct winsize ws; + if (ioctl(el->el_infd, TIOCGWINSZ, &ws) != -1) { + if (ws.ws_col) + *cols = ws.ws_col; + if (ws.ws_row) + *lins = ws.ws_row; + } + } +#endif +#ifdef TIOCGSIZE + { + struct ttysize ts; + if (ioctl(el->el_infd, TIOCGSIZE, &ts) != -1) { + if (ts.ts_cols) + *cols = ts.ts_cols; + if (ts.ts_lines) + *lins = ts.ts_lines; + } + } +#endif + return Val(T_co) != *cols || Val(T_li) != *lins; +} + + +/* terminal_change_size(): + * Change the size of the terminal + */ +libedit_private int +terminal_change_size(EditLine *el, int lins, int cols) +{ + /* + * Just in case + */ + Val(T_co) = (cols < 2) ? 80 : cols; + Val(T_li) = (lins < 1) ? 24 : lins; + + /* re-make display buffers */ + if (terminal_rebuffer_display(el) == -1) + return -1; + re_clear_display(el); + return 0; +} + + +/* terminal_init_arrow(): + * Initialize the arrow key bindings from termcap + */ +static void +terminal_init_arrow(EditLine *el) +{ + funckey_t *arrow = el->el_terminal.t_fkey; + + arrow[A_K_DN].name = L"down"; + arrow[A_K_DN].key = T_kd; + arrow[A_K_DN].fun.cmd = ED_NEXT_HISTORY; + arrow[A_K_DN].type = XK_CMD; + + arrow[A_K_UP].name = L"up"; + arrow[A_K_UP].key = T_ku; + arrow[A_K_UP].fun.cmd = ED_PREV_HISTORY; + arrow[A_K_UP].type = XK_CMD; + + arrow[A_K_LT].name = L"left"; + arrow[A_K_LT].key = T_kl; + arrow[A_K_LT].fun.cmd = ED_PREV_CHAR; + arrow[A_K_LT].type = XK_CMD; + + arrow[A_K_RT].name = L"right"; + arrow[A_K_RT].key = T_kr; + arrow[A_K_RT].fun.cmd = ED_NEXT_CHAR; + arrow[A_K_RT].type = XK_CMD; + + arrow[A_K_HO].name = L"home"; + arrow[A_K_HO].key = T_kh; + arrow[A_K_HO].fun.cmd = ED_MOVE_TO_BEG; + arrow[A_K_HO].type = XK_CMD; + + arrow[A_K_EN].name = L"end"; + arrow[A_K_EN].key = T_at7; + arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END; + arrow[A_K_EN].type = XK_CMD; + + arrow[A_K_DE].name = L"delete"; + arrow[A_K_DE].key = T_kD; + arrow[A_K_DE].fun.cmd = ED_DELETE_NEXT_CHAR; + arrow[A_K_DE].type = XK_CMD; +} + + +/* terminal_reset_arrow(): + * Reset arrow key bindings + */ +static void +terminal_reset_arrow(EditLine *el) +{ + funckey_t *arrow = el->el_terminal.t_fkey; + static const wchar_t strA[] = L"\033[A"; + static const wchar_t strB[] = L"\033[B"; + static const wchar_t strC[] = L"\033[C"; + static const wchar_t strD[] = L"\033[D"; + static const wchar_t strH[] = L"\033[H"; + static const wchar_t strF[] = L"\033[F"; + static const wchar_t stOA[] = L"\033OA"; + static const wchar_t stOB[] = L"\033OB"; + static const wchar_t stOC[] = L"\033OC"; + static const wchar_t stOD[] = L"\033OD"; + static const wchar_t stOH[] = L"\033OH"; + static const wchar_t stOF[] = L"\033OF"; + + keymacro_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type); + keymacro_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type); + keymacro_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type); + keymacro_add(el, strD, &arrow[A_K_LT].fun, arrow[A_K_LT].type); + keymacro_add(el, strH, &arrow[A_K_HO].fun, arrow[A_K_HO].type); + keymacro_add(el, strF, &arrow[A_K_EN].fun, arrow[A_K_EN].type); + keymacro_add(el, stOA, &arrow[A_K_UP].fun, arrow[A_K_UP].type); + keymacro_add(el, stOB, &arrow[A_K_DN].fun, arrow[A_K_DN].type); + keymacro_add(el, stOC, &arrow[A_K_RT].fun, arrow[A_K_RT].type); + keymacro_add(el, stOD, &arrow[A_K_LT].fun, arrow[A_K_LT].type); + keymacro_add(el, stOH, &arrow[A_K_HO].fun, arrow[A_K_HO].type); + keymacro_add(el, stOF, &arrow[A_K_EN].fun, arrow[A_K_EN].type); + + if (el->el_map.type != MAP_VI) + return; + keymacro_add(el, &strA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type); + keymacro_add(el, &strB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type); + keymacro_add(el, &strC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type); + keymacro_add(el, &strD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type); + keymacro_add(el, &strH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type); + keymacro_add(el, &strF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type); + keymacro_add(el, &stOA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type); + keymacro_add(el, &stOB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type); + keymacro_add(el, &stOC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type); + keymacro_add(el, &stOD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type); + keymacro_add(el, &stOH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type); + keymacro_add(el, &stOF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type); +} + + +/* terminal_set_arrow(): + * Set an arrow key binding + */ +libedit_private int +terminal_set_arrow(EditLine *el, const wchar_t *name, keymacro_value_t *fun, + int type) +{ + funckey_t *arrow = el->el_terminal.t_fkey; + int i; + + for (i = 0; i < A_K_NKEYS; i++) + if (wcscmp(name, arrow[i].name) == 0) { + arrow[i].fun = *fun; + arrow[i].type = type; + return 0; + } + return -1; +} + + +/* terminal_clear_arrow(): + * Clear an arrow key binding + */ +libedit_private int +terminal_clear_arrow(EditLine *el, const wchar_t *name) +{ + funckey_t *arrow = el->el_terminal.t_fkey; + int i; + + for (i = 0; i < A_K_NKEYS; i++) + if (wcscmp(name, arrow[i].name) == 0) { + arrow[i].type = XK_NOD; + return 0; + } + return -1; +} + + +/* terminal_print_arrow(): + * Print the arrow key bindings + */ +libedit_private void +terminal_print_arrow(EditLine *el, const wchar_t *name) +{ + int i; + funckey_t *arrow = el->el_terminal.t_fkey; + + for (i = 0; i < A_K_NKEYS; i++) + if (*name == '\0' || wcscmp(name, arrow[i].name) == 0) + if (arrow[i].type != XK_NOD) + keymacro_kprint(el, arrow[i].name, + &arrow[i].fun, arrow[i].type); +} + + +/* terminal_bind_arrow(): + * Bind the arrow keys + */ +libedit_private void +terminal_bind_arrow(EditLine *el) +{ + el_action_t *map; + const el_action_t *dmap; + int i, j; + char *p; + funckey_t *arrow = el->el_terminal.t_fkey; + + /* Check if the components needed are initialized */ + if (el->el_terminal.t_buf == NULL || el->el_map.key == NULL) + return; + + map = el->el_map.type == MAP_VI ? el->el_map.alt : el->el_map.key; + dmap = el->el_map.type == MAP_VI ? el->el_map.vic : el->el_map.emacs; + + terminal_reset_arrow(el); + + for (i = 0; i < A_K_NKEYS; i++) { + wchar_t wt_str[VISUAL_WIDTH_MAX]; + wchar_t *px; + size_t n; + + p = el->el_terminal.t_str[arrow[i].key]; + if (!p || !*p) + continue; + for (n = 0; n < VISUAL_WIDTH_MAX && p[n]; ++n) + wt_str[n] = p[n]; + while (n < VISUAL_WIDTH_MAX) + wt_str[n++] = '\0'; + px = wt_str; + j = (unsigned char) *p; + /* + * Assign the arrow keys only if: + * + * 1. They are multi-character arrow keys and the user + * has not re-assigned the leading character, or + * has re-assigned the leading character to be + * ED_SEQUENCE_LEAD_IN + * 2. They are single arrow keys pointing to an + * unassigned key. + */ + if (arrow[i].type == XK_NOD) + keymacro_clear(el, map, px); + else { + if (p[1] && (dmap[j] == map[j] || + map[j] == ED_SEQUENCE_LEAD_IN)) { + keymacro_add(el, px, &arrow[i].fun, + arrow[i].type); + map[j] = ED_SEQUENCE_LEAD_IN; + } else if (map[j] == ED_UNASSIGNED) { + keymacro_clear(el, map, px); + if (arrow[i].type == XK_CMD) + map[j] = arrow[i].fun.cmd; + else + keymacro_add(el, px, &arrow[i].fun, + arrow[i].type); + } + } + } +} + +/* terminal_putc(): + * Add a character + */ +static int +terminal_putc(int c) +{ + if (terminal_outfile == NULL) + return -1; + return fputc(c, terminal_outfile); +} + +static void +terminal_tputs(EditLine *el, const char *cap, int affcnt) +{ +#ifdef _REENTRANT + pthread_mutex_lock(&terminal_mutex); +#endif + terminal_outfile = el->el_outfile; + (void)tputs(cap, affcnt, terminal_putc); +#ifdef _REENTRANT + pthread_mutex_unlock(&terminal_mutex); +#endif +} + +/* terminal__putc(): + * Add a character + */ +libedit_private int +terminal__putc(EditLine *el, wint_t c) +{ + char buf[MB_LEN_MAX +1]; + ssize_t i; + if (c == (wint_t)MB_FILL_CHAR) + return 0; + i = ct_encode_char(buf, (size_t)MB_LEN_MAX, c); + if (i <= 0) + return (int)i; + buf[i] = '\0'; + return fputs(buf, el->el_outfile); +} + +/* terminal__flush(): + * Flush output + */ +libedit_private void +terminal__flush(EditLine *el) +{ + + (void) fflush(el->el_outfile); +} + +/* terminal_writec(): + * Write the given character out, in a human readable form + */ +libedit_private void +terminal_writec(EditLine *el, wint_t c) +{ + wchar_t visbuf[VISUAL_WIDTH_MAX +1]; + ssize_t vcnt = ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c); + if (vcnt < 0) + vcnt = 0; + visbuf[vcnt] = '\0'; + terminal_overwrite(el, visbuf, (size_t)vcnt); + terminal__flush(el); +} + + +/* terminal_telltc(): + * Print the current termcap characteristics + */ +libedit_private int +/*ARGSUSED*/ +terminal_telltc(EditLine *el, int argc __attribute__((__unused__)), + const wchar_t **argv __attribute__((__unused__))) +{ + const struct termcapstr *t; + char **ts; + + (void) fprintf(el->el_outfile, "\n\tYour terminal has the\n"); + (void) fprintf(el->el_outfile, "\tfollowing characteristics:\n\n"); + (void) fprintf(el->el_outfile, "\tIt has %d columns and %d lines\n", + Val(T_co), Val(T_li)); + (void) fprintf(el->el_outfile, + "\tIt has %s meta key\n", EL_HAS_META ? "a" : "no"); + (void) fprintf(el->el_outfile, + "\tIt can%suse tabs\n", EL_CAN_TAB ? " " : "not "); + (void) fprintf(el->el_outfile, "\tIt %s automatic margins\n", + EL_HAS_AUTO_MARGINS ? "has" : "does not have"); + if (EL_HAS_AUTO_MARGINS) + (void) fprintf(el->el_outfile, "\tIt %s magic margins\n", + EL_HAS_MAGIC_MARGINS ? "has" : "does not have"); + + for (t = tstr, ts = el->el_terminal.t_str; t->name != NULL; t++, ts++) { + const char *ub; + if (*ts && **ts) { + ub = ct_encode_string(ct_visual_string( + ct_decode_string(*ts, &el->el_scratch), + &el->el_visual), &el->el_scratch); + } else { + ub = "(empty)"; + } + (void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n", + t->long_name, t->name, ub); + } + (void) fputc('\n', el->el_outfile); + return 0; +} + + +/* terminal_settc(): + * Change the current terminal characteristics + */ +libedit_private int +/*ARGSUSED*/ +terminal_settc(EditLine *el, int argc __attribute__((__unused__)), + const wchar_t **argv) +{ + const struct termcapstr *ts; + const struct termcapval *tv; + char what[8], how[8]; + + if (argv == NULL || argv[1] == NULL || argv[2] == NULL) + return -1; + + strncpy(what, ct_encode_string(argv[1], &el->el_scratch), sizeof(what)); + what[sizeof(what) - 1] = '\0'; + strncpy(how, ct_encode_string(argv[2], &el->el_scratch), sizeof(how)); + how[sizeof(how) - 1] = '\0'; + + /* + * Do the strings first + */ + for (ts = tstr; ts->name != NULL; ts++) + if (strcmp(ts->name, what) == 0) + break; + + if (ts->name != NULL) { + terminal_alloc(el, ts, how); + terminal_setflags(el); + return 0; + } + /* + * Do the numeric ones second + */ + for (tv = tval; tv->name != NULL; tv++) + if (strcmp(tv->name, what) == 0) + break; + + if (tv->name != NULL) + return -1; + + if (tv == &tval[T_pt] || tv == &tval[T_km] || + tv == &tval[T_am] || tv == &tval[T_xn]) { + if (strcmp(how, "yes") == 0) + el->el_terminal.t_val[tv - tval] = 1; + else if (strcmp(how, "no") == 0) + el->el_terminal.t_val[tv - tval] = 0; + else { + (void) fprintf(el->el_errfile, + "%ls: Bad value `%s'.\n", argv[0], how); + return -1; + } + terminal_setflags(el); + if (terminal_change_size(el, Val(T_li), Val(T_co)) == -1) + return -1; + return 0; + } else { + long i; + char *ep; + + i = strtol(how, &ep, 10); + if (*ep != '\0') { + (void) fprintf(el->el_errfile, + "%ls: Bad value `%s'.\n", argv[0], how); + return -1; + } + el->el_terminal.t_val[tv - tval] = (int) i; + el->el_terminal.t_size.v = Val(T_co); + el->el_terminal.t_size.h = Val(T_li); + if (tv == &tval[T_co] || tv == &tval[T_li]) + if (terminal_change_size(el, Val(T_li), Val(T_co)) + == -1) + return -1; + return 0; + } +} + + +/* terminal_gettc(): + * Get the current terminal characteristics + */ +libedit_private int +/*ARGSUSED*/ +terminal_gettc(EditLine *el, int argc __attribute__((__unused__)), char **argv) +{ + const struct termcapstr *ts; + const struct termcapval *tv; + char *what; + void *how; + + if (argv == NULL || argv[1] == NULL || argv[2] == NULL) + return -1; + + what = argv[1]; + how = argv[2]; + + /* + * Do the strings first + */ + for (ts = tstr; ts->name != NULL; ts++) + if (strcmp(ts->name, what) == 0) + break; + + if (ts->name != NULL) { + *(char **)how = el->el_terminal.t_str[ts - tstr]; + return 0; + } + /* + * Do the numeric ones second + */ + for (tv = tval; tv->name != NULL; tv++) + if (strcmp(tv->name, what) == 0) + break; + + if (tv->name == NULL) + return -1; + + if (tv == &tval[T_pt] || tv == &tval[T_km] || + tv == &tval[T_am] || tv == &tval[T_xn]) { + static char yes[] = "yes"; + static char no[] = "no"; + if (el->el_terminal.t_val[tv - tval]) + *(char **)how = yes; + else + *(char **)how = no; + return 0; + } else { + *(int *)how = el->el_terminal.t_val[tv - tval]; + return 0; + } +} + +/* terminal_echotc(): + * Print the termcap string out with variable substitution + */ +libedit_private int +/*ARGSUSED*/ +terminal_echotc(EditLine *el, int argc __attribute__((__unused__)), + const wchar_t **argv) +{ + char *cap, *scap; + wchar_t *ep; + int arg_need, arg_cols, arg_rows; + int verbose = 0, silent = 0; + char *area; + static const char fmts[] = "%s\n", fmtd[] = "%d\n"; + const struct termcapstr *t; + char buf[TC_BUFSIZE]; + long i; + + area = buf; + + if (argv == NULL || argv[1] == NULL) + return -1; + argv++; + + if (argv[0][0] == '-') { + switch (argv[0][1]) { + case 'v': + verbose = 1; + break; + case 's': + silent = 1; + break; + default: + /* stderror(ERR_NAME | ERR_TCUSAGE); */ + break; + } + argv++; + } + if (!*argv || *argv[0] == '\0') + return 0; + if (wcscmp(*argv, L"tabs") == 0) { + (void) fprintf(el->el_outfile, fmts, EL_CAN_TAB ? "yes" : "no"); + return 0; + } else if (wcscmp(*argv, L"meta") == 0) { + (void) fprintf(el->el_outfile, fmts, Val(T_km) ? "yes" : "no"); + return 0; + } else if (wcscmp(*argv, L"xn") == 0) { + (void) fprintf(el->el_outfile, fmts, EL_HAS_MAGIC_MARGINS ? + "yes" : "no"); + return 0; + } else if (wcscmp(*argv, L"am") == 0) { + (void) fprintf(el->el_outfile, fmts, EL_HAS_AUTO_MARGINS ? + "yes" : "no"); + return 0; + } else if (wcscmp(*argv, L"baud") == 0) { + (void) fprintf(el->el_outfile, fmtd, (int)el->el_tty.t_speed); + return 0; + } else if (wcscmp(*argv, L"rows") == 0 || + wcscmp(*argv, L"lines") == 0) { + (void) fprintf(el->el_outfile, fmtd, Val(T_li)); + return 0; + } else if (wcscmp(*argv, L"cols") == 0) { + (void) fprintf(el->el_outfile, fmtd, Val(T_co)); + return 0; + } + /* + * Try to use our local definition first + */ + scap = NULL; + for (t = tstr; t->name != NULL; t++) + if (strcmp(t->name, + ct_encode_string(*argv, &el->el_scratch)) == 0) { + scap = el->el_terminal.t_str[t - tstr]; + break; + } + if (t->name == NULL) { + /* XXX: some systems' tgetstr needs non const */ + scap = tgetstr(ct_encode_string(*argv, &el->el_scratch), &area); + } + if (!scap || scap[0] == '\0') { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Termcap parameter `%ls' not found.\n", + *argv); + return -1; + } + /* + * Count home many values we need for this capability. + */ + for (cap = scap, arg_need = 0; *cap; cap++) + if (*cap == '%') + switch (*++cap) { + case 'd': + case '2': + case '3': + case '.': + case '+': + arg_need++; + break; + case '%': + case '>': + case 'i': + case 'r': + case 'n': + case 'B': + case 'D': + break; + default: + /* + * hpux has lot's of them... + */ + if (verbose) + (void) fprintf(el->el_errfile, + "echotc: Warning: unknown termcap %% `%c'.\n", + *cap); + /* This is bad, but I won't complain */ + break; + } + + switch (arg_need) { + case 0: + argv++; + if (*argv && *argv[0]) { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Warning: Extra argument `%ls'.\n", + *argv); + return -1; + } + terminal_tputs(el, scap, 1); + break; + case 1: + argv++; + if (!*argv || *argv[0] == '\0') { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Warning: Missing argument.\n"); + return -1; + } + arg_cols = 0; + i = wcstol(*argv, &ep, 10); + if (*ep != '\0' || i < 0) { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Bad value `%ls' for rows.\n", + *argv); + return -1; + } + arg_rows = (int) i; + argv++; + if (*argv && *argv[0]) { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Warning: Extra argument `%ls" + "'.\n", *argv); + return -1; + } + terminal_tputs(el, tgoto(scap, arg_cols, arg_rows), 1); + break; + default: + /* This is wrong, but I will ignore it... */ + if (verbose) + (void) fprintf(el->el_errfile, + "echotc: Warning: Too many required arguments (%d).\n", + arg_need); + /* FALLTHROUGH */ + case 2: + argv++; + if (!*argv || *argv[0] == '\0') { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Warning: Missing argument.\n"); + return -1; + } + i = wcstol(*argv, &ep, 10); + if (*ep != '\0' || i < 0) { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Bad value `%ls' for cols.\n", + *argv); + return -1; + } + arg_cols = (int) i; + argv++; + if (!*argv || *argv[0] == '\0') { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Warning: Missing argument.\n"); + return -1; + } + i = wcstol(*argv, &ep, 10); + if (*ep != '\0' || i < 0) { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Bad value `%ls' for rows.\n", + *argv); + return -1; + } + arg_rows = (int) i; + if (*ep != '\0') { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Bad value `%ls'.\n", *argv); + return -1; + } + argv++; + if (*argv && *argv[0]) { + if (!silent) + (void) fprintf(el->el_errfile, + "echotc: Warning: Extra argument `%ls" + "'.\n", *argv); + return -1; + } + terminal_tputs(el, tgoto(scap, arg_cols, arg_rows), arg_rows); + break; + } + return 0; +} diff --git a/crypto/heimdal/lib/libedit/src/tokenizer.c b/crypto/heimdal/lib/libedit/src/tokenizer.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/tokenizer.c @@ -0,0 +1,466 @@ +/* $NetBSD: tokenizer.c,v 1.28 2016/04/11 18:56:31 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)tokenizer.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: tokenizer.c,v 1.28 2016/04/11 18:56:31 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* We build this file twice, once as NARROW, once as WIDE. */ +/* + * tokenize.c: Bourne shell like tokenizer + */ +#include +#include + +#include "histedit.h" + +typedef enum { + Q_none, Q_single, Q_double, Q_one, Q_doubleone +} quote_t; + +#define TOK_KEEP 1 +#define TOK_EAT 2 + +#define WINCR 20 +#define AINCR 10 + +#define IFS STR("\t \n") + +#define tok_malloc(a) malloc(a) +#define tok_free(a) free(a) +#define tok_realloc(a, b) realloc(a, b) + +#ifdef NARROWCHAR +#define Char char +#define FUN(prefix, rest) prefix ## _ ## rest +#define TYPE(type) type +#define STR(x) x +#define Strchr(s, c) strchr(s, c) +#define tok_strdup(s) strdup(s) +#else +#define Char wchar_t +#define FUN(prefix, rest) prefix ## _w ## rest +#define TYPE(type) type ## W +#define STR(x) L ## x +#define Strchr(s, c) wcschr(s, c) +#define tok_strdup(s) wcsdup(s) +#endif + +struct TYPE(tokenizer) { + Char *ifs; /* In field separator */ + size_t argc, amax; /* Current and maximum number of args */ + Char **argv; /* Argument list */ + Char *wptr, *wmax; /* Space and limit on the word buffer */ + Char *wstart; /* Beginning of next word */ + Char *wspace; /* Space of word buffer */ + quote_t quote; /* Quoting state */ + int flags; /* flags; */ +}; + + +static void FUN(tok,finish)(TYPE(Tokenizer) *); + + +/* FUN(tok,finish)(): + * Finish a word in the tokenizer. + */ +static void +FUN(tok,finish)(TYPE(Tokenizer) *tok) +{ + + *tok->wptr = '\0'; + if ((tok->flags & TOK_KEEP) || tok->wptr != tok->wstart) { + tok->argv[tok->argc++] = tok->wstart; + tok->argv[tok->argc] = NULL; + tok->wstart = ++tok->wptr; + } + tok->flags &= ~TOK_KEEP; +} + + +/* FUN(tok,init)(): + * Initialize the tokenizer + */ +TYPE(Tokenizer) * +FUN(tok,init)(const Char *ifs) +{ + TYPE(Tokenizer) *tok = tok_malloc(sizeof(*tok)); + + if (tok == NULL) + return NULL; + tok->ifs = tok_strdup(ifs ? ifs : IFS); + if (tok->ifs == NULL) { + tok_free(tok); + return NULL; + } + tok->argc = 0; + tok->amax = AINCR; + tok->argv = tok_malloc(sizeof(*tok->argv) * tok->amax); + if (tok->argv == NULL) { + tok_free(tok->ifs); + tok_free(tok); + return NULL; + } + tok->argv[0] = NULL; + tok->wspace = tok_malloc(WINCR * sizeof(*tok->wspace)); + if (tok->wspace == NULL) { + tok_free(tok->argv); + tok_free(tok->ifs); + tok_free(tok); + return NULL; + } + tok->wmax = tok->wspace + WINCR; + tok->wstart = tok->wspace; + tok->wptr = tok->wspace; + tok->flags = 0; + tok->quote = Q_none; + + return tok; +} + + +/* FUN(tok,reset)(): + * Reset the tokenizer + */ +void +FUN(tok,reset)(TYPE(Tokenizer) *tok) +{ + + tok->argc = 0; + tok->wstart = tok->wspace; + tok->wptr = tok->wspace; + tok->flags = 0; + tok->quote = Q_none; +} + + +/* FUN(tok,end)(): + * Clean up + */ +void +FUN(tok,end)(TYPE(Tokenizer) *tok) +{ + + tok_free(tok->ifs); + tok_free(tok->wspace); + tok_free(tok->argv); + tok_free(tok); +} + + + +/* FUN(tok,line)(): + * Bourne shell (sh(1)) like tokenizing + * Arguments: + * tok current tokenizer state (setup with FUN(tok,init)()) + * line line to parse + * Returns: + * -1 Internal error + * 3 Quoted return + * 2 Unmatched double quote + * 1 Unmatched single quote + * 0 Ok + * Modifies (if return value is 0): + * argc number of arguments + * argv argument array + * cursorc if !NULL, argv element containing cursor + * cursorv if !NULL, offset in argv[cursorc] of cursor + */ +int +FUN(tok,line)(TYPE(Tokenizer) *tok, const TYPE(LineInfo) *line, + int *argc, const Char ***argv, int *cursorc, int *cursoro) +{ + const Char *ptr; + int cc, co; + + cc = co = -1; + ptr = line->buffer; + for (ptr = line->buffer; ;ptr++) { + if (ptr >= line->lastchar) + ptr = STR(""); + if (ptr == line->cursor) { + cc = (int)tok->argc; + co = (int)(tok->wptr - tok->wstart); + } + switch (*ptr) { + case '\'': + tok->flags |= TOK_KEEP; + tok->flags &= ~TOK_EAT; + switch (tok->quote) { + case Q_none: + tok->quote = Q_single; /* Enter single quote + * mode */ + break; + + case Q_single: /* Exit single quote mode */ + tok->quote = Q_none; + break; + + case Q_one: /* Quote this ' */ + tok->quote = Q_none; + *tok->wptr++ = *ptr; + break; + + case Q_double: /* Stay in double quote mode */ + *tok->wptr++ = *ptr; + break; + + case Q_doubleone: /* Quote this ' */ + tok->quote = Q_double; + *tok->wptr++ = *ptr; + break; + + default: + return -1; + } + break; + + case '"': + tok->flags &= ~TOK_EAT; + tok->flags |= TOK_KEEP; + switch (tok->quote) { + case Q_none: /* Enter double quote mode */ + tok->quote = Q_double; + break; + + case Q_double: /* Exit double quote mode */ + tok->quote = Q_none; + break; + + case Q_one: /* Quote this " */ + tok->quote = Q_none; + *tok->wptr++ = *ptr; + break; + + case Q_single: /* Stay in single quote mode */ + *tok->wptr++ = *ptr; + break; + + case Q_doubleone: /* Quote this " */ + tok->quote = Q_double; + *tok->wptr++ = *ptr; + break; + + default: + return -1; + } + break; + + case '\\': + tok->flags |= TOK_KEEP; + tok->flags &= ~TOK_EAT; + switch (tok->quote) { + case Q_none: /* Quote next character */ + tok->quote = Q_one; + break; + + case Q_double: /* Quote next character */ + tok->quote = Q_doubleone; + break; + + case Q_one: /* Quote this, restore state */ + *tok->wptr++ = *ptr; + tok->quote = Q_none; + break; + + case Q_single: /* Stay in single quote mode */ + *tok->wptr++ = *ptr; + break; + + case Q_doubleone: /* Quote this \ */ + tok->quote = Q_double; + *tok->wptr++ = *ptr; + break; + + default: + return -1; + } + break; + + case '\n': + tok->flags &= ~TOK_EAT; + switch (tok->quote) { + case Q_none: + goto tok_line_outok; + + case Q_single: + case Q_double: + *tok->wptr++ = *ptr; /* Add the return */ + break; + + case Q_doubleone: /* Back to double, eat the '\n' */ + tok->flags |= TOK_EAT; + tok->quote = Q_double; + break; + + case Q_one: /* No quote, more eat the '\n' */ + tok->flags |= TOK_EAT; + tok->quote = Q_none; + break; + + default: + return 0; + } + break; + + case '\0': + switch (tok->quote) { + case Q_none: + /* Finish word and return */ + if (tok->flags & TOK_EAT) { + tok->flags &= ~TOK_EAT; + return 3; + } + goto tok_line_outok; + + case Q_single: + return 1; + + case Q_double: + return 2; + + case Q_doubleone: + tok->quote = Q_double; + *tok->wptr++ = *ptr; + break; + + case Q_one: + tok->quote = Q_none; + *tok->wptr++ = *ptr; + break; + + default: + return -1; + } + break; + + default: + tok->flags &= ~TOK_EAT; + switch (tok->quote) { + case Q_none: + if (Strchr(tok->ifs, *ptr) != NULL) + FUN(tok,finish)(tok); + else + *tok->wptr++ = *ptr; + break; + + case Q_single: + case Q_double: + *tok->wptr++ = *ptr; + break; + + + case Q_doubleone: + *tok->wptr++ = '\\'; + tok->quote = Q_double; + *tok->wptr++ = *ptr; + break; + + case Q_one: + tok->quote = Q_none; + *tok->wptr++ = *ptr; + break; + + default: + return -1; + + } + break; + } + + if (tok->wptr >= tok->wmax - 4) { + size_t size = (size_t)(tok->wmax - tok->wspace + WINCR); + Char *s = tok_realloc(tok->wspace, + size * sizeof(*s)); + if (s == NULL) + return -1; + + if (s != tok->wspace) { + size_t i; + for (i = 0; i < tok->argc; i++) { + tok->argv[i] = + (tok->argv[i] - tok->wspace) + s; + } + tok->wptr = (tok->wptr - tok->wspace) + s; + tok->wstart = (tok->wstart - tok->wspace) + s; + tok->wspace = s; + } + tok->wmax = s + size; + } + if (tok->argc >= tok->amax - 4) { + Char **p; + tok->amax += AINCR; + p = tok_realloc(tok->argv, tok->amax * sizeof(*p)); + if (p == NULL) { + tok->amax -= AINCR; + return -1; + } + tok->argv = p; + } + } + tok_line_outok: + if (cc == -1 && co == -1) { + cc = (int)tok->argc; + co = (int)(tok->wptr - tok->wstart); + } + if (cursorc != NULL) + *cursorc = cc; + if (cursoro != NULL) + *cursoro = co; + FUN(tok,finish)(tok); + *argv = (const Char **)tok->argv; + *argc = (int)tok->argc; + return 0; +} + +/* FUN(tok,str)(): + * Simpler version of tok_line, taking a NUL terminated line + * and splitting into words, ignoring cursor state. + */ +int +FUN(tok,str)(TYPE(Tokenizer) *tok, const Char *line, int *argc, + const Char ***argv) +{ + TYPE(LineInfo) li; + + memset(&li, 0, sizeof(li)); + li.buffer = line; + li.cursor = li.lastchar = Strchr(line, '\0'); + return FUN(tok,line)(tok, &li, argc, argv, NULL, NULL); +} diff --git a/crypto/heimdal/lib/libedit/src/tokenizern.c b/crypto/heimdal/lib/libedit/src/tokenizern.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/tokenizern.c @@ -0,0 +1,3 @@ +#include "config.h" +#define NARROWCHAR +#include "tokenizer.c" diff --git a/crypto/heimdal/lib/libedit/src/tty.h b/crypto/heimdal/lib/libedit/src/tty.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/tty.h @@ -0,0 +1,481 @@ +/* $NetBSD: tty.h,v 1.21 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)tty.h 8.1 (Berkeley) 6/4/93 + */ + +/* + * el.tty.h: Local terminal header + */ +#ifndef _h_el_tty +#define _h_el_tty + +#include +#include + +/* Define our own since everyone gets it wrong! */ +#define CONTROL(A) ((A) & 037) + +/* + * Aix compatible names + */ +# if defined(VWERSE) && !defined(VWERASE) +# define VWERASE VWERSE +# endif /* VWERSE && !VWERASE */ + +# if defined(VDISCRD) && !defined(VDISCARD) +# define VDISCARD VDISCRD +# endif /* VDISCRD && !VDISCARD */ + +# if defined(VFLUSHO) && !defined(VDISCARD) +# define VDISCARD VFLUSHO +# endif /* VFLUSHO && VDISCARD */ + +# if defined(VSTRT) && !defined(VSTART) +# define VSTART VSTRT +# endif /* VSTRT && ! VSTART */ + +# if defined(VSTAT) && !defined(VSTATUS) +# define VSTATUS VSTAT +# endif /* VSTAT && ! VSTATUS */ + +# ifndef ONLRET +# define ONLRET 0 +# endif /* ONLRET */ + +# ifndef TAB3 +# ifdef OXTABS +# define TAB3 OXTABS +# else +# define TAB3 0 +# endif /* OXTABS */ +# endif /* !TAB3 */ + +# if defined(OXTABS) && !defined(XTABS) +# define XTABS OXTABS +# endif /* OXTABS && !XTABS */ + +# ifndef ONLCR +# define ONLCR 0 +# endif /* ONLCR */ + +# ifndef IEXTEN +# define IEXTEN 0 +# endif /* IEXTEN */ + +# ifndef ECHOCTL +# define ECHOCTL 0 +# endif /* ECHOCTL */ + +# ifndef PARENB +# define PARENB 0 +# endif /* PARENB */ + +# ifndef EXTPROC +# define EXTPROC 0 +# endif /* EXTPROC */ + +# ifndef FLUSHO +# define FLUSHO 0 +# endif /* FLUSHO */ + + +# if defined(VDISABLE) && !defined(_POSIX_VDISABLE) +# define _POSIX_VDISABLE VDISABLE +# endif /* VDISABLE && ! _POSIX_VDISABLE */ + +/* + * Work around ISC's definition of IEXTEN which is + * XCASE! + */ +# ifdef ISC +# if defined(IEXTEN) && defined(XCASE) +# if IEXTEN == XCASE +# undef IEXTEN +# define IEXTEN 0 +# endif /* IEXTEN == XCASE */ +# endif /* IEXTEN && XCASE */ +# if defined(IEXTEN) && !defined(XCASE) +# define XCASE IEXTEN +# undef IEXTEN +# define IEXTEN 0 +# endif /* IEXTEN && !XCASE */ +# endif /* ISC */ + +/* + * Work around convex weirdness where turning off IEXTEN makes us + * lose all postprocessing! + */ +#if defined(convex) || defined(__convex__) +# if defined(IEXTEN) && IEXTEN != 0 +# undef IEXTEN +# define IEXTEN 0 +# endif /* IEXTEN != 0 */ +#endif /* convex || __convex__ */ + +/* + * So that we don't lose job control. + */ +#ifdef __SVR4 +# undef CSWTCH +#endif + +#ifndef _POSIX_VDISABLE +# define _POSIX_VDISABLE ((unsigned char) -1) +#endif /* _POSIX_VDISABLE */ + +#if !defined(CREPRINT) && defined(CRPRNT) +# define CREPRINT CRPRNT +#endif /* !CREPRINT && CRPRNT */ +#if !defined(CDISCARD) && defined(CFLUSH) +# define CDISCARD CFLUSH +#endif /* !CDISCARD && CFLUSH */ + +#ifndef CINTR +# define CINTR CONTROL('c') +#endif /* CINTR */ +#ifndef CQUIT +# define CQUIT 034 /* ^\ */ +#endif /* CQUIT */ +#ifndef CERASE +# define CERASE 0177 /* ^? */ +#endif /* CERASE */ +#ifndef CKILL +# define CKILL CONTROL('u') +#endif /* CKILL */ +#ifndef CEOF +# define CEOF CONTROL('d') +#endif /* CEOF */ +#ifndef CEOL +# define CEOL _POSIX_VDISABLE +#endif /* CEOL */ +#ifndef CEOL2 +# define CEOL2 _POSIX_VDISABLE +#endif /* CEOL2 */ +#ifndef CSWTCH +# define CSWTCH _POSIX_VDISABLE +#endif /* CSWTCH */ +#ifndef CDSWTCH +# define CDSWTCH _POSIX_VDISABLE +#endif /* CDSWTCH */ +#ifndef CERASE2 +# define CERASE2 _POSIX_VDISABLE +#endif /* CERASE2 */ +#ifndef CSTART +# define CSTART CONTROL('q') +#endif /* CSTART */ +#ifndef CSTOP +# define CSTOP CONTROL('s') +#endif /* CSTOP */ +#ifndef CSUSP +# define CSUSP CONTROL('z') +#endif /* CSUSP */ +#ifndef CDSUSP +# define CDSUSP CONTROL('y') +#endif /* CDSUSP */ + +#ifdef hpux + +# ifndef CREPRINT +# define CREPRINT _POSIX_VDISABLE +# endif /* CREPRINT */ +# ifndef CDISCARD +# define CDISCARD _POSIX_VDISABLE +# endif /* CDISCARD */ +# ifndef CLNEXT +# define CLNEXT _POSIX_VDISABLE +# endif /* CLNEXT */ +# ifndef CWERASE +# define CWERASE _POSIX_VDISABLE +# endif /* CWERASE */ + +#else /* !hpux */ + +# ifndef CREPRINT +# define CREPRINT CONTROL('r') +# endif /* CREPRINT */ +# ifndef CDISCARD +# define CDISCARD CONTROL('o') +# endif /* CDISCARD */ +# ifndef CLNEXT +# define CLNEXT CONTROL('v') +# endif /* CLNEXT */ +# ifndef CWERASE +# define CWERASE CONTROL('w') +# endif /* CWERASE */ + +#endif /* hpux */ + +#ifndef CSTATUS +# define CSTATUS CONTROL('t') +#endif /* CSTATUS */ +#ifndef CPAGE +# define CPAGE ' ' +#endif /* CPAGE */ +#ifndef CPGOFF +# define CPGOFF CONTROL('m') +#endif /* CPGOFF */ +#ifndef CKILL2 +# define CKILL2 _POSIX_VDISABLE +#endif /* CKILL2 */ +#ifndef CBRK +# ifndef masscomp +# define CBRK 0377 +# else +# define CBRK '\0' +# endif /* masscomp */ +#endif /* CBRK */ +#ifndef CMIN +# define CMIN CEOF +#endif /* CMIN */ +#ifndef CTIME +# define CTIME CEOL +#endif /* CTIME */ + +/* + * Fix for sun inconsistency. On termio VSUSP and the rest of the + * ttychars > NCC are defined. So we undefine them. + */ +#if defined(TERMIO) || defined(POSIX) +# if defined(POSIX) && defined(NCCS) +# define NUMCC NCCS +# else +# ifdef NCC +# define NUMCC NCC +# endif /* NCC */ +# endif /* POSIX && NCCS */ +# ifdef NUMCC +# ifdef VINTR +# if NUMCC <= VINTR +# undef VINTR +# endif /* NUMCC <= VINTR */ +# endif /* VINTR */ +# ifdef VQUIT +# if NUMCC <= VQUIT +# undef VQUIT +# endif /* NUMCC <= VQUIT */ +# endif /* VQUIT */ +# ifdef VERASE +# if NUMCC <= VERASE +# undef VERASE +# endif /* NUMCC <= VERASE */ +# endif /* VERASE */ +# ifdef VKILL +# if NUMCC <= VKILL +# undef VKILL +# endif /* NUMCC <= VKILL */ +# endif /* VKILL */ +# ifdef VEOF +# if NUMCC <= VEOF +# undef VEOF +# endif /* NUMCC <= VEOF */ +# endif /* VEOF */ +# ifdef VEOL +# if NUMCC <= VEOL +# undef VEOL +# endif /* NUMCC <= VEOL */ +# endif /* VEOL */ +# ifdef VEOL2 +# if NUMCC <= VEOL2 +# undef VEOL2 +# endif /* NUMCC <= VEOL2 */ +# endif /* VEOL2 */ +# ifdef VSWTCH +# if NUMCC <= VSWTCH +# undef VSWTCH +# endif /* NUMCC <= VSWTCH */ +# endif /* VSWTCH */ +# ifdef VDSWTCH +# if NUMCC <= VDSWTCH +# undef VDSWTCH +# endif /* NUMCC <= VDSWTCH */ +# endif /* VDSWTCH */ +# ifdef VERASE2 +# if NUMCC <= VERASE2 +# undef VERASE2 +# endif /* NUMCC <= VERASE2 */ +# endif /* VERASE2 */ +# ifdef VSTART +# if NUMCC <= VSTART +# undef VSTART +# endif /* NUMCC <= VSTART */ +# endif /* VSTART */ +# ifdef VSTOP +# if NUMCC <= VSTOP +# undef VSTOP +# endif /* NUMCC <= VSTOP */ +# endif /* VSTOP */ +# ifdef VWERASE +# if NUMCC <= VWERASE +# undef VWERASE +# endif /* NUMCC <= VWERASE */ +# endif /* VWERASE */ +# ifdef VSUSP +# if NUMCC <= VSUSP +# undef VSUSP +# endif /* NUMCC <= VSUSP */ +# endif /* VSUSP */ +# ifdef VDSUSP +# if NUMCC <= VDSUSP +# undef VDSUSP +# endif /* NUMCC <= VDSUSP */ +# endif /* VDSUSP */ +# ifdef VREPRINT +# if NUMCC <= VREPRINT +# undef VREPRINT +# endif /* NUMCC <= VREPRINT */ +# endif /* VREPRINT */ +# ifdef VDISCARD +# if NUMCC <= VDISCARD +# undef VDISCARD +# endif /* NUMCC <= VDISCARD */ +# endif /* VDISCARD */ +# ifdef VLNEXT +# if NUMCC <= VLNEXT +# undef VLNEXT +# endif /* NUMCC <= VLNEXT */ +# endif /* VLNEXT */ +# ifdef VSTATUS +# if NUMCC <= VSTATUS +# undef VSTATUS +# endif /* NUMCC <= VSTATUS */ +# endif /* VSTATUS */ +# ifdef VPAGE +# if NUMCC <= VPAGE +# undef VPAGE +# endif /* NUMCC <= VPAGE */ +# endif /* VPAGE */ +# ifdef VPGOFF +# if NUMCC <= VPGOFF +# undef VPGOFF +# endif /* NUMCC <= VPGOFF */ +# endif /* VPGOFF */ +# ifdef VKILL2 +# if NUMCC <= VKILL2 +# undef VKILL2 +# endif /* NUMCC <= VKILL2 */ +# endif /* VKILL2 */ +# ifdef VBRK +# if NUMCC <= VBRK +# undef VBRK +# endif /* NUMCC <= VBRK */ +# endif /* VBRK */ +# ifdef VMIN +# if NUMCC <= VMIN +# undef VMIN +# endif /* NUMCC <= VMIN */ +# endif /* VMIN */ +# ifdef VTIME +# if NUMCC <= VTIME +# undef VTIME +# endif /* NUMCC <= VTIME */ +# endif /* VTIME */ +# endif /* NUMCC */ +#endif /* !POSIX */ + +#define C_INTR 0 +#define C_QUIT 1 +#define C_ERASE 2 +#define C_KILL 3 +#define C_EOF 4 +#define C_EOL 5 +#define C_EOL2 6 +#define C_SWTCH 7 +#define C_DSWTCH 8 +#define C_ERASE2 9 +#define C_START 10 +#define C_STOP 11 +#define C_WERASE 12 +#define C_SUSP 13 +#define C_DSUSP 14 +#define C_REPRINT 15 +#define C_DISCARD 16 +#define C_LNEXT 17 +#define C_STATUS 18 +#define C_PAGE 19 +#define C_PGOFF 20 +#define C_KILL2 21 +#define C_BRK 22 +#define C_MIN 23 +#define C_TIME 24 +#define C_NCC 25 +#define C_SH(A) ((unsigned int)(1 << (A))) + +/* + * Terminal dependend data structures + */ +#define EX_IO 0 /* while we are executing */ +#define ED_IO 1 /* while we are editing */ +#define TS_IO 2 /* new mode from terminal */ +#define QU_IO 2 /* used only for quoted chars */ +#define NN_IO 3 /* The number of entries */ + +/* Don't re-order */ +#define MD_INP 0 +#define MD_OUT 1 +#define MD_CTL 2 +#define MD_LIN 3 +#define MD_CHAR 4 +#define MD_NN 5 + +typedef struct { + const char *t_name; + unsigned int t_setmask; + unsigned int t_clrmask; +} ttyperm_t[NN_IO][MD_NN]; + +typedef unsigned char ttychar_t[NN_IO][C_NCC]; + +libedit_private int tty_init(EditLine *); +libedit_private void tty_end(EditLine *); +libedit_private int tty_stty(EditLine *, int, const wchar_t **); +libedit_private int tty_rawmode(EditLine *); +libedit_private int tty_cookedmode(EditLine *); +libedit_private int tty_quotemode(EditLine *); +libedit_private int tty_noquotemode(EditLine *); +libedit_private void tty_bind_char(EditLine *, int); + +typedef struct { + ttyperm_t t_t; + ttychar_t t_c; + struct termios t_or, t_ex, t_ed, t_ts; + int t_tabs; + int t_eight; + speed_t t_speed; + unsigned char t_mode; + unsigned char t_vdisable; + unsigned char t_initialized; +} el_tty_t; + + +#endif /* _h_el_tty */ diff --git a/crypto/heimdal/lib/libedit/src/tty.c b/crypto/heimdal/lib/libedit/src/tty.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/tty.c @@ -0,0 +1,1342 @@ +/* $NetBSD: tty.c,v 1.65 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: tty.c,v 1.65 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * tty.c: tty interface stuff + */ +#include +#include +#include /* for abort */ +#include +#include /* for ffs */ +#include /* for isatty */ + +#include "el.h" +#include "fcns.h" +#include "parse.h" + +typedef struct ttymodes_t { + const char *m_name; + unsigned int m_value; + int m_type; +} ttymodes_t; + +typedef struct ttymap_t { + wint_t nch, och; /* Internal and termio rep of chars */ + el_action_t bind[3]; /* emacs, vi, and vi-cmd */ +} ttymap_t; + + +static const ttyperm_t ttyperm = { + { + {"iflag:", ICRNL, (INLCR | IGNCR)}, + {"oflag:", (OPOST | ONLCR), ONLRET}, + {"cflag:", 0, 0}, + {"lflag:", (ISIG | ICANON | ECHO | ECHOE | ECHOCTL | IEXTEN), + (NOFLSH | ECHONL | EXTPROC | FLUSHO)}, + {"chars:", 0, 0}, + }, + { + {"iflag:", (INLCR | ICRNL), IGNCR}, + {"oflag:", (OPOST | ONLCR), ONLRET}, + {"cflag:", 0, 0}, + {"lflag:", ISIG, + (NOFLSH | ICANON | ECHO | ECHOK | ECHONL | EXTPROC | IEXTEN | FLUSHO)}, + {"chars:", (C_SH(C_MIN) | C_SH(C_TIME) | C_SH(C_SWTCH) | C_SH(C_DSWTCH) | + C_SH(C_SUSP) | C_SH(C_DSUSP) | C_SH(C_EOL) | C_SH(C_DISCARD) | + C_SH(C_PGOFF) | C_SH(C_PAGE) | C_SH(C_STATUS)), 0} + }, + { + {"iflag:", 0, IXON | IXOFF | INLCR | ICRNL}, + {"oflag:", 0, 0}, + {"cflag:", 0, 0}, + {"lflag:", 0, ISIG | IEXTEN}, + {"chars:", 0, 0}, + } +}; + +static const ttychar_t ttychar = { + { + CINTR, CQUIT, CERASE, CKILL, + CEOF, CEOL, CEOL2, CSWTCH, + CDSWTCH, CERASE2, CSTART, CSTOP, + CWERASE, CSUSP, CDSUSP, CREPRINT, + CDISCARD, CLNEXT, CSTATUS, CPAGE, + CPGOFF, CKILL2, CBRK, CMIN, + CTIME + }, + { + CINTR, CQUIT, CERASE, CKILL, + _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, + _POSIX_VDISABLE, CERASE2, CSTART, CSTOP, + _POSIX_VDISABLE, CSUSP, _POSIX_VDISABLE, _POSIX_VDISABLE, + CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, + _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1, + 0 + }, + { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0 + } +}; + +static const ttymap_t tty_map[] = { +#ifdef VERASE + {C_ERASE, VERASE, + {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, +#endif /* VERASE */ +#ifdef VERASE2 + {C_ERASE2, VERASE2, + {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, +#endif /* VERASE2 */ +#ifdef VKILL + {C_KILL, VKILL, + {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}}, +#endif /* VKILL */ +#ifdef VKILL2 + {C_KILL2, VKILL2, + {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}}, +#endif /* VKILL2 */ +#ifdef VEOF + {C_EOF, VEOF, + {EM_DELETE_OR_LIST, VI_LIST_OR_EOF, ED_UNASSIGNED}}, +#endif /* VEOF */ +#ifdef VWERASE + {C_WERASE, VWERASE, + {ED_DELETE_PREV_WORD, ED_DELETE_PREV_WORD, ED_PREV_WORD}}, +#endif /* VWERASE */ +#ifdef VREPRINT + {C_REPRINT, VREPRINT, + {ED_REDISPLAY, ED_INSERT, ED_REDISPLAY}}, +#endif /* VREPRINT */ +#ifdef VLNEXT + {C_LNEXT, VLNEXT, + {ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}}, +#endif /* VLNEXT */ + {(wint_t)-1, (wint_t)-1, + {ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}} +}; + +static const ttymodes_t ttymodes[] = { +#ifdef IGNBRK + {"ignbrk", IGNBRK, MD_INP}, +#endif /* IGNBRK */ +#ifdef BRKINT + {"brkint", BRKINT, MD_INP}, +#endif /* BRKINT */ +#ifdef IGNPAR + {"ignpar", IGNPAR, MD_INP}, +#endif /* IGNPAR */ +#ifdef PARMRK + {"parmrk", PARMRK, MD_INP}, +#endif /* PARMRK */ +#ifdef INPCK + {"inpck", INPCK, MD_INP}, +#endif /* INPCK */ +#ifdef ISTRIP + {"istrip", ISTRIP, MD_INP}, +#endif /* ISTRIP */ +#ifdef INLCR + {"inlcr", INLCR, MD_INP}, +#endif /* INLCR */ +#ifdef IGNCR + {"igncr", IGNCR, MD_INP}, +#endif /* IGNCR */ +#ifdef ICRNL + {"icrnl", ICRNL, MD_INP}, +#endif /* ICRNL */ +#ifdef IUCLC + {"iuclc", IUCLC, MD_INP}, +#endif /* IUCLC */ +#ifdef IXON + {"ixon", IXON, MD_INP}, +#endif /* IXON */ +#ifdef IXANY + {"ixany", IXANY, MD_INP}, +#endif /* IXANY */ +#ifdef IXOFF + {"ixoff", IXOFF, MD_INP}, +#endif /* IXOFF */ +#ifdef IMAXBEL + {"imaxbel", IMAXBEL, MD_INP}, +#endif /* IMAXBEL */ + +#ifdef OPOST + {"opost", OPOST, MD_OUT}, +#endif /* OPOST */ +#ifdef OLCUC + {"olcuc", OLCUC, MD_OUT}, +#endif /* OLCUC */ +#ifdef ONLCR + {"onlcr", ONLCR, MD_OUT}, +#endif /* ONLCR */ +#ifdef OCRNL + {"ocrnl", OCRNL, MD_OUT}, +#endif /* OCRNL */ +#ifdef ONOCR + {"onocr", ONOCR, MD_OUT}, +#endif /* ONOCR */ +#ifdef ONOEOT + {"onoeot", ONOEOT, MD_OUT}, +#endif /* ONOEOT */ +#ifdef ONLRET + {"onlret", ONLRET, MD_OUT}, +#endif /* ONLRET */ +#ifdef OFILL + {"ofill", OFILL, MD_OUT}, +#endif /* OFILL */ +#ifdef OFDEL + {"ofdel", OFDEL, MD_OUT}, +#endif /* OFDEL */ +#ifdef NLDLY + {"nldly", NLDLY, MD_OUT}, +#endif /* NLDLY */ +#ifdef CRDLY + {"crdly", CRDLY, MD_OUT}, +#endif /* CRDLY */ +#ifdef TABDLY + {"tabdly", TABDLY, MD_OUT}, +#endif /* TABDLY */ +#ifdef XTABS + {"xtabs", XTABS, MD_OUT}, +#endif /* XTABS */ +#ifdef BSDLY + {"bsdly", BSDLY, MD_OUT}, +#endif /* BSDLY */ +#ifdef VTDLY + {"vtdly", VTDLY, MD_OUT}, +#endif /* VTDLY */ +#ifdef FFDLY + {"ffdly", FFDLY, MD_OUT}, +#endif /* FFDLY */ +#ifdef PAGEOUT + {"pageout", PAGEOUT, MD_OUT}, +#endif /* PAGEOUT */ +#ifdef WRAP + {"wrap", WRAP, MD_OUT}, +#endif /* WRAP */ + +#ifdef CIGNORE + {"cignore", CIGNORE, MD_CTL}, +#endif /* CBAUD */ +#ifdef CBAUD + {"cbaud", CBAUD, MD_CTL}, +#endif /* CBAUD */ +#ifdef CSTOPB + {"cstopb", CSTOPB, MD_CTL}, +#endif /* CSTOPB */ +#ifdef CREAD + {"cread", CREAD, MD_CTL}, +#endif /* CREAD */ +#ifdef PARENB + {"parenb", PARENB, MD_CTL}, +#endif /* PARENB */ +#ifdef PARODD + {"parodd", PARODD, MD_CTL}, +#endif /* PARODD */ +#ifdef HUPCL + {"hupcl", HUPCL, MD_CTL}, +#endif /* HUPCL */ +#ifdef CLOCAL + {"clocal", CLOCAL, MD_CTL}, +#endif /* CLOCAL */ +#ifdef LOBLK + {"loblk", LOBLK, MD_CTL}, +#endif /* LOBLK */ +#ifdef CIBAUD + {"cibaud", CIBAUD, MD_CTL}, +#endif /* CIBAUD */ +#ifdef CRTSCTS +#ifdef CCTS_OFLOW + {"ccts_oflow", CCTS_OFLOW, MD_CTL}, +#else + {"crtscts", CRTSCTS, MD_CTL}, +#endif /* CCTS_OFLOW */ +#endif /* CRTSCTS */ +#ifdef CRTS_IFLOW + {"crts_iflow", CRTS_IFLOW, MD_CTL}, +#endif /* CRTS_IFLOW */ +#ifdef CDTRCTS + {"cdtrcts", CDTRCTS, MD_CTL}, +#endif /* CDTRCTS */ +#ifdef MDMBUF + {"mdmbuf", MDMBUF, MD_CTL}, +#endif /* MDMBUF */ +#ifdef RCV1EN + {"rcv1en", RCV1EN, MD_CTL}, +#endif /* RCV1EN */ +#ifdef XMT1EN + {"xmt1en", XMT1EN, MD_CTL}, +#endif /* XMT1EN */ + +#ifdef ISIG + {"isig", ISIG, MD_LIN}, +#endif /* ISIG */ +#ifdef ICANON + {"icanon", ICANON, MD_LIN}, +#endif /* ICANON */ +#ifdef XCASE + {"xcase", XCASE, MD_LIN}, +#endif /* XCASE */ +#ifdef ECHO + {"echo", ECHO, MD_LIN}, +#endif /* ECHO */ +#ifdef ECHOE + {"echoe", ECHOE, MD_LIN}, +#endif /* ECHOE */ +#ifdef ECHOK + {"echok", ECHOK, MD_LIN}, +#endif /* ECHOK */ +#ifdef ECHONL + {"echonl", ECHONL, MD_LIN}, +#endif /* ECHONL */ +#ifdef NOFLSH + {"noflsh", NOFLSH, MD_LIN}, +#endif /* NOFLSH */ +#ifdef TOSTOP + {"tostop", TOSTOP, MD_LIN}, +#endif /* TOSTOP */ +#ifdef ECHOCTL + {"echoctl", ECHOCTL, MD_LIN}, +#endif /* ECHOCTL */ +#ifdef ECHOPRT + {"echoprt", ECHOPRT, MD_LIN}, +#endif /* ECHOPRT */ +#ifdef ECHOKE + {"echoke", ECHOKE, MD_LIN}, +#endif /* ECHOKE */ +#ifdef DEFECHO + {"defecho", DEFECHO, MD_LIN}, +#endif /* DEFECHO */ +#ifdef FLUSHO + {"flusho", FLUSHO, MD_LIN}, +#endif /* FLUSHO */ +#ifdef PENDIN + {"pendin", PENDIN, MD_LIN}, +#endif /* PENDIN */ +#ifdef IEXTEN + {"iexten", IEXTEN, MD_LIN}, +#endif /* IEXTEN */ +#ifdef NOKERNINFO + {"nokerninfo", NOKERNINFO, MD_LIN}, +#endif /* NOKERNINFO */ +#ifdef ALTWERASE + {"altwerase", ALTWERASE, MD_LIN}, +#endif /* ALTWERASE */ +#ifdef EXTPROC + {"extproc", EXTPROC, MD_LIN}, +#endif /* EXTPROC */ + +#if defined(VINTR) + {"intr", C_SH(C_INTR), MD_CHAR}, +#endif /* VINTR */ +#if defined(VQUIT) + {"quit", C_SH(C_QUIT), MD_CHAR}, +#endif /* VQUIT */ +#if defined(VERASE) + {"erase", C_SH(C_ERASE), MD_CHAR}, +#endif /* VERASE */ +#if defined(VKILL) + {"kill", C_SH(C_KILL), MD_CHAR}, +#endif /* VKILL */ +#if defined(VEOF) + {"eof", C_SH(C_EOF), MD_CHAR}, +#endif /* VEOF */ +#if defined(VEOL) + {"eol", C_SH(C_EOL), MD_CHAR}, +#endif /* VEOL */ +#if defined(VEOL2) + {"eol2", C_SH(C_EOL2), MD_CHAR}, +#endif /* VEOL2 */ +#if defined(VSWTCH) + {"swtch", C_SH(C_SWTCH), MD_CHAR}, +#endif /* VSWTCH */ +#if defined(VDSWTCH) + {"dswtch", C_SH(C_DSWTCH), MD_CHAR}, +#endif /* VDSWTCH */ +#if defined(VERASE2) + {"erase2", C_SH(C_ERASE2), MD_CHAR}, +#endif /* VERASE2 */ +#if defined(VSTART) + {"start", C_SH(C_START), MD_CHAR}, +#endif /* VSTART */ +#if defined(VSTOP) + {"stop", C_SH(C_STOP), MD_CHAR}, +#endif /* VSTOP */ +#if defined(VWERASE) + {"werase", C_SH(C_WERASE), MD_CHAR}, +#endif /* VWERASE */ +#if defined(VSUSP) + {"susp", C_SH(C_SUSP), MD_CHAR}, +#endif /* VSUSP */ +#if defined(VDSUSP) + {"dsusp", C_SH(C_DSUSP), MD_CHAR}, +#endif /* VDSUSP */ +#if defined(VREPRINT) + {"reprint", C_SH(C_REPRINT), MD_CHAR}, +#endif /* VREPRINT */ +#if defined(VDISCARD) + {"discard", C_SH(C_DISCARD), MD_CHAR}, +#endif /* VDISCARD */ +#if defined(VLNEXT) + {"lnext", C_SH(C_LNEXT), MD_CHAR}, +#endif /* VLNEXT */ +#if defined(VSTATUS) + {"status", C_SH(C_STATUS), MD_CHAR}, +#endif /* VSTATUS */ +#if defined(VPAGE) + {"page", C_SH(C_PAGE), MD_CHAR}, +#endif /* VPAGE */ +#if defined(VPGOFF) + {"pgoff", C_SH(C_PGOFF), MD_CHAR}, +#endif /* VPGOFF */ +#if defined(VKILL2) + {"kill2", C_SH(C_KILL2), MD_CHAR}, +#endif /* VKILL2 */ +#if defined(VBRK) + {"brk", C_SH(C_BRK), MD_CHAR}, +#endif /* VBRK */ +#if defined(VMIN) + {"min", C_SH(C_MIN), MD_CHAR}, +#endif /* VMIN */ +#if defined(VTIME) + {"time", C_SH(C_TIME), MD_CHAR}, +#endif /* VTIME */ + {NULL, 0, -1}, +}; + + + +#define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1) +#define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8) +#define tty__cooked_mode(td) ((td)->c_lflag & ICANON) + +static int tty_getty(EditLine *, struct termios *); +static int tty_setty(EditLine *, int, const struct termios *); +static int tty__getcharindex(int); +static void tty__getchar(struct termios *, unsigned char *); +static void tty__setchar(struct termios *, unsigned char *); +static speed_t tty__getspeed(struct termios *); +static int tty_setup(EditLine *); +static void tty_setup_flags(EditLine *, struct termios *, int); + +#define t_qu t_ts + +/* tty_getty(): + * Wrapper for tcgetattr to handle EINTR + */ +static int +tty_getty(EditLine *el, struct termios *t) +{ + int rv; + while ((rv = tcgetattr(el->el_infd, t)) == -1 && errno == EINTR) + continue; + return rv; +} + +/* tty_setty(): + * Wrapper for tcsetattr to handle EINTR + */ +static int +tty_setty(EditLine *el, int action, const struct termios *t) +{ + int rv; + while ((rv = tcsetattr(el->el_infd, action, t)) == -1 && errno == EINTR) + continue; + return rv; +} + +/* tty_setup(): + * Get the tty parameters and initialize the editing state + */ +static int +tty_setup(EditLine *el) +{ + int rst = 1; + + if (el->el_flags & EDIT_DISABLED) + return 0; + + if (el->el_tty.t_initialized) + return -1; + + if (!isatty(el->el_outfd)) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: isatty: %s\n", __func__, + strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + if (tty_getty(el, &el->el_tty.t_or) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, + strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed = el->el_tty.t_or; + + el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex); + el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex); + el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex); + + tty_setup_flags(el, &el->el_tty.t_ex, EX_IO); + + /* + * Reset the tty chars to reasonable defaults + * If they are disabled, then enable them. + */ + if (rst) { + if (tty__cooked_mode(&el->el_tty.t_ts)) { + tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); + /* + * Don't affect CMIN and CTIME for the editor mode + */ + for (rst = 0; rst < C_NCC - 2; rst++) + if (el->el_tty.t_c[TS_IO][rst] != + el->el_tty.t_vdisable + && el->el_tty.t_c[ED_IO][rst] != + el->el_tty.t_vdisable) + el->el_tty.t_c[ED_IO][rst] = + el->el_tty.t_c[TS_IO][rst]; + for (rst = 0; rst < C_NCC; rst++) + if (el->el_tty.t_c[TS_IO][rst] != + el->el_tty.t_vdisable) + el->el_tty.t_c[EX_IO][rst] = + el->el_tty.t_c[TS_IO][rst]; + } + tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); + if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", + __func__, strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + } + + tty_setup_flags(el, &el->el_tty.t_ed, ED_IO); + + tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); + tty_bind_char(el, 1); + el->el_tty.t_initialized = 1; + return 0; +} + +libedit_private int +tty_init(EditLine *el) +{ + + el->el_tty.t_mode = EX_IO; + el->el_tty.t_vdisable = _POSIX_VDISABLE; + el->el_tty.t_initialized = 0; + (void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t)); + (void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t)); + return tty_setup(el); +} + + +/* tty_end(): + * Restore the tty to its original settings + */ +libedit_private void +/*ARGSUSED*/ +tty_end(EditLine *el) +{ + if (el->el_flags & EDIT_DISABLED) + return; + + if (!el->el_tty.t_initialized) + return; + + if (tty_setty(el, TCSAFLUSH, &el->el_tty.t_or) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, + "%s: tty_setty: %s\n", __func__, strerror(errno)); +#endif /* DEBUG_TTY */ + } +} + + +/* tty__getspeed(): + * Get the tty speed + */ +static speed_t +tty__getspeed(struct termios *td) +{ + speed_t spd; + + if ((spd = cfgetispeed(td)) == 0) + spd = cfgetospeed(td); + return spd; +} + +/* tty__getspeed(): + * Return the index of the asked char in the c_cc array + */ +static int +tty__getcharindex(int i) +{ + switch (i) { +#ifdef VINTR + case C_INTR: + return VINTR; +#endif /* VINTR */ +#ifdef VQUIT + case C_QUIT: + return VQUIT; +#endif /* VQUIT */ +#ifdef VERASE + case C_ERASE: + return VERASE; +#endif /* VERASE */ +#ifdef VKILL + case C_KILL: + return VKILL; +#endif /* VKILL */ +#ifdef VEOF + case C_EOF: + return VEOF; +#endif /* VEOF */ +#ifdef VEOL + case C_EOL: + return VEOL; +#endif /* VEOL */ +#ifdef VEOL2 + case C_EOL2: + return VEOL2; +#endif /* VEOL2 */ +#ifdef VSWTCH + case C_SWTCH: + return VSWTCH; +#endif /* VSWTCH */ +#ifdef VDSWTCH + case C_DSWTCH: + return VDSWTCH; +#endif /* VDSWTCH */ +#ifdef VERASE2 + case C_ERASE2: + return VERASE2; +#endif /* VERASE2 */ +#ifdef VSTART + case C_START: + return VSTART; +#endif /* VSTART */ +#ifdef VSTOP + case C_STOP: + return VSTOP; +#endif /* VSTOP */ +#ifdef VWERASE + case C_WERASE: + return VWERASE; +#endif /* VWERASE */ +#ifdef VSUSP + case C_SUSP: + return VSUSP; +#endif /* VSUSP */ +#ifdef VDSUSP + case C_DSUSP: + return VDSUSP; +#endif /* VDSUSP */ +#ifdef VREPRINT + case C_REPRINT: + return VREPRINT; +#endif /* VREPRINT */ +#ifdef VDISCARD + case C_DISCARD: + return VDISCARD; +#endif /* VDISCARD */ +#ifdef VLNEXT + case C_LNEXT: + return VLNEXT; +#endif /* VLNEXT */ +#ifdef VSTATUS + case C_STATUS: + return VSTATUS; +#endif /* VSTATUS */ +#ifdef VPAGE + case C_PAGE: + return VPAGE; +#endif /* VPAGE */ +#ifdef VPGOFF + case C_PGOFF: + return VPGOFF; +#endif /* VPGOFF */ +#ifdef VKILL2 + case C_KILL2: + return VKILL2; +#endif /* KILL2 */ +#ifdef VMIN + case C_MIN: + return VMIN; +#endif /* VMIN */ +#ifdef VTIME + case C_TIME: + return VTIME; +#endif /* VTIME */ + default: + return -1; + } +} + +/* tty__getchar(): + * Get the tty characters + */ +static void +tty__getchar(struct termios *td, unsigned char *s) +{ + +#ifdef VINTR + s[C_INTR] = td->c_cc[VINTR]; +#endif /* VINTR */ +#ifdef VQUIT + s[C_QUIT] = td->c_cc[VQUIT]; +#endif /* VQUIT */ +#ifdef VERASE + s[C_ERASE] = td->c_cc[VERASE]; +#endif /* VERASE */ +#ifdef VKILL + s[C_KILL] = td->c_cc[VKILL]; +#endif /* VKILL */ +#ifdef VEOF + s[C_EOF] = td->c_cc[VEOF]; +#endif /* VEOF */ +#ifdef VEOL + s[C_EOL] = td->c_cc[VEOL]; +#endif /* VEOL */ +#ifdef VEOL2 + s[C_EOL2] = td->c_cc[VEOL2]; +#endif /* VEOL2 */ +#ifdef VSWTCH + s[C_SWTCH] = td->c_cc[VSWTCH]; +#endif /* VSWTCH */ +#ifdef VDSWTCH + s[C_DSWTCH] = td->c_cc[VDSWTCH]; +#endif /* VDSWTCH */ +#ifdef VERASE2 + s[C_ERASE2] = td->c_cc[VERASE2]; +#endif /* VERASE2 */ +#ifdef VSTART + s[C_START] = td->c_cc[VSTART]; +#endif /* VSTART */ +#ifdef VSTOP + s[C_STOP] = td->c_cc[VSTOP]; +#endif /* VSTOP */ +#ifdef VWERASE + s[C_WERASE] = td->c_cc[VWERASE]; +#endif /* VWERASE */ +#ifdef VSUSP + s[C_SUSP] = td->c_cc[VSUSP]; +#endif /* VSUSP */ +#ifdef VDSUSP + s[C_DSUSP] = td->c_cc[VDSUSP]; +#endif /* VDSUSP */ +#ifdef VREPRINT + s[C_REPRINT] = td->c_cc[VREPRINT]; +#endif /* VREPRINT */ +#ifdef VDISCARD + s[C_DISCARD] = td->c_cc[VDISCARD]; +#endif /* VDISCARD */ +#ifdef VLNEXT + s[C_LNEXT] = td->c_cc[VLNEXT]; +#endif /* VLNEXT */ +#ifdef VSTATUS + s[C_STATUS] = td->c_cc[VSTATUS]; +#endif /* VSTATUS */ +#ifdef VPAGE + s[C_PAGE] = td->c_cc[VPAGE]; +#endif /* VPAGE */ +#ifdef VPGOFF + s[C_PGOFF] = td->c_cc[VPGOFF]; +#endif /* VPGOFF */ +#ifdef VKILL2 + s[C_KILL2] = td->c_cc[VKILL2]; +#endif /* KILL2 */ +#ifdef VMIN + s[C_MIN] = td->c_cc[VMIN]; +#endif /* VMIN */ +#ifdef VTIME + s[C_TIME] = td->c_cc[VTIME]; +#endif /* VTIME */ +} /* tty__getchar */ + + +/* tty__setchar(): + * Set the tty characters + */ +static void +tty__setchar(struct termios *td, unsigned char *s) +{ + +#ifdef VINTR + td->c_cc[VINTR] = s[C_INTR]; +#endif /* VINTR */ +#ifdef VQUIT + td->c_cc[VQUIT] = s[C_QUIT]; +#endif /* VQUIT */ +#ifdef VERASE + td->c_cc[VERASE] = s[C_ERASE]; +#endif /* VERASE */ +#ifdef VKILL + td->c_cc[VKILL] = s[C_KILL]; +#endif /* VKILL */ +#ifdef VEOF + td->c_cc[VEOF] = s[C_EOF]; +#endif /* VEOF */ +#ifdef VEOL + td->c_cc[VEOL] = s[C_EOL]; +#endif /* VEOL */ +#ifdef VEOL2 + td->c_cc[VEOL2] = s[C_EOL2]; +#endif /* VEOL2 */ +#ifdef VSWTCH + td->c_cc[VSWTCH] = s[C_SWTCH]; +#endif /* VSWTCH */ +#ifdef VDSWTCH + td->c_cc[VDSWTCH] = s[C_DSWTCH]; +#endif /* VDSWTCH */ +#ifdef VERASE2 + td->c_cc[VERASE2] = s[C_ERASE2]; +#endif /* VERASE2 */ +#ifdef VSTART + td->c_cc[VSTART] = s[C_START]; +#endif /* VSTART */ +#ifdef VSTOP + td->c_cc[VSTOP] = s[C_STOP]; +#endif /* VSTOP */ +#ifdef VWERASE + td->c_cc[VWERASE] = s[C_WERASE]; +#endif /* VWERASE */ +#ifdef VSUSP + td->c_cc[VSUSP] = s[C_SUSP]; +#endif /* VSUSP */ +#ifdef VDSUSP + td->c_cc[VDSUSP] = s[C_DSUSP]; +#endif /* VDSUSP */ +#ifdef VREPRINT + td->c_cc[VREPRINT] = s[C_REPRINT]; +#endif /* VREPRINT */ +#ifdef VDISCARD + td->c_cc[VDISCARD] = s[C_DISCARD]; +#endif /* VDISCARD */ +#ifdef VLNEXT + td->c_cc[VLNEXT] = s[C_LNEXT]; +#endif /* VLNEXT */ +#ifdef VSTATUS + td->c_cc[VSTATUS] = s[C_STATUS]; +#endif /* VSTATUS */ +#ifdef VPAGE + td->c_cc[VPAGE] = s[C_PAGE]; +#endif /* VPAGE */ +#ifdef VPGOFF + td->c_cc[VPGOFF] = s[C_PGOFF]; +#endif /* VPGOFF */ +#ifdef VKILL2 + td->c_cc[VKILL2] = s[C_KILL2]; +#endif /* VKILL2 */ +#ifdef VMIN + td->c_cc[VMIN] = s[C_MIN]; +#endif /* VMIN */ +#ifdef VTIME + td->c_cc[VTIME] = s[C_TIME]; +#endif /* VTIME */ +} /* tty__setchar */ + + +/* tty_bind_char(): + * Rebind the editline functions + */ +libedit_private void +tty_bind_char(EditLine *el, int force) +{ + + unsigned char *t_n = el->el_tty.t_c[ED_IO]; + unsigned char *t_o = el->el_tty.t_ed.c_cc; + wchar_t new[2], old[2]; + const ttymap_t *tp; + el_action_t *map, *alt; + const el_action_t *dmap, *dalt; + new[1] = old[1] = '\0'; + + map = el->el_map.key; + alt = el->el_map.alt; + if (el->el_map.type == MAP_VI) { + dmap = el->el_map.vii; + dalt = el->el_map.vic; + } else { + dmap = el->el_map.emacs; + dalt = NULL; + } + + for (tp = tty_map; tp->nch != (wint_t)-1; tp++) { + new[0] = (wchar_t)t_n[tp->nch]; + old[0] = (wchar_t)t_o[tp->och]; + if (new[0] == old[0] && !force) + continue; + /* Put the old default binding back, and set the new binding */ + keymacro_clear(el, map, old); + map[(unsigned char)old[0]] = dmap[(unsigned char)old[0]]; + keymacro_clear(el, map, new); + /* MAP_VI == 1, MAP_EMACS == 0... */ + map[(unsigned char)new[0]] = tp->bind[el->el_map.type]; + if (dalt) { + keymacro_clear(el, alt, old); + alt[(unsigned char)old[0]] = + dalt[(unsigned char)old[0]]; + keymacro_clear(el, alt, new); + alt[(unsigned char)new[0]] = + tp->bind[el->el_map.type + 1]; + } + } +} + + +static tcflag_t * +tty__get_flag(struct termios *t, int kind) { + switch (kind) { + case MD_INP: + return &t->c_iflag; + case MD_OUT: + return &t->c_oflag; + case MD_CTL: + return &t->c_cflag; + case MD_LIN: + return &t->c_lflag; + default: + abort(); + /*NOTREACHED*/ + } +} + + +static tcflag_t +tty_update_flag(EditLine *el, tcflag_t f, int mode, int kind) +{ + f &= ~el->el_tty.t_t[mode][kind].t_clrmask; + f |= el->el_tty.t_t[mode][kind].t_setmask; + return f; +} + + +static void +tty_update_flags(EditLine *el, int kind) +{ + tcflag_t *tt, *ed, *ex; + tt = tty__get_flag(&el->el_tty.t_ts, kind); + ed = tty__get_flag(&el->el_tty.t_ed, kind); + ex = tty__get_flag(&el->el_tty.t_ex, kind); + + if (*tt != *ex && (kind != MD_CTL || *tt != *ed)) { + *ed = tty_update_flag(el, *tt, ED_IO, kind); + *ex = tty_update_flag(el, *tt, EX_IO, kind); + } +} + + +static void +tty_update_char(EditLine *el, int mode, int c) { + if (!((el->el_tty.t_t[mode][MD_CHAR].t_setmask & C_SH(c))) + && (el->el_tty.t_c[TS_IO][c] != el->el_tty.t_c[EX_IO][c])) + el->el_tty.t_c[mode][c] = el->el_tty.t_c[TS_IO][c]; + if (el->el_tty.t_t[mode][MD_CHAR].t_clrmask & C_SH(c)) + el->el_tty.t_c[mode][c] = el->el_tty.t_vdisable; +} + + +/* tty_rawmode(): + * Set terminal into 1 character at a time mode. + */ +libedit_private int +tty_rawmode(EditLine *el) +{ + + if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO) + return 0; + + if (el->el_flags & EDIT_DISABLED) + return 0; + + if (tty_getty(el, &el->el_tty.t_ts) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, + strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + /* + * We always keep up with the eight bit setting and the speed of the + * tty. But we only believe changes that are made to cooked mode! + */ + el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts); + el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts); + + if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed || + tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) { + (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed); + (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed); + (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed); + (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed); + } + if (tty__cooked_mode(&el->el_tty.t_ts)) { + int i; + + for (i = MD_INP; i <= MD_LIN; i++) + tty_update_flags(el, i); + + if (tty__gettabs(&el->el_tty.t_ex) == 0) + el->el_tty.t_tabs = 0; + else + el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0; + + tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); + /* + * Check if the user made any changes. + * If he did, then propagate the changes to the + * edit and execute data structures. + */ + for (i = 0; i < C_NCC; i++) + if (el->el_tty.t_c[TS_IO][i] != + el->el_tty.t_c[EX_IO][i]) + break; + + if (i != C_NCC) { + /* + * Propagate changes only to the unlibedit_private + * chars that have been modified just now. + */ + for (i = 0; i < C_NCC; i++) + tty_update_char(el, ED_IO, i); + + tty_bind_char(el, 0); + tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); + + for (i = 0; i < C_NCC; i++) + tty_update_char(el, EX_IO, i); + + tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); + } + } + if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, + strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + el->el_tty.t_mode = ED_IO; + return 0; +} + + +/* tty_cookedmode(): + * Set the tty back to normal mode + */ +libedit_private int +tty_cookedmode(EditLine *el) +{ /* set tty in normal setup */ + + if (el->el_tty.t_mode == EX_IO) + return 0; + + if (el->el_flags & EDIT_DISABLED) + return 0; + + if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, + strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + el->el_tty.t_mode = EX_IO; + return 0; +} + + +/* tty_quotemode(): + * Turn on quote mode + */ +libedit_private int +tty_quotemode(EditLine *el) +{ + if (el->el_tty.t_mode == QU_IO) + return 0; + + el->el_tty.t_qu = el->el_tty.t_ed; + + tty_setup_flags(el, &el->el_tty.t_qu, QU_IO); + + if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, + strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + el->el_tty.t_mode = QU_IO; + return 0; +} + + +/* tty_noquotemode(): + * Turn off quote mode + */ +libedit_private int +tty_noquotemode(EditLine *el) +{ + + if (el->el_tty.t_mode != QU_IO) + return 0; + if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, + strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + el->el_tty.t_mode = ED_IO; + return 0; +} + + +/* tty_stty(): + * Stty builtin + */ +libedit_private int +/*ARGSUSED*/ +tty_stty(EditLine *el, int argc __attribute__((__unused__)), + const wchar_t **argv) +{ + const ttymodes_t *m; + char x; + int aflag = 0; + const wchar_t *s, *d; + char name[EL_BUFSIZ]; + struct termios *tios = &el->el_tty.t_ex; + int z = EX_IO; + + if (argv == NULL) + return -1; + strncpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name)); + name[sizeof(name) - 1] = '\0'; + + while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0') + switch (argv[0][1]) { + case 'a': + aflag++; + argv++; + break; + case 'd': + argv++; + tios = &el->el_tty.t_ed; + z = ED_IO; + break; + case 'x': + argv++; + tios = &el->el_tty.t_ex; + z = EX_IO; + break; + case 'q': + argv++; + tios = &el->el_tty.t_ts; + z = QU_IO; + break; + default: + (void) fprintf(el->el_errfile, + "%s: Unknown switch `%lc'.\n", + name, (wint_t)argv[0][1]); + return -1; + } + + if (!argv || !*argv) { + int i = -1; + size_t len = 0, st = 0, cu; + for (m = ttymodes; m->m_name; m++) { + if (m->m_type != i) { + (void) fprintf(el->el_outfile, "%s%s", + i != -1 ? "\n" : "", + el->el_tty.t_t[z][m->m_type].t_name); + i = m->m_type; + st = len = + strlen(el->el_tty.t_t[z][m->m_type].t_name); + } + if (i != -1) { + x = (el->el_tty.t_t[z][i].t_setmask & m->m_value) + ? '+' : '\0'; + + if (el->el_tty.t_t[z][i].t_clrmask & m->m_value) + x = '-'; + } else { + x = '\0'; + } + + if (x != '\0' || aflag) { + + cu = strlen(m->m_name) + (x != '\0') + 1; + + if (len + cu >= + (size_t)el->el_terminal.t_size.h) { + (void) fprintf(el->el_outfile, "\n%*s", + (int)st, ""); + len = st + cu; + } else + len += cu; + + if (x != '\0') + (void) fprintf(el->el_outfile, "%c%s ", + x, m->m_name); + else + (void) fprintf(el->el_outfile, "%s ", + m->m_name); + } + } + (void) fprintf(el->el_outfile, "\n"); + return 0; + } + while (argv && (s = *argv++)) { + const wchar_t *p; + switch (*s) { + case '+': + case '-': + x = (char)*s++; + break; + default: + x = '\0'; + break; + } + d = s; + p = wcschr(s, L'='); + for (m = ttymodes; m->m_name; m++) + if ((p ? strncmp(m->m_name, ct_encode_string(d, + &el->el_scratch), (size_t)(p - d)) : + strcmp(m->m_name, ct_encode_string(d, + &el->el_scratch))) == 0 && + (p == NULL || m->m_type == MD_CHAR)) + break; + + if (!m->m_name) { + (void) fprintf(el->el_errfile, + "%s: Invalid argument `%ls'.\n", name, d); + return -1; + } + if (p) { + int c = ffs((int)m->m_value); + int v = *++p ? parse__escape(&p) : + el->el_tty.t_vdisable; + assert(c != 0); + c--; + c = tty__getcharindex(c); + assert(c != -1); + tios->c_cc[c] = (cc_t)v; + continue; + } + switch (x) { + case '+': + el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value; + el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; + break; + case '-': + el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; + el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value; + break; + default: + el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; + el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; + break; + } + } + + tty_setup_flags(el, tios, z); + if (el->el_tty.t_mode == z) { + if (tty_setty(el, TCSADRAIN, tios) == -1) { +#ifdef DEBUG_TTY + (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", + __func__, strerror(errno)); +#endif /* DEBUG_TTY */ + return -1; + } + } + + return 0; +} + + +#ifdef notyet +/* tty_printchar(): + * DEbugging routine to print the tty characters + */ +static void +tty_printchar(EditLine *el, unsigned char *s) +{ + ttyperm_t *m; + int i; + + for (i = 0; i < C_NCC; i++) { + for (m = el->el_tty.t_t; m->m_name; m++) + if (m->m_type == MD_CHAR && C_SH(i) == m->m_value) + break; + if (m->m_name) + (void) fprintf(el->el_errfile, "%s ^%c ", + m->m_name, s[i] + 'A' - 1); + if (i % 5 == 0) + (void) fprintf(el->el_errfile, "\n"); + } + (void) fprintf(el->el_errfile, "\n"); +} +#endif /* notyet */ + + +static void +tty_setup_flags(EditLine *el, struct termios *tios, int mode) +{ + int kind; + for (kind = MD_INP; kind <= MD_LIN; kind++) { + tcflag_t *f = tty__get_flag(tios, kind); + *f = tty_update_flag(el, *f, mode, kind); + } +} diff --git a/crypto/heimdal/lib/libedit/src/unvis.c b/crypto/heimdal/lib/libedit/src/unvis.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/unvis.c @@ -0,0 +1,553 @@ +/* $NetBSD: unvis.c,v 1.44 2014/09/26 15:43:36 roy Exp $ */ + +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)unvis.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: unvis.c,v 1.44 2014/09/26 15:43:36 roy Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include + +#include +#include +#include +#include +#include + +#if !HAVE_VIS +/* + * decode driven by state machine + */ +#define S_GROUND 0 /* haven't seen escape char */ +#define S_START 1 /* start decoding special sequence */ +#define S_META 2 /* metachar started (M) */ +#define S_META1 3 /* metachar more, regular char (-) */ +#define S_CTRL 4 /* control char started (^) */ +#define S_OCTAL2 5 /* octal digit 2 */ +#define S_OCTAL3 6 /* octal digit 3 */ +#define S_HEX 7 /* mandatory hex digit */ +#define S_HEX1 8 /* http hex digit */ +#define S_HEX2 9 /* http hex digit 2 */ +#define S_MIME1 10 /* mime hex digit 1 */ +#define S_MIME2 11 /* mime hex digit 2 */ +#define S_EATCRNL 12 /* mime eating CRNL */ +#define S_AMP 13 /* seen & */ +#define S_NUMBER 14 /* collecting number */ +#define S_STRING 15 /* collecting string */ + +#define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7') +#define xtod(c) (isdigit(c) ? (c - '0') : ((tolower(c) - 'a') + 10)) +#define XTOD(c) (isdigit(c) ? (c - '0') : ((c - 'A') + 10)) + +/* + * RFC 1866 + */ +static const struct nv { + char name[7]; + uint8_t value; +} nv[] = { + { "AElig", 198 }, /* capital AE diphthong (ligature) */ + { "Aacute", 193 }, /* capital A, acute accent */ + { "Acirc", 194 }, /* capital A, circumflex accent */ + { "Agrave", 192 }, /* capital A, grave accent */ + { "Aring", 197 }, /* capital A, ring */ + { "Atilde", 195 }, /* capital A, tilde */ + { "Auml", 196 }, /* capital A, dieresis or umlaut mark */ + { "Ccedil", 199 }, /* capital C, cedilla */ + { "ETH", 208 }, /* capital Eth, Icelandic */ + { "Eacute", 201 }, /* capital E, acute accent */ + { "Ecirc", 202 }, /* capital E, circumflex accent */ + { "Egrave", 200 }, /* capital E, grave accent */ + { "Euml", 203 }, /* capital E, dieresis or umlaut mark */ + { "Iacute", 205 }, /* capital I, acute accent */ + { "Icirc", 206 }, /* capital I, circumflex accent */ + { "Igrave", 204 }, /* capital I, grave accent */ + { "Iuml", 207 }, /* capital I, dieresis or umlaut mark */ + { "Ntilde", 209 }, /* capital N, tilde */ + { "Oacute", 211 }, /* capital O, acute accent */ + { "Ocirc", 212 }, /* capital O, circumflex accent */ + { "Ograve", 210 }, /* capital O, grave accent */ + { "Oslash", 216 }, /* capital O, slash */ + { "Otilde", 213 }, /* capital O, tilde */ + { "Ouml", 214 }, /* capital O, dieresis or umlaut mark */ + { "THORN", 222 }, /* capital THORN, Icelandic */ + { "Uacute", 218 }, /* capital U, acute accent */ + { "Ucirc", 219 }, /* capital U, circumflex accent */ + { "Ugrave", 217 }, /* capital U, grave accent */ + { "Uuml", 220 }, /* capital U, dieresis or umlaut mark */ + { "Yacute", 221 }, /* capital Y, acute accent */ + { "aacute", 225 }, /* small a, acute accent */ + { "acirc", 226 }, /* small a, circumflex accent */ + { "acute", 180 }, /* acute accent */ + { "aelig", 230 }, /* small ae diphthong (ligature) */ + { "agrave", 224 }, /* small a, grave accent */ + { "amp", 38 }, /* ampersand */ + { "aring", 229 }, /* small a, ring */ + { "atilde", 227 }, /* small a, tilde */ + { "auml", 228 }, /* small a, dieresis or umlaut mark */ + { "brvbar", 166 }, /* broken (vertical) bar */ + { "ccedil", 231 }, /* small c, cedilla */ + { "cedil", 184 }, /* cedilla */ + { "cent", 162 }, /* cent sign */ + { "copy", 169 }, /* copyright sign */ + { "curren", 164 }, /* general currency sign */ + { "deg", 176 }, /* degree sign */ + { "divide", 247 }, /* divide sign */ + { "eacute", 233 }, /* small e, acute accent */ + { "ecirc", 234 }, /* small e, circumflex accent */ + { "egrave", 232 }, /* small e, grave accent */ + { "eth", 240 }, /* small eth, Icelandic */ + { "euml", 235 }, /* small e, dieresis or umlaut mark */ + { "frac12", 189 }, /* fraction one-half */ + { "frac14", 188 }, /* fraction one-quarter */ + { "frac34", 190 }, /* fraction three-quarters */ + { "gt", 62 }, /* greater than */ + { "iacute", 237 }, /* small i, acute accent */ + { "icirc", 238 }, /* small i, circumflex accent */ + { "iexcl", 161 }, /* inverted exclamation mark */ + { "igrave", 236 }, /* small i, grave accent */ + { "iquest", 191 }, /* inverted question mark */ + { "iuml", 239 }, /* small i, dieresis or umlaut mark */ + { "laquo", 171 }, /* angle quotation mark, left */ + { "lt", 60 }, /* less than */ + { "macr", 175 }, /* macron */ + { "micro", 181 }, /* micro sign */ + { "middot", 183 }, /* middle dot */ + { "nbsp", 160 }, /* no-break space */ + { "not", 172 }, /* not sign */ + { "ntilde", 241 }, /* small n, tilde */ + { "oacute", 243 }, /* small o, acute accent */ + { "ocirc", 244 }, /* small o, circumflex accent */ + { "ograve", 242 }, /* small o, grave accent */ + { "ordf", 170 }, /* ordinal indicator, feminine */ + { "ordm", 186 }, /* ordinal indicator, masculine */ + { "oslash", 248 }, /* small o, slash */ + { "otilde", 245 }, /* small o, tilde */ + { "ouml", 246 }, /* small o, dieresis or umlaut mark */ + { "para", 182 }, /* pilcrow (paragraph sign) */ + { "plusmn", 177 }, /* plus-or-minus sign */ + { "pound", 163 }, /* pound sterling sign */ + { "quot", 34 }, /* double quote */ + { "raquo", 187 }, /* angle quotation mark, right */ + { "reg", 174 }, /* registered sign */ + { "sect", 167 }, /* section sign */ + { "shy", 173 }, /* soft hyphen */ + { "sup1", 185 }, /* superscript one */ + { "sup2", 178 }, /* superscript two */ + { "sup3", 179 }, /* superscript three */ + { "szlig", 223 }, /* small sharp s, German (sz ligature) */ + { "thorn", 254 }, /* small thorn, Icelandic */ + { "times", 215 }, /* multiply sign */ + { "uacute", 250 }, /* small u, acute accent */ + { "ucirc", 251 }, /* small u, circumflex accent */ + { "ugrave", 249 }, /* small u, grave accent */ + { "uml", 168 }, /* umlaut (dieresis) */ + { "uuml", 252 }, /* small u, dieresis or umlaut mark */ + { "yacute", 253 }, /* small y, acute accent */ + { "yen", 165 }, /* yen sign */ + { "yuml", 255 }, /* small y, dieresis or umlaut mark */ +}; + +/* + * unvis - decode characters previously encoded by vis + */ +int +unvis(char *cp, int c, int *astate, int flag) +{ + unsigned char uc = (unsigned char)c; + unsigned char st, ia, is, lc; + +/* + * Bottom 8 bits of astate hold the state machine state. + * Top 8 bits hold the current character in the http 1866 nv string decoding + */ +#define GS(a) ((a) & 0xff) +#define SS(a, b) (((uint32_t)(a) << 24) | (b)) +#define GI(a) ((uint32_t)(a) >> 24) + + _DIAGASSERT(cp != NULL); + _DIAGASSERT(astate != NULL); + st = GS(*astate); + + if (flag & UNVIS_END) { + switch (st) { + case S_OCTAL2: + case S_OCTAL3: + case S_HEX2: + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case S_GROUND: + return UNVIS_NOCHAR; + default: + return UNVIS_SYNBAD; + } + } + + switch (st) { + + case S_GROUND: + *cp = 0; + if ((flag & VIS_NOESCAPE) == 0 && c == '\\') { + *astate = SS(0, S_START); + return UNVIS_NOCHAR; + } + if ((flag & VIS_HTTP1808) && c == '%') { + *astate = SS(0, S_HEX1); + return UNVIS_NOCHAR; + } + if ((flag & VIS_HTTP1866) && c == '&') { + *astate = SS(0, S_AMP); + return UNVIS_NOCHAR; + } + if ((flag & VIS_MIMESTYLE) && c == '=') { + *astate = SS(0, S_MIME1); + return UNVIS_NOCHAR; + } + *cp = c; + return UNVIS_VALID; + + case S_START: + switch(c) { + case '\\': + *cp = c; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + *cp = (c - '0'); + *astate = SS(0, S_OCTAL2); + return UNVIS_NOCHAR; + case 'M': + *cp = (char)0200; + *astate = SS(0, S_META); + return UNVIS_NOCHAR; + case '^': + *astate = SS(0, S_CTRL); + return UNVIS_NOCHAR; + case 'n': + *cp = '\n'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 'r': + *cp = '\r'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 'b': + *cp = '\b'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 'a': + *cp = '\007'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 'v': + *cp = '\v'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 't': + *cp = '\t'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 'f': + *cp = '\f'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 's': + *cp = ' '; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 'E': + *cp = '\033'; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + case 'x': + *astate = SS(0, S_HEX); + return UNVIS_NOCHAR; + case '\n': + /* + * hidden newline + */ + *astate = SS(0, S_GROUND); + return UNVIS_NOCHAR; + case '$': + /* + * hidden marker + */ + *astate = SS(0, S_GROUND); + return UNVIS_NOCHAR; + default: + if (isgraph(c)) { + *cp = c; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + } + } + goto bad; + + case S_META: + if (c == '-') + *astate = SS(0, S_META1); + else if (c == '^') + *astate = SS(0, S_CTRL); + else + goto bad; + return UNVIS_NOCHAR; + + case S_META1: + *astate = SS(0, S_GROUND); + *cp |= c; + return UNVIS_VALID; + + case S_CTRL: + if (c == '?') + *cp |= 0177; + else + *cp |= c & 037; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + + case S_OCTAL2: /* second possible octal digit */ + if (isoctal(uc)) { + /* + * yes - and maybe a third + */ + *cp = (*cp << 3) + (c - '0'); + *astate = SS(0, S_OCTAL3); + return UNVIS_NOCHAR; + } + /* + * no - done with current sequence, push back passed char + */ + *astate = SS(0, S_GROUND); + return UNVIS_VALIDPUSH; + + case S_OCTAL3: /* third possible octal digit */ + *astate = SS(0, S_GROUND); + if (isoctal(uc)) { + *cp = (*cp << 3) + (c - '0'); + return UNVIS_VALID; + } + /* + * we were done, push back passed char + */ + return UNVIS_VALIDPUSH; + + case S_HEX: + if (!isxdigit(uc)) + goto bad; + /*FALLTHROUGH*/ + case S_HEX1: + if (isxdigit(uc)) { + *cp = xtod(uc); + *astate = SS(0, S_HEX2); + return UNVIS_NOCHAR; + } + /* + * no - done with current sequence, push back passed char + */ + *astate = SS(0, S_GROUND); + return UNVIS_VALIDPUSH; + + case S_HEX2: + *astate = S_GROUND; + if (isxdigit(uc)) { + *cp = xtod(uc) | (*cp << 4); + return UNVIS_VALID; + } + return UNVIS_VALIDPUSH; + + case S_MIME1: + if (uc == '\n' || uc == '\r') { + *astate = SS(0, S_EATCRNL); + return UNVIS_NOCHAR; + } + if (isxdigit(uc) && (isdigit(uc) || isupper(uc))) { + *cp = XTOD(uc); + *astate = SS(0, S_MIME2); + return UNVIS_NOCHAR; + } + goto bad; + + case S_MIME2: + if (isxdigit(uc) && (isdigit(uc) || isupper(uc))) { + *astate = SS(0, S_GROUND); + *cp = XTOD(uc) | (*cp << 4); + return UNVIS_VALID; + } + goto bad; + + case S_EATCRNL: + switch (uc) { + case '\r': + case '\n': + return UNVIS_NOCHAR; + case '=': + *astate = SS(0, S_MIME1); + return UNVIS_NOCHAR; + default: + *cp = uc; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + } + + case S_AMP: + *cp = 0; + if (uc == '#') { + *astate = SS(0, S_NUMBER); + return UNVIS_NOCHAR; + } + *astate = SS(0, S_STRING); + /*FALLTHROUGH*/ + + case S_STRING: + ia = *cp; /* index in the array */ + is = GI(*astate); /* index in the string */ + lc = is == 0 ? 0 : nv[ia].name[is - 1]; /* last character */ + + if (uc == ';') + uc = '\0'; + + for (; ia < __arraycount(nv); ia++) { + if (is != 0 && nv[ia].name[is - 1] != lc) + goto bad; + if (nv[ia].name[is] == uc) + break; + } + + if (ia == __arraycount(nv)) + goto bad; + + if (uc != 0) { + *cp = ia; + *astate = SS(is + 1, S_STRING); + return UNVIS_NOCHAR; + } + + *cp = nv[ia].value; + *astate = SS(0, S_GROUND); + return UNVIS_VALID; + + case S_NUMBER: + if (uc == ';') + return UNVIS_VALID; + if (!isdigit(uc)) + goto bad; + *cp += (*cp * 10) + uc - '0'; + return UNVIS_NOCHAR; + + default: + bad: + /* + * decoder in unknown state - (probably uninitialized) + */ + *astate = SS(0, S_GROUND); + return UNVIS_SYNBAD; + } +} + +/* + * strnunvisx - decode src into dst + * + * Number of chars decoded into dst is returned, -1 on error. + * Dst is null terminated. + */ + +int +strnunvisx(char *dst, size_t dlen, const char *src, int flag) +{ + char c; + char t = '\0', *start = dst; + int state = 0; + + _DIAGASSERT(src != NULL); + _DIAGASSERT(dst != NULL); +#define CHECKSPACE() \ + do { \ + if (dlen-- == 0) { \ + errno = ENOSPC; \ + return -1; \ + } \ + } while (/*CONSTCOND*/0) + + while ((c = *src++) != '\0') { + again: + switch (unvis(&t, c, &state, flag)) { + case UNVIS_VALID: + CHECKSPACE(); + *dst++ = t; + break; + case UNVIS_VALIDPUSH: + CHECKSPACE(); + *dst++ = t; + goto again; + case 0: + case UNVIS_NOCHAR: + break; + case UNVIS_SYNBAD: + errno = EINVAL; + return -1; + default: + _DIAGASSERT(/*CONSTCOND*/0); + errno = EINVAL; + return -1; + } + } + if (unvis(&t, c, &state, UNVIS_END) == UNVIS_VALID) { + CHECKSPACE(); + *dst++ = t; + } + CHECKSPACE(); + *dst = '\0'; + return (int)(dst - start); +} + +int +strunvisx(char *dst, const char *src, int flag) +{ + return strnunvisx(dst, (size_t)~0, src, flag); +} + +int +strunvis(char *dst, const char *src) +{ + return strnunvisx(dst, (size_t)~0, src, 0); +} + +int +strnunvis(char *dst, size_t dlen, const char *src) +{ + return strnunvisx(dst, dlen, src, 0); +} +#endif diff --git a/crypto/heimdal/lib/libedit/src/vi.c b/crypto/heimdal/lib/libedit/src/vi.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/vi.c @@ -0,0 +1,1157 @@ +/* $NetBSD: vi.c,v 1.62 2016/05/09 21:46:56 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Christos Zoulas of Cornell University. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" +#if !defined(lint) && !defined(SCCSID) +#if 0 +static char sccsid[] = "@(#)vi.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: vi.c,v 1.62 2016/05/09 21:46:56 christos Exp $"); +#endif +#endif /* not lint && not SCCSID */ + +/* + * vi.c: Vi mode commands. + */ +#include +#include +#include +#include +#include +#include + +#include "el.h" +#include "common.h" +#include "emacs.h" +#include "fcns.h" +#include "vi.h" + +static el_action_t cv_action(EditLine *, wint_t); +static el_action_t cv_paste(EditLine *, wint_t); + +/* cv_action(): + * Handle vi actions. + */ +static el_action_t +cv_action(EditLine *el, wint_t c) +{ + + if (el->el_chared.c_vcmd.action != NOP) { + /* 'cc', 'dd' and (possibly) friends */ + if (c != (wint_t)el->el_chared.c_vcmd.action) + return CC_ERROR; + + if (!(c & YANK)) + cv_undo(el); + cv_yank(el, el->el_line.buffer, + (int)(el->el_line.lastchar - el->el_line.buffer)); + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_vcmd.pos = 0; + if (!(c & YANK)) { + el->el_line.lastchar = el->el_line.buffer; + el->el_line.cursor = el->el_line.buffer; + } + if (c & INSERT) + el->el_map.current = el->el_map.key; + + return CC_REFRESH; + } + el->el_chared.c_vcmd.pos = el->el_line.cursor; + el->el_chared.c_vcmd.action = c; + return CC_ARGHACK; +} + +/* cv_paste(): + * Paste previous deletion before or after the cursor + */ +static el_action_t +cv_paste(EditLine *el, wint_t c) +{ + c_kill_t *k = &el->el_chared.c_kill; + size_t len = (size_t)(k->last - k->buf); + + if (k->buf == NULL || len == 0) + return CC_ERROR; +#ifdef DEBUG_PASTE + (void) fprintf(el->el_errfile, "Paste: \"%.*ls\"\n", (int)len, + k->buf); +#endif + + cv_undo(el); + + if (!c && el->el_line.cursor < el->el_line.lastchar) + el->el_line.cursor++; + + c_insert(el, (int)len); + if (el->el_line.cursor + len > el->el_line.lastchar) + return CC_ERROR; + (void) memcpy(el->el_line.cursor, k->buf, len * + sizeof(*el->el_line.cursor)); + + return CC_REFRESH; +} + + +/* vi_paste_next(): + * Vi paste previous deletion to the right of the cursor + * [p] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_paste_next(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + return cv_paste(el, 0); +} + + +/* vi_paste_prev(): + * Vi paste previous deletion to the left of the cursor + * [P] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_paste_prev(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + return cv_paste(el, 1); +} + + +/* vi_prev_big_word(): + * Vi move to the previous space delimited word + * [B] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_prev_big_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor == el->el_line.buffer) + return CC_ERROR; + + el->el_line.cursor = cv_prev_word(el->el_line.cursor, + el->el_line.buffer, + el->el_state.argument, + cv__isWord); + + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* vi_prev_word(): + * Vi move to the previous word + * [b] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_prev_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor == el->el_line.buffer) + return CC_ERROR; + + el->el_line.cursor = cv_prev_word(el->el_line.cursor, + el->el_line.buffer, + el->el_state.argument, + cv__isword); + + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* vi_next_big_word(): + * Vi move to the next space delimited word + * [W] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_next_big_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor >= el->el_line.lastchar - 1) + return CC_ERROR; + + el->el_line.cursor = cv_next_word(el, el->el_line.cursor, + el->el_line.lastchar, el->el_state.argument, cv__isWord); + + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* vi_next_word(): + * Vi move to the next word + * [w] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_next_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor >= el->el_line.lastchar - 1) + return CC_ERROR; + + el->el_line.cursor = cv_next_word(el, el->el_line.cursor, + el->el_line.lastchar, el->el_state.argument, cv__isword); + + if (el->el_map.type == MAP_VI) + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* vi_change_case(): + * Vi change case of character under the cursor and advance one character + * [~] + */ +libedit_private el_action_t +vi_change_case(EditLine *el, wint_t c) +{ + int i; + + if (el->el_line.cursor >= el->el_line.lastchar) + return CC_ERROR; + cv_undo(el); + for (i = 0; i < el->el_state.argument; i++) { + + c = *el->el_line.cursor; + if (iswupper(c)) + *el->el_line.cursor = towlower(c); + else if (iswlower(c)) + *el->el_line.cursor = towupper(c); + + if (++el->el_line.cursor >= el->el_line.lastchar) { + el->el_line.cursor--; + re_fastaddc(el); + break; + } + re_fastaddc(el); + } + return CC_NORM; +} + + +/* vi_change_meta(): + * Vi change prefix command + * [c] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_change_meta(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + /* + * Delete with insert == change: first we delete and then we leave in + * insert mode. + */ + return cv_action(el, DELETE | INSERT); +} + + +/* vi_insert_at_bol(): + * Vi enter insert mode at the beginning of line + * [I] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_insert_at_bol(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_line.cursor = el->el_line.buffer; + cv_undo(el); + el->el_map.current = el->el_map.key; + return CC_CURSOR; +} + + +/* vi_replace_char(): + * Vi replace character under the cursor with the next character typed + * [r] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_replace_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor >= el->el_line.lastchar) + return CC_ERROR; + + el->el_map.current = el->el_map.key; + el->el_state.inputmode = MODE_REPLACE_1; + cv_undo(el); + return CC_ARGHACK; +} + + +/* vi_replace_mode(): + * Vi enter replace mode + * [R] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_replace_mode(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_map.current = el->el_map.key; + el->el_state.inputmode = MODE_REPLACE; + cv_undo(el); + return CC_NORM; +} + + +/* vi_substitute_char(): + * Vi replace character under the cursor and enter insert mode + * [s] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_substitute_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + c_delafter(el, el->el_state.argument); + el->el_map.current = el->el_map.key; + return CC_REFRESH; +} + + +/* vi_substitute_line(): + * Vi substitute entire line + * [S] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_substitute_line(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + cv_undo(el); + cv_yank(el, el->el_line.buffer, + (int)(el->el_line.lastchar - el->el_line.buffer)); + (void) em_kill_line(el, 0); + el->el_map.current = el->el_map.key; + return CC_REFRESH; +} + + +/* vi_change_to_eol(): + * Vi change to end of line + * [C] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_change_to_eol(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + cv_undo(el); + cv_yank(el, el->el_line.cursor, + (int)(el->el_line.lastchar - el->el_line.cursor)); + (void) ed_kill_line(el, 0); + el->el_map.current = el->el_map.key; + return CC_REFRESH; +} + + +/* vi_insert(): + * Vi enter insert mode + * [i] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_insert(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_map.current = el->el_map.key; + cv_undo(el); + return CC_NORM; +} + + +/* vi_add(): + * Vi enter insert mode after the cursor + * [a] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_add(EditLine *el, wint_t c __attribute__((__unused__))) +{ + int ret; + + el->el_map.current = el->el_map.key; + if (el->el_line.cursor < el->el_line.lastchar) { + el->el_line.cursor++; + if (el->el_line.cursor > el->el_line.lastchar) + el->el_line.cursor = el->el_line.lastchar; + ret = CC_CURSOR; + } else + ret = CC_NORM; + + cv_undo(el); + + return (el_action_t)ret; +} + + +/* vi_add_at_eol(): + * Vi enter insert mode at end of line + * [A] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_add_at_eol(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_map.current = el->el_map.key; + el->el_line.cursor = el->el_line.lastchar; + cv_undo(el); + return CC_CURSOR; +} + + +/* vi_delete_meta(): + * Vi delete prefix command + * [d] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_delete_meta(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + return cv_action(el, DELETE); +} + + +/* vi_end_big_word(): + * Vi move to the end of the current space delimited word + * [E] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_end_big_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor == el->el_line.lastchar) + return CC_ERROR; + + el->el_line.cursor = cv__endword(el->el_line.cursor, + el->el_line.lastchar, el->el_state.argument, cv__isWord); + + if (el->el_chared.c_vcmd.action != NOP) { + el->el_line.cursor++; + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* vi_end_word(): + * Vi move to the end of the current word + * [e] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_end_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor == el->el_line.lastchar) + return CC_ERROR; + + el->el_line.cursor = cv__endword(el->el_line.cursor, + el->el_line.lastchar, el->el_state.argument, cv__isword); + + if (el->el_chared.c_vcmd.action != NOP) { + el->el_line.cursor++; + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* vi_undo(): + * Vi undo last change + * [u] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_undo(EditLine *el, wint_t c __attribute__((__unused__))) +{ + c_undo_t un = el->el_chared.c_undo; + + if (un.len == -1) + return CC_ERROR; + + /* switch line buffer and undo buffer */ + el->el_chared.c_undo.buf = el->el_line.buffer; + el->el_chared.c_undo.len = el->el_line.lastchar - el->el_line.buffer; + el->el_chared.c_undo.cursor = + (int)(el->el_line.cursor - el->el_line.buffer); + el->el_line.limit = un.buf + (el->el_line.limit - el->el_line.buffer); + el->el_line.buffer = un.buf; + el->el_line.cursor = un.buf + un.cursor; + el->el_line.lastchar = un.buf + un.len; + + return CC_REFRESH; +} + + +/* vi_command_mode(): + * Vi enter command mode (use alternative key bindings) + * [] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_command_mode(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + /* [Esc] cancels pending action */ + el->el_chared.c_vcmd.action = NOP; + el->el_chared.c_vcmd.pos = 0; + + el->el_state.doingarg = 0; + + el->el_state.inputmode = MODE_INSERT; + el->el_map.current = el->el_map.alt; +#ifdef VI_MOVE + if (el->el_line.cursor > el->el_line.buffer) + el->el_line.cursor--; +#endif + return CC_CURSOR; +} + + +/* vi_zero(): + * Vi move to the beginning of line + * [0] + */ +libedit_private el_action_t +vi_zero(EditLine *el, wint_t c) +{ + + if (el->el_state.doingarg) + return ed_argument_digit(el, c); + + el->el_line.cursor = el->el_line.buffer; + if (el->el_chared.c_vcmd.action != NOP) { + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + + +/* vi_delete_prev_char(): + * Vi move to previous character (backspace) + * [^H] in insert mode only + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_delete_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_line.cursor <= el->el_line.buffer) + return CC_ERROR; + + c_delbefore1(el); + el->el_line.cursor--; + return CC_REFRESH; +} + + +/* vi_list_or_eof(): + * Vi list choices for completion or indicate end of file if empty line + * [^D] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_list_or_eof(EditLine *el, wint_t c) +{ + + if (el->el_line.cursor == el->el_line.lastchar) { + if (el->el_line.cursor == el->el_line.buffer) { + terminal_writec(el, c); /* then do a EOF */ + return CC_EOF; + } else { + /* + * Here we could list completions, but it is an + * error right now + */ + terminal_beep(el); + return CC_ERROR; + } + } else { +#ifdef notyet + re_goto_bottom(el); + *el->el_line.lastchar = '\0'; /* just in case */ + return CC_LIST_CHOICES; +#else + /* + * Just complain for now. + */ + terminal_beep(el); + return CC_ERROR; +#endif + } +} + + +/* vi_kill_line_prev(): + * Vi cut from beginning of line to cursor + * [^U] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_kill_line_prev(EditLine *el, wint_t c __attribute__((__unused__))) +{ + wchar_t *kp, *cp; + + cp = el->el_line.buffer; + kp = el->el_chared.c_kill.buf; + while (cp < el->el_line.cursor) + *kp++ = *cp++; /* copy it */ + el->el_chared.c_kill.last = kp; + c_delbefore(el, (int)(el->el_line.cursor - el->el_line.buffer)); + el->el_line.cursor = el->el_line.buffer; /* zap! */ + return CC_REFRESH; +} + + +/* vi_search_prev(): + * Vi search history previous + * [?] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_search_prev(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + return cv_search(el, ED_SEARCH_PREV_HISTORY); +} + + +/* vi_search_next(): + * Vi search history next + * [/] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_search_next(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + return cv_search(el, ED_SEARCH_NEXT_HISTORY); +} + + +/* vi_repeat_search_next(): + * Vi repeat current search in the same search direction + * [n] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_repeat_search_next(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_search.patlen == 0) + return CC_ERROR; + else + return cv_repeat_srch(el, el->el_search.patdir); +} + + +/* vi_repeat_search_prev(): + * Vi repeat current search in the opposite search direction + * [N] + */ +/*ARGSUSED*/ +libedit_private el_action_t +vi_repeat_search_prev(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + if (el->el_search.patlen == 0) + return CC_ERROR; + else + return (cv_repeat_srch(el, + el->el_search.patdir == ED_SEARCH_PREV_HISTORY ? + ED_SEARCH_NEXT_HISTORY : ED_SEARCH_PREV_HISTORY)); +} + + +/* vi_next_char(): + * Vi move to the character specified next + * [f] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_next_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 0); +} + + +/* vi_prev_char(): + * Vi move to the character specified previous + * [F] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 0); +} + + +/* vi_to_next_char(): + * Vi move up to the character specified next + * [t] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_to_next_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + return cv_csearch(el, CHAR_FWD, -1, el->el_state.argument, 1); +} + + +/* vi_to_prev_char(): + * Vi move up to the character specified previous + * [T] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_to_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + return cv_csearch(el, CHAR_BACK, -1, el->el_state.argument, 1); +} + + +/* vi_repeat_next_char(): + * Vi repeat current character search in the same search direction + * [;] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_repeat_next_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + return cv_csearch(el, el->el_search.chadir, el->el_search.chacha, + el->el_state.argument, el->el_search.chatflg); +} + + +/* vi_repeat_prev_char(): + * Vi repeat current character search in the opposite search direction + * [,] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_repeat_prev_char(EditLine *el, wint_t c __attribute__((__unused__))) +{ + el_action_t r; + int dir = el->el_search.chadir; + + r = cv_csearch(el, -dir, el->el_search.chacha, + el->el_state.argument, el->el_search.chatflg); + el->el_search.chadir = dir; + return r; +} + + +/* vi_match(): + * Vi go to matching () {} or [] + * [%] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_match(EditLine *el, wint_t c __attribute__((__unused__))) +{ + const wchar_t match_chars[] = L"()[]{}"; + wchar_t *cp; + size_t delta, i, count; + wchar_t o_ch, c_ch; + + *el->el_line.lastchar = '\0'; /* just in case */ + + i = wcscspn(el->el_line.cursor, match_chars); + o_ch = el->el_line.cursor[i]; + if (o_ch == 0) + return CC_ERROR; + delta = (size_t)(wcschr(match_chars, o_ch) - match_chars); + c_ch = match_chars[delta ^ 1]; + count = 1; + delta = 1 - (delta & 1) * 2; + + for (cp = &el->el_line.cursor[i]; count; ) { + cp += delta; + if (cp < el->el_line.buffer || cp >= el->el_line.lastchar) + return CC_ERROR; + if (*cp == o_ch) + count++; + else if (*cp == c_ch) + count--; + } + + el->el_line.cursor = cp; + + if (el->el_chared.c_vcmd.action != NOP) { + /* NB posix says char under cursor should NOT be deleted + for -ve delta - this is different to netbsd vi. */ + if (delta > 0) + el->el_line.cursor++; + cv_delfini(el); + return CC_REFRESH; + } + return CC_CURSOR; +} + +/* vi_undo_line(): + * Vi undo all changes to line + * [U] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_undo_line(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + cv_undo(el); + return hist_get(el); +} + +/* vi_to_column(): + * Vi go to specified column + * [|] + * NB netbsd vi goes to screen column 'n', posix says nth character + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_to_column(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_line.cursor = el->el_line.buffer; + el->el_state.argument--; + return ed_next_char(el, 0); +} + +/* vi_yank_end(): + * Vi yank to end of line + * [Y] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_yank_end(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + cv_yank(el, el->el_line.cursor, + (int)(el->el_line.lastchar - el->el_line.cursor)); + return CC_REFRESH; +} + +/* vi_yank(): + * Vi yank + * [y] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_yank(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + return cv_action(el, YANK); +} + +/* vi_comment_out(): + * Vi comment out current command + * [#] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_comment_out(EditLine *el, wint_t c __attribute__((__unused__))) +{ + + el->el_line.cursor = el->el_line.buffer; + c_insert(el, 1); + *el->el_line.cursor = '#'; + re_refresh(el); + return ed_newline(el, 0); +} + +/* vi_alias(): + * Vi include shell alias + * [@] + * NB: posix implies that we should enter insert mode, however + * this is against historical precedent... + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_alias(EditLine *el, wint_t c __attribute__((__unused__))) +{ + char alias_name[3]; + const char *alias_text; + + if (el->el_chared.c_aliasfun == NULL) + return CC_ERROR; + + alias_name[0] = '_'; + alias_name[2] = 0; + if (el_getc(el, &alias_name[1]) != 1) + return CC_ERROR; + + alias_text = (*el->el_chared.c_aliasfun)(el->el_chared.c_aliasarg, + alias_name); + if (alias_text != NULL) + el_wpush(el, ct_decode_string(alias_text, &el->el_scratch)); + return CC_NORM; +} + +/* vi_to_history_line(): + * Vi go to specified history file line. + * [G] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_to_history_line(EditLine *el, wint_t c __attribute__((__unused__))) +{ + int sv_event_no = el->el_history.eventno; + el_action_t rval; + + + if (el->el_history.eventno == 0) { + (void) wcsncpy(el->el_history.buf, el->el_line.buffer, + EL_BUFSIZ); + el->el_history.last = el->el_history.buf + + (el->el_line.lastchar - el->el_line.buffer); + } + + /* Lack of a 'count' means oldest, not 1 */ + if (!el->el_state.doingarg) { + el->el_history.eventno = 0x7fffffff; + hist_get(el); + } else { + /* This is brain dead, all the rest of this code counts + * upwards going into the past. Here we need count in the + * other direction (to match the output of fc -l). + * I could change the world, but this seems to suffice. + */ + el->el_history.eventno = 1; + if (hist_get(el) == CC_ERROR) + return CC_ERROR; + el->el_history.eventno = 1 + el->el_history.ev.num + - el->el_state.argument; + if (el->el_history.eventno < 0) { + el->el_history.eventno = sv_event_no; + return CC_ERROR; + } + } + rval = hist_get(el); + if (rval == CC_ERROR) + el->el_history.eventno = sv_event_no; + return rval; +} + +/* vi_histedit(): + * Vi edit history line with vi + * [v] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_histedit(EditLine *el, wint_t c __attribute__((__unused__))) +{ + int fd; + pid_t pid; + ssize_t st; + int status; + char tempfile[] = "/tmp/histedit.XXXXXXXXXX"; + char *cp = NULL; + size_t len; + wchar_t *line = NULL; + + if (el->el_state.doingarg) { + if (vi_to_history_line(el, 0) == CC_ERROR) + return CC_ERROR; + } + + fd = mkstemp(tempfile); + if (fd < 0) + return CC_ERROR; + len = (size_t)(el->el_line.lastchar - el->el_line.buffer); +#define TMP_BUFSIZ (EL_BUFSIZ * MB_LEN_MAX) + cp = el_malloc(TMP_BUFSIZ * sizeof(*cp)); + if (cp == NULL) + goto error; + line = el_malloc(len * sizeof(*line) + 1); + if (line == NULL) + goto error; + wcsncpy(line, el->el_line.buffer, len); + line[len] = '\0'; + wcstombs(cp, line, TMP_BUFSIZ - 1); + cp[TMP_BUFSIZ - 1] = '\0'; + len = strlen(cp); + write(fd, cp, len); + write(fd, "\n", (size_t)1); + pid = fork(); + switch (pid) { + case -1: + goto error; + case 0: + close(fd); + execlp("vi", "vi", tempfile, (char *)NULL); + exit(0); + /*NOTREACHED*/ + default: + while (waitpid(pid, &status, 0) != pid) + continue; + lseek(fd, (off_t)0, SEEK_SET); + st = read(fd, cp, TMP_BUFSIZ - 1); + if (st > 0) { + cp[st] = '\0'; + len = (size_t)(el->el_line.limit - el->el_line.buffer); + len = mbstowcs(el->el_line.buffer, cp, len); + if (len > 0 && el->el_line.buffer[len - 1] == '\n') + --len; + } + else + len = 0; + el->el_line.cursor = el->el_line.buffer; + el->el_line.lastchar = el->el_line.buffer + len; + el_free(cp); + el_free(line); + break; + } + + close(fd); + unlink(tempfile); + /* return CC_REFRESH; */ + return ed_newline(el, 0); +error: + el_free(line); + el_free(cp); + close(fd); + unlink(tempfile); + return CC_ERROR; +} + +/* vi_history_word(): + * Vi append word from previous input line + * [_] + * Who knows where this one came from! + * '_' in vi means 'entire current line', so 'cc' is a synonym for 'c_' + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_history_word(EditLine *el, wint_t c __attribute__((__unused__))) +{ + const wchar_t *wp = HIST_FIRST(el); + const wchar_t *wep, *wsp; + int len; + wchar_t *cp; + const wchar_t *lim; + + if (wp == NULL) + return CC_ERROR; + + wep = wsp = NULL; + do { + while (iswspace(*wp)) + wp++; + if (*wp == 0) + break; + wsp = wp; + while (*wp && !iswspace(*wp)) + wp++; + wep = wp; + } while ((!el->el_state.doingarg || --el->el_state.argument > 0) + && *wp != 0); + + if (wsp == NULL || (el->el_state.doingarg && el->el_state.argument != 0)) + return CC_ERROR; + + cv_undo(el); + len = (int)(wep - wsp); + if (el->el_line.cursor < el->el_line.lastchar) + el->el_line.cursor++; + c_insert(el, len + 1); + cp = el->el_line.cursor; + lim = el->el_line.limit; + if (cp < lim) + *cp++ = ' '; + while (wsp < wep && cp < lim) + *cp++ = *wsp++; + el->el_line.cursor = cp; + + el->el_map.current = el->el_map.key; + return CC_REFRESH; +} + +/* vi_redo(): + * Vi redo last non-motion command + * [.] + */ +libedit_private el_action_t +/*ARGSUSED*/ +vi_redo(EditLine *el, wint_t c __attribute__((__unused__))) +{ + c_redo_t *r = &el->el_chared.c_redo; + + if (!el->el_state.doingarg && r->count) { + el->el_state.doingarg = 1; + el->el_state.argument = r->count; + } + + el->el_chared.c_vcmd.pos = el->el_line.cursor; + el->el_chared.c_vcmd.action = r->action; + if (r->pos != r->buf) { + if (r->pos + 1 > r->lim) + /* sanity */ + r->pos = r->lim - 1; + r->pos[0] = 0; + el_wpush(el, r->buf); + } + + el->el_state.thiscmd = r->cmd; + el->el_state.thisch = r->ch; + return (*el->el_map.func[r->cmd])(el, r->ch); +} diff --git a/crypto/heimdal/lib/libedit/src/vis.h b/crypto/heimdal/lib/libedit/src/vis.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/vis.h @@ -0,0 +1,120 @@ +/* $NetBSD: vis.h,v 1.24 2016/01/14 20:42:14 christos Exp $ */ + +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)vis.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _VIS_H_ +#define _VIS_H_ + +#include + +/* + * to select alternate encoding format + */ +#define VIS_OCTAL 0x0001 /* use octal \ddd format */ +#define VIS_CSTYLE 0x0002 /* use \[nrft0..] where appropiate */ + +/* + * to alter set of characters encoded (default is to encode all + * non-graphic except space, tab, and newline). + */ +#define VIS_SP 0x0004 /* also encode space */ +#define VIS_TAB 0x0008 /* also encode tab */ +#define VIS_NL 0x0010 /* also encode newline */ +#define VIS_WHITE (VIS_SP | VIS_TAB | VIS_NL) +#define VIS_SAFE 0x0020 /* only encode "unsafe" characters */ + +/* + * other + */ +#define VIS_NOSLASH 0x0040 /* inhibit printing '\' */ +#define VIS_HTTP1808 0x0080 /* http-style escape % hex hex */ +#define VIS_HTTPSTYLE 0x0080 /* http-style escape % hex hex */ +#define VIS_MIMESTYLE 0x0100 /* mime-style escape = HEX HEX */ +#define VIS_HTTP1866 0x0200 /* http-style &#num; or &string; */ +#define VIS_NOESCAPE 0x0400 /* don't decode `\' */ +#define _VIS_END 0x0800 /* for unvis */ +#define VIS_GLOB 0x1000 /* encode glob(3) magic characters */ +#define VIS_SHELL 0x2000 /* encode shell special characters [not glob] */ +#define VIS_META (VIS_WHITE | VIS_GLOB | VIS_SHELL) +#define VIS_NOLOCALE 0x4000 /* encode using the C locale */ + +/* + * unvis return codes + */ +#define UNVIS_VALID 1 /* character valid */ +#define UNVIS_VALIDPUSH 2 /* character valid, push back passed char */ +#define UNVIS_NOCHAR 3 /* valid sequence, no character produced */ +#define UNVIS_SYNBAD -1 /* unrecognized escape sequence */ +#define UNVIS_ERROR -2 /* decoder in unknown state (unrecoverable) */ + +/* + * unvis flags + */ +#define UNVIS_END _VIS_END /* no more characters */ + +#ifdef HAVE_SYS_CDEFS_H +#include +#endif + +__BEGIN_DECLS +char *vis(char *, int, int, int); +char *nvis(char *, size_t, int, int, int); + +char *svis(char *, int, int, int, const char *); +char *snvis(char *, size_t, int, int, int, const char *); + +int strvis(char *, const char *, int); +int stravis(char **, const char *, int); +int strnvis(char *, size_t, const char *, int); + +int strsvis(char *, const char *, int, const char *); +int strsnvis(char *, size_t, const char *, int, const char *); + +int strvisx(char *, const char *, size_t, int); +int strnvisx(char *, size_t, const char *, size_t, int); +int strenvisx(char *, size_t, const char *, size_t, int, int *); + +int strsvisx(char *, const char *, size_t, int, const char *); +int strsnvisx(char *, size_t, const char *, size_t, int, const char *); +int strsenvisx(char *, size_t, const char *, size_t , int, const char *, + int *); + +int strunvis(char *, const char *); +int strnunvis(char *, size_t, const char *); + +int strunvisx(char *, const char *, int); +int strnunvisx(char *, size_t, const char *, int); + +int unvis(char *, int, int *, int); +__END_DECLS + +#endif /* !_VIS_H_ */ diff --git a/crypto/heimdal/lib/libedit/src/vis.c b/crypto/heimdal/lib/libedit/src/vis.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/vis.c @@ -0,0 +1,728 @@ +/* $NetBSD: vis.c,v 1.71 2016/01/14 20:41:23 christos Exp $ */ + +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/*- + * Copyright (c) 1999, 2005 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: vis.c,v 1.71 2016/01/14 20:41:23 christos Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +#if !HAVE_VIS || !HAVE_SVIS +#include +#include +#include +#include + +/* + * The reason for going through the trouble to deal with character encodings + * in vis(3), is that we use this to safe encode output of commands. This + * safe encoding varies depending on the character set. For example if we + * display ps output in French, we don't want to display French characters + * as M-foo. + */ + +static wchar_t *do_svis(wchar_t *, wint_t, int, wint_t, const wchar_t *); + +#undef BELL +#define BELL L'\a' + +#if defined(LC_C_LOCALE) +#define iscgraph(c) isgraph_l(c, LC_C_LOCALE) +#else +/* Keep it simple for now, no locale stuff */ +#define iscgraph(c) isgraph(c) +#ifdef notyet +#include +static int +iscgraph(int c) { + int rv; + char *ol; + + ol = setlocale(LC_CTYPE, "C"); + rv = isgraph(c); + if (ol) + setlocale(LC_CTYPE, ol); + return rv; +} +#endif +#endif + +#define ISGRAPH(flags, c) \ + (((flags) & VIS_NOLOCALE) ? iscgraph(c) : iswgraph(c)) + +#define iswoctal(c) (((u_char)(c)) >= L'0' && ((u_char)(c)) <= L'7') +#define iswwhite(c) (c == L' ' || c == L'\t' || c == L'\n') +#define iswsafe(c) (c == L'\b' || c == BELL || c == L'\r') +#define xtoa(c) L"0123456789abcdef"[c] +#define XTOA(c) L"0123456789ABCDEF"[c] + +#define MAXEXTRAS 30 + +static const wchar_t char_shell[] = L"'`\";&<>()|{}]\\$!^~"; +static const wchar_t char_glob[] = L"*?[#"; + +/* + * This is do_hvis, for HTTP style (RFC 1808) + */ +static wchar_t * +do_hvis(wchar_t *dst, wint_t c, int flags, wint_t nextc, const wchar_t *extra) +{ + if (iswalnum(c) + /* safe */ + || c == L'$' || c == L'-' || c == L'_' || c == L'.' || c == L'+' + /* extra */ + || c == L'!' || c == L'*' || c == L'\'' || c == L'(' || c == L')' + || c == L',') + dst = do_svis(dst, c, flags, nextc, extra); + else { + *dst++ = L'%'; + *dst++ = xtoa(((unsigned int)c >> 4) & 0xf); + *dst++ = xtoa((unsigned int)c & 0xf); + } + + return dst; +} + +/* + * This is do_mvis, for Quoted-Printable MIME (RFC 2045) + * NB: No handling of long lines or CRLF. + */ +static wchar_t * +do_mvis(wchar_t *dst, wint_t c, int flags, wint_t nextc, const wchar_t *extra) +{ + if ((c != L'\n') && + /* Space at the end of the line */ + ((iswspace(c) && (nextc == L'\r' || nextc == L'\n')) || + /* Out of range */ + (!iswspace(c) && (c < 33 || (c > 60 && c < 62) || c > 126)) || + /* Specific char to be escaped */ + wcschr(L"#$@[\\]^`{|}~", c) != NULL)) { + *dst++ = L'='; + *dst++ = XTOA(((unsigned int)c >> 4) & 0xf); + *dst++ = XTOA((unsigned int)c & 0xf); + } else + dst = do_svis(dst, c, flags, nextc, extra); + return dst; +} + +/* + * Output single byte of multibyte character. + */ +static wchar_t * +do_mbyte(wchar_t *dst, wint_t c, int flags, wint_t nextc, int iswextra) +{ + if (flags & VIS_CSTYLE) { + switch (c) { + case L'\n': + *dst++ = L'\\'; *dst++ = L'n'; + return dst; + case L'\r': + *dst++ = L'\\'; *dst++ = L'r'; + return dst; + case L'\b': + *dst++ = L'\\'; *dst++ = L'b'; + return dst; + case BELL: + *dst++ = L'\\'; *dst++ = L'a'; + return dst; + case L'\v': + *dst++ = L'\\'; *dst++ = L'v'; + return dst; + case L'\t': + *dst++ = L'\\'; *dst++ = L't'; + return dst; + case L'\f': + *dst++ = L'\\'; *dst++ = L'f'; + return dst; + case L' ': + *dst++ = L'\\'; *dst++ = L's'; + return dst; + case L'\0': + *dst++ = L'\\'; *dst++ = L'0'; + if (iswoctal(nextc)) { + *dst++ = L'0'; + *dst++ = L'0'; + } + return dst; + /* We cannot encode these characters in VIS_CSTYLE + * because they special meaning */ + case L'n': + case L'r': + case L'b': + case L'a': + case L'v': + case L't': + case L'f': + case L's': + case L'0': + case L'M': + case L'^': + case L'$': /* vis(1) -l */ + break; + default: + if (ISGRAPH(flags, c) && !iswoctal(c)) { + *dst++ = L'\\'; + *dst++ = c; + return dst; + } + } + } + if (iswextra || ((c & 0177) == L' ') || (flags & VIS_OCTAL)) { + *dst++ = L'\\'; + *dst++ = (u_char)(((u_int32_t)(u_char)c >> 6) & 03) + L'0'; + *dst++ = (u_char)(((u_int32_t)(u_char)c >> 3) & 07) + L'0'; + *dst++ = (c & 07) + L'0'; + } else { + if ((flags & VIS_NOSLASH) == 0) + *dst++ = L'\\'; + + if (c & 0200) { + c &= 0177; + *dst++ = L'M'; + } + + if (iswcntrl(c)) { + *dst++ = L'^'; + if (c == 0177) + *dst++ = L'?'; + else + *dst++ = c + L'@'; + } else { + *dst++ = L'-'; + *dst++ = c; + } + } + + return dst; +} + +/* + * This is do_vis, the central code of vis. + * dst: Pointer to the destination buffer + * c: Character to encode + * flags: Flags word + * nextc: The character following 'c' + * extra: Pointer to the list of extra characters to be + * backslash-protected. + */ +static wchar_t * +do_svis(wchar_t *dst, wint_t c, int flags, wint_t nextc, const wchar_t *extra) +{ + int iswextra, i, shft; + uint64_t bmsk, wmsk; + + iswextra = wcschr(extra, c) != NULL; + if (!iswextra && (ISGRAPH(flags, c) || iswwhite(c) || + ((flags & VIS_SAFE) && iswsafe(c)))) { + *dst++ = c; + return dst; + } + + /* See comment in istrsenvisx() output loop, below. */ + wmsk = 0; + for (i = sizeof(wmsk) - 1; i >= 0; i--) { + shft = i * NBBY; + bmsk = (uint64_t)0xffLL << shft; + wmsk |= bmsk; + if ((c & wmsk) || i == 0) + dst = do_mbyte(dst, (wint_t)( + (uint64_t)(c & bmsk) >> shft), + flags, nextc, iswextra); + } + + return dst; +} + +typedef wchar_t *(*visfun_t)(wchar_t *, wint_t, int, wint_t, const wchar_t *); + +/* + * Return the appropriate encoding function depending on the flags given. + */ +static visfun_t +getvisfun(int flags) +{ + if (flags & VIS_HTTPSTYLE) + return do_hvis; + if (flags & VIS_MIMESTYLE) + return do_mvis; + return do_svis; +} + +/* + * Expand list of extra characters to not visually encode. + */ +static wchar_t * +makeextralist(int flags, const char *src) +{ + wchar_t *dst, *d; + size_t len; + const wchar_t *s; + + len = strlen(src); + if ((dst = calloc(len + MAXEXTRAS, sizeof(*dst))) == NULL) + return NULL; + + if ((flags & VIS_NOLOCALE) || mbstowcs(dst, src, len) == (size_t)-1) { + size_t i; + for (i = 0; i < len; i++) + dst[i] = (wchar_t)(u_char)src[i]; + d = dst + len; + } else + d = dst + wcslen(dst); + + if (flags & VIS_GLOB) + for (s = char_glob; *s; *d++ = *s++) + continue; + + if (flags & VIS_SHELL) + for (s = char_shell; *s; *d++ = *s++) + continue; + + if (flags & VIS_SP) *d++ = L' '; + if (flags & VIS_TAB) *d++ = L'\t'; + if (flags & VIS_NL) *d++ = L'\n'; + if ((flags & VIS_NOSLASH) == 0) *d++ = L'\\'; + *d = L'\0'; + + return dst; +} + +/* + * istrsenvisx() + * The main internal function. + * All user-visible functions call this one. + */ +static int +istrsenvisx(char **mbdstp, size_t *dlen, const char *mbsrc, size_t mblength, + int flags, const char *mbextra, int *cerr_ptr) +{ + wchar_t *dst, *src, *pdst, *psrc, *start, *extra; + size_t len, olen; + uint64_t bmsk, wmsk; + wint_t c; + visfun_t f; + int clen = 0, cerr, error = -1, i, shft; + char *mbdst, *mdst; + ssize_t mbslength, maxolen; + + _DIAGASSERT(mbdstp != NULL); + _DIAGASSERT(mbsrc != NULL || mblength == 0); + _DIAGASSERT(mbextra != NULL); + + /* + * Input (mbsrc) is a char string considered to be multibyte + * characters. The input loop will read this string pulling + * one character, possibly multiple bytes, from mbsrc and + * converting each to wchar_t in src. + * + * The vis conversion will be done using the wide char + * wchar_t string. + * + * This will then be converted back to a multibyte string to + * return to the caller. + */ + + /* Allocate space for the wide char strings */ + psrc = pdst = extra = NULL; + mdst = NULL; + if ((psrc = calloc(mblength + 1, sizeof(*psrc))) == NULL) + return -1; + if ((pdst = calloc((4 * mblength) + 1, sizeof(*pdst))) == NULL) + goto out; + if (*mbdstp == NULL) { + if ((mdst = calloc((4 * mblength) + 1, sizeof(*mdst))) == NULL) + goto out; + *mbdstp = mdst; + } + + mbdst = *mbdstp; + dst = pdst; + src = psrc; + + if (flags & VIS_NOLOCALE) { + /* Do one byte at a time conversion */ + cerr = 1; + } else { + /* Use caller's multibyte conversion error flag. */ + cerr = cerr_ptr ? *cerr_ptr : 0; + } + + /* + * Input loop. + * Handle up to mblength characters (not bytes). We do not + * stop at NULs because we may be processing a block of data + * that includes NULs. + */ + mbslength = (ssize_t)mblength; + /* + * When inputing a single character, must also read in the + * next character for nextc, the look-ahead character. + */ + if (mbslength == 1) + mbslength++; + while (mbslength > 0) { + /* Convert one multibyte character to wchar_t. */ + if (!cerr) + clen = mbtowc(src, mbsrc, MB_LEN_MAX); + if (cerr || clen < 0) { + /* Conversion error, process as a byte instead. */ + *src = (wint_t)(u_char)*mbsrc; + clen = 1; + cerr = 1; + } + if (clen == 0) + /* + * NUL in input gives 0 return value. process + * as single NUL byte and keep going. + */ + clen = 1; + /* Advance buffer character pointer. */ + src++; + /* Advance input pointer by number of bytes read. */ + mbsrc += clen; + /* Decrement input byte count. */ + mbslength -= clen; + } + len = src - psrc; + src = psrc; + /* + * In the single character input case, we will have actually + * processed two characters, c and nextc. Reset len back to + * just a single character. + */ + if (mblength < len) + len = mblength; + + /* Convert extra argument to list of characters for this mode. */ + extra = makeextralist(flags, mbextra); + if (!extra) { + if (dlen && *dlen == 0) { + errno = ENOSPC; + goto out; + } + *mbdst = '\0'; /* can't create extra, return "" */ + error = 0; + goto out; + } + + /* Look up which processing function to call. */ + f = getvisfun(flags); + + /* + * Main processing loop. + * Call do_Xvis processing function one character at a time + * with next character available for look-ahead. + */ + for (start = dst; len > 0; len--) { + c = *src++; + dst = (*f)(dst, c, flags, len >= 1 ? *src : L'\0', extra); + if (dst == NULL) { + errno = ENOSPC; + goto out; + } + } + + /* Terminate the string in the buffer. */ + *dst = L'\0'; + + /* + * Output loop. + * Convert wchar_t string back to multibyte output string. + * If we have hit a multi-byte conversion error on input, + * output byte-by-byte here. Else use wctomb(). + */ + len = wcslen(start); + maxolen = dlen ? *dlen : (wcslen(start) * MB_LEN_MAX + 1); + olen = 0; + for (dst = start; len > 0; len--) { + if (!cerr) + clen = wctomb(mbdst, *dst); + if (cerr || clen < 0) { + /* + * Conversion error, process as a byte(s) instead. + * Examine each byte and higher-order bytes for + * data. E.g., + * 0x000000000000a264 -> a2 64 + * 0x000000001f00a264 -> 1f 00 a2 64 + */ + clen = 0; + wmsk = 0; + for (i = sizeof(wmsk) - 1; i >= 0; i--) { + shft = i * NBBY; + bmsk = (uint64_t)0xffLL << shft; + wmsk |= bmsk; + if ((*dst & wmsk) || i == 0) + mbdst[clen++] = (char)( + (uint64_t)(*dst & bmsk) >> + shft); + } + cerr = 1; + } + /* If this character would exceed our output limit, stop. */ + if (olen + clen > (size_t)maxolen) + break; + /* Advance output pointer by number of bytes written. */ + mbdst += clen; + /* Advance buffer character pointer. */ + dst++; + /* Incrment output character count. */ + olen += clen; + } + + /* Terminate the output string. */ + *mbdst = '\0'; + + if (flags & VIS_NOLOCALE) { + /* Pass conversion error flag out. */ + if (cerr_ptr) + *cerr_ptr = cerr; + } + + free(extra); + free(pdst); + free(psrc); + + return (int)olen; +out: + free(extra); + free(pdst); + free(psrc); + free(mdst); + return error; +} + +static int +istrsenvisxl(char **mbdstp, size_t *dlen, const char *mbsrc, + int flags, const char *mbextra, int *cerr_ptr) +{ + return istrsenvisx(mbdstp, dlen, mbsrc, + mbsrc != NULL ? strlen(mbsrc) : 0, flags, mbextra, cerr_ptr); +} + +#endif + +#if !HAVE_SVIS +/* + * The "svis" variants all take an "extra" arg that is a pointer + * to a NUL-terminated list of characters to be encoded, too. + * These functions are useful e. g. to encode strings in such a + * way so that they are not interpreted by a shell. + */ + +char * +svis(char *mbdst, int c, int flags, int nextc, const char *mbextra) +{ + char cc[2]; + int ret; + + cc[0] = c; + cc[1] = nextc; + + ret = istrsenvisx(&mbdst, NULL, cc, 1, flags, mbextra, NULL); + if (ret < 0) + return NULL; + return mbdst + ret; +} + +char * +snvis(char *mbdst, size_t dlen, int c, int flags, int nextc, const char *mbextra) +{ + char cc[2]; + int ret; + + cc[0] = c; + cc[1] = nextc; + + ret = istrsenvisx(&mbdst, &dlen, cc, 1, flags, mbextra, NULL); + if (ret < 0) + return NULL; + return mbdst + ret; +} + +int +strsvis(char *mbdst, const char *mbsrc, int flags, const char *mbextra) +{ + return istrsenvisxl(&mbdst, NULL, mbsrc, flags, mbextra, NULL); +} + +int +strsnvis(char *mbdst, size_t dlen, const char *mbsrc, int flags, const char *mbextra) +{ + return istrsenvisxl(&mbdst, &dlen, mbsrc, flags, mbextra, NULL); +} + +int +strsvisx(char *mbdst, const char *mbsrc, size_t len, int flags, const char *mbextra) +{ + return istrsenvisx(&mbdst, NULL, mbsrc, len, flags, mbextra, NULL); +} + +int +strsnvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags, + const char *mbextra) +{ + return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, mbextra, NULL); +} + +int +strsenvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags, + const char *mbextra, int *cerr_ptr) +{ + return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, mbextra, cerr_ptr); +} +#endif + +#if !HAVE_VIS +/* + * vis - visually encode characters + */ +char * +vis(char *mbdst, int c, int flags, int nextc) +{ + char cc[2]; + int ret; + + cc[0] = c; + cc[1] = nextc; + + ret = istrsenvisx(&mbdst, NULL, cc, 1, flags, "", NULL); + if (ret < 0) + return NULL; + return mbdst + ret; +} + +char * +nvis(char *mbdst, size_t dlen, int c, int flags, int nextc) +{ + char cc[2]; + int ret; + + cc[0] = c; + cc[1] = nextc; + + ret = istrsenvisx(&mbdst, &dlen, cc, 1, flags, "", NULL); + if (ret < 0) + return NULL; + return mbdst + ret; +} + +/* + * strvis - visually encode characters from src into dst + * + * Dst must be 4 times the size of src to account for possible + * expansion. The length of dst, not including the trailing NULL, + * is returned. + */ + +int +strvis(char *mbdst, const char *mbsrc, int flags) +{ + return istrsenvisxl(&mbdst, NULL, mbsrc, flags, "", NULL); +} + +int +strnvis(char *mbdst, size_t dlen, const char *mbsrc, int flags) +{ + return istrsenvisxl(&mbdst, &dlen, mbsrc, flags, "", NULL); +} + +int +stravis(char **mbdstp, const char *mbsrc, int flags) +{ + *mbdstp = NULL; + return istrsenvisxl(mbdstp, NULL, mbsrc, flags, "", NULL); +} + +/* + * strvisx - visually encode characters from src into dst + * + * Dst must be 4 times the size of src to account for possible + * expansion. The length of dst, not including the trailing NULL, + * is returned. + * + * Strvisx encodes exactly len characters from src into dst. + * This is useful for encoding a block of data. + */ + +int +strvisx(char *mbdst, const char *mbsrc, size_t len, int flags) +{ + return istrsenvisx(&mbdst, NULL, mbsrc, len, flags, "", NULL); +} + +int +strnvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags) +{ + return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, "", NULL); +} + +int +strenvisx(char *mbdst, size_t dlen, const char *mbsrc, size_t len, int flags, + int *cerr_ptr) +{ + return istrsenvisx(&mbdst, &dlen, mbsrc, len, flags, "", cerr_ptr); +} +#endif diff --git a/crypto/heimdal/lib/libedit/src/wcsdup.c b/crypto/heimdal/lib/libedit/src/wcsdup.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/libedit/src/wcsdup.c @@ -0,0 +1,43 @@ +/* $NetBSD: wcsdup.c,v 1.3 2008/05/26 13:17:48 haad Exp $ */ + +/* + * Copyright (C) 2006 Aleksey Cheusov + * + * This material is provided "as is", with absolutely no warranty expressed + * or implied. Any use is at your own risk. + * + * Permission to use or copy this software for any purpose is hereby granted + * without fee. Permission to modify the code and to distribute modified + * code is also granted without any restrictions. + */ + +#ifndef HAVE_WCSDUP + +#include "config.h" + +#if defined(LIBC_SCCS) && !defined(lint) +__RCSID("$NetBSD: wcsdup.c,v 1.3 2008/05/26 13:17:48 haad Exp $"); +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include + +wchar_t * +wcsdup(const wchar_t *str) +{ + wchar_t *copy; + size_t len; + + _DIAGASSERT(str != NULL); + + len = wcslen(str) + 1; + copy = malloc(len * sizeof (wchar_t)); + + if (!copy) + return NULL; + + return wmemcpy(copy, str, len); +} + +#endif diff --git a/crypto/heimdal/lib/ntlm/Makefile.am b/crypto/heimdal/lib/ntlm/Makefile.am --- a/crypto/heimdal/lib/ntlm/Makefile.am +++ b/crypto/heimdal/lib/ntlm/Makefile.am @@ -2,11 +2,9 @@ include $(top_srcdir)/Makefile.am.common -AM_CPPFLAGS += $(INCLUDE_hcrypto) - lib_LTLIBRARIES = libheimntlm.la -dist_include_HEADERS = heimntlm.h heimntlm-protos.h +dist_include_HEADERS = heimntlm.h $(srcdir)/heimntlm-protos.h nodist_include_HEADERS = ntlm_err.h @@ -23,10 +21,11 @@ libheimntlm_la_LIBADD = \ ../krb5/libkrb5.la \ + $(top_builddir)/lib/wind/libwind.la \ $(LIB_hcrypto) \ $(LIBADD_roken) -$(srcdir)/heimntlm-protos.h: +$(srcdir)/heimntlm-protos.h: $(dist_libheimntlm_la_SOURCES) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -o heimntlm-protos.h $(dist_libheimntlm_la_SOURCES) || rm -f heimntlm-protos.h $(libheimntlm_la_OBJECTS): $(srcdir)/heimntlm-protos.h ntlm_err.h diff --git a/crypto/heimdal/lib/ntlm/Makefile.in b/crypto/heimdal/lib/ntlm/Makefile.in --- a/crypto/heimdal/lib/ntlm/Makefile.in +++ b/crypto/heimdal/lib/ntlm/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -23,6 +22,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -41,9 +95,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(dist_include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map TESTS = test_ntlm$(EXEEXT) check_PROGRAMS = test_ntlm$(EXEEXT) @@ -51,7 +102,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -62,8 +112,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -76,6 +125,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -95,6 +145,8 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -120,48 +172,285 @@ 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)" \ "$(DESTDIR)$(includedir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = -libheimntlm_la_DEPENDENCIES = ../krb5/libkrb5.la $(am__DEPENDENCIES_1) \ +libheimntlm_la_DEPENDENCIES = ../krb5/libkrb5.la \ + $(top_builddir)/lib/wind/libwind.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) dist_libheimntlm_la_OBJECTS = ntlm.lo nodist_libheimntlm_la_OBJECTS = ntlm_err.lo libheimntlm_la_OBJECTS = $(dist_libheimntlm_la_OBJECTS) \ $(nodist_libheimntlm_la_OBJECTS) -libheimntlm_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libheimntlm_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libheimntlm_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(libheimntlm_la_LDFLAGS) $(LDFLAGS) -o \ + $@ test_ntlm_SOURCES = test_ntlm.c test_ntlm_OBJECTS = test_ntlm.$(OBJEXT) test_ntlm_LDADD = $(LDADD) test_ntlm_DEPENDENCIES = libheimntlm.la $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/ntlm.Plo ./$(DEPDIR)/ntlm_err.Plo \ + ./$(DEPDIR)/test_ntlm.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(dist_libheimntlm_la_SOURCES) \ $(nodist_libheimntlm_la_SOURCES) test_ntlm.c DIST_SOURCES = $(dist_libheimntlm_la_SOURCES) test_ntlm.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac HEADERS = $(dist_include_HEADERS) $(nodist_include_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -176,16 +465,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -195,17 +487,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -224,12 +518,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -238,6 +529,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -254,10 +546,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -265,6 +555,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -279,12 +570,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -301,10 +595,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -315,13 +615,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -345,6 +639,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -368,9 +664,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -380,37 +681,46 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -AM_CPPFLAGS = $(INCLUDES_roken) $(INCLUDE_hcrypto) +AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; lib_LTLIBRARIES = libheimntlm.la -dist_include_HEADERS = heimntlm.h heimntlm-protos.h +dist_include_HEADERS = heimntlm.h $(srcdir)/heimntlm-protos.h nodist_include_HEADERS = ntlm_err.h dist_libheimntlm_la_SOURCES = ntlm.c heimntlm.h nodist_libheimntlm_la_SOURCES = ntlm_err.c libheimntlm_la_LDFLAGS = -version-info 1:0:1 $(am__append_1) libheimntlm_la_LIBADD = \ ../krb5/libkrb5.la \ + $(top_builddir)/lib/wind/libwind.la \ $(LIB_hcrypto) \ $(LIBADD_roken) @@ -428,7 +738,7 @@ all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -441,15 +751,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/ntlm/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/ntlm/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -459,9 +769,18 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_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 + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -469,6 +788,8 @@ 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)"; \ } @@ -484,26 +805,21 @@ clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libheimntlm.la: $(libheimntlm_la_OBJECTS) $(libheimntlm_la_DEPENDENCIES) - $(libheimntlm_la_LINK) -rpath $(libdir) $(libheimntlm_la_OBJECTS) $(libheimntlm_la_LIBADD) $(LIBS) + @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}; \ + } -clean-checkPROGRAMS: - @list='$(check_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 -test_ntlm$(EXEEXT): $(test_ntlm_OBJECTS) $(test_ntlm_DEPENDENCIES) +libheimntlm.la: $(libheimntlm_la_OBJECTS) $(libheimntlm_la_DEPENDENCIES) $(EXTRA_libheimntlm_la_DEPENDENCIES) + $(AM_V_CCLD)$(libheimntlm_la_LINK) -rpath $(libdir) $(libheimntlm_la_OBJECTS) $(libheimntlm_la_LIBADD) $(LIBS) + +test_ntlm$(EXEEXT): $(test_ntlm_OBJECTS) $(test_ntlm_DEPENDENCIES) $(EXTRA_test_ntlm_DEPENDENCIES) @rm -f test_ntlm$(EXEEXT) - $(LINK) $(test_ntlm_OBJECTS) $(test_ntlm_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_ntlm_OBJECTS) $(test_ntlm_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -511,30 +827,36 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntlm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntlm_err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ntlm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntlm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntlm_err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_ntlm.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -543,8 +865,11 @@ -rm -rf .libs _libs install-dist_includeHEADERS: $(dist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(dist_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"; \ @@ -558,13 +883,14 @@ @$(NORMAL_UNINSTALL) @list='$(dist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -578,30 +904,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -613,15 +926,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -630,103 +939,191 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + color_start= color_end=; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test_ntlm.log: test_ntlm$(EXEEXT) + @p='test_ntlm$(EXEEXT)'; \ + b='test_ntlm'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -764,6 +1161,8 @@ $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ @@ -778,11 +1177,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -800,7 +1207,9 @@ clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/ntlm.Plo + -rm -f ./$(DEPDIR)/ntlm_err.Plo + -rm -f ./$(DEPDIR)/test_ntlm.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -825,9 +1234,8 @@ install-dvi-am: -install-exec-am: install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -849,7 +1257,9 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/ntlm.Plo + -rm -f ./$(DEPDIR)/ntlm_err.Plo + -rm -f ./$(DEPDIR)/test_ntlm.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -870,43 +1280,57 @@ uninstall-nodist_includeHEADERS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-checkPROGRAMS clean-generic \ - clean-libLTLIBRARIES clean-libtool ctags dist-hook 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-data-hook install-dist_includeHEADERS install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-checkPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ + ctags ctags-am dist-hook 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-data-hook \ + install-dist_includeHEADERS install-dvi install-dvi-am \ + install-exec install-exec-am install-exec-local install-html \ + install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man \ install-nodist_includeHEADERS 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-dist_includeHEADERS \ - uninstall-hook uninstall-libLTLIBRARIES \ - uninstall-nodist_includeHEADERS + recheck tags tags-am uninstall uninstall-am \ + uninstall-dist_includeHEADERS uninstall-hook \ + uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -914,7 +1338,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -959,11 +1383,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -971,6 +1404,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1013,6 +1448,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1026,13 +1474,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1064,7 +1512,7 @@ done $(libheimntlm_la_OBJECTS): $(srcdir)/version-script.map -$(srcdir)/heimntlm-protos.h: +$(srcdir)/heimntlm-protos.h: $(dist_libheimntlm_la_SOURCES) cd $(srcdir) && perl ../../cf/make-proto.pl -q -P comment -o heimntlm-protos.h $(dist_libheimntlm_la_SOURCES) || rm -f heimntlm-protos.h $(libheimntlm_la_OBJECTS): $(srcdir)/heimntlm-protos.h ntlm_err.h diff --git a/crypto/heimdal/lib/ntlm/NTMakefile b/crypto/heimdal/lib/ntlm/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/ntlm/NTMakefile @@ -0,0 +1,90 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\ntlm + +!include ../../windows/NTMakefile.w32 + +INCFILES= \ + $(INCDIR)\heimntlm.h \ + $(INCDIR)\heimntlm-protos.h \ + $(INCDIR)\ntlm_err.h + +libheimntlm_la_SOURCES = ntlm.c heimntlm.h + +$(OBJ)\heimntlm-protos.h: $(libheimntlm_la_SOURCES) + $(PERL) ../../cf/make-proto.pl -q -P remove -o $(OBJ)\heimntlm-protos.h $(libheimntlm_la_SOURCES) + +$(OBJ)\ntlm_err.c $(OBJ)\ntlm_err.h: ntlm_err.et + cd $(OBJ) + $(BINDIR)\compile_et.exe $(SRCDIR)\ntlm_err.et + cd $(SRCDIR) + +!ifndef STATICLIBS + +RES=$(OBJ)\libheimntlm-version.res + +$(LIBHEIMNTLM): $(BINDIR)\heimntlm.dll + +$(BINDIR)\heimntlm.dll: $(OBJ)\ntlm.obj $(OBJ)\ntlm_err.obj $(LIBHEIMDAL) $(LIBROKEN) $(LIBCOMERR) $(RES) + $(DLLGUILINK) -def:libheimntlm-exports.def -implib:$(LIBHEIMNTLM) + $(DLLPREP_NODIST) + +clean:: + -$(RM) $(BINDIR)\heimntlm.* + +!else + +$(LIBHEIMNTLM): $(OBJ)\ntlm.obj $(OBJ)\ntlm_err.obj + $(LIBCON) + +!endif + +all:: $(INCFILES) $(LIBHEIMNTLM) + + +test-binaries: $(OBJ)\test_ntlm.exe + +test-run: + cd $(OBJ) + -test_ntlm.exe + cd $(SRCDIR) + +$(OBJ)\test_ntlm.exe: $(OBJ)\test_ntlm.obj $(LIBHEIMNTLM) $(LIBHEIMDAL) $(LIBVERS) $(LIBROKEN) + $(EXECONLINK) + $(EXEPREP_NODIST) + +test:: test-binaries test-run + +test-exports: + $(PERL) ..\..\cf\w32-check-exported-symbols.pl --vs version-script.map --def libheimntlm-exports.def + +test:: test-exports diff --git a/crypto/heimdal/lib/ntlm/heimntlm-protos.h b/crypto/heimdal/lib/ntlm/heimntlm-protos.h --- a/crypto/heimdal/lib/ntlm/heimntlm-protos.h +++ b/crypto/heimdal/lib/ntlm/heimntlm-protos.h @@ -1,6 +1,7 @@ /* This is a generated file */ #ifndef __heimntlm_protos_h__ #define __heimntlm_protos_h__ +#ifndef DOXY #include @@ -8,6 +9,20 @@ extern "C" { #endif +/** + * Generates an NTLMv1 session random with assosited session master key. + * + * @param key the ntlm v1 key + * @param len length of key + * @param session generated session nonce, should be freed with heim_ntlm_free_buf(). + * @param master calculated session master key, should be freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_build_ntlm1_master ( void */*key*/, @@ -15,6 +30,21 @@ struct ntlm_buf */*session*/, struct ntlm_buf */*master*/); +/** + * Generates an NTLMv2 session random with associated session master key. + * + * @param key the NTLMv2 key + * @param len length of key + * @param blob the NTLMv2 "blob" + * @param session generated session nonce, should be freed with heim_ntlm_free_buf(). + * @param master calculated session master key, should be freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_build_ntlm2_master ( void */*key*/, @@ -23,6 +53,23 @@ struct ntlm_buf */*session*/, struct ntlm_buf */*master*/); +/** + * Calculate LMv2 response + * + * @param key the ntlm key + * @param len length of key + * @param username name of the user, as sent in the message, assumed to be in UTF8. + * @param target the name of the target, assumed to be in UTF8. + * @param serverchallenge challenge as sent by the server in the type2 message. + * @param ntlmv2 calculated session key + * @param answer ntlm response answer, should be freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_calculate_lm2 ( const void */*key*/, @@ -33,6 +80,20 @@ unsigned char ntlmv2[16], struct ntlm_buf */*answer*/); +/** + * Calculate NTLMv1 response hash + * + * @param key the ntlm v1 key + * @param len length of key + * @param challenge sent by the server + * @param answer calculated answer, should be freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_calculate_ntlm1 ( void */*key*/, @@ -40,6 +101,24 @@ unsigned char challenge[8], struct ntlm_buf */*answer*/); +/** + * Calculate NTLMv2 response + * + * @param key the ntlm key + * @param len length of key + * @param username name of the user, as sent in the message, assumed to be in UTF8. + * @param target the name of the target, assumed to be in UTF8. + * @param serverchallenge challenge as sent by the server in the type2 message. + * @param infotarget infotarget as sent by the server in the type2 message. + * @param ntlmv2 calculated session key + * @param answer ntlm response answer, should be freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_calculate_ntlm2 ( const void */*key*/, @@ -51,6 +130,10 @@ unsigned char ntlmv2[16], struct ntlm_buf */*answer*/); +/** + * Third check with empty domain. + */ + int heim_ntlm_calculate_ntlm2_sess ( const unsigned char clnt_nonce[8], @@ -65,6 +148,19 @@ const unsigned char svr_chal[8], unsigned char verifier[8]); +/** + * Decodes an NTLM targetinfo message + * + * @param data input data buffer with the encode NTLM targetinfo message + * @param ucs2 if the strings should be encoded with ucs2 (selected by flag in message). + * @param ti the decoded target info, should be freed with heim_ntlm_free_targetinfo(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_decode_targetinfo ( const struct ntlm_buf */*data*/, @@ -87,7 +183,7 @@ int /*ucs2*/, struct ntlm_type3 */*type3*/); -int +void heim_ntlm_derive_ntlm2_sess ( const unsigned char sessionkey[16], const unsigned char */*clnt_nonce*/, @@ -95,42 +191,150 @@ const unsigned char svr_chal[8], unsigned char derivedkey[16]); +/** + * Encodes a ntlm_targetinfo message. + * + * @param ti the ntlm_targetinfo message to encode. + * @param ucs2 ignored + * @param data is the return buffer with the encoded message, should be + * freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_encode_targetinfo ( const struct ntlm_targetinfo */*ti*/, int /*ucs2*/, struct ntlm_buf */*data*/); +/** + * Encodes an ntlm_type1 message. + * + * @param type1 the ntlm_type1 message to encode. + * @param data is the return buffer with the encoded message, should be + * freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_encode_type1 ( const struct ntlm_type1 */*type1*/, struct ntlm_buf */*data*/); +/** + * Encodes an ntlm_type2 message. + * + * @param type2 the ntlm_type2 message to encode. + * @param data is the return buffer with the encoded message, should be + * freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_encode_type2 ( const struct ntlm_type2 */*type2*/, struct ntlm_buf */*data*/); +/** + * Encodes an ntlm_type3 message. + * + * @param type3 the ntlm_type3 message to encode. + * @param data is the return buffer with the encoded message, should be + * @param[out] mic_offset offset of message integrity code + * freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_encode_type3 ( const struct ntlm_type3 */*type3*/, - struct ntlm_buf */*data*/); + struct ntlm_buf */*data*/, + size_t */*mic_offset*/); + +/** + * heim_ntlm_free_buf frees the ntlm buffer + * + * @param p buffer to be freed + * + * @ingroup ntlm_core + */ void heim_ntlm_free_buf (struct ntlm_buf */*p*/); +/** + * Frees the ntlm_targetinfo message + * + * @param ti targetinfo to be freed + * + * @ingroup ntlm_core + */ + void heim_ntlm_free_targetinfo (struct ntlm_targetinfo */*ti*/); +/** + * Frees the ntlm_type1 message + * + * @param data message to be freed + * + * @ingroup ntlm_core + */ + void heim_ntlm_free_type1 (struct ntlm_type1 */*data*/); +/** + * Frees the ntlm_type2 message + * + * @param data message to be freed + * + * @ingroup ntlm_core + */ + void heim_ntlm_free_type2 (struct ntlm_type2 */*data*/); +/** + * Frees the ntlm_type3 message + * + * @param data message to be freed + * + * @ingroup ntlm_core + */ + void heim_ntlm_free_type3 (struct ntlm_type3 */*data*/); +/** + * Given a key and encrypted session, unwrap the session key + * + * @param baseKey the sessionBaseKey + * @param encryptedSession encrypted session, type3.session field. + * @param session generated session nonce, should be freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_keyex_unwrap ( struct ntlm_buf */*baseKey*/, @@ -143,19 +347,60 @@ struct ntlm_buf */*session*/, struct ntlm_buf */*encryptedSession*/); +/** + * Calculate the NTLM key, the password is assumed to be in UTF8. + * + * @param password password to calcute the key for. + * @param key calcuted key, should be freed with heim_ntlm_free_buf(). + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_nt_key ( const char */*password*/, struct ntlm_buf */*key*/); +/** + * Generates an NTLMv2 session key. + * + * @param key the ntlm key + * @param len length of key + * @param username name of the user, as sent in the message, assumed to be in UTF8. + * @param target the name of the target, assumed to be in UTF8. + * @param upper_case_target upper case the target, should not be used only for legacy systems + * @param ntlmv2 the ntlmv2 session key + * + * @return 0 on success, or an error code on failure. + * + * @ingroup ntlm_core + */ + int heim_ntlm_ntlmv2_key ( const void */*key*/, size_t /*len*/, const char */*username*/, const char */*target*/, + int /*upper_case_target*/, unsigned char ntlmv2[16]); +time_t +heim_ntlm_ts2unixtime (uint64_t /*t*/); + +uint64_t +heim_ntlm_unix2ts_time (time_t /*unix_time*/); + +/** + @defgroup ntlm_core Heimdal NTLM library * + * The NTLM core functions implement the string2key generation + * function, message encode and decode function, and the hash function + * functions. + */ + size_t heim_ntlm_unparse_flags ( uint32_t /*flags*/, @@ -175,6 +420,25 @@ struct ntlm_buf */*ntlmResponse*/, struct ntlm_buf */*session*/); +/** + * Verify NTLMv2 response. + * + * @param key the ntlm key + * @param len length of key + * @param username name of the user, as sent in the message, assumed to be in UTF8. + * @param target the name of the target, assumed to be in UTF8. + * @param now the time now (0 if the library should pick it up itself) + * @param serverchallenge challenge as sent by the server in the type2 message. + * @param answer ntlm response answer, should be freed with heim_ntlm_free_buf(). + * @param infotarget infotarget as sent by the server in the type2 message. + * @param ntlmv2 calculated session key + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + int heim_ntlm_verify_ntlm2 ( const void */*key*/, @@ -191,4 +455,5 @@ } #endif +#endif /* DOXY */ #endif /* __heimntlm_protos_h__ */ diff --git a/crypto/heimdal/lib/ntlm/heimntlm.h b/crypto/heimdal/lib/ntlm/heimntlm.h --- a/crypto/heimdal/lib/ntlm/heimntlm.h +++ b/crypto/heimdal/lib/ntlm/heimntlm.h @@ -70,8 +70,8 @@ #define NTLM_TARGET_DOMAIN 0x00010000 #define NTLM_TARGET_SERVER 0x00020000 -#define NTLM_TARGET_SHARE 0x00040000 -#define NTLM_NEG_NTLM2_SESSION 0x00080000 +#define NTLM_TARGET_SHARE 0x00040000 /* mbz */ +#define NTLM_NEG_NTLM2_SESSION 0x00080000 /* EXTENDED_SESSIONSECURITY */ #define NTLM_NEG_NTLM2 0x00080000 #define NTLM_NEG_IDENTIFY 0x00100000 @@ -95,7 +95,9 @@ * heim_ntlm_free_targetinfo(). */ +/* avflags */ #define NTLM_TI_AV_FLAG_GUEST 0x00000001 +#define NTLM_TI_AV_FLAG_MIC 0x00000002 struct ntlm_targetinfo { char *servername; /**< */ @@ -104,6 +106,9 @@ char *dnsservername; /**< */ char *dnstreename; /**< */ uint32_t avflags; /**< */ + char *targetname; + struct ntlm_buf channel_bindings; + uint64_t timestamp; }; /** @@ -149,8 +154,12 @@ struct ntlm_buf sessionkey; /**< */ char *ws; /**< */ uint32_t os[2]; /**< */ + size_t mic_offset; + uint8_t mic[16]; }; +extern time_t heim_ntlm_time_skew; + #include #include diff --git a/crypto/heimdal/lib/ntlm/libheimntlm-exports.def b/crypto/heimdal/lib/ntlm/libheimntlm-exports.def new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/ntlm/libheimntlm-exports.def @@ -0,0 +1,24 @@ +EXPORTS + heim_ntlm_build_ntlm1_master + heim_ntlm_calculate_lm2 + heim_ntlm_calculate_ntlm1 + heim_ntlm_calculate_ntlm2 + heim_ntlm_calculate_ntlm2_sess + heim_ntlm_decode_targetinfo + heim_ntlm_decode_type1 + heim_ntlm_decode_type2 + heim_ntlm_decode_type3 + heim_ntlm_encode_targetinfo + heim_ntlm_encode_type1 + heim_ntlm_encode_type2 + heim_ntlm_encode_type3 + heim_ntlm_free_buf + heim_ntlm_free_targetinfo + heim_ntlm_free_type1 + heim_ntlm_free_type2 + heim_ntlm_free_type3 + heim_ntlm_nt_key + heim_ntlm_ntlmv2_key + heim_ntlm_verify_ntlm2 + heim_ntlm_unparse_flags + initialize_ntlm_error_table_r diff --git a/crypto/heimdal/lib/ntlm/libheimntlm-version.rc b/crypto/heimdal/lib/ntlm/libheimntlm-version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/ntlm/libheimntlm-version.rc @@ -0,0 +1,36 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#define RC_FILE_TYPE VFT_DLL +#define RC_FILE_DESC_0409 "Heimdal NTLM Support Library" +#define RC_FILE_ORIG_0409 "libheimntlm.dll" + +#include "../../windows/version.rc" diff --git a/crypto/heimdal/lib/ntlm/ntlm.c b/crypto/heimdal/lib/ntlm/ntlm.c --- a/crypto/heimdal/lib/ntlm/ntlm.c +++ b/crypto/heimdal/lib/ntlm/ntlm.c @@ -44,9 +44,12 @@ #include #include + +#include #include #include + #define HC_DEPRECATED_CRYPTO #include "krb5-types.h" @@ -103,6 +106,8 @@ static const unsigned char ntlmsigature[8] = "NTLMSSP\x00"; +time_t heim_ntlm_time_skew = 300; + /* * */ @@ -116,6 +121,25 @@ } \ } while(/*CONSTCOND*/0) +#define CHECK_SIZE(f, e) \ + do { \ + ssize_t sret = f; \ + if (sret != (ssize_t)(e)) { \ + ret = HNTLM_ERR_DECODE; \ + goto out; \ + } \ + } while(/*CONSTCOND*/0) + +#define CHECK_OFFSET(f, e) \ + do { \ + off_t sret = f; \ + if (sret != (e)) { \ + ret = HNTLM_ERR_DECODE; \ + goto out; \ + } \ + } while(/*CONSTCOND*/0) + + static struct units ntlm_flag_units[] = { #define ntlm_flag(x) { #x, NTLM_##x } ntlm_flag(ENC_56), @@ -182,35 +206,67 @@ static int ascii2ucs2le(const char *string, int up, struct ntlm_buf *buf) { - unsigned char *p; - size_t len, i; + uint16_t *data; + size_t len, n; + uint8_t *p; + int ret; - len = strlen(string); - if (len / 2 > UINT_MAX) + ret = wind_utf8ucs2_length(string, &len); + if (ret) + return ret; + if (len > UINT_MAX / sizeof(data[0])) return ERANGE; + data = malloc(len * sizeof(data[0])); + if (data == NULL) + return ENOMEM; + + ret = wind_utf8ucs2(string, data, &len); + if (ret) { + free(data); + return ret; + } + + if (len == 0) { + free(data); + buf->data = NULL; + buf->length = 0; + return 0; + } + + /* uppercase string, only handle ascii right now */ + if (up) { + for (n = 0; n < len ; n++) { + if (data[n] < 128) + data[n] = toupper((int)data[n]); + } + } + buf->length = len * 2; - buf->data = malloc(buf->length); + p = buf->data = malloc(buf->length); if (buf->data == NULL && len != 0) { + free(data); heim_ntlm_free_buf(buf); return ENOMEM; } - p = buf->data; - for (i = 0; i < len; i++) { - unsigned char t = (unsigned char)string[i]; - if (t & 0x80) { - heim_ntlm_free_buf(buf); - return EINVAL; - } - if (up) - t = toupper(t); - p[(i * 2) + 0] = t; - p[(i * 2) + 1] = 0; + for (n = 0; n < len ; n++) { + p[(n * 2) + 0] = (data[n] ) & 0xff; + p[(n * 2) + 1] = (data[n] >> 8) & 0xff; } + memset(data, 0, sizeof(data[0]) * len); + free(data); + return 0; } +/* + * Sizes in bytes + */ + +#define SIZE_SEC_BUFFER (2+2+4) +#define SIZE_OS_VERSION (8) + /* * */ @@ -242,13 +298,20 @@ * wire, but using utf8 in memory. */ -static krb5_error_code +static size_t len_string(int ucs2, const char *s) { - size_t len = strlen(s); - if (ucs2) - len *= 2; - return len; + if (ucs2) { + size_t len; + int ret; + + ret = wind_utf8ucs2_length(s, &len); + if (ret == 0) + return len * 2; + return strlen(s) * 5 * 2; + } else { + return strlen(s); + } } /* @@ -259,28 +322,50 @@ ret_string(krb5_storage *sp, int ucs2, size_t len, char **s) { krb5_error_code ret; + uint16_t *data = NULL; *s = malloc(len + 1); if (*s == NULL) return ENOMEM; - CHECK(krb5_storage_read(sp, *s, len), len); + CHECK_SIZE(krb5_storage_read(sp, *s, len), len); (*s)[len] = '\0'; if (ucs2) { - size_t i; - for (i = 0; i < len / 2; i++) { - (*s)[i] = (*s)[i * 2]; - if ((*s)[i * 2 + 1]) { - free(*s); - *s = NULL; - return EINVAL; - } + unsigned int flags = WIND_RW_LE; + size_t utf16len = len / 2; + size_t utf8len; + + data = malloc(utf16len * sizeof(data[0])); + if (data == NULL) { + free(*s); *s = NULL; + ret = ENOMEM; + goto out; } - (*s)[i] = '\0'; + + ret = wind_ucs2read(*s, len, &flags, data, &utf16len); + free(*s); *s = NULL; + if (ret) { + goto out; + } + + CHECK(wind_ucs2utf8_length(data, utf16len, &utf8len), 0); + + utf8len += 1; + + *s = malloc(utf8len); + if (s == NULL) { + ret = ENOMEM; + goto out; + } + + CHECK(wind_ucs2utf8(data, utf16len, *s, &utf8len), 0); } ret = 0; out: + if (data) + free(data); + return ret; } @@ -290,10 +375,10 @@ ret_sec_string(krb5_storage *sp, int ucs2, struct sec_buffer *desc, char **s) { krb5_error_code ret = 0; - CHECK(krb5_storage_seek(sp, desc->offset, SEEK_SET), desc->offset); + CHECK_OFFSET(krb5_storage_seek(sp, desc->offset, SEEK_SET), desc->offset); CHECK(ret_string(sp, ucs2, desc->length, s), 0); out: - return ret; + return ret; } static krb5_error_code @@ -311,7 +396,7 @@ buf.length = strlen(s); } - CHECK(krb5_storage_write(sp, buf.data, buf.length), buf.length); + CHECK_SIZE(krb5_storage_write(sp, buf.data, buf.length), buf.length); if (ucs2) heim_ntlm_free_buf(&buf); ret = 0; @@ -330,8 +415,8 @@ buf->data = malloc(desc->length); buf->length = desc->length; - CHECK(krb5_storage_seek(sp, desc->offset, SEEK_SET), desc->offset); - CHECK(krb5_storage_read(sp, buf->data, buf->length), buf->length); + CHECK_OFFSET(krb5_storage_seek(sp, desc->offset, SEEK_SET), desc->offset); + CHECK_SIZE(krb5_storage_read(sp, buf->data, buf->length), buf->length); ret = 0; out: return ret; @@ -341,7 +426,7 @@ put_buf(krb5_storage *sp, const struct ntlm_buf *buf) { krb5_error_code ret; - CHECK(krb5_storage_write(sp, buf->data, buf->length), buf->length); + CHECK_SIZE(krb5_storage_write(sp, buf->data, buf->length), buf->length); ret = 0; out: return ret; @@ -363,6 +448,8 @@ free(ti->dnsdomainname); free(ti->dnsservername); free(ti->dnstreename); + free(ti->targetname); + heim_ntlm_free_buf(&ti->channel_bindings); memset(ti, 0, sizeof(*ti)); } @@ -423,6 +510,20 @@ CHECK(krb5_store_uint16(out, 4), 0); CHECK(krb5_store_uint32(out, ti->avflags), 0); } + if (ti->timestamp) { + CHECK(krb5_store_uint16(out, 7), 0); + CHECK(krb5_store_uint16(out, 8), 0); + CHECK(krb5_store_uint32(out, ti->timestamp & 0xffffffff), 0); + CHECK(krb5_store_uint32(out, (ti->timestamp >> 32) & 0xffffffff), 0); + } + if (ti->targetname) { + CHECK(encode_ti_string(out, 9, ucs2, ti->targetname), 0); + } + if (ti->channel_bindings.length) { + CHECK(krb5_store_uint16(out, 10), 0); + CHECK(krb5_store_uint16(out, ti->channel_bindings.length), 0); + CHECK_SIZE(krb5_storage_write(out, ti->channel_bindings.data, ti->channel_bindings.length), ti->channel_bindings.length); + } /* end tag */ CHECK(krb5_store_int16(out, 0), 0); @@ -497,6 +598,26 @@ case 6: CHECK(krb5_ret_uint32(in, &ti->avflags), 0); break; + case 7: { + uint32_t tmp; + CHECK(krb5_ret_uint32(in, &tmp), 0); + ti->timestamp = tmp; + CHECK(krb5_ret_uint32(in, &tmp), 0); + ti->timestamp |= ((uint64_t)tmp) << 32; + break; + } + case 9: + CHECK(ret_string(in, 1, len, &ti->targetname), 0); + break; + case 10: + ti->channel_bindings.data = malloc(len); + if (ti->channel_bindings.data == NULL) { + ret = ENOMEM; + goto out; + } + ti->channel_bindings.length = len; + CHECK_SIZE(krb5_storage_read(in, ti->channel_bindings.data, len), len); + break; default: krb5_storage_seek(in, len, SEEK_CUR); break; @@ -508,6 +629,21 @@ return ret; } +static krb5_error_code +encode_os_version(krb5_storage *out) +{ + krb5_error_code ret; + CHECK(krb5_store_uint8(out, 0x06), 0); + CHECK(krb5_store_uint8(out, 0x01), 0); + CHECK(krb5_store_uint16(out, 0x1db0), 0); + CHECK(krb5_store_uint8(out, 0x0f), 0); /* ntlm version 15 */ + CHECK(krb5_store_uint8(out, 0x00), 0); + CHECK(krb5_store_uint8(out, 0x00), 0); + CHECK(krb5_store_uint8(out, 0x00), 0); + out: + return ret; +} + /** * Frees the ntlm_type1 message * @@ -534,6 +670,7 @@ uint32_t type; struct sec_buffer domain, hostname; krb5_storage *in; + int ucs2; memset(data, 0, sizeof(*data)); @@ -544,25 +681,30 @@ } krb5_storage_set_byteorder(in, KRB5_STORAGE_BYTEORDER_LE); - CHECK(krb5_storage_read(in, sig, sizeof(sig)), sizeof(sig)); + CHECK_SIZE(krb5_storage_read(in, sig, sizeof(sig)), sizeof(sig)); CHECK(memcmp(ntlmsigature, sig, sizeof(ntlmsigature)), 0); CHECK(krb5_ret_uint32(in, &type), 0); CHECK(type, 1); CHECK(krb5_ret_uint32(in, &data->flags), 0); - if (data->flags & NTLM_OEM_SUPPLIED_DOMAIN) - CHECK(ret_sec_buffer(in, &domain), 0); - if (data->flags & NTLM_OEM_SUPPLIED_WORKSTATION) - CHECK(ret_sec_buffer(in, &hostname), 0); -#if 0 - if (domain.offset > 32) { + + ucs2 = !!(data->flags & NTLM_NEG_UNICODE); + + /* + * domain and hostname are unconditionally encoded regardless of + * NTLMSSP_NEGOTIATE_OEM_{HOSTNAME,WORKSTATION}_SUPPLIED flag + */ + CHECK(ret_sec_buffer(in, &domain), 0); + CHECK(ret_sec_buffer(in, &hostname), 0); + + if (data->flags & NTLM_NEG_VERSION) { CHECK(krb5_ret_uint32(in, &data->os[0]), 0); CHECK(krb5_ret_uint32(in, &data->os[1]), 0); } -#endif + if (data->flags & NTLM_OEM_SUPPLIED_DOMAIN) - CHECK(ret_sec_string(in, 0, &domain, &data->domain), 0); + CHECK(ret_sec_string(in, ucs2, &domain, &data->domain), 0); if (data->flags & NTLM_OEM_SUPPLIED_WORKSTATION) - CHECK(ret_sec_string(in, 0, &hostname, &data->hostname), 0); + CHECK(ret_sec_string(in, ucs2, &hostname, &data->hostname), 0); out: if (in) @@ -593,35 +735,41 @@ struct sec_buffer domain, hostname; krb5_storage *out; uint32_t base, flags; + int ucs2 = 0; flags = type1->flags; base = 16; + if (flags & NTLM_NEG_UNICODE) + ucs2 = 1; + if (type1->domain) { - base += 8; + base += SIZE_SEC_BUFFER; flags |= NTLM_OEM_SUPPLIED_DOMAIN; } if (type1->hostname) { - base += 8; + base += SIZE_SEC_BUFFER; flags |= NTLM_OEM_SUPPLIED_WORKSTATION; } - if (type1->os[0]) - base += 8; + if (flags & NTLM_NEG_VERSION) + base += SIZE_OS_VERSION; /* os */ - domain.offset = base; if (type1->domain) { - domain.length = len_string(0, type1->domain); + domain.offset = base; + domain.length = len_string(ucs2, type1->domain); domain.allocated = domain.length; } else { + domain.offset = 0; domain.length = 0; domain.allocated = 0; } - hostname.offset = domain.allocated + domain.offset; if (type1->hostname) { - hostname.length = len_string(0, type1->hostname); + hostname.offset = domain.allocated + domain.offset; + hostname.length = len_string(ucs2, type1->hostname); hostname.allocated = hostname.length; } else { + hostname.offset = 0; hostname.length = 0; hostname.allocated = 0; } @@ -631,21 +779,21 @@ return ENOMEM; krb5_storage_set_byteorder(out, KRB5_STORAGE_BYTEORDER_LE); - CHECK(krb5_storage_write(out, ntlmsigature, sizeof(ntlmsigature)), + CHECK_SIZE(krb5_storage_write(out, ntlmsigature, sizeof(ntlmsigature)), sizeof(ntlmsigature)); CHECK(krb5_store_uint32(out, 1), 0); CHECK(krb5_store_uint32(out, flags), 0); CHECK(store_sec_buffer(out, &domain), 0); CHECK(store_sec_buffer(out, &hostname), 0); -#if 0 - CHECK(krb5_store_uint32(out, type1->os[0]), 0); - CHECK(krb5_store_uint32(out, type1->os[1]), 0); -#endif + + if (flags & NTLM_NEG_VERSION) { + CHECK(encode_os_version(out), 0); + } if (type1->domain) - CHECK(put_string(out, 0, type1->domain), 0); + CHECK(put_string(out, ucs2, type1->domain), 0); if (type1->hostname) - CHECK(put_string(out, 0, type1->hostname), 0); + CHECK(put_string(out, ucs2, type1->hostname), 0); { krb5_data d; @@ -695,7 +843,7 @@ } krb5_storage_set_byteorder(in, KRB5_STORAGE_BYTEORDER_LE); - CHECK(krb5_storage_read(in, sig, sizeof(sig)), sizeof(sig)); + CHECK_SIZE(krb5_storage_read(in, sig, sizeof(sig)), sizeof(sig)); CHECK(memcmp(ntlmsigature, sig, sizeof(ntlmsigature)), 0); CHECK(krb5_ret_uint32(in, &type), 0); CHECK(type, 2); @@ -704,7 +852,7 @@ CHECK(krb5_ret_uint32(in, &type2->flags), 0); if (type2->flags & NTLM_NEG_UNICODE) ucs2 = 1; - CHECK(krb5_storage_read(in, type2->challenge, sizeof(type2->challenge)), + CHECK_SIZE(krb5_storage_read(in, type2->challenge, sizeof(type2->challenge)), sizeof(type2->challenge)); CHECK(krb5_ret_uint32(in, &ctx[0]), 0); /* context */ CHECK(krb5_ret_uint32(in, &ctx[1]), 0); @@ -753,7 +901,7 @@ base = 48; if (type2->flags & NTLM_NEG_VERSION) - base += 8; + base += SIZE_OS_VERSION; if (type2->flags & NTLM_NEG_UNICODE) ucs2 = 1; @@ -771,23 +919,22 @@ return ENOMEM; krb5_storage_set_byteorder(out, KRB5_STORAGE_BYTEORDER_LE); - CHECK(krb5_storage_write(out, ntlmsigature, sizeof(ntlmsigature)), + CHECK_SIZE(krb5_storage_write(out, ntlmsigature, sizeof(ntlmsigature)), sizeof(ntlmsigature)); CHECK(krb5_store_uint32(out, 2), 0); CHECK(store_sec_buffer(out, &targetname), 0); CHECK(krb5_store_uint32(out, type2->flags), 0); - CHECK(krb5_storage_write(out, type2->challenge, sizeof(type2->challenge)), + CHECK_SIZE(krb5_storage_write(out, type2->challenge, sizeof(type2->challenge)), sizeof(type2->challenge)); CHECK(krb5_store_uint32(out, 0), 0); /* context */ CHECK(krb5_store_uint32(out, 0), 0); CHECK(store_sec_buffer(out, &targetinfo), 0); /* os version */ if (type2->flags & NTLM_NEG_VERSION) { - CHECK(krb5_store_uint32(out, type2->os[0]), 0); - CHECK(krb5_store_uint32(out, type2->os[1]), 0); + CHECK(encode_os_version(out), 0); } CHECK(put_string(out, ucs2, type2->targetname), 0); - CHECK(krb5_storage_write(out, type2->targetinfo.data, + CHECK_SIZE(krb5_storage_write(out, type2->targetinfo.data, type2->targetinfo.length), type2->targetinfo.length); @@ -841,7 +988,7 @@ uint32_t type; krb5_storage *in; struct sec_buffer lm, ntlm, target, username, sessionkey, ws; - uint32_t min_offset = 72; + uint32_t min_offset = 0xffffffff; memset(type3, 0, sizeof(*type3)); memset(&sessionkey, 0, sizeof(sessionkey)); @@ -853,7 +1000,7 @@ } krb5_storage_set_byteorder(in, KRB5_STORAGE_BYTEORDER_LE); - CHECK(krb5_storage_read(in, sig, sizeof(sig)), sizeof(sig)); + CHECK_SIZE(krb5_storage_read(in, sig, sizeof(sig)), sizeof(sig)); CHECK(memcmp(ntlmsigature, sig, sizeof(ntlmsigature)), 0); CHECK(krb5_ret_uint32(in, &type), 0); CHECK(type, 3); @@ -864,24 +1011,27 @@ if (ntlm.allocated) min_offset = min(min_offset, ntlm.offset); CHECK(ret_sec_buffer(in, &target), 0); - if (target.allocated) - min_offset = min(min_offset, target.offset); + min_offset = min(min_offset, target.offset); CHECK(ret_sec_buffer(in, &username), 0); - if (username.allocated) - min_offset = min(min_offset, username.offset); + min_offset = min(min_offset, username.offset); CHECK(ret_sec_buffer(in, &ws), 0); if (ws.allocated) min_offset = min(min_offset, ws.offset); - if (min_offset > 52) { + if (min_offset >= 52) { CHECK(ret_sec_buffer(in, &sessionkey), 0); - min_offset = max(min_offset, sessionkey.offset); + min_offset = min(min_offset, sessionkey.offset); CHECK(krb5_ret_uint32(in, &type3->flags), 0); } - if (min_offset > 52 + 8 + 4 + 8) { + if (min_offset >= 52 + SIZE_SEC_BUFFER + 4 + SIZE_OS_VERSION) { CHECK(krb5_ret_uint32(in, &type3->os[0]), 0); CHECK(krb5_ret_uint32(in, &type3->os[1]), 0); } + if (min_offset >= 52 + SIZE_SEC_BUFFER + 4 + SIZE_OS_VERSION + 16) { + type3->mic_offset = 52 + SIZE_SEC_BUFFER + 4 + SIZE_OS_VERSION; + CHECK_SIZE(krb5_storage_read(in, type3->mic, sizeof(type3->mic)), sizeof(type3->mic)); + } else + type3->mic_offset = 0; CHECK(ret_buf(in, &lm, &type3->lm), 0); CHECK(ret_buf(in, &ntlm, &type3->ntlm), 0); CHECK(ret_sec_string(in, ucs2, &target, &type3->targetname), 0); @@ -904,6 +1054,7 @@ * * @param type3 the ntlm_type3 message to encode. * @param data is the return buffer with the encoded message, should be + * @param[out] mic_offset offset of message integrity code * freed with heim_ntlm_free_buf(). * * @return In case of success 0 is return, an errors, a errno in what @@ -913,7 +1064,7 @@ */ int -heim_ntlm_encode_type3(const struct ntlm_type3 *type3, struct ntlm_buf *data) +heim_ntlm_encode_type3(const struct ntlm_type3 *type3, struct ntlm_buf *data, size_t *mic_offset) { struct sec_buffer lm, ntlm, target, username, sessionkey, ws; krb5_error_code ret; @@ -932,9 +1083,12 @@ base += 8; /* sessionkey sec buf */ base += 4; /* flags */ + if (type3->flags & NTLM_NEG_VERSION) + base += SIZE_OS_VERSION; /* os flags */ - if (type3->os[0]) { - base += 8; + if (mic_offset) { + *mic_offset = base; + base += 16; } if (type3->flags & NTLM_NEG_UNICODE) @@ -969,7 +1123,7 @@ return ENOMEM; krb5_storage_set_byteorder(out, KRB5_STORAGE_BYTEORDER_LE); - CHECK(krb5_storage_write(out, ntlmsigature, sizeof(ntlmsigature)), + CHECK_SIZE(krb5_storage_write(out, ntlmsigature, sizeof(ntlmsigature)), sizeof(ntlmsigature)); CHECK(krb5_store_uint32(out, 3), 0); @@ -981,10 +1135,15 @@ CHECK(store_sec_buffer(out, &sessionkey), 0); CHECK(krb5_store_uint32(out, type3->flags), 0); -#if 0 - CHECK(krb5_store_uint32(out, 0), 0); /* os0 */ - CHECK(krb5_store_uint32(out, 0), 0); /* os1 */ -#endif + /* os version */ + if (type3->flags & NTLM_NEG_VERSION) { + CHECK(encode_os_version(out), 0); + } + + if (mic_offset) { + static const uint8_t buf[16] = { 0 }; + CHECK_SIZE(krb5_storage_write(out, buf, sizeof(buf)), sizeof(buf)); + } CHECK(put_string(out, ucs2, type3->targetname), 0); CHECK(put_string(out, ucs2, type3->username), 0); @@ -1011,12 +1170,12 @@ * */ -static int +static void splitandenc(unsigned char *hash, unsigned char *challenge, unsigned char *answer) { - EVP_CIPHER_CTX *ctx; + EVP_CIPHER_CTX ctx; unsigned char key[8]; key[0] = hash[0]; @@ -1028,15 +1187,12 @@ key[6] = (hash[5] << 2) | (hash[6] >> 6); key[7] = (hash[6] << 1); - ctx = EVP_CIPHER_CTX_new(); - if (ctx == NULL) - return ENOMEM; + EVP_CIPHER_CTX_init(&ctx); - EVP_CipherInit_ex(ctx, EVP_des_cbc(), NULL, key, NULL, 1); - EVP_Cipher(ctx, answer, challenge, 8); - EVP_CIPHER_CTX_free(ctx); - memset(key, 0, sizeof(key)); - return 0; + EVP_CipherInit_ex(&ctx, EVP_des_cbc(), NULL, key, NULL, 1); + EVP_Cipher(&ctx, answer, challenge, 8); + EVP_CIPHER_CTX_cleanup(&ctx); + memset_s(key, sizeof(key), 0, sizeof(key)); } /** @@ -1058,10 +1214,10 @@ EVP_MD_CTX *m; int ret; - key->data = malloc(MD5_DIGEST_LENGTH); + key->data = malloc(MD4_DIGEST_LENGTH); if (key->data == NULL) return ENOMEM; - key->length = MD5_DIGEST_LENGTH; + key->length = MD4_DIGEST_LENGTH; ret = ascii2ucs2le(password, 0, &buf); if (ret) { @@ -1105,7 +1261,6 @@ struct ntlm_buf *answer) { unsigned char res[21]; - int ret; if (len != MD4_DIGEST_LENGTH) return HNTLM_ERR_INVALID_LENGTH; @@ -1118,21 +1273,11 @@ return ENOMEM; answer->length = 24; - ret = splitandenc(&res[0], challenge, ((unsigned char *)answer->data) + 0); - if (ret) - goto out; - ret = splitandenc(&res[7], challenge, ((unsigned char *)answer->data) + 8); - if (ret) - goto out; - ret = splitandenc(&res[14], challenge, ((unsigned char *)answer->data) + 16); - if (ret) - goto out; + splitandenc(&res[0], challenge, ((unsigned char *)answer->data) + 0); + splitandenc(&res[7], challenge, ((unsigned char *)answer->data) + 8); + splitandenc(&res[14], challenge, ((unsigned char *)answer->data) + 16); return 0; - -out: - heim_ntlm_free_buf(answer); - return ret; } int @@ -1147,7 +1292,7 @@ session->length = 0; return ENOMEM; } - + m = EVP_MD_CTX_create(); if (m == NULL) { heim_ntlm_free_buf(session); @@ -1167,7 +1312,7 @@ struct ntlm_buf *session) { unsigned int hmaclen; - HMAC_CTX *c; + HMAC_CTX c; if (ntlmResponse->length <= 16) return HNTLM_ERR_INVALID_LENGTH; @@ -1178,15 +1323,11 @@ session->length = 16; /* Note: key is the NTLMv2 key */ - c = HMAC_CTX_new(); - if (c == NULL) { - heim_ntlm_free_buf(session); - return ENOMEM; - } - HMAC_Init_ex(c, key, len, EVP_md5(), NULL); - HMAC_Update(c, ntlmResponse->data, 16); - HMAC_Final(c, session->data, &hmaclen); - HMAC_CTX_free(c); + HMAC_CTX_init(&c); + HMAC_Init_ex(&c, key, len, EVP_md5(), NULL); + HMAC_Update(&c, ntlmResponse->data, 16); + HMAC_Final(&c, session->data, &hmaclen); + HMAC_CTX_cleanup(&c); return 0; } @@ -1197,9 +1338,12 @@ struct ntlm_buf *session, struct ntlm_buf *encryptedSession) { - EVP_CIPHER_CTX *c; + EVP_CIPHER_CTX c; int ret; + if (base_session->length != MD4_DIGEST_LENGTH) + return HNTLM_ERR_INVALID_LENGTH; + session->length = MD4_DIGEST_LENGTH; session->data = malloc(session->length); if (session->data == NULL) { @@ -1214,30 +1358,25 @@ return ENOMEM; } - c = EVP_CIPHER_CTX_new(); - if (c == NULL) { - heim_ntlm_free_buf(encryptedSession); - heim_ntlm_free_buf(session); - return ENOMEM; - } + EVP_CIPHER_CTX_init(&c); - ret = EVP_CipherInit_ex(c, EVP_rc4(), NULL, base_session->data, NULL, 1); + ret = EVP_CipherInit_ex(&c, EVP_rc4(), NULL, base_session->data, NULL, 1); if (ret != 1) { - EVP_CIPHER_CTX_free(c); + EVP_CIPHER_CTX_cleanup(&c); heim_ntlm_free_buf(encryptedSession); heim_ntlm_free_buf(session); return HNTLM_ERR_CRYPTO; } if (RAND_bytes(session->data, session->length) != 1) { - EVP_CIPHER_CTX_free(c); + EVP_CIPHER_CTX_cleanup(&c); heim_ntlm_free_buf(encryptedSession); heim_ntlm_free_buf(session); return HNTLM_ERR_RAND; } - EVP_Cipher(c, encryptedSession->data, session->data, encryptedSession->length); - EVP_CIPHER_CTX_free(c); + EVP_Cipher(&c, encryptedSession->data, session->data, encryptedSession->length); + EVP_CIPHER_CTX_cleanup(&c); return 0; @@ -1245,8 +1384,6 @@ } - - /** * Generates an NTLMv1 session random with assosited session master key. * @@ -1332,10 +1469,12 @@ struct ntlm_buf *encryptedSession, struct ntlm_buf *session) { - EVP_CIPHER_CTX *c; + EVP_CIPHER_CTX c; memset(session, 0, sizeof(*session)); + if (encryptedSession->length != MD4_DIGEST_LENGTH) + return HNTLM_ERR_INVALID_LENGTH; if (baseKey->length != MD4_DIGEST_LENGTH) return HNTLM_ERR_INVALID_LENGTH; @@ -1345,20 +1484,16 @@ session->length = 0; return ENOMEM; } - c = EVP_CIPHER_CTX_new(); - if (c == NULL) { - heim_ntlm_free_buf(session); - return ENOMEM; - } + EVP_CIPHER_CTX_init(&c); - if (EVP_CipherInit_ex(c, EVP_rc4(), NULL, baseKey->data, NULL, 0) != 1) { - EVP_CIPHER_CTX_free(c); + if (EVP_CipherInit_ex(&c, EVP_rc4(), NULL, baseKey->data, NULL, 0) != 1) { + EVP_CIPHER_CTX_cleanup(&c); heim_ntlm_free_buf(session); return HNTLM_ERR_CRYPTO; } - EVP_Cipher(c, session->data, encryptedSession->data, session->length); - EVP_CIPHER_CTX_free(c); + EVP_Cipher(&c, session->data, encryptedSession->data, session->length); + EVP_CIPHER_CTX_cleanup(&c); return 0; } @@ -1371,6 +1506,7 @@ * @param len length of key * @param username name of the user, as sent in the message, assumed to be in UTF8. * @param target the name of the target, assumed to be in UTF8. + * @param upper_case_target upper case the target, should not be used only for legacy systems * @param ntlmv2 the ntlmv2 session key * * @return 0 on success, or an error code on failure. @@ -1382,34 +1518,34 @@ heim_ntlm_ntlmv2_key(const void *key, size_t len, const char *username, const char *target, + int upper_case_target, unsigned char ntlmv2[16]) { int ret; unsigned int hmaclen; - HMAC_CTX *c; + HMAC_CTX c; - c = HMAC_CTX_new(); - if (c == NULL) - return ENOMEM; - HMAC_Init_ex(c, key, len, EVP_md5(), NULL); + HMAC_CTX_init(&c); + HMAC_Init_ex(&c, key, len, EVP_md5(), NULL); { struct ntlm_buf buf; /* uppercase username and turn it into ucs2-le */ ret = ascii2ucs2le(username, 1, &buf); if (ret) goto out; - HMAC_Update(c, buf.data, buf.length); + HMAC_Update(&c, buf.data, buf.length); free(buf.data); - /* uppercase target and turn into ucs2-le */ - ret = ascii2ucs2le(target, 1, &buf); + /* turn target into ucs2-le */ + ret = ascii2ucs2le(target, upper_case_target, &buf); if (ret) goto out; - HMAC_Update(c, buf.data, buf.length); + HMAC_Update(&c, buf.data, buf.length); free(buf.data); } - HMAC_Final(c, ntlmv2, &hmaclen); + HMAC_Final(&c, ntlmv2, &hmaclen); out: - HMAC_CTX_free(c); + HMAC_CTX_cleanup(&c); + memset(&c, 0, sizeof(c)); return ret; } @@ -1420,16 +1556,16 @@ #define NTTIME_EPOCH 0x019DB1DED53E8000LL -static uint64_t -unix2nttime(time_t unix_time) +uint64_t +heim_ntlm_unix2ts_time(time_t unix_time) { long long wt; wt = unix_time * (uint64_t)10000000 + (uint64_t)NTTIME_EPOCH; return wt; } -static time_t -nt2unixtime(uint64_t t) +time_t +heim_ntlm_ts2unixtime(uint64_t t) { t = ((t - (uint64_t)NTTIME_EPOCH) / (uint64_t)10000000); if (t > (((uint64_t)(time_t)(~(uint64_t)0)) >> 1)) @@ -1463,26 +1599,23 @@ struct ntlm_buf *answer) { unsigned char clientchallenge[8]; - int ret; if (RAND_bytes(clientchallenge, sizeof(clientchallenge)) != 1) return HNTLM_ERR_RAND; /* calculate ntlmv2 key */ - heim_ntlm_ntlmv2_key(key, len, username, target, ntlmv2); + heim_ntlm_ntlmv2_key(key, len, username, target, 0, ntlmv2); answer->data = malloc(24); if (answer->data == NULL) return ENOMEM; answer->length = 24; - ret = heim_ntlm_derive_ntlm2_sess(ntlmv2, clientchallenge, 8, + heim_ntlm_derive_ntlm2_sess(ntlmv2, clientchallenge, 8, serverchallenge, answer->data); - if (ret) - return ret; - memcpy(((uint8_t *)answer->data) + 16, clientchallenge, 8); + memcpy(((unsigned char *)answer->data) + 16, clientchallenge, 8); return 0; } @@ -1521,16 +1654,15 @@ krb5_storage *sp; unsigned char clientchallenge[8]; uint64_t t; - int code; - t = unix2nttime(time(NULL)); + t = heim_ntlm_unix2ts_time(time(NULL)); if (RAND_bytes(clientchallenge, sizeof(clientchallenge)) != 1) return HNTLM_ERR_RAND; /* calculate ntlmv2 key */ - heim_ntlm_ntlmv2_key(key, len, username, target, ntlmv2); + heim_ntlm_ntlmv2_key(key, len, username, target, 0, ntlmv2); /* calculate and build ntlmv2 answer */ @@ -1545,22 +1677,25 @@ CHECK(krb5_store_uint32(sp, t & 0xffffffff), 0); CHECK(krb5_store_uint32(sp, t >> 32), 0); - CHECK(krb5_storage_write(sp, clientchallenge, 8), 8); + CHECK_SIZE(krb5_storage_write(sp, clientchallenge, 8), 8); - CHECK(krb5_store_uint32(sp, 0), 0); /* unknown but zero will work */ - CHECK(krb5_storage_write(sp, infotarget->data, infotarget->length), + CHECK(krb5_store_uint32(sp, 0), 0); /* Z(4) */ + CHECK_SIZE(krb5_storage_write(sp, infotarget->data, infotarget->length), infotarget->length); - CHECK(krb5_store_uint32(sp, 0), 0); /* unknown but zero will work */ + + /* + * These last 4 bytes(Z(4)) are not documented by MicroSoft and + * SnowLeopard doesn't send them, Lion expected them to be there, + * so we have to continue to send them. That is ok, since everyone + * else (except Snow) seems to do that too. + */ + CHECK(krb5_store_uint32(sp, 0), 0); /* Z(4) */ CHECK(krb5_storage_to_data(sp, &data), 0); krb5_storage_free(sp); sp = NULL; - code = heim_ntlm_derive_ntlm2_sess(ntlmv2, data.data, data.length, serverchallenge, ntlmv2answer); - if (code) { - krb5_data_free(&data); - return code; - } + heim_ntlm_derive_ntlm2_sess(ntlmv2, data.data, data.length, serverchallenge, ntlmv2answer); sp = krb5_storage_emem(); if (sp == NULL) { @@ -1568,8 +1703,8 @@ return ENOMEM; } - CHECK(krb5_storage_write(sp, ntlmv2answer, 16), 16); - CHECK(krb5_storage_write(sp, data.data, data.length), data.length); + CHECK_SIZE(krb5_storage_write(sp, ntlmv2answer, 16), 16); + CHECK_SIZE(krb5_storage_write(sp, data.data, data.length), data.length); krb5_data_free(&data); CHECK(krb5_storage_to_data(sp, &data), 0); @@ -1588,44 +1723,25 @@ static const int authtimediff = 3600 * 2; /* 2 hours */ -/** - * Verify NTLMv2 response. - * - * @param key the ntlm key - * @param len length of key - * @param username name of the user, as sent in the message, assumed to be in UTF8. - * @param target the name of the target, assumed to be in UTF8. - * @param now the time now (0 if the library should pick it up itself) - * @param serverchallenge challenge as sent by the server in the type2 message. - * @param answer ntlm response answer, should be freed with heim_ntlm_free_buf(). - * @param infotarget infotarget as sent by the server in the type2 message. - * @param ntlmv2 calculated session key - * - * @return In case of success 0 is return, an errors, a errno in what - * went wrong. - * - * @ingroup ntlm_core - */ - -int -heim_ntlm_verify_ntlm2(const void *key, size_t len, - const char *username, - const char *target, - time_t now, - const unsigned char serverchallenge[8], - const struct ntlm_buf *answer, - struct ntlm_buf *infotarget, - unsigned char ntlmv2[16]) +static int +verify_ntlm2(const void *key, size_t len, + const char *username, + const char *target, + int upper_case_target, + time_t now, + const unsigned char serverchallenge[8], + const struct ntlm_buf *answer, + struct ntlm_buf *infotarget, + unsigned char ntlmv2[16]) { krb5_error_code ret; unsigned char clientanswer[16]; unsigned char clientnonce[8]; unsigned char serveranswer[16]; krb5_storage *sp; + uint64_t t; time_t authtime; uint32_t temp; - uint64_t t; - int code; infotarget->length = 0; infotarget->data = NULL; @@ -1638,7 +1754,7 @@ /* calculate ntlmv2 key */ - heim_ntlm_ntlmv2_key(key, len, username, target, ntlmv2); + heim_ntlm_ntlmv2_key(key, len, username, target, upper_case_target, ntlmv2); /* calculate and build ntlmv2 answer */ @@ -1647,7 +1763,7 @@ return ENOMEM; krb5_storage_set_flags(sp, KRB5_STORAGE_BYTEORDER_LE); - CHECK(krb5_storage_read(sp, clientanswer, 16), 16); + CHECK_SIZE(krb5_storage_read(sp, clientanswer, 16), 16); CHECK(krb5_ret_uint32(sp, &temp), 0); CHECK(temp, 0x00000101); @@ -1659,28 +1775,32 @@ CHECK(krb5_ret_uint32(sp, &temp), 0); t |= ((uint64_t)temp)<< 32; - authtime = nt2unixtime(t); + authtime = heim_ntlm_ts2unixtime(t); - if (abs((int)(authtime - now)) > authtimediff) { + if (labs((int)(authtime - now)) > authtimediff) { ret = HNTLM_ERR_TIME_SKEW; goto out; } /* client challenge */ - CHECK(krb5_storage_read(sp, clientnonce, 8), 8); + CHECK_SIZE(krb5_storage_read(sp, clientnonce, 8), 8); - CHECK(krb5_ret_uint32(sp, &temp), 0); /* unknown */ + CHECK(krb5_ret_uint32(sp, &temp), 0); /* Z(4) */ - /* should really unparse the infotarget, but lets pick up everything */ - infotarget->length = answer->length - krb5_storage_seek(sp, 0, SEEK_CUR); + /* let pick up targetinfo */ + infotarget->length = answer->length - (size_t)krb5_storage_seek(sp, 0, SEEK_CUR); + if (infotarget->length < 4) { + ret = HNTLM_ERR_INVALID_LENGTH; + goto out; + } infotarget->data = malloc(infotarget->length); if (infotarget->data == NULL) { ret = ENOMEM; goto out; } - CHECK(krb5_storage_read(sp, infotarget->data, infotarget->length), + CHECK_SIZE(krb5_storage_read(sp, infotarget->data, infotarget->length), infotarget->length); - /* XXX remove the unknown ?? */ + krb5_storage_free(sp); sp = NULL; @@ -1689,12 +1809,10 @@ goto out; } - ret = heim_ntlm_derive_ntlm2_sess(ntlmv2, + heim_ntlm_derive_ntlm2_sess(ntlmv2, ((unsigned char *)answer->data) + 16, answer->length - 16, serverchallenge, serveranswer); - if (ret) - goto out; if (memcmp(serveranswer, clientanswer, 16) != 0) { heim_ntlm_free_buf(infotarget); @@ -1709,6 +1827,60 @@ return ret; } +/** + * Verify NTLMv2 response. + * + * @param key the ntlm key + * @param len length of key + * @param username name of the user, as sent in the message, assumed to be in UTF8. + * @param target the name of the target, assumed to be in UTF8. + * @param now the time now (0 if the library should pick it up itself) + * @param serverchallenge challenge as sent by the server in the type2 message. + * @param answer ntlm response answer, should be freed with heim_ntlm_free_buf(). + * @param infotarget infotarget as sent by the server in the type2 message. + * @param ntlmv2 calculated session key + * + * @return In case of success 0 is return, an errors, a errno in what + * went wrong. + * + * @ingroup ntlm_core + */ + +int +heim_ntlm_verify_ntlm2(const void *key, size_t len, + const char *username, + const char *target, + time_t now, + const unsigned char serverchallenge[8], + const struct ntlm_buf *answer, + struct ntlm_buf *infotarget, + unsigned char ntlmv2[16]) +{ + int ret; + + /** + * First check with the domain as the client passed it to the function. + */ + + ret = verify_ntlm2(key, len, username, target, 0, now, + serverchallenge, answer, infotarget, ntlmv2); + + /** + * Second check with domain uppercased. + */ + + if (ret) + ret = verify_ntlm2(key, len, username, target, 1, now, + serverchallenge, answer, infotarget, ntlmv2); + + /** + * Third check with empty domain. + */ + if (ret) + ret = verify_ntlm2(key, len, username, "", 0, now, + serverchallenge, answer, infotarget, ntlmv2); + return ret; +} /* * Calculate the NTLM2 Session Response @@ -1764,22 +1936,11 @@ memcpy(res, ntlm_hash, 16); resp = ntlm->data; - code = splitandenc(&res[0], ntlm2_sess_hash, resp + 0); - if (code) - goto out; - code = splitandenc(&res[7], ntlm2_sess_hash, resp + 8); - if (code) - goto out; - code = splitandenc(&res[14], ntlm2_sess_hash, resp + 16); - if (code) - goto out; + splitandenc(&res[0], ntlm2_sess_hash, resp + 0); + splitandenc(&res[7], ntlm2_sess_hash, resp + 8); + splitandenc(&res[14], ntlm2_sess_hash, resp + 16); return 0; - -out: - heim_ntlm_free_buf(ntlm); - heim_ntlm_free_buf(lm); - return code; } @@ -1834,24 +1995,21 @@ * @ingroup ntlm_core */ -int +void heim_ntlm_derive_ntlm2_sess(const unsigned char sessionkey[16], const unsigned char *clnt_nonce, size_t clnt_nonce_length, const unsigned char svr_chal[8], unsigned char derivedkey[16]) { unsigned int hmaclen; - HMAC_CTX *c; + HMAC_CTX c; /* HMAC(Ksession, serverchallenge || clientchallenge) */ - c = HMAC_CTX_new(); - if (c == NULL) - return ENOMEM; - HMAC_Init_ex(c, sessionkey, 16, EVP_md5(), NULL); - HMAC_Update(c, svr_chal, 8); - HMAC_Update(c, clnt_nonce, clnt_nonce_length); - HMAC_Final(c, derivedkey, &hmaclen); - HMAC_CTX_free(c); - return 0; + HMAC_CTX_init(&c); + HMAC_Init_ex(&c, sessionkey, 16, EVP_md5(), NULL); + HMAC_Update(&c, svr_chal, 8); + HMAC_Update(&c, clnt_nonce, clnt_nonce_length); + HMAC_Final(&c, derivedkey, &hmaclen); + HMAC_CTX_cleanup(&c); + memset(&c, 0, sizeof(c)); } - diff --git a/crypto/heimdal/lib/ntlm/ntlm_err.et b/crypto/heimdal/lib/ntlm/ntlm_err.et --- a/crypto/heimdal/lib/ntlm/ntlm_err.et +++ b/crypto/heimdal/lib/ntlm/ntlm_err.et @@ -14,11 +14,47 @@ error_code AUTH, "NTLM authentication failed" error_code TIME_SKEW, "Client time skewed to server" error_code OEM, "Client set OEM string" -error_code MISSING_NAME_SEPARATOR, "missing @ or \ in name" +error_code MISSING_NAME_SEPARATOR, "missing @ or \\\\ in name" error_code MISSING_BUFFER, "missing expected buffer" error_code INVALID_APOP, "Invalid APOP response" error_code INVALID_CRAM_MD5, "Invalid CRAM-MD5 response" error_code INVALID_DIGEST_MD5, "Invalid DIGEST-MD5 response" error_code INVALID_DIGEST_MD5_RSPAUTH, "Invalid DIGEST-MD5 rspauth" +error_code INVALID_CHANNEL_BINDINGS, "Invalid channel bindings" +error_code INVALID_MIC, "Invalid MIC" +error_code INVALID_SESSIONKEY, "Invalid session key" + + +# +# NTLM/GSS error codes +# +index 64 +error_code NOT_CONFIGURED, "NTLM not configured" + +error_code INVALID_CHALLANGE, "Invalid client challenge" +error_code INVALID_LMv1_RESPONSE, "Invalid client LMv1 response" +error_code INVALID_NT_RESPONSE, "Invalid client NT response" +error_code INVALID_LMv2_RESPONSE, "Invalid client LMv2 response" +error_code INVALID_NTv1_RESPONSE, "Invalid client NTv1 response" +error_code INVALID_NTv2_RESPONSE, "Invalid client NTv2 response" +error_code INVALID_NTv1_ANSWER, "Invalid client NTv1 answer" +error_code INVALID_NTv2_ANSWER, "Invalid client NTv2 answer" +error_code INVALID_SESSION_KEY, "Invalid session key" + +error_code INVALID_NO_GUEST, "Invalid guest login request" + +error_code NO_NETR_CONFIGURED, "No NETR configured" + + +# +# Scram errors +# +prefix HSCRAM_ERR +index 128 + +error_code INVALID_MESSAGE, "Invalid SCRAM message" +error_code INVALID_PROOF, "Invalid SCRAM proof" +error_code INVALID_ROLE, "Invalid SCRAM role" + end diff --git a/crypto/heimdal/lib/ntlm/test_ntlm.c b/crypto/heimdal/lib/ntlm/test_ntlm.c --- a/crypto/heimdal/lib/ntlm/test_ntlm.c +++ b/crypto/heimdal/lib/ntlm/test_ntlm.c @@ -41,11 +41,14 @@ #include /* or */ #include +static int dumpdata_flag; + static int test_parse(void) { const char *user = "foo", *domain = "mydomain", + *hostname = "myhostname", *password = "digestpassword", *target = "DOMAIN"; struct ntlm_type1 type1; @@ -56,9 +59,9 @@ memset(&type1, 0, sizeof(type1)); - type1.flags = NTLM_NEG_UNICODE|NTLM_NEG_TARGET|NTLM_NEG_NTLM; + type1.flags = NTLM_NEG_UNICODE|NTLM_NEG_TARGET|NTLM_NEG_NTLM|NTLM_NEG_VERSION; type1.domain = rk_UNCONST(domain); - type1.hostname = NULL; + type1.hostname = rk_UNCONST(hostname); type1.os[0] = 0; type1.os[1] = 0; @@ -68,11 +71,20 @@ memset(&type1, 0, sizeof(type1)); + if (dumpdata_flag) + rk_dumpdata("ntlm-type1", data.data, data.length); + ret = heim_ntlm_decode_type1(&data, &type1); free(data.data); if (ret) errx(1, "heim_ntlm_encode_type1"); + if (strcmp(type1.domain, domain) != 0) + errx(1, "parser got domain wrong: %s", type1.domain); + + if (strcmp(type1.hostname, hostname) != 0) + errx(1, "parser got hostname wrong: %s", type1.hostname); + heim_ntlm_free_type1(&type1); /* @@ -95,6 +107,9 @@ memset(&type2, 0, sizeof(type2)); + if (dumpdata_flag) + rk_dumpdata("ntlm-type2", data.data, data.length); + ret = heim_ntlm_decode_type2(&data, &type2); free(data.data); if (ret) @@ -123,7 +138,7 @@ free(key.data); } - ret = heim_ntlm_encode_type3(&type3, &data); + ret = heim_ntlm_encode_type3(&type3, &data, NULL); if (ret) errx(1, "heim_ntlm_encode_type3"); @@ -131,6 +146,9 @@ memset(&type3, 0, sizeof(type3)); + if (dumpdata_flag) + rk_dumpdata("ntlm-type3", data.data, data.length); + ret = heim_ntlm_decode_type3(&data, 1, &type3); free(data.data); if (ret) @@ -288,18 +306,107 @@ return 0; } +static int +test_ntlmv2(void) +{ + unsigned char type3[413] = + "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00\x00\x18\x00\x18\x00" + "\x80\x00\x00\x00\x9e\x00\x9e\x00\x98\x00\x00\x00\x14\x00\x14\x00" + "\x48\x00\x00\x00\x10\x00\x10\x00\x5c\x00\x00\x00\x14\x00\x14\x00" + "\x6c\x00\x00\x00\x00\x00\x00\x00\x36\x01\x00\x00\x05\x82\x88\xa2" + "\x05\x01\x28\x0a\x00\x00\x00\x0f\x43\x00\x4f\x00\x4c\x00\x4c\x00" + "\x45\x00\x59\x00\x2d\x00\x58\x00\x50\x00\x34\x00\x54\x00\x45\x00" + "\x53\x00\x54\x00\x55\x00\x53\x00\x45\x00\x52\x00\x43\x00\x4f\x00" + "\x4c\x00\x4c\x00\x45\x00\x59\x00\x2d\x00\x58\x00\x50\x00\x34\x00" + "\x2f\x96\xec\x0a\xf7\x9f\x2e\x24\xba\x09\x48\x10\xa5\x22\xd4\xe1" + "\x16\x6a\xca\x58\x74\x9a\xc1\x4f\x54\x6f\xee\x40\x96\xce\x43\x6e" + "\xdf\x99\x20\x71\x6c\x9a\xda\x2a\x01\x01\x00\x00\x00\x00\x00\x00" + "\x8d\xc0\x57\xc9\x79\x5e\xcb\x01\x16\x6a\xca\x58\x74\x9a\xc1\x4f" + "\x00\x00\x00\x00\x02\x00\x14\x00\x4e\x00\x55\x00\x54\x00\x43\x00" + "\x52\x00\x41\x00\x43\x00\x4b\x00\x45\x00\x52\x00\x01\x00\x14\x00" + "\x4e\x00\x55\x00\x54\x00\x43\x00\x52\x00\x41\x00\x43\x00\x4b\x00" + "\x45\x00\x52\x00\x04\x00\x12\x00\x61\x00\x70\x00\x70\x00\x6c\x00" + "\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x03\x00\x20\x00\x68\x00" + "\x75\x00\x6d\x00\x6d\x00\x65\x00\x6c\x00\x2e\x00\x61\x00\x70\x00" + "\x70\x00\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64\x00\x6f" + "\x00\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32\x00\x20" + "\x00\x53\x00\x65\x00\x72\x00\x76\x00\x69\x00\x63\x00\x65\x00\x20" + "\x00\x50\x00\x61\x00\x63\x00\x6b\x00\x20\x00\x33\x00\x20\x00\x32" + "\x00\x36\x00\x30\x00\x30\x00\x00\x00\x57\x00\x69\x00\x6e\x00\x64" + "\x00\x6f\x00\x77\x00\x73\x00\x20\x00\x32\x00\x30\x00\x30\x00\x32" + "\x00\x20\x00\x35\x00\x2e\x00\x31\x00\x00\x00\x00\x00"; + const unsigned char challenge[8] = + "\xe4\x9c\x6a\x12\xe1\xbd\xde\x6a"; + unsigned char sessionkey[16]; + + const char key[16] = "\xD1\x83\x98\x3E\xAE\xA7\xBE\x99\x59\xC8\xF4\xC1\x98\xED\x0E\x68"; + + struct ntlm_buf data; + struct ntlm_type3 t3; + int ret; + + struct ntlm_targetinfo ti; + + unsigned char timsg[114] = + "\002\000\024\000N\000U\000T\000C\000R\000A\000C\000K\000E\000R\000\001\000\024\000N\000U\000T\000C\000R\000A\000C\000K\000E\000R\000\004\000\022\000a\000p\000p\000l\000e\000.\000c\000o\000m\000\003\000 \000h\000u\000m\000m\000e\000l\000.\000a\000p\000p\000l\000e\000.\000c\000o\000m\000\000\000\000\000\000\000\000"; + + + data.data = type3; + data.length = sizeof(type3); + + ret = heim_ntlm_decode_type3(&data, 1, &t3); + if (ret) + errx(1, "heim_ntlm_decode_type3"); + + memset(&ti, 0, sizeof(ti)); + + data.data = timsg; + data.length = sizeof(timsg); + + ret = heim_ntlm_decode_targetinfo(&data, 1, &ti); + if (ret) + return ret; + + ret = heim_ntlm_verify_ntlm2(key, sizeof(key), + t3.username, + t3.targetname, + 1285615547, + challenge, + &t3.ntlm, + &data, + sessionkey); + if (ret) + errx(1, "verify_ntlmv2"); + + if (sizeof(timsg) != data.length || memcmp(timsg, data.data, sizeof(timsg)) != 0) + errx(1, "target info wrong: %d != %d", + (int)sizeof(timsg), (int)data.length); + + heim_ntlm_free_type3(&t3); + heim_ntlm_free_targetinfo(&ti); + + return 0; +} + static int test_targetinfo(void) { struct ntlm_targetinfo ti; struct ntlm_buf buf; const char *dnsservername = "dnsservername"; + const char *targetname = "targetname"; + const char z16[16] = { 0 }; int ret; memset(&ti, 0, sizeof(ti)); ti.dnsservername = rk_UNCONST(dnsservername); ti.avflags = 1; + ti.targetname = rk_UNCONST(targetname); + ti.channel_bindings.data = rk_UNCONST(z16); + ti.channel_bindings.length = sizeof(z16); + ret = heim_ntlm_encode_targetinfo(&ti, 1, &buf); if (ret) return ret; @@ -315,12 +422,133 @@ errx(1, "ti.dnshostname != %s", dnsservername); if (ti.avflags != 1) errx(1, "ti.avflags != 1"); + if (ti.targetname == NULL || + strcmp(ti.targetname, targetname) != 0) + errx(1, "ti.targetname != %s", targetname); + + if (ti.channel_bindings.length != sizeof(z16) || + memcmp(ti.channel_bindings.data, z16, sizeof(z16)) != 0) + errx(1, "ti.channel_bindings != Z(16)"); heim_ntlm_free_targetinfo(&ti); return 0; } +static int +test_string2key(void) +{ + const char *pw = "山田"; + struct ntlm_buf buf; + + unsigned char key[16] = { + 0xc6, 0x5d, 0xc7, 0x61, 0xa1, 0x34, 0x17, 0xa1, + 0x17, 0x08, 0x9c, 0x1b, 0xb0, 0x0d, 0x0f, 0x19 + }; + + if (heim_ntlm_nt_key(pw, &buf) != 0) + errx(1, "heim_ntlmv_nt_key(jp)"); + + if (buf.length != 16 || memcmp(buf.data, key, 16) != 0) + errx(1, "compare failed"); + + heim_ntlm_free_buf(&buf); + + return 0; +} + +static int +test_jp(void) +{ + char buf2[220] = + "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x06\x00\x06\x00" + "\x38\x00\x00\x00\x05\x02\x89\x62\x62\x94\xb1\xf3\x56\x80\xb0\xf9" + "\x00\x00\x00\x00\x00\x00\x00\x00\x9e\x00\x9e\x00\x3e\x00\x00\x00" + "\x06\x01\xb0\x1d\x00\x00\x00\x0f\x43\x00\x4f\x00\x53\x00\x02\x00" + "\x06\x00\x43\x00\x4f\x00\x53\x00\x01\x00\x12\x00\x43\x00\x4f\x00" + "\x53\x00\x57\x00\x49\x00\x4e\x00\x37\x00\x4a\x00\x50\x00\x04\x00" + "\x1a\x00\x63\x00\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00" + "\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x03\x00\x2e\x00" + "\x63\x00\x6f\x00\x73\x00\x77\x00\x69\x00\x6e\x00\x37\x00\x6a\x00" + "\x70\x00\x2e\x00\x63\x00\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00" + "\x70\x00\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x05\x00" + "\x1a\x00\x63\x00\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00" + "\x6c\x00\x65\x00\x2e\x00\x63\x00\x6f\x00\x6d\x00\x07\x00\x08\x00" + "\x94\x51\xf0\xbd\xdc\x61\xcb\x01\x00\x00\x00\x00"; + + char buf3[362] = + "\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00\x00\x18\x00\x18\x00" + "\x74\x00\x00\x00\xce\x00\xce\x00\x8c\x00\x00\x00\x1a\x00\x1a\x00" + "\x40\x00\x00\x00\x04\x00\x04\x00\x5a\x00\x00\x00\x16\x00\x16\x00" + "\x5e\x00\x00\x00\x10\x00\x10\x00\x5a\x01\x00\x00\x05\x02\x89\x62" + "\x31\x00\x37\x00\x2e\x00\x32\x00\x30\x00\x31\x00\x2e\x00\x35\x00" + "\x37\x00\x2e\x00\x31\x00\x32\x00\x31\x00\x71\x5c\x30\x75\x77\x00" + "\x6f\x00\x72\x00\x6b\x00\x73\x00\x74\x00\x61\x00\x74\x00\x69\x00" + "\x6f\x00\x6e\x00\xab\xad\xeb\x72\x01\xd4\x5f\xdf\x59\x07\x5f\xa9" + "\xfd\x54\x98\x2d\xfa\x17\xbb\xf1\x3c\x8f\xf5\x20\xe6\x8f\xd7\x0a" + "\xc9\x19\x3e\x94\x61\x31\xdb\x0f\x55\xe8\xe2\x53\x01\x01\x00\x00" + "\x00\x00\x00\x00\x00\x06\x3e\x30\xe4\x61\xcb\x01\x71\x98\x10\x6b" + "\x4c\x82\xec\xb3\x00\x00\x00\x00\x02\x00\x06\x00\x43\x00\x4f\x00" + "\x53\x00\x01\x00\x12\x00\x43\x00\x4f\x00\x53\x00\x57\x00\x49\x00" + "\x4e\x00\x37\x00\x4a\x00\x50\x00\x04\x00\x1a\x00\x63\x00\x6f\x00" + "\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00\x6c\x00\x65\x00\x2e\x00" + "\x63\x00\x6f\x00\x6d\x00\x03\x00\x2e\x00\x63\x00\x6f\x00\x73\x00" + "\x77\x00\x69\x00\x6e\x00\x37\x00\x6a\x00\x70\x00\x2e\x00\x63\x00" + "\x6f\x00\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00\x6c\x00\x65\x00" + "\x2e\x00\x63\x00\x6f\x00\x6d\x00\x05\x00\x1a\x00\x63\x00\x6f\x00" + "\x73\x00\x2e\x00\x61\x00\x70\x00\x70\x00\x6c\x00\x65\x00\x2e\x00" + "\x63\x00\x6f\x00\x6d\x00\x07\x00\x08\x00\xab\xec\xcc\x30\xe4\x61" + "\xcb\x01\x00\x00\x00\x00\x00\x00\x00\x00\xbc\x2e\xba\x3f\xd1\xb1" + "\xa7\x70\x00\x9d\x55\xa0\x59\x74\x2b\x78"; + + + struct ntlm_type2 type2; + struct ntlm_type3 type3; + struct ntlm_buf data; + int ret; + + data.length = sizeof(buf2); + data.data = buf2; + + memset(&type2, 0, sizeof(type2)); + + ret = heim_ntlm_decode_type2(&data, &type2); + if (ret) + errx(1, "heim_ntlm_decode_type2(jp): %d", ret); + + data.data = NULL; + data.length = 0; + + ret = heim_ntlm_encode_type2(&type2, &data); + if (ret) + errx(1, "heim_ntlm_encode_type2(jp): %d", ret); + + heim_ntlm_free_type2(&type2); + heim_ntlm_free_buf(&data); + + data.length = sizeof(buf3); + data.data = buf3; + + memset(&type3, 0, sizeof(type3)); + + ret = heim_ntlm_decode_type3(&data, 1, &type3); + if (ret) + errx(1, "heim_ntlm_decode_type2(jp): %d", ret); + + data.data = NULL; + data.length = 0; + + ret = heim_ntlm_encode_type3(&type3, &data, NULL); + if (ret) + errx(1, "heim_ntlm_decode_type2(jp): %d", ret); + + heim_ntlm_free_type3(&type3); + heim_ntlm_free_buf(&data); + + return 0; +} + + static int verbose_flag = 0; static int version_flag = 0; static int help_flag = 0; @@ -342,11 +570,11 @@ int main(int argc, char **argv) { - int ret = 0, optind = 0; + int ret = 0, optidx = 0; setprogname(argv[0]); - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) + if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) @@ -357,24 +585,33 @@ exit(0); } - argc -= optind; - argv += optind; - if (verbose_flag) printf("test_parse\n"); + ret |= test_parse(); - ret += test_parse(); if (verbose_flag) printf("test_keys\n"); + ret |= test_keys(); - ret += test_keys(); if (verbose_flag) printf("test_ntlm2_session_resp\n"); - ret += test_ntlm2_session_resp(); + ret |= test_ntlm2_session_resp(); if (verbose_flag) printf("test_targetinfo\n"); - ret += test_targetinfo(); + ret |= test_targetinfo(); + + if (verbose_flag) + printf("test_ntlmv2\n"); + ret |= test_ntlmv2(); + + if (verbose_flag) + printf("test_string2key\n"); + ret |= test_string2key(); + + if (verbose_flag) + printf("test_jp\n"); + ret |= test_jp(); return ret; } diff --git a/crypto/heimdal/lib/otp/ChangeLog b/crypto/heimdal/lib/otp/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/ChangeLog @@ -0,0 +1,128 @@ +2007-07-17 Love Hörnquist Åstrand + + * Makefile.am: split source files in dist and nodist. + +2007-07-10 Love Hörnquist Åstrand + + * Makefile.am: New library version + +2007-06-07 Assar Westerlund + + * otp_parse.c: NIIL should be NIL + +2006-05-08 Love Hörnquist Åstrand + + * otp_parse.c: Less "pointer targets in passing argument differ in + signedness" warnings. + +2005-07-09 Love Hörnquist Åstrand + + * otp.h: remove parameter names to avoid shadow warnings + +2005-07-07 Love Hörnquist Åstrand + + * otp_parse.c (parse_words): avoid const warnings by making a + (shorter) copy of the string instead of truncating it + +2005-01-09 Love Hörnquist Åstrand + + * otp_parse.c: cast argument to tolower to unsigned char + +2003-04-16 Love Hörnquist Åstrand + + * roken_rename.h: rename strlcat, strlcpy + * Makefile.am: (ES): add strlcpy.c and strlcat.c + * otp_db.c: use strlcpy, from openbsd + * otp_md.c: use strlcat/strlcpy, from openbsd + * otp_challenge.c: do strdup again, we desupport ultrix + +2002-09-10 Johan Danielsson + + * otp_md.c: if we only have old hash names, we need to include + functions here that do the work + +2002-05-20 Johan Danielsson + + * otp_db.c: fix ndbm test + +2002-05-17 Johan Danielsson + + * Makefile.am: add hooks for ndbm_wrap + + * otp_db.c: use ndbm_wrap + +2001-07-12 Assar Westerlund + + * Makefile.am: add required library dependencies + +2001-01-30 Assar Westerlund + + * Makefile.am (libotp_la_LDFLAGS): bump version to 1:2:1 + +2001-01-29 Assar Westerlund + + * otp_md.c: update to new md4/md5/sha API + +2000-12-11 Assar Westerlund + + * Makefile.am (INCLUDES): add krb4 includes here, which are + somewhat bogusly used when linking against libdes supplied by krb4 + +2000-07-25 Johan Danielsson + + * Makefile.am: bump version to 1:1:1 + +2000-07-01 Assar Westerlund + + * const-ify + +2000-02-07 Assar Westerlund + + * Makefile.am: update version to 1:0:1 + +2000-01-26 Assar Westerlund + + * otp_md.c: update to pseudo-standard APIs for md4,md5,sha. + * otp_md.c: start using the pseudo-standard APIs for the hash + functions + +1999-10-20 Assar Westerlund + + * Makefile.am: set version to 0:1:0 + +Fri Mar 19 14:52:48 1999 Johan Danielsson + + * Makefile.am: add version-info + +Thu Mar 18 11:24:19 1999 Johan Danielsson + + * Makefile.am: include Makefile.am.common + +Sat Mar 13 22:27:10 1999 Assar Westerlund + + * otp_parse.c: unsigned-ify + +Sun Nov 22 10:44:16 1998 Assar Westerlund + + * Makefile.in (WFLAGS): set + +Mon May 25 05:27:07 1998 Assar Westerlund + + * Makefile.in (clean): try to remove shared library debris + +Sat May 23 20:54:28 1998 Assar Westerlund + + * Makefile.am: link with DBLIB + +Sun Apr 19 09:59:46 1998 Assar Westerlund + + * Makefile.in: add symlink magic for linux + +Sat Feb 7 07:27:18 1998 Assar Westerlund + + * otp_db.c (otp_put): make sure we don't overrun `buf' + +Sun Nov 9 07:14:59 1997 Assar Westerlund + + * otp_locl.h: use xdbm.h + diff --git a/crypto/heimdal/lib/otp/Makefile.am b/crypto/heimdal/lib/otp/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/Makefile.am @@ -0,0 +1,90 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +AM_CPPFLAGS += $(ROKEN_RENAME) +if HAVE_DBHEADER +AM_CPPFLAGS += -I$(DBHEADER) +endif + +noinst_PROGRAMS = otptest + +check_PROGRAMS = otptest + +otptest_LDADD = libotp.la + +include_HEADERS = otp.h + +lib_LTLIBRARIES = libotp.la +libotp_la_LDFLAGS = -version-info 1:5:1 +libotp_la_LIBADD = $(LIB_hcrypto) $(LIB_roken) + +if HAVE_DB3 +ndbm_wrap = ndbm_wrap.c ndbm_wrap.h +libotp_la_LIBADD += $(DB3LIB) +else +if HAVE_DB1 +ndbm_wrap = ndbm_wrap.c ndbm_wrap.h +libotp_la_LIBADD += $(DB1LIB) +else +ndbm_wrap = +libotp_la_LIBADD += $(NDBMLIB) +endif +endif + +dist_libotp_la_SOURCES = \ + otp.c \ + otp_challenge.c \ + otp_db.c \ + otp_md.c \ + otp_parse.c \ + otp_print.c \ + otp_verify.c \ + otp_locl.h \ + otp_md.h \ + roken_rename.h + +nodist_libotp_la_SOURCES = $(ndbm_wrap) $(ROKEN_SRCS) + +libotp_la_DEPENDENCIES = version-script.map + +if do_roken_rename +ROKEN_SRCS = snprintf.c strcasecmp.c strncasecmp.c strlwr.c strlcpy.c strlcat.c +endif + +if versionscript +libotp_la_LDFLAGS += $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map +endif + +$(libotp_la_OBJECTS): $(ndbm_wrap) + +ndbm_wrap.c: + $(LN_S) $(srcdir)/../roken/ndbm_wrap.c . +ndbm_wrap.h: + (echo '#define dbm_rename(X) __otp_ ## X'; cat $(srcdir)/../roken/ndbm_wrap.h) > ndbm_wrap.h + + +snprintf.c: + $(LN_S) $(srcdir)/../roken/snprintf.c . +strcasecmp.c: + $(LN_S) $(srcdir)/../roken/strcasecmp.c . +strncasecmp.c: + $(LN_S) $(srcdir)/../roken/strncasecmp.c . +strlwr.c: + $(LN_S) $(srcdir)/../roken/strlwr.c . +strlcpy.c: + $(LN_S) $(srcdir)/../roken/strlcpy.c . +strlcat.c: + $(LN_S) $(srcdir)/../roken/strlcat.c . + +CLEANFILES = \ + ndbm_wrap.c \ + ndbm_wrap.h \ + snprintf.c \ + strcasecmp.c \ + strlcat.c \ + strlcpy.c \ + strlwr.c \ + strncasecmp.c + +EXTRA_DIST = NTMakefile version-script.map diff --git a/crypto/heimdal/lib/otp/Makefile.in b/crypto/heimdal/lib/otp/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/Makefile.in @@ -0,0 +1,1241 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@HAVE_DBHEADER_TRUE@am__append_1 = -I$(DBHEADER) +noinst_PROGRAMS = otptest$(EXEEXT) +check_PROGRAMS = otptest$(EXEEXT) +@HAVE_DB3_TRUE@am__append_2 = $(DB3LIB) +@HAVE_DB1_TRUE@@HAVE_DB3_FALSE@am__append_3 = $(DB1LIB) +@HAVE_DB1_FALSE@@HAVE_DB3_FALSE@am__append_4 = $(NDBMLIB) +@versionscript_TRUE@am__append_5 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map +subdir = lib/otp +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +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) +am__DEPENDENCIES_1 = +@HAVE_DB3_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) +@HAVE_DB1_TRUE@@HAVE_DB3_FALSE@am__DEPENDENCIES_3 = \ +@HAVE_DB1_TRUE@@HAVE_DB3_FALSE@ $(am__DEPENDENCIES_1) +@HAVE_DB1_FALSE@@HAVE_DB3_FALSE@am__DEPENDENCIES_4 = \ +@HAVE_DB1_FALSE@@HAVE_DB3_FALSE@ $(am__DEPENDENCIES_1) +dist_libotp_la_OBJECTS = otp.lo otp_challenge.lo otp_db.lo otp_md.lo \ + otp_parse.lo otp_print.lo otp_verify.lo +@HAVE_DB1_TRUE@@HAVE_DB3_FALSE@am__objects_1 = ndbm_wrap.lo +@HAVE_DB3_TRUE@am__objects_1 = ndbm_wrap.lo +@do_roken_rename_TRUE@am__objects_2 = snprintf.lo strcasecmp.lo \ +@do_roken_rename_TRUE@ strncasecmp.lo strlwr.lo strlcpy.lo \ +@do_roken_rename_TRUE@ strlcat.lo +nodist_libotp_la_OBJECTS = $(am__objects_1) $(am__objects_2) +libotp_la_OBJECTS = $(dist_libotp_la_OBJECTS) \ + $(nodist_libotp_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libotp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libotp_la_LDFLAGS) $(LDFLAGS) -o $@ +otptest_SOURCES = otptest.c +otptest_OBJECTS = otptest.$(OBJEXT) +otptest_DEPENDENCIES = libotp.la +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/ndbm_wrap.Plo ./$(DEPDIR)/otp.Plo \ + ./$(DEPDIR)/otp_challenge.Plo ./$(DEPDIR)/otp_db.Plo \ + ./$(DEPDIR)/otp_md.Plo ./$(DEPDIR)/otp_parse.Plo \ + ./$(DEPDIR)/otp_print.Plo ./$(DEPDIR)/otp_verify.Plo \ + ./$(DEPDIR)/otptest.Po ./$(DEPDIR)/snprintf.Plo \ + ./$(DEPDIR)/strcasecmp.Plo ./$(DEPDIR)/strlcat.Plo \ + ./$(DEPDIR)/strlcpy.Plo ./$(DEPDIR)/strlwr.Plo \ + ./$(DEPDIR)/strncasecmp.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(dist_libotp_la_SOURCES) $(nodist_libotp_la_SOURCES) \ + otptest.c +DIST_SOURCES = $(dist_libotp_la_SOURCES) otptest.c +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) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) $(ROKEN_RENAME) $(am__append_1) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +otptest_LDADD = libotp.la +include_HEADERS = otp.h +lib_LTLIBRARIES = libotp.la +libotp_la_LDFLAGS = -version-info 1:5:1 $(am__append_5) +libotp_la_LIBADD = $(LIB_hcrypto) $(LIB_roken) $(am__append_2) \ + $(am__append_3) $(am__append_4) +@HAVE_DB1_FALSE@@HAVE_DB3_FALSE@ndbm_wrap = +@HAVE_DB1_TRUE@@HAVE_DB3_FALSE@ndbm_wrap = ndbm_wrap.c ndbm_wrap.h +@HAVE_DB3_TRUE@ndbm_wrap = ndbm_wrap.c ndbm_wrap.h +dist_libotp_la_SOURCES = \ + otp.c \ + otp_challenge.c \ + otp_db.c \ + otp_md.c \ + otp_parse.c \ + otp_print.c \ + otp_verify.c \ + otp_locl.h \ + otp_md.h \ + roken_rename.h + +nodist_libotp_la_SOURCES = $(ndbm_wrap) $(ROKEN_SRCS) +libotp_la_DEPENDENCIES = version-script.map +@do_roken_rename_TRUE@ROKEN_SRCS = snprintf.c strcasecmp.c strncasecmp.c strlwr.c strlcpy.c strlcat.c +CLEANFILES = \ + ndbm_wrap.c \ + ndbm_wrap.h \ + snprintf.c \ + strcasecmp.c \ + strlcat.c \ + strlcpy.c \ + strlwr.c \ + strncasecmp.c + +EXTRA_DIST = NTMakefile version-script.map +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 lib/otp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign lib/otp/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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-checkPROGRAMS: + @list='$(check_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 + +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 + +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}; \ + } + +libotp.la: $(libotp_la_OBJECTS) $(libotp_la_DEPENDENCIES) $(EXTRA_libotp_la_DEPENDENCIES) + $(AM_V_CCLD)$(libotp_la_LINK) -rpath $(libdir) $(libotp_la_OBJECTS) $(libotp_la_LIBADD) $(LIBS) + +otptest$(EXEEXT): $(otptest_OBJECTS) $(otptest_DEPENDENCIES) $(EXTRA_otptest_DEPENDENCIES) + @rm -f otptest$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(otptest_OBJECTS) $(otptest_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ndbm_wrap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp_challenge.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp_db.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp_md.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp_parse.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp_print.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otp_verify.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/otptest.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strcasecmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlcpy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlwr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strncasecmp.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(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: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local +install-checkPROGRAMS: install-libLTLIBRARIES + +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: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool clean-noinstPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/ndbm_wrap.Plo + -rm -f ./$(DEPDIR)/otp.Plo + -rm -f ./$(DEPDIR)/otp_challenge.Plo + -rm -f ./$(DEPDIR)/otp_db.Plo + -rm -f ./$(DEPDIR)/otp_md.Plo + -rm -f ./$(DEPDIR)/otp_parse.Plo + -rm -f ./$(DEPDIR)/otp_print.Plo + -rm -f ./$(DEPDIR)/otp_verify.Plo + -rm -f ./$(DEPDIR)/otptest.Po + -rm -f ./$(DEPDIR)/snprintf.Plo + -rm -f ./$(DEPDIR)/strcasecmp.Plo + -rm -f ./$(DEPDIR)/strlcat.Plo + -rm -f ./$(DEPDIR)/strlcpy.Plo + -rm -f ./$(DEPDIR)/strlwr.Plo + -rm -f ./$(DEPDIR)/strncasecmp.Plo + -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 + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local 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 -f ./$(DEPDIR)/ndbm_wrap.Plo + -rm -f ./$(DEPDIR)/otp.Plo + -rm -f ./$(DEPDIR)/otp_challenge.Plo + -rm -f ./$(DEPDIR)/otp_db.Plo + -rm -f ./$(DEPDIR)/otp_md.Plo + -rm -f ./$(DEPDIR)/otp_parse.Plo + -rm -f ./$(DEPDIR)/otp_print.Plo + -rm -f ./$(DEPDIR)/otp_verify.Plo + -rm -f ./$(DEPDIR)/otptest.Po + -rm -f ./$(DEPDIR)/snprintf.Plo + -rm -f ./$(DEPDIR)/strcasecmp.Plo + -rm -f ./$(DEPDIR)/strlcat.Plo + -rm -f ./$(DEPDIR)/strlcpy.Plo + -rm -f ./$(DEPDIR)/strlwr.Plo + -rm -f ./$(DEPDIR)/strncasecmp.Plo + -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 + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-checkPROGRAMS clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-noinstPROGRAMS \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local 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 tags-am uninstall uninstall-am uninstall-hook \ + uninstall-includeHEADERS uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +$(libotp_la_OBJECTS): $(ndbm_wrap) + +ndbm_wrap.c: + $(LN_S) $(srcdir)/../roken/ndbm_wrap.c . +ndbm_wrap.h: + (echo '#define dbm_rename(X) __otp_ ## X'; cat $(srcdir)/../roken/ndbm_wrap.h) > ndbm_wrap.h + +snprintf.c: + $(LN_S) $(srcdir)/../roken/snprintf.c . +strcasecmp.c: + $(LN_S) $(srcdir)/../roken/strcasecmp.c . +strncasecmp.c: + $(LN_S) $(srcdir)/../roken/strncasecmp.c . +strlwr.c: + $(LN_S) $(srcdir)/../roken/strlwr.c . +strlcpy.c: + $(LN_S) $(srcdir)/../roken/strlcpy.c . +strlcat.c: + $(LN_S) $(srcdir)/../roken/strlcat.c . + +# 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: diff --git a/crypto/heimdal/lib/otp/NTMakefile b/crypto/heimdal/lib/otp/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\otp + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/lib/otp/otp.h b/crypto/heimdal/lib/otp/otp.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef _OTP_H +#define _OTP_H + +#include +#include + +enum {OTPKEYSIZE = 8}; + +typedef unsigned char OtpKey[OTPKEYSIZE]; + +#define OTP_MIN_PASSPHRASE 10 +#define OTP_MAX_PASSPHRASE 63 + +#define OTP_USER_TIMEOUT 120 +#define OTP_DB_TIMEOUT 60 + +#define OTP_HEXPREFIX "hex:" +#define OTP_WORDPREFIX "word:" + +typedef enum { OTP_ALG_MD4, OTP_ALG_MD5, OTP_ALG_SHA } OtpAlgID; + +#define OTP_ALG_DEFAULT "md5" + +typedef struct { + OtpAlgID id; + char *name; + int hashsize; + int (*hash)(const char *, size_t, unsigned char *); + int (*init)(OtpKey, const char *, const char *); + int (*next)(OtpKey); +} OtpAlgorithm; + +typedef struct { + char *user; + OtpAlgorithm *alg; + unsigned n; + char seed[17]; + OtpKey key; + int challengep; + time_t lock_time; + char *err; +} OtpContext; + +OtpAlgorithm *otp_find_alg (char *); +void otp_print_stddict (OtpKey, char *, size_t); +void otp_print_hex (OtpKey, char *, size_t); +void otp_print_stddict_extended (OtpKey, char *, size_t); +void otp_print_hex_extended (OtpKey, char *, size_t); +unsigned otp_checksum (OtpKey); +int otp_parse_hex (OtpKey, const char *); +int otp_parse_stddict (OtpKey, const char *); +int otp_parse_altdict (OtpKey, const char *, OtpAlgorithm *); +int otp_parse (OtpKey, const char *, OtpAlgorithm *); +int otp_challenge (OtpContext *, char *, char *, size_t); +int otp_verify_user (OtpContext *, const char *); +int otp_verify_user_1 (OtpContext *, const char *); +char *otp_error (OtpContext *); + +void *otp_db_open (void); +void otp_db_close (void *); +int otp_put (void *, OtpContext *); +int otp_get (void *, OtpContext *); +int otp_simple_get (void *, OtpContext *); +int otp_delete (void *, OtpContext *); + +#endif /* _OTP_H */ diff --git a/crypto/heimdal/lib/otp/otp.c b/crypto/heimdal/lib/otp/otp.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp.c @@ -0,0 +1,63 @@ +/* + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +RCSID("$Id$"); +#endif + +#include "otp_locl.h" +#include "otp_md.h" + +static OtpAlgorithm algorithms[] = { + {OTP_ALG_MD4, "md4", 16, otp_md4_hash, otp_md4_init, otp_md4_next}, + {OTP_ALG_MD5, "md5", 16, otp_md5_hash, otp_md5_init, otp_md5_next}, + {OTP_ALG_SHA, "sha", 20, otp_sha_hash, otp_sha_init, otp_sha_next} +}; + +OtpAlgorithm * +otp_find_alg (char *name) +{ + int i; + + for (i = 0; i < sizeof(algorithms)/sizeof(*algorithms); ++i) + if (strcmp (name, algorithms[i].name) == 0) + return &algorithms[i]; + return NULL; +} + +char * +otp_error (OtpContext *o) +{ + return o->err; +} diff --git a/crypto/heimdal/lib/otp/otp_challenge.c b/crypto/heimdal/lib/otp/otp_challenge.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_challenge.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +RCSID("$Id$"); +#endif + +#include "otp_locl.h" + +int +otp_challenge (OtpContext *ctx, char *user, char *str, size_t len) +{ + void *dbm; + int ret; + + ctx->challengep = 0; + ctx->err = NULL; + ctx->user = strdup(user); + if (ctx->user == NULL) { + ctx->err = "Out of memory"; + return -1; + } + dbm = otp_db_open (); + if (dbm == NULL) { + ctx->err = "Cannot open database"; + return -1; + } + ret = otp_get (dbm, ctx); + otp_db_close (dbm); + if (ret) + return ret; + snprintf (str, len, + "[ otp-%s %u %s ]", + ctx->alg->name, ctx->n-1, ctx->seed); + ctx->challengep = 1; + return 0; +} diff --git a/crypto/heimdal/lib/otp/otp_db.c b/crypto/heimdal/lib/otp/otp_db.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_db.c @@ -0,0 +1,233 @@ +/* + * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +RCSID("$Id$"); +#endif + +#include "otp_locl.h" + +#if !defined(HAVE_NDBM) && !defined(HAVE_DB_NDBM) +#include "ndbm_wrap.h" +#endif + +#define RETRIES 5 + +void * +otp_db_open (void) +{ + int lock; + int i; + void *ret; + + for(i = 0; i < RETRIES; ++i) { + struct stat statbuf; + + lock = open (OTP_DB_LOCK, O_WRONLY | O_CREAT | O_EXCL, 0666); + if (lock >= 0) { + close(lock); + break; + } + if (stat (OTP_DB_LOCK, &statbuf) == 0) { + if (time(NULL) - statbuf.st_mtime > OTP_DB_TIMEOUT) + unlink (OTP_DB_LOCK); + else + sleep (1); + } + } + if (i == RETRIES) + return NULL; + ret = dbm_open (OTP_DB, O_RDWR | O_CREAT, 0600); + if (ret == NULL) + unlink (OTP_DB_LOCK); + return ret; +} + +void +otp_db_close (void *dbm) +{ + dbm_close ((DBM *)dbm); + unlink (OTP_DB_LOCK); +} + +/* + * Remove this entry from the database. + * return 0 if ok. + */ + +int +otp_delete (void *v, OtpContext *ctx) +{ + DBM *dbm = (DBM *)v; + datum key; + + key.dsize = strlen(ctx->user); + key.dptr = ctx->user; + + return dbm_delete(dbm, key); +} + +/* + * Read this entry from the database and lock it if lockp. + */ + +static int +otp_get_internal (void *v, OtpContext *ctx, int lockp) +{ + DBM *dbm = (DBM *)v; + datum dat, key; + char *p; + time_t now, then; + + key.dsize = strlen(ctx->user); + key.dptr = ctx->user; + + dat = dbm_fetch (dbm, key); + if (dat.dptr == NULL) { + ctx->err = "Entry not found"; + return -1; + } + p = dat.dptr; + + memcpy (&then, p, sizeof(then)); + ctx->lock_time = then; + if (lockp) { + time(&now); + if (then && now - then < OTP_USER_TIMEOUT) { + ctx->err = "Entry locked"; + return -1; + } + memcpy (p, &now, sizeof(now)); + } + p += sizeof(now); + ctx->alg = otp_find_alg (p); + if (ctx->alg == NULL) { + ctx->err = "Bad algorithm"; + return -1; + } + p += strlen(p) + 1; + { + unsigned char *up = (unsigned char *)p; + ctx->n = (up[0] << 24) | (up[1] << 16) | (up[2] << 8) | up[3]; + } + p += 4; + memcpy (ctx->key, p, OTPKEYSIZE); + p += OTPKEYSIZE; + strlcpy (ctx->seed, p, sizeof(ctx->seed)); + if (lockp) + return dbm_store (dbm, key, dat, DBM_REPLACE); + else + return 0; +} + +/* + * Get and lock. + */ + +int +otp_get (void *v, OtpContext *ctx) +{ + return otp_get_internal (v, ctx, 1); +} + +/* + * Get and don't lock. + */ + +int +otp_simple_get (void *v, OtpContext *ctx) +{ + return otp_get_internal (v, ctx, 0); +} + +/* + * Write this entry to the database. + */ + +int +otp_put (void *v, OtpContext *ctx) +{ + DBM *dbm = (DBM *)v; + datum dat, key; + char buf[1024], *p; + time_t zero = 0; + size_t len, rem; + + key.dsize = strlen(ctx->user); + key.dptr = ctx->user; + + p = buf; + rem = sizeof(buf); + + if (rem < sizeof(zero)) + return -1; + memcpy (p, &zero, sizeof(zero)); + p += sizeof(zero); + rem -= sizeof(zero); + len = strlen(ctx->alg->name) + 1; + + if (rem < len) + return -1; + strlcpy (p, ctx->alg->name, rem); + p += len; + rem -= len; + + if (rem < 4) + return -1; + { + unsigned char *up = (unsigned char *)p; + *up++ = (ctx->n >> 24) & 0xFF; + *up++ = (ctx->n >> 16) & 0xFF; + *up++ = (ctx->n >> 8) & 0xFF; + *up++ = (ctx->n >> 0) & 0xFF; + } + p += 4; + rem -= 4; + + if (rem < OTPKEYSIZE) + return -1; + memcpy (p, ctx->key, OTPKEYSIZE); + p += OTPKEYSIZE; + rem -= OTPKEYSIZE; + + len = strlen(ctx->seed) + 1; + if (rem < len) + return -1; + strlcpy (p, ctx->seed, rem); + p += len; + rem -= len; + dat.dptr = buf; + dat.dsize = p - buf; + return dbm_store (dbm, key, dat, DBM_REPLACE); +} diff --git a/crypto/heimdal/lib/otp/otp_locl.h b/crypto/heimdal/lib/otp/otp_locl.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_locl.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#include +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_IO_H +#include +#endif + +#include + +#include + +#include + +#define OTPKEYS "/.otpkeys" + +#define OTP_DB SYSCONFDIR "/otp" +#define OTP_DB_LOCK SYSCONFDIR "/otp-lock" diff --git a/crypto/heimdal/lib/otp/otp_md.h b/crypto/heimdal/lib/otp/otp_md.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_md.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +int otp_md4_init (OtpKey key, const char *pwd, const char *seed); +int otp_md4_hash (const char *, size_t, unsigned char *res); +int otp_md4_next (OtpKey key); + +int otp_md5_init (OtpKey key, const char *pwd, const char *seed); +int otp_md5_hash (const char *, size_t, unsigned char *res); +int otp_md5_next (OtpKey key); + +int otp_sha_init (OtpKey key, const char *pwd, const char *seed); +int otp_sha_hash (const char *, size_t, unsigned char *res); +int otp_sha_next (OtpKey key); diff --git a/crypto/heimdal/lib/otp/otp_md.c b/crypto/heimdal/lib/otp/otp_md.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_md.c @@ -0,0 +1,231 @@ +/* + * Copyright (c) 1995 - 2003 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#define HC_DEPRECATED_CRYPTO + +#include "config.h" + +#include "otp_locl.h" + +#include "otp_md.h" +#include "crypto-headers.h" + +/* + * Compress len bytes from md into key + */ + +static void +compressmd (OtpKey key, unsigned char *md, size_t len) +{ + u_char *p = key; + + memset (p, 0, OTPKEYSIZE); + while(len) { + *p++ ^= *md++; + *p++ ^= *md++; + *p++ ^= *md++; + *p++ ^= *md++; + len -= 4; + if (p == key + OTPKEYSIZE) + p = key; + } +} + +/* + * For histerical reasons, in the OTP definition it's said that + * the result from SHA must be stored in little-endian order. See + * draft-ietf-otp-01.txt. + */ + +static void +little_endian(unsigned char *res, size_t len) +{ + unsigned char t; + size_t i; + + for (i = 0; i < len; i += 4) { + t = res[i + 0]; res[i + 0] = res[i + 3]; res[i + 3] = t; + t = res[i + 1]; res[i + 1] = res[i + 2]; res[i + 2] = t; + } +} + +static int +otp_md_init (OtpKey key, + const char *pwd, + const char *seed, + const EVP_MD *md, + int le, + unsigned char *res, + size_t ressz) +{ + EVP_MD_CTX *ctx; + char *p; + int len; + + ctx = EVP_MD_CTX_create(); + + len = strlen(pwd) + strlen(seed); + p = malloc (len + 1); + if (p == NULL) + return -1; + strlcpy (p, seed, len + 1); + strlwr (p); + strlcat (p, pwd, len + 1); + + EVP_DigestInit_ex(ctx, md, NULL); + EVP_DigestUpdate(ctx, p, len); + EVP_DigestFinal_ex(ctx, res, NULL); + + EVP_MD_CTX_destroy(ctx); + + if (le) + little_endian(res, ressz); + + free (p); + compressmd (key, res, ressz); + return 0; +} + +static int +otp_md_next (OtpKey key, + const EVP_MD *md, + int le, + unsigned char *res, + size_t ressz) +{ + EVP_MD_CTX *ctx; + + ctx = EVP_MD_CTX_create(); + + EVP_DigestInit_ex(ctx, md, NULL); + EVP_DigestUpdate(ctx, key, OTPKEYSIZE); + EVP_DigestFinal_ex(ctx, res, NULL); + + EVP_MD_CTX_destroy(ctx); + + if (le) + little_endian(res, ressz); + + compressmd (key, res, ressz); + return 0; +} + +static int +otp_md_hash (const char *data, + size_t len, + const EVP_MD *md, + int le, + unsigned char *res, + size_t ressz) +{ + EVP_MD_CTX *ctx; + ctx = EVP_MD_CTX_create(); + + EVP_DigestInit_ex(ctx, md, NULL); + EVP_DigestUpdate(ctx, data, len); + EVP_DigestFinal_ex(ctx, res, NULL); + + EVP_MD_CTX_destroy(ctx); + + if (le) + little_endian(res, ressz); + + return 0; +} + +int +otp_md4_init (OtpKey key, const char *pwd, const char *seed) +{ + unsigned char res[16]; + return otp_md_init (key, pwd, seed, EVP_md4(), 0, res, sizeof(res)); +} + +int +otp_md4_hash (const char *data, + size_t len, + unsigned char *res) +{ + return otp_md_hash (data, len, EVP_md4(), 0, res, 16); +} + +int +otp_md4_next (OtpKey key) +{ + unsigned char res[16]; + return otp_md_next (key, EVP_md4(), 0, res, sizeof(res)); +} + + +int +otp_md5_init (OtpKey key, const char *pwd, const char *seed) +{ + unsigned char res[16]; + return otp_md_init (key, pwd, seed, EVP_md5(), 0, res, sizeof(res)); +} + +int +otp_md5_hash (const char *data, + size_t len, + unsigned char *res) +{ + return otp_md_hash (data, len, EVP_md5(), 0, res, 16); +} + +int +otp_md5_next (OtpKey key) +{ + unsigned char res[16]; + return otp_md_next (key, EVP_md5(), 0, res, sizeof(res)); +} + +int +otp_sha_init (OtpKey key, const char *pwd, const char *seed) +{ + unsigned char res[20]; + return otp_md_init (key, pwd, seed, EVP_sha1(), 1, res, sizeof(res)); +} + +int +otp_sha_hash (const char *data, + size_t len, + unsigned char *res) +{ + return otp_md_hash (data, len, EVP_sha1(), 1, res, 20); +} + +int +otp_sha_next (OtpKey key) +{ + unsigned char res[20]; + return otp_md_next (key, EVP_sha1(), 1, res, sizeof(res)); +} diff --git a/crypto/heimdal/lib/otp/otp_parse.c b/crypto/heimdal/lib/otp/otp_parse.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_parse.c @@ -0,0 +1,2522 @@ +/* + * Copyright (c) 1995-2000, 2005-2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +RCSID("$Id$"); +#endif + +#include "otp_locl.h" + +struct e { + const char *s; + unsigned n; +}; + +extern const struct e inv_std_dict[2048]; + +static int +cmp(const void *a, const void *b) +{ + const struct e *e1, *e2; + + e1 = (const struct e *)a; + e2 = (const struct e *)b; + return strcasecmp (e1->s, e2->s); +} + +static int +get_stdword (const char *s, void *v) +{ + struct e e, *r; + + e.s = s; + e.n = -1; + r = (struct e *) bsearch (&e, inv_std_dict, + sizeof(inv_std_dict)/sizeof(*inv_std_dict), + sizeof(*inv_std_dict), cmp); + if (r) + return r->n; + else + return -1; +} + +static void +compress (OtpKey key, unsigned wn[]) +{ + key[0] = wn[0] >> 3; + key[1] = ((wn[0] & 0x07) << 5) | (wn[1] >> 6); + key[2] = ((wn[1] & 0x3F) << 2) | (wn[2] >> 9); + key[3] = ((wn[2] >> 1) & 0xFF); + key[4] = ((wn[2] & 0x01) << 7) | (wn[3] >> 4); + key[5] = ((wn[3] & 0x0F) << 4) | (wn[4] >> 7); + key[6] = ((wn[4] & 0x7F) << 1) | (wn[5] >> 10); + key[7] = ((wn[5] >> 2) & 0xFF); +} + +static int +get_altword (const char *s, void *a) +{ + OtpAlgorithm *alg = (OtpAlgorithm *)a; + int ret; + unsigned char *res = malloc(alg->hashsize); + + if (res == NULL) + return -1; + alg->hash (s, strlen(s), res); + ret = (unsigned)(res[alg->hashsize - 1]) | + ((res[alg->hashsize - 2] & 0x03) << 8); + free (res); + return ret; +} + +static int +parse_words(unsigned wn[], + const char *str, + int (*convert)(const char *, void *), + void *arg) +{ + const unsigned char *w, *wend; + char *wcopy; + int i; + int tmp; + + w = (const unsigned char *)str; + for (i = 0; i < 6; ++i) { + while (isspace(*w)) + ++w; + wend = w; + while (isalpha (*wend)) + ++wend; + + tmp = wend - w; + wcopy = malloc(tmp + 1); + if (wcopy == NULL) + return -1; + memcpy(wcopy, w, tmp); + wcopy[tmp] = '\0'; + + tmp = (*convert)(wcopy, arg); + free(wcopy); + w = wend; + if (tmp < 0) + return -1; + wn[i] = tmp; + } + return 0; +} + +static int +otp_parse_internal (OtpKey key, const char *str, + OtpAlgorithm *alg, + int (*convert)(const char *, void *)) +{ + unsigned wn[6]; + + if (parse_words (wn, str, convert, alg)) + return -1; + compress (key, wn); + if (otp_checksum (key) != (wn[5] & 0x03)) + return -1; + return 0; +} + +int +otp_parse_stddict (OtpKey key, const char *str) +{ + return otp_parse_internal (key, str, NULL, get_stdword); +} + +int +otp_parse_altdict (OtpKey key, const char *str, OtpAlgorithm *alg) +{ + return otp_parse_internal (key, str, alg, get_altword); +} + +int +otp_parse_hex (OtpKey key, const char *s) +{ + char buf[17], *b; + int is[8]; + int i; + + b = buf; + while (*s) { + if (strchr ("0123456789ABCDEFabcdef", *s)) { + if (b - buf >= 16) + return -1; + else + *b++ = tolower((unsigned char)*s); + } + s++; + } + *b = '\0'; + if (sscanf (buf, "%2x%2x%2x%2x%2x%2x%2x%2x", + &is[0], &is[1], &is[2], &is[3], &is[4], + &is[5], &is[6], &is[7]) != 8) + return -1; + for (i = 0; i < OTPKEYSIZE; ++i) + key[i] = is[i]; + return 0; +} + +int +otp_parse (OtpKey key, const char *s, OtpAlgorithm *alg) +{ + int ret; + int dohex = 1; + + if (strncmp (s, OTP_HEXPREFIX, strlen(OTP_HEXPREFIX)) == 0) + return otp_parse_hex (key, s + strlen(OTP_HEXPREFIX)); + if (strncmp (s, OTP_WORDPREFIX, strlen(OTP_WORDPREFIX)) == 0) { + s += strlen(OTP_WORDPREFIX); + dohex = 0; + } + + ret = otp_parse_stddict (key, s); + if (ret) + ret = otp_parse_altdict (key, s, alg); + if (ret && dohex) + ret = otp_parse_hex (key, s); + return ret; +} + +const char *const std_dict[2048] = +{ "A", "ABE", "ACE", "ACT", "AD", "ADA", "ADD", +"AGO", "AID", "AIM", "AIR", "ALL", "ALP", "AM", "AMY", +"AN", "ANA", "AND", "ANN", "ANT", "ANY", "APE", "APS", +"APT", "ARC", "ARE", "ARK", "ARM", "ART", "AS", "ASH", +"ASK", "AT", "ATE", "AUG", "AUK", "AVE", "AWE", "AWK", +"AWL", "AWN", "AX", "AYE", "BAD", "BAG", "BAH", "BAM", +"BAN", "BAR", "BAT", "BAY", "BE", "BED", "BEE", "BEG", +"BEN", "BET", "BEY", "BIB", "BID", "BIG", "BIN", "BIT", +"BOB", "BOG", "BON", "BOO", "BOP", "BOW", "BOY", "BUB", +"BUD", "BUG", "BUM", "BUN", "BUS", "BUT", "BUY", "BY", +"BYE", "CAB", "CAL", "CAM", "CAN", "CAP", "CAR", "CAT", +"CAW", "COD", "COG", "COL", "CON", "COO", "COP", "COT", +"COW", "COY", "CRY", "CUB", "CUE", "CUP", "CUR", "CUT", +"DAB", "DAD", "DAM", "DAN", "DAR", "DAY", "DEE", "DEL", +"DEN", "DES", "DEW", "DID", "DIE", "DIG", "DIN", "DIP", +"DO", "DOE", "DOG", "DON", "DOT", "DOW", "DRY", "DUB", +"DUD", "DUE", "DUG", "DUN", "EAR", "EAT", "ED", "EEL", +"EGG", "EGO", "ELI", "ELK", "ELM", "ELY", "EM", "END", +"EST", "ETC", "EVA", "EVE", "EWE", "EYE", "FAD", "FAN", +"FAR", "FAT", "FAY", "FED", "FEE", "FEW", "FIB", "FIG", +"FIN", "FIR", "FIT", "FLO", "FLY", "FOE", "FOG", "FOR", +"FRY", "FUM", "FUN", "FUR", "GAB", "GAD", "GAG", "GAL", +"GAM", "GAP", "GAS", "GAY", "GEE", "GEL", "GEM", "GET", +"GIG", "GIL", "GIN", "GO", "GOT", "GUM", "GUN", "GUS", +"GUT", "GUY", "GYM", "GYP", "HA", "HAD", "HAL", "HAM", +"HAN", "HAP", "HAS", "HAT", "HAW", "HAY", "HE", "HEM", +"HEN", "HER", "HEW", "HEY", "HI", "HID", "HIM", "HIP", +"HIS", "HIT", "HO", "HOB", "HOC", "HOE", "HOG", "HOP", +"HOT", "HOW", "HUB", "HUE", "HUG", "HUH", "HUM", "HUT", +"I", "ICY", "IDA", "IF", "IKE", "ILL", "INK", "INN", +"IO", "ION", "IQ", "IRA", "IRE", "IRK", "IS", "IT", +"ITS", "IVY", "JAB", "JAG", "JAM", "JAN", "JAR", "JAW", +"JAY", "JET", "JIG", "JIM", "JO", "JOB", "JOE", "JOG", +"JOT", "JOY", "JUG", "JUT", "KAY", "KEG", "KEN", "KEY", +"KID", "KIM", "KIN", "KIT", "LA", "LAB", "LAC", "LAD", +"LAG", "LAM", "LAP", "LAW", "LAY", "LEA", "LED", "LEE", +"LEG", "LEN", "LEO", "LET", "LEW", "LID", "LIE", "LIN", +"LIP", "LIT", "LO", "LOB", "LOG", "LOP", "LOS", "LOT", +"LOU", "LOW", "LOY", "LUG", "LYE", "MA", "MAC", "MAD", +"MAE", "MAN", "MAO", "MAP", "MAT", "MAW", "MAY", "ME", +"MEG", "MEL", "MEN", "MET", "MEW", "MID", "MIN", "MIT", +"MOB", "MOD", "MOE", "MOO", "MOP", "MOS", "MOT", "MOW", +"MUD", "MUG", "MUM", "MY", "NAB", "NAG", "NAN", "NAP", +"NAT", "NAY", "NE", "NED", "NEE", "NET", "NEW", "NIB", +"NIL", "NIP", "NIT", "NO", "NOB", "NOD", "NON", "NOR", +"NOT", "NOV", "NOW", "NU", "NUN", "NUT", "O", "OAF", +"OAK", "OAR", "OAT", "ODD", "ODE", "OF", "OFF", "OFT", +"OH", "OIL", "OK", "OLD", "ON", "ONE", "OR", "ORB", +"ORE", "ORR", "OS", "OTT", "OUR", "OUT", "OVA", "OW", +"OWE", "OWL", "OWN", "OX", "PA", "PAD", "PAL", "PAM", +"PAN", "PAP", "PAR", "PAT", "PAW", "PAY", "PEA", "PEG", +"PEN", "PEP", "PER", "PET", "PEW", "PHI", "PI", "PIE", +"PIN", "PIT", "PLY", "PO", "POD", "POE", "POP", "POT", +"POW", "PRO", "PRY", "PUB", "PUG", "PUN", "PUP", "PUT", +"QUO", "RAG", "RAM", "RAN", "RAP", "RAT", "RAW", "RAY", +"REB", "RED", "REP", "RET", "RIB", "RID", "RIG", "RIM", +"RIO", "RIP", "ROB", "ROD", "ROE", "RON", "ROT", "ROW", +"ROY", "RUB", "RUE", "RUG", "RUM", "RUN", "RYE", "SAC", +"SAD", "SAG", "SAL", "SAM", "SAN", "SAP", "SAT", "SAW", +"SAY", "SEA", "SEC", "SEE", "SEN", "SET", "SEW", "SHE", +"SHY", "SIN", "SIP", "SIR", "SIS", "SIT", "SKI", "SKY", +"SLY", "SO", "SOB", "SOD", "SON", "SOP", "SOW", "SOY", +"SPA", "SPY", "SUB", "SUD", "SUE", "SUM", "SUN", "SUP", +"TAB", "TAD", "TAG", "TAN", "TAP", "TAR", "TEA", "TED", +"TEE", "TEN", "THE", "THY", "TIC", "TIE", "TIM", "TIN", +"TIP", "TO", "TOE", "TOG", "TOM", "TON", "TOO", "TOP", +"TOW", "TOY", "TRY", "TUB", "TUG", "TUM", "TUN", "TWO", +"UN", "UP", "US", "USE", "VAN", "VAT", "VET", "VIE", +"WAD", "WAG", "WAR", "WAS", "WAY", "WE", "WEB", "WED", +"WEE", "WET", "WHO", "WHY", "WIN", "WIT", "WOK", "WON", +"WOO", "WOW", "WRY", "WU", "YAM", "YAP", "YAW", "YE", +"YEA", "YES", "YET", "YOU", "ABED", "ABEL", "ABET", "ABLE", +"ABUT", "ACHE", "ACID", "ACME", "ACRE", "ACTA", "ACTS", "ADAM", +"ADDS", "ADEN", "AFAR", "AFRO", "AGEE", "AHEM", "AHOY", "AIDA", +"AIDE", "AIDS", "AIRY", "AJAR", "AKIN", "ALAN", "ALEC", "ALGA", +"ALIA", "ALLY", "ALMA", "ALOE", "ALSO", "ALTO", "ALUM", "ALVA", +"AMEN", "AMES", "AMID", "AMMO", "AMOK", "AMOS", "AMRA", "ANDY", +"ANEW", "ANNA", "ANNE", "ANTE", "ANTI", "AQUA", "ARAB", "ARCH", +"AREA", "ARGO", "ARID", "ARMY", "ARTS", "ARTY", "ASIA", "ASKS", +"ATOM", "AUNT", "AURA", "AUTO", "AVER", "AVID", "AVIS", "AVON", +"AVOW", "AWAY", "AWRY", "BABE", "BABY", "BACH", "BACK", "BADE", +"BAIL", "BAIT", "BAKE", "BALD", "BALE", "BALI", "BALK", "BALL", +"BALM", "BAND", "BANE", "BANG", "BANK", "BARB", "BARD", "BARE", +"BARK", "BARN", "BARR", "BASE", "BASH", "BASK", "BASS", "BATE", +"BATH", "BAWD", "BAWL", "BEAD", "BEAK", "BEAM", "BEAN", "BEAR", +"BEAT", "BEAU", "BECK", "BEEF", "BEEN", "BEER", "BEET", "BELA", +"BELL", "BELT", "BEND", "BENT", "BERG", "BERN", "BERT", "BESS", +"BEST", "BETA", "BETH", "BHOY", "BIAS", "BIDE", "BIEN", "BILE", +"BILK", "BILL", "BIND", "BING", "BIRD", "BITE", "BITS", "BLAB", +"BLAT", "BLED", "BLEW", "BLOB", "BLOC", "BLOT", "BLOW", "BLUE", +"BLUM", "BLUR", "BOAR", "BOAT", "BOCA", "BOCK", "BODE", "BODY", +"BOGY", "BOHR", "BOIL", "BOLD", "BOLO", "BOLT", "BOMB", "BONA", +"BOND", "BONE", "BONG", "BONN", "BONY", "BOOK", "BOOM", "BOON", +"BOOT", "BORE", "BORG", "BORN", "BOSE", "BOSS", "BOTH", "BOUT", +"BOWL", "BOYD", "BRAD", "BRAE", "BRAG", "BRAN", "BRAY", "BRED", +"BREW", "BRIG", "BRIM", "BROW", "BUCK", "BUDD", "BUFF", "BULB", +"BULK", "BULL", "BUNK", "BUNT", "BUOY", "BURG", "BURL", "BURN", +"BURR", "BURT", "BURY", "BUSH", "BUSS", "BUST", "BUSY", "BYTE", +"CADY", "CAFE", "CAGE", "CAIN", "CAKE", "CALF", "CALL", "CALM", +"CAME", "CANE", "CANT", "CARD", "CARE", "CARL", "CARR", "CART", +"CASE", "CASH", "CASK", "CAST", "CAVE", "CEIL", "CELL", "CENT", +"CERN", "CHAD", "CHAR", "CHAT", "CHAW", "CHEF", "CHEN", "CHEW", +"CHIC", "CHIN", "CHOU", "CHOW", "CHUB", "CHUG", "CHUM", "CITE", +"CITY", "CLAD", "CLAM", "CLAN", "CLAW", "CLAY", "CLOD", "CLOG", +"CLOT", "CLUB", "CLUE", "COAL", "COAT", "COCA", "COCK", "COCO", +"CODA", "CODE", "CODY", "COED", "COIL", "COIN", "COKE", "COLA", +"COLD", "COLT", "COMA", "COMB", "COME", "COOK", "COOL", "COON", +"COOT", "CORD", "CORE", "CORK", "CORN", "COST", "COVE", "COWL", +"CRAB", "CRAG", "CRAM", "CRAY", "CREW", "CRIB", "CROW", "CRUD", +"CUBA", "CUBE", "CUFF", "CULL", "CULT", "CUNY", "CURB", "CURD", +"CURE", "CURL", "CURT", "CUTS", "DADE", "DALE", "DAME", "DANA", +"DANE", "DANG", "DANK", "DARE", "DARK", "DARN", "DART", "DASH", +"DATA", "DATE", "DAVE", "DAVY", "DAWN", "DAYS", "DEAD", "DEAF", +"DEAL", "DEAN", "DEAR", "DEBT", "DECK", "DEED", "DEEM", "DEER", +"DEFT", "DEFY", "DELL", "DENT", "DENY", "DESK", "DIAL", "DICE", +"DIED", "DIET", "DIME", "DINE", "DING", "DINT", "DIRE", "DIRT", +"DISC", "DISH", "DISK", "DIVE", "DOCK", "DOES", "DOLE", "DOLL", +"DOLT", "DOME", "DONE", "DOOM", "DOOR", "DORA", "DOSE", "DOTE", +"DOUG", "DOUR", "DOVE", "DOWN", "DRAB", "DRAG", "DRAM", "DRAW", +"DREW", "DRUB", "DRUG", "DRUM", "DUAL", "DUCK", "DUCT", "DUEL", +"DUET", "DUKE", "DULL", "DUMB", "DUNE", "DUNK", "DUSK", "DUST", +"DUTY", "EACH", "EARL", "EARN", "EASE", "EAST", "EASY", "EBEN", +"ECHO", "EDDY", "EDEN", "EDGE", "EDGY", "EDIT", "EDNA", "EGAN", +"ELAN", "ELBA", "ELLA", "ELSE", "EMIL", "EMIT", "EMMA", "ENDS", +"ERIC", "EROS", "EVEN", "EVER", "EVIL", "EYED", "FACE", "FACT", +"FADE", "FAIL", "FAIN", "FAIR", "FAKE", "FALL", "FAME", "FANG", +"FARM", "FAST", "FATE", "FAWN", "FEAR", "FEAT", "FEED", "FEEL", +"FEET", "FELL", "FELT", "FEND", "FERN", "FEST", "FEUD", "FIEF", +"FIGS", "FILE", "FILL", "FILM", "FIND", "FINE", "FINK", "FIRE", +"FIRM", "FISH", "FISK", "FIST", "FITS", "FIVE", "FLAG", "FLAK", +"FLAM", "FLAT", "FLAW", "FLEA", "FLED", "FLEW", "FLIT", "FLOC", +"FLOG", "FLOW", "FLUB", "FLUE", "FOAL", "FOAM", "FOGY", "FOIL", +"FOLD", "FOLK", "FOND", "FONT", "FOOD", "FOOL", "FOOT", "FORD", +"FORE", "FORK", "FORM", "FORT", "FOSS", "FOUL", "FOUR", "FOWL", +"FRAU", "FRAY", "FRED", "FREE", "FRET", "FREY", "FROG", "FROM", +"FUEL", "FULL", "FUME", "FUND", "FUNK", "FURY", "FUSE", "FUSS", +"GAFF", "GAGE", "GAIL", "GAIN", "GAIT", "GALA", "GALE", "GALL", +"GALT", "GAME", "GANG", "GARB", "GARY", "GASH", "GATE", "GAUL", +"GAUR", "GAVE", "GAWK", "GEAR", "GELD", "GENE", "GENT", "GERM", +"GETS", "GIBE", "GIFT", "GILD", "GILL", "GILT", "GINA", "GIRD", +"GIRL", "GIST", "GIVE", "GLAD", "GLEE", "GLEN", "GLIB", "GLOB", +"GLOM", "GLOW", "GLUE", "GLUM", "GLUT", "GOAD", "GOAL", "GOAT", +"GOER", "GOES", "GOLD", "GOLF", "GONE", "GONG", "GOOD", "GOOF", +"GORE", "GORY", "GOSH", "GOUT", "GOWN", "GRAB", "GRAD", "GRAY", +"GREG", "GREW", "GREY", "GRID", "GRIM", "GRIN", "GRIT", "GROW", +"GRUB", "GULF", "GULL", "GUNK", "GURU", "GUSH", "GUST", "GWEN", +"GWYN", "HAAG", "HAAS", "HACK", "HAIL", "HAIR", "HALE", "HALF", +"HALL", "HALO", "HALT", "HAND", "HANG", "HANK", "HANS", "HARD", +"HARK", "HARM", "HART", "HASH", "HAST", "HATE", "HATH", "HAUL", +"HAVE", "HAWK", "HAYS", "HEAD", "HEAL", "HEAR", "HEAT", "HEBE", +"HECK", "HEED", "HEEL", "HEFT", "HELD", "HELL", "HELM", "HERB", +"HERD", "HERE", "HERO", "HERS", "HESS", "HEWN", "HICK", "HIDE", +"HIGH", "HIKE", "HILL", "HILT", "HIND", "HINT", "HIRE", "HISS", +"HIVE", "HOBO", "HOCK", "HOFF", "HOLD", "HOLE", "HOLM", "HOLT", +"HOME", "HONE", "HONK", "HOOD", "HOOF", "HOOK", "HOOT", "HORN", +"HOSE", "HOST", "HOUR", "HOVE", "HOWE", "HOWL", "HOYT", "HUCK", +"HUED", "HUFF", "HUGE", "HUGH", "HUGO", "HULK", "HULL", "HUNK", +"HUNT", "HURD", "HURL", "HURT", "HUSH", "HYDE", "HYMN", "IBIS", +"ICON", "IDEA", "IDLE", "IFFY", "INCA", "INCH", "INTO", "IONS", +"IOTA", "IOWA", "IRIS", "IRMA", "IRON", "ISLE", "ITCH", "ITEM", +"IVAN", "JACK", "JADE", "JAIL", "JAKE", "JANE", "JAVA", "JEAN", +"JEFF", "JERK", "JESS", "JEST", "JIBE", "JILL", "JILT", "JIVE", +"JOAN", "JOBS", "JOCK", "JOEL", "JOEY", "JOHN", "JOIN", "JOKE", +"JOLT", "JOVE", "JUDD", "JUDE", "JUDO", "JUDY", "JUJU", "JUKE", +"JULY", "JUNE", "JUNK", "JUNO", "JURY", "JUST", "JUTE", "KAHN", +"KALE", "KANE", "KANT", "KARL", "KATE", "KEEL", "KEEN", "KENO", +"KENT", "KERN", "KERR", "KEYS", "KICK", "KILL", "KIND", "KING", +"KIRK", "KISS", "KITE", "KLAN", "KNEE", "KNEW", "KNIT", "KNOB", +"KNOT", "KNOW", "KOCH", "KONG", "KUDO", "KURD", "KURT", "KYLE", +"LACE", "LACK", "LACY", "LADY", "LAID", "LAIN", "LAIR", "LAKE", +"LAMB", "LAME", "LAND", "LANE", "LANG", "LARD", "LARK", "LASS", +"LAST", "LATE", "LAUD", "LAVA", "LAWN", "LAWS", "LAYS", "LEAD", +"LEAF", "LEAK", "LEAN", "LEAR", "LEEK", "LEER", "LEFT", "LEND", +"LENS", "LENT", "LEON", "LESK", "LESS", "LEST", "LETS", "LIAR", +"LICE", "LICK", "LIED", "LIEN", "LIES", "LIEU", "LIFE", "LIFT", +"LIKE", "LILA", "LILT", "LILY", "LIMA", "LIMB", "LIME", "LIND", +"LINE", "LINK", "LINT", "LION", "LISA", "LIST", "LIVE", "LOAD", +"LOAF", "LOAM", "LOAN", "LOCK", "LOFT", "LOGE", "LOIS", "LOLA", +"LONE", "LONG", "LOOK", "LOON", "LOOT", "LORD", "LORE", "LOSE", +"LOSS", "LOST", "LOUD", "LOVE", "LOWE", "LUCK", "LUCY", "LUGE", +"LUKE", "LULU", "LUND", "LUNG", "LURA", "LURE", "LURK", "LUSH", +"LUST", "LYLE", "LYNN", "LYON", "LYRA", "MACE", "MADE", "MAGI", +"MAID", "MAIL", "MAIN", "MAKE", "MALE", "MALI", "MALL", "MALT", +"MANA", "MANN", "MANY", "MARC", "MARE", "MARK", "MARS", "MART", +"MARY", "MASH", "MASK", "MASS", "MAST", "MATE", "MATH", "MAUL", +"MAYO", "MEAD", "MEAL", "MEAN", "MEAT", "MEEK", "MEET", "MELD", +"MELT", "MEMO", "MEND", "MENU", "MERT", "MESH", "MESS", "MICE", +"MIKE", "MILD", "MILE", "MILK", "MILL", "MILT", "MIMI", "MIND", +"MINE", "MINI", "MINK", "MINT", "MIRE", "MISS", "MIST", "MITE", +"MITT", "MOAN", "MOAT", "MOCK", "MODE", "MOLD", "MOLE", "MOLL", +"MOLT", "MONA", "MONK", "MONT", "MOOD", "MOON", "MOOR", "MOOT", +"MORE", "MORN", "MORT", "MOSS", "MOST", "MOTH", "MOVE", "MUCH", +"MUCK", "MUDD", "MUFF", "MULE", "MULL", "MURK", "MUSH", "MUST", +"MUTE", "MUTT", "MYRA", "MYTH", "NAGY", "NAIL", "NAIR", "NAME", +"NARY", "NASH", "NAVE", "NAVY", "NEAL", "NEAR", "NEAT", "NECK", +"NEED", "NEIL", "NELL", "NEON", "NERO", "NESS", "NEST", "NEWS", +"NEWT", "NIBS", "NICE", "NICK", "NILE", "NINA", "NINE", "NOAH", +"NODE", "NOEL", "NOLL", "NONE", "NOOK", "NOON", "NORM", "NOSE", +"NOTE", "NOUN", "NOVA", "NUDE", "NULL", "NUMB", "OATH", "OBEY", +"OBOE", "ODIN", "OHIO", "OILY", "OINT", "OKAY", "OLAF", "OLDY", +"OLGA", "OLIN", "OMAN", "OMEN", "OMIT", "ONCE", "ONES", "ONLY", +"ONTO", "ONUS", "ORAL", "ORGY", "OSLO", "OTIS", "OTTO", "OUCH", +"OUST", "OUTS", "OVAL", "OVEN", "OVER", "OWLY", "OWNS", "QUAD", +"QUIT", "QUOD", "RACE", "RACK", "RACY", "RAFT", "RAGE", "RAID", +"RAIL", "RAIN", "RAKE", "RANK", "RANT", "RARE", "RASH", "RATE", +"RAVE", "RAYS", "READ", "REAL", "REAM", "REAR", "RECK", "REED", +"REEF", "REEK", "REEL", "REID", "REIN", "RENA", "REND", "RENT", +"REST", "RICE", "RICH", "RICK", "RIDE", "RIFT", "RILL", "RIME", +"RING", "RINK", "RISE", "RISK", "RITE", "ROAD", "ROAM", "ROAR", +"ROBE", "ROCK", "RODE", "ROIL", "ROLL", "ROME", "ROOD", "ROOF", +"ROOK", "ROOM", "ROOT", "ROSA", "ROSE", "ROSS", "ROSY", "ROTH", +"ROUT", "ROVE", "ROWE", "ROWS", "RUBE", "RUBY", "RUDE", "RUDY", +"RUIN", "RULE", "RUNG", "RUNS", "RUNT", "RUSE", "RUSH", "RUSK", +"RUSS", "RUST", "RUTH", "SACK", "SAFE", "SAGE", "SAID", "SAIL", +"SALE", "SALK", "SALT", "SAME", "SAND", "SANE", "SANG", "SANK", +"SARA", "SAUL", "SAVE", "SAYS", "SCAN", "SCAR", "SCAT", "SCOT", +"SEAL", "SEAM", "SEAR", "SEAT", "SEED", "SEEK", "SEEM", "SEEN", +"SEES", "SELF", "SELL", "SEND", "SENT", "SETS", "SEWN", "SHAG", +"SHAM", "SHAW", "SHAY", "SHED", "SHIM", "SHIN", "SHOD", "SHOE", +"SHOT", "SHOW", "SHUN", "SHUT", "SICK", "SIDE", "SIFT", "SIGH", +"SIGN", "SILK", "SILL", "SILO", "SILT", "SINE", "SING", "SINK", +"SIRE", "SITE", "SITS", "SITU", "SKAT", "SKEW", "SKID", "SKIM", +"SKIN", "SKIT", "SLAB", "SLAM", "SLAT", "SLAY", "SLED", "SLEW", +"SLID", "SLIM", "SLIT", "SLOB", "SLOG", "SLOT", "SLOW", "SLUG", +"SLUM", "SLUR", "SMOG", "SMUG", "SNAG", "SNOB", "SNOW", "SNUB", +"SNUG", "SOAK", "SOAR", "SOCK", "SODA", "SOFA", "SOFT", "SOIL", +"SOLD", "SOME", "SONG", "SOON", "SOOT", "SORE", "SORT", "SOUL", +"SOUR", "SOWN", "STAB", "STAG", "STAN", "STAR", "STAY", "STEM", +"STEW", "STIR", "STOW", "STUB", "STUN", "SUCH", "SUDS", "SUIT", +"SULK", "SUMS", "SUNG", "SUNK", "SURE", "SURF", "SWAB", "SWAG", +"SWAM", "SWAN", "SWAT", "SWAY", "SWIM", "SWUM", "TACK", "TACT", +"TAIL", "TAKE", "TALE", "TALK", "TALL", "TANK", "TASK", "TATE", +"TAUT", "TEAL", "TEAM", "TEAR", "TECH", "TEEM", "TEEN", "TEET", +"TELL", "TEND", "TENT", "TERM", "TERN", "TESS", "TEST", "THAN", +"THAT", "THEE", "THEM", "THEN", "THEY", "THIN", "THIS", "THUD", +"THUG", "TICK", "TIDE", "TIDY", "TIED", "TIER", "TILE", "TILL", +"TILT", "TIME", "TINA", "TINE", "TINT", "TINY", "TIRE", "TOAD", +"TOGO", "TOIL", "TOLD", "TOLL", "TONE", "TONG", "TONY", "TOOK", +"TOOL", "TOOT", "TORE", "TORN", "TOTE", "TOUR", "TOUT", "TOWN", +"TRAG", "TRAM", "TRAY", "TREE", "TREK", "TRIG", "TRIM", "TRIO", +"TROD", "TROT", "TROY", "TRUE", "TUBA", "TUBE", "TUCK", "TUFT", +"TUNA", "TUNE", "TUNG", "TURF", "TURN", "TUSK", "TWIG", "TWIN", +"TWIT", "ULAN", "UNIT", "URGE", "USED", "USER", "USES", "UTAH", +"VAIL", "VAIN", "VALE", "VARY", "VASE", "VAST", "VEAL", "VEDA", +"VEIL", "VEIN", "VEND", "VENT", "VERB", "VERY", "VETO", "VICE", +"VIEW", "VINE", "VISE", "VOID", "VOLT", "VOTE", "WACK", "WADE", +"WAGE", "WAIL", "WAIT", "WAKE", "WALE", "WALK", "WALL", "WALT", +"WAND", "WANE", "WANG", "WANT", "WARD", "WARM", "WARN", "WART", +"WASH", "WAST", "WATS", "WATT", "WAVE", "WAVY", "WAYS", "WEAK", +"WEAL", "WEAN", "WEAR", "WEED", "WEEK", "WEIR", "WELD", "WELL", +"WELT", "WENT", "WERE", "WERT", "WEST", "WHAM", "WHAT", "WHEE", +"WHEN", "WHET", "WHOA", "WHOM", "WICK", "WIFE", "WILD", "WILL", +"WIND", "WINE", "WING", "WINK", "WINO", "WIRE", "WISE", "WISH", +"WITH", "WOLF", "WONT", "WOOD", "WOOL", "WORD", "WORE", "WORK", +"WORM", "WORN", "WOVE", "WRIT", "WYNN", "YALE", "YANG", "YANK", +"YARD", "YARN", "YAWL", "YAWN", "YEAH", "YEAR", "YELL", "YOGA", +"YOKE" }; + +const struct e inv_std_dict[2048] = { +{"A", 0}, +{"ABE", 1}, +{"ABED", 571}, +{"ABEL", 572}, +{"ABET", 573}, +{"ABLE", 574}, +{"ABUT", 575}, +{"ACE", 2}, +{"ACHE", 576}, +{"ACID", 577}, +{"ACME", 578}, +{"ACRE", 579}, +{"ACT", 3}, +{"ACTA", 580}, +{"ACTS", 581}, +{"AD", 4}, +{"ADA", 5}, +{"ADAM", 582}, +{"ADD", 6}, +{"ADDS", 583}, +{"ADEN", 584}, +{"AFAR", 585}, +{"AFRO", 586}, +{"AGEE", 587}, +{"AGO", 7}, +{"AHEM", 588}, +{"AHOY", 589}, +{"AID", 8}, +{"AIDA", 590}, +{"AIDE", 591}, +{"AIDS", 592}, +{"AIM", 9}, +{"AIR", 10}, +{"AIRY", 593}, +{"AJAR", 594}, +{"AKIN", 595}, +{"ALAN", 596}, +{"ALEC", 597}, +{"ALGA", 598}, +{"ALIA", 599}, +{"ALL", 11}, +{"ALLY", 600}, +{"ALMA", 601}, +{"ALOE", 602}, +{"ALP", 12}, +{"ALSO", 603}, +{"ALTO", 604}, +{"ALUM", 605}, +{"ALVA", 606}, +{"AM", 13}, +{"AMEN", 607}, +{"AMES", 608}, +{"AMID", 609}, +{"AMMO", 610}, +{"AMOK", 611}, +{"AMOS", 612}, +{"AMRA", 613}, +{"AMY", 14}, +{"AN", 15}, +{"ANA", 16}, +{"AND", 17}, +{"ANDY", 614}, +{"ANEW", 615}, +{"ANN", 18}, +{"ANNA", 616}, +{"ANNE", 617}, +{"ANT", 19}, +{"ANTE", 618}, +{"ANTI", 619}, +{"ANY", 20}, +{"APE", 21}, +{"APS", 22}, +{"APT", 23}, +{"AQUA", 620}, +{"ARAB", 621}, +{"ARC", 24}, +{"ARCH", 622}, +{"ARE", 25}, +{"AREA", 623}, +{"ARGO", 624}, +{"ARID", 625}, +{"ARK", 26}, +{"ARM", 27}, +{"ARMY", 626}, +{"ART", 28}, +{"ARTS", 627}, +{"ARTY", 628}, +{"AS", 29}, +{"ASH", 30}, +{"ASIA", 629}, +{"ASK", 31}, +{"ASKS", 630}, +{"AT", 32}, +{"ATE", 33}, +{"ATOM", 631}, +{"AUG", 34}, +{"AUK", 35}, +{"AUNT", 632}, +{"AURA", 633}, +{"AUTO", 634}, +{"AVE", 36}, +{"AVER", 635}, +{"AVID", 636}, +{"AVIS", 637}, +{"AVON", 638}, +{"AVOW", 639}, +{"AWAY", 640}, +{"AWE", 37}, +{"AWK", 38}, +{"AWL", 39}, +{"AWN", 40}, +{"AWRY", 641}, +{"AX", 41}, +{"AYE", 42}, +{"BABE", 642}, +{"BABY", 643}, +{"BACH", 644}, +{"BACK", 645}, +{"BAD", 43}, +{"BADE", 646}, +{"BAG", 44}, +{"BAH", 45}, +{"BAIL", 647}, +{"BAIT", 648}, +{"BAKE", 649}, +{"BALD", 650}, +{"BALE", 651}, +{"BALI", 652}, +{"BALK", 653}, +{"BALL", 654}, +{"BALM", 655}, +{"BAM", 46}, +{"BAN", 47}, +{"BAND", 656}, +{"BANE", 657}, +{"BANG", 658}, +{"BANK", 659}, +{"BAR", 48}, +{"BARB", 660}, +{"BARD", 661}, +{"BARE", 662}, +{"BARK", 663}, +{"BARN", 664}, +{"BARR", 665}, +{"BASE", 666}, +{"BASH", 667}, +{"BASK", 668}, +{"BASS", 669}, +{"BAT", 49}, +{"BATE", 670}, +{"BATH", 671}, +{"BAWD", 672}, +{"BAWL", 673}, +{"BAY", 50}, +{"BE", 51}, +{"BEAD", 674}, +{"BEAK", 675}, +{"BEAM", 676}, +{"BEAN", 677}, +{"BEAR", 678}, +{"BEAT", 679}, +{"BEAU", 680}, +{"BECK", 681}, +{"BED", 52}, +{"BEE", 53}, +{"BEEF", 682}, +{"BEEN", 683}, +{"BEER", 684}, +{"BEET", 685}, +{"BEG", 54}, +{"BELA", 686}, +{"BELL", 687}, +{"BELT", 688}, +{"BEN", 55}, +{"BEND", 689}, +{"BENT", 690}, +{"BERG", 691}, +{"BERN", 692}, +{"BERT", 693}, +{"BESS", 694}, +{"BEST", 695}, +{"BET", 56}, +{"BETA", 696}, +{"BETH", 697}, +{"BEY", 57}, +{"BHOY", 698}, +{"BIAS", 699}, +{"BIB", 58}, +{"BID", 59}, +{"BIDE", 700}, +{"BIEN", 701}, +{"BIG", 60}, +{"BILE", 702}, +{"BILK", 703}, +{"BILL", 704}, +{"BIN", 61}, +{"BIND", 705}, +{"BING", 706}, +{"BIRD", 707}, +{"BIT", 62}, +{"BITE", 708}, +{"BITS", 709}, +{"BLAB", 710}, +{"BLAT", 711}, +{"BLED", 712}, +{"BLEW", 713}, +{"BLOB", 714}, +{"BLOC", 715}, +{"BLOT", 716}, +{"BLOW", 717}, +{"BLUE", 718}, +{"BLUM", 719}, +{"BLUR", 720}, +{"BOAR", 721}, +{"BOAT", 722}, +{"BOB", 63}, +{"BOCA", 723}, +{"BOCK", 724}, +{"BODE", 725}, +{"BODY", 726}, +{"BOG", 64}, +{"BOGY", 727}, +{"BOHR", 728}, +{"BOIL", 729}, +{"BOLD", 730}, +{"BOLO", 731}, +{"BOLT", 732}, +{"BOMB", 733}, +{"BON", 65}, +{"BONA", 734}, +{"BOND", 735}, +{"BONE", 736}, +{"BONG", 737}, +{"BONN", 738}, +{"BONY", 739}, +{"BOO", 66}, +{"BOOK", 740}, +{"BOOM", 741}, +{"BOON", 742}, +{"BOOT", 743}, +{"BOP", 67}, +{"BORE", 744}, +{"BORG", 745}, +{"BORN", 746}, +{"BOSE", 747}, +{"BOSS", 748}, +{"BOTH", 749}, +{"BOUT", 750}, +{"BOW", 68}, +{"BOWL", 751}, +{"BOY", 69}, +{"BOYD", 752}, +{"BRAD", 753}, +{"BRAE", 754}, +{"BRAG", 755}, +{"BRAN", 756}, +{"BRAY", 757}, +{"BRED", 758}, +{"BREW", 759}, +{"BRIG", 760}, +{"BRIM", 761}, +{"BROW", 762}, +{"BUB", 70}, +{"BUCK", 763}, +{"BUD", 71}, +{"BUDD", 764}, +{"BUFF", 765}, +{"BUG", 72}, +{"BULB", 766}, +{"BULK", 767}, +{"BULL", 768}, +{"BUM", 73}, +{"BUN", 74}, +{"BUNK", 769}, +{"BUNT", 770}, +{"BUOY", 771}, +{"BURG", 772}, +{"BURL", 773}, +{"BURN", 774}, +{"BURR", 775}, +{"BURT", 776}, +{"BURY", 777}, +{"BUS", 75}, +{"BUSH", 778}, +{"BUSS", 779}, +{"BUST", 780}, +{"BUSY", 781}, +{"BUT", 76}, +{"BUY", 77}, +{"BY", 78}, +{"BYE", 79}, +{"BYTE", 782}, +{"CAB", 80}, +{"CADY", 783}, +{"CAFE", 784}, +{"CAGE", 785}, +{"CAIN", 786}, +{"CAKE", 787}, +{"CAL", 81}, +{"CALF", 788}, +{"CALL", 789}, +{"CALM", 790}, +{"CAM", 82}, +{"CAME", 791}, +{"CAN", 83}, +{"CANE", 792}, +{"CANT", 793}, +{"CAP", 84}, +{"CAR", 85}, +{"CARD", 794}, +{"CARE", 795}, +{"CARL", 796}, +{"CARR", 797}, +{"CART", 798}, +{"CASE", 799}, +{"CASH", 800}, +{"CASK", 801}, +{"CAST", 802}, +{"CAT", 86}, +{"CAVE", 803}, +{"CAW", 87}, +{"CEIL", 804}, +{"CELL", 805}, +{"CENT", 806}, +{"CERN", 807}, +{"CHAD", 808}, +{"CHAR", 809}, +{"CHAT", 810}, +{"CHAW", 811}, +{"CHEF", 812}, +{"CHEN", 813}, +{"CHEW", 814}, +{"CHIC", 815}, +{"CHIN", 816}, +{"CHOU", 817}, +{"CHOW", 818}, +{"CHUB", 819}, +{"CHUG", 820}, +{"CHUM", 821}, +{"CITE", 822}, +{"CITY", 823}, +{"CLAD", 824}, +{"CLAM", 825}, +{"CLAN", 826}, +{"CLAW", 827}, +{"CLAY", 828}, +{"CLOD", 829}, +{"CLOG", 830}, +{"CLOT", 831}, +{"CLUB", 832}, +{"CLUE", 833}, +{"COAL", 834}, +{"COAT", 835}, +{"COCA", 836}, +{"COCK", 837}, +{"COCO", 838}, +{"COD", 88}, +{"CODA", 839}, +{"CODE", 840}, +{"CODY", 841}, +{"COED", 842}, +{"COG", 89}, +{"COIL", 843}, +{"COIN", 844}, +{"COKE", 845}, +{"COL", 90}, +{"COLA", 846}, +{"COLD", 847}, +{"COLT", 848}, +{"COMA", 849}, +{"COMB", 850}, +{"COME", 851}, +{"CON", 91}, +{"COO", 92}, +{"COOK", 852}, +{"COOL", 853}, +{"COON", 854}, +{"COOT", 855}, +{"COP", 93}, +{"CORD", 856}, +{"CORE", 857}, +{"CORK", 858}, +{"CORN", 859}, +{"COST", 860}, +{"COT", 94}, +{"COVE", 861}, +{"COW", 95}, +{"COWL", 862}, +{"COY", 96}, +{"CRAB", 863}, +{"CRAG", 864}, +{"CRAM", 865}, +{"CRAY", 866}, +{"CREW", 867}, +{"CRIB", 868}, +{"CROW", 869}, +{"CRUD", 870}, +{"CRY", 97}, +{"CUB", 98}, +{"CUBA", 871}, +{"CUBE", 872}, +{"CUE", 99}, +{"CUFF", 873}, +{"CULL", 874}, +{"CULT", 875}, +{"CUNY", 876}, +{"CUP", 100}, +{"CUR", 101}, +{"CURB", 877}, +{"CURD", 878}, +{"CURE", 879}, +{"CURL", 880}, +{"CURT", 881}, +{"CUT", 102}, +{"CUTS", 882}, +{"DAB", 103}, +{"DAD", 104}, +{"DADE", 883}, +{"DALE", 884}, +{"DAM", 105}, +{"DAME", 885}, +{"DAN", 106}, +{"DANA", 886}, +{"DANE", 887}, +{"DANG", 888}, +{"DANK", 889}, +{"DAR", 107}, +{"DARE", 890}, +{"DARK", 891}, +{"DARN", 892}, +{"DART", 893}, +{"DASH", 894}, +{"DATA", 895}, +{"DATE", 896}, +{"DAVE", 897}, +{"DAVY", 898}, +{"DAWN", 899}, +{"DAY", 108}, +{"DAYS", 900}, +{"DEAD", 901}, +{"DEAF", 902}, +{"DEAL", 903}, +{"DEAN", 904}, +{"DEAR", 905}, +{"DEBT", 906}, +{"DECK", 907}, +{"DEE", 109}, +{"DEED", 908}, +{"DEEM", 909}, +{"DEER", 910}, +{"DEFT", 911}, +{"DEFY", 912}, +{"DEL", 110}, +{"DELL", 913}, +{"DEN", 111}, +{"DENT", 914}, +{"DENY", 915}, +{"DES", 112}, +{"DESK", 916}, +{"DEW", 113}, +{"DIAL", 917}, +{"DICE", 918}, +{"DID", 114}, +{"DIE", 115}, +{"DIED", 919}, +{"DIET", 920}, +{"DIG", 116}, +{"DIME", 921}, +{"DIN", 117}, +{"DINE", 922}, +{"DING", 923}, +{"DINT", 924}, +{"DIP", 118}, +{"DIRE", 925}, +{"DIRT", 926}, +{"DISC", 927}, +{"DISH", 928}, +{"DISK", 929}, +{"DIVE", 930}, +{"DO", 119}, +{"DOCK", 931}, +{"DOE", 120}, +{"DOES", 932}, +{"DOG", 121}, +{"DOLE", 933}, +{"DOLL", 934}, +{"DOLT", 935}, +{"DOME", 936}, +{"DON", 122}, +{"DONE", 937}, +{"DOOM", 938}, +{"DOOR", 939}, +{"DORA", 940}, +{"DOSE", 941}, +{"DOT", 123}, +{"DOTE", 942}, +{"DOUG", 943}, +{"DOUR", 944}, +{"DOVE", 945}, +{"DOW", 124}, +{"DOWN", 946}, +{"DRAB", 947}, +{"DRAG", 948}, +{"DRAM", 949}, +{"DRAW", 950}, +{"DREW", 951}, +{"DRUB", 952}, +{"DRUG", 953}, +{"DRUM", 954}, +{"DRY", 125}, +{"DUAL", 955}, +{"DUB", 126}, +{"DUCK", 956}, +{"DUCT", 957}, +{"DUD", 127}, +{"DUE", 128}, +{"DUEL", 958}, +{"DUET", 959}, +{"DUG", 129}, +{"DUKE", 960}, +{"DULL", 961}, +{"DUMB", 962}, +{"DUN", 130}, +{"DUNE", 963}, +{"DUNK", 964}, +{"DUSK", 965}, +{"DUST", 966}, +{"DUTY", 967}, +{"EACH", 968}, +{"EAR", 131}, +{"EARL", 969}, +{"EARN", 970}, +{"EASE", 971}, +{"EAST", 972}, +{"EASY", 973}, +{"EAT", 132}, +{"EBEN", 974}, +{"ECHO", 975}, +{"ED", 133}, +{"EDDY", 976}, +{"EDEN", 977}, +{"EDGE", 978}, +{"EDGY", 979}, +{"EDIT", 980}, +{"EDNA", 981}, +{"EEL", 134}, +{"EGAN", 982}, +{"EGG", 135}, +{"EGO", 136}, +{"ELAN", 983}, +{"ELBA", 984}, +{"ELI", 137}, +{"ELK", 138}, +{"ELLA", 985}, +{"ELM", 139}, +{"ELSE", 986}, +{"ELY", 140}, +{"EM", 141}, +{"EMIL", 987}, +{"EMIT", 988}, +{"EMMA", 989}, +{"END", 142}, +{"ENDS", 990}, +{"ERIC", 991}, +{"EROS", 992}, +{"EST", 143}, +{"ETC", 144}, +{"EVA", 145}, +{"EVE", 146}, +{"EVEN", 993}, +{"EVER", 994}, +{"EVIL", 995}, +{"EWE", 147}, +{"EYE", 148}, +{"EYED", 996}, +{"FACE", 997}, +{"FACT", 998}, +{"FAD", 149}, +{"FADE", 999}, +{"FAIL", 1000}, +{"FAIN", 1001}, +{"FAIR", 1002}, +{"FAKE", 1003}, +{"FALL", 1004}, +{"FAME", 1005}, +{"FAN", 150}, +{"FANG", 1006}, +{"FAR", 151}, +{"FARM", 1007}, +{"FAST", 1008}, +{"FAT", 152}, +{"FATE", 1009}, +{"FAWN", 1010}, +{"FAY", 153}, +{"FEAR", 1011}, +{"FEAT", 1012}, +{"FED", 154}, +{"FEE", 155}, +{"FEED", 1013}, +{"FEEL", 1014}, +{"FEET", 1015}, +{"FELL", 1016}, +{"FELT", 1017}, +{"FEND", 1018}, +{"FERN", 1019}, +{"FEST", 1020}, +{"FEUD", 1021}, +{"FEW", 156}, +{"FIB", 157}, +{"FIEF", 1022}, +{"FIG", 158}, +{"FIGS", 1023}, +{"FILE", 1024}, +{"FILL", 1025}, +{"FILM", 1026}, +{"FIN", 159}, +{"FIND", 1027}, +{"FINE", 1028}, +{"FINK", 1029}, +{"FIR", 160}, +{"FIRE", 1030}, +{"FIRM", 1031}, +{"FISH", 1032}, +{"FISK", 1033}, +{"FIST", 1034}, +{"FIT", 161}, +{"FITS", 1035}, +{"FIVE", 1036}, +{"FLAG", 1037}, +{"FLAK", 1038}, +{"FLAM", 1039}, +{"FLAT", 1040}, +{"FLAW", 1041}, +{"FLEA", 1042}, +{"FLED", 1043}, +{"FLEW", 1044}, +{"FLIT", 1045}, +{"FLO", 162}, +{"FLOC", 1046}, +{"FLOG", 1047}, +{"FLOW", 1048}, +{"FLUB", 1049}, +{"FLUE", 1050}, +{"FLY", 163}, +{"FOAL", 1051}, +{"FOAM", 1052}, +{"FOE", 164}, +{"FOG", 165}, +{"FOGY", 1053}, +{"FOIL", 1054}, +{"FOLD", 1055}, +{"FOLK", 1056}, +{"FOND", 1057}, +{"FONT", 1058}, +{"FOOD", 1059}, +{"FOOL", 1060}, +{"FOOT", 1061}, +{"FOR", 166}, +{"FORD", 1062}, +{"FORE", 1063}, +{"FORK", 1064}, +{"FORM", 1065}, +{"FORT", 1066}, +{"FOSS", 1067}, +{"FOUL", 1068}, +{"FOUR", 1069}, +{"FOWL", 1070}, +{"FRAU", 1071}, +{"FRAY", 1072}, +{"FRED", 1073}, +{"FREE", 1074}, +{"FRET", 1075}, +{"FREY", 1076}, +{"FROG", 1077}, +{"FROM", 1078}, +{"FRY", 167}, +{"FUEL", 1079}, +{"FULL", 1080}, +{"FUM", 168}, +{"FUME", 1081}, +{"FUN", 169}, +{"FUND", 1082}, +{"FUNK", 1083}, +{"FUR", 170}, +{"FURY", 1084}, +{"FUSE", 1085}, +{"FUSS", 1086}, +{"GAB", 171}, +{"GAD", 172}, +{"GAFF", 1087}, +{"GAG", 173}, +{"GAGE", 1088}, +{"GAIL", 1089}, +{"GAIN", 1090}, +{"GAIT", 1091}, +{"GAL", 174}, +{"GALA", 1092}, +{"GALE", 1093}, +{"GALL", 1094}, +{"GALT", 1095}, +{"GAM", 175}, +{"GAME", 1096}, +{"GANG", 1097}, +{"GAP", 176}, +{"GARB", 1098}, +{"GARY", 1099}, +{"GAS", 177}, +{"GASH", 1100}, +{"GATE", 1101}, +{"GAUL", 1102}, +{"GAUR", 1103}, +{"GAVE", 1104}, +{"GAWK", 1105}, +{"GAY", 178}, +{"GEAR", 1106}, +{"GEE", 179}, +{"GEL", 180}, +{"GELD", 1107}, +{"GEM", 181}, +{"GENE", 1108}, +{"GENT", 1109}, +{"GERM", 1110}, +{"GET", 182}, +{"GETS", 1111}, +{"GIBE", 1112}, +{"GIFT", 1113}, +{"GIG", 183}, +{"GIL", 184}, +{"GILD", 1114}, +{"GILL", 1115}, +{"GILT", 1116}, +{"GIN", 185}, +{"GINA", 1117}, +{"GIRD", 1118}, +{"GIRL", 1119}, +{"GIST", 1120}, +{"GIVE", 1121}, +{"GLAD", 1122}, +{"GLEE", 1123}, +{"GLEN", 1124}, +{"GLIB", 1125}, +{"GLOB", 1126}, +{"GLOM", 1127}, +{"GLOW", 1128}, +{"GLUE", 1129}, +{"GLUM", 1130}, +{"GLUT", 1131}, +{"GO", 186}, +{"GOAD", 1132}, +{"GOAL", 1133}, +{"GOAT", 1134}, +{"GOER", 1135}, +{"GOES", 1136}, +{"GOLD", 1137}, +{"GOLF", 1138}, +{"GONE", 1139}, +{"GONG", 1140}, +{"GOOD", 1141}, +{"GOOF", 1142}, +{"GORE", 1143}, +{"GORY", 1144}, +{"GOSH", 1145}, +{"GOT", 187}, +{"GOUT", 1146}, +{"GOWN", 1147}, +{"GRAB", 1148}, +{"GRAD", 1149}, +{"GRAY", 1150}, +{"GREG", 1151}, +{"GREW", 1152}, +{"GREY", 1153}, +{"GRID", 1154}, +{"GRIM", 1155}, +{"GRIN", 1156}, +{"GRIT", 1157}, +{"GROW", 1158}, +{"GRUB", 1159}, +{"GULF", 1160}, +{"GULL", 1161}, +{"GUM", 188}, +{"GUN", 189}, +{"GUNK", 1162}, +{"GURU", 1163}, +{"GUS", 190}, +{"GUSH", 1164}, +{"GUST", 1165}, +{"GUT", 191}, +{"GUY", 192}, +{"GWEN", 1166}, +{"GWYN", 1167}, +{"GYM", 193}, +{"GYP", 194}, +{"HA", 195}, +{"HAAG", 1168}, +{"HAAS", 1169}, +{"HACK", 1170}, +{"HAD", 196}, +{"HAIL", 1171}, +{"HAIR", 1172}, +{"HAL", 197}, +{"HALE", 1173}, +{"HALF", 1174}, +{"HALL", 1175}, +{"HALO", 1176}, +{"HALT", 1177}, +{"HAM", 198}, +{"HAN", 199}, +{"HAND", 1178}, +{"HANG", 1179}, +{"HANK", 1180}, +{"HANS", 1181}, +{"HAP", 200}, +{"HARD", 1182}, +{"HARK", 1183}, +{"HARM", 1184}, +{"HART", 1185}, +{"HAS", 201}, +{"HASH", 1186}, +{"HAST", 1187}, +{"HAT", 202}, +{"HATE", 1188}, +{"HATH", 1189}, +{"HAUL", 1190}, +{"HAVE", 1191}, +{"HAW", 203}, +{"HAWK", 1192}, +{"HAY", 204}, +{"HAYS", 1193}, +{"HE", 205}, +{"HEAD", 1194}, +{"HEAL", 1195}, +{"HEAR", 1196}, +{"HEAT", 1197}, +{"HEBE", 1198}, +{"HECK", 1199}, +{"HEED", 1200}, +{"HEEL", 1201}, +{"HEFT", 1202}, +{"HELD", 1203}, +{"HELL", 1204}, +{"HELM", 1205}, +{"HEM", 206}, +{"HEN", 207}, +{"HER", 208}, +{"HERB", 1206}, +{"HERD", 1207}, +{"HERE", 1208}, +{"HERO", 1209}, +{"HERS", 1210}, +{"HESS", 1211}, +{"HEW", 209}, +{"HEWN", 1212}, +{"HEY", 210}, +{"HI", 211}, +{"HICK", 1213}, +{"HID", 212}, +{"HIDE", 1214}, +{"HIGH", 1215}, +{"HIKE", 1216}, +{"HILL", 1217}, +{"HILT", 1218}, +{"HIM", 213}, +{"HIND", 1219}, +{"HINT", 1220}, +{"HIP", 214}, +{"HIRE", 1221}, +{"HIS", 215}, +{"HISS", 1222}, +{"HIT", 216}, +{"HIVE", 1223}, +{"HO", 217}, +{"HOB", 218}, +{"HOBO", 1224}, +{"HOC", 219}, +{"HOCK", 1225}, +{"HOE", 220}, +{"HOFF", 1226}, +{"HOG", 221}, +{"HOLD", 1227}, +{"HOLE", 1228}, +{"HOLM", 1229}, +{"HOLT", 1230}, +{"HOME", 1231}, +{"HONE", 1232}, +{"HONK", 1233}, +{"HOOD", 1234}, +{"HOOF", 1235}, +{"HOOK", 1236}, +{"HOOT", 1237}, +{"HOP", 222}, +{"HORN", 1238}, +{"HOSE", 1239}, +{"HOST", 1240}, +{"HOT", 223}, +{"HOUR", 1241}, +{"HOVE", 1242}, +{"HOW", 224}, +{"HOWE", 1243}, +{"HOWL", 1244}, +{"HOYT", 1245}, +{"HUB", 225}, +{"HUCK", 1246}, +{"HUE", 226}, +{"HUED", 1247}, +{"HUFF", 1248}, +{"HUG", 227}, +{"HUGE", 1249}, +{"HUGH", 1250}, +{"HUGO", 1251}, +{"HUH", 228}, +{"HULK", 1252}, +{"HULL", 1253}, +{"HUM", 229}, +{"HUNK", 1254}, +{"HUNT", 1255}, +{"HURD", 1256}, +{"HURL", 1257}, +{"HURT", 1258}, +{"HUSH", 1259}, +{"HUT", 230}, +{"HYDE", 1260}, +{"HYMN", 1261}, +{"I", 231}, +{"IBIS", 1262}, +{"ICON", 1263}, +{"ICY", 232}, +{"IDA", 233}, +{"IDEA", 1264}, +{"IDLE", 1265}, +{"IF", 234}, +{"IFFY", 1266}, +{"IKE", 235}, +{"ILL", 236}, +{"INCA", 1267}, +{"INCH", 1268}, +{"INK", 237}, +{"INN", 238}, +{"INTO", 1269}, +{"IO", 239}, +{"ION", 240}, +{"IONS", 1270}, +{"IOTA", 1271}, +{"IOWA", 1272}, +{"IQ", 241}, +{"IRA", 242}, +{"IRE", 243}, +{"IRIS", 1273}, +{"IRK", 244}, +{"IRMA", 1274}, +{"IRON", 1275}, +{"IS", 245}, +{"ISLE", 1276}, +{"IT", 246}, +{"ITCH", 1277}, +{"ITEM", 1278}, +{"ITS", 247}, +{"IVAN", 1279}, +{"IVY", 248}, +{"JAB", 249}, +{"JACK", 1280}, +{"JADE", 1281}, +{"JAG", 250}, +{"JAIL", 1282}, +{"JAKE", 1283}, +{"JAM", 251}, +{"JAN", 252}, +{"JANE", 1284}, +{"JAR", 253}, +{"JAVA", 1285}, +{"JAW", 254}, +{"JAY", 255}, +{"JEAN", 1286}, +{"JEFF", 1287}, +{"JERK", 1288}, +{"JESS", 1289}, +{"JEST", 1290}, +{"JET", 256}, +{"JIBE", 1291}, +{"JIG", 257}, +{"JILL", 1292}, +{"JILT", 1293}, +{"JIM", 258}, +{"JIVE", 1294}, +{"JO", 259}, +{"JOAN", 1295}, +{"JOB", 260}, +{"JOBS", 1296}, +{"JOCK", 1297}, +{"JOE", 261}, +{"JOEL", 1298}, +{"JOEY", 1299}, +{"JOG", 262}, +{"JOHN", 1300}, +{"JOIN", 1301}, +{"JOKE", 1302}, +{"JOLT", 1303}, +{"JOT", 263}, +{"JOVE", 1304}, +{"JOY", 264}, +{"JUDD", 1305}, +{"JUDE", 1306}, +{"JUDO", 1307}, +{"JUDY", 1308}, +{"JUG", 265}, +{"JUJU", 1309}, +{"JUKE", 1310}, +{"JULY", 1311}, +{"JUNE", 1312}, +{"JUNK", 1313}, +{"JUNO", 1314}, +{"JURY", 1315}, +{"JUST", 1316}, +{"JUT", 266}, +{"JUTE", 1317}, +{"KAHN", 1318}, +{"KALE", 1319}, +{"KANE", 1320}, +{"KANT", 1321}, +{"KARL", 1322}, +{"KATE", 1323}, +{"KAY", 267}, +{"KEEL", 1324}, +{"KEEN", 1325}, +{"KEG", 268}, +{"KEN", 269}, +{"KENO", 1326}, +{"KENT", 1327}, +{"KERN", 1328}, +{"KERR", 1329}, +{"KEY", 270}, +{"KEYS", 1330}, +{"KICK", 1331}, +{"KID", 271}, +{"KILL", 1332}, +{"KIM", 272}, +{"KIN", 273}, +{"KIND", 1333}, +{"KING", 1334}, +{"KIRK", 1335}, +{"KISS", 1336}, +{"KIT", 274}, +{"KITE", 1337}, +{"KLAN", 1338}, +{"KNEE", 1339}, +{"KNEW", 1340}, +{"KNIT", 1341}, +{"KNOB", 1342}, +{"KNOT", 1343}, +{"KNOW", 1344}, +{"KOCH", 1345}, +{"KONG", 1346}, +{"KUDO", 1347}, +{"KURD", 1348}, +{"KURT", 1349}, +{"KYLE", 1350}, +{"LA", 275}, +{"LAB", 276}, +{"LAC", 277}, +{"LACE", 1351}, +{"LACK", 1352}, +{"LACY", 1353}, +{"LAD", 278}, +{"LADY", 1354}, +{"LAG", 279}, +{"LAID", 1355}, +{"LAIN", 1356}, +{"LAIR", 1357}, +{"LAKE", 1358}, +{"LAM", 280}, +{"LAMB", 1359}, +{"LAME", 1360}, +{"LAND", 1361}, +{"LANE", 1362}, +{"LANG", 1363}, +{"LAP", 281}, +{"LARD", 1364}, +{"LARK", 1365}, +{"LASS", 1366}, +{"LAST", 1367}, +{"LATE", 1368}, +{"LAUD", 1369}, +{"LAVA", 1370}, +{"LAW", 282}, +{"LAWN", 1371}, +{"LAWS", 1372}, +{"LAY", 283}, +{"LAYS", 1373}, +{"LEA", 284}, +{"LEAD", 1374}, +{"LEAF", 1375}, +{"LEAK", 1376}, +{"LEAN", 1377}, +{"LEAR", 1378}, +{"LED", 285}, +{"LEE", 286}, +{"LEEK", 1379}, +{"LEER", 1380}, +{"LEFT", 1381}, +{"LEG", 287}, +{"LEN", 288}, +{"LEND", 1382}, +{"LENS", 1383}, +{"LENT", 1384}, +{"LEO", 289}, +{"LEON", 1385}, +{"LESK", 1386}, +{"LESS", 1387}, +{"LEST", 1388}, +{"LET", 290}, +{"LETS", 1389}, +{"LEW", 291}, +{"LIAR", 1390}, +{"LICE", 1391}, +{"LICK", 1392}, +{"LID", 292}, +{"LIE", 293}, +{"LIED", 1393}, +{"LIEN", 1394}, +{"LIES", 1395}, +{"LIEU", 1396}, +{"LIFE", 1397}, +{"LIFT", 1398}, +{"LIKE", 1399}, +{"LILA", 1400}, +{"LILT", 1401}, +{"LILY", 1402}, +{"LIMA", 1403}, +{"LIMB", 1404}, +{"LIME", 1405}, +{"LIN", 294}, +{"LIND", 1406}, +{"LINE", 1407}, +{"LINK", 1408}, +{"LINT", 1409}, +{"LION", 1410}, +{"LIP", 295}, +{"LISA", 1411}, +{"LIST", 1412}, +{"LIT", 296}, +{"LIVE", 1413}, +{"LO", 297}, +{"LOAD", 1414}, +{"LOAF", 1415}, +{"LOAM", 1416}, +{"LOAN", 1417}, +{"LOB", 298}, +{"LOCK", 1418}, +{"LOFT", 1419}, +{"LOG", 299}, +{"LOGE", 1420}, +{"LOIS", 1421}, +{"LOLA", 1422}, +{"LONE", 1423}, +{"LONG", 1424}, +{"LOOK", 1425}, +{"LOON", 1426}, +{"LOOT", 1427}, +{"LOP", 300}, +{"LORD", 1428}, +{"LORE", 1429}, +{"LOS", 301}, +{"LOSE", 1430}, +{"LOSS", 1431}, +{"LOST", 1432}, +{"LOT", 302}, +{"LOU", 303}, +{"LOUD", 1433}, +{"LOVE", 1434}, +{"LOW", 304}, +{"LOWE", 1435}, +{"LOY", 305}, +{"LUCK", 1436}, +{"LUCY", 1437}, +{"LUG", 306}, +{"LUGE", 1438}, +{"LUKE", 1439}, +{"LULU", 1440}, +{"LUND", 1441}, +{"LUNG", 1442}, +{"LURA", 1443}, +{"LURE", 1444}, +{"LURK", 1445}, +{"LUSH", 1446}, +{"LUST", 1447}, +{"LYE", 307}, +{"LYLE", 1448}, +{"LYNN", 1449}, +{"LYON", 1450}, +{"LYRA", 1451}, +{"MA", 308}, +{"MAC", 309}, +{"MACE", 1452}, +{"MAD", 310}, +{"MADE", 1453}, +{"MAE", 311}, +{"MAGI", 1454}, +{"MAID", 1455}, +{"MAIL", 1456}, +{"MAIN", 1457}, +{"MAKE", 1458}, +{"MALE", 1459}, +{"MALI", 1460}, +{"MALL", 1461}, +{"MALT", 1462}, +{"MAN", 312}, +{"MANA", 1463}, +{"MANN", 1464}, +{"MANY", 1465}, +{"MAO", 313}, +{"MAP", 314}, +{"MARC", 1466}, +{"MARE", 1467}, +{"MARK", 1468}, +{"MARS", 1469}, +{"MART", 1470}, +{"MARY", 1471}, +{"MASH", 1472}, +{"MASK", 1473}, +{"MASS", 1474}, +{"MAST", 1475}, +{"MAT", 315}, +{"MATE", 1476}, +{"MATH", 1477}, +{"MAUL", 1478}, +{"MAW", 316}, +{"MAY", 317}, +{"MAYO", 1479}, +{"ME", 318}, +{"MEAD", 1480}, +{"MEAL", 1481}, +{"MEAN", 1482}, +{"MEAT", 1483}, +{"MEEK", 1484}, +{"MEET", 1485}, +{"MEG", 319}, +{"MEL", 320}, +{"MELD", 1486}, +{"MELT", 1487}, +{"MEMO", 1488}, +{"MEN", 321}, +{"MEND", 1489}, +{"MENU", 1490}, +{"MERT", 1491}, +{"MESH", 1492}, +{"MESS", 1493}, +{"MET", 322}, +{"MEW", 323}, +{"MICE", 1494}, +{"MID", 324}, +{"MIKE", 1495}, +{"MILD", 1496}, +{"MILE", 1497}, +{"MILK", 1498}, +{"MILL", 1499}, +{"MILT", 1500}, +{"MIMI", 1501}, +{"MIN", 325}, +{"MIND", 1502}, +{"MINE", 1503}, +{"MINI", 1504}, +{"MINK", 1505}, +{"MINT", 1506}, +{"MIRE", 1507}, +{"MISS", 1508}, +{"MIST", 1509}, +{"MIT", 326}, +{"MITE", 1510}, +{"MITT", 1511}, +{"MOAN", 1512}, +{"MOAT", 1513}, +{"MOB", 327}, +{"MOCK", 1514}, +{"MOD", 328}, +{"MODE", 1515}, +{"MOE", 329}, +{"MOLD", 1516}, +{"MOLE", 1517}, +{"MOLL", 1518}, +{"MOLT", 1519}, +{"MONA", 1520}, +{"MONK", 1521}, +{"MONT", 1522}, +{"MOO", 330}, +{"MOOD", 1523}, +{"MOON", 1524}, +{"MOOR", 1525}, +{"MOOT", 1526}, +{"MOP", 331}, +{"MORE", 1527}, +{"MORN", 1528}, +{"MORT", 1529}, +{"MOS", 332}, +{"MOSS", 1530}, +{"MOST", 1531}, +{"MOT", 333}, +{"MOTH", 1532}, +{"MOVE", 1533}, +{"MOW", 334}, +{"MUCH", 1534}, +{"MUCK", 1535}, +{"MUD", 335}, +{"MUDD", 1536}, +{"MUFF", 1537}, +{"MUG", 336}, +{"MULE", 1538}, +{"MULL", 1539}, +{"MUM", 337}, +{"MURK", 1540}, +{"MUSH", 1541}, +{"MUST", 1542}, +{"MUTE", 1543}, +{"MUTT", 1544}, +{"MY", 338}, +{"MYRA", 1545}, +{"MYTH", 1546}, +{"NAB", 339}, +{"NAG", 340}, +{"NAGY", 1547}, +{"NAIL", 1548}, +{"NAIR", 1549}, +{"NAME", 1550}, +{"NAN", 341}, +{"NAP", 342}, +{"NARY", 1551}, +{"NASH", 1552}, +{"NAT", 343}, +{"NAVE", 1553}, +{"NAVY", 1554}, +{"NAY", 344}, +{"NE", 345}, +{"NEAL", 1555}, +{"NEAR", 1556}, +{"NEAT", 1557}, +{"NECK", 1558}, +{"NED", 346}, +{"NEE", 347}, +{"NEED", 1559}, +{"NEIL", 1560}, +{"NELL", 1561}, +{"NEON", 1562}, +{"NERO", 1563}, +{"NESS", 1564}, +{"NEST", 1565}, +{"NET", 348}, +{"NEW", 349}, +{"NEWS", 1566}, +{"NEWT", 1567}, +{"NIB", 350}, +{"NIBS", 1568}, +{"NICE", 1569}, +{"NICK", 1570}, +{"NIL", 351}, +{"NILE", 1571}, +{"NINA", 1572}, +{"NINE", 1573}, +{"NIP", 352}, +{"NIT", 353}, +{"NO", 354}, +{"NOAH", 1574}, +{"NOB", 355}, +{"NOD", 356}, +{"NODE", 1575}, +{"NOEL", 1576}, +{"NOLL", 1577}, +{"NON", 357}, +{"NONE", 1578}, +{"NOOK", 1579}, +{"NOON", 1580}, +{"NOR", 358}, +{"NORM", 1581}, +{"NOSE", 1582}, +{"NOT", 359}, +{"NOTE", 1583}, +{"NOUN", 1584}, +{"NOV", 360}, +{"NOVA", 1585}, +{"NOW", 361}, +{"NU", 362}, +{"NUDE", 1586}, +{"NULL", 1587}, +{"NUMB", 1588}, +{"NUN", 363}, +{"NUT", 364}, +{"O", 365}, +{"OAF", 366}, +{"OAK", 367}, +{"OAR", 368}, +{"OAT", 369}, +{"OATH", 1589}, +{"OBEY", 1590}, +{"OBOE", 1591}, +{"ODD", 370}, +{"ODE", 371}, +{"ODIN", 1592}, +{"OF", 372}, +{"OFF", 373}, +{"OFT", 374}, +{"OH", 375}, +{"OHIO", 1593}, +{"OIL", 376}, +{"OILY", 1594}, +{"OINT", 1595}, +{"OK", 377}, +{"OKAY", 1596}, +{"OLAF", 1597}, +{"OLD", 378}, +{"OLDY", 1598}, +{"OLGA", 1599}, +{"OLIN", 1600}, +{"OMAN", 1601}, +{"OMEN", 1602}, +{"OMIT", 1603}, +{"ON", 379}, +{"ONCE", 1604}, +{"ONE", 380}, +{"ONES", 1605}, +{"ONLY", 1606}, +{"ONTO", 1607}, +{"ONUS", 1608}, +{"OR", 381}, +{"ORAL", 1609}, +{"ORB", 382}, +{"ORE", 383}, +{"ORGY", 1610}, +{"ORR", 384}, +{"OS", 385}, +{"OSLO", 1611}, +{"OTIS", 1612}, +{"OTT", 386}, +{"OTTO", 1613}, +{"OUCH", 1614}, +{"OUR", 387}, +{"OUST", 1615}, +{"OUT", 388}, +{"OUTS", 1616}, +{"OVA", 389}, +{"OVAL", 1617}, +{"OVEN", 1618}, +{"OVER", 1619}, +{"OW", 390}, +{"OWE", 391}, +{"OWL", 392}, +{"OWLY", 1620}, +{"OWN", 393}, +{"OWNS", 1621}, +{"OX", 394}, +{"PA", 395}, +{"PAD", 396}, +{"PAL", 397}, +{"PAM", 398}, +{"PAN", 399}, +{"PAP", 400}, +{"PAR", 401}, +{"PAT", 402}, +{"PAW", 403}, +{"PAY", 404}, +{"PEA", 405}, +{"PEG", 406}, +{"PEN", 407}, +{"PEP", 408}, +{"PER", 409}, +{"PET", 410}, +{"PEW", 411}, +{"PHI", 412}, +{"PI", 413}, +{"PIE", 414}, +{"PIN", 415}, +{"PIT", 416}, +{"PLY", 417}, +{"PO", 418}, +{"POD", 419}, +{"POE", 420}, +{"POP", 421}, +{"POT", 422}, +{"POW", 423}, +{"PRO", 424}, +{"PRY", 425}, +{"PUB", 426}, +{"PUG", 427}, +{"PUN", 428}, +{"PUP", 429}, +{"PUT", 430}, +{"QUAD", 1622}, +{"QUIT", 1623}, +{"QUO", 431}, +{"QUOD", 1624}, +{"RACE", 1625}, +{"RACK", 1626}, +{"RACY", 1627}, +{"RAFT", 1628}, +{"RAG", 432}, +{"RAGE", 1629}, +{"RAID", 1630}, +{"RAIL", 1631}, +{"RAIN", 1632}, +{"RAKE", 1633}, +{"RAM", 433}, +{"RAN", 434}, +{"RANK", 1634}, +{"RANT", 1635}, +{"RAP", 435}, +{"RARE", 1636}, +{"RASH", 1637}, +{"RAT", 436}, +{"RATE", 1638}, +{"RAVE", 1639}, +{"RAW", 437}, +{"RAY", 438}, +{"RAYS", 1640}, +{"READ", 1641}, +{"REAL", 1642}, +{"REAM", 1643}, +{"REAR", 1644}, +{"REB", 439}, +{"RECK", 1645}, +{"RED", 440}, +{"REED", 1646}, +{"REEF", 1647}, +{"REEK", 1648}, +{"REEL", 1649}, +{"REID", 1650}, +{"REIN", 1651}, +{"RENA", 1652}, +{"REND", 1653}, +{"RENT", 1654}, +{"REP", 441}, +{"REST", 1655}, +{"RET", 442}, +{"RIB", 443}, +{"RICE", 1656}, +{"RICH", 1657}, +{"RICK", 1658}, +{"RID", 444}, +{"RIDE", 1659}, +{"RIFT", 1660}, +{"RIG", 445}, +{"RILL", 1661}, +{"RIM", 446}, +{"RIME", 1662}, +{"RING", 1663}, +{"RINK", 1664}, +{"RIO", 447}, +{"RIP", 448}, +{"RISE", 1665}, +{"RISK", 1666}, +{"RITE", 1667}, +{"ROAD", 1668}, +{"ROAM", 1669}, +{"ROAR", 1670}, +{"ROB", 449}, +{"ROBE", 1671}, +{"ROCK", 1672}, +{"ROD", 450}, +{"RODE", 1673}, +{"ROE", 451}, +{"ROIL", 1674}, +{"ROLL", 1675}, +{"ROME", 1676}, +{"RON", 452}, +{"ROOD", 1677}, +{"ROOF", 1678}, +{"ROOK", 1679}, +{"ROOM", 1680}, +{"ROOT", 1681}, +{"ROSA", 1682}, +{"ROSE", 1683}, +{"ROSS", 1684}, +{"ROSY", 1685}, +{"ROT", 453}, +{"ROTH", 1686}, +{"ROUT", 1687}, +{"ROVE", 1688}, +{"ROW", 454}, +{"ROWE", 1689}, +{"ROWS", 1690}, +{"ROY", 455}, +{"RUB", 456}, +{"RUBE", 1691}, +{"RUBY", 1692}, +{"RUDE", 1693}, +{"RUDY", 1694}, +{"RUE", 457}, +{"RUG", 458}, +{"RUIN", 1695}, +{"RULE", 1696}, +{"RUM", 459}, +{"RUN", 460}, +{"RUNG", 1697}, +{"RUNS", 1698}, +{"RUNT", 1699}, +{"RUSE", 1700}, +{"RUSH", 1701}, +{"RUSK", 1702}, +{"RUSS", 1703}, +{"RUST", 1704}, +{"RUTH", 1705}, +{"RYE", 461}, +{"SAC", 462}, +{"SACK", 1706}, +{"SAD", 463}, +{"SAFE", 1707}, +{"SAG", 464}, +{"SAGE", 1708}, +{"SAID", 1709}, +{"SAIL", 1710}, +{"SAL", 465}, +{"SALE", 1711}, +{"SALK", 1712}, +{"SALT", 1713}, +{"SAM", 466}, +{"SAME", 1714}, +{"SAN", 467}, +{"SAND", 1715}, +{"SANE", 1716}, +{"SANG", 1717}, +{"SANK", 1718}, +{"SAP", 468}, +{"SARA", 1719}, +{"SAT", 469}, +{"SAUL", 1720}, +{"SAVE", 1721}, +{"SAW", 470}, +{"SAY", 471}, +{"SAYS", 1722}, +{"SCAN", 1723}, +{"SCAR", 1724}, +{"SCAT", 1725}, +{"SCOT", 1726}, +{"SEA", 472}, +{"SEAL", 1727}, +{"SEAM", 1728}, +{"SEAR", 1729}, +{"SEAT", 1730}, +{"SEC", 473}, +{"SEE", 474}, +{"SEED", 1731}, +{"SEEK", 1732}, +{"SEEM", 1733}, +{"SEEN", 1734}, +{"SEES", 1735}, +{"SELF", 1736}, +{"SELL", 1737}, +{"SEN", 475}, +{"SEND", 1738}, +{"SENT", 1739}, +{"SET", 476}, +{"SETS", 1740}, +{"SEW", 477}, +{"SEWN", 1741}, +{"SHAG", 1742}, +{"SHAM", 1743}, +{"SHAW", 1744}, +{"SHAY", 1745}, +{"SHE", 478}, +{"SHED", 1746}, +{"SHIM", 1747}, +{"SHIN", 1748}, +{"SHOD", 1749}, +{"SHOE", 1750}, +{"SHOT", 1751}, +{"SHOW", 1752}, +{"SHUN", 1753}, +{"SHUT", 1754}, +{"SHY", 479}, +{"SICK", 1755}, +{"SIDE", 1756}, +{"SIFT", 1757}, +{"SIGH", 1758}, +{"SIGN", 1759}, +{"SILK", 1760}, +{"SILL", 1761}, +{"SILO", 1762}, +{"SILT", 1763}, +{"SIN", 480}, +{"SINE", 1764}, +{"SING", 1765}, +{"SINK", 1766}, +{"SIP", 481}, +{"SIR", 482}, +{"SIRE", 1767}, +{"SIS", 483}, +{"SIT", 484}, +{"SITE", 1768}, +{"SITS", 1769}, +{"SITU", 1770}, +{"SKAT", 1771}, +{"SKEW", 1772}, +{"SKI", 485}, +{"SKID", 1773}, +{"SKIM", 1774}, +{"SKIN", 1775}, +{"SKIT", 1776}, +{"SKY", 486}, +{"SLAB", 1777}, +{"SLAM", 1778}, +{"SLAT", 1779}, +{"SLAY", 1780}, +{"SLED", 1781}, +{"SLEW", 1782}, +{"SLID", 1783}, +{"SLIM", 1784}, +{"SLIT", 1785}, +{"SLOB", 1786}, +{"SLOG", 1787}, +{"SLOT", 1788}, +{"SLOW", 1789}, +{"SLUG", 1790}, +{"SLUM", 1791}, +{"SLUR", 1792}, +{"SLY", 487}, +{"SMOG", 1793}, +{"SMUG", 1794}, +{"SNAG", 1795}, +{"SNOB", 1796}, +{"SNOW", 1797}, +{"SNUB", 1798}, +{"SNUG", 1799}, +{"SO", 488}, +{"SOAK", 1800}, +{"SOAR", 1801}, +{"SOB", 489}, +{"SOCK", 1802}, +{"SOD", 490}, +{"SODA", 1803}, +{"SOFA", 1804}, +{"SOFT", 1805}, +{"SOIL", 1806}, +{"SOLD", 1807}, +{"SOME", 1808}, +{"SON", 491}, +{"SONG", 1809}, +{"SOON", 1810}, +{"SOOT", 1811}, +{"SOP", 492}, +{"SORE", 1812}, +{"SORT", 1813}, +{"SOUL", 1814}, +{"SOUR", 1815}, +{"SOW", 493}, +{"SOWN", 1816}, +{"SOY", 494}, +{"SPA", 495}, +{"SPY", 496}, +{"STAB", 1817}, +{"STAG", 1818}, +{"STAN", 1819}, +{"STAR", 1820}, +{"STAY", 1821}, +{"STEM", 1822}, +{"STEW", 1823}, +{"STIR", 1824}, +{"STOW", 1825}, +{"STUB", 1826}, +{"STUN", 1827}, +{"SUB", 497}, +{"SUCH", 1828}, +{"SUD", 498}, +{"SUDS", 1829}, +{"SUE", 499}, +{"SUIT", 1830}, +{"SULK", 1831}, +{"SUM", 500}, +{"SUMS", 1832}, +{"SUN", 501}, +{"SUNG", 1833}, +{"SUNK", 1834}, +{"SUP", 502}, +{"SURE", 1835}, +{"SURF", 1836}, +{"SWAB", 1837}, +{"SWAG", 1838}, +{"SWAM", 1839}, +{"SWAN", 1840}, +{"SWAT", 1841}, +{"SWAY", 1842}, +{"SWIM", 1843}, +{"SWUM", 1844}, +{"TAB", 503}, +{"TACK", 1845}, +{"TACT", 1846}, +{"TAD", 504}, +{"TAG", 505}, +{"TAIL", 1847}, +{"TAKE", 1848}, +{"TALE", 1849}, +{"TALK", 1850}, +{"TALL", 1851}, +{"TAN", 506}, +{"TANK", 1852}, +{"TAP", 507}, +{"TAR", 508}, +{"TASK", 1853}, +{"TATE", 1854}, +{"TAUT", 1855}, +{"TEA", 509}, +{"TEAL", 1856}, +{"TEAM", 1857}, +{"TEAR", 1858}, +{"TECH", 1859}, +{"TED", 510}, +{"TEE", 511}, +{"TEEM", 1860}, +{"TEEN", 1861}, +{"TEET", 1862}, +{"TELL", 1863}, +{"TEN", 512}, +{"TEND", 1864}, +{"TENT", 1865}, +{"TERM", 1866}, +{"TERN", 1867}, +{"TESS", 1868}, +{"TEST", 1869}, +{"THAN", 1870}, +{"THAT", 1871}, +{"THE", 513}, +{"THEE", 1872}, +{"THEM", 1873}, +{"THEN", 1874}, +{"THEY", 1875}, +{"THIN", 1876}, +{"THIS", 1877}, +{"THUD", 1878}, +{"THUG", 1879}, +{"THY", 514}, +{"TIC", 515}, +{"TICK", 1880}, +{"TIDE", 1881}, +{"TIDY", 1882}, +{"TIE", 516}, +{"TIED", 1883}, +{"TIER", 1884}, +{"TILE", 1885}, +{"TILL", 1886}, +{"TILT", 1887}, +{"TIM", 517}, +{"TIME", 1888}, +{"TIN", 518}, +{"TINA", 1889}, +{"TINE", 1890}, +{"TINT", 1891}, +{"TINY", 1892}, +{"TIP", 519}, +{"TIRE", 1893}, +{"TO", 520}, +{"TOAD", 1894}, +{"TOE", 521}, +{"TOG", 522}, +{"TOGO", 1895}, +{"TOIL", 1896}, +{"TOLD", 1897}, +{"TOLL", 1898}, +{"TOM", 523}, +{"TON", 524}, +{"TONE", 1899}, +{"TONG", 1900}, +{"TONY", 1901}, +{"TOO", 525}, +{"TOOK", 1902}, +{"TOOL", 1903}, +{"TOOT", 1904}, +{"TOP", 526}, +{"TORE", 1905}, +{"TORN", 1906}, +{"TOTE", 1907}, +{"TOUR", 1908}, +{"TOUT", 1909}, +{"TOW", 527}, +{"TOWN", 1910}, +{"TOY", 528}, +{"TRAG", 1911}, +{"TRAM", 1912}, +{"TRAY", 1913}, +{"TREE", 1914}, +{"TREK", 1915}, +{"TRIG", 1916}, +{"TRIM", 1917}, +{"TRIO", 1918}, +{"TROD", 1919}, +{"TROT", 1920}, +{"TROY", 1921}, +{"TRUE", 1922}, +{"TRY", 529}, +{"TUB", 530}, +{"TUBA", 1923}, +{"TUBE", 1924}, +{"TUCK", 1925}, +{"TUFT", 1926}, +{"TUG", 531}, +{"TUM", 532}, +{"TUN", 533}, +{"TUNA", 1927}, +{"TUNE", 1928}, +{"TUNG", 1929}, +{"TURF", 1930}, +{"TURN", 1931}, +{"TUSK", 1932}, +{"TWIG", 1933}, +{"TWIN", 1934}, +{"TWIT", 1935}, +{"TWO", 534}, +{"ULAN", 1936}, +{"UN", 535}, +{"UNIT", 1937}, +{"UP", 536}, +{"URGE", 1938}, +{"US", 537}, +{"USE", 538}, +{"USED", 1939}, +{"USER", 1940}, +{"USES", 1941}, +{"UTAH", 1942}, +{"VAIL", 1943}, +{"VAIN", 1944}, +{"VALE", 1945}, +{"VAN", 539}, +{"VARY", 1946}, +{"VASE", 1947}, +{"VAST", 1948}, +{"VAT", 540}, +{"VEAL", 1949}, +{"VEDA", 1950}, +{"VEIL", 1951}, +{"VEIN", 1952}, +{"VEND", 1953}, +{"VENT", 1954}, +{"VERB", 1955}, +{"VERY", 1956}, +{"VET", 541}, +{"VETO", 1957}, +{"VICE", 1958}, +{"VIE", 542}, +{"VIEW", 1959}, +{"VINE", 1960}, +{"VISE", 1961}, +{"VOID", 1962}, +{"VOLT", 1963}, +{"VOTE", 1964}, +{"WACK", 1965}, +{"WAD", 543}, +{"WADE", 1966}, +{"WAG", 544}, +{"WAGE", 1967}, +{"WAIL", 1968}, +{"WAIT", 1969}, +{"WAKE", 1970}, +{"WALE", 1971}, +{"WALK", 1972}, +{"WALL", 1973}, +{"WALT", 1974}, +{"WAND", 1975}, +{"WANE", 1976}, +{"WANG", 1977}, +{"WANT", 1978}, +{"WAR", 545}, +{"WARD", 1979}, +{"WARM", 1980}, +{"WARN", 1981}, +{"WART", 1982}, +{"WAS", 546}, +{"WASH", 1983}, +{"WAST", 1984}, +{"WATS", 1985}, +{"WATT", 1986}, +{"WAVE", 1987}, +{"WAVY", 1988}, +{"WAY", 547}, +{"WAYS", 1989}, +{"WE", 548}, +{"WEAK", 1990}, +{"WEAL", 1991}, +{"WEAN", 1992}, +{"WEAR", 1993}, +{"WEB", 549}, +{"WED", 550}, +{"WEE", 551}, +{"WEED", 1994}, +{"WEEK", 1995}, +{"WEIR", 1996}, +{"WELD", 1997}, +{"WELL", 1998}, +{"WELT", 1999}, +{"WENT", 2000}, +{"WERE", 2001}, +{"WERT", 2002}, +{"WEST", 2003}, +{"WET", 552}, +{"WHAM", 2004}, +{"WHAT", 2005}, +{"WHEE", 2006}, +{"WHEN", 2007}, +{"WHET", 2008}, +{"WHO", 553}, +{"WHOA", 2009}, +{"WHOM", 2010}, +{"WHY", 554}, +{"WICK", 2011}, +{"WIFE", 2012}, +{"WILD", 2013}, +{"WILL", 2014}, +{"WIN", 555}, +{"WIND", 2015}, +{"WINE", 2016}, +{"WING", 2017}, +{"WINK", 2018}, +{"WINO", 2019}, +{"WIRE", 2020}, +{"WISE", 2021}, +{"WISH", 2022}, +{"WIT", 556}, +{"WITH", 2023}, +{"WOK", 557}, +{"WOLF", 2024}, +{"WON", 558}, +{"WONT", 2025}, +{"WOO", 559}, +{"WOOD", 2026}, +{"WOOL", 2027}, +{"WORD", 2028}, +{"WORE", 2029}, +{"WORK", 2030}, +{"WORM", 2031}, +{"WORN", 2032}, +{"WOVE", 2033}, +{"WOW", 560}, +{"WRIT", 2034}, +{"WRY", 561}, +{"WU", 562}, +{"WYNN", 2035}, +{"YALE", 2036}, +{"YAM", 563}, +{"YANG", 2037}, +{"YANK", 2038}, +{"YAP", 564}, +{"YARD", 2039}, +{"YARN", 2040}, +{"YAW", 565}, +{"YAWL", 2041}, +{"YAWN", 2042}, +{"YE", 566}, +{"YEA", 567}, +{"YEAH", 2043}, +{"YEAR", 2044}, +{"YELL", 2045}, +{"YES", 568}, +{"YET", 569}, +{"YOGA", 2046}, +{"YOKE", 2047}, +{"YOU", 570} +}; diff --git a/crypto/heimdal/lib/otp/otp_print.c b/crypto/heimdal/lib/otp/otp_print.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_print.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +RCSID("$Id$"); +#endif + +#include "otp_locl.h" + +extern const char *const std_dict[]; + +unsigned +otp_checksum (OtpKey key) +{ + int i; + unsigned sum = 0; + + for (i = 0; i < OTPKEYSIZE; ++i) + sum += ((key[i] >> 0) & 0x03) + + ((key[i] >> 2) & 0x03) + + ((key[i] >> 4) & 0x03) + + ((key[i] >> 6) & 0x03); + sum &= 0x03; + return sum; +} + +void +otp_print_stddict (OtpKey key, char *str, size_t sz) +{ + unsigned sum; + + sum = otp_checksum (key); + snprintf (str, sz, + "%s %s %s %s %s %s", + std_dict[(key[0] << 3) | (key[1] >> 5)], + std_dict[((key[1] & 0x1F) << 6) | (key[2] >> 2)], + std_dict[((key[2] & 0x03) << 9) | (key[3] << 1) | (key[4] >> 7)], + std_dict[((key[4] & 0x7F) << 4) | (key[5] >> 4)], + std_dict[((key[5] & 0x0F) << 7) | (key[6] >> 1)], + std_dict[((key[6] & 0x01) << 10) | (key[7] << 2) | sum]); +} + +void +otp_print_hex (OtpKey key, char *str, size_t sz) +{ + snprintf (str, sz, + "%02x%02x%02x%02x%02x%02x%02x%02x", + key[0], key[1], key[2], key[3], + key[4], key[5], key[6], key[7]); +} + +void +otp_print_hex_extended (OtpKey key, char *str, size_t sz) +{ + strlcpy (str, OTP_HEXPREFIX, sz); + otp_print_hex (key, + str + strlen(OTP_HEXPREFIX), + sz - strlen(OTP_HEXPREFIX)); +} + +void +otp_print_stddict_extended (OtpKey key, char *str, size_t sz) +{ + strlcpy (str, OTP_WORDPREFIX, sz); + otp_print_stddict (key, + str + strlen(OTP_WORDPREFIX), + sz - strlen(OTP_WORDPREFIX)); +} diff --git a/crypto/heimdal/lib/otp/otp_verify.c b/crypto/heimdal/lib/otp/otp_verify.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otp_verify.c @@ -0,0 +1,78 @@ +/* + * Copyright (c) 1995 - 2000 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +RCSID("$Id$"); +#endif + +#include "otp_locl.h" + +int +otp_verify_user_1 (OtpContext *ctx, const char *passwd) +{ + OtpKey key1, key2; + + if (otp_parse (key1, passwd, ctx->alg)) { + ctx->err = "Syntax error in reply"; + return -1; + } + memcpy (key2, key1, sizeof(key1)); + ctx->alg->next (key2); + if (memcmp (ctx->key, key2, sizeof(key2)) == 0) { + --ctx->n; + memcpy (ctx->key, key1, sizeof(key1)); + return 0; + } else + return -1; +} + +int +otp_verify_user (OtpContext *ctx, const char *passwd) +{ + void *dbm; + int ret; + + if (!ctx->challengep) + return -1; + ret = otp_verify_user_1 (ctx, passwd); + dbm = otp_db_open (); + if (dbm == NULL) { + free(ctx->user); + return -1; + } + otp_put (dbm, ctx); + free(ctx->user); + otp_db_close (dbm); + return ret; +} diff --git a/crypto/heimdal/lib/otp/otptest.c b/crypto/heimdal/lib/otp/otptest.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/otptest.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "config.h" + +#include +#include +#include + +static int +test_one(OtpKey key1, char *name, char *val, + void (*print)(OtpKey,char*, size_t), + OtpAlgorithm *alg) +{ + char buf[256]; + OtpKey key2; + + (*print)(key1, buf, sizeof(buf)); + printf ("%s: %s, ", name, buf); + if (strcmp (buf, val) != 0) { + printf ("failed(*%s* != *%s*)\n", buf, val); + return 1; + } + if (otp_parse (key2, buf, alg)) { + printf ("parse of %s failed\n", name); + return 1; + } + if (memcmp (key1, key2, OTPKEYSIZE) != 0) { + printf ("key1 != key2, "); + } + printf ("success\n"); + return 0; +} + +static int +test (void) +{ + struct test { + char *alg; + char *passphrase; + char *seed; + int count; + char *hex; + char *word; + } tests[] = { + + /* md4 */ + {"md4", "This is a test.", "TeSt", 0, "d1854218ebbb0b51", "ROME MUG FRED SCAN LIVE LACE"}, + {"md4", "This is a test.", "TeSt", 1, "63473ef01cd0b444", "CARD SAD MINI RYE COL KIN"}, + {"md4", "This is a test.", "TeSt", 99, "c5e612776e6c237a", "NOTE OUT IBIS SINK NAVE MODE"}, + {"md4", "AbCdEfGhIjK", "alpha1", 0, "50076f47eb1ade4e", "AWAY SEN ROOK SALT LICE MAP"}, + {"md4", "AbCdEfGhIjK", "alpha1", 1, "65d20d1949b5f7ab", "CHEW GRIM WU HANG BUCK SAID"}, + {"md4", "AbCdEfGhIjK", "alpha1", 99, "d150c82cce6f62d1", "ROIL FREE COG HUNK WAIT COCA"}, + {"md4", "OTP's are good", "correct", 0, "849c79d4f6f55388", "FOOL STEM DONE TOOL BECK NILE"}, + {"md4", "OTP's are good", "correct", 1, "8c0992fb250847b1", "GIST AMOS MOOT AIDS FOOD SEEM"}, + {"md4", "OTP's are good", "correct",99, "3f3bf4b4145fd74b", "TAG SLOW NOV MIN WOOL KENO"}, + + + /* md5 */ + {"md5", "This is a test.", "TeSt", 0, "9e876134d90499dd", "INCH SEA ANNE LONG AHEM TOUR"}, + {"md5", "This is a test.", "TeSt", 1, "7965e05436f5029f", "EASE OIL FUM CURE AWRY AVIS"}, + {"md5", "This is a test.", "TeSt", 99, "50fe1962c4965880", "BAIL TUFT BITS GANG CHEF THY"}, + {"md5", "AbCdEfGhIjK", "alpha1", 0, "87066dd9644bf206", "FULL PEW DOWN ONCE MORT ARC"}, + {"md5", "AbCdEfGhIjK", "alpha1", 1, "7cd34c1040add14b", "FACT HOOF AT FIST SITE KENT"}, + {"md5", "AbCdEfGhIjK", "alpha1", 99, "5aa37a81f212146c", "BODE HOP JAKE STOW JUT RAP"}, + {"md5", "OTP's are good", "correct", 0, "f205753943de4cf9", "ULAN NEW ARMY FUSE SUIT EYED"}, + {"md5", "OTP's are good", "correct", 1, "ddcdac956f234937", "SKIM CULT LOB SLAM POE HOWL"}, + {"md5", "OTP's are good", "correct",99, "b203e28fa525be47", "LONG IVY JULY AJAR BOND LEE"}, + + /* sha */ + {"sha", "This is a test.", "TeSt", 0, "bb9e6ae1979d8ff4", "MILT VARY MAST OK SEES WENT"}, + {"sha", "This is a test.", "TeSt", 1, "63d936639734385b", "CART OTTO HIVE ODE VAT NUT"}, + {"sha", "This is a test.", "TeSt", 99, "87fec7768b73ccf9", "GAFF WAIT SKID GIG SKY EYED"}, + {"sha", "AbCdEfGhIjK", "alpha1", 0, "ad85f658ebe383c9", "LEST OR HEEL SCOT ROB SUIT"}, + {"sha", "AbCdEfGhIjK", "alpha1", 1, "d07ce229b5cf119b", "RITE TAKE GELD COST TUNE RECK"}, + {"sha", "AbCdEfGhIjK", "alpha1", 99, "27bc71035aaf3dc6", "MAY STAR TIN LYON VEDA STAN"}, + {"sha", "OTP's are good", "correct", 0, "d51f3e99bf8e6f0b", "RUST WELT KICK FELL TAIL FRAU"}, + {"sha", "OTP's are good", "correct", 1, "82aeb52d943774e4", "FLIT DOSE ALSO MEW DRUM DEFY"}, + {"sha", "OTP's are good", "correct", 99, "4f296a74fe1567ec", "AURA ALOE HURL WING BERG WAIT"}, + {NULL, NULL, NULL, 0, NULL, NULL} + }; + + struct test *t; + int sum = 0; + + for(t = tests; t->alg; ++t) { + int i; + OtpAlgorithm *alg = otp_find_alg (t->alg); + OtpKey key; + + if (alg == NULL) { + printf ("Could not find alg %s\n", t->alg); + return 1; + } + if(alg->init (key, t->passphrase, t->seed)) + return 1; + for (i = 0; i < t->count; ++i) { + if (alg->next (key)) + return 1; + } + sum += test_one (key, "hexadecimal", t->hex, otp_print_hex, + alg) + + test_one (key, "standard_word", t->word, otp_print_stddict, alg); + } + return sum; +} + +int +main (void) +{ + return test (); +} diff --git a/crypto/heimdal/lib/otp/roken_rename.h b/crypto/heimdal/lib/otp/roken_rename.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/roken_rename.h @@ -0,0 +1,73 @@ +/* + * Copyright (c) 1998 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* $Id$ */ + +#ifndef __roken_rename_h__ +#define __roken_rename_h__ + +#ifndef HAVE_SNPRINTF +#define rk_snprintf _otp_snprintf +#endif +#ifndef HAVE_ASPRINTF +#define rk_asprintf _otp_asprintf +#endif +#ifndef HAVE_ASNPRINTF +#define rk_asnprintf _otp_asnprintf +#endif +#ifndef HAVE_VASPRINTF +#define rk_vasprintf _otp_vasprintf +#endif +#ifndef HAVE_VASNPRINTF +#define rk_vasnprintf _otp_vasnprintf +#endif +#ifndef HAVE_VSNPRINTF +#define rk_vsnprintf _otp_vsnprintf +#endif +#ifndef HAVE_STRCASECMP +#define rk_strcasecmp _otp_strcasecmp +#endif +#ifndef HAVE_STRNCASECMP +#define rk_strncasecmp _otp_strncasecmp +#endif +#ifndef HAVE_STRLWR +#define rk_strlwr _otp_strlwr +#endif +#ifndef HAVE_STRLCAT +#define rk_strlcat _otp_strlcat +#endif +#ifndef HAVE_STRLCPY +#define rk_strlcpy _otp_strlcpy +#endif + +#endif /* __roken_rename_h__ */ diff --git a/crypto/heimdal/lib/otp/version-script.map b/crypto/heimdal/lib/otp/version-script.map new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/otp/version-script.map @@ -0,0 +1,25 @@ +HEIMDAL_OTP_1.0 { + global: + otp_challenge; + otp_checksum; + otp_db_close; + otp_db_open; + otp_delete; + otp_error; + otp_find_alg; + otp_get; + otp_parse; + otp_parse_altdict; + otp_parse_hex; + otp_parse_stddict; + otp_print_hex; + otp_print_hex_extended; + otp_print_stddict; + otp_print_stddict_extended; + otp_put; + otp_simple_get; + otp_verify_user; + otp_verify_user_1; + local: + *; +}; diff --git a/crypto/heimdal/lib/roken/Makefile.am b/crypto/heimdal/lib/roken/Makefile.am --- a/crypto/heimdal/lib/roken/Makefile.am +++ b/crypto/heimdal/lib/roken/Makefile.am @@ -20,14 +20,18 @@ AM_CPPFLAGS += -I$(DBHEADER) endif -noinst_PROGRAMS = snprintf-test resolve-test rkpty +noinst_PROGRAMS = snprintf-test resolve-test rkpty test-detach + +CHECK_LOCAL = snprintf-test resolve-test rkpty make-roken check_PROGRAMS = \ base64-test \ getaddrinfo-test \ getifaddrs-test \ + getxxyyy-test \ hex-test \ test-readenv \ + resolve-test \ parse_bytes-test \ parse_reply-test \ parse_time-test \ @@ -49,6 +53,8 @@ test_readenv_SOURCES = test-readenv.c test-mem.c +test_detach_SOURCES = test-detach.c + rkpty_LDADD = $(LIB_openpty) $(LDADD) parse_time_test_SOURCES = parse_time-test.c test-mem.c @@ -63,6 +69,9 @@ tsearch_test_LDADD = libtest.la $(LDADD) tsearch_test_CFLAGS = -DTEST_TSEARCH +getxxyyy_test_SOURCES = getxxyyy.c +getxxyyy_test_CFLAGS = -DTEST_GETXXYYY + resolve_test_SOURCES = resolve-test.c libroken_la_SOURCES = \ @@ -71,6 +80,7 @@ concat.c \ cloexec.c \ ct.c \ + detach.c \ doxygen.c \ dumpdata.c \ environment.c \ @@ -83,6 +93,7 @@ getarg.c \ getnameinfo_verified.c \ getprogname.c \ + getxxyyy.c \ h_errno.c \ hex.c \ hostent_find_fqdn.c \ @@ -90,6 +101,7 @@ k_getpwnam.c \ k_getpwuid.c \ mini_inetd.c \ + mkdir.c \ net_read.c \ net_write.c \ parse_bytes.c \ @@ -128,7 +140,7 @@ search.hin \ vis.hin -libroken_la_LIBADD = @LTLIBOBJS@ $(LIB_crypt) +libroken_la_LIBADD = @LTLIBOBJS@ $(LIB_crypt) $(LIB_pidfile) $(LTLIBOBJS) $(libroken_la_OBJECTS): roken.h $(XHEADERS) @@ -233,7 +245,23 @@ NTMakefile \ roken.awk roken.h.in \ $(man_MANS) \ - test-mem.h \ + dirent.c \ + dirent.hin \ + dirent-test.c \ + dlfcn.hin \ + dlfcn_w32.c \ + getifaddrs_w32.c \ ndbm_wrap.c \ ndbm_wrap.h \ + rename.c \ + simple_exec_w32.c \ + sleep.c \ + sockstartup_w32.c \ + stdbool.hin \ + stdint.hin \ + syslogc.c \ + syslog.hin \ + test-mem.h \ + test-mini_inetd.c \ + win32_alloc.c \ version-script.map diff --git a/crypto/heimdal/lib/roken/Makefile.in b/crypto/heimdal/lib/roken/Makefile.in --- a/crypto/heimdal/lib/roken/Makefile.in +++ b/crypto/heimdal/lib/roken/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,34 +96,16 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(am__dist_include_HEADERS_DIST) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog chown.c \ - closefrom.c copyhostent.c daemon.c ecalloc.c emalloc.c \ - erealloc.c err.c errx.c estrdup.c fchown.c flock.c fnmatch.c \ - freeaddrinfo.c freehostent.c gai_strerror.c getaddrinfo.c \ - getcap.c getcwd.c getdtablesize.c getegid.c geteuid.c getgid.c \ - gethostname.c getifaddrs.c getipnodebyaddr.c getipnodebyname.c \ - getnameinfo.c getopt.c gettimeofday.c getuid.c getusershell.c \ - glob.c hstrerror.c inet_aton.c inet_ntop.c inet_pton.c \ - initgroups.c innetgr.c install-sh iruserok.c localtime_r.c \ - lstat.c memmove.c missing mkinstalldirs mkstemp.c putenv.c \ - rcmd.c readv.c recvmsg.c sendmsg.c setegid.c setenv.c \ - seteuid.c strcasecmp.c strdup.c strerror.c strftime.c \ - strlcat.c strlcpy.c strlwr.c strncasecmp.c strndup.c strnlen.c \ - strptime.c strsep.c strsep_copy.c strtok_r.c strupr.c swab.c \ - timegm.c tsearch.c unsetenv.c verr.c verrx.c vsyslog.c vwarn.c \ - vwarnx.c warn.c warnx.c writev.c @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map @HAVE_DBHEADER_TRUE@am__append_2 = -I$(DBHEADER) noinst_PROGRAMS = snprintf-test$(EXEEXT) resolve-test$(EXEEXT) \ - rkpty$(EXEEXT) $(am__EXEEXT_1) + rkpty$(EXEEXT) test-detach$(EXEEXT) $(am__EXEEXT_1) check_PROGRAMS = base64-test$(EXEEXT) getaddrinfo-test$(EXEEXT) \ - getifaddrs-test$(EXEEXT) hex-test$(EXEEXT) \ - test-readenv$(EXEEXT) parse_bytes-test$(EXEEXT) \ - parse_reply-test$(EXEEXT) parse_time-test$(EXEEXT) \ - snprintf-test$(EXEEXT) strpftime-test$(EXEEXT) \ - tsearch-test$(EXEEXT) + getifaddrs-test$(EXEEXT) getxxyyy-test$(EXEEXT) \ + hex-test$(EXEEXT) test-readenv$(EXEEXT) resolve-test$(EXEEXT) \ + parse_bytes-test$(EXEEXT) parse_reply-test$(EXEEXT) \ + parse_time-test$(EXEEXT) snprintf-test$(EXEEXT) \ + strpftime-test$(EXEEXT) tsearch-test$(EXEEXT) @have_socket_wrapper_TRUE@am__append_3 = socket_wrapper.c socket_wrapper.h @have_socket_wrapper_TRUE@am__append_4 = socket_wrapper.h @@ -80,7 +116,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -91,8 +126,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -105,6 +139,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -124,10 +159,14 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__dist_include_HEADERS_DIST) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +@CROSS_COMPILE_FALSE@am__EXEEXT_1 = make-roken$(EXEEXT) +PROGRAMS = $(noinst_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -149,39 +188,47 @@ 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)$(man3dir)" \ "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" \ "$(DESTDIR)$(rokenincludedir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = -libroken_la_DEPENDENCIES = @LTLIBOBJS@ $(am__DEPENDENCIES_1) +libroken_la_DEPENDENCIES = @LTLIBOBJS@ $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) am__libroken_la_SOURCES_DIST = base64.c bswap.c concat.c cloexec.c \ - ct.c doxygen.c dumpdata.c environment.c eread.c esetenv.c \ - ewrite.c getaddrinfo_hostspec.c get_default_username.c \ - get_window_size.c getarg.c getnameinfo_verified.c \ - getprogname.c h_errno.c hex.c hostent_find_fqdn.c issuid.c \ - k_getpwnam.c k_getpwuid.c mini_inetd.c net_read.c net_write.c \ - parse_bytes.c parse_time.c parse_units.c qsort.c rand.c \ - realloc.c resolve.c roken_gethostby.c rtbl.c rtbl.h \ - setprogname.c signal.c simple_exec.c snprintf.c socket.c \ - strcollect.c strerror_r.c strpool.c timeval.c tm2time.c \ - unvis.c verify.c vis.c warnerr.c write_pid.c xfree.c xdbm.h \ - socket_wrapper.c socket_wrapper.h + ct.c detach.c doxygen.c dumpdata.c environment.c eread.c \ + esetenv.c ewrite.c getaddrinfo_hostspec.c \ + get_default_username.c get_window_size.c getarg.c \ + getnameinfo_verified.c getprogname.c getxxyyy.c h_errno.c \ + hex.c hostent_find_fqdn.c issuid.c k_getpwnam.c k_getpwuid.c \ + mini_inetd.c mkdir.c net_read.c net_write.c parse_bytes.c \ + parse_time.c parse_units.c qsort.c rand.c realloc.c resolve.c \ + roken_gethostby.c rtbl.c rtbl.h setprogname.c signal.c \ + simple_exec.c snprintf.c socket.c strcollect.c strerror_r.c \ + strpool.c timeval.c tm2time.c unvis.c verify.c vis.c warnerr.c \ + write_pid.c xfree.c xdbm.h socket_wrapper.c socket_wrapper.h @have_socket_wrapper_TRUE@am__objects_1 = \ @have_socket_wrapper_TRUE@ libroken_la-socket_wrapper.lo am_libroken_la_OBJECTS = libroken_la-base64.lo libroken_la-bswap.lo \ libroken_la-concat.lo libroken_la-cloexec.lo libroken_la-ct.lo \ - libroken_la-doxygen.lo libroken_la-dumpdata.lo \ - libroken_la-environment.lo libroken_la-eread.lo \ - libroken_la-esetenv.lo libroken_la-ewrite.lo \ - libroken_la-getaddrinfo_hostspec.lo \ + libroken_la-detach.lo libroken_la-doxygen.lo \ + libroken_la-dumpdata.lo libroken_la-environment.lo \ + libroken_la-eread.lo libroken_la-esetenv.lo \ + libroken_la-ewrite.lo libroken_la-getaddrinfo_hostspec.lo \ libroken_la-get_default_username.lo \ libroken_la-get_window_size.lo libroken_la-getarg.lo \ libroken_la-getnameinfo_verified.lo libroken_la-getprogname.lo \ - libroken_la-h_errno.lo libroken_la-hex.lo \ - libroken_la-hostent_find_fqdn.lo libroken_la-issuid.lo \ - libroken_la-k_getpwnam.lo libroken_la-k_getpwuid.lo \ - libroken_la-mini_inetd.lo libroken_la-net_read.lo \ + libroken_la-getxxyyy.lo libroken_la-h_errno.lo \ + libroken_la-hex.lo libroken_la-hostent_find_fqdn.lo \ + libroken_la-issuid.lo libroken_la-k_getpwnam.lo \ + libroken_la-k_getpwuid.lo libroken_la-mini_inetd.lo \ + libroken_la-mkdir.lo libroken_la-net_read.lo \ libroken_la-net_write.lo libroken_la-parse_bytes.lo \ libroken_la-parse_time.lo libroken_la-parse_units.lo \ libroken_la-qsort.lo libroken_la-rand.lo \ @@ -196,18 +243,20 @@ libroken_la-warnerr.lo libroken_la-write_pid.lo \ libroken_la-xfree.lo $(am__objects_1) libroken_la_OBJECTS = $(am_libroken_la_OBJECTS) -libroken_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libroken_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libroken_la_LDFLAGS) $(LDFLAGS) -o $@ libtest_la_LIBADD = am_libtest_la_OBJECTS = libtest_la-strftime.lo libtest_la-strptime.lo \ libtest_la-snprintf.lo libtest_la-tsearch.lo libtest_la_OBJECTS = $(am_libtest_la_OBJECTS) -libtest_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +libtest_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libtest_la_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ -@CROSS_COMPILE_FALSE@am__EXEEXT_1 = make-roken$(EXEEXT) -PROGRAMS = $(noinst_PROGRAMS) base64_test_SOURCES = base64-test.c base64_test_OBJECTS = base64-test.$(OBJEXT) base64_test_LDADD = $(LDADD) @@ -220,6 +269,13 @@ getifaddrs_test_OBJECTS = getifaddrs-test.$(OBJEXT) getifaddrs_test_LDADD = $(LDADD) getifaddrs_test_DEPENDENCIES = libroken.la +am_getxxyyy_test_OBJECTS = getxxyyy_test-getxxyyy.$(OBJEXT) +getxxyyy_test_OBJECTS = $(am_getxxyyy_test_OBJECTS) +getxxyyy_test_LDADD = $(LDADD) +getxxyyy_test_DEPENDENCIES = libroken.la +getxxyyy_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(getxxyyy_test_CFLAGS) \ + $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ hex_test_SOURCES = hex-test.c hex_test_OBJECTS = hex-test.$(OBJEXT) hex_test_LDADD = $(LDADD) @@ -237,9 +293,10 @@ parse_reply_test_OBJECTS = $(am_parse_reply_test_OBJECTS) parse_reply_test_LDADD = $(LDADD) parse_reply_test_DEPENDENCIES = libroken.la -parse_reply_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(parse_reply_test_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +parse_reply_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(parse_reply_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ am_parse_time_test_OBJECTS = parse_time-test.$(OBJEXT) \ test-mem.$(OBJEXT) parse_time_test_OBJECTS = $(am_parse_time_test_OBJECTS) @@ -255,15 +312,20 @@ am_snprintf_test_OBJECTS = snprintf_test-snprintf-test.$(OBJEXT) snprintf_test_OBJECTS = $(am_snprintf_test_OBJECTS) snprintf_test_DEPENDENCIES = libtest.la $(LDADD) -snprintf_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +snprintf_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(snprintf_test_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_strpftime_test_OBJECTS = strpftime_test-strpftime-test.$(OBJEXT) strpftime_test_OBJECTS = $(am_strpftime_test_OBJECTS) strpftime_test_DEPENDENCIES = libtest.la $(LDADD) -strpftime_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(strpftime_test_CFLAGS) \ - $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +strpftime_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(strpftime_test_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \ + $@ +am_test_detach_OBJECTS = test-detach.$(OBJEXT) +test_detach_OBJECTS = $(am_test_detach_OBJECTS) +test_detach_LDADD = $(LDADD) +test_detach_DEPENDENCIES = libroken.la am_test_readenv_OBJECTS = test-readenv.$(OBJEXT) test-mem.$(OBJEXT) test_readenv_OBJECTS = $(am_test_readenv_OBJECTS) test_readenv_LDADD = $(LDADD) @@ -271,35 +333,173 @@ am_tsearch_test_OBJECTS = tsearch_test-tsearch-test.$(OBJEXT) tsearch_test_OBJECTS = $(am_tsearch_test_OBJECTS) tsearch_test_DEPENDENCIES = libtest.la $(LDADD) -tsearch_test_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +tsearch_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(tsearch_test_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = $(DEPDIR)/chown.Plo $(DEPDIR)/closefrom.Plo \ + $(DEPDIR)/copyhostent.Plo $(DEPDIR)/daemon.Plo \ + $(DEPDIR)/ecalloc.Plo $(DEPDIR)/emalloc.Plo \ + $(DEPDIR)/erealloc.Plo $(DEPDIR)/err.Plo $(DEPDIR)/errx.Plo \ + $(DEPDIR)/estrdup.Plo $(DEPDIR)/fchown.Plo $(DEPDIR)/flock.Plo \ + $(DEPDIR)/fnmatch.Plo $(DEPDIR)/freeaddrinfo.Plo \ + $(DEPDIR)/freehostent.Plo $(DEPDIR)/gai_strerror.Plo \ + $(DEPDIR)/getaddrinfo.Plo $(DEPDIR)/getcap.Plo \ + $(DEPDIR)/getcwd.Plo $(DEPDIR)/getdtablesize.Plo \ + $(DEPDIR)/getegid.Plo $(DEPDIR)/geteuid.Plo \ + $(DEPDIR)/getgid.Plo $(DEPDIR)/gethostname.Plo \ + $(DEPDIR)/getifaddrs.Plo $(DEPDIR)/getipnodebyaddr.Plo \ + $(DEPDIR)/getipnodebyname.Plo $(DEPDIR)/getnameinfo.Plo \ + $(DEPDIR)/getopt.Plo $(DEPDIR)/gettimeofday.Plo \ + $(DEPDIR)/getuid.Plo $(DEPDIR)/getusershell.Plo \ + $(DEPDIR)/glob.Plo $(DEPDIR)/hstrerror.Plo \ + $(DEPDIR)/inet_aton.Plo $(DEPDIR)/inet_ntop.Plo \ + $(DEPDIR)/inet_pton.Plo $(DEPDIR)/initgroups.Plo \ + $(DEPDIR)/innetgr.Plo $(DEPDIR)/iruserok.Plo \ + $(DEPDIR)/localtime_r.Plo $(DEPDIR)/lstat.Plo \ + $(DEPDIR)/memmove.Plo $(DEPDIR)/memset_s.Plo \ + $(DEPDIR)/mkstemp.Plo $(DEPDIR)/putenv.Plo $(DEPDIR)/rcmd.Plo \ + $(DEPDIR)/readv.Plo $(DEPDIR)/recvmsg.Plo \ + $(DEPDIR)/sendmsg.Plo $(DEPDIR)/setegid.Plo \ + $(DEPDIR)/setenv.Plo $(DEPDIR)/seteuid.Plo \ + $(DEPDIR)/strcasecmp.Plo $(DEPDIR)/strdup.Plo \ + $(DEPDIR)/strerror.Plo $(DEPDIR)/strftime.Plo \ + $(DEPDIR)/strlcat.Plo $(DEPDIR)/strlcpy.Plo \ + $(DEPDIR)/strlwr.Plo $(DEPDIR)/strncasecmp.Plo \ + $(DEPDIR)/strndup.Plo $(DEPDIR)/strnlen.Plo \ + $(DEPDIR)/strptime.Plo $(DEPDIR)/strsep.Plo \ + $(DEPDIR)/strsep_copy.Plo $(DEPDIR)/strtok_r.Plo \ + $(DEPDIR)/strtoll.Plo $(DEPDIR)/strtoull.Plo \ + $(DEPDIR)/strupr.Plo $(DEPDIR)/swab.Plo $(DEPDIR)/timegm.Plo \ + $(DEPDIR)/tsearch.Plo $(DEPDIR)/unsetenv.Plo \ + $(DEPDIR)/verr.Plo $(DEPDIR)/verrx.Plo $(DEPDIR)/vsyslog.Plo \ + $(DEPDIR)/vwarn.Plo $(DEPDIR)/vwarnx.Plo $(DEPDIR)/warn.Plo \ + $(DEPDIR)/warnx.Plo $(DEPDIR)/writev.Plo \ + ./$(DEPDIR)/base64-test.Po ./$(DEPDIR)/getaddrinfo-test.Po \ + ./$(DEPDIR)/getifaddrs-test.Po \ + ./$(DEPDIR)/getxxyyy_test-getxxyyy.Po ./$(DEPDIR)/hex-test.Po \ + ./$(DEPDIR)/libroken_la-base64.Plo \ + ./$(DEPDIR)/libroken_la-bswap.Plo \ + ./$(DEPDIR)/libroken_la-cloexec.Plo \ + ./$(DEPDIR)/libroken_la-concat.Plo \ + ./$(DEPDIR)/libroken_la-ct.Plo \ + ./$(DEPDIR)/libroken_la-detach.Plo \ + ./$(DEPDIR)/libroken_la-doxygen.Plo \ + ./$(DEPDIR)/libroken_la-dumpdata.Plo \ + ./$(DEPDIR)/libroken_la-environment.Plo \ + ./$(DEPDIR)/libroken_la-eread.Plo \ + ./$(DEPDIR)/libroken_la-esetenv.Plo \ + ./$(DEPDIR)/libroken_la-ewrite.Plo \ + ./$(DEPDIR)/libroken_la-get_default_username.Plo \ + ./$(DEPDIR)/libroken_la-get_window_size.Plo \ + ./$(DEPDIR)/libroken_la-getaddrinfo_hostspec.Plo \ + ./$(DEPDIR)/libroken_la-getarg.Plo \ + ./$(DEPDIR)/libroken_la-getnameinfo_verified.Plo \ + ./$(DEPDIR)/libroken_la-getprogname.Plo \ + ./$(DEPDIR)/libroken_la-getxxyyy.Plo \ + ./$(DEPDIR)/libroken_la-h_errno.Plo \ + ./$(DEPDIR)/libroken_la-hex.Plo \ + ./$(DEPDIR)/libroken_la-hostent_find_fqdn.Plo \ + ./$(DEPDIR)/libroken_la-issuid.Plo \ + ./$(DEPDIR)/libroken_la-k_getpwnam.Plo \ + ./$(DEPDIR)/libroken_la-k_getpwuid.Plo \ + ./$(DEPDIR)/libroken_la-mini_inetd.Plo \ + ./$(DEPDIR)/libroken_la-mkdir.Plo \ + ./$(DEPDIR)/libroken_la-net_read.Plo \ + ./$(DEPDIR)/libroken_la-net_write.Plo \ + ./$(DEPDIR)/libroken_la-parse_bytes.Plo \ + ./$(DEPDIR)/libroken_la-parse_time.Plo \ + ./$(DEPDIR)/libroken_la-parse_units.Plo \ + ./$(DEPDIR)/libroken_la-qsort.Plo \ + ./$(DEPDIR)/libroken_la-rand.Plo \ + ./$(DEPDIR)/libroken_la-realloc.Plo \ + ./$(DEPDIR)/libroken_la-resolve.Plo \ + ./$(DEPDIR)/libroken_la-roken_gethostby.Plo \ + ./$(DEPDIR)/libroken_la-rtbl.Plo \ + ./$(DEPDIR)/libroken_la-setprogname.Plo \ + ./$(DEPDIR)/libroken_la-signal.Plo \ + ./$(DEPDIR)/libroken_la-simple_exec.Plo \ + ./$(DEPDIR)/libroken_la-snprintf.Plo \ + ./$(DEPDIR)/libroken_la-socket.Plo \ + ./$(DEPDIR)/libroken_la-socket_wrapper.Plo \ + ./$(DEPDIR)/libroken_la-strcollect.Plo \ + ./$(DEPDIR)/libroken_la-strerror_r.Plo \ + ./$(DEPDIR)/libroken_la-strpool.Plo \ + ./$(DEPDIR)/libroken_la-timeval.Plo \ + ./$(DEPDIR)/libroken_la-tm2time.Plo \ + ./$(DEPDIR)/libroken_la-unvis.Plo \ + ./$(DEPDIR)/libroken_la-verify.Plo \ + ./$(DEPDIR)/libroken_la-vis.Plo \ + ./$(DEPDIR)/libroken_la-warnerr.Plo \ + ./$(DEPDIR)/libroken_la-write_pid.Plo \ + ./$(DEPDIR)/libroken_la-xfree.Plo \ + ./$(DEPDIR)/libtest_la-snprintf.Plo \ + ./$(DEPDIR)/libtest_la-strftime.Plo \ + ./$(DEPDIR)/libtest_la-strptime.Plo \ + ./$(DEPDIR)/libtest_la-tsearch.Plo ./$(DEPDIR)/make-roken.Po \ + ./$(DEPDIR)/parse_bytes-test.Po \ + ./$(DEPDIR)/parse_reply_test-parse_reply-test.Po \ + ./$(DEPDIR)/parse_reply_test-resolve.Po \ + ./$(DEPDIR)/parse_time-test.Po ./$(DEPDIR)/resolve-test.Po \ + ./$(DEPDIR)/rkpty.Po \ + ./$(DEPDIR)/snprintf_test-snprintf-test.Po \ + ./$(DEPDIR)/strpftime_test-strpftime-test.Po \ + ./$(DEPDIR)/test-detach.Po ./$(DEPDIR)/test-mem.Po \ + ./$(DEPDIR)/test-readenv.Po \ + ./$(DEPDIR)/tsearch_test-tsearch-test.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(libroken_la_SOURCES) $(EXTRA_libroken_la_SOURCES) \ $(libtest_la_SOURCES) base64-test.c getaddrinfo-test.c \ - getifaddrs-test.c hex-test.c $(nodist_make_roken_SOURCES) \ - parse_bytes-test.c $(parse_reply_test_SOURCES) \ - $(parse_time_test_SOURCES) $(resolve_test_SOURCES) rkpty.c \ - $(snprintf_test_SOURCES) $(strpftime_test_SOURCES) \ + getifaddrs-test.c $(getxxyyy_test_SOURCES) hex-test.c \ + $(nodist_make_roken_SOURCES) parse_bytes-test.c \ + $(parse_reply_test_SOURCES) $(parse_time_test_SOURCES) \ + $(resolve_test_SOURCES) rkpty.c $(snprintf_test_SOURCES) \ + $(strpftime_test_SOURCES) $(test_detach_SOURCES) \ $(test_readenv_SOURCES) $(tsearch_test_SOURCES) DIST_SOURCES = $(am__libroken_la_SOURCES_DIST) \ $(EXTRA_libroken_la_SOURCES) $(libtest_la_SOURCES) \ - base64-test.c getaddrinfo-test.c getifaddrs-test.c hex-test.c \ - parse_bytes-test.c $(parse_reply_test_SOURCES) \ - $(parse_time_test_SOURCES) $(resolve_test_SOURCES) rkpty.c \ - $(snprintf_test_SOURCES) $(strpftime_test_SOURCES) \ + base64-test.c getaddrinfo-test.c getifaddrs-test.c \ + $(getxxyyy_test_SOURCES) hex-test.c parse_bytes-test.c \ + $(parse_reply_test_SOURCES) $(parse_time_test_SOURCES) \ + $(resolve_test_SOURCES) rkpty.c $(snprintf_test_SOURCES) \ + $(strpftime_test_SOURCES) $(test_detach_SOURCES) \ $(test_readenv_SOURCES) $(tsearch_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac man3dir = $(mandir)/man3 MANS = $(man_MANS) am__dist_include_HEADERS_DIST = base64.h getarg.h hex.h parse_bytes.h \ @@ -307,15 +507,228 @@ xdbm.h socket_wrapper.h HEADERS = $(dist_include_HEADERS) $(nodist_include_HEADERS) \ $(nodist_rokeninclude_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver ChangeLog chown.c closefrom.c \ + copyhostent.c daemon.c ecalloc.c emalloc.c erealloc.c err.c \ + errx.c estrdup.c fchown.c flock.c fnmatch.c freeaddrinfo.c \ + freehostent.c gai_strerror.c getaddrinfo.c getcap.c getcwd.c \ + getdtablesize.c getegid.c geteuid.c getgid.c gethostname.c \ + getifaddrs.c getipnodebyaddr.c getipnodebyname.c getnameinfo.c \ + getopt.c gettimeofday.c getuid.c getusershell.c glob.c \ + hstrerror.c inet_aton.c inet_ntop.c inet_pton.c initgroups.c \ + innetgr.c install-sh iruserok.c localtime_r.c lstat.c \ + memmove.c memset_s.c missing mkinstalldirs mkstemp.c putenv.c \ + rcmd.c readv.c recvmsg.c sendmsg.c setegid.c setenv.c \ + seteuid.c strcasecmp.c strdup.c strerror.c strftime.c \ + strlcat.c strlcpy.c strlwr.c strncasecmp.c strndup.c strnlen.c \ + strptime.c strsep.c strsep_copy.c strtok_r.c strtoll.c \ + strtoull.c strupr.c swab.c timegm.c tsearch.c unsetenv.c \ + verr.c verrx.c vsyslog.c vwarn.c vwarnx.c warn.c warnx.c \ + writev.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -330,16 +743,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -349,17 +765,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -378,12 +796,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -392,6 +807,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -408,10 +824,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -419,6 +833,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -433,12 +848,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -455,10 +873,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -469,13 +893,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -499,6 +917,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -522,9 +942,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -534,7 +959,8 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .hin +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 .hin DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) $(libroken_la_CPPFLAGS) \ $(am__append_2) @@ -542,28 +968,36 @@ AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; ACLOCAL_AMFLAGS = -I ../../cf CLEANFILES = roken.h make-roken.c $(XHEADERS) err.h fnmatch.h glob.h \ ifaddrs.h search.h vis.h lib_LTLIBRARIES = libroken.la libroken_la_LDFLAGS = -version-info 19:0:1 $(am__append_1) libroken_la_CPPFLAGS = -DBUILD_ROKEN_LIB +CHECK_LOCAL = snprintf-test resolve-test rkpty make-roken TESTS = $(check_PROGRAMS) LDADD = libroken.la make_roken_LDADD = @@ -573,6 +1007,7 @@ parse_reply_test_SOURCES = parse_reply-test.c resolve.c parse_reply_test_CFLAGS = -DTEST_RESOLVE test_readenv_SOURCES = test-readenv.c test-mem.c +test_detach_SOURCES = test-detach.c rkpty_LDADD = $(LIB_openpty) $(LDADD) parse_time_test_SOURCES = parse_time-test.c test-mem.c strpftime_test_SOURCES = strpftime-test.c strpftime-test.h @@ -584,19 +1019,21 @@ tsearch_test_SOURCES = tsearch-test.c tsearch_test_LDADD = libtest.la $(LDADD) tsearch_test_CFLAGS = -DTEST_TSEARCH +getxxyyy_test_SOURCES = getxxyyy.c +getxxyyy_test_CFLAGS = -DTEST_GETXXYYY resolve_test_SOURCES = resolve-test.c libroken_la_SOURCES = base64.c bswap.c concat.c cloexec.c ct.c \ - doxygen.c dumpdata.c environment.c eread.c esetenv.c ewrite.c \ - getaddrinfo_hostspec.c get_default_username.c \ + detach.c doxygen.c dumpdata.c environment.c eread.c esetenv.c \ + ewrite.c getaddrinfo_hostspec.c get_default_username.c \ get_window_size.c getarg.c getnameinfo_verified.c \ - getprogname.c h_errno.c hex.c hostent_find_fqdn.c issuid.c \ - k_getpwnam.c k_getpwuid.c mini_inetd.c net_read.c net_write.c \ - parse_bytes.c parse_time.c parse_units.c qsort.c rand.c \ - realloc.c resolve.c roken_gethostby.c rtbl.c rtbl.h \ - setprogname.c signal.c simple_exec.c snprintf.c socket.c \ - strcollect.c strerror_r.c strpool.c timeval.c tm2time.c \ - unvis.c verify.c vis.c warnerr.c write_pid.c xfree.c xdbm.h \ - $(am__append_3) + getprogname.c getxxyyy.c h_errno.c hex.c hostent_find_fqdn.c \ + issuid.c k_getpwnam.c k_getpwuid.c mini_inetd.c mkdir.c \ + net_read.c net_write.c parse_bytes.c parse_time.c \ + parse_units.c qsort.c rand.c realloc.c resolve.c \ + roken_gethostby.c rtbl.c rtbl.h setprogname.c signal.c \ + simple_exec.c snprintf.c socket.c strcollect.c strerror_r.c \ + strpool.c timeval.c tm2time.c unvis.c verify.c vis.c warnerr.c \ + write_pid.c xfree.c xdbm.h $(am__append_3) EXTRA_libroken_la_SOURCES = \ err.hin \ glob.hin \ @@ -605,7 +1042,7 @@ search.hin \ vis.hin -libroken_la_LIBADD = @LTLIBOBJS@ $(LIB_crypt) +libroken_la_LIBADD = @LTLIBOBJS@ $(LIB_crypt) $(LIB_pidfile) BUILT_SOURCES = roken.h $(am__append_6) @have_err_h_FALSE@err_h = err.h @have_err_h_TRUE@err_h = @@ -633,16 +1070,32 @@ NTMakefile \ roken.awk roken.h.in \ $(man_MANS) \ - test-mem.h \ + dirent.c \ + dirent.hin \ + dirent-test.c \ + dlfcn.hin \ + dlfcn_w32.c \ + getifaddrs_w32.c \ ndbm_wrap.c \ ndbm_wrap.h \ + rename.c \ + simple_exec_w32.c \ + sleep.c \ + sockstartup_w32.c \ + stdbool.hin \ + stdint.hin \ + syslogc.c \ + syslog.hin \ + test-mem.h \ + test-mini_inetd.c \ + win32_alloc.c \ version-script.map all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .hin .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .hin .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -655,15 +1108,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/roken/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/roken/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -673,9 +1126,27 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): + +clean-checkPROGRAMS: + @list='$(check_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 + +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 + install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ @@ -683,6 +1154,8 @@ 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)"; \ } @@ -698,85 +1171,95 @@ clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) - @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done + @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}; \ + } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libroken.la: $(libroken_la_OBJECTS) $(libroken_la_DEPENDENCIES) - $(libroken_la_LINK) -rpath $(libdir) $(libroken_la_OBJECTS) $(libroken_la_LIBADD) $(LIBS) -libtest.la: $(libtest_la_OBJECTS) $(libtest_la_DEPENDENCIES) - $(libtest_la_LINK) $(libtest_la_OBJECTS) $(libtest_la_LIBADD) $(LIBS) + @list='$(noinst_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}; \ + } -clean-checkPROGRAMS: - @list='$(check_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 +libroken.la: $(libroken_la_OBJECTS) $(libroken_la_DEPENDENCIES) $(EXTRA_libroken_la_DEPENDENCIES) + $(AM_V_CCLD)$(libroken_la_LINK) -rpath $(libdir) $(libroken_la_OBJECTS) $(libroken_la_LIBADD) $(LIBS) -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 -base64-test$(EXEEXT): $(base64_test_OBJECTS) $(base64_test_DEPENDENCIES) +libtest.la: $(libtest_la_OBJECTS) $(libtest_la_DEPENDENCIES) $(EXTRA_libtest_la_DEPENDENCIES) + $(AM_V_CCLD)$(libtest_la_LINK) $(libtest_la_OBJECTS) $(libtest_la_LIBADD) $(LIBS) + +base64-test$(EXEEXT): $(base64_test_OBJECTS) $(base64_test_DEPENDENCIES) $(EXTRA_base64_test_DEPENDENCIES) @rm -f base64-test$(EXEEXT) - $(LINK) $(base64_test_OBJECTS) $(base64_test_LDADD) $(LIBS) -getaddrinfo-test$(EXEEXT): $(getaddrinfo_test_OBJECTS) $(getaddrinfo_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(base64_test_OBJECTS) $(base64_test_LDADD) $(LIBS) + +getaddrinfo-test$(EXEEXT): $(getaddrinfo_test_OBJECTS) $(getaddrinfo_test_DEPENDENCIES) $(EXTRA_getaddrinfo_test_DEPENDENCIES) @rm -f getaddrinfo-test$(EXEEXT) - $(LINK) $(getaddrinfo_test_OBJECTS) $(getaddrinfo_test_LDADD) $(LIBS) -getifaddrs-test$(EXEEXT): $(getifaddrs_test_OBJECTS) $(getifaddrs_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(getaddrinfo_test_OBJECTS) $(getaddrinfo_test_LDADD) $(LIBS) + +getifaddrs-test$(EXEEXT): $(getifaddrs_test_OBJECTS) $(getifaddrs_test_DEPENDENCIES) $(EXTRA_getifaddrs_test_DEPENDENCIES) @rm -f getifaddrs-test$(EXEEXT) - $(LINK) $(getifaddrs_test_OBJECTS) $(getifaddrs_test_LDADD) $(LIBS) -hex-test$(EXEEXT): $(hex_test_OBJECTS) $(hex_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(getifaddrs_test_OBJECTS) $(getifaddrs_test_LDADD) $(LIBS) + +getxxyyy-test$(EXEEXT): $(getxxyyy_test_OBJECTS) $(getxxyyy_test_DEPENDENCIES) $(EXTRA_getxxyyy_test_DEPENDENCIES) + @rm -f getxxyyy-test$(EXEEXT) + $(AM_V_CCLD)$(getxxyyy_test_LINK) $(getxxyyy_test_OBJECTS) $(getxxyyy_test_LDADD) $(LIBS) + +hex-test$(EXEEXT): $(hex_test_OBJECTS) $(hex_test_DEPENDENCIES) $(EXTRA_hex_test_DEPENDENCIES) @rm -f hex-test$(EXEEXT) - $(LINK) $(hex_test_OBJECTS) $(hex_test_LDADD) $(LIBS) -make-roken$(EXEEXT): $(make_roken_OBJECTS) $(make_roken_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(hex_test_OBJECTS) $(hex_test_LDADD) $(LIBS) + +make-roken$(EXEEXT): $(make_roken_OBJECTS) $(make_roken_DEPENDENCIES) $(EXTRA_make_roken_DEPENDENCIES) @rm -f make-roken$(EXEEXT) - $(LINK) $(make_roken_OBJECTS) $(make_roken_LDADD) $(LIBS) -parse_bytes-test$(EXEEXT): $(parse_bytes_test_OBJECTS) $(parse_bytes_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(make_roken_OBJECTS) $(make_roken_LDADD) $(LIBS) + +parse_bytes-test$(EXEEXT): $(parse_bytes_test_OBJECTS) $(parse_bytes_test_DEPENDENCIES) $(EXTRA_parse_bytes_test_DEPENDENCIES) @rm -f parse_bytes-test$(EXEEXT) - $(LINK) $(parse_bytes_test_OBJECTS) $(parse_bytes_test_LDADD) $(LIBS) -parse_reply-test$(EXEEXT): $(parse_reply_test_OBJECTS) $(parse_reply_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(parse_bytes_test_OBJECTS) $(parse_bytes_test_LDADD) $(LIBS) + +parse_reply-test$(EXEEXT): $(parse_reply_test_OBJECTS) $(parse_reply_test_DEPENDENCIES) $(EXTRA_parse_reply_test_DEPENDENCIES) @rm -f parse_reply-test$(EXEEXT) - $(parse_reply_test_LINK) $(parse_reply_test_OBJECTS) $(parse_reply_test_LDADD) $(LIBS) -parse_time-test$(EXEEXT): $(parse_time_test_OBJECTS) $(parse_time_test_DEPENDENCIES) + $(AM_V_CCLD)$(parse_reply_test_LINK) $(parse_reply_test_OBJECTS) $(parse_reply_test_LDADD) $(LIBS) + +parse_time-test$(EXEEXT): $(parse_time_test_OBJECTS) $(parse_time_test_DEPENDENCIES) $(EXTRA_parse_time_test_DEPENDENCIES) @rm -f parse_time-test$(EXEEXT) - $(LINK) $(parse_time_test_OBJECTS) $(parse_time_test_LDADD) $(LIBS) -resolve-test$(EXEEXT): $(resolve_test_OBJECTS) $(resolve_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(parse_time_test_OBJECTS) $(parse_time_test_LDADD) $(LIBS) + +resolve-test$(EXEEXT): $(resolve_test_OBJECTS) $(resolve_test_DEPENDENCIES) $(EXTRA_resolve_test_DEPENDENCIES) @rm -f resolve-test$(EXEEXT) - $(LINK) $(resolve_test_OBJECTS) $(resolve_test_LDADD) $(LIBS) -rkpty$(EXEEXT): $(rkpty_OBJECTS) $(rkpty_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(resolve_test_OBJECTS) $(resolve_test_LDADD) $(LIBS) + +rkpty$(EXEEXT): $(rkpty_OBJECTS) $(rkpty_DEPENDENCIES) $(EXTRA_rkpty_DEPENDENCIES) @rm -f rkpty$(EXEEXT) - $(LINK) $(rkpty_OBJECTS) $(rkpty_LDADD) $(LIBS) -snprintf-test$(EXEEXT): $(snprintf_test_OBJECTS) $(snprintf_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(rkpty_OBJECTS) $(rkpty_LDADD) $(LIBS) + +snprintf-test$(EXEEXT): $(snprintf_test_OBJECTS) $(snprintf_test_DEPENDENCIES) $(EXTRA_snprintf_test_DEPENDENCIES) @rm -f snprintf-test$(EXEEXT) - $(snprintf_test_LINK) $(snprintf_test_OBJECTS) $(snprintf_test_LDADD) $(LIBS) -strpftime-test$(EXEEXT): $(strpftime_test_OBJECTS) $(strpftime_test_DEPENDENCIES) + $(AM_V_CCLD)$(snprintf_test_LINK) $(snprintf_test_OBJECTS) $(snprintf_test_LDADD) $(LIBS) + +strpftime-test$(EXEEXT): $(strpftime_test_OBJECTS) $(strpftime_test_DEPENDENCIES) $(EXTRA_strpftime_test_DEPENDENCIES) @rm -f strpftime-test$(EXEEXT) - $(strpftime_test_LINK) $(strpftime_test_OBJECTS) $(strpftime_test_LDADD) $(LIBS) -test-readenv$(EXEEXT): $(test_readenv_OBJECTS) $(test_readenv_DEPENDENCIES) + $(AM_V_CCLD)$(strpftime_test_LINK) $(strpftime_test_OBJECTS) $(strpftime_test_LDADD) $(LIBS) + +test-detach$(EXEEXT): $(test_detach_OBJECTS) $(test_detach_DEPENDENCIES) $(EXTRA_test_detach_DEPENDENCIES) + @rm -f test-detach$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(test_detach_OBJECTS) $(test_detach_LDADD) $(LIBS) + +test-readenv$(EXEEXT): $(test_readenv_OBJECTS) $(test_readenv_DEPENDENCIES) $(EXTRA_test_readenv_DEPENDENCIES) @rm -f test-readenv$(EXEEXT) - $(LINK) $(test_readenv_OBJECTS) $(test_readenv_LDADD) $(LIBS) -tsearch-test$(EXEEXT): $(tsearch_test_OBJECTS) $(tsearch_test_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_readenv_OBJECTS) $(test_readenv_LDADD) $(LIBS) + +tsearch-test$(EXEEXT): $(tsearch_test_OBJECTS) $(tsearch_test_DEPENDENCIES) $(EXTRA_tsearch_test_DEPENDENCIES) @rm -f tsearch-test$(EXEEXT) - $(tsearch_test_LINK) $(tsearch_test_OBJECTS) $(tsearch_test_LDADD) $(LIBS) + $(AM_V_CCLD)$(tsearch_test_LINK) $(tsearch_test_OBJECTS) $(tsearch_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -784,640 +1267,689 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/chown.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/closefrom.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/copyhostent.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/daemon.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ecalloc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/emalloc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/erealloc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/err.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/errx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/estrdup.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fchown.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/flock.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fnmatch.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/freeaddrinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/freehostent.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gai_strerror.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getaddrinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getcap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getcwd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getdtablesize.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getegid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/geteuid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getgid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gethostname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getifaddrs.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getipnodebyaddr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getipnodebyname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getnameinfo.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gettimeofday.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getuid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getusershell.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/glob.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/hstrerror.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/inet_aton.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/inet_ntop.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/inet_pton.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/initgroups.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/innetgr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/iruserok.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/localtime_r.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lstat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memmove.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mkstemp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/putenv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/rcmd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/readv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/recvmsg.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/sendmsg.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setegid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setenv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/seteuid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strcasecmp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strftime.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strlcat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strlcpy.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strlwr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strncasecmp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strndup.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strnlen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strptime.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strsep.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strsep_copy.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtok_r.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strupr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/swab.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/timegm.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/tsearch.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/unsetenv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/verr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/verrx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vsyslog.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vwarn.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vwarnx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/warn.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/warnx.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/writev.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaddrinfo-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getifaddrs-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hex-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-base64.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-bswap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-cloexec.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-concat.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-ct.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-doxygen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-dumpdata.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-environment.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-eread.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-esetenv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-ewrite.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-get_default_username.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-get_window_size.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getaddrinfo_hostspec.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getarg.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getnameinfo_verified.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getprogname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-h_errno.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-hex.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-hostent_find_fqdn.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-issuid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-k_getpwnam.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-k_getpwuid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-mini_inetd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-net_read.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-net_write.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-parse_bytes.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-parse_time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-parse_units.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-qsort.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-rand.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-realloc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-resolve.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-roken_gethostby.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-rtbl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-setprogname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-signal.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-simple_exec.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-snprintf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-socket.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-socket_wrapper.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-strcollect.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-strerror_r.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-strpool.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-timeval.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-tm2time.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-unvis.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-verify.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-vis.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-warnerr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-write_pid.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-xfree.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-snprintf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-strftime.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-strptime.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-tsearch.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make-roken.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_bytes-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_reply_test-parse_reply-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_reply_test-resolve.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_time-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkpty.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf_test-snprintf-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strpftime_test-strpftime-test.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-mem.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-readenv.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsearch_test-tsearch-test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/chown.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/closefrom.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/copyhostent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/daemon.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/ecalloc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/emalloc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/erealloc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/err.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/errx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/estrdup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fchown.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/flock.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/fnmatch.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/freeaddrinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/freehostent.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gai_strerror.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getaddrinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getcap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getcwd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getdtablesize.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getegid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/geteuid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getgid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gethostname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getifaddrs.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getipnodebyaddr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getipnodebyname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getnameinfo.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getopt.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/gettimeofday.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getuid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/getusershell.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/glob.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/hstrerror.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/inet_aton.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/inet_ntop.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/inet_pton.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/initgroups.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/innetgr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/iruserok.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/localtime_r.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/lstat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memmove.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/memset_s.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/mkstemp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/putenv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/rcmd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/readv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/recvmsg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/sendmsg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setegid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/setenv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/seteuid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strcasecmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strdup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strerror.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strftime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strlcat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strlcpy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strlwr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strncasecmp.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strndup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strnlen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strptime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strsep.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strsep_copy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtok_r.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoll.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strtoull.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strupr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/swab.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/timegm.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/tsearch.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/unsetenv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/verr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/verrx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vsyslog.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vwarn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/vwarnx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/warn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/warnx.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/writev.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaddrinfo-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getifaddrs-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getxxyyy_test-getxxyyy.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hex-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-base64.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-bswap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-cloexec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-concat.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-ct.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-detach.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-doxygen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-dumpdata.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-environment.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-eread.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-esetenv.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-ewrite.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-get_default_username.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-get_window_size.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getaddrinfo_hostspec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getarg.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getnameinfo_verified.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getprogname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-getxxyyy.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-h_errno.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-hex.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-hostent_find_fqdn.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-issuid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-k_getpwnam.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-k_getpwuid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-mini_inetd.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-mkdir.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-net_read.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-net_write.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-parse_bytes.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-parse_time.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-parse_units.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-qsort.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-rand.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-realloc.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-resolve.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-roken_gethostby.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-rtbl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-setprogname.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-signal.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-simple_exec.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-snprintf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-socket.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-socket_wrapper.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-strcollect.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-strerror_r.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-strpool.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-timeval.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-tm2time.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-unvis.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-verify.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-vis.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-warnerr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-write_pid.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libroken_la-xfree.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-snprintf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-strftime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-strptime.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libtest_la-tsearch.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/make-roken.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_bytes-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_reply_test-parse_reply-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_reply_test-resolve.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse_time-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/resolve-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rkpty.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf_test-snprintf-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strpftime_test-strpftime-test.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-detach.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-mem.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-readenv.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsearch_test-tsearch-test.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< libroken_la-base64.lo: base64.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-base64.lo -MD -MP -MF $(DEPDIR)/libroken_la-base64.Tpo -c -o libroken_la-base64.lo `test -f 'base64.c' || echo '$(srcdir)/'`base64.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-base64.Tpo $(DEPDIR)/libroken_la-base64.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='base64.c' object='libroken_la-base64.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-base64.lo -MD -MP -MF $(DEPDIR)/libroken_la-base64.Tpo -c -o libroken_la-base64.lo `test -f 'base64.c' || echo '$(srcdir)/'`base64.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-base64.Tpo $(DEPDIR)/libroken_la-base64.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='base64.c' object='libroken_la-base64.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-base64.lo `test -f 'base64.c' || echo '$(srcdir)/'`base64.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-base64.lo `test -f 'base64.c' || echo '$(srcdir)/'`base64.c libroken_la-bswap.lo: bswap.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-bswap.lo -MD -MP -MF $(DEPDIR)/libroken_la-bswap.Tpo -c -o libroken_la-bswap.lo `test -f 'bswap.c' || echo '$(srcdir)/'`bswap.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-bswap.Tpo $(DEPDIR)/libroken_la-bswap.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bswap.c' object='libroken_la-bswap.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-bswap.lo -MD -MP -MF $(DEPDIR)/libroken_la-bswap.Tpo -c -o libroken_la-bswap.lo `test -f 'bswap.c' || echo '$(srcdir)/'`bswap.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-bswap.Tpo $(DEPDIR)/libroken_la-bswap.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bswap.c' object='libroken_la-bswap.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-bswap.lo `test -f 'bswap.c' || echo '$(srcdir)/'`bswap.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-bswap.lo `test -f 'bswap.c' || echo '$(srcdir)/'`bswap.c libroken_la-concat.lo: concat.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-concat.lo -MD -MP -MF $(DEPDIR)/libroken_la-concat.Tpo -c -o libroken_la-concat.lo `test -f 'concat.c' || echo '$(srcdir)/'`concat.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-concat.Tpo $(DEPDIR)/libroken_la-concat.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='concat.c' object='libroken_la-concat.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-concat.lo -MD -MP -MF $(DEPDIR)/libroken_la-concat.Tpo -c -o libroken_la-concat.lo `test -f 'concat.c' || echo '$(srcdir)/'`concat.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-concat.Tpo $(DEPDIR)/libroken_la-concat.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='concat.c' object='libroken_la-concat.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-concat.lo `test -f 'concat.c' || echo '$(srcdir)/'`concat.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-concat.lo `test -f 'concat.c' || echo '$(srcdir)/'`concat.c libroken_la-cloexec.lo: cloexec.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-cloexec.lo -MD -MP -MF $(DEPDIR)/libroken_la-cloexec.Tpo -c -o libroken_la-cloexec.lo `test -f 'cloexec.c' || echo '$(srcdir)/'`cloexec.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-cloexec.Tpo $(DEPDIR)/libroken_la-cloexec.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cloexec.c' object='libroken_la-cloexec.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-cloexec.lo -MD -MP -MF $(DEPDIR)/libroken_la-cloexec.Tpo -c -o libroken_la-cloexec.lo `test -f 'cloexec.c' || echo '$(srcdir)/'`cloexec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-cloexec.Tpo $(DEPDIR)/libroken_la-cloexec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cloexec.c' object='libroken_la-cloexec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-cloexec.lo `test -f 'cloexec.c' || echo '$(srcdir)/'`cloexec.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-cloexec.lo `test -f 'cloexec.c' || echo '$(srcdir)/'`cloexec.c libroken_la-ct.lo: ct.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-ct.lo -MD -MP -MF $(DEPDIR)/libroken_la-ct.Tpo -c -o libroken_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-ct.Tpo $(DEPDIR)/libroken_la-ct.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ct.c' object='libroken_la-ct.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-ct.lo -MD -MP -MF $(DEPDIR)/libroken_la-ct.Tpo -c -o libroken_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-ct.Tpo $(DEPDIR)/libroken_la-ct.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ct.c' object='libroken_la-ct.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-ct.lo `test -f 'ct.c' || echo '$(srcdir)/'`ct.c + +libroken_la-detach.lo: detach.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-detach.lo -MD -MP -MF $(DEPDIR)/libroken_la-detach.Tpo -c -o libroken_la-detach.lo `test -f 'detach.c' || echo '$(srcdir)/'`detach.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-detach.Tpo $(DEPDIR)/libroken_la-detach.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='detach.c' object='libroken_la-detach.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-detach.lo `test -f 'detach.c' || echo '$(srcdir)/'`detach.c libroken_la-doxygen.lo: doxygen.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-doxygen.lo -MD -MP -MF $(DEPDIR)/libroken_la-doxygen.Tpo -c -o libroken_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-doxygen.Tpo $(DEPDIR)/libroken_la-doxygen.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='doxygen.c' object='libroken_la-doxygen.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-doxygen.lo -MD -MP -MF $(DEPDIR)/libroken_la-doxygen.Tpo -c -o libroken_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-doxygen.Tpo $(DEPDIR)/libroken_la-doxygen.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='doxygen.c' object='libroken_la-doxygen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-doxygen.lo `test -f 'doxygen.c' || echo '$(srcdir)/'`doxygen.c libroken_la-dumpdata.lo: dumpdata.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-dumpdata.lo -MD -MP -MF $(DEPDIR)/libroken_la-dumpdata.Tpo -c -o libroken_la-dumpdata.lo `test -f 'dumpdata.c' || echo '$(srcdir)/'`dumpdata.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-dumpdata.Tpo $(DEPDIR)/libroken_la-dumpdata.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='dumpdata.c' object='libroken_la-dumpdata.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-dumpdata.lo -MD -MP -MF $(DEPDIR)/libroken_la-dumpdata.Tpo -c -o libroken_la-dumpdata.lo `test -f 'dumpdata.c' || echo '$(srcdir)/'`dumpdata.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-dumpdata.Tpo $(DEPDIR)/libroken_la-dumpdata.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dumpdata.c' object='libroken_la-dumpdata.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-dumpdata.lo `test -f 'dumpdata.c' || echo '$(srcdir)/'`dumpdata.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-dumpdata.lo `test -f 'dumpdata.c' || echo '$(srcdir)/'`dumpdata.c libroken_la-environment.lo: environment.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-environment.lo -MD -MP -MF $(DEPDIR)/libroken_la-environment.Tpo -c -o libroken_la-environment.lo `test -f 'environment.c' || echo '$(srcdir)/'`environment.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-environment.Tpo $(DEPDIR)/libroken_la-environment.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='environment.c' object='libroken_la-environment.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-environment.lo -MD -MP -MF $(DEPDIR)/libroken_la-environment.Tpo -c -o libroken_la-environment.lo `test -f 'environment.c' || echo '$(srcdir)/'`environment.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-environment.Tpo $(DEPDIR)/libroken_la-environment.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='environment.c' object='libroken_la-environment.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-environment.lo `test -f 'environment.c' || echo '$(srcdir)/'`environment.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-environment.lo `test -f 'environment.c' || echo '$(srcdir)/'`environment.c libroken_la-eread.lo: eread.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-eread.lo -MD -MP -MF $(DEPDIR)/libroken_la-eread.Tpo -c -o libroken_la-eread.lo `test -f 'eread.c' || echo '$(srcdir)/'`eread.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-eread.Tpo $(DEPDIR)/libroken_la-eread.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='eread.c' object='libroken_la-eread.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-eread.lo -MD -MP -MF $(DEPDIR)/libroken_la-eread.Tpo -c -o libroken_la-eread.lo `test -f 'eread.c' || echo '$(srcdir)/'`eread.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-eread.Tpo $(DEPDIR)/libroken_la-eread.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='eread.c' object='libroken_la-eread.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-eread.lo `test -f 'eread.c' || echo '$(srcdir)/'`eread.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-eread.lo `test -f 'eread.c' || echo '$(srcdir)/'`eread.c libroken_la-esetenv.lo: esetenv.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-esetenv.lo -MD -MP -MF $(DEPDIR)/libroken_la-esetenv.Tpo -c -o libroken_la-esetenv.lo `test -f 'esetenv.c' || echo '$(srcdir)/'`esetenv.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-esetenv.Tpo $(DEPDIR)/libroken_la-esetenv.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='esetenv.c' object='libroken_la-esetenv.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-esetenv.lo -MD -MP -MF $(DEPDIR)/libroken_la-esetenv.Tpo -c -o libroken_la-esetenv.lo `test -f 'esetenv.c' || echo '$(srcdir)/'`esetenv.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-esetenv.Tpo $(DEPDIR)/libroken_la-esetenv.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='esetenv.c' object='libroken_la-esetenv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-esetenv.lo `test -f 'esetenv.c' || echo '$(srcdir)/'`esetenv.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-esetenv.lo `test -f 'esetenv.c' || echo '$(srcdir)/'`esetenv.c libroken_la-ewrite.lo: ewrite.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-ewrite.lo -MD -MP -MF $(DEPDIR)/libroken_la-ewrite.Tpo -c -o libroken_la-ewrite.lo `test -f 'ewrite.c' || echo '$(srcdir)/'`ewrite.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-ewrite.Tpo $(DEPDIR)/libroken_la-ewrite.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ewrite.c' object='libroken_la-ewrite.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-ewrite.lo -MD -MP -MF $(DEPDIR)/libroken_la-ewrite.Tpo -c -o libroken_la-ewrite.lo `test -f 'ewrite.c' || echo '$(srcdir)/'`ewrite.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-ewrite.Tpo $(DEPDIR)/libroken_la-ewrite.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ewrite.c' object='libroken_la-ewrite.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-ewrite.lo `test -f 'ewrite.c' || echo '$(srcdir)/'`ewrite.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-ewrite.lo `test -f 'ewrite.c' || echo '$(srcdir)/'`ewrite.c libroken_la-getaddrinfo_hostspec.lo: getaddrinfo_hostspec.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getaddrinfo_hostspec.lo -MD -MP -MF $(DEPDIR)/libroken_la-getaddrinfo_hostspec.Tpo -c -o libroken_la-getaddrinfo_hostspec.lo `test -f 'getaddrinfo_hostspec.c' || echo '$(srcdir)/'`getaddrinfo_hostspec.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-getaddrinfo_hostspec.Tpo $(DEPDIR)/libroken_la-getaddrinfo_hostspec.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='getaddrinfo_hostspec.c' object='libroken_la-getaddrinfo_hostspec.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getaddrinfo_hostspec.lo -MD -MP -MF $(DEPDIR)/libroken_la-getaddrinfo_hostspec.Tpo -c -o libroken_la-getaddrinfo_hostspec.lo `test -f 'getaddrinfo_hostspec.c' || echo '$(srcdir)/'`getaddrinfo_hostspec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-getaddrinfo_hostspec.Tpo $(DEPDIR)/libroken_la-getaddrinfo_hostspec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getaddrinfo_hostspec.c' object='libroken_la-getaddrinfo_hostspec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getaddrinfo_hostspec.lo `test -f 'getaddrinfo_hostspec.c' || echo '$(srcdir)/'`getaddrinfo_hostspec.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getaddrinfo_hostspec.lo `test -f 'getaddrinfo_hostspec.c' || echo '$(srcdir)/'`getaddrinfo_hostspec.c libroken_la-get_default_username.lo: get_default_username.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-get_default_username.lo -MD -MP -MF $(DEPDIR)/libroken_la-get_default_username.Tpo -c -o libroken_la-get_default_username.lo `test -f 'get_default_username.c' || echo '$(srcdir)/'`get_default_username.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-get_default_username.Tpo $(DEPDIR)/libroken_la-get_default_username.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_default_username.c' object='libroken_la-get_default_username.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-get_default_username.lo -MD -MP -MF $(DEPDIR)/libroken_la-get_default_username.Tpo -c -o libroken_la-get_default_username.lo `test -f 'get_default_username.c' || echo '$(srcdir)/'`get_default_username.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-get_default_username.Tpo $(DEPDIR)/libroken_la-get_default_username.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_default_username.c' object='libroken_la-get_default_username.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-get_default_username.lo `test -f 'get_default_username.c' || echo '$(srcdir)/'`get_default_username.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-get_default_username.lo `test -f 'get_default_username.c' || echo '$(srcdir)/'`get_default_username.c libroken_la-get_window_size.lo: get_window_size.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-get_window_size.lo -MD -MP -MF $(DEPDIR)/libroken_la-get_window_size.Tpo -c -o libroken_la-get_window_size.lo `test -f 'get_window_size.c' || echo '$(srcdir)/'`get_window_size.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-get_window_size.Tpo $(DEPDIR)/libroken_la-get_window_size.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='get_window_size.c' object='libroken_la-get_window_size.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-get_window_size.lo -MD -MP -MF $(DEPDIR)/libroken_la-get_window_size.Tpo -c -o libroken_la-get_window_size.lo `test -f 'get_window_size.c' || echo '$(srcdir)/'`get_window_size.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-get_window_size.Tpo $(DEPDIR)/libroken_la-get_window_size.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='get_window_size.c' object='libroken_la-get_window_size.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-get_window_size.lo `test -f 'get_window_size.c' || echo '$(srcdir)/'`get_window_size.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-get_window_size.lo `test -f 'get_window_size.c' || echo '$(srcdir)/'`get_window_size.c libroken_la-getarg.lo: getarg.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getarg.lo -MD -MP -MF $(DEPDIR)/libroken_la-getarg.Tpo -c -o libroken_la-getarg.lo `test -f 'getarg.c' || echo '$(srcdir)/'`getarg.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-getarg.Tpo $(DEPDIR)/libroken_la-getarg.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='getarg.c' object='libroken_la-getarg.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getarg.lo -MD -MP -MF $(DEPDIR)/libroken_la-getarg.Tpo -c -o libroken_la-getarg.lo `test -f 'getarg.c' || echo '$(srcdir)/'`getarg.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-getarg.Tpo $(DEPDIR)/libroken_la-getarg.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getarg.c' object='libroken_la-getarg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getarg.lo `test -f 'getarg.c' || echo '$(srcdir)/'`getarg.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getarg.lo `test -f 'getarg.c' || echo '$(srcdir)/'`getarg.c libroken_la-getnameinfo_verified.lo: getnameinfo_verified.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getnameinfo_verified.lo -MD -MP -MF $(DEPDIR)/libroken_la-getnameinfo_verified.Tpo -c -o libroken_la-getnameinfo_verified.lo `test -f 'getnameinfo_verified.c' || echo '$(srcdir)/'`getnameinfo_verified.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-getnameinfo_verified.Tpo $(DEPDIR)/libroken_la-getnameinfo_verified.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='getnameinfo_verified.c' object='libroken_la-getnameinfo_verified.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getnameinfo_verified.lo -MD -MP -MF $(DEPDIR)/libroken_la-getnameinfo_verified.Tpo -c -o libroken_la-getnameinfo_verified.lo `test -f 'getnameinfo_verified.c' || echo '$(srcdir)/'`getnameinfo_verified.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-getnameinfo_verified.Tpo $(DEPDIR)/libroken_la-getnameinfo_verified.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getnameinfo_verified.c' object='libroken_la-getnameinfo_verified.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getnameinfo_verified.lo `test -f 'getnameinfo_verified.c' || echo '$(srcdir)/'`getnameinfo_verified.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getnameinfo_verified.lo `test -f 'getnameinfo_verified.c' || echo '$(srcdir)/'`getnameinfo_verified.c libroken_la-getprogname.lo: getprogname.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getprogname.lo -MD -MP -MF $(DEPDIR)/libroken_la-getprogname.Tpo -c -o libroken_la-getprogname.lo `test -f 'getprogname.c' || echo '$(srcdir)/'`getprogname.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-getprogname.Tpo $(DEPDIR)/libroken_la-getprogname.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='getprogname.c' object='libroken_la-getprogname.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getprogname.lo -MD -MP -MF $(DEPDIR)/libroken_la-getprogname.Tpo -c -o libroken_la-getprogname.lo `test -f 'getprogname.c' || echo '$(srcdir)/'`getprogname.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-getprogname.Tpo $(DEPDIR)/libroken_la-getprogname.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getprogname.c' object='libroken_la-getprogname.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getprogname.lo `test -f 'getprogname.c' || echo '$(srcdir)/'`getprogname.c + +libroken_la-getxxyyy.lo: getxxyyy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-getxxyyy.lo -MD -MP -MF $(DEPDIR)/libroken_la-getxxyyy.Tpo -c -o libroken_la-getxxyyy.lo `test -f 'getxxyyy.c' || echo '$(srcdir)/'`getxxyyy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-getxxyyy.Tpo $(DEPDIR)/libroken_la-getxxyyy.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getxxyyy.c' object='libroken_la-getxxyyy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getprogname.lo `test -f 'getprogname.c' || echo '$(srcdir)/'`getprogname.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-getxxyyy.lo `test -f 'getxxyyy.c' || echo '$(srcdir)/'`getxxyyy.c libroken_la-h_errno.lo: h_errno.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-h_errno.lo -MD -MP -MF $(DEPDIR)/libroken_la-h_errno.Tpo -c -o libroken_la-h_errno.lo `test -f 'h_errno.c' || echo '$(srcdir)/'`h_errno.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-h_errno.Tpo $(DEPDIR)/libroken_la-h_errno.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='h_errno.c' object='libroken_la-h_errno.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-h_errno.lo -MD -MP -MF $(DEPDIR)/libroken_la-h_errno.Tpo -c -o libroken_la-h_errno.lo `test -f 'h_errno.c' || echo '$(srcdir)/'`h_errno.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-h_errno.Tpo $(DEPDIR)/libroken_la-h_errno.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='h_errno.c' object='libroken_la-h_errno.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-h_errno.lo `test -f 'h_errno.c' || echo '$(srcdir)/'`h_errno.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-h_errno.lo `test -f 'h_errno.c' || echo '$(srcdir)/'`h_errno.c libroken_la-hex.lo: hex.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-hex.lo -MD -MP -MF $(DEPDIR)/libroken_la-hex.Tpo -c -o libroken_la-hex.lo `test -f 'hex.c' || echo '$(srcdir)/'`hex.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-hex.Tpo $(DEPDIR)/libroken_la-hex.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hex.c' object='libroken_la-hex.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-hex.lo -MD -MP -MF $(DEPDIR)/libroken_la-hex.Tpo -c -o libroken_la-hex.lo `test -f 'hex.c' || echo '$(srcdir)/'`hex.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-hex.Tpo $(DEPDIR)/libroken_la-hex.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hex.c' object='libroken_la-hex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-hex.lo `test -f 'hex.c' || echo '$(srcdir)/'`hex.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-hex.lo `test -f 'hex.c' || echo '$(srcdir)/'`hex.c libroken_la-hostent_find_fqdn.lo: hostent_find_fqdn.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-hostent_find_fqdn.lo -MD -MP -MF $(DEPDIR)/libroken_la-hostent_find_fqdn.Tpo -c -o libroken_la-hostent_find_fqdn.lo `test -f 'hostent_find_fqdn.c' || echo '$(srcdir)/'`hostent_find_fqdn.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-hostent_find_fqdn.Tpo $(DEPDIR)/libroken_la-hostent_find_fqdn.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hostent_find_fqdn.c' object='libroken_la-hostent_find_fqdn.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-hostent_find_fqdn.lo -MD -MP -MF $(DEPDIR)/libroken_la-hostent_find_fqdn.Tpo -c -o libroken_la-hostent_find_fqdn.lo `test -f 'hostent_find_fqdn.c' || echo '$(srcdir)/'`hostent_find_fqdn.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-hostent_find_fqdn.Tpo $(DEPDIR)/libroken_la-hostent_find_fqdn.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='hostent_find_fqdn.c' object='libroken_la-hostent_find_fqdn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-hostent_find_fqdn.lo `test -f 'hostent_find_fqdn.c' || echo '$(srcdir)/'`hostent_find_fqdn.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-hostent_find_fqdn.lo `test -f 'hostent_find_fqdn.c' || echo '$(srcdir)/'`hostent_find_fqdn.c libroken_la-issuid.lo: issuid.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-issuid.lo -MD -MP -MF $(DEPDIR)/libroken_la-issuid.Tpo -c -o libroken_la-issuid.lo `test -f 'issuid.c' || echo '$(srcdir)/'`issuid.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-issuid.Tpo $(DEPDIR)/libroken_la-issuid.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='issuid.c' object='libroken_la-issuid.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-issuid.lo -MD -MP -MF $(DEPDIR)/libroken_la-issuid.Tpo -c -o libroken_la-issuid.lo `test -f 'issuid.c' || echo '$(srcdir)/'`issuid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-issuid.Tpo $(DEPDIR)/libroken_la-issuid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='issuid.c' object='libroken_la-issuid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-issuid.lo `test -f 'issuid.c' || echo '$(srcdir)/'`issuid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-issuid.lo `test -f 'issuid.c' || echo '$(srcdir)/'`issuid.c libroken_la-k_getpwnam.lo: k_getpwnam.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-k_getpwnam.lo -MD -MP -MF $(DEPDIR)/libroken_la-k_getpwnam.Tpo -c -o libroken_la-k_getpwnam.lo `test -f 'k_getpwnam.c' || echo '$(srcdir)/'`k_getpwnam.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-k_getpwnam.Tpo $(DEPDIR)/libroken_la-k_getpwnam.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='k_getpwnam.c' object='libroken_la-k_getpwnam.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-k_getpwnam.lo -MD -MP -MF $(DEPDIR)/libroken_la-k_getpwnam.Tpo -c -o libroken_la-k_getpwnam.lo `test -f 'k_getpwnam.c' || echo '$(srcdir)/'`k_getpwnam.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-k_getpwnam.Tpo $(DEPDIR)/libroken_la-k_getpwnam.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_getpwnam.c' object='libroken_la-k_getpwnam.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-k_getpwnam.lo `test -f 'k_getpwnam.c' || echo '$(srcdir)/'`k_getpwnam.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-k_getpwnam.lo `test -f 'k_getpwnam.c' || echo '$(srcdir)/'`k_getpwnam.c libroken_la-k_getpwuid.lo: k_getpwuid.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-k_getpwuid.lo -MD -MP -MF $(DEPDIR)/libroken_la-k_getpwuid.Tpo -c -o libroken_la-k_getpwuid.lo `test -f 'k_getpwuid.c' || echo '$(srcdir)/'`k_getpwuid.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-k_getpwuid.Tpo $(DEPDIR)/libroken_la-k_getpwuid.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='k_getpwuid.c' object='libroken_la-k_getpwuid.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-k_getpwuid.lo -MD -MP -MF $(DEPDIR)/libroken_la-k_getpwuid.Tpo -c -o libroken_la-k_getpwuid.lo `test -f 'k_getpwuid.c' || echo '$(srcdir)/'`k_getpwuid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-k_getpwuid.Tpo $(DEPDIR)/libroken_la-k_getpwuid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='k_getpwuid.c' object='libroken_la-k_getpwuid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-k_getpwuid.lo `test -f 'k_getpwuid.c' || echo '$(srcdir)/'`k_getpwuid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-k_getpwuid.lo `test -f 'k_getpwuid.c' || echo '$(srcdir)/'`k_getpwuid.c libroken_la-mini_inetd.lo: mini_inetd.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-mini_inetd.lo -MD -MP -MF $(DEPDIR)/libroken_la-mini_inetd.Tpo -c -o libroken_la-mini_inetd.lo `test -f 'mini_inetd.c' || echo '$(srcdir)/'`mini_inetd.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-mini_inetd.Tpo $(DEPDIR)/libroken_la-mini_inetd.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='mini_inetd.c' object='libroken_la-mini_inetd.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-mini_inetd.lo -MD -MP -MF $(DEPDIR)/libroken_la-mini_inetd.Tpo -c -o libroken_la-mini_inetd.lo `test -f 'mini_inetd.c' || echo '$(srcdir)/'`mini_inetd.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-mini_inetd.Tpo $(DEPDIR)/libroken_la-mini_inetd.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mini_inetd.c' object='libroken_la-mini_inetd.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-mini_inetd.lo `test -f 'mini_inetd.c' || echo '$(srcdir)/'`mini_inetd.c + +libroken_la-mkdir.lo: mkdir.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-mkdir.lo -MD -MP -MF $(DEPDIR)/libroken_la-mkdir.Tpo -c -o libroken_la-mkdir.lo `test -f 'mkdir.c' || echo '$(srcdir)/'`mkdir.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-mkdir.Tpo $(DEPDIR)/libroken_la-mkdir.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mkdir.c' object='libroken_la-mkdir.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-mini_inetd.lo `test -f 'mini_inetd.c' || echo '$(srcdir)/'`mini_inetd.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-mkdir.lo `test -f 'mkdir.c' || echo '$(srcdir)/'`mkdir.c libroken_la-net_read.lo: net_read.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-net_read.lo -MD -MP -MF $(DEPDIR)/libroken_la-net_read.Tpo -c -o libroken_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-net_read.Tpo $(DEPDIR)/libroken_la-net_read.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='net_read.c' object='libroken_la-net_read.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-net_read.lo -MD -MP -MF $(DEPDIR)/libroken_la-net_read.Tpo -c -o libroken_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-net_read.Tpo $(DEPDIR)/libroken_la-net_read.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net_read.c' object='libroken_la-net_read.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-net_read.lo `test -f 'net_read.c' || echo '$(srcdir)/'`net_read.c libroken_la-net_write.lo: net_write.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-net_write.lo -MD -MP -MF $(DEPDIR)/libroken_la-net_write.Tpo -c -o libroken_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-net_write.Tpo $(DEPDIR)/libroken_la-net_write.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='net_write.c' object='libroken_la-net_write.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-net_write.lo -MD -MP -MF $(DEPDIR)/libroken_la-net_write.Tpo -c -o libroken_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-net_write.Tpo $(DEPDIR)/libroken_la-net_write.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='net_write.c' object='libroken_la-net_write.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-net_write.lo `test -f 'net_write.c' || echo '$(srcdir)/'`net_write.c libroken_la-parse_bytes.lo: parse_bytes.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-parse_bytes.lo -MD -MP -MF $(DEPDIR)/libroken_la-parse_bytes.Tpo -c -o libroken_la-parse_bytes.lo `test -f 'parse_bytes.c' || echo '$(srcdir)/'`parse_bytes.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-parse_bytes.Tpo $(DEPDIR)/libroken_la-parse_bytes.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse_bytes.c' object='libroken_la-parse_bytes.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-parse_bytes.lo -MD -MP -MF $(DEPDIR)/libroken_la-parse_bytes.Tpo -c -o libroken_la-parse_bytes.lo `test -f 'parse_bytes.c' || echo '$(srcdir)/'`parse_bytes.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-parse_bytes.Tpo $(DEPDIR)/libroken_la-parse_bytes.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse_bytes.c' object='libroken_la-parse_bytes.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-parse_bytes.lo `test -f 'parse_bytes.c' || echo '$(srcdir)/'`parse_bytes.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-parse_bytes.lo `test -f 'parse_bytes.c' || echo '$(srcdir)/'`parse_bytes.c libroken_la-parse_time.lo: parse_time.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-parse_time.lo -MD -MP -MF $(DEPDIR)/libroken_la-parse_time.Tpo -c -o libroken_la-parse_time.lo `test -f 'parse_time.c' || echo '$(srcdir)/'`parse_time.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-parse_time.Tpo $(DEPDIR)/libroken_la-parse_time.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse_time.c' object='libroken_la-parse_time.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-parse_time.lo -MD -MP -MF $(DEPDIR)/libroken_la-parse_time.Tpo -c -o libroken_la-parse_time.lo `test -f 'parse_time.c' || echo '$(srcdir)/'`parse_time.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-parse_time.Tpo $(DEPDIR)/libroken_la-parse_time.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse_time.c' object='libroken_la-parse_time.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-parse_time.lo `test -f 'parse_time.c' || echo '$(srcdir)/'`parse_time.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-parse_time.lo `test -f 'parse_time.c' || echo '$(srcdir)/'`parse_time.c libroken_la-parse_units.lo: parse_units.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-parse_units.lo -MD -MP -MF $(DEPDIR)/libroken_la-parse_units.Tpo -c -o libroken_la-parse_units.lo `test -f 'parse_units.c' || echo '$(srcdir)/'`parse_units.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-parse_units.Tpo $(DEPDIR)/libroken_la-parse_units.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse_units.c' object='libroken_la-parse_units.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-parse_units.lo -MD -MP -MF $(DEPDIR)/libroken_la-parse_units.Tpo -c -o libroken_la-parse_units.lo `test -f 'parse_units.c' || echo '$(srcdir)/'`parse_units.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-parse_units.Tpo $(DEPDIR)/libroken_la-parse_units.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse_units.c' object='libroken_la-parse_units.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-parse_units.lo `test -f 'parse_units.c' || echo '$(srcdir)/'`parse_units.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-parse_units.lo `test -f 'parse_units.c' || echo '$(srcdir)/'`parse_units.c libroken_la-qsort.lo: qsort.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-qsort.lo -MD -MP -MF $(DEPDIR)/libroken_la-qsort.Tpo -c -o libroken_la-qsort.lo `test -f 'qsort.c' || echo '$(srcdir)/'`qsort.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-qsort.Tpo $(DEPDIR)/libroken_la-qsort.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='qsort.c' object='libroken_la-qsort.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-qsort.lo -MD -MP -MF $(DEPDIR)/libroken_la-qsort.Tpo -c -o libroken_la-qsort.lo `test -f 'qsort.c' || echo '$(srcdir)/'`qsort.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-qsort.Tpo $(DEPDIR)/libroken_la-qsort.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='qsort.c' object='libroken_la-qsort.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-qsort.lo `test -f 'qsort.c' || echo '$(srcdir)/'`qsort.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-qsort.lo `test -f 'qsort.c' || echo '$(srcdir)/'`qsort.c libroken_la-rand.lo: rand.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-rand.lo -MD -MP -MF $(DEPDIR)/libroken_la-rand.Tpo -c -o libroken_la-rand.lo `test -f 'rand.c' || echo '$(srcdir)/'`rand.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-rand.Tpo $(DEPDIR)/libroken_la-rand.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rand.c' object='libroken_la-rand.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-rand.lo -MD -MP -MF $(DEPDIR)/libroken_la-rand.Tpo -c -o libroken_la-rand.lo `test -f 'rand.c' || echo '$(srcdir)/'`rand.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-rand.Tpo $(DEPDIR)/libroken_la-rand.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rand.c' object='libroken_la-rand.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-rand.lo `test -f 'rand.c' || echo '$(srcdir)/'`rand.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-rand.lo `test -f 'rand.c' || echo '$(srcdir)/'`rand.c libroken_la-realloc.lo: realloc.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-realloc.lo -MD -MP -MF $(DEPDIR)/libroken_la-realloc.Tpo -c -o libroken_la-realloc.lo `test -f 'realloc.c' || echo '$(srcdir)/'`realloc.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-realloc.Tpo $(DEPDIR)/libroken_la-realloc.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='realloc.c' object='libroken_la-realloc.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-realloc.lo -MD -MP -MF $(DEPDIR)/libroken_la-realloc.Tpo -c -o libroken_la-realloc.lo `test -f 'realloc.c' || echo '$(srcdir)/'`realloc.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-realloc.Tpo $(DEPDIR)/libroken_la-realloc.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='realloc.c' object='libroken_la-realloc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-realloc.lo `test -f 'realloc.c' || echo '$(srcdir)/'`realloc.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-realloc.lo `test -f 'realloc.c' || echo '$(srcdir)/'`realloc.c libroken_la-resolve.lo: resolve.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-resolve.lo -MD -MP -MF $(DEPDIR)/libroken_la-resolve.Tpo -c -o libroken_la-resolve.lo `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-resolve.Tpo $(DEPDIR)/libroken_la-resolve.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='resolve.c' object='libroken_la-resolve.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-resolve.lo -MD -MP -MF $(DEPDIR)/libroken_la-resolve.Tpo -c -o libroken_la-resolve.lo `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-resolve.Tpo $(DEPDIR)/libroken_la-resolve.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='resolve.c' object='libroken_la-resolve.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-resolve.lo `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-resolve.lo `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c libroken_la-roken_gethostby.lo: roken_gethostby.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-roken_gethostby.lo -MD -MP -MF $(DEPDIR)/libroken_la-roken_gethostby.Tpo -c -o libroken_la-roken_gethostby.lo `test -f 'roken_gethostby.c' || echo '$(srcdir)/'`roken_gethostby.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-roken_gethostby.Tpo $(DEPDIR)/libroken_la-roken_gethostby.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='roken_gethostby.c' object='libroken_la-roken_gethostby.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-roken_gethostby.lo -MD -MP -MF $(DEPDIR)/libroken_la-roken_gethostby.Tpo -c -o libroken_la-roken_gethostby.lo `test -f 'roken_gethostby.c' || echo '$(srcdir)/'`roken_gethostby.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-roken_gethostby.Tpo $(DEPDIR)/libroken_la-roken_gethostby.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='roken_gethostby.c' object='libroken_la-roken_gethostby.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-roken_gethostby.lo `test -f 'roken_gethostby.c' || echo '$(srcdir)/'`roken_gethostby.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-roken_gethostby.lo `test -f 'roken_gethostby.c' || echo '$(srcdir)/'`roken_gethostby.c libroken_la-rtbl.lo: rtbl.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-rtbl.lo -MD -MP -MF $(DEPDIR)/libroken_la-rtbl.Tpo -c -o libroken_la-rtbl.lo `test -f 'rtbl.c' || echo '$(srcdir)/'`rtbl.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-rtbl.Tpo $(DEPDIR)/libroken_la-rtbl.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rtbl.c' object='libroken_la-rtbl.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-rtbl.lo -MD -MP -MF $(DEPDIR)/libroken_la-rtbl.Tpo -c -o libroken_la-rtbl.lo `test -f 'rtbl.c' || echo '$(srcdir)/'`rtbl.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-rtbl.Tpo $(DEPDIR)/libroken_la-rtbl.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='rtbl.c' object='libroken_la-rtbl.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-rtbl.lo `test -f 'rtbl.c' || echo '$(srcdir)/'`rtbl.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-rtbl.lo `test -f 'rtbl.c' || echo '$(srcdir)/'`rtbl.c libroken_la-setprogname.lo: setprogname.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-setprogname.lo -MD -MP -MF $(DEPDIR)/libroken_la-setprogname.Tpo -c -o libroken_la-setprogname.lo `test -f 'setprogname.c' || echo '$(srcdir)/'`setprogname.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-setprogname.Tpo $(DEPDIR)/libroken_la-setprogname.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='setprogname.c' object='libroken_la-setprogname.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-setprogname.lo -MD -MP -MF $(DEPDIR)/libroken_la-setprogname.Tpo -c -o libroken_la-setprogname.lo `test -f 'setprogname.c' || echo '$(srcdir)/'`setprogname.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-setprogname.Tpo $(DEPDIR)/libroken_la-setprogname.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='setprogname.c' object='libroken_la-setprogname.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-setprogname.lo `test -f 'setprogname.c' || echo '$(srcdir)/'`setprogname.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-setprogname.lo `test -f 'setprogname.c' || echo '$(srcdir)/'`setprogname.c libroken_la-signal.lo: signal.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-signal.lo -MD -MP -MF $(DEPDIR)/libroken_la-signal.Tpo -c -o libroken_la-signal.lo `test -f 'signal.c' || echo '$(srcdir)/'`signal.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-signal.Tpo $(DEPDIR)/libroken_la-signal.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='signal.c' object='libroken_la-signal.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-signal.lo -MD -MP -MF $(DEPDIR)/libroken_la-signal.Tpo -c -o libroken_la-signal.lo `test -f 'signal.c' || echo '$(srcdir)/'`signal.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-signal.Tpo $(DEPDIR)/libroken_la-signal.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='signal.c' object='libroken_la-signal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-signal.lo `test -f 'signal.c' || echo '$(srcdir)/'`signal.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-signal.lo `test -f 'signal.c' || echo '$(srcdir)/'`signal.c libroken_la-simple_exec.lo: simple_exec.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-simple_exec.lo -MD -MP -MF $(DEPDIR)/libroken_la-simple_exec.Tpo -c -o libroken_la-simple_exec.lo `test -f 'simple_exec.c' || echo '$(srcdir)/'`simple_exec.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-simple_exec.Tpo $(DEPDIR)/libroken_la-simple_exec.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='simple_exec.c' object='libroken_la-simple_exec.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-simple_exec.lo -MD -MP -MF $(DEPDIR)/libroken_la-simple_exec.Tpo -c -o libroken_la-simple_exec.lo `test -f 'simple_exec.c' || echo '$(srcdir)/'`simple_exec.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-simple_exec.Tpo $(DEPDIR)/libroken_la-simple_exec.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simple_exec.c' object='libroken_la-simple_exec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-simple_exec.lo `test -f 'simple_exec.c' || echo '$(srcdir)/'`simple_exec.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-simple_exec.lo `test -f 'simple_exec.c' || echo '$(srcdir)/'`simple_exec.c libroken_la-snprintf.lo: snprintf.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-snprintf.lo -MD -MP -MF $(DEPDIR)/libroken_la-snprintf.Tpo -c -o libroken_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-snprintf.Tpo $(DEPDIR)/libroken_la-snprintf.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='snprintf.c' object='libroken_la-snprintf.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-snprintf.lo -MD -MP -MF $(DEPDIR)/libroken_la-snprintf.Tpo -c -o libroken_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-snprintf.Tpo $(DEPDIR)/libroken_la-snprintf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='snprintf.c' object='libroken_la-snprintf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c libroken_la-socket.lo: socket.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-socket.lo -MD -MP -MF $(DEPDIR)/libroken_la-socket.Tpo -c -o libroken_la-socket.lo `test -f 'socket.c' || echo '$(srcdir)/'`socket.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-socket.Tpo $(DEPDIR)/libroken_la-socket.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='socket.c' object='libroken_la-socket.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-socket.lo -MD -MP -MF $(DEPDIR)/libroken_la-socket.Tpo -c -o libroken_la-socket.lo `test -f 'socket.c' || echo '$(srcdir)/'`socket.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-socket.Tpo $(DEPDIR)/libroken_la-socket.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='socket.c' object='libroken_la-socket.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-socket.lo `test -f 'socket.c' || echo '$(srcdir)/'`socket.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-socket.lo `test -f 'socket.c' || echo '$(srcdir)/'`socket.c libroken_la-strcollect.lo: strcollect.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-strcollect.lo -MD -MP -MF $(DEPDIR)/libroken_la-strcollect.Tpo -c -o libroken_la-strcollect.lo `test -f 'strcollect.c' || echo '$(srcdir)/'`strcollect.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-strcollect.Tpo $(DEPDIR)/libroken_la-strcollect.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strcollect.c' object='libroken_la-strcollect.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-strcollect.lo -MD -MP -MF $(DEPDIR)/libroken_la-strcollect.Tpo -c -o libroken_la-strcollect.lo `test -f 'strcollect.c' || echo '$(srcdir)/'`strcollect.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-strcollect.Tpo $(DEPDIR)/libroken_la-strcollect.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strcollect.c' object='libroken_la-strcollect.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-strcollect.lo `test -f 'strcollect.c' || echo '$(srcdir)/'`strcollect.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-strcollect.lo `test -f 'strcollect.c' || echo '$(srcdir)/'`strcollect.c libroken_la-strerror_r.lo: strerror_r.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-strerror_r.lo -MD -MP -MF $(DEPDIR)/libroken_la-strerror_r.Tpo -c -o libroken_la-strerror_r.lo `test -f 'strerror_r.c' || echo '$(srcdir)/'`strerror_r.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-strerror_r.Tpo $(DEPDIR)/libroken_la-strerror_r.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strerror_r.c' object='libroken_la-strerror_r.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-strerror_r.lo -MD -MP -MF $(DEPDIR)/libroken_la-strerror_r.Tpo -c -o libroken_la-strerror_r.lo `test -f 'strerror_r.c' || echo '$(srcdir)/'`strerror_r.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-strerror_r.Tpo $(DEPDIR)/libroken_la-strerror_r.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strerror_r.c' object='libroken_la-strerror_r.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-strerror_r.lo `test -f 'strerror_r.c' || echo '$(srcdir)/'`strerror_r.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-strerror_r.lo `test -f 'strerror_r.c' || echo '$(srcdir)/'`strerror_r.c libroken_la-strpool.lo: strpool.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-strpool.lo -MD -MP -MF $(DEPDIR)/libroken_la-strpool.Tpo -c -o libroken_la-strpool.lo `test -f 'strpool.c' || echo '$(srcdir)/'`strpool.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-strpool.Tpo $(DEPDIR)/libroken_la-strpool.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strpool.c' object='libroken_la-strpool.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-strpool.lo -MD -MP -MF $(DEPDIR)/libroken_la-strpool.Tpo -c -o libroken_la-strpool.lo `test -f 'strpool.c' || echo '$(srcdir)/'`strpool.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-strpool.Tpo $(DEPDIR)/libroken_la-strpool.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strpool.c' object='libroken_la-strpool.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-strpool.lo `test -f 'strpool.c' || echo '$(srcdir)/'`strpool.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-strpool.lo `test -f 'strpool.c' || echo '$(srcdir)/'`strpool.c libroken_la-timeval.lo: timeval.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-timeval.lo -MD -MP -MF $(DEPDIR)/libroken_la-timeval.Tpo -c -o libroken_la-timeval.lo `test -f 'timeval.c' || echo '$(srcdir)/'`timeval.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-timeval.Tpo $(DEPDIR)/libroken_la-timeval.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='timeval.c' object='libroken_la-timeval.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-timeval.lo -MD -MP -MF $(DEPDIR)/libroken_la-timeval.Tpo -c -o libroken_la-timeval.lo `test -f 'timeval.c' || echo '$(srcdir)/'`timeval.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-timeval.Tpo $(DEPDIR)/libroken_la-timeval.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='timeval.c' object='libroken_la-timeval.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-timeval.lo `test -f 'timeval.c' || echo '$(srcdir)/'`timeval.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-timeval.lo `test -f 'timeval.c' || echo '$(srcdir)/'`timeval.c libroken_la-tm2time.lo: tm2time.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-tm2time.lo -MD -MP -MF $(DEPDIR)/libroken_la-tm2time.Tpo -c -o libroken_la-tm2time.lo `test -f 'tm2time.c' || echo '$(srcdir)/'`tm2time.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-tm2time.Tpo $(DEPDIR)/libroken_la-tm2time.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tm2time.c' object='libroken_la-tm2time.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-tm2time.lo -MD -MP -MF $(DEPDIR)/libroken_la-tm2time.Tpo -c -o libroken_la-tm2time.lo `test -f 'tm2time.c' || echo '$(srcdir)/'`tm2time.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-tm2time.Tpo $(DEPDIR)/libroken_la-tm2time.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tm2time.c' object='libroken_la-tm2time.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-tm2time.lo `test -f 'tm2time.c' || echo '$(srcdir)/'`tm2time.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-tm2time.lo `test -f 'tm2time.c' || echo '$(srcdir)/'`tm2time.c libroken_la-unvis.lo: unvis.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-unvis.lo -MD -MP -MF $(DEPDIR)/libroken_la-unvis.Tpo -c -o libroken_la-unvis.lo `test -f 'unvis.c' || echo '$(srcdir)/'`unvis.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-unvis.Tpo $(DEPDIR)/libroken_la-unvis.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='unvis.c' object='libroken_la-unvis.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-unvis.lo -MD -MP -MF $(DEPDIR)/libroken_la-unvis.Tpo -c -o libroken_la-unvis.lo `test -f 'unvis.c' || echo '$(srcdir)/'`unvis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-unvis.Tpo $(DEPDIR)/libroken_la-unvis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='unvis.c' object='libroken_la-unvis.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-unvis.lo `test -f 'unvis.c' || echo '$(srcdir)/'`unvis.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-unvis.lo `test -f 'unvis.c' || echo '$(srcdir)/'`unvis.c libroken_la-verify.lo: verify.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-verify.lo -MD -MP -MF $(DEPDIR)/libroken_la-verify.Tpo -c -o libroken_la-verify.lo `test -f 'verify.c' || echo '$(srcdir)/'`verify.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-verify.Tpo $(DEPDIR)/libroken_la-verify.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='verify.c' object='libroken_la-verify.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-verify.lo -MD -MP -MF $(DEPDIR)/libroken_la-verify.Tpo -c -o libroken_la-verify.lo `test -f 'verify.c' || echo '$(srcdir)/'`verify.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-verify.Tpo $(DEPDIR)/libroken_la-verify.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='verify.c' object='libroken_la-verify.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-verify.lo `test -f 'verify.c' || echo '$(srcdir)/'`verify.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-verify.lo `test -f 'verify.c' || echo '$(srcdir)/'`verify.c libroken_la-vis.lo: vis.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-vis.lo -MD -MP -MF $(DEPDIR)/libroken_la-vis.Tpo -c -o libroken_la-vis.lo `test -f 'vis.c' || echo '$(srcdir)/'`vis.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-vis.Tpo $(DEPDIR)/libroken_la-vis.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='vis.c' object='libroken_la-vis.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-vis.lo -MD -MP -MF $(DEPDIR)/libroken_la-vis.Tpo -c -o libroken_la-vis.lo `test -f 'vis.c' || echo '$(srcdir)/'`vis.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-vis.Tpo $(DEPDIR)/libroken_la-vis.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='vis.c' object='libroken_la-vis.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-vis.lo `test -f 'vis.c' || echo '$(srcdir)/'`vis.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-vis.lo `test -f 'vis.c' || echo '$(srcdir)/'`vis.c libroken_la-warnerr.lo: warnerr.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-warnerr.lo -MD -MP -MF $(DEPDIR)/libroken_la-warnerr.Tpo -c -o libroken_la-warnerr.lo `test -f 'warnerr.c' || echo '$(srcdir)/'`warnerr.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-warnerr.Tpo $(DEPDIR)/libroken_la-warnerr.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='warnerr.c' object='libroken_la-warnerr.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-warnerr.lo -MD -MP -MF $(DEPDIR)/libroken_la-warnerr.Tpo -c -o libroken_la-warnerr.lo `test -f 'warnerr.c' || echo '$(srcdir)/'`warnerr.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-warnerr.Tpo $(DEPDIR)/libroken_la-warnerr.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='warnerr.c' object='libroken_la-warnerr.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-warnerr.lo `test -f 'warnerr.c' || echo '$(srcdir)/'`warnerr.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-warnerr.lo `test -f 'warnerr.c' || echo '$(srcdir)/'`warnerr.c libroken_la-write_pid.lo: write_pid.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-write_pid.lo -MD -MP -MF $(DEPDIR)/libroken_la-write_pid.Tpo -c -o libroken_la-write_pid.lo `test -f 'write_pid.c' || echo '$(srcdir)/'`write_pid.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-write_pid.Tpo $(DEPDIR)/libroken_la-write_pid.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='write_pid.c' object='libroken_la-write_pid.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-write_pid.lo -MD -MP -MF $(DEPDIR)/libroken_la-write_pid.Tpo -c -o libroken_la-write_pid.lo `test -f 'write_pid.c' || echo '$(srcdir)/'`write_pid.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-write_pid.Tpo $(DEPDIR)/libroken_la-write_pid.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='write_pid.c' object='libroken_la-write_pid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-write_pid.lo `test -f 'write_pid.c' || echo '$(srcdir)/'`write_pid.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-write_pid.lo `test -f 'write_pid.c' || echo '$(srcdir)/'`write_pid.c libroken_la-xfree.lo: xfree.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-xfree.lo -MD -MP -MF $(DEPDIR)/libroken_la-xfree.Tpo -c -o libroken_la-xfree.lo `test -f 'xfree.c' || echo '$(srcdir)/'`xfree.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-xfree.Tpo $(DEPDIR)/libroken_la-xfree.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xfree.c' object='libroken_la-xfree.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-xfree.lo -MD -MP -MF $(DEPDIR)/libroken_la-xfree.Tpo -c -o libroken_la-xfree.lo `test -f 'xfree.c' || echo '$(srcdir)/'`xfree.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-xfree.Tpo $(DEPDIR)/libroken_la-xfree.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='xfree.c' object='libroken_la-xfree.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-xfree.lo `test -f 'xfree.c' || echo '$(srcdir)/'`xfree.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-xfree.lo `test -f 'xfree.c' || echo '$(srcdir)/'`xfree.c libroken_la-socket_wrapper.lo: socket_wrapper.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-socket_wrapper.lo -MD -MP -MF $(DEPDIR)/libroken_la-socket_wrapper.Tpo -c -o libroken_la-socket_wrapper.lo `test -f 'socket_wrapper.c' || echo '$(srcdir)/'`socket_wrapper.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libroken_la-socket_wrapper.Tpo $(DEPDIR)/libroken_la-socket_wrapper.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='socket_wrapper.c' object='libroken_la-socket_wrapper.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libroken_la-socket_wrapper.lo -MD -MP -MF $(DEPDIR)/libroken_la-socket_wrapper.Tpo -c -o libroken_la-socket_wrapper.lo `test -f 'socket_wrapper.c' || echo '$(srcdir)/'`socket_wrapper.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libroken_la-socket_wrapper.Tpo $(DEPDIR)/libroken_la-socket_wrapper.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='socket_wrapper.c' object='libroken_la-socket_wrapper.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-socket_wrapper.lo `test -f 'socket_wrapper.c' || echo '$(srcdir)/'`socket_wrapper.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libroken_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libroken_la-socket_wrapper.lo `test -f 'socket_wrapper.c' || echo '$(srcdir)/'`socket_wrapper.c libtest_la-strftime.lo: strftime.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-strftime.lo -MD -MP -MF $(DEPDIR)/libtest_la-strftime.Tpo -c -o libtest_la-strftime.lo `test -f 'strftime.c' || echo '$(srcdir)/'`strftime.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libtest_la-strftime.Tpo $(DEPDIR)/libtest_la-strftime.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strftime.c' object='libtest_la-strftime.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-strftime.lo -MD -MP -MF $(DEPDIR)/libtest_la-strftime.Tpo -c -o libtest_la-strftime.lo `test -f 'strftime.c' || echo '$(srcdir)/'`strftime.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtest_la-strftime.Tpo $(DEPDIR)/libtest_la-strftime.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strftime.c' object='libtest_la-strftime.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-strftime.lo `test -f 'strftime.c' || echo '$(srcdir)/'`strftime.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-strftime.lo `test -f 'strftime.c' || echo '$(srcdir)/'`strftime.c libtest_la-strptime.lo: strptime.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-strptime.lo -MD -MP -MF $(DEPDIR)/libtest_la-strptime.Tpo -c -o libtest_la-strptime.lo `test -f 'strptime.c' || echo '$(srcdir)/'`strptime.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libtest_la-strptime.Tpo $(DEPDIR)/libtest_la-strptime.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strptime.c' object='libtest_la-strptime.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-strptime.lo -MD -MP -MF $(DEPDIR)/libtest_la-strptime.Tpo -c -o libtest_la-strptime.lo `test -f 'strptime.c' || echo '$(srcdir)/'`strptime.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtest_la-strptime.Tpo $(DEPDIR)/libtest_la-strptime.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strptime.c' object='libtest_la-strptime.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-strptime.lo `test -f 'strptime.c' || echo '$(srcdir)/'`strptime.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-strptime.lo `test -f 'strptime.c' || echo '$(srcdir)/'`strptime.c libtest_la-snprintf.lo: snprintf.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-snprintf.lo -MD -MP -MF $(DEPDIR)/libtest_la-snprintf.Tpo -c -o libtest_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libtest_la-snprintf.Tpo $(DEPDIR)/libtest_la-snprintf.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='snprintf.c' object='libtest_la-snprintf.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-snprintf.lo -MD -MP -MF $(DEPDIR)/libtest_la-snprintf.Tpo -c -o libtest_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtest_la-snprintf.Tpo $(DEPDIR)/libtest_la-snprintf.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='snprintf.c' object='libtest_la-snprintf.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-snprintf.lo `test -f 'snprintf.c' || echo '$(srcdir)/'`snprintf.c libtest_la-tsearch.lo: tsearch.c -@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-tsearch.lo -MD -MP -MF $(DEPDIR)/libtest_la-tsearch.Tpo -c -o libtest_la-tsearch.lo `test -f 'tsearch.c' || echo '$(srcdir)/'`tsearch.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libtest_la-tsearch.Tpo $(DEPDIR)/libtest_la-tsearch.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tsearch.c' object='libtest_la-tsearch.lo' libtool=yes @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -MT libtest_la-tsearch.lo -MD -MP -MF $(DEPDIR)/libtest_la-tsearch.Tpo -c -o libtest_la-tsearch.lo `test -f 'tsearch.c' || echo '$(srcdir)/'`tsearch.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libtest_la-tsearch.Tpo $(DEPDIR)/libtest_la-tsearch.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tsearch.c' object='libtest_la-tsearch.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-tsearch.lo `test -f 'tsearch.c' || echo '$(srcdir)/'`tsearch.c + +getxxyyy_test-getxxyyy.o: getxxyyy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getxxyyy_test_CFLAGS) $(CFLAGS) -MT getxxyyy_test-getxxyyy.o -MD -MP -MF $(DEPDIR)/getxxyyy_test-getxxyyy.Tpo -c -o getxxyyy_test-getxxyyy.o `test -f 'getxxyyy.c' || echo '$(srcdir)/'`getxxyyy.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getxxyyy_test-getxxyyy.Tpo $(DEPDIR)/getxxyyy_test-getxxyyy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getxxyyy.c' object='getxxyyy_test-getxxyyy.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getxxyyy_test_CFLAGS) $(CFLAGS) -c -o getxxyyy_test-getxxyyy.o `test -f 'getxxyyy.c' || echo '$(srcdir)/'`getxxyyy.c + +getxxyyy_test-getxxyyy.obj: getxxyyy.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getxxyyy_test_CFLAGS) $(CFLAGS) -MT getxxyyy_test-getxxyyy.obj -MD -MP -MF $(DEPDIR)/getxxyyy_test-getxxyyy.Tpo -c -o getxxyyy_test-getxxyyy.obj `if test -f 'getxxyyy.c'; then $(CYGPATH_W) 'getxxyyy.c'; else $(CYGPATH_W) '$(srcdir)/getxxyyy.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/getxxyyy_test-getxxyyy.Tpo $(DEPDIR)/getxxyyy_test-getxxyyy.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getxxyyy.c' object='getxxyyy_test-getxxyyy.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libtest_la_CFLAGS) $(CFLAGS) -c -o libtest_la-tsearch.lo `test -f 'tsearch.c' || echo '$(srcdir)/'`tsearch.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(getxxyyy_test_CFLAGS) $(CFLAGS) -c -o getxxyyy_test-getxxyyy.obj `if test -f 'getxxyyy.c'; then $(CYGPATH_W) 'getxxyyy.c'; else $(CYGPATH_W) '$(srcdir)/getxxyyy.c'; fi` parse_reply_test-parse_reply-test.o: parse_reply-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-parse_reply-test.o -MD -MP -MF $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo -c -o parse_reply_test-parse_reply-test.o `test -f 'parse_reply-test.c' || echo '$(srcdir)/'`parse_reply-test.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo $(DEPDIR)/parse_reply_test-parse_reply-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse_reply-test.c' object='parse_reply_test-parse_reply-test.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-parse_reply-test.o -MD -MP -MF $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo -c -o parse_reply_test-parse_reply-test.o `test -f 'parse_reply-test.c' || echo '$(srcdir)/'`parse_reply-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo $(DEPDIR)/parse_reply_test-parse_reply-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse_reply-test.c' object='parse_reply_test-parse_reply-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-parse_reply-test.o `test -f 'parse_reply-test.c' || echo '$(srcdir)/'`parse_reply-test.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-parse_reply-test.o `test -f 'parse_reply-test.c' || echo '$(srcdir)/'`parse_reply-test.c parse_reply_test-parse_reply-test.obj: parse_reply-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-parse_reply-test.obj -MD -MP -MF $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo -c -o parse_reply_test-parse_reply-test.obj `if test -f 'parse_reply-test.c'; then $(CYGPATH_W) 'parse_reply-test.c'; else $(CYGPATH_W) '$(srcdir)/parse_reply-test.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo $(DEPDIR)/parse_reply_test-parse_reply-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='parse_reply-test.c' object='parse_reply_test-parse_reply-test.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-parse_reply-test.obj -MD -MP -MF $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo -c -o parse_reply_test-parse_reply-test.obj `if test -f 'parse_reply-test.c'; then $(CYGPATH_W) 'parse_reply-test.c'; else $(CYGPATH_W) '$(srcdir)/parse_reply-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse_reply_test-parse_reply-test.Tpo $(DEPDIR)/parse_reply_test-parse_reply-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parse_reply-test.c' object='parse_reply_test-parse_reply-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-parse_reply-test.obj `if test -f 'parse_reply-test.c'; then $(CYGPATH_W) 'parse_reply-test.c'; else $(CYGPATH_W) '$(srcdir)/parse_reply-test.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-parse_reply-test.obj `if test -f 'parse_reply-test.c'; then $(CYGPATH_W) 'parse_reply-test.c'; else $(CYGPATH_W) '$(srcdir)/parse_reply-test.c'; fi` parse_reply_test-resolve.o: resolve.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-resolve.o -MD -MP -MF $(DEPDIR)/parse_reply_test-resolve.Tpo -c -o parse_reply_test-resolve.o `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/parse_reply_test-resolve.Tpo $(DEPDIR)/parse_reply_test-resolve.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='resolve.c' object='parse_reply_test-resolve.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-resolve.o -MD -MP -MF $(DEPDIR)/parse_reply_test-resolve.Tpo -c -o parse_reply_test-resolve.o `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse_reply_test-resolve.Tpo $(DEPDIR)/parse_reply_test-resolve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='resolve.c' object='parse_reply_test-resolve.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-resolve.o `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-resolve.o `test -f 'resolve.c' || echo '$(srcdir)/'`resolve.c parse_reply_test-resolve.obj: resolve.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-resolve.obj -MD -MP -MF $(DEPDIR)/parse_reply_test-resolve.Tpo -c -o parse_reply_test-resolve.obj `if test -f 'resolve.c'; then $(CYGPATH_W) 'resolve.c'; else $(CYGPATH_W) '$(srcdir)/resolve.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/parse_reply_test-resolve.Tpo $(DEPDIR)/parse_reply_test-resolve.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='resolve.c' object='parse_reply_test-resolve.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -MT parse_reply_test-resolve.obj -MD -MP -MF $(DEPDIR)/parse_reply_test-resolve.Tpo -c -o parse_reply_test-resolve.obj `if test -f 'resolve.c'; then $(CYGPATH_W) 'resolve.c'; else $(CYGPATH_W) '$(srcdir)/resolve.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/parse_reply_test-resolve.Tpo $(DEPDIR)/parse_reply_test-resolve.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='resolve.c' object='parse_reply_test-resolve.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-resolve.obj `if test -f 'resolve.c'; then $(CYGPATH_W) 'resolve.c'; else $(CYGPATH_W) '$(srcdir)/resolve.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(parse_reply_test_CFLAGS) $(CFLAGS) -c -o parse_reply_test-resolve.obj `if test -f 'resolve.c'; then $(CYGPATH_W) 'resolve.c'; else $(CYGPATH_W) '$(srcdir)/resolve.c'; fi` snprintf_test-snprintf-test.o: snprintf-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -MT snprintf_test-snprintf-test.o -MD -MP -MF $(DEPDIR)/snprintf_test-snprintf-test.Tpo -c -o snprintf_test-snprintf-test.o `test -f 'snprintf-test.c' || echo '$(srcdir)/'`snprintf-test.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/snprintf_test-snprintf-test.Tpo $(DEPDIR)/snprintf_test-snprintf-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='snprintf-test.c' object='snprintf_test-snprintf-test.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -MT snprintf_test-snprintf-test.o -MD -MP -MF $(DEPDIR)/snprintf_test-snprintf-test.Tpo -c -o snprintf_test-snprintf-test.o `test -f 'snprintf-test.c' || echo '$(srcdir)/'`snprintf-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/snprintf_test-snprintf-test.Tpo $(DEPDIR)/snprintf_test-snprintf-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='snprintf-test.c' object='snprintf_test-snprintf-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -c -o snprintf_test-snprintf-test.o `test -f 'snprintf-test.c' || echo '$(srcdir)/'`snprintf-test.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -c -o snprintf_test-snprintf-test.o `test -f 'snprintf-test.c' || echo '$(srcdir)/'`snprintf-test.c snprintf_test-snprintf-test.obj: snprintf-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -MT snprintf_test-snprintf-test.obj -MD -MP -MF $(DEPDIR)/snprintf_test-snprintf-test.Tpo -c -o snprintf_test-snprintf-test.obj `if test -f 'snprintf-test.c'; then $(CYGPATH_W) 'snprintf-test.c'; else $(CYGPATH_W) '$(srcdir)/snprintf-test.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/snprintf_test-snprintf-test.Tpo $(DEPDIR)/snprintf_test-snprintf-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='snprintf-test.c' object='snprintf_test-snprintf-test.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -MT snprintf_test-snprintf-test.obj -MD -MP -MF $(DEPDIR)/snprintf_test-snprintf-test.Tpo -c -o snprintf_test-snprintf-test.obj `if test -f 'snprintf-test.c'; then $(CYGPATH_W) 'snprintf-test.c'; else $(CYGPATH_W) '$(srcdir)/snprintf-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/snprintf_test-snprintf-test.Tpo $(DEPDIR)/snprintf_test-snprintf-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='snprintf-test.c' object='snprintf_test-snprintf-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -c -o snprintf_test-snprintf-test.obj `if test -f 'snprintf-test.c'; then $(CYGPATH_W) 'snprintf-test.c'; else $(CYGPATH_W) '$(srcdir)/snprintf-test.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(snprintf_test_CFLAGS) $(CFLAGS) -c -o snprintf_test-snprintf-test.obj `if test -f 'snprintf-test.c'; then $(CYGPATH_W) 'snprintf-test.c'; else $(CYGPATH_W) '$(srcdir)/snprintf-test.c'; fi` strpftime_test-strpftime-test.o: strpftime-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -MT strpftime_test-strpftime-test.o -MD -MP -MF $(DEPDIR)/strpftime_test-strpftime-test.Tpo -c -o strpftime_test-strpftime-test.o `test -f 'strpftime-test.c' || echo '$(srcdir)/'`strpftime-test.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/strpftime_test-strpftime-test.Tpo $(DEPDIR)/strpftime_test-strpftime-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strpftime-test.c' object='strpftime_test-strpftime-test.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -MT strpftime_test-strpftime-test.o -MD -MP -MF $(DEPDIR)/strpftime_test-strpftime-test.Tpo -c -o strpftime_test-strpftime-test.o `test -f 'strpftime-test.c' || echo '$(srcdir)/'`strpftime-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/strpftime_test-strpftime-test.Tpo $(DEPDIR)/strpftime_test-strpftime-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strpftime-test.c' object='strpftime_test-strpftime-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -c -o strpftime_test-strpftime-test.o `test -f 'strpftime-test.c' || echo '$(srcdir)/'`strpftime-test.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -c -o strpftime_test-strpftime-test.o `test -f 'strpftime-test.c' || echo '$(srcdir)/'`strpftime-test.c strpftime_test-strpftime-test.obj: strpftime-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -MT strpftime_test-strpftime-test.obj -MD -MP -MF $(DEPDIR)/strpftime_test-strpftime-test.Tpo -c -o strpftime_test-strpftime-test.obj `if test -f 'strpftime-test.c'; then $(CYGPATH_W) 'strpftime-test.c'; else $(CYGPATH_W) '$(srcdir)/strpftime-test.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/strpftime_test-strpftime-test.Tpo $(DEPDIR)/strpftime_test-strpftime-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='strpftime-test.c' object='strpftime_test-strpftime-test.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -MT strpftime_test-strpftime-test.obj -MD -MP -MF $(DEPDIR)/strpftime_test-strpftime-test.Tpo -c -o strpftime_test-strpftime-test.obj `if test -f 'strpftime-test.c'; then $(CYGPATH_W) 'strpftime-test.c'; else $(CYGPATH_W) '$(srcdir)/strpftime-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/strpftime_test-strpftime-test.Tpo $(DEPDIR)/strpftime_test-strpftime-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='strpftime-test.c' object='strpftime_test-strpftime-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -c -o strpftime_test-strpftime-test.obj `if test -f 'strpftime-test.c'; then $(CYGPATH_W) 'strpftime-test.c'; else $(CYGPATH_W) '$(srcdir)/strpftime-test.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(strpftime_test_CFLAGS) $(CFLAGS) -c -o strpftime_test-strpftime-test.obj `if test -f 'strpftime-test.c'; then $(CYGPATH_W) 'strpftime-test.c'; else $(CYGPATH_W) '$(srcdir)/strpftime-test.c'; fi` tsearch_test-tsearch-test.o: tsearch-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -MT tsearch_test-tsearch-test.o -MD -MP -MF $(DEPDIR)/tsearch_test-tsearch-test.Tpo -c -o tsearch_test-tsearch-test.o `test -f 'tsearch-test.c' || echo '$(srcdir)/'`tsearch-test.c -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tsearch_test-tsearch-test.Tpo $(DEPDIR)/tsearch_test-tsearch-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tsearch-test.c' object='tsearch_test-tsearch-test.o' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -MT tsearch_test-tsearch-test.o -MD -MP -MF $(DEPDIR)/tsearch_test-tsearch-test.Tpo -c -o tsearch_test-tsearch-test.o `test -f 'tsearch-test.c' || echo '$(srcdir)/'`tsearch-test.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tsearch_test-tsearch-test.Tpo $(DEPDIR)/tsearch_test-tsearch-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tsearch-test.c' object='tsearch_test-tsearch-test.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -c -o tsearch_test-tsearch-test.o `test -f 'tsearch-test.c' || echo '$(srcdir)/'`tsearch-test.c +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -c -o tsearch_test-tsearch-test.o `test -f 'tsearch-test.c' || echo '$(srcdir)/'`tsearch-test.c tsearch_test-tsearch-test.obj: tsearch-test.c -@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -MT tsearch_test-tsearch-test.obj -MD -MP -MF $(DEPDIR)/tsearch_test-tsearch-test.Tpo -c -o tsearch_test-tsearch-test.obj `if test -f 'tsearch-test.c'; then $(CYGPATH_W) 'tsearch-test.c'; else $(CYGPATH_W) '$(srcdir)/tsearch-test.c'; fi` -@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/tsearch_test-tsearch-test.Tpo $(DEPDIR)/tsearch_test-tsearch-test.Po -@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tsearch-test.c' object='tsearch_test-tsearch-test.obj' libtool=no @AMDEPBACKSLASH@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -MT tsearch_test-tsearch-test.obj -MD -MP -MF $(DEPDIR)/tsearch_test-tsearch-test.Tpo -c -o tsearch_test-tsearch-test.obj `if test -f 'tsearch-test.c'; then $(CYGPATH_W) 'tsearch-test.c'; else $(CYGPATH_W) '$(srcdir)/tsearch-test.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tsearch_test-tsearch-test.Tpo $(DEPDIR)/tsearch_test-tsearch-test.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tsearch-test.c' object='tsearch_test-tsearch-test.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -c -o tsearch_test-tsearch-test.obj `if test -f 'tsearch-test.c'; then $(CYGPATH_W) 'tsearch-test.c'; else $(CYGPATH_W) '$(srcdir)/tsearch-test.c'; fi` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(tsearch_test_CFLAGS) $(CFLAGS) -c -o tsearch_test-tsearch-test.obj `if test -f 'tsearch-test.c'; then $(CYGPATH_W) 'tsearch-test.c'; else $(CYGPATH_W) '$(srcdir)/tsearch-test.c'; fi` mostlyclean-libtool: -rm -f *.lo @@ -1426,11 +1958,18 @@ -rm -rf .libs _libs install-man3: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man3dir)" || $(MKDIR_P) "$(DESTDIR)$(man3dir)" - @list=''; test -n "$(man3dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -1459,13 +1998,14 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man3dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man3dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) install-dist_includeHEADERS: $(dist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(dist_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"; \ @@ -1479,13 +2019,14 @@ @$(NORMAL_UNINSTALL) @list='$(dist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -1499,13 +2040,14 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_rokenincludeHEADERS: $(nodist_rokeninclude_HEADERS) @$(NORMAL_INSTALL) - test -z "$(rokenincludedir)" || $(MKDIR_P) "$(DESTDIR)$(rokenincludedir)" @list='$(nodist_rokeninclude_HEADERS)'; test -n "$(rokenincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(rokenincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(rokenincludedir)" || exit 1; \ + fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ @@ -1519,30 +2061,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_rokeninclude_HEADERS)'; test -n "$(rokenincludedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(rokenincludedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(rokenincludedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(rokenincludedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -1554,15 +2083,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -1571,116 +2096,275 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - skipped="($$skip tests were not run)"; \ + color_start= color_end=; \ fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -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 + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +base64-test.log: base64-test$(EXEEXT) + @p='base64-test$(EXEEXT)'; \ + b='base64-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +getaddrinfo-test.log: getaddrinfo-test$(EXEEXT) + @p='getaddrinfo-test$(EXEEXT)'; \ + b='getaddrinfo-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +getifaddrs-test.log: getifaddrs-test$(EXEEXT) + @p='getifaddrs-test$(EXEEXT)'; \ + b='getifaddrs-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +getxxyyy-test.log: getxxyyy-test$(EXEEXT) + @p='getxxyyy-test$(EXEEXT)'; \ + b='getxxyyy-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +hex-test.log: hex-test$(EXEEXT) + @p='hex-test$(EXEEXT)'; \ + b='hex-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-readenv.log: test-readenv$(EXEEXT) + @p='test-readenv$(EXEEXT)'; \ + b='test-readenv'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +resolve-test.log: resolve-test$(EXEEXT) + @p='resolve-test$(EXEEXT)'; \ + b='resolve-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +parse_bytes-test.log: parse_bytes-test$(EXEEXT) + @p='parse_bytes-test$(EXEEXT)'; \ + b='parse_bytes-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +parse_reply-test.log: parse_reply-test$(EXEEXT) + @p='parse_reply-test$(EXEEXT)'; \ + b='parse_reply-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +parse_time-test.log: parse_time-test$(EXEEXT) + @p='parse_time-test$(EXEEXT)'; \ + b='parse_time-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +snprintf-test.log: snprintf-test$(EXEEXT) + @p='snprintf-test$(EXEEXT)'; \ + b='snprintf-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +strpftime-test.log: strpftime-test$(EXEEXT) + @p='strpftime-test$(EXEEXT)'; \ + b='strpftime-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +tsearch-test.log: tsearch-test$(EXEEXT) + @p='tsearch-test$(EXEEXT)'; \ + b='tsearch-test'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -1718,15 +2402,18 @@ $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS) \ +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(MANS) $(HEADERS) \ all-local +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(rokenincludedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -1735,11 +2422,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -1759,7 +2454,165 @@ mostlyclean-am distclean: distclean-am - -rm -rf $(DEPDIR) ./$(DEPDIR) + -rm -f $(DEPDIR)/chown.Plo + -rm -f $(DEPDIR)/closefrom.Plo + -rm -f $(DEPDIR)/copyhostent.Plo + -rm -f $(DEPDIR)/daemon.Plo + -rm -f $(DEPDIR)/ecalloc.Plo + -rm -f $(DEPDIR)/emalloc.Plo + -rm -f $(DEPDIR)/erealloc.Plo + -rm -f $(DEPDIR)/err.Plo + -rm -f $(DEPDIR)/errx.Plo + -rm -f $(DEPDIR)/estrdup.Plo + -rm -f $(DEPDIR)/fchown.Plo + -rm -f $(DEPDIR)/flock.Plo + -rm -f $(DEPDIR)/fnmatch.Plo + -rm -f $(DEPDIR)/freeaddrinfo.Plo + -rm -f $(DEPDIR)/freehostent.Plo + -rm -f $(DEPDIR)/gai_strerror.Plo + -rm -f $(DEPDIR)/getaddrinfo.Plo + -rm -f $(DEPDIR)/getcap.Plo + -rm -f $(DEPDIR)/getcwd.Plo + -rm -f $(DEPDIR)/getdtablesize.Plo + -rm -f $(DEPDIR)/getegid.Plo + -rm -f $(DEPDIR)/geteuid.Plo + -rm -f $(DEPDIR)/getgid.Plo + -rm -f $(DEPDIR)/gethostname.Plo + -rm -f $(DEPDIR)/getifaddrs.Plo + -rm -f $(DEPDIR)/getipnodebyaddr.Plo + -rm -f $(DEPDIR)/getipnodebyname.Plo + -rm -f $(DEPDIR)/getnameinfo.Plo + -rm -f $(DEPDIR)/getopt.Plo + -rm -f $(DEPDIR)/gettimeofday.Plo + -rm -f $(DEPDIR)/getuid.Plo + -rm -f $(DEPDIR)/getusershell.Plo + -rm -f $(DEPDIR)/glob.Plo + -rm -f $(DEPDIR)/hstrerror.Plo + -rm -f $(DEPDIR)/inet_aton.Plo + -rm -f $(DEPDIR)/inet_ntop.Plo + -rm -f $(DEPDIR)/inet_pton.Plo + -rm -f $(DEPDIR)/initgroups.Plo + -rm -f $(DEPDIR)/innetgr.Plo + -rm -f $(DEPDIR)/iruserok.Plo + -rm -f $(DEPDIR)/localtime_r.Plo + -rm -f $(DEPDIR)/lstat.Plo + -rm -f $(DEPDIR)/memmove.Plo + -rm -f $(DEPDIR)/memset_s.Plo + -rm -f $(DEPDIR)/mkstemp.Plo + -rm -f $(DEPDIR)/putenv.Plo + -rm -f $(DEPDIR)/rcmd.Plo + -rm -f $(DEPDIR)/readv.Plo + -rm -f $(DEPDIR)/recvmsg.Plo + -rm -f $(DEPDIR)/sendmsg.Plo + -rm -f $(DEPDIR)/setegid.Plo + -rm -f $(DEPDIR)/setenv.Plo + -rm -f $(DEPDIR)/seteuid.Plo + -rm -f $(DEPDIR)/strcasecmp.Plo + -rm -f $(DEPDIR)/strdup.Plo + -rm -f $(DEPDIR)/strerror.Plo + -rm -f $(DEPDIR)/strftime.Plo + -rm -f $(DEPDIR)/strlcat.Plo + -rm -f $(DEPDIR)/strlcpy.Plo + -rm -f $(DEPDIR)/strlwr.Plo + -rm -f $(DEPDIR)/strncasecmp.Plo + -rm -f $(DEPDIR)/strndup.Plo + -rm -f $(DEPDIR)/strnlen.Plo + -rm -f $(DEPDIR)/strptime.Plo + -rm -f $(DEPDIR)/strsep.Plo + -rm -f $(DEPDIR)/strsep_copy.Plo + -rm -f $(DEPDIR)/strtok_r.Plo + -rm -f $(DEPDIR)/strtoll.Plo + -rm -f $(DEPDIR)/strtoull.Plo + -rm -f $(DEPDIR)/strupr.Plo + -rm -f $(DEPDIR)/swab.Plo + -rm -f $(DEPDIR)/timegm.Plo + -rm -f $(DEPDIR)/tsearch.Plo + -rm -f $(DEPDIR)/unsetenv.Plo + -rm -f $(DEPDIR)/verr.Plo + -rm -f $(DEPDIR)/verrx.Plo + -rm -f $(DEPDIR)/vsyslog.Plo + -rm -f $(DEPDIR)/vwarn.Plo + -rm -f $(DEPDIR)/vwarnx.Plo + -rm -f $(DEPDIR)/warn.Plo + -rm -f $(DEPDIR)/warnx.Plo + -rm -f $(DEPDIR)/writev.Plo + -rm -f ./$(DEPDIR)/base64-test.Po + -rm -f ./$(DEPDIR)/getaddrinfo-test.Po + -rm -f ./$(DEPDIR)/getifaddrs-test.Po + -rm -f ./$(DEPDIR)/getxxyyy_test-getxxyyy.Po + -rm -f ./$(DEPDIR)/hex-test.Po + -rm -f ./$(DEPDIR)/libroken_la-base64.Plo + -rm -f ./$(DEPDIR)/libroken_la-bswap.Plo + -rm -f ./$(DEPDIR)/libroken_la-cloexec.Plo + -rm -f ./$(DEPDIR)/libroken_la-concat.Plo + -rm -f ./$(DEPDIR)/libroken_la-ct.Plo + -rm -f ./$(DEPDIR)/libroken_la-detach.Plo + -rm -f ./$(DEPDIR)/libroken_la-doxygen.Plo + -rm -f ./$(DEPDIR)/libroken_la-dumpdata.Plo + -rm -f ./$(DEPDIR)/libroken_la-environment.Plo + -rm -f ./$(DEPDIR)/libroken_la-eread.Plo + -rm -f ./$(DEPDIR)/libroken_la-esetenv.Plo + -rm -f ./$(DEPDIR)/libroken_la-ewrite.Plo + -rm -f ./$(DEPDIR)/libroken_la-get_default_username.Plo + -rm -f ./$(DEPDIR)/libroken_la-get_window_size.Plo + -rm -f ./$(DEPDIR)/libroken_la-getaddrinfo_hostspec.Plo + -rm -f ./$(DEPDIR)/libroken_la-getarg.Plo + -rm -f ./$(DEPDIR)/libroken_la-getnameinfo_verified.Plo + -rm -f ./$(DEPDIR)/libroken_la-getprogname.Plo + -rm -f ./$(DEPDIR)/libroken_la-getxxyyy.Plo + -rm -f ./$(DEPDIR)/libroken_la-h_errno.Plo + -rm -f ./$(DEPDIR)/libroken_la-hex.Plo + -rm -f ./$(DEPDIR)/libroken_la-hostent_find_fqdn.Plo + -rm -f ./$(DEPDIR)/libroken_la-issuid.Plo + -rm -f ./$(DEPDIR)/libroken_la-k_getpwnam.Plo + -rm -f ./$(DEPDIR)/libroken_la-k_getpwuid.Plo + -rm -f ./$(DEPDIR)/libroken_la-mini_inetd.Plo + -rm -f ./$(DEPDIR)/libroken_la-mkdir.Plo + -rm -f ./$(DEPDIR)/libroken_la-net_read.Plo + -rm -f ./$(DEPDIR)/libroken_la-net_write.Plo + -rm -f ./$(DEPDIR)/libroken_la-parse_bytes.Plo + -rm -f ./$(DEPDIR)/libroken_la-parse_time.Plo + -rm -f ./$(DEPDIR)/libroken_la-parse_units.Plo + -rm -f ./$(DEPDIR)/libroken_la-qsort.Plo + -rm -f ./$(DEPDIR)/libroken_la-rand.Plo + -rm -f ./$(DEPDIR)/libroken_la-realloc.Plo + -rm -f ./$(DEPDIR)/libroken_la-resolve.Plo + -rm -f ./$(DEPDIR)/libroken_la-roken_gethostby.Plo + -rm -f ./$(DEPDIR)/libroken_la-rtbl.Plo + -rm -f ./$(DEPDIR)/libroken_la-setprogname.Plo + -rm -f ./$(DEPDIR)/libroken_la-signal.Plo + -rm -f ./$(DEPDIR)/libroken_la-simple_exec.Plo + -rm -f ./$(DEPDIR)/libroken_la-snprintf.Plo + -rm -f ./$(DEPDIR)/libroken_la-socket.Plo + -rm -f ./$(DEPDIR)/libroken_la-socket_wrapper.Plo + -rm -f ./$(DEPDIR)/libroken_la-strcollect.Plo + -rm -f ./$(DEPDIR)/libroken_la-strerror_r.Plo + -rm -f ./$(DEPDIR)/libroken_la-strpool.Plo + -rm -f ./$(DEPDIR)/libroken_la-timeval.Plo + -rm -f ./$(DEPDIR)/libroken_la-tm2time.Plo + -rm -f ./$(DEPDIR)/libroken_la-unvis.Plo + -rm -f ./$(DEPDIR)/libroken_la-verify.Plo + -rm -f ./$(DEPDIR)/libroken_la-vis.Plo + -rm -f ./$(DEPDIR)/libroken_la-warnerr.Plo + -rm -f ./$(DEPDIR)/libroken_la-write_pid.Plo + -rm -f ./$(DEPDIR)/libroken_la-xfree.Plo + -rm -f ./$(DEPDIR)/libtest_la-snprintf.Plo + -rm -f ./$(DEPDIR)/libtest_la-strftime.Plo + -rm -f ./$(DEPDIR)/libtest_la-strptime.Plo + -rm -f ./$(DEPDIR)/libtest_la-tsearch.Plo + -rm -f ./$(DEPDIR)/make-roken.Po + -rm -f ./$(DEPDIR)/parse_bytes-test.Po + -rm -f ./$(DEPDIR)/parse_reply_test-parse_reply-test.Po + -rm -f ./$(DEPDIR)/parse_reply_test-resolve.Po + -rm -f ./$(DEPDIR)/parse_time-test.Po + -rm -f ./$(DEPDIR)/resolve-test.Po + -rm -f ./$(DEPDIR)/rkpty.Po + -rm -f ./$(DEPDIR)/snprintf_test-snprintf-test.Po + -rm -f ./$(DEPDIR)/strpftime_test-strpftime-test.Po + -rm -f ./$(DEPDIR)/test-detach.Po + -rm -f ./$(DEPDIR)/test-mem.Po + -rm -f ./$(DEPDIR)/test-readenv.Po + -rm -f ./$(DEPDIR)/tsearch_test-tsearch-test.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1785,9 +2638,8 @@ install-dvi-am: -install-exec-am: install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -1809,7 +2661,165 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf $(DEPDIR) ./$(DEPDIR) + -rm -f $(DEPDIR)/chown.Plo + -rm -f $(DEPDIR)/closefrom.Plo + -rm -f $(DEPDIR)/copyhostent.Plo + -rm -f $(DEPDIR)/daemon.Plo + -rm -f $(DEPDIR)/ecalloc.Plo + -rm -f $(DEPDIR)/emalloc.Plo + -rm -f $(DEPDIR)/erealloc.Plo + -rm -f $(DEPDIR)/err.Plo + -rm -f $(DEPDIR)/errx.Plo + -rm -f $(DEPDIR)/estrdup.Plo + -rm -f $(DEPDIR)/fchown.Plo + -rm -f $(DEPDIR)/flock.Plo + -rm -f $(DEPDIR)/fnmatch.Plo + -rm -f $(DEPDIR)/freeaddrinfo.Plo + -rm -f $(DEPDIR)/freehostent.Plo + -rm -f $(DEPDIR)/gai_strerror.Plo + -rm -f $(DEPDIR)/getaddrinfo.Plo + -rm -f $(DEPDIR)/getcap.Plo + -rm -f $(DEPDIR)/getcwd.Plo + -rm -f $(DEPDIR)/getdtablesize.Plo + -rm -f $(DEPDIR)/getegid.Plo + -rm -f $(DEPDIR)/geteuid.Plo + -rm -f $(DEPDIR)/getgid.Plo + -rm -f $(DEPDIR)/gethostname.Plo + -rm -f $(DEPDIR)/getifaddrs.Plo + -rm -f $(DEPDIR)/getipnodebyaddr.Plo + -rm -f $(DEPDIR)/getipnodebyname.Plo + -rm -f $(DEPDIR)/getnameinfo.Plo + -rm -f $(DEPDIR)/getopt.Plo + -rm -f $(DEPDIR)/gettimeofday.Plo + -rm -f $(DEPDIR)/getuid.Plo + -rm -f $(DEPDIR)/getusershell.Plo + -rm -f $(DEPDIR)/glob.Plo + -rm -f $(DEPDIR)/hstrerror.Plo + -rm -f $(DEPDIR)/inet_aton.Plo + -rm -f $(DEPDIR)/inet_ntop.Plo + -rm -f $(DEPDIR)/inet_pton.Plo + -rm -f $(DEPDIR)/initgroups.Plo + -rm -f $(DEPDIR)/innetgr.Plo + -rm -f $(DEPDIR)/iruserok.Plo + -rm -f $(DEPDIR)/localtime_r.Plo + -rm -f $(DEPDIR)/lstat.Plo + -rm -f $(DEPDIR)/memmove.Plo + -rm -f $(DEPDIR)/memset_s.Plo + -rm -f $(DEPDIR)/mkstemp.Plo + -rm -f $(DEPDIR)/putenv.Plo + -rm -f $(DEPDIR)/rcmd.Plo + -rm -f $(DEPDIR)/readv.Plo + -rm -f $(DEPDIR)/recvmsg.Plo + -rm -f $(DEPDIR)/sendmsg.Plo + -rm -f $(DEPDIR)/setegid.Plo + -rm -f $(DEPDIR)/setenv.Plo + -rm -f $(DEPDIR)/seteuid.Plo + -rm -f $(DEPDIR)/strcasecmp.Plo + -rm -f $(DEPDIR)/strdup.Plo + -rm -f $(DEPDIR)/strerror.Plo + -rm -f $(DEPDIR)/strftime.Plo + -rm -f $(DEPDIR)/strlcat.Plo + -rm -f $(DEPDIR)/strlcpy.Plo + -rm -f $(DEPDIR)/strlwr.Plo + -rm -f $(DEPDIR)/strncasecmp.Plo + -rm -f $(DEPDIR)/strndup.Plo + -rm -f $(DEPDIR)/strnlen.Plo + -rm -f $(DEPDIR)/strptime.Plo + -rm -f $(DEPDIR)/strsep.Plo + -rm -f $(DEPDIR)/strsep_copy.Plo + -rm -f $(DEPDIR)/strtok_r.Plo + -rm -f $(DEPDIR)/strtoll.Plo + -rm -f $(DEPDIR)/strtoull.Plo + -rm -f $(DEPDIR)/strupr.Plo + -rm -f $(DEPDIR)/swab.Plo + -rm -f $(DEPDIR)/timegm.Plo + -rm -f $(DEPDIR)/tsearch.Plo + -rm -f $(DEPDIR)/unsetenv.Plo + -rm -f $(DEPDIR)/verr.Plo + -rm -f $(DEPDIR)/verrx.Plo + -rm -f $(DEPDIR)/vsyslog.Plo + -rm -f $(DEPDIR)/vwarn.Plo + -rm -f $(DEPDIR)/vwarnx.Plo + -rm -f $(DEPDIR)/warn.Plo + -rm -f $(DEPDIR)/warnx.Plo + -rm -f $(DEPDIR)/writev.Plo + -rm -f ./$(DEPDIR)/base64-test.Po + -rm -f ./$(DEPDIR)/getaddrinfo-test.Po + -rm -f ./$(DEPDIR)/getifaddrs-test.Po + -rm -f ./$(DEPDIR)/getxxyyy_test-getxxyyy.Po + -rm -f ./$(DEPDIR)/hex-test.Po + -rm -f ./$(DEPDIR)/libroken_la-base64.Plo + -rm -f ./$(DEPDIR)/libroken_la-bswap.Plo + -rm -f ./$(DEPDIR)/libroken_la-cloexec.Plo + -rm -f ./$(DEPDIR)/libroken_la-concat.Plo + -rm -f ./$(DEPDIR)/libroken_la-ct.Plo + -rm -f ./$(DEPDIR)/libroken_la-detach.Plo + -rm -f ./$(DEPDIR)/libroken_la-doxygen.Plo + -rm -f ./$(DEPDIR)/libroken_la-dumpdata.Plo + -rm -f ./$(DEPDIR)/libroken_la-environment.Plo + -rm -f ./$(DEPDIR)/libroken_la-eread.Plo + -rm -f ./$(DEPDIR)/libroken_la-esetenv.Plo + -rm -f ./$(DEPDIR)/libroken_la-ewrite.Plo + -rm -f ./$(DEPDIR)/libroken_la-get_default_username.Plo + -rm -f ./$(DEPDIR)/libroken_la-get_window_size.Plo + -rm -f ./$(DEPDIR)/libroken_la-getaddrinfo_hostspec.Plo + -rm -f ./$(DEPDIR)/libroken_la-getarg.Plo + -rm -f ./$(DEPDIR)/libroken_la-getnameinfo_verified.Plo + -rm -f ./$(DEPDIR)/libroken_la-getprogname.Plo + -rm -f ./$(DEPDIR)/libroken_la-getxxyyy.Plo + -rm -f ./$(DEPDIR)/libroken_la-h_errno.Plo + -rm -f ./$(DEPDIR)/libroken_la-hex.Plo + -rm -f ./$(DEPDIR)/libroken_la-hostent_find_fqdn.Plo + -rm -f ./$(DEPDIR)/libroken_la-issuid.Plo + -rm -f ./$(DEPDIR)/libroken_la-k_getpwnam.Plo + -rm -f ./$(DEPDIR)/libroken_la-k_getpwuid.Plo + -rm -f ./$(DEPDIR)/libroken_la-mini_inetd.Plo + -rm -f ./$(DEPDIR)/libroken_la-mkdir.Plo + -rm -f ./$(DEPDIR)/libroken_la-net_read.Plo + -rm -f ./$(DEPDIR)/libroken_la-net_write.Plo + -rm -f ./$(DEPDIR)/libroken_la-parse_bytes.Plo + -rm -f ./$(DEPDIR)/libroken_la-parse_time.Plo + -rm -f ./$(DEPDIR)/libroken_la-parse_units.Plo + -rm -f ./$(DEPDIR)/libroken_la-qsort.Plo + -rm -f ./$(DEPDIR)/libroken_la-rand.Plo + -rm -f ./$(DEPDIR)/libroken_la-realloc.Plo + -rm -f ./$(DEPDIR)/libroken_la-resolve.Plo + -rm -f ./$(DEPDIR)/libroken_la-roken_gethostby.Plo + -rm -f ./$(DEPDIR)/libroken_la-rtbl.Plo + -rm -f ./$(DEPDIR)/libroken_la-setprogname.Plo + -rm -f ./$(DEPDIR)/libroken_la-signal.Plo + -rm -f ./$(DEPDIR)/libroken_la-simple_exec.Plo + -rm -f ./$(DEPDIR)/libroken_la-snprintf.Plo + -rm -f ./$(DEPDIR)/libroken_la-socket.Plo + -rm -f ./$(DEPDIR)/libroken_la-socket_wrapper.Plo + -rm -f ./$(DEPDIR)/libroken_la-strcollect.Plo + -rm -f ./$(DEPDIR)/libroken_la-strerror_r.Plo + -rm -f ./$(DEPDIR)/libroken_la-strpool.Plo + -rm -f ./$(DEPDIR)/libroken_la-timeval.Plo + -rm -f ./$(DEPDIR)/libroken_la-tm2time.Plo + -rm -f ./$(DEPDIR)/libroken_la-unvis.Plo + -rm -f ./$(DEPDIR)/libroken_la-verify.Plo + -rm -f ./$(DEPDIR)/libroken_la-vis.Plo + -rm -f ./$(DEPDIR)/libroken_la-warnerr.Plo + -rm -f ./$(DEPDIR)/libroken_la-write_pid.Plo + -rm -f ./$(DEPDIR)/libroken_la-xfree.Plo + -rm -f ./$(DEPDIR)/libtest_la-snprintf.Plo + -rm -f ./$(DEPDIR)/libtest_la-strftime.Plo + -rm -f ./$(DEPDIR)/libtest_la-strptime.Plo + -rm -f ./$(DEPDIR)/libtest_la-tsearch.Plo + -rm -f ./$(DEPDIR)/make-roken.Po + -rm -f ./$(DEPDIR)/parse_bytes-test.Po + -rm -f ./$(DEPDIR)/parse_reply_test-parse_reply-test.Po + -rm -f ./$(DEPDIR)/parse_reply_test-resolve.Po + -rm -f ./$(DEPDIR)/parse_time-test.Po + -rm -f ./$(DEPDIR)/resolve-test.Po + -rm -f ./$(DEPDIR)/rkpty.Po + -rm -f ./$(DEPDIR)/snprintf_test-snprintf-test.Po + -rm -f ./$(DEPDIR)/strpftime_test-strpftime-test.Po + -rm -f ./$(DEPDIR)/test-detach.Po + -rm -f ./$(DEPDIR)/test-mem.Po + -rm -f ./$(DEPDIR)/test-readenv.Po + -rm -f ./$(DEPDIR)/tsearch_test-tsearch-test.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1834,18 +2844,19 @@ uninstall-man: uninstall-man3 .MAKE: all check check-am install install-am install-data-am \ - install-exec-am install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-checkPROGRAMS clean-generic \ - clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \ - clean-noinstPROGRAMS ctags dist-hook 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-data-hook install-dist_includeHEADERS install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ + install-exec install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-checkPROGRAMS \ + clean-generic clean-libLTLIBRARIES clean-libtool \ + clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscopelist-am \ + ctags ctags-am dist-hook 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-data-hook \ + install-dist_includeHEADERS install-dvi install-dvi-am \ + install-exec install-exec-am install-exec-local install-html \ + install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-man3 \ install-nodist_includeHEADERS \ install-nodist_rokenincludeHEADERS install-pdf install-pdf-am \ @@ -1853,26 +2864,41 @@ 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-dist_includeHEADERS \ - uninstall-hook uninstall-libLTLIBRARIES uninstall-man \ - uninstall-man3 uninstall-nodist_includeHEADERS \ + recheck tags tags-am uninstall uninstall-am \ + uninstall-dist_includeHEADERS uninstall-hook \ + uninstall-libLTLIBRARIES uninstall-man uninstall-man3 \ + uninstall-nodist_includeHEADERS \ uninstall-nodist_rokenincludeHEADERS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1880,7 +2906,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1925,11 +2951,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1937,6 +2972,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1979,6 +3016,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1992,13 +3042,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/lib/roken/NTMakefile b/crypto/heimdal/lib/roken/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/NTMakefile @@ -0,0 +1,289 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\roken + +!include ../../windows/NTMakefile.w32 + +libroken_la_OBJS = \ + $(OBJ)\base64.obj \ + $(OBJ)\bswap.obj \ + $(OBJ)\concat.obj \ + $(OBJ)\cloexec.obj \ + $(OBJ)\ct.obj \ + $(OBJ)\detach.obj \ + $(OBJ)\dirent.obj \ + $(OBJ)\dlfcn_w32.obj \ + $(OBJ)\dumpdata.obj \ + $(OBJ)\ecalloc.obj \ + $(OBJ)\emalloc.obj \ + $(OBJ)\environment.obj \ + $(OBJ)\eread.obj \ + $(OBJ)\erealloc.obj \ + $(OBJ)\err.obj \ + $(OBJ)\errx.obj \ + $(OBJ)\esetenv.obj \ + $(OBJ)\estrdup.obj \ + $(OBJ)\ewrite.obj \ + $(OBJ)\flock.obj \ + $(OBJ)\fnmatch.obj \ + $(OBJ)\getaddrinfo_hostspec.obj \ + $(OBJ)\get_default_username.obj \ + $(OBJ)\get_window_size.obj \ + $(OBJ)\getarg.obj \ + $(OBJ)\getifaddrs_w32.obj \ + $(OBJ)\getnameinfo_verified.obj \ + $(OBJ)\getopt.obj \ + $(OBJ)\getprogname.obj \ + $(OBJ)\gettimeofday.obj \ + $(OBJ)\hex.obj \ + $(OBJ)\hostent_find_fqdn.obj \ + $(OBJ)\inet_aton.obj \ + $(OBJ)\issuid.obj \ + $(OBJ)\localtime_r.obj \ + $(OBJ)\lstat.obj \ + $(OBJ)\memset_s.obj \ + $(OBJ)\mkdir.obj \ + $(OBJ)\mini_inetd.obj \ + $(OBJ)\mkstemp.obj \ + $(OBJ)\net_read.obj \ + $(OBJ)\net_write.obj \ + $(OBJ)\parse_bytes.obj \ + $(OBJ)\parse_time.obj \ + $(OBJ)\parse_units.obj \ + $(OBJ)\realloc.obj \ + $(OBJ)\rename.obj \ + $(OBJ)\resolve.obj \ + $(OBJ)\rand.obj \ + $(OBJ)\roken_gethostby.obj \ + $(OBJ)\rtbl.obj \ + $(OBJ)\sendmsg.obj \ + $(OBJ)\setenv.obj \ + $(OBJ)\setprogname.obj \ + $(OBJ)\simple_exec_w32.obj \ + $(OBJ)\sleep.obj \ + $(OBJ)\snprintf.obj \ + $(OBJ)\socket.obj \ + $(OBJ)\sockstartup_w32.obj \ + $(OBJ)\strcollect.obj \ + $(OBJ)\strerror_r.obj \ + $(OBJ)\strlcat.obj \ + $(OBJ)\strlcpy.obj \ + $(OBJ)\strndup.obj \ + $(OBJ)\strpool.obj \ + $(OBJ)\strptime.obj \ + $(OBJ)\strsep.obj \ + $(OBJ)\strsep_copy.obj \ + $(OBJ)\strtok_r.obj \ + $(OBJ)\strtoll.obj \ + $(OBJ)\strtoull.obj \ + $(OBJ)\syslogc.obj \ + $(OBJ)\timegm.obj \ + $(OBJ)\timeval.obj \ + $(OBJ)\tm2time.obj \ + $(OBJ)\tsearch.obj \ + $(OBJ)\unvis.obj \ + $(OBJ)\verr.obj \ + $(OBJ)\verrx.obj \ + $(OBJ)\vis.obj \ + $(OBJ)\vwarn.obj \ + $(OBJ)\vwarnx.obj \ + $(OBJ)\warn.obj \ + $(OBJ)\warnerr.obj \ + $(OBJ)\warnx.obj \ + $(OBJ)\win32_alloc.obj \ + $(OBJ)\writev.obj \ + $(OBJ)\xfree.obj + +!if $(NMAKE_WINVER) < 0x0600 +libroken_la_OBJS=$(libroken_la_OBJS) \ + $(OBJ)\inet_ntop.obj \ + $(OBJ)\inet_pton.obj +!endif + +{}.c{$(OBJ)}.obj:: + $(C2OBJ_P) -DBUILD_ROKEN_LIB + +$(LIBROKEN): $(libroken_la_OBJS) + $(LIBCON_C) -out:$@ @<< +$(**: = +) +<< + +$(OBJ)\make-roken.exe: $(OBJ)\make-roken.obj + $(EXECONLINK) + +$(OBJ)\make-roken.c: roken.h.in roken.awk $(INCDIR)\config.h + $(AWK) -f roken.awk roken.h.in > $(OBJ)\make-roken.c || $(RM) $(OBJ)\make-roken.c + +$(INCDIR)\roken.h: $(OBJ)\make-roken.exe + $(OBJ)\make-roken.exe > $@ || $(RM) $@ + +INCFILES = \ + $(INCDIR)\base64.h \ + $(INCDIR)\dirent.h \ + $(INCDIR)\dlfcn.h \ + $(INCDIR)\err.h \ + $(INCDIR)\fnmatch.h \ + $(INCDIR)\getarg.h \ + $(INCDIR)\glob.h \ + $(INCDIR)\hex.h \ + $(INCDIR)\ifaddrs.h \ + $(INCDIR)\parse_bytes.h \ + $(INCDIR)\parse_time.h \ + $(INCDIR)\parse_units.h \ + $(INCDIR)\resolve.h \ + $(INCDIR)\roken.h \ + $(INCDIR)\roken-common.h \ + $(INCDIR)\rtbl.h \ + $(INCDIR)\search.h \ + $(INCDIR)\stdbool.h \ + $(INCDIR)\syslog.h \ + $(INCDIR)\vis.h \ +!ifndef HAVE_STDINT_H + $(INCDIR)\stdint.h \ +!endif + $(INCDIR)\xdbm.h + +clean:: + -$(RM) $(XHEADERS) + +all:: $(INCFILES) $(LIBROKEN) + +clean:: + -$(RM) $(LIBROKEN) + +TMP_PROGS = $(OBJ)\snprintf-test.exe $(OBJ)\resolve-test.exe + +# Tests + +TEST_PROGS = \ + $(OBJ)\base64-test.exe \ + $(OBJ)\getaddrinfo-test.exe \ + $(OBJ)\getifaddrs-test.exe \ + $(OBJ)\hex-test.exe \ + $(OBJ)\test-detach.exe \ + $(OBJ)\test-readenv.exe \ + $(OBJ)\parse_bytes-test.exe \ + $(OBJ)\parse_reply-test.exe \ + $(OBJ)\parse_time-test.exe \ + $(OBJ)\snprintf-test.exe \ + $(OBJ)\strpftime-test.exe \ + $(OBJ)\dirent-test.exe \ + $(OBJ)\test-mini_inetd.exe + +$(OBJ)\strftime_test.obj: strftime.c + $(C2OBJ) -DTEST_SNPRINTF -DTEST_STRPFTIME -DBUILD_ROKEN_LIB + +$(OBJ)\strptime_test.obj: strptime.c + $(C2OBJ) -DTEST_SNPRINTF -DTEST_STRPFTIME -DBUILD_ROKEN_LIB + +$(OBJ)\snprintf_test.obj: snprintf.c + $(C2OBJ) -DTEST_SNPRINTF -DTEST_STRPFTIME -DBUILD_ROKEN_LIB + +$(OBJ)\libtest.lib: $(OBJ)\strftime_test.obj $(OBJ)\strptime_test.obj $(OBJ)\snprintf_test.obj + $(LIBCON) + +$(OBJ)\parse_reply-test.obj: parse_reply-test.c + $(C2OBJ) -DTEST_RESOLVE -DBUILD_ROKEN_LIB + +$(OBJ)\resolve_test.obj: resolve.c + $(C2OBJ) -DTEST_RESOLVE -DBUILD_ROKEN_LIB + +$(OBJ)\parse_reply-test.exe: $(OBJ)\parse_reply-test.obj $(OBJ)\resolve_test.obj $(LIBROKEN) + $(EXECONLINK) DnsAPI.lib + +$(OBJ)\test-readenv.exe: $(OBJ)\test-readenv.obj $(OBJ)\test-mem.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\parse_time-test.exe: $(OBJ)\parse_time-test.obj $(OBJ)\test-mem.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\strpftime-test.obj: strpftime-test.c + $(C2OBJ) -DTEST_STRPFTIME -DBUILD_ROKEN_LIB + +$(OBJ)\strpftime-test.exe: $(OBJ)\strpftime-test.obj $(OBJ)\libtest.lib $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\snprintf-test.obj: snprintf-test.c + $(C2OBJ) -DTEST_SNPRINTF -DBUILD_ROKEN_LIB + +$(OBJ)\snprintf-test.exe: $(OBJ)\snprintf-test.obj $(OBJ)\libtest.lib $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\resolve-test.exe: $(OBJ)\resolve-test.obj $(LIBROKEN) + $(EXECONLINK) DnsAPI.lib + +$(OBJ)\base64-test.exe: $(OBJ)\base64-test.obj $(OBJ)\base64.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\getaddrinfo-test.exe: $(OBJ)\getaddrinfo-test.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\hex-test.exe: $(OBJ)\hex-test.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\parse_bytes-test.exe: $(OBJ)\parse_bytes-test.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\test-detach.exe: $(OBJ)\test-detach.obj $(OBJ)\detach.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\dirent-test.exe: $(OBJ)\dirent-test.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\getifaddrs-test.exe: $(OBJ)\getifaddrs-test.obj $(LIBROKEN) + $(EXECONLINK) + +$(OBJ)\test-mini_inetd.exe: $(OBJ)\test-mini_inetd.obj $(LIBROKEN) + $(EXECONLINK) + +test-binaries: $(TEST_PROGS) $(TMP_PROGS) + +test-run: + cd $(OBJ) + -test-mini_inetd.exe + -dirent-test.exe + -base64-test.exe + -getaddrinfo-test.exe + -getifaddrs-test.exe + -hex-test.exe + -test-readenv.exe + -parse_bytes-test.exe +# Need to rewrite this test: +# -parse_reply-test.exe + -parse_time-test.exe + -snprintf-test.exe + -strpftime-test.exe + cd $(SRCDIR) + +test:: test-binaries test-run + diff --git a/crypto/heimdal/lib/roken/base64-test.c b/crypto/heimdal/lib/roken/base64-test.c --- a/crypto/heimdal/lib/roken/base64-test.c +++ b/crypto/heimdal/lib/roken/base64-test.c @@ -53,12 +53,12 @@ { "4444", 4, "NDQ0NA==" }, { "55555", 5, "NTU1NTU=" }, { "abc:def", 7, "YWJjOmRlZg==" }, - { NULL } + { NULL, 0, NULL } }; for(t = tests; t->data; t++) { char *str; int len; - len = base64_encode(t->data, t->len, &str); + len = rk_base64_encode(t->data, t->len, &str); if(strcmp(str, t->result) != 0) { fprintf(stderr, "failed test %d: %s != %s\n", numtest, str, t->result); @@ -66,7 +66,7 @@ } free(str); str = strdup(t->result); - len = base64_decode(t->result, str); + len = rk_base64_decode(t->result, str); if(len != t->len) { fprintf(stderr, "failed test %d: len %lu != %lu\n", numtest, (unsigned long)len, (unsigned long)t->len); @@ -81,12 +81,12 @@ { char str[32]; - if(base64_decode("M=M=", str) != -1) { + if(rk_base64_decode("M=M=", str) != -1) { fprintf(stderr, "failed test %d: successful decode of `M=M='\n", numtest++); numerr++; } - if(base64_decode("MQ===", str) != -1) { + if(rk_base64_decode("MQ===", str) != -1) { fprintf(stderr, "failed test %d: successful decode of `MQ==='\n", numtest++); numerr++; diff --git a/crypto/heimdal/lib/roken/base64.h b/crypto/heimdal/lib/roken/base64.h --- a/crypto/heimdal/lib/roken/base64.h +++ b/crypto/heimdal/lib/roken/base64.h @@ -47,9 +47,9 @@ #endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL -base64_encode(const void *, int, char **); +rk_base64_encode(const void *, int, char **); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL -base64_decode(const char *, void *); +rk_base64_decode(const char *, void *); #endif diff --git a/crypto/heimdal/lib/roken/base64.c b/crypto/heimdal/lib/roken/base64.c --- a/crypto/heimdal/lib/roken/base64.c +++ b/crypto/heimdal/lib/roken/base64.c @@ -52,7 +52,7 @@ } ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL -base64_encode(const void *data, int size, char **str) +rk_base64_encode(const void *data, int size, char **str) { char *s, *p; int i; @@ -121,7 +121,7 @@ } ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL -base64_decode(const char *str, void *data) +rk_base64_decode(const char *str, void *data) { const char *p; unsigned char *q; diff --git a/crypto/heimdal/lib/roken/bswap.c b/crypto/heimdal/lib/roken/bswap.c --- a/crypto/heimdal/lib/roken/bswap.c +++ b/crypto/heimdal/lib/roken/bswap.c @@ -34,6 +34,23 @@ #include #include "roken.h" +#ifndef HAVE_BSWAP64 + +ROKEN_LIB_FUNCTION uint64_t ROKEN_LIB_CALL +bswap64 (uint64_t val) +{ + return + (val & 0xffULL) << 56 | + (val & 0xff00ULL) << 40 | + (val & 0xff0000ULL) << 24 | + (val & 0xff000000ULL) << 8 | + (val & 0xff00000000ULL) >> 8 | + (val & 0xff0000000000ULL) >> 24 | + (val & 0xff000000000000ULL) >> 40 | + (val & 0xff00000000000000ULL) >> 56 ; +} +#endif + #ifndef HAVE_BSWAP32 ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL diff --git a/crypto/heimdal/lib/roken/cloexec.c b/crypto/heimdal/lib/roken/cloexec.c --- a/crypto/heimdal/lib/roken/cloexec.c +++ b/crypto/heimdal/lib/roken/cloexec.c @@ -64,3 +64,12 @@ rk_cloexec(dirfd(d)); #endif } + +void ROKEN_LIB_FUNCTION +rk_cloexec_socket(rk_socket_t s) +{ +#ifndef _WIN32 + rk_cloexec((int)s); +#endif +} + diff --git a/crypto/heimdal/lib/roken/ct.c b/crypto/heimdal/lib/roken/ct.c --- a/crypto/heimdal/lib/roken/ct.c +++ b/crypto/heimdal/lib/roken/ct.c @@ -42,6 +42,12 @@ * ct_memcmp() can't be used to order memory regions like memcmp(), * for example, use ct_memcmp() with qsort(). * + * We use volatile to avoid optimizations where the compiler and/or + * linker turn this ct_memcmp() into a plain memcmp(). The pointers + * themselves are also marked volatile (not just the memory pointed at) + * because in some GCC versions there is a bug which can be worked + * around by doing this. + * * @param p1 memory region 1 to compare * @param p2 memory region 2 to compare * @param len length of memory @@ -52,9 +58,21 @@ */ int -ct_memcmp(const void *p1, const void *p2, size_t len) +ct_memcmp(const volatile void * volatile p1, + const volatile void * volatile p2, + size_t len) { - const unsigned char *s1 = p1, *s2 = p2; + /* + * There's no need for s1 and s2 to be volatile; only p1 and p2 have + * to be in order to work around GCC bugs. + * + * However, s1 and s2 do have to point to volatile, as we don't know + * if the object was originally defined as volatile, and if it was + * then we'd get undefined behavior here if s1/s2 were declared to + * point to non-volatile memory. + */ + const volatile unsigned char *s1 = p1; + const volatile unsigned char *s2 = p2; size_t i; int r = 0; diff --git a/crypto/heimdal/lib/roken/daemon.c b/crypto/heimdal/lib/roken/daemon.c --- a/crypto/heimdal/lib/roken/daemon.c +++ b/crypto/heimdal/lib/roken/daemon.c @@ -72,7 +72,7 @@ dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if (fd > 2) - close (fd); + (void) close(fd); } return (0); } diff --git a/crypto/heimdal/lib/roken/detach.c b/crypto/heimdal/lib/roken/detach.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/detach.c @@ -0,0 +1,213 @@ +/*- + * Copyright (c) 2015 + * Cryptonector LLC. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Cryptonector LLC may not be used to endorse or promote products + * derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#ifdef WIN32 +#include +#include +#else +#include +#endif +#include "roken.h" + +#ifdef WIN32 +#define dup2 _dup2 +#endif + +static int pipefds[2] = {-1, -1}; + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +roken_detach_prep(int argc, char **argv, char *special_arg) +{ + pid_t child; + char buf[1]; + ssize_t bytes; + int status; + + pipefds[0] = -1; + pipefds[1] = -1; + +#ifdef WIN32 + if (_pipe(pipefds, 4, O_BINARY) == -1) + err(1, "failed to setup to detach daemon (_pipe failed)"); +#else + if (pipe(pipefds) == -1) + err(1, "failed to setup to detach daemon (pipe failed)"); +#endif + +#ifndef WIN32 + fflush(stdout); + child = fork(); +#else + { + intptr_t child_handle; + int write_side; + size_t i; + char *fildes; + char **new_argv; + + new_argv = calloc(argc + 2, sizeof(*new_argv)); + if (new_argv == NULL) + err(1, "Out of memory"); + + write_side = _dup(pipefds[1]); /* The new fd will be inherited */ + if (write_side == -1) + err(1, "Out of memory"); + + if (asprintf(&fildes, "%d", write_side) == -1 || + fildes == NULL) + err(1, "failed to setup to detach daemon (_dup failed)"); + + new_argv[0] = argv[0]; + new_argv[1] = special_arg; + new_argv[2] = fildes; + for (i = 1; argv[i] != NULL; i++) + new_argv[i + 1] = argv[i]; + new_argv[argc + 2] = NULL; + + _flushall(); + child_handle = spawnvp(_P_NOWAIT, argv[0], new_argv); + if (child_handle == -1) + child = (pid_t)-1; + else + child = GetProcessId((HANDLE)child_handle); + } +#endif + if (child == (pid_t)-1) + err(1, "failed to setup to fork daemon (fork failed)"); + +#ifndef WIN32 + if (child == 0) { + int fd; + + (void) close(pipefds[0]); + pipefds[0] = -1; + /* + * Keep stdout/stderr for now so output and errors prior to + * detach_finish() can be seen by the user. + */ + fd = open(_PATH_DEVNULL, O_RDWR, 0); + if (fd == -1) + err(1, "failed to open /dev/null"); + (void) dup2(fd, STDIN_FILENO); + if (fd > STDERR_FILENO) + (void) close(fd); + return; + } +#endif + + (void) close(pipefds[1]); + pipefds[1] = -1; + do { + bytes = read(pipefds[0], buf, sizeof(buf)); + } while (bytes == -1 && errno == EINTR); + (void) close(pipefds[0]); + pipefds[0] = -1; + if (bytes == -1) { + /* + * No need to wait for the process. We've killed it. If it + * doesn't want to exit, we'd have to wait potentially forever, + * but we want to indicate failure to the user as soon as + * possible. A wait with timeout would end the same way + * (attempting to kill the process). + */ + err(1, "failed to setup daemon child (read from child pipe)"); + } + if (bytes == 0) { + warnx("daemon child preparation failed, waiting for child"); + status = wait_for_process(child); + if (SE_IS_ERROR(status) || SE_PROCSTATUS(status) != 0) + errx(SE_PROCSTATUS(status), + "daemon child preparation failed (child exited)"); + } + _exit(0); +} + +#ifdef WIN32 +#ifdef dup2 +#undef dup2 +#endif +#define dup2 _dup2 +#endif + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +roken_detach_finish(const char *dir, int daemon_child_fd) +{ + char buf[1] = ""; + ssize_t bytes; + int fd; + + rk_pidfile(NULL); + if (pipefds[1] == -1 && daemon_child_fd != -1) + pipefds[1] = daemon_child_fd; + if (pipefds[0] != -1) + (void) close(pipefds[0]); + if (pipefds[1] == -1) + return; + +#ifdef HAVE_SETSID + if (setsid() == -1) + err(1, "failed to detach from tty"); +#endif + +#ifndef WIN32 + /* + * Hopefully we've written any pidfiles by now, if they had to be in + * the current directory... + * + * The daemons do re-open logs and so on, therefore this chdir() + * call needs to be optional for testing. + */ + if (dir != NULL && chdir(dir) == -1) + err(1, "failed to chdir to /"); +#endif + + do { + bytes = write(pipefds[1], buf, sizeof(buf)); + } while (bytes == -1 && errno == EINTR); + if (bytes == -1) + err(1, "failed to signal parent while detaching"); + (void) close(pipefds[1]); + if (bytes != sizeof(buf)) + errx(1, "failed to signal parent while detaching"); + + fd = open(_PATH_DEVNULL, O_RDWR, 0); + if (fd == -1) + err(1, "failed to open /dev/null"); + /* + * Maybe we should check that our output got written, if redirected + * to a file. File utils normally do this. + */ + (void) dup2(fd, STDOUT_FILENO); + (void) dup2(fd, STDERR_FILENO); + if (fd > 2) + (void) close(fd); +} diff --git a/crypto/heimdal/lib/roken/dirent-test.c b/crypto/heimdal/lib/roken/dirent-test.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/dirent-test.c @@ -0,0 +1,278 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "dirent.h" + +/* Note that we create a known directory structure in a subdirectory + of the current directory to run our tests. */ + +#define TESTDIR "dirent-test-dir" + +const char * dir_entries[] = { + "A", + "B", + "C", + "CAA", + "CAAA", + "CABBBB", + "CAABBB.txt", + "A filename with spaces" +}; + +const char * entries_begin_with_C[] = { + "C", + "CAA", + "CAAA", + "CABBBB", + "CAABBB.txt" +}; + +const char * entries_end_with_A[] = { + "A", + "CAA", + "CAAA" +}; + +const int n_dir_entries = sizeof(dir_entries)/sizeof(dir_entries[0]); + +int teardown_test(void); + +void fail_test(const char * reason, ...) +{ + va_list args; + + va_start(args, reason); + vfprintf(stderr, reason, args); + va_end(args); + + fprintf(stderr, " : errno = %d (%s)\n", errno, strerror(errno)); + teardown_test(); + abort(); +} + +void fail_test_nf(const char * format, ...) +{ + va_list args; + + fprintf(stderr, "FAIL:"); + + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + + fprintf(stderr, " : errno = %d (%s)\n", errno, strerror(errno)); +} + +int touch(const char * filename) +{ + int fd; + + fd = _open(filename, _O_CREAT, _S_IREAD| _S_IWRITE); + + if (fd == -1) + return -1; + + return _close(fd); +} + +int setup_test(void) +{ + int i; + + fprintf(stderr, "Creating test directory %s ...\n", TESTDIR); + + if (_mkdir(TESTDIR)) + fail_test("Can't create test directory \"" TESTDIR "\""); + + if (_chdir(TESTDIR)) + fail_test("Can't change to test directory"); + + for (i=0; i < n_dir_entries; i++) { + if (touch(dir_entries[i])) + fail_test("Can't create test file '%s'", dir_entries[i]); + } + + fprintf(stderr, "Done with test setup.\n"); + + return 0; +} + +int teardown_test(void) +{ + char dirname[_MAX_PATH]; + size_t len; + int i; + + printf ("Begin cleanup...\n"); + + if (_getcwd(dirname, sizeof(dirname)/sizeof(char)) != NULL && + + (len = strlen(dirname)) > sizeof(TESTDIR)/sizeof(char) && + + !strcmp(dirname + len + 1 - sizeof(TESTDIR)/sizeof(char), TESTDIR)) { + + /* fallthrough */ + + } else { + /* did we create the directory? */ + + if (!_rmdir( TESTDIR )) { + fprintf(stderr, "Removed test directory\n"); + return 0; + } else { + if (errno == ENOTEMPTY) { + if (_chdir(TESTDIR)) { + fprintf(stderr, "Can't change to test directory. Aborting cleanup.\n"); + return -1; + } else { + /* fallthrough */ + } + } else { + return -1; + } + } + } + + fprintf(stderr, "Cleaning up test directory %s ...\n", TESTDIR); + + for (i=0; i < n_dir_entries; i++) { + if (_unlink(dir_entries[i])) { + /* if the test setup failed, we expect this to happen for + at least some files */ + } + } + + if (_chdir("..")) { + fprintf(stderr, "Can't escape test directory. Giving in.\n"); + return -1; + } + + if (_rmdir( TESTDIR )) { + fprintf(stderr, "Can't remove test directory.\n"); + return -1; + } + + printf("Cleaned up test directory\n"); + return 0; +} + +int check_list(const char * filespec, const char ** list, int n, int expect_dot_and_dotdot) +{ + DIR * d; + struct dirent * e; + int n_found = 0; + int i; + int rv = 0; + int retry = 1; + + d = opendir(filespec); + if (d == NULL) { + fail_test_nf("opendir failed for [%s]", filespec); + return -1; + } + + printf("Checking filespec [%s]... ", filespec); + + retry: + while ((e = readdir(d)) != NULL) { + n_found ++; + + if (expect_dot_and_dotdot && + (!strcmp(e->d_name, ".") || + !strcmp(e->d_name, ".."))) + continue; + + for (i=0; i < n; i++) { + if (!strcmp(list[i], e->d_name)) + break; + } + + if (i == n) { + fail_test_nf("Found unexpected entry [%s]", e->d_name); + rv = -1; + } + } + + if (n_found != n) { + fail_test_nf("Unexpected number of entries [%d]. Expected %d", n_found, n); + rv = -1; + } + + if (retry) { + retry = 0; + n_found = 0; + + rewinddir(d); + goto retry; + } + + if (closedir(d)) { + fail_test_nf("closedir() failed"); + } + + printf("done\n"); + + return rv; +} + +int run_tests() +{ + /* assumes that the test directory has been set up and we have + changed into the test directory. */ + + check_list("*", dir_entries, n_dir_entries + 2, 1); + check_list("*.*", dir_entries, n_dir_entries + 2, 1); + check_list("C*", entries_begin_with_C, sizeof(entries_begin_with_C)/sizeof(entries_begin_with_C[0]), 0); + check_list("*A", entries_end_with_A, sizeof(entries_end_with_A)/sizeof(entries_end_with_A[0]), 0); + + return 0; +} + +int main(int argc, char ** argv) +{ + if (setup_test()) + return 1; + + run_tests(); + + teardown_test(); + + return 0; +} diff --git a/crypto/heimdal/lib/roken/dirent.hin b/crypto/heimdal/lib/roken/dirent.hin new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/dirent.hin @@ -0,0 +1,66 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#ifndef __DIRENT_H__ +#define __DIRENT_H__ + +#ifndef ROKEN_LIB_FUNCTION +#ifdef _WIN32 +#define ROKEN_LIB_FUNCTION +#define ROKEN_LIB_CALL __cdecl +#else +#define ROKEN_LIB_FUNCTION +#define ROKEN_LIB_CALL +#endif +#endif + +#include + +struct dirent { + ino_t d_ino; + char d_name[1]; +}; + +typedef struct _dirent_dirinfo DIR; + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL closedir(DIR *); + +ROKEN_LIB_FUNCTION DIR * ROKEN_LIB_CALL opendir(const char *); + +ROKEN_LIB_FUNCTION struct dirent * ROKEN_LIB_CALL readdir(DIR *); + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL rewinddir(DIR *); + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL seekdir(DIR *, long); + +ROKEN_LIB_FUNCTION long ROKEN_LIB_CALL telldir(DIR *); + +#endif diff --git a/crypto/heimdal/lib/roken/dirent.c b/crypto/heimdal/lib/roken/dirent.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/dirent.c @@ -0,0 +1,235 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include + +#include +#include +#include +#include +#include "dirent.h" + +#ifndef _WIN32 +#error Only implemented for Win32 +#endif + +struct _dirent_dirinfo { + int magic; + long n_entries; + long nc_entries; + long cursor; + struct dirent **entries; +}; +#define DIRINFO_MAGIC 0xf8c0639d +#define IS_DP(p) ((p) && ((DIR *)(p))->magic == DIRINFO_MAGIC) + +#define INITIAL_ENTRIES 16 + +/** + * Create a filespec for use with _findfirst() using a path spec + * + * If the last component of the path spec contains wildcards, we let + * it be. If the last component doesn't end with a slash, we add one. + */ +static const char * +filespec_from_dir_path(const char * path, char * buffer, size_t cch_buffer) +{ + char *comp, *t; + size_t pos; + int found_sep = 0; + + if (strcpy_s(buffer, cch_buffer, path) != 0) + return NULL; + + comp = strrchr(buffer, '\\'); + if (comp == NULL) + comp = buffer; + else + found_sep = 1; + + t = strrchr(comp, '/'); + if (t != NULL) { + comp = t; + found_sep = 1; + } + + if (found_sep) + comp++; + + pos = strcspn(comp, "*?"); + if (comp[pos] != '\0') + return buffer; + + /* We don't append a slash if pos == 0 because that changes the + * meaning: + * + * "*.*" is all files in the current directory. + * "\*.*" is all files in the root directory of the current drive. + */ + if (pos > 0 && comp[pos - 1] != '\\' && + comp[pos - 1] != '/') { + strcat_s(comp, cch_buffer - (comp - buffer), "\\"); + } + + strcat_s(comp, cch_buffer - (comp - buffer), "*.*"); + + return buffer; +} + +ROKEN_LIB_FUNCTION DIR * ROKEN_LIB_CALL +opendir(const char * path) +{ + DIR * dp; + struct _finddata_t fd; + intptr_t fd_handle; + const char *filespec; + char path_buffer[1024]=""; + + memset(&fd, 0, sizeof(fd)); + + filespec = filespec_from_dir_path(path, path_buffer, sizeof(path_buffer)/sizeof(char)); + if (filespec == NULL) + return NULL; + + fd_handle = _findfirst(filespec, &fd); + + if (fd_handle == -1) + return NULL; + + dp = malloc(sizeof(*dp)); + if (dp == NULL) + goto done; + + memset(dp, 0, sizeof(*dp)); + dp->magic = DIRINFO_MAGIC; + dp->cursor = 0; + dp->n_entries = 0; + dp->nc_entries = INITIAL_ENTRIES; + dp->entries = calloc(dp->nc_entries, sizeof(dp->entries[0])); + + if (dp->entries == NULL) { + closedir(dp); + dp = NULL; + goto done; + } + + do { + size_t len = strlen(fd.name); + struct dirent * e; + + if (dp->n_entries == dp->nc_entries) { + struct dirent ** ne; + + dp->nc_entries *= 2; + ne = realloc(dp->entries, sizeof(dp->entries[0]) * dp->nc_entries); + + if (ne == NULL) { + closedir(dp); + dp = NULL; + goto done; + } + + dp->entries = ne; + } + + e = malloc(sizeof(*e) + len * sizeof(char)); + if (e == NULL) { + closedir(dp); + dp = NULL; + goto done; + } + + e->d_ino = 0; /* no inodes :( */ + strcpy_s(e->d_name, len + 1, fd.name); + + dp->entries[dp->n_entries++] = e; + + } while (_findnext(fd_handle, &fd) == 0); + + done: + if (fd_handle != -1) + _findclose(fd_handle); + + return dp; +} + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +closedir(DIR * dp) +{ + if (!IS_DP(dp)) + return EINVAL; + + if (dp->entries) { + long i; + + for (i=0; i < dp->n_entries; i++) { + free(dp->entries[i]); + } + + free(dp->entries); + } + + free(dp); + + return 0; +} + +ROKEN_LIB_FUNCTION struct dirent * ROKEN_LIB_CALL +readdir(DIR * dp) +{ + if (!IS_DP(dp) || + dp->cursor < 0 || + dp->cursor >= dp->n_entries) + + return NULL; + + return dp->entries[dp->cursor++]; +} + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +rewinddir(DIR * dp) +{ + if (IS_DP(dp)) + dp->cursor = 0; +} + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +seekdir(DIR * dp, long offset) +{ + if (IS_DP(dp) && offset >= 0 && offset < dp->n_entries) + dp->cursor = offset; +} + +ROKEN_LIB_FUNCTION long ROKEN_LIB_CALL +telldir(DIR * dp) +{ + return dp->cursor; +} diff --git a/crypto/heimdal/lib/roken/dlfcn.hin b/crypto/heimdal/lib/roken/dlfcn.hin new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/dlfcn.hin @@ -0,0 +1,92 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#ifndef __dlfcn_h__ +#define __dlfcn_h__ + +#include + +#ifndef ROKEN_LIB_FUNCTION +#ifdef _WIN32 +#define ROKEN_LIB_FUNCTION +#define ROKEN_LIB_CALL __cdecl +#else +#define ROKEN_LIB_FUNCTION +#define ROKEN_LIB_CALL +#endif +#endif + +#ifdef _WIN32 +typedef int (__stdcall *DLSYM_RET_TYPE)(); +#else +#define DLSYM_RET_TYPE void * +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Implementation based on + http://www.opengroup.org/onlinepubs/009695399/basedefs/dlfcn.h.html */ + +#define RTLD_LAZY (1<<0) + +#define RTLD_NOW (1<<1) + +#define RTLD_GLOBAL (1<<2) + +#define RTLD_LOCAL (1<<3) + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +dlclose(void *); + +ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL +dlerror(void); + +ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL +dlopen(const char *, int); + +ROKEN_LIB_FUNCTION DLSYM_RET_TYPE ROKEN_LIB_CALL +dlsym(void *, const char *); + +typedef struct Dl_info { + char *dli_fname; + char _dli_buf[MAX_PATH + 2]; +} Dl_info, Dl_info_t; + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +dladdr(void *addr, Dl_info *dli); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __dlfcn_h__ */ diff --git a/crypto/heimdal/lib/roken/dlfcn_w32.c b/crypto/heimdal/lib/roken/dlfcn_w32.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/dlfcn_w32.c @@ -0,0 +1,185 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include +#include +#include +#include + +#define ERR_STR_LEN 256 + +static volatile LONG dlfcn_tls = TLS_OUT_OF_INDEXES; + +static DWORD get_tl_error_slot(void) +{ + if (dlfcn_tls == TLS_OUT_OF_INDEXES) { + DWORD slot = TlsAlloc(); + DWORD old_slot; + + if (slot == TLS_OUT_OF_INDEXES) + return dlfcn_tls; + + if ((old_slot = InterlockedCompareExchange(&dlfcn_tls, slot, + TLS_OUT_OF_INDEXES)) != + TLS_OUT_OF_INDEXES) { + + /* Lost a race */ + TlsFree(slot); + return old_slot; + } else { + return slot; + } + } + + return dlfcn_tls; +} + +static void set_error(const char * e) +{ + char * s; + char * old_s; + size_t len; + + DWORD slot = get_tl_error_slot(); + + if (slot == TLS_OUT_OF_INDEXES) + return; + + len = strlen(e) * sizeof(char) + sizeof(char); + s = LocalAlloc(LMEM_FIXED, len); + if (s == NULL) + return; + + old_s = (char *) TlsGetValue(slot); + TlsSetValue(slot, (LPVOID) s); + + if (old_s != NULL) + LocalFree(old_s); +} + +static void set_error_from_last(void) { + DWORD slot = get_tl_error_slot(); + char * s = NULL; + char * old_s; + + if (slot == TLS_OUT_OF_INDEXES) + return; + + FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, + 0, GetLastError(), 0, + (LPTSTR) &s, 0, + NULL); + if (s == NULL) + return; + + old_s = (char *) TlsGetValue(slot); + TlsSetValue(slot, (LPVOID) s); + + if (old_s != NULL) + LocalFree(old_s); +} + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +dlclose(void * vhm) +{ + BOOL brv; + + brv = FreeLibrary((HMODULE) vhm); + if (!brv) { + set_error_from_last(); + } + return !brv; +} + +ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL +dlerror(void) +{ + DWORD slot = get_tl_error_slot(); + + if (slot == TLS_OUT_OF_INDEXES) + return NULL; + + return (char *) TlsGetValue(slot); +} + +ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL +dlopen(const char *fn, int flags) +{ + HMODULE hm; + UINT old_error_mode; + + /* We don't support dlopen(0, ...) on Windows.*/ + if ( fn == NULL ) { + set_error("Not implemented"); + return NULL; + } + + old_error_mode = SetErrorMode(SEM_FAILCRITICALERRORS); + + hm = LoadLibraryEx(fn, 0, LOAD_WITH_ALTERED_SEARCH_PATH); + + if (hm == NULL) { + set_error_from_last(); + } + + SetErrorMode(old_error_mode); + + return (void *) hm; +} + +ROKEN_LIB_FUNCTION DLSYM_RET_TYPE ROKEN_LIB_CALL +dlsym(void * vhm, const char * func_name) +{ + HMODULE hm = (HMODULE) vhm; + + return (DLSYM_RET_TYPE)(ULONG_PTR)GetProcAddress(hm, func_name); +} + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +dladdr(void *addr, Dl_info *dli) +{ + HMODULE hm; + DWORD nsize; + + memset(dli, 0, sizeof(*dli)); + dli->dli_fname = dli->_dli_buf; + + if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCTSTR)(ULONG_PTR)addr, &hm)) + return 0; + + nsize = GetModuleFileName(hm, dli->_dli_buf, sizeof(dli->_dli_buf)); + dli->_dli_buf[sizeof(dli->_dli_buf) - 1] = '\0'; + if (nsize >= sizeof(dli->_dli_buf)) + return 0; /* truncated? can't be... */ + return 1; +} diff --git a/crypto/heimdal/lib/roken/dumpdata.c b/crypto/heimdal/lib/roken/dumpdata.c --- a/crypto/heimdal/lib/roken/dumpdata.c +++ b/crypto/heimdal/lib/roken/dumpdata.c @@ -81,14 +81,16 @@ sret = net_read(fd, *buf, *size); if (sret < 0) ret = errno; - else if (sret != (ssize_t)*size) { + else if (sret != (ssize_t)*size) ret = EINVAL; - free(*buf); - *buf = NULL; - } else + else ret = 0; - out: + out: + if (ret) { + free(*buf); + *buf = NULL; + } close(fd); return ret; } diff --git a/crypto/heimdal/lib/roken/ecalloc.cat3 b/crypto/heimdal/lib/roken/ecalloc.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/ecalloc.cat3 @@ -0,0 +1,46 @@ +ECALLOC(3) BSD Library Functions Manual ECALLOC(3) + +NAME + ecalloc, emalloc, eread, erealloc, esetenv, estrdup, ewrite -- exit-on- + failure wrapper functions + +LIBRARY + The roken library (libroken, -lroken) + +SYNOPSIS + #include  + + void * + ecalloc(size_t number, size_t size); + + void * + emalloc(size_t sz); + + ssize_t + eread(int fd, void *buf, size_t nbytes); + + void * + erealloc(void *ptr, size_t sz); + + void + esetenv(const char *var, const char *val, int rewrite); + + char * + estrdup(const char *str); + + ssize_t + ewrite(int fd, const void *buf, size_t nbytes); + +DESCRIPTION + These functions do the same as the ones without the "e" prefix, but if + there is an error they will print a message with errx(3), and exit. For + eread and ewrite this is also true for partial data. + + This is useful in applications when there is no need for a more advanced + failure mode. + +SEE ALSO + read(2), write(2), calloc(3), errx(3), malloc(3), realloc(3), setenv(3), + strdup(3) + +HEIMDAL August 14, 2003 HEIMDAL diff --git a/crypto/heimdal/lib/roken/err.hin b/crypto/heimdal/lib/roken/err.hin --- a/crypto/heimdal/lib/roken/err.hin +++ b/crypto/heimdal/lib/roken/err.hin @@ -58,33 +58,33 @@ ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL verr(int eval, const char *fmt, va_list ap) - __attribute__ ((noreturn, format (printf, 2, 0))); + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 0))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL err(int eval, const char *fmt, ...) - __attribute__ ((noreturn, format (printf, 2, 3))); + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL verrx(int eval, const char *fmt, va_list ap) - __attribute__ ((noreturn, format (printf, 2, 0))); + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 0))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL errx(int eval, const char *fmt, ...) - __attribute__ ((noreturn, format (printf, 2, 3))); + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL vwarn(const char *fmt, va_list ap) - __attribute__ ((format (printf, 1, 0))); + __attribute__ ((__format__ (__printf__, 1, 0))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL warn(const char *fmt, ...) - __attribute__ ((format (printf, 1, 2))); + __attribute__ ((__format__ (__printf__, 1, 2))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL vwarnx(const char *fmt, va_list ap) - __attribute__ ((format (printf, 1, 0))); + __attribute__ ((__format__ (__printf__, 1, 0))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL warnx(const char *fmt, ...) - __attribute__ ((format (printf, 1, 2))); + __attribute__ ((__format__ (__printf__, 1, 2))); #endif /* __ERR_H__ */ diff --git a/crypto/heimdal/lib/roken/getarg.3 b/crypto/heimdal/lib/roken/getarg.3 --- a/crypto/heimdal/lib/roken/getarg.3 +++ b/crypto/heimdal/lib/roken/getarg.3 @@ -106,7 +106,7 @@ .Dv NULL , if you don't want a long name. .Fa short_name -is the character to use as short option, it can be zero. If the option +is the characted to use as short option, it can be zero. If the option has a value the .Fa value field gets filled in with that value interpreted as specified by the diff --git a/crypto/heimdal/lib/roken/getarg.c b/crypto/heimdal/lib/roken/getarg.c --- a/crypto/heimdal/lib/roken/getarg.c +++ b/crypto/heimdal/lib/roken/getarg.c @@ -595,7 +595,7 @@ int main(int argc, char **argv) { int goptind = 0; - while(getarg(args, 5, argc, argv, &goptind)) + while (getarg(args, 5, argc, argv, &goptind)) printf("Bad arg: %s\n", argv[goptind]); printf("flag1 = %d\n", flag1); printf("flag2 = %d\n", flag2); diff --git a/crypto/heimdal/lib/roken/getarg.cat3 b/crypto/heimdal/lib/roken/getarg.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/getarg.cat3 @@ -0,0 +1,230 @@ +GETARG(3) BSD Library Functions Manual GETARG(3) + +NAME + getarg, arg_printusage -- collect command line options + +SYNOPSIS + #include  + + int + getarg(struct getargs *args, size_t num_args, int argc, char **argv, + int *optind); + + void + arg_printusage(struct getargs *args, size_t num_args, + const char *progname, const char *extra_string); + +DESCRIPTION + getarg() collects any command line options given to a program in an eas- + ily used way. arg_printusage() pretty-prints the available options, with + a short help text. + + args is the option specification to use, and it's an array of struct + getargs elements. num_args is the size of args (in elements). argc and + argv are the argument count and argument vector to extract option from. + optind is a pointer to an integer where the index to the last processed + argument is stored, it must be initialised to the first index (minus one) + to process (normally 0) before the first call. + + arg_printusage take the same args and num_args as getarg; progname is the + name of the program (to be used in the help text), and extra_string is a + string to print after the actual options to indicate more arguments. The + usefulness of this function is realised only be people who has used pro- + grams that has help strings that doesn't match what the code does. + + The getargs struct has the following elements. + + struct getargs{ + const char *long_name; + char short_name; + enum { arg_integer, + arg_string, + arg_flag, + arg_negative_flag, + arg_strings, + arg_double, + arg_collect + } type; + void *value; + const char *help; + const char *arg_help; + }; + + long_name is the long name of the option, it can be NULL, if you don't + want a long name. short_name is the characted to use as short option, it + can be zero. If the option has a value the value field gets filled in + with that value interpreted as specified by the type field. help is a + longer help string for the option as a whole, if it's NULL the help text + for the option is omitted (but it's still displayed in the synopsis). + arg_help is a description of the argument, if NULL a default value will + be used, depending on the type of the option: + + arg_integer the argument is a signed integer, and value should + point to an int. + + arg_string the argument is a string, and value should point to a + char*. + + arg_flag the argument is a flag, and value should point to a + int. It gets filled in with either zero or one, de- + pending on how the option is given, the normal case + being one. Note that if the option isn't given, the + value isn't altered, so it should be initialised to + some useful default. + + arg_negative_flag this is the same as arg_flag but it reverses the mean- + ing of the flag (a given short option clears the + flag), and the synopsis of a long option is negated. + + arg_strings the argument can be given multiple times, and the val- + ues are collected in an array; value should be a + pointer to a struct getarg_strings structure, which + holds a length and a string pointer. + + arg_double argument is a double precision floating point value, + and value should point to a double. + + arg_collect allows more fine-grained control of the option parsing + process. value should be a pointer to a + getarg_collect_info structure: + + typedef int (*getarg_collect_func)(int short_opt, + int argc, + char **argv, + int *optind, + int *optarg, + void *data); + + typedef struct getarg_collect_info { + getarg_collect_func func; + void *data; + } getarg_collect_info; + + With the func member set to a function to call, and + data to some application specific data. The parameters + to the collect function are: + + short_flag non-zero if this call is via a short option + flag, zero otherwise + + argc, argv the whole argument list + + optind pointer to the index in argv where the flag is + + optarg pointer to the index in argv[*optind] where the + flag name starts + + data application specific data + + You can modify *optind, and *optarg, but to do this + correct you (more or less) have to know about the in- + ner workings of getarg. + + You can skip parts of arguments by increasing *optarg + (you could implement the -z3 set of flags from gzip + with this), or whole argument strings by increasing + *optind (let's say you want a flag -c x y z to specify + a coordinate); if you also have to set *optarg to a + sane value. + + The collect function should return one of + ARG_ERR_NO_MATCH, ARG_ERR_BAD_ARG, ARG_ERR_NO_ARG, + ENOMEM on error, zero otherwise. + + For your convenience there is a function, + getarg_optarg(), that returns the traditional argument + string, and you pass it all arguments, sans data, that + where given to the collection function. + + Don't use this more this unless you absolutely have + to. + + Option parsing is similar to what getopt uses. Short options without ar- + guments can be compressed (-xyz is the same as -x -y -z), and short op- + tions with arguments take these as either the rest of the argv-string or + as the next option (-ofoo, or -o foo). + + Long option names are prefixed with -- (double dash), and the value with + a = (equal), --foo=bar. Long option flags can either be specified as + they are (--help), or with an (boolean parsable) option (--help=yes, + --help=true, or similar), or they can also be negated (--no-help is the + same as --help=no), and if you're really confused you can do it multiple + times (--no-no-help=false, or even --no-no-help=maybe). + +EXAMPLE + #include + #include + #include + + char *source = "Ouagadougou"; + char *destination; + int weight; + int include_catalog = 1; + int help_flag; + + struct getargs args[] = { + { "source", 's', arg_string, &source, + "source of shippment", "city" }, + { "destination", 'd', arg_string, &destination, + "destination of shippment", "city" }, + { "weight", 'w', arg_integer, &weight, + "weight of shippment", "tons" }, + { "catalog", 'c', arg_negative_flag, &include_catalog, + "include product catalog" }, + { "help", 'h', arg_flag, &help_flag } + }; + + int num_args = sizeof(args) / sizeof(args[0]); /* number of elements in args */ + + const char *progname = "ship++"; + + int + main(int argc, char **argv) + { + int optind = 0; + if (getarg(args, num_args, argc, argv, &optind)) { + arg_printusage(args, num_args, progname, "stuff..."); + exit (1); + } + if (help_flag) { + arg_printusage(args, num_args, progname, "stuff..."); + exit (0); + } + if (destination == NULL) { + fprintf(stderr, "%s: must specify destination\n", progname); + exit(1); + } + if (strcmp(source, destination) == 0) { + fprintf(stderr, "%s: destination must be different from source\n"); + exit(1); + } + /* include more stuff here ... */ + exit(2); + } + + The output help output from this program looks like this: + + $ ship++ --help + Usage: ship++ [--source=city] [-s city] [--destination=city] [-d city] + [--weight=tons] [-w tons] [--no-catalog] [-c] [--help] [-h] stuff... + -s city, --source=city source of shippment + -d city, --destination=city destination of shippment + -w tons, --weight=tons weight of shippment + -c, --no-catalog include product catalog + +BUGS + It should be more flexible, so it would be possible to use other more + complicated option syntaxes, such as what ps(1), and tar(1), uses, or the + AFS model where you can skip the flag names as long as the options come + in the correct order. + + Options with multiple arguments should be handled better. + + Should be integrated with SL. + + It's very confusing that the struct you pass in is called getargS. + +SEE ALSO + getopt(3) + +ROKEN September 24, 1999 ROKEN diff --git a/crypto/heimdal/lib/roken/getcap.c b/crypto/heimdal/lib/roken/getcap.c --- a/crypto/heimdal/lib/roken/getcap.c +++ b/crypto/heimdal/lib/roken/getcap.c @@ -52,9 +52,6 @@ #include #define BFRAG 1024 -#if 0 -#define BSIZE 1024 -#endif #define ESC ('[' & 037) /* ASCII ESC */ #define MAX_RECURSION 32 /* maximum getent recursion */ #define SFRAG 100 /* cgetstr mallocs in SFRAG chunks */ @@ -67,15 +64,6 @@ static char *toprec; /* Additional record specified by cgetset() */ static int gottoprec; /* Flag indicating retrieval of toprecord */ -#if 0 /* - * Don't use db support unless it's build into libc but we don't - * check for that now, so just disable the code. - */ -#if defined(HAVE_DBOPEN) && defined(HAVE_DB_H) -#define USE_DB -#endif -#endif - #ifdef USE_DB static int cdbget (DB *, char **, const char *); #endif @@ -88,10 +76,6 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetent(char **buf, char **db_array, const char *name); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetmatch(const char *buf, const char *name); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetclose(void); -#if 0 -int cgetfirst(char **buf, char **db_array); -int cgetnext(char **bp, char **db_array); -#endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetstr(char *buf, const char *cap, char **str); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetustr(char *buf, const char *cap, char **str); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetnum(char *buf, const char *cap, long *num); @@ -250,12 +234,12 @@ * Check if we have a top record from cgetset(). */ if (depth == 0 && toprec != NULL && cgetmatch(toprec, name) == 0) { - size_t len = topreclen + BFRAG; - if ((record = malloc (len)) == NULL) { + size_t tmplen = topreclen + BFRAG; + if ((record = malloc (tmplen)) == NULL) { errno = ENOMEM; return (-2); } - (void)strlcpy(record, toprec, len); + (void)strlcpy(record, toprec, tmplen); db_p = db_array; rp = record + topreclen + 1; r_end = rp + BFRAG; @@ -296,6 +280,7 @@ != NULL) { free(record); retval = cdbget(capdbp, &record, name); + /* record is no longer for us to free here */ if (retval < 0) { /* no record available */ (void)capdbp->close(capdbp); @@ -416,17 +401,20 @@ */ if (rp >= r_end) { u_int pos; + char *tmp; size_t newsize; pos = rp - record; newsize = r_end - record + BFRAG; - record = realloc(record, newsize); - if (record == NULL) { + tmp = realloc(record, newsize); + if (tmp == NULL) { errno = ENOMEM; if (myfd) (void)close(fd); + free(record); return (-2); } + record = tmp; r_end = record + newsize; rp = record + pos; } @@ -464,8 +452,10 @@ break; } - if (!foundit) + if (!foundit) { + free(record); return (-1); + } /* * Got the capability record, but now we have to expand all tc=name @@ -557,19 +547,22 @@ if (diff >= r_end - rp) { u_int pos, tcpos, tcposend; size_t newsize; + char *tmp; pos = rp - record; newsize = r_end - record + diff + BFRAG; tcpos = tcstart - record; tcposend = tcend - record; - record = realloc(record, newsize); - if (record == NULL) { + tmp = realloc(record, newsize); + if (tmp == NULL) { errno = ENOMEM; if (myfd) (void)close(fd); free(icap); + free(record); return (-2); } + record = tmp; r_end = record + newsize; rp = record + pos; tcstart = record + tcpos; @@ -600,12 +593,15 @@ if (myfd) (void)close(fd); *len = rp - record - 1; /* don't count NUL */ - if (r_end > rp) - if ((record = - realloc(record, (size_t)(rp - record))) == NULL) { + if (r_end > rp) { + char *tmp = realloc(record, (size_t)(rp - record)); + if (tmp == NULL) { errno = ENOMEM; + free(record); return (-2); } + record = tmp; + } *cap = record; if (tc_not_resolved) @@ -687,15 +683,6 @@ } } -#if 0 -int -cgetfirst(char **buf, char **db_array) -{ - (void)cgetclose(); - return (cgetnext(buf, db_array)); -} -#endif - static FILE *pfp; static int slash; static char **dbp; @@ -713,131 +700,6 @@ return(0); } -#if 0 -/* - * Cgetnext() gets either the first or next entry in the logical database - * specified by db_array. It returns 0 upon completion of the database, 1 - * upon returning an entry with more remaining, and -1 if an error occurs. - */ -int -cgetnext(char **bp, char **db_array) -{ - size_t len; - int status, done; - char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE]; - size_t dummy; - - if (dbp == NULL) - dbp = db_array; - - if (pfp == NULL && (pfp = fopen(*dbp, "r")) == NULL) { - (void)cgetclose(); - return (-1); - } - for(;;) { - if (toprec && !gottoprec) { - gottoprec = 1; - line = toprec; - } else { - line = fgetln(pfp, &len); - if (line == NULL && pfp) { - if (ferror(pfp)) { - (void)cgetclose(); - return (-1); - } else { - (void)fclose(pfp); - pfp = NULL; - if (*++dbp == NULL) { - (void)cgetclose(); - return (0); - } else if ((pfp = - fopen(*dbp, "r")) == NULL) { - (void)cgetclose(); - return (-1); - } else - continue; - } - } else - line[len - 1] = '\0'; - if (len == 1) { - slash = 0; - continue; - } - if (isspace((unsigned char)*line) || - *line == ':' || *line == '#' || slash) { - if (line[len - 2] == '\\') - slash = 1; - else - slash = 0; - continue; - } - if (line[len - 2] == '\\') - slash = 1; - else - slash = 0; - } - - - /* - * Line points to a name line. - */ - done = 0; - np = nbuf; - for (;;) { - for (cp = line; *cp != '\0'; cp++) { - if (*cp == ':') { - *np++ = ':'; - done = 1; - break; - } - if (*cp == '\\') - break; - *np++ = *cp; - } - if (done) { - *np = '\0'; - break; - } else { /* name field extends beyond the line */ - line = fgetln(pfp, &len); - if (line == NULL && pfp) { - if (ferror(pfp)) { - (void)cgetclose(); - return (-1); - } - (void)fclose(pfp); - pfp = NULL; - *np = '\0'; - break; - } else - line[len - 1] = '\0'; - } - } - rp = buf; - for(cp = nbuf; *cp != '\0'; cp++) - if (*cp == '|' || *cp == ':') - break; - else - *rp++ = *cp; - - *rp = '\0'; - /* - * XXX - * Last argument of getent here should be nbuf if we want true - * sequential access in the case of duplicates. - * With NULL, getent will return the first entry found - * rather than the duplicate entry record. This is a - * matter of semantics that should be resolved. - */ - status = getent(bp, &dummy, db_array, -1, buf, 0, NULL); - if (status == -2 || status == -3) - (void)cgetclose(); - - return (status + 1); - } - /* NOTREACHED */ -} -#endif - /* * Cgetstr retrieves the value of the string capability cap from the * capability record pointed to by buf. A pointer to a decoded, NUL @@ -1036,9 +898,14 @@ /* * Give back any extra memory and return value and success. */ - if (m_room != 0) - if ((mem = realloc(mem, (size_t)(mp - mem))) == NULL) + if (m_room != 0) { + char *tmp = realloc(mem, (size_t)(mp - mem)); + if (tmp == NULL) { + free(mem); return (-2); + } + mem = tmp; + } *str = mem; return (len); } diff --git a/crypto/heimdal/lib/roken/getifaddrs-test.c b/crypto/heimdal/lib/roken/getifaddrs-test.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/getifaddrs-test.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2009 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Portions Copyright (c) 2009, Secure Endpoints Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include "getarg.h" + +#include "roken.h" + +#include + +static int verbose_counter; +static int version_flag; +static int help_flag; + +static struct getargs args[] = { + {"verbose", 0, arg_counter, &verbose_counter,"verbose", NULL}, + {"version", 0, arg_flag, &version_flag, "print version",NULL}, + {"help", 0, arg_flag, &help_flag, NULL, NULL} +}; + +static void +usage(int ret) +{ + arg_printusage (args, + sizeof(args) / sizeof(args[0]), + NULL, ""); + exit (ret); +} + + +static void +print_addr(const char *s, struct sockaddr *sa) +{ + int i; + printf(" %s=%d/", s, sa->sa_family); +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + for(i = 0; i < sa->sa_len - ((long)sa->sa_data - (long)&sa->sa_family); i++) + printf("%02x", ((unsigned char*)sa->sa_data)[i]); +#else + for(i = 0; i < sizeof(sa->sa_data); i++) + printf("%02x", ((unsigned char*)sa->sa_data)[i]); +#endif + printf("\n"); +} + +static void +print_ifaddrs(struct ifaddrs *x) +{ + struct ifaddrs *p; + + for(p = x; p; p = p->ifa_next) { + if (verbose_counter) { + printf("%s\n", p->ifa_name); + printf(" flags=%x\n", p->ifa_flags); + if(p->ifa_addr) + print_addr("addr", p->ifa_addr); + if(p->ifa_dstaddr) + print_addr("dstaddr", p->ifa_dstaddr); + if(p->ifa_netmask) + print_addr("netmask", p->ifa_netmask); + printf(" %p\n", p->ifa_data); + } + } +} + +int +main(int argc, char **argv) +{ + struct ifaddrs *addrs = NULL; + int ret, optidx = 0; + + setprogname (argv[0]); + + if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, + &optidx)) + usage (1); + + if (help_flag) + usage (0); + + if (version_flag) { + fprintf (stderr, "%s from %s-%s\n", getprogname(), PACKAGE, VERSION); + return 0; + } + + if (rk_SOCK_INIT()) + errx(1, "Couldn't initialize sockets. Err=%d\n", rk_SOCK_ERRNO); + + ret = getifaddrs(&addrs); + if (ret != 0) + err(1, "getifaddrs"); + + if (addrs == NULL) + errx(1, "address == NULL"); + + print_ifaddrs(addrs); + + /* Check that freeifaddrs doesn't crash */ + freeifaddrs(addrs); + + rk_SOCK_EXIT(); + + return 0; +} diff --git a/crypto/heimdal/lib/roken/getifaddrs_w32.c b/crypto/heimdal/lib/roken/getifaddrs_w32.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/getifaddrs_w32.c @@ -0,0 +1,161 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include + +#include + +#include + +#ifndef _WIN32 +#error This is a Windows specific implementation. +#endif + +static struct sockaddr * +dupaddr(const sockaddr_gen * src) +{ + sockaddr_gen * d = malloc(sizeof(*d)); + + if (d) { + memcpy(d, src, sizeof(*d)); + } + + return (struct sockaddr *) d; +} + +int ROKEN_LIB_FUNCTION +rk_getifaddrs(struct ifaddrs **ifpp) +{ + SOCKET s = INVALID_SOCKET; + size_t il_len = 8192; + int ret = -1; + INTERFACE_INFO *il = NULL; + + *ifpp = NULL; + + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s == INVALID_SOCKET) + return -1; + + for (;;) { + DWORD cbret = 0; + + il = malloc(il_len); + if (!il) + break; + + ZeroMemory(il, il_len); + + if (WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0, + (LPVOID) il, (DWORD) il_len, &cbret, + NULL, NULL) == 0) { + il_len = cbret; + break; + } + + free (il); + il = NULL; + + if (WSAGetLastError() == WSAEFAULT && cbret > il_len) { + il_len = cbret; + } else { + break; + } + } + + if (!il) + goto _exit; + + /* il is an array of INTERFACE_INFO structures. il_len has the + actual size of the buffer. The number of elements is + il_len/sizeof(INTERFACE_INFO) */ + + { + size_t n = il_len / sizeof(INTERFACE_INFO); + size_t i; + + for (i = 0; i < n; i++ ) { + struct ifaddrs *ifp; + + ifp = malloc(sizeof(*ifp)); + if (ifp == NULL) + break; + + ZeroMemory(ifp, sizeof(*ifp)); + + ifp->ifa_next = NULL; + ifp->ifa_name = NULL; + ifp->ifa_flags = il[i].iiFlags; + ifp->ifa_addr = dupaddr(&il[i].iiAddress); + ifp->ifa_netmask = dupaddr(&il[i].iiNetmask); + ifp->ifa_broadaddr = dupaddr(&il[i].iiBroadcastAddress); + ifp->ifa_data = NULL; + + *ifpp = ifp; + ifpp = &ifp->ifa_next; + } + + if (i == n) + ret = 0; + } + + _exit: + + if (s != INVALID_SOCKET) + closesocket(s); + + if (il) + free (il); + + return ret; +} + +void ROKEN_LIB_FUNCTION +rk_freeifaddrs(struct ifaddrs *ifp) +{ + struct ifaddrs *p, *q; + + for(p = ifp; p; ) { + if (p->ifa_name) + free(p->ifa_name); + if(p->ifa_addr) + free(p->ifa_addr); + if(p->ifa_dstaddr) + free(p->ifa_dstaddr); + if(p->ifa_netmask) + free(p->ifa_netmask); + if(p->ifa_data) + free(p->ifa_data); + q = p; + p = p->ifa_next; + free(q); + } +} diff --git a/crypto/heimdal/lib/roken/getxxyyy.c b/crypto/heimdal/lib/roken/getxxyyy.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/getxxyyy.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2011 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include "roken.h" + +#ifdef TEST_GETXXYYY +#undef rk_getpwnam_r + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **); +#endif + +#if !defined(POSIX_GETPWNAM_R) || defined(TEST_GETXXYYY) + +/* + * At least limit the race between threads + */ + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_getpwnam_r(const char *name, struct passwd *pwd, char *buffer, + size_t bufsize, struct passwd **result) +{ + struct passwd *p; + size_t slen; + + *result = NULL; + + p = getpwnam(name); + if(p == NULL) + return (errno = ENOENT); + + memset(pwd, 0, sizeof(*pwd)); + +#define APPEND(el) \ +do { \ + slen = strlen(p->el) + 1; \ + if (slen > bufsize) return (errno = ENOMEM); \ + memcpy(buffer, p->el, slen); \ + pwd->el = buffer; \ + buffer += slen; \ + bufsize -= slen; \ +} while(0) + + APPEND(pw_name); + if (p->pw_passwd) + APPEND(pw_name); + pwd->pw_uid = p->pw_uid; + pwd->pw_gid = p->pw_gid; + APPEND(pw_gecos); + APPEND(pw_dir); + APPEND(pw_shell); + + *result = pwd; + + return 0; +} + +#endif /* POSIX_GETPWNAM_R */ + +#ifdef TEST_GETXXYYY + +#include + +int verbose_flag = 0; + +static void +print_result(struct passwd *p) +{ + if (!verbose_flag) + return; + printf("%s\n", p->pw_name); + printf("%d\n", (int)p->pw_uid); + printf("%s\n", p->pw_shell); + printf("%s\n", p->pw_dir); +} + +int +main(int argc, char **argv) +{ + struct passwd pwd, *result; + char buf[1024]; + int ret; + const char *user; + + user = getenv("USER"); + if (!user) + user = "root"; + + ret = rk_getpwnam_r(user, &pwd, buf, sizeof(buf), &result); + if (ret) + errx(1, "rk_getpwnam_r"); + print_result(result); + + ret = rk_getpwnam_r(user, &pwd, buf, 1, &result); + if (ret == 0) + errx(1, "rk_getpwnam_r too small buf"); + + ret = rk_getpwnam_r("no-user-here-promise", &pwd, buf, sizeof(buf), &result); + if (ret == 0) + errx(1, "rk_getpwnam_r no user"); + + return 0; +} + +#endif diff --git a/crypto/heimdal/lib/roken/glob.c b/crypto/heimdal/lib/roken/glob.c --- a/crypto/heimdal/lib/roken/glob.c +++ b/crypto/heimdal/lib/roken/glob.c @@ -404,7 +404,7 @@ glob0(const Char *pattern, glob_t *pglob) { const Char *qpatnext; - int c, err, oldpathc; + int c, ret, oldpathc; Char *bufnext, patbuf[MaxPathLen+1]; size_t limit = 0; @@ -464,8 +464,8 @@ qprintf("glob0:", patbuf); #endif - if ((err = glob1(patbuf, pglob, &limit)) != 0) - return(err); + if ((ret = glob1(patbuf, pglob, &limit)) != 0) + return(ret); /* * If there was no match we are going to append the pattern @@ -572,7 +572,7 @@ { struct dirent *dp; DIR *dirp; - int err; + int ret; char buf[MaxPathLen]; /* @@ -597,7 +597,7 @@ return(0); } - err = 0; + ret = 0; /* Search directory for matching names. */ if (pglob->gl_flags & GLOB_ALTDIRFUNC) @@ -618,8 +618,8 @@ *pathend = CHAR_EOS; continue; } - err = glob2(pathbuf, --dc, restpattern, pglob, limit); - if (err) + ret = glob2(pathbuf, --dc, restpattern, pglob, limit); + if (ret) break; } @@ -627,7 +627,7 @@ (*pglob->gl_closedir)(dirp); else closedir(dirp); - return(err); + return(ret); } diff --git a/crypto/heimdal/lib/roken/hex-test.c b/crypto/heimdal/lib/roken/hex-test.c --- a/crypto/heimdal/lib/roken/hex-test.c +++ b/crypto/heimdal/lib/roken/hex-test.c @@ -55,7 +55,7 @@ { "abcdef", 6, "616263646566" }, { "abcdefg", 7, "61626364656667" }, { "=", 1, "3D" }, - { NULL } + { NULL, 0, NULL } }; for(t = tests; t->data; t++) { char *str; diff --git a/crypto/heimdal/lib/roken/install-sh b/crypto/heimdal/lib/roken/install-sh old mode 100755 new mode 100644 diff --git a/crypto/heimdal/lib/roken/issuid.c b/crypto/heimdal/lib/roken/issuid.c --- a/crypto/heimdal/lib/roken/issuid.c +++ b/crypto/heimdal/lib/roken/issuid.c @@ -33,24 +33,183 @@ #include +#ifdef HAVE_SYS_AUXV_H +#include +#endif + +#include + #include "roken.h" +/* NetBSD calls AT_UID AT_RUID. Everyone else calls it AT_UID. */ +#if defined(AT_EUID) && defined(AT_RUID) && !defined(AT_UID) +#define AT_UID AT_RUID +#endif +#if defined(AT_EGID) && defined(AT_RGID) && !defined(AT_GID) +#define AT_GID AT_RGID +#endif + +#ifdef __GLIBC__ +#ifdef __GLIBC_PREREQ +#define HAVE_GLIBC_API_VERSION_SUPPORT(maj, min) __GLIBC_PREREQ(maj, min) +#else +#define HAVE_GLIBC_API_VERSION_SUPPORT(maj, min) \ + ((__GLIBC << 16) + GLIBC_MINOR >= ((maj) << 16) + (min)) +#endif + +#if HAVE_GLIBC_API_VERSION_SUPPORT(2, 19) +#define GETAUXVAL_SETS_ERRNO +#endif +#endif + +#ifdef HAVE_GETAUXVAL +static unsigned long +rk_getauxval(unsigned long type) +{ + errno = 0; +#ifdef GETAUXVAL_SETS_ERRNO + return getauxval(type); +#else + unsigned long ret = getauxval(type); + + if (ret == 0) + errno = ENOENT; + return ret; +#endif +} +#define USE_RK_GETAUXVAL +#endif + +/** + * Returns non-zero if the caller's process started as set-uid or + * set-gid (and therefore the environment cannot be trusted). + * + * @return Non-zero if the environment is not trusted. + */ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL issuid(void) { + /* + * We want to use issetugid(), but issetugid() is not the same on + * all OSes. + * + * On Illumos derivatives, OpenBSD, and Solaris issetugid() returns + * true IFF the program exec()ed was set-uid or set-gid. + * + * On NetBSD and FreeBSD issetugid() returns true if the program + * exec()ed was set-uid or set-gid, or if the process has switched + * UIDs/GIDs or otherwise changed privileges or is a descendant of + * such a process and has not exec()ed since. + * + * What we want here is to know only if the program exec()ed was + * set-uid or set-gid, so we can decide whether to trust the + * enviroment variables. We don't care if this was a process that + * started as root and later changed UIDs/privs whatever: since it + * started out as privileged, it inherited an environment from a + * privileged pre-exec self, and so on, so the environment is + * trusted. + * + * Therefore the FreeBSD/NetBSD issetugid() does us no good. + * + * Linux, meanwhile, has no issetugid() (at least glibc doesn't + * anyways). + * + * Systems that support ELF put an "auxilliary vector" on the stack + * prior to starting the RTLD, and this vector includes (optionally) + * information about the process' EUID, RUID, EGID, RGID, and so on + * at the time of exec(), which we can use to construct proper + * issetugid() functionality. + * + * Where available, we use the ELF auxilliary vector as a fallback + * if issetugid() is not available. + * + * All of this is as of late March 2015, and might become stale in + * the future. + */ + +#ifdef USE_RK_GETAUXVAL + /* If we have getauxval(), use that */ + +#if (defined(AT_EUID) && defined(AT_UID) || (defined(AT_EGID) && defined(AT_GID))) + int seen = 0; +#endif + +#if defined(AT_EUID) && defined(AT_UID) + { + unsigned long euid; + unsigned long uid; + + euid = rk_getauxval(AT_EUID); + if (errno == 0) + seen |= 1; + uid = rk_getauxval(AT_UID); + if (errno == 0) + seen |= 2; + if (euid != uid) + return 1; + } +#endif +#if defined(AT_EGID) && defined(AT_GID) + { + unsigned long egid; + unsigned long gid; + + egid = rk_getauxval(AT_EGID); + if (errno == 0) + seen |= 4; + gid = rk_getauxval(AT_GID); + if (errno == 0) + seen |= 8; + if (egid != gid) + return 2; + } +#endif +#ifdef AT_SECURE + /* AT_SECURE is set if the program was set-id. */ + if (rk_getauxval(AT_SECURE) != 0) + return 1; +#endif + +#if (defined(AT_EUID) && defined(AT_UID) || (defined(AT_EGID) && defined(AT_GID))) + if (seen == 15) + return 0; +#endif + + /* rk_getauxval() does set errno */ + if (errno == 0) + return 0; + /* + * Fall through if we have getauxval() but we didn't have (or don't + * know if we don't have) the aux entries that we needed. + */ +#endif /* USE_RK_GETAUXVAL */ + #if defined(HAVE_ISSETUGID) + /* + * If we have issetugid(), use it. + * + * We may lose on some BSDs. This manifests as, for example, + * gss_store_cred() not honoring KRB5CCNAME. + */ return issetugid(); -#else /* !HAVE_ISSETUGID */ +#endif /* USE_RK_GETAUXVAL */ + + /* + * Paranoia: for extra safety we ought to default to returning 1. + * But who knows what that might break where users link statically + * and use a.out, say. Also, on Windows we should always return 0. + * + * For now we stick to returning zero by default. + */ #if defined(HAVE_GETUID) && defined(HAVE_GETEUID) - if(getuid() != geteuid()) + if (getuid() != geteuid()) return 1; #endif #if defined(HAVE_GETGID) && defined(HAVE_GETEGID) - if(getgid() != getegid()) + if (getgid() != getegid()) return 2; #endif return 0; -#endif /* HAVE_ISSETUGID */ } diff --git a/crypto/heimdal/lib/roken/memset_s.c b/crypto/heimdal/lib/roken/memset_s.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/memset_s.c @@ -0,0 +1,51 @@ +/*********************************************************************** + * Copyright (c) 2015, Your File System Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include +#include "roken.h" + +int ROKEN_LIB_FUNCTION +memset_s(void *s, size_t smax, int c, size_t n) +{ + volatile unsigned char *p = s; + +#ifdef _WIN32 + if (c == 0) { + SecureZeroMemory(s, n); + return 0; + } +#endif + + while (n--) + *p++ = c; + + return 0; +} diff --git a/crypto/heimdal/lib/roken/missing b/crypto/heimdal/lib/roken/missing old mode 100755 new mode 100644 diff --git a/crypto/heimdal/lib/roken/mkdir.c b/crypto/heimdal/lib/roken/mkdir.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/mkdir.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2013 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#ifdef HAVE_DIRECT_H +#include +#endif + +#include "roken.h" +#ifdef MKDIR_DOES_NOT_HAVE_MODE + #undef mkdir +#else + #undef rk_mkdir +#endif + +int ROKEN_LIB_FUNCTION +rk_mkdir(const char *pathname, mode_t mode) +{ +#ifndef MKDIR_DOES_NOT_HAVE_MODE + return mkdir(pathname, mode); +#else + /* Windows does not provide the ability to set access permissions */ + return _mkdir(pathname); +#endif +} diff --git a/crypto/heimdal/lib/roken/mkinstalldirs b/crypto/heimdal/lib/roken/mkinstalldirs old mode 100755 new mode 100644 diff --git a/crypto/heimdal/lib/roken/ndbm_wrap.c b/crypto/heimdal/lib/roken/ndbm_wrap.c --- a/crypto/heimdal/lib/roken/ndbm_wrap.c +++ b/crypto/heimdal/lib/roken/ndbm_wrap.c @@ -36,6 +36,8 @@ #include "ndbm_wrap.h" #if defined(HAVE_DBHEADER) #include +#elif defined(HAVE_DB6_DB_H) +#include #elif defined(HAVE_DB5_DB_H) #include #elif defined(HAVE_DB4_DB_H) @@ -111,20 +113,20 @@ dbm_get (DB *db, int flags) { DBT key, value; - datum datum; + datum d; #ifdef HAVE_DB3 if(cursor == NULL) db->cursor(db, NULL, &cursor, 0); if(cursor->c_get(cursor, &key, &value, flags) != 0) { - datum.dptr = NULL; - datum.dsize = 0; + d.dptr = NULL; + d.dsize = 0; } else - DBT2DATUM(&value, &datum); + DBT2DATUM(&value, &d); #else db->seq(db, &key, &value, flags); - DBT2DATUM(&value, &datum); + DBT2DATUM(&value, &d); #endif - return datum; + return d; } #ifndef DB_FIRST diff --git a/crypto/heimdal/lib/roken/net_write.c b/crypto/heimdal/lib/roken/net_write.c --- a/crypto/heimdal/lib/roken/net_write.c +++ b/crypto/heimdal/lib/roken/net_write.c @@ -36,7 +36,9 @@ #include "roken.h" /* - * Like write but never return partial data. + * Like write but blocking sockets never return partial data, i.e. we retry on + * EINTR. With non-blocking sockets (EWOULDBLOCK or EAGAIN) we return the + * number of bytes written. */ #ifndef _WIN32 @@ -51,10 +53,17 @@ while (rem > 0) { count = write (fd, cbuf, rem); if (count < 0) { - if (errno == EINTR) + switch (errno) { + case EINTR: continue; - else +#if defined(EAGAIN) && EAGAIN != EWOULDBLOCK + case EAGAIN: +#endif + case EWOULDBLOCK: + return nbytes - rem; + default: return count; + } } cbuf += count; rem -= count; @@ -93,10 +102,25 @@ count = send (sock, cbuf, rem, 0); #endif if (count < 0) { - if (errno == EINTR) - continue; - else - return count; + if (!use_write) { + switch (rk_SOCK_ERRNO) { + case WSAEINTR: + continue; + case WSAEWOULDBLOCK: + return nbytes - rem; + default: + return count; + } + } else { + switch (errno) { + case EINTR: + continue; + case EWOULDBLOCK: + return nbytes - rem; + default: + return count; + } + } } cbuf += count; rem -= count; diff --git a/crypto/heimdal/lib/roken/parse_bytes-test.c b/crypto/heimdal/lib/roken/parse_bytes-test.c --- a/crypto/heimdal/lib/roken/parse_bytes-test.c +++ b/crypto/heimdal/lib/roken/parse_bytes-test.c @@ -63,7 +63,6 @@ for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) { char buf[256]; int val = parse_bytes (tests[i].str, tests[i].def_unit); - int len; if (val != tests[i].val) { printf ("parse_bytes (%s, %s) = %d != %d\n", @@ -73,7 +72,7 @@ ++ret; } if (tests[i].canonicalp) { - len = unparse_bytes (tests[i].val, buf, sizeof(buf)); + (void) unparse_bytes (tests[i].val, buf, sizeof(buf)); if (strcmp (tests[i].str, buf) != 0) { printf ("unparse_bytes (%d) = \"%s\" != \"%s\"\n", tests[i].val, buf, tests[i].str); diff --git a/crypto/heimdal/lib/roken/parse_time-test.c b/crypto/heimdal/lib/roken/parse_time-test.c --- a/crypto/heimdal/lib/roken/parse_time-test.c +++ b/crypto/heimdal/lib/roken/parse_time-test.c @@ -49,7 +49,8 @@ { 8, 60, "1 minute" }, { 6, 3600, "1 hour" }, { 15, 3601, "1 hour 1 second" }, - { 16, 3602, "1 hour 2 seconds" } + { 16, 3602, "1 hour 2 seconds" }, + { 9, 300, "5 minutes" }, }; int diff --git a/crypto/heimdal/lib/roken/parse_time.3 b/crypto/heimdal/lib/roken/parse_time.3 --- a/crypto/heimdal/lib/roken/parse_time.3 +++ b/crypto/heimdal/lib/roken/parse_time.3 @@ -28,9 +28,9 @@ .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. -.\" $Id$ +.\" $Id: parse_time.3,v 1.3 2013/06/17 18:57:45 robert Exp $ .\" -.Dd October 31, 2004 +.Dd November 17, 2013 .Dt PARSE_TIME 3 .Os HEIMDAL .Sh NAME @@ -54,28 +54,28 @@ .Sh DESCRIPTION The .Fn parse_time -function converts a the period of time specified in +function converts the period of time specified into a number of seconds. The .Fa timespec can be any number of .Aq number unit pairs separated by comma and whitespace. The number can be -negative. Number without explicit units are taken as being +negative. Numbers without explicit units are taken as being .Fa def_unit . .Pp The .Fn unparse_time and .Fn unparse_time_approx -does the opposite of +do the opposite of .Fn parse_time , that is they take a number of seconds and express that as human -readable string. +readable strings. .Fa unparse_time produces an exact time, while .Fa unparse_time_approx -restricts the result to only include one units. +restricts the result to include only one unit. .Pp .Fn print_time_table prints a descriptive list of available units on the passed file diff --git a/crypto/heimdal/lib/roken/parse_time.cat3 b/crypto/heimdal/lib/roken/parse_time.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/parse_time.cat3 @@ -0,0 +1,111 @@ +PARSE_TIME(3) BSD Library Functions Manual PARSE_TIME(3) + +NAME + parse_time, print_time_table, unparse_time, unparse_time_approx, -- parse + and unparse time intervals + +LIBRARY + The roken library (libroken, -lroken) + +SYNOPSIS + #include  + + int + parse_time(const char *timespec, const char *def_unit); + + void + print_time_table(FILE *f); + + size_t + unparse_time(int seconds, char *buf, size_t len); + + size_t + unparse_time_approx(int seconds, char *buf, size_t len); + +DESCRIPTION + The parse_time() function converts the period of time specified into a + number of seconds. The timespec can be any number of pairs + separated by comma and whitespace. The number can be negative. Numbers + without explicit units are taken as being def_unit. + + The unparse_time() and unparse_time_approx() do the opposite of + parse_time(), that is they take a number of seconds and express that as + human readable strings. unparse_time produces an exact time, while + unparse_time_approx restricts the result to include only one unit. + + print_time_table() prints a descriptive list of available units on the + passed file descriptor. + + The possible units include: + second, s + minute, m + hour, h + day + week seven days + month 30 days + year 365 days + + Units names can be arbitrarily abbreviated (as long as they are unique). + +RETURN VALUES + parse_time() returns the number of seconds that represents the expression + in timespec or -1 on error. unparse_time() and unparse_time_approx() re- + turn the number of characters written to buf. if the return value is + greater than or equal to the len argument, the string was too short and + some of the printed characters were discarded. + +EXAMPLES + #include + #include + + int + main(int argc, char **argv) + { + int i; + int result; + char buf[128]; + print_time_table(stdout); + for (i = 1; i < argc; i++) { + result = parse_time(argv[i], "second"); + if(result == -1) { + fprintf(stderr, "%s: parse error\n", argv[i]); + continue; + } + printf("--\n"); + printf("parse_time = %d\n", result); + unparse_time(result, buf, sizeof(buf)); + printf("unparse_time = %s\n", buf); + unparse_time_approx(result, buf, sizeof(buf)); + printf("unparse_time_approx = %s\n", buf); + } + return 0; + } + + $ ./a.out "1 minute 30 seconds" "90 s" "1 y -1 s" + 1 year = 365 days + 1 month = 30 days + 1 week = 7 days + 1 day = 24 hours + 1 hour = 60 minutes + 1 minute = 60 seconds + 1 second + -- + parse_time = 90 + unparse_time = 1 minute 30 seconds + unparse_time_approx = 1 minute + -- + parse_time = 90 + unparse_time = 1 minute 30 seconds + unparse_time_approx = 1 minute + -- + parse_time = 31535999 + unparse_time = 12 months 4 days 23 hours 59 minutes 59 seconds + unparse_time_approx = 12 months + +BUGS + Since parse_time() returns -1 on error there is no way to parse "minus + one second". Currently "s" at the end of units is ignored. This is a + hack for English plural forms. If these functions are ever localised, + this scheme will have to change. + +HEIMDAL November 17, 2013 HEIMDAL diff --git a/crypto/heimdal/lib/roken/qsort.c b/crypto/heimdal/lib/roken/qsort.c --- a/crypto/heimdal/lib/roken/qsort.c +++ b/crypto/heimdal/lib/roken/qsort.c @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors + * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff --git a/crypto/heimdal/lib/roken/rand.c b/crypto/heimdal/lib/roken/rand.c --- a/crypto/heimdal/lib/roken/rand.c +++ b/crypto/heimdal/lib/roken/rand.c @@ -30,18 +30,50 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ +#include #include "roken.h" +#ifdef HAVE_WIN32_RAND_S +static int hasRand_s = 1; +#endif + void ROKEN_LIB_FUNCTION rk_random_init(void) { #if defined(HAVE_ARC4RANDOM) + /* nothing to do */; #elif defined(HAVE_SRANDOMDEV) srandomdev(); #elif defined(HAVE_RANDOM) srandom(time(NULL)); #else +# ifdef HAVE_WIN32_RAND_S + OSVERSIONINFO osInfo; + + osInfo.dwOSVersionInfoSize = sizeof(osInfo); + hasRand_s = + (GetVersionEx(&osInfo) + && ((osInfo.dwMajorVersion > 5) || + (osInfo.dwMajorVersion == 5) && (osInfo.dwMinorVersion >= 1))); +# endif srand (time(NULL)); #endif } + +#ifdef HAVE_WIN32_RAND_S +unsigned int ROKEN_LIB_FUNCTION +rk_random(void) +{ + if (hasRand_s) { + unsigned int n; + int code; + + code = rand_s(&n); + if (code == 0) + return n; + } + + return rand(); +} +#endif diff --git a/crypto/heimdal/lib/roken/realloc.c b/crypto/heimdal/lib/roken/realloc.c --- a/crypto/heimdal/lib/roken/realloc.c +++ b/crypto/heimdal/lib/roken/realloc.c @@ -36,6 +36,7 @@ #include #include "roken.h" +#undef realloc ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL rk_realloc(void *ptr, size_t size) diff --git a/crypto/heimdal/lib/roken/rename.c b/crypto/heimdal/lib/roken/rename.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/rename.c @@ -0,0 +1,49 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include +#include "roken.h" + +/* rename() for platforms where the native implementation doesn't + * unlink newname. */ +int rk_rename(const char * oldname, const char * newname) +{ + int ret; + + ret = rename(oldname, newname); + if (ret != 0 && (errno == EEXIST || errno == EACCES)) { + ret = unlink(newname); + if (ret == 0) + ret = rename(oldname, newname); + } + + return ret; +} diff --git a/crypto/heimdal/lib/roken/resolve-test.c b/crypto/heimdal/lib/roken/resolve-test.c --- a/crypto/heimdal/lib/roken/resolve-test.c +++ b/crypto/heimdal/lib/roken/resolve-test.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995 - 2004 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2016 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -36,6 +36,7 @@ #include "roken.h" #include "getarg.h" +#include #ifdef HAVE_ARPA_NAMESER_H #include #endif @@ -44,11 +45,15 @@ #endif #include "resolve.h" +static int srv_rr_order = 1; static int loop_integer = 1; static int version_flag = 0; static int help_flag = 0; static struct getargs args[] = { + {"srv-rr-order", 0, + arg_negative_flag, &srv_rr_order, + "do not test SRV RR ordering", NULL }, {"loop", 0, arg_integer, &loop_integer, "loop resolving", NULL }, {"version", 0, arg_flag, &version_flag, @@ -67,6 +72,107 @@ exit (ret); } +#define NUMRRS 16 + +static +int +test_rk_dns_srv_order(size_t run) +{ + struct rk_dns_reply reply; + struct rk_resource_record rrs[NUMRRS]; + struct rk_resource_record *rr; + struct rk_srv_record srvs[NUMRRS]; + size_t i, prio0; + int fail = 0; + + (void) memset(&reply, 0, sizeof(reply)); + (void) memset(srvs, 0, sizeof(srvs)); + (void) memset(rrs, 0, sizeof(rrs)); + + /* Test with two equal weight zero SRV records */ + rrs[0].type = rk_ns_t_srv; + rrs[0].u.srv = &srvs[0]; + rrs[0].next = &rrs[1]; + srvs[0].priority = 10; + srvs[0].weight = 0; + + rrs[1].type = rk_ns_t_srv; + rrs[1].u.srv = &srvs[1]; + rrs[1].next = NULL; + srvs[1].priority = 10; + srvs[1].weight = 0; + reply.head = &rrs[0]; + + rk_dns_srv_order(&reply); + assert(reply.head != NULL); + printf("%p %p\n", &rrs[0], rrs[0].next); + + /* + * Test four priority groups with priority 1--5 and weigths 0--3 in the + * first two groups, and 1--4 in the last two groups. Test multiple zero + * weights, by further coercing the weight to zero if <= run/2. + */ + for (i = 0; i < NUMRRS; i++) { + rrs[i].type = rk_ns_t_srv; + rrs[i].u.srv = &srvs[i]; + srvs[i].priority = 1 + i / 4; + srvs[i].weight = i % 4 + i / 8; + if (srvs[i].weight <= run/2) + srvs[i].weight = 0; + } + /* Shuffle the RRs */ + for (i = 0; i < NUMRRS - 1; i++) { + struct rk_resource_record tmp; + size_t j = rk_random() % (NUMRRS - i); + + if (j > 0) { + tmp = rrs[i+j]; + rrs[i+j] = rrs[i]; + rrs[i] = tmp; + } + } + for (i = 0; i < NUMRRS; i++) + rrs[i].next = &rrs[i + 1]; + rrs[i - 1].next = NULL; + reply.head = &rrs[0]; + + for (i = 0, rr = reply.head; i < NUMRRS; i++) { + if (rr == NULL) + break; + printf("SRV RR order run %lu input: prio %lu weight %lu\n", + (unsigned long)run, (unsigned long)rr->u.srv->priority, + (unsigned long)rr->u.srv->weight); + rr = rr->next; + } + + rk_dns_srv_order(&reply); + assert(reply.head != NULL); + + /* + * After sorting, ensure monotone priority ordering with jumps by 1 at + * group boundaries. + */ + prio0 = 0; + for (i = 0, rr = reply.head; i < NUMRRS; i++) { + if (rr == NULL) + break; + if (rr->u.srv->priority < prio0 || + (rr->u.srv->priority != prio0 && + (i % 4 != 0 || rr->u.srv->priority > prio0 + 1))) { + printf("SRV RR order run %lu failed\n", run); + fail = 1; + } + prio0 = rr->u.srv->priority; + printf("SRV RR order run %lu output: prio %lu weight %lu\n", + (unsigned long)run, (unsigned long)rr->u.srv->priority, + (unsigned long)rr->u.srv->weight); + rr = rr->next; + } + assert(i == NUMRRS); + + return fail; +} + int main(int argc, char **argv) { @@ -75,14 +181,15 @@ int optidx = 0, i, exit_code = 0; setprogname (argv[0]); + rk_random_init(); - if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) + if (getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) usage (0); - if(version_flag){ + if (version_flag) { printf("some version\n"); exit(0); } @@ -90,23 +197,38 @@ argc -= optidx; argv += optidx; - if (argc != 2) + if (argc != 2 && argc != 0 && !srv_rr_order) usage(1); + if (srv_rr_order) { + exit_code += test_rk_dns_srv_order(0); + exit_code += test_rk_dns_srv_order(1); + exit_code += test_rk_dns_srv_order(2); + exit_code += test_rk_dns_srv_order(3); + exit_code += test_rk_dns_srv_order(4); + exit_code += test_rk_dns_srv_order(5); + } + + if (srv_rr_order && argc == 0) + exit(exit_code ? 1 : 0); + + if (argc != 2) + usage(1); + for (i = 0; i < loop_integer; i++) { r = rk_dns_lookup(argv[0], argv[1]); - if(r == NULL){ + if (r == NULL) { printf("No reply.\n"); exit_code = 1; break; } - if(r->q.type == rk_ns_t_srv) + if (r->q.type == rk_ns_t_srv) rk_dns_srv_order(r); - for(rr = r->head; rr;rr=rr->next){ + for (rr = r->head; rr;rr=rr->next) { printf("%-30s %-5s %-6d ", rr->domain, rk_dns_type_to_string(rr->type), rr->ttl); - switch(rr->type){ + switch (rr->type) { case rk_ns_t_ns: case rk_ns_t_cname: case rk_ns_t_ptr: @@ -116,11 +238,11 @@ printf("%s\n", inet_ntoa(*rr->u.a)); break; case rk_ns_t_mx: - case rk_ns_t_afsdb:{ + case rk_ns_t_afsdb: { printf("%d %s\n", rr->u.mx->preference, rr->u.mx->domain); break; } - case rk_ns_t_srv:{ + case rk_ns_t_srv: { struct rk_srv_record *srv = rr->u.srv; printf("%d %d %d %s\n", srv->priority, srv->weight, srv->port, srv->target); @@ -130,45 +252,47 @@ printf("%s\n", rr->u.txt); break; } - case rk_ns_t_sig : { + case rk_ns_t_sig: { struct rk_sig_record *sig = rr->u.sig; const char *type_string = rk_dns_type_to_string (sig->type); - printf ("type %u (%s), algorithm %u, labels %u, orig_ttl %u, sig_expiration %u, sig_inception %u, key_tag %u, signer %s\n", - sig->type, type_string ? type_string : "", - sig->algorithm, sig->labels, sig->orig_ttl, - sig->sig_expiration, sig->sig_inception, sig->key_tag, - sig->signer); + printf("type %u (%s), algorithm %u, labels %u, orig_ttl %u, " + "sig_expiration %u, sig_inception %u, key_tag %u, " + "signer %s\n", + sig->type, type_string ? type_string : "", + sig->algorithm, sig->labels, sig->orig_ttl, + sig->sig_expiration, sig->sig_inception, sig->key_tag, + sig->signer); break; } - case rk_ns_t_key : { + case rk_ns_t_key: { struct rk_key_record *key = rr->u.key; - printf ("flags %u, protocol %u, algorithm %u\n", - key->flags, key->protocol, key->algorithm); + printf("flags %u, protocol %u, algorithm %u\n", + key->flags, key->protocol, key->algorithm); break; } - case rk_ns_t_sshfp : { + case rk_ns_t_sshfp: { struct rk_sshfp_record *sshfp = rr->u.sshfp; - size_t i; + size_t j; printf ("alg %u type %u length %lu data ", sshfp->algorithm, sshfp->type, (unsigned long)sshfp->sshfp_len); - for (i = 0; i < sshfp->sshfp_len; i++) - printf("%02X", sshfp->sshfp_data[i]); + for (j = 0; j < sshfp->sshfp_len; j++) + printf("%02X", sshfp->sshfp_data[j]); printf("\n"); break; } - case rk_ns_t_ds : { + case rk_ns_t_ds: { struct rk_ds_record *ds = rr->u.ds; - size_t i; + size_t j; - printf ("key tag %u alg %u type %u length %lu data ", - ds->key_tag, ds->algorithm, ds->digest_type, - (unsigned long)ds->digest_len); - for (i = 0; i < ds->digest_len; i++) - printf("%02X", ds->digest_data[i]); + printf("key tag %u alg %u type %u length %lu data ", + ds->key_tag, ds->algorithm, ds->digest_type, + (unsigned long)ds->digest_len); + for (j = 0; j < ds->digest_len; j++) + printf("%02X", ds->digest_data[j]); printf("\n"); break; @@ -181,5 +305,5 @@ rk_dns_free_data(r); } - return exit_code; + return exit_code ? 1 : 0; } diff --git a/crypto/heimdal/lib/roken/resolve.c b/crypto/heimdal/lib/roken/resolve.c --- a/crypto/heimdal/lib/roken/resolve.c +++ b/crypto/heimdal/lib/roken/resolve.c @@ -659,40 +659,59 @@ headp = &r->head; - for(ss = srvs; ss < srvs + num_srv; ) { - int sum, rnd, count; + for (ss = srvs; ss < srvs + num_srv; ) { + int sum, zeros, rnd, count; /* zeros -> weight scaling */ struct rk_resource_record **ee, **tt; - /* find the last record with the same priority and count the - sum of all weights */ - for(sum = 0, tt = ss; tt < srvs + num_srv; tt++) { + + /* + * find the last record with the same priority and count the sum of all + * weights + */ + for (sum = 0, zeros = 0, tt = ss; tt < srvs + num_srv; tt++) { assert(*tt != NULL); if((*tt)->u.srv->priority != (*ss)->u.srv->priority) break; sum += (*tt)->u.srv->weight; + if ((*tt)->u.srv->weight == 0) + zeros++; } + /* make sure scale (`zeros') is > 0 then scale out */ + sum += zeros ? 1 : zeros++; + sum *= zeros; ee = tt; - /* ss is now the first record of this priority and ee is the - first of the next */ - while(ss < ee) { - rnd = rk_random() % (sum + 1); - for(count = 0, tt = ss; ; tt++) { - if(*tt == NULL) - continue; - count += (*tt)->u.srv->weight; - if(count >= rnd) + + /* + * ss is now the first record of this priority and ee is the first of + * the next or the first past the end of srvs + */ + while (ss < ee) { + rnd = rk_random() % sum + 1; + for (count = 0, tt = ss; tt < ee; tt++) { + if (*tt == NULL) + continue; /* this one's already been picked */ + if ((*tt)->u.srv->weight == 0) + count++; + else + count += (*tt)->u.srv->weight * zeros; + if (count >= rnd) break; } - assert(tt < ee); - /* insert the selected record at the tail (of the head) of - the list */ + /* push the selected record */ (*tt)->next = *headp; *headp = *tt; headp = &(*tt)->next; - sum -= (*tt)->u.srv->weight; + /* + * reduce the sum so the next iteration is sure to reach the random + * total after examining all the remaining records. + */ + if ((*tt)->u.srv->weight == 0) + sum--; + else + sum -= (*tt)->u.srv->weight * zeros; *tt = NULL; - while(ss < ee && *ss == NULL) + while (ss < ee && *ss == NULL) ss++; } } diff --git a/crypto/heimdal/lib/roken/rkpty.c b/crypto/heimdal/lib/roken/rkpty.c --- a/crypto/heimdal/lib/roken/rkpty.c +++ b/crypto/heimdal/lib/roken/rkpty.c @@ -99,7 +99,7 @@ printf("implement open_pty\n"); exit(77); #endif -#if defined(HAVE_OPENPTY) || defined(__linux) || defined(__osf__) /* XXX */ +#if defined(HAVE_OPENPTY) || defined(__osf__) /* XXX */ if(openpty(&master, &slave, line, 0, 0) == 0) return; #endif /* HAVE_OPENPTY .... */ @@ -233,7 +233,7 @@ c->str, c->lineno); else if (alarmset) errx(1, "got a signal %d waiting for %s (line %u)", - alarmset, c->str, c->lineno); + (int)alarmset, c->str, c->lineno); if (sret <= 0) errx(1, "end command while waiting for %s (line %u)", c->str, c->lineno); @@ -305,9 +305,9 @@ static struct getargs args[] = { { "timeout", 't', arg_integer, &timeout, "timout", "seconds" }, - { "verbose", 'v', arg_counter, &verbose, "verbose debugging" }, - { "version", 0, arg_flag, &version_flag, "print version" }, - { "help", 0, arg_flag, &help_flag, NULL } + { "verbose", 'v', arg_counter, &verbose, "verbose debugging", NULL }, + { "version", 0, arg_flag, &version_flag, "print version", NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; static void diff --git a/crypto/heimdal/lib/roken/roken-common.h b/crypto/heimdal/lib/roken/roken-common.h --- a/crypto/heimdal/lib/roken/roken-common.h +++ b/crypto/heimdal/lib/roken/roken-common.h @@ -122,7 +122,15 @@ #define O_ACCMODE 003 #endif -#ifndef _WIN32 +#ifndef O_NOFOLLOW +#define O_NOFOLLOW 0 +#endif + +#ifdef _WIN32 + +#define _PATH_DEVNULL "\\\\.\\NUL" + +#else #ifndef _PATH_DEV #define _PATH_DEV "/dev/" @@ -151,7 +159,11 @@ #endif /* !_WIN32 */ #ifndef PATH_MAX +#ifdef MAX_PATH #define PATH_MAX MAX_PATH +#else +#define PATH_MAX 4096 +#endif #endif #ifndef RETSIGTYPE @@ -401,6 +413,10 @@ ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL socket_set_tos (rk_socket_t, int); +#define socket_set_nonblocking rk_socket_set_nonblocking +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +socket_set_nonblocking(rk_socket_t, int); + #define socket_set_reuseaddr rk_socket_set_reuseaddr ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL socket_set_reuseaddr (rk_socket_t, int); @@ -452,7 +468,7 @@ #define warnerr rk_warnerr ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL rk_warnerr(int doerrno, const char *fmt, va_list ap) - __attribute__ ((format (printf, 2, 0))); + __attribute__ ((__format__ (__printf__, 2, 0))); ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL rk_realloc(void *, size_t); @@ -464,7 +480,7 @@ ROKEN_LIB_FUNCTION struct rk_strpool * ROKEN_LIB_CALL rk_strpoolprintf(struct rk_strpool *, const char *, ...) - __attribute__ ((format (printf, 2, 3))); + __attribute__ ((__format__ (__printf__, 2, 3))); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL rk_strpoolfree(struct rk_strpool *); @@ -487,12 +503,20 @@ ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL rk_cloexec_dir(DIR *); +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +rk_cloexec_socket(rk_socket_t); + ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL -ct_memcmp(const void *, const void *, size_t); +ct_memcmp(const volatile void * volatile, + const volatile void * volatile, + size_t); void ROKEN_LIB_FUNCTION rk_random_init(void); +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_mkdir(const char *, mode_t); + ROKEN_CPP_END #endif /* __ROKEN_COMMON_H__ */ diff --git a/crypto/heimdal/lib/roken/roken.h.in b/crypto/heimdal/lib/roken/roken.h.in --- a/crypto/heimdal/lib/roken/roken.h.in +++ b/crypto/heimdal/lib/roken/roken.h.in @@ -3,22 +3,22 @@ * Copyright (c) 1995-2005 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: - * + * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * + * * 3. Neither the name of the Institute nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE @@ -32,6 +32,12 @@ * SUCH DAMAGE. */ +#if defined(_WIN32) && _MSC_VER >= 1400 +/* _CRT_RAND_S must be defined before including stdlib.h */ +# define _CRT_RAND_S +# define HAVE_WIN32_RAND_S 1 +#endif + #include #include #include @@ -39,6 +45,7 @@ #include #endif #include +#include #include #ifndef ROKEN_LIB_FUNCTION @@ -65,10 +72,8 @@ #include /* - * error codes for inet_ntop/inet_pton + * error codes for inet_ntop/inet_pton */ -#define EAFNOSUPPORT WSAEAFNOSUPPORT - typedef SOCKET rk_socket_t; #define rk_closesocket(x) closesocket(x) @@ -79,23 +84,6 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_SOCK_IOCTL(SOCKET s, long cmd, int * argp); -/* Microsoft VC 2010 POSIX definitions */ -#ifndef ENOTSOCK -#define ENOTSOCK 128 -#endif -#ifndef ENOTSUP -#define ENOTSUP 129 -#endif -#ifndef EOVERFLOW -#define EOVERFLOW 132 -#endif -#ifndef ETIMEDOUT -#define ETIMEDOUT 138 -#endif -#ifndef EWOULDBLOCK -#define EWOULDBLOCK 140 -#endif - #define rk_SOCK_INIT() rk_WSAStartup() #define rk_SOCK_EXIT() rk_WSACleanup() @@ -116,13 +104,17 @@ #define rk_SOCK_INIT() 0 #define rk_SOCK_EXIT() do { } while(0) -#endif +#endif /* WinSock */ #ifndef IN_LOOPBACKNET #define IN_LOOPBACKNET 127 #endif #ifdef _MSC_VER +#ifndef HAVE_STDINT_H +#include +#endif + /* Declarations for Microsoft Visual C runtime on Windows */ #include @@ -196,6 +188,9 @@ #ifdef HAVE_SYS_TYPES_H #include #endif +#ifdef HAVE_SYS_ERRNO_H +#include +#endif #ifdef HAVE_SYS_BITYPES_H #include #endif @@ -274,6 +269,10 @@ #include #endif +#ifdef HAVE_DIRECT_H +#include +#endif + #ifdef BACKSLASH_PATH_DELIM #define rk_PATH_DELIM '\\' #endif @@ -319,7 +318,16 @@ #define fsync _commit -/* The MSVC implementation of snprintf is not C99 compliant. */ +#define timezone _timezone + +#define tzname _tzname + +#define _PIPE_BUFFER_SZ 8192 +#define pipe(fds) _pipe((fds), _PIPE_BUFFER_SZ, O_BINARY); + +#define ftruncate(fd, sz) _chsize((fd), (sz)) + +#if !defined(HAVE_UCRT) #define snprintf rk_snprintf #define vsnprintf rk_vsnprintf #define vasnprintf rk_vasnprintf @@ -327,11 +335,6 @@ #define asnprintf rk_asnprintf #define asprintf rk_asprintf -#define _PIPE_BUFFER_SZ 8192 -#define pipe(fds) _pipe((fds), _PIPE_BUFFER_SZ, O_BINARY); - -#define ftruncate(fd, sz) _chsize((fd), (sz)) - ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_snprintf (char *str, size_t sz, const char *format, ...); @@ -349,6 +352,7 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_vsnprintf (char *str, size_t sz, const char *format, va_list args); +#endif /* !defined(HAVE_UCRT) */ /* missing stat.h predicates */ @@ -367,6 +371,49 @@ S_ISBLK(m) */ +/* The following symbolic constants are provided for rk_mkdir mode */ + +#define S_IRWXU 00700 /* user (file owner) has read, write and execute permission */ +#define S_IRUSR 00400 /* user has read permission */ +#define S_IWUSR 00200 /* user has write permission */ +#define S_IXUSR 00100 /* user has execute permission */ +#define S_IRWXG 00070 /* group has read, write and execute permission */ +#define S_IRGRP 00040 /* group has read permission */ +#define S_IWGRP 00020 /* group has write permission */ +#define S_IXGRP 00010 /* group has execute permission */ +#define S_IRWXO 00007 /* others have read, write and execute permission */ +#define S_IROTH 00004 /* others have read permission */ +#define S_IWOTH 00002 /* others have write permission */ +#define S_IXOTH 00001 /* others have execute permission */ + +#if !defined(ROKEN_NO_DEFINE_ALLOCATORS) +/* Ensure that a common memory allocator is used by all */ +#define calloc rk_calloc +#define free rk_free +#define malloc rk_malloc +#define realloc rk_realloc +#define strdup rk_strdup +#define wcsdup rk_wcsdup +#endif + +ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL +rk_calloc(size_t, size_t); + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +rk_free(void *); + +ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL +rk_malloc(size_t); + +ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL +rk_realloc(void *, size_t); + +ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL +rk_strdup(const char *); + +ROKEN_LIB_FUNCTION unsigned short * ROKEN_LIB_CALL +rk_wcsdup(const unsigned short *); + #endif /* _MSC_VER */ #ifdef HAVE_WINSOCK @@ -429,16 +476,16 @@ #endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_snprintf (char *, size_t, const char *, ...) - __attribute__ ((format (printf, 3, 4))); + __attribute__ ((__format__ (__printf__, 3, 4))); #endif #if !defined(HAVE_VSNPRINTF) || defined(NEED_VSNPRINTF_PROTO) #ifndef HAVE_VSNPRINTF #define vsnprintf rk_vsnprintf #endif -ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_vsnprintf (char *, size_t, const char *, va_list) - __attribute__((format (printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); #endif #if !defined(HAVE_ASPRINTF) || defined(NEED_ASPRINTF_PROTO) @@ -447,7 +494,7 @@ #endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_asprintf (char **, const char *, ...) - __attribute__ ((format (printf, 2, 3))); + __attribute__ ((__format__ (__printf__, 2, 3))); #endif #if !defined(HAVE_VASPRINTF) || defined(NEED_VASPRINTF_PROTO) @@ -456,7 +503,7 @@ #endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_vasprintf (char **, const char *, va_list) - __attribute__((format (printf, 2, 0))); + __attribute__ ((__format__ (__printf__, 2, 0))); #endif #if !defined(HAVE_ASNPRINTF) || defined(NEED_ASNPRINTF_PROTO) @@ -465,7 +512,7 @@ #endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rk_asnprintf (char **, size_t, const char *, ...) - __attribute__ ((format (printf, 3, 4))); + __attribute__ ((__format__ (__printf__, 3, 4))); #endif #if !defined(HAVE_VASNPRINTF) || defined(NEED_VASNPRINTF_PROTO) @@ -474,7 +521,7 @@ #endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL vasnprintf (char **, size_t, const char *, va_list) - __attribute__((format (printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); #endif #ifndef HAVE_STRDUP @@ -601,6 +648,13 @@ ROKEN_LIB_FUNCTION struct passwd * ROKEN_LIB_CALL k_getpwuid (uid_t); #endif +#ifdef POSIX_GETPWNAM_R +#define rk_getpwnam_r(_n, _pw, _b, _sz, _pwd) getpwnam_r(_n, _pw, _b, _sz, _pwd) +#else +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_getpwnam_r(const char *, struct passwd *, char *, size_t, struct passwd **); +#endif + ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL get_default_username (void); #ifndef HAVE_SETEUID @@ -648,6 +702,13 @@ #define rk_rename(__rk_rn_from,__rk_rn_to) rename(__rk_rn_from,__rk_rn_to) #endif +#ifdef MKDIR_DOES_NOT_HAVE_MODE +#define mkdir rk_mkdir +#else +#define rk_mkdir(__rk_rn_name, __rk_rn_mode) mkdir(__rk_rn_name,__rk_rn_mode) +#endif + + #if !defined(HAVE_DAEMON) || defined(NEED_DAEMON_PROTO) #ifndef HAVE_DAEMON #define daemon rk_daemon @@ -677,7 +738,7 @@ #ifndef HAVE_IRUSEROK #define iruserok rk_iruserok -ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL iruserok(unsigned, int, +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL iruserok(unsigned, int, const char *, const char *); #endif @@ -700,13 +761,15 @@ readv(int, const struct iovec *, int); #endif -#ifndef HAVE_PIDFILE #ifdef NO_PIDFILES -#define pidfile(x) ((void) 0) +#define rk_pidfile(x) ((void) 0) #else -#define pidfile rk_pidfile -ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL pidfile (const char*); +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL rk_pidfile (const char*); #endif + +#ifndef HAVE_BSWAP64 +#define bswap64 rk_bswap64 +ROKEN_LIB_FUNCTION uint64_t ROKEN_LIB_CALL bswap64(uint64_t); #endif #ifndef HAVE_BSWAP32 @@ -760,6 +823,9 @@ ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL roken_vmconcat (char **, size_t, va_list); +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL roken_detach_prep(int, char **, char *); +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL roken_detach_finish(const char *, int); + ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL net_write (rk_socket_t, const void *, size_t); @@ -923,6 +989,9 @@ ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL sleep(unsigned int seconds); +ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL +usleep(unsigned int useconds); + #endif ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL @@ -932,7 +1001,7 @@ int); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL -roken_getaddrinfo_hostspec(const char *, int, struct addrinfo **); +roken_getaddrinfo_hostspec(const char *, int, struct addrinfo **); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL roken_getaddrinfo_hostspec2(const char *, int, int, struct addrinfo **); @@ -979,7 +1048,7 @@ roken_gethostby_setup(const char*, const char*); ROKEN_LIB_FUNCTION struct hostent* ROKEN_LIB_CALL roken_gethostbyname(const char*); -ROKEN_LIB_FUNCTION struct hostent* ROKEN_LIB_CALL +ROKEN_LIB_FUNCTION struct hostent* ROKEN_LIB_CALL roken_gethostbyaddr(const void*, size_t, int); #ifdef GETSERVBYNAME_PROTO_COMPATIBLE @@ -1026,6 +1095,22 @@ localtime_r(const time_t *, struct tm *); #endif +#if !defined(HAVE_STRTOLL) || defined(NEED_STRTOLL_PROTO) +#ifndef HAVE_STRTOLL +#define strtoll rk_strtoll +#endif +ROKEN_LIB_FUNCTION long long ROKEN_LIB_CALL +strtoll(const char * nptr, char ** endptr, int base); +#endif + +#if !defined(HAVE_STRTOULL) || defined(NEED_STRTOULL_PROTO) +#ifndef HAVE_STRTOULL +#define strtoull rk_strtoull +#endif +ROKEN_LIB_FUNCTION unsigned long long ROKEN_LIB_CALL +strtoull(const char * nptr, char ** endptr, int base); +#endif + #if !defined(HAVE_STRSVIS) || defined(NEED_STRSVIS_PROTO) #ifndef HAVE_STRSVIS #define strsvis rk_strsvis @@ -1108,12 +1193,23 @@ rk_qsort(void *, size_t, size_t, int (*)(const void *, const void *)); #endif +#ifndef HAVE_MEMSET_S +#define memset_s rk_memset_s +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL memset_s(void *s, size_t smax, + int c, size_t n); +#endif + #if defined(HAVE_ARC4RANDOM) -#define rk_random() arc4random() +# define rk_random() arc4random() #elif defined(HAVE_RANDOM) -#define rk_random() random() +# define rk_random() random() #else -#define rk_random() rand() +# ifdef HAVE_WIN32_RAND_S +ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL +rk_random(void); +# else +# define rk_random() rand() +# endif #endif #ifndef HAVE_TDELETE @@ -1135,6 +1231,33 @@ int ROKEN_LIB_FUNCTION rk_socket(int, int, int); #endif +/* Microsoft VC 2010 POSIX definitions */ +#ifndef EAFNOSUPPORT +#define EAFNOSUPPORT 102 +#endif +#ifndef EINPROGRESS +#define EINPROGRESS 112 +#endif +#ifndef ELOOP +#define ELOOP 114 +#endif +#ifndef ENOTSOCK +#define ENOTSOCK 128 +#endif +#ifndef ENOTSUP +#define ENOTSUP 129 +#endif +#ifndef EOVERFLOW +#define EOVERFLOW 132 +#endif +#ifndef ETIMEDOUT +#define ETIMEDOUT 138 +#endif +#ifndef EWOULDBLOCK +#define EWOULDBLOCK 140 +#endif + + #ifdef SOCKET_WRAPPER_REPLACE #include #endif diff --git a/crypto/heimdal/lib/roken/roken.awk b/crypto/heimdal/lib/roken/roken.awk --- a/crypto/heimdal/lib/roken/roken.awk +++ b/crypto/heimdal/lib/roken/roken.awk @@ -9,6 +9,9 @@ print "#ifdef HAVE_SYS_SOCKET_H" print "#include " print "#endif" + print "#ifdef HAVE_ERRNO_H" + print "#include " + print "#endif" print "" print "int main(int argc, char **argv)" print "{" diff --git a/crypto/heimdal/lib/roken/roken_gethostby.c b/crypto/heimdal/lib/roken/roken_gethostby.c --- a/crypto/heimdal/lib/roken/roken_gethostby.c +++ b/crypto/heimdal/lib/roken/roken_gethostby.c @@ -77,7 +77,8 @@ if(make_address(dns_host, &dns_addr.sin_addr) != 0) return -1; dns_addr.sin_port = htons(dns_port); - asprintf(&dns_req, "%s", dns_path); + if (asprintf(&dns_req, "%s", dns_path) < 0) + return -1; } dns_addr.sin_family = AF_INET; return 0; diff --git a/crypto/heimdal/lib/roken/rtbl.h b/crypto/heimdal/lib/roken/rtbl.h --- a/crypto/heimdal/lib/roken/rtbl.h +++ b/crypto/heimdal/lib/roken/rtbl.h @@ -61,6 +61,7 @@ /* flags */ #define RTBL_HEADER_STYLE_NONE 1 +#define RTBL_JSON 2 ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rtbl_add_column (rtbl_t, const char*, unsigned int); @@ -71,14 +72,14 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rtbl_add_column_entryv_by_id (rtbl_t table, unsigned int id, const char *fmt, ...) - __attribute__ ((format (printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rtbl_add_column_entry (rtbl_t, const char*, const char*); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rtbl_add_column_entryv (rtbl_t, const char*, const char*, ...) - __attribute__ ((format (printf, 3, 0))); + __attribute__ ((__format__ (__printf__, 3, 0))); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rtbl_add_column_entry_by_id (rtbl_t, unsigned int, const char*); @@ -92,6 +93,9 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rtbl_format (rtbl_t, FILE*); +ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL +rtbl_format_str (rtbl_t); + ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL rtbl_get_flags (rtbl_t); diff --git a/crypto/heimdal/lib/roken/rtbl.c b/crypto/heimdal/lib/roken/rtbl.c --- a/crypto/heimdal/lib/roken/rtbl.c +++ b/crypto/heimdal/lib/roken/rtbl.c @@ -34,6 +34,7 @@ #include #include "roken.h" +#include #include "rtbl.h" struct column_entry { @@ -168,7 +169,7 @@ if(table->columns[c]->num_rows == max_rows) continue; tmp = realloc(table->columns[c]->rows, - max_rows * sizeof(table->columns[c]->rows)); + max_rows * sizeof(table->columns[c]->rows[0])); if(tmp == NULL) return ENOMEM; table->columns[c]->rows = tmp; @@ -188,7 +189,7 @@ if(table->flags & RTBL_HEADER_STYLE_NONE) column->width = 0; else - column->width = strlen (column->header); + column->width = (int)strlen (column->header); for (i = 0; i < column->num_rows; i++) column->width = max (column->width, (int) strlen (column->rows[i].data)); } @@ -362,6 +363,18 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL rtbl_format (rtbl_t table, FILE * f) { + char *str = rtbl_format_str(table); + if (str == NULL) + return ENOMEM; + fprintf(f, "%s", str); + free(str); + return 0; +} + +static char * +rtbl_format_pretty(rtbl_t table) +{ + struct rk_strpool *p = NULL; size_t i, j; for (i = 0; i < table->num_columns; i++) @@ -371,16 +384,18 @@ struct column_data *c = table->columns[i]; if(table->column_separator != NULL && i > 0) - fprintf (f, "%s", table->column_separator); - fprintf (f, "%s", get_column_prefix (table, c)); - if(i == table->num_columns - 1 && c->suffix == NULL) + p = rk_strpoolprintf(p, "%s", table->column_separator); + p = rk_strpoolprintf(p, "%s", get_column_prefix (table, c)); + if (c == NULL) { + /* do nothing if no column */ + } else if(i == table->num_columns - 1 && c->suffix == NULL) /* last column, so no need to pad with spaces */ - fprintf (f, "%-*s", 0, c->header); + p = rk_strpoolprintf(p, "%-*s", 0, c->header); else - fprintf (f, "%-*s", (int)c->width, c->header); - fprintf (f, "%s", get_column_suffix (table, c)); + p = rk_strpoolprintf(p, "%-*s", (int)c->width, c->header); + p = rk_strpoolprintf(p, "%s", get_column_suffix (table, c)); } - fprintf (f, "\n"); + p = rk_strpoolprintf(p, "\n"); } for (j = 0;; j++) { @@ -403,7 +418,7 @@ struct column_data *c = table->columns[i]; if(table->column_separator != NULL && i > 0) - fprintf (f, "%s", table->column_separator); + p = rk_strpoolprintf(p, "%s", table->column_separator); w = c->width; @@ -414,16 +429,72 @@ else w = -w; } - fprintf (f, "%s", get_column_prefix (table, c)); + p = rk_strpoolprintf(p, "%s", get_column_prefix (table, c)); if (c->num_rows <= j) - fprintf (f, "%*s", w, ""); + p = rk_strpoolprintf(p, "%*s", w, ""); else - fprintf (f, "%*s", w, c->rows[j].data); - fprintf (f, "%s", get_column_suffix (table, c)); + p = rk_strpoolprintf(p, "%*s", w, c->rows[j].data); + p = rk_strpoolprintf(p, "%s", get_column_suffix (table, c)); } - fprintf (f, "\n"); + p = rk_strpoolprintf(p, "\n"); } - return 0; + + return rk_strpoolcollect(p); +} + +static char * +rtbl_format_json(rtbl_t table) +{ + struct rk_strpool *p = NULL; + size_t i, j; + int comma; + + p = rk_strpoolprintf(p, "["); + for (j = 0;; j++) { + int flag = 0; + + /* are there any more rows left? */ + for (i = 0; flag == 0 && i < table->num_columns; ++i) { + struct column_data *c = table->columns[i]; + + if (c->num_rows > j) { + ++flag; + break; + } + } + if (flag == 0) + break; + + p = rk_strpoolprintf(p, "%s{", j > 0 ? "," : ""); + + comma = 0; + for (i = 0; i < table->num_columns; i++) { + struct column_data *c = table->columns[i]; + + if (c->num_rows > j) { + char *header = c->header; + while (isspace((int)header[0])) /* trim off prefixed whitespace */ + header++; + p = rk_strpoolprintf(p, "%s\"%s\" : \"%s\"", + comma ? "," : "", header, + c->rows[j].data); + comma = 1; + } + } + p = rk_strpoolprintf(p, "}"); + } + p = rk_strpoolprintf(p, "]"); + + return rk_strpoolcollect(p); +} + +ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL +rtbl_format_str (rtbl_t table) +{ + if (table->flags & RTBL_JSON) + return rtbl_format_json(table); + + return rtbl_format_pretty(table); } #ifdef TEST diff --git a/crypto/heimdal/lib/roken/rtbl.cat3 b/crypto/heimdal/lib/roken/rtbl.cat3 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/rtbl.cat3 @@ -0,0 +1,150 @@ +RTBL(3) BSD Library Functions Manual RTBL(3) + +NAME + rtbl_create, rtbl_destroy, rtbl_set_flags, rtbl_get_flags, + rtbl_set_prefix, rtbl_set_separator, rtbl_set_column_prefix, + rtbl_set_column_affix_by_id, rtbl_add_column, rtbl_add_column_by_id, + rtbl_add_column_entry, rtbl_add_column_entry_by_id, rtbl_new_row, + rtbl_format -- format data in simple tables + +LIBRARY + The roken library (libroken, -lroken) + +SYNOPSIS + #include  + + int + rtbl_add_column(rtbl_t table, const char *column_name, + unsigned int flags); + + int + rtbl_add_column_by_id(rtbl_t table, unsigned int column_id, + const char *column_header, unsigned int flags); + + int + rtbl_add_column_entry(rtbl_t table, const char *column_name, + const char *cell_entry); + + int + rtbl_add_column_entry_by_id(rtbl_t table, unsigned int column_id, + const char *cell_entry); + + rtbl_t + rtbl_create(void); + + void + rtbl_destroy(rtbl_t table); + + int + rtbl_new_row(rtbl_t table); + + int + rtbl_set_column_affix_by_id(rtbl_t table, unsigned int column_id, const, + char, *prefix", const char *suffix); + + int + rtbl_set_column_prefix(rtbl_t table, const char *column_name, + const char *prefix); + + unsigned int + rtbl_get_flags(rtbl_t table); + + void + rtbl_set_flags(rtbl_t table, unsigned int flags); + + int + rtbl_set_prefix(rtbl_t table, const char *prefix); + + int + rtbl_set_separator(rtbl_t table, const char *separator); + + int + rtbl_format(rtbl_t table, FILE, *file"); + +DESCRIPTION + This set of functions assemble a simple table consisting of rows and col- + umns, allowing it to be printed with certain options. Typical use would + be output from tools such as ls(1) or netstat(1), where you have a fixed + number of columns, but don't know the column widths before hand. + + A table is created with rtbl_create() and destroyed with rtbl_destroy(). + + Global flags on the table are set with rtbl_set_flags and retrieved with + rtbl_get_flags. At present the only defined flag is + RTBL_HEADER_STYLE_NONE which suppresses printing the header. + + Before adding data to the table, one or more columns need to be created. + This would normally be done with rtbl_add_column_by_id(), column_id is + any number of your choice (it's used only to identify columns), + column_header is the header to print at the top of the column, and flags + are flags specific to this column. Currently the only defined flag is + RTBL_ALIGN_RIGHT, aligning column entries to the right. Columns are + printed in the order they are added. + + There's also a way to add columns by column name with rtbl_add_column(), + but this is less flexible (you need unique header names), and is consid- + ered deprecated. + + To add data to a column you use rtbl_add_column_entry_by_id(), where the + column_id is the same as when the column was added (adding data to a non- + existent column is undefined), and cell_entry is whatever string you wish + to include in that cell. It should not include newlines. For columns + added with rtbl_add_column() you must use rtbl_add_column_entry() in- + stead. + + rtbl_new_row() fills all columns with blank entries until they all have + the same number of rows. + + Each column can have a separate prefix and suffix, set with + rtbl_set_column_affix_by_id; rtbl_set_column_prefix allows setting the + prefix only by column name. In addition to this, columns may be separated + by a string set with rtbl_set_separator (by default columns are not + seprated by anything). + + The finished table is printed to file with rtbl_format. + +EXAMPLES + This program: + + #include + #include + int + main(int argc, char **argv) + { + rtbl_t table; + table = rtbl_create(); + rtbl_set_separator(table, " "); + rtbl_add_column_by_id(table, 0, "Column A", 0); + rtbl_add_column_by_id(table, 1, "Column B", RTBL_ALIGN_RIGHT); + rtbl_add_column_by_id(table, 2, "Column C", 0); + rtbl_add_column_entry_by_id(table, 0, "A-1"); + rtbl_add_column_entry_by_id(table, 0, "A-2"); + rtbl_add_column_entry_by_id(table, 0, "A-3"); + rtbl_add_column_entry_by_id(table, 1, "B-1"); + rtbl_add_column_entry_by_id(table, 2, "C-1"); + rtbl_add_column_entry_by_id(table, 2, "C-2"); + rtbl_add_column_entry_by_id(table, 1, "B-2"); + rtbl_add_column_entry_by_id(table, 1, "B-3"); + rtbl_add_column_entry_by_id(table, 2, "C-3"); + rtbl_add_column_entry_by_id(table, 0, "A-4"); + rtbl_new_row(table); + rtbl_add_column_entry_by_id(table, 1, "B-4"); + rtbl_new_row(table); + rtbl_add_column_entry_by_id(table, 2, "C-4"); + rtbl_new_row(table); + rtbl_format(table, stdout); + rtbl_destroy(table); + return 0; + } + + will output the following: + + Column A Column B Column C + A-1 B-1 C-1 + A-2 B-2 C-2 + A-3 B-3 C-3 + A-4 + B-4 + C-4 + +HEIMDAL June 26, 2004 HEIMDAL diff --git a/crypto/heimdal/lib/roken/simple_exec.c b/crypto/heimdal/lib/roken/simple_exec.c --- a/crypto/heimdal/lib/roken/simple_exec.c +++ b/crypto/heimdal/lib/roken/simple_exec.c @@ -144,17 +144,31 @@ pipe_execv(FILE **stdin_fd, FILE **stdout_fd, FILE **stderr_fd, const char *file, ...) { - int in_fd[2], out_fd[2], err_fd[2]; + int in_fd[2] = {-1, -1}; + int out_fd[2] = {-1, -1}; + int err_fd[2] = {-1, -1}; pid_t pid; va_list ap; char **argv; + int ret = 0; if(stdin_fd != NULL) - pipe(in_fd); - if(stdout_fd != NULL) - pipe(out_fd); - if(stderr_fd != NULL) - pipe(err_fd); + ret = pipe(in_fd); + if(ret != -1 && stdout_fd != NULL) + ret = pipe(out_fd); + if(ret != -1 && stderr_fd != NULL) + ret = pipe(err_fd); + + if (ret == -1) { + close(in_fd[0]); + close(in_fd[1]); + close(out_fd[0]); + close(out_fd[1]); + close(err_fd[0]); + close(err_fd[1]); + return SE_E_UNSPECIFIED; + } + pid = fork(); switch(pid) { case 0: diff --git a/crypto/heimdal/lib/roken/simple_exec_w32.c b/crypto/heimdal/lib/roken/simple_exec_w32.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/simple_exec_w32.c @@ -0,0 +1,431 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include + +#include +#include + +#ifndef _WIN32 +#error This implementation is Windows specific. +#endif + +/** + * wait_for_process_timed waits for a process to terminate or until a + * specified timeout occurs. + * + * @param[in] pid Process id for the monitored process + + * @param[in] func Timeout callback function. When the wait times out, + * the callback function is called. The possible return values + * from the callback function are: + * + * - ((time_t) -2) Exit loop without killing child and return SE_E_EXECTIMEOUT. + * - ((time_t) -1) Kill child with SIGTERM and wait for child to exit. + * - 0 Don't timeout again + * - n Seconds to next timeout + * + * @param[in] ptr Optional parameter for func() + * + * @param[in] timeout Seconds to first timeout. + * + * @retval SE_E_UNSPECIFIED Unspecified system error + * @retval SE_E_FORKFAILED Fork failure (not applicable for _WIN32 targets) + * @retval SE_E_WAITPIDFAILED waitpid errors + * @retval SE_E_EXECTIMEOUT exec timeout + * @retval 0 <= Return value from subprocess + * @retval SE_E_NOTFOUND The program coudln't be found + * @retval 128- The signal that killed the subprocess +128. + */ +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +wait_for_process_timed(pid_t pid, time_t (*func)(void *), + void *ptr, time_t timeout) +{ + HANDLE hProcess; + DWORD wrv = 0; + DWORD dtimeout; + int rv = 0; + + hProcess = OpenProcess(SYNCHRONIZE, FALSE, pid); + + if (hProcess == NULL) { + return SE_E_WAITPIDFAILED; + } + + dtimeout = (DWORD) ((timeout == 0)? INFINITE: timeout * 1000); + + do { + wrv = WaitForSingleObject(hProcess, dtimeout); + + if (wrv == WAIT_OBJECT_0) { + + DWORD prv = 0; + + GetExitCodeProcess(hProcess, &prv); + rv = (int) prv; + break; + + } else if (wrv == WAIT_TIMEOUT) { + + if (func == NULL) + continue; + + timeout = (*func)(ptr); + + if (timeout == (time_t)-1) { + + if (TerminateProcess(hProcess, 128 + 9)) { + dtimeout = INFINITE; + continue; + } + rv = SE_E_UNSPECIFIED; + break; + + } else if (timeout == (time_t) -2) { + + rv = SE_E_EXECTIMEOUT; + break; + + } else { + + dtimeout = (DWORD) ((timeout == 0)? INFINITE: timeout * 1000); + continue; + + } + + } else { + + rv = SE_E_UNSPECIFIED; + break; + + } + + } while(TRUE); + + CloseHandle(hProcess); + + return rv; +} + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +wait_for_process(pid_t pid) +{ + return wait_for_process_timed(pid, NULL, NULL, 0); +} + +static char * +collect_commandline(const char * fn, va_list * ap) +{ + size_t len = 0; + size_t alloc_len = 0; + const char * s; + char * cmd = NULL; + + for (s = fn; s; s = (char *) va_arg(*ap, char *)) { + size_t cmp_len; + int need_quote = FALSE; + + if (FAILED(StringCchLength(s, MAX_PATH, &cmp_len))) { + if (cmd) + free(cmd); + return NULL; + } + + if (cmp_len == 0) + continue; + + if (strchr(s, ' ') && /* need to quote any component that + has embedded spaces, but not if + they are already quoted. */ + s[0] != '"' && + s[cmp_len - 1] != '"') { + need_quote = TRUE; + cmp_len += 2 * sizeof(char); + } + + if (s != fn) + cmp_len += 1 * sizeof(char); + + if (alloc_len < len + cmp_len + 1) { + char * nc; + + alloc_len += ((len + cmp_len - alloc_len) / MAX_PATH + 1) * MAX_PATH; + nc = (char *) realloc(cmd, alloc_len * sizeof(char)); + if (nc == NULL) { + if (cmd) + free(cmd); + return NULL; + } + cmd = nc; + } + + if (cmd == NULL) + return NULL; + + if (s != fn) + cmd[len++] = ' '; + + if (need_quote) { + StringCchPrintf(cmd + len, alloc_len - len, "\"%s\"", s); + } else { + StringCchCopy(cmd + len, alloc_len - len, s); + } + + len += cmp_len; + } + + return cmd; +} + +ROKEN_LIB_FUNCTION pid_t ROKEN_LIB_CALL +pipe_execv(FILE **stdin_fd, FILE **stdout_fd, FILE **stderr_fd, + const char *file, ...) +{ + HANDLE hOut_r = NULL; + HANDLE hOut_w = NULL; + HANDLE hIn_r = NULL; + HANDLE hIn_w = NULL; + HANDLE hErr_r = NULL; + HANDLE hErr_w = NULL; + + SECURITY_ATTRIBUTES sa; + STARTUPINFO si; + PROCESS_INFORMATION pi; + + char * commandline = NULL; + + pid_t rv = (pid_t) -1; + + { + va_list ap; + + va_start(ap, file); + commandline = collect_commandline(file, &ap); + + if (commandline == NULL) + return rv; + } + + ZeroMemory(&si, sizeof(si)); + ZeroMemory(&pi, sizeof(pi)); + ZeroMemory(&sa, sizeof(sa)); + + pi.hProcess = NULL; + pi.hThread = NULL; + + sa.nLength = sizeof(sa); + sa.bInheritHandle = TRUE; + sa.lpSecurityDescriptor = NULL; + + if ((stdout_fd && !CreatePipe(&hOut_r, &hOut_w, &sa, 0 /* Use default */)) || + + (stdin_fd && !CreatePipe(&hIn_r, &hIn_w, &sa, 0)) || + + (stderr_fd && !CreatePipe(&hErr_r, &hErr_w, &sa, 0)) || + + (!stdout_fd && (hOut_w = CreateFile("CON", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, + &sa, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) || + + (!stdin_fd && (hIn_r = CreateFile("CON",GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, + &sa, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) || + + (!stderr_fd && (hErr_w = CreateFile("CON", GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, + &sa, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)) + + goto _exit; + + /* We don't want the child processes inheriting these */ + if (hOut_r) + SetHandleInformation(hOut_r, HANDLE_FLAG_INHERIT, FALSE); + + if (hIn_w) + SetHandleInformation(hIn_w, HANDLE_FLAG_INHERIT, FALSE); + + if (hErr_r) + SetHandleInformation(hErr_r, HANDLE_FLAG_INHERIT, FALSE); + + si.cb = sizeof(si); + si.lpReserved = NULL; + si.lpDesktop = NULL; + si.lpTitle = NULL; + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = hIn_r; + si.hStdOutput = hOut_w; + si.hStdError = hErr_w; + + if (!CreateProcess(file, commandline, NULL, NULL, + TRUE, /* bInheritHandles */ + CREATE_NO_WINDOW, /* dwCreationFlags */ + NULL, /* lpEnvironment */ + NULL, /* lpCurrentDirectory */ + &si, + &pi)) { + + rv = (pid_t) (GetLastError() == ERROR_FILE_NOT_FOUND)? 127 : -1; + goto _exit; + } + + if (stdin_fd) { + *stdin_fd = _fdopen(_open_osfhandle((intptr_t) hIn_w, 0), "wb"); + if (*stdin_fd) + hIn_w = NULL; + } + + if (stdout_fd) { + *stdout_fd = _fdopen(_open_osfhandle((intptr_t) hOut_r, _O_RDONLY), "rb"); + if (*stdout_fd) + hOut_r = NULL; + } + + if (stderr_fd) { + *stderr_fd = _fdopen(_open_osfhandle((intptr_t) hErr_r, _O_RDONLY), "rb"); + if (*stderr_fd) + hErr_r = NULL; + } + + rv = (pid_t) pi.dwProcessId; + + _exit: + + if (pi.hProcess) CloseHandle(pi.hProcess); + + if (pi.hThread) CloseHandle(pi.hThread); + + if (hIn_r) CloseHandle(hIn_r); + + if (hIn_w) CloseHandle(hIn_w); + + if (hOut_r) CloseHandle(hOut_r); + + if (hOut_w) CloseHandle(hOut_w); + + if (hErr_r) CloseHandle(hErr_r); + + if (hErr_w) CloseHandle(hErr_w); + + return rv; +} + + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +simple_execvp_timed(const char *file, char *const args[], + time_t (*func)(void *), void *ptr, time_t timeout) +{ + intptr_t hp; + int rv; + + hp = spawnvp(_P_NOWAIT, file, args); + + if (hp == -1) + return (errno == ENOENT)? 127: 126; + else if (hp == 0) + return 0; + + rv = wait_for_process_timed(GetProcessId((HANDLE) hp), func, ptr, timeout); + + CloseHandle((HANDLE) hp); + + return rv; +} + + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +simple_execvp(const char *file, char *const args[]) +{ + return simple_execvp_timed(file, args, NULL, NULL, 0); +} + + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +simple_execve_timed(const char *file, char *const args[], char *const envp[], + time_t (*func)(void *), void *ptr, time_t timeout) +{ + intptr_t hp; + int rv; + + hp = spawnve(_P_NOWAIT, file, args, envp); + + if (hp == -1) + return (errno == ENOENT)? 127: 126; + else if (hp == 0) + return 0; + + rv = wait_for_process_timed(GetProcessId((HANDLE) hp), func, ptr, timeout); + + CloseHandle((HANDLE) hp); + + return rv; +} + + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +simple_execve(const char *file, char *const args[], char *const envp[]) +{ + return simple_execve_timed(file, args, envp, NULL, NULL, 0); +} + + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +simple_execlp(const char *file, ...) +{ + va_list ap; + char **argv; + int ret; + + va_start(ap, file); + argv = vstrcollect(&ap); + va_end(ap); + if(argv == NULL) + return SE_E_UNSPECIFIED; + ret = simple_execvp(file, argv); + free(argv); + return ret; +} + + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +simple_execle(const char *file, ... /* ,char *const envp[] */) +{ + va_list ap; + char **argv; + char *const* envp; + int ret; + + va_start(ap, file); + argv = vstrcollect(&ap); + envp = va_arg(ap, char **); + va_end(ap); + if(argv == NULL) + return SE_E_UNSPECIFIED; + ret = simple_execve(file, argv, envp); + free(argv); + return ret; +} diff --git a/crypto/heimdal/lib/roken/sleep.c b/crypto/heimdal/lib/roken/sleep.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/sleep.c @@ -0,0 +1,55 @@ +/*********************************************************************** + * Copyright (c) 2009, 2014, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include + +#include + +#ifndef _WIN32 +#error Only implemented on Windows +#endif + +ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL +sleep(unsigned int seconds) +{ + if (SleepEx(1000 * (DWORD) seconds, FALSE) != 0) + return -1; + return 0; +} + +/* We can only sleep in millisecond increments */ +ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL +usleep(unsigned int useconds) +{ + if (SleepEx((DWORD)(useconds / 1000), FALSE) != 0) + return -1; + return 0; +} diff --git a/crypto/heimdal/lib/roken/snprintf-test.c b/crypto/heimdal/lib/roken/snprintf-test.c --- a/crypto/heimdal/lib/roken/snprintf-test.c +++ b/crypto/heimdal/lib/roken/snprintf-test.c @@ -34,6 +34,9 @@ #include "roken.h" #include +extern int rk_snprintf(char *, size_t, const char *, ...); +extern int rk_vsnprintf(char *, size_t, const char *, va_list); + static int try (const char *format, ...) { @@ -132,9 +135,10 @@ { int tot = 0; long long long_long_values[] = { - ((long long)LONG_MIN) -1, LONG_MIN, -17, -1, - 0, - 1, 17, 4711, 65535, LONG_MAX, ((long long)LONG_MAX) + 1}; + ((long long)LONG_MIN) - (sizeof(long long) > sizeof(long)), + LONG_MIN, -17, -1, 0, 1, 17, 4711, 65535, LONG_MAX, + ((long long)LONG_MAX) + (sizeof(long long) > sizeof(long)) + }; int i; for (i = 0; i < sizeof(long_long_values) / sizeof(long_long_values[0]); ++i) { diff --git a/crypto/heimdal/lib/roken/snprintf.c b/crypto/heimdal/lib/roken/snprintf.c --- a/crypto/heimdal/lib/roken/snprintf.c +++ b/crypto/heimdal/lib/roken/snprintf.c @@ -117,6 +117,10 @@ typedef long longest; #endif +#ifndef HAVE_UINTPTR_T +typedef u_longest uintptr_t; +#endif + static size_t @@ -272,7 +276,7 @@ len += pad(state, width, ' '); if (prec != -1) { - while (*arg && prec--) { + while (prec-- && *arg) { (*state->append_char) (state, *arg++); ++len; } @@ -445,13 +449,16 @@ break; case 'd' : case 'i' : { - longest arg; - u_longest num; + int64_t arg; + uint64_t num; int minusp = 0; PARSE_INT_FORMAT(arg, ap, signed); - if (arg < 0) { + if (arg == INT64_MIN) { + minusp = 1; + num = (uint64_t)INT64_MAX + 1; + } else if (arg < 0) { minusp = 1; num = -arg; } else @@ -498,7 +505,7 @@ break; } case 'p' : { - u_longest arg = (uintptr_t)va_arg(ap, void*); + uintptr_t arg = (uintptr_t)va_arg(ap, void*); len += append_number (state, arg, 0x10, "0123456789ABCDEF", width, prec, flags, 0); diff --git a/crypto/heimdal/lib/roken/socket.c b/crypto/heimdal/lib/roken/socket.c --- a/crypto/heimdal/lib/roken/socket.c +++ b/crypto/heimdal/lib/roken/socket.c @@ -259,6 +259,28 @@ #endif } +/* + * Set the non-blocking-ness of the socket. + */ + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +socket_set_nonblocking(rk_socket_t sock, int nonblock) +{ +#if defined(O_NONBLOCK) + int flags = fcntl(sock, F_GETFL, 0); + if (flags == -1) + return; + if (nonblock) + flags |= O_NONBLOCK; + else + flags &= ~O_NONBLOCK; + fcntl(sock, F_SETFL, flags); +#elif defined(FIOBIO) + int flags = !!nonblock; + return ioctl(sock, FIOBIO, &flags); +#endif +} + /* * set the reuse of addresses on `sock' to `val'. */ diff --git a/crypto/heimdal/lib/roken/sockstartup_w32.c b/crypto/heimdal/lib/roken/sockstartup_w32.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/sockstartup_w32.c @@ -0,0 +1,75 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include + +#include + +#ifndef _WIN32 +#error Only implemented for Windows +#endif + +volatile LONG _startup_count = 0; + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_WSAStartup(void) +{ + WSADATA wsad; + + if (!WSAStartup( MAKEWORD(2, 2), &wsad )) { + if (wsad.wVersion != MAKEWORD(2, 2)) { + /* huh? We can't use 2.2? */ + WSACleanup(); + return -1; + } + + InterlockedIncrement(&_startup_count); + return 0; + } + + return -1; +} + + +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +rk_WSACleanup(void) +{ + LONG l; + + if ((l = InterlockedDecrement(&_startup_count)) < 0) { + l = InterlockedIncrement(&_startup_count) - 1; + } + + if (l >= 0) { + return WSACleanup(); + } + return -1; +} diff --git a/crypto/heimdal/lib/roken/stdbool.hin b/crypto/heimdal/lib/roken/stdbool.hin new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/stdbool.hin @@ -0,0 +1,13 @@ +#ifndef _STDBOOL_H +#define _STDBOOL_H + +#ifndef __GNUC__ +typedef int _Bool; +#endif + +#define bool _Bool +#define true 1 +#define false 0 +#define __bool_true_false_are_defined 1 + +#endif /* _STDBOOL_H */ diff --git a/crypto/heimdal/lib/roken/stdint.hin b/crypto/heimdal/lib/roken/stdint.hin new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/stdint.hin @@ -0,0 +1,15 @@ +#ifndef _STDINT_H +#define _STDINT_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef long long int64_t; +typedef unsigned long long uint64_t; + +#ifdef __cplusplus +} +#endif + +#endif /* _STDINT_H */ diff --git a/crypto/heimdal/lib/roken/strtoll.c b/crypto/heimdal/lib/roken/strtoll.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/strtoll.c @@ -0,0 +1,151 @@ +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include + +#include "roken.h" + +#ifndef HAVE_STRTOLL + +/* #include */ + +#include +#include +#include +#include +#include + +/* + * Convert a string to a long long integer. + * + * Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +ROKEN_LIB_FUNCTION long long ROKEN_LIB_CALL +strtoll(const char * nptr, char ** endptr, int base) +{ + const char *s; + unsigned long long acc; + char c; + unsigned long long cutoff; + int neg, any, cutlim; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + s = nptr; + do { + c = *s++; + } while (isspace((unsigned char)c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X') && + ((s[1] >= '0' && s[1] <= '9') || + (s[1] >= 'A' && s[1] <= 'F') || + (s[1] >= 'a' && s[1] <= 'f'))) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + acc = any = 0; + if (base < 2 || base > 36) + goto noconv; + + /* + * Compute the cutoff value between legal numbers and illegal + * numbers. That is the largest legal value, divided by the + * base. An input number that is greater than this value, if + * followed by a legal input character, is too big. One that + * is equal to this value may be valid or not; the limit + * between valid and invalid numbers is then based on the last + * digit. For instance, if the range for quads is + * [-9223372036854775808..9223372036854775807] and the input base + * is 10, cutoff will be set to 922337203685477580 and cutlim to + * either 7 (neg==0) or 8 (neg==1), meaning that if we have + * accumulated a value > 922337203685477580, or equal but the + * next digit is > 7 (or 8), the number is too big, and we will + * return a range error. + * + * Set 'any' if any `digits' consumed; make it negative to indicate + * overflow. + */ + cutoff = neg ? (unsigned long long)-(LLONG_MIN + LLONG_MAX) + LLONG_MAX + : LLONG_MAX; + cutlim = cutoff % base; + cutoff /= base; + for ( ; ; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = neg ? LLONG_MIN : LLONG_MAX; + errno = ERANGE; + } else if (!any) { +noconv: + errno = EINVAL; + } else if (neg) + acc = -acc; + if (endptr != NULL) + *endptr = (char *)(any ? s - 1 : nptr); + return (acc); +} +#endif /* !HAVE_STRTOLL */ diff --git a/crypto/heimdal/lib/roken/strtoull.c b/crypto/heimdal/lib/roken/strtoull.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/strtoull.c @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * Copyright (c) 2011 The FreeBSD Foundation + * All rights reserved. + * Portions of this software were developed by David Chisnall + * under sponsorship from the FreeBSD Foundation. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#include + +#include "roken.h" + +#ifndef HAVE_STRTOULL + +/* #include */ + +#include +#include +#include +#include +#include + +/* + * Convert a string to an unsigned long long integer. + * + * Assumes that the upper and lower case + * alphabets and digits are each contiguous. + */ +ROKEN_LIB_FUNCTION unsigned long long ROKEN_LIB_CALL +strtoull(const char * nptr, char ** endptr, int base) +{ + const char *s; + unsigned long long acc; + char c; + unsigned long long cutoff; + int neg, any, cutlim; + + /* + * See strtoq for comments as to the logic used. + */ + s = nptr; + do { + c = *s++; + } while (isspace((unsigned char)c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X') && + ((s[1] >= '0' && s[1] <= '9') || + (s[1] >= 'A' && s[1] <= 'F') || + (s[1] >= 'a' && s[1] <= 'f'))) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + acc = any = 0; + if (base < 2 || base > 36) + goto noconv; + + cutoff = ULLONG_MAX / base; + cutlim = ULLONG_MAX % base; + for ( ; ; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; + else + break; + if (c >= base) + break; + if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim)) + any = -1; + else { + any = 1; + acc *= base; + acc += c; + } + } + if (any < 0) { + acc = ULLONG_MAX; + errno = ERANGE; + } else if (!any) { +noconv: + errno = EINVAL; + } else if (neg) + acc = -acc; + if (endptr != NULL) + *endptr = (char *)(any ? s - 1 : nptr); + return (acc); +} +#endif /* !HAVE_STRTOULL */ diff --git a/crypto/heimdal/lib/roken/syslog.hin b/crypto/heimdal/lib/roken/syslog.hin new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/syslog.hin @@ -0,0 +1,248 @@ +/* + * Copyright (c) 1982, 1986, 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)syslog.h 8.1 (Berkeley) 6/2/93 + */ + +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#ifndef _SYS_SYSLOG_H +#define _SYS_SYSLOG_H 1 + +#include + +/* + * priorities/facilities are encoded into a single 32-bit quantity, where the + * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility + * (0-big number). Both the priorities and the facilities map roughly + * one-to-one to strings in the syslogd(8) source code. This mapping is + * included in this file. + * + * priorities (these are ordered) + */ +#define LOG_EMERG 0 /* system is unusable */ +#define LOG_ALERT 1 /* action must be taken immediately */ +#define LOG_CRIT 2 /* critical conditions */ +#define LOG_ERR 3 /* error conditions */ +#define LOG_WARNING 4 /* warning conditions */ +#define LOG_NOTICE 5 /* normal but significant condition */ +#define LOG_INFO 6 /* informational */ +#define LOG_DEBUG 7 /* debug-level messages */ + +#define LOG_PRIMASK 0x07 /* mask to extract priority part (internal) */ + /* extract priority */ +#define LOG_PRI(p) ((p) & LOG_PRIMASK) +#define LOG_MAKEPRI(fac, pri) (((fac) << 3) | (pri)) + +#ifdef SYSLOG_NAMES +#define INTERNAL_NOPRI 0x10 /* the "no priority" priority */ + /* mark "facility" */ +#define INTERNAL_MARK LOG_MAKEPRI(LOG_NFACILITIES, 0) +typedef struct _code { + char *c_name; + int c_val; +} CODE; + +CODE prioritynames[] = + { + { "alert", LOG_ALERT }, + { "crit", LOG_CRIT }, + { "debug", LOG_DEBUG }, + { "emerg", LOG_EMERG }, + { "err", LOG_ERR }, + { "error", LOG_ERR }, /* DEPRECATED */ + { "info", LOG_INFO }, + { "none", INTERNAL_NOPRI }, /* INTERNAL */ + { "notice", LOG_NOTICE }, + { "panic", LOG_EMERG }, /* DEPRECATED */ + { "warn", LOG_WARNING }, /* DEPRECATED */ + { "warning", LOG_WARNING }, + { NULL, -1 } + }; +#endif + +/* facility codes */ +#define LOG_KERN (0<<3) /* kernel messages */ +#define LOG_USER (1<<3) /* random user-level messages */ +#define LOG_MAIL (2<<3) /* mail system */ +#define LOG_DAEMON (3<<3) /* system daemons */ +#define LOG_AUTH (4<<3) /* security/authorization messages */ +#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */ +#define LOG_LPR (6<<3) /* line printer subsystem */ +#define LOG_NEWS (7<<3) /* network news subsystem */ +#define LOG_UUCP (8<<3) /* UUCP subsystem */ +#define LOG_CRON (9<<3) /* clock daemon */ +#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */ +#define LOG_FTP (11<<3) /* ftp daemon */ + + /* other codes through 15 reserved for system use */ +#define LOG_LOCAL0 (16<<3) /* reserved for local use */ +#define LOG_LOCAL1 (17<<3) /* reserved for local use */ +#define LOG_LOCAL2 (18<<3) /* reserved for local use */ +#define LOG_LOCAL3 (19<<3) /* reserved for local use */ +#define LOG_LOCAL4 (20<<3) /* reserved for local use */ +#define LOG_LOCAL5 (21<<3) /* reserved for local use */ +#define LOG_LOCAL6 (22<<3) /* reserved for local use */ +#define LOG_LOCAL7 (23<<3) /* reserved for local use */ + +#define LOG_NFACILITIES 24 /* current number of facilities */ +#define LOG_FACMASK 0x03f8 /* mask to extract facility part */ + /* facility of pri */ +#define LOG_FAC(p) (((p) & LOG_FACMASK) >> 3) + +#ifdef SYSLOG_NAMES +CODE facilitynames[] = + { + { "auth", LOG_AUTH }, + { "authpriv", LOG_AUTHPRIV }, + { "cron", LOG_CRON }, + { "daemon", LOG_DAEMON }, + { "ftp", LOG_FTP }, + { "kern", LOG_KERN }, + { "lpr", LOG_LPR }, + { "mail", LOG_MAIL }, + { "mark", INTERNAL_MARK }, /* INTERNAL */ + { "news", LOG_NEWS }, + { "security", LOG_AUTH }, /* DEPRECATED */ + { "syslog", LOG_SYSLOG }, + { "user", LOG_USER }, + { "uucp", LOG_UUCP }, + { "local0", LOG_LOCAL0 }, + { "local1", LOG_LOCAL1 }, + { "local2", LOG_LOCAL2 }, + { "local3", LOG_LOCAL3 }, + { "local4", LOG_LOCAL4 }, + { "local5", LOG_LOCAL5 }, + { "local6", LOG_LOCAL6 }, + { "local7", LOG_LOCAL7 }, + { NULL, -1 } + }; +#endif + +/* + * arguments to setlogmask. + */ +#define LOG_MASK(pri) (1 << (pri)) /* mask for one priority */ +#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1) /* all priorities through pri */ + +/* + * Option flags for openlog. + * + * LOG_ODELAY no longer does anything. + * LOG_NDELAY is the inverse of what it used to be. + */ +#define LOG_PID 0x01 /* log the pid with each message */ +#define LOG_CONS 0x02 /* log on the console if errors in sending */ +#define LOG_ODELAY 0x04 /* delay open until first syslog() (default) */ +#define LOG_NDELAY 0x08 /* don't delay open */ +#define LOG_NOWAIT 0x10 /* don't wait for console forks: DEPRECATED */ +#define LOG_PERROR 0x20 /* log to stderr as well */ + +#define SYSLOG_PORT 514 + +#ifdef __cplusplus +extern "C" { +#endif + +/* Close desriptor used to write to system logger. */ +extern void closelog (void); + +/* Open connection to system logger. */ +extern void openlog (char *__ident, int __option, int __facility); + +/* Set the log mask level. */ +extern int setlogmask (int __mask); + +/* Generate a log message using FMT string and option arguments. */ +extern void syslog (int __pri, char *__fmt, ...); + +/* Generate a log message using FMT and using arguments pointed to by AP. */ +extern void vsyslog (int __pri, char *__fmt, va_list __ap); + +#ifdef _WIN32 + /* Windows specific. + + init_syslog() *must* be called before calling any of the above + functions. exit_syslog() will be scheduled using atexit(). + However, it is not an error and encouraged to call + exit_syslog() before the application exits. + + During operation, the application is free to call exit_syslog() + followed by init_syslog() to re-initialize the library. i.e. if + a different syslog host is to be used. + + */ + + /* Initializes the syslog library and sets the syslog host. The + hostname parameter is of the form "[:]". The + may be a numeric port or it may be a name of a service. + If the is specified using a service name, it will be + looked up using getservbyname(). + + On failure, the hostname and port will be set to "localhost" + and SYSLOG_PORT respectively. + */ + extern void init_syslog(const char * hostname); + + extern void exit_syslog(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* syslog.h */ diff --git a/crypto/heimdal/lib/roken/syslogc.c b/crypto/heimdal/lib/roken/syslogc.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/syslogc.c @@ -0,0 +1,339 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +/* + * Based on code by Alexander Yaworsky + */ + +#include + +#include + +#define SYSLOG_DGRAM_SIZE 1024 + +static BOOL syslog_opened = FALSE; + +static int syslog_mask = 0xFF; +static char syslog_ident[ 128 ] = ""; +static int syslog_facility = LOG_USER; +static char syslog_procid_str[ 20 ]; + +static SOCKADDR_IN syslog_hostaddr; +static SOCKET syslog_socket = INVALID_SOCKET; +static char local_hostname[ MAX_COMPUTERNAME_LENGTH + 1 ]; + +static char syslog_hostname[ MAX_COMPUTERNAME_LENGTH + 1 ] = "localhost"; +static unsigned short syslog_port = SYSLOG_PORT; + +static int datagramm_size; + +volatile BOOL initialized = FALSE; +BOOL wsa_initialized = FALSE; +CRITICAL_SECTION cs_syslog; + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +init_syslog(const char * hostname) +{ + WSADATA wsd; + char * service; + + if ( initialized ) + return; + + if( WSAStartup( MAKEWORD( 2, 2 ), &wsd ) ) { + fprintf(stderr, "Can't initialize WinSock\n"); + /* we let the rest of the initialization code go through, + although none of the syslog calls would succeed. */ + } else { + wsa_initialized = TRUE; + } + + if (hostname) + strcpy_s(syslog_hostname, sizeof(syslog_hostname), hostname); + else + strcpy_s(syslog_hostname, sizeof(syslog_hostname), ""); + + service = strchr(syslog_hostname, ':'); + + if (service) { + int tp; + + *service++ = '\0'; + + if ((tp = atoi(service)) <= 0) { + struct servent * se; + + se = getservbyname(service, "udp"); + + syslog_port = (se == NULL)? SYSLOG_PORT: se->s_port; + } else { + syslog_port = (unsigned short) tp; + } + } else { + syslog_port = SYSLOG_PORT; + } + + InitializeCriticalSection(&cs_syslog); + initialized = TRUE; + + atexit(exit_syslog); +} + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +exit_syslog(void) +{ + if ( !initialized ) + return; + + closelog(); + + if ( wsa_initialized ) + WSACleanup(); + + DeleteCriticalSection(&cs_syslog); + initialized = FALSE; +} + +static void init_logger_addr() +{ + struct hostent * phe = NULL; + + memset( &syslog_hostaddr, 0, sizeof(SOCKADDR_IN) ); + syslog_hostaddr.sin_family = AF_INET; + + if (syslog_hostname[0] == '\0') + goto use_default; + + phe = gethostbyname( syslog_hostname ); + if( !phe ) + goto use_default; + + memcpy( &syslog_hostaddr.sin_addr.s_addr, phe->h_addr, phe->h_length ); + + syslog_hostaddr.sin_port = htons( syslog_port ); + return; + +use_default: + syslog_hostaddr.sin_addr.S_un.S_addr = htonl( 0x7F000001 ); + syslog_hostaddr.sin_port = htons( SYSLOG_PORT ); +} + +/****************************************************************************** + * closelog + * + * Close desriptor used to write to system logger. + */ +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +closelog() +{ + if ( !initialized ) + return; + + EnterCriticalSection(&cs_syslog); + if( syslog_opened ) { + closesocket( syslog_socket ); + syslog_socket = INVALID_SOCKET; + syslog_opened = FALSE; + } + LeaveCriticalSection(&cs_syslog); +} + +/****************************************************************************** + * openlog + * + * Open connection to system logger. + */ +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +openlog( char* ident, int option, int facility ) +{ + BOOL failed = FALSE; + SOCKADDR_IN sa_local; + DWORD n; + int size; + + if ( !initialized ) + return; + + EnterCriticalSection(&cs_syslog); + + if( syslog_opened ) + goto done; + + failed = TRUE; + + syslog_facility = facility? facility : LOG_USER; + + if( option & LOG_PID ) + sprintf_s( syslog_procid_str, sizeof(syslog_procid_str), "[%lu]", GetCurrentProcessId() ); + else + syslog_procid_str[0] = '\0'; + + /* FIXME: handle other options */ + + n = sizeof(local_hostname); + if( !GetComputerName( local_hostname, &n ) ) + goto done; + + syslog_socket = INVALID_SOCKET; + + init_logger_addr(); + + for( n = 0;; n++ ) + { + syslog_socket = socket( AF_INET, SOCK_DGRAM, 0 ); + if( INVALID_SOCKET == syslog_socket ) + goto done; + + memset( &sa_local, 0, sizeof(SOCKADDR_IN) ); + sa_local.sin_family = AF_INET; + if( bind( syslog_socket, (SOCKADDR*) &sa_local, sizeof(SOCKADDR_IN) ) == 0 ) + break; + rk_closesocket( syslog_socket ); + syslog_socket = INVALID_SOCKET; + if( n == 100 ) + goto done; + Sleep(0); + } + + /* get size of datagramm */ + size = sizeof(datagramm_size); + if( getsockopt( syslog_socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (char*) &datagramm_size, &size ) ) + goto done; + if( datagramm_size - strlen(local_hostname) - (ident? strlen(ident) : 0) < 64 ) + goto done; + if( datagramm_size > SYSLOG_DGRAM_SIZE ) + datagramm_size = SYSLOG_DGRAM_SIZE; + + if (ident) + strcpy_s(syslog_ident, sizeof(syslog_ident), ident); + + syslog_facility = (facility ? facility : LOG_USER); + failed = FALSE; + + done: + if( failed ) { + if( syslog_socket != INVALID_SOCKET ) + rk_closesocket( syslog_socket ); + } + syslog_opened = !failed; + + LeaveCriticalSection(&cs_syslog); +} + +/****************************************************************************** + * setlogmask + * + * Set the log mask level. + */ +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +setlogmask( int mask ) +{ + int ret; + + if ( !initialized ) + return 0; + + EnterCriticalSection(&cs_syslog); + + ret = syslog_mask; + if( mask ) + syslog_mask = mask; + + LeaveCriticalSection(&cs_syslog); + + return ret; +} + +/****************************************************************************** + * syslog + * + * Generate a log message using FMT string and option arguments. + */ +ROKEN_LIB_FUNCTION void +syslog( int pri, char* fmt, ... ) +{ + va_list ap; + + va_start( ap, fmt ); + vsyslog( pri, fmt, ap ); + va_end( ap ); +} + +/****************************************************************************** + * vsyslog + * + * Generate a log message using FMT and using arguments pointed to by AP. + */ +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +vsyslog( int pri, char* fmt, va_list ap ) +{ + static char *month[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + char datagramm[ SYSLOG_DGRAM_SIZE ]; + SYSTEMTIME stm; + int len; + char *p; + + if ( !initialized ) + return; + + EnterCriticalSection(&cs_syslog); + + if( !(LOG_MASK( LOG_PRI( pri )) & syslog_mask) ) + goto done; + + openlog( NULL, 0, pri & LOG_FACMASK ); + if( !syslog_opened ) + goto done; + + if( !(pri & LOG_FACMASK) ) + pri |= syslog_facility; + + GetLocalTime( &stm ); + len = sprintf_s( datagramm, sizeof(datagramm), + "<%d>%s %2d %02d:%02d:%02d %s %s%s: ", + pri, + month[ stm.wMonth - 1 ], stm.wDay, stm.wHour, stm.wMinute, stm.wSecond, + local_hostname, syslog_ident, syslog_procid_str ); + vsprintf_s( datagramm + len, datagramm_size - len, fmt, ap ); + p = strchr( datagramm, '\n' ); + if( p ) + *p = 0; + p = strchr( datagramm, '\r' ); + if( p ) + *p = 0; + + sendto( syslog_socket, datagramm, strlen(datagramm), 0, (SOCKADDR*) &syslog_hostaddr, sizeof(SOCKADDR_IN) ); + + done: + LeaveCriticalSection(&cs_syslog); +} + diff --git a/crypto/heimdal/lib/roken/test-detach.c b/crypto/heimdal/lib/roken/test-detach.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/test-detach.c @@ -0,0 +1,82 @@ +/*********************************************************************** + * Copyright (c) 2015, Cryptonector LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#ifdef WIN32 +#include +#ifdef getpid +#undef getpid +#endif +#define getpid _getpid +#else +#include +#endif +#include "roken.h" + +int main(int argc, char **argv) +{ + char *ends; + long n; + int fd = -1; + + if (argc > 1) { + if (argc != 3) + errx(1, "Usage: test-detach [--daemon-child fd]"); + fprintf(stderr, "Child started (argv[1] = %s, argv[2] = %s)!\n", argv[1], argv[2]); + errno = 0; + n = strtol(argv[2], &ends, 10); + fd = n; + if (errno != 0) + err(1, "Usage: test-detach [--daemon-child fd]"); + if (n < 0 || ends == NULL || *ends != '\0' || n != fd) + errx(1, "Usage: test-detach [--daemon-child fd]"); + } else { + fprintf(stderr, "Parent started as %ld\n", (long)getpid()); + roken_detach_prep(argc, argv, "--daemon-child"); + } + fprintf(stderr, "Now should be the child: %ld\n", (long)getpid()); + roken_detach_finish(NULL, fd); + /* + * These printfs will not appear: stderr will have been replaced + * with /dev/null. + */ + fprintf(stderr, "Now should be the child: %ld, wrote to parent\n", (long)getpid()); + sleep(5); + fprintf(stderr, "Daemon child done\n"); + return 0; +} diff --git a/crypto/heimdal/lib/roken/test-mem.c b/crypto/heimdal/lib/roken/test-mem.c --- a/crypto/heimdal/lib/roken/test-mem.c +++ b/crypto/heimdal/lib/roken/test-mem.c @@ -70,13 +70,16 @@ segv_handler(int sig) { int fd; + ssize_t ret; char msg[] = "SIGSEGV i current test: "; fd = open("/dev/stdout", O_WRONLY, 0600); if (fd >= 0) { - (void)write(fd, msg, sizeof(msg) - 1); - (void)write(fd, testname, strlen(testname)); - (void)write(fd, "\n", 1); + ret = write(fd, msg, sizeof(msg) - 1); + if (ret != -1) + ret = write(fd, testname, strlen(testname)); + if (ret != -1) + ret = write(fd, "\n", 1); close(fd); } _exit(1); diff --git a/crypto/heimdal/lib/roken/test-mini_inetd.c b/crypto/heimdal/lib/roken/test-mini_inetd.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/test-mini_inetd.c @@ -0,0 +1,369 @@ +/*********************************************************************** + * Copyright (c) 2009, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +#include +#include +#include +#include +#include + +#define PORT 8013 +#define PORT_S "8013" + +char * prog = "Master"; +int is_client = 0; + +static int +get_address(int flags, struct addrinfo ** ret) +{ + struct addrinfo ai; + int rv; + + memset(&ai, 0, sizeof(ai)); + + ai.ai_flags = flags | AI_NUMERICHOST; + ai.ai_family = AF_INET; + ai.ai_socktype = SOCK_STREAM; + ai.ai_protocol = PF_UNSPEC; + + rv = getaddrinfo("127.0.0.1", PORT_S, &ai, ret); + if (rv) + warnx("getaddrinfo: %s", gai_strerror(rv)); + return rv; +} + +static int +get_connected_socket(rk_socket_t * s_ret) +{ + struct addrinfo * ai = NULL; + int rv = 0; + rk_socket_t s = rk_INVALID_SOCKET; + + rv = get_address(0, &ai); + if (rv) + return rv; + + s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); + if (rk_IS_BAD_SOCKET(s)) { + rv = 1; + goto done; + } + + rv = connect(s, ai->ai_addr, ai->ai_addrlen); + if (rk_IS_SOCKET_ERROR(rv)) + goto done; + + *s_ret = s; + s = rk_INVALID_SOCKET; + rv = 0; + + done: + if (!rk_IS_BAD_SOCKET(s)) + rk_closesocket(s); + + if (ai) + freeaddrinfo(ai); + + return (rv) ? rk_SOCK_ERRNO : 0; +} + +const char * test_strings[] = { + "Hello", + "01234566789012345689012345678901234567890123456789", + "Another test", + "exit" +}; + +static int +test_simple_echo_client(void) +{ + rk_socket_t s = rk_INVALID_SOCKET; + int rv; + char buf[81]; + int i; + + fprintf(stderr, "[%s] Getting connected socket...", getprogname()); + rv = get_connected_socket(&s); + if (rv) { + fprintf(stderr, "\n[%s] get_connected_socket() failed (%s)\n", + getprogname(), strerror(rk_SOCK_ERRNO)); + return 1; + } + + fprintf(stderr, "[%s] done\n", getprogname()); + + for (i=0; i < sizeof(test_strings)/sizeof(test_strings[0]); i++) { + rv = send(s, test_strings[i], strlen(test_strings[i]), 0); + if (rk_IS_SOCKET_ERROR(rv)) { + fprintf(stderr, "[%s] send() failure (%s)\n", + getprogname(), strerror(rk_SOCK_ERRNO)); + rk_closesocket(s); + return 1; + } + + rv = recv(s, buf, sizeof(buf), 0); + if (rk_IS_SOCKET_ERROR(rv)) { + fprintf (stderr, "[%s] recv() failure (%s)\n", + getprogname(), strerror(rk_SOCK_ERRNO)); + rk_closesocket(s); + return 1; + } + + if (rv == 0) { + fprintf (stderr, "[%s] No data received\n", prog); + rk_closesocket(s); + return 1; + } + + if (rv != strlen(test_strings[i])) { + fprintf (stderr, "[%s] Data length mismatch %d != %d\n", prog, rv, strlen(test_strings[i])); + rk_closesocket(s); + return 1; + } + } + + fprintf (stderr, "[%s] Done\n", prog); + rk_closesocket(s); + return 0; +} + +static int +test_simple_echo_socket(void) +{ + fprintf (stderr, "[%s] Process ID %d\n", prog, GetCurrentProcessId()); + fprintf (stderr, "[%s] Starting echo test with sockets\n", prog); + + if (is_client) { + return test_simple_echo_client(); + } else { + + rk_socket_t s = rk_INVALID_SOCKET; + + fprintf (stderr, "[%s] Listening for connections...\n", prog); + mini_inetd(htons(PORT), &s); + if (rk_IS_BAD_SOCKET(s)) { + fprintf (stderr, "[%s] Connect failed (%s)\n", + getprogname(), strerror(rk_SOCK_ERRNO)); + } else { + fprintf (stderr, "[%s] Connected\n", prog); + } + + { + char buf[81]; + int rv, srv; + + while ((rv = recv(s, buf, sizeof(buf), 0)) != 0 && !rk_IS_SOCKET_ERROR(rv)) { + buf[rv] = 0; + fprintf(stderr, "[%s] Received [%s]\n", prog, buf); + + /* simple echo */ + srv = send(s, buf, rv, 0); + if (srv != rv) { + if (rk_IS_SOCKET_ERROR(srv)) + fprintf(stderr, "[%s] send() error [%s]\n", + getprogname(), strerror(rk_SOCK_ERRNO)); + else + fprintf(stderr, "[%s] send() size mismatch %d != %d", + getprogname(), srv, rv); + } + + if (!strcmp(buf, "exit")) { + fprintf(stderr, "[%s] Exiting...\n", prog); + shutdown(s, SD_SEND); + rk_closesocket(s); + return 0; + } + } + + fprintf(stderr, "[%s] recv() failed (%s)\n", + getprogname(), + strerror(rk_SOCK_ERRNO)); + } + + rk_closesocket(s); + } + + return 1; +} + +static int +test_simple_echo(void) +{ + fprintf (stderr, "[%s] Starting echo test\n", prog); + + if (is_client) { + + return test_simple_echo_client(); + + } else { + + fprintf (stderr, "[%s] Listening for connections...\n", prog); + mini_inetd(htons(PORT), NULL); + fprintf (stderr, "[%s] Connected\n", prog); + + { + char buf[81]; + while (gets(buf)) { + fprintf(stderr, "[%s] Received [%s]\n", prog, buf); + + if (!strcmp(buf, "exit")) + return 0; + + /* simple echo */ + puts(buf); + } + + fprintf(stderr, "[%s] gets() failed (%s)\n", prog, _strerror("gets")); + } + } + + return 1; +} + +static int +do_client(void) +{ + int rv = 0; + + rk_SOCK_INIT(); + + prog = "Client"; + is_client = 1; + + fprintf(stderr, "Starting client...\n"); + + rv = test_simple_echo_socket(); + + rk_SOCK_EXIT(); + + return rv; +} + +static int +do_server(void) +{ + int rv = 0; + + rk_SOCK_INIT(); + + prog = "Server"; + + fprintf(stderr, "Starting server...\n"); + + rv = test_simple_echo_socket(); + + rk_SOCK_EXIT(); + + return rv; +} + +static time_t +wait_callback(void *p) +{ + return (time_t)-1; +} + +static int +do_test(char * path) +{ + intptr_t p_server; + intptr_t p_client; + int client_rv; + int server_rv; + + p_server = _spawnl(_P_NOWAIT, path, path, "--server", NULL); + if (p_server <= 0) { + fprintf(stderr, "%s: %s", path, _strerror("Can't start server process")); + return 1; + } +#ifdef _WIN32 + /* On Windows, the _spawn*() functions return a process handle on + success. We need a process ID for use with + wait_for_process_timed(). */ + + p_server = GetProcessId((HANDLE) p_server); +#endif + fprintf(stderr, "Created server process ID %d\n", p_server); + + p_client = _spawnl(_P_NOWAIT, path, path, "--client", NULL); + if (p_client <= 0) { + fprintf(stderr, "%s: %s", path, _strerror("Can't start client process")); + fprintf(stderr, "Waiting for server process to terminate ..."); + wait_for_process_timed(p_server, wait_callback, NULL, 5); + fprintf(stderr, "DONE\n"); + return 1; + } +#ifdef _WIN32 + p_client = GetProcessId((HANDLE) p_client); +#endif + fprintf(stderr, "Created client process ID %d\n", p_client); + + fprintf(stderr, "Waiting for client process to terminate ..."); + client_rv = wait_for_process_timed(p_client, wait_callback, NULL, 5); + if (SE_IS_ERROR(client_rv)) { + fprintf(stderr, "\nwait_for_process_timed() failed for client. rv=%d\n", client_rv); + } else { + fprintf(stderr, "DONE\n"); + } + + fprintf(stderr, "Waiting for server process to terminate ..."); + server_rv = wait_for_process_timed(p_server, wait_callback, NULL, 5); + if (SE_IS_ERROR(server_rv)) { + fprintf(stderr, "\nwait_for_process_timed() failed for server. rv=%d\n", server_rv); + } else { + fprintf(stderr, "DONE\n"); + } + + if (client_rv == 0 && server_rv == 0) { + fprintf(stderr, "PASS\n"); + return 0; + } else { + fprintf(stderr, "FAIL: Client rv=%d, Server rv=%d\n", client_rv, server_rv); + return 1; + } +} + +int main(int argc, char ** argv) +{ + setprogname(argv[0]); + + if (argc == 2 && strcmp(argv[1], "--client") == 0) + return do_client(); + else if (argc == 2 && strcmp(argv[1], "--server") == 0) + return do_server(); + else if (argc == 1) + return do_test(argv[0]); + else { + printf ("%s: Test mini_inetd() function. Run with no arguments to start test\n", + argv[0]); + return 1; + } +} diff --git a/crypto/heimdal/lib/roken/tsearch-test.c b/crypto/heimdal/lib/roken/tsearch-test.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/tsearch-test.c @@ -0,0 +1,125 @@ +/* + * Tree search generalized from Knuth (6.2.2) Algorithm T just like + * the AT&T man page says. + * + * The node_t structure is for internal use only, lint doesn't grok it. + * + * Written by reading the System V Interface Definition, not the code. + * + * Totally public domain. + */ + +#include + +#include "roken.h" +#include "search.h" + +struct node { + char *string; + int order; +}; + +extern void *rk_tdelete(const void *, void **, + int (*)(const void *, const void *)); +extern void *rk_tfind(const void *, void * const *, + int (*)(const void *, const void *)); +extern void *rk_tsearch(const void *, void **, int (*)(const void *, const void *)); +extern void rk_twalk(const void *, void (*)(const void *, VISIT, int)); + +void *rootnode = NULL; +int numerr = 0; + +/* + * This routine compares two nodes, based on an + * alphabetical ordering of the string field. + */ +int +node_compare(const void *node1, const void *node2) +{ + return strcmp(((const struct node *) node1)->string, + ((const struct node *) node2)->string); +} + +static int walkorder = -1; + +void +list_node(const void *ptr, VISIT order, int level) +{ + const struct node *p = *(const struct node **) ptr; + + if (order == postorder || order == leaf) { + walkorder++; + if (p->order != walkorder) { + warnx("sort failed: expected %d next, got %d\n", walkorder, + p->order); + numerr++; + } + } +} + +int +main(int argc, char **argv) +{ + int numtest = 1; + struct node *t, *p, tests[] = { + { "", 0 }, + { "ab", 3 }, + { "abc", 4 }, + { "abcdefg", 8 }, + { "abcd", 5 }, + { "a", 2 }, + { "abcdef", 7 }, + { "abcde", 6 }, + { "=", 1 }, + { NULL } + }; + + for(t = tests; t->string; t++) { + /* Better not be there */ + p = (struct node *)rk_tfind((void *)t, (void **)&rootnode, + node_compare); + + if (p) { + warnx("erroneous list: found %d\n", p->order); + numerr++; + } + + /* Put node into the tree. */ + p = (struct node *) rk_tsearch((void *)t, (void **)&rootnode, + node_compare); + + if (!p) { + warnx("erroneous list: missing %d\n", t->order); + numerr++; + } + } + + rk_twalk(rootnode, list_node); + + for(t = tests; t->string; t++) { + /* Better be there */ + p = (struct node *) rk_tfind((void *)t, (void **)&rootnode, + node_compare); + + if (!p) { + warnx("erroneous list: missing %d\n", t->order); + numerr++; + } + + /* pull out node */ + (void) rk_tdelete((void *)t, (void **)&rootnode, + node_compare); + + /* Better not be there */ + p = (struct node *) rk_tfind((void *)t, (void **)&rootnode, + node_compare); + + if (p) { + warnx("erroneous list: found %d\n", p->order); + numerr++; + } + + } + + return numerr; +} diff --git a/crypto/heimdal/lib/roken/tsearch.c b/crypto/heimdal/lib/roken/tsearch.c --- a/crypto/heimdal/lib/roken/tsearch.c +++ b/crypto/heimdal/lib/roken/tsearch.c @@ -117,14 +117,13 @@ int (*compar)(const void *, const void *)) { node_t **rootp = (node_t **)vrootp; - node_t *p, *q, *r; + node_t *q, *r; int cmp; - if (rootp == NULL || (p = *rootp) == NULL) + if (rootp == NULL || *rootp == NULL) return NULL; while ((cmp = (*compar)(vkey, (*rootp)->key)) != 0) { - p = *rootp; rootp = (cmp < 0) ? &(*rootp)->llink : /* follow llink branch */ &(*rootp)->rlink; /* follow rlink branch */ @@ -148,7 +147,7 @@ } free(*rootp); /* D4: Free node */ *rootp = q; /* link parent to new node */ - return p; + return *rootp; } /* diff --git a/crypto/heimdal/lib/roken/version-script.map b/crypto/heimdal/lib/roken/version-script.map --- a/crypto/heimdal/lib/roken/version-script.map +++ b/crypto/heimdal/lib/roken/version-script.map @@ -2,8 +2,6 @@ global: arg_printusage; arg_printusage_i18n; - base64_decode; - base64_encode; cgetcap; cgetclose; cgetmatch; @@ -13,7 +11,6 @@ ct_memcmp; err; errx; - fbsd_ossl_provider_load; free_getarg_strings; get_default_username; get_window_size; @@ -37,13 +34,17 @@ print_units_table; rk_asnprintf; rk_asprintf; + rk_base64_decode; + rk_base64_encode; rk_bswap16; rk_bswap32; + rk_bswap64; rk_cgetent; rk_cgetstr; rk_cloexec; rk_cloexec_file; rk_cloexec_dir; + rk_cloexec_socket; rk_closefrom; rk_copyhostent; rk_dns_free_data; @@ -80,6 +81,8 @@ rk_inet_ntop; rk_inet_pton; rk_localtime_r; + rk_memset_s; + rk_mkdir; rk_mkstemp; rk_pid_file_delete; rk_pid_file_write; @@ -106,6 +109,7 @@ rk_socket_set_any; rk_socket_set_debug; rk_socket_set_ipv6only; + rk_socket_set_nonblocking; rk_socket_set_port; rk_socket_set_portrange; rk_socket_set_reuseaddr; @@ -125,6 +129,8 @@ rk_strsep_copy; rk_strsvis; rk_strsvisx; + rk_strtoll; + rk_strtoull; rk_strunvis; rk_strunvisx; rk_strupr; @@ -151,6 +157,8 @@ rk_warnerr; rk_xfree; roken_concat; + roken_detach_prep; + roken_detach_finish; roken_getaddrinfo_hostspec2; roken_getaddrinfo_hostspec; roken_gethostby_setup; diff --git a/crypto/heimdal/lib/roken/win32_alloc.c b/crypto/heimdal/lib/roken/win32_alloc.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/roken/win32_alloc.c @@ -0,0 +1,76 @@ +/*********************************************************************** + * Copyright (c) 2012, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ +#include +#include "roken.h" +#undef calloc +#undef malloc +#undef free +#undef strdup +#undef wcsdup + +/* + * Windows executables and dlls suffer when memory is + * allocated with one allocator and deallocated with + * another because each allocator is backed by a separate + * heap. Reduce the exposure by ensuring that all + * binaries that are built using roken will build against + * same allocator. + */ + +ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL +rk_calloc(size_t elements, size_t size) +{ + return calloc( elements, size); +} + +ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL +rk_free(void * ptr) +{ + free( ptr); +} + +ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL +rk_malloc(size_t size) +{ + return malloc( size); +} + +ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL +rk_strdup(const char *str) +{ + return strdup( str); +} + +ROKEN_LIB_FUNCTION unsigned short * ROKEN_LIB_CALL +rk_wcsdup(const unsigned short *str) +{ + return wcsdup( str); +} diff --git a/crypto/heimdal/lib/roken/write_pid.c b/crypto/heimdal/lib/roken/write_pid.c --- a/crypto/heimdal/lib/roken/write_pid.c +++ b/crypto/heimdal/lib/roken/write_pid.c @@ -35,56 +35,84 @@ #include "roken.h" +#ifdef HAVE_UTIL_H +#include +#endif + ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL -pid_file_write (const char *progname) +pid_file_write(const char *progname) { + const char *pidfile_dir = NULL; char *ret = NULL; FILE *fp; - if (asprintf (&ret, "%s%s.pid", _PATH_VARRUN, progname) < 0 || ret == NULL) + /* + * Maybe we could have a version of this function (and pidfile()) + * where we get a directory from the caller. That would allow us to + * have command-line options for the daemons for this. + * + * For now we use an environment variable. + */ + if (!issuid()) + pidfile_dir = getenv("HEIM_PIDFILE_DIR"); + if (pidfile_dir == NULL) + pidfile_dir = _PATH_VARRUN; + + if (asprintf(&ret, "%s%s.pid", pidfile_dir, progname) < 0 || ret == NULL) return NULL; - fp = fopen (ret, "w"); + fp = fopen(ret, "w"); if (fp == NULL) { - free (ret); + free(ret); return NULL; } - fprintf (fp, "%u", (unsigned)getpid()); - fclose (fp); + fprintf(fp, "%lu\n", (unsigned long)getpid()); + fclose(fp); return ret; } ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL -pid_file_delete (char **filename) +pid_file_delete(char **filename) { if (*filename != NULL) { - unlink (*filename); - free (*filename); + unlink(*filename); + free(*filename); *filename = NULL; } } -#ifndef HAVE_PIDFILE static char *pidfile_path; +static pid_t pidfile_pid; static void pidfile_cleanup(void) { - if(pidfile_path != NULL) + if (pidfile_path != NULL && pidfile_pid == getpid()) pid_file_delete(&pidfile_path); } ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL -pidfile(const char *basename) +rk_pidfile(const char *bname) { - if(pidfile_path != NULL) + /* + * If the OS has a pidfile(), call that, but still call + * pid_file_write(). Even if both want to write the same file, + * writing it twice will still work. + */ +#ifdef HAVE_PIDFILE + pidfile(bname); +#endif + + if (pidfile_path != NULL) return; - if(basename == NULL) - basename = getprogname(); - pidfile_path = pid_file_write(basename); + if (bname == NULL) + bname = getprogname(); + pidfile_path = pid_file_write(bname); + pidfile_pid = getpid(); #if defined(HAVE_ATEXIT) - atexit(pidfile_cleanup); + if (pidfile_path != NULL) + atexit(pidfile_cleanup); #elif defined(HAVE_ON_EXIT) - on_exit(pidfile_cleanup); + if (pidfile_path != NULL) + on_exit(pidfile_cleanup); #endif } -#endif diff --git a/crypto/heimdal/lib/sl/Makefile.am b/crypto/heimdal/lib/sl/Makefile.am --- a/crypto/heimdal/lib/sl/Makefile.am +++ b/crypto/heimdal/lib/sl/Makefile.am @@ -3,7 +3,7 @@ include $(top_srcdir)/Makefile.am.common if do_roken_rename -ES = strtok_r.c snprintf.c strdup.c strupr.c getprogname.c +ES = strtok_r.c snprintf.c strdup.c strupr.c endif AM_CPPFLAGS += $(ROKEN_RENAME) @@ -29,7 +29,7 @@ slc_SOURCES = slc-gram.y slc-lex.l slc.h -CLEANFILES = snprintf.c strtok_r.c strdup.c strupr.c getprogname.c slc-lex.c +CLEANFILES = snprintf.c strtok_r.c strdup.c strupr.c slc-lex.c LDADD = libsl.la $(LIB_roken) @@ -43,8 +43,6 @@ $(LN_S) $(srcdir)/../roken/strdup.c . strupr.c: $(LN_S) $(srcdir)/../roken/strupr.c . -getprogname.c: - $(LN_S) $(srcdir)/../roken/getprogname.c . slc-lex.c: slc-gram.h diff --git a/crypto/heimdal/lib/sl/Makefile.in b/crypto/heimdal/lib/sl/Makefile.in --- a/crypto/heimdal/lib/sl/Makefile.in +++ b/crypto/heimdal/lib/sl/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,10 +96,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog slc-gram.c \ - slc-gram.h slc-lex.c TESTS = test_sl$(EXEEXT) check_PROGRAMS = $(am__EXEEXT_1) libexec_heimdal_PROGRAMS = slc$(EXEEXT) @@ -53,7 +103,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -64,8 +113,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -78,6 +126,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -97,10 +146,16 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__EXEEXT_1 = test_sl$(EXEEXT) +am__installdirs = "$(DESTDIR)$(libexec_heimdaldir)" \ + "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" +PROGRAMS = $(libexec_heimdal_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -122,20 +177,26 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" \ - "$(DESTDIR)$(libexec_heimdaldir)" "$(DESTDIR)$(includedir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) libsl_la_DEPENDENCIES = dist_libsl_la_OBJECTS = sl.lo @do_roken_rename_TRUE@am__objects_1 = strtok_r.lo snprintf.lo \ -@do_roken_rename_TRUE@ strdup.lo strupr.lo getprogname.lo +@do_roken_rename_TRUE@ strdup.lo strupr.lo nodist_libsl_la_OBJECTS = $(am__objects_1) libsl_la_OBJECTS = $(dist_libsl_la_OBJECTS) $(nodist_libsl_la_OBJECTS) -libsl_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(libsl_la_LDFLAGS) \ - $(LDFLAGS) -o $@ -am__EXEEXT_1 = test_sl$(EXEEXT) -PROGRAMS = $(libexec_heimdal_PROGRAMS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libsl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libsl_la_LDFLAGS) $(LDFLAGS) -o $@ am_slc_OBJECTS = slc-gram.$(OBJEXT) slc-lex.$(OBJEXT) slc_OBJECTS = $(am_slc_OBJECTS) am__DEPENDENCIES_1 = @@ -145,40 +206,278 @@ test_sl_OBJECTS = test_sl.$(OBJEXT) test_sl_LDADD = $(LDADD) test_sl_DEPENDENCIES = libsl.la $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/sl.Plo ./$(DEPDIR)/slc-gram.Po \ + ./$(DEPDIR)/slc-lex.Po ./$(DEPDIR)/snprintf.Plo \ + ./$(DEPDIR)/strdup.Plo ./$(DEPDIR)/strtok_r.Plo \ + ./$(DEPDIR)/strupr.Plo ./$(DEPDIR)/test_sl.Po 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || -LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -LTLEXCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(LEX) $(LFLAGS) $(AM_LFLAGS) +LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) +LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) +AM_V_LEX = $(am__v_LEX_@AM_V@) +am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) +am__v_LEX_0 = @echo " LEX " $@; +am__v_LEX_1 = YLWRAP = $(top_srcdir)/ylwrap @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || -YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) -LTYACCCOMPILE = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=compile $(YACC) $(YFLAGS) $(AM_YFLAGS) +am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ + -e s/c++$$/h++/ -e s/c$$/h/ +YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) +LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) +AM_V_YACC = $(am__v_YACC_@AM_V@) +am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) +am__v_YACC_0 = @echo " YACC " $@; +am__v_YACC_1 = SOURCES = $(dist_libsl_la_SOURCES) $(nodist_libsl_la_SOURCES) \ $(slc_SOURCES) test_sl.c DIST_SOURCES = $(dist_libsl_la_SOURCES) $(slc_SOURCES) test_sl.c +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) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver $(top_srcdir)/ylwrap ChangeLog \ + slc-gram.c slc-gram.h slc-lex.c DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -193,16 +492,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -212,17 +514,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -241,12 +545,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -255,6 +556,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -271,10 +573,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -282,6 +582,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -296,12 +597,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -318,10 +622,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -332,13 +642,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = -d abs_builddir = @abs_builddir@ @@ -362,6 +666,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -385,9 +691,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -397,30 +708,38 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) $(ROKEN_RENAME) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la -@do_roken_rename_TRUE@ES = strtok_r.c snprintf.c strdup.c strupr.c getprogname.c + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +@do_roken_rename_TRUE@ES = strtok_r.c snprintf.c strdup.c strupr.c include_HEADERS = sl.h lib_LTLIBRARIES = libsl.la libsl_la_LDFLAGS = -version-info 2:1:2 @@ -428,14 +747,14 @@ dist_libsl_la_SOURCES = sl_locl.h sl.c roken_rename.h nodist_libsl_la_SOURCES = $(ES) slc_SOURCES = slc-gram.y slc-lex.l slc.h -CLEANFILES = snprintf.c strtok_r.c strdup.c strupr.c getprogname.c slc-lex.c +CLEANFILES = snprintf.c strtok_r.c strdup.c strupr.c slc-lex.c LDADD = libsl.la $(LIB_roken) slc_LDADD = $(LEXLIB) $(LDADD) EXTRA_DIST = NTMakefile all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .l .lo .o .obj .y +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .l .lo .log .o .obj .test .test$(EXEEXT) .trs .y $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -448,15 +767,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/sl/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/sl/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -466,39 +785,6 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libsl.la: $(libsl_la_OBJECTS) $(libsl_la_DEPENDENCIES) - $(libsl_la_LINK) -rpath $(libdir) $(libsl_la_OBJECTS) $(libsl_la_LIBADD) $(LIBS) clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ @@ -510,14 +796,19 @@ rm -f $$list install-libexec_heimdalPROGRAMS: $(libexec_heimdal_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(libexec_heimdaldir)" || $(MKDIR_P) "$(DESTDIR)$(libexec_heimdaldir)" @list='$(libexec_heimdal_PROGRAMS)'; test -n "$(libexec_heimdaldir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libexec_heimdaldir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libexec_heimdaldir)" || 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; \ + 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|.*|.|' \ + 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 } \ @@ -538,7 +829,8 @@ @list='$(libexec_heimdal_PROGRAMS)'; test -n "$(libexec_heimdaldir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ - -e 's/$$/$(EXEEXT)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(libexec_heimdaldir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libexec_heimdaldir)" && rm -f $$files @@ -551,17 +843,55 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list + +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}; \ + } + +libsl.la: $(libsl_la_OBJECTS) $(libsl_la_DEPENDENCIES) $(EXTRA_libsl_la_DEPENDENCIES) + $(AM_V_CCLD)$(libsl_la_LINK) -rpath $(libdir) $(libsl_la_OBJECTS) $(libsl_la_LIBADD) $(LIBS) slc-gram.h: slc-gram.c - @if test ! -f $@; then \ - rm -f slc-gram.c; \ - $(MAKE) $(AM_MAKEFLAGS) slc-gram.c; \ - else :; fi -slc$(EXEEXT): $(slc_OBJECTS) $(slc_DEPENDENCIES) + @if test ! -f $@; then rm -f slc-gram.c; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) slc-gram.c; else :; fi + +slc$(EXEEXT): $(slc_OBJECTS) $(slc_DEPENDENCIES) $(EXTRA_slc_DEPENDENCIES) @rm -f slc$(EXEEXT) - $(LINK) $(slc_OBJECTS) $(slc_LDADD) $(LIBS) -test_sl$(EXEEXT): $(test_sl_OBJECTS) $(test_sl_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(slc_OBJECTS) $(slc_LDADD) $(LIBS) + +test_sl$(EXEEXT): $(test_sl_OBJECTS) $(test_sl_DEPENDENCIES) $(EXTRA_test_sl_DEPENDENCIES) @rm -f test_sl$(EXEEXT) - $(LINK) $(test_sl_OBJECTS) $(test_sl_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_sl_OBJECTS) $(test_sl_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -569,42 +899,47 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getprogname.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sl.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slc-gram.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slc-lex.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strupr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sl.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sl.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slc-gram.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/slc-lex.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snprintf.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strdup.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strtok_r.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strupr.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_sl.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .l.c: - $(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: - $(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE) + $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo @@ -613,8 +948,11 @@ -rm -rf .libs _libs install-includeHEADERS: $(include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @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"; \ @@ -628,30 +966,17 @@ @$(NORMAL_UNINSTALL) @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -663,15 +988,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -680,103 +1001,191 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ - else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ - fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - skipped="($$skip tests were not run)"; \ + color_start= color_end=; \ fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test_sl.log: test_sl$(EXEEXT) + @p='test_sl$(EXEEXT)'; \ + b='test_sl'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -813,9 +1222,13 @@ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local +install-checkPROGRAMS: install-libLTLIBRARIES + +install-libexecheimdalPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexec_heimdaldir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(libexec_heimdaldir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am @@ -828,11 +1241,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -853,7 +1274,14 @@ clean-libexec_heimdalPROGRAMS clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/sl.Plo + -rm -f ./$(DEPDIR)/slc-gram.Po + -rm -f ./$(DEPDIR)/slc-lex.Po + -rm -f ./$(DEPDIR)/snprintf.Plo + -rm -f ./$(DEPDIR)/strdup.Plo + -rm -f ./$(DEPDIR)/strtok_r.Plo + -rm -f ./$(DEPDIR)/strupr.Plo + -rm -f ./$(DEPDIR)/test_sl.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -877,10 +1305,9 @@ install-dvi-am: -install-exec-am: install-libLTLIBRARIES \ +install-exec-am: install-exec-local install-libLTLIBRARIES \ install-libexec_heimdalPROGRAMS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook + install-html: install-html-am install-html-am: @@ -902,7 +1329,14 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/sl.Plo + -rm -f ./$(DEPDIR)/slc-gram.Po + -rm -f ./$(DEPDIR)/slc-lex.Po + -rm -f ./$(DEPDIR)/snprintf.Plo + -rm -f ./$(DEPDIR)/strdup.Plo + -rm -f ./$(DEPDIR)/strtok_r.Plo + -rm -f ./$(DEPDIR)/strupr.Plo + -rm -f ./$(DEPDIR)/test_sl.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -923,17 +1357,17 @@ uninstall-libexec_heimdalPROGRAMS @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-checkPROGRAMS clean-generic \ - clean-libLTLIBRARIES clean-libexec_heimdalPROGRAMS \ - clean-libtool ctags dist-hook distclean distclean-compile \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-checkPROGRAMS \ + clean-generic clean-libLTLIBRARIES \ + clean-libexec_heimdalPROGRAMS clean-libtool cscopelist-am \ + ctags ctags-am dist-hook 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-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ + install-dvi-am install-exec install-exec-am install-exec-local \ install-html install-html-am install-includeHEADERS \ install-info install-info-am install-libLTLIBRARIES \ install-libexec_heimdalPROGRAMS install-man install-pdf \ @@ -941,25 +1375,39 @@ 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-hook \ + recheck tags tags-am uninstall uninstall-am uninstall-hook \ uninstall-includeHEADERS uninstall-libLTLIBRARIES \ uninstall-libexec_heimdalPROGRAMS +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -967,7 +1415,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1012,11 +1460,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1024,6 +1481,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1066,6 +1525,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1079,13 +1551,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -1124,8 +1596,6 @@ $(LN_S) $(srcdir)/../roken/strdup.c . strupr.c: $(LN_S) $(srcdir)/../roken/strupr.c . -getprogname.c: - $(LN_S) $(srcdir)/../roken/getprogname.c . slc-lex.c: slc-gram.h diff --git a/crypto/heimdal/lib/sl/NTMakefile b/crypto/heimdal/lib/sl/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/sl/NTMakefile @@ -0,0 +1,74 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\sl + +!include ../../windows/NTMakefile.w32 + +INCFILES=$(INCDIR)\sl.h + +$(LIBSL): $(OBJ)\sl.obj + $(LIBCON) + +$(BINDIR)\slc.exe: $(OBJ)\slc-gram.obj $(OBJ)\slc-lex.obj + $(EXECONLINK) $(LIBROKEN) $(LIBVERS) + $(EXEPREP_NOHEIM) + +$(OBJ)\slc-gram.c: slc-gram.y + $(YACC) -o $@ --defines=$(@R).h slc-gram.y + +$(OBJ)\slc-gram.obj: $(OBJ)\slc-gram.c + $(C2OBJ) -I$(SRC)\$(RELDIR) + +$(OBJ)\slc-lex.c: slc-lex.l + $(LEX) -o$@ slc-lex.l + +$(OBJ)\slc-lex.obj: $(OBJ)\slc-lex.c + $(C2OBJ) -I$(SRC)\$(RELDIR) -DYY_NO_UNISTD_H + +$(OBJ)\test_sl.exe: $(OBJ)\test_sl.obj + $(EXECONLINK) $(LIBSL) $(LIBVERS) $(LIBROKEN) + $(EXEPREP_NODIST) + +all:: $(INCFILES) $(LIBSL) $(BINDIR)\slc.exe + +clean:: + -$(RM) $(LIBSL) + -$(RM) $(BINDIR)\slc.* + +test-binaries: $(OBJ)\test_sl.exe + +test-run: + cd $(OBJ) + -test_sl.exe + cd $(SRC)\$(RELDIR) + +test:: test-binaries test-run diff --git a/crypto/heimdal/lib/sl/sl.h b/crypto/heimdal/lib/sl/sl.h --- a/crypto/heimdal/lib/sl/sl.h +++ b/crypto/heimdal/lib/sl/sl.h @@ -61,6 +61,8 @@ void sl_apropos (SL_cmd *cmd, const char *topic); SL_cmd *sl_match (SL_cmd *cmds, char *cmd, int exactp); void sl_slc_help (SL_cmd *cmds, int argc, char **argv); +void sl_did_you_mean(SL_cmd *cmds, const char *match); + #ifdef __cplusplus } diff --git a/crypto/heimdal/lib/sl/sl.c b/crypto/heimdal/lib/sl/sl.c --- a/crypto/heimdal/lib/sl/sl.c +++ b/crypto/heimdal/lib/sl/sl.c @@ -53,8 +53,11 @@ t = time(NULL); strftime(timestr, sizeof(timestr), "%b %d, %Y", localtime(&t)); printf(".Dd %s\n", timestr); - p = strrchr(getprogname(), '/'); - if(p) p++; else p = getprogname(); +#ifdef HAVE_GETPROGNAME + p = getprogname(); +#else + p = "unknown-application"; +#endif strncpy(cmd, p, sizeof(cmd)); cmd[sizeof(cmd)-1] = '\0'; strupr(cmd); @@ -327,7 +330,7 @@ if (argc >= 1) { ret = sl_command(cmds, argc, argv); if(ret == -1) { - printf ("Unrecognized command: %s\n", argv[0]); + sl_did_you_mean(cmds, argv[0]); ret = 0; } } @@ -393,3 +396,104 @@ } } } + +/* OptimalStringAlignmentDistance */ + +static int +osad(const char *s1, const char *s2) +{ + size_t l1 = strlen(s1), l2 = strlen(s2), i, j; + int *row0, *row1, *row2, *tmp, cost; + + row0 = calloc(sizeof(int), l2 + 1); + row1 = calloc(sizeof(int), l2 + 1); + row2 = calloc(sizeof(int), l2 + 1); + + for (j = 0; j < l2 + 1; j++) + row1[j] = j; + + for (i = 0; i < l1; i++) { + + row2[0] = i + 1; + + for (j = 0; j < l2; j++) { + + row2[j + 1] = row1[j] + (s1[i] != s2[j]); /* substitute */ + + if (row2[j + 1] > row1[j + 1] + 1) /* delete */ + row2[j + 1] = row1[j + 1] + 1; + if (row2[j + 1] > row2[j] + 1) /* insert */ + row2[j + 1] = row2[j] + 1; + if (j > 0 && i > 0 && s1[i - 1] != s2[j - 1] && s1[i - 1] == s2[j] && s1[i] == s2[j - 1] && row2[j + 1] < row0[j - 1]) /* transposition */ + row2[j + 1] = row0[j - 1] + 1; + } + + tmp = row0; + row0 = row1; + row1 = row2; + row2 = tmp; + } + + cost = row1[l2]; + + free(row0); + free(row1); + free(row2); + + return cost; +} + +/** + * Will propose a list of command that are almost matching the command + * used, if there is no matching, will ask the user to use "help". + * + * @param cmds command array to use for matching + * @param match the command that didn't exists + */ + +void +sl_did_you_mean(SL_cmd *cmds, const char *match) +{ + int *metrics, best_match = INT_MAX; + SL_cmd *c; + size_t n; + + for (n = 0, c = cmds; c->name; c++, n++) + ; + if (n == 0) + return; + metrics = calloc(n, sizeof(metrics[0])); + if (metrics == NULL) + return; + + for (n = 0; cmds[n].name; n++) { + metrics[n] = osad(match, cmds[n].name); + if (metrics[n] < best_match) + best_match = metrics[n]; + } + if (best_match == INT_MAX) { + free(metrics); + fprintf(stderr, "What kind of command is %s", match); + return; + } + + /* if match distance is low, propose that for the user */ + if (best_match < 7) { + + fprintf(stderr, "error: %s is not a known command, did you mean ?\n", match); + for (n = 0; cmds[n].name; n++) { + if (metrics[n] == best_match) { + fprintf(stderr, "\t%s\n", cmds[n].name); + } + } + fprintf(stderr, "\n"); + + } else { + + fprintf(stderr, "error: %s is not a command, use \"help\" for more list of commands.\n", match); + } + + free(metrics); + + return; +} diff --git a/crypto/heimdal/lib/sl/slc-gram.h b/crypto/heimdal/lib/sl/slc-gram.h --- a/crypto/heimdal/lib/sl/slc-gram.h +++ b/crypto/heimdal/lib/sl/slc-gram.h @@ -1,14 +1,14 @@ -/* A Bison parser, made by GNU Bison 2.3. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ -/* Skeleton interface for Bison's Yacc-like parsers in C +/* Bison interface for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. - This program is free software; you can redistribute it and/or modify + 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. + 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 @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -33,37 +31,64 @@ This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ -/* Tokens. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + +#ifndef YY_YY_SLC_GRAM_H_INCLUDED +# define YY_YY_SLC_GRAM_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int yydebug; +#endif + +/* Token kinds. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - LITERAL = 258, - STRING = 259 - }; + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + LITERAL = 258, /* LITERAL */ + STRING = 259 /* STRING */ + }; + typedef enum yytokentype yytoken_kind_t; #endif -/* Tokens. */ +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 #define LITERAL 258 #define STRING 259 - - - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 57 "slc-gram.y" +union YYSTYPE { +#line 57 "slc-gram.y" + char *string; struct assignment *assignment; -} -/* Line 1529 of yacc.c. */ -#line 62 "slc-gram.h" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 + +#line 80 "slc-gram.h" + +}; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 #endif + extern YYSTYPE yylval; + +int yyparse (void); + + +#endif /* !YY_YY_SLC_GRAM_H_INCLUDED */ diff --git a/crypto/heimdal/lib/sl/slc-gram.c b/crypto/heimdal/lib/sl/slc-gram.c --- a/crypto/heimdal/lib/sl/slc-gram.c +++ b/crypto/heimdal/lib/sl/slc-gram.c @@ -1,14 +1,14 @@ -/* A Bison parser, made by GNU Bison 2.3. */ +/* A Bison parser, made by GNU Bison 3.8.2. */ -/* Skeleton implementation for Bison's Yacc-like parsers in C +/* Bison implementation for Yacc-like parsers in C - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation, + Inc. - This program is free software; you can redistribute it and/or modify + 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. + 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 @@ -16,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ /* As a special exception, you may create a larger work that contains part or all of the Bison parser skeleton and distribute that work @@ -36,6 +34,10 @@ /* C LALR(1) parser skeleton written by Richard Stallman, by simplifying the original so-called "semantic" parser. */ +/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual, + especially those whose name start with YY_ or yy_. They are + private implementation details that can be changed or removed. */ + /* All symbols defined below should begin with yy or YY, to avoid infringing on user name space. This should be done even for local variables, as they might otherwise be expanded by user macros. @@ -43,11 +45,11 @@ define necessary library symbols; they are noted "INFRINGES ON USER NAME SPACE" below. */ -/* Identify Bison output. */ -#define YYBISON 1 +/* Identify Bison output, and Bison version. */ +#define YYBISON 30802 -/* Bison version. */ -#define YYBISON_VERSION "2.3" +/* Bison version string. */ +#define YYBISON_VERSION "3.8.2" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -55,29 +57,16 @@ /* Pure parsers. */ #define YYPURE 0 -/* Using locations. */ -#define YYLSP_NEEDED 0 +/* Push parsers. */ +#define YYPUSH 0 +/* Pull parsers. */ +#define YYPULL 1 -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - LITERAL = 258, - STRING = 259 - }; -#endif -/* Tokens. */ -#define LITERAL 258 -#define STRING 259 - - -/* Copy the first part of user declarations. */ +/* First part of user prologue. */ #line 1 "slc-gram.y" /* @@ -134,77 +123,195 @@ #define YYFREE free +#line 127 "slc-gram.c" -/* Enabling traces. */ +# ifndef YY_CAST +# ifdef __cplusplus +# define YY_CAST(Type, Val) static_cast (Val) +# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast (Val) +# else +# define YY_CAST(Type, Val) ((Type) (Val)) +# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val)) +# endif +# endif +# ifndef YY_NULLPTR +# if defined __cplusplus +# if 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# else +# define YY_NULLPTR ((void*)0) +# endif +# endif + +/* Use api.header.include to #include this header + instead of duplicating it here. */ +#ifndef YY_YY_SLC_GRAM_H_INCLUDED +# define YY_YY_SLC_GRAM_H_INCLUDED +/* Debug traces. */ #ifndef YYDEBUG # define YYDEBUG 0 #endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 +#if YYDEBUG +extern int yydebug; #endif -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 +/* Token kinds. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + YYEMPTY = -2, + YYEOF = 0, /* "end of file" */ + YYerror = 256, /* error */ + YYUNDEF = 257, /* "invalid token" */ + LITERAL = 258, /* LITERAL */ + STRING = 259 /* STRING */ + }; + typedef enum yytokentype yytoken_kind_t; #endif +/* Token kinds. */ +#define YYEMPTY -2 +#define YYEOF 0 +#define YYerror 256 +#define YYUNDEF 257 +#define LITERAL 258 +#define STRING 259 +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -#line 57 "slc-gram.y" +union YYSTYPE { +#line 57 "slc-gram.y" + char *string; struct assignment *assignment; -} -/* Line 193 of yacc.c. */ -#line 165 "slc-gram.c" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 + +#line 193 "slc-gram.c" + +}; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 #endif +extern YYSTYPE yylval; + + +int yyparse (void); + + +#endif /* !YY_YY_SLC_GRAM_H_INCLUDED */ +/* Symbol kind. */ +enum yysymbol_kind_t +{ + YYSYMBOL_YYEMPTY = -2, + YYSYMBOL_YYEOF = 0, /* "end of file" */ + YYSYMBOL_YYerror = 1, /* error */ + YYSYMBOL_YYUNDEF = 2, /* "invalid token" */ + YYSYMBOL_LITERAL = 3, /* LITERAL */ + YYSYMBOL_STRING = 4, /* STRING */ + YYSYMBOL_5_ = 5, /* '=' */ + YYSYMBOL_6_ = 6, /* '{' */ + YYSYMBOL_7_ = 7, /* '}' */ + YYSYMBOL_YYACCEPT = 8, /* $accept */ + YYSYMBOL_start = 9, /* start */ + YYSYMBOL_assignments = 10, /* assignments */ + YYSYMBOL_assignment = 11 /* assignment */ +}; +typedef enum yysymbol_kind_t yysymbol_kind_t; -/* Copy the second part of user declarations. */ -/* Line 216 of yacc.c. */ -#line 178 "slc-gram.c" #ifdef short # undef short #endif -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; +/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure + and (if available) are included + so that the code can choose integer types of a good width. */ + +#ifndef __PTRDIFF_MAX__ +# include /* INFRINGES ON USER NAME SPACE */ +# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_STDINT_H +# endif #endif -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +/* Narrow types that promote to a signed type and that can represent a + signed or unsigned integer of at least N bits. In tables they can + save space and decrease cache pressure. Promoting to a signed type + helps avoid bugs in integer arithmetic. */ + +#ifdef __INT_LEAST8_MAX__ +typedef __INT_LEAST8_TYPE__ yytype_int8; +#elif defined YY_STDINT_H +typedef int_least8_t yytype_int8; +#else typedef signed char yytype_int8; +#endif + +#ifdef __INT_LEAST16_MAX__ +typedef __INT_LEAST16_TYPE__ yytype_int16; +#elif defined YY_STDINT_H +typedef int_least16_t yytype_int16; #else -typedef short int yytype_int8; +typedef short yytype_int16; #endif -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; +/* Work around bug in HP-UX 11.23, which defines these macros + incorrectly for preprocessor constants. This workaround can likely + be removed in 2023, as HPE has promised support for HP-UX 11.23 + (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of + . */ +#ifdef __hpux +# undef UINT_LEAST8_MAX +# undef UINT_LEAST16_MAX +# define UINT_LEAST8_MAX 255 +# define UINT_LEAST16_MAX 65535 +#endif + +#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST8_TYPE__ yytype_uint8; +#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST8_MAX <= INT_MAX) +typedef uint_least8_t yytype_uint8; +#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX +typedef unsigned char yytype_uint8; #else -typedef unsigned short int yytype_uint16; +typedef short yytype_uint8; #endif -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; +#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__ +typedef __UINT_LEAST16_TYPE__ yytype_uint16; +#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \ + && UINT_LEAST16_MAX <= INT_MAX) +typedef uint_least16_t yytype_uint16; +#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX +typedef unsigned short yytype_uint16; #else -typedef short int yytype_int16; +typedef int yytype_uint16; +#endif + +#ifndef YYPTRDIFF_T +# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__ +# define YYPTRDIFF_T __PTRDIFF_TYPE__ +# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__ +# elif defined PTRDIFF_MAX +# ifndef ptrdiff_t +# include /* INFRINGES ON USER NAME SPACE */ +# endif +# define YYPTRDIFF_T ptrdiff_t +# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX +# else +# define YYPTRDIFF_T long +# define YYPTRDIFF_MAXIMUM LONG_MAX +# endif #endif #ifndef YYSIZE_T @@ -212,55 +319,106 @@ # define YYSIZE_T __SIZE_TYPE__ # elif defined size_t # define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__ # include /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else -# define YYSIZE_T unsigned int +# define YYSIZE_T unsigned # endif #endif -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) +#define YYSIZE_MAXIMUM \ + YY_CAST (YYPTRDIFF_T, \ + (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \ + ? YYPTRDIFF_MAXIMUM \ + : YY_CAST (YYSIZE_T, -1))) + +#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X)) + + +/* Stored state numbers (used for stacks). */ +typedef yytype_int8 yy_state_t; + +/* State numbers in computations. */ +typedef int yy_state_fast_t; #ifndef YY_ # if defined YYENABLE_NLS && YYENABLE_NLS # if ENABLE_NLS # include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) # endif # endif # ifndef YY_ -# define YY_(msgid) msgid +# define YY_(Msgid) Msgid +# endif +#endif + + +#ifndef YY_ATTRIBUTE_PURE +# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__)) +# else +# define YY_ATTRIBUTE_PURE +# endif +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__) +# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +# else +# define YY_ATTRIBUTE_UNUSED # endif #endif /* Suppress unused-variable warnings by "using" E. */ #if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) +# define YY_USE(E) ((void) (E)) #else -# define YYUSE(e) /* empty */ +# define YY_USE(E) /* empty */ #endif -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +#if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__ +# if __GNUC__ * 100 + __GNUC_MINOR__ < 407 +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") +# else +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# endif +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") #else -static int -YYID (i) - int i; +# define YY_INITIAL_VALUE(Value) Value #endif -{ - return i; -} +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END #endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + +#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__ +# define YY_IGNORE_USELESS_CAST_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"") +# define YY_IGNORE_USELESS_CAST_END \ + _Pragma ("GCC diagnostic pop") +#endif +#ifndef YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_BEGIN +# define YY_IGNORE_USELESS_CAST_END +#endif + -#if ! defined yyoverflow || YYERROR_VERBOSE +#define YY_ASSERT(E) ((void) (0 && (E))) + +#if !defined yyoverflow /* The parser invokes alloca or malloc; define the necessary symbols. */ @@ -277,11 +435,11 @@ # define alloca _alloca # else # define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # endif @@ -289,8 +447,8 @@ # endif # ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, and a page size can be as small as 4096 bytes. So we cannot safely @@ -304,88 +462,89 @@ # ifndef YYSTACK_ALLOC_MAXIMUM # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM # endif -# if (defined __cplusplus && ! defined _STDLIB_H \ +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) + && (defined YYFREE || defined free))) # include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 # endif # endif # ifndef YYMALLOC # define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined malloc && ! defined EXIT_SUCCESS void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) +# if ! defined free && ! defined EXIT_SUCCESS void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - +#endif /* !defined yyoverflow */ #if (! defined yyoverflow \ && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) /* A type that is properly aligned for any stack member. */ union yyalloc { - yytype_int16 yyss; - YYSTYPE yyvs; - }; + yy_state_t yyss_alloc; + YYSTYPE yyvs_alloc; +}; /* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) +# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1) /* The size of an array large to enough to hold all stacks, each with N elements. */ # define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \ + YYSTACK_GAP_MAXIMUM) -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif +# define YYCOPY_NEEDED 1 /* Relocate STACK from its old location to the new one. The local variables YYSIZE and YYSTACKSIZE give the old and new number of elements in the stack, and YYPTR gives the new location of the stack. Advance YYPTR to a properly aligned location for the next stack. */ -# define YYSTACK_RELOCATE(Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack, Stack, yysize); \ - Stack = &yyptr->Stack; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYPTRDIFF_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / YYSIZEOF (*yyptr); \ + } \ + while (0) #endif +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYPTRDIFF_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + /* YYFINAL -- State number of the termination state. */ #define YYFINAL 6 /* YYLAST -- Last index in YYTABLE. */ @@ -397,18 +556,23 @@ #define YYNNTS 4 /* YYNRULES -- Number of rules. */ #define YYNRULES 6 -/* YYNRULES -- Number of states. */ +/* YYNSTATES -- Number of states. */ #define YYNSTATES 12 -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 +/* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 259 -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = +/* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, with out-of-bounds checking. */ +#define YYTRANSLATE(YYX) \ + (0 <= (YYX) && (YYX) <= YYMAXUTOK \ + ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \ + : YYSYMBOL_YYUNDEF) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex. */ +static const yytype_int8 yytranslate[] = { 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -439,200 +603,143 @@ }; #if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 5, 8, 10, 14 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 9, 0, -1, 10, -1, 11, 10, -1, 11, -1, - 3, 5, 4, -1, 3, 5, 6, 10, 7, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint8 yyrline[] = +/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_int8 yyrline[] = { 0, 70, 70, 76, 81, 84, 93 }; #endif -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/** Accessing symbol of state STATE. */ +#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State]) + +#if YYDEBUG || 0 +/* The user-facing name of the symbol whose (internal) number is + YYSYMBOL. No bounds checking. */ +static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED; + /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ static const char *const yytname[] = { - "$end", "error", "$undefined", "LITERAL", "STRING", "'='", "'{'", "'}'", - "$accept", "start", "assignments", "assignment", 0 + "\"end of file\"", "error", "\"invalid token\"", "LITERAL", "STRING", + "'='", "'{'", "'}'", "$accept", "start", "assignments", "assignment", YY_NULLPTR }; -#endif -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = +static const char * +yysymbol_name (yysymbol_kind_t yysymbol) { - 0, 256, 257, 258, 259, 61, 123, 125 -}; -# endif + return yytname[yysymbol]; +} +#endif -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 8, 9, 10, 10, 11, 11 -}; +#define YYPACT_NINF (-5) -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 1, 2, 1, 3, 5 -}; +#define yypact_value_is_default(Yyn) \ + ((Yyn) == YYPACT_NINF) -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 0, 0, 0, 2, 4, 0, 1, 3, 5, 0, - 0, 6 -}; +#define YYTABLE_NINF (-1) -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 2, 3, 4 -}; +#define yytable_value_is_error(Yyn) \ + 0 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -5 static const yytype_int8 yypact[] = { -1, 1, 4, -5, -1, -3, -5, -5, -5, -1, 0, -5 }; +/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_int8 yydefact[] = +{ + 0, 0, 0, 2, 4, 0, 1, 3, 5, 0, + 0, 6 +}; + /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { -5, -5, -4, -5 }; -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 -static const yytype_uint8 yytable[] = +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + 0, 2, 3, 4 +}; + +/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_int8 yytable[] = { 7, 8, 1, 9, 6, 10, 5, 11 }; -static const yytype_uint8 yycheck[] = +static const yytype_int8 yycheck[] = { 4, 4, 3, 6, 0, 9, 5, 7 }; -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = +/* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of + state STATE-NUM. */ +static const yytype_int8 yystos[] = { 0, 3, 9, 10, 11, 5, 0, 10, 4, 6, 10, 7 }; -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. */ +/* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr1[] = +{ + 0, 8, 9, 10, 10, 11, 11 +}; -#define YYFAIL goto yyerrlab +/* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ +static const yytype_int8 yyr2[] = +{ + 0, 2, 1, 2, 1, 3, 5 +}; -#define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif +enum { YYENOMEM = -2 }; +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab +#define YYNOMEM goto yyexhaustedlab -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif +#define YYRECOVERING() (!!yyerrstatus) -/* YYLEX -- calling `yylex' with the right arguments. */ +#define YYBACKUP(Token, Value) \ + do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ + while (0) + +/* Backward compatibility with an undocumented macro. + Use YYerror or YYUNDEF. */ +#define YYERRCODE YYUNDEF -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif /* Enable debugging if requested. */ #if YYDEBUG @@ -642,80 +749,58 @@ # define YYFPRINTF fprintf # endif -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + + + + +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Kind, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*-----------------------------------. +| Print this symbol's value on YYO. | +`-----------------------------------*/ + static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_value_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { + FILE *yyoutput = yyo; + YY_USE (yyoutput); if (!yyvaluep) return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ +/*---------------------------. +| Print this symbol on YYO. | +`---------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif +yy_symbol_print (FILE *yyo, + yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep) { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + YYFPRINTF (yyo, "%s %s (", + yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind)); - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); + yy_symbol_value_print (yyo, yykind, yyvaluep); + YYFPRINTF (yyo, ")"); } /*------------------------------------------------------------------. @@ -723,80 +808,68 @@ | TOP (included). | `------------------------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) -#else -static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; -#endif +yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop) { YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } YYFPRINTF (stderr, "\n"); } -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif +yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, + int yyrule) { + int yylno = yyrline[yyrule]; int yynrhs = yyr2[yyrule]; int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); + YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n", + yyrule - 1, yylno); /* The symbols being reduced. */ for (yyi = 0; yyi < yynrhs; yyi++) { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - fprintf (stderr, "\n"); + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]), + &yyvsp[(yyi + 1) - (yynrhs)]); + YYFPRINTF (stderr, "\n"); } } -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule); \ +} while (0) /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ int yydebug; #else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YYDPRINTF(Args) ((void) 0) +# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) # define YY_STACK_PRINT(Bottom, Top) # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ /* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH +#ifndef YYINITDEPTH # define YYINITDEPTH 200 #endif @@ -811,478 +884,219 @@ # define YYMAXDEPTH 10000 #endif - -#if YYERROR_VERBOSE -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - while ((*yyd++ = *yys++) != '\0') - continue; - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif +yydestruct (const char *yymsg, + yysymbol_kind_t yykind, YYSTYPE *yyvaluep) { - YYUSE (yyvaluep); - + YY_USE (yyvaluep); if (!yymsg) yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp); - switch (yytype) - { - - default: - break; - } + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YY_USE (yykind); + YY_IGNORE_MAYBE_UNINITIALIZED_END } - - -/* Prevent warnings from -Wmissing-prototypes. */ - -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - -/* The look-ahead symbol. */ +/* Lookahead token kind. */ int yychar; -/* The semantic value of the look-ahead symbol. */ +/* The semantic value of the lookahead symbol. */ YYSTYPE yylval; - /* Number of syntax errors so far. */ int yynerrs; + /*----------. | yyparse. | `----------*/ -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) int yyparse (void) -#else -int -yyparse () - -#endif -#endif { - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ + yy_state_fast_t yystate = 0; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus = 0; - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; + /* Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; + /* Their size. */ + YYPTRDIFF_T yystacksize = YYINITDEPTH; + /* The state stack: array, bottom, top. */ + yy_state_t yyssa[YYINITDEPTH]; + yy_state_t *yyss = yyssa; + yy_state_t *yyssp = yyss; + /* The semantic value stack: array, bottom, top. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp = yyvs; -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - YYSIZE_T yystacksize = YYINITDEPTH; - + int yyn; + /* The return value of yyparse. */ + int yyresult; + /* Lookahead symbol kind. */ + yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY; /* The variables used to return semantic value and location from the action routines. */ YYSTYPE yyval; + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + /* The number of symbols on the RHS of the reduced rule. Keep to zero when no symbol should be popped. */ int yylen = 0; YYDPRINTF ((stderr, "Starting parse\n")); - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - - yyssp = yyss; - yyvsp = yyvs; + yychar = YYEMPTY; /* Cause a token to be read. */ goto yysetstate; + /*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | +| yynewstate -- push a new state, which is found in yystate. | `------------------------------------------------------------*/ - yynewstate: +yynewstate: /* In all cases, when you get here, the value and location stacks have just been pushed. So pushing a state here evens the stacks. */ yyssp++; - yysetstate: - *yyssp = yystate; + +/*--------------------------------------------------------------------. +| yysetstate -- set current state (the top of the stack) to yystate. | +`--------------------------------------------------------------------*/ +yysetstate: + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YY_ASSERT (0 <= yystate && yystate < YYNSTATES); + YY_IGNORE_USELESS_CAST_BEGIN + *yyssp = YY_CAST (yy_state_t, yystate); + YY_IGNORE_USELESS_CAST_END + YY_STACK_PRINT (yyss, yyssp); if (yyss + yystacksize - 1 <= yyssp) +#if !defined yyoverflow && !defined YYSTACK_RELOCATE + YYNOMEM; +#else { /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + YYPTRDIFF_T yysize = yyssp - yyss + 1; -#ifdef yyoverflow +# if defined yyoverflow { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + yy_state_t *yyss1 = yyss; + YYSTYPE *yyvs1 = yyvs; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * YYSIZEOF (*yyssp), + &yyvs1, yysize * YYSIZEOF (*yyvsp), + &yystacksize); + yyss = yyss1; + yyvs = yyvs1; } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else +# else /* defined YYSTACK_RELOCATE */ /* Extend the stack our own way. */ if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; + YYNOMEM; yystacksize *= 2; if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; + yystacksize = YYMAXDEPTH; { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - + yy_state_t *yyss1 = yyss; + union yyalloc *yyptr = + YY_CAST (union yyalloc *, + YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize)))); + if (! yyptr) + YYNOMEM; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); } # endif -#endif /* no yyoverflow */ yyssp = yyss + yysize - 1; yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + YY_IGNORE_USELESS_CAST_BEGIN + YYDPRINTF ((stderr, "Stack size increased to %ld\n", + YY_CAST (long, yystacksize))); + YY_IGNORE_USELESS_CAST_END if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + YYABORT; } +#endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; goto yybackup; + /*-----------. | yybackup. | `-----------*/ yybackup: - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ + lookahead token if we need one and don't already have one. */ - /* First try to decide what to do without reference to look-ahead token. */ + /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) + if (yypact_value_is_default (yyn)) goto yydefault; - /* Not known => get a look-ahead token if don't already have one. */ + /* Not known => get a lookahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */ if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; + YYDPRINTF ((stderr, "Reading a token\n")); + yychar = yylex (); } if (yychar <= YYEOF) { - yychar = yytoken = YYEOF; + yychar = YYEOF; + yytoken = YYSYMBOL_YYEOF; YYDPRINTF ((stderr, "Now at end of input.\n")); } + else if (yychar == YYerror) + { + /* The scanner already issued an error message, process directly + to error recovery. But do not keep the error token as + lookahead, it is too special and may lead us to an endless + loop in error recovery. */ + yychar = YYUNDEF; + yytoken = YYSYMBOL_YYerror; + goto yyerrlab1; + } else { yytoken = YYTRANSLATE (yychar); @@ -1297,30 +1111,26 @@ yyn = yytable[yyn]; if (yyn <= 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; + if (yytable_value_is_error (yyn)) + goto yyerrlab; yyn = -yyn; goto yyreduce; } - if (yyn == YYFINAL) - YYACCEPT; - /* Count tokens shifted since error; after three, turn off error status. */ if (yyerrstatus) yyerrstatus--; - /* Shift the look-ahead token. */ + /* Shift the lookahead token. */ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; - yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + /* Discard the shifted token. */ + yychar = YYEMPTY; goto yynewstate; @@ -1335,14 +1145,14 @@ /*-----------------------------. -| yyreduce -- Do a reduction. | +| yyreduce -- do a reduction. | `-----------------------------*/ yyreduce: /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. + '$$ = $1'. Otherwise, the following line sets YYVAL to garbage. This behavior is undocumented and Bison @@ -1355,141 +1165,120 @@ YY_REDUCE_PRINT (yyn); switch (yyn) { - case 2: + case 2: /* start: assignments */ #line 71 "slc-gram.y" - { - assignment = (yyvsp[(1) - (1)].assignment); + { + assignment = (yyvsp[0].assignment); } +#line 1174 "slc-gram.c" break; - case 3: + case 3: /* assignments: assignment assignments */ #line 77 "slc-gram.y" - { - (yyvsp[(1) - (2)].assignment)->next = (yyvsp[(2) - (2)].assignment); - (yyval.assignment) = (yyvsp[(1) - (2)].assignment); + { + (yyvsp[-1].assignment)->next = (yyvsp[0].assignment); + (yyval.assignment) = (yyvsp[-1].assignment); } +#line 1183 "slc-gram.c" break; - case 5: + case 5: /* assignment: LITERAL '=' STRING */ #line 85 "slc-gram.y" - { + { (yyval.assignment) = malloc(sizeof(*(yyval.assignment))); - (yyval.assignment)->name = (yyvsp[(1) - (3)].string); + (yyval.assignment)->name = (yyvsp[-2].string); (yyval.assignment)->type = a_value; (yyval.assignment)->lineno = lineno; - (yyval.assignment)->u.value = (yyvsp[(3) - (3)].string); + (yyval.assignment)->u.value = (yyvsp[0].string); (yyval.assignment)->next = NULL; } +#line 1196 "slc-gram.c" break; - case 6: + case 6: /* assignment: LITERAL '=' '{' assignments '}' */ #line 94 "slc-gram.y" - { + { (yyval.assignment) = malloc(sizeof(*(yyval.assignment))); - (yyval.assignment)->name = (yyvsp[(1) - (5)].string); + (yyval.assignment)->name = (yyvsp[-4].string); (yyval.assignment)->type = a_assignment; (yyval.assignment)->lineno = lineno; - (yyval.assignment)->u.assignment = (yyvsp[(4) - (5)].assignment); + (yyval.assignment)->u.assignment = (yyvsp[-1].assignment); (yyval.assignment)->next = NULL; } +#line 1209 "slc-gram.c" break; -/* Line 1267 of yacc.c. */ -#line 1400 "slc-gram.c" +#line 1213 "slc-gram.c" + default: break; } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc); YYPOPSTACK (yylen); yylen = 0; - YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state + /* Now 'shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; + { + const int yylhs = yyr1[yyn] - YYNTOKENS; + const int yyi = yypgoto[yylhs] + *yyssp; + yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp + ? yytable[yyi] + : yydefgoto[yylhs]); + } goto yynewstate; -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar); /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs; -#if ! YYERROR_VERBOSE yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif } - - if (yyerrstatus == 3) { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } + { + yydestruct ("Error: discarding", + yytoken, &yylval); + yychar = YYEMPTY; + } } - /* Else will try to reuse look-ahead token after shifting the error + /* Else will try to reuse lookahead token after shifting the error token. */ goto yyerrlab1; @@ -1498,14 +1287,13 @@ | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ + if (0) + YYERROR; + ++yynerrs; - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ YYPOPSTACK (yylen); yylen = 0; @@ -1518,42 +1306,42 @@ | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrstatus = 3; /* Each real token shifted decrements this. */ + /* Pop stack until we find a state that shifts the error token. */ for (;;) { yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } + if (!yypact_value_is_default (yyn)) + { + yyn += YYSYMBOL_YYerror; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) - YYABORT; + YYABORT; yydestruct ("Error: popping", - yystos[yystate], yyvsp); + YY_ACCESSING_SYMBOL (yystate), yyvsp); YYPOPSTACK (1); yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } - if (yyn == YYFINAL) - YYACCEPT; - + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp); yystate = yyn; goto yynewstate; @@ -1564,51 +1352,55 @@ `-------------------------------------*/ yyacceptlab: yyresult = 0; - goto yyreturn; + goto yyreturnlab; + /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ yyabortlab: yyresult = 1; - goto yyreturn; + goto yyreturnlab; -#ifndef yyoverflow -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ + +/*-----------------------------------------------------------. +| yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here. | +`-----------------------------------------------------------*/ yyexhaustedlab: yyerror (YY_("memory exhausted")); yyresult = 2; - /* Fall through. */ -#endif + goto yyreturnlab; + -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered +/*----------------------------------------------------------. +| yyreturnlab -- parsing is finished, clean up and return. | +`----------------------------------------------------------*/ +yyreturnlab: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + } + /* Do not reclaim the symbols of the rule whose action triggered this YYABORT or YYACCEPT. */ YYPOPSTACK (yylen); YY_STACK_PRINT (yyss, yyssp); while (yyssp != yyss) { yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); + YY_ACCESSING_SYMBOL (+*yyssp), yyvsp); YYPOPSTACK (1); } #ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss); #endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} + return yyresult; +} #line 104 "slc-gram.y" @@ -1838,6 +1630,7 @@ cprint(1, " { "); fprintf(cfile, "\"%s\", ", a->u.value); fprintf(cfile, "%s_wrap, ", f); + free(f); b = find(as, "argument"); if(b) fprintf(cfile, "\"%s %s\", ", a->u.value, b->u.value); @@ -1851,7 +1644,7 @@ fprintf(cfile, " },\n"); for(a = a->next; a != NULL; a = a->next) if(strcmp(a->name, "name") == 0) - cprint(1, " { \"%s\" },\n", a->u.value); + cprint(1, " { \"%s\", NULL, NULL, NULL },\n", a->u.value); cprint(0, "\n"); } @@ -1870,6 +1663,7 @@ struct assignment *lopt; struct assignment *type; char *s; + int ret; lopt = find(as, "long"); if(lopt == NULL) @@ -1879,9 +1673,11 @@ type = find(as, "type"); if(strcmp(type->u.value, "-flag") == 0) - asprintf(&s, "%s_flag", lopt->u.value); + ret = asprintf(&s, "%s_flag", lopt->u.value); else - asprintf(&s, "%s_%s", lopt->u.value, type->u.value); + ret = asprintf(&s, "%s_%s", lopt->u.value, type->u.value); + if (ret == -1) + return NULL; gen_name(s); return s; } @@ -1956,7 +1752,7 @@ defval_neg_flag, NULL }, - { NULL } + { NULL, NULL, NULL, NULL, NULL } }; static struct type_handler *find_handler(struct assignment *type) @@ -2220,7 +2016,7 @@ cprint(0, "SL_cmd commands[] = {\n"); for(a = as; a != NULL; a = a->next) gen_command(a->u.assignment); - cprint(1, "{ NULL }\n"); + cprint(1, "{ NULL, NULL, NULL, NULL }\n"); cprint(0, "};\n"); hprint(0, "extern SL_cmd commands[];\n"); @@ -2229,8 +2025,8 @@ int version_flag; int help_flag; struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; int num_args = sizeof(args) / sizeof(args[0]); @@ -2293,4 +2089,3 @@ fclose(yyin); return 0; } - diff --git a/crypto/heimdal/lib/sl/slc-gram.y b/crypto/heimdal/lib/sl/slc-gram.y --- a/crypto/heimdal/lib/sl/slc-gram.y +++ b/crypto/heimdal/lib/sl/slc-gram.y @@ -46,7 +46,6 @@ #include "slc.h" extern FILE *yyin; extern struct assignment *assignment; -extern int yyparse(void); /* Declarations for Bison: */ @@ -329,6 +328,7 @@ cprint(1, " { "); fprintf(cfile, "\"%s\", ", a->u.value); fprintf(cfile, "%s_wrap, ", f); + free(f); b = find(as, "argument"); if(b) fprintf(cfile, "\"%s %s\", ", a->u.value, b->u.value); @@ -342,7 +342,7 @@ fprintf(cfile, " },\n"); for(a = a->next; a != NULL; a = a->next) if(strcmp(a->name, "name") == 0) - cprint(1, " { \"%s\" },\n", a->u.value); + cprint(1, " { \"%s\", NULL, NULL, NULL },\n", a->u.value); cprint(0, "\n"); } @@ -361,6 +361,7 @@ struct assignment *lopt; struct assignment *type; char *s; + int ret; lopt = find(as, "long"); if(lopt == NULL) @@ -370,9 +371,11 @@ type = find(as, "type"); if(strcmp(type->u.value, "-flag") == 0) - asprintf(&s, "%s_flag", lopt->u.value); + ret = asprintf(&s, "%s_flag", lopt->u.value); else - asprintf(&s, "%s_%s", lopt->u.value, type->u.value); + ret = asprintf(&s, "%s_%s", lopt->u.value, type->u.value); + if (ret == -1) + return NULL; gen_name(s); return s; } @@ -447,7 +450,7 @@ defval_neg_flag, NULL }, - { NULL } + { NULL, NULL, NULL, NULL, NULL } }; static struct type_handler *find_handler(struct assignment *type) @@ -711,7 +714,7 @@ cprint(0, "SL_cmd commands[] = {\n"); for(a = as; a != NULL; a = a->next) gen_command(a->u.assignment); - cprint(1, "{ NULL }\n"); + cprint(1, "{ NULL, NULL, NULL, NULL }\n"); cprint(0, "};\n"); hprint(0, "extern SL_cmd commands[];\n"); @@ -720,8 +723,8 @@ int version_flag; int help_flag; struct getargs args[] = { - { "version", 0, arg_flag, &version_flag }, - { "help", 0, arg_flag, &help_flag } + { "version", 0, arg_flag, &version_flag, NULL, NULL }, + { "help", 0, arg_flag, &help_flag, NULL, NULL } }; int num_args = sizeof(args) / sizeof(args[0]); diff --git a/crypto/heimdal/lib/sl/slc-lex.c b/crypto/heimdal/lib/sl/slc-lex.c --- a/crypto/heimdal/lib/sl/slc-lex.c +++ b/crypto/heimdal/lib/sl/slc-lex.c @@ -1,5 +1,5 @@ -#line 3 "slc-lex.c" +#line 2 "slc-lex.c" #define YY_INT_ALIGNED short int @@ -7,8 +7,8 @@ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 -#define YY_FLEX_MINOR_VERSION 5 -#define YY_FLEX_SUBMINOR_VERSION 35 +#define YY_FLEX_MINOR_VERSION 6 +#define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif @@ -53,7 +53,6 @@ typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; -#endif /* ! C99 */ /* Limits of integral types. */ #ifndef INT8_MIN @@ -84,63 +83,61 @@ #define UINT32_MAX (4294967295U) #endif -#endif /* ! FLEXINT_H */ - -#ifdef __cplusplus - -/* The "const" storage-class-modifier is valid. */ -#define YY_USE_CONST - -#else /* ! __cplusplus */ +#ifndef SIZE_MAX +#define SIZE_MAX (~(size_t)0) +#endif -/* C99 requires __STDC__ to be defined as 1. */ -#if defined (__STDC__) +#endif /* ! C99 */ -#define YY_USE_CONST +#endif /* ! FLEXINT_H */ -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ +/* begin standard C++ headers. */ -#ifdef YY_USE_CONST +/* TODO: this is always defined, so inline it */ #define yyconst const + +#if defined(__GNUC__) && __GNUC__ >= 3 +#define yynoreturn __attribute__((__noreturn__)) #else -#define yyconst +#define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 -/* Promotes a possibly negative, possibly signed char to an unsigned - * integer for use as an array index. If the signed char is negative, - * we want to instead treat it as an 8-bit unsigned char, hence the - * double cast. +/* Promotes a possibly negative, possibly signed char to an + * integer in range [0..255] for use as an array index. */ -#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) +#define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN (yy_start) = 1 + 2 * - /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START (((yy_start) - 1) / 2) #define YYSTATE YY_START - /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) - /* Special action meaning "start processing a new file". */ -#define YY_NEW_FILE yyrestart(yyin ) - +#define YY_NEW_FILE yyrestart( yyin ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k. + * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. + * Ditto for the __ia64__ case accordingly. + */ +#define YY_BUF_SIZE 32768 +#else #define YY_BUF_SIZE 16384 +#endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. @@ -157,15 +154,16 @@ typedef size_t yy_size_t; #endif -extern yy_size_t yyleng; +extern int yyleng; extern FILE *yyin, *yyout; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 - + #define YY_LESS_LINENO(n) + #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ @@ -180,7 +178,6 @@ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) - #define unput(c) yyunput( c, (yytext_ptr) ) #ifndef YY_STRUCT_YY_BUFFER_STATE @@ -195,12 +192,12 @@ /* Size of input buffer in bytes, not including room for EOB * characters. */ - yy_size_t yy_buf_size; + int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ - yy_size_t yy_n_chars; + int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to @@ -223,7 +220,7 @@ int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ - + /* Whether to try to fill the input buffer when we reach the * end of it. */ @@ -251,7 +248,7 @@ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general @@ -262,7 +259,6 @@ #define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ : NULL) - /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ @@ -270,11 +266,11 @@ /* yy_hold_char holds the character lost when yytext is formed. */ static char yy_hold_char; -static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ -yy_size_t yyleng; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int yyleng; /* Points to current character in buffer. */ -static char *yy_c_buf_p = (char *) 0; +static char *yy_c_buf_p = NULL; static int yy_init = 0; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ @@ -283,82 +279,78 @@ */ static int yy_did_buffer_switch_on_eof; -void yyrestart (FILE *input_file ); -void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); -void yy_delete_buffer (YY_BUFFER_STATE b ); -void yy_flush_buffer (YY_BUFFER_STATE b ); -void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); -void yypop_buffer_state (void ); - -static void yyensure_buffer_stack (void ); -static void yy_load_buffer_state (void ); -static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); +void yyrestart ( FILE *input_file ); +void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size ); +void yy_delete_buffer ( YY_BUFFER_STATE b ); +void yy_flush_buffer ( YY_BUFFER_STATE b ); +void yypush_buffer_state ( YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state ( void ); -#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) +static void yyensure_buffer_stack ( void ); +static void yy_load_buffer_state ( void ); +static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file ); +#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER ) -YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); +YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size ); +YY_BUFFER_STATE yy_scan_string ( const char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len ); -void *yyalloc (yy_size_t ); -void *yyrealloc (void *,yy_size_t ); -void yyfree (void * ); +void *yyalloc ( yy_size_t ); +void *yyrealloc ( void *, yy_size_t ); +void yyfree ( void * ); #define yy_new_buffer yy_create_buffer - #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } - #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (); \ YY_CURRENT_BUFFER_LVALUE = \ - yy_create_buffer(yyin,YY_BUF_SIZE ); \ + yy_create_buffer( yyin, YY_BUF_SIZE ); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } - #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ +typedef flex_uint8_t YY_CHAR; -typedef unsigned char YY_CHAR; - -FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +FILE *yyin = NULL, *yyout = NULL; typedef int yy_state_type; extern int yylineno; - int yylineno = 1; extern char *yytext; +#ifdef yytext_ptr +#undef yytext_ptr +#endif #define yytext_ptr yytext -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); +static yy_state_type yy_get_previous_state ( void ); +static yy_state_type yy_try_NUL_trans ( yy_state_type current_state ); +static int yy_get_next_buffer ( void ); +static void yynoreturn yy_fatal_error ( const char* msg ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ (yytext_ptr) = yy_bp; \ - yyleng = (size_t) (yy_cp - yy_bp); \ + yyleng = (int) (yy_cp - yy_bp); \ (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; - #define YY_NUM_RULES 7 #define YY_END_OF_BUFFER 8 /* This struct is not used in this scanner, @@ -368,13 +360,13 @@ flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[14] = +static const flex_int16_t yy_accept[14] = { 0, 0, 0, 8, 7, 6, 3, 2, 7, 5, 1, 4, 1, 0 } ; -static yyconst flex_int32_t yy_ec[256] = +static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -406,31 +398,31 @@ 1, 1, 1, 1, 1 } ; -static yyconst flex_int32_t yy_meta[10] = +static const YY_CHAR yy_meta[10] = { 0, 1, 1, 1, 1, 1, 2, 1, 1, 2 } ; -static yyconst flex_int16_t yy_base[15] = +static const flex_int16_t yy_base[15] = { 0, 0, 0, 12, 13, 13, 13, 13, 6, 13, 0, 13, 0, 13, 8 } ; -static yyconst flex_int16_t yy_def[15] = +static const flex_int16_t yy_def[15] = { 0, 13, 1, 13, 13, 13, 13, 13, 13, 13, 14, 13, 14, 0, 13 } ; -static yyconst flex_int16_t yy_nxt[23] = +static const flex_int16_t yy_nxt[23] = { 0, 4, 5, 6, 7, 4, 4, 8, 9, 10, 12, 11, 13, 3, 13, 13, 13, 13, 13, 13, 13, 13, 13 } ; -static yyconst flex_int16_t yy_chk[23] = +static const flex_int16_t yy_chk[23] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 14, 8, 3, 13, 13, 13, 13, 13, 13, 13, 13, @@ -505,7 +497,8 @@ #undef ECHO -#line 509 "slc-lex.c" +#line 500 "slc-lex.c" +#line 501 "slc-lex.c" #define INITIAL 0 @@ -521,36 +514,36 @@ #define YY_EXTRA_TYPE void * #endif -static int yy_init_globals (void ); +static int yy_init_globals ( void ); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int yylex_destroy (void ); +int yylex_destroy ( void ); -int yyget_debug (void ); +int yyget_debug ( void ); -void yyset_debug (int debug_flag ); +void yyset_debug ( int debug_flag ); -YY_EXTRA_TYPE yyget_extra (void ); +YY_EXTRA_TYPE yyget_extra ( void ); -void yyset_extra (YY_EXTRA_TYPE user_defined ); +void yyset_extra ( YY_EXTRA_TYPE user_defined ); -FILE *yyget_in (void ); +FILE *yyget_in ( void ); -void yyset_in (FILE * in_str ); +void yyset_in ( FILE * _in_str ); -FILE *yyget_out (void ); +FILE *yyget_out ( void ); -void yyset_out (FILE * out_str ); +void yyset_out ( FILE * _out_str ); -yy_size_t yyget_leng (void ); + int yyget_leng ( void ); -char *yyget_text (void ); +char *yyget_text ( void ); -int yyget_lineno (void ); +int yyget_lineno ( void ); -void yyset_lineno (int line_number ); +void yyset_lineno ( int _line_number ); /* Macros after this point can all be overridden by user definitions in * section 1. @@ -558,33 +551,41 @@ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int yywrap (void ); +extern "C" int yywrap ( void ); #else -extern int yywrap (void ); +extern int yywrap ( void ); #endif #endif +#ifndef YY_NO_UNPUT + +#endif + #ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); +static void yy_flex_strncpy ( char *, const char *, int ); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); +static int yy_flex_strlen ( const char * ); #endif #ifndef YY_NO_INPUT - #ifdef __cplusplus -static int yyinput (void ); +static int yyinput ( void ); #else -static int input (void ); +static int input ( void ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE +#ifdef __ia64__ +/* On IA-64, the buffer size is 16k, not 8k */ +#define YY_READ_BUF_SIZE 16384 +#else #define YY_READ_BUF_SIZE 8192 +#endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ @@ -592,7 +593,7 @@ /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ -#define ECHO fwrite( yytext, yyleng, 1, yyout ) +#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, @@ -603,7 +604,7 @@ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ - yy_size_t n; \ + int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ @@ -616,7 +617,7 @@ else \ { \ errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ @@ -671,7 +672,7 @@ /* Code executed at the end of each rule. */ #ifndef YY_BREAK -#define YY_BREAK break; +#define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ @@ -681,14 +682,10 @@ */ YY_DECL { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; + yy_state_type yy_current_state; + char *yy_cp, *yy_bp; + int yy_act; -#line 58 "slc-lex.l" - -#line 691 "slc-lex.c" - if ( !(yy_init) ) { (yy_init) = 1; @@ -709,13 +706,18 @@ if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_load_buffer_state( ); + yy_load_buffer_state( ); } - while ( 1 ) /* loops until end-of-file is reached */ + { +#line 58 "slc-lex.l" + +#line 718 "slc-lex.c" + + while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = (yy_c_buf_p); @@ -731,7 +733,7 @@ yy_match: do { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -741,9 +743,9 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 14 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 13 ); @@ -809,7 +811,7 @@ #line 68 "slc-lex.l" ECHO; YY_BREAK -#line 813 "slc-lex.c" +#line 814 "slc-lex.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -887,7 +889,7 @@ { (yy_did_buffer_switch_on_eof) = 0; - if ( yywrap( ) ) + if ( yywrap( ) ) { /* Note: because we've taken care in * yy_get_next_buffer() to have set up @@ -940,6 +942,7 @@ "fatal flex scanner internal error--no action found" ); } /* end of action switch */ } /* end of scanning one token */ + } /* end of user's declarations */ } /* end of yylex */ /* yy_get_next_buffer - try to read in a new buffer @@ -951,9 +954,9 @@ */ static int yy_get_next_buffer (void) { - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; + char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + char *source = (yytext_ptr); + int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) @@ -982,7 +985,7 @@ /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -995,21 +998,21 @@ else { - yy_size_t num_to_read = + int num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; while ( num_to_read <= 0 ) { /* Not enough room in the buffer - grow it. */ /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); if ( b->yy_is_our_buffer ) { - yy_size_t new_size = b->yy_buf_size * 2; + int new_size = b->yy_buf_size * 2; if ( new_size <= 0 ) b->yy_buf_size += b->yy_buf_size / 8; @@ -1018,11 +1021,12 @@ b->yy_ch_buf = (char *) /* Include room in for 2 EOB chars. */ - yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + yyrealloc( (void *) b->yy_ch_buf, + (yy_size_t) (b->yy_buf_size + 2) ); } else /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; + b->yy_ch_buf = NULL; if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( @@ -1050,7 +1054,7 @@ if ( number_to_move == YY_MORE_ADJ ) { ret_val = EOB_ACT_END_OF_FILE; - yyrestart(yyin ); + yyrestart( yyin ); } else @@ -1064,12 +1068,15 @@ else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc( + (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size ); if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + /* "- 2" to take care of EOB's */ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2); } (yy_n_chars) += number_to_move; @@ -1085,14 +1092,14 @@ static yy_state_type yy_get_previous_state (void) { - register yy_state_type yy_current_state; - register char *yy_cp; + yy_state_type yy_current_state; + char *yy_cp; yy_current_state = (yy_start); for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -1102,9 +1109,9 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 14 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return yy_current_state; @@ -1117,10 +1124,10 @@ */ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) { - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); + int yy_is_jam; + char *yy_cp = (yy_c_buf_p); - register YY_CHAR yy_c = 1; + YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { (yy_last_accepting_state) = yy_current_state; @@ -1130,14 +1137,18 @@ { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 14 ) - yy_c = yy_meta[(unsigned int) yy_c]; + yy_c = yy_meta[yy_c]; } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 13); - return yy_is_jam ? 0 : yy_current_state; + return yy_is_jam ? 0 : yy_current_state; } +#ifndef YY_NO_UNPUT + +#endif + #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput (void) @@ -1162,7 +1173,7 @@ else { /* need more input */ - yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + int offset = (int) ((yy_c_buf_p) - (yytext_ptr)); ++(yy_c_buf_p); switch ( yy_get_next_buffer( ) ) @@ -1179,13 +1190,13 @@ */ /* Reset buffer status. */ - yyrestart(yyin ); + yyrestart( yyin ); /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: { - if ( yywrap( ) ) + if ( yywrap( ) ) return 0; if ( ! (yy_did_buffer_switch_on_eof) ) @@ -1223,11 +1234,11 @@ if ( ! YY_CURRENT_BUFFER ){ yyensure_buffer_stack (); YY_CURRENT_BUFFER_LVALUE = - yy_create_buffer(yyin,YY_BUF_SIZE ); + yy_create_buffer( yyin, YY_BUF_SIZE ); } - yy_init_buffer(YY_CURRENT_BUFFER,input_file ); - yy_load_buffer_state( ); + yy_init_buffer( YY_CURRENT_BUFFER, input_file ); + yy_load_buffer_state( ); } /** Switch to a different input buffer. @@ -1255,7 +1266,7 @@ } YY_CURRENT_BUFFER_LVALUE = new_buffer; - yy_load_buffer_state( ); + yy_load_buffer_state( ); /* We don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag @@ -1283,7 +1294,7 @@ { YY_BUFFER_STATE b; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); @@ -1292,13 +1303,13 @@ /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ - b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_is_our_buffer = 1; - yy_init_buffer(b,file ); + yy_init_buffer( b, file ); return b; } @@ -1317,15 +1328,11 @@ YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; if ( b->yy_is_our_buffer ) - yyfree((void *) b->yy_ch_buf ); + yyfree( (void *) b->yy_ch_buf ); - yyfree((void *) b ); + yyfree( (void *) b ); } -#ifndef __cplusplus -extern int isatty (int ); -#endif /* __cplusplus */ - /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a yyrestart() or at EOF. @@ -1335,7 +1342,7 @@ { int oerrno = errno; - yy_flush_buffer(b ); + yy_flush_buffer( b ); b->yy_input_file = file; b->yy_fill_buffer = 1; @@ -1378,7 +1385,7 @@ b->yy_buffer_status = YY_BUFFER_NEW; if ( b == YY_CURRENT_BUFFER ) - yy_load_buffer_state( ); + yy_load_buffer_state( ); } /** Pushes the new state onto the stack. The new state becomes @@ -1409,7 +1416,7 @@ YY_CURRENT_BUFFER_LVALUE = new_buffer; /* copied from yy_switch_to_buffer. */ - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } @@ -1428,7 +1435,7 @@ --(yy_buffer_stack_top); if (YY_CURRENT_BUFFER) { - yy_load_buffer_state( ); + yy_load_buffer_state( ); (yy_did_buffer_switch_on_eof) = 1; } } @@ -1446,15 +1453,15 @@ * scanner will even need a stack. We use 2 instead of 1 to avoid an * immediate realloc on the next call. */ - num_to_alloc = 1; + num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */ (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc (num_to_alloc * sizeof(struct yy_buffer_state*) ); if ( ! (yy_buffer_stack) ) YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); - + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - + (yy_buffer_stack_max) = num_to_alloc; (yy_buffer_stack_top) = 0; return; @@ -1463,7 +1470,7 @@ if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; + yy_size_t grow_size = 8 /* arbitrary grow size */; num_to_alloc = (yy_buffer_stack_max) + grow_size; (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc @@ -1483,7 +1490,7 @@ * @param base the character buffer * @param size the size in bytes of the character buffer * - * @return the newly allocated buffer state object. + * @return the newly allocated buffer state object. */ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) { @@ -1493,23 +1500,23 @@ base[size-2] != YY_END_OF_BUFFER_CHAR || base[size-1] != YY_END_OF_BUFFER_CHAR ) /* They forgot to leave room for the EOB's. */ - return 0; + return NULL; - b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_size = (int) (size - 2); /* "- 2" to take care of EOB's */ b->yy_buf_pos = b->yy_ch_buf = base; b->yy_is_our_buffer = 0; - b->yy_input_file = 0; + b->yy_input_file = NULL; b->yy_n_chars = b->yy_buf_size; b->yy_is_interactive = 0; b->yy_at_bol = 1; b->yy_fill_buffer = 0; b->yy_buffer_status = YY_BUFFER_NEW; - yy_switch_to_buffer(b ); + yy_switch_to_buffer( b ); return b; } @@ -1522,28 +1529,29 @@ * @note If you want to scan bytes that may contain NUL values, then use * yy_scan_bytes() instead. */ -YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +YY_BUFFER_STATE yy_scan_string (const char * yystr ) { - return yy_scan_bytes(yystr,strlen(yystr) ); + return yy_scan_bytes( yystr, (int) strlen(yystr) ); } /** Setup the input buffer state to scan the given bytes. The next call to yylex() will * scan from a @e copy of @a bytes. - * @param bytes the byte buffer to scan - * @param len the number of bytes in the buffer pointed to by @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +YY_BUFFER_STATE yy_scan_bytes (const char * yybytes, int _yybytes_len ) { YY_BUFFER_STATE b; char *buf; - yy_size_t n, i; + yy_size_t n; + int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) yyalloc(n ); + n = (yy_size_t) (_yybytes_len + 2); + buf = (char *) yyalloc( n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); @@ -1552,7 +1560,7 @@ buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - b = yy_scan_buffer(buf,n ); + b = yy_scan_buffer( buf, n ); if ( ! b ) YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); @@ -1568,9 +1576,9 @@ #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) +static void yynoreturn yy_fatal_error (const char* msg ) { - (void) fprintf( stderr, "%s\n", msg ); + fprintf( stderr, "%s\n", msg ); exit( YY_EXIT_FAILURE ); } @@ -1598,7 +1606,7 @@ */ int yyget_lineno (void) { - + return yylineno; } @@ -1621,7 +1629,7 @@ /** Get the length of the current token. * */ -yy_size_t yyget_leng (void) +int yyget_leng (void) { return yyleng; } @@ -1636,29 +1644,29 @@ } /** Set the current line number. - * @param line_number + * @param _line_number line number * */ -void yyset_lineno (int line_number ) +void yyset_lineno (int _line_number ) { - yylineno = line_number; + yylineno = _line_number; } /** Set the input stream. This does not discard the current * input buffer. - * @param in_str A readable stream. + * @param _in_str A readable stream. * * @see yy_switch_to_buffer */ -void yyset_in (FILE * in_str ) +void yyset_in (FILE * _in_str ) { - yyin = in_str ; + yyin = _in_str ; } -void yyset_out (FILE * out_str ) +void yyset_out (FILE * _out_str ) { - yyout = out_str ; + yyout = _out_str ; } int yyget_debug (void) @@ -1666,9 +1674,9 @@ return yy_flex_debug; } -void yyset_debug (int bdebug ) +void yyset_debug (int _bdebug ) { - yy_flex_debug = bdebug ; + yy_flex_debug = _bdebug ; } static int yy_init_globals (void) @@ -1677,10 +1685,10 @@ * This function is called from yylex_destroy(), so don't allocate here. */ - (yy_buffer_stack) = 0; + (yy_buffer_stack) = NULL; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; - (yy_c_buf_p) = (char *) 0; + (yy_c_buf_p) = NULL; (yy_init) = 0; (yy_start) = 0; @@ -1689,8 +1697,8 @@ yyin = stdin; yyout = stdout; #else - yyin = (FILE *) 0; - yyout = (FILE *) 0; + yyin = NULL; + yyout = NULL; #endif /* For future reference: Set errno on error, since we are called by @@ -1705,7 +1713,7 @@ /* Pop the buffer stack, destroying each element. */ while(YY_CURRENT_BUFFER){ - yy_delete_buffer(YY_CURRENT_BUFFER ); + yy_delete_buffer( YY_CURRENT_BUFFER ); YY_CURRENT_BUFFER_LVALUE = NULL; yypop_buffer_state(); } @@ -1726,18 +1734,19 @@ */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +static void yy_flex_strncpy (char* s1, const char * s2, int n ) { - register int i; + + int i; for ( i = 0; i < n; ++i ) s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) +static int yy_flex_strlen (const char * s ) { - register int n; + int n; for ( n = 0; s[n]; ++n ) ; @@ -1747,11 +1756,12 @@ void *yyalloc (yy_size_t size ) { - return (void *) malloc( size ); + return malloc(size); } void *yyrealloc (void * ptr, yy_size_t size ) { + /* The cast to (char *) in the following accommodates both * implementations that use char* generic pointers, and those * that use void* generic pointers. It works with the latter @@ -1759,12 +1769,12 @@ * any pointer type to void*, and deal with argument conversions * as though doing an assignment. */ - return (void *) realloc( (char *) ptr, size ); + return realloc(ptr, size); } void yyfree (void * ptr ) { - free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" @@ -1772,7 +1782,6 @@ #line 68 "slc-lex.l" - void error_message (const char *format, ...) { diff --git a/crypto/heimdal/lib/sl/slc-lex.l b/crypto/heimdal/lib/sl/slc-lex.l --- a/crypto/heimdal/lib/sl/slc-lex.l +++ b/crypto/heimdal/lib/sl/slc-lex.l @@ -47,6 +47,8 @@ static void handle_comment(void); static char * handle_string(void); +#define YY_NO_UNPUT + #undef ECHO %} diff --git a/crypto/heimdal/lib/sqlite/Makefile.am b/crypto/heimdal/lib/sqlite/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/sqlite/Makefile.am @@ -0,0 +1,19 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +if ENABLE_PTHREAD_SUPPORT +AM_CPPFLAGS += -DSQLITE_THREADSAFE=1 -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 +endif + +AM_CFLAGS += -Wno-error + +lib_LTLIBRARIES = libheimsqlite.la + +noinst_HEADERS = sqlite3.h sqlite3ext.h + +libheimsqlite_la_SOURCES = sqlite3.c + +libheimsqlite_la_LIBADD = $(PTHREAD_LIBADD) + +EXTRA_DIST = NTMakefile diff --git a/crypto/heimdal/lib/sqlite/Makefile.in b/crypto/heimdal/lib/sqlite/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/sqlite/Makefile.in @@ -0,0 +1,1067 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@ENABLE_PTHREAD_SUPPORT_TRUE@am__append_1 = -DSQLITE_THREADSAFE=1 -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 +subdir = lib/sqlite +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ + $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +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)" +LTLIBRARIES = $(lib_LTLIBRARIES) +am__DEPENDENCIES_1 = +libheimsqlite_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libheimsqlite_la_OBJECTS = sqlite3.lo +libheimsqlite_la_OBJECTS = $(am_libheimsqlite_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/sqlite3.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libheimsqlite_la_SOURCES) +DIST_SOURCES = $(libheimsqlite_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) $(am__append_1) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) -Wno-error +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +lib_LTLIBRARIES = libheimsqlite.la +noinst_HEADERS = sqlite3.h sqlite3ext.h +libheimsqlite_la_SOURCES = sqlite3.c +libheimsqlite_la_LIBADD = $(PTHREAD_LIBADD) +EXTRA_DIST = NTMakefile +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 lib/sqlite/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign lib/sqlite/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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-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}; \ + } + +libheimsqlite.la: $(libheimsqlite_la_OBJECTS) $(libheimsqlite_la_DEPENDENCIES) $(EXTRA_libheimsqlite_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) -rpath $(libdir) $(libheimsqlite_la_OBJECTS) $(libheimsqlite_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sqlite3.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(HEADERS) all-local +installdirs: + for dir in "$(DESTDIR)$(libdir)"; 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 -f ./$(DEPDIR)/sqlite3.Plo + -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local 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 -f ./$(DEPDIR)/sqlite3.Plo + -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-libLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libLTLIBRARIES \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-local install-html \ + install-html-am 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 tags-am uninstall uninstall-am uninstall-hook \ + uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +# 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: diff --git a/crypto/heimdal/lib/sqlite/NTMakefile b/crypto/heimdal/lib/sqlite/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/sqlite/NTMakefile @@ -0,0 +1,52 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=lib\sqlite + +!include ../../windows/NTMakefile.w32 + +INCFILES= \ + $(INCDIR)\sqlite3.h \ + $(INCDIR)\sqlite3ext.h + +# pmode 0600 = _S_IREAD | _S_IWRITE +cdefines = $(cdefines) \ + -DSQLITE_DEFAULT_FILE_PERMISSIONS=0600 \ + -DSQLITE_THREADSAFE=1 + +$(LIBSQLITE): $(OBJ)\sqlite3.obj + $(LIBCON) + +all:: $(INCFILES) $(LIBSQLITE) + +clean:: + -$(RM) $(LIBSQLITE) + -$(RM) $(INCFILES) diff --git a/crypto/heimdal/lib/sqlite/README b/crypto/heimdal/lib/sqlite/README new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/sqlite/README @@ -0,0 +1,25 @@ + +This directory contains a copy of the SQLite3 amalgamation. + +In order to help update this copy to newer versions of SQLite3, please +make NO changes to it that are not absolutely necessary: + + - add no features that can't be added as loadable extensions or avoided + altogether + - fix no bugs that can't be worked around + - define macros via the Makefile as much as possible (-D...) rather + than via changes to the source + - fix absolutely no whitespace, formatting, or spelling errors + - fix no compiler warnings (the upstream community mostly doesn't care + to fix them) unless you're absolutely convinced that the warning(s) + represent a serious bug(s) that is relevant to Heimdal + +If you must make changes to this copy, DO: + + - have a commit just for those changes and no other changes outside + this part of the tree + + - provide enough information in the commit message that someone else + (or even yourself) can figure out whether and how to re-apply your + change years later when updating to a newer version of SQLite3 + diff --git a/crypto/heimdal/lib/sqlite/sqlite3.h b/crypto/heimdal/lib/sqlite/sqlite3.h new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/sqlite/sqlite3.h @@ -0,0 +1,10371 @@ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This header file defines the interface that the SQLite library +** presents to client programs. If a C-function, structure, datatype, +** or constant definition does not appear in this file, then it is +** not a published API of SQLite, is subject to change without +** notice, and should not be referenced by programs that use SQLite. +** +** Some of the definitions that are in this file are marked as +** "experimental". Experimental interfaces are normally new +** features recently added to SQLite. We do not anticipate changes +** to experimental interfaces but reserve the right to make minor changes +** if experience from use "in the wild" suggest such changes are prudent. +** +** The official C-language API documentation for SQLite is derived +** from comments in this file. This file is the authoritative source +** on how SQLite interfaces are supposed to operate. +** +** The name of this file under configuration management is "sqlite.h.in". +** The makefile makes some minor changes to this file (such as inserting +** the version number) and changes its name to "sqlite3.h" as +** part of the build process. +*/ +#ifndef SQLITE3_H +#define SQLITE3_H +#include /* Needed for the definition of va_list */ + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** Provide the ability to override linkage features of the interface. +*/ +#ifndef SQLITE_EXTERN +# define SQLITE_EXTERN extern +#endif +#ifndef SQLITE_API +# define SQLITE_API +#endif +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif + +/* +** These no-op macros are used in front of interfaces to mark those +** interfaces as either deprecated or experimental. New applications +** should not use deprecated interfaces - they are supported for backwards +** compatibility only. Application writers should be aware that +** experimental interfaces are subject to change in point releases. +** +** These macros used to resolve to various kinds of compiler magic that +** would generate warning messages when they were used. But that +** compiler magic ended up generating such a flurry of bug reports +** that we have taken it all out and gone back to using simple +** noop macros. +*/ +#define SQLITE_DEPRECATED +#define SQLITE_EXPERIMENTAL + +/* +** Ensure these symbols were not defined by some previous header file. +*/ +#ifdef SQLITE_VERSION +# undef SQLITE_VERSION +#endif +#ifdef SQLITE_VERSION_NUMBER +# undef SQLITE_VERSION_NUMBER +#endif + +/* +** CAPI3REF: Compile-Time Library Version Numbers +** +** ^(The [SQLITE_VERSION] C preprocessor macro in the sqlite3.h header +** evaluates to a string literal that is the SQLite version in the +** format "X.Y.Z" where X is the major version number (always 3 for +** SQLite3) and Y is the minor version number and Z is the release number.)^ +** ^(The [SQLITE_VERSION_NUMBER] C preprocessor macro resolves to an integer +** with the value (X*1000000 + Y*1000 + Z) where X, Y, and Z are the same +** numbers used in [SQLITE_VERSION].)^ +** The SQLITE_VERSION_NUMBER for any given release of SQLite will also +** be larger than the release from which it is derived. Either Y will +** be held constant and Z will be incremented or else Y will be incremented +** and Z will be reset to zero. +** +** Since [version 3.6.18] ([dateof:3.6.18]), +** SQLite source code has been stored in the +** Fossil configuration management +** system. ^The SQLITE_SOURCE_ID macro evaluates to +** a string which identifies a particular check-in of SQLite +** within its configuration management system. ^The SQLITE_SOURCE_ID +** string contains the date and time of the check-in (UTC) and an SHA1 +** hash of the entire source tree. +** +** See also: [sqlite3_libversion()], +** [sqlite3_libversion_number()], [sqlite3_sourceid()], +** [sqlite_version()] and [sqlite_source_id()]. +*/ +#define SQLITE_VERSION "3.15.1" +#define SQLITE_VERSION_NUMBER 3015001 +#define SQLITE_SOURCE_ID "2016-11-04 12:08:49 1136863c76576110e710dd5d69ab6bf347c65e36" + +/* +** CAPI3REF: Run-Time Library Version Numbers +** KEYWORDS: sqlite3_version, sqlite3_sourceid +** +** These interfaces provide the same information as the [SQLITE_VERSION], +** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros +** but are associated with the library instead of the header file. ^(Cautious +** programmers might include assert() statements in their application to +** verify that values returned by these interfaces match the macros in +** the header, and thus ensure that the application is +** compiled with matching library and header files. +** +**

    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
    485cm&rl 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

    k?m1L2?m#QZ%CO2n;WZ0!PjB-3)ykr5 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

    WffCUq4F%Hl?P{MiqoVWh_(>H5g)6h zGzg@|90{6uz;hUOt0V6!M9DtWtZ#0qw=YB_;^4NaAu~ZnlI!`r9V(MiUNi%s?B6g{ z%BPH436S|Nj*8!4E37?#{%-5_DNy=TJlL(@y=Sn2f=77Jae1Ml68q}he@yesFYp4n zw~39&;^7Ouen9g0TzTO}atNHg5I=>jXFi6pY`K5r>f0Cjpk z&9RY4S81Ae{fP&$i7mQgDBqx~p%J#t_E-iH`%#91cN1pz;rf$Si?YA#DK6jSSNQpJ zuB8>efR*8$;CJ%9?%0PFIMjFhV5f7a7taFb|^08lVagX?zj=gl^jwgSogZKe6PCoAa+Id}G(=$su0!RNyoi@7>W=yfz zMPf}$t+eX&3oF^SVFf6o7C6K8g;L5Y&C3};JTxh80w8aDaye8Zl@!T#3`-^iWj^~O zI%K!{L|La?v6j-Gt7ASuC$Lpu>ws%`HU9S({9iJRg0-(X$ z$=UZO!?%MH5&R=h+ku=GynnaN3uuLFxOrFhtf>w643;q6e`92(@}=R+PKHnho;J4+ zol)M_O=fXYQLWn9!D^Js$3+K`0>*1t+d<{hrW%&`n)ZrA<_Cw8@4cGQ;ze-*ITO6% zIFi{7VLM+rDSlfE*)2cVO6?2=aiOYaW?jN5wIi3r^8Q*o&%j64?4m##${=jt3pyf2 zYg?pOIvIG<@p?@icDkZKJCuRZsbVe8P;L~yPe`vb$|vV-o27hQfLgOkNTN;DPNQAf zbn$aOFtToLR&+RkirblCmXRB1t=u(kkN!+V??FZN0R?Z&&<+gMFT<36itks}$XQ)><`wPNv` zceOIMS#Bhn&_k(m~sRJCm5Kdc)#LaUCFj4 zWF#T3$|=9d*#-=^W#V%uF*X1#{fu7h2yqv5Le(0W|gatKt|IXdc#{vcN%@%n`j3i^?<*=CZ%;7OCx z_6~+GeB>~$x~`sgUOlR&cVSKR4vrx#;=87_*S6(b;RnWfqTi7?R<-|QXi9vuar zd4I*1ayY0&GpR;G4^+RQxEX&9qDJOvLK*-@0ATd}FUNEV-0&>J4FBL&mp#)n>!J)~ zwPpo2grRpMHI{_YbW|7HunscWTx!VJl$u#hoWMxzweJ@CG|Fh`kq96-4T+1m=}=rT}LR-i`zzsoSi zHo!jFJda|2NBpab5}A-tPMi$dM6`n!B6OV+9;5$^Fh_%OJHIBM6H<$FNpR0}u4}es z$FOgNe`AgM=oTRWa5ysnXG4%)JRG^(A|y2B7a`$df(dq37X6;XUPBEDEe}@Rj@dz| zNO(cG6#K=Qg{M+HGb{+E=azvcG)JKP2WXs7!J)Z3o(L2c7!9p7$v^HMJ+rqGj_DVV zGt_}%b#>e8lRJi0XrN1IbM+Yy)oo`Qa}W-Jh1Yap+Rycc*LC5e-NV;g+f+JL__5aw zds;S$s2sbE!5Th&!v*Cnl(7VjyD#A5t$O6O#L=q#(GL#2yUuiuxZcE#efOZVf z6pNKaDuU%Dd5&w76%|2hRpXzGONdlrD5V=Z(WEN?7U3_gCMYG1c+T7gPoOB~V= z3@p2VpaJkbp^M5L(6%~%?cfj?`2-zLy<-&Ip$-urmDI!WC)9kiGFt)pP|$EOYPKjC z!Fs4hH!h)UmUQD{_mkdTrmllQaWD$0c`1Vyj2<8Bl4HF1v}uNg2{5D&)sJ~Upe`26 z$4Oe#YEF5p;Mf>L+yOrW6pEFXy$?2n57a}&0r2q--qY&EA2ExOIp71lqB*XEGl{h! zn;{u3G9N9&EC=OsU6HHZ_5#+~oTsU6gdJ}n*g_plZdXTl(# z#R~|kCQFu?Xtx3VP^)H(s{ymr=iw(;3j^$H@3?rP>oVFd&&p^UROOZ@Sc0Gp+EJN< z2&9w@fes`tMv-E+b(>GOe6EtL=q$RyIu8W;8!bt>55{ZL5#U1%-WZ6Qp}3OF-NaSs zOoMGQZ;1-SWx_Dc<>Y51)!6hKxgg#$i@9gBUILM!pb+*Oy8s(u&*jPprpiVAv(&-<5dS8BU6(t$4Js%vqbiw#A9{jd0ZuZUI@tdua?VprpVMag_ zs6miEUX;~EZWu2Y%&x;ERjSl@x247x;)57gep+~Sjgl-PCtr@nzu_tL!I~+kvk`(%KXJO2kRBU0sHyu+ZjHi6NGB| z!7v-SY_V-|+~V^P%fr<(`_>h+p!?6wYE&=0^ld5&3Ay2}n4d%)KNW+n2yFgp4hW;w zek5AAh}(#u;q~`k(D68eYupqgGQ5p^pGTT!p z$f&GoshXut@MAmuT5eG?q_HAz<3l5O^-RG=5*xqisWC=|h>Rb*rfmXVkq z7td9Dc`=Rfxyy$&+@4jv!-xJzK$=8wxnWo&57t@+-hjUnRST@=yu4=`Fk;hJ&9(=eFG=9 zo}-(^%e7oB-T(||h8gBX|4ghAZA0|GN7a!e&`~MY?#}TjUZ(Z6OOey}R6 zq1ig5x8U*iln6(ax{AQCd8s0(j<HG?d!y2Xh6fRSy76r*-WqmMMjL2)gve&`c! zW-Me5{pEStJ%i!YbGb(yW|(es_m zuiVxgCeI0_xuR^`Xci(K#mj=u6i6CgEnupbdi&nuiKj6r*t#PqDI#9 ziyEn{rl_H9Z5u0CQ$`Trsi45Vr+W$UV{I>1u%;a1u(v5>UUSaLl~|z%A+u9KO>w?LL#@?YL7L+{guJlY|GGIetj$H<;MbSv z>nTrVSe&`gr}@FukSh>-jeD)bb$LtkX8!-n+(SVxK9iRzG)9-4D9XeLN7oKl2nITu zEUV>Xd@qcb?hZ#~p)0dEYt}$47do#O1WOT<4P32Raw`YKF;BzMHH~DJHxLhYUT#}% zG&@BOpZ6{|4ShcEP2(*O0k3nfZ{?Y1refhrVpG;!JQnwcnJYz`Ze(;Ru29~sDm+m~ z3_{+Jdl)IuJyouM1dzkFv;oYU|0K@{55Ogp_~rm@9=NfK(d2r?+EZ0Smw;YERgj*Z zeJ2F@);c(NSn4b+mcA!?C%I+uE8=xXGMo{nCDPe%{VbiANON5aj_ilA3h?Ev5HP&v zVATZ%_>=~dOXFmnZOs5Jh6Y@13*Wxw_Ph4gP|9S8X*FLgE(fQXk` zme=qyh6$Iyvb|$;Kxkyag8k7xONPSP5`%~ZC=2+#CNZG-L!1Av_06}GQei9qk*B_b zI;C@zF`@1^t=q)4Dq9}up1}@=dlOZQUYXm>v0qD{RvT>~Pw|GIvE#$%wwo@iHW(tr zo~VMZx!YTZdpP@{5w}LY7v@5<5nAcQXA~p&Oa-CbYIw9IBR8Scynp28#Ni_z9a zEFnYKMHi%Z1BTI8v^XnTDW3?UqlhyrdbylHGql_3J9OkJxP8`e6mt2ulnwZQPx)0zpreP ztF4WNaCx_SpL1~Fu?aY@(60jiW=D#Z)I82U6<7*2W{QL|oz_;WV04l6uWlFpqfaTp zmBjCXWTxJUTR3}FjG``l3I49TOJ?nzj1@o3NlLnC= z>01^)*4OOqBMU;*{ROEzC3ox3 zD3s->L!f1VBSh>Iv6=mSfBSU*;ONcP>sG2Ew$Kb-=G{+c;8Oloq|n1~R(Q~JbhsWF zS^+`dwLe+bY-)(=CBTPnyB?AreeTF^`-tcQ+&NO1*@M1)0lAzM9 zvYRyuc3f}s$DsLKWrXN!tTAVJvmR!{)&&57!Y`nKy;SrUhhYJR%zEqI=4$J1@ajsg17WAx zVys1lvCc@=8boc7F|^CaVnxNxazL$3&4>`1rai<@RUnL~NolObsH2=>#B+=-CkU`M z_(+CiFj$+tg$@mbK|$OlhH3#=dhBw{VFQSyEQ)tB19&2a8YMd04$sbJC3C+G4kicz zMrYhVVB>~pcXK1pfen5u44FmScJdq3wc8wj75}Zm`te0w26ZhcD(^Wf8VW6#zB%b?YZ+UDZRBa0usp!RCP(yz!Sh%b^*?y+Hg`mEJw=oI4c~JVQIFaa%{U zy+h;zjS{<&9;`3KsTFp{WWVKv8S{|}n;&!fod#mJG(1dvm4g7%37HFPG#n^YU_8-* zS|$FpEkSwZWF>VLp_V&iG}YrXQFPl3geD84ltp=lExggl<}Y*zLkj%F`Wv5B;B9=S zGqIazU~BF*MJaC2Gn7jykJ6|{8Gc~+JsMCG{vtRVr*BVTV0df1MgCS017|kuXZUSQ z2=i7+Q%lyshDFXlOxWmJf^RvJ60&yn1azC6zalbDm(zk^-lI8HC40&t6V~Pr*>FTx zo#9^kd6!M)!QQd}p@USQwbi=kqhlTQPo6hp5lkDV#nq%R!;-)&~% zncEY4lh~n7U4CQ!+$R>9wj#!i2Rm%1Fs#h*nlEG8Vz5Oxq4V9h8JO^a5ai>233yk$ zrM%^B)gSzt)#udQG9rJXV48b04xDFIGC3Qoktx`m3((&#GhCA&IjmxY1q+@aSnZIP zg_=4y5#q6mEAX--zY<7il8-|Zu1mx>(MU1KSy>e9e0pV0YzcvZn8u~3941*OO-51e zxjn#4kxjL!QL}o5xveMU+JvB!zZkN#5Cvi^<=`Z~pe@F`x<(;xw)2!I6s$@gjmz6b1Y$C8ujS_K>?i>G&o#0JDg=s7wkku zTu%a=@p8A!?UQRizTF|0<<_*Hmh#D+!vl;5NqNX&h|~>fC>1W0m=~)J#OYDMZFZ(= zfvK!=FyOGzzGe9%i%H}livVwcBYGJK5V4$Ckh388%5}<*MiO)-a_(kNkKtLWg#~st zuQ2-)g{WYE8~}pAEafUW;P%lj1Vo)ciab|k)9ls^z-WR1{eg|#Z)NZHPJTLgdy<)5 zv$wP1LPtT-a4tz!AhrSQ3#Fn-cyScDVW(m0lyS)kWS+xwwrF~@DE`b`w;r4$t$u}G z5NdZ|@m_oiYPwgEvluO($df<#}IuqUPz&Z*U0%O1-9%$A^4%BVF))djURNbe95 zeffxqbD`}fLvw2iA299#yFP>dmlHjp8Mo>@u4~1=aG}ipH*}*Sy}vDJBY|QQAzo_txs&V$`L!Xs2N@ zh{&HO>f(-(A#R7QIc2Ip`k9xG)n(T?HA(}2+N45$7a&PXL@~TA+8q1ItAQG~%#Y_5 zk85J*JOV+uO*wzZ2~Qr%m?Q3Cgcz{O3H zxrfhTg~Df)sxW3`kwZ0oJ2gBL)dxYg{M!$i( zq(|2*Bo^St9^yq}K72@|ua>d4pzBzxlOUD)(9=X(hfN}7&W)x!ttP_@5b-RbVc7K% z62iE*5(A?JxKYbhejsSP6J8JCm*7J7y<)5R=o+opXuBGt`yx6nJ{Y}U`=Ix{ERY{8 ze`6OAK6g9QjITSoZn_ff%>H86LG5I0{Nbj1m!Lj3wDh_m)eO=I`Y$c63q_Z@dCk?B zXx)M#$zn!|F7V$bopac`aSd{-(qzuKR#bzphk1|v2y7!()j;JWe(PSSbD7nWN1jAw zDtO|6fDoX=_!_~;4=d($BAa=_HhDm4lX&V9;Jo%5zlV`E-lvvU1FWCd5J_uA^uFU~ z8@eQg?xTk?axy(|diInE+0fCv^7ta_cdof@o-|n;X3hVJBPmdwrtFpR|1Gn3PB)$l7`^RU_CFmyxAG zM0{+niC4%uMWp7F%v4=@D1V%sO4p=At%f+}p2l#nLIGsd=;F$fKjojudz15hY8Me5r&O@ix8RS^UuLe*- zxBAu0N`7vzzbc3VjpN1F&TK^B;2J{JZ0d#r~a_4s3Qs$`K+ik5hs3% zkkZCtv9N9zN$elFCVGL}>{q)f_BwJXvb{HNc6au+PIl+;RP+Z+`iU|Ha)K7&n{osO zBuFVjx{9)LC??afFFqH2q=T4i1XP)ge-5W(BfOmg4c#1`oi%KdAX6CpvrBf_ z@vHi1rj()j^Q;foM8-9lYUwFJeKK{u`=ny>>p;fr7lLv~(~AjltPbea_WsH1)Bo8! zG=h&Ww@RC5x4XE-3mKHjGHjaTNTSJ0hLPw6u37APrbK(GjKu%q7Qm%D@=a#Xp@WcH zuUjermMX|8k;oenboG`xH9&-3mIU1k=vh#5`{3y4tz-GTYZIb(#)UXhyZ%wg4}0lt zq|EddkWd0+B&Y=qhked$P+<-N@QOoV7f~`oRnCDzfwi!5(1F9gJ>JzyU#-#rNwKWV z=_Q>NXgy=K$5Da6!0@l;R7A;8qXeKdr%vt`#laCs(zA32P$B}jHDjPTbyJGnva^cR zT+e7WC@$5cu4F;HlpbQ}!tjlhM@su3-h$=}7F%5$f?k2v296PQ;s-ki&zNo_k1HAr zbkqcm0;O{rETfAg9y6}f*MvDe25A~(hXzw8n-2kgK9-P33e$>Q6tX*i+1h^l_KnIj zI^T@aT|D=k*3aM9Oq%D0TFpCUt4iq;&ll&`@K}GIJoJ$P5UwKz;EJcmo10!Im1`CZ zCZHcwCz09dRd=#Xc|KYArit(bl6BcaaPeOjg-acvUPmYT+zTN|V<9MpG&R)563G4I zlcTM@{S%kxujqk8=-@hV>|z*+YKTrDkX!{4h>;&}mm2MYMe9s#p(DWhHXSCb&Bf^S z{p#}HJ}fm-maJXVCf%2FnXp{9ea9@BTAOJ@#kPvZ*2!+9(v7Za6$IPl(#zks{BT(4 z66gXiMoo3szb`+u-Ea+K@_j4d;n8ltQ-E9B_wL?yQGm9hhfwOni_OK=MSqC$>iOp4 z-xjkL)}}qwO|M{GqHaBit7zNFcxa^J<*YRSgBOaUkOIq__@+j!&(7(PMlINCw?w;A z=Cu%XLz3_Cs^Au2hY_U_Uto4+8x;Z!>+e(rHj$;s0kdsxG{?6{$@L=eykSs|_wWL^ zY}0cn?7q5>bB0WPaWjhx3X}ko@j1jfT3Z)jIKC|%pVU|zQ>?I-Nvp(9tE`~V1QDdM zCa~#GyAb1eHid)|;DsmRVq1D6`Z;StLds*#JHVHuJyv>U#K_0w}M-B(`$Q);p)`XK5|b~mA)DvQTcLYjir%mLk$Pk zrACDDxC=p@x~m&sQ!B>P-l^8vbA*qFiaWtXiF)2ZES*3VWel`_1-GyJlGr zK>Uec!aT$9JvU|V+*p6*_${=%xw&5V8aC7B=99YD(Ddf!Q~x#2f!F>A2e_c8VdiJh zvD9~QX7Aub=yK{qH-|GnhasgtCtaV94;6DW>X}v!`Vq6PQfq=%6eevn$J*-bwbHlX z^CSmusn|^G@9m{vnr|<~d()Z(MSBKwZa?^7Pw$LFXYT7+2hZnb0vB(ZpI{X@UNM@l z7lFj0rJ3i+NuS4bX|d|U4YJ`_<}d@sT|~H5rxSLJEIgVe!ud?#zkMW0L2vbI>!~wg zeMN;l#Wgk7Pj$e)ezPCA(q4kn6yxS87bZ#^)p>c5T@acB*%RGUvg?z4*eMLZTMnm~ z8`Wz|=?1?2Rr8Sd(w<6H6un_%r8iegMX7 z0`T*pFGh_62G|)yE67!dpUDb4c&uc{wGB+yw``&KsSYQ(neL&q4ym1W zW2zZUeDw=tUqo@c7*x|SMV^}<8*=VI2C}>l^OjA<)5`GM*JO9yGDwz7-qq__fEV?wcH{c`XL|EUm308|jTA!Nck*;&upwZ+~FxC3Q( zYSzx~WYYoo4tyBM(5+Ve^I5erlH3(%dABs@m0U5c|m^H}{ zT{K5dU)gF01C*hmc7&lLutNYeSExuJVEx5sKn(!H7&wH%zp}Tt_D|qsn2m^iwbf+N zumBN+!QjletiK*-##ouF4=R*GTopJ6y_pCj1WnL6L3Kh?;@qq{8mzKZB|;8QOSrVOrXZ|W6C~7_%Xr`x z*VHdnK{IU|b_-q{P_#gIN9aOQNMwnHAFV3YuFqlF)XW3W}EeTB@k<33ax(2!x5eKU?)P2RlEYwb=xngsZ*d*S9q+Jf+vI;s^JCQ@a4s*kB>#o zlb3zi#Zr&zsoO!F;tX>B*r~Rpvnx;vyT5L~etW!U1g!oL$V??^a7j591<_l82eX%@ zX3RhE1yH%C&O>ve^dAK{)iWPebQ z%ayGMk$k3;;YE%ZLuRA6MrHZoOf}8!!)@H6vEhewiCc2$X>Q#tn$5na7kPW@@Z{~$ zE>1`rFUG4Qb0lQ*$i*Nh8R3ZRj)Kz2e}u)8E5IsD@cr96Sh2IW$EO>~GvZUhY$NAJ zO4N!7)1|~tBGU$Cm|fEwd|a5r-UAOo|4=vshin#HjbR6aCCx_Yn_K^Lk=U8)_bCe-n53YgFkRK7F@=DJK{ zsyMJ~Qp>n7x7=@2H2btxGBhp0%-Gfm7OqvZgqqIMLB{>gn;mBb68qwYC-kY%DE$^k zXNGMV!@we~t@-FKy(E*=vLI6M*;3oQmH)LEE)OvBLd-b$bi-B`gE9;H-A`{$_g^1u z|GW{}q?>EcpO>xdf%Ib#FU74 z9rC;}+}AH>)wZ?=Tkm&ZhW@qSdBn3nJk4$ki)<`-W@4JZ1xm~e+00W$zy7SVi#_VJ*jYhsf31y8_aJU~gdF2o~1fMG>h|y^Cfqsv& z!iJgs(Y?*lMh35&P4icaUjfFGc!Qb8ywBxLst*V$RNDvd2#VF9?&!Q7Tmayr-P1~& z;8_}{10$gJ(Nc@k!?s3pD(cpq&22F!;;UAym9Pr(ycakKT3?jM>&qQ;2Y1Sk%Y|X= zazN6V6yS-Aw;}2ire|jb3HLK{Rp_$=aFAolX8L%&IsHCcLi44vb|GYB3!c7T{g6F> zo~=Kz5d{zR+ckW<_FekzI=;=mPrrTqL3>)^4VxM}sS?cnr6vJx*nHxG?@^k;8=Gb$ z-tR(opy!41f)*?7~-@!)%5_F$MU9d-aHi35nS=A;nGKQxGq=?p}{a+MXX{#00$`EwNMdSEfglj zl45)%j-Eg_8LKhhJJ>xsGECON(a9;W=yv%xIV8}2G;90t_22Tpp#9^i=ea-} z`sGI(di-mP>Y->u=N(9!2t!B1{qw4q-a7K>46q>h5jqJynSQ_2f~q$3d!YA6!{LO^ zE?<8SkW4;Z{{WG6YZAzBdu#6vTdqx&v^MNs#z2;8f{9_YNax3|gjGHM?gMfht^~wU zSce+m1r`h$be{bqr3+lr&V>;z@K=X8M{fVhc?*bbT z`VbqySS7GHWMXj;3>dfGuoGUat*(Y)EljhhA@lx&rCiJAuQ+my?@}rM^aB;<+wj$^ z;0s$Vu-I3tJNj)RUS{Dhz?hsV=_UzKDkpT_bLk}|K4H0c_{ps0C(x>XG(c_YtNX5Lt$s5(2ypanW z_Kw|%cSuVY6f+Ny2wZ``eb}&*TIZEUoFg(YfTlMG`$F2B8T<=*O8vi*i?JeKl9So# z(A@Z(%>OPAbDdu`RkigEi}%U67+_jMAHJ7VzhHU}JEJu8w6C$a4HEV=vm*1%HcZtqL>An>SC&S{x9pZI zsWYsnGq!OzNNPhgjB_VTW3x)Et_H~i)IMgO3oJ>NO$dQ7zx9h8903NzMtbP|ft<3y z@EaP}4y7E-7KNTAT6$4B0EO&9l~m*hVyK*#&KiQZ;gir}R&!$2>cKIG+wUs2IN zu(Pr`?=x;F9*48Mh-XVa7;+?)p}eg1J|9AydY&Ea9`7Fgvb#g}X(U#+4-#uWGHlTJ zbJ3f9k{}qpI+#wr#gOA>6;bA9)cB#wOgxszrEevB1;MfelBYsk<{UTFxXmaOwId#m z+AMR7w#Fatau+q1uDJG;5s?5+XWdi$aUg*FQBot)COIV6R&jE)wST;~yML0b=l?l) z3+#pmiai`zvSt0qV(52ER6XECm|7QHh*&?_WPFY8Y$as3=Pi%-@mXbd_oex(H@qB( zYbHE33*7w#t{Os|;F^WpKEvq%ZPey>D2F#JZ5P&>RMqn2d_0_fJhyHq1vMg75#EaZ zy2nNi_T;j0vWDh4MIzEH*#l~G!>D~=75Uf*45Yba zz!>l&LWUro67+QSrlf9Ch}mI}5hsAqw(m_ZF0OTGP2I4P;4KgEb1&SmR$Dj=dk(L* z*_mM;@sw16TH@!0(Lg0LXIfgaaA|NrRX3O$+RTI@aKjoo+&%YuP5HFSUmN1py+w~~ z|5N8|d;jEaN6n2Cu`M6!Ck#br2d=mc2KS|#_4eIe!(>JyFgs;`>&>pVcvChFGA26~ z%=|%pVyue2fqAz?z@vI-l6Gb~so5*d`&H}F{hJ1iG;ZP6DjNoO*{pCbayeJnI!_@@VVL*6Sb5e@^xe_C2NLyRFw4 z$%LW^hsm*C{hP`?BEvLisV;$MsdoWxU+h(jnU$O_nMhP~l4FruR4TRB-I%VoC@NoFq3uc?8H^5gl0K1U^^d~Kxs zQ*h37EoH!~Ob9C|V=rMy!skH@3{fo#V@5d=0lv%>4{#Z86SxorhZWG7mzo5>how66 zg?-<<%qoxP)RsH7bkJ?|f`p|{4JUq#zL70oJ*~#ECMq&J9C^tIQLCGqsezFrT`REK z&vO6MS0bM6fm5hCuEBQAHzoUwk#@=ZeG}m6pFhV+lkn^{cg_JhoaPj|La>1l7K{Z8x<*;{cZ2dDy(oV`iIHjR$dYknolXLbR$AF+5)3Tuuv63B_16-0SkyLO% znoFB#B#Jeda5@_0laEXQO?)+iENxVgib%)M-=Px-VEr4os;lvr({JNSIv&9^z8?4 ztPIkxCos-bAZO7BhWW$O1~t%Jh4p7~uYsVdNx5a*wo}$a)vqn#D@7$&mGLVXRgU$j z)Q~et{Tt6&)si?z+bmHVjb^JQ-_Wt|RStUK``+s` zL(N2xzx*A00jn*&(^2x7@34OqdCH@&{!V8zbksM`kj(FNmR~?4_cr0b_ggy@v0W}mVogpZ7sPcU^VRFWLsD zt+%roKjy5KzYuhTx)3DrD)FiLfMQ?#;@~fkY6yyB2!dCd8JT2ha`^L#i;qtD1r)dL zMcxSbm#F(i!(>6etGAA0TOgw{U}{~rRjc+%R_0lA^US58Z_H#?!$NSP*|1T z4x3W%g4wdV*>==F_s;(&sq1XhH_3NFlgRLQHPOlV?E_FeQ1@;0e` zU>R2a0sv~F-uu&COuFZ7Sm87HjhVHLg`{0VI0D11vTeerCctU21;gIy{7h=}ob~Jd znnL#1BTz{9HZz+toD|A<7i- zed8Ex+df|{IwN@9jTL#jJ&M_qd03GSo>4R8N(4Y7q+|b(Rr7FM=4482J%5ljvGx2h z2E|r0KbvCByLKYTh14-A%$R6pC0*Lq2ANv4cN)Cd#cD3^g$d41IZ=vT|47GVh!P#;Mse8 zvy4Hgi^Ij*68PTil-dFh*J_IJ^`NAWr54jcg0R1d`WB^^nxXm&XL+Rk9%OM{VU<=9 zUy{=V#-G)gGsu`VVFXE-#1??8wdg87qT9boFvaW#m~nArkPj=fZ~ zgoY^l-Fpg_C^lYs&pE&Q@80D46*`Yh|5JkYKG@%WeQ?Z~b7XN>H}q^JRi&gIV)kSC z1yL#ayG=E<6$8-b;hJY6&sb%V%}5xinv|~VL@Ro%_cYww2#Hc47|Ai?MrlT4MJmIZ zfVeqbSX;2DDCDh5;_I~$bq%v<4Onr+HO+y}W;%CHm_&|*A}^)}X(aDRa&rdKxmcPx zRYLAOiHgVLC3R*$|EYhV=F|v9T5%u5LMX;;J@$^n>c>T*Y)gn)cXOCe&g(or;HzdV zjQckiRKPmqattD&PSO%F-A$iAZw1`9O=Kh|f;*wk1hpq^X>~XRm!h8z@?r=zUREHG zn|&j0G2>|=`*mFWHZ`A^d2l769@xU4^RiEoMW(*99Js8Z#08{hiy6SA_9DvYLu2q1 z74nz(^E%t=w-s=d<7!BKcnHy43(2t_zzberhGOL`)?YpY@Xd$yTkr$a6^Bkpfo+?) zLgCk!F*+FsdCbQ3!?iWFe}>LH!!PJFbLX_a64&p z%3iE7{Myg0ugzTEDTl++v=5t;rCs#h#Pf@LaB9}Bn-7Kq0H=e5ROcvrM;09hpRonZ zuBJPODl~iHX3a@bi^PAy|CLCs=FaXf$A5owipcw0CqIFoD!414v{n;VU^;uq z9rzjwJup3`BG!v_;hWxaUI!!kOU>Wd=!?IUX9MLac<^Qq+~>A-%zi!D-9HA0L8W|0 z`fzP(HdE3sJL8ezo|ZE zn3Iv+TyUqf_%6!Mrx#$KFcbnVe5hwSIa~f-bO?kv+>y|!iyo*?G*mk)*!DM_2Wn4E0W~o@9(__?An;V4{Xf$_z|!pi zz5)&05Q?SIi78-auqG6eYJoDTf%b;e4zgri$u}LYZd;ueX-W-yAH0at1NgC+yf%Ex zOyZu)=Iv;B!BtO$9~U1DKhFL~=2n`Fhu1bD-c%2sNr5C!j`BEzx3 zej=k7VE!|3KPI1`t`aU~j=1ccI|{0TuLWZl1S|%|ri}t|4Ywo%b?cq*cM145=prQn z1(jiOF+%zd)C_uoB2?f$0SgZ^K9R!WGO>17mxPB^CmyQvk`g>fKDuJ@@G|_SDy4b>GJe0aD7nHNINL6-ys_? zhcKdg-cOGdd)`lslvvZGvjV>hKQNqGjXw;&3yY_{bEvrW&iM-n)Uv+v|0?Jzi#V0o zRl>asTqWR2t?4oG5xz%@yOJWe6!p&kNMAwWg6em3?_%B59sZoU+hQj4B=E{T4RDUO>>7+N7E0vkloh&qbRvk#zS6!+WC9_Smzy2hx!xiAj* z*@`0fo6<|eBG{*iPwbVl8TsFswX}6eF~0__Zs$daTe#t^2sK2l!QpI5t;}xQwb&-@E0xRfP#IdDmDY|3wN!! z=D&G+vis}l(eC!!BM-S=HZoW8m7ywLjx*Q>mXY&zh{LZ;1g6|e1*RnUN!43hozEkh z0@@T8>r207-ZZ#Ttpt7#QR|AH%=-4h(QXT(8iMD$`&%zxW0J-ei{{=>wmZP+G{+FG zbhEp3DXb3@yRo&Pg9)wgTHk`HWqoyR6-2`8Y;ApE$wsu~Q$zj75I~2P2P4=FN7v($ zgKN>^R1K$N2y91S5J+KSXapi~K^=M4FFxi7*j2)@!K_ngmNtT71y%}`&gqR2MX!fb zKo9vi91^}f+CDy){gt2$;+_~b_#;GMz&#Euv3W6uTn6|hza&#(6@HI_>4-855yxx@ zqG09=VCIczF~EXQ2j^({mOplm0c%8{dk~Wh@bbO%JT@gAEpNk!GGow2a58tbT2#P) z53@aG$1CxW>JKlM39*H+7AI^TC*w?FL_GC;#-t(-S9G;tjj zzfDUpGP0!`<^{B|&@}{jH9X6-J3%|7DGnU0At=o>)!2CniCs^BIoW!dqAe%8$0w~; z_75b0Mq&?X5;FY1>>ZuF-Fkfj6}GHu5L0}cdl&PkaUz_PFzewWlvp%-u|K^Sh_;(MVH?!`U*=4 z^k2U?n=GR}pnG2Sd!9iSF|LUoWk7kTcUb@G>Z)lYYrcd>oW@b0)oGublY_&B1`z2T zh#yr|i8bvb*^i|klpMYS*3z7lPsMdbBnwQ~d^gsyWol{f62-X(K zEN{940hKt>RoUs2(uoIy{JB_QRCpD`H{c(##RdLXsJ+cd8O}7*La20wU*6*1amsr8b^X168u;4l!>4Lck%{1$gyxZ-49P??8aH!2yyv3xhmhG5nHPr=`r_3uH~9-!nIZ1^Wq}MC$K}ZpZ0ck zcK2OvJHjAyLCO%rd~nZS)7D1A2&%B(Kv_#{QU)2;Pw*hw-!@WZwvCKqwu}2USqitm z{F1H*^ULxt8<5D!fAuf%w|PD6LNs;iNADLqZR|Rmuv&sJN%fc0F!9|QADl} za%ZjzEDQ;WaMD^%aX2{md{)yFsB3pXu6%GsL&^6aTsM~T`fovNgPHIkjjg^*Y?@2g z15nS_)Kqg6&mf;;P_M18oIRqw2?i=z~!s?`_^*b^+>Dx{w-3ox?#HSnd-4qgs#ROjHNu;8NG`}`50;u3MZ>_ z1pI#bJOIW8yj@n}3*TONF7zpQb9G4DD;`dQnTfbYjvFgn7feP)>#QvTN?Kbp8(}i@zcJ=QrwTsk17ie}in4{l z5E$EAS%2%c=Px4mE&@kp<#YY{tV8TR_r!a*FAtHIn&)#USJOT*P^n|#R{*8_D&{!g zY6f5XehT%v~AB*N7|BqCA4>~rZVa7x5F6(yuM$|FKv5(mPX*X%05Ux{9;$9aNT zm(Vuo$BWG;VrDrRg2HZa;rZL(!@WT{X+9WSw8i8FJ*5PvP_#t1dj0@h>vuX$Gxp4U zp-hja)bmx1H3p+dfeIT@4I{^7;h$yqt42HX+YGa^D3t3U@QQl3D&cmXjjC64`}w%Q znZ_IGzUddPR<* z4plcd*L3#N@DdC}Z5R|X5Su^HNgwAphV$Xn@N5uv!{`Q7D|z}Uuz@@?#ObU+KB4E! zi)~Qfx@Pnvle^3t3C6Zg<+zs{~t%4-I3hp8T56>PARPOfg}ZLn?o zq*JXUIkAOuSLl8DVP#su1|v!X){1g4EjDidY&f!p_`Us|-Cs|)5B85wj<)vpPfmCL z`)+lW+sHNC+gyt~;XdN!vB6F=w@X+=wfMFIX4*6h7Y1<=i8@ms3@=I*Y-O>xz*B&c z1-rv>k5tf12CReuTzu7KO9ZKg%|>dHD<1IDEso){;g@(OD|6DSGt%F8`=!}rZIpjd zR}HniyoQcW!I2e&T{0x)6RyizB02Q0Hzac?+Y~`h?S;?jMH(DX{hOPdw;0@d-Td%d z!#2tK+1$Ie1;GkvOMy|6uj+KO>wikK=~8Q|x|zdW3rDeF(G6VbaAmw?4)ym8VXC1^ zk6d^pE~lujAFRc9+=(W+THXdOkwo$uw$Ni#u%Zo7RB#QW?P^SP+WaD4$jh0$4L9sO z;!FkFBhH(VfWvWonlLKn^y3(tTte2r0+eO(F8R?G9{Y216fCb))DlOiQ%u2sDW0`gAz&>wdfN37J4>* zI~W&d2wQqcSf$~oE(BHVV-%_5d0Ob=s3IfRTInHwsDW9x)TrKP#YNNVLMj4WNQ?3GmX)L< z(9T&cspxs@oR-BhM@n9&J2@Fn@_zaw2z-FI5b0@%bk=0$NsFvWwvMF{nJQ}PICy*V zj1~0g=FuaIMISYP4qTM19ag1Nh7a;9d9a}1OblhbT7^VOao2IGz>q;!4tDRfHN#%u z>CTq3HSpNZ9XS=j;wtiF=yAM_b} z&w$}>V{dUfJhj!y`JOttwr-Y)K3#eO>#4fiS~9&Q7k-++xJOSvv|#C>F0)sb?A@up zdB}*rSpKi1k~a$w*ToLojFgLI_+C*}sc&$0q1eN9tN4m4wuRLFV>)TaqqYW&Tw8fS z$wG7bLk5e+D{mJ4iR$(DR59%qw?A-8nxgQO?#!1A_`>YRK(ilo8PA{rZ`lj9B-@NN z%_u9CNBz?#&RW{9`4;T?E`c_^lu!jZ&YLpO<#3=30J}eY10LY&Q(f*gp)=WcmJLh5 z(luq0yc8N@$@4UKTnlUOW^lKTkK#{|ow~iH`FKQUWgPLK9w<)H1{&0CQaD5p%cXUv zP=&GG<1MID=0JszB;9V)cxMLNUNvma&=cR=-%g?<5l?k{h)~M@$Z`n{&|_Q-H|86a z+&zdv04r76!jm$(Pw+Nr;`RPeyVbZ+)cQ4~>WkTha5l_3fH{0Hfh6;4;@Y;?dJ4mt z+VKGrr{?O!w2&L>p|s?di5d)=3-U>7G(o&Qxi>GGW=3279ngyI1Uuulj*wlne4>oU z4Hzs1bd_&}yDqwz<-KUd`I2`jM!c6YhD{sZ=P>TFP9%bZDqka_!A;^>D7R( z^3RRn0Xm{!47*eSHyCp+4~5b#KLKv2W%!_om5FAA-Aa&?;wqP=!e#ReUM?ePvBOE% z#I=yCO#D9Q_jRH_OvBPZ$)jq|sv71YlX1I-Ihjpq9@3CMcx?mC{O9J{M)uF=>;Uvn zMKIl>P%=>WL#FL<@fnl`x)=XkUi;t|Rc%q*Bo7o1@}i`UUg2Dq`{VYR?Wa{_T;HU3ITFc?N?FYr5XRa=7| zwVBp&+@f`B&QLf3qy^}*V7i=mVO3Z?^S^wj^WG}7KCGD6P#C8h14-dupC5Fa&DRS+ zZ_ax9S&6a0SMS$92uR?Gi!&s)4F%{N1JZET@oMv?{WfMa3)T%7_3xgvygC3?TrUMu zMFm{Q#y{dt^NeyMXPvzJsQ_ya+~DJ~S2#ya>GlF)dsEBg>y0=qv<1u^jye6rMW5<* z#+Y7ktRbGXNpp?^yCQPsbzQ{Jvz~)Hy=Ts;L)Sg<@}{4e{;xk?ee%Sxh!3t>DVuXJ zeOD~OMeBe9&=up$D~OCYW_}`NmBc(?K#6rp63o$*Dhps1Zr5ZvI_o*zELcCFlmdE| zy6ZNjHkF+7Ac>av&Ijqv>ca(@G9$7~^6})E2xUrLxoWz>RGf9@+DoCD0C-QJ#fwb- zM+fhM+<>G|P&eEWxYU_xgPU6_CyySY0J@Pj=Y|PMJNyTM(|G>_^G2Fk#ognRAc)vk zqOQ4%fvNs%#jw6LlDDk%1_ueZYBat2k`3OX3IYUh__(eN3t6i*?`6qvQa&w@8bQ;Z zK3b;j<~E0rK-#I9(m5wo`N`nlqHi5RJPU-zf(vEd2ZX(ALL>cLR;I?D6~2`63#Csr zA!?K&in68!^d2yk&qJ-mY>8Gr`=BRGWK&>Xo_lPq&U~Qs6!zgP?F0NM4aAH~&0J3b z)8&5VRak^&L#2gVXa`4t1T;Lt6Clgp30{q=kZUzybM-uah?*6LP4iVlWaLIzY7ia| z`y$XCMwQo|8gFVF_pAFWkFOryU-|B;fl?%+Y|6%Hd%MAY8%oo4J7#&!=dii+R&(cZ z`utMKzfNdV0(FS|AAJ_ebcr^U>d-a;DN((uQbN2Qsbmbpy%sUE)&@jBk_`-q(GM{l z%AWaNg}PPNSNM9(AdQ)zQ@-Jd~;Tr%)EuS>l{q9MimVpsoB|(>$ zm*wHdq2Z2#3w(oYH6>b^rXCE|mxZ7v8KjlfHaF|Yq>(f;(f!FhlA19d_y`>u_|gg| zEp<@@4@N+m0a@*7;O};cx~=uq z7eRChu=Rzv9WA+U>_RKoD9v(u5G{3NMc$j)?VdYzrlz)-rw8=F&ocdER!r%E!J$d% zQ{|iW=$q0RFoSQBH<}b|XyWTpEZ5jhO$X6Hn&{kCP3OY$$&NvxS)F3>{MqbU0N8s9 znC$gc3HA0ba&25wZ|!~L>{>wyecyX}V!zxiq(D&tkFL+bBWKwl!ExMbPf?#eR8+G3 zu;MG9gXyYMg4ci!1+w(6#>V;O_N7v*g9}GH#q=OS<@(u42jT4VHV^; z%|RAkm(*rT*ZPAOec>3xNN8Q~_>mbddSC6-r2dve&r9v}ayuPzieO|O1gSf{z(Nhv zd3nrFunM!I>IIX=@$T#0?UQWL`*1PaBIwz6wg$gK93!YA+u0&s7Wf{hb3>}hvbXzy z&b{^ewfQTkoN98F1Yf>7I(U=)qjCT8AB~m!Rrc_+nroFvUzvfCu~w_=@GIL9v@-Y2#t&D`BWN)fJhSd zL$QlAy#fw(w6%Y{x4VC0Pr70Vu*J2oMTF#-yG3H&@6_UY+#+(Rb#0QyQZ>qKZEXXO zQw<=SbcbQl7v9hShHG!Tw%I4q+F^Y4jA7{}2TJ&f>wX#!Nnt9?QG4ie5H|2#*Z>E; z&s#q+h_%)KHLPBNgv{H7WiM-6`97MZkJ^Ye*WMzTrnZT{#Z5Sm)7u9@mYY=V!sKWF z@~UU#kg$4)IaRcli4x=prF<69rsJk598}+r8@HVUxh;ZwVy@Hh#V5TlY-3)8=-r)1_69@2(htmm!9AmJ)LT*iCFhW|eDWt2hui^dOHaETT0$HcX@)%ox3>Xx4Z)) z`|tw74(Bd^H0<}m-(mhQFxed{ChyQn;W*4MiWu6Pg%VQ`vBAiBA$Qd7d;Vyp#Ml$@ ii2R|TdmovUt2)=)Eb$GgXntDyyM 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ǒ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 e9@TV(BD^HG<2b*l&dMaggregate_context +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_aggregate_count sqlite3_api->aggregate_count +#endif +#define sqlite3_bind_blob sqlite3_api->bind_blob +#define sqlite3_bind_double sqlite3_api->bind_double +#define sqlite3_bind_int sqlite3_api->bind_int +#define sqlite3_bind_int64 sqlite3_api->bind_int64 +#define sqlite3_bind_null sqlite3_api->bind_null +#define sqlite3_bind_parameter_count sqlite3_api->bind_parameter_count +#define sqlite3_bind_parameter_index sqlite3_api->bind_parameter_index +#define sqlite3_bind_parameter_name sqlite3_api->bind_parameter_name +#define sqlite3_bind_text sqlite3_api->bind_text +#define sqlite3_bind_text16 sqlite3_api->bind_text16 +#define sqlite3_bind_value sqlite3_api->bind_value +#define sqlite3_busy_handler sqlite3_api->busy_handler +#define sqlite3_busy_timeout sqlite3_api->busy_timeout +#define sqlite3_changes sqlite3_api->changes +#define sqlite3_close sqlite3_api->close +#define sqlite3_collation_needed sqlite3_api->collation_needed +#define sqlite3_collation_needed16 sqlite3_api->collation_needed16 +#define sqlite3_column_blob sqlite3_api->column_blob +#define sqlite3_column_bytes sqlite3_api->column_bytes +#define sqlite3_column_bytes16 sqlite3_api->column_bytes16 +#define sqlite3_column_count sqlite3_api->column_count +#define sqlite3_column_database_name sqlite3_api->column_database_name +#define sqlite3_column_database_name16 sqlite3_api->column_database_name16 +#define sqlite3_column_decltype sqlite3_api->column_decltype +#define sqlite3_column_decltype16 sqlite3_api->column_decltype16 +#define sqlite3_column_double sqlite3_api->column_double +#define sqlite3_column_int sqlite3_api->column_int +#define sqlite3_column_int64 sqlite3_api->column_int64 +#define sqlite3_column_name sqlite3_api->column_name +#define sqlite3_column_name16 sqlite3_api->column_name16 +#define sqlite3_column_origin_name sqlite3_api->column_origin_name +#define sqlite3_column_origin_name16 sqlite3_api->column_origin_name16 +#define sqlite3_column_table_name sqlite3_api->column_table_name +#define sqlite3_column_table_name16 sqlite3_api->column_table_name16 +#define sqlite3_column_text sqlite3_api->column_text +#define sqlite3_column_text16 sqlite3_api->column_text16 +#define sqlite3_column_type sqlite3_api->column_type +#define sqlite3_column_value sqlite3_api->column_value +#define sqlite3_commit_hook sqlite3_api->commit_hook +#define sqlite3_complete sqlite3_api->complete +#define sqlite3_complete16 sqlite3_api->complete16 +#define sqlite3_create_collation sqlite3_api->create_collation +#define sqlite3_create_collation16 sqlite3_api->create_collation16 +#define sqlite3_create_function sqlite3_api->create_function +#define sqlite3_create_function16 sqlite3_api->create_function16 +#define sqlite3_create_module sqlite3_api->create_module +#define sqlite3_create_module_v2 sqlite3_api->create_module_v2 +#define sqlite3_data_count sqlite3_api->data_count +#define sqlite3_db_handle sqlite3_api->db_handle +#define sqlite3_declare_vtab sqlite3_api->declare_vtab +#define sqlite3_enable_shared_cache sqlite3_api->enable_shared_cache +#define sqlite3_errcode sqlite3_api->errcode +#define sqlite3_errmsg sqlite3_api->errmsg +#define sqlite3_errmsg16 sqlite3_api->errmsg16 +#define sqlite3_exec sqlite3_api->exec +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_expired sqlite3_api->expired +#endif +#define sqlite3_finalize sqlite3_api->finalize +#define sqlite3_free sqlite3_api->free +#define sqlite3_free_table sqlite3_api->free_table +#define sqlite3_get_autocommit sqlite3_api->get_autocommit +#define sqlite3_get_auxdata sqlite3_api->get_auxdata +#define sqlite3_get_table sqlite3_api->get_table +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_global_recover sqlite3_api->global_recover +#endif +#define sqlite3_interrupt sqlite3_api->interruptx +#define sqlite3_last_insert_rowid sqlite3_api->last_insert_rowid +#define sqlite3_libversion sqlite3_api->libversion +#define sqlite3_libversion_number sqlite3_api->libversion_number +#define sqlite3_malloc sqlite3_api->malloc +#define sqlite3_mprintf sqlite3_api->mprintf +#define sqlite3_open sqlite3_api->open +#define sqlite3_open16 sqlite3_api->open16 +#define sqlite3_prepare sqlite3_api->prepare +#define sqlite3_prepare16 sqlite3_api->prepare16 +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_profile sqlite3_api->profile +#define sqlite3_progress_handler sqlite3_api->progress_handler +#define sqlite3_realloc sqlite3_api->realloc +#define sqlite3_reset sqlite3_api->reset +#define sqlite3_result_blob sqlite3_api->result_blob +#define sqlite3_result_double sqlite3_api->result_double +#define sqlite3_result_error sqlite3_api->result_error +#define sqlite3_result_error16 sqlite3_api->result_error16 +#define sqlite3_result_int sqlite3_api->result_int +#define sqlite3_result_int64 sqlite3_api->result_int64 +#define sqlite3_result_null sqlite3_api->result_null +#define sqlite3_result_text sqlite3_api->result_text +#define sqlite3_result_text16 sqlite3_api->result_text16 +#define sqlite3_result_text16be sqlite3_api->result_text16be +#define sqlite3_result_text16le sqlite3_api->result_text16le +#define sqlite3_result_value sqlite3_api->result_value +#define sqlite3_rollback_hook sqlite3_api->rollback_hook +#define sqlite3_set_authorizer sqlite3_api->set_authorizer +#define sqlite3_set_auxdata sqlite3_api->set_auxdata +#define sqlite3_snprintf sqlite3_api->snprintf +#define sqlite3_step sqlite3_api->step +#define sqlite3_table_column_metadata sqlite3_api->table_column_metadata +#define sqlite3_thread_cleanup sqlite3_api->thread_cleanup +#define sqlite3_total_changes sqlite3_api->total_changes +#define sqlite3_trace sqlite3_api->trace +#ifndef SQLITE_OMIT_DEPRECATED +#define sqlite3_transfer_bindings sqlite3_api->transfer_bindings +#endif +#define sqlite3_update_hook sqlite3_api->update_hook +#define sqlite3_user_data sqlite3_api->user_data +#define sqlite3_value_blob sqlite3_api->value_blob +#define sqlite3_value_bytes sqlite3_api->value_bytes +#define sqlite3_value_bytes16 sqlite3_api->value_bytes16 +#define sqlite3_value_double sqlite3_api->value_double +#define sqlite3_value_int sqlite3_api->value_int +#define sqlite3_value_int64 sqlite3_api->value_int64 +#define sqlite3_value_numeric_type sqlite3_api->value_numeric_type +#define sqlite3_value_text sqlite3_api->value_text +#define sqlite3_value_text16 sqlite3_api->value_text16 +#define sqlite3_value_text16be sqlite3_api->value_text16be +#define sqlite3_value_text16le sqlite3_api->value_text16le +#define sqlite3_value_type sqlite3_api->value_type +#define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->vsnprintf +#define sqlite3_overload_function sqlite3_api->overload_function +#define sqlite3_prepare_v2 sqlite3_api->prepare_v2 +#define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 +#define sqlite3_clear_bindings sqlite3_api->clear_bindings +#define sqlite3_bind_zeroblob sqlite3_api->bind_zeroblob +#define sqlite3_blob_bytes sqlite3_api->blob_bytes +#define sqlite3_blob_close sqlite3_api->blob_close +#define sqlite3_blob_open sqlite3_api->blob_open +#define sqlite3_blob_read sqlite3_api->blob_read +#define sqlite3_blob_write sqlite3_api->blob_write +#define sqlite3_create_collation_v2 sqlite3_api->create_collation_v2 +#define sqlite3_file_control sqlite3_api->file_control +#define sqlite3_memory_highwater sqlite3_api->memory_highwater +#define sqlite3_memory_used sqlite3_api->memory_used +#define sqlite3_mutex_alloc sqlite3_api->mutex_alloc +#define sqlite3_mutex_enter sqlite3_api->mutex_enter +#define sqlite3_mutex_free sqlite3_api->mutex_free +#define sqlite3_mutex_leave sqlite3_api->mutex_leave +#define sqlite3_mutex_try sqlite3_api->mutex_try +#define sqlite3_open_v2 sqlite3_api->open_v2 +#define sqlite3_release_memory sqlite3_api->release_memory +#define sqlite3_result_error_nomem sqlite3_api->result_error_nomem +#define sqlite3_result_error_toobig sqlite3_api->result_error_toobig +#define sqlite3_sleep sqlite3_api->sleep +#define sqlite3_soft_heap_limit sqlite3_api->soft_heap_limit +#define sqlite3_vfs_find sqlite3_api->vfs_find +#define sqlite3_vfs_register sqlite3_api->vfs_register +#define sqlite3_vfs_unregister sqlite3_api->vfs_unregister +#define sqlite3_threadsafe sqlite3_api->xthreadsafe +#define sqlite3_result_zeroblob sqlite3_api->result_zeroblob +#define sqlite3_result_error_code sqlite3_api->result_error_code +#define sqlite3_test_control sqlite3_api->test_control +#define sqlite3_randomness sqlite3_api->randomness +#define sqlite3_context_db_handle sqlite3_api->context_db_handle +#define sqlite3_extended_result_codes sqlite3_api->extended_result_codes +#define sqlite3_limit sqlite3_api->limit +#define sqlite3_next_stmt sqlite3_api->next_stmt +#define sqlite3_sql sqlite3_api->sql +#define sqlite3_status sqlite3_api->status +#define sqlite3_backup_finish sqlite3_api->backup_finish +#define sqlite3_backup_init sqlite3_api->backup_init +#define sqlite3_backup_pagecount sqlite3_api->backup_pagecount +#define sqlite3_backup_remaining sqlite3_api->backup_remaining +#define sqlite3_backup_step sqlite3_api->backup_step +#define sqlite3_compileoption_get sqlite3_api->compileoption_get +#define sqlite3_compileoption_used sqlite3_api->compileoption_used +#define sqlite3_create_function_v2 sqlite3_api->create_function_v2 +#define sqlite3_db_config sqlite3_api->db_config +#define sqlite3_db_mutex sqlite3_api->db_mutex +#define sqlite3_db_status sqlite3_api->db_status +#define sqlite3_extended_errcode sqlite3_api->extended_errcode +#define sqlite3_log sqlite3_api->log +#define sqlite3_soft_heap_limit64 sqlite3_api->soft_heap_limit64 +#define sqlite3_sourceid sqlite3_api->sourceid +#define sqlite3_stmt_status sqlite3_api->stmt_status +#define sqlite3_strnicmp sqlite3_api->strnicmp +#define sqlite3_unlock_notify sqlite3_api->unlock_notify +#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint +#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint +#define sqlite3_wal_hook sqlite3_api->wal_hook +#define sqlite3_blob_reopen sqlite3_api->blob_reopen +#define sqlite3_vtab_config sqlite3_api->vtab_config +#define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict +/* Version 3.7.16 and later */ +#define sqlite3_close_v2 sqlite3_api->close_v2 +#define sqlite3_db_filename sqlite3_api->db_filename +#define sqlite3_db_readonly sqlite3_api->db_readonly +#define sqlite3_db_release_memory sqlite3_api->db_release_memory +#define sqlite3_errstr sqlite3_api->errstr +#define sqlite3_stmt_busy sqlite3_api->stmt_busy +#define sqlite3_stmt_readonly sqlite3_api->stmt_readonly +#define sqlite3_stricmp sqlite3_api->stricmp +#define sqlite3_uri_boolean sqlite3_api->uri_boolean +#define sqlite3_uri_int64 sqlite3_api->uri_int64 +#define sqlite3_uri_parameter sqlite3_api->uri_parameter +#define sqlite3_uri_vsnprintf sqlite3_api->vsnprintf +#define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 +/* Version 3.8.7 and later */ +#define sqlite3_auto_extension sqlite3_api->auto_extension +#define sqlite3_bind_blob64 sqlite3_api->bind_blob64 +#define sqlite3_bind_text64 sqlite3_api->bind_text64 +#define sqlite3_cancel_auto_extension sqlite3_api->cancel_auto_extension +#define sqlite3_load_extension sqlite3_api->load_extension +#define sqlite3_malloc64 sqlite3_api->malloc64 +#define sqlite3_msize sqlite3_api->msize +#define sqlite3_realloc64 sqlite3_api->realloc64 +#define sqlite3_reset_auto_extension sqlite3_api->reset_auto_extension +#define sqlite3_result_blob64 sqlite3_api->result_blob64 +#define sqlite3_result_text64 sqlite3_api->result_text64 +#define sqlite3_strglob sqlite3_api->strglob +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ + +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) + /* This case when the file really is being compiled as a loadable + ** extension */ +# define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; +# define SQLITE_EXTENSION_INIT2(v) sqlite3_api=v; +# define SQLITE_EXTENSION_INIT3 \ + extern const sqlite3_api_routines *sqlite3_api; +#else + /* This case when the file is being statically linked into the + ** application */ +# define SQLITE_EXTENSION_INIT1 /*no-op*/ +# define SQLITE_EXTENSION_INIT2(v) (void)v; /* unused parameter */ +# define SQLITE_EXTENSION_INIT3 /*no-op*/ +#endif + +#endif /* SQLITE3EXT_H */ diff --git a/crypto/heimdal/lib/vers/Makefile.am b/crypto/heimdal/lib/vers/Makefile.am --- a/crypto/heimdal/lib/vers/Makefile.am +++ b/crypto/heimdal/lib/vers/Makefile.am @@ -10,4 +10,4 @@ libvers_la_SOURCES = print_version.c -EXTRA_DIST = NTMakefile $(build_HEADERZ) +EXTRA_DIST = NTMakefile $(build_HEADERZ) make-print-version.c diff --git a/crypto/heimdal/lib/vers/Makefile.in b/crypto/heimdal/lib/vers/Makefile.in --- a/crypto/heimdal/lib/vers/Makefile.in +++ b/crypto/heimdal/lib/vers/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -22,6 +21,61 @@ # $Id$ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -40,14 +94,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog subdir = lib/vers ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -58,8 +108,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -72,6 +121,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -91,6 +141,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -99,27 +150,79 @@ libvers_la_LIBADD = am_libvers_la_OBJECTS = print_version.lo libvers_la_OBJECTS = $(am_libvers_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/print_version.Plo 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(libvers_la_SOURCES) DIST_SOURCES = $(libvers_la_SOURCES) -ETAGS = etags -CTAGS = ctags +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -134,16 +237,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -153,17 +259,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -182,12 +290,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -196,6 +301,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -212,10 +318,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -223,6 +327,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -237,12 +342,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -259,10 +367,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -273,13 +387,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -303,6 +411,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -326,9 +436,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -338,38 +453,46 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; noinst_LTLIBRARIES = libvers.la build_HEADERZ = vers.h CHECK_LOCAL = no-check-local libvers_la_SOURCES = print_version.c -EXTRA_DIST = NTMakefile $(build_HEADERZ) +EXTRA_DIST = NTMakefile $(build_HEADERZ) make-print-version.c all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -382,15 +505,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/vers/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/vers/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -403,14 +526,17 @@ clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libvers.la: $(libvers_la_OBJECTS) $(libvers_la_DEPENDENCIES) - $(LINK) $(libvers_la_OBJECTS) $(libvers_la_LIBADD) $(LIBS) + @list='$(noinst_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}; \ + } + +libvers.la: $(libvers_la_OBJECTS) $(libvers_la_DEPENDENCIES) $(EXTRA_libvers_la_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(libvers_la_OBJECTS) $(libvers_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -418,28 +544,34 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print_version.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print_version.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -447,26 +579,15 @@ 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) +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -478,15 +599,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -495,11 +612,28 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -547,10 +681,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -568,7 +707,7 @@ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/print_version.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -592,9 +731,8 @@ install-dvi-am: -install-exec-am: - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-exec-local + install-html: install-html-am install-html-am: @@ -616,7 +754,7 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/print_version.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -636,38 +774,53 @@ uninstall-am: @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am -.PHONY: CTAGS GTAGS all all-am all-local check check-am check-local \ - clean clean-generic clean-libtool clean-noinstLTLIBRARIES \ - ctags dist-hook distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libtool \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am dist-hook \ + 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-data-hook install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ + 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-hook + pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-hook + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -675,7 +828,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -720,11 +873,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -732,6 +894,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -774,6 +938,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -787,13 +964,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/lib/vers/NTMakefile b/crypto/heimdal/lib/vers/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/vers/NTMakefile @@ -0,0 +1,56 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR = lib\vers + +!include ../../windows/NTMakefile.w32 + +INCFILES=$(INCDIR)\vers.h + +$(LIBVERS): $(OBJ)\print_version.obj + $(LIBCON) + +$(OBJ)\print_version.obj: print_version.c + $(C2OBJ) -I$(OBJ) + +$(OBJ)\make-print-version.exe: $(OBJ)\make-print-version.obj + $(EXECONLINK) + $(EXEPREP_NODIST) + +$(OBJ)\print_version.h: $(OBJ)\make-print-version.exe + $(OBJ)\make-print-version.exe $@ + +all:: $(INCFILES) $(OBJ)\print_version.h $(LIBVERS) + +clean:: + -$(RM) $(OBJ)\print_version.h $(LIBVERS) + -$(RM) $(OBJ)\make-print-version.exe + -$(RM) $(OBJ)\make-print-version.obj diff --git a/crypto/heimdal/lib/vers/make-print-version.c b/crypto/heimdal/lib/vers/make-print-version.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/lib/vers/make-print-version.c @@ -0,0 +1,66 @@ +/* + * Copyright (c) 1998 - 2003 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include + +#ifdef KRB5 +extern const char *heimdal_version; +#endif +#include + +int +main(int argc, char **argv) +{ + FILE *f; + if(argc != 2) + return 1; + if (strcmp(argv[1], "--version") == 0) { + printf("some version"); + return 0; + } + f = fopen(argv[1], "w"); + if(f == NULL) + return 1; + fprintf(f, "#define VERSIONLIST \""); +#ifdef KRB5 + fprintf(f, "%s", heimdal_version); +#endif + fprintf(f, "\"\n"); + fclose(f); + return 0; +} diff --git a/crypto/heimdal/lib/vers/print_version.c b/crypto/heimdal/lib/vers/print_version.c --- a/crypto/heimdal/lib/vers/print_version.c +++ b/crypto/heimdal/lib/vers/print_version.c @@ -33,8 +33,9 @@ #include +#include -#define VERSION_HIDDEN static +#define VERSION_HIDDEN static HEIMDAL_UNUSED_ATTRIBUTE #include "roken.h" @@ -51,7 +52,7 @@ if(*package_list == '\0') package_list = "no version information"; fprintf(stderr, "%s (%s)\n", progname, package_list); - fprintf(stderr, "Copyright 1995-2011 Kungliga Tekniska Högskolan\n"); + fprintf(stderr, "Copyright 1995-2014 Kungliga Tekniska Högskolan\n"); #ifdef PACKAGE_BUGREPORT fprintf(stderr, "Send bug-reports to %s\n", PACKAGE_BUGREPORT); #endif diff --git a/crypto/heimdal/lib/wind/Makefile.am b/crypto/heimdal/lib/wind/Makefile.am --- a/crypto/heimdal/lib/wind/Makefile.am +++ b/crypto/heimdal/lib/wind/Makefile.am @@ -89,8 +89,6 @@ LDADD = libwind.la $(LIB_roken) -PYTHON = python - if !MAINTAINER_MODE skip_python = test -f $@ || endif diff --git a/crypto/heimdal/lib/wind/Makefile.in b/crypto/heimdal/lib/wind/Makefile.in --- a/crypto/heimdal/lib/wind/Makefile.in +++ b/crypto/heimdal/lib/wind/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -24,6 +23,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -42,9 +96,6 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(dist_include_HEADERS) $(srcdir)/Makefile.am \ - $(srcdir)/Makefile.in $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common ChangeLog @versionscript_TRUE@am__append_1 = $(LDFLAGS_VERSION_SCRIPT)$(srcdir)/version-script.map check_PROGRAMS = test-bidi$(EXEEXT) test-map$(EXEEXT) test-rw$(EXEEXT) \ test-normalize$(EXEEXT) test-prohibited$(EXEEXT) \ @@ -54,7 +105,6 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -65,8 +115,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -79,6 +128,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -98,10 +148,15 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(dist_include_HEADERS) \ + $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" +PROGRAMS = $(bin_PROGRAMS) am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -123,8 +178,12 @@ am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ - "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)" +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; }; \ + } LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = am__objects_1 = bidi.lo combining.lo doxygen.lo errorlist.lo map.lo \ @@ -135,10 +194,13 @@ nodist_libwind_la_OBJECTS = wind_err.lo libwind_la_OBJECTS = $(dist_libwind_la_OBJECTS) \ $(nodist_libwind_la_OBJECTS) -libwind_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +libwind_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libwind_la_LDFLAGS) $(LDFLAGS) -o $@ -PROGRAMS = $(bin_PROGRAMS) am_idn_lookup_OBJECTS = idn-lookup.$(OBJEXT) idn_lookup_OBJECTS = $(am_idn_lookup_OBJECTS) idn_lookup_LDADD = $(LDADD) @@ -176,18 +238,52 @@ test_utf8_OBJECTS = test-utf8.$(OBJEXT) test_utf8_LDADD = $(LDADD) test_utf8_DEPENDENCIES = libwind.la $(am__DEPENDENCIES_1) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = depcomp = $(SHELL) $(top_srcdir)/depcomp -am__depfiles_maybe = depfiles +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/bidi.Plo ./$(DEPDIR)/bidi_table.Plo \ + ./$(DEPDIR)/combining.Plo ./$(DEPDIR)/combining_table.Plo \ + ./$(DEPDIR)/doxygen.Plo ./$(DEPDIR)/errorlist.Plo \ + ./$(DEPDIR)/errorlist_table.Plo ./$(DEPDIR)/idn-lookup.Po \ + ./$(DEPDIR)/ldap.Plo ./$(DEPDIR)/map.Plo \ + ./$(DEPDIR)/map_table.Plo ./$(DEPDIR)/normalize.Plo \ + ./$(DEPDIR)/normalize_table.Plo ./$(DEPDIR)/punycode.Plo \ + ./$(DEPDIR)/punycode_examples.Po ./$(DEPDIR)/stringprep.Plo \ + ./$(DEPDIR)/test-bidi.Po ./$(DEPDIR)/test-ldap.Po \ + ./$(DEPDIR)/test-map.Po ./$(DEPDIR)/test-normalize.Po \ + ./$(DEPDIR)/test-prohibited.Po ./$(DEPDIR)/test-punycode.Po \ + ./$(DEPDIR)/test-rw.Po ./$(DEPDIR)/test-utf8.Po \ + ./$(DEPDIR)/utf8.Plo ./$(DEPDIR)/wind_err.Plo 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) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = CCLD = $(CC) -LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ - --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ - $(LDFLAGS) -o $@ +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = SOURCES = $(dist_libwind_la_SOURCES) $(nodist_libwind_la_SOURCES) \ $(idn_lookup_SOURCES) test-bidi.c test-ldap.c test-map.c \ test-normalize.c test-prohibited.c $(test_punycode_SOURCES) \ @@ -196,16 +292,218 @@ test-bidi.c test-ldap.c test-map.c test-normalize.c \ test-prohibited.c $(test_punycode_SOURCES) test-rw.c \ test-utf8.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac HEADERS = $(dist_include_HEADERS) $(nodist_include_HEADERS) -ETAGS = etags -CTAGS = ctags -am__tty_colors = \ -red=; grn=; lgn=; blu=; std= +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver ChangeLog DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -220,16 +518,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -239,17 +540,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -268,12 +571,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -282,6 +582,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -298,10 +599,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -309,6 +608,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -323,12 +623,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -345,10 +648,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -359,13 +668,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -389,6 +692,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -412,9 +717,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -424,29 +734,37 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; lib_LTLIBRARIES = libwind.la built = \ bidi_table.c \ @@ -503,7 +821,6 @@ idn_lookup_SOURCES = idn-lookup.c LDADD = libwind.la $(LIB_roken) -PYTHON = python @MAINTAINER_MODE_FALSE@skip_python = test -f $@ || EXTRA_DIST = \ NTMakefile \ @@ -542,7 +859,7 @@ $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c .lo .o .obj +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -555,15 +872,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign lib/wind/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign lib/wind/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -573,49 +890,21 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): -install-libLTLIBRARIES: $(lib_LTLIBRARIES) - @$(NORMAL_INSTALL) - test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" - @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 " $(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)'; for p in $$list; do \ - dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ - test "$$dir" != "$$p" || dir=.; \ - echo "rm -f \"$${dir}/so_locations\""; \ - rm -f "$${dir}/so_locations"; \ - done -libwind.la: $(libwind_la_OBJECTS) $(libwind_la_DEPENDENCIES) - $(libwind_la_LINK) -rpath $(libdir) $(libwind_la_OBJECTS) $(libwind_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ + 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|.*|.|' \ + 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 } \ @@ -636,7 +925,8 @@ @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)/' `; \ + -e 's/$$/$(EXEEXT)/' \ + `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files @@ -658,33 +948,80 @@ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list -idn-lookup$(EXEEXT): $(idn_lookup_OBJECTS) $(idn_lookup_DEPENDENCIES) + +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}; \ + } + +libwind.la: $(libwind_la_OBJECTS) $(libwind_la_DEPENDENCIES) $(EXTRA_libwind_la_DEPENDENCIES) + $(AM_V_CCLD)$(libwind_la_LINK) -rpath $(libdir) $(libwind_la_OBJECTS) $(libwind_la_LIBADD) $(LIBS) + +idn-lookup$(EXEEXT): $(idn_lookup_OBJECTS) $(idn_lookup_DEPENDENCIES) $(EXTRA_idn_lookup_DEPENDENCIES) @rm -f idn-lookup$(EXEEXT) - $(LINK) $(idn_lookup_OBJECTS) $(idn_lookup_LDADD) $(LIBS) -test-bidi$(EXEEXT): $(test_bidi_OBJECTS) $(test_bidi_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(idn_lookup_OBJECTS) $(idn_lookup_LDADD) $(LIBS) + +test-bidi$(EXEEXT): $(test_bidi_OBJECTS) $(test_bidi_DEPENDENCIES) $(EXTRA_test_bidi_DEPENDENCIES) @rm -f test-bidi$(EXEEXT) - $(LINK) $(test_bidi_OBJECTS) $(test_bidi_LDADD) $(LIBS) -test-ldap$(EXEEXT): $(test_ldap_OBJECTS) $(test_ldap_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_bidi_OBJECTS) $(test_bidi_LDADD) $(LIBS) + +test-ldap$(EXEEXT): $(test_ldap_OBJECTS) $(test_ldap_DEPENDENCIES) $(EXTRA_test_ldap_DEPENDENCIES) @rm -f test-ldap$(EXEEXT) - $(LINK) $(test_ldap_OBJECTS) $(test_ldap_LDADD) $(LIBS) -test-map$(EXEEXT): $(test_map_OBJECTS) $(test_map_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_ldap_OBJECTS) $(test_ldap_LDADD) $(LIBS) + +test-map$(EXEEXT): $(test_map_OBJECTS) $(test_map_DEPENDENCIES) $(EXTRA_test_map_DEPENDENCIES) @rm -f test-map$(EXEEXT) - $(LINK) $(test_map_OBJECTS) $(test_map_LDADD) $(LIBS) -test-normalize$(EXEEXT): $(test_normalize_OBJECTS) $(test_normalize_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_map_OBJECTS) $(test_map_LDADD) $(LIBS) + +test-normalize$(EXEEXT): $(test_normalize_OBJECTS) $(test_normalize_DEPENDENCIES) $(EXTRA_test_normalize_DEPENDENCIES) @rm -f test-normalize$(EXEEXT) - $(LINK) $(test_normalize_OBJECTS) $(test_normalize_LDADD) $(LIBS) -test-prohibited$(EXEEXT): $(test_prohibited_OBJECTS) $(test_prohibited_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_normalize_OBJECTS) $(test_normalize_LDADD) $(LIBS) + +test-prohibited$(EXEEXT): $(test_prohibited_OBJECTS) $(test_prohibited_DEPENDENCIES) $(EXTRA_test_prohibited_DEPENDENCIES) @rm -f test-prohibited$(EXEEXT) - $(LINK) $(test_prohibited_OBJECTS) $(test_prohibited_LDADD) $(LIBS) -test-punycode$(EXEEXT): $(test_punycode_OBJECTS) $(test_punycode_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_prohibited_OBJECTS) $(test_prohibited_LDADD) $(LIBS) + +test-punycode$(EXEEXT): $(test_punycode_OBJECTS) $(test_punycode_DEPENDENCIES) $(EXTRA_test_punycode_DEPENDENCIES) @rm -f test-punycode$(EXEEXT) - $(LINK) $(test_punycode_OBJECTS) $(test_punycode_LDADD) $(LIBS) -test-rw$(EXEEXT): $(test_rw_OBJECTS) $(test_rw_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_punycode_OBJECTS) $(test_punycode_LDADD) $(LIBS) + +test-rw$(EXEEXT): $(test_rw_OBJECTS) $(test_rw_DEPENDENCIES) $(EXTRA_test_rw_DEPENDENCIES) @rm -f test-rw$(EXEEXT) - $(LINK) $(test_rw_OBJECTS) $(test_rw_LDADD) $(LIBS) -test-utf8$(EXEEXT): $(test_utf8_OBJECTS) $(test_utf8_DEPENDENCIES) + $(AM_V_CCLD)$(LINK) $(test_rw_OBJECTS) $(test_rw_LDADD) $(LIBS) + +test-utf8$(EXEEXT): $(test_utf8_OBJECTS) $(test_utf8_DEPENDENCIES) $(EXTRA_test_utf8_DEPENDENCIES) @rm -f test-utf8$(EXEEXT) - $(LINK) $(test_utf8_OBJECTS) $(test_utf8_LDADD) $(LIBS) + $(AM_V_CCLD)$(LINK) $(test_utf8_OBJECTS) $(test_utf8_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -692,53 +1029,59 @@ distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bidi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bidi_table.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combining.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combining_table.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/doxygen.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errorlist.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errorlist_table.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idn-lookup.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldap.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map_table.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normalize.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normalize_table.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/punycode.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/punycode_examples.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stringprep.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-bidi.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ldap.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-map.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-normalize.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-prohibited.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-punycode.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-rw.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-utf8.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wind_err.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bidi.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bidi_table.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combining.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/combining_table.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/doxygen.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errorlist.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/errorlist_table.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idn-lookup.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ldap.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/map_table.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normalize.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/normalize_table.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/punycode.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/punycode_examples.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stringprep.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-bidi.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-ldap.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-map.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-normalize.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-prohibited.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-punycode.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-rw.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test-utf8.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8.Plo@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wind_err.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(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@ +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo @@ -747,8 +1090,11 @@ -rm -rf .libs _libs install-dist_includeHEADERS: $(dist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(dist_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"; \ @@ -762,13 +1108,14 @@ @$(NORMAL_UNINSTALL) @list='$(dist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) install-nodist_includeHEADERS: $(nodist_include_HEADERS) @$(NORMAL_INSTALL) - test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" @list='$(nodist_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"; \ @@ -782,30 +1129,17 @@ @$(NORMAL_UNINSTALL) @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(includedir)" && rm -f $$files - -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) + dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; }; }'`; \ + $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ @@ -817,15 +1151,11 @@ $$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; }; }'`; \ +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique @@ -834,103 +1164,240 @@ here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 -check-TESTS: $(TESTS) - @failed=0; all=0; xfail=0; xpass=0; skip=0; \ - srcdir=$(srcdir); export srcdir; \ - list=' $(TESTS) '; \ - $(am__tty_colors); \ - if test -n "$$list"; then \ - for tst in $$list; do \ - if test -f ./$$tst; then dir=./; \ - elif test -f $$tst; then dir=; \ - else dir="$(srcdir)/"; fi; \ - if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xpass=`expr $$xpass + 1`; \ - failed=`expr $$failed + 1`; \ - col=$$red; res=XPASS; \ - ;; \ - *) \ - col=$$grn; res=PASS; \ - ;; \ - esac; \ - elif test $$? -ne 77; then \ - all=`expr $$all + 1`; \ - case " $(XFAIL_TESTS) " in \ - *[\ \ ]$$tst[\ \ ]*) \ - xfail=`expr $$xfail + 1`; \ - col=$$lgn; res=XFAIL; \ - ;; \ - *) \ - failed=`expr $$failed + 1`; \ - col=$$red; res=FAIL; \ - ;; \ - esac; \ - else \ - skip=`expr $$skip + 1`; \ - col=$$blu; res=SKIP; \ - fi; \ - echo "$${col}$$res$${std}: $$tst"; \ - done; \ - if test "$$all" -eq 1; then \ - tests="test"; \ - All=""; \ - else \ - tests="tests"; \ - All="All "; \ +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ - if test "$$failed" -eq 0; then \ - if test "$$xfail" -eq 0; then \ - banner="$$All$$all $$tests passed"; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ else \ - if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ - banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ - else \ - if test "$$xpass" -eq 0; then \ - banner="$$failed of $$all $$tests failed"; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ else \ - if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ - banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + color_start= color_end=; \ fi; \ - fi; \ - dashes="$$banner"; \ - skipped=""; \ - if test "$$skip" -ne 0; then \ - if test "$$skip" -eq 1; then \ - skipped="($$skip test was not run)"; \ - else \ - skipped="($$skip tests were not run)"; \ - fi; \ - test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$skipped"; \ - fi; \ - report=""; \ - if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ - report="Please report to $(PACKAGE_BUGREPORT)"; \ - test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ - dashes="$$report"; \ - fi; \ - dashes=`echo "$$dashes" | sed s/./=/g`; \ - if test "$$failed" -eq 0; then \ - echo "$$grn$$dashes"; \ - else \ - echo "$$red$$dashes"; \ - fi; \ - echo "$$banner"; \ - test -z "$$skipped" || echo "$$skipped"; \ - test -z "$$report" || echo "$$report"; \ - echo "$$dashes$$std"; \ - test "$$failed" -eq 0; \ - else :; fi - -distdir: $(DISTFILES) + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_PROGRAMS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +test-bidi.log: test-bidi$(EXEEXT) + @p='test-bidi$(EXEEXT)'; \ + b='test-bidi'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-map.log: test-map$(EXEEXT) + @p='test-map$(EXEEXT)'; \ + b='test-map'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-rw.log: test-rw$(EXEEXT) + @p='test-rw$(EXEEXT)'; \ + b='test-rw'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-normalize.log: test-normalize$(EXEEXT) + @p='test-normalize$(EXEEXT)'; \ + b='test-normalize'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-prohibited.log: test-prohibited$(EXEEXT) + @p='test-prohibited$(EXEEXT)'; \ + b='test-prohibited'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-punycode.log: test-punycode$(EXEEXT) + @p='test-punycode$(EXEEXT)'; \ + b='test-punycode'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-ldap.log: test-ldap$(EXEEXT) + @p='test-ldap$(EXEEXT)'; \ + b='test-ldap'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +test-utf8.log: test-utf8$(EXEEXT) + @p='test-utf8$(EXEEXT)'; \ + b='test-utf8'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -968,16 +1435,19 @@ $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) all-local +all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(HEADERS) all-local install-binPROGRAMS: install-libLTLIBRARIES +install-checkPROGRAMS: install-libLTLIBRARIES + installdirs: - for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(includedir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am +install-exec: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data: install-data-am uninstall: uninstall-am @@ -986,11 +1456,19 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) @@ -1010,7 +1488,32 @@ clean-libLTLIBRARIES clean-libtool mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/bidi.Plo + -rm -f ./$(DEPDIR)/bidi_table.Plo + -rm -f ./$(DEPDIR)/combining.Plo + -rm -f ./$(DEPDIR)/combining_table.Plo + -rm -f ./$(DEPDIR)/doxygen.Plo + -rm -f ./$(DEPDIR)/errorlist.Plo + -rm -f ./$(DEPDIR)/errorlist_table.Plo + -rm -f ./$(DEPDIR)/idn-lookup.Po + -rm -f ./$(DEPDIR)/ldap.Plo + -rm -f ./$(DEPDIR)/map.Plo + -rm -f ./$(DEPDIR)/map_table.Plo + -rm -f ./$(DEPDIR)/normalize.Plo + -rm -f ./$(DEPDIR)/normalize_table.Plo + -rm -f ./$(DEPDIR)/punycode.Plo + -rm -f ./$(DEPDIR)/punycode_examples.Po + -rm -f ./$(DEPDIR)/stringprep.Plo + -rm -f ./$(DEPDIR)/test-bidi.Po + -rm -f ./$(DEPDIR)/test-ldap.Po + -rm -f ./$(DEPDIR)/test-map.Po + -rm -f ./$(DEPDIR)/test-normalize.Po + -rm -f ./$(DEPDIR)/test-prohibited.Po + -rm -f ./$(DEPDIR)/test-punycode.Po + -rm -f ./$(DEPDIR)/test-rw.Po + -rm -f ./$(DEPDIR)/test-utf8.Po + -rm -f ./$(DEPDIR)/utf8.Plo + -rm -f ./$(DEPDIR)/wind_err.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -1035,9 +1538,9 @@ install-dvi-am: -install-exec-am: install-binPROGRAMS install-libLTLIBRARIES - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binPROGRAMS install-exec-local \ + install-libLTLIBRARIES + install-html: install-html-am install-html-am: @@ -1059,7 +1562,32 @@ installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/bidi.Plo + -rm -f ./$(DEPDIR)/bidi_table.Plo + -rm -f ./$(DEPDIR)/combining.Plo + -rm -f ./$(DEPDIR)/combining_table.Plo + -rm -f ./$(DEPDIR)/doxygen.Plo + -rm -f ./$(DEPDIR)/errorlist.Plo + -rm -f ./$(DEPDIR)/errorlist_table.Plo + -rm -f ./$(DEPDIR)/idn-lookup.Po + -rm -f ./$(DEPDIR)/ldap.Plo + -rm -f ./$(DEPDIR)/map.Plo + -rm -f ./$(DEPDIR)/map_table.Plo + -rm -f ./$(DEPDIR)/normalize.Plo + -rm -f ./$(DEPDIR)/normalize_table.Plo + -rm -f ./$(DEPDIR)/punycode.Plo + -rm -f ./$(DEPDIR)/punycode_examples.Po + -rm -f ./$(DEPDIR)/stringprep.Plo + -rm -f ./$(DEPDIR)/test-bidi.Po + -rm -f ./$(DEPDIR)/test-ldap.Po + -rm -f ./$(DEPDIR)/test-map.Po + -rm -f ./$(DEPDIR)/test-normalize.Po + -rm -f ./$(DEPDIR)/test-prohibited.Po + -rm -f ./$(DEPDIR)/test-punycode.Po + -rm -f ./$(DEPDIR)/test-rw.Po + -rm -f ./$(DEPDIR)/test-utf8.Po + -rm -f ./$(DEPDIR)/utf8.Plo + -rm -f ./$(DEPDIR)/wind_err.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -1081,43 +1609,58 @@ @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: all check check-am install install-am install-data-am \ - install-exec-am install-strip uninstall-am - -.PHONY: CTAGS GTAGS all all-am all-local check check-TESTS check-am \ - check-local clean clean-binPROGRAMS clean-checkPROGRAMS \ - clean-generic clean-libLTLIBRARIES clean-libtool ctags \ - dist-hook 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-data-hook \ - install-dist_includeHEADERS install-dvi install-dvi-am \ - install-exec install-exec-am install-exec-hook install-html \ - install-html-am install-info install-info-am \ - install-libLTLIBRARIES install-man \ + install-exec install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \ + clean-libtool cscopelist-am ctags ctags-am dist-hook 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-data-hook install-dist_includeHEADERS \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-exec-local install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES install-man \ install-nodist_includeHEADERS 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-dist_includeHEADERS uninstall-hook \ - uninstall-libLTLIBRARIES uninstall-nodist_includeHEADERS + recheck tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-dist_includeHEADERS \ + uninstall-hook uninstall-libLTLIBRARIES \ + uninstall-nodist_includeHEADERS + +.PRECIOUS: Makefile install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done -install-exec-hook: install-suid-programs +install-exec-local: install-suid-programs -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -1125,7 +1668,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -1170,11 +1713,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -1182,6 +1734,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -1224,6 +1778,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -1237,13 +1804,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans diff --git a/crypto/heimdal/lib/wind/NTMakefile b/crypto/heimdal/lib/wind/NTMakefile --- a/crypto/heimdal/lib/wind/NTMakefile +++ b/crypto/heimdal/lib/wind/NTMakefile @@ -135,14 +135,14 @@ test-run: cd $(OBJ) - test-bidi.exe - test-map.exe - test-rw.exe - test-normalize.exe $(SRCDIR)\NormalizationTest.txt - test-prohibited.exe - test-punycode.exe - test-ldap.exe - test-utf8.exe + -test-bidi.exe + -test-map.exe + -test-rw.exe + -test-normalize.exe $(SRCDIR)\NormalizationTest.txt + -test-prohibited.exe + -test-punycode.exe + -test-ldap.exe + -test-utf8.exe cd $(SRCDIR) all:: $(INCFILES) $(LIBWIND) diff --git a/crypto/heimdal/lib/wind/UnicodeData.py b/crypto/heimdal/lib/wind/UnicodeData.py --- a/crypto/heimdal/lib/wind/UnicodeData.py +++ b/crypto/heimdal/lib/wind/UnicodeData.py @@ -50,7 +50,7 @@ continue f = l.split(';') key = int(f[0], 0x10) - if key in ret: + if key in ret: raise Exception('Duplicate key in UnicodeData') ret[key] = f[1:] ud.close() diff --git a/crypto/heimdal/lib/wind/bidi.c b/crypto/heimdal/lib/wind/bidi.c --- a/crypto/heimdal/lib/wind/bidi.c +++ b/crypto/heimdal/lib/wind/bidi.c @@ -51,7 +51,7 @@ static int is_ral(uint32_t cp) { - struct range_entry ee = {cp}; + struct range_entry ee = {cp, 0}; void *s = bsearch(&ee, _wind_ral_table, _wind_ral_table_size, sizeof(_wind_ral_table[0]), range_entry_cmp); @@ -61,7 +61,7 @@ static int is_l(uint32_t cp) { - struct range_entry ee = {cp}; + struct range_entry ee = {cp, 0}; void *s = bsearch(&ee, _wind_l_table, _wind_l_table_size, sizeof(_wind_l_table[0]), range_entry_cmp); diff --git a/crypto/heimdal/lib/wind/bidi_table.h b/crypto/heimdal/lib/wind/bidi_table.h --- a/crypto/heimdal/lib/wind/bidi_table.h +++ b/crypto/heimdal/lib/wind/bidi_table.h @@ -1,5 +1,5 @@ /* ./bidi_table.h */ -/* Automatically generated at 2012-01-11T14:07:00.534628 */ +/* Automatically generated at 2022-11-15T13:59:51.646310 */ #ifndef BIDI_TABLE_H #define BIDI_TABLE_H 1 diff --git a/crypto/heimdal/lib/wind/bidi_table.c b/crypto/heimdal/lib/wind/bidi_table.c --- a/crypto/heimdal/lib/wind/bidi_table.c +++ b/crypto/heimdal/lib/wind/bidi_table.c @@ -1,9 +1,9 @@ /* ./bidi_table.c */ -/* Automatically generated at 2012-01-11T14:07:00.535499 */ +/* Automatically generated at 2022-11-15T13:59:51.646346 */ -#include #include "bidi_table.h" +#include const struct range_entry _wind_ral_table[] = { {0x5be, 1}, diff --git a/crypto/heimdal/lib/wind/combining.c b/crypto/heimdal/lib/wind/combining.c --- a/crypto/heimdal/lib/wind/combining.c +++ b/crypto/heimdal/lib/wind/combining.c @@ -49,7 +49,7 @@ int _wind_combining_class(uint32_t code_point) { - struct translation ts = {code_point}; + struct translation ts = {code_point, 0}; void *s = bsearch(&ts, _wind_combining_table, _wind_combining_table_size, sizeof(_wind_combining_table[0]), translation_cmp); diff --git a/crypto/heimdal/lib/wind/combining_table.h b/crypto/heimdal/lib/wind/combining_table.h --- a/crypto/heimdal/lib/wind/combining_table.h +++ b/crypto/heimdal/lib/wind/combining_table.h @@ -1,5 +1,5 @@ /* ./combining_table.h */ -/* Automatically generated at 2012-01-11T14:07:00.836450 */ +/* Automatically generated at 2022-11-15T13:59:51.697168 */ #ifndef COMBINING_TABLE_H #define COMBINING_TABLE_H 1 diff --git a/crypto/heimdal/lib/wind/combining_table.c b/crypto/heimdal/lib/wind/combining_table.c --- a/crypto/heimdal/lib/wind/combining_table.c +++ b/crypto/heimdal/lib/wind/combining_table.c @@ -1,9 +1,9 @@ /* ./combining_table.c */ -/* Automatically generated at 2012-01-11T14:07:00.838826 */ +/* Automatically generated at 2022-11-15T13:59:51.697203 */ -#include #include "combining_table.h" +#include const struct translation _wind_combining_table[] = { {0x300, 230}, /* Mn */ diff --git a/crypto/heimdal/lib/wind/errorlist.c b/crypto/heimdal/lib/wind/errorlist.c --- a/crypto/heimdal/lib/wind/errorlist.c +++ b/crypto/heimdal/lib/wind/errorlist.c @@ -51,7 +51,7 @@ int _wind_stringprep_error(const uint32_t cp, wind_profile_flags flags) { - struct error_entry ee = {cp}; + struct error_entry ee = {cp, 0, 0}; const struct error_entry *s; s = (const struct error_entry *) diff --git a/crypto/heimdal/lib/wind/errorlist_table.h b/crypto/heimdal/lib/wind/errorlist_table.h --- a/crypto/heimdal/lib/wind/errorlist_table.h +++ b/crypto/heimdal/lib/wind/errorlist_table.h @@ -1,5 +1,5 @@ /* ./errorlist_table.h */ -/* Automatically generated at 2012-01-11T14:07:01.014378 */ +/* Automatically generated at 2022-11-15T13:59:51.730690 */ #ifndef ERRORLIST_TABLE_H #define ERRORLIST_TABLE_H 1 diff --git a/crypto/heimdal/lib/wind/errorlist_table.c b/crypto/heimdal/lib/wind/errorlist_table.c --- a/crypto/heimdal/lib/wind/errorlist_table.c +++ b/crypto/heimdal/lib/wind/errorlist_table.c @@ -1,9 +1,9 @@ /* ./errorlist_table.c */ -/* Automatically generated at 2012-01-11T14:07:01.014764 */ +/* Automatically generated at 2022-11-15T13:59:51.730725 */ -#include #include "errorlist_table.h" +#include const struct error_entry _wind_errorlist_table[] = { {0x0, 0x20, WIND_PROFILE_SASL}, /* C.2.1: [CONTROL CHARACTERS] */ diff --git a/crypto/heimdal/lib/wind/gen-bidi.py b/crypto/heimdal/lib/wind/gen-bidi.py --- a/crypto/heimdal/lib/wind/gen-bidi.py +++ b/crypto/heimdal/lib/wind/gen-bidi.py @@ -42,7 +42,7 @@ import rfc3454 if len(sys.argv) != 3: - print "usage: %s rfc3454.txt outdir" % sys.argv[0] + print("usage: %s rfc3454.txt outdir" % sys.argv[0]) sys.exit(1) tables = rfc3454.read(sys.argv[1]) @@ -70,8 +70,8 @@ bidi_c.file.write( ''' -#include #include "bidi_table.h" +#include ''') diff --git a/crypto/heimdal/lib/wind/gen-combining.py b/crypto/heimdal/lib/wind/gen-combining.py --- a/crypto/heimdal/lib/wind/gen-combining.py +++ b/crypto/heimdal/lib/wind/gen-combining.py @@ -42,7 +42,7 @@ import UnicodeData if len(sys.argv) != 3: - print "usage: %s UnicodeData.txt out-dir" % sys.argv[0] + print("usage: %s UnicodeData.txt out-dir" % sys.argv[0]) sys.exit(1) ud = UnicodeData.read(sys.argv[1]) @@ -73,14 +73,13 @@ combining_c.file.write( ''' -#include #include "combining_table.h" +#include const struct translation _wind_combining_table[] = { ''') -s = trans.keys() -s.sort() +s = sorted(trans) for k in s: v = trans[k] combining_c.file.write("{0x%x, %u}, /* %s */\n" diff --git a/crypto/heimdal/lib/wind/gen-errorlist.py b/crypto/heimdal/lib/wind/gen-errorlist.py --- a/crypto/heimdal/lib/wind/gen-errorlist.py +++ b/crypto/heimdal/lib/wind/gen-errorlist.py @@ -44,13 +44,13 @@ import stringprep if len(sys.argv) != 3: - print "usage: %s rfc3454.txt out-dir" % sys.argv[0] + print("usage: %s rfc3454.txt out-dir" % sys.argv[0]) sys.exit(1) tables = rfc3454.read(sys.argv[1]) t2 = rfc4518.read() -for x in t2.iterkeys(): +for x in t2.keys(): tables[x] = t2[x] error_list = stringprep.get_errorlist() @@ -77,15 +77,15 @@ errorlist_c.file.write( ''' -#include #include "errorlist_table.h" +#include const struct error_entry _wind_errorlist_table[] = { ''') trans=[] -for t in error_list.iterkeys(): +for t in error_list.keys(): for l in tables[t]: m = re.search('^ *([0-9A-F]+)-([0-9A-F]+); *(.*) *$', l) if m: @@ -104,7 +104,7 @@ (start, length, description, tables) = x symbols = stringprep.symbols(error_list, tables) if len(symbols) == 0: - print "no symbol for %s" % description + print("no symbol for %s" % description) sys.exit(1) errorlist_c.file.write(" {0x%x, 0x%x, %s}, /* %s: %s */\n" % (start, length, symbols, ",".join(tables), description)) diff --git a/crypto/heimdal/lib/wind/gen-map.py b/crypto/heimdal/lib/wind/gen-map.py --- a/crypto/heimdal/lib/wind/gen-map.py +++ b/crypto/heimdal/lib/wind/gen-map.py @@ -45,13 +45,13 @@ import util if len(sys.argv) != 3: - print "usage: %s rfc3454.txt out-dir" % sys.argv[0] + print("usage: %s rfc3454.txt out-dir" % sys.argv[0]) sys.exit(1) tables = rfc3454.read(sys.argv[1]) t2 = rfc4518.read() -for x in t2.iterkeys(): +for x in t2: tables[x] = t2[x] map_list = stringprep.get_maplist() @@ -88,7 +88,7 @@ trans=[] -for t in map_list.iterkeys(): +for t in map_list: for l in tables[t]: m = re.search('^ *([0-9A-F]+)-([0-9A-F]+); *([^;]+); *(.*) *$', l) if m: @@ -96,7 +96,7 @@ end = int(m.group(2), 0x10) value = m.group(3) desc = m.group(4) - for key in xrange(start,end,1): + for key in range(start,end,1): trans.append((key, value, desc, [t])) continue m = re.search('^ *([^;]+); *([^;]+); *(.*) *$', l) @@ -114,7 +114,7 @@ for x in trans: if x[0] == 0xad: - print "fooresult %s" % ",".join(x[3]) + print("fooresult %s" % ",".join(x[3])) for x in trans: (key, value, description, table) = x @@ -130,7 +130,7 @@ (key, value, description, tables) = x symbols = stringprep.symbols(map_list, tables) if len(symbols) == 0: - print "no symbol for %s %s (%s)" % (key, description, tables) + print("no symbol for %s %s (%s)" % (key, description, tables)) sys.exit(1) v = value.split() map_c.file.write(" {0x%x, %u, %u, %s}, /* %s: %s */\n" diff --git a/crypto/heimdal/lib/wind/gen-normalize.py b/crypto/heimdal/lib/wind/gen-normalize.py --- a/crypto/heimdal/lib/wind/gen-normalize.py +++ b/crypto/heimdal/lib/wind/gen-normalize.py @@ -43,15 +43,15 @@ import util if len(sys.argv) != 4: - print "usage: %s UnicodeData.txt" - " CompositionExclusions-3.2.0.txt out-dir" % sys.argv[0] + print("usage: %s UnicodeData.txt" + " CompositionExclusions-3.2.0.txt out-dir" % sys.argv[0]) sys.exit(1) ud = UnicodeData.read(sys.argv[1]) def sortedKeys(d): """Return a sorted list of the keys of a dict""" - keys = d.keys() + keys = list(d.keys()) keys.sort() return keys @@ -97,8 +97,8 @@ normalize_c.file.write( ''' -#include #include "normalize_table.h" +#include const struct translation _wind_normalize_table[] = { ''') @@ -136,7 +136,7 @@ inv = dict([(''.join(["%05x" % int(x, 0x10) for x in v[4].split(' ')]), [k, v[0]]) for k,v in ud.items() - if v[4] and not re.search('<[a-zA-Z]+> *', v[4]) and not exclusions.has_key(k)]) + if v[4] and not re.search('<[a-zA-Z]+> *', v[4]) and not k in exclusions]) table = 0 diff --git a/crypto/heimdal/lib/wind/gen-punycode-examples.py b/crypto/heimdal/lib/wind/gen-punycode-examples.py --- a/crypto/heimdal/lib/wind/gen-punycode-examples.py +++ b/crypto/heimdal/lib/wind/gen-punycode-examples.py @@ -35,13 +35,12 @@ # SUCH DAMAGE. import re -import string import sys import generate if len(sys.argv) != 3: - print "usage: %s rfc3492.txt" % sys.argv[0] + print("usage: %s rfc3492.txt" % sys.argv[0]) sys.exit(1) f = open(sys.argv[1], 'r') @@ -72,7 +71,7 @@ else: m = re.search('^ *([uU]+.*) *$', l) if m: - codes.extend(string.split(m.group(1), ' ')) + codes.extend(m.group(1).split(' ')) else: m = re.search('^ *Punycode: (.*) *$', l) if m: @@ -81,7 +80,7 @@ if re.match('^7\.1', l): start = True cases = [] - + f.close() examples_h.file.write( @@ -115,7 +114,7 @@ examples_c.file.write( " {%u, {%s}, \"%s\", \"%s\"},\n" % (len(cp), - string.join([re.sub('[uU]\+', '0x', x) for x in cp], ', '), + ",".join([re.sub('[uU]\+', '0x', x) for x in cp]), pc, desc)) diff --git a/crypto/heimdal/lib/wind/generate.py b/crypto/heimdal/lib/wind/generate.py --- a/crypto/heimdal/lib/wind/generate.py +++ b/crypto/heimdal/lib/wind/generate.py @@ -37,6 +37,7 @@ import datetime import string import os +import sys class GeneratedFile : "Represents a generated file" @@ -56,10 +57,14 @@ class Header(GeneratedFile) : "Represents a generated header file" - guardTrans = string.maketrans('-.', '__') + if sys.hexversion>0x300000f: + guardTrans = bytes.maketrans(b'-.', b'__') + else: + import string + guardTrans = string.maketrans('-.', '__') def makeGuard(self) : """Return a name to be used as ifdef guard""" - return string.upper(string.translate(self.name, self.guardTrans)) + return self.name.translate(self.guardTrans).upper() def __init__(self, name) : "Create a new Header with name" diff --git a/crypto/heimdal/lib/wind/libwind-exports.def b/crypto/heimdal/lib/wind/libwind-exports.def --- a/crypto/heimdal/lib/wind/libwind-exports.def +++ b/crypto/heimdal/lib/wind/libwind-exports.def @@ -11,6 +11,7 @@ wind_utf8ucs2_length wind_ucs2utf8_length wind_ucs2read + wind_ucs2write initialize_wind_error_table_r ;! diff --git a/crypto/heimdal/lib/wind/map.c b/crypto/heimdal/lib/wind/map.c --- a/crypto/heimdal/lib/wind/map.c +++ b/crypto/heimdal/lib/wind/map.c @@ -58,7 +58,7 @@ unsigned o = 0; for (i = 0; i < in_len; ++i) { - struct translation ts = {in[i]}; + struct translation ts = {in[i], 0, 0, 0}; const struct translation *s; s = (const struct translation *) diff --git a/crypto/heimdal/lib/wind/map_table.h b/crypto/heimdal/lib/wind/map_table.h --- a/crypto/heimdal/lib/wind/map_table.h +++ b/crypto/heimdal/lib/wind/map_table.h @@ -1,5 +1,5 @@ /* ./map_table.h */ -/* Automatically generated at 2012-01-11T14:07:01.097337 */ +/* Automatically generated at 2022-11-15T13:59:51.761662 */ #ifndef MAP_TABLE_H #define MAP_TABLE_H 1 diff --git a/crypto/heimdal/lib/wind/map_table.c b/crypto/heimdal/lib/wind/map_table.c --- a/crypto/heimdal/lib/wind/map_table.c +++ b/crypto/heimdal/lib/wind/map_table.c @@ -1,5 +1,5 @@ /* ./map_table.c */ -/* Automatically generated at 2012-01-11T14:07:01.097758 */ +/* Automatically generated at 2022-11-15T13:59:51.761698 */ #include "map_table.h" diff --git a/crypto/heimdal/lib/wind/normalize.c b/crypto/heimdal/lib/wind/normalize.c --- a/crypto/heimdal/lib/wind/normalize.c +++ b/crypto/heimdal/lib/wind/normalize.c @@ -127,7 +127,7 @@ unsigned o = 0; for (i = 0; i < in_len; ++i) { - struct translation ts = {in[i]}; + struct translation ts = {in[i], 0, 0}; size_t sub_len = *out_len - o; int ret; diff --git a/crypto/heimdal/lib/wind/normalize_table.h b/crypto/heimdal/lib/wind/normalize_table.h --- a/crypto/heimdal/lib/wind/normalize_table.h +++ b/crypto/heimdal/lib/wind/normalize_table.h @@ -1,5 +1,5 @@ /* ./normalize_table.h */ -/* Automatically generated at 2012-01-11T14:07:01.713967 */ +/* Automatically generated at 2022-11-15T13:59:51.864870 */ #ifndef NORMALIZE_TABLE_H #define NORMALIZE_TABLE_H 1 diff --git a/crypto/heimdal/lib/wind/normalize_table.c b/crypto/heimdal/lib/wind/normalize_table.c --- a/crypto/heimdal/lib/wind/normalize_table.c +++ b/crypto/heimdal/lib/wind/normalize_table.c @@ -1,9 +1,9 @@ /* ./normalize_table.c */ -/* Automatically generated at 2012-01-11T14:07:01.714581 */ +/* Automatically generated at 2022-11-15T13:59:51.864904 */ -#include #include "normalize_table.h" +#include const struct translation _wind_normalize_table[] = { {0xa0, 1, 0}, /* NO-BREAK SPACE */ @@ -10906,5290 +10906,5336 @@ {0x0, 0, 3, 0}, {0x0, 0, 10, 3}, {0x0, 0, 16, 13}, - {0x0, 0, 15, 29}, - {0x0, 1, 14, 44}, - {0x2f993, 16, 16, 57}, - {0x0, 0, 16, 57}, - {0x0, 0, 16, 73}, - {0x0, 8, 16, 89}, - {0xf942, 16, 16, 97}, - {0x2f994, 16, 16, 97}, - {0x0, 0, 16, 97}, - {0x0, 9, 15, 113}, - {0x0, 5, 6, 119}, - {0x2f9ef, 16, 16, 120}, - {0x0, 0, 16, 120}, - {0x0, 0, 16, 136}, - {0x0, 0, 16, 152}, - {0x0, 0, 1, 168}, - {0x0, 0, 1, 169}, - {0x0, 3, 4, 170}, - {0x0, 4, 5, 171}, - {0x0, 5, 6, 172}, - {0x1f94, 16, 16, 173}, - {0x0, 0, 16, 173}, - {0x0, 0, 12, 189}, - {0x0, 10, 12, 201}, - {0x2f8f6, 16, 16, 203}, - {0xf970, 16, 16, 203}, - {0x0, 0, 16, 203}, - {0x0, 2, 14, 219}, - {0x0, 2, 6, 231}, - {0x0, 0, 1, 235}, - {0x0, 0, 1, 236}, - {0x0, 6, 7, 237}, - {0x0, 5, 6, 238}, - {0x0, 4, 5, 239}, - {0x6c0, 16, 16, 240}, - {0x0, 0, 16, 240}, - {0x0, 0, 13, 256}, - {0x0, 9, 10, 269}, - {0xf9ae, 16, 16, 270}, - {0x0, 0, 16, 270}, - {0x0, 2, 16, 286}, - {0x0, 15, 16, 300}, - {0xfa69, 16, 16, 301}, - {0x0, 0, 11, 301}, - {0x0, 1, 16, 312}, - {0x0, 3, 14, 327}, - {0x0, 6, 7, 338}, - {0x2f9a4, 16, 16, 339}, - {0x0, 4, 15, 339}, - {0x0, 9, 10, 350}, - {0xf9be, 16, 16, 351}, - {0x0, 1, 12, 351}, - {0x0, 7, 8, 362}, - {0x2f864, 16, 16, 363}, - {0x0, 0, 13, 363}, - {0x0, 0, 1, 376}, - {0x0, 0, 1, 377}, - {0x0, 3, 4, 378}, - {0x0, 4, 5, 379}, - {0x0, 5, 6, 380}, - {0x1fc2, 16, 16, 381}, - {0x0, 0, 16, 381}, - {0x0, 0, 16, 397}, - {0x0, 1, 16, 413}, - {0x0, 0, 1, 428}, - {0x0, 3, 4, 429}, - {0x0, 0, 1, 430}, - {0x0, 9, 10, 431}, - {0x0, 9, 10, 432}, - {0x3065, 16, 16, 433}, - {0x0, 0, 3, 433}, - {0x0, 0, 12, 436}, - {0x0, 3, 14, 448}, - {0x0, 0, 1, 459}, - {0x0, 0, 1, 460}, - {0x0, 3, 4, 461}, - {0x0, 3, 4, 462}, - {0x0, 8, 9, 463}, - {0x2244, 16, 16, 464}, - {0x0, 0, 15, 464}, - {0x0, 0, 12, 479}, - {0x0, 0, 1, 491}, + {0x0, 3, 16, 29}, + {0x0, 1, 16, 42}, + {0x0, 0, 1, 57}, + {0x0, 0, 1, 58}, + {0x0, 3, 4, 59}, + {0x0, 0, 3, 60}, + {0x0, 0, 16, 63}, + {0xc0, 16, 16, 79}, + {0xc1, 16, 16, 79}, + {0xc2, 16, 16, 79}, + {0xc3, 16, 16, 79}, + {0xc4, 16, 16, 79}, + {0xc5, 16, 16, 79}, + {0x0, 0, 1, 79}, + {0x0, 0, 1, 80}, + {0x0, 3, 4, 81}, + {0x0, 0, 3, 82}, + {0x0, 7, 8, 85}, + {0xc7, 16, 16, 86}, + {0x0, 0, 1, 86}, + {0x0, 0, 1, 87}, + {0x0, 3, 4, 88}, + {0x0, 0, 4, 89}, + {0x0, 0, 16, 93}, + {0xc8, 16, 16, 109}, + {0xc9, 16, 16, 109}, + {0xca, 16, 16, 109}, + {0xcb, 16, 16, 109}, + {0x0, 0, 1, 109}, + {0x0, 0, 1, 110}, + {0x0, 3, 4, 111}, + {0x0, 0, 4, 112}, + {0x0, 0, 16, 116}, + {0xcc, 16, 16, 132}, + {0xcd, 16, 16, 132}, + {0xce, 16, 16, 132}, + {0xcf, 16, 16, 132}, + {0x0, 0, 1, 132}, + {0x0, 0, 1, 133}, + {0x0, 3, 4, 134}, + {0x0, 0, 4, 135}, + {0x0, 0, 13, 139}, + {0xd1, 16, 16, 152}, + {0x0, 0, 1, 152}, + {0x0, 0, 1, 153}, + {0x0, 3, 4, 154}, + {0x0, 0, 3, 155}, + {0x0, 0, 16, 158}, + {0xd2, 16, 16, 174}, + {0xd3, 16, 16, 174}, + {0xd4, 16, 16, 174}, + {0xd5, 16, 16, 174}, + {0xd6, 16, 16, 174}, + {0x0, 0, 11, 174}, + {0x0, 0, 1, 185}, + {0x0, 0, 1, 186}, + {0x0, 3, 4, 187}, + {0x0, 0, 4, 188}, + {0x0, 0, 16, 192}, + {0xd9, 16, 16, 208}, + {0xda, 16, 16, 208}, + {0xdb, 16, 16, 208}, + {0xdc, 16, 16, 208}, + {0x0, 0, 1, 208}, + {0x0, 0, 1, 209}, + {0x0, 3, 4, 210}, + {0x0, 0, 3, 211}, + {0x0, 0, 10, 214}, + {0xdd, 16, 16, 224}, + {0x0, 0, 16, 224}, + {0x0, 0, 1, 240}, + {0x0, 0, 1, 241}, + {0x0, 3, 4, 242}, + {0x0, 0, 3, 243}, + {0x0, 0, 16, 246}, + {0xe0, 16, 16, 262}, + {0xe1, 16, 16, 262}, + {0xe2, 16, 16, 262}, + {0xe3, 16, 16, 262}, + {0xe4, 16, 16, 262}, + {0xe5, 16, 16, 262}, + {0x0, 0, 1, 262}, + {0x0, 0, 1, 263}, + {0x0, 3, 4, 264}, + {0x0, 0, 3, 265}, + {0x0, 7, 8, 268}, + {0xe7, 16, 16, 269}, + {0x0, 0, 1, 269}, + {0x0, 0, 1, 270}, + {0x0, 3, 4, 271}, + {0x0, 0, 4, 272}, + {0x0, 0, 16, 276}, + {0xe8, 16, 16, 292}, + {0xe9, 16, 16, 292}, + {0xea, 16, 16, 292}, + {0xeb, 16, 16, 292}, + {0x0, 0, 1, 292}, + {0x0, 0, 1, 293}, + {0x0, 3, 4, 294}, + {0x0, 0, 4, 295}, + {0x0, 0, 16, 299}, + {0xec, 16, 16, 315}, + {0xed, 16, 16, 315}, + {0xee, 16, 16, 315}, + {0xef, 16, 16, 315}, + {0x0, 0, 1, 315}, + {0x0, 0, 1, 316}, + {0x0, 3, 4, 317}, + {0x0, 0, 4, 318}, + {0x0, 0, 13, 322}, + {0xf1, 16, 16, 335}, + {0x0, 0, 1, 335}, + {0x0, 0, 1, 336}, + {0x0, 3, 4, 337}, + {0x0, 0, 3, 338}, + {0x0, 0, 16, 341}, + {0xf2, 16, 16, 357}, + {0xf3, 16, 16, 357}, + {0xf4, 16, 16, 357}, + {0xf5, 16, 16, 357}, + {0xf6, 16, 16, 357}, + {0x0, 0, 11, 357}, + {0x0, 0, 1, 368}, + {0x0, 0, 1, 369}, + {0x0, 3, 4, 370}, + {0x0, 0, 4, 371}, + {0x0, 0, 16, 375}, + {0xf9, 16, 16, 391}, + {0xfa, 16, 16, 391}, + {0xfb, 16, 16, 391}, + {0xfc, 16, 16, 391}, + {0x0, 0, 1, 391}, + {0x0, 0, 1, 392}, + {0x0, 3, 4, 393}, + {0x0, 0, 3, 394}, + {0x0, 0, 11, 397}, + {0xfd, 16, 16, 408}, + {0xff, 16, 16, 408}, + {0x100, 16, 16, 408}, + {0x101, 16, 16, 408}, + {0x102, 16, 16, 408}, + {0x103, 16, 16, 408}, + {0x0, 3, 9, 408}, + {0x104, 16, 16, 414}, + {0x0, 3, 9, 414}, + {0x105, 16, 16, 420}, + {0x0, 1, 13, 420}, + {0x106, 16, 16, 432}, + {0x0, 1, 13, 432}, + {0x107, 16, 16, 444}, + {0x108, 16, 16, 444}, + {0x109, 16, 16, 444}, + {0x10a, 16, 16, 444}, + {0x10b, 16, 16, 444}, + {0x10c, 16, 16, 444}, + {0x10d, 16, 16, 444}, + {0x0, 0, 1, 444}, + {0x0, 0, 1, 445}, + {0x0, 3, 4, 446}, + {0x0, 0, 4, 447}, + {0x0, 7, 13, 451}, + {0x10e, 16, 16, 457}, + {0x0, 0, 1, 457}, + {0x0, 0, 1, 458}, + {0x0, 3, 4, 459}, + {0x0, 0, 4, 460}, + {0x0, 7, 13, 464}, + {0x10f, 16, 16, 470}, + {0x112, 16, 16, 470}, + {0x113, 16, 16, 470}, + {0x114, 16, 16, 470}, + {0x115, 16, 16, 470}, + {0x116, 16, 16, 470}, + {0x117, 16, 16, 470}, + {0x0, 3, 14, 470}, + {0x118, 16, 16, 481}, + {0x0, 3, 14, 481}, + {0x119, 16, 16, 492}, + {0x11a, 16, 16, 492}, + {0x11b, 16, 16, 492}, {0x0, 0, 1, 492}, - {0x0, 3, 4, 493}, - {0x0, 0, 1, 494}, - {0x0, 8, 9, 495}, - {0x1e7b, 16, 16, 496}, - {0x0, 1, 16, 496}, + {0x0, 0, 1, 493}, + {0x0, 3, 4, 494}, + {0x0, 0, 3, 495}, + {0x0, 1, 13, 498}, + {0x11c, 16, 16, 510}, + {0x0, 0, 1, 510}, {0x0, 0, 1, 511}, {0x0, 3, 4, 512}, - {0x0, 0, 1, 513}, - {0x0, 9, 10, 514}, - {0x0, 9, 10, 515}, - {0x30ba, 16, 16, 516}, - {0x2f995, 16, 16, 516}, - {0x0, 0, 15, 516}, - {0x0, 0, 15, 531}, - {0x0, 0, 1, 546}, + {0x0, 0, 3, 513}, + {0x0, 1, 13, 516}, + {0x11d, 16, 16, 528}, + {0x11e, 16, 16, 528}, + {0x11f, 16, 16, 528}, + {0x120, 16, 16, 528}, + {0x121, 16, 16, 528}, + {0x0, 7, 8, 528}, + {0x122, 16, 16, 529}, + {0x0, 7, 8, 529}, + {0x123, 16, 16, 530}, + {0x0, 0, 1, 530}, + {0x0, 0, 1, 531}, + {0x0, 3, 4, 532}, + {0x0, 0, 3, 533}, + {0x0, 2, 13, 536}, + {0x124, 16, 16, 547}, {0x0, 0, 1, 547}, - {0x0, 3, 4, 548}, - {0x0, 0, 1, 549}, - {0x0, 8, 9, 550}, - {0x4df, 16, 16, 551}, - {0x0, 0, 16, 551}, - {0x0, 7, 8, 567}, - {0x2f9d7, 16, 16, 568}, - {0x0, 0, 16, 568}, - {0x0, 14, 15, 584}, - {0x2f86b, 16, 16, 585}, - {0xf94a, 16, 16, 585}, - {0x0, 4, 14, 585}, - {0x0, 9, 13, 595}, - {0x0, 0, 1, 599}, - {0x0, 0, 1, 600}, - {0x0, 13, 14, 601}, - {0x0, 12, 13, 602}, - {0x0, 10, 11, 603}, - {0xddd, 16, 16, 604}, - {0x0, 2, 16, 604}, - {0x0, 1, 15, 618}, - {0xf91a, 16, 16, 632}, - {0x0, 0, 16, 632}, - {0x0, 1, 4, 648}, - {0x0, 9, 10, 651}, - {0x2f943, 16, 16, 652}, - {0x0, 0, 16, 652}, - {0x0, 10, 11, 668}, - {0x0, 8, 9, 669}, - {0x2f9d3, 16, 16, 670}, - {0x0, 3, 16, 670}, - {0x0, 1, 16, 683}, - {0x0, 0, 1, 698}, - {0x0, 0, 1, 699}, - {0x0, 3, 4, 700}, - {0x0, 0, 3, 701}, - {0x0, 1, 13, 704}, - {0x10c, 16, 16, 716}, - {0x0, 1, 16, 716}, - {0x0, 1, 2, 731}, - {0xf958, 16, 16, 732}, - {0x0, 0, 1, 732}, - {0x0, 0, 1, 733}, - {0x0, 3, 4, 734}, - {0x0, 0, 1, 735}, - {0x0, 0, 9, 736}, - {0x4e5, 16, 16, 745}, - {0x439, 16, 16, 745}, - {0x4e3, 16, 16, 745}, - {0x0, 2, 15, 745}, - {0x0, 12, 13, 758}, - {0x2f8c7, 16, 16, 759}, - {0x0, 0, 1, 759}, - {0x0, 3, 4, 760}, - {0x0, 0, 1, 761}, - {0x0, 9, 10, 762}, - {0x0, 9, 10, 763}, - {0x30b4, 16, 16, 764}, - {0x45d, 16, 16, 764}, - {0x0, 0, 16, 764}, - {0x0, 0, 1, 780}, - {0x0, 0, 1, 781}, - {0x0, 3, 4, 782}, - {0x0, 0, 3, 783}, - {0x0, 0, 10, 786}, - {0x1ee8, 16, 16, 796}, - {0x0, 0, 16, 796}, - {0x0, 0, 1, 812}, - {0x0, 0, 1, 813}, - {0x0, 3, 4, 814}, - {0x0, 0, 4, 815}, - {0x0, 3, 14, 819}, - {0x1eb9, 16, 16, 830}, - {0x1eee, 16, 16, 830}, - {0x229, 16, 16, 830}, - {0x1eec, 16, 16, 830}, - {0x119, 16, 16, 830}, - {0x2fa07, 16, 16, 830}, - {0x10a, 16, 16, 830}, - {0x106, 16, 16, 830}, - {0x108, 16, 16, 830}, - {0x0, 1, 16, 830}, - {0x0, 9, 10, 845}, - {0x2f90e, 16, 16, 846}, - {0x0, 0, 14, 846}, - {0x0, 1, 16, 860}, - {0x0, 0, 1, 875}, - {0x0, 0, 1, 876}, - {0x0, 3, 4, 877}, - {0x0, 0, 2, 878}, - {0x0, 4, 5, 880}, - {0x1f59, 16, 16, 881}, - {0x0, 6, 12, 881}, - {0x0, 14, 15, 887}, - {0x2f9f8, 16, 16, 888}, - {0x0, 0, 11, 888}, - {0x0, 0, 1, 899}, - {0x0, 0, 1, 900}, - {0x0, 3, 4, 901}, - {0x0, 0, 4, 902}, - {0x0, 1, 2, 906}, - {0x212, 16, 16, 907}, - {0x0, 0, 1, 907}, - {0x0, 0, 1, 908}, - {0x0, 3, 4, 909}, - {0x0, 0, 3, 910}, - {0x0, 1, 12, 913}, - {0x20f, 16, 16, 924}, - {0x0, 2, 14, 924}, - {0x0, 0, 1, 936}, - {0x0, 0, 1, 937}, - {0x0, 3, 4, 938}, - {0x0, 3, 4, 939}, - {0x0, 8, 9, 940}, - {0x22e1, 16, 16, 941}, - {0x0, 0, 15, 941}, - {0x0, 13, 14, 956}, - {0xf967, 16, 16, 957}, - {0x1e19, 16, 16, 957}, - {0x0, 1, 16, 957}, - {0x0, 10, 11, 972}, - {0xf9f0, 16, 16, 973}, - {0x0, 0, 15, 973}, - {0x0, 2, 3, 988}, - {0x2f807, 16, 16, 989}, - {0x0, 3, 15, 989}, - {0x0, 13, 14, 1001}, - {0x2f8b9, 16, 16, 1002}, - {0x0, 0, 1, 1002}, - {0x0, 0, 1, 1003}, - {0x0, 3, 4, 1004}, - {0x0, 0, 4, 1005}, - {0x0, 0, 16, 1009}, - {0x1d0, 16, 16, 1025}, - {0x0, 0, 14, 1025}, - {0x0, 9, 10, 1039}, - {0x2f974, 16, 16, 1040}, - {0x0, 1, 12, 1040}, - {0x0, 1, 5, 1051}, - {0x0, 5, 6, 1055}, - {0x2f91b, 16, 16, 1056}, + {0x0, 0, 1, 548}, + {0x0, 3, 4, 549}, + {0x0, 0, 4, 550}, + {0x0, 2, 13, 554}, + {0x125, 16, 16, 565}, + {0x128, 16, 16, 565}, + {0x129, 16, 16, 565}, + {0x12a, 16, 16, 565}, + {0x12b, 16, 16, 565}, + {0x12c, 16, 16, 565}, + {0x12d, 16, 16, 565}, + {0x0, 3, 9, 565}, + {0x12e, 16, 16, 571}, + {0x0, 3, 9, 571}, + {0x12f, 16, 16, 577}, + {0x130, 16, 16, 577}, + {0x0, 0, 1, 577}, + {0x0, 0, 1, 578}, + {0x0, 3, 4, 579}, + {0x0, 0, 1, 580}, + {0x0, 2, 3, 581}, + {0x134, 16, 16, 582}, + {0x0, 0, 1, 582}, + {0x0, 0, 1, 583}, + {0x0, 3, 4, 584}, + {0x0, 0, 1, 585}, + {0x0, 2, 13, 586}, + {0x135, 16, 16, 597}, + {0x212a, 0, 1, 597}, + {0x0, 0, 1, 598}, + {0x0, 3, 4, 599}, + {0x0, 0, 4, 600}, + {0x0, 3, 8, 604}, + {0x136, 16, 16, 609}, + {0x0, 0, 1, 609}, + {0x0, 0, 1, 610}, + {0x0, 3, 4, 611}, + {0x0, 0, 4, 612}, + {0x0, 3, 8, 616}, + {0x137, 16, 16, 621}, + {0x0, 0, 1, 621}, + {0x0, 0, 1, 622}, + {0x0, 3, 4, 623}, + {0x0, 0, 4, 624}, + {0x0, 1, 13, 628}, + {0x139, 16, 16, 640}, + {0x0, 0, 1, 640}, + {0x0, 0, 1, 641}, + {0x0, 3, 4, 642}, + {0x0, 0, 4, 643}, + {0x0, 1, 13, 647}, + {0x13a, 16, 16, 659}, + {0x0, 3, 14, 659}, + {0x13b, 16, 16, 670}, + {0x0, 3, 14, 670}, + {0x13c, 16, 16, 681}, + {0x13d, 16, 16, 681}, + {0x13e, 16, 16, 681}, + {0x143, 16, 16, 681}, + {0x144, 16, 16, 681}, + {0x0, 3, 14, 681}, + {0x145, 16, 16, 692}, + {0x0, 3, 14, 692}, + {0x146, 16, 16, 703}, + {0x147, 16, 16, 703}, + {0x148, 16, 16, 703}, + {0x14c, 16, 16, 703}, + {0x14d, 16, 16, 703}, + {0x14e, 16, 16, 703}, + {0x14f, 16, 16, 703}, + {0x150, 16, 16, 703}, + {0x151, 16, 16, 703}, + {0x0, 0, 1, 703}, + {0x0, 0, 1, 704}, + {0x0, 3, 4, 705}, + {0x0, 0, 4, 706}, + {0x0, 1, 16, 710}, + {0x154, 16, 16, 725}, + {0x0, 0, 1, 725}, + {0x0, 0, 1, 726}, + {0x0, 3, 4, 727}, + {0x0, 0, 4, 728}, + {0x0, 1, 16, 732}, + {0x155, 16, 16, 747}, + {0x0, 3, 8, 747}, + {0x156, 16, 16, 752}, + {0x0, 3, 8, 752}, + {0x157, 16, 16, 757}, + {0x158, 16, 16, 757}, + {0x159, 16, 16, 757}, + {0x0, 0, 1, 757}, + {0x0, 0, 1, 758}, + {0x0, 3, 4, 759}, + {0x0, 0, 3, 760}, + {0x0, 1, 13, 763}, + {0x15a, 16, 16, 775}, + {0x0, 0, 1, 775}, + {0x0, 0, 1, 776}, + {0x0, 3, 4, 777}, + {0x0, 0, 3, 778}, + {0x0, 1, 13, 781}, + {0x15b, 16, 16, 793}, + {0x15c, 16, 16, 793}, + {0x15d, 16, 16, 793}, + {0x0, 3, 8, 793}, + {0x15e, 16, 16, 798}, + {0x0, 3, 8, 798}, + {0x15f, 16, 16, 803}, + {0x160, 16, 16, 803}, + {0x161, 16, 16, 803}, + {0x0, 0, 1, 803}, + {0x0, 0, 1, 804}, + {0x0, 3, 4, 805}, + {0x0, 0, 4, 806}, + {0x0, 3, 14, 810}, + {0x162, 16, 16, 821}, + {0x0, 0, 1, 821}, + {0x0, 0, 1, 822}, + {0x0, 3, 4, 823}, + {0x0, 0, 4, 824}, + {0x0, 3, 14, 828}, + {0x163, 16, 16, 839}, + {0x0, 7, 13, 839}, + {0x164, 16, 16, 845}, + {0x0, 7, 13, 845}, + {0x165, 16, 16, 851}, + {0x168, 16, 16, 851}, + {0x169, 16, 16, 851}, + {0x16a, 16, 16, 851}, + {0x16b, 16, 16, 851}, + {0x16c, 16, 16, 851}, + {0x16d, 16, 16, 851}, + {0x16e, 16, 16, 851}, + {0x16f, 16, 16, 851}, + {0x170, 16, 16, 851}, + {0x171, 16, 16, 851}, + {0x0, 3, 14, 851}, + {0x172, 16, 16, 862}, + {0x0, 3, 14, 862}, + {0x173, 16, 16, 873}, + {0x0, 0, 1, 873}, + {0x0, 0, 1, 874}, + {0x0, 3, 4, 875}, + {0x0, 0, 3, 876}, + {0x0, 0, 9, 879}, + {0x174, 16, 16, 888}, + {0x0, 0, 1, 888}, + {0x0, 0, 1, 889}, + {0x0, 3, 4, 890}, + {0x0, 0, 3, 891}, + {0x0, 0, 11, 894}, + {0x175, 16, 16, 905}, + {0x176, 16, 16, 905}, + {0x177, 16, 16, 905}, + {0x178, 16, 16, 905}, + {0x0, 0, 1, 905}, + {0x0, 0, 1, 906}, + {0x0, 3, 4, 907}, + {0x0, 0, 4, 908}, + {0x0, 1, 13, 912}, + {0x179, 16, 16, 924}, + {0x0, 0, 1, 924}, + {0x0, 0, 1, 925}, + {0x0, 3, 4, 926}, + {0x0, 0, 4, 927}, + {0x0, 1, 13, 931}, + {0x17a, 16, 16, 943}, + {0x17b, 16, 16, 943}, + {0x17c, 16, 16, 943}, + {0x17d, 16, 16, 943}, + {0x17e, 16, 16, 943}, + {0x0, 1, 12, 943}, + {0x1a0, 16, 16, 954}, + {0x0, 1, 12, 954}, + {0x1a1, 16, 16, 965}, + {0x0, 1, 12, 965}, + {0x1af, 16, 16, 976}, + {0x0, 1, 12, 976}, + {0x1b0, 16, 16, 987}, + {0x1cd, 16, 16, 987}, + {0x1ce, 16, 16, 987}, + {0x1cf, 16, 16, 987}, + {0x1d0, 16, 16, 987}, + {0x1d1, 16, 16, 987}, + {0x1d2, 16, 16, 987}, + {0x1d3, 16, 16, 987}, + {0x1d4, 16, 16, 987}, + {0x0, 4, 13, 987}, + {0x0, 0, 1, 996}, + {0x0, 0, 1, 997}, + {0x0, 3, 4, 998}, + {0x0, 0, 1, 999}, + {0x0, 0, 13, 1000}, + {0x1d5, 16, 16, 1013}, + {0x0, 4, 13, 1013}, + {0x0, 0, 1, 1022}, + {0x0, 0, 1, 1023}, + {0x0, 3, 4, 1024}, + {0x0, 0, 1, 1025}, + {0x0, 0, 13, 1026}, + {0x1d6, 16, 16, 1039}, + {0x1d7, 16, 16, 1039}, + {0x1d8, 16, 16, 1039}, + {0x1d9, 16, 16, 1039}, + {0x1da, 16, 16, 1039}, + {0x1db, 16, 16, 1039}, + {0x1dc, 16, 16, 1039}, + {0x0, 2, 16, 1039}, + {0x0, 0, 1, 1053}, + {0x0, 0, 1, 1054}, + {0x0, 3, 4, 1055}, {0x0, 0, 1, 1056}, - {0x0, 0, 1, 1057}, - {0x0, 3, 4, 1058}, - {0x0, 3, 4, 1059}, - {0x0, 8, 9, 1060}, - {0x22e0, 16, 16, 1061}, - {0x0, 0, 16, 1061}, - {0x0, 1, 11, 1077}, - {0x2f82e, 16, 16, 1087}, - {0x0, 0, 16, 1087}, + {0x0, 4, 5, 1057}, + {0x1de, 16, 16, 1058}, + {0x0, 2, 16, 1058}, + {0x0, 0, 1, 1072}, + {0x0, 0, 1, 1073}, + {0x0, 3, 4, 1074}, + {0x0, 0, 1, 1075}, + {0x0, 4, 5, 1076}, + {0x1df, 16, 16, 1077}, + {0x0, 2, 12, 1077}, + {0x0, 6, 16, 1087}, + {0x0, 0, 1, 1097}, + {0x0, 0, 1, 1098}, + {0x0, 3, 4, 1099}, + {0x0, 0, 1, 1100}, + {0x0, 4, 5, 1101}, + {0x1e0, 16, 16, 1102}, + {0x0, 0, 1, 1102}, {0x0, 0, 1, 1103}, - {0x0, 0, 1, 1104}, - {0x0, 3, 4, 1105}, - {0x0, 0, 2, 1106}, - {0x0, 3, 5, 1108}, - {0x1f19, 16, 16, 1110}, - {0x0, 0, 10, 1110}, - {0x0, 9, 10, 1120}, - {0x2f8ce, 16, 16, 1121}, - {0x1f18, 16, 16, 1121}, - {0x0, 1, 15, 1121}, - {0x1f7d, 0, 1, 1135}, - {0x0, 0, 1, 1136}, - {0x0, 3, 4, 1137}, - {0x0, 4, 5, 1138}, - {0x0, 5, 6, 1139}, - {0x1ff4, 16, 16, 1140}, - {0x0, 0, 16, 1140}, - {0x0, 9, 10, 1156}, - {0xf9dd, 16, 16, 1157}, - {0x0, 1, 14, 1157}, - {0x2f991, 16, 16, 1170}, - {0x0, 2, 16, 1170}, - {0x0, 3, 4, 1184}, - {0xfa0b, 16, 16, 1185}, - {0x0, 6, 16, 1185}, + {0x0, 3, 4, 1104}, + {0x0, 0, 1, 1105}, + {0x0, 4, 5, 1106}, + {0x1e1, 16, 16, 1107}, + {0x0, 0, 1, 1107}, + {0x0, 0, 1, 1108}, + {0x0, 3, 4, 1109}, + {0x0, 0, 1, 1110}, + {0x0, 1, 5, 1111}, + {0x1e2, 16, 16, 1115}, + {0x0, 0, 1, 1115}, + {0x0, 0, 1, 1116}, + {0x0, 3, 4, 1117}, + {0x0, 0, 1, 1118}, + {0x0, 1, 5, 1119}, + {0x1e3, 16, 16, 1123}, + {0x1e6, 16, 16, 1123}, + {0x1e7, 16, 16, 1123}, + {0x0, 1, 13, 1123}, + {0x1e8, 16, 16, 1135}, + {0x0, 1, 13, 1135}, + {0x1e9, 16, 16, 1147}, + {0x0, 3, 9, 1147}, + {0x1ea, 16, 16, 1153}, + {0x0, 3, 9, 1153}, + {0x1eb, 16, 16, 1159}, + {0x0, 0, 15, 1159}, + {0x0, 10, 12, 1174}, + {0x0, 0, 1, 1176}, + {0x0, 0, 1, 1177}, + {0x0, 3, 4, 1178}, + {0x0, 0, 1, 1179}, + {0x0, 4, 5, 1180}, + {0x1ec, 16, 16, 1181}, + {0x0, 0, 1, 1181}, + {0x0, 0, 1, 1182}, + {0x0, 3, 4, 1183}, + {0x0, 0, 1, 1184}, + {0x0, 4, 5, 1185}, + {0x1ed, 16, 16, 1186}, + {0x0, 0, 8, 1186}, + {0x0, 0, 1, 1194}, {0x0, 0, 1, 1195}, - {0x0, 0, 1, 1196}, - {0x0, 3, 4, 1197}, - {0x0, 0, 5, 1198}, - {0x0, 2, 3, 1203}, - {0x1fcf, 16, 16, 1204}, - {0x0, 0, 15, 1204}, - {0x0, 8, 9, 1219}, - {0x2f9bc, 16, 16, 1220}, - {0x0, 6, 7, 1220}, - {0x0, 3, 4, 1221}, - {0x2f838, 16, 16, 1222}, - {0x0, 0, 7, 1222}, - {0x0, 9, 10, 1229}, - {0x0, 2, 3, 1230}, - {0x2f88f, 16, 16, 1231}, - {0x0, 2, 6, 1231}, - {0x0, 0, 1, 1235}, + {0x0, 3, 4, 1196}, + {0x0, 0, 1, 1197}, + {0x0, 12, 13, 1198}, + {0x1ee, 16, 16, 1199}, + {0x0, 2, 3, 1199}, + {0x0, 0, 1, 1200}, + {0x0, 0, 1, 1201}, + {0x0, 3, 4, 1202}, + {0x0, 0, 1, 1203}, + {0x0, 12, 13, 1204}, + {0x1ef, 16, 16, 1205}, + {0x1f0, 16, 16, 1205}, + {0x1f4, 16, 16, 1205}, + {0x1f5, 16, 16, 1205}, + {0x1f8, 16, 16, 1205}, + {0x1f9, 16, 16, 1205}, + {0x212b, 0, 1, 1205}, + {0x0, 0, 1, 1206}, + {0x0, 3, 4, 1207}, + {0x0, 0, 1, 1208}, + {0x0, 1, 2, 1209}, + {0x1fa, 16, 16, 1210}, + {0x0, 0, 1, 1210}, + {0x0, 0, 1, 1211}, + {0x0, 3, 4, 1212}, + {0x0, 0, 1, 1213}, + {0x0, 1, 2, 1214}, + {0x1fb, 16, 16, 1215}, + {0x1fc, 16, 16, 1215}, + {0x1fd, 16, 16, 1215}, + {0x0, 0, 1, 1215}, + {0x0, 0, 1, 1216}, + {0x0, 3, 4, 1217}, + {0x0, 0, 1, 1218}, + {0x0, 1, 2, 1219}, + {0x1fe, 16, 16, 1220}, + {0x0, 0, 1, 1220}, + {0x0, 0, 1, 1221}, + {0x0, 3, 4, 1222}, + {0x0, 0, 1, 1223}, + {0x0, 1, 2, 1224}, + {0x1ff, 16, 16, 1225}, + {0x200, 16, 16, 1225}, + {0x201, 16, 16, 1225}, + {0x0, 1, 2, 1225}, + {0x202, 16, 16, 1226}, + {0x0, 1, 2, 1226}, + {0x203, 16, 16, 1227}, + {0x204, 16, 16, 1227}, + {0x205, 16, 16, 1227}, + {0x0, 1, 2, 1227}, + {0x206, 16, 16, 1228}, + {0x0, 1, 2, 1228}, + {0x207, 16, 16, 1229}, + {0x208, 16, 16, 1229}, + {0x209, 16, 16, 1229}, + {0x0, 1, 2, 1229}, + {0x20a, 16, 16, 1230}, + {0x0, 1, 2, 1230}, + {0x20b, 16, 16, 1231}, + {0x20c, 16, 16, 1231}, + {0x20d, 16, 16, 1231}, + {0x20e, 16, 16, 1231}, + {0x20f, 16, 16, 1231}, + {0x210, 16, 16, 1231}, + {0x211, 16, 16, 1231}, + {0x0, 1, 2, 1231}, + {0x212, 16, 16, 1232}, + {0x0, 1, 2, 1232}, + {0x213, 16, 16, 1233}, + {0x214, 16, 16, 1233}, + {0x215, 16, 16, 1233}, + {0x216, 16, 16, 1233}, + {0x217, 16, 16, 1233}, + {0x218, 16, 16, 1233}, + {0x219, 16, 16, 1233}, + {0x21a, 16, 16, 1233}, + {0x21b, 16, 16, 1233}, + {0x21e, 16, 16, 1233}, + {0x21f, 16, 16, 1233}, + {0x226, 16, 16, 1233}, + {0x227, 16, 16, 1233}, + {0x228, 16, 16, 1233}, + {0x229, 16, 16, 1233}, + {0x0, 0, 1, 1233}, + {0x0, 0, 1, 1234}, + {0x0, 3, 4, 1235}, {0x0, 0, 1, 1236}, - {0x0, 3, 4, 1237}, - {0x0, 3, 4, 1238}, - {0x0, 8, 9, 1239}, - {0x22ec, 16, 16, 1240}, - {0x0, 0, 7, 1240}, - {0x2f88d, 16, 16, 1247}, - {0x0, 4, 16, 1247}, - {0x0, 14, 15, 1259}, - {0xfa3f, 16, 16, 1260}, - {0x2f98f, 16, 16, 1260}, - {0x0, 8, 12, 1260}, - {0x0, 11, 12, 1264}, - {0x2f9ee, 16, 16, 1265}, - {0xfa35, 16, 16, 1265}, - {0x0, 0, 1, 1265}, - {0x0, 0, 1, 1266}, - {0x0, 3, 4, 1267}, - {0x0, 0, 3, 1268}, - {0x0, 1, 2, 1271}, - {0x203, 16, 16, 1272}, - {0x0, 6, 8, 1272}, - {0x0, 0, 1, 1274}, + {0x0, 4, 5, 1237}, + {0x22a, 16, 16, 1238}, + {0x0, 0, 1, 1238}, + {0x0, 0, 1, 1239}, + {0x0, 3, 4, 1240}, + {0x0, 0, 1, 1241}, + {0x0, 4, 5, 1242}, + {0x22b, 16, 16, 1243}, + {0x0, 0, 1, 1243}, + {0x0, 0, 1, 1244}, + {0x0, 3, 4, 1245}, + {0x0, 0, 1, 1246}, + {0x0, 1, 9, 1247}, + {0x22c, 16, 16, 1255}, + {0x0, 0, 1, 1255}, + {0x0, 0, 1, 1256}, + {0x0, 3, 4, 1257}, + {0x0, 0, 1, 1258}, + {0x0, 1, 9, 1259}, + {0x22d, 16, 16, 1267}, + {0x22e, 16, 16, 1267}, + {0x22f, 16, 16, 1267}, + {0x0, 0, 1, 1267}, + {0x0, 0, 1, 1268}, + {0x0, 3, 4, 1269}, + {0x0, 0, 1, 1270}, + {0x0, 4, 5, 1271}, + {0x230, 16, 16, 1272}, + {0x0, 0, 1, 1272}, + {0x0, 0, 1, 1273}, + {0x0, 3, 4, 1274}, {0x0, 0, 1, 1275}, - {0x0, 13, 14, 1276}, - {0x0, 3, 6, 1277}, - {0x0, 7, 8, 1280}, - {0xd4c, 16, 16, 1281}, - {0x0, 0, 15, 1281}, - {0x0, 2, 3, 1296}, - {0xfa20, 16, 16, 1297}, - {0x0, 3, 13, 1297}, - {0x0, 0, 2, 1307}, - {0x0, 0, 1, 1309}, - {0x0, 0, 1, 1310}, - {0x0, 3, 4, 1311}, + {0x0, 4, 5, 1276}, + {0x231, 16, 16, 1277}, + {0x232, 16, 16, 1277}, + {0x233, 16, 16, 1277}, + {0x0, 0, 14, 1277}, + {0x0, 0, 9, 1291}, + {0x340, 16, 16, 1300}, + {0x341, 16, 16, 1300}, + {0x0, 3, 4, 1300}, + {0x343, 16, 16, 1301}, + {0x0, 0, 1, 1301}, + {0x0, 0, 1, 1302}, + {0x0, 3, 4, 1303}, + {0x0, 0, 1, 1304}, + {0x0, 1, 2, 1305}, + {0x344, 16, 16, 1306}, + {0x0, 9, 10, 1306}, + {0x374, 16, 16, 1307}, + {0x0, 11, 15, 1307}, + {0x37e, 16, 16, 1311}, + {0x0, 8, 9, 1311}, {0x0, 0, 1, 1312}, - {0x0, 2, 7, 1313}, - {0x1eac, 16, 16, 1318}, - {0x0, 0, 16, 1318}, - {0x0, 3, 4, 1334}, - {0x2f874, 16, 16, 1335}, - {0x1eb6, 16, 16, 1335}, - {0x0, 0, 1, 1335}, - {0x0, 0, 1, 1336}, - {0x0, 3, 4, 1337}, - {0x0, 4, 5, 1338}, - {0x0, 5, 6, 1339}, - {0x1f9c, 16, 16, 1340}, - {0x0, 2, 12, 1340}, - {0x0, 6, 16, 1350}, - {0x0, 0, 1, 1360}, - {0x0, 0, 1, 1361}, - {0x0, 3, 4, 1362}, - {0x0, 0, 1, 1363}, - {0x0, 6, 7, 1364}, - {0x1e1d, 16, 16, 1365}, - {0x0, 1, 14, 1365}, - {0x0, 0, 14, 1378}, - {0x2f918, 16, 16, 1392}, - {0x0, 2, 14, 1392}, - {0x0, 9, 10, 1404}, - {0x2f975, 16, 16, 1405}, - {0x0, 1, 10, 1405}, - {0x0, 11, 12, 1414}, - {0xfa0a, 16, 16, 1415}, - {0x0, 0, 16, 1415}, - {0x0, 2, 4, 1431}, - {0xf992, 16, 16, 1433}, - {0xfa47, 16, 16, 1433}, - {0x0, 2, 15, 1433}, - {0x0, 13, 16, 1446}, - {0xfa53, 16, 16, 1449}, - {0xfa52, 16, 16, 1449}, - {0xfa1b, 16, 16, 1449}, + {0x0, 0, 1, 1313}, + {0x0, 3, 4, 1314}, + {0x0, 0, 5, 1315}, + {0x0, 0, 2, 1320}, + {0x385, 16, 16, 1322}, + {0x0, 0, 16, 1322}, + {0x0, 0, 1, 1338}, + {0x0, 0, 1, 1339}, + {0x0, 3, 4, 1340}, + {0x0, 0, 5, 1341}, + {0x0, 0, 7, 1346}, + {0x386, 16, 16, 1353}, + {0x0, 4, 8, 1353}, + {0x387, 16, 16, 1357}, + {0x0, 0, 1, 1357}, + {0x0, 0, 1, 1358}, + {0x0, 3, 4, 1359}, + {0x0, 0, 2, 1360}, + {0x0, 0, 2, 1362}, + {0x388, 16, 16, 1364}, + {0x0, 0, 1, 1364}, + {0x0, 0, 1, 1365}, + {0x0, 3, 4, 1366}, + {0x0, 0, 5, 1367}, + {0x0, 0, 2, 1372}, + {0x389, 16, 16, 1374}, + {0x0, 0, 1, 1374}, + {0x0, 0, 1, 1375}, + {0x0, 3, 4, 1376}, + {0x0, 0, 2, 1377}, + {0x0, 0, 9, 1379}, + {0x38a, 16, 16, 1388}, + {0x0, 0, 1, 1388}, + {0x0, 0, 1, 1389}, + {0x0, 3, 4, 1390}, + {0x0, 0, 2, 1391}, + {0x0, 0, 2, 1393}, + {0x38c, 16, 16, 1395}, + {0x0, 1, 16, 1395}, + {0x0, 0, 1, 1410}, + {0x0, 0, 1, 1411}, + {0x0, 3, 4, 1412}, + {0x0, 0, 2, 1413}, + {0x0, 0, 9, 1415}, + {0x38e, 16, 16, 1424}, + {0x2126, 0, 1, 1424}, + {0x0, 0, 1, 1425}, + {0x0, 3, 4, 1426}, + {0x0, 0, 5, 1427}, + {0x0, 0, 2, 1432}, + {0x38f, 16, 16, 1434}, + {0x0, 1, 15, 1434}, + {0x0, 0, 1, 1448}, {0x0, 0, 1, 1449}, {0x0, 3, 4, 1450}, - {0x0, 0, 1, 1451}, - {0x0, 9, 10, 1452}, - {0x0, 9, 10, 1453}, - {0x30b2, 16, 16, 1454}, - {0x0, 0, 1, 1454}, - {0x0, 0, 1, 1455}, - {0x0, 3, 4, 1456}, - {0x0, 0, 5, 1457}, - {0x0, 0, 2, 1462}, - {0x1fca, 16, 16, 1464}, - {0x389, 16, 16, 1464}, - {0x0, 1, 16, 1464}, - {0x0, 12, 13, 1479}, - {0x2f93e, 16, 16, 1480}, - {0x0, 3, 15, 1480}, - {0x0, 3, 9, 1492}, - {0x2f968, 16, 16, 1498}, - {0x0, 0, 1, 1498}, - {0x0, 0, 1, 1499}, - {0x0, 3, 4, 1500}, - {0x0, 0, 5, 1501}, - {0x0, 2, 6, 1506}, - {0x1f2e, 16, 16, 1510}, - {0x1f98, 16, 16, 1510}, - {0x0, 6, 12, 1510}, - {0x0, 0, 1, 1516}, - {0x2f804, 16, 16, 1517}, - {0x2f919, 16, 16, 1517}, - {0x2f835, 16, 16, 1517}, - {0x0, 1, 2, 1517}, - {0x0, 5, 6, 1518}, - {0x2f824, 16, 16, 1519}, - {0x0, 0, 16, 1519}, - {0x1fe3, 16, 16, 1535}, - {0x0, 2, 4, 1535}, - {0x0, 0, 1, 1537}, - {0x0, 0, 1, 1538}, - {0x0, 3, 4, 1539}, - {0x0, 0, 1, 1540}, - {0x0, 7, 8, 1541}, - {0x1e69, 16, 16, 1542}, - {0x1fbe, 0, 1, 1542}, - {0x0, 0, 16, 1543}, + {0x0, 0, 5, 1451}, + {0x0, 0, 2, 1456}, + {0x390, 16, 16, 1458}, + {0x3aa, 16, 16, 1458}, + {0x3ab, 16, 16, 1458}, + {0x0, 0, 16, 1458}, + {0x0, 0, 1, 1474}, + {0x0, 0, 1, 1475}, + {0x0, 3, 4, 1476}, + {0x0, 0, 5, 1477}, + {0x0, 0, 7, 1482}, + {0x3ac, 16, 16, 1489}, + {0x0, 0, 1, 1489}, + {0x0, 0, 1, 1490}, + {0x0, 3, 4, 1491}, + {0x0, 0, 2, 1492}, + {0x0, 0, 2, 1494}, + {0x3ad, 16, 16, 1496}, + {0x0, 0, 1, 1496}, + {0x0, 0, 1, 1497}, + {0x0, 3, 4, 1498}, + {0x0, 0, 5, 1499}, + {0x0, 0, 2, 1504}, + {0x3ae, 16, 16, 1506}, + {0x1fbe, 0, 1, 1506}, + {0x0, 0, 1, 1507}, + {0x0, 3, 4, 1508}, + {0x0, 0, 5, 1509}, + {0x0, 0, 9, 1514}, + {0x3af, 16, 16, 1523}, + {0x0, 0, 1, 1523}, + {0x0, 0, 1, 1524}, + {0x0, 3, 4, 1525}, + {0x0, 0, 5, 1526}, + {0x0, 0, 2, 1531}, + {0x3b0, 16, 16, 1533}, + {0x3ca, 16, 16, 1533}, + {0x0, 0, 1, 1533}, + {0x0, 0, 1, 1534}, + {0x0, 3, 4, 1535}, + {0x0, 0, 5, 1536}, + {0x0, 0, 9, 1541}, + {0x3cb, 16, 16, 1550}, + {0x0, 0, 1, 1550}, + {0x0, 0, 1, 1551}, + {0x0, 3, 4, 1552}, + {0x0, 0, 2, 1553}, + {0x0, 0, 2, 1555}, + {0x3cc, 16, 16, 1557}, + {0x3cd, 16, 16, 1557}, + {0x0, 0, 1, 1557}, + {0x0, 0, 1, 1558}, {0x0, 3, 4, 1559}, - {0x2f96c, 16, 16, 1560}, - {0x0, 0, 15, 1560}, - {0x0, 10, 11, 1575}, - {0x2f85d, 16, 16, 1576}, - {0x0, 3, 11, 1576}, - {0x2f836, 16, 16, 1584}, - {0x0, 12, 13, 1584}, - {0x2f92f, 16, 16, 1585}, - {0x0, 0, 10, 1585}, - {0x0, 0, 1, 1595}, - {0x0, 0, 1, 1596}, - {0x0, 3, 4, 1597}, - {0x0, 0, 5, 1598}, - {0x0, 2, 3, 1603}, - {0x1f5f, 16, 16, 1604}, - {0x0, 2, 3, 1604}, - {0x0, 15, 16, 1605}, - {0x2f9d8, 16, 16, 1606}, - {0x0, 1, 16, 1606}, - {0x0, 0, 12, 1621}, - {0xf932, 16, 16, 1633}, - {0x0, 0, 16, 1633}, - {0x0, 11, 12, 1649}, - {0xfa6a, 16, 16, 1650}, - {0x0, 2, 16, 1650}, - {0x0, 2, 4, 1664}, - {0xfa68, 16, 16, 1666}, - {0x0, 2, 16, 1666}, - {0x212b, 0, 1, 1680}, - {0x0, 0, 1, 1681}, - {0x0, 3, 4, 1682}, - {0x0, 0, 1, 1683}, - {0x0, 1, 2, 1684}, - {0x1fa, 16, 16, 1685}, - {0x0, 1, 16, 1685}, - {0x0, 0, 1, 1700}, - {0x0, 3, 4, 1701}, - {0x0, 0, 1, 1702}, - {0x0, 9, 10, 1703}, - {0x0, 9, 10, 1704}, - {0x30c9, 16, 16, 1705}, - {0xf9ea, 16, 16, 1705}, - {0x0, 2, 16, 1705}, + {0x0, 0, 5, 1560}, + {0x0, 0, 2, 1565}, + {0x3ce, 16, 16, 1567}, + {0x0, 2, 3, 1567}, + {0x0, 0, 1, 1568}, + {0x0, 0, 1, 1569}, + {0x0, 3, 4, 1570}, + {0x0, 0, 1, 1571}, + {0x0, 1, 9, 1572}, + {0x3d3, 16, 16, 1580}, + {0x3d4, 16, 16, 1580}, + {0x0, 0, 15, 1580}, + {0x0, 0, 15, 1595}, + {0x0, 0, 1, 1610}, + {0x0, 0, 1, 1611}, + {0x0, 3, 4, 1612}, + {0x0, 0, 1, 1613}, + {0x0, 0, 9, 1614}, + {0x400, 16, 16, 1623}, + {0x401, 16, 16, 1623}, + {0x0, 0, 1, 1623}, + {0x0, 0, 1, 1624}, + {0x0, 3, 4, 1625}, + {0x0, 0, 1, 1626}, + {0x0, 1, 2, 1627}, + {0x403, 16, 16, 1628}, + {0x0, 6, 7, 1628}, + {0x0, 0, 1, 1629}, + {0x0, 0, 1, 1630}, + {0x0, 3, 4, 1631}, + {0x0, 0, 1, 1632}, + {0x0, 8, 9, 1633}, + {0x407, 16, 16, 1634}, + {0x0, 0, 1, 1634}, + {0x0, 0, 1, 1635}, + {0x0, 3, 4, 1636}, + {0x0, 0, 1, 1637}, + {0x0, 1, 2, 1638}, + {0x40c, 16, 16, 1639}, + {0x0, 0, 1, 1639}, + {0x0, 0, 1, 1640}, + {0x0, 3, 4, 1641}, + {0x0, 0, 1, 1642}, + {0x0, 0, 9, 1643}, + {0x40d, 16, 16, 1652}, + {0x0, 3, 14, 1652}, + {0x0, 0, 1, 1663}, + {0x0, 0, 1, 1664}, + {0x0, 3, 4, 1665}, + {0x0, 0, 1, 1666}, + {0x0, 4, 12, 1667}, + {0x40e, 16, 16, 1675}, + {0x419, 16, 16, 1675}, + {0x0, 0, 15, 1675}, + {0x0, 0, 1, 1690}, + {0x0, 0, 1, 1691}, + {0x0, 3, 4, 1692}, + {0x0, 0, 1, 1693}, + {0x0, 0, 9, 1694}, + {0x439, 16, 16, 1703}, + {0x0, 0, 1, 1703}, + {0x0, 0, 1, 1704}, + {0x0, 3, 4, 1705}, + {0x0, 0, 1, 1706}, + {0x0, 0, 9, 1707}, + {0x450, 16, 16, 1716}, + {0x451, 16, 16, 1716}, + {0x0, 0, 1, 1716}, + {0x0, 0, 1, 1717}, + {0x0, 3, 4, 1718}, {0x0, 0, 1, 1719}, - {0x0, 0, 1, 1720}, - {0x0, 3, 4, 1721}, + {0x0, 1, 2, 1720}, + {0x453, 16, 16, 1721}, + {0x0, 6, 7, 1721}, {0x0, 0, 1, 1722}, - {0x0, 1, 2, 1723}, - {0x1e09, 16, 16, 1724}, - {0x0, 1, 11, 1724}, - {0x0, 2, 3, 1734}, - {0x2f8e1, 16, 16, 1735}, - {0x0, 0, 14, 1735}, - {0x0, 0, 1, 1749}, - {0x0, 3, 4, 1750}, - {0x0, 0, 1, 1751}, - {0x0, 9, 10, 1752}, - {0x0, 9, 10, 1753}, - {0x30f9, 16, 16, 1754}, - {0x0, 13, 14, 1754}, - {0xf986, 16, 16, 1755}, - {0x0, 0, 1, 1755}, - {0x0, 0, 1, 1756}, - {0x0, 3, 4, 1757}, - {0x0, 0, 4, 1758}, - {0x0, 7, 8, 1762}, - {0x1e03, 16, 16, 1763}, + {0x0, 0, 1, 1723}, + {0x0, 3, 4, 1724}, + {0x0, 0, 1, 1725}, + {0x0, 8, 9, 1726}, + {0x457, 16, 16, 1727}, + {0x0, 0, 1, 1727}, + {0x0, 0, 1, 1728}, + {0x0, 3, 4, 1729}, + {0x0, 0, 1, 1730}, + {0x0, 1, 2, 1731}, + {0x45c, 16, 16, 1732}, + {0x45d, 16, 16, 1732}, + {0x0, 3, 14, 1732}, + {0x0, 0, 1, 1743}, + {0x0, 0, 1, 1744}, + {0x0, 3, 4, 1745}, + {0x0, 0, 1, 1746}, + {0x0, 4, 12, 1747}, + {0x45e, 16, 16, 1755}, + {0x0, 4, 6, 1755}, + {0x0, 0, 1, 1757}, + {0x0, 0, 1, 1758}, + {0x0, 3, 4, 1759}, + {0x0, 0, 1, 1760}, + {0x0, 15, 16, 1761}, + {0x476, 16, 16, 1762}, + {0x0, 0, 1, 1762}, {0x0, 0, 1, 1763}, - {0x0, 0, 1, 1764}, - {0x0, 3, 4, 1765}, - {0x0, 0, 1, 1766}, - {0x0, 1, 5, 1767}, - {0x1fd, 16, 16, 1771}, - {0x0, 0, 1, 1771}, - {0x0, 0, 1, 1772}, - {0x0, 3, 4, 1773}, - {0x0, 3, 4, 1774}, - {0x0, 8, 9, 1775}, - {0x2281, 16, 16, 1776}, - {0x1e3, 16, 16, 1776}, - {0x0, 2, 12, 1776}, - {0x0, 0, 1, 1786}, - {0x0, 0, 1, 1787}, - {0x0, 3, 4, 1788}, - {0x0, 3, 4, 1789}, - {0x0, 8, 9, 1790}, - {0x22af, 16, 16, 1791}, - {0xf96b, 16, 16, 1791}, - {0x0, 2, 16, 1791}, - {0x0, 3, 10, 1805}, - {0x0, 2, 3, 1812}, - {0x2f937, 16, 16, 1813}, - {0x0, 2, 12, 1813}, - {0x0, 2, 3, 1823}, - {0xf98d, 16, 16, 1824}, - {0x0, 6, 16, 1824}, + {0x0, 3, 4, 1764}, + {0x0, 0, 1, 1765}, + {0x0, 15, 16, 1766}, + {0x477, 16, 16, 1767}, + {0x0, 0, 1, 1767}, + {0x0, 0, 1, 1768}, + {0x0, 3, 4, 1769}, + {0x0, 0, 1, 1770}, + {0x0, 6, 9, 1771}, + {0x4c1, 16, 16, 1774}, + {0x0, 0, 1, 1774}, + {0x0, 0, 1, 1775}, + {0x0, 3, 4, 1776}, + {0x0, 0, 1, 1777}, + {0x0, 6, 9, 1778}, + {0x4c2, 16, 16, 1781}, + {0x0, 0, 1, 1781}, + {0x0, 0, 1, 1782}, + {0x0, 3, 4, 1783}, + {0x0, 0, 1, 1784}, + {0x0, 6, 9, 1785}, + {0x4d0, 16, 16, 1788}, + {0x0, 0, 1, 1788}, + {0x0, 0, 1, 1789}, + {0x0, 3, 4, 1790}, + {0x0, 0, 1, 1791}, + {0x0, 6, 9, 1792}, + {0x4d1, 16, 16, 1795}, + {0x4d2, 16, 16, 1795}, + {0x4d3, 16, 16, 1795}, + {0x4d6, 16, 16, 1795}, + {0x4d7, 16, 16, 1795}, + {0x0, 8, 10, 1795}, + {0x0, 0, 1, 1797}, + {0x0, 0, 1, 1798}, + {0x0, 3, 4, 1799}, + {0x0, 0, 1, 1800}, + {0x0, 8, 9, 1801}, + {0x4da, 16, 16, 1802}, + {0x0, 0, 1, 1802}, + {0x0, 0, 1, 1803}, + {0x0, 3, 4, 1804}, + {0x0, 0, 1, 1805}, + {0x0, 8, 9, 1806}, + {0x4db, 16, 16, 1807}, + {0x4dc, 16, 16, 1807}, + {0x4dd, 16, 16, 1807}, + {0x0, 0, 1, 1807}, + {0x0, 0, 1, 1808}, + {0x0, 3, 4, 1809}, + {0x0, 0, 1, 1810}, + {0x0, 8, 9, 1811}, + {0x4de, 16, 16, 1812}, + {0x0, 0, 1, 1812}, + {0x0, 0, 1, 1813}, + {0x0, 3, 4, 1814}, + {0x0, 0, 1, 1815}, + {0x0, 8, 9, 1816}, + {0x4df, 16, 16, 1817}, + {0x4e2, 16, 16, 1817}, + {0x4e3, 16, 16, 1817}, + {0x4e4, 16, 16, 1817}, + {0x4e5, 16, 16, 1817}, + {0x0, 0, 1, 1817}, + {0x0, 0, 1, 1818}, + {0x0, 3, 4, 1819}, + {0x0, 0, 1, 1820}, + {0x0, 8, 9, 1821}, + {0x4e6, 16, 16, 1822}, + {0x0, 0, 1, 1822}, + {0x0, 0, 1, 1823}, + {0x0, 3, 4, 1824}, + {0x0, 0, 1, 1825}, + {0x0, 8, 9, 1826}, + {0x4e7, 16, 16, 1827}, + {0x0, 8, 10, 1827}, + {0x0, 0, 1, 1829}, + {0x0, 0, 1, 1830}, + {0x0, 3, 4, 1831}, + {0x0, 0, 1, 1832}, + {0x0, 8, 9, 1833}, + {0x4ea, 16, 16, 1834}, {0x0, 0, 1, 1834}, - {0x0, 3, 4, 1835}, - {0x0, 0, 1, 1836}, - {0x0, 9, 10, 1837}, - {0x0, 9, 10, 1838}, - {0x30b0, 16, 16, 1839}, + {0x0, 0, 1, 1835}, + {0x0, 3, 4, 1836}, + {0x0, 0, 1, 1837}, + {0x0, 8, 9, 1838}, + {0x4eb, 16, 16, 1839}, {0x0, 0, 1, 1839}, {0x0, 0, 1, 1840}, {0x0, 3, 4, 1841}, - {0x0, 0, 3, 1842}, - {0x0, 1, 8, 1845}, - {0x1e3e, 16, 16, 1852}, - {0x1e40, 16, 16, 1852}, - {0x0, 8, 9, 1852}, - {0xfa65, 16, 16, 1853}, - {0x0, 6, 16, 1853}, - {0x0, 10, 11, 1863}, - {0xf93a, 16, 16, 1864}, - {0x0, 0, 16, 1864}, - {0x0, 0, 1, 1880}, - {0x0, 0, 1, 1881}, - {0x0, 3, 4, 1882}, - {0x0, 4, 5, 1883}, - {0x0, 5, 6, 1884}, - {0x1faa, 16, 16, 1885}, - {0x0, 0, 1, 1885}, - {0x0, 2, 4, 1886}, - {0x2001, 16, 16, 1888}, - {0x2000, 16, 16, 1888}, - {0x0, 0, 16, 1888}, - {0x0, 11, 12, 1904}, - {0x0, 8, 9, 1905}, - {0x2f897, 16, 16, 1906}, - {0x0, 2, 15, 1906}, - {0x0, 4, 5, 1919}, - {0x2f934, 16, 16, 1920}, - {0x0, 1, 13, 1920}, - {0x0, 11, 12, 1932}, - {0x2f848, 16, 16, 1933}, - {0x0, 0, 16, 1933}, + {0x0, 0, 1, 1842}, + {0x0, 8, 9, 1843}, + {0x4ec, 16, 16, 1844}, + {0x0, 0, 1, 1844}, + {0x0, 0, 1, 1845}, + {0x0, 3, 4, 1846}, + {0x0, 0, 1, 1847}, + {0x0, 8, 9, 1848}, + {0x4ed, 16, 16, 1849}, + {0x4ee, 16, 16, 1849}, + {0x4ef, 16, 16, 1849}, + {0x4f0, 16, 16, 1849}, + {0x4f1, 16, 16, 1849}, + {0x4f2, 16, 16, 1849}, + {0x4f3, 16, 16, 1849}, + {0x0, 0, 1, 1849}, + {0x0, 0, 1, 1850}, + {0x0, 3, 4, 1851}, + {0x0, 0, 1, 1852}, + {0x0, 8, 9, 1853}, + {0x4f4, 16, 16, 1854}, + {0x0, 0, 1, 1854}, + {0x0, 0, 1, 1855}, + {0x0, 3, 4, 1856}, + {0x0, 0, 1, 1857}, + {0x0, 8, 9, 1858}, + {0x4f5, 16, 16, 1859}, + {0x0, 0, 1, 1859}, + {0x0, 0, 1, 1860}, + {0x0, 3, 4, 1861}, + {0x0, 0, 1, 1862}, + {0x0, 8, 9, 1863}, + {0x4f8, 16, 16, 1864}, + {0x0, 0, 1, 1864}, + {0x0, 0, 1, 1865}, + {0x0, 3, 4, 1866}, + {0x0, 0, 1, 1867}, + {0x0, 8, 9, 1868}, + {0x4f9, 16, 16, 1869}, + {0x0, 2, 14, 1869}, + {0x0, 7, 8, 1881}, + {0x0, 0, 1, 1882}, + {0x0, 0, 1, 1883}, + {0x0, 6, 7, 1884}, + {0x0, 5, 6, 1885}, + {0x0, 3, 6, 1886}, + {0x622, 16, 16, 1889}, + {0x623, 16, 16, 1889}, + {0x0, 8, 11, 1889}, + {0x0, 0, 1, 1892}, + {0x0, 0, 1, 1893}, + {0x0, 6, 7, 1894}, + {0x0, 5, 6, 1895}, + {0x0, 4, 5, 1896}, + {0x624, 16, 16, 1897}, + {0x625, 16, 16, 1897}, + {0x0, 0, 1, 1897}, + {0x0, 0, 1, 1898}, + {0x0, 6, 7, 1899}, + {0x0, 5, 6, 1900}, + {0x0, 4, 5, 1901}, + {0x626, 16, 16, 1902}, + {0x0, 2, 6, 1902}, + {0x0, 0, 1, 1906}, + {0x0, 0, 1, 1907}, + {0x0, 6, 7, 1908}, + {0x0, 5, 6, 1909}, + {0x0, 4, 5, 1910}, + {0x6c0, 16, 16, 1911}, + {0x0, 1, 2, 1911}, + {0x0, 0, 1, 1912}, + {0x0, 0, 1, 1913}, + {0x0, 6, 7, 1914}, + {0x0, 5, 6, 1915}, + {0x0, 4, 5, 1916}, + {0x6c2, 16, 16, 1917}, + {0x0, 0, 1, 1917}, + {0x0, 0, 1, 1918}, + {0x0, 6, 7, 1919}, + {0x0, 5, 6, 1920}, + {0x0, 4, 5, 1921}, + {0x6d3, 16, 16, 1922}, + {0x0, 2, 13, 1922}, + {0x0, 8, 9, 1933}, + {0x0, 0, 1, 1934}, + {0x0, 0, 1, 1935}, + {0x0, 9, 10, 1936}, + {0x0, 3, 4, 1937}, + {0x0, 12, 13, 1938}, + {0x929, 16, 16, 1939}, + {0x0, 0, 4, 1939}, + {0x0, 0, 1, 1943}, + {0x0, 0, 1, 1944}, + {0x0, 9, 10, 1945}, + {0x0, 3, 4, 1946}, + {0x0, 12, 13, 1947}, + {0x931, 16, 16, 1948}, + {0x0, 0, 1, 1948}, {0x0, 0, 1, 1949}, - {0x0, 0, 1, 1950}, + {0x0, 9, 10, 1950}, {0x0, 3, 4, 1951}, - {0x0, 0, 5, 1952}, - {0x0, 2, 6, 1957}, - {0x1f07, 16, 16, 1961}, - {0x1f81, 16, 16, 1961}, - {0x0, 0, 1, 1961}, - {0x0, 0, 1, 1962}, - {0x0, 3, 4, 1963}, - {0x0, 0, 4, 1964}, - {0x0, 7, 13, 1968}, - {0x1e0b, 16, 16, 1974}, - {0x0, 0, 1, 1974}, - {0x0, 0, 1, 1975}, - {0x0, 3, 4, 1976}, - {0x0, 4, 5, 1977}, - {0x0, 5, 6, 1978}, - {0x1f9b, 16, 16, 1979}, - {0x0, 0, 1, 1979}, - {0x0, 0, 1, 1980}, - {0x0, 3, 4, 1981}, - {0x0, 0, 3, 1982}, - {0x0, 3, 4, 1985}, - {0x1e43, 16, 16, 1986}, - {0x0, 8, 9, 1986}, - {0x0, 0, 1, 1987}, - {0x0, 0, 1, 1988}, - {0x0, 3, 4, 1989}, - {0x0, 0, 5, 1990}, - {0x0, 0, 2, 1995}, - {0x1fed, 16, 16, 1997}, - {0x385, 16, 16, 1997}, - {0x0, 2, 4, 1997}, - {0x0, 0, 1, 1999}, - {0x0, 0, 1, 2000}, - {0x0, 3, 4, 2001}, - {0x0, 0, 1, 2002}, - {0x0, 0, 2, 2003}, - {0x1e17, 16, 16, 2005}, - {0x0, 1, 15, 2005}, - {0x0, 14, 15, 2019}, - {0x2f95f, 16, 16, 2020}, - {0x0, 0, 1, 2020}, - {0x0, 0, 1, 2021}, - {0x0, 3, 4, 2022}, - {0x0, 0, 5, 2023}, - {0x0, 0, 2, 2028}, - {0x1f53, 16, 16, 2030}, - {0x1f55, 16, 16, 2030}, - {0x0, 0, 1, 2030}, - {0x0, 0, 1, 2031}, - {0x0, 3, 4, 2032}, - {0x0, 3, 4, 2033}, - {0x0, 8, 9, 2034}, - {0x22ad, 16, 16, 2035}, - {0x0, 2, 12, 2035}, - {0x0, 0, 1, 2045}, - {0x0, 3, 4, 2046}, - {0x0, 0, 1, 2047}, - {0x0, 9, 10, 2048}, - {0x0, 9, 11, 2049}, - {0x3079, 16, 16, 2051}, - {0x0, 0, 1, 2051}, - {0x0, 3, 4, 2052}, + {0x0, 12, 13, 1952}, + {0x934, 16, 16, 1953}, + {0x0, 7, 8, 1953}, + {0x0, 0, 1, 1954}, + {0x0, 0, 1, 1955}, + {0x0, 9, 10, 1956}, + {0x0, 11, 14, 1957}, + {0x0, 14, 15, 1960}, + {0x9cb, 16, 16, 1961}, + {0x0, 7, 8, 1961}, + {0x9cc, 16, 16, 1962}, + {0x0, 4, 13, 1962}, + {0x0, 7, 8, 1971}, + {0x0, 0, 1, 1972}, + {0x0, 0, 1, 1973}, + {0x0, 11, 12, 1974}, + {0x0, 3, 6, 1975}, + {0x0, 6, 8, 1978}, + {0xb48, 16, 16, 1980}, + {0x0, 14, 15, 1980}, + {0xb4b, 16, 16, 1981}, + {0xb4c, 16, 16, 1981}, + {0x0, 2, 3, 1981}, + {0x0, 0, 1, 1982}, + {0x0, 0, 1, 1983}, + {0x0, 11, 12, 1984}, + {0x0, 13, 14, 1985}, + {0x0, 7, 8, 1986}, + {0xb94, 16, 16, 1987}, + {0x0, 6, 8, 1987}, + {0x0, 0, 1, 1989}, + {0x0, 0, 1, 1990}, + {0x0, 11, 12, 1991}, + {0x0, 11, 14, 1992}, + {0x0, 14, 15, 1995}, + {0xbca, 16, 16, 1996}, + {0x0, 0, 1, 1996}, + {0x0, 0, 1, 1997}, + {0x0, 11, 12, 1998}, + {0x0, 11, 12, 1999}, + {0x0, 14, 15, 2000}, + {0xbcb, 16, 16, 2001}, + {0x0, 7, 8, 2001}, + {0xbcc, 16, 16, 2002}, + {0x0, 4, 13, 2002}, + {0x0, 6, 7, 2011}, + {0x0, 0, 1, 2012}, + {0x0, 0, 1, 2013}, + {0x0, 12, 13, 2014}, + {0x0, 5, 6, 2015}, + {0x0, 6, 7, 2016}, + {0xc48, 16, 16, 2017}, + {0x0, 15, 16, 2017}, + {0x0, 0, 1, 2018}, + {0x0, 0, 1, 2019}, + {0x0, 12, 13, 2020}, + {0x0, 13, 14, 2021}, + {0x0, 5, 6, 2022}, + {0xcc0, 16, 16, 2023}, + {0x0, 6, 11, 2023}, + {0x0, 0, 1, 2028}, + {0x0, 0, 1, 2029}, + {0x0, 12, 13, 2030}, + {0x0, 12, 14, 2031}, + {0x0, 5, 7, 2033}, + {0xcc7, 16, 16, 2035}, + {0xcc8, 16, 16, 2035}, + {0x0, 2, 3, 2035}, + {0xcca, 16, 16, 2036}, + {0x0, 0, 1, 2036}, + {0x0, 0, 1, 2037}, + {0x0, 12, 13, 2038}, + {0x0, 13, 14, 2039}, + {0x0, 5, 6, 2040}, + {0xccb, 16, 16, 2041}, + {0x0, 4, 14, 2041}, + {0x0, 6, 8, 2051}, {0x0, 0, 1, 2053}, - {0x0, 9, 10, 2054}, - {0x0, 9, 11, 2055}, - {0x307d, 16, 16, 2057}, - {0x0, 3, 8, 2057}, - {0x1e5a, 16, 16, 2062}, - {0x156, 16, 16, 2062}, - {0x0, 12, 13, 2062}, - {0xf982, 16, 16, 2063}, - {0x0, 10, 12, 2063}, - {0x0, 0, 1, 2065}, - {0x0, 0, 1, 2066}, - {0x0, 3, 4, 2067}, - {0x0, 0, 1, 2068}, - {0x0, 4, 5, 2069}, - {0x1ec, 16, 16, 2070}, - {0x0, 4, 14, 2070}, - {0x0, 3, 4, 2080}, - {0xfa64, 16, 16, 2081}, + {0x0, 0, 1, 2054}, + {0x0, 13, 14, 2055}, + {0x0, 3, 6, 2056}, + {0x0, 14, 15, 2059}, + {0xd4a, 16, 16, 2060}, + {0x0, 0, 1, 2060}, + {0x0, 0, 1, 2061}, + {0x0, 13, 14, 2062}, + {0x0, 3, 4, 2063}, + {0x0, 14, 15, 2064}, + {0xd4b, 16, 16, 2065}, + {0x0, 7, 8, 2065}, + {0xd4c, 16, 16, 2066}, + {0x0, 9, 13, 2066}, + {0x0, 0, 1, 2070}, + {0x0, 0, 1, 2071}, + {0x0, 13, 14, 2072}, + {0x0, 12, 14, 2073}, + {0x0, 10, 16, 2075}, + {0xdda, 16, 16, 2081}, + {0xddc, 16, 16, 2081}, {0x0, 0, 1, 2081}, {0x0, 0, 1, 2082}, - {0x0, 3, 4, 2083}, - {0x0, 4, 5, 2084}, - {0x0, 5, 6, 2085}, - {0x1f8e, 16, 16, 2086}, - {0x0, 7, 8, 2086}, - {0xf99c, 16, 16, 2087}, - {0x0, 0, 10, 2087}, + {0x0, 13, 14, 2083}, + {0x0, 12, 13, 2084}, + {0x0, 10, 11, 2085}, + {0xddd, 16, 16, 2086}, + {0x0, 15, 16, 2086}, + {0xdde, 16, 16, 2087}, + {0x0, 7, 8, 2087}, + {0x0, 1, 2, 2088}, + {0x0, 0, 1, 2089}, + {0x0, 0, 1, 2090}, + {0x0, 15, 16, 2091}, + {0x0, 7, 9, 2092}, + {0x0, 2, 5, 2094}, + {0xf73, 16, 16, 2097}, + {0xf75, 16, 16, 2097}, {0x0, 0, 1, 2097}, - {0x0, 0, 1, 2098}, - {0x0, 3, 4, 2099}, - {0x0, 0, 5, 2100}, - {0x0, 0, 2, 2105}, - {0x1f3d, 16, 16, 2107}, - {0x0, 0, 1, 2107}, - {0x0, 3, 4, 2108}, - {0x0, 0, 5, 2109}, + {0xf81, 16, 16, 2098}, + {0x0, 0, 16, 2098}, {0x0, 2, 3, 2114}, - {0x1fd6, 16, 16, 2115}, - {0x0, 6, 15, 2115}, - {0x0, 0, 1, 2124}, - {0x0, 0, 1, 2125}, - {0x0, 3, 4, 2126}, - {0x0, 0, 5, 2127}, - {0x0, 0, 2, 2132}, - {0x1fde, 16, 16, 2134}, - {0x1fdd, 16, 16, 2134}, - {0x0, 0, 1, 2134}, - {0x0, 0, 1, 2135}, - {0x0, 3, 4, 2136}, - {0x0, 4, 5, 2137}, - {0x0, 5, 6, 2138}, - {0x1f95, 16, 16, 2139}, - {0x0, 4, 8, 2139}, - {0xf90b, 16, 16, 2143}, - {0x2f846, 16, 16, 2143}, - {0x0, 3, 6, 2143}, + {0x0, 5, 6, 2115}, + {0x0, 0, 1, 2116}, + {0x0, 1, 2, 2117}, + {0x0, 0, 1, 2118}, + {0x0, 2, 3, 2119}, + {0x0, 14, 15, 2120}, + {0x1026, 16, 16, 2121}, + {0x1e00, 16, 16, 2121}, + {0x1e01, 16, 16, 2121}, + {0x0, 0, 1, 2121}, + {0x0, 0, 1, 2122}, + {0x0, 3, 4, 2123}, + {0x0, 0, 4, 2124}, + {0x0, 7, 8, 2128}, + {0x1e02, 16, 16, 2129}, + {0x0, 0, 1, 2129}, + {0x0, 0, 1, 2130}, + {0x0, 3, 4, 2131}, + {0x0, 0, 4, 2132}, + {0x0, 7, 8, 2136}, + {0x1e03, 16, 16, 2137}, + {0x0, 3, 4, 2137}, + {0x1e04, 16, 16, 2138}, + {0x0, 3, 4, 2138}, + {0x1e05, 16, 16, 2139}, + {0x0, 1, 2, 2139}, + {0x1e06, 16, 16, 2140}, + {0x0, 1, 2, 2140}, + {0x1e07, 16, 16, 2141}, + {0x0, 0, 1, 2141}, + {0x0, 0, 1, 2142}, + {0x0, 3, 4, 2143}, + {0x0, 0, 1, 2144}, + {0x0, 1, 2, 2145}, + {0x1e08, 16, 16, 2146}, {0x0, 0, 1, 2146}, {0x0, 0, 1, 2147}, {0x0, 3, 4, 2148}, - {0x0, 3, 4, 2149}, - {0x0, 8, 9, 2150}, - {0x2224, 16, 16, 2151}, - {0x0, 0, 16, 2151}, - {0x0, 12, 13, 2167}, - {0xfa08, 16, 16, 2168}, - {0x0, 5, 6, 2168}, - {0x2f905, 16, 16, 2169}, - {0x0, 10, 11, 2169}, - {0xf995, 16, 16, 2170}, - {0x0, 0, 1, 2170}, - {0x0, 3, 4, 2171}, - {0x0, 0, 1, 2172}, - {0x0, 9, 10, 2173}, - {0x0, 9, 10, 2174}, - {0x30c7, 16, 16, 2175}, - {0x0, 0, 1, 2175}, - {0x0, 0, 1, 2176}, - {0x0, 3, 4, 2177}, - {0x0, 0, 5, 2178}, - {0x0, 0, 2, 2183}, - {0x1f22, 16, 16, 2185}, - {0x0, 5, 11, 2185}, - {0xf97f, 16, 16, 2191}, - {0x0, 9, 10, 2191}, - {0x2fa00, 16, 16, 2192}, - {0x0, 7, 16, 2192}, - {0x0, 2, 11, 2201}, - {0xf9e6, 16, 16, 2210}, - {0x0, 1, 16, 2210}, - {0x0, 10, 11, 2225}, - {0xfa17, 16, 16, 2226}, - {0xfa5a, 16, 16, 2226}, - {0x0, 10, 12, 2226}, - {0x0, 0, 1, 2228}, - {0x0, 0, 1, 2229}, - {0x0, 3, 4, 2230}, - {0x0, 0, 1, 2231}, - {0x0, 4, 5, 2232}, - {0x1e5d, 16, 16, 2233}, - {0x0, 7, 10, 2233}, - {0x2f9b5, 16, 16, 2236}, - {0x2f9b6, 16, 16, 2236}, - {0x0, 0, 12, 2236}, - {0x0, 0, 16, 2248}, - {0xf997, 16, 16, 2264}, - {0x0, 1, 12, 2264}, - {0x0, 11, 12, 2275}, - {0x0, 6, 7, 2276}, - {0x2fa01, 16, 16, 2277}, - {0x0, 10, 16, 2277}, - {0x0, 8, 15, 2283}, - {0xfa22, 16, 16, 2290}, - {0x0, 0, 10, 2290}, - {0x0, 0, 1, 2300}, - {0x0, 0, 1, 2301}, - {0x0, 3, 4, 2302}, - {0x0, 0, 1, 2303}, - {0x0, 0, 2, 2304}, - {0x1f4a, 16, 16, 2306}, - {0x0, 4, 13, 2306}, - {0x0, 6, 7, 2315}, - {0x0, 0, 1, 2316}, + {0x0, 0, 1, 2149}, + {0x0, 1, 2, 2150}, + {0x1e09, 16, 16, 2151}, + {0x1e0a, 16, 16, 2151}, + {0x1e0b, 16, 16, 2151}, + {0x0, 3, 14, 2151}, + {0x1e0c, 16, 16, 2162}, + {0x0, 3, 14, 2162}, + {0x1e0d, 16, 16, 2173}, + {0x0, 1, 2, 2173}, + {0x1e0e, 16, 16, 2174}, + {0x0, 1, 2, 2174}, + {0x1e0f, 16, 16, 2175}, + {0x1e10, 16, 16, 2175}, + {0x1e11, 16, 16, 2175}, + {0x1e12, 16, 16, 2175}, + {0x1e13, 16, 16, 2175}, + {0x0, 2, 4, 2175}, + {0x0, 0, 1, 2177}, + {0x0, 0, 1, 2178}, + {0x0, 3, 4, 2179}, + {0x0, 0, 1, 2180}, + {0x0, 0, 2, 2181}, + {0x1e14, 16, 16, 2183}, + {0x0, 0, 1, 2183}, + {0x0, 0, 1, 2184}, + {0x0, 3, 4, 2185}, + {0x0, 0, 1, 2186}, + {0x0, 0, 2, 2187}, + {0x1e15, 16, 16, 2189}, + {0x1e16, 16, 16, 2189}, + {0x1e17, 16, 16, 2189}, + {0x1e18, 16, 16, 2189}, + {0x1e19, 16, 16, 2189}, + {0x0, 0, 1, 2189}, + {0x1e1a, 16, 16, 2190}, + {0x0, 0, 1, 2190}, + {0x1e1b, 16, 16, 2191}, + {0x0, 0, 1, 2191}, + {0x0, 0, 1, 2192}, + {0x0, 3, 4, 2193}, + {0x0, 0, 1, 2194}, + {0x0, 6, 7, 2195}, + {0x1e1c, 16, 16, 2196}, + {0x0, 0, 1, 2196}, + {0x0, 0, 1, 2197}, + {0x0, 3, 4, 2198}, + {0x0, 0, 1, 2199}, + {0x0, 6, 7, 2200}, + {0x1e1d, 16, 16, 2201}, + {0x0, 0, 1, 2201}, + {0x0, 0, 1, 2202}, + {0x0, 3, 4, 2203}, + {0x0, 0, 1, 2204}, + {0x0, 7, 8, 2205}, + {0x1e1e, 16, 16, 2206}, + {0x0, 0, 1, 2206}, + {0x0, 0, 1, 2207}, + {0x0, 3, 4, 2208}, + {0x0, 0, 1, 2209}, + {0x0, 7, 8, 2210}, + {0x1e1f, 16, 16, 2211}, + {0x1e20, 16, 16, 2211}, + {0x1e21, 16, 16, 2211}, + {0x1e22, 16, 16, 2211}, + {0x1e23, 16, 16, 2211}, + {0x0, 3, 15, 2211}, + {0x1e24, 16, 16, 2223}, + {0x0, 3, 15, 2223}, + {0x1e25, 16, 16, 2235}, + {0x1e26, 16, 16, 2235}, + {0x1e27, 16, 16, 2235}, + {0x1e28, 16, 16, 2235}, + {0x1e29, 16, 16, 2235}, + {0x1e2a, 16, 16, 2235}, + {0x1e2b, 16, 16, 2235}, + {0x0, 0, 1, 2235}, + {0x1e2c, 16, 16, 2236}, + {0x0, 0, 1, 2236}, + {0x1e2d, 16, 16, 2237}, + {0x0, 0, 1, 2237}, + {0x0, 0, 1, 2238}, + {0x0, 3, 4, 2239}, + {0x0, 0, 1, 2240}, + {0x0, 1, 2, 2241}, + {0x1e2e, 16, 16, 2242}, + {0x0, 0, 1, 2242}, + {0x0, 0, 1, 2243}, + {0x0, 3, 4, 2244}, + {0x0, 0, 1, 2245}, + {0x0, 1, 2, 2246}, + {0x1e2f, 16, 16, 2247}, + {0x1e30, 16, 16, 2247}, + {0x1e31, 16, 16, 2247}, + {0x1e32, 16, 16, 2247}, + {0x1e33, 16, 16, 2247}, + {0x0, 1, 2, 2247}, + {0x1e34, 16, 16, 2248}, + {0x0, 1, 2, 2248}, + {0x1e35, 16, 16, 2249}, + {0x1e36, 16, 16, 2249}, + {0x1e37, 16, 16, 2249}, + {0x0, 3, 13, 2249}, + {0x0, 6, 8, 2259}, + {0x0, 0, 1, 2261}, + {0x0, 0, 1, 2262}, + {0x0, 3, 4, 2263}, + {0x0, 0, 1, 2264}, + {0x0, 4, 5, 2265}, + {0x1e38, 16, 16, 2266}, + {0x0, 0, 1, 2266}, + {0x0, 0, 1, 2267}, + {0x0, 3, 4, 2268}, + {0x0, 0, 1, 2269}, + {0x0, 4, 5, 2270}, + {0x1e39, 16, 16, 2271}, + {0x0, 1, 2, 2271}, + {0x1e3a, 16, 16, 2272}, + {0x0, 1, 2, 2272}, + {0x1e3b, 16, 16, 2273}, + {0x1e3c, 16, 16, 2273}, + {0x1e3d, 16, 16, 2273}, + {0x0, 0, 1, 2273}, + {0x0, 0, 1, 2274}, + {0x0, 3, 4, 2275}, + {0x0, 0, 3, 2276}, + {0x0, 1, 8, 2279}, + {0x1e3e, 16, 16, 2286}, + {0x0, 0, 1, 2286}, + {0x0, 0, 1, 2287}, + {0x0, 3, 4, 2288}, + {0x0, 0, 3, 2289}, + {0x0, 1, 8, 2292}, + {0x1e3f, 16, 16, 2299}, + {0x1e40, 16, 16, 2299}, + {0x1e41, 16, 16, 2299}, + {0x0, 3, 4, 2299}, + {0x1e42, 16, 16, 2300}, + {0x0, 3, 4, 2300}, + {0x1e43, 16, 16, 2301}, + {0x1e44, 16, 16, 2301}, + {0x1e45, 16, 16, 2301}, + {0x1e46, 16, 16, 2301}, + {0x1e47, 16, 16, 2301}, + {0x0, 1, 2, 2301}, + {0x1e48, 16, 16, 2302}, + {0x0, 1, 2, 2302}, + {0x1e49, 16, 16, 2303}, + {0x1e4a, 16, 16, 2303}, + {0x1e4b, 16, 16, 2303}, + {0x1e4c, 16, 16, 2303}, + {0x1e4d, 16, 16, 2303}, + {0x1e4e, 16, 16, 2303}, + {0x1e4f, 16, 16, 2303}, + {0x0, 12, 14, 2303}, + {0x0, 0, 1, 2305}, + {0x0, 0, 1, 2306}, + {0x0, 3, 4, 2307}, + {0x0, 0, 1, 2308}, + {0x0, 0, 2, 2309}, + {0x1e50, 16, 16, 2311}, + {0x0, 0, 1, 2311}, + {0x0, 0, 1, 2312}, + {0x0, 3, 4, 2313}, + {0x0, 0, 1, 2314}, + {0x0, 0, 2, 2315}, + {0x1e51, 16, 16, 2317}, + {0x1e52, 16, 16, 2317}, + {0x1e53, 16, 16, 2317}, {0x0, 0, 1, 2317}, - {0x0, 12, 13, 2318}, - {0x0, 5, 6, 2319}, - {0x0, 6, 7, 2320}, - {0xc48, 16, 16, 2321}, - {0x2f976, 16, 16, 2321}, - {0x0, 15, 16, 2321}, - {0xf97c, 16, 16, 2322}, - {0x0, 2, 13, 2322}, - {0x0, 4, 5, 2333}, - {0xf930, 16, 16, 2334}, - {0x212a, 0, 1, 2334}, - {0x0, 0, 1, 2335}, - {0x0, 3, 4, 2336}, - {0x0, 0, 4, 2337}, - {0x0, 1, 2, 2341}, - {0x1e34, 16, 16, 2342}, - {0x0, 2, 11, 2342}, - {0x0, 3, 4, 2351}, - {0x2f97c, 16, 16, 2352}, - {0x0, 2, 3, 2352}, - {0x2f85f, 16, 16, 2353}, - {0x0, 0, 1, 2353}, - {0x0, 0, 1, 2354}, - {0x0, 3, 4, 2355}, + {0x0, 0, 1, 2318}, + {0x0, 3, 4, 2319}, + {0x0, 0, 1, 2320}, + {0x0, 1, 8, 2321}, + {0x1e54, 16, 16, 2328}, + {0x0, 0, 1, 2328}, + {0x0, 0, 1, 2329}, + {0x0, 3, 4, 2330}, + {0x0, 0, 1, 2331}, + {0x0, 1, 8, 2332}, + {0x1e55, 16, 16, 2339}, + {0x1e56, 16, 16, 2339}, + {0x1e57, 16, 16, 2339}, + {0x1e58, 16, 16, 2339}, + {0x1e59, 16, 16, 2339}, + {0x1e5a, 16, 16, 2339}, + {0x1e5b, 16, 16, 2339}, + {0x0, 10, 12, 2339}, + {0x0, 0, 1, 2341}, + {0x0, 0, 1, 2342}, + {0x0, 3, 4, 2343}, + {0x0, 0, 1, 2344}, + {0x0, 4, 5, 2345}, + {0x1e5c, 16, 16, 2346}, + {0x0, 0, 1, 2346}, + {0x0, 0, 1, 2347}, + {0x0, 3, 4, 2348}, + {0x0, 0, 1, 2349}, + {0x0, 4, 5, 2350}, + {0x1e5d, 16, 16, 2351}, + {0x0, 1, 2, 2351}, + {0x1e5e, 16, 16, 2352}, + {0x0, 1, 2, 2352}, + {0x1e5f, 16, 16, 2353}, + {0x1e60, 16, 16, 2353}, + {0x1e61, 16, 16, 2353}, + {0x1e62, 16, 16, 2353}, + {0x1e63, 16, 16, 2353}, + {0x0, 10, 12, 2353}, + {0x0, 0, 1, 2355}, {0x0, 0, 1, 2356}, - {0x0, 6, 9, 2357}, - {0x4d1, 16, 16, 2360}, - {0x0, 1, 2, 2360}, - {0xfa55, 16, 16, 2361}, - {0x0, 5, 14, 2361}, - {0x0, 15, 16, 2370}, - {0x0, 10, 11, 2371}, - {0x2f9ed, 16, 16, 2372}, - {0x2f97d, 16, 16, 2372}, - {0x0, 9, 10, 2372}, - {0xf90e, 16, 16, 2373}, - {0x0, 0, 1, 2373}, - {0x0, 0, 1, 2374}, - {0x0, 3, 4, 2375}, - {0x0, 0, 5, 2376}, - {0x0, 0, 2, 2381}, - {0x1f0a, 16, 16, 2383}, - {0x1f0c, 16, 16, 2383}, + {0x0, 3, 4, 2357}, + {0x0, 0, 1, 2358}, + {0x0, 7, 8, 2359}, + {0x1e64, 16, 16, 2360}, + {0x0, 0, 1, 2360}, + {0x0, 0, 1, 2361}, + {0x0, 3, 4, 2362}, + {0x0, 0, 1, 2363}, + {0x0, 7, 8, 2364}, + {0x1e65, 16, 16, 2365}, + {0x0, 0, 12, 2365}, + {0x0, 0, 1, 2377}, + {0x0, 0, 1, 2378}, + {0x0, 3, 4, 2379}, + {0x0, 0, 1, 2380}, + {0x0, 7, 8, 2381}, + {0x1e66, 16, 16, 2382}, + {0x0, 0, 1, 2382}, {0x0, 0, 1, 2383}, - {0x0, 0, 1, 2384}, - {0x0, 3, 4, 2385}, - {0x0, 0, 5, 2386}, - {0x0, 2, 6, 2391}, - {0x1f67, 16, 16, 2395}, + {0x0, 3, 4, 2384}, + {0x0, 0, 1, 2385}, + {0x0, 7, 8, 2386}, + {0x1e67, 16, 16, 2387}, + {0x0, 2, 4, 2387}, + {0x0, 0, 1, 2389}, + {0x0, 0, 1, 2390}, + {0x0, 3, 4, 2391}, + {0x0, 0, 1, 2392}, + {0x0, 7, 8, 2393}, + {0x1e68, 16, 16, 2394}, + {0x0, 0, 1, 2394}, {0x0, 0, 1, 2395}, - {0x0, 0, 1, 2396}, - {0x0, 3, 4, 2397}, - {0x0, 0, 3, 2398}, - {0x0, 7, 8, 2401}, - {0xe7, 16, 16, 2402}, - {0x1fa1, 16, 16, 2402}, - {0x1eea, 16, 16, 2402}, - {0x0, 5, 11, 2402}, - {0x2f978, 16, 16, 2408}, - {0x0, 2, 3, 2408}, + {0x0, 3, 4, 2396}, + {0x0, 0, 1, 2397}, + {0x0, 7, 8, 2398}, + {0x1e69, 16, 16, 2399}, + {0x1e6a, 16, 16, 2399}, + {0x1e6b, 16, 16, 2399}, + {0x1e6c, 16, 16, 2399}, + {0x1e6d, 16, 16, 2399}, + {0x0, 1, 2, 2399}, + {0x1e6e, 16, 16, 2400}, + {0x0, 1, 2, 2400}, + {0x1e6f, 16, 16, 2401}, + {0x1e70, 16, 16, 2401}, + {0x1e71, 16, 16, 2401}, + {0x1e72, 16, 16, 2401}, + {0x1e73, 16, 16, 2401}, + {0x0, 0, 1, 2401}, + {0x1e74, 16, 16, 2402}, + {0x0, 0, 1, 2402}, + {0x1e75, 16, 16, 2403}, + {0x1e76, 16, 16, 2403}, + {0x1e77, 16, 16, 2403}, + {0x0, 0, 1, 2403}, + {0x0, 0, 1, 2404}, + {0x0, 3, 4, 2405}, + {0x0, 0, 1, 2406}, + {0x0, 1, 2, 2407}, + {0x1e78, 16, 16, 2408}, + {0x0, 0, 1, 2408}, {0x0, 0, 1, 2409}, - {0x0, 0, 1, 2410}, - {0x0, 3, 4, 2411}, - {0x0, 0, 1, 2412}, - {0x0, 1, 9, 2413}, - {0x3d4, 16, 16, 2421}, - {0x0, 4, 14, 2421}, - {0x0, 12, 13, 2431}, - {0x2f91e, 16, 16, 2432}, - {0x3d3, 16, 16, 2432}, - {0x0, 3, 14, 2432}, - {0x0, 7, 9, 2443}, - {0x2f9e9, 16, 16, 2445}, - {0x0, 0, 1, 2445}, - {0x0, 0, 1, 2446}, - {0x0, 3, 4, 2447}, - {0x0, 0, 3, 2448}, - {0x0, 0, 10, 2451}, - {0x176, 16, 16, 2461}, - {0xdd, 16, 16, 2461}, - {0x1ef2, 16, 16, 2461}, - {0x1e8e, 16, 16, 2461}, - {0x232, 16, 16, 2461}, - {0x0, 6, 16, 2461}, - {0x0, 0, 1, 2471}, - {0x0, 3, 4, 2472}, - {0x0, 0, 1, 2473}, - {0x0, 9, 10, 2474}, - {0x0, 9, 10, 2475}, - {0x3094, 16, 16, 2476}, - {0x1ef6, 16, 16, 2476}, - {0x178, 16, 16, 2476}, - {0x0, 0, 1, 2476}, - {0x0, 0, 1, 2477}, - {0x0, 3, 4, 2478}, + {0x0, 3, 4, 2410}, + {0x0, 0, 1, 2411}, + {0x0, 1, 2, 2412}, + {0x1e79, 16, 16, 2413}, + {0x0, 0, 1, 2413}, + {0x0, 0, 1, 2414}, + {0x0, 3, 4, 2415}, + {0x0, 0, 1, 2416}, + {0x0, 8, 9, 2417}, + {0x1e7a, 16, 16, 2418}, + {0x0, 0, 1, 2418}, + {0x0, 0, 1, 2419}, + {0x0, 3, 4, 2420}, + {0x0, 0, 1, 2421}, + {0x0, 8, 9, 2422}, + {0x1e7b, 16, 16, 2423}, + {0x0, 0, 1, 2423}, + {0x0, 0, 1, 2424}, + {0x0, 3, 4, 2425}, + {0x0, 0, 3, 2426}, + {0x0, 3, 4, 2429}, + {0x1e7c, 16, 16, 2430}, + {0x0, 0, 1, 2430}, + {0x0, 0, 1, 2431}, + {0x0, 3, 4, 2432}, + {0x0, 0, 3, 2433}, + {0x0, 3, 4, 2436}, + {0x1e7d, 16, 16, 2437}, + {0x0, 3, 4, 2437}, + {0x1e7e, 16, 16, 2438}, + {0x0, 3, 4, 2438}, + {0x1e7f, 16, 16, 2439}, + {0x1e80, 16, 16, 2439}, + {0x1e81, 16, 16, 2439}, + {0x1e82, 16, 16, 2439}, + {0x1e83, 16, 16, 2439}, + {0x1e84, 16, 16, 2439}, + {0x1e85, 16, 16, 2439}, + {0x1e86, 16, 16, 2439}, + {0x1e87, 16, 16, 2439}, + {0x0, 3, 4, 2439}, + {0x1e88, 16, 16, 2440}, + {0x0, 3, 4, 2440}, + {0x1e89, 16, 16, 2441}, + {0x0, 0, 1, 2441}, + {0x0, 0, 1, 2442}, + {0x0, 3, 4, 2443}, + {0x0, 0, 1, 2444}, + {0x0, 7, 9, 2445}, + {0x1e8a, 16, 16, 2447}, + {0x0, 0, 1, 2447}, + {0x0, 0, 1, 2448}, + {0x0, 3, 4, 2449}, + {0x0, 0, 1, 2450}, + {0x0, 7, 9, 2451}, + {0x1e8b, 16, 16, 2453}, + {0x1e8c, 16, 16, 2453}, + {0x1e8d, 16, 16, 2453}, + {0x1e8e, 16, 16, 2453}, + {0x1e8f, 16, 16, 2453}, + {0x1e90, 16, 16, 2453}, + {0x1e91, 16, 16, 2453}, + {0x0, 3, 4, 2453}, + {0x1e92, 16, 16, 2454}, + {0x0, 3, 4, 2454}, + {0x1e93, 16, 16, 2455}, + {0x0, 1, 2, 2455}, + {0x1e94, 16, 16, 2456}, + {0x0, 1, 2, 2456}, + {0x1e95, 16, 16, 2457}, + {0x0, 1, 2, 2457}, + {0x1e96, 16, 16, 2458}, + {0x1e97, 16, 16, 2458}, + {0x1e98, 16, 16, 2458}, + {0x1e99, 16, 16, 2458}, + {0x0, 15, 16, 2458}, + {0x0, 0, 1, 2459}, + {0x0, 0, 1, 2460}, + {0x0, 3, 4, 2461}, + {0x0, 0, 1, 2462}, + {0x0, 7, 8, 2463}, + {0x1e9b, 16, 16, 2464}, + {0x1ea0, 16, 16, 2464}, + {0x1ea1, 16, 16, 2464}, + {0x1ea2, 16, 16, 2464}, + {0x1ea3, 16, 16, 2464}, + {0x0, 0, 1, 2464}, + {0x0, 0, 1, 2465}, + {0x0, 3, 4, 2466}, + {0x0, 0, 1, 2467}, + {0x0, 0, 10, 2468}, + {0x1ea4, 16, 16, 2478}, + {0x0, 0, 1, 2478}, {0x0, 0, 1, 2479}, - {0x0, 7, 8, 2480}, - {0x1e68, 16, 16, 2481}, - {0x2f9e8, 16, 16, 2481}, - {0x0, 13, 14, 2481}, - {0x2f999, 16, 16, 2482}, - {0x0, 0, 1, 2482}, - {0x0, 0, 1, 2483}, - {0x0, 3, 4, 2484}, - {0x0, 0, 3, 2485}, - {0x0, 0, 9, 2488}, - {0x1e82, 16, 16, 2497}, - {0x0, 4, 16, 2497}, - {0x0, 14, 15, 2509}, - {0x2f94e, 16, 16, 2510}, - {0x174, 16, 16, 2510}, - {0x1e86, 16, 16, 2510}, - {0x0, 0, 1, 2510}, - {0x0, 0, 1, 2511}, - {0x0, 3, 4, 2512}, - {0x0, 0, 1, 2513}, - {0x0, 4, 5, 2514}, - {0x1de, 16, 16, 2515}, - {0xf9af, 16, 16, 2515}, - {0x0, 2, 15, 2515}, - {0x0, 3, 4, 2528}, - {0x2f89b, 16, 16, 2529}, - {0x0, 3, 5, 2529}, - {0x1f28, 16, 16, 2531}, - {0x1f29, 16, 16, 2531}, - {0x0, 8, 16, 2531}, - {0x0, 10, 11, 2539}, - {0x2f8f9, 16, 16, 2540}, - {0x0, 10, 11, 2540}, - {0x2f89c, 16, 16, 2541}, - {0x0, 1, 2, 2541}, - {0x1e07, 16, 16, 2542}, + {0x0, 3, 4, 2480}, + {0x0, 0, 1, 2481}, + {0x0, 0, 10, 2482}, + {0x1ea5, 16, 16, 2492}, + {0x1ea6, 16, 16, 2492}, + {0x1ea7, 16, 16, 2492}, + {0x1ea8, 16, 16, 2492}, + {0x1ea9, 16, 16, 2492}, + {0x1eaa, 16, 16, 2492}, + {0x1eab, 16, 16, 2492}, + {0x0, 0, 2, 2492}, + {0x0, 0, 1, 2494}, + {0x0, 0, 1, 2495}, + {0x0, 3, 4, 2496}, + {0x0, 0, 1, 2497}, + {0x0, 2, 7, 2498}, + {0x1eac, 16, 16, 2503}, + {0x0, 0, 1, 2503}, + {0x0, 0, 1, 2504}, + {0x0, 3, 4, 2505}, + {0x0, 0, 1, 2506}, + {0x0, 2, 7, 2507}, + {0x1ead, 16, 16, 2512}, + {0x0, 2, 4, 2512}, + {0x0, 0, 1, 2514}, + {0x0, 0, 1, 2515}, + {0x0, 3, 4, 2516}, + {0x0, 0, 1, 2517}, + {0x0, 0, 10, 2518}, + {0x1eae, 16, 16, 2528}, + {0x0, 0, 1, 2528}, + {0x0, 0, 1, 2529}, + {0x0, 3, 4, 2530}, + {0x0, 0, 1, 2531}, + {0x0, 0, 10, 2532}, + {0x1eaf, 16, 16, 2542}, + {0x1eb0, 16, 16, 2542}, + {0x1eb1, 16, 16, 2542}, + {0x1eb2, 16, 16, 2542}, + {0x1eb3, 16, 16, 2542}, + {0x1eb4, 16, 16, 2542}, + {0x1eb5, 16, 16, 2542}, + {0x1eb6, 16, 16, 2542}, + {0x1eb7, 16, 16, 2542}, + {0x1eb8, 16, 16, 2542}, + {0x1eb9, 16, 16, 2542}, + {0x1eba, 16, 16, 2542}, + {0x1ebb, 16, 16, 2542}, + {0x1ebc, 16, 16, 2542}, + {0x1ebd, 16, 16, 2542}, {0x0, 0, 1, 2542}, - {0x0, 3, 4, 2543}, - {0x0, 0, 1, 2544}, - {0x0, 9, 10, 2545}, - {0x0, 9, 11, 2546}, - {0x30d0, 16, 16, 2548}, - {0x0, 11, 12, 2548}, - {0x2f9d6, 16, 16, 2549}, - {0x0, 0, 13, 2549}, - {0x0, 0, 15, 2562}, - {0xfa3c, 16, 16, 2577}, - {0x0, 7, 8, 2577}, - {0x2f92e, 16, 16, 2578}, + {0x0, 0, 1, 2543}, + {0x0, 3, 4, 2544}, + {0x0, 0, 1, 2545}, + {0x0, 0, 10, 2546}, + {0x1ebe, 16, 16, 2556}, + {0x0, 0, 1, 2556}, + {0x0, 0, 1, 2557}, + {0x0, 3, 4, 2558}, + {0x0, 0, 1, 2559}, + {0x0, 0, 10, 2560}, + {0x1ebf, 16, 16, 2570}, + {0x1ec0, 16, 16, 2570}, + {0x1ec1, 16, 16, 2570}, + {0x1ec2, 16, 16, 2570}, + {0x1ec3, 16, 16, 2570}, + {0x1ec4, 16, 16, 2570}, + {0x1ec5, 16, 16, 2570}, + {0x0, 8, 10, 2570}, + {0x0, 0, 1, 2572}, + {0x0, 0, 1, 2573}, + {0x0, 3, 4, 2574}, + {0x0, 0, 1, 2575}, + {0x0, 2, 3, 2576}, + {0x1ec6, 16, 16, 2577}, + {0x0, 0, 1, 2577}, {0x0, 0, 1, 2578}, {0x0, 3, 4, 2579}, {0x0, 0, 1, 2580}, - {0x0, 9, 10, 2581}, - {0x0, 9, 10, 2582}, - {0x30ae, 16, 16, 2583}, - {0x0, 1, 16, 2583}, - {0x0, 0, 1, 2598}, - {0x0, 3, 4, 2599}, - {0x0, 0, 1, 2600}, - {0x0, 9, 10, 2601}, - {0x0, 9, 10, 2602}, - {0x3058, 16, 16, 2603}, - {0x0, 0, 1, 2603}, - {0x0, 0, 1, 2604}, - {0x0, 3, 4, 2605}, - {0x0, 0, 4, 2606}, - {0x0, 0, 16, 2610}, - {0xcb, 16, 16, 2626}, - {0x1eba, 16, 16, 2626}, - {0xca, 16, 16, 2626}, - {0x1ebc, 16, 16, 2626}, - {0xc8, 16, 16, 2626}, - {0xc9, 16, 16, 2626}, - {0x114, 16, 16, 2626}, - {0x116, 16, 16, 2626}, - {0x112, 16, 16, 2626}, - {0xf94b, 16, 16, 2626}, - {0x2f877, 16, 16, 2626}, - {0xf9df, 16, 16, 2626}, - {0xfa3b, 16, 16, 2626}, - {0x0, 0, 1, 2626}, - {0x0, 0, 1, 2627}, - {0x0, 3, 4, 2628}, - {0x0, 0, 1, 2629}, - {0x0, 6, 7, 2630}, - {0x1e1c, 16, 16, 2631}, - {0x0, 4, 16, 2631}, - {0x0, 4, 5, 2643}, - {0x2f93d, 16, 16, 2644}, - {0x0, 0, 1, 2644}, - {0x0, 0, 1, 2645}, - {0x0, 3, 4, 2646}, - {0x0, 0, 1, 2647}, - {0x0, 1, 2, 2648}, - {0x1fb, 16, 16, 2649}, - {0x0, 6, 7, 2649}, - {0x0, 13, 14, 2650}, - {0x2f8e3, 16, 16, 2651}, - {0x0, 2, 8, 2651}, - {0x2f85b, 16, 16, 2657}, - {0x2f85a, 16, 16, 2657}, - {0x307c, 16, 16, 2657}, - {0x0, 0, 1, 2657}, - {0x0, 0, 1, 2658}, - {0x0, 3, 4, 2659}, - {0x0, 0, 5, 2660}, - {0x0, 2, 6, 2665}, - {0x1f06, 16, 16, 2669}, - {0x11a, 16, 16, 2669}, - {0x204, 16, 16, 2669}, - {0x1f80, 16, 16, 2669}, - {0x307a, 16, 16, 2669}, - {0x0, 0, 1, 2669}, - {0x0, 8, 9, 2670}, - {0x2f923, 16, 16, 2671}, + {0x0, 2, 3, 2581}, + {0x1ec7, 16, 16, 2582}, + {0x1ec8, 16, 16, 2582}, + {0x1ec9, 16, 16, 2582}, + {0x1eca, 16, 16, 2582}, + {0x1ecb, 16, 16, 2582}, + {0x1ecc, 16, 16, 2582}, + {0x1ecd, 16, 16, 2582}, + {0x1ece, 16, 16, 2582}, + {0x1ecf, 16, 16, 2582}, + {0x0, 0, 1, 2582}, + {0x0, 0, 1, 2583}, + {0x0, 3, 4, 2584}, + {0x0, 0, 1, 2585}, + {0x0, 0, 10, 2586}, + {0x1ed0, 16, 16, 2596}, + {0x0, 0, 1, 2596}, + {0x0, 0, 1, 2597}, + {0x0, 3, 4, 2598}, + {0x0, 0, 1, 2599}, + {0x0, 0, 10, 2600}, + {0x1ed1, 16, 16, 2610}, + {0x1ed2, 16, 16, 2610}, + {0x1ed3, 16, 16, 2610}, + {0x1ed4, 16, 16, 2610}, + {0x1ed5, 16, 16, 2610}, + {0x1ed6, 16, 16, 2610}, + {0x1ed7, 16, 16, 2610}, + {0x0, 12, 14, 2610}, + {0x0, 0, 1, 2612}, + {0x0, 0, 1, 2613}, + {0x0, 3, 4, 2614}, + {0x0, 0, 1, 2615}, + {0x0, 2, 3, 2616}, + {0x1ed8, 16, 16, 2617}, + {0x0, 0, 1, 2617}, + {0x0, 0, 1, 2618}, + {0x0, 3, 4, 2619}, + {0x0, 0, 1, 2620}, + {0x0, 2, 3, 2621}, + {0x1ed9, 16, 16, 2622}, + {0x0, 0, 16, 2622}, + {0x0, 0, 1, 2638}, + {0x0, 0, 1, 2639}, + {0x0, 3, 4, 2640}, + {0x0, 0, 3, 2641}, + {0x0, 0, 10, 2644}, + {0x1eda, 16, 16, 2654}, + {0x0, 0, 1, 2654}, + {0x0, 0, 1, 2655}, + {0x0, 3, 4, 2656}, + {0x0, 0, 3, 2657}, + {0x0, 0, 10, 2660}, + {0x1edb, 16, 16, 2670}, + {0x1edc, 16, 16, 2670}, + {0x1edd, 16, 16, 2670}, + {0x1ede, 16, 16, 2670}, + {0x1edf, 16, 16, 2670}, + {0x1ee0, 16, 16, 2670}, + {0x1ee1, 16, 16, 2670}, + {0x0, 3, 4, 2670}, + {0x1ee2, 16, 16, 2671}, {0x0, 3, 4, 2671}, - {0x2f944, 16, 16, 2672}, - {0x0, 10, 11, 2672}, - {0xf94d, 16, 16, 2673}, - {0x0, 3, 4, 2673}, - {0x1ef0, 16, 16, 2674}, - {0x0, 11, 12, 2674}, - {0xf9d4, 16, 16, 2675}, - {0x0, 0, 16, 2675}, - {0x113, 16, 16, 2691}, - {0x115, 16, 16, 2691}, - {0x117, 16, 16, 2691}, - {0xe8, 16, 16, 2691}, - {0xe9, 16, 16, 2691}, - {0xea, 16, 16, 2691}, - {0x1ebd, 16, 16, 2691}, - {0x0, 0, 1, 2691}, - {0x0, 0, 1, 2692}, - {0x0, 3, 4, 2693}, - {0x0, 0, 1, 2694}, - {0x0, 1, 2, 2695}, - {0x1e08, 16, 16, 2696}, - {0xeb, 16, 16, 2696}, - {0x1ebb, 16, 16, 2696}, - {0x0, 12, 14, 2696}, - {0x0, 0, 1, 2698}, - {0x0, 0, 1, 2699}, - {0x0, 3, 4, 2700}, - {0x0, 0, 1, 2701}, - {0x0, 0, 2, 2702}, - {0x1e52, 16, 16, 2704}, - {0x0, 9, 14, 2704}, - {0x0, 0, 5, 2709}, - {0x0, 0, 1, 2714}, - {0x0, 0, 1, 2715}, - {0x0, 3, 4, 2716}, - {0x0, 3, 4, 2717}, - {0x0, 8, 9, 2718}, - {0x21cf, 16, 16, 2719}, - {0x0, 0, 1, 2719}, - {0x0, 0, 1, 2720}, - {0x0, 3, 4, 2721}, - {0x0, 0, 1, 2722}, - {0x0, 2, 3, 2723}, - {0x134, 16, 16, 2724}, - {0x0, 0, 1, 2724}, - {0x0, 0, 1, 2725}, - {0x0, 3, 4, 2726}, - {0x0, 0, 5, 2727}, - {0x0, 0, 2, 2732}, - {0x1f54, 16, 16, 2734}, - {0x1f52, 16, 16, 2734}, - {0x0, 1, 2, 2734}, - {0x1e5e, 16, 16, 2735}, - {0x0, 8, 9, 2735}, - {0xf99f, 16, 16, 2736}, - {0x0, 1, 5, 2736}, - {0x0, 14, 15, 2740}, - {0x2f8f2, 16, 16, 2741}, - {0x205, 16, 16, 2741}, - {0x11b, 16, 16, 2741}, - {0x2f88b, 16, 16, 2741}, - {0x2f88c, 16, 16, 2741}, - {0x0, 3, 8, 2741}, - {0x2f81e, 16, 16, 2746}, - {0x0, 0, 1, 2746}, - {0x0, 0, 1, 2747}, - {0x0, 3, 4, 2748}, - {0x0, 0, 5, 2749}, - {0x0, 3, 5, 2754}, - {0x1f01, 16, 16, 2756}, - {0xfa00, 16, 16, 2756}, - {0x0, 3, 16, 2756}, - {0x2f830, 16, 16, 2769}, - {0x0, 2, 13, 2769}, - {0x0, 0, 4, 2780}, - {0x0, 0, 1, 2784}, - {0x0, 0, 1, 2785}, - {0x0, 9, 10, 2786}, - {0x0, 3, 4, 2787}, - {0x0, 12, 13, 2788}, - {0x931, 16, 16, 2789}, - {0x2f833, 16, 16, 2789}, - {0x0, 0, 1, 2789}, - {0x0, 0, 1, 2790}, - {0x0, 3, 4, 2791}, - {0x0, 0, 1, 2792}, - {0x0, 8, 9, 2793}, - {0x1e7a, 16, 16, 2794}, - {0x0, 14, 15, 2794}, - {0xf9d0, 16, 16, 2795}, - {0x0, 9, 14, 2795}, - {0x2f847, 16, 16, 2800}, - {0x0, 13, 14, 2800}, - {0x0, 2, 3, 2801}, - {0x2f9b1, 16, 16, 2802}, - {0x0, 4, 13, 2802}, - {0x0, 7, 8, 2811}, + {0x1ee3, 16, 16, 2672}, + {0x1ee4, 16, 16, 2672}, + {0x1ee5, 16, 16, 2672}, + {0x1ee6, 16, 16, 2672}, + {0x1ee7, 16, 16, 2672}, + {0x0, 0, 1, 2672}, + {0x0, 0, 1, 2673}, + {0x0, 3, 4, 2674}, + {0x0, 0, 3, 2675}, + {0x0, 0, 10, 2678}, + {0x1ee8, 16, 16, 2688}, + {0x0, 0, 1, 2688}, + {0x0, 0, 1, 2689}, + {0x0, 3, 4, 2690}, + {0x0, 0, 3, 2691}, + {0x0, 0, 10, 2694}, + {0x1ee9, 16, 16, 2704}, + {0x1eea, 16, 16, 2704}, + {0x1eeb, 16, 16, 2704}, + {0x1eec, 16, 16, 2704}, + {0x1eed, 16, 16, 2704}, + {0x1eee, 16, 16, 2704}, + {0x1eef, 16, 16, 2704}, + {0x0, 3, 4, 2704}, + {0x1ef0, 16, 16, 2705}, + {0x0, 3, 4, 2705}, + {0x1ef1, 16, 16, 2706}, + {0x1ef2, 16, 16, 2706}, + {0x1ef3, 16, 16, 2706}, + {0x0, 3, 4, 2706}, + {0x1ef4, 16, 16, 2707}, + {0x0, 3, 4, 2707}, + {0x1ef5, 16, 16, 2708}, + {0x1ef6, 16, 16, 2708}, + {0x1ef7, 16, 16, 2708}, + {0x1ef8, 16, 16, 2708}, + {0x1ef9, 16, 16, 2708}, + {0x0, 3, 5, 2708}, + {0x1f00, 16, 16, 2710}, + {0x1f01, 16, 16, 2710}, + {0x0, 0, 16, 2710}, + {0x0, 0, 16, 2726}, + {0x0, 0, 1, 2742}, + {0x0, 0, 1, 2743}, + {0x0, 3, 4, 2744}, + {0x0, 0, 5, 2745}, + {0x0, 0, 2, 2750}, + {0x1f02, 16, 16, 2752}, + {0x0, 0, 1, 2752}, + {0x0, 0, 1, 2753}, + {0x0, 3, 4, 2754}, + {0x0, 0, 5, 2755}, + {0x0, 0, 2, 2760}, + {0x1f03, 16, 16, 2762}, + {0x1f04, 16, 16, 2762}, + {0x1f05, 16, 16, 2762}, + {0x0, 2, 6, 2762}, + {0x1f06, 16, 16, 2766}, + {0x0, 2, 6, 2766}, + {0x1f07, 16, 16, 2770}, + {0x0, 3, 5, 2770}, + {0x1f08, 16, 16, 2772}, + {0x1f09, 16, 16, 2772}, + {0x0, 0, 1, 2772}, + {0x0, 0, 1, 2773}, + {0x0, 3, 4, 2774}, + {0x0, 0, 5, 2775}, + {0x0, 0, 2, 2780}, + {0x1f0a, 16, 16, 2782}, + {0x0, 0, 1, 2782}, + {0x0, 0, 1, 2783}, + {0x0, 3, 4, 2784}, + {0x0, 0, 5, 2785}, + {0x0, 0, 2, 2790}, + {0x1f0b, 16, 16, 2792}, + {0x1f0c, 16, 16, 2792}, + {0x1f0d, 16, 16, 2792}, + {0x0, 2, 6, 2792}, + {0x1f0e, 16, 16, 2796}, + {0x0, 2, 6, 2796}, + {0x1f0f, 16, 16, 2800}, + {0x0, 3, 5, 2800}, + {0x1f10, 16, 16, 2802}, + {0x1f11, 16, 16, 2802}, + {0x0, 0, 10, 2802}, {0x0, 0, 1, 2812}, {0x0, 0, 1, 2813}, - {0x0, 11, 12, 2814}, - {0x0, 3, 6, 2815}, - {0x0, 14, 15, 2818}, - {0xb4b, 16, 16, 2819}, - {0x0, 6, 8, 2819}, + {0x0, 3, 4, 2814}, + {0x0, 0, 1, 2815}, + {0x0, 0, 2, 2816}, + {0x1f12, 16, 16, 2818}, + {0x0, 0, 1, 2818}, + {0x0, 0, 1, 2819}, + {0x0, 3, 4, 2820}, {0x0, 0, 1, 2821}, - {0x0, 0, 1, 2822}, - {0x0, 3, 4, 2823}, - {0x0, 0, 1, 2824}, - {0x0, 4, 5, 2825}, - {0x1e39, 16, 16, 2826}, + {0x0, 0, 2, 2822}, + {0x1f13, 16, 16, 2824}, + {0x1f14, 16, 16, 2824}, + {0x1f15, 16, 16, 2824}, + {0x0, 3, 5, 2824}, + {0x1f18, 16, 16, 2826}, + {0x1f19, 16, 16, 2826}, {0x0, 0, 1, 2826}, {0x0, 0, 1, 2827}, {0x0, 3, 4, 2828}, {0x0, 0, 1, 2829}, - {0x0, 2, 13, 2830}, - {0x135, 16, 16, 2841}, - {0x0, 13, 14, 2841}, - {0x2f9d0, 16, 16, 2842}, - {0x0, 4, 14, 2842}, - {0x0, 0, 15, 2852}, - {0x0, 4, 7, 2867}, - {0x2f87d, 16, 16, 2870}, - {0x2f87b, 16, 16, 2870}, - {0x0, 7, 8, 2870}, - {0x0, 0, 1, 2871}, - {0x0, 0, 1, 2872}, - {0x0, 9, 10, 2873}, - {0x0, 11, 14, 2874}, - {0x0, 14, 15, 2877}, - {0x9cb, 16, 16, 2878}, - {0x0, 1, 6, 2878}, - {0x0, 0, 1, 2883}, - {0x0, 0, 1, 2884}, - {0x0, 3, 4, 2885}, - {0x0, 3, 4, 2886}, - {0x0, 8, 9, 2887}, - {0x2270, 16, 16, 2888}, - {0x0, 5, 9, 2888}, - {0xf959, 16, 16, 2892}, - {0xfa36, 16, 16, 2892}, - {0x0, 0, 1, 2892}, - {0x0, 0, 1, 2893}, - {0x0, 3, 4, 2894}, - {0x0, 3, 4, 2895}, - {0x0, 8, 9, 2896}, - {0x2271, 16, 16, 2897}, - {0x0, 9, 10, 2897}, - {0xfa5e, 16, 16, 2898}, - {0x0, 0, 1, 2898}, - {0x0, 0, 1, 2899}, - {0x0, 3, 4, 2900}, - {0x0, 0, 1, 2901}, - {0x0, 1, 2, 2902}, - {0x453, 16, 16, 2903}, - {0xf9d3, 16, 16, 2903}, - {0x0, 12, 14, 2903}, - {0x0, 0, 1, 2905}, - {0x0, 0, 1, 2906}, - {0x0, 3, 4, 2907}, - {0x0, 0, 1, 2908}, - {0x0, 2, 3, 2909}, - {0x1ed8, 16, 16, 2910}, - {0x0, 2, 16, 2910}, - {0xf9e7, 16, 16, 2924}, - {0xf91c, 16, 16, 2924}, - {0x0, 1, 16, 2924}, - {0x0, 4, 9, 2939}, - {0xf901, 16, 16, 2944}, - {0x2f82f, 16, 16, 2944}, - {0x0, 15, 16, 2944}, - {0x2f883, 16, 16, 2945}, - {0x0, 0, 5, 2945}, + {0x0, 0, 2, 2830}, + {0x1f1a, 16, 16, 2832}, + {0x0, 0, 1, 2832}, + {0x0, 0, 1, 2833}, + {0x0, 3, 4, 2834}, + {0x0, 0, 1, 2835}, + {0x0, 0, 2, 2836}, + {0x1f1b, 16, 16, 2838}, + {0x1f1c, 16, 16, 2838}, + {0x1f1d, 16, 16, 2838}, + {0x0, 3, 5, 2838}, + {0x1f20, 16, 16, 2840}, + {0x1f21, 16, 16, 2840}, + {0x0, 0, 16, 2840}, + {0x0, 0, 1, 2856}, + {0x0, 0, 1, 2857}, + {0x0, 3, 4, 2858}, + {0x0, 0, 5, 2859}, + {0x0, 0, 2, 2864}, + {0x1f22, 16, 16, 2866}, + {0x0, 0, 1, 2866}, + {0x0, 0, 1, 2867}, + {0x0, 3, 4, 2868}, + {0x0, 0, 5, 2869}, + {0x0, 0, 2, 2874}, + {0x1f23, 16, 16, 2876}, + {0x1f24, 16, 16, 2876}, + {0x1f25, 16, 16, 2876}, + {0x0, 2, 6, 2876}, + {0x1f26, 16, 16, 2880}, + {0x0, 2, 6, 2880}, + {0x1f27, 16, 16, 2884}, + {0x0, 3, 5, 2884}, + {0x1f28, 16, 16, 2886}, + {0x1f29, 16, 16, 2886}, + {0x0, 0, 1, 2886}, + {0x0, 0, 1, 2887}, + {0x0, 3, 4, 2888}, + {0x0, 0, 5, 2889}, + {0x0, 0, 2, 2894}, + {0x1f2a, 16, 16, 2896}, + {0x0, 0, 1, 2896}, + {0x0, 0, 1, 2897}, + {0x0, 3, 4, 2898}, + {0x0, 0, 5, 2899}, + {0x0, 0, 2, 2904}, + {0x1f2b, 16, 16, 2906}, + {0x1f2c, 16, 16, 2906}, + {0x1f2d, 16, 16, 2906}, + {0x0, 2, 6, 2906}, + {0x1f2e, 16, 16, 2910}, + {0x0, 2, 6, 2910}, + {0x1f2f, 16, 16, 2914}, + {0x0, 3, 5, 2914}, + {0x1f30, 16, 16, 2916}, + {0x1f31, 16, 16, 2916}, + {0x0, 0, 10, 2916}, + {0x0, 0, 1, 2926}, + {0x0, 0, 1, 2927}, + {0x0, 3, 4, 2928}, + {0x0, 0, 5, 2929}, + {0x0, 0, 2, 2934}, + {0x1f32, 16, 16, 2936}, + {0x0, 0, 1, 2936}, + {0x0, 0, 1, 2937}, + {0x0, 3, 4, 2938}, + {0x0, 0, 5, 2939}, + {0x0, 0, 2, 2944}, + {0x1f33, 16, 16, 2946}, + {0x1f34, 16, 16, 2946}, + {0x1f35, 16, 16, 2946}, + {0x0, 2, 3, 2946}, + {0x1f36, 16, 16, 2947}, + {0x0, 2, 3, 2947}, + {0x1f37, 16, 16, 2948}, + {0x0, 3, 5, 2948}, + {0x1f38, 16, 16, 2950}, + {0x1f39, 16, 16, 2950}, {0x0, 0, 1, 2950}, {0x0, 0, 1, 2951}, {0x0, 3, 4, 2952}, - {0x0, 3, 4, 2953}, - {0x0, 8, 9, 2954}, - {0x21ae, 16, 16, 2955}, - {0x0, 11, 12, 2955}, - {0x0, 12, 13, 2956}, - {0x2f8fb, 16, 16, 2957}, - {0x0, 0, 1, 2957}, - {0x0, 0, 1, 2958}, - {0x0, 3, 4, 2959}, - {0x0, 0, 5, 2960}, - {0x0, 3, 5, 2965}, - {0x1f21, 16, 16, 2967}, - {0x1f0, 16, 16, 2967}, - {0x1f20, 16, 16, 2967}, - {0x0, 0, 11, 2967}, - {0x0, 0, 1, 2978}, - {0x2f967, 16, 16, 2979}, - {0x0, 3, 9, 2979}, - {0x12f, 16, 16, 2985}, - {0x0, 7, 15, 2985}, - {0x2f9c7, 16, 16, 2993}, - {0x1ecb, 16, 16, 2993}, - {0x0, 2, 12, 2993}, - {0x0, 0, 1, 3003}, - {0x0, 3, 4, 3004}, + {0x0, 0, 5, 2953}, + {0x0, 0, 2, 2958}, + {0x1f3a, 16, 16, 2960}, + {0x0, 0, 1, 2960}, + {0x0, 0, 1, 2961}, + {0x0, 3, 4, 2962}, + {0x0, 0, 5, 2963}, + {0x0, 0, 2, 2968}, + {0x1f3b, 16, 16, 2970}, + {0x1f3c, 16, 16, 2970}, + {0x1f3d, 16, 16, 2970}, + {0x0, 2, 3, 2970}, + {0x1f3e, 16, 16, 2971}, + {0x0, 2, 3, 2971}, + {0x1f3f, 16, 16, 2972}, + {0x0, 3, 5, 2972}, + {0x1f40, 16, 16, 2974}, + {0x1f41, 16, 16, 2974}, + {0x0, 0, 10, 2974}, + {0x0, 0, 1, 2984}, + {0x0, 0, 1, 2985}, + {0x0, 3, 4, 2986}, + {0x0, 0, 1, 2987}, + {0x0, 0, 2, 2988}, + {0x1f42, 16, 16, 2990}, + {0x0, 0, 1, 2990}, + {0x0, 0, 1, 2991}, + {0x0, 3, 4, 2992}, + {0x0, 0, 1, 2993}, + {0x0, 0, 2, 2994}, + {0x1f43, 16, 16, 2996}, + {0x1f44, 16, 16, 2996}, + {0x1f45, 16, 16, 2996}, + {0x0, 3, 5, 2996}, + {0x1f48, 16, 16, 2998}, + {0x1f49, 16, 16, 2998}, + {0x0, 0, 1, 2998}, + {0x0, 0, 1, 2999}, + {0x0, 3, 4, 3000}, + {0x0, 0, 1, 3001}, + {0x0, 0, 2, 3002}, + {0x1f4a, 16, 16, 3004}, + {0x0, 0, 1, 3004}, {0x0, 0, 1, 3005}, - {0x0, 9, 10, 3006}, - {0x0, 9, 11, 3007}, - {0x30dc, 16, 16, 3009}, - {0x0, 6, 11, 3009}, - {0x0, 0, 1, 3014}, - {0x0, 0, 1, 3015}, - {0x0, 12, 13, 3016}, - {0x0, 13, 14, 3017}, - {0x0, 5, 6, 3018}, - {0xccb, 16, 16, 3019}, - {0x0, 4, 9, 3019}, - {0x2f9e7, 16, 16, 3024}, - {0x0, 3, 8, 3024}, - {0x1e32, 16, 16, 3029}, - {0x0, 0, 1, 3029}, - {0x0, 0, 1, 3030}, - {0x0, 3, 4, 3031}, - {0x0, 0, 5, 3032}, - {0x0, 2, 3, 3037}, - {0x1f36, 16, 16, 3038}, - {0x0, 3, 14, 3038}, - {0x0, 0, 1, 3049}, - {0x0, 0, 1, 3050}, - {0x0, 3, 4, 3051}, - {0x0, 0, 1, 3052}, - {0x0, 4, 12, 3053}, - {0x45e, 16, 16, 3061}, - {0x136, 16, 16, 3061}, - {0x0, 6, 8, 3061}, - {0x0, 0, 1, 3063}, - {0x0, 0, 1, 3064}, - {0x0, 11, 12, 3065}, - {0x0, 11, 14, 3066}, - {0x0, 7, 8, 3069}, - {0xbcc, 16, 16, 3070}, - {0x0, 3, 4, 3070}, - {0xf981, 16, 16, 3071}, - {0x0, 0, 1, 3071}, - {0x0, 0, 1, 3072}, - {0x0, 3, 4, 3073}, - {0x0, 0, 4, 3074}, - {0x0, 0, 16, 3078}, - {0x1ec8, 16, 16, 3094}, - {0x0, 3, 4, 3094}, - {0x343, 16, 16, 3095}, - {0x12c, 16, 16, 3095}, - {0x0, 3, 16, 3095}, - {0x2f870, 16, 16, 3108}, - {0xf9b1, 16, 16, 3108}, - {0x0, 0, 15, 3108}, - {0x2f97f, 16, 16, 3123}, - {0x2f8cc, 16, 16, 3123}, - {0x0, 0, 1, 3123}, - {0x0, 0, 1, 3124}, - {0x0, 3, 4, 3125}, - {0x0, 0, 1, 3126}, - {0x0, 4, 5, 3127}, - {0x1ed, 16, 16, 3128}, - {0x30dd, 16, 16, 3128}, - {0x0, 0, 7, 3128}, - {0x0, 11, 12, 3135}, - {0x2f984, 16, 16, 3136}, - {0x0, 1, 12, 3136}, - {0x0, 13, 14, 3147}, + {0x0, 3, 4, 3006}, + {0x0, 0, 1, 3007}, + {0x0, 0, 2, 3008}, + {0x1f4b, 16, 16, 3010}, + {0x1f4c, 16, 16, 3010}, + {0x1f4d, 16, 16, 3010}, + {0x0, 3, 5, 3010}, + {0x1f50, 16, 16, 3012}, + {0x1f51, 16, 16, 3012}, + {0x0, 0, 10, 3012}, + {0x0, 0, 1, 3022}, + {0x0, 0, 1, 3023}, + {0x0, 3, 4, 3024}, + {0x0, 0, 5, 3025}, + {0x0, 0, 2, 3030}, + {0x1f52, 16, 16, 3032}, + {0x0, 0, 1, 3032}, + {0x0, 0, 1, 3033}, + {0x0, 3, 4, 3034}, + {0x0, 0, 5, 3035}, + {0x0, 0, 2, 3040}, + {0x1f53, 16, 16, 3042}, + {0x1f54, 16, 16, 3042}, + {0x1f55, 16, 16, 3042}, + {0x0, 2, 3, 3042}, + {0x1f56, 16, 16, 3043}, + {0x0, 2, 3, 3043}, + {0x1f57, 16, 16, 3044}, + {0x0, 4, 5, 3044}, + {0x1f59, 16, 16, 3045}, + {0x0, 0, 1, 3045}, + {0x0, 0, 1, 3046}, + {0x0, 3, 4, 3047}, + {0x0, 0, 5, 3048}, + {0x0, 0, 2, 3053}, + {0x1f5b, 16, 16, 3055}, + {0x1f5d, 16, 16, 3055}, + {0x0, 2, 3, 3055}, + {0x1f5f, 16, 16, 3056}, + {0x0, 3, 5, 3056}, + {0x1f60, 16, 16, 3058}, + {0x1f61, 16, 16, 3058}, + {0x0, 0, 16, 3058}, + {0x0, 0, 1, 3074}, + {0x0, 0, 1, 3075}, + {0x0, 3, 4, 3076}, + {0x0, 0, 5, 3077}, + {0x0, 0, 2, 3082}, + {0x1f62, 16, 16, 3084}, + {0x0, 0, 1, 3084}, + {0x0, 0, 1, 3085}, + {0x0, 3, 4, 3086}, + {0x0, 0, 5, 3087}, + {0x0, 0, 2, 3092}, + {0x1f63, 16, 16, 3094}, + {0x1f64, 16, 16, 3094}, + {0x1f65, 16, 16, 3094}, + {0x0, 2, 6, 3094}, + {0x1f66, 16, 16, 3098}, + {0x0, 2, 6, 3098}, + {0x1f67, 16, 16, 3102}, + {0x0, 3, 5, 3102}, + {0x1f68, 16, 16, 3104}, + {0x1f69, 16, 16, 3104}, + {0x0, 0, 1, 3104}, + {0x0, 0, 1, 3105}, + {0x0, 3, 4, 3106}, + {0x0, 0, 5, 3107}, + {0x0, 0, 2, 3112}, + {0x1f6a, 16, 16, 3114}, + {0x0, 0, 1, 3114}, + {0x0, 0, 1, 3115}, + {0x0, 3, 4, 3116}, + {0x0, 0, 5, 3117}, + {0x0, 0, 2, 3122}, + {0x1f6b, 16, 16, 3124}, + {0x1f6c, 16, 16, 3124}, + {0x1f6d, 16, 16, 3124}, + {0x0, 2, 6, 3124}, + {0x1f6e, 16, 16, 3128}, + {0x0, 2, 6, 3128}, + {0x1f6f, 16, 16, 3132}, + {0x1f70, 16, 16, 3132}, + {0x1f71, 0, 1, 3132}, + {0x1f72, 16, 16, 3133}, + {0x1f73, 16, 16, 3133}, + {0x1f74, 16, 16, 3133}, + {0x1f75, 0, 1, 3133}, + {0x1f76, 16, 16, 3134}, + {0x1f77, 16, 16, 3134}, + {0x1f78, 16, 16, 3134}, + {0x1f79, 16, 16, 3134}, + {0x1f7a, 16, 16, 3134}, + {0x1f7b, 16, 16, 3134}, + {0x1f7c, 16, 16, 3134}, + {0x1f7d, 0, 1, 3134}, + {0x1f80, 16, 16, 3135}, + {0x1f81, 16, 16, 3135}, + {0x0, 0, 1, 3135}, + {0x0, 0, 1, 3136}, + {0x0, 3, 4, 3137}, + {0x0, 4, 5, 3138}, + {0x0, 5, 6, 3139}, + {0x1f82, 16, 16, 3140}, + {0x0, 0, 1, 3140}, + {0x0, 0, 1, 3141}, + {0x0, 3, 4, 3142}, + {0x0, 4, 5, 3143}, + {0x0, 5, 6, 3144}, + {0x1f83, 16, 16, 3145}, + {0x0, 0, 1, 3145}, + {0x0, 0, 1, 3146}, + {0x0, 3, 4, 3147}, {0x0, 4, 5, 3148}, - {0x2f8a4, 16, 16, 3149}, - {0x2f9c6, 16, 16, 3149}, - {0x2f872, 16, 16, 3149}, - {0x0, 2, 16, 3149}, - {0x0, 12, 13, 3163}, - {0xf9c3, 16, 16, 3164}, - {0xf945, 16, 16, 3164}, + {0x0, 5, 6, 3149}, + {0x1f84, 16, 16, 3150}, + {0x0, 0, 1, 3150}, + {0x0, 0, 1, 3151}, + {0x0, 3, 4, 3152}, + {0x0, 4, 5, 3153}, + {0x0, 5, 6, 3154}, + {0x1f85, 16, 16, 3155}, + {0x0, 0, 1, 3155}, + {0x0, 0, 1, 3156}, + {0x0, 3, 4, 3157}, + {0x0, 4, 5, 3158}, + {0x0, 5, 6, 3159}, + {0x1f86, 16, 16, 3160}, + {0x0, 0, 1, 3160}, + {0x0, 0, 1, 3161}, + {0x0, 3, 4, 3162}, + {0x0, 4, 5, 3163}, {0x0, 5, 6, 3164}, - {0xf90f, 16, 16, 3165}, - {0x0, 1, 16, 3165}, - {0x0, 13, 14, 3180}, - {0x2f884, 16, 16, 3181}, + {0x1f87, 16, 16, 3165}, + {0x1f88, 16, 16, 3165}, + {0x1f89, 16, 16, 3165}, + {0x0, 0, 1, 3165}, + {0x0, 0, 1, 3166}, + {0x0, 3, 4, 3167}, + {0x0, 4, 5, 3168}, + {0x0, 5, 6, 3169}, + {0x1f8a, 16, 16, 3170}, + {0x0, 0, 1, 3170}, + {0x0, 0, 1, 3171}, + {0x0, 3, 4, 3172}, + {0x0, 4, 5, 3173}, + {0x0, 5, 6, 3174}, + {0x1f8b, 16, 16, 3175}, + {0x0, 0, 1, 3175}, + {0x0, 0, 1, 3176}, + {0x0, 3, 4, 3177}, + {0x0, 4, 5, 3178}, + {0x0, 5, 6, 3179}, + {0x1f8c, 16, 16, 3180}, + {0x0, 0, 1, 3180}, {0x0, 0, 1, 3181}, - {0x0, 0, 1, 3182}, - {0x0, 3, 4, 3183}, - {0x0, 0, 1, 3184}, - {0x0, 8, 9, 3185}, - {0x4f9, 16, 16, 3186}, - {0x0, 5, 6, 3186}, - {0x2f921, 16, 16, 3187}, - {0x0, 8, 10, 3187}, - {0xfa4d, 16, 16, 3189}, - {0xfa4e, 16, 16, 3189}, - {0x0, 1, 16, 3189}, - {0x0, 11, 12, 3204}, - {0x2fa15, 16, 16, 3205}, - {0x0, 7, 16, 3205}, - {0xf988, 16, 16, 3214}, - {0x0, 11, 12, 3214}, - {0x2f863, 16, 16, 3215}, - {0x0, 0, 5, 3215}, - {0x0, 7, 8, 3220}, - {0xf950, 16, 16, 3221}, - {0x0, 0, 16, 3221}, - {0x0, 9, 16, 3237}, - {0xf95b, 16, 16, 3244}, - {0x0, 0, 1, 3244}, + {0x0, 3, 4, 3182}, + {0x0, 4, 5, 3183}, + {0x0, 5, 6, 3184}, + {0x1f8d, 16, 16, 3185}, + {0x0, 0, 1, 3185}, + {0x0, 0, 1, 3186}, + {0x0, 3, 4, 3187}, + {0x0, 4, 5, 3188}, + {0x0, 5, 6, 3189}, + {0x1f8e, 16, 16, 3190}, + {0x0, 0, 1, 3190}, + {0x0, 0, 1, 3191}, + {0x0, 3, 4, 3192}, + {0x0, 4, 5, 3193}, + {0x0, 5, 6, 3194}, + {0x1f8f, 16, 16, 3195}, + {0x1f90, 16, 16, 3195}, + {0x1f91, 16, 16, 3195}, + {0x0, 0, 1, 3195}, + {0x0, 0, 1, 3196}, + {0x0, 3, 4, 3197}, + {0x0, 4, 5, 3198}, + {0x0, 5, 6, 3199}, + {0x1f92, 16, 16, 3200}, + {0x0, 0, 1, 3200}, + {0x0, 0, 1, 3201}, + {0x0, 3, 4, 3202}, + {0x0, 4, 5, 3203}, + {0x0, 5, 6, 3204}, + {0x1f93, 16, 16, 3205}, + {0x0, 0, 1, 3205}, + {0x0, 0, 1, 3206}, + {0x0, 3, 4, 3207}, + {0x0, 4, 5, 3208}, + {0x0, 5, 6, 3209}, + {0x1f94, 16, 16, 3210}, + {0x0, 0, 1, 3210}, + {0x0, 0, 1, 3211}, + {0x0, 3, 4, 3212}, + {0x0, 4, 5, 3213}, + {0x0, 5, 6, 3214}, + {0x1f95, 16, 16, 3215}, + {0x0, 0, 1, 3215}, + {0x0, 0, 1, 3216}, + {0x0, 3, 4, 3217}, + {0x0, 4, 5, 3218}, + {0x0, 5, 6, 3219}, + {0x1f96, 16, 16, 3220}, + {0x0, 0, 1, 3220}, + {0x0, 0, 1, 3221}, + {0x0, 3, 4, 3222}, + {0x0, 4, 5, 3223}, + {0x0, 5, 6, 3224}, + {0x1f97, 16, 16, 3225}, + {0x1f98, 16, 16, 3225}, + {0x1f99, 16, 16, 3225}, + {0x0, 0, 1, 3225}, + {0x0, 0, 1, 3226}, + {0x0, 3, 4, 3227}, + {0x0, 4, 5, 3228}, + {0x0, 5, 6, 3229}, + {0x1f9a, 16, 16, 3230}, + {0x0, 0, 1, 3230}, + {0x0, 0, 1, 3231}, + {0x0, 3, 4, 3232}, + {0x0, 4, 5, 3233}, + {0x0, 5, 6, 3234}, + {0x1f9b, 16, 16, 3235}, + {0x0, 0, 1, 3235}, + {0x0, 0, 1, 3236}, + {0x0, 3, 4, 3237}, + {0x0, 4, 5, 3238}, + {0x0, 5, 6, 3239}, + {0x1f9c, 16, 16, 3240}, + {0x0, 0, 1, 3240}, + {0x0, 0, 1, 3241}, + {0x0, 3, 4, 3242}, + {0x0, 4, 5, 3243}, + {0x0, 5, 6, 3244}, + {0x1f9d, 16, 16, 3245}, {0x0, 0, 1, 3245}, - {0x0, 3, 4, 3246}, - {0x0, 0, 1, 3247}, - {0x0, 7, 9, 3248}, - {0x1e8a, 16, 16, 3250}, + {0x0, 0, 1, 3246}, + {0x0, 3, 4, 3247}, + {0x0, 4, 5, 3248}, + {0x0, 5, 6, 3249}, + {0x1f9e, 16, 16, 3250}, {0x0, 0, 1, 3250}, {0x0, 0, 1, 3251}, {0x0, 3, 4, 3252}, - {0x0, 0, 5, 3253}, - {0x0, 0, 2, 3258}, - {0x3b0, 16, 16, 3260}, - {0x1fe2, 16, 16, 3260}, - {0x0, 1, 15, 3260}, - {0x0, 2, 3, 3274}, - {0x2f8e8, 16, 16, 3275}, - {0xf9f3, 16, 16, 3275}, - {0x1e8c, 16, 16, 3275}, + {0x0, 4, 5, 3253}, + {0x0, 5, 6, 3254}, + {0x1f9f, 16, 16, 3255}, + {0x1fa0, 16, 16, 3255}, + {0x1fa1, 16, 16, 3255}, + {0x0, 0, 1, 3255}, + {0x0, 0, 1, 3256}, + {0x0, 3, 4, 3257}, + {0x0, 4, 5, 3258}, + {0x0, 5, 6, 3259}, + {0x1fa2, 16, 16, 3260}, + {0x0, 0, 1, 3260}, + {0x0, 0, 1, 3261}, + {0x0, 3, 4, 3262}, + {0x0, 4, 5, 3263}, + {0x0, 5, 6, 3264}, + {0x1fa3, 16, 16, 3265}, + {0x0, 0, 1, 3265}, + {0x0, 0, 1, 3266}, + {0x0, 3, 4, 3267}, + {0x0, 4, 5, 3268}, + {0x0, 5, 6, 3269}, + {0x1fa4, 16, 16, 3270}, + {0x0, 0, 1, 3270}, + {0x0, 0, 1, 3271}, + {0x0, 3, 4, 3272}, + {0x0, 4, 5, 3273}, + {0x0, 5, 6, 3274}, + {0x1fa5, 16, 16, 3275}, {0x0, 0, 1, 3275}, - {0x0, 3, 4, 3276}, - {0x0, 0, 1, 3277}, - {0x0, 9, 10, 3278}, - {0x0, 9, 10, 3279}, - {0x30bc, 16, 16, 3280}, + {0x0, 0, 1, 3276}, + {0x0, 3, 4, 3277}, + {0x0, 4, 5, 3278}, + {0x0, 5, 6, 3279}, + {0x1fa6, 16, 16, 3280}, {0x0, 0, 1, 3280}, {0x0, 0, 1, 3281}, {0x0, 3, 4, 3282}, - {0x0, 0, 1, 3283}, - {0x0, 4, 5, 3284}, - {0x1e38, 16, 16, 3285}, - {0x0, 9, 10, 3285}, - {0xf966, 16, 16, 3286}, - {0x0, 2, 3, 3286}, - {0x0, 14, 15, 3287}, - {0x2f9e5, 16, 16, 3288}, - {0x0, 1, 2, 3288}, - {0x206, 16, 16, 3289}, - {0x0, 5, 16, 3289}, - {0x1fcb, 16, 16, 3300}, - {0x0, 3, 4, 3300}, - {0x1e42, 16, 16, 3301}, - {0x0, 4, 16, 3301}, - {0x0, 0, 1, 3313}, - {0x2fa0b, 16, 16, 3314}, - {0x0, 13, 14, 3314}, - {0x2f89d, 16, 16, 3315}, - {0x0, 1, 15, 3315}, - {0xfa44, 16, 16, 3329}, - {0x0, 8, 13, 3329}, - {0xfa3a, 16, 16, 3334}, - {0x0, 1, 15, 3334}, - {0x0, 2, 13, 3348}, - {0xf960, 16, 16, 3359}, - {0x0, 1, 2, 3359}, - {0x0, 13, 14, 3360}, - {0x2f94d, 16, 16, 3361}, - {0x0, 13, 14, 3361}, - {0xf923, 16, 16, 3362}, - {0x0, 4, 5, 3362}, - {0xf91d, 16, 16, 3363}, - {0x0, 12, 13, 3363}, - {0x0, 14, 15, 3364}, - {0x2fa10, 16, 16, 3365}, - {0x0, 0, 1, 3365}, - {0x0, 0, 1, 3366}, - {0x0, 3, 4, 3367}, - {0x0, 0, 5, 3368}, - {0x0, 0, 2, 3373}, - {0x1f33, 16, 16, 3375}, - {0x0, 0, 1, 3375}, - {0x0, 0, 1, 3376}, - {0x0, 3, 4, 3377}, + {0x0, 4, 5, 3283}, + {0x0, 5, 6, 3284}, + {0x1fa7, 16, 16, 3285}, + {0x1fa8, 16, 16, 3285}, + {0x1fa9, 16, 16, 3285}, + {0x0, 0, 1, 3285}, + {0x0, 0, 1, 3286}, + {0x0, 3, 4, 3287}, + {0x0, 4, 5, 3288}, + {0x0, 5, 6, 3289}, + {0x1faa, 16, 16, 3290}, + {0x0, 0, 1, 3290}, + {0x0, 0, 1, 3291}, + {0x0, 3, 4, 3292}, + {0x0, 4, 5, 3293}, + {0x0, 5, 6, 3294}, + {0x1fab, 16, 16, 3295}, + {0x0, 0, 1, 3295}, + {0x0, 0, 1, 3296}, + {0x0, 3, 4, 3297}, + {0x0, 4, 5, 3298}, + {0x0, 5, 6, 3299}, + {0x1fac, 16, 16, 3300}, + {0x0, 0, 1, 3300}, + {0x0, 0, 1, 3301}, + {0x0, 3, 4, 3302}, + {0x0, 4, 5, 3303}, + {0x0, 5, 6, 3304}, + {0x1fad, 16, 16, 3305}, + {0x0, 0, 1, 3305}, + {0x0, 0, 1, 3306}, + {0x0, 3, 4, 3307}, + {0x0, 4, 5, 3308}, + {0x0, 5, 6, 3309}, + {0x1fae, 16, 16, 3310}, + {0x0, 0, 1, 3310}, + {0x0, 0, 1, 3311}, + {0x0, 3, 4, 3312}, + {0x0, 4, 5, 3313}, + {0x0, 5, 6, 3314}, + {0x1faf, 16, 16, 3315}, + {0x1fb0, 16, 16, 3315}, + {0x1fb1, 16, 16, 3315}, + {0x0, 0, 13, 3315}, + {0x0, 0, 1, 3328}, + {0x0, 0, 1, 3329}, + {0x0, 3, 4, 3330}, + {0x0, 4, 5, 3331}, + {0x0, 5, 6, 3332}, + {0x1fb2, 16, 16, 3333}, + {0x0, 2, 6, 3333}, + {0x1fb3, 16, 16, 3337}, + {0x0, 0, 1, 3337}, + {0x0, 3, 4, 3338}, + {0x0, 4, 5, 3339}, + {0x0, 5, 6, 3340}, + {0x1fb4, 16, 16, 3341}, + {0x1fb6, 16, 16, 3341}, + {0x0, 6, 16, 3341}, + {0x0, 0, 1, 3351}, + {0x0, 0, 1, 3352}, + {0x0, 3, 4, 3353}, + {0x0, 4, 5, 3354}, + {0x0, 5, 6, 3355}, + {0x1fb7, 16, 16, 3356}, + {0x1fb8, 16, 16, 3356}, + {0x1fb9, 16, 16, 3356}, + {0x1fba, 16, 16, 3356}, + {0x0, 5, 16, 3356}, + {0x1fbb, 16, 16, 3367}, + {0x0, 5, 6, 3367}, + {0x1fbc, 16, 16, 3368}, + {0x0, 2, 3, 3368}, + {0x1fc1, 16, 16, 3369}, + {0x0, 0, 1, 3369}, + {0x0, 0, 1, 3370}, + {0x0, 3, 4, 3371}, + {0x0, 4, 5, 3372}, + {0x0, 5, 6, 3373}, + {0x1fc2, 16, 16, 3374}, + {0x0, 2, 6, 3374}, + {0x1fc3, 16, 16, 3378}, {0x0, 0, 1, 3378}, - {0x0, 7, 8, 3379}, - {0x1e1e, 16, 16, 3380}, - {0x1f35, 16, 16, 3380}, - {0x0, 15, 16, 3380}, - {0xfa41, 16, 16, 3381}, - {0xf9ac, 16, 16, 3381}, - {0x2f858, 16, 16, 3381}, - {0x0, 0, 1, 3381}, - {0x0, 0, 1, 3382}, - {0x0, 3, 4, 3383}, - {0x0, 4, 5, 3384}, - {0x0, 5, 6, 3385}, - {0x1f82, 16, 16, 3386}, - {0x0, 11, 12, 3386}, - {0xf9d8, 16, 16, 3387}, - {0x0, 0, 15, 3387}, - {0x0, 0, 1, 3402}, - {0x0, 0, 1, 3403}, - {0x0, 3, 4, 3404}, - {0x0, 0, 1, 3405}, - {0x0, 0, 9, 3406}, - {0x4d6, 16, 16, 3415}, - {0x0, 5, 6, 3415}, - {0xf983, 16, 16, 3416}, - {0x400, 16, 16, 3416}, - {0x0, 0, 1, 3416}, - {0x0, 0, 1, 3417}, - {0x0, 3, 4, 3418}, - {0x0, 0, 5, 3419}, - {0x0, 0, 2, 3424}, - {0x1f0d, 16, 16, 3426}, - {0x1f0b, 16, 16, 3426}, - {0x401, 16, 16, 3426}, - {0x0, 10, 14, 3426}, - {0x2f8c5, 16, 16, 3430}, - {0xf991, 16, 16, 3430}, - {0x0, 1, 2, 3430}, - {0x207, 16, 16, 3431}, - {0x0, 10, 12, 3431}, - {0x0, 0, 1, 3433}, - {0x0, 0, 1, 3434}, - {0x0, 3, 4, 3435}, + {0x0, 3, 4, 3379}, + {0x0, 4, 5, 3380}, + {0x0, 5, 6, 3381}, + {0x1fc4, 16, 16, 3382}, + {0x1fc6, 16, 16, 3382}, + {0x0, 6, 7, 3382}, + {0x0, 0, 1, 3383}, + {0x0, 0, 1, 3384}, + {0x0, 3, 4, 3385}, + {0x0, 4, 5, 3386}, + {0x0, 5, 6, 3387}, + {0x1fc7, 16, 16, 3388}, + {0x1fc8, 16, 16, 3388}, + {0x1fc9, 16, 16, 3388}, + {0x1fca, 16, 16, 3388}, + {0x1fcb, 16, 16, 3388}, + {0x0, 5, 6, 3388}, + {0x1fcc, 16, 16, 3389}, + {0x0, 0, 1, 3389}, + {0x0, 0, 1, 3390}, + {0x0, 3, 4, 3391}, + {0x0, 0, 5, 3392}, + {0x0, 0, 2, 3397}, + {0x1fcd, 16, 16, 3399}, + {0x1fce, 16, 16, 3399}, + {0x0, 2, 3, 3399}, + {0x1fcf, 16, 16, 3400}, + {0x1fd0, 16, 16, 3400}, + {0x1fd1, 16, 16, 3400}, + {0x1fd2, 16, 16, 3400}, + {0x1fd3, 16, 16, 3400}, + {0x0, 2, 3, 3400}, + {0x1fd6, 16, 16, 3401}, + {0x0, 2, 3, 3401}, + {0x1fd7, 16, 16, 3402}, + {0x1fd8, 16, 16, 3402}, + {0x1fd9, 16, 16, 3402}, + {0x1fda, 16, 16, 3402}, + {0x1fdb, 16, 16, 3402}, + {0x0, 6, 15, 3402}, + {0x0, 0, 1, 3411}, + {0x0, 0, 1, 3412}, + {0x0, 3, 4, 3413}, + {0x0, 0, 5, 3414}, + {0x0, 0, 2, 3419}, + {0x1fdd, 16, 16, 3421}, + {0x1fde, 16, 16, 3421}, + {0x0, 2, 3, 3421}, + {0x1fdf, 16, 16, 3422}, + {0x1fe0, 16, 16, 3422}, + {0x1fe1, 16, 16, 3422}, + {0x1fe2, 16, 16, 3422}, + {0x1fe3, 16, 16, 3422}, + {0x0, 0, 1, 3422}, + {0x0, 0, 1, 3423}, + {0x0, 3, 4, 3424}, + {0x0, 1, 2, 3425}, + {0x0, 3, 5, 3426}, + {0x1fe4, 16, 16, 3428}, + {0x1fe5, 16, 16, 3428}, + {0x0, 2, 3, 3428}, + {0x1fe6, 16, 16, 3429}, + {0x0, 2, 3, 3429}, + {0x1fe7, 16, 16, 3430}, + {0x1fe8, 16, 16, 3430}, + {0x1fe9, 16, 16, 3430}, + {0x1fea, 16, 16, 3430}, + {0x1feb, 16, 16, 3430}, + {0x0, 0, 1, 3430}, + {0x0, 0, 1, 3431}, + {0x0, 3, 4, 3432}, + {0x0, 1, 2, 3433}, + {0x0, 4, 5, 3434}, + {0x1fec, 16, 16, 3435}, + {0x1fed, 16, 16, 3435}, + {0x1fee, 16, 16, 3435}, + {0x1fef, 16, 16, 3435}, + {0x0, 0, 1, 3435}, {0x0, 0, 1, 3436}, - {0x0, 7, 8, 3437}, - {0x1e64, 16, 16, 3438}, - {0x0, 5, 6, 3438}, - {0x2f9a6, 16, 16, 3439}, - {0x0, 4, 8, 3439}, - {0x387, 16, 16, 3443}, - {0x1ffd, 16, 16, 3443}, - {0x0, 9, 11, 3443}, - {0xf928, 16, 16, 3445}, - {0x0, 0, 1, 3445}, - {0x0, 0, 1, 3446}, - {0x0, 3, 4, 3447}, - {0x0, 0, 3, 3448}, - {0x0, 3, 4, 3451}, - {0x1ee2, 16, 16, 3452}, - {0x0, 4, 16, 3452}, - {0x0, 4, 14, 3464}, - {0xf9d1, 16, 16, 3474}, - {0x0, 1, 14, 3474}, - {0x0, 1, 12, 3487}, - {0x2f9e6, 16, 16, 3498}, - {0x0, 13, 14, 3498}, - {0x2fa0c, 16, 16, 3499}, - {0x0, 0, 1, 3499}, + {0x0, 3, 4, 3437}, + {0x0, 4, 5, 3438}, + {0x0, 5, 6, 3439}, + {0x1ff2, 16, 16, 3440}, + {0x0, 2, 6, 3440}, + {0x1ff3, 16, 16, 3444}, + {0x0, 0, 1, 3444}, + {0x0, 3, 4, 3445}, + {0x0, 4, 5, 3446}, + {0x0, 5, 6, 3447}, + {0x1ff4, 16, 16, 3448}, + {0x1ff6, 16, 16, 3448}, + {0x0, 0, 1, 3448}, + {0x0, 0, 1, 3449}, + {0x0, 3, 4, 3450}, + {0x0, 4, 5, 3451}, + {0x0, 5, 6, 3452}, + {0x1ff7, 16, 16, 3453}, + {0x1ff8, 16, 16, 3453}, + {0x1ff9, 16, 16, 3453}, + {0x1ffa, 16, 16, 3453}, + {0x1ffb, 16, 16, 3453}, + {0x0, 5, 6, 3453}, + {0x1ffc, 16, 16, 3454}, + {0x1ffd, 16, 16, 3454}, + {0x0, 0, 3, 3454}, + {0x0, 0, 1, 3457}, + {0x0, 2, 4, 3458}, + {0x2000, 16, 16, 3460}, + {0x2001, 16, 16, 3460}, + {0x0, 9, 14, 3460}, + {0x0, 0, 5, 3465}, + {0x0, 0, 1, 3470}, + {0x0, 0, 1, 3471}, + {0x0, 3, 4, 3472}, + {0x0, 3, 4, 3473}, + {0x0, 8, 9, 3474}, + {0x219a, 16, 16, 3475}, + {0x0, 0, 1, 3475}, + {0x0, 0, 1, 3476}, + {0x0, 3, 4, 3477}, + {0x0, 3, 4, 3478}, + {0x0, 8, 9, 3479}, + {0x219b, 16, 16, 3480}, + {0x0, 0, 1, 3480}, + {0x0, 0, 1, 3481}, + {0x0, 3, 4, 3482}, + {0x0, 3, 4, 3483}, + {0x0, 8, 9, 3484}, + {0x21ae, 16, 16, 3485}, + {0x0, 0, 5, 3485}, + {0x0, 0, 1, 3490}, + {0x0, 0, 1, 3491}, + {0x0, 3, 4, 3492}, + {0x0, 3, 4, 3493}, + {0x0, 8, 9, 3494}, + {0x21cd, 16, 16, 3495}, + {0x0, 0, 1, 3495}, + {0x0, 0, 1, 3496}, + {0x0, 3, 4, 3497}, + {0x0, 3, 4, 3498}, + {0x0, 8, 9, 3499}, + {0x21ce, 16, 16, 3500}, {0x0, 0, 1, 3500}, - {0x0, 3, 4, 3501}, - {0x0, 0, 1, 3502}, - {0x0, 4, 5, 3503}, - {0x230, 16, 16, 3504}, - {0x0, 0, 1, 3504}, - {0x0, 0, 1, 3505}, - {0x0, 3, 4, 3506}, - {0x0, 4, 5, 3507}, - {0x0, 5, 6, 3508}, - {0x1faf, 16, 16, 3509}, - {0x0, 14, 15, 3509}, - {0xf9a6, 16, 16, 3510}, - {0x0, 13, 14, 3510}, - {0x2f87a, 16, 16, 3511}, - {0x0, 0, 7, 3511}, - {0x3ac, 16, 16, 3518}, - {0x1f70, 16, 16, 3518}, - {0x0, 7, 8, 3518}, - {0x0, 0, 1, 3519}, - {0x0, 0, 1, 3520}, - {0x0, 6, 7, 3521}, - {0x0, 5, 6, 3522}, - {0x0, 3, 6, 3523}, - {0x623, 16, 16, 3526}, - {0x625, 16, 16, 3526}, - {0x1fb1, 16, 16, 3526}, - {0x1fb0, 16, 16, 3526}, - {0xf9a2, 16, 16, 3526}, - {0x0, 10, 11, 3526}, - {0xf9d6, 16, 16, 3527}, - {0x0, 3, 4, 3527}, - {0x2f844, 16, 16, 3528}, - {0x0, 1, 2, 3528}, - {0x1e0f, 16, 16, 3529}, - {0x0, 14, 15, 3529}, - {0xf9c0, 16, 16, 3530}, - {0x0, 6, 7, 3530}, - {0xf9dc, 16, 16, 3531}, - {0x2f810, 16, 16, 3531}, - {0x2f814, 16, 16, 3531}, - {0xf978, 16, 16, 3531}, - {0x2f9e4, 16, 16, 3531}, - {0x0, 0, 16, 3531}, - {0x0, 13, 14, 3547}, - {0xf9ed, 16, 16, 3548}, - {0x0, 0, 1, 3548}, - {0x0, 3, 4, 3549}, + {0x0, 0, 1, 3501}, + {0x0, 3, 4, 3502}, + {0x0, 3, 4, 3503}, + {0x0, 8, 9, 3504}, + {0x21cf, 16, 16, 3505}, + {0x0, 0, 12, 3505}, + {0x0, 3, 12, 3517}, + {0x0, 0, 1, 3526}, + {0x0, 0, 1, 3527}, + {0x0, 3, 4, 3528}, + {0x0, 3, 4, 3529}, + {0x0, 8, 9, 3530}, + {0x2204, 16, 16, 3531}, + {0x0, 0, 1, 3531}, + {0x0, 0, 1, 3532}, + {0x0, 3, 4, 3533}, + {0x0, 3, 4, 3534}, + {0x0, 8, 9, 3535}, + {0x2209, 16, 16, 3536}, + {0x0, 0, 1, 3536}, + {0x0, 0, 1, 3537}, + {0x0, 3, 4, 3538}, + {0x0, 3, 4, 3539}, + {0x0, 8, 9, 3540}, + {0x220c, 16, 16, 3541}, + {0x0, 3, 6, 3541}, + {0x0, 0, 1, 3544}, + {0x0, 0, 1, 3545}, + {0x0, 3, 4, 3546}, + {0x0, 3, 4, 3547}, + {0x0, 8, 9, 3548}, + {0x2224, 16, 16, 3549}, + {0x0, 0, 1, 3549}, {0x0, 0, 1, 3550}, - {0x0, 9, 10, 3551}, - {0x0, 9, 11, 3552}, - {0x3071, 16, 16, 3554}, - {0x0, 2, 16, 3554}, - {0x0, 1, 12, 3568}, - {0x2f9af, 16, 16, 3579}, - {0x0, 0, 1, 3579}, - {0x0, 0, 1, 3580}, - {0x0, 3, 4, 3581}, - {0x0, 0, 4, 3582}, - {0x0, 3, 14, 3586}, - {0x1e4b, 16, 16, 3597}, + {0x0, 3, 4, 3551}, + {0x0, 3, 4, 3552}, + {0x0, 8, 9, 3553}, + {0x2226, 16, 16, 3554}, + {0x0, 12, 13, 3554}, + {0x0, 0, 1, 3555}, + {0x0, 0, 1, 3556}, + {0x0, 3, 4, 3557}, + {0x0, 3, 4, 3558}, + {0x0, 8, 9, 3559}, + {0x2241, 16, 16, 3560}, + {0x0, 3, 14, 3560}, + {0x0, 0, 1, 3571}, + {0x0, 0, 1, 3572}, + {0x0, 3, 4, 3573}, + {0x0, 3, 4, 3574}, + {0x0, 8, 9, 3575}, + {0x2244, 16, 16, 3576}, + {0x0, 0, 1, 3576}, + {0x0, 0, 1, 3577}, + {0x0, 3, 4, 3578}, + {0x0, 3, 4, 3579}, + {0x0, 8, 9, 3580}, + {0x2247, 16, 16, 3581}, + {0x0, 0, 1, 3581}, + {0x0, 0, 1, 3582}, + {0x0, 3, 4, 3583}, + {0x0, 3, 4, 3584}, + {0x0, 8, 9, 3585}, + {0x2249, 16, 16, 3586}, + {0x0, 0, 1, 3586}, + {0x0, 0, 1, 3587}, + {0x0, 3, 4, 3588}, + {0x0, 3, 4, 3589}, + {0x0, 8, 9, 3590}, + {0x2260, 16, 16, 3591}, + {0x0, 1, 6, 3591}, + {0x0, 0, 1, 3596}, {0x0, 0, 1, 3597}, - {0x0, 0, 1, 3598}, + {0x0, 3, 4, 3598}, {0x0, 3, 4, 3599}, - {0x0, 4, 5, 3600}, - {0x0, 5, 6, 3601}, - {0x1f9a, 16, 16, 3602}, - {0x0, 5, 7, 3602}, - {0x2f829, 16, 16, 3604}, - {0x2f82a, 16, 16, 3604}, - {0x0, 3, 16, 3604}, - {0x0, 14, 15, 3617}, - {0xf999, 16, 16, 3618}, - {0x0, 7, 15, 3618}, - {0xf9bc, 16, 16, 3626}, - {0x0, 0, 1, 3626}, - {0x0, 0, 1, 3627}, - {0x0, 3, 4, 3628}, - {0x0, 3, 4, 3629}, - {0x0, 8, 9, 3630}, - {0x21cd, 16, 16, 3631}, - {0x0, 0, 1, 3631}, - {0x0, 0, 1, 3632}, - {0x0, 3, 4, 3633}, - {0x0, 3, 4, 3634}, - {0x0, 8, 9, 3635}, - {0x2262, 16, 16, 3636}, - {0x0, 0, 2, 3636}, - {0x3ae, 16, 16, 3638}, - {0x1f74, 16, 16, 3638}, + {0x0, 8, 9, 3600}, + {0x2262, 16, 16, 3601}, + {0x0, 0, 1, 3601}, + {0x0, 0, 1, 3602}, + {0x0, 3, 4, 3603}, + {0x0, 3, 4, 3604}, + {0x0, 8, 9, 3605}, + {0x226d, 16, 16, 3606}, + {0x0, 0, 1, 3606}, + {0x0, 0, 1, 3607}, + {0x0, 3, 4, 3608}, + {0x0, 3, 4, 3609}, + {0x0, 8, 9, 3610}, + {0x226e, 16, 16, 3611}, + {0x0, 0, 1, 3611}, + {0x0, 0, 1, 3612}, + {0x0, 3, 4, 3613}, + {0x0, 3, 4, 3614}, + {0x0, 8, 9, 3615}, + {0x226f, 16, 16, 3616}, + {0x0, 0, 1, 3616}, + {0x0, 0, 1, 3617}, + {0x0, 3, 4, 3618}, + {0x0, 3, 4, 3619}, + {0x0, 8, 9, 3620}, + {0x2270, 16, 16, 3621}, + {0x0, 0, 1, 3621}, + {0x0, 0, 1, 3622}, + {0x0, 3, 4, 3623}, + {0x0, 3, 4, 3624}, + {0x0, 8, 9, 3625}, + {0x2271, 16, 16, 3626}, + {0x0, 2, 14, 3626}, {0x0, 0, 1, 3638}, {0x0, 0, 1, 3639}, {0x0, 3, 4, 3640}, - {0x0, 0, 4, 3641}, - {0x0, 1, 2, 3645}, - {0x1e96, 16, 16, 3646}, - {0x0, 0, 1, 3646}, - {0x0, 3, 4, 3647}, + {0x0, 3, 4, 3641}, + {0x0, 8, 9, 3642}, + {0x2274, 16, 16, 3643}, + {0x0, 0, 1, 3643}, + {0x0, 0, 1, 3644}, + {0x0, 3, 4, 3645}, + {0x0, 3, 4, 3646}, + {0x0, 8, 9, 3647}, + {0x2275, 16, 16, 3648}, {0x0, 0, 1, 3648}, - {0x0, 9, 10, 3649}, - {0x0, 9, 10, 3650}, - {0x30b8, 16, 16, 3651}, - {0x0, 2, 7, 3651}, - {0xf97d, 16, 16, 3656}, - {0xf941, 16, 16, 3656}, - {0x1e47, 16, 16, 3656}, - {0x146, 16, 16, 3656}, - {0x0, 0, 1, 3656}, - {0x1e2d, 16, 16, 3657}, - {0x2f9b2, 16, 16, 3657}, - {0x0, 0, 1, 3657}, - {0xf9fa, 16, 16, 3658}, - {0x3070, 16, 16, 3658}, - {0x0, 8, 9, 3658}, - {0xf90c, 16, 16, 3659}, + {0x0, 0, 1, 3649}, + {0x0, 3, 4, 3650}, + {0x0, 3, 4, 3651}, + {0x0, 8, 9, 3652}, + {0x2278, 16, 16, 3653}, + {0x0, 0, 1, 3653}, + {0x0, 0, 1, 3654}, + {0x0, 3, 4, 3655}, + {0x0, 3, 4, 3656}, + {0x0, 8, 9, 3657}, + {0x2279, 16, 16, 3658}, + {0x0, 0, 1, 3658}, {0x0, 0, 1, 3659}, - {0x0, 0, 1, 3660}, + {0x0, 3, 4, 3660}, {0x0, 3, 4, 3661}, - {0x0, 0, 1, 3662}, - {0x0, 0, 10, 3663}, - {0x1ea6, 16, 16, 3673}, - {0x1ea4, 16, 16, 3673}, - {0x1eaa, 16, 16, 3673}, - {0x0, 14, 15, 3673}, - {0xf92c, 16, 16, 3674}, - {0x1ea8, 16, 16, 3674}, + {0x0, 8, 9, 3662}, + {0x2280, 16, 16, 3663}, + {0x0, 0, 1, 3663}, + {0x0, 0, 1, 3664}, + {0x0, 3, 4, 3665}, + {0x0, 3, 4, 3666}, + {0x0, 8, 9, 3667}, + {0x2281, 16, 16, 3668}, + {0x0, 2, 8, 3668}, {0x0, 0, 1, 3674}, - {0x0, 3, 4, 3675}, - {0x0, 0, 1, 3676}, - {0x0, 9, 10, 3677}, - {0x0, 9, 10, 3678}, - {0x30c2, 16, 16, 3679}, - {0x0, 0, 9, 3679}, - {0x340, 16, 16, 3688}, - {0x341, 16, 16, 3688}, - {0x0, 0, 15, 3688}, - {0x0, 6, 7, 3703}, - {0x2f94c, 16, 16, 3704}, - {0x0, 3, 4, 3704}, - {0x2f8e9, 16, 16, 3705}, - {0x0, 6, 7, 3705}, - {0xf9fe, 16, 16, 3706}, - {0x0, 8, 9, 3706}, - {0x0, 0, 1, 3707}, - {0x2f965, 16, 16, 3708}, - {0x0, 12, 13, 3708}, + {0x0, 0, 1, 3675}, + {0x0, 3, 4, 3676}, + {0x0, 3, 4, 3677}, + {0x0, 8, 9, 3678}, + {0x2284, 16, 16, 3679}, + {0x0, 0, 1, 3679}, + {0x0, 0, 1, 3680}, + {0x0, 3, 4, 3681}, + {0x0, 3, 4, 3682}, + {0x0, 8, 9, 3683}, + {0x2285, 16, 16, 3684}, + {0x0, 0, 1, 3684}, + {0x0, 0, 1, 3685}, + {0x0, 3, 4, 3686}, + {0x0, 3, 4, 3687}, + {0x0, 8, 9, 3688}, + {0x2288, 16, 16, 3689}, + {0x0, 0, 1, 3689}, + {0x0, 0, 1, 3690}, + {0x0, 3, 4, 3691}, + {0x0, 3, 4, 3692}, + {0x0, 8, 9, 3693}, + {0x2289, 16, 16, 3694}, + {0x0, 2, 12, 3694}, + {0x0, 0, 1, 3704}, + {0x0, 0, 1, 3705}, + {0x0, 3, 4, 3706}, + {0x0, 3, 4, 3707}, + {0x0, 8, 9, 3708}, + {0x22ac, 16, 16, 3709}, {0x0, 0, 1, 3709}, {0x0, 0, 1, 3710}, {0x0, 3, 4, 3711}, {0x0, 3, 4, 3712}, {0x0, 8, 9, 3713}, - {0x2241, 16, 16, 3714}, - {0x1f75, 0, 1, 3714}, + {0x22ad, 16, 16, 3714}, + {0x0, 0, 1, 3714}, {0x0, 0, 1, 3715}, {0x0, 3, 4, 3716}, - {0x0, 4, 5, 3717}, - {0x0, 5, 6, 3718}, - {0x1fc4, 16, 16, 3719}, - {0x0, 8, 9, 3719}, - {0x0, 1, 2, 3720}, - {0x2f876, 16, 16, 3721}, - {0x0, 0, 15, 3721}, - {0xfa19, 16, 16, 3736}, - {0x0, 15, 16, 3736}, + {0x0, 3, 4, 3717}, + {0x0, 8, 9, 3718}, + {0x22ae, 16, 16, 3719}, + {0x0, 0, 1, 3719}, + {0x0, 0, 1, 3720}, + {0x0, 3, 4, 3721}, + {0x0, 3, 4, 3722}, + {0x0, 8, 9, 3723}, + {0x22af, 16, 16, 3724}, + {0x0, 0, 1, 3724}, + {0x0, 0, 1, 3725}, + {0x0, 3, 4, 3726}, + {0x0, 3, 4, 3727}, + {0x0, 8, 9, 3728}, + {0x22e0, 16, 16, 3729}, + {0x0, 0, 1, 3729}, + {0x0, 0, 1, 3730}, + {0x0, 3, 4, 3731}, + {0x0, 3, 4, 3732}, + {0x0, 8, 9, 3733}, + {0x22e1, 16, 16, 3734}, + {0x0, 1, 3, 3734}, + {0x0, 0, 1, 3736}, {0x0, 0, 1, 3737}, {0x0, 3, 4, 3738}, - {0x0, 0, 1, 3739}, - {0x0, 9, 10, 3740}, - {0x0, 9, 10, 3741}, - {0x30f7, 16, 16, 3742}, - {0x0, 1, 2, 3742}, - {0xf9e8, 16, 16, 3743}, - {0x0, 1, 16, 3743}, - {0x154, 16, 16, 3758}, - {0x0, 7, 8, 3758}, - {0x0, 12, 13, 3759}, - {0x2f95c, 16, 16, 3760}, - {0x0, 7, 8, 3760}, - {0xf933, 16, 16, 3761}, - {0x0, 0, 16, 3761}, - {0x0, 3, 11, 3777}, - {0x2f8df, 16, 16, 3785}, - {0xfa50, 16, 16, 3785}, - {0xfa4f, 16, 16, 3785}, - {0x0, 8, 12, 3785}, - {0x2f920, 16, 16, 3789}, - {0x0, 3, 4, 3789}, - {0x1e88, 16, 16, 3790}, - {0x0, 0, 1, 3790}, - {0x0, 3, 4, 3791}, - {0x0, 0, 1, 3792}, - {0x0, 9, 10, 3793}, - {0x0, 9, 11, 3794}, - {0x3077, 16, 16, 3796}, - {0x0, 10, 11, 3796}, - {0x2f917, 16, 16, 3797}, - {0x0, 14, 16, 3797}, - {0x0, 12, 13, 3799}, - {0x2f868, 16, 16, 3800}, - {0x0, 1, 7, 3800}, - {0x0, 2, 3, 3806}, - {0x2fa0a, 16, 16, 3807}, - {0x0, 0, 1, 3807}, - {0x0, 0, 1, 3808}, - {0x0, 3, 4, 3809}, - {0x0, 4, 5, 3810}, - {0x0, 5, 6, 3811}, - {0x1f86, 16, 16, 3812}, - {0x0, 1, 6, 3812}, - {0xfa59, 16, 16, 3817}, - {0x2f970, 16, 16, 3817}, + {0x0, 3, 4, 3739}, + {0x0, 8, 9, 3740}, + {0x22e2, 16, 16, 3741}, + {0x0, 0, 1, 3741}, + {0x0, 0, 1, 3742}, + {0x0, 3, 4, 3743}, + {0x0, 3, 4, 3744}, + {0x0, 8, 9, 3745}, + {0x22e3, 16, 16, 3746}, + {0x0, 2, 6, 3746}, + {0x0, 0, 1, 3750}, + {0x0, 0, 1, 3751}, + {0x0, 3, 4, 3752}, + {0x0, 3, 4, 3753}, + {0x0, 8, 9, 3754}, + {0x22ea, 16, 16, 3755}, + {0x0, 0, 1, 3755}, + {0x0, 0, 1, 3756}, + {0x0, 3, 4, 3757}, + {0x0, 3, 4, 3758}, + {0x0, 8, 9, 3759}, + {0x22eb, 16, 16, 3760}, + {0x0, 0, 1, 3760}, + {0x0, 0, 1, 3761}, + {0x0, 3, 4, 3762}, + {0x0, 3, 4, 3763}, + {0x0, 8, 9, 3764}, + {0x22ec, 16, 16, 3765}, + {0x0, 0, 1, 3765}, + {0x0, 0, 1, 3766}, + {0x0, 3, 4, 3767}, + {0x0, 3, 4, 3768}, + {0x0, 8, 9, 3769}, + {0x22ed, 16, 16, 3770}, + {0x0, 0, 16, 3770}, + {0x0, 0, 16, 3786}, + {0x0, 8, 10, 3802}, + {0x2329, 16, 16, 3804}, + {0x232a, 16, 16, 3804}, + {0x0, 6, 16, 3804}, + {0x0, 0, 1, 3814}, + {0x0, 3, 4, 3815}, + {0x0, 0, 1, 3816}, {0x0, 9, 10, 3817}, - {0x2f887, 16, 16, 3818}, - {0x0, 0, 9, 3818}, - {0x0, 8, 9, 3827}, - {0xf9fc, 16, 16, 3828}, - {0x0, 7, 8, 3828}, - {0xf9f4, 16, 16, 3829}, - {0x0, 8, 10, 3829}, - {0x0, 0, 1, 3831}, - {0x0, 0, 1, 3832}, - {0x0, 3, 4, 3833}, - {0x0, 0, 1, 3834}, - {0x0, 8, 9, 3835}, - {0x4da, 16, 16, 3836}, - {0x0, 1, 2, 3836}, - {0xf9b9, 16, 16, 3837}, - {0x0, 3, 13, 3837}, - {0x0, 14, 15, 3847}, - {0x2f9cd, 16, 16, 3848}, - {0x0, 6, 7, 3848}, - {0x2f866, 16, 16, 3849}, - {0x0, 8, 10, 3849}, + {0x0, 9, 10, 3818}, + {0x304c, 16, 16, 3819}, + {0x0, 0, 1, 3819}, + {0x0, 3, 4, 3820}, + {0x0, 0, 1, 3821}, + {0x0, 9, 10, 3822}, + {0x0, 9, 10, 3823}, + {0x304e, 16, 16, 3824}, + {0x0, 0, 1, 3824}, + {0x0, 3, 4, 3825}, + {0x0, 0, 1, 3826}, + {0x0, 9, 10, 3827}, + {0x0, 9, 10, 3828}, + {0x3050, 16, 16, 3829}, + {0x0, 1, 16, 3829}, + {0x0, 0, 1, 3844}, + {0x0, 3, 4, 3845}, + {0x0, 0, 1, 3846}, + {0x0, 9, 10, 3847}, + {0x0, 9, 10, 3848}, + {0x3052, 16, 16, 3849}, + {0x0, 0, 1, 3849}, + {0x0, 3, 4, 3850}, {0x0, 0, 1, 3851}, - {0x0, 0, 1, 3852}, - {0x0, 3, 4, 3853}, + {0x0, 9, 10, 3852}, + {0x0, 9, 10, 3853}, + {0x3054, 16, 16, 3854}, {0x0, 0, 1, 3854}, - {0x0, 2, 3, 3855}, - {0x1ec7, 16, 16, 3856}, - {0x0, 14, 15, 3856}, - {0x2f867, 16, 16, 3857}, - {0x0, 3, 14, 3857}, - {0x118, 16, 16, 3868}, - {0x0, 0, 1, 3868}, + {0x0, 3, 4, 3855}, + {0x0, 0, 1, 3856}, + {0x0, 9, 10, 3857}, + {0x0, 9, 10, 3858}, + {0x3056, 16, 16, 3859}, + {0x0, 0, 1, 3859}, + {0x0, 3, 4, 3860}, + {0x0, 0, 1, 3861}, + {0x0, 9, 10, 3862}, + {0x0, 9, 10, 3863}, + {0x3058, 16, 16, 3864}, + {0x0, 0, 1, 3864}, + {0x0, 3, 4, 3865}, + {0x0, 0, 1, 3866}, + {0x0, 9, 10, 3867}, + {0x0, 9, 10, 3868}, + {0x305a, 16, 16, 3869}, {0x0, 0, 1, 3869}, {0x0, 3, 4, 3870}, - {0x0, 0, 5, 3871}, - {0x0, 0, 2, 3876}, - {0x1f2d, 16, 16, 3878}, - {0x228, 16, 16, 3878}, - {0x0, 4, 15, 3878}, - {0x0, 7, 8, 3889}, - {0x2f8fe, 16, 16, 3890}, - {0x1eb8, 16, 16, 3890}, - {0x0, 2, 13, 3890}, + {0x0, 0, 1, 3871}, + {0x0, 9, 10, 3872}, + {0x0, 9, 10, 3873}, + {0x305c, 16, 16, 3874}, + {0x0, 0, 1, 3874}, + {0x0, 3, 4, 3875}, + {0x0, 0, 1, 3876}, + {0x0, 9, 10, 3877}, + {0x0, 9, 10, 3878}, + {0x305e, 16, 16, 3879}, + {0x0, 0, 1, 3879}, + {0x0, 3, 4, 3880}, + {0x0, 0, 1, 3881}, + {0x0, 9, 10, 3882}, + {0x0, 9, 10, 3883}, + {0x3060, 16, 16, 3884}, + {0x0, 1, 16, 3884}, + {0x0, 0, 1, 3899}, + {0x0, 3, 4, 3900}, {0x0, 0, 1, 3901}, - {0xf9f8, 16, 16, 3902}, - {0x0, 14, 15, 3902}, - {0xf989, 16, 16, 3903}, - {0x0, 2, 8, 3903}, - {0x2f8f3, 16, 16, 3909}, - {0x0, 6, 7, 3909}, - {0x2f873, 16, 16, 3910}, - {0x0, 0, 16, 3910}, - {0x0, 1, 2, 3926}, - {0x2f8be, 16, 16, 3927}, - {0x0, 12, 15, 3927}, - {0xfa18, 16, 16, 3930}, - {0x0, 8, 9, 3930}, - {0xf969, 16, 16, 3931}, - {0x0, 5, 13, 3931}, - {0x0, 3, 13, 3939}, - {0x2f98a, 16, 16, 3949}, - {0x0, 9, 10, 3949}, - {0xf9cd, 16, 16, 3950}, - {0x1e18, 16, 16, 3950}, - {0x0, 0, 1, 3950}, - {0x0, 0, 1, 3951}, - {0x0, 3, 4, 3952}, + {0x0, 9, 10, 3902}, + {0x0, 9, 10, 3903}, + {0x3062, 16, 16, 3904}, + {0x0, 0, 1, 3904}, + {0x0, 3, 4, 3905}, + {0x0, 0, 1, 3906}, + {0x0, 9, 10, 3907}, + {0x0, 9, 10, 3908}, + {0x3065, 16, 16, 3909}, + {0x0, 0, 1, 3909}, + {0x0, 3, 4, 3910}, + {0x0, 0, 1, 3911}, + {0x0, 9, 10, 3912}, + {0x0, 9, 10, 3913}, + {0x3067, 16, 16, 3914}, + {0x0, 0, 1, 3914}, + {0x0, 3, 4, 3915}, + {0x0, 0, 1, 3916}, + {0x0, 9, 10, 3917}, + {0x0, 9, 10, 3918}, + {0x3069, 16, 16, 3919}, + {0x0, 0, 1, 3919}, + {0x0, 3, 4, 3920}, + {0x0, 0, 1, 3921}, + {0x0, 9, 10, 3922}, + {0x0, 9, 11, 3923}, + {0x3070, 16, 16, 3925}, + {0x3071, 16, 16, 3925}, + {0x0, 2, 12, 3925}, + {0x0, 0, 1, 3935}, + {0x0, 3, 4, 3936}, + {0x0, 0, 1, 3937}, + {0x0, 9, 10, 3938}, + {0x0, 9, 11, 3939}, + {0x3073, 16, 16, 3941}, + {0x3074, 16, 16, 3941}, + {0x0, 0, 1, 3941}, + {0x0, 3, 4, 3942}, + {0x0, 0, 1, 3943}, + {0x0, 9, 10, 3944}, + {0x0, 9, 11, 3945}, + {0x3076, 16, 16, 3947}, + {0x3077, 16, 16, 3947}, + {0x0, 0, 1, 3947}, + {0x0, 3, 4, 3948}, + {0x0, 0, 1, 3949}, + {0x0, 9, 10, 3950}, + {0x0, 9, 11, 3951}, + {0x3079, 16, 16, 3953}, + {0x307a, 16, 16, 3953}, {0x0, 0, 1, 3953}, - {0x0, 4, 5, 3954}, - {0x1e5c, 16, 16, 3955}, - {0xf98c, 16, 16, 3955}, - {0x0, 12, 16, 3955}, - {0x0, 13, 14, 3959}, - {0x2fa0e, 16, 16, 3960}, - {0x0, 9, 14, 3960}, - {0x0, 15, 16, 3965}, - {0x2f81f, 16, 16, 3966}, - {0x0, 2, 13, 3966}, - {0x0, 6, 7, 3977}, - {0x2f952, 16, 16, 3978}, - {0x0, 0, 1, 3978}, - {0x0, 0, 1, 3979}, - {0x0, 3, 4, 3980}, - {0x0, 0, 3, 3981}, - {0x0, 1, 13, 3984}, - {0x160, 16, 16, 3996}, - {0x0, 0, 1, 3996}, - {0x0, 3, 4, 3997}, - {0x0, 0, 1, 3998}, - {0x0, 9, 10, 3999}, - {0x0, 9, 10, 4000}, - {0x30ac, 16, 16, 4001}, - {0x0, 9, 10, 4001}, - {0xf9d5, 16, 16, 4002}, - {0x0, 0, 1, 4002}, - {0x0, 0, 1, 4003}, - {0x0, 3, 4, 4004}, - {0x0, 0, 5, 4005}, - {0x0, 0, 2, 4010}, - {0x3ce, 16, 16, 4012}, - {0x0, 11, 12, 4012}, - {0x2f8f8, 16, 16, 4013}, - {0x0, 0, 1, 4013}, - {0x0, 0, 1, 4014}, - {0x0, 3, 4, 4015}, - {0x0, 0, 1, 4016}, - {0x0, 0, 9, 4017}, - {0x451, 16, 16, 4026}, - {0x450, 16, 16, 4026}, - {0x0, 3, 13, 4026}, + {0x0, 3, 4, 3954}, + {0x0, 0, 1, 3955}, + {0x0, 9, 10, 3956}, + {0x0, 9, 11, 3957}, + {0x307c, 16, 16, 3959}, + {0x307d, 16, 16, 3959}, + {0x0, 0, 1, 3959}, + {0x0, 3, 4, 3960}, + {0x0, 0, 1, 3961}, + {0x0, 9, 10, 3962}, + {0x0, 9, 10, 3963}, + {0x3094, 16, 16, 3964}, + {0x0, 13, 14, 3964}, + {0x0, 0, 1, 3965}, + {0x0, 3, 4, 3966}, + {0x0, 0, 1, 3967}, + {0x0, 9, 10, 3968}, + {0x0, 9, 10, 3969}, + {0x309e, 16, 16, 3970}, + {0x0, 6, 16, 3970}, + {0x0, 0, 1, 3980}, + {0x0, 3, 4, 3981}, + {0x0, 0, 1, 3982}, + {0x0, 9, 10, 3983}, + {0x0, 9, 10, 3984}, + {0x30ac, 16, 16, 3985}, + {0x0, 0, 1, 3985}, + {0x0, 3, 4, 3986}, + {0x0, 0, 1, 3987}, + {0x0, 9, 10, 3988}, + {0x0, 9, 10, 3989}, + {0x30ae, 16, 16, 3990}, + {0x0, 0, 1, 3990}, + {0x0, 3, 4, 3991}, + {0x0, 0, 1, 3992}, + {0x0, 9, 10, 3993}, + {0x0, 9, 10, 3994}, + {0x30b0, 16, 16, 3995}, + {0x0, 1, 16, 3995}, + {0x0, 0, 1, 4010}, + {0x0, 3, 4, 4011}, + {0x0, 0, 1, 4012}, + {0x0, 9, 10, 4013}, + {0x0, 9, 10, 4014}, + {0x30b2, 16, 16, 4015}, + {0x0, 0, 1, 4015}, + {0x0, 3, 4, 4016}, + {0x0, 0, 1, 4017}, + {0x0, 9, 10, 4018}, + {0x0, 9, 10, 4019}, + {0x30b4, 16, 16, 4020}, + {0x0, 0, 1, 4020}, + {0x0, 3, 4, 4021}, + {0x0, 0, 1, 4022}, + {0x0, 9, 10, 4023}, + {0x0, 9, 10, 4024}, + {0x30b6, 16, 16, 4025}, + {0x0, 0, 1, 4025}, + {0x0, 3, 4, 4026}, + {0x0, 0, 1, 4027}, + {0x0, 9, 10, 4028}, + {0x0, 9, 10, 4029}, + {0x30b8, 16, 16, 4030}, + {0x0, 0, 1, 4030}, + {0x0, 3, 4, 4031}, + {0x0, 0, 1, 4032}, + {0x0, 9, 10, 4033}, + {0x0, 9, 10, 4034}, + {0x30ba, 16, 16, 4035}, + {0x0, 0, 1, 4035}, {0x0, 3, 4, 4036}, - {0x2fa03, 16, 16, 4037}, - {0x4d7, 16, 16, 4037}, - {0xf9c9, 16, 16, 4037}, - {0x1e60, 16, 16, 4037}, - {0x15a, 16, 16, 4037}, - {0x15c, 16, 16, 4037}, - {0xf91e, 16, 16, 4037}, {0x0, 0, 1, 4037}, - {0x0, 0, 1, 4038}, - {0x0, 3, 4, 4039}, + {0x0, 9, 10, 4038}, + {0x0, 9, 10, 4039}, + {0x30bc, 16, 16, 4040}, {0x0, 0, 1, 4040}, - {0x0, 0, 10, 4041}, - {0x1eab, 16, 16, 4051}, - {0x1ea7, 16, 16, 4051}, - {0x1ea5, 16, 16, 4051}, - {0x1ea9, 16, 16, 4051}, - {0x0, 2, 14, 4051}, - {0x0, 10, 11, 4063}, - {0xfa16, 16, 16, 4064}, - {0x0, 11, 12, 4064}, - {0xf9a4, 16, 16, 4065}, + {0x0, 3, 4, 4041}, + {0x0, 0, 1, 4042}, + {0x0, 9, 10, 4043}, + {0x0, 9, 10, 4044}, + {0x30be, 16, 16, 4045}, + {0x0, 0, 1, 4045}, + {0x0, 3, 4, 4046}, + {0x0, 0, 1, 4047}, + {0x0, 9, 10, 4048}, + {0x0, 9, 10, 4049}, + {0x30c0, 16, 16, 4050}, + {0x0, 1, 16, 4050}, {0x0, 0, 1, 4065}, - {0x0, 0, 1, 4066}, - {0x0, 3, 4, 4067}, - {0x0, 3, 4, 4068}, - {0x0, 8, 9, 4069}, - {0x226d, 16, 16, 4070}, + {0x0, 3, 4, 4066}, + {0x0, 0, 1, 4067}, + {0x0, 9, 10, 4068}, + {0x0, 9, 10, 4069}, + {0x30c2, 16, 16, 4070}, {0x0, 0, 1, 4070}, - {0x0, 0, 1, 4071}, - {0x0, 3, 4, 4072}, - {0x0, 4, 5, 4073}, - {0x0, 5, 6, 4074}, - {0x1f9f, 16, 16, 4075}, + {0x0, 3, 4, 4071}, + {0x0, 0, 1, 4072}, + {0x0, 9, 10, 4073}, + {0x0, 9, 10, 4074}, + {0x30c5, 16, 16, 4075}, {0x0, 0, 1, 4075}, - {0x0, 0, 1, 4076}, - {0x0, 3, 4, 4077}, - {0x0, 4, 5, 4078}, - {0x0, 5, 6, 4079}, - {0x1fad, 16, 16, 4080}, + {0x0, 3, 4, 4076}, + {0x0, 0, 1, 4077}, + {0x0, 9, 10, 4078}, + {0x0, 9, 10, 4079}, + {0x30c7, 16, 16, 4080}, {0x0, 0, 1, 4080}, - {0x0, 0, 1, 4081}, - {0x0, 3, 4, 4082}, - {0x0, 0, 3, 4083}, + {0x0, 3, 4, 4081}, + {0x0, 0, 1, 4082}, + {0x0, 9, 10, 4083}, + {0x0, 9, 10, 4084}, + {0x30c9, 16, 16, 4085}, + {0x0, 0, 1, 4085}, {0x0, 3, 4, 4086}, - {0x1ee3, 16, 16, 4087}, - {0x0, 13, 14, 4087}, - {0x2f9ae, 16, 16, 4088}, - {0x0, 3, 15, 4088}, - {0x1e2b, 16, 16, 4100}, - {0x0, 12, 13, 4100}, - {0x2f9ea, 16, 16, 4101}, - {0x0, 12, 13, 4101}, - {0x0, 10, 11, 4102}, - {0x2f9ab, 16, 16, 4103}, + {0x0, 0, 1, 4087}, + {0x0, 9, 10, 4088}, + {0x0, 9, 11, 4089}, + {0x30d0, 16, 16, 4091}, + {0x30d1, 16, 16, 4091}, + {0x0, 2, 12, 4091}, + {0x0, 0, 1, 4101}, + {0x0, 3, 4, 4102}, {0x0, 0, 1, 4103}, - {0x0, 0, 1, 4104}, - {0x0, 3, 4, 4105}, - {0x0, 0, 5, 4106}, - {0x0, 0, 7, 4111}, - {0x1fba, 16, 16, 4118}, - {0x386, 16, 16, 4118}, - {0x1fb8, 16, 16, 4118}, - {0x0, 7, 8, 4118}, - {0x2f811, 16, 16, 4119}, - {0x1fb9, 16, 16, 4119}, - {0x0, 1, 14, 4119}, - {0x0, 14, 15, 4132}, - {0x2f909, 16, 16, 4133}, - {0x0, 0, 13, 4133}, - {0xf936, 16, 16, 4146}, - {0x0, 6, 7, 4146}, - {0x0, 0, 1, 4147}, - {0x0, 0, 1, 4148}, - {0x0, 3, 4, 4149}, - {0x0, 4, 5, 4150}, - {0x0, 5, 6, 4151}, - {0x1fc7, 16, 16, 4152}, - {0x0, 0, 11, 4152}, - {0x0, 0, 1, 4163}, - {0x0, 0, 1, 4164}, - {0x0, 3, 4, 4165}, - {0x0, 0, 1, 4166}, - {0x0, 7, 9, 4167}, - {0x1e8b, 16, 16, 4169}, - {0x0, 1, 8, 4169}, - {0x1e3f, 16, 16, 4176}, - {0x1e41, 16, 16, 4176}, - {0x0, 0, 16, 4176}, - {0x0, 4, 5, 4192}, - {0xf93f, 16, 16, 4193}, - {0x0, 7, 8, 4193}, - {0x2f964, 16, 16, 4194}, - {0x0, 6, 7, 4194}, - {0x2f9be, 16, 16, 4195}, - {0x1e8d, 16, 16, 4195}, - {0x0, 0, 1, 4195}, - {0x0, 0, 1, 4196}, - {0x0, 3, 4, 4197}, - {0x0, 0, 1, 4198}, - {0x0, 0, 2, 4199}, - {0x1e14, 16, 16, 4201}, - {0x0, 7, 8, 4201}, - {0xfa31, 16, 16, 4202}, - {0x0, 0, 1, 4202}, - {0x0, 0, 1, 4203}, - {0x0, 3, 4, 4204}, - {0x0, 0, 1, 4205}, - {0x0, 1, 2, 4206}, - {0x1e2f, 16, 16, 4207}, - {0x0, 7, 8, 4207}, - {0xf963, 16, 16, 4208}, - {0x2f9b3, 16, 16, 4208}, - {0x0, 0, 1, 4208}, - {0x0, 0, 1, 4209}, - {0x0, 3, 4, 4210}, - {0x0, 0, 5, 4211}, - {0x0, 2, 3, 4216}, - {0x1f3e, 16, 16, 4217}, - {0x0, 0, 1, 4217}, - {0x0, 0, 1, 4218}, - {0x0, 3, 4, 4219}, - {0x0, 0, 1, 4220}, - {0x0, 1, 2, 4221}, - {0x1e2e, 16, 16, 4222}, - {0x1e29, 16, 16, 4222}, - {0x0, 0, 1, 4222}, - {0x0, 0, 1, 4223}, - {0x0, 3, 4, 4224}, - {0x0, 0, 4, 4225}, - {0x0, 1, 2, 4229}, - {0x1e06, 16, 16, 4230}, - {0x1e25, 16, 16, 4230}, - {0xec, 16, 16, 4230}, - {0xed, 16, 16, 4230}, - {0xee, 16, 16, 4230}, - {0x129, 16, 16, 4230}, - {0x12b, 16, 16, 4230}, - {0x12d, 16, 16, 4230}, - {0xef, 16, 16, 4230}, - {0x1ec9, 16, 16, 4230}, - {0x0, 6, 16, 4230}, - {0x2f83b, 16, 16, 4240}, - {0x0, 1, 2, 4240}, - {0xf909, 16, 16, 4241}, - {0x2f969, 16, 16, 4241}, - {0x0, 8, 11, 4241}, - {0x2f9c9, 16, 16, 4244}, - {0x0, 1, 13, 4244}, - {0x1e30, 16, 16, 4256}, - {0x1a1, 16, 16, 4256}, - {0x0, 3, 12, 4256}, - {0x0, 0, 1, 4265}, - {0x0, 0, 1, 4266}, - {0x0, 3, 4, 4267}, - {0x0, 3, 4, 4268}, - {0x0, 8, 9, 4269}, - {0x2209, 16, 16, 4270}, - {0x0, 13, 14, 4270}, - {0xf918, 16, 16, 4271}, - {0xf97b, 16, 16, 4271}, - {0x0, 1, 13, 4271}, - {0x2f9a9, 16, 16, 4283}, - {0x2f9a8, 16, 16, 4283}, - {0x0, 8, 9, 4283}, - {0x2f86e, 16, 16, 4284}, - {0x0, 4, 5, 4284}, - {0x2f9e2, 16, 16, 4285}, - {0xf9de, 16, 16, 4285}, - {0x1e8, 16, 16, 4285}, - {0x0, 3, 4, 4285}, - {0x2f99c, 16, 16, 4286}, - {0x0, 6, 7, 4286}, - {0x2f94b, 16, 16, 4287}, - {0x209, 16, 16, 4287}, - {0x0, 2, 3, 4287}, - {0xfa4a, 16, 16, 4288}, - {0xf9c2, 16, 16, 4288}, - {0x0, 0, 1, 4288}, - {0x0, 0, 1, 4289}, - {0x0, 3, 4, 4290}, - {0x0, 0, 1, 4291}, - {0x0, 8, 9, 4292}, - {0x4db, 16, 16, 4293}, - {0x0, 5, 6, 4293}, - {0xfa1a, 16, 16, 4294}, - {0x0, 4, 15, 4294}, - {0x2f8a9, 16, 16, 4305}, - {0x0, 3, 14, 4305}, - {0x0, 0, 1, 4316}, - {0x0, 0, 1, 4317}, - {0x0, 3, 4, 4318}, - {0x0, 0, 1, 4319}, - {0x0, 4, 12, 4320}, - {0x4f0, 16, 16, 4328}, - {0x0, 5, 10, 4328}, - {0xf993, 16, 16, 4333}, - {0x2f8a8, 16, 16, 4333}, - {0x2f91c, 16, 16, 4333}, - {0x40e, 16, 16, 4333}, - {0x4ee, 16, 16, 4333}, - {0x0, 5, 6, 4333}, - {0x2f986, 16, 16, 4334}, - {0x0, 11, 12, 4334}, - {0xf922, 16, 16, 4335}, - {0x0, 5, 6, 4335}, - {0x1fcc, 16, 16, 4336}, - {0x0, 0, 1, 4336}, - {0x0, 3, 4, 4337}, - {0x0, 0, 1, 4338}, - {0x0, 9, 10, 4339}, - {0x0, 9, 10, 4340}, - {0x3056, 16, 16, 4341}, - {0x0, 7, 16, 4341}, - {0xf9da, 16, 16, 4350}, - {0x0, 7, 8, 4350}, - {0x2f96e, 16, 16, 4351}, - {0xf9d9, 16, 16, 4351}, - {0x4f2, 16, 16, 4351}, - {0x2f8a6, 16, 16, 4351}, - {0x0, 8, 9, 4351}, - {0x2f869, 16, 16, 4352}, - {0x0, 8, 9, 4352}, - {0xf9ef, 16, 16, 4353}, - {0x0, 5, 6, 4353}, - {0x2f8e0, 16, 16, 4354}, - {0x0, 0, 9, 4354}, - {0x0, 11, 12, 4363}, - {0x2f94a, 16, 16, 4364}, - {0x0, 0, 10, 4364}, - {0x0, 13, 14, 4374}, - {0xf9c4, 16, 16, 4375}, - {0x2f8e5, 16, 16, 4375}, - {0x0, 0, 1, 4375}, - {0x1e1a, 16, 16, 4376}, - {0x0, 10, 11, 4376}, - {0x0, 11, 12, 4377}, - {0x2f91f, 16, 16, 4378}, - {0x0, 0, 1, 4378}, - {0x0, 0, 1, 4379}, - {0x0, 3, 4, 4380}, - {0x0, 0, 3, 4381}, - {0x0, 0, 16, 4384}, - {0x200, 16, 16, 4400}, - {0x1cd, 16, 16, 4400}, - {0xc5, 16, 16, 4400}, - {0x0, 13, 14, 4400}, - {0x2f8d6, 16, 16, 4401}, - {0x0, 5, 6, 4401}, - {0xf976, 16, 16, 4402}, - {0x0, 6, 12, 4402}, - {0xf9b5, 16, 16, 4408}, - {0x0, 0, 1, 4408}, - {0x0, 0, 1, 4409}, - {0x0, 3, 4, 4410}, - {0x0, 0, 4, 4411}, - {0x0, 3, 14, 4415}, - {0x21a, 16, 16, 4426}, - {0x162, 16, 16, 4426}, - {0x1e6c, 16, 16, 4426}, - {0x0, 0, 2, 4426}, - {0x1f05, 16, 16, 4428}, - {0x1f03, 16, 16, 4428}, - {0x0, 1, 2, 4428}, - {0x2f8ef, 16, 16, 4429}, - {0x0, 7, 8, 4429}, - {0x2f9ce, 16, 16, 4430}, - {0xf92d, 16, 16, 4430}, - {0x0, 10, 15, 4430}, - {0x0, 8, 9, 4435}, - {0x2f860, 16, 16, 4436}, - {0x1e70, 16, 16, 4436}, - {0x0, 4, 5, 4436}, - {0xfa2d, 16, 16, 4437}, - {0x0, 12, 13, 4437}, - {0x2f8c9, 16, 16, 4438}, - {0x102, 16, 16, 4438}, - {0x226, 16, 16, 4438}, - {0x100, 16, 16, 4438}, - {0xc2, 16, 16, 4438}, - {0xc3, 16, 16, 4438}, - {0xc0, 16, 16, 4438}, - {0xc1, 16, 16, 4438}, - {0x0, 2, 3, 4438}, - {0x2fa06, 16, 16, 4439}, - {0x0, 2, 3, 4439}, - {0x1f57, 16, 16, 4440}, - {0x0, 5, 6, 4440}, - {0x2f9d2, 16, 16, 4441}, - {0xc4, 16, 16, 4441}, - {0x1ea2, 16, 16, 4441}, - {0x0, 8, 9, 4441}, - {0x2f8bb, 16, 16, 4442}, - {0x0, 15, 16, 4442}, - {0xf910, 16, 16, 4443}, - {0x0, 0, 1, 4443}, - {0x0, 0, 1, 4444}, - {0x0, 3, 4, 4445}, - {0x0, 0, 1, 4446}, - {0x0, 1, 8, 4447}, - {0x1e57, 16, 16, 4454}, - {0x1e55, 16, 16, 4454}, - {0x0, 3, 4, 4454}, - {0xf9e0, 16, 16, 4455}, - {0x0, 0, 1, 4455}, - {0x0, 0, 1, 4456}, - {0x0, 3, 4, 4457}, - {0x0, 0, 3, 4458}, - {0x0, 0, 16, 4461}, - {0xd5, 16, 16, 4477}, - {0x0, 0, 10, 4477}, - {0x1ee0, 16, 16, 4487}, - {0x1eda, 16, 16, 4487}, - {0x1edc, 16, 16, 4487}, - {0x0, 0, 1, 4487}, - {0x0, 0, 1, 4488}, - {0x0, 3, 4, 4489}, - {0x0, 3, 4, 4490}, - {0x0, 8, 9, 4491}, - {0x22ea, 16, 16, 4492}, - {0x1ede, 16, 16, 4492}, - {0x0, 1, 16, 4492}, - {0x0, 14, 15, 4507}, - {0x2f852, 16, 16, 4508}, - {0x0, 0, 12, 4508}, - {0x2f8b2, 16, 16, 4520}, - {0x0, 12, 14, 4520}, - {0x0, 4, 5, 4522}, - {0x2f9de, 16, 16, 4523}, - {0x0, 12, 13, 4523}, - {0x2f88a, 16, 16, 4524}, - {0x0, 0, 14, 4524}, - {0xfa32, 16, 16, 4538}, - {0x0, 0, 1, 4538}, - {0x0, 0, 1, 4539}, - {0x0, 3, 4, 4540}, - {0x0, 0, 1, 4541}, - {0x0, 7, 8, 4542}, - {0x1e67, 16, 16, 4543}, - {0x0, 8, 9, 4543}, - {0x2f9b8, 16, 16, 4544}, - {0x0, 9, 10, 4544}, - {0x2f8de, 16, 16, 4545}, - {0x1f7c, 16, 16, 4545}, - {0x0, 2, 3, 4545}, - {0x1fdf, 16, 16, 4546}, - {0x0, 6, 7, 4546}, - {0x0, 11, 12, 4547}, - {0x2f9a5, 16, 16, 4548}, - {0x0, 6, 7, 4548}, - {0xfa01, 16, 16, 4549}, - {0x0, 9, 10, 4549}, - {0x2f809, 16, 16, 4550}, - {0x0, 4, 14, 4550}, - {0x0, 15, 16, 4560}, - {0x2f81c, 16, 16, 4561}, - {0x0, 9, 10, 4561}, - {0x2f9b7, 16, 16, 4562}, - {0x0, 12, 15, 4562}, - {0xf973, 16, 16, 4565}, - {0x0, 0, 1, 4565}, - {0x0, 3, 4, 4566}, - {0x0, 0, 1, 4567}, - {0x0, 9, 10, 4568}, - {0x0, 9, 10, 4569}, - {0x30c0, 16, 16, 4570}, - {0x0, 3, 5, 4570}, - {0x1f08, 16, 16, 4572}, - {0x2f8b3, 16, 16, 4572}, - {0x1f09, 16, 16, 4572}, - {0x2f8ba, 16, 16, 4572}, - {0x0, 0, 1, 4572}, - {0x0, 0, 1, 4573}, - {0x0, 3, 4, 4574}, - {0x0, 0, 5, 4575}, - {0x0, 0, 2, 4580}, - {0x1fd2, 16, 16, 4582}, - {0x390, 16, 16, 4582}, - {0xfa0c, 16, 16, 4582}, - {0x0, 0, 1, 4582}, - {0x0, 0, 1, 4583}, - {0x0, 3, 4, 4584}, - {0x0, 0, 1, 4585}, - {0x0, 1, 2, 4586}, - {0x1e79, 16, 16, 4587}, - {0x0, 4, 16, 4587}, - {0x2f8ad, 16, 16, 4599}, - {0x0, 2, 3, 4599}, - {0x0, 15, 16, 4600}, - {0x2f958, 16, 16, 4601}, - {0x0, 5, 8, 4601}, - {0x2f81b, 16, 16, 4604}, - {0x0, 0, 1, 4604}, - {0x0, 0, 1, 4605}, - {0x0, 3, 4, 4606}, - {0x0, 3, 4, 4607}, - {0x0, 8, 9, 4608}, - {0x2275, 16, 16, 4609}, - {0x0, 0, 13, 4609}, - {0x148, 16, 16, 4622}, - {0x0, 0, 15, 4622}, - {0x0, 14, 15, 4637}, - {0x2f985, 16, 16, 4638}, - {0x0, 0, 7, 4638}, - {0xfa66, 16, 16, 4645}, - {0xf971, 16, 16, 4645}, - {0x0, 1, 2, 4645}, - {0x20b, 16, 16, 4646}, - {0x0, 0, 1, 4646}, - {0x0, 0, 1, 4647}, - {0x0, 3, 4, 4648}, - {0x0, 0, 5, 4649}, - {0x0, 2, 3, 4654}, - {0x1fe6, 16, 16, 4655}, - {0x0, 2, 3, 4655}, - {0x1f3f, 16, 16, 4656}, - {0x0, 7, 8, 4656}, - {0x0, 1, 2, 4657}, - {0x0, 0, 1, 4658}, - {0x0, 0, 1, 4659}, - {0x0, 15, 16, 4660}, - {0x0, 7, 9, 4661}, - {0x0, 0, 1, 4663}, - {0xf81, 16, 16, 4664}, - {0x0, 0, 1, 4664}, - {0x0, 0, 1, 4665}, - {0x0, 3, 4, 4666}, - {0x0, 4, 5, 4667}, - {0x0, 5, 6, 4668}, - {0x1fb2, 16, 16, 4669}, - {0x0, 3, 4, 4669}, - {0x1e04, 16, 16, 4670}, - {0x0, 1, 2, 4670}, - {0x2f96d, 16, 16, 4671}, - {0x0, 0, 16, 4671}, - {0x2f95b, 16, 16, 4687}, - {0x2f95a, 16, 16, 4687}, - {0x1e45, 16, 16, 4687}, - {0x1f9, 16, 16, 4687}, - {0x144, 16, 16, 4687}, - {0x0, 9, 10, 4687}, - {0x2f9eb, 16, 16, 4688}, - {0xf1, 16, 16, 4688}, - {0x0, 0, 1, 4688}, - {0x0, 0, 1, 4689}, - {0x0, 3, 4, 4690}, - {0x0, 0, 1, 4691}, - {0x0, 2, 7, 4692}, - {0x1ead, 16, 16, 4697}, - {0x0, 9, 10, 4697}, - {0x2f913, 16, 16, 4698}, - {0x1eb7, 16, 16, 4698}, - {0x0, 0, 1, 4698}, - {0x0, 0, 1, 4699}, - {0x0, 3, 4, 4700}, - {0x0, 0, 4, 4701}, - {0x0, 0, 13, 4705}, - {0x147, 16, 16, 4718}, - {0x0, 11, 14, 4718}, - {0xfa09, 16, 16, 4721}, - {0x0, 8, 9, 4721}, - {0x2f83d, 16, 16, 4722}, - {0x0, 10, 12, 4722}, - {0x0, 7, 8, 4724}, - {0x2f987, 16, 16, 4725}, - {0x0, 3, 4, 4725}, - {0x2f951, 16, 16, 4726}, - {0x0, 5, 9, 4726}, - {0x0, 14, 15, 4730}, - {0x2f910, 16, 16, 4731}, - {0xfa54, 16, 16, 4731}, - {0x0, 10, 11, 4731}, - {0xfa46, 16, 16, 4732}, - {0x0, 3, 4, 4732}, - {0x2f86d, 16, 16, 4733}, - {0x0, 0, 16, 4733}, - {0x1ecf, 16, 16, 4749}, - {0xf6, 16, 16, 4749}, - {0x14d, 16, 16, 4749}, - {0x0, 3, 4, 4749}, - {0x2f9a0, 16, 16, 4750}, - {0x14f, 16, 16, 4750}, - {0xf3, 16, 16, 4750}, - {0xf2, 16, 16, 4750}, - {0xf5, 16, 16, 4750}, - {0xf4, 16, 16, 4750}, - {0x0, 5, 6, 4750}, - {0x2f8c0, 16, 16, 4751}, - {0x0, 6, 7, 4751}, - {0x2f841, 16, 16, 4752}, - {0x0, 0, 1, 4752}, - {0x0, 0, 1, 4753}, - {0x0, 3, 4, 4754}, - {0x0, 4, 5, 4755}, - {0x0, 5, 6, 4756}, - {0x1f9d, 16, 16, 4757}, - {0x0, 15, 16, 4757}, - {0xf93c, 16, 16, 4758}, - {0x0, 0, 13, 4758}, - {0xf9fd, 16, 16, 4771}, - {0x0, 0, 2, 4771}, - {0x1f65, 16, 16, 4773}, - {0x1f63, 16, 16, 4773}, - {0x2f8ae, 16, 16, 4773}, - {0x0, 0, 1, 4773}, - {0x0, 0, 1, 4774}, - {0x0, 3, 4, 4775}, - {0x0, 0, 1, 4776}, - {0x0, 4, 5, 4777}, - {0x231, 16, 16, 4778}, - {0x0, 2, 4, 4778}, - {0x2f942, 16, 16, 4780}, - {0x2f941, 16, 16, 4780}, - {0xf951, 16, 16, 4780}, - {0x0, 8, 9, 4780}, - {0x2f8ee, 16, 16, 4781}, - {0x2f819, 16, 16, 4781}, - {0x20d, 16, 16, 4781}, - {0x1d2, 16, 16, 4781}, - {0x151, 16, 16, 4781}, - {0x0, 0, 1, 4781}, - {0x0, 0, 1, 4782}, - {0x0, 3, 4, 4783}, - {0x0, 0, 3, 4784}, - {0x0, 3, 4, 4787}, - {0x1e7f, 16, 16, 4788}, - {0x0, 14, 15, 4788}, - {0x2f80c, 16, 16, 4789}, - {0x2f828, 16, 16, 4789}, - {0x0, 15, 16, 4789}, - {0x2f980, 16, 16, 4790}, - {0x0, 5, 10, 4790}, - {0x2f931, 16, 16, 4795}, - {0x0, 14, 15, 4795}, - {0x2f98d, 16, 16, 4796}, - {0x0, 9, 10, 4796}, - {0xfa63, 16, 16, 4797}, - {0xf994, 16, 16, 4797}, - {0x0, 14, 16, 4797}, - {0x2f947, 16, 16, 4799}, - {0x0, 2, 8, 4799}, - {0x0, 0, 1, 4805}, - {0x0, 0, 1, 4806}, - {0x0, 3, 4, 4807}, - {0x0, 3, 4, 4808}, - {0x0, 8, 9, 4809}, - {0x2289, 16, 16, 4810}, - {0x0, 13, 14, 4810}, - {0x0, 1, 2, 4811}, - {0x2f90d, 16, 16, 4812}, - {0x0, 7, 8, 4812}, - {0x2f8a5, 16, 16, 4813}, - {0x0, 5, 11, 4813}, - {0xf9a7, 16, 16, 4819}, - {0x0, 9, 12, 4819}, - {0x2f813, 16, 16, 4822}, - {0x0, 8, 10, 4822}, - {0x0, 15, 16, 4824}, - {0x2f939, 16, 16, 4825}, - {0x0, 0, 1, 4825}, - {0x0, 0, 1, 4826}, - {0x0, 3, 4, 4827}, - {0x0, 0, 1, 4828}, - {0x0, 0, 10, 4829}, - {0x1ec1, 16, 16, 4839}, - {0x0, 10, 11, 4839}, - {0xf911, 16, 16, 4840}, - {0x2f928, 16, 16, 4840}, - {0x0, 11, 12, 4840}, - {0xf9c8, 16, 16, 4841}, - {0x0, 0, 1, 4841}, - {0xf962, 16, 16, 4842}, - {0x0, 14, 15, 4842}, - {0xf957, 16, 16, 4843}, - {0x0, 0, 1, 4843}, - {0x0, 0, 1, 4844}, - {0x0, 3, 4, 4845}, - {0x0, 0, 1, 4846}, - {0x0, 4, 5, 4847}, - {0x1e1, 16, 16, 4848}, - {0x0, 1, 2, 4848}, - {0x1e6e, 16, 16, 4849}, - {0x0, 10, 11, 4849}, - {0x2f8aa, 16, 16, 4850}, - {0x0, 8, 9, 4850}, - {0xf9c5, 16, 16, 4851}, - {0x0, 0, 1, 4851}, - {0x0, 0, 1, 4852}, - {0x0, 3, 4, 4853}, - {0x0, 0, 1, 4854}, - {0x0, 4, 5, 4855}, - {0x1df, 16, 16, 4856}, - {0x0, 0, 2, 4856}, - {0x1f02, 16, 16, 4858}, - {0x1f04, 16, 16, 4858}, - {0x0, 14, 15, 4858}, - {0xf984, 16, 16, 4859}, - {0x0, 2, 3, 4859}, - {0x0, 5, 6, 4860}, - {0x0, 0, 1, 4861}, - {0x0, 1, 2, 4862}, - {0x0, 0, 1, 4863}, - {0x0, 2, 3, 4864}, - {0x0, 14, 15, 4865}, - {0x1026, 16, 16, 4866}, - {0x0, 14, 15, 4866}, - {0x2f8fa, 16, 16, 4867}, - {0x2f9ca, 16, 16, 4867}, - {0x0, 0, 1, 4867}, - {0x0, 0, 1, 4868}, - {0x0, 3, 4, 4869}, - {0x0, 0, 5, 4870}, - {0x0, 0, 2, 4875}, - {0x1f25, 16, 16, 4877}, - {0x0, 11, 16, 4877}, - {0x2f806, 16, 16, 4882}, - {0x0, 1, 2, 4882}, - {0x202, 16, 16, 4883}, - {0x0, 0, 1, 4883}, - {0x2f8b7, 16, 16, 4884}, - {0x0, 2, 3, 4884}, - {0x2f982, 16, 16, 4885}, - {0x0, 8, 10, 4885}, - {0x0, 0, 1, 4887}, - {0x0, 0, 1, 4888}, - {0x0, 3, 4, 4889}, - {0x0, 0, 1, 4890}, - {0x0, 8, 9, 4891}, - {0x4ea, 16, 16, 4892}, - {0x0, 0, 1, 4892}, - {0xf98f, 16, 16, 4893}, - {0x0, 13, 15, 4893}, - {0x0, 13, 14, 4895}, - {0x2f9e1, 16, 16, 4896}, - {0x0, 0, 1, 4896}, - {0x0, 0, 1, 4897}, - {0x0, 3, 4, 4898}, - {0x0, 0, 2, 4899}, - {0x0, 0, 2, 4901}, - {0x38c, 16, 16, 4903}, - {0x0, 2, 7, 4903}, - {0xf90d, 16, 16, 4908}, - {0x0, 2, 3, 4908}, - {0x2f875, 16, 16, 4909}, - {0x0, 14, 15, 4909}, - {0xf9d2, 16, 16, 4910}, - {0x0, 10, 11, 4910}, - {0xf902, 16, 16, 4911}, - {0x22f, 16, 16, 4911}, - {0x0, 2, 3, 4911}, - {0x1f56, 16, 16, 4912}, - {0x0, 3, 8, 4912}, - {0x15e, 16, 16, 4917}, - {0x218, 16, 16, 4917}, - {0x1e62, 16, 16, 4917}, - {0x0, 2, 7, 4917}, - {0xf9ba, 16, 16, 4922}, - {0xf91b, 16, 16, 4922}, - {0x0, 3, 10, 4922}, - {0x0, 6, 7, 4929}, - {0x2f916, 16, 16, 4930}, - {0x0, 0, 1, 4930}, - {0x0, 0, 1, 4931}, - {0x0, 3, 4, 4932}, - {0x0, 3, 4, 4933}, - {0x0, 8, 9, 4934}, - {0x22ae, 16, 16, 4935}, - {0x0, 7, 8, 4935}, - {0x2f973, 16, 16, 4936}, - {0x0, 0, 1, 4936}, - {0x0, 0, 1, 4937}, - {0x0, 3, 4, 4938}, - {0x0, 4, 5, 4939}, - {0x0, 5, 6, 4940}, - {0x1fa6, 16, 16, 4941}, - {0x0, 0, 1, 4941}, - {0x0, 0, 1, 4942}, - {0x0, 3, 4, 4943}, - {0x0, 0, 1, 4944}, - {0x0, 0, 2, 4945}, - {0x1f42, 16, 16, 4947}, - {0x1f44, 16, 16, 4947}, - {0x0, 3, 4, 4947}, - {0x2f843, 16, 16, 4948}, - {0x0, 10, 11, 4948}, - {0x0, 3, 4, 4949}, - {0x2f8ec, 16, 16, 4950}, - {0x0, 0, 10, 4950}, - {0x1edd, 16, 16, 4960}, - {0x1edb, 16, 16, 4960}, - {0x0, 15, 16, 4960}, - {0xf9eb, 16, 16, 4961}, - {0x1ee1, 16, 16, 4961}, - {0x1edf, 16, 16, 4961}, - {0x622, 16, 16, 4961}, - {0x0, 0, 1, 4961}, - {0x0, 3, 4, 4962}, - {0x0, 0, 1, 4963}, - {0x0, 9, 10, 4964}, - {0x0, 9, 11, 4965}, - {0x30d3, 16, 16, 4967}, - {0x0, 1, 4, 4967}, - {0x0, 12, 13, 4970}, - {0x2f8a2, 16, 16, 4971}, - {0x0, 0, 1, 4971}, - {0xf944, 16, 16, 4972}, - {0x0, 0, 1, 4972}, - {0x1e2c, 16, 16, 4973}, - {0x0, 0, 1, 4973}, - {0x0, 0, 1, 4974}, - {0x0, 3, 4, 4975}, - {0x0, 0, 4, 4976}, - {0x0, 3, 8, 4980}, - {0x1e33, 16, 16, 4985}, - {0x0, 2, 3, 4985}, - {0x2f888, 16, 16, 4986}, - {0x0, 4, 5, 4986}, - {0x2f80f, 16, 16, 4987}, - {0x0, 0, 10, 4987}, - {0x0, 14, 15, 4997}, - {0x2fa13, 16, 16, 4998}, - {0x0, 2, 3, 4998}, - {0x2f960, 16, 16, 4999}, - {0x0, 8, 9, 4999}, - {0x0, 0, 1, 5000}, - {0x0, 0, 1, 5001}, - {0x0, 9, 10, 5002}, - {0x0, 3, 4, 5003}, - {0x0, 12, 13, 5004}, - {0x929, 16, 16, 5005}, - {0x0, 0, 1, 5005}, - {0x0, 10, 11, 5006}, - {0x2f8ca, 16, 16, 5007}, - {0x0, 0, 1, 5007}, - {0x0, 0, 1, 5008}, - {0x0, 3, 4, 5009}, - {0x0, 0, 5, 5010}, - {0x0, 2, 6, 5015}, - {0x1fa8, 16, 16, 5019}, - {0x0, 0, 1, 5019}, - {0x0, 0, 1, 5020}, - {0x0, 3, 4, 5021}, - {0x0, 4, 5, 5022}, - {0x0, 5, 6, 5023}, - {0x1f9e, 16, 16, 5024}, - {0x0, 0, 1, 5024}, - {0x0, 3, 4, 5025}, - {0x0, 0, 1, 5026}, - {0x0, 9, 10, 5027}, - {0x0, 9, 10, 5028}, - {0x30fe, 16, 16, 5029}, - {0x0, 2, 13, 5029}, - {0x1e27, 16, 16, 5040}, - {0x1e23, 16, 16, 5040}, - {0x125, 16, 16, 5040}, - {0x0, 4, 5, 5040}, - {0x2f8f1, 16, 16, 5041}, - {0x0, 3, 5, 5041}, - {0x1f60, 16, 16, 5043}, - {0x0, 4, 5, 5043}, - {0x2f971, 16, 16, 5044}, - {0x30d4, 16, 16, 5044}, - {0x1f61, 16, 16, 5044}, - {0x0, 0, 1, 5044}, - {0x0, 3, 4, 5045}, - {0x0, 0, 1, 5046}, - {0x0, 9, 10, 5047}, - {0x0, 9, 10, 5048}, - {0x304c, 16, 16, 5049}, - {0x0, 0, 1, 5049}, - {0x0, 0, 1, 5050}, - {0x0, 3, 4, 5051}, - {0x0, 0, 1, 5052}, - {0x0, 1, 2, 5053}, - {0x1e78, 16, 16, 5054}, - {0x0, 0, 1, 5054}, - {0x0, 3, 4, 5055}, - {0x0, 0, 1, 5056}, - {0x0, 9, 10, 5057}, - {0x0, 9, 11, 5058}, - {0x30d9, 16, 16, 5060}, - {0x0, 8, 9, 5060}, - {0xf9b3, 16, 16, 5061}, - {0x0, 11, 15, 5061}, - {0x2f914, 16, 16, 5065}, - {0x0, 8, 14, 5065}, - {0xfa5c, 16, 16, 5071}, - {0x0, 0, 2, 5071}, - {0x1f34, 16, 16, 5073}, - {0x2f915, 16, 16, 5073}, - {0x0, 0, 1, 5073}, - {0x0, 0, 1, 5074}, - {0x0, 3, 4, 5075}, - {0x0, 4, 5, 5076}, - {0x0, 5, 6, 5077}, - {0x1f85, 16, 16, 5078}, - {0x0, 4, 15, 5078}, - {0x2f907, 16, 16, 5089}, - {0x0, 2, 3, 5089}, - {0x2f8bf, 16, 16, 5090}, - {0x0, 15, 16, 5090}, - {0xf937, 16, 16, 5091}, - {0x2126, 0, 1, 5091}, - {0x0, 0, 1, 5092}, - {0x0, 3, 4, 5093}, - {0x0, 0, 5, 5094}, - {0x0, 0, 2, 5099}, - {0x1ffa, 16, 16, 5101}, - {0x38f, 16, 16, 5101}, - {0x0, 4, 13, 5101}, - {0x0, 0, 1, 5110}, - {0x0, 0, 1, 5111}, - {0x0, 3, 4, 5112}, - {0x0, 0, 1, 5113}, - {0x0, 1, 2, 5114}, - {0x1ff, 16, 16, 5115}, - {0x0, 0, 1, 5115}, - {0x0, 0, 1, 5116}, - {0x0, 3, 4, 5117}, - {0x0, 4, 5, 5118}, - {0x0, 5, 6, 5119}, - {0x1f84, 16, 16, 5120}, - {0xf9f6, 16, 16, 5120}, - {0x0, 8, 10, 5120}, - {0x2329, 16, 16, 5122}, - {0x232a, 16, 16, 5122}, - {0x0, 0, 1, 5122}, - {0x0, 0, 1, 5123}, - {0x0, 3, 4, 5124}, - {0x0, 3, 4, 5125}, - {0x0, 8, 9, 5126}, - {0x2274, 16, 16, 5127}, - {0x30da, 16, 16, 5127}, - {0x0, 4, 13, 5127}, - {0x0, 0, 1, 5136}, - {0x0, 0, 1, 5137}, - {0x0, 3, 4, 5138}, - {0x0, 0, 1, 5139}, - {0x0, 0, 10, 5140}, - {0x1ed4, 16, 16, 5150}, - {0x0, 4, 5, 5150}, - {0xfa34, 16, 16, 5151}, - {0x1ed0, 16, 16, 5151}, - {0x1ed2, 16, 16, 5151}, - {0x1ed6, 16, 16, 5151}, - {0x2f900, 16, 16, 5151}, - {0x0, 4, 5, 5151}, - {0x2f940, 16, 16, 5152}, - {0x0, 0, 1, 5152}, - {0x0, 0, 1, 5153}, - {0x0, 3, 4, 5154}, - {0x0, 0, 1, 5155}, - {0x0, 1, 9, 5156}, - {0x1e4e, 16, 16, 5164}, - {0x1e4c, 16, 16, 5164}, - {0x22c, 16, 16, 5164}, - {0x0, 9, 15, 5164}, - {0x2fa18, 16, 16, 5170}, - {0x0, 12, 13, 5170}, - {0x0, 8, 9, 5171}, - {0x2f86c, 16, 16, 5172}, - {0x0, 7, 8, 5172}, - {0x2fa0f, 16, 16, 5173}, - {0x0, 1, 3, 5173}, - {0x0, 0, 1, 5175}, - {0x0, 0, 1, 5176}, - {0x0, 3, 4, 5177}, - {0x0, 3, 4, 5178}, - {0x0, 8, 9, 5179}, - {0x22e2, 16, 16, 5180}, - {0x0, 4, 5, 5180}, - {0xfa06, 16, 16, 5181}, - {0x0, 0, 1, 5181}, - {0x0, 0, 1, 5182}, - {0x0, 3, 4, 5183}, - {0x0, 0, 4, 5184}, - {0x0, 1, 16, 5188}, - {0x155, 16, 16, 5203}, - {0x0, 8, 9, 5203}, - {0xfa3e, 16, 16, 5204}, - {0x0, 0, 1, 5204}, - {0xf93d, 16, 16, 5205}, - {0x0, 0, 8, 5205}, - {0x0, 0, 1, 5213}, - {0x0, 0, 1, 5214}, - {0x0, 3, 4, 5215}, - {0x0, 0, 3, 5216}, - {0x0, 3, 4, 5219}, - {0x1ef1, 16, 16, 5220}, - {0x0, 6, 7, 5220}, - {0x2f935, 16, 16, 5221}, - {0x2fa17, 16, 16, 5221}, - {0x0, 14, 15, 5221}, - {0xfa48, 16, 16, 5222}, - {0x0, 15, 16, 5222}, - {0xf939, 16, 16, 5223}, - {0x0, 0, 1, 5223}, - {0x0, 0, 1, 5224}, - {0x0, 3, 4, 5225}, - {0x0, 0, 1, 5226}, - {0x0, 12, 13, 5227}, - {0x1ee, 16, 16, 5228}, - {0x0, 8, 9, 5228}, - {0x2fa11, 16, 16, 5229}, - {0x0, 8, 9, 5229}, - {0x2f97e, 16, 16, 5230}, - {0x0, 4, 5, 5230}, - {0xfa12, 16, 16, 5231}, - {0x0, 0, 1, 5231}, - {0x0, 3, 4, 5232}, - {0x0, 0, 1, 5233}, - {0x0, 9, 10, 5234}, - {0x0, 9, 10, 5235}, - {0x305c, 16, 16, 5236}, - {0x0, 10, 11, 5236}, - {0x2f954, 16, 16, 5237}, - {0x0, 7, 13, 5237}, - {0x1e6a, 16, 16, 5243}, - {0x0, 0, 1, 5243}, - {0x0, 0, 1, 5244}, - {0x0, 3, 4, 5245}, - {0x0, 0, 1, 5246}, - {0x0, 1, 2, 5247}, - {0x344, 16, 16, 5248}, - {0x0, 0, 1, 5248}, - {0x0, 0, 1, 5249}, - {0x0, 3, 4, 5250}, - {0x0, 0, 1, 5251}, - {0x0, 0, 2, 5252}, - {0x1f45, 16, 16, 5254}, - {0x1f43, 16, 16, 5254}, - {0x0, 0, 1, 5254}, - {0x0, 0, 1, 5255}, - {0x0, 3, 4, 5256}, - {0x0, 0, 4, 5257}, - {0x0, 1, 2, 5261}, - {0x1e94, 16, 16, 5262}, - {0x0, 15, 16, 5262}, - {0xf9bd, 16, 16, 5263}, - {0x0, 1, 13, 5263}, - {0xfa43, 16, 16, 5275}, - {0x0, 0, 1, 5275}, - {0x0, 0, 1, 5276}, - {0x0, 3, 4, 5277}, - {0x0, 0, 1, 5278}, - {0x0, 0, 2, 5279}, - {0x1e51, 16, 16, 5281}, - {0x1e53, 16, 16, 5281}, - {0x0, 3, 4, 5281}, - {0x2f889, 16, 16, 5282}, - {0x0, 3, 9, 5282}, - {0x104, 16, 16, 5288}, - {0x164, 16, 16, 5288}, - {0x0, 7, 8, 5288}, - {0x2fa05, 16, 16, 5289}, - {0x1ea0, 16, 16, 5289}, - {0x1e00, 16, 16, 5289}, - {0x0, 13, 14, 5289}, - {0x0, 0, 1, 5290}, - {0x0, 3, 4, 5291}, - {0x0, 0, 1, 5292}, - {0x0, 9, 10, 5293}, - {0x0, 9, 10, 5294}, - {0x309e, 16, 16, 5295}, - {0x0, 2, 3, 5295}, - {0x2f840, 16, 16, 5296}, - {0x0, 10, 11, 5296}, - {0x2f948, 16, 16, 5297}, - {0x2f8d5, 16, 16, 5297}, - {0x0, 11, 12, 5297}, - {0xf9f7, 16, 16, 5298}, - {0x0, 0, 1, 5298}, - {0x0, 0, 1, 5299}, - {0x0, 3, 4, 5300}, - {0x0, 0, 1, 5301}, - {0x0, 6, 9, 5302}, - {0x4c1, 16, 16, 5305}, - {0x1f24, 16, 16, 5305}, - {0x0, 0, 1, 5305}, - {0x0, 0, 1, 5306}, - {0x0, 3, 4, 5307}, - {0x0, 0, 5, 5308}, - {0x0, 2, 6, 5313}, - {0x1f6f, 16, 16, 5317}, - {0x4dc, 16, 16, 5317}, - {0x0, 0, 1, 5317}, - {0x0, 0, 1, 5318}, - {0x0, 3, 4, 5319}, - {0x0, 0, 1, 5320}, - {0x0, 1, 2, 5321}, - {0x1fe, 16, 16, 5322}, - {0x1fa9, 16, 16, 5322}, - {0x0, 13, 14, 5322}, - {0x2f99b, 16, 16, 5323}, - {0x0, 0, 1, 5323}, - {0x0, 0, 1, 5324}, - {0x0, 3, 4, 5325}, - {0x0, 3, 4, 5326}, - {0x0, 8, 9, 5327}, - {0x2204, 16, 16, 5328}, - {0x0, 10, 12, 5328}, - {0x0, 8, 9, 5330}, - {0x2f92d, 16, 16, 5331}, - {0x0, 0, 1, 5331}, - {0x0, 0, 1, 5332}, - {0x0, 3, 4, 5333}, - {0x0, 0, 1, 5334}, - {0x0, 0, 10, 5335}, - {0x1ec2, 16, 16, 5345}, - {0x1ebe, 16, 16, 5345}, - {0x1ec0, 16, 16, 5345}, - {0x1ec4, 16, 16, 5345}, - {0x0, 2, 3, 5345}, - {0x2f9e0, 16, 16, 5346}, - {0x0, 2, 3, 5346}, - {0x0, 12, 13, 5347}, - {0x2f834, 16, 16, 5348}, - {0x0, 7, 9, 5348}, - {0x2f904, 16, 16, 5350}, - {0x0, 6, 7, 5350}, - {0x0, 0, 1, 5351}, - {0x0, 0, 1, 5352}, - {0x0, 3, 4, 5353}, - {0x0, 0, 1, 5354}, - {0x0, 8, 9, 5355}, - {0x457, 16, 16, 5356}, - {0x0, 0, 1, 5356}, - {0x0, 0, 1, 5357}, - {0x0, 3, 4, 5358}, - {0x0, 0, 2, 5359}, - {0x0, 0, 2, 5361}, - {0x3ad, 16, 16, 5363}, - {0x0, 0, 14, 5363}, - {0x0, 8, 9, 5377}, - {0x2f8eb, 16, 16, 5378}, - {0x0, 0, 1, 5378}, - {0x0, 0, 1, 5379}, - {0x0, 3, 4, 5380}, - {0x0, 0, 3, 5381}, - {0x0, 3, 8, 5384}, - {0x1e63, 16, 16, 5389}, - {0x15f, 16, 16, 5389}, - {0x219, 16, 16, 5389}, - {0x0, 0, 1, 5389}, - {0x0, 0, 1, 5390}, - {0x0, 3, 4, 5391}, - {0x0, 3, 4, 5392}, - {0x0, 8, 9, 5393}, - {0x2285, 16, 16, 5394}, - {0x4ef, 16, 16, 5394}, - {0xcf, 16, 16, 5394}, - {0x0, 0, 1, 5394}, - {0x0, 0, 1, 5395}, - {0x0, 13, 14, 5396}, - {0x0, 12, 14, 5397}, - {0x0, 15, 16, 5399}, - {0xdde, 16, 16, 5400}, - {0x4f1, 16, 16, 5400}, - {0x130, 16, 16, 5400}, - {0x12a, 16, 16, 5400}, - {0xce, 16, 16, 5400}, - {0x128, 16, 16, 5400}, - {0xcc, 16, 16, 5400}, - {0xcd, 16, 16, 5400}, - {0x0, 10, 11, 5400}, - {0x2f8ea, 16, 16, 5401}, - {0x0, 2, 6, 5401}, - {0x1fc3, 16, 16, 5405}, - {0x0, 7, 8, 5405}, - {0x1e02, 16, 16, 5406}, - {0x1fc6, 16, 16, 5406}, - {0x0, 2, 4, 5406}, - {0x0, 0, 1, 5408}, - {0x0, 0, 1, 5409}, - {0x0, 3, 4, 5410}, - {0x0, 0, 1, 5411}, - {0x0, 0, 10, 5412}, - {0x1eaf, 16, 16, 5422}, - {0x0, 2, 16, 5422}, - {0x2fa02, 16, 16, 5436}, - {0x0, 2, 6, 5436}, - {0x1fb3, 16, 16, 5440}, - {0x0, 0, 1, 5440}, - {0x0, 0, 1, 5441}, - {0x0, 3, 4, 5442}, - {0x0, 0, 1, 5443}, - {0x0, 8, 9, 5444}, - {0x4f4, 16, 16, 5445}, - {0x1fb6, 16, 16, 5445}, - {0x0, 6, 7, 5445}, - {0xfa1c, 16, 16, 5446}, - {0x0, 2, 3, 5446}, - {0x1f37, 16, 16, 5447}, - {0x0, 13, 14, 5447}, - {0x2f815, 16, 16, 5448}, - {0x0, 11, 12, 5448}, - {0x2f855, 16, 16, 5449}, - {0x0, 12, 14, 5449}, - {0x2f8fd, 16, 16, 5451}, - {0x4f3, 16, 16, 5451}, - {0xf968, 16, 16, 5451}, - {0x208, 16, 16, 5451}, - {0x0, 1, 2, 5451}, - {0xf90a, 16, 16, 5452}, - {0x1cf, 16, 16, 5452}, - {0x0, 14, 15, 5452}, - {0xf9c6, 16, 16, 5453}, - {0xfa2a, 16, 16, 5453}, - {0x0, 3, 5, 5453}, - {0x1f68, 16, 16, 5455}, - {0x1f69, 16, 16, 5455}, - {0x0, 1, 5, 5455}, - {0x2f98c, 16, 16, 5459}, - {0x2f893, 16, 16, 5459}, - {0x0, 8, 9, 5459}, - {0xf926, 16, 16, 5460}, - {0x0, 3, 9, 5460}, - {0x1ecd, 16, 16, 5466}, - {0x0, 0, 1, 5466}, - {0x0, 3, 4, 5467}, - {0x0, 0, 1, 5468}, - {0x0, 9, 10, 5469}, - {0x0, 9, 10, 5470}, - {0x3052, 16, 16, 5471}, - {0x1eb, 16, 16, 5471}, - {0x0, 0, 10, 5471}, - {0xf975, 16, 16, 5481}, - {0x2f8c1, 16, 16, 5481}, - {0x0, 0, 1, 5481}, - {0x0, 0, 1, 5482}, - {0x0, 3, 4, 5483}, - {0x0, 0, 4, 5484}, - {0x0, 7, 13, 5488}, - {0x1e0a, 16, 16, 5494}, - {0x0, 0, 1, 5494}, - {0x2f9dc, 16, 16, 5495}, - {0x0, 0, 1, 5495}, - {0x1e1b, 16, 16, 5496}, - {0x0, 2, 15, 5496}, - {0xf952, 16, 16, 5509}, - {0x0, 13, 14, 5509}, - {0xfa1e, 16, 16, 5510}, - {0x0, 4, 5, 5510}, - {0x2f8d1, 16, 16, 5511}, - {0x10e, 16, 16, 5511}, - {0x0, 14, 15, 5511}, - {0xf977, 16, 16, 5512}, - {0x0, 0, 1, 5512}, - {0xfa60, 16, 16, 5513}, - {0x0, 10, 12, 5513}, - {0x0, 1, 2, 5515}, - {0x2f93b, 16, 16, 5516}, - {0x0, 3, 4, 5516}, - {0x1e7d, 16, 16, 5517}, - {0x0, 0, 1, 5517}, - {0x0, 0, 1, 5518}, - {0x0, 3, 4, 5519}, - {0x0, 4, 5, 5520}, - {0x0, 5, 6, 5521}, - {0x1fac, 16, 16, 5522}, - {0x0, 1, 2, 5522}, - {0x0, 8, 9, 5523}, - {0x2f871, 16, 16, 5524}, - {0x0, 10, 13, 5524}, - {0xf947, 16, 16, 5527}, - {0x2f950, 16, 16, 5527}, - {0x0, 0, 1, 5527}, - {0x0, 0, 1, 5528}, - {0x0, 3, 4, 5529}, - {0x0, 4, 5, 5530}, - {0x0, 5, 6, 5531}, - {0x1ff7, 16, 16, 5532}, - {0x0, 10, 15, 5532}, - {0xf96c, 16, 16, 5537}, - {0x0, 0, 1, 5537}, - {0x0, 0, 1, 5538}, - {0x0, 3, 4, 5539}, - {0x0, 0, 1, 5540}, - {0x0, 8, 9, 5541}, - {0x4ec, 16, 16, 5542}, - {0xfa10, 16, 16, 5542}, - {0x0, 0, 10, 5542}, - {0x0, 10, 11, 5552}, - {0x2f9fb, 16, 16, 5553}, - {0xf92f, 16, 16, 5553}, - {0x0, 6, 7, 5553}, - {0xf98b, 16, 16, 5554}, - {0x0, 4, 5, 5554}, - {0x2f8e6, 16, 16, 5555}, - {0x0, 0, 1, 5555}, - {0x0, 0, 1, 5556}, - {0x0, 3, 4, 5557}, - {0x0, 4, 5, 5558}, - {0x0, 5, 6, 5559}, - {0x1fab, 16, 16, 5560}, - {0x0, 7, 8, 5560}, - {0x0, 7, 8, 5561}, - {0x2f9f1, 16, 16, 5562}, - {0x0, 0, 1, 5562}, - {0x0, 0, 1, 5563}, - {0x0, 3, 4, 5564}, - {0x0, 0, 1, 5565}, - {0x0, 4, 5, 5566}, - {0x22a, 16, 16, 5567}, - {0x0, 0, 1, 5567}, - {0x0, 0, 1, 5568}, - {0x0, 3, 4, 5569}, - {0x0, 3, 4, 5570}, - {0x0, 8, 9, 5571}, - {0x219a, 16, 16, 5572}, - {0xf92e, 16, 16, 5572}, - {0xf965, 16, 16, 5572}, - {0x0, 0, 1, 5572}, - {0x0, 0, 1, 5573}, - {0x0, 3, 4, 5574}, - {0x0, 0, 4, 5575}, - {0x0, 7, 13, 5579}, - {0x165, 16, 16, 5585}, - {0x0, 2, 6, 5585}, - {0x1f99, 16, 16, 5589}, - {0x1f2f, 16, 16, 5589}, - {0x0, 0, 1, 5589}, - {0x0, 0, 1, 5590}, - {0x0, 3, 4, 5591}, - {0x0, 0, 1, 5592}, - {0x0, 8, 9, 5593}, - {0x4de, 16, 16, 5594}, - {0x0, 14, 15, 5594}, - {0xfa1d, 16, 16, 5595}, - {0x1ec3, 16, 16, 5595}, - {0x0, 0, 1, 5595}, - {0x0, 0, 1, 5596}, - {0x0, 3, 4, 5597}, - {0x0, 0, 2, 5598}, - {0x0, 0, 2, 5600}, - {0x1f78, 16, 16, 5602}, - {0x3cc, 16, 16, 5602}, - {0x1ec5, 16, 16, 5602}, - {0x1ebf, 16, 16, 5602}, - {0x0, 11, 12, 5602}, - {0x2fa1c, 16, 16, 5603}, - {0x0, 3, 15, 5603}, - {0x2f8db, 16, 16, 5615}, - {0x0, 1, 2, 5615}, - {0xf904, 16, 16, 5616}, - {0x0, 3, 4, 5616}, - {0x1e92, 16, 16, 5617}, - {0x0, 1, 2, 5617}, - {0x2f9c1, 16, 16, 5618}, - {0x1e6b, 16, 16, 5618}, - {0x1e97, 16, 16, 5618}, - {0x0, 0, 1, 5618}, - {0x0, 0, 1, 5619}, - {0x0, 3, 4, 5620}, - {0x0, 4, 5, 5621}, - {0x0, 5, 6, 5622}, - {0x1ff2, 16, 16, 5623}, - {0x0, 0, 1, 5623}, - {0x0, 0, 1, 5624}, - {0x0, 3, 4, 5625}, - {0x0, 0, 2, 5626}, - {0x0, 0, 9, 5628}, - {0x3aa, 16, 16, 5637}, - {0x0, 0, 1, 5637}, - {0x0, 0, 1, 5638}, - {0x0, 3, 4, 5639}, - {0x0, 0, 1, 5640}, - {0x0, 6, 9, 5641}, - {0x4c2, 16, 16, 5644}, - {0x4dd, 16, 16, 5644}, - {0x0, 8, 9, 5644}, - {0x2f885, 16, 16, 5645}, - {0x1fda, 16, 16, 5645}, - {0x38a, 16, 16, 5645}, - {0x1fd8, 16, 16, 5645}, - {0x1fd9, 16, 16, 5645}, - {0x0, 5, 10, 5645}, - {0xf9a3, 16, 16, 5650}, - {0x0, 0, 1, 5650}, - {0xf921, 16, 16, 5651}, - {0x2f89f, 16, 16, 5651}, - {0x0, 0, 1, 5651}, - {0x0, 0, 1, 5652}, - {0x0, 3, 4, 5653}, - {0x0, 3, 4, 5654}, - {0x0, 8, 9, 5655}, - {0x2288, 16, 16, 5656}, - {0x0, 0, 1, 5656}, - {0x0, 0, 1, 5657}, - {0x0, 3, 4, 5658}, - {0x0, 0, 4, 5659}, - {0x0, 1, 12, 5663}, - {0x1b0, 16, 16, 5674}, - {0xf9aa, 16, 16, 5674}, - {0x0, 2, 3, 5674}, - {0x0, 0, 1, 5675}, - {0x0, 0, 1, 5676}, - {0x0, 3, 4, 5677}, - {0x0, 0, 1, 5678}, - {0x0, 12, 13, 5679}, - {0x1ef, 16, 16, 5680}, - {0x217, 16, 16, 5680}, - {0x0, 11, 12, 5680}, - {0x2f9bd, 16, 16, 5681}, - {0x0, 0, 1, 5681}, - {0x0, 0, 1, 5682}, - {0x0, 3, 4, 5683}, - {0x0, 0, 4, 5684}, - {0x0, 0, 1, 5688}, - {0x1e74, 16, 16, 5689}, - {0x0, 0, 1, 5689}, - {0x0, 0, 1, 5690}, - {0x0, 3, 4, 5691}, - {0x0, 0, 1, 5692}, - {0x0, 0, 10, 5693}, - {0x1eb0, 16, 16, 5703}, - {0x1eae, 16, 16, 5703}, - {0x1eb4, 16, 16, 5703}, - {0x1eb2, 16, 16, 5703}, - {0x0, 8, 9, 5703}, - {0x2f972, 16, 16, 5704}, - {0x0, 15, 16, 5704}, - {0x2f837, 16, 16, 5705}, - {0x0, 0, 1, 5705}, - {0x0, 0, 1, 5706}, - {0x0, 3, 4, 5707}, - {0x0, 4, 5, 5708}, - {0x0, 5, 6, 5709}, - {0x1fa7, 16, 16, 5710}, - {0x0, 0, 1, 5710}, - {0x0, 3, 4, 5711}, - {0x0, 0, 1, 5712}, - {0x0, 9, 10, 5713}, - {0x0, 9, 10, 5714}, - {0x305a, 16, 16, 5715}, - {0x0, 1, 13, 5715}, - {0x1e9, 16, 16, 5727}, - {0x0, 15, 16, 5727}, - {0x2f908, 16, 16, 5728}, - {0x0, 15, 16, 5728}, - {0x2f8fc, 16, 16, 5729}, - {0xfa51, 16, 16, 5729}, - {0x0, 13, 14, 5729}, - {0x2f8e7, 16, 16, 5730}, - {0x0, 5, 6, 5730}, - {0x1fbc, 16, 16, 5731}, - {0x0, 10, 11, 5731}, - {0x2f8a1, 16, 16, 5732}, - {0x0, 1, 14, 5732}, - {0xfa26, 16, 16, 5745}, - {0x0, 11, 15, 5745}, - {0x0, 0, 1, 5749}, - {0x0, 0, 1, 5750}, - {0x0, 3, 4, 5751}, - {0x0, 3, 4, 5752}, - {0x0, 8, 9, 5753}, - {0x2260, 16, 16, 5754}, - {0x0, 3, 4, 5754}, - {0x0, 12, 13, 5755}, - {0x2f997, 16, 16, 5756}, - {0x0, 4, 5, 5756}, - {0x2f853, 16, 16, 5757}, - {0x3076, 16, 16, 5757}, - {0x0, 12, 13, 5757}, - {0xf92b, 16, 16, 5758}, - {0x0, 2, 3, 5758}, - {0x0, 2, 3, 5759}, - {0x2f803, 16, 16, 5760}, - {0x0, 1, 2, 5760}, - {0x20a, 16, 16, 5761}, - {0x0, 0, 1, 5761}, - {0x0, 0, 1, 5762}, - {0x0, 12, 13, 5763}, - {0x0, 12, 14, 5764}, - {0x0, 2, 3, 5766}, - {0xcca, 16, 16, 5767}, - {0x0, 8, 9, 5767}, - {0x2f865, 16, 16, 5768}, - {0x1e31, 16, 16, 5768}, - {0x0, 3, 4, 5768}, - {0x0, 10, 11, 5769}, - {0x2f80d, 16, 16, 5770}, - {0x0, 2, 8, 5770}, - {0x2f817, 16, 16, 5776}, - {0x2f8d2, 16, 16, 5776}, - {0x2f9e3, 16, 16, 5776}, - {0x0, 0, 2, 5776}, - {0x1f3c, 16, 16, 5778}, - {0x1f3a, 16, 16, 5778}, - {0x0, 6, 8, 5778}, - {0xb48, 16, 16, 5780}, - {0xb4c, 16, 16, 5780}, - {0x0, 0, 1, 5780}, - {0x0, 0, 1, 5781}, - {0x0, 3, 4, 5782}, - {0x0, 3, 4, 5783}, - {0x0, 8, 9, 5784}, - {0x2280, 16, 16, 5785}, - {0x0, 0, 1, 5785}, - {0x0, 3, 4, 5786}, - {0x0, 0, 1, 5787}, - {0x0, 9, 10, 5788}, - {0x0, 9, 10, 5789}, - {0x30f4, 16, 16, 5790}, - {0x0, 6, 8, 5790}, - {0xf9b2, 16, 16, 5792}, - {0x0, 3, 8, 5792}, - {0x1e5b, 16, 16, 5797}, - {0x0, 0, 1, 5797}, - {0x0, 0, 1, 5798}, - {0x0, 3, 4, 5799}, - {0x0, 0, 1, 5800}, - {0x0, 8, 9, 5801}, - {0x4f5, 16, 16, 5802}, - {0x157, 16, 16, 5802}, - {0x0, 9, 10, 5802}, - {0x2f9c2, 16, 16, 5803}, - {0x0, 5, 6, 5803}, - {0x2f988, 16, 16, 5804}, - {0x0, 0, 1, 5804}, - {0x0, 0, 1, 5805}, - {0x0, 3, 4, 5806}, - {0x0, 0, 1, 5807}, - {0x0, 0, 9, 5808}, - {0x40d, 16, 16, 5817}, - {0x0, 0, 1, 5817}, - {0x0, 0, 1, 5818}, - {0x0, 3, 4, 5819}, - {0x0, 0, 1, 5820}, - {0x0, 1, 8, 5821}, - {0x1e56, 16, 16, 5828}, - {0x1e54, 16, 16, 5828}, - {0x0, 2, 9, 5828}, - {0x2f83e, 16, 16, 5835}, - {0x0, 0, 1, 5835}, - {0x0, 0, 1, 5836}, - {0x0, 3, 4, 5837}, - {0x0, 4, 5, 5838}, - {0x0, 5, 6, 5839}, - {0x1fa2, 16, 16, 5840}, - {0xf980, 16, 16, 5840}, - {0x0, 10, 11, 5840}, - {0x0, 7, 8, 5841}, - {0x2f8f0, 16, 16, 5842}, - {0x0, 14, 15, 5842}, - {0xd4a, 16, 16, 5843}, - {0x0, 6, 15, 5843}, - {0x2f8ff, 16, 16, 5852}, - {0x0, 0, 1, 5852}, - {0x0, 0, 1, 5853}, - {0x0, 3, 4, 5854}, - {0x0, 0, 3, 5855}, - {0x0, 3, 4, 5858}, - {0x1e89, 16, 16, 5859}, - {0x0, 0, 1, 5859}, - {0x0, 0, 1, 5860}, - {0x0, 9, 10, 5861}, - {0x0, 3, 4, 5862}, - {0x0, 12, 13, 5863}, - {0x934, 16, 16, 5864}, - {0x0, 2, 3, 5864}, - {0x2f8ac, 16, 16, 5865}, - {0x0, 4, 5, 5865}, - {0x2f9ac, 16, 16, 5866}, - {0x0, 11, 12, 5866}, - {0x2f816, 16, 16, 5867}, - {0x0, 14, 15, 5867}, - {0x2f911, 16, 16, 5868}, - {0x0, 8, 9, 5868}, - {0x0, 6, 7, 5869}, - {0x2f96b, 16, 16, 5870}, - {0x1e15, 16, 16, 5870}, - {0x0, 3, 4, 5870}, - {0x1e05, 16, 16, 5871}, - {0x0, 8, 9, 5871}, - {0x2f93f, 16, 16, 5872}, - {0x0, 8, 9, 5872}, - {0x2f8d0, 16, 16, 5873}, - {0x0, 0, 1, 5873}, - {0x0, 0, 1, 5874}, - {0x0, 6, 7, 5875}, - {0x0, 5, 6, 5876}, - {0x0, 4, 5, 5877}, - {0x6d3, 16, 16, 5878}, - {0x0, 1, 2, 5878}, - {0x1e0e, 16, 16, 5879}, - {0x0, 7, 10, 5879}, - {0xfa33, 16, 16, 5882}, - {0x0, 0, 1, 5882}, - {0x0, 0, 1, 5883}, - {0x0, 3, 4, 5884}, - {0x0, 3, 4, 5885}, - {0x0, 8, 9, 5886}, - {0x2279, 16, 16, 5887}, - {0x0, 2, 12, 5887}, - {0x0, 1, 2, 5897}, - {0x2f9b0, 16, 16, 5898}, - {0x0, 0, 1, 5898}, - {0xfa39, 16, 16, 5899}, - {0x2f825, 16, 16, 5899}, - {0x0, 3, 4, 5899}, - {0x2f983, 16, 16, 5900}, - {0xfa05, 16, 16, 5900}, - {0x0, 9, 10, 5900}, - {0xf916, 16, 16, 5901}, - {0xf915, 16, 16, 5901}, - {0x0, 12, 13, 5901}, - {0xf908, 16, 16, 5902}, - {0x0, 9, 13, 5902}, - {0xf955, 16, 16, 5906}, - {0x0, 14, 15, 5906}, - {0xf9e1, 16, 16, 5907}, - {0x2f8d3, 16, 16, 5907}, + {0x0, 9, 10, 4104}, + {0x0, 9, 11, 4105}, + {0x30d3, 16, 16, 4107}, + {0x30d4, 16, 16, 4107}, + {0x0, 0, 1, 4107}, + {0x0, 3, 4, 4108}, + {0x0, 0, 1, 4109}, + {0x0, 9, 10, 4110}, + {0x0, 9, 11, 4111}, + {0x30d6, 16, 16, 4113}, + {0x30d7, 16, 16, 4113}, + {0x0, 0, 1, 4113}, + {0x0, 3, 4, 4114}, + {0x0, 0, 1, 4115}, + {0x0, 9, 10, 4116}, + {0x0, 9, 11, 4117}, + {0x30d9, 16, 16, 4119}, + {0x30da, 16, 16, 4119}, + {0x0, 0, 1, 4119}, + {0x0, 3, 4, 4120}, + {0x0, 0, 1, 4121}, + {0x0, 9, 10, 4122}, + {0x0, 9, 11, 4123}, + {0x30dc, 16, 16, 4125}, + {0x30dd, 16, 16, 4125}, + {0x0, 0, 1, 4125}, + {0x0, 3, 4, 4126}, + {0x0, 0, 1, 4127}, + {0x0, 9, 10, 4128}, + {0x0, 9, 10, 4129}, + {0x30f4, 16, 16, 4130}, + {0x0, 15, 16, 4130}, + {0x0, 0, 1, 4131}, + {0x0, 3, 4, 4132}, + {0x0, 0, 1, 4133}, + {0x0, 9, 10, 4134}, + {0x0, 9, 10, 4135}, + {0x30f7, 16, 16, 4136}, + {0x0, 0, 14, 4136}, + {0x0, 0, 1, 4150}, + {0x0, 3, 4, 4151}, + {0x0, 0, 1, 4152}, + {0x0, 9, 10, 4153}, + {0x0, 9, 10, 4154}, + {0x30f8, 16, 16, 4155}, + {0x0, 0, 1, 4155}, + {0x0, 3, 4, 4156}, + {0x0, 0, 1, 4157}, + {0x0, 9, 10, 4158}, + {0x0, 9, 10, 4159}, + {0x30f9, 16, 16, 4160}, + {0x0, 0, 1, 4160}, + {0x0, 3, 4, 4161}, + {0x0, 0, 1, 4162}, + {0x0, 9, 10, 4163}, + {0x0, 9, 10, 4164}, + {0x30fa, 16, 16, 4165}, + {0x0, 0, 1, 4165}, + {0x0, 3, 4, 4166}, + {0x0, 0, 1, 4167}, + {0x0, 9, 10, 4168}, + {0x0, 9, 10, 4169}, + {0x30fe, 16, 16, 4170}, + {0x0, 0, 16, 4170}, + {0x0, 4, 14, 4186}, + {0x0, 8, 9, 4196}, + {0xf900, 16, 16, 4197}, + {0x0, 0, 16, 4197}, + {0x0, 1, 16, 4213}, + {0x0, 4, 9, 4228}, + {0xf901, 16, 16, 4233}, + {0x0, 12, 14, 4233}, + {0x0, 10, 11, 4235}, + {0xf902, 16, 16, 4236}, + {0x0, 1, 9, 4236}, + {0xf903, 16, 16, 4244}, + {0x0, 1, 14, 4244}, + {0x0, 1, 2, 4257}, + {0xf904, 16, 16, 4258}, + {0x0, 0, 16, 4258}, + {0x0, 0, 15, 4274}, + {0x0, 2, 14, 4289}, + {0xf905, 16, 16, 4301}, + {0x0, 0, 16, 4301}, + {0x0, 0, 16, 4317}, + {0x0, 5, 12, 4333}, + {0xf906, 16, 16, 4340}, + {0x0, 0, 16, 4340}, + {0x0, 0, 10, 4356}, + {0x0, 12, 13, 4366}, + {0xf908, 16, 16, 4367}, + {0x0, 0, 15, 4367}, + {0x0, 1, 2, 4382}, + {0xf909, 16, 16, 4383}, + {0x0, 1, 14, 4383}, + {0x0, 1, 2, 4396}, + {0xf90a, 16, 16, 4397}, + {0x0, 1, 13, 4397}, + {0x0, 4, 8, 4409}, + {0xf90b, 16, 16, 4413}, + {0x0, 8, 9, 4413}, + {0xf90c, 16, 16, 4414}, + {0x0, 4, 16, 4414}, + {0x0, 2, 7, 4426}, + {0x2f8b1, 16, 16, 4431}, + {0x0, 0, 16, 4431}, + {0x0, 1, 16, 4447}, + {0x0, 9, 10, 4462}, + {0xf90e, 16, 16, 4463}, + {0x0, 7, 16, 4463}, + {0x0, 5, 6, 4472}, + {0xf90f, 16, 16, 4473}, + {0x0, 0, 15, 4473}, + {0x0, 15, 16, 4488}, + {0xf910, 16, 16, 4489}, + {0x0, 0, 15, 4489}, + {0x0, 10, 11, 4504}, + {0xf911, 16, 16, 4505}, + {0x0, 0, 16, 4505}, + {0x0, 8, 11, 4521}, + {0xf912, 16, 16, 4524}, + {0x0, 2, 16, 4524}, + {0x0, 15, 16, 4538}, + {0xf913, 16, 16, 4539}, + {0x0, 0, 14, 4539}, + {0x0, 2, 3, 4553}, + {0xf9bf, 16, 16, 4554}, + {0x0, 1, 16, 4554}, + {0x0, 6, 15, 4569}, + {0xf915, 16, 16, 4578}, + {0x0, 1, 14, 4578}, + {0x0, 9, 10, 4591}, + {0xf916, 16, 16, 4592}, + {0x0, 2, 14, 4592}, + {0x0, 14, 15, 4604}, + {0xf917, 16, 16, 4605}, + {0x0, 3, 16, 4605}, + {0x0, 13, 14, 4618}, + {0xf918, 16, 16, 4619}, + {0x0, 10, 11, 4619}, + {0xf919, 16, 16, 4620}, + {0x0, 2, 16, 4620}, + {0x0, 1, 15, 4634}, + {0xf91a, 16, 16, 4648}, + {0x0, 2, 7, 4648}, + {0xf91b, 16, 16, 4653}, + {0x0, 3, 16, 4653}, + {0xf91c, 16, 16, 4666}, + {0x0, 0, 12, 4666}, + {0x0, 4, 5, 4678}, + {0xf91d, 16, 16, 4679}, + {0x0, 1, 16, 4679}, + {0x0, 0, 12, 4694}, + {0xf91e, 16, 16, 4706}, + {0x0, 13, 14, 4706}, + {0xf91f, 16, 16, 4707}, + {0x0, 1, 16, 4707}, + {0x0, 14, 15, 4722}, + {0xf920, 16, 16, 4723}, + {0x0, 1, 16, 4723}, + {0x0, 0, 1, 4738}, + {0xf921, 16, 16, 4739}, + {0x0, 0, 16, 4739}, + {0x0, 11, 12, 4755}, + {0xf922, 16, 16, 4756}, + {0x0, 1, 16, 4756}, + {0x0, 13, 14, 4771}, + {0xf923, 16, 16, 4772}, + {0x0, 1, 10, 4772}, + {0x0, 4, 5, 4781}, + {0xf924, 16, 16, 4782}, + {0x0, 0, 16, 4782}, + {0x0, 9, 16, 4798}, + {0xf925, 16, 16, 4805}, + {0x0, 0, 15, 4805}, + {0x0, 8, 9, 4820}, + {0xf926, 16, 16, 4821}, + {0x0, 15, 16, 4821}, + {0xf927, 16, 16, 4822}, + {0x0, 2, 16, 4822}, + {0x0, 9, 11, 4836}, + {0x2f88e, 16, 16, 4838}, + {0x0, 0, 16, 4838}, + {0x0, 7, 12, 4854}, + {0x2f8d8, 16, 16, 4859}, + {0x0, 9, 11, 4859}, + {0xf92a, 16, 16, 4861}, + {0x0, 12, 13, 4861}, + {0xf92b, 16, 16, 4862}, + {0x0, 14, 15, 4862}, + {0xf92c, 16, 16, 4863}, + {0x0, 6, 12, 4863}, + {0x0, 6, 12, 4869}, + {0xf92d, 16, 16, 4875}, + {0x0, 4, 16, 4875}, + {0x0, 5, 8, 4887}, + {0xf92e, 16, 16, 4890}, + {0x0, 0, 16, 4890}, + {0x0, 2, 15, 4906}, + {0xf92f, 16, 16, 4919}, + {0x0, 2, 13, 4919}, + {0x0, 4, 5, 4930}, + {0xf930, 16, 16, 4931}, + {0x0, 3, 12, 4931}, + {0xf931, 16, 16, 4940}, + {0xf932, 16, 16, 4940}, + {0x0, 7, 8, 4940}, + {0xf933, 16, 16, 4941}, + {0x0, 0, 12, 4941}, + {0x0, 1, 6, 4953}, + {0xf934, 16, 16, 4958}, + {0x0, 6, 7, 4958}, + {0xf935, 16, 16, 4959}, + {0x0, 0, 13, 4959}, + {0x2f9b4, 16, 16, 4972}, + {0x0, 0, 16, 4972}, + {0x0, 15, 16, 4988}, + {0xf937, 16, 16, 4989}, + {0x0, 2, 16, 4989}, + {0x0, 2, 3, 5003}, + {0xf938, 16, 16, 5004}, + {0x0, 1, 7, 5004}, + {0x0, 15, 16, 5010}, + {0xf939, 16, 16, 5011}, + {0x0, 6, 16, 5011}, + {0x0, 10, 11, 5021}, + {0xf93a, 16, 16, 5022}, + {0x0, 4, 16, 5022}, + {0x0, 12, 13, 5034}, + {0x2f94f, 16, 16, 5035}, + {0x0, 2, 15, 5035}, + {0x0, 15, 16, 5048}, + {0xf93c, 16, 16, 5049}, + {0x0, 0, 16, 5049}, + {0x0, 0, 1, 5065}, + {0xf93d, 16, 16, 5066}, + {0x0, 1, 16, 5066}, + {0x0, 9, 13, 5081}, + {0xf93e, 16, 16, 5085}, + {0x0, 0, 16, 5085}, + {0x0, 4, 5, 5101}, + {0xf93f, 16, 16, 5102}, + {0x0, 15, 16, 5102}, + {0xf940, 16, 16, 5103}, + {0x0, 10, 16, 5103}, + {0x0, 2, 7, 5109}, + {0xf941, 16, 16, 5114}, + {0x0, 0, 16, 5114}, + {0x0, 8, 16, 5130}, + {0xf942, 16, 16, 5138}, + {0x0, 0, 16, 5138}, + {0x0, 4, 5, 5154}, + {0xf943, 16, 16, 5155}, + {0x0, 3, 15, 5155}, + {0x0, 0, 1, 5167}, + {0xf944, 16, 16, 5168}, + {0x0, 0, 15, 5168}, + {0xf945, 16, 16, 5183}, + {0x0, 2, 3, 5183}, + {0xf946, 16, 16, 5184}, + {0x0, 10, 13, 5184}, + {0xf947, 16, 16, 5187}, + {0xf948, 16, 16, 5187}, + {0x0, 2, 16, 5187}, + {0x0, 6, 8, 5201}, + {0xf949, 16, 16, 5203}, + {0xf94a, 16, 16, 5203}, + {0x0, 0, 13, 5203}, + {0x0, 0, 15, 5216}, + {0xf94b, 16, 16, 5231}, + {0x0, 3, 4, 5231}, + {0xf94c, 16, 16, 5232}, + {0x0, 10, 11, 5232}, + {0xf94d, 16, 16, 5233}, + {0x0, 15, 16, 5233}, + {0xf94e, 16, 16, 5234}, + {0x0, 2, 16, 5234}, + {0xf94f, 16, 16, 5248}, + {0x0, 0, 5, 5248}, + {0x0, 7, 8, 5253}, + {0xf950, 16, 16, 5254}, + {0x0, 11, 14, 5254}, + {0xf951, 16, 16, 5257}, + {0xf952, 16, 16, 5257}, + {0x0, 11, 12, 5257}, + {0xf953, 16, 16, 5258}, + {0x0, 12, 15, 5258}, + {0xf954, 16, 16, 5261}, + {0x0, 9, 13, 5261}, + {0xf955, 16, 16, 5265}, + {0x0, 1, 15, 5265}, + {0x0, 12, 13, 5279}, + {0xf956, 16, 16, 5280}, + {0x0, 14, 15, 5280}, + {0xf957, 16, 16, 5281}, + {0x0, 1, 2, 5281}, + {0xf958, 16, 16, 5282}, + {0x0, 5, 9, 5282}, + {0xf959, 16, 16, 5286}, + {0x0, 0, 9, 5286}, + {0x0, 0, 11, 5295}, + {0xf95a, 16, 16, 5306}, + {0xf95b, 16, 16, 5306}, + {0x0, 8, 15, 5306}, + {0xf95d, 16, 16, 5313}, + {0xf95e, 16, 16, 5313}, + {0x0, 0, 16, 5313}, + {0x0, 7, 15, 5329}, + {0x2f86f, 16, 16, 5337}, + {0x0, 1, 15, 5337}, + {0x0, 2, 13, 5351}, + {0xf960, 16, 16, 5362}, + {0x0, 7, 12, 5362}, + {0xf9db, 16, 16, 5367}, + {0x0, 2, 15, 5367}, + {0x0, 0, 1, 5380}, + {0x2f938, 16, 16, 5381}, + {0x0, 7, 8, 5381}, + {0x2f82b, 16, 16, 5382}, + {0x0, 11, 12, 5382}, + {0xf964, 16, 16, 5383}, + {0x0, 11, 16, 5383}, + {0xf965, 16, 16, 5388}, + {0x0, 9, 10, 5388}, + {0xf966, 16, 16, 5389}, + {0x0, 13, 14, 5389}, + {0xf967, 16, 16, 5390}, + {0x0, 4, 15, 5390}, + {0x0, 12, 14, 5401}, + {0xf968, 16, 16, 5403}, + {0x0, 4, 15, 5403}, + {0x0, 8, 9, 5414}, + {0xf969, 16, 16, 5415}, + {0xf96a, 16, 16, 5415}, + {0x0, 3, 11, 5415}, + {0xf96b, 16, 16, 5423}, + {0x0, 10, 15, 5423}, + {0xf96c, 16, 16, 5428}, + {0x0, 0, 9, 5428}, + {0x0, 1, 2, 5437}, + {0xf96d, 16, 16, 5438}, + {0x0, 9, 10, 5438}, + {0xf96e, 16, 16, 5439}, + {0x0, 0, 11, 5439}, + {0xf9a1, 16, 16, 5450}, + {0x0, 10, 12, 5450}, + {0x2f8f5, 16, 16, 5452}, + {0x0, 2, 12, 5452}, + {0x0, 0, 7, 5462}, + {0xf971, 16, 16, 5469}, + {0x0, 8, 9, 5469}, + {0xf972, 16, 16, 5470}, + {0x0, 12, 15, 5470}, + {0xf973, 16, 16, 5473}, + {0x0, 0, 15, 5473}, + {0x0, 5, 7, 5488}, + {0x2f998, 16, 16, 5490}, + {0x0, 3, 15, 5490}, + {0x0, 0, 10, 5502}, + {0xf975, 16, 16, 5512}, + {0x0, 5, 6, 5512}, + {0xf976, 16, 16, 5513}, + {0x0, 14, 15, 5513}, + {0xf977, 16, 16, 5514}, + {0x0, 4, 14, 5514}, + {0xf978, 16, 16, 5524}, + {0xf979, 16, 16, 5524}, + {0x0, 1, 11, 5524}, + {0x0, 1, 15, 5534}, + {0xf97a, 16, 16, 5548}, + {0x0, 3, 9, 5548}, + {0xf97b, 16, 16, 5554}, + {0x0, 15, 16, 5554}, + {0xf97c, 16, 16, 5555}, + {0xf97d, 16, 16, 5555}, + {0x0, 12, 16, 5555}, + {0xf97e, 16, 16, 5559}, + {0x0, 5, 11, 5559}, + {0xf97f, 16, 16, 5565}, + {0x0, 0, 16, 5565}, + {0x0, 2, 9, 5581}, + {0xf980, 16, 16, 5588}, + {0x0, 3, 4, 5588}, + {0xf981, 16, 16, 5589}, + {0x0, 12, 13, 5589}, + {0xf982, 16, 16, 5590}, + {0x0, 5, 6, 5590}, + {0xf983, 16, 16, 5591}, + {0x0, 14, 15, 5591}, + {0xf984, 16, 16, 5592}, + {0x0, 10, 11, 5592}, + {0xf985, 16, 16, 5593}, + {0x0, 8, 12, 5593}, + {0x0, 13, 14, 5597}, + {0xf986, 16, 16, 5598}, + {0x0, 6, 7, 5598}, + {0x0, 10, 11, 5599}, + {0xf987, 16, 16, 5600}, + {0x0, 7, 16, 5600}, + {0xf988, 16, 16, 5609}, + {0x0, 14, 15, 5609}, + {0xf989, 16, 16, 5610}, + {0x0, 11, 12, 5610}, + {0xf98a, 16, 16, 5611}, + {0x0, 6, 7, 5611}, + {0xf98b, 16, 16, 5612}, + {0x0, 2, 8, 5612}, + {0xf98c, 16, 16, 5618}, + {0x0, 2, 3, 5618}, + {0xf98d, 16, 16, 5619}, + {0x0, 4, 5, 5619}, + {0xf98e, 16, 16, 5620}, + {0x0, 0, 1, 5620}, + {0xf98f, 16, 16, 5621}, + {0x0, 0, 1, 5621}, + {0xf990, 16, 16, 5622}, + {0x0, 10, 14, 5622}, + {0xf991, 16, 16, 5626}, + {0x0, 2, 4, 5626}, + {0xf992, 16, 16, 5628}, + {0x0, 4, 14, 5628}, + {0x0, 5, 10, 5638}, + {0xf993, 16, 16, 5643}, + {0x0, 0, 13, 5643}, + {0x0, 5, 10, 5656}, + {0xf994, 16, 16, 5661}, + {0x0, 10, 11, 5661}, + {0xf995, 16, 16, 5662}, + {0x0, 4, 5, 5662}, + {0xfa57, 16, 16, 5663}, + {0x0, 0, 16, 5663}, + {0xf997, 16, 16, 5679}, + {0x0, 6, 11, 5679}, + {0xf998, 16, 16, 5684}, + {0x0, 14, 15, 5684}, + {0xf999, 16, 16, 5685}, + {0x0, 3, 4, 5685}, + {0xf99a, 16, 16, 5686}, + {0x0, 10, 11, 5686}, + {0xf99b, 16, 16, 5687}, + {0x0, 7, 8, 5687}, + {0xf99c, 16, 16, 5688}, + {0x0, 3, 4, 5688}, + {0xf99d, 16, 16, 5689}, + {0x0, 13, 14, 5689}, + {0xf99e, 16, 16, 5690}, + {0x0, 8, 9, 5690}, + {0xf99f, 16, 16, 5691}, + {0x0, 2, 16, 5691}, + {0xf9a0, 16, 16, 5705}, + {0xf9a2, 16, 16, 5705}, + {0x0, 5, 10, 5705}, + {0xf9a3, 16, 16, 5710}, + {0x0, 11, 12, 5710}, + {0xf9a4, 16, 16, 5711}, + {0x0, 14, 15, 5711}, + {0xf9a5, 16, 16, 5712}, + {0x0, 14, 15, 5712}, + {0xf9a6, 16, 16, 5713}, + {0x0, 5, 11, 5713}, + {0xf9a7, 16, 16, 5719}, + {0x0, 4, 5, 5719}, + {0xf9a8, 16, 16, 5720}, + {0x0, 0, 16, 5720}, + {0x0, 9, 10, 5736}, + {0xf9a9, 16, 16, 5737}, + {0x0, 2, 11, 5737}, + {0xf9ab, 16, 16, 5746}, + {0xf9ac, 16, 16, 5746}, + {0x0, 2, 3, 5746}, + {0xf9ad, 16, 16, 5747}, + {0x0, 9, 10, 5747}, + {0xf9ae, 16, 16, 5748}, + {0x0, 5, 11, 5748}, + {0xf9af, 16, 16, 5754}, + {0x0, 6, 7, 5754}, + {0xf9b0, 16, 16, 5755}, + {0x0, 3, 14, 5755}, + {0x0, 4, 9, 5766}, + {0xf9b1, 16, 16, 5771}, + {0xf9b2, 16, 16, 5771}, + {0x0, 8, 9, 5771}, + {0xf9b3, 16, 16, 5772}, + {0x0, 0, 16, 5772}, + {0x0, 8, 9, 5788}, + {0xf9b4, 16, 16, 5789}, + {0xf9b5, 16, 16, 5789}, + {0x0, 14, 15, 5789}, + {0xf9b6, 16, 16, 5790}, + {0x0, 4, 5, 5790}, + {0xf9b7, 16, 16, 5791}, + {0x0, 8, 9, 5791}, + {0xf9b8, 16, 16, 5792}, + {0x0, 1, 2, 5792}, + {0xf9b9, 16, 16, 5793}, + {0xf9ba, 16, 16, 5793}, + {0x0, 0, 15, 5793}, + {0x0, 10, 11, 5808}, + {0xf9bb, 16, 16, 5809}, + {0xf9bc, 16, 16, 5809}, + {0x0, 15, 16, 5809}, + {0xf9bd, 16, 16, 5810}, + {0x0, 9, 10, 5810}, + {0xf9be, 16, 16, 5811}, + {0x0, 14, 15, 5811}, + {0xf9c0, 16, 16, 5812}, + {0x0, 2, 3, 5812}, + {0xf9c1, 16, 16, 5813}, + {0x0, 1, 13, 5813}, + {0xf9c2, 16, 16, 5825}, + {0x0, 12, 13, 5825}, + {0xf9c3, 16, 16, 5826}, + {0x0, 13, 14, 5826}, + {0xf9c4, 16, 16, 5827}, + {0x0, 8, 9, 5827}, + {0xf9c5, 16, 16, 5828}, + {0x0, 14, 15, 5828}, + {0xf9c6, 16, 16, 5829}, + {0x0, 9, 10, 5829}, + {0xf9c7, 16, 16, 5830}, + {0x0, 11, 12, 5830}, + {0xf9c8, 16, 16, 5831}, + {0x0, 3, 11, 5831}, + {0xf9c9, 16, 16, 5839}, + {0x0, 1, 2, 5839}, + {0x2f902, 16, 16, 5840}, + {0x0, 12, 13, 5840}, + {0xf9cb, 16, 16, 5841}, + {0x0, 6, 10, 5841}, + {0xf9cc, 16, 16, 5845}, + {0x0, 9, 10, 5845}, + {0xf9cd, 16, 16, 5846}, + {0x0, 11, 12, 5846}, + {0xf9ce, 16, 16, 5847}, + {0x0, 0, 1, 5847}, + {0xf9cf, 16, 16, 5848}, + {0x0, 14, 15, 5848}, + {0xf9d0, 16, 16, 5849}, + {0xf9d1, 16, 16, 5849}, + {0x0, 14, 15, 5849}, + {0xf9d2, 16, 16, 5850}, + {0xf9d3, 16, 16, 5850}, + {0x0, 11, 12, 5850}, + {0xf9d4, 16, 16, 5851}, + {0x0, 9, 10, 5851}, + {0xf9d5, 16, 16, 5852}, + {0x0, 10, 11, 5852}, + {0xf9d6, 16, 16, 5853}, + {0xf9d7, 16, 16, 5853}, + {0x0, 11, 12, 5853}, + {0xf9d8, 16, 16, 5854}, + {0x0, 4, 15, 5854}, + {0xf9d9, 16, 16, 5865}, + {0x0, 7, 16, 5865}, + {0xf9da, 16, 16, 5874}, + {0x0, 6, 7, 5874}, + {0xf9dc, 16, 16, 5875}, + {0x0, 9, 10, 5875}, + {0xf9dd, 16, 16, 5876}, + {0x0, 6, 16, 5876}, + {0xf9de, 16, 16, 5886}, + {0xf9df, 16, 16, 5886}, + {0x0, 3, 4, 5886}, + {0xf9e0, 16, 16, 5887}, + {0x0, 14, 15, 5887}, + {0xf9e1, 16, 16, 5888}, + {0x0, 8, 9, 5888}, + {0xf9e2, 16, 16, 5889}, + {0x0, 5, 6, 5889}, + {0xf9e3, 16, 16, 5890}, + {0xf9e4, 16, 16, 5890}, + {0x0, 2, 3, 5890}, + {0xf9e5, 16, 16, 5891}, + {0x0, 2, 11, 5891}, + {0xf9e6, 16, 16, 5900}, + {0xf9e7, 16, 16, 5900}, + {0x0, 1, 2, 5900}, + {0xf9e8, 16, 16, 5901}, + {0xf9e9, 16, 16, 5901}, + {0x0, 2, 4, 5901}, + {0xf9ea, 16, 16, 5903}, + {0x0, 15, 16, 5903}, + {0xf9eb, 16, 16, 5904}, + {0x0, 10, 11, 5904}, + {0xf9ec, 16, 16, 5905}, + {0x0, 13, 14, 5905}, + {0xf9ed, 16, 16, 5906}, + {0x0, 0, 1, 5906}, + {0xf9ee, 16, 16, 5907}, {0x0, 8, 9, 5907}, - {0x2f93c, 16, 16, 5908}, - {0x0, 0, 1, 5908}, - {0x0, 0, 1, 5909}, - {0x0, 3, 4, 5910}, - {0x0, 0, 3, 5911}, - {0x0, 2, 13, 5914}, - {0x21e, 16, 16, 5925}, - {0x0, 0, 1, 5925}, - {0x0, 0, 1, 5926}, - {0x0, 3, 4, 5927}, - {0x0, 0, 1, 5928}, - {0x0, 6, 9, 5929}, - {0x4d0, 16, 16, 5932}, - {0x0, 6, 7, 5932}, - {0x0, 6, 7, 5933}, - {0x2f9cc, 16, 16, 5934}, - {0x0, 10, 11, 5934}, - {0xf985, 16, 16, 5935}, - {0x4d2, 16, 16, 5935}, - {0x0, 3, 4, 5935}, - {0x2f99a, 16, 16, 5936}, - {0x1fd3, 16, 16, 5936}, - {0x0, 4, 6, 5936}, - {0x0, 0, 1, 5938}, - {0x0, 0, 1, 5939}, - {0x0, 3, 4, 5940}, - {0x0, 0, 1, 5941}, - {0x0, 15, 16, 5942}, - {0x477, 16, 16, 5943}, - {0x1e26, 16, 16, 5943}, - {0x1e22, 16, 16, 5943}, - {0x124, 16, 16, 5943}, - {0xf979, 16, 16, 5943}, + {0xf9ef, 16, 16, 5908}, + {0x0, 10, 11, 5908}, + {0xf9f0, 16, 16, 5909}, + {0x0, 3, 4, 5909}, + {0xf9f1, 16, 16, 5910}, + {0x0, 4, 16, 5910}, + {0x0, 7, 8, 5922}, + {0xf9f2, 16, 16, 5923}, + {0xf9f3, 16, 16, 5923}, + {0x0, 7, 8, 5923}, + {0xf9f4, 16, 16, 5924}, + {0x0, 11, 12, 5924}, + {0xf9f5, 16, 16, 5925}, + {0x0, 8, 14, 5925}, + {0xf9f6, 16, 16, 5931}, + {0x0, 11, 12, 5931}, + {0xf9f7, 16, 16, 5932}, + {0x0, 2, 13, 5932}, {0x0, 0, 1, 5943}, - {0x2f93a, 16, 16, 5944}, - {0xfa49, 16, 16, 5944}, - {0x0, 8, 9, 5944}, - {0xf900, 16, 16, 5945}, - {0x0, 4, 5, 5945}, - {0xf924, 16, 16, 5946}, - {0x1f23, 16, 16, 5946}, - {0x0, 5, 6, 5946}, - {0x2f925, 16, 16, 5947}, - {0x0, 4, 13, 5947}, - {0x2f818, 16, 16, 5956}, - {0x0, 10, 11, 5956}, - {0x2f979, 16, 16, 5957}, - {0x0, 0, 1, 5957}, - {0x0, 0, 1, 5958}, - {0x0, 3, 4, 5959}, - {0x0, 0, 1, 5960}, - {0x0, 2, 3, 5961}, - {0x1ec6, 16, 16, 5962}, - {0x0, 2, 3, 5962}, - {0x2f895, 16, 16, 5963}, - {0x0, 6, 7, 5963}, - {0x0, 0, 1, 5964}, - {0x0, 0, 1, 5965}, - {0x0, 3, 4, 5966}, - {0x0, 0, 1, 5967}, - {0x0, 8, 9, 5968}, - {0x407, 16, 16, 5969}, - {0xf949, 16, 16, 5969}, - {0x0, 0, 10, 5969}, - {0x1eed, 16, 16, 5979}, - {0x0, 5, 12, 5979}, - {0x2f839, 16, 16, 5986}, - {0x1eeb, 16, 16, 5986}, - {0x1ee9, 16, 16, 5986}, - {0x0, 3, 5, 5986}, - {0x1f38, 16, 16, 5988}, - {0x1eef, 16, 16, 5988}, - {0x1f39, 16, 16, 5988}, - {0x0, 0, 10, 5988}, - {0x2f962, 16, 16, 5998}, - {0xfa56, 16, 16, 5998}, - {0x0, 3, 4, 5998}, - {0x2f87c, 16, 16, 5999}, - {0x2f963, 16, 16, 5999}, - {0x0, 0, 1, 5999}, - {0x0, 0, 1, 6000}, - {0x0, 3, 4, 6001}, - {0x0, 0, 1, 6002}, - {0x0, 1, 5, 6003}, - {0x1e2, 16, 16, 6007}, - {0x1fc, 16, 16, 6007}, - {0x0, 7, 8, 6007}, - {0xf9f2, 16, 16, 6008}, - {0xf906, 16, 16, 6008}, - {0x0, 13, 14, 6008}, - {0x2f886, 16, 16, 6009}, - {0x0, 15, 16, 6009}, - {0xf927, 16, 16, 6010}, - {0x0, 12, 13, 6010}, - {0x2f92a, 16, 16, 6011}, - {0x0, 3, 5, 6011}, - {0x1f40, 16, 16, 6013}, - {0x1f41, 16, 16, 6013}, - {0x0, 0, 16, 6013}, - {0xfa, 16, 16, 6029}, - {0xf9, 16, 16, 6029}, - {0x169, 16, 16, 6029}, - {0xfb, 16, 16, 6029}, - {0x16b, 16, 16, 6029}, - {0x0, 3, 14, 6029}, - {0x1ee4, 16, 16, 6040}, - {0x16d, 16, 16, 6040}, - {0x1ee7, 16, 16, 6040}, - {0xfc, 16, 16, 6040}, - {0x0, 0, 1, 6040}, - {0x0, 3, 4, 6041}, - {0x0, 0, 1, 6042}, - {0x0, 9, 10, 6043}, - {0x0, 9, 10, 6044}, - {0x3062, 16, 16, 6045}, - {0x172, 16, 16, 6045}, - {0x0, 0, 1, 6045}, - {0x0, 0, 1, 6046}, - {0x0, 3, 4, 6047}, - {0x0, 0, 1, 6048}, - {0x0, 7, 8, 6049}, - {0x1e65, 16, 16, 6050}, - {0x0, 1, 13, 6050}, - {0x161, 16, 16, 6062}, - {0x0, 9, 13, 6062}, - {0x2f9a1, 16, 16, 6066}, - {0x0, 0, 1, 6066}, - {0x0, 0, 1, 6067}, - {0x0, 3, 4, 6068}, - {0x0, 0, 1, 6069}, - {0x0, 0, 13, 6070}, - {0x1da, 16, 16, 6083}, - {0x0, 0, 1, 6083}, - {0x0, 0, 1, 6084}, - {0x0, 3, 4, 6085}, - {0x0, 0, 4, 6086}, - {0x0, 1, 13, 6090}, - {0x13a, 16, 16, 6102}, - {0x16f, 16, 16, 6102}, - {0x1e76, 16, 16, 6102}, - {0x0, 0, 1, 6102}, - {0x0, 0, 1, 6103}, - {0x0, 3, 4, 6104}, - {0x0, 3, 4, 6105}, - {0x0, 8, 9, 6106}, - {0x219b, 16, 16, 6107}, - {0x171, 16, 16, 6107}, - {0x215, 16, 16, 6107}, - {0x0, 0, 1, 6107}, - {0x0, 3, 4, 6108}, - {0x0, 0, 1, 6109}, - {0x0, 9, 10, 6110}, - {0x0, 9, 10, 6111}, - {0x3050, 16, 16, 6112}, - {0x0, 10, 11, 6112}, - {0x0, 7, 8, 6113}, - {0x2f95e, 16, 16, 6114}, - {0x0, 2, 3, 6114}, - {0x2f9ba, 16, 16, 6115}, - {0x0, 14, 15, 6115}, - {0xfa30, 16, 16, 6116}, - {0x0, 10, 11, 6116}, - {0x2f861, 16, 16, 6117}, - {0x13e, 16, 16, 6117}, - {0x1dc, 16, 16, 6117}, - {0x1d8, 16, 16, 6117}, - {0x1d6, 16, 16, 6117}, - {0x0, 2, 3, 6117}, - {0x1fd7, 16, 16, 6118}, - {0x0, 1, 2, 6118}, - {0x0, 4, 5, 6119}, - {0x2f927, 16, 16, 6120}, - {0x15d, 16, 16, 6120}, - {0x15b, 16, 16, 6120}, - {0x1e61, 16, 16, 6120}, - {0x0, 3, 5, 6120}, - {0x1f49, 16, 16, 6122}, - {0x0, 0, 1, 6122}, - {0x0, 3, 4, 6123}, - {0x0, 0, 1, 6124}, - {0x0, 9, 10, 6125}, - {0x0, 9, 10, 6126}, - {0x30c5, 16, 16, 6127}, - {0xf93e, 16, 16, 6127}, - {0x0, 0, 14, 6127}, - {0x0, 4, 5, 6141}, - {0x2f9d9, 16, 16, 6142}, - {0x0, 13, 14, 6142}, - {0x2f8b4, 16, 16, 6143}, - {0x1f48, 16, 16, 6143}, - {0x0, 8, 9, 6143}, - {0xf9e2, 16, 16, 6144}, - {0x0, 3, 9, 6144}, - {0x1eca, 16, 16, 6150}, - {0x12e, 16, 16, 6150}, - {0x0, 0, 9, 6150}, - {0x1f7a, 16, 16, 6159}, - {0x3cd, 16, 16, 6159}, - {0x1fe1, 16, 16, 6159}, - {0x0, 1, 2, 6159}, - {0x1e35, 16, 16, 6160}, - {0x1fe0, 16, 16, 6160}, - {0x0, 0, 1, 6160}, - {0x0, 3, 4, 6161}, - {0x0, 0, 1, 6162}, + {0xf9f8, 16, 16, 5944}, + {0x0, 2, 3, 5944}, + {0xf9f9, 16, 16, 5945}, + {0x0, 0, 1, 5945}, + {0xf9fa, 16, 16, 5946}, + {0x0, 9, 10, 5946}, + {0xf9fb, 16, 16, 5947}, + {0x0, 8, 9, 5947}, + {0xf9fc, 16, 16, 5948}, + {0x0, 0, 13, 5948}, + {0xf9fd, 16, 16, 5961}, + {0x0, 6, 7, 5961}, + {0xf9fe, 16, 16, 5962}, + {0x0, 10, 12, 5962}, + {0xf9ff, 16, 16, 5964}, + {0x0, 3, 8, 5964}, + {0x2f850, 16, 16, 5969}, + {0x0, 6, 7, 5969}, + {0xfa01, 16, 16, 5970}, + {0x0, 3, 5, 5970}, + {0xfa02, 16, 16, 5972}, + {0x0, 2, 7, 5972}, + {0xfa03, 16, 16, 5977}, + {0x0, 5, 6, 5977}, + {0xfa04, 16, 16, 5978}, + {0xfa05, 16, 16, 5978}, + {0x0, 4, 5, 5978}, + {0xfa06, 16, 16, 5979}, + {0x0, 8, 12, 5979}, + {0xfa07, 16, 16, 5983}, + {0x0, 12, 13, 5983}, + {0xfa08, 16, 16, 5984}, + {0xfa09, 16, 16, 5984}, + {0x0, 11, 12, 5984}, + {0xfa0a, 16, 16, 5985}, + {0x0, 3, 4, 5985}, + {0xfa0b, 16, 16, 5986}, + {0x0, 0, 14, 5986}, + {0xfa0c, 16, 16, 6000}, + {0x0, 0, 3, 6000}, + {0xfa0d, 16, 16, 6003}, + {0xfa10, 16, 16, 6003}, + {0x0, 4, 5, 6003}, + {0xfa12, 16, 16, 6004}, + {0xfa15, 16, 16, 6004}, + {0x0, 10, 11, 6004}, + {0xfa16, 16, 16, 6005}, + {0x0, 10, 11, 6005}, + {0xfa17, 16, 16, 6006}, + {0x0, 12, 15, 6006}, + {0xfa18, 16, 16, 6009}, + {0x0, 0, 15, 6009}, + {0xfa19, 16, 16, 6024}, + {0x0, 5, 6, 6024}, + {0xfa1a, 16, 16, 6025}, + {0x0, 13, 16, 6025}, + {0x2f956, 16, 16, 6028}, + {0x0, 6, 7, 6028}, + {0xfa1c, 16, 16, 6029}, + {0x0, 14, 15, 6029}, + {0xfa1d, 16, 16, 6030}, + {0x0, 13, 14, 6030}, + {0xfa1e, 16, 16, 6031}, + {0x0, 2, 3, 6031}, + {0xfa20, 16, 16, 6032}, + {0xfa22, 16, 16, 6032}, + {0x0, 8, 9, 6032}, + {0xfa67, 16, 16, 6033}, + {0x0, 1, 14, 6033}, + {0xfa26, 16, 16, 6046}, + {0x0, 2, 16, 6046}, + {0xfa2a, 16, 16, 6060}, + {0x0, 12, 13, 6060}, + {0xfa2b, 16, 16, 6061}, + {0x0, 8, 10, 6061}, + {0xfa2c, 16, 16, 6063}, + {0x0, 4, 5, 6063}, + {0xfa2d, 16, 16, 6064}, + {0x0, 14, 15, 6064}, + {0x2f805, 16, 16, 6065}, + {0x0, 7, 8, 6065}, + {0x2f80a, 16, 16, 6066}, + {0x2f80e, 16, 16, 6066}, + {0x0, 7, 10, 6066}, + {0x2f826, 16, 16, 6069}, + {0x0, 4, 5, 6069}, + {0x2f827, 16, 16, 6070}, + {0x0, 1, 11, 6070}, + {0x2f82d, 16, 16, 6080}, + {0x0, 9, 14, 6080}, + {0xfa36, 16, 16, 6085}, + {0x0, 6, 7, 6085}, + {0x2f84c, 16, 16, 6086}, + {0x0, 8, 9, 6086}, + {0xfa38, 16, 16, 6087}, + {0x0, 0, 1, 6087}, + {0xfa39, 16, 16, 6088}, + {0x0, 8, 13, 6088}, + {0xfa3a, 16, 16, 6093}, + {0xfa3b, 16, 16, 6093}, + {0x2f878, 16, 16, 6093}, + {0x0, 4, 5, 6093}, + {0x2f8a3, 16, 16, 6094}, + {0x0, 8, 9, 6094}, + {0xfa3e, 16, 16, 6095}, + {0x0, 14, 15, 6095}, + {0x2f8ab, 16, 16, 6096}, + {0x2f8b0, 16, 16, 6096}, + {0x0, 15, 16, 6096}, + {0x2f8c8, 16, 16, 6097}, + {0x0, 2, 4, 6097}, + {0xfa42, 16, 16, 6099}, + {0x0, 1, 13, 6099}, + {0x2f8cf, 16, 16, 6111}, + {0x2f8e2, 16, 16, 6111}, + {0x0, 7, 9, 6111}, + {0x2f901, 16, 16, 6113}, + {0x0, 10, 11, 6113}, + {0xfa46, 16, 16, 6114}, + {0xfa47, 16, 16, 6114}, + {0x0, 14, 15, 6114}, + {0xfa48, 16, 16, 6115}, + {0x0, 8, 12, 6115}, + {0xfa49, 16, 16, 6119}, + {0x0, 2, 3, 6119}, + {0xfa4a, 16, 16, 6120}, + {0x0, 1, 2, 6120}, + {0xfa4b, 16, 16, 6121}, + {0xfa4c, 16, 16, 6121}, + {0x0, 8, 10, 6121}, + {0xfa4d, 16, 16, 6123}, + {0xfa4e, 16, 16, 6123}, + {0xfa4f, 16, 16, 6123}, + {0x2f953, 16, 16, 6123}, + {0xfa51, 16, 16, 6123}, + {0xfa52, 16, 16, 6123}, + {0xfa53, 16, 16, 6123}, + {0x0, 0, 16, 6123}, + {0x2f959, 16, 16, 6139}, + {0x0, 1, 2, 6139}, + {0xfa55, 16, 16, 6140}, + {0x0, 0, 10, 6140}, + {0xfa56, 16, 16, 6150}, + {0x0, 2, 10, 6150}, + {0xfa58, 16, 16, 6158}, + {0x0, 1, 6, 6158}, + {0xfa59, 16, 16, 6163}, + {0xfa5a, 16, 16, 6163}, + {0x2f97a, 16, 16, 6163}, + {0xfa5c, 16, 16, 6163}, {0x0, 9, 10, 6163}, - {0x0, 9, 11, 6164}, - {0x3074, 16, 16, 6166}, - {0x3cb, 16, 16, 6166}, - {0x0, 3, 4, 6166}, - {0xf99d, 16, 16, 6167}, - {0x0, 0, 1, 6167}, - {0x0, 0, 1, 6168}, + {0xfa5e, 16, 16, 6164}, + {0x0, 7, 8, 6164}, + {0x2f99f, 16, 16, 6165}, + {0x0, 0, 1, 6165}, + {0xfa60, 16, 16, 6166}, + {0x0, 6, 7, 6166}, + {0xfa61, 16, 16, 6167}, + {0x0, 1, 2, 6167}, + {0xfa62, 16, 16, 6168}, + {0x0, 9, 10, 6168}, + {0xfa63, 16, 16, 6169}, {0x0, 3, 4, 6169}, - {0x0, 0, 1, 6170}, - {0x0, 8, 9, 6171}, - {0x4e7, 16, 16, 6172}, - {0x1f3b, 16, 16, 6172}, - {0x0, 0, 1, 6172}, - {0x0, 0, 1, 6173}, - {0x0, 3, 4, 6174}, - {0x0, 4, 5, 6175}, - {0x0, 5, 6, 6176}, - {0x1f92, 16, 16, 6177}, - {0x0, 2, 4, 6177}, - {0xfa42, 16, 16, 6179}, - {0x0, 1, 2, 6179}, - {0x1e5f, 16, 16, 6180}, - {0x0, 0, 1, 6180}, - {0x0, 0, 1, 6181}, - {0x0, 3, 4, 6182}, - {0x0, 3, 4, 6183}, - {0x0, 8, 9, 6184}, - {0x22ed, 16, 16, 6185}, - {0x0, 2, 6, 6185}, - {0x1ff6, 16, 16, 6189}, - {0x1ff3, 16, 16, 6189}, - {0x0, 9, 11, 6189}, - {0xf92a, 16, 16, 6191}, - {0x0, 0, 1, 6191}, - {0x0, 0, 1, 6192}, - {0x0, 3, 4, 6193}, - {0x0, 0, 5, 6194}, - {0x0, 2, 6, 6199}, - {0x1fa0, 16, 16, 6203}, - {0x0, 4, 5, 6203}, - {0xf9b7, 16, 16, 6204}, - {0x1f66, 16, 16, 6204}, - {0x3073, 16, 16, 6204}, - {0x0, 2, 8, 6204}, - {0x2f823, 16, 16, 6210}, - {0x0, 12, 13, 6210}, - {0x2f862, 16, 16, 6211}, - {0x2f822, 16, 16, 6211}, - {0x0, 2, 3, 6211}, - {0xf9e5, 16, 16, 6212}, - {0x2f903, 16, 16, 6212}, - {0x0, 11, 12, 6212}, - {0x2f957, 16, 16, 6213}, - {0x0, 11, 12, 6213}, - {0xf98a, 16, 16, 6214}, - {0x0, 9, 10, 6214}, - {0x2f9bb, 16, 16, 6215}, - {0x0, 0, 1, 6215}, - {0x0, 0, 1, 6216}, - {0x0, 3, 4, 6217}, - {0x0, 0, 1, 6218}, - {0x0, 15, 16, 6219}, - {0x476, 16, 16, 6220}, - {0x0, 0, 1, 6220}, - {0x0, 0, 1, 6221}, - {0x0, 3, 4, 6222}, - {0x0, 0, 1, 6223}, - {0x0, 8, 9, 6224}, - {0x4eb, 16, 16, 6225}, - {0x0, 1, 6, 6225}, - {0xfa5b, 16, 16, 6230}, - {0xf934, 16, 16, 6230}, - {0x0, 0, 10, 6230}, - {0x0, 0, 1, 6240}, - {0x0, 0, 1, 6241}, - {0x0, 3, 4, 6242}, - {0x0, 0, 1, 6243}, - {0x0, 0, 2, 6244}, - {0x1f14, 16, 16, 6246}, - {0x1f12, 16, 16, 6246}, - {0x0, 3, 14, 6246}, - {0x1e0c, 16, 16, 6257}, - {0x1e10, 16, 16, 6257}, - {0x1ffb, 16, 16, 6257}, - {0x1feb, 16, 16, 6257}, - {0x1ff9, 16, 16, 6257}, - {0x1fdb, 16, 16, 6257}, - {0x0, 3, 4, 6257}, - {0x2f992, 16, 16, 6258}, - {0x0, 0, 1, 6258}, - {0x0, 3, 4, 6259}, - {0x0, 0, 1, 6260}, - {0x0, 9, 10, 6261}, - {0x0, 9, 10, 6262}, - {0x30b6, 16, 16, 6263}, - {0x0, 0, 1, 6263}, - {0x0, 0, 1, 6264}, - {0x0, 3, 4, 6265}, - {0x0, 0, 4, 6266}, - {0x0, 3, 14, 6270}, - {0x1e36, 16, 16, 6281}, - {0x13b, 16, 16, 6281}, - {0x1e12, 16, 16, 6281}, - {0x0, 1, 2, 6281}, - {0x0, 14, 15, 6282}, - {0x2f906, 16, 16, 6283}, - {0x0, 0, 1, 6283}, - {0x0, 0, 1, 6284}, - {0x0, 3, 4, 6285}, - {0x0, 0, 1, 6286}, - {0x0, 8, 9, 6287}, - {0x4ed, 16, 16, 6288}, - {0x2f8dc, 16, 16, 6288}, - {0x0, 6, 7, 6288}, - {0x0, 3, 4, 6289}, - {0x2f91d, 16, 16, 6290}, - {0x1e3c, 16, 16, 6290}, - {0x1fbb, 16, 16, 6290}, - {0x1fee, 16, 16, 6290}, - {0x0, 14, 15, 6290}, - {0x2fa08, 16, 16, 6291}, - {0x1fc9, 16, 16, 6291}, - {0x0, 0, 1, 6291}, - {0x0, 0, 1, 6292}, - {0x0, 13, 14, 6293}, - {0x0, 3, 4, 6294}, - {0x0, 14, 15, 6295}, - {0xd4b, 16, 16, 6296}, - {0x0, 6, 7, 6296}, - {0x2fa1b, 16, 16, 6297}, - {0x0, 7, 8, 6297}, - {0x2f896, 16, 16, 6298}, - {0xf97a, 16, 16, 6298}, - {0x0, 1, 13, 6298}, - {0x17d, 16, 16, 6310}, - {0x0, 4, 5, 6310}, - {0xfa57, 16, 16, 6311}, - {0x0, 8, 9, 6311}, - {0xf972, 16, 16, 6312}, - {0x0, 0, 1, 6312}, - {0x0, 0, 1, 6313}, - {0x0, 3, 4, 6314}, - {0x0, 3, 4, 6315}, - {0x0, 8, 9, 6316}, - {0x226f, 16, 16, 6317}, - {0x0, 0, 1, 6317}, - {0x0, 0, 1, 6318}, - {0x0, 3, 4, 6319}, - {0x0, 0, 1, 6320}, - {0x0, 0, 13, 6321}, - {0x1d5, 16, 16, 6334}, - {0x0, 6, 7, 6334}, - {0x0, 7, 8, 6335}, - {0x2f9c5, 16, 16, 6336}, - {0x0, 0, 1, 6336}, - {0x0, 0, 1, 6337}, - {0x0, 3, 4, 6338}, - {0x0, 4, 5, 6339}, - {0x0, 5, 6, 6340}, - {0x1fb7, 16, 16, 6341}, - {0x1db, 16, 16, 6341}, - {0x1d7, 16, 16, 6341}, - {0x0, 3, 14, 6341}, - {0x1e71, 16, 16, 6352}, - {0x0, 0, 1, 6352}, - {0x2f924, 16, 16, 6353}, - {0x0, 0, 1, 6353}, - {0x0, 0, 1, 6354}, - {0x0, 3, 4, 6355}, - {0x0, 3, 4, 6356}, + {0xfa64, 16, 16, 6170}, + {0x0, 8, 9, 6170}, + {0xfa65, 16, 16, 6171}, + {0xfa66, 16, 16, 6171}, + {0xfa68, 16, 16, 6171}, + {0x0, 15, 16, 6171}, + {0xfa69, 16, 16, 6172}, + {0x0, 11, 12, 6172}, + {0xfa6a, 16, 16, 6173}, + {0x2f800, 16, 16, 6173}, + {0x2f801, 16, 16, 6173}, + {0x0, 1, 2, 6173}, + {0x2f802, 16, 16, 6174}, + {0x0, 0, 11, 6174}, + {0x0, 1, 12, 6185}, + {0x0, 2, 3, 6196}, + {0x0, 2, 3, 6197}, + {0x2f803, 16, 16, 6198}, + {0x0, 0, 1, 6198}, + {0x2f804, 16, 16, 6199}, + {0x2f806, 16, 16, 6199}, + {0x0, 2, 3, 6199}, + {0x2f807, 16, 16, 6200}, + {0x0, 10, 11, 6200}, + {0x2f808, 16, 16, 6201}, + {0x0, 9, 10, 6201}, + {0x2f809, 16, 16, 6202}, + {0x0, 15, 16, 6202}, + {0x2f80b, 16, 16, 6203}, + {0x0, 9, 14, 6203}, + {0x0, 14, 15, 6208}, + {0x2f80c, 16, 16, 6209}, + {0x0, 3, 4, 6209}, + {0x0, 10, 11, 6210}, + {0x2f80d, 16, 16, 6211}, + {0x0, 4, 5, 6211}, + {0x2f80f, 16, 16, 6212}, + {0x2f810, 16, 16, 6212}, + {0x0, 7, 8, 6212}, + {0x2f811, 16, 16, 6213}, + {0x0, 1, 5, 6213}, + {0x0, 12, 13, 6217}, + {0x2f812, 16, 16, 6218}, + {0x0, 9, 12, 6218}, + {0x2f813, 16, 16, 6221}, + {0x2f814, 16, 16, 6221}, + {0x0, 13, 14, 6221}, + {0x2f815, 16, 16, 6222}, + {0x0, 11, 12, 6222}, + {0x2f816, 16, 16, 6223}, + {0x0, 2, 8, 6223}, + {0x2f817, 16, 16, 6229}, + {0x0, 4, 13, 6229}, + {0x2f818, 16, 16, 6238}, + {0x2f819, 16, 16, 6238}, + {0x2f81a, 16, 16, 6238}, + {0x2f81b, 16, 16, 6238}, + {0x0, 1, 12, 6238}, + {0x0, 4, 14, 6249}, + {0x0, 15, 16, 6259}, + {0x2f81c, 16, 16, 6260}, + {0x0, 5, 6, 6260}, + {0x2f81d, 16, 16, 6261}, + {0x2f81e, 16, 16, 6261}, + {0x0, 15, 16, 6261}, + {0x2f81f, 16, 16, 6262}, + {0x2f820, 16, 16, 6262}, + {0x0, 6, 7, 6262}, + {0x2f821, 16, 16, 6263}, + {0x0, 2, 8, 6263}, + {0x2f822, 16, 16, 6269}, + {0x2f823, 16, 16, 6269}, + {0x0, 1, 2, 6269}, + {0x0, 5, 6, 6270}, + {0x2f824, 16, 16, 6271}, + {0x2f825, 16, 16, 6271}, + {0x2f828, 16, 16, 6271}, + {0x0, 5, 7, 6271}, + {0x2f829, 16, 16, 6273}, + {0x2f82a, 16, 16, 6273}, + {0x0, 9, 10, 6273}, + {0x2f82c, 16, 16, 6274}, + {0x2f82e, 16, 16, 6274}, + {0x2f82f, 16, 16, 6274}, + {0x2f830, 16, 16, 6274}, + {0x2f833, 16, 16, 6274}, + {0x0, 2, 3, 6274}, + {0x0, 12, 13, 6275}, + {0x2f834, 16, 16, 6276}, + {0x0, 0, 14, 6276}, + {0x2f835, 16, 16, 6290}, + {0x2f836, 16, 16, 6290}, + {0x0, 15, 16, 6290}, + {0x2f837, 16, 16, 6291}, + {0x0, 6, 7, 6291}, + {0x0, 3, 4, 6292}, + {0x2f838, 16, 16, 6293}, + {0x2f839, 16, 16, 6293}, + {0x0, 1, 2, 6293}, + {0x2f83a, 16, 16, 6294}, + {0x2f83b, 16, 16, 6294}, + {0x0, 14, 15, 6294}, + {0x2f83c, 16, 16, 6295}, + {0x0, 8, 9, 6295}, + {0x2f83d, 16, 16, 6296}, + {0x2f83e, 16, 16, 6296}, + {0x0, 8, 9, 6296}, + {0x2f83f, 16, 16, 6297}, + {0x0, 2, 3, 6297}, + {0x2f840, 16, 16, 6298}, + {0x0, 6, 7, 6298}, + {0x2f841, 16, 16, 6299}, + {0x0, 0, 1, 6299}, + {0x2f842, 16, 16, 6300}, + {0x0, 3, 4, 6300}, + {0x2f843, 16, 16, 6301}, + {0x0, 3, 4, 6301}, + {0x2f844, 16, 16, 6302}, + {0x2f846, 16, 16, 6302}, + {0x2f847, 16, 16, 6302}, + {0x0, 11, 12, 6302}, + {0x2f848, 16, 16, 6303}, + {0x0, 3, 4, 6303}, + {0x2f849, 16, 16, 6304}, + {0x2f84a, 16, 16, 6304}, + {0x0, 1, 16, 6304}, + {0x0, 6, 8, 6319}, + {0x2f84b, 16, 16, 6321}, + {0x2f84d, 16, 16, 6321}, + {0x0, 1, 2, 6321}, + {0x2f84e, 16, 16, 6322}, + {0x0, 4, 5, 6322}, + {0x2f84f, 16, 16, 6323}, + {0x0, 14, 15, 6323}, + {0x2f851, 16, 16, 6324}, + {0x0, 14, 15, 6324}, + {0x2f852, 16, 16, 6325}, + {0x0, 4, 5, 6325}, + {0x2f853, 16, 16, 6326}, + {0x0, 13, 14, 6326}, + {0x2f854, 16, 16, 6327}, + {0x0, 11, 12, 6327}, + {0x2f855, 16, 16, 6328}, + {0x0, 1, 3, 6328}, + {0x2f856, 16, 16, 6330}, + {0x2f857, 16, 16, 6330}, + {0x2f858, 16, 16, 6330}, + {0x0, 4, 14, 6330}, + {0x0, 14, 15, 6340}, + {0x0, 4, 5, 6341}, + {0x2f859, 16, 16, 6342}, + {0x0, 2, 8, 6342}, + {0x2f85a, 16, 16, 6348}, + {0x2f85b, 16, 16, 6348}, + {0x0, 6, 7, 6348}, + {0x2f85c, 16, 16, 6349}, + {0x0, 10, 11, 6349}, + {0x2f85d, 16, 16, 6350}, + {0x0, 2, 3, 6350}, + {0x2f85e, 16, 16, 6351}, + {0x0, 2, 3, 6351}, + {0x2f85f, 16, 16, 6352}, + {0x0, 10, 15, 6352}, {0x0, 8, 9, 6357}, - {0x2247, 16, 16, 6358}, - {0x0, 5, 6, 6358}, - {0x0, 6, 7, 6359}, - {0x2fa16, 16, 16, 6360}, - {0x0, 0, 1, 6360}, - {0x0, 0, 1, 6361}, - {0x0, 3, 4, 6362}, - {0x0, 4, 5, 6363}, - {0x0, 5, 6, 6364}, - {0x1f8a, 16, 16, 6365}, - {0x0, 14, 15, 6365}, - {0x2fa0d, 16, 16, 6366}, - {0x0, 1, 2, 6366}, - {0x2f8a0, 16, 16, 6367}, - {0x2f8e4, 16, 16, 6367}, - {0x0, 9, 10, 6367}, - {0x2f8cd, 16, 16, 6368}, - {0x0, 5, 10, 6368}, - {0x2f8d7, 16, 16, 6373}, - {0x1e90, 16, 16, 6373}, - {0x179, 16, 16, 6373}, - {0x2f981, 16, 16, 6373}, - {0x17b, 16, 16, 6373}, - {0x21b, 16, 16, 6373}, - {0x163, 16, 16, 6373}, - {0xfa4c, 16, 16, 6373}, - {0x1e6d, 16, 16, 6373}, - {0x37e, 16, 16, 6373}, - {0x1d9, 16, 16, 6373}, - {0x0, 0, 1, 6373}, - {0x0, 3, 4, 6374}, - {0x0, 0, 1, 6375}, - {0x0, 9, 10, 6376}, - {0x0, 9, 11, 6377}, - {0x30d7, 16, 16, 6379}, - {0x0, 0, 1, 6379}, - {0x0, 3, 4, 6380}, - {0x0, 0, 1, 6381}, - {0x0, 9, 10, 6382}, - {0x0, 9, 10, 6383}, - {0x3060, 16, 16, 6384}, - {0x0, 2, 6, 6384}, - {0x1f91, 16, 16, 6388}, - {0x1e16, 16, 16, 6388}, - {0x1f27, 16, 16, 6388}, - {0x0, 7, 8, 6388}, - {0x2f89e, 16, 16, 6389}, - {0x0, 9, 10, 6389}, - {0x2f8c3, 16, 16, 6390}, - {0x0, 1, 2, 6390}, - {0x2f83a, 16, 16, 6391}, - {0x0, 12, 13, 6391}, - {0x2f880, 16, 16, 6392}, - {0x2f989, 16, 16, 6392}, - {0xd1, 16, 16, 6392}, - {0x1f8, 16, 16, 6392}, - {0x143, 16, 16, 6392}, - {0x1e44, 16, 16, 6392}, - {0x0, 11, 12, 6392}, - {0x2f98e, 16, 16, 6393}, - {0x0, 11, 12, 6393}, - {0x2f933, 16, 16, 6394}, - {0x0, 10, 11, 6394}, - {0xf99b, 16, 16, 6395}, - {0x0, 0, 1, 6395}, - {0x1e75, 16, 16, 6396}, - {0x0, 0, 1, 6396}, - {0x0, 0, 1, 6397}, - {0x0, 3, 4, 6398}, - {0x0, 4, 5, 6399}, - {0x0, 5, 6, 6400}, - {0x1f8d, 16, 16, 6401}, - {0x30d6, 16, 16, 6401}, - {0x1f2b, 16, 16, 6401}, - {0x0, 2, 3, 6401}, - {0xf9ad, 16, 16, 6402}, - {0xf95d, 16, 16, 6402}, - {0x0, 0, 1, 6402}, - {0x0, 0, 1, 6403}, - {0x0, 3, 4, 6404}, - {0x0, 0, 3, 6405}, - {0x0, 3, 4, 6408}, - {0x1e7c, 16, 16, 6409}, - {0x0, 3, 4, 6409}, - {0x0, 14, 15, 6410}, - {0x2f977, 16, 16, 6411}, - {0x0, 0, 1, 6411}, - {0x0, 3, 4, 6412}, - {0x0, 0, 1, 6413}, - {0x0, 9, 10, 6414}, - {0x0, 9, 10, 6415}, - {0x305e, 16, 16, 6416}, - {0x0, 0, 1, 6416}, - {0x2f842, 16, 16, 6417}, - {0x0, 3, 4, 6417}, - {0x2f90a, 16, 16, 6418}, - {0x0, 0, 9, 6418}, - {0x38e, 16, 16, 6427}, - {0x0, 0, 1, 6427}, - {0xf9ee, 16, 16, 6428}, - {0x0, 15, 16, 6428}, - {0x2f80b, 16, 16, 6429}, - {0x0, 10, 11, 6429}, - {0xf919, 16, 16, 6430}, - {0xf912, 16, 16, 6430}, - {0x0, 13, 14, 6430}, - {0x0, 10, 11, 6431}, - {0x2f898, 16, 16, 6432}, - {0x211, 16, 16, 6432}, - {0x159, 16, 16, 6432}, - {0x0, 12, 13, 6432}, - {0xfa2b, 16, 16, 6433}, - {0x0, 10, 11, 6433}, - {0xf9bb, 16, 16, 6434}, - {0x0, 0, 1, 6434}, - {0x0, 0, 1, 6435}, - {0x0, 3, 4, 6436}, - {0x0, 4, 5, 6437}, - {0x0, 5, 6, 6438}, - {0x1f83, 16, 16, 6439}, - {0x1ff8, 16, 16, 6439}, - {0x0, 11, 12, 6439}, - {0x2f9d4, 16, 16, 6440}, - {0x0, 1, 12, 6440}, - {0x216, 16, 16, 6451}, - {0x0, 0, 1, 6451}, - {0x0, 0, 1, 6452}, - {0x0, 3, 4, 6453}, - {0x0, 0, 1, 6454}, - {0x0, 4, 5, 6455}, - {0x1e0, 16, 16, 6456}, - {0x0, 0, 16, 6456}, - {0x0, 6, 7, 6472}, - {0xfa37, 16, 16, 6473}, - {0x0, 0, 1, 6473}, - {0x0, 0, 1, 6474}, - {0x0, 3, 4, 6475}, - {0x0, 3, 4, 6476}, - {0x0, 8, 9, 6477}, - {0x22e3, 16, 16, 6478}, - {0x0, 0, 2, 6478}, - {0x1f6a, 16, 16, 6480}, - {0x1f6c, 16, 16, 6480}, - {0x137, 16, 16, 6480}, - {0x0, 3, 5, 6480}, - {0x1f51, 16, 16, 6482}, - {0x1f50, 16, 16, 6482}, - {0x0, 1, 2, 6482}, - {0x0, 5, 6, 6483}, - {0x2f9ec, 16, 16, 6484}, - {0x0, 14, 15, 6484}, - {0x2f8c2, 16, 16, 6485}, - {0x0, 13, 14, 6485}, - {0x2f99d, 16, 16, 6486}, - {0x1af, 16, 16, 6486}, - {0x0, 9, 10, 6486}, - {0xf9c7, 16, 16, 6487}, - {0x1e59, 16, 16, 6487}, - {0x4d3, 16, 16, 6487}, - {0x0, 0, 1, 6487}, - {0x0, 0, 1, 6488}, - {0x0, 3, 4, 6489}, - {0x0, 0, 1, 6490}, + {0x2f860, 16, 16, 6358}, + {0x0, 10, 11, 6358}, + {0x2f861, 16, 16, 6359}, + {0x0, 12, 13, 6359}, + {0x2f862, 16, 16, 6360}, + {0x0, 1, 12, 6360}, + {0x0, 11, 12, 6371}, + {0x2f863, 16, 16, 6372}, + {0x0, 7, 8, 6372}, + {0x2f864, 16, 16, 6373}, + {0x0, 8, 9, 6373}, + {0x2f865, 16, 16, 6374}, + {0x0, 6, 7, 6374}, + {0x2f866, 16, 16, 6375}, + {0x0, 14, 16, 6375}, + {0x0, 14, 15, 6377}, + {0x2f867, 16, 16, 6378}, + {0x0, 12, 13, 6378}, + {0x2f868, 16, 16, 6379}, + {0x0, 8, 9, 6379}, + {0x2f869, 16, 16, 6380}, + {0x0, 14, 15, 6380}, + {0x2f86b, 16, 16, 6381}, + {0x0, 12, 13, 6381}, + {0x0, 8, 9, 6382}, + {0x2f86c, 16, 16, 6383}, + {0x0, 3, 4, 6383}, + {0x2f86d, 16, 16, 6384}, + {0x0, 8, 9, 6384}, + {0x2f86e, 16, 16, 6385}, + {0x0, 3, 16, 6385}, + {0x2f870, 16, 16, 6398}, + {0x0, 1, 2, 6398}, + {0x0, 8, 9, 6399}, + {0x2f871, 16, 16, 6400}, + {0x2f872, 16, 16, 6400}, + {0x0, 6, 7, 6400}, + {0x2f873, 16, 16, 6401}, + {0x0, 3, 4, 6401}, + {0x2f874, 16, 16, 6402}, + {0x0, 2, 3, 6402}, + {0x2f875, 16, 16, 6403}, + {0x0, 8, 9, 6403}, + {0x0, 1, 2, 6404}, + {0x2f876, 16, 16, 6405}, + {0x2f877, 16, 16, 6405}, + {0x0, 0, 1, 6405}, + {0x2f879, 16, 16, 6406}, + {0x0, 13, 14, 6406}, + {0x2f87a, 16, 16, 6407}, + {0x0, 0, 15, 6407}, + {0x0, 4, 7, 6422}, + {0x2f87b, 16, 16, 6425}, + {0x0, 3, 4, 6425}, + {0x2f87c, 16, 16, 6426}, + {0x2f87d, 16, 16, 6426}, + {0x0, 11, 15, 6426}, + {0x2f87e, 16, 16, 6430}, + {0x2f87f, 16, 16, 6430}, + {0x0, 12, 13, 6430}, + {0x2f880, 16, 16, 6431}, + {0x0, 1, 3, 6431}, + {0x2f881, 16, 16, 6433}, + {0x2f882, 16, 16, 6433}, + {0x0, 2, 15, 6433}, + {0x0, 15, 16, 6446}, + {0x2f883, 16, 16, 6447}, + {0x0, 13, 14, 6447}, + {0x2f884, 16, 16, 6448}, + {0x0, 8, 9, 6448}, + {0x2f885, 16, 16, 6449}, + {0x0, 13, 14, 6449}, + {0x2f886, 16, 16, 6450}, + {0x0, 9, 10, 6450}, + {0x2f887, 16, 16, 6451}, + {0x0, 2, 3, 6451}, + {0x2f888, 16, 16, 6452}, + {0x0, 1, 12, 6452}, + {0x0, 8, 10, 6463}, + {0x0, 3, 4, 6465}, + {0x2f889, 16, 16, 6466}, + {0x0, 12, 13, 6466}, + {0x2f88a, 16, 16, 6467}, + {0x0, 0, 7, 6467}, + {0x2f88b, 16, 16, 6474}, + {0x2f88c, 16, 16, 6474}, + {0x2f88d, 16, 16, 6474}, + {0x0, 0, 7, 6474}, + {0x0, 9, 10, 6481}, + {0x0, 2, 3, 6482}, + {0x2f88f, 16, 16, 6483}, + {0x0, 14, 15, 6483}, + {0x2f890, 16, 16, 6484}, + {0x0, 3, 4, 6484}, + {0x0, 1, 2, 6485}, + {0x2f892, 16, 16, 6486}, + {0x0, 1, 5, 6486}, + {0x2f98b, 16, 16, 6490}, + {0x0, 2, 3, 6490}, + {0x2f895, 16, 16, 6491}, {0x0, 7, 8, 6491}, - {0x1e1f, 16, 16, 6492}, - {0x0, 7, 8, 6492}, - {0x2f9bf, 16, 16, 6493}, - {0x0, 2, 5, 6493}, - {0xf73, 16, 16, 6496}, - {0xf75, 16, 16, 6496}, - {0x0, 8, 9, 6496}, - {0x2f83f, 16, 16, 6497}, - {0x0, 3, 5, 6497}, - {0x1f30, 16, 16, 6499}, - {0x1f31, 16, 16, 6499}, - {0x0, 15, 16, 6499}, - {0xf913, 16, 16, 6500}, - {0x0, 0, 11, 6500}, - {0x1e87, 16, 16, 6511}, - {0x0, 0, 2, 6511}, - {0x1fcd, 16, 16, 6513}, - {0x1fce, 16, 16, 6513}, - {0x175, 16, 16, 6513}, - {0x1e83, 16, 16, 6513}, - {0x1e81, 16, 16, 6513}, - {0x0, 12, 13, 6513}, - {0x2f8b8, 16, 16, 6514}, - {0x0, 5, 6, 6514}, - {0x1ffc, 16, 16, 6515}, - {0xfa45, 16, 16, 6515}, - {0x1e85, 16, 16, 6515}, - {0x0, 3, 9, 6515}, - {0x1ecc, 16, 16, 6521}, - {0x0, 0, 1, 6521}, - {0x0, 0, 1, 6522}, - {0x0, 11, 12, 6523}, - {0x0, 11, 12, 6524}, - {0x0, 14, 15, 6525}, - {0xbcb, 16, 16, 6526}, - {0x1ea, 16, 16, 6526}, - {0x0, 0, 1, 6526}, - {0x0, 0, 1, 6527}, - {0x0, 3, 4, 6528}, - {0x0, 3, 4, 6529}, - {0x0, 8, 9, 6530}, - {0x22ac, 16, 16, 6531}, - {0x0, 1, 2, 6531}, - {0x0, 10, 11, 6532}, - {0x2f9f7, 16, 16, 6533}, - {0x0, 12, 13, 6533}, - {0xf956, 16, 16, 6534}, - {0x0, 0, 1, 6534}, - {0x0, 0, 1, 6535}, - {0x0, 3, 4, 6536}, - {0x0, 0, 1, 6537}, - {0x0, 8, 9, 6538}, - {0x4f8, 16, 16, 6539}, - {0x0, 12, 16, 6539}, - {0xf9e9, 16, 16, 6543}, - {0xf97e, 16, 16, 6543}, - {0x0, 14, 15, 6543}, - {0x2f8af, 16, 16, 6544}, - {0x21f, 16, 16, 6544}, - {0x1e98, 16, 16, 6544}, - {0x0, 1, 2, 6544}, - {0x1e3a, 16, 16, 6545}, - {0x0, 7, 8, 6545}, - {0x9cc, 16, 16, 6546}, - {0x0, 3, 15, 6546}, - {0x1e2a, 16, 16, 6558}, - {0x0, 5, 16, 6558}, - {0x2fa1a, 16, 16, 6569}, - {0x2f81a, 16, 16, 6569}, - {0x0, 7, 12, 6569}, - {0x2f929, 16, 16, 6574}, - {0x0, 2, 16, 6574}, - {0xf94f, 16, 16, 6588}, - {0x0, 14, 15, 6588}, - {0xf920, 16, 16, 6589}, - {0x0, 10, 11, 6589}, - {0x0, 14, 15, 6590}, - {0x2f9cb, 16, 16, 6591}, - {0xf9a0, 16, 16, 6591}, - {0x1e28, 16, 16, 6591}, - {0x0, 1, 2, 6591}, - {0x2f8da, 16, 16, 6592}, - {0x1e24, 16, 16, 6592}, - {0x2fa19, 16, 16, 6592}, - {0xf9db, 16, 16, 6592}, - {0x0, 0, 1, 6592}, - {0x0, 0, 1, 6593}, - {0x0, 3, 4, 6594}, - {0x0, 0, 3, 6595}, - {0x0, 7, 8, 6598}, - {0x122, 16, 16, 6599}, - {0x0, 0, 2, 6599}, - {0x1f2a, 16, 16, 6601}, - {0x1f2c, 16, 16, 6601}, - {0x0, 0, 1, 6601}, - {0x0, 0, 1, 6602}, - {0x0, 3, 4, 6603}, - {0x0, 4, 5, 6604}, - {0x0, 5, 6, 6605}, - {0x1f93, 16, 16, 6606}, - {0x0, 14, 15, 6606}, - {0xbca, 16, 16, 6607}, - {0x0, 6, 7, 6607}, - {0x2f912, 16, 16, 6608}, - {0x0, 5, 6, 6608}, - {0x2f9f6, 16, 16, 6609}, - {0x0, 3, 4, 6609}, - {0x2f8dd, 16, 16, 6610}, - {0xf96a, 16, 16, 6610}, - {0x0, 14, 15, 6610}, - {0x2f90f, 16, 16, 6611}, - {0x0, 9, 10, 6611}, - {0x374, 16, 16, 6612}, - {0x0, 6, 11, 6612}, - {0xf998, 16, 16, 6617}, - {0x0, 4, 5, 6617}, - {0xfa3d, 16, 16, 6618}, - {0x0, 2, 6, 6618}, - {0x1f26, 16, 16, 6622}, - {0x0, 7, 15, 6622}, - {0x2f8c4, 16, 16, 6630}, - {0x0, 0, 1, 6630}, - {0x2f922, 16, 16, 6631}, - {0x0, 1, 2, 6631}, - {0xf96d, 16, 16, 6632}, - {0x0, 1, 2, 6632}, - {0x1e6f, 16, 16, 6633}, - {0x0, 0, 1, 6633}, - {0x0, 0, 1, 6634}, - {0x0, 3, 4, 6635}, - {0x0, 4, 5, 6636}, - {0x0, 5, 6, 6637}, - {0x1fa4, 16, 16, 6638}, - {0x0, 0, 1, 6638}, - {0x0, 0, 1, 6639}, - {0x0, 3, 4, 6640}, - {0x0, 0, 4, 6641}, - {0x0, 1, 13, 6645}, - {0x17e, 16, 16, 6657}, - {0x1f90, 16, 16, 6657}, - {0x0, 0, 2, 6657}, - {0x1f5b, 16, 16, 6659}, - {0x1f5d, 16, 16, 6659}, - {0x0, 5, 6, 6659}, - {0xfa04, 16, 16, 6660}, - {0x1f6e, 16, 16, 6660}, - {0x0, 0, 1, 6660}, - {0x0, 0, 1, 6661}, - {0x0, 3, 4, 6662}, - {0x0, 0, 3, 6663}, - {0x0, 1, 13, 6666}, - {0x11f, 16, 16, 6678}, - {0x121, 16, 16, 6678}, - {0x1e21, 16, 16, 6678}, - {0x11d, 16, 16, 6678}, - {0x1f5, 16, 16, 6678}, - {0x0, 3, 4, 6678}, - {0x2f8bc, 16, 16, 6679}, - {0x17c, 16, 16, 6679}, - {0x17a, 16, 16, 6679}, - {0x1e91, 16, 16, 6679}, - {0x0, 1, 2, 6679}, - {0x2f8b5, 16, 16, 6680}, - {0xf9d7, 16, 16, 6680}, - {0x2f8c6, 16, 16, 6680}, - {0x1e7, 16, 16, 6680}, - {0x0, 4, 5, 6680}, - {0xf943, 16, 16, 6681}, - {0x0, 0, 1, 6681}, - {0x0, 0, 1, 6682}, - {0x0, 3, 4, 6683}, - {0x0, 0, 1, 6684}, - {0x0, 0, 10, 6685}, - {0x1ed7, 16, 16, 6695}, - {0x0, 0, 1, 6695}, - {0x0, 0, 1, 6696}, - {0x0, 3, 4, 6697}, - {0x0, 4, 5, 6698}, - {0x0, 5, 6, 6699}, - {0x1f8f, 16, 16, 6700}, - {0x1ed1, 16, 16, 6700}, - {0x1ed3, 16, 16, 6700}, - {0x0, 2, 14, 6700}, - {0xf95e, 16, 16, 6712}, - {0x2f801, 16, 16, 6712}, - {0x1ed5, 16, 16, 6712}, - {0xf905, 16, 16, 6712}, - {0x0, 0, 2, 6712}, - {0x1f6d, 16, 16, 6714}, - {0x1f6b, 16, 16, 6714}, - {0x0, 10, 11, 6714}, - {0x2f808, 16, 16, 6715}, - {0x0, 15, 16, 6715}, - {0x0, 0, 1, 6716}, - {0x0, 0, 1, 6717}, - {0x0, 12, 13, 6718}, - {0x0, 13, 14, 6719}, - {0x0, 5, 6, 6720}, - {0xcc0, 16, 16, 6721}, - {0x0, 0, 16, 6721}, - {0x214, 16, 16, 6737}, - {0x0, 11, 12, 6737}, - {0xf953, 16, 16, 6738}, - {0x1d3, 16, 16, 6738}, - {0x170, 16, 16, 6738}, - {0x16e, 16, 16, 6738}, - {0x0, 3, 14, 6738}, - {0x1e77, 16, 16, 6749}, - {0x0, 3, 14, 6749}, - {0x13c, 16, 16, 6760}, - {0x1e37, 16, 16, 6760}, - {0x0, 0, 1, 6760}, - {0x0, 0, 1, 6761}, - {0x0, 3, 4, 6762}, - {0x0, 1, 2, 6763}, - {0x0, 4, 5, 6764}, - {0x1fec, 16, 16, 6765}, - {0x0, 14, 15, 6765}, - {0x0, 4, 5, 6766}, - {0x2f859, 16, 16, 6767}, - {0x2f800, 16, 16, 6767}, - {0x1e3d, 16, 16, 6767}, - {0x0, 0, 1, 6767}, - {0x0, 3, 4, 6768}, - {0x0, 0, 1, 6769}, - {0x0, 9, 10, 6770}, - {0x0, 9, 10, 6771}, - {0x304e, 16, 16, 6772}, - {0x0, 11, 15, 6772}, - {0x2f87e, 16, 16, 6776}, - {0x2f8cb, 16, 16, 6776}, - {0x1e84, 16, 16, 6776}, - {0x0, 0, 1, 6776}, - {0x0, 0, 1, 6777}, - {0x0, 3, 4, 6778}, - {0x0, 0, 1, 6779}, - {0x0, 1, 2, 6780}, - {0x403, 16, 16, 6781}, - {0x173, 16, 16, 6781}, - {0x1ee6, 16, 16, 6781}, - {0xdc, 16, 16, 6781}, - {0x1ee5, 16, 16, 6781}, - {0x16c, 16, 16, 6781}, - {0x16a, 16, 16, 6781}, - {0x168, 16, 16, 6781}, - {0xdb, 16, 16, 6781}, - {0x0, 8, 11, 6781}, - {0x0, 0, 1, 6784}, - {0x0, 0, 1, 6785}, - {0x0, 6, 7, 6786}, - {0x0, 5, 6, 6787}, - {0x0, 4, 5, 6788}, - {0x626, 16, 16, 6789}, - {0x1e73, 16, 16, 6789}, - {0x0, 5, 7, 6789}, - {0xcc7, 16, 16, 6791}, - {0x0, 0, 1, 6791}, - {0x0, 0, 1, 6792}, - {0x0, 3, 4, 6793}, - {0x0, 0, 3, 6794}, - {0x0, 0, 11, 6797}, - {0x233, 16, 16, 6808}, - {0x1e8f, 16, 16, 6808}, - {0xcc8, 16, 16, 6808}, - {0xfd, 16, 16, 6808}, - {0x1ef3, 16, 16, 6808}, - {0x1ef9, 16, 16, 6808}, - {0x177, 16, 16, 6808}, - {0x0, 12, 13, 6808}, - {0x2f812, 16, 16, 6809}, - {0x1ef7, 16, 16, 6809}, - {0xff, 16, 16, 6809}, - {0x1e80, 16, 16, 6809}, - {0x0, 14, 15, 6809}, - {0x2f83c, 16, 16, 6810}, - {0x0, 2, 3, 6810}, + {0x2f896, 16, 16, 6492}, + {0x0, 0, 16, 6492}, + {0x0, 11, 12, 6508}, + {0x0, 8, 9, 6509}, + {0x2f897, 16, 16, 6510}, + {0x0, 1, 16, 6510}, + {0x0, 13, 14, 6525}, + {0x0, 10, 11, 6526}, + {0x2f898, 16, 16, 6527}, + {0x0, 2, 12, 6527}, + {0x2f899, 16, 16, 6537}, + {0x2f89a, 16, 16, 6537}, + {0x0, 3, 4, 6537}, + {0x2f89b, 16, 16, 6538}, + {0x0, 10, 11, 6538}, + {0x2f89c, 16, 16, 6539}, + {0x0, 13, 14, 6539}, + {0x2f89d, 16, 16, 6540}, + {0x0, 7, 8, 6540}, + {0x2f89e, 16, 16, 6541}, + {0x2f89f, 16, 16, 6541}, + {0x0, 1, 2, 6541}, + {0x2f8a0, 16, 16, 6542}, + {0x0, 1, 4, 6542}, + {0x0, 10, 11, 6545}, + {0x2f8a1, 16, 16, 6546}, + {0x0, 12, 13, 6546}, + {0x2f8a2, 16, 16, 6547}, + {0x0, 13, 14, 6547}, + {0x0, 4, 5, 6548}, + {0x2f8a4, 16, 16, 6549}, + {0x0, 7, 8, 6549}, + {0x2f8a5, 16, 16, 6550}, + {0x2f8a6, 16, 16, 6550}, + {0x2f8a9, 16, 16, 6550}, + {0x2f8a8, 16, 16, 6550}, + {0x0, 10, 11, 6550}, + {0x2f8aa, 16, 16, 6551}, + {0x0, 2, 3, 6551}, + {0x2f8ac, 16, 16, 6552}, + {0x0, 4, 16, 6552}, + {0x2f8ad, 16, 16, 6564}, + {0x2f8ae, 16, 16, 6564}, + {0x0, 14, 15, 6564}, + {0x2f8af, 16, 16, 6565}, + {0x0, 0, 12, 6565}, + {0x2f8b2, 16, 16, 6577}, + {0x2f8b3, 16, 16, 6577}, + {0x0, 13, 14, 6577}, + {0x2f8b4, 16, 16, 6578}, + {0x0, 1, 2, 6578}, + {0x2f8b5, 16, 16, 6579}, + {0x2f8b6, 16, 16, 6579}, + {0x0, 0, 1, 6579}, + {0x2f8b7, 16, 16, 6580}, + {0x0, 0, 16, 6580}, + {0x0, 12, 13, 6596}, + {0x2f8b8, 16, 16, 6597}, + {0x0, 13, 14, 6597}, + {0x2f8b9, 16, 16, 6598}, + {0x2f8ba, 16, 16, 6598}, + {0x0, 8, 9, 6598}, + {0x2f8bb, 16, 16, 6599}, + {0x0, 3, 4, 6599}, + {0x2f8bc, 16, 16, 6600}, + {0x0, 4, 5, 6600}, + {0x2f8bd, 16, 16, 6601}, + {0x0, 1, 2, 6601}, + {0x2f8be, 16, 16, 6602}, + {0x0, 2, 3, 6602}, + {0x2f8bf, 16, 16, 6603}, + {0x0, 5, 6, 6603}, + {0x2f8c0, 16, 16, 6604}, + {0x2f8c1, 16, 16, 6604}, + {0x0, 2, 15, 6604}, + {0x0, 14, 15, 6617}, + {0x2f8c2, 16, 16, 6618}, + {0x0, 9, 10, 6618}, + {0x2f8c3, 16, 16, 6619}, + {0x0, 7, 15, 6619}, + {0x2f8c4, 16, 16, 6627}, + {0x2f8c5, 16, 16, 6627}, + {0x2f8c6, 16, 16, 6627}, + {0x0, 12, 13, 6627}, + {0x2f8c7, 16, 16, 6628}, + {0x0, 12, 13, 6628}, + {0x2f8c9, 16, 16, 6629}, + {0x0, 0, 1, 6629}, + {0x0, 10, 11, 6630}, + {0x2f8ca, 16, 16, 6631}, + {0x2f8cb, 16, 16, 6631}, + {0x2f8cc, 16, 16, 6631}, + {0x0, 9, 10, 6631}, + {0x2f8cd, 16, 16, 6632}, + {0x0, 0, 10, 6632}, + {0x0, 9, 10, 6642}, + {0x2f8ce, 16, 16, 6643}, + {0x0, 8, 9, 6643}, + {0x2f8d0, 16, 16, 6644}, + {0x0, 4, 5, 6644}, + {0x2f8d1, 16, 16, 6645}, + {0x2f8d2, 16, 16, 6645}, + {0x2f8d3, 16, 16, 6645}, + {0x0, 0, 1, 6645}, + {0x2f8d4, 16, 16, 6646}, + {0x2f8d5, 16, 16, 6646}, + {0x0, 13, 14, 6646}, + {0x2f8d6, 16, 16, 6647}, + {0x0, 0, 14, 6647}, + {0x0, 5, 10, 6661}, + {0x2f8d7, 16, 16, 6666}, + {0x2f8d9, 16, 16, 6666}, + {0x0, 1, 2, 6666}, + {0x2f8da, 16, 16, 6667}, + {0x0, 3, 15, 6667}, + {0x2f8db, 16, 16, 6679}, + {0x2f8dc, 16, 16, 6679}, + {0x0, 5, 13, 6679}, + {0x0, 3, 4, 6687}, + {0x2f8dd, 16, 16, 6688}, + {0x0, 9, 10, 6688}, + {0x2f8de, 16, 16, 6689}, + {0x2f8df, 16, 16, 6689}, + {0x0, 5, 6, 6689}, + {0x2f8e0, 16, 16, 6690}, + {0x0, 2, 3, 6690}, + {0x2f8e1, 16, 16, 6691}, + {0x0, 6, 7, 6691}, + {0x0, 13, 14, 6692}, + {0x2f8e3, 16, 16, 6693}, + {0x2f8e4, 16, 16, 6693}, + {0x2f8e5, 16, 16, 6693}, + {0x0, 1, 15, 6693}, + {0x0, 4, 5, 6707}, + {0x2f8e6, 16, 16, 6708}, + {0x0, 13, 14, 6708}, + {0x2f8e7, 16, 16, 6709}, + {0x0, 2, 3, 6709}, + {0x2f8e8, 16, 16, 6710}, + {0x0, 3, 4, 6710}, + {0x2f8e9, 16, 16, 6711}, + {0x0, 10, 11, 6711}, + {0x2f8ea, 16, 16, 6712}, + {0x0, 8, 9, 6712}, + {0x2f8eb, 16, 16, 6713}, + {0x0, 10, 11, 6713}, + {0x0, 3, 4, 6714}, + {0x2f8ec, 16, 16, 6715}, + {0x2f8ed, 16, 16, 6715}, + {0x0, 1, 5, 6715}, + {0x0, 8, 9, 6719}, + {0x2f8ee, 16, 16, 6720}, + {0x0, 1, 2, 6720}, + {0x2f8ef, 16, 16, 6721}, + {0x0, 10, 11, 6721}, + {0x0, 7, 8, 6722}, + {0x2f8f0, 16, 16, 6723}, + {0x0, 4, 5, 6723}, + {0x2f8f1, 16, 16, 6724}, + {0x0, 14, 15, 6724}, + {0x2f8f2, 16, 16, 6725}, + {0x2f8f3, 16, 16, 6725}, + {0x0, 15, 16, 6725}, + {0x2f8f4, 16, 16, 6726}, + {0x2f8f6, 16, 16, 6726}, + {0x0, 8, 16, 6726}, + {0x0, 13, 14, 6734}, + {0x2f8f7, 16, 16, 6735}, + {0x0, 11, 12, 6735}, + {0x2f8f8, 16, 16, 6736}, + {0x0, 10, 11, 6736}, + {0x2f8f9, 16, 16, 6737}, + {0x0, 14, 15, 6737}, + {0x2f8fa, 16, 16, 6738}, + {0x0, 11, 12, 6738}, + {0x0, 12, 13, 6739}, + {0x2f8fb, 16, 16, 6740}, + {0x0, 15, 16, 6740}, + {0x2f8fc, 16, 16, 6741}, + {0x2f8fd, 16, 16, 6741}, + {0x0, 7, 8, 6741}, + {0x2f8fe, 16, 16, 6742}, + {0x2f8ff, 16, 16, 6742}, + {0x0, 4, 15, 6742}, + {0x2f900, 16, 16, 6753}, + {0x2f903, 16, 16, 6753}, + {0x2f904, 16, 16, 6753}, + {0x0, 5, 6, 6753}, + {0x2f905, 16, 16, 6754}, + {0x0, 1, 2, 6754}, + {0x0, 14, 15, 6755}, + {0x2f906, 16, 16, 6756}, + {0x2f907, 16, 16, 6756}, + {0x0, 15, 16, 6756}, + {0x2f908, 16, 16, 6757}, + {0x0, 14, 15, 6757}, + {0x2f909, 16, 16, 6758}, + {0x0, 3, 10, 6758}, + {0x0, 3, 4, 6765}, + {0x2f90a, 16, 16, 6766}, + {0x0, 7, 12, 6766}, + {0x2f90b, 16, 16, 6771}, + {0x2f90c, 16, 16, 6771}, + {0x0, 13, 14, 6771}, + {0x0, 1, 2, 6772}, + {0x2f90d, 16, 16, 6773}, + {0x0, 9, 10, 6773}, + {0x2f90e, 16, 16, 6774}, + {0x0, 14, 15, 6774}, + {0x2f90f, 16, 16, 6775}, + {0x0, 5, 9, 6775}, + {0x0, 14, 15, 6779}, + {0x2f910, 16, 16, 6780}, + {0x0, 14, 15, 6780}, + {0x2f911, 16, 16, 6781}, + {0x0, 6, 7, 6781}, + {0x2f912, 16, 16, 6782}, + {0x0, 9, 10, 6782}, + {0x2f913, 16, 16, 6783}, + {0x0, 11, 15, 6783}, + {0x2f914, 16, 16, 6787}, + {0x2f915, 16, 16, 6787}, + {0x0, 6, 7, 6787}, + {0x2f916, 16, 16, 6788}, + {0x0, 10, 11, 6788}, + {0x2f917, 16, 16, 6789}, + {0x2f918, 16, 16, 6789}, + {0x2f919, 16, 16, 6789}, + {0x0, 13, 14, 6789}, + {0x2f91a, 16, 16, 6790}, + {0x0, 5, 6, 6790}, + {0x2f91b, 16, 16, 6791}, + {0x2f91c, 16, 16, 6791}, + {0x0, 2, 16, 6791}, + {0x0, 6, 7, 6805}, + {0x0, 3, 4, 6806}, + {0x2f91d, 16, 16, 6807}, + {0x0, 12, 13, 6807}, + {0x2f91e, 16, 16, 6808}, + {0x0, 10, 11, 6808}, + {0x0, 11, 12, 6809}, + {0x2f91f, 16, 16, 6810}, + {0x2f920, 16, 16, 6810}, + {0x0, 5, 6, 6810}, + {0x2f921, 16, 16, 6811}, {0x0, 0, 1, 6811}, + {0x2f922, 16, 16, 6812}, {0x0, 0, 1, 6812}, - {0x0, 11, 12, 6813}, - {0x0, 13, 14, 6814}, - {0x0, 7, 8, 6815}, - {0xb94, 16, 16, 6816}, - {0x0, 10, 11, 6816}, - {0x0, 11, 12, 6817}, - {0x2f961, 16, 16, 6818}, + {0x0, 8, 9, 6813}, + {0x2f923, 16, 16, 6814}, + {0x0, 0, 1, 6814}, + {0x2f924, 16, 16, 6815}, + {0x0, 5, 6, 6815}, + {0x2f925, 16, 16, 6816}, + {0x0, 3, 4, 6816}, + {0x0, 5, 6, 6817}, + {0x2f926, 16, 16, 6818}, {0x0, 1, 2, 6818}, - {0x213, 16, 16, 6819}, - {0x0, 1, 12, 6819}, - {0x1a0, 16, 16, 6830}, - {0x0, 0, 9, 6830}, - {0x3ca, 16, 16, 6839}, - {0x0, 11, 12, 6839}, - {0xf9f5, 16, 16, 6840}, - {0x3af, 16, 16, 6840}, - {0x1f76, 16, 16, 6840}, - {0x1fd1, 16, 16, 6840}, - {0x1fd0, 16, 16, 6840}, - {0x1e99, 16, 16, 6840}, - {0x0, 1, 2, 6840}, - {0xf9ca, 16, 16, 6841}, - {0x0, 1, 2, 6841}, - {0x2f802, 16, 16, 6842}, - {0x0, 0, 1, 6842}, - {0x0, 0, 1, 6843}, - {0x0, 6, 7, 6844}, - {0x0, 5, 6, 6845}, - {0x0, 4, 5, 6846}, - {0x624, 16, 16, 6847}, - {0x20e, 16, 16, 6847}, - {0x0, 0, 1, 6847}, - {0x0, 0, 1, 6848}, - {0x0, 3, 4, 6849}, - {0x0, 4, 5, 6850}, - {0x0, 5, 6, 6851}, - {0x1fae, 16, 16, 6852}, - {0x0, 4, 5, 6852}, - {0x2f8bd, 16, 16, 6853}, - {0x0, 9, 10, 6853}, - {0x2f949, 16, 16, 6854}, - {0x0, 4, 5, 6854}, - {0xf9a8, 16, 16, 6855}, - {0x0, 3, 9, 6855}, - {0x1e01, 16, 16, 6861}, - {0x1ea1, 16, 16, 6861}, - {0x1ef8, 16, 16, 6861}, - {0x0, 0, 16, 6861}, - {0x101, 16, 16, 6877}, - {0x105, 16, 16, 6877}, - {0x1f32, 16, 16, 6877}, - {0x0, 0, 1, 6877}, - {0x0, 3, 4, 6878}, - {0x0, 0, 1, 6879}, - {0x0, 9, 10, 6880}, - {0x0, 9, 10, 6881}, - {0x3069, 16, 16, 6882}, - {0x0, 1, 13, 6882}, - {0x139, 16, 16, 6894}, - {0x0, 12, 13, 6894}, - {0x2f9db, 16, 16, 6895}, - {0x0, 9, 10, 6895}, - {0xf96e, 16, 16, 6896}, - {0x0, 3, 4, 6896}, - {0x0, 0, 1, 6897}, - {0x2fa09, 16, 16, 6898}, - {0x0, 13, 14, 6898}, - {0xf99e, 16, 16, 6899}, - {0x0, 2, 3, 6899}, - {0x2f85e, 16, 16, 6900}, - {0x0, 13, 14, 6900}, - {0xf91f, 16, 16, 6901}, - {0x0, 13, 14, 6901}, - {0x2f91a, 16, 16, 6902}, - {0x13d, 16, 16, 6902}, - {0x0, 0, 1, 6902}, - {0x0, 3, 4, 6903}, - {0x0, 0, 1, 6904}, - {0x0, 9, 10, 6905}, - {0x0, 9, 10, 6906}, - {0x30f8, 16, 16, 6907}, - {0x0, 5, 6, 6907}, - {0x2f81d, 16, 16, 6908}, - {0x2f945, 16, 16, 6908}, - {0x0, 0, 1, 6908}, - {0x0, 3, 4, 6909}, - {0x0, 0, 1, 6910}, - {0x0, 9, 10, 6911}, - {0x0, 9, 10, 6912}, - {0x30fa, 16, 16, 6913}, - {0x0, 7, 12, 6913}, - {0xf929, 16, 16, 6918}, - {0x0, 14, 15, 6918}, - {0xf917, 16, 16, 6919}, - {0x0, 8, 12, 6919}, - {0xfa07, 16, 16, 6923}, - {0x0, 2, 6, 6923}, - {0x1f0e, 16, 16, 6927}, - {0x0, 0, 1, 6927}, - {0x0, 0, 1, 6928}, - {0x0, 3, 4, 6929}, - {0x0, 0, 1, 6930}, - {0x0, 1, 2, 6931}, - {0x45c, 16, 16, 6932}, - {0x1f88, 16, 16, 6932}, - {0x0, 0, 1, 6932}, - {0x0, 0, 1, 6933}, - {0x0, 3, 4, 6934}, - {0x0, 0, 1, 6935}, - {0x0, 0, 2, 6936}, - {0x1f4d, 16, 16, 6938}, - {0x1f4b, 16, 16, 6938}, - {0x0, 0, 1, 6938}, - {0x0, 0, 1, 6939}, - {0x0, 3, 4, 6940}, - {0x0, 3, 4, 6941}, - {0x0, 8, 9, 6942}, - {0x22eb, 16, 16, 6943}, - {0x0, 0, 1, 6943}, - {0x0, 0, 1, 6944}, - {0x0, 3, 4, 6945}, - {0x0, 3, 4, 6946}, - {0x0, 8, 9, 6947}, - {0x226e, 16, 16, 6948}, - {0x0, 0, 1, 6948}, - {0xf9cf, 16, 16, 6949}, - {0x0, 15, 16, 6949}, - {0x2f8f4, 16, 16, 6950}, - {0x0, 3, 5, 6950}, - {0x1f11, 16, 16, 6952}, - {0x1f10, 16, 16, 6952}, - {0x0, 0, 1, 6952}, - {0x0, 0, 1, 6953}, - {0x0, 3, 4, 6954}, - {0x0, 1, 2, 6955}, - {0x0, 3, 5, 6956}, - {0x1fe4, 16, 16, 6958}, - {0x2f9df, 16, 16, 6958}, - {0x1fe5, 16, 16, 6958}, - {0x0, 0, 1, 6958}, - {0x0, 3, 4, 6959}, - {0x0, 0, 1, 6960}, - {0x0, 9, 10, 6961}, - {0x0, 9, 10, 6962}, - {0x3067, 16, 16, 6963}, - {0x1f4c, 16, 16, 6963}, - {0x0, 6, 7, 6963}, - {0x0, 10, 11, 6964}, - {0xf987, 16, 16, 6965}, - {0x2f87f, 16, 16, 6965}, - {0x2f8d9, 16, 16, 6965}, + {0x0, 4, 5, 6819}, + {0x2f927, 16, 16, 6820}, + {0x2f928, 16, 16, 6820}, + {0x2f929, 16, 16, 6820}, + {0x0, 10, 12, 6820}, + {0x0, 12, 13, 6822}, + {0x2f92a, 16, 16, 6823}, + {0x0, 5, 6, 6823}, + {0x2f92b, 16, 16, 6824}, + {0x0, 8, 9, 6824}, + {0x2f92d, 16, 16, 6825}, + {0x0, 7, 8, 6825}, + {0x2f92e, 16, 16, 6826}, + {0x0, 12, 13, 6826}, + {0x2f92f, 16, 16, 6827}, + {0x0, 1, 2, 6827}, + {0x2f930, 16, 16, 6828}, + {0x2f931, 16, 16, 6828}, + {0x0, 10, 11, 6828}, + {0x2f932, 16, 16, 6829}, + {0x0, 1, 16, 6829}, + {0x0, 11, 12, 6844}, + {0x2f933, 16, 16, 6845}, + {0x0, 4, 5, 6845}, + {0x2f934, 16, 16, 6846}, + {0x0, 3, 10, 6846}, + {0x0, 6, 7, 6853}, + {0x2f935, 16, 16, 6854}, + {0x0, 14, 15, 6854}, + {0x2f936, 16, 16, 6855}, + {0x0, 2, 3, 6855}, + {0x2f937, 16, 16, 6856}, + {0x0, 15, 16, 6856}, + {0x2f939, 16, 16, 6857}, + {0x0, 0, 1, 6857}, + {0x2f93a, 16, 16, 6858}, + {0x0, 10, 12, 6858}, + {0x0, 1, 2, 6860}, + {0x2f93b, 16, 16, 6861}, + {0x0, 8, 9, 6861}, + {0x2f93c, 16, 16, 6862}, + {0x0, 0, 16, 6862}, + {0x0, 4, 16, 6878}, + {0x0, 4, 5, 6890}, + {0x2f93d, 16, 16, 6891}, + {0x0, 12, 13, 6891}, + {0x2f93e, 16, 16, 6892}, + {0x0, 0, 15, 6892}, + {0x0, 8, 9, 6907}, + {0x2f93f, 16, 16, 6908}, + {0x0, 4, 5, 6908}, + {0x2f940, 16, 16, 6909}, + {0x0, 2, 4, 6909}, + {0x2f941, 16, 16, 6911}, + {0x2f942, 16, 16, 6911}, + {0x0, 1, 4, 6911}, + {0x0, 9, 10, 6914}, + {0x2f943, 16, 16, 6915}, + {0x0, 3, 4, 6915}, + {0x2f944, 16, 16, 6916}, + {0x0, 14, 16, 6916}, + {0x2f945, 16, 16, 6918}, + {0x2f947, 16, 16, 6918}, + {0x0, 10, 11, 6918}, + {0x2f948, 16, 16, 6919}, + {0x0, 9, 10, 6919}, + {0x2f949, 16, 16, 6920}, + {0x0, 11, 12, 6920}, + {0x2f94a, 16, 16, 6921}, + {0x0, 6, 7, 6921}, + {0x2f94b, 16, 16, 6922}, + {0x0, 6, 7, 6922}, + {0x2f94c, 16, 16, 6923}, + {0x0, 1, 2, 6923}, + {0x0, 13, 14, 6924}, + {0x2f94d, 16, 16, 6925}, + {0x0, 14, 15, 6925}, + {0x2f94e, 16, 16, 6926}, + {0x2f950, 16, 16, 6926}, + {0x0, 3, 4, 6926}, + {0x2f951, 16, 16, 6927}, + {0x0, 2, 13, 6927}, + {0x0, 6, 7, 6938}, + {0x2f952, 16, 16, 6939}, + {0x0, 10, 11, 6939}, + {0x2f954, 16, 16, 6940}, + {0x0, 5, 6, 6940}, + {0x2f955, 16, 16, 6941}, + {0x0, 11, 12, 6941}, + {0x2f957, 16, 16, 6942}, + {0x0, 2, 3, 6942}, + {0x0, 15, 16, 6943}, + {0x2f958, 16, 16, 6944}, + {0x2f95a, 16, 16, 6944}, + {0x2f95b, 16, 16, 6944}, + {0x0, 7, 8, 6944}, + {0x0, 12, 13, 6945}, + {0x2f95c, 16, 16, 6946}, + {0x0, 10, 11, 6946}, + {0x0, 7, 8, 6947}, + {0x2f95e, 16, 16, 6948}, + {0x0, 14, 15, 6948}, + {0x2f95f, 16, 16, 6949}, + {0x0, 0, 11, 6949}, + {0x0, 2, 3, 6960}, + {0x2f960, 16, 16, 6961}, + {0x0, 10, 11, 6961}, + {0x0, 11, 12, 6962}, + {0x2f961, 16, 16, 6963}, + {0x2f962, 16, 16, 6963}, + {0x2f963, 16, 16, 6963}, + {0x0, 7, 8, 6963}, + {0x2f964, 16, 16, 6964}, + {0x0, 8, 9, 6964}, {0x0, 0, 1, 6965}, - {0xf990, 16, 16, 6966}, + {0x2f965, 16, 16, 6966}, + {0x2f966, 16, 16, 6966}, {0x0, 0, 1, 6966}, - {0x2f879, 16, 16, 6967}, - {0x1f73, 16, 16, 6967}, - {0x0, 7, 8, 6967}, - {0x2f9f0, 16, 16, 6968}, - {0x1f77, 16, 16, 6968}, - {0x1f71, 0, 1, 6968}, - {0x0, 3, 4, 6969}, - {0x0, 1, 2, 6970}, - {0x2f892, 16, 16, 6971}, + {0x2f967, 16, 16, 6967}, + {0x2f968, 16, 16, 6967}, + {0x2f969, 16, 16, 6967}, + {0x0, 0, 1, 6967}, + {0x2f96a, 16, 16, 6968}, + {0x0, 8, 9, 6968}, + {0x0, 6, 7, 6969}, + {0x2f96b, 16, 16, 6970}, + {0x0, 3, 4, 6970}, + {0x2f96c, 16, 16, 6971}, {0x0, 1, 2, 6971}, - {0x1e95, 16, 16, 6972}, - {0x0, 0, 1, 6972}, - {0x0, 0, 1, 6973}, - {0x0, 3, 4, 6974}, - {0x0, 4, 5, 6975}, - {0x0, 5, 6, 6976}, - {0x1fa5, 16, 16, 6977}, - {0x0, 0, 1, 6977}, - {0x0, 3, 4, 6978}, - {0x0, 4, 5, 6979}, - {0x0, 5, 6, 6980}, - {0x1fb4, 16, 16, 6981}, - {0xf925, 16, 16, 6981}, - {0xda, 16, 16, 6981}, - {0x0, 6, 10, 6981}, - {0xf9cc, 16, 16, 6985}, - {0xf9e4, 16, 16, 6985}, - {0x0, 3, 14, 6985}, - {0x145, 16, 16, 6996}, - {0x1e46, 16, 16, 6996}, - {0x0, 3, 4, 6996}, - {0x0, 5, 6, 6997}, - {0x2f926, 16, 16, 6998}, - {0x0, 2, 3, 6998}, - {0x1fc1, 16, 16, 6999}, - {0x0, 11, 12, 6999}, - {0x2f9ff, 16, 16, 7000}, - {0x0, 5, 6, 7000}, - {0x2f955, 16, 16, 7001}, - {0x0, 0, 1, 7001}, - {0x0, 0, 1, 7002}, - {0x0, 3, 4, 7003}, - {0x0, 0, 1, 7004}, - {0x0, 7, 8, 7005}, - {0x1e66, 16, 16, 7006}, - {0x0, 0, 1, 7006}, - {0x0, 0, 1, 7007}, + {0x2f96d, 16, 16, 6972}, + {0x0, 7, 8, 6972}, + {0x2f96e, 16, 16, 6973}, + {0x2f96f, 16, 16, 6973}, + {0x2f970, 16, 16, 6973}, + {0x0, 4, 5, 6973}, + {0x2f971, 16, 16, 6974}, + {0x0, 2, 14, 6974}, + {0x0, 8, 9, 6986}, + {0x2f972, 16, 16, 6987}, + {0x0, 7, 8, 6987}, + {0x2f973, 16, 16, 6988}, + {0x0, 9, 10, 6988}, + {0x2f974, 16, 16, 6989}, + {0x0, 9, 10, 6989}, + {0x2f975, 16, 16, 6990}, + {0x2f976, 16, 16, 6990}, + {0x0, 3, 4, 6990}, + {0x0, 14, 15, 6991}, + {0x2f977, 16, 16, 6992}, + {0x2f978, 16, 16, 6992}, + {0x0, 10, 11, 6992}, + {0x2f979, 16, 16, 6993}, + {0x0, 13, 14, 6993}, + {0x0, 10, 11, 6994}, + {0x2f97b, 16, 16, 6995}, + {0x0, 2, 11, 6995}, + {0x0, 3, 4, 7004}, + {0x2f97c, 16, 16, 7005}, + {0x2f97d, 16, 16, 7005}, + {0x0, 8, 9, 7005}, + {0x2f97e, 16, 16, 7006}, + {0x2f97f, 16, 16, 7006}, + {0x0, 15, 16, 7006}, + {0x2f980, 16, 16, 7007}, + {0x2f981, 16, 16, 7007}, + {0x0, 2, 3, 7007}, + {0x2f982, 16, 16, 7008}, {0x0, 3, 4, 7008}, - {0x0, 0, 1, 7009}, - {0x0, 8, 9, 7010}, - {0x4e6, 16, 16, 7011}, - {0x0, 1, 2, 7011}, - {0x1e3b, 16, 16, 7012}, - {0x0, 7, 8, 7012}, - {0x2f99e, 16, 16, 7013}, - {0x1e4a, 16, 16, 7013}, - {0xd9, 16, 16, 7013}, - {0x0, 3, 4, 7013}, - {0x1e7e, 16, 16, 7014}, - {0x0, 0, 1, 7014}, - {0x0, 0, 1, 7015}, - {0x0, 3, 4, 7016}, - {0x0, 0, 1, 7017}, - {0x0, 1, 9, 7018}, - {0x22d, 16, 16, 7026}, - {0x0, 0, 1, 7026}, - {0x0, 3, 4, 7027}, - {0x0, 0, 1, 7028}, - {0x0, 9, 10, 7029}, - {0x0, 9, 10, 7030}, - {0x30be, 16, 16, 7031}, - {0x1e4d, 16, 16, 7031}, - {0x1e4f, 16, 16, 7031}, - {0x0, 0, 1, 7031}, - {0x0, 0, 1, 7032}, - {0x0, 3, 4, 7033}, - {0x0, 3, 4, 7034}, - {0x0, 8, 9, 7035}, - {0x220c, 16, 16, 7036}, - {0x0, 4, 5, 7036}, - {0x2f84f, 16, 16, 7037}, - {0x0, 3, 12, 7037}, - {0xf931, 16, 16, 7046}, - {0x0, 3, 4, 7046}, - {0x2f849, 16, 16, 7047}, - {0x0, 0, 1, 7047}, - {0x0, 0, 1, 7048}, + {0x2f983, 16, 16, 7009}, + {0x0, 0, 7, 7009}, + {0x0, 11, 12, 7016}, + {0x2f984, 16, 16, 7017}, + {0x0, 14, 15, 7017}, + {0x2f985, 16, 16, 7018}, + {0x0, 5, 6, 7018}, + {0x2f986, 16, 16, 7019}, + {0x0, 10, 12, 7019}, + {0x0, 7, 8, 7021}, + {0x2f987, 16, 16, 7022}, + {0x0, 5, 6, 7022}, + {0x2f988, 16, 16, 7023}, + {0x0, 3, 13, 7023}, + {0x2f989, 16, 16, 7033}, + {0x2f98a, 16, 16, 7033}, + {0x2f98c, 16, 16, 7033}, + {0x0, 14, 15, 7033}, + {0x2f98d, 16, 16, 7034}, + {0x0, 11, 12, 7034}, + {0x2f98e, 16, 16, 7035}, + {0x0, 1, 14, 7035}, + {0x2f98f, 16, 16, 7048}, + {0x0, 11, 12, 7048}, + {0x2f990, 16, 16, 7049}, + {0x2f991, 16, 16, 7049}, {0x0, 3, 4, 7049}, - {0x0, 0, 1, 7050}, - {0x0, 0, 2, 7051}, - {0x1f1b, 16, 16, 7053}, - {0x1f1d, 16, 16, 7053}, - {0x0, 0, 1, 7053}, - {0x0, 0, 1, 7054}, - {0x0, 3, 4, 7055}, - {0x0, 0, 1, 7056}, - {0x0, 4, 5, 7057}, - {0x22b, 16, 16, 7058}, - {0x0, 8, 9, 7058}, - {0xfa38, 16, 16, 7059}, - {0x0, 7, 8, 7059}, - {0xc7, 16, 16, 7060}, - {0x0, 14, 15, 7060}, - {0x2f936, 16, 16, 7061}, - {0x0, 1, 9, 7061}, - {0xf948, 16, 16, 7069}, - {0x2f9d5, 16, 16, 7069}, - {0x0, 12, 13, 7069}, - {0x2f9a3, 16, 16, 7070}, - {0xf903, 16, 16, 7070}, - {0x2f8ed, 16, 16, 7070}, - {0x0, 8, 9, 7070}, - {0xf9b8, 16, 16, 7071}, - {0x0, 11, 12, 7071}, - {0x2f9da, 16, 16, 7072}, - {0x0, 0, 11, 7072}, - {0x2f9cf, 16, 16, 7083}, - {0x0, 0, 1, 7083}, - {0x0, 0, 1, 7084}, - {0x0, 3, 4, 7085}, - {0x0, 3, 4, 7086}, - {0x0, 8, 9, 7087}, - {0x2249, 16, 16, 7088}, - {0x0, 6, 8, 7088}, - {0x2f84b, 16, 16, 7090}, - {0x2f84d, 16, 16, 7090}, - {0x0, 6, 7, 7090}, - {0x2f821, 16, 16, 7091}, - {0x1ece, 16, 16, 7091}, - {0xd6, 16, 16, 7091}, - {0x22e, 16, 16, 7091}, - {0x14e, 16, 16, 7091}, - {0x14c, 16, 16, 7091}, - {0x0, 13, 14, 7091}, - {0x0, 10, 11, 7092}, - {0x2f97b, 16, 16, 7093}, - {0xd4, 16, 16, 7093}, - {0xd3, 16, 16, 7093}, - {0xd2, 16, 16, 7093}, - {0x1eb3, 16, 16, 7093}, - {0xfa40, 16, 16, 7093}, - {0x1eb5, 16, 16, 7093}, - {0x0, 13, 14, 7093}, - {0x2f854, 16, 16, 7094}, - {0x1eb1, 16, 16, 7094}, - {0x0, 14, 15, 7094}, - {0x2f890, 16, 16, 7095}, - {0x0, 8, 9, 7095}, - {0xfa67, 16, 16, 7096}, - {0x0, 10, 16, 7096}, - {0xdda, 16, 16, 7102}, - {0x0, 8, 9, 7102}, - {0xf9b4, 16, 16, 7103}, - {0xddc, 16, 16, 7103}, - {0xf9a1, 16, 16, 7103}, - {0x0, 0, 1, 7103}, - {0x0, 0, 1, 7104}, - {0x0, 3, 4, 7105}, - {0x0, 4, 5, 7106}, - {0x0, 5, 6, 7107}, - {0x1f8b, 16, 16, 7108}, - {0x0, 3, 4, 7108}, - {0x2f9f5, 16, 16, 7109}, - {0x0, 14, 15, 7109}, - {0x2f9b9, 16, 16, 7110}, - {0x20c, 16, 16, 7110}, - {0x0, 0, 1, 7110}, - {0x0, 0, 1, 7111}, - {0x0, 3, 4, 7112}, - {0x0, 3, 4, 7113}, - {0x0, 8, 9, 7114}, - {0x2284, 16, 16, 7115}, - {0x1d1, 16, 16, 7115}, - {0x150, 16, 16, 7115}, - {0x0, 7, 8, 7115}, - {0xfa5f, 16, 16, 7116}, - {0x0, 1, 13, 7116}, - {0x1e6, 16, 16, 7128}, - {0x0, 6, 7, 7128}, - {0x2f9fd, 16, 16, 7129}, - {0x0, 0, 1, 7129}, - {0x0, 5, 6, 7130}, - {0x2fa12, 16, 16, 7131}, - {0x0, 8, 10, 7131}, - {0x2fa04, 16, 16, 7133}, - {0xfa2c, 16, 16, 7133}, - {0x0, 15, 16, 7133}, - {0xf940, 16, 16, 7134}, - {0x0, 1, 2, 7134}, - {0xfa4b, 16, 16, 7135}, - {0x30d1, 16, 16, 7135}, - {0x0, 2, 11, 7135}, - {0x2f9f4, 16, 16, 7144}, - {0x0, 15, 16, 7144}, - {0xf94e, 16, 16, 7145}, - {0x0, 0, 1, 7145}, - {0x2f8d4, 16, 16, 7146}, - {0x1f00, 16, 16, 7146}, - {0x1f4, 16, 16, 7146}, - {0x11c, 16, 16, 7146}, - {0x1e20, 16, 16, 7146}, - {0x11e, 16, 16, 7146}, - {0x120, 16, 16, 7146}, - {0x0, 3, 4, 7146}, - {0x2f9f3, 16, 16, 7147}, - {0x0, 9, 10, 7147}, - {0xf9fb, 16, 16, 7148}, - {0x1fef, 16, 16, 7148}, - {0xf9ab, 16, 16, 7148}, - {0x0, 3, 4, 7148}, - {0xf94c, 16, 16, 7149}, - {0x0, 0, 1, 7149}, - {0x0, 0, 1, 7150}, - {0x0, 3, 4, 7151}, - {0x0, 4, 5, 7152}, - {0x0, 5, 6, 7153}, - {0x1f96, 16, 16, 7154}, - {0x0, 0, 1, 7154}, - {0x2f96a, 16, 16, 7155}, - {0x1f72, 16, 16, 7155}, - {0x0, 7, 12, 7155}, - {0x2f90c, 16, 16, 7160}, - {0x0, 0, 11, 7160}, - {0x2f9d1, 16, 16, 7171}, - {0x0, 0, 1, 7171}, - {0x0, 0, 1, 7172}, - {0x0, 3, 4, 7173}, - {0x0, 0, 1, 7174}, - {0x0, 1, 2, 7175}, - {0x40c, 16, 16, 7176}, - {0x0, 2, 12, 7176}, - {0x2f89a, 16, 16, 7186}, - {0x0, 7, 8, 7186}, - {0x123, 16, 16, 7187}, - {0x0, 5, 7, 7187}, - {0xf974, 16, 16, 7189}, - {0x2f996, 16, 16, 7189}, - {0x0, 3, 4, 7189}, - {0x1e93, 16, 16, 7190}, - {0x0, 2, 3, 7190}, - {0x1fe7, 16, 16, 7191}, - {0x0, 2, 3, 7191}, - {0x2f9fc, 16, 16, 7192}, - {0x2f90b, 16, 16, 7192}, - {0xf95a, 16, 16, 7192}, - {0x0, 3, 5, 7192}, - {0xfa02, 16, 16, 7194}, - {0x2f8b6, 16, 16, 7194}, - {0x0, 1, 2, 7194}, - {0x1e48, 16, 16, 7195}, - {0x4e4, 16, 16, 7195}, - {0x4e2, 16, 16, 7195}, - {0x0, 0, 1, 7195}, - {0x0, 0, 1, 7196}, - {0x0, 3, 4, 7197}, - {0x0, 3, 4, 7198}, - {0x0, 8, 9, 7199}, - {0x2278, 16, 16, 7200}, - {0x419, 16, 16, 7200}, - {0x0, 1, 2, 7200}, - {0x2f9c0, 16, 16, 7201}, - {0x2f899, 16, 16, 7201}, - {0x1e72, 16, 16, 7201}, - {0x0, 4, 5, 7201}, - {0xf98e, 16, 16, 7202}, - {0x0, 5, 6, 7202}, - {0x2f92b, 16, 16, 7203}, - {0x0, 0, 1, 7203}, - {0x2f9fa, 16, 16, 7204}, - {0x0, 3, 14, 7204}, - {0x1e0d, 16, 16, 7215}, - {0x0, 6, 7, 7215}, - {0x2f9f2, 16, 16, 7216}, - {0x1e11, 16, 16, 7216}, - {0x0, 14, 15, 7216}, - {0x2f851, 16, 16, 7217}, - {0x0, 6, 7, 7217}, - {0x2f9f9, 16, 16, 7218}, - {0x0, 2, 3, 7218}, - {0xf9f9, 16, 16, 7219}, - {0x0, 14, 15, 7219}, - {0xf9a5, 16, 16, 7220}, - {0x10f, 16, 16, 7220}, - {0x0, 2, 6, 7220}, - {0x1f0f, 16, 16, 7224}, - {0x1f89, 16, 16, 7224}, - {0x0, 15, 16, 7224}, - {0x0, 0, 1, 7225}, - {0x0, 0, 1, 7226}, - {0x0, 3, 4, 7227}, - {0x0, 0, 1, 7228}, - {0x0, 7, 8, 7229}, - {0x1e9b, 16, 16, 7230}, - {0x1e13, 16, 16, 7230}, - {0x0, 0, 3, 7230}, - {0x2f84a, 16, 16, 7233}, - {0xfa0d, 16, 16, 7233}, - {0x0, 1, 2, 7233}, - {0x2fa14, 16, 16, 7234}, - {0x0, 12, 13, 7234}, - {0x2f9ad, 16, 16, 7235}, - {0x0, 10, 12, 7235}, - {0xf9ff, 16, 16, 7237}, - {0x2f820, 16, 16, 7237}, - {0x0, 1, 2, 7237}, - {0x2f84e, 16, 16, 7238}, - {0x1fe8, 16, 16, 7238}, - {0x1e58, 16, 16, 7238}, - {0x1fe9, 16, 16, 7238}, - {0x1fea, 16, 16, 7238}, - {0x0, 13, 14, 7238}, - {0x2f8f7, 16, 16, 7239}, - {0x0, 0, 1, 7239}, - {0x0, 0, 1, 7240}, - {0x0, 3, 4, 7241}, - {0x0, 4, 5, 7242}, - {0x0, 5, 6, 7243}, - {0x1f97, 16, 16, 7244}, - {0x3ab, 16, 16, 7244}, - {0x0, 3, 4, 7244}, - {0xf9f1, 16, 16, 7245}, - {0x210, 16, 16, 7245}, - {0x2f9a2, 16, 16, 7245}, - {0x158, 16, 16, 7245}, - {0x0, 5, 6, 7245}, - {0x2f9c8, 16, 16, 7246}, - {0x0, 0, 2, 7246}, - {0x1fc8, 16, 16, 7248}, - {0x388, 16, 16, 7248}, - {0x0, 12, 13, 7248}, - {0xf9cb, 16, 16, 7249}, - {0x0, 1, 2, 7249}, - {0xfa62, 16, 16, 7250}, - {0x0, 9, 10, 7250}, - {0xf9a9, 16, 16, 7251}, - {0x0, 14, 15, 7251}, - {0xf9b6, 16, 16, 7252}, - {0x0, 5, 6, 7252}, - {0xf9e3, 16, 16, 7253}, - {0x0, 11, 12, 7253}, - {0xf9ce, 16, 16, 7254}, - {0x0, 3, 4, 7254}, - {0x1ef5, 16, 16, 7255}, + {0x2f992, 16, 16, 7050}, + {0x0, 1, 14, 7050}, + {0x2f993, 16, 16, 7063}, + {0x2f994, 16, 16, 7063}, + {0x2f995, 16, 16, 7063}, + {0x2f996, 16, 16, 7063}, + {0x0, 3, 4, 7063}, + {0x0, 12, 13, 7064}, + {0x2f997, 16, 16, 7065}, + {0x0, 13, 14, 7065}, + {0x2f999, 16, 16, 7066}, + {0x0, 3, 4, 7066}, + {0x2f99a, 16, 16, 7067}, + {0x0, 13, 14, 7067}, + {0x2f99b, 16, 16, 7068}, + {0x0, 3, 4, 7068}, + {0x2f99c, 16, 16, 7069}, + {0x0, 13, 14, 7069}, + {0x2f99d, 16, 16, 7070}, + {0x0, 7, 8, 7070}, + {0x2f99e, 16, 16, 7071}, + {0x0, 3, 4, 7071}, + {0x2f9a0, 16, 16, 7072}, + {0x2f9a1, 16, 16, 7072}, + {0x2f9a2, 16, 16, 7072}, + {0x0, 12, 13, 7072}, + {0x2f9a3, 16, 16, 7073}, + {0x0, 3, 14, 7073}, + {0x0, 6, 7, 7084}, + {0x2f9a4, 16, 16, 7085}, + {0x0, 6, 7, 7085}, + {0x0, 11, 12, 7086}, + {0x2f9a5, 16, 16, 7087}, + {0x0, 5, 6, 7087}, + {0x2f9a6, 16, 16, 7088}, + {0x0, 2, 16, 7088}, + {0x0, 11, 12, 7102}, + {0x2f9a7, 16, 16, 7103}, + {0x2f9a8, 16, 16, 7103}, + {0x2f9a9, 16, 16, 7103}, + {0x0, 6, 7, 7103}, + {0x2f9aa, 16, 16, 7104}, + {0x0, 0, 16, 7104}, + {0x0, 12, 13, 7120}, + {0x0, 10, 11, 7121}, + {0x2f9ab, 16, 16, 7122}, + {0x0, 4, 5, 7122}, + {0x2f9ac, 16, 16, 7123}, + {0x0, 2, 12, 7123}, + {0x0, 12, 13, 7133}, + {0x2f9ad, 16, 16, 7134}, + {0x0, 13, 14, 7134}, + {0x2f9ae, 16, 16, 7135}, + {0x0, 1, 12, 7135}, + {0x2f9af, 16, 16, 7146}, + {0x0, 1, 2, 7146}, + {0x2f9b0, 16, 16, 7147}, + {0x0, 13, 14, 7147}, + {0x0, 2, 3, 7148}, + {0x2f9b1, 16, 16, 7149}, + {0x2f9b2, 16, 16, 7149}, + {0x2f9b3, 16, 16, 7149}, + {0x0, 7, 10, 7149}, + {0x2f9b5, 16, 16, 7152}, + {0x2f9b6, 16, 16, 7152}, + {0x0, 9, 10, 7152}, + {0x2f9b7, 16, 16, 7153}, + {0x0, 8, 9, 7153}, + {0x2f9b8, 16, 16, 7154}, + {0x0, 14, 15, 7154}, + {0x2f9b9, 16, 16, 7155}, + {0x0, 2, 3, 7155}, + {0x2f9ba, 16, 16, 7156}, + {0x0, 9, 10, 7156}, + {0x2f9bb, 16, 16, 7157}, + {0x0, 8, 9, 7157}, + {0x2f9bc, 16, 16, 7158}, + {0x0, 11, 12, 7158}, + {0x2f9bd, 16, 16, 7159}, + {0x0, 6, 7, 7159}, + {0x2f9be, 16, 16, 7160}, + {0x0, 7, 8, 7160}, + {0x2f9bf, 16, 16, 7161}, + {0x0, 1, 2, 7161}, + {0x2f9c0, 16, 16, 7162}, + {0x0, 1, 2, 7162}, + {0x2f9c1, 16, 16, 7163}, + {0x0, 9, 10, 7163}, + {0x2f9c2, 16, 16, 7164}, + {0x0, 0, 4, 7164}, + {0x2f9c3, 16, 16, 7168}, + {0x2f9c4, 16, 16, 7168}, + {0x0, 6, 7, 7168}, + {0x0, 7, 8, 7169}, + {0x2f9c5, 16, 16, 7170}, + {0x0, 7, 15, 7170}, + {0x2f9c6, 16, 16, 7178}, + {0x2f9c7, 16, 16, 7178}, + {0x0, 3, 13, 7178}, + {0x0, 5, 6, 7188}, + {0x2f9c8, 16, 16, 7189}, + {0x2f9c9, 16, 16, 7189}, + {0x2f9ca, 16, 16, 7189}, + {0x0, 10, 11, 7189}, + {0x0, 14, 15, 7190}, + {0x2f9cb, 16, 16, 7191}, + {0x0, 6, 7, 7191}, + {0x0, 6, 7, 7192}, + {0x2f9cc, 16, 16, 7193}, + {0x0, 14, 15, 7193}, + {0x2f9cd, 16, 16, 7194}, + {0x0, 7, 8, 7194}, + {0x2f9ce, 16, 16, 7195}, + {0x2f9cf, 16, 16, 7195}, + {0x0, 13, 14, 7195}, + {0x2f9d0, 16, 16, 7196}, + {0x2f9d1, 16, 16, 7196}, + {0x0, 5, 6, 7196}, + {0x2f9d2, 16, 16, 7197}, + {0x0, 10, 11, 7197}, + {0x0, 8, 9, 7198}, + {0x2f9d3, 16, 16, 7199}, + {0x0, 11, 12, 7199}, + {0x2f9d4, 16, 16, 7200}, + {0x2f9d5, 16, 16, 7200}, + {0x0, 11, 12, 7200}, + {0x2f9d6, 16, 16, 7201}, + {0x0, 7, 8, 7201}, + {0x2f9d7, 16, 16, 7202}, + {0x0, 2, 3, 7202}, + {0x0, 15, 16, 7203}, + {0x2f9d8, 16, 16, 7204}, + {0x0, 0, 14, 7204}, + {0x0, 4, 5, 7218}, + {0x2f9d9, 16, 16, 7219}, + {0x0, 11, 12, 7219}, + {0x2f9da, 16, 16, 7220}, + {0x0, 12, 13, 7220}, + {0x2f9db, 16, 16, 7221}, + {0x0, 0, 1, 7221}, + {0x2f9dc, 16, 16, 7222}, + {0x0, 14, 15, 7222}, + {0x2f9dd, 16, 16, 7223}, + {0x0, 4, 5, 7223}, + {0x2f9de, 16, 16, 7224}, + {0x2f9df, 16, 16, 7224}, + {0x0, 5, 14, 7224}, + {0x0, 13, 15, 7233}, + {0x0, 2, 3, 7235}, + {0x2f9e0, 16, 16, 7236}, + {0x0, 13, 14, 7236}, + {0x2f9e1, 16, 16, 7237}, + {0x0, 4, 5, 7237}, + {0x2f9e2, 16, 16, 7238}, + {0x2f9e3, 16, 16, 7238}, + {0x0, 1, 12, 7238}, + {0x2f9e4, 16, 16, 7249}, + {0x0, 2, 3, 7249}, + {0x0, 14, 15, 7250}, + {0x2f9e5, 16, 16, 7251}, + {0x2f9e6, 16, 16, 7251}, + {0x2f9e7, 16, 16, 7251}, + {0x0, 7, 9, 7251}, + {0x2f9e8, 16, 16, 7253}, + {0x2f9e9, 16, 16, 7253}, + {0x0, 12, 13, 7253}, + {0x2f9ea, 16, 16, 7254}, + {0x0, 9, 10, 7254}, + {0x2f9eb, 16, 16, 7255}, {0x0, 1, 2, 7255}, - {0x1e49, 16, 16, 7256}, - {0x0, 0, 1, 7256}, - {0x0, 0, 1, 7257}, - {0x0, 3, 4, 7258}, - {0x0, 0, 1, 7259}, - {0x0, 0, 2, 7260}, - {0x1f1c, 16, 16, 7262}, - {0x1f1a, 16, 16, 7262}, - {0x0, 3, 4, 7262}, - {0xf99a, 16, 16, 7263}, - {0xe4, 16, 16, 7263}, - {0x1ea3, 16, 16, 7263}, - {0x0, 0, 1, 7263}, - {0x0, 3, 4, 7264}, - {0x0, 0, 1, 7265}, - {0x0, 9, 10, 7266}, - {0x0, 9, 10, 7267}, - {0x3054, 16, 16, 7268}, - {0x0, 1, 3, 7268}, - {0x2f856, 16, 16, 7270}, - {0x2f857, 16, 16, 7270}, - {0xe0, 16, 16, 7270}, - {0xe1, 16, 16, 7270}, - {0xe2, 16, 16, 7270}, - {0xe3, 16, 16, 7270}, - {0x0, 9, 10, 7270}, - {0x2f82c, 16, 16, 7271}, - {0x103, 16, 16, 7271}, - {0x227, 16, 16, 7271}, - {0x0, 0, 1, 7271}, - {0x0, 0, 1, 7272}, - {0x0, 3, 4, 7273}, - {0x0, 0, 1, 7274}, - {0x0, 0, 2, 7275}, - {0x1f13, 16, 16, 7277}, - {0x1f15, 16, 16, 7277}, - {0x0, 1, 2, 7277}, - {0x2f930, 16, 16, 7278}, - {0x0, 0, 2, 7278}, - {0x1f62, 16, 16, 7280}, - {0x1f64, 16, 16, 7280}, - {0x0, 2, 3, 7280}, - {0xf938, 16, 16, 7281}, - {0x0, 12, 13, 7281}, - {0xf93b, 16, 16, 7282}, - {0x0, 6, 7, 7282}, - {0xf935, 16, 16, 7283}, - {0x0, 0, 1, 7283}, + {0x0, 5, 6, 7256}, + {0x2f9ec, 16, 16, 7257}, + {0x0, 15, 16, 7257}, + {0x0, 10, 11, 7258}, + {0x2f9ed, 16, 16, 7259}, + {0x0, 11, 12, 7259}, + {0x2f9ee, 16, 16, 7260}, + {0x0, 9, 15, 7260}, + {0x0, 5, 6, 7266}, + {0x2f9ef, 16, 16, 7267}, + {0x0, 7, 8, 7267}, + {0x2f9f0, 16, 16, 7268}, + {0x0, 7, 8, 7268}, + {0x0, 7, 8, 7269}, + {0x2f9f1, 16, 16, 7270}, + {0x0, 6, 7, 7270}, + {0x2f9f2, 16, 16, 7271}, + {0x0, 3, 4, 7271}, + {0x2f9f3, 16, 16, 7272}, + {0x2f9f4, 16, 16, 7272}, + {0x0, 3, 4, 7272}, + {0x2f9f5, 16, 16, 7273}, + {0x0, 5, 6, 7273}, + {0x2f9f6, 16, 16, 7274}, + {0x0, 1, 2, 7274}, + {0x0, 10, 11, 7275}, + {0x2f9f7, 16, 16, 7276}, + {0x0, 6, 12, 7276}, + {0x0, 14, 15, 7282}, + {0x2f9f8, 16, 16, 7283}, + {0x0, 6, 7, 7283}, + {0x2f9f9, 16, 16, 7284}, {0x0, 0, 1, 7284}, - {0x0, 3, 4, 7285}, - {0x0, 4, 5, 7286}, - {0x0, 5, 6, 7287}, - {0x1f8c, 16, 16, 7288}, - {0x0, 0, 1, 7288}, - {0x0, 0, 1, 7289}, - {0x0, 3, 4, 7290}, - {0x0, 0, 1, 7291}, - {0x0, 2, 3, 7292}, - {0x1ed9, 16, 16, 7293}, - {0xe5, 16, 16, 7293}, - {0x1ce, 16, 16, 7293}, - {0x0, 11, 12, 7293}, - {0x2f9a7, 16, 16, 7294}, - {0x201, 16, 16, 7294}, - {0x0, 11, 12, 7294}, - {0x2f990, 16, 16, 7295}, - {0x0, 6, 7, 7295}, - {0x2f85c, 16, 16, 7296}, - {0x0, 0, 1, 7296}, - {0x0, 0, 1, 7297}, - {0x0, 3, 4, 7298}, - {0x0, 4, 5, 7299}, - {0x0, 5, 6, 7300}, - {0x1fa3, 16, 16, 7301}, + {0x2f9fa, 16, 16, 7285}, + {0x0, 0, 10, 7285}, + {0x0, 10, 11, 7295}, + {0x2f9fb, 16, 16, 7296}, + {0x0, 2, 3, 7296}, + {0x2f9fc, 16, 16, 7297}, + {0x0, 6, 7, 7297}, + {0x2f9fd, 16, 16, 7298}, + {0x0, 11, 12, 7298}, + {0x2f9ff, 16, 16, 7299}, + {0x0, 9, 10, 7299}, + {0x2fa00, 16, 16, 7300}, + {0x0, 11, 12, 7300}, {0x0, 6, 7, 7301}, - {0x2f9aa, 16, 16, 7302}, - {0x0, 6, 7, 7302}, - {0xf9b0, 16, 16, 7303}, - {0x0, 1, 3, 7303}, - {0x2f881, 16, 16, 7305}, - {0x2f882, 16, 16, 7305}, - {0x0, 2, 3, 7305}, - {0xf9c1, 16, 16, 7306}, - {0x0, 2, 7, 7306}, - {0xfa03, 16, 16, 7311}, - {0x0, 10, 11, 7311}, - {0x2f932, 16, 16, 7312}, - {0x2f966, 16, 16, 7312}, - {0x0, 10, 11, 7312}, - {0xf9ec, 16, 16, 7313}, - {0x1e50, 16, 16, 7313}, - {0x0, 6, 7, 7313}, - {0xfa61, 16, 16, 7314}, - {0x0, 1, 13, 7314}, - {0x109, 16, 16, 7326}, - {0x107, 16, 16, 7326}, - {0x10b, 16, 16, 7326}, - {0x0, 1, 2, 7326}, - {0x0, 0, 1, 7327}, - {0x0, 0, 1, 7328}, - {0x0, 6, 7, 7329}, - {0x0, 5, 6, 7330}, - {0x0, 4, 5, 7331}, - {0x6c2, 16, 16, 7332}, - {0x0, 2, 3, 7332}, - {0xf9bf, 16, 16, 7333}, - {0x0, 0, 1, 7333}, - {0x0, 0, 1, 7334}, - {0x2fa1d, 16, 16, 7335}, - {0x0, 3, 4, 7335}, - {0x1ef4, 16, 16, 7336}, - {0x0, 14, 15, 7336}, - {0x2f9dd, 16, 16, 7337}, - {0x0, 0, 4, 7337}, - {0x2f9c4, 16, 16, 7341}, - {0x0, 0, 1, 7341}, - {0x0, 0, 1, 7342}, - {0x0, 3, 4, 7343}, - {0x0, 4, 5, 7344}, - {0x0, 5, 6, 7345}, - {0x1f87, 16, 16, 7346}, - {0x2f9c3, 16, 16, 7346}, - {0x0, 11, 12, 7346}, - {0xf964, 16, 16, 7347}, - {0x0, 12, 15, 7347}, - {0xfa15, 16, 16, 7350}, - {0xf954, 16, 16, 7350}, - {0x0, 2, 3, 7350}, - {0xf946, 16, 16, 7351}, - {0x0, 0, 1, 7351}, - {0x0, 0, 1, 7352}, - {0x0, 3, 4, 7353}, - {0x0, 3, 4, 7354}, - {0x0, 8, 9, 7355}, - {0x2226, 16, 16, 7356}, - {0x1f79, 16, 16, 7356}, - {0x0, 0, 1, 7356}, - {0x0, 0, 1, 7357}, - {0x0, 3, 4, 7358}, - {0x0, 3, 4, 7359}, - {0x0, 8, 9, 7360}, - {0x21ce, 16, 16, 7361}, - {0x1d4, 16, 16, 7361}, - {0x1f7b, 16, 16, 7361}, - {0x10d, 16, 16, 7361}, - {0x0, 2, 10, 7361}, - {0x2f96f, 16, 16, 7369}, - {0xfa58, 16, 16, 7369}, + {0x2fa01, 16, 16, 7302}, + {0x2fa02, 16, 16, 7302}, + {0x0, 3, 13, 7302}, + {0x0, 3, 4, 7312}, + {0x2fa03, 16, 16, 7313}, + {0x2fa04, 16, 16, 7313}, + {0x0, 7, 8, 7313}, + {0x2fa05, 16, 16, 7314}, + {0x0, 2, 3, 7314}, + {0x2fa06, 16, 16, 7315}, + {0x2fa07, 16, 16, 7315}, + {0x0, 14, 15, 7315}, + {0x2fa08, 16, 16, 7316}, + {0x0, 3, 4, 7316}, + {0x0, 0, 1, 7317}, + {0x2fa09, 16, 16, 7318}, + {0x0, 2, 3, 7318}, + {0x2fa0a, 16, 16, 7319}, + {0x0, 0, 1, 7319}, + {0x2fa0b, 16, 16, 7320}, + {0x0, 13, 14, 7320}, + {0x2fa0c, 16, 16, 7321}, + {0x0, 12, 16, 7321}, + {0x0, 14, 15, 7325}, + {0x2fa0d, 16, 16, 7326}, + {0x0, 13, 14, 7326}, + {0x2fa0e, 16, 16, 7327}, + {0x0, 7, 8, 7327}, + {0x2fa0f, 16, 16, 7328}, + {0x0, 12, 13, 7328}, + {0x0, 14, 15, 7329}, + {0x2fa10, 16, 16, 7330}, + {0x0, 8, 9, 7330}, + {0x2fa11, 16, 16, 7331}, + {0x0, 0, 1, 7331}, + {0x0, 5, 6, 7332}, + {0x2fa12, 16, 16, 7333}, + {0x0, 0, 10, 7333}, + {0x0, 14, 15, 7343}, + {0x2fa13, 16, 16, 7344}, + {0x0, 1, 2, 7344}, + {0x2fa14, 16, 16, 7345}, + {0x0, 11, 12, 7345}, + {0x2fa15, 16, 16, 7346}, + {0x0, 5, 6, 7346}, + {0x0, 6, 7, 7347}, + {0x2fa16, 16, 16, 7348}, + {0x0, 9, 15, 7348}, + {0x2fa17, 16, 16, 7354}, + {0x2fa18, 16, 16, 7354}, + {0x0, 5, 16, 7354}, + {0x2fa19, 16, 16, 7365}, + {0x2fa1a, 16, 16, 7365}, + {0x0, 6, 7, 7365}, + {0x2fa1b, 16, 16, 7366}, + {0x0, 11, 12, 7366}, + {0x2fa1c, 16, 16, 7367}, + {0x0, 0, 1, 7367}, + {0x0, 0, 1, 7368}, + {0x2fa1d, 16, 16, 7369}, }; const unsigned short _wind_canon_next_table[] = { 1, 0, - 46, - 29, - 15, - 73, - 64, - 11, - 6, - 24, - 38, + 3716, 2, - 42, - 722, - 2119, + 1147, + 2397, + 2680, + 3010, + 3014, + 2998, + 3036, + 2994, + 3018, 3, - 140, - 1467, - 221, - 325, - 285, - 682, - 360, - 729, - 1610, - 635, - 106, - 2045, - 510, - 2830, - 0, + 467, + 431, + 608, + 745, 0, + 967, 0, 0, + 1010, 0, - 748, - 1101, - 4614, - 273, + 1040, + 1073, + 1104, 0, + 1136, + 622, 4, + 56, + 72, + 124, 0, 0, - 4440, + 624, + 638, + 417, + 397, + 424, + 404, 5, - 0, + 1158, + 16, + 159, + 22, + 1237, + 183, + 203, + 31, + 226, + 238, + 250, + 1309, + 40, + 46, + 6, + 7, + 8, + 9, + 528, + 145, 10, + 11, + 12, + 13, + 141, 0, + 143, + 564, + 14, + 1544, + 15, 0, + 389, 0, 0, + 526, + 17, + 18, + 19, + 149, 0, + 20, + 21, + 23, + 24, + 25, + 26, + 534, + 177, + 1221, + 27, + 28, + 29, + 1602, + 171, 0, + 173, + 175, + 30, + 1600, 0, 0, - 0, - 97, - 224, - 1388, - 270, - 249, - 1440, - 550, - 3741, - 2040, - 7, - 419, - 54, - 109, - 883, - 1230, - 275, - 336, - 4348, - 0, - 0, - 4568, - 3216, - 2891, - 0, - 0, + 181, 0, 0, - 1305, + 532, + 32, + 33, + 34, + 35, + 540, + 221, + 1263, + 36, + 37, + 38, + 215, + 217, 0, + 219, + 225, + 39, + 1635, 0, - 8, - 4480, - 937, - 112, 0, + 391, 0, 0, + 538, + 41, + 42, + 43, + 44, 0, + 270, + 1331, + 498, + 268, 0, + 45, 0, - 9, - 1532, - 2106, - 1144, - 236, - 1215, - 1449, - 1624, 0, 0, - 12, - 194, - 1718, - 1680, - 3611, - 217, - 398, - 13, + 1327, 0, 0, 0, 0, - 4477, - 14, - 2316, + 274, + 47, + 48, + 49, + 50, + 381, + 463, + 51, + 52, + 53, + 54, + 276, 0, + 278, + 592, + 55, + 1641, 0, + 280, + 393, 0, 0, + 544, + 1356, 0, + 282, + 300, + 320, + 57, + 1476, + 350, + 1504, + 66, + 365, + 58, + 59, + 60, + 61, + 385, + 346, + 1446, + 62, + 63, + 64, + 336, + 338, 0, + 340, 0, + 65, + 1699, + 342, + 344, + 395, 0, 0, + 554, + 67, + 68, + 69, + 70, 0, + 1725, + 1723, + 71, + 362, + 1731, + 606, 0, 0, - 0, - 328, - 16, - 553, - 3511, - 17, - 646, - 732, - 426, - 532, - 57, - 0, - 0, - 0, - 278, - 1790, - 0, - 0, - 658, - 695, - 2327, - 3451, - 3868, - 18, - 666, - 4417, - 4518, - 391, - 1640, - 1458, - 567, - 340, - 2209, - 2458, - 1747, - 19, - 20, - 21, - 22, - 23, - 1307, - 304, - 1254, - 227, - 750, - 51, - 1120, - 1576, - 467, - 1270, - 2751, - 25, - 1647, - 183, - 1785, - 363, + 1518, + 364, + 1729, + 2369, + 73, + 1164, + 84, + 165, + 90, + 1243, + 189, + 209, + 99, + 232, + 244, + 256, 1315, + 108, + 114, + 74, + 75, + 76, + 77, + 530, + 147, + 78, + 79, + 80, + 81, + 142, 0, - 1982, + 144, + 565, + 82, + 1545, + 83, 0, + 390, 0, - 2474, 0, - 1656, + 527, + 85, + 86, + 87, + 151, 0, - 4178, - 4486, - 26, - 28, - 27, - 132, - 82, - 346, - 186, + 88, + 89, + 91, + 92, + 93, + 94, + 536, + 179, + 1223, + 95, + 96, + 97, + 1603, + 172, + 0, + 174, + 176, 98, + 1601, 0, - 30, 0, + 182, 0, - 1028, 0, - 1050, - 739, - 113, + 533, + 100, + 101, + 102, + 103, + 542, + 223, + 1265, + 104, + 105, + 106, + 216, + 218, 0, - 2135, - 1415, + 220, 0, - 4020, + 107, + 1636, 0, 0, + 392, 0, 0, + 539, + 109, + 110, + 111, + 112, 0, + 272, + 1333, + 499, + 269, 0, + 113, 0, - 4647, - 31, - 3197, 0, 0, - 32, - 33, - 34, - 35, - 36, - 37, - 354, - 809, - 436, - 1736, - 39, - 547, - 708, - 1945, - 850, - 367, - 594, - 1651, - 388, - 416, - 1251, - 705, - 4230, + 1328, 0, - 1894, 0, - 886, - 424, - 40, - 4586, - 2250, - 1941, 0, 0, - 4635, - 41, - 1224, - 1391, - 813, - 1807, - 3757, - 308, - 442, - 43, - 439, + 275, + 115, + 116, + 117, + 118, + 383, + 465, + 119, + 120, 121, - 4198, - 1596, - 1298, - 529, - 1244, - 1948, - 4367, - 4591, - 2500, - 2808, - 0, - 0, - 0, + 122, + 277, 0, + 279, + 593, + 123, + 1642, 0, + 281, + 394, 0, 0, + 545, + 1362, 0, - 4473, - 44, - 45, - 239, - 1073, - 1218, - 543, - 506, - 124, - 47, - 128, - 772, - 725, - 291, - 3715, - 357, - 3693, - 4339, - 759, + 288, + 306, + 326, + 125, + 1482, + 356, + 1510, + 134, + 371, + 126, + 127, + 128, + 129, + 387, + 348, + 1448, + 130, + 131, + 132, + 337, + 339, 0, - 2181, + 341, 0, + 133, + 1700, + 343, + 345, + 396, 0, 0, - 3076, - 48, - 2065, + 555, + 135, + 136, + 137, + 138, 0, - 3213, - 49, + 1727, + 1724, + 139, + 363, + 1732, + 607, 0, 0, + 1519, + 140, + 1730, + 1534, + 1542, 0, + 1156, 0, 0, + 146, + 1543, 0, + 1157, 0, 0, + 148, + 150, + 153, 0, - 1375, - 50, - 1333, 0, - 1993, - 1665, 0, - 52, 0, + 155, 0, - 1352, 0, - 3457, - 53, - 1249, - 55, 0, 0, + 157, + 152, + 154, 0, - 1627, 0, 0, 0, + 156, 0, - 1920, - 56, - 2143, 0, 0, 0, - 58, + 158, + 160, + 161, + 162, + 163, 0, + 1192, + 1196, + 1190, 0, 0, 0, 0, + 164, + 166, + 167, + 168, + 169, 0, + 1194, + 1198, + 1191, 0, - 2970, - 59, - 60, - 61, - 62, - 63, - 65, 0, 0, 0, - 1683, - 403, - 1593, - 1555, - 862, - 2420, - 151, - 259, - 1010, - 2377, - 2719, - 385, - 2542, + 170, + 1598, 0, 0, 0, - 826, - 894, - 66, - 610, + 566, + 178, 0, - 2676, - 513, - 90, - 452, - 1152, - 1560, - 470, - 3342, 0, 0, - 67, 0, - 4191, + 1219, + 1599, 0, - 4103, 0, 0, + 567, + 180, 0, 0, 0, 0, - 1443, - 68, - 69, - 70, - 71, - 72, - 539, - 985, - 74, - 1870, + 1220, + 184, + 185, + 186, + 187, 0, - 675, - 1542, - 75, + 199, + 496, + 188, 0, - 1085, - 210, - 2259, - 2582, - 498, - 295, - 76, + 1249, 0, - 3605, + 195, + 197, 0, 0, - 4323, 0, 0, + 457, + 190, + 191, + 192, + 193, 0, + 201, + 497, + 194, 0, - 1741, - 77, - 78, - 79, - 80, - 81, - 2790, - 587, + 1250, 0, + 196, + 198, 0, - 978, - 1368, - 83, - 4492, 0, 0, - 161, - 2601, 0, + 458, + 200, + 202, + 204, + 205, + 206, + 207, 0, - 628, - 4245, - 2052, + 1253, + 208, 0, 0, 0, 0, + 1251, + 1257, 0, 0, - 2488, - 2098, - 1037, - 84, - 85, - 86, - 87, - 88, - 89, - 372, 0, - 154, + 562, + 210, + 211, + 212, + 213, 0, - 3528, + 1255, + 1530, + 214, 0, - 1493, 0, - 91, 0, - 1275, 0, - 4271, + 1252, + 1258, 0, - 2079, - 92, - 93, - 94, - 95, - 96, - 3288, - 1345, - 1907, - 99, - 1176, - 2738, 0, - 3255, 0, + 563, + 1637, 0, 0, 0, 0, - 1615, - 2341, - 764, + 222, + 1638, 0, 0, - 1103, 0, - 1711, - 2982, - 100, - 143, 0, - 4150, + 224, + 227, + 228, + 229, + 230, + 231, + 233, + 234, + 235, + 236, + 237, 0, 0, 0, - 3444, - 101, - 102, - 103, - 104, - 105, - 527, - 881, 0, 0, 0, 0, 0, - 107, 0, + 495, + 239, + 240, + 241, + 459, 0, + 242, + 1283, + 1281, 0, - 4111, - 4319, 0, - 2519, - 2853, - 108, - 1939, 0, + 243, + 245, + 246, + 247, + 461, 0, - 110, + 248, + 1285, + 1282, 0, 0, 0, + 249, + 251, + 252, + 253, + 254, 0, - 3917, + 262, + 1303, + 255, 0, 0, 0, - 2192, - 1883, - 1470, - 1202, - 111, - 318, 0, 0, 0, @@ -16197,18 +16243,17 @@ 0, 0, 0, + 266, + 257, + 258, + 259, + 260, 0, - 114, - 2770, + 264, + 1305, + 261, 0, 0, - 115, - 116, - 117, - 118, - 119, - 120, - 4389, 0, 0, 0, @@ -16216,2492 +16261,2691 @@ 0, 0, 0, - 2672, 0, - 2002, + 267, + 1287, 0, 0, - 122, - 123, 0, + 263, 0, 0, 0, 0, 0, + 1307, + 1288, 0, 0, 0, + 265, 0, 0, 0, - 179, - 925, - 125, 0, 0, - 1310, + 1308, + 1329, 0, - 1686, 0, 0, - 1571, - 3387, - 4056, - 1539, + 271, 0, 0, - 3187, - 126, 0, - 954, - 127, - 1047, 0, 0, - 1771, + 1335, + 1330, 0, 0, - 3590, 0, - 3849, - 3246, + 273, 0, 0, - 129, 0, 0, - 433, - 130, - 131, - 3069, - 133, - 197, - 168, - 1797, 0, + 1336, + 283, + 284, + 285, + 286, + 550, + 294, + 1387, + 287, 0, - 579, - 1377, - 445, - 2552, - 460, - 2528, - 1957, - 1845, - 134, - 2847, - 901, - 1326, - 3859, - 3234, - 1193, - 993, - 753, - 3534, - 520, - 2171, - 2023, - 135, - 136, - 137, - 138, 0, - 4306, - 181, - 182, 0, 0, 0, + 1370, 0, - 180, 0, 0, 0, + 298, 0, - 139, - 842, - 1889, - 1537, 0, - 2198, - 3252, + 548, + 289, + 290, + 291, + 292, + 552, + 296, + 1389, + 293, 0, 0, 0, - 2711, - 3762, - 3357, - 4313, - 4259, - 141, - 142, - 144, - 145, - 146, - 147, - 160, 0, 0, + 1371, 0, - 150, 0, - 149, 0, - 148, - 3760, 0, + 299, 0, 0, - 152, + 549, + 1372, 0, 0, 0, + 295, + 1373, 0, 0, 0, + 297, + 301, + 302, + 303, + 304, 0, - 2861, - 153, - 155, - 156, - 157, - 158, - 159, - 1382, - 1759, + 314, + 305, + 312, 0, 0, 0, 0, + 1391, 0, 0, 0, 0, + 318, + 307, + 308, + 309, + 310, 0, + 316, + 311, + 313, 0, 0, 0, 0, - 162, - 163, - 164, - 165, - 166, + 1392, 0, - 958, - 799, - 167, 0, - 175, 0, 0, + 319, + 1393, 0, 0, + 558, + 315, + 1394, 0, - 177, - 4413, - 312, - 479, - 792, - 561, - 169, - 3769, - 3920, - 1487, - 230, - 1065, - 2427, - 3365, - 573, - 1452, - 204, - 170, - 171, - 172, - 962, - 1366, - 173, - 2855, - 174, 0, + 559, + 317, + 321, + 322, + 323, + 332, 0, + 324, + 1438, + 1436, 0, - 176, - 178, 0, + 560, + 325, 0, 0, 0, - 220, - 3165, 0, - 2515, - 4072, 0, - 3470, - 2736, - 685, + 1442, + 327, + 328, + 329, + 334, 0, + 330, + 1440, + 1437, 0, 0, - 4065, - 956, - 1426, - 184, - 185, - 1529, - 1199, + 561, + 331, 0, 0, 0, 0, 0, + 1443, + 1434, 0, - 1294, - 252, - 187, - 406, - 263, - 802, - 3985, 0, 0, 0, - 188, + 333, + 1435, + 1532, 0, 0, 0, - 2521, + 335, + 1697, + 1444, 0, 0, - 4211, - 4207, - 1549, - 4210, - 189, - 190, - 191, - 3706, - 192, - 193, - 195, - 4482, 0, + 347, 0, 0, - 4447, - 196, - 3144, 0, - 198, - 1689, - 1971, - 3023, - 3687, - 844, - 1257, - 816, - 2650, - 199, - 200, - 201, - 1569, - 202, - 623, - 1006, - 203, - 205, - 206, - 207, - 2194, - 208, - 2835, - 209, 0, + 1450, + 1698, + 1445, 0, 0, 0, + 349, 0, 0, 0, 0, + 1451, + 351, + 352, + 353, + 354, 0, - 1869, - 2545, - 2111, + 1500, + 1492, + 1494, + 355, 0, 0, - 4458, - 3207, 0, 0, - 3111, - 491, - 243, - 211, - 212, - 213, - 214, - 215, - 216, - 218, + 1498, + 1496, + 357, + 358, + 359, + 360, 0, + 1502, + 1493, + 1495, + 361, 0, - 3956, - 4074, 0, 0, 0, - 2374, + 1499, + 1497, 0, - 2864, + 1533, + 366, + 367, + 368, + 369, 0, - 2217, + 1522, + 1526, + 370, + 1520, 0, - 4093, - 219, - 4624, 0, 0, 0, + 377, 0, - 3181, 0, 0, 0, + 379, + 372, + 373, + 374, + 375, 0, + 1524, + 1528, + 376, + 1521, 0, - 1313, 0, 0, - 222, - 223, - 225, 0, - 960, + 378, 0, 0, 0, 0, - 3964, + 380, + 546, 0, - 2070, 0, 0, - 3710, - 3722, - 1821, - 226, - 228, 0, - 2337, - 2010, - 1739, - 3930, 0, - 2844, 0, - 2205, 0, - 4089, - 229, - 231, - 232, - 233, - 234, - 2125, - 1147, - 1504, - 1852, - 1853, - 1854, - 1855, - 1856, 0, - 1857, 0, - 1858, - 1859, + 382, + 547, 0, 0, - 235, 0, 0, - 1893, - 2151, 0, 0, - 2478, 0, - 237, 0, 0, + 384, + 556, 0, 0, 0, 0, 0, - 3627, - 238, - 3084, 0, 0, 0, - 240, - 3098, 0, - 3417, + 386, + 557, 0, - 2733, - 288, - 4042, - 241, 0, - 3183, - 242, - 244, - 245, - 246, - 247, - 248, - 1464, - 1829, 0, - 2409, - 4575, - 250, 0, - 1026, 0, 0, 0, 0, - 422, - 3040, - 3298, - 3659, - 311, 0, + 388, + 1643, + 580, + 568, 0, + 514, 0, 0, 0, + 398, + 399, + 400, + 401, + 402, + 415, + 411, 0, 0, + 403, 0, - 251, - 3254, - 1774, - 0, - 0, - 0, - 253, - 0, - 378, - 0, - 2976, 0, 0, 0, 0, 0, - 2353, - 254, - 255, - 256, - 4532, - 257, - 262, - 258, - 3195, - 260, 0, + 413, + 1649, + 586, + 574, 0, - 2060, + 520, 0, 0, 0, + 405, + 406, + 407, + 408, + 409, + 416, + 412, 0, - 3061, - 261, - 4183, 0, + 410, 0, 0, - 2127, 0, 0, 0, - 1703, - 2090, - 1263, - 4685, - 4693, - 264, - 265, - 266, - 267, - 268, - 269, - 1017, - 644, - 271, - 4507, - 4332, 0, 0, - 3482, - 3765, - 3492, - 3442, - 3526, - 3205, - 2857, - 2559, - 701, - 272, - 307, + 414, + 1546, 0, + 418, + 500, + 445, + 1178, 0, 0, + 1604, 0, 0, 0, 0, + 1267, + 419, + 420, + 421, + 422, + 423, + 1552, 0, + 425, + 506, + 451, + 1184, 0, 0, + 1610, 0, - 274, - 2989, - 3322, 0, 0, - 1608, - 4469, 0, + 1273, + 426, + 427, + 428, + 429, + 430, + 432, 0, - 2068, - 302, - 1380, - 276, - 626, - 4351, - 277, - 3593, 0, 0, 0, 0, 0, + 488, 0, + 620, + 433, + 439, + 1225, + 1231, 0, 0, - 279, - 280, - 281, - 282, - 3789, 0, 0, + 594, + 600, + 434, + 435, + 436, + 437, + 438, + 440, + 441, + 442, + 443, + 444, + 446, + 447, + 448, + 449, + 512, 0, - 283, - 284, - 4369, 0, - 286, + 450, + 452, + 453, + 454, + 455, + 513, 0, 0, + 456, + 1279, 0, - 3021, - 3494, - 1812, 0, 0, - 2284, 0, 0, - 4465, - 287, - 289, - 290, - 1317, - 4386, - 2437, - 292, 0, 0, - 4656, - 293, - 294, - 2033, - 4164, - 296, - 3461, - 297, - 298, - 299, - 300, - 301, - 1015, 0, 0, - 1016, 0, + 460, + 1280, 0, - 303, - 1905, 0, - 2597, - 2301, - 305, - 2348, - 2104, - 3179, 0, - 3830, 0, - 2359, - 306, - 309, 0, - 477, - 4208, - 310, - 313, - 314, - 315, - 4099, - 316, - 4095, - 317, - 319, - 3561, - 320, - 321, - 322, - 3163, 0, - 323, - 324, - 4595, - 326, - 4122, - 2012, 0, - 1788, - 719, 0, - 2058, 0, - 2075, 0, + 462, + 1639, 0, 0, - 3390, - 327, - 1058, 0, - 712, - 408, 0, + 464, + 1640, 0, 0, - 329, - 1629, - 1110, - 330, - 2162, - 331, - 332, - 333, - 334, - 335, 0, 0, + 466, + 1577, + 1204, 0, - 339, - 3940, 0, - 3286, + 1341, + 1395, + 1408, + 1535, 0, 0, - 337, - 4436, + 1674, + 481, 0, - 1343, - 871, - 1287, 0, - 1301, - 3655, - 0, - 2995, - 338, - 341, - 342, - 343, - 344, - 345, - 347, - 0, - 0, - 0, - 0, - 0, - 0, - 3013, - 0, - 3885, - 3735, - 2293, - 919, - 348, + 468, + 469, + 475, + 470, + 471, + 472, + 473, + 474, + 476, + 477, + 478, + 479, + 480, + 1707, 0, 0, 0, 0, - 1396, - 2223, - 349, - 350, - 351, - 352, - 353, - 2502, 0, - 2168, - 1591, 0, + 482, + 483, + 484, + 485, + 486, + 487, + 489, + 490, + 491, + 492, + 493, + 494, + 501, + 502, + 503, + 504, + 505, + 507, + 508, + 509, + 510, + 511, + 515, + 516, + 517, + 518, + 519, + 521, + 522, + 523, + 524, + 525, + 529, + 531, + 535, + 537, + 541, + 543, + 551, + 553, + 569, + 570, + 571, + 572, + 573, + 575, + 576, + 577, + 578, + 579, + 581, + 582, + 583, + 584, + 1337, 0, - 355, 0, - 4411, - 4124, + 585, 0, - 1008, - 3222, - 402, 0, 0, + 1339, + 587, + 588, + 589, + 590, + 1338, 0, 0, + 591, 0, 0, - 401, 0, + 1340, + 595, + 596, + 597, + 598, + 599, + 601, + 602, + 603, + 604, + 605, + 609, + 612, 0, 0, 0, 0, - 356, - 3038, 0, - 2386, 0, + 2278, + 631, + 664, + 686, + 677, + 737, + 610, + 611, 0, 0, 0, 0, 0, 0, + 614, + 613, + 615, + 616, + 617, + 618, + 619, + 621, + 623, + 2519, + 2500, + 2525, + 625, + 626, + 627, + 628, + 629, 0, - 358, - 359, - 2866, 0, 0, + 2282, + 2367, + 630, + 2323, + 632, 0, 0, - 3271, 0, - 361, - 4641, - 362, - 4399, + 640, 0, - 364, + 646, 0, + 652, 0, 0, - 3883, 0, 0, 0, + 658, + 633, + 634, + 635, + 636, + 1756, 0, 0, - 3876, + 2280, + 2277, + 637, 0, - 1922, - 2314, - 366, - 365, - 3249, - 1663, - 1241, - 1558, - 1903, - 2215, - 368, 0, - 4541, + 2276, 0, - 687, + 2275, + 2396, 0, - 3490, - 370, - 369, - 371, - 373, - 374, - 375, - 376, - 377, - 379, - 380, - 381, - 382, - 865, 0, + 639, + 641, + 642, + 643, + 644, + 1795, + 2305, + 645, + 647, + 648, + 649, + 650, + 1834, 0, - 1924, - 383, - 384, - 3670, 0, + 2309, + 2307, + 651, + 653, + 654, + 655, + 656, + 1877, + 2330, + 657, 0, 0, + 2329, 0, + 2328, 0, + 684, + 659, + 660, + 661, + 662, + 1916, + 2390, + 663, + 2361, 0, 0, 0, + 665, 0, 0, 0, + 671, 0, 0, - 386, - 387, - 1408, + 2010, + 2012, + 2014, + 2016, + 666, + 667, + 668, + 669, + 1955, + 2359, + 670, 0, 0, - 2423, + 2358, 0, + 2357, 0, - 4484, + 685, + 672, + 673, + 674, + 675, + 1988, 0, - 2946, 0, - 4633, - 389, - 1864, + 2394, + 2392, + 676, + 2346, 0, 0, 0, - 1879, - 390, - 392, - 393, - 394, - 3865, + 718, 0, 0, 0, - 395, - 396, + 731, + 678, + 711, + 2018, + 2020, + 2022, + 679, + 680, + 681, + 682, 0, 0, - 397, - 399, 0, - 1969, + 2326, + 2322, + 683, + 2345, + 687, 0, - 3392, - 2333, - 400, - 404, - 405, - 407, - 1019, 0, 0, + 693, 0, - 2745, + 699, 0, - 1136, + 705, 0, - 415, 0, 0, 0, 0, + 724, + 688, + 689, + 690, + 691, + 1733, 0, - 2949, - 835, - 409, - 410, - 411, - 412, - 413, - 414, - 653, - 4423, - 4176, - 3845, 0, + 2260, + 2009, + 692, 0, 0, - 417, + 2252, 0, + 2251, + 694, + 695, + 696, + 697, + 1777, + 2011, + 698, + 700, + 701, + 702, + 703, + 1812, 0, 0, - 2599, - 2291, - 1934, + 2290, + 2013, + 704, + 706, + 707, + 708, + 709, + 1855, 0, 0, - 3574, - 418, - 4616, - 420, - 4120, + 2324, + 2015, + 710, 0, - 1510, - 1862, - 762, - 1191, 0, + 2321, 0, + 2320, 0, + 717, + 712, + 713, + 714, + 715, 0, 0, - 3095, - 3484, - 421, - 505, 0, + 2355, + 2344, + 716, + 719, + 720, + 721, + 722, + 1933, 0, 0, + 2353, + 2019, + 730, 0, 0, + 2343, 0, - 423, - 425, - 999, - 597, + 2342, 0, + 723, + 725, + 726, + 727, + 728, + 1898, + 2017, + 729, + 732, + 733, + 734, + 735, + 1966, 0, 0, + 2376, + 2021, + 736, + 738, + 739, + 740, + 741, + 742, + 743, 0, 0, 0, 0, - 427, - 428, - 429, - 430, - 3914, 0, 0, + 744, + 760, + 746, + 779, + 787, + 821, + 807, 0, - 431, - 432, - 434, - 435, - 437, - 1581, - 1239, + 828, 0, - 3895, - 4677, 0, - 3603, - 3274, 0, 0, - 1507, 0, + 869, + 912, + 853, 0, - 3082, - 438, 0, + 754, 0, + 747, + 841, + 884, + 773, 0, + 767, 0, 0, 0, + 900, + 748, + 749, + 750, + 751, + 752, 0, 0, 0, 0, - 1726, - 4241, - 4357, - 703, - 440, 0, - 1043, + 867, 0, + 753, + 755, + 756, + 757, + 758, + 759, + 761, + 762, + 763, + 764, + 765, + 766, + 768, + 769, + 770, + 771, + 772, + 774, + 775, + 776, + 777, + 778, 0, 0, 0, + 896, 0, + 786, 0, + 898, + 780, 0, 0, - 2797, - 3720, - 441, - 2824, 0, - 2177, + 943, 0, 0, - 1092, - 1434, 0, - 4525, - 4317, - 4409, + 955, 0, - 443, - 3123, - 459, - 444, - 1512, + 925, + 781, + 782, + 783, + 784, + 937, 0, - 855, - 446, - 3312, - 970, + 785, 0, + 939, 0, - 2722, 0, + 941, + 859, 0, 0, + 801, 0, - 1838, - 447, - 448, - 449, - 450, - 451, - 1523, + 794, + 847, + 890, + 788, 0, + 814, 0, - 3410, 0, - 689, 0, - 453, + 906, + 789, + 790, + 791, + 792, + 820, 0, 0, 0, + 897, 0, + 793, 0, + 899, + 795, + 796, + 797, + 798, + 799, 0, - 875, - 454, - 455, - 456, - 457, - 458, - 1727, 0, - 2305, - 928, - 485, - 461, 0, 0, - 2278, 0, + 868, 0, + 800, + 802, + 803, + 804, + 805, + 806, + 808, + 809, + 810, + 811, + 812, + 813, + 815, + 816, + 817, + 818, + 819, + 822, 0, 0, - 1823, - 462, - 463, - 464, - 465, - 466, - 1932, 0, + 949, 0, 0, - 468, 0, + 961, 0, - 1303, + 931, + 823, + 824, + 825, + 826, + 938, 0, - 3423, - 469, - 4127, - 471, - 4136, + 827, 0, + 940, 0, 0, + 942, + 829, + 835, + 830, + 831, + 832, + 833, + 834, + 836, + 837, + 838, + 839, + 840, + 842, + 843, + 844, + 845, + 846, 0, + 882, + 848, + 849, + 850, + 851, + 852, 0, + 883, + 854, + 855, + 856, + 857, + 858, 0, + 865, + 860, + 861, + 862, + 863, + 864, 0, + 866, + 870, + 876, + 871, + 872, + 873, + 874, + 875, + 877, + 878, + 879, + 880, + 881, + 885, + 886, + 887, + 888, + 889, + 891, + 892, + 893, + 894, + 895, + 901, + 902, + 903, + 904, + 905, + 907, + 908, + 909, + 910, + 911, + 913, + 919, + 914, + 915, + 916, + 917, + 918, + 920, + 921, + 922, + 923, + 924, + 926, + 927, + 928, + 929, + 930, + 932, + 933, + 934, + 935, + 936, + 944, + 945, + 946, + 947, + 948, + 950, + 951, + 952, + 953, + 954, + 956, + 957, + 958, + 959, + 960, + 962, + 963, + 964, + 965, + 966, + 968, 0, + 976, 0, 0, - 2464, - 472, - 473, - 474, - 475, - 476, - 478, - 480, - 481, - 482, - 483, 0, - 3191, - 873, - 484, - 486, - 487, - 488, - 489, - 490, 0, 0, - 497, - 492, - 493, - 494, - 495, - 496, - 3810, 0, 0, + 997, + 990, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 983, + 977, 0, + 984, + 978, + 979, + 980, + 981, + 982, + 985, + 986, + 987, + 988, + 989, + 1004, 0, 0, - 604, - 2380, + 991, + 992, + 993, + 994, + 995, + 996, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1005, + 1006, + 1007, + 1008, + 1009, + 1011, + 1018, 0, - 499, - 500, - 501, - 502, - 503, - 504, - 3552, - 1954, 0, 0, - 951, - 4236, - 3402, 0, 0, 0, - 507, 0, 0, - 2868, - 2608, + 1031, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1019, 0, 0, + 1025, + 1020, + 1021, + 1022, + 1023, + 1024, + 1026, + 1027, + 1028, + 1029, + 1030, + 1032, + 1033, + 1034, + 1035, + 1036, 0, + 1038, + 1037, + 1039, + 1041, 0, 0, - 508, - 509, - 3887, - 4146, 0, 0, - 511, + 1051, 0, 0, - 2252, + 1058, + 1042, + 1043, + 1044, + 1045, + 1048, 0, - 2122, - 512, - 3117, + 1046, + 1047, + 1050, + 1049, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1059, + 1065, + 1060, + 1061, + 1062, + 1063, 0, + 1071, + 1064, + 1066, + 1067, + 1068, + 1069, + 1070, + 1072, + 1074, 0, 0, 0, - 1695, 0, - 888, 0, - 514, - 515, - 516, - 517, - 518, - 519, - 521, - 522, - 523, - 524, 0, - 1296, - 525, + 1081, + 1088, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1089, 0, 0, 0, + 1098, + 1090, + 1091, + 1092, + 1096, + 1093, + 1094, + 1095, + 1097, + 1099, + 1100, + 1101, + 1102, + 1103, + 1105, 0, 0, - 526, - 528, - 2580, 0, 0, 0, 0, - 1991, 0, 0, + 1120, + 1106, + 1112, + 1107, + 1108, + 1109, + 1110, 0, - 530, - 531, - 3472, - 786, - 3153, - 4618, - 3901, - 4217, - 2388, - 3042, - 2452, - 2697, - 533, - 2908, - 2873, - 1753, - 4083, - 1402, - 534, - 535, - 536, - 537, - 538, - 540, - 542, - 541, - 2449, + 1118, + 1111, + 1113, + 1114, + 1115, + 1116, + 1117, + 1119, + 1121, 0, - 544, - 1667, - 934, 0, - 2403, + 1128, + 1122, + 1123, + 1124, + 1125, + 1134, + 1126, + 0, 0, - 3160, 0, - 868, 0, + 1127, + 1129, + 1130, + 1131, + 1132, 1133, - 3542, - 2266, - 2186, - 545, - 546, - 548, - 4308, - 0, - 1670, - 1967, - 2289, + 1135, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1145, + 1143, 0, + 1144, + 1146, + 1148, 0, 0, 0, 0, 0, - 3487, - 549, - 3702, 0, 0, 0, - 2401, - 1428, 0, - 672, - 1045, - 551, - 4289, - 4500, - 552, - 941, - 554, - 1337, - 3724, - 2535, - 2509, - 1599, - 4665, - 779, - 1355, - 3614, - 4361, - 4597, - 3676, - 638, - 3948, - 555, - 556, - 557, - 1979, 0, 0, 0, - 558, - 559, 0, + 1289, + 1736, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1159, + 1160, + 1161, + 1162, 0, - 560, - 562, - 563, - 564, - 565, + 1170, + 1174, + 1163, + 1165, + 1166, + 1167, + 1168, 0, - 4475, - 1430, - 566, + 1172, + 1176, + 1169, + 1171, + 1173, + 1175, + 1177, + 1179, + 1180, + 1181, + 1182, + 1183, + 1185, + 1186, + 1187, + 1188, + 1189, + 1193, 0, 0, 0, + 1200, 0, - 4488, - 568, - 569, - 570, - 571, - 572, - 574, - 575, - 576, - 1804, 0, - 577, - 578, - 580, - 581, - 582, - 583, - 584, 0, 0, 0, - 4239, - 585, - 586, - 1815, - 588, - 589, - 590, - 591, - 592, - 3190, - 593, - 3819, + 1202, + 1195, 0, 0, - 2153, 0, + 1201, 0, 0, - 770, 0, 0, 0, - 2688, + 1203, + 1197, + 1199, + 1205, + 1211, + 1206, + 1207, + 1208, + 1209, + 1210, + 1217, + 1212, + 1213, + 1214, + 1215, + 1216, + 1218, + 1222, + 1224, + 1226, + 1227, + 1228, + 1229, + 1230, + 1232, + 1233, + 1234, + 1235, + 1236, + 1238, + 1239, + 1240, + 1241, + 1242, + 1244, + 1245, + 1246, + 1247, + 1248, + 1254, 0, - 595, - 596, - 598, - 599, - 600, - 601, 0, 0, + 1259, 0, - 2004, - 602, - 603, - 605, - 606, - 607, - 608, - 609, - 3435, 0, 0, - 1585, 0, 0, - 611, 0, + 1261, + 1256, 0, - 617, - 612, - 613, - 614, - 615, - 616, - 950, - 618, - 619, - 620, - 621, - 940, - 622, - 624, 0, 0, + 1260, 0, - 625, - 627, - 629, - 1208, - 630, - 631, - 632, - 633, - 634, - 3269, - 2006, 0, 0, 0, 0, - 3731, 0, - 4310, - 636, - 637, - 639, - 640, - 641, - 642, - 643, - 645, - 1170, - 1320, + 1262, + 1264, + 1266, + 1268, + 1269, + 1270, + 1271, + 1272, + 1274, + 1275, + 1276, + 1277, + 1278, + 1284, + 1286, + 1290, 0, + 1374, + 1421, 0, 0, 0, + 1564, + 1622, + 1661, + 1291, + 1297, + 1292, + 1293, + 1294, + 1295, + 1296, + 1298, + 1299, + 1300, + 1301, + 1302, + 1304, + 1306, + 1310, + 1311, + 1312, + 1313, 0, - 0, - 1832, - 647, - 648, - 649, - 650, - 651, - 0, + 1323, + 1314, 0, 0, - 2133, - 3450, - 652, - 654, - 655, - 4063, - 3782, 0, 0, - 656, - 657, - 2885, 0, + 1321, + 1316, + 1317, + 1318, + 1319, 0, + 1325, + 1320, 0, 0, 0, 0, 0, - 659, - 660, - 661, - 662, - 663, + 1322, + 1324, + 1326, + 1332, + 1334, + 1342, + 1348, + 1343, + 1344, + 1345, + 1346, + 1347, + 1354, + 1349, + 1350, + 1351, + 1352, + 1353, + 1355, + 1357, + 1358, + 1359, + 1360, + 1361, 0, 0, 0, - 2063, - 665, - 664, - 667, - 668, - 669, - 670, - 671, - 674, 0, 0, - 673, - 676, + 1368, + 1363, + 1364, + 1365, + 1366, + 1367, 0, - 4679, - 677, - 678, - 679, - 680, - 681, - 2966, - 3324, 0, 0, - 683, 0, - 4663, 0, + 1369, + 1375, + 1381, + 1376, + 1377, + 1378, + 1379, + 1380, + 1382, + 1383, + 1384, + 1385, + 1386, + 1388, + 1390, + 1396, + 1402, + 1397, + 1398, + 1399, + 1400, + 1401, + 1403, + 1404, + 1405, + 1406, + 1407, + 1409, + 1415, 0, 0, 0, 0, - 1117, - 1149, - 1567, - 1865, - 684, - 686, - 688, - 690, - 691, - 692, - 693, - 694, - 696, - 697, - 698, - 699, 0, 0, + 1452, + 1458, + 1464, + 1470, + 1410, + 1411, + 1412, + 1413, + 1414, + 1416, + 1417, + 1418, + 1419, + 1420, + 1422, + 1428, + 1423, + 1424, + 1425, + 1426, + 1427, + 1429, + 1430, + 1431, + 1432, + 1433, + 1439, + 1441, + 1447, + 1449, + 1453, + 1454, + 1455, + 1456, + 1457, + 1459, + 1460, + 1461, + 1462, + 1463, + 1465, + 1466, + 1467, + 1468, + 1469, + 1471, + 1472, + 1473, + 1474, + 1475, + 1477, + 1478, + 1479, + 1480, 0, - 3891, - 700, - 2696, - 702, + 1488, + 1481, + 1483, + 1484, + 1485, + 1486, 0, + 1490, + 1487, + 1489, + 1491, + 1501, + 1503, + 1505, + 1506, + 1507, + 1508, + 1509, + 1516, + 1511, + 1512, + 1513, + 1514, + 1515, + 1517, + 1523, + 1525, + 1527, + 1529, + 1531, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1547, + 1548, + 1549, + 1550, + 1558, + 1551, 0, + 1562, 0, 0, - 2247, - 704, - 706, - 1228, - 800, 0, - 2859, 0, 0, + 1560, + 1553, + 1554, + 1555, + 1556, + 1559, + 1557, 0, - 3278, - 711, + 1563, 0, 0, 0, 0, 0, + 1561, + 1565, + 1571, + 1566, + 1567, + 1568, + 1569, + 1570, 0, - 707, - 747, - 3266, - 0, - 0, - 4631, - 0, - 777, 0, 0, + 1596, + 1572, + 1573, + 1574, + 1575, + 1576, 0, 0, 0, - 709, + 1597, + 1578, + 1584, + 1579, + 1580, + 1581, + 1582, + 1590, + 1583, 0, - 1574, - 2565, - 710, - 1673, - 713, - 714, - 715, - 716, - 717, - 718, - 720, + 1594, 0, - 721, - 3508, 0, 0, 0, - 4626, 0, - 723, - 1205, - 3975, + 1592, + 1585, + 1586, + 1587, + 1588, + 1591, + 1589, 0, - 1965, - 2339, - 776, + 1595, 0, 0, 0, 0, 0, + 1593, + 1605, + 1606, + 1607, + 1608, + 1616, + 1609, 0, + 1620, 0, 0, 0, 0, 0, + 1618, + 1611, + 1612, + 1613, + 1614, + 1617, + 1615, 0, + 1621, 0, 0, - 724, - 2072, - 3816, 0, - 2900, - 726, 0, 0, + 1619, + 1623, + 1629, + 1624, + 1625, + 1626, + 1627, + 1628, + 1630, + 1631, + 1632, + 1633, + 1634, + 1644, + 1645, + 1646, + 1647, + 1655, + 1648, 0, + 1659, 0, 0, - 4115, - 727, - 728, - 4321, 0, 0, - 1499, - 1071, - 730, - 731, 0, + 1657, + 1650, + 1651, + 1652, + 1653, + 1656, + 1654, 0, + 1660, 0, 0, 0, - 3686, - 2394, - 2643, 0, 0, + 1658, + 1662, + 1668, + 1663, + 1664, + 1665, + 1666, + 1667, + 1669, + 1670, + 1671, + 1672, + 1673, + 1675, + 1681, 0, 0, 0, 0, - 733, - 4157, - 734, - 735, - 736, - 737, - 738, - 4197, - 740, 0, 0, 0, 0, 0, 0, - 3966, - 1159, - 741, - 742, - 743, - 744, - 745, - 746, - 749, - 2517, 0, 0, 0, - 3657, - 3893, + 1701, + 1676, + 1677, + 1678, + 1679, 0, - 1363, + 1693, + 1687, + 1680, 0, + 1691, 0, - 751, - 752, - 754, - 755, - 756, - 1867, 0, - 1168, - 757, - 758, - 760, 0, 0, 0, + 1689, + 1682, + 1683, + 1684, + 1685, 0, + 1695, + 1688, + 1686, 0, + 1692, 0, 0, - 2623, - 761, - 763, - 765, - 766, - 767, - 768, - 769, 0, - 3768, - 771, - 2350, 0, - 1289, 0, + 1690, + 1694, + 1696, + 1702, + 1703, + 1704, + 1705, 0, + 1719, + 1713, + 1706, 0, - 773, + 1717, 0, - 2914, - 774, - 775, - 778, - 780, - 781, - 782, - 783, 0, 0, 0, - 4148, - 784, - 785, - 787, - 788, - 789, - 2219, 0, + 1715, + 1708, + 1709, + 1710, + 1711, 0, + 1721, + 1714, + 1712, 0, - 790, - 791, + 1718, 0, 0, - 798, - 793, - 794, - 795, - 4643, 0, - 796, - 797, - 801, 0, 0, + 1716, + 1720, + 1722, + 1726, + 1728, + 1734, + 1735, + 1737, + 1780, + 1815, + 1858, + 1901, + 1936, + 1969, + 2253, 0, 0, - 861, - 803, - 804, - 805, - 806, - 807, - 812, 0, + 2268, + 2298, 0, 0, + 2332, + 1738, + 1744, + 2025, + 2031, + 2037, + 2043, + 2049, + 2055, + 1759, + 1765, + 2063, + 2069, + 2075, + 2081, + 2087, + 2093, + 1739, + 1740, + 1741, + 1742, 0, 0, 0, - 808, - 1914, - 0, - 2611, - 0, - 0, - 810, - 0, + 1752, + 1743, + 1750, + 1745, + 1746, + 1747, + 1748, 0, - 1432, - 3708, - 811, - 1166, 0, 0, + 1754, + 1749, + 1751, + 1753, 0, - 1769, 0, + 2023, + 1755, 0, 0, + 2024, + 1757, + 1758, + 1760, + 1761, + 1762, + 1763, 0, 0, - 814, - 841, - 815, - 817, - 818, - 819, - 820, 0, - 4659, - 823, - 822, - 821, - 4098, - 825, + 1773, + 1764, + 1771, + 1766, + 1767, + 1768, + 1769, 0, 0, - 824, - 834, - 833, - 827, 0, + 1775, + 1770, + 1772, + 1774, 0, 0, + 2061, + 1776, 0, - 2482, 0, - 3996, + 2062, + 1778, + 1779, + 1781, + 1787, 0, - 3381, - 828, - 829, - 830, - 831, - 832, - 836, - 837, - 838, - 839, - 840, - 843, - 845, - 846, - 847, - 848, 0, - 1583, - 4046, - 849, - 853, 0, 0, 0, 0, - 854, - 4005, - 851, + 1798, + 1804, + 1782, + 1783, + 1784, + 1785, + 1786, + 1793, + 1788, + 1789, + 1790, + 1791, + 1792, + 1794, + 1796, + 1797, + 1799, + 1800, + 1801, + 1802, + 1803, + 1810, + 1805, + 1806, + 1807, + 1808, + 1809, + 1811, + 1813, + 1814, + 1816, + 1822, + 2101, + 2107, + 2113, + 2119, + 2125, + 2131, + 1837, + 1843, + 2139, + 2145, + 2151, + 2157, + 2163, + 2169, + 1817, + 1818, + 1819, + 1820, 0, - 4545, 0, - 4593, - 4394, 0, + 1830, + 1821, + 1828, + 1823, + 1824, + 1825, + 1826, 0, - 2882, 0, 0, - 4672, - 852, - 856, - 857, - 858, - 859, - 860, - 1124, + 1832, + 1827, + 1829, + 1831, 0, 0, + 2099, + 1833, 0, - 2433, - 2048, 0, + 2100, + 1835, + 1836, + 1838, + 1839, + 1840, + 1841, 0, 0, 0, - 3569, + 1851, + 1842, + 1849, + 1844, + 1845, + 1846, + 1847, 0, - 863, - 864, - 866, - 867, - 4516, 0, 0, + 1853, + 1848, + 1850, + 1852, 0, 0, + 2137, + 1854, 0, 0, - 869, - 870, - 872, - 874, - 876, - 877, - 878, - 879, - 880, - 4396, - 882, - 1658, + 2138, + 1856, + 1857, + 1859, + 1865, 0, - 2361, - 2656, 0, 0, - 884, 0, - 1410, 0, 0, + 1880, + 1886, + 1860, + 1861, + 1862, + 1863, 0, - 4205, - 916, 0, - 915, - 0, - 918, - 917, 0, + 1873, + 1864, + 1871, + 1866, + 1867, + 1868, + 1869, 0, 0, 0, + 1875, + 1870, + 1872, + 1874, + 1876, + 1878, + 1879, + 1881, + 1882, + 1883, + 1884, 0, 0, 0, + 1894, + 1885, + 1892, + 1887, + 1888, + 1889, + 1890, 0, - 885, - 887, - 889, - 890, - 891, - 892, - 893, - 2837, 0, - 4562, 0, - 1926, + 1896, + 1891, + 1893, + 1895, + 1897, + 1899, + 1900, + 1902, + 1908, 0, - 895, 0, - 3048, 0, - 2627, 0, - 3696, 0, - 3645, - 896, - 897, - 898, - 899, - 900, - 902, - 903, - 904, - 905, - 1292, - 1638, - 1952, - 910, - 911, - 908, - 909, - 914, 0, - 912, - 913, - 906, - 907, + 1919, + 1925, + 1903, + 1904, + 1905, + 1906, + 1907, + 1914, + 1909, + 1910, + 1911, + 1912, + 1913, + 1915, + 1917, + 1918, + 1920, + 1921, + 1922, + 1923, + 1924, + 1931, + 1926, + 1927, + 1928, + 1929, + 1930, + 1932, + 1934, + 1935, + 1937, + 1943, 0, 0, - 947, 0, 0, - 948, - 920, - 921, - 922, - 923, - 924, - 926, 0, 0, 0, + 1957, + 1938, + 1939, + 1940, + 1941, 0, 0, 0, + 1951, + 1942, + 1949, + 1944, + 1945, + 1946, + 1947, 0, 0, 0, + 1953, + 1948, + 1950, + 1952, + 1954, + 1956, + 1958, + 1959, + 1960, + 1961, 0, - 2229, - 927, - 929, - 930, - 931, - 932, - 933, - 935, - 936, - 939, 0, 0, + 1964, + 1962, + 1963, + 1965, + 1967, + 1968, + 1970, + 1976, + 2177, + 2183, + 2189, + 2195, + 2201, + 2207, + 1991, + 1997, + 2215, + 2221, + 2227, + 2233, + 2239, + 2245, + 1971, + 1972, + 1973, + 1974, 0, 0, - 938, - 942, - 943, - 944, - 2311, 0, + 1984, + 1975, + 1982, + 1977, + 1978, + 1979, + 1980, 0, 0, - 945, - 946, 0, + 1986, + 1981, + 1983, + 1985, 0, - 949, - 952, - 953, - 955, - 957, - 959, - 961, - 966, - 967, - 968, - 969, - 963, 0, - 964, - 965, - 976, - 977, + 2175, + 1987, 0, 0, - 1014, + 2176, + 1989, + 1990, + 1992, + 1993, + 1994, + 1995, 0, 0, - 1013, - 971, - 972, - 973, - 974, - 975, - 979, - 2660, - 980, - 981, - 982, - 983, - 4640, - 984, - 1126, 0, + 2005, + 1996, + 2003, + 1998, + 1999, + 2000, + 2001, 0, 0, - 986, - 1472, 0, - 987, + 2007, + 2002, + 2004, + 2006, 0, - 4686, - 988, - 989, - 990, - 991, - 992, - 994, - 995, - 996, - 997, - 998, - 1000, - 1001, - 1002, - 1003, 0, + 2213, + 2008, 0, 0, - 2368, - 1005, - 1004, - 1007, - 1009, - 2233, - 0, - 0, - 1011, - 1012, - 1018, - 0, - 0, - 0, - 1025, - 1020, - 1021, - 1022, - 1412, - 1023, - 0, - 0, - 2799, - 4403, - 1024, - 1123, - 0, - 1119, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1027, - 0, - 1036, - 2442, - 1029, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1078, - 1030, - 0, - 0, - 3173, - 1031, - 1032, - 1033, - 1034, - 1035, - 1038, - 1039, - 1040, - 1041, - 1042, - 1044, - 1046, - 0, - 0, - 0, - 1094, - 1048, - 1049, - 1051, - 0, - 0, - 0, - 0, - 4049, - 0, - 0, - 1184, - 1052, - 1053, - 1054, - 1055, - 1056, - 0, - 3108, - 1057, - 1281, - 1059, - 1060, - 1061, - 1062, - 1063, - 1064, - 1066, - 1067, - 1068, - 1069, - 1070, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1142, - 1072, - 3991, - 0, - 1987, - 0, - 0, - 2577, - 0, - 2879, - 0, - 1074, - 1709, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1075, - 1077, - 0, - 1076, - 1079, - 1080, - 1081, - 1082, - 1083, - 0, - 3836, - 1084, - 1478, - 0, - 0, - 1086, - 1095, - 1087, - 1088, - 1089, - 1090, - 1091, - 1093, - 0, - 0, - 1109, - 1096, - 1097, - 1098, - 1099, - 1100, - 1102, - 1104, - 1105, - 1106, - 1107, - 1108, - 1111, - 4603, - 1112, - 1113, - 1114, - 1115, - 1116, - 3852, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1118, - 2021, - 0, - 0, - 3625, - 0, - 0, - 2625, - 2303, - 2658, - 0, - 2589, - 2904, - 0, - 0, - 1121, - 1122, - 0, - 0, - 0, - 1207, - 1125, - 2923, - 0, - 3373, - 0, - 1127, - 1128, - 1129, - 1130, - 1131, - 1132, - 1134, - 1135, - 1137, - 1138, - 1139, - 1484, - 1140, - 0, - 0, - 2785, - 1143, - 1141, - 2440, - 0, - 1810, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1145, - 1146, - 1151, - 0, - 0, - 0, - 0, - 1148, - 1222, - 0, - 0, - 0, - 0, - 0, - 0, - 1150, - 2414, - 0, - 0, - 3639, - 0, - 0, - 2494, - 0, - 0, - 1153, - 1154, - 1155, - 1156, - 1157, - 1158, - 1214, - 3089, - 0, - 0, - 0, - 1160, - 1161, - 1162, - 1163, - 1164, - 1165, - 1204, - 0, - 0, - 0, - 1167, - 1169, - 0, - 0, - 0, - 1183, - 1171, - 1172, - 1173, - 2506, - 0, - 0, - 0, - 1174, - 1175, - 1177, - 0, - 0, - 0, - 3127, - 0, - 0, - 0, - 1233, - 0, - 3545, - 1178, - 1179, - 1180, - 1181, - 2768, + 2214, + 2262, + 2292, + 2378, + 2026, + 2027, + 2028, + 2029, + 2030, + 2032, + 2033, + 2034, + 2035, + 2036, + 2038, + 2039, + 2040, + 2041, + 2042, + 2044, + 2045, + 2046, + 2047, + 2048, + 2050, + 2051, + 2052, + 2053, + 2054, + 2056, + 2057, + 2058, + 2059, + 2060, + 2064, + 2065, + 2066, + 2067, + 2068, + 2070, + 2071, + 2072, + 2073, + 2074, + 2076, + 2077, + 2078, + 2079, + 2080, + 2082, + 2083, + 2084, + 2085, + 2086, + 2088, + 2089, + 2090, + 2091, + 2092, + 2094, + 2095, + 2096, + 2097, + 2098, + 2102, + 2103, + 2104, + 2105, + 2106, + 2108, + 2109, + 2110, + 2111, + 2112, + 2114, + 2115, + 2116, + 2117, + 2118, + 2120, + 2121, + 2122, + 2123, + 2124, + 2126, + 2127, + 2128, + 2129, + 2130, + 2132, + 2133, + 2134, + 2135, + 2136, + 2140, + 2141, + 2142, + 2143, + 2144, + 2146, + 2147, + 2148, + 2149, + 2150, + 2152, + 2153, + 2154, + 2155, + 2156, + 2158, + 2159, + 2160, + 2161, + 2162, + 2164, + 2165, + 2166, + 2167, + 2168, + 2170, + 2171, + 2172, + 2173, + 2174, + 2178, + 2179, + 2180, + 2181, + 2182, + 2184, + 2185, + 2186, + 2187, + 2188, + 2190, + 2191, + 2192, + 2193, + 2194, + 2196, + 2197, + 2198, + 2199, + 2200, + 2202, + 2203, + 2204, + 2205, + 2206, + 2208, + 2209, + 2210, + 2211, + 2212, + 2216, + 2217, + 2218, + 2219, + 2220, + 2222, + 2223, + 2224, + 2225, + 2226, + 2228, + 2229, + 2230, + 2231, + 2232, + 2234, + 2235, + 2236, + 2237, + 2238, + 2240, + 2241, + 2242, + 2243, + 2244, + 2246, + 2247, + 2248, + 2249, + 2250, + 2254, 0, - 1182, 0, - 2776, 0, + 2284, 0, - 2818, - 1185, - 3803, - 1186, - 1187, - 1188, - 3874, 0, - 1189, - 1190, - 1192, - 1194, - 1195, - 1196, - 1197, - 3087, - 3425, - 2425, - 2781, - 2782, - 2779, - 2780, - 2778, 0, - 1201, - 2777, - 2769, - 1198, 0, 0, - 2823, 0, 0, - 2820, - 1200, - 1203, + 2370, + 2255, + 2256, + 2257, + 2258, + 2259, + 2267, 0, 0, + 2261, + 2263, + 2264, + 2265, + 2266, + 2269, 0, 0, 0, @@ -18710,1410 +18954,1825 @@ 0, 0, 0, + 2311, + 2270, + 2271, + 2272, + 2273, + 2274, + 2368, + 2279, 0, - 1223, - 1206, + 2306, + 2308, + 2331, 0, + 2391, 0, + 2360, + 2393, + 2281, + 2283, + 2285, + 2286, + 2287, + 2288, + 2289, + 2297, 0, 0, + 2291, + 2293, + 2294, + 2295, + 2296, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2310, + 2312, + 2313, + 2314, + 2315, 0, 0, 0, + 2318, + 2316, + 2317, + 2319, + 2325, + 2327, + 2384, 0, 0, 0, 0, 0, 0, - 1227, - 1209, - 1210, - 1211, - 1212, - 1213, - 1216, 0, + 2333, + 2334, + 2335, + 2336, + 2337, 0, 0, 0, + 2340, + 2338, + 2339, + 2341, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2354, + 2356, + 2362, + 2363, + 2364, + 2365, + 2366, + 2371, + 2372, + 2373, + 2374, + 2375, + 2383, 0, - 3668, - 1217, - 2275, 0, - 4212, + 2377, + 2379, + 2380, + 2381, + 2382, + 2385, + 2386, + 2387, + 2388, + 2389, + 2395, + 2398, + 2402, + 2441, + 2399, + 2400, + 2401, + 2403, 0, 0, - 1219, 0, + 2422, + 2404, 0, + 2410, 0, + 2416, + 2405, + 2406, + 2407, + 2408, + 2409, + 2411, + 2412, + 2413, + 2414, + 2415, + 2417, + 2418, + 2419, + 2420, + 2421, + 2423, 0, - 1660, - 1220, - 1221, - 4558, - 4353, + 2435, 0, + 2429, + 2424, + 2425, + 2426, + 2427, + 2428, + 2430, + 2431, + 2432, + 2433, + 2434, + 2436, + 2437, + 2438, + 2439, + 2440, + 2442, 0, + 2461, + 2474, + 2481, 0, - 1225, - 3785, - 1885, + 2506, + 2543, + 2580, + 2642, + 2605, + 2655, + 2443, 0, 0, - 1520, 0, 0, - 3067, - 1226, - 1229, - 1701, + 2449, 0, 0, - 3309, - 2997, - 4002, - 3661, + 2455, + 2444, + 2445, + 2446, + 2447, + 2448, + 2450, + 2451, + 2452, + 2453, + 2454, + 2456, + 2457, + 2458, + 2459, + 2460, + 2462, 0, + 2468, + 2463, + 2464, + 2465, + 2466, + 2467, + 2469, + 2470, + 2471, + 2472, + 2473, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2482, 0, + 2488, 0, - 4397, 0, + 2494, 0, - 4628, - 1231, - 1232, - 1234, - 1235, - 1236, - 1237, - 1238, - 1240, - 1243, - 1242, - 3847, 0, 0, 0, + 2513, + 2483, + 2484, + 2485, + 2486, + 2487, + 2489, + 2490, + 2491, + 2492, + 2493, + 2495, + 2496, + 2497, + 2498, + 2499, + 2501, + 2502, + 2503, + 2504, + 2505, + 2507, 0, 0, - 4392, + 2531, + 2537, + 2508, + 2509, + 2510, + 2511, + 2512, + 2514, + 2515, + 2516, + 2517, + 2518, + 2520, + 2521, + 2522, + 2523, + 2524, + 2526, + 2527, + 2528, + 2529, + 2530, + 2532, + 2533, + 2534, + 2535, + 2536, + 2538, + 2539, + 2540, + 2541, + 2542, + 2544, + 2550, 0, - 1247, 0, - 1245, - 1654, + 2556, + 2562, 0, 0, + 2568, + 2574, + 2630, + 2636, + 2545, + 2546, + 2547, + 2548, + 2549, + 2551, + 2552, + 2553, + 2554, + 2555, + 2557, + 2558, + 2559, + 2560, + 2561, + 2563, + 2564, + 2565, + 2566, + 2567, + 2569, + 2570, + 2571, + 2572, + 2573, 2575, - 1246, - 1248, - 0, - 0, - 0, + 2576, + 2577, + 2578, + 2579, + 2581, + 2587, 0, 0, + 2593, + 2599, + 2582, + 2583, + 2584, + 2585, + 2586, + 2588, + 2589, + 2590, + 2591, + 2592, + 2594, + 2595, + 2596, + 2597, + 2598, + 2600, + 2601, + 2602, + 2603, + 2604, + 2606, 0, 0, - 1273, - 1250, - 4695, 0, 0, - 1252, - 1605, - 1253, - 4203, - 2043, - 2363, 0, + 2612, + 2618, 0, - 3420, + 2624, + 2607, + 2608, + 2609, + 2610, + 2611, + 2613, + 2614, + 2615, + 2616, + 2617, + 2619, + 2620, + 2621, + 2622, + 2623, + 2625, + 2626, + 2627, + 2628, + 2629, + 2631, + 2632, + 2633, + 2634, + 2635, + 2637, + 2638, + 2639, + 2640, + 2641, + 2643, + 2649, + 2644, + 2645, + 2646, + 2647, + 2648, + 2650, + 2651, + 2652, + 2653, + 2654, + 2656, + 2662, + 2668, + 2674, + 2657, + 2658, + 2659, + 2660, + 2661, + 2663, + 2664, + 2665, + 2666, + 2667, + 2669, + 2670, + 2671, + 2672, + 2673, + 2675, + 2676, + 2677, + 2678, + 2679, + 2681, 0, 0, 0, + 3732, + 3775, + 3881, + 3909, + 3931, + 3991, + 4042, + 4062, + 4117, + 4165, + 4230, + 4246, + 2682, 0, 0, - 3935, - 1255, - 4451, 0, - 2077, - 4228, + 2685, + 2704, + 2753, + 2785, 0, + 2820, + 2827, + 2846, + 2895, + 2927, + 2962, + 2969, + 2683, + 2684, + 2814, 0, 0, 0, 0, - 1256, - 1258, - 1259, - 1260, - 1261, - 1262, - 1274, - 1264, - 1265, - 1266, - 1267, + 2686, 0, + 2692, 0, + 2698, + 2687, + 2688, + 2689, + 2690, + 2691, + 2693, + 2694, + 2695, + 2696, + 2697, + 2699, + 2700, + 2701, + 2702, + 2703, + 2705, 0, - 4445, - 1269, - 1268, - 2906, + 2711, 0, + 2717, 0, - 1271, + 2723, 0, + 2729, 0, + 2735, 0, + 2741, 0, + 2747, + 2706, + 2707, + 2708, + 2709, + 2710, + 2712, + 2713, + 2714, + 2715, + 2716, + 2718, + 2719, + 2720, + 2721, + 2722, + 2724, + 2725, + 2726, + 2727, + 2728, + 2730, + 2731, + 2732, + 2733, + 2734, + 2736, + 2737, + 2738, + 2739, + 2740, + 2742, + 2743, + 2744, + 2745, + 2746, + 2748, + 2749, + 2750, + 2751, + 2752, + 2754, 0, - 1535, 0, + 2760, 0, + 2766, 0, - 2783, - 1272, - 1276, - 1277, - 1278, - 1279, - 1280, - 1282, - 1283, - 1284, - 1285, - 1286, - 1288, - 1290, - 1291, - 1293, - 3557, - 3556, + 2772, 0, - 3560, - 1295, - 3525, 0, - 3524, 0, - 3523, - 3522, - 1297, - 1299, - 3319, 0, 0, 0, + 2778, + 2755, + 2756, + 2757, + 2758, + 2759, + 2761, + 2762, + 2763, + 2764, + 2765, + 2767, + 2768, + 2769, + 2770, + 2771, + 2773, + 2774, + 2775, + 2776, + 2777, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2786, 0, 0, + 2793, 0, 0, + 2800, 0, 0, - 1394, - 1300, - 1302, - 3571, + 2807, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2815, + 2816, + 2817, + 2818, + 2819, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2956, 0, 0, 0, - 1304, 0, + 2828, 0, + 2834, 0, + 2840, + 2829, + 2830, + 2831, + 2832, + 2833, + 2835, + 2836, + 2837, + 2838, + 2839, + 2841, + 2842, + 2843, + 2844, + 2845, + 2847, 0, + 2853, 0, + 2859, 0, + 2865, 0, + 2871, 0, - 3624, - 1306, + 2877, 0, + 2883, 0, + 2889, + 2848, + 2849, + 2850, + 2851, + 2852, + 2854, + 2855, + 2856, + 2857, + 2858, + 2860, + 2861, + 2862, + 2863, + 2864, + 2866, + 2867, + 2868, + 2869, + 2870, + 2872, + 2873, + 2874, + 2875, + 2876, + 2878, + 2879, + 2880, + 2881, + 2882, + 2884, + 2885, + 2886, + 2887, + 2888, + 2890, + 2891, + 2892, + 2893, + 2894, + 2896, 0, - 1336, - 1308, 0, + 2902, 0, + 2908, 0, + 2914, 0, 0, 0, - 3622, - 3889, 0, 0, - 2269, 0, - 1622, - 1309, + 2920, + 2897, + 2898, + 2899, + 2900, + 2901, + 2903, + 2904, + 2905, + 2906, + 2907, + 2909, + 2910, + 2911, + 2912, + 2913, + 2915, + 2916, + 2917, + 2918, + 2919, + 2921, + 2922, + 2923, + 2924, + 2925, + 2926, + 2928, 0, 0, + 2935, 0, 0, + 2942, 0, 0, + 2949, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2943, + 2944, + 2945, + 2946, + 2947, + 2948, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2957, + 2958, + 2959, + 2960, + 2961, + 2963, + 2964, + 2965, + 2966, + 2967, + 2968, + 2970, + 2976, + 2982, 0, 0, 0, - 1335, - 1311, - 1312, - 1314, - 1316, - 1318, - 1319, - 1321, - 1322, - 1323, - 1324, 0, 0, 0, - 2810, - 1325, - 1332, - 1327, - 1328, - 1329, - 1330, - 1331, - 1334, - 1338, - 1339, - 1340, - 1341, - 1342, - 1344, - 3240, 0, 0, - 4006, 0, - 1346, - 2690, - 2940, - 3138, 0, - 4430, + 2988, + 2971, + 2972, + 2973, + 2974, + 2975, + 2977, + 2978, + 2979, + 2980, + 2981, + 2983, + 2984, + 2985, + 2986, + 2987, + 2989, + 2990, + 2991, + 2992, + 2993, + 3139, + 3105, + 3285, + 3167, + 3067, + 3096, + 3043, + 3046, + 3049, + 3099, + 3175, + 3230, + 2995, + 3146, + 3002, + 3278, + 2996, + 4538, 0, 0, 0, - 4251, - 1347, - 1348, - 1349, - 1350, - 1354, 0, + 4543, 0, + 3005, + 3702, + 2997, + 3240, + 3033, + 3102, + 3288, + 3131, + 3261, + 2999, + 3113, + 3298, + 4100, + 3055, + 3079, + 3258, + 3058, + 3007, + 3093, + 3493, 0, 0, + 4060, 0, - 1351, 0, - 1362, - 1353, - 1356, - 1357, - 1358, - 1359, + 3582, + 3445, + 3652, 0, + 3566, + 3335, 0, 0, - 4489, - 1361, - 1360, - 1365, + 3000, + 3001, 0, 0, - 1364, - 1367, - 1369, - 3349, - 1370, - 1371, - 1372, - 1373, - 1374, - 1376, - 1379, 0, + 4059, + 3003, + 4564, + 3004, + 4545, + 3193, 0, - 1378, - 1425, - 1381, - 1383, - 1384, - 1385, - 2029, 0, - 1386, - 1387, - 2050, - 2435, - 1389, - 1782, - 2812, - 3101, - 3276, - 2109, - 3227, - 4674, 0, - 4133, - 1436, 0, 0, - 1437, + 3006, + 3657, + 4161, 0, - 1438, 0, 0, + 4163, 0, - 1390, - 1392, 0, + 3457, 0, + 3514, + 4168, + 3008, + 3009, + 4273, + 4316, + 4329, + 4076, + 4395, + 4456, + 4519, 0, 0, - 3712, + 4598, + 4618, + 4640, + 4660, + 4682, + 3011, + 3122, + 3256, 0, 0, + 3012, + 3714, 0, 0, - 3478, - 3827, - 2821, - 1439, 0, + 3075, 0, + 3293, 0, + 3549, 0, + 3392, + 3013, 0, 0, 0, 0, 0, - 1393, - 1395, - 1397, - 1398, - 1399, - 1400, - 1401, - 1403, - 1404, - 1405, - 1406, - 1407, - 1409, - 1411, - 1414, - 1413, + 3713, + 3236, 0, 0, - 1423, 0, - 1424, - 1416, - 1417, - 1418, - 1419, - 1420, - 2413, - 1421, - 1422, - 1427, - 1429, - 1431, - 1433, - 1435, - 1860, - 1441, + 3712, + 3427, + 3125, + 3128, + 3015, + 3310, + 3028, + 3394, + 3828, + 3178, + 3022, + 3872, + 3237, + 3198, + 3090, + 3110, + 3181, + 3780, + 3248, 0, - 2179, - 3151, + 3512, + 3783, + 3627, 0, - 3780, + 3077, 0, 0, - 4047, - 2683, - 4118, 0, 0, + 3265, + 3795, + 3016, + 3801, + 3017, 0, - 2207, - 1442, - 1444, - 1445, - 1446, - 1447, - 1509, - 1448, - 4611, 0, 0, - 1765, - 1450, 0, 0, + 3800, + 3052, + 3025, + 3408, + 3170, + 4590, + 3323, + 3194, + 3149, + 3414, + 3072, + 3326, + 3152, + 3526, + 3155, + 3087, + 3019, + 4688, + 4691, 0, + 4693, 0, 0, 0, - 3775, 0, - 3134, - 1451, + 3443, + 3020, + 3021, + 3857, + 3859, + 3861, 0, + 3031, + 3023, + 3863, + 3313, 0, 0, 0, 0, 0, + 3877, + 3870, + 3024, + 4576, 0, 0, 0, - 1506, - 1453, - 1454, - 1455, - 2117, 0, - 1456, - 4549, - 1502, + 3070, 0, 0, 0, - 1503, 0, + 3420, + 3306, + 3026, + 3027, + 3815, 0, 0, 0, + 3817, + 3819, 0, - 1457, - 1459, - 1460, - 1461, - 1462, - 1463, - 1465, - 1466, - 1877, - 4113, - 4380, + 3029, + 3629, + 3823, + 3825, + 3579, + 3821, 0, 0, + 3030, + 3032, + 3482, 0, + 3643, + 4004, + 3645, + 3343, + 4008, + 4006, 0, + 4011, 0, + 3034, + 3647, 0, 0, 0, - 1468, - 1880, - 1469, - 3012, + 3035, + 3061, + 3351, + 3082, + 3064, + 3354, + 3245, + 3037, + 3269, + 3158, + 3161, + 3221, + 3538, + 3184, + 3164, + 3209, + 3040, + 4260, 0, 0, + 3437, 0, + 3038, 0, 0, 0, - 1471, - 1473, - 1474, - 1475, - 1476, - 1477, - 1479, - 1480, - 1481, - 1482, - 1483, - 1486, - 1485, - 1488, - 1489, - 1490, - 2470, 0, - 1767, - 1491, - 1492, - 1494, - 1495, - 1496, - 1497, - 1498, - 1500, 0, + 3587, 0, + 3137, + 4276, + 3039, + 3504, + 3041, + 3404, 0, - 1501, - 1505, - 1508, - 1511, - 1513, - 1514, - 1515, - 1516, - 1517, - 1518, + 3601, 0, - 1519, 0, 0, + 4376, + 3042, + 3142, + 3603, + 3085, + 3044, 0, + 3144, + 4483, 0, + 4488, 0, - 1522, - 1521, - 1524, - 1525, - 1526, - 1527, - 1528, - 1530, - 1531, + 4486, 0, 0, 0, + 4492, + 3045, + 4490, 0, + 4496, 0, 0, - 2637, - 3193, 0, + 4498, + 4494, + 4500, 0, - 4091, - 1891, 0, + 3047, 0, 0, + 4504, + 3048, + 4506, + 3108, 0, - 1533, 0, + 3570, 0, + 4510, 0, 0, - 2184, - 1534, - 1536, - 1538, - 1540, - 1541, - 1543, - 1544, - 1545, - 1546, - 1547, - 1548, - 1550, - 1551, - 1552, - 1553, - 1554, - 1556, - 1557, - 1580, 0, 0, 0, + 3379, + 4516, + 3507, + 3050, + 3051, 0, + 4522, + 3367, + 3606, 0, - 1579, 0, 0, + 3441, + 3053, + 4573, 0, 0, + 3120, 0, 0, - 3060, - 1559, - 1561, - 1562, - 1563, - 1564, - 1565, - 1566, - 1568, - 1570, + 3608, + 3054, + 3056, + 3201, 0, 0, 0, 0, 0, - 4513, 0, 0, 0, + 4111, 0, - 4529, 0, + 3134, + 3057, + 3059, 0, - 4527, - 1572, - 1573, - 1575, - 4401, - 4142, - 3854, + 4151, + 3455, 0, - 3229, - 2960, + 3116, + 3655, + 4155, 0, - 2287, - 1943, - 1613, 0, 0, + 3532, + 3203, + 3477, + 4174, + 4150, 0, 0, 0, - 1577, - 1722, 0, + 3060, 0, 0, + 3565, + 4187, 0, + 4185, + 4192, 0, 0, - 1578, - 1582, + 3792, 0, + 3545, + 4196, 0, - 3268, - 1584, - 1586, - 1587, - 1588, - 1589, - 3081, - 1590, - 1592, - 1636, - 1594, - 1595, - 1597, + 3377, + 3062, + 3063, + 3585, 0, 0, 0, 0, - 2613, - 1598, - 1600, - 1601, - 1602, - 1603, - 1604, - 1606, + 3390, + 3243, 0, + 4233, + 3400, 0, + 3065, + 3066, + 3068, + 3272, + 3692, 0, - 1607, - 1609, - 4537, 0, 0, - 2254, 0, - 1611, 0, 0, - 4428, - 1612, - 1614, - 1616, - 1897, - 1617, - 1618, - 1619, - 1620, - 1621, - 1623, - 4530, 0, 0, + 3365, + 3439, + 3069, + 3071, + 3614, 0, 0, 0, 0, 0, - 1625, - 1984, - 1626, - 1628, - 3280, - 1630, - 1631, - 1632, - 1633, - 1634, - 1635, - 1637, - 1650, 0, 0, + 4644, 0, - 1646, - 1639, + 4646, 0, 0, + 3073, + 3074, 0, 0, - 1672, - 1641, - 1642, - 1643, - 1644, 0, 0, 0, - 2937, - 3683, - 1645, - 2324, 0, - 1648, 0, - 3576, 0, 0, - 3058, - 2816, 0, - 4543, - 1649, - 1652, 0, 0, + 4648, + 3076, 0, 0, 0, + 3426, + 3786, 0, + 3078, 0, 0, 0, - 3306, - 1653, - 1655, - 1657, 0, 0, 0, 0, - 1679, - 1659, - 3795, + 3787, 0, + 3788, + 3080, 0, + 4120, 0, 0, + 4125, 0, + 3337, 0, + 4130, + 3386, + 3276, + 3081, + 3083, + 3662, + 4211, 0, + 4213, + 3189, 0, + 4218, + 4220, 0, 0, + 3543, 0, 0, + 3118, + 3136, 0, 0, - 1661, - 1662, - 1664, 0, - 3635, - 1666, - 2248, 0, 0, 0, - 1668, 0, 0, - 3880, - 3663, 0, 0, + 3084, + 3086, + 3088, 0, 0, 0, 0, 0, + 3173, 0, - 1669, - 1671, - 1674, - 1675, - 1676, - 1677, - 1678, - 3620, + 3329, 0, - 1681, - 2621, - 1682, - 2245, + 4680, + 3331, 0, - 2273, 0, - 1684, - 1685, - 1687, + 4685, + 3089, + 3475, 0, 0, + 3920, + 3091, + 3923, + 3926, 0, 0, 0, + 3397, 0, - 2633, 0, + 3928, + 3934, + 3092, + 3205, 0, - 4243, - 1688, - 1690, - 1691, - 1692, - 1693, + 3349, 0, - 2370, - 1724, - 1725, 0, 0, + 4176, 0, 0, - 1723, 0, 0, 0, + 4183, 0, - 1694, - 1696, - 1697, - 1698, - 1699, - 1700, - 1702, - 1704, - 1705, - 1706, - 1707, - 2476, + 3094, + 3319, + 3095, + 4461, 0, 0, - 3467, - 2062, - 1708, - 1710, - 1712, - 1713, - 1714, - 1715, - 1717, 0, 0, + 4467, 0, 0, 0, - 1721, 0, - 1716, - 1719, 0, + 3097, 0, 0, + 3522, + 3098, + 3694, 0, 0, 0, 0, + 3100, 0, - 3558, - 1720, - 1728, - 1729, - 1730, - 1731, - 1733, - 1734, + 3573, + 3696, + 3101, + 3345, + 4013, + 3470, 0, - 1732, 0, + 4016, 0, 0, 0, 0, - 1735, - 1737, 0, + 4018, + 3103, + 3559, 0, + 3283, + 3104, 0, 0, - 2271, - 3843, 0, - 4471, - 3684, 0, - 4144, - 1738, - 1740, - 1742, - 1743, - 1744, - 1745, - 1746, - 1748, - 1749, - 1750, - 1751, - 1752, - 1754, - 1755, - 1756, - 1757, - 1758, - 1760, - 1761, - 1762, - 2406, 0, - 1763, - 1764, - 1766, - 1851, + 3233, + 4393, 0, 0, + 4398, 0, - 1844, 0, 0, 0, 0, 0, 0, - 1768, - 1770, - 1772, - 1773, - 1775, - 1776, - 1777, - 1778, - 2085, 0, 0, - 3063, - 1779, - 1780, + 3106, + 3534, + 3107, + 3109, + 3936, + 3938, 0, 0, - 1784, + 3940, + 3341, 0, - 1781, - 1783, - 2190, - 3056, 0, + 3557, + 3950, + 3111, + 3575, + 3315, + 3958, + 3381, + 3112, + 4071, + 3114, + 4080, 0, + 3495, + 4082, 0, - 1786, + 3451, + 4091, + 3530, 0, 0, - 4535, 0, - 4638, - 4426, - 2962, - 1787, - 1831, 0, 0, + 3453, + 3115, 0, 0, 0, + 4079, + 4153, + 3117, + 3119, + 3121, + 3721, 0, + 3123, 0, + 3618, + 3252, + 3124, 0, 0, 0, 0, - 1789, - 1791, - 1792, - 1793, - 1794, - 1795, - 1796, - 2014, + 3417, + 3577, + 3738, + 3295, + 3741, + 3749, + 3753, + 3755, + 3126, + 3219, + 3217, 0, - 2591, - 2754, - 2931, - 3006, - 2239, - 3167, - 1798, - 4030, - 3907, - 1799, - 1800, - 1801, - 1802, - 1803, - 1814, - 1805, + 3764, + 3759, 0, + 3127, + 3555, + 3371, + 3488, + 3553, + 3770, 0, 0, + 3772, + 3449, + 3333, + 3373, + 4420, + 3623, + 3129, + 3625, + 3308, + 3214, 0, 0, - 1806, - 1808, 0, 0, 0, - 3672, 0, 0, 0, 0, 0, 0, + 3130, + 4037, 0, 0, 0, + 4045, + 4047, 0, - 2159, - 1809, - 1811, - 1813, - 1816, - 1817, - 1818, - 1819, - 1820, - 3653, - 1822, - 1824, - 1825, - 1826, - 1827, - 1828, - 1830, - 1833, - 1834, - 1835, - 3105, + 3347, 0, 0, + 3132, + 3133, + 3135, 0, - 1836, - 1837, - 1839, - 1840, - 1841, - 1842, - 1843, - 1846, - 1847, - 1848, - 2787, 0, - 2149, - 1849, - 1850, - 1861, 0, 0, 0, 0, 0, + 4116, + 3138, + 3140, 0, 0, 0, - 1887, - 1863, - 3714, + 3406, 0, - 1866, - 1868, + 3361, + 3187, + 3215, 0, + 4074, + 4391, + 3141, 0, 0, 0, + 3688, + 3143, + 4482, 0, 0, 0, 0, 0, 0, - 1888, - 2713, 0, 0, 0, 0, - 1871, 0, + 3145, + 3704, + 4546, 0, - 4279, - 1872, - 1873, - 1874, - 1875, - 1876, - 1878, - 1882, 0, - 1881, 0, 0, 0, + 4548, 0, 0, 0, + 4558, + 4556, 0, + 3147, + 4560, + 3148, + 4611, + 3150, + 3412, + 3597, 0, - 1896, - 1884, - 1886, - 1890, - 1892, - 1895, - 1898, - 1899, - 1900, - 1901, - 1902, - 1904, - 1936, 0, 0, 0, - 1938, 0, 0, 0, - 1906, 0, - 1916, - 1908, + 4623, + 3708, + 3151, + 4654, 0, 0, 0, - 2801, 0, + 3153, + 3154, + 4665, 0, 0, - 3821, 0, - 2893, - 1909, - 1910, - 1911, - 1912, - 1919, 0, - 1918, + 3616, 0, - 1913, 0, 0, - 1937, - 1917, + 3156, + 3157, + 4302, 0, + 3463, 0, + 3159, + 3666, 0, - 1915, - 1921, - 1923, - 1925, - 1927, - 1928, - 1929, - 1930, - 1931, - 1933, 0, + 3191, 0, 0, + 3250, + 3160, + 3321, + 3589, + 3669, + 3591, + 3593, + 3162, + 3595, 0, + 3418, 0, + 3357, 0, + 4314, + 3163, + 4347, + 3465, + 3207, 0, - 1951, - 1935, - 1940, - 1942, - 1944, - 3897, - 2257, 0, 0, - 2685, + 4352, 0, 0, 0, - 1946, - 1947, - 3840, - 3567, + 3165, + 3224, + 4356, 0, - 2958, 0, + 3359, + 3166, + 4430, + 4436, + 3551, 0, + 4442, + 4432, 0, 0, - 1949, - 3225, - 1950, - 1953, - 1955, - 1956, - 1958, - 1959, - 1960, - 1961, - 2335, - 2669, - 2000, - 2001, - 1998, - 1999, - 1997, 0, - 1995, - 1996, - 2008, - 2009, - 1964, + 4434, + 4438, + 3168, + 4446, + 4440, + 3226, + 3169, + 4444, 0, - 1963, + 4445, + 3171, 0, 0, - 1962, - 1966, - 1968, - 1986, 0, + 3369, 0, 0, 0, - 1970, - 1972, - 1973, - 1974, - 2635, 0, - 1975, - 2299, - 1978, 0, 0, - 1976, - 1977, 0, 0, 0, 0, + 4588, + 3172, + 3174, + 3274, 0, - 1990, - 1981, - 1980, - 1983, - 1985, - 1988, 0, + 3176, + 4535, + 3234, + 3305, 0, 0, - 3394, - 1989, - 1992, - 1994, - 2003, - 2005, - 2007, - 2011, - 2013, - 2015, - 2016, - 2017, - 2018, - 2020, 0, + 3177, + 3842, 0, 0, + 3846, + 3635, + 3267, 0, 0, - 2019, - 2022, - 2024, - 2025, - 2026, - 2027, - 4061, - 3801, - 4344, - 4343, - 4342, - 2028, - 4338, 0, - 4337, - 4336, - 4335, - 4334, 0, - 4379, - 4378, + 3637, 0, 0, - 4371, - 2032, - 2031, + 3179, + 3836, + 3854, + 3197, 0, - 2030, 0, 0, 0, 0, 0, - 2039, - 2034, - 2035, - 2036, - 2037, - 2038, - 4329, + 3180, + 3182, 0, + 3965, 0, 0, + 3905, + 3977, 0, + 3480, + 3982, + 3254, 0, + 3984, + 3986, 0, - 2814, + 3382, + 3183, + 3388, 0, 0, + 3185, 0, - 2041, 0, + 3541, 0, - 3079, - 2042, - 2044, + 3599, 0, + 3561, + 3301, + 3186, + 4387, 0, 0, 0, @@ -20123,78 +20782,63 @@ 0, 0, 0, - 2087, - 2365, - 2046, - 2047, - 2049, - 2097, 0, 0, 0, 0, + 3188, + 3190, + 3192, 0, + 4304, + 3447, 0, + 3212, 0, 0, + 3228, + 3486, 0, + 3524, + 3422, + 4608, 0, + 3510, + 3195, + 3411, + 3196, + 3903, 0, + 3907, + 3431, 0, - 2051, - 2053, - 2054, - 2055, - 2056, - 2057, - 2059, - 2061, - 2064, - 2066, - 2067, - 2069, - 2071, - 3878, 0, + 3199, 0, + 3915, 0, 0, 0, + 3913, + 3912, 0, + 3200, 0, + 3639, + 3492, 0, - 2073, - 2074, - 2076, - 2089, 0, - 2078, - 2080, - 2081, - 2082, - 2083, - 2084, - 2086, - 2088, - 2091, - 2092, - 2093, - 2094, 0, 0, 0, - 3400, - 2095, - 2096, - 2099, - 2100, - 2101, - 2102, - 2103, - 2105, 0, 0, 0, + 3640, + 3202, + 3204, + 3206, + 3264, 0, 0, 0, @@ -20202,80 +20846,60 @@ 0, 0, 0, - 2222, - 2107, - 2108, - 2110, 0, - 2929, - 2112, - 2113, - 2114, - 2115, - 2116, - 2157, - 2158, 0, - 2161, 0, 0, 0, - 2156, + 3208, + 3683, 0, 0, + 3210, + 3685, + 3211, + 3213, 0, + 3572, + 3216, + 3218, 0, - 2118, - 3219, + 3584, + 3297, 0, 0, - 2120, + 3220, + 3222, 0, 0, + 3677, 0, 0, 0, + 3679, 0, 0, 0, + 3536, 0, - 2833, - 2504, - 2121, - 2124, + 4327, + 3223, + 3225, + 3227, + 3229, 0, 0, + 3472, + 3698, 0, 0, + 3700, 0, - 2123, - 2126, - 2128, - 2129, - 2130, - 3428, - 3754, + 3547, 0, 0, - 2131, - 2132, - 2134, - 2136, - 2137, - 2138, - 2139, - 2140, - 3777, - 2141, - 2142, - 2144, - 2145, - 2146, - 2147, - 2148, - 2150, - 2152, - 2189, + 3231, + 3232, 0, 0, 0, @@ -20285,88 +20909,53 @@ 0, 0, 0, - 2155, + 4537, + 3605, 0, 0, 0, 0, - 2154, - 2160, - 2163, - 2164, - 2165, - 2166, - 2167, 0, + 3235, + 3886, 0, 0, - 2170, - 2169, - 2172, - 2173, - 2174, - 2175, + 3888, 0, - 4233, - 4454, - 3665, - 3666, 0, - 3664, 0, 0, + 3563, 0, - 3667, + 0, + 0, + 3893, + 3895, + 3238, + 3897, + 3239, 0, 0, 0, 0, - 2176, - 2232, 0, - 2178, - 2180, - 2182, - 3136, - 2183, - 2185, - 2187, 0, + 3430, + 3241, 0, - 3185, - 2188, - 2191, - 2193, - 2202, - 2201, - 2204, - 2203, - 2197, 0, - 2200, - 2367, - 2196, - 2195, 0, - 2238, - 2237, 0, 0, - 2236, - 2199, - 2206, - 2208, - 2210, - 2211, - 2212, - 2213, - 2214, - 2216, - 2218, 0, + 3989, + 3641, 0, 0, + 3999, 0, + 3424, + 3242, 0, 0, 0, @@ -20374,601 +20963,317 @@ 0, 0, 0, - 2235, - 2221, - 2220, - 2224, - 2225, - 2226, - 2227, - 2228, - 2230, - 2231, - 2234, - 2240, - 2241, - 2242, - 2871, 0, - 2243, - 2244, - 2246, - 2249, - 2251, 0, + 3399, + 3244, 0, 0, - 2256, - 2253, - 2255, - 4135, - 2258, - 4372, - 2762, 0, + 4229, + 4249, + 4254, 0, - 3000, - 2260, - 2261, - 2262, - 2263, - 2264, - 2265, - 2267, - 2268, - 2270, - 2272, + 3461, + 3291, + 3246, 0, 0, 0, 0, - 2286, - 2274, 0, - 2326, - 2667, - 2276, - 2277, - 2279, - 2280, - 2281, - 2282, - 2283, - 2957, 0, - 2956, + 3502, + 3247, + 3249, + 3251, + 3723, 0, 0, 0, + 3253, + 3255, + 3257, + 4140, 0, + 4148, 0, - 2948, - 2285, - 2288, - 2290, - 2292, - 2294, - 2295, - 2296, - 2297, - 2298, - 2300, - 2302, - 2304, - 2306, - 2307, - 2308, - 2309, - 2310, - 2312, - 2313, - 2315, - 2317, - 2318, - 2319, - 2320, - 2321, - 2322, - 2323, - 2325, - 2328, - 2329, - 2330, - 2331, + 3281, 0, 0, + 4145, + 3259, 0, - 3651, - 3273, - 2332, - 2334, + 3499, + 3260, + 4147, + 3648, 0, + 4053, + 3262, 0, + 3433, 0, - 2930, - 2336, - 2338, - 2340, - 2342, - 3502, - 2343, - 2344, - 2345, - 2346, - 2347, - 2349, - 2731, - 2351, - 2352, - 2354, - 2355, - 2356, - 2357, - 3408, - 3730, - 2358, - 4346, + 0, + 3317, + 0, + 3650, + 3263, + 3266, 0, 0, 0, - 2360, - 2362, - 2364, - 2366, - 2369, - 2373, 0, 0, - 2372, - 2371, - 2376, 0, + 3794, + 3581, 0, 0, - 2375, - 3704, 0, + 3268, + 3270, + 4286, 0, 0, + 4289, 0, 0, - 2378, - 2379, - 2381, - 2382, - 2383, - 2384, - 2385, - 2387, - 2389, - 2390, - 2391, - 2392, - 2393, - 2395, - 2396, - 2397, - 2398, - 2399, - 2400, - 2402, - 2404, - 2405, - 2407, - 2408, 0, - 2411, + 4293, + 3271, + 3273, + 4534, 0, 0, 0, 0, 0, - 2412, - 2410, - 2415, - 2416, - 2417, - 2418, - 2419, - 2480, - 2421, 0, - 3065, - 2422, - 2424, - 2426, - 2428, - 2429, - 2430, - 3054, 0, - 2431, - 3432, - 2432, 0, 0, + 3275, + 3277, + 4132, + 3363, + 3568, 0, - 3753, - 2434, - 2436, - 2438, 0, + 3339, 0, 0, + 4411, 0, + 3279, + 3280, 0, 0, 0, 0, - 4503, - 2439, - 2441, - 2443, - 2444, - 2445, - 2446, - 2447, - 2448, - 2450, - 2451, - 2453, - 2454, - 2455, - 3750, 0, + 3706, + 3282, + 4028, 0, + 3284, + 3963, 0, - 2456, - 3919, 0, 0, - 2457, - 2459, - 2460, - 2461, - 2462, - 2463, - 2465, - 2466, - 2467, - 2468, - 2469, - 2473, 0, 0, + 3303, + 3690, + 4417, + 4415, 0, + 4422, 0, - 2472, - 2471, 0, + 3286, + 3287, + 4426, + 4026, 0, + 4021, + 4029, + 3384, + 4031, 0, - 3832, - 2475, - 2477, - 2481, - 2479, - 2483, - 2484, - 2485, - 2486, - 2487, - 2489, - 2490, - 2491, - 2492, - 2493, - 2495, - 2496, - 2497, - 2498, - 2499, - 2551, - 2501, - 2508, + 3289, 0, + 4039, 0, - 2503, - 2541, + 4033, + 3290, 0, 0, 0, 0, - 2505, - 4102, - 2507, - 2510, - 2511, - 2512, - 2513, - 2514, - 2516, 0, 0, 0, 0, + 4041, + 3292, + 3294, + 3740, 0, 0, + 3748, 0, + 3296, 0, 0, - 2564, - 2518, - 2520, - 2522, - 2523, - 2524, - 2525, - 2827, 0, + 3469, + 3484, 0, - 3797, - 2526, - 2527, - 3942, - 4265, - 4298, 0, - 2529, 0, + 4093, 0, 0, - 3359, - 2530, - 2531, - 2532, - 2533, - 2534, - 2536, - 2537, - 2538, - 2539, - 2540, - 2543, - 2544, - 2546, - 2547, - 2548, - 2549, - 2550, - 2553, - 2567, - 2917, + 3299, 0, - 2704, + 3497, + 3300, 0, 0, 0, - 3584, - 2554, - 2555, - 2556, - 2557, - 2562, - 2561, + 3654, 0, - 2563, 0, 0, 0, 0, 0, - 2558, - 2560, - 2566, - 2568, - 2569, - 2570, - 2571, - 2573, 0, 0, - 2574, + 4098, + 4346, 0, 0, 0, - 2572, - 2610, + 3302, + 4345, + 3304, + 3509, 0, 0, + 3307, + 3309, 0, 0, - 2576, - 2578, - 2579, - 2581, - 2583, - 3744, - 2584, - 2585, - 2586, - 2587, - 2588, - 2590, - 2592, - 2593, - 2594, - 2595, - 4059, - 3125, - 3459, - 2596, 0, 0, + 3779, + 3490, + 3516, 0, + 3806, + 3311, 0, + 3809, 0, - 3767, 0, + 3804, + 3811, + 3375, 0, 0, 0, - 3719, + 3813, + 3312, 0, 0, - 3718, - 2598, - 2600, - 2602, 0, 0, 0, + 3808, + 3314, + 3316, + 3318, + 3320, + 3322, + 4596, 0, + 3324, + 4601, + 3325, + 3327, + 3328, + 3330, 0, 0, - 2615, - 2603, - 2604, - 2605, - 3296, 0, - 2606, - 2607, - 2609, - 2612, - 2614, - 2616, - 2617, - 2618, - 2619, - 2620, - 2622, - 2624, - 2626, - 2628, - 2629, - 2630, - 2631, - 2632, - 2634, - 2636, 0, 0, 0, 0, - 2671, - 2638, - 2639, - 2640, - 2641, - 2642, - 2644, - 2645, - 2646, - 2647, - 2649, - 2648, - 2651, - 2652, - 2653, - 3572, + 3529, + 3332, + 3334, + 3336, + 4129, 0, - 2964, - 2654, - 2655, - 2657, - 2659, 0, 0, 0, + 3338, + 3340, + 3342, + 3344, + 3346, + 3348, 0, 0, + 4049, + 3659, + 3350, + 3352, 0, + 3660, 0, 0, + 4205, 0, 0, - 2687, - 2661, - 2662, - 2663, - 2664, - 2665, - 2666, - 2668, - 2674, + 3435, + 3518, + 4200, 0, - 2675, 0, 0, - 2670, - 2673, - 2677, - 2678, - 2679, - 2680, - 2681, - 2682, - 2684, - 2686, - 2689, - 2691, - 2692, - 2693, - 2694, - 2695, + 3353, + 3459, 0, - 2703, - 2698, - 2699, - 2700, - 3961, + 3664, + 0, + 4237, + 4239, + 3402, + 4241, + 3355, + 3520, 0, 0, + 4244, + 4243, 0, - 2701, - 2702, 0, 0, - 2710, - 2705, - 2706, - 2707, - 2708, - 2709, - 2712, - 2714, - 2715, - 2716, - 2717, - 2718, - 3326, - 2720, - 2721, - 2723, - 2724, - 2725, - 2726, - 2729, - 2728, + 3356, + 3358, + 3360, + 4384, 0, - 2730, 0, 0, 0, 0, 0, - 2727, - 2732, - 2734, - 2735, - 3799, - 2737, - 2739, - 2740, - 2741, - 2742, - 2743, - 2744, - 2746, - 2747, - 2748, - 2749, - 4180, - 4425, - 2750, - 4654, - 4415, 0, 0, 0, @@ -20977,105 +21282,66 @@ 0, 0, 0, - 2752, + 3362, + 3364, 0, 0, - 4287, - 2753, - 2755, - 2756, - 2757, - 3355, 0, - 2758, - 2759, + 3479, + 3366, + 3368, + 3370, + 3372, + 3374, + 3376, + 3378, + 3380, 0, 0, - 2761, - 2760, - 2763, - 2764, - 2765, - 2766, - 2767, - 2771, - 2772, - 2773, - 4355, - 2774, - 2775, - 2784, - 2789, 0, 0, - 2786, - 2788, - 3029, - 2791, - 2792, - 2793, - 2794, - 2795, - 4350, - 2796, 0, - 4347, 0, 0, 0, 0, 0, - 4345, - 2798, 0, 0, + 3506, + 3383, 0, 0, 0, + 3988, + 3385, + 3387, + 3389, + 3391, 0, 0, 0, 0, + 4228, + 3393, + 3631, 0, 0, 0, - 2826, - 2807, 0, + 3832, + 3633, + 3834, 0, - 2800, - 2802, - 2803, - 2804, - 2805, - 2806, - 2809, - 2811, - 2813, - 2815, - 2819, - 2817, - 2822, - 2825, - 2828, - 2829, - 2832, 0, 0, - 2831, - 2834, - 2836, 0, 0, 0, 0, - 2843, - 2838, - 2839, - 2840, - 2841, - 2842, - 2845, + 3395, + 3396, + 4610, 0, 0, 0, @@ -21083,260 +21349,175 @@ 0, 0, 0, + 3398, + 3401, + 3403, + 4375, 0, - 2846, - 2848, - 2849, - 2850, - 2851, 0, - 3519, - 3203, - 2852, 0, 0, + 3405, + 3407, + 3409, 0, 0, - 2863, - 2854, - 2856, - 2858, 0, + 4586, 0, 0, 0, 0, 0, + 4583, + 3410, 0, 0, 0, + 4582, + 3413, + 4632, + 3415, + 4634, + 3710, 0, + 3467, 0, - 2903, - 2860, - 2862, - 2865, - 2867, - 2869, - 3232, - 2870, - 2872, - 2874, - 2875, - 2876, - 2877, - 2878, - 2880, - 2881, - 2883, 0, - 2884, - 2886, - 2887, - 2888, - 2889, - 2890, - 2899, 0, 0, 0, - 2892, - 2894, - 2895, - 2896, - 2897, - 2898, - 2901, 0, 0, 0, + 3610, + 3612, + 3416, + 3419, + 3421, + 3423, + 3425, + 3724, 0, + 3473, 0, 0, 0, 0, - 4384, - 2902, - 2905, - 2907, - 2909, - 2910, - 2911, - 2912, - 2913, - 2915, - 2916, - 2918, - 2919, - 2920, - 2921, - 2922, - 2924, - 2925, - 2926, - 2927, - 2928, - 2932, - 2933, - 2934, - 2935, + 3726, 0, - 3601, - 3899, - 2968, - 2969, + 3728, 0, 0, + 3730, + 3428, + 3620, + 3429, + 3432, + 3434, + 3436, + 3438, + 4459, 0, - 2936, - 2939, + 4460, 0, 0, - 2938, - 2941, - 2942, - 2943, - 2944, - 2945, - 2947, - 2950, - 2951, - 2952, - 2953, - 3328, - 2954, - 2955, - 2959, - 3551, 0, 0, 0, 0, 0, 0, + 3440, + 3442, + 3444, + 3446, + 3448, + 3450, + 3452, + 3454, 0, 0, 0, 0, - 2961, - 2963, - 2965, - 2967, - 2971, - 2972, - 2973, - 2974, - 2975, - 2977, - 2978, - 2979, - 2980, - 3302, - 2991, - 2992, 0, 0, - 2994, + 4090, + 3456, + 3458, + 3501, 0, - 2993, 0, - 2981, - 2983, - 2984, - 2985, - 2986, - 2987, + 3460, + 3462, + 3464, + 3466, + 3468, + 3471, + 3474, + 3476, + 3478, + 3481, + 3483, 0, - 2988, - 2990, - 2996, 0, 0, + 4001, 0, - 2999, - 2998, - 3001, - 3002, - 3003, - 3004, - 3005, - 3007, - 3008, - 3009, - 3331, - 3010, - 3980, - 3674, - 3020, 0, 0, + 4002, 0, + 4003, + 3485, 0, 0, 0, 0, 0, 0, - 3011, - 3014, - 3015, - 3016, - 3017, - 3018, - 3019, - 3022, - 3024, - 3025, - 3026, - 3973, - 3733, - 3337, - 3027, - 3028, - 3030, - 3031, - 3032, - 3033, - 3034, - 3035, 0, - 3036, + 4099, + 3487, + 3489, + 3803, 0, 0, 0, 0, 0, - 3037, - 3039, - 3041, - 3043, - 3044, - 3045, - 3046, - 3047, - 3049, - 3050, - 3051, - 3052, - 3053, - 3097, 0, 0, 0, + 3491, + 3494, + 3496, + 3498, + 3500, + 3503, + 3687, + 0, 0, 0, 0, 0, 0, + 3505, + 4371, + 3508, + 3511, + 3707, + 3513, + 3515, + 3517, + 3519, + 3521, + 3523, + 3525, + 4656, + 3527, 0, 0, - 3055, - 3057, - 3059, - 3062, - 3064, - 3066, - 3104, 0, 0, 0, @@ -21344,154 +21525,73 @@ 0, 0, 0, + 4658, + 3528, + 3531, + 3533, + 3535, 0, 0, 0, 0, - 3068, - 3637, - 4170, - 3070, - 3578, - 3071, - 3072, - 3073, - 3074, - 3075, - 3077, - 3078, - 3080, - 3083, - 3085, - 3086, - 3088, - 3090, - 3091, - 3092, - 3093, - 4028, - 3094, - 3096, - 3099, - 3100, - 3103, + 3689, + 3537, + 3539, 0, 0, - 3231, 0, - 3102, - 3107, - 3106, - 3109, - 3110, - 3112, - 3113, - 3114, - 3115, - 3116, - 3118, - 3119, - 3120, - 3121, - 3122, - 3124, - 3295, - 3126, 0, 0, 0, - 3133, - 3128, - 3129, - 3130, - 3131, - 3132, - 3135, - 3137, - 3139, - 3140, - 3141, - 3142, - 3143, 0, 0, 0, - 4457, + 3681, + 3540, + 3542, + 3544, + 3546, + 3548, + 3550, 0, - 4464, 0, - 4456, - 3145, - 3146, - 3147, - 3148, - 3150, 0, 0, 0, 0, 0, - 3149, - 3159, 0, 0, 0, 0, + 3757, + 3552, + 3554, + 3769, + 3766, 0, - 3152, - 3154, - 3155, - 3156, - 3157, - 3158, - 3161, - 3162, - 3164, - 3166, 0, 0, + 3556, + 3558, + 3560, + 4020, + 4342, 0, 0, - 3224, 0, + 3562, + 3564, + 3567, + 4566, 0, - 3221, - 3168, - 3169, - 3170, - 3787, 0, - 3171, - 3172, - 3174, - 3175, - 3176, - 3177, - 3178, - 3180, - 3182, - 3184, - 3186, - 3188, - 3189, - 3192, - 3194, - 3196, - 3198, - 3199, - 3200, - 3201, - 3202, - 3204, - 3218, + 3569, + 3571, + 3574, + 3576, + 3578, 0, - 3206, - 3208, - 3209, - 3210, - 3211, - 3212, - 4505, 0, 0, 0, @@ -21500,185 +21600,134 @@ 0, 0, 0, - 3214, - 3215, - 3217, - 3220, - 3223, - 3226, - 3265, 0, 0, - 3228, - 3230, - 3233, - 3235, - 3236, - 3237, - 3238, 0, - 3838, - 3264, + 3622, + 3580, 0, + 3827, + 3583, + 3586, + 3588, + 3590, 0, + 3668, + 3672, 0, 0, - 3263, - 3262, 0, 0, 0, - 3239, - 3241, - 3242, - 3243, - 3244, - 3245, + 3673, 0, - 3251, - 3247, - 3248, - 3250, - 3253, - 3496, - 3256, - 3257, - 3258, - 3259, - 3260, - 3261, - 3267, - 3270, - 3272, - 3275, - 3277, 0, 0, 0, 0, 0, + 3674, + 3592, + 3594, + 3675, + 3676, + 3596, + 3598, + 3600, + 3602, + 3604, + 3607, + 4575, 0, 0, - 3842, - 3279, - 3281, - 3282, - 3283, - 3284, - 3285, - 3287, - 3289, - 3290, - 3291, - 3292, - 3293, - 3294, - 3300, - 3301, 0, - 3304, 0, 0, 0, 0, 0, - 3297, - 3321, 0, 0, 0, + 3609, + 4639, 0, 0, - 3299, - 3303, - 3305, - 3308, 0, 0, 0, 0, 0, - 3307, 0, 0, - 3311, - 3310, - 3313, - 3314, - 3315, - 3316, - 3318, 0, 0, - 3317, - 3320, - 3323, - 3325, - 3327, - 3329, - 3330, - 3333, - 3332, - 3335, - 3334, - 3336, 0, - 3339, + 3611, + 3613, + 3615, + 4643, + 3617, + 3619, + 3621, + 3778, 0, - 3341, - 3340, - 3371, - 3379, - 4692, + 3624, + 3626, + 3628, 0, 0, - 3380, - 3338, - 4468, 0, 0, 0, - 3348, 0, 0, 0, + 3785, + 3822, + 0, + 0, + 0, + 3630, + 3632, + 3634, + 3636, + 3638, + 0, + 0, + 0, + 3849, + 3642, + 3644, + 3646, + 3649, + 3651, + 4058, + 3653, 0, - 3372, - 3343, - 3344, - 3345, - 3346, - 3347, - 3350, - 3351, - 3352, - 3353, - 3354, - 3406, - 3405, 0, 0, 0, 0, - 3407, 0, 0, 0, 0, - 3356, - 3416, - 3358, 0, - 4528, - 3360, - 3361, - 3362, - 3363, - 3397, - 3398, + 4073, + 3656, + 4154, + 3658, + 3661, + 4210, 0, 0, - 3399, + 3663, + 3665, + 3667, + 3671, + 3670, + 3678, 0, 0, 0, @@ -21686,365 +21735,263 @@ 0, 0, 0, - 3364, - 3366, - 3367, - 3368, - 3369, 0, - 3982, - 4257, - 3370, 0, + 4319, 0, 0, 0, 0, + 4320, + 3680, + 3682, 0, 0, 0, 0, 0, - 3396, - 3374, - 3375, - 3376, - 3377, - 3378, - 3382, - 3383, - 3384, - 3385, - 3386, - 3388, - 3389, - 3391, - 3393, - 3395, - 3401, - 3403, - 3404, - 3422, - 3409, - 3411, - 3412, - 3413, - 3414, - 3415, - 3418, + 4335, 0, 0, + 4336, + 4358, 0, 0, 0, 0, 0, 0, + 3684, + 3686, 0, 0, 0, + 4359, + 3691, + 3693, + 3695, + 3697, + 3699, + 3701, + 3703, + 3705, + 3709, + 3711, + 3715, + 3717, + 3850, + 3944, + 3969, + 4201, + 4267, + 3973, + 4463, + 4567, + 3760, + 3954, + 3718, 0, - 4661, - 3419, - 3421, - 3424, - 3426, 0, 0, + 3743, + 3735, 0, + 4553, 0, - 3427, - 3429, - 3430, + 3789, + 3797, + 3719, + 3720, + 3722, + 3725, + 3727, + 3729, + 3731, + 3733, 0, + 3746, 0, - 3431, + 3767, + 3734, + 3736, + 3737, + 3739, + 3742, + 3744, + 4198, 0, - 3434, + 3751, + 3745, + 3747, 0, - 3441, - 3433, - 3436, - 3437, - 3438, - 3439, - 3481, - 3440, - 3443, - 3445, - 3446, - 3447, - 3448, - 3449, - 3452, - 3453, - 3454, - 3455, - 3456, - 3458, - 4004, - 3460, - 3462, - 3463, - 3464, - 3465, - 3466, - 3468, + 4523, + 3750, + 3752, + 4069, 0, 0, - 3469, - 3489, - 3471, - 3473, - 3474, - 3475, - 4588, + 4070, 0, + 3754, + 3756, 0, 0, - 3476, - 3480, 0, 0, - 3477, - 3479, - 3486, 0, 0, 0, + 3758, + 3761, + 4615, 0, - 3483, - 3485, - 3488, - 3491, - 3493, - 3495, - 3497, - 3498, - 3499, - 3500, - 3501, - 3503, - 3504, - 3505, - 3506, - 3507, - 3510, + 4625, + 4636, 0, 0, 0, - 3509, - 3512, - 4579, 0, 0, + 4651, + 4613, 0, 0, 0, 0, - 4551, - 4291, - 3513, - 3514, - 3515, - 3516, - 3518, - 3517, - 3520, 0, 0, 0, - 3521, 0, + 3762, + 3763, + 3765, + 3768, + 3771, + 3773, 0, 0, 0, 0, - 3541, - 3527, - 3529, - 3530, - 3531, - 3532, - 3533, - 3535, - 3536, - 3537, - 4109, + 3774, + 3776, + 3777, + 3781, + 3782, + 3784, + 3790, + 3791, + 3793, 0, - 3538, - 3834, - 3539, 0, 0, 0, - 3540, 0, 0, + 4195, 0, 0, 0, - 3555, - 3543, - 3544, - 3546, - 3547, - 3548, - 3549, - 3550, - 3553, - 3554, - 3559, - 3562, - 3563, - 3564, - 3565, - 3566, - 3568, - 3570, - 3630, - 3629, 0, 0, + 4194, + 3796, + 3798, + 3799, + 3802, + 3805, + 3807, + 3810, + 3812, + 3814, + 3816, + 3818, + 3820, + 3824, + 3826, + 3829, 0, 0, - 3632, 0, 0, 0, 0, - 3573, - 3575, - 3577, - 3579, - 3580, - 3581, - 3582, - 3583, - 3585, - 3586, - 3587, - 3588, - 3599, - 3600, + 3844, 0, 0, - 3589, 0, + 3838, 0, 0, + 3840, + 3830, + 3831, + 3833, + 3835, + 3837, + 3839, + 3841, + 3843, + 3845, + 3848, + 3847, + 3851, 0, + 3865, 0, 0, + 3890, 0, - 3638, - 3591, - 3592, - 3594, - 3595, - 3596, - 3597, - 3598, - 3636, + 3899, 0, + 3917, + 3852, + 3853, + 3855, 0, - 3633, - 3634, 0, 0, 0, + 3856, + 3858, + 3860, + 3862, + 3864, + 3866, 0, 0, - 3602, - 3604, - 3606, - 3607, - 3608, - 3609, - 3610, - 3612, - 3613, - 3615, - 3616, - 3617, - 3618, - 3619, - 3621, - 3623, - 3626, - 3631, 0, + 3868, + 3867, + 3869, + 3871, + 3873, + 3875, 0, 0, - 3628, - 3640, - 3641, - 3642, - 3643, - 3682, - 3644, - 3646, - 3647, - 3648, - 3649, - 3650, - 3654, 0, + 3879, 0, - 3652, - 3656, - 3658, - 3660, - 3662, - 3669, - 3671, - 3673, - 3675, - 3677, - 3678, - 3679, - 3680, - 3681, - 3685, - 3688, - 3689, - 3690, - 3691, 0, - 4263, - 3692, - 3694, - 3695, - 3697, - 3698, - 3699, - 3700, - 3701, - 3703, - 3705, - 4515, - 3707, 0, 0, - 4514, + 4400, + 3874, + 3876, + 3878, + 3880, + 3882, + 3884, + 3883, + 3885, + 3887, + 3889, + 3891, + 3892, + 3894, + 3896, + 3898, 0, - 4512, 0, - 4524, - 3709, - 3711, - 3713, - 3716, - 3717, - 3721, - 3723, - 3725, - 3726, - 3727, - 3728, - 3729, - 3732, - 3734, 0, 0, 0, @@ -22054,20 +22001,21 @@ 0, 0, 0, - 3764, - 3736, - 3737, - 3738, - 3739, - 3740, - 3742, + 3902, + 3900, + 3901, + 3904, + 3906, + 3908, + 3910, + 3911, + 3914, + 3916, + 4136, 0, 0, 0, 0, - 4510, - 4304, - 4285, 0, 0, 0, @@ -22075,110 +22023,116 @@ 0, 0, 0, - 4539, - 3743, - 3745, - 3746, - 3747, - 3748, - 3749, - 3751, - 3752, - 3756, - 3755, - 3758, - 3759, - 3761, - 3763, - 3766, - 3770, - 3771, - 3772, - 3773, - 3774, - 3776, - 3778, 0, - 3779, - 3781, - 3783, - 3784, - 3786, - 3794, - 3793, - 3792, + 0, + 3918, + 3919, + 0, + 3922, + 3921, + 3925, + 0, + 0, + 3924, + 3927, + 3929, + 3930, + 3932, + 0, 0, 0, + 3942, + 3948, 0, 0, - 3788, - 3800, 0, - 3833, - 3790, - 3791, - 3796, - 3798, - 3802, 0, + 3967, 0, + 3980, + 3933, + 3935, + 3937, + 3939, + 3941, + 3943, + 3945, 0, + 3960, 0, - 3809, - 3804, - 3805, - 3806, - 3807, - 3808, - 3811, - 3812, - 3813, - 3814, - 3815, - 3817, - 3818, - 3820, - 3822, - 3823, - 3824, - 3825, - 3826, - 3828, 0, + 3996, 0, - 3829, - 3831, - 3835, - 3837, - 3856, 0, 0, 0, - 3853, + 4023, + 3946, + 4258, + 3947, + 3949, + 3951, 0, 0, + 3952, 0, 0, + 3953, + 4667, + 4672, + 4675, + 3955, 0, 0, - 3839, - 3857, + 4695, + 3956, + 3957, + 3959, + 3961, + 3962, + 3964, 0, 0, + 4410, + 3966, + 3968, + 4055, + 0, + 3970, + 4085, + 4095, 0, + 4113, 0, + 4122, 0, + 4133, 0, + 4142, + 4157, + 4171, + 4178, + 3971, + 3972, + 3974, + 4362, + 4372, + 4378, + 4381, 0, + 4402, 0, 0, - 3841, - 3858, 0, + 4427, + 4448, + 4451, 0, + 4469, + 3975, + 3976, + 3978, 0, - 3844, - 3882, 0, 0, 0, @@ -22186,244 +22140,140 @@ 0, 0, 0, + 3979, + 3981, + 3983, + 3985, + 3987, + 3990, + 3994, 0, + 3992, + 3993, + 3995, + 3997, + 3998, + 4000, + 4005, + 4007, + 4009, 0, 0, 0, 0, - 3846, - 3848, - 3850, - 3851, - 3855, - 3860, - 3861, - 3862, - 4382, 0, - 3863, - 3864, - 3866, - 3867, - 3869, - 3870, - 3871, - 3872, - 3873, - 3875, - 3877, - 3879, - 3881, - 3884, - 3886, - 3888, 0, 0, 0, - 3937, - 3890, - 3892, 0, 0, - 3913, - 3938, + 4010, + 4012, + 4014, 0, 0, 0, 0, 0, 0, - 3894, - 3896, - 3898, - 3900, - 3902, - 3903, - 3904, - 3905, - 3906, - 3908, - 3909, - 3910, - 3911, 0, - 4443, - 4215, - 3933, - 3934, 0, 0, 0, + 4015, + 4017, + 4019, + 4022, + 4024, 0, - 3932, 0, 0, 0, 0, - 3912, - 3915, - 3916, - 3918, - 3921, - 3922, - 3923, - 3924, 0, - 4438, - 3929, - 3928, 0, - 3927, 0, - 3925, - 3926, 0, 0, 0, 0, - 3939, - 3931, - 3936, - 3941, - 3943, - 3944, - 3945, - 3946, - 3955, - 3954, 0, - 3947, 0, + 4035, + 4025, + 4027, + 4030, + 4032, + 4034, + 4036, + 4038, + 4040, + 4043, 0, 0, 0, + 4051, 0, - 3959, - 3949, - 3950, - 3951, - 3952, - 3953, - 3960, 0, 0, 0, 0, 0, - 3958, - 3957, 0, + 4067, + 4044, + 4046, + 4050, 0, 0, - 3994, - 3963, - 3962, - 3965, - 3967, - 3968, - 3969, - 3970, - 3971, - 3972, - 4262, - 4229, - 4019, - 4018, - 4017, 0, - 4016, 0, - 4014, - 4013, - 3979, - 3978, - 3977, 0, 0, - 3974, - 3976, - 4015, - 4027, + 4048, + 4052, + 4054, + 4056, + 4057, + 4061, + 4065, + 4063, 0, 0, + 4088, 0, - 4012, 0, 0, 0, + 4103, + 4064, + 4066, + 4068, + 4072, + 4075, + 4354, 0, - 3981, - 3984, 0, + 4360, 0, + 4367, 0, - 3983, 0, 0, 0, 0, 0, - 3995, - 3986, - 3987, - 3988, - 3989, - 3990, - 3992, - 3993, - 3997, - 3998, - 3999, - 4000, - 4001, - 4201, 0, + 4077, + 4390, 0, - 4003, - 4007, - 4008, - 4009, - 4010, - 4011, - 4076, 0, - 4021, - 4022, - 4023, - 4024, - 4025, - 4026, - 4029, - 4037, - 4031, - 4032, - 4033, - 4034, 0, - 4547, - 4039, - 4038, - 4041, - 4040, - 4035, + 4078, + 4081, + 4084, 0, 0, - 4036, - 4045, - 4044, - 4071, - 4043, - 4048, - 4050, - 4051, - 4052, - 4053, - 4054, - 4055, - 4057, - 4058, - 4060, - 4082, 0, 0, 0, @@ -22432,252 +22282,280 @@ 0, 0, 0, + 4083, + 4388, 0, - 4062, - 4068, - 4067, 0, 0, - 4069, + 4407, 0, - 4070, 0, - 4064, - 4066, - 4073, - 4075, - 4077, - 4078, - 4079, - 4080, - 4081, - 4084, - 4085, 4086, 4087, - 4088, - 4090, + 4089, 4092, 4094, - 4097, - 0, 4096, - 0, - 0, + 4097, 4101, - 4571, - 4572, - 4573, - 4574, - 4100, - 0, - 4577, - 4578, - 4560, - 4561, - 4609, - 0, - 4610, 0, 0, - 4613, - 4104, 4105, - 4106, - 4107, - 4108, - 4110, - 0, - 0, 0, 0, 0, 0, 0, + 4107, 0, 0, 0, - 4126, + 4109, + 4102, + 4104, + 4106, + 4108, + 4110, 4112, 4114, - 4116, - 4117, + 4115, + 4118, + 0, + 0, + 4127, 4119, 4121, 4123, - 4125, + 4124, + 4126, 4128, - 4129, - 4130, 4131, - 4132, 4134, - 4137, + 0, + 0, + 0, + 0, + 0, + 0, 4138, + 4135, + 4137, 4139, - 4140, 4141, 4143, + 4144, + 4146, + 4149, + 4160, + 0, + 0, 0, 0, 0, - 4202, - 4145, - 4189, 0, 0, - 4147, - 4149, 0, 0, - 4156, - 4151, 4152, - 4153, - 4154, - 4155, + 4156, 4158, 4159, - 4160, - 4161, - 4163, 4162, - 4165, + 4164, 4166, + 0, + 0, + 0, + 0, + 0, + 4190, 4167, - 4168, + 4170, + 0, + 0, + 0, 4169, - 4171, 4172, 4173, - 4174, 4175, 4177, 4179, - 4182, + 0, + 0, 4181, + 4180, + 4182, 4184, - 4185, 4186, - 4187, + 4189, + 0, + 0, 4188, - 4190, - 4192, + 4191, 4193, - 4194, - 4195, - 4196, + 4197, 4199, - 4200, + 4202, + 4207, + 0, + 0, + 4215, + 4222, + 4225, + 0, + 0, + 0, + 4251, + 0, + 0, + 4262, + 4203, 4204, 4206, + 4208, 4209, - 4223, - 4213, + 4212, 4214, 4216, - 4218, + 4217, 4219, - 4220, 4221, - 4222, + 4223, 4224, - 4225, 4226, 4227, + 4231, + 4235, 4232, + 4234, + 4236, + 4238, + 4240, + 4242, + 4245, + 4247, + 0, + 0, 0, 0, - 4231, - 4235, 0, 0, 0, - 4234, 0, 0, 0, 0, 0, - 4261, - 4237, - 4238, - 4240, - 4242, - 4244, - 4246, - 4247, + 0, + 4271, 4248, - 4249, 4250, 4252, + 0, + 0, + 0, + 0, + 0, + 4256, 4253, - 4254, 4255, - 4256, - 4258, - 4260, + 4257, + 4259, + 4261, + 4263, + 4265, 4264, 4266, - 4267, 4268, + 4281, + 0, + 0, + 4299, + 0, + 4307, + 0, + 0, + 4321, + 4324, + 4332, + 4339, + 0, + 0, + 4349, 4269, - 4277, 0, 0, - 4270, + 0, + 0, + 0, + 0, + 0, 0, 0, 0, 4278, + 4270, 4272, - 4273, 4274, - 4275, - 4276, - 4280, - 4281, - 4282, - 4283, - 4284, - 4286, - 4288, + 0, + 0, + 4291, + 4295, + 0, 0, 0, 0, + 4297, 0, 0, 0, 0, - 4316, + 4305, + 4275, + 4277, + 4280, + 4279, + 4282, + 0, + 4284, + 4283, + 4285, + 4287, + 4288, 4290, 4292, - 4293, 4294, - 4295, 4296, - 4297, - 4299, + 4298, 4300, 4301, - 4302, 4303, - 4305, - 4307, - 4309, - 4312, - 4311, + 4306, + 4308, + 0, + 0, + 0, 0, 0, 0, + 4310, 0, 0, + 4312, + 4309, + 4311, + 4313, 4315, - 4314, + 4317, 4318, - 4320, 4322, + 4323, + 4325, + 4326, + 4328, + 4330, 0, + 4337, 0, 0, 0, @@ -22685,102 +22563,171 @@ 0, 0, 0, - 0, - 4360, - 4324, - 4325, - 4326, - 4327, - 4328, - 4330, + 4343, 4331, 4333, + 4334, + 4338, 4340, 4341, - 4349, - 4352, - 4354, - 4356, + 4344, + 4348, + 4350, + 4351, + 4353, + 4355, + 4357, + 4361, + 4363, 0, + 4365, 0, 0, 0, - 4359, - 4358, - 4362, - 4363, + 0, + 0, + 0, + 0, + 0, + 4369, 4364, - 4365, 4366, 4368, 4370, 4373, 4374, - 4375, - 4376, 4377, - 4381, - 4404, - 4405, + 4379, + 4380, + 4382, + 0, 0, - 4406, 0, - 4407, - 4408, 0, 0, 0, 0, - 4383, 4385, - 4387, - 4388, - 4391, - 4390, - 4393, - 4395, - 4398, + 4383, + 4386, + 4389, + 4392, + 4394, + 4396, + 0, + 0, + 0, + 0, 0, + 4413, + 4397, + 4399, + 4401, + 4403, + 4405, + 4404, + 4406, + 4408, 0, 0, 0, 0, 0, 0, - 4414, - 4400, - 4402, - 4410, + 0, + 0, + 4409, 4412, + 4414, 4416, - 4418, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 4419, - 4420, + 4418, 4421, - 4422, + 4423, + 0, 4424, - 4427, 0, 0, 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4425, + 4428, + 4429, + 4431, + 4433, + 4435, + 4437, + 4439, + 4441, + 4443, + 4447, 4449, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4454, 4450, + 4452, + 4453, + 4455, + 4457, + 0, + 0, + 4472, + 4474, + 0, + 0, + 0, + 0, + 0, + 0, + 4502, + 0, + 4508, + 4458, + 4462, + 4478, 0, 0, + 4464, 0, 0, + 4513, 0, + 4524, + 4527, 0, 0, + 4540, 0, 0, - 4429, - 4431, - 4432, - 4433, - 4434, - 4435, - 4467, + 4550, + 4465, + 4466, + 4468, + 4470, 0, 0, 0, @@ -22789,189 +22736,242 @@ 0, 0, 0, - 4437, - 4439, - 4441, - 4442, - 4444, - 4446, - 4448, - 4452, - 4453, - 4455, - 4459, - 4460, - 4461, - 4462, - 4463, - 4466, - 4470, - 4472, - 4474, 4476, + 4471, + 4473, + 4475, + 0, 0, 0, 0, - 4479, 0, 0, 0, 0, 0, - 4499, - 4478, 4481, - 4483, + 4477, + 4479, + 4480, + 4484, + 0, 4485, 4487, - 4490, - 0, - 0, + 4489, 4491, 4493, - 4494, 4495, - 4496, 4497, - 4498, - 4502, - 0, + 4499, 4501, - 4504, - 4506, - 4508, + 4503, + 4505, + 4507, 4509, 4511, + 0, + 0, + 4512, + 4514, + 4515, 4517, - 4519, + 0, + 0, + 0, + 0, + 0, + 0, + 4518, 4520, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4530, + 4532, 4521, - 4522, - 4523, + 4525, 4526, + 4528, + 4529, 4531, 4533, - 4534, 4536, - 4538, - 4540, + 4539, + 4541, 4542, 4544, - 4546, - 4548, - 4550, + 4547, + 4549, + 4551, 4552, - 4553, 4554, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4562, 4555, 4557, - 4556, 4559, + 4561, 4563, - 4564, 4565, - 4566, - 4567, - 4570, + 4568, + 0, + 4578, + 0, + 0, + 0, + 4593, + 0, + 4603, 4569, - 4576, - 4580, + 4571, + 4570, + 4572, + 4574, + 4577, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 4581, - 4582, - 4583, + 4579, + 4580, 4584, 4585, 4587, 4589, - 4590, + 4591, 4592, 4594, - 4596, - 4598, + 4595, + 4597, 4599, + 0, + 0, + 0, + 0, + 4606, 4600, - 4601, 4602, 4604, 4605, - 4606, 4607, - 4608, + 4609, 4612, - 4615, + 4614, + 4616, 4617, 4619, - 4620, 4621, + 0, + 0, + 0, + 4628, + 4620, 4622, - 4623, - 4625, - 4627, - 4629, - 4630, - 4632, - 4637, + 4624, + 4626, 0, 0, 0, - 4634, - 4636, - 4639, - 4642, - 4645, - 4644, 0, 0, 0, 0, - 4646, + 0, + 4630, + 4627, + 4629, + 4631, + 4633, + 4635, + 4637, + 4638, + 4641, + 0, + 0, + 0, + 0, 0, 0, 0, 0, - 4694, - 4648, 4649, + 4642, + 4645, + 4647, 4650, - 4651, 4652, 4653, 4655, 4657, - 4658, - 4660, - 4662, - 4671, - 0, + 4659, + 4661, 0, + 4663, + 4670, + 4662, 4664, 4666, - 4667, 4668, 4669, - 4670, + 4671, 4673, + 4674, 4676, 0, - 4675, + 0, + 0, + 0, + 0, + 0, + 0, + 0, 4678, - 4680, + 4677, + 4679, 4681, - 4682, 4683, 4684, + 4686, + 0, + 0, + 0, + 0, 4687, - 4688, 4689, - 4690, - 4691, - 4696, 0, 0, 0, 0, 0, 0, + 0, + 0, + 0, + 4690, + 4692, + 4694, + 4696, 4697, }; diff --git a/crypto/heimdal/lib/wind/punycode_examples.h b/crypto/heimdal/lib/wind/punycode_examples.h --- a/crypto/heimdal/lib/wind/punycode_examples.h +++ b/crypto/heimdal/lib/wind/punycode_examples.h @@ -1,5 +1,5 @@ /* ./punycode_examples.h */ -/* Automatically generated at 2012-01-11T14:07:08.539140 */ +/* Automatically generated at 2022-11-15T14:04:18.893502 */ #ifndef PUNYCODE_EXAMPLES_H #define PUNYCODE_EXAMPLES_H 1 diff --git a/crypto/heimdal/lib/wind/punycode_examples.c b/crypto/heimdal/lib/wind/punycode_examples.c --- a/crypto/heimdal/lib/wind/punycode_examples.c +++ b/crypto/heimdal/lib/wind/punycode_examples.c @@ -1,5 +1,5 @@ /* ./punycode_examples.c */ -/* Automatically generated at 2012-01-11T14:07:08.539522 */ +/* Automatically generated at 2022-11-15T14:04:18.893543 */ #ifndef PUNYCODE_EXAMPLES_C #define PUNYCODE_EXAMPLES_C 1 @@ -8,25 +8,25 @@ #include "punycode_examples.h" const struct punycode_example punycode_examples[] = { - {17, {0x0644, 0x064A, 0x0647, 0x0645, 0x0627, 0x0628, 0x062A, 0x0643, 0x0644, 0x0645, 0x0648, 0x0634, 0x0639, 0x0631, 0x0628, 0x064A, 0x061F}, "egbpdaj6bu4bxfgehfvwxn", "Arabic (Egyptian):"}, - {9, {0x4ED6, 0x4EEC, 0x4E3A, 0x4EC0, 0x4E48, 0x4E0D, 0x8BF4, 0x4E2D, 0x6587}, "ihqwcrb4cv8a8dqg056pqjye", "Chinese (simplified):"}, - {9, {0x4ED6, 0x5011, 0x7232, 0x4EC0, 0x9EBD, 0x4E0D, 0x8AAA, 0x4E2D, 0x6587}, "ihqwctvzc91f659drss3x8bo0yb", "Chinese (traditional):"}, - {22, {0x0050, 0x0072, 0x006F, 0x010D, 0x0070, 0x0072, 0x006F, 0x0073, 0x0074, 0x011B, 0x006E, 0x0065, 0x006D, 0x006C, 0x0075, 0x0076, 0x00ED, 0x010D, 0x0065, 0x0073, 0x006B, 0x0079}, "Proprostnemluvesky-uyb24dma41a", "Czech: Proprostnemluvesky"}, - {22, {0x05DC, 0x05DE, 0x05D4, 0x05D4, 0x05DD, 0x05E4, 0x05E9, 0x05D5, 0x05D8, 0x05DC, 0x05D0, 0x05DE, 0x05D3, 0x05D1, 0x05E8, 0x05D9, 0x05DD, 0x05E2, 0x05D1, 0x05E8, 0x05D9, 0x05EA}, "4dbcagdahymbxekheh6e0a7fei0b", "Hebrew:"}, - {30, {0x092F, 0x0939, 0x0932, 0x094B, 0x0917, 0x0939, 0x093F, 0x0928, 0x094D, 0x0926, 0x0940, 0x0915, 0x094D, 0x092F, 0x094B, 0x0902, 0x0928, 0x0939, 0x0940, 0x0902, 0x092C, 0x094B, 0x0932, 0x0938, 0x0915, 0x0924, 0x0947, 0x0939, 0x0948, 0x0902}, "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", "Hindi (Devanagari):"}, - {18, {0x306A, 0x305C, 0x307F, 0x3093, 0x306A, 0x65E5, 0x672C, 0x8A9E, 0x3092, 0x8A71, 0x3057, 0x3066, 0x304F, 0x308C, 0x306A, 0x3044, 0x306E, 0x304B}, "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", "Japanese (kanji and hiragana):"}, - {24, {0xC138, 0xACC4, 0xC758, 0xBAA8, 0xB4E0, 0xC0AC, 0xB78C, 0xB4E4, 0xC774, 0xD55C, 0xAD6D, 0xC5B4, 0xB97C, 0xC774, 0xD574, 0xD55C, 0xB2E4, 0xBA74, 0xC5BC, 0xB9C8, 0xB098, 0xC88B, 0xC744, 0xAE4C}, "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c", "Korean (Hangul syllables):"}, - {28, {0x043F, 0x043E, 0x0447, 0x0435, 0x043C, 0x0443, 0x0436, 0x0435, 0x043E, 0x043D, 0x0438, 0x043D, 0x0435, 0x0433, 0x043E, 0x0432, 0x043E, 0x0440, 0x044F, 0x0442, 0x043F, 0x043E, 0x0440, 0x0443, 0x0441, 0x0441, 0x043A, 0x0438}, "b1abfaaepdrnnbgefbaDotcwatmq2g4l", "Russian (Cyrillic):"}, - {40, {0x0050, 0x006F, 0x0072, 0x0071, 0x0075, 0x00E9, 0x006E, 0x006F, 0x0070, 0x0075, 0x0065, 0x0064, 0x0065, 0x006E, 0x0073, 0x0069, 0x006D, 0x0070, 0x006C, 0x0065, 0x006D, 0x0065, 0x006E, 0x0074, 0x0065, 0x0068, 0x0061, 0x0062, 0x006C, 0x0061, 0x0072, 0x0065, 0x006E, 0x0045, 0x0073, 0x0070, 0x0061, 0x00F1, 0x006F, 0x006C}, "PorqunopuedensimplementehablarenEspaol-fmd56a", "Spanish: PorqunopuedensimplementehablarenEspaol"}, - {31, {0x0054, 0x1EA1, 0x0069, 0x0073, 0x0061, 0x006F, 0x0068, 0x1ECD, 0x006B, 0x0068, 0x00F4, 0x006E, 0x0067, 0x0074, 0x0068, 0x1EC3, 0x0063, 0x0068, 0x1EC9, 0x006E, 0x00F3, 0x0069, 0x0074, 0x0069, 0x1EBF, 0x006E, 0x0067, 0x0056, 0x0069, 0x1EC7, 0x0074}, "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", "Vietnamese:"}, - {8, {0x0033, 0x5E74, 0x0042, 0x7D44, 0x91D1, 0x516B, 0x5148, 0x751F}, "3B-ww4c5e180e575a65lsy2b", "3B"}, - {24, {0x5B89, 0x5BA4, 0x5948, 0x7F8E, 0x6075, 0x002D, 0x0077, 0x0069, 0x0074, 0x0068, 0x002D, 0x0053, 0x0055, 0x0050, 0x0045, 0x0052, 0x002D, 0x004D, 0x004F, 0x004E, 0x004B, 0x0045, 0x0059, 0x0053}, "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", "-with-SUPER-MONKEYS"}, - {25, {0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x002D, 0x0041, 0x006E, 0x006F, 0x0074, 0x0068, 0x0065, 0x0072, 0x002D, 0x0057, 0x0061, 0x0079, 0x002D, 0x305D, 0x308C, 0x305E, 0x308C, 0x306E, 0x5834, 0x6240}, "Hello-Another-Way--fc4qua05auwb3674vfr0b", "Hello-Another-Way-"}, - {8, {0x3072, 0x3068, 0x3064, 0x5C4B, 0x6839, 0x306E, 0x4E0B, 0x0032}, "2-u9tlzr9756bt3uc0v", "2"}, - {13, {0x004D, 0x0061, 0x006A, 0x0069, 0x3067, 0x004B, 0x006F, 0x0069, 0x3059, 0x308B, 0x0035, 0x79D2, 0x524D}, "MajiKoi5-783gue6qz075azm5e", "MajiKoi5"}, - {9, {0x30D1, 0x30D5, 0x30A3, 0x30FC, 0x0064, 0x0065, 0x30EB, 0x30F3, 0x30D0}, "de-jg4avhby1noc0d", "de"}, - {7, {0x305D, 0x306E, 0x30B9, 0x30D4, 0x30FC, 0x30C9, 0x3067}, "d9juau41awczczp", ""}, - {11, {0x002D, 0x003E, 0x0020, 0x0024, 0x0031, 0x002E, 0x0030, 0x0030, 0x0020, 0x003C, 0x002D}, "-> $1.00 <--", "-> $1.00 <-"}, + {17, {0x0644,0x064A,0x0647,0x0645,0x0627,0x0628,0x062A,0x0643,0x0644,0x0645,0x0648,0x0634,0x0639,0x0631,0x0628,0x064A,0x061F}, "egbpdaj6bu4bxfgehfvwxn", "Arabic (Egyptian):"}, + {9, {0x4ED6,0x4EEC,0x4E3A,0x4EC0,0x4E48,0x4E0D,0x8BF4,0x4E2D,0x6587}, "ihqwcrb4cv8a8dqg056pqjye", "Chinese (simplified):"}, + {9, {0x4ED6,0x5011,0x7232,0x4EC0,0x9EBD,0x4E0D,0x8AAA,0x4E2D,0x6587}, "ihqwctvzc91f659drss3x8bo0yb", "Chinese (traditional):"}, + {22, {0x0050,0x0072,0x006F,0x010D,0x0070,0x0072,0x006F,0x0073,0x0074,0x011B,0x006E,0x0065,0x006D,0x006C,0x0075,0x0076,0x00ED,0x010D,0x0065,0x0073,0x006B,0x0079}, "Proprostnemluvesky-uyb24dma41a", "Czech: Proprostnemluvesky"}, + {22, {0x05DC,0x05DE,0x05D4,0x05D4,0x05DD,0x05E4,0x05E9,0x05D5,0x05D8,0x05DC,0x05D0,0x05DE,0x05D3,0x05D1,0x05E8,0x05D9,0x05DD,0x05E2,0x05D1,0x05E8,0x05D9,0x05EA}, "4dbcagdahymbxekheh6e0a7fei0b", "Hebrew:"}, + {30, {0x092F,0x0939,0x0932,0x094B,0x0917,0x0939,0x093F,0x0928,0x094D,0x0926,0x0940,0x0915,0x094D,0x092F,0x094B,0x0902,0x0928,0x0939,0x0940,0x0902,0x092C,0x094B,0x0932,0x0938,0x0915,0x0924,0x0947,0x0939,0x0948,0x0902}, "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", "Hindi (Devanagari):"}, + {18, {0x306A,0x305C,0x307F,0x3093,0x306A,0x65E5,0x672C,0x8A9E,0x3092,0x8A71,0x3057,0x3066,0x304F,0x308C,0x306A,0x3044,0x306E,0x304B}, "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", "Japanese (kanji and hiragana):"}, + {24, {0xC138,0xACC4,0xC758,0xBAA8,0xB4E0,0xC0AC,0xB78C,0xB4E4,0xC774,0xD55C,0xAD6D,0xC5B4,0xB97C,0xC774,0xD574,0xD55C,0xB2E4,0xBA74,0xC5BC,0xB9C8,0xB098,0xC88B,0xC744,0xAE4C}, "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5jpsd879ccm6fea98c", "Korean (Hangul syllables):"}, + {28, {0x043F,0x043E,0x0447,0x0435,0x043C,0x0443,0x0436,0x0435,0x043E,0x043D,0x0438,0x043D,0x0435,0x0433,0x043E,0x0432,0x043E,0x0440,0x044F,0x0442,0x043F,0x043E,0x0440,0x0443,0x0441,0x0441,0x043A,0x0438}, "b1abfaaepdrnnbgefbaDotcwatmq2g4l", "Russian (Cyrillic):"}, + {40, {0x0050,0x006F,0x0072,0x0071,0x0075,0x00E9,0x006E,0x006F,0x0070,0x0075,0x0065,0x0064,0x0065,0x006E,0x0073,0x0069,0x006D,0x0070,0x006C,0x0065,0x006D,0x0065,0x006E,0x0074,0x0065,0x0068,0x0061,0x0062,0x006C,0x0061,0x0072,0x0065,0x006E,0x0045,0x0073,0x0070,0x0061,0x00F1,0x006F,0x006C}, "PorqunopuedensimplementehablarenEspaol-fmd56a", "Spanish: PorqunopuedensimplementehablarenEspaol"}, + {31, {0x0054,0x1EA1,0x0069,0x0073,0x0061,0x006F,0x0068,0x1ECD,0x006B,0x0068,0x00F4,0x006E,0x0067,0x0074,0x0068,0x1EC3,0x0063,0x0068,0x1EC9,0x006E,0x00F3,0x0069,0x0074,0x0069,0x1EBF,0x006E,0x0067,0x0056,0x0069,0x1EC7,0x0074}, "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", "Vietnamese:"}, + {8, {0x0033,0x5E74,0x0042,0x7D44,0x91D1,0x516B,0x5148,0x751F}, "3B-ww4c5e180e575a65lsy2b", "3B"}, + {24, {0x5B89,0x5BA4,0x5948,0x7F8E,0x6075,0x002D,0x0077,0x0069,0x0074,0x0068,0x002D,0x0053,0x0055,0x0050,0x0045,0x0052,0x002D,0x004D,0x004F,0x004E,0x004B,0x0045,0x0059,0x0053}, "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", "-with-SUPER-MONKEYS"}, + {25, {0x0048,0x0065,0x006C,0x006C,0x006F,0x002D,0x0041,0x006E,0x006F,0x0074,0x0068,0x0065,0x0072,0x002D,0x0057,0x0061,0x0079,0x002D,0x305D,0x308C,0x305E,0x308C,0x306E,0x5834,0x6240}, "Hello-Another-Way--fc4qua05auwb3674vfr0b", "Hello-Another-Way-"}, + {8, {0x3072,0x3068,0x3064,0x5C4B,0x6839,0x306E,0x4E0B,0x0032}, "2-u9tlzr9756bt3uc0v", "2"}, + {13, {0x004D,0x0061,0x006A,0x0069,0x3067,0x004B,0x006F,0x0069,0x3059,0x308B,0x0035,0x79D2,0x524D}, "MajiKoi5-783gue6qz075azm5e", "MajiKoi5"}, + {9, {0x30D1,0x30D5,0x30A3,0x30FC,0x0064,0x0065,0x30EB,0x30F3,0x30D0}, "de-jg4avhby1noc0d", "de"}, + {7, {0x305D,0x306E,0x30B9,0x30D4,0x30FC,0x30C9,0x3067}, "d9juau41awczczp", ""}, + {11, {0x002D,0x003E,0x0020,0x0024,0x0031,0x002E,0x0030,0x0030,0x0020,0x003C,0x002D}, "-> $1.00 <--", "-> $1.00 <-"}, }; const size_t punycode_examples_size = 19; diff --git a/crypto/heimdal/lib/wind/stringprep.py b/crypto/heimdal/lib/wind/stringprep.py --- a/crypto/heimdal/lib/wind/stringprep.py +++ b/crypto/heimdal/lib/wind/stringprep.py @@ -57,7 +57,7 @@ list = list + tabledict.get(x, []) if len(list) == 0: return "" - return "|".join(map(lambda x: "WIND_PROFILE_%s" % (string.upper(x)), list)) + return "|".join(map(lambda x: "WIND_PROFILE_%s" % (x.upper()), list)) def get_errorlist(): d = dict() diff --git a/crypto/heimdal/lib/wind/test-normalize.c b/crypto/heimdal/lib/wind/test-normalize.c --- a/crypto/heimdal/lib/wind/test-normalize.c +++ b/crypto/heimdal/lib/wind/test-normalize.c @@ -47,7 +47,7 @@ static size_t parse_vector(char *buf, uint32_t *v) { - char *last; + char *last = NULL; unsigned ret = 0; const char *n; unsigned u; @@ -155,9 +155,13 @@ if (f == NULL) { const char *srcdir = getenv("srcdir"); if (srcdir != NULL) { - char longname[256]; - snprintf(longname, sizeof(longname), "%s/%s", srcdir, filename); + char *longname = NULL; + + if (asprintf(&longname, "%s/%s", srcdir, filename) == -1 || + longname == NULL) + errx(1, "Out of memory"); f = fopen(longname, "r"); + free(longname); } if (f == NULL) err(1, "open %s", filename); diff --git a/crypto/heimdal/lib/wind/test-utf8.c b/crypto/heimdal/lib/wind/test-utf8.c --- a/crypto/heimdal/lib/wind/test-utf8.c +++ b/crypto/heimdal/lib/wind/test-utf8.c @@ -78,24 +78,24 @@ }; static const struct testcase testcases[] = { - {"", 0, {0}}, - {"\x01", 1, {1}}, - {"\x7F", 1, {0x7F}}, - {"\x01\x7F", 2, {0x01, 0x7F}}, - {"\xC0\x80", 1, {0}}, - {"\xC0\x81", 1, {1}}, - {"\xC1\x80", 1, {0x40}}, - {"\xDF\xBF", 1, {0x7FF}}, - {"\xE0\x80\x80", 1, {0}}, - {"\xE0\x80\x81", 1, {1}}, - {"\xE0\x81\x80", 1, {0x40}}, - {"\xE1\x80\x80", 1, {0x1000}}, - {"\xEF\xBF\xBF", 1, {0xFFFF}}, - {"\xF0\x80\x80\x80", 1, {0}}, - {"\xF0\x80\x80\x81", 1, {1}}, - {"\xF0\x80\x81\x80", 1, {0x40}}, - {"\xF0\x81\x80\x80", 1, {0x1000}}, - {"\xF1\x80\x80\x80", 1, {0x40000}}, + {"", 0, {0}, 0}, + {"\x01", 1, {1}, 0}, + {"\x7F", 1, {0x7F}, 0}, + {"\x01\x7F", 2, {0x01, 0x7F}, 0}, + {"\xC0\x80", 1, {0}, 0}, + {"\xC0\x81", 1, {1}, 0}, + {"\xC1\x80", 1, {0x40}, 0}, + {"\xDF\xBF", 1, {0x7FF}, 0}, + {"\xE0\x80\x80", 1, {0}, 0}, + {"\xE0\x80\x81", 1, {1}, 0}, + {"\xE0\x81\x80", 1, {0x40}, 0}, + {"\xE1\x80\x80", 1, {0x1000}, 0}, + {"\xEF\xBF\xBF", 1, {0xFFFF}, 0}, + {"\xF0\x80\x80\x80", 1, {0}, 0}, + {"\xF0\x80\x80\x81", 1, {1}, 0}, + {"\xF0\x80\x81\x80", 1, {0x40}, 0}, + {"\xF0\x81\x80\x80", 1, {0x1000}, 0}, + {"\xF1\x80\x80\x80", 1, {0x40000}, 0}, {"\xF7\xBF\xBF\xBF", 1, {0X1FFFFF}, 1}, }; diff --git a/crypto/heimdal/lib/wind/utf8.c b/crypto/heimdal/lib/wind/utf8.c --- a/crypto/heimdal/lib/wind/utf8.c +++ b/crypto/heimdal/lib/wind/utf8.c @@ -205,14 +205,18 @@ case 4: out[3] = (ch | 0x80) & 0xbf; ch = ch >> 6; + /* FALLTHROUGH */ case 3: out[2] = (ch | 0x80) & 0xbf; ch = ch >> 6; + /* FALLTHROUGH */ case 2: out[1] = (ch | 0x80) & 0xbf; ch = ch >> 6; + /* FALLTHROUGH */ case 1: out[0] = ch | first_char[len - 1]; + /* FALLTHROUGH */ } } out += len; @@ -480,11 +484,14 @@ case 3: out[2] = (ch | 0x80) & 0xbf; ch = ch >> 6; + /* FALLTHROUGH */ case 2: out[1] = (ch | 0x80) & 0xbf; ch = ch >> 6; + /* FALLTHROUGH */ case 1: out[0] = ch | first_char[len - 1]; + /* FALLTHROUGH */ } out += len; } diff --git a/crypto/heimdal/ltmain.sh b/crypto/heimdal/ltmain.sh --- a/crypto/heimdal/ltmain.sh +++ b/crypto/heimdal/ltmain.sh @@ -1,9 +1,12 @@ +#! /usr/bin/env sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2019-02-19.15 -# libtool (GNU libtool) 2.4 +# libtool (GNU libtool) 2.4.7 +# Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# Copyright (C) 1996-2019, 2021-2022 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. @@ -23,885 +26,2350 @@ # 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. +# along with this program. If not, see . -# 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) -# --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 + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.7 +package_revision=2.4.7 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -# 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. +# Copyright (C) 2004-2019, 2021 Bootstrap Authors # -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: # -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4 -# automake: $automake_version -# autoconf: $autoconf_version +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # -# Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. -PROGRAM=libtool -PACKAGE=libtool -VERSION=2.4 -TIMESTAMP="" -package_revision=1.3293 -# Be Bourne compatible -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +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 + # 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 + 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 +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_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\" + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done +# These NLS vars are set unconditionally (bootstrap issue #24). Unset those +# in case the environment reset is needed later and the $save_* variant is not +# defined (see the code above). LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL -$lt_unset CDPATH - +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +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 -# 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" +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } +} -: ${CP="cp -f"} -test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} -: ${EGREP="grep -E"} -: ${FGREP="grep -F"} -: ${GREP="grep"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SED="sed"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} -: ${Xsed="$SED -e 1s/^X//"} +# Make sure CDPATH doesn't cause `cd` commands to output the target dir. +func_unset CDPATH -# 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. +# Make sure ${,E,F}GREP behave sanely. +func_unset GREP_OPTIONS -exit_status=$EXIT_SUCCESS -# Make sure IFS has a sensible default -lt_nl=' -' -IFS=" $lt_nl" +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## -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_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () { - 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 + test -f "$1" && test -x "$1" +} -# func_basename file -func_basename () +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () { - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} -# 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 +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= -# 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 + func_check_prog_sed () + { + _G_path_prog=$1 + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } -# 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_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" + rm -f conftest.sed + SED=$func_path_progs_result +} -# 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 () + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_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 +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_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 '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + +# require_check_ifs_backslash +# --------------------------- +# Check if we can use backslash as IFS='\' separator, and set +# $check_ifs_backshlash_broken to ':' or 'false'. +require_check_ifs_backslash=func_require_check_ifs_backslash +func_require_check_ifs_backslash () { - # 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=/ + _G_save_IFS=$IFS + IFS='\' + _G_check_ifs_backshlash='a\\b' + for _G_i in $_G_check_ifs_backshlash + do + case $_G_i in + a) + check_ifs_backshlash_broken=false ;; - /*) - # Absolute path, do nothing. + '') + break ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + *) + check_ifs_backshlash_broken=: + break ;; 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 + IFS=$_G_save_IFS + require_check_ifs_backslash=: } -# 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 +## ----------------- ## +## Global variables. ## +## ----------------- ## - # 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 -} +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +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. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# 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 -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` -# Make sure we have an absolute path for reexecution: +# Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) - progdir=$func_dirname_result + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" + progpath=$progdir/$progname ;; *) - save_IFS="$IFS" - IFS=: + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do - IFS="$save_IFS" + IFS=$_G_IFS test -x "$progdir/$progname" && break done - IFS="$save_IFS" + IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" + 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' +## ----------------- ## +## Standard options. ## +## ----------------- ## -# 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" +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. -# 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: }$*" -} +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue - # 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: - : -} +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all -# 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 -} +## -------------------- ## +## Resource management. ## +## -------------------- ## -# 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 +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. - # bash bug again: - : -} -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () { - func_error ${1+"$@"} - exit $EXIT_FAILURE -} + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } -# 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" + require_term_colors=: } -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 -} +## ----------------- ## +## Function library. ## +## ----------------- ## +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. -# func_mkdir_p directory-path + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1+=\\ \$func_quote_arg_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_arg pretty "$2" + eval "$1=\$$1\\ \$func_quote_arg_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# 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" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# 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= + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do + while test ! -d "$_G_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" + _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac + case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + _G_dir_list=`$ECHO "$_G_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 + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_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 || : + $MKDIR "$_G_dir" 2>/dev/null || : done - IFS="$save_mkdir_p_IFS" + IFS=$func_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'" + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" fi } -# func_mktempdir [string] +# func_mktempdir [BASENAME] +# ------------------------- # 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. +# given, BASENAME is the basename for that directory. func_mktempdir () { - my_template="${TMPDIR-/tmp}/${1-$progname}" + $debug_cmd - if test "$opt_dry_run" = ":"; then + _G_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}-$$" + _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost - my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` - if test ! -d "$my_tmpdir"; then + if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" + _G_tmpdir=$_G_template-${RANDOM-0}$$ - save_mktempdir_umask=`umask` + func_mktempdir_umask=`umask` umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask + $MKDIR "$_G_tmpdir" + umask $func_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'" + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi - $ECHO "$my_tmpdir" + $ECHO "$_G_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 () +# 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. +func_normal_abspath () { - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # 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. + ;; *) - func_quote_for_eval_unquoted_result="$1" ;; + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; 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 + # 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 "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_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 "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_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_append 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_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || 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_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + 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 -z "$func_relative_path_tlibdir"; 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 -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_portable EVAL ARG +# ---------------------------- +# Internal function to portably implement func_quote_arg. Note that we still +# keep attention to performance here so we as much as possible try to avoid +# calling sed binary (so far O(N) complexity as long as func_append is O(1)). +func_quote_portable () +{ + $debug_cmd + + $require_check_ifs_backslash + + func_quote_portable_result=$2 + + # one-time-loop (easy break) + while true + do + if $1; then + func_quote_portable_result=`$ECHO "$2" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` + break + fi + + # Quote for eval. + case $func_quote_portable_result in + *[\\\`\"\$]*) + # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string + # contains the shell wildcard characters. + case $check_ifs_backshlash_broken$func_quote_portable_result in + :*|*[\[\*\?]*) + func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ + | $SED "$sed_quote_subst"` + break + ;; + esac + + func_quote_portable_old_IFS=$IFS + for _G_char in '\' '`' '"' '$' + do + # STATE($1) PREV($2) SEPARATOR($3) + set start "" "" + func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy + IFS=$_G_char + for _G_part in $func_quote_portable_result + do + case $1 in + quote) + func_append func_quote_portable_result "$3$2" + set quote "$_G_part" "\\$_G_char" + ;; + start) + set first "" "" + func_quote_portable_result= + ;; + first) + set quote "$_G_part" "" + ;; + esac + done + done + IFS=$func_quote_portable_old_IFS + ;; + *) ;; + esac + break + done + + func_quote_portable_unquoted_result=$func_quote_portable_result + case $func_quote_portable_result in + # double-quote args containing shell metacharacters to delay + # word splitting, command substitution 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_portable_result=\"$func_quote_portable_result\" + ;; + esac +} + + +# func_quotefast_eval ARG +# ----------------------- +# Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', +# but optimized for speed. Result is stored in $func_quotefast_eval. +if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then + printf -v _GL_test_printf_tilde %q '~' + if test '\~' = "$_GL_test_printf_tilde"; then + func_quotefast_eval () + { + printf -v func_quotefast_eval_result %q "$1" + } + else + # Broken older Bash implementations. Make those faster too if possible. + func_quotefast_eval () + { + case $1 in + '~'*) + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + ;; + *) + printf -v func_quotefast_eval_result %q "$1" + ;; + esac + } + fi +else + func_quotefast_eval () + { + func_quote_portable false "$1" + func_quotefast_eval_result=$func_quote_portable_result + } +fi + + +# func_quote_arg MODEs ARG +# ------------------------ +# Quote one ARG to be evaled later. MODEs argument may contain zero or more +# specifiers listed below separated by ',' character. This function returns two +# values: +# i) func_quote_arg_result +# double-quoted (when needed), suitable for a subsequent eval +# ii) func_quote_arg_unquoted_result +# has all characters that are still active within double +# quotes backslashified. Available only if 'unquoted' is specified. +# +# Available modes: +# ---------------- +# 'eval' (default) +# - escape shell special characters +# 'expand' +# - the same as 'eval'; but do not quote variable references +# 'pretty' +# - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might +# be used later in func_quote to get output like: 'echo "a b"' instead +# of 'echo a\ b'. This is slower than default on some shells. +# 'unquoted' +# - produce also $func_quote_arg_unquoted_result which does not contain +# wrapping double-quotes. +# +# Examples for 'func_quote_arg pretty,unquoted string': +# +# string | *_result | *_unquoted_result +# ------------+-----------------------+------------------- +# " | \" | \" +# a b | "a b" | a b +# "a b" | "\"a b\"" | \"a b\" +# * | "*" | * +# z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" +# +# Examples for 'func_quote_arg pretty,unquoted,expand string': +# +# string | *_result | *_unquoted_result +# --------------+---------------------+-------------------- +# z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" +func_quote_arg () +{ + _G_quote_expand=false + case ,$1, in + *,expand,*) + _G_quote_expand=: + ;; + esac + + case ,$1, in + *,pretty,*|*,expand,*|*,unquoted,*) + func_quote_portable $_G_quote_expand "$2" + func_quote_arg_result=$func_quote_portable_result + func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result ;; *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + # Faster quote-for-eval for some shells. + func_quotefast_eval "$2" + func_quote_arg_result=$func_quotefast_eval_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 () +# func_quote MODEs ARGs... +# ------------------------ +# Quote all ARGs to be evaled later and join them into single command. See +# func_quote_arg's description for more info. +func_quote () +{ + $debug_cmd + _G_func_quote_mode=$1 ; shift + func_quote_result= + while test 0 -lt $#; do + func_quote_arg "$_G_func_quote_mode" "$1" + if test -n "$func_quote_result"; then + func_append func_quote_result " $func_quote_arg_result" + else + func_append func_quote_result "$func_quote_arg_result" + fi + shift + done +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# 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). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet 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 () { + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_arg pretty,expand "$_G_cmd" + eval "func_notquiet $func_quote_arg_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet 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 () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_arg expand,pretty "$_G_cmd" + eval "func_echo $func_quote_arg_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + 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 () +{ + $debug_cmd + case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$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\"" - ;; + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# This is free software. There is NO warranty; not even for +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# +# Copyright (C) 2010-2019, 2021 Bootstrap Authors +# +# This file is dual licensed under the terms of the MIT license +# , and GPL version 2 or later +# . You must apply one of +# these licenses when using or redistributing this software or any of +# the files within it. See the URLs above, or the file `LICENSE` +# included in the Bootstrap distribution for the full license texts. + +# Please report bugs or propose patches to: +# + +# Set a version string for this script. +scriptversion=2019-02-19.15; # UTC + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# Copyright'. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug in processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# in the main code. A hook is just a list of function names that can be +# run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of hook functions to be called by +# FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_propagate_result FUNC_NAME_A FUNC_NAME_B +# --------------------------------------------- +# If the *_result variable of FUNC_NAME_A _is set_, assign its value to +# *_result variable of FUNC_NAME_B. +func_propagate_result () +{ + $debug_cmd + + func_propagate_result_result=: + if eval "test \"\${${1}_result+set}\" = set" + then + eval "${2}_result=\$${1}_result" + else + func_propagate_result_result=false + fi +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It's assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook functions." ;; esac - func_quote_for_expand_result="$my_arg" + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + func_unset "${_G_hook}_result" + eval $_G_hook '${1+"$@"}' + func_propagate_result $_G_hook func_run_hooks + if $func_propagate_result_result; then + eval set dummy "$func_run_hooks_result"; shift + fi + done +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list from your hook function. You may remove +# or edit any options that you action, and then pass back the remaining +# unprocessed options in '_result', escaped +# suitably for 'eval'. +# +# The '_result' variable is automatically unset +# before your hook gets called; for best performance, only set the +# *_result variable when necessary (i.e. don't call the 'func_quote' +# function unnecessarily because it can be an expensive operation on some +# machines). +# +# Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# # No change in '$@' (ignored completely by this hook). Leave +# # my_options_prep_result variable intact. +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# args_changed=false +# +# # Note that, for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: +# args_changed=: +# ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# args_changed=: +# ;; +# *) # Make sure the first unrecognised option "$_G_opt" +# # is added back to "$@" in case we need it later, +# # if $args_changed was set to 'true'. +# set dummy "$_G_opt" ${1+"$@"}; shift; break ;; +# esac +# done +# +# # Only call 'func_quote' here if we processed at least one argument. +# if $args_changed; then +# func_quote eval ${1+"$@"} +# my_silent_option_result=$func_quote_result +# fi +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll also need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options_finish [ARG]... +# ---------------------------- +# Finishing the option parse loop (call 'func_options' hooks ATM). +func_options_finish () +{ + $debug_cmd + + func_run_hooks func_options ${1+"$@"} + func_propagate_result func_run_hooks func_options_finish +} + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + _G_options_quoted=false + + for my_func in options_prep parse_options validate_options options_finish + do + func_unset func_${my_func}_result + func_unset func_run_hooks_result + eval func_$my_func '${1+"$@"}' + func_propagate_result func_$my_func func_options + if $func_propagate_result_result; then + eval set dummy "$func_options_result"; shift + _G_options_quoted=: + fi + done + + $_G_options_quoted || { + # As we (func_options) are top-level options-parser function and + # nobody quoted "$@" for us yet, we need to do it explicitly for + # caller. + func_quote eval ${1+"$@"} + func_options_result=$func_quote_result + } } -# 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 () +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propagate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before returning. +func_hookable func_options_prep +func_options_prep () { - my_cmd="$1" - my_fail_exp="${2-:}" + $debug_cmd - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } + # Option defaults: + opt_verbose=false + opt_warning_types= - 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_run_hooks func_options_prep ${1+"$@"} + func_propagate_result func_run_hooks func_options_prep } -# 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 () +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () { - my_cmd="$1" - my_fail_exp="${2-:}" + $debug_cmd + + _G_parse_options_requote=false + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + func_propagate_result func_run_hooks func_parse_options + if $func_propagate_result_result; then + eval set dummy "$func_parse_options_result"; shift + # Even though we may have changed "$@", we passed the "$@" array + # down into the hook and it quoted it for us (because we are in + # this if-branch). No need to quote it again. + _G_parse_options_requote=false + fi - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + # We expect that one of the options parsed in this function matches + # and thus we remove _G_opt from "$@" and need to re-quote. + _G_match_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" >&2 + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + if test $# = 0 && func_missing_arg $_G_opt; then + _G_parse_options_requote=: + break + fi + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) _G_parse_options_requote=: ; break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift + _G_match_parse_options=false + break + ;; + esac - 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" + if $_G_match_parse_options; then + _G_parse_options_requote=: fi + done + + if $_G_parse_options_requote; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + func_parse_options_result=$func_quote_result 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 () + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () { - 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 -} + $debug_cmd + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug + func_run_hooks func_validate_options ${1+"$@"} + func_propagate_result func_run_hooks func_validate_options - $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 $? + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE } -# func_usage -# Echo short help message to standard output and exit. -func_usage () + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () { - $opt_debug + $debug_cmd - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE } -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. + +# func_help +# --------- +# Echo long help message to standard output and exit. 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 --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(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 + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 } -# func_missing_arg argname + +# func_missing_arg ARGNAME +# ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { - $opt_debug + $debug_cmd - func_error "missing argument for $1." + func_error "Missing argument for '$1'." exit_cmd=exit } -# func_split_short_opt shortopt +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables +# after splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + if test "x$func_split_equals_lhs" = "x$1"; then + func_split_equals_rhs= + fi + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs=" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# 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 () +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () { - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + $debug_cmd - 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_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} -# 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 () +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () { - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' + $debug_cmd - 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 + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} -exit_cmd=: +# func_version +# ------------ +# Echo version message to standard output and exit. +# The version message is extracted from the calling file's header +# comments, with leading '# ' stripped: +# 1. First display the progname and version +# 2. Followed by the header comment line matching /^# Written by / +# 3. Then a blank line followed by the first following line matching +# /^# Copyright / +# 4. Immediately followed by any lines between the previous matches, +# except lines preceding the intervening completely blank line. +# For example, see the header comments of this file. +func_version () +{ + $debug_cmd + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /^# Written by /!b + s|^# ||; p; n + :fwd2blnk + /./ { + n + b fwd2blnk + } + p; n + + :holdwrnt + s|^# || + s|^# *$|| + /^Copyright /!{ + /./H + n + b holdwrnt + } + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + G + s|\(\n\)\n*|\1|g + p; q' < "$progpath" -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" + exit $? +} -# 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= +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: -# 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 +# Set a version string. +scriptversion='(GNU libtool) 2.4.7' -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () { - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation + $debug_cmd + _G_message=$* -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} -# func_len string -# STRING may not start with a hyphen. -func_len () +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () { - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation + $debug_cmd + + $warning_func ${1+"$@"} +} + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --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 + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" -# func_lo2o object -func_lo2o () +# Additional text appended to 'usage_message' in response to '--help'. +func_help () { - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation + $debug_cmd + + func_usage_message + $ECHO "$long_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) + version: $progname (GNU libtool) 2.4.7 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} -# 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_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi -# func_fatal_configuration arg... +# 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_fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." } # func_config +# ----------- # Display the configuration for all the tags in this script. func_config () { @@ -919,17 +2387,19 @@ exit $? } + # func_features +# ------------- # Display the features supported by this script. func_features () { echo "host: $host" - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi - if test "$build_old_libs" = yes; then + if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" @@ -938,309 +2408,358 @@ exit $? } -# func_enable_tag tagname + +# 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" + # 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" + 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 + # 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) ;; + # 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 + 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 + 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 + 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 + 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 + fi - exit $EXIT_MISMATCH - 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 - +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false -# 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_verbose=: -opt_silent=false -opt_verbose=false + nonopt= + preserve_args= + _G_rc_lt_options_prep=: -# 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-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 ;; + # 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 + ;; + *) + _G_rc_lt_options_prep=false + ;; esac - done - # Validate options: + if $_G_rc_lt_options_prep; then + # Pass back the list of options. + func_quote eval ${1+"$@"} + libtool_options_prep_result=$func_quote_result + fi +} +func_add_hook func_options_prep libtool_options_prep - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd - 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 + _G_rc_lt_parse_options=false - $opt_help || { - # Sanity checks first: - func_check_version_match + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_match_lt_parse_options=: + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"} ; shift + _G_match_lt_parse_options=false + break + ;; + esac + $_G_match_lt_parse_options && _G_rc_lt_parse_options=: + done - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" + if $_G_rc_lt_parse_options; then + # save modified positional parameters for caller + func_quote eval ${1+"$@"} + libtool_parse_options_result=$func_quote_result fi +} +func_add_hook func_parse_options libtool_parse_options + - # 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 +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift fi - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + # Keeping compiler generated duplicates in $postdeps and $predeps is not + # harmful, and is necessary in a majority of systems that use it to satisfy + # symbol dependencies. + opt_duplicate_compiler_generated_deps=: + $opt_help || { + # Sanity checks first: + func_check_version_match - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; 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." + } + + # Pass back the unparsed argument list + func_quote eval ${1+"$@"} + libtool_validate_options_result=$func_quote_result } +func_add_hook func_validate_options libtool_validate_options +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + ## ----------- ## ## Main. ## ## ----------- ## +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +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= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + # func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object 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 + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object 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. +# fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no @@ -1248,13 +2767,13 @@ for lalib_p_l in 1 2 3 4 do read lalib_p_line - case "$lalib_p_line" in + case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi - test "$lalib_p" = yes + test yes = "$lalib_p" } # func_ltwrapper_script_p file @@ -1263,7 +2782,8 @@ # determined imposters. func_ltwrapper_script_p () { - func_lalib_p "$1" + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file @@ -1288,7 +2808,7 @@ { 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_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file @@ -1307,11 +2827,13 @@ # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { - $opt_debug + $debug_cmd + save_ifs=$IFS; IFS='~' for cmd in $1; do - IFS=$save_ifs + IFS=$sp$nl eval cmd=\"$cmd\" + IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs @@ -1323,10 +2845,11 @@ # 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. +# 'FILE.' does not work on cygwin managed mounts. func_source () { - $opt_debug + $debug_cmd + case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; @@ -1353,10 +2876,10 @@ # store the result into func_replace_sysroot_result. func_replace_sysroot () { - case "$lt_sysroot:$1" in + case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" + func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. @@ -1373,7 +2896,8 @@ # arg is usually of the form 'gcc ...' func_infer_tag () { - $opt_debug + $debug_cmd + if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do @@ -1392,7 +2916,7 @@ 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`" + 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. @@ -1417,7 +2941,7 @@ # 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'" + func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi @@ -1433,15 +2957,15 @@ # 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}\' + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' else write_lobj=none fi - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' else write_oldobj=none fi @@ -1449,7 +2973,7 @@ $opt_dry_run || { cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + 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"` + $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi @@ -1513,18 +3038,19 @@ # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { - $opt_debug + $debug_cmd + # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" + 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 -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" + 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 @@ -1553,7 +3079,8 @@ # environment variable; do not put it in $PATH. func_cygpath () { - $opt_debug + $debug_cmd + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then @@ -1562,7 +3089,7 @@ fi else func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath @@ -1573,10 +3100,11 @@ # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { - $opt_debug + $debug_cmd + # 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"` + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 @@ -1587,13 +3115,14 @@ # func_to_host_file_result to ARG1). func_convert_file_check () { - $opt_debug - if test -z "$2" && test -n "$1" ; then + $debug_cmd + + if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" - func_error " \`$1'" + func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: - func_to_host_file_result="$1" + func_to_host_file_result=$1 fi } # end func_convert_file_check @@ -1605,10 +3134,11 @@ # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { - $opt_debug + $debug_cmd + if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" - func_error " \`$3'" + 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. @@ -1617,7 +3147,7 @@ func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else - func_to_host_path_result="$3" + func_to_host_path_result=$3 fi fi } @@ -1629,9 +3159,10 @@ # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { - $opt_debug + $debug_cmd + case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" + $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in @@ -1645,7 +3176,7 @@ ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## -# invoked via `$to_host_file_cmd ARG' +# 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. @@ -1656,7 +3187,8 @@ # in func_to_host_file_result. func_to_host_file () { - $opt_debug + $debug_cmd + $to_host_file_cmd "$1" } # end func_to_host_file @@ -1668,7 +3200,8 @@ # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { - $opt_debug + $debug_cmd + case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 @@ -1686,7 +3219,7 @@ # Copy ARG to func_to_host_file_result. func_convert_file_noop () { - func_to_host_file_result="$1" + func_to_host_file_result=$1 } # end func_convert_file_noop @@ -1697,11 +3230,12 @@ # func_to_host_file_result. func_convert_file_msys_to_w32 () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + 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" + func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1713,8 +3247,9 @@ # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + 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. @@ -1730,11 +3265,12 @@ # 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" + $debug_cmd + + 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" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1746,12 +3282,13 @@ # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + 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" + func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1764,13 +3301,14 @@ # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { - $opt_debug - func_to_host_file_result="$1" + $debug_cmd + + 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" + func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } @@ -1780,7 +3318,7 @@ ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# -# invoked via `$to_host_path_cmd ARG' +# 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. @@ -1804,10 +3342,11 @@ to_host_path_cmd= func_init_to_host_path_cmd () { - $opt_debug + $debug_cmd + 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}" + to_host_path_cmd=func_convert_path_$func_stripname_result fi } @@ -1817,7 +3356,8 @@ # in func_to_host_path_result. func_to_host_path () { - $opt_debug + $debug_cmd + func_init_to_host_path_cmd $to_host_path_cmd "$1" } @@ -1828,7 +3368,7 @@ # Copy ARG to func_to_host_path_result. func_convert_path_noop () { - func_to_host_path_result="$1" + func_to_host_path_result=$1 } # end func_convert_path_noop @@ -1839,8 +3379,9 @@ # func_to_host_path_result. func_convert_path_msys_to_w32 () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + 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 ';.'; @@ -1848,7 +3389,7 @@ 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_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" @@ -1862,8 +3403,9 @@ # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" @@ -1882,14 +3424,15 @@ # 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" + $debug_cmd + + 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_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" @@ -1903,15 +3446,16 @@ # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + 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_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" @@ -1926,8 +3470,9 @@ # func_to_host_file_result. func_convert_path_nix_to_cygwin () { - $opt_debug - func_to_host_path_result="$1" + $debug_cmd + + 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 @@ -1936,7 +3481,7 @@ 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_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" @@ -1945,13 +3490,31 @@ # end func_convert_path_nix_to_cygwin +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + # func_mode_compile arg... func_mode_compile () { - $opt_debug + $debug_cmd + # Get the compilation command and the source file. base_compile= - srcfile="$nonopt" # always keep a non-empty value in "srcfile" + srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal @@ -1964,12 +3527,12 @@ case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile - lastarg="$arg" + lastarg=$arg arg_mode=normal ;; target ) - libobj="$arg" + libobj=$arg arg_mode=normal continue ;; @@ -1979,7 +3542,7 @@ case $arg in -o) test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" + func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; @@ -2008,12 +3571,12 @@ func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= - save_ifs="$IFS"; IFS=',' + save_ifs=$IFS; IFS=, for arg in $args; do - IFS="$save_ifs" + IFS=$save_ifs func_append_quoted lastarg "$arg" done - IFS="$save_ifs" + IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result @@ -2026,8 +3589,8 @@ # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # - lastarg="$srcfile" - srcfile="$arg" + lastarg=$srcfile + srcfile=$arg ;; esac # case $arg ;; @@ -2042,13 +3605,13 @@ func_fatal_error "you must specify an argument for -Xcompile" ;; target) - func_fatal_error "you must specify a target with \`-o'" + 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" + libobj=$func_basename_result } ;; esac @@ -2059,7 +3622,7 @@ *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.obj | *.sx | *.cu | *.cup) + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; @@ -2068,7 +3631,7 @@ case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) - func_fatal_error "cannot determine name of library object from \`$libobj'" + func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac @@ -2077,8 +3640,8 @@ for arg in $later; do case $arg in -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; @@ -2101,20 +3664,20 @@ esac done - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ + func_quote_arg pretty "$libobj" + test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." + && 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 + 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 + if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" @@ -2126,16 +3689,16 @@ pic_mode=default ;; esac - if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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" + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock else output_obj= need_locks=no @@ -2144,12 +3707,12 @@ # 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 + if test yes = "$need_locks"; 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 + elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: @@ -2157,7 +3720,7 @@ 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 +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." @@ -2175,15 +3738,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 + func_quote_arg pretty "$srcfile" + qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile - if test "$pic_mode" != no; then + if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code @@ -2200,7 +3763,7 @@ func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' - if test "$need_locks" = warn && + if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: @@ -2211,7 +3774,7 @@ 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 +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." @@ -2227,20 +3790,20 @@ fi # Allow error messages only from the first compilation. - if test "$suppress_opt" = yes; then + if test yes = "$suppress_opt"; 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 + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; 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 + if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi @@ -2249,7 +3812,7 @@ func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' - if test "$need_locks" = warn && + if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: @@ -2260,7 +3823,7 @@ 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 +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." @@ -2280,7 +3843,7 @@ func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked - if test "$need_locks" != no; then + if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi @@ -2290,7 +3853,7 @@ } $opt_help || { - test "$opt_mode" = compile && func_mode_compile ${1+"$@"} + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () @@ -2310,7 +3873,7 @@ 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 +(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 @@ -2329,16 +3892,17 @@ -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 + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG + -Xcompiler FLAG pass FLAG directly to the compiler -COMPILE-COMMAND is a command to be used in creating a \`standard' object file +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'." +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." ;; execute) @@ -2351,7 +3915,7 @@ -dlopen FILE add the directory containing FILE to the library path -This mode sets the library path environment variable according to \`-dlopen' +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 @@ -2370,7 +3934,7 @@ 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." +the '--dry-run' option if you just want to see what would be executed." ;; install) @@ -2380,7 +3944,7 @@ Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be -either the \`install' or \`cp' program. +either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: @@ -2406,7 +3970,7 @@ -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 + -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 @@ -2420,7 +3984,8 @@ -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 + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information @@ -2436,24 +4001,26 @@ -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wa,FLAG + -Xassembler FLAG pass linker-specific FLAG directly to the assembler -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. +All other options (arguments beginning with '-') are ignored. -Every other argument is treated as a filename. Files ending in \`.la' are +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 +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 '.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 +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; @@ -2464,7 +4031,7 @@ 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 +(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. @@ -2472,17 +4039,17 @@ ;; *) - func_fatal_help "invalid operation mode \`$opt_mode'" + func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo - $ECHO "Try \`$progname --help' for more information about other modes." + $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 + if test : = "$opt_help"; then func_mode_help else { @@ -2490,7 +4057,7 @@ for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done - } | sed -n '1p; 2,$s/^Usage:/ or: /p' + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do @@ -2498,7 +4065,7 @@ func_mode_help done } | - sed '1d + $SED '1d /^When reporting/,/^Report/{ H d @@ -2515,16 +4082,17 @@ # func_mode_execute arg... func_mode_execute () { - $opt_debug + $debug_cmd + # The first argument is the command name. - cmd="$nonopt" + 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" + || func_fatal_help "'$file' is not a file" dir= case $file in @@ -2534,7 +4102,7 @@ # 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" + || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= @@ -2545,18 +4113,18 @@ 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'" + func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." - dir="$func_dirname_result" + 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'" + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; @@ -2564,18 +4132,18 @@ *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." - dir="$func_dirname_result" + dir=$func_dirname_result ;; *) - func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + 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" + test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then @@ -2587,7 +4155,7 @@ # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. - libtool_execute_magic="$magic" + libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= @@ -2600,12 +4168,12 @@ if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. - file="$progdir/$program" + 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" + file=$progdir/$program fi ;; esac @@ -2613,7 +4181,15 @@ func_append_quoted args "$file" done - if test "X$opt_dry_run" = Xfalse; then + if $opt_dry_run; then + # 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 + else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" @@ -2630,25 +4206,18 @@ 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 + exec_cmd=\$cmd$args fi } -test "$opt_mode" = execute && func_mode_execute ${1+"$@"} +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { - $opt_debug + $debug_cmd + libs= libdirs= admincmds= @@ -2662,11 +4231,11 @@ if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else - func_warning "\`$opt' is not a valid libtool archive" + func_warning "'$opt' is not a valid libtool archive" fi else - func_fatal_error "invalid argument \`$opt'" + func_fatal_error "invalid argument '$opt'" fi done @@ -2681,12 +4250,12 @@ # Remove sysroot references if $opt_dry_run; then for lib in $libs; do - echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + 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 \ + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done @@ -2711,7 +4280,7 @@ fi # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS + $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" @@ -2722,27 +4291,27 @@ 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 "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 " - 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 " - 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" + $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'" + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo @@ -2761,21 +4330,23 @@ exit $EXIT_SUCCESS } -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { - $opt_debug + $debug_cmd + # 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 || + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac; then + case $nonopt in *shtool*) :;; *) false;; esac + then # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " + func_quote_arg pretty "$nonopt" + install_prog="$func_quote_arg_result " arg=$1 shift else @@ -2785,8 +4356,8 @@ # 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" + func_quote_arg pretty "$arg" + func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; @@ -2799,7 +4370,7 @@ opts= prev= install_type= - isdir=no + isdir=false stripme= no_mode=: for arg @@ -2812,7 +4383,7 @@ fi case $arg in - -d) isdir=yes ;; + -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg @@ -2830,7 +4401,7 @@ *) # 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 + if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi @@ -2843,24 +4414,24 @@ esac # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" + func_quote_arg pretty "$arg" + func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then - func_quote_for_eval "$arg2" + func_quote_arg pretty "$arg2" fi - func_append install_shared_prog " $func_quote_for_eval_result" + func_append install_shared_prog " $func_quote_arg_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" + 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" + func_quote_arg pretty "$install_override_mode" + func_append install_shared_prog " -m $func_quote_arg_result" fi fi @@ -2877,19 +4448,19 @@ 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" + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" + 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" + func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; @@ -2898,7 +4469,7 @@ case $file in *.lo) ;; *) - func_fatal_help "\`$destdir' must be an absolute directory name" + func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done @@ -2907,7 +4478,7 @@ # This variable tells wrapper scripts just to set variables rather # than running their programs. - libtool_install_magic="$magic" + libtool_install_magic=$magic staticlibs= future_libdirs= @@ -2927,7 +4498,7 @@ # 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" + || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= @@ -2949,7 +4520,7 @@ fi func_dirname "$file" "/" "" - dir="$func_dirname_result" + dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then @@ -2963,7 +4534,7 @@ # 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" + 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. @@ -2972,29 +4543,36 @@ relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi - func_warning "relinking \`$file'" + func_warning "relinking '$file'" func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + '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" + realname=$1 shift - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T + 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" + tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) - tstripme="" + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= ;; esac ;; @@ -3005,7 +4583,7 @@ if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on + # 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 @@ -3016,14 +4594,14 @@ fi # Do each command in the postinstall commands. - lib="$destdir/$realname" + 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 + name=$func_basename_result + instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. @@ -3035,11 +4613,11 @@ # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then - destfile="$destdir/$destname" + destfile=$destdir/$destname else func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" + destfile=$func_basename_result + destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. @@ -3049,11 +4627,11 @@ staticdest=$func_lo2o_result ;; *.$objext) - staticdest="$destfile" + staticdest=$destfile destfile= ;; *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" + func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac @@ -3062,7 +4640,7 @@ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. - if test "$build_old_libs" = yes; then + if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result @@ -3074,23 +4652,23 @@ *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then - destfile="$destdir/$destname" + destfile=$destdir/$destname else func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" + 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="" + stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result - stripped_ext=".exe" + stripped_ext=.exe fi ;; esac @@ -3118,19 +4696,19 @@ # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" + func_fatal_error "invalid libtool wrapper script '$wrapper'" - finalize=yes + finalize=: 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 + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false fi done @@ -3138,29 +4716,29 @@ func_source "$wrapper" outputname= - if test "$fast_install" = no && test -n "$relink_command"; then + if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { - if test "$finalize" = yes; then + if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" + 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" + $opt_quiet || { + func_quote_arg expand,pretty "$relink_command" + eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else - func_error "error: relink \`$file' with the above command before installing it" + func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi - file="$outputname" + file=$outputname else - func_warning "cannot relink \`$file'" + func_warning "cannot relink '$file'" fi } else @@ -3197,15 +4775,17 @@ for file in $staticlibs; do func_basename "$file" - name="$func_basename_result" + name=$func_basename_result # Set up the ranlib parameters. - oldlib="$destdir/$name" + 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 $oldlib" 'exit $?' + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. @@ -3213,18 +4793,18 @@ done test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$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' + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } -test "$opt_mode" = install && func_mode_install ${1+"$@"} +test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p @@ -3232,16 +4812,17 @@ # 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'` + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + 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 "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" + my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi @@ -3252,7 +4833,7 @@ "") ;; *.c) # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" + nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" @@ -3260,34 +4841,36 @@ 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 */ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#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 +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST -#elif defined(__osf__) +#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 +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + /* External symbol declarations for the compiler. */\ " - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" @@ -3295,7 +4878,7 @@ 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'" + 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 @@ -3315,10 +4898,10 @@ # Prepare the list of exported symbols if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" + 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"' + 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"' @@ -3328,7 +4911,7 @@ } else $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + 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 @@ -3342,22 +4925,22 @@ fi for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" + func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" - name="$func_basename_result" + 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="" + 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 + if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" + dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" @@ -3365,7 +4948,7 @@ fi fi $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then + if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" @@ -3421,6 +5004,11 @@ echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ @@ -3429,11 +5017,30 @@ void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi case $need_lib_prefix in no) @@ -3470,14 +5077,12 @@ # 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*) + *-*-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 + $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; @@ -3494,10 +5099,10 @@ 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"' + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" + symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then @@ -3515,7 +5120,7 @@ esac ;; *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" + func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else @@ -3529,6 +5134,32 @@ fi } +# 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 () +{ + $debug_cmd + + 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 () +{ + $debug_cmd + + 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_win32_libid arg # return the library type of file 'arg' # @@ -3538,8 +5169,9 @@ # Despite the name, also deal with 64 bit binaries. func_win32_libid () { - $opt_debug - win32_libid_type="unknown" + $debug_cmd + + win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import @@ -3549,16 +5181,29 @@ # 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 ' + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + 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, + s|.*|import| p q } }'` + ;; + esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; @@ -3590,7 +5235,8 @@ # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { - $opt_debug + $debug_cmd + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } @@ -3607,7 +5253,8 @@ # specified import library. func_cygming_dll_for_implib_fallback_core () { - $opt_debug + $debug_cmd + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ @@ -3643,8 +5290,8 @@ /./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 + # archive that possess that section. Heuristic: eliminate + # all those that 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 @@ -3655,30 +5302,6 @@ $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 @@ -3692,16 +5315,17 @@ # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then + $debug_cmd + + 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 + 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="" + sharedlib_from_linklib_result= fi } @@ -3709,10 +5333,11 @@ # 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 + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; 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" @@ -3721,7 +5346,7 @@ 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 + if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then @@ -3735,22 +5360,23 @@ # func_extract_archives gentop oldlib ... func_extract_archives () { - $opt_debug - my_gentop="$1"; shift + $debug_cmd + + my_gentop=$1; shift my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" + 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" ;; + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" - my_xlib="$func_basename_result" + my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in @@ -3762,7 +5388,7 @@ esac done extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" @@ -3775,22 +5401,23 @@ cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result 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}" + 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}" + $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_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do @@ -3812,7 +5439,7 @@ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done - func_extract_archives_result="$my_oldobjs" + func_extract_archives_result=$my_oldobjs } @@ -3827,7 +5454,7 @@ # # 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 +# will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () @@ -3838,7 +5465,7 @@ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. @@ -3880,7 +5507,8 @@ if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + func_quote_arg pretty "$ECHO" + qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. @@ -3890,14 +5518,14 @@ \$1 _LTECHO_EOF' } - ECHO=\"$qECHO\" + 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 +# /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match +# (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and @@ -3930,7 +5558,7 @@ # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } @@ -3941,7 +5569,7 @@ lt_dump_args_N=1; for lt_arg do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } @@ -3955,7 +5583,7 @@ *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} @@ -3965,7 +5593,7 @@ *) $ECHO "\ if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} @@ -3982,14 +5610,17 @@ # launches target application with the remaining arguments. func_exec_program () { - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done + 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+\"\$@\"} } @@ -4037,13 +5668,13 @@ test -n \"\$absdir\" && thisdir=\"\$absdir\" " - if test "$fast_install" = yes; then + if test yes = "$fast_install"; 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\`; \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" @@ -4060,7 +5691,7 @@ if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else - $ECHO \"\$relink_command_output\" >&2 + \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi @@ -4095,7 +5726,7 @@ fi # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" @@ -4115,7 +5746,7 @@ fi else # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$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 @@ -4134,7 +5765,7 @@ cat < #include +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + /* declarations of non-ANSI functions */ -#if defined(__MINGW32__) +#if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif -#elif defined(__CYGWIN__) +#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) ... */ +/* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) +#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__) +#elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv -#elif defined(__CYGWIN__) +#elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ +/* #elif defined other platforms ... */ #endif -#if defined(PATH_MAX) +#if defined PATH_MAX # define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) +#elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 @@ -4228,8 +5857,8 @@ # define PATH_SEPARATOR ':' #endif -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 @@ -4262,10 +5891,10 @@ #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ + if (stale) { free (stale); stale = 0; } \ } while (0) -#if defined(LT_DEBUGWRAPPER) +#if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; @@ -4294,11 +5923,16 @@ EOF cat < 0) && IS_PATH_SEPARATOR (new_value[len-1])) + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { - new_value[len-1] = '\0'; + new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); @@ -5057,9 +6691,15 @@ { EOF func_emit_wrapper yes | - $SED -e 's/\([\\"]\)/\\\1/g' \ - -e 's/^/ fputs ("/' -e 's/$/\\n", f);/' - + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' cat <<"EOF" } EOF @@ -5070,27 +6710,47 @@ # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { - $opt_debug + $debug_cmd + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + # func_mode_link arg... func_mode_link () { - $opt_debug + $debug_cmd + 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 + # what 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 + # to make a dll that 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. @@ -5134,10 +6794,11 @@ module=no no_install=no objs= + os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no - preload=no + preload=false prev= prevarg= release= @@ -5149,7 +6810,7 @@ vinfo= vinfo_number=no weak_libs= - single_module="${wl}-single_module" + single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. @@ -5157,15 +6818,15 @@ do case $arg in -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot 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 + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then @@ -5198,11 +6859,11 @@ # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do - arg="$1" + arg=$1 shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" + func_quote_arg pretty,unquoted "$arg" + qarg=$func_quote_arg_unquoted_result + func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then @@ -5215,21 +6876,21 @@ case $prev in bindir) - bindir="$arg" + bindir=$arg prev= continue ;; dlfiles|dlprefiles) - if test "$preload" = no; then + $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" - preload=yes - fi + preload=: + } case $arg in *.la | *.lo) ;; # We handle these cases below. force) - if test "$dlself" = no; then + if test no = "$dlself"; then dlself=needless export_dynamic=yes fi @@ -5237,9 +6898,9 @@ continue ;; self) - if test "$prev" = dlprefiles; then + if test dlprefiles = "$prev"; then dlself=yes - elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless @@ -5249,7 +6910,7 @@ continue ;; *) - if test "$prev" = dlfiles; then + if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" @@ -5260,14 +6921,14 @@ esac ;; expsyms) - export_symbols="$arg" + export_symbols=$arg test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" + || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) - export_symbols_regex="$arg" + export_symbols_regex=$arg prev= continue ;; @@ -5285,7 +6946,13 @@ continue ;; inst_prefix) - inst_prefix_dir="$arg" + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. prev= continue ;; @@ -5309,21 +6976,21 @@ 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'" + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result - if test "$pic_object" != none; then + if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" + pic_object=$xdir$pic_object - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue @@ -5334,7 +7001,7 @@ fi # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then + if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= @@ -5342,23 +7009,23 @@ # A PIC object. func_append libobjs " $pic_object" - arg="$pic_object" + arg=$pic_object fi # Non-PIC object. - if test "$non_pic_object" != none; then + if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" + 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" + if test -z "$pic_object" || test none = "$pic_object"; 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" + non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else @@ -5366,7 +7033,7 @@ if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result @@ -5374,24 +7041,29 @@ func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else - func_fatal_error "\`$arg' is not a valid libtool object" + func_fatal_error "'$arg' is not a valid libtool object" fi fi done else - func_fatal_error "link input file \`$arg' does not exist" + func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; precious_regex) - precious_files_regex="$arg" + precious_files_regex=$arg prev= continue ;; release) - release="-$arg" + release=-$arg prev= continue ;; @@ -5403,7 +7075,7 @@ func_fatal_error "only absolute run-paths are allowed" ;; esac - if test "$prev" = rpath; then + if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; @@ -5418,7 +7090,7 @@ continue ;; shrext) - shrext_cmds="$arg" + shrext_cmds=$arg prev= continue ;; @@ -5427,6 +7099,13 @@ prev= continue ;; + xassembler) + func_append compiler_flags " -Xassembler $qarg" + prev= + func_append compile_command " -Xassembler $qarg" + func_append finalize_command " -Xassembler $qarg" + continue + ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" @@ -5458,7 +7137,7 @@ esac fi # test -n "$prev" - prevarg="$arg" + prevarg=$arg case $arg in -all-static) @@ -5472,7 +7151,7 @@ -allow-undefined) # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" + func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) @@ -5504,7 +7183,7 @@ 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 + if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex @@ -5538,9 +7217,9 @@ 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'" + func_fatal_error "require no space between '-L' and '$1'" else - func_fatal_error "need path for \`-L' option" + func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" @@ -5551,8 +7230,8 @@ *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" - dir="$absdir" + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir ;; esac case "$deplibs " in @@ -5587,7 +7266,7 @@ ;; -l*) - if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) @@ -5595,11 +7274,11 @@ ;; *-*-os2*) # These systems don't actually have a C library (as such) - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework @@ -5608,16 +7287,16 @@ ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work - test "X$arg" = "X-lc" && continue + test X-lc = "X$arg" && continue ;; esac - elif test "X$arg" = "X-lc_r"; then + elif test X-lc_r = "X$arg"; then case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; @@ -5627,6 +7306,11 @@ continue ;; + -mllvm) + prev=mllvm + continue + ;; + -module) module=yes continue @@ -5642,8 +7326,21 @@ prev=xcompiler continue ;; - - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + # Solaris ld rejects as of 11.4. Refer to Oracle bug 22985199. + -pthread) + case $host in + *solaris2*) ;; + *) + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + ;; + esac + continue + ;; + -mt|-mthreads|-kthread|-Kthread|-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" @@ -5655,7 +7352,7 @@ ;; -multi_module) - single_module="${wl}-multi_module" + single_module=$wl-multi_module continue ;; @@ -5669,8 +7366,8 @@ *-*-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" + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; @@ -5688,6 +7385,11 @@ continue ;; + -os2dllname) + prev=os2dllname + continue + ;; + -o) prev=output ;; -precious-files-regex) @@ -5775,14 +7477,14 @@ func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= - save_ifs="$IFS"; IFS=',' + 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" + IFS=$save_ifs + func_quote_arg pretty "$flag" + func_append arg " $func_quote_arg_result" + func_append compiler_flags " $func_quote_arg_result" done - IFS="$save_ifs" + IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; @@ -5791,19 +7493,24 @@ func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= - save_ifs="$IFS"; IFS=',' + 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" + IFS=$save_ifs + func_quote_arg pretty "$flag" + func_append arg " $wl$func_quote_arg_result" + func_append compiler_flags " $wl$func_quote_arg_result" + func_append linker_flags " $func_quote_arg_result" done - IFS="$save_ifs" + IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; + -Xassembler) + prev=xassembler + continue + ;; + -Xcompiler) prev=xcompiler continue @@ -5821,8 +7528,8 @@ # -msg_* for osf cc -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result ;; # Flags to be passed through unchanged, with rationale: @@ -5834,25 +7541,51 @@ # -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 + # -fstack-protector* stack protector 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 + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -specs=* GCC specs files + # -stdlib=* select c++ std lib with clang + # -fsanitize=* Clang/GCC memory and address sanitizer + # -fuse-ld=* Linker select flags for GCC + # -Wa,* Pass flags directly to the assembler -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" + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ + -specs=*|-fsanitize=*|-fuse-ld=*|-Wa,*) + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result + fi + ;; + # Some other compiler flag. -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result ;; *.$objext) @@ -5873,21 +7606,21 @@ 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'" + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result - if test "$pic_object" != none; then + test none = "$pic_object" || { # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" + pic_object=$xdir$pic_object - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue @@ -5898,7 +7631,7 @@ fi # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then + if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= @@ -5906,23 +7639,23 @@ # A PIC object. func_append libobjs " $pic_object" - arg="$pic_object" - fi + arg=$pic_object + } # Non-PIC object. - if test "$non_pic_object" != none; then + if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" + 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" + if test -z "$pic_object" || test none = "$pic_object"; 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" + non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else @@ -5930,7 +7663,7 @@ if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result @@ -5938,7 +7671,7 @@ func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else - func_fatal_error "\`$arg' is not a valid libtool object" + func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; @@ -5954,11 +7687,11 @@ # A libtool-controlled library. func_resolve_sysroot "$arg" - if test "$prev" = dlfiles; then + if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= - elif test "$prev" = dlprefiles; then + elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= @@ -5972,8 +7705,8 @@ *) # 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" + func_quote_arg pretty "$arg" + arg=$func_quote_arg_result ;; esac # arg @@ -5985,9 +7718,9 @@ done # argument parsing loop test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" + func_fatal_help "the '$prevarg' option requires an argument" - if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" @@ -5996,20 +7729,23 @@ oldlibs= # calculate the name of the file, without its directory func_basename "$output" - outputname="$func_basename_result" - libobjs_save="$libobjs" + 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\'\` + 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\" + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" + output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. @@ -6032,7 +7768,7 @@ # 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 + if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac @@ -6040,7 +7776,7 @@ func_append libs " $deplib" done - if test "$linkmode" = lib; then + if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps @@ -6072,7 +7808,7 @@ case $file in *.la) ;; *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done @@ -6080,7 +7816,7 @@ prog) compile_deplibs= finalize_deplibs= - alldeplibs=no + alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" @@ -6092,29 +7828,29 @@ 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 + if test lib,link = "$linkmode,$pass"; 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" + deplibs=$tmp_deplibs fi - if test "$linkmode,$pass" = "lib,link" || - test "$linkmode,$pass" = "prog,scan"; then - libs="$deplibs" + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs deplibs= fi - if test "$linkmode" = prog; then + if test prog = "$linkmode"; then case $pass in - dlopen) libs="$dlfiles" ;; - dlpreopen) libs="$dlprefiles" ;; + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then + if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs @@ -6135,25 +7871,26 @@ esac done done - libs="$dlprefiles" + libs=$dlprefiles fi - if test "$pass" = dlopen; then + if test dlopen = "$pass"; then # Collect dlpreopened libraries - save_deplibs="$deplibs" + save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= - found=no + found=false case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) - if test "$linkmode,$pass" = "prog,link"; then + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" - if test "$linkmode" = lib ; then + if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; @@ -6163,13 +7900,13 @@ continue ;; -l*) - if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result - if test "$linkmode" = lib; then + if test lib = "$linkmode"; 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" @@ -6177,31 +7914,22 @@ 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}" + lib=$searchdir/lib$name$search_ext if test -f "$lib"; then - if test "$search_ext" = ".la"; then - found=yes + if test .la = "$search_ext"; then + found=: else - found=no + found=false 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 $found; then + # 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 + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then @@ -6209,19 +7937,19 @@ old_library= func_source "$lib" for l in $old_library $library_names; do - ll="$l" + ll=$l done - if test "X$ll" = "X$old_library" ; then # only static version available - found=no + if test "X$ll" = "X$old_library"; then # only static version available + found=false func_dirname "$lib" "" "." - ladir="$func_dirname_result" + ladir=$func_dirname_result lib=$ladir/$old_library - if test "$linkmode,$pass" = "prog,link"; then + if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" - test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi @@ -6230,15 +7958,25 @@ *) ;; esac fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue fi ;; # -l *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then + if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then + if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; @@ -6251,18 +7989,18 @@ case $linkmode in lib) deplibs="$deplib $deplibs" - test "$pass" = conv && continue + test conv = "$pass" && 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 + if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi - if test "$pass" = scan; then + if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" @@ -6273,13 +8011,13 @@ func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) - func_warning "\`-L' is ignored for archives/objects" + func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) - if test "$pass" = link; then + if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result @@ -6297,7 +8035,7 @@ lib=$func_resolve_sysroot_result ;; *.$libext) - if test "$pass" = conv; then + if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi @@ -6308,21 +8046,26 @@ case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) - valid_a_lib=no + valid_a_lib=false 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 + valid_a_lib=: fi ;; pass_all) - valid_a_lib=yes + valid_a_lib=: ;; esac - if test "$valid_a_lib" != yes; then + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" @@ -6330,18 +8073,13 @@ 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 + if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" @@ -6352,10 +8090,10 @@ esac # linkmode ;; # *.$libext *.lo | *.$objext) - if test "$pass" = conv; then + if test conv = "$pass"; then deplibs="$deplib $deplibs" - elif test "$linkmode" = prog; then - if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" @@ -6368,22 +8106,20 @@ continue ;; %DEPLIBS%) - alldeplibs=yes + alldeplibs=: 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 + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # 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_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." - ladir="$func_dirname_result" + ladir=$func_dirname_result dlname= dlopen= @@ -6413,30 +8149,30 @@ 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 + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi - if test "$pass" = conv; then + if test conv = "$pass"; 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'" + 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" + elif test prog != "$linkmode" && test lib != "$linkmode"; 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 + if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac @@ -6450,26 +8186,26 @@ # 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 + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do - linklib="$l" + linklib=$l done fi if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" + 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 dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || - test "$dlopen_support" != yes || - test "$build_libtool_libs" = no; then + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + 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 @@ -6483,40 +8219,40 @@ # We need an absolute path. case $ladir in - [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + [\\/]* | [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 "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" - abs_ladir="$ladir" + abs_ladir=$ladir fi ;; esac func_basename "$lib" - laname="$func_basename_result" + laname=$func_basename_result # Find the relevant object directory and library name. - if test "X$installed" = Xyes; then + if test yes = "$installed"; 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" + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$libdir" + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir fi - test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then - dir="$ladir" - absdir="$abs_ladir" + dir=$ladir + absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else - dir="$ladir/$objdir" - absdir="$abs_ladir/$objdir" + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi @@ -6525,11 +8261,11 @@ 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'" + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi - case "$host" in + case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both @@ -6573,9 +8309,9 @@ if test -z "$libdir"; then # Link the convenience library - if test "$linkmode" = lib; then + if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" - elif test "$linkmode,$pass" = "prog,link"; then + elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else @@ -6585,14 +8321,14 @@ fi - if test "$linkmode" = prog && test "$pass" != link; then + if test prog = "$linkmode" && test link != "$pass"; 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 + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: fi tmp_libs= @@ -6604,14 +8340,14 @@ ;; esac # Need to link against all dependency_libs? - if test "$linkalldeplibs" = yes; then + if $linkalldeplibs; 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 + if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac @@ -6621,15 +8357,15 @@ continue fi # $linkmode = prog... - if test "$linkmode,$pass" = "prog,link"; then + if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && - { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path - if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in + case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac @@ -6658,9 +8394,9 @@ esac fi # $linkmode,$pass = prog,link... - if test "$alldeplibs" = yes && - { test "$deplibs_check_method" = pass_all || - { test "$build_libtool_libs" = yes && + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue @@ -6669,19 +8405,19 @@ 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 + if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && - { test "$use_static_libs" = no || test -z "$old_library"; }; then + { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in - *cygwin* | *mingw* | *cegcc*) + *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) - if test "$installed" = no; then + if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi @@ -6691,24 +8427,24 @@ # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" + dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" + dlopenmodule=$dlpremoduletest break fi done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo - if test "$linkmode" = prog; then + if test prog = "$linkmode"; 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 + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. @@ -6736,43 +8472,43 @@ # figure out the soname set dummy $library_names shift - realname="$1" + 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" + soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in - *cygwin* | mingw* | *cegcc*) + *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result - versuffix="-$major" + versuffix=-$major ;; esac eval soname=\"$soname_spec\" else - soname="$realname" + soname=$realname fi # Make a new name for the extract_expsyms_cmds to use - soroot="$soname" + soroot=$soname func_basename "$soroot" - soname="$func_basename_result" + 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_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_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 @@ -6780,58 +8516,58 @@ linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" - if test "$linkmode" = prog || test "$opt_mode" != relink; then + if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) - if test "$hardcode_direct" = no; then - add="$dir/$linklib" + if test no = "$hardcode_direct"; then + add=$dir/$linklib case $host in - *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; - *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ - *-*-unixware7*) add_dir="-L$dir" ;; + *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not + # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then + $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 + 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" + add=$dir/$old_library fi elif test -n "$old_library"; then - add="$dir/$old_library" + add=$dir/$old_library fi fi esac - elif test "$hardcode_minus_L" = no; then + elif test no = "$hardcode_minus_L"; then case $host in - *-*-sunos*) add_shlibpath="$dir" ;; + *-*-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" + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; 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$dir" + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; 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 @@ -6840,10 +8576,10 @@ ;; esac fi - add="-l$name" - elif test "$hardcode_shlibpath_var" = yes; then - add_shlibpath="$dir" - add="-l$name" + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name else lib_linked=no fi @@ -6851,7 +8587,7 @@ *) lib_linked=no ;; esac - if test "$lib_linked" != yes; then + if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi @@ -6861,15 +8597,15 @@ *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi - if test "$linkmode" = prog; then + if test prog = "$linkmode"; 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 + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; @@ -6878,33 +8614,33 @@ fi fi - if test "$linkmode" = prog || test "$opt_mode" = relink; then + if test prog = "$linkmode" || test relink = "$opt_mode"; 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 + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac - add="-l$name" - elif test "$hardcode_automatic" = yes; then + add=-l$name + elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && - test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib else - add="$libdir/$linklib" + add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. - add_dir="-L$libdir" + 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 @@ -6913,10 +8649,10 @@ ;; esac fi - add="-l$name" + add=-l$name fi - if test "$linkmode" = prog; then + if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else @@ -6924,43 +8660,43 @@ test -n "$add" && deplibs="$add $deplibs" fi fi - elif test "$linkmode" = prog; then + elif test prog = "$linkmode"; 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" + if test unsupported != "$hardcode_direct"; 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 + elif test yes = "$build_libtool_libs"; then # Not a shared library - if test "$deplibs_check_method" != pass_all; then + if test pass_all != "$deplibs_check_method"; 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 "*** Warning: This system cannot 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 + if test yes = "$module"; 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 "*** 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." + echo "*** 'nm' from GNU binutils and a full rebuild may help." fi - if test "$build_old_libs" = no; then + if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else @@ -6973,11 +8709,11 @@ fi fi # link shared/static library? - if test "$linkmode" = lib; then + if test lib = "$linkmode"; then if test -n "$dependency_libs" && - { test "$hardcode_into_libs" != yes || - test "$build_old_libs" = yes || - test "$link_static" = yes; }; then + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do @@ -6991,12 +8727,12 @@ *) func_append temp_deplibs " $libdir";; esac done - dependency_libs="$temp_deplibs" + 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" + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do @@ -7006,7 +8742,7 @@ func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac - if $opt_preserve_dup_deps ; then + if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; @@ -7015,12 +8751,12 @@ func_append tmp_libs " $func_resolve_sysroot_result" done - if test "$link_all_deplibs" != no; then + if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in - -L*) path="$deplib" ;; + -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result @@ -7028,12 +8764,12 @@ dir=$func_dirname_result # We need an absolute path. case $dir in - [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + [\\/]* | [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" + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir fi ;; esac @@ -7041,35 +8777,35 @@ 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 + 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 -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}}'` + 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}" + 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" + path=-L$absdir/$objdir ;; esac else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" + func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" + func_warning "'$deplib' seems to be moved" - path="-L$absdir" + path=-L$absdir fi ;; esac @@ -7081,23 +8817,23 @@ fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then + if test link = "$pass"; then + if test prog = "$linkmode"; 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 + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; 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 + if test dlopen != "$pass"; then + test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do @@ -7107,12 +8843,12 @@ esac done newlib_search_path= - fi + } - if test "$linkmode,$pass" != "prog,link"; then - vars="deplibs" - else + if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" + else + vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order @@ -7170,62 +8906,93 @@ eval $var=\"$tmp_libs\" done # for var fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | $SED 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= - for i in $dependency_libs ; do + for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) - i="" + i= ;; esac - if test -n "$i" ; then + 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" + if test prog = "$linkmode"; then + dlfiles=$newdlfiles fi - if test "$linkmode" = prog || test "$linkmode" = lib; then - dlprefiles="$newdlprefiles" + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles fi case $linkmode in oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; + func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" + func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" + func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" + func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ - func_warning "\`-release' is ignored for archives" + func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" + func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no - oldlibs="$output" + oldlibs=$output func_append objs "$old_deplibs" ;; lib) - # Make sure we only generate libraries of the form `libNAME.la'. + # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" @@ -7234,10 +9001,10 @@ eval libname=\"$libname_spec\" ;; *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" - if test "$need_lib_prefix" != no; then + if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result @@ -7251,8 +9018,8 @@ 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" + if test pass_all != "$deplibs_check_method"; 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" @@ -7261,21 +9028,21 @@ fi fi - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" + test no = "$dlself" \ + || 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" + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" - install_libdir="$1" + install_libdir=$1 oldlibs= if test -z "$rpath"; then - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. - # Some compilers have problems with a `.al' extension so + # 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" @@ -7284,20 +9051,20 @@ fi test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" + func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. - save_ifs="$IFS"; IFS=':' + save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift - IFS="$save_ifs" + IFS=$save_ifs test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" + func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts @@ -7305,41 +9072,42 @@ case $vinfo_number in yes) - number_major="$1" - number_minor="$2" - number_revision="$3" + 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 + # that has an extra 1 added just for fun # case $version_type in - darwin|linux|osf|windows|none) + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|midnightbsd-elf|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result - age="$number_minor" - revision="$number_revision" + age=$number_minor + revision=$number_revision ;; - freebsd-aout|freebsd-elf|qnx|sunos) - current="$number_major" - revision="$number_minor" - age="0" + freebsd-aout|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" + age=$number_minor + revision=$number_minor lt_irix_increment=no ;; esac ;; no) - current="$1" - revision="$2" - age="$3" + current=$1 + revision=$2 + age=$3 ;; esac @@ -7347,30 +9115,30 @@ 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" + 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" + 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" + 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" + 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. @@ -7385,26 +9153,36 @@ # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result - versuffix="$major.$age.$revision" + 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" + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac ;; freebsd-aout) - major=".$current" - versuffix=".$current.$revision"; + major=.$current + versuffix=.$current.$revision ;; - freebsd-elf) - major=".$current" - versuffix=".$current" + freebsd-elf | midnightbsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision ;; irix | nonstopux) - if test "X$lt_irix_increment" = "Xno"; then + if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 @@ -7415,69 +9193,74 @@ nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac - verstring="$verstring_prefix$major.$revision" + verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision - while test "$loop" -ne 0; do + while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result - verstring="$verstring_prefix$major.$iface:$verstring" + verstring=$verstring_prefix$major.$iface:$verstring done - # Before this point, $major must not contain `.'. + # Before this point, $major must not contain '.'. major=.$major - versuffix="$major.$revision" + versuffix=$major.$revision ;; - linux) + linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result - versuffix="$major.$age.$revision" + versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result - versuffix=".$current.$age.$revision" - verstring="$current.$age.$revision" + 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 + while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result - verstring="$verstring:${iface}.0" + verstring=$verstring:$iface.0 done # Make executables depend on our current version. - func_append verstring ":${current}.0" + func_append verstring ":$current.0" ;; qnx) - major=".$current" - versuffix=".$current" + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current ;; sunos) - major=".$current" - versuffix=".$current.$revision" + major=.$current + versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 filesystems. + # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result - versuffix="-$major" + versuffix=-$major ;; *) - func_fatal_configuration "unknown library version type \`$version_type'" + func_fatal_configuration "unknown library version type '$version_type'" ;; esac @@ -7491,42 +9274,45 @@ verstring= ;; *) - verstring="0.0" + verstring=0.0 ;; esac - if test "$need_version" = no; then + if test no = "$need_version"; then versuffix= else - versuffix=".0.0" + 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 + if test yes,no = "$avoid_version,$need_version"; then major= versuffix= - verstring="" + 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 + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi fi else # Don't allow undefined symbols. - allow_undefined_flag="$no_undefined_flag" + allow_undefined_flag=$no_undefined_flag fi fi - func_generate_dlsyms "$libname" "$libname" "yes" + func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= + test " " = "$libobjs" && libobjs= - if test "$opt_mode" != relink; then + if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= @@ -7535,8 +9321,8 @@ case $p in *.$objext | *.gcno) ;; - $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) - if test "X$precious_files_regex" != "X"; then + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue @@ -7552,11 +9338,11 @@ fi # Now set the variables for building old libraries. - if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. @@ -7577,13 +9363,13 @@ *) func_append finalize_rpath " $libdir" ;; esac done - if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened - old_dlfiles="$dlfiles" + old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in @@ -7593,7 +9379,7 @@ done # Make sure dlprefiles contains only unique files - old_dlprefiles="$dlprefiles" + old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in @@ -7602,7 +9388,7 @@ esac done - if test "$build_libtool_libs" = yes; then + if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) @@ -7615,7 +9401,7 @@ *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) @@ -7626,7 +9412,7 @@ ;; *) # Add libc to deplibs on all other systems if necessary. - if test "$build_libtool_need_lc" = "yes"; then + if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; @@ -7642,9 +9428,9 @@ # 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="" + release= + versuffix= + major= newdeplibs= droppeddeps=no case $deplibs_check_method in @@ -7673,20 +9459,20 @@ -l*) func_stripname -l '' "$i" name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $i "*) func_append newdeplibs " $i" - i="" + i= ;; esac fi - if test -n "$i" ; then + if test -n "$i"; then libname=`eval "\\$ECHO \"$libname_spec\""` deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` set dummy $deplib_matches; shift deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then func_append newdeplibs " $i" else droppeddeps=yes @@ -7716,20 +9502,20 @@ $opt_dry_run || $RM conftest if $LTCC $LTCFLAGS -o conftest conftest.c $i; then ldd_output=`ldd conftest` - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $i "*) func_append newdeplibs " $i" - i="" + i= ;; esac fi - if test -n "$i" ; then + if test -n "$i"; then libname=`eval "\\$ECHO \"$libname_spec\""` deplib_matches=`eval "\\$ECHO \"$library_names_spec\""` set dummy $deplib_matches; shift deplib_match=$1 - if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then + if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then func_append newdeplibs " $i" else droppeddeps=yes @@ -7766,24 +9552,24 @@ -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" - a_deplib="" + a_deplib= ;; esac fi - if test -n "$a_deplib" ; then + if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` if test -n "$file_magic_glob"; then libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob` else libnameglob=$libname fi - test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob` + test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do - if test "$want_nocaseglob" = yes; then + if test yes = "$want_nocaseglob"; then shopt -s nocaseglob potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` $nocaseglob @@ -7801,25 +9587,25 @@ # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? - potlib="$potent_lib" + potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do - potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in - [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + [\\/]* | [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="" + a_deplib= break 2 fi done done fi - if test -n "$a_deplib" ; then + if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." @@ -7827,7 +9613,7 @@ 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 + 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" @@ -7850,30 +9636,30 @@ -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result - if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" - a_deplib="" + a_deplib= ;; esac fi - if test -n "$a_deplib" ; then + 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 + 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="" + a_deplib= break 2 fi done done fi - if test -n "$a_deplib" ; then + if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." @@ -7881,7 +9667,7 @@ 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 + 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" @@ -7897,18 +9683,18 @@ done # Gone through all deplibs. ;; none | unknown | *) - newdeplibs="" + 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 + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo - if test "X$deplibs_check_method" = "Xnone"; then + if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." @@ -7932,8 +9718,8 @@ ;; esac - if test "$droppeddeps" = yes; then - if test "$module" = yes; then + if test yes = "$droppeddeps"; then + if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" @@ -7942,12 +9728,12 @@ 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 "*** 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." + echo "*** 'nm' from GNU binutils and a full rebuild may help." fi - if test "$build_old_libs" = no; then - oldlibs="$output_objdir/$libname.$libext" + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else @@ -7958,14 +9744,14 @@ echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." - if test "$allow_undefined" = no; then + if test no = "$allow_undefined"; 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" + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else @@ -8011,7 +9797,7 @@ *) func_append new_libs " $deplib" ;; esac done - deplibs="$new_libs" + deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= @@ -8019,20 +9805,25 @@ dlname= # Test again, we may have decided not to build it any more - if test "$build_libtool_libs" = yes; then - if test "$hardcode_into_libs" = yes; then + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= - rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + rpath=$finalize_rpath + test relink = "$opt_mode" || 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" + hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in @@ -8050,19 +9841,15 @@ elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) func_apped perm_rpath " $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" - if test -n "$hardcode_libdir_flag_spec_ld"; then - eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" - else - eval dep_rpath=\"$hardcode_libdir_flag_spec\" - fi + 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. @@ -8075,8 +9862,8 @@ test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi - shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi @@ -8086,19 +9873,19 @@ eval library_names=\"$library_names_spec\" set dummy $library_names shift - realname="$1" + realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else - soname="$realname" + soname=$realname fi if test -z "$dlname"; then dlname=$soname fi - lib="$output_objdir/$realname" + lib=$output_objdir/$realname linknames= for link do @@ -8112,7 +9899,7 @@ 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" + export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi @@ -8121,31 +9908,31 @@ 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 + func_dll_def_p "$export_symbols" || { # 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" + 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" + if test yes = "$always_export_symbols" || 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='~' + save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do - IFS="$save_ifs" + 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 @@ -8159,7 +9946,7 @@ try_normal_branch=no ;; esac - if test "$try_normal_branch" = yes \ + if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then @@ -8170,7 +9957,7 @@ output_la=$func_basename_result save_libobjs=$libobjs save_output=$output - output=${output_objdir}/${output_la}.nm + 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" @@ -8193,8 +9980,8 @@ break fi done - IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi @@ -8202,16 +9989,16 @@ 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" + 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 + if test : != "$skipped_export" && 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" + 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 + # '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. @@ -8230,11 +10017,11 @@ ;; esac done - deplibs="$tmp_deplibs" + deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && + test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. @@ -8245,7 +10032,7 @@ eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience @@ -8254,18 +10041,18 @@ fi fi - if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + if test yes = "$thread_safe" && 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 + if test relink = "$opt_mode"; 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 yes = "$module" && 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 @@ -8283,7 +10070,7 @@ fi fi - if test "X$skipped_export" != "X:" && + if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then @@ -8316,8 +10103,8 @@ 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 + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs @@ -8329,14 +10116,14 @@ 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 + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; 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 + if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi @@ -8351,7 +10138,7 @@ else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext + output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result @@ -8363,13 +10150,13 @@ func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result - if test "X$objlist" = X || + if test -z "$objlist" || 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 + if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" @@ -8379,10 +10166,10 @@ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi - last_robj=$output_objdir/$output_la-${k}.$objext + last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext + output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result @@ -8394,9 +10181,9 @@ # 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\" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" @@ -8404,9 +10191,9 @@ output= fi - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" + ${skipped_export-false} && { + 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. @@ -8415,24 +10202,24 @@ 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='~' + 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" + IFS=$save_ifs + $opt_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -8441,7 +10228,7 @@ exit $lt_exit } done - IFS="$save_ifs" + 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"' @@ -8449,18 +10236,18 @@ fi fi - if ${skipped_export-false}; then + ${skipped_export-false} && { 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" + 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" + 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 + # '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. @@ -8469,7 +10256,7 @@ 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. @@ -8483,7 +10270,7 @@ # value of $libobjs for piecewise linking. # Do each of the archive commands. - if test "$module" = yes && test -n "$module_cmds" ; then + if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else @@ -8505,7 +10292,7 @@ # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles @@ -8513,19 +10300,20 @@ test "X$libobjs" = "X " && libobjs= fi - save_ifs="$IFS"; IFS='~' + save_ifs=$IFS; IFS='~' for cmd in $cmds; do - IFS="$save_ifs" + IFS=$sp$nl eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" + IFS=$save_ifs + $opt_quiet || { + func_quote_arg expand,pretty "$cmd" + eval "func_echo $func_quote_arg_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) @@ -8534,10 +10322,10 @@ exit $lt_exit } done - IFS="$save_ifs" + IFS=$save_ifs # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then + if test relink = "$opt_mode"; 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 @@ -8557,39 +10345,39 @@ done # If -module or -export-dynamic was specified, set the dlname. - if test "$module" = yes || test "$export_dynamic" = yes; then + if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. - dlname="$soname" + dlname=$soname fi fi ;; obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; + func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" + func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" + func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" + func_warning "'-version-info' is ignored for objects" test -n "$release" && \ - func_warning "\`-release' is ignored for objects" + 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" + func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" @@ -8597,7 +10385,7 @@ ;; *) libobj= - obj="$output" + obj=$output ;; esac @@ -8610,17 +10398,19 @@ # 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 reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac 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'` + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else - gentop="$output_objdir/${obj}x" + gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience @@ -8629,12 +10419,12 @@ fi # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + test yes = "$build_libtool_libs" || 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 + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs - output="$obj" + output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. @@ -8646,7 +10436,7 @@ exit $EXIT_SUCCESS fi - if test "$build_libtool_libs" != yes; then + test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi @@ -8656,12 +10446,12 @@ # $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 + if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" - output="$libobj" + output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi @@ -8678,16 +10468,14 @@ output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" + func_warning "'-version-info' is ignored for programs" test -n "$release" && \ - func_warning "\`-release' is ignored for programs" + 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." + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) @@ -8701,11 +10489,11 @@ *-*-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 + if test CXX = "$tagname"; 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" + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" ;; esac fi @@ -8741,7 +10529,7 @@ *) func_append new_libs " $deplib" ;; esac done - compile_deplibs="$new_libs" + compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" @@ -8765,7 +10553,7 @@ if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" + hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in @@ -8788,7 +10576,7 @@ fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; @@ -8805,10 +10593,10 @@ # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" + libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi - compile_rpath="$rpath" + compile_rpath=$rpath rpath= hardcode_libdirs= @@ -8816,7 +10604,7 @@ if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then - hardcode_libdirs="$libdir" + hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in @@ -8841,45 +10629,43 @@ # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then - libdir="$hardcode_libdirs" + libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi - finalize_rpath="$rpath" + finalize_rpath=$rpath - if test -n "$libobjs" && test "$build_old_libs" = yes; then + if test -n "$libobjs" && test yes = "$build_old_libs"; 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" + func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi - wrappers_required=yes + wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no + wrappers_required=false ;; *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi + test yes = "$build_libtool_libs" || wrappers_required=false ;; *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false fi ;; esac - if test "$wrappers_required" = no; then + $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` - link_command="$compile_command$compile_rpath" + link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 @@ -8892,12 +10678,12 @@ fi # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + 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" @@ -8927,9 +10713,9 @@ fi fi - if test "$no_install" = yes; then + if test yes = "$no_install"; then # We don't need to create a wrapper script. - link_command="$compile_var$compile_command$compile_rpath" + 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. @@ -8946,27 +10732,28 @@ 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" + case $hardcode_action,$fast_install in + relink,*) + # 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 + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` @@ -8994,12 +10781,13 @@ 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" + func_quote_arg pretty "$var_value" + relink_command="$var=$func_quote_arg_result; export $var; $relink_command" fi done - relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + func_quote eval cd "`pwd`" + func_quote_arg pretty,unquoted "($func_quote_result; $relink_command)" + relink_command=$func_quote_arg_unquoted_result fi # Only actually do things if not in dry run mode. @@ -9023,8 +10811,8 @@ 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" + 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 @@ -9045,7 +10833,7 @@ 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 + if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result @@ -9068,25 +10856,27 @@ # 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" + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience build_libtool_libs=no - else + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi - fi - addlibs="$old_convenience" - fi + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac if test -n "$addlibs"; then - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs @@ -9094,13 +10884,13 @@ fi # Do each command in the archive commands. - if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; 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" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles @@ -9121,7 +10911,7 @@ : else echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" + gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs @@ -9130,7 +10920,7 @@ for obj in $save_oldobjs do func_basename "$obj" - objbase="$func_basename_result" + objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) @@ -9152,6 +10942,8 @@ 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" @@ -9197,18 +10989,18 @@ else # the above command should be used before it gets too long oldobjs=$objlist - if test "$obj" = "$last_oldobj" ; then + 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\" + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist - if test "X$oldobjs" = "X" ; then + if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" @@ -9225,7 +11017,7 @@ case $output in *.la) old_library= - test "$build_old_libs" = yes && old_library="$libname.$libext" + test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior @@ -9235,35 +11027,38 @@ 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" + func_quote_arg pretty,unquoted "$var_value" + relink_command="$var=$func_quote_arg_unquoted_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 + func_quote eval cd "`pwd`" + relink_command="($func_quote_result; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + func_quote_arg pretty,unquoted "$relink_command" + relink_command=$func_quote_arg_unquoted_result + if test yes = "$hardcode_automatic"; 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 yes = "$installed"; then if test -z "$install_libdir"; then break fi - output="$output_objdir/$outputname"i + 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" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $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_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) @@ -9279,23 +11074,23 @@ *) func_append newdependency_libs " $deplib" ;; esac done - dependency_libs="$newdependency_libs" + 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` + 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_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done - dlfiles="$newdlfiles" + dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in @@ -9305,34 +11100,34 @@ # 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` + 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_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done - dlprefiles="$newdlprefiles" + dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done - dlfiles="$newdlfiles" + dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in - [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done - dlprefiles="$newdlprefiles" + dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin @@ -9348,10 +11143,9 @@ 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 + if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname + tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname @@ -9360,7 +11154,7 @@ esac $ECHO > $output "\ # $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. @@ -9374,7 +11168,7 @@ # The name of the static archive. old_library='$old_library' -# Linker flags that can not go in dependency_libs. +# Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. @@ -9400,7 +11194,7 @@ # Directory that this library needs to be installed in: libdir='$install_libdir'" - if test "$installed" = no && test "$need_relink" = yes; then + if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi @@ -9415,27 +11209,29 @@ exit $EXIT_SUCCESS } -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi # func_mode_uninstall arg... func_mode_uninstall () { - $opt_debug - RM="$nonopt" + $debug_cmd + + RM=$nonopt files= - rmforce= + rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. - libtool_install_magic="$magic" + libtool_install_magic=$magic for arg do case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; + -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac @@ -9448,18 +11244,18 @@ for file in $files; do func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir else - odir="$dir/$objdir" + odir=$dir/$objdir fi func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then + if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; @@ -9474,11 +11270,11 @@ elif test -d "$file"; then exit_status=1 continue - elif test "$rmforce" = yes; then + elif $rmforce; then continue fi - rmfiles="$file" + rmfiles=$file case $name in *.la) @@ -9492,7 +11288,7 @@ done test -n "$old_library" && func_append rmfiles " $odir/$old_library" - case "$opt_mode" in + case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; @@ -9503,12 +11299,12 @@ 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' + func_execute_cmds "$postuninstall_cmds" '$rmforce || 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' + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; @@ -9524,21 +11320,19 @@ func_source $dir/$name # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then + if test -n "$pic_object" && test none != "$pic_object"; 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 + if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) - if test "$opt_mode" = clean ; then + if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) @@ -9565,12 +11359,12 @@ # 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/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && 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" + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" fi fi fi @@ -9579,7 +11373,7 @@ func_show_eval "$RM $rmfiles" 'exit_status=1' done - # Try to remove the ${objdir}s in the directories where we deleted files + # 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" @@ -9589,16 +11383,17 @@ exit $exit_status } -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi test -z "$opt_mode" && { - help="$generic_help" + help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" + func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" @@ -9609,7 +11404,7 @@ # The TAGs below are defined such that we never get into a situation -# in which we disable both kinds of libraries. Given conflicting +# where 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 @@ -9632,5 +11427,3 @@ # mode:shell-script # sh-indentation:2 # End: -# vi:sw=2 - diff --git a/crypto/heimdal/missing b/crypto/heimdal/missing old mode 100644 new mode 100755 --- a/crypto/heimdal/missing +++ b/crypto/heimdal/missing @@ -1,11 +1,10 @@ #! /bin/sh -# Common stub for a few missing GNU programs while installing. +# Common wrapper for a few potentially missing GNU programs. -scriptversion=2009-04-28.21; # UTC +scriptversion=2018-03-07.03; # UTC -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, -# 2008, 2009 Free Software Foundation, Inc. -# Originally by Fran,cois Pinard , 1996. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# Originally written 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 @@ -18,7 +17,7 @@ # GNU General Public License for more details. # You should have received a copy of the GNU General Public License -# along with this program. If not, see . +# 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 @@ -26,69 +25,40 @@ # 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" + 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 +case $1 in -msg="missing on your system" + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; -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 - ;; + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; -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. +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. 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 - tar try tar, gnutar, gtar, then tar without non-portable flags - yacc create \`y.tab.[ch]', if possible, from existing .[ch] + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man -Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and -\`g' are ignored when checking the name. +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. Send bug reports to ." exit $? @@ -100,277 +70,146 @@ ;; -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" + 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. - ;; - - tar*) - if test -n "$run"; then - echo 1>&2 "ERROR: \`tar' requires --run" - exit 1 - elif test "x$2" = "x--version" || test "x$2" = "x--help"; then - exit 1 - fi - ;; - - *) - 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 - ;; - - tar*) - shift - - # We have already tried tar in the generic part. - # Look for gnutar/gtar before invocation to avoid ugly error - # messages. - if (gnutar --version > /dev/null 2>&1); then - gnutar "$@" && exit 0 - fi - if (gtar --version > /dev/null 2>&1); then - gtar "$@" && exit 0 - fi - firstarg="$1" - if shift; then - case $firstarg in - *o*) - firstarg=`echo "$firstarg" | sed s/o//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - case $firstarg in - *h*) - firstarg=`echo "$firstarg" | sed s/h//` - tar "$firstarg" "$@" && exit 0 - ;; - esac - fi - - echo 1>&2 "\ -WARNING: I can't seem to be able to run \`tar' with the given arguments. - You may want to install GNU tar or Free paxutils, or check the - command line arguments." - exit 1 - ;; - - *) - 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 +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi -exit 0 +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: diff --git a/crypto/heimdal/packages/ChangeLog b/crypto/heimdal/packages/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/ChangeLog @@ -0,0 +1,26 @@ +2007-12-04 Love Hörnquist Åstrand + + * mac/Makefile.am: Rename Info.plist.in Info.plist. + + * mac/mac.sh: Adapt to macos 10.5 packagemaker + + * mac/Info.plist{,.in}: Rename, content static now + + * mac/Info.plist.in: set version number via makepackage + +2007-12-03 Love Hörnquist Åstrand + + * mac/mac.sh: Packagemaker switch location. + +2007-10-23 Love Hörnquist Åstrand + + * Makefile.am: SUBDIRS += debian + + * debian: EXTRA_DIST + +2006-11-15 Love Hörnquist Åstrand + + * mac/mac.sh: clean after ourself. + + * mac/mac.sh: how to build a mac package + diff --git a/crypto/heimdal/packages/Makefile.am b/crypto/heimdal/packages/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/Makefile.am @@ -0,0 +1,7 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +SUBDIRS= mac + +EXTRA_DIST = windows NTMakefile diff --git a/crypto/heimdal/packages/Makefile.in b/crypto/heimdal/packages/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/Makefile.in @@ -0,0 +1,1032 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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 = packages +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-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_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common ChangeLog +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@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +SUBDIRS = mac +EXTRA_DIST = windows NTMakefile +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 packages/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign packages/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + 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" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + 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; \ + $(am__define_uniq_tagged_files); \ + 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-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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 + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile all-local +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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-exec-local + +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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: $(am__recursive_targets) check-am install-am install-data-am \ + install-strip uninstall-am + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + check check-am check-local clean clean-generic clean-libtool \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook 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 installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +# 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: diff --git a/crypto/heimdal/packages/NTMakefile b/crypto/heimdal/packages/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/NTMakefile @@ -0,0 +1,36 @@ +######################################################################## +# +# Copyright (c) 2010, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=packages +SUBDIRS=windows + +!include ../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/packages/mac/Info.plist b/crypto/heimdal/packages/mac/Info.plist new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/mac/Info.plist @@ -0,0 +1,36 @@ + + + + + CFBundleGetInfoString + Heimdal @VERSION@ + CFBundleName + Heimdal + CFBundleIdentifier + org.h5l.heimdal.pkg + CFBundleShortVersionString + 1.0 + IFPkgFlagAllowBackRev + + IFPkgFlagAuthorizationAction + RootAuthorization + IFPkgFlagDefaultLocation + / + IFPkgFlagFollowLinks + + IFPkgFlagIsRequired + + IFPkgFlagOverwritePermissions + + IFPkgFlagRelocatable + + IFPkgFlagRestartAction + NoRestart + IFPkgFlagRootVolumeOnly + + IFPkgFlagUpdateInstalledLanguages + + IFPkgFormatVersion + 0.10000000149011612 + + diff --git a/crypto/heimdal/packages/mac/Makefile.am b/crypto/heimdal/packages/mac/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/mac/Makefile.am @@ -0,0 +1,9 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +EXTRA_DIST = \ + Info.plist \ + mac.sh \ + Resources/Description.plist \ + Resources/English.lproj/Welcome.rtf diff --git a/crypto/heimdal/packages/mac/Makefile.in b/crypto/heimdal/packages/mac/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/mac/Makefile.in @@ -0,0 +1,856 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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 = packages/mac +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +EXTRA_DIST = \ + Info.plist \ + mac.sh \ + Resources/Description.plist \ + Resources/English.lproj/Welcome.rtf + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 packages/mac/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign packages/mac/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile all-local +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: all all-am all-local check check-am check-local clean \ + clean-generic clean-libtool cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-data-hook 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-generic mostlyclean-libtool pdf pdf-am \ + ps ps-am tags-am uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +# 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: diff --git a/crypto/heimdal/packages/mac/Resources/Description.plist b/crypto/heimdal/packages/mac/Resources/Description.plist new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/mac/Resources/Description.plist @@ -0,0 +1,10 @@ + + + + + IFPkgDescriptionDescription + + IFPkgDescriptionTitle + Heimdal + + diff --git a/crypto/heimdal/packages/mac/Resources/English.lproj/Welcome.rtf b/crypto/heimdal/packages/mac/Resources/English.lproj/Welcome.rtf new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/mac/Resources/English.lproj/Welcome.rtf @@ -0,0 +1,8 @@ +{\rtf1\mac\ansicpg10000\cocoartf100 +{\fonttbl\f0\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\margl1440\margr1440\vieww9000\viewh9000\viewkind0 +\pard\tx1440\tx2880\tx4320\tx5760\tx7200\ql\qnatural + +\f0\fs28 \cf0 Welcome to the Heimdal Installation Program.\ +} \ No newline at end of file diff --git a/crypto/heimdal/packages/mac/mac.sh b/crypto/heimdal/packages/mac/mac.sh new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/mac/mac.sh @@ -0,0 +1,56 @@ +#!/bin/sh +# $Id$ + +dbase=`dirname $0` +base=`cd $dbase && pwd` +config=${base}/../../configure + +destdir=`pwd`/destdir +builddir=`pwd`/builddir +imgdir=`pwd`/imgdir + +rm -rf ${destdir} ${builddir} ${imgdir} || exit 1 +mkdir ${destdir} || exit 1 +mkdir ${builddir} || exit 1 +mkdir ${imgdir} || exit 1 + +cd ${builddir} || exit 1 + +version=`sh ${config} --help 2>/dev/null | head -1 | sed 's/.*Heimdal \([^ ]*\).*/\1/'` + +echo "Building Mac universal binary package for Heimdal ${version}" +echo "Configure" +env \ + CFLAGS="-arch i386 -arch x86_64" \ + LDFLAGS="-arch i386 -arch x86_64" \ + ${config} --disable-dependency-tracking > log || exit 1 + +echo "Build" +env \ + CODE_SIGN_IDENTITY="Developer ID Application:" \ +make all > /dev/null || exit 1 + +echo "Run regression suite" +make check > /dev/null || exit 1 +echo "Install" +make install DESTDIR=${destdir} > /dev/null || exit 1 + +echo "Build package" +xcrun productbuild \ + --identifier org.h5l.heimdal \ + --version ${version} \ + --root ${destdir} / \ + --resources ${base}/Resources \ + --sign 'Developer ID Installer:' \ + ${imgdir}/Heimdal-${version}.pkg + +cd .. +echo "Build disk image" +rm "heimdal-${version}.dmg" +/usr/bin/hdiutil create -volname "Heimdal-${version}" -srcfolder ${imgdir} "heimdal-${version}.dmg" || exit 1 + +echo "Clean" +rm -rf ${destdir} ${builddir} ${imgdir} || exit 1 + +echo "Done!" +exit 0 diff --git a/crypto/heimdal/packages/windows/NTMakefile b/crypto/heimdal/packages/windows/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/NTMakefile @@ -0,0 +1,40 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=packages\windows +SUBDIRS=sdk + +!include ../../windows/NTMakefile.w32 + +# Note: the assembly directory is built as a child of the \lib +# directory since the application manifest is required at that point. + +# The installer directory is built separately at the end of the build. \ No newline at end of file diff --git a/crypto/heimdal/packages/windows/assembly/Heimdal.Application.manifest.in b/crypto/heimdal/packages/windows/assembly/Heimdal.Application.manifest.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/assembly/Heimdal.Application.manifest.in @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/crypto/heimdal/packages/windows/assembly/Heimdal.Kerberos.manifest.in b/crypto/heimdal/packages/windows/assembly/Heimdal.Kerberos.manifest.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/assembly/Heimdal.Kerberos.manifest.in @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/packages/windows/assembly/NTMakefile b/crypto/heimdal/packages/windows/assembly/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/assembly/NTMakefile @@ -0,0 +1,192 @@ +######################################################################## +# +# Copyright (c) 2010, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=packages\windows\assembly + +!include ../../../windows/NTMakefile.w32 + +# CODESIGN_PKT should be set to the public key token of the code +# signing certificate in use. You can use : +# +# pktextract +# +# ..to derive the public key token. +# +!ifndef CODESIGN_PKT +! error CODESIGN_PKT should be set to the public key token for codesigning certificate. (See Windows\README). +!endif + +prep:: mk-asm-dirs + +# ---------------------------------------------------------------------- +# Heimdal.Kerberos Assembly + +ASMKRBDIR=$(ASMDIR)\$(ASMKRBNAME) +ASMKRBVER=$(VER_PRODUCT_MAJOR).$(VER_PRODUCT_MINOR).$(VER_PRODUCT_AUX).$(VER_PRODUCT_PATCH) +ASMKRBVER_OLD_BEGIN=$(VER_OLD_BEGIN_MAJOR).$(VER_OLD_BEGIN_MINOR).$(VER_OLD_BEGIN_AUX).$(VER_OLD_BEGIN_PATCH) +ASMKRBVER_OLD_END=$(VER_OLD_END_MAJOR).$(VER_OLD_END_MINOR).$(VER_OLD_END_AUX).$(VER_OLD_END_PATCH) +ASMKRBMAN=$(ASMKRBNAME).manifest + +ASMKRBBINS=\ + $(ASMKRBDIR)\heimdal.dll \ + $(ASMKRBDIR)\com_err.dll \ + $(ASMKRBDIR)\heimntlm.dll \ + $(ASMKRBDIR)\gssapi.dll \ + $(ASMKRBDIR)\libhdb.dll \ + $(ASMKRBDIR)\libkadm5srv.dll \ + $(ASMKRBDIR)\heimdal.pdb \ + $(ASMKRBDIR)\com_err.pdb \ + $(ASMKRBDIR)\heimntlm.pdb \ + $(ASMKRBDIR)\gssapi.pdb \ + $(ASMKRBDIR)\libhdb.pdb \ + $(ASMKRBDIR)\libkadm5srv.pdb + +!if ("$(CPU)" == "i386") +ARCH=32 +!elseif ("$(CPU)" == "x86") +ARCH=32 +!else +ARCH=64 +!endif + +$(ASMKRBDIR)\$(ASMKRBMAN).nohash: Heimdal.Kerberos.manifest.in + $(SED) -e "s,[@]name[@],$(ASMKRBNAME),g" \ + -e "s,[@]krbname[@],$(ASMKRBNAME),g" \ + -e "s,[@]cpu[@],$(MCPU),g" \ + -e "s,[@]version[@],$(ASMKRBVER),g" \ + -e "s,[@]pkt[@],$(CODESIGN_PKT),g" \ + -e "s,[@]arch[@],$(ARCH),g" \ + < $** > $@ + +$(ASMKRBDIR)\$(ASMKRBMAN) $(ASMKRBDIR)\$(ASMKRBMAN).cdf: \ + $(ASMKRBDIR)\$(ASMKRBMAN).nohash $(ASMKRBBINS) + -$(RM) $(ASMKRBDIR)\$(ASMKRBMAN) + -$(RM) $(ASMKRBDIR)\$(ASMKRBMAN).cdf + $(MT) -manifest $(ASMKRBDIR)\$(ASMKRBMAN).nohash -out:$(ASMKRBDIR)\$(ASMKRBMAN) -hashupdate -makecdfs + +$(ASMKRBDIR)\$(ASMKRBNAME).cat: $(ASMKRBDIR)\$(ASMKRBMAN).cdf + cd $(ASMKRBDIR) + $(MAKECAT) $** + $(_CODESIGN) + $(_CODESIGN_SHA256) + cd $(SRCDIR) + +asm-krb: \ + $(APPMANIFEST) \ + $(ASMKRBBINS) \ + $(ASMKRBDIR)\$(ASMKRBMAN) \ + $(ASMKRBDIR)\$(ASMKRBNAME).cat \ + +all:: asm-krb + +clean:: + -$(RM) $(ASMKRBDIR)\*.* + +!ifdef APPVEYOR +test:: + true +!else +test:: + $(MT) -manifest $(ASMKRBDIR)\$(ASMKRBMAN) -validate_manifest +!endif + +{$(BINDIR)}.dll{$(ASMKRBDIR)}.dll: + $(CP) $< $@ + $(DLLPREP_MERGE) + +{$(BINDIR)}.pdb{$(ASMKRBDIR)}.pdb: + $(CP) $< $@ + +# ---------------------------------------------------------------------- +# Application manifests + +all:: $(APPMANIFEST) + +clean:: + -$(RM) $(APPMANIFEST) + +$(APPMANIFEST): Heimdal.Application.manifest.in + $(SED) -e "s,[@]krbname[@],$(ASMKRBNAME),g" \ + -e "s,[@]krbversion[@],$(ASMKRBVER),g" \ + -e "s,[@]cpu[@],$(MCPU),g" \ + -e "s,[@]pkt[@],$(CODESIGN_PKT),g" < $** > $@ + +!ifdef APPVEYOR +test:: + true +!else +test:: + $(MT) -manifest $(APPMANIFEST) -validate_manifest +!endif + +# ---------------------------------------------------------------------- +# Publisher configuration files + +POLKRB=policy.$(VER_PRODUCT_MAJOR).$(VER_PRODUCT_MINOR).$(ASMKRBNAME) +POLKRBDIR=$(ASMDIR)\$(POLKRB) +POLKRBFILE=$(POLKRBDIR)\$(ASMKRBVER).pol +POLKRBCAT=$(POLKRBDIR)\$(ASMKRBVER).cat + +$(POLKRBFILE): policy.Heimdal.Kerberos.in + $(SED) -e "s,[@]krbname[@],$(ASMKRBNAME),g" \ + -e "s,[@]krbversion[@],$(ASMKRBVER),g" \ + -e "s,[@]krbverfrom_begin[@],$(ASMKRBVER_OLD_BEGIN),g" \ + -e "s,[@]krbverfrom_end[@],$(ASMKRBVER_OLD_END),g" \ + -e "s,[@]krbpolname[@],$(POLKRB),g" \ + -e "s,[@]cpu[@],$(MCPU),g" \ + -e "s,[@]pkt[@],$(CODESIGN_PKT),g" < $** > $@ + +$(POLKRBFILE).cdf: $(POLKRBFILE) + $(MT) -manifest $(POLKRBFILE) -makecdfs + +$(POLKRBCAT): $(POLKRBFILE).cdf + cd $(POLKRBDIR) + $(MAKECAT) $** + $(_CODESIGN) + $(_CODESIGN_SHA256) + cd $(SRCDIR) + +all:: $(POLKRBFILE) $(POLKRBCAT) + +clean:: + -$(RM) $(POLKRBDIR)\*.* + +# ---------------------------------------------------------------------- + +.SUFFIXES: .dll .pdb + +mk-asm-dirs: +! if !exist($(ASMKRBDIR)) + $(MKDIR) $(ASMKRBDIR) +! endif +! if !exist($(POLKRBDIR)) + $(MKDIR) $(POLKRBDIR) +! endif diff --git a/crypto/heimdal/packages/windows/assembly/policy.Heimdal.Kerberos.in b/crypto/heimdal/packages/windows/assembly/policy.Heimdal.Kerberos.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/assembly/policy.Heimdal.Kerberos.in @@ -0,0 +1,19 @@ + + + + + + + + + + \ No newline at end of file diff --git a/crypto/heimdal/packages/windows/installer/NTMakefile b/crypto/heimdal/packages/windows/installer/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/installer/NTMakefile @@ -0,0 +1,288 @@ +######################################################################## +# +# Copyright (c) 2010-2013, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=packages\windows\installer + +!include ..\..\..\windows/NTMakefile.w32 + +!ifdef BUILD_INSTALLERS + +VERSIOND=$(VER_PRODUCT_MAJOR)-$(VER_PRODUCT_MINOR)-$(VER_PRODUCT_AUX)-$(VER_PRODUCT_PATCH) +VERSION=$(VER_PRODUCT_MAJOR).$(VER_PRODUCT_MINOR).$(VER_PRODUCT_AUX).$(VER_PRODUCT_PATCH) +POLPREFIX=policy.$(VER_PRODUCT_MAJOR).$(VER_PRODUCT_MINOR) + +!if "$(CPU)"=="AMD64" +PLATFORM=x64 +!else +PLATFORM=x86 +!endif + +!if "$(BUILD)"=="rel" +DEBUGOPT= +!else +DEBUGOPT=-$(BUILD) +!endif + +###################################################################### +# Heimdal Merge Modules + +!if exist(..\..\..\thirdparty\installer\heimdal-assemblies.wxs) +ASM_WXS=..\..\..\thirdparty\installer\heimdal-assemblies.wxs +!else +ASM_WXS=heimdal-assemblies.wxs +!endif + +ASSEMBLYMODULE=$(INSTDIR)\Heimdal.msm + +$(ASSEMBLYMODULE): $(OBJ)\heimdal-assemblies.wixobj + $(LIGHT) -out $@ $** + +$(OBJ)\heimdal-assemblies.wixobj: $(ASM_WXS) + $(CANDLE) -arch $(PLATFORM) -o $@ $** \ + -dVersion=$(VERSION) \ + -dBinDir=$(BINDIR) \ + -dAsmKrbName=$(ASMKRBNAME) \ + -dPlatform=$(PLATFORM) + +$(SDKREDISTDIR)\Heimdal.msm: $(ASSEMBLYMODULE) + $(CP) $** $@ + +!if exist(..\..\..\thirdparty\installer\heimdal-policy.wxs) +POLICY_WXS=..\..\..\thirdparty\installer\heimdal-policy.wxs +!else +POLICY_WXS=heimdal-policy.wxs +!endif + +POLICYMODULE=$(INSTDIR)\Heimdal.Policy.msm + +$(POLICYMODULE): $(OBJ)\heimdal-policy.wixobj + $(LIGHT) -out $@ $** + +$(OBJ)\heimdal-policy.wixobj: $(POLICY_WXS) + $(CANDLE) -arch $(PLATFORM) -o $@ $** \ + -dVersion=$(VERSION) \ + -dBinDir=$(BINDIR) \ + -dAsmKrbName=$(ASMKRBNAME) \ + -dPlatform=$(PLATFORM) \ + -dPolPrefix=$(POLPREFIX) + +COMMANDMODULE=$(INSTDIR)\Heimdal.Command.msm + +$(COMMANDMODULE): $(OBJ)\heimdal-command.wixobj + $(LIGHT) -out $@ $** + +# OBJECT COMPILED BELOW + +$(SDKREDISTDIR)\Heimdal.Command.msm: $(COMMANDMODULE) + $(CP) $** $@ + +GSSMODULE=$(INSTDIR)\Heimdal.GSS.msm + +$(GSSMODULE): $(OBJ)\heimdal-gss.wixobj + $(LIGHT) -out $@ $** + +# OBJECT COMPILED BELOW + +all:: $(ASSEMBLYMODULE) $(SDKREDISTDIR)\Heimdal.msm + +all:: $(POLICYMODULE) + +all:: $(COMMANDMODULE) $(SDKREDISTDIR)\Heimdal.Command.msm + +all:: $(GSSMODULE) + +clean:: + -$(RM) $(ASSEMBLYMODULE) + -$(RM) $(POLICYMODULE) + -$(RM) $(COMMANDMODULE) + -$(RM) $(GSSMODULE) + -$(RM) $(SDKREDISTDIR)\*.* + +###################################################################### +# Runtime modules + +!if [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==19 +VCVER=VC2019 +!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==18 +VCVER=VC2018 +!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==17 +VCVER=VC2017 +!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==16 +VCVER=VC100 +!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==15 +VCVER=VC90 +!elseif [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==14 +VCVER=VC80 +!else +! error Cant determine Visual C compiler version +!endif + +$(SDKREDISTDIR)\heimdal-version.mak: + @echo HEIMDAL_VCVER=$(VCVER) > $@ +!if "$(BUILD)"!="rel" + @echo HEIMDAL_CRT_DEBUG=yes >> $@ +!endif + +all:: $(SDKREDISTDIR)\heimdal-version.mak + +!if "$(BUILD)"=="rel" +CRTNAME=CRT +!else +CRTNAME=DebugCRT +!endif + +!if "$(MMDIR)"=="" +MMDIR=$(ProgramFiles)\Common Files\Merge Modules +!if !exist($(MMDIR)) +MMDIR=$(SystemDrive)\Program Files (x86)\Common Files\Merge Modules +!endif +!endif + +# +# Don't specify a runtime module when the Universal C Runtime +# is available. +# +!if "$(APPVER)"=="10.0" +RUNTIMEMODULE32="" +RUNTIMEMODULE64="" +!else +! if exist("$(MMDIR)") +RUNTIMEMODULE32="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x86.msm" +! if "$(VCVER)"=="VC90" || "$(VCVER)"=="VC80" +RUNTIMEMODULE64="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x86_x64.msm" +! else +RUNTIMEMODULE64="$(MMDIR)\Microsoft_$(VCVER)_$(CRTNAME)_x64.msm" +! endif +! else +RUNTIMEMODULE32="$(MSSDK)\Redist\VC\microsoft.vcxx.crt.x86_msm.msm" +RUNTIMEMODULE64="$(MSSDK)\Redist\VC\microsoft.vcxx.crt.x64_msm.msm" +! endif +!endif + +###################################################################### +# Heimdal installer + +CANDLEOPTS= \ + -dVersion=$(VERSION) \ + -dBinDir=$(BINDIR) \ + -dDocDir=$(DOCDIR) \ + -dSrcDir=$(SRC) \ + -dPlatform=$(PLATFORM) \ + -dAsmKrbName=$(ASMKRBNAME) \ + -dPolPrefix=$(POLPREFIX) + +!if "$(CPU)"=="AMD64" + +INSTDIR32=$(INSTDIR:AMD64=i386) + +CANDLEOPTS=$(CANDLEOPTS) -dTarget64 \ + -dInstDir32=$(INSTDIR32) \ + -dInstDir64=$(INSTDIR) \ + -dRuntimeModule32=$(RUNTIMEMODULE32) \ + -dRuntimeModule64=$(RUNTIMEMODULE64) + +!ifdef MULTIPLATFORM_INSTALLER +CANDLEOPTS_MULTI= -dTarget32 +TYPEOPT=-full + +INSTDEPS= \ + $(INSTDIR32)\Heimdal.msm \ + $(INSTDIR32)\Heimdal.GSS.msm \ + $(INSTDIR32)\Heimdal.Policy.msm \ + $(ASSEMBLYMODULE) $(GSSMODULE) $(POLICYMODULE) +!else +! message Excluding 32-bit components from installer +TYPEOPT= + +INSTDEPS= \ + $(ASSEMBLYMODULE) $(GSSMODULE) $(POLICYMODULE) +!endif + + +!else + +CANDLEOPTS=$(CANDLEOPTS) -dTarget32 \ + -dInstDir32=$(INSTDIR) \ + -dRuntimeModule32=$(RUNTIMEMODULE32) \ + +INSTDEPS= \ + $(ASSEMBLYMODULE) $(GSSMODULE) $(POLICYMODULE) +!endif + +!if exist($(SRC)\thirdparty\MKShim) +THIRDPARTYOBJS=$(THIRDPARTYOBJS) $(INSTDIR)\MKShim.wixlib +THIRDPARTYOPTS=$(THIRDPARTYOPTS) -dMKShim=1 + +!if "$(CPU)"=="AMD64" +THIRDPARTYOBJS=$(THIRDPARTYOBJS) $(INSTDIR32)\MKShim.wixlib +!endif +!endif + +INSTALLER=$(INSTDIR)\Heimdal-$(CPU)$(DEBUGOPT)$(TYPEOPT)-$(VERSIOND).msi +WIXOBJ=$(OBJ)\heimdal-installer$(TYPEOPT).wixobj + +$(INSTALLER): $(WIXOBJ) $(THIRDPARTYOBJS) $(INSTDEPS) lang\en-us.wxl + $(LIGHT) -out $@ $(WIXOBJ) $(THIRDPARTYOBJS) \ + -sval -cultures:en-us -loc lang\en-us.wxl \ + -dWixUILicenseRtf=lang\license-en-us.rtf \ + -ext WixUIExtension + $(_CODESIGN) + +$(WIXOBJ): heimdal-installer.wxs + $(CANDLE) -arch $(PLATFORM) -o $@ heimdal-installer.wxs \ + $(CANDLEOPTS) $(CANDLEOPTS_MULTI) $(THIRDPARTYOPTS) + +!if exist(thirdparty\installer\heimdal-command.wxs) +CMD_WXS=thirdparty\installer\heimdal-command.wxs +!else +CMD_WXS=heimdal-command.wxs +!endif + +$(OBJ)\heimdal-command.wixobj: $(CMD_WXS) + $(CANDLE) -arch $(PLATFORM) -o $@ $(CMD_WXS) \ + $(CANDLEOPTS) $(THIRDPARTYOPTS) + +!if exist(thirdparty\installer\heimdal-gss.wxs) +GSS_WXS=thirdparty\installer\heimdal-gss.wxs +!else +GSS_WXS=heimdal-gss.wxs +!endif + +$(OBJ)\heimdal-gss.wixobj: $(GSS_WXS) + $(CANDLE) -arch $(PLATFORM) -o $@ $(GSS_WXS) \ + $(CANDLEOPTS) $(THIRDPARTYOPTS) + +all:: $(INSTALLER) + +clean:: + -$(RM) $(INSTALLER) + +!endif # BUILD_INSTALLERS diff --git a/crypto/heimdal/packages/windows/installer/heimdal-assemblies.wxs b/crypto/heimdal/packages/windows/installer/heimdal-assemblies.wxs new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/installer/heimdal-assemblies.wxs @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/crypto/heimdal/packages/windows/installer/heimdal-command.wxs b/crypto/heimdal/packages/windows/installer/heimdal-command.wxs new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/installer/heimdal-command.wxs @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Not LEGACYKRB5INI And Not LEGACYKRB5CONF And Not LEGACYKRB5REG32 And Not LEGACYKRB5REG64 + + + + + + + + + + + + + LEGACYKRB5INI + + + + + + + + + + + + + LEGACYKRB5CONF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/packages/windows/installer/heimdal-gss.wxs b/crypto/heimdal/packages/windows/installer/heimdal-gss.wxs new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/installer/heimdal-gss.wxs @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/packages/windows/installer/heimdal-installer.wxs b/crypto/heimdal/packages/windows/installer/heimdal-installer.wxs new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/installer/heimdal-installer.wxs @@ -0,0 +1,421 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Not LEGACYKRB5INI And Not LEGACYKRB5CONF And Not LEGACYKRB5REG32 And Not LEGACYKRB5REG64 + + + + + + + + + + + + + LEGACYKRB5INI + + + + + + + + + + + + + LEGACYKRB5CONF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Installed OR Privileged + Installed OR NOT EXISTINGINSTALLATION + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crypto/heimdal/packages/windows/installer/heimdal-policy.wxs b/crypto/heimdal/packages/windows/installer/heimdal-policy.wxs new file mode 100644 --- /dev/null +++ b/crypto/heimdal/packages/windows/installer/heimdal-policy.wxs @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + VersionNT > 501 + + + + + + + + + diff --git a/crypto/heimdal/packages/windows/installer/images/Heimdal_banner.bmp b/crypto/heimdal/packages/windows/installer/images/Heimdal_banner.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8ae6818bebc0464e50755862a217acfd2d70af1f GIT binary patch literal 85894 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 KK@fzy8TEf<&eG%n literal 0 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 Nl2el{mp1+K{{RLU?Mnav literal 0 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 + + 1033 + 1252 + Heimdal + Heimdal Developers + Heimdal Kerberos tools and libraries + + Heimdal + Command line tools and libraries for Heimdal Kerberos + 32-bit tools and libraries + Compatibility libraries for 32-bit applications + Installation of this package requires elevation + A current or newer version of Heimdal is already installed on this machine. Please use the Add/Remove Programs control panel to manage the existing installation. + diff --git a/crypto/heimdal/packages/windows/installer/lang/license-en-us.rtf b/crypto/heimdal/packages/windows/installer/lang/license-en-us.rtf new file mode 100644 index 0000000000000000000000000000000000000000..2780bf1710832f86b47eaa23f0501bbc83e8ede3 GIT binary patch literal 2007 zc$}?O-%sN>5WeS?_J5c+;MDE4Wnsnfl%|GSmnOaZfJMr~x{1?Tq;@xU%2tT~{l-o! z3b(6!ISHA;z9|0AD;8y^Cg$OVMaAD)0N?+FmTcTJnWC~=VEYm{gQ75 ze|i+M{G7MNFyFAI%rzSg2Dz?BUoP=nx3wAO-;3N5xXRl)U%1A4G=e}BTxt&9vf+Hq zrLh1XKl~b|t)-GYUm#Pp*)?LhGH_a)!SL$p0zLs2T)|(hT-IXAAmxuz=tl;t{G_^E z>PLkXx(=tY+OZm_)JB-ra8MOKFIH03YPst{VpQ?CQuP|cCth-S)`zart7~w5H8foF zX3NV%sykzJNt;G2S|gMMCQE2hqL83f+Z5d0EQDmu4l32Gbq}6|Spj-%f2-EOT9u*_ z1+xG>U=4>2Z`Q)#0ASOottc@tD`xQE2vXPTNysG>O5%jDNV}pnH-8>cE1&a?H2jA_ z`(fD64O_g}8E?=NS#RrwDt8#+Y&H@Hiqo)>HmpJ8H+WGvfFFkS?Rw;u_;h|b$ZPRs zH2B%D;H?wddc3!wP$kl9wLuRJLu;%KwoqG}I?PongX_`5oX}7sk_9-HD9d;Hv0YI! zvF1&`lYOjs)G2;X3Y#Ad<3I{sE?Xq}fAfO9)>0L%-FJ4_kw0+!3NsC?ncqBBLS$~@T(JS?={@WO61774rOjooG0ZMD{~Vt)C-hjdC4 zNTQqc-irxfJddM0Iw2DnKVTBC!X%|>mJ;y73HVW%#&n#eQJlcHZ(f2WCnqlDg%3c! z&SR1!5XC@e^ME1@;>KQ>Qj+u#%MY>%4R3pZ5D-Qw1awAIe3nMNuHC=NAi9AWiTx@5 z>5XYX(+Ah@hNhwIb%V`3n0s+b{Vecem}l`kN{}xKn$W}#JUSzjK45!n3FMB1DI`-b z2;K=qpf~!)1nGI>fOI`j--O1*Ppy#G$Va!3S%BYYbK+AQkgo(~c=1DTkC~9aGkkXYOef+%r5WeMqFhtzY85duxZ zG{)mBq0TNErX-HDc}k=345raN`hgrhES)%CqtHo3YohqUf?5xp?LD}k61#98J~_jbSiPl8{vzx@NLjE+hG literal 0 Hc$@ gen-po.tmp + chmod +x gen-po.tmp + mv gen-po.tmp gen-po.sh + +ceprefix=heim_com_err + +po: gen-po.sh + ./gen-po.sh heimdal_krb5 $(top_srcdir)/lib/krb5/*.[chly] + ./gen-po.sh heimdal_kuser $(top_srcdir)/kuser/*.[ch] + find $(top_srcdir) -name *.et | while read x; do \ + y=$$(basename $$x); \ + echo $$y ; \ + z=$$(echo $$y | sed 's/\.et$$//') ; \ + t=$$(find $(top_builddir) -name $$z.c) ; \ + t=$$(echo $$t | sed 's/\.c$$//') ; \ + base=$$(grep 'ERROR_TABLE_BASE_' $${t}.h | cut -f3 -d' ') ; \ + ./gen-po.sh $(ceprefix)$$base $${t}.c ; \ + test -f $(top_srcdir)/po/$(ceprefix)$$base/$(ceprefix)$$base.pot || { echo "$$y missing" ; exit 1; } \ + done + +mo: + cd $(srcdir) ; \ + rm localefiles ; \ + touch localefiles ; \ + find . -name '*.po' | while read s ; do \ + t=$$(echo $$s | sed -e 's/\.po$$/.mo/') ; \ + msgfmt -o $$t $$s ; \ + echo $$t | sed 's@\./@@' >> localefiles ; \ + done + +install-data-hook: + @for x in `cat $(srcdir)/localefiles` ; do \ + domain=`echo $$x | sed 's@/.*@@'`; \ + lang=`echo $$x | sed 's@.*/\(.*\)\\.mo$$@\1@'`; \ + echo "installing lang $$domain $$lang" ; \ + $(top_srcdir)/install-sh -d \ + "$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES" ; \ + $(top_srcdir)/install-sh $(srcdir)/$$x \ + "$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$$domain.mo" ; \ + done + +#find . -name '*.po' -or -name '*.pot' -or -name '*.mo' | sed 's/^../ /' | sed 's/$/ \\/' +FILES = \ + heim_com_err-1750206208/heim_com_err-1750206208.pot \ + heim_com_err-1765328384/heim_com_err-1765328384.pot \ + heim_com_err-1765328384/sv_SE.mo \ + heim_com_err-1765328384/sv_SE.po \ + heim_com_err-1980176640/heim_com_err-1980176640.pot \ + heim_com_err-969269760/heim_com_err-969269760.pot \ + heim_com_err1859794432/heim_com_err1859794432.pot \ + heim_com_err35224064/heim_com_err35224064.pot \ + heim_com_err36150272/heim_com_err36150272.pot \ + heim_com_err39525376/heim_com_err39525376.pot \ + heim_com_err43787520/heim_com_err43787520.pot \ + heim_com_err569856/heim_com_err569856.pot \ + heimdal_kuser/heimdal_kuser.pot \ + heimdal_krb5/heimdal_krb5.pot \ + heimdal_krb5/sv_SE.mo \ + heimdal_krb5/sv_SE.po + +EXTRA_DIST = gen-po.in $(FILES) +CLEANFILES = gen-po.tmp $(noinst_SCRIPTS) heimdal-pot.tar.gz + +launchpad: + tar czCf \ + $(top_srcdir) \ + $(top_builddir)/po/heimdal-pot.tar.gz \ + $$(cd $(top_srcdir) && find . -name '*.pot') diff --git a/crypto/heimdal/po/Makefile.in b/crypto/heimdal/po/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/Makefile.in @@ -0,0 +1,675 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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 = po +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SCRIPTS = $(noinst_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +noinst_SCRIPTS = gen-po.sh +ceprefix = heim_com_err + +#find . -name '*.po' -or -name '*.pot' -or -name '*.mo' | sed 's/^../ /' | sed 's/$/ \\/' +FILES = \ + heim_com_err-1750206208/heim_com_err-1750206208.pot \ + heim_com_err-1765328384/heim_com_err-1765328384.pot \ + heim_com_err-1765328384/sv_SE.mo \ + heim_com_err-1765328384/sv_SE.po \ + heim_com_err-1980176640/heim_com_err-1980176640.pot \ + heim_com_err-969269760/heim_com_err-969269760.pot \ + heim_com_err1859794432/heim_com_err1859794432.pot \ + heim_com_err35224064/heim_com_err35224064.pot \ + heim_com_err36150272/heim_com_err36150272.pot \ + heim_com_err39525376/heim_com_err39525376.pot \ + heim_com_err43787520/heim_com_err43787520.pot \ + heim_com_err569856/heim_com_err569856.pot \ + heimdal_kuser/heimdal_kuser.pot \ + heimdal_krb5/heimdal_krb5.pot \ + heimdal_krb5/sv_SE.mo \ + heimdal_krb5/sv_SE.po + +EXTRA_DIST = gen-po.in $(FILES) +CLEANFILES = gen-po.tmp $(noinst_SCRIPTS) heimdal-pot.tar.gz +all: all-am + +.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 po/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign po/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + 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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 $(SCRIPTS) +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: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +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 -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: + +.MAKE: install-am install-data-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-data-hook 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am + +.PRECIOUS: Makefile + + +gen-po.sh: gen-po.in + sed \ + -e 's,[@]top_srcdir[@],$(top_srcdir),' \ + -e 's,[@]PACKAGE_NAME[@],$(PACKAGE_NAME),' \ + -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),' \ + < $(srcdir)/gen-po.in > gen-po.tmp + chmod +x gen-po.tmp + mv gen-po.tmp gen-po.sh + +po: gen-po.sh + ./gen-po.sh heimdal_krb5 $(top_srcdir)/lib/krb5/*.[chly] + ./gen-po.sh heimdal_kuser $(top_srcdir)/kuser/*.[ch] + find $(top_srcdir) -name *.et | while read x; do \ + y=$$(basename $$x); \ + echo $$y ; \ + z=$$(echo $$y | sed 's/\.et$$//') ; \ + t=$$(find $(top_builddir) -name $$z.c) ; \ + t=$$(echo $$t | sed 's/\.c$$//') ; \ + base=$$(grep 'ERROR_TABLE_BASE_' $${t}.h | cut -f3 -d' ') ; \ + ./gen-po.sh $(ceprefix)$$base $${t}.c ; \ + test -f $(top_srcdir)/po/$(ceprefix)$$base/$(ceprefix)$$base.pot || { echo "$$y missing" ; exit 1; } \ + done + +mo: + cd $(srcdir) ; \ + rm localefiles ; \ + touch localefiles ; \ + find . -name '*.po' | while read s ; do \ + t=$$(echo $$s | sed -e 's/\.po$$/.mo/') ; \ + msgfmt -o $$t $$s ; \ + echo $$t | sed 's@\./@@' >> localefiles ; \ + done + +install-data-hook: + @for x in `cat $(srcdir)/localefiles` ; do \ + domain=`echo $$x | sed 's@/.*@@'`; \ + lang=`echo $$x | sed 's@.*/\(.*\)\\.mo$$@\1@'`; \ + echo "installing lang $$domain $$lang" ; \ + $(top_srcdir)/install-sh -d \ + "$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES" ; \ + $(top_srcdir)/install-sh $(srcdir)/$$x \ + "$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$$domain.mo" ; \ + done + +launchpad: + tar czCf \ + $(top_srcdir) \ + $(top_builddir)/po/heimdal-pot.tar.gz \ + $$(cd $(top_srcdir) && find . -name '*.pot') + +# 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: diff --git a/crypto/heimdal/po/gen-po.in b/crypto/heimdal/po/gen-po.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/gen-po.in @@ -0,0 +1,39 @@ +#!/bin/sh + +top_srcdir=@top_srcdir@ +name="@PACKAGE_NAME@" +version="@PACKAGE_VERSION@" + +domain=$1 +shift + +outdir=${top_srcdir}/po/${domain} +outfile=${outdir}/${domain}.pot + +test -d $outdir || mkdir $outdir + +xgettext \ + --package-name="${name}" \ + --package-version="${version}" \ + --foreign-user \ + --default-domain=${domain} \ + --add-comments \ + --keyword=N_ \ + --keyword=NP_ \ + -o ${outfile}.new \ + "$@" + +test -f ${outfile}.new && \ + perl -pi -e "s@${top_srcdir}/@@" ${outfile}.new + +grep -v "POT-Creation-Date:" ${outfile}.new > ${outfile}.new2 +grep -v "POT-Creation-Date:" ${outfile} > ${outfile}.old + +if ! diff ${outfile}.old ${outfile}.new2 >/dev/null; then + echo "${outfile} changed" + cp ${outfile}.new ${outfile} +fi +rm ${outfile}.new* ${outfile}.old + +exit 0 + diff --git a/crypto/heimdal/po/heim_com_err-1750206208/heim_com_err-1750206208.pot b/crypto/heimdal/po/heim_com_err-1750206208/heim_com_err-1750206208.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err-1750206208/heim_com_err-1750206208.pot @@ -0,0 +1,56 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/krb5/k524_err.c:11 +msgid "wrong keytype in ticket" +msgstr "" + +#. 001 +#: ../lib/krb5/k524_err.c:12 +msgid "incorrect network address" +msgstr "" + +#. 002 +#: ../lib/krb5/k524_err.c:13 +msgid "cannot convert V5 principal" +msgstr "" + +#. 003 +#: ../lib/krb5/k524_err.c:14 +msgid "V5 realm name longer than V4 maximum" +msgstr "" + +#. 004 +#: ../lib/krb5/k524_err.c:15 +msgid "kerberos V4 error server" +msgstr "" + +#. 005 +#: ../lib/krb5/k524_err.c:16 +msgid "encoding too large at server" +msgstr "" + +#. 006 +#: ../lib/krb5/k524_err.c:17 +msgid "decoding out of data" +msgstr "" + +#. 007 +#: ../lib/krb5/k524_err.c:18 +msgid "service not responding" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err-1765328384/heim_com_err-1765328384.pot b/crypto/heimdal/po/heim_com_err-1765328384/heim_com_err-1765328384.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err-1765328384/heim_com_err-1765328384.pot @@ -0,0 +1,979 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/krb5/krb5_err.c:11 +msgid "No error" +msgstr "" + +#. 001 +#: ../lib/krb5/krb5_err.c:12 +msgid "Client's entry in database has expired" +msgstr "" + +#. 002 +#: ../lib/krb5/krb5_err.c:13 +msgid "Server's entry in database has expired" +msgstr "" + +#. 003 +#: ../lib/krb5/krb5_err.c:14 +msgid "Requested protocol version not supported" +msgstr "" + +#. 004 +#: ../lib/krb5/krb5_err.c:15 +msgid "Client's key is encrypted in an old master key" +msgstr "" + +#. 005 +#: ../lib/krb5/krb5_err.c:16 +msgid "Server's key is encrypted in an old master key" +msgstr "" + +#. 006 +#: ../lib/krb5/krb5_err.c:17 +msgid "Client not found in Kerberos database" +msgstr "" + +#. 007 +#: ../lib/krb5/krb5_err.c:18 +msgid "Server not found in Kerberos database" +msgstr "" + +#. 008 +#: ../lib/krb5/krb5_err.c:19 +msgid "Principal has multiple entries in Kerberos database" +msgstr "" + +#. 009 +#: ../lib/krb5/krb5_err.c:20 +msgid "Client or server has a null key" +msgstr "" + +#. 010 +#: ../lib/krb5/krb5_err.c:21 +msgid "Ticket is ineligible for postdating" +msgstr "" + +#. 011 +#: ../lib/krb5/krb5_err.c:22 +msgid "Requested effective lifetime is negative or too short" +msgstr "" + +#. 012 +#: ../lib/krb5/krb5_err.c:23 +msgid "KDC policy rejects request" +msgstr "" + +#. 013 +#: ../lib/krb5/krb5_err.c:24 +msgid "KDC can't fulfill requested option" +msgstr "" + +#. 014 +#: ../lib/krb5/krb5_err.c:25 +msgid "KDC has no support for encryption type" +msgstr "" + +#. 015 +#: ../lib/krb5/krb5_err.c:26 +msgid "KDC has no support for checksum type" +msgstr "" + +#. 016 +#: ../lib/krb5/krb5_err.c:27 +msgid "KDC has no support for padata type" +msgstr "" + +#. 017 +#: ../lib/krb5/krb5_err.c:28 +msgid "KDC has no support for transited type" +msgstr "" + +#. 018 +#: ../lib/krb5/krb5_err.c:29 +msgid "Clients credentials have been revoked" +msgstr "" + +#. 019 +#: ../lib/krb5/krb5_err.c:30 +msgid "Credentials for server have been revoked" +msgstr "" + +#. 020 +#: ../lib/krb5/krb5_err.c:31 +msgid "TGT has been revoked" +msgstr "" + +#. 021 +#: ../lib/krb5/krb5_err.c:32 +msgid "Client not yet valid - try again later" +msgstr "" + +#. 022 +#: ../lib/krb5/krb5_err.c:33 +msgid "Server not yet valid - try again later" +msgstr "" + +#. 023 +#: ../lib/krb5/krb5_err.c:34 +msgid "Password has expired" +msgstr "" + +#. 024 +#: ../lib/krb5/krb5_err.c:35 +msgid "Preauthentication failed" +msgstr "" + +#. 025 +#: ../lib/krb5/krb5_err.c:36 +msgid "Additional pre-authentication required" +msgstr "" + +#. 026 +#: ../lib/krb5/krb5_err.c:37 +msgid "Requested server and ticket don't match" +msgstr "" + +#. 027 +#: ../lib/krb5/krb5_err.c:38 +msgid "Server principal valid for user2user only" +msgstr "" + +#. 028 +#: ../lib/krb5/krb5_err.c:39 +msgid "KDC Policy rejects transited path" +msgstr "" + +#. 029 +#: ../lib/krb5/krb5_err.c:40 +msgid "A service is not available" +msgstr "" + +#. 030 +#. 031 +#: ../lib/krb5/krb5_err.c:42 +msgid "Decrypt integrity check failed" +msgstr "" + +#. 032 +#: ../lib/krb5/krb5_err.c:43 +msgid "Ticket expired" +msgstr "" + +#. 033 +#: ../lib/krb5/krb5_err.c:44 +msgid "Ticket not yet valid" +msgstr "" + +#. 034 +#: ../lib/krb5/krb5_err.c:45 +msgid "Request is a replay" +msgstr "" + +#. 035 +#: ../lib/krb5/krb5_err.c:46 +msgid "The ticket isn't for us" +msgstr "" + +#. 036 +#: ../lib/krb5/krb5_err.c:47 +msgid "Ticket/authenticator don't match" +msgstr "" + +#. 037 +#: ../lib/krb5/krb5_err.c:48 +msgid "Clock skew too great" +msgstr "" + +#. 038 +#: ../lib/krb5/krb5_err.c:49 +msgid "Incorrect net address" +msgstr "" + +#. 039 +#: ../lib/krb5/krb5_err.c:50 +msgid "Protocol version mismatch" +msgstr "" + +#. 040 +#: ../lib/krb5/krb5_err.c:51 +msgid "Invalid message type" +msgstr "" + +#. 041 +#: ../lib/krb5/krb5_err.c:52 +msgid "Message stream modified" +msgstr "" + +#. 042 +#: ../lib/krb5/krb5_err.c:53 +msgid "Message out of order" +msgstr "" + +#. 043 +#: ../lib/krb5/krb5_err.c:54 +msgid "Invalid cross-realm ticket" +msgstr "" + +#. 044 +#: ../lib/krb5/krb5_err.c:55 +msgid "Key version is not available" +msgstr "" + +#. 045 +#: ../lib/krb5/krb5_err.c:56 +msgid "Service key not available" +msgstr "" + +#. 046 +#. 158 +#: ../lib/krb5/krb5_err.c:57 ../lib/krb5/krb5_err.c:169 +msgid "Mutual authentication failed" +msgstr "" + +#. 047 +#: ../lib/krb5/krb5_err.c:58 +msgid "Incorrect message direction" +msgstr "" + +#. 048 +#: ../lib/krb5/krb5_err.c:59 +msgid "Alternative authentication method required" +msgstr "" + +#. 049 +#: ../lib/krb5/krb5_err.c:60 +msgid "Incorrect sequence number in message" +msgstr "" + +#. 050 +#: ../lib/krb5/krb5_err.c:61 +msgid "Inappropriate type of checksum in message" +msgstr "" + +#. 051 +#: ../lib/krb5/krb5_err.c:62 +msgid "Policy rejects transited path" +msgstr "" + +#. 052 +#: ../lib/krb5/krb5_err.c:63 +msgid "Response too big for UDP, retry with TCP" +msgstr "" + +#. 053 +#. 054 +#. 055 +#. 056 +#. 057 +#. 058 +#. 059 +#. 060 +#: ../lib/krb5/krb5_err.c:71 +msgid "Generic error (see e-text)" +msgstr "" + +#. 061 +#: ../lib/krb5/krb5_err.c:72 +msgid "Field is too long for this implementation" +msgstr "" + +#. 062 +#: ../lib/krb5/krb5_err.c:73 +msgid "Client not trusted" +msgstr "" + +#. 063 +#: ../lib/krb5/krb5_err.c:74 +msgid "KDC not trusted" +msgstr "" + +#. 064 +#: ../lib/krb5/krb5_err.c:75 +msgid "Invalid signature" +msgstr "" + +#. 065 +#: ../lib/krb5/krb5_err.c:76 +msgid "DH parameters not accepted" +msgstr "" + +#. 066 +#. 067 +#. 068 +#: ../lib/krb5/krb5_err.c:79 +msgid "Wrong realm" +msgstr "" + +#. 069 +#: ../lib/krb5/krb5_err.c:80 +msgid "User to user required" +msgstr "" + +#. 070 +#: ../lib/krb5/krb5_err.c:81 +msgid "Cannot verify certificate" +msgstr "" + +#. 071 +#: ../lib/krb5/krb5_err.c:82 +msgid "Certificate invalid" +msgstr "" + +#. 072 +#: ../lib/krb5/krb5_err.c:83 +msgid "Certificate revoked" +msgstr "" + +#. 073 +#: ../lib/krb5/krb5_err.c:84 +msgid "Revocation status unknown" +msgstr "" + +#. 074 +#: ../lib/krb5/krb5_err.c:85 +msgid "Revocation status unavaible" +msgstr "" + +#. 075 +#: ../lib/krb5/krb5_err.c:86 +msgid "Client name mismatch in certificate" +msgstr "" + +#. 076 +#: ../lib/krb5/krb5_err.c:87 +msgid "Inconsistent key purpose" +msgstr "" + +#. 077 +#: ../lib/krb5/krb5_err.c:88 +msgid "Digest in certificate not accepted" +msgstr "" + +#. 078 +#: ../lib/krb5/krb5_err.c:89 +msgid "paChecksum must be included" +msgstr "" + +#. 079 +#: ../lib/krb5/krb5_err.c:90 +msgid "Digest in signedData not accepted" +msgstr "" + +#. 080 +#: ../lib/krb5/krb5_err.c:91 +msgid "Public key encryption not supported" +msgstr "" + +#. 081 +#. 082 +#. 083 +#. 084 +#. 085 +#. 086 +#. 087 +#. 088 +#. 089 +#. 090 +#. 091 +#. 092 +#. 093 +#. 094 +#. 095 +#. 096 +#. 097 +#. 098 +#. 099 +#. 100 +#. 101 +#. 102 +#. 103 +#. 104 +#. 105 +#. 106 +#. 107 +#. 108 +#. 109 +#. 110 +#. 111 +#. 112 +#. 113 +#. 114 +#. 115 +#. 116 +#. 117 +#. 118 +#. 119 +#. 120 +#. 121 +#. 122 +#. 123 +#. 124 +#. 125 +#. 126 +#. 127 +#. 128 +#: ../lib/krb5/krb5_err.c:139 +msgid "$Id$" +msgstr "" + +#. 129 +#: ../lib/krb5/krb5_err.c:140 +msgid "Invalid flag for file lock mode" +msgstr "" + +#. 130 +#: ../lib/krb5/krb5_err.c:141 +msgid "Cannot read password" +msgstr "" + +#. 131 +#: ../lib/krb5/krb5_err.c:142 +msgid "Password mismatch" +msgstr "" + +#. 132 +#: ../lib/krb5/krb5_err.c:143 +msgid "Password read interrupted" +msgstr "" + +#. 133 +#: ../lib/krb5/krb5_err.c:144 +msgid "Invalid character in component name" +msgstr "" + +#. 134 +#: ../lib/krb5/krb5_err.c:145 +msgid "Malformed representation of principal" +msgstr "" + +#. 135 +#: ../lib/krb5/krb5_err.c:146 +msgid "Can't open/find configuration file" +msgstr "" + +#. 136 +#: ../lib/krb5/krb5_err.c:147 +msgid "Improper format of configuration file" +msgstr "" + +#. 137 +#: ../lib/krb5/krb5_err.c:148 +msgid "Insufficient space to return complete information" +msgstr "" + +#. 138 +#: ../lib/krb5/krb5_err.c:149 +msgid "Invalid message type specified for encoding" +msgstr "" + +#. 139 +#: ../lib/krb5/krb5_err.c:150 +msgid "Credential cache name malformed" +msgstr "" + +#. 140 +#: ../lib/krb5/krb5_err.c:151 +msgid "Unknown credential cache type" +msgstr "" + +#. 141 +#: ../lib/krb5/krb5_err.c:152 +msgid "Matching credential not found" +msgstr "" + +#. 142 +#: ../lib/krb5/krb5_err.c:153 +msgid "End of credential cache reached" +msgstr "" + +#. 143 +#: ../lib/krb5/krb5_err.c:154 +msgid "Request did not supply a ticket" +msgstr "" + +#. 144 +#: ../lib/krb5/krb5_err.c:155 +msgid "Wrong principal in request" +msgstr "" + +#. 145 +#: ../lib/krb5/krb5_err.c:156 +msgid "Ticket has invalid flag set" +msgstr "" + +#. 146 +#: ../lib/krb5/krb5_err.c:157 +msgid "Requested principal and ticket don't match" +msgstr "" + +#. 147 +#: ../lib/krb5/krb5_err.c:158 +msgid "KDC reply did not match expectations" +msgstr "" + +#. 148 +#: ../lib/krb5/krb5_err.c:159 +msgid "Clock skew too great in KDC reply" +msgstr "" + +#. 149 +#: ../lib/krb5/krb5_err.c:160 +msgid "Client/server realm mismatch in initial ticket request" +msgstr "" + +#. 150 +#: ../lib/krb5/krb5_err.c:161 +msgid "Program lacks support for encryption type" +msgstr "" + +#. 151 +#: ../lib/krb5/krb5_err.c:162 +msgid "Program lacks support for key type" +msgstr "" + +#. 152 +#: ../lib/krb5/krb5_err.c:163 +msgid "Requested encryption type not used in message" +msgstr "" + +#. 153 +#: ../lib/krb5/krb5_err.c:164 +msgid "Program lacks support for checksum type" +msgstr "" + +#. 154 +#: ../lib/krb5/krb5_err.c:165 +msgid "Cannot find KDC for requested realm" +msgstr "" + +#. 155 +#: ../lib/krb5/krb5_err.c:166 +msgid "Kerberos service unknown" +msgstr "" + +#. 156 +#: ../lib/krb5/krb5_err.c:167 +msgid "Cannot contact any KDC for requested realm" +msgstr "" + +#. 157 +#: ../lib/krb5/krb5_err.c:168 +msgid "No local name found for principal name" +msgstr "" + +#. 159 +#: ../lib/krb5/krb5_err.c:170 +msgid "Replay cache type is already registered" +msgstr "" + +#. 160 +#: ../lib/krb5/krb5_err.c:171 +msgid "No more memory to allocate (in replay cache code)" +msgstr "" + +#. 161 +#: ../lib/krb5/krb5_err.c:172 +msgid "Replay cache type is unknown" +msgstr "" + +#. 162 +#: ../lib/krb5/krb5_err.c:173 +msgid "Generic unknown RC error" +msgstr "" + +#. 163 +#: ../lib/krb5/krb5_err.c:174 +msgid "Message is a replay" +msgstr "" + +#. 164 +#: ../lib/krb5/krb5_err.c:175 +msgid "Replay I/O operation failed XXX" +msgstr "" + +#. 165 +#: ../lib/krb5/krb5_err.c:176 +msgid "Replay cache type does not support non-volatile storage" +msgstr "" + +#. 166 +#: ../lib/krb5/krb5_err.c:177 +msgid "Replay cache name parse/format error" +msgstr "" + +#. 167 +#: ../lib/krb5/krb5_err.c:178 +msgid "End-of-file on replay cache I/O" +msgstr "" + +#. 168 +#: ../lib/krb5/krb5_err.c:179 +msgid "No more memory to allocate (in replay cache I/O code)" +msgstr "" + +#. 169 +#: ../lib/krb5/krb5_err.c:180 +msgid "Permission denied in replay cache code" +msgstr "" + +#. 170 +#: ../lib/krb5/krb5_err.c:181 +msgid "I/O error in replay cache i/o code" +msgstr "" + +#. 171 +#: ../lib/krb5/krb5_err.c:182 +msgid "Generic unknown RC/IO error" +msgstr "" + +#. 172 +#: ../lib/krb5/krb5_err.c:183 +msgid "Insufficient system space to store replay information" +msgstr "" + +#. 173 +#: ../lib/krb5/krb5_err.c:184 +msgid "Can't open/find realm translation file" +msgstr "" + +#. 174 +#: ../lib/krb5/krb5_err.c:185 +msgid "Improper format of realm translation file" +msgstr "" + +#. 175 +#: ../lib/krb5/krb5_err.c:186 +msgid "Can't open/find lname translation database" +msgstr "" + +#. 176 +#: ../lib/krb5/krb5_err.c:187 +msgid "No translation available for requested principal" +msgstr "" + +#. 177 +#: ../lib/krb5/krb5_err.c:188 +msgid "Improper format of translation database entry" +msgstr "" + +#. 178 +#: ../lib/krb5/krb5_err.c:189 +msgid "Cryptosystem internal error" +msgstr "" + +#. 179 +#: ../lib/krb5/krb5_err.c:190 +msgid "Key table name malformed" +msgstr "" + +#. 180 +#: ../lib/krb5/krb5_err.c:191 +msgid "Unknown Key table type" +msgstr "" + +#. 181 +#: ../lib/krb5/krb5_err.c:192 +msgid "Key table entry not found" +msgstr "" + +#. 182 +#: ../lib/krb5/krb5_err.c:193 +msgid "End of key table reached" +msgstr "" + +#. 183 +#: ../lib/krb5/krb5_err.c:194 +msgid "Cannot write to specified key table" +msgstr "" + +#. 184 +#: ../lib/krb5/krb5_err.c:195 +msgid "Error writing to key table" +msgstr "" + +#. 185 +#: ../lib/krb5/krb5_err.c:196 +msgid "Cannot find ticket for requested realm" +msgstr "" + +#. 186 +#: ../lib/krb5/krb5_err.c:197 +msgid "DES key has bad parity" +msgstr "" + +#. 187 +#: ../lib/krb5/krb5_err.c:198 +msgid "DES key is a weak key" +msgstr "" + +#. 188 +#: ../lib/krb5/krb5_err.c:199 +msgid "Bad encryption type" +msgstr "" + +#. 189 +#: ../lib/krb5/krb5_err.c:200 +msgid "Key size is incompatible with encryption type" +msgstr "" + +#. 190 +#: ../lib/krb5/krb5_err.c:201 +msgid "Message size is incompatible with encryption type" +msgstr "" + +#. 191 +#: ../lib/krb5/krb5_err.c:202 +msgid "Credentials cache type is already registered." +msgstr "" + +#. 192 +#: ../lib/krb5/krb5_err.c:203 +msgid "Key table type is already registered." +msgstr "" + +#. 193 +#: ../lib/krb5/krb5_err.c:204 +msgid "Credentials cache I/O operation failed XXX" +msgstr "" + +#. 194 +#: ../lib/krb5/krb5_err.c:205 +msgid "Credentials cache file permissions incorrect" +msgstr "" + +#. 195 +#: ../lib/krb5/krb5_err.c:206 +msgid "No credentials cache file found" +msgstr "" + +#. 196 +#: ../lib/krb5/krb5_err.c:207 +msgid "Internal file credentials cache error" +msgstr "" + +#. 197 +#: ../lib/krb5/krb5_err.c:208 +msgid "Error writing to credentials cache file" +msgstr "" + +#. 198 +#: ../lib/krb5/krb5_err.c:209 +msgid "No more memory to allocate (in credentials cache code)" +msgstr "" + +#. 199 +#: ../lib/krb5/krb5_err.c:210 +msgid "Bad format in credentials cache" +msgstr "" + +#. 200 +#: ../lib/krb5/krb5_err.c:211 +msgid "No credentials found with supported encryption types" +msgstr "" + +#. 201 +#: ../lib/krb5/krb5_err.c:212 +msgid "Invalid KDC option combination (library internal error)" +msgstr "" + +#. 202 +#: ../lib/krb5/krb5_err.c:213 +msgid "Request missing second ticket" +msgstr "" + +#. 203 +#: ../lib/krb5/krb5_err.c:214 +msgid "No credentials supplied to library routine" +msgstr "" + +#. 204 +#: ../lib/krb5/krb5_err.c:215 +msgid "Bad sendauth version was sent" +msgstr "" + +#. 205 +#: ../lib/krb5/krb5_err.c:216 +msgid "Bad application version was sent (via sendauth)" +msgstr "" + +#. 206 +#: ../lib/krb5/krb5_err.c:217 +msgid "Bad response (during sendauth exchange)" +msgstr "" + +#. 207 +#: ../lib/krb5/krb5_err.c:218 +msgid "Server rejected authentication (during sendauth exchange)" +msgstr "" + +#. 208 +#: ../lib/krb5/krb5_err.c:219 +msgid "Unsupported preauthentication type" +msgstr "" + +#. 209 +#: ../lib/krb5/krb5_err.c:220 +msgid "Required preauthentication key not supplied" +msgstr "" + +#. 210 +#: ../lib/krb5/krb5_err.c:221 +msgid "Generic preauthentication failure" +msgstr "" + +#. 211 +#: ../lib/krb5/krb5_err.c:222 +msgid "Unsupported replay cache format version number" +msgstr "" + +#. 212 +#: ../lib/krb5/krb5_err.c:223 +msgid "Unsupported credentials cache format version number" +msgstr "" + +#. 213 +#: ../lib/krb5/krb5_err.c:224 +msgid "Unsupported key table format version number" +msgstr "" + +#. 214 +#: ../lib/krb5/krb5_err.c:225 +msgid "Program lacks support for address type" +msgstr "" + +#. 215 +#: ../lib/krb5/krb5_err.c:226 +msgid "Message replay detection requires rcache parameter" +msgstr "" + +#. 216 +#: ../lib/krb5/krb5_err.c:227 +msgid "Hostname cannot be canonicalized" +msgstr "" + +#. 217 +#: ../lib/krb5/krb5_err.c:228 +msgid "Cannot determine realm for host" +msgstr "" + +#. 218 +#: ../lib/krb5/krb5_err.c:229 +msgid "Conversion to service principal undefined for name type" +msgstr "" + +#. 219 +#: ../lib/krb5/krb5_err.c:230 +msgid "Initial Ticket response appears to be Version 4" +msgstr "" + +#. 220 +#: ../lib/krb5/krb5_err.c:231 +msgid "Cannot resolve KDC for requested realm" +msgstr "" + +#. 221 +#: ../lib/krb5/krb5_err.c:232 +msgid "Requesting ticket can't get forwardable tickets" +msgstr "" + +#. 222 +#: ../lib/krb5/krb5_err.c:233 +msgid "Bad principal name while trying to forward credentials" +msgstr "" + +#. 223 +#: ../lib/krb5/krb5_err.c:234 +msgid "Looping detected inside krb5_get_in_tkt" +msgstr "" + +#. 224 +#: ../lib/krb5/krb5_err.c:235 +msgid "Configuration file does not specify default realm" +msgstr "" + +#. 225 +#: ../lib/krb5/krb5_err.c:236 +msgid "Bad SAM flags in obtain_sam_padata" +msgstr "" + +#. 226 +#: ../lib/krb5/krb5_err.c:237 +msgid "Invalid encryption type in SAM challenge" +msgstr "" + +#. 227 +#: ../lib/krb5/krb5_err.c:238 +msgid "Missing checksum in SAM challenge" +msgstr "" + +#. 228 +#: ../lib/krb5/krb5_err.c:239 +msgid "Bad checksum in SAM challenge" +msgstr "" + +#. 229 +#. 230 +#. 231 +#. 232 +#. 233 +#. 234 +#. 235 +#. 236 +#. 237 +#. 238 +#: ../lib/krb5/krb5_err.c:249 +msgid "Program called an obsolete, deleted function" +msgstr "" + +#. 239 +#. 240 +#. 241 +#. 242 +#. 243 +#. 244 +#. 245 +#: ../lib/krb5/krb5_err.c:256 +msgid "Invalid key generation parameters from KDC" +msgstr "" + +#. 246 +#: ../lib/krb5/krb5_err.c:257 +msgid "Service not available" +msgstr "" + +#. 247 +#: ../lib/krb5/krb5_err.c:258 +msgid "Credential cache function not supported" +msgstr "" + +#. 248 +#: ../lib/krb5/krb5_err.c:259 +msgid "Invalid format of Kerberos lifetime or clock skew string" +msgstr "" + +#. 249 +#: ../lib/krb5/krb5_err.c:260 +msgid "Supplied data not handled by this plugin" +msgstr "" + +#. 250 +#: ../lib/krb5/krb5_err.c:261 +msgid "Plugin does not support the operaton" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err-1765328384/sv_SE.mo b/crypto/heimdal/po/heim_com_err-1765328384/sv_SE.mo new file mode 100644 index 0000000000000000000000000000000000000000..8e8256af25ecaf511f54930013d16314d071910b GIT binary patch literal 1549 zc$}4!O>Y!O5QZnlKv+;DIHD*NLVP4>%&dd4J;q32a3IEtWj0(8hu)o<+4lB!58XWr z8*${!4em(r3y`?wwD(+-LzKUezmRu6yxv11laXqlo$0r$x~i-GIy3(!z;g=rHS8tq zH0;lye&~xJxCovH&w)RHm%t2M0AGV=!C%28@DK0`_|;s!Z+WiPKb@=fufPl7M{pO~ z-{)$--_6(Ge*`as8e9h7f&~5su7Q7p*TAbsgWwzR$H}9t!9)Up`oPf1pC!6ob8wMLnvi78nr_>ZWA*pGLZI`Waln5`n!tuV!SaNJf zY^g6C3DSj9G~jWwe%TRz?YQ)@zqL~Gi(Fbx4rJIvvQ+o%IQLvd6`G7nXegXVfYR&M z-3`i(lD#om-s7Hk;Io3A4|Z!}C#NY^`-%ppWV-52;G6IyCF4?DMkj$lic`DU_O(%w$(FPGM0B=Mg~aEZDK8 ztVj4D2_M%9#B`tKFcFH{3yTY@tF2uwa|yRyCX?_^k-4yAVruRD)Co5%!;R75UEw*V z#VA?{qt!54ruO%7bmMB&jv@%dT^>pI@4BV<`f9Cvh?9pME3{L>8ynL@gR)5aV+}R9Q4s>Pslx=uV_e_EU#kA6uzO|zYD^$2??9j!e^Xk>DFRoGjcm0Z{ z^Xt_9cC8g`RlUiYQmJ)Wdyht%UZ`%?iIw7+DXTZ<<$HGPr}$i literal 0 Hc$@, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 13:06+0100\n" +"PO-Revision-Date: 2008-09-07 15:49+0100\n" +"Last-Translator: Love Hornquist Astrand <>\n" +"Language-Team: Swedish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. 000 +#: ../lib/krb5/krb5_err.c:11 +msgid "No error" +msgstr "" + +#. 001 +#: ../lib/krb5/krb5_err.c:12 +msgid "Client's entry in database has expired" +msgstr "Klientens post i databasen har gått ut" + +#. 002 +#: ../lib/krb5/krb5_err.c:13 +msgid "Server's entry in database has expired" +msgstr "Serverns post i databasen har gått ut" + +#. 003 +#: ../lib/krb5/krb5_err.c:14 +msgid "Requested protocol version not supported" +msgstr "Protokollversionen som efterfrågas stöds inte" + +#. 004 +#: ../lib/krb5/krb5_err.c:15 +msgid "Client's key is encrypted in an old master key" +msgstr "Klientens nyckel är krypterad i en gammal huvud nyckel" + +#. 005 +#: ../lib/krb5/krb5_err.c:16 +msgid "Server's key is encrypted in an old master key" +msgstr "Serverns nyckel är krypterad i en gammal huvud nyckel" + +#. 006 +#: ../lib/krb5/krb5_err.c:17 +msgid "Client not found in Kerberos database" +msgstr "Klienten finns inte i databasen" + +#. 007 +#: ../lib/krb5/krb5_err.c:18 +msgid "Server not found in Kerberos database" +msgstr "Servern finns inte i databasen" + +#. 008 +#: ../lib/krb5/krb5_err.c:19 +msgid "Principal has multiple entries in Kerberos database" +msgstr "" + +#. 009 +#: ../lib/krb5/krb5_err.c:20 +msgid "Client or server has a null key" +msgstr "Klient eller server har inga nyckar" + +#. 010 +#: ../lib/krb5/krb5_err.c:21 +msgid "Ticket is ineligible for postdating" +msgstr "Kan inte använda biljetten för sendare användning" + +#. 011 +#: ../lib/krb5/krb5_err.c:22 +msgid "Requested effective lifetime is negative or too short" +msgstr "Biljettens efterfrågad livstid är negativ eller för kort" + +#. 012 +#: ../lib/krb5/krb5_err.c:23 +msgid "KDC policy rejects request" +msgstr "Förfrågan nekad av KDCs policy" + +#. 013 +#: ../lib/krb5/krb5_err.c:24 +msgid "KDC can't fulfill requested option" +msgstr "" + +#. 014 +#: ../lib/krb5/krb5_err.c:25 +msgid "KDC has no support for encryption type" +msgstr "" + +#. 015 +#: ../lib/krb5/krb5_err.c:26 +msgid "KDC has no support for checksum type" +msgstr "" + +#. 016 +#: ../lib/krb5/krb5_err.c:27 +msgid "KDC has no support for padata type" +msgstr "" + +#. 017 +#: ../lib/krb5/krb5_err.c:28 +msgid "KDC has no support for transited type" +msgstr "" + +#. 018 +#: ../lib/krb5/krb5_err.c:29 +msgid "Clients credentials have been revoked" +msgstr "" + +#. 019 +#: ../lib/krb5/krb5_err.c:30 +msgid "Credentials for server have been revoked" +msgstr "" + +#. 020 +#: ../lib/krb5/krb5_err.c:31 +msgid "TGT has been revoked" +msgstr "" + +#. 021 +#: ../lib/krb5/krb5_err.c:32 +msgid "Client not yet valid - try again later" +msgstr "" + +#. 022 +#: ../lib/krb5/krb5_err.c:33 +msgid "Server not yet valid - try again later" +msgstr "" + +#. 023 +#: ../lib/krb5/krb5_err.c:34 +msgid "Password has expired" +msgstr "" + +#. 024 +#: ../lib/krb5/krb5_err.c:35 +msgid "Preauthentication failed" +msgstr "" + +#. 025 +#: ../lib/krb5/krb5_err.c:36 +msgid "Additional pre-authentication required" +msgstr "" + +#. 026 +#: ../lib/krb5/krb5_err.c:37 +msgid "Requested server and ticket don't match" +msgstr "" + +#. 027 +#: ../lib/krb5/krb5_err.c:38 +msgid "Server principal valid for user2user only" +msgstr "" + +#. 028 +#: ../lib/krb5/krb5_err.c:39 +msgid "KDC Policy rejects transited path" +msgstr "" + +#. 029 +#: ../lib/krb5/krb5_err.c:40 +msgid "A service is not available" +msgstr "" + +#. 030 +#. 031 +#: ../lib/krb5/krb5_err.c:42 +msgid "Decrypt integrity check failed" +msgstr "" + +#. 032 +#: ../lib/krb5/krb5_err.c:43 +msgid "Ticket expired" +msgstr "" + +#. 033 +#: ../lib/krb5/krb5_err.c:44 +msgid "Ticket not yet valid" +msgstr "" + +#. 034 +#: ../lib/krb5/krb5_err.c:45 +msgid "Request is a replay" +msgstr "" + +#. 035 +#: ../lib/krb5/krb5_err.c:46 +msgid "The ticket isn't for us" +msgstr "" + +#. 036 +#: ../lib/krb5/krb5_err.c:47 +msgid "Ticket/authenticator don't match" +msgstr "" + +#. 037 +#: ../lib/krb5/krb5_err.c:48 +msgid "Clock skew too great" +msgstr "" + +#. 038 +#: ../lib/krb5/krb5_err.c:49 +msgid "Incorrect net address" +msgstr "" + +#. 039 +#: ../lib/krb5/krb5_err.c:50 +msgid "Protocol version mismatch" +msgstr "" + +#. 040 +#: ../lib/krb5/krb5_err.c:51 +msgid "Invalid message type" +msgstr "" + +#. 041 +#: ../lib/krb5/krb5_err.c:52 +msgid "Message stream modified" +msgstr "" + +#. 042 +#: ../lib/krb5/krb5_err.c:53 +msgid "Message out of order" +msgstr "" + +#. 043 +#: ../lib/krb5/krb5_err.c:54 +msgid "Invalid cross-realm ticket" +msgstr "" + +#. 044 +#: ../lib/krb5/krb5_err.c:55 +msgid "Key version is not available" +msgstr "" + +#. 045 +#: ../lib/krb5/krb5_err.c:56 +msgid "Service key not available" +msgstr "" + +#. 046 +#. 158 +#: ../lib/krb5/krb5_err.c:57 ../lib/krb5/krb5_err.c:169 +msgid "Mutual authentication failed" +msgstr "" + +#. 047 +#: ../lib/krb5/krb5_err.c:58 +msgid "Incorrect message direction" +msgstr "" + +#. 048 +#: ../lib/krb5/krb5_err.c:59 +msgid "Alternative authentication method required" +msgstr "" + +#. 049 +#: ../lib/krb5/krb5_err.c:60 +msgid "Incorrect sequence number in message" +msgstr "" + +#. 050 +#: ../lib/krb5/krb5_err.c:61 +msgid "Inappropriate type of checksum in message" +msgstr "" + +#. 051 +#: ../lib/krb5/krb5_err.c:62 +msgid "Policy rejects transited path" +msgstr "" + +#. 052 +#: ../lib/krb5/krb5_err.c:63 +msgid "Response too big for UDP, retry with TCP" +msgstr "" + +#. 053 +#. 054 +#. 055 +#. 056 +#. 057 +#. 058 +#. 059 +#. 060 +#: ../lib/krb5/krb5_err.c:71 +msgid "Generic error (see e-text)" +msgstr "" + +#. 061 +#: ../lib/krb5/krb5_err.c:72 +msgid "Field is too long for this implementation" +msgstr "" + +#. 062 +#: ../lib/krb5/krb5_err.c:73 +msgid "Client not trusted" +msgstr "" + +#. 063 +#: ../lib/krb5/krb5_err.c:74 +msgid "KDC not trusted" +msgstr "" + +#. 064 +#: ../lib/krb5/krb5_err.c:75 +msgid "Invalid signature" +msgstr "" + +#. 065 +#: ../lib/krb5/krb5_err.c:76 +msgid "DH parameters not accepted" +msgstr "" + +#. 066 +#. 067 +#. 068 +#: ../lib/krb5/krb5_err.c:79 +msgid "Wrong realm" +msgstr "" + +#. 069 +#: ../lib/krb5/krb5_err.c:80 +msgid "User to user required" +msgstr "" + +#. 070 +#: ../lib/krb5/krb5_err.c:81 +msgid "Cannot verify certificate" +msgstr "" + +#. 071 +#: ../lib/krb5/krb5_err.c:82 +msgid "Certificate invalid" +msgstr "" + +#. 072 +#: ../lib/krb5/krb5_err.c:83 +msgid "Certificate revoked" +msgstr "" + +#. 073 +#: ../lib/krb5/krb5_err.c:84 +msgid "Revocation status unknown" +msgstr "" + +#. 074 +#: ../lib/krb5/krb5_err.c:85 +msgid "Revocation status unavaible" +msgstr "" + +#. 075 +#: ../lib/krb5/krb5_err.c:86 +msgid "Client name mismatch in certificate" +msgstr "" + +#. 076 +#: ../lib/krb5/krb5_err.c:87 +msgid "Inconsistent key purpose" +msgstr "" + +#. 077 +#: ../lib/krb5/krb5_err.c:88 +msgid "Digest in certificate not accepted" +msgstr "" + +#. 078 +#: ../lib/krb5/krb5_err.c:89 +msgid "paChecksum must be included" +msgstr "" + +#. 079 +#: ../lib/krb5/krb5_err.c:90 +msgid "Digest in signedData not accepted" +msgstr "" + +#. 080 +#: ../lib/krb5/krb5_err.c:91 +msgid "Public key encryption not supported" +msgstr "" + +#. 081 +#. 082 +#. 083 +#. 084 +#. 085 +#. 086 +#. 087 +#. 088 +#. 089 +#. 090 +#. 091 +#. 092 +#. 093 +#. 094 +#. 095 +#. 096 +#. 097 +#. 098 +#. 099 +#. 100 +#. 101 +#. 102 +#. 103 +#. 104 +#. 105 +#. 106 +#. 107 +#. 108 +#. 109 +#. 110 +#. 111 +#. 112 +#. 113 +#. 114 +#. 115 +#. 116 +#. 117 +#. 118 +#. 119 +#. 120 +#. 121 +#. 122 +#. 123 +#. 124 +#. 125 +#. 126 +#. 127 +#. 128 +#: ../lib/krb5/krb5_err.c:139 +msgid "$Id$" +msgstr "" + +#. 129 +#: ../lib/krb5/krb5_err.c:140 +msgid "Invalid flag for file lock mode" +msgstr "" + +#. 130 +#: ../lib/krb5/krb5_err.c:141 +msgid "Cannot read password" +msgstr "" + +#. 131 +#: ../lib/krb5/krb5_err.c:142 +msgid "Password mismatch" +msgstr "" + +#. 132 +#: ../lib/krb5/krb5_err.c:143 +msgid "Password read interrupted" +msgstr "" + +#. 133 +#: ../lib/krb5/krb5_err.c:144 +msgid "Invalid character in component name" +msgstr "" + +#. 134 +#: ../lib/krb5/krb5_err.c:145 +msgid "Malformed representation of principal" +msgstr "" + +#. 135 +#: ../lib/krb5/krb5_err.c:146 +msgid "Can't open/find configuration file" +msgstr "" + +#. 136 +#: ../lib/krb5/krb5_err.c:147 +msgid "Improper format of configuration file" +msgstr "" + +#. 137 +#: ../lib/krb5/krb5_err.c:148 +msgid "Insufficient space to return complete information" +msgstr "" + +#. 138 +#: ../lib/krb5/krb5_err.c:149 +msgid "Invalid message type specified for encoding" +msgstr "" + +#. 139 +#: ../lib/krb5/krb5_err.c:150 +msgid "Credential cache name malformed" +msgstr "" + +#. 140 +#: ../lib/krb5/krb5_err.c:151 +msgid "Unknown credential cache type" +msgstr "" + +#. 141 +#: ../lib/krb5/krb5_err.c:152 +msgid "Matching credential not found" +msgstr "" + +#. 142 +#: ../lib/krb5/krb5_err.c:153 +msgid "End of credential cache reached" +msgstr "" + +#. 143 +#: ../lib/krb5/krb5_err.c:154 +msgid "Request did not supply a ticket" +msgstr "" + +#. 144 +#: ../lib/krb5/krb5_err.c:155 +msgid "Wrong principal in request" +msgstr "" + +#. 145 +#: ../lib/krb5/krb5_err.c:156 +msgid "Ticket has invalid flag set" +msgstr "" + +#. 146 +#: ../lib/krb5/krb5_err.c:157 +msgid "Requested principal and ticket don't match" +msgstr "" + +#. 147 +#: ../lib/krb5/krb5_err.c:158 +msgid "KDC reply did not match expectations" +msgstr "" + +#. 148 +#: ../lib/krb5/krb5_err.c:159 +msgid "Clock skew too great in KDC reply" +msgstr "" + +#. 149 +#: ../lib/krb5/krb5_err.c:160 +msgid "Client/server realm mismatch in initial ticket request" +msgstr "" + +#. 150 +#: ../lib/krb5/krb5_err.c:161 +msgid "Program lacks support for encryption type" +msgstr "" + +#. 151 +#: ../lib/krb5/krb5_err.c:162 +msgid "Program lacks support for key type" +msgstr "" + +#. 152 +#: ../lib/krb5/krb5_err.c:163 +msgid "Requested encryption type not used in message" +msgstr "" + +#. 153 +#: ../lib/krb5/krb5_err.c:164 +msgid "Program lacks support for checksum type" +msgstr "" + +#. 154 +#: ../lib/krb5/krb5_err.c:165 +msgid "Cannot find KDC for requested realm" +msgstr "" + +#. 155 +#: ../lib/krb5/krb5_err.c:166 +msgid "Kerberos service unknown" +msgstr "" + +#. 156 +#: ../lib/krb5/krb5_err.c:167 +msgid "Cannot contact any KDC for requested realm" +msgstr "" + +#. 157 +#: ../lib/krb5/krb5_err.c:168 +msgid "No local name found for principal name" +msgstr "" + +#. 159 +#: ../lib/krb5/krb5_err.c:170 +msgid "Replay cache type is already registered" +msgstr "" + +#. 160 +#: ../lib/krb5/krb5_err.c:171 +msgid "No more memory to allocate (in replay cache code)" +msgstr "" + +#. 161 +#: ../lib/krb5/krb5_err.c:172 +msgid "Replay cache type is unknown" +msgstr "" + +#. 162 +#: ../lib/krb5/krb5_err.c:173 +msgid "Generic unknown RC error" +msgstr "" + +#. 163 +#: ../lib/krb5/krb5_err.c:174 +msgid "Message is a replay" +msgstr "" + +#. 164 +#: ../lib/krb5/krb5_err.c:175 +msgid "Replay I/O operation failed XXX" +msgstr "" + +#. 165 +#: ../lib/krb5/krb5_err.c:176 +msgid "Replay cache type does not support non-volatile storage" +msgstr "" + +#. 166 +#: ../lib/krb5/krb5_err.c:177 +msgid "Replay cache name parse/format error" +msgstr "" + +#. 167 +#: ../lib/krb5/krb5_err.c:178 +msgid "End-of-file on replay cache I/O" +msgstr "" + +#. 168 +#: ../lib/krb5/krb5_err.c:179 +msgid "No more memory to allocate (in replay cache I/O code)" +msgstr "" + +#. 169 +#: ../lib/krb5/krb5_err.c:180 +msgid "Permission denied in replay cache code" +msgstr "" + +#. 170 +#: ../lib/krb5/krb5_err.c:181 +msgid "I/O error in replay cache i/o code" +msgstr "" + +#. 171 +#: ../lib/krb5/krb5_err.c:182 +msgid "Generic unknown RC/IO error" +msgstr "" + +#. 172 +#: ../lib/krb5/krb5_err.c:183 +msgid "Insufficient system space to store replay information" +msgstr "" + +#. 173 +#: ../lib/krb5/krb5_err.c:184 +msgid "Can't open/find realm translation file" +msgstr "" + +#. 174 +#: ../lib/krb5/krb5_err.c:185 +msgid "Improper format of realm translation file" +msgstr "" + +#. 175 +#: ../lib/krb5/krb5_err.c:186 +msgid "Can't open/find lname translation database" +msgstr "" + +#. 176 +#: ../lib/krb5/krb5_err.c:187 +msgid "No translation available for requested principal" +msgstr "" + +#. 177 +#: ../lib/krb5/krb5_err.c:188 +msgid "Improper format of translation database entry" +msgstr "" + +#. 178 +#: ../lib/krb5/krb5_err.c:189 +msgid "Cryptosystem internal error" +msgstr "" + +#. 179 +#: ../lib/krb5/krb5_err.c:190 +msgid "Key table name malformed" +msgstr "" + +#. 180 +#: ../lib/krb5/krb5_err.c:191 +msgid "Unknown Key table type" +msgstr "" + +#. 181 +#: ../lib/krb5/krb5_err.c:192 +msgid "Key table entry not found" +msgstr "" + +#. 182 +#: ../lib/krb5/krb5_err.c:193 +msgid "End of key table reached" +msgstr "" + +#. 183 +#: ../lib/krb5/krb5_err.c:194 +msgid "Cannot write to specified key table" +msgstr "" + +#. 184 +#: ../lib/krb5/krb5_err.c:195 +msgid "Error writing to key table" +msgstr "" + +#. 185 +#: ../lib/krb5/krb5_err.c:196 +msgid "Cannot find ticket for requested realm" +msgstr "" + +#. 186 +#: ../lib/krb5/krb5_err.c:197 +msgid "DES key has bad parity" +msgstr "" + +#. 187 +#: ../lib/krb5/krb5_err.c:198 +msgid "DES key is a weak key" +msgstr "" + +#. 188 +#: ../lib/krb5/krb5_err.c:199 +msgid "Bad encryption type" +msgstr "" + +#. 189 +#: ../lib/krb5/krb5_err.c:200 +msgid "Key size is incompatible with encryption type" +msgstr "" + +#. 190 +#: ../lib/krb5/krb5_err.c:201 +msgid "Message size is incompatible with encryption type" +msgstr "" + +#. 191 +#: ../lib/krb5/krb5_err.c:202 +msgid "Credentials cache type is already registered." +msgstr "" + +#. 192 +#: ../lib/krb5/krb5_err.c:203 +msgid "Key table type is already registered." +msgstr "" + +#. 193 +#: ../lib/krb5/krb5_err.c:204 +msgid "Credentials cache I/O operation failed XXX" +msgstr "" + +#. 194 +#: ../lib/krb5/krb5_err.c:205 +msgid "Credentials cache file permissions incorrect" +msgstr "" + +#. 195 +#: ../lib/krb5/krb5_err.c:206 +msgid "No credentials cache file found" +msgstr "" + +#. 196 +#: ../lib/krb5/krb5_err.c:207 +msgid "Internal file credentials cache error" +msgstr "" + +#. 197 +#: ../lib/krb5/krb5_err.c:208 +msgid "Error writing to credentials cache file" +msgstr "" + +#. 198 +#: ../lib/krb5/krb5_err.c:209 +msgid "No more memory to allocate (in credentials cache code)" +msgstr "" + +#. 199 +#: ../lib/krb5/krb5_err.c:210 +msgid "Bad format in credentials cache" +msgstr "" + +#. 200 +#: ../lib/krb5/krb5_err.c:211 +msgid "No credentials found with supported encryption types" +msgstr "" + +#. 201 +#: ../lib/krb5/krb5_err.c:212 +msgid "Invalid KDC option combination (library internal error)" +msgstr "" + +#. 202 +#: ../lib/krb5/krb5_err.c:213 +msgid "Request missing second ticket" +msgstr "" + +#. 203 +#: ../lib/krb5/krb5_err.c:214 +msgid "No credentials supplied to library routine" +msgstr "" + +#. 204 +#: ../lib/krb5/krb5_err.c:215 +msgid "Bad sendauth version was sent" +msgstr "" + +#. 205 +#: ../lib/krb5/krb5_err.c:216 +msgid "Bad application version was sent (via sendauth)" +msgstr "" + +#. 206 +#: ../lib/krb5/krb5_err.c:217 +msgid "Bad response (during sendauth exchange)" +msgstr "" + +#. 207 +#: ../lib/krb5/krb5_err.c:218 +msgid "Server rejected authentication (during sendauth exchange)" +msgstr "" + +#. 208 +#: ../lib/krb5/krb5_err.c:219 +msgid "Unsupported preauthentication type" +msgstr "" + +#. 209 +#: ../lib/krb5/krb5_err.c:220 +msgid "Required preauthentication key not supplied" +msgstr "" + +#. 210 +#: ../lib/krb5/krb5_err.c:221 +msgid "Generic preauthentication failure" +msgstr "" + +#. 211 +#: ../lib/krb5/krb5_err.c:222 +msgid "Unsupported replay cache format version number" +msgstr "" + +#. 212 +#: ../lib/krb5/krb5_err.c:223 +msgid "Unsupported credentials cache format version number" +msgstr "" + +#. 213 +#: ../lib/krb5/krb5_err.c:224 +msgid "Unsupported key table format version number" +msgstr "" + +#. 214 +#: ../lib/krb5/krb5_err.c:225 +msgid "Program lacks support for address type" +msgstr "" + +#. 215 +#: ../lib/krb5/krb5_err.c:226 +msgid "Message replay detection requires rcache parameter" +msgstr "" + +#. 216 +#: ../lib/krb5/krb5_err.c:227 +msgid "Hostname cannot be canonicalized" +msgstr "" + +#. 217 +#: ../lib/krb5/krb5_err.c:228 +msgid "Cannot determine realm for host" +msgstr "" + +#. 218 +#: ../lib/krb5/krb5_err.c:229 +msgid "Conversion to service principal undefined for name type" +msgstr "" + +#. 219 +#: ../lib/krb5/krb5_err.c:230 +msgid "Initial Ticket response appears to be Version 4" +msgstr "" + +#. 220 +#: ../lib/krb5/krb5_err.c:231 +msgid "Cannot resolve KDC for requested realm" +msgstr "" + +#. 221 +#: ../lib/krb5/krb5_err.c:232 +msgid "Requesting ticket can't get forwardable tickets" +msgstr "" + +#. 222 +#: ../lib/krb5/krb5_err.c:233 +msgid "Bad principal name while trying to forward credentials" +msgstr "" + +#. 223 +#: ../lib/krb5/krb5_err.c:234 +msgid "Looping detected inside krb5_get_in_tkt" +msgstr "" + +#. 224 +#: ../lib/krb5/krb5_err.c:235 +msgid "Configuration file does not specify default realm" +msgstr "" + +#. 225 +#: ../lib/krb5/krb5_err.c:236 +msgid "Bad SAM flags in obtain_sam_padata" +msgstr "" + +#. 226 +#: ../lib/krb5/krb5_err.c:237 +msgid "Invalid encryption type in SAM challenge" +msgstr "" + +#. 227 +#: ../lib/krb5/krb5_err.c:238 +msgid "Missing checksum in SAM challenge" +msgstr "" + +#. 228 +#: ../lib/krb5/krb5_err.c:239 +msgid "Bad checksum in SAM challenge" +msgstr "" + +#. 229 +#. 230 +#. 231 +#. 232 +#. 233 +#. 234 +#. 235 +#. 236 +#. 237 +#. 238 +#: ../lib/krb5/krb5_err.c:249 +msgid "Program called an obsolete, deleted function" +msgstr "" + +#. 239 +#. 240 +#. 241 +#. 242 +#. 243 +#. 244 +#. 245 +#: ../lib/krb5/krb5_err.c:256 +msgid "Invalid key generation parameters from KDC" +msgstr "" + +#. 246 +#: ../lib/krb5/krb5_err.c:257 +msgid "Service not available" +msgstr "" + +#. 247 +#: ../lib/krb5/krb5_err.c:258 +msgid "Credential cache function not supported" +msgstr "" + +#. 248 +#: ../lib/krb5/krb5_err.c:259 +msgid "Invalid format of Kerberos lifetime or clock skew string" +msgstr "" + +#. 249 +#: ../lib/krb5/krb5_err.c:260 +msgid "Supplied data not handled by this plugin" +msgstr "" + +#. 250 +#: ../lib/krb5/krb5_err.c:261 +msgid "Plugin does not support the operaton" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err-1980176640/heim_com_err-1980176640.pot b/crypto/heimdal/po/heim_com_err-1980176640/heim_com_err-1980176640.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err-1980176640/heim_com_err-1980176640.pot @@ -0,0 +1,256 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/krb5/heim_err.c:11 +msgid "Error parsing log destination" +msgstr "" + +#. 001 +#: ../lib/krb5/heim_err.c:12 +msgid "Failed to convert v4 principal" +msgstr "" + +#. 002 +#: ../lib/krb5/heim_err.c:13 +msgid "Salt type is not supported by enctype" +msgstr "" + +#. 003 +#: ../lib/krb5/heim_err.c:14 +msgid "Host not found" +msgstr "" + +#. 004 +#: ../lib/krb5/heim_err.c:15 +msgid "Operation not supported" +msgstr "" + +#. 005 +#: ../lib/krb5/heim_err.c:16 +msgid "End of file" +msgstr "" + +#. 006 +#: ../lib/krb5/heim_err.c:17 +msgid "Failed to get the master key" +msgstr "" + +#. 007 +#: ../lib/krb5/heim_err.c:18 +msgid "Unacceptable service used" +msgstr "" + +#. 008 +#. 009 +#. 010 +#. 011 +#. 012 +#. 013 +#. 014 +#. 015 +#. 016 +#. 017 +#. 018 +#. 019 +#. 020 +#. 021 +#. 022 +#. 023 +#. 024 +#. 025 +#. 026 +#. 027 +#. 028 +#. 029 +#. 030 +#. 031 +#. 032 +#. 033 +#. 034 +#. 035 +#. 036 +#. 037 +#. 038 +#. 039 +#. 040 +#. 041 +#. 042 +#. 043 +#. 044 +#. 045 +#. 046 +#. 047 +#. 048 +#. 049 +#. 050 +#. 051 +#. 052 +#. 053 +#. 054 +#. 055 +#. 056 +#. 057 +#. 058 +#. 059 +#. 060 +#. 061 +#. 062 +#. 063 +#. 064 +#: ../lib/krb5/heim_err.c:75 +msgid "Certificate missing" +msgstr "" + +#. 065 +#: ../lib/krb5/heim_err.c:76 +msgid "Private key missing" +msgstr "" + +#. 066 +#: ../lib/krb5/heim_err.c:77 +msgid "No valid certificate authority" +msgstr "" + +#. 067 +#: ../lib/krb5/heim_err.c:78 +msgid "Certificate invalid" +msgstr "" + +#. 068 +#: ../lib/krb5/heim_err.c:79 +msgid "Private key invalid" +msgstr "" + +#. 069 +#. 070 +#. 071 +#. 072 +#. 073 +#. 074 +#. 075 +#. 076 +#. 077 +#. 078 +#. 079 +#. 080 +#. 081 +#. 082 +#. 083 +#. 084 +#. 085 +#. 086 +#. 087 +#. 088 +#. 089 +#. 090 +#. 091 +#. 092 +#. 093 +#. 094 +#. 095 +#. 096 +#. 097 +#. 098 +#. 099 +#. 100 +#. 101 +#. 102 +#. 103 +#. 104 +#. 105 +#. 106 +#. 107 +#. 108 +#. 109 +#. 110 +#. 111 +#. 112 +#. 113 +#. 114 +#. 115 +#. 116 +#. 117 +#. 118 +#. 119 +#. 120 +#. 121 +#. 122 +#. 123 +#. 124 +#. 125 +#. 126 +#. 127 +#. 128 +#: ../lib/krb5/heim_err.c:139 +msgid "unknown error from getaddrinfo" +msgstr "" + +#. 129 +#: ../lib/krb5/heim_err.c:140 +msgid "address family for nodename not supported" +msgstr "" + +#. 130 +#: ../lib/krb5/heim_err.c:141 +msgid "temporary failure in name resolution" +msgstr "" + +#. 131 +#: ../lib/krb5/heim_err.c:142 +msgid "invalid value for ai_flags" +msgstr "" + +#. 132 +#: ../lib/krb5/heim_err.c:143 +msgid "non-recoverable failure in name resolution" +msgstr "" + +#. 133 +#: ../lib/krb5/heim_err.c:144 +msgid "ai_family not supported" +msgstr "" + +#. 134 +#: ../lib/krb5/heim_err.c:145 +msgid "memory allocation failure" +msgstr "" + +#. 135 +#: ../lib/krb5/heim_err.c:146 +msgid "no address associated with nodename" +msgstr "" + +#. 136 +#: ../lib/krb5/heim_err.c:147 +msgid "nodename nor servname provided, or not known" +msgstr "" + +#. 137 +#: ../lib/krb5/heim_err.c:148 +msgid "servname not supported for ai_socktype" +msgstr "" + +#. 138 +#: ../lib/krb5/heim_err.c:149 +msgid "ai_socktype not supported" +msgstr "" + +#. 139 +#: ../lib/krb5/heim_err.c:150 +msgid "system error returned in errno" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err-969269760/heim_com_err-969269760.pot b/crypto/heimdal/po/heim_com_err-969269760/heim_com_err-969269760.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err-969269760/heim_com_err-969269760.pot @@ -0,0 +1,71 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/wind/wind_err.c:11 +msgid "No error" +msgstr "" + +#. 001 +#: ../lib/wind/wind_err.c:12 +msgid "No such profile" +msgstr "" + +#. 002 +#: ../lib/wind/wind_err.c:13 +msgid "Buffer overrun" +msgstr "" + +#. 003 +#: ../lib/wind/wind_err.c:14 +msgid "Buffer underrun" +msgstr "" + +#. 004 +#: ../lib/wind/wind_err.c:15 +msgid "Lenght not mod2" +msgstr "" + +#. 005 +#: ../lib/wind/wind_err.c:16 +msgid "Lenght not mod4" +msgstr "" + +#. 006 +#: ../lib/wind/wind_err.c:17 +msgid "Invalid UTF-8 combination in string" +msgstr "" + +#. 007 +#: ../lib/wind/wind_err.c:18 +msgid "Invalid UTF-16 combination in string" +msgstr "" + +#. 008 +#: ../lib/wind/wind_err.c:19 +msgid "Invalid UTF-32 combination in string" +msgstr "" + +#. 009 +#: ../lib/wind/wind_err.c:20 +msgid "No byte order mark (BOM) in string" +msgstr "" + +#. 010 +#: ../lib/wind/wind_err.c:21 +msgid "Code can't be represented as UTF-16" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err1859794432/heim_com_err1859794432.pot b/crypto/heimdal/po/heim_com_err1859794432/heim_com_err1859794432.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err1859794432/heim_com_err1859794432.pot @@ -0,0 +1,91 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/asn1/asn1_err.c:11 +msgid "ASN.1 failed call to system time library" +msgstr "" + +#. 001 +#: ../lib/asn1/asn1_err.c:12 +msgid "ASN.1 structure is missing a required field" +msgstr "" + +#. 002 +#: ../lib/asn1/asn1_err.c:13 +msgid "ASN.1 unexpected field number" +msgstr "" + +#. 003 +#: ../lib/asn1/asn1_err.c:14 +msgid "ASN.1 type numbers are inconsistent" +msgstr "" + +#. 004 +#: ../lib/asn1/asn1_err.c:15 +msgid "ASN.1 value too large" +msgstr "" + +#. 005 +#: ../lib/asn1/asn1_err.c:16 +msgid "ASN.1 encoding ended unexpectedly" +msgstr "" + +#. 006 +#: ../lib/asn1/asn1_err.c:17 +msgid "ASN.1 identifier doesn't match expected value" +msgstr "" + +#. 007 +#: ../lib/asn1/asn1_err.c:18 +msgid "ASN.1 length doesn't match expected value" +msgstr "" + +#. 008 +#: ../lib/asn1/asn1_err.c:19 +msgid "ASN.1 badly-formatted encoding" +msgstr "" + +#. 009 +#: ../lib/asn1/asn1_err.c:20 +msgid "ASN.1 parse error" +msgstr "" + +#. 010 +#: ../lib/asn1/asn1_err.c:21 +msgid "ASN.1 extra data past end of end structure" +msgstr "" + +#. 011 +#: ../lib/asn1/asn1_err.c:22 +msgid "ASN.1 invalid character in string" +msgstr "" + +#. 012 +#: ../lib/asn1/asn1_err.c:23 +msgid "ASN.1 too few elements" +msgstr "" + +#. 013 +#: ../lib/asn1/asn1_err.c:24 +msgid "ASN.1 too many elements" +msgstr "" + +#. 014 +#: ../lib/asn1/asn1_err.c:25 +msgid "ASN.1 wrong number of elements" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err35224064/heim_com_err35224064.pot b/crypto/heimdal/po/heim_com_err35224064/heim_com_err35224064.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err35224064/heim_com_err35224064.pot @@ -0,0 +1,225 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/gssapi/gkrb5_err.c:11 +msgid "No @ in SERVICE-NAME name string" +msgstr "" + +#. 001 +#: ../lib/gssapi/gkrb5_err.c:12 +msgid "STRING-UID-NAME contains nondigits" +msgstr "" + +#. 002 +#: ../lib/gssapi/gkrb5_err.c:13 +msgid "UID does not resolve to username" +msgstr "" + +#. 003 +#: ../lib/gssapi/gkrb5_err.c:14 +msgid "Validation error" +msgstr "" + +#. 004 +#: ../lib/gssapi/gkrb5_err.c:15 +msgid "Couldn't allocate gss_buffer_t data" +msgstr "" + +#. 005 +#: ../lib/gssapi/gkrb5_err.c:16 +msgid "Message context invalid" +msgstr "" + +#. 006 +#: ../lib/gssapi/gkrb5_err.c:17 +msgid "Buffer is the wrong size" +msgstr "" + +#. 007 +#: ../lib/gssapi/gkrb5_err.c:18 +msgid "Credential usage type is unknown" +msgstr "" + +#. 008 +#: ../lib/gssapi/gkrb5_err.c:19 +msgid "Unknown quality of protection specified" +msgstr "" + +#. 009 +#. 010 +#. 011 +#. 012 +#. 013 +#. 014 +#. 015 +#. 016 +#. 017 +#. 018 +#. 019 +#. 020 +#. 021 +#. 022 +#. 023 +#. 024 +#. 025 +#. 026 +#. 027 +#. 028 +#. 029 +#. 030 +#. 031 +#. 032 +#. 033 +#. 034 +#. 035 +#. 036 +#. 037 +#. 038 +#. 039 +#. 040 +#. 041 +#. 042 +#. 043 +#. 044 +#. 045 +#. 046 +#. 047 +#. 048 +#. 049 +#. 050 +#. 051 +#. 052 +#. 053 +#. 054 +#. 055 +#. 056 +#. 057 +#. 058 +#. 059 +#. 060 +#. 061 +#. 062 +#. 063 +#. 064 +#. 065 +#. 066 +#. 067 +#. 068 +#. 069 +#. 070 +#. 071 +#. 072 +#. 073 +#. 074 +#. 075 +#. 076 +#. 077 +#. 078 +#. 079 +#. 080 +#. 081 +#. 082 +#. 083 +#. 084 +#. 085 +#. 086 +#. 087 +#. 088 +#. 089 +#. 090 +#. 091 +#. 092 +#. 093 +#. 094 +#. 095 +#. 096 +#. 097 +#. 098 +#. 099 +#. 100 +#. 101 +#. 102 +#. 103 +#. 104 +#. 105 +#. 106 +#. 107 +#. 108 +#. 109 +#. 110 +#. 111 +#. 112 +#. 113 +#. 114 +#. 115 +#. 116 +#. 117 +#. 118 +#. 119 +#. 120 +#. 121 +#. 122 +#. 123 +#. 124 +#. 125 +#. 126 +#. 127 +#. 128 +#: ../lib/gssapi/gkrb5_err.c:139 +msgid "Principal in credential cache does not match desired name" +msgstr "" + +#. 129 +#: ../lib/gssapi/gkrb5_err.c:140 +msgid "No principal in keytab matches desired name" +msgstr "" + +#. 130 +#: ../lib/gssapi/gkrb5_err.c:141 +msgid "Credential cache has no TGT" +msgstr "" + +#. 131 +#: ../lib/gssapi/gkrb5_err.c:142 +msgid "Authenticator has no subkey" +msgstr "" + +#. 132 +#: ../lib/gssapi/gkrb5_err.c:143 +msgid "Context is already fully established" +msgstr "" + +#. 133 +#: ../lib/gssapi/gkrb5_err.c:144 +msgid "Unknown signature type in token" +msgstr "" + +#. 134 +#: ../lib/gssapi/gkrb5_err.c:145 +msgid "Invalid field length in token" +msgstr "" + +#. 135 +#: ../lib/gssapi/gkrb5_err.c:146 +msgid "Attempt to use incomplete security context" +msgstr "" + +#. 136 +#: ../lib/gssapi/gkrb5_err.c:147 +msgid "Input too long" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err36150272/heim_com_err36150272.pot b/crypto/heimdal/po/heim_com_err36150272/heim_com_err36150272.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err36150272/heim_com_err36150272.pot @@ -0,0 +1,82 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#. 001 +#: ../lib/hdb/hdb_err.c:12 +msgid "Database store error" +msgstr "" + +#. 002 +#: ../lib/hdb/hdb_err.c:13 +msgid "Database read error" +msgstr "" + +#. 003 +#: ../lib/hdb/hdb_err.c:14 +msgid "No such entry in the database" +msgstr "" + +#. 004 +#: ../lib/hdb/hdb_err.c:15 +msgid "Database is locked or in use--try again later" +msgstr "" + +#. 005 +#: ../lib/hdb/hdb_err.c:16 +msgid "Database was modified during read" +msgstr "" + +#. 006 +#: ../lib/hdb/hdb_err.c:17 +msgid "Attempt to lock database twice" +msgstr "" + +#. 007 +#: ../lib/hdb/hdb_err.c:18 +msgid "Attempt to unlock database when not locked" +msgstr "" + +#. 008 +#: ../lib/hdb/hdb_err.c:19 +msgid "Invalid kdb lock mode" +msgstr "" + +#. 009 +#: ../lib/hdb/hdb_err.c:20 +msgid "Insufficient access to lock database" +msgstr "" + +#. 010 +#: ../lib/hdb/hdb_err.c:21 +msgid "Entry already exists in database" +msgstr "" + +#. 011 +#: ../lib/hdb/hdb_err.c:22 +msgid "Wrong database version" +msgstr "" + +#. 012 +#: ../lib/hdb/hdb_err.c:23 +msgid "No correct master key" +msgstr "" + +#. 013 +#: ../lib/hdb/hdb_err.c:24 +msgid "Entry contains unknown mandatory extension" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err39525376/heim_com_err39525376.pot b/crypto/heimdal/po/heim_com_err39525376/heim_com_err39525376.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err39525376/heim_com_err39525376.pot @@ -0,0 +1,274 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/krb5/krb_err.c:11 +msgid "Kerberos 4 successful" +msgstr "" + +#. 001 +#: ../lib/krb5/krb_err.c:12 +msgid "Kerberos 4 principal expired" +msgstr "" + +#. 002 +#: ../lib/krb5/krb_err.c:13 +msgid "Kerberos 4 service expired" +msgstr "" + +#. 003 +#: ../lib/krb5/krb_err.c:14 +msgid "Kerberos 4 auth expired" +msgstr "" + +#. 004 +#. 005 +#. 006 +#: ../lib/krb5/krb_err.c:15 ../lib/krb5/krb_err.c:16 ../lib/krb5/krb_err.c:17 +msgid "Incorrect Kerberos 4 master key version" +msgstr "" + +#. 007 +#: ../lib/krb5/krb_err.c:18 +msgid "Kerberos 4 byte order unknown" +msgstr "" + +#. 008 +#: ../lib/krb5/krb_err.c:19 +msgid "Kerberos 4 principal unknown" +msgstr "" + +#. 009 +#: ../lib/krb5/krb_err.c:20 +msgid "Kerberos 4 principal not unique" +msgstr "" + +#. 010 +#: ../lib/krb5/krb_err.c:21 +msgid "Kerberos 4 principal has null key" +msgstr "" + +#. 011 +#. 012 +#. 013 +#. 014 +#. 015 +#. 016 +#. 017 +#. 018 +#. 019 +#. 020 +#: ../lib/krb5/krb_err.c:31 +msgid "Generic error from KDC (Kerberos 4)" +msgstr "" + +#. 021 +#: ../lib/krb5/krb_err.c:32 +msgid "Can't read Kerberos 4 ticket file" +msgstr "" + +#. 022 +#: ../lib/krb5/krb_err.c:33 +msgid "Can't find Kerberos 4 ticket or TGT" +msgstr "" + +#. 023 +#. 024 +#. 025 +#. 026 +#: ../lib/krb5/krb_err.c:37 +msgid "Kerberos 4 TGT Expired" +msgstr "" + +#. 027 +#. 028 +#. 029 +#. 030 +#. 031 +#: ../lib/krb5/krb_err.c:42 +msgid "Kerberos 4: Can't decode authenticator" +msgstr "" + +#. 032 +#: ../lib/krb5/krb_err.c:43 +msgid "Kerberos 4 ticket expired" +msgstr "" + +#. 033 +#: ../lib/krb5/krb_err.c:44 +msgid "Kerberos 4 ticket not yet valid" +msgstr "" + +#. 034 +#: ../lib/krb5/krb_err.c:45 +msgid "Kerberos 4: Repeated request" +msgstr "" + +#. 035 +#: ../lib/krb5/krb_err.c:46 +msgid "The Kerberos 4 ticket isn't for us" +msgstr "" + +#. 036 +#: ../lib/krb5/krb_err.c:47 +msgid "Kerberos 4 request inconsistent" +msgstr "" + +#. 037 +#: ../lib/krb5/krb_err.c:48 +msgid "Kerberos 4: delta_t too big" +msgstr "" + +#. 038 +#: ../lib/krb5/krb_err.c:49 +msgid "Kerberos 4: incorrect net address" +msgstr "" + +#. 039 +#: ../lib/krb5/krb_err.c:50 +msgid "Kerberos protocol not version 4" +msgstr "" + +#. 040 +#: ../lib/krb5/krb_err.c:51 +msgid "Kerberos 4: invalid msg type" +msgstr "" + +#. 041 +#: ../lib/krb5/krb_err.c:52 +msgid "Kerberos 4: message stream modified" +msgstr "" + +#. 042 +#: ../lib/krb5/krb_err.c:53 +msgid "Kerberos 4: message out of order" +msgstr "" + +#. 043 +#: ../lib/krb5/krb_err.c:54 +msgid "Kerberos 4: unauthorized request" +msgstr "" + +#. 044 +#. 045 +#. 046 +#. 047 +#. 048 +#. 049 +#. 050 +#. 051 +#: ../lib/krb5/krb_err.c:62 +msgid "Kerberos 4: current PW is null" +msgstr "" + +#. 052 +#: ../lib/krb5/krb_err.c:63 +msgid "Kerberos 4: Incorrect current password" +msgstr "" + +#. 053 +#: ../lib/krb5/krb_err.c:64 +msgid "Kerberos 4 protocol error" +msgstr "" + +#. 054 +#: ../lib/krb5/krb_err.c:65 +msgid "Error returned by KDC (Kerberos 4)" +msgstr "" + +#. 055 +#: ../lib/krb5/krb_err.c:66 +msgid "Null Kerberos 4 ticket returned by KDC" +msgstr "" + +#. 056 +#: ../lib/krb5/krb_err.c:67 +msgid "Kerberos 4: Retry count exceeded" +msgstr "" + +#. 057 +#: ../lib/krb5/krb_err.c:68 +msgid "Kerberos 4: Can't send request" +msgstr "" + +#. 058 +#. 059 +#. 060 +#. 061 +#: ../lib/krb5/krb_err.c:72 +msgid "Kerberos 4: not all tickets returned" +msgstr "" + +#. 062 +#: ../lib/krb5/krb_err.c:73 +msgid "Kerberos 4: incorrect password" +msgstr "" + +#. 063 +#: ../lib/krb5/krb_err.c:74 +msgid "Kerberos 4: Protocol Error" +msgstr "" + +#. 064 +#. 065 +#. 066 +#. 067 +#. 068 +#. 069 +#. 070 +#: ../lib/krb5/krb_err.c:81 +msgid "Other error in Kerberos 4" +msgstr "" + +#. 071 +#: ../lib/krb5/krb_err.c:82 +msgid "Don't have Kerberos 4 ticket-granting ticket" +msgstr "" + +#. 072 +#. 073 +#. 074 +#. 075 +#. 076 +#: ../lib/krb5/krb_err.c:87 +msgid "No Kerberos 4 ticket file found" +msgstr "" + +#. 077 +#: ../lib/krb5/krb_err.c:88 +msgid "Couldn't access Kerberos 4 ticket file" +msgstr "" + +#. 078 +#: ../lib/krb5/krb_err.c:89 +msgid "Couldn't lock Kerberos 4 ticket file" +msgstr "" + +#. 079 +#: ../lib/krb5/krb_err.c:90 +msgid "Bad Kerberos 4 ticket file format" +msgstr "" + +#. 080 +#: ../lib/krb5/krb_err.c:91 +msgid "Kerberos 4: tf_init not called first" +msgstr "" + +#. 081 +#: ../lib/krb5/krb_err.c:92 +msgid "Bad Kerberos 4 name format" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err43787520/heim_com_err43787520.pot b/crypto/heimdal/po/heim_com_err43787520/heim_com_err43787520.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err43787520/heim_com_err43787520.pot @@ -0,0 +1,262 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/kadm5/kadm5_err.c:11 +msgid "Operation failed for unspecified reason" +msgstr "" + +#. 001 +#: ../lib/kadm5/kadm5_err.c:12 +msgid "Operation requires `get' privilege" +msgstr "" + +#. 002 +#: ../lib/kadm5/kadm5_err.c:13 +msgid "Operation requires `add' privilege" +msgstr "" + +#. 003 +#: ../lib/kadm5/kadm5_err.c:14 +msgid "Operation requires `modify' privilege" +msgstr "" + +#. 004 +#: ../lib/kadm5/kadm5_err.c:15 +msgid "Operation requires `delete' privilege" +msgstr "" + +#. 005 +#: ../lib/kadm5/kadm5_err.c:16 +msgid "Insufficient authorization for operation" +msgstr "" + +#. 006 +#: ../lib/kadm5/kadm5_err.c:17 +msgid "Database inconsistency detected" +msgstr "" + +#. 007 +#: ../lib/kadm5/kadm5_err.c:18 +msgid "Principal or policy already exists" +msgstr "" + +#. 008 +#: ../lib/kadm5/kadm5_err.c:19 +msgid "Communication failure with server" +msgstr "" + +#. 009 +#: ../lib/kadm5/kadm5_err.c:20 +msgid "No administration server found for realm" +msgstr "" + +#. 010 +#: ../lib/kadm5/kadm5_err.c:21 +msgid "Password history principal key version mismatch" +msgstr "" + +#. 011 +#: ../lib/kadm5/kadm5_err.c:22 +msgid "Connection to server not initialized" +msgstr "" + +#. 012 +#: ../lib/kadm5/kadm5_err.c:23 +msgid "Principal does not exist" +msgstr "" + +#. 013 +#: ../lib/kadm5/kadm5_err.c:24 +msgid "Policy does not exist" +msgstr "" + +#. 014 +#: ../lib/kadm5/kadm5_err.c:25 +msgid "Invalid field mask for operation" +msgstr "" + +#. 015 +#: ../lib/kadm5/kadm5_err.c:26 +msgid "Invalid number of character classes" +msgstr "" + +#. 016 +#: ../lib/kadm5/kadm5_err.c:27 +msgid "Invalid password length" +msgstr "" + +#. 017 +#: ../lib/kadm5/kadm5_err.c:28 +msgid "Invalid policy name" +msgstr "" + +#. 018 +#: ../lib/kadm5/kadm5_err.c:29 +msgid "Invalid principal name." +msgstr "" + +#. 019 +#: ../lib/kadm5/kadm5_err.c:30 +msgid "Invalid auxillary attributes" +msgstr "" + +#. 020 +#: ../lib/kadm5/kadm5_err.c:31 +msgid "Invalid password history count" +msgstr "" + +#. 021 +#: ../lib/kadm5/kadm5_err.c:32 +msgid "Password minimum life is greater than password maximum life" +msgstr "" + +#. 022 +#: ../lib/kadm5/kadm5_err.c:33 +msgid "Password is too short" +msgstr "" + +#. 023 +#: ../lib/kadm5/kadm5_err.c:34 +msgid "Password does not contain enough character classes" +msgstr "" + +#. 024 +#: ../lib/kadm5/kadm5_err.c:35 +msgid "Password is in the password dictionary" +msgstr "" + +#. 025 +#: ../lib/kadm5/kadm5_err.c:36 +msgid "Can't reuse password" +msgstr "" + +#. 026 +#: ../lib/kadm5/kadm5_err.c:37 +msgid "Current password's minimum life has not expired" +msgstr "" + +#. 027 +#: ../lib/kadm5/kadm5_err.c:38 +msgid "Policy is in use" +msgstr "" + +#. 028 +#: ../lib/kadm5/kadm5_err.c:39 +msgid "Connection to server already initialized" +msgstr "" + +#. 029 +#: ../lib/kadm5/kadm5_err.c:40 +msgid "Incorrect password" +msgstr "" + +#. 030 +#: ../lib/kadm5/kadm5_err.c:41 +msgid "Can't change protected principal" +msgstr "" + +#. 031 +#: ../lib/kadm5/kadm5_err.c:42 +msgid "Programmer error! Bad Admin server handle" +msgstr "" + +#. 032 +#: ../lib/kadm5/kadm5_err.c:43 +msgid "Programmer error! Bad API structure version" +msgstr "" + +#. 033 +#: ../lib/kadm5/kadm5_err.c:44 +msgid "API structure version specified by application is no longer supported" +msgstr "" + +#. 034 +#: ../lib/kadm5/kadm5_err.c:45 +msgid "API structure version specified by application is unknown to libraries" +msgstr "" + +#. 035 +#: ../lib/kadm5/kadm5_err.c:46 +msgid "Programmer error! Bad API version" +msgstr "" + +#. 036 +#: ../lib/kadm5/kadm5_err.c:47 +msgid "" +"API version specified by application is no longer supported by libraries" +msgstr "" + +#. 037 +#: ../lib/kadm5/kadm5_err.c:48 +msgid "API version specified by application is no longer supported by server" +msgstr "" + +#. 038 +#: ../lib/kadm5/kadm5_err.c:49 +msgid "API version specified by application is unknown to libraries" +msgstr "" + +#. 039 +#: ../lib/kadm5/kadm5_err.c:50 +msgid "API version specified by application is unknown to server" +msgstr "" + +#. 040 +#: ../lib/kadm5/kadm5_err.c:51 +msgid "Database error! Required principal missing" +msgstr "" + +#. 041 +#: ../lib/kadm5/kadm5_err.c:52 +msgid "The salt type of the specified principal does not support renaming" +msgstr "" + +#. 042 +#: ../lib/kadm5/kadm5_err.c:53 +msgid "Invalid configuration parameter for remote KADM5 client" +msgstr "" + +#. 043 +#: ../lib/kadm5/kadm5_err.c:54 +msgid "Invalid configuration parameter for local KADM5 client." +msgstr "" + +#. 044 +#: ../lib/kadm5/kadm5_err.c:55 +msgid "Operation requires `list' privilege" +msgstr "" + +#. 045 +#: ../lib/kadm5/kadm5_err.c:56 +msgid "Operation requires `change-password' privilege" +msgstr "" + +#. 046 +#: ../lib/kadm5/kadm5_err.c:57 +msgid "Invalid tagged data list element type" +msgstr "" + +#. 047 +#: ../lib/kadm5/kadm5_err.c:58 +msgid "Required parameters in kdc.conf missing" +msgstr "" + +#. 048 +#: ../lib/kadm5/kadm5_err.c:59 +msgid "Bad krb5 admin server hostname" +msgstr "" diff --git a/crypto/heimdal/po/heim_com_err569856/heim_com_err569856.pot b/crypto/heimdal/po/heim_com_err569856/heim_com_err569856.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heim_com_err569856/heim_com_err569856.pot @@ -0,0 +1,419 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-07 15:23+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. 000 +#: ../lib/hx509/hx509_err.c:11 +msgid "ASN.1 failed call to system time library" +msgstr "" + +#. 001 +#: ../lib/hx509/hx509_err.c:12 +msgid "Extension not found" +msgstr "" + +#. 002 +#: ../lib/hx509/hx509_err.c:13 +msgid "Certification path not found" +msgstr "" + +#. 003 +#: ../lib/hx509/hx509_err.c:14 +msgid "Parent certificate is not a CA" +msgstr "" + +#. 004 +#: ../lib/hx509/hx509_err.c:15 +msgid "CA path too deep" +msgstr "" + +#. 005 +#: ../lib/hx509/hx509_err.c:16 +msgid "Signature algorithm not supported" +msgstr "" + +#. 006 +#: ../lib/hx509/hx509_err.c:17 +msgid "Signature algorithm doesn't match certificate key" +msgstr "" + +#. 007 +#: ../lib/hx509/hx509_err.c:18 +msgid "Certificate used before it became valid" +msgstr "" + +#. 008 +#: ../lib/hx509/hx509_err.c:19 +msgid "Certificate used after it became invalid" +msgstr "" + +#. 009 +#: ../lib/hx509/hx509_err.c:20 +msgid "Private key required for the operation is missing" +msgstr "" + +#. 010 +#: ../lib/hx509/hx509_err.c:21 +msgid "Algorithm not supported" +msgstr "" + +#. 011 +#: ../lib/hx509/hx509_err.c:22 +msgid "Issuer couldn't be found" +msgstr "" + +#. 012 +#: ../lib/hx509/hx509_err.c:23 +msgid "Error verifing constraints" +msgstr "" + +#. 013 +#: ../lib/hx509/hx509_err.c:24 +msgid "Number too large" +msgstr "" + +#. 014 +#: ../lib/hx509/hx509_err.c:25 +msgid "Error while verifing name constraints" +msgstr "" + +#. 015 +#: ../lib/hx509/hx509_err.c:26 +msgid "Path is too long, failed to find valid anchor" +msgstr "" + +#. 016 +#: ../lib/hx509/hx509_err.c:27 +msgid "Required keyusage for this certificate is missing" +msgstr "" + +#. 017 +#: ../lib/hx509/hx509_err.c:28 +msgid "Certificate not found" +msgstr "" + +#. 018 +#: ../lib/hx509/hx509_err.c:29 +msgid "Unknown lock command" +msgstr "" + +#. 019 +#: ../lib/hx509/hx509_err.c:30 +msgid "Parent certificate is a CA" +msgstr "" + +#. 020 +#: ../lib/hx509/hx509_err.c:31 +msgid "Extra data was found after the structure" +msgstr "" + +#. 021 +#: ../lib/hx509/hx509_err.c:32 +msgid "Proxy certificate is invalid" +msgstr "" + +#. 022 +#: ../lib/hx509/hx509_err.c:33 +msgid "Proxy certificate name is wrong" +msgstr "" + +#. 023 +#: ../lib/hx509/hx509_err.c:34 +msgid "Name is malformated" +msgstr "" + +#. 024 +#: ../lib/hx509/hx509_err.c:35 +msgid "Certificate is malformated" +msgstr "" + +#. 025 +#: ../lib/hx509/hx509_err.c:36 +msgid "Certificate is missing a required EKU" +msgstr "" + +#. 026 +#: ../lib/hx509/hx509_err.c:37 +msgid "Proxy certificate not canonicalize" +msgstr "" + +#. 027 +#. 028 +#. 029 +#. 030 +#. 031 +#. 032 +#: ../lib/hx509/hx509_err.c:43 +msgid "Failed to create signature" +msgstr "" + +#. 033 +#: ../lib/hx509/hx509_err.c:44 +msgid "Missing signer data" +msgstr "" + +#. 034 +#: ../lib/hx509/hx509_err.c:45 +msgid "Couldn't find signers certificate" +msgstr "" + +#. 035 +#: ../lib/hx509/hx509_err.c:46 +msgid "No data to perform the operation on" +msgstr "" + +#. 036 +#: ../lib/hx509/hx509_err.c:47 +msgid "Data in the message is invalid" +msgstr "" + +#. 037 +#: ../lib/hx509/hx509_err.c:48 +msgid "Padding in the message invalid" +msgstr "" + +#. 038 +#: ../lib/hx509/hx509_err.c:49 +msgid "Couldn't find recipient certificate" +msgstr "" + +#. 039 +#: ../lib/hx509/hx509_err.c:50 +msgid "Mismatch bewteen signed type and unsigned type" +msgstr "" + +#. 040 +#. 041 +#. 042 +#. 043 +#. 044 +#. 045 +#. 046 +#. 047 +#. 048 +#. 049 +#. 050 +#. 051 +#. 052 +#. 053 +#. 054 +#. 055 +#. 056 +#. 057 +#. 058 +#. 059 +#. 060 +#. 061 +#. 062 +#. 063 +#. 064 +#: ../lib/hx509/hx509_err.c:75 +msgid "Internal error in the crypto engine" +msgstr "" + +#. 065 +#: ../lib/hx509/hx509_err.c:76 +msgid "External error in the crypto engine" +msgstr "" + +#. 066 +#: ../lib/hx509/hx509_err.c:77 +msgid "Signature missing for data" +msgstr "" + +#. 067 +#: ../lib/hx509/hx509_err.c:78 +msgid "Signature is not valid" +msgstr "" + +#. 068 +#: ../lib/hx509/hx509_err.c:79 +msgid "Sigature doesn't provide confidentiality" +msgstr "" + +#. 069 +#: ../lib/hx509/hx509_err.c:80 +msgid "Invalid format on signature" +msgstr "" + +#. 070 +#: ../lib/hx509/hx509_err.c:81 +msgid "Mismatch bewteen oids" +msgstr "" + +#. 071 +#: ../lib/hx509/hx509_err.c:82 +msgid "No prompter function defined" +msgstr "" + +#. 072 +#: ../lib/hx509/hx509_err.c:83 +msgid "Signature require signer, but non available" +msgstr "" + +#. 073 +#. 074 +#: ../lib/hx509/hx509_err.c:84 ../lib/hx509/hx509_err.c:85 +msgid "RSA public encyption failed" +msgstr "" + +#. 075 +#. 076 +#: ../lib/hx509/hx509_err.c:86 ../lib/hx509/hx509_err.c:87 +msgid "RSA private decryption failed" +msgstr "" + +#. 077 +#. 078 +#. 079 +#. 080 +#. 081 +#. 082 +#. 083 +#. 084 +#. 085 +#. 086 +#. 087 +#. 088 +#. 089 +#. 090 +#. 091 +#. 092 +#. 093 +#. 094 +#. 095 +#. 096 +#: ../lib/hx509/hx509_err.c:107 +msgid "CRL used before it became valid" +msgstr "" + +#. 097 +#: ../lib/hx509/hx509_err.c:108 +msgid "CRL used after it became invalid" +msgstr "" + +#. 098 +#: ../lib/hx509/hx509_err.c:109 +msgid "CRL have invalid format" +msgstr "" + +#. 099 +#: ../lib/hx509/hx509_err.c:110 +msgid "Certificate is revoked" +msgstr "" + +#. 100 +#: ../lib/hx509/hx509_err.c:111 +msgid "No revoke status found for certificates" +msgstr "" + +#. 101 +#: ../lib/hx509/hx509_err.c:112 +msgid "Unknown extension" +msgstr "" + +#. 102 +#: ../lib/hx509/hx509_err.c:113 +msgid "Got wrong CRL/OCSP data from server" +msgstr "" + +#. 103 +#: ../lib/hx509/hx509_err.c:114 +msgid "Doesn't have same parent as other certificates" +msgstr "" + +#. 104 +#: ../lib/hx509/hx509_err.c:115 +msgid "Certificates not in OCSP reply" +msgstr "" + +#. 105 +#. 106 +#. 107 +#. 108 +#: ../lib/hx509/hx509_err.c:119 +msgid "No local key attribute" +msgstr "" + +#. 109 +#: ../lib/hx509/hx509_err.c:120 +msgid "Failed to parse key" +msgstr "" + +#. 110 +#: ../lib/hx509/hx509_err.c:121 +msgid "Unsupported operation" +msgstr "" + +#. 111 +#: ../lib/hx509/hx509_err.c:122 +msgid "Unimplemented operation" +msgstr "" + +#. 112 +#: ../lib/hx509/hx509_err.c:123 +msgid "Failed to parse name" +msgstr "" + +#. 113 +#. 114 +#. 115 +#. 116 +#. 117 +#. 118 +#. 119 +#. 120 +#. 121 +#. 122 +#. 123 +#. 124 +#. 125 +#. 126 +#. 127 +#. 128 +#: ../lib/hx509/hx509_err.c:139 +msgid "No smartcard reader/device found" +msgstr "" + +#. 129 +#: ../lib/hx509/hx509_err.c:140 +msgid "No smartcard in reader" +msgstr "" + +#. 130 +#: ../lib/hx509/hx509_err.c:141 +msgid "No supported mech(s)" +msgstr "" + +#. 131 +#: ../lib/hx509/hx509_err.c:142 +msgid "Token or slot failed in inconsistent way" +msgstr "" + +#. 132 +#: ../lib/hx509/hx509_err.c:143 +msgid "Failed to open session to slot" +msgstr "" + +#. 133 +#: ../lib/hx509/hx509_err.c:144 +msgid "Failed to login to slot" +msgstr "" + +#. 134 +#: ../lib/hx509/hx509_err.c:145 +msgid "Failed to load PKCS module" +msgstr "" diff --git a/crypto/heimdal/po/heimdal_krb5/heimdal_krb5.pot b/crypto/heimdal/po/heimdal_krb5/heimdal_krb5.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heimdal_krb5/heimdal_krb5.pot @@ -0,0 +1,1793 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 09:51-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: lib/krb5/acache.c:119 +#, c-format +msgid "Failed to load API cache module %s" +msgstr "" + +#: lib/krb5/acache.c:128 +#, c-format +msgid "Failed to find cc_initializein %s: %s" +msgstr "" + +#: lib/krb5/acache.c:138 +msgid "no support for shared object" +msgstr "" + +#: lib/krb5/acache.c:263 +#: lib/krb5/acache.c:982 +#: lib/krb5/acl.c:87 +#: lib/krb5/addr_families.c:1113 +#: lib/krb5/addr_families.c:1139 +#: lib/krb5/addr_families.c:1382 +#: lib/krb5/addr_families.c:1425 +#: lib/krb5/addr_families.c:1432 +#: lib/krb5/auth_context.c:46 +#: lib/krb5/auth_context.c:52 +#: lib/krb5/auth_context.c:244 +#: lib/krb5/auth_context.c:255 +#: lib/krb5/auth_context.c:455 +#: lib/krb5/build_auth.c:65 +#: lib/krb5/build_auth.c:85 +#: lib/krb5/build_auth.c:93 +#: lib/krb5/build_auth.c:123 +#: lib/krb5/cache.c:77 +#: lib/krb5/cache.c:104 +#: lib/krb5/cache.c:288 +#: lib/krb5/cache.c:361 +#: lib/krb5/cache.c:372 +#: lib/krb5/cache.c:493 +#: lib/krb5/cache.c:540 +#: lib/krb5/cache.c:941 +#: lib/krb5/cache.c:1006 +#: lib/krb5/cache.c:1335 +#: lib/krb5/context.c:71 +#: lib/krb5/context.c:107 +#: lib/krb5/context.c:354 +#: lib/krb5/context.c:360 +#: lib/krb5/context.c:707 +#: lib/krb5/context.c:749 +#: lib/krb5/context.c:787 +#: lib/krb5/context.c:940 +#: lib/krb5/context.c:1022 +#: lib/krb5/convert_creds.c:100 +#: lib/krb5/copy_host_realm.c:65 +#: lib/krb5/copy_host_realm.c:74 +#: lib/krb5/creds.c:161 +#: lib/krb5/crypto.c:362 +#: lib/krb5/crypto.c:445 +#: lib/krb5/crypto.c:459 +#: lib/krb5/crypto.c:507 +#: lib/krb5/crypto.c:585 +#: lib/krb5/crypto.c:601 +#: lib/krb5/crypto.c:625 +#: lib/krb5/crypto.c:673 +#: lib/krb5/crypto.c:679 +#: lib/krb5/crypto.c:916 +#: lib/krb5/crypto.c:1181 +#: lib/krb5/crypto.c:1258 +#: lib/krb5/crypto.c:1291 +#: lib/krb5/crypto.c:1544 +#: lib/krb5/crypto.c:1731 +#: lib/krb5/crypto.c:2634 +#: lib/krb5/crypto.c:2792 +#: lib/krb5/crypto.c:2856 +#: lib/krb5/crypto.c:2918 +#: lib/krb5/crypto.c:2970 +#: lib/krb5/crypto.c:3012 +#: lib/krb5/crypto.c:3041 +#: lib/krb5/crypto.c:3074 +#: lib/krb5/crypto.c:3103 +#: lib/krb5/crypto.c:3118 +#: lib/krb5/crypto.c:3806 +#: lib/krb5/crypto.c:3811 +#: lib/krb5/crypto.c:3830 +#: lib/krb5/crypto.c:3839 +#: lib/krb5/crypto.c:3845 +#: lib/krb5/crypto.c:3943 +#: lib/krb5/crypto.c:3963 +#: lib/krb5/crypto.c:4155 +#: lib/krb5/crypto.c:4167 +#: lib/krb5/crypto.c:4173 +#: lib/krb5/crypto.c:4347 +#: lib/krb5/crypto.c:4431 +#: lib/krb5/crypto.c:4458 +#: lib/krb5/crypto.c:4514 +#: lib/krb5/crypto.c:4644 +#: lib/krb5/crypto.c:4668 +#: lib/krb5/digest.c:58 +#: lib/krb5/digest.c:110 +#: lib/krb5/digest.c:125 +#: lib/krb5/digest.c:142 +#: lib/krb5/digest.c:147 +#: lib/krb5/digest.c:173 +#: lib/krb5/digest.c:197 +#: lib/krb5/digest.c:223 +#: lib/krb5/digest.c:228 +#: lib/krb5/digest.c:478 +#: lib/krb5/digest.c:483 +#: lib/krb5/digest.c:503 +#: lib/krb5/digest.c:520 +#: lib/krb5/digest.c:537 +#: lib/krb5/digest.c:542 +#: lib/krb5/digest.c:566 +#: lib/krb5/digest.c:583 +#: lib/krb5/digest.c:588 +#: lib/krb5/digest.c:608 +#: lib/krb5/digest.c:613 +#: lib/krb5/digest.c:632 +#: lib/krb5/digest.c:637 +#: lib/krb5/digest.c:658 +#: lib/krb5/digest.c:663 +#: lib/krb5/digest.c:682 +#: lib/krb5/digest.c:687 +#: lib/krb5/digest.c:702 +#: lib/krb5/digest.c:807 +#: lib/krb5/digest.c:847 +#: lib/krb5/digest.c:1065 +#: lib/krb5/digest.c:1078 +#: lib/krb5/digest.c:1091 +#: lib/krb5/digest.c:1106 +#: lib/krb5/digest.c:1121 +#: lib/krb5/digest.c:1136 +#: lib/krb5/digest.c:1141 +#: lib/krb5/expand_hostname.c:46 +#: lib/krb5/expand_hostname.c:81 +#: lib/krb5/fcache.c:150 +#: lib/krb5/fcache.c:186 +#: lib/krb5/fcache.c:193 +#: lib/krb5/fcache.c:309 +#: lib/krb5/fcache.c:316 +#: lib/krb5/fcache.c:682 +#: lib/krb5/fcache.c:802 +#: lib/krb5/generate_subkey.c:56 +#: lib/krb5/get_addrs.c:70 +#: lib/krb5/get_addrs.c:137 +#: lib/krb5/get_cred.c:103 +#: lib/krb5/get_cred.c:158 +#: lib/krb5/get_cred.c:178 +#: lib/krb5/get_cred.c:194 +#: lib/krb5/get_cred.c:205 +#: lib/krb5/get_cred.c:212 +#: lib/krb5/get_cred.c:222 +#: lib/krb5/get_cred.c:228 +#: lib/krb5/get_cred.c:237 +#: lib/krb5/get_cred.c:648 +#: lib/krb5/get_cred.c:722 +#: lib/krb5/get_cred.c:798 +#: lib/krb5/get_cred.c:870 +#: lib/krb5/get_cred.c:1120 +#: lib/krb5/get_cred.c:1210 +#: lib/krb5/get_cred.c:1275 +#: lib/krb5/get_cred.c:1283 +#: lib/krb5/get_cred.c:1322 +#: lib/krb5/get_default_realm.c:80 +#: lib/krb5/get_for_creds.c:55 +#: lib/krb5/get_for_creds.c:273 +#: lib/krb5/get_for_creds.c:286 +#: lib/krb5/get_for_creds.c:299 +#: lib/krb5/get_for_creds.c:306 +#: lib/krb5/get_for_creds.c:351 +#: lib/krb5/get_host_realm.c:195 +#: lib/krb5/get_host_realm.c:202 +#: lib/krb5/get_in_tkt.c:63 +#: lib/krb5/get_in_tkt.c:451 +#: lib/krb5/get_in_tkt.c:631 +#: lib/krb5/get_in_tkt.c:678 +#: lib/krb5/get_in_tkt.c:684 +#: lib/krb5/get_in_tkt.c:701 +#: lib/krb5/get_in_tkt.c:714 +#: lib/krb5/get_in_tkt.c:737 +#: lib/krb5/get_in_tkt.c:762 +#: lib/krb5/get_in_tkt.c:801 +#: lib/krb5/init_creds.c:58 +#: lib/krb5/init_creds.c:65 +#: lib/krb5/init_creds.c:84 +#: lib/krb5/init_creds.c:92 +#: lib/krb5/init_creds.c:389 +#: lib/krb5/init_creds_pw.c:341 +#: lib/krb5/init_creds_pw.c:355 +#: lib/krb5/init_creds_pw.c:518 +#: lib/krb5/init_creds_pw.c:570 +#: lib/krb5/init_creds_pw.c:576 +#: lib/krb5/init_creds_pw.c:595 +#: lib/krb5/init_creds_pw.c:608 +#: lib/krb5/init_creds_pw.c:631 +#: lib/krb5/init_creds_pw.c:1104 +#: lib/krb5/kcm.c:184 +#: lib/krb5/kcm.c:219 +#: lib/krb5/kcm.c:228 +#: lib/krb5/kcm.c:645 +#: lib/krb5/kcm.c:668 +#: lib/krb5/keyblock.c:136 +#: lib/krb5/keytab.c:58 +#: lib/krb5/keytab.c:109 +#: lib/krb5/keytab.c:270 +#: lib/krb5/keytab_any.c:76 +#: lib/krb5/keytab_any.c:137 +#: lib/krb5/keytab_file.c:65 +#: lib/krb5/keytab_file.c:86 +#: lib/krb5/keytab_file.c:195 +#: lib/krb5/keytab_file.c:227 +#: lib/krb5/keytab_file.c:298 +#: lib/krb5/keytab_file.c:304 +#: lib/krb5/keytab_file.c:395 +#: lib/krb5/keytab_file.c:611 +#: lib/krb5/keytab_keyfile.c:96 +#: lib/krb5/keytab_keyfile.c:123 +#: lib/krb5/keytab_keyfile.c:141 +#: lib/krb5/keytab_keyfile.c:157 +#: lib/krb5/keytab_keyfile.c:266 +#: lib/krb5/keytab_keyfile.c:336 +#: lib/krb5/keytab_memory.c:79 +#: lib/krb5/keytab_memory.c:87 +#: lib/krb5/keytab_memory.c:182 +#: lib/krb5/krbhst.c:102 +#: lib/krb5/krbhst.c:254 +#: lib/krb5/log.c:125 +#: lib/krb5/log.c:132 +#: lib/krb5/log.c:151 +#: lib/krb5/log.c:194 +#: lib/krb5/log.c:250 +#: lib/krb5/log.c:302 +#: lib/krb5/mcache.c:125 +#: lib/krb5/mcache.c:145 +#: lib/krb5/mcache.c:246 +#: lib/krb5/mcache.c:360 +#: lib/krb5/mcache.c:454 +#: lib/krb5/mk_priv.c:142 +#: lib/krb5/mk_rep.c:73 +#: lib/krb5/pac.c:96 +#: lib/krb5/pac.c:103 +#: lib/krb5/pac.c:127 +#: lib/krb5/pac.c:237 +#: lib/krb5/pac.c:244 +#: lib/krb5/pac.c:252 +#: lib/krb5/pac.c:275 +#: lib/krb5/pac.c:302 +#: lib/krb5/pac.c:359 +#: lib/krb5/pac.c:384 +#: lib/krb5/pac.c:428 +#: lib/krb5/pac.c:440 +#: lib/krb5/pac.c:543 +#: lib/krb5/pac.c:572 +#: lib/krb5/pac.c:590 +#: lib/krb5/pac.c:610 +#: lib/krb5/pac.c:658 +#: lib/krb5/pac.c:822 +#: lib/krb5/pac.c:895 +#: lib/krb5/pac.c:933 +#: lib/krb5/pac.c:941 +#: lib/krb5/pac.c:981 +#: lib/krb5/pac.c:1012 +#: lib/krb5/pac.c:1019 +#: lib/krb5/pac.c:1026 +#: lib/krb5/padata.c:56 +#: lib/krb5/pkinit.c:361 +#: lib/krb5/pkinit.c:617 +#: lib/krb5/pkinit.c:812 +#: lib/krb5/pkinit.c:877 +#: lib/krb5/pkinit.c:1059 +#: lib/krb5/pkinit.c:1250 +#: lib/krb5/pkinit.c:1268 +#: lib/krb5/pkinit.c:1531 +#: lib/krb5/pkinit.c:1750 +#: lib/krb5/pkinit.c:1898 +#: lib/krb5/pkinit.c:1939 +#: lib/krb5/pkinit.c:2059 +#: lib/krb5/pkinit.c:2131 +#: lib/krb5/principal.c:197 +#: lib/krb5/principal.c:206 +#: lib/krb5/principal.c:241 +#: lib/krb5/principal.c:273 +#: lib/krb5/principal.c:297 +#: lib/krb5/principal.c:308 +#: lib/krb5/principal.c:478 +#: lib/krb5/principal.c:554 +#: lib/krb5/principal.c:587 +#: lib/krb5/principal.c:594 +#: lib/krb5/principal.c:643 +#: lib/krb5/principal.c:652 +#: lib/krb5/principal.c:729 +#: lib/krb5/principal.c:735 +#: lib/krb5/principal.c:981 +#: lib/krb5/rd_cred.c:255 +#: lib/krb5/rd_cred.c:267 +#: lib/krb5/rd_rep.c:82 +#: lib/krb5/rd_req.c:539 +#: lib/krb5/rd_req.c:623 +#: lib/krb5/rd_safe.c:197 +#: lib/krb5/recvauth.c:141 +#: lib/krb5/replay.c:51 +#: lib/krb5/replay.c:72 +#: lib/krb5/replay.c:299 +#: lib/krb5/replay.c:311 +#: lib/krb5/scache.c:348 +#: lib/krb5/scache.c:489 +#: lib/krb5/scache.c:540 +#: lib/krb5/scache.c:655 +#: lib/krb5/scache.c:685 +#: lib/krb5/scache.c:879 +#: lib/krb5/scache.c:901 +#: lib/krb5/scache.c:909 +#: lib/krb5/scache.c:1151 +#: lib/krb5/scache.c:1165 +#: lib/krb5/scache.c:1174 +#: lib/krb5/scache.c:1185 +#: lib/krb5/scache.c:1359 +#: lib/krb5/send_to_kdc.c:493 +#: lib/krb5/send_to_kdc.c:528 +#: lib/krb5/set_default_realm.c:50 +#: lib/krb5/set_default_realm.c:57 +#: lib/krb5/ticket.c:61 +#: lib/krb5/ticket.c:157 +#: lib/krb5/transited.c:92 +#: lib/krb5/transited.c:101 +#: lib/krb5/transited.c:118 +#: lib/krb5/transited.c:127 +#: lib/krb5/transited.c:194 +#: lib/krb5/transited.c:209 +#: lib/krb5/transited.c:296 +#: lib/krb5/transited.c:305 +#: lib/krb5/transited.c:316 +#: lib/krb5/transited.c:325 +#: lib/krb5/v4_glue.c:429 +#: lib/krb5/v4_glue.c:486 +#: lib/krb5/v4_glue.c:545 +#: lib/krb5/v4_glue.c:601 +#: lib/krb5/v4_glue.c:780 +#: lib/krb5/v4_glue.c:853 +#: lib/krb5/verify_user.c:107 +msgid "malloc: out of memory" +msgstr "" + +#: lib/krb5/acache.c:632 +#: lib/krb5/acache.c:666 +#: lib/krb5/acache.c:693 +#: lib/krb5/acache.c:759 +#: lib/krb5/acache.c:996 +#: lib/krb5/acache.c:1016 +msgid "No API credential found" +msgstr "" + +#: lib/krb5/acache.c:812 +#, c-format +msgid "Can't find credential %s in cache" +msgstr "" + +#: lib/krb5/acl.c:103 +#, c-format +msgid "Unknown format specifier %c while parsing ACL" +msgstr "" + +#: lib/krb5/acl.c:225 +#: lib/krb5/acl.c:294 +msgid "ACL did not match" +msgstr "" + +#: lib/krb5/acl.c:264 +#: lib/krb5/fcache.c:375 +#: lib/krb5/keytab_file.c:542 +#, c-format +msgid "open(%s): %s" +msgstr "" + +#: lib/krb5/addr_families.c:206 +#, c-format +msgid "IPv4 prefix too large (%ld)" +msgstr "" + +#: lib/krb5/addr_families.c:400 +#, c-format +msgid "IPv6 prefix too large (%ld)" +msgstr "" + +#: lib/krb5/addr_families.c:406 +msgid "IPv6 addr bad length" +msgstr "" + +#: lib/krb5/addr_families.c:802 +#: lib/krb5/addr_families.c:830 +#: lib/krb5/addr_families.c:985 +#: lib/krb5/addr_families.c:1019 +#: lib/krb5/addr_families.c:1185 +#: lib/krb5/addr_families.c:1194 +#, c-format +msgid "Address family %d not supported" +msgstr "" + +#: lib/krb5/addr_families.c:869 +#, c-format +msgid "Address type %d not supported" +msgstr "" + +#: lib/krb5/addr_families.c:877 +#, c-format +msgid "Can't convert address type %d to sockaddr" +msgstr "" + +#: lib/krb5/addr_families.c:1493 +#, c-format +msgid "Address family %d doesn't support address mask operation" +msgstr "" + +#: lib/krb5/cache.c:64 +#, c-format +msgid "cache type %s already exists" +msgstr "" + +#: lib/krb5/cache.c:173 +#, c-format +msgid "unknown ccache type %s" +msgstr "" + +#: lib/krb5/cache.c:998 +#, c-format +msgid "Credential cache type %s doesn't support iterations over caches" +msgstr "" + +#: lib/krb5/cache.c:1114 +#, c-format +msgid "Principal %s not found in any credential cache" +msgstr "" + +#: lib/krb5/cache.c:1147 +msgid "Moving credentials between diffrent types not yet supported" +msgstr "" + +#: lib/krb5/cache.c:1394 +msgid "Reached end of credential caches" +msgstr "" + +#: lib/krb5/changepw.c:315 +#, c-format +msgid "Message too large from %s" +msgstr "" + +#: lib/krb5/changepw.c:654 +#, c-format +msgid "Unable to reach any changepw server in realm %s" +msgstr "" + +#: lib/krb5/convert_creds.c:136 +#, c-format +msgid "converting credentials: %s" +msgstr "" + +#: lib/krb5/crypto.c:594 +#: lib/krb5/crypto.c:609 +msgid "Password not an UCS2 string" +msgstr "" + +#: lib/krb5/crypto.c:939 +#: lib/krb5/crypto.c:1053 +#: lib/krb5/crypto.c:1109 +#: lib/krb5/crypto.c:1142 +#: lib/krb5/crypto.c:1168 +#: lib/krb5/crypto.c:2627 +#: lib/krb5/crypto.c:2665 +#: lib/krb5/crypto.c:2680 +#: lib/krb5/crypto.c:3909 +#: lib/krb5/crypto.c:3973 +#: lib/krb5/crypto.c:4095 +#: lib/krb5/crypto.c:4122 +#: lib/krb5/crypto.c:4146 +#: lib/krb5/crypto.c:4297 +#: lib/krb5/crypto.c:4339 +#: lib/krb5/crypto.c:4506 +#: lib/krb5/crypto.c:4566 +#, c-format +msgid "encryption type %d not supported" +msgstr "" + +#: lib/krb5/crypto.c:950 +#, c-format +msgid "salttype %s not supported" +msgstr "" + +#: lib/krb5/crypto.c:1062 +#, c-format +msgid "salt type %d not supported" +msgstr "" + +#: lib/krb5/crypto.c:1480 +#: lib/krb5/crypto.c:1815 +#: lib/krb5/crypto.c:1847 +#: lib/krb5/crypto.c:1907 +#: lib/krb5/crypto.c:1955 +#: lib/krb5/crypto.c:1971 +#: lib/krb5/crypto.c:1986 +#: lib/krb5/crypto.c:2001 +#: lib/krb5/crypto.c:2725 +#: lib/krb5/crypto.c:2738 +#, c-format +msgid "checksum type %d not supported" +msgstr "" + +#: lib/krb5/crypto.c:1767 +#: lib/krb5/crypto.c:1858 +#, c-format +msgid "Checksum type %s is keyed but no crypto context (key) was passed in" +msgstr "" + +#: lib/krb5/crypto.c:1937 +msgid "checksum type not found" +msgstr "" + +#: lib/krb5/crypto.c:2337 +msgid "malloc: out memory" +msgstr "" + +#: lib/krb5/crypto.c:2652 +#, c-format +msgid "encryption type %s not supported" +msgstr "" + +#: lib/krb5/crypto.c:2686 +#, c-format +msgid "encryption type %s is disabled" +msgstr "" + +#: lib/krb5/crypto.c:2744 +#, c-format +msgid "checksum type %s is disabled" +msgstr "" + +#: lib/krb5/crypto.c:2958 +msgid "Encrypted data shorter then checksum + confunder" +msgstr "" + +#: lib/krb5/crypto.c:3585 +msgid "Checksum larger then input buffer" +msgstr "" + +#: lib/krb5/crypto.c:3862 +#, c-format +msgid "derive_key() called with unknown keytype (%u)" +msgstr "" + +#: lib/krb5/crypto.c:4303 +#, c-format +msgid "" +"encryption key %s needs %d bytes of random to make an encryption key out of " +"it" +msgstr "" + +#: lib/krb5/crypto.c:4395 +msgid "Failed to encode KRB5PrincipalName" +msgstr "" + +#: lib/krb5/crypto.c:4490 +msgid "KDF not supported" +msgstr "" + +#: lib/krb5/crypto.c:4498 +msgid "kdf params not NULL or the NULL-type" +msgstr "" + +#: lib/krb5/digest.c:88 +msgid "server channel binding already set" +msgstr "" + +#: lib/krb5/digest.c:168 +msgid "nonce already set" +msgstr "" + +#: lib/krb5/digest.c:218 +msgid "identifier already set" +msgstr "" + +#: lib/krb5/digest.c:287 +msgid "Failed to encode digest inner request" +msgstr "" + +#: lib/krb5/digest.c:308 +msgid "Digest failed to get local subkey" +msgstr "" + +#: lib/krb5/digest.c:330 +msgid "Failed to encode DigestREQest" +msgstr "" + +#: lib/krb5/digest.c:343 +msgid "Failed to parse digest response" +msgstr "" + +#: lib/krb5/digest.c:365 +msgid "Digest reply have no remote subkey" +msgstr "" + +#: lib/krb5/digest.c:385 +msgid "Failed to decode digest inner reply" +msgstr "" + +#: lib/krb5/digest.c:425 +msgid "Type missing from init req" +msgstr "" + +#: lib/krb5/digest.c:439 +#: lib/krb5/digest.c:902 +#, c-format +msgid "Digest init error: %s" +msgstr "" + +#: lib/krb5/digest.c:447 +msgid "digest reply not an initReply" +msgstr "" + +#: lib/krb5/digest.c:454 +#: lib/krb5/digest.c:917 +msgid "Failed to copy initReply" +msgstr "" + +#: lib/krb5/digest.c:472 +msgid "clientNonce already set" +msgstr "" + +#: lib/krb5/digest.c:498 +msgid "digest already set" +msgstr "" + +#: lib/krb5/digest.c:559 +msgid "authentication_user already set" +msgstr "" + +#: lib/krb5/digest.c:603 +msgid "method already set" +msgstr "" + +#: lib/krb5/digest.c:627 +msgid "uri already set" +msgstr "" + +#: lib/krb5/digest.c:652 +msgid "nonceCount already set" +msgstr "" + +#: lib/krb5/digest.c:727 +msgid "Type missing from req" +msgstr "" + +#: lib/krb5/digest.c:744 +#, c-format +msgid "Digest response error: %s" +msgstr "" + +#: lib/krb5/digest.c:751 +msgid "digest reply not an DigestResponse" +msgstr "" + +#: lib/krb5/digest.c:759 +msgid "Failed to copy initReply," +msgstr "" + +#: lib/krb5/digest.c:910 +msgid "ntlm reply not an initReply" +msgstr "" + +#: lib/krb5/digest.c:1024 +#, c-format +msgid "NTLM response error: %s" +msgstr "" + +#: lib/krb5/digest.c:1032 +msgid "NTLM reply not an NTLMResponse" +msgstr "" + +#: lib/krb5/digest.c:1039 +msgid "Failed to copy NTLMResponse" +msgstr "" + +#: lib/krb5/digest.c:1163 +msgid "no ntlm session key" +msgstr "" + +#: lib/krb5/fcache.c:97 +#, c-format +msgid "timed out locking cache file %s" +msgstr "" + +#: lib/krb5/fcache.c:102 +#, c-format +msgid "error locking cache file %s: %s" +msgstr "" + +#: lib/krb5/fcache.c:134 +#, c-format +msgid "Failed to unlock file: %s" +msgstr "" + +#: lib/krb5/fcache.c:159 +msgid "Failed to write FILE credential data" +msgstr "" + +#: lib/krb5/fcache.c:322 +#, c-format +msgid "mkstemp %s failed" +msgstr "" + +#: lib/krb5/fcache.c:437 +#: lib/krb5/fcache.c:491 +#, c-format +msgid "close %s: %s" +msgstr "" + +#: lib/krb5/fcache.c:525 +#, c-format +msgid "Empty credential cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:528 +#, c-format +msgid "Error reading pvno in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:535 +#, c-format +msgid "Bad version number in credential cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:557 +#, c-format +msgid "Error reading tag length in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:569 +#, c-format +msgid "Error reading dtag in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:578 +#, c-format +msgid "Error reading dlength in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:589 +#, c-format +msgid "Error reading kdc_sec in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:598 +#, c-format +msgid "Error reading kdc_usec in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:610 +#, c-format +msgid "Error reading unknown tag in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:629 +#, c-format +msgid "Unknown version number (%d) in credential cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:857 +#, c-format +msgid "Rename of file from %s to %s failed: %s" +msgstr "" + +#: lib/krb5/fcache.c:884 +msgid "Failed to write data from one file credential cache to the other" +msgstr "" + +#: lib/krb5/fcache.c:892 +msgid "Failed to read data from one file credential cache to the other" +msgstr "" + +#: lib/krb5/fcache.c:946 +msgid "Failed to stat cache file" +msgstr "" + +#: lib/krb5/get_addrs.c:121 +msgid "no addresses found" +msgstr "" + +#: lib/krb5/get_cred.c:389 +#: lib/krb5/get_in_tkt.c:341 +msgid "Failed to decode encpart in ticket" +msgstr "" + +#: lib/krb5/get_cred.c:679 +#, c-format +msgid "Matching credential (%s) not found" +msgstr "" + +#: lib/krb5/get_cred.c:971 +msgid "Got back an non krbtgt ticket referrals" +msgstr "" + +#: lib/krb5/get_cred.c:992 +#, c-format +msgid "Referral from %s loops back to realm %s" +msgstr "" + +#: lib/krb5/get_default_principal.c:89 +msgid "unable to figure out current principal" +msgstr "" + +#: lib/krb5/get_for_creds.c:242 +#, c-format +msgid "resolving host %s failed: %s" +msgstr "" + +#: lib/krb5/get_host_realm.c:210 +#, c-format +msgid "unable to find realm of host %s" +msgstr "" + +#: lib/krb5/get_host_realm.c:254 +#, c-format +msgid "Unable to find realm of host %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:112 +#, c-format +msgid "Referral EncryptedData wrong for realm %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:141 +#, c-format +msgid "server ref realm mismatch, requested realm %s got back %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:157 +msgid "tgt returned with wrong ref" +msgstr "" + +#: lib/krb5/get_in_tkt.c:163 +msgid "req princ no same as returned" +msgstr "" + +#: lib/krb5/get_in_tkt.c:174 +msgid "referred principal not same as requested" +msgstr "" + +#: lib/krb5/get_in_tkt.c:181 +msgid "Requested principal missing on AS-REQ" +msgstr "" + +#: lib/krb5/get_in_tkt.c:191 +msgid "Not same server principal returned as requested" +msgstr "" + +#: lib/krb5/get_in_tkt.c:233 +#, c-format +msgid "Failed to decode ClientCanonicalized from realm %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:261 +#, c-format +msgid "Failed to verify client canonicalized data from realm %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:274 +msgid "Requested name doesn't match in client referral" +msgstr "" + +#: lib/krb5/get_in_tkt.c:284 +msgid "Mapped name doesn't match in client referral" +msgstr "" + +#: lib/krb5/get_in_tkt.c:294 +msgid "Not same client principal returned as requested" +msgstr "" + +#: lib/krb5/get_in_tkt.c:479 +#, c-format +msgid "time skew (%d) larger than max (%d)" +msgstr "" + +#: lib/krb5/get_in_tkt.c:821 +#, c-format +msgid "pre-auth type %d not supported" +msgstr "" + +#: lib/krb5/init_creds.c:335 +#, c-format +msgid "%s on non extendable opt" +msgstr "" + +#: lib/krb5/init_creds_pw.c:475 +msgid "failed changing password" +msgstr "" + +#: lib/krb5/init_creds_pw.c:1047 +#: lib/krb5/init_creds_pw.c:1203 +#: lib/krb5/pkinit.c:2154 +msgid "no support for PKINIT compiled in" +msgstr "" + +#: lib/krb5/init_creds_pw.c:1210 +msgid "No usable pa data type" +msgstr "" + +#: lib/krb5/init_creds_pw.c:1337 +msgid "failed to decode METHOD DATA" +msgstr "" + +#: lib/krb5/kcm.c:203 +msgid "Failed to encode KCM request" +msgstr "" + +#: lib/krb5/keytab.c:51 +msgid "can't register cache type, prefix too long" +msgstr "" + +#: lib/krb5/keytab.c:102 +#, c-format +msgid "unknown keytab type %.*s" +msgstr "" + +#: lib/krb5/keytab.c:384 +#, c-format +msgid "Failed to find %s%s in keytab %s (%s)" +msgstr "" + +#: lib/krb5/keytab.c:451 +#, c-format +msgid "start_seq_get is not supported in the %s keytab type" +msgstr "" + +#: lib/krb5/keytab.c:473 +#, c-format +msgid "next_entry is not supported in the %s keytab" +msgstr "" + +#: lib/krb5/keytab.c:511 +#, c-format +msgid "Add is not supported in the %s keytab" +msgstr "" + +#: lib/krb5/keytab.c:531 +#, c-format +msgid "Remove is not supported in the %s keytab" +msgstr "" + +#: lib/krb5/keytab_any.c:90 +msgid "empty ANY: keytab" +msgstr "" + +#: lib/krb5/keytab_any.c:214 +#, c-format +msgid "failed to add entry to %s" +msgstr "" + +#: lib/krb5/keytab_any.c:238 +#, c-format +msgid "Failed to remove keytab entry from %s" +msgstr "" + +#: lib/krb5/keytab_file.c:144 +#: lib/krb5/keytab_file.c:152 +#, c-format +msgid "Cant read keyblock from file %s" +msgstr "" + +#: lib/krb5/keytab_file.c:168 +#: lib/krb5/keytab_file.c:175 +#, c-format +msgid "Cant store keyblock to file %s" +msgstr "" + +#: lib/krb5/keytab_file.c:202 +#, c-format +msgid "Failed decoding length of keytab principal in keytab file %s" +msgstr "" + +#: lib/krb5/keytab_file.c:212 +#, c-format +msgid "Keytab principal contains invalid length in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:220 +#, c-format +msgid "Can't read realm from keytab: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:235 +#, c-format +msgid "Can't read principal from keytab: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:249 +#, c-format +msgid "Can't read name-type from keytab: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:380 +#, c-format +msgid "keytab %s open failed: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:579 +#, c-format +msgid "%s: keytab is corrupted: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:588 +#, c-format +msgid "Bad version in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:595 +#, c-format +msgid "failed reading tag from keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:617 +#, c-format +msgid "Failed storing principal in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:626 +#, c-format +msgid "Failed storing timpstamp in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:635 +#, c-format +msgid "Failed storing kvno in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:650 +#, c-format +msgid "Failed storing extended kvno in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:662 +#, c-format +msgid "Failed converting keytab entry to memory block for keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:688 +#, c-format +msgid "Failed writing keytab block in keytab %s: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:78 +#, c-format +msgid "Open ThisCell %s: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:86 +#, c-format +msgid "No cell in ThisCell file %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:107 +#, c-format +msgid "No realm in ThisCell file %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:212 +#, c-format +msgid "keytab afs keyfile open %s failed: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:324 +#, c-format +msgid "open keyfile(%s): %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:347 +#, c-format +msgid "seeking in keyfile: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:372 +msgid "Failed getting kvno from keyfile" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:378 +#: lib/krb5/keytab_keyfile.c:394 +#, c-format +msgid "Failed seeing in keyfile: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:403 +msgid "keytab keyfile failed new length" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:410 +#, c-format +msgid "seek to end: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:417 +msgid "keytab keyfile failed store kvno" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:428 +msgid "keytab keyfile failed to add key" +msgstr "" + +#: lib/krb5/krbhst.c:76 +#, c-format +msgid "unknown protocol `%s' to lookup" +msgstr "" + +#: lib/krb5/krbhst.c:547 +#, c-format +msgid "Locate plugin failed to lookup realm %s: %d" +msgstr "" + +#: lib/krb5/krbhst.c:843 +#, c-format +msgid "unknown krbhst type (%u)" +msgstr "" + +#: lib/krb5/krbhst.c:932 +#, c-format +msgid "No KDC found for realm %s" +msgstr "" + +#: lib/krb5/log.c:286 +#, c-format +msgid "failed to parse \"%s\"" +msgstr "" + +#: lib/krb5/log.c:311 +#, c-format +msgid "open(%s) logfile: %s" +msgstr "" + +#: lib/krb5/log.c:322 +#, c-format +msgid "fdopen(%s) logfile: %s" +msgstr "" + +#: lib/krb5/log.c:348 +#, c-format +msgid "unknown log type: %s" +msgstr "" + +#. Too few buffers +#: lib/krb5/pac.c:112 +msgid "PAC have too few buffer" +msgstr "" + +#: lib/krb5/pac.c:118 +#, c-format +msgid "PAC have wrong version %d" +msgstr "" + +#: lib/krb5/pac.c:150 +msgid "PAC out of allignment" +msgstr "" + +#: lib/krb5/pac.c:156 +msgid "PAC high offset set" +msgstr "" + +#: lib/krb5/pac.c:162 +msgid "PAC offset off end" +msgstr "" + +#: lib/krb5/pac.c:168 +#, c-format +msgid "PAC offset inside header: %lu %lu" +msgstr "" + +#: lib/krb5/pac.c:175 +msgid "PAC length off end" +msgstr "" + +#: lib/krb5/pac.c:184 +msgid "PAC have two server checksums" +msgstr "" + +#: lib/krb5/pac.c:192 +msgid "PAC have two KDC checksums" +msgstr "" + +#: lib/krb5/pac.c:200 +msgid "PAC have two logon names" +msgstr "" + +#: lib/krb5/pkinit.c:118 +#, c-format +msgid "PKINIT: parsing BN failed %s" +msgstr "" + +#: lib/krb5/pkinit.c:542 +#, c-format +msgid "Failed encoding AuthPackWin: %d" +msgstr "" + +#: lib/krb5/pkinit.c:565 +#, c-format +msgid "Failed encoding AuthPack: %d" +msgstr "" + +#: lib/krb5/pkinit.c:586 +msgid "ContentInfo wrapping of signedData failed" +msgstr "" + +#: lib/krb5/pkinit.c:625 +msgid "pk-init: failed to build trustedCertifiers" +msgstr "" + +#: lib/krb5/pkinit.c:796 +#: lib/krb5/pkinit.c:844 +msgid "PKINIT decoding reply key failed" +msgstr "" + +#: lib/krb5/pkinit.c:803 +msgid "PKINIT enckey nonce is wrong" +msgstr "" + +#: lib/krb5/pkinit.c:820 +#: lib/krb5/pkinit.c:885 +msgid "PKINIT failed copying reply key" +msgstr "" + +#: lib/krb5/pkinit.c:908 +msgid "No PK-INIT KDC EKU in kdc certificate" +msgstr "" + +#: lib/krb5/pkinit.c:922 +msgid "Failed to find the PK-INIT subjectAltName in the KDC certificate" +msgstr "" + +#: lib/krb5/pkinit.c:938 +msgid "Failed to decode the PK-INIT subjectAltName in the KDC certificate" +msgstr "" + +#: lib/krb5/pkinit.c:952 +msgid "KDC have wrong realm name in the certificate" +msgstr "" + +#: lib/krb5/pkinit.c:974 +msgid "Address mismatch in the KDC certificate" +msgstr "" + +#: lib/krb5/pkinit.c:1001 +#: lib/krb5/pkinit.c:1048 +#: lib/krb5/pkinit.c:1149 +msgid "PKINIT: Invalid content type" +msgstr "" + +#: lib/krb5/pkinit.c:1171 +msgid "pkinit - dh reply contains wrong oid" +msgstr "" + +#: lib/krb5/pkinit.c:1182 +msgid "pkinit - failed to decode KDC DH Key Info" +msgstr "" + +#: lib/krb5/pkinit.c:1190 +msgid "PKINIT: DH nonce is wrong" +msgstr "" + +#: lib/krb5/pkinit.c:1198 +msgid "pkinit; got key expiration without server nonce" +msgstr "" + +#: lib/krb5/pkinit.c:1205 +msgid "pkinit; got DH reuse but no client nonce" +msgstr "" + +#: lib/krb5/pkinit.c:1213 +msgid "pkinit: got server nonce without key expiration" +msgstr "" + +#: lib/krb5/pkinit.c:1229 +msgid "pkinit: can't decode without key expiration" +msgstr "" + +#: lib/krb5/pkinit.c:1260 +msgid "PKINIT: Can't compute Diffie-Hellman key" +msgstr "" + +#: lib/krb5/pkinit.c:1279 +msgid "PKINIT: can't create key from DH key" +msgstr "" + +#: lib/krb5/pkinit.c:1325 +msgid "PKINIT: wrong padata recv" +msgstr "" + +#: lib/krb5/pkinit.c:1335 +msgid "Failed to decode pkinit AS rep" +msgstr "" + +#: lib/krb5/pkinit.c:1349 +msgid "PKINIT: -27 reply invalid content type" +msgstr "" + +#: lib/krb5/pkinit.c:1358 +#: lib/krb5/pkinit.c:1418 +msgid "PKINIT: failed to unwrap CI" +msgstr "" + +#: lib/krb5/pkinit.c:1401 +#, c-format +msgid "PKINIT: Failed decoding windows pkinit reply %d" +msgstr "" + +#: lib/krb5/pkinit.c:1433 +msgid "PKINIT: win2k reply invalid content type" +msgstr "" + +#: lib/krb5/pkinit.c:1441 +msgid "PKINIT: unknown reply type" +msgstr "" + +#: lib/krb5/pkinit.c:1516 +msgid "PKINIT: No anchor given" +msgstr "" + +#: lib/krb5/pkinit.c:1522 +msgid "PKINIT: No user certificate given" +msgstr "" + +#: lib/krb5/pkinit.c:1655 +#, c-format +msgid "Did not find a DH group parameter matching requirement of %lu bits" +msgstr "" + +#: lib/krb5/pkinit.c:1718 +#, c-format +msgid "moduli file %s missing %s on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1725 +#, c-format +msgid "moduli file %s failed parsing %s on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1765 +#, c-format +msgid "moduli file %s missing name on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1772 +msgid "malloc: out of memeory" +msgstr "" + +#: lib/krb5/pkinit.c:1779 +#, c-format +msgid "moduli file %s missing bits on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1787 +#, c-format +msgid "moduli file %s have un-parsable bits on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1981 +#, c-format +msgid "PKINIT: DH group parameter %s no accepted, not enough bits generated" +msgstr "" + +#: lib/krb5/pkinit.c:1994 +msgid "PKINIT: DH group parameter no ok" +msgstr "" + +#: lib/krb5/pkinit.c:2051 +msgid "PKINIT: on non extendable opt" +msgstr "" + +#: lib/krb5/pkinit.c:2146 +msgid "pkinit: failed to generate DH key" +msgstr "" + +#: lib/krb5/principal.c:169 +msgid "Can't require both realm and no realm at the same time" +msgstr "" + +#: lib/krb5/principal.c:184 +#: lib/krb5/principal.c:224 +msgid "trailing \\ in principal name" +msgstr "" + +#: lib/krb5/principal.c:234 +#: lib/krb5/principal.c:256 +msgid "part after realm in principal name" +msgstr "" + +#: lib/krb5/principal.c:265 +msgid "realm found in 'short' principal expected to be without one" +msgstr "" + +#: lib/krb5/principal.c:282 +msgid "realm NOT found in principal expected to be with one" +msgstr "" + +#: lib/krb5/principal.c:379 +msgid "Realm missing from principal, can't unparse" +msgstr "" + +#: lib/krb5/principal.c:390 +msgid "Out of space printing principal" +msgstr "" + +#: lib/krb5/principal.c:410 +msgid "Out of space printing realm of principal" +msgstr "" + +#: lib/krb5/principal.c:1233 +#, c-format +msgid "cannot convert a %d component principal" +msgstr "" + +#: lib/krb5/principal.c:1260 +msgid "too long name component to convert" +msgstr "" + +#: lib/krb5/principal.c:1265 +msgid "too long instance component to convert" +msgstr "" + +#: lib/krb5/principal.c:1270 +msgid "too long realm component to convert" +msgstr "" + +#: lib/krb5/principal.c:1305 +#, c-format +msgid "unsupported name type %d" +msgstr "" + +#: lib/krb5/principal.c:1314 +msgid "Failed to get local hostname" +msgstr "" + +#: lib/krb5/principal.c:1374 +#, c-format +msgid "Failed to find name type %s" +msgstr "" + +#: lib/krb5/rd_cred.c:160 +msgid "Failed to decode encrypte credential part" +msgstr "" + +#: lib/krb5/rd_cred.c:180 +msgid "sender address is wrong in received creds" +msgstr "" + +#: lib/krb5/rd_cred.c:202 +#: lib/krb5/rd_cred.c:211 +msgid "receiver address is wrong in received creds" +msgstr "" + +#: lib/krb5/rd_error.c:95 +#, c-format +msgid "Client %s%s%s expired" +msgstr "" + +#: lib/krb5/rd_error.c:102 +#, c-format +msgid "Server %s%s%s expired" +msgstr "" + +#: lib/krb5/rd_error.c:109 +#, c-format +msgid "Client %s%s%s unknown" +msgstr "" + +#: lib/krb5/rd_error.c:116 +#, c-format +msgid "Server %s%s%s unknown" +msgstr "" + +#: lib/krb5/rd_rep.c:87 +msgid "Failed to decode EncAPRepPart" +msgstr "" + +#: lib/krb5/rd_req.c:64 +msgid "Failed to decode encrypted ticket part" +msgstr "" + +#: lib/krb5/rd_req.c:817 +msgid "krb5_rd_req: user to user auth without session key given" +msgstr "" + +#: lib/krb5/rd_safe.c:103 +msgid "rd_safe: need outdata to return data" +msgstr "" + +#: lib/krb5/recvauth.c:111 +msgid "Failed to receive sendauth data" +msgstr "" + +#: lib/krb5/recvauth.c:149 +#, c-format +msgid "wrong sendauth version (%s)" +msgstr "" + +#: lib/krb5/replay.c:65 +#: lib/krb5/replay.c:89 +#, c-format +msgid "replay cache type %s not supported" +msgstr "" + +#: lib/krb5/scache.c:200 +#, c-format +msgid "Failed to prepare stmt %s: %s" +msgstr "" + +#: lib/krb5/scache.c:216 +#, c-format +msgid "scache execute %s: %s" +msgstr "" + +#: lib/krb5/scache.c:342 +#, c-format +msgid "Error opening scache file %s: %s" +msgstr "" + +#: lib/krb5/scache.c:365 +#, c-format +msgid "Failed to add scache: %d" +msgstr "" + +#: lib/krb5/scache.c:462 +#, c-format +msgid "scache bind principal: %s" +msgstr "" + +#: lib/krb5/scache.c:513 +#, c-format +msgid "Cache name of wrong type for scache %ld" +msgstr "" + +#: lib/krb5/scache.c:578 +#, c-format +msgid "Failed to delete old credentials: %s" +msgstr "" + +#: lib/krb5/scache.c:597 +#, c-format +msgid "Failed to bind principal to cache %s" +msgstr "" + +#: lib/krb5/scache.c:639 +#, c-format +msgid "Failed to destroy cache %s: %s" +msgstr "" + +#: lib/krb5/scache.c:662 +msgid "Failed to store credential in scache" +msgstr "" + +#: lib/krb5/scache.c:671 +msgid "Failed to encode credential in scache" +msgstr "" + +#: lib/krb5/scache.c:693 +msgid "Failed to read credential in scache" +msgstr "" + +#: lib/krb5/scache.c:754 +#, c-format +msgid "Failed to add credential: %s" +msgstr "" + +#: lib/krb5/scache.c:773 +#: lib/krb5/scache.c:791 +#, c-format +msgid "Failed to add principal: %s" +msgstr "" + +#: lib/krb5/scache.c:828 +#, c-format +msgid "No principal for cache SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:836 +#, c-format +msgid "Principal data of wrong type for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:846 +#, c-format +msgid "Principal not set for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:891 +#, c-format +msgid "Iterating a invalid scache %s" +msgstr "" + +#: lib/krb5/scache.c:982 +#: lib/krb5/scache.c:1071 +#, c-format +msgid "scache Database failed: %s" +msgstr "" + +#: lib/krb5/scache.c:1001 +#, c-format +msgid "credential of wrong type for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:1079 +#, c-format +msgid "Credential of wrong type for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:1117 +msgid "failed to delete scache credental" +msgstr "" + +#: lib/krb5/scache.c:1244 +#, c-format +msgid "Database failed: %s" +msgstr "" + +#: lib/krb5/scache.c:1285 +#, c-format +msgid "Can't handle cross database credential move: %s -> %s" +msgstr "" + +#: lib/krb5/scache.c:1309 +#, c-format +msgid "Failed to delete old cache: %d" +msgstr "" + +#: lib/krb5/scache.c:1324 +#, c-format +msgid "Failed to update new cache: %d" +msgstr "" + +#: lib/krb5/scache.c:1373 +#, c-format +msgid "Trying to set a invalid cache as default %s" +msgstr "" + +#: lib/krb5/scache.c:1383 +msgid "Failed to set name of default cache" +msgstr "" + +#: lib/krb5/scache.c:1393 +msgid "Failed to update default cache" +msgstr "" + +#: lib/krb5/send_to_kdc.c:351 +#, c-format +msgid "Plugin send_to_kdc failed to lookup with error: %d" +msgstr "" + +#: lib/krb5/send_to_kdc.c:635 +#, c-format +msgid "unable to reach any KDC in realm %s" +msgstr "" + +#: lib/krb5/ticket.c:141 +#, c-format +msgid "Authorization data nested deeper then %d levels, stop searching" +msgstr "" + +#: lib/krb5/ticket.c:172 +#, c-format +msgid "Failed to decode IF_RELEVANT with %d" +msgstr "" + +#: lib/krb5/ticket.c:194 +#, c-format +msgid "Failed to decode AD_KDCIssued with %d" +msgstr "" + +#: lib/krb5/ticket.c:241 +msgid "" +"Authorization data contains AND-OR element that is unknown to the application" +msgstr "" + +#: lib/krb5/ticket.c:250 +#, c-format +msgid "Authorization data contains unknown type (%d) " +msgstr "" + +#: lib/krb5/ticket.c:287 +msgid "Ticket have not authorization data" +msgstr "" + +#: lib/krb5/ticket.c:297 +#, c-format +msgid "Ticket have not authorization data of type %d" +msgstr "" + +#: lib/krb5/transited.c:457 +#: lib/krb5/transited.c:490 +#, c-format +msgid "no transit allowed through realm %s from %s to %s" +msgstr "" + +#: lib/krb5/v4_glue.c:153 +#: lib/krb5/v4_glue.c:299 +msgid "Failed getting the krb4 credentials cache name" +msgstr "" + +#: lib/krb5/v4_glue.c:162 +#, c-format +msgid "Failed opening krb4 credential cache %s: %s" +msgstr "" + +#: lib/krb5/v4_glue.c:172 +#, c-format +msgid "krb4 credential cache %s is not a file" +msgstr "" + +#: lib/krb5/v4_glue.c:187 +#, c-format +msgid "Failed to lock credentail cache %s" +msgstr "" + +#: lib/krb5/v4_glue.c:199 +#, c-format +msgid "Failed to truncate krb4 cc %s" +msgstr "" + +#: lib/krb5/v4_glue.c:307 +#, c-format +msgid "Failed removing the cache %s with error %s" +msgstr "" + +#: lib/krb5/v4_glue.c:457 +#: lib/krb5/v4_glue.c:517 +#: lib/krb5/v4_glue.c:570 +msgid "Failed to encode kerberos 4 ticket" +msgstr "" + +#: lib/krb5/v4_glue.c:788 +msgid "Failed reading v4 pvno" +msgstr "" + +#: lib/krb5/v4_glue.c:794 +msgid "Failed v4 pvno not 4" +msgstr "" + +#: lib/krb5/v4_glue.c:800 +msgid "Failed readin v4 type" +msgstr "" + +#: lib/krb5/v4_glue.c:810 +msgid "Not a valid v4 request type" +msgstr "" + +#: lib/krb5/v4_glue.c:823 +msgid "Failed reading v4 ticket" +msgstr "" + +#: lib/krb5/v4_glue.c:839 +msgid "Failed reading v4 authenticator" +msgstr "" + +#: lib/krb5/v4_glue.c:874 +msgid "v4 principal mismatch" +msgstr "" + +#: lib/krb5/v4_glue.c:881 +msgid "v4 bad address in ticket" +msgstr "" + +#: lib/krb5/v4_glue.c:889 +msgid "v4 clock skew" +msgstr "" + +#: lib/krb5/v4_glue.c:900 +msgid "v4 clock skew for expiration" +msgstr "" + +#: lib/krb5/v4_glue.c:906 +msgid "v4 ticket expired" +msgstr "" + +#: lib/krb5/verify_init.c:228 +msgid "Validation credentials and client doesn't match" +msgstr "" diff --git a/crypto/heimdal/po/heimdal_krb5/sv_SE.mo b/crypto/heimdal/po/heimdal_krb5/sv_SE.mo new file mode 100644 index 0000000000000000000000000000000000000000..c6222c5eba2bf6adc41d670bd152fe0636b110ed GIT binary patch literal 1229 zc${^T&rcIU6vr2-qBSvUG#-@rFg8HUVz(&@i#0)n&;X%<>QOW8ylw|)XUfbJ!T2wD zG@iV{O|Klh_GUbL^dIoxzu?>MDnF`|y#36N@0*#o^Zju(_uiv+k>VDGqqsux%}d+m zAhgGbpKJ}2F-Harzo(IHAEZn z)@-A<#Dqi+PG_p-OQA%f5^s=11shTvQ%TJ@%-5=EI>efHB_@(;ZKn(!gDtU3IubGy zAxsn`pG?*s0Hd2igR&*6$hFhS|0KjrO5F@WcOB>!#29O{=PCWCG-zo9w#}#}(2Xr@ zIfiTz}0*g8NUpk@f33gnVti?k^Z*j&l5` z%wY(nVsXYV&iciN5R}5{>3hYXSR|ppfjhzu>Vh%^L0B%Qx>aVKUpGuy$(%MJtm++v zWo^`US6B!0*3lw|M~_LWqArWjuOo{?*nEv#*mi!cy0&;!Mle;(FKFfH`TRP)a|jN1 z-TjVaLd`*weuG6wJ}&Luh$r0!APN>_0_ zE<52r(q;ZTrjz6&HsC;Y+Je1(1Fhbn0oglH(P, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-09-12 20:06+0100\n" +"PO-Revision-Date: 2008-09-27 11:06+0200\n" +"Last-Translator: Love Hörnquist Åstrand \n" +"Language-Team: Swedish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2008-09-27 08:56+0000\n" +"X-Generator: Launchpad (build Unknown)\n" + +#: lib/krb5/acache.c:119 +#, c-format +msgid "Failed to load API cache module %s" +msgstr "Kunde inte ladda API cache modulen %s" + +#: lib/krb5/acache.c:128 +#, c-format +msgid "Failed to find cc_initializein %s: %s" +msgstr "Kunde inte hitta cc_initialize i %s: %s" + +#: lib/krb5/acache.c:138 +msgid "no support for shared object" +msgstr "Har inte stöd för delad objekt" + +#: lib/krb5/acache.c:263 +#: lib/krb5/acache.c:981 +#: lib/krb5/acl.c:87 +#: lib/krb5/addr_families.c:1104 +#: lib/krb5/addr_families.c:1130 +#: lib/krb5/addr_families.c:1371 +#: lib/krb5/addr_families.c:1414 +#: lib/krb5/addr_families.c:1421 +#: lib/krb5/auth_context.c:46 +#: lib/krb5/auth_context.c:52 +#: lib/krb5/auth_context.c:244 +#: lib/krb5/auth_context.c:255 +#: lib/krb5/auth_context.c:455 +#: lib/krb5/build_auth.c:65 +#: lib/krb5/build_auth.c:84 +#: lib/krb5/build_auth.c:91 +#: lib/krb5/build_auth.c:121 +#: lib/krb5/cache.c:77 +#: lib/krb5/cache.c:104 +#: lib/krb5/cache.c:288 +#: lib/krb5/cache.c:361 +#: lib/krb5/cache.c:372 +#: lib/krb5/cache.c:493 +#: lib/krb5/cache.c:540 +#: lib/krb5/cache.c:912 +#: lib/krb5/cache.c:973 +#: lib/krb5/context.c:71 +#: lib/krb5/context.c:570 +#: lib/krb5/context.c:612 +#: lib/krb5/context.c:650 +#: lib/krb5/context.c:803 +#: lib/krb5/context.c:885 +#: lib/krb5/convert_creds.c:100 +#: lib/krb5/copy_host_realm.c:65 +#: lib/krb5/copy_host_realm.c:74 +#: lib/krb5/creds.c:160 +#: lib/krb5/crypto.c:361 +#: lib/krb5/crypto.c:443 +#: lib/krb5/crypto.c:457 +#: lib/krb5/crypto.c:505 +#: lib/krb5/crypto.c:583 +#: lib/krb5/crypto.c:599 +#: lib/krb5/crypto.c:623 +#: lib/krb5/crypto.c:671 +#: lib/krb5/crypto.c:677 +#: lib/krb5/crypto.c:937 +#: lib/krb5/crypto.c:1193 +#: lib/krb5/crypto.c:1270 +#: lib/krb5/crypto.c:1303 +#: lib/krb5/crypto.c:1554 +#: lib/krb5/crypto.c:1741 +#: lib/krb5/crypto.c:2644 +#: lib/krb5/crypto.c:2813 +#: lib/krb5/crypto.c:2877 +#: lib/krb5/crypto.c:2939 +#: lib/krb5/crypto.c:2991 +#: lib/krb5/crypto.c:3033 +#: lib/krb5/crypto.c:3062 +#: lib/krb5/crypto.c:3095 +#: lib/krb5/crypto.c:3124 +#: lib/krb5/crypto.c:3139 +#: lib/krb5/crypto.c:3821 +#: lib/krb5/crypto.c:3827 +#: lib/krb5/crypto.c:3844 +#: lib/krb5/crypto.c:3852 +#: lib/krb5/crypto.c:3858 +#: lib/krb5/crypto.c:3954 +#: lib/krb5/crypto.c:3974 +#: lib/krb5/crypto.c:4157 +#: lib/krb5/crypto.c:4169 +#: lib/krb5/crypto.c:4175 +#: lib/krb5/crypto.c:4349 +#: lib/krb5/crypto.c:4433 +#: lib/krb5/crypto.c:4460 +#: lib/krb5/crypto.c:4516 +#: lib/krb5/crypto.c:4621 +#: lib/krb5/crypto.c:4645 +#: lib/krb5/crypto.c:4696 +#: lib/krb5/digest.c:56 +#: lib/krb5/digest.c:108 +#: lib/krb5/digest.c:123 +#: lib/krb5/digest.c:140 +#: lib/krb5/digest.c:145 +#: lib/krb5/digest.c:171 +#: lib/krb5/digest.c:195 +#: lib/krb5/digest.c:221 +#: lib/krb5/digest.c:226 +#: lib/krb5/digest.c:476 +#: lib/krb5/digest.c:481 +#: lib/krb5/digest.c:501 +#: lib/krb5/digest.c:518 +#: lib/krb5/digest.c:535 +#: lib/krb5/digest.c:540 +#: lib/krb5/digest.c:564 +#: lib/krb5/digest.c:581 +#: lib/krb5/digest.c:586 +#: lib/krb5/digest.c:606 +#: lib/krb5/digest.c:611 +#: lib/krb5/digest.c:630 +#: lib/krb5/digest.c:635 +#: lib/krb5/digest.c:656 +#: lib/krb5/digest.c:661 +#: lib/krb5/digest.c:680 +#: lib/krb5/digest.c:685 +#: lib/krb5/digest.c:700 +#: lib/krb5/digest.c:805 +#: lib/krb5/digest.c:845 +#: lib/krb5/digest.c:1063 +#: lib/krb5/digest.c:1076 +#: lib/krb5/digest.c:1089 +#: lib/krb5/digest.c:1104 +#: lib/krb5/digest.c:1119 +#: lib/krb5/digest.c:1134 +#: lib/krb5/digest.c:1139 +#: lib/krb5/expand_hostname.c:46 +#: lib/krb5/expand_hostname.c:81 +#: lib/krb5/fcache.c:150 +#: lib/krb5/fcache.c:186 +#: lib/krb5/fcache.c:193 +#: lib/krb5/fcache.c:309 +#: lib/krb5/fcache.c:316 +#: lib/krb5/fcache.c:682 +#: lib/krb5/fcache.c:802 +#: lib/krb5/generate_subkey.c:56 +#: lib/krb5/get_addrs.c:70 +#: lib/krb5/get_addrs.c:139 +#: lib/krb5/get_cred.c:102 +#: lib/krb5/get_cred.c:156 +#: lib/krb5/get_cred.c:176 +#: lib/krb5/get_cred.c:192 +#: lib/krb5/get_cred.c:202 +#: lib/krb5/get_cred.c:208 +#: lib/krb5/get_cred.c:218 +#: lib/krb5/get_cred.c:224 +#: lib/krb5/get_cred.c:232 +#: lib/krb5/get_cred.c:641 +#: lib/krb5/get_cred.c:714 +#: lib/krb5/get_cred.c:785 +#: lib/krb5/get_cred.c:847 +#: lib/krb5/get_cred.c:1083 +#: lib/krb5/get_cred.c:1172 +#: lib/krb5/get_cred.c:1236 +#: lib/krb5/get_cred.c:1243 +#: lib/krb5/get_cred.c:1281 +#: lib/krb5/get_default_realm.c:80 +#: lib/krb5/get_for_creds.c:55 +#: lib/krb5/get_for_creds.c:273 +#: lib/krb5/get_for_creds.c:286 +#: lib/krb5/get_for_creds.c:299 +#: lib/krb5/get_for_creds.c:306 +#: lib/krb5/get_for_creds.c:351 +#: lib/krb5/get_host_realm.c:195 +#: lib/krb5/get_host_realm.c:202 +#: lib/krb5/get_in_tkt.c:63 +#: lib/krb5/get_in_tkt.c:450 +#: lib/krb5/get_in_tkt.c:630 +#: lib/krb5/get_in_tkt.c:677 +#: lib/krb5/get_in_tkt.c:683 +#: lib/krb5/get_in_tkt.c:700 +#: lib/krb5/get_in_tkt.c:713 +#: lib/krb5/get_in_tkt.c:736 +#: lib/krb5/get_in_tkt.c:761 +#: lib/krb5/get_in_tkt.c:800 +#: lib/krb5/init_creds.c:55 +#: lib/krb5/init_creds.c:61 +#: lib/krb5/init_creds.c:80 +#: lib/krb5/init_creds.c:88 +#: lib/krb5/init_creds.c:385 +#: lib/krb5/init_creds_pw.c:339 +#: lib/krb5/init_creds_pw.c:351 +#: lib/krb5/init_creds_pw.c:509 +#: lib/krb5/init_creds_pw.c:561 +#: lib/krb5/init_creds_pw.c:567 +#: lib/krb5/init_creds_pw.c:586 +#: lib/krb5/init_creds_pw.c:599 +#: lib/krb5/init_creds_pw.c:622 +#: lib/krb5/init_creds_pw.c:1095 +#: lib/krb5/kcm.c:176 +#: lib/krb5/kcm.c:210 +#: lib/krb5/kcm.c:219 +#: lib/krb5/keyblock.c:127 +#: lib/krb5/keytab.c:58 +#: lib/krb5/keytab.c:109 +#: lib/krb5/keytab.c:270 +#: lib/krb5/keytab_any.c:76 +#: lib/krb5/keytab_any.c:137 +#: lib/krb5/keytab_file.c:65 +#: lib/krb5/keytab_file.c:86 +#: lib/krb5/keytab_file.c:195 +#: lib/krb5/keytab_file.c:227 +#: lib/krb5/keytab_file.c:298 +#: lib/krb5/keytab_file.c:304 +#: lib/krb5/keytab_file.c:395 +#: lib/krb5/keytab_file.c:611 +#: lib/krb5/keytab_keyfile.c:94 +#: lib/krb5/keytab_keyfile.c:121 +#: lib/krb5/keytab_keyfile.c:139 +#: lib/krb5/keytab_keyfile.c:155 +#: lib/krb5/keytab_keyfile.c:264 +#: lib/krb5/keytab_keyfile.c:334 +#: lib/krb5/keytab_memory.c:79 +#: lib/krb5/keytab_memory.c:87 +#: lib/krb5/keytab_memory.c:182 +#: lib/krb5/krbhst.c:102 +#: lib/krb5/krbhst.c:254 +#: lib/krb5/log.c:125 +#: lib/krb5/log.c:132 +#: lib/krb5/log.c:151 +#: lib/krb5/log.c:194 +#: lib/krb5/log.c:250 +#: lib/krb5/log.c:302 +#: lib/krb5/mcache.c:123 +#: lib/krb5/mcache.c:143 +#: lib/krb5/mcache.c:243 +#: lib/krb5/mcache.c:355 +#: lib/krb5/mcache.c:447 +#: lib/krb5/mk_priv.c:142 +#: lib/krb5/mk_rep.c:73 +#: lib/krb5/pac.c:96 +#: lib/krb5/pac.c:103 +#: lib/krb5/pac.c:127 +#: lib/krb5/pac.c:237 +#: lib/krb5/pac.c:244 +#: lib/krb5/pac.c:252 +#: lib/krb5/pac.c:275 +#: lib/krb5/pac.c:302 +#: lib/krb5/pac.c:359 +#: lib/krb5/pac.c:384 +#: lib/krb5/pac.c:428 +#: lib/krb5/pac.c:440 +#: lib/krb5/pac.c:543 +#: lib/krb5/pac.c:572 +#: lib/krb5/pac.c:590 +#: lib/krb5/pac.c:610 +#: lib/krb5/pac.c:657 +#: lib/krb5/pac.c:821 +#: lib/krb5/pac.c:894 +#: lib/krb5/pac.c:932 +#: lib/krb5/pac.c:940 +#: lib/krb5/pac.c:980 +#: lib/krb5/pac.c:1011 +#: lib/krb5/pac.c:1018 +#: lib/krb5/pac.c:1025 +#: lib/krb5/padata.c:56 +#: lib/krb5/pkinit.c:361 +#: lib/krb5/pkinit.c:617 +#: lib/krb5/pkinit.c:812 +#: lib/krb5/pkinit.c:877 +#: lib/krb5/pkinit.c:1059 +#: lib/krb5/pkinit.c:1250 +#: lib/krb5/pkinit.c:1268 +#: lib/krb5/pkinit.c:1531 +#: lib/krb5/pkinit.c:1751 +#: lib/krb5/pkinit.c:1897 +#: lib/krb5/pkinit.c:1938 +#: lib/krb5/pkinit.c:2057 +#: lib/krb5/pkinit.c:2129 +#: lib/krb5/principal.c:181 +#: lib/krb5/principal.c:190 +#: lib/krb5/principal.c:225 +#: lib/krb5/principal.c:257 +#: lib/krb5/principal.c:281 +#: lib/krb5/principal.c:292 +#: lib/krb5/principal.c:462 +#: lib/krb5/principal.c:538 +#: lib/krb5/principal.c:571 +#: lib/krb5/principal.c:578 +#: lib/krb5/principal.c:627 +#: lib/krb5/principal.c:636 +#: lib/krb5/principal.c:713 +#: lib/krb5/principal.c:719 +#: lib/krb5/principal.c:965 +#: lib/krb5/rd_cred.c:252 +#: lib/krb5/rd_cred.c:264 +#: lib/krb5/rd_rep.c:82 +#: lib/krb5/rd_req.c:536 +#: lib/krb5/rd_req.c:620 +#: lib/krb5/rd_safe.c:197 +#: lib/krb5/recvauth.c:141 +#: lib/krb5/replay.c:51 +#: lib/krb5/replay.c:72 +#: lib/krb5/replay.c:299 +#: lib/krb5/replay.c:311 +#: lib/krb5/scache.c:347 +#: lib/krb5/scache.c:488 +#: lib/krb5/scache.c:538 +#: lib/krb5/scache.c:653 +#: lib/krb5/scache.c:683 +#: lib/krb5/scache.c:877 +#: lib/krb5/scache.c:899 +#: lib/krb5/scache.c:907 +#: lib/krb5/scache.c:1149 +#: lib/krb5/scache.c:1163 +#: lib/krb5/scache.c:1172 +#: lib/krb5/scache.c:1183 +#: lib/krb5/scache.c:1357 +#: lib/krb5/send_to_kdc.c:493 +#: lib/krb5/send_to_kdc.c:515 +#: lib/krb5/set_default_realm.c:50 +#: lib/krb5/set_default_realm.c:57 +#: lib/krb5/ticket.c:61 +#: lib/krb5/ticket.c:140 +#: lib/krb5/transited.c:92 +#: lib/krb5/transited.c:101 +#: lib/krb5/transited.c:118 +#: lib/krb5/transited.c:127 +#: lib/krb5/transited.c:194 +#: lib/krb5/transited.c:209 +#: lib/krb5/transited.c:296 +#: lib/krb5/transited.c:305 +#: lib/krb5/transited.c:316 +#: lib/krb5/transited.c:325 +#: lib/krb5/v4_glue.c:427 +#: lib/krb5/v4_glue.c:484 +#: lib/krb5/v4_glue.c:543 +#: lib/krb5/v4_glue.c:599 +#: lib/krb5/v4_glue.c:778 +#: lib/krb5/v4_glue.c:851 +#: lib/krb5/verify_user.c:107 +msgid "malloc: out of memory" +msgstr "Slut på minne" + +#: lib/krb5/acache.c:631 +#: lib/krb5/acache.c:665 +#: lib/krb5/acache.c:692 +#: lib/krb5/acache.c:758 +#: lib/krb5/acache.c:995 +msgid "No API credential found" +msgstr "" + +#: lib/krb5/acache.c:811 +#, c-format +msgid "Can't find credential %s in cache" +msgstr "Kan inte hitta biljetten %s i cachen" + +#: lib/krb5/acl.c:103 +#, c-format +msgid "Unknown format specifier %c while parsing ACL" +msgstr "Okänd format specifiserare %c hittat i access kontroll listan" + +#: lib/krb5/acl.c:225 +#: lib/krb5/acl.c:294 +msgid "ACL did not match" +msgstr "" + +#: lib/krb5/acl.c:264 +#: lib/krb5/fcache.c:375 +#: lib/krb5/keytab_file.c:542 +#, c-format +msgid "open(%s): %s" +msgstr "" + +#: lib/krb5/addr_families.c:206 +#, c-format +msgid "IPv4 prefix too large (%ld)" +msgstr "IPv4 prefix är för lång (%ld)" + +#: lib/krb5/addr_families.c:400 +#, c-format +msgid "IPv6 prefix too large (%ld)" +msgstr "IPv6 prefix är för lång (%ld)" + +#: lib/krb5/addr_families.c:406 +msgid "IPv6 addr bad length" +msgstr "IPv6 addressen har fel längd" + +#: lib/krb5/addr_families.c:793 +#: lib/krb5/addr_families.c:821 +#: lib/krb5/addr_families.c:976 +#: lib/krb5/addr_families.c:1010 +#: lib/krb5/addr_families.c:1174 +#: lib/krb5/addr_families.c:1183 +#, c-format +msgid "Address family %d not supported" +msgstr "Address familjen %d stöds inte" + +#: lib/krb5/addr_families.c:860 +#, c-format +msgid "Address type %d not supported" +msgstr "Address typen %d stöds inte" + +#: lib/krb5/addr_families.c:868 +#, c-format +msgid "Can't convert address type %d to sockaddr" +msgstr "Kan inte konvertera address typen %d till en sockaddr" + +#: lib/krb5/addr_families.c:1482 +#, c-format +msgid "Address family %d doesn't support address mask operation" +msgstr "Address familjen %d stödjer inte adress mask functionen" + +#: lib/krb5/cache.c:64 +#, c-format +msgid "cache type %s already exists" +msgstr "cache typen %s finns redan" + +#: lib/krb5/cache.c:173 +#, c-format +msgid "unknown ccache type %s" +msgstr "okänd cache typ %s" + +#: lib/krb5/cache.c:965 +#, c-format +msgid "Credential cache type %s doesn't support iterations over caches" +msgstr "" + +#: lib/krb5/cache.c:1078 +#, c-format +msgid "Principal %s not found in a credential cache" +msgstr "" + +#: lib/krb5/cache.c:1111 +msgid "Moving credentials between diffrent types not yet supported" +msgstr "Flytta biljeter mellan olika typer av cacher stöds inte än" + +#: lib/krb5/changepw.c:315 +#, c-format +msgid "Message too large from %s" +msgstr "Meddelandet från %s är för stort" + +#: lib/krb5/changepw.c:665 +#, c-format +msgid "Unable to reach any changepw server in realm %s" +msgstr "Kan inte nå någon lösenordsbytarserver i realm %s" + +#: lib/krb5/convert_creds.c:136 +#, c-format +msgid "converting credentials: %s" +msgstr "" + +#: lib/krb5/crypto.c:592 +#: lib/krb5/crypto.c:607 +msgid "Password not an UCS2 string" +msgstr "Lösenordet är inte en UCS2 sträng" + +#: lib/krb5/crypto.c:960 +#: lib/krb5/crypto.c:1074 +#: lib/krb5/crypto.c:1130 +#: lib/krb5/crypto.c:1163 +#: lib/krb5/crypto.c:2637 +#: lib/krb5/crypto.c:2675 +#: lib/krb5/crypto.c:2690 +#: lib/krb5/crypto.c:3920 +#: lib/krb5/crypto.c:3984 +#: lib/krb5/crypto.c:4097 +#: lib/krb5/crypto.c:4124 +#: lib/krb5/crypto.c:4148 +#: lib/krb5/crypto.c:4299 +#: lib/krb5/crypto.c:4341 +#: lib/krb5/crypto.c:4508 +#: lib/krb5/crypto.c:4568 +#, c-format +msgid "encryption type %d not supported" +msgstr "" + +#: lib/krb5/crypto.c:971 +#, c-format +msgid "salttype %s not supported" +msgstr "" + +#: lib/krb5/crypto.c:1083 +#, c-format +msgid "salt type %d not supported" +msgstr "" + +#: lib/krb5/crypto.c:1490 +#: lib/krb5/crypto.c:1825 +#: lib/krb5/crypto.c:1857 +#: lib/krb5/crypto.c:1917 +#: lib/krb5/crypto.c:1965 +#: lib/krb5/crypto.c:1981 +#: lib/krb5/crypto.c:1996 +#: lib/krb5/crypto.c:2011 +#: lib/krb5/crypto.c:2735 +#: lib/krb5/crypto.c:2748 +#, c-format +msgid "checksum type %d not supported" +msgstr "" + +#: lib/krb5/crypto.c:1777 +#: lib/krb5/crypto.c:1868 +#, c-format +msgid "Checksum type %s is keyed but no crypto context (key) was passed in" +msgstr "" + +#: lib/krb5/crypto.c:1947 +msgid "checksum type not found" +msgstr "" + +#: lib/krb5/crypto.c:2347 +msgid "malloc: out memory" +msgstr "" + +#: lib/krb5/crypto.c:2662 +#, c-format +msgid "encryption type %s not supported" +msgstr "" + +#: lib/krb5/crypto.c:2696 +#, c-format +msgid "encryption type %s is disabled" +msgstr "" + +#: lib/krb5/crypto.c:2754 +#, c-format +msgid "checksum type %s is disabled" +msgstr "" + +#: lib/krb5/crypto.c:2979 +msgid "Encrypted data shorter then checksum + confunder" +msgstr "" + +#: lib/krb5/crypto.c:3589 +msgid "Checksum larger then input buffer" +msgstr "" + +#: lib/krb5/crypto.c:3876 +#, c-format +msgid "derive_key() called with unknown keytype (%u)" +msgstr "" + +#: lib/krb5/crypto.c:4305 +#, c-format +msgid "" +"encryption key %s needs %d bytes of random to make an encryption key out of " +"it" +msgstr "" + +#: lib/krb5/crypto.c:4397 +msgid "Failed to encode KRB5PrincipalName" +msgstr "" + +#: lib/krb5/crypto.c:4492 +msgid "KDF not supported" +msgstr "" + +#: lib/krb5/crypto.c:4500 +msgid "kdf params not NULL or the NULL-type" +msgstr "" + +#: lib/krb5/digest.c:86 +msgid "server channel binding already set" +msgstr "" + +#: lib/krb5/digest.c:166 +msgid "nonce already set" +msgstr "" + +#: lib/krb5/digest.c:216 +msgid "identifier already set" +msgstr "" + +#: lib/krb5/digest.c:285 +msgid "Failed to encode digest inner request" +msgstr "" + +#: lib/krb5/digest.c:306 +msgid "Digest failed to get local subkey" +msgstr "" + +#: lib/krb5/digest.c:328 +msgid "Failed to encode DigestREQest" +msgstr "" + +#: lib/krb5/digest.c:341 +msgid "Failed to parse digest response" +msgstr "" + +#: lib/krb5/digest.c:363 +msgid "Digest reply have no remote subkey" +msgstr "" + +#: lib/krb5/digest.c:383 +msgid "Failed to decode digest inner reply" +msgstr "" + +#: lib/krb5/digest.c:423 +msgid "Type missing from init req" +msgstr "" + +#: lib/krb5/digest.c:437 +#: lib/krb5/digest.c:900 +#, c-format +msgid "Digest init error: %s" +msgstr "" + +#: lib/krb5/digest.c:445 +msgid "digest reply not an initReply" +msgstr "" + +#: lib/krb5/digest.c:452 +#: lib/krb5/digest.c:915 +msgid "Failed to copy initReply" +msgstr "" + +#: lib/krb5/digest.c:470 +msgid "clientNonce already set" +msgstr "" + +#: lib/krb5/digest.c:496 +msgid "digest already set" +msgstr "" + +#: lib/krb5/digest.c:557 +msgid "authentication_user already set" +msgstr "" + +#: lib/krb5/digest.c:601 +msgid "method already set" +msgstr "" + +#: lib/krb5/digest.c:625 +msgid "uri already set" +msgstr "" + +#: lib/krb5/digest.c:650 +msgid "nonceCount already set" +msgstr "" + +#: lib/krb5/digest.c:725 +msgid "Type missing from req" +msgstr "" + +#: lib/krb5/digest.c:742 +#, c-format +msgid "Digest response error: %s" +msgstr "" + +#: lib/krb5/digest.c:749 +msgid "digest reply not an DigestResponse" +msgstr "" + +#: lib/krb5/digest.c:757 +msgid "Failed to copy initReply," +msgstr "" + +#: lib/krb5/digest.c:908 +msgid "ntlm reply not an initReply" +msgstr "" + +#: lib/krb5/digest.c:1022 +#, c-format +msgid "NTLM response error: %s" +msgstr "" + +#: lib/krb5/digest.c:1030 +msgid "NTLM reply not an NTLMResponse" +msgstr "" + +#: lib/krb5/digest.c:1037 +msgid "Failed to copy NTLMResponse" +msgstr "" + +#: lib/krb5/digest.c:1161 +msgid "no ntlm session key" +msgstr "" + +#: lib/krb5/fcache.c:97 +#, c-format +msgid "timed out locking cache file %s" +msgstr "" + +#: lib/krb5/fcache.c:102 +#, c-format +msgid "error locking cache file %s: %s" +msgstr "" + +#: lib/krb5/fcache.c:134 +#, c-format +msgid "Failed to unlock file: %s" +msgstr "" + +#: lib/krb5/fcache.c:159 +msgid "Failed to write FILE credential data" +msgstr "" + +#: lib/krb5/fcache.c:322 +#, c-format +msgid "mkstemp %s failed" +msgstr "" + +#: lib/krb5/fcache.c:437 +#: lib/krb5/fcache.c:491 +#, c-format +msgid "close %s: %s" +msgstr "" + +#: lib/krb5/fcache.c:525 +#, c-format +msgid "Empty credential cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:528 +#, c-format +msgid "Error reading pvno in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:535 +#, c-format +msgid "Bad version number in credential cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:557 +#, c-format +msgid "Error reading tag length in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:569 +#, c-format +msgid "Error reading dtag in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:578 +#, c-format +msgid "Error reading dlength in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:589 +#, c-format +msgid "Error reading kdc_sec in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:598 +#, c-format +msgid "Error reading kdc_usec in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:610 +#, c-format +msgid "Error reading unknown tag in cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:629 +#, c-format +msgid "Unknown version number (%d) in credential cache file: %s" +msgstr "" + +#: lib/krb5/fcache.c:856 +#, c-format +msgid "Rename of file from %s to %s failed: %s" +msgstr "" + +#: lib/krb5/fcache.c:883 +msgid "Failed to write data from one file credential cache to the other" +msgstr "" + +#: lib/krb5/fcache.c:891 +msgid "Failed to read data from one file credential cache to the other" +msgstr "" + +#: lib/krb5/get_addrs.c:123 +msgid "no addresses found" +msgstr "" + +#: lib/krb5/get_cred.c:672 +#, c-format +msgid "Matching credential (%s) not found" +msgstr "" + +#: lib/krb5/get_cred.c:947 +msgid "Got back an non krbtgt ticket referrals" +msgstr "" + +#: lib/krb5/get_cred.c:967 +#, c-format +msgid "Referral from %s loops back to realm %s" +msgstr "" + +#: lib/krb5/get_default_principal.c:89 +msgid "unable to figure out current principal" +msgstr "" + +#: lib/krb5/get_for_creds.c:242 +#, c-format +msgid "resolving host %s failed: %s" +msgstr "" + +#: lib/krb5/get_host_realm.c:210 +#, c-format +msgid "unable to find realm of host %s" +msgstr "" + +#: lib/krb5/get_host_realm.c:254 +#, c-format +msgid "Unable to find realm of host %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:112 +#, c-format +msgid "Referral EncryptedData wrong for realm %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:141 +#, c-format +msgid "server ref realm mismatch, requested realm %s got back %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:157 +msgid "tgt returned with wrong ref" +msgstr "" + +#: lib/krb5/get_in_tkt.c:163 +msgid "req princ no same as returned" +msgstr "" + +#: lib/krb5/get_in_tkt.c:174 +msgid "referred principal not same as requested" +msgstr "" + +#: lib/krb5/get_in_tkt.c:181 +msgid "Requested principal missing on AS-REQ" +msgstr "" + +#: lib/krb5/get_in_tkt.c:191 +msgid "Not same server principal returned as requested" +msgstr "" + +#: lib/krb5/get_in_tkt.c:233 +#, c-format +msgid "Failed to decode ClientCanonicalized from realm %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:261 +#, c-format +msgid "Failed to verify client canonicalized data from realm %s" +msgstr "" + +#: lib/krb5/get_in_tkt.c:274 +msgid "Requested name doesn't match in client referral" +msgstr "" + +#: lib/krb5/get_in_tkt.c:284 +msgid "Mapped name doesn't match in client referral" +msgstr "" + +#: lib/krb5/get_in_tkt.c:294 +msgid "Not same client principal returned as requested" +msgstr "" + +#: lib/krb5/get_in_tkt.c:478 +#, c-format +msgid "time skew (%d) larger than max (%d)" +msgstr "" + +#: lib/krb5/get_in_tkt.c:820 +#, c-format +msgid "pre-auth type %d not supported" +msgstr "" + +#: lib/krb5/init_creds.c:331 +#, c-format +msgid "%s on non extendable opt" +msgstr "" + +#: lib/krb5/init_creds_pw.c:466 +msgid "failed changing password" +msgstr "" + +#: lib/krb5/init_creds_pw.c:1038 +#: lib/krb5/init_creds_pw.c:1194 +#: lib/krb5/pkinit.c:2152 +msgid "no support for PKINIT compiled in" +msgstr "" + +#: lib/krb5/init_creds_pw.c:1201 +msgid "No usable pa data type" +msgstr "" + +#: lib/krb5/init_creds_pw.c:1328 +msgid "failed to decode METHOD DATA" +msgstr "" + +#: lib/krb5/kcm.c:195 +msgid "Failed to encode KCM request" +msgstr "" + +#: lib/krb5/keytab.c:51 +msgid "can't register cache type, prefix too long" +msgstr "" + +#: lib/krb5/keytab.c:102 +#, c-format +msgid "unknown keytab type %.*s" +msgstr "" + +#: lib/krb5/keytab.c:384 +#, c-format +msgid "Failed to find %s%s in keytab %s (%s)" +msgstr "" + +#: lib/krb5/keytab.c:451 +#, c-format +msgid "start_seq_get is not supported in the %s keytab type" +msgstr "" + +#: lib/krb5/keytab.c:473 +#, c-format +msgid "next_entry is not supported in the %s keytab" +msgstr "" + +#: lib/krb5/keytab.c:511 +#, c-format +msgid "Add is not supported in the %s keytab" +msgstr "" + +#: lib/krb5/keytab.c:531 +#, c-format +msgid "Remove is not supported in the %s keytab" +msgstr "" + +#: lib/krb5/keytab_any.c:90 +msgid "empty ANY: keytab" +msgstr "" + +#: lib/krb5/keytab_any.c:210 +#, c-format +msgid "failed to add entry to %s" +msgstr "" + +#: lib/krb5/keytab_any.c:234 +#, c-format +msgid "Failed to remove keytab entry from %s" +msgstr "" + +#: lib/krb5/keytab_file.c:144 +#: lib/krb5/keytab_file.c:152 +#, c-format +msgid "Cant read keyblock from file %s" +msgstr "" + +#: lib/krb5/keytab_file.c:168 +#: lib/krb5/keytab_file.c:175 +#, c-format +msgid "Cant store keyblock to file %s" +msgstr "" + +#: lib/krb5/keytab_file.c:202 +#, c-format +msgid "Failed decoding length of keytab principal in keytab file %s" +msgstr "" + +#: lib/krb5/keytab_file.c:212 +#, c-format +msgid "Keytab principal contains invalid length in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:220 +#, c-format +msgid "Can't read realm from keytab: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:235 +#, c-format +msgid "Can't read principal from keytab: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:249 +#, c-format +msgid "Can't read name-type from keytab: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:380 +#, c-format +msgid "keytab %s open failed: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:579 +#, c-format +msgid "%s: keytab is corrupted: %s" +msgstr "" + +#: lib/krb5/keytab_file.c:588 +#, c-format +msgid "Bad version in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:595 +#, c-format +msgid "failed reading tag from keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:617 +#, c-format +msgid "Failed storing principal in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:626 +#, c-format +msgid "Failed storing timpstamp in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:635 +#, c-format +msgid "Failed storing kvno in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:650 +#, c-format +msgid "Failed storing extended kvno in keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:662 +#, c-format +msgid "Failed converting keytab entry to memory block for keytab %s" +msgstr "" + +#: lib/krb5/keytab_file.c:688 +#, c-format +msgid "Failed writing keytab block in keytab %s: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:76 +#, c-format +msgid "Open ThisCell %s: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:84 +#, c-format +msgid "No cell in ThisCell file %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:105 +#, c-format +msgid "No realm in ThisCell file %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:210 +#, c-format +msgid "keytab afs keyfile open %s failed: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:322 +#, c-format +msgid "open keyfile(%s): %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:345 +#, c-format +msgid "seeking in keyfile: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:370 +msgid "Failed getting kvno from keyfile" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:376 +#: lib/krb5/keytab_keyfile.c:392 +#, c-format +msgid "Failed seeing in keyfile: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:401 +msgid "keytab keyfile failed new length" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:408 +#, c-format +msgid "seek to end: %s" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:415 +msgid "keytab keyfile failed store kvno" +msgstr "" + +#: lib/krb5/keytab_keyfile.c:426 +msgid "keytab keyfile failed to add key" +msgstr "" + +#: lib/krb5/krbhst.c:76 +#, c-format +msgid "unknown protocol `%s' to lookup" +msgstr "" + +#: lib/krb5/krbhst.c:547 +#, c-format +msgid "Locate plugin failed to lookup realm %s: %d" +msgstr "" + +#: lib/krb5/krbhst.c:843 +#, c-format +msgid "unknown krbhst type (%u)" +msgstr "" + +#: lib/krb5/krbhst.c:932 +#, c-format +msgid "No KDC found for realm %s" +msgstr "" + +#: lib/krb5/log.c:286 +#, c-format +msgid "failed to parse \"%s\"" +msgstr "" + +#: lib/krb5/log.c:311 +#, c-format +msgid "open(%s) logfile: %s" +msgstr "" + +#: lib/krb5/log.c:322 +#, c-format +msgid "fdopen(%s) logfile: %s" +msgstr "" + +#: lib/krb5/log.c:348 +#, c-format +msgid "unknown log type: %s" +msgstr "" + +#. Too few buffers +#: lib/krb5/pac.c:112 +msgid "PAC have too few buffer" +msgstr "" + +#: lib/krb5/pac.c:118 +#, c-format +msgid "PAC have wrong version %d" +msgstr "" + +#: lib/krb5/pac.c:150 +msgid "PAC out of allignment" +msgstr "" + +#: lib/krb5/pac.c:156 +msgid "PAC high offset set" +msgstr "" + +#: lib/krb5/pac.c:162 +msgid "PAC offset off end" +msgstr "" + +#: lib/krb5/pac.c:168 +#, c-format +msgid "PAC offset inside header: %lu %lu" +msgstr "" + +#: lib/krb5/pac.c:175 +msgid "PAC length off end" +msgstr "" + +#: lib/krb5/pac.c:184 +msgid "PAC have two server checksums" +msgstr "" + +#: lib/krb5/pac.c:192 +msgid "PAC have two KDC checksums" +msgstr "" + +#: lib/krb5/pac.c:200 +msgid "PAC have two logon names" +msgstr "" + +#: lib/krb5/pkinit.c:118 +#, c-format +msgid "PKINIT: parsing BN failed %s" +msgstr "" + +#: lib/krb5/pkinit.c:542 +#, c-format +msgid "Failed encoding AuthPackWin: %d" +msgstr "" + +#: lib/krb5/pkinit.c:565 +#, c-format +msgid "Failed encoding AuthPack: %d" +msgstr "" + +#: lib/krb5/pkinit.c:586 +msgid "ContentInfo wrapping of signedData failed" +msgstr "" + +#: lib/krb5/pkinit.c:625 +msgid "pk-init: failed to build trustedCertifiers" +msgstr "" + +#: lib/krb5/pkinit.c:796 +#: lib/krb5/pkinit.c:844 +msgid "PKINIT decoding reply key failed" +msgstr "" + +#: lib/krb5/pkinit.c:803 +msgid "PKINIT enckey nonce is wrong" +msgstr "" + +#: lib/krb5/pkinit.c:820 +#: lib/krb5/pkinit.c:885 +msgid "PKINIT failed copying reply key" +msgstr "" + +#: lib/krb5/pkinit.c:908 +msgid "No PK-INIT KDC EKU in kdc certificate" +msgstr "" + +#: lib/krb5/pkinit.c:922 +msgid "Failed to find the PK-INIT subjectAltName in the KDC certificate" +msgstr "" + +#: lib/krb5/pkinit.c:938 +msgid "Failed to decode the PK-INIT subjectAltName in the KDC certificate" +msgstr "" + +#: lib/krb5/pkinit.c:952 +msgid "KDC have wrong realm name in the certificate" +msgstr "" + +#: lib/krb5/pkinit.c:974 +msgid "Address mismatch in the KDC certificate" +msgstr "" + +#: lib/krb5/pkinit.c:1001 +#: lib/krb5/pkinit.c:1048 +#: lib/krb5/pkinit.c:1149 +msgid "PKINIT: Invalid content type" +msgstr "" + +#: lib/krb5/pkinit.c:1171 +msgid "pkinit - dh reply contains wrong oid" +msgstr "" + +#: lib/krb5/pkinit.c:1182 +msgid "pkinit - failed to decode KDC DH Key Info" +msgstr "" + +#: lib/krb5/pkinit.c:1190 +msgid "PKINIT: DH nonce is wrong" +msgstr "" + +#: lib/krb5/pkinit.c:1198 +msgid "pkinit; got key expiration without server nonce" +msgstr "" + +#: lib/krb5/pkinit.c:1205 +msgid "pkinit; got DH reuse but no client nonce" +msgstr "" + +#: lib/krb5/pkinit.c:1213 +msgid "pkinit: got server nonce without key expiration" +msgstr "" + +#: lib/krb5/pkinit.c:1229 +msgid "pkinit: can't decode without key expiration" +msgstr "" + +#: lib/krb5/pkinit.c:1260 +msgid "PKINIT: Can't compute Diffie-Hellman key" +msgstr "" + +#: lib/krb5/pkinit.c:1279 +msgid "PKINIT: can't create key from DH key" +msgstr "" + +#: lib/krb5/pkinit.c:1325 +msgid "PKINIT: wrong padata recv" +msgstr "" + +#: lib/krb5/pkinit.c:1335 +msgid "Failed to decode pkinit AS rep" +msgstr "" + +#: lib/krb5/pkinit.c:1349 +msgid "PKINIT: -27 reply invalid content type" +msgstr "" + +#: lib/krb5/pkinit.c:1358 +#: lib/krb5/pkinit.c:1418 +msgid "PKINIT: failed to unwrap CI" +msgstr "" + +#: lib/krb5/pkinit.c:1401 +#, c-format +msgid "PKINIT: Failed decoding windows pkinit reply %d" +msgstr "" + +#: lib/krb5/pkinit.c:1433 +msgid "PKINIT: win2k reply invalid content type" +msgstr "" + +#: lib/krb5/pkinit.c:1441 +msgid "PKINIT: unknown reply type" +msgstr "" + +#: lib/krb5/pkinit.c:1516 +msgid "PKINIT: No anchor given" +msgstr "" + +#: lib/krb5/pkinit.c:1522 +msgid "PKINIT: No user certificate given" +msgstr "" + +#: lib/krb5/pkinit.c:1654 +#, c-format +msgid "Did not find a DH group parameter matching requirement of %lu bits" +msgstr "" + +#: lib/krb5/pkinit.c:1719 +#, c-format +msgid "moduli file %s missing %s on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1726 +#, c-format +msgid "moduli file %s failed parsing %s on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1764 +#, c-format +msgid "moduli file %s missing name on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1771 +msgid "malloc: out of memeory" +msgstr "" + +#: lib/krb5/pkinit.c:1778 +#, c-format +msgid "moduli file %s missing bits on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1786 +#, c-format +msgid "moduli file %s have un-parsable bits on line %d" +msgstr "" + +#: lib/krb5/pkinit.c:1980 +#, c-format +msgid "PKINIT: DH group parameter %s no accepted, not enough bits generated" +msgstr "" + +#: lib/krb5/pkinit.c:1993 +msgid "PKINIT: DH group parameter no ok" +msgstr "" + +#: lib/krb5/pkinit.c:2049 +msgid "PKINIT: on non extendable opt" +msgstr "" + +#: lib/krb5/pkinit.c:2144 +msgid "pkinit: failed to generate DH key" +msgstr "" + +#: lib/krb5/principal.c:153 +msgid "Can't require both realm and no realm at the same time" +msgstr "" + +#: lib/krb5/principal.c:168 +#: lib/krb5/principal.c:208 +msgid "trailing \\ in principal name" +msgstr "" + +#: lib/krb5/principal.c:218 +#: lib/krb5/principal.c:240 +msgid "part after realm in principal name" +msgstr "" + +#: lib/krb5/principal.c:249 +msgid "realm found in 'short' principal expected to be without one" +msgstr "" + +#: lib/krb5/principal.c:266 +msgid "realm NOT found in principal expected to be with one" +msgstr "" + +#: lib/krb5/principal.c:363 +msgid "Realm missing from principal, can't unparse" +msgstr "" + +#: lib/krb5/principal.c:374 +msgid "Out of space printing principal" +msgstr "" + +#: lib/krb5/principal.c:394 +msgid "Out of space printing realm of principal" +msgstr "" + +#: lib/krb5/principal.c:1217 +#, c-format +msgid "cannot convert a %d component principal" +msgstr "" + +#: lib/krb5/principal.c:1244 +msgid "too long name component to convert" +msgstr "" + +#: lib/krb5/principal.c:1249 +msgid "too long instance component to convert" +msgstr "" + +#: lib/krb5/principal.c:1254 +msgid "too long realm component to convert" +msgstr "" + +#: lib/krb5/principal.c:1277 +#, c-format +msgid "unsupported name type %d" +msgstr "" + +#: lib/krb5/principal.c:1286 +msgid "Failed to get local hostname" +msgstr "" + +#: lib/krb5/principal.c:1346 +#, c-format +msgid "Failed to find name type %s" +msgstr "" + +#: lib/krb5/rd_cred.c:177 +msgid "sender address is wrong in received creds" +msgstr "" + +#: lib/krb5/rd_cred.c:199 +#: lib/krb5/rd_cred.c:208 +msgid "receiver address is wrong in received creds" +msgstr "" + +#: lib/krb5/rd_error.c:95 +#, c-format +msgid "Client %s%s%s expired" +msgstr "" + +#: lib/krb5/rd_error.c:102 +#, c-format +msgid "Server %s%s%s expired" +msgstr "" + +#: lib/krb5/rd_error.c:109 +#, c-format +msgid "Client %s%s%s unknown" +msgstr "" + +#: lib/krb5/rd_error.c:116 +#, c-format +msgid "Server %s%s%s unknown" +msgstr "" + +#: lib/krb5/rd_req.c:811 +msgid "krb5_rd_req: user to user auth without session key given" +msgstr "" + +#: lib/krb5/rd_safe.c:103 +msgid "rd_safe: need outdata to return data" +msgstr "" + +#: lib/krb5/recvauth.c:111 +msgid "Failed to receive sendauth data" +msgstr "" + +#: lib/krb5/recvauth.c:149 +#, c-format +msgid "wrong sendauth version (%s)" +msgstr "" + +#: lib/krb5/replay.c:65 +#: lib/krb5/replay.c:89 +#, c-format +msgid "replay cache type %s not supported" +msgstr "" + +#: lib/krb5/scache.c:199 +#, c-format +msgid "Failed to prepare stmt %s: %s" +msgstr "" + +#: lib/krb5/scache.c:215 +#, c-format +msgid "scache execute %s: %s" +msgstr "" + +#: lib/krb5/scache.c:341 +#, c-format +msgid "Error opening scache file %s: %s" +msgstr "" + +#: lib/krb5/scache.c:364 +#, c-format +msgid "Failed to add scache: %d" +msgstr "" + +#: lib/krb5/scache.c:461 +#, c-format +msgid "scache bind principal: %s" +msgstr "" + +#: lib/krb5/scache.c:511 +#, c-format +msgid "Cache name of wrong type for scache %ld" +msgstr "" + +#: lib/krb5/scache.c:576 +#, c-format +msgid "Failed to delete old credentials: %s" +msgstr "" + +#: lib/krb5/scache.c:595 +#, c-format +msgid "Failed to bind principal to cache %s" +msgstr "" + +#: lib/krb5/scache.c:637 +#, c-format +msgid "Failed to destroy cache %s: %s" +msgstr "" + +#: lib/krb5/scache.c:660 +msgid "Failed to store credential in scache" +msgstr "" + +#: lib/krb5/scache.c:669 +msgid "Failed to encode credential in scache" +msgstr "" + +#: lib/krb5/scache.c:691 +msgid "Failed to read credential in scache" +msgstr "" + +#: lib/krb5/scache.c:752 +#, c-format +msgid "Failed to add credential: %s" +msgstr "" + +#: lib/krb5/scache.c:771 +#: lib/krb5/scache.c:789 +#, c-format +msgid "Failed to add principal: %s" +msgstr "" + +#: lib/krb5/scache.c:826 +#, c-format +msgid "No principal for cache SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:834 +#, c-format +msgid "Principal data of wrong type for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:844 +#, c-format +msgid "Principal not set for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:889 +#, c-format +msgid "Iterating a invalid scache %s" +msgstr "" + +#: lib/krb5/scache.c:980 +#: lib/krb5/scache.c:1069 +#, c-format +msgid "scache Database failed: %s" +msgstr "" + +#: lib/krb5/scache.c:999 +#, c-format +msgid "credential of wrong type for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:1077 +#, c-format +msgid "Credential of wrong type for SCACHE:%s:%s" +msgstr "" + +#: lib/krb5/scache.c:1115 +msgid "failed to delete scache credental" +msgstr "" + +#: lib/krb5/scache.c:1242 +#, c-format +msgid "Database failed: %s" +msgstr "" + +#: lib/krb5/scache.c:1283 +#, c-format +msgid "Can't handle cross database credential move: %s -> %s" +msgstr "" + +#: lib/krb5/scache.c:1307 +#, c-format +msgid "Failed to delete old cache: %d" +msgstr "" + +#: lib/krb5/scache.c:1322 +#, c-format +msgid "Failed to update new cache: %d" +msgstr "" + +#: lib/krb5/scache.c:1371 +#, c-format +msgid "Trying to set a invalid cache as default %s" +msgstr "" + +#: lib/krb5/scache.c:1381 +msgid "Failed to set name of default cache" +msgstr "" + +#: lib/krb5/scache.c:1391 +msgid "Failed to update default cache" +msgstr "" + +#: lib/krb5/send_to_kdc.c:351 +#, c-format +msgid "Plugin send_to_kdc failed to lookup with error: %d" +msgstr "" + +#: lib/krb5/send_to_kdc.c:622 +#, c-format +msgid "unable to reach any KDC in realm %s" +msgstr "" + +#: lib/krb5/ticket.c:124 +#, c-format +msgid "Authorization data nested deeper then %d levels, stop searching" +msgstr "" + +#: lib/krb5/ticket.c:155 +#, c-format +msgid "Failed to decode IF_RELEVANT with %d" +msgstr "" + +#: lib/krb5/ticket.c:177 +#, c-format +msgid "Failed to decode AD_KDCIssued with %d" +msgstr "" + +#: lib/krb5/ticket.c:224 +msgid "" +"Authorization data contains AND-OR element that is unknown to the application" +msgstr "" + +#: lib/krb5/ticket.c:233 +#, c-format +msgid "Authorization data contains unknown type (%d) " +msgstr "" + +#: lib/krb5/ticket.c:270 +msgid "Ticket have not authorization data" +msgstr "" + +#: lib/krb5/ticket.c:280 +#, c-format +msgid "Ticket have not authorization data of type %d" +msgstr "" + +#: lib/krb5/transited.c:457 +#: lib/krb5/transited.c:490 +#, c-format +msgid "no transit allowed through realm %s from %s to %s" +msgstr "" + +#: lib/krb5/v4_glue.c:151 +#: lib/krb5/v4_glue.c:297 +msgid "Failed getting the krb4 credentials cache name" +msgstr "" + +#: lib/krb5/v4_glue.c:160 +#, c-format +msgid "Failed opening krb4 credential cache %s: %s" +msgstr "" + +#: lib/krb5/v4_glue.c:170 +#, c-format +msgid "krb4 credential cache %s is not a file" +msgstr "" + +#: lib/krb5/v4_glue.c:185 +#, c-format +msgid "Failed to lock credentail cache %s" +msgstr "" + +#: lib/krb5/v4_glue.c:197 +#, c-format +msgid "Failed to truncate krb4 cc %s" +msgstr "" + +#: lib/krb5/v4_glue.c:305 +#, c-format +msgid "Failed removing the cache %s with error %s" +msgstr "" + +#: lib/krb5/v4_glue.c:455 +#: lib/krb5/v4_glue.c:515 +#: lib/krb5/v4_glue.c:568 +msgid "Failed to encode kerberos 4 ticket" +msgstr "" + +#: lib/krb5/v4_glue.c:786 +msgid "Failed reading v4 pvno" +msgstr "" + +#: lib/krb5/v4_glue.c:792 +msgid "Failed v4 pvno not 4" +msgstr "" + +#: lib/krb5/v4_glue.c:798 +msgid "Failed readin v4 type" +msgstr "" + +#: lib/krb5/v4_glue.c:808 +msgid "Not a valid v4 request type" +msgstr "" + +#: lib/krb5/v4_glue.c:821 +msgid "Failed reading v4 ticket" +msgstr "" + +#: lib/krb5/v4_glue.c:837 +msgid "Failed reading v4 authenticator" +msgstr "" + +#: lib/krb5/v4_glue.c:872 +msgid "v4 principal mismatch" +msgstr "" + +#: lib/krb5/v4_glue.c:879 +msgid "v4 bad address in ticket" +msgstr "" + +#: lib/krb5/v4_glue.c:887 +msgid "v4 clock skew" +msgstr "" + +#: lib/krb5/v4_glue.c:898 +msgid "v4 clock skew for expiration" +msgstr "" + +#: lib/krb5/v4_glue.c:904 +msgid "v4 ticket expired" +msgstr "" diff --git a/crypto/heimdal/po/heimdal_kuser/heimdal_kuser.pot b/crypto/heimdal/po/heimdal_kuser/heimdal_kuser.pot new file mode 100644 --- /dev/null +++ b/crypto/heimdal/po/heimdal_kuser/heimdal_kuser.pot @@ -0,0 +1,416 @@ +# SOME DESCRIPTIVE TITLE. +# This file is put in the public domain. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Heimdal 1.2.99\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2008-12-06 09:51-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: kuser/kgetcred.c:52 +msgid "credential cache to use" +msgstr "" + +#: kuser/kgetcred.c:54 +msgid "credential cache to store credential in" +msgstr "" + +#: kuser/kgetcred.c:56 +msgid "where to find the ticket use for delegation" +msgstr "" + +#: kuser/kgetcred.c:58 +msgid "canonicalize the principal" +msgstr "" + +#: kuser/kgetcred.c:60 +msgid "forwardable ticket requested" +msgstr "" + +#: kuser/kgetcred.c:63 +msgid "encryption type to use" +msgstr "" + +#: kuser/kgetcred.c:65 +msgid "client to impersonate" +msgstr "" + +#: kuser/kgetcred.c:135 +#, c-format +msgid "unrecognized enctype: %s" +msgstr "" + +#: kuser/kinit.c:90 +msgid "obtain version 4 TGT" +msgstr "" + +#: kuser/kinit.c:93 +msgid "only convert ticket to version 4" +msgstr "" + +#: kuser/kinit.c:96 +msgid "obtain afs tokens" +msgstr "" + +#: kuser/kinit.c:99 +msgid "credentials cache" +msgstr "" + +#: kuser/kinit.c:102 +msgid "get forwardable tickets" +msgstr "" + +#: kuser/kinit.c:105 +msgid "keytab to use" +msgstr "" + +#: kuser/kinit.c:108 +msgid "lifetime of tickets" +msgstr "" + +#: kuser/kinit.c:111 +msgid "get proxiable tickets" +msgstr "" + +#: kuser/kinit.c:114 +msgid "renew TGT" +msgstr "" + +#: kuser/kinit.c:117 +msgid "get renewable tickets" +msgstr "" + +#: kuser/kinit.c:120 +msgid "renewable lifetime of tickets" +msgstr "" + +#: kuser/kinit.c:123 +msgid "server to get ticket for" +msgstr "" + +#: kuser/kinit.c:126 +msgid "when ticket gets valid" +msgstr "" + +#: kuser/kinit.c:129 +msgid "get key from keytab" +msgstr "" + +#: kuser/kinit.c:132 +msgid "validate TGT" +msgstr "" + +#: kuser/kinit.c:135 +msgid "encryption types to use" +msgstr "" + +#: kuser/kinit.c:138 +msgid "file cache version to create" +msgstr "" + +#: kuser/kinit.c:141 +msgid "request a ticket with no addresses" +msgstr "" + +#: kuser/kinit.c:144 +msgid "include these extra addresses" +msgstr "" + +#: kuser/kinit.c:147 +msgid "request an anonymous ticket" +msgstr "" + +#: kuser/kinit.c:150 +msgid "request a Windows PAC" +msgstr "" + +#: kuser/kinit.c:153 +msgid "read the password from a file" +msgstr "" + +#: kuser/kinit.c:156 +msgid "canonicalize client principal" +msgstr "" + +#: kuser/kinit.c:159 +msgid "principal's public/private/certificate identifier" +msgstr "" + +#: kuser/kinit.c:162 +msgid "directory with CA certificates" +msgstr "" + +#: kuser/kinit.c:165 +msgid "Use RSA encrypted reply (instead of DH)" +msgstr "" + +#: kuser/kinit.c:168 +msgid "NTLM domain" +msgstr "" + +#: kuser/kinit.c:171 +msgid "honor ok-as-delegate on tickets" +msgstr "" + +#: kuser/kinit.c:174 +msgid "only use referrals, no dns canalisation" +msgstr "" + +#: kuser/kinit.c:177 +msgid "get windows behavior" +msgstr "" + +#: kuser/kinit.c:188 +#: kuser/klist.c:581 +msgid "Usage: " +msgstr "" + +#: kuser/kinit.c:410 +#, c-format +msgid "Failed to read password from file %s" +msgstr "" + +#: kuser/kinit.c:475 +#: kuser/kinit.c:825 +#, c-format +msgid "unparsable time: %s" +msgstr "" + +#: kuser/kinit.c:533 +#, c-format +msgid "%s's Password: " +msgstr "" + +#: kuser/kinit.c:567 +msgid "Password incorrect" +msgstr "" + +#: kuser/kinit.c:570 +msgid "Looks like a Kerberos 4 reply" +msgstr "" + +#: kuser/kinit.c:581 +#, c-format +msgid "NOTICE: ticket lifetime is %s" +msgstr "" + +#: kuser/kinit.c:590 +#, c-format +msgid "NOTICE: ticket renewable lifetime is %s" +msgstr "" + +#: kuser/kinit.c:817 +msgid "resolving credentials cache" +msgstr "" + +#: kuser/kinit.c:832 +msgid "specifying both extra addresses and no addresses makes no sense" +msgstr "" + +#: kuser/kinit.c:882 +#, c-format +msgid "permission denied: %s" +msgstr "" + +#: kuser/kinit.c:884 +#, c-format +msgid "command not found: %s" +msgstr "" + +#: kuser/klist.c:58 +msgid " Issued" +msgstr "" + +#: kuser/klist.c:59 +msgid " Expires" +msgstr "" + +#: kuser/klist.c:60 +msgid "Flags" +msgstr "" + +#: kuser/klist.c:61 +msgid " Principal" +msgstr "" + +#: kuser/klist.c:62 +msgid " Principal (kvno)" +msgstr "" + +#: kuser/klist.c:63 +msgid " Cache name" +msgstr "" + +#: kuser/klist.c:86 +msgid ">>>Expired<<<" +msgstr "" + +#: kuser/klist.c:134 +#, c-format +msgid "Server: %s\n" +msgstr "" + +#: kuser/klist.c:140 +#, c-format +msgid "Client: %s\n" +msgstr "" + +#: kuser/klist.c:150 +msgid "Ticket etype: " +msgstr "" + +#: kuser/klist.c:155 +#, c-format +msgid "unknown-enctype(%d)" +msgstr "" + +#: kuser/klist.c:158 +#, c-format +msgid ", kvno %d" +msgstr "" + +#: kuser/klist.c:165 +#, c-format +msgid "Session key: %s\n" +msgstr "" + +#: kuser/klist.c:170 +#, c-format +msgid "Ticket length: %lu\n" +msgstr "" + +#: kuser/klist.c:173 +#, c-format +msgid "Auth time: %s\n" +msgstr "" + +#: kuser/klist.c:176 +#, c-format +msgid "Start time: %s\n" +msgstr "" + +#: kuser/klist.c:178 +#, c-format +msgid "End time: %s" +msgstr "" + +#: kuser/klist.c:181 +msgid " (expired)" +msgstr "" + +#: kuser/klist.c:184 +#, c-format +msgid "Renew till: %s\n" +msgstr "" + +#: kuser/klist.c:191 +#, c-format +msgid "Ticket flags: %s\n" +msgstr "" + +#: kuser/klist.c:193 +msgid "Addresses: " +msgstr "" + +#: kuser/klist.c:206 +msgid "addressless" +msgstr "" + +#: kuser/klist.c:236 +msgid "Credentials cache" +msgstr "" + +#: kuser/klist.c:239 +msgid "Principal" +msgstr "" + +#: kuser/klist.c:243 +msgid "Cache version" +msgstr "" + +#: kuser/klist.c:262 +msgid "KDC time offset" +msgstr "" + +#: kuser/klist.c:407 +#: kuser/klist.c:519 +msgid ">>> Expired <<<" +msgstr "" + +#: kuser/klist.c:412 +#, c-format +msgid "User's (AFS ID %d) tokens for %s" +msgstr "" + +#: kuser/klist.c:414 +#, c-format +msgid "Tokens for %s" +msgstr "" + +#: kuser/klist.c:453 +#, c-format +msgid "No ticket file: %s" +msgstr "" + +#: kuser/klist.c:554 +msgid "credentials cache to list" +msgstr "" + +#: kuser/klist.c:556 +msgid "test for having tickets" +msgstr "" + +#: kuser/klist.c:559 +msgid "display AFS tokens" +msgstr "" + +#: kuser/klist.c:561 +msgid "display v5 cred cache" +msgstr "" + +#: kuser/klist.c:563 +#: kuser/klist.c:565 +msgid "verbose output" +msgstr "" + +#: kuser/klist.c:567 +msgid "display hidden credentials" +msgstr "" + +#: kuser/klist.c:571 +#: kuser/kswitch.c:56 +msgid "print version" +msgstr "" + +#: kuser/kswitch.c:50 +msgid "type of credential cache" +msgstr "" + +#: kuser/kswitch.c:52 +msgid "name of credential cache" +msgstr "" + +#: kuser/kswitch.c:54 +msgid "name of principal" +msgstr "" + +#: kuser/kswitch.c:106 +msgid "Both --cache and --principal given, choose one" +msgstr "" + +#: kuser/kswitch.c:118 +#, c-format +msgid "Did not find principal: %s" +msgstr "" + +#: kuser/kswitch.c:132 +msgid "out of memory" +msgstr "" diff --git a/crypto/heimdal/test-driver b/crypto/heimdal/test-driver new file mode 100755 --- /dev/null +++ b/crypto/heimdal/test-driver @@ -0,0 +1,153 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 2011-2021 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# 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 +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <"$log_file" +"$@" >>"$log_file" 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>"$log_file" + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/crypto/heimdal/tests/ChangeLog b/crypto/heimdal/tests/ChangeLog new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ChangeLog @@ -0,0 +1,793 @@ +2008-06-01 Love Hörnquist Åstrand + + * kdc/check-kadmin.in: Test globbing acl's + +2008-04-28 Love Hörnquist Åstrand + + * kdc/Makefile.am: test SDB cache. + + * kdc/check-cc.in: Test SDB combinations. + +2008-04-27 Love Hörnquist Åstrand + + * kdc/check-kpasswdd.in: Wait for success, use password command to + test it. + + * kdc/check-kpasswd.in: use rkpty to test kpasswd/kpasswdd + +2008-03-23 Love Hörnquist Åstrand + + * kdc/check-referral.in: Fix status messages. + +2008-03-22 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Ident. + +2008-03-20 Love Hörnquist Åstrand + + * kdc/check-kdc.in: More verbose checks, disable check that no + longer works with referrals. + +2008-03-19 Love Hörnquist Åstrand + + * kdc/check-referral.in: Test TGS referrals. + +2008-03-14 Love Hörnquist Åstrand + + * gss/check-context.in: Test gsskrb5_register_acceptor_identity. + +2008-02-11 Love Hörnquist Åstrand + + * ldap/check-ldap.in: check tgs req too + +2008-02-03 Love Hörnquist Åstrand + + * gss/check-context.in: Does not work yet error case. + +2008-01-27 Love Hörnquist Åstrand + + * gss/check-context.in: Test unreadable/non existant keytab and + its error message. + +2008-01-14 Love Hörnquist Åstrand + + * kdc: Test the PKCS11 provider built-in to libhx509. + +2007-12-14 Love Hörnquist Åstrand + + * ldap/init.ldif: Add space to make valid ldiff file, from Buchan + Milne + + * ldap/slapd-init.in: Another place where schemas are installed, + from Buchan Milne. + +2007-12-05 Love Hörnquist Åstrand + + * kdc/check-kadmin.in: Check that admin-less principal works. + +2007-12-04 Love Hörnquist Åstrand + + * gss/check-ntlm.in: test kdigest digest-probe command. + +2007-12-03 Love Hörnquist Åstrand + + * gss/check-basic.in: Test GSS_C_NO_NAME too. + +2007-10-24 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Try multiple enctypes. + +2007-08-17 Love Hörnquist Åstrand + + * java/Makefile.am: EXTRA_DIST += jaas.conf + +2007-08-13 Love Hörnquist Åstrand + + * java/Makefile.am: Add java source code. + +2007-08-09 Love Hörnquist Åstrand + + * kdc/check-iprop.in: Don't run this test in AFS since AFS is + missing unix sockets. + + * kdc/wait-kdc.sh: Catch bind ../../tests/kdc/signal: Operation + not permitted + +2007-08-08 Love Hörnquist Åstrand + + * kdc/check-iprop.in: use wait-kdc.sh for all diffrent places we + start ipropd-{master,slave}. + + * all-tests: empty messages.log + + * kdc/check-iprop.in: Use wait-kdc.sh to wait for + ipropd-{master,slave}. + + * kdc/wait-kdc.sh: look futher back in the logfile. + + * kdc/wait-kdc.sh: Make wait-kdc.sh able to wait on other things. + + * kdc/check-iprop.in: Checking master going backward, create + iprop-stats. + +2007-08-07 Love Hörnquist Åstrand + + * java/have-java.sh: GNU GCC Java doesn't support Kerberos + +2007-08-01 Love Hörnquist Åstrand + + * kdc/check-iprop.in: wait longer for iprop, dump messages.log on + failure. + + * kdc/Makefile.am: Clean after iprop tests. + + * kdc/check-iprop.in: more iprop tests. + +2007-07-31 Love Hörnquist Åstrand + + * kdc/Makefile.am: Add check-iprop and related files. + + * kdc/krb5.conf.in: Add stuff for iprop. + + * kdc/check-iprop.in: Test for iprop. + + * kdc/iprop-acl: ACL file for iprop. + +2007-07-28 Love Hörnquist Åstrand + + * kdc/donotexists.txt: missing file. + +2007-07-26 Love Hörnquist Åstrand + + * kdc/Makefile.am: EXTRA_DIST += donotexists.txt + +2007-07-22 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Test renewing. + +2007-07-21 Love Hörnquist Åstrand + + * kdc/Makefile.am: Test for simple salt types. + + * kdc/krb5.conf.keys.in: Configuration file for testing keys. + + * kdc/check-keys.in: Test some simple salt types. + +2007-07-17 Love Hörnquist Åstrand + + * java/Makefile.am: EXTRA_DIST += have_java.sh + + * java/check-kinit.in: Make failing to compile a java program a + no-fatal error. + + * java/check-kinit.in: Disable test if we use socket wrapper. + +2007-07-16 Love Hörnquist Åstrand + + * kdc/check-kadmin.in: Give more hints of what went wrong. + +2007-07-14 Love Hörnquist Åstrand + + * kdc/Makefile.am: add check-kadmin.in + +2007-07-12 Love Hörnquist Åstrand + + * ldap/slapd.conf: add samba.schema. + + * ldap/slapd-init.in: Add samba schema. + + * ldap/init.ldif: Samba entry to do testing with. + +2007-07-11 Love Hörnquist Åstrand + + * java/check-kinit.in: Only print when there is an error. + + * java/krb5.conf.in: Move the AES enctypes first. + +2007-07-10 Love Hörnquist Åstrand + + * kdc/check-kadmin.in: Send kill outout to /dev/null. + + * kdc/krb5.conf.in: Add bits needed for kadmind server test. + + * kdc/Makefile.am: Add check-kadmin. + + * kdc/check-kadmin.in: Simple test for server based kadmin. + + * kdc/heimdal.acl: ACL file for check-admin test. + +2007-07-05 Love Hörnquist Åstrand + + * Makefile.am: Add java. + + * java: simple java kinit test + +2007-06-26 Love Hörnquist Åstrand + + * ldap/check-ldap.in: Add one more principal and list the + database. + + * kdc/check-pkinit.in: Fix hxtool issue-certificate --req. + + * kdc/check-referral.in: Spelling. + +2007-06-22 Love Hörnquist Åstrand + + * gss/check-context.in: disable dns canon on test, break on some + buildfarm hosts. + +2007-06-19 Love Hörnquist Åstrand + + * can/test_can.in: readline seems strange, try diffrent way to + setup the database. + +2007-06-18 Love Hörnquist Åstrand + + * can/test_can.in: spoon feed kadmin diffrently + +2007-06-11 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Also test rename user to anther realm. + + * kdc/check-kdc.in: Test renaming a user. + + * can/test_can.in: Tell use what the messages.log told us. + + * kdc/check-referral.in: Add some more as-req canon tests, add + disable tgs-req tests. + +2007-06-09 Love Hörnquist Åstrand + + * can/check-can.in: Check is there is a working db backend here. + +2007-06-08 Love Hörnquist Åstrand + + * can/Makefile.am: Clean up more cruft. + +2007-06-07 Love Hörnquist Åstrand + + * can/Makefile.am: More files we want in the dist. + + * can/test_can.in: Simplify error reporting. + + * can/test_can.in: Catch error from kadmin. + + * can/mit-pkinit-20070607.*: mit pkinit-9 request + + * can/check-can.in: Add mit-pkinit test. + + * can/Makefile.am: Create specific configurtion files for some + tests. + + * can/test_can.in: Pick up the right generated + krb5.conf (spelling). + + * can: Add Apple Tiger 10.4/MIT Kerberos 1.4 + + * can/test_can.in: Don't need to start a kdc for this test. + + * can: pre-canned requests from older versions and other implementations + + * Makefile.am: SUBDIRS += can + +2007-06-04 Love Hörnquist Åstrand + + * kdc/check-uu.in: Use stdout from uu_server. + +2007-05-31 Love Hörnquist Åstrand + + * kdc/check-pkinit.in: Try pkinit in w2k mode, also add tests for + MS SAN. + + * kdc/Makefile.am: generate a krb5-pkinit-win.conf + + * kdc/krb5-pkinit.conf.in: W2K tests. + +2007-05-30 Love Hörnquist Åstrand + + * kdc/Makefile.am: remove more files + +2007-05-10 Love Hörnquist Åstrand + + * kdc/check-pkinit.in: try principal subject in DB + +2007-05-08 Love Hörnquist Åstrand + + * gss/check-basic.in: test using test_kcred + + * gss/check-ntlm.in: One more test. + + * ldap/check-ldap.in: check in /usr/lib/openldap too for slapd and + slapadd + +2007-05-07 Love Hörnquist Åstrand + + * db/add-modify-delete.in: Remove comment. + + * db/add-modify-delete.in: try replay + + * db/Makefile.am: clean more files. + + * db/add-modify-delete.in: try iprop-log commands. + +2007-04-27 Love Hörnquist Åstrand + + * db/krb5.conf.in: Add longer example. + +2007-04-23 Love Hörnquist Åstrand + + * db: basic tests for dbinfo + +2007-04-22 Love Hörnquist Åstrand + + * gss/Makefile.am: Add check-ntlm. + + * gss/check-ntlm.in: test ntlm client credentials code. + +2007-04-21 Love Hörnquist Åstrand + + * db/loaddump-db.in: make kstash quiet + +2007-04-18 Love Hörnquist Åstrand + + * gss/check-basic.in: more gss_acquire_cred tests + +2007-04-17 Love Hörnquist Åstrand + + * gss/Makefile.am: add check-basic + + * gss/check-basic.in: basic tests that might require a KDC. + +2007-04-16 Love Hörnquist Åstrand + + * kdc/Makefile.am: CLEANFILES += sdigest-init + +2007-04-11 Love Hörnquist Åstrand + + * ldap/slapd-init.in: Add Id tag + +2007-02-22 Love Hörnquist Åstrand + + * kdc/check-kdc.in: test new kadmin add_enctype functionallity + +2007-02-17 Love Hörnquist Åstrand + + * Makefile.am: add ldap + + * kdc/check-referral.in: add check-referral + + * kdc/Makefile.am: add check-referral + +2007-02-15 Love Hörnquist Åstrand + + * tests/ldap: simple ldap test, inspried by samba ldb ldap test + +2007-02-03 Love Hörnquist Åstrand + + * kdc/check-digest.in: Test ms-chap-v2 (client response, server + response, session key) + +2007-02-02 Love Hörnquist Åstrand + + * kdc/krb5.conf.in: allow ms-chap-v2 + +2007-02-01 Love Hörnquist Åstrand + + * kdc/check-digest.in: Negative check too. + +2007-01-18 Love Hörnquist Åstrand + + * kdc/check-uu.in: save log, wait longer + +2007-01-15 Love Hörnquist Åstrand + + * kdc/check-pkinit.in: tell me about certifiate that we have + generated + +2007-01-11 Love Hörnquist Åstrand + + * no random, no RSA/DH tests + + * plugin/Makefile.am: remove files created by tests + + * gss/Makefile.am: remove files created by tests + + * gss/Makefile.am: add ntlm-user-file.txt + +2007-01-10 Love Hörnquist Åstrand + + * kdc/ap-req.c: --verify-pac no means verify existance of PAC in + ticket, the signature checking is done by the kerberos library. + + * kdc/check-digest.in: display messages.log and help that that + tells us what went wrong. + + * plugin/windc.c: Update to validate function signature change. + + * Makefile.am: Only traverse into plugin if there is shared + library support. + +2007-01-09 Love Hörnquist Åstrand + + * kdc/check-pkinit.in: Prefix key with FILE: + +2007-01-04 Love Hörnquist Åstrand + + * plugin/Makefile.am: EXTRA_DIST += krb5.conf.in + + * plugin/check-pac.in: test explicit requested pac and explicit + negative requested pac. + + * kdc/ap-req.c: Make it possible to turn off PAC check, its + default on. + + * plugin/windc.c: Add client_access. + + * plugin/check-pac.in: Verify PAC on server end too. + + * kdc/ap-req.c: Add verification of PAC. + + * kdc/Makefile.am: Add test for pkinit with locally generated + certs. + + * kdc/check-pkinit.in: Generate a ca, kdc cert and client cert and + try to use them + + * kdc/pki-mapping: add other foo@TEST + + * kdc/krb5-pkinit.conf.in: pkinit specific krb5.conf + +2007-01-03 Love Hörnquist Åstrand + + * plugin/check-pac.in: test tgs-req + + * plugin/windc.c: log that the function is called. + + * kdc/check-digest.in: Test security layer in ntlm. + + * plugin: test WinDC PAC functionallity + + * Makefile.am: Include plugin in tests + +2006-12-28 Love Hörnquist Åstrand + + * kdc/ntlm-user-file.txt: Correct DOMAIN name + +2006-12-26 Love Hörnquist Åstrand + + * kdc/krb5.conf.in: Add digests acls (all) + +2006-12-19 Love Hörnquist Åstrand + + * gss/check-spnego.in: test wrapunwrap + + * gss/check-spnego.in: Test get and verify MIC. + + * gss/check-context.in: don't need to set GSSAPI_SPNEGO_NAME any + longer + +2006-12-18 Love Hörnquist Åstrand + + * gss/check-context.in: Define GSSAPI_SPNEGO_NAME and re-add + spnego + + * gss/check-context.in: add trap, remove allow-digest, pretty + print. + + * gss/check-gssmask.in: catch EXIT traps + + * gss/check-spnego.in: test more combination of spnego contexts + + * gss/Makefile.am: add check-spnego + + * gss/check-spnego.in: check spnego combinations. + +2006-12-16 Love Hörnquist Åstrand + + * kdc/check-digest.in: test more combinations of names + +2006-12-15 Love Hörnquist Åstrand + + * kdc/ntlm-user-file.txt: ntlm username and password file + + * kdc/check-digest.in: Check that ntlm works. + +2006-12-12 Love Hörnquist Åstrand + + * kdc/check-digest.in: prefix digest commands with digest- + +2006-11-29 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Don't (afs) unlog using kdestroy + +2006-11-25 Love Hörnquist Åstrand + + * kdc/Makefile.am: Add LIB_roken and (implictly by that libvers + for print_version) to LDADD + +2006-11-23 Love Hörnquist Åstrand + + * kdc/check-kdc.in: check that the getarg -- option works for + delete and add. + + * kdc/check-kdc.in: Test proxy cert. + +2006-11-19 Love Hörnquist Åstrand + + * kdc/krb5.conf.in: revert the enable-pkinit change, and make it + consistant with all other other enable- options + +2006-11-15 Love Hörnquist Åstrand + + * gss/check-context.in: Add dce-style context building test. + + * gss/check-context.in: test more combination of context building + +2006-11-13 Love Hörnquist Åstrand + + * Use TEST{,2}.H5L.SE for testing + +2006-11-08 Love Hörnquist Åstrand + + * kdc/Makefile.am: Use EGREP. + + * kdc/check-kdc.in: Use EGREP. + +2006-10-23 Love Hörnquist Åstrand + + * kdc/check-kdc.in: run eval on the testfailed variable so we run + all commands + +2006-10-22 Love Hörnquist Åstrand + + * db/Makefile.am: make have-db being built in the "make all" + target. + + * kdc/check-kdc.in: tell more what the kdc though about the + failure. + +2006-10-21 Love Hörnquist Åstrand + + * db/add-modify-delete.in: Use EGREP. + + * db/Makefile.am: add EGREP to do_subst + +2006-10-20 Love Hörnquist Åstrand + + * gss/Makefile.am: Clean temporary files + + * db/Makefile.am: clean have-db + + * kdc/Makefile.am: Add pki-mapping to dist file. + + * kdc/Makefile.am: more files + + * db/Makefile.am: more files + +2006-10-19 Love Hörnquist Åstrand + + * gss/check-context.in: give path to have-db + + * gss/check-gssmask.in: give path to have-db + + * kdc/check-kdc.in: give path to have-db + + * kdc/check-digest.in: give path to have-db + + * gss/check-gssmask.in: If there is no useful db support compile + in, disable test + + * gss/check-context.in: Add commeted out digest check. + + * kdc/check-digest.in: If there is no useful db support compile + in, disable test + + * kdc/check-kdc.in: If there is no useful db support compile in, + disable test + + * db/loaddump-db.in: If there is no useful db support compile in, + disable test + + * db/have-db.in: Check if the kdc have any useful builtin + database. + + * kdc/check-kdc.in: Fix awk statement, put RE on the right side. + +2006-10-17 Love Hörnquist Åstrand + + * gss/check-gssmask.in: remove dup exit + + * gss/check-context.in: More name tests. + + * gss/check-context.in: test with and without dns-canon + +2006-10-14 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Be more explit about what test failed. + +2006-10-13 Love Hörnquist Åstrand + + * gss/check-context.in: et KRB5CCNAME in global enviorment + +2006-10-12 Love Hörnquist Åstrand + + * gss/Makefile.am: Check if the gss context tester test_context + works ok. + + * gss/check-context.in: Check if the gss context tester + test_context works ok. + +2006-10-10 Love Hörnquist Åstrand + + * gss/check-gssmask.in: use wait-kdc.sh script + + * kdc/check-kdc.in: use wait-kdc.sh script + + * kdc/check-digest.in: use wait-kdc.sh script + + * Heimdal uses TESTS_ENVIRONMENT before every binary being tested + directly from the Makefile. This now uses the same for the + scripts, so we can run them under valgrind. From Andrew Bartlet + +2006-10-07 Love Hörnquist Åstrand + + * gss/Makefile.am: splits script tests and binary tests + + * db/Makefile.am: Add tests script depenencies + + * kdc/Makefile.am: Split script tests and binary tests + +2006-10-04 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Test pkinit encKey case. + +2006-09-22 Love Hörnquist Åstrand + + * gss/check-gssmask.in: Catch failures from gssmaestro. + +2006-09-20 Love Hörnquist Åstrand + + * gss/check-gssmask.in: Add a third client + +2006-09-19 Love Hörnquist Åstrand + + * gss/check-gssmask.in: test for gssmask + gssmaestro. + + * gss/krb5.conf.in: Add krb5.conf for krb5.conf + +2006-09-18 Love Hörnquist Åstrand + + * gss/check-gss.in: Add (c) + + * kdc/check-kdc.in: Test constrained delegation impersonation. + +2006-09-16 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Change the password on krbtgt a couple of + times to have a non boring kvno. + +2006-08-24 Love Hörnquist Åstrand + + * kdc/check-digest.in: Use the server as the server and set + diffrent password for the user and service. + + * kdc/check-digest.in: Set allow digest flag on the server. + + * kdc/Makefile.am: Build and run check-digest test. + + * kdc/check-digest.in: Remove channel bindings from CHAP tests, + there is no such thing for CHAP. + + * kdc/check-kdc.in: Test aes only krbtgt and des3 only service. + +2006-08-21 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Remove empty lines for picky awks + +2006-07-06 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Check for cross realm case where remove user + doesn't exists in the database, this is ok assuming the cross + realm isn't local. In the general case this isn't true. + +2006-06-22 Love Hörnquist Åstrand + + * kdc/check-kdc.in: run kadmin check + +2006-06-07 Love Hörnquist Åstrand + + * kdc/check-kdc.in: test that delegated cred works too + + * kdc/check-kdc.in: Test delegation + +2006-06-06 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Add impersonation tests. + +2006-06-01 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Less verbose, spelling. + + * kdc/check-kdc.in: test cross realm and deleted user + +2006-05-12 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Check password protected pk-init keyfile. + +2006-04-30 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Don't try pkinit if there is no rsa + +2006-04-29 Love Hörnquist Åstrand + + * kdc/pki-mapping: change pki-mapping + + * kdc/Makefile.am: clean the server.keytab + + * kdc/check-kdc.in: Add test for pk-init + + * kdc/krb5.conf.in: Add pkinit glue + +2006-04-28 Love Hörnquist Åstrand + + * kdc/pki-mapping: Add pk-init mapping file + +2006-04-27 Love Hörnquist Åstrand + + * kdc/check-kdc.in: Sprinkle more ap-req now that the credential + is removed from the cache using kdestroy --credential= + + * kdc/ap-req.c: check that AP_OPTS_MUTUAL_REQUIRED matches, check + seqnumber + + * kdc/Makefile.am: Build as-req. + + * kdc/check-kdc.in: Sprinkel some as-req + + * kdc/ap-req.c: simple test program checking that as ap-req/as-rep + exchange works + +2006-04-25 Love Hörnquist Åstrand + + * {,kdc/,db/}.cvsignore: ignore Makefile.in + + * kdc/check-kdc.in: Try to detect another KDC running. + + * kdc/check-kdc.in: more tests regarding doing AS-REQ and TGS-REQ + + * kdc/krb5.conf.in: krb5.conf template + + * kdc/check-kdc.in: check that the keytab have the right kvno + + * db/add-modify-delete.in: create a server too + + * kdc/check-kdc.in: check kdc too + + * db/Makefile.am: Add add-modify-delete + + * db/add-modify-delete.in: basic kadmin tests + + * Makefile.am: SUBDIRS += kdc + + * kdc/check-kdc.in: Test framework for getting and checking + tickets, start kdc on localhost:8888. + + * kdc/Makefile.am: Test framework for getting and checking + tickets. + + * db/krb5.conf.in: log all message to local file + + * db/Makefile.am: clean messages file + +2006-01-17 Love Hörnquist Åstrand + + * db/krb5.conf.in: Set [libdefaults] default_realm = EXAMPLE.ORG. + +2005-11-30 Love Hörnquist Åstrand + + * db/loaddump-db.in: Specifify explicitly that the database is in + the current directory. + +2005-08-11 Love Hörnquist Åstrand + + * test loading and dumping of the database diff --git a/crypto/heimdal/tests/Makefile.am b/crypto/heimdal/tests/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/Makefile.am @@ -0,0 +1,13 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +SUBDIRS = bin db gss ldap can java kdc + +if ENABLE_SHARED +if HAVE_DLOPEN +SUBDIRS += plugin +endif +endif + +EXTRA_DIST = NTMakefile diff --git a/crypto/heimdal/tests/Makefile.in b/crypto/heimdal/tests/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/Makefile.in @@ -0,0 +1,1033 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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@ +@ENABLE_SHARED_TRUE@@HAVE_DLOPEN_TRUE@am__append_1 = plugin +subdir = tests +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-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 \ + tags-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_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + distdir distdir-am +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +DIST_SUBDIRS = bin db gss ldap can java kdc plugin +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common ChangeLog +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@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +SUBDIRS = bin db gss ldap can java kdc $(am__append_1) +EXTRA_DIST = NTMakefile +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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 +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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + 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" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + 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; \ + $(am__define_uniq_tagged_files); \ + 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-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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 + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-recursive +all-am: Makefile all-local +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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-exec-local + +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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: $(am__recursive_targets) check-am install-am install-data-am \ + install-strip uninstall-am + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am all-local \ + check check-am check-local clean clean-generic clean-libtool \ + cscopelist-am ctags ctags-am dist-hook 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-data-hook 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 installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +# 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: diff --git a/crypto/heimdal/tests/NTMakefile b/crypto/heimdal/tests/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests + +!include ../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/bin/Makefile.am b/crypto/heimdal/tests/bin/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/bin/Makefile.am @@ -0,0 +1,30 @@ +include $(top_srcdir)/Makefile.am.common + +noinst_SCRIPTS = setup-env + +noinst_PROGRAMS = intr + +intr_SOURCES = intr.c + +CHECK_LOCAL = no-check-local + +intr_LDADD = $(LIB_roken) + +do_subst = \ + top_srcdir="$$(cd ${top_srcdir} && pwd)" ; \ + top_builddir="$$(cd ${top_builddir} && pwd)" ; \ + sed $(do_dlopen) \ + -e "s,[@]EGREP[@],$(EGREP),g" \ + -e "s,[@]top_srcdir[@],$${top_srcdir},g" \ + -e "s,[@]top_builddir[@],$${top_builddir},g" \ + -e "s,[@]NO_AFS[@],$(NO_AFS),g" + +setup-env: setup-env.in Makefile + $(do_subst) < $(srcdir)/setup-env.in > setup-env.tmp + chmod +x setup-env.tmp + mv setup-env.tmp setup-env + +EXTRA_DIST = setup-env.in + +CLEANFILES = setup-env setup-env.tmp + diff --git a/crypto/heimdal/tests/bin/Makefile.in b/crypto/heimdal/tests/bin/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/bin/Makefile.in @@ -0,0 +1,1022 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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 = intr$(EXEEXT) +subdir = tests/bin +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_intr_OBJECTS = intr.$(OBJEXT) +intr_OBJECTS = $(am_intr_OBJECTS) +am__DEPENDENCIES_1 = +intr_DEPENDENCIES = $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +SCRIPTS = $(noinst_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/intr.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(intr_SOURCES) +DIST_SOURCES = $(intr_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_SCRIPTS = setup-env +intr_SOURCES = intr.c +CHECK_LOCAL = no-check-local +intr_LDADD = $(LIB_roken) +do_subst = \ + top_srcdir="$$(cd ${top_srcdir} && pwd)" ; \ + top_builddir="$$(cd ${top_builddir} && pwd)" ; \ + sed $(do_dlopen) \ + -e "s,[@]EGREP[@],$(EGREP),g" \ + -e "s,[@]top_srcdir[@],$${top_srcdir},g" \ + -e "s,[@]top_builddir[@],$${top_builddir},g" \ + -e "s,[@]NO_AFS[@],$(NO_AFS),g" + +EXTRA_DIST = setup-env.in +CLEANFILES = setup-env setup-env.tmp +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/bin/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/bin/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 + +intr$(EXEEXT): $(intr_OBJECTS) $(intr_DEPENDENCIES) $(EXTRA_intr_DEPENDENCIES) + @rm -f intr$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(intr_OBJECTS) $(intr_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/intr.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(PROGRAMS) $(SCRIPTS) all-local +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: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 -f ./$(DEPDIR)/intr.Po + -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -f ./$(DEPDIR)/intr.Po + -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-am check-local clean clean-generic clean-libtool \ + clean-noinstPROGRAMS cscopelist-am ctags ctags-am dist-hook \ + 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-data-hook 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 tags-am uninstall uninstall-am \ + uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +setup-env: setup-env.in Makefile + $(do_subst) < $(srcdir)/setup-env.in > setup-env.tmp + chmod +x setup-env.tmp + mv setup-env.tmp setup-env + +# 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: diff --git a/crypto/heimdal/tests/bin/intr.c b/crypto/heimdal/tests/bin/intr.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/bin/intr.c @@ -0,0 +1,56 @@ +#include + +#include +#include +#include + +static int help_flag; +static int timeout = 3; + +static struct getargs args[] = { + { "help", 'h', arg_flag, &help_flag, NULL, NULL }, + { "timeout", 't', arg_integer, &timeout, NULL, NULL } +}; + +static int nargs = sizeof(args) / sizeof(args[0]); + +static time_t +handle_timeout(void *data) +{ + static int killed; + + if (!killed++) + return -1; /* kill it */ + return -2; /* stop waiting for it */ +} + +static void +usage(int status) +{ + arg_printusage(args, nargs, NULL, "command"); + exit(status); +} + + +int +main(int argc, char **argv) +{ + int optidx = 0; + + setprogname(argv[0]); + + if (getarg(args, nargs, argc, argv, &optidx)) + usage(1); + + if (help_flag) + usage(0); + + argc -= optidx; + argv += optidx; + + if (argc == 0) + usage(1); + + return simple_execvp_timed(argv[0], argv, handle_timeout, NULL, + timeout); +} diff --git a/crypto/heimdal/tests/bin/setup-env.in b/crypto/heimdal/tests/bin/setup-env.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/bin/setup-env.in @@ -0,0 +1,74 @@ +#!/bin/sh + +HEIM_PIDFILE_DIR="${objdir}/" +export HEIM_PIDFILE_DIR + +unset KRB5_CONFIG +unset KRB5CCNAME + +top_builddir="@top_builddir@" +top_srcdir="@top_srcdir@" +EGREP="@EGREP@" +NO_AFS="@NO_AFS@" + +# Meant to be sourced (source or .) by the tester application, offers +# most commands in heimdal as variables + +# regular apps +hxtool="${TESTS_ENVIRONMENT} ${top_builddir}/lib/hx509/hxtool" +iprop_log="${TESTS_ENVIRONMENT} ${top_builddir}/lib/kadm5/iprop-log" +ipropd_master="${TESTS_ENVIRONMENT} ${top_builddir}/lib/kadm5/ipropd-master" +ipropd_slave="${TESTS_ENVIRONMENT} ${top_builddir}/lib/kadm5/ipropd-slave" +kadmin="${TESTS_ENVIRONMENT} ${top_builddir}/kadmin/kadmin" +kadmind="${TESTS_ENVIRONMENT} ${top_builddir}/kadmin/kadmind" +kdc="${TESTS_ENVIRONMENT} ${top_builddir}/kdc/kdc" +kdc_tester="${TESTS_ENVIRONMENT} ${top_builddir}/kdc/kdc-tester" +kdestroy="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kdestroy" +kdigest="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kdigest" +kgetcred="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kgetcred" +kimpersonate="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kimpersonate" +kinit="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kinit" +klist="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/heimtools klist" +kpasswd="${TESTS_ENVIRONMENT} ${top_builddir}/kpasswd/kpasswd" +kpasswdd="${TESTS_ENVIRONMENT} ${top_builddir}/kpasswd/kpasswdd" +kswitch="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/heimtools kswitch" +ktutil="${TESTS_ENVIRONMENT} ${top_builddir}/admin/ktutil" +gsstool="${TESTS_ENVIRONMENT} ${top_builddir}/lib/gssapi/gsstool" + +# regression test tools +test_ap_req="${TESTS_ENVIRONMENT} ${top_builddir}/lib/krb5/test_ap-req" +test_canon="${TESTS_ENVIRONMENT} ${top_builddir}/lib/krb5/test_canon" +test_gic="${TESTS_ENVIRONMENT} ${top_builddir}/lib/krb5/test_gic" +test_renew="${TESTS_ENVIRONMENT} ${top_builddir}/lib/krb5/test_renew" +test_ntlm="${TESTS_ENVIRONMENT} ${top_builddir}/lib/gssapi/test_ntlm" +test_context="${TESTS_ENVIRONMENT} ${top_builddir}/lib/gssapi/test_context" +rkpty="${TESTS_ENVIRONMENT} ${top_builddir}/lib/roken/rkpty" +test_set_kvno0="${TESTS_ENVIRONMENT} ${top_builddir}/lib/krb5/test_set_kvno0" +test_alname="${TESTS_ENVIRONMENT} ${top_builddir}/lib/krb5/test_alname" +test_kuserok="${TESTS_ENVIRONMENT} ${top_builddir}/lib/krb5/test_kuserok" + +# misc apps +have_db="${top_builddir}/tests/db/have-db" +leaks_kill="${top_srcdir}/tests/kdc/leaks-kill.sh" +wait_kdc="${top_srcdir}/tests/kdc/wait-kdc.sh" +getpid () { + if [ -f "$HEIM_PIDFILE_DIR/lt-${1}.pid" ]; then + cat "$HEIM_PIDFILE_DIR/lt-${1}.pid" + else + cat "$HEIM_PIDFILE_DIR/${1}.pid" + fi +} + +if [ ! "${NO_AFS}" ] ; then + afs_no_unlog="--no-unlog" + afs_no_afslog="--no-afslog" +else + afs_no_unlog="" + afs_no_afslog="" +fi + +# data +hx509_data="${top_srcdir}/lib/hx509/data" + +# malloc debug +HEIM_MALLOC_DEBUG="MallocStackLoggingNoCompact=1 MallocErrorAbort=1 MallocLogFile=/tmp/heim-malloc-log" diff --git a/crypto/heimdal/tests/can/Makefile.am b/crypto/heimdal/tests/can/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/can/Makefile.am @@ -0,0 +1,58 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +noinst_DATA = krb5.conf mit-pkinit-20070607.cf + +check_SCRIPTS = $(SCRIPT_TESTS) test_can + +SCRIPT_TESTS = check-can +TESTS = $(SCRIPT_TESTS) + +port = 49188 + +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/can,g' \ + -e 's,[@]EGREP[@],$(EGREP),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' + +test_can: test_can.in Makefile + $(do_subst) < $(srcdir)/test_can.in > test_can.tmp + chmod +x test_can.tmp + mv test_can.tmp test_can + +check-can: check-can.in Makefile + $(do_subst) < $(srcdir)/check-can.in > check-can.tmp + chmod +x check-can.tmp + mv check-can.tmp check-can + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +SUFFIXES += .xf .cf + +.xf.cf: + $(do_subst) < $< > $@.tmp + mv $@.tmp $@ + +CLEANFILES= $(TESTS) *.tmp *.cf \ + current-db* \ + krb5.conf \ + messages.log \ + test_can + +EXTRA_DIST = \ + NTMakefile \ + apple-10.4.kadm \ + apple-10.4.req \ + check-can.in \ + heim-0.8.kadm \ + heim-0.8.req \ + krb5.conf.in \ + mit-pkinit-20070607.ca.crt \ + mit-pkinit-20070607.kadm \ + mit-pkinit-20070607.req \ + mit-pkinit-20070607.xf \ + test_can.in diff --git a/crypto/heimdal/tests/can/Makefile.in b/crypto/heimdal/tests/can/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/can/Makefile.in @@ -0,0 +1,1275 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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/can +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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 +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +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__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 .xf .cf +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_DATA = krb5.conf mit-pkinit-20070607.cf +check_SCRIPTS = $(SCRIPT_TESTS) test_can +SCRIPT_TESTS = check-can +TESTS = $(SCRIPT_TESTS) +port = 49188 +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/can,g' \ + -e 's,[@]EGREP[@],$(EGREP),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' + +CLEANFILES = $(TESTS) *.tmp *.cf \ + current-db* \ + krb5.conf \ + messages.log \ + test_can + +EXTRA_DIST = \ + NTMakefile \ + apple-10.4.kadm \ + apple-10.4.req \ + check-can.in \ + heim-0.8.kadm \ + heim-0.8.req \ + krb5.conf.in \ + mit-pkinit-20070607.ca.crt \ + mit-pkinit-20070607.kadm \ + mit-pkinit-20070607.req \ + mit-pkinit-20070607.xf \ + test_can.in + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .xf .cf .c .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/can/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/can/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-can.log: check-can + @p='check-can'; \ + b='check-can'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(DATA) all-local +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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: all all-am all-local check check-TESTS check-am check-local \ + clean clean-generic clean-libtool cscopelist-am ctags-am \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-hook \ + 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ + uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +test_can: test_can.in Makefile + $(do_subst) < $(srcdir)/test_can.in > test_can.tmp + chmod +x test_can.tmp + mv test_can.tmp test_can + +check-can: check-can.in Makefile + $(do_subst) < $(srcdir)/check-can.in > check-can.tmp + chmod +x check-can.tmp + mv check-can.tmp check-can + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +.xf.cf: + $(do_subst) < $< > $@.tmp + mv $@.tmp $@ + +# 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: diff --git a/crypto/heimdal/tests/can/NTMakefile b/crypto/heimdal/tests/can/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/can/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests\can + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/can/apple-10.4.kadm b/crypto/heimdal/tests/can/apple-10.4.kadm new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/can/apple-10.4.kadm @@ -0,0 +1,4 @@ +init --realm-max-ticket-life=1day --realm-max-renewable-life=1month TEST.H5L.SE +cpw -p kaka krbtgt/TEST.H5L.SE@TEST.H5L.SE +add -p foo --use-defaults foo@TEST.H5L.SE +add -p foo --use-defaults bar@TEST.H5L.SE diff --git a/crypto/heimdal/tests/can/apple-10.4.req b/crypto/heimdal/tests/can/apple-10.4.req new file mode 100644 index 0000000000000000000000000000000000000000..7acc80b369d1e0f0f319a11379b0bb2642f1a312 GIT binary patch literal 1199 zc${NkU|@7hUmwQ6#K6G7QV-+-={;GEI}IAQEo5e5WL*R#xRx}oG-zD5fSs9@A)tYQ zVWEHl-vXdG!$NigR%zz6{QO0{(%d1g!6AAcrapSXu8S26R(o0ZO zED@C8H!?6VH!uTYb3+3|uI@bHQ4`nMHn0_JeKe*wzO9dz7@`Z=15%yCfB^gO}&q zOy&$W5}&Yf2!<9nG_(qkLyM_1r-`Z6poysw9$Gw$o0tTFBD_G%2@+*o)WpQV(!}^D zuZi&oFkrucJi-c+;ada>01#N*#2A>^#OMo@_Jl~I`hOAB|BN{O4>W-vsGA!cHIS%k z{KwMx+xAV@Mc4ifGB+MA2x9f=lr?&=^y}(`FY~Uvy*~NP^tWeX!b{^=nnHGQ3a5BX z{j-bvnUj(yujRBompYm(gZ-l~sd4bie$4lYkbR-UAQ{H7)j>S#*b*+Ay|+w)_ml*u zin)|}w!Q0o|N86K47V5EUDqZ(ihdunR=oYJn|Hu{y)_;i79~20HEJFTd77&Bd{1R4 z?|z-=gt@^p`Jb;m^=YC*ccuJ8vnoPkhAC6DP9d zJ3Dj3f^=JtDv5M6U;i4h-dj4VrR!H#KaXn*%znFa0fTd`;lHKq5#`ot<}$lnmd`2U zFK2(I%o`5OlAQ*PZIHBD&r-XS>#9ax=(Y0)cX&v(i7z_pddlX%e)cv^=EbLXE`9Rj zO3)|gaL-H40grC9FZ;Q%W>&QPye*elZmzhm$MEWh)El>ozY5t6PlI+^UQ7S5==RCr z8m}Gewq4));-crn*PD-dcM2%%eH1>iy!O4`l&+^T=dF26mQNrFKf cJh`JMZfNRfgrxqY#3C#y7n)292qjZq0FN /dev/null ; then + rsa=no +fi +if ${hxtool} info | grep 'rand: not available' > /dev/null ; then + rsa=no +fi +if ${kinit} --help 2>&1 | grep "CA certificates" > /dev/null; then + pkinit=yes +fi + +if test "$pkinit" = yes -a "$rsa" = yes ; then + ./test_can HEIMDAL.CITI.UMICH.EDU mit-pkinit-20070607 || exit 1 +fi + +exit 0 diff --git a/crypto/heimdal/tests/can/heim-0.8.kadm b/crypto/heimdal/tests/can/heim-0.8.kadm new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/can/heim-0.8.kadm @@ -0,0 +1,4 @@ +init --realm-max-ticket-life=1day --realm-max-renewable-life=1month TEST.H5L.SE +cpw -p kaka krbtgt/TEST.H5L.SE@TEST.H5L.SE +add -p foo --use-defaults foo@TEST.H5L.SE +add -p foo --use-defaults bar@TEST.H5L.SE diff --git a/crypto/heimdal/tests/can/heim-0.8.req b/crypto/heimdal/tests/can/heim-0.8.req new file mode 100644 index 0000000000000000000000000000000000000000..43b3a68350bce492696dd58717a2013f31e81f8d GIT binary patch literal 1177 zc${NkU|@7hpErp?f`NfSfB_XS0`bhO#%TtPlNT~GF|sZK5?o6f+YB0;7qBz4g4HY( zFyLDN6lYw>Zon$doR*)zh*z3B#5FiX&%@M5FW7alf`J@Ffw+OFG+TC2Qb~FVii)Lz z68uI62IdB42IhvQrWPhfQOntwSk$fh=dX}5kYHjIVqz3zViW+nfQeC@i4kZR6VN=M z5#&ChMOG{pue&R%i?@58^0QeJ zc`a_PjYSp9Z|jRYYr5HOJ~qelru_4@>V27;#3->wMtMb_SiU){+gxwk^3#JYP`IIi zG6PqjFip>CVw!Bw#MBQD7M{gTj6V#T7{37V2aqV^q9(@YEKQ7$^O_j%0|jq`T+9lR z;addrDNv71ViThUP}&3{jq1@w1U(|E?``(pjAI^HW=R z>dC84cXwZuIv8Le9+tax&zD<&*SIceY&B?Xf~3D{mP+kS7S?P3hZ+c(t$3LHELejp zV?(g+zF3nt-U3@I0=K*^_nK)_m@j8?(dST}yM?#bp{++86!Ta)6jB&j_-0Hy+p_7H zx=P+EU3YuE*$*pbR!6a%`UuIoZA7QQ^nbDJP0AUUBtZ!jvKJ zC#od%1}y=jCs)+;oRnAuN}h(6<^~3aKnMolGhxe}Nh40u6CF)d_cVG&AY PltJQhsWvh}6EH6ToiSLr literal 0 Hc$@P9Z;r%RV%hU1W^=ZI!bW>(T)!owKLsC2W*Q!`lI9Y$GyAfJNNP3 z@0>k%5d=YF^hSUH1VOOfZCl;w=NThW2Z>rc3!v;Wx)W3oMp zsGSEn?wB?s%UmXQcZrQwB`l7Nmqw|UtE9;Zs;F3L^y1|5Kp4ObM(jRN;?Bvmq~aO) zs|HsH#ZJKxhQUx677T+!mBE^W<52hu=nw~Bp@ew;VOKZ}pi==V1n3liy3&jQN^ixS zWfk2#kqJ)6QyNJggd{I${Cwpk*91wfk!~6Wbt)sd%P^9gKm)1*k{eAwBRTw8MX^Q0 zjwlyUBsZ9br1Wlb2gv8J11Gb98ykU}#s{HP4rYdHs7z>}{*46oS1MV?1}tvj%<_L~ zRPjO(ie!gCk}ZcMHl5iJ02b;{2_45+p=_F@b(AwJ8RLjRvRY0DlQDQAUVSQBuq|5VQB z=bzpwUNx}(#(S`^A&0-JC>AXmS%jh( z#sb^|=)icL7=ukgf5w=Jc|$J_FOWm043`Bs0{RU@$uMUCI9vt=EDQ#XujGh%xp*XI z>r85Oykv>aq_b#oUAiPnXTc4t4QaFi)y%qHSUg+`W2qQwanT|@j%Ux6$@22@q<Zv&#&Zw|}lEK;3E6czH)t3rhRq9~H&HX9u2Ce{roe2R_^ z8RlFzBDqQzk zlHqx!9=}Scg>-2eD?ju#^U}=%eaAhRoKF1?&7&KFWW}lCxbl6dUk}lrAr1Lkm@%S2 zvfp7=FLqwt(R8wU#>efN8eH8Ged>wV8(;Ejd;~;lZ{@(1h}!(8eS>WyJ)acs^UqQa z4vrY{rtb=8YuxLicYZNBUDb7~w7#8pw&{cE$B+1;UGYN){hDfAR&M{cU_}e=Qrp-t s-D=zU5&GC!1#Rk~{?x*e(iMG|obE1APK5$H1^}|93}DFr^pC>fPaJ=`k^lez literal 0 Hc$@ messages.log +${replay} ${srcdir}/${tst}.req || { cat messages.log ; exit 1; } + +exit 0 diff --git a/crypto/heimdal/tests/db/Makefile.am b/crypto/heimdal/tests/db/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/Makefile.am @@ -0,0 +1,103 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +noinst_DATA = krb5.conf krb5.conf-sqlite krb5.conf-db3 krb5.conf-db1 krb5.conf-lmdb + +noinst_SCRIPTS = have-db + +check_SCRIPTS = loaddump-db add-modify-delete check-dbinfo check-aliases + +TESTS = $(check_SCRIPTS) + +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]top_builddir[@],$(top_builddir),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/db,g' \ + -e 's,[@]default_db_type[@],$(db_type),g' \ + -e 's,[@]db_type_preference[@],$(db_type_preference),g' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +loaddump-db: loaddump-db.in Makefile + $(do_subst) < $(srcdir)/loaddump-db.in > loaddump-db.tmp + chmod +x loaddump-db.tmp + mv loaddump-db.tmp loaddump-db + +add-modify-delete: add-modify-delete.in Makefile + $(do_subst) < $(srcdir)/add-modify-delete.in > add-modify-delete.tmp + chmod +x add-modify-delete.tmp + mv add-modify-delete.tmp add-modify-delete + +check-dbinfo: check-dbinfo.in Makefile + $(do_subst) < $(srcdir)/check-dbinfo.in > check-dbinfo.tmp + chmod +x check-dbinfo.tmp + mv check-dbinfo.tmp check-dbinfo + +check-aliases: check-aliases.in Makefile + $(do_subst) < $(srcdir)/check-aliases.in > check-aliases.tmp + chmod +x check-aliases.tmp + mv check-aliases.tmp check-aliases + +have-db: have-db.in Makefile + $(do_subst) < $(srcdir)/have-db.in > have-db.tmp + chmod +x have-db.tmp + mv have-db.tmp have-db + +krb5.conf: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],,g' < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +krb5.conf-sqlite: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],sqlite:,g' < $(srcdir)/krb5.conf.in > krb5.conf-sqlite.tmp + mv krb5.conf-sqlite.tmp krb5.conf-sqlite + +krb5.conf-db3: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],db3:,g' < $(srcdir)/krb5.conf.in > krb5.conf-db3.tmp + mv krb5.conf-db3.tmp krb5.conf-db3 + +krb5.conf-db1: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],db1:,g' < $(srcdir)/krb5.conf.in > krb5.conf-db1.tmp + mv krb5.conf-db1.tmp krb5.conf-db1 + +krb5.conf-lmdb: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],lmdb:,g' < $(srcdir)/krb5.conf.in > krb5.conf-lmdb.tmp + mv krb5.conf-lmdb.tmp krb5.conf-lmdb + +krb5-mit.conf: krb5-mit.conf.in Makefile + $(do_subst) < $(srcdir)/krb5-mit.conf.in > krb5-mit.conf.tmp + mv krb5-mit.conf.tmp krb5-mit.conf + + +CLEANFILES= \ + $(TESTS) \ + have-db \ + db-dump* \ + dbinfo.out \ + current-db* \ + out-text-dump* \ + out-current-* \ + mkey.file* \ + krb5.conf krb5.conf.tmp \ + krb5.conf-sqlite krb5.conf-sqlite.tmp \ + krb5.conf-db3 krb5.conf-db3.tmp \ + krb5.conf-db1 krb5.conf-db1.tmp \ + krb5.conf-lmdb krb5.conf-lmdb.tmp \ + krb5-mit.conf krb5-mit.conf.tmp \ + tempfile \ + log.current-db* \ + heimdal-db* \ + messages.log + +EXTRA_DIST = \ + NTMakefile \ + check-aliases.in \ + check-dbinfo.in \ + loaddump-db.in \ + add-modify-delete.in \ + have-db.in \ + krb5.conf.in \ + krb5-mit.conf.in \ + text-dump-0.7 \ + text-dump-known-ext \ + text-dump-no-ext \ + text-dump-unknown-ext + diff --git a/crypto/heimdal/tests/db/Makefile.in b/crypto/heimdal/tests/db/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/Makefile.in @@ -0,0 +1,1343 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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/db +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SCRIPTS = $(noinst_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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 +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +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__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_DATA = krb5.conf krb5.conf-sqlite krb5.conf-db3 krb5.conf-db1 krb5.conf-lmdb +noinst_SCRIPTS = have-db +check_SCRIPTS = loaddump-db add-modify-delete check-dbinfo check-aliases +TESTS = $(check_SCRIPTS) +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]top_builddir[@],$(top_builddir),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/db,g' \ + -e 's,[@]default_db_type[@],$(db_type),g' \ + -e 's,[@]db_type_preference[@],$(db_type_preference),g' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +CLEANFILES = \ + $(TESTS) \ + have-db \ + db-dump* \ + dbinfo.out \ + current-db* \ + out-text-dump* \ + out-current-* \ + mkey.file* \ + krb5.conf krb5.conf.tmp \ + krb5.conf-sqlite krb5.conf-sqlite.tmp \ + krb5.conf-db3 krb5.conf-db3.tmp \ + krb5.conf-db1 krb5.conf-db1.tmp \ + krb5.conf-lmdb krb5.conf-lmdb.tmp \ + krb5-mit.conf krb5-mit.conf.tmp \ + tempfile \ + log.current-db* \ + heimdal-db* \ + messages.log + +EXTRA_DIST = \ + NTMakefile \ + check-aliases.in \ + check-dbinfo.in \ + loaddump-db.in \ + add-modify-delete.in \ + have-db.in \ + krb5.conf.in \ + krb5-mit.conf.in \ + text-dump-0.7 \ + text-dump-known-ext \ + text-dump-no-ext \ + text-dump-unknown-ext + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/db/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/db/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +loaddump-db.log: loaddump-db + @p='loaddump-db'; \ + b='loaddump-db'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +add-modify-delete.log: add-modify-delete + @p='add-modify-delete'; \ + b='add-modify-delete'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-dbinfo.log: check-dbinfo + @p='check-dbinfo'; \ + b='check-dbinfo'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-aliases.log: check-aliases + @p='check-aliases'; \ + b='check-aliases'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(SCRIPTS) $(DATA) all-local +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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: all all-am all-local check check-TESTS check-am check-local \ + clean clean-generic clean-libtool cscopelist-am ctags-am \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-hook \ + 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ + uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +loaddump-db: loaddump-db.in Makefile + $(do_subst) < $(srcdir)/loaddump-db.in > loaddump-db.tmp + chmod +x loaddump-db.tmp + mv loaddump-db.tmp loaddump-db + +add-modify-delete: add-modify-delete.in Makefile + $(do_subst) < $(srcdir)/add-modify-delete.in > add-modify-delete.tmp + chmod +x add-modify-delete.tmp + mv add-modify-delete.tmp add-modify-delete + +check-dbinfo: check-dbinfo.in Makefile + $(do_subst) < $(srcdir)/check-dbinfo.in > check-dbinfo.tmp + chmod +x check-dbinfo.tmp + mv check-dbinfo.tmp check-dbinfo + +check-aliases: check-aliases.in Makefile + $(do_subst) < $(srcdir)/check-aliases.in > check-aliases.tmp + chmod +x check-aliases.tmp + mv check-aliases.tmp check-aliases + +have-db: have-db.in Makefile + $(do_subst) < $(srcdir)/have-db.in > have-db.tmp + chmod +x have-db.tmp + mv have-db.tmp have-db + +krb5.conf: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],,g' < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +krb5.conf-sqlite: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],sqlite:,g' < $(srcdir)/krb5.conf.in > krb5.conf-sqlite.tmp + mv krb5.conf-sqlite.tmp krb5.conf-sqlite + +krb5.conf-db3: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],db3:,g' < $(srcdir)/krb5.conf.in > krb5.conf-db3.tmp + mv krb5.conf-db3.tmp krb5.conf-db3 + +krb5.conf-db1: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],db1:,g' < $(srcdir)/krb5.conf.in > krb5.conf-db1.tmp + mv krb5.conf-db1.tmp krb5.conf-db1 + +krb5.conf-lmdb: krb5.conf.in Makefile + $(do_subst) -e 's,[@]type[@],lmdb:,g' < $(srcdir)/krb5.conf.in > krb5.conf-lmdb.tmp + mv krb5.conf-lmdb.tmp krb5.conf-lmdb + +krb5-mit.conf: krb5-mit.conf.in Makefile + $(do_subst) < $(srcdir)/krb5-mit.conf.in > krb5-mit.conf.tmp + mv krb5-mit.conf.tmp krb5-mit.conf + +# 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: diff --git a/crypto/heimdal/tests/db/NTMakefile b/crypto/heimdal/tests/db/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests\db + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/db/add-modify-delete.in b/crypto/heimdal/tests/db/add-modify-delete.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/add-modify-delete.in @@ -0,0 +1,140 @@ +#!/bin/sh +# +# Copyright (c) 2006 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +srcdir="@srcdir@" +objdir="@objdir@" +EGREP="@EGREP@" + +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + +# If there is no useful db support compiled in, disable test +./have-db || exit 77 + +R=EXAMPLE.ORG + +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +iproplog="${TESTS_ENVIRONMENT} ../../lib/kadm5/iprop-log" + +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" +export KRB5_CONFIG + +rm -f current-db* +rm -f log.current-db* +rm -f out-* +rm -f mkey.file* + +echo init database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + EXAMPLE.ORG || exit 1 + +echo test add +${kadmin} add -r --use-defaults foo || exit 1 +${kadmin} list '*' > /dev/null || exit 1 +${kadmin} list '*' | ${EGREP} '^foo$' > /dev/null || exit 1 + +echo "test add (double)" +${kadmin} add -r --use-defaults foo 2>/dev/null && exit 1 + +echo test rename +${kadmin} rename foo bar +${kadmin} list '*' | ${EGREP} '^foo$' > /dev/null && exit 1 +${kadmin} list '*' | ${EGREP} '^bar$' > /dev/null || exit 1 + +echo test delete +${kadmin} delete bar || exit 1 +${kadmin} list '*' | ${EGREP} '^bar$' > /dev/null && exit 1 + +echo "test delete (double)" +${kadmin} delete bar 2> /dev/null && exit 1 + +echo "creating sample user" +${kadmin} add -r --use-defaults foo || exit 1 +${kadmin} get foo > tempfile || exit 1 +echo checking principal +${EGREP} " *Principal: foo@EXAMPLE.ORG$" tempfile > /dev/null || exit 1 +echo checking kvno +${EGREP} " *Kvno: 1$" tempfile > /dev/null || exit 1 +echo checking failed login count +${EGREP} " *Failed login count: 0$" tempfile > /dev/null || exit 1 +echo checking modifier +${EGREP} " *Modifier: kadmin/admin@EXAMPLE.ORG$" tempfile > /dev/null || exit 1 +echo checking attributes +${EGREP} " *Attributes: $" tempfile > /dev/null || exit 1 +echo checking renew time +${EGREP} " *Max renewable life: 1 week$" tempfile > /dev/null || exit 1 + +echo modifing renewable-life +${kadmin} modify --max-renewable-life=2months foo +echo checking renew time +${kadmin} get foo > tempfile || exit 1 +${EGREP} " *Max renewable life: 2 months$" tempfile > /dev/null || exit 1 + +echo "creating sample server" +${kadmin} add -r --use-defaults host/datan.example.org || exit 1 +${kadmin} get host/datan.example.org > tempfile || exit 1 +echo checking principal +${EGREP} " *Principal: host/datan.example.org@EXAMPLE.ORG$" tempfile > /dev/null || exit 1 +echo checking kvno +${EGREP} " *Kvno: 1$" tempfile > /dev/null || exit 1 + +echo "iprop-log dump" +${iproplog} dump > /dev/null || exit 1 +echo "iprop-log last-version" +${iproplog} last-version > /dev/null || exit 1 + +echo "check iprop replay" + +${kadmin} dump out-current-db || exit 1 +sort out-current-db > out-current-db-sort + +rm -f current-db* + +echo "replaying" +${iproplog} replay > /dev/null || exit 1 + +${kadmin} dump out-current-db2 || exit 1 +sort out-current-db2 > out-current-db2-sort + +# XXX database should really be the same afterward... :( +# cmp out-current-db-sort out-current-db2-sort || exit 1 + + + +exit 0 diff --git a/crypto/heimdal/tests/db/check-aliases.in b/crypto/heimdal/tests/db/check-aliases.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/check-aliases.in @@ -0,0 +1,113 @@ +#!/bin/sh +# +# Copyright (c) 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +srcdir="@srcdir@" +objdir="@objdir@" +EGREP="@EGREP@" + +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + +testfailed="echo test failed; cat messages.log; exit 1" + +# If there is no useful db support compiled in, disable test +../db/have-db || exit 77 + +R=TEST.H5L.SE + +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l" + +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" +export KRB5_CONFIG + +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +echo "Adding foo" +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} modify --alias=foo-alias1@${R} --alias=foo-alias2@${R} foo@${R} || exit 1 + +echo "Adding bar" +${kadmin} add -p foo --use-defaults bar@${R} || exit 1 +${kadmin} modify --alias=bar-alias1@${R} bar@${R} || exit 1 + +echo "Baz does not exists" + +echo "Checking dup keys" +${kadmin} modify --alias=foo-alias1@${R} bar@${R} 2>/dev/null && exit 1 +${kadmin} modify --alias=foo@${R} bar@${R} 2>/dev/null && exit 1 +${kadmin} modify --alias=foo@${R} baz@${R} 2>/dev/null && exit 1 + +echo "Rename over dup key" +${kadmin} rename bar${R} foo-alias1${R} 2>/dev/null && exit 1 +${kadmin} rename bar${R} foo${R} 2>/dev/null && exit 1 +${kadmin} rename baz${R} foo-alias1${R} 2>/dev/null && exit 1 +${kadmin} rename baz${R} foo${R} 2>/dev/null && exit 1 + +echo "Delete alias" +${kadmin} delete foo-alias1${R} 2>/dev/null && exit 1 +${kadmin} delete bar-alias1${R} 2>/dev/null && exit 1 +${kadmin} delete baz-alias1${R} 2>/dev/null && exit 1 + +echo "Delete" +${kadmin} delete bar@${R} || exit 1 +${kadmin} delete bar@${R} 2>/dev/null && exit 1 +${kadmin} delete baz@${R} 2>/dev/null && exit 1 + +echo "Add alias to deleted name" +${kadmin} modify --alias=bar-alias1@${R} foo@${R} || exit 1 +${kadmin} modify --alias=bar@${R} foo@${R} || exit 1 +${kadmin} modify --alias=bar@${R} --alias=baz@${R} foo@${R} || exit 1 + +echo "Rename over self alias key" +${kadmin} rename foo@${R} foo-alias1@${R} 2>/dev/null && exit 1 +${kadmin} modify --alias= foo@${R} || exit 1 +${kadmin} rename foo@${R} foo-alias1@${R} || exit 1 +${kadmin} modify --alias=foo foo-alias1@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + + +exit $ec diff --git a/crypto/heimdal/tests/db/check-dbinfo.in b/crypto/heimdal/tests/db/check-dbinfo.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/check-dbinfo.in @@ -0,0 +1,52 @@ +#!/bin/sh +# +# Copyright (c) 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +srcdir="@srcdir@" +objdir="@objdir@" + +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" +export KRB5_CONFIG + +../../lib/hdb/test_dbinfo > dbinfo.out || exit 1 + +../../lib/hdb/test_mkey --mkey-file="${srcdir}/../../lib/hdb/data-mkey.mit.des3.le" || exit 1 +../../lib/hdb/test_mkey --mkey-file="${srcdir}/../../lib/hdb/data-mkey.mit.des3.be" || exit 1 + + +exit 0 diff --git a/crypto/heimdal/tests/db/have-db.in b/crypto/heimdal/tests/db/have-db.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/have-db.in @@ -0,0 +1,72 @@ +#!/bin/sh +# +# Copyright (c) 2006 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +top_builddir="@top_builddir@" + +. ${top_builddir}/tests/bin/setup-env + +if [ $# != 0 ]; then + for type in "$@"; do + for have_type in \ + `${kdc} --builtin-hdb | sed 's/^builtin hdb backends: //'`; do + if [ "$type" = "$have_type" ]; then + exit 0 + fi + done + done + exit 1 +fi + +list=`${kdc} --builtin-hdb | sed 's/^builtin hdb backends: //'` +oldIFS="$IFS" +IPS=, +set - ${list} +IFS="$oldIFS" + +while [ $# != 0 ] ; do + case $1 in + db:*) exit 0 ;; + db1:*) exit 0 ;; + gdbm:*) exit 0 ;; + db4:*) exit 0 ;; + db3:*) exit 0 ;; + lmdb:*) exit 0 ;; + sqlite:*) exit 0 ;; + esac + shift +done + +exit 1 diff --git a/crypto/heimdal/tests/db/krb5-mit.conf.in b/crypto/heimdal/tests/db/krb5-mit.conf.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/krb5-mit.conf.in @@ -0,0 +1,18 @@ +[libdefaults] + default_realm = EXAMPLE.ORG + +[kdc] + database = { + label = { + realm = EXAMPLE.ORG + dbname = mit-db:@srcdir@/mit-db + mkey_file = @srcdir@/mit-db-master-stash + log_file = @objdir@/current.log + } + } + +[hdb] + db-dir = @objdir@ + +[logging] + default = 0-/FILE:@objdir@/messages.log diff --git a/crypto/heimdal/tests/db/krb5.conf.in b/crypto/heimdal/tests/db/krb5.conf.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/krb5.conf.in @@ -0,0 +1,32 @@ +[libdefaults] + default_realm = EXAMPLE.ORG + +[realms] + EXAMPLE.ORG = { + kdc = localhost + } + +[kdc] + database = { + label = { + realm = LABEL.TEST.H5L.SE + dbname = @type@@objdir@/label-db + mkey_file = @objdir@/mkey.file + log_file = @objdir@/current.log + } + label2 = { + dbname = @type@@objdir@/lable2-db + realm = LABEL2.TEST.H5L.SE + mkey_file = @objdir@/mkey2.file + log_file = @objdir@/current.log + } + dbname = @type@@objdir@/current-db + realm = EXAMPLE.ORG + mkey_file = @objdir@/mkey.file + } + +[hdb] + db-dir = @objdir@ + +[logging] + default = 0-/FILE:@objdir@/messages.log diff --git a/crypto/heimdal/tests/db/loaddump-db.in b/crypto/heimdal/tests/db/loaddump-db.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/loaddump-db.in @@ -0,0 +1,134 @@ +#!/bin/sh +# +# Copyright (c) 2005 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +srcdir="@srcdir@" +objdir="@objdir@" + +# If there is no useful db support compiled in, disable test +./have-db || exit 77 + +R=EXAMPLE.ORG + +kadmin="../../kadmin/kadmin -l -r $R" +kstash="../../kdc/kstash" +hprop="../../kdc/hprop" +hpropd="../../kdc/hpropd" + +default_db_type=@default_db_type@ +db_type=${1:-${default_db_type}} + +propdb="${hprop} --database=${db_type}:./current-db -n" +propddb="${hpropd} --database=${db_type}:./current-db -n" + +KRB5_CONFIG="${objdir}/krb5.conf-${db_type}" +export KRB5_CONFIG + +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + EXAMPLE.ORG || exit 1 + +# check that we can dump and load ourself +${kadmin} dump out-current-db || exit 1 +sort out-current-db > out-current-db-sort +${kadmin} load out-current-db || exit 1 +${kadmin} dump out-current-db2 || exit 1 +sort out-current-db2 > out-current-db2-sort +cmp out-current-db-sort out-current-db2-sort || exit 1 + +rm -f current-db* + +# check with no extensions +${kadmin} load ${srcdir}/text-dump-0.7 || exit 1 +${propdb} > db-dump.tmp|| exit 1 +rm -f current-db* +${propddb} < db-dump.tmp || exit 1 +${kadmin} dump | sort | sed 's/[0-9]* -$//' > out-text-dump-0.7 || exit 1 +sort < ${srcdir}/text-dump-0.7 | \ + sed 's/[0-9]*$//' > out-text-dump-0.7-orig || exit 1 +cmp out-text-dump-0.7-orig out-text-dump-0.7 || exit 1 + +# check with no extensions +${kadmin} load ${srcdir}/text-dump-no-ext || exit 1 +${propdb} > db-dump.tmp || exit 1 +${propddb} < db-dump.tmp || exit 1 +${kadmin} dump | sort | \ + awk '{$11=""; print;}' > out-text-dump-no-ext || exit 1 +sort < ${srcdir}/text-dump-no-ext | \ + awk '{$11=""; print;}' > out-text-dump-no-ext-orig || exit 1 +cmp out-text-dump-no-ext-orig out-text-dump-no-ext || exit 1 + +# check with known extensions +${kadmin} load ${srcdir}/text-dump-known-ext || exit 1 +${propdb} > db-dump.tmp || exit 1 +${propddb} < db-dump.tmp || exit 1 +${kadmin} dump | sort | \ + awk '{$11=""; print;}' > out-text-dump-known-ext || exit 1 +sort < ${srcdir}/text-dump-known-ext | \ + awk '{$11=""; print;}' > out-text-dump-known-ext-orig || exit 1 +cmp out-text-dump-known-ext-orig out-text-dump-known-ext || exit 1 + +# check with unknown extensions +${kadmin} load ${srcdir}/text-dump-unknown-ext || exit 1 +${propdb} > db-dump.tmp || exit 1 +${propddb} < db-dump.tmp || exit 1 +${kadmin} dump | sort | \ + awk '{$11=""; print;}' > out-text-dump-unknown-ext || exit 1 +sort < ${srcdir}/text-dump-unknown-ext | \ + awk '{$11=""; print;}' > out-text-dump-unknown-ext-orig || exit 1 +cmp out-text-dump-unknown-ext-orig out-text-dump-unknown-ext || exit 1 + +${kstash} -e aes256-cts-hmac-sha1-96 --random-key -k ./mkey.file >/dev/null 2>/dev/null || exit 1 + +# remove masterkey +${kadmin} load ${srcdir}/text-dump-0.7 || exit 1 +${propdb} > db-dump.tmp|| exit 1 +${propddb} < db-dump.tmp || exit 1 +${propdb} -m mkey.file -D > db-dump.tmp || exit 1 +mv mkey.file mkey.file.no || exit 1 +${propddb} < db-dump.tmp || exit 1 +${kadmin} dump | sort | \ + awk '{$11=""; print;}' > out-text-dump-0.7 || exit 1 +sort < ${srcdir}/text-dump-unknown-ext | \ + awk '{$11=""; print;}' > out-text-dump-0.7-orig || exit 1 +cmp out-text-dump-0.7 out-text-dump-0.7-orig || exit 1 + +exit 0 diff --git a/crypto/heimdal/tests/db/text-dump-0.7 b/crypto/heimdal/tests/db/text-dump-0.7 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/text-dump-0.7 @@ -0,0 +1,7 @@ +changepw/kerberos@EXAMPLE.ORG 1::3:2376E6A4C1D5456D:-::2:2376E6A4C1D5456D:-::1:2376E6A4C1D5456D:-::18:39C3D293A6B0CEE734C7874764A8B5449F348AC00A6EA94F7451D07BE31EF239:-::16:108373F74F105875DCCE866B160886C7BC6780E526D0DAEA:-::23:D279B73431AA349F63594EA800397195:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 639 20050728203748:743456:2 +default@EXAMPLE.ORG 0::3:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::2:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::1:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::18:AF401411D3F29C204611A9BA1EF54AEDEC43A01B0123C57B994B2EE104E7F127:3/"EXAMPLE.ORGdefault"::16:02401CAD7A92760E464025760BCD3BE5DF616DD5A798C719:3/"EXAMPLE.ORGdefault"::23:31D6CFE0D16AE931B73C59D7E0C089C0:3/"EXAMPLE.ORGdefault" 20050728203748:kadmin/admin@EXAMPLE.ORG - - - - 86400 604800 254 20050728203748:863727:0 +kadmin/admin@EXAMPLE.ORG 1::3:2FCD23DCC2C726CE:-::2:2FCD23DCC2C726CE:-::1:2FCD23DCC2C726CE:-::18:1675F5E5BAD61428DE51F7C8EDCD53F23426D90F4F0BB4F9C73514D317E0482A:-::16:C79D6B0879B6ABADCE4A9B436B5B4A4F792679CDBC7F5D10:-::23:265C712FED225A85567BAF8CD9A4C4ED:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 382 20050728203748:682995:2 +kadmin/changepw@EXAMPLE.ORG 1::3:57A132CB9D7F4F37:-::2:57A132CB9D7F4F37:-::1:57A132CB9D7F4F37:-::18:B8252C9E3EC99969053631C238BBF88A0AAA082A8F1C4ED8D1729170C79519B8:-::16:10CE89987A1FD0986E6D836DB3F473E04C648C34F17CBCE3:-::23:A6D2BCA6F54B1C1AA5E875F116EEDE82:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 300 300 867 20050728203748:623022:2 +kadmin/hprop@EXAMPLE.ORG 1::3:76DC5751EFE52931:-::2:76DC5751EFE52931:-::1:76DC5751EFE52931:-::18:9B4D02F7D74790AB929E607BE5940CFF66801C237840EE968FDEFD7ED1387350:-::16:4CD575703D197F2991D5233704BAE379DF4FFBE616256762:-::23:E3D49F7E3462823492F33FAD8F0A754F:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 383 20050728203748:803541:2 +krbtgt/EXAMPLE.ORG@EXAMPLE.ORG 1::3:C219830E0E73DCEC:-::2:C219830E0E73DCEC:-::1:C219830E0E73DCEC:-::18:56CD702EE58B6EF4CAF758DA0BA1B92B21EFC1D2E9FCC0785009BC391F8571B8:-::16:29E9A2F45B2561D5B592C1070708B94A894AE046D091CE7C:-::23:30A2FB86CDC17B4EC625DC66C47AAF37:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 86400 2592000 126 20050728203748:560639:2 +lha@EXAMPLE.ORG 1::3:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::2:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::1:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::18:96653BEA5A46E5DF97D535C6C49F007E02F0E56B21F498C14F8C014871FE9889:3/"EXAMPLE.ORGlha"::16:7545202640A81304AE987F231FCB1F625D02CE7FF8A4ABEA:3/"EXAMPLE.ORGlha"::23:AC8E657F83DF82BEEA5D43BDAF7800CC:3/"EXAMPLE.ORGlha" 20050728203752:kadmin/admin@EXAMPLE.ORG 20050728203758:kadmin/admin@EXAMPLE.ORG - - - 86400 604800 126 20050728203752:988968:1 diff --git a/crypto/heimdal/tests/db/text-dump-known-ext b/crypto/heimdal/tests/db/text-dump-known-ext new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/text-dump-known-ext @@ -0,0 +1,7 @@ +changepw/kerberos@EXAMPLE.ORG 1::3:2376E6A4C1D5456D:-::2:2376E6A4C1D5456D:-::1:2376E6A4C1D5456D:-::18:39C3D293A6B0CEE734C7874764A8B5449F348AC00A6EA94F7451D07BE31EF239:-::16:108373F74F105875DCCE866B160886C7BC6780E526D0DAEA:-::23:D279B73431AA349F63594EA800397195:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 639 20050728203748:743456:2 - +default@EXAMPLE.ORG 0::3:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::2:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::1:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::18:AF401411D3F29C204611A9BA1EF54AEDEC43A01B0123C57B994B2EE104E7F127:3/"EXAMPLE.ORGdefault"::16:02401CAD7A92760E464025760BCD3BE5DF616DD5A798C719:3/"EXAMPLE.ORGdefault"::23:31D6CFE0D16AE931B73C59D7E0C089C0:3/"EXAMPLE.ORGdefault" 20050728203748:kadmin/admin@EXAMPLE.ORG - - - - 86400 604800 254 20050728203748:863727:0 - +kadmin/admin@EXAMPLE.ORG 1::3:2FCD23DCC2C726CE:-::2:2FCD23DCC2C726CE:-::1:2FCD23DCC2C726CE:-::18:1675F5E5BAD61428DE51F7C8EDCD53F23426D90F4F0BB4F9C73514D317E0482A:-::16:C79D6B0879B6ABADCE4A9B436B5B4A4F792679CDBC7F5D10:-::23:265C712FED225A85567BAF8CD9A4C4ED:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 382 20050728203748:682995:2 - +kadmin/changepw@EXAMPLE.ORG 1::3:57A132CB9D7F4F37:-::2:57A132CB9D7F4F37:-::1:57A132CB9D7F4F37:-::18:B8252C9E3EC99969053631C238BBF88A0AAA082A8F1C4ED8D1729170C79519B8:-::16:10CE89987A1FD0986E6D836DB3F473E04C648C34F17CBCE3:-::23:A6D2BCA6F54B1C1AA5E875F116EEDE82:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 300 300 867 20050728203748:623022:2 - +kadmin/hprop@EXAMPLE.ORG 1::3:76DC5751EFE52931:-::2:76DC5751EFE52931:-::1:76DC5751EFE52931:-::18:9B4D02F7D74790AB929E607BE5940CFF66801C237840EE968FDEFD7ED1387350:-::16:4CD575703D197F2991D5233704BAE379DF4FFBE616256762:-::23:E3D49F7E3462823492F33FAD8F0A754F:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 383 20050728203748:803541:2 - +krbtgt/EXAMPLE.ORG@EXAMPLE.ORG 1::3:C219830E0E73DCEC:-::2:C219830E0E73DCEC:-::1:C219830E0E73DCEC:-::18:56CD702EE58B6EF4CAF758DA0BA1B92B21EFC1D2E9FCC0785009BC391F8571B8:-::16:29E9A2F45B2561D5B592C1070708B94A894AE046D091CE7C:-::23:30A2FB86CDC17B4EC625DC66C47AAF37:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 86400 2592000 126 20050728203748:560639:2 - +lha@EXAMPLE.ORG 1::3:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::2:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::1:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::18:96653BEA5A46E5DF97D535C6C49F007E02F0E56B21F498C14F8C014871FE9889:3/"EXAMPLE.ORGlha"::16:7545202640A81304AE987F231FCB1F625D02CE7FF8A4ABEA:3/"EXAMPLE.ORGlha"::23:AC8E657F83DF82BEEA5D43BDAF7800CC:3/"EXAMPLE.ORGlha" 20050728203752:kadmin/admin@EXAMPLE.ORG 20050728203758:kadmin/admin@EXAMPLE.ORG - - - 86400 604800 126 20050728203752:988968:1 - diff --git a/crypto/heimdal/tests/db/text-dump-no-ext b/crypto/heimdal/tests/db/text-dump-no-ext new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/text-dump-no-ext @@ -0,0 +1,7 @@ +changepw/kerberos@EXAMPLE.ORG 1::3:2376E6A4C1D5456D:-::2:2376E6A4C1D5456D:-::1:2376E6A4C1D5456D:-::18:39C3D293A6B0CEE734C7874764A8B5449F348AC00A6EA94F7451D07BE31EF239:-::16:108373F74F105875DCCE866B160886C7BC6780E526D0DAEA:-::23:D279B73431AA349F63594EA800397195:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 639 20050728203748:743456:2 - +default@EXAMPLE.ORG 0::3:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::2:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::1:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::18:AF401411D3F29C204611A9BA1EF54AEDEC43A01B0123C57B994B2EE104E7F127:3/"EXAMPLE.ORGdefault"::16:02401CAD7A92760E464025760BCD3BE5DF616DD5A798C719:3/"EXAMPLE.ORGdefault"::23:31D6CFE0D16AE931B73C59D7E0C089C0:3/"EXAMPLE.ORGdefault" 20050728203748:kadmin/admin@EXAMPLE.ORG - - - - 86400 604800 254 20050728203748:863727:0 - +kadmin/admin@EXAMPLE.ORG 1::3:2FCD23DCC2C726CE:-::2:2FCD23DCC2C726CE:-::1:2FCD23DCC2C726CE:-::18:1675F5E5BAD61428DE51F7C8EDCD53F23426D90F4F0BB4F9C73514D317E0482A:-::16:C79D6B0879B6ABADCE4A9B436B5B4A4F792679CDBC7F5D10:-::23:265C712FED225A85567BAF8CD9A4C4ED:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 382 20050728203748:682995:2 - +kadmin/changepw@EXAMPLE.ORG 1::3:57A132CB9D7F4F37:-::2:57A132CB9D7F4F37:-::1:57A132CB9D7F4F37:-::18:B8252C9E3EC99969053631C238BBF88A0AAA082A8F1C4ED8D1729170C79519B8:-::16:10CE89987A1FD0986E6D836DB3F473E04C648C34F17CBCE3:-::23:A6D2BCA6F54B1C1AA5E875F116EEDE82:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 300 300 867 20050728203748:623022:2 - +kadmin/hprop@EXAMPLE.ORG 1::3:76DC5751EFE52931:-::2:76DC5751EFE52931:-::1:76DC5751EFE52931:-::18:9B4D02F7D74790AB929E607BE5940CFF66801C237840EE968FDEFD7ED1387350:-::16:4CD575703D197F2991D5233704BAE379DF4FFBE616256762:-::23:E3D49F7E3462823492F33FAD8F0A754F:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 383 20050728203748:803541:2 - +krbtgt/EXAMPLE.ORG@EXAMPLE.ORG 1::3:C219830E0E73DCEC:-::2:C219830E0E73DCEC:-::1:C219830E0E73DCEC:-::18:56CD702EE58B6EF4CAF758DA0BA1B92B21EFC1D2E9FCC0785009BC391F8571B8:-::16:29E9A2F45B2561D5B592C1070708B94A894AE046D091CE7C:-::23:30A2FB86CDC17B4EC625DC66C47AAF37:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 86400 2592000 126 20050728203748:560639:2 - +lha@EXAMPLE.ORG 1::3:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::2:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::1:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::18:96653BEA5A46E5DF97D535C6C49F007E02F0E56B21F498C14F8C014871FE9889:3/"EXAMPLE.ORGlha"::16:7545202640A81304AE987F231FCB1F625D02CE7FF8A4ABEA:3/"EXAMPLE.ORGlha"::23:AC8E657F83DF82BEEA5D43BDAF7800CC:3/"EXAMPLE.ORGlha" 20050728203752:kadmin/admin@EXAMPLE.ORG 20050728203758:kadmin/admin@EXAMPLE.ORG - - - 86400 604800 126 20050728203752:988968:1 - diff --git a/crypto/heimdal/tests/db/text-dump-unknown-ext b/crypto/heimdal/tests/db/text-dump-unknown-ext new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/db/text-dump-unknown-ext @@ -0,0 +1,7 @@ +changepw/kerberos@EXAMPLE.ORG 1::3:2376E6A4C1D5456D:-::2:2376E6A4C1D5456D:-::1:2376E6A4C1D5456D:-::18:39C3D293A6B0CEE734C7874764A8B5449F348AC00A6EA94F7451D07BE31EF239:-::16:108373F74F105875DCCE866B160886C7BC6780E526D0DAEA:-::23:D279B73431AA349F63594EA800397195:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 639 20050728203748:743456:2 - +default@EXAMPLE.ORG 0::3:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::2:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::1:3B2A671585E93D6B:3/"EXAMPLE.ORGdefault"::18:AF401411D3F29C204611A9BA1EF54AEDEC43A01B0123C57B994B2EE104E7F127:3/"EXAMPLE.ORGdefault"::16:02401CAD7A92760E464025760BCD3BE5DF616DD5A798C719:3/"EXAMPLE.ORGdefault"::23:31D6CFE0D16AE931B73C59D7E0C089C0:3/"EXAMPLE.ORGdefault" 20050728203748:kadmin/admin@EXAMPLE.ORG - - - - 86400 604800 254 20050728203748:863727:0 - +kadmin/admin@EXAMPLE.ORG 1::3:2FCD23DCC2C726CE:-::2:2FCD23DCC2C726CE:-::1:2FCD23DCC2C726CE:-::18:1675F5E5BAD61428DE51F7C8EDCD53F23426D90F4F0BB4F9C73514D317E0482A:-::16:C79D6B0879B6ABADCE4A9B436B5B4A4F792679CDBC7F5D10:-::23:265C712FED225A85567BAF8CD9A4C4ED:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 382 20050728203748:682995:2 - +kadmin/changepw@EXAMPLE.ORG 1::3:57A132CB9D7F4F37:-::2:57A132CB9D7F4F37:-::1:57A132CB9D7F4F37:-::18:B8252C9E3EC99969053631C238BBF88A0AAA082A8F1C4ED8D1729170C79519B8:-::16:10CE89987A1FD0986E6D836DB3F473E04C648C34F17CBCE3:-::23:A6D2BCA6F54B1C1AA5E875F116EEDE82:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 300 300 867 20050728203748:623022:2 - +kadmin/hprop@EXAMPLE.ORG 1::3:76DC5751EFE52931:-::2:76DC5751EFE52931:-::1:76DC5751EFE52931:-::18:9B4D02F7D74790AB929E607BE5940CFF66801C237840EE968FDEFD7ED1387350:-::16:4CD575703D197F2991D5233704BAE379DF4FFBE616256762:-::23:E3D49F7E3462823492F33FAD8F0A754F:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 3600 3600 383 20050728203748:803541:2 - +krbtgt/EXAMPLE.ORG@EXAMPLE.ORG 1::3:C219830E0E73DCEC:-::2:C219830E0E73DCEC:-::1:C219830E0E73DCEC:-::18:56CD702EE58B6EF4CAF758DA0BA1B92B21EFC1D2E9FCC0785009BC391F8571B8:-::16:29E9A2F45B2561D5B592C1070708B94A894AE046D091CE7C:-::23:30A2FB86CDC17B4EC625DC66C47AAF37:- 20050728203748:kadmin/admin@EXAMPLE.ORG 20050728203748:kadmin/admin@EXAMPLE.ORG - - - 86400 2592000 126 20050728203748:560639:2 - +lha@EXAMPLE.ORG 1::3:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::2:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::1:80AB08A261D6A82F:3/"EXAMPLE.ORGlha"::18:96653BEA5A46E5DF97D535C6C49F007E02F0E56B21F498C14F8C014871FE9889:3/"EXAMPLE.ORGlha"::16:7545202640A81304AE987F231FCB1F625D02CE7FF8A4ABEA:3/"EXAMPLE.ORGlha"::23:AC8E657F83DF82BEEA5D43BDAF7800CC:3/"EXAMPLE.ORGlha" 20050728203752:kadmin/admin@EXAMPLE.ORG 20050728203758:kadmin/admin@EXAMPLE.ORG - - - 86400 604800 126 20050728203752:988968:1 - diff --git a/crypto/heimdal/tests/gss/Makefile.am b/crypto/heimdal/tests/gss/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/Makefile.am @@ -0,0 +1,81 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +noinst_DATA = krb5.conf + +SCRIPT_TESTS = check-basic check-gss check-gssmask check-context check-spnego check-ntlm + +TESTS = $(SCRIPT_TESTS) + +check_SCRIPTS = $(SCRIPT_TESTS) + +port = 49188 + +do_subst = $(heim_verbose)sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/gss,g' + +check-gss: check-gss.in Makefile + $(do_subst) < $(srcdir)/check-gss.in > check-gss.tmp && \ + chmod +x check-gss.tmp && \ + mv check-gss.tmp check-gss + +check-gssmask: check-gssmask.in Makefile + $(do_subst) < $(srcdir)/check-gssmask.in > check-gssmask.tmp && \ + chmod +x check-gssmask.tmp && \ + mv check-gssmask.tmp check-gssmask + +check-context: check-context.in Makefile + $(do_subst) < $(srcdir)/check-context.in > check-context.tmp && \ + chmod +x check-context.tmp && \ + mv check-context.tmp check-context + +check-spnego: check-spnego.in Makefile + $(do_subst) < $(srcdir)/check-spnego.in > check-spnego.tmp && \ + chmod +x check-spnego.tmp && \ + mv check-spnego.tmp check-spnego + +check-basic: check-basic.in Makefile + $(do_subst) < $(srcdir)/check-basic.in > check-basic.tmp && \ + chmod +x check-basic.tmp && \ + mv check-basic.tmp check-basic + +check-ntlm: check-ntlm.in Makefile + $(do_subst) < $(srcdir)/check-ntlm.in > check-ntlm.tmp && \ + chmod +x check-ntlm.tmp && \ + mv check-ntlm.tmp check-ntlm + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp && \ + mv krb5.conf.tmp krb5.conf + +CLEANFILES= \ + $(TESTS) \ + foopassword \ + barpassword \ + krb5ccfile \ + krb5ccfile-ds \ + server.keytab \ + krb5.conf \ + current-db* \ + *.log \ + tempfile \ + check-basic.tmp \ + check-gss.tmp \ + check-gssmask.tmp \ + check-spnego.tmp \ + check-ntlm.tmp \ + check-context.tmp + +EXTRA_DIST = \ + NTMakefile \ + check-basic.in \ + check-gss.in \ + check-gssmask.in \ + check-spnego.in \ + check-ntlm.in \ + check-context.in \ + ntlm-user-file.txt \ + krb5.conf.in diff --git a/crypto/heimdal/tests/gss/Makefile.in b/crypto/heimdal/tests/gss/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/Makefile.in @@ -0,0 +1,1334 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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/gss +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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 +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +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__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_DATA = krb5.conf +SCRIPT_TESTS = check-basic check-gss check-gssmask check-context check-spnego check-ntlm +TESTS = $(SCRIPT_TESTS) +check_SCRIPTS = $(SCRIPT_TESTS) +port = 49188 +do_subst = $(heim_verbose)sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/gss,g' + +CLEANFILES = \ + $(TESTS) \ + foopassword \ + barpassword \ + krb5ccfile \ + krb5ccfile-ds \ + server.keytab \ + krb5.conf \ + current-db* \ + *.log \ + tempfile \ + check-basic.tmp \ + check-gss.tmp \ + check-gssmask.tmp \ + check-spnego.tmp \ + check-ntlm.tmp \ + check-context.tmp + +EXTRA_DIST = \ + NTMakefile \ + check-basic.in \ + check-gss.in \ + check-gssmask.in \ + check-spnego.in \ + check-ntlm.in \ + check-context.in \ + ntlm-user-file.txt \ + krb5.conf.in + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/gss/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/gss/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-basic.log: check-basic + @p='check-basic'; \ + b='check-basic'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-gss.log: check-gss + @p='check-gss'; \ + b='check-gss'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-gssmask.log: check-gssmask + @p='check-gssmask'; \ + b='check-gssmask'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-context.log: check-context + @p='check-context'; \ + b='check-context'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-spnego.log: check-spnego + @p='check-spnego'; \ + b='check-spnego'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-ntlm.log: check-ntlm + @p='check-ntlm'; \ + b='check-ntlm'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(DATA) all-local +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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: all all-am all-local check check-TESTS check-am check-local \ + clean clean-generic clean-libtool cscopelist-am ctags-am \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-hook \ + 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ + uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +check-gss: check-gss.in Makefile + $(do_subst) < $(srcdir)/check-gss.in > check-gss.tmp && \ + chmod +x check-gss.tmp && \ + mv check-gss.tmp check-gss + +check-gssmask: check-gssmask.in Makefile + $(do_subst) < $(srcdir)/check-gssmask.in > check-gssmask.tmp && \ + chmod +x check-gssmask.tmp && \ + mv check-gssmask.tmp check-gssmask + +check-context: check-context.in Makefile + $(do_subst) < $(srcdir)/check-context.in > check-context.tmp && \ + chmod +x check-context.tmp && \ + mv check-context.tmp check-context + +check-spnego: check-spnego.in Makefile + $(do_subst) < $(srcdir)/check-spnego.in > check-spnego.tmp && \ + chmod +x check-spnego.tmp && \ + mv check-spnego.tmp check-spnego + +check-basic: check-basic.in Makefile + $(do_subst) < $(srcdir)/check-basic.in > check-basic.tmp && \ + chmod +x check-basic.tmp && \ + mv check-basic.tmp check-basic + +check-ntlm: check-ntlm.in Makefile + $(do_subst) < $(srcdir)/check-ntlm.in > check-ntlm.tmp && \ + chmod +x check-ntlm.tmp && \ + mv check-ntlm.tmp check-ntlm + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp && \ + mv krb5.conf.tmp krb5.conf + +# 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: diff --git a/crypto/heimdal/tests/gss/NTMakefile b/crypto/heimdal/tests/gss/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests\gss + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/gss/check-basic.in b/crypto/heimdal/tests/gss/check-basic.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/check-basic.in @@ -0,0 +1,210 @@ +#!/bin/sh +# +# Copyright (c) 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +env_setup="@env_setup@" +srcdir="@srcdir@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +../db/have-db || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" +nokeytab="FILE:no-such-keytab" +cache="FILE:krb5ccfile" +cache2="FILE:krb5ccfile2" +nocache="FILE:no-such-cache" + +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + +acquire_cred="${TESTS_ENVIRONMENT} ../../lib/gssapi/test_acquire_cred" +test_kcred="${TESTS_ENVIRONMENT} ../../lib/gssapi/test_kcred" +test_add_store_cred="${TESTS_ENVIRONMENT} ../../lib/gssapi/test_add_store_cred" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +KRB5_KTNAME="${keytab}" +export KRB5_KTNAME +KRB5CCNAME="${cache}" +export KRB5CCNAME + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +echo upw > ${objdir}/foopassword + +${kadmin} add -p upw --use-defaults user@${R} || exit 1 +${kadmin} add -p upw --use-defaults another@${R} || exit 1 +${kadmin} add -p p1 --use-defaults host/host.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/host.test.h5l.se@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo Starting kdc +${kdc} --testing --detach || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +exitcode=0 + +echo "initial ticket" +${kinit} -c ${cache} --password-file=${objdir}/foopassword user@${R} || exitcode=1 + +echo "copy ccache with gss_store_cred" +${test_add_store_cred} ${cache} ${cache2} || exit 1 +${klist} -c ${cache2} || exit 1 + +echo "keytab" +${acquire_cred} \ + --acquire-type=accept \ + --acquire-name=host@host.test.h5l.se || exit 1 + +echo "keytab w/ short-form name and name canon rules" +${acquire_cred} \ + --acquire-type=accept \ + --acquire-name=host@host || exit 1 + +echo "keytab w/o name" +${acquire_cred} \ + --acquire-type=accept || exit 1 + +echo "keytab w/ wrong name" +${acquire_cred} \ + --acquire-type=accept \ + --acquire-name=host@host2.test.h5l.se 2>/dev/null && exit 1 + +echo "init using keytab" +${acquire_cred} \ + --acquire-type=initiate \ + --acquire-name=host@host.test.h5l.se > /dev/null || exit 1 + +echo "init using keytab (loop 10)" +${acquire_cred} \ + --acquire-type=initiate \ + --loops=10 \ + --acquire-name=host@host.test.h5l.se > /dev/null || exit 1 + +echo "init using keytab (loop 10, target)" +${acquire_cred} \ + --acquire-type=initiate \ + --loops=10 \ + --target=host@host.test.h5l.se \ + --acquire-name=host@host.test.h5l.se > /dev/null || exit 1 + +echo "init using keytab (loop 10, kerberos)" +${acquire_cred} \ + --acquire-type=initiate \ + --loops=10 \ + --kerberos \ + --acquire-name=host@host.test.h5l.se > /dev/null || exit 1 + +echo "init using keytab (loop 10, target, kerberos)" +${acquire_cred} \ + --acquire-type=initiate \ + --loops=10 \ + --kerberos \ + --target=host@host.test.h5l.se \ + --acquire-name=host@host.test.h5l.se > /dev/null || exit 1 + +echo "init using existing cc" +${acquire_cred} \ + --name-type=user-name \ + --acquire-type=initiate \ + --acquire-name=user || exit 1 + +KRB5CCNAME=${nocache} + +echo "fail init using existing cc" +${acquire_cred} \ + --name-type=user-name \ + --acquire-type=initiate \ + --acquire-name=user 2>/dev/null && exit 1 + +echo "use gss_krb5_ccache_name for user" +${acquire_cred} \ + --name-type=user-name \ + --ccache=${cache} \ + --acquire-type=initiate \ + --acquire-name=user >/dev/null || exit 1 + +KRB5CCNAME=${cache} +KRB5_KTNAME=${nokeytab} + +echo "kcred" +${test_kcred} || exit 1 + +${kdestroy} -c ${cache} + +KRB5_KTNAME="${keytab}" + +echo "init using keytab" +${acquire_cred} \ + --acquire-type=initiate \ + --acquire-name=host@host.test.h5l.se 2>/dev/null || exit 1 + +echo "init using keytab (ccache)" +${acquire_cred} \ + --acquire-type=initiate \ + --ccache=${cache} \ + --acquire-name=host@host.test.h5l.se 2>/dev/null || exit 1 + +trap "" EXIT + +echo "killing kdc (${kdcpid})" +kill ${kdcpid} 2> /dev/null + +exit $exitcode diff --git a/crypto/heimdal/tests/gss/check-context.in b/crypto/heimdal/tests/gss/check-context.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/check-context.in @@ -0,0 +1,468 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +env_setup="@env_setup@" +srcdir="@srcdir@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +../db/have-db || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" +nokeytab="FILE:no-such-keytab" +cache="FILE:krb5ccfile" + +kinit="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache ${afs_no_afslog}" +klist="${TESTS_ENVIRONMENT} ../../kuser/heimtools klist -c $cache" +klist="${TESTS_ENVIRONMENT} ../../kuser/klist -c $cache" +kgetcred="${TESTS_ENVIRONMENT} ../../kuser/kgetcred -c $cache" +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port" +ktutil="${TESTS_ENVIRONMENT} ../../admin/ktutil" + +context="${TESTS_ENVIRONMENT} ../../lib/gssapi/test_context" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +KRB5CCNAME=${cache} +export KRB5CCNAME + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +# add both lucid and lucid.test.h5l.se to simulate aliases +${kadmin} add -p p1 --use-defaults host/lucid.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/lucid.test.h5l.se@${R} || exit 1 + +${kadmin} add -p p1 --use-defaults host/ok-delegate.test.h5l.se@${R} || exit 1 +${kadmin} mod --attributes=+ok-as-delegate host/ok-delegate.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/ok-delegate.test.h5l.se@${R} || exit 1 + + +${kadmin} add -p p1 --use-defaults host/short@${R} || exit 1 +${kadmin} mod --alias=host/long.test.h5l.se@${R} host/short@${R} || exit 1 +# XXX ext should ext aliases too +${kadmin} ext -k ${keytab} host/short@${R} || exit 1 +${ktutil} -k ${keytab} rename --no-delete host/short@${R} host/long.test.h5l.se@${R} || exit 1 + +${kadmin} add -p kaka --use-defaults digest/${R}@${R} || exit 1 + +${kadmin} add -p u1 --use-defaults user1@${R} || exit 1 + +# Create a server principal with no AES +${kadmin} add -p p1 --use-defaults host/no-aes.test.h5l.se@${R} || exit 1 +${kadmin} get host/no-aes.test.h5l.se@${R} > tempfile || exit 1 +${kadmin} del_enctype host/no-aes.test.h5l.se@${R} \ + aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 || exit 1 +${kadmin} ext -k ${keytab} host/no-aes.test.h5l.se@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo u1 > ${objdir}/foopassword + +echo Starting kdc +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +testfailed="echo test failed; cat messages.log; exit 1" + +echo "Test gss_acquire_cred_with_password" ; > messages.log +${context} --client-name=user1@${R} --client-password=u1 --mech-type=krb5 \ + host@lucid.test.h5l.se || { eval "$testfailed"; } +# These must fail (because wrong password) +${context} --client-name=user1@${R} --client-password=u2 --mech-type=krb5 \ + host@lucid.test.h5l.se && { eval "$testfailed"; } +${context} --client-name=user1@${R} --client-password=u2 --mech-type='' \ + --mech-types=krb5 host@lucid.test.h5l.se && { eval "$testfailed"; } +${context} --client-name=user1@${R} --client-password=u2 --mech-type=krb5 \ + --mech-types=krb5 host@lucid.test.h5l.se && { eval "$testfailed"; } +${context} --client-name=user1@${R} --client-password=u2 --mech-type=all \ + --mech-types=krb5 host@lucid.test.h5l.se && { eval "$testfailed"; } +${context} --client-name=user1@${R} --client-password=u2 \ + --mech-type=krb5,ntlm --mech-types=krb5 host@lucid.test.h5l.se \ + && { eval "$testfailed"; } +# gss_acquire_cred_with_password() must not have side-effects +${klist} && { eval "$testfailed"; } + +echo "Getting client initial tickets" ; > messages.log +${kinit} --password-file=${objdir}/foopassword --forwardable user1@${R} || \ + { eval "$testfailed"; } + +echo "======test unreadable/non existant keytab and its error message" ; > messages.log +${context} --mech-type=krb5 host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +mv ${keytabfile} ${keytabfile}.no + +echo "checking non existant keytabfile (krb5)" ; > messages.log +${context} --mech-type=krb5 host@lucid.test.h5l.se > test_context.log 2>&1 && \ + { eval "$testfailed"; } +echo "checking non existant keytabfile (spengo)" ; > messages.log +${context} --mech-type=spnego host@lucid.test.h5l.se > test_context.log 2>&1 && \ + { eval "$testfailed"; } + +mv ${keytabfile}.no ${keytabfile} + +echo "======test naming combinations" +echo "plain" ; > messages.log +${context} --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } +echo "plain w/ short-form hostname" ; > messages.log +${context} --name-type=hostbased-service host@lucid || \ + { eval "$testfailed"; } +echo "plain (krb5)" ; > messages.log +${context} --name-type=krb5-principal-name host/lucid.test.h5l.se@${R} || \ + { eval "$testfailed"; } +echo "plain (krb5 realmless)" ; > messages.log +${context} --name-type=krb5-principal-name host/lucid.test.h5l.se || \ + { eval "$testfailed"; } +echo "plain (krb5 realmless short-form)" ; > messages.log +${context} --name-type=krb5-principal-name host/lucid 2>/dev/null || \ + { eval "$testfailed"; } +echo "creating short-form princ" +${kadmin} add -p p1 --use-defaults host/lucid@${R} || exit 1 +${kadmin} ext -k ${keytab} host/lucid@${R} || exit 1 +echo "dns canon on (long name) OFF, need dns_wrapper" ; > messages.log +#${context} --dns-canon host@lucid.test.h5l.se || \ +# { eval "$testfailed"; } +echo "dns canon off (long name)" ; > messages.log +${context} --no-dns-canon host@lucid.test.h5l.se || \ + { eval "$testfailed"; } +echo "dns canon off (short name)" ; > messages.log +${context} --no-dns-canon host@lucid || \ + { eval "$testfailed"; } +echo "dns canon off (short name, krb5)" ; > messages.log +${context} --no-dns-canon --name-type=krb5-principal-name host/lucid@${R} || \ + { eval "$testfailed"; } +echo "dns canon off (short name, krb5)" ; > messages.log +${context} --no-dns-canon --name-type=krb5-principal-name host/lucid || \ + { eval "$testfailed"; } + +echo "======test context building" +for mech in krb5 krb5iov spnego spnegoiov; do + if [ "$mech" = "krb5iov" ] ; then + mech="krb5" + iov="--iov" + fi + if [ "$mech" = "spnegoiov" ] ; then + mech="spnego" + iov="--iov" + fi + + echo "${mech} no-mutual ${iov}" ; > messages.log + ${context} --mech-type=${mech} \ + --wrapunwrap ${iov} \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + + echo "${mech} mutual ${iov}" ; > messages.log + ${context} --mech-type=${mech} \ + --mutual \ + --wrapunwrap ${iov} \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + + echo "${mech} delegate ${iov}" ; > messages.log + ${context} --mech-type=${mech} \ + --delegate \ + --wrapunwrap ${iov} \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + + echo "${mech} mutual delegate ${iov}" ; > messages.log + ${context} --mech-type=${mech} \ + --mutual --delegate \ + --wrapunwrap ${iov} \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } +done + +echo "======dce-style" +for mech in krb5 krb5iov spnego; do + iov="" + if [ "$mech" = "krb5iov" ] ; then + mech="krb5" + iov="--iov" + fi + if [ "$mech" = "spnegoiov" ] ; then + mech="spnego" + iov="--iov" + fi + + echo "${mech}: dce-style ${iov}" ; > messages.log + ${context} \ + --mech-type=${mech} \ + --mutual \ + --dce-style \ + --wrapunwrap ${iov} \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +done + +echo "test gsskrb5_register_acceptor_identity (both positive and negative)" + +cp ${keytabfile} ${keytabfile}.new +for mech in krb5 spnego; do + echo "${mech}: acceptor_identity positive" ; > messages.log + ${context} --gsskrb5-acceptor-identity=${keytabfile}.new \ + --mech-type=$mech host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + + echo "${mech}: acceptor_identity positive (prefix)" ; > messages.log + ${context} --gsskrb5-acceptor-identity=FILE:${keytabfile}.new \ + --mech-type=$mech host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + + echo "${mech}: acceptor_identity negative" ; > messages.log + ${context} --gsskrb5-acceptor-identity=${keytabfile}.foo \ + --mech-type=$mech host@lucid.test.h5l.se 2>/dev/null && \ + { eval "$testfailed"; } +done + +rm ${keytabfile}.new + + +#echo "sasl-digest-md5" +#${context} --mech-type=sasl-digest-md5 \ +# --name-type=hostbased-service \ +# host@lucid.test.h5l.se || \ +# { eval "$testfailed"; } + + +echo "====== gss-api session key check" + +# this will break when oneone invents a cooler enctype then aes256-cts-hmac-sha1-96 +coolenctype="aes256-cts-hmac-sha1-96" +limit_enctype="des3-cbc-sha1" + +echo "Getting client initial tickets" ; > messages.log +${kinit} --password-file=${objdir}/foopassword user1@${R} || \ + { eval "$testfailed"; } + + +echo "Building context on cred w/o aes, but still ${coolenctype} session key" ; > messages.log +${context} \ + --mech-type=krb5 \ + --mutual-auth \ + --session-enctype=${coolenctype} \ + --name-type=hostbased-service host@no-aes.test.h5l.se || \ + { eval "$testfailed"; } + +echo "Building context on cred, check if its limited still" ; > messages.log +${context} \ + --mech-type=krb5 \ + --client-name=user1@${R} \ + --limit-enctype="${limit_enctype}" \ + --mutual-auth \ + --name-type=hostbased-service host@no-aes.test.h5l.se || \ + { eval "$testfailed"; } + + +echo "====== ok-as-delegate" + +echo "Getting client initial tickets" ; > messages.log +${kinit} --forwardable \ + --password-file=${objdir}/foopassword user1@${R} || \ + { eval "$testfailed"; } + +echo "ok-as-delegate not used" ; > messages.log +${context} \ + --mech-type=krb5 \ + --delegate \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "host without ok-as-delegate with policy-delegate" ; > messages.log +${context} \ + --mech-type=krb5 \ + --policy-delegate \ + --server-no-delegate \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "ok-as-delegate used by policy" ; > messages.log +${context} \ + --mech-type=krb5 \ + --policy-delegate \ + --name-type=hostbased-service host@ok-delegate.test.h5l.se || \ + { eval "$testfailed"; } + +echo "Getting client initial tickets with --ok-as-delgate" ; > messages.log +${kinit} --ok-as-delegate --forwardable \ + --password-file=${objdir}/foopassword user1@${R} || \ + { eval "$testfailed"; } + +echo "policy delegate to non delegate host" ; > messages.log +${context} \ + --mech-type=krb5 \ + --policy-delegate \ + --server-no-delegate \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "ok-as-delegate" ; > messages.log +${context} \ + --mech-type=krb5 \ + --delegate \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "======export/import cred" + +echo "export-import cred (krb5)" ; > messages.log +${context} \ + --mech-type=krb5 \ + --delegate \ + --export-import-cred \ + --name-type=hostbased-service host@ok-delegate.test.h5l.se || \ + { eval "$testfailed"; } + +echo "export-import cred (spnego)" ; > messages.log +${context} \ + --mech-type=spnego \ + --delegate \ + --export-import-cred \ + --name-type=hostbased-service host@ok-delegate.test.h5l.se || \ + { eval "$testfailed"; } + + +echo "======time diffs between client and server" + +echo "Getting client initial ticket" ; > messages.log +${kinit} --password-file=${objdir}/foopassword user1@${R} || \ + { eval "$testfailed"; } + +echo "No time offset" ; > messages.log +${context} \ + --mech-type=krb5 \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "Getting client initial ticket" ; > messages.log +${kinit} --password-file=${objdir}/foopassword user1@${R} || \ + { eval "$testfailed"; } + +echo "Server time offset" ; > messages.log +${context} \ + --mech-type=krb5 \ + --mutual-auth \ + --server-time-offset=3600 \ + --max-loops=3 \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "Server time offset (cached ?)" ; > messages.log +${context} \ + --mech-type=krb5 \ + --mutual-auth \ + --server-time-offset=3600 \ + --max-loops=2 \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "Getting client initial ticket" ; > messages.log +${kinit} --password-file=${objdir}/foopassword user1@${R} || \ + { eval "$testfailed"; } +# Pre-poplute the cache since tgs-req will fail since our time is wrong +${kgetcred} host/lucid.test.h5l.se@${R} || \ + { eval "$testfailed"; } + +echo "Client time offset" ; > messages.log +${context} \ + --mech-type=krb5 \ + --mutual-auth \ + --client-time-offset=3600 \ + --name-type=hostbased-service host@lucid.test.h5l.se || \ + { eval "$testfailed"; } + +echo "Getting client initial tickets (use-referrals)" ; > messages.log +${kinit} \ + --password-file=${objdir}/foopassword \ + --use-referrals user1@${R} || \ + { eval "$testfailed"; } + +# XXX these tests really need to use somethat that resolve to something +${context} \ + --mech-type=krb5 \ + host@short || \ + { eval "$testfailed"; } + +${context} \ + --mech-type=krb5 \ + --name-type=krb5-principal-name host/short || \ + { eval "$testfailed"; } + +${context} \ + --mech-type=krb5 \ + host@long.test.h5l.se || \ + { eval "$testfailed"; } + +${context} \ + --mech-type=krb5 \ + --name-type=krb5-principal-name \ + host/long.test.h5l.se || \ + { eval "$testfailed"; } + +trap "" EXIT + +echo "killing kdc (${kdcpid})" +kill ${kdcpid} 2> /dev/null + +exit 0 + diff --git a/crypto/heimdal/tests/gss/check-gss.in b/crypto/heimdal/tests/gss/check-gss.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/check-gss.in @@ -0,0 +1,50 @@ +#!/bin/sh +# +# Copyright (c) 2006 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +env_setup="@env_setup@" +confdir="@confdir@" +testdir="@testdir@" + +. ${env_setup} + +${TESTS_ENVIRONMENT} ${gsstool} help > /dev/null || exit 1 +${TESTS_ENVIRONMENT} ${gsstool} supported-mechanisms > /dev/null || exit 1 +${TESTS_ENVIRONMENT} ${gsstool} attrs-for-mech --all > /dev/null || exit 1 +${TESTS_ENVIRONMENT} ${gsstool} attrs-for-mech --mech=Kerberos > /dev/null || exit 1 + +exit 0 + + diff --git a/crypto/heimdal/tests/gss/check-gssmask.in b/crypto/heimdal/tests/gss/check-gssmask.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/check-gssmask.in @@ -0,0 +1,132 @@ +#!/bin/sh +# +# Copyright (c) 2006 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +env_setup="@env_setup@" +srcdir="@srcdir@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +../db/have-db || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" + +gssmask="${TESTS_ENVIRONMENT} ../../appl/gssmask/gssmask" +gssmaskn1="${gssmask} -p 8889 --spn=host/n1.test.h5l.se@${R} --logfile=n1.log" +gssmaskn2="${gssmask} -p 8890 --spn=host/n2.test.h5l.se@${R} --logfile=n2.log" +gssmaskn3="${gssmask} -p 8891 --spn=host/n3.test.h5l.se@${R} --logfile=n3.log" +gssmaestro="../../appl/gssmask/gssmaestro" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p p1 --use-defaults host/n1.test.h5l.se@${R} || exit 1 +${kadmin} add -p p2 --use-defaults host/n2.test.h5l.se@${R} || exit 1 +${kadmin} add -p p3 --use-defaults host/n3.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/n1.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/n2.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/n3.test.h5l.se@${R} || exit 1 + +${kadmin} add -p u1 --use-defaults user1@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo Starting kdc +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +exitcode=0 + +echo "Starting client 1" +${gssmaskn1} --moniker=n1 & +n1pid=$! +#echo $n1pid +#xterm -display :0 -e g ${gssmaskn1} & +#read x + +echo "Starting client 2" +${gssmaskn2} --moniker=n2 & +n2pid=$! + +echo "Starting client 3" +${gssmaskn3} --moniker=n3 & +n3pid=$! + +trap "kill ${kdcpid} ${n1pid} ${n2pid} ${n3pid} 2> /dev/null; echo signal killing kdc and maskar; exit 1;" EXIT + +sleep 10 + +# --wrap-ext + +${gssmaestro} \ + --slaves=localhost:8889 \ + --slaves=localhost:8890 \ + --slaves=localhost:8891 \ + --principals=user1@${R}:u1 || exitcode=1 + +trap "" EXIT + +echo "killing kdc and clients (${kdcpid}, ${n1pid}, ${n2pid}, ${n3pid})" +kill ${kdcpid} ${n1pid} ${n2pid} ${n3pid} 2> /dev/null + +exit $exitcode + + diff --git a/crypto/heimdal/tests/gss/check-ntlm.in b/crypto/heimdal/tests/gss/check-ntlm.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/check-ntlm.in @@ -0,0 +1,167 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +env_setup="@env_setup@" +srcdir="@srcdir@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +../db/have-db || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" +cache="FILE:krb5ccfile" +cacheds="FILE:krb5ccfile-ds" + +kinit="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache ${afs_no_afslog}" +kinitds="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cacheds ${afs_no_afslog}" +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port" +kdigest="${TESTS_ENVIRONMENT} ../../kuser/kdigest" + +context="${TESTS_ENVIRONMENT} ../../lib/gssapi/test_context" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +KRB5_KTNAME="${keytab}" +export KRB5_KTNAME +KRB5CCNAME="${cache}" +export KRB5CCNAME +NTLM_ACCEPTOR_CCACHE="${cacheds}" +export NTLM_ACCEPTOR_CCACHE +NTLM_USER_FILE="${srcdir}/ntlm-user-file.txt" +export NTLM_USER_FILE + +GSSAPI_SPNEGO_NAME=host@host.test.h5l.se +export GSSAPI_SPNEGO_NAME + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p p1 --use-defaults host/host.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/host.test.h5l.se@${R} || exit 1 + +${kadmin} add -p kaka --use-defaults digest/${R}@${R} || exit 1 + +${kadmin} add -p ds --use-defaults digestserver@${R} || exit 1 +${kadmin} modify --attributes=+allow-digest digestserver@${R} || exit 1 + +${kadmin} add -p u1 --use-defaults user1@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo u1 > ${objdir}/foopassword +echo ds > ${objdir}/barpassword + +echo Starting kdc +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +exitcode=0 + +echo "Getting client initial tickets" +${kinit} --password-file=${objdir}/foopassword user1@${R} || exitcode=1 +echo "Getting digestserver initial tickets" +${kinitds} --password-file=${objdir}/barpassword digestserver@${R} || exitcode=1 + +echo "======probe" +KRB5CCNAME="$cacheds" + + ${kdigest} digest-probe --realm=${R} > /dev/null || \ + { exitcode=1; echo "test failed"; } + +echo "======context building ntlm" + +NTLM_USER_FILE="${srcdir}/ntlm-user-file.txt-no" +KRB5CCNAME="$cache" + +echo "no NTLM initiator creds" +${context} --mech-type=ntlm \ + --mutual \ + --name-type=hostbased-service \ + --ret-mech-type=ntlm \ + host@host.test.h5l.se 2> /dev/null && \ + { exitcode=1 ; echo "test failed"; } + +echo "Getting client initial tickets (with ntlm creds)" +${kinit} --password-file=${objdir}/foopassword --ntlm-domain=TEST user1@${R} || exitcode=1 + +echo "NTLM initiator krb5 creds" +${context} --mech-type=ntlm \ + --mutual \ + --name-type=hostbased-service \ + --ret-mech-type=ntlm \ + host@host.test.h5l.se || \ + { exitcode=1 ; echo "test failed"; } + +echo "NTLM initiator krb5 creds (getverifymic, wrapunwrap)" +${context} --mech-type=ntlm \ + --mutual \ + --name-type=hostbased-service \ + --ret-mech-type=ntlm \ + --getverifymic --wrapunwrap \ + host@host.test.h5l.se || \ + { exitcode=1 ; echo "test failed"; } + +trap "" EXIT + +echo "killing kdc (${kdcpid})" +kill ${kdcpid} 2> /dev/null + +exit $exitcode + + diff --git a/crypto/heimdal/tests/gss/check-spnego.in b/crypto/heimdal/tests/gss/check-spnego.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/check-spnego.in @@ -0,0 +1,208 @@ +#!/bin/sh +# +# Copyright (c) 2006 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +env_setup="@env_setup@" +srcdir="@srcdir@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +../db/have-db || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" +cache="FILE:krb5ccfile" +cacheds="FILE:krb5ccfile-ds" + +kinit="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache ${afs_no_afslog} --forwardable" +kinitds="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cacheds ${afs_no_afslog}" +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port" + +context="${TESTS_ENVIRONMENT} ../../lib/gssapi/test_context" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +KRB5_KTNAME="${keytab}" +export KRB5_KTNAME +KRB5CCNAME="${cache}" +export KRB5CCNAME +NTLM_ACCEPTOR_CCACHE="${cacheds}" +export NTLM_ACCEPTOR_CCACHE +NTLM_USER_FILE="${srcdir}/ntlm-user-file.txt" +export NTLM_USER_FILE + +GSSAPI_SPNEGO_NAME=host@host.test.h5l.se +export GSSAPI_SPNEGO_NAME + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p p1 --use-defaults host/host.test.h5l.se@${R} || exit 1 +${kadmin} ext -k ${keytab} host/host.test.h5l.se@${R} || exit 1 + +${kadmin} add -p kaka --use-defaults digest/${R}@${R} || exit 1 + +${kadmin} add -p ds --use-defaults digestserver@${R} || exit 1 +${kadmin} modify --attributes=+allow-digest digestserver@${R} || exit 1 + +${kadmin} add -p u1 --use-defaults user1@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo u1 > ${objdir}/foopassword +echo ds > ${objdir}/barpassword + +echo Starting kdc +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +exitcode=0 + +echo "Getting client initial tickets" +${kinit} --password-file=${objdir}/foopassword user1@${R} || exitcode=1 +echo "Getting digestserver initial tickets" +${kinitds} --password-file=${objdir}/barpassword digestserver@${R} || exitcode=1 + +echo "======context building for each mech" + +for mech in ntlm krb5 ; do + echo "${mech}" + ${context} --mech-type=${mech} --ret-mech-type=${mech} \ + --name-type=hostbased-service host@host.test.h5l.se || \ + { exitcode=1 ; echo test failed; } +done + +echo "spnego" +${context} \ + --mech-type=spnego \ + --ret-mech-type=krb5 \ + --name-type=hostbased-service \ + host@host.test.h5l.se || \ + { exitcode=1 ; echo test failed; } + +echo "test failure cases" +${context} --mech-type=ntlm --ret-mech-type=krb5 \ + --name-type=hostbased-service host@host.test.h5l.se 2> /dev/null && \ + { exitcode=1 ; echo test failed; } + +${context} --mech-type=krb5 --ret-mech-type=ntlm \ + --name-type=hostbased-service host@host.test.h5l.se 2> /dev/null && \ + { exitcode=1 ; echo test failed; } + +echo "======spnego variants context building" + +for arg in \ + "" \ + "--mutual" \ + "--delegate" \ + "--mutual --delegate" \ + "--getverifymic --wrapunwrap" \ + "--mutual --getverifymic --wrapunwrap" \ + ; do + + echo "no NTLM acceptor cred ${arg}" + NTLM_ACCEPTOR_CCACHE="${cacheds}-no" + ${context} --mech-type=spnego \ + $arg \ + --name-type=hostbased-service \ + --ret-mech-type=krb5 \ + host@host.test.h5l.se || \ + { exitcode=1 ; echo test failed; } + NTLM_ACCEPTOR_CCACHE="${cacheds}" + + echo "no NTLM initiator cred ${arg}" + NTLM_USER_FILE="${srcdir}/ntlm-user-file.txt-no" + ${context} --mech-type=spnego \ + $arg \ + --name-type=hostbased-service \ + --ret-mech-type=krb5 \ + host@host.test.h5l.se || \ + { exitcode=1 ; echo test failed; } + NTLM_USER_FILE="${srcdir}/ntlm-user-file.txt" + + echo "no krb5 acceptor cred ${arg}" + KRB5_KTNAME="${keytab}-no" + ${context} --mech-type=spnego \ + $arg \ + --server-no-delegate \ + --name-type=hostbased-service \ + --ret-mech-type=ntlm \ + host@host.test.h5l.se || \ + { exitcode=1 ; echo test failed; } + KRB5_KTNAME="${keytab}" + + echo "no krb5 initiator cred ${arg}" + KRB5CCNAME="${cache}-no" + ${context} --mech-type=spnego \ + $arg \ + --server-no-delegate \ + --name-type=hostbased-service \ + --ret-mech-type=ntlm \ + host@host.test.h5l.se || \ + { exitcode=1 ; echo test failed; } + KRB5CCNAME="${cache}" + +done + +trap "" EXIT + +echo "killing kdc (${kdcpid})" +kill ${kdcpid} 2> /dev/null + +exit $exitcode + + diff --git a/crypto/heimdal/tests/gss/krb5.conf.in b/crypto/heimdal/tests/gss/krb5.conf.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/krb5.conf.in @@ -0,0 +1,39 @@ +# $Id$ + +[libdefaults] + default_realm = TEST.H5L.SE + no-addresses = TRUE + default_keytab_name = @objdir@/server.keytab + dns_canonicalize_hostname = false + dns_lookup_realm = false + name_canon_rules = as-is:realm=TEST.H5L.SE + name_canon_rules = qualify:domain=test.h5l.se + +[realms] + TEST.H5L.SE = { + kdc = localhost:@port@ + } + +[domain_realms] + .test.h5l.se = TEST.H5L.SE + +[kdc] + enable-digest = true + digests_allowed = ntlm-v2,ntlm-v1-session,ntlm-v1 + + database = { + dbname = @objdir@/current-db + realm = TEST.H5L.SE + mkey_file = @objdir@/mkey.file + log_file = @objdir@/current.log + } + +[hdb] + db-dir = @objdir@ + +[logging] + kdc = 0-/FILE:@objdir@/messages.log + default = 0-/FILE:@objdir@/messages.log + +[kadmin] + save-password = true diff --git a/crypto/heimdal/tests/gss/ntlm-user-file.txt b/crypto/heimdal/tests/gss/ntlm-user-file.txt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/gss/ntlm-user-file.txt @@ -0,0 +1,2 @@ +# $Id$ +TEST:user1:u1 diff --git a/crypto/heimdal/tests/java/KerberosInit.java b/crypto/heimdal/tests/java/KerberosInit.java new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/KerberosInit.java @@ -0,0 +1,95 @@ +/* + * + * Copyright (c) 2007 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id$ + */ + +import javax.security.auth.login.*; +import javax.security.auth.callback.*; + +public class KerberosInit { + + private class TestCallBackHandler implements CallbackHandler { + + public void handle(Callback[] callbacks) + throws UnsupportedCallbackException { + for (int i = 0; i < callbacks.length; i++) { + if (callbacks[i] instanceof TextOutputCallback) { + TextOutputCallback toc = (TextOutputCallback)callbacks[i]; + System.out.println(toc.getMessage()); + } else if (callbacks[i] instanceof NameCallback) { + NameCallback nc = (NameCallback)callbacks[i]; + nc.setName("lha"); + } else if (callbacks[i] instanceof PasswordCallback) { + PasswordCallback pc = (PasswordCallback)callbacks[i]; + pc.setPassword("foo".toCharArray()); + } else { + throw new + UnsupportedCallbackException(callbacks[i], + "Unrecognized Callback"); + } + } + } + } + private TestCallBackHandler getHandler() { + return new TestCallBackHandler(); + } + + public static void main(String[] args) { + + LoginContext lc = null; + try { + lc = new LoginContext("kinit", new KerberosInit().getHandler()); + } catch (LoginException e) { + System.err.println("Cannot create LoginContext. " + e.getMessage()); + e.printStackTrace(); + System.exit(1); + } catch (SecurityException e) { + System.err.println("Cannot create LoginContext. " + e.getMessage()); + e.printStackTrace(); + System.exit(1); + } + + try { + lc.login(); + } catch (LoginException e) { + System.err.println("Authentication failed:" + e.getMessage()); + e.printStackTrace(); + System.exit(1); + } + + System.out.println("lc.login ok"); + System.exit(0); + } +} + diff --git a/crypto/heimdal/tests/java/Makefile.am b/crypto/heimdal/tests/java/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/Makefile.am @@ -0,0 +1,46 @@ +# $Id: Makefile.am 20739 2007-05-31 16:53:21Z lha $ + +include $(top_srcdir)/Makefile.am.common + +noinst_DATA = krb5.conf + +check_SCRIPTS = $(SCRIPT_TESTS) + +SCRIPT_TESTS = check-kinit + +TESTS = $(SCRIPT_TESTS) + +port = 49188 + +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/java,g' + +LDADD = ../../lib/krb5/libkrb5.la $(LIB_roken) + +check-kinit: check-kinit.in Makefile + $(do_subst) < $(srcdir)/check-kinit.in > check-kinit.tmp + chmod +x check-kinit.tmp + mv check-kinit.tmp check-kinit + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +CLEANFILES= \ + $(TESTS) \ + *.tmp \ + *.class \ + current-db* \ + krb5.conf \ + messages.log + + +EXTRA_DIST = \ + NTMakefile \ + KerberosInit.java \ + jaas.conf \ + check-kinit.in \ + have-java.sh \ + krb5.conf.in diff --git a/crypto/heimdal/tests/java/Makefile.in b/crypto/heimdal/tests/java/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/Makefile.in @@ -0,0 +1,1262 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id: Makefile.am 20739 2007-05-31 16:53:21Z lha $ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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/java +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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 +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +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__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_DATA = krb5.conf +check_SCRIPTS = $(SCRIPT_TESTS) +SCRIPT_TESTS = check-kinit +TESTS = $(SCRIPT_TESTS) +port = 49188 +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/java,g' + +LDADD = ../../lib/krb5/libkrb5.la $(LIB_roken) +CLEANFILES = \ + $(TESTS) \ + *.tmp \ + *.class \ + current-db* \ + krb5.conf \ + messages.log + +EXTRA_DIST = \ + NTMakefile \ + KerberosInit.java \ + jaas.conf \ + check-kinit.in \ + have-java.sh \ + krb5.conf.in + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/java/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/java/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-kinit.log: check-kinit + @p='check-kinit'; \ + b='check-kinit'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(DATA) all-local +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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: all all-am all-local check check-TESTS check-am check-local \ + clean clean-generic clean-libtool cscopelist-am ctags-am \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-hook \ + 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ + uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +check-kinit: check-kinit.in Makefile + $(do_subst) < $(srcdir)/check-kinit.in > check-kinit.tmp + chmod +x check-kinit.tmp + mv check-kinit.tmp check-kinit + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +# 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: diff --git a/crypto/heimdal/tests/java/NTMakefile b/crypto/heimdal/tests/java/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests\java + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/java/check-kinit.in b/crypto/heimdal/tests/java/check-kinit.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/check-kinit.in @@ -0,0 +1,147 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +srcdir="@srcdir@" +env_setup="@env_setup@" +objdir="@objdir@" +port="@port@" + +. ${env_setup} + +# Disable test if: no data, no java, or socket wrapper +../db/have-db || exit 77 +sh ${srcdir}/have-java.sh || exit 77 +[ X"$SOCKET_WRAPPER_DIR" != X ] && exit 77 + +R=TEST.H5L.SE +server=host/localhost +keytabfile="${objdir}/server.keytab" +keytab="FILE:${keytabfile}" +cache="FILE:${objdir}/cache.krb5" + +kinit="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache ${afs_no_afslog}" +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=127.0.0.1 -P $port" +gssclient="${TESTS_ENVIRONMENT} ../../appl/test/gssapi_client" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} messages.log +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +echo "Compile" +javac -d "${objdir}" "${srcdir}/KerberosInit.java" || \ + { echo "Failed to compile java program: $?" ; exit 77; } + +echo "Compile" +javac -d "${objdir}" "${srcdir}/../../appl/test/jgssapi_server.java" || \ + { echo "Failed to compile java program: $?" ; exit 77; } + +> messages.log + +echo foo > ${objdir}/foopassword + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults lha@${R} || exit 1 +${kadmin} modify --attributes=+requires-pre-auth lha@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${server}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 + +echo Starting kdc +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +echo "Run init" +java \ + -Dsun.security.krb5.debug=true \ + -Djava.security.krb5.conf="${objdir}"/krb5.conf \ + -Djava.security.auth.login.config="${srcdir}/jaas.conf" \ + KerberosInit > output.tmp 2>&1 || { cat output.tmp ; exit 1; } + + +# Disabled because of: +# +# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077646 +# http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077640 +# + +if false ; then + + echo "start server" + java \ + -Dsun.security.krb5.debug=true \ + -Djava.security.krb5.conf="${objdir}"/krb5.conf \ + -Djavax.security.auth.useSubjectCredsOnly=false \ + -Djava.security.auth.login.config="${srcdir}/jaas.conf" \ + jgssapi_server > output.tmp 2>&1 & + javapid=$! + sleep 5 + + trap "kill -9 ${kdcpid} ${javapid}; echo signal killing kdc java; exit 1;" EXIT + + echo "Getting client initial tickets"; > messages.log + ${kinit} --password-file=${objdir}/foopassword lha@$R || \ + { echo "kinit failed" ; exit 1; } + + env KRB5CCNAME=${cache} \ + ${gssclient} --port=4717 --service=host localhost || exit 1 + + sleep 5 + + kill ${javapid} + + grep 'Exception in thread' output.tmp && exit 1 +fi + +echo "Done" + +echo "killing kdc (${kdcpid} ${javapid})" +kill $kdcpid $javapid || exit 1 + +trap "" EXIT + +exit 0 diff --git a/crypto/heimdal/tests/java/have-java.sh b/crypto/heimdal/tests/java/have-java.sh new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/have-java.sh @@ -0,0 +1,58 @@ +#!/bin/sh +# +# Copyright (c) 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +echo "Checking for java and javac" + +oldifs=$IFS +IFS=: +set -- $PATH +IFS=$oldifs +for i in $*; do + test -n "$i" || i="." + test -x $i/java && j=f + test -x $i/javac && k=c +done + +test "$j$k" = fc || exit 1 + +# GNU GCC Java doesn't support Kerberos +if java -version 2>&1 | grep 'gij' > /dev/null ; then + exit 1 +fi + +echo "ok" + +exit 0 diff --git a/crypto/heimdal/tests/java/jaas.conf b/crypto/heimdal/tests/java/jaas.conf new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/jaas.conf @@ -0,0 +1,14 @@ +/* $Id$ */ + +kinit { + com.sun.security.auth.module.Krb5LoginModule required; +}; + +com.sun.security.jgss.accept { + com.sun.security.auth.module.Krb5LoginModule required + useKeyTab=true + storeKey=true + keyTab="server.keytab" + principal="host/localhost" + isInitiator=false; +}; diff --git a/crypto/heimdal/tests/java/krb5.conf.in b/crypto/heimdal/tests/java/krb5.conf.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/java/krb5.conf.in @@ -0,0 +1,32 @@ +# $Id$ + +[libdefaults] + default_realm = TEST.H5L.SE + + +[realms] + TEST.H5L.SE = { + kdc = localhost:@port@ + } + +[kdc] + database = { + dbname = @objdir@/current-db + realm = TEST.H5L.SE + mkey_file = @objdir@/mkey.file + log_file = @objdir@/current.log + } + +[hdb] + db-dir = @objdir@ + +[logging] + kdc = 0-/FILE:@objdir@/messages.log + default = 0-/FILE:@objdir@/messages.log + +# Have both default and non default salting for single DES encryptes, +# this to check if the kdc return default salting. +[kadmin] + default_keys = aes256-cts-hmac-sha1-96:pw-salt + default_keys = aes128-cts-hmac-sha1-96:pw-salt + default_keys = des3-cbc-sha1:pw-salt diff --git a/crypto/heimdal/tests/kdc/Makefile.am b/crypto/heimdal/tests/kdc/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/Makefile.am @@ -0,0 +1,336 @@ +include $(top_srcdir)/Makefile.am.common + +noinst_DATA = \ + an2ln-db.txt \ + kdc-tester4.json \ + krb5.conf \ + krb5-authz.conf \ + krb5-authz2.conf \ + krb5-canon.conf \ + krb5-canon2.conf \ + krb5-hdb-mitdb.conf \ + krb5-weak.conf \ + krb5-pkinit.conf \ + krb5-pkinit-win.conf \ + krb5-slave2.conf \ + krb5-slave.conf + +check_SCRIPTS = $(SCRIPT_TESTS) + +SCRIPT_TESTS = \ + check-authz \ + check-canon \ + check-cc \ + check-delegation \ + check-des \ + check-digest \ + check-fast \ + check-kadmin \ + check-hdb-mitdb \ + check-kdc \ + check-kdc-weak \ + check-keys \ + check-kpasswdd \ + check-pkinit \ + check-iprop \ + check-referral \ + check-tester \ + check-uu + +TESTS = $(SCRIPT_TESTS) + +port = 49188 +admport = 49189 +pwport = 49190 + +if HAVE_DLOPEN +do_dlopen = -e 's,[@]DLOPEN[@],true,g' +else +do_dlopen = -e 's,[@]DLOPEN[@],false,g' +endif + +do_subst = $(heim_verbose)sed $(do_dlopen) \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]top_srcdir[@],$(top_srcdir),g' \ + -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]admport[@],$(admport),g' \ + -e 's,[@]pwport[@],$(pwport),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/kdc,g' \ + -e 's,[@]top_builddir[@],$(top_builddir),g' \ + -e 's,[@]db_type[@],$(db_type),g' \ + -e 's,[@]ENABLE_AFS_STRING_TO_KEY[@],$(ENABLE_AFS_STRING_TO_KEY),' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +chmod = chmod + +LDADD = ../../lib/krb5/libkrb5.la $(LIB_roken) + +check-authz: check-authz.in Makefile krb5-authz.conf krb5-authz2.conf + $(do_subst) < $(srcdir)/check-authz.in > check-authz.tmp && \ + $(chmod) +x check-authz.tmp && \ + mv check-authz.tmp check-authz + +check-canon: check-canon.in Makefile krb5-canon.conf krb5-canon2.conf + $(do_subst) < $(srcdir)/check-canon.in > check-canon.tmp && \ + $(chmod) +x check-canon.tmp && \ + mv check-canon.tmp check-canon + +check-cc: check-cc.in Makefile + $(do_subst) < $(srcdir)/check-cc.in > check-cc.tmp && \ + $(chmod) +x check-cc.tmp && \ + mv check-cc.tmp check-cc + +check-delegation: check-delegation.in Makefile + $(do_subst) < $(srcdir)/check-delegation.in > check-delegation.tmp && \ + $(chmod) +x check-delegation.tmp && \ + mv check-delegation.tmp check-delegation + +check-des: check-des.in Makefile krb5.conf + $(do_subst) < $(srcdir)/check-des.in > check-des.tmp && \ + $(chmod) +x check-des.tmp && \ + mv check-des.tmp check-des + +check-hdb-mitdb: check-hdb-mitdb.in Makefile krb5-hdb-mitdb.conf + $(do_subst) < $(srcdir)/check-hdb-mitdb.in > check-hdb-mitdb.tmp && \ + $(chmod) +x check-hdb-mitdb.tmp && \ + mv check-hdb-mitdb.tmp check-hdb-mitdb + +check-fast: check-fast.in Makefile + $(do_subst) < $(srcdir)/check-fast.in > check-fast.tmp && \ + $(chmod) +x check-fast.tmp && \ + mv check-fast.tmp check-fast + +check-kdc: check-kdc.in Makefile + $(do_subst) < $(srcdir)/check-kdc.in > check-kdc.tmp && \ + $(chmod) +x check-kdc.tmp && \ + mv check-kdc.tmp check-kdc + +check-kdc-weak: check-kdc-weak.in Makefile + $(do_subst) < $(srcdir)/check-kdc-weak.in > check-kdc-weak.tmp && \ + $(chmod) +x check-kdc-weak.tmp && \ + mv check-kdc-weak.tmp check-kdc-weak + +check-tester: check-tester.in kdc-tester4.json Makefile + $(do_subst) < $(srcdir)/check-tester.in > check-tester.tmp && \ + $(chmod) +x check-tester.tmp && \ + mv check-tester.tmp check-tester + +check-keys: check-keys.in Makefile + $(do_subst) < $(srcdir)/check-keys.in > check-keys.tmp && \ + $(chmod) +x check-keys.tmp && \ + mv check-keys.tmp check-keys + +check-kinit: check-kinit.in Makefile + $(do_subst) < $(srcdir)/check-kinit.in > check-kinit.tmp && \ + $(chmod) +x check-kinit.tmp && \ + mv check-kinit.tmp check-kinit + +check-kadmin: check-kadmin.in Makefile + $(do_subst) < $(srcdir)/check-kadmin.in > check-kadmin.tmp && \ + $(chmod) +x check-kadmin.tmp && \ + mv check-kadmin.tmp check-kadmin + +check-uu: check-uu.in Makefile + $(do_subst) < $(srcdir)/check-uu.in > check-uu.tmp && \ + $(chmod) +x check-uu.tmp && \ + mv check-uu.tmp check-uu + +check-pkinit: check-pkinit.in Makefile krb5-pkinit.conf + $(do_subst) < $(srcdir)/check-pkinit.in > check-pkinit.tmp && \ + $(chmod) +x check-pkinit.tmp && \ + mv check-pkinit.tmp check-pkinit + +check-iprop: check-iprop.in Makefile krb5.conf krb5-slave.conf krb5-slave2.conf + $(do_subst) < $(srcdir)/check-iprop.in > check-iprop.tmp && \ + $(chmod) +x check-iprop.tmp && \ + mv check-iprop.tmp check-iprop + +check-digest: check-digest.in Makefile + $(do_subst) < $(srcdir)/check-digest.in > check-digest.tmp && \ + $(chmod) +x check-digest.tmp && \ + mv check-digest.tmp check-digest + +check-referral: check-referral.in Makefile + $(do_subst) < $(srcdir)/check-referral.in > check-referral.tmp && \ + $(chmod) +x check-referral.tmp && \ + mv check-referral.tmp check-referral + +check-kpasswdd: check-kpasswdd.in Makefile + $(do_subst) < $(srcdir)/check-kpasswdd.in > check-kpasswdd.tmp && \ + $(chmod) +x check-kpasswdd.tmp && \ + mv check-kpasswdd.tmp check-kpasswdd + +kdc-tester4.json: kdc-tester4.json.in Makefile + $(do_subst) < $(srcdir)/kdc-tester4.json.in > kdc-tester4.json.tmp && \ + mv kdc-tester4.json.tmp kdc-tester4.json + +krb5.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5.conf.in > krb5.conf.tmp && \ + mv krb5.conf.tmp krb5.conf + +krb5-authz.conf: krb5-authz.conf.in Makefile + $(do_subst) < $(srcdir)/krb5-authz.conf.in > krb5-authz.conf.tmp && \ + mv krb5-authz.conf.tmp krb5-authz.conf + +krb5-authz2.conf: krb5-authz2.conf.in Makefile + $(do_subst) < $(srcdir)/krb5-authz2.conf.in > krb5-authz2.conf.tmp && \ + mv krb5-authz2.conf.tmp krb5-authz2.conf + +krb5-canon.conf: krb5-canon.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5-canon.conf.in > krb5-canon.conf.tmp && \ + mv krb5-canon.conf.tmp krb5-canon.conf + +krb5-canon2.conf: krb5-canon2.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5-canon2.conf.in > krb5-canon2.conf.tmp && \ + mv krb5-canon2.conf.tmp krb5-canon2.conf + +krb5-hdb-mitdb.conf: krb5-hdb-mitdb.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5-hdb-mitdb.conf.in > krb5-hdb-mitdb.conf.tmp && \ + mv krb5-hdb-mitdb.conf.tmp krb5-hdb-mitdb.conf + +krb5-weak.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],true,g' \ + -e 's,[@]dk[@],default_keys = aes256-cts-hmac-sha1-96:pw-salt arcfour-hmac-md5:pw-salt des3-cbc-sha1:pw-salt des:pw-salt,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5.conf.in > krb5-weak.conf.tmp && \ + mv krb5-weak.conf.tmp krb5-weak.conf + +krb5-slave.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],true,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],.slave,g' < $(srcdir)/krb5.conf.in > krb5-slave.conf.tmp && \ + mv krb5-slave.conf.tmp krb5-slave.conf + +krb5-slave2.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],true,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],.slave2,g' < $(srcdir)/krb5.conf.in > krb5-slave2.conf.tmp && \ + mv krb5-slave2.conf.tmp krb5-slave2.conf + +krb5-pkinit.conf: krb5-pkinit.conf.in Makefile + $(do_subst) -e 's,[@]w2k[@],no,g' < $(srcdir)/krb5-pkinit.conf.in > krb5-pkinit.conf.tmp && \ + mv krb5-pkinit.conf.tmp krb5-pkinit.conf + +krb5-pkinit-win.conf: krb5-pkinit.conf.in Makefile + $(do_subst) -e 's,[@]w2k[@],yes,g' < $(srcdir)/krb5-pkinit.conf.in > krb5-pkinit-win.conf.tmp && \ + mv krb5-pkinit-win.conf.tmp krb5-pkinit-win.conf + +CLEANFILES= \ + $(TESTS) \ + *.tmp \ + acache.krb5 \ + barpassword \ + ca.crt \ + cache.krb5 \ + cdigest-reply \ + client-cache \ + current*.log \ + current-db* \ + digest-reply \ + foopassword \ + foopassword.rkpty \ + iprop-stats \ + iprop.keytab \ + ipropd.dumpfile \ + kdc-tester4.json \ + kdc.crt \ + krb5-authz.conf \ + krb5-authz2.conf \ + krb5-canon.conf \ + krb5-canon2.conf \ + krb5-cc.conf \ + krb5-hdb-mitdb.conf \ + krb5-pkinit-win.conf \ + krb5-pkinit.conf \ + krb5-slave2.conf \ + krb5-slave.conf \ + krb5-weak.conf \ + krb5.conf \ + krb5.conf.keys \ + leaks-log \ + localname \ + malloc-log \ + malloc-log-master \ + malloc-log-slave \ + messages.log \ + o2cache.krb5 \ + o2digest-reply \ + ocache.krb5 \ + out-log \ + pkinit.crt \ + pkinit2.crt \ + pkinit3.crt \ + pkinit4.crt \ + req-kdc.der \ + req-pkinit.der \ + req-pkinit2.der \ + s2digest-reply \ + sdigest-init \ + sdigest-reply \ + server.keytab \ + signal \ + tempfile \ + test-rc-file.rc \ + uuserver.log + +EXTRA_DIST = \ + NTMakefile \ + an2ln-db.txt \ + check-authz.in \ + check-canon.in \ + check-cc.in \ + check-delegation.in \ + check-des.in \ + check-digest.in \ + check-fast.in \ + check-iprop.in \ + check-kadmin.in \ + check-kinit.in \ + check-hdb-mitdb.in \ + check-kdc.in \ + check-kdc-weak.in \ + check-keys.in \ + check-kpasswdd.in \ + check-pkinit.in \ + check-referral.in \ + check-tester.in \ + check-uu.in \ + donotexists.txt \ + hdb-mitdb \ + hdb-mitdb.kadm5 \ + hdb-mitdb.mkey \ + heimdal.acl \ + iprop-acl \ + kdc-tester1.json \ + kdc-tester2.json \ + kdc-tester3.json \ + kdc-tester4.json.in \ + krb5-pkinit.conf.in \ + krb5.conf.in \ + krb5-authz.conf.in \ + krb5-authz2.conf.in \ + krb5-canon.conf.in \ + krb5-canon2.conf.in \ + krb5-hdb-mitdb.conf.in \ + krb5.conf.keys.in \ + k5login/foo \ + ntlm-user-file.txt \ + leaks-kill.sh \ + pki-mapping \ + uuserver.txt \ + wait-kdc.sh diff --git a/crypto/heimdal/tests/kdc/Makefile.in b/crypto/heimdal/tests/kdc/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/Makefile.in @@ -0,0 +1,1669 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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/kdc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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 +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +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__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_DATA = \ + an2ln-db.txt \ + kdc-tester4.json \ + krb5.conf \ + krb5-authz.conf \ + krb5-authz2.conf \ + krb5-canon.conf \ + krb5-canon2.conf \ + krb5-hdb-mitdb.conf \ + krb5-weak.conf \ + krb5-pkinit.conf \ + krb5-pkinit-win.conf \ + krb5-slave2.conf \ + krb5-slave.conf + +check_SCRIPTS = $(SCRIPT_TESTS) +SCRIPT_TESTS = \ + check-authz \ + check-canon \ + check-cc \ + check-delegation \ + check-des \ + check-digest \ + check-fast \ + check-kadmin \ + check-hdb-mitdb \ + check-kdc \ + check-kdc-weak \ + check-keys \ + check-kpasswdd \ + check-pkinit \ + check-iprop \ + check-referral \ + check-tester \ + check-uu + +TESTS = $(SCRIPT_TESTS) +port = 49188 +admport = 49189 +pwport = 49190 +@HAVE_DLOPEN_FALSE@do_dlopen = -e 's,[@]DLOPEN[@],false,g' +@HAVE_DLOPEN_TRUE@do_dlopen = -e 's,[@]DLOPEN[@],true,g' +do_subst = $(heim_verbose)sed $(do_dlopen) \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]top_srcdir[@],$(top_srcdir),g' \ + -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]admport[@],$(admport),g' \ + -e 's,[@]pwport[@],$(pwport),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/kdc,g' \ + -e 's,[@]top_builddir[@],$(top_builddir),g' \ + -e 's,[@]db_type[@],$(db_type),g' \ + -e 's,[@]ENABLE_AFS_STRING_TO_KEY[@],$(ENABLE_AFS_STRING_TO_KEY),' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +chmod = chmod +LDADD = ../../lib/krb5/libkrb5.la $(LIB_roken) +CLEANFILES = \ + $(TESTS) \ + *.tmp \ + acache.krb5 \ + barpassword \ + ca.crt \ + cache.krb5 \ + cdigest-reply \ + client-cache \ + current*.log \ + current-db* \ + digest-reply \ + foopassword \ + foopassword.rkpty \ + iprop-stats \ + iprop.keytab \ + ipropd.dumpfile \ + kdc-tester4.json \ + kdc.crt \ + krb5-authz.conf \ + krb5-authz2.conf \ + krb5-canon.conf \ + krb5-canon2.conf \ + krb5-cc.conf \ + krb5-hdb-mitdb.conf \ + krb5-pkinit-win.conf \ + krb5-pkinit.conf \ + krb5-slave2.conf \ + krb5-slave.conf \ + krb5-weak.conf \ + krb5.conf \ + krb5.conf.keys \ + leaks-log \ + localname \ + malloc-log \ + malloc-log-master \ + malloc-log-slave \ + messages.log \ + o2cache.krb5 \ + o2digest-reply \ + ocache.krb5 \ + out-log \ + pkinit.crt \ + pkinit2.crt \ + pkinit3.crt \ + pkinit4.crt \ + req-kdc.der \ + req-pkinit.der \ + req-pkinit2.der \ + s2digest-reply \ + sdigest-init \ + sdigest-reply \ + server.keytab \ + signal \ + tempfile \ + test-rc-file.rc \ + uuserver.log + +EXTRA_DIST = \ + NTMakefile \ + an2ln-db.txt \ + check-authz.in \ + check-canon.in \ + check-cc.in \ + check-delegation.in \ + check-des.in \ + check-digest.in \ + check-fast.in \ + check-iprop.in \ + check-kadmin.in \ + check-kinit.in \ + check-hdb-mitdb.in \ + check-kdc.in \ + check-kdc-weak.in \ + check-keys.in \ + check-kpasswdd.in \ + check-pkinit.in \ + check-referral.in \ + check-tester.in \ + check-uu.in \ + donotexists.txt \ + hdb-mitdb \ + hdb-mitdb.kadm5 \ + hdb-mitdb.mkey \ + heimdal.acl \ + iprop-acl \ + kdc-tester1.json \ + kdc-tester2.json \ + kdc-tester3.json \ + kdc-tester4.json.in \ + krb5-pkinit.conf.in \ + krb5.conf.in \ + krb5-authz.conf.in \ + krb5-authz2.conf.in \ + krb5-canon.conf.in \ + krb5-canon2.conf.in \ + krb5-hdb-mitdb.conf.in \ + krb5.conf.keys.in \ + k5login/foo \ + ntlm-user-file.txt \ + leaks-kill.sh \ + pki-mapping \ + uuserver.txt \ + wait-kdc.sh + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/kdc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/kdc/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-authz.log: check-authz + @p='check-authz'; \ + b='check-authz'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-canon.log: check-canon + @p='check-canon'; \ + b='check-canon'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-cc.log: check-cc + @p='check-cc'; \ + b='check-cc'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-delegation.log: check-delegation + @p='check-delegation'; \ + b='check-delegation'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-des.log: check-des + @p='check-des'; \ + b='check-des'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-digest.log: check-digest + @p='check-digest'; \ + b='check-digest'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-fast.log: check-fast + @p='check-fast'; \ + b='check-fast'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-kadmin.log: check-kadmin + @p='check-kadmin'; \ + b='check-kadmin'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-hdb-mitdb.log: check-hdb-mitdb + @p='check-hdb-mitdb'; \ + b='check-hdb-mitdb'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-kdc.log: check-kdc + @p='check-kdc'; \ + b='check-kdc'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-kdc-weak.log: check-kdc-weak + @p='check-kdc-weak'; \ + b='check-kdc-weak'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-keys.log: check-keys + @p='check-keys'; \ + b='check-keys'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-kpasswdd.log: check-kpasswdd + @p='check-kpasswdd'; \ + b='check-kpasswdd'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-pkinit.log: check-pkinit + @p='check-pkinit'; \ + b='check-pkinit'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-iprop.log: check-iprop + @p='check-iprop'; \ + b='check-iprop'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-referral.log: check-referral + @p='check-referral'; \ + b='check-referral'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-tester.log: check-tester + @p='check-tester'; \ + b='check-tester'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +check-uu.log: check-uu + @p='check-uu'; \ + b='check-uu'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(DATA) all-local +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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: all all-am all-local check check-TESTS check-am check-local \ + clean clean-generic clean-libtool cscopelist-am ctags-am \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-hook \ + 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ + uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +check-authz: check-authz.in Makefile krb5-authz.conf krb5-authz2.conf + $(do_subst) < $(srcdir)/check-authz.in > check-authz.tmp && \ + $(chmod) +x check-authz.tmp && \ + mv check-authz.tmp check-authz + +check-canon: check-canon.in Makefile krb5-canon.conf krb5-canon2.conf + $(do_subst) < $(srcdir)/check-canon.in > check-canon.tmp && \ + $(chmod) +x check-canon.tmp && \ + mv check-canon.tmp check-canon + +check-cc: check-cc.in Makefile + $(do_subst) < $(srcdir)/check-cc.in > check-cc.tmp && \ + $(chmod) +x check-cc.tmp && \ + mv check-cc.tmp check-cc + +check-delegation: check-delegation.in Makefile + $(do_subst) < $(srcdir)/check-delegation.in > check-delegation.tmp && \ + $(chmod) +x check-delegation.tmp && \ + mv check-delegation.tmp check-delegation + +check-des: check-des.in Makefile krb5.conf + $(do_subst) < $(srcdir)/check-des.in > check-des.tmp && \ + $(chmod) +x check-des.tmp && \ + mv check-des.tmp check-des + +check-hdb-mitdb: check-hdb-mitdb.in Makefile krb5-hdb-mitdb.conf + $(do_subst) < $(srcdir)/check-hdb-mitdb.in > check-hdb-mitdb.tmp && \ + $(chmod) +x check-hdb-mitdb.tmp && \ + mv check-hdb-mitdb.tmp check-hdb-mitdb + +check-fast: check-fast.in Makefile + $(do_subst) < $(srcdir)/check-fast.in > check-fast.tmp && \ + $(chmod) +x check-fast.tmp && \ + mv check-fast.tmp check-fast + +check-kdc: check-kdc.in Makefile + $(do_subst) < $(srcdir)/check-kdc.in > check-kdc.tmp && \ + $(chmod) +x check-kdc.tmp && \ + mv check-kdc.tmp check-kdc + +check-kdc-weak: check-kdc-weak.in Makefile + $(do_subst) < $(srcdir)/check-kdc-weak.in > check-kdc-weak.tmp && \ + $(chmod) +x check-kdc-weak.tmp && \ + mv check-kdc-weak.tmp check-kdc-weak + +check-tester: check-tester.in kdc-tester4.json Makefile + $(do_subst) < $(srcdir)/check-tester.in > check-tester.tmp && \ + $(chmod) +x check-tester.tmp && \ + mv check-tester.tmp check-tester + +check-keys: check-keys.in Makefile + $(do_subst) < $(srcdir)/check-keys.in > check-keys.tmp && \ + $(chmod) +x check-keys.tmp && \ + mv check-keys.tmp check-keys + +check-kinit: check-kinit.in Makefile + $(do_subst) < $(srcdir)/check-kinit.in > check-kinit.tmp && \ + $(chmod) +x check-kinit.tmp && \ + mv check-kinit.tmp check-kinit + +check-kadmin: check-kadmin.in Makefile + $(do_subst) < $(srcdir)/check-kadmin.in > check-kadmin.tmp && \ + $(chmod) +x check-kadmin.tmp && \ + mv check-kadmin.tmp check-kadmin + +check-uu: check-uu.in Makefile + $(do_subst) < $(srcdir)/check-uu.in > check-uu.tmp && \ + $(chmod) +x check-uu.tmp && \ + mv check-uu.tmp check-uu + +check-pkinit: check-pkinit.in Makefile krb5-pkinit.conf + $(do_subst) < $(srcdir)/check-pkinit.in > check-pkinit.tmp && \ + $(chmod) +x check-pkinit.tmp && \ + mv check-pkinit.tmp check-pkinit + +check-iprop: check-iprop.in Makefile krb5.conf krb5-slave.conf krb5-slave2.conf + $(do_subst) < $(srcdir)/check-iprop.in > check-iprop.tmp && \ + $(chmod) +x check-iprop.tmp && \ + mv check-iprop.tmp check-iprop + +check-digest: check-digest.in Makefile + $(do_subst) < $(srcdir)/check-digest.in > check-digest.tmp && \ + $(chmod) +x check-digest.tmp && \ + mv check-digest.tmp check-digest + +check-referral: check-referral.in Makefile + $(do_subst) < $(srcdir)/check-referral.in > check-referral.tmp && \ + $(chmod) +x check-referral.tmp && \ + mv check-referral.tmp check-referral + +check-kpasswdd: check-kpasswdd.in Makefile + $(do_subst) < $(srcdir)/check-kpasswdd.in > check-kpasswdd.tmp && \ + $(chmod) +x check-kpasswdd.tmp && \ + mv check-kpasswdd.tmp check-kpasswdd + +kdc-tester4.json: kdc-tester4.json.in Makefile + $(do_subst) < $(srcdir)/kdc-tester4.json.in > kdc-tester4.json.tmp && \ + mv kdc-tester4.json.tmp kdc-tester4.json + +krb5.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5.conf.in > krb5.conf.tmp && \ + mv krb5.conf.tmp krb5.conf + +krb5-authz.conf: krb5-authz.conf.in Makefile + $(do_subst) < $(srcdir)/krb5-authz.conf.in > krb5-authz.conf.tmp && \ + mv krb5-authz.conf.tmp krb5-authz.conf + +krb5-authz2.conf: krb5-authz2.conf.in Makefile + $(do_subst) < $(srcdir)/krb5-authz2.conf.in > krb5-authz2.conf.tmp && \ + mv krb5-authz2.conf.tmp krb5-authz2.conf + +krb5-canon.conf: krb5-canon.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5-canon.conf.in > krb5-canon.conf.tmp && \ + mv krb5-canon.conf.tmp krb5-canon.conf + +krb5-canon2.conf: krb5-canon2.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5-canon2.conf.in > krb5-canon2.conf.tmp && \ + mv krb5-canon2.conf.tmp krb5-canon2.conf + +krb5-hdb-mitdb.conf: krb5-hdb-mitdb.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],false,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5-hdb-mitdb.conf.in > krb5-hdb-mitdb.conf.tmp && \ + mv krb5-hdb-mitdb.conf.tmp krb5-hdb-mitdb.conf + +krb5-weak.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],true,g' \ + -e 's,[@]dk[@],default_keys = aes256-cts-hmac-sha1-96:pw-salt arcfour-hmac-md5:pw-salt des3-cbc-sha1:pw-salt des:pw-salt,g' \ + -e 's,[@]kdc[@],,g' < $(srcdir)/krb5.conf.in > krb5-weak.conf.tmp && \ + mv krb5-weak.conf.tmp krb5-weak.conf + +krb5-slave.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],true,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],.slave,g' < $(srcdir)/krb5.conf.in > krb5-slave.conf.tmp && \ + mv krb5-slave.conf.tmp krb5-slave.conf + +krb5-slave2.conf: krb5.conf.in Makefile + $(do_subst) \ + -e 's,[@]WEAK[@],true,g' \ + -e 's,[@]dk[@],,g' \ + -e 's,[@]kdc[@],.slave2,g' < $(srcdir)/krb5.conf.in > krb5-slave2.conf.tmp && \ + mv krb5-slave2.conf.tmp krb5-slave2.conf + +krb5-pkinit.conf: krb5-pkinit.conf.in Makefile + $(do_subst) -e 's,[@]w2k[@],no,g' < $(srcdir)/krb5-pkinit.conf.in > krb5-pkinit.conf.tmp && \ + mv krb5-pkinit.conf.tmp krb5-pkinit.conf + +krb5-pkinit-win.conf: krb5-pkinit.conf.in Makefile + $(do_subst) -e 's,[@]w2k[@],yes,g' < $(srcdir)/krb5-pkinit.conf.in > krb5-pkinit-win.conf.tmp && \ + mv krb5-pkinit-win.conf.tmp krb5-pkinit-win.conf + +# 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: diff --git a/crypto/heimdal/tests/kdc/NTMakefile b/crypto/heimdal/tests/kdc/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests\kdc + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/kdc/an2ln-db.txt b/crypto/heimdal/tests/kdc/an2ln-db.txt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/an2ln-db.txt @@ -0,0 +1,143 @@ +0575ee035f72dfb1 junk +074897aaa3c4eace junk +0c0015d1cb0edf2e junk +15c02bb64902a207 junk +1730cb4567c1bfce junk +17c6e78171587710 junk +21bef891f06af28e junk +2358b67cdd649987 junk +2b334ee5d32eb55b junk +2f4cd4424e58822d junk +4758f671c662b7e2 junk +4bf0af25dd5211bd junk +4d7f715b271ddb10 junk +4f701fa5a4055c00 junk +4f7634440d7bef3a junk +5593a6bc03a68a3d junk +5652948873ae4a9b junk +5ababa9c833ce592 junk +5c2fb83355b59cf1 junk +5cf29f522abbcbe1 junk +5d184a0f45bdaf61 junk +70a01e2a09ba4b40 junk +75bdfdb4c9c9b26b junk +787aa58456e66463 junk +788fa38b04026ca9 junk +79ad9f69fb354592 junk +7a686ba61c736eb1 junk +807644c5c50f29d5 junk +826de82aa81c3f8a junk +85316d269114d787 junk +86b7d20af35cffba junk +895ca88e162d398f junk +9008213d189aac2b junk +98a51d5c9a172691 junk +9af7d4a596944dcf junk +a094067ad439189c junk +a86904ae8f55df9e junk +aa3ae6e252f65711 junk +b19ffc6336a23be3 junk +b4e37e4d23c4d7be junk +b5c8b14d1e8ae7cb junk +b9365f7ec3b0d52c junk +bar/mapped1@TEST2.H5L.SE foobar +bar/mapped2@TEST2.H5L.SE foobaz +c118fb30610b8011 junk +c19ffa62f50ad8f7 junk +c9fce89738e25054 junk +cb4555bb49891436 junk +ccfb9930466fe627 junk +cd2e8bc1fd014a86 junk +d0d8dfeddf1b1eaa junk +d22ff9ea01dfe15f junk +d2bce251fcf6d5a3 junk +d377b118646db95d junk +d42fd3b12935a24a junk +d948845a3b0068ac junk +dbb143ecf6019b50 junk +dbe41b5888e50c9c junk +dd7a0a53ed569e21 junk +dd82f76178ff0315 junk +e1d62414205aa5a1 junk +e3156ded04399027 junk +e6bccd04c18fbd2e junk +e9cb04e892e8f072 junk +ebb5773344e4ade4 junk +ef08d2dc9fef4f05 junk +f59975170a04e071 junk +f75338796ea735f0 junk +f8cd2e85efa891af junk +fd6e5e417b8296a7 junk +foo/mapped1@TEST2.H5L.SE foo_mapped +mapped1@TEST2.H5L.SE m1 +mapped1@TEST3.H5L.SE mapped1 +mapped2@TEST2.H5L.SE m2 +mapped2@TEST3.H5L.SE mapped2 +z008213d189aac2b junk +z07644c5c50f29d5 junk +z094067ad439189c junk +z0a01e2a09ba4b40 junk +z0d8dfeddf1b1eaa junk +z118fb30610b8011 junk +z19ffa62f50ad8f7 junk +z19ffc6336a23be3 junk +z1bef891f06af28e junk +z1d62414205aa5a1 junk +z22ff9ea01dfe15f junk +z26de82aa81c3f8a junk +z2bce251fcf6d5a3 junk +z3156ded04399027 junk +z358b67cdd649987 junk +z377b118646db95d junk +z42fd3b12935a24a junk +z4e37e4d23c4d7be junk +z5316d269114d787 junk +z575ee035f72dfb1 junk +z593a6bc03a68a3d junk +z59975170a04e071 junk +z5bdfdb4c9c9b26b junk +z5c02bb64902a207 junk +z5c8b14d1e8ae7cb junk +z652948873ae4a9b junk +z6b7d20af35cffba junk +z6bccd04c18fbd2e junk +z730cb4567c1bfce junk +z74897aaa3c4eace junk +z75338796ea735f0 junk +z758f671c662b7e2 junk +z7c6e78171587710 junk +z86904ae8f55df9e junk +z87aa58456e66463 junk +z88fa38b04026ca9 junk +z8a51d5c9a172691 junk +z8cd2e85efa891af junk +z9365f7ec3b0d52c junk +z948845a3b0068ac junk +z95ca88e162d398f junk +z9ad9f69fb354592 junk +z9cb04e892e8f072 junk +z9fce89738e25054 junk +za3ae6e252f65711 junk +za686ba61c736eb1 junk +zababa9c833ce592 junk +zaf7d4a596944dcf junk +zb334ee5d32eb55b junk +zb4555bb49891436 junk +zbb143ecf6019b50 junk +zbb5773344e4ade4 junk +zbe41b5888e50c9c junk +zbf0af25dd5211bd junk +zc0015d1cb0edf2e junk +zc2fb83355b59cf1 junk +zcf29f522abbcbe1 junk +zcfb9930466fe627 junk +zd184a0f45bdaf61 junk +zd2e8bc1fd014a86 junk +zd6e5e417b8296a7 junk +zd7a0a53ed569e21 junk +zd7f715b271ddb10 junk +zd82f76178ff0315 junk +zf08d2dc9fef4f05 junk +zf4cd4424e58822d junk +zf701fa5a4055c00 junk +zf7634440d7bef3a junk diff --git a/crypto/heimdal/tests/kdc/check-authz.in b/crypto/heimdal/tests/kdc/check-authz.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-authz.in @@ -0,0 +1,153 @@ +#!/bin/sh +# +# Copyright (c) 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="." + +. ${env_setup} + +srcdir="${top_srcdir}/tests/kdc" +test_alname="${test_alname} --simple" + +rm -f localname + +check_localname() { + stderr= + if test "$2" -ne 0; then + stderr="2>/dev/null" + fi + eval ${test_alname} "'$1'" > localname $stderr + status=$? + if test $status -ne "$2"; then + echo "Unexpected exit code from test_alname $1: $status" + exit 1 + fi + if test $status -ne 0; then + return 0 + fi + read lname < localname + if test "X$lname" != "X$3"; then + echo "Unexpected mapping of $1: $lname" + exit 1 + fi + return 0 +} + +R=TEST.H5L.SE +R2=TEST2.H5L.SE +R3=TEST3.H5L.SE +R4=TEST4.H5L.SE + +KRB5_CONFIG="${objdir}/krb5-authz.conf" +export KRB5_CONFIG + +echo "Checking 1-component principal names in default realms" +check_localname mapped1@${R} 0 foo || exit 1 +check_localname mapped2@${R} 0 bar || exit 1 +check_localname mapped1@${R2} 0 m1 || exit 1 +check_localname mapped2@${R2} 0 m2 || exit 1 +check_localname mapped1@${R3} 0 mapped1 || exit 1 +check_localname mapped2@${R3} 0 mapped2 || exit 1 +check_localname notmapped1@${R} 0 notmapped1 || exit 1 +check_localname notmapped1@${R2} 0 notmapped1 || exit 1 +check_localname notmapped1@${R3} 0 notmapped1 || exit 1 + +echo "Checking 1-component principal names in non-default realm" +check_localname mapped1@${R4} 1 || exit 1 +check_localname notmapped1@${R4} 1 || exit 1 + +echo "Checking 2-component principal names" +check_localname foo/mapped1@${R} 0 foo || exit 1 +check_localname foo/mapped2@${R} 0 bar || exit 1 +check_localname bar/mapped1@${R2} 0 foobar || exit 1 +check_localname bar/mapped2@${R2} 0 foobaz || exit 1 +check_localname foo/mapped1@${R3} 1 || exit 1 +check_localname bar/mapped1@${R3} 1 || exit 1 +check_localname foo/notmapped1@${R} 1 || exit 1 +check_localname bar/notmapped1@${R2} 1 || exit 1 + +echo "Checking 2-component principal names in non-default realm" +check_localname foo/mapped1@${R4} 1 || exit 1 +check_localname bar/mapped1@${R4} 1 || exit 1 +check_localname foo/notmapped1@${R4} 1 || exit 1 +check_localname bar/notmapped1@${R4} 1 || exit 1 + +echo "Checking for overflow" +test_alname="${test_alname} --simple --lname-size=1" +check_localname mapped1@${R} 3 || exit 1 +check_localname mapped2@${R} 3 || exit 1 +check_localname mapped1@${R2} 3 || exit 1 +check_localname mapped2@${R2} 3 || exit 1 +check_localname mapped1@${R3} 3 || exit 1 +check_localname mapped2@${R3} 3 || exit 1 + +echo "Checking krb5_kuserok()" +${test_kuserok} random-princ@RANDOM-REALM foo > /dev/null || exit 1 +${test_kuserok} mapped1@${R} foo > /dev/null || exit 1 +${test_kuserok} mapped1@${R2} m1 > /dev/null || exit 1 +${test_kuserok} notmapped1@${R3} notmapped1 > /dev/null || exit 1 +${test_kuserok} this-better-not-exist@NOR-THIS foo > /dev/null && exit 1 + +# If the user running this test has a ~/.k5login or .k5logind, test +# based on their content +if test -n "${HOME}" -a -n "${USER:-${LOGNAME}}" -a -s "${HOME}/.k5login"; then + echo "Checking ~/.k5login" + while read princ; do + ${test_kuserok} "${princ}" "${USER:-${LOGNAME}}" > /dev/null || exit 1 + done < "${HOME}/.k5login" || exit 1 +fi +if test -n "${HOME}" -a -n "${USER:-${LOGNAME}}" -a -d "${HOME}/.k5login.d"; then + echo "Checking ~/.k5login.d" + ls -f "${HOME}/.k5login.d" | egrep -v '^(\.|\.\.|#.*|.*~|\.*.sw.)$' | while read f; do + f="${HOME}/.k5login.d/$f" + test -d "${f}" && continue + while read princ; do + ${test_kuserok} "${princ}" "${USER:-${LOGNAME}}" > /dev/null || exit 1 + done < "${f}" || exit 1 + done || exit 1 +fi + +KRB5_CONFIG="${objdir}/krb5-authz2.conf" +export KRB5_CONFIG + +echo "Checking krb5_kuserok() (with authoritative k5login files)" +${test_kuserok} random-princ@RANDOM-REALM foo > /dev/null || exit 1 +${test_kuserok} mapped1@${R} foo > /dev/null && exit 1 +${test_kuserok} mapped1@${R2} m1 > /dev/null || exit 1 +${test_kuserok} notmapped1@${R3} notmapped1 > /dev/null || exit 1 +${test_kuserok} this-better-not-exist@NOR-THIS foo > /dev/null && exit 1 + +rm -f messages.log + +exit 0 diff --git a/crypto/heimdal/tests/kdc/check-canon.in b/crypto/heimdal/tests/kdc/check-canon.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-canon.in @@ -0,0 +1,210 @@ +#!/bin/sh +# +# Copyright (c) 2011, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +# OF THE POSSIBILITY OF SUCH DAMAGE. + +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +# (krb5_kt_get_entry() is tested in another test) +${have_db} || exit 77 + +R1=TEST.H5L.SE +R2=TEST2.H5L.SE +R3=TEST3.H5L.SE + +port=@port@ + +kadmin="${kadmin} -l -r ${R1}" +kdc="${kdc} --addresses=localhost -P $port" + +cache="FILE:${objdir}/cache.krb5" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +KRB5_CONFIG="${objdir}/krb5-canon.conf" +export KRB5_CONFIG + +testfailed="echo test failed; ${klist}; exit 1" + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo "Creating database" +initflags="init --realm-max-ticket-life=1day --realm-max-renewable-life=1month" + +${kadmin} ${initflags} ${R1} || exit 1 +${kadmin} ${initflags} ${R2} || exit 1 +${kadmin} ${initflags} ${R3} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R1} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R1}@${R2} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R2}@${R1} || exit 1 +${kadmin} add -p cross3 --use-defaults krbtgt/${R3}@${R1} || exit 1 +${kadmin} add -p cross4 --use-defaults krbtgt/${R1}@${R3} || exit 1 +${kadmin} add -p cross5 --use-defaults krbtgt/${R3}@${R2} || exit 1 +${kadmin} add -p cross6 --use-defaults krbtgt/${R2}@${R3} || exit 1 + +${kadmin} add -p foo --use-defaults host/t1@${R1} || exit 1 +${kadmin} add -p foo --use-defaults host/t2@${R2} || exit 1 +${kadmin} add -p foo --use-defaults host/t3@${R3} || exit 1 +${kadmin} add -p foo --use-defaults host/t11.test1.h5l.se@${R1} || exit 1 +${kadmin} add -p foo --use-defaults host/t12.test1.h5l.se@${R2} || exit 1 +${kadmin} add -p foo --use-defaults host/t22.test2.h5l.se@${R2} || exit 1 +${kadmin} add -p foo --use-defaults host/t23.test2.h5l.se@${R3} || exit 1 +${kadmin} add -p foo --use-defaults host/t33.test3.h5l.se@${R3} || exit 1 + + +echo "Doing database check" +${kadmin} check ${R1} || exit 1 +${kadmin} check ${R2} || exit 1 +${kadmin} check ${R3} || exit 1 + +echo foo > ${objdir}/foopassword + +echo "Starting kdc" ; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + +echo "Getting client initial tickets"; +${kinit} --password-file=${objdir}/foopassword foo@${R1} || \ + { ec=1 ; eval "${testfailed}"; } + +echo "get service tickets (success)" +for host in t1 t2 t3 t11 t12 t22 t33 ; do + echo " $host" + ${kgetcred} --name-type=SRV_HST host $host || { ec=1 ; eval "${testfailed}"; } +done +echo "get service tickets (failure)" +for host in t23 ; do + echo " $host" + ${kgetcred} --name-type=SRV_HST host $host 2>/dev/null && { ec=1 ; eval "${testfailed}"; } +done + +echo "check result" +${klist} | grep 'host/t1@$' > /dev/null || + { ec=1 ; echo "t1 referral entry not present"; eval "${testfailed}"; } +${klist} | grep "host/t1@${R1}" > /dev/null || + { ec=1 ; echo "canonicalized t1 entry not present"; eval "${testfailed}"; } +${klist} | grep 'host/t2@$' > /dev/null || + { ec=1 ; echo "t2 referral entry not present"; eval "${testfailed}"; } +${klist} | grep "host/t2@${R2}" > /dev/null || + { ec=1 ; echo "canonicalized t2 entry not present"; eval "${testfailed}"; } +${klist} | grep 'host/t3@$' > /dev/null || + { ec=1 ; echo "t3 referral entry not present"; eval "${testfailed}"; } +${klist} | grep "host/t3@${R3}" > /dev/null || + { ec=1 ; echo "canonicalized t3 entry not present"; eval "${testfailed}"; } +${klist} | grep 'host/t11@$' > /dev/null || + { ec=1 ; echo "t11 referral entry not present"; eval "${testfailed}"; } +${klist} | grep "host/t11.test1.h5l.se@${R1}" > /dev/null || + { ec=1 ; echo "canonicalized t11 entry not present"; eval "${testfailed}"; } +${klist} | grep 'host/t12@$' > /dev/null || + { ec=1 ; echo "t12 referral entry not present"; eval "${testfailed}"; } +${klist} | grep "host/t12.test1.h5l.se@${R2}" > /dev/null || + { ec=1 ; echo "canonicalized t12 entry not present"; eval "${testfailed}"; } +${klist} | grep 'host/t22@$' > /dev/null || + { ec=1 ; echo "t22 referral entry not present"; eval "${testfailed}"; } +${klist} | grep "host/t22.test2.h5l.se@${R2}" > /dev/null || + { ec=1 ; echo "canonicalized t22 entry not present"; eval "${testfailed}"; } +${klist} | grep 'host/t33@$' > /dev/null || + { ec=1 ; echo "t33 referral entry not present"; eval "${testfailed}"; } +${klist} | grep "host/t33.test3.h5l.se@${R3}" > /dev/null || + { ec=1 ; echo "canonicalized t33 entry not present"; eval "${testfailed}"; } + + +${kdestroy} + +if false; then + + # This may not be portable. It'd be nice to be able to set more of the + # resolver configuration via the environment! + LOCALDOMAIN=test1.h5l.se + export LOCALDOMAIN + KRB5_CONFIG="${objdir}/krb5-canon2.conf" + export KRB5_CONFIG + + echo "Getting client initial tickets (round 2)"; + ${kinit} --password-file=${objdir}/foopassword foo@${R1} || \ + { ec=1 ; eval "${testfailed}"; } + + echo "get service tickets (success)" + for host in t1 t2 t3 t11 ; do + echo " $host" + ${kgetcred} --name-type=SRV_HST host $host || { ec=1 ; eval "${testfailed}"; } + done + echo "get service tickets (failure)" + for host in t12 t22 t23 t33 ; do + echo " $host" + ${kgetcred} --name-type=SRV_HST host $host 2> /dev/null && + { ec=1 ; eval "${testfailed}"; } + done + + echo "check result" + ${klist} | grep 'host/t1@$' > /dev/null || + { ec=1 ; echo "t1 referral entry not present"; eval "${testfailed}"; } + ${klist} | grep "host/t1@${R1}" > /dev/null || + { ec=1 ; echo "canonicalized t1 entry not present"; eval "${testfailed}"; } + ${klist} | grep 'host/t2@$' > /dev/null || + { ec=1 ; echo "t2 referral entry not present"; eval "${testfailed}"; } + ${klist} | grep "host/t2@${R2}" > /dev/null || + { ec=1 ; echo "canonicalized t2 entry not present"; eval "${testfailed}"; } + ${klist} | grep 'host/t3@$' > /dev/null || + { ec=1 ; echo "t3 referral entry not present"; eval "${testfailed}"; } + ${klist} | grep "host/t3@${R3}" > /dev/null || + { ec=1 ; echo "canonicalized t3 entry not present"; eval "${testfailed}"; } + ${klist} | grep 'host/t11@$' > /dev/null || + { ec=1 ; echo "t11 referral entry not present"; eval "${testfailed}"; } + ${klist} | grep "host/t11.test1.h5l.se@${R1}" > /dev/null || + { ec=1 ; echo "canonicalized t11 entry not present"; eval "${testfailed}"; } + + + ${kdestroy} +fi + + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-cc.in b/crypto/heimdal/tests/kdc/check-cc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-cc.in @@ -0,0 +1,149 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +KRB5_CONFIG="${objdir}/krb5-cc.conf" +export KRB5_CONFIG + +unset KRB5CCNAME + +testfailed="echo test failed; exit 1" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +port=@port@ +pwport=@pwport@ + +kinit="${kinit} --password-file=${objdir}/foopassword ${afs_no_afslog}" +kdestroy="${kdestroy} ${afs_no_unlog}" +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +cp "${objdir}/krb5.conf" "${objdir}/krb5-cc.conf" + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p foo --use-defaults bar@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${server}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc ; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + +(cat ${objdir}/krb5.conf ; \ + echo '' ; \ + echo '[libdefaults]' ; \ + echo " default_cc_type = SCC" ; \ + echo '' ) \ + > ${objdir}/krb5-cc.conf + +${kswitch} -p foo@${R} 2>/dev/null && ${kdestroy} +${kswitch} -p foo@${R} 2>/dev/null && ${kdestroy} +${kswitch} -p bar@${R} 2>/dev/null && ${kdestroy} +${kswitch} -p bar@${R} 2>/dev/null && ${kdestroy} + +echo "getting default tickets"; > messages.log +${kinit} foo@${R} || { ec=1 ; eval "${testfailed}"; } +${kswitch} -p foo@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -l | grep foo@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "getting both tickets"; > messages.log +${kinit} -c SCC:1 foo@${R} || { ec=1 ; eval "${testfailed}"; } +${kinit} -c SCC:2 bar@${R} || { ec=1 ; eval "${testfailed}"; } +echo "switch foo" +${kswitch} -p foo@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} | head -2 | grep foo@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +${klist} -l | grep foo@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +${klist} -l | grep bar@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +echo "switch bar" +${kswitch} -p bar@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} | head -2 | grep bar@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +${klist} -l | grep foo@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +${klist} -l | grep bar@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +echo "delete bar" +${kdestroy} +echo "check that bar is gone" +${klist} -l | grep bar@ >/dev/null && { ec=1 ; eval "${testfailed}"; } +echo "check that foo is still there" +${klist} -l | grep foo@ >/dev/null || { ec=1 ; eval "${testfailed}"; } +${kswitch} -p foo@${R} || { ec=1 ; eval "${testfailed}"; } +echo "delete foo" +${kdestroy} || { ec=1 ; eval "${testfailed}"; } +echo "check that foo is gone" +${klist} -l | grep foo@ >/dev/null && { ec=1 ; eval "${testfailed}"; } +echo "check that bar is gone" +${klist} -l | grep bar@ >/dev/null && { ec=1 ; eval "${testfailed}"; } + + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-delegation.in b/crypto/heimdal/tests/kdc/check-delegation.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-delegation.in @@ -0,0 +1,152 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE +R2=TEST2.H5L.SE +R3=TEST3.H5L.SE +R4=TEST4.H5L.SE + +port=@port@ + +kadmin="${kadmin} -l -r ${R}" +kdc="${kdc} --addresses=localhost -P $port" + +server=host/datan.test4.h5l.se@TEST4.H5L.ORG +cache="FILE:${objdir}/cache.krb5" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +testfailed="echo test failed; ${klist} -v ; exit 1" + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +initflags="init --realm-max-ticket-life=1day --realm-max-renewable-life=1month" + +${kadmin} ${initflags} ${R} || exit 1 +${kadmin} ${initflags} ${R2} || exit 1 +${kadmin} ${initflags} ${R3} || exit 1 +${kadmin} ${initflags} ${R4} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R2}@${R} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R3}@${R2} || exit 1 +${kadmin} add -p cross3 --use-defaults krbtgt/${R4}@${R3} || exit 1 + +${kadmin} modify --attributes=+ok-as-delegate krbtgt/${R2}@${R} || exit 1 +${kadmin} modify --attributes=+ok-as-delegate krbtgt/${R3}@${R2} || exit 1 + +${kadmin} add -p foo --use-defaults host/server.test3.h5l.se@${R3} || exit 1 +${kadmin} modify --attributes=+ok-as-delegate host/server.test3.h5l.se@${R3} || exit 1 +${kadmin} add -p foo --use-defaults host/noserver.test3.h5l.se@${R3} || exit 1 + +${kadmin} add -p foo --use-defaults host/server.test4.h5l.se@${R4} || exit 1 +${kadmin} modify --attributes=+ok-as-delegate host/server.test4.h5l.se@${R4} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 +${kadmin} check ${R2} || exit 1 +${kadmin} check ${R3} || exit 1 +${kadmin} check ${R4} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } + +echo "get cross realm manually" +${kgetcred} krbtgt/${R2}@${R} || { ec=1 ; eval "${testfailed}"; } +${kgetcred} krbtgt/${R3}@${R2} || { ec=1 ; eval "${testfailed}"; } +${kgetcred} krbtgt/${R4}@${R3} || { ec=1 ; eval "${testfailed}"; } +${kgetcred} host/server.test3.h5l.se@${R3} || { ec=1 ; eval "${testfailed}"; } +${kgetcred} host/server.test4.h5l.se@${R4} || { ec=1 ; eval "${testfailed}"; } + + +echo "check result" +${klist} -v | awk '/Server:.*host.server.test3/{c=8}{if(c-->0){print}}' | grep 'Ticket flags:.*ok-as-delegate' > /dev/null || \ + { ec=1 ; echo "server.test3 failed"; eval "${testfailed}"; } +${klist} -v | awk '/Server:.*host.noserver.test3/{c=8}{if(c-->0){print}}' | grep 'Ticket flags:.*ok-as-delegate' 2> /dev/null && \ + { ec=1 ; echo "noserver.test3 failed"; eval "${testfailed}"; } +${klist} -v | awk '/Server:.*host.server.test4/{c=8}{if(c-->0){print}}' | grep 'Ticket flags:.*ok-as-delegate' 2> /dev/null && \ + { ec=1 ; echo "server.test4 failed" ; eval "${testfailed}"; } + +${kdestroy} + +#echo "Getting client initial tickets"; > messages.log +#${kinit} --password-file=${objdir}/foopassword foo@${R} || \ +# { ec=1 ; eval "${testfailed}"; } +# +#echo "get cross realm automagicly" +#${kgetcred} host/server.test4.h5l.se@${R4} || { ec=1 ; eval "${testfailed}"; } +# +#echo "check result" +#${klist} -v | grep -A8 -e 'Server:.*server.test4' | grep 'Ticket flags:.*ok-as-delegate' && { ec=1 ; eval "${testfailed}"; } +# +#${kdestroy} + + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-des.in b/crypto/heimdal/tests/kdc/check-des.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-des.in @@ -0,0 +1,155 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +testfailed="echo test failed; cat messages.log; exit 1" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE +R2=TEST2.H5L.SE + +port=@port@ + +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + +afsserver=afs/test.h5l.se +hostserver=host/server.test.h5l.se +cache="FILE:${objdir}/cache.krb5" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R2} || exit 1 + +${kadmin} cpw -r krbtgt/${R}@${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${afsserver}@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${hostserver}@${R} || exit 1 +${kadmin} add_enctype -r ${afsserver}@${R} des-cbc-crc || exit 1 +${kadmin} add_enctype -r ${hostserver}@${R} des-cbc-crc || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting non des tickets (afs)"; > messages.log +${kgetcred} ${afsserver}@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -v | grep des-cbc-crc > /dev/null && { ec=1 ; eval "${testfailed}"; } +echo "Getting non des tickets (host/)"; > messages.log +${kgetcred} ${hostserver}@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -v | grep des-cbc-crc > /dev/null && { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting des tickets (fail test)"; > messages.log +${kgetcred} -e des-cbc-crc ${hostserver}@${R} 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting non des tickets"; > messages.log +${kgetcred} ${afsserver}@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -v | grep des-cbc-crc > /dev/null && { ec=1 ; eval "${testfailed}"; } + + +KRB5_CONFIG="${objdir}/krb5-weak.conf" + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting non des tickets (host/), failure test"; > messages.log +${kgetcred} -e des-cbc-crc ${hostserver}@${R} 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } +${klist} -v | grep des-cbc-crc > /dev/null && { ec=1 ; eval "${testfailed}"; } + +echo "Getting des tickets (afs)"; > messages.log +${kgetcred} -e des-cbc-crc ${afsserver}@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -v | grep des-cbc-crc > /dev/null || { ec=1 ; eval "${testfailed}"; } + +${kdestroy} + + + +${kdestroy} + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-digest.in b/crypto/heimdal/tests/kdc/check-digest.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-digest.in @@ -0,0 +1,291 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" +srcdir="@srcdir@" + +testfailed="echo test failed; cat messages.log; exit 1" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" +ocache="FILE:${objdir}/ocache.krb5" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kdigest="${kdigest} --ccache=$cache" + +username=foo +userpassword=digestpassword + +password=foobarbaz + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p $userpassword --use-defaults ${username}@${R} || exit 1 +${kadmin} add -p $password --use-defaults ${server}@${R} || exit 1 +${kadmin} add -p kaka --use-defaults digest/${R}@${R} || exit 1 +${kadmin} modify --attributes=+allow-digest ${server}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo $password > ${objdir}/foopassword + +echo "Starting kdc" ; > messages.log +env ${HEIM_MALLOC_DEBUG} ${kdc} --detach --testing || + { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; cat messages.log; exit 1;" EXIT + +exitcode=0 + +echo "Getting digest server tickets" +${kinit} --password-file=${objdir}/foopassword ${server}@$R || exitcode=1 +${kdigest} digest-server-init \ + --kerberos-realm=${R} \ + --type=CHAP > /dev/null || exitcode=1 + +echo "Trying NTLM" + +NTLM_ACCEPTOR_CCACHE="$cache" +export NTLM_ACCEPTOR_CCACHE + +echo "Trying server-init" +${kdigest} ntlm-server-init \ + --kerberos-realm=${R} \ + > sdigest-init || exitcode=1 + +echo "test_ntlm" +${test_ntlm} || { echo "test_ntlm failed"; exit 1; } + +NTLM_USER_FILE="${srcdir}/ntlm-user-file.txt" +export NTLM_USER_FILE + +echo "test_context --mech-type=ntlm" +${test_context} --mech-type=ntlm \ + --client-name=foo@TEST \ + --name-type=hostbased-service datan@TEST || \ + { echo "test_context 1 failed"; exit 1; } + +${test_context} --mech-type=ntlm \ + --client-name=foo@TEST \ + --name-type=hostbased-service datan@host.TEST || \ + { echo "test_context 2 failed"; exit 1; } + +${test_context} --mech-type=ntlm \ + --client-name=foo@TEST \ + --name-type=hostbased-service datan@host.test.domain2 || \ + { echo "test_context 3 failed"; exit 1; } + +echo "Trying SL in NTLM" + + +for type in \ + "" \ + "--getverifymic" \ + "--wrapunwrap" \ + "--getverifymic --wrapunwrap" \ + ; do + + echo "Trying NTLM type: ${type}" + ${test_context} --mech-type=ntlm ${type} \ + --client-name=foo@TEST \ + --name-type=hostbased-service datan@TEST || \ + { echo "test_context 1 failed"; exit 1; } + +done + + +echo "Trying CHAP" + +${kdigest} digest-server-init \ + --kerberos-realm=${R} \ + --type=CHAP \ + > sdigest-reply || exitcode=1 + +snonce=`grep server-nonce= sdigest-reply | cut -f2- -d=` +identifier=`grep identifier= sdigest-reply | cut -f2- -d=` +opaque=`grep opaque= sdigest-reply | cut -f2- -d=` + +${kdigest} digest-client-request \ + --type=CHAP \ + --username="$username" \ + --password="$userpassword" \ + --opaque="$opaque" \ + --server-identifier="$identifier" \ + --server-nonce="$snonce" \ + > cdigest-reply || exitcode=1 + +cresponseData=`grep responseData= cdigest-reply | cut -f2- -d=` + +#echo user: $username +#echo server-nonce: $snonce +#echo opaqeue: $opaque +#echo identifier: $identifier + +${kdigest} digest-server-request \ + --kerberos-realm=${R} \ + --type=CHAP \ + --username="$username" \ + --opaque="$opaque" \ + --client-response="$cresponseData" \ + --server-identifier="$identifier" \ + --server-nonce="$snonce" \ + > s2digest-reply || exitcode=1 + +status=`grep status= s2digest-reply | cut -f2- -d=` + +if test "X$status" = "Xok" ; then + echo "CHAP response ok" +else + echo "CHAP response failed" + exitcode=1 +fi + +cresponseData=`echo $cresponseData | sed 's/..../DEADBEEF/'` + +${kdigest} digest-server-request \ + --kerberos-realm=${R} \ + --type=CHAP \ + --username="$username" \ + --opaque="$opaque" \ + --client-response="$cresponseData" \ + --server-identifier="$identifier" \ + --server-nonce="$snonce" \ + > s2digest-reply || exitcode=1 + +status=`grep status= s2digest-reply | cut -f2- -d=` + +if test "X$status" = "Xfailed" ; then + echo "CHAP response fail as it should" +else + echo "CHAP response succeeded errorously" + exitcode=1 +fi + +echo "Trying MS-CHAP-V2" + +${kdigest} digest-server-init \ + --kerberos-realm=${R} \ + --type=MS-CHAP-V2 \ + > sdigest-reply || exitcode=1 + +snonce=`grep server-nonce= sdigest-reply | cut -f2- -d=` +opaque=`grep opaque= sdigest-reply | cut -f2- -d=` +cnonce="21402324255E262A28295F2B3A337C7E" + +echo "MS-CHAP-V2 client request" +${kdigest} digest-client-request \ + --type=MS-CHAP-V2 \ + --username="$username" \ + --password="$userpassword" \ + --opaque="$opaque" \ + --client-nonce="$cnonce" \ + --server-nonce="$snonce" \ + > cdigest-reply || exitcode=1 + +cresponseData=`grep responseData= cdigest-reply | cut -f2- -d=` +cRsp=`grep AuthenticatorResponse= cdigest-reply | cut -f2- -d=` +ckey=`grep session-key= cdigest-reply | cut -f2- -d=` + +${kdigest} digest-server-request \ + --kerberos-realm=${R} \ + --type=MS-CHAP-V2 \ + --username="$username" \ + --opaque="$opaque" \ + --client-response="$cresponseData" \ + --client-nonce="$cnonce" \ + --server-nonce="$snonce" \ + > s2digest-reply || exitcode=1 + +status=`grep status= s2digest-reply | cut -f2- -d=` +sRsp=`grep rsp= s2digest-reply | cut -f2- -d=` +skey=`grep session-key= s2digest-reply | cut -f2- -d=` + +if test "X$sRsp" != "X$cRsp" ; then + echo "rsp wrong $sRsp != $cRsp" + exitcode=1 +fi + +if test "X$skey" != "X$ckey" ; then + echo "rsp wrong" + exitcode=1 +fi + +if test "X$status" = "Xok" ; then + echo "MS-CHAP-V2 response ok" +else + echo "MS-CHAP-V2 response failed" + exitcode=1 +fi + +trap "" EXIT + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +exit $exitcode + diff --git a/crypto/heimdal/tests/kdc/check-fast.in b/crypto/heimdal/tests/kdc/check-fast.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-fast.in @@ -0,0 +1,183 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2011 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +KRB5_CONFIG="${1-${objdir}/krb5.conf}" +export KRB5_CONFIG + +testfailed="echo test failed; cat messages.log; exit 1" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" +acache="FILE:${objdir}/acache.krb5" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +akinit="${kinit} -c $acache ${afs_no_afslog}" +klist="${klist} -c $cache" +aklist="${klist} -c $acache" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p foo --use-defaults ${server}@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo foo > ${objdir}/foopassword +echo bar > ${objdir}/barpassword + +echo Starting kdc ; > messages.log +env MallocStackLogging=1 MallocStackLoggingNoCompact=1 MallocErrorAbort=1 MallocLogFile=${objdir}/malloc-log \ +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; cat messages.log; exit 1;" EXIT + +ec=0 + +# +# Check armor ticket +# + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Checking for FAST avail" +${klist} --hidden | grep fast_avail > /dev/null || { exit 1; } +echo "Getting tickets"; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Listing tickets"; > messages.log +${klist} > /dev/null || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Acquire host ticket to be used as an ARMOR ticket"; > messages.log +${akinit} --password-file=${objdir}/foopassword ${server}@${R} >/dev/null|| { exit 1; } +echo "Checking for FAST avail (in the FAST armor cache)"; > messages.log +${aklist} --hidden | grep fast_avail > /dev/null || { exit 1; } + +# +# Client tests +# + +echo "Getting client initial tickets with FAST armor ticket"; > messages.log +${kinit} --fast-armor-cache=${acache} \ + --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting client initial tickets with FAST armor ticket [failure]"; > messages.log +${kinit} --fast-armor-cache=${acache} \ + --password-file=${objdir}/barpassword foo@$R 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +echo "Checking for FAST avail (in the FAST acquired cache)"; > messages.log +${klist} --hidden | grep fast_avail > /dev/null || { exit 1; } + +echo "Getting service ticket" +${kgetcred} ${server}@${R} || { exit 1; } +${kdestroy} + +# +# Use MIT client tools +# + +mit=/usr/local/mitkerberos/bin + +if [ -f ${mit}/kinit ] ; then + echo "Running MIT FAST tests" + + kinitpty=${objdir}/foopassword.rkpty +cat > ${kinitpty} < messages.log + ${rkpty} ${kinitpty} ${mit}/kinit -c ${acache} ${server}@${R} >/dev/null|| { exit 1; } + (${aklist} | grep ${server} > /dev/null ) || { exit 1; } + + echo "Checking for FAST avail"; > messages.log + ${aklist} --hidden | grep fast_avail > /dev/null || { exit 1; } + + echo "Using plain to get a initial ticket"; > messages.log + ${rkpty} ${kinitpty} ${mit}/kinit -c ${cache} foo@${R} >/dev/null|| { exit 1; } + (${klist} | grep foo > /dev/null ) || { exit 1; } + + echo "Using FAST to get a initial ticket"; > messages.log + ${rkpty} ${kinitpty} ${mit}/kinit -c ${cache} -T ${acache} foo@${R} >/dev/null || { exit 1; } + (${klist} | grep foo > /dev/null ) || { exit 1; } + + echo "Checking for FAST avail"; > messages.log + ${klist} --hidden | grep fast_avail > /dev/null || { exit 1; } + + echo "Getting service ticket"; > messages.log + ${mit}/kvno -c ${cache} ${server}@${R} || { exit 1; } + +fi + + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-hdb-mitdb.in b/crypto/heimdal/tests/kdc/check-hdb-mitdb.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-hdb-mitdb.in @@ -0,0 +1,111 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +KRB5_CONFIG="${1-${objdir}/krb5-hdb-mitdb.conf}" +export KRB5_CONFIG + +testfailed="echo test failed; cat messages.log; exit 1" + +# If there is no ldap support compiled in, disable test +if ${kdc} --builtin-hdb | grep mit-db > /dev/null ; then + : +else + echo "no MIT KDB support" + exit 77 +fi + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +kadmin="${kadmin} -l -r $R --config-file=${KRB5_CONFIG}" +kdc="${kdc} --addresses=localhost -P $port" + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Database should exist + +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc ; > messages.log +env MallocStackLogging=1 MallocStackLoggingNoCompact=1 MallocErrorAbort=1 MallocLogFile=${objdir}/malloc-log \ +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting tickets"; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Listing tickets"; > messages.log +${klist} > /dev/null || { ec=1 ; eval "${testfailed}"; } +${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-iprop.in b/crypto/heimdal/tests/kdc/check-iprop.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-iprop.in @@ -0,0 +1,477 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +db_type=@db_type@ + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + + +# Don't run this test in AFS, since it lacks support for AF_UNIX +expr "X`/bin/pwd || pwd`" : "X/afs/.*" > /dev/null 2>/dev/null && exit 77 + +R=TEST.H5L.SE + +port=@port@ + +cache="FILE:${objdir}/cache.krb5" +keytabfile=${objdir}/iprop.keytab +keytab="FILE:${keytabfile}" + +kdc="${kdc} --addresses=localhost -P $port" +kadmin="${kadmin} -r $R" +kinit="${kinit} -c $cache ${afs_no_afslog}" + +slave_ver_from_master_old= +slave_ver_from_master_new= +slave_ver_old= +slave_ver_new= +get_iprop_ver () { + min_change=${1:-1} + slave_ver_from_master_new=`grep '^iprop/' iprop-stats | head -1 | awk '{print $3}'` + slave_ver_new=`grep 'up-to-date with version:' iprop-slave-status | awk '{print $4}'` + if [ -z "$slave_ver_from_master_new" -o -z "$slave_ver_new" ]; then + return 1 + fi + if [ x"$slave_ver_from_master_new" != x"$slave_ver_new" ]; then + return 1 + fi + if [ x"$slave_ver_from_master_old" != x ]; then + change=`expr "$slave_ver_from_master_new" - "$slave_ver_from_master_old"` + if [ "$change" -lt "$min_change" ]; then + return 1 + fi + fi + slave_ver_from_master_old=$slave_ver_from_master_new + slave_ver_old=$slave_ver_new + return 0 +} + +waitsec=65 +sleeptime=2 +wait_for () { + msg=$1 + shift + t=0 + while ! "$@"; do + sleep $sleeptime; + t=`expr $t + $sleeptime` + if [ $t -gt $waitsec ]; then + echo "Waited too long for $msg" + exit 1 + fi + done + return 0 +} + +check_pidfile_is_dead () { + if test ! -f lt-${1}.pid -a ! -f ${1}.pid; then + return 0 + fi + _pid=`cat lt-${1}.pid ${1}.pid 2>/dev/null` + if [ -z "$_pid" ]; then + return 0 + fi + if kill -0 $_pid 2>/dev/null; then + return 1 + fi + return 0 +} + +wait_for_slave () { + wait_for "iprop versions to change and/or slave to catch up" get_iprop_ver "$@" +} + +wait_for_master_down () { + wait_for "master to exit" check_pidfile_is_dead ipropd-master +} + +wait_for_slave_down () { + wait_for "slave to exit" check_pidfile_is_dead ipropd-slave +} + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} +rm -f current-db* +rm -f current*.log +rm -f out-* +rm -f mkey.file* +rm -f messages.log + +> messages.log + +echo Creating database +${kadmin} -l \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} -l add -p foo --use-defaults user@${R} || exit 1 + +${kadmin} -l add --random-key --use-defaults iprop/localhost@${R} || exit 1 +${kadmin} -l ext -k ${keytab} iprop/localhost@${R} || exit 1 +${kadmin} -l add --random-key --use-defaults iprop/slave.test.h5l.se@${R} || exit 1 +${kadmin} -l ext -k ${keytab} iprop/slave.test.h5l.se@${R} || exit 1 + +echo foo > ${objdir}/foopassword + +echo "Test log recovery" +${kadmin} -l add --random-key --use-defaults recovtest@${R} || exit 1 +# Test theory: save the log, make a change and save the record it +# produced, restore the log, append to it the saved record, then add dummy +# record. + +# Save the log +cp current.log current.log.tmp +ls -l current.log.tmp | awk '{print $5}' > tmp +read sz < tmp +# Make a change +${kadmin} -l mod -a requires-pre-auth recovtest@${R} || exit 1 +${kadmin} -l get recovtest@${R} | grep 'Attributes: requires-pre-auth$' > /dev/null || exit 1 +# Save the resulting log record +ls -l current.log | awk '{print $5}' > tmp +read nsz < tmp +rm tmp +dd bs=1 if=current.log skip=$sz of=current.log.tmp.saved-record count=`expr $nsz - $sz` 2>/dev/null +# Undo the change +${kadmin} -l mod -a -requires-pre-auth recovtest@${R} || exit 1 +${kadmin} -l get recovtest@${R} | grep 'Attributes:.$' > /dev/null || exit 1 +# Restore the log +cp current.log current.log.save +mv current.log.tmp current.log +# Append the saved record +cat current.log.tmp.saved-record >> current.log +rm current.log.tmp.saved-record +# Check that we still see the principal as modified after another write forcing +# log recovery. +${kadmin} -l add --random-key --use-defaults dummy@${R} || exit 1 +${kadmin} -l del dummy@${R} || exit 1 +${kadmin} -l get recovtest@${R} | grep 'Attributes: requires-pre-auth$' > /dev/null || exit 1 + +# -- foo +ipds= +ipdm= +kdcpid= + +> iprop-stats +rm -f iprop-slave-status + +ipropd_slave="${ipropd_slave} --status-file=iprop-slave-status" + +trap "echo 'killing ipropd s + m + kdc'; kill -9 \${ipdm} \${ipds} \${kdcpid} >/dev/null 2>/dev/null; tail messages.log ; tail iprop-stats; exit 1;" EXIT + +echo Starting kdc ; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +echo "starting master" ; > messages.log +env ${HEIM_MALLOC_DEBUG} \ +${ipropd_master} --hostname=localhost -k ${keytab} \ + --database=${objdir}/current-db --detach || + { echo "ipropd-master failed to start"; exit 1; } +ipdm=`getpid ipropd-master` + +echo "starting slave" ; > messages.log +env ${HEIM_MALLOC_DEBUG} \ +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${ipropd_slave} --hostname=slave.test.h5l.se -k ${keytab} --detach localhost || + { echo "ipropd-slave failed to start"; exit 1; } +ipds=`getpid ipropd-slave` +sh ${wait_kdc} ipropd-slave messages.log 'slave status change: up-to-date' || exit 1 +get_iprop_ver || exit 1 + +echo "checking slave is up" +${EGREP} 'iprop/slave.test.h5l.se@TEST.H5L.SE.*Up' iprop-stats >/dev/null || exit 1 +${EGREP} 'up-to-date with version' iprop-slave-status >/dev/null || { echo "slave to up to date" ; cat iprop-slave-status ; exit 1; } + +# ----------------- checking: pushing lives changes + +slave_get() { KRB5_CONFIG="${objdir}/krb5-slave.conf" ${kadmin} -l get "$@"; } +slave_check_exists() { + # Creation with a random key is not atomic, there are at present + # 3 log entries to create a random key principal, the entry is + # "invalid" for the first two of these. We wait for the entry to + # exist and not be invalid + # + attrs=`slave_get -o attributes "$@" 2>/dev/null` || return 1 + echo $attrs | egrep 'Attributes:' | egrep -v invalid >/dev/null || return 1 + get_iprop_ver 0 +} + +echo "Add host" +${kadmin} -l add --random-key --use-defaults host/foo@${R} || exit 1 +wait_for "Slave sees new host" slave_check_exists "host/foo@${R}" + +echo "Rollover host keys" +${kadmin} -l cpw -r --keepold host/foo@${R} || exit 1 +${kadmin} -l cpw -r --keepold host/foo@${R} || exit 1 +${kadmin} -l cpw -r --keepold host/foo@${R} || exit 1 +wait_for_slave 3 +slave_get host/foo@${R} | \ + ${EGREP} Keytypes: | cut -d: -f2 | tr ' ' ' +' | sed 's/^.*[[]\(.*\)[]].*$/\1/' | grep '[0-9]' | sort -nu | tr -d ' +' | ${EGREP} 1234 > /dev/null || exit 1 + +echo "Delete 3DES keys" +${kadmin} -l del_enctype host/foo@${R} des3-cbc-sha1 +wait_for_slave +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${kadmin} -l get host/foo@${R} | \ + ${EGREP} Keytypes: | cut -d: -f2 | tr ' ' ' +' | sed 's/^.*[[]\(.*\)[]].*$/\1/' | grep '[0-9]' | sort -nu | tr -d ' +' | ${EGREP} 1234 > /dev/null || exit 1 +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${kadmin} -l get host/foo@${R} | \ + ${EGREP} 'Keytypes:.*des3-cbc-sha1' > /dev/null && exit 1 + +echo "Change policy host" +${kadmin} -l modify --policy=default host/foo@${R} || exit 1 +wait_for_slave +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${kadmin} -l get host/foo@${R} > /dev/null 2>/dev/null || exit 1 + +echo "Rename host" +${kadmin} -l rename host/foo@${R} host/bar@${R} || exit 1 +wait_for_slave +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${kadmin} -l get host/foo@${R} > /dev/null 2>/dev/null && exit 1 +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${kadmin} -l get host/bar@${R} > /dev/null || exit 1 + +echo "Delete host" +${kadmin} -l delete host/bar@${R} || exit 1 +wait_for_slave +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${kadmin} -l get host/bar@${R} > /dev/null 2>/dev/null && exit 1 + +# See note below in LMDB sanity checking +echo "Re-add host" +${kadmin} -l add --random-key --use-defaults host/foo@${R} || exit 1 +${kadmin} -l add --random-key --use-defaults host/bar@${R} || exit 1 +wait_for "Slave sees re-added host" slave_check_exists "host/bar@${R}" + +echo "kill slave and remove log and database" +> iprop-stats +sh ${leaks_kill} ipropd-slave $ipds || exit 1 +rm -f iprop-slave-status + +wait_for_slave_down +${EGREP} 'iprop/slave.test.h5l.se@TEST.H5L.SE.*Down' iprop-stats >/dev/null || exit 1 + +# ----------------- checking: slave is missing changes while down + +rm current.slave.log current-db.slave* || exit 1 + +echo "doing changes while slave is down" +${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1 +${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1 + +echo "Making a copy of the master log file" +cp ${objdir}/current.log ${objdir}/current.log.tmp + +# ----------------- checking: checking that master and slaves resyncs + +echo "starting slave again" ; > messages.log +> iprop-stats +env ${HEIM_MALLOC_DEBUG} \ +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${ipropd_slave} --hostname=slave.test.h5l.se -k ${keytab} --detach localhost || + { echo "ipropd-slave failed to start"; exit 1; } +ipds=`getpid ipropd-slave` + +echo "checking slave is up again" +wait_for "slave to start and connect to master" \ + ${EGREP} 'iprop/slave.test.h5l.se@TEST.H5L.SE.*Up' iprop-stats >/dev/null +wait_for_slave 2 +${EGREP} 'up-to-date with version' iprop-slave-status >/dev/null || { echo "slave not up to date" ; cat iprop-slave-status ; exit 1; } +echo "checking for replay problems" +${EGREP} 'Entry already exists in database' messages.log && exit 1 + +echo "compare versions on master and slave logs (no lock)" +KRB5_CONFIG=${objdir}/krb5-slave.conf \ +${iprop_log} last-version -n > slave-last.tmp +${iprop_log} last-version -n > master-last.tmp +cmp master-last.tmp slave-last.tmp || exit 1 + +echo "kill slave and remove log and database" +sh ${leaks_kill} ipropd-slave $ipds || exit 1 +wait_for_slave_down + +rm current.slave.log current-db.slave* || exit 1 +> iprop-stats +rm -f iprop-slave-status +echo "starting slave" ; > messages.log +env ${HEIM_MALLOC_DEBUG} \ +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${ipropd_slave} --hostname=slave.test.h5l.se -k ${keytab} --detach localhost || + { echo "ipropd-slave failed to start"; exit 1; } +ipds=`getpid ipropd-slave` +wait_for_slave 0 + +echo "checking slave is up again" +wait_for "slave to start and connect to master" \ + ${EGREP} 'iprop/slave.test.h5l.se@TEST.H5L.SE.*Up' iprop-stats >/dev/null +${EGREP} 'up-to-date with version' iprop-slave-status >/dev/null || { echo "slave not up to date" ; cat iprop-slave-status ; exit 1; } +echo "checking for replay problems" +${EGREP} 'Entry already exists in database' messages.log && exit 1 + +# ----------------- checking: checking live truncation of master log + +${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1 +wait_for_slave + +echo "live truncate on master log" +${iprop_log} truncate -K 5 || exit 1 +wait_for_slave 0 + +echo "Killing master and slave" +sh ${leaks_kill} ipropd-master $ipdm || exit 1 +sh ${leaks_kill} ipropd-slave $ipds || exit 1 + +rm -f iprop-slave-status + +wait_for_slave_down +wait_for_master_down + +echo "compare versions on master and slave logs" +KRB5_CONFIG=${objdir}/krb5-slave.conf \ +${iprop_log} last-version > slave-last.tmp +${iprop_log} last-version > master-last.tmp +cmp master-last.tmp slave-last.tmp || exit 1 + +# ----------------- checking: master going backward +> iprop-stats +> messages.log + +echo "Going back to old version of the master log file" +cp ${objdir}/current.log.tmp ${objdir}/current.log + +echo "starting master" ; > messages.log +env ${HEIM_MALLOC_DEBUG} \ +${ipropd_master} --hostname=localhost -k ${keytab} \ + --database=${objdir}/current-db --detach || + { echo "ipropd-master failed to start"; exit 1; } +ipdm=`getpid ipropd-master` + +echo "starting slave" ; > messages.log +env ${HEIM_MALLOC_DEBUG} \ +KRB5_CONFIG="${objdir}/krb5-slave.conf" \ +${ipropd_slave} --hostname=slave.test.h5l.se -k ${keytab} --detach localhost || + { echo "ipropd-slave failed to start"; exit 1; } +ipds=`getpid ipropd-slave` +wait_for_slave -1 + +echo "checking slave is up again" +wait_for "slave to start and connect to master" \ + ${EGREP} 'iprop/slave.test.h5l.se@TEST.H5L.SE.*Up' iprop-stats >/dev/null +${EGREP} 'up-to-date with version' iprop-slave-status >/dev/null || { echo "slave to up to date" ; cat iprop-slave-status ; exit 1; } +echo "checking for replay problems" +${EGREP} 'Entry already exists in database' messages.log && exit 1 + +echo "pushing one change" +${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1 +wait_for_slave + +echo "Killing master" +sh ${leaks_kill} ipropd-master $ipdm || exit 1 + +wait_for_master_down + +wait_for "slave to disconnect" \ + ${EGREP} 'disconnected' iprop-slave-status >/dev/null + +if ! tail -30 messages.log | grep 'disconnected for server' > /dev/null; then + echo "client didnt disconnect" + exit 1 +fi + +echo "probing for slave pid" +kill -0 ${ipds} || { echo "slave no longer there"; exit 1; } + +> messages.log + +echo "Staring master again" ; > messages.log +env ${HEIM_MALLOC_DEBUG} \ +${ipropd_master} --hostname=localhost -k ${keytab} \ + --database=${objdir}/current-db --detach || + { echo "ipropd-master failed to start"; exit 1; } +ipdm=`getpid ipropd-master` + +echo "probing for slave pid" +kill -0 ${ipds} || { echo "slave no longer there"; exit 1; } + + +echo "pushing one change" +${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1 +wait_for_slave + +echo "shutting down all services" + +leaked=false +sh ${leaks_kill} kdc $kdcpid || leaked=true +sh ${leaks_kill} ipropd-master $ipdm || leaked=true +sh ${leaks_kill} ipropd-slave $ipds || leaked=true +rm -f iprop-slave-status +trap "" EXIT +$leaked && exit 1 + +echo "compare versions on master and slave logs" +KRB5_CONFIG=${objdir}/krb5-slave.conf \ +${iprop_log} last-version > slave-last.tmp +${iprop_log} last-version > master-last.tmp +cmp master-last.tmp slave-last.tmp || exit 1 + +if [ "$db_type" = lmdb ] && type mdb_stat > /dev/null 2>&1; then + # Sanity check that we have the same number of principals at the HDB + # and LMDB levels. + # + # We should also do this for the sqlite backend, but that would + # require a sqlite3(1) shell that is capable of opening our HDB + # files. + echo "checking that principals in DB == entries in LMDB" + # Add one to match lmdb overhead + princs=`(echo; ${kadmin} -l list '*') | wc -l` + entries=`mdb_stat -n current-db.mdb | grep 'Entries:' | awk '{print $2}'` + [ "$princs" -eq "$entries" ] || exit 1 +fi + +exit 0 diff --git a/crypto/heimdal/tests/kdc/check-kadmin.in b/crypto/heimdal/tests/kdc/check-kadmin.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-kadmin.in @@ -0,0 +1,356 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" +srcdir="@srcdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE +R2=TEST2.H5L.SE + +port=@port@ +admport=@admport@ + +cache="FILE:${objdir}/cache.krb5" + +kadmin="${kadmin} -r $R" +kdc="${kdc} --addresses=localhost -P $port" +kadmind="${kadmind} -p $admport" + +server=host/datan.test.h5l.se + +kinit="${kinit} -c $cache ${afs_no_afslog}" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* +rm -f messages.log + +> messages.log + +echo Creating database +${kadmin} -l \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} -l add -p foo --use-defaults foo/admin@${R} || exit 1 +${kadmin} -l add -p foo --use-defaults bar@${R} || exit 1 +${kadmin} -l add -p foo --use-defaults baz@${R} || exit 1 +${kadmin} -l add -p foo --use-defaults bez@${R} || exit 1 +${kadmin} -l add -p foo --use-defaults fez@${R} || exit 1 +${kadmin} -l add -p foo --use-defaults hasalias@${R} || exit 1 +${kadmin} -l add -p foo --use-defaults pkinit@${R} || exit 1 +${kadmin} -l modify --pkinit-acl="CN=baz,DC=test,DC=h5l,DC=se" pkinit@${R} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc ; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid} ${kadmpid}" EXIT + +#---------------------------------- +echo "kinit (no admin); test mod --alias authorization" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} hasalias@${R} || exit 1 + +${kadmind} -d & +kadmpid=$! +sleep 1 + +# Check that one non-permitted alias -> failure +env KRB5CCNAME=${cache} \ +${kadmin} -p hasalias@${R} modify --alias=goodalias1@${R} --alias=badalias@${R} hasalias@${R} && + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +wait $kadmpid || { echo "kadmind failed $?"; cat messages.log ; exit 1; } + +${kadmind} -d & +kadmpid=$! +sleep 1 + +# Check that all permitted aliases -> success +env KRB5CCNAME=${cache} \ +${kadmin} -p hasalias@${R} modify --alias=goodalias1@${R} --alias=goodalias2@${R} hasalias@${R} || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +wait $kadmpid || { echo "kadmind failed $?"; cat messages.log ; exit 1; } + +${kadmind} -d & +kadmpid=$! +sleep 1 + +# Check that we can drop aliases +env KRB5CCNAME=${cache} \ +${kadmin} -p hasalias@${R} modify --alias=goodalias3@${R} hasalias@${R} || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +wait $kadmpid || { echo "kadmind failed $?"; cat messages.log ; exit 1; } +${kadmin} -l get hasalias@${R} | grep Aliases: > kadmin.tmp +read junk aliases < kadmin.tmp +rm kadmin.tmp +[ "$aliases" != "goodalias3@${R}" ] && { echo "kadmind failed $?"; cat messages.log ; exit 1; } + +${kadmind} -d & +kadmpid=$! +sleep 1 + +env KRB5CCNAME=${cache} \ +${kadmin} -p hasalias@${R} modify --alias=goodalias1@${R} --alias=goodalias2@${R} --alias=goodalias3@${R} hasalias@${R} || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +wait $kadmpid || { echo "kadmind failed $?"; cat messages.log ; exit 1; } +${kadmin} -l get hasalias@${R} | grep Aliases: > kadmin.tmp +read junk aliases < kadmin.tmp +rm kadmin.tmp +[ "$aliases" != "goodalias1@${R} goodalias2@${R} goodalias3@${R}" ] && { echo "FOO failed $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (no admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} bar@${R} || exit 1 +echo "kadmin" +env KRB5CCNAME=${cache} \ +${kadmin} -p bar@${R} add -p foo --use-defaults kaka2@${R} || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } + +${kadmin} -l get kaka2@${R} > /dev/null || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (no admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} baz@${R} || exit 1 +echo "kadmin globacl" +env KRB5CCNAME=${cache} \ +${kadmin} -p baz@${R} get bar@${R} > /dev/null || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (no admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} baz@${R} || exit 1 +echo "kadmin globacl, negative" +env KRB5CCNAME=${cache} \ +${kadmin} -p baz@${R} passwd -p foo bar@${R} > /dev/null 2>/dev/null && + { echo "kadmin succesded $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (no admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} baz@${R} || exit 1 +echo "kadmin globacl" +env KRB5CCNAME=${cache} \ +${kadmin} -p baz@${R} get bar@${R} > /dev/null || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (no admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} bez@${R} || exit 1 +echo "kadmin globacl, negative" +env KRB5CCNAME=${cache} \ +${kadmin} -p bez@${R} passwd -p foo bar@${R} > /dev/null 2>/dev/null && + { echo "kadmin succesded $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (no admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} fez@${R} || exit 1 +echo "kadmin globacl" +env KRB5CCNAME=${cache} \ +${kadmin} -p fez@${R} get bar@${R} > /dev/null || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (no admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} fez@${R} || exit 1 +echo "kadmin globacl, negative" +env KRB5CCNAME=${cache} \ +${kadmin} -p fez@${R} passwd -p foo bar@${R} > /dev/null 2>/dev/null && + { echo "kadmin succesded $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kinit (admin)" +${kinit} --password-file=${objdir}/foopassword \ + -S kadmin/admin@${R} foo/admin@${R} || exit 1 + +echo "kadmin" +env KRB5CCNAME=${cache} \ +${kadmin} -p foo/admin@${R} add -p foo --use-defaults kaka@${R} || + { echo "kadmin failed $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kadmin get doesnotexists" +env KRB5CCNAME=${cache} \ +${kadmin} -p foo/admin@${R} get -s doesnotexists@${R} \ + > /dev/null 2>kadmin.tmp && \ + { echo "kadmin passed"; cat messages.log ; exit 1; } + +# evil hack to support libtool +sed 's/lt-kadmin:/kadmin:/' < kadmin.tmp > kadmin2.tmp +mv kadmin2.tmp kadmin.tmp + +# If client tried IPv6, but service only listened on IPv4 +grep -v ': connect' kadmin.tmp > kadmin2.tmp +mv kadmin2.tmp kadmin.tmp + +cmp kadmin.tmp ${srcdir}/donotexists.txt || \ + { echo "wrong response"; exit 1;} + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kadmin get pkinit-acl" +env KRB5CCNAME=${cache} \ +${kadmin} -p foo/admin@${R} get -o pkinit-acl pkinit@${R} \ + > /dev/null || \ + { echo "kadmin failed $?"; cat messages.log ; exit 1; } + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kadmin get -o principal" +env KRB5CCNAME=${cache} \ +${kadmin} -p foo/admin@${R} get -o principal bar@${R} \ + > kadmin.tmp 2>&1 || \ + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +if test "`cat kadmin.tmp`" != "Principal: bar@TEST.H5L.SE" ; then + cat kadmin.tmp ; cat messages.log ; exit 1 ; +fi + + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kadmin get -o kvno" +env KRB5CCNAME=${cache} \ +${kadmin} -p foo/admin@${R} get -o kvno bar@${R} \ + > kadmin.tmp 2>&1 || \ + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +if test "`cat kadmin.tmp`" != "Kvno: 1" ; then + cat kadmin.tmp ; cat messages.log ; exit 1 ; +fi + + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kadmin get -o princ_expire_time" +env KRB5CCNAME=${cache} \ +${kadmin} -p foo/admin@${R} get -o princ_expire_time bar@${R} \ + > kadmin.tmp 2>&1 || \ + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +if test "`cat kadmin.tmp`" != "Principal expires: never" ; then + cat kadmin.tmp ; cat messages.log ; exit 1 ; +fi + +#---------------------------------- +${kadmind} -d & +kadmpid=$! +sleep 1 + +echo "kadmin get -s -o attributes" +env KRB5CCNAME=${cache} \ +${kadmin} -p foo/admin@${R} get -s -o attributes bar@${R} \ + > kadmin.tmp 2>&1 || \ + { echo "kadmin failed $?"; cat messages.log ; exit 1; } +if test "`cat kadmin.tmp`" != "Attributes" ; then + cat kadmin.tmp ; cat messages.log ; exit 1 ; +fi + +#---------------------------------- + + +echo "killing kdc (${kdcpid} ${kadmpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-kdc-weak.in b/crypto/heimdal/tests/kdc/check-kdc-weak.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-kdc-weak.in @@ -0,0 +1,37 @@ +#!/bin/sh +# +# Copyright (c) 2009 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +objdir="@objdir@" + +exec ${top_builddir}/tests/kdc/check-kdc ${objdir}/krb5-weak.conf diff --git a/crypto/heimdal/tests/kdc/check-kdc.in b/crypto/heimdal/tests/kdc/check-kdc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-kdc.in @@ -0,0 +1,947 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +KRB5_CONFIG="${1-${objdir}/krb5.conf}" +export KRB5_CONFIG + +testfailed="echo test failed; cat messages.log; exit 1" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE +RH=TEST-HTTP.H5L.SE +R2=TEST2.H5L.SE +R3=TEST3.H5L.SE +R4=TEST4.H5L.SE +R5=SOME-REALM5.FR +R6=SOME-REALM6.US +R7=SOME-REALM7.UK +R8=SOME-REALM8.UK + +H1=H1.$R +H2=H2.$R +H3=H3.$H2 +H4=H4.$H2 + +r=`echo "$R" | tr '[A-Z]' '[a-z]'` +h1=`echo "${H1}" | tr '[A-Z]' '[a-z]'` +h2=`echo "${H2}" | tr '[A-Z]' '[a-z]'` +h3=`echo "${H3}" | tr '[A-Z]' '[a-z]'` +h4=`echo "${H4}" | tr '[A-Z]' '[a-z]'` + +port=@port@ +pwport=@pwport@ + +kadmin="${kadmin} -l -r $R" +kadmin5="${kadmin} -l -r $R5" +kdc="${kdc} --addresses=localhost -P $port" +kpasswdd="${kpasswdd} --addresses=localhost -p $pwport" + +server=host/datan.test.h5l.se +server2=host/computer.example.com +serverip=host/10.11.12.13 +serveripname=host/ip.test.h5l.org +serveripname2=host/10.11.12.14 +alias1=host/datan.example.com +alias2=host/datan +aliaskeytab=host/datan +cache="FILE:${objdir}/cache.krb5" +ocache="FILE:${objdir}/ocache.krb5" +o2cache="FILE:${objdir}/o2cache.krb5" +icache="FILE:${objdir}/icache.krb5" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" +ps="proxy-service@${R}" +aesenctype="aes256-cts-hmac-sha1-96" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kgetcred="${kgetcred} -c $cache" +kgetcred_imp="${kgetcred} -c $cache --out-cache=${ocache}" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" +kimpersonate="${kimpersonate} -k ${keytab} --ccache=${ocache}" +test_set_kvno0="${test_set_kvno0} -c $cache" + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R2} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R3} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R4} || exit 1 + +${kadmin5} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R5} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R6} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R7} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R8} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${H1} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${H2} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${H3} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${H4} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${RH} || exit 1 + +${kadmin} cpw -r krbtgt/${R}@${R} || exit 1 +${kadmin} cpw -r krbtgt/${R}@${R} || exit 1 +${kadmin} cpw -r krbtgt/${R}@${R} || exit 1 +${kadmin} cpw -r krbtgt/${R}@${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p foo --use-defaults foo/host.${r}@${R} || exit 1 +${kadmin} add -p foo --use-defaults foo@${R2} || exit 1 +${kadmin} add -p foo --use-defaults foo@${R3} || exit 1 +${kadmin} add -p foo --use-defaults foo@${R4} || exit 1 +${kadmin5} add -p foo --use-defaults foo@${R5} || exit 1 +${kadmin} add -p foo --use-defaults foo@${R6} || exit 1 +${kadmin} add -p foo --use-defaults foo@${R7} || exit 1 +${kadmin} add -p foo --use-defaults foo@${R8} || exit 1 +${kadmin} add -p foo --use-defaults foo@${H1} || exit 1 +${kadmin} add -p foo --use-defaults foo/host.${h1}@${H1} || exit 1 +${kadmin} add -p foo --use-defaults foo@${H2} || exit 1 +${kadmin} add -p foo --use-defaults foo/host.${h2}@${H2} || exit 1 +${kadmin} add -p foo --use-defaults foo@${H3} || exit 1 +${kadmin} add -p foo --use-defaults foo/host.${h3}@${H3} || exit 1 +${kadmin} add -p foo --use-defaults foo@${H4} || exit 1 +${kadmin} add -p foo --use-defaults foo/host.${h4}@${H4} || exit 1 +${kadmin} add -p bar --use-defaults bar@${R} || exit 1 +${kadmin} add -p foo --use-defaults remove@${R} || exit 1 +${kadmin} add -p nop --use-defaults ${server}@${R} || exit 1 +${kadmin} cpw -p bla --keepold ${server}@${R} || exit 1 +${kadmin} cpw -p kaka --keepold ${server}@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${server}-des3@${R} || exit 1 +${kadmin} add -p kaka --use-defaults kt-des3@${R} || exit 1 +${kadmin} add -p kaka --use-defaults foo/des3-only@${R} || exit 1 +${kadmin} add -p kaka --use-defaults bar/des3-only@${R} || exit 1 +${kadmin} add -p kaka --use-defaults foo/aes-only@${R} || exit 1 + +${kadmin} add -p sens --use-defaults --attributes=disallow-forwardable sensitive@${R} || exit 1 +${kadmin} add -p foo --use-defaults ${ps} || exit 1 +${kadmin} modify --attributes=+trusted-for-delegation ${ps} || exit 1 +${kadmin} modify --constrained-delegation=${server} ${ps} || exit 1 +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${ps} || exit 1 + +${kadmin} add -p kaka --use-defaults ${server2}@${R2} || exit 1 +${kadmin} ext -k ${keytab} ${server2}@${R2} || exit 1 +${kadmin} add -p kaka --use-defaults ${serverip}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${serverip}@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${serveripname}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${serveripname}@${R} || exit 1 +${kadmin} modify --alias=${serveripname2}@${R} ${serveripname}@${R} +${kadmin} add -p foo --use-defaults remove2@${R2} || exit 1 + +${kadmin} add -p kaka --use-defaults ${alias1}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${alias1}@${R} || exit 1 +${kadmin} modify --alias=${alias2}@${R} ${alias1}@${R} + +${kadmin} add -p cross1 --use-defaults krbtgt/${R2}@${R} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R}@${R2} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R3}@${R2} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R2}@${R3} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R4}@${R2} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R2}@${R4} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R4}@${R3} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R3}@${R4} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R5}@${R} || exit 1 +${kadmin5} add -p cross2 --use-defaults krbtgt/${R}@${R5} || exit 1 + +${kadmin5} add -p cross1 --use-defaults krbtgt/${R6}@${R5} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R5}@${R6} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R7}@${R6} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R6}@${R7} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R8}@${R6} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R6}@${R8} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${H1}@${R} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R}@${H1} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${H2}@${R} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R}@${H2} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${H3}@${H2} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${H2}@${H3} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${H3}@${H4} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${H4}@${H3} || exit 1 + +${kadmin} add -p foo --use-defaults pw-expire@${R} || exit 1 +${kadmin} modify --pw-expiration-time=+1day pw-expire@${R} || exit 1 + +${kadmin} add -p foo --use-defaults pw-expired@${R} || exit 1 +${kadmin} modify --pw-expiration-time=2012-06-12 pw-expired@${R} || exit 1 + +${kadmin} add -p foo --use-defaults account-expired@${R} || exit 1 +${kadmin} modify --expiration-time=2012-06-12 account-expired@${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${RH} || exit 1 + +echo "Check parser" +${kadmin} add -p foo --use-defaults -- -p || exit 1 +${kadmin} delete -- -p || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 +${kadmin} check ${R2} || exit 1 +${kadmin} check ${R3} || exit 1 +${kadmin} check ${R4} || exit 1 +${kadmin5} check ${R5} || exit 1 +${kadmin} check ${R6} || exit 1 +${kadmin} check ${R7} || exit 1 +${kadmin} check ${R8} || exit 1 +${kadmin} check ${H1} || exit 1 +${kadmin} check ${H2} || exit 1 +${kadmin} check ${H3} || exit 1 +${kadmin} check ${H4} || exit 1 + +echo "Extracting enctypes" +${ktutil} -k ${keytab} list > tempfile || exit 1 +${EGREP} -v '^FILE:' tempfile | ${EGREP} -v '^Vno' | ${EGREP} -v '^$' | \ + ${EGREP} -v "$server" | # we did cpw for this one + awk '$1 !~ /1/ { exit 1 }' || exit 1 +${EGREP} -v '^FILE:' tempfile | ${EGREP} -v '^Vno' | ${EGREP} -v '^$' | \ + ${EGREP} "$server" | head -1 | + awk '$1 !~ /3/ { exit 1 }' || exit 1 + + +${kadmin} get foo@${R} > tempfile || exit 1 +enctypes=`grep Keytypes: tempfile | sed 's/(pw-salt)//g' | sed 's/,//g' | sed 's/Keytypes://' | sed 's/\[[0-9]*\]//g'` + +enctype_sans_aes=`echo $enctypes | sed 's/aes[^ ]*//g'` +enctype_sans_des3=`echo $enctypes | sed 's/des3-cbc-sha1//g'` + +echo "deleting all but des enctypes on kt-des3 in keytab" +${kadmin} ext -k ${keytab} kt-des3@${R} || exit 1 +for a in ${enctype_sans_des3} ; do + ${ktutil} -k ${keytab} remove -p kt-des3@${R} -e $a +done + +echo "checking globbing keys rules" +${kadmin} get foo/des3-only@${R} > tempfile || exit 1 +enctypes=`grep Keytypes: tempfile | sed 's/(pw-salt)//g' | sed 's/,//g' | sed 's/Keytypes://' | sed 's/\[[0-9]*\]//g' | sed 's/ //g'` +if [ X"$enctypes" != Xdes3-cbc-sha1 ] ; then + echo "des3 only is not only des3: $enctypes" + exit 1 +fi + +${kadmin} get foo/aes-only@${R} > tempfile || exit 1 +enctypes=`grep Keytypes: tempfile | sed 's/(pw-salt)//g' | sed 's/,//g' | sed 's/Keytypes://' | sed 's/\[[0-9]*\]//g' | sed 's/ //g'` +if [ X"$enctypes" != Xaes256-cts-hmac-sha1-96 ] ; then + echo "aes only is not only aes: $enctypes" + exit 1 +fi + + +echo foo > ${objdir}/foopassword +echo notfoo > ${objdir}/notfoopassword + +echo Starting kdc ; > messages.log +env MallocStackLogging=1 MallocStackLoggingNoCompact=1 MallocErrorAbort=1 MallocLogFile=${objdir}/malloc-log \ +${kdc} --detach --testing || + { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +echo Starting kpasswdd; > messages.log +env ${HEIM_MALLOC_DEBUG} ${kpasswdd} --detach || + { echo "kpasswdd failed to start"; exit 1; } +kpasswddpid=`getpid kpasswdd` + + +trap "kill -9 ${kdcpid} ${kpasswddpid}; echo signal killing kdc kpasswdd; exit 1;" EXIT + +ec=0 + +echo "Getting client initial tickets with wrong password"; > messages.log +${kinit} --password-file=${objdir}/notfoopassword \ + foo@${R} 2>kinit-log.tmp && \ + { ec=1 ; eval "${testfailed}"; } +grep 'Password incorrect' kinit-log.tmp > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Doing krbtgt key rollover"; > messages.log +${kadmin} cpw -r --keepold krbtgt/${R}@${R} || exit 1 +echo "Getting tickets"; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Listing tickets"; > messages.log +${klist} > /dev/null || { ec=1 ; eval "${testfailed}"; } +${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client initial tickets (http transport)"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@${RH} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Testing capaths logic" +${kinit} --password-file=${objdir}/foopassword \ + -e ${aesenctype} -e ${aesenctype} \ + foo@$R || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting x-realm tickets with capaths for $R -> $R2" +${kgetcred} foo@${R2} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R3" +${kgetcred} foo@${R3} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R4" +${kgetcred} foo@${R4} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R5" +${kgetcred} foo@${R5} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R6" +${kgetcred} foo@${R6} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R7" +${kgetcred} foo@${R7} || { ec=1 ; eval "${testfailed}"; } +echo "Should not get x-realm tickets with capaths for $R -> $R8" +${kgetcred} foo@${R8} && { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Testing capaths logic (reverse order)" +${kinit} --password-file=${objdir}/foopassword \ + -e ${aesenctype} -e ${aesenctype} \ + foo@$R || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting x-realm tickets with capaths for $R -> $R4" +${kgetcred} foo@${R4} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R3" +${kgetcred} foo@${R3} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R2" +${kgetcred} foo@${R2} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R7" +${kgetcred} foo@${R7} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R6" +${kgetcred} foo@${R6} || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with capaths for $R -> $R5" +${kgetcred} foo@${R5} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Testing hierarchical referral logic" +${kinit} --password-file=${objdir}/foopassword \ + -e ${aesenctype} -e ${aesenctype} \ + foo@${H3} || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting x-realm tickets with hierarchical referrals for $H3 -> $H1" +${kgetcred} --hostbased --canonicalize foo host.${h1} || { ec=1 ; eval "${testfailed}"; } +fgrep "cross-realm ${H3} -> ${H1} via [${H2}, ${R}]" messages.log > /dev/null || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with hierarchical referrals for $H3 -> $R" +${kgetcred} --hostbased --canonicalize foo host.${r} || { ec=1 ; eval "${testfailed}"; } +fgrep "cross-realm ${H3} -> ${R} via [${H2}]" messages.log > /dev/null || { ec=1 ; eval "${testfailed}"; } +echo "Getting x-realm tickets with hierarchical referrals for $H3 -> $H2" +${kgetcred} --hostbased --canonicalize foo host.${h2} || { ec=1 ; eval "${testfailed}"; } +fgrep "cross-realm ${H3} -> ${H2}" messages.log > /dev/null || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Testing multi-hop [capaths] referral logic" +${kinit} --password-file=${objdir}/foopassword \ + -e ${aesenctype} -e ${aesenctype} \ + foo@${H4} || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting x-realm tickets with [capaths] referrals for $H4 -> $H1" +${kgetcred} --hostbased --canonicalize foo/host.${h1}@${H4} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Testing forwardable/renewable flag copying in TGS-REQ" +${kinit} -f --renewable -r 5d --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -f | grep ${server} | grep FRA > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Testing strip of forwardable when the server is disallowed in TGS-REQ" +${kgetcred} sensitive@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -f | grep sensitive | grep FRA > /dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +echo "Specific enctype"; > messages.log +${kinit} --password-file=${objdir}/foopassword \ + -e ${aesenctype} -e ${aesenctype} \ + foo@$R || \ + { ec=1 ; eval "${testfailed}"; } + +for a in $enctypes; do + echo "Getting client initial tickets ($a)"; > messages.log + ${kinit} --enctype=$a --password-file=${objdir}/foopassword foo@$R || { ec=1 ; eval "${testfailed}"; } + echo "Getting tickets"; > messages.log + ${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${test_ap_req} ${server}@${R} ${keytab} ${cache} || { ec=1 ; eval "${testfailed}"; } + ${kdestroy} +done + + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +for a in $enctypes; do + echo "Getting tickets ($a)"; > messages.log + ${kgetcred} -e $a ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } + ${kdestroy} --credential=${server}@${R} +done +${kdestroy} + +echo "Getting client authenticated anonymous initial tickets"; > messages.log +${kinit} -n --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +for a in $enctypes; do + echo "Getting tickets ($a)"; > messages.log + ${kgetcred} -e $a ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } + ${kdestroy} --credential=${server}@${R} +done +${kdestroy} + +echo "Getting client anonymous service tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +for a in $enctypes; do + echo "Getting tickets ($a)"; > messages.log + ${kgetcred} -n -e $a ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } + ${kdestroy} --credential=${server}@${R} +done +${kdestroy} + +echo "Getting client initial tickets for cross realm case"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || { ec=1 ; eval "${testfailed}"; } +for a in $enctypes; do + echo "Getting cross realm tickets ($a)"; > messages.log + ${kgetcred} -e $a ${server2}@${R2} || { ec=1 ; eval "${testfailed}"; } + echo " checking we we got back right ticket" + ${klist} | grep ${server2}@ > /dev/null || { ec=1 ; eval "${testfailed}"; } + echo " checking if ticket is useful" + ${test_ap_req} ${server2}@${R2} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } + ${kdestroy} --credential=${server2}@${R2} +done +${kdestroy} + +echo "Trying x-realm TGT with kvno 0 case"; +${kinit} --password-file=${objdir}/foopassword foo@$R || + { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} || { ec=1 ; eval "${testfailed}"; } +echo "Getting cross realm tickets"; > messages.log +${kgetcred} krbtgt/${R2}@${R} || { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} || { ec=1 ; eval "${testfailed}"; } +echo "Getting service ticket"; > messages.log +${kgetcred} ${server2}@${R2} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying x-realm TGT with kvno 0 case with key rollover"; +${kinit} --password-file=${objdir}/foopassword foo@$R || + { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} || { ec=1 ; eval "${testfailed}"; } +echo "Getting cross realm tickets"; > messages.log +${kgetcred} krbtgt/${R2}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Rolling over cross realm keys"; > messages.log +${kadmin} cpw -r --keepold krbtgt/${R}@${R} || { ec=1 ; eval "${testfailed}"; } +${kadmin} cpw -r --keepold krbtgt/${R2}@${R} || { ec=1 ; eval "${testfailed}"; } +${kadmin} cpw -r --keepold krbtgt/${R}@${R2} || { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} || { ec=1 ; eval "${testfailed}"; } +echo "Getting service ticket"; > messages.log +echo "Start tracing kdc, then hit return" +${kgetcred} ${server2}@${R2} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying x-realm TGT with no kvno case"; +${kinit} --password-file=${objdir}/foopassword foo@$R || + { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} -n || { ec=1 ; eval "${testfailed}"; } +echo "Getting cross realm tickets"; > messages.log +${kgetcred} krbtgt/${R2}@${R} || { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} -n || { ec=1 ; eval "${testfailed}"; } +echo "Getting service ticket"; > messages.log +${kgetcred} ${server2}@${R2} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying x-realm TGT with no kvno case with key rollover"; +${kinit} --password-file=${objdir}/foopassword foo@$R || + { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} -n || { ec=1 ; eval "${testfailed}"; } +echo "Getting cross realm tickets"; > messages.log +${kgetcred} krbtgt/${R2}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Rolling over cross realm keys"; > messages.log +${kadmin} cpw -r --keepold krbtgt/${R}@${R} || { ec=1 ; eval "${testfailed}"; } +${kadmin} cpw -r --keepold krbtgt/${R2}@${R} || { ec=1 ; eval "${testfailed}"; } +${kadmin} cpw -r --keepold krbtgt/${R}@${R2} || { ec=1 ; eval "${testfailed}"; } +${test_set_kvno0} -n || { ec=1 ; eval "${testfailed}"; } +echo "Getting service ticket"; > messages.log +echo "Start tracing kdc, then hit return" +${kgetcred} ${server2}@${R2} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "try all permutations"; > messages.log +for a in $enctypes; do + echo "Getting client initial tickets ($a)"; > messages.log + ${kinit} --enctype=$a --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } + for b in $enctypes; do + echo "Getting tickets ($a -> $b)"; > messages.log + ${kgetcred} -e $b ${server}@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } + ${kdestroy} --credential=${server}@${R} + done + ${kdestroy} +done + +echo "Getting client initial tickets ip based name"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || { ec=1 ; eval "${testfailed}"; } +echo "Getting ip based name tickets"; > messages.log +${kgetcred} ${serverip}@${R} || { ec=1 ; eval "${testfailed}"; } +echo " checking we we got back right ticket" +${klist} | grep ${serverip}@ > /dev/null || { ec=1 ; eval "${testfailed}"; } +echo " checking if ticket is useful" +${test_ap_req} ${serverip}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client initial tickets ip based name (alias)"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || { ec=1 ; eval "${testfailed}"; } +for a in ${serveripname} ${serveripname2} ; do + echo "Getting ip based name tickets (alias) $a"; > messages.log + ${kgetcred} ${a}@${R} || { ec=1 ; eval "${testfailed}"; } + echo " checking we we got back right ticket" + ${klist} | grep ${a}@ > /dev/null || { ec=1 ; eval "${testfailed}"; } + echo " checking if ticket is useful" + ${test_ap_req} --server-any ${a}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +done +${kdestroy} + +echo "Getting server initial tickets"; > messages.log +${kinit} --keytab=${keytab} ${server}@$R || { ec=1 ; eval "${testfailed}"; } +echo "Listing tickets"; > messages.log +${klist} | grep "Principal: ${server}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting key for key that are a subset in keytab compared to kdb" +${kinit} --keytab=${keytab} kt-des3@${R} +${klist} | grep "Principal: kt-des3" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "initial tickets for deleted user test case"; > messages.log +${kinit} --password-file=${objdir}/foopassword remove@$R || \ + { ec=1 ; eval "${testfailed}"; } +${kadmin} delete remove@${R} || { ec=1 ; eval "${testfailed}"; } +echo "try getting ticket with deleted user"; > messages.log +${kgetcred} ${server}@${R} 2> /dev/null && { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "cross realm case (deleted user)"; > messages.log +${kinit} --password-file=${objdir}/foopassword remove2@$R2 || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} krbtgt/${R}@${R2} 2> /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kadmin} delete remove2@${R2} || exit 1 +${kgetcred} ${server}@${R} 2> /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "rename user"; > messages.log +${kadmin} add -p foo --use-defaults rename@${R} || exit 1 +${kinit} --password-file=${objdir}/foopassword rename@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kadmin} rename rename@${R} rename2@${R} || exit 1 +${kinit} --password-file=${objdir}/foopassword rename2@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} +${kadmin} delete rename2@${R} || exit 1 + +echo "rename user to another realm"; > messages.log +${kadmin} add -p foo --use-defaults rename@${R} || exit 1 +${kinit} --password-file=${objdir}/foopassword rename@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kadmin} rename rename@${R} rename@${R2} || exit 1 +${kinit} --password-file=${objdir}/foopassword rename@${R2} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} +${kadmin} delete rename@${R2} || exit 1 + +echo deleting all but aes enctypes on krbtgt +${kadmin} del_enctype krbtgt/${R}@${R} ${enctype_sans_aes} || exit 1 + +echo deleting all but des enctypes on server-des3 +${kadmin} del_enctype ${server}-des3@${R} ${enctype_sans_des3} || exit 1 +${kadmin} ext -k ${keytab} ${server}-des3@${R} || exit 1 + +echo "try all permutations (only aes)"; > messages.log +for a in $enctypes; do + echo "Getting client initial tickets ($a)"; > messages.log + ${kinit} --enctype=$a --password-file=${objdir}/foopassword foo@${R} ||\ + { ec=1 ; eval "${testfailed}"; } + for b in $enctypes; do + echo "Getting tickets ($a -> $b)"; > messages.log + ${kgetcred} -e $b ${server}@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } + + echo "Getting tickets ($a -> $b) (server des3 only)"; > messages.log + ${kgetcred} ${server}-des3@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${test_ap_req} ${server}-des3@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } + + ${kdestroy} --credential=${server}@${R} + ${kdestroy} --credential=${server}-des3@${R} + done + ${kdestroy} +done + +echo deleting all enctypes on krbtgt +${kadmin} del_enctype krbtgt/${R}@${R} aes256-cts-hmac-sha1-96 || \ + { ec=1 ; eval "${testfailed}"; } +echo "try initial ticket w/o and keys on krbtgt" +${kinit} --password-file=${objdir}/foopassword foo@${R} 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } +echo "adding random aes key" +${kadmin} add_enctype -r krbtgt/${R}@${R} aes256-cts-hmac-sha1-96 || \ + { ec=1 ; eval "${testfailed}"; } +echo "try initial ticket with random aes key on krbtgt" +${kinit} --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +rsa=yes +ecdsa=yes +pkinit=no +if ${hxtool} info | grep 'rsa: hx509 null RSA' > /dev/null ; then + rsa=no +fi +if ${hxtool} info | grep 'rand: not available' > /dev/null ; then + rsa=no +fi +if ${kinit} --help 2>&1 | grep "CA certificates" > /dev/null; then + pkinit=yes +fi + +if ${hxtool} info | grep 'ecdsa: hcrypto null' > /dev/null ; then + ecdsa=no +fi + + +# If we support pkinit and have RSA, lets try that +if test "$pkinit" = yes -a "$rsa" = yes ; then + + echo "try anonymous pkinit"; > messages.log + ${kinit} --renewable -n @${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${kinit} --renew || { ec=1 ; eval "${testfailed}"; } + ${kdestroy} + + for type in "" "--pk-use-enckey"; do + echo "Trying pk-init (principal in certificate) $type"; > messages.log + ${kinit} $type -C FILE:${hx509_data}/pkinit.crt,${hx509_data}/pkinit.key bar@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${kdestroy} + + echo "Trying pk-init (principal in pki-mapping) $type"; > messages.log + ${kinit} $type -C FILE:${hx509_data}/pkinit.crt,${hx509_data}/pkinit.key foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${kdestroy} + + echo "Trying pk-init (password protected key) $type"; > messages.log + ${kinit} $type -C FILE:${hx509_data}/pkinit.crt,${hx509_data}/pkinit-pw.key --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kgetcred} ${server}@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kdestroy} + + echo "Trying pk-init (proxy cert) $type"; > messages.log + ${kinit} $type -C FILE:${hx509_data}/pkinit-proxy-chain.crt,${hx509_data}/pkinit-proxy.key foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${kdestroy} + + done + + if test "$ecdsa" = yes > /dev/null ; then + echo "Trying pk-init (ec certificate)" + > messages.log + ${kinit} -C FILE:${hx509_data}/pkinit-ec.crt,${hx509_data}/pkinit-ec.key bar@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${kdestroy} + grep 'PK-INIT using ecdh' messages.log > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } + fi + +else + echo "no pkinit (pkinit: $pkinit, rsa: $rsa)"; > messages.log +fi + +echo "test impersonate using rc4 based tgt"; > messages.log +${kinit} -e arcfour-hmac-md5 --forwardable --password-file=${objdir}/foopassword ${ps} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred_imp} --impersonate=bar@${R} ${ps} || \ + { ec=1 ; eval "${testfailed}"; } +${test_ap_req} ${ps} ${keytab} ${ocache} || \ + { ec=1 ; eval "${testfailed}"; } + +echo "tickets for impersonate test case"; > messages.log +${kinit} --forwardable --password-file=${objdir}/foopassword ${ps} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred_imp} --impersonate=bar@${R} ${ps} || \ + { ec=1 ; eval "${testfailed}"; } +${test_ap_req} ${ps} ${keytab} ${ocache} || \ + { ec=1 ; eval "${testfailed}"; } +echo " negative check" +${kgetcred_imp} --impersonate=bar@${R} foo@${R} 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +echo "test impersonate unknown client"; > messages.log +${kgetcred_imp} --forward --impersonate=unknown@${R} ${ps} && \ + { ec=1 ; eval "${testfailed}"; } + +echo "test impersonate account-expired client"; > messages.log +${kgetcred_imp} --forward --impersonate=account-expired@${R} ${ps} && \ + { ec=1 ; eval "${testfailed}"; } + +echo "test impersonate pw-expired client"; > messages.log +${kgetcred_imp} --forward --impersonate=pw-expired@${R} ${ps} || \ + { ec=1 ; eval "${testfailed}"; } + +echo "test delegate sensitive client"; > messages.log +${kgetcred_imp} --forward --impersonate=sensitive@${R} ${ps} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} \ + --out-cache=${o2cache} \ + --delegation-credential-cache=${ocache} \ + ${server}@${R} && \ + { ec=1 ; eval "${testfailed}"; } + +echo "test constrained delegation"; > messages.log +${kgetcred_imp} --forward --impersonate=bar@${R} ${ps} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} \ + --out-cache=${o2cache} \ + --delegation-credential-cache=${ocache} \ + ${server}@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo " try using the credential" +${test_ap_req} ${server}@${R} ${keytab} ${o2cache} || \ + { ec=1 ; eval "${testfailed}"; } +echo " negative check" +${kgetcred} \ + --out-cache=${o2cache} \ + --delegation-credential-cache=${ocache} \ + bar@${R} 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +echo "test constrained delegation impersonation (non forward)"; > messages.log +rm -f ocache.krb5 +${kimpersonate} -s ${ps} -c bar@${R} -t ${aesenctype} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} --out-cache=${o2cache} --delegation-credential-cache=${ocache} ${server}@${R} > /dev/null 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +echo "test constrained delegation impersonation (missing KRB5SignedPath)"; > messages.log +rm -f ocache.krb5 +${kimpersonate} -s ${ps} -c bar@${R} -t ${aesenctype} -f forwardable || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} --out-cache=${o2cache} --delegation-credential-cache=${ocache} ${server}@${R} > /dev/null 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +${kdestroy} + +echo "check renewing" > messages.log +${kinit} --renewable --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "kinit -R" +${kinit} -R || \ + { ec=1 ; eval "${testfailed}"; } +echo "check renewing MIT interface" > messages.log +${kinit} --renewable --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "test_renew" +env KRB5CCNAME=${cache} ${test_renew} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "checking server aliases"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting tickets"; > messages.log +${kgetcred} ${alias1}@${R} || { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${alias2}@${R} || { ec=1 ; eval "${testfailed}"; } +echo " verify entry in keytab" +${test_ap_req} ${alias1}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +echo " verify entry in keytab with any" +${test_ap_req} --server-any ${alias1}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +echo " verify failure with alias entry" +${test_ap_req} ${alias2}@${R} ${keytab} ${cache} 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } +echo " verify alias entry in keytab with any" +${test_ap_req} --server-any ${alias2}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "testing removal of keytab" +${ktutil} -k ${keytab} destroy || { ec=1 ; eval "${testfailed}"; } +test -f ${keytabfile} && { ec=1 ; eval "${testfailed}"; } + +echo "Checking client pw expire"; > messages.log +${kinit} --password-file=${objdir}/foopassword \ + pw-expire@${R} 2>kinit-log.tmp|| \ + { ec=1 ; eval "${testfailed}"; } +grep 'Your password will expire' kinit-log.tmp > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +echo " kinit passes" +${test_gic} --client=pw-expire@${R} --password=foo > kinit-log.tmp 2>/dev/null +${EGREP} "^e type: 6" kinit-log.tmp > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +echo " test_gic passes" +${kdestroy} + +echo "Checking password expiration" ; > messages.log + +kinitpty=${objdir}/foopassword.rkpty +cat > ${kinitpty} < messages.log +${rkpty} ${kinitpty} ${kinit} pw-expired@${R}|| \ + { ec=1 ; eval "${testfailed}"; } + +${kdestroy} + + +echo "killing kdc (${kdcpid}) kpasswdd (${kpasswddpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 +sh ${leaks_kill} kpasswdd $kpasswddpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-keys.in b/crypto/heimdal/tests/kdc/check-keys.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-keys.in @@ -0,0 +1,104 @@ +#!/bin/sh +# +# Copyright (c) 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="." + +. ${env_setup} + +srcdir="${top_srcdir}/tests/kdc" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE +principal=host/datan.test.h5l.se@${R} + +kadmin="${kadmin} -l -r $R" + +CIN=${srcdir}/krb5.conf.keys.in +COUT=${objdir}/krb5.conf.keys + +sedvars="-e s,[@]srcdir[@],${srcdir},g -e s,[@]objdir[@],${objdir},g" + +KRB5_CONFIG="${COUT}" +export KRB5_CONFIG + +rm -f ${COUT} +rm -f current-db* +rm -f out-* +rm -f mkey.file* +rm -f messages.log + +sed -e 's/@keys@/v5/' \ + ${sedvars} < ${CIN} > ${COUT} + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults ${principal} || exit 1 + +${kadmin} cpw -p foo ${principal} || exit 1 + +sed -e 's/@keys@/v4/' \ + ${sedvars} < ${CIN} > ${COUT} +${kadmin} cpw -p foo ${principal} || exit 1 + +sed -e 's/@keys@/v4 v5/' \ + ${sedvars} < ${CIN} > ${COUT} +${kadmin} cpw -p foo ${principal} || exit 1 + +sed -e 's/@keys@/v5 v4/' \ + ${sedvars} < ${CIN} > ${COUT} +${kadmin} cpw -p foo ${principal} || exit 1 + +sed -e 's/@keys@/des:pw-salt:/' \ + ${sedvars} < ${CIN} > ${COUT} +${kadmin} cpw -p foo ${principal} || exit 1 + +if [ 'X@ENABLE_AFS_STRING_TO_KEY@' = "X1" ]; then + sed -e 's/@keys@/des-cbc-crc:afs3-salt:test.h5l.se/' \ + ${sedvars} < ${CIN} > ${COUT} + ${kadmin} cpw -p foo ${principal} || exit 1 + + sed -e 's/@keys@/des:afs3-salt:test.h5l.se/' \ + ${sedvars} < ${CIN} > ${COUT} + ${kadmin} cpw -p foo ${principal} || exit 1 +fi + +exit 0 diff --git a/crypto/heimdal/tests/kdc/check-kinit.in b/crypto/heimdal/tests/kdc/check-kinit.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-kinit.in @@ -0,0 +1,149 @@ +#!/bin/bash +# +# Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +KRB5_CONFIG="${objdir}/krb5-kinit.conf" +export KRB5_CONFIG +KRB5CCNAME="${objdir}/foocc" +export KRB5CCNAME + +testfailed="echo test failed; exit 1" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +port=@port@ +pwport=@pwport@ + +kinit="${kinit} --password-file=${objdir}/foopassword ${afs_no_afslog} -c ${objdir}/foocc" +klist="${klist} -c ${objdir}/foocc" +kgetcred="${kgetcred} -c ${objdir}/foocc" +kdestroy="${kdestroy} ${afs_no_unlog}" +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + + +cache="FILE:${objdir}/cache.krb5" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" + +> messages.log + +num_concurrent=50 +num_princs=20 +torture_time=200 +cred_life=$((torture_time / 10)) +cred_renew_life=$((torture_time / 2)) +out=${objdir}/out-kinit-torture-kgetcred +kinit_out=${objdir}/out-kinit-torture-kinit + +parent_shell_proc=$$ + +if (($# == 0)); then + + echo "This is a MANUAL test." + + rm -f ${keytabfile} + rm -f current-db* + rm -f out-* + rm -f mkey.file* + + cp "${objdir}/krb5.conf" "${objdir}/krb5-kinit.conf" + + echo "Creating database" + ${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + + echo "Adding foo" + ${kadmin} add -p foo --use-defaults foo@${R} || exit 1 + + echo "Creating torture principals" + for i in $(seq 0 $((num_princs - 1)) ); do + ${kadmin} add -r --use-defaults svc${i}@${R} || exit 1 + done + + echo "Doing database check" + ${kadmin} check ${R} || exit 1 + + echo foo > ${objdir}/foopassword + + echo Starting kdc ; > messages.log + ${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } + kdcpid=`getpid kdc` + + trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + + ec=0 +else + echo "begin torture (output in $out)" + secs=$(date +%s) + cat /dev/null > "$out" + while (($(date +%s) < (secs + torture_time) )); do + echo . + for i in $(seq 0 1000); do + printf '%d\n' $((i % num_princs)) + done | xargs -P $num_concurrent -I '{}' ${kgetcred} "svc{}@${R}" + ${klist} -v || exit 1 + if ! kill -0 $parent_shell_proc; then + printf 'Parent shell script exited; exiting' + exit 1 + grep 'Matching credential .* not found' messages.log > /dev/null && + echo "THAT DID NOT WORK RIGHT" + fi + sleep 5 + done + ${klist} -v + exit 0 +fi + +echo "checking that we have tickets" +${kinit} -l $cred_life -r $cred_renew_life foo@${R} || { ec=1 ; eval "${testfailed}"; } +${klist} -v || { ec=1 ; eval "${testfailed}"; } +echo "torturing" +${kinit} -l $cred_life -r $cred_renew_life foo@${R} "$0" torture-me || { ec=1 ; eval "${testfailed}"; } + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-kpasswdd.in b/crypto/heimdal/tests/kdc/check-kpasswdd.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-kpasswdd.in @@ -0,0 +1,194 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +testfailed="echo test failed; cat messages.log; exit \$ec" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE +R2=TEST2.H5L.SE + +port=@port@ +pwport=@pwport@ + +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" +kpasswdd="${kpasswdd} --addresses=localhost -p $pwport" + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo "Creating database for $R" +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${server}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 + +echo "Creating database for ${R2}" +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R2} || exit 1 + +${kadmin} add -p foo --use-defaults bar@${R2} || exit 1 + +echo "Doing database check for ${R} ${R2}" +${kadmin} check ${R} || exit 1 +${kadmin} check ${R2} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc ; > messages.log +env ${HEIM_MALLOC_DEBUG} ${kdc} --detach --testing || + { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +echo Starting kpasswdd +env ${HEIM_MALLOC_DEBUG} ${kpasswdd} --detach || + { echo "kpasswdd failed to start"; exit 1; } +kpasswddpid=`getpid kpasswdd` + +trap "kill -9 ${kdcpid} ${kpasswddpid}; echo signal killing kdc; exit \$ec;" EXIT + +ec=0 + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting tickets"; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Listing tickets"; > messages.log +${klist} > /dev/null || { ec=1 ; eval "${testfailed}"; } +${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "checking ${R}" + +pw=ak4unandsop39NuJ + +echo "Changing password" +cat > cpw.tmp < ${objdir}/barpassword + + +echo "Getting client initial tickets for ${R}"; > messages.log +${kinit} --password-file=${objdir}/barpassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting tickets"; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Listing tickets"; > messages.log +${klist} > /dev/null || { ec=1 ; eval "${testfailed}"; } +${test_ap_req} ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + +echo "checking ${R2}" + +cat > cpw.tmp < messages.log +${kinit} --password-file=${objdir}/barpassword bar@${R2} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + +echo "killing kdc (${kdcpid} ${kpasswddpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 +sh ${leaks_kill} kpasswdd $kpasswddpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-pkinit.in b/crypto/heimdal/tests/kdc/check-pkinit.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-pkinit.in @@ -0,0 +1,289 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2008 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +testfailed="echo test failed; cat messages.log; exit 1" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" +keyfile="${hx509_data}/key.der" +keyfile2="${hx509_data}/key2.der" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +KRB5_CONFIG="${objdir}/krb5-pkinit.conf" +export KRB5_CONFIG + +rsa=yes +pkinit=no +if ${hxtool} info | grep 'rsa: hx509 null RSA' > /dev/null ; then + rsa=no +fi +if ${hxtool} info | grep 'rand: not available' > /dev/null ; then + rsa=no +fi + +if ${kinit} --help 2>&1 | grep "CA certificates" > /dev/null; then + pkinit=yes +fi + +# If we doesn't support pkinit and have RSA, give up +if test "$pkinit" != yes -o "$rsa" != yes ; then + exit 77 +fi + + +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p bar --use-defaults bar@${R} || exit 1 +${kadmin} add -p baz --use-defaults baz@${R} || exit 1 +${kadmin} modify --alias=baz2@test.h5l.se baz@${R} || exit 1 +${kadmin} modify --pkinit-acl="CN=baz,DC=test,DC=h5l,DC=se" baz@${R} || exit 1 + +${kadmin} add -p kaka --use-defaults ${server}@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo "Setting up certificates" +${hxtool} request-create \ + --subject="CN=kdc,DC=test,DC=h5l,DC=se" \ + --key=FILE:${keyfile2} \ + req-kdc.der || exit 1 +${hxtool} request-create \ + --subject="CN=bar,DC=test,DC=h5l,DC=se" \ + --key=FILE:${keyfile2} \ + req-pkinit.der || exit 1 +${hxtool} request-create \ + --subject="CN=baz,DC=test,DC=h5l,DC=se" \ + --key=FILE:${keyfile2} \ + req-pkinit2.der || exit 1 + +echo "issue self-signed ca cert" +${hxtool} issue-certificate \ + --self-signed \ + --issue-ca \ + --ca-private-key=FILE:${keyfile} \ + --subject="CN=CA,DC=test,DC=h5l,DC=se" \ + --certificate="FILE:ca.crt" || exit 1 + +echo "issue kdc certificate" +${hxtool} issue-certificate \ + --ca-certificate=FILE:$objdir/ca.crt,${keyfile} \ + --type="pkinit-kdc" \ + --pk-init-principal="krbtgt/TEST.H5L.SE@TEST.H5L.SE" \ + --req="PKCS10:req-kdc.der" \ + --certificate="FILE:kdc.crt" || exit 1 + +echo "issue user certificate (pkinit san)" +${hxtool} issue-certificate \ + --ca-certificate=FILE:$objdir/ca.crt,${keyfile} \ + --type="pkinit-client" \ + --pk-init-principal="bar@TEST.H5L.SE" \ + --req="PKCS10:req-pkinit.der" \ + --certificate="FILE:pkinit.crt" || exit 1 + +echo "issue user 2 certificate (no san)" +${hxtool} issue-certificate \ + --ca-certificate=FILE:$objdir/ca.crt,${keyfile} \ + --type="pkinit-client" \ + --req="PKCS10:req-pkinit2.der" \ + --certificate="FILE:pkinit2.crt" || exit 1 + +echo "issue user 3 certificate (ms san)" +${hxtool} issue-certificate \ + --ca-certificate=FILE:$objdir/ca.crt,${keyfile} \ + --type="pkinit-client" \ + --ms-upn="bar@test.h5l.se" \ + --req="PKCS10:req-pkinit2.der" \ + --certificate="FILE:pkinit3.crt" || exit 1 + +echo "issue user 3 certificate (ms san, baz2)" +${hxtool} issue-certificate \ + --ca-certificate=FILE:$objdir/ca.crt,${keyfile} \ + --type="pkinit-client" \ + --ms-upn="baz2@test.h5l.se" \ + --req="PKCS10:req-pkinit2.der" \ + --certificate="FILE:pkinit4.crt" || exit 1 + + +echo foo > ${objdir}/foopassword + +echo Starting kdc ; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; cat ca.crt kdc.crt pkinit.crt ;exit 1;" EXIT + +ec=0 + +echo "Trying pk-init (principal in cert)"; > messages.log +base="${objdir}" +${kinit} -C FILE:${base}/pkinit.crt,${keyfile2} bar@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (principal in pki-mapping file) "; > messages.log +${kinit} -C FILE:${base}/pkinit.crt,${keyfile2} foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (principal subject in DB)"; > messages.log +${kinit} -C FILE:${base}/pkinit2.crt,${keyfile2} baz@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (ms upn)"; > messages.log +${kinit} -C FILE:${base}/pkinit3.crt,${keyfile2} bar@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (ms upn, enterprise)"; > messages.log +${kinit} --canonicalize \ + -C FILE:${base}/pkinit4.crt,${keyfile2} baz2@test.h5l.se@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (ms upn, enterprise, pk-enterprise)"; > messages.log +${kinit} --canonicalize \ + --pk-enterprise \ + -C FILE:${base}/pkinit4.crt,${keyfile2} ${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +KRB5_CONFIG="${objdir}/krb5-pkinit-win.conf" +export KRB5_CONFIG + +echo "Duplicated tests, now in windows 2000 mode" + +echo "Trying pk-init (principal in cert)"; > messages.log +base="${objdir}" +${kinit} -C FILE:${base}/pkinit.crt,${keyfile2} bar@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (principal in pki-mapping file) "; > messages.log +${kinit} -C FILE:${base}/pkinit.crt,${keyfile2} foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (principal subject in DB)"; > messages.log +${kinit} -C FILE:${base}/pkinit2.crt,${keyfile2} baz@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Trying pk-init (ms upn)"; > messages.log +${kinit} -C FILE:${base}/pkinit3.crt,${keyfile2} bar@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + +KRB5_CONFIG="${objdir}/krb5-pkinit.conf" +export KRB5_CONFIG + +echo "Trying PKCS11 support" + +cat > test-rc-file.rc < messages.log + ${kinit} -C PKCS11:${file} foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } + ${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + ${kdestroy} + +fi + + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-referral.in b/crypto/heimdal/tests/kdc/check-referral.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-referral.in @@ -0,0 +1,212 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" + +. ${env_setup} + +testfailed="echo test failed; cat messages.log; exit 1" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE +R2=SUB.TEST.H5L.SE + +service=ldap/host.sub.test.h5l.se:389 + +port=@port@ + +kadmin="${kadmin} -l -r $R" +kdc="${kdc} --addresses=localhost -P $port" + +cache="FILE:${objdir}/cache.krb5" + +kinit="${kinit} -c $cache ${afs_no_afslog}" +klist="${klist} -c $cache" +kgetcred="${kgetcred} -c $cache" +kdestroy="${kdestroy} -c $cache ${afs_no_unlog}" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R2} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} modify --alias=alias1 --alias=alias2 foo@${R} || exit 1 +${kadmin} get foo@${R} | grep alias1@${R} >/dev/null || exit 1 + +${kadmin} add -p foo --use-defaults ${service}@${R2} || exit 1 + +${kadmin} add -p foo --use-defaults bar@${R} || exit 1 +${kadmin} add -p foo --use-defaults 'baz\@realm.foo@'${R} || exit 1 + +${kadmin} add -p cross1 --use-defaults krbtgt/${R2}@${R} || exit 1 +${kadmin} add -p cross2 --use-defaults krbtgt/${R}@${R2} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 +${kadmin} check ${R2} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc ; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + + +echo "Getting client bar"; > messages.log +${kinit} --password-file=${objdir}/foopassword bar@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep "Principal: bar@${R}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client baz"; > messages.log +${kinit} --password-file=${objdir}/foopassword 'baz\@realm.foo@'${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep 'Principal: baz' > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + + +echo "Test AS-REQ" + +echo "Getting client (no canon)"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep "Principal: foo@${R}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client client tickets (default realm, enterprisename)"; > messages.log +${kinit} --canonicalize \ + --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep "Principal: foo@${R}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client alias1 tickets"; > messages.log +${kinit} --canonicalize \ + --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep "Principal: foo@${R}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + +echo "Getting client alias2 tickets"; > messages.log +${kinit} --canonicalize \ + --password-file=${objdir}/foopassword alias2@${R}@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep "Principal: foo@${R}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client alias1 tickets (non canon case)"; > messages.log +${kinit} --password-file=${objdir}/foopassword \ + alias1@${R}@${R} > /dev/null 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting client alias2 tickets (removed)"; > messages.log +${kadmin} modify --alias=alias1 foo@${R} || { ec=1 ; eval "${testfailed}"; } +${kinit} --canonicalize \ + --password-file=${objdir}/foopassword \ + alias2@${R}@${R} > /dev/null 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + +echo "Remove alias" +${kadmin} modify --alias= foo@${R} || { ec=1 ; eval "${testfailed}"; } + +echo "Test server referrals" + +echo "Getting client for ${service}@${R} (tgs kdc referral)" +> messages.log +${kinit} --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} --canonicalize ${service}@${R} || + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep "${service}@${R2}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client for ${service}@${R2} (tgs client side guessing)" +> messages.log +${kinit} --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +${kgetcred} ${service}@${R2} || + { ec=1 ; eval "${testfailed}"; } +echo "checking that we got back right principal" +${klist} | grep "${service}@${R2}" > /dev/null || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + +echo "killing kdc (${kdcpid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-tester.in b/crypto/heimdal/tests/kdc/check-tester.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-tester.in @@ -0,0 +1,118 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +top_builddir="@top_builddir@" +env_setup="@env_setup@" +objdir="@objdir@" +srcdir="@srcdir@" + +. ${env_setup} + +KRB5_CONFIG="${1-${objdir}/krb5.conf}" +export KRB5_CONFIG + +testfailed="echo test failed; cat messages.log; exit 1" + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" +keyfile="${hx509_data}/key.der" +keyfile2="${hx509_data}/key2.der" + +kadmin="${kadmin} -l -r $R" + +server=host/datan.test.h5l.se + +rsa=yes +pkinit=no +if ${hxtool} info | grep 'rsa: hx509 null RSA' > /dev/null ; then + rsa=no +fi +if ${hxtool} info | grep 'rand: not available' > /dev/null ; then + rsa=no +fi + +if ${kinit} --help 2>&1 | grep "CA certificates" > /dev/null; then + pkinit=yes +fi + +# If we doesn't support pkinit and have RSA, give up +if test "$rsa" != yes ; then + pkinit=no +fi + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults ${server}@${R} || exit 1 +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} ext -k ${keytab} foo@${R} || exit 1 +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 + +echo "password" +${kdc_tester} ${srcdir}/kdc-tester1.json > out-log 2>&1 || exit 1 +sed 's/^/ /' out-log + +echo "keytab" +${kdc_tester} ${srcdir}/kdc-tester2.json > out-log 2>&1 || exit 1 +sed 's/^/ /' out-log + +echo "FAST + keytab" +${kdc_tester} ${srcdir}/kdc-tester3.json > out-log 2>&1 || exit 1 +sed 's/^/ /' out-log + + +if test "$pkinit" = yes ; then + + echo "pkinit" + ${kdc_tester} ${objdir}/kdc-tester4.json > out-log 2>&1 || exit 1 + sed 's/^/ /' out-log + +fi + +exit $ec diff --git a/crypto/heimdal/tests/kdc/check-uu.in b/crypto/heimdal/tests/kdc/check-uu.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/check-uu.in @@ -0,0 +1,131 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +env_setup="@env_setup@" +objdir="@objdir@" +srcdir="@srcdir@" + +testfailed="echo test failed; cat messages.log; exit 1" + +. ${env_setup} + +# If there is no useful db support compiled in, disable test +${have_db} || exit 77 + +R=TEST.H5L.SE + +uuspid= + +port=@port@ + +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port" + +cache1="FILE:${objdir}/cache1.krb5" +cache2="FILE:${objdir}/cache2.krb5" + +kinit1="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache1 ${afs_no_afslog}" +kinit2="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache2 ${afs_no_afslog}" +kdestroy1="${TESTS_ENVIRONMENT} ../../kuser/kdestroy -c $cache1 ${afs_no_unlog}" +kdestroy2="${TESTS_ENVIRONMENT} ../../kuser/kdestroy -c $cache2 ${afs_no_unlog}" +uu_server="${TESTS_ENVIRONMENT} ../../appl/test/uu_server" +uu_client="${TESTS_ENVIRONMENT} ../../appl/test/uu_client" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults user1@${R} || exit 1 +${kadmin} add -p foo --use-defaults user2@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc ; > messages.log +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill -9 ${kdcpid} ${uuspid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + +echo "Getting client initial tickets user1"; > messages.log +${kinit1} --password-file=${objdir}/foopassword user1@$R || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting client initial tickets user2"; > messages.log +${kinit2} --password-file=${objdir}/foopassword user2@$R || \ + { ec=1 ; eval "${testfailed}"; } + + +echo "starting uu server (using user1)" +KRB5CCNAME=$cache1 ${uu_server} > uuserver.log & +uuspid=$! +sleep 5 + +echo "trying to contact server with client (using user2)" +KRB5CCNAME=$cache2 ${uu_client} localhost > messages.log 2>&1 || \ + { ec=1; eval "${testfailed}"; } + +sleep 5 + +echo "checking if server got the right message" +cmp uuserver.log ${srcdir}/uuserver.txt || \ + { ec=1; eval "${testfailed}"; } + +uuspid="" + +${kdestroy1} +${kdestroy2} + +echo "killing kdc uu_server (${kdcpid} ${uuspid})" +sh ${leaks_kill} kdc $kdcpid || exit 1 + + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/kdc/donotexists.txt b/crypto/heimdal/tests/kdc/donotexists.txt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/donotexists.txt @@ -0,0 +1 @@ +kadmin: get doesnotexists@TEST.H5L.SE: Principal does not exist diff --git a/crypto/heimdal/tests/kdc/hdb-mitdb b/crypto/heimdal/tests/kdc/hdb-mitdb new file mode 100644 index 0000000000000000000000000000000000000000..00fefb9d427c5293c258376ac6b90e7c46522118 GIT binary patch literal 16384 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 literal 0 Hc$@rI`>2BVGMu0z4wHPDdW5VT%-v- literal 0 Hc$@/dev/null +do + set -- "$@" "." + if [ $# -gt 4 ] + then + kill kill -9 $pid 2> /dev/null + break + fi + sleep 1 +done + +set -- . +while kill -0 $pid 2>/dev/null +do + set -- "$@" "." + if [ $# -gt 4 ]; then exit 1; fi + sleep 1 +done + +exit 0 diff --git a/crypto/heimdal/tests/kdc/ntlm-user-file.txt b/crypto/heimdal/tests/kdc/ntlm-user-file.txt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/ntlm-user-file.txt @@ -0,0 +1 @@ +TEST:foo:digestpassword diff --git a/crypto/heimdal/tests/kdc/pki-mapping b/crypto/heimdal/tests/kdc/pki-mapping new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/pki-mapping @@ -0,0 +1,2 @@ +foo@TEST.H5L.SE:CN=pkinit,C=SE +foo@TEST.H5L.SE:CN=bar,DC=test,DC=h5l,DC=se diff --git a/crypto/heimdal/tests/kdc/uuserver.txt b/crypto/heimdal/tests/kdc/uuserver.txt new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/uuserver.txt @@ -0,0 +1,4 @@ +User is `user2@TEST.H5L.SE' +Server is `user1@TEST.H5L.SE' +safe packet: hej +priv packet: hemligt diff --git a/crypto/heimdal/tests/kdc/wait-kdc.sh b/crypto/heimdal/tests/kdc/wait-kdc.sh new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/kdc/wait-kdc.sh @@ -0,0 +1,65 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. + +name=${1:-KDC} +log=${2:-messages.log} +waitfor="${3:-${name} started}" + +t=0 +waitsec=65 + +echo "Waiting for ${name} to start, looking logfile ${log}" + +while true ; do + if grep "${waitfor}" ${log} > /dev/null; then + break + fi + if grep "No sockets" ${log} ; then + echo "The ${name} failed to bind to any sockets, another ${name} running ?" + exit 1 + fi + if grep "bind" ${log} | grep "Operation not permitted" ; then + echo "The ${name} failed to bind to any sockets, another ${name} running ?" + exit 1 + fi + if [ "$t" -gt $waitsec ]; then + echo "Waited for $waitsec for the ${name} to start, and it didnt happen" + exit 2 + fi + + t=`expr ${t} + 2` + sleep 2 + echo "Have waited $t seconds" +done + +exit 0 \ No newline at end of file diff --git a/crypto/heimdal/tests/ldap/Makefile.am b/crypto/heimdal/tests/ldap/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/Makefile.am @@ -0,0 +1,55 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +noinst_DATA = krb5.conf + +check_SCRIPTS = $(TESTS) slapd-init + +TESTS = check-ldap + +port = 49188 + +do_subst = sed \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/ldap,g' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +check-ldap: check-ldap.in Makefile + $(do_subst) < $(srcdir)/check-ldap.in > check-ldap.tmp + chmod +x check-ldap.tmp + mv check-ldap.tmp check-ldap + +slapd-init: slapd-init.in Makefile + $(do_subst) < $(srcdir)/slapd-init.in > slapd-init.tmp + chmod +x slapd-init.tmp + mv slapd-init.tmp slapd-init + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +CLEANFILES= \ + $(TESTS) \ + check-ldap.tmp \ + slapd-init.tmp \ + current-db* \ + krb5.conf krb5.conf.tmp \ + modules.conf \ + cache.krb5 \ + slapd-init \ + foopassword \ + messages.log \ + slapd.pid + +EXTRA_DIST = \ + NTMakefile \ + samba.schema \ + slapd.conf \ + slapd-stop \ + check-ldap.in \ + init.ldif \ + krb5.conf.in \ + slapd-init.in diff --git a/crypto/heimdal/tests/ldap/Makefile.in b/crypto/heimdal/tests/ldap/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/Makefile.in @@ -0,0 +1,1274 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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/ldap +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +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 +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +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__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_DATA = krb5.conf +check_SCRIPTS = $(TESTS) slapd-init +TESTS = check-ldap +port = 49188 +do_subst = sed \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/ldap,g' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +CLEANFILES = \ + $(TESTS) \ + check-ldap.tmp \ + slapd-init.tmp \ + current-db* \ + krb5.conf krb5.conf.tmp \ + modules.conf \ + cache.krb5 \ + slapd-init \ + foopassword \ + messages.log \ + slapd.pid + +EXTRA_DIST = \ + NTMakefile \ + samba.schema \ + slapd.conf \ + slapd-stop \ + check-ldap.in \ + init.ldif \ + krb5.conf.in \ + slapd-init.in + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .log .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/ldap/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/ldap/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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 +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: $(check_SCRIPTS) + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_SCRIPTS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-ldap.log: check-ldap + @p='check-ldap'; \ + b='check-ldap'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(DATA) all-local +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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: 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 -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: all all-am all-local check check-TESTS check-am check-local \ + clean clean-generic clean-libtool cscopelist-am ctags-am \ + dist-hook distclean distclean-generic distclean-libtool \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-data-hook \ + 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-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am recheck tags-am \ + uninstall uninstall-am uninstall-hook + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +check-ldap: check-ldap.in Makefile + $(do_subst) < $(srcdir)/check-ldap.in > check-ldap.tmp + chmod +x check-ldap.tmp + mv check-ldap.tmp check-ldap + +slapd-init: slapd-init.in Makefile + $(do_subst) < $(srcdir)/slapd-init.in > slapd-init.tmp + chmod +x slapd-init.tmp + mv slapd-init.tmp slapd-init + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +# 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: diff --git a/crypto/heimdal/tests/ldap/NTMakefile b/crypto/heimdal/tests/ldap/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests\ldap + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/ldap/check-ldap.in b/crypto/heimdal/tests/ldap/check-ldap.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/check-ldap.in @@ -0,0 +1,151 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2016 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +env_setup="@env_setup@" +srcdir="@srcdir@" +objdir="@objdir@" + +. ${env_setup} + +EGREP="@EGREP@" + +R=TEST.H5L.SE + +port=@port@ + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" + +kinit="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache ${afs_no_afslog}" +kgetcred="${TESTS_ENVIRONMENT} ../../kuser/kgetcred -c $cache" +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r $R" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port" + +testfailed="echo test failed; exit 1" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +# If there is no ldap support compiled in, disable test +if ${kdc} --builtin-hdb | grep ldap > /dev/null ; then + : +else + echo "no ldap support" + exit 77 +fi + +#search for all ldap tools + +PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/libexec:/usr/lib/openldap:$PATH +export PATH + +oldifs=$IFS +IFS=: +set -- $PATH +IFS=$oldifs +for j in slapd slapadd; do + for i in $*; do + test -n "$i" || i="." + if test -x $i/$j; then + continue 2 + fi + done + echo "$j missing, not running test" + exit 77 +done + +sh ${objdir}/slapd-init || exit 1 + +trap "sh ${srcdir}/slapd-stop ; exit 1;" EXIT + +rm -f current-db* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p foo --use-defaults bar@${R} || exit 1 +${kadmin} add -p kaka --use-defaults ${server}@${R} || exit 1 + +${kadmin} cpw --random-password bar@${R} > /dev/null || exit 1 +${kadmin} cpw --random-password bar@${R} > /dev/null || exit 1 +${kadmin} cpw --random-password bar@${R} > /dev/null || exit 1 + +${kadmin} cpw --random-password suser@${R} > /dev/null|| exit 1 +${kadmin} cpw --password=foo suser@${R} || exit 1 + +${kadmin} list '*' > /dev/null || exit 1 + +echo foo > ${objdir}/foopassword + +echo Starting kdc +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill ${kdcpid}; echo signal killing kdc; sh ${srcdir}/slapd-stop ; exit 1;" EXIT + +ec=0 + +echo "Getting client initial tickets"; +${kinit} --password-file=${objdir}/foopassword foo@$R || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting ${server} ticket" +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } + + +echo "Getting *@$R inital ticket (fail)"; +${kinit} --password-file=${objdir}/foopassword '*'@$R 2>/dev/null && \ + { ec=1 ; eval "${testfailed}"; } + + +echo "killing kdc (${kdcpid})" +kill $kdcpid || exit 1 + +trap "" EXIT + +# kill of old slapd +sh ${srcdir}/slapd-stop + +rm -rf db schema + +exit $ec diff --git a/crypto/heimdal/tests/ldap/init.ldif b/crypto/heimdal/tests/ldap/init.ldif new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/init.ldif @@ -0,0 +1,44 @@ +dn: o=TEST,dc=H5L,dc=SE +objectclass: organization +o: Test + +dn: ou=kerberosPrincipals,o=TEST,dc=H5L,dc=SE +objectclass: organizationalUnit +ou: kerberosPrincipals + +dn: uid=suser,ou=kerberosPrincipals,o=TEST,dc=H5L,dc=SE +cn: root +sn: root +objectClass: inetOrgPerson +objectClass: posixAccount +objectClass: organizationalPerson +objectClass: person +objectClass: top +gidNumber: 0 +uid: suser +uidNumber: 0 +homeDirectory: /root +loginShell: /bin/bash +gecos: Netbios root user +structuralObjectClass: inetOrgPerson +creatorsName: cn=root,dc=test,dc=h5l,dc=se +userPassword: password +objectClass: krb5KDCEntry +krb5KeyVersionNumber: 2 +krb5PrincipalName: suser@TEST.H5L.SE +objectClass: sambaSamAccount +sambaHomePath: \\admin1\suser +sambaPwdCanChange: 1159699688 +sambaPwdLastSet: 1159699688 +sambaPrimaryGroupSID: S-1-5-21-3017333096-1338036268-1966094567-512 +sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000 + 00000000 +sambaLMPassword: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +sambaNTPassword: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +sambaLogonTime: 0 +sambaLogoffTime: 2147483647 +sambaKickoffTime: 2147483647 +sambaPwdMustChange: 2147483647 +sambaHomeDrive: H: +sambaAcctFlags: [U ] +sambaSID: S-1-5-21-3017333096-1338036268-1966094567-1000 diff --git a/crypto/heimdal/tests/ldap/krb5.conf.in b/crypto/heimdal/tests/ldap/krb5.conf.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/krb5.conf.in @@ -0,0 +1,26 @@ +# $Id$ + +[libdefaults] + default_realm = TEST.H5L.SE + no-addresses = TRUE + plugin_dir = @objdir@/../../lib/hdb @objdir@/../../lib/hdb/.libs + +[realms] + TEST.H5L.SE = { + kdc = localhost:@port@ + } + +[kdc] + database = { + dbname = ldapi://.%2Fldap-socket:OU=KerberosPrincipals,o=test,DC=h5l,DC=se + realm = TEST.H5L.SE + mkey_file = @objdir@/mkey.file + log_file = @objdir@/log.current-db.log + } + +[hdb] + db-dir = @objdir@ + +[logging] + kdc = 0-/FILE:@objdir@/messages.log + default = 0-/FILE:@objdir@/messages.log diff --git a/crypto/heimdal/tests/ldap/samba.schema b/crypto/heimdal/tests/ldap/samba.schema new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/samba.schema @@ -0,0 +1,554 @@ +## +## schema file for OpenLDAP 2.x +## Schema for storing Samba user accounts and group maps in LDAP +## OIDs are owned by the Samba Team +## +## Prerequisite schemas - uid (cosine.schema) +## - displayName (inetorgperson.schema) +## - gidNumber (nis.schema) +## +## 1.3.6.1.4.1.7165.2.1.x - attributetypes +## 1.3.6.1.4.1.7165.2.2.x - objectclasses +## +## Printer support +## 1.3.6.1.4.1.7165.2.3.1.x - attributetypes +## 1.3.6.1.4.1.7165.2.3.2.x - objectclasses +## +## Samba4 +## 1.3.6.1.4.1.7165.4.1.x - attributetypes +## 1.3.6.1.4.1.7165.4.2.x - objectclasses +## 1.3.6.1.4.1.7165.4.3.x - LDB/LDAP Controls +## 1.3.6.1.4.1.7165.4.4.x - LDB/LDAP Extended Operations +## 1.3.6.1.4.1.7165.4.255.x - mapped OIDs due to conflicts between AD and standards-track +## +## ----- READ THIS WHEN ADDING A NEW ATTRIBUTE OR OBJECT CLASS ------ +## +## Run the 'get_next_oid' bash script in this directory to find the +## next available OID for attribute type and object classes. +## +## $ ./get_next_oid +## attributetype ( 1.3.6.1.4.1.7165.2.1.XX NAME .... +## objectclass ( 1.3.6.1.4.1.7165.2.2.XX NAME .... +## +## Also ensure that new entries adhere to the declaration style +## used throughout this file +## +## ( 1.3.6.1.4.1.7165.2.XX.XX NAME .... +## ^ ^ ^ +## +## The spaces are required for the get_next_oid script (and for +## readability). +## +## ------------------------------------------------------------------ + +# objectIdentifier SambaRoot 1.3.6.1.4.1.7165 +# objectIdentifier Samba3 SambaRoot:2 +# objectIdentifier Samba3Attrib Samba3:1 +# objectIdentifier Samba3ObjectClass Samba3:2 +# objectIdentifier Samba4 SambaRoot:4 + +######################################################################## +## HISTORICAL ## +######################################################################## + +## +## Password hashes +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.1 NAME 'lmPassword' +# DESC 'LanManager Passwd' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.2 NAME 'ntPassword' +# DESC 'NT Passwd' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +## +## Account flags in string format ([UWDX ]) +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.4 NAME 'acctFlags' +# DESC 'Account Flags' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{16} SINGLE-VALUE ) + +## +## Password timestamps & policies +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.3 NAME 'pwdLastSet' +# DESC 'NT pwdLastSet' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.5 NAME 'logonTime' +# DESC 'NT logonTime' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.6 NAME 'logoffTime' +# DESC 'NT logoffTime' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.7 NAME 'kickoffTime' +# DESC 'NT kickoffTime' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.8 NAME 'pwdCanChange' +# DESC 'NT pwdCanChange' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.9 NAME 'pwdMustChange' +# DESC 'NT pwdMustChange' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +## +## string settings +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.10 NAME 'homeDrive' +# DESC 'NT homeDrive' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{4} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.11 NAME 'scriptPath' +# DESC 'NT scriptPath' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.12 NAME 'profilePath' +# DESC 'NT profilePath' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.13 NAME 'userWorkstations' +# DESC 'userWorkstations' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{255} SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.17 NAME 'smbHome' +# DESC 'smbHome' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.18 NAME 'domain' +# DESC 'Windows NT domain to which the user belongs' +# EQUALITY caseIgnoreIA5Match +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{128} ) + +## +## user and group RID +## +#attributetype ( 1.3.6.1.4.1.7165.2.1.14 NAME 'rid' +# DESC 'NT rid' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +#attributetype ( 1.3.6.1.4.1.7165.2.1.15 NAME 'primaryGroupID' +# DESC 'NT Group RID' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +## +## The smbPasswordEntry objectclass has been depreciated in favor of the +## sambaAccount objectclass +## +#objectclass ( 1.3.6.1.4.1.7165.2.2.1 NAME 'smbPasswordEntry' SUP top AUXILIARY +# DESC 'Samba smbpasswd entry' +# MUST ( uid $ uidNumber ) +# MAY ( lmPassword $ ntPassword $ pwdLastSet $ acctFlags )) + +#objectclass ( 1.3.6.1.4.1.7165.2.2.2 NAME 'sambaAccount' SUP top STRUCTURAL +# DESC 'Samba Account' +# MUST ( uid $ rid ) +# MAY ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $ +# logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $ +# displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $ +# description $ userWorkstations $ primaryGroupID $ domain )) + +#objectclass ( 1.3.6.1.4.1.7165.2.2.3 NAME 'sambaAccount' SUP top AUXILIARY +# DESC 'Samba Auxiliary Account' +# MUST ( uid $ rid ) +# MAY ( cn $ lmPassword $ ntPassword $ pwdLastSet $ logonTime $ +# logoffTime $ kickoffTime $ pwdCanChange $ pwdMustChange $ acctFlags $ +# displayName $ smbHome $ homeDrive $ scriptPath $ profilePath $ +# description $ userWorkstations $ primaryGroupID $ domain )) + +######################################################################## +## END OF HISTORICAL ## +######################################################################## + +####################################################################### +## Attributes used by Samba 3.0 schema ## +####################################################################### + +## +## Password hashes +## +attributetype ( 1.3.6.1.4.1.7165.2.1.24 NAME 'sambaLMPassword' + DESC 'LanManager Password' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.25 NAME 'sambaNTPassword' + DESC 'MD4 hash of the unicode password' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE ) + +## +## Account flags in string format ([UWDX ]) +## +attributetype ( 1.3.6.1.4.1.7165.2.1.26 NAME 'sambaAcctFlags' + DESC 'Account Flags' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{16} SINGLE-VALUE ) + +## +## Password timestamps & policies +## +attributetype ( 1.3.6.1.4.1.7165.2.1.27 NAME 'sambaPwdLastSet' + DESC 'Timestamp of the last password update' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.28 NAME 'sambaPwdCanChange' + DESC 'Timestamp of when the user is allowed to update the password' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.29 NAME 'sambaPwdMustChange' + DESC 'Timestamp of when the password will expire' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.30 NAME 'sambaLogonTime' + DESC 'Timestamp of last logon' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.31 NAME 'sambaLogoffTime' + DESC 'Timestamp of last logoff' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.32 NAME 'sambaKickoffTime' + DESC 'Timestamp of when the user will be logged off automatically' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.48 NAME 'sambaBadPasswordCount' + DESC 'Bad password attempt count' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.49 NAME 'sambaBadPasswordTime' + DESC 'Time of the last bad password attempt' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.55 NAME 'sambaLogonHours' + DESC 'Logon Hours' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{42} SINGLE-VALUE ) + +## +## string settings +## +attributetype ( 1.3.6.1.4.1.7165.2.1.33 NAME 'sambaHomeDrive' + DESC 'Driver letter of home directory mapping' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{4} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.34 NAME 'sambaLogonScript' + DESC 'Logon script path' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.35 NAME 'sambaProfilePath' + DESC 'Roaming profile path' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.36 NAME 'sambaUserWorkstations' + DESC 'List of user workstations the user is allowed to logon to' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{255} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.37 NAME 'sambaHomePath' + DESC 'Home directory UNC path' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.38 NAME 'sambaDomainName' + DESC 'Windows NT domain to which the user belongs' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{128} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.47 NAME 'sambaMungedDial' + DESC 'Base64 encoded user parameter string' + EQUALITY caseExactMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{1050} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.54 NAME 'sambaPasswordHistory' + DESC 'Concatenated MD5 hashes of the salted NT passwords used on this account' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} ) + +## +## SID, of any type +## + +attributetype ( 1.3.6.1.4.1.7165.2.1.20 NAME 'sambaSID' + DESC 'Security ID' + EQUALITY caseIgnoreIA5Match + SUBSTR caseExactIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} SINGLE-VALUE ) + +## +## Primary group SID, compatible with ntSid +## + +attributetype ( 1.3.6.1.4.1.7165.2.1.23 NAME 'sambaPrimaryGroupSID' + DESC 'Primary Group Security ID' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.51 NAME 'sambaSIDList' + DESC 'Security ID List' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} ) + +## +## group mapping attributes +## +attributetype ( 1.3.6.1.4.1.7165.2.1.19 NAME 'sambaGroupType' + DESC 'NT Group Type' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +## +## Store info on the domain +## + +attributetype ( 1.3.6.1.4.1.7165.2.1.21 NAME 'sambaNextUserRid' + DESC 'Next NT rid to give our for users' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.22 NAME 'sambaNextGroupRid' + DESC 'Next NT rid to give out for groups' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.39 NAME 'sambaNextRid' + DESC 'Next NT rid to give out for anything' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.40 NAME 'sambaAlgorithmicRidBase' + DESC 'Base at which the samba RID generation algorithm should operate' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.41 NAME 'sambaShareName' + DESC 'Share Name' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.42 NAME 'sambaOptionName' + DESC 'Option Name' + EQUALITY caseIgnoreMatch + SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{256} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.43 NAME 'sambaBoolOption' + DESC 'A boolean option' + EQUALITY booleanMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.44 NAME 'sambaIntegerOption' + DESC 'An integer option' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.45 NAME 'sambaStringOption' + DESC 'A string option' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.46 NAME 'sambaStringListOption' + DESC 'A string list option' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) + + +##attributetype ( 1.3.6.1.4.1.7165.2.1.50 NAME 'sambaPrivName' +## SUP name ) + +##attributetype ( 1.3.6.1.4.1.7165.2.1.52 NAME 'sambaPrivilegeList' +## DESC 'Privileges List' +## EQUALITY caseIgnoreIA5Match +## SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{64} ) + +attributetype ( 1.3.6.1.4.1.7165.2.1.53 NAME 'sambaTrustFlags' + DESC 'Trust Password Flags' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +# "min password length" +attributetype ( 1.3.6.1.4.1.7165.2.1.58 NAME 'sambaMinPwdLength' + DESC 'Minimal password length (default: 5)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "password history" +attributetype ( 1.3.6.1.4.1.7165.2.1.59 NAME 'sambaPwdHistoryLength' + DESC 'Length of Password History Entries (default: 0 => off)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "user must logon to change password" +attributetype ( 1.3.6.1.4.1.7165.2.1.60 NAME 'sambaLogonToChgPwd' + DESC 'Force Users to logon for password change (default: 0 => off, 2 => on)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "maximum password age" +attributetype ( 1.3.6.1.4.1.7165.2.1.61 NAME 'sambaMaxPwdAge' + DESC 'Maximum password age, in seconds (default: -1 => never expire passwords)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "minimum password age" +attributetype ( 1.3.6.1.4.1.7165.2.1.62 NAME 'sambaMinPwdAge' + DESC 'Minimum password age, in seconds (default: 0 => allow immediate password change)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "lockout duration" +attributetype ( 1.3.6.1.4.1.7165.2.1.63 NAME 'sambaLockoutDuration' + DESC 'Lockout duration in minutes (default: 30, -1 => forever)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "reset count minutes" +attributetype ( 1.3.6.1.4.1.7165.2.1.64 NAME 'sambaLockoutObservationWindow' + DESC 'Reset time after lockout in minutes (default: 30)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "bad lockout attempt" +attributetype ( 1.3.6.1.4.1.7165.2.1.65 NAME 'sambaLockoutThreshold' + DESC 'Lockout users after bad logon attempts (default: 0 => off)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "disconnect time" +attributetype ( 1.3.6.1.4.1.7165.2.1.66 NAME 'sambaForceLogoff' + DESC 'Disconnect Users outside logon hours (default: -1 => off, 0 => on)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# "refuse machine password change" +attributetype ( 1.3.6.1.4.1.7165.2.1.67 NAME 'sambaRefuseMachinePwdChange' + DESC 'Allow Machine Password changes (default: 0 => off)' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + + + + +####################################################################### +## objectClasses used by Samba 3.0 schema ## +####################################################################### + +## The X.500 data model (and therefore LDAPv3) says that each entry can +## only have one structural objectclass. OpenLDAP 2.0 does not enforce +## this currently but will in v2.1 + +## +## added new objectclass (and OID) for 3.0 to help us deal with backwards +## compatibility with 2.2 installations (e.g. ldapsam_compat) --jerry +## +objectclass ( 1.3.6.1.4.1.7165.2.2.6 NAME 'sambaSamAccount' SUP top AUXILIARY + DESC 'Samba 3.0 Auxilary SAM Account' + MUST ( uid $ sambaSID ) + MAY ( cn $ sambaLMPassword $ sambaNTPassword $ sambaPwdLastSet $ + sambaLogonTime $ sambaLogoffTime $ sambaKickoffTime $ + sambaPwdCanChange $ sambaPwdMustChange $ sambaAcctFlags $ + displayName $ sambaHomePath $ sambaHomeDrive $ sambaLogonScript $ + sambaProfilePath $ description $ sambaUserWorkstations $ + sambaPrimaryGroupSID $ sambaDomainName $ sambaMungedDial $ + sambaBadPasswordCount $ sambaBadPasswordTime $ + sambaPasswordHistory $ sambaLogonHours)) + +## +## Group mapping info +## +objectclass ( 1.3.6.1.4.1.7165.2.2.4 NAME 'sambaGroupMapping' SUP top AUXILIARY + DESC 'Samba Group Mapping' + MUST ( gidNumber $ sambaSID $ sambaGroupType ) + MAY ( displayName $ description $ sambaSIDList )) + +## +## Trust password for trust relationships (any kind) +## +objectclass ( 1.3.6.1.4.1.7165.2.2.14 NAME 'sambaTrustPassword' SUP top STRUCTURAL + DESC 'Samba Trust Password' + MUST ( sambaDomainName $ sambaNTPassword $ sambaTrustFlags ) + MAY ( sambaSID $ sambaPwdLastSet )) + +## +## Whole-of-domain info +## +objectclass ( 1.3.6.1.4.1.7165.2.2.5 NAME 'sambaDomain' SUP top STRUCTURAL + DESC 'Samba Domain Information' + MUST ( sambaDomainName $ + sambaSID ) + MAY ( sambaNextRid $ sambaNextGroupRid $ sambaNextUserRid $ + sambaAlgorithmicRidBase $ + sambaMinPwdLength $ sambaPwdHistoryLength $ sambaLogonToChgPwd $ + sambaMaxPwdAge $ sambaMinPwdAge $ + sambaLockoutDuration $ sambaLockoutObservationWindow $ sambaLockoutThreshold $ + sambaForceLogoff $ sambaRefuseMachinePwdChange )) + +## +## used for idmap_ldap module +## +objectclass ( 1.3.6.1.4.1.7165.2.2.7 NAME 'sambaUnixIdPool' SUP top AUXILIARY + DESC 'Pool for allocating UNIX uids/gids' + MUST ( uidNumber $ gidNumber ) ) + + +objectclass ( 1.3.6.1.4.1.7165.2.2.8 NAME 'sambaIdmapEntry' SUP top AUXILIARY + DESC 'Mapping from a SID to an ID' + MUST ( sambaSID ) + MAY ( uidNumber $ gidNumber ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.9 NAME 'sambaSidEntry' SUP top STRUCTURAL + DESC 'Structural Class for a SID' + MUST ( sambaSID ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.10 NAME 'sambaConfig' SUP top AUXILIARY + DESC 'Samba Configuration Section' + MAY ( description ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.11 NAME 'sambaShare' SUP top STRUCTURAL + DESC 'Samba Share Section' + MUST ( sambaShareName ) + MAY ( description ) ) + +objectclass ( 1.3.6.1.4.1.7165.2.2.12 NAME 'sambaConfigOption' SUP top STRUCTURAL + DESC 'Samba Configuration Option' + MUST ( sambaOptionName ) + MAY ( sambaBoolOption $ sambaIntegerOption $ sambaStringOption $ + sambaStringListoption $ description ) ) + + +## retired during privilege rewrite +##objectclass ( 1.3.6.1.4.1.7165.2.2.13 NAME 'sambaPrivilege' SUP top AUXILIARY +## DESC 'Samba Privilege' +## MUST ( sambaSID ) +## MAY ( sambaPrivilegeList ) ) diff --git a/crypto/heimdal/tests/ldap/slapd-init.in b/crypto/heimdal/tests/ldap/slapd-init.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/slapd-init.in @@ -0,0 +1,48 @@ +#!/bin/sh +# $Id$ + +srcdir=@srcdir@ + +rm -rf db schema +mkdir db + +# kill of old slapd if running +sh "${srcdir}/slapd-stop" > /dev/null + +SCHEMA_NEEDED="hdb core nis cosine inetorgperson openldap samba" + +SCHEMA_PATHS="${srcdir}/../../lib/hdb ${srcdir} /etc/ldap/schema /etc/openldap/schema /private/etc/openldap/schema /usr/share/openldap/schema" + +test -d schema || mkdir schema + +# setup needed schema files +for f in $SCHEMA_NEEDED; do + if [ ! -r schema/$f.schema ]; then + for d in $SCHEMA_PATHS ; do + if [ -r $d/$f.schema ] ; then + cp $d/$f.schema schema/$f.schema + continue 2 + fi + done + echo "SKIPPING TESTS: you need the following schema file: $f.schema" + exit 1 + fi +done + +touch modules.conf || exit 1 + +if ! slapadd -d 0 -f "${srcdir}/slapd.conf" < "${srcdir}/init.ldif"; then + echo "moduleload back_bdb.la" >> modules.conf + if ! slapadd -d 0 -f "${srcdir}/slapd.conf" < "${srcdir}/init.ldif"; then + echo "modulepath /usr/lib/ldap" > modules.conf + echo "moduleload back_bdb.la" >> modules.conf + slapadd -d 0 -f "${srcdir}/slapd.conf" < "${srcdir}/init.ldif" || exit 1 + fi +fi + +cp "`which slapd`" . || true # fails if running + +echo "starting slapd" +./slapd -d0 -f "${srcdir}/slapd.conf" -h ldapi://.%2Fldap-socket & + +sleep 4 diff --git a/crypto/heimdal/tests/ldap/slapd-stop b/crypto/heimdal/tests/ldap/slapd-stop new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/slapd-stop @@ -0,0 +1,18 @@ +#!/bin/sh +# $Id$ + +echo stoping slapd + +# kill of old slapd +if [ -f slapd.pid ]; then + kill `cat slapd.pid` + sleep 5 +fi +if [ -f slapd.pid ]; then + kill -9 `cat slapd.pid` + rm -f slapd.pid + sleep 5 +fi + +exit 0 + diff --git a/crypto/heimdal/tests/ldap/slapd.conf b/crypto/heimdal/tests/ldap/slapd.conf new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/ldap/slapd.conf @@ -0,0 +1,27 @@ +loglevel 0 + +include schema/core.schema +include schema/cosine.schema +include schema/inetorgperson.schema +include schema/openldap.schema +include schema/nis.schema +include schema/hdb.schema +include schema/samba.schema + + +pidfile slapd.pid +argsfile slapd.args + +access to * by * write + +allow update_anon bind_anon_dn + +include modules.conf + +defaultsearchbase "ou=TEST,dc=H5L,dc=SE" + +database bdb +suffix "o=TEST,dc=H5L,dc=SE" +directory db +index objectClass eq +index uid eq diff --git a/crypto/heimdal/tests/plugin/Makefile.am b/crypto/heimdal/tests/plugin/Makefile.am new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/plugin/Makefile.am @@ -0,0 +1,45 @@ +# $Id$ + +include $(top_srcdir)/Makefile.am.common + +noinst_DATA = krb5.conf + +SCRIPT_TESTS = check-pac +TESTS = $(SCRIPT_TESTS) + +port = 49188 + +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/plugin,g' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +LDADD = ../../lib/krb5/libkrb5.la $(LIB_roken) + +check-pac: check-pac.in Makefile + $(do_subst) < $(srcdir)/check-pac.in > check-pac.tmp + chmod +x check-pac.tmp + mv check-pac.tmp check-pac + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +lib_LTLIBRARIES = windc.la + +windc_la_SOURCES = windc.c +windc_la_LDFLAGS = -module + +CLEANFILES= \ + $(TESTS) \ + server.keytab \ + current-db* \ + foopassword \ + krb5.conf krb5.conf.tmp \ + messages.log + +EXTRA_DIST = \ + NTMakefile \ + check-pac.in \ + krb5.conf.in diff --git a/crypto/heimdal/tests/plugin/Makefile.in b/crypto/heimdal/tests/plugin/Makefile.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/plugin/Makefile.in @@ -0,0 +1,1443 @@ +# Makefile.in generated by automake 1.16.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2021 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@ + +# $Id$ + +# $Id$ + +# $Id$ + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +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/plugin +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ + $(top_srcdir)/cf/auth-modules.m4 \ + $(top_srcdir)/cf/broken-glob.m4 \ + $(top_srcdir)/cf/broken-realloc.m4 \ + $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ + $(top_srcdir)/cf/broken2.m4 $(top_srcdir)/cf/c-attribute.m4 \ + $(top_srcdir)/cf/capabilities.m4 \ + $(top_srcdir)/cf/check-compile-et.m4 \ + $(top_srcdir)/cf/check-getpwnam_r-posix.m4 \ + $(top_srcdir)/cf/check-man.m4 \ + $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ + $(top_srcdir)/cf/check-type-extra.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ + $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ + $(top_srcdir)/cf/find-func-no-libs.m4 \ + $(top_srcdir)/cf/find-func-no-libs2.m4 \ + $(top_srcdir)/cf/find-func.m4 \ + $(top_srcdir)/cf/find-if-not-broken.m4 \ + $(top_srcdir)/cf/framework-security.m4 \ + $(top_srcdir)/cf/have-struct-field.m4 \ + $(top_srcdir)/cf/have-type.m4 $(top_srcdir)/cf/irix.m4 \ + $(top_srcdir)/cf/krb-bigendian.m4 \ + $(top_srcdir)/cf/krb-func-getlogin.m4 \ + $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ + $(top_srcdir)/cf/krb-readline.m4 \ + $(top_srcdir)/cf/krb-struct-spwd.m4 \ + $(top_srcdir)/cf/krb-struct-winsize.m4 \ + $(top_srcdir)/cf/largefile.m4 $(top_srcdir)/cf/libtool.m4 \ + $(top_srcdir)/cf/ltoptions.m4 $(top_srcdir)/cf/ltsugar.m4 \ + $(top_srcdir)/cf/ltversion.m4 $(top_srcdir)/cf/lt~obsolete.m4 \ + $(top_srcdir)/cf/mips-abi.m4 $(top_srcdir)/cf/misc.m4 \ + $(top_srcdir)/cf/need-proto.m4 $(top_srcdir)/cf/osfc2.m4 \ + $(top_srcdir)/cf/otp.m4 $(top_srcdir)/cf/pkg.m4 \ + $(top_srcdir)/cf/proto-compat.m4 $(top_srcdir)/cf/pthreads.m4 \ + $(top_srcdir)/cf/resolv.m4 $(top_srcdir)/cf/retsigtype.m4 \ + $(top_srcdir)/cf/roken-frag.m4 \ + $(top_srcdir)/cf/socket-wrapper.m4 $(top_srcdir)/cf/sunos.m4 \ + $(top_srcdir)/cf/telnet.m4 $(top_srcdir)/cf/test-package.m4 \ + $(top_srcdir)/cf/version-script.m4 $(top_srcdir)/cf/wflags.m4 \ + $(top_srcdir)/cf/win32.m4 $(top_srcdir)/cf/with-all.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/include/config.h +CONFIG_CLEAN_FILES = +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)" +LTLIBRARIES = $(lib_LTLIBRARIES) +windc_la_LIBADD = +am_windc_la_OBJECTS = windc.lo +windc_la_OBJECTS = $(am_windc_la_OBJECTS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +windc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(windc_la_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/windc.Plo +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(windc_la_SOURCES) +DIST_SOURCES = $(windc_la_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(noinst_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' +RECHECK_LOGS = $(TEST_LOGS) +AM_RECURSIVE_TARGETS = check recheck +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common $(top_srcdir)/depcomp \ + $(top_srcdir)/test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +ASN1_COMPILE = @ASN1_COMPILE@ +ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CANONICAL_HOST = @CANONICAL_HOST@ +CAPNG_CFLAGS = @CAPNG_CFLAGS@ +CAPNG_LIBS = @CAPNG_LIBS@ +CATMAN = @CATMAN@ +CATMANEXT = @CATMANEXT@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ +COMPILE_ET = @COMPILE_ET@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ +CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ +DBHEADER = @DBHEADER@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DIR_com_err = @DIR_com_err@ +DIR_hdbdir = @DIR_hdbdir@ +DIR_roken = @DIR_roken@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ +GREP = @GREP@ +GROFF = @GROFF@ +INCLUDES_roken = @INCLUDES_roken@ +INCLUDE_libedit = @INCLUDE_libedit@ +INCLUDE_libintl = @INCLUDE_libintl@ +INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ +INCLUDE_readline = @INCLUDE_readline@ +INCLUDE_sqlite3 = @INCLUDE_sqlite3@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_VERSION_SCRIPT = @LDFLAGS_VERSION_SCRIPT@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBADD_roken = @LIBADD_roken@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ +LIB_bswap16 = @LIB_bswap16@ +LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ +LIB_com_err = @LIB_com_err@ +LIB_com_err_a = @LIB_com_err_a@ +LIB_com_err_so = @LIB_com_err_so@ +LIB_crypt = @LIB_crypt@ +LIB_db_create = @LIB_db_create@ +LIB_dbm_firstkey = @LIB_dbm_firstkey@ +LIB_dbopen = @LIB_dbopen@ +LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ +LIB_dlopen = @LIB_dlopen@ +LIB_dn_expand = @LIB_dn_expand@ +LIB_dns_search = @LIB_dns_search@ +LIB_door_create = @LIB_door_create@ +LIB_freeaddrinfo = @LIB_freeaddrinfo@ +LIB_gai_strerror = @LIB_gai_strerror@ +LIB_getaddrinfo = @LIB_getaddrinfo@ +LIB_gethostbyname = @LIB_gethostbyname@ +LIB_gethostbyname2 = @LIB_gethostbyname2@ +LIB_getnameinfo = @LIB_getnameinfo@ +LIB_getpwnam_r = @LIB_getpwnam_r@ +LIB_getsockopt = @LIB_getsockopt@ +LIB_hcrypto = @LIB_hcrypto@ +LIB_hcrypto_a = @LIB_hcrypto_a@ +LIB_hcrypto_appl = @LIB_hcrypto_appl@ +LIB_hcrypto_so = @LIB_hcrypto_so@ +LIB_hstrerror = @LIB_hstrerror@ +LIB_kdb = @LIB_kdb@ +LIB_libedit = @LIB_libedit@ +LIB_libintl = @LIB_libintl@ +LIB_loadquery = @LIB_loadquery@ +LIB_logout = @LIB_logout@ +LIB_logwtmp = @LIB_logwtmp@ +LIB_openldap = @LIB_openldap@ +LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ +LIB_otp = @LIB_otp@ +LIB_pidfile = @LIB_pidfile@ +LIB_readline = @LIB_readline@ +LIB_res_ndestroy = @LIB_res_ndestroy@ +LIB_res_nsearch = @LIB_res_nsearch@ +LIB_res_search = @LIB_res_search@ +LIB_roken = @LIB_roken@ +LIB_security = @LIB_security@ +LIB_setsockopt = @LIB_setsockopt@ +LIB_socket = @LIB_socket@ +LIB_sqlite3 = @LIB_sqlite3@ +LIB_syslog = @LIB_syslog@ +LIB_tgetent = @LIB_tgetent@ +LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NO_AFS = @NO_AFS@ +NROFF = @NROFF@ +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@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LDADD = @PTHREAD_LDADD@ +PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SLC = @SLC@ +SLC_DEP = @SLC_DEP@ +STRIP = @STRIP@ +VERSION = @VERSION@ +VERSIONING = @VERSIONING@ +WFLAGS = @WFLAGS@ +WFLAGS_LITE = @WFLAGS_LITE@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +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_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@ +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@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ +docdir = @docdir@ +dpagaix_cflags = @dpagaix_cflags@ +dpagaix_ldadd = @dpagaix_ldadd@ +dpagaix_ldflags = @dpagaix_ldflags@ +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@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include +AM_CPPFLAGS = $(INCLUDES_roken) +@do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME +AM_CFLAGS = $(WFLAGS) +CP = cp +buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ +LIB_el_init = @LIB_el_init@ +LIB_getattr = @LIB_getattr@ +LIB_getpwent_r = @LIB_getpwent_r@ +LIB_odm_initialize = @LIB_odm_initialize@ +LIB_setpcred = @LIB_setpcred@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ +libexec_heimdaldir = $(libexecdir)/heimdal +NROFF_MAN = groff -mandoc -Tascii +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = +@KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ +@KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la + +@KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la +@DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; +noinst_DATA = krb5.conf +SCRIPT_TESTS = check-pac +TESTS = $(SCRIPT_TESTS) +port = 49188 +do_subst = sed -e 's,[@]srcdir[@],$(srcdir),g' \ + -e 's,[@]env_setup[@],$(top_builddir)/tests/bin/setup-env,g' \ + -e 's,[@]port[@],$(port),g' \ + -e 's,[@]objdir[@],$(top_builddir)/tests/plugin,g' \ + -e 's,[@]EGREP[@],$(EGREP),g' + +LDADD = ../../lib/krb5/libkrb5.la $(LIB_roken) +lib_LTLIBRARIES = windc.la +windc_la_SOURCES = windc.c +windc_la_LDFLAGS = -module +CLEANFILES = \ + $(TESTS) \ + server.keytab \ + current-db* \ + foopassword \ + krb5.conf krb5.conf.tmp \ + messages.log + +EXTRA_DIST = \ + NTMakefile \ + check-pac.in \ + krb5.conf.in + +all: all-am + +.SUFFIXES: +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c .lo .log .o .obj .test .test$(EXEEXT) .trs +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(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/plugin/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign tests/plugin/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__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): + +$(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-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}; \ + } + +windc.la: $(windc_la_OBJECTS) $(windc_la_DEPENDENCIES) $(EXTRA_windc_la_DEPENDENCIES) + $(AM_V_CCLD)$(windc_la_LINK) -rpath $(libdir) $(windc_la_OBJECTS) $(windc_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windc.Plo@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + 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-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + 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-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + 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 + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +check-pac.log: check-pac + @p='check-pac'; \ + b='check-pac'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(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 + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-TESTS check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(DATA) all-local +installdirs: + for dir in "$(DESTDIR)$(libdir)"; 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: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +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 -f ./$(DEPDIR)/windc.Plo + -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: + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-data-hook +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-exec-local 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 -f ./$(DEPDIR)/windc.Plo + -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-libLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: check-am install-am install-data-am install-strip uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--depfiles check \ + check-TESTS check-am check-local clean clean-generic \ + clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \ + ctags-am dist-hook 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-data-hook install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-local \ + install-html install-html-am 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 \ + recheck tags tags-am uninstall uninstall-am uninstall-hook \ + uninstall-libLTLIBRARIES + +.PRECIOUS: Makefile + + +install-suid-programs: + @foo='$(bin_SUIDS)'; \ + for file in $$foo; do \ + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs + +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi + +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ + for f in $$foo; do \ + f=`basename $$f`; \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f || true; \ + fi ; \ + done ; \ + foo='$(nobase_include_HEADERS)'; \ + for f in $$foo; do \ + if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ + else file="$$f"; fi; \ + $(mkdir_p) $(buildinclude)/`dirname $$f` ; \ + if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ + : ; else \ + echo " $(CP) $$file $(buildinclude)/$$f"; \ + $(CP) $$file $(buildinclude)/$$f; \ + fi ; \ + done + +all-local: install-build-headers + +check-local:: + @if test '$(CHECK_LOCAL)' = "no-check-local"; then \ + foo=''; elif test '$(CHECK_LOCAL)'; then \ + foo='$(CHECK_LOCAL)'; else \ + foo='$(PROGRAMS)'; fi; \ + if test "$$foo"; then \ + failed=0; all=0; \ + for i in $$foo; do \ + all=`expr $$all + 1`; \ + if (./$$i --version && ./$$i --help) > /dev/null 2>&1; then \ + echo "PASS: $$i"; \ + else \ + echo "FAIL: $$i"; \ + failed=`expr $$failed + 1`; \ + fi; \ + done; \ + if test "$$failed" -eq 0; then \ + banner="All $$all tests passed"; \ + else \ + banner="$$failed of $$all tests failed"; \ + fi; \ + dashes=`echo "$$banner" | sed s/./=/g`; \ + echo "$$dashes"; \ + echo "$$banner"; \ + echo "$$dashes"; \ + test "$$failed" -eq 0 || exit 1; \ + fi + +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. +.x.c: + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi + +.hx.h: + @cmp -s $< $@ 2> /dev/null || cp $< $@; +#NROFF_MAN = nroff -man +.1.cat1: + $(NROFF_MAN) $< > $@ +.3.cat3: + $(NROFF_MAN) $< > $@ +.5.cat5: + $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ +.8.cat8: + $(NROFF_MAN) $< > $@ + +dist-cat1-mans: + @foo='$(man1_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.1) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat1/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat3-mans: + @foo='$(man3_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.3) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat3/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat5-mans: + @foo='$(man5_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.5) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat5/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-cat8-mans: + @foo='$(man8_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.8) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat8/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans + +install-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +uninstall-cat-mans: + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) + +install-data-hook: install-cat-mans +uninstall-hook: uninstall-cat-mans + +.et.h: + $(COMPILE_ET) $< +.et.c: + $(COMPILE_ET) $< + +# +# Useful target for debugging +# + +check-valgrind: + tobjdir=`cd $(top_builddir) && pwd` ; \ + tsrcdir=`cd $(top_srcdir) && pwd` ; \ + env TESTS_ENVIRONMENT="$${tsrcdir}/cf/maybe-valgrind.sh -s $${tsrcdir} -o $${tobjdir}" make check + +# +# Target to please samba build farm, builds distfiles in-tree. +# Will break when automake changes... +# + +distdir-in-tree: $(DISTFILES) $(INFO_DEPS) + list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" != .; then \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) distdir-in-tree) ; \ + fi ; \ + done + +check-pac: check-pac.in Makefile + $(do_subst) < $(srcdir)/check-pac.in > check-pac.tmp + chmod +x check-pac.tmp + mv check-pac.tmp check-pac + +krb5.conf: krb5.conf.in Makefile + $(do_subst) < $(srcdir)/krb5.conf.in > krb5.conf.tmp + mv krb5.conf.tmp krb5.conf + +# 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: diff --git a/crypto/heimdal/tests/plugin/NTMakefile b/crypto/heimdal/tests/plugin/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/plugin/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tests\plugin + +!include ../../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tests/plugin/check-pac.in b/crypto/heimdal/tests/plugin/check-pac.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/plugin/check-pac.in @@ -0,0 +1,145 @@ +#!/bin/sh +# +# Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan +# (Royal Institute of Technology, Stockholm, Sweden). +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# 3. Neither the name of the Institute nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $Id$ +# + +srcdir="@srcdir@" +env_setup="@env_setup@" +objdir="@objdir@" +EGREP="@EGREP@" + +. ${env_setup} + +testfailed="echo test failed; cat messages.log; exit 1" + +# If there is no useful db support compiled in, disable test +../db/have-db || exit 77 + +R=TEST.H5L.SE + +port=@port@ + +kadmin="${TESTS_ENVIRONMENT} ../../kadmin/kadmin -l -r ${R}" +kdc="${TESTS_ENVIRONMENT} ../../kdc/kdc --addresses=localhost -P $port" + +server=host/datan.test.h5l.se +cache="FILE:${objdir}/cache.krb5" +keytabfile=${objdir}/server.keytab +keytab="FILE:${keytabfile}" + +kinit="${TESTS_ENVIRONMENT} ../../kuser/kinit -c $cache ${afs_no_afslog}" +klist="${TESTS_ENVIRONMENT} ../../kuser/klist -c $cache" +kgetcred="${TESTS_ENVIRONMENT} ../../kuser/kgetcred -c $cache" +kdestroy="${TESTS_ENVIRONMENT} ../../kuser/kdestroy -c $cache ${afs_no_unlog}" +test_apreq="${TESTS_ENVIRONMENT} ../../lib/krb5/test_ap-req" + +KRB5_CONFIG="${objdir}/krb5.conf" +export KRB5_CONFIG + +rm -f ${keytabfile} +rm -f current-db* +rm -f out-* +rm -f mkey.file* + +> messages.log + +echo Creating database +${kadmin} \ + init \ + --realm-max-ticket-life=1day \ + --realm-max-renewable-life=1month \ + ${R} || exit 1 + +${kadmin} add -p foo --use-defaults foo@${R} || exit 1 +${kadmin} add -p bar --use-defaults ${server}@${R} || exit 1 +${kadmin} ext -k ${keytab} ${server}@${R} || exit 1 + +echo "Doing database check" +${kadmin} check ${R} || exit 1 +${kadmin} check ${R2} || exit 1 + +echo foo > ${objdir}/foopassword + +echo "Empty log" +> messages.log + +echo Starting kdc +${kdc} --detach --testing || { echo "kdc failed to start"; exit 1; } +kdcpid=`getpid kdc` + +trap "kill ${kdcpid}; echo signal killing kdc; exit 1;" EXIT + +ec=0 + +echo "Check that WINDC module was loaded " +grep "windc init" messages.log >/dev/null || \ + { ec=1 ; eval "${testfailed}"; } + +echo "Getting client initial tickets"; > messages.log +${kinit} --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting tickets" ; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Verify PAC on server"; > messages.log +${test_apreq} --verify-pac ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client initial tickets (pag)"; > messages.log +${kinit} --request-pac --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting tickets" ; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Verify PAC on server (pag)"; > messages.log +${test_apreq} --verify-pac ${server}@${R} ${keytab} ${cache} || \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + +echo "Getting client initial tickets (no pag)"; > messages.log +${kinit} --no-request-pac --password-file=${objdir}/foopassword foo@${R} || \ + { ec=1 ; eval "${testfailed}"; } +echo "Getting tickets" ; > messages.log +${kgetcred} ${server}@${R} || { ec=1 ; eval "${testfailed}"; } +echo "Verify PAC on server (no pag)"; > messages.log +${test_apreq} --verify-pac ${server}@${R} ${keytab} ${cache} 2> /dev/null && \ + { ec=1 ; eval "${testfailed}"; } +${kdestroy} + + +echo "killing kdc (${kdcpid})" +kill $kdcpid || exit 1 + +trap "" EXIT + +exit $ec diff --git a/crypto/heimdal/tests/plugin/krb5.conf.in b/crypto/heimdal/tests/plugin/krb5.conf.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/plugin/krb5.conf.in @@ -0,0 +1,33 @@ +# $Id$ + +[libdefaults] + default_realm = TEST.H5L.SE + no-addresses = TRUE + + plugin_dir = @objdir@ @objdir@/.libs + +[appdefaults] + pkinit_anchors = FILE:@srcdir@/../../lib/hx509/data/ca.crt + +[realms] + TEST.H5L.SE = { + kdc = localhost:@port@ + } + +[kdc] + database = { + dbname = @objdir@/current-db + realm = TEST.H5L.SE + mkey_file = @objdir@/mkey.file + log_file = @objdir@/log.current-db.log + } + +[hdb] + db-dir = @objdir@ + +[logging] + kdc = 0-/FILE:@objdir@/messages.log + default = 0-/FILE:@objdir@/messages.log + +[kadmin] +# default_keys = arcfour-hmac-md5:pw-salt diff --git a/crypto/heimdal/tests/plugin/windc.c b/crypto/heimdal/tests/plugin/windc.c new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tests/plugin/windc.c @@ -0,0 +1,85 @@ +#include +#include +#include +#include + +static krb5_error_code +windc_init(krb5_context context, void **ctx) +{ + krb5_warnx(context, "windc init"); + *ctx = NULL; + return 0; +} + +static void +windc_fini(void *ctx) +{ +} + +static krb5_error_code +pac_generate(void *ctx, krb5_context context, + struct hdb_entry_ex *client, krb5_pac *pac) +{ + krb5_error_code ret; + krb5_data data; + + krb5_warnx(context, "pac generate"); + + data.data = "\x00\x01"; + data.length = 2; + + ret = krb5_pac_init(context, pac); + if (ret) + return ret; + + ret = krb5_pac_add_buffer(context, *pac, 1, &data); + if (ret) + return ret; + + return 0; +} + +static krb5_error_code +pac_verify(void *ctx, krb5_context context, + const krb5_principal new_ticket_client, + const krb5_principal delegation_proxy, + struct hdb_entry_ex * client, + struct hdb_entry_ex * server, + struct hdb_entry_ex * krbtgt, + krb5_pac *pac) +{ + krb5_error_code ret; + krb5_data data; + + krb5_warnx(context, "pac_verify"); + + ret = krb5_pac_get_buffer(context, *pac, 1, &data); + if (ret) + return ret; + + krb5_data_free(&data); + + return 0; +} + +static krb5_error_code +client_access(void *ctx, + krb5_context context, + krb5_kdc_configuration *config, + hdb_entry_ex *client, const char *client_name, + hdb_entry_ex *server, const char *server_name, + KDC_REQ *req, + METHOD_DATA *data) +{ + krb5_warnx(context, "client_access"); + return 0; +} + +krb5plugin_windc_ftable windc = { + KRB5_WINDC_PLUGING_MINOR, + windc_init, + windc_fini, + pac_generate, + pac_verify, + client_access +}; diff --git a/crypto/heimdal/tools/Makefile.am b/crypto/heimdal/tools/Makefile.am --- a/crypto/heimdal/tools/Makefile.am +++ b/crypto/heimdal/tools/Makefile.am @@ -6,7 +6,16 @@ pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = heimdal-gssapi.pc +pkgconfig_DATA = \ + heimdal-gssapi.pc \ + heimdal-krb5.pc \ + heimdal-kadm-client.pc \ + heimdal-kadm-server.pc \ + kafs.pc \ + kadm-client.pc \ + kadm-server.pc \ + krb5.pc \ + krb5-gssapi.pc man_MANS = krb5-config.1 @@ -16,6 +25,7 @@ subst = sed -e "s!@PACKAGE\@!$(PACKAGE)!g" \ -e "s!@VERSION\@!$(VERSION)!g" \ + -e "s!@CANONICAL_HOST\@!$(CANONICAL_HOST)!g" \ -e "s!@prefix\@!$(prefix)!g" \ -e "s!@exec_prefix\@!$(exec_prefix)!g" \ -e "s!@libdir\@!$(libdir)!g" \ @@ -23,7 +33,6 @@ -e "s!@PTHREAD_LIBADD\@!$(PTHREAD_LIBADD)!g" \ -e "s!@LIB_crypt\@!$(LIB_crypt)!g" \ -e "s!@LIB_dbopen\@!$(LIB_dbopen)!g" \ - -e "s!@INCLUDE_hcrypto\@!$(INCLUDE_hcrypto)!g" \ -e "s!@LIB_hcrypto_appl\@!$(LIB_hcrypto_appl)!g" \ -e "s!@LIB_dlopen\@!$(LIB_dlopen)!g" \ -e "s!@LIB_door_create\@!$(LIB_door_create)!g" \ @@ -31,24 +40,26 @@ -e "s!@LIBS\@!$(LIBS)!g" krb5-config: krb5-config.in - $(subst) $(srcdir)/krb5-config.in > $@.new + $(subst) $(srcdir)/krb5-config.in | /bin/sh > $@.new mv $@.new $@ chmod +x $@ -heimdal-gssapi.pc: heimdal-gssapi.pc.in - $(subst) $(srcdir)/heimdal-gssapi.pc.in > $@.new +.pc.in.pc: + $(subst) $< > $@.new mv $@.new $@ EXTRA_DIST = \ NTMakefile \ + cov.sh \ $(man_MANS) \ krb5-config.in \ heimdal-gssapi.pc.in \ - kdc-log-analyze.pl + kdc-log-analyze.pl \ + $(pkgconfig_DATA:.pc=.pc.in) CLEANFILES = \ krb5-config \ krb5-config.new \ - heimdal-gssapi.pc \ - heimdal-gssapi.pc.new + $(pkgconfig_DATA) \ + $(pkgconfig_DATA:.pc=.pc.new) diff --git a/crypto/heimdal/tools/Makefile.in b/crypto/heimdal/tools/Makefile.in --- a/crypto/heimdal/tools/Makefile.in +++ b/crypto/heimdal/tools/Makefile.in @@ -1,9 +1,8 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 1994-2021 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. @@ -23,6 +22,61 @@ VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ @@ -41,14 +95,10 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(top_srcdir)/Makefile.am.common \ - $(top_srcdir)/cf/Makefile.am.common subdir = tools ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/cf/aix.m4 \ $(top_srcdir)/cf/auth-modules.m4 \ - $(top_srcdir)/cf/broken-getaddrinfo.m4 \ $(top_srcdir)/cf/broken-glob.m4 \ $(top_srcdir)/cf/broken-realloc.m4 \ $(top_srcdir)/cf/broken-snprintf.m4 $(top_srcdir)/cf/broken.m4 \ @@ -59,8 +109,7 @@ $(top_srcdir)/cf/check-man.m4 \ $(top_srcdir)/cf/check-netinet-ip-and-tcp.m4 \ $(top_srcdir)/cf/check-type-extra.m4 \ - $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/check-x.m4 \ - $(top_srcdir)/cf/check-xau.m4 $(top_srcdir)/cf/crypto.m4 \ + $(top_srcdir)/cf/check-var.m4 $(top_srcdir)/cf/crypto.m4 \ $(top_srcdir)/cf/db.m4 $(top_srcdir)/cf/destdirs.m4 \ $(top_srcdir)/cf/dispatch.m4 $(top_srcdir)/cf/dlopen.m4 \ $(top_srcdir)/cf/find-func-no-libs.m4 \ @@ -73,6 +122,7 @@ $(top_srcdir)/cf/krb-bigendian.m4 \ $(top_srcdir)/cf/krb-func-getlogin.m4 \ $(top_srcdir)/cf/krb-ipv6.m4 $(top_srcdir)/cf/krb-prog-ln-s.m4 \ + $(top_srcdir)/cf/krb-prog-perl.m4 \ $(top_srcdir)/cf/krb-readline.m4 \ $(top_srcdir)/cf/krb-struct-spwd.m4 \ $(top_srcdir)/cf/krb-struct-winsize.m4 \ @@ -92,6 +142,7 @@ $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/config.h CONFIG_CLEAN_FILES = @@ -117,19 +168,48 @@ 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)$(bindir)" "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(pkgconfigdir)" SCRIPTS = $(bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = 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 man1dir = $(mandir)/man1 MANS = $(man_MANS) DATA = $(pkgconfig_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/Makefile.am.common \ + $(top_srcdir)/cf/Makefile.am.common DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AIX_EXTRA_KAFS = @AIX_EXTRA_KAFS@ AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ +AS = @AS@ ASN1_COMPILE = @ASN1_COMPILE@ ASN1_COMPILE_DEP = @ASN1_COMPILE_DEP@ AUTOCONF = @AUTOCONF@ @@ -144,16 +224,19 @@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ +CLANG_FORMAT = @CLANG_FORMAT@ COMPILE_ET = @COMPILE_ET@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CYGPATH_W = @CYGPATH_W@ +DB1LIB = @DB1LIB@ +DB3LIB = @DB3LIB@ DBHEADER = @DBHEADER@ -DBLIB = @DBLIB@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIR_com_err = @DIR_com_err@ -DIR_hcrypto = @DIR_hcrypto@ DIR_hdbdir = @DIR_hdbdir@ DIR_roken = @DIR_roken@ DLLTOOL = @DLLTOOL@ @@ -163,17 +246,19 @@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ENABLE_AFS_STRING_TO_KEY = @ENABLE_AFS_STRING_TO_KEY@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ +FILECMD = @FILECMD@ +GCD_MIG = @GCD_MIG@ GREP = @GREP@ GROFF = @GROFF@ INCLUDES_roken = @INCLUDES_roken@ -INCLUDE_hcrypto = @INCLUDE_hcrypto@ -INCLUDE_hesiod = @INCLUDE_hesiod@ -INCLUDE_krb4 = @INCLUDE_krb4@ INCLUDE_libedit = @INCLUDE_libedit@ INCLUDE_libintl = @INCLUDE_libintl@ INCLUDE_openldap = @INCLUDE_openldap@ +INCLUDE_openssl_crypto = @INCLUDE_openssl_crypto@ INCLUDE_readline = @INCLUDE_readline@ INCLUDE_sqlite3 = @INCLUDE_sqlite3@ INSTALL = @INSTALL@ @@ -192,12 +277,9 @@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIB_AUTH_SUBDIRS = @LIB_AUTH_SUBDIRS@ -LIB_NDBM = @LIB_NDBM@ -LIB_XauFileName = @LIB_XauFileName@ -LIB_XauReadAuth = @LIB_XauReadAuth@ -LIB_XauWriteAuth = @LIB_XauWriteAuth@ LIB_bswap16 = @LIB_bswap16@ LIB_bswap32 = @LIB_bswap32@ +LIB_bswap64 = @LIB_bswap64@ LIB_com_err = @LIB_com_err@ LIB_com_err_a = @LIB_com_err_a@ LIB_com_err_so = @LIB_com_err_so@ @@ -206,6 +288,7 @@ LIB_dbm_firstkey = @LIB_dbm_firstkey@ LIB_dbopen = @LIB_dbopen@ LIB_dispatch_async_f = @LIB_dispatch_async_f@ +LIB_dladdr = @LIB_dladdr@ LIB_dlopen = @LIB_dlopen@ LIB_dn_expand = @LIB_dn_expand@ LIB_dns_search = @LIB_dns_search@ @@ -222,10 +305,8 @@ LIB_hcrypto_a = @LIB_hcrypto_a@ LIB_hcrypto_appl = @LIB_hcrypto_appl@ LIB_hcrypto_so = @LIB_hcrypto_so@ -LIB_hesiod = @LIB_hesiod@ LIB_hstrerror = @LIB_hstrerror@ LIB_kdb = @LIB_kdb@ -LIB_krb4 = @LIB_krb4@ LIB_libedit = @LIB_libedit@ LIB_libintl = @LIB_libintl@ LIB_loadquery = @LIB_loadquery@ @@ -233,6 +314,7 @@ LIB_logwtmp = @LIB_logwtmp@ LIB_openldap = @LIB_openldap@ LIB_openpty = @LIB_openpty@ +LIB_openssl_crypto = @LIB_openssl_crypto@ LIB_otp = @LIB_otp@ LIB_pidfile = @LIB_pidfile@ LIB_readline = @LIB_readline@ @@ -247,12 +329,15 @@ LIB_syslog = @LIB_syslog@ LIB_tgetent = @LIB_tgetent@ LIPO = @LIPO@ +LMDBLIB = @LMDBLIB@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +NDBMLIB = @NDBMLIB@ NM = @NM@ NMEDIT = @NMEDIT@ NO_AFS = @NO_AFS@ @@ -269,10 +354,16 @@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ PKG_CONFIG = @PKG_CONFIG@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LDADD = @PTHREAD_LDADD@ PTHREAD_LIBADD = @PTHREAD_LIBADD@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ @@ -283,13 +374,7 @@ VERSION = @VERSION@ VERSIONING = @VERSIONING@ WFLAGS = @WFLAGS@ -WFLAGS_NOIMPLICITINT = @WFLAGS_NOIMPLICITINT@ -WFLAGS_NOUNUSED = @WFLAGS_NOUNUSED@ -XMKMF = @XMKMF@ -X_CFLAGS = @X_CFLAGS@ -X_EXTRA_LIBS = @X_EXTRA_LIBS@ -X_LIBS = @X_LIBS@ -X_PRE_LIBS = @X_PRE_LIBS@ +WFLAGS_LITE = @WFLAGS_LITE@ YACC = @YACC@ YFLAGS = @YFLAGS@ abs_builddir = @abs_builddir@ @@ -313,6 +398,8 @@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ +db_type = @db_type@ +db_type_preference = @db_type_preference@ docdir = @docdir@ dpagaix_cflags = @dpagaix_cflags@ dpagaix_ldadd = @dpagaix_ldadd@ @@ -336,9 +423,14 @@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -348,36 +440,55 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -SUFFIXES = .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 +SUFFIXES = .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 \ + .cat5 .cat7 .cat8 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include AM_CPPFLAGS = $(INCLUDES_roken) @do_roken_rename_TRUE@ROKEN_RENAME = -DROKEN_RENAME AM_CFLAGS = $(WFLAGS) CP = cp buildinclude = $(top_builddir)/include +LIB_XauReadAuth = @LIB_XauReadAuth@ LIB_el_init = @LIB_el_init@ LIB_getattr = @LIB_getattr@ LIB_getpwent_r = @LIB_getpwent_r@ LIB_odm_initialize = @LIB_odm_initialize@ LIB_setpcred = @LIB_setpcred@ -HESIODLIB = @HESIODLIB@ -HESIODINCLUDE = @HESIODINCLUDE@ +INCLUDE_krb4 = @INCLUDE_krb4@ +LIB_krb4 = @LIB_krb4@ libexec_heimdaldir = $(libexecdir)/heimdal NROFF_MAN = groff -mandoc -Tascii -LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_FALSE@LIB_kafs = $(top_builddir)/lib/kafs/libkafs.la $(AIX_EXTRA_KAFS) +@NO_AFS_TRUE@LIB_kafs = @KRB5_TRUE@LIB_krb5 = $(top_builddir)/lib/krb5/libkrb5.la \ @KRB5_TRUE@ $(top_builddir)/lib/asn1/libasn1.la @KRB5_TRUE@LIB_gssapi = $(top_builddir)/lib/gssapi/libgssapi.la -LIB_heimbase = $(top_builddir)/base/libheimbase.la +LIB_heimbase = $(top_builddir)/lib/base/libheimbase.la @DCE_TRUE@LIB_kdfs = $(top_builddir)/lib/kdfs/libkdfs.la + +#silent-rules +heim_verbose = $(heim_verbose_$(V)) +heim_verbose_ = $(heim_verbose_$(AM_DEFAULT_VERBOSITY)) +heim_verbose_0 = @echo " GEN "$@; bin_SCRIPTS = krb5-config pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = heimdal-gssapi.pc +pkgconfig_DATA = \ + heimdal-gssapi.pc \ + heimdal-krb5.pc \ + heimdal-kadm-client.pc \ + heimdal-kadm-server.pc \ + kafs.pc \ + kadm-client.pc \ + kadm-server.pc \ + krb5.pc \ + krb5-gssapi.pc + man_MANS = krb5-config.1 @PKINIT_TRUE@LIB_pkinit = -lhx509 subst = sed -e "s!@PACKAGE\@!$(PACKAGE)!g" \ -e "s!@VERSION\@!$(VERSION)!g" \ + -e "s!@CANONICAL_HOST\@!$(CANONICAL_HOST)!g" \ -e "s!@prefix\@!$(prefix)!g" \ -e "s!@exec_prefix\@!$(exec_prefix)!g" \ -e "s!@libdir\@!$(libdir)!g" \ @@ -385,7 +496,6 @@ -e "s!@PTHREAD_LIBADD\@!$(PTHREAD_LIBADD)!g" \ -e "s!@LIB_crypt\@!$(LIB_crypt)!g" \ -e "s!@LIB_dbopen\@!$(LIB_dbopen)!g" \ - -e "s!@INCLUDE_hcrypto\@!$(INCLUDE_hcrypto)!g" \ -e "s!@LIB_hcrypto_appl\@!$(LIB_hcrypto_appl)!g" \ -e "s!@LIB_dlopen\@!$(LIB_dlopen)!g" \ -e "s!@LIB_door_create\@!$(LIB_door_create)!g" \ @@ -394,21 +504,23 @@ EXTRA_DIST = \ NTMakefile \ + cov.sh \ $(man_MANS) \ krb5-config.in \ heimdal-gssapi.pc.in \ - kdc-log-analyze.pl + kdc-log-analyze.pl \ + $(pkgconfig_DATA:.pc=.pc.in) CLEANFILES = \ krb5-config \ krb5-config.new \ - heimdal-gssapi.pc \ - heimdal-gssapi.pc.new + $(pkgconfig_DATA) \ + $(pkgconfig_DATA:.pc=.pc.new) all: all-am .SUFFIXES: -.SUFFIXES: .et .h .x .z .hx .1 .3 .5 .8 .cat1 .cat3 .cat5 .cat8 .c +.SUFFIXES: .et .h .pc.in .pc .x .z .hx .1 .3 .5 .7 .8 .cat1 .cat3 .cat5 .cat7 .cat8 .c $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ @@ -421,15 +533,15 @@ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tools/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tools/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);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; +$(top_srcdir)/Makefile.am.common $(top_srcdir)/cf/Makefile.am.common $(am__empty): $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh @@ -441,8 +553,11 @@ $(am__aclocal_m4_deps): install-binSCRIPTS: $(bin_SCRIPTS) @$(NORMAL_INSTALL) - test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @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; \ @@ -470,9 +585,7 @@ @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 's,.*/,,;$(transform)'`; \ - test -n "$$list" || exit 0; \ - echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(bindir)" && rm -f $$files + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) mostlyclean-libtool: -rm -f *.lo @@ -481,11 +594,18 @@ -rm -rf .libs _libs install-man1: $(man_MANS) @$(NORMAL_INSTALL) - test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" - @list=''; test -n "$(man1dir)" || exit 0; \ - { 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'; \ + @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"; \ @@ -514,13 +634,14 @@ 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,.,'`; \ - test -z "$$files" || { \ - echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) - test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @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"; \ @@ -534,30 +655,17 @@ @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -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 + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -608,10 +716,15 @@ installcheck: installcheck-am install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + 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: @@ -651,9 +764,8 @@ install-dvi-am: -install-exec-am: install-binSCRIPTS - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-exec-am: install-binSCRIPTS install-exec-local + install-html: install-html-am install-html-am: @@ -696,39 +808,53 @@ $(MAKE) $(AM_MAKEFLAGS) uninstall-hook uninstall-man: uninstall-man1 -.MAKE: check-am install-am install-data-am install-exec-am \ - install-strip uninstall-am +.MAKE: check-am install-am install-data-am install-strip uninstall-am .PHONY: all all-am all-local check check-am check-local clean \ - clean-generic clean-libtool dist-hook distclean \ - distclean-generic distclean-libtool distdir dvi dvi-am html \ - html-am info info-am install install-am install-binSCRIPTS \ - install-data install-data-am install-data-hook install-dvi \ - install-dvi-am install-exec install-exec-am install-exec-hook \ - install-html install-html-am install-info install-info-am \ - install-man install-man1 install-pdf install-pdf-am \ - install-pkgconfigDATA install-ps install-ps-am install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ + clean-generic clean-libtool cscopelist-am ctags-am dist-hook \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binSCRIPTS install-data install-data-am \ + install-data-hook 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-man1 install-pdf install-pdf-am install-pkgconfigDATA \ + 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-binSCRIPTS uninstall-hook uninstall-man \ + mostlyclean-libtool pdf pdf-am ps ps-am tags-am uninstall \ + uninstall-am uninstall-binSCRIPTS uninstall-hook uninstall-man \ uninstall-man1 uninstall-pkgconfigDATA +.PRECIOUS: Makefile + install-suid-programs: @foo='$(bin_SUIDS)'; \ for file in $$foo; do \ - x=$(DESTDIR)$(bindir)/$$file; \ - if chown 0:0 $$x && chmod u+s $$x; then :; else \ - echo "*"; \ - echo "* Failed to install $$x setuid root"; \ - echo "*"; \ - fi; done + x=$(DESTDIR)$(bindir)/$$file; \ + if chown 0:0 $$x && chmod u+s $$x; then :; else \ + echo "*"; \ + echo "* Failed to install $$x setuid root"; \ + echo "*"; \ + fi; \ + done + +install-exec-local: install-suid-programs -install-exec-hook: install-suid-programs +codesign-all: + @if [ X"$$CODE_SIGN_IDENTITY" != X ] ; then \ + foo='$(bin_PROGRAMS) $(sbin_PROGRAMS) $(libexec_PROGRAMS)' ; \ + for file in $$foo ; do \ + echo "CODESIGN $$file" ; \ + codesign -f -s "$$CODE_SIGN_IDENTITY" $$file || exit 1 ; \ + done ; \ + fi -install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) - @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ)'; \ +all-local: codesign-all + +install-build-headers:: $(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(nobase_include_HEADERS) $(noinst_HEADERS) + @foo='$(include_HEADERS) $(dist_include_HEADERS) $(nodist_include_HEADERS) $(build_HEADERZ) $(noinst_HEADERS)'; \ for f in $$foo; do \ f=`basename $$f`; \ if test -f "$(srcdir)/$$f"; then file="$(srcdir)/$$f"; \ @@ -736,7 +862,7 @@ if cmp -s $$file $(buildinclude)/$$f 2> /dev/null ; then \ : ; else \ echo " $(CP) $$file $(buildinclude)/$$f"; \ - $(CP) $$file $(buildinclude)/$$f; \ + $(CP) $$file $(buildinclude)/$$f || true; \ fi ; \ done ; \ foo='$(nobase_include_HEADERS)'; \ @@ -781,11 +907,20 @@ test "$$failed" -eq 0 || exit 1; \ fi +# It's useful for debugging to format generated sources. The default for all +# clang-format styles is to sort includes, but in many cases in-tree we really +# don't want to do that. .x.c: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @if [ -z "$(CLANG_FORMAT)" ]; then \ + cmp -s $< $@ 2> /dev/null || cp $< $@; \ + else \ + cp $< $@.tmp.c; \ + $(CLANG_FORMAT) -style='{BasedOnStyle: Chromium, SortIncludes: false}' -i $@.tmp.c; \ + cmp -s $@.tmp.c $@ 2> /dev/null || mv $@.tmp.c $@; \ + fi .hx.h: - @cmp -s $< $@ 2> /dev/null || cp $< $@ + @cmp -s $< $@ 2> /dev/null || cp $< $@; #NROFF_MAN = nroff -man .1.cat1: $(NROFF_MAN) $< > $@ @@ -793,6 +928,8 @@ $(NROFF_MAN) $< > $@ .5.cat5: $(NROFF_MAN) $< > $@ +.7.cat7: + $(NROFF_MAN) $< > $@ .8.cat8: $(NROFF_MAN) $< > $@ @@ -835,6 +972,19 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done +dist-cat7-mans: + @foo='$(man7_MANS)'; \ + bar='$(man_MANS)'; \ + for i in $$bar; do \ + case $$i in \ + *.7) foo="$$foo $$i";; \ + esac; done ;\ + for i in $$foo; do \ + x=`echo $$i | sed 's/\.[^.]*$$/.cat7/'`; \ + echo "$(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x"; \ + $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ + done + dist-cat8-mans: @foo='$(man8_MANS)'; \ bar='$(man_MANS)'; \ @@ -848,13 +998,13 @@ $(NROFF_MAN) $(srcdir)/$$i > $(distdir)/$$x; \ done -dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat8-mans +dist-hook: dist-cat1-mans dist-cat3-mans dist-cat5-mans dist-cat7-mans dist-cat8-mans install-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh install "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) uninstall-cat-mans: - $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man8_MANS) + $(SHELL) $(top_srcdir)/cf/install-catman.sh uninstall "$(INSTALL_DATA)" "$(mkinstalldirs)" "$(srcdir)" "$(DESTDIR)$(mandir)" '$(CATMANEXT)' $(man_MANS) $(man1_MANS) $(man3_MANS) $(man5_MANS) $(man7_MANS) $(man8_MANS) install-data-hook: install-cat-mans uninstall-hook: uninstall-cat-mans @@ -886,12 +1036,12 @@ done krb5-config: krb5-config.in - $(subst) $(srcdir)/krb5-config.in > $@.new + $(subst) $(srcdir)/krb5-config.in | /bin/sh > $@.new mv $@.new $@ chmod +x $@ -heimdal-gssapi.pc: heimdal-gssapi.pc.in - $(subst) $(srcdir)/heimdal-gssapi.pc.in > $@.new +.pc.in.pc: + $(subst) $< > $@.new mv $@.new $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/crypto/heimdal/tools/NTMakefile b/crypto/heimdal/tools/NTMakefile new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/NTMakefile @@ -0,0 +1,35 @@ +######################################################################## +# +# Copyright (c) 2009, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +RELDIR=tools + +!include ../windows/NTMakefile.w32 + diff --git a/crypto/heimdal/tools/cov.sh b/crypto/heimdal/tools/cov.sh new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/cov.sh @@ -0,0 +1,19 @@ + +d="lib/roken lib/krb5 lib/gssapi lib/ntlm tests/kdc tests/gss kuser" + +basedir=$(basedir $0) + +${basedir}/../configure CFLAGS='-fprofile-arcs -ftest-coverage' > log + +lcov --directory . --zerocounters + +make all check > log + +lcov --directory . --capture --output-file heimdal-lcov.info + +objdir="/Volumes/data/Users/lha/obj/hg" +srcdir="/Volumes/data/Users/lha/src/heimdal/git" + +perl -pi -e "s@SF:$objdir/(.*.[ly])\$@SF:$srcdir/\$1@" heimdal-lcov.info + +genhtml heimdal-lcov.info diff --git a/crypto/heimdal/tools/heimdal-gssapi.pc.in b/crypto/heimdal/tools/heimdal-gssapi.pc.in --- a/crypto/heimdal/tools/heimdal-gssapi.pc.in +++ b/crypto/heimdal/tools/heimdal-gssapi.pc.in @@ -1,14 +1,14 @@ # $Id$ prefix=@prefix@ exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include +libdir=@libdir@ +includedir=@includedir@ Name: @PACKAGE@ Description: Heimdal is an implementation of Kerberos 5, freely available under a three clause BSD style license. Version: @VERSION@ URL: http://www.pdc.kth.se/heimdal/ -#Requires: foo = 1.3.1 -#Conflicts: bar <= 4.5 -Libs: -L${libdir} -lgssapi -lheimntlm -lkrb5 @LIB_pkinit@ -lcom_err @LIB_hcrypto_appl@ -lasn1 -lwind -lroken @LIB_crypt@ @LIB_dlopen@ @LIB_door_create@ @LIBS@ +Requires.private: heimdal-krb5 +Libs: -L${libdir} -lgssapi +Libs.private: -lheimntlm @LIB_crypt@ Cflags: -I${includedir} diff --git a/crypto/heimdal/tools/heimdal-kadm-client.pc.in b/crypto/heimdal/tools/heimdal-kadm-client.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/heimdal-kadm-client.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: heimdal-kadm-client +Description: Kadmin client library. +Version: @VERSION@ +Requires.private: heimdal-gssapi +Libs: -L${libdir} -lkadm5clnt +Cflags: -I${includedir} diff --git a/crypto/heimdal/tools/heimdal-kadm-server.pc.in b/crypto/heimdal/tools/heimdal-kadm-server.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/heimdal-kadm-server.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: heimdal-kadm-server +Description: Kadmin server library. +Version: @VERSION@ +Requires.private: heimdal-gssapi +Libs: -L${libdir} -lkadm5srv +Libs.private: @LIB_dbopen@ +Cflags: -I${includedir} diff --git a/crypto/heimdal/tools/heimdal-krb5.pc.in b/crypto/heimdal/tools/heimdal-krb5.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/heimdal-krb5.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +vendor=Heimdal + +Name: heimdal-krb5 +Description: Heimdal implementation of the Kerberos network authentication. +Version: @VERSION@ +Libs: -L${libdir} -lkrb5 +Libs.private: @LIB_pkinit@ -lcom_err @LIB_hcrypto_appl@ -lasn1 -lwind -lheimbase -lroken @LIB_crypt@ @PTHREAD_LIBADD@ @LIB_dlopen@ @LIB_door_create@ @LIBS@ +Cflags: -I${includedir} diff --git a/crypto/heimdal/tools/kadm-client.pc.in b/crypto/heimdal/tools/kadm-client.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/kadm-client.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +vendor=Heimdal + +Name: kadm-client +Description: Kadmin client library. +Version: @VERSION@ +Requires: heimdal-kadm-client diff --git a/crypto/heimdal/tools/kadm-server.pc.in b/crypto/heimdal/tools/kadm-server.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/kadm-server.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +vendor=Heimdal + +Name: kadm-server +Description: Kadmin server library. +Version: @VERSION@ +Requires: heimdal-kadm-server diff --git a/crypto/heimdal/tools/kafs.pc.in b/crypto/heimdal/tools/kafs.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/kafs.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: kafs +Description: Libraries for application that uses kafs. +Version: @VERSION@ +Requires.private: heimdal-krb5 +Libs: -lkafs diff --git a/crypto/heimdal/tools/kdc-log-analyze.pl b/crypto/heimdal/tools/kdc-log-analyze.pl old mode 100755 new mode 100644 diff --git a/crypto/heimdal/tools/krb5-config.1 b/crypto/heimdal/tools/krb5-config.1 --- a/crypto/heimdal/tools/krb5-config.1 +++ b/crypto/heimdal/tools/krb5-config.1 @@ -60,7 +60,9 @@ is specified, otherwise set exec-prefix to .Ar dir . .It Fl Fl libs -Output the set of libraries that should be linked against. +Output the set of libraries that should be linked against. This also +includes rpath flags with the expectation that the C compiler is used +for final link-edits. .It Fl Fl cflags Output the set of flags to give to the C compiler when using the Heimdal libraries. diff --git a/crypto/heimdal/tools/krb5-config.cat1 b/crypto/heimdal/tools/krb5-config.cat1 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/krb5-config.cat1 @@ -0,0 +1,53 @@ +KRB5-CONFIG(1) BSD General Commands Manual KRB5-CONFIG(1) + +NAME + krb5-config -- give information on how to link code against Heimdal li- + braries + +SYNOPSIS + krb5-config [--prefix[=dir]] [--exec-prefix[=dir]] [--libs] [--cflags] + [libraries] + +DESCRIPTION + krb5-config tells the application programmer what special flags to use to + compile and link programs against the libraries installed by Heimdal. + + Options supported: + + --prefix[=dir] + Print the prefix if no dir is specified, otherwise set prefix to + dir. + + --exec-prefix[=dir] + Print the exec-prefix if no dir is specified, otherwise set exec- + prefix to dir. + + --libs Output the set of libraries that should be linked against. This + also includes rpath flags with the expectation that the C com- + piler is used for final link-edits. + + --cflags + Output the set of flags to give to the C compiler when using the + Heimdal libraries. + + By default krb5-config will output the set of flags and libraries to be + used by a normal program using the krb5 API. The user can also supply a + library to be used, the supported ones are: + + krb5 (the default) + + gssapi use the krb5 gssapi mechanism + + kadm-client + use the client-side kadmin libraries + + kadm-server + use the server-side kadmin libraries + +SEE ALSO + cc(1) + +HISTORY + krb5-config appeared in Heimdal 0.3d. + +HEIMDAL November 30, 2000 HEIMDAL diff --git a/crypto/heimdal/tools/krb5-config.in b/crypto/heimdal/tools/krb5-config.in old mode 100755 new mode 100644 index d1f1a3fdc37e07845ad360e6d9b6a5abd07f387f..640853033936030eb10da060a27de2b61788ce48 GIT binary patch literal 7019 zc$~FZVRPC%68>C%g-SC+lY=CEZ#r|6zL~)RC-Ia3hfUK=rE7@2k(B?jrFUZpFv#ZtaYFDpbo=il1BImVQ;Aia5KO6SorcryfnSND!#X8CA zF%`3U#$E@9?2psaQ`Vxtf3WxKcovD7&pf_}gL zx)fQ)L$*qjuOh@Co5LR2oC7C{k_QpbSdhe_ASOvD#JA+xnbz#h@s@IuHk)e|Bq3W1Y-!M4OX>+&>-@~lBcg8p zRKZ@uHPrh(+OT||8YxVI^^(V#UmV;C&LqKl%9eh{Q{hLlG`>1CVm7ytZ}0ENtj~qw zB#PKyD!-y}>1c6MuBwv|a3(0O!ID(wYAyXoHsRz%*hs>79Ab@=zd)B|0wirDaEDM5 zp2((H&<2soG-5H5r+?LCKw_JBOLk+AI@kELE}Wj@ z-6^S;j@Kt~myl<%p*8ZH&bVid*l;`=4qSysJL@`br)N1gcK4V;2?%EP2fObv_uA_9 zwss1v%0@42C}~~v6q=HRjdq=p-SKEg<){P8LBAeS$&Cjm_Fn(OFgTXZcx2y@$}ojHz9^Kv8VtHFK>^;iM<1My?Y?8ZfvapbcI_sF zc$N|m6c`N47+;KCN14v)d-iBF9(vB8e@H;rgIm}J%39#=Dl-rIYR@p!V01^gWDj); zO?G>2V}3+dRaUde7A~yU@d(YJgjCqmGd9cm_Epchvilun^#K9hI<9?)LvvgraJ1xG z>rU-)thP_b1>N+}aNwpoROVbVtNXzr<#S@Vg6rgNgDD`ncQ&FoS3o}6p^5Ezlh(QwgNIM5KhmTfk&ZE^~O()I@R0Zr*O}u-jSYW{o2U)YA z&zHZd+@>jT1t+Y2&BZeGqq?2~9yUdjvo^fch1a%Cc9T1|{gGzR zzrH9KZ1dlYGHyej{A)vba?<$n6rf-?&UkBMbkbYW%){R)(&X8eYpj{VP0TF~$YVFA zSMIw-Kt5~|Xs6yH(%!ux%bmSKM2@Qo3V)`VVnX|Mg+Y6Fl||2OnDPLq%7M?fbQo-j zD;G+sM$9}#(UG$QMK4rQ@-W*%naXYUsWkYeTShuE9d;cr;^ZM_$%-n7Gx&kwuWw2w zF8u&mCFW&N*AI%&tFv=fhm86rzBll+4AfKhNlTEQ*(a^1;PP|bAkEj$F!4#p_h(l8 zd-|gfVgDy4KKn4y%zc^aQk`xwlMD{)|m$gDo~axtDD!EBmAgBj69p zyHj1mMW}zQALPk}Lj9u==9RQ+veXZ>bE@1>CWiciXzTwrv6LK!Pj9iAmrL9DPykeO zgd#m}>;HC5#6h%1n?!TvxV@FSkSX>jt`9oa&yaZiR;L#&x zoCycYLz+OOdh-Aq6^^pW(ADZU6O|rt_A1k;MfRY&*oi*@NPvEo9xo>7R3X`lWRkb{ z4^W)$fX6}}`eH3g=PTMLZU=o;5k>$hJk@-l4HKfEjMRcVqG5imy7&irM+uVUN`SZ( zQV)&BKL!7W6lLj4Mn+C~L!xzOI0V8XwT@M*?8K@H3&bkoTH7$;GHzrL9FdB|duApi zx>MIt2s6oy`|6npI26h)eFC~}L)?&EXFSWF8&V!XA7yNMS(@hW2ySL6KEN{W!D+AOpoR7A%$dvHT?nE?^cJx-16W3mBAP@2p77+u>IE$88Hm+Es_fglZ zA?3+c`(mm)l>D!%sL^peQ(IL#1QFF6zfYsQH2FU?lIho-7Hs#Ni~Ddw-rfFf8c*f3 zRiz^8_hLpe6~=&U~f4U26m83G|j5j)C;P1%*#l+ GZ2t$D|5u#= literal 3731 zc$~FXZExC05dK_##T<#0rh>fmROyr`k_|XvRf0L&B#ojRG4=v0%r56ONuyr>_Imu+kia1g%zS#LW!`9;PoaQRzZA z;8|odP^tMRHGsL`uej zj5MK;-GXOld1R+YJHcs6wumZHG3u^#hWTV6MoYNiSUr(wO)Y}ppH!KMcmp+rh6M2l zrs9|q+>Q#JMoB0ZJS|B2_&OAHSz%=z3g#NGFueaK8YuG2kzy6C7F=fGx^Tx>6NT~= z7GcIy5hl7M-xQ6Et7#PJ{eA>}E{r8<$Z%o$iq2)DNmWWsB?LAT2A+edR2N|_!WS5G zY9dTT0hck#IQ0w0vQUVWlZ4hW28o>r6BOixXf?^6sSR?hb%*ICkEp-UR8Zrk)LAm` zF|Er)f-dvHcQ1om+j9WV1JAu-9j61WI~3wo-w#+Y3>>ig9ca7#z+**fk4KEpQvg zBLcm)1oslI9k1QRN4v#(EVwgXFImthcbDkThJoz`tUc`69t?)w!1WCpW!7PSyJxd& zr*i}t1Ud%i#_0#(ckNzpCsV}QO0?x*kanwQ(2OTcw8K279Z*K)sg2BGd_7zx1EtL^3x8oBO!uyVQ z!`hC24n5a5oDF@afldP3xJMKu48?eE4Si;)WBtJKyx|~VZvT*gy6!Dlh zimFtJuhMErt7N`kPMR6oGUq%9lX01D(QH=!YmrH5QEA5=vudMSl?MYr`vx<;u<~E4 zCS;VX@B@bK%Cof{TseGi7NtnxRbD%z^R|6OX$Pbjsvnu+{U{%%db79xEl=uuPI}bg0AP-oe|#IosLz|kQ6lh0wh){ tMI?@&>A9tERi?Pq-X5vVW`29~G}->Qa!S5~m4BN!YZlNA^=|Pt{0|$@cAEeI diff --git a/crypto/heimdal/tools/krb5-gssapi.pc.in b/crypto/heimdal/tools/krb5-gssapi.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/krb5-gssapi.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +vendor=Heimdal + +Name: krb5-gssapi +Description: Kerberos implementation of the GSS API. +Version: @VERSION@ +Requires: heimdal-gssapi diff --git a/crypto/heimdal/tools/krb5.pc.in b/crypto/heimdal/tools/krb5.pc.in new file mode 100644 --- /dev/null +++ b/crypto/heimdal/tools/krb5.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +vendor=Heimdal + +Name: krb5 +Description: Heimdal implementation of the kerberos network authentication. +Version: @VERSION@ +Requires: heimdal-krb5 diff --git a/crypto/heimdal/windows/NTMakefile.config b/crypto/heimdal/windows/NTMakefile.config new file mode 100644 --- /dev/null +++ b/crypto/heimdal/windows/NTMakefile.config @@ -0,0 +1,117 @@ +!if exist (..\..\..\thirdparty\NTMakefile.version) +! include <..\..\..\thirdparty\NTMakefile.version> +!elseif exist (..\..\thirdparty\NTMakefile.version) +! include <..\..\thirdparty\NTMakefile.version> +!elseif exist (..\thirdparty\NTMakefile.version) +! include <..\thirdparty\NTMakefile.version> +!elseif exist (thirdparty\NTMakefile.version) +! include +!elseif exist (..\..\..\windows\NTMakefile.version) +! include <..\..\..\windows\NTMakefile.version> +!elseif exist (..\..\windows\NTMakefile.version) +! include <..\..\windows\NTMakefile.version> +!elseif exist (..\windows\NTMakefile.version) +! include <..\windows\NTMakefile.version> +!else +! include +!endif + +!if [ $(PERL) $(SRC)\cf\w32-detect-vc-version.pl $(CC) ]==16 +HAVE_STDINT_H=1 +HAVE_INT64_T=1 +!endif + + + + +# ------------------------------------------------------------ +# Features +# +# For each feature enabled here, a corresponding line must exist in +# the inline Perl script in include\NTMakefile. + +# Enable Kerberos v5 support in applications +KRB5=1 + +# Enable KX509 support in the KDC +KX509=1 + +# Enable PKINIT +PKINIT=1 + +# Disable AFS support +NO_AFS=1 + +# OpenSSL (mostly not needed on Windows, but should work) +# INCLUDE_openssl_crypto= +# LIB_openssl_crypto= + +# OpenLDAP package is available +# OPENLDAP=1 + +# OpenLDAP include directory +# OPENLDAP_INC= + +# OpenLDAP library to link against +# OPENLDAP_LIB= + +# Support HDB LDAP module +# OPENLDAP_MODULE=1 + +# OTP support in applications +OTP=1 + +# Authentication support in telnet +AUTHENTICATION=1 + +# Enable diagnostics in telnet +DIAGNOSTICS=1 + +# Enable encryption support in telnet +ENCRYPTION=1 + +# Use the weak AFS string to key functions +# ENABLE_AFS_STRING_TO_KEY=1 + +!ifdef PTHREAD_INC +!ifdef PTHREAD_LIB + +# We have +HAVE_PTHREAD_H=1 + +# Make thread-safe libraries +ENABLE_PTHREAD_SUPPORT=1 + +!endif +!endif + +# Support for broken ENV_{VAR,VAL} telnets +# ENV_HACK=1 + +# Use the Kerberos Credentials Manager +# HAVE_KCM=1 + +# Use the sqlite backend +HAVE_SCC=1 + +DIR_hdbdir=%{COMMON_APPDATA}/heimdal/hdb + +# Disable weak crypto +WEAK_CRYPTO=0 + +# Enable hcrypt fallback mechanisms +HCRYPTO_FALLBACK=1 + +# Disable use of GSS LOCALNAME support +NO_LOCALNAME=1 + +# Windows CRT mkdir does not have the mode parameter +MKDIR_DOES_NOT_HAVE_MODE=1 + +# Windows CRT rename does not unlink the target +RENAME_DOES_NOT_UNLINK=1 + +# Disable build of installers +!ifndef NO_INSTALLERS +BUILD_INSTALLERS=1 +!endif diff --git a/crypto/heimdal/windows/NTMakefile.sdk b/crypto/heimdal/windows/NTMakefile.sdk new file mode 100644 --- /dev/null +++ b/crypto/heimdal/windows/NTMakefile.sdk @@ -0,0 +1,128 @@ +######################################################################## +# +# Copyright (c) 2021, PADL Software Pty Ltd. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN if ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +!if !defined(CPU) || "$(CPU)" == "" +CPU =AMD64 +!endif + +!if "$(CPU)" == "X86" || "$(CPU)" == "x86" +CPU =i386 +!endif + +!if !defined(APPVER) +APPVER =6.1 +!endif + +!if "$(APPVER)" == "5.0" +NMAKE_WINVER=0x0500 +!elseif "$(APPVER)" == "5.01" +NMAKE_WINVER=0x0501 +!elseif "$(APPVER)" == "5.02" +NMAKE_WINVER=0x0502 +!elseif "$(APPVER)" == "6.0" +NMAKE_WINVER=0x0600 +!elseif "$(APPVER)" == "6.1" +NMAKE_WINVER=0x0601 +!elseif "$(APPVER)" == "10.0" +NMAKE_WINVER=0x0A00 +!endif + +cc = cl +link = link +implib = lib + +cflags = -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -GS -W4 + +!if "$(CPU)" == "i386" +cflags = $(cflags) -D_X86_=1 +!endif +!if "$(CPU)" == "AMD64" +cflags = $(cflags) -D_AMD64_=1 +!endif +!if "$(CPU)" == "ARM" +cflags = $(cflags) -D_ARM_=1 +!endif +!if "$(CPU)" == "ARM64" +cflags = $(cflags) -D_ARM64_=1 +!endif + +cflags = $(cflags) -DWIN32 -D_WIN32 +!if "$(CPU)" == "AMD64" || "$(CPU)" == "ARM64" +cflags = $(cflags) -DWIN64 -D_WIN64 +!endif + +cflags = $(cflags) -D_WINNT -D_WIN32_WINNT=$(NMAKE_WINVER) +cflags = $(cflags) -DNTDDI_VERSION=$(NMAKE_WINVER)0000 +cflags = $(cflags) -D_WIN32_IE=$(NMAKE_WINVER) -DWINVER=$(NMAKE_WINVER) + +!ifdef NODEBUG +cdebug = -Ox -DNDEBUG +!else +cdebug = -Zi -Od -DDEBUG +!endif + +cvarsmt = -D_MT +cvarsdll = -D_MT -D_DLL +!ifdef NODEBUG +cvarsmt = $(cvarsmt) -MTd +cvarsdll = $(cvarsdll) -MDd +!else +cvarsmt = $(cvarsmt) -MT +cvarsdll = $(cvarsdll) -MD +!endif +cvars = $(cvarsmt) + +lflags = $(lflags) /INCREMENTAL:NO /NOLOGO +!ifdef NODEBUG +ldebug = /RELEASE +!else +ldebug = /DEBUG /DEBUGTYPE:cv +!endif + +!if "$(CPU)" == "i386" +dllentry = _DllMainCRTStartup@12 +!else +dllentry = _DllMainCRTStartup +!endif + +conlflags = $(lflags) -subsystem:console,$(APPVER) +guilflags = $(lflags) -subsystem:windows,$(APPVER) +dlllflags = $(lflags) -entry:$(dllentry) -dll + +baselibs = kernel32.lib ws2_32.lib mswsock.lib advapi32.lib +conlibs = $(baselibs) +conlibsmt = $(baselibs) +conlibsdll = $(baselibs) + +winlibs = $(baselibs) user32.lib gdi32.lib comdlg32.lib winspool.lib +guilibs = $(winlibs) +guilibsmt = $(winlibs) +guilibsdll = $(winlibs) diff --git a/crypto/heimdal/windows/NTMakefile.version b/crypto/heimdal/windows/NTMakefile.version new file mode 100644 --- /dev/null +++ b/crypto/heimdal/windows/NTMakefile.version @@ -0,0 +1,51 @@ +# Version strings + +VER_PACKAGE=heimdal +VER_PACKAGE_NAME=Heimdal +VER_PACKAGE_BUGREPORT=https://github.com/heimdal/heimdal/issues +VER_PACKAGE_COPYRIGHT=Copyright (C) 1995-2016 Royal Institute of Technology, Stockholm, Sweden +VER_PACKAGE_COMPANY=www.h5l.org + +VER_PRODUCT_MAJOR=7 +VER_PRODUCT_MINOR=8 +VER_PRODUCT_AUX=0 +VER_PRODUCT_PATCH=0 + +# ------------------------------------------------------------ +# The VER_OLD_BEGIN and VER_OLD_END version values are used in +# constructing the assembly publisher configuration. The end +# must be less than the VER_PRODUCT value. If the current +# version is 1.5.100.0 then VER_OLD_END version is +# 1.5.99.65535. + +VER_OLD_BEGIN_MAJOR=7 +VER_OLD_BEGIN_MINOR=2 +VER_OLD_BEGIN_AUX=0 +VER_OLD_BEGIN_PATCH=0 + +VER_OLD_END_MAJOR=7 +VER_OLD_END_MINOR=7 +VER_OLD_END_AUX=65535 +VER_OLD_END_PATCH=65535 + +VER_PACKAGE_VERSION=$(VER_PRODUCT_MAJOR).$(VER_PRODUCT_MINOR).$(VER_PRODUCT_AUX) + +# Debug build flag +!ifndef NODEBUG +VER_DEBUG=1 +!endif + +# Define to 1 if this is a pre-release build. Undefine otherwise +# VER_PRERELEASE=1 + +# Define to a valid string if this build DOES NOT follow normal +# release procedures. I.e. this is a private build whose version +# numbers are not co-ordinated with mainline development. + +#VER_PRIVATE=Private build for MyCompany + +# Define to a valid string if this build DOES follow normal release +# procedures, but is a variation of the standard files of the same +# version numbers. + +#VER_SPECIAL=Special build for testing ticket 12345 diff --git a/crypto/heimdal/windows/NTMakefile.w32 b/crypto/heimdal/windows/NTMakefile.w32 new file mode 100644 --- /dev/null +++ b/crypto/heimdal/windows/NTMakefile.w32 @@ -0,0 +1,615 @@ +######################################################################## +# +# Copyright (c) 2009-2011, Secure Endpoints Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# - Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# - Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +all:: + +clean:: + +test:: + +prep:: + +all:: prep + +!include "NTMakefile.sdk" + +!ifdef NODEBUG +BUILD=rel +!else +BUILD=dbg +!endif + +!if exist($(MAKEDIR)\windows\NTMakefile.w32) +SRC=$(MAKEDIR) +!elseif exist($(MAKEDIR)\..\windows\NTMakefile.w32) +SRC=$(MAKEDIR)\.. +!elseif exist($(MAKEDIR)\..\..\windows\NTMakefile.w32) +SRC=$(MAKEDIR)\..\.. +!elseif exist($(MAKEDIR)\..\..\..\windows\NTMakefile.w32) +SRC=$(MAKEDIR)\..\..\.. +!elseif exist($(MAKEDIR)\..\..\..\..\windows\NTMakefile.w32) +SRC=$(MAKEDIR)\..\..\..\.. +!else +! error Cant determine source directory +!endif + +! if "$(CPU)"=="i386" || "$(CPU)"=="x86" +MCPU=x86 +! elseif "$(CPU)"=="AMD64" +MCPU=amd64 +! else +! error Unknown CPU +! endif + +!include "NTMakefile.config" + +#---------------------------------------------------------------- +# Directory macros + +DESTDIR =$(SRC)\out\dest_$(CPU) +OBJDIR =$(SRC)\out\obj_$(CPU) + +INCDIR =$(DESTDIR)\inc +LIBDIR =$(DESTDIR)\lib +BINDIR =$(DESTDIR)\bin +PLUGINDIR =$(BINDIR) +DOCDIR =$(DESTDIR)\doc +SBINDIR =$(BINDIR) +LIBEXECDIR =$(BINDIR) +ASMDIR =$(BINDIR) +INSTDIR =$(DESTDIR)\install +SDKDIR =$(SRC)\out\sdk +SDKINCDIR =$(SDKDIR)\inc +SDKLIBDIR =$(SDKDIR)\lib\$(CPU) +SDKSRCDIR =$(SDKDIR)\src +SDKREDISTDIR =$(SDKDIR)\redist\$(CPU) + +!ifdef RELDIR +SRCDIR =$(SRC)\$(RELDIR) +OBJ =$(OBJDIR)\$(RELDIR) +!else +OBJ =$(OBJDIR) +!endif + +# For tests: +PATH=$(PATH);$(BINDIR) + +#---------------------------------------------------------------- +# Command macros + +RMAKE=nmake /nologo /f NTMakefile RECURSE=1 +MKDIR=md +CP=copy /Y +LINK=link +LM=lib +RM=del /q +ECHO=echo +RC=rc + +#---------------------------------------------------------------- +# Program macros + +AWK_CMD=gawk.exe +YACC_CMD=bison.exe +LEX_CMD=flex.exe +PYTHON=python.exe +PERL=perl.exe +CMP=cmp.exe +MAKECAT=makecat.exe +HHC=hhc.exe +MAKEINFO=makeinfo.exe +SED=sed.exe + +CANDLE_CMD=candle.exe +LIGHT_CMD=light.exe + +# Only used for tests +SH=sh.exe + +# Commands +AWK=$(AWK_CMD) +YACC=$(YACC_CMD) -y +LEX=$(LEX_CMD) +CANDLE=$(CANDLE_CMD) -nologo +LIGHT=$(LIGHT_CMD) -nologo + +#---------------------------------------------------------------- +# External dependencies + +# For pthread support to be enabled, both PTHREAD_INC and PTHREAD_LIB +# should be defined. PTHREAD_INC should be the include directory +# where pthread.h is to be found (i.e. $(PTHREAD_INC)\pthread.h should +# exist), and PTHREAD_LIB is the full path to the pthread import +# library. +# +# Note that both paths should not contain any whitespace. + +!ifdef PTHREAD_INC +pthreadinc= -I$(PTHREAD_INC) +!endif + +#---------------------------------------------------------------- +# Build options + +cincdirs=$(cincdirs) -I$(INCDIR) -I$(INCDIR)\krb5 $(pthreadinc) +cdefines=$(cdefines) -DHAVE_CONFIG_H +# Windows CNG provider +cdefines=$(cdefines) -DHCRYPTO_DEF_PROVIDER=w32crypto +cdebug=$(cdebug) /Zi +ldebug=$(ldebug) /DEBUG +localcflags=$(localcflags) /Oy- + +# Disable warnings: +# +# C4996: 'function' was declared deprecated +# C4127: Conditional expression is constant +# C4244: Conversion from 'type1' to 'type2', possible loss of data +# C4100: 'identifier': unreferenced formal parameter +# C4706: Assignment within conditional expression +# C4214: Nonstandard extension used +# C4267: '': Conversion from 'type1' to 'type2', possible loss of data +# C4018: '': Signed/unsigned mismatch +# C4204: Nonstandard extension used: non-constant aggregate initializer +# C4221: Nonstandard extension used: 'v1': cannot be initialized using address of automatic variable 'v2' +# C4295: '': Array is too small to include a terminating null character +# C4146: Unary minus operator applied to unsigned type, result still unsigned. +# +cwarn=$(cwarn) -D_CRT_SECURE_NO_WARNINGS -wd4996 -wd4127 -wd4244 -wd4100 -wd4706 +cwarn=$(cwarn) -wd4214 -wd4267 -wd4018 -wd4389 -wd4204 -wd4221 -wd4295 -wd4146 + +!if "$(CPU)"=="i386" +libmach=/machine:X86 +!elseif "$(CPU)"=="AMD64" +libmach=/machine:X64 +!else +! error Unknown CPU value +!endif + +!ifdef NO_MP +MPOPT= +!else +MPOPT=/MP +!endif + +!ifndef STATICRUNTIME + +C2OBJ_C = $(CC) $(cdebug) $(cflags) $(cvarsdll) $(AUXCFLAGS) $(intcflags) $(cdefines) $(cincdirs) $(cwarn) +EXECONLINK_C = $(LINK) $(ldebug) $(conlflags) $(conlibsdll) $(libmach) +EXEGUILINK_C = $(LINK) $(ldebug) $(guilflags) $(guilibsdll) $(libmach) +DLLCONLINK_C = $(LINK) $(ldebug) $(dlllflags) $(conlibsdll) $(libmach) +DLLGUILINK_C = $(LINK) $(ldebug) $(dlllflags) $(guilibsdll) $(libmach) + +!else # STATICRUNTIME + +C2OBJ_C = $(CC) $(cdebug) $(cflags) $(cvarsmt) $(AUXCFLAGS) $(intcflags) $(cdefines) $(cincdirs) $(cwarn) +EXECONLINK_C = $(LINK) $(ldebug) $(conlflags) $(conlibsmt) $(libmach) +EXEGUILINK_C = $(LINK) $(ldebug) $(guilflags) $(guilibsmt) $(libmach) +DLLCONLINK_C = $(LINK) $(ldebug) $(dlllflags) $(conlibsmt) $(libmach) +DLLGUILINK_C = $(LINK) $(ldebug) $(dlllflags) $(guilibsmt) $(libmach) + +!endif + +LIBGUI_C = $(LM) /nologo $(libmach) /SUBSYSTEM:WINDOWS +LIBCON_C = $(LM) /nologo $(libmach) /SUBSYSTEM:CONSOLE + +C2OBJ = $(C2OBJ_C) -Fo$@ -Fd$(@D)\ $** +C2OBJ_NP = $(C2OBJ_C) $(MPOPT) $< +C2OBJ_P = $(C2OBJ_NP) -Fo$(OBJ)\ -Fd$(OBJ)\ # +EXECONLINK = $(EXECONLINK_C) -OUT:$@ $** +EXEGUILINK = $(EXEGUILINK_C) -OUT:$@ $** +DLLCONLINK = $(DLLCONLINK_C) -OUT:$@ $** +DLLGUILINK = $(DLLGUILINK_C) -OUT:$@ $** +LIBGUI = $(LIBGUI_C) /OUT:$@ $** +LIBCON = $(LIBCON_C) /OUT:$@ $** + +# Preprocess files to stdout using config.h +CPREPROCESSOUT = $(CC) /EP /FI$(INCDIR)\config.h /TC /DCPP_ONLY=1 + +# Resources + +RC2RES_C = $(RC) $(cincdirs) $(AUXRCFLAGS) +RC2RES = $(RC2RES_C) -fo $@ $** + +#---------------------------------------------------------------------- +# If this is the initial invocation, we check if all the build +# utilities are there. Also show the commands macros. + +!ifndef RECURSE + +REQUIRED_TOOLS= \ + "$(AWK_CMD)" "$(YACC_CMD)" "$(LEX_CMD)" "$(PYTHON)" "$(PERL)" \ + "$(CMP)" "$(SED)" "$(MAKECAT)" "$(MAKEINFO)" "$(HHC)" + +!ifdef BUILD_INSTALLERS +REQUIRED_TOOLS=$(REQUIRED_TOOLS) "$(CANDLE_CMD)" "$(LIGHT_CMD)" +!endif + +OPTIONAL_TOOLS="$(SH)" + +check-utils: + @for %%g in ( $(REQUIRED_TOOLS) ) do @( \ + for /f %%f in ( "%%g" ) do @( \ + if exist %%f @( \ + echo Found %%f \ + ) else if "%%~$$PATH:f"=="" @( \ + echo Could not find %%f in PATH && \ + exit /b 1 \ + ) else @( \ + echo Found %%~$$PATH:f \ + ) \ + ) \ + ) + @for %%g in ( $(OPTIONAL_TOOLS) ) do @( \ + for /f %%f in ( "%%g" ) do @( \ + if exist %%f @( \ + echo Found %%f \ + ) else if "%%~$$PATH:f"=="" @( \ + echo Could not find %%f in PATH && \ + echo Optional targets may fail. \ + ) else @( \ + echo Found %%~$$PATH:f \ + ) \ + ) \ + ) + + +prep:: check-utils + +show-cmds: + @$(ECHO) C2OBJ=$(C2OBJ_C:\=\\) + @$(ECHO). + @$(ECHO) EXECONLINK=$(EXECONLINK_C) + @$(ECHO). + @$(ECHO) EXEGUILINK=$(EXEGUILINK_C) + @$(ECHO). + @$(ECHO) DLLCONLINK=$(DLLCONLINK_C) + @$(ECHO). + @$(ECHO) DLLGUILINK=$(DLLGUILINK_C) + @$(ECHO). + @$(ECHO) LIBGUI=$(LIBGUI_C) + @$(ECHO). + @$(ECHO) LIBCON=$(LIBCON_C) + +prep:: show-cmds + +!endif # RECURSE + +{}.c{$(OBJ)}.obj:: + $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(localcflags) $(MPOPT) @<< +$< +<< + +{$(OBJ)}.c{$(OBJ)}.obj:: + $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(extcflags) $(MPOPT) @<< +$< +<< + +{}.cpp{$(OBJ)}.obj:: + $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(localcflags) $(MPOPT) @<< +$< +<< + +{$(OBJ)}.cpp{$(OBJ)}.obj:: + $(C2OBJ_C) /Fd$(OBJ)\ /Fo$(OBJ)\ $(extcflags) $(MPOPT) @<< +$< +<< + +{}.hin{$(INCDIR)}.h: + $(CP) $< $@ + +{}.h{$(INCDIR)}.h: + $(CP) $< $@ + +{}.h{$(INCDIR)\krb5}.h: + $(CP) $< $@ + +{$(OBJ)}.h{$(INCDIR)}.h: + $(CP) $< $@ + +{$(OBJ)}.x{$(OBJ)}.c: + $(CP) $< $@ + +{$(OBJ)}.hx{$(INCDIR)}.h: + $(CP) $< $@ + +{$(OBJ)}.hx{$(OBJ)}.h: + $(CP) $< $@ + +{}.rc{$(OBJ)}.res: + $(RC2RES) + +#---------------------------------------------------------------------- +# Announce the build directory + +!ifdef RELDIR +all:: announce + +all-tools:: announce-tools + +test:: announce + +clean:: announce + +announce: + @echo. + @echo --------- Entering $(RELDIR:\= ): + +announce-tools: + @echo. + @echo --------- Entering $(RELDIR:\= ) tools: +!endif + +#---------------------------------------------------------------------- +# Create any required directories if they don't already exist + +prep:: mkdirs + +mkdirs: +! if !exist("$(OBJ)") + -$(MKDIR) "$(OBJ)" +! endif +! if !exist("$(DESTDIR)") + -$(MKDIR) "$(DESTDIR)" +! endif +! if !exist("$(LIBDIR)") + -$(MKDIR) "$(LIBDIR)" +! endif +! if !exist("$(BINDIR)") + -$(MKDIR) "$(BINDIR)" +! endif +! if !exist("$(PLUGINDIR)") + -$(MKDIR) "$(PLUGINDIR)" +! endif +! if !exist("$(INCDIR)") + -$(MKDIR) "$(INCDIR)" +! endif +! if !exist("$(DOCDIR)") + -$(MKDIR) "$(DOCDIR)" +! endif +! if !exist("$(INCDIR)\gssapi") + -$(MKDIR) "$(INCDIR)\gssapi" +! endif +! if !exist("$(INCDIR)\hcrypto") + -$(MKDIR) "$(INCDIR)\hcrypto" +! endif +! if !exist("$(INCDIR)\kadm5") + -$(MKDIR) "$(INCDIR)\kadm5" +! endif +! if !exist("$(INCDIR)\krb5") + -$(MKDIR) "$(INCDIR)\krb5" +! endif + +#---------------------------------------------------------------------- +# If SUBDIRS is defined, we should recurse into the subdirectories + +!ifdef SUBDIRS +subdirs: + @for %%f in ( $(SUBDIRS) ) do @ (pushd %%f && $(RMAKE) && popd) || exit /b 1 + +clean-subdirs: + @for %%f in ( $(SUBDIRS) ) do @ (pushd %%f && $(RMAKE) clean && popd) || exit /b 1 + +test-subdirs: + @for %%f in ( $(SUBDIRS) ) do @ (pushd %%f && $(RMAKE) test && popd) || exit /b 1 + +all:: subdirs + +clean:: clean-subdirs + +test:: test-subdirs + +!endif + +#---------------------------------------------------------------------- +# Clean targets + +!ifdef CLEANFILES +clean:: + -$(RM) $(CLEANFILES) +!endif +!ifdef RELDIR +clean:: + -$(RM) $(OBJ)\*.* +!endif + +.SUFFIXES: .c .cpp .hin .h .x .hx + +#---------------------------------------------------------------------- +# Manifest handling +# +# Starting with Visual Studio 8, the C compiler and the linker +# generate manifests so that the applications will link with the +# correct side-by-side DLLs at run-time. These are required for +# correct operation under Windows XP and later. We also have custom +# manifests which need to be merged with the manifests that VS +# creates. +# +# The syntax for invoking the _VC_MANIFEST_EMBED_FOO macro is: +# $(_VC_MANIFEST_EMBED_???) +# + +MT=mt.exe -nologo + +_VC_MANIFEST_EMBED_EXE= \ +( if exist $@.manifest $(MT) -outputresource:$@;1 -manifest $@.manifest $(APPMANIFEST) ) + +_VC_MANIFEST_EMBED_EXE_NOHEIM= \ +( if exist $@.manifest $(MT) -outputresource:$@;1 -manifest $@.manifest ) + +_VC_MANIFEST_EMBED_DLL= \ +( if exist $@.manifest $(MT) -outputresource:$@;2 -manifest $@.manifest ) + +_MERGE_MANIFEST_DLL= \ +( $(MT) -inputresource:$@;2 -manifest $(APPMANIFEST) -outputresource:$@;2 ) + +_INSERT_APPMANIFEST_DLL= \ +( $(MT) -manifest $(APPMANIFEST) -outputresource:$@;2 ) + +# Note that if you are merging manifests, then the VS generated +# manifest should be cleaned up after calling _VC_MANIFEST_EMBED_???. +# This ensures that even if the DLL or EXE is executed in-place, the +# embedded manifest will be used. Otherwise the $@.manifest file will +# be used. + +_VC_MANIFEST_CLEAN= \ +( if exist $@.manifest $(RM) $@.manifest ) + +# End of manifest handling + +#---------------------------------------------------------------------- +# Code and assembly signing +# +# +# SIGNTOOL is fullpath to signtool.exe from Windows v8.1 or later SDK +# (earlier versions do not support SHA-2 signatures) +# +# SIGNTOOL_C is any set of options required for certificate/private +# key selection for code signging. +# +# SIGNTOOL_O is any set of additional options to signtool.exe +# +# SIGNTOOL_T is the timestamp option + +!ifdef CODESIGN +_CODESIGN=( $(CODESIGN) $@ ) +_CODESIGN_SHA256=( $(CODESIGN_SHA256) $@ ) +!else + +!ifndef SIGNTOOL +SIGNTOOL=signtool.exe +!endif + +!ifdef SIGNTOOL_C + +!ifndef SIGNTOOL_T +SIGNTOOL_T=http://timestamp.verisign.com/scripts/timstamp.dll +!endif +!ifndef SIGNTOOL_T_SHA256 +SIGNTOOL_T_SHA256=http://sha256timestamp.ws.symantec.com/sha256/timestamp +!endif + +_CODESIGN=( $(SIGNTOOL) sign /fd sha1 $(SIGNTOOL_O) /t $(SIGNTOOL_T) $(SIGNTOOL_C) /v $@ ) +_CODESIGN_SHA256=( $(SIGNTOOL) sign /as /fd sha256 /td sha256 $(SIGNTOOL_O) /tr $(SIGNTOOL_T_SHA256) $(SIGNTOOL_C) /v $@ ) +!else +_CODESIGN=( echo Skipping code sign ) +_CODESIGN_SHA256=( echo Skipping sha256 code sign ) +!endif + +!endif + +#---------------------------------------------------------------------- +# Symbol Store Support +# +# SYMSTORE_EXE is full path to symstore.exe +# +# SYMSTORE_ROOT is full path to root directory of symbol store +# +# SYMSTORE_COMMENT is optional comment to include in symbol store catalog entry +# + +!IF DEFINED(SYMSTORE_EXE) && DEFINED(SYMSTORE_ROOT) +!IF "$(SYMSTORE_COMMENT)" != "" +SYMSTORE_COMMENT = |$(SYMSTORE_COMMENT) +!ENDIF +SYMSTORE_IMPORT= \ +$(SYMSTORE_EXE) add /s $(SYMSTORE_ROOT) /t "Heimdal" /v "$(BUILD)-$(CPU)-$(VER_PACKAGE_VERSION)" /c "$(@F)$(SYMSTORE_COMMENT)" /f $*.* +!ELSE +SYMSTORE_IMPORT=@echo No symbol store +!ENDIF + +#---------------------------------------------------------------------- +# Convenience macros for preparing EXEs and DLLs. These are multiline +# macros that deal with manifests and code signing. Unless we need to +# include custom manifests, these are what we should be using to +# prepare binaries. + +EXEPREP=\ +( $(_VC_MANIFEST_EMBED_EXE) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 ) + +EXEPREP_NOHEIM=\ +( $(_VC_MANIFEST_EMBED_EXE_NOHEIM) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 ) + +EXEPREP_NODIST=\ +( $(_VC_MANIFEST_EMBED_EXE_NOHEIM) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) ) || ( $(RM) $@ && exit /b 1 ) + +DLLPREP=\ +( $(_VC_MANIFEST_EMBED_DLL) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 ) + +DLLPREP_NODIST=\ +( $(_VC_MANIFEST_EMBED_DLL) && $(_VC_MANIFEST_CLEAN) && $(SYMSTORE_IMPORT) ) || ( $(RM) $@ && exit /b 1 ) + +DLLPREP_MERGE=\ +( ( $(_MERGE_MANIFEST_DLL) || $(_INSERT_APPMANIFEST_DLL) && $(SYMSTORE_IMPORT) ) && $(_CODESIGN) && $(_CODESIGN_SHA256) ) || ( $(RM) $@ && exit /b 1 ) + +#---------------------------------------------------------------------- +# Convenience macros for import libraries and assemblies +# + +LIBASN1 =$(LIBDIR)\libasn1.lib +LIBCOMERR =$(LIBDIR)\libcom_err.lib +LIBEDITLINE =$(LIBDIR)\libeditline.lib +LIBGSSAPI =$(LIBDIR)\libgssapi.lib +LIBHCRYPTO =$(LIBDIR)\libhcrypto.lib +LIBHDB =$(LIBDIR)\libhdb.lib +LIBHEIMBASE =$(LIBDIR)\libheimbase.lib +LIBHEIMDAL =$(LIBDIR)\heimdal.lib +LIBHEIMIPCC =$(LIBDIR)\libheim-ipcc.lib +LIBHEIMIPCS =$(LIBDIR)\libheim-ipcs.lib +LIBHEIMNTLM =$(LIBDIR)\libheimntlm.lib +LIBHX509 =$(LIBDIR)\libhx509.lib +LIBKADM5CLNT=$(LIBDIR)\libkadm5clnt.lib +LIBKADM5SRV =$(LIBDIR)\libkadm5srv.lib +LIBKDC =$(LIBDIR)\libkdc.lib +LIBLTM =$(LIBDIR)\libltm.lib +LIBKRB5 =$(LIBDIR)\libkrb5.lib +LIBRFC3961 =$(LIBDIR)\librfc3961.lib +LIBROKEN =$(LIBDIR)\libroken.lib +LIBSL =$(LIBDIR)\libsl.lib +LIBSQLITE =$(LIBDIR)\libsqlite.lib +LIBVERS =$(LIBDIR)\libvers.lib +LIBWIND =$(LIBDIR)\libwind.lib + +!ifdef VER_DEBUG +ASM_DBG=.Debug +!endif +!ifdef VER_PRERELEASE +ASM_PRE=.Pre +!endif +!ifdef VER_PRIVATE +ASM_PVT=.Private +!endif +!ifdef VER_SPECIAL +ASM_SPC=.Special +!endif + +ASMKRBNAME =Heimdal.Kerberos$(ASM_SPC)$(ASM_PVT)$(ASM_PRE)$(ASM_DBG) +APPMANIFEST =$(INCDIR)\Heimdal.Application.$(MCPU).manifest + diff --git a/crypto/heimdal/windows/README.md b/crypto/heimdal/windows/README.md new file mode 100644 --- /dev/null +++ b/crypto/heimdal/windows/README.md @@ -0,0 +1,165 @@ +Building Heimdal for Windows +=================== + +1. Introduction +--------------- + +Heimdal can be built and run on Windows XP or later. Older OSs may +work, but have not been tested. + +2. Prerequisites +---------------- + +* __Microsoft Visual C++ Compiler__: Heimdal has been tested with + Microsoft Visual C/C++ compiler version 15.x. This corresponds to + Microsoft Visual Studio version 2008. The compiler and tools that + are included with Microsoft Windows SDK versions 6.1 and later can + also be used for building Heimdal. If you have a recent Windows + SDK, then you already have a compatible compiler. + +* __Microsoft Windows SDK__: Heimdal has been tested with Microsoft + Windows SDK version 6.1 and 7.0. + +* __Microsoft HTML Help Compiler__: Needed for building documentation. + +* __Perl__: A recent version of Perl. Tested with ActiveState + ActivePerl. + +* __Python__: Tested with Python 2.5 and 2.6. + +* __WiX__: The Windows [Installer XML toolkit (WiX)][1] Version 3.x is + used to build the installers. + +* __Cygwin__: The Heimdal build system requires a number of additional + tools: `awk`, `yacc`, `lex`, `cmp`, `sed`, `makeinfo`, `sh` + (Required for running tests). These can be found in the Cygwin + distribution. MinGW or GnuWin32 may also be used instead of Cygwin. + However, a recent build of `makeinfo` is required for building the + documentation. Cygwin makeinfo 4.7 is known to work. + +* __Certificate for code-signing__: The Heimdal build produces a + number of Assemblies that should be signed if they are to be + installed via Windows Installer. In addition, all executable + binaries produced by the build including installers can be signed + and timestamped if a code-signing certificate is available. + As of 1 January 2016 Windows 7 and above require the use of sha256 + signatures. The signtool.exe provided with Windows SDK 8.1 or + later must be used. + +[1]: http://wix.sourceforge.net/ + +3. Setting up the build environment +----------------------------------- + +* Start with a Windows SDK or Visual Studio build environment. The + target platform, OS and build type (debug / release) is determined + by the build environment. + + E.g.: If you are using the Windows SDK, you can use the `SetEnv.Cmd` + script to set up a build environment targetting 64-bit Windows XP or + later with: + + SetEnv.Cmd /xp /x64 /Debug + + The build will produce debug binaries. If you specify + + SetEnv.Cmd /xp /x64 /Release + + the build will produce release binaries. + +* Add any directories to `PATH` as necessary for tools required by + the build to be found. The build scripts will check for build + tools at the start of the build and will indicate which ones are + missing. In general, adding Perl, Python, WiX, HTML Help Compiler and + Cygwin binary directories to the path should be sufficient. + +* Set up environment variables for code signing. This can be done in + one of two ways. By specifying options for `signtool` or by + specifying the code-signing command directly. To use `signtool`, + define `SIGNTOOL_C` and optionally, `SIGNTOOL_O` and `SIGNTOOL_T`. + + - `SIGNTOOL_C`: Certificate selection and private key selection + options for `signtool`. + + E.g.: + + set SIGNTOOL_C=/f c:\mycerts\codesign.pfx + + set SIGNTOOL_C=/n "Certificate Subject Name" /a + + - `SIGNTOOL_O`: Signing parameter options for `signtool`. Optional. + + E.g.: + + set SIGNTOOL_O=/du http://example.com/myheimdal + + - `SIGNTOOL_T`: SHA1 Timestamp URL for `signtool`. If not specified, + defaults to `http://timestamp.verisign.com/scripts/timstamp.dll`. + + - `SIGNTOOL_T_SHA256`: SHA256 Timestamp URL for `signtool`. If not + specified, defaults to `http://timestamp.geotrust.com/tsa`. + + - `CODESIGN`: SHA1 Code signer command. This environment variable, if + defined, overrides the `SIGNTOOL_*` variables. It should be + defined to be a command that takes one parameter: the binary to be + signed. + + - `CODESIGN_SHA256`: SHA256 Code signer command. This environment variable, if + defined, applies a second SHA256 signature to the parameter. It should be + defined to be a command that takes one parameter: the binary to be + signed. + + E.g.: + + set CODESIGN=c:\scripts\mycodesigner.cmd + set CODESIGN_SHA256=c:\scripts\mycodesigner256.cmd + +* Define the code sign public key token. This is contained in the + environment variable `CODESIGN_PKT` and is needed to build the + Heimdal assemblies. If you are not using a code-sign certificate, + set this to `0000000000000000`. + + You can use the `pktextract` tool to determine the public key token + corresponding to your code signing certificate as follows (assuming + your code signing certificate is in `c:\mycerts\codesign.cer`: + + pktextract c:\mycerts\codesign.cer + + The above command will output the certificate name, key size and the + public key token. Set the `CODESIGN_PKT` variable to the + `publicKeyToken` value (excluding quotes). + + E.g.: + + set CODESIGN_PKT=abcdef0123456789 + +4. Running the build +-------------------- + +Change the current directory to the root of the Heimdal source tree +and run: + + nmake /f NTMakefile + +This should build the binaries, assemblies and the installers. + +The build can also be invoked from any subdirectory that contains an +`NTMakefile` using the same command. Keep in mind that there are +inter-dependencies between directories and therefore it is recommended +that a full build be invoked from the root of the source tree. + +Tests can be invoked, after a full build, by executing: + + nmake /f NTMakefile test + +The build tree can be cleaned with: + + nmake /f NTMakefile clean + +It is recommended that both AMD64 and X86 builds take place on the +same machine. This permits a multi-platform installer package to +be built. First build for X86 and then build AMD64 + + nmake /f NTMakefile MULTIPLATFORM_INSTALLER=1 + +The build must be executed under cmd.exe. diff --git a/crypto/heimdal/windows/version.rc b/crypto/heimdal/windows/version.rc new file mode 100644 --- /dev/null +++ b/crypto/heimdal/windows/version.rc @@ -0,0 +1,149 @@ +/*********************************************************************** + * Copyright (c) 2010, Secure Endpoints Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + **********************************************************************/ + +/* + * This version script is not meant to be used as-is. It requires the + * following parameters that must be supplied using preprocessor + * macros: + * + * RC_FILE_TYPE (Set to either VFT_DLL or VFT_APP) + * RC_FILE_DESC_0409 (File description (English)) + * RC_FILE_ORIG_0409 (Original file name (English)) + * + * The following macros are optional: + * + * RC_FILE_SUBTYPE (File subtype. See MSDN.) + * RC_FILEVER_C (Comma separated file version, if different from + * product version) + * RC_FILE_COMMENT_0409 (File comment (English)) + */ + +#include +#include + +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +#ifdef VER_PRIVATE +#define P_PRIVATE VS_FF_PRIVATEBUILD +#else +#define P_PRIVATE 0 +#endif + +#ifdef VER_SPECIAL +#define P_SPECIAL VS_FF_SPECIALBUILD +#else +#define P_SPECIAL 0 +#endif + +#ifdef VER_PRERELEASE +#define P_PRE VS_FF_PRERELEASE +#else +#define P_PRE 0 +#endif + +#ifdef VER_DEBUG +#define P_DEBUG VS_FF_DEBUG +#else +#define P_DEBUG 0 +#endif + +/* If some per-file values aren't specified, we use the application +values as a substitute */ + +#ifndef RC_FILEVER_C +#define RC_FILEVER_C RC_PRODVER_C +#define RC_FILE_VER_0409 RC_PRODUCT_VER_0409 +#endif + +#ifndef RC_FILE_INTERNAL_0409 +#define RC_FILE_INTERNAL_0409 RC_FILE_ORIG_0409 +#endif + +#ifndef RC_FILE_PRODUCT_NAME_0409 +#define RC_FILE_PRODUCT_NAME_0409 RC_PRODUCT_NAME_0409 +#endif + +#ifndef RC_FILE_PRODUCT_VER_0409 +#define RC_FILE_PRODUCT_VER_0409 RC_PRODUCT_VER_0409 +#endif + +#ifndef RC_FILE_COMPANY_0409 +#define RC_FILE_COMPANY_0409 RC_COMPANY_0409 +#endif + +#ifndef RC_FILE_COPYRIGHT_0409 +#define RC_FILE_COPYRIGHT_0409 RC_COPYRIGHT_0409 +#endif + +1 VERSIONINFO + FILEVERSION RC_FILEVER_C + PRODUCTVERSION RC_PRODVER_C + FILEFLAGSMASK (VS_FF_DEBUG|VS_FF_PRERELEASE|VS_FF_PRIVATEBUILD|VS_FF_SPECIALBUILD) + FILEFLAGS (P_DEBUG|P_PRE|P_PRIVATE|P_SPECIAL) + FILEOS VOS_NT + FILETYPE RC_FILE_TYPE +#ifdef RC_FILE_SUBTYPE + FILESUBTYPE RC_FILE_SUBTYPE +#endif + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "ProductName", RC_FILE_PRODUCT_NAME_0409 + VALUE "ProductVersion", RC_FILE_PRODUCT_VER_0409 + VALUE "CompanyName", RC_FILE_COMPANY_0409 + VALUE "LegalCopyright", RC_FILE_COPYRIGHT_0409 +#ifdef RC_FILE_TRADEMARK_0409 + VALUE "LegalTrademark", RC_FILE_TRADEMARK_0409 +#endif +#ifdef RC_FILE_COMMENT_0409 + VALUE "Comments", RC_FILE_COMMENT_0409 +#endif + VALUE "FileDescription", RC_FILE_DESC_0409 + VALUE "FileVersion", RC_FILE_VER_0409 + VALUE "InternalName", RC_FILE_INTERNAL_0409 + VALUE "OriginalFilename", RC_FILE_ORIG_0409 +#ifdef VER_PRIVATE + VALUE "PrivateBuild", VER_PRIVATE +#endif +#ifdef VER_SPECIAL + VALUE "SpecialBuild", VER_SPECIAL +#endif + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409 /* US English */, 1252 /* Multilingual */ + END + END diff --git a/crypto/heimdal/ylwrap b/crypto/heimdal/ylwrap new file mode 100755 --- /dev/null +++ b/crypto/heimdal/ylwrap @@ -0,0 +1,247 @@ +#! /bin/sh +# ylwrap - wrapper for lex/yacc invocations. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2021 Free Software Foundation, Inc. +# +# Written by Tom Tromey . +# +# 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 +# . + +get_dirname () +{ + case $1 in + */*|*\\*) printf '%s\n' "$1" | sed -e 's|\([\\/]\)[^\\/]*$|\1|';; + # Otherwise, we want the empty string (not "."). + esac +} + +# guard FILE +# ---------- +# The CPP macro used to guard inclusion of FILE. +guard () +{ + printf '%s\n' "$1" \ + | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g' \ + -e 's/__*/_/g' +} + +# quote_for_sed [STRING] +# ---------------------- +# Return STRING (or stdin) quoted to be used as a sed pattern. +quote_for_sed () +{ + case $# in + 0) cat;; + 1) printf '%s\n' "$1";; + esac \ + | sed -e 's|[][\\.*]|\\&|g' +} + +case "$1" in + '') + echo "$0: No files given. Try '$0 --help' for more information." 1>&2 + exit 1 + ;; + --basedir) + basedir=$2 + shift 2 + ;; + -h|--h*) + cat <<\EOF +Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... + +Wrapper for lex/yacc invocations, renaming files as desired. + + INPUT is the input file + OUTPUT is one file PROG generates + DESIRED is the file we actually want instead of OUTPUT + PROGRAM is program to run + ARGS are passed to PROG + +Any number of OUTPUT,DESIRED pairs may be used. + +Report bugs to . +EOF + exit $? + ;; + -v|--v*) + echo "ylwrap $scriptversion" + exit $? + ;; +esac + + +# The input. +input=$1 +shift +# We'll later need for a correct munging of "#line" directives. +input_sub_rx=`get_dirname "$input" | quote_for_sed` +case $input in + [\\/]* | ?:[\\/]*) + # Absolute path; do nothing. + ;; + *) + # Relative path. Make it absolute. + input=`pwd`/$input + ;; +esac +input_rx=`get_dirname "$input" | quote_for_sed` + +# Since DOS filename conventions don't allow two dots, +# the DOS version of Bison writes out y_tab.c instead of y.tab.c +# and y_tab.h instead of y.tab.h. Test to see if this is the case. +y_tab_nodot=false +if test -f y_tab.c || test -f y_tab.h; then + y_tab_nodot=true +fi + +# The parser itself, the first file, is the destination of the .y.c +# rule in the Makefile. +parser=$1 + +# A sed program to s/FROM/TO/g for all the FROM/TO so that, for +# instance, we rename #include "y.tab.h" into #include "parse.h" +# during the conversion from y.tab.c to parse.c. +sed_fix_filenames= + +# Also rename header guards, as Bison 2.7 for instance uses its header +# guard in its implementation file. +sed_fix_header_guards= + +while test $# -ne 0; do + if test x"$1" = x"--"; then + shift + break + fi + from=$1 + # Handle y_tab.c and y_tab.h output by DOS + if $y_tab_nodot; then + case $from in + "y.tab.c") from=y_tab.c;; + "y.tab.h") from=y_tab.h;; + esac + fi + shift + to=$1 + shift + sed_fix_filenames="${sed_fix_filenames}s|"`quote_for_sed "$from"`"|$to|g;" + sed_fix_header_guards="${sed_fix_header_guards}s|"`guard "$from"`"|"`guard "$to"`"|g;" +done + +# The program to run. +prog=$1 +shift +# Make any relative path in $prog absolute. +case $prog in + [\\/]* | ?:[\\/]*) ;; + *[\\/]*) prog=`pwd`/$prog ;; +esac + +dirname=ylwrap$$ +do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (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 +mkdir $dirname || exit 1 + +cd $dirname + +case $# in + 0) "$prog" "$input" ;; + *) "$prog" "$@" "$input" ;; +esac +ret=$? + +if test $ret -eq 0; then + for from in * + do + to=`printf '%s\n' "$from" | sed "$sed_fix_filenames"` + if test -f "$from"; then + # If $2 is an absolute path name, then just use that, + # otherwise prepend '../'. + case $to in + [\\/]* | ?:[\\/]*) target=$to;; + *) target=../$to;; + esac + + # Do not overwrite unchanged header files to avoid useless + # recompilations. Always update the parser itself: it is the + # destination of the .y.c rule in the Makefile. Divert the + # output of all other files to a temporary file so we can + # compare them to existing versions. + if test $from != $parser; then + realtarget=$target + target=tmp-`printf '%s\n' "$target" | sed 's|.*[\\/]||g'` + fi + + # Munge "#line" or "#" directives. Don't let the resulting + # debug information point at an absolute srcdir. Use the real + # output file name, not yy.lex.c for instance. Adjust the + # include guards too. + sed -e "/^#/!b" \ + -e "s|$input_rx|$input_sub_rx|" \ + -e "$sed_fix_filenames" \ + -e "$sed_fix_header_guards" \ + "$from" >"$target" || ret=$? + + # Check whether files must be updated. + if test "$from" != "$parser"; then + if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then + echo "$to is unchanged" + rm -f "$target" + else + echo "updating $to" + mv -f "$target" "$realtarget" + fi + fi + else + # A missing file is only an error for the parser. This is a + # blatant hack to let us support using "yacc -d". If -d is not + # specified, don't fail when the header file is "missing". + if test "$from" = "$parser"; then + ret=1 + fi + fi + done +fi + +# Remove the directory. +cd .. +rm -rf $dirname + +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: